@rulemetric/cli 0.7.12 → 0.7.14

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.
Files changed (48) hide show
  1. package/dist/chunk-3UBCK2FS.js +8 -0
  2. package/dist/chunk-5BMBVTAE.js +61 -0
  3. package/dist/{chunk-A372U5BM.js → chunk-5BSUCOQA.js} +1 -1
  4. package/dist/chunk-5XP7WWJR.js +20 -0
  5. package/dist/chunk-647M2I2Y.js +1 -0
  6. package/dist/{chunk-2HWXJBL3.js → chunk-7SZX7C7U.js} +1 -1
  7. package/dist/chunk-AIGR5AYV.js +1 -0
  8. package/dist/{chunk-L3VLVAP6.js → chunk-ATSA6BQM.js} +1 -1
  9. package/dist/{chunk-WHCRHMYJ.js → chunk-E4BQ5QM3.js} +1 -1
  10. package/dist/chunk-FJJ54GK3.js +24 -0
  11. package/dist/{chunk-MUURX7WZ.js → chunk-HDU5QPEO.js} +1 -1
  12. package/dist/{chunk-2DRBNTIQ.js → chunk-HITXGIHI.js} +1 -1
  13. package/dist/{chunk-2PZGG3OF.js → chunk-IMVTXCD2.js} +1 -1
  14. package/dist/{chunk-DPFNJZUO.js → chunk-O3C5IV2Y.js} +1 -1
  15. package/dist/{chunk-7PSSAJYL.js → chunk-OK3PGZND.js} +1 -1
  16. package/dist/chunk-QH6X6VOT.js +1 -0
  17. package/dist/chunk-S6B2R2LL.js +1 -0
  18. package/dist/{chunk-6RANV2QJ.js → chunk-SS5WVIQP.js} +1 -1
  19. package/dist/commands/evals/agent.js +1 -1
  20. package/dist/commands/evals/compare.js +7 -7
  21. package/dist/commands/evals/optimize-description.js +11 -11
  22. package/dist/commands/evals/optimize.js +1 -1
  23. package/dist/commands/evals/run.js +1 -1
  24. package/dist/lib/agent-loop.js +1 -1
  25. package/dist/lib/eval-case-generator.js +1 -0
  26. package/dist/lib/eval-compare.js +1 -0
  27. package/dist/lib/eval-conversation-handler.js +1 -1
  28. package/dist/lib/eval-deterministic.js +1 -0
  29. package/dist/lib/eval-grader.js +1 -1
  30. package/dist/lib/eval-trigger-tester.js +1 -1
  31. package/dist/lib/handlers/cron-suggest-instructions.js +1 -1
  32. package/dist/lib/handlers/distill-memories.js +1 -1
  33. package/dist/lib/handlers/process-announcement.js +1 -1
  34. package/dist/lib/handlers/process-changelog.js +1 -1
  35. package/dist/lib/handlers/process-conversation.js +1 -1
  36. package/dist/lib/handlers/process-eval.js +1 -1
  37. package/dist/lib/handlers/process-insights.js +1 -1
  38. package/dist/lib/handlers/process-memory-ab.js +1 -1
  39. package/dist/lib/handlers/process-run-cleanup.js +1 -1
  40. package/dist/lib/handlers/process-session-goal.js +1 -1
  41. package/dist/lib/manual-tasks.js +1 -1
  42. package/oclif.manifest.json +1 -1
  43. package/package.json +4 -4
  44. package/dist/chunk-3C373UMW.js +0 -58
  45. package/dist/chunk-6D7PUPHT.js +0 -1
  46. package/dist/chunk-MTB4DSSX.js +0 -1
  47. package/dist/chunk-T4Z53J7B.js +0 -24
  48. package/dist/chunk-W2MZ4XZ6.js +0 -33
@@ -0,0 +1,8 @@
1
+ import{a as p}from"./chunk-QH7VY5HJ.js";import{a as l}from"./chunk-ZLLER3HP.js";var k=[{name:"git-commit-helper",description:"Writes conventional commit messages and PR descriptions from a diff"},{name:"sql-query-optimizer",description:"Analyzes slow SQL queries and proposes indexes and rewrites"},{name:"i18n-string-extractor",description:"Finds hardcoded UI strings and extracts them into translation files"}],T=`You are an AI coding assistant with access to a set of optional skills. When a user request matches a skill's description, you invoke that skill before answering; when no skill applies, you answer directly without one. Descriptions are your ONLY information about each skill.
2
+
3
+ {{CATALOG}}
4
+
5
+ Decide which single skill (if any) you would invoke for the user's request. Respond with ONLY a valid JSON object:
6
+ {"skill": "<exact skill name>" or null, "confidence": 0.0-1.0, "reason": "one sentence"}`;function b(n,t,e){let i=k.filter(s=>s.name!==n).map(s=>`- ${s.name}: ${s.description}`),d=(e%(i.length+1)+i.length+1)%(i.length+1);return i.splice(d,0,`- ${n}: ${t}`),`Available skills:
7
+ ${i.join(`
8
+ `)}`}l(b,"buildCatalog");async function v(n){let{query:t,shouldTrigger:e,skillName:a,skillDescription:i,model:d,timeout:s=6e4,variant:f=0}=n,h=T.replace("{{CATALOG}}",b(a,i,f)),c=await p({prompt:t,targetContent:h,timeout:s,model:d});if(c.error)return{query:t,shouldTrigger:e,didTrigger:!1,correct:!e,confidence:0,evidence:`Execution failed: ${c.error}`};try{let o=c.output.trim(),u=o.match(/```(?:json)?\s*([\s\S]*?)```/);u&&(o=u[1].trim());let g=o.match(/\{[\s\S]*\}/);g&&(o=g[0]);let r=JSON.parse(o),m=r.skill===a;return{query:t,shouldTrigger:e,didTrigger:m,correct:m===e,confidence:typeof r.confidence=="number"?r.confidence:0,evidence:`Chose ${r.skill===null||r.skill===void 0?"no skill":`"${r.skill}"`}${r.reason?`: ${r.reason}`:""}`}}catch{return{query:t,shouldTrigger:e,didTrigger:!1,correct:!e,confidence:0,evidence:`Model returned unparseable output: ${c.output.slice(0,200)}`}}}l(v,"testTrigger");function w(n){return n.length===0?0:n.filter(e=>e.correct).length/n.length}l(w,"computeTriggerScore");export{v as a,w as b};
@@ -0,0 +1,61 @@
1
+ import{a as h,b as v}from"./chunk-S6B2R2LL.js";import{a as f}from"./chunk-QH7VY5HJ.js";import{a as l}from"./chunk-ZLLER3HP.js";var G=`You are a rigorous eval grader. Your job is to evaluate whether an AI assistant's output meets a set of expectations.
2
+
3
+ You will receive:
4
+ 1. The original prompt that was given to the AI
5
+ 2. The AI's output/response
6
+ 3. A list of expectations (assertions) to evaluate
7
+
8
+ For each expectation:
9
+ - Search the output for evidence that the expectation is met
10
+ - Determine PASS or FAIL (no partial credit)
11
+ - Cite specific evidence (quote or description)
12
+
13
+ PASS criteria:
14
+ - Clear evidence the assertion is true
15
+ - Evidence reflects genuine completion, not surface compliance
16
+
17
+ FAIL criteria:
18
+ - No evidence found
19
+ - Evidence contradicts the expectation
20
+ - Cannot verify from available information
21
+
22
+ Beyond the predefined expectations, extract implicit claims from the output:
23
+ - Factual claims ("uses TypeScript", "has 3 parameters")
24
+ - Process claims ("used async/await pattern")
25
+ - Quality claims ("handles edge cases")
26
+
27
+ Verify each claim against the actual output.
28
+
29
+ Finally, critique the eval itself. For each assertion, ask two questions and set "flag" when the answer is yes:
30
+ - Would this assertion ALSO pass for a clearly wrong or useless output? Then it is worthless as a test \u2014 flag it "non_discriminating". (An assertion that cannot fail tells you nothing; passing it is false confidence.)
31
+ - Is this assertion impossible to verify from the prompt and output text alone (it references files, runtime state, or facts not present)? Flag it "unverifiable". Grade it FAIL per the criteria above, and the flag tells the eval author the assertion needs rewriting, not the output fixing.
32
+ Omit "flag" entirely for healthy assertions. Also suggest important outcomes that no assertion covers.
33
+
34
+ You MUST respond with ONLY a valid JSON object matching this exact structure (no markdown, no explanation, just JSON):
35
+
36
+ {
37
+ "expectations": [
38
+ { "text": "assertion text", "passed": true, "evidence": "specific quote or description", "flag": "non_discriminating | unverifiable \u2014 OMIT this key for healthy assertions" }
39
+ ],
40
+ "summary": { "passed": 2, "failed": 1, "total": 3, "pass_rate": 0.67 },
41
+ "claims": [
42
+ { "claim": "statement", "type": "factual", "verified": true, "evidence": "..." }
43
+ ],
44
+ "eval_feedback": {
45
+ "suggestions": [{ "assertion": "suggested new assertion", "reason": "why it matters" }],
46
+ "overall": "brief summary assessment"
47
+ }
48
+ }`;async function _(x){let{prompt:y,output:d,expectations:p,model:b,timeout:w=12e4}=x,a=new Array(p.length),r=[];p.forEach((e,s)=>{let t=h(e);if(t){let i=v(t,d);a[s]={text:e,passed:i.passed,evidence:i.evidence,method:"deterministic"}}else r.push({text:e,index:s})});let u=l((e,s)=>{let t=a.filter(c=>c.passed).length,i=a.length;return{expectations:a,summary:{passed:t,failed:i-t,total:i,pass_rate:i>0?t/i:0},claims:e,eval_feedback:s}},"finish"),m=l((e,s)=>{for(let t of r)a[t.index]={text:t.text,passed:!1,evidence:e,method:"llm"};return u([],{suggestions:[],overall:s})},"failSubjective");if(r.length===0)return u([],{suggestions:[],overall:"All expectations verified deterministically \u2014 LLM judge skipped."});let A=`## Original Prompt
49
+
50
+ ${y}
51
+
52
+ ## AI Output
53
+
54
+ ${d}
55
+
56
+ ## Expectations to Evaluate
57
+
58
+ ${r.map((e,s)=>`${s+1}. ${e.text}`).join(`
59
+ `)}
60
+
61
+ Grade the output against each expectation. Respond with ONLY valid JSON.`,o=await f({prompt:A,targetContent:G,timeout:w,model:b});if(o.error)return m(`Grader error: ${o.error}`,`Grading failed: ${o.error}`);try{let e=o.output.trim(),s=e.match(/```(?:json)?\s*([\s\S]*?)```/);s&&(e=s[1].trim());let t=e.match(/\{[\s\S]*\}/);t&&(e=t[0]);let i=JSON.parse(e);return r.forEach((c,S)=>{let n=i.expectations?.[S],g=n?.flag==="non_discriminating"||n?.flag==="unverifiable"?n.flag:void 0;a[c.index]=n?{text:c.text,passed:n.passed,evidence:n.evidence??"",method:"llm",...g?{flag:g}:{}}:{text:c.text,passed:!1,evidence:"Judge did not return a grade for this expectation",method:"llm"}}),u(i.claims??[],i.eval_feedback??{suggestions:[],overall:""})}catch{return m("Grader output was not valid JSON",`Grader returned unparseable output: ${o.output.slice(0,200)}`)}}l(_,"gradeEvalOutput");export{_ as a};
@@ -1 +1 @@
1
- import{c as L}from"./chunk-TIOKY2IA.js";import{a as b}from"./chunk-6D7PUPHT.js";import{a as h}from"./chunk-MUURX7WZ.js";import{b as I}from"./chunk-W2MOTOQE.js";import{a as R}from"./chunk-2DRBNTIQ.js";import{a as H}from"./chunk-7PSSAJYL.js";import{a as S}from"./chunk-RSKQRVPJ.js";import{a as A}from"./chunk-6RANV2QJ.js";import{a as M}from"./chunk-KAF3CYRW.js";import{a as k}from"./chunk-UF6US7VU.js";import{a as v}from"./chunk-DPFNJZUO.js";import{b as y}from"./chunk-L3VLVAP6.js";import{a as T}from"./chunk-WHCRHMYJ.js";import{b as w}from"./chunk-5RBLIVBF.js";import{a as E}from"./chunk-2HWXJBL3.js";import{b as f,e as _,f as p}from"./chunk-H2ORWIEY.js";import{a as s}from"./chunk-ZLLER3HP.js";var V={process_eval:b,process_insights:h,process_launch:I,process_send_message:S,process_conversation:E,process_session_goal:A,distill_memories:y,memory_ab:R,process_announcement:T,process_run_cleanup:H,cron_suggest_instructions:v,cron_refresh_skills:k,cron_refresh_pricing:M},N=Object.keys(V),O=new Set(["process_session_goal","process_announcement","process_run_cleanup","distill_memories","memory_ab"]);function W(e=process.env){return e.DATABASE_URL?N:N.filter(n=>!O.has(n))}s(W,"availableCapabilities");var $=3e4,B=3e4,F=3e4,P=250,D=5e3,J=`thin-agent-${process.pid}`,g=null;function U(e,n,r,l){let a=s(t=>{p("/api/workers/heartbeat",{workerType:"cli-worker",clientName:J,clientVersion:l,workerVersion:"0.1.0",currentJobId:null,inFlightCount:0,lastError:null,status:t,metadata:{capabilities:e,mode:"thin-agent"}}).then(c=>{let m=c?.advisory;m&&m.message!==g?(g=m.message,o(r,{event:"worker_advisory",code:m.code,message:m.message})):m||(g=null)}).catch(c=>{o(r,{event:"presence_heartbeat_error",error:c instanceof Error?c.message:String(c)})})},"send");a("alive");let d=setInterval(()=>a("alive"),F);n.addEventListener("abort",()=>{clearInterval(d),a("shutting_down")},{once:!0})}s(U,"startPresenceHeartbeat");function o(e,n){try{e(JSON.stringify({ts:new Date().toISOString(),...n}))}catch{e(`[agent-loop] log_error event=${n.event}`)}}s(o,"structuredLog");function C(e,n){return n.aborted?Promise.resolve(!1):e<=0?Promise.resolve(!0):new Promise(r=>{let l=setTimeout(()=>{n.removeEventListener("abort",a),r(!0)},e),a=s(()=>{clearTimeout(l),n.removeEventListener("abort",a),r(!1)},"onAbort");n.addEventListener("abort",a,{once:!0})})}s(C,"abortableSleep");async function K(e,n){let r=`capabilities=${encodeURIComponent(e.join(","))}&waitMs=${n}`,l=await _(`/api/work/next?${r}`);return l==null||typeof l=="string"?null:l}s(K,"pollForWork");function G(e,n){return{logger:{info:s(r=>n(r),"info"),warn:s(r=>n(r),"warn"),error:s(r=>n(r),"error")},job:{attempts:e}}}s(G,"makeHelpers");async function q(e,n,r){let l=V[e.kind],a=Date.now();if(o(r,{event:"claim",jobId:e.id,kind:e.kind,attempts:e.attempts}),!l){let t=`unknown kind: ${e.kind}`;o(r,{event:"fail",jobId:e.id,kind:e.kind,terminal:!0,error:t}),await p(`/api/work/${e.id}/fail`,{leaseToken:e.leaseToken,error:t,terminal:!0}).catch(()=>{});return}let d=setInterval(()=>{o(r,{event:"heartbeat",jobId:e.id}),p(`/api/work/${e.id}/heartbeat`,{leaseToken:e.leaseToken}).catch(t=>{o(r,{event:"heartbeat_error",jobId:e.id,error:t instanceof Error?t.message:String(t)})})},n);try{let t=G(e.attempts,r),c=await l(e.payload,t)??{};clearInterval(d),o(r,{event:"complete",jobId:e.id,kind:e.kind,durationMs:Date.now()-a}),await p(`/api/work/${e.id}/complete`,{leaseToken:e.leaseToken,result:c})}catch(t){clearInterval(d);let c=w(t),m=t instanceof Error?t.message:String(t);o(r,{event:"fail",jobId:e.id,kind:e.kind,durationMs:Date.now()-a,terminal:c,error:m}),await p(`/api/work/${e.id}/fail`,{leaseToken:e.leaseToken,error:m,terminal:c}).catch(i=>{o(r,{event:"fail_post_error",jobId:e.id,error:i instanceof Error?i.message:String(i)})})}}s(q,"runOne");async function me(e){let n=e.log??(()=>{}),r=e.pollWaitMs??$,l=e.heartbeatIntervalMs??B,a=e.capabilities??W(),d=P;o(n,{event:"agent_start",capabilities:a,pollWaitMs:r,heartbeatIntervalMs:l}),U(a,e.signal,n,e.version),L({signal:e.signal,log:n}).catch(i=>{o(n,{event:"tt_heartbeat_fatal",error:i instanceof Error?i.message:String(i)})});let t=5*6e4,c=0,m=s(()=>{if(!e.readInstalledVersion||!e.version)return!1;let i=Date.now();if(i-c<t)return!1;c=i;let u=e.readInstalledVersion();return!!(u&&u!==e.version)},"versionDrifted");for(;!e.signal.aborted;){if(m()){o(n,{event:"agent_version_drift",bootVersion:e.version,installedVersion:e.readInstalledVersion?.()??null}),e.onVersionDrift?.();break}let i=null;try{i=await K(a,r)}catch(u){let x=u instanceof f?u.statusCode:void 0;if(o(n,{event:"poll_error",status:x,error:u instanceof Error?u.message:String(u)}),!await C(d,e.signal))break;d=Math.min(d*2,D);continue}if(!i){if(o(n,{event:"poll_204"}),!await C(d,e.signal))break;d=Math.min(d*2,D);continue}d=P,await q(i,l,n)}o(n,{event:"agent_stop"})}s(me,"runAgentLoop");export{V as a,N as b,W as c,K as d,me as e};
1
+ import{c as L}from"./chunk-TIOKY2IA.js";import{a as S}from"./chunk-RSKQRVPJ.js";import{a as A}from"./chunk-SS5WVIQP.js";import{a as T}from"./chunk-E4BQ5QM3.js";import{a as E}from"./chunk-7SZX7C7U.js";import{a as b}from"./chunk-AIGR5AYV.js";import{a as h}from"./chunk-HDU5QPEO.js";import{b as I}from"./chunk-W2MOTOQE.js";import{a as R}from"./chunk-HITXGIHI.js";import{a as H}from"./chunk-OK3PGZND.js";import{b as w}from"./chunk-5RBLIVBF.js";import{a as M}from"./chunk-KAF3CYRW.js";import{a as k}from"./chunk-UF6US7VU.js";import{a as v}from"./chunk-O3C5IV2Y.js";import{b as y}from"./chunk-ATSA6BQM.js";import{b as f,e as _,f as p}from"./chunk-H2ORWIEY.js";import{a as s}from"./chunk-ZLLER3HP.js";var V={process_eval:b,process_insights:h,process_launch:I,process_send_message:S,process_conversation:E,process_session_goal:A,distill_memories:y,memory_ab:R,process_announcement:T,process_run_cleanup:H,cron_suggest_instructions:v,cron_refresh_skills:k,cron_refresh_pricing:M},N=Object.keys(V),O=new Set(["process_session_goal","process_announcement","process_run_cleanup","distill_memories","memory_ab"]);function W(e=process.env){return e.DATABASE_URL?N:N.filter(n=>!O.has(n))}s(W,"availableCapabilities");var $=3e4,B=3e4,F=3e4,P=250,D=5e3,J=`thin-agent-${process.pid}`,g=null;function U(e,n,r,l){let a=s(t=>{p("/api/workers/heartbeat",{workerType:"cli-worker",clientName:J,clientVersion:l,workerVersion:"0.1.0",currentJobId:null,inFlightCount:0,lastError:null,status:t,metadata:{capabilities:e,mode:"thin-agent"}}).then(c=>{let m=c?.advisory;m&&m.message!==g?(g=m.message,o(r,{event:"worker_advisory",code:m.code,message:m.message})):m||(g=null)}).catch(c=>{o(r,{event:"presence_heartbeat_error",error:c instanceof Error?c.message:String(c)})})},"send");a("alive");let d=setInterval(()=>a("alive"),F);n.addEventListener("abort",()=>{clearInterval(d),a("shutting_down")},{once:!0})}s(U,"startPresenceHeartbeat");function o(e,n){try{e(JSON.stringify({ts:new Date().toISOString(),...n}))}catch{e(`[agent-loop] log_error event=${n.event}`)}}s(o,"structuredLog");function C(e,n){return n.aborted?Promise.resolve(!1):e<=0?Promise.resolve(!0):new Promise(r=>{let l=setTimeout(()=>{n.removeEventListener("abort",a),r(!0)},e),a=s(()=>{clearTimeout(l),n.removeEventListener("abort",a),r(!1)},"onAbort");n.addEventListener("abort",a,{once:!0})})}s(C,"abortableSleep");async function K(e,n){let r=`capabilities=${encodeURIComponent(e.join(","))}&waitMs=${n}`,l=await _(`/api/work/next?${r}`);return l==null||typeof l=="string"?null:l}s(K,"pollForWork");function G(e,n){return{logger:{info:s(r=>n(r),"info"),warn:s(r=>n(r),"warn"),error:s(r=>n(r),"error")},job:{attempts:e}}}s(G,"makeHelpers");async function q(e,n,r){let l=V[e.kind],a=Date.now();if(o(r,{event:"claim",jobId:e.id,kind:e.kind,attempts:e.attempts}),!l){let t=`unknown kind: ${e.kind}`;o(r,{event:"fail",jobId:e.id,kind:e.kind,terminal:!0,error:t}),await p(`/api/work/${e.id}/fail`,{leaseToken:e.leaseToken,error:t,terminal:!0}).catch(()=>{});return}let d=setInterval(()=>{o(r,{event:"heartbeat",jobId:e.id}),p(`/api/work/${e.id}/heartbeat`,{leaseToken:e.leaseToken}).catch(t=>{o(r,{event:"heartbeat_error",jobId:e.id,error:t instanceof Error?t.message:String(t)})})},n);try{let t=G(e.attempts,r),c=await l(e.payload,t)??{};clearInterval(d),o(r,{event:"complete",jobId:e.id,kind:e.kind,durationMs:Date.now()-a}),await p(`/api/work/${e.id}/complete`,{leaseToken:e.leaseToken,result:c})}catch(t){clearInterval(d);let c=w(t),m=t instanceof Error?t.message:String(t);o(r,{event:"fail",jobId:e.id,kind:e.kind,durationMs:Date.now()-a,terminal:c,error:m}),await p(`/api/work/${e.id}/fail`,{leaseToken:e.leaseToken,error:m,terminal:c}).catch(i=>{o(r,{event:"fail_post_error",jobId:e.id,error:i instanceof Error?i.message:String(i)})})}}s(q,"runOne");async function me(e){let n=e.log??(()=>{}),r=e.pollWaitMs??$,l=e.heartbeatIntervalMs??B,a=e.capabilities??W(),d=P;o(n,{event:"agent_start",capabilities:a,pollWaitMs:r,heartbeatIntervalMs:l}),U(a,e.signal,n,e.version),L({signal:e.signal,log:n}).catch(i=>{o(n,{event:"tt_heartbeat_fatal",error:i instanceof Error?i.message:String(i)})});let t=5*6e4,c=0,m=s(()=>{if(!e.readInstalledVersion||!e.version)return!1;let i=Date.now();if(i-c<t)return!1;c=i;let u=e.readInstalledVersion();return!!(u&&u!==e.version)},"versionDrifted");for(;!e.signal.aborted;){if(m()){o(n,{event:"agent_version_drift",bootVersion:e.version,installedVersion:e.readInstalledVersion?.()??null}),e.onVersionDrift?.();break}let i=null;try{i=await K(a,r)}catch(u){let x=u instanceof f?u.statusCode:void 0;if(o(n,{event:"poll_error",status:x,error:u instanceof Error?u.message:String(u)}),!await C(d,e.signal))break;d=Math.min(d*2,D);continue}if(!i){if(o(n,{event:"poll_204"}),!await C(d,e.signal))break;d=Math.min(d*2,D);continue}d=P,await q(i,l,n)}o(n,{event:"agent_stop"})}s(me,"runAgentLoop");export{V as a,N as b,W as c,K as d,me as e};
@@ -0,0 +1,20 @@
1
+ import{f as r}from"./chunk-RTWRHIKY.js";import{a as o}from"./chunk-ZLLER3HP.js";var i=5,g=`You are designing eval test cases for an AI-coding-agent instruction (a CLAUDE.md rule, skill, or prompt). Your cases will be executed by running the prompt through an agent WITH and WITHOUT the instruction, then grading the outputs \u2014 so every case must be able to tell those two conditions apart.
2
+
3
+ Requirements for the set:
4
+ - Each case: a realistic task prompt a developer would give an agent, plus 1-3 expectations.
5
+ - Expectations must be DISCRIMINATING: they should pass when the instruction is followed and fail when it is not. An expectation that passes for any reasonable output is worthless.
6
+ - Prefer DETERMINISTIC expectations wherever the outcome is objectively checkable, using these exact prefixes (they are graded programmatically, not by an LLM judge):
7
+ - "contains: <substring>" \u2014 output must contain the substring (case-sensitive)
8
+ - "icontains: <substring>" \u2014 case-insensitive contains
9
+ - "not-contains: <substring>" \u2014 output must NOT contain the substring
10
+ - "regex: <pattern>" \u2014 output must match the pattern
11
+ - "json-valid" \u2014 output must parse as JSON
12
+ Use plain free-text expectations only for genuinely subjective outcomes.
13
+ - Include exactly ONE "violation-attempt" case: a prompt that subtly encourages breaking the instruction's strongest prohibition; expectations assert the instruction still holds. Name it starting with "violation-attempt:".
14
+ - Name compliance cases starting with "compliance:".
15
+ - At most ${i} cases.
16
+
17
+ Respond with ONLY a valid JSON object:
18
+ {"cases": [{"name": "...", "prompt": "...", "expectations": ["..."]}]}`;async function d(c){let{content:p,name:l}=c,u=`## Instruction under test: ${l}
19
+
20
+ ${p}`,e=await r(g,u,4e3);if(e===null)return null;let n=e.cases;if(!Array.isArray(n))throw new Error(`Case generator returned invalid shape (no cases array): ${JSON.stringify(e).slice(0,200)}`);let s=[];for(let m of n){let t=m;typeof t.name=="string"&&t.name.length>0&&typeof t.prompt=="string"&&t.prompt.length>0&&Array.isArray(t.expectations)&&t.expectations.length>0&&t.expectations.every(a=>typeof a=="string"&&a.length>0)&&s.push({name:t.name,prompt:t.prompt,expectations:t.expectations})}if(s.length===0)throw new Error(`Case generator produced no usable cases (${n.length} row(s), all malformed or empty)`);return s.slice(0,i)}o(d,"generateEvalCases");export{d as a};
@@ -0,0 +1 @@
1
+ import{a as s}from"./chunk-ZLLER3HP.js";function w(r){if(typeof r!="string")return null;let n=r.toUpperCase();return n==="A"||n==="B"||n==="TIE"?n:null}s(w,"normalizeWinner");function v(r){return Array.isArray(r)?r.filter(n=>typeof n=="string"):[]}s(v,"stringList");function d(r){let n=r.trim(),a=n.match(/```(?:json)?\s*([\s\S]*?)```/);a&&(n=a[1].trim());let e=n.match(/\{[\s\S]*\}/);e&&(n=e[0]);let t;try{t=JSON.parse(n)}catch{return null}if(typeof t!="object"||t===null)return null;let{per_eval:l,overall:g}=t,i=typeof g=="object"&&g!==null?g:{},u=w(i.winner);return u?{perEval:(Array.isArray(l)?l:[]).flatMap(p=>{if(typeof p!="object"||p===null)return[];let o=p,c=w(o.winner);return!c||typeof o.eval_name!="string"?[]:[{evalName:o.eval_name,winner:c,reasoning:typeof o.reasoning=="string"?o.reasoning:""}]}),overall:{winner:u,reasoning:typeof i.reasoning=="string"?i.reasoning:"",strengthsWinner:v(i.strengths_winner),weaknessesLoser:v(i.weaknesses_loser)}}:null}s(d,"parseComparatorOutput");function m(r,n){let a=s(e=>{if(e==="TIE")return null;let t=n.isSwapped?n.targetBId:n.targetAId,l=n.isSwapped?n.targetAId:n.targetBId;return e==="A"?t:l},"resolve");return{winnerTargetId:a(r.overall.winner),perEval:r.perEval.map(e=>({evalName:e.evalName,winnerTargetId:a(e.winner),reasoning:e.reasoning})),overall:{reasoning:r.overall.reasoning,strengthsWinner:r.overall.strengthsWinner,weaknessesLoser:r.overall.weaknessesLoser}}}s(m,"resolveComparison");export{d as a,m as b};
@@ -1 +1 @@
1
- import{a as i}from"./chunk-T4Z53J7B.js";import{h as s}from"./chunk-H2ORWIEY.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
+ import{a as i}from"./chunk-FJJ54GK3.js";import{h as s}from"./chunk-H2ORWIEY.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};
@@ -0,0 +1 @@
1
+ import{a as N}from"./chunk-5RBLIVBF.js";import{a as S}from"./chunk-QUUN6A7E.js";import{a as T}from"./chunk-6V4WM73L.js";import{a as G}from"./chunk-5XP7WWJR.js";import{a as C}from"./chunk-5BMBVTAE.js";import{a as x}from"./chunk-QH7VY5HJ.js";import{e as k,f as E,h as d}from"./chunk-H2ORWIEY.js";import{a as h}from"./chunk-ZLLER3HP.js";async function W(v,f){let{mirrorId:s,evalTargetId:g,config:o}=v,a=h(e=>f.logger.info(e),"log"),i=await k(`/api/eval-targets/${g}`),$=await k(`/api/eval-targets/${g}/evals`);if($.length===0&&o.generateIfEmpty){a("No eval cases on target \u2014 generating from content via local LLM...");let e=await G({content:i.content,name:i.name});if(e===null)throw new Error("Case generation requires an LLM backend (claude CLI on PATH or ANTHROPIC_API_KEY) \u2014 none available on this worker.");let t=[];for(let n of e)t.push(await E(`/api/eval-targets/${g}/evals`,n));$=t,a(`Generated ${t.length} eval case(s)`)}if($.length===0)throw new N("No evals defined for target");let J=o.runsPerEval??1,R=o.timeout??12e4,j=o.iteration??1,y=new Set;if(f.job.attempts>1)for(let t=0;;t+=100){let n=await k(`/api/eval-targets/${g}/runs?jobId=${s}&limit=100&offset=${t}`);for(let r of n)y.add(`${r.evalId}|${r.configuration}|${r.runNumber}|${r.iteration}`);if(n.length<100)break}let _=[{name:"with_target",content:i.content}];o.skipBaseline||_.push({name:"without_target"});let m=[];for(let e of $)for(let t of _)for(let n=1;n<=J;n++)y.has(`${e.id}|${t.name}|${n}|${j}`)||m.push({eval_:e,configuration:t.name,targetContent:t.content,runNumber:n});y.size>0&&a(`Resuming attempt ${f.job.attempts}: ${y.size} run(s) already persisted, ${m.length} remaining`);let l=m.length,u=0,c=Math.min(o.parallel??1,4);await d(`/api/eval-jobs/${s}/progress`,{status:"running",progress:{total:l,completed:0,current:null,message:`Starting ${l} eval runs (concurrency: ${c})...`}});let b=[];async function I(e){let t=`${e.configuration} \xB7 ${e.eval_.name} \xB7 run#${e.runNumber}`;a(`[${u+1}/${l}] ${t}`);let n=c>1?T():null;try{let r=await x({prompt:e.eval_.prompt,targetContent:e.targetContent,workDir:n?.workDir,timeout:R,model:o.model}),p={};return!o.skipGrading&&e.eval_.expectations.length>0&&!r.error&&(p=await C({prompt:e.eval_.prompt,output:r.output,expectations:e.eval_.expectations,model:o.graderModel??o.model,timeout:R})),{jobId:s,evalId:e.eval_.id,evalTargetId:i.id,evalTargetVersion:i.version,configuration:e.configuration,runNumber:e.runNumber,iteration:j,status:r.error?"failed":"completed",outputs:r.error?{error:r.error}:{transcript:r.output},timing:{duration_ms:r.durationMs,total_tokens:r.totalTokens},grading:p,worktree:n?.isWorktree?!0:void 0}}finally{n?.cleanup()}}if(h(I,"processItem"),c<=1)for(let e of m){let t=`${e.configuration} \xB7 ${e.eval_.name} \xB7 run#${e.runNumber}`;await d(`/api/eval-jobs/${s}/progress`,{status:"running",progress:{total:l,completed:u,current:t,message:`Executing ${t}...`}});let n=await I(e);await E("/api/eval-runs",n),b.push(n),u++,await d(`/api/eval-jobs/${s}/progress`,{status:"running",progress:{total:l,completed:u,current:t,message:`Completed ${t}`}})}else{a(`Running ${l} evals with concurrency=${c} (worktree isolation)`);for(let e=0;e<m.length;e+=c){let t=m.slice(e,e+c),n=`batch ${Math.floor(e/c)+1}/${Math.ceil(m.length/c)}`;await d(`/api/eval-jobs/${s}/progress`,{status:"running",progress:{total:l,completed:u,current:n,message:`Executing ${n} (${t.length} parallel)...`}});let r=await Promise.all(t.map(I));for(let p of r)await E("/api/eval-runs",p),b.push(p),u++;await d(`/api/eval-jobs/${s}/progress`,{status:"running",progress:{total:l,completed:u,current:n,message:`Completed ${n}`}})}}let P=z(b),w;if(!o.skipGrading&&b.some(e=>e.grading&&Object.keys(e.grading).length>0))try{a(`Running meta-judge for job ${s}...`);let e=$.map(t=>{let r=b.filter(p=>p.evalId===t.id&&p.configuration==="with_target")[0];return{evalName:t.name,prompt:t.prompt,expectations:t.expectations,grading:r?.grading?r.grading:null,output:r?.outputs?.transcript?.slice(0,500)}});w=await S({targetName:i.name,evalResults:e,model:o.graderModel??o.model,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 M=w?{...P,meta_judgement:w}:P;return a(`Job ${s} completed: ${u}/${l} runs`),await d(`/api/eval-jobs/${s}/state`,{result:M}).catch(e=>{a(`result persist failed: ${e instanceof Error?e.message:String(e)}`)}),M}h(W,"processEval");function z(v){let f=v.filter(a=>a.status==="completed"),s=v.filter(a=>a.status==="failed"),g=f.filter(a=>{let i=a.grading;return i&&Object.keys(i).length>0}),o=g.length>0?g.reduce((a,i)=>a+(i.grading?.summary?.pass_rate??0),0)/g.length:null;return{total:v.length,completed:f.length,failed:s.length,avgPassRate:o}}h(z,"buildSummary");export{W as a};
@@ -1,4 +1,4 @@
1
- import{f as v}from"./chunk-RTWRHIKY.js";import{a as I,c as i,d as r,e as a,j as M}from"./chunk-MTB4DSSX.js";import{a as y}from"./chunk-ZLLER3HP.js";import{eq as u,and as A,desc as E,inArray as j,isNotNull as D,sql as R}from"drizzle-orm";var x=50,k=24e3,C=3,L=3,O=40,P=4e3,X=new Set(["fact","decision","correction","convention"]),$=`You are distilling DURABLE, PROJECT-SPECIFIC knowledge from an AI coding session so a future agent working on the SAME project starts smarter.
1
+ import{a as I,c as i,d as r,e as a,j as M}from"./chunk-QH6X6VOT.js";import{f as v}from"./chunk-RTWRHIKY.js";import{a as y}from"./chunk-ZLLER3HP.js";import{eq as u,and as A,desc as E,inArray as j,isNotNull as D,sql as R}from"drizzle-orm";var x=50,k=24e3,C=3,L=3,O=40,P=4e3,X=new Set(["fact","decision","correction","convention"]),$=`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,2 +1,2 @@
1
- import{a as R}from"./chunk-5RBLIVBF.js";import{b as B}from"./chunk-N7TGRFVZ.js";import{a as v,g as d,h as n,i as m,j as U}from"./chunk-MTB4DSSX.js";import{a as $}from"./chunk-ZLLER3HP.js";import{and as L,asc as j,eq as l,gt as q,isNotNull as F,sql as O}from"drizzle-orm";var _=100,C=10;async function G(I,s={}){let t=s.db??U(),D=s.sendEmail??B,p=s.log??(o=>process.stderr.write(`[process_announcement] ${o}
1
+ import{b as B}from"./chunk-N7TGRFVZ.js";import{a as R}from"./chunk-5RBLIVBF.js";import{a as v,g as d,h as n,i as m,j as U}from"./chunk-QH6X6VOT.js";import{a as $}from"./chunk-ZLLER3HP.js";import{and as L,asc as j,eq as l,gt as q,isNotNull as F,sql as O}from"drizzle-orm";var _=100,C=10;async function G(I,s={}){let t=s.db??U(),D=s.sendEmail??B,p=s.log??(o=>process.stderr.write(`[process_announcement] ${o}
2
2
  `)),b=s.webBaseUrl??process.env.RULEMETRIC_WEB_URL??process.env.WEB_URL??"https://rulemetric.com",{announcementId:r}=I,[i]=await t.select().from(d).where(l(d.id,r)).limit(1);if(!i)throw new R(`Announcement ${r} not found`);if(i.status!=="queued"&&i.status!=="sending")throw new R(`Announcement ${r} is in status='${i.status}'; expected 'queued' or 'sending'.`);await t.update(d).set({status:"sending",updatedAt:new Date}).where(l(d.id,r)),p(`Sending announcement ${r} (${i.subject??""})`);let w=0,f=0,h=0,y=0,k=null;try{for(;;){let c=await t.select({userId:m.userId,email:v.email,displayName:v.displayName,unsubscribeToken:m.unsubscribeToken}).from(m).innerJoin(v,l(v.id,m.userId)).where(L(l(m.productAnnouncements,!0),F(v.email),k?q(m.userId,k):void 0)).orderBy(j(m.userId)).limit(_);if(c.length===0)break;k=c[c.length-1].userId;for(let A=0;A<c.length;A+=C){let P=c.slice(A,A+C),S=await Promise.allSettled(P.map(g=>W({recipient:g,announcement:i,webBaseUrl:b,sendEmail:D,db:t})));for(let g=0;g<S.length;g++){let u=S[g];if(u.status==="fulfilled")u.value.ok==="sent"?w++:u.value.ok==="skipped"?h++:(f++,u.value.provider==="noop"&&y++,p(` recipient ${P[g].userId}: send failed \u2014 ${u.value.error}`));else{f++;let T=u.reason instanceof Error?u.reason.message:String(u.reason);p(` recipient ${P[g].userId}: send failed \u2014 ${T}`)}}}if(c.length<_)break}y>0&&p(`WARNING: ${y} recipient(s) hit the noop email provider and were recorded as FAILED \u2014 no email provider is configured on this worker (set RESEND_API_KEY in ~/.config/rulemetric/env and reinstall the service)`);let o=await t.select({status:n.status,count:O`count(*)::int`}).from(n).where(l(n.announcementId,r)).groupBy(n.status),e={};for(let c of o)e[c.status]=c.count;let a=e.sent??0,E=e.failed??0,N=a===0&&E>0?"failed":"sent",x=E>0?`${E} of ${a+E} recipient(s) failed; see announcement_deliveries`:null;return await t.update(d).set({status:N,recipientCount:a,...N==="sent"?{sentAt:new Date}:{},error:x,updatedAt:new Date}).where(l(d.id,r)),p(`Done: status=${N} sent=${a} failed=${E} (this attempt: sent=${w} failed=${f} skipped=${h})`),{sent:w,failed:f,skipped:h}}catch(o){let e=o instanceof Error?o.message:String(o);throw await t.update(d).set({status:"failed",error:e.slice(0,1e3),updatedAt:new Date}).where(l(d.id,r)).catch(()=>{}),o}}$(G,"processAnnouncement");function K(I){return I.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}$(K,"escapeHtml");async function W(I){let{recipient:s,announcement:t,webBaseUrl:D,sendEmail:p,db:b}=I;if(!s.email)return{ok:"skipped",reason:"no-email"};let r=await b.insert(n).values({announcementId:t.id,userId:s.userId,email:s.email,status:"pending"}).onConflictDoNothing({target:[n.announcementId,n.userId]}).returning({id:n.id});if(r.length===0)return{ok:"skipped",reason:"already-claimed"};let i=r[0].id,w=D.replace(/\/$/,""),f=encodeURIComponent(s.unsubscribeToken),h=`${w}/unsubscribe/${f}`,y=s.displayName?.trim().split(/\s+/)[0]||"there",k=t.htmlBody.replaceAll("{{unsubscribe_url}}",h).replaceAll("{{recipient_name}}",K(y)),o=t.textBody.replaceAll("{{unsubscribe_url}}",h).replaceAll("{{recipient_name}}",y);try{let e=await p({to:s.email,subject:t.subject,html:k,text:o,fromName:"RuleMetric",idempotencyKey:i,headers:{"List-Unsubscribe":`<${w}/api/unsubscribe/${f}>`,"List-Unsubscribe-Post":"List-Unsubscribe=One-Click"}});if(e.provider==="noop"){let a="no email provider configured (RESEND_API_KEY unset on the worker)";return await b.update(n).set({status:"failed",error:a}).where(l(n.id,i)),{ok:"failed",error:a,provider:e.provider}}return await b.update(n).set({status:"sent",providerId:e.id,sentAt:new Date}).where(l(n.id,i)),{ok:"sent",providerId:e.id,provider:e.provider}}catch(e){let a=e instanceof Error?e.message:String(e);return await b.update(n).set({status:"failed",error:a.slice(0,1e3)}).where(l(n.id,i)).catch(()=>{}),{ok:"failed",error:a}}}$(W,"sendOne");export{G as a};
@@ -0,0 +1,24 @@
1
+ import{a as $}from"./chunk-5XP7WWJR.js";import{a as C}from"./chunk-PTPDOYWP.js";import{a as y}from"./chunk-5BMBVTAE.js";import{a as f}from"./chunk-QH7VY5HJ.js";import{e as h,f as w}from"./chunk-H2ORWIEY.js";import{a as v}from"./chunk-ZLLER3HP.js";async function N(n,i,p){let{conversationId:a,messageId:g,messageContent:r}=n,o=await h(`/api/eval-targets/${i}`),c=await h(`/api/eval-targets/${i}/evals`),e=await h(`/api/eval-conversations/${a}/messages`),t=e.findIndex(l=>l.id===g);if(t>=0&&e.slice(t+1).some(u=>u.role==="assistant"&&(u.type==="results"||u.type==="proposal"||u.type==="generated"||u.type==="text"))){p(`Message ${g} already processed \u2014 skipping (idempotency guard)`);return}let s=v(async(l,u,m)=>{await w(`/api/eval-conversations/${a}/messages/assistant`,{content:l,type:u,data:m})},"postMessage"),d=await _(o,c,e,r,p);p(`Action: ${d.action}`);try{switch(d.action){case"run_evals":await x(o,c,a,s,p);break;case"generate_cases":await k(o,i,a,s,p);break;case"analyze_results":case"propose_changes":await E(o,c,e,r,a,s,p);break;case"respond":await s(d.response,"text");break}}catch(l){let u=l instanceof Error?l.message:String(l);throw await s(`Something went wrong: ${u}`,"text").catch(()=>{}),l}}v(N,"processConversationJob");async function _(n,i,p,a,g){let r=p.slice(-10).map(e=>`${e.role}: ${e.content.slice(0,200)}`).join(`
2
+ `),o=`You are an eval assistant. Decide what action to take based on the user's message.
3
+
4
+ ## Current State
5
+ - Eval target: "${n.name}" v${n.version} (${n.type})
6
+ - Eval cases: ${i.length} defined${i.length>0?` (${i.map(e=>e.name).join(", ")})`:""}
7
+ - Content length: ${n.content.length} chars
8
+
9
+ ## Recent Conversation
10
+ ${r}
11
+
12
+ ## User's Latest Message
13
+ ${a}
14
+
15
+ ## Available Actions
16
+ - run_evals: Run all eval cases against the current version (target content injected; no baseline arm). Choose this when the user wants to test, evaluate, or see how the instruction performs.
17
+ - generate_cases: Auto-generate eval test cases from the instruction content. Choose this when there are no eval cases (${i.length} currently) or user asks to create/generate tests.
18
+ - analyze_results: Analyze recent eval failures and propose improvements based on user feedback. Choose this when user gives qualitative feedback like "this is wrong", "missing X", etc.
19
+ - propose_changes: Propose specific content edits based on conversation. Choose this when user asks for improvements or changes.
20
+ - respond: Just answer a question without running any evals. Choose this for informational questions.
21
+
22
+ Respond with ONLY valid JSON:
23
+ {"action": "run_evals", "response": "What you want to say to the user", "params": {}}`,c=await f({prompt:o,timeout:3e4});try{let e=c.output.trim(),t=e.match(/\{[\s\S]*\}/);return t&&(e=t[0]),JSON.parse(e)}catch{g("Failed to parse action decision, defaulting to respond");let e=a.toLowerCase();return e.includes("run")||e.includes("test")||e.includes("eval")?{action:"run_evals",response:"Running evals now..."}:e.includes("generate")||e.includes("create")||i.length===0&&e.includes("start")?{action:"generate_cases",response:"Generating test cases..."}:{action:"respond",response:"I can help you run evals, generate test cases, or analyze results. What would you like to do?"}}}v(_,"decideAction");async function x(n,i,p,a,g){if(i.length===0){await a("No eval cases exist yet. Would you like me to generate some from the instruction content?","text");return}await a(`Running ${i.length} evals against "${n.name}" v${n.version}...`,"status");let r=[];for(let e of i){g(`Running: ${e.name} (with_target)`);let t=await f({prompt:e.prompt,targetContent:n.content,timeout:12e4}),s=!1,d="",l={};!t.error&&e.expectations.length>0&&(l=await y({prompt:e.prompt,output:t.output,expectations:e.expectations,timeout:12e4}),s=l?.summary?.pass_rate>=1,d=l?.expectations?.map(m=>`${m.passed?"PASS":"FAIL"}: ${m.text} \u2014 ${m.evidence}`).join(`
24
+ `)??"");try{await w("/api/eval-runs",{evalId:e.id,evalTargetId:n.id,evalTargetVersion:n.version,configuration:"with_target",status:t.error?"failed":"completed",outputs:t.error?{error:t.error}:{transcript:t.output},timing:{duration_ms:t.durationMs,total_tokens:t.totalTokens},grading:l})}catch(u){g(`eval-run persist failed (non-fatal): ${u instanceof Error?u.message:String(u)}`)}r.push({evalName:e.name,passed:s,output:t.error??t.output.slice(0,2e3),expectations:e.expectations,evidence:d,configuration:"with_target"})}let o=r.filter(e=>e.passed).length,c=r.length;await a(`${o} of ${c} evals passed (${Math.round(o/c*100)}%)`,"results",{summary:{passed:o,failed:c-o,total:c,passRate:o/c},results:r.map(e=>({evalName:e.evalName,passed:e.passed,output:e.output,expectations:e.expectations,evidence:e.evidence}))})}v(x,"handleRunEvals");async function k(n,i,p,a,g){let r=v(t=>t.map(s=>({id:s.id,name:s.name,prompt:s.prompt,expectations:s.expectations})),"showCases"),o=await h(`/api/eval-targets/${n.id}/evals`);if(o.length>0){await a(`This target already has ${o.length} eval case${o.length===1?"":"s"}:`,"generated",{cases:r(o)});return}await a("Generating eval cases from instruction content...","status"),g("Generating cases via local LLM");let c=await $({content:n.content,name:n.name});if(c===null){await a("Case generation needs an LLM backend (claude CLI on PATH or ANTHROPIC_API_KEY) and none is available on this worker \u2014 no cases were created.","text");return}let e=[];for(let t of c)e.push(await w(`/api/eval-targets/${n.id}/evals`,t));await a(`Generated ${e.length} eval cases. Review them below:`,"generated",{cases:r(e)})}v(k,"handleGenerateCases");async function E(n,i,p,a,g,r,o){await r("Analyzing results and preparing improvements...","status");let e=[...p].reverse().find(s=>s.type==="results")?.data?.results?.map(s=>({evalName:s.evalName,prompt:"",expectations:s.expectations??[],grading:{summary:{pass_rate:s.passed?1:0},expectations:s.expectations?.map(d=>({text:d,passed:s.passed,evidence:s.evidence??""}))}}))??[];o(`Analyzing ${e.length} eval results with user feedback`);let t=await C({content:n.content,evalResults:e,model:void 0,timeout:12e4,userFeedback:a});await r(t.overallAssessment,"proposal",{suggestions:t.suggestions,proposedContent:t.proposedContent,fromVersion:n.version})}v(E,"handleAnalyzeAndPropose");export{N as a};
@@ -1,4 +1,4 @@
1
- import{a as S,b as z,c as T}from"./chunk-QFVGUZDO.js";import{c as A,d as C,f as b}from"./chunk-RTWRHIKY.js";import{a as j}from"./chunk-5RBLIVBF.js";import{a as O}from"./chunk-ZL4MZMUK.js";import{e as _,f as I,h as u}from"./chunk-H2ORWIEY.js";import{a as $}from"./chunk-ZLLER3HP.js";async function D(f,m){let{mirrorId:o,projectPath:s,projectId:i,config:p}=f,e=$(n=>m.logger.info(n),"log");if(p?.sessionId)return M({mirrorId:o,sessionId:p.sessionId},e);e(`Processing insights job ${o}...`),await u(`/api/insights-jobs/${o}/progress`,{status:"running",progress:{step:"reading_data"}});try{let{repaired:n}=await I("/api/sessions/repair-analyzed-at",{});n>0&&e(` Repaired analyzed_at on ${n} orphan session(s).`)}catch(n){e(` Warning: analyzed_at repair failed: ${n instanceof Error?n.message:String(n)}`)}let a=await J(s,i);if(!a)throw new j("No session data found \u2014 ensure sessions are captured and enriched.");e(` Found ${a.stats.sessions} sessions, generating recommendations...`);let w=20,c=200;if(C()!=="none"){let n=0,t=0;try{for(;n<c;){let l=await _(`/api/sessions?hasAnalysis=false&limit=${w}&offset=${t}`);if(l.length===0)break;e(` Generating facets for ${l.length} un-analyzed sessions (drained ${n} so far)...`);for(let g of l){if(n>=c)break;try{let d=await _(`/api/sessions/${g.id}/events?limit=100`);if(d.length<2){n++,t++;continue}let P=d.filter(h=>h.eventType==="user_message"||h.eventType==="human").map(h=>h.content?.slice(0,200)??"").filter(Boolean).join(`
1
+ import{a as S,b as z,c as T}from"./chunk-QFVGUZDO.js";import{a as j}from"./chunk-5RBLIVBF.js";import{a as O}from"./chunk-ZL4MZMUK.js";import{c as A,d as C,f as b}from"./chunk-RTWRHIKY.js";import{e as _,f as I,h as u}from"./chunk-H2ORWIEY.js";import{a as $}from"./chunk-ZLLER3HP.js";async function D(f,m){let{mirrorId:o,projectPath:s,projectId:i,config:p}=f,e=$(n=>m.logger.info(n),"log");if(p?.sessionId)return M({mirrorId:o,sessionId:p.sessionId},e);e(`Processing insights job ${o}...`),await u(`/api/insights-jobs/${o}/progress`,{status:"running",progress:{step:"reading_data"}});try{let{repaired:n}=await I("/api/sessions/repair-analyzed-at",{});n>0&&e(` Repaired analyzed_at on ${n} orphan session(s).`)}catch(n){e(` Warning: analyzed_at repair failed: ${n instanceof Error?n.message:String(n)}`)}let a=await J(s,i);if(!a)throw new j("No session data found \u2014 ensure sessions are captured and enriched.");e(` Found ${a.stats.sessions} sessions, generating recommendations...`);let w=20,c=200;if(C()!=="none"){let n=0,t=0;try{for(;n<c;){let l=await _(`/api/sessions?hasAnalysis=false&limit=${w}&offset=${t}`);if(l.length===0)break;e(` Generating facets for ${l.length} un-analyzed sessions (drained ${n} so far)...`);for(let g of l){if(n>=c)break;try{let d=await _(`/api/sessions/${g.id}/events?limit=100`);if(d.length<2){n++,t++;continue}let P=d.filter(h=>h.eventType==="user_message"||h.eventType==="human").map(h=>h.content?.slice(0,200)??"").filter(Boolean).join(`
2
2
  ---
3
3
  `);if(!P){n++,t++;continue}let E=await b(T,P,4096);if(E){let h=d.filter(R=>R.eventType==="user_message"||R.eventType==="human").length;await u(`/api/sessions/${g.id}/enrich`,{analysis:{source:"generated_facets",...E},analyzedEventCount:d.length,analyzedTurnCount:h}),e(` Generated facets for session ${g.id} (${g.tool})`)}else t++;n++}catch(d){e(` Failed to generate facets for session ${g.id}: ${d instanceof Error?d.message:String(d)}`),n++,t++}}if(l.length<w)break}}catch(l){e(` Warning: facet generation failed after ${n} sessions: ${l instanceof Error?l.message:String(l)}`)}}let r={},y=S.length+1;for(let n=0;n<S.length;n++){let t=S[n];e(` [${n+1}/${y}] Generating ${t.name}...`);try{await u(`/api/insights-jobs/${o}/progress`,{status:"running",progress:{step:t.name,current:n+1,total:y,partial:{...r}}})}catch(g){e(` Warning: progress update failed for ${t.name}: ${g instanceof Error?g.message:String(g)}`)}e(` Running LLM prompt for ${t.name}...`);let l=await b(t.prompt,a.summary,t.maxTokens);l?(r[t.name]=l,e(` Got result for ${t.name}`)):e(` No result for ${t.name} (LLM returned null)`)}e(` [${y}/${y}] Generating at_a_glance...`),await u(`/api/insights-jobs/${o}/progress`,{status:"running",progress:{step:"at_a_glance",current:y,total:y,partial:{...r}}});let N=[a.summary,r.what_works?`
4
4
  ## What Works
@@ -1 +1 @@
1
- import{e as u,f as t,j as x}from"./chunk-MTB4DSSX.js";import{a as E}from"./chunk-3C373UMW.js";import{a as P}from"./chunk-QH7VY5HJ.js";import{a as f}from"./chunk-ZLLER3HP.js";import{eq as s}from"drizzle-orm";import{buildControlledVerdict as M}from"@rulemetric/effectiveness";var A=f(m=>m.summary.pass_rate>=1?1:0,"fullPassScore");async function q(m,d={}){let r=d.db??x(),w=d.executeEval??P,y=d.grade??E,n=d.now??Date.now,[e]=await r.select().from(t).where(s(t.id,m.experimentId)).limit(1);if(!e)return{skipped:"not_found"};if(e.status==="completed"||e.status==="failed")return{skipped:"already_terminal",status:e.status};let[g]=await r.select({body:u.body}).from(u).where(s(u.id,e.memoryId)).limit(1);if(!g)return await r.update(t).set({status:"failed",error:"memory no longer exists",completedAt:new Date(n())}).where(s(t.id,e.id)),{skipped:"memory_gone",status:"failed"};await r.update(t).set({status:"running",startedAt:new Date(n())}).where(s(t.id,e.id));let b=e.expectations??[],l=e.model??void 0,a=[],h=0;try{for(let i=0;i<e.trials;i++){let c=await w({prompt:e.taskPrompt,targetContent:g.body,model:l}),p=await w({prompt:e.taskPrompt,model:l});if(c.error||p.error){h++;continue}let[v,D]=await Promise.all([y({prompt:e.taskPrompt,output:c.output,expectations:b,model:l}),y({prompt:e.taskPrompt,output:p.output,expectations:b,model:l})]);a.push({withScore:A(v),withoutScore:A(D),withLatency:c.durationMs/1e3,withoutLatency:p.durationMs/1e3})}if(a.length===0){let i=`no trials completed (${h}/${e.trials} runs errored \u2014 is the claude CLI available?)`;return await r.update(t).set({status:"failed",error:i,completedAt:new Date(n())}).where(s(t.id,e.id)),{status:"failed",requestedTrials:e.trials,completedTrials:0}}let o=M(a);return await r.update(t).set({status:"completed",result:{verdict:o,pairs:a,completedTrials:a.length,model:l??null},completedAt:new Date(n())}).where(s(t.id,e.id)),{status:"completed",requestedTrials:e.trials,completedTrials:a.length,significant:o.significant,delta:o.delta}}catch(o){let i=o instanceof Error?o.message:String(o);return await r.update(t).set({status:"failed",error:i.slice(0,500),completedAt:new Date(n())}).where(s(t.id,e.id)),{status:"failed",requestedTrials:e.trials,completedTrials:a.length}}}f(q,"processMemoryAb");export{q as a};
1
+ import{e as u,f as t,j as x}from"./chunk-QH6X6VOT.js";import{a as E}from"./chunk-5BMBVTAE.js";import{a as P}from"./chunk-QH7VY5HJ.js";import{a as f}from"./chunk-ZLLER3HP.js";import{eq as s}from"drizzle-orm";import{buildControlledVerdict as M}from"@rulemetric/effectiveness";var A=f(m=>m.summary.pass_rate>=1?1:0,"fullPassScore");async function q(m,d={}){let r=d.db??x(),w=d.executeEval??P,y=d.grade??E,n=d.now??Date.now,[e]=await r.select().from(t).where(s(t.id,m.experimentId)).limit(1);if(!e)return{skipped:"not_found"};if(e.status==="completed"||e.status==="failed")return{skipped:"already_terminal",status:e.status};let[g]=await r.select({body:u.body}).from(u).where(s(u.id,e.memoryId)).limit(1);if(!g)return await r.update(t).set({status:"failed",error:"memory no longer exists",completedAt:new Date(n())}).where(s(t.id,e.id)),{skipped:"memory_gone",status:"failed"};await r.update(t).set({status:"running",startedAt:new Date(n())}).where(s(t.id,e.id));let b=e.expectations??[],l=e.model??void 0,a=[],h=0;try{for(let i=0;i<e.trials;i++){let c=await w({prompt:e.taskPrompt,targetContent:g.body,model:l}),p=await w({prompt:e.taskPrompt,model:l});if(c.error||p.error){h++;continue}let[v,D]=await Promise.all([y({prompt:e.taskPrompt,output:c.output,expectations:b,model:l}),y({prompt:e.taskPrompt,output:p.output,expectations:b,model:l})]);a.push({withScore:A(v),withoutScore:A(D),withLatency:c.durationMs/1e3,withoutLatency:p.durationMs/1e3})}if(a.length===0){let i=`no trials completed (${h}/${e.trials} runs errored \u2014 is the claude CLI available?)`;return await r.update(t).set({status:"failed",error:i,completedAt:new Date(n())}).where(s(t.id,e.id)),{status:"failed",requestedTrials:e.trials,completedTrials:0}}let o=M(a);return await r.update(t).set({status:"completed",result:{verdict:o,pairs:a,completedTrials:a.length,model:l??null},completedAt:new Date(n())}).where(s(t.id,e.id)),{status:"completed",requestedTrials:e.trials,completedTrials:a.length,significant:o.significant,delta:o.delta}}catch(o){let i=o instanceof Error?o.message:String(o);return await r.update(t).set({status:"failed",error:i.slice(0,500),completedAt:new Date(n())}).where(s(t.id,e.id)),{status:"failed",requestedTrials:e.trials,completedTrials:a.length}}}f(q,"processMemoryAb");export{q as a};
@@ -1 +1 @@
1
- import{c as m,d as p}from"./chunk-ZL4MZMUK.js";import{a as C}from"./chunk-N7TGRFVZ.js";import{g as c,j as f}from"./chunk-MTB4DSSX.js";import{a as r}from"./chunk-ZLLER3HP.js";import*as a from"node:fs/promises";import*as g from"node:path";import{eq as b}from"drizzle-orm";async function v(e){let n=e;for(let t=0;t<50;t++){try{return await a.stat(g.join(n,"pnpm-workspace.yaml")),n}catch{}let i=g.dirname(n);if(i===n)return null;n=i}return null}r(v,"findRepoRoot");async function k(e){if(e)try{return await a.readFile(e,"utf-8")}catch{return null}let n=await v(process.cwd())??process.cwd(),t=g.join(n,"CHANGELOG.md");try{return await a.readFile(t,"utf-8")}catch{return null}}r(k,"readChangelog");var _="https://rulemetric.com";function D(e){let n=e.date??new Date().toISOString().slice(0,10),t=C({version:e.version,date:n,sections:e.sections,unsubscribeUrl:"{{unsubscribe_url}}",recipientName:"{{recipient_name}}",productUrl:_});return{version:e.version,releaseDate:n,subject:t.subject,htmlBody:t.html,textBody:t.text,sections:e.sections}}r(D,"renderRow");async function R(e={}){let n=e.db??f(),t=e.logger??{info:r(s=>console.log(s),"info"),warn:r(s=>console.warn(s),"warn")},i=await k(e.changelogPath);if(i===null)return t.info("[cron_check_changelog] CHANGELOG.md not found; nothing to do"),{createdCount:0,skippedCount:0};let y=m(i),h=p(y);if(h.length===0)return t.info("[cron_check_changelog] No announceable entries; nothing to do"),{createdCount:0,skippedCount:0};let d=0,l=0;for(let s of h){if((await n.select({id:c.id}).from(c).where(b(c.version,s.version)).limit(1)).length>0){l++;continue}let o=D(s);try{await n.insert(c).values({version:o.version,releaseDate:o.releaseDate,subject:o.subject,htmlBody:o.htmlBody,textBody:o.textBody,sections:o.sections,status:"draft"}),d++,t.info(`[cron_check_changelog] Created draft announcement for ${o.version}`)}catch(u){let w=u instanceof Error?u.message:String(u);if(/duplicate key|unique/i.test(w)){l++;continue}throw u}}return t.info(`[cron_check_changelog] Done: created ${d}, skipped ${l}`),{createdCount:d,skippedCount:l}}r(R,"processChangelog");export{R as a};
1
+ import{a as C}from"./chunk-N7TGRFVZ.js";import{c as m,d as p}from"./chunk-ZL4MZMUK.js";import{g as c,j as f}from"./chunk-QH6X6VOT.js";import{a as r}from"./chunk-ZLLER3HP.js";import*as a from"node:fs/promises";import*as g from"node:path";import{eq as b}from"drizzle-orm";async function v(e){let n=e;for(let t=0;t<50;t++){try{return await a.stat(g.join(n,"pnpm-workspace.yaml")),n}catch{}let i=g.dirname(n);if(i===n)return null;n=i}return null}r(v,"findRepoRoot");async function k(e){if(e)try{return await a.readFile(e,"utf-8")}catch{return null}let n=await v(process.cwd())??process.cwd(),t=g.join(n,"CHANGELOG.md");try{return await a.readFile(t,"utf-8")}catch{return null}}r(k,"readChangelog");var _="https://rulemetric.com";function D(e){let n=e.date??new Date().toISOString().slice(0,10),t=C({version:e.version,date:n,sections:e.sections,unsubscribeUrl:"{{unsubscribe_url}}",recipientName:"{{recipient_name}}",productUrl:_});return{version:e.version,releaseDate:n,subject:t.subject,htmlBody:t.html,textBody:t.text,sections:e.sections}}r(D,"renderRow");async function R(e={}){let n=e.db??f(),t=e.logger??{info:r(s=>console.log(s),"info"),warn:r(s=>console.warn(s),"warn")},i=await k(e.changelogPath);if(i===null)return t.info("[cron_check_changelog] CHANGELOG.md not found; nothing to do"),{createdCount:0,skippedCount:0};let y=m(i),h=p(y);if(h.length===0)return t.info("[cron_check_changelog] No announceable entries; nothing to do"),{createdCount:0,skippedCount:0};let d=0,l=0;for(let s of h){if((await n.select({id:c.id}).from(c).where(b(c.version,s.version)).limit(1)).length>0){l++;continue}let o=D(s);try{await n.insert(c).values({version:o.version,releaseDate:o.releaseDate,subject:o.subject,htmlBody:o.htmlBody,textBody:o.textBody,sections:o.sections,status:"draft"}),d++,t.info(`[cron_check_changelog] Created draft announcement for ${o.version}`)}catch(u){let w=u instanceof Error?u.message:String(u);if(/duplicate key|unique/i.test(w)){l++;continue}throw u}}return t.info(`[cron_check_changelog] Done: created ${d}, skipped ${l}`),{createdCount:d,skippedCount:l}}r(R,"processChangelog");export{R as a};
@@ -1 +1 @@
1
- import{d as j,f as y}from"./chunk-RTWRHIKY.js";import{b as R}from"./chunk-ZL4MZMUK.js";import{a as S}from"./chunk-TDD7IOV2.js";import{a as p}from"./chunk-MODXEGCU.js";import{e as i,f as l}from"./chunk-H2ORWIEY.js";import{a as g}from"./chunk-ZLLER3HP.js";import{readFileSync as b}from"node:fs";import E from"node:path";import $ from"node:os";var N=5,L=Number(process.env.RULEMETRIC_MAX_SUGGESTION_PROJECTS??10),T=48,M=.5,k=400;async function O(){let d=E.join($.homedir(),".config","rulemetric","skills-registry.json");try{let o=b(d,"utf-8"),s=JSON.parse(o);return Date.now()-new Date(s.generatedAt).getTime()>T*60*60*1e3}catch{return!0}}g(O,"checkSkillsRegistryStale");var X=g(async(d,o)=>{let s=j();if(s==="none"){o.logger.warn("No LLM backend available (claude CLI missing and ANTHROPIC_API_KEY unset); skipping suggestion compute");return}o.logger.info(`Scoring backend: ${s}`);let r;try{r=(await i("/api/sessions/project-paths?limit="+L)).projectPaths}catch(e){o.logger.warn(`Failed to fetch project paths: ${e instanceof Error?e.message:String(e)}`);return}if(r.length===0){o.logger.info("No recent project paths; nothing to score");return}let m=new Map;try{let e=await i("/api/projects?limit=200");for(let t of e.projects??[])t.primaryCheckoutPath&&m.set(p(t.primaryCheckoutPath),t.id)}catch(e){o.logger.warn(`Failed to fetch projects for id resolution: ${e instanceof Error?e.message:String(e)}`)}let a=new Map;try{let e=await i("/api/catalog?limit=200");for(let t of e)a.set(t.id,{id:t.id,name:t.name,description:t.description??"",tags:t.tags??[],contentPreview:(t.content??"").slice(0,k)})}catch(e){o.logger.warn(`Failed to fetch catalog: ${e instanceof Error?e.message:String(e)}`)}try{let e=await i("/api/instructions?limit=100");for(let t of e.instructions??[])a.has(t.id)||a.set(t.id,{id:t.id,name:t.name,description:t.description??"",tags:t.tags??[],contentPreview:(t.content??"").slice(0,k)})}catch(e){o.logger.warn(`Failed to fetch personal instructions: ${e instanceof Error?e.message:String(e)}`)}let c=[...a.values()];if(c.length===0){o.logger.info("No candidate instructions; nothing to score");return}o.logger.info(`Scoring ${c.length} candidates across ${r.length} project(s)`);let u=0;for(let e of r)try{let t=p(e),f=S(t);if(f.length===0){o.logger.info(`Skipping ${t}: insufficient language signals`);continue}let C={name:E.basename(t),description:null,languages:f,topics:[],dependencies:[]},I=R(C,c),w=await y(I,"",4096);if(!w){o.logger.warn(`LLM returned null for ${t} (backend ${s})`);continue}let P=(w.recommendations??[]).filter(n=>typeof n.instructionId=="string"&&typeof n.score=="number"&&typeof n.reason=="string").map(n=>({instructionId:n.instructionId,score:n.score,reason:n.reason})).filter(n=>n.score>=M).sort((n,_)=>_.score-n.score).slice(0,N);if(P.length===0){o.logger.info(`No suggestions over threshold for ${t}`);continue}let h=m.get(t);await l("/api/instruction-suggestions/batch-upsert",{projectPath:t,...h?{projectId:h}:{},suggestions:P.map(n=>({instructionId:n.instructionId,score:n.score,reason:n.reason}))}),u++}catch(t){o.logger.warn(`Failed to score ${e}: ${t instanceof Error?t.message:String(t)}`)}if(await O())try{await l("/api/instruction-suggestions/mark-stale",{}),o.logger.warn("Skills registry is stale (>48h); marked all suggestions stale")}catch{}o.logger.info(`Done: scored ${u}/${r.length} projects`)},"cronSuggestInstructions");export{X as a};
1
+ import{b as R}from"./chunk-ZL4MZMUK.js";import{d as j,f as y}from"./chunk-RTWRHIKY.js";import{a as S}from"./chunk-TDD7IOV2.js";import{a as p}from"./chunk-MODXEGCU.js";import{e as i,f as l}from"./chunk-H2ORWIEY.js";import{a as g}from"./chunk-ZLLER3HP.js";import{readFileSync as b}from"node:fs";import E from"node:path";import $ from"node:os";var N=5,L=Number(process.env.RULEMETRIC_MAX_SUGGESTION_PROJECTS??10),T=48,M=.5,k=400;async function O(){let d=E.join($.homedir(),".config","rulemetric","skills-registry.json");try{let o=b(d,"utf-8"),s=JSON.parse(o);return Date.now()-new Date(s.generatedAt).getTime()>T*60*60*1e3}catch{return!0}}g(O,"checkSkillsRegistryStale");var X=g(async(d,o)=>{let s=j();if(s==="none"){o.logger.warn("No LLM backend available (claude CLI missing and ANTHROPIC_API_KEY unset); skipping suggestion compute");return}o.logger.info(`Scoring backend: ${s}`);let r;try{r=(await i("/api/sessions/project-paths?limit="+L)).projectPaths}catch(e){o.logger.warn(`Failed to fetch project paths: ${e instanceof Error?e.message:String(e)}`);return}if(r.length===0){o.logger.info("No recent project paths; nothing to score");return}let m=new Map;try{let e=await i("/api/projects?limit=200");for(let t of e.projects??[])t.primaryCheckoutPath&&m.set(p(t.primaryCheckoutPath),t.id)}catch(e){o.logger.warn(`Failed to fetch projects for id resolution: ${e instanceof Error?e.message:String(e)}`)}let a=new Map;try{let e=await i("/api/catalog?limit=200");for(let t of e)a.set(t.id,{id:t.id,name:t.name,description:t.description??"",tags:t.tags??[],contentPreview:(t.content??"").slice(0,k)})}catch(e){o.logger.warn(`Failed to fetch catalog: ${e instanceof Error?e.message:String(e)}`)}try{let e=await i("/api/instructions?limit=100");for(let t of e.instructions??[])a.has(t.id)||a.set(t.id,{id:t.id,name:t.name,description:t.description??"",tags:t.tags??[],contentPreview:(t.content??"").slice(0,k)})}catch(e){o.logger.warn(`Failed to fetch personal instructions: ${e instanceof Error?e.message:String(e)}`)}let c=[...a.values()];if(c.length===0){o.logger.info("No candidate instructions; nothing to score");return}o.logger.info(`Scoring ${c.length} candidates across ${r.length} project(s)`);let u=0;for(let e of r)try{let t=p(e),f=S(t);if(f.length===0){o.logger.info(`Skipping ${t}: insufficient language signals`);continue}let C={name:E.basename(t),description:null,languages:f,topics:[],dependencies:[]},I=R(C,c),w=await y(I,"",4096);if(!w){o.logger.warn(`LLM returned null for ${t} (backend ${s})`);continue}let P=(w.recommendations??[]).filter(n=>typeof n.instructionId=="string"&&typeof n.score=="number"&&typeof n.reason=="string").map(n=>({instructionId:n.instructionId,score:n.score,reason:n.reason})).filter(n=>n.score>=M).sort((n,_)=>_.score-n.score).slice(0,N);if(P.length===0){o.logger.info(`No suggestions over threshold for ${t}`);continue}let h=m.get(t);await l("/api/instruction-suggestions/batch-upsert",{projectPath:t,...h?{projectId:h}:{},suggestions:P.map(n=>({instructionId:n.instructionId,score:n.score,reason:n.reason}))}),u++}catch(t){o.logger.warn(`Failed to score ${e}: ${t instanceof Error?t.message:String(t)}`)}if(await O())try{await l("/api/instruction-suggestions/mark-stale",{}),o.logger.warn("Skills registry is stale (>48h); marked all suggestions stale")}catch{}o.logger.info(`Done: scored ${u}/${r.length} projects`)},"cronSuggestInstructions");export{X as a};
@@ -1,2 +1,2 @@
1
- import{c as R}from"./chunk-6QKI756T.js";import{a as P}from"./chunk-5RBLIVBF.js";import{b as s,c as r,j}from"./chunk-MTB4DSSX.js";import{a as g}from"./chunk-ZLLER3HP.js";import{and as y,eq as l,isNotNull as I}from"drizzle-orm";async function O($,p={}){let k=p.db??j(),b=p.removeWorktreeFn??R,n=p.log??(e=>process.stderr.write(`[process_run_cleanup] ${e}
1
+ import{c as R}from"./chunk-6QKI756T.js";import{a as P}from"./chunk-5RBLIVBF.js";import{b as s,c as r,j}from"./chunk-QH6X6VOT.js";import{a as g}from"./chunk-ZLLER3HP.js";import{and as y,eq as l,isNotNull as I}from"drizzle-orm";async function O($,p={}){let k=p.db??j(),b=p.removeWorktreeFn??R,n=p.log??(e=>process.stderr.write(`[process_run_cleanup] ${e}
2
2
  `)),{runId:t}=$,[i]=await k.select({id:s.id,userId:s.userId,projectPath:s.projectPath}).from(s).where(l(s.id,t)).limit(1);if(!i)throw new P(`Run ${t} not found`);if(!i.projectPath)throw new P(`Run ${t} has no projectPath; cannot resolve a repo root for worktree cleanup`);let c=i.projectPath,v=await k.select({id:r.id,projectPath:r.projectPath}).from(r).where(y(l(r.runId,t),l(r.userId,i.userId),I(r.endedAt))),a=[],u=0,d=0,h=0,m=0,w=new Set;for(let e of v)if(!(!e.projectPath||e.projectPath===c)&&!w.has(e.projectPath)){w.add(e.projectPath);try{let o=await b({repoRoot:c,worktreePath:e.projectPath});o.removed?(u++,a.push({sessionId:e.id,worktreePath:e.projectPath,status:"removed"}),n(`removed worktree ${e.projectPath} (session ${e.id})`)):o.reason==="dirty"?(d++,a.push({sessionId:e.id,worktreePath:e.projectPath,status:"skipped-dirty"}),n(`skipped dirty worktree ${e.projectPath} (session ${e.id}) \u2014 uncommitted changes`)):(h++,a.push({sessionId:e.id,worktreePath:e.projectPath,status:"absent"}),n(`worktree absent ${e.projectPath} (session ${e.id})`))}catch(o){let f=o instanceof Error?o.message:String(o);m++,a.push({sessionId:e.id,worktreePath:e.projectPath,status:"error",error:f.slice(0,1e3)}),n(`error removing worktree ${e.projectPath} (session ${e.id}): ${f}`)}}return n(`run ${t} cleanup: removed=${u} skippedDirty=${d} absent=${h} errored=${m}`),{runId:t,repoRoot:c,removed:u,skippedDirty:d,absent:h,errored:m,worktrees:a}}g(O,"processRunCleanup");export{O as a};
@@ -0,0 +1 @@
1
+ import{a as m,c as pr}from"./chunk-ZLLER3HP.js";import{boolean as Io,pgTable as _r,text as Qe,timestamp as jt,uuid as To}from"drizzle-orm/pg-core";import{pgTable as Ye,text as te,timestamp as we,jsonb as ho,uuid as F,primaryKey as yo}from"drizzle-orm/pg-core";var u=Ye("organizations",{id:F("id").primaryKey().defaultRandom(),name:te("name").unique().notNull(),slug:te("slug").unique().notNull(),metadata:ho("metadata"),createdAt:we("created_at",{withTimezone:!0}).defaultNow(),updatedAt:we("updated_at",{withTimezone:!0}).defaultNow()}),N=Ye("teams",{id:F("id").primaryKey().defaultRandom(),orgId:F("org_id").references(()=>u.id,{onDelete:"cascade"}),name:te("name").notNull(),slug:te("slug").notNull(),metadata:ho("metadata"),createdAt:we("created_at",{withTimezone:!0}).defaultNow()}),oe=Ye("user_organizations",{userId:F("user_id").notNull(),orgId:F("org_id").references(()=>u.id,{onDelete:"cascade"}).notNull(),role:te("role").notNull().default("member"),createdAt:we("created_at",{withTimezone:!0}).defaultNow()},e=>[yo({columns:[e.userId,e.orgId]})]),ne=Ye("user_teams",{userId:F("user_id").notNull(),teamId:F("team_id").references(()=>N.id,{onDelete:"cascade"}).notNull(),role:te("role").notNull().default("member"),createdAt:we("created_at",{withTimezone:!0}).defaultNow()},e=>[yo({columns:[e.userId,e.teamId]})]);var o=_r("profiles",{id:To("id").primaryKey(),email:Qe("email"),displayName:Qe("display_name"),activeOrgId:To("active_org_id").references(()=>u.id,{onDelete:"set null"}),isSuperadmin:Io("is_superadmin").notNull().default(!1),claudeCodePlan:Qe("claude_code_plan"),planSource:Qe("plan_source").notNull().default("detected"),setupCompletedAt:jt("setup_completed_at",{withTimezone:!0}),liveSendSkipped:Io("live_send_skipped").notNull().default(!1),createdAt:jt("created_at",{withTimezone:!0}).defaultNow(),updatedAt:jt("updated_at",{withTimezone:!0}).defaultNow()});import{pgTable as vr,text as se,timestamp as St,jsonb as bo,uuid as $e,integer as hr,boolean as yr,index as Kt}from"drizzle-orm/pg-core";import{boolean as xr,jsonb as Nr,pgTable as Et,primaryKey as zo,text as G,timestamp as ze,uniqueIndex as kt,uuid as J}from"drizzle-orm/pg-core";import{sql as gr}from"drizzle-orm";import{pgTable as wo,text as x,timestamp as Ae,jsonb as Xe,uuid as P,integer as Rt,boolean as fr,uniqueIndex as Ao,index as We}from"drizzle-orm/pg-core";var r=wo("instructions",{id:P("id").primaryKey().defaultRandom(),name:x("name").notNull(),description:x("description").notNull(),type:x("type").notNull().default("instruction"),scope:x("scope").notNull(),scopeRef:P("scope_ref"),version:x("version").notNull(),content:x("content").notNull(),frontmatter:Xe("frontmatter").notNull(),slots:Xe("slots"),tags:x("tags").array(),compatibility:x("compatibility").array(),createdBy:P("created_by"),createdAt:Ae("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Ae("updated_at",{withTimezone:!0}).defaultNow(),archived:fr("archived").default(!1),archivedAt:Ae("archived_at",{withTimezone:!0}),archivedBy:P("archived_by"),forkedFromId:P("forked_from_id").references(()=>r.id,{onDelete:"set null"}),upstreamVersion:x("upstream_version"),badge:x("badge"),contentHash:x("content_hash"),contextIdentity:x("context_identity"),scanScore:Rt("scan_score"),scanFindings:Xe("scan_findings"),popularityScore:Rt("popularity_score"),sourceUpdatedAt:Ae("source_updated_at",{withTimezone:!0})},e=>[Ao("instructions_name_scope_ref_idx").on(e.name,e.scope,e.scopeRef),We("idx_instructions_scope").on(e.scope,e.scopeRef),We("idx_instructions_created_by").on(e.createdBy),We("idx_instructions_context_identity").on(e.createdBy,e.contextIdentity),We("idx_instructions_public_recency").on(e.scope,e.sourceUpdatedAt.desc())]),re=wo("instruction_versions",{id:P("id").primaryKey().defaultRandom(),instructionId:P("instruction_id").references(()=>r.id,{onDelete:"cascade"}),versionNumber:Rt("version_number").notNull(),content:x("content").notNull(),frontmatter:Xe("frontmatter").notNull(),changeSummary:x("change_summary"),createdBy:P("created_by"),createdAt:Ae("created_at",{withTimezone:!0}).defaultNow()},e=>[Ao("instruction_versions_instruction_version_idx").on(e.instructionId,e.versionNumber)]);var s=Et("projects",{id:J("id").primaryKey().defaultRandom(),orgId:J("org_id").references(()=>u.id,{onDelete:"cascade"}),name:G("name").notNull(),description:G("description"),githubRepo:G("github_repo"),gitRemoteUrl:G("git_remote_url"),gitRootCommit:G("git_root_commit"),gitRemoteAliases:G("git_remote_aliases").array().notNull().default([]),metadata:Nr("metadata"),createdBy:J("created_by"),createdAt:ze("created_at",{withTimezone:!0}).defaultNow(),updatedAt:ze("updated_at",{withTimezone:!0}).defaultNow()},e=>[kt("projects_org_name_idx").on(e.orgId,e.name),kt("projects_git_remote_url_unique").on(e.gitRemoteUrl).where(gr`${e.gitRemoteUrl} IS NOT NULL`)]),O=Et("project_instructions",{projectId:J("project_id").references(()=>s.id,{onDelete:"cascade"}).notNull(),instructionId:J("instruction_id").references(()=>r.id,{onDelete:"cascade"}).notNull(),addedAt:ze("added_at",{withTimezone:!0}).defaultNow(),addedBy:J("added_by")},e=>[zo({columns:[e.projectId,e.instructionId]})]),Do=Et("project_checkouts",{projectId:J("project_id").references(()=>s.id,{onDelete:"cascade"}).notNull(),path:G("path").notNull(),isWorktree:xr("is_worktree").notNull().default(!1),firstSeen:ze("first_seen",{withTimezone:!0}).notNull().defaultNow(),lastSeen:ze("last_seen",{withTimezone:!0}).notNull().defaultNow()},e=>[zo({columns:[e.projectId,e.path]}),kt("project_checkouts_path_unique").on(e.path)]);var f=vr("agent_runs",{id:$e("id").primaryKey().defaultRandom(),userId:$e("user_id").notNull().references(()=>o.id,{onDelete:"cascade"}),orgId:$e("org_id").references(()=>u.id,{onDelete:"set null"}),projectId:$e("project_id").references(()=>s.id,{onDelete:"set null"}),projectPath:se("project_path"),gitRemote:se("git_remote"),baseBranch:se("base_branch"),title:se("title"),prompt:se("prompt"),toolSpec:bo("tool_spec").notNull().default([]),autoWorktree:yr("auto_worktree").notNull().default(!0),status:se("status").notNull().default("pending"),sessionCount:hr("session_count").notNull().default(0),metadata:bo("metadata").notNull().default({}),createdAt:St("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:St("updated_at",{withTimezone:!0}).notNull().defaultNow(),completedAt:St("completed_at",{withTimezone:!0})},e=>[Kt("idx_agent_runs_user").on(e.userId),Kt("idx_agent_runs_org_created").on(e.orgId,e.createdAt),Kt("idx_agent_runs_project").on(e.projectId)]);import{pgTable as Pt,text as v,timestamp as De,jsonb as Y,uuid as b,integer as Ze,uniqueIndex as jo,index as z}from"drizzle-orm/pg-core";var d=Pt("sessions",{id:b("id").primaryKey().defaultRandom(),userId:b("user_id").notNull().references(()=>o.id,{onDelete:"cascade"}),externalSessionId:v("external_session_id"),projectId:b("project_id").references(()=>s.id,{onDelete:"set null"}),orgId:b("org_id").references(()=>u.id,{onDelete:"set null"}),tool:v("tool").notNull(),projectPath:v("project_path"),gitBranch:v("git_branch"),startedAt:De("started_at",{withTimezone:!0}).notNull(),endedAt:De("ended_at",{withTimezone:!0}),eventCount:Ze("event_count").default(0),tokenUsage:Y("token_usage"),analysis:Y("analysis"),analyzedAt:De("analyzed_at",{withTimezone:!0}),analyzedEventCount:Ze("analyzed_event_count"),analyzedTurnCount:Ze("analyzed_turn_count"),metadata:Y("metadata").default({}),origin:v("origin").notNull().default("unknown"),runId:b("run_id").references(()=>f.id,{onDelete:"set null"}),model:v("model"),harnessVersion:v("harness_version"),createdAt:De("created_at",{withTimezone:!0}).defaultNow()},e=>[z("idx_sessions_user").on(e.userId),z("idx_sessions_tool").on(e.tool),z("idx_sessions_started_at").on(e.startedAt),z("idx_sessions_project").on(e.projectId),z("idx_sessions_org_started_at").on(e.orgId,e.startedAt),z("idx_sessions_run").on(e.runId),jo("idx_sessions_user_external").on(e.userId,e.externalSessionId)]),ie=Pt("session_events",{id:b("id").primaryKey().defaultRandom(),sessionId:b("session_id").notNull().references(()=>d.id,{onDelete:"cascade"}),sequence:Ze("sequence").notNull(),eventType:v("event_type").notNull(),content:v("content"),toolName:v("tool_name"),toolInput:Y("tool_input"),toolOutput:Y("tool_output"),tokenUsage:Y("token_usage"),model:v("model"),timestamp:De("timestamp",{withTimezone:!0}).notNull(),metadata:Y("metadata").default({})},e=>[jo("session_events_session_sequence_idx").on(e.sessionId,e.sequence),z("idx_session_events_session_id").on(e.sessionId),z("idx_session_events_event_type").on(e.eventType),z("idx_session_events_model").on(e.model)]),C=Pt("session_instructions",{sessionId:b("session_id").notNull().references(()=>d.id,{onDelete:"cascade"}),instructionId:b("instruction_id").notNull().references(()=>r.id,{onDelete:"cascade"}),linkMethod:v("link_method").notNull()},e=>[z("idx_session_instructions_instruction_id").on(e.instructionId)]);import{pgTable as Ir,text as ae,timestamp as Ot,uuid as be,integer as Ro,index as et}from"drizzle-orm/pg-core";var h=Ir("memories",{id:be("id").primaryKey().defaultRandom(),userId:be("user_id").notNull().references(()=>o.id,{onDelete:"cascade"}),orgId:be("org_id"),projectId:be("project_id").references(()=>s.id,{onDelete:"set null"}),version:Ro("version").notNull().default(1),parentId:be("parent_id").references(()=>h.id,{onDelete:"set null"}),kind:ae("kind").notNull(),title:ae("title").notNull(),body:ae("body").notNull(),source:ae("source").notNull(),status:ae("status").notNull().default("active"),trustClass:ae("trust_class"),trustVersion:Ro("trust_version"),trustComputedAt:Ot("trust_computed_at",{withTimezone:!0}),createdAt:Ot("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:Ot("updated_at",{withTimezone:!0}).notNull().defaultNow()},e=>[et("idx_memories_user").on(e.userId),et("idx_memories_project").on(e.projectId),et("idx_memories_parent").on(e.parentId),et("idx_memories_user_status").on(e.userId,e.status)]);import{pgTable as Tr,text as je,timestamp as Ct,uuid as qt,integer as ko,jsonb as wr,index as Eo}from"drizzle-orm/pg-core";var So=Tr("memory_experiments",{id:qt("id").primaryKey().defaultRandom(),memoryId:qt("memory_id").notNull().references(()=>h.id,{onDelete:"cascade"}),userId:qt("user_id").notNull().references(()=>o.id,{onDelete:"cascade"}),memoryVersion:ko("memory_version").notNull().default(1),taskPrompt:je("task_prompt").notNull(),expectations:je("expectations").array().notNull().default([]),trials:ko("trials").notNull().default(10),model:je("model"),status:je("status").notNull().default("pending"),result:wr("result").$type(),error:je("error"),createdAt:Ct("created_at",{withTimezone:!0}).notNull().defaultNow(),startedAt:Ct("started_at",{withTimezone:!0}),completedAt:Ct("completed_at",{withTimezone:!0})},e=>[Eo("idx_memory_experiments_memory").on(e.memoryId),Eo("idx_memory_experiments_user").on(e.userId)]);import{boolean as Ar,date as zr,index as Mt,integer as Dr,jsonb as br,pgTable as Bt,text as w,timestamp as q,uniqueIndex as jr,uuid as de}from"drizzle-orm/pg-core";var Ko=Bt("announcements",{id:de("id").primaryKey().defaultRandom(),version:w("version").notNull().unique(),releaseDate:zr("release_date").notNull(),subject:w("subject").notNull(),htmlBody:w("html_body").notNull(),textBody:w("text_body").notNull(),sections:br("sections").notNull().default({}),status:w("status").notNull().default("draft"),recipientCount:Dr("recipient_count"),sentAt:q("sent_at",{withTimezone:!0}),sentBy:de("sent_by"),error:w("error"),createdAt:q("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:q("updated_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Mt("idx_announcements_status").on(e.status),Mt("idx_announcements_created").on(e.createdAt)]),Po=Bt("announcement_deliveries",{id:de("id").primaryKey().defaultRandom(),announcementId:de("announcement_id").notNull(),userId:de("user_id").notNull(),email:w("email").notNull(),status:w("status").notNull().default("pending"),providerId:w("provider_id"),error:w("error"),sentAt:q("sent_at",{withTimezone:!0}),createdAt:q("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[jr("uniq_announcement_deliveries_announcement_user").on(e.announcementId,e.userId),Mt("idx_announcement_deliveries_user").on(e.userId,e.createdAt)]),Oo=Bt("notification_preferences",{userId:de("user_id").primaryKey(),productAnnouncements:Ar("product_announcements").notNull().default(!0),unsubscribeToken:w("unsubscribe_token").notNull().unique(),unsubscribedAt:q("unsubscribed_at",{withTimezone:!0}),createdAt:q("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:q("updated_at",{withTimezone:!0}).notNull().defaultNow()});import{pgTable as Rr,text as Lt,timestamp as tt,uuid as ot,index as Co}from"drizzle-orm/pg-core";var j=Rr("org_invitations",{id:ot("id").primaryKey().defaultRandom(),orgId:ot("org_id").notNull().references(()=>u.id,{onDelete:"cascade"}),email:Lt("email").notNull(),role:Lt("role").notNull().default("member"),teamId:ot("team_id").references(()=>N.id,{onDelete:"set null"}),invitedBy:ot("invited_by").notNull().references(()=>o.id),token:Lt("token").notNull().unique(),expiresAt:tt("expires_at",{withTimezone:!0}).notNull(),acceptedAt:tt("accepted_at",{withTimezone:!0}),revokedAt:tt("revoked_at",{withTimezone:!0}),createdAt:tt("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Co("idx_org_invitations_token").on(e.token),Co("idx_org_invitations_org").on(e.orgId)]);import{pgTable as kr,text as Er,timestamp as Sr,jsonb as Kr,uuid as Ut,index as qo}from"drizzle-orm/pg-core";var ue=kr("instruction_events",{id:Ut("id").primaryKey().defaultRandom(),instructionId:Ut("instruction_id").notNull().references(()=>r.id,{onDelete:"cascade"}),eventType:Er("event_type").notNull(),actorId:Ut("actor_id").notNull(),metadata:Kr("metadata"),createdAt:Sr("created_at",{withTimezone:!0}).defaultNow()},e=>[qo("idx_instruction_events_instruction").on(e.instructionId),qo("idx_instruction_events_type").on(e.eventType)]);import{pgTable as Mo,text as nt,timestamp as Bo,uuid as D,integer as Lo,index as le,unique as Pr}from"drizzle-orm/pg-core";var R=Mo("treatment_assignments",{id:D("id").primaryKey().defaultRandom(),userId:D("user_id").notNull().references(()=>o.id,{onDelete:"cascade"}),treatmentType:nt("treatment_type").notNull(),treatmentId:D("treatment_id").notNull(),treatmentVersion:Lo("treatment_version").notNull().default(1),projectId:D("project_id").references(()=>s.id,{onDelete:"set null"}),assignedBy:D("assigned_by").references(()=>o.id,{onDelete:"set null"}),method:nt("method").notNull(),assignedAt:Bo("assigned_at",{withTimezone:!0}).notNull().defaultNow()},e=>[le("idx_treatment_assignments_user").on(e.userId),le("idx_treatment_assignments_treatment").on(e.treatmentType,e.treatmentId),le("idx_treatment_assignments_project").on(e.projectId)]),k=Mo("treatment_exposures",{id:D("id").primaryKey().defaultRandom(),sessionId:D("session_id").notNull().references(()=>d.id,{onDelete:"cascade"}),userId:D("user_id").notNull().references(()=>o.id,{onDelete:"cascade"}),treatmentType:nt("treatment_type").notNull(),treatmentId:D("treatment_id").notNull(),treatmentVersion:Lo("treatment_version").notNull().default(1),assignmentId:D("assignment_id").references(()=>R.id,{onDelete:"set null"}),method:nt("method").notNull(),exposedAt:Bo("exposed_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Pr("treatment_exposures_unique").on(e.sessionId,e.treatmentType,e.treatmentId,e.treatmentVersion),le("idx_treatment_exposures_treatment").on(e.treatmentType,e.treatmentId),le("idx_treatment_exposures_user").on(e.userId),le("idx_treatment_exposures_session").on(e.sessionId)]);import{pgTable as Or,text as Vt,timestamp as Cr,uuid as rt,integer as qr,index as Uo,uniqueIndex as Mr}from"drizzle-orm/pg-core";var Vo=Or("pending_treatment_exposures",{id:rt("id").primaryKey().defaultRandom(),userId:rt("user_id").notNull().references(()=>o.id,{onDelete:"cascade"}),externalSessionId:Vt("external_session_id").notNull(),treatmentType:Vt("treatment_type").notNull(),treatmentId:rt("treatment_id").notNull(),treatmentVersion:qr("treatment_version").notNull().default(1),method:Vt("method").notNull().default("injected"),projectId:rt("project_id").references(()=>s.id,{onDelete:"set null"}),createdAt:Cr("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Mr("pending_treatment_exposures_unique").on(e.externalSessionId,e.treatmentType,e.treatmentId,e.treatmentVersion),Uo("idx_pending_treatment_exposures_ext").on(e.externalSessionId),Uo("idx_pending_treatment_exposures_user").on(e.userId)]);import{pgTable as Br,text as ce,timestamp as Ht,uuid as Ft,jsonb as Lr,uniqueIndex as Ur,index as Ho}from"drizzle-orm/pg-core";var st=Br("session_terminal_targets",{id:Ft("id").primaryKey().defaultRandom(),userId:Ft("user_id").notNull().references(()=>o.id,{onDelete:"cascade"}),sessionId:Ft("session_id").references(()=>d.id,{onDelete:"set null"}),externalSessionId:ce("external_session_id"),kind:ce("kind").notNull(),target:ce("target").notNull(),status:ce("status").notNull().default("active"),attachCommand:ce("attach_command").notNull(),projectPath:ce("project_path"),metadata:Lr("metadata").notNull().default({}),lastSeenAt:Ht("last_seen_at",{withTimezone:!0}).defaultNow(),createdAt:Ht("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Ht("updated_at",{withTimezone:!0}).defaultNow()},e=>[Ur("idx_session_terminal_targets_user_target").on(e.userId,e.target),Ho("idx_session_terminal_targets_session").on(e.sessionId),Ho("idx_session_terminal_targets_user_status").on(e.userId,e.status)]);import{boolean as Vr,index as it,jsonb as Fo,pgTable as Hr,text as Q,timestamp as Re,uuid as at,integer as Fr}from"drizzle-orm/pg-core";var Go=Hr("session_send_jobs",{id:at("id").primaryKey().defaultRandom(),userId:at("user_id").notNull(),sessionId:at("session_id").notNull().references(()=>d.id,{onDelete:"cascade"}),terminalTargetId:at("terminal_target_id").references(()=>st.id,{onDelete:"set null"}),target:Q("target").notNull(),message:Q("message").notNull(),submit:Vr("submit").notNull().default(!0),delivery:Q("delivery").notNull().default("live"),status:Q("status").notNull().default("pending"),result:Fo("result"),error:Q("error"),attempts:Fr("attempts").notNull().default(0),taskKind:Q("task_kind"),payload:Fo("payload"),claimedBy:Q("claimed_by"),claimedAt:Re("claimed_at",{withTimezone:!0}),leaseExpiresAt:Re("lease_expires_at",{withTimezone:!0}),createdAt:Re("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Re("updated_at",{withTimezone:!0}).defaultNow(),completedAt:Re("completed_at",{withTimezone:!0})},e=>[it("idx_session_send_jobs_user").on(e.userId),it("idx_session_send_jobs_session").on(e.sessionId),it("idx_session_send_jobs_status").on(e.status),it("idx_session_send_jobs_pending").on(e.userId,e.status)]);import{pgTable as Yo,text as W,timestamp as dt,jsonb as Qo,uuid as M,integer as Gr,boolean as Jr,uniqueIndex as Yr,index as Jo,primaryKey as Qr}from"drizzle-orm/pg-core";var A=Yo("packs",{id:M("id").primaryKey().defaultRandom(),name:W("name").notNull(),description:W("description").notNull(),scope:W("scope").notNull(),scopeRef:M("scope_ref"),version:W("version").notNull().default("1.0.0"),tags:W("tags").array(),badge:W("badge"),metadata:Qo("metadata"),createdBy:M("created_by"),createdAt:dt("created_at",{withTimezone:!0}).defaultNow(),updatedAt:dt("updated_at",{withTimezone:!0}).defaultNow(),archived:Jr("archived").default(!1),archivedAt:dt("archived_at",{withTimezone:!0}),archivedBy:M("archived_by"),forkedFromId:M("forked_from_id").references(()=>A.id,{onDelete:"set null"}),upstreamVersion:W("upstream_version")},e=>[Yr("packs_name_scope_ref_idx").on(e.name,e.scope,e.scopeRef),Jo("idx_packs_scope").on(e.scope,e.scopeRef),Jo("idx_packs_created_by").on(e.createdBy)]),B=Yo("pack_instructions",{packId:M("pack_id").references(()=>A.id,{onDelete:"cascade"}).notNull(),instructionId:M("instruction_id").references(()=>r.id,{onDelete:"cascade"}).notNull(),position:Gr("position").notNull().default(0),slotOverrides:Qo("slot_overrides"),addedAt:dt("added_at",{withTimezone:!0}).defaultNow(),addedBy:M("added_by")},e=>[Qr({columns:[e.packId,e.instructionId]})]);import{pgTable as Wr,text as Gt,timestamp as Xr,jsonb as $r,uuid as Jt,index as me}from"drizzle-orm/pg-core";var pe=Wr("instruction_usage_events",{id:Jt("id").primaryKey().defaultRandom(),instructionId:Jt("instruction_id").references(()=>r.id,{onDelete:"set null"}),userId:Jt("user_id").notNull(),surface:Gt("surface").notNull(),action:Gt("action").notNull(),metadata:$r("metadata"),traceId:Gt("trace_id"),createdAt:Xr("created_at",{withTimezone:!0}).defaultNow()},e=>[me("idx_usage_events_instruction").on(e.instructionId),me("idx_usage_events_user").on(e.userId),me("idx_usage_events_surface").on(e.surface),me("idx_usage_events_action").on(e.action),me("idx_usage_events_created_at").on(e.createdAt),me("idx_usage_events_user_created").on(e.userId,e.createdAt)]);import{pgTable as Zr,text as ut,timestamp as Wo,jsonb as es,uuid as Xo,index as Yt}from"drizzle-orm/pg-core";var $o=Zr("worker_connections",{id:Xo("id").primaryKey().defaultRandom(),userId:Xo("user_id").notNull(),workerType:ut("worker_type").notNull().default("mcp"),clientName:ut("client_name").notNull(),clientVersion:ut("client_version"),workerVersion:ut("worker_version"),lastHeartbeat:Wo("last_heartbeat",{withTimezone:!0}).notNull().defaultNow(),connectedAt:Wo("connected_at",{withTimezone:!0}).notNull().defaultNow(),metadata:es("metadata")},e=>[Yt("idx_worker_connections_user").on(e.userId),Yt("idx_worker_connections_heartbeat").on(e.userId,e.lastHeartbeat),Yt("idx_worker_connections_type").on(e.userId,e.workerType)]);import{pgTable as ts,text as lt,timestamp as os,jsonb as ns,uuid as Zo,index as en}from"drizzle-orm/pg-core";var tn=ts("cli_setup_events",{id:Zo("id").primaryKey().defaultRandom(),userId:Zo("user_id").notNull(),deviceId:lt("device_id").notNull(),event:lt("event").notNull(),cliVersion:lt("cli_version"),os:lt("os"),props:ns("props").notNull().default({}),createdAt:os("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[en("idx_cli_setup_events_user").on(e.userId,e.createdAt),en("idx_cli_setup_events_device").on(e.deviceId,e.createdAt)]);import{pgTable as rs,text as X,integer as ss,boolean as is,timestamp as as,jsonb as ds,uuid as us,index as on}from"drizzle-orm/pg-core";var nn=rs("cli_error_events",{id:us("id").primaryKey().defaultRandom(),deviceId:X("device_id"),event:X("event").notNull(),command:X("command"),statusCode:ss("status_code"),message:X("message"),cliVersion:X("cli_version"),os:X("os"),nodeVersion:X("node_version"),proxied:is("proxied"),props:ds("props").notNull().default({}),createdAt:as("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[on("idx_cli_error_events_created").on(e.createdAt),on("idx_cli_error_events_device").on(e.deviceId,e.createdAt)]);import{pgTable as ke,text as y,timestamp as Z,jsonb as I,uuid as _,integer as $,boolean as ls,index as T}from"drizzle-orm/pg-core";var n=ke("eval_targets",{id:_("id").primaryKey().defaultRandom(),userId:_("user_id").notNull(),name:y("name").notNull(),type:y("type").notNull(),content:y("content").notNull(),description:y("description").notNull().default(""),metadata:I("metadata").notNull().default({}),version:$("version").notNull().default(1),parentId:_("parent_id").references(()=>n.id,{onDelete:"set null"}),createdAt:Z("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Z("updated_at",{withTimezone:!0}).defaultNow()},e=>[T("eval_targets_name_user_idx").on(e.name,e.userId),T("idx_eval_targets_user").on(e.userId),T("idx_eval_targets_type").on(e.type),T("idx_eval_targets_parent").on(e.parentId)]),E=ke("evals",{id:_("id").primaryKey().defaultRandom(),evalTargetId:_("eval_target_id").notNull().references(()=>n.id,{onDelete:"cascade"}),name:y("name").notNull(),prompt:y("prompt").notNull(),expectedOutput:y("expected_output").notNull().default(""),files:I("files").notNull().default([]),expectations:I("expectations").notNull().default([]),createdAt:Z("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Z("updated_at",{withTimezone:!0}).defaultNow()},e=>[T("idx_evals_target").on(e.evalTargetId)]),L=ke("eval_runs",{id:_("id").primaryKey().defaultRandom(),jobId:_("job_id"),evalId:_("eval_id").notNull().references(()=>E.id,{onDelete:"cascade"}),evalTargetId:_("eval_target_id").notNull().references(()=>n.id,{onDelete:"cascade"}),evalTargetVersion:$("eval_target_version").notNull(),configuration:y("configuration").notNull(),runNumber:$("run_number").notNull().default(1),iteration:$("iteration").notNull().default(1),status:y("status").notNull().default("completed"),outputs:I("outputs").notNull().default({}),timing:I("timing").notNull().default({}),grading:I("grading").notNull().default({}),comparison:I("comparison"),createdAt:Z("created_at",{withTimezone:!0}).defaultNow()},e=>[T("idx_eval_runs_eval").on(e.evalId),T("idx_eval_runs_target").on(e.evalTargetId),T("idx_eval_runs_iteration").on(e.evalTargetId,e.iteration)]),rn=ke("eval_comparisons",{id:_("id").primaryKey().defaultRandom(),userId:_("user_id").notNull(),targetAId:_("target_a_id").notNull().references(()=>n.id,{onDelete:"cascade"}),targetBId:_("target_b_id").notNull().references(()=>n.id,{onDelete:"cascade"}),targetAVersion:$("target_a_version").notNull(),targetBVersion:$("target_b_version").notNull(),isSwapped:ls("is_swapped").notNull().default(!1),winnerTargetId:_("winner_target_id").references(()=>n.id,{onDelete:"set null"}),perEval:I("per_eval").notNull().default([]),overall:I("overall").notNull().default({}),rawOutput:y("raw_output"),model:y("model"),status:y("status").notNull().default("completed"),createdAt:Z("created_at",{withTimezone:!0}).defaultNow()},e=>[T("idx_eval_comparisons_target_a").on(e.targetAId),T("idx_eval_comparisons_target_b").on(e.targetBId),T("idx_eval_comparisons_user").on(e.userId)]),_e=ke("benchmarks",{id:_("id").primaryKey().defaultRandom(),evalTargetId:_("eval_target_id").notNull().references(()=>n.id,{onDelete:"cascade"}),iteration:$("iteration").notNull().default(1),runSummary:I("run_summary").notNull().default({}),notes:I("notes").notNull().default([]),feedback:I("feedback"),createdAt:Z("created_at",{withTimezone:!0}).defaultNow()},e=>[T("idx_benchmarks_target").on(e.evalTargetId)]);import{pgTable as an,text as Qt,timestamp as Wt,jsonb as dn,uuid as fe,integer as Ee,index as ct,real as sn}from"drizzle-orm/pg-core";var xe=an("trigger_evals",{id:fe("id").primaryKey().defaultRandom(),evalTargetId:fe("eval_target_id").notNull().references(()=>n.id,{onDelete:"cascade"}),userId:fe("user_id").notNull(),queries:dn("queries").notNull().default([]),status:Qt("status").notNull().default("pending_review"),trainIndices:Ee("train_indices").array().default([]),testIndices:Ee("test_indices").array().default([]),createdAt:Wt("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Wt("updated_at",{withTimezone:!0}).defaultNow()},e=>[ct("idx_trigger_evals_target").on(e.evalTargetId),ct("idx_trigger_evals_user").on(e.userId)]),Ne=an("optimization_runs",{id:fe("id").primaryKey().defaultRandom(),evalTargetId:fe("eval_target_id").notNull().references(()=>n.id,{onDelete:"cascade"}),userId:fe("user_id").notNull(),type:Qt("type").notNull(),iteration:Ee("iteration").notNull(),inputVersion:Ee("input_version").notNull(),outputVersion:Ee("output_version"),trainScore:sn("train_score"),testScore:sn("test_score"),analysis:dn("analysis").notNull().default({}),status:Qt("status").notNull().default("running"),createdAt:Wt("created_at",{withTimezone:!0}).defaultNow()},e=>[ct("idx_optimization_runs_target").on(e.evalTargetId),ct("idx_optimization_runs_user").on(e.userId)]);import{pgTable as cs,text as U,timestamp as ms,jsonb as Se,uuid as Xt,integer as $t,real as ps,index as Ke,uniqueIndex as un}from"drizzle-orm/pg-core";var V=cs("context_snapshots",{id:Xt("id").primaryKey().defaultRandom(),sessionId:Xt("session_id").references(()=>d.id,{onDelete:"cascade"}),userId:Xt("user_id").notNull().references(()=>o.id,{onDelete:"cascade"}),sequence:$t("sequence").notNull().default(0),provider:U("provider").notNull(),model:U("model").notNull(),systemPrompt:U("system_prompt").notNull(),injectedInstructions:Se("injected_instructions").notNull().default([]),messagesSummary:Se("messages_summary").notNull(),tools:Se("tools").notNull().default([]),systemHash:U("system_hash").notNull(),requestHash:U("request_hash").notNull().default(""),toolsHash:U("tools_hash"),injectedHash:U("injected_hash"),messagesDelta:Se("messages_delta").default([]),messagesDeltaRef:U("messages_delta_ref"),maxTokens:$t("max_tokens"),temperature:ps("temperature"),estimatedTokens:$t("estimated_tokens"),capturedAt:ms("captured_at",{withTimezone:!0}).notNull().defaultNow(),metadata:Se("metadata").default({})},e=>[Ke("idx_context_snapshots_session").on(e.sessionId),Ke("idx_context_snapshots_user").on(e.userId),Ke("idx_context_snapshots_hash").on(e.systemHash),Ke("idx_context_snapshots_request_hash").on(e.requestHash),un("idx_snapshots_session_request").on(e.sessionId,e.requestHash),un("idx_snapshots_session_sequence").on(e.sessionId,e.sequence),Ke("idx_context_snapshots_user_session_captured").on(e.userId,e.sessionId,e.capturedAt.desc())]);import{pgTable as _s,text as ln,timestamp as fs,jsonb as xs,integer as Ns,index as gs}from"drizzle-orm/pg-core";var cn=_s("content_blobs",{hash:ln("hash").primaryKey(),contentType:ln("content_type").notNull(),content:xs("content").notNull(),sizeBytes:Ns("size_bytes").notNull().default(0),createdAt:fs("created_at",{withTimezone:!0}).defaultNow()},e=>[gs("idx_content_blobs_type").on(e.contentType)]);import{pgTable as vs,text as mt,timestamp as Pe,jsonb as pt,uuid as Zt,index as _t,integer as hs}from"drizzle-orm/pg-core";var ge=vs("eval_jobs",{id:Zt("id").primaryKey().defaultRandom(),userId:Zt("user_id").notNull(),evalTargetId:Zt("eval_target_id").notNull().references(()=>n.id,{onDelete:"cascade"}),status:mt("status").notNull().default("pending"),config:pt("config").notNull().default({}),progress:pt("progress").notNull().default({}),result:pt("result"),error:mt("error"),attempts:hs("attempts").notNull().default(0),taskKind:mt("task_kind"),payload:pt("payload"),claimedBy:mt("claimed_by"),claimedAt:Pe("claimed_at",{withTimezone:!0}),leaseExpiresAt:Pe("lease_expires_at",{withTimezone:!0}),createdAt:Pe("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Pe("updated_at",{withTimezone:!0}).defaultNow(),completedAt:Pe("completed_at",{withTimezone:!0})},e=>[_t("idx_eval_jobs_user").on(e.userId),_t("idx_eval_jobs_target").on(e.evalTargetId),_t("idx_eval_jobs_status").on(e.status),_t("idx_eval_jobs_pending").on(e.userId,e.status)]);import{pgTable as ys,text as Oe,timestamp as Ce,jsonb as mn,uuid as pn,integer as Is,index as _n}from"drizzle-orm/pg-core";var fn=ys("agent_jobs",{id:pn("id").primaryKey().defaultRandom(),userId:pn("user_id").notNull(),taskKind:Oe("task_kind").notNull(),status:Oe("status").notNull().default("pending"),payload:mn("payload").notNull(),dedupeKey:Oe("dedupe_key"),result:mn("result"),error:Oe("error"),attempts:Is("attempts").notNull().default(0),claimedBy:Oe("claimed_by"),claimedAt:Ce("claimed_at",{withTimezone:!0}),leaseExpiresAt:Ce("lease_expires_at",{withTimezone:!0}),createdAt:Ce("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:Ce("updated_at",{withTimezone:!0}).notNull().defaultNow(),completedAt:Ce("completed_at",{withTimezone:!0})},e=>[_n("idx_agent_jobs_claim").on(e.userId,e.status,e.taskKind,e.createdAt),_n("idx_agent_jobs_dedupe").on(e.userId,e.taskKind,e.dedupeKey)]);import{pgTable as Ts,text as qe,timestamp as Me,jsonb as ft,uuid as eo,index as xt,integer as ws}from"drizzle-orm/pg-core";var xn=Ts("insights_jobs",{id:eo("id").primaryKey().defaultRandom(),userId:eo("user_id").notNull(),status:qe("status").notNull().default("pending"),projectPath:qe("project_path"),projectId:eo("project_id").references(()=>s.id,{onDelete:"set null"}),config:ft("config").notNull().default({}),progress:ft("progress").notNull().default({}),result:ft("result"),error:qe("error"),attempts:ws("attempts").notNull().default(0),taskKind:qe("task_kind"),payload:ft("payload"),claimedBy:qe("claimed_by"),claimedAt:Me("claimed_at",{withTimezone:!0}),leaseExpiresAt:Me("lease_expires_at",{withTimezone:!0}),createdAt:Me("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Me("updated_at",{withTimezone:!0}).defaultNow(),completedAt:Me("completed_at",{withTimezone:!0})},e=>[xt("idx_insights_jobs_user").on(e.userId),xt("idx_insights_jobs_status").on(e.status),xt("idx_insights_jobs_pending").on(e.userId,e.status),xt("idx_insights_jobs_project").on(e.projectId)]);import{pgTable as As,text as to,timestamp as Nt,uuid as Nn,index as zs,uniqueIndex as Ds}from"drizzle-orm/pg-core";var ve=As("api_keys",{id:Nn("id").primaryKey().defaultRandom(),userId:Nn("user_id").notNull().references(()=>o.id,{onDelete:"cascade"}),name:to("name").notNull(),keyHash:to("key_hash").notNull(),keyPrefix:to("key_prefix").notNull(),lastUsedAt:Nt("last_used_at",{withTimezone:!0}),expiresAt:Nt("expires_at",{withTimezone:!0}),revokedAt:Nt("revoked_at",{withTimezone:!0}),createdAt:Nt("created_at",{withTimezone:!0}).defaultNow()},e=>[zs("idx_api_keys_user").on(e.userId),Ds("idx_api_keys_hash").on(e.keyHash)]);import{pgTable as bs,text as oo,timestamp as gn,uuid as js,index as Rs}from"drizzle-orm/pg-core";var vn=bs("extension_auth_codes",{code:oo("code").primaryKey(),userId:js("user_id").notNull().references(()=>o.id,{onDelete:"cascade"}),editor:oo("editor"),email:oo("email"),expiresAt:gn("expires_at",{withTimezone:!0}).notNull(),createdAt:gn("created_at",{withTimezone:!0}).defaultNow()},e=>[Rs("idx_ext_auth_codes_expiry").on(e.expiresAt)]);import{pgTable as ks,text as Es,timestamp as hn,jsonb as Ss,uuid as no,index as yn}from"drizzle-orm/pg-core";var he=ks("eval_conversations",{id:no("id").primaryKey().defaultRandom(),evalTargetId:no("eval_target_id").notNull().references(()=>n.id,{onDelete:"cascade"}),userId:no("user_id").notNull(),messages:Ss("messages").notNull().default([]),status:Es("status").notNull().default("active"),createdAt:hn("created_at",{withTimezone:!0}).defaultNow(),updatedAt:hn("updated_at",{withTimezone:!0}).defaultNow()},e=>[yn("idx_eval_conversations_target").on(e.evalTargetId),yn("idx_eval_conversations_user").on(e.userId)]);import{pgTable as Ks,text as S,timestamp as In,jsonb as Ps,uuid as ro}from"drizzle-orm/pg-core";var Tn=Ks("skill_submissions",{id:ro("id").primaryKey().defaultRandom(),skillId:S("skill_id").notNull(),name:S("name").notNull(),description:S("description").notNull(),category:S("category").notNull(),tools:S("tools").array().notNull(),tags:S("tags").array().default([]),content:S("content").notNull(),status:S("status").notNull().default("pending"),submittedBy:ro("submitted_by").notNull(),reviewedBy:ro("reviewed_by"),reviewNote:S("review_note"),metadata:Ps("metadata"),createdAt:In("created_at",{withTimezone:!0}).defaultNow(),updatedAt:In("updated_at",{withTimezone:!0}).defaultNow()});import{pgTable as Os,text as Be,timestamp as wn,jsonb as Cs,uuid as qs,uniqueIndex as Ms,index as An}from"drizzle-orm/pg-core";var zn=Os("harness_releases",{id:qs("id").primaryKey().defaultRandom(),harness:Be("harness").notNull(),version:Be("version").notNull(),publishedAt:wn("published_at",{withTimezone:!0}).notNull(),title:Be("title"),body:Be("body"),categories:Cs("categories").default({}),url:Be("url"),createdAt:wn("created_at",{withTimezone:!0}).defaultNow()},e=>[Ms("idx_harness_releases_unique").on(e.harness,e.version),An("idx_harness_releases_harness").on(e.harness),An("idx_harness_releases_published").on(e.publishedAt)]);import{pgTable as Bs,text as ye,timestamp as Dn,jsonb as Ls,uuid as bn,index as jn,uniqueIndex as Us}from"drizzle-orm/pg-core";var so=Bs("notifications",{id:bn("id").primaryKey().defaultRandom(),userId:bn("user_id").notNull(),type:ye("type").notNull(),title:ye("title").notNull(),body:ye("body"),url:ye("url"),sourceTable:ye("source_table"),sourceId:ye("source_id"),metadata:Ls("metadata").notNull().default({}),readAt:Dn("read_at",{withTimezone:!0}),createdAt:Dn("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[jn("idx_notifications_user_created").on(e.userId,e.createdAt),jn("idx_notifications_user_unread").on(e.userId),Us("idx_notifications_source_dedup").on(e.userId,e.sourceTable,e.sourceId)]);import{pgTable as Vs,text as Le,timestamp as Ue,jsonb as io,uuid as ao,index as gt,integer as Hs}from"drizzle-orm/pg-core";var Ie=Vs("launch_jobs",{id:ao("id").primaryKey().defaultRandom(),userId:ao("user_id").notNull(),tool:Le("tool").notNull(),status:Le("status").notNull().default("pending"),config:io("config").notNull().default({}),result:io("result"),error:Le("error"),attempts:Hs("attempts").notNull().default(0),taskKind:Le("task_kind"),payload:io("payload"),claimedBy:Le("claimed_by"),claimedAt:Ue("claimed_at",{withTimezone:!0}),leaseExpiresAt:Ue("lease_expires_at",{withTimezone:!0}),createdAt:Ue("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Ue("updated_at",{withTimezone:!0}).defaultNow(),completedAt:Ue("completed_at",{withTimezone:!0}),runId:ao("run_id").references(()=>f.id,{onDelete:"set null"})},e=>[gt("idx_launch_jobs_user").on(e.userId),gt("idx_launch_jobs_status").on(e.status),gt("idx_launch_jobs_pending").on(e.userId,e.status),gt("idx_launch_jobs_run").on(e.runId)]);import{pgTable as Rn,uuid as K,text as Ve,real as Fs,timestamp as vt,boolean as Gs,uniqueIndex as Js,index as He}from"drizzle-orm/pg-core";var uo=Rn("instruction_suggestions",{id:K("id").primaryKey().defaultRandom(),userId:K("user_id").notNull().references(()=>o.id,{onDelete:"cascade"}),instructionId:K("instruction_id").notNull().references(()=>r.id,{onDelete:"cascade"}),projectPath:Ve("project_path").notNull(),projectId:K("project_id").references(()=>s.id,{onDelete:"set null"}),score:Fs("score").notNull(),reason:Ve("reason").notNull(),generatedAt:vt("generated_at",{withTimezone:!0}).notNull().defaultNow(),isStale:Gs("is_stale").notNull().default(!1),dismissedAt:vt("dismissed_at",{withTimezone:!0}),acceptedAt:vt("accepted_at",{withTimezone:!0}),promotedToInstructionId:K("promoted_to_instruction_id").references(()=>r.id,{onDelete:"set null"})},e=>[Js("idx_instruction_suggestions_user_project_instruction").on(e.userId,e.projectPath,e.instructionId),He("idx_instruction_suggestions_user_project").on(e.userId,e.projectPath),He("idx_instruction_suggestions_user_proj_id").on(e.userId,e.projectId),He("idx_instruction_suggestions_generated_at").on(e.generatedAt)]),kn=Rn("instruction_suggestion_events",{id:K("id").primaryKey().defaultRandom(),suggestionId:K("suggestion_id").notNull().references(()=>uo.id,{onDelete:"cascade"}),userId:K("user_id").notNull().references(()=>o.id,{onDelete:"cascade"}),eventType:Ve("event_type").notNull(),tool:Ve("tool"),sessionId:K("session_id"),projectPath:Ve("project_path").notNull(),createdAt:vt("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[He("idx_instruction_suggestion_events_suggestion_id").on(e.suggestionId),He("idx_instruction_suggestion_events_user_id").on(e.userId)]);import{pgTable as Ys,text as lo,integer as Qs,numeric as Fe,timestamp as co,index as Ws,primaryKey as Xs}from"drizzle-orm/pg-core";var En=Ys("model_pricing",{provider:lo("provider").notNull(),modelId:lo("model_id").notNull(),inputPerM:Fe("input_per_m").notNull(),outputPerM:Fe("output_per_m").notNull(),cacheReadPerM:Fe("cache_read_per_m").notNull(),cacheWrite5mPerM:Fe("cache_write_5m_per_m").notNull(),cacheWrite1hPerM:Fe("cache_write_1h_per_m").notNull(),contextWindow:Qs("context_window"),effectiveFrom:co("effective_from",{withTimezone:!0}).notNull(),effectiveUntil:co("effective_until",{withTimezone:!0}),source:lo("source").notNull(),verifiedAt:co("verified_at",{withTimezone:!0})},e=>[Xs({columns:[e.provider,e.modelId,e.effectiveFrom]}),Ws("idx_model_pricing_active").on(e.provider,e.modelId,e.effectiveFrom.desc())]);import{pgTable as $s,text as ee,numeric as Sn,timestamp as Kn,uuid as Pn,jsonb as Zs,index as On}from"drizzle-orm/pg-core";var Cn=$s("limit_observations",{id:Pn("id").primaryKey().defaultRandom(),observedAt:Kn("observed_at",{withTimezone:!0}).notNull().defaultNow(),provider:ee("provider").notNull(),plan:ee("plan").notNull(),limitType:ee("limit_type").notNull(),value:Sn("value").notNull(),unit:ee("unit").notNull(),comparator:ee("comparator").notNull().default("="),resetsAt:Kn("resets_at",{withTimezone:!0}),sourceType:ee("source_type").notNull(),sourceUrl:ee("source_url"),sourceEvidence:Zs("source_evidence"),confidence:Sn("confidence").notNull(),userId:Pn("user_id")},e=>[On("idx_limit_obs_lookup").on(e.provider,e.plan,e.limitType,e.observedAt.desc()),On("idx_limit_obs_user").on(e.userId,e.observedAt.desc())]);import{pgTable as ei,text as ht,timestamp as ti,uuid as oi,jsonb as ni,boolean as ri,uniqueIndex as si}from"drizzle-orm/pg-core";var qn=ei("provider_docs_snapshots",{id:oi("id").primaryKey().defaultRandom(),fetchedAt:ti("fetched_at",{withTimezone:!0}).notNull().defaultNow(),provider:ht("provider").notNull(),docUrl:ht("doc_url").notNull(),contentHash:ht("content_hash").notNull(),content:ht("content").notNull(),parseSuccess:ri("parse_success").notNull(),parseErrors:ni("parse_errors")},e=>[si("idx_docs_dedup").on(e.provider,e.docUrl,e.contentHash)]);import{pgTable as ii,text as yt,numeric as Mn,timestamp as Bn,uuid as ai,primaryKey as di,index as ui}from"drizzle-orm/pg-core";var Ln=ii("plan_limits_active",{provider:yt("provider").notNull(),plan:yt("plan").notNull(),limitType:yt("limit_type").notNull(),value:Mn("value").notNull(),unit:yt("unit").notNull(),effectiveFrom:Bn("effective_from",{withTimezone:!0}).notNull(),effectiveUntil:Bn("effective_until",{withTimezone:!0}),confidence:Mn("confidence").notNull(),sourceObservationIds:ai("source_observation_ids").array().notNull()},e=>[di({columns:[e.provider,e.plan,e.limitType,e.effectiveFrom]}),ui("idx_plan_limits_lookup").on(e.provider,e.plan,e.limitType,e.effectiveFrom.desc())]);import{pgTable as li,text as mo,timestamp as ci,uuid as Un,jsonb as mi,index as pi}from"drizzle-orm/pg-core";var Vn=li("alert_dispatches",{id:Un("id").primaryKey().defaultRandom(),userId:Un("user_id").notNull(),alertKey:mo("alert_key").notNull(),severity:mo("severity").notNull(),lastDispatchedAt:ci("last_dispatched_at",{withTimezone:!0}).notNull().defaultNow(),lastState:mi("last_state").notNull(),channel:mo("channel").notNull()},e=>[pi("idx_alert_user_key").on(e.userId,e.alertKey,e.lastDispatchedAt.desc())]);import{drizzle as Yn}from"drizzle-orm/postgres-js";import Qn from"postgres";var It={};pr(It,{agentJobs:()=>fn,agentRuns:()=>f,agentRunsRelations:()=>bi,alertDispatches:()=>Vn,announcementDeliveries:()=>Po,announcements:()=>Ko,apiKeys:()=>ve,apiKeysRelations:()=>fi,benchmarks:()=>_e,benchmarksRelations:()=>Bi,cliErrorEvents:()=>nn,cliSetupEvents:()=>tn,contentBlobs:()=>cn,contextSnapshots:()=>V,contextSnapshotsRelations:()=>Fi,evalComparisons:()=>rn,evalConversations:()=>he,evalConversationsRelations:()=>Hi,evalJobs:()=>ge,evalJobsRelations:()=>Vi,evalRuns:()=>L,evalRunsRelations:()=>Mi,evalTargets:()=>n,evalTargetsRelations:()=>Ci,evals:()=>E,evalsRelations:()=>qi,extensionAuthCodes:()=>vn,harnessReleases:()=>zn,insightsJobs:()=>xn,instructionEvents:()=>ue,instructionEventsRelations:()=>Ii,instructionSuggestionEvents:()=>kn,instructionSuggestions:()=>uo,instructionUsageEvents:()=>pe,instructionUsageEventsRelations:()=>Oi,instructionVersions:()=>re,instructionVersionsRelations:()=>wi,instructions:()=>r,instructionsRelations:()=>yi,launchJobs:()=>Ie,launchJobsRelations:()=>ji,limitObservations:()=>Cn,memories:()=>h,memoriesRelations:()=>Ti,memoryExperiments:()=>So,modelPricing:()=>En,notificationPreferences:()=>Oo,notifications:()=>so,optimizationRuns:()=>Ne,optimizationRunsRelations:()=>Ui,orgInvitations:()=>j,orgInvitationsRelations:()=>gi,organizations:()=>u,organizationsRelations:()=>xi,packInstructions:()=>B,packInstructionsRelations:()=>Pi,packs:()=>A,packsRelations:()=>Ki,pendingTreatmentExposures:()=>Vo,planLimitsActive:()=>Ln,profiles:()=>o,profilesRelations:()=>_i,projectCheckouts:()=>Do,projectInstructions:()=>O,projectInstructionsRelations:()=>zi,projects:()=>s,projectsRelations:()=>Ai,providerDocsSnapshots:()=>qn,sessionEvents:()=>ie,sessionEventsRelations:()=>Ri,sessionInstructions:()=>C,sessionInstructionsRelations:()=>ki,sessionSendJobs:()=>Go,sessionTerminalTargets:()=>st,sessions:()=>d,sessionsRelations:()=>Di,skillSubmissions:()=>Tn,teams:()=>N,teamsRelations:()=>Ni,treatmentAssignments:()=>R,treatmentAssignmentsRelations:()=>Ei,treatmentExposures:()=>k,treatmentExposuresRelations:()=>Si,triggerEvals:()=>xe,triggerEvalsRelations:()=>Li,userOrganizations:()=>oe,userOrganizationsRelations:()=>vi,userTeams:()=>ne,userTeamsRelations:()=>hi,workerConnections:()=>$o});import{relations as i}from"drizzle-orm";var _i=i(o,({many:e})=>({sessions:e(d),contextSnapshots:e(V),apiKeys:e(ve)})),fi=i(ve,({one:e})=>({profile:e(o,{fields:[ve.userId],references:[o.id]})})),xi=i(u,({many:e})=>({teams:e(N),userOrganizations:e(oe),projects:e(s),invitations:e(j)})),Ni=i(N,({one:e,many:t})=>({organization:e(u,{fields:[N.orgId],references:[u.id]}),userTeams:t(ne),invitations:t(j)})),gi=i(j,({one:e})=>({organization:e(u,{fields:[j.orgId],references:[u.id]}),team:e(N,{fields:[j.teamId],references:[N.id]}),inviter:e(o,{fields:[j.invitedBy],references:[o.id]})})),vi=i(oe,({one:e})=>({organization:e(u,{fields:[oe.orgId],references:[u.id]})})),hi=i(ne,({one:e})=>({team:e(N,{fields:[ne.teamId],references:[N.id]})})),yi=i(r,({one:e,many:t})=>({versions:t(re),projectInstructions:t(O),events:t(ue),usageEvents:t(pe),sessionInstructions:t(C),packInstructions:t(B),forkedFrom:e(r,{fields:[r.forkedFromId],references:[r.id]})})),Ii=i(ue,({one:e})=>({instruction:e(r,{fields:[ue.instructionId],references:[r.id]})})),Ti=i(h,({one:e,many:t})=>({project:e(s,{fields:[h.projectId],references:[s.id]}),parent:e(h,{fields:[h.parentId],references:[h.id]}),versions:t(h)})),wi=i(re,({one:e})=>({instruction:e(r,{fields:[re.instructionId],references:[r.id]})})),Ai=i(s,({one:e,many:t})=>({organization:e(u,{fields:[s.orgId],references:[u.id]}),projectInstructions:t(O),sessions:t(d)})),zi=i(O,({one:e})=>({project:e(s,{fields:[O.projectId],references:[s.id]}),instruction:e(r,{fields:[O.instructionId],references:[r.id]})})),Di=i(d,({one:e,many:t})=>({profile:e(o,{fields:[d.userId],references:[o.id]}),project:e(s,{fields:[d.projectId],references:[s.id]}),run:e(f,{fields:[d.runId],references:[f.id]}),events:t(ie),sessionInstructions:t(C),treatmentExposures:t(k),contextSnapshots:t(V)})),bi=i(f,({one:e,many:t})=>({profile:e(o,{fields:[f.userId],references:[o.id]}),organization:e(u,{fields:[f.orgId],references:[u.id]}),project:e(s,{fields:[f.projectId],references:[s.id]}),sessions:t(d),launchJobs:t(Ie)})),ji=i(Ie,({one:e})=>({run:e(f,{fields:[Ie.runId],references:[f.id]})})),Ri=i(ie,({one:e})=>({session:e(d,{fields:[ie.sessionId],references:[d.id]})})),ki=i(C,({one:e})=>({session:e(d,{fields:[C.sessionId],references:[d.id]}),instruction:e(r,{fields:[C.instructionId],references:[r.id]})})),Ei=i(R,({one:e,many:t})=>({owner:e(o,{fields:[R.userId],references:[o.id]}),project:e(s,{fields:[R.projectId],references:[s.id]}),exposures:t(k)})),Si=i(k,({one:e})=>({session:e(d,{fields:[k.sessionId],references:[d.id]}),owner:e(o,{fields:[k.userId],references:[o.id]}),assignment:e(R,{fields:[k.assignmentId],references:[R.id]})})),Ki=i(A,({one:e,many:t})=>({packInstructions:t(B),forkedFrom:e(A,{fields:[A.forkedFromId],references:[A.id]})})),Pi=i(B,({one:e})=>({pack:e(A,{fields:[B.packId],references:[A.id]}),instruction:e(r,{fields:[B.instructionId],references:[r.id]})})),Oi=i(pe,({one:e})=>({instruction:e(r,{fields:[pe.instructionId],references:[r.id]})})),Ci=i(n,({one:e,many:t})=>({parent:e(n,{fields:[n.parentId],references:[n.id]}),evals:t(E),evalRuns:t(L),benchmarks:t(_e),triggerEvals:t(xe),optimizationRuns:t(Ne),evalJobs:t(ge),evalConversations:t(he)})),qi=i(E,({one:e,many:t})=>({evalTarget:e(n,{fields:[E.evalTargetId],references:[n.id]}),runs:t(L)})),Mi=i(L,({one:e})=>({eval:e(E,{fields:[L.evalId],references:[E.id]}),evalTarget:e(n,{fields:[L.evalTargetId],references:[n.id]})})),Bi=i(_e,({one:e})=>({evalTarget:e(n,{fields:[_e.evalTargetId],references:[n.id]})})),Li=i(xe,({one:e})=>({evalTarget:e(n,{fields:[xe.evalTargetId],references:[n.id]})})),Ui=i(Ne,({one:e})=>({evalTarget:e(n,{fields:[Ne.evalTargetId],references:[n.id]})})),Vi=i(ge,({one:e})=>({evalTarget:e(n,{fields:[ge.evalTargetId],references:[n.id]})})),Hi=i(he,({one:e})=>({evalTarget:e(n,{fields:[he.evalTargetId],references:[n.id]})})),Fi=i(V,({one:e})=>({session:e(d,{fields:[V.sessionId],references:[d.id]}),profile:e(o,{fields:[V.userId],references:[o.id]})}));var Ge=0,Hn=0,Je=0,Fn=0;var Gi=0;function po(){Ge++,Ge>Hn&&(Hn=Ge)}m(po,"trackDbOpStart");function _o(){Ge>0&&Ge--}m(_o,"trackDbOpEnd");function fo(){Je++,Je>Fn&&(Fn=Je)}m(fo,"trackHeavyDbOpStart");function xo(){Je>0&&Je--}m(xo,"trackHeavyDbOpEnd");function Gn(){Gi++}m(Gn,"recordQueryDeadline");var wt,zt,No=!1,Tt;var Jn,Dt,At;function Wn(e){let t=process.env[e];if(!t)throw new Error(`Missing required env var: ${e}`);return t}m(Wn,"getEnv");function Xn(){if(No)throw new Error("getDb() called after closeDb(): the connection pool is closed for shutdown. Stop issuing queries (timers/requests) before draining the pool.");if(!wt){let e=process.env.PG_APPLICATION_NAME||"rulemetric",t=Number(process.env.PG_POOL_MAX)||3,a=Number(process.env.PG_CONNECT_TIMEOUT_S)||10,l=Number(process.env.PG_STATEMENT_TIMEOUT_MS)||0,c=Number(process.env.PG_IDLE_TIMEOUT)||5,p=Number(process.env.PG_KEEP_ALIVE_S)||60;zt=Qn(Wn("DATABASE_URL"),{prepare:!1,max:t,connect_timeout:a,idle_timeout:c,keep_alive:p,max_lifetime:300,connection:{application_name:e,...l>0?{statement_timeout:l}:{}}}),wt=Yn(zt,{schema:It})}return wt}m(Xn,"getDb");function $n(){if(No)throw new Error("getHeavyDb() called after closeDb(): the connection pool is closed for shutdown. Stop issuing queries (timers/requests) before draining the pool.");if(!At){let e=(process.env.PG_APPLICATION_NAME||"rulemetric")+":heavy",t=Number(process.env.PG_HEAVY_POOL_MAX)||2;Dt=Qn(Wn("DATABASE_URL"),{prepare:!1,max:t,connect_timeout:Number(process.env.PG_CONNECT_TIMEOUT_S)||10,idle_timeout:Number(process.env.PG_IDLE_TIMEOUT)||5,keep_alive:Number(process.env.PG_KEEP_ALIVE_S)||60,max_lifetime:300,connection:{application_name:e}}),At=Yn(Dt,{schema:It})}return At}m($n,"getHeavyDb");async function Ji(){if(Tt)return Tt;No=!0;let e=zt,t=Jn,a=Dt;return zt=void 0,wt=void 0,Jn=void 0,Dt=void 0,At=void 0,Tt=Promise.allSettled([e?e.end({timeout:5}):Promise.resolve(),t?t.end({timeout:5}):Promise.resolve(),a?a.end({timeout:5}):Promise.resolve()]).then(()=>{}),Tt}m(Ji,"closeDb");var Yi=new Set(["CONNECT_TIMEOUT","ETIMEDOUT","ENOTFOUND","ECONNREFUSED","EAI_AGAIN"]);function Zn(e){let t=e,a=t?.code??t?.cause?.code??t?.errno;return a!==void 0&&Yi.has(a)}m(Zn,"isRetryableConnectError");var Qi=new Set(["CONNECTION_CLOSED","ECONNRESET","EPIPE"]);function er(e){let t=e,a=t?.code??t?.cause?.code??t?.errno;return a!==void 0&&Qi.has(a)}m(er,"isRetryableResetError");async function tr(e,t={}){let a=t.attempts??3,l=t.baseMs??100,c;for(let p=0;p<a;p++)try{return await e()}catch(g){c=g;let Te=Zn(g)||t.retryResets===!0&&er(g);if(p===a-1||!Te)throw g;await new Promise(H=>setTimeout(H,l*2**p))}throw c}m(tr,"withDbRetry");var bt=class extends Error{static{m(this,"QueryDeadlineError")}code="QUERY_DEADLINE";constructor(t){super(`Query exceeded the client-side deadline of ${t}ms \u2014 the DB pool is likely saturated (acquire-wait) or holding a dead socket; failing fast to avoid pinning the caller. See client.ts.`),this.name="QueryDeadlineError"}};function or(){let e=Number(process.env.PG_QUERY_DEADLINE_MS);return Number.isFinite(e)&&e>=0?e:2e4}m(or,"queryDeadlineMs");function Wi(e,t){let a,l=new Promise((c,p)=>{a=setTimeout(()=>{Gn(),p(new bt(t))},t);let g=a;typeof g.unref=="function"&&g.unref()});return Promise.race([e,l]).finally(()=>clearTimeout(a))}m(Wi,"raceWithDeadline");var nr=new Set(["select","selectDistinct","selectDistinctOn","insert","update","delete","execute","with","$count","refreshMaterializedView"]),rr=new Set(["select","selectDistinct","selectDistinctOn","$count"]);function go(e,t=!1,a=0,l=!1){return e===null||typeof e!="object"&&typeof e!="function"?e:new Proxy(e,{get(c,p,g){if(p==="then"){let H=Reflect.get(c,p,g);return typeof H!="function"?H:(ar,dr)=>{let ur=l?fo:po,lr=l?xo:_o;ur();let vo=tr(()=>new Promise((cr,mr)=>H.call(c,cr,mr)),{retryResets:t});return(a>0?Wi(vo,a):vo).finally(lr).then(ar,dr)}}let Te=Reflect.get(c,p,g);return typeof Te=="function"?(...H)=>go(Te.apply(c,H),t,a,l):Te}})}m(go,"wrapBuilder");function sr(e,t=!1){let a=t?fo:po,l=t?xo:_o;a();try{return Promise.resolve(e()).finally(l)}catch(c){throw l(),c}}m(sr,"gaugeTransaction");var ir=new Proxy({},{get(e,t){let a=Xn(),l=a[t];if(typeof t=="string"&&nr.has(t)&&typeof l=="function"){let c=rr.has(t),p=or();return(...g)=>go(l.apply(a,g),c,p)}return t==="transaction"&&typeof l=="function"?(...c)=>sr(()=>l.apply(a,c)):l}}),Xi=new Proxy({},{get(e,t){let a=$n(),l=a[t];if(typeof t=="string"&&nr.has(t)&&typeof l=="function"){let c=rr.has(t);return(...p)=>go(l.apply(a,p),c,0,!0)}return t==="transaction"&&typeof l=="function"?(...c)=>sr(()=>l.apply(a,c),!0):l}});export{o as a,f as b,d as c,ie as d,h as e,So as f,Ko as g,Po as h,Oo as i,Xn as j,Ji as k};
@@ -0,0 +1 @@
1
+ import{a as r}from"./chunk-ZLLER3HP.js";var a=[{prefix:"contains:",kind:"contains"},{prefix:"icontains:",kind:"icontains"},{prefix:"not-contains:",kind:"not-contains"},{prefix:"regex:",kind:"regex"}];function o(e){if(e.trim()==="json-valid")return{kind:"json-valid",arg:""};for(let{prefix:n,kind:i}of a)if(e.startsWith(n))return{kind:i,arg:e.slice(n.length).trim()};return null}r(o,"parseDeterministicExpectation");function d(e,n){switch(e.kind){case"contains":return n.includes(e.arg)?{passed:!0,evidence:`Output contains "${e.arg}"`}:{passed:!1,evidence:`"${e.arg}" not found in output`};case"icontains":return n.toLowerCase().includes(e.arg.toLowerCase())?{passed:!0,evidence:`Output contains "${e.arg}" (case-insensitive)`}:{passed:!1,evidence:`"${e.arg}" not found in output (case-insensitive)`};case"not-contains":return n.includes(e.arg)?{passed:!1,evidence:`Forbidden substring "${e.arg}" is present in output`}:{passed:!0,evidence:`"${e.arg}" is absent from output`};case"regex":{let i;try{i=new RegExp(e.arg)}catch(s){return{passed:!1,evidence:`Invalid regex "${e.arg}": ${s instanceof Error?s.message:String(s)}`}}let t=n.match(i);return t?{passed:!0,evidence:`Pattern matched: "${t[0]}"`}:{passed:!1,evidence:`Pattern /${e.arg}/ did not match output`}}case"json-valid":{let i=[n.trim()],t=n.match(/```(?:json)?\s*([\s\S]*?)```/);t&&i.push(t[1].trim());for(let s of i)try{return JSON.parse(s),{passed:!0,evidence:"Output parses as valid JSON"}}catch{}return{passed:!1,evidence:"No parseable JSON found in output (checked whole output and fenced blocks)"}}}}r(d,"runDeterministicCheck");export{o as a,d as b};
@@ -1,4 +1,4 @@
1
- import{f as d}from"./chunk-RTWRHIKY.js";import{c as e,d as o,j as y}from"./chunk-MTB4DSSX.js";import{a as g}from"./chunk-ZLLER3HP.js";import{eq as c,asc as P,sql as R}from"drizzle-orm";var T=1800*1e3,I=300*1e3,h=10,D=`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.
1
+ import{c as e,d as o,j as y}from"./chunk-QH6X6VOT.js";import{f as d}from"./chunk-RTWRHIKY.js";import{a as g}from"./chunk-ZLLER3HP.js";import{eq as c,asc as P,sql as R}from"drizzle-orm";var T=1800*1e3,I=300*1e3,h=10,D=`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 b(t,a={}){let n=a.db??y(),f=a.llm??d,r=a.now??Date.now,[i]=await n.select().from(e).where(c(e.id,t.sessionId)).limit(1);if(!i)return{skipped:"not_found"};let w=(await n.execute(R`SELECT MAX(timestamp) AS last_at FROM session_events WHERE session_id = ${t.sessionId}`))?.[0]?.last_at??i.startedAt,_=new Date(w).getTime();if(r()-_>T)return{skipped:"stale"};let m=i.analysis??{},p=m.goalSummaryAt?new Date(m.goalSummaryAt).getTime():0;if(p&&r()-p<I)return{skipped:"recent"};let u=(await n.select().from(o).where(c(o.sessionId,t.sessionId)).orderBy(P(o.timestamp)).limit(h*2)).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,3 +1,3 @@
1
- import{e as N}from"../../chunk-A372U5BM.js";import"../../chunk-TIOKY2IA.js";import"../../chunk-6D7PUPHT.js";import"../../chunk-MUURX7WZ.js";import"../../chunk-QFVGUZDO.js";import"../../chunk-W2MOTOQE.js";import"../../chunk-2DRBNTIQ.js";import"../../chunk-7PSSAJYL.js";import"../../chunk-6QKI756T.js";import"../../chunk-RSKQRVPJ.js";import"../../chunk-6RANV2QJ.js";import"../../chunk-KAF3CYRW.js";import"../../chunk-UF6US7VU.js";import"../../chunk-DPFNJZUO.js";import"../../chunk-L3VLVAP6.js";import"../../chunk-RTWRHIKY.js";import"../../chunk-WHCRHMYJ.js";import"../../chunk-5RBLIVBF.js";import"../../chunk-ZL4MZMUK.js";import"../../chunk-N7TGRFVZ.js";import{k as f}from"../../chunk-MTB4DSSX.js";import"../../chunk-2HWXJBL3.js";import"../../chunk-QUUN6A7E.js";import"../../chunk-6V4WM73L.js";import"../../chunk-T4Z53J7B.js";import"../../chunk-TDD7IOV2.js";import"../../chunk-MODXEGCU.js";import"../../chunk-7DFNBRLY.js";import"../../chunk-N7ODX6PO.js";import"../../chunk-67QCYUJU.js";import"../../chunk-PTPDOYWP.js";import"../../chunk-3C373UMW.js";import"../../chunk-QH7VY5HJ.js";import{a as _}from"../../chunk-PPKPCXJD.js";import"../../chunk-IZTIYR5Q.js";import"../../chunk-V44SRRYR.js";import"../../chunk-U6XEU573.js";import"../../chunk-VLOX6KOM.js";import"../../chunk-3AV3GTMP.js";import"../../chunk-H2ORWIEY.js";import{e as R,l as w}from"../../chunk-O6C2UGBY.js";import{a as e}from"../../chunk-ZLLER3HP.js";import{trace as z,context as Q}from"@opentelemetry/api";import{NodeSDK as A}from"@opentelemetry/sdk-node";import{OTLPTraceExporter as I}from"@opentelemetry/exporter-trace-otlp-http";import{BatchSpanProcessor as L,ConsoleSpanExporter as C,SimpleSpanProcessor as D}from"@opentelemetry/sdk-trace-node";import{Resource as M}from"@opentelemetry/resources";import{ATTR_SERVICE_NAME as V,ATTR_SERVICE_VERSION as q}from"@opentelemetry/semantic-conventions";function b(t){if(!t)return{};let r={};for(let n of t.split(",")){let o=n.indexOf("=");if(o===-1)continue;let s=n.slice(0,o).trim(),i=n.slice(o+1).trim();s&&(r[s]=i)}return r}e(b,"parseOtlpHeaders");var c=null;function g(){return process.env.TELEMETRY_ENABLED!=="false"}e(g,"isTelemetryEnabled");function E(t){if(!g()||c!==null)return"off";let r=new M({[V]:t.serviceName,[q]:t.serviceVersion??"0.1.0"}),n=process.env.OTEL_EXPORTER_OTLP_ENDPOINT,o,s;if(n){let i=b(process.env.OTEL_EXPORTER_OTLP_HEADERS),u=new I({url:`${n}/v1/traces`,headers:i});s=new L(u),o="otlp"}else if(process.env.OTEL_SPAN_EXPORT==="none")s=void 0,o="silent";else{let i=new C;s=new D(i),o="console"}return c=new A({resource:r,spanProcessors:s?[s]:[]}),c.start(),o}e(E,"initTelemetry");async function d(){c&&(await c.shutdown(),c=null)}e(d,"shutdownTelemetry");import{SpanKind as ae,SpanStatusCode as ce}from"@opentelemetry/api";import{trace as de,context as me}from"@opentelemetry/api";import*as l from"@sentry/node";var h=!1;function y(t){if(h)return!1;let r=process.env.SENTRY_DSN;return r?(l.init({dsn:r,serverName:t.serviceName,environment:process.env.NODE_ENV??"development",tracesSampleRate:0}),h=!0,!0):!1}e(y,"initSentry");async function m(t){h&&await l.flush(t)}e(m,"flushSentry");import{existsSync as G,mkdirSync as U,readFileSync as v,unlinkSync as k,writeFileSync as O}from"node:fs";import{dirname as X,join as P}from"node:path";import{execFileSync as $}from"node:child_process";var a=P(w(),"evals-agent.lock");function j(t){try{return process.kill(t,0),!0}catch(r){return r.code==="EPERM"}}e(j,"pidAlive");function B(t){if(!j(t))return!1;try{let r=$("ps",["-p",String(t),"-o","command="],{encoding:"utf-8",stdio:["ignore","pipe","ignore"]});return/run\.js\s+evals\s+agent|evals\s+agent/.test(r)}catch{return!0}}e(B,"isLiveAgent");function H(){try{U(X(a),{recursive:!0})}catch{}for(let t=0;t<2;t++)try{return O(a,String(process.pid),{flag:"wx"}),{ok:!0}}catch(r){if(r.code!=="EEXIST")throw r;let n=0;try{n=Number(v(a,"utf-8").trim())}catch{}if(n&&n!==process.pid&&B(n))return{ok:!1,holder:n};try{k(a)}catch{}}try{O(a,String(process.pid))}catch{}return{ok:!0}}e(H,"acquireAgentLock");function S(){try{G(a)&&Number(v(a,"utf-8").trim())===process.pid&&k(a)}catch{}}e(S,"releaseAgentLock");var T=class t extends _{static{e(this,"EvalAgentCommand")}static description="The worker daemon: long-polls /api/work/next, claims jobs, and runs them locally. Installed as a launchd service by `rulemetric service install`.";static examples=["<%= config.bin %> evals agent"];async run(){await this.parse(t),this.requireAuth();let r=H();if(!r.ok){this.log(`Another rulemetric evals agent is already running (pid ${r.holder}). Refusing to start a second instance.`);return}process.env.PG_APPLICATION_NAME||="rulemetric-agent",y({serviceName:"rulemetric-agent"})&&this.log("[sentry] error capture enabled");let o=E({serviceName:"rulemetric-agent"});o==="otlp"?this.log(`[otel] traces exporting to ${process.env.OTEL_EXPORTER_OTLP_ENDPOINT}`):o==="console"?this.log("[otel] cron spans printing to stdout (set OTEL_EXPORTER_OTLP_ENDPOINT to ship to a backend)"):this.log("[otel] disabled (TELEMETRY_ENABLED=false)"),!R()&&!process.env.RULEMETRIC_API_KEY&&this.error("No auth token found. Run `rulemetric auth login` first."),this.log("Starting thin agent (Phase 4b parallel-run)..."),this.log(`Long-polling /api/work/next. Press Ctrl+C to stop.
1
+ import{e as N}from"../../chunk-5BSUCOQA.js";import"../../chunk-TIOKY2IA.js";import"../../chunk-RSKQRVPJ.js";import"../../chunk-SS5WVIQP.js";import"../../chunk-E4BQ5QM3.js";import"../../chunk-N7TGRFVZ.js";import"../../chunk-7SZX7C7U.js";import"../../chunk-AIGR5AYV.js";import"../../chunk-HDU5QPEO.js";import"../../chunk-QFVGUZDO.js";import"../../chunk-W2MOTOQE.js";import"../../chunk-HITXGIHI.js";import"../../chunk-OK3PGZND.js";import"../../chunk-6QKI756T.js";import"../../chunk-5RBLIVBF.js";import"../../chunk-KAF3CYRW.js";import"../../chunk-UF6US7VU.js";import"../../chunk-O3C5IV2Y.js";import"../../chunk-ZL4MZMUK.js";import"../../chunk-ATSA6BQM.js";import{k as f}from"../../chunk-QH6X6VOT.js";import"../../chunk-FJJ54GK3.js";import"../../chunk-QUUN6A7E.js";import"../../chunk-6V4WM73L.js";import"../../chunk-5XP7WWJR.js";import"../../chunk-RTWRHIKY.js";import"../../chunk-TDD7IOV2.js";import"../../chunk-MODXEGCU.js";import"../../chunk-7DFNBRLY.js";import"../../chunk-N7ODX6PO.js";import"../../chunk-67QCYUJU.js";import"../../chunk-PTPDOYWP.js";import"../../chunk-5BMBVTAE.js";import"../../chunk-S6B2R2LL.js";import"../../chunk-QH7VY5HJ.js";import{a as _}from"../../chunk-PPKPCXJD.js";import"../../chunk-IZTIYR5Q.js";import"../../chunk-V44SRRYR.js";import"../../chunk-U6XEU573.js";import"../../chunk-VLOX6KOM.js";import"../../chunk-3AV3GTMP.js";import"../../chunk-H2ORWIEY.js";import{e as R,l as w}from"../../chunk-O6C2UGBY.js";import{a as e}from"../../chunk-ZLLER3HP.js";import{trace as z,context as Q}from"@opentelemetry/api";import{NodeSDK as A}from"@opentelemetry/sdk-node";import{OTLPTraceExporter as I}from"@opentelemetry/exporter-trace-otlp-http";import{BatchSpanProcessor as L,ConsoleSpanExporter as C,SimpleSpanProcessor as D}from"@opentelemetry/sdk-trace-node";import{Resource as M}from"@opentelemetry/resources";import{ATTR_SERVICE_NAME as V,ATTR_SERVICE_VERSION as q}from"@opentelemetry/semantic-conventions";function b(t){if(!t)return{};let r={};for(let n of t.split(",")){let o=n.indexOf("=");if(o===-1)continue;let s=n.slice(0,o).trim(),i=n.slice(o+1).trim();s&&(r[s]=i)}return r}e(b,"parseOtlpHeaders");var c=null;function g(){return process.env.TELEMETRY_ENABLED!=="false"}e(g,"isTelemetryEnabled");function E(t){if(!g()||c!==null)return"off";let r=new M({[V]:t.serviceName,[q]:t.serviceVersion??"0.1.0"}),n=process.env.OTEL_EXPORTER_OTLP_ENDPOINT,o,s;if(n){let i=b(process.env.OTEL_EXPORTER_OTLP_HEADERS),u=new I({url:`${n}/v1/traces`,headers:i});s=new L(u),o="otlp"}else if(process.env.OTEL_SPAN_EXPORT==="none")s=void 0,o="silent";else{let i=new C;s=new D(i),o="console"}return c=new A({resource:r,spanProcessors:s?[s]:[]}),c.start(),o}e(E,"initTelemetry");async function d(){c&&(await c.shutdown(),c=null)}e(d,"shutdownTelemetry");import{SpanKind as ae,SpanStatusCode as ce}from"@opentelemetry/api";import{trace as de,context as me}from"@opentelemetry/api";import*as l from"@sentry/node";var h=!1;function y(t){if(h)return!1;let r=process.env.SENTRY_DSN;return r?(l.init({dsn:r,serverName:t.serviceName,environment:process.env.NODE_ENV??"development",tracesSampleRate:0}),h=!0,!0):!1}e(y,"initSentry");async function m(t){h&&await l.flush(t)}e(m,"flushSentry");import{existsSync as G,mkdirSync as U,readFileSync as v,unlinkSync as k,writeFileSync as O}from"node:fs";import{dirname as X,join as P}from"node:path";import{execFileSync as $}from"node:child_process";var a=P(w(),"evals-agent.lock");function j(t){try{return process.kill(t,0),!0}catch(r){return r.code==="EPERM"}}e(j,"pidAlive");function B(t){if(!j(t))return!1;try{let r=$("ps",["-p",String(t),"-o","command="],{encoding:"utf-8",stdio:["ignore","pipe","ignore"]});return/run\.js\s+evals\s+agent|evals\s+agent/.test(r)}catch{return!0}}e(B,"isLiveAgent");function H(){try{U(X(a),{recursive:!0})}catch{}for(let t=0;t<2;t++)try{return O(a,String(process.pid),{flag:"wx"}),{ok:!0}}catch(r){if(r.code!=="EEXIST")throw r;let n=0;try{n=Number(v(a,"utf-8").trim())}catch{}if(n&&n!==process.pid&&B(n))return{ok:!1,holder:n};try{k(a)}catch{}}try{O(a,String(process.pid))}catch{}return{ok:!0}}e(H,"acquireAgentLock");function S(){try{G(a)&&Number(v(a,"utf-8").trim())===process.pid&&k(a)}catch{}}e(S,"releaseAgentLock");var T=class t extends _{static{e(this,"EvalAgentCommand")}static description="The worker daemon: long-polls /api/work/next, claims jobs, and runs them locally. Installed as a launchd service by `rulemetric service install`.";static examples=["<%= config.bin %> evals agent"];async run(){await this.parse(t),this.requireAuth();let r=H();if(!r.ok){this.log(`Another rulemetric evals agent is already running (pid ${r.holder}). Refusing to start a second instance.`);return}process.env.PG_APPLICATION_NAME||="rulemetric-agent",y({serviceName:"rulemetric-agent"})&&this.log("[sentry] error capture enabled");let o=E({serviceName:"rulemetric-agent"});o==="otlp"?this.log(`[otel] traces exporting to ${process.env.OTEL_EXPORTER_OTLP_ENDPOINT}`):o==="console"?this.log("[otel] cron spans printing to stdout (set OTEL_EXPORTER_OTLP_ENDPOINT to ship to a backend)"):this.log("[otel] disabled (TELEMETRY_ENABLED=false)"),!R()&&!process.env.RULEMETRIC_API_KEY&&this.error("No auth token found. Run `rulemetric auth login` first."),this.log("Starting thin agent (Phase 4b parallel-run)..."),this.log(`Long-polling /api/work/next. Press Ctrl+C to stop.
2
2
  `);let i=new AbortController,u=e(async p=>{this.log(`
3
3
  [${p}] shutting down agent...`),i.abort(),await Promise.allSettled([m(2e3),d(),f()]),S(),process.exit(0)},"shutdown");process.on("SIGINT",()=>{u("SIGINT")}),process.on("SIGTERM",()=>{u("SIGTERM")});let x=!1;try{await N({signal:i.signal,log:e(p=>this.log(p),"log"),version:this.config.version,readInstalledVersion:e(()=>{try{return JSON.parse(v(P(this.config.root,"package.json"),"utf-8")).version??null}catch{return null}},"readInstalledVersion"),onVersionDrift:e(()=>{x=!0},"onVersionDrift")}),x&&(this.log("[upgrade] Installed CLI version changed \u2014 restarting worker onto the new code."),await Promise.allSettled([m(2e3),d(),f()]),S(),process.exit(1))}finally{S(),await f()}}};export{T as default};
@@ -1,6 +1,6 @@
1
- import{a as i}from"../../chunk-QH7VY5HJ.js";import{a as u}from"../../chunk-PPKPCXJD.js";import"../../chunk-IZTIYR5Q.js";import"../../chunk-V44SRRYR.js";import"../../chunk-U6XEU573.js";import"../../chunk-VLOX6KOM.js";import"../../chunk-3AV3GTMP.js";import{e as a}from"../../chunk-H2ORWIEY.js";import"../../chunk-O6C2UGBY.js";import{a as p}from"../../chunk-ZLLER3HP.js";import{Args as c,Flags as v}from"@oclif/core";var m=class d extends u{static{p(this,"EvalCompareCommand")}static description="Blind A/B comparison between two eval target versions";static examples=["<%= config.bin %> evals compare <target-a> <target-b>"];static args={targetA:c.string({description:"First eval target ID",required:!0}),targetB:c.string({description:"Second eval target ID",required:!0})};static flags={model:v.string({description:"Model for execution and comparison"}),timeout:v.integer({description:"Timeout per eval in ms",default:12e4})};async run(){let{args:s,flags:e}=await this.parse(d);this.requireAuth();let[o,n]=await Promise.all([a(`/api/eval-targets/${s.targetA}`),a(`/api/eval-targets/${s.targetB}`)]),l=await a(`/api/eval-targets/${s.targetA}/evals`);l.length===0&&this.error("No evals found for target A. Create some first."),this.log(`Comparing "${o.name}" v${o.version} vs "${n.name}" v${n.version}`),this.log(`Running ${l.length} eval(s)...
2
- `);let r=Math.random()>.5,h=r?n.content:o.content,f=r?o.content:n.content,A=r?n.name:o.name,w=r?o.name:n.name,g=[];for(let t of l){this.log(`[${t.name}] Running A...`);let b=await i({prompt:t.prompt,targetContent:h,timeout:e.timeout,model:e.model});this.log(`[${t.name}] Running B...`);let E=await i({prompt:t.prompt,targetContent:f,timeout:e.timeout,model:e.model});g.push({evalName:t.name,outputA:b.output,outputB:E.output})}this.log(`
3
- Running blind comparison...`);let B=g.map(t=>`
1
+ import{a as $,b as A}from"../../chunk-647M2I2Y.js";import{a as p}from"../../chunk-QH7VY5HJ.js";import{a as f}from"../../chunk-PPKPCXJD.js";import"../../chunk-IZTIYR5Q.js";import"../../chunk-V44SRRYR.js";import"../../chunk-U6XEU573.js";import"../../chunk-VLOX6KOM.js";import"../../chunk-3AV3GTMP.js";import{e as l,f as w}from"../../chunk-H2ORWIEY.js";import"../../chunk-O6C2UGBY.js";import{a as h}from"../../chunk-ZLLER3HP.js";import{Args as B,Flags as b}from"@oclif/core";var c=class I extends f{static{h(this,"EvalCompareCommand")}static description="Blind A/B comparison between two eval target versions";static examples=["<%= config.bin %> evals compare <target-a> <target-b>"];static args={targetA:B.string({description:"First eval target ID",required:!0}),targetB:B.string({description:"Second eval target ID",required:!0})};static flags={model:b.string({description:"Model for execution and comparison"}),timeout:b.integer({description:"Timeout per eval in ms",default:12e4})};async run(){let{args:g,flags:o}=await this.parse(I);this.requireAuth();let[e,r]=await Promise.all([l(`/api/eval-targets/${g.targetA}`),l(`/api/eval-targets/${g.targetB}`)]),m=await l(`/api/eval-targets/${g.targetA}/evals`);m.length===0&&this.error("No evals found for target A. Create some first."),this.log(`Comparing "${e.name}" v${e.version} vs "${r.name}" v${r.version}`),this.log(`Running ${m.length} eval(s)...
2
+ `);let a=Math.random()>.5,E=a?r.content:e.content,T=a?e.content:r.content,C=a?r.name:e.name,x=a?e.name:r.name,v=[];for(let t of m){this.log(`[${t.name}] Running A...`);let s=await p({prompt:t.prompt,targetContent:E,timeout:o.timeout,model:o.model});this.log(`[${t.name}] Running B...`);let d=await p({prompt:t.prompt,targetContent:T,timeout:o.timeout,model:o.model});(s.error||d.error)&&this.error(`[${t.name}] execution failed (A: ${s.error??"ok"} | B: ${d.error??"ok"}) \u2014 aborting before the blind comparison`),v.push({evalName:t.name,outputA:s.output,outputB:d.output})}this.log(`
3
+ Running blind comparison...`);let N=v.map(t=>`
4
4
  ## Eval: ${t.evalName}
5
5
 
6
6
  ### Output A
@@ -10,10 +10,10 @@ ${t.outputA}
10
10
  ${t.outputB}
11
11
  `).join(`
12
12
  ---
13
- `),$=await i({prompt:`Compare these two sets of outputs. For each eval, determine which output (A or B) is better.
13
+ `),i=await p({prompt:`Compare these two sets of outputs. For each eval, determine which output (A or B) is better.
14
14
  Then provide an overall winner with reasoning.
15
15
 
16
- ${B}
16
+ ${N}
17
17
 
18
18
  Respond with JSON:
19
19
  {
@@ -26,6 +26,6 @@ Respond with JSON:
26
26
  "strengths_winner": ["..."],
27
27
  "weaknesses_loser": ["..."]
28
28
  }
29
- }`,timeout:e.timeout,model:e.model});this.log(`
29
+ }`,timeout:o.timeout,model:o.model});i.error&&this.error(`Blind comparison failed: ${i.error}`),this.log(`
30
30
  === Comparison Results ===
31
- `),this.log(`A = "${A}" | B = "${w}"`),r&&this.log("(Labels were swapped for blind comparison)"),this.log(""),this.log($.output)}};export{m as default};
31
+ `),this.log(`A = "${C}" | B = "${x}"`),a&&this.log("(Labels were swapped for blind comparison)"),this.log(""),this.log(i.output);let u=$(i.output),n=u?A(u,{targetAId:e.id,targetBId:r.id,isSwapped:a}):null;try{let t=await w("/api/eval-comparisons",{targetAId:e.id,targetBId:r.id,targetAVersion:e.version,targetBVersion:r.version,isSwapped:a,winnerTargetId:n?.winnerTargetId??null,perEval:n?.perEval??[],overall:n?.overall??{},rawOutput:i.output,model:o.model??null,status:u?"completed":"parse_failed"});if(this.log(""),n){let s=n.winnerTargetId===e.id?`"${e.name}" v${e.version}`:n.winnerTargetId===r.id?`"${r.name}" v${r.version}`:"TIE";this.log(`Winner: ${s}`)}else this.warn("Judge output was not parseable JSON \u2014 saved as parse_failed with the raw output.");this.log(`Comparison saved: ${t.id} (web: /eval-targets/${e.id} \u2192 Comparisons tab)`)}catch(t){this.error(`Comparison ran but could not be persisted: ${t instanceof Error?t.message:String(t)}`)}}};export{c as default};