@rulemetric/cli 0.15.1 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/dist/chunk-2PO5I3XR.js +1 -0
  2. package/dist/chunk-3MYCWZ63.js +1 -0
  3. package/dist/chunk-4ZDE63UG.js +1 -0
  4. package/dist/{chunk-LLXC5SRC.js → chunk-5A6TMSRO.js} +1 -1
  5. package/dist/{chunk-U3PIBPHT.js → chunk-5CVP5NFH.js} +1 -1
  6. package/dist/{chunk-OAETRNTE.js → chunk-65LFPUDB.js} +1 -1
  7. package/dist/{chunk-W6MMJRFZ.js → chunk-7YZURVZD.js} +1 -1
  8. package/dist/{chunk-CYCH2EQC.js → chunk-AKCCNLHL.js} +1 -1
  9. package/dist/{chunk-TU2AR6XO.js → chunk-B22HYCBV.js} +1 -1
  10. package/dist/chunk-CDSSOOIG.js +1 -0
  11. package/dist/{chunk-GJHFIQVO.js → chunk-CPDW7WW2.js} +10 -10
  12. package/dist/{chunk-XCH4HPEZ.js → chunk-DHIEGG4T.js} +1 -1
  13. package/dist/{chunk-5Z6XXOJL.js → chunk-E4CIJ67Z.js} +1 -1
  14. package/dist/{chunk-CIKQXFQ2.js → chunk-EFEPD4AZ.js} +1 -1
  15. package/dist/{chunk-GDLQNY4V.js → chunk-EMZFZCS4.js} +1 -1
  16. package/dist/chunk-F5GSKVF2.js +1 -0
  17. package/dist/chunk-FCALFMZV.js +1 -0
  18. package/dist/{chunk-RE7RAZQ5.js → chunk-FHRBW4AQ.js} +5 -5
  19. package/dist/chunk-GGUXEZC3.js +1 -0
  20. package/dist/{chunk-IFIWDL7G.js → chunk-GIQ2HK3W.js} +1 -1
  21. package/dist/{chunk-HXOQUYG3.js → chunk-HBDKOU2N.js} +1 -1
  22. package/dist/chunk-HTAHNQZJ.js +1 -0
  23. package/dist/{chunk-5IL3EEIE.js → chunk-IMN4BWAR.js} +1 -1
  24. package/dist/{chunk-ZMVTSYD4.js → chunk-KGU2IW54.js} +1 -1
  25. package/dist/{chunk-WQFR2LOY.js → chunk-KOORMTZO.js} +1 -1
  26. package/dist/chunk-KUW6AVSI.js +1 -0
  27. package/dist/{chunk-D5XLTSRV.js → chunk-QXPGTEMO.js} +1 -1
  28. package/dist/{chunk-2U6PAYCD.js → chunk-RDQXK5LG.js} +1 -1
  29. package/dist/chunk-STUNT4N3.js +1 -0
  30. package/dist/chunk-SW24KZ5C.js +1 -0
  31. package/dist/{chunk-EE4TZAZI.js → chunk-TSLBCZ5P.js} +1 -1
  32. package/dist/{chunk-5GFEEYHM.js → chunk-USKRCVX3.js} +1 -1
  33. package/dist/chunk-VBGHPAUT.js +2 -0
  34. package/dist/{chunk-JOXTWLLK.js → chunk-WL34G6IR.js} +1 -1
  35. package/dist/{chunk-NBTC5FNV.js → chunk-X23L2MF6.js} +1 -1
  36. package/dist/chunk-XFOG2PDJ.js +1 -0
  37. package/dist/{chunk-6T6YFPBW.js → chunk-ZBTJ5R7C.js} +1 -1
  38. package/dist/{chunk-7LFCZI64.js → chunk-ZKPURXUS.js} +1 -1
  39. package/dist/chunk-ZLBYYLJZ.js +3 -0
  40. package/dist/commands/diagnostics.js +1 -1
  41. package/dist/commands/evals/agent.js +1 -1
  42. package/dist/commands/evals/refine-cases.js +1 -1
  43. package/dist/commands/research/resume-scoped-outcomes.js +1 -0
  44. package/dist/commands/sessions/list.js +1 -1
  45. package/dist/commands/suggestions/accept.js +1 -1
  46. package/dist/commands/suggestions/undo.js +1 -1
  47. package/dist/dashboard/Dashboard.js +1 -1
  48. package/dist/dashboard/data.js +1 -1
  49. package/dist/dashboard/launcher/ActiveJobsList.js +1 -1
  50. package/dist/dashboard/launcher/LauncherOverlay.js +1 -1
  51. package/dist/dashboard/launcher/NewLaunchForm.js +1 -1
  52. package/dist/{dist-OVXV2FFO.js → dist-5647V2E7.js} +1 -1
  53. package/dist/lib/agent-loop.js +1 -1
  54. package/dist/lib/agent-presence.js +1 -0
  55. package/dist/lib/eval-case-generator.js +1 -1
  56. package/dist/lib/eval-conversation-handler.js +1 -1
  57. package/dist/lib/evolution-enrolment.js +1 -1
  58. package/dist/lib/instruction-proposer.js +1 -1
  59. package/dist/lib/instructions/acceptance/accept-hook.js +1 -1
  60. package/dist/lib/instructions/acceptance/suggestion-accept.js +1 -1
  61. package/dist/lib/jobs/handlers/cron-auto-accept-suggestions.js +1 -1
  62. package/dist/lib/jobs/handlers/cron-instruction-evolution.js +1 -1
  63. package/dist/lib/jobs/handlers/cron-instruction-training.js +1 -1
  64. package/dist/lib/jobs/handlers/cron-reconcile-attribution.js +1 -1
  65. package/dist/lib/jobs/handlers/cron-refine-cases.js +1 -1
  66. package/dist/lib/jobs/handlers/cron-refresh-pricing.js +1 -1
  67. package/dist/lib/jobs/handlers/cron-refresh-skills.js +1 -1
  68. package/dist/lib/jobs/handlers/cron-suggest-instructions.js +1 -1
  69. package/dist/lib/jobs/handlers/distill-memories.js +1 -1
  70. package/dist/lib/jobs/handlers/finalize-scoped-launch.js +1 -0
  71. package/dist/lib/jobs/handlers/prepare-suggestion-live.js +1 -0
  72. package/dist/lib/jobs/handlers/process-changelog.js +1 -1
  73. package/dist/lib/jobs/handlers/process-conversation.js +1 -1
  74. package/dist/lib/jobs/handlers/process-eval.js +1 -1
  75. package/dist/lib/jobs/handlers/process-insights.js +1 -1
  76. package/dist/lib/jobs/handlers/process-launch.js +1 -1
  77. package/dist/lib/jobs/handlers/process-run-cleanup.js +1 -1
  78. package/dist/lib/jobs/handlers/process-session-goal.js +1 -1
  79. package/dist/lib/jobs/handlers/process-suggestion-eval.js +1 -0
  80. package/dist/lib/llm-client.js +1 -1
  81. package/dist/lib/manual-tasks.js +1 -1
  82. package/dist/lib/projects/workspace/worktree.js +1 -1
  83. package/dist/lib/refine-cases.js +1 -1
  84. package/dist/lib/scoped-outcome-store.js +1 -0
  85. package/dist/lib/work-report.js +1 -1
  86. package/oclif.manifest.json +43 -1
  87. package/package.json +6 -6
  88. package/dist/chunk-CZBO3A6B.js +0 -3
  89. package/dist/chunk-JIW2PCHU.js +0 -1
  90. package/dist/chunk-L562Y4RN.js +0 -1
  91. package/dist/chunk-PZS55PW2.js +0 -1
  92. package/dist/chunk-UNVURR4E.js +0 -1
  93. package/dist/chunk-WVNTUKED.js +0 -1
  94. package/dist/chunk-X3BBFDRD.js +0 -1
  95. package/dist/chunk-XXPWPKTD.js +0 -1
@@ -0,0 +1 @@
1
+ import{a as m,c as Ks}from"./chunk-ZLLER3HP.js";import{boolean as _n,date as Cs,index as to,integer as qs,jsonb as Os,pgTable as oo,text as j,timestamp as F,uniqueIndex as Ms,uuid as he}from"drizzle-orm/pg-core";var pn=oo("announcements",{id:he("id").primaryKey().defaultRandom(),version:j("version").notNull().unique(),releaseDate:Cs("release_date").notNull(),subject:j("subject").notNull(),htmlBody:j("html_body").notNull(),textBody:j("text_body").notNull(),sections:Os("sections").notNull().default({}),status:j("status").notNull().default("draft"),recipientCount:qs("recipient_count"),sentAt:F("sent_at",{withTimezone:!0}),sentBy:he("sent_by"),error:j("error"),createdAt:F("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:F("updated_at",{withTimezone:!0}).notNull().defaultNow()},e=>[to("idx_announcements_status").on(e.status),to("idx_announcements_created").on(e.createdAt)]),mn=oo("announcement_deliveries",{id:he("id").primaryKey().defaultRandom(),announcementId:he("announcement_id").notNull(),userId:he("user_id").notNull(),email:j("email").notNull(),status:j("status").notNull().default("pending"),providerId:j("provider_id"),error:j("error"),sentAt:F("sent_at",{withTimezone:!0}),createdAt:F("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Ms("uniq_announcement_deliveries_announcement_user").on(e.announcementId,e.userId),to("idx_announcement_deliveries_user").on(e.userId,e.createdAt)]),fn=oo("notification_preferences",{userId:he("user_id").primaryKey(),productAnnouncements:_n("product_announcements").notNull().default(!0),weeklyDigest:_n("weekly_digest").notNull().default(!0),unsubscribeToken:j("unsubscribe_token").notNull().unique(),unsubscribedAt:F("unsubscribed_at",{withTimezone:!0}),createdAt:F("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:F("updated_at",{withTimezone:!0}).notNull().defaultNow()});import{boolean as ft,integer as He,jsonb as Ls,pgTable as Hs,real as hn,text as Ue,timestamp as no,uuid as gn}from"drizzle-orm/pg-core";import{pgTable as mt,text as ge,timestamp as Le,jsonb as Nn,uuid as se,primaryKey as xn}from"drizzle-orm/pg-core";var l=mt("organizations",{id:se("id").primaryKey().defaultRandom(),name:ge("name").unique().notNull(),slug:ge("slug").unique().notNull(),metadata:Nn("metadata"),createdAt:Le("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Le("updated_at",{withTimezone:!0}).defaultNow()}),v=mt("teams",{id:se("id").primaryKey().defaultRandom(),orgId:se("org_id").references(()=>l.id,{onDelete:"cascade"}),name:ge("name").notNull(),slug:ge("slug").notNull(),metadata:Nn("metadata"),createdAt:Le("created_at",{withTimezone:!0}).defaultNow()}),ve=mt("user_organizations",{userId:se("user_id").notNull(),orgId:se("org_id").references(()=>l.id,{onDelete:"cascade"}).notNull(),role:ge("role").notNull().default("member"),createdAt:Le("created_at",{withTimezone:!0}).defaultNow()},e=>[xn({columns:[e.userId,e.orgId]})]),Ie=mt("user_teams",{userId:se("user_id").notNull(),teamId:se("team_id").references(()=>v.id,{onDelete:"cascade"}).notNull(),role:ge("role").notNull().default("member"),createdAt:Le("created_at",{withTimezone:!0}).defaultNow()},e=>[xn({columns:[e.userId,e.teamId]})]);var o=Hs("profiles",{id:gn("id").primaryKey(),email:Ue("email"),measurementPreferences:Ls("measurement_preferences"),displayName:Ue("display_name"),activeOrgId:gn("active_org_id").references(()=>l.id,{onDelete:"set null"}),isSuperadmin:ft("is_superadmin").notNull().default(!1),claudeCodePlan:Ue("claude_code_plan"),planSource:Ue("plan_source").notNull().default("detected"),setupCompletedAt:no("setup_completed_at",{withTimezone:!0}),liveSendSkipped:ft("live_send_skipped").notNull().default(!1),autoAcceptSuggestions:ft("auto_accept_suggestions").notNull().default(!0),evolutionPaused:ft("evolution_paused").notNull().default(!1),suggestionConfidenceThreshold:hn("suggestion_confidence_threshold").notNull().default(.7),autoAcceptMinScore:hn("auto_accept_min_score"),autoAcceptMaxPerRun:He("auto_accept_max_per_run"),autoAcceptMaxPerWindow:He("auto_accept_max_per_window"),autoAcceptWindowDays:He("auto_accept_window_days"),trialMaxConcurrent:He("trial_max_concurrent"),trialMaxPerRun:He("trial_max_per_run"),harborAbCadence:Ue("harbor_ab_cadence").notNull().default("off"),createdAt:no("created_at",{withTimezone:!0}).defaultNow(),updatedAt:no("updated_at",{withTimezone:!0}).defaultNow()});import{pgTable as Us,text as ro,timestamp as Nt,uuid as xt,index as vn}from"drizzle-orm/pg-core";var C=Us("org_invitations",{id:xt("id").primaryKey().defaultRandom(),orgId:xt("org_id").notNull().references(()=>l.id,{onDelete:"cascade"}),email:ro("email").notNull(),role:ro("role").notNull().default("member"),teamId:xt("team_id").references(()=>v.id,{onDelete:"set null"}),invitedBy:xt("invited_by").notNull().references(()=>o.id,{onDelete:"cascade"}),token:ro("token").notNull().unique(),expiresAt:Nt("expires_at",{withTimezone:!0}).notNull(),acceptedAt:Nt("accepted_at",{withTimezone:!0}),revokedAt:Nt("revoked_at",{withTimezone:!0}),createdAt:Nt("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[vn("idx_org_invitations_token").on(e.token),vn("idx_org_invitations_org").on(e.orgId)]);import{pgTable as so,text as N,timestamp as $,jsonb as ht,uuid as k,integer as gt,boolean as Bs,uniqueIndex as vt,index as Be}from"drizzle-orm/pg-core";var n=so("instructions",{id:k("id").primaryKey().defaultRandom(),name:N("name").notNull(),description:N("description").notNull(),type:N("type").notNull().default("instruction"),scope:N("scope").notNull(),scopeRef:k("scope_ref"),version:N("version").notNull(),content:N("content").notNull(),frontmatter:ht("frontmatter").notNull(),slots:ht("slots"),tags:N("tags").array(),compatibility:N("compatibility").array(),createdBy:k("created_by"),createdAt:$("created_at",{withTimezone:!0}).defaultNow(),updatedAt:$("updated_at",{withTimezone:!0}).defaultNow(),archived:Bs("archived").default(!1),archivedAt:$("archived_at",{withTimezone:!0}),archivedBy:k("archived_by"),forkedFromId:k("forked_from_id").references(()=>n.id,{onDelete:"set null"}),upstreamVersion:N("upstream_version"),badge:N("badge"),contentHash:N("content_hash"),contextIdentity:N("context_identity"),scanScore:gt("scan_score"),scanFindings:ht("scan_findings"),popularityScore:gt("popularity_score"),sourceUpdatedAt:$("source_updated_at",{withTimezone:!0})},e=>[vt("instructions_name_scope_ref_idx").on(e.name,e.scope,e.scopeRef),Be("idx_instructions_scope").on(e.scope,e.scopeRef),Be("idx_instructions_created_by").on(e.createdBy),Be("idx_instructions_context_identity").on(e.createdBy,e.contextIdentity),Be("idx_instructions_public_recency").on(e.scope,e.sourceUpdatedAt.desc())]),In=so("instruction_version_identities",{id:k("id").primaryKey().defaultRandom(),instructionId:k("instruction_id").notNull().references(()=>n.id,{onDelete:"cascade"}),contentHash:N("content_hash").notNull(),versionOrdinal:gt("version_ordinal").notNull(),content:N("content"),firstSeenAt:$("first_seen_at",{withTimezone:!0}).notNull().defaultNow(),lastSeenAt:$("last_seen_at",{withTimezone:!0}).notNull().defaultNow(),createdAt:$("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[vt("instruction_version_identities_hash_unique").on(e.instructionId,e.contentHash),vt("instruction_version_identities_ordinal_unique").on(e.instructionId,e.versionOrdinal),Be("idx_ivi_instruction").on(e.instructionId)]),ye=so("instruction_versions",{id:k("id").primaryKey().defaultRandom(),instructionId:k("instruction_id").references(()=>n.id,{onDelete:"cascade"}),versionNumber:gt("version_number").notNull(),content:N("content").notNull(),frontmatter:ht("frontmatter").notNull(),changeSummary:N("change_summary"),createdBy:k("created_by"),createdAt:$("created_at",{withTimezone:!0}).defaultNow()},e=>[vt("instruction_versions_instruction_version_idx").on(e.instructionId,e.versionNumber)]);import{pgTable as Gs,text as Vs,timestamp as Fs,jsonb as $s,uuid as io,index as yn}from"drizzle-orm/pg-core";var we=Gs("instruction_events",{id:io("id").primaryKey().defaultRandom(),instructionId:io("instruction_id").notNull().references(()=>n.id,{onDelete:"cascade"}),eventType:Vs("event_type").notNull(),actorId:io("actor_id").notNull(),metadata:$s("metadata"),createdAt:Fs("created_at",{withTimezone:!0}).defaultNow()},e=>[yn("idx_instruction_events_instruction").on(e.instructionId),yn("idx_instruction_events_type").on(e.eventType)]);import{boolean as Js,jsonb as Qs,pgTable as uo,primaryKey as wn,text as ie,timestamp as Ge,uniqueIndex as ao,uuid as ae}from"drizzle-orm/pg-core";import{sql as Ys}from"drizzle-orm";var s=uo("projects",{id:ae("id").primaryKey().defaultRandom(),orgId:ae("org_id").references(()=>l.id,{onDelete:"cascade"}),name:ie("name").notNull(),description:ie("description"),githubRepo:ie("github_repo"),gitRemoteUrl:ie("git_remote_url"),gitRootCommit:ie("git_root_commit"),gitRemoteAliases:ie("git_remote_aliases").array().notNull().default([]),metadata:Qs("metadata"),createdBy:ae("created_by"),createdAt:Ge("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Ge("updated_at",{withTimezone:!0}).defaultNow()},e=>[ao("projects_org_name_idx").on(e.orgId,e.name),ao("projects_git_remote_url_unique").on(e.gitRemoteUrl).where(Ys`${e.gitRemoteUrl} IS NOT NULL`)]),J=uo("project_instructions",{projectId:ae("project_id").references(()=>s.id,{onDelete:"cascade"}).notNull(),instructionId:ae("instruction_id").references(()=>n.id,{onDelete:"cascade"}).notNull(),addedAt:Ge("added_at",{withTimezone:!0}).defaultNow(),addedBy:ae("added_by")},e=>[wn({columns:[e.projectId,e.instructionId]})]),Tn=uo("project_checkouts",{projectId:ae("project_id").references(()=>s.id,{onDelete:"cascade"}).notNull(),path:ie("path").notNull(),isWorktree:Js("is_worktree").notNull().default(!1),firstSeen:Ge("first_seen",{withTimezone:!0}).notNull().defaultNow(),lastSeen:Ge("last_seen",{withTimezone:!0}).notNull().defaultNow()},e=>[wn({columns:[e.projectId,e.path]}),ao("project_checkouts_path_unique").on(e.path)]);import{pgTable as _o,text as I,timestamp as Ve,jsonb as de,uuid as q,integer as yt,uniqueIndex as Dn,index as E}from"drizzle-orm/pg-core";import{pgTable as Ws,text as Te,timestamp as lo,jsonb as An,uuid as It,integer as Xs,boolean as Zs,index as co}from"drizzle-orm/pg-core";var h=Ws("agent_runs",{id:It("id").primaryKey().defaultRandom(),userId:It("user_id").notNull().references(()=>o.id,{onDelete:"cascade"}),orgId:It("org_id").references(()=>l.id,{onDelete:"set null"}),projectId:It("project_id").references(()=>s.id,{onDelete:"set null"}),projectPath:Te("project_path"),gitRemote:Te("git_remote"),baseBranch:Te("base_branch"),title:Te("title"),prompt:Te("prompt"),toolSpec:An("tool_spec").notNull().default([]),autoWorktree:Zs("auto_worktree").notNull().default(!0),status:Te("status").notNull().default("pending"),sessionCount:Xs("session_count").notNull().default(0),metadata:An("metadata").notNull().default({}),createdAt:lo("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:lo("updated_at",{withTimezone:!0}).notNull().defaultNow(),completedAt:lo("completed_at",{withTimezone:!0})},e=>[co("idx_agent_runs_user").on(e.userId),co("idx_agent_runs_org_created").on(e.orgId,e.createdAt),co("idx_agent_runs_project").on(e.projectId)]);var a=_o("sessions",{id:q("id").primaryKey().defaultRandom(),userId:q("user_id").notNull().references(()=>o.id,{onDelete:"cascade"}),externalSessionId:I("external_session_id"),projectId:q("project_id").references(()=>s.id,{onDelete:"set null"}),orgId:q("org_id").references(()=>l.id,{onDelete:"set null"}),tool:I("tool").notNull(),projectPath:I("project_path"),gitBranch:I("git_branch"),startedAt:Ve("started_at",{withTimezone:!0}).notNull(),endedAt:Ve("ended_at",{withTimezone:!0}),eventCount:yt("event_count").default(0),tokenUsage:de("token_usage"),analysis:de("analysis"),analyzedAt:Ve("analyzed_at",{withTimezone:!0}),analyzedEventCount:yt("analyzed_event_count"),analyzedTurnCount:yt("analyzed_turn_count"),metadata:de("metadata").default({}),origin:I("origin").notNull().default("unknown"),runId:q("run_id").references(()=>h.id,{onDelete:"set null"}),model:I("model"),harnessVersion:I("harness_version"),createdAt:Ve("created_at",{withTimezone:!0}).defaultNow()},e=>[E("idx_sessions_user").on(e.userId),E("idx_sessions_tool").on(e.tool),E("idx_sessions_started_at").on(e.startedAt),E("idx_sessions_project").on(e.projectId),E("idx_sessions_org_started_at").on(e.orgId,e.startedAt),E("idx_sessions_run").on(e.runId),Dn("idx_sessions_user_external").on(e.userId,e.externalSessionId)]),Ae=_o("session_events",{id:q("id").primaryKey().defaultRandom(),sessionId:q("session_id").notNull().references(()=>a.id,{onDelete:"cascade"}),sequence:yt("sequence").notNull(),eventType:I("event_type").notNull(),content:I("content"),toolName:I("tool_name"),toolInput:de("tool_input"),toolOutput:de("tool_output"),tokenUsage:de("token_usage"),model:I("model"),timestamp:Ve("timestamp",{withTimezone:!0}).notNull(),metadata:de("metadata").default({})},e=>[Dn("session_events_session_sequence_idx").on(e.sessionId,e.sequence),E("idx_session_events_session_id").on(e.sessionId),E("idx_session_events_event_type").on(e.eventType),E("idx_session_events_model").on(e.model)]),Q=_o("session_instructions",{sessionId:q("session_id").notNull().references(()=>a.id,{onDelete:"cascade"}),instructionId:q("instruction_id").notNull().references(()=>n.id,{onDelete:"cascade"}),linkMethod:I("link_method").notNull(),contentHash:I("content_hash")},e=>[E("idx_session_instructions_instruction_id").on(e.instructionId)]);import{pgTable as zn,text as wt,timestamp as jn,uuid as S,integer as Rn,index as De,unique as ei}from"drizzle-orm/pg-core";var O=zn("treatment_assignments",{id:S("id").primaryKey().defaultRandom(),userId:S("user_id").notNull().references(()=>o.id,{onDelete:"cascade"}),treatmentType:wt("treatment_type").notNull(),treatmentId:S("treatment_id").notNull(),treatmentVersion:Rn("treatment_version").notNull().default(1),projectId:S("project_id").references(()=>s.id,{onDelete:"set null"}),assignedBy:S("assigned_by").references(()=>o.id,{onDelete:"set null"}),method:wt("method").notNull(),assignedAt:jn("assigned_at",{withTimezone:!0}).notNull().defaultNow()},e=>[De("idx_treatment_assignments_user").on(e.userId),De("idx_treatment_assignments_treatment").on(e.treatmentType,e.treatmentId),De("idx_treatment_assignments_project").on(e.projectId)]),M=zn("treatment_exposures",{id:S("id").primaryKey().defaultRandom(),sessionId:S("session_id").notNull().references(()=>a.id,{onDelete:"cascade"}),userId:S("user_id").notNull().references(()=>o.id,{onDelete:"cascade"}),treatmentType:wt("treatment_type").notNull(),treatmentId:S("treatment_id").notNull(),treatmentVersion:Rn("treatment_version").notNull().default(1),assignmentId:S("assignment_id").references(()=>O.id,{onDelete:"set null"}),method:wt("method").notNull(),exposedAt:jn("exposed_at",{withTimezone:!0}).notNull().defaultNow()},e=>[ei("treatment_exposures_unique").on(e.sessionId,e.treatmentType,e.treatmentId,e.treatmentVersion),De("idx_treatment_exposures_treatment").on(e.treatmentType,e.treatmentId),De("idx_treatment_exposures_user").on(e.userId),De("idx_treatment_exposures_session").on(e.sessionId)]);import{pgTable as ti,text as po,timestamp as oi,uuid as Tt,integer as ni,index as kn,uniqueIndex as ri}from"drizzle-orm/pg-core";var En=ti("pending_treatment_exposures",{id:Tt("id").primaryKey().defaultRandom(),userId:Tt("user_id").notNull().references(()=>o.id,{onDelete:"cascade"}),externalSessionId:po("external_session_id").notNull(),treatmentType:po("treatment_type").notNull(),treatmentId:Tt("treatment_id").notNull(),treatmentVersion:ni("treatment_version").notNull().default(1),method:po("method").notNull().default("injected"),projectId:Tt("project_id").references(()=>s.id,{onDelete:"set null"}),createdAt:oi("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[ri("pending_treatment_exposures_unique").on(e.externalSessionId,e.treatmentType,e.treatmentId,e.treatmentVersion),kn("idx_pending_treatment_exposures_ext").on(e.externalSessionId),kn("idx_pending_treatment_exposures_user").on(e.userId)]);import{pgTable as Sn,text as Y,timestamp as bn,uuid as ze,numeric as si,index as mo,unique as ii}from"drizzle-orm/pg-core";var ue=Sn("instruction_experiments",{id:ze("id").primaryKey().defaultRandom(),userId:ze("user_id").notNull().references(()=>o.id,{onDelete:"cascade"}),instructionId:ze("instruction_id").notNull().references(()=>n.id,{onDelete:"cascade"}),projectPath:Y("project_path").notNull(),status:Y("status").notNull().default("running"),treatedShare:si("treated_share").notNull().default("0.5"),salt:Y("salt").notNull(),contentHash:Y("content_hash"),source:Y("source").notNull().default("manual"),stoppedReason:Y("stopped_reason"),createdAt:bn("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[mo("idx_instruction_experiments_lookup").on(e.userId,e.projectPath)]),Pn=Sn("instruction_experiment_arms",{id:ze("id").primaryKey().defaultRandom(),experimentId:ze("experiment_id").notNull().references(()=>ue.id,{onDelete:"cascade"}),userId:ze("user_id").notNull().references(()=>o.id,{onDelete:"cascade"}),externalSessionId:Y("external_session_id").notNull(),arm:Y("arm").notNull(),assignedAt:bn("assigned_at",{withTimezone:!0}).notNull().defaultNow()},e=>[ii("instruction_experiment_arms_unique").on(e.experimentId,e.externalSessionId),mo("idx_instruction_experiment_arms_experiment").on(e.experimentId,e.arm),mo("idx_instruction_experiment_arms_session").on(e.externalSessionId)]);import{index as Un,jsonb as Je,pgTable as Bn,text as A,timestamp as Qe,unique as Hn,uniqueIndex as ci,uuid as _e}from"drizzle-orm/pg-core";import{pgTable as Ln,uuid as Re,text as jt,jsonb as Mn,timestamp as ho,uniqueIndex as di,integer as ui,unique as li}from"drizzle-orm/pg-core";import{pgTable as ai,text as At,timestamp as $e,jsonb as Dt,uuid as No,index as zt,integer as xo}from"drizzle-orm/pg-core";import{sql as fo}from"drizzle-orm";import{pgTable as le,text as _,timestamp as g,jsonb as w,uuid as c,integer as L,boolean as Fe,index as f,unique as Kn}from"drizzle-orm/pg-core";var r=le("eval_targets",{id:c("id").primaryKey().defaultRandom(),userId:c("user_id").notNull(),name:_("name").notNull(),type:_("type").notNull(),content:_("content").notNull(),description:_("description").notNull().default(""),metadata:w("metadata").notNull().default({}),version:L("version").notNull().default(1),parentId:c("parent_id").references(()=>r.id,{onDelete:"set null"}),instructionId:c("instruction_id").references(()=>n.id,{onDelete:"set null"}),projectPath:_("project_path"),createdAt:g("created_at",{withTimezone:!0}).defaultNow(),updatedAt:g("updated_at",{withTimezone:!0}).defaultNow()},e=>[f("eval_targets_name_user_idx").on(e.name,e.userId),f("idx_eval_targets_user").on(e.userId),f("idx_eval_targets_type").on(e.type),f("idx_eval_targets_parent").on(e.parentId),f("idx_eval_targets_instruction").on(e.instructionId).where(fo`${e.instructionId} IS NOT NULL`),f("idx_eval_targets_project").on(e.projectPath).where(fo`${e.projectPath} IS NOT NULL`)]),H=le("evals",{id:c("id").primaryKey().defaultRandom(),evalTargetId:c("eval_target_id").notNull().references(()=>r.id,{onDelete:"cascade"}),name:_("name").notNull(),prompt:_("prompt").notNull(),expectedOutput:_("expected_output").notNull().default(""),files:w("files").notNull().default([]),expectations:w("expectations").notNull().default([]),retiredAt:g("retired_at",{withTimezone:!0}),retiredReason:_("retired_reason"),createdAt:g("created_at",{withTimezone:!0}).defaultNow(),updatedAt:g("updated_at",{withTimezone:!0}).defaultNow(),contentUpdatedAt:g("content_updated_at",{withTimezone:!0}).notNull().defaultNow()},e=>[f("idx_evals_target").on(e.evalTargetId),f("idx_evals_target_active").on(e.evalTargetId).where(fo`${e.retiredAt} IS NULL`)]),b=le("eval_runs",{id:c("id").primaryKey().defaultRandom(),jobId:c("job_id"),evalId:c("eval_id").notNull().references(()=>H.id,{onDelete:"cascade"}),evalTargetId:c("eval_target_id").notNull().references(()=>r.id,{onDelete:"cascade"}),evalTargetVersion:L("eval_target_version").notNull(),configuration:_("configuration").notNull(),runNumber:L("run_number").notNull().default(1),iteration:L("iteration").notNull().default(1),status:_("status").notNull().default("completed"),outputs:w("outputs").notNull().default({}),timing:w("timing").notNull().default({}),grading:w("grading").notNull().default({}),comparison:w("comparison"),createdAt:g("created_at",{withTimezone:!0}).defaultNow()},e=>[f("idx_eval_runs_eval").on(e.evalId),f("idx_eval_runs_target").on(e.evalTargetId),f("idx_eval_runs_iteration").on(e.evalTargetId,e.iteration)]),Cn=le("eval_comparisons",{id:c("id").primaryKey().defaultRandom(),userId:c("user_id").notNull(),targetAId:c("target_a_id").notNull().references(()=>r.id,{onDelete:"cascade"}),targetBId:c("target_b_id").notNull().references(()=>r.id,{onDelete:"cascade"}),targetAVersion:L("target_a_version").notNull(),targetBVersion:L("target_b_version").notNull(),isSwapped:Fe("is_swapped").notNull().default(!1),winnerTargetId:c("winner_target_id").references(()=>r.id,{onDelete:"set null"}),perEval:w("per_eval").notNull().default([]),overall:w("overall").notNull().default({}),rawOutput:_("raw_output"),model:_("model"),status:_("status").notNull().default("completed"),createdAt:g("created_at",{withTimezone:!0}).defaultNow()},e=>[f("idx_eval_comparisons_target_a").on(e.targetAId),f("idx_eval_comparisons_target_b").on(e.targetBId),f("idx_eval_comparisons_user").on(e.userId)]),qn=le("eval_grade_annotations",{id:c("id").primaryKey().defaultRandom(),userId:c("user_id").notNull(),evalRunId:c("eval_run_id").notNull().references(()=>b.id,{onDelete:"cascade"}),evalTargetId:c("eval_target_id").notNull().references(()=>r.id,{onDelete:"cascade"}),expectationIndex:L("expectation_index").notNull(),expectationText:_("expectation_text").notNull(),judgePassed:Fe("judge_passed").notNull(),judgeMethod:_("judge_method").notNull(),judgeModel:_("judge_model"),verdict:_("verdict").notNull(),flag:_("flag"),note:_("note"),createdAt:g("created_at",{withTimezone:!0}).defaultNow(),updatedAt:g("updated_at",{withTimezone:!0}).defaultNow()},e=>[f("idx_eval_grade_annotations_target").on(e.evalTargetId),f("idx_eval_grade_annotations_run").on(e.evalRunId),Kn("eval_grade_annotations_eval_run_id_expectation_index_key").on(e.evalRunId,e.expectationIndex)]),On=le("judge_reviewer_verdicts",{id:c("id").primaryKey().defaultRandom(),userId:c("user_id").notNull(),evalTargetId:c("eval_target_id").notNull().references(()=>r.id,{onDelete:"cascade"}),evalRunId:c("eval_run_id").notNull().references(()=>b.id,{onDelete:"cascade"}),expectationIndex:L("expectation_index").notNull(),expectationText:_("expectation_text").notNull(),judgePassed:Fe("judge_passed").notNull(),humanPassed:Fe("human_passed").notNull(),reviewerEngine:_("reviewer_engine").notNull(),reviewerModel:_("reviewer_model").notNull(),reviewerPassed:Fe("reviewer_passed").notNull(),resolvedAt:g("resolved_at",{withTimezone:!0}),resolution:_("resolution"),createdAt:g("created_at",{withTimezone:!0}).defaultNow(),updatedAt:g("updated_at",{withTimezone:!0}).defaultNow()},e=>[f("idx_jrv_target").on(e.evalTargetId),Kn("judge_reviewer_verdicts_eval_run_id_expectation_index_review_key").on(e.evalRunId,e.expectationIndex,e.reviewerModel)]),je=le("benchmarks",{id:c("id").primaryKey().defaultRandom(),evalTargetId:c("eval_target_id").notNull().references(()=>r.id,{onDelete:"cascade"}),iteration:L("iteration").notNull().default(1),runSummary:w("run_summary").notNull().default({}),notes:w("notes").notNull().default([]),feedback:w("feedback"),createdAt:g("created_at",{withTimezone:!0}).defaultNow()},e=>[f("idx_benchmarks_target").on(e.evalTargetId)]);var P=ai("eval_jobs",{id:No("id").primaryKey().defaultRandom(),userId:No("user_id").notNull(),evalTargetId:No("eval_target_id").notNull().references(()=>r.id,{onDelete:"cascade"}),status:At("status").notNull().default("pending"),config:Dt("config").notNull().default({}),progress:Dt("progress").notNull().default({}),result:Dt("result"),error:At("error"),attempts:xo("attempts").notNull().default(0),taskKind:At("task_kind"),payload:Dt("payload"),claimedBy:At("claimed_by"),claimedAt:$e("claimed_at",{withTimezone:!0}),leaseExpiresAt:$e("lease_expires_at",{withTimezone:!0}),leaseRecoveries:xo("lease_recoveries").notNull().default(0),hostSuspendRecoveries:xo("host_suspend_recoveries").notNull().default(0),createdAt:$e("created_at",{withTimezone:!0}).defaultNow(),updatedAt:$e("updated_at",{withTimezone:!0}).defaultNow(),completedAt:$e("completed_at",{withTimezone:!0})},e=>[zt("idx_eval_jobs_user").on(e.userId),zt("idx_eval_jobs_target").on(e.evalTargetId),zt("idx_eval_jobs_status").on(e.status),zt("idx_eval_jobs_pending").on(e.userId,e.status)]);var T=Ln("performance_studies",{id:Re("id").primaryKey().defaultRandom(),userId:Re("user_id").notNull(),evalTargetId:Re("eval_target_id").notNull().references(()=>r.id,{onDelete:"cascade"}),projectPath:jt("project_path").notNull(),protocol:Mn("protocol").notNull(),protocolHash:jt("protocol_hash").notNull(),result:Mn("result"),finalizedAt:ho("finalized_at",{withTimezone:!0}),createdAt:ho("created_at",{withTimezone:!0}).defaultNow().notNull()},e=>[di("performance_studies_protocol_unique").on(e.userId,e.evalTargetId,e.protocolHash)]),ce=Ln("performance_study_calls",{id:Re("id").primaryKey().defaultRandom(),studyId:Re("study_id").notNull().references(()=>T.id,{onDelete:"cascade"}),jobId:Re("job_id").notNull().references(()=>P.id,{onDelete:"cascade"}),taskId:jt("task_id").notNull(),arm:jt("arm").notNull(),repetition:ui("repetition").notNull(),reservedAt:ho("reserved_at",{withTimezone:!0}).defaultNow().notNull()},e=>[li("performance_study_calls_study_id_task_id_arm_repetition_key").on(e.studyId,e.taskId,e.arm,e.repetition)]);var Ye=Bn("scoped_live_confirmations",{id:_e("id").primaryKey().defaultRandom(),userId:_e("user_id").notNull(),experimentId:_e("experiment_id").notNull().references(()=>ue.id,{onDelete:"cascade"}),sourceStudyId:_e("source_study_id").references(()=>T.id,{onDelete:"restrict"}),protocol:Je("protocol").notNull(),protocolHash:A("protocol_hash").notNull(),salt:A("salt").notNull(),status:A("status").notNull().default("running"),decision:A("decision"),decisionDetail:Je("decision_detail"),startedAt:Qe("started_at",{withTimezone:!0}).notNull().defaultNow(),endedAt:Qe("ended_at",{withTimezone:!0})},e=>[ci("scoped_live_confirmations_experiment_unique").on(e.experimentId),Un("scoped_live_confirmations_user_status").on(e.userId,e.status)]),Rt=Bn("scoped_live_confirmation_assignments",{id:_e("id").primaryKey().defaultRandom(),confirmationId:_e("confirmation_id").notNull().references(()=>Ye.id,{onDelete:"cascade"}),userId:_e("user_id").notNull(),taskId:A("task_id").notNull(),externalSessionId:A("external_session_id").notNull(),arm:A("arm").notNull(),phase:A("phase").notNull().default("trial"),model:A("model").notNull(),configurationHash:A("configuration_hash").notNull(),enrollmentEvidence:Je("enrollment_evidence"),taskEvidence:Je("task_evidence"),assignedAt:Qe("assigned_at",{withTimezone:!0}).notNull().defaultNow(),deliveryHash:A("delivery_hash"),deliveredAt:Qe("delivered_at",{withTimezone:!0}),outcome:A("outcome"),outcomeDetail:Je("outcome_detail"),outcomeAt:Qe("outcome_at",{withTimezone:!0})},e=>[Hn("scoped_live_confirmation_task_unique").on(e.confirmationId,e.taskId),Hn("scoped_live_confirmation_session_unique").on(e.confirmationId,e.externalSessionId),Un("scoped_live_confirmation_assignments_confirmation_arm").on(e.confirmationId,e.arm)]);import{pgTable as _i,text as go,timestamp as pi,uuid as kt,numeric as vo,integer as Gn,jsonb as mi,index as fi,unique as Ni}from"drizzle-orm/pg-core";var Vn=_i("instruction_verdicts",{id:kt("id").primaryKey().defaultRandom(),userId:kt("user_id").notNull().references(()=>o.id,{onDelete:"cascade"}),instructionId:kt("instruction_id").notNull().references(()=>n.id,{onDelete:"cascade"}),contentHash:go("content_hash").notNull(),projectPath:go("project_path").notNull(),segment:mi("segment").notNull().default({}),decision:go("decision").notNull(),delta:vo("delta").notNull(),ciLower:vo("ci_lower").notNull(),ciUpper:vo("ci_upper").notNull(),nTreated:Gn("n_treated").notNull(),nControl:Gn("n_control").notNull(),experimentId:kt("experiment_id").references(()=>ue.id,{onDelete:"set null"}),decidedAt:pi("decided_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Ni("instruction_verdicts_unique").on(e.instructionId,e.contentHash,e.projectPath),fi("idx_instruction_verdicts_render").on(e.userId,e.projectPath)]);import{pgTable as xi,text as Et,timestamp as Io,uuid as yo,integer as hi,unique as gi,index as vi}from"drizzle-orm/pg-core";var Fn=xi("insight_recommendation_log",{id:yo("id").primaryKey().defaultRandom(),userId:yo("user_id").notNull().references(()=>o.id,{onDelete:"cascade"}),projectPath:Et("project_path").notNull().default(""),category:Et("category").notNull(),contentHash:Et("content_hash").notNull(),label:Et("label").notNull().default(""),firstSeenAt:Io("first_seen_at",{withTimezone:!0}).notNull().defaultNow(),lastSeenAt:Io("last_seen_at",{withTimezone:!0}).notNull().defaultNow(),timesGenerated:hi("times_generated").notNull().default(1),lastJobId:yo("last_job_id"),dismissedAt:Io("dismissed_at",{withTimezone:!0})},e=>[gi("insight_recommendation_log_unique").on(e.userId,e.projectPath,e.contentHash),vi("idx_insight_recommendation_log_read").on(e.userId,e.projectPath)]);import{pgTable as Ii,text as ke,timestamp as wo,uuid as We,integer as $n,index as St}from"drizzle-orm/pg-core";var D=Ii("memories",{id:We("id").primaryKey().defaultRandom(),userId:We("user_id").notNull().references(()=>o.id,{onDelete:"cascade"}),orgId:We("org_id"),projectId:We("project_id").references(()=>s.id,{onDelete:"set null"}),version:$n("version").notNull().default(1),parentId:We("parent_id").references(()=>D.id,{onDelete:"set null"}),kind:ke("kind").notNull(),title:ke("title").notNull(),body:ke("body").notNull(),source:ke("source").notNull(),status:ke("status").notNull().default("active"),trustClass:ke("trust_class"),trustVersion:$n("trust_version"),trustComputedAt:wo("trust_computed_at",{withTimezone:!0}),createdAt:wo("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:wo("updated_at",{withTimezone:!0}).notNull().defaultNow()},e=>[St("idx_memories_user").on(e.userId),St("idx_memories_project").on(e.projectId),St("idx_memories_parent").on(e.parentId),St("idx_memories_user_status").on(e.userId,e.status)]);import{pgTable as yi,text as pe,timestamp as To,uuid as Ao,integer as Jn,jsonb as wi,index as Qn}from"drizzle-orm/pg-core";var Yn=yi("memory_experiments",{id:Ao("id").primaryKey().defaultRandom(),memoryId:Ao("memory_id").notNull().references(()=>D.id,{onDelete:"cascade"}),userId:Ao("user_id").notNull().references(()=>o.id,{onDelete:"cascade"}),memoryVersion:Jn("memory_version").notNull().default(1),memoryBody:pe("memory_body"),taskPrompt:pe("task_prompt").notNull(),expectations:pe("expectations").array().notNull().default([]),trials:Jn("trials").notNull().default(10),model:pe("model"),engine:pe("engine").$type().notNull().default("claude"),status:pe("status").notNull().default("pending"),result:wi("result").$type(),error:pe("error"),createdAt:To("created_at",{withTimezone:!0}).notNull().defaultNow(),startedAt:To("started_at",{withTimezone:!0}),completedAt:To("completed_at",{withTimezone:!0})},e=>[Qn("idx_memory_experiments_memory").on(e.memoryId),Qn("idx_memory_experiments_user").on(e.userId)]);import{pgTable as Ti,text as Ee,timestamp as Do,uuid as zo,jsonb as Ai,uniqueIndex as Di,index as Wn}from"drizzle-orm/pg-core";var bt=Ti("session_terminal_targets",{id:zo("id").primaryKey().defaultRandom(),userId:zo("user_id").notNull().references(()=>o.id,{onDelete:"cascade"}),sessionId:zo("session_id").references(()=>a.id,{onDelete:"set null"}),externalSessionId:Ee("external_session_id"),kind:Ee("kind").notNull(),target:Ee("target").notNull(),status:Ee("status").notNull().default("active"),attachCommand:Ee("attach_command").notNull(),projectPath:Ee("project_path"),metadata:Ai("metadata").notNull().default({}),lastSeenAt:Do("last_seen_at",{withTimezone:!0}).defaultNow(),createdAt:Do("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Do("updated_at",{withTimezone:!0}).defaultNow()},e=>[Di("idx_session_terminal_targets_user_target").on(e.userId,e.target),Wn("idx_session_terminal_targets_session").on(e.sessionId),Wn("idx_session_terminal_targets_user_status").on(e.userId,e.status)]);import{boolean as zi,index as Pt,jsonb as Xn,pgTable as ji,text as me,timestamp as Xe,uuid as Kt,integer as jo}from"drizzle-orm/pg-core";var Zn=ji("session_send_jobs",{id:Kt("id").primaryKey().defaultRandom(),userId:Kt("user_id").notNull(),sessionId:Kt("session_id").notNull().references(()=>a.id,{onDelete:"cascade"}),terminalTargetId:Kt("terminal_target_id").references(()=>bt.id,{onDelete:"set null"}),target:me("target").notNull(),message:me("message").notNull(),submit:zi("submit").notNull().default(!0),delivery:me("delivery").notNull().default("live"),status:me("status").notNull().default("pending"),result:Xn("result"),error:me("error"),attempts:jo("attempts").notNull().default(0),taskKind:me("task_kind"),payload:Xn("payload"),claimedBy:me("claimed_by"),claimedAt:Xe("claimed_at",{withTimezone:!0}),leaseExpiresAt:Xe("lease_expires_at",{withTimezone:!0}),leaseRecoveries:jo("lease_recoveries").notNull().default(0),hostSuspendRecoveries:jo("host_suspend_recoveries").notNull().default(0),createdAt:Xe("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Xe("updated_at",{withTimezone:!0}).defaultNow(),completedAt:Xe("completed_at",{withTimezone:!0})},e=>[Pt("idx_session_send_jobs_user").on(e.userId),Pt("idx_session_send_jobs_session").on(e.sessionId),Pt("idx_session_send_jobs_status").on(e.status),Pt("idx_session_send_jobs_pending").on(e.userId,e.status)]);import{pgTable as tr,text as fe,timestamp as Ct,jsonb as or,uuid as W,integer as Ri,boolean as ki,uniqueIndex as Ei,index as er,primaryKey as Si}from"drizzle-orm/pg-core";var R=tr("packs",{id:W("id").primaryKey().defaultRandom(),name:fe("name").notNull(),description:fe("description").notNull(),scope:fe("scope").notNull(),scopeRef:W("scope_ref"),version:fe("version").notNull().default("1.0.0"),tags:fe("tags").array(),badge:fe("badge"),metadata:or("metadata"),createdBy:W("created_by"),createdAt:Ct("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Ct("updated_at",{withTimezone:!0}).defaultNow(),archived:ki("archived").default(!1),archivedAt:Ct("archived_at",{withTimezone:!0}),archivedBy:W("archived_by"),forkedFromId:W("forked_from_id").references(()=>R.id,{onDelete:"set null"}),upstreamVersion:fe("upstream_version")},e=>[Ei("packs_name_scope_ref_idx").on(e.name,e.scope,e.scopeRef),er("idx_packs_scope").on(e.scope,e.scopeRef),er("idx_packs_created_by").on(e.createdBy)]),X=tr("pack_instructions",{packId:W("pack_id").references(()=>R.id,{onDelete:"cascade"}).notNull(),instructionId:W("instruction_id").references(()=>n.id,{onDelete:"cascade"}).notNull(),position:Ri("position").notNull().default(0),slotOverrides:or("slot_overrides"),addedAt:Ct("added_at",{withTimezone:!0}).defaultNow(),addedBy:W("added_by")},e=>[Si({columns:[e.packId,e.instructionId]})]);import{pgTable as bi,text as Ro,timestamp as Pi,jsonb as Ki,uuid as ko,index as Se}from"drizzle-orm/pg-core";var be=bi("instruction_usage_events",{id:ko("id").primaryKey().defaultRandom(),instructionId:ko("instruction_id").references(()=>n.id,{onDelete:"set null"}),userId:ko("user_id").notNull(),surface:Ro("surface").notNull(),action:Ro("action").notNull(),metadata:Ki("metadata"),traceId:Ro("trace_id"),createdAt:Pi("created_at",{withTimezone:!0}).defaultNow()},e=>[Se("idx_usage_events_instruction").on(e.instructionId),Se("idx_usage_events_user").on(e.userId),Se("idx_usage_events_surface").on(e.surface),Se("idx_usage_events_action").on(e.action),Se("idx_usage_events_created_at").on(e.createdAt),Se("idx_usage_events_user_created").on(e.userId,e.createdAt)]);import{pgTable as Ci,text as qt,timestamp as Ot,jsonb as qi,uuid as nr,index as Eo}from"drizzle-orm/pg-core";var rr=Ci("worker_connections",{id:nr("id").primaryKey().defaultRandom(),userId:nr("user_id").notNull(),workerType:qt("worker_type").notNull().default("mcp"),clientName:qt("client_name").notNull(),clientVersion:qt("client_version"),workerVersion:qt("worker_version"),lastHeartbeat:Ot("last_heartbeat",{withTimezone:!0}).notNull().defaultNow(),presenceGapStartedAt:Ot("presence_gap_started_at",{withTimezone:!0}),presenceGapEndedAt:Ot("presence_gap_ended_at",{withTimezone:!0}),connectedAt:Ot("connected_at",{withTimezone:!0}).notNull().defaultNow(),metadata:qi("metadata")},e=>[Eo("idx_worker_connections_user").on(e.userId),Eo("idx_worker_connections_heartbeat").on(e.userId,e.lastHeartbeat),Eo("idx_worker_connections_type").on(e.userId,e.workerType)]);import{pgTable as Oi,text as Mt,timestamp as Mi,jsonb as Li,uuid as sr,index as ir}from"drizzle-orm/pg-core";var ar=Oi("cli_setup_events",{id:sr("id").primaryKey().defaultRandom(),userId:sr("user_id").notNull(),deviceId:Mt("device_id").notNull(),event:Mt("event").notNull(),cliVersion:Mt("cli_version"),os:Mt("os"),props:Li("props").notNull().default({}),createdAt:Mi("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[ir("idx_cli_setup_events_user").on(e.userId,e.createdAt),ir("idx_cli_setup_events_device").on(e.deviceId,e.createdAt)]);import{pgTable as Hi,text as Ne,integer as Ui,boolean as Bi,timestamp as Gi,jsonb as Vi,uuid as Fi,index as dr}from"drizzle-orm/pg-core";var ur=Hi("cli_error_events",{id:Fi("id").primaryKey().defaultRandom(),deviceId:Ne("device_id"),event:Ne("event").notNull(),command:Ne("command"),statusCode:Ui("status_code"),message:Ne("message"),cliVersion:Ne("cli_version"),os:Ne("os"),nodeVersion:Ne("node_version"),proxied:Bi("proxied"),props:Vi("props").notNull().default({}),createdAt:Gi("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[dr("idx_cli_error_events_created").on(e.createdAt),dr("idx_cli_error_events_device").on(e.deviceId,e.createdAt)]);import{sql as So}from"drizzle-orm";import{pgTable as $i,text as U,timestamp as Ji,jsonb as Lt,uuid as Ht,boolean as Qi,index as Ze,uniqueIndex as Yi}from"drizzle-orm/pg-core";var lr=$i("instruction_promotions",{id:Ht("id").primaryKey().defaultRandom(),userId:Ht("user_id").notNull(),evalTargetId:Ht("eval_target_id").notNull().references(()=>r.id,{onDelete:"cascade"}),instructionId:Ht("instruction_id").references(()=>n.id,{onDelete:"set null"}),fromContentHash:U("from_content_hash").notNull(),toContentHash:U("to_content_hash").notNull(),fromContent:U("from_content").notNull(),toContent:U("to_content").notNull(),proposalSource:U("proposal_source").notNull(),proposalRationale:U("proposal_rationale").notNull().default(""),decision:U("decision").notNull(),applied:Qi("applied").notNull().default(!1),refusals:Lt("refusals").notNull().default([]),rationale:U("rationale").notNull().default(""),effectClass:U("effect_class").notNull(),verdict:Lt("verdict").notNull().default({}),gates:Lt("gates").notNull().default({}),touchedSections:Lt("touched_sections").notNull().default([]),createdAt:Ji("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Ze("idx_instruction_promotions_budget").on(e.evalTargetId,e.createdAt.desc()).where(So`${e.applied}`),Ze("idx_instruction_promotions_target").on(e.evalTargetId,e.createdAt.desc()),Ze("idx_instruction_promotions_user").on(e.userId,e.createdAt.desc()),Ze("idx_instruction_promotions_to_hash").on(e.toContentHash),Yi("uq_instruction_promotions_applied").on(e.evalTargetId,e.fromContentHash,e.toContentHash).where(So`${e.applied}`),Ze("idx_instruction_promotions_applied_hash").on(e.toContentHash,e.createdAt.desc()).where(So`${e.applied}`)]);import{index as et,integer as Wi,jsonb as Xi,pgTable as Zi,text as y,timestamp as Pe,uniqueIndex as ea,uuid as Z}from"drizzle-orm/pg-core";var cr=Zi("recommendation_applications",{id:Z("id").primaryKey().defaultRandom(),userId:Z("user_id").notNull(),instructionId:Z("instruction_id").notNull().references(()=>n.id,{onDelete:"cascade"}),projectId:Z("project_id").references(()=>s.id,{onDelete:"set null"}),projectPath:y("project_path").notNull(),harness:y("harness").notNull(),targetPath:y("target_path").notNull(),status:y("status").notNull().default("proposed"),applyMode:y("apply_mode").notNull(),beforeHash:y("before_hash"),appliedHash:y("applied_hash"),appliedAt:Pe("applied_at",{withTimezone:!0}),measurementStartedAt:Pe("measurement_started_at",{withTimezone:!0}),measurementEndedAt:Pe("measurement_ended_at",{withTimezone:!0}),verdict:y("verdict"),verdictDetail:y("verdict_detail"),revertedAt:Pe("reverted_at",{withTimezone:!0}),sourceStudyId:Z("source_study_id").references(()=>T.id,{onDelete:"restrict"}),scopedConfirmationId:Z("scoped_confirmation_id").references(()=>Ye.id,{onDelete:"restrict"}),scopedConfirmationAssignmentId:Z("scoped_confirmation_assignment_id").references(()=>Rt.id,{onDelete:"restrict"}),boundaryClass:y("boundary_class"),targets:y("targets").array().notNull().default([]),inverse:Xi("inverse"),requires:y("requires").array().notNull().default([]),provides:y("provides").array().notNull().default([]),applyBatchId:Z("apply_batch_id"),applySeq:Wi("apply_seq"),createdAt:Pe("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:Pe("updated_at",{withTimezone:!0}).notNull().defaultNow()},e=>[ea("uq_recommendation_applications_target").on(e.userId,e.instructionId,e.projectPath,e.harness,e.targetPath),et("idx_recommendation_applications_user_status").on(e.userId,e.status,e.updatedAt.desc()),et("idx_recommendation_applications_user_harness").on(e.userId,e.harness,e.updatedAt.desc()),et("idx_recommendation_applications_project").on(e.projectId,e.updatedAt.desc()),et("idx_recommendation_applications_batch").on(e.userId,e.applyBatchId,e.applySeq.desc()),et("idx_recommendation_applications_requires").using("gin",e.requires)]);import{pgTable as ta,text as K,timestamp as _r,jsonb as tt,uuid as bo,integer as Ke,real as oa,index as ee,uniqueIndex as pr}from"drizzle-orm/pg-core";import{sql as Po}from"drizzle-orm";var te=ta("context_snapshots",{id:bo("id").primaryKey().defaultRandom(),sessionId:bo("session_id").references(()=>a.id,{onDelete:"cascade"}),userId:bo("user_id").notNull().references(()=>o.id,{onDelete:"cascade"}),sequence:Ke("sequence").notNull().default(0),provider:K("provider").notNull(),model:K("model").notNull(),systemPrompt:K("system_prompt").notNull(),injectedInstructions:tt("injected_instructions").notNull().default([]),messagesSummary:tt("messages_summary").notNull(),tools:tt("tools").notNull().default([]),systemHash:K("system_hash").notNull(),requestHash:K("request_hash").notNull().default(""),toolsHash:K("tools_hash"),injectedHash:K("injected_hash"),messagesDelta:tt("messages_delta").default([]),messagesDeltaRef:K("messages_delta_ref"),messagesBaseLength:Ke("messages_base_length"),payloadPrunedAt:_r("payload_pruned_at",{withTimezone:!0}),deltaOffloadState:K("delta_offload_state").notNull().default("inline"),deltaGzipBytes:Ke("delta_gzip_bytes"),deltaOffloadError:K("delta_offload_error"),deltaOffloadAttempts:Ke("delta_offload_attempts").notNull().default(0),maxTokens:Ke("max_tokens"),temperature:oa("temperature"),estimatedTokens:Ke("estimated_tokens"),capturedAt:_r("captured_at",{withTimezone:!0}).notNull().defaultNow(),metadata:tt("metadata").default({})},e=>[ee("idx_context_snapshots_session").on(e.sessionId),ee("idx_context_snapshots_user").on(e.userId),ee("idx_context_snapshots_hash").on(e.systemHash),ee("idx_context_snapshots_request_hash").on(e.requestHash),pr("idx_snapshots_session_request").on(e.sessionId,e.requestHash),pr("idx_snapshots_session_sequence").on(e.sessionId,e.sequence),ee("idx_context_snapshots_user_session_captured").on(e.userId,e.sessionId,e.capturedAt.desc()),ee("idx_snapshots_unpruned_captured").on(e.capturedAt,e.id).where(Po`${e.payloadPrunedAt} is null`),ee("idx_snapshots_pending_offload").on(e.deltaOffloadState,e.capturedAt,e.id).where(Po`${e.deltaOffloadState} = 'pending'`),ee("idx_snapshots_delta_ref").on(e.messagesDeltaRef).where(Po`${e.messagesDeltaRef} is not null`)]);import{pgTable as na,text as mr,timestamp as fr,jsonb as ra,integer as sa,index as ia}from"drizzle-orm/pg-core";var Nr=na("content_blobs",{hash:mr("hash").primaryKey(),contentType:mr("content_type").notNull(),content:ra("content").notNull(),sizeBytes:sa("size_bytes").notNull().default(0),createdAt:fr("created_at",{withTimezone:!0}).defaultNow(),lastReferencedAt:fr("last_referenced_at",{withTimezone:!0}).notNull().defaultNow()},e=>[ia("idx_content_blobs_type").on(e.contentType)]);import{integer as xr,jsonb as aa,pgTable as da,timestamp as ua,uuid as la}from"drizzle-orm/pg-core";var hr=da("session_capture_heads",{sessionId:la("session_id").primaryKey().references(()=>a.id,{onDelete:"cascade"}),sequence:xr("sequence").notNull(),rawMessageHashes:aa("raw_message_hashes").notNull().$type(),version:xr("version").notNull(),updatedAt:ua("updated_at",{withTimezone:!0}).notNull().defaultNow()});import{index as ca,integer as gr,pgTable as _a,text as Ko,timestamp as vr,uniqueIndex as pa,uuid as ma}from"drizzle-orm/pg-core";import{sql as fa}from"drizzle-orm";var Ir=_a("snapshot_delta_objects",{ref:Ko("ref").primaryKey(),snapshotId:ma("snapshot_id"),compressedBytes:gr("compressed_bytes").notNull(),state:Ko("state").notNull(),createdAt:vr("created_at",{withTimezone:!0}).notNull().defaultNow(),lastAttemptAt:vr("last_attempt_at",{withTimezone:!0}),attempts:gr("attempts").notNull().default(0),lastError:Ko("last_error")},e=>[ca("idx_snapshot_delta_objects_state_created").on(e.state,e.createdAt),pa("snapshot_delta_objects_snapshot_id_unique").on(e.snapshotId).where(fa`${e.snapshotId} is not null`)]);import{pgTable as Na,text as ot,timestamp as nt,jsonb as yr,uuid as wr,integer as Co,index as Tr}from"drizzle-orm/pg-core";var Ar=Na("agent_jobs",{id:wr("id").primaryKey().defaultRandom(),userId:wr("user_id").notNull(),taskKind:ot("task_kind").notNull(),status:ot("status").notNull().default("pending"),payload:yr("payload").notNull(),dedupeKey:ot("dedupe_key"),result:yr("result"),error:ot("error"),attempts:Co("attempts").notNull().default(0),claimedBy:ot("claimed_by"),claimedAt:nt("claimed_at",{withTimezone:!0}),leaseExpiresAt:nt("lease_expires_at",{withTimezone:!0}),leaseRecoveries:Co("lease_recoveries").notNull().default(0),hostSuspendRecoveries:Co("host_suspend_recoveries").notNull().default(0),createdAt:nt("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:nt("updated_at",{withTimezone:!0}).notNull().defaultNow(),completedAt:nt("completed_at",{withTimezone:!0})},e=>[Tr("idx_agent_jobs_claim").on(e.userId,e.status,e.taskKind,e.createdAt),Tr("idx_agent_jobs_dedupe").on(e.userId,e.taskKind,e.dedupeKey)]);import{pgTable as xa,text as rt,timestamp as st,jsonb as Ut,uuid as qo,index as Bt,integer as Oo}from"drizzle-orm/pg-core";var Dr=xa("insights_jobs",{id:qo("id").primaryKey().defaultRandom(),userId:qo("user_id").notNull(),status:rt("status").notNull().default("pending"),projectPath:rt("project_path"),projectId:qo("project_id").references(()=>s.id,{onDelete:"set null"}),config:Ut("config").notNull().default({}),progress:Ut("progress").notNull().default({}),result:Ut("result"),error:rt("error"),attempts:Oo("attempts").notNull().default(0),taskKind:rt("task_kind"),payload:Ut("payload"),claimedBy:rt("claimed_by"),claimedAt:st("claimed_at",{withTimezone:!0}),leaseExpiresAt:st("lease_expires_at",{withTimezone:!0}),leaseRecoveries:Oo("lease_recoveries").notNull().default(0),hostSuspendRecoveries:Oo("host_suspend_recoveries").notNull().default(0),createdAt:st("created_at",{withTimezone:!0}).defaultNow(),updatedAt:st("updated_at",{withTimezone:!0}).defaultNow(),completedAt:st("completed_at",{withTimezone:!0})},e=>[Bt("idx_insights_jobs_user").on(e.userId),Bt("idx_insights_jobs_status").on(e.status),Bt("idx_insights_jobs_pending").on(e.userId,e.status),Bt("idx_insights_jobs_project").on(e.projectId)]);import{pgTable as ha,text as Mo,timestamp as Gt,uuid as zr,index as ga,uniqueIndex as va}from"drizzle-orm/pg-core";var Ce=ha("api_keys",{id:zr("id").primaryKey().defaultRandom(),userId:zr("user_id").notNull().references(()=>o.id,{onDelete:"cascade"}),name:Mo("name").notNull(),keyHash:Mo("key_hash").notNull(),keyPrefix:Mo("key_prefix").notNull(),lastUsedAt:Gt("last_used_at",{withTimezone:!0}),expiresAt:Gt("expires_at",{withTimezone:!0}),revokedAt:Gt("revoked_at",{withTimezone:!0}),createdAt:Gt("created_at",{withTimezone:!0}).defaultNow()},e=>[ga("idx_api_keys_user").on(e.userId),va("idx_api_keys_hash").on(e.keyHash)]);import{pgTable as Ia,text as Lo,timestamp as jr,uuid as ya,index as wa}from"drizzle-orm/pg-core";var Rr=Ia("extension_auth_codes",{code:Lo("code").primaryKey(),userId:ya("user_id").notNull().references(()=>o.id,{onDelete:"cascade"}),editor:Lo("editor"),email:Lo("email"),expiresAt:jr("expires_at",{withTimezone:!0}).notNull(),createdAt:jr("created_at",{withTimezone:!0}).defaultNow()},e=>[wa("idx_ext_auth_codes_expiry").on(e.expiresAt)]);import{pgTable as Ta,text as Aa,timestamp as kr,jsonb as Da,uuid as Ho,index as Er}from"drizzle-orm/pg-core";var qe=Ta("eval_conversations",{id:Ho("id").primaryKey().defaultRandom(),evalTargetId:Ho("eval_target_id").notNull().references(()=>r.id,{onDelete:"cascade"}),userId:Ho("user_id").notNull(),messages:Da("messages").notNull().default([]),status:Aa("status").notNull().default("active"),createdAt:kr("created_at",{withTimezone:!0}).defaultNow(),updatedAt:kr("updated_at",{withTimezone:!0}).defaultNow()},e=>[Er("idx_eval_conversations_target").on(e.evalTargetId),Er("idx_eval_conversations_user").on(e.userId)]);import{pgTable as za,text as B,timestamp as Sr,jsonb as ja,uuid as Uo}from"drizzle-orm/pg-core";var br=za("skill_submissions",{id:Uo("id").primaryKey().defaultRandom(),skillId:B("skill_id").notNull(),name:B("name").notNull(),description:B("description").notNull(),category:B("category").notNull(),tools:B("tools").array().notNull(),tags:B("tags").array().default([]),content:B("content").notNull(),status:B("status").notNull().default("pending"),submittedBy:Uo("submitted_by").notNull(),reviewedBy:Uo("reviewed_by"),reviewNote:B("review_note"),metadata:ja("metadata"),createdAt:Sr("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Sr("updated_at",{withTimezone:!0}).defaultNow()});import{pgTable as Ra,text as it,timestamp as Pr,jsonb as ka,uuid as Ea,uniqueIndex as Sa,index as Kr}from"drizzle-orm/pg-core";var Cr=Ra("harness_releases",{id:Ea("id").primaryKey().defaultRandom(),harness:it("harness").notNull(),version:it("version").notNull(),publishedAt:Pr("published_at",{withTimezone:!0}).notNull(),title:it("title"),body:it("body"),categories:ka("categories").default({}),url:it("url"),createdAt:Pr("created_at",{withTimezone:!0}).defaultNow()},e=>[Sa("idx_harness_releases_unique").on(e.harness,e.version),Kr("idx_harness_releases_harness").on(e.harness),Kr("idx_harness_releases_published").on(e.publishedAt)]);import{pgTable as ba,text as Oe,timestamp as qr,jsonb as Pa,uuid as Or,index as Mr,uniqueIndex as Ka}from"drizzle-orm/pg-core";var Bo=ba("notifications",{id:Or("id").primaryKey().defaultRandom(),userId:Or("user_id").notNull(),type:Oe("type").notNull(),title:Oe("title").notNull(),body:Oe("body"),url:Oe("url"),sourceTable:Oe("source_table"),sourceId:Oe("source_id"),metadata:Pa("metadata").notNull().default({}),readAt:qr("read_at",{withTimezone:!0}),createdAt:qr("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Mr("idx_notifications_user_created").on(e.userId,e.createdAt),Mr("idx_notifications_user_unread").on(e.userId),Ka("idx_notifications_source_dedup").on(e.userId,e.sourceTable,e.sourceId)]);import{pgTable as Ca,text as at,timestamp as dt,jsonb as Go,uuid as Vo,index as Vt,integer as Fo}from"drizzle-orm/pg-core";var Me=Ca("launch_jobs",{id:Vo("id").primaryKey().defaultRandom(),userId:Vo("user_id").notNull(),tool:at("tool").notNull(),status:at("status").notNull().default("pending"),config:Go("config").notNull().default({}),result:Go("result"),error:at("error"),attempts:Fo("attempts").notNull().default(0),taskKind:at("task_kind"),payload:Go("payload"),claimedBy:at("claimed_by"),claimedAt:dt("claimed_at",{withTimezone:!0}),leaseExpiresAt:dt("lease_expires_at",{withTimezone:!0}),leaseRecoveries:Fo("lease_recoveries").notNull().default(0),hostSuspendRecoveries:Fo("host_suspend_recoveries").notNull().default(0),createdAt:dt("created_at",{withTimezone:!0}).defaultNow(),updatedAt:dt("updated_at",{withTimezone:!0}).defaultNow(),completedAt:dt("completed_at",{withTimezone:!0}),runId:Vo("run_id").references(()=>h.id,{onDelete:"set null"})},e=>[Vt("idx_launch_jobs_user").on(e.userId),Vt("idx_launch_jobs_status").on(e.status),Vt("idx_launch_jobs_pending").on(e.userId,e.status),Vt("idx_launch_jobs_run").on(e.runId)]);import{pgTable as Lr,uuid as G,text as oe,real as qa,timestamp as ut,boolean as Oa,uniqueIndex as Ma,index as lt}from"drizzle-orm/pg-core";var Hr=["add","remove","trim"],$o=Lr("instruction_suggestions",{id:G("id").primaryKey().defaultRandom(),userId:G("user_id").notNull().references(()=>o.id,{onDelete:"cascade"}),instructionId:G("instruction_id").notNull().references(()=>n.id,{onDelete:"cascade"}),projectPath:oe("project_path").notNull(),projectId:G("project_id").references(()=>s.id,{onDelete:"set null"}),score:qa("score").notNull(),reason:oe("reason").notNull(),kind:oe("kind").$type().notNull().default("add"),generatedAt:ut("generated_at",{withTimezone:!0}).notNull().defaultNow(),isStale:Oa("is_stale").notNull().default(!1),dismissedAt:ut("dismissed_at",{withTimezone:!0}),acceptedAt:ut("accepted_at",{withTimezone:!0}),declinedAt:ut("declined_at",{withTimezone:!0}),declinedReason:oe("declined_reason"),promotedToInstructionId:G("promoted_to_instruction_id").references(()=>n.id,{onDelete:"set null"})},e=>[Ma("idx_instruction_suggestions_user_project_instruction_kind").on(e.userId,e.projectPath,e.instructionId,e.kind),lt("idx_instruction_suggestions_user_project").on(e.userId,e.projectPath),lt("idx_instruction_suggestions_user_proj_id").on(e.userId,e.projectId),lt("idx_instruction_suggestions_generated_at").on(e.generatedAt)]),Ur=Lr("instruction_suggestion_events",{id:G("id").primaryKey().defaultRandom(),suggestionId:G("suggestion_id").notNull().references(()=>$o.id,{onDelete:"cascade"}),userId:G("user_id").notNull().references(()=>o.id,{onDelete:"cascade"}),eventType:oe("event_type").notNull(),tool:oe("tool"),sessionId:G("session_id"),projectPath:oe("project_path").notNull(),actor:oe("actor"),createdAt:ut("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[lt("idx_instruction_suggestion_events_suggestion_id").on(e.suggestionId),lt("idx_instruction_suggestion_events_user_id").on(e.userId)]);import{pgTable as La,text as Jo,integer as Ha,numeric as ct,timestamp as Qo,index as Ua,primaryKey as Ba}from"drizzle-orm/pg-core";var Br=La("model_pricing",{provider:Jo("provider").notNull(),modelId:Jo("model_id").notNull(),inputPerM:ct("input_per_m").notNull(),outputPerM:ct("output_per_m").notNull(),cacheReadPerM:ct("cache_read_per_m").notNull(),cacheWrite5mPerM:ct("cache_write_5m_per_m").notNull(),cacheWrite1hPerM:ct("cache_write_1h_per_m").notNull(),contextWindow:Ha("context_window"),effectiveFrom:Qo("effective_from",{withTimezone:!0}).notNull(),effectiveUntil:Qo("effective_until",{withTimezone:!0}),source:Jo("source").notNull(),verifiedAt:Qo("verified_at",{withTimezone:!0})},e=>[Ba({columns:[e.provider,e.modelId,e.effectiveFrom]}),Ua("idx_model_pricing_active").on(e.provider,e.modelId,e.effectiveFrom.desc())]);import{pgTable as Ga,text as xe,numeric as Gr,timestamp as Vr,uuid as Fr,jsonb as Va,index as $r}from"drizzle-orm/pg-core";var Jr=Ga("limit_observations",{id:Fr("id").primaryKey().defaultRandom(),observedAt:Vr("observed_at",{withTimezone:!0}).notNull().defaultNow(),provider:xe("provider").notNull(),plan:xe("plan").notNull(),limitType:xe("limit_type").notNull(),value:Gr("value").notNull(),unit:xe("unit").notNull(),comparator:xe("comparator").notNull().default("="),resetsAt:Vr("resets_at",{withTimezone:!0}),sourceType:xe("source_type").notNull(),sourceUrl:xe("source_url"),sourceEvidence:Va("source_evidence"),confidence:Gr("confidence").notNull(),userId:Fr("user_id")},e=>[$r("idx_limit_obs_lookup").on(e.provider,e.plan,e.limitType,e.observedAt.desc()),$r("idx_limit_obs_user").on(e.userId,e.observedAt.desc())]);import{pgTable as Fa,text as Ft,timestamp as $a,uuid as Ja,jsonb as Qa,boolean as Ya,uniqueIndex as Wa}from"drizzle-orm/pg-core";var Qr=Fa("provider_docs_snapshots",{id:Ja("id").primaryKey().defaultRandom(),fetchedAt:$a("fetched_at",{withTimezone:!0}).notNull().defaultNow(),provider:Ft("provider").notNull(),docUrl:Ft("doc_url").notNull(),contentHash:Ft("content_hash").notNull(),content:Ft("content").notNull(),parseSuccess:Ya("parse_success").notNull(),parseErrors:Qa("parse_errors")},e=>[Wa("idx_docs_dedup").on(e.provider,e.docUrl,e.contentHash)]);import{pgTable as Xa,text as $t,numeric as Yr,timestamp as Wr,uuid as Za,primaryKey as ed,index as td}from"drizzle-orm/pg-core";var Xr=Xa("plan_limits_active",{provider:$t("provider").notNull(),plan:$t("plan").notNull(),limitType:$t("limit_type").notNull(),value:Yr("value").notNull(),unit:$t("unit").notNull(),effectiveFrom:Wr("effective_from",{withTimezone:!0}).notNull(),effectiveUntil:Wr("effective_until",{withTimezone:!0}),confidence:Yr("confidence").notNull(),sourceObservationIds:Za("source_observation_ids").array().notNull()},e=>[ed({columns:[e.provider,e.plan,e.limitType,e.effectiveFrom]}),td("idx_plan_limits_lookup").on(e.provider,e.plan,e.limitType,e.effectiveFrom.desc())]);import{pgTable as od,text as Yo,timestamp as nd,uuid as Zr,jsonb as rd,index as sd}from"drizzle-orm/pg-core";var es=od("alert_dispatches",{id:Zr("id").primaryKey().defaultRandom(),userId:Zr("user_id").notNull(),alertKey:Yo("alert_key").notNull(),severity:Yo("severity").notNull(),lastDispatchedAt:nd("last_dispatched_at",{withTimezone:!0}).notNull().defaultNow(),lastState:rd("last_state").notNull(),channel:Yo("channel").notNull()},e=>[sd("idx_alert_user_key").on(e.userId,e.alertKey,e.lastDispatchedAt.desc())]);import{date as ts,integer as Wo,pgTable as os,primaryKey as id,text as ad,timestamp as Xo,uuid as dd}from"drizzle-orm/pg-core";var ns=os("weekly_digest_deliveries",{userId:dd("user_id").notNull().references(()=>o.id,{onDelete:"cascade"}),weekStart:ts("week_start").notNull(),sentAt:Xo("sent_at",{withTimezone:!0}).notNull().defaultNow(),providerMessageId:ad("provider_message_id")},e=>[id({columns:[e.userId,e.weekStart]})]),rs=os("weekly_digest_runs",{weekStart:ts("week_start").primaryKey(),startedAt:Xo("started_at",{withTimezone:!0}).notNull().defaultNow(),finishedAt:Xo("finished_at",{withTimezone:!0}),sent:Wo("sent"),skipped:Wo("skipped"),failed:Wo("failed")});import{pgTable as ud,text as Zo,timestamp as ss,uuid as en,integer as ld,index as cd,unique as _d}from"drizzle-orm/pg-core";var is=ud("scaffolding_fingerprints",{id:en("id").primaryKey().defaultRandom(),userId:en("user_id").notNull(),harness:Zo("harness").notNull(),model:Zo("model").notNull(),toolsHash:Zo("tools_hash").notNull(),firstSeenAt:ss("first_seen_at",{withTimezone:!0}).notNull().defaultNow(),lastSeenAt:ss("last_seen_at",{withTimezone:!0}).notNull().defaultNow(),snapshotCount:ld("snapshot_count").notNull().default(1),firstSessionId:en("first_session_id")},e=>[_d("scaffolding_fingerprints_user_id_harness_model_tools_hash_key").on(e.userId,e.harness,e.model,e.toolsHash),cd("idx_scaffolding_fp_segment").on(e.userId,e.harness,e.model)]);import{pgTable as pd,text as tn,timestamp as md,jsonb as fd,uuid as as,integer as Nd,unique as xd}from"drizzle-orm/pg-core";var ds=pd("scaffolding_segments",{id:as("id").primaryKey().defaultRandom(),userId:as("user_id").notNull(),harness:tn("harness").notNull(),model:tn("model").notNull(),coreNames:fd("core_names").notNull(),coreHash:tn("core_hash").notNull(),activeFingerprints:Nd("active_fingerprints").notNull(),computedAt:md("computed_at",{withTimezone:!0}).notNull().defaultNow()},e=>[xd("scaffolding_segments_user_id_harness_model_key").on(e.userId,e.harness,e.model)]);import{pgTable as hd,text as ne,timestamp as us,uuid as on,uniqueIndex as gd,index as vd}from"drizzle-orm/pg-core";var ls=["blog","docs","changelog"],nn=hd("vendor_guidance_snapshots",{id:on("id").primaryKey().defaultRandom(),fetchedAt:us("fetched_at",{withTimezone:!0}).notNull().defaultNow(),sourceId:ne("source_id").notNull(),harness:ne("harness").notNull(),vendor:ne("vendor").notNull(),kind:ne("kind").$type().notNull(),url:ne("url").notNull(),title:ne("title").notNull(),contentHash:ne("content_hash").notNull(),text:ne("text").notNull(),previousSnapshotId:on("previous_snapshot_id").references(()=>nn.id,{onDelete:"set null"}),pitchedAt:us("pitched_at",{withTimezone:!0}),pitchInstructionId:on("pitch_instruction_id").references(()=>n.id,{onDelete:"set null"})},e=>[gd("idx_vendor_guidance_dedup").on(e.sourceId,e.contentHash),vd("idx_vendor_guidance_source_fetched").on(e.sourceId,e.fetchedAt)]);import{drizzle as fs}from"drizzle-orm/postgres-js";import Ns from"postgres";var Jt={};Ks(Jt,{GUIDANCE_KINDS:()=>ls,SUGGESTION_KINDS:()=>Hr,agentJobs:()=>Ar,agentRuns:()=>h,agentRunsRelations:()=>Kd,alertDispatches:()=>es,announcementDeliveries:()=>mn,announcements:()=>pn,apiKeys:()=>Ce,apiKeysRelations:()=>yd,benchmarks:()=>je,benchmarksRelations:()=>$d,cliErrorEvents:()=>ur,cliSetupEvents:()=>ar,contentBlobs:()=>Nr,contextSnapshots:()=>te,contextSnapshotsRelations:()=>Yd,evalComparisons:()=>Cn,evalConversations:()=>qe,evalConversationsRelations:()=>Qd,evalGradeAnnotations:()=>qn,evalJobs:()=>P,evalJobsRelations:()=>Jd,evalRuns:()=>b,evalRunsRelations:()=>Fd,evalTargets:()=>r,evalTargetsRelations:()=>Gd,evals:()=>H,evalsRelations:()=>Vd,extensionAuthCodes:()=>Rr,harnessReleases:()=>Cr,insightRecommendationLog:()=>Fn,insightsJobs:()=>Dr,instructionEvents:()=>we,instructionEventsRelations:()=>Rd,instructionExperimentArms:()=>Pn,instructionExperiments:()=>ue,instructionPromotions:()=>lr,instructionSuggestionEvents:()=>Ur,instructionSuggestions:()=>$o,instructionUsageEvents:()=>be,instructionUsageEventsRelations:()=>Bd,instructionVerdicts:()=>Vn,instructionVersionIdentities:()=>In,instructionVersions:()=>ye,instructionVersionsRelations:()=>Ed,instructions:()=>n,instructionsRelations:()=>jd,judgeReviewerVerdicts:()=>On,launchJobs:()=>Me,launchJobsRelations:()=>Cd,limitObservations:()=>Jr,memories:()=>D,memoriesRelations:()=>kd,memoryExperiments:()=>Yn,modelPricing:()=>Br,notificationPreferences:()=>fn,notifications:()=>Bo,orgInvitations:()=>C,orgInvitationsRelations:()=>Ad,organizations:()=>l,organizationsRelations:()=>wd,packInstructions:()=>X,packInstructionsRelations:()=>Ud,packs:()=>R,packsRelations:()=>Hd,pendingTreatmentExposures:()=>En,performanceStudies:()=>T,performanceStudiesRelations:()=>Wd,performanceStudyCalls:()=>ce,performanceStudyCallsRelations:()=>Xd,planLimitsActive:()=>Xr,profiles:()=>o,profilesRelations:()=>Id,projectCheckouts:()=>Tn,projectInstructions:()=>J,projectInstructionsRelations:()=>bd,projects:()=>s,projectsRelations:()=>Sd,providerDocsSnapshots:()=>Qr,recommendationApplications:()=>cr,scaffoldingFingerprints:()=>is,scaffoldingSegments:()=>ds,scopedLiveConfirmationAssignments:()=>Rt,scopedLiveConfirmations:()=>Ye,sessionCaptureHeads:()=>hr,sessionEvents:()=>Ae,sessionEventsRelations:()=>qd,sessionInstructions:()=>Q,sessionInstructionsRelations:()=>Od,sessionSendJobs:()=>Zn,sessionTerminalTargets:()=>bt,sessions:()=>a,sessionsRelations:()=>Pd,skillSubmissions:()=>br,snapshotDeltaObjects:()=>Ir,teams:()=>v,teamsRelations:()=>Td,treatmentAssignments:()=>O,treatmentAssignmentsRelations:()=>Md,treatmentExposures:()=>M,treatmentExposuresRelations:()=>Ld,userOrganizations:()=>ve,userOrganizationsRelations:()=>Dd,userTeams:()=>Ie,userTeamsRelations:()=>zd,vendorGuidanceSnapshots:()=>nn,weeklyDigestDeliveries:()=>ns,weeklyDigestRuns:()=>rs,workerConnections:()=>rr});import{relations as i}from"drizzle-orm";var Id=i(o,({many:e})=>({sessions:e(a),contextSnapshots:e(te),apiKeys:e(Ce)})),yd=i(Ce,({one:e})=>({profile:e(o,{fields:[Ce.userId],references:[o.id]})})),wd=i(l,({many:e})=>({teams:e(v),userOrganizations:e(ve),projects:e(s),invitations:e(C)})),Td=i(v,({one:e,many:t})=>({organization:e(l,{fields:[v.orgId],references:[l.id]}),userTeams:t(Ie),invitations:t(C)})),Ad=i(C,({one:e})=>({organization:e(l,{fields:[C.orgId],references:[l.id]}),team:e(v,{fields:[C.teamId],references:[v.id]}),inviter:e(o,{fields:[C.invitedBy],references:[o.id]})})),Dd=i(ve,({one:e})=>({organization:e(l,{fields:[ve.orgId],references:[l.id]})})),zd=i(Ie,({one:e})=>({team:e(v,{fields:[Ie.teamId],references:[v.id]})})),jd=i(n,({one:e,many:t})=>({versions:t(ye),projectInstructions:t(J),events:t(we),usageEvents:t(be),sessionInstructions:t(Q),packInstructions:t(X),forkedFrom:e(n,{fields:[n.forkedFromId],references:[n.id]})})),Rd=i(we,({one:e})=>({instruction:e(n,{fields:[we.instructionId],references:[n.id]})})),kd=i(D,({one:e,many:t})=>({project:e(s,{fields:[D.projectId],references:[s.id]}),parent:e(D,{fields:[D.parentId],references:[D.id]}),versions:t(D)})),Ed=i(ye,({one:e})=>({instruction:e(n,{fields:[ye.instructionId],references:[n.id]})})),Sd=i(s,({one:e,many:t})=>({organization:e(l,{fields:[s.orgId],references:[l.id]}),projectInstructions:t(J),sessions:t(a)})),bd=i(J,({one:e})=>({project:e(s,{fields:[J.projectId],references:[s.id]}),instruction:e(n,{fields:[J.instructionId],references:[n.id]})})),Pd=i(a,({one:e,many:t})=>({profile:e(o,{fields:[a.userId],references:[o.id]}),project:e(s,{fields:[a.projectId],references:[s.id]}),run:e(h,{fields:[a.runId],references:[h.id]}),events:t(Ae),sessionInstructions:t(Q),treatmentExposures:t(M),contextSnapshots:t(te)})),Kd=i(h,({one:e,many:t})=>({profile:e(o,{fields:[h.userId],references:[o.id]}),organization:e(l,{fields:[h.orgId],references:[l.id]}),project:e(s,{fields:[h.projectId],references:[s.id]}),sessions:t(a),launchJobs:t(Me)})),Cd=i(Me,({one:e})=>({run:e(h,{fields:[Me.runId],references:[h.id]})})),qd=i(Ae,({one:e})=>({session:e(a,{fields:[Ae.sessionId],references:[a.id]})})),Od=i(Q,({one:e})=>({session:e(a,{fields:[Q.sessionId],references:[a.id]}),instruction:e(n,{fields:[Q.instructionId],references:[n.id]})})),Md=i(O,({one:e,many:t})=>({owner:e(o,{fields:[O.userId],references:[o.id]}),project:e(s,{fields:[O.projectId],references:[s.id]}),exposures:t(M)})),Ld=i(M,({one:e})=>({session:e(a,{fields:[M.sessionId],references:[a.id]}),owner:e(o,{fields:[M.userId],references:[o.id]}),assignment:e(O,{fields:[M.assignmentId],references:[O.id]})})),Hd=i(R,({one:e,many:t})=>({packInstructions:t(X),forkedFrom:e(R,{fields:[R.forkedFromId],references:[R.id]})})),Ud=i(X,({one:e})=>({pack:e(R,{fields:[X.packId],references:[R.id]}),instruction:e(n,{fields:[X.instructionId],references:[n.id]})})),Bd=i(be,({one:e})=>({instruction:e(n,{fields:[be.instructionId],references:[n.id]})})),Gd=i(r,({one:e,many:t})=>({parent:e(r,{fields:[r.parentId],references:[r.id]}),evals:t(H),evalRuns:t(b),benchmarks:t(je),evalJobs:t(P),evalConversations:t(qe)})),Vd=i(H,({one:e,many:t})=>({evalTarget:e(r,{fields:[H.evalTargetId],references:[r.id]}),runs:t(b)})),Fd=i(b,({one:e})=>({eval:e(H,{fields:[b.evalId],references:[H.id]}),evalTarget:e(r,{fields:[b.evalTargetId],references:[r.id]})})),$d=i(je,({one:e})=>({evalTarget:e(r,{fields:[je.evalTargetId],references:[r.id]})})),Jd=i(P,({one:e})=>({evalTarget:e(r,{fields:[P.evalTargetId],references:[r.id]})})),Qd=i(qe,({one:e})=>({evalTarget:e(r,{fields:[qe.evalTargetId],references:[r.id]})})),Yd=i(te,({one:e})=>({session:e(a,{fields:[te.sessionId],references:[a.id]}),profile:e(o,{fields:[te.userId],references:[o.id]})})),Wd=i(T,({one:e,many:t})=>({target:e(r,{fields:[T.evalTargetId],references:[r.id]}),calls:t(ce)})),Xd=i(ce,({one:e})=>({study:e(T,{fields:[ce.studyId],references:[T.id]}),job:e(P,{fields:[ce.jobId],references:[P.id]})}));var _t=0,cs=0,pt=0,_s=0;var Zd=0;function rn(){_t++,_t>cs&&(cs=_t)}m(rn,"trackDbOpStart");function sn(){_t>0&&_t--}m(sn,"trackDbOpEnd");function an(){pt++,pt>_s&&(_s=pt)}m(an,"trackHeavyDbOpStart");function dn(){pt>0&&pt--}m(dn,"trackHeavyDbOpEnd");function ps(){Zd++}m(ps,"recordQueryDeadline");var Yt,Xt,un=!1,Qt;var ms,Zt,Wt;function xs(e){let t=process.env[e];if(!t)throw new Error(`Missing required env var: ${e}`);return t}m(xs,"getEnv");function hs(){if(un)throw new Error("getDb() called after closeDb(): the connection pool is closed for shutdown. Stop issuing queries (timers/requests) before draining the pool.");if(!Yt){let e=process.env.PG_APPLICATION_NAME||"rulemetric",t=Number(process.env.PG_POOL_MAX)||3,d=Number(process.env.PG_CONNECT_TIMEOUT_S)||10,u=Number(process.env.PG_STATEMENT_TIMEOUT_MS)||0,p=Number(process.env.PG_IDLE_TIMEOUT)||5,x=Number(process.env.PG_KEEP_ALIVE_S)||60;Xt=Ns(xs("DATABASE_URL"),{prepare:!1,max:t,connect_timeout:d,idle_timeout:p,keep_alive:x,max_lifetime:300,connection:{application_name:e,...u>0?{statement_timeout:u}:{}}}),Yt=fs(Xt,{schema:Jt})}return Yt}m(hs,"getDb");function gs(){if(un)throw new Error("getHeavyDb() 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")+":heavy",t=Number(process.env.PG_HEAVY_POOL_MAX)||2;Zt=Ns(xs("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}}),Wt=fs(Zt,{schema:Jt})}return Wt}m(gs,"getHeavyDb");async function eu(){if(Qt)return Qt;un=!0;let e=Xt,t=ms,d=Zt;return Xt=void 0,Yt=void 0,ms=void 0,Zt=void 0,Wt=void 0,Qt=Promise.allSettled([e?e.end({timeout:5}):Promise.resolve(),t?t.end({timeout:5}):Promise.resolve(),d?d.end({timeout:5}):Promise.resolve()]).then(()=>{}),Qt}m(eu,"closeDb");var tu=new Set(["CONNECT_TIMEOUT","ETIMEDOUT","ENOTFOUND","ECONNREFUSED","EAI_AGAIN"]);function vs(e){let t=e,d=t?.code??t?.cause?.code??t?.errno;return d!==void 0&&tu.has(d)}m(vs,"isRetryableConnectError");var ou=new Set(["CONNECTION_CLOSED","ECONNRESET","EPIPE"]);function Is(e){let t=e,d=t?.code??t?.cause?.code??t?.errno;return d!==void 0&&ou.has(d)}m(Is,"isRetryableResetError");async function ys(e,t={}){let d=t.attempts??3,u=t.baseMs??100,p;for(let x=0;x<d;x++)try{return await e()}catch(z){p=z;let V=vs(z)||t.retryResets===!0&&Is(z);if(x===d-1||!V)throw z;await new Promise(re=>setTimeout(re,u*2**x))}throw p}m(ys,"withDbRetry");var eo=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 ws(){let e=Number(process.env.PG_QUERY_DEADLINE_MS);return Number.isFinite(e)&&e>=0?e:2e4}m(ws,"queryDeadlineMs");function Ts(){let e=Number(process.env.PG_HEAVY_QUERY_DEADLINE_MS);return Number.isFinite(e)&&e>=0?e:6e4}m(Ts,"heavyQueryDeadlineMs");function nu(e,t,d=!0){let u,p=new Promise((x,z)=>{u=setTimeout(()=>{d&&ps(),z(new eo(t))},t);let V=u;typeof V.unref=="function"&&V.unref()});return Promise.race([e,p]).finally(()=>clearTimeout(u))}m(nu,"raceWithDeadline");var As=new Set(["select","selectDistinct","selectDistinctOn","insert","update","delete","execute","with","$count","refreshMaterializedView"]),Ds=new Set(["select","selectDistinct","selectDistinctOn","$count"]);function ln(e,t=!1,d=0,u=!1){return e===null||typeof e!="object"&&typeof e!="function"?e:new Proxy(e,{get(p,x,z){if(x==="then"){let re=Reflect.get(p,x,z);return typeof re!="function"?re:(Rs,ks)=>{let Es=u?an:rn,Ss=u?dn:sn;Es();let cn=ys(()=>new Promise((bs,Ps)=>re.call(p,bs,Ps)),{retryResets:t});return(d>0?nu(cn,d,!u):cn).finally(Ss).then(Rs,ks)}}let V=Reflect.get(p,x,z);return typeof V=="function"?(...re)=>ln(V.apply(p,re),t,d,u):V}})}m(ln,"wrapBuilder");function zs(e,t=!1){let d=t?an:rn,u=t?dn:sn;d();try{return Promise.resolve(e()).finally(u)}catch(p){throw u(),p}}m(zs,"gaugeTransaction");var js=new Proxy({},{get(e,t){let d=hs(),u=d[t];if(typeof t=="string"&&As.has(t)&&typeof u=="function"){let p=Ds.has(t),x=ws();return(...z)=>ln(u.apply(d,z),p,x)}return t==="transaction"&&typeof u=="function"?(...p)=>zs(()=>u.apply(d,p)):u}}),ru=new Proxy({},{get(e,t){let d=gs(),u=d[t];if(typeof t=="string"&&As.has(t)&&typeof u=="function"){let p=Ds.has(t);return(...x)=>ln(u.apply(d,x),p,Ts(),!0)}return t==="transaction"&&typeof u=="function"?(...p)=>zs(()=>u.apply(d,p),!0):u}});export{pn as a,hs as b,eu as c};
@@ -1,2 +1,2 @@
1
- import{c as E,n as m}from"./chunk-GJHFIQVO.js";import{a as d}from"./chunk-GIXHG5FK.js";import{a as c}from"./chunk-ZLLER3HP.js";import*as p from"node:fs";import*as u from"node:path";import*as _ from"node:os";function T(){if(process.env.RULEMETRIC_API_KEY||process.env.RULEMETRIC_ACCESS_TOKEN)return;let s=u.join(_.homedir(),".config","rulemetric","env");C(s)||C(u.join(process.cwd(),".env.local"))}c(T,"ensureEnv");function C(s){try{let t=p.readFileSync(s,"utf-8");for(let n of t.split(`
1
+ import{c as E,n as m}from"./chunk-CPDW7WW2.js";import{a as d}from"./chunk-GIXHG5FK.js";import{a as c}from"./chunk-ZLLER3HP.js";import*as p from"node:fs";import*as u from"node:path";import*as _ from"node:os";function T(){if(process.env.RULEMETRIC_API_KEY||process.env.RULEMETRIC_ACCESS_TOKEN)return;let s=u.join(_.homedir(),".config","rulemetric","env");C(s)||C(u.join(process.cwd(),".env.local"))}c(T,"ensureEnv");function C(s){try{let t=p.readFileSync(s,"utf-8");for(let n of t.split(`
2
2
  `)){let e=n.trim();if(!e||e.startsWith("#"))continue;let o=e.indexOf("=");if(o<0)continue;let r=e.slice(0,o).trim(),i=e.slice(o+1).trim();process.env[r]||(process.env[r]=i)}return!!(process.env.RULEMETRIC_API_KEY||process.env.RULEMETRIC_ACCESS_TOKEN)}catch{return!1}}c(C,"loadEnvFile");T();async function I(s){let t={totalSessions:0,totalCalls:0,totalInputTokens:0,totalOutputTokens:0,totalCacheReadTokens:0,totalCacheWriteTokens:0,totalCostUSD:0,providers:{}},n=await m(s);t.providers={};for(let a of n)t.providers[a.provider]=(t.providers[a.provider]||0)+1;let e=new E,o=n.filter(a=>a.provider==="claude");for(let a of o)try{let h=p.readdirSync(a.path).filter(f=>f.endsWith(".jsonl"));t.totalSessions+=h.length;for(let f of h){let v=p.readFileSync(u.join(a.path,f),"utf-8"),R=e.parse(v);for(let l of R.events)l.tokenUsage&&(t.totalCalls++,t.totalInputTokens+=l.tokenUsage.input,t.totalOutputTokens+=l.tokenUsage.output,t.totalCacheReadTokens+=l.tokenUsage.cacheRead??0,t.totalCacheWriteTokens+=l.tokenUsage.cacheWrite??0)}}catch{}let r=15,i=75;return t.totalCostUSD=Math.round((t.totalInputTokens/1e6*r+t.totalOutputTokens/1e6*i+t.totalCacheReadTokens/1e6*(r*.1)+t.totalCacheWriteTokens/1e6*(r*1.25))*100)/100,t}c(I,"loadLocalStats");async function U(s){let t=process.env.RULEMETRIC_API_URL??d,n=process.env.RULEMETRIC_API_KEY,e=process.env.RULEMETRIC_ACCESS_TOKEN,o=n??e;if(!o)return null;let r=new URLSearchParams;s&&r.set("projectPath",s);try{let i=await fetch(`${t}/api/insights/compute?${r}`,{headers:{Authorization:`Bearer ${o}`},signal:AbortSignal.timeout(5e3)});return i.ok?await i.json():null}catch{return null}}c(U,"loadApiInsights");async function g(s){let t=process.env.RULEMETRIC_API_URL??d,n=process.env.RULEMETRIC_API_KEY??process.env.RULEMETRIC_ACCESS_TOKEN;if(!n)return null;let e=new URLSearchParams;s&&e.set("projectPath",s);try{let o=await fetch(`${t}/api/insights/linked-instructions?${e}`,{headers:{Authorization:`Bearer ${n}`},signal:AbortSignal.timeout(5e3)});return o.ok?await o.json():null}catch{return null}}c(g,"loadLinkedInstructions");export{I as a,U as b,g as c};
@@ -1 +1 @@
1
- import{a as _e}from"./chunk-M7QSC64D.js";import{i as Me}from"./chunk-7LFCZI64.js";import{a as Pe}from"./chunk-ISEUEYSC.js";import{b as pe,i as me,j as ge,k as fe,l as he,m as be,n as $e}from"./chunk-GYKYJJNF.js";import{c as Re}from"./chunk-G7V4ZZZ3.js";import{a as xe,b as Se,c as De,d as Ie,e as se,f as Oe}from"./chunk-LJE5J3EW.js";import{a as re}from"./chunk-AHLVY52I.js";import{d as ke,f as Ce,g as Ee,i as Ae}from"./chunk-YXMAGC53.js";import{a as we}from"./chunk-T7HZZ4DJ.js";import{c as ye}from"./chunk-FADINV4H.js";import{b as ve}from"./chunk-SWSOEYC7.js";import{d as ue,e as ne,f as de}from"./chunk-KFNFLMUR.js";import{e as y,f as te}from"./chunk-GIXHG5FK.js";import{a as g}from"./chunk-ZLLER3HP.js";import{createHash as Ge}from"node:crypto";import{existsSync as Te,readFileSync as Ne,writeFileSync as Xe}from"node:fs";var H=g(t=>Ge("sha256").update(t).digest("hex"),"sha256"),Le=1.3,ae=4,ze=20;function Be(t,o){if(!t.configured||o<=0)return ae;let e=Math.ceil(t.minPairs*Le/o);return Math.min(ze,Math.max(ae,e))}g(Be,"passCapFor");function Qe(t,o=10,e=ae){if(t<=0)return{passes:0,expectedPairs:0,feasible:!1,reason:"no live cases"};let i=Math.ceil(o*Le),l=Math.min(e,Math.ceil(i/t)),r=l*t;return r<o?{passes:l,expectedPairs:r,feasible:!1,reason:`${t} live case(s) x ${e} passes = ${t*e} pairs at best, below the ${o} a controlled verdict requires \u2014 add cases rather than replaying these`}:{passes:l,expectedPairs:r,feasible:!0}}g(Qe,"planPasses");var Ve=60,Ye=5,We=g(t=>Array.isArray(t)?t.filter(o=>typeof o=="string"):[],"stringList"),J=g(t=>typeof t=="number"&&Number.isFinite(t)?t:null,"finite");function Ze(t,o,e=Ye){let i=[...t].filter(s=>s.fromContentHash===o).sort((s,c)=>Date.parse(c.createdAt)-Date.parse(s.createdAt)),l=[],r=new Set;for(let s of i){let c=s.toContentHash??s.id;if(r.has(c))continue;r.add(c);let d=s.verdict??null,k=J(d?.delta),M=J(d?.ci?.lower),x=J(d?.ci?.upper),S=J(d?.nWith),L=d?.sufficient===!0&&k!=null&&M!=null&&x!=null&&S!=null?{delta:k,ciLower:M,ciUpper:x,nPairs:S}:null;if(l.push({decision:typeof s.decision=="string"?s.decision:"unknown",applied:s.applied===!0,at:typeof s.createdAt=="string"?s.createdAt:"",rationale:typeof s.proposalRationale=="string"?s.proposalRationale:"",touched:We(s.touchedSections),refusals:We(s.refusals),measured:L}),l.length>=e)break}return l}g(Ze,"summarisePriorDecisions");function et(t,o){let e=o.accumulate??(t.autoEvolveAccumulate===!0||t.autoEvolveAccumulate==="true"),i=o.accumulateTargetPairs??t.autoEvolveAccumulateTarget,l=typeof i=="string"?Number.parseInt(i,10):i,r=typeof l=="number"&&Number.isInteger(l)&&l>0?l:Ve;return{enabled:e,targetPairs:r}}g(et,"readAccumulateConfig");function tt(t){let o=t.accumulateEnabled&&t.pairCount<t.targetPairs;return{apply:t.consented&&!o,peeking:o}}g(tt,"resolveApply");async function Pt(t,o){if(t.restoration)return Pe(t.evalTargetId,t.restoration);let e=g(n=>o?.logger?.info?.(n)??console.log(n),"log"),{evalTargetId:i}=t,l=t.measurement?ye(t):{},r=`[cron_instruction_evolution] ${i}`,s=await y(`/api/eval-targets/${i}`),c=s.metadata??{},d=t.measurement?JSON.stringify([l.engine,l.model,l.graderEngine,l.graderModel,s.type,ve(t.measurement.engine)]):void 0,k=null,M=!1;if(s.name.startsWith("/")&&Te(s.name))try{if(k=Ne(s.name,"utf8"),k!==s.content){let n=await te(`/api/eval-targets/${i}/sync-content`,{content:k});M=n.synced,e(`${r}: target content drifted from disk by ${Math.abs(k.length-s.content.length)} chars \u2014 synced to disk truth (v${n.version}). Prior verdicts against the old text dissolve via content-hash keying.`),s={...s,content:k,version:n.version}}}catch(n){e(`${r}: disk sync failed (${n instanceof Error?n.message:String(n)}) \u2014 measuring the stored snapshot`)}let x=!1;try{x=(await y("/api/settings/evolution-account")).paused}catch(n){e(`${r}: could not read the account switch (${n instanceof Error?n.message:String(n)}) \u2014 pausing to be safe`),x=!0}if(x)return e(`${r}: PAUSED for the whole account (profiles.evolution_paused) \u2014 no model budget spent.`),{skipped:"paused-account"};if(ge(c))return e(`${r}: PAUSED (metadata.autoEvolvePaused) \u2014 no model budget spent. Opt-in is intact.`),{skipped:"paused"};let S=_e(s);if(S)return e(`${r}: ${S.reason}`),S;let L=t.apply??(c.autoEvolveApply===!0||c.autoEvolveApply==="true"),F=nt(c);if(F==null){if(L)return e(`${r}: refusing \u2014 metadata.immutableSections is unset. Set it (use [] to explicitly protect nothing) before letting the loop edit this target unattended.`),{skipped:"immutable-sections-unset"};e(`${r}: metadata.immutableSections unset \u2014 measure-only cycle proceeds with [] (nothing protected). Writing still requires setting it explicitly.`),F=[]}let v=(await y(`/api/eval-targets/${i}/evals`)).filter(n=>!n.retiredAt);if(v.length===0)return{skipped:"no-live-cases"};let j=me(c);j.note&&e(`${r}: ${j.note}`);let C=Qe(v.length,j.minPairs,Be(j,v.length));if(!C.feasible)return e(`${r}: cannot reach a sufficient verdict \u2014 ${C.reason}`),{skipped:"cannot-reach-min-n",reason:C.reason};let Fe=fe({liveCases:v.length,passes:C.passes});e(`${r}: budget for this run \u2014 ${$e(Fe)}`);let G=await y(`/api/eval-targets/${i}/judge-calibration`);if(!G.powerCheck.adequate){let n=(G.powerCheck.reasons??[]).join("; ");return e(`${r}: not adequately powered, skipping before spending budget \u2014 ${n}`),{skipped:"not-adequate",reason:n}}let oe=de,je=Date.now()-oe*24*60*60*1e3,X=await y(`/api/eval-targets/${i}/promotions?limit=200`),ie=X.promotions.filter(n=>n.applied&&Date.parse(n.createdAt)>=je).length;if(ie>=ne)return e(`${r}: change budget looks exhausted (${ie}/${ne} applied in ${oe}d), skipping before spending budget`),{skipped:"budget-exhausted"};try{let n=await y("/api/usage/current-limits"),u=Re({limits:n,now:new Date});if(!u.ok)return e(`${r}: deferring before spending budget \u2014 ${u.reason}`),{skipped:"quota-exhausted",reason:u.reason}}catch(n){e(`${r}: quota unknown (${n instanceof Error?n.message:String(n)}) \u2014 proceeding`)}let U=ue();if(!U.green)return e(`${r}: A/A canary is RED \u2014 halting. ${U.failures.join(" | ")}`),{skipped:"canary-red",reason:U.failures.join(" | ")};let z=s.content,D=H(z),f=et(c,t),w=f.enabled?re(X.promotions,D,f.targetPairs,d):null,b,q,$=[],_=0,B=pe,p=w?null:Se(c,D,d);if(p){b=p.content,q="",B=0;try{$=await Ie({evalTargetId:i,candidateContentHash:p.hash,executionKey:d,observedKey:p.observedKey})}catch(n){return e(`${r}: could not rebuild banked pairs (${n instanceof Error?n.message:String(n)})`),{skipped:"resume-read-failed",reason:p.hash}}e(`${r}: resuming interrupted cycle \u2014 ${$.length}/${p.plannedPairs} pair(s) rebuilt from eval_runs, no proposal call spent`)}else if(w){let n=await y(`/api/promotions/${w.promotionId}`);if(H(n.toContent)!==w.candidateContentHash)return e(`${r}: stored candidate does not match its recorded hash \u2014 refusing to continue`),{skipped:"accumulation-hash-mismatch",reason:w.promotionId};b=n.toContent,q=n.proposalRationale??"",$=w.pairs,_=w.runs,B=0,e(`${r}: continuing accumulation ${w.promotionId} \u2014 ${$.length}/${f.targetPairs} pair(s) carried from ${_} prior run(s)`)}else{let n=G.caseDiscrimination?.cases??[],u=[];if(s.name.startsWith("/")){let a=s.name.slice(0,s.name.lastIndexOf("/"));try{let m=await y(`/api/insights/evidence?projectPath=${encodeURIComponent(a)}`);m.analyzedAt&&(u=[...m.friction.map(ee=>`Real-session friction (insights, ${m.analyzedAt.slice(0,10)}): ${ee}`),...m.whatWorks.map(ee=>`Working well in real sessions \u2014 do not break: ${ee}`)],u.length>0&&e(`${r}: proposer sees ${m.friction.length} friction + ${m.whatWorks.length} what-works item(s) from insights`))}catch(m){e(`${r}: insights evidence unavailable (${m instanceof Error?m.message:String(m)}) \u2014 proposing without it`)}}let N=[];try{N=Ze(X.promotions,D)}catch(a){e(`${r}: could not summarise prior decisions (${a instanceof Error?a.message:String(a)}) \u2014 proposing without them`)}N.length>0&&e(`${r}: proposer sees ${N.length} prior decision(s) against this exact body (${N.map(a=>`${a.decision}${a.measured?"/measured":""}`).join(", ")})`);let W=await Me({currentContent:s.content,targetType:s.type,targetName:s.name,immutableSections:F,evidence:{nonDiscriminating:n.filter(a=>!a.discriminating).map(a=>`${a.name??a.assertion??"unnamed"} \u2014 ${a.note}`),weakest:n.filter(a=>a.discriminating&&a.withPassRate<a.withoutPassRate).map(a=>({name:a.name??a.assertion??"unnamed",withPassRate:a.withPassRate,withoutPassRate:a.withoutPassRate})),priorDecisions:N,notes:u}},void 0,t.measurement?(a,m)=>we(t.measurement,a,m):void 0);if(!W.ok)return e(`${r}: no usable proposal \u2014 ${W.reason}`),{skipped:"no-proposal",reason:W.reason};b=W.proposal.candidateContent,q=W.proposal.rationale}let I=p?De({plannedPairs:p.plannedPairs||C.expectedPairs,carriedPairs:$.length,liveCases:v.length}):C.passes;e(`${r}: measuring ${v.length} case(s) x ${I} pass(es) = up to ${v.length*I} pairs, candidate vs prior version`+(p?` (resumed; ${$.length} pair(s) already banked)`:""));let E=[],K=[],Ue=Date.now(),le=0,Q=0;for(let n=1;n<=I;n++){let u=await Ae({cases:v,candidateContent:b,priorVersionContent:z,concurrency:t.concurrency??2,runNumber:n,opts:{targetId:i,targetVersion:s.version??1,iteration:1,timeout:t.timeout??24e4,model:t.model,graderModel:t.graderModel,graderEngine:t.graderEngine,...l,executionKey:d,skipGrading:!1,targetType:s.type,targetName:s.name,candidateContentHash:H(b)},onLog:e});if(E.push(...u.pairs),K.push(...u.results),le+=u.completed,Q+=u.failed,e(`${r}: pass ${n}/${I} \u2014 ${u.pairs.length} pair(s), running total ${E.length}`),u.abortedForQuota){e(`${r}: stopping after pass ${n}/${I} \u2014 ${u.abortedForQuota}. Remaining passes would spend against an exhausted account.`);break}}let O=ke(K),qe=p?.observedKey??w?.observedKey;if(t.measurement&&E.length>0&&(!O||$.length>0&&qe!==O))return{skipped:"incomparable-execution",reason:"Actual actor/judge models or delivery changed; recorded runs are retained, but incompatible evidence cannot be pooled or promoted."};let A=[...$,...E],T=Ce(K),V=E.length>0,h=he({runs:K,plannedPairs:C.expectedPairs,usablePairs:E.length,verdictPairs:V?A.length:E.length,proposalCalls:B,passes:I,liveCases:v.length,wallMs:Date.now()-Ue});if(e(`${r}: ${le} completed, ${Q} failed, ${E.length} usable pair(s) \u2014 spent ~${h.modelCalls} model calls (${h.proposalCalls} proposal + ${h.executorCalls} executor + >=${h.graderCalls} grader) in ${(h.wallMs/6e4).toFixed(1)} min`+(V?`; the ${h.verdictPairs} pair(s) behind this verdict resolve +/-${be(h.mde)} at 80% power`:"")),!V)return{skipped:T.infrastructureFailed?"infrastructure-failure":"no-pairs",reason:T.infrastructureFailed?`${T.infrastructureFailed} run(s) never executed (${T.summary.describe()}) \u2014 the environment failed, not the target`:`${Q} run(s) failed or were ungradeable`,cost:h};let Y=Ee({pairs:A.length,minPairs:10,accounting:T});if(Y.kind==="infrastructure-incomplete")return e(`${r}: not posting a verdict \u2014 ${Y.reason}`),await se({evalTargetId:i,meta:c,blob:Oe({executionKey:d,...O?{observedKey:O}:{},content:b,hash:H(b),priorHash:D,plannedPairs:p?.plannedPairs||C.expectedPairs,now:new Date}),log:e,tag:r}),{skipped:"infrastructure-incomplete",reason:Y.reason,cost:h};f.enabled&&e(`${r}: accumulated ${A.length}/${f.targetPairs} pair(s) over ${_+1} run(s) on one candidate`);let ce=L,{apply:Ke,peeking:Je}=tt({consented:ce,accumulateEnabled:f.enabled,pairCount:A.length,targetPairs:f.targetPairs});ce&&Je&&e(`${r}: interim readout at ${A.length}/${f.targetPairs} pairs \u2014 recording the decision but not acting until the target is reached`);let P=await te(`/api/eval-targets/${i}/promotions`,{candidateContent:b,proposalSource:"llm",proposalRationale:q,pairs:A,canaryGreen:U.green,measuredAgainstContentHash:D,immutableSections:F,apply:Ke,measurementCost:h,...f.enabled?{accumulation:{executionKey:d,...O?{observedKey:O}:{},candidateContentHash:H(b),priorContentHash:D,targetPairs:f.targetPairs,carriedPairs:$.length,runs:_+1}}:{}});e(`${r}: ${P.decision}${P.applied?" (APPLIED)":""} \u2014 ${P.rationale}`+(P.refusals.length>0?` | refusals: ${P.refusals.join("; ")}`:"")),(p||c[xe])&&await se({evalTargetId:i,meta:c,blob:null,log:e,tag:r});let Z=!1,R;if(P.applied&&s.name.startsWith("/"))try{Te(s.name)?Ne(s.name,"utf8")!==z?R="file changed since measurement started \u2014 refusing to clobber; next cycle re-syncs":(Xe(s.name,b,"utf8"),Z=!0):R="file no longer exists on disk",e(Z?`${r}: measured improvement written to ${s.name} (undo: git checkout -- ${s.name})`:`${r}: NOT written to disk \u2014 ${R}`)}catch(n){R=n instanceof Error?n.message:String(n),e(`${r}: disk write-back failed \u2014 ${R}. The eval target is updated; the file is not.`)}return{decision:P.decision,applied:P.applied,nPairs:A.length,promotionId:P.id,cost:h,diskSynced:M,...P.applied?{fileWritten:Z,...R?{fileWriteSkipped:R}:{}}:{},...f.enabled?{carriedPairs:$.length,accumulationRuns:_+1}:{}}}g(Pt,"cronInstructionEvolution");function nt(t){let o=t.immutableSections;return o==null||!Array.isArray(o)?null:o.filter(e=>typeof e=="string")}g(nt,"readImmutableSections");export{Le as a,ae as b,ze as c,Be as d,Qe as e,Ve as f,Ye as g,Ze as h,et as i,tt as j,Pt as k,nt as l};
1
+ import{a as _e}from"./chunk-M7QSC64D.js";import{i as Me}from"./chunk-ZKPURXUS.js";import{a as Pe}from"./chunk-ISEUEYSC.js";import{b as pe,i as me,j as ge,k as fe,l as he,m as be,n as $e}from"./chunk-GYKYJJNF.js";import{c as Re}from"./chunk-G7V4ZZZ3.js";import{a as xe,b as Se,c as De,d as Ie,e as se,f as Oe}from"./chunk-LJE5J3EW.js";import{a as re}from"./chunk-AHLVY52I.js";import{d as ke,f as Ce,g as Ee,i as Ae}from"./chunk-YXMAGC53.js";import{a as we}from"./chunk-T7HZZ4DJ.js";import{c as ye}from"./chunk-FADINV4H.js";import{b as ve}from"./chunk-SWSOEYC7.js";import{d as ue,e as ne,f as de}from"./chunk-KFNFLMUR.js";import{e as y,f as te}from"./chunk-GIXHG5FK.js";import{a as g}from"./chunk-ZLLER3HP.js";import{createHash as Ge}from"node:crypto";import{existsSync as Te,readFileSync as Ne,writeFileSync as Xe}from"node:fs";var H=g(t=>Ge("sha256").update(t).digest("hex"),"sha256"),Le=1.3,ae=4,ze=20;function Be(t,o){if(!t.configured||o<=0)return ae;let e=Math.ceil(t.minPairs*Le/o);return Math.min(ze,Math.max(ae,e))}g(Be,"passCapFor");function Qe(t,o=10,e=ae){if(t<=0)return{passes:0,expectedPairs:0,feasible:!1,reason:"no live cases"};let i=Math.ceil(o*Le),l=Math.min(e,Math.ceil(i/t)),r=l*t;return r<o?{passes:l,expectedPairs:r,feasible:!1,reason:`${t} live case(s) x ${e} passes = ${t*e} pairs at best, below the ${o} a controlled verdict requires \u2014 add cases rather than replaying these`}:{passes:l,expectedPairs:r,feasible:!0}}g(Qe,"planPasses");var Ve=60,Ye=5,We=g(t=>Array.isArray(t)?t.filter(o=>typeof o=="string"):[],"stringList"),J=g(t=>typeof t=="number"&&Number.isFinite(t)?t:null,"finite");function Ze(t,o,e=Ye){let i=[...t].filter(s=>s.fromContentHash===o).sort((s,c)=>Date.parse(c.createdAt)-Date.parse(s.createdAt)),l=[],r=new Set;for(let s of i){let c=s.toContentHash??s.id;if(r.has(c))continue;r.add(c);let d=s.verdict??null,k=J(d?.delta),M=J(d?.ci?.lower),x=J(d?.ci?.upper),S=J(d?.nWith),L=d?.sufficient===!0&&k!=null&&M!=null&&x!=null&&S!=null?{delta:k,ciLower:M,ciUpper:x,nPairs:S}:null;if(l.push({decision:typeof s.decision=="string"?s.decision:"unknown",applied:s.applied===!0,at:typeof s.createdAt=="string"?s.createdAt:"",rationale:typeof s.proposalRationale=="string"?s.proposalRationale:"",touched:We(s.touchedSections),refusals:We(s.refusals),measured:L}),l.length>=e)break}return l}g(Ze,"summarisePriorDecisions");function et(t,o){let e=o.accumulate??(t.autoEvolveAccumulate===!0||t.autoEvolveAccumulate==="true"),i=o.accumulateTargetPairs??t.autoEvolveAccumulateTarget,l=typeof i=="string"?Number.parseInt(i,10):i,r=typeof l=="number"&&Number.isInteger(l)&&l>0?l:Ve;return{enabled:e,targetPairs:r}}g(et,"readAccumulateConfig");function tt(t){let o=t.accumulateEnabled&&t.pairCount<t.targetPairs;return{apply:t.consented&&!o,peeking:o}}g(tt,"resolveApply");async function Pt(t,o){if(t.restoration)return Pe(t.evalTargetId,t.restoration);let e=g(n=>o?.logger?.info?.(n)??console.log(n),"log"),{evalTargetId:i}=t,l=t.measurement?ye(t):{},r=`[cron_instruction_evolution] ${i}`,s=await y(`/api/eval-targets/${i}`),c=s.metadata??{},d=t.measurement?JSON.stringify([l.engine,l.model,l.graderEngine,l.graderModel,s.type,ve(t.measurement.engine)]):void 0,k=null,M=!1;if(s.name.startsWith("/")&&Te(s.name))try{if(k=Ne(s.name,"utf8"),k!==s.content){let n=await te(`/api/eval-targets/${i}/sync-content`,{content:k});M=n.synced,e(`${r}: target content drifted from disk by ${Math.abs(k.length-s.content.length)} chars \u2014 synced to disk truth (v${n.version}). Prior verdicts against the old text dissolve via content-hash keying.`),s={...s,content:k,version:n.version}}}catch(n){e(`${r}: disk sync failed (${n instanceof Error?n.message:String(n)}) \u2014 measuring the stored snapshot`)}let x=!1;try{x=(await y("/api/settings/evolution-account")).paused}catch(n){e(`${r}: could not read the account switch (${n instanceof Error?n.message:String(n)}) \u2014 pausing to be safe`),x=!0}if(x)return e(`${r}: PAUSED for the whole account (profiles.evolution_paused) \u2014 no model budget spent.`),{skipped:"paused-account"};if(ge(c))return e(`${r}: PAUSED (metadata.autoEvolvePaused) \u2014 no model budget spent. Opt-in is intact.`),{skipped:"paused"};let S=_e(s);if(S)return e(`${r}: ${S.reason}`),S;let L=t.apply??(c.autoEvolveApply===!0||c.autoEvolveApply==="true"),F=nt(c);if(F==null){if(L)return e(`${r}: refusing \u2014 metadata.immutableSections is unset. Set it (use [] to explicitly protect nothing) before letting the loop edit this target unattended.`),{skipped:"immutable-sections-unset"};e(`${r}: metadata.immutableSections unset \u2014 measure-only cycle proceeds with [] (nothing protected). Writing still requires setting it explicitly.`),F=[]}let v=(await y(`/api/eval-targets/${i}/evals`)).filter(n=>!n.retiredAt);if(v.length===0)return{skipped:"no-live-cases"};let j=me(c);j.note&&e(`${r}: ${j.note}`);let C=Qe(v.length,j.minPairs,Be(j,v.length));if(!C.feasible)return e(`${r}: cannot reach a sufficient verdict \u2014 ${C.reason}`),{skipped:"cannot-reach-min-n",reason:C.reason};let Fe=fe({liveCases:v.length,passes:C.passes});e(`${r}: budget for this run \u2014 ${$e(Fe)}`);let G=await y(`/api/eval-targets/${i}/judge-calibration`);if(!G.powerCheck.adequate){let n=(G.powerCheck.reasons??[]).join("; ");return e(`${r}: not adequately powered, skipping before spending budget \u2014 ${n}`),{skipped:"not-adequate",reason:n}}let oe=de,je=Date.now()-oe*24*60*60*1e3,X=await y(`/api/eval-targets/${i}/promotions?limit=200`),ie=X.promotions.filter(n=>n.applied&&Date.parse(n.createdAt)>=je).length;if(ie>=ne)return e(`${r}: change budget looks exhausted (${ie}/${ne} applied in ${oe}d), skipping before spending budget`),{skipped:"budget-exhausted"};try{let n=await y("/api/usage/current-limits"),u=Re({limits:n,now:new Date});if(!u.ok)return e(`${r}: deferring before spending budget \u2014 ${u.reason}`),{skipped:"quota-exhausted",reason:u.reason}}catch(n){e(`${r}: quota unknown (${n instanceof Error?n.message:String(n)}) \u2014 proceeding`)}let U=ue();if(!U.green)return e(`${r}: A/A canary is RED \u2014 halting. ${U.failures.join(" | ")}`),{skipped:"canary-red",reason:U.failures.join(" | ")};let z=s.content,D=H(z),f=et(c,t),w=f.enabled?re(X.promotions,D,f.targetPairs,d):null,b,q,$=[],_=0,B=pe,p=w?null:Se(c,D,d);if(p){b=p.content,q="",B=0;try{$=await Ie({evalTargetId:i,candidateContentHash:p.hash,executionKey:d,observedKey:p.observedKey})}catch(n){return e(`${r}: could not rebuild banked pairs (${n instanceof Error?n.message:String(n)})`),{skipped:"resume-read-failed",reason:p.hash}}e(`${r}: resuming interrupted cycle \u2014 ${$.length}/${p.plannedPairs} pair(s) rebuilt from eval_runs, no proposal call spent`)}else if(w){let n=await y(`/api/promotions/${w.promotionId}`);if(H(n.toContent)!==w.candidateContentHash)return e(`${r}: stored candidate does not match its recorded hash \u2014 refusing to continue`),{skipped:"accumulation-hash-mismatch",reason:w.promotionId};b=n.toContent,q=n.proposalRationale??"",$=w.pairs,_=w.runs,B=0,e(`${r}: continuing accumulation ${w.promotionId} \u2014 ${$.length}/${f.targetPairs} pair(s) carried from ${_} prior run(s)`)}else{let n=G.caseDiscrimination?.cases??[],u=[];if(s.name.startsWith("/")){let a=s.name.slice(0,s.name.lastIndexOf("/"));try{let m=await y(`/api/insights/evidence?projectPath=${encodeURIComponent(a)}`);m.analyzedAt&&(u=[...m.friction.map(ee=>`Real-session friction (insights, ${m.analyzedAt.slice(0,10)}): ${ee}`),...m.whatWorks.map(ee=>`Working well in real sessions \u2014 do not break: ${ee}`)],u.length>0&&e(`${r}: proposer sees ${m.friction.length} friction + ${m.whatWorks.length} what-works item(s) from insights`))}catch(m){e(`${r}: insights evidence unavailable (${m instanceof Error?m.message:String(m)}) \u2014 proposing without it`)}}let N=[];try{N=Ze(X.promotions,D)}catch(a){e(`${r}: could not summarise prior decisions (${a instanceof Error?a.message:String(a)}) \u2014 proposing without them`)}N.length>0&&e(`${r}: proposer sees ${N.length} prior decision(s) against this exact body (${N.map(a=>`${a.decision}${a.measured?"/measured":""}`).join(", ")})`);let W=await Me({currentContent:s.content,targetType:s.type,targetName:s.name,immutableSections:F,evidence:{nonDiscriminating:n.filter(a=>!a.discriminating).map(a=>`${a.name??a.assertion??"unnamed"} \u2014 ${a.note}`),weakest:n.filter(a=>a.discriminating&&a.withPassRate<a.withoutPassRate).map(a=>({name:a.name??a.assertion??"unnamed",withPassRate:a.withPassRate,withoutPassRate:a.withoutPassRate})),priorDecisions:N,notes:u}},void 0,t.measurement?(a,m)=>we(t.measurement,a,m):void 0);if(!W.ok)return e(`${r}: no usable proposal \u2014 ${W.reason}`),{skipped:"no-proposal",reason:W.reason};b=W.proposal.candidateContent,q=W.proposal.rationale}let I=p?De({plannedPairs:p.plannedPairs||C.expectedPairs,carriedPairs:$.length,liveCases:v.length}):C.passes;e(`${r}: measuring ${v.length} case(s) x ${I} pass(es) = up to ${v.length*I} pairs, candidate vs prior version`+(p?` (resumed; ${$.length} pair(s) already banked)`:""));let E=[],K=[],Ue=Date.now(),le=0,Q=0;for(let n=1;n<=I;n++){let u=await Ae({cases:v,candidateContent:b,priorVersionContent:z,concurrency:t.concurrency??2,runNumber:n,opts:{targetId:i,targetVersion:s.version??1,iteration:1,timeout:t.timeout??24e4,model:t.model,graderModel:t.graderModel,graderEngine:t.graderEngine,...l,executionKey:d,skipGrading:!1,targetType:s.type,targetName:s.name,candidateContentHash:H(b)},onLog:e});if(E.push(...u.pairs),K.push(...u.results),le+=u.completed,Q+=u.failed,e(`${r}: pass ${n}/${I} \u2014 ${u.pairs.length} pair(s), running total ${E.length}`),u.abortedForQuota){e(`${r}: stopping after pass ${n}/${I} \u2014 ${u.abortedForQuota}. Remaining passes would spend against an exhausted account.`);break}}let O=ke(K),qe=p?.observedKey??w?.observedKey;if(t.measurement&&E.length>0&&(!O||$.length>0&&qe!==O))return{skipped:"incomparable-execution",reason:"Actual actor/judge models or delivery changed; recorded runs are retained, but incompatible evidence cannot be pooled or promoted."};let A=[...$,...E],T=Ce(K),V=E.length>0,h=he({runs:K,plannedPairs:C.expectedPairs,usablePairs:E.length,verdictPairs:V?A.length:E.length,proposalCalls:B,passes:I,liveCases:v.length,wallMs:Date.now()-Ue});if(e(`${r}: ${le} completed, ${Q} failed, ${E.length} usable pair(s) \u2014 spent ~${h.modelCalls} model calls (${h.proposalCalls} proposal + ${h.executorCalls} executor + >=${h.graderCalls} grader) in ${(h.wallMs/6e4).toFixed(1)} min`+(V?`; the ${h.verdictPairs} pair(s) behind this verdict resolve +/-${be(h.mde)} at 80% power`:"")),!V)return{skipped:T.infrastructureFailed?"infrastructure-failure":"no-pairs",reason:T.infrastructureFailed?`${T.infrastructureFailed} run(s) never executed (${T.summary.describe()}) \u2014 the environment failed, not the target`:`${Q} run(s) failed or were ungradeable`,cost:h};let Y=Ee({pairs:A.length,minPairs:10,accounting:T});if(Y.kind==="infrastructure-incomplete")return e(`${r}: not posting a verdict \u2014 ${Y.reason}`),await se({evalTargetId:i,meta:c,blob:Oe({executionKey:d,...O?{observedKey:O}:{},content:b,hash:H(b),priorHash:D,plannedPairs:p?.plannedPairs||C.expectedPairs,now:new Date}),log:e,tag:r}),{skipped:"infrastructure-incomplete",reason:Y.reason,cost:h};f.enabled&&e(`${r}: accumulated ${A.length}/${f.targetPairs} pair(s) over ${_+1} run(s) on one candidate`);let ce=L,{apply:Ke,peeking:Je}=tt({consented:ce,accumulateEnabled:f.enabled,pairCount:A.length,targetPairs:f.targetPairs});ce&&Je&&e(`${r}: interim readout at ${A.length}/${f.targetPairs} pairs \u2014 recording the decision but not acting until the target is reached`);let P=await te(`/api/eval-targets/${i}/promotions`,{candidateContent:b,proposalSource:"llm",proposalRationale:q,pairs:A,canaryGreen:U.green,measuredAgainstContentHash:D,immutableSections:F,apply:Ke,measurementCost:h,...f.enabled?{accumulation:{executionKey:d,...O?{observedKey:O}:{},candidateContentHash:H(b),priorContentHash:D,targetPairs:f.targetPairs,carriedPairs:$.length,runs:_+1}}:{}});e(`${r}: ${P.decision}${P.applied?" (APPLIED)":""} \u2014 ${P.rationale}`+(P.refusals.length>0?` | refusals: ${P.refusals.join("; ")}`:"")),(p||c[xe])&&await se({evalTargetId:i,meta:c,blob:null,log:e,tag:r});let Z=!1,R;if(P.applied&&s.name.startsWith("/"))try{Te(s.name)?Ne(s.name,"utf8")!==z?R="file changed since measurement started \u2014 refusing to clobber; next cycle re-syncs":(Xe(s.name,b,"utf8"),Z=!0):R="file no longer exists on disk",e(Z?`${r}: measured improvement written to ${s.name} (undo: git checkout -- ${s.name})`:`${r}: NOT written to disk \u2014 ${R}`)}catch(n){R=n instanceof Error?n.message:String(n),e(`${r}: disk write-back failed \u2014 ${R}. The eval target is updated; the file is not.`)}return{decision:P.decision,applied:P.applied,nPairs:A.length,promotionId:P.id,cost:h,diskSynced:M,...P.applied?{fileWritten:Z,...R?{fileWriteSkipped:R}:{}}:{},...f.enabled?{carriedPairs:$.length,accumulationRuns:_+1}:{}}}g(Pt,"cronInstructionEvolution");function nt(t){let o=t.immutableSections;return o==null||!Array.isArray(o)?null:o.filter(e=>typeof e=="string")}g(nt,"readImmutableSections");export{Le as a,ae as b,ze as c,Be as d,Qe as e,Ve as f,Ye as g,Ze as h,et as i,tt as j,Pt as k,nt as l};
@@ -1,4 +1,4 @@
1
- import{a as M}from"./chunk-5RBLIVBF.js";import{c as q}from"./chunk-GLBWNB2N.js";import{a as K,b as Y}from"./chunk-CQD2R3BA.js";import{a as A,d as N}from"./chunk-3UKZJAFS.js";import{a as j,b as k,c as V,d as D}from"./chunk-77FH6UZP.js";import{a as Z}from"./chunk-KE5K3F7J.js";import{b as W,e as B,g as T}from"./chunk-XCH4HPEZ.js";import{e as h,f as U,h as m}from"./chunk-GIXHG5FK.js";import{a as L,b as H}from"./chunk-X6CF5KTW.js";import{a as f}from"./chunk-ZLLER3HP.js";var Q=f((l,{limit:a,sort:n,eventTypes:s})=>h(`/api/sessions/${l}/events?limit=${a}&sort=${n}&eventType=${encodeURIComponent(s.join(","))}&hasContent=true`),"fetchTranscriptTurns");async function ms(l,a){let{mirrorId:n,projectPath:s,projectId:r,config:u}=l,e=f(t=>a.logger.info(t),"log");if(u?.sessionId)return es({mirrorId:n,sessionId:u.sessionId},e);e(`Processing insights job ${n}...`),await m(`/api/insights-jobs/${n}/progress`,{status:"running",progress:{step:"reading_data"}});try{let{repaired:t}=await U("/api/sessions/repair-analyzed-at",{});t>0&&e(` Repaired analyzed_at on ${t} orphan session(s).`)}catch(t){e(` Warning: analyzed_at repair failed: ${t instanceof Error?t.message:String(t)}`)}let p=20,C=200,z=15*6e4,F=3,E=Date.now()+z,I=B()==="none"?"no-llm-backend":null;if(I&&a.logger.warn?.("[process-insights] no LLM backend (no claude/codex CLI and no ANTHROPIC_API_KEY) \u2014 facet grading SKIPPED for this run; the summary below is computed from already-graded sessions only"),!I){let t=0,i=0;try{for(;t<C&&Date.now()<E;){let c=await h(`/api/sessions?needsFacets=true&graderVersion=${2}&limit=${p}&offset=${i}`);if(c.length===0)break;e(` Generating facets for ${c.length} un-analyzed sessions (drained ${t} so far)...`);for(let b=0;b<c.length&&!(t>=C||Date.now()>=E);b+=F){let R=c.slice(b,b+F);await Promise.all(R.map(async g=>{if(!(t>=C||Date.now()>=E))try{let d=await N(ss=>Q(g.id,ss));if(d.turnCount<2){t++,i++;return}let O=await T(D,d.text,4096);O&&typeof O.outcome=="string"?(await m(`/api/sessions/${g.id}/enrich`,{analysis:{source:"generated_facets",...O,graderVersion:2},...g.eventCount!=null?{analyzedEventCount:g.eventCount}:{},analyzedTurnCount:d.turnCount}),e(` Generated facets for session ${g.id} (${g.tool}, ${d.turnCount} turns)`)):i++,t++}catch(d){e(` Failed to generate facets for session ${g.id}: ${d instanceof Error?d.message:String(d)}`),t++,i++}}))}if(c.length<p)break}}catch(c){e(` Warning: facet generation failed after ${t} sessions: ${c instanceof Error?c.message:String(c)}`)}if(t>0){let c=Date.now()>=E?`time budget (${Math.round(z/6e4)}m)`:t>=C?`hard cap (${C})`:"queue empty";e(` Facet drain stopped on ${c} after ${t} session(s); the rest resume next run.`)}}let _=await ns(s,r);if(!_)throw new M("No session data found \u2014 ensure sessions are captured and enriched.");e(` Found ${_.stats.sessions} sessions, generating recommendations...`);let y=await Y({projectId:r,projectPath:s},h);_.summary+=`
1
+ import{a as M}from"./chunk-5RBLIVBF.js";import{c as q}from"./chunk-GLBWNB2N.js";import{a as K,b as Y}from"./chunk-CQD2R3BA.js";import{a as A,d as N}from"./chunk-3UKZJAFS.js";import{a as j,b as k,c as V,d as D}from"./chunk-77FH6UZP.js";import{a as Z}from"./chunk-KE5K3F7J.js";import{b as W,e as B,g as T}from"./chunk-DHIEGG4T.js";import{e as h,f as U,h as m}from"./chunk-GIXHG5FK.js";import{a as L,b as H}from"./chunk-X6CF5KTW.js";import{a as f}from"./chunk-ZLLER3HP.js";var Q=f((l,{limit:a,sort:n,eventTypes:s})=>h(`/api/sessions/${l}/events?limit=${a}&sort=${n}&eventType=${encodeURIComponent(s.join(","))}&hasContent=true`),"fetchTranscriptTurns");async function ms(l,a){let{mirrorId:n,projectPath:s,projectId:r,config:u}=l,e=f(t=>a.logger.info(t),"log");if(u?.sessionId)return es({mirrorId:n,sessionId:u.sessionId},e);e(`Processing insights job ${n}...`),await m(`/api/insights-jobs/${n}/progress`,{status:"running",progress:{step:"reading_data"}});try{let{repaired:t}=await U("/api/sessions/repair-analyzed-at",{});t>0&&e(` Repaired analyzed_at on ${t} orphan session(s).`)}catch(t){e(` Warning: analyzed_at repair failed: ${t instanceof Error?t.message:String(t)}`)}let p=20,C=200,z=15*6e4,F=3,E=Date.now()+z,I=B()==="none"?"no-llm-backend":null;if(I&&a.logger.warn?.("[process-insights] no LLM backend (no claude/codex CLI and no ANTHROPIC_API_KEY) \u2014 facet grading SKIPPED for this run; the summary below is computed from already-graded sessions only"),!I){let t=0,i=0;try{for(;t<C&&Date.now()<E;){let c=await h(`/api/sessions?needsFacets=true&graderVersion=${2}&limit=${p}&offset=${i}`);if(c.length===0)break;e(` Generating facets for ${c.length} un-analyzed sessions (drained ${t} so far)...`);for(let b=0;b<c.length&&!(t>=C||Date.now()>=E);b+=F){let R=c.slice(b,b+F);await Promise.all(R.map(async g=>{if(!(t>=C||Date.now()>=E))try{let d=await N(ss=>Q(g.id,ss));if(d.turnCount<2){t++,i++;return}let O=await T(D,d.text,4096);O&&typeof O.outcome=="string"?(await m(`/api/sessions/${g.id}/enrich`,{analysis:{source:"generated_facets",...O,graderVersion:2},...g.eventCount!=null?{analyzedEventCount:g.eventCount}:{},analyzedTurnCount:d.turnCount}),e(` Generated facets for session ${g.id} (${g.tool}, ${d.turnCount} turns)`)):i++,t++}catch(d){e(` Failed to generate facets for session ${g.id}: ${d instanceof Error?d.message:String(d)}`),t++,i++}}))}if(c.length<p)break}}catch(c){e(` Warning: facet generation failed after ${t} sessions: ${c instanceof Error?c.message:String(c)}`)}if(t>0){let c=Date.now()>=E?`time budget (${Math.round(z/6e4)}m)`:t>=C?`hard cap (${C})`:"queue empty";e(` Facet drain stopped on ${c} after ${t} session(s); the rest resume next run.`)}}let _=await ns(s,r);if(!_)throw new M("No session data found \u2014 ensure sessions are captured and enriched.");e(` Found ${_.stats.sessions} sessions, generating recommendations...`);let y=await Y({projectId:r,projectPath:s},h);_.summary+=`
2
2
 
3
3
  ${y.text}`,e(` Session evidence: ${y.sessionIds.length} usable, ${y.failedSessionIds.length} unavailable`);let S=await ts(s,e);S&&e(` Generator memory: ${S.split(`
4
4
  `).length} lines of prior-advice context`);let o={},$=[],w=k.length+1;for(let t=0;t<k.length;t++){let i=k[t];e(` [${t+1}/${w}] Generating ${i.name}...`);try{await m(`/api/insights-jobs/${n}/progress`,{status:"running",progress:{step:i.name,current:t+1,total:w,partial:{...o}}})}catch(d){e(` Warning: progress update failed for ${i.name}: ${d instanceof Error?d.message:String(d)}`)}e(` Running LLM prompt for ${i.name}...`);let c=i.usesGeneratorMemory&&S?`${_.summary}
@@ -0,0 +1 @@
1
+ import{b as T,d as H}from"./chunk-VBGHPAUT.js";import{b as A,e as c,f as m}from"./chunk-GIXHG5FK.js";import{a as u}from"./chunk-ZLLER3HP.js";import{createHash as M,randomUUID as D}from"node:crypto";import{readFileSync as h,existsSync as g}from"node:fs";import{join as i}from"node:path";import{pathToFileURL as L}from"node:url";import{execFileSync as O}from"node:child_process";import{scriptsDir as J}from"@rulemetric/hooks/scripts-dir";var f=u(t=>M("sha256").update(t).digest("hex"),"hash");async function Q(t){let k=await c(`/api/instruction-suggestions/${t.suggestionId}/test`);if(k.liveStudies?.length)return{status:"existing",studyId:k.liveStudies[0].id};let o=await c(`/api/eval-targets/${t.evalTargetId}`);if(!o.projectPath||!o.instructionId)return{status:"blocked",reason:"The suggestion has no project and instruction link."};let s=o.projectPath;if(!g(i(s,"package.json")))return{status:"blocked",reason:"Automatic repository checks currently require a package.json type-check or typecheck script."};let d=JSON.parse(h(i(s,"package.json"),"utf8")),y=["type-check","typecheck"].find(e=>typeof d.scripts?.[e]=="string");if(!y)return{status:"blocked",reason:"Add a type-check or typecheck script to prepare independently checked code tasks."};let v=t.research?[]:await c(`/api/eval-targets/${t.evalTargetId}/runs?jobId=${t.evalJobId}&limit=100`),b=v.flatMap(e=>e.outputs?.engine==="claude"&&e.outputs.model?[e.outputs.model]:[]),x=[...new Set(b)],l=t.requestedModel?.trim()||(x.length===1?x[0]:void 0);if(!l)return{status:"blocked",reason:"Choose an exact Claude model for the separately budgeted live study. Missing comparison model metadata does not determine live eligibility."};let p=await import(L(i(J,"scoped-live.mjs")).href);if(typeof p.runRepositoryCheck!="function")return{status:"blocked",reason:"Upgrade the installed hooks to support repository checks."};let r=p.observeEnvironment(s);for(let e of Object.keys(r.contextHashes))if(r.contextHashes[e]&&/(?:CLAUDE(?:\.local)?|AGENTS)\.md$/.test(e)&&h(e,"utf8").includes(t.content.trim()))return{status:"blocked",reason:"The candidate already exists in background instructions; it cannot be withheld from baseline tasks."};let P=O("git",["ls-files","-z"],{cwd:s,encoding:"utf8",timeout:5e3}).split("\0"),I=[...new Set(["package.json",...P.filter(e=>!e.split("/").some(q=>q.startsWith("."))&&/(^|\/)(package\.json|tsconfig[^/]*\.json|turbo\.json|pnpm-workspace\.yaml|pnpm-lock\.yaml|package-lock\.json|yarn\.lock)$/.test(e))])];if(I.length>300)return{status:"blocked",reason:"Repository verifier configuration exceeds the 300-file preparation bound."};let $=Object.fromEntries(I.sort().map(e=>[e,f(h(i(s,e),"utf8"))])),w={name:"Repository type checking passes",path:"package.json",kind:"command_exit",expected:"0",primary:!0,command:[d.packageManager?.startsWith("pnpm@")||g(i(s,"pnpm-lock.yaml"))?"pnpm":d.packageManager?.startsWith("yarn@")||g(i(s,"yarn.lock"))?"yarn":"npm","run",y],timeoutMs:12e4,fileHashes:$},n=p.runRepositoryCheck(s,w);if(n.error||n.exitCode===null)return{status:"blocked",reason:`The verifier could not execute: ${n.error??"no exit status"}`};let a=t.research?.taskLimit??20,j=Array.from({length:a+1},()=>`work-${D()}`),S=H.parse({version:1,mode:"exploration",research:{question:t.research?.question??`Does ${o.name} increase the fraction of fresh launched tasks leaving repository type checks passing?`,rationale:t.research?T(t.research):o.description||"Test the exact suggested instruction on prospective project work.",eligibility:"Fresh work requests supplied before launch in this project, using the pinned Claude model. One request per task; resumed and repeated work excluded.",riskReview:`${a} task assignments, one baseline follow-up, seven-day expiry. Frozen repository checks; changes to checker configuration invalidate outcomes. Shared-checkout carryover is recorded; final causal interpretation remains inconclusive. No automatic adoption.`,enrollment:"prospective-launches",suggestionId:t.suggestionId,evalTargetId:t.evalTargetId,preparationJobId:t.preparationJobId,carryoverPolicy:"fresh-session-per-task",adoptionPolicy:"no-adoption"},projectPath:s,taskFamily:"fresh-project-work",harness:"claude_code",model:l,configurationHash:f(JSON.stringify({harnessVersion:r.harnessVersion,repositoryRevision:r.repositoryRevision,contextHashes:r.contextHashes})),baselineDeliveryHash:f(""),treatmentDeliveryHash:t.contentHash,primaryOutcome:"Repository type checking passes after the task; this is not a claim of full task correctness.",outcomeRule:{source:"session_analysis",completedValues:["achieved"],failedValues:["failed"]},eligibleTaskIds:j,maxAssignments:a,decisionRule:{minCompletedPerArm:2,minimumAbsoluteEffect:.1},expiresAt:new Date(Date.now()+7*864e5).toISOString(),verification:{version:1,kind:"artifact-checks",environment:r,tasks:j.map(e=>({taskId:e,checks:[w]}))}}),C=await m("/api/instruction-experiments",{instructionId:o.instructionId,projectPath:s,source:"trial",mode:"scoped"}),R;try{R=await m(`/api/instruction-experiments/${C.experimentId}/scoped-live-confirmations`,{protocol:S})}catch(e){if(e instanceof A&&e.statusCode===409&&e.message==="Preparation was cancelled before the live study opened")return{status:"cancelled",reason:e.message};throw e}return{status:"waiting_for_work",studyId:R.confirmation.id,verifierReadiness:n,taskLimit:a,comparisonRunsWithUnknownModel:v.length-b.length,modelSelection:t.requestedModel?"explicit_request":"comparison_observation",outcome:S.primaryOutcome,model:l}}u(Q,"prepareSuggestionLive");export{Q as a};
@@ -1,2 +1,2 @@
1
- import{x as w}from"./chunk-GJHFIQVO.js";import{a as m}from"./chunk-N7ODX6PO.js";import{a as s}from"./chunk-ZLLER3HP.js";import{spawn as g}from"node:child_process";import d from"node:fs";import b from"node:path";function c(e,t){return new Promise((r,n)=>{let o=g("git",e,{cwd:t,stdio:["ignore","pipe","pipe"],env:m()}),i="",f="";o.stdout.on("data",a=>{i+=a.toString()}),o.stderr.on("data",a=>{f+=a.toString()}),o.on("error",a=>n(new Error(`git ${e.join(" ")} failed to spawn: ${a.message}`))),o.on("close",a=>{a===0?r({code:a,stdout:i,stderr:f}):n(new Error(`git ${e.join(" ")} exited ${a}: ${f.trim()||i.trim()}`))})})}s(c,"runGit");async function k(e,t){if(!t||!t.trim())throw new Error('invalid branch name "": branch must be a non-empty git refname');if(t.startsWith("-"))throw new Error(`invalid branch name "${t}": must not start with "-" (git would parse it as an option)`);if(/\s/.test(t))throw new Error(`invalid branch name "${t}": must not contain whitespace`);try{await c(["check-ref-format","--branch",t],e)}catch{throw new Error(`invalid branch name "${t}": not a valid git refname`)}}s(k,"assertValidBranch");function h(e){let t=b.resolve(e);try{return d.realpathSync(t)}catch{return t}}s(h,"canonical");function y(e){let t=[],r=null;for(let n of e.split(`
1
+ import{x as w}from"./chunk-CPDW7WW2.js";import{a as m}from"./chunk-N7ODX6PO.js";import{a as s}from"./chunk-ZLLER3HP.js";import{spawn as g}from"node:child_process";import d from"node:fs";import b from"node:path";function c(e,t){return new Promise((r,n)=>{let o=g("git",e,{cwd:t,stdio:["ignore","pipe","pipe"],env:m()}),i="",f="";o.stdout.on("data",a=>{i+=a.toString()}),o.stderr.on("data",a=>{f+=a.toString()}),o.on("error",a=>n(new Error(`git ${e.join(" ")} failed to spawn: ${a.message}`))),o.on("close",a=>{a===0?r({code:a,stdout:i,stderr:f}):n(new Error(`git ${e.join(" ")} exited ${a}: ${f.trim()||i.trim()}`))})})}s(c,"runGit");async function k(e,t){if(!t||!t.trim())throw new Error('invalid branch name "": branch must be a non-empty git refname');if(t.startsWith("-"))throw new Error(`invalid branch name "${t}": must not start with "-" (git would parse it as an option)`);if(/\s/.test(t))throw new Error(`invalid branch name "${t}": must not contain whitespace`);try{await c(["check-ref-format","--branch",t],e)}catch{throw new Error(`invalid branch name "${t}": not a valid git refname`)}}s(k,"assertValidBranch");function h(e){let t=b.resolve(e);try{return d.realpathSync(t)}catch{return t}}s(h,"canonical");function y(e){let t=[],r=null;for(let n of e.split(`
2
2
  `))n.startsWith("worktree ")?(r&&t.push(r),r={path:n.slice(9).trim()}):n.startsWith("branch ")&&r&&(r.branch=n.slice(7).trim().replace(/^refs\/heads\//,""));return r&&t.push(r),t}s(y,"parseWorktreeList");async function v(e,t){try{return await c(["show-ref","--verify","--quiet",`refs/heads/${t}`],e),!0}catch{return!1}}s(v,"branchExists");async function B(e){let{repoRoot:t,branch:r,baseRef:n,allowExistingBranch:o=!1}=e;await k(t,r);let i=w({repoRoot:t,branch:r,basePath:e.basePath}),f=await c(["worktree","list","--porcelain"],t),a=y(f.stdout),p=a.find(u=>u.branch===r);if(p)return{path:h(p.path),branch:r,created:!1};let l=a.find(u=>h(u.path)===i);if(l)return{path:h(l.path),branch:l.branch??r,created:!1};if(await v(t,r)){if(!o)throw new Error(`branch "${r}" already exists with no worktree; refusing to clobber (pass allowExistingBranch:true to attach a worktree onto it)`);return await c(["worktree","add",i,r],t),{path:h(i),branch:r,created:!0}}return await c(["worktree","add",i,"-b",r,n],t),{path:h(i),branch:r,created:!0}}s(B,"ensureWorktree");async function S(e){let{repoRoot:t,worktreePath:r}=e;if(!d.existsSync(r))return{removed:!1,reason:"absent"};let n=!1;try{n=(await c(["status","--porcelain"],r)).stdout.trim().length>0}catch{n=!1}if(n)return{removed:!1,reason:"dirty"};try{return await c(["worktree","remove",r],t),{removed:!0}}catch(o){let i=o instanceof Error?o.message:String(o);if(/not a working tree|No such file or directory|not a valid path|is not a working tree/i.test(i))return{removed:!1,reason:"absent"};throw o}}s(S,"removeWorktree");export{c as a,B as b,S as c};
@@ -1,2 +1,2 @@
1
- import{c as f}from"./chunk-D5XLTSRV.js";import{a as l}from"./chunk-5RBLIVBF.js";import{b as g,e as k}from"./chunk-GIXHG5FK.js";import{a as m}from"./chunk-ZLLER3HP.js";async function C(w,i={}){let R=i.removeWorktreeFn??f,t=i.log??(e=>process.stderr.write(`[process_run_cleanup] ${e}
1
+ import{c as f}from"./chunk-QXPGTEMO.js";import{a as l}from"./chunk-5RBLIVBF.js";import{b as g,e as k}from"./chunk-GIXHG5FK.js";import{a as m}from"./chunk-ZLLER3HP.js";async function C(w,i={}){let R=i.removeWorktreeFn??f,t=i.log??(e=>process.stderr.write(`[process_run_cleanup] ${e}
2
2
  `)),j=i.getRunDetail??(async e=>{try{return await k(`/api/runs/${e}`)}catch(r){if(r instanceof g&&r.statusCode===404)return null;throw r}}),{runId:o}=w,n=await j(o);if(!n)throw new l(`Run ${o} not found`);if(!n.run.projectPath)throw new l(`Run ${o} has no projectPath; cannot resolve a repo root for worktree cleanup`);let a=n.run.projectPath,$=n.sessions.filter(e=>e.endedAt!=null),s=[],u=0,c=0,p=0,d=0,h=new Set;for(let e of $)if(!(!e.projectPath||e.projectPath===a)&&!h.has(e.projectPath)){h.add(e.projectPath);try{let r=await R({repoRoot:a,worktreePath:e.projectPath});r.removed?(u++,s.push({sessionId:e.id,worktreePath:e.projectPath,status:"removed"}),t(`removed worktree ${e.projectPath} (session ${e.id})`)):r.reason==="dirty"?(c++,s.push({sessionId:e.id,worktreePath:e.projectPath,status:"skipped-dirty"}),t(`skipped dirty worktree ${e.projectPath} (session ${e.id}) \u2014 uncommitted changes`)):(p++,s.push({sessionId:e.id,worktreePath:e.projectPath,status:"absent"}),t(`worktree absent ${e.projectPath} (session ${e.id})`))}catch(r){let P=r instanceof Error?r.message:String(r);d++,s.push({sessionId:e.id,worktreePath:e.projectPath,status:"error",error:P.slice(0,1e3)}),t(`error removing worktree ${e.projectPath} (session ${e.id}): ${P}`)}}return t(`run ${o} cleanup: removed=${u} skippedDirty=${c} absent=${p} errored=${d}`),{runId:o,repoRoot:a,removed:u,skippedDirty:c,absent:p,errored:d,worktrees:s}}m(C,"processRunCleanup");export{C as a};
@@ -0,0 +1 @@
1
+ import{a as l}from"./chunk-KUW6AVSI.js";import{a as d}from"./chunk-FCALFMZV.js";import{a as u}from"./chunk-VBGHPAUT.js";import{e as c,h as p}from"./chunk-GIXHG5FK.js";import{a}from"./chunk-ZLLER3HP.js";import{createHash as m}from"node:crypto";import{z as t}from"zod";var h=t.object({content:t.string().min(1),name:t.string().min(1),type:t.enum(["instruction","skill"]),contentHash:t.string().regex(/^[a-f0-9]{64}$/),suggestionId:t.string().uuid()}).strict();async function j(e,g){e.preparationOnly&&u.parse(e.research);let r=h.parse(e.candidateSnapshot);if(m("sha256").update(r.content).digest("hex")!==r.contentHash)throw new Error("Candidate snapshot hash mismatch");let i=e.preparationOnly||e.preparationSourceJobId?{preparationSourceJobId:e.preparationSourceJobId}:await d({...e,candidateSnapshot:r,config:{...e.config,parallel:1,runsPerEval:1,iteration:1,skipBaseline:!1,skipGrading:!1,generateIfEmpty:!0,timeout:12e4}},g);if((await c(`/api/eval-targets/${e.evalTargetId}/jobs`)).find(n=>n.id===e.mirrorId)?.status==="cancelled")return{...i,cancelled:!0,adoptionAllowed:!1};let s;try{s=await l({research:e.research,requestedModel:e.requestedModel,evalTargetId:e.evalTargetId,evalJobId:e.preparationSourceJobId??e.mirrorId,preparationJobId:e.mirrorId,...r})}catch(n){s={status:"blocked",reason:n instanceof Error?n.message:String(n)}}if(s.status==="cancelled")return{...i,cancelled:!0,livePreparation:s,adoptionAllowed:!1};let o={...i,livePreparation:s,evidenceKind:e.preparationOnly?"live_preparation":"constructed_evaluation",candidateHash:r.contentHash,suggestionId:r.suggestionId,adoptionAllowed:!1};return await p(`/api/eval-jobs/${e.mirrorId}/state`,{result:o}),o}a(j,"processSuggestionEval");export{j as a};
@@ -0,0 +1 @@
1
+ import{a as o}from"./chunk-ZLLER3HP.js";import{fetchAllSources as D,TIER_1_SOURCES as U,TIER_2_SOURCES as A,loadDiscoveredSources as M}from"@rulemetric/skills-registry";import{writeFile as O,mkdir as B}from"node:fs/promises";import L from"node:os";import I from"node:path";var p=200,x=3600*1e3,C=6e4;function N(){let i=process.env.RULEMETRIC_REGISTRY_REFRESH_BUDGET_MS,e=i?Number.parseInt(i,10):Number.NaN;return Number.isFinite(e)&&e>0?e:x}o(N,"registryRefreshBudgetMs");function v(i,e){let a=new AbortController,l,d=o(f=>{l||(l=f,a.abort(new Error(`registry refresh stopped: ${f}`)))},"stop"),r=o(()=>d("lease_lost"),"onLease");i?.aborted?r():i?.addEventListener("abort",r,{once:!0});let g=setTimeout(()=>d("budget_exhausted"),e);return{signal:a.signal,reason:o(()=>l,"reason"),dispose:o(()=>{clearTimeout(g),i?.removeEventListener("abort",r)},"dispose")}}o(v,"refreshStopController");function F(i){let e=AbortSignal.timeout(C),a=AbortSignal.any;return typeof a=="function"?a([e,i]):e}o(F,"batchSignal");async function H(i,e){let a=e.failed>0?16096779:2278750,d={title:e.failed>0?"\u26A0\uFE0F Skills registry refresh (partial failures)":"\u2705 Skills registry refreshed",color:a,fields:[{name:"Total skills",value:String(e.total),inline:!0},{name:"Sources",value:String(e.sources),inline:!0},{name:"Duration",value:`${Math.round(e.durationMs/1e3)}s`,inline:!0},{name:"Inserted",value:String(e.inserted),inline:!0},{name:"Updated",value:String(e.updated),inline:!0},{name:"Unchanged",value:String(e.unchanged),inline:!0},...e.failed>0?[{name:"Failed",value:String(e.failed),inline:!0}]:[]],timestamp:new Date().toISOString()};try{let r=await fetch(i,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({embeds:[d]})});r.ok||console.error("[cron-refresh-skills] Discord alert failed",r.status)}catch(r){console.error("[cron-refresh-skills] Discord alert threw",r)}}o(H,"postDiscordAlert");var J=o(async(i,e)=>{if(!process.env.GITHUB_TOKEN){e.logger.warn("GITHUB_TOKEN unset \u2014 skipping skills registry refresh. Without a token the unauthenticated 60 req/hr cap is too tight for ~351 sources; set GITHUB_TOKEN (5000 req/hr) and re-run.");return}let a=Date.now(),l=M(),d=new Set,r=[...U,...A,...l].filter(t=>d.has(t.repo)?!1:(d.add(t.repo),!0)),g=N();e.logger.info(`Fetching from ${r.length} sources (T1=${U.length}, T2=${A.length}, discovered=${l.length}); budget ${Math.round(g/1e3)}s${e.leaseSignal?", stops on lease loss":""}`);let f=v(e.leaseSignal,g),s;try{s=await D(r,{signal:f.signal,onProgress:o((t,c)=>e.logger.info(`fetched ${c} from ${t}`),"onProgress")})}finally{f.dispose()}let m=f.reason(),_=o(t=>({sources:r.length,sourcesFetched:s.sourcesFetched,sourcesUnfetched:s.sourcesUnfetched,total:s.entries.length,inserted:0,updated:0,unchanged:0,failed:0,durationMs:Date.now()-a,...m?{stoppedEarly:m}:{},diskWritten:!1,dbSynced:!1,...t}),"summary");if(m==="lease_lost")return e.logger.warn(`Lease lost after ${Math.round((Date.now()-a)/1e3)}s: crawl stopped with ${s.sourcesFetched}/${r.length} sources fetched (${s.entries.length} entries); nothing persisted`),_({});let E=!1;if(m==="budget_exhausted")e.logger.warn(`Budget of ${Math.round(g/1e3)}s exhausted: ${s.sourcesFetched}/${r.length} sources fetched (${s.entries.length} entries). Disk registry left untouched; syncing the fetched entries only`);else{let t=I.join(L.homedir(),".config","rulemetric");await B(t,{recursive:!0});let c=I.join(t,"skills-registry.json");await O(c,JSON.stringify({generatedAt:new Date().toISOString(),skills:s.entries},null,2)),E=!0,e.logger.info(`Refreshed disk registry: ${s.entries.length} skills`)}let k=process.env.RULEMETRIC_API_URL,T=process.env.RULEMETRIC_REGISTRY_BOT_TOKEN;if(!k||!T)return e.logger.warn("RULEMETRIC_API_URL or RULEMETRIC_REGISTRY_BOT_TOKEN unset; skipping DB sync"),_({diskWritten:E});let S=0,b=0,R=0,u=0,y=v(e.leaseSignal,g);try{for(let t=0;t<s.entries.length;t+=p){if(y.signal.aborted){e.logger.warn(`Lease lost during DB sync at batch ${t/p}; ${s.entries.length-t} entries not synced`),u+=s.entries.length-t;break}let c=s.entries.slice(t,t+p).map(n=>({id:n.id,name:n.name,description:n.description,content:n.content,source:n.source,tags:n.tags,category:n.category,updatedAt:n.updatedAt,sourceUpdatedAt:n.sourceUpdatedAt,popularity:n.popularity}));try{let n=await fetch(`${k}/api/skills/sync-public`,{method:"POST",headers:{"content-type":"application/json",authorization:`Bearer ${T}`},body:JSON.stringify({skills:c}),signal:F(y.signal)});if(!n.ok){e.logger.warn(`Batch ${t/p} failed: ${n.status} ${await n.text()}`),u+=c.length;continue}let h=await n.json();S+=h.inserted,b+=h.updated,R+=h.unchanged,h.skipped&&(e.logger.warn(`Batch ${t/p}: ${h.skipped} skills skipped (invalid)`),u+=h.skipped)}catch(n){e.logger.warn(`Batch ${t/p} threw: ${n instanceof Error?n.message:String(n)}`),u+=c.length}}}finally{y.dispose()}let w=y.reason()==="lease_lost";e.logger.info(`DB sync: inserted=${S} updated=${b} unchanged=${R} failed=${u}`);let $=process.env.DISCORD_WEBHOOK_URL;return $&&!w&&await H($,{total:s.entries.length,inserted:S,updated:b,unchanged:R,failed:u,sources:r.length,durationMs:Date.now()-a}),_({inserted:S,updated:b,unchanged:R,failed:u,diskWritten:E,dbSynced:!0,...w?{stoppedEarly:"lease_lost"}:{}})},"cronRefreshSkills");export{x as a,C as b,N as c,J as d};
@@ -1 +1 @@
1
- import{b as m}from"./chunk-OAETRNTE.js";import{a as g}from"./chunk-ZLLER3HP.js";var p=5;function b(t){let r=g((e,f)=>({retire:[],survivingCases:0,replacementsRequired:!1,refused:e,summary:f}),"none");if(!t||t.cases.length===0&&t.unpairedCases.length===0)return r("no-discrimination-data","No case-discrimination data yet \u2014 the target needs runs in BOTH cohorts before any case can be judged dead.");let c=[...t.cases.filter(e=>!e.discriminating).map(e=>({evalId:e.evalId,name:e.name,feedback:{name:e.name,withPassRate:e.withPassRate,withoutPassRate:e.withoutPassRate,reason:e.note}})),...t.unpairedCases.map(e=>({evalId:e.evalId,name:e.name,feedback:{name:e.name,withPassRate:e.withPassRate??0,withoutPassRate:e.withoutPassRate,reason:"runs in only one cohort (no with-vs-without comparison possible)"}}))];if(c.length===0)return r("all-discriminating","Every case discriminates \u2014 nothing to retire.");let s=new Map(t.cases.map(e=>[e.evalId,e.separation])),o=[...c].sort((e,f)=>(s.get(e.evalId)??-1)-(s.get(f.evalId)??-1)).slice(0,p),u=c.length-o.length,d=t.total+t.unpaired,l=d-o.length,i=l<m,n=`${o.length} of ${d} live case(s) carry no treatment signal`+(u>0?` (${u} more over the ${p}-per-run cap)`:"")+(i?`; retiring them leaves ${l}, below the ${m}-case evolution floor, so replacements must be generated first`:"");return{retire:o,survivingCases:l,replacementsRequired:i,refused:null,summary:n}}g(b,"planCaseRefinement");async function v(t,r){let h=r.log??(()=>{}),c=g((n,e)=>({retired:0,generated:0,skipped:n,summary:e,retiredNames:[],generatedNames:[]}),"empty");if(t.refused)return c(t.refused,t.summary);let s=await r.generate(t.retire.map(n=>n.feedback)),a=[];for(let n of s??[]){let e=await r.createCase(n);a.push(e.name),h(` + ${e.name} (${e.id})`)}let o=t.survivingCases+t.retire.length+a.length,u=Math.max(0,o-m),d=t.retire.slice(0,Math.min(t.retire.length,u)),l=t.retire.length-d.length;if(d.length===0)return{retired:0,generated:a.length,skipped:s===null?"no-llm-backend":"no-replacements-generated",summary:`${t.summary}. `+(s===null?"No local LLM backend available, so nothing was retired":`The generator produced ${a.length} usable replacement(s), not enough to retire anything`)+` \u2014 dropping below the ${m}-case floor would silently disenrol the target from the nightly loop.`,retiredNames:[],generatedNames:a};let i=[];for(let n of d)await r.retireCase(n.evalId,n.feedback.reason),i.push(n.name),h(` retired ${n.name}`);return{retired:i.length,generated:a.length,skipped:null,summary:`Retired ${i.length} non-discriminating case(s), added ${a.length} replacement(s)`+(l>0?`; held ${l} back to stay at the ${m}-case floor (they remain condemned and will be retired once replacements exist)`:"")+". The replacements have no runs yet \u2014 the next autorun batch builds their depth.",retiredNames:i,generatedNames:a}}g(v,"executeCaseRefinement");export{p as a,b,v as c};
1
+ import{b as m}from"./chunk-65LFPUDB.js";import{a as g}from"./chunk-ZLLER3HP.js";var p=5;function b(t){let r=g((e,f)=>({retire:[],survivingCases:0,replacementsRequired:!1,refused:e,summary:f}),"none");if(!t||t.cases.length===0&&t.unpairedCases.length===0)return r("no-discrimination-data","No case-discrimination data yet \u2014 the target needs runs in BOTH cohorts before any case can be judged dead.");let c=[...t.cases.filter(e=>!e.discriminating).map(e=>({evalId:e.evalId,name:e.name,feedback:{name:e.name,withPassRate:e.withPassRate,withoutPassRate:e.withoutPassRate,reason:e.note}})),...t.unpairedCases.map(e=>({evalId:e.evalId,name:e.name,feedback:{name:e.name,withPassRate:e.withPassRate??0,withoutPassRate:e.withoutPassRate,reason:"runs in only one cohort (no with-vs-without comparison possible)"}}))];if(c.length===0)return r("all-discriminating","Every case discriminates \u2014 nothing to retire.");let s=new Map(t.cases.map(e=>[e.evalId,e.separation])),o=[...c].sort((e,f)=>(s.get(e.evalId)??-1)-(s.get(f.evalId)??-1)).slice(0,p),u=c.length-o.length,d=t.total+t.unpaired,l=d-o.length,i=l<m,n=`${o.length} of ${d} live case(s) carry no treatment signal`+(u>0?` (${u} more over the ${p}-per-run cap)`:"")+(i?`; retiring them leaves ${l}, below the ${m}-case evolution floor, so replacements must be generated first`:"");return{retire:o,survivingCases:l,replacementsRequired:i,refused:null,summary:n}}g(b,"planCaseRefinement");async function v(t,r){let h=r.log??(()=>{}),c=g((n,e)=>({retired:0,generated:0,skipped:n,summary:e,retiredNames:[],generatedNames:[]}),"empty");if(t.refused)return c(t.refused,t.summary);let s=await r.generate(t.retire.map(n=>n.feedback)),a=[];for(let n of s??[]){let e=await r.createCase(n);a.push(e.name),h(` + ${e.name} (${e.id})`)}let o=t.survivingCases+t.retire.length+a.length,u=Math.max(0,o-m),d=t.retire.slice(0,Math.min(t.retire.length,u)),l=t.retire.length-d.length;if(d.length===0)return{retired:0,generated:a.length,skipped:s===null?"no-llm-backend":"no-replacements-generated",summary:`${t.summary}. `+(s===null?"No local LLM backend available, so nothing was retired":`The generator produced ${a.length} usable replacement(s), not enough to retire anything`)+` \u2014 dropping below the ${m}-case floor would silently disenrol the target from the nightly loop.`,retiredNames:[],generatedNames:a};let i=[];for(let n of d)await r.retireCase(n.evalId,n.feedback.reason),i.push(n.name),h(` retired ${n.name}`);return{retired:i.length,generated:a.length,skipped:null,summary:`Retired ${i.length} non-discriminating case(s), added ${a.length} replacement(s)`+(l>0?`; held ${l} back to stay at the ${m}-case floor (they remain condemned and will be retired once replacements exist)`:"")+". The replacements have no runs yet \u2014 the next autorun batch builds their depth.",retiredNames:i,generatedNames:a}}g(v,"executeCaseRefinement");export{p as a,b,v as c};
@@ -1 +1 @@
1
- import{b as u,c as d}from"./chunk-EE4TZAZI.js";import{b as g}from"./chunk-HXOQUYG3.js";import{e as m,f as p,h as l}from"./chunk-GIXHG5FK.js";import{a as s}from"./chunk-ZLLER3HP.js";async function x(f,R){let r=s(e=>R?.logger?.info?.(e)??console.log(e),"log"),{evalTargetId:n}=f,i=`[cron_refine_cases] ${n}`,t=await m(`/api/eval-targets/${n}`);if(!(t.metadata?.autoRefineCases===!0))return r(`${i} not opted in (metadata.autoRefineCases)`),{skipped:"not-opted-in",reason:`"${t.name}" has not opted into automatic case refinement. Set metadata.autoRefineCases=true to let the loop cull cases that carry no treatment signal, or run \`rulemetric evals refine-cases ${n}\` by hand.`,targetName:t.name};let C=await m(`/api/eval-targets/${n}/judge-calibration`),a=u(C.caseDiscrimination);if(a.refused)return r(`${i} ${a.refused}: ${a.summary}`),{skipped:a.refused,reason:a.summary,targetName:t.name};r(`${i} ${a.summary}`);let o=await d(a,{generate:s(e=>g({content:t.content,name:t.name,feedback:e}),"generate"),createCase:s(e=>p(`/api/eval-targets/${n}/evals`,{name:e.name,prompt:e.prompt,expectations:e.expectations}),"createCase"),retireCase:s(async(e,y)=>{await l(`/api/eval-targets/${n}/evals/${e}`,{retire:!0,retiredReason:y})},"retireCase"),log:r});r(`${i} ${o.summary}`);let{skipped:c,...$}=o;return{...$,targetName:t.name,...c?{skipped:c,reason:o.summary}:{}}}s(x,"cronRefineCases");export{x as a};
1
+ import{b as u,c as d}from"./chunk-TSLBCZ5P.js";import{b as g}from"./chunk-HBDKOU2N.js";import{e as m,f as p,h as l}from"./chunk-GIXHG5FK.js";import{a as s}from"./chunk-ZLLER3HP.js";async function x(f,R){let r=s(e=>R?.logger?.info?.(e)??console.log(e),"log"),{evalTargetId:n}=f,i=`[cron_refine_cases] ${n}`,t=await m(`/api/eval-targets/${n}`);if(!(t.metadata?.autoRefineCases===!0))return r(`${i} not opted in (metadata.autoRefineCases)`),{skipped:"not-opted-in",reason:`"${t.name}" has not opted into automatic case refinement. Set metadata.autoRefineCases=true to let the loop cull cases that carry no treatment signal, or run \`rulemetric evals refine-cases ${n}\` by hand.`,targetName:t.name};let C=await m(`/api/eval-targets/${n}/judge-calibration`),a=u(C.caseDiscrimination);if(a.refused)return r(`${i} ${a.refused}: ${a.summary}`),{skipped:a.refused,reason:a.summary,targetName:t.name};r(`${i} ${a.summary}`);let o=await d(a,{generate:s(e=>g({content:t.content,name:t.name,feedback:e}),"generate"),createCase:s(e=>p(`/api/eval-targets/${n}/evals`,{name:e.name,prompt:e.prompt,expectations:e.expectations}),"createCase"),retireCase:s(async(e,y)=>{await l(`/api/eval-targets/${n}/evals/${e}`,{retire:!0,retiredReason:y})},"retireCase"),log:r});r(`${i} ${o.summary}`);let{skipped:c,...$}=o;return{...$,targetName:t.name,...c?{skipped:c,reason:o.summary}:{}}}s(x,"cronRefineCases");export{x as a};
@@ -0,0 +1,2 @@
1
+ import{a as f}from"./chunk-ZLLER3HP.js";import{z as e}from"zod";var I=e.object({question:e.string().trim().min(20).max(2e3),rationale:e.string().trim().min(30).max(5e3),incident:e.string().trim().min(20).max(5e3),requestedModel:e.string().trim().min(1).max(200),taskLimit:e.number().int().min(4).max(20)}).strict(),j=f(i=>`${i.rationale}
2
+ Incident: ${i.incident}`,"liveResearchRationale"),m=e.string().regex(/^[a-f0-9]{64}$/),t=e.string().min(1).max(2e4),d=e.string().min(1).max(240).refine(i=>!i.startsWith("/")&&!i.includes("\\")&&i.split("/").every(r=>r!==".."&&r!=="."&&r!==""&&!r.startsWith(".")),"fixture paths must be relative, without traversal or hidden configuration"),p=e.object({path:d,content:e.string().max(1e5)}).strict(),g=e.object({name:t,path:d,kind:e.enum(["text_equals","json_equals","file_absent"]),expected:e.string().max(1e5),primary:e.boolean()}).strict(),h=e.object({evalId:e.string().uuid(),taskId:t,family:t,lineage:t,split:e.enum(["exploration","validation"]),incidentSessionIds:e.array(e.string().uuid()).min(1),opportunity:e.enum(["failure","success","costly_success","should_not_trigger"]),prompt:t,fixtureVersion:t,verifierVersion:t,files:e.array(p).max(100),checks:e.array(g).min(1).max(30),oracleFiles:e.array(p).max(100)}).strict(),b=e.object({version:e.literal(1),revision:e.number().int().positive(),question:t,hypotheses:e.array(t).min(2),interventionType:e.enum(["instruction","retrieval","tool","executable_check","workflow","removal","none"]),baseline:e.object({content:e.string().max(16e3),files:e.array(p).max(30)}).strict(),treatment:e.object({content:e.string().max(16e3),files:e.array(p).max(30)}).strict(),scope:e.object({projectPath:t,harnessVersion:t,deliveryMode:e.literal("explicit-system-and-fixture-file"),engine:e.enum(["claude","codex"]),model:t,provider:e.enum(["anthropic","openai"]),repositoryRevision:e.string().regex(/^[a-f0-9]{40}$/),ambientContext:e.literal("frozen-fixture"),permissions:e.literal("isolated-fixture-write"),tools:e.array(t).min(1),expiresAt:e.string().datetime()}).strict(),sampling:e.object({rationale:t,exclusions:e.array(t),eligibleOpportunities:e.number().int().positive(),sampledOpportunities:e.number().int().positive()}).strict(),analysis:e.object({role:e.enum(["diagnostic","exploration","frozen_validation"]),primaryOutcome:t,safeguards:e.array(t).min(1),eligibility:t,assignmentUnit:e.literal("task"),weighting:e.literal("equal-task"),method:e.literal("paired-task-bootstrap"),stopping:e.literal("fixed-final"),primaryComparison:e.literal("treatment-minus-baseline"),repetitions:e.number().int().min(1).max(10),usefulEffect:e.number().positive().max(1),reliabilityMargin:e.number().min(0).max(1),maxCalls:e.number().int().min(2).max(200),maxSecondsPerCall:e.number().int().min(10).max(600),humanReviewMinutes:e.number().nonnegative().nullable(),reviewNote:t}).strict(),tasks:e.array(h).min(1).max(50),supersedes:e.string().uuid().nullable()}).strict().superRefine((i,r)=>{let a=f(s=>r.addIssue({code:"custom",message:s}),"fail");(new Set(i.tasks.map(s=>s.evalId)).size!==i.tasks.length||new Set(i.tasks.map(s=>s.taskId)).size!==i.tasks.length)&&a("task identity must be unique, not repetition"),i.scope.engine==="claude"!=(i.scope.provider==="anthropic")&&a("engine/provider mismatch"),i.scope.engine==="claude"&&[...i.scope.tools].sort().join(",")!=="Bash,Edit,Read,Write"&&a("Claude fixture execution supports exactly Read, Write, Edit and Bash");for(let s of[i.baseline,i.treatment])Array.from(s.content).reduce((n,c)=>{let u=c.codePointAt(0);return n+(u<128?1:u<2048?2:u<65536?3:4)},0)>16e3&&a("Instruction delivery exceeds the UTF-8 byte budget");let o=new Map;for(let s of i.tasks){for(let n of[s.lineage,s.family])o.has(n)&&o.get(n)!==s.split&&a("family or incident lineage leaks across splits"),o.set(n,s.split);[...s.files,...i.baseline.files,...i.treatment.files].some(n=>["CLAUDE.md","CLAUDE.local.md","AGENTS.md"].includes(n.path.split("/").at(-1)))&&a("Fixture files cannot introduce ambient instruction files"),new Set(s.checks.map(n=>n.name)).size!==s.checks.length&&a("Check names must be unique"),s.checks.some(n=>n.primary)||a("each task needs an independent primary artifact check"),new Set(s.files.map(n=>n.path)).size!==s.files.length&&a("duplicate fixture file path");for(let n of[i.baseline,i.treatment])new Set(n.files.map(c=>c.path)).size!==n.files.length&&a("duplicate intervention file path"),n.files.some(c=>s.files.some(u=>u.path===c.path))&&a("intervention must not overwrite common fixture files")}let l=i.tasks.filter(s=>s.split===(i.analysis.role==="frozen_validation"?"validation":"exploration"));l.length||a("no tasks in the selected split"),l.length*2*i.analysis.repetitions>i.analysis.maxCalls&&a("planned calls exceed resource ceiling"),i.sampling.sampledOpportunities>i.sampling.eligibleOpportunities&&a("sampled opportunities exceed eligible opportunities")}),w=e.object({version:e.literal(1),id:e.string().uuid(),protocolHash:m,protocol:b}).strict(),R=e.object({studyId:e.string().uuid(),protocolHash:m,taskId:t,arm:e.enum(["baseline","treatment"]),repetition:e.number().int().positive(),eligible:e.boolean(),exclusion:e.string().nullable(),primaryPassed:e.boolean(),safeguardsPassed:e.boolean(),checks:e.array(e.object({name:t,passed:e.boolean(),actual:e.string().nullable()})),deliveryHash:m,fixtureHash:m,harnessVersion:e.string().nullable(),engine:e.string().nullable(),model:e.string().nullable(),provider:e.string().nullable(),durationMs:e.number().nonnegative(),tokens:e.number().nonnegative().nullable(),costUsd:e.number().nonnegative().nullable()}).strict(),x=e.object({runtimeStateHash:m.nullable().optional(),harnessVersion:t,repositoryRevision:e.string().regex(/^[a-f0-9]{40}$/),contextHashes:e.record(m.nullable())}).strict(),y=e.object({name:t,path:d,kind:e.literal("command_exit"),expected:e.literal("0"),primary:e.boolean(),command:e.array(e.string().min(1).max(2e3)).min(1).max(30),timeoutMs:e.number().int().min(100).max(12e4),fileHashes:e.record(d,m).refine(i=>Object.keys(i).length>0&&Object.keys(i).length<=300,"Freeze verifier files")}).strict().refine(i=>Object.hasOwn(i.fileHashes,i.path),"The verifier entry point must be frozen"),v=e.union([g,y]),k=e.object({version:e.literal(1),kind:e.literal("artifact-checks"),environment:x,tasks:e.array(e.object({taskId:e.string().min(1).max(500),checks:e.array(v).min(1).max(30)}).strict()).min(4).max(200)}).strict(),_=e.object({version:e.literal(1),mode:e.enum(["confirmation","exploration"]).optional(),research:e.object({question:t,rationale:t,eligibility:t,riskReview:t,enrollment:e.literal("prospective-launches").optional(),suggestionId:e.string().uuid().optional(),evalTargetId:e.string().uuid().optional(),preparationJobId:e.string().uuid().optional(),carryoverPolicy:e.literal("fresh-session-per-task"),adoptionPolicy:e.literal("no-adoption")}).strict().optional(),projectPath:t,taskFamily:t,harness:e.literal("claude_code"),model:t,configurationHash:m,baselineDeliveryHash:m,treatmentDeliveryHash:m,primaryOutcome:t,verification:k.optional(),outcomeRule:e.object({source:e.literal("session_analysis"),completedValues:e.array(e.string().min(1)).min(1),failedValues:e.array(e.string().min(1)).min(1)}).strict(),eligibleTaskIds:e.array(e.string().min(1).max(500)).min(4).max(200),maxAssignments:e.number().int().min(4).max(200),decisionRule:e.object({method:e.literal("fisher-exact-two-sided-v1").default("fisher-exact-two-sided-v1"),alpha:e.literal(.05).default(.05),minCompletedPerArm:e.number().int().min(2).max(100),minimumAbsoluteEffect:e.number().min(.01).max(1)}).strict(),expiresAt:e.string().datetime()}).strict().superRefine((i,r)=>{if(i.mode==="exploration"&&(!i.research||!i.verification||i.eligibleTaskIds.length<=i.maxAssignments)&&r.addIssue({code:"custom",message:"Exploration requires a research justification, independent verification and reserved follow-up tasks"}),i.mode!=="exploration"&&i.verification?.tasks.some(o=>o.checks.some(l=>l.kind==="command_exit"))&&r.addIssue({code:"custom",message:"Repository checks currently support exploration only"}),i.mode!=="exploration"&&i.research&&r.addIssue({code:"custom",message:"Research enrollment is only available in explicit exploration mode"}),new Set(i.eligibleTaskIds).size!==i.eligibleTaskIds.length&&r.addIssue({code:"custom",path:["eligibleTaskIds"],message:"Eligible task IDs must be unique"}),i.maxAssignments>i.eligibleTaskIds.length&&r.addIssue({code:"custom",path:["maxAssignments"],message:"Assignment ceiling exceeds the pre-registered eligible task set"}),i.verification){let o=i.verification.tasks;(new Set(o.map(l=>l.taskId)).size!==o.length||o.length!==i.eligibleTaskIds.length||o.some(l=>!i.eligibleTaskIds.includes(l.taskId)||!l.checks.some(s=>s.primary)||new Set(l.checks.map(s=>s.name)).size!==l.checks.length))&&r.addIssue({code:"custom",path:["verification"],message:"Every eligible task needs one frozen verifier with unique checks and a primary outcome"})}i.outcomeRule.completedValues.some(o=>i.outcomeRule.failedValues.includes(o))&&r.addIssue({code:"custom",path:["outcomeRule"],message:"Outcome values must map to exactly one result"})});export{I as a,j as b,w as c,_ as d};
@@ -1,4 +1,4 @@
1
- import{b as $}from"./chunk-HXOQUYG3.js";import{a as C}from"./chunk-PDXHRF4E.js";import{a as y}from"./chunk-FG343JM3.js";import{f}from"./chunk-4GOXEEXZ.js";import{e as h,f as w}from"./chunk-GIXHG5FK.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(`
1
+ import{b as $}from"./chunk-HBDKOU2N.js";import{a as C}from"./chunk-PDXHRF4E.js";import{a as y}from"./chunk-FG343JM3.js";import{f}from"./chunk-4GOXEEXZ.js";import{e as h,f as w}from"./chunk-GIXHG5FK.js";import{a as v}from"./chunk-ZLLER3HP.js";async function N(n,i,p){let{conversationId:a,messageId:g,messageContent:r}=n,o=await h(`/api/eval-targets/${i}`),c=await h(`/api/eval-targets/${i}/evals`),e=await h(`/api/eval-conversations/${a}/messages`),t=e.findIndex(l=>l.id===g);if(t>=0&&e.slice(t+1).some(u=>u.role==="assistant"&&(u.type==="results"||u.type==="proposal"||u.type==="generated"||u.type==="text"))){p(`Message ${g} already processed \u2014 skipping (idempotency guard)`);return}let s=v(async(l,u,m)=>{await w(`/api/eval-conversations/${a}/messages/assistant`,{content:l,type:u,data:m})},"postMessage"),d=await _(o,c,e,r,p);p(`Action: ${d.action}`);try{switch(d.action){case"run_evals":await x(o,c,a,s,p);break;case"generate_cases":await k(o,i,a,s,p);break;case"analyze_results":case"propose_changes":await E(o,c,e,r,a,s,p);break;case"respond":await s(d.response,"text");break}}catch(l){let u=l instanceof Error?l.message:String(l);throw await s(`Something went wrong: ${u}`,"text").catch(()=>{}),l}}v(N,"processConversationJob");async function _(n,i,p,a,g){let r=p.slice(-10).map(e=>`${e.role}: ${e.content.slice(0,200)}`).join(`
2
2
  `),o=`You are an eval assistant. Decide what action to take based on the user's message.
3
3
 
4
4
  ## Current State
@@ -1 +1 @@
1
- import{d as i,e as n,g,h as m}from"./chunk-NJ5UED3H.js";import{b as f}from"./chunk-ZXF5NE54.js";import{a as s}from"./chunk-ZLLER3HP.js";import{Box as u,Text as t}from"ink";import{jsx as l,jsxs as e}from"react/jsx-runtime";var y={pending:{glyph:"\u25CC",color:n},queued:{glyph:"\u25CC",color:n},running:{glyph:"\u25CF",color:i},completed:{glyph:"\u2713",color:g},failed:{glyph:"\u2717",color:m},cancelled:{glyph:"\u2298",color:n}};function b(c){let p=Date.now()-new Date(c).getTime(),r=Math.floor(p/6e4);if(r<1)return"now";if(r<60)return`${r}m`;let o=Math.floor(r/60);return o<24?`${o}h`:`${Math.floor(o/24)}d`}s(b,"ago");function w({jobs:c,selectedIndex:p,focused:r}){return c.length===0?e(u,{flexDirection:"column",paddingX:1,children:[l(t,{bold:!0,color:i,children:"\u25BC Active jobs"}),l(t,{dimColor:!0,children:" (no jobs yet \u2014 press tab to focus the form below)"})]}):e(u,{flexDirection:"column",paddingX:1,children:[e(t,{bold:!0,color:i,children:["\u25BC Active jobs (last ",c.length,")"]}),c.map((o,h)=>{let d=r&&h===p,a=y[o.status]??{glyph:"?",color:n},x=o.config?.projectPath??"",T=(o.config?.prompt??"").slice(0,30);return e(t,{wrap:"truncate-end",children:[l(t,{color:d?i:n,children:d?"\u25B6 ":" "}),e(t,{color:a.color,children:[a.glyph," "]}),l(t,{dimColor:!0,children:o.status.padEnd(10)}),l(t,{children:f(o.tool).padEnd(14)}),l(t,{dimColor:!0,children:x.padEnd(28)}),e(t,{children:['"',T,'"']}),e(t,{dimColor:!0,children:[" ",b(o.createdAt)]})]},o.id)})]})}s(w,"ActiveJobsList");export{w as a};
1
+ import{b as f}from"./chunk-ZXF5NE54.js";import{d as i,e as n,g,h as m}from"./chunk-NJ5UED3H.js";import{a as s}from"./chunk-ZLLER3HP.js";import{Box as u,Text as t}from"ink";import{jsx as l,jsxs as e}from"react/jsx-runtime";var y={pending:{glyph:"\u25CC",color:n},queued:{glyph:"\u25CC",color:n},running:{glyph:"\u25CF",color:i},completed:{glyph:"\u2713",color:g},failed:{glyph:"\u2717",color:m},cancelled:{glyph:"\u2298",color:n}};function b(c){let p=Date.now()-new Date(c).getTime(),r=Math.floor(p/6e4);if(r<1)return"now";if(r<60)return`${r}m`;let o=Math.floor(r/60);return o<24?`${o}h`:`${Math.floor(o/24)}d`}s(b,"ago");function w({jobs:c,selectedIndex:p,focused:r}){return c.length===0?e(u,{flexDirection:"column",paddingX:1,children:[l(t,{bold:!0,color:i,children:"\u25BC Active jobs"}),l(t,{dimColor:!0,children:" (no jobs yet \u2014 press tab to focus the form below)"})]}):e(u,{flexDirection:"column",paddingX:1,children:[e(t,{bold:!0,color:i,children:["\u25BC Active jobs (last ",c.length,")"]}),c.map((o,h)=>{let d=r&&h===p,a=y[o.status]??{glyph:"?",color:n},x=o.config?.projectPath??"",T=(o.config?.prompt??"").slice(0,30);return e(t,{wrap:"truncate-end",children:[l(t,{color:d?i:n,children:d?"\u25B6 ":" "}),e(t,{color:a.color,children:[a.glyph," "]}),l(t,{dimColor:!0,children:o.status.padEnd(10)}),l(t,{children:f(o.tool).padEnd(14)}),l(t,{dimColor:!0,children:x.padEnd(28)}),e(t,{children:['"',T,'"']}),e(t,{dimColor:!0,children:[" ",b(o.createdAt)]})]},o.id)})]})}s(w,"ActiveJobsList");export{w as a};
@@ -0,0 +1 @@
1
+ import{a as r}from"./chunk-ZLLER3HP.js";import{createHash as I,randomUUID as T}from"node:crypto";import{closeSync as w,fsyncSync as _,linkSync as b,openSync as L,existsSync as u,mkdirSync as a,readdirSync as x,readFileSync as d,renameSync as P,rmSync as R,statSync as N,writeFileSync as C}from"node:fs";import{homedir as k}from"node:os";import{join as s}from"node:path";var E=1,z=["session","reimport","verify","settle"];function O(){let e=process.env.RULEMETRIC_CONFIG_DIR??s(k(),".config","rulemetric");return s(e,"scoped-outcomes")}r(O,"scopedOutcomeStoreRoot");var A=r(e=>I("sha256").update(e).digest("hex"),"sha256");function v(e,t){if(!/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/.test(e))throw new Error(`Unsafe ${t} for the outcome store: ${JSON.stringify(e)}`);return e}r(v,"safeSegment");function g(e,t,o=!1){let n=`${e}.tmp-${T()}`,c=L(n,"wx",384);try{C(c,t),_(c)}finally{w(c)}try{return o?b(n,e):P(n,e),!0}catch(i){if(o&&i.code==="EEXIST")return!1;throw i}finally{R(n,{force:!0})}}r(g,"writeAtomic");function p(e){return u(e)?JSON.parse(d(e,"utf8")):null}r(p,"readJson");function f(e){return s(O(),v(e,"confirmation id"))}r(f,"confirmationDir");function M(e,t){return s(f(e),v(t,"session id"))}r(M,"outcomeDir");var h=r(e=>s(f(e),"protocol.json"),"protocolPath"),S=r(e=>s(e,"transcript.jsonl"),"transcriptPath"),l=r(e=>s(e,"receipt.json"),"receiptPath"),D=r(e=>s(e,"delivery.json"),"ledgerPath");function V(e,t){let o=h(e);return a(f(e),{recursive:!0,mode:448}),g(o,JSON.stringify(t)),o}r(V,"stageProtocol");function Z(e){return p(h(e))}r(Z,"readStagedProtocol");function G(e,t){a(e,{recursive:!0,mode:448});let o=S(e);u(o)||g(o,d(t),!0);let n=d(o);return{path:o,sha256:A(n),bytes:n.length}}r(G,"preserveTranscript");function H(e,t){let o=p(l(e));if(o)return{record:o,created:!1};a(e,{recursive:!0,mode:448});let n={version:E,...t},c=g(l(e),JSON.stringify(n,null,2),!0);return{record:c?n:p(l(e)),created:c}}r(H,"writeReceiptOnce");function J(e){return p(l(e))}r(J,"readReceipt");function U(e){return p(D(e))??{version:E,sessionId:null,completed:[],attempts:0,lastError:null,completedAt:null}}r(U,"readLedger");function X(e,t){return a(e,{recursive:!0,mode:448}),g(D(e),JSON.stringify(t,null,2)),t}r(X,"writeLedger");function Y(e){return d(S(e))}r(Y,"transcriptBytes");function q(e){try{return N(e).size}catch{return null}}r(q,"transcriptSize");function K(){let e=O();if(!u(e))return[];let t=[];for(let o of x(e,{withFileTypes:!0}).filter(n=>n.isDirectory()).map(n=>n.name)){let n=s(e,o);for(let c of x(n,{withFileTypes:!0}).filter(i=>i.isDirectory()).map(i=>i.name)){let i=s(n,c),m=null,y=null;try{m=J(i),y=U(i)}catch{}t.push({dir:i,confirmationId:o,externalSessionId:c,receipt:m,ledger:y,hasTranscript:u(S(i))})}}return t}r(K,"listScopedOutcomeEntries");function Q(e){return!!e.ledger?.completedAt}r(Q,"isDelivered");function W(e){R(e,{recursive:!0,force:!0})}r(W,"removeScopedOutcomeEntry");export{E as a,z as b,O as c,f as d,M as e,h as f,S as g,l as h,D as i,V as j,Z as k,G as l,H as m,J as n,U as o,X as p,Y as q,q as r,K as s,Q as t,W as u};
@@ -1 +1 @@
1
- import{a as I}from"./chunk-ISYU5BMU.js";import{b as A,c as l,d as b}from"./chunk-DANMUHNW.js";import{f as k}from"./chunk-GIXHG5FK.js";import{n as f,o as g,p as u,v,w as $,x as y}from"./chunk-X6CF5KTW.js";import{a as c}from"./chunk-ZLLER3HP.js";import{randomUUID as P}from"node:crypto";async function H(s){let{applyMode:e="human",...r}=s;await k("/api/recommendation-applications",{...r,harness:"claude_code",applyMode:e,status:"applied",applyBatchId:P(),applySeq:0})}c(H,"recordApplication");async function M(s,e){let r=c(t=>({action:"manual-required",instructionId:e.id,name:e.name,fileModified:!1,messages:t}),"refuse");if(s.actor!=="human")return r([`Not installed: ${e.name} is a hook, and a hook is a command this machine runs unattended.`,"Installing one is always a human decision \u2014 the same refusal the API makes server-side.",` Review it: rulemetric suggestions accept ${s.suggestionId}`]);let n=y(e);if(!n.spec)return r([`Not installed: ${e.name} does not contain an installable hook spec.`,...n.problems.map(t=>` ${t.field}: ${t.message}`)]);if(n.problems.length>0)return r([`Not installed: ${e.name}'s hook spec is not fit to act on.`,...n.problems.map(t=>` ${t.field}: ${t.message}`)]);let w=u(e.frontmatter),i=v(n.spec,w??void 0),p=f(i);if(p.length>0)return r([`Not installed: ${e.name}'s artifact spec is not fit to act on.`,...p.map(t=>` ${t.field}: ${t.message}`)]);let o=b(s.dir,i.requires);if(o.missing.length>0)return r([`Not installed: ${e.name} needs ${o.missing.join(", ")}, which is not present here.`,"It is left unapplied rather than installed and broken \u2014 a hook whose command is missing still runs, and fails, on every matching event.","Accept it again once the dependency exists."]);let a=A({dir:s.dir,instructionId:e.id,spec:n.spec});if(a.status==="refused")return r([`Not installed: ${e.name}.`,` ${a.reason}`]);let m=g(i,a.inverse);if(m.length>0)return l({dir:s.dir,inverse:a.inverse}),r([`Not installed: ${e.name} was written and then rolled back \u2014 the actuator could not produce a valid inverse.`,...m.map(t=>` ${t.field}: ${t.message}`)]);try{await H({instructionId:e.id,projectPath:s.projectPath,targetPath:a.target,beforeHash:a.beforeHash,appliedHash:a.inverse.hashAtWrite,boundaryClass:i.boundaryClass,targets:i.targets,inverse:a.inverse,requires:i.requires,provides:i.provides})}catch(t){let h=l({dir:s.dir,inverse:a.inverse});return r([`Not installed: ${e.name} \u2014 the effect could not be recorded, so it was undone.`,` ${t instanceof Error?t.message:String(t)}`,h.removed?" The hook was removed; your settings are as they were.":` WARNING: the rollback did not complete (${h.reason??"unknown reason"}). Check ${a.target} for the entry tagged with ${e.id}.`])}await I(s.suggestionId,s.projectPath,e.id,s.actor);let d=a.status==="installed"?[`Accepted: installed a ${n.spec.event} hook into ${a.target}.`]:[`Already present: this hook is already installed in ${a.target}.`];for(let t of $(n.spec))d.push(` ${t}`);return o.unverifiable.length>0&&d.push(` unchecked: ${o.unverifiable.join(", ")} \u2014 this command cannot verify that namespace.`),d.push(`Undo with: rulemetric suggestions undo ${e.id}`),{action:a.status==="installed"?"added":"already-present",instructionId:e.id,name:e.name,fileModified:a.status==="installed",messages:d}}c(M,"acceptHook");export{H as a,M as b};
1
+ import{b as A,c as l,d as b}from"./chunk-DANMUHNW.js";import{a as I}from"./chunk-ISYU5BMU.js";import{f as k}from"./chunk-GIXHG5FK.js";import{n as f,o as g,p as u,v,w as $,x as y}from"./chunk-X6CF5KTW.js";import{a as c}from"./chunk-ZLLER3HP.js";import{randomUUID as P}from"node:crypto";async function H(s){let{applyMode:e="human",...r}=s;await k("/api/recommendation-applications",{...r,harness:"claude_code",applyMode:e,status:"applied",applyBatchId:P(),applySeq:0})}c(H,"recordApplication");async function M(s,e){let r=c(t=>({action:"manual-required",instructionId:e.id,name:e.name,fileModified:!1,messages:t}),"refuse");if(s.actor!=="human")return r([`Not installed: ${e.name} is a hook, and a hook is a command this machine runs unattended.`,"Installing one is always a human decision \u2014 the same refusal the API makes server-side.",` Review it: rulemetric suggestions accept ${s.suggestionId}`]);let n=y(e);if(!n.spec)return r([`Not installed: ${e.name} does not contain an installable hook spec.`,...n.problems.map(t=>` ${t.field}: ${t.message}`)]);if(n.problems.length>0)return r([`Not installed: ${e.name}'s hook spec is not fit to act on.`,...n.problems.map(t=>` ${t.field}: ${t.message}`)]);let w=u(e.frontmatter),i=v(n.spec,w??void 0),p=f(i);if(p.length>0)return r([`Not installed: ${e.name}'s artifact spec is not fit to act on.`,...p.map(t=>` ${t.field}: ${t.message}`)]);let o=b(s.dir,i.requires);if(o.missing.length>0)return r([`Not installed: ${e.name} needs ${o.missing.join(", ")}, which is not present here.`,"It is left unapplied rather than installed and broken \u2014 a hook whose command is missing still runs, and fails, on every matching event.","Accept it again once the dependency exists."]);let a=A({dir:s.dir,instructionId:e.id,spec:n.spec});if(a.status==="refused")return r([`Not installed: ${e.name}.`,` ${a.reason}`]);let m=g(i,a.inverse);if(m.length>0)return l({dir:s.dir,inverse:a.inverse}),r([`Not installed: ${e.name} was written and then rolled back \u2014 the actuator could not produce a valid inverse.`,...m.map(t=>` ${t.field}: ${t.message}`)]);try{await H({instructionId:e.id,projectPath:s.projectPath,targetPath:a.target,beforeHash:a.beforeHash,appliedHash:a.inverse.hashAtWrite,boundaryClass:i.boundaryClass,targets:i.targets,inverse:a.inverse,requires:i.requires,provides:i.provides})}catch(t){let h=l({dir:s.dir,inverse:a.inverse});return r([`Not installed: ${e.name} \u2014 the effect could not be recorded, so it was undone.`,` ${t instanceof Error?t.message:String(t)}`,h.removed?" The hook was removed; your settings are as they were.":` WARNING: the rollback did not complete (${h.reason??"unknown reason"}). Check ${a.target} for the entry tagged with ${e.id}.`])}await I(s.suggestionId,s.projectPath,e.id,s.actor);let d=a.status==="installed"?[`Accepted: installed a ${n.spec.event} hook into ${a.target}.`]:[`Already present: this hook is already installed in ${a.target}.`];for(let t of $(n.spec))d.push(` ${t}`);return o.unverifiable.length>0&&d.push(` unchecked: ${o.unverifiable.join(", ")} \u2014 this command cannot verify that namespace.`),d.push(`Undo with: rulemetric suggestions undo ${e.id}`),{action:a.status==="installed"?"added":"already-present",instructionId:e.id,name:e.name,fileModified:a.status==="installed",messages:d}}c(M,"acceptHook");export{H as a,M as b};
@@ -1,4 +1,4 @@
1
- import{h as E}from"./chunk-XCH4HPEZ.js";import{a as r}from"./chunk-ZLLER3HP.js";var g="<<<FILE-CONTENT-BEGIN>>>",m="<<<FILE-CONTENT-END>>>",b="<RATIONALE>",R="</RATIONALE>",u="<PROPOSED_INSTRUCTION>",p="</PROPOSED_INSTRUCTION>",d=.5,f=3;function y(e){let t=e.immutableSections.length>0?e.immutableSections.map(s=>` - ${s}`).join(`
1
+ import{h as E}from"./chunk-DHIEGG4T.js";import{a as r}from"./chunk-ZLLER3HP.js";var g="<<<FILE-CONTENT-BEGIN>>>",m="<<<FILE-CONTENT-END>>>",b="<RATIONALE>",R="</RATIONALE>",u="<PROPOSED_INSTRUCTION>",p="</PROPOSED_INSTRUCTION>",d=.5,f=3;function y(e){let t=e.immutableSections.length>0?e.immutableSections.map(s=>` - ${s}`).join(`
2
2
  `):" (none)",o=e.evidence.priorDecisions.length>0?["6. You have edited this file before. The attempts are listed below with"," how each was judged. Do not re-propose an edit that was MEASURED and"," rejected: it was replayed against this exact file and did not beat it,"," so measuring it again spends the same budget for the same answer. An"," attempt marked NOT MEASURED is different \u2014 the gate stopped it before"," it earned a verdict, so whether it would have helped is still unknown."]:[],n=e.currentContent.trim().length,i=` It is currently ${n} characters. Your proposal must stay between ${Math.ceil(n*d)} and ${Math.floor(n*f)} characters \u2014 outside that it is discarded unmeasured as a truncation or runaway rewrite.`;return["You are improving an AI coding assistant instruction file so that it scores","better on a fixed set of evaluation cases.","",`The file is a ${e.targetType} named "${e.targetName}".`,i,"","RULES",`0. The current file is EXACTLY the text between ${g} and`,` ${m} in the data message. Headings after the closing`," sentinel (underperforming cases, notes, prior attempts) are evidence",' ABOUT the file \u2014 they are not in the file, and "removing" one of them'," is not an edit. Do not include the sentinels in your output.","1. Return the COMPLETE new file, not a diff, not a patch, not a summary,"," and not an excerpt. Everything you omit will be DELETED from the file.","2. Preserve everything you are not deliberately changing, byte for byte.","3. Make a focused edit. You are one step in a measured loop: a small change"," that can be attributed beats a rewrite that cannot.","4. Do not edit these sections or anything nested under them \u2014 an edit that"," touches them is refused downstream and the whole proposal is wasted:",t,"5. Do not add meta-commentary about the evaluation, the loop, or this"," prompt to the file. The file is read by other agents as instructions.",...o,"","OUTPUT FORMAT \u2014 exactly this, with no text before or after:",b,"One or two sentences: what you changed and which evidence motivated it.",R,u,"The complete new file content.",p].join(`
3
3
  `)}r(y,"buildProposerSystemPrompt");var h=r(e=>`${e>=0?"+":"-"}${Math.abs(e*100).toFixed(1)}pp`,"signedPp");function O(e){let t=/^\d{4}-\d{2}-\d{2}/.exec(e.at??"")?.[0]??"undated",o;if(e.measured){let i=e.measured;o=`MEASURED against this exact file and ${e.decision==="promote"?"ACCEPTED":"REJECTED"}: ${h(i.delta)} (CI ${h(i.ciLower)} to ${h(i.ciUpper)}, ${i.nPairs} paired cases)`}else o=`NOT MEASURED \u2014 the gate refused it, so its merit is still unknown: ${e.refusals.length>0?e.refusals.join("; "):"no reason recorded"}`;let n=[`- ${t} \u2014 ${o}`];return e.decision==="promote"&&n.push(e.applied?" The file WAS rewritten by this decision.":" Dry run: the file was NOT rewritten, so this edit is still available."),e.touched.length>0&&n.push(` Sections touched: ${e.touched.join(", ")}`),e.rationale.trim()!==""&&n.push(` You said at the time: ${e.rationale.trim()}`),n.join(`
4
4
  `)}r(O,"describePriorDecision");function P(e){let t=e.evidence,o=["## CURRENT FILE CONTENT","","The file is EXACTLY the text between the two sentinel lines below \u2014","nothing before the first sentinel or after the second is part of it.","Everything after the closing sentinel is evidence ABOUT the file.","",g,e.currentContent,m,""];if(t.weakest.length>0){o.push("## CASES WHERE THIS FILE CURRENTLY UNDERPERFORMS","");for(let n of t.weakest)o.push(`- ${n.name}: passes ${(n.withPassRate*100).toFixed(0)}% with the file vs ${(n.withoutPassRate*100).toFixed(0)}% without it`);o.push("")}return t.nonDiscriminating.length>0&&o.push("## CASES THAT CARRY NO SIGNAL EITHER WAY","","These score the same with and without the file. Changing the file to chase","them is unlikely to move anything.","",...t.nonDiscriminating.map(n=>`- ${n}`),""),t.priorDecisions.length>0&&o.push("## WHAT YOU ALREADY PROPOSED FOR THIS FILE, AND HOW IT WAS JUDGED","","Newest first. Every attempt listed here was made against the file above,","byte for byte. Attempts against a different version of the file are not","shown, because a verdict earned by different text says nothing about this","one.","",...t.priorDecisions.map(O),""),t.notes.length>0&&o.push("## NOTES","",...t.notes.map(n=>`- ${n}`),""),o.join(`
@@ -0,0 +1,3 @@
1
+ import{h as R}from"./chunk-CVPAKEEZ.js";import{g as x}from"./chunk-CDSSOOIG.js";import{a as $,b as S,c as v,f as w,g as A}from"./chunk-SIGZEQ3K.js";import{e as y,f}from"./chunk-GIXHG5FK.js";import{a as c}from"./chunk-ZLLER3HP.js";import{execFileSync as P}from"node:child_process";import{openSync as C,readSync as j,closeSync as E,readFileSync as I}from"node:fs";function W(l){let t;try{t=C(l,"r");let o=Buffer.alloc(64*1024),s=j(t,o,0,o.length,0),i=o.subarray(0,s).toString("utf-8");for(let n of i.split(`
2
+ `))if(n.startsWith("{"))try{let a=JSON.parse(n).cwd;if(typeof a=="string"&&a.startsWith("/"))return a}catch{}return null}catch{return null}finally{t!==void 0&&E(t)}}c(W,"readTranscriptCwd");function k(l){let t=c(n=>{try{return P("git",["-C",l,...n],{encoding:"utf-8",stdio:["ignore","pipe","ignore"],timeout:5e3}).trim()||null}catch{return null}},"git");if(!t(["rev-parse","--show-toplevel"]))return null;let s=t(["rev-parse","--git-dir"]),i=t(["rev-parse","--git-common-dir"]);return{gitRemote:t(["remote","get-url","origin"]),gitRootCommit:t(["rev-list","--max-parents=0","HEAD"])?.split(`
3
+ `).pop()?.trim()??null,gitBranch:t(["branch","--show-current"]),isWorktree:!!s&&!!i&&s!==i}}c(k,"gitAnchors");async function F(l,t,o=S(k,W)){let s=Math.min(l.limit??200,1e3);try{let e=await x(r=>t.logger.info(r));e.scanned>0&&t.logger.info(`scoped outcomes: scanned=${e.scanned} delivered=${e.delivered} failed=${e.failed} unmeasured=${e.unmeasured}`)}catch(e){t.logger.info(`scoped outcome resume sweep failed: ${e.message}`)}let i=await R(()=>y(`/api/sessions/unattributed?limit=${s}`),{log:c(e=>t.logger.info(e),"log"),label:"sessions/unattributed",idempotent:!0}),n=i.sessions??[],a=i.total??n.length;if(n.length===0)return t.logger.info("no unattributed sessions"),{scanned:0,repaired:0,reimported:0,unrepairable:0,remaining:0};let m=0,g=0,d=0;for(let e of n){if(!e.externalSessionId){d++;continue}let r=A(e,o);if(!r){d++;continue}try{await f("/api/sessions",{tool:e.tool,externalSessionId:e.externalSessionId,projectPath:r.projectPath,...r.gitBranch?{gitBranch:r.gitBranch}:{},metadata:{...r.gitRemote?{gitRemote:r.gitRemote}:{},...r.gitRootCommit?{gitRootCommit:r.gitRootCommit}:{},isWorktree:r.isWorktree,reconciledAttribution:!0}}),m++}catch(u){d++,t.logger.info(`reconcile failed for ${e.externalSessionId}: ${u.message}`);continue}let p=e.tool==="claude_code"?v(e.externalSessionId,o):null,b=w({tool:e.tool,pathWasJunk:!!e.projectPath&&$(e.projectPath),endedAt:e.endedAt??null,transcript:p?o.stat(p):null});if(b.reimport&&p)try{let u=I(p,"utf-8");await f(`/api/sessions/${e.id}/reimport`,{content:u,tool:"claude_code"}),g++}catch(u){t.logger.info(`reimport failed for ${e.externalSessionId} (${b.reason}): ${u.message}`)}}let h=a-m;return t.logger.info(`reconciled attribution: scanned=${n.length} repaired=${m} reimported=${g} unrepairable=${d} remaining=${h} (of ${a} total)`),{scanned:n.length,repaired:m,reimported:g,unrepairable:d,remaining:h}}c(F,"cronReconcileAttribution");export{F as a};
@@ -1 +1 @@
1
- import{c as q,d as K}from"../chunk-TYFEWLYZ.js";import{b as L,c as W}from"../chunk-V5U3E4BZ.js";import{a as J}from"../chunk-2TJ7Q2OU.js";import{e as O,f as _,g as M}from"../chunk-QWCEZEDO.js";import"../chunk-KKDHD4XA.js";import"../chunk-SZ62CP55.js";import{d as oe,e as ne}from"../chunk-ZMVTSYD4.js";import"../chunk-M7QSC64D.js";import"../chunk-7LFCZI64.js";import"../chunk-ISEUEYSC.js";import{i as z,j as Q,k as Z,m as ee,n as te}from"../chunk-GYKYJJNF.js";import"../chunk-G7V4ZZZ3.js";import"../chunk-LJE5J3EW.js";import"../chunk-AHLVY52I.js";import"../chunk-YXMAGC53.js";import"../chunk-T7HZZ4DJ.js";import"../chunk-XCH4HPEZ.js";import"../chunk-PPAHIVG5.js";import"../chunk-CT7FWSIU.js";import"../chunk-5MXZJWQS.js";import"../chunk-N7ODX6PO.js";import{a as V}from"../chunk-OZQNSELV.js";import"../chunk-HFGO5762.js";import"../chunk-VS5ROGDP.js";import"../chunk-FADINV4H.js";import"../chunk-SWSOEYC7.js";import"../chunk-U2NT5OSQ.js";import"../chunk-KGURGIZ2.js";import"../chunk-GYNZ3OZF.js";import"../chunk-UPFH72PF.js";import"../chunk-FG343JM3.js";import"../chunk-CDY7TQFZ.js";import"../chunk-KFNFLMUR.js";import"../chunk-4GOXEEXZ.js";import"../chunk-JP6ULOEX.js";import"../chunk-JNLDISBA.js";import{d as F}from"../chunk-GPBN4ROE.js";import"../chunk-6XTLP2G7.js";import"../chunk-PJ3WHQ67.js";import{a as X,b as D,c as Y,g as j,h as G}from"../chunk-QI3FJKGK.js";import{a as B}from"../chunk-WUCACPGC.js";import"../chunk-IZTIYR5Q.js";import"../chunk-WL5ZWQAS.js";import"../chunk-KEVDLLHT.js";import"../chunk-DX6IPDED.js";import"../chunk-3AV3GTMP.js";import{a as U,e as y}from"../chunk-GIXHG5FK.js";import"../chunk-X6CF5KTW.js";import"../chunk-XQYAVSUQ.js";import{a as N,g as v,l as x}from"../chunk-PZNWH4VQ.js";import{a as S}from"../chunk-ZLLER3HP.js";import{spawnSync as le}from"node:child_process";import{existsSync as ce,readFileSync as ue}from"node:fs";import{join as se}from"node:path";var I=class h extends B{static{S(this,"Diagnostics")}static description='Diagnose capture / proxy / connectivity problems (e.g. a client-side "502 Bad Gateway")';static examples=["<%= config.bin %> diagnostics"];baseUrl(){return process.env.RULEMETRIC_API_URL??N().apiUrl??U}async checkDirect(){let r=process.env.HTTPS_PROXY,i=process.env.HTTP_PROXY;delete process.env.HTTPS_PROXY,delete process.env.HTTP_PROXY;let s=new AbortController,l=setTimeout(()=>s.abort(),8e3);try{return(await globalThis.fetch(`${this.baseUrl()}/health`,{signal:s.signal})).ok}catch{return!1}finally{clearTimeout(l),r!==void 0&&(process.env.HTTPS_PROXY=r),i!==void 0&&(process.env.HTTP_PROXY=i)}}configuredProxy(){if(process.env.HTTPS_PROXY)return process.env.HTTPS_PROXY;for(let r of["settings.local.json","settings.json"]){let i=se(process.cwd(),".claude",r);if(ce(i))try{let s=JSON.parse(ue(i,"utf8"));if(s.env?.HTTPS_PROXY)return s.env.HTTPS_PROXY}catch{}}return null}checkThroughProxy(r){let i=le("curl",["-sS","-x",r,"--max-time","8","-o","/dev/null","-w","%{http_code}",`${this.baseUrl()}/health`],{encoding:"utf8",stdio:["ignore","pipe","ignore"]});return i.error||typeof i.stdout!="string"?null:i.stdout.trim()==="200"}async run(){await this.parse(h);let r=process.version,i=this.configuredProxy(),s=i!=null,[l,m,d]=await Promise.all([this.checkDirect(),M(O),M(_)]),p=s&&i?this.checkThroughProxy(i):null,t=S((e,c,T)=>{let u=c===null?"\u2013":c?"[OK]":"[!!]";this.log(` ${u} ${e.padEnd(22)} ${T}`)},"line");this.log("RuleMetric diagnostics"),this.log(""),t("Node",!L(r),`${r}${L(r)?" (< 20.11 \u2014 breaks the bundled proxy)":""}`),t("API (direct)",l,`${this.baseUrl()}/health ${l?"reachable":"UNREACHABLE"}`),t("Authenticated",v(),v()?"yes":"no \u2014 run `rulemetric auth login`"),t("Proxy configured",s?!0:null,s?i:"no HTTPS_PROXY set"),s&&(t("Gateway :"+O,m,m?"listening":"NOT listening"),t("mitmproxy :"+_,d,d?"listening":"not listening (gateway should route direct)"),t("API (via proxy)",p,p===null?"inconclusive (curl unavailable)":p?"reachable":"FAILED \u2014 502/blocked through your proxy"));let a=F();t("claude CLI",a.claudeBin!=null,a.claudeBin??"not found \u2014 LLM features (grading, distill) will no-op"),t("codex CLI",a.codexBin!=null?!0:null,a.codexBin?`${a.codexBin}${a.codexConfiguredModel?` (model ${a.codexConfiguredModel})`:""}`:"not found \u2014 optional; enables the cross-vendor reviewer (evals validate-judge)");let o=null;if(v()&&l)try{o=await y("/api/workers/health")}catch{o=null}if(o){let e=o.worker;t("Worker",!!e.active,e.present?e.active?`online (last heartbeat ${e.ageSeconds??"?"}s ago${e.clientVersion?`, v${e.clientVersion}`:""})`:`NOT RUNNING \u2014 last heartbeat ${A(e.ageSeconds)} ago`:"never connected \u2014 no worker has ever reported in");let c=o.worker.engines;if(c!=null){let u=[c.claude&&"claude",c.codex&&"codex"].filter(Boolean);t("LLM engine",u.length>0,u.length>0?`${u.join(" + ")} available to the worker`:"NONE \u2014 the worker found no `claude` and no `codex`. LLM jobs will complete with empty output rather than failing.")}let T=o.pending.reduce((u,E)=>u+E.count,0);if(T>0){let u=o.verdict.stuck.reduce(($,k)=>$+k.count,0),E=o.verdict.unclaimable.reduce(($,k)=>$+k.count,0),R=(o.verdict.engineBlocked??[]).reduce(($,k)=>$+k.count,0);t("Job queue",u===0&&R===0,`${T} pending`+(u>0?` \u2014 ${u} waiting on this worker`:"")+(R>0?` \u2014 ${R} need a local LLM engine`:"")+(E>0?` \u2014 ${E} need a worker with DATABASE_URL`:""))}else t("Job queue",!0,"empty")}else v()&&l&&t("Worker",null,"could not read /workers/health (older API?)");let n=o?.worker.machine;if(n){let e=n.suspends+n.stalls,c=n.lastPause;t("Worker pauses",e===0?!0:null,e===0?`none since ${n.since} \u2014 no sleep or stall seen by the worker`:`${n.suspends} suspend${n.suspends===1?"":"s"}`+(n.stalls>0?` + ${n.stalls} event-loop stall${n.stalls===1?"":"s"}`:"")+` since ${n.since}, ${A(Math.round(n.pausedMs/1e3))} paused total`+(c?`; last: ${c.kind} of ${A(Math.round(c.wallGapMs/1e3))} ending ${c.detectedAt}`:"")+" \u2014 jobs in flight during a suspend lose their lease and are redone on wake")}let f=await q();if(f){t("Machine sleep (pmset)",f.sleeps===0?!0:null,K(f));for(let e of f.recent.slice(-3)){let c=e.seconds!=null?` (${A(e.seconds)})`:"";this.log(` \u21B3 ${e.at.toISOString()} ${e.kind}${c}: ${e.reason.slice(0,80)}`)}}let C=V(process.cwd()),g=await D({configDir:x()}),re=await Y({configDir:x()}),w=` \u2014 ${G(re)}`,b=J(process.cwd()),H=[b.user&&`user hooks (${b.user})`,b.workspace&&`workspace hooks (${b.workspace})`].filter(Boolean),ie={claude_code:`session hooks (+ proxy for instruction linking)${w}`,codex:`worker transcript sync of ~/.codex/sessions \u2014 ${j(g)}`,cursor:`user hooks (~/.cursor/hooks.json)${w}`,copilot_agent:`workspace hooks${w}`,antigravity:H.length>0?`${H.join(" + ")}${w}`:"NOT CAPTURED \u2014 no rulemetric block in ~/.gemini/config/hooks.json or .agents/hooks.json; run `rulemetric hooks install` (user hooks are on by default)"};this.log(""),this.log(" Capture coverage (agents found on this machine):");for(let e of C)this.log(` \u2022 ${e.padEnd(15)} ${ie[e]??"captured"}`);if(C.includes("codex"))if(g.error)this.log(` ! ${g.error}`);else if(g.mode==="allowlist")for(let e of g.roots)this.log(` \u21B3 ${e}`);else g.mode==="all"&&this.log(` \u21B3 scope it with ${se(x(),X)} ({"codex":{"roots":["/path/to/repo"]}}) or RULEMETRIC_CODEX_CAPTURE=off`);o&&!o.worker.active&&C.includes("codex")&&g.mode!=="off"&&this.log(" ! Codex capture runs INSIDE the worker \u2014 it is stopped while the worker is down."),v()&&l&&await this.reportEvolutionSpend();let P=W({nodeVersion:r,directApiOk:l,httpsProxySet:s,gatewayAlive:m,mitmproxyAlive:d,proxyPathOk:p});this.log("");let ae=P.severity==="ok"?"[OK]":P.severity==="warn"?"[!!]":"[XX]";this.log(`${ae} ${P.headline}`);for(let e of P.hints)this.log(` \u2022 ${e}`);if(o&&o.verdict.severity!=="ok"){let e=o.verdict.severity==="warn"?"[!!]":"[XX]";this.log(""),this.log(`${e} ${o.verdict.headline}`);for(let c of o.verdict.hints)this.log(` \u2022 ${c}`)}}async reportEvolutionSpend(){let r;try{r=await y("/api/eval-targets?type=instruction&limit=200")}catch{return}let i=r.filter(s=>{let l=s.metadata??{};return l.autoEvolveEnabled===!0||l.autoEvolveEnabled==="true"});if(i.length!==0){this.log(""),this.log(" Nightly instruction evolution (cron_instruction_evolution, 07:30 UTC):");for(let s of i){let l=s.metadata??{},m=Q(l),d=z(l);if(m){this.log(` \u2022 ${s.name} \u2014 PAUSED (metadata.autoEvolvePaused). Opt-in preserved.`),this.log(" \u21B3 resume: set autoEvolvePaused=false");continue}let p=null;try{p=(await y(`/api/eval-targets/${s.id}/evals`)).filter(a=>!a.retiredAt).length}catch{}if(this.log(` \u2022 ${s.name}`),p!=null){let t=ne(p,d.minPairs,oe(d,p));if(!t.feasible)this.log(` \u21B3 cannot reach a verdict \u2014 ${t.reason}`);else{let a=Z({liveCases:p,passes:t.passes});this.log(` \u21B3 each night: ${te(a)}`)}}this.log(` \u21B3 pairs budget ${d.minPairs}`+(d.configured?" (metadata.autoEvolvePairs)":" (default)")+` \xB7 writes ${l.autoEvolveApply===!0||l.autoEvolveApply==="true"?"ENABLED":"off (dry run)"}`),d.note&&this.log(` ! ${d.note}`);try{let t=await y(`/api/eval-targets/${s.id}/promotions?limit=1`),a=t.promotions[0];if(a){let n=a.gates?.cost,f=n?.modelCalls?`${n.modelCalls} model calls, ${n.usablePairs??"?"} usable pair(s)`+(n.mde!=null?`, resolved +/-${ee(n.mde)}`:"")+(n.wallMs?`, ${(n.wallMs/6e4).toFixed(0)} min`:""):"cost not recorded (decision predates cost tracking)";this.log(` \u21B3 last run ${new Date(a.createdAt).toISOString().slice(0,10)}: ${a.decision}${a.applied?" (APPLIED)":""} \u2014 ${f}`)}let o=t.counts??{};this.log(` \u21B3 lifetime: ${o.promote??0} promote / ${o.revert??0} revert / ${o.refuse??0} refuse`)}catch{}}this.log(" \u21B3 pause the spend: metadata.autoEvolvePaused=true (keeps the opt-in)")}}};function A(h){if(h===null)return"never";if(h<90)return`${Math.round(h)}s`;let r=Math.round(h/60);return r<90?`${r}m`:`${Math.round(r/60)}h`}S(A,"formatAge");export{I as default};
1
+ import{c as q,d as K}from"../chunk-TYFEWLYZ.js";import{b as L,c as W}from"../chunk-V5U3E4BZ.js";import{a as J}from"../chunk-2TJ7Q2OU.js";import{e as O,f as _,g as M}from"../chunk-QWCEZEDO.js";import"../chunk-KKDHD4XA.js";import"../chunk-SZ62CP55.js";import{d as oe,e as ne}from"../chunk-KGU2IW54.js";import"../chunk-M7QSC64D.js";import"../chunk-ZKPURXUS.js";import"../chunk-ISEUEYSC.js";import{i as z,j as Q,k as Z,m as ee,n as te}from"../chunk-GYKYJJNF.js";import"../chunk-G7V4ZZZ3.js";import"../chunk-LJE5J3EW.js";import"../chunk-AHLVY52I.js";import"../chunk-YXMAGC53.js";import"../chunk-T7HZZ4DJ.js";import"../chunk-DHIEGG4T.js";import"../chunk-PPAHIVG5.js";import"../chunk-5MXZJWQS.js";import"../chunk-CT7FWSIU.js";import"../chunk-N7ODX6PO.js";import{a as V}from"../chunk-OZQNSELV.js";import"../chunk-HFGO5762.js";import"../chunk-VS5ROGDP.js";import"../chunk-FADINV4H.js";import"../chunk-SWSOEYC7.js";import"../chunk-U2NT5OSQ.js";import"../chunk-KGURGIZ2.js";import"../chunk-GYNZ3OZF.js";import"../chunk-UPFH72PF.js";import"../chunk-FG343JM3.js";import"../chunk-CDY7TQFZ.js";import"../chunk-KFNFLMUR.js";import"../chunk-4GOXEEXZ.js";import"../chunk-JP6ULOEX.js";import"../chunk-JNLDISBA.js";import{d as F}from"../chunk-GPBN4ROE.js";import"../chunk-6XTLP2G7.js";import"../chunk-PJ3WHQ67.js";import{a as X,b as D,c as Y,g as j,h as G}from"../chunk-QI3FJKGK.js";import{a as B}from"../chunk-WUCACPGC.js";import"../chunk-IZTIYR5Q.js";import"../chunk-WL5ZWQAS.js";import"../chunk-KEVDLLHT.js";import"../chunk-DX6IPDED.js";import"../chunk-3AV3GTMP.js";import{a as U,e as y}from"../chunk-GIXHG5FK.js";import"../chunk-X6CF5KTW.js";import"../chunk-XQYAVSUQ.js";import{a as N,g as v,l as x}from"../chunk-PZNWH4VQ.js";import{a as S}from"../chunk-ZLLER3HP.js";import{spawnSync as le}from"node:child_process";import{existsSync as ce,readFileSync as ue}from"node:fs";import{join as se}from"node:path";var I=class h extends B{static{S(this,"Diagnostics")}static description='Diagnose capture / proxy / connectivity problems (e.g. a client-side "502 Bad Gateway")';static examples=["<%= config.bin %> diagnostics"];baseUrl(){return process.env.RULEMETRIC_API_URL??N().apiUrl??U}async checkDirect(){let r=process.env.HTTPS_PROXY,i=process.env.HTTP_PROXY;delete process.env.HTTPS_PROXY,delete process.env.HTTP_PROXY;let s=new AbortController,l=setTimeout(()=>s.abort(),8e3);try{return(await globalThis.fetch(`${this.baseUrl()}/health`,{signal:s.signal})).ok}catch{return!1}finally{clearTimeout(l),r!==void 0&&(process.env.HTTPS_PROXY=r),i!==void 0&&(process.env.HTTP_PROXY=i)}}configuredProxy(){if(process.env.HTTPS_PROXY)return process.env.HTTPS_PROXY;for(let r of["settings.local.json","settings.json"]){let i=se(process.cwd(),".claude",r);if(ce(i))try{let s=JSON.parse(ue(i,"utf8"));if(s.env?.HTTPS_PROXY)return s.env.HTTPS_PROXY}catch{}}return null}checkThroughProxy(r){let i=le("curl",["-sS","-x",r,"--max-time","8","-o","/dev/null","-w","%{http_code}",`${this.baseUrl()}/health`],{encoding:"utf8",stdio:["ignore","pipe","ignore"]});return i.error||typeof i.stdout!="string"?null:i.stdout.trim()==="200"}async run(){await this.parse(h);let r=process.version,i=this.configuredProxy(),s=i!=null,[l,m,d]=await Promise.all([this.checkDirect(),M(O),M(_)]),p=s&&i?this.checkThroughProxy(i):null,t=S((e,c,T)=>{let u=c===null?"\u2013":c?"[OK]":"[!!]";this.log(` ${u} ${e.padEnd(22)} ${T}`)},"line");this.log("RuleMetric diagnostics"),this.log(""),t("Node",!L(r),`${r}${L(r)?" (< 20.11 \u2014 breaks the bundled proxy)":""}`),t("API (direct)",l,`${this.baseUrl()}/health ${l?"reachable":"UNREACHABLE"}`),t("Authenticated",v(),v()?"yes":"no \u2014 run `rulemetric auth login`"),t("Proxy configured",s?!0:null,s?i:"no HTTPS_PROXY set"),s&&(t("Gateway :"+O,m,m?"listening":"NOT listening"),t("mitmproxy :"+_,d,d?"listening":"not listening (gateway should route direct)"),t("API (via proxy)",p,p===null?"inconclusive (curl unavailable)":p?"reachable":"FAILED \u2014 502/blocked through your proxy"));let a=F();t("claude CLI",a.claudeBin!=null,a.claudeBin??"not found \u2014 LLM features (grading, distill) will no-op"),t("codex CLI",a.codexBin!=null?!0:null,a.codexBin?`${a.codexBin}${a.codexConfiguredModel?` (model ${a.codexConfiguredModel})`:""}`:"not found \u2014 optional; enables the cross-vendor reviewer (evals validate-judge)");let o=null;if(v()&&l)try{o=await y("/api/workers/health")}catch{o=null}if(o){let e=o.worker;t("Worker",!!e.active,e.present?e.active?`online (last heartbeat ${e.ageSeconds??"?"}s ago${e.clientVersion?`, v${e.clientVersion}`:""})`:`NOT RUNNING \u2014 last heartbeat ${A(e.ageSeconds)} ago`:"never connected \u2014 no worker has ever reported in");let c=o.worker.engines;if(c!=null){let u=[c.claude&&"claude",c.codex&&"codex"].filter(Boolean);t("LLM engine",u.length>0,u.length>0?`${u.join(" + ")} available to the worker`:"NONE \u2014 the worker found no `claude` and no `codex`. LLM jobs will complete with empty output rather than failing.")}let T=o.pending.reduce((u,E)=>u+E.count,0);if(T>0){let u=o.verdict.stuck.reduce(($,k)=>$+k.count,0),E=o.verdict.unclaimable.reduce(($,k)=>$+k.count,0),R=(o.verdict.engineBlocked??[]).reduce(($,k)=>$+k.count,0);t("Job queue",u===0&&R===0,`${T} pending`+(u>0?` \u2014 ${u} waiting on this worker`:"")+(R>0?` \u2014 ${R} need a local LLM engine`:"")+(E>0?` \u2014 ${E} need a worker with DATABASE_URL`:""))}else t("Job queue",!0,"empty")}else v()&&l&&t("Worker",null,"could not read /workers/health (older API?)");let n=o?.worker.machine;if(n){let e=n.suspends+n.stalls,c=n.lastPause;t("Worker pauses",e===0?!0:null,e===0?`none since ${n.since} \u2014 no sleep or stall seen by the worker`:`${n.suspends} suspend${n.suspends===1?"":"s"}`+(n.stalls>0?` + ${n.stalls} event-loop stall${n.stalls===1?"":"s"}`:"")+` since ${n.since}, ${A(Math.round(n.pausedMs/1e3))} paused total`+(c?`; last: ${c.kind} of ${A(Math.round(c.wallGapMs/1e3))} ending ${c.detectedAt}`:"")+" \u2014 jobs in flight during a suspend lose their lease and are redone on wake")}let f=await q();if(f){t("Machine sleep (pmset)",f.sleeps===0?!0:null,K(f));for(let e of f.recent.slice(-3)){let c=e.seconds!=null?` (${A(e.seconds)})`:"";this.log(` \u21B3 ${e.at.toISOString()} ${e.kind}${c}: ${e.reason.slice(0,80)}`)}}let C=V(process.cwd()),g=await D({configDir:x()}),re=await Y({configDir:x()}),w=` \u2014 ${G(re)}`,b=J(process.cwd()),H=[b.user&&`user hooks (${b.user})`,b.workspace&&`workspace hooks (${b.workspace})`].filter(Boolean),ie={claude_code:`session hooks (+ proxy for instruction linking)${w}`,codex:`worker transcript sync of ~/.codex/sessions \u2014 ${j(g)}`,cursor:`user hooks (~/.cursor/hooks.json)${w}`,copilot_agent:`workspace hooks${w}`,antigravity:H.length>0?`${H.join(" + ")}${w}`:"NOT CAPTURED \u2014 no rulemetric block in ~/.gemini/config/hooks.json or .agents/hooks.json; run `rulemetric hooks install` (user hooks are on by default)"};this.log(""),this.log(" Capture coverage (agents found on this machine):");for(let e of C)this.log(` \u2022 ${e.padEnd(15)} ${ie[e]??"captured"}`);if(C.includes("codex"))if(g.error)this.log(` ! ${g.error}`);else if(g.mode==="allowlist")for(let e of g.roots)this.log(` \u21B3 ${e}`);else g.mode==="all"&&this.log(` \u21B3 scope it with ${se(x(),X)} ({"codex":{"roots":["/path/to/repo"]}}) or RULEMETRIC_CODEX_CAPTURE=off`);o&&!o.worker.active&&C.includes("codex")&&g.mode!=="off"&&this.log(" ! Codex capture runs INSIDE the worker \u2014 it is stopped while the worker is down."),v()&&l&&await this.reportEvolutionSpend();let P=W({nodeVersion:r,directApiOk:l,httpsProxySet:s,gatewayAlive:m,mitmproxyAlive:d,proxyPathOk:p});this.log("");let ae=P.severity==="ok"?"[OK]":P.severity==="warn"?"[!!]":"[XX]";this.log(`${ae} ${P.headline}`);for(let e of P.hints)this.log(` \u2022 ${e}`);if(o&&o.verdict.severity!=="ok"){let e=o.verdict.severity==="warn"?"[!!]":"[XX]";this.log(""),this.log(`${e} ${o.verdict.headline}`);for(let c of o.verdict.hints)this.log(` \u2022 ${c}`)}}async reportEvolutionSpend(){let r;try{r=await y("/api/eval-targets?type=instruction&limit=200")}catch{return}let i=r.filter(s=>{let l=s.metadata??{};return l.autoEvolveEnabled===!0||l.autoEvolveEnabled==="true"});if(i.length!==0){this.log(""),this.log(" Nightly instruction evolution (cron_instruction_evolution, 07:30 UTC):");for(let s of i){let l=s.metadata??{},m=Q(l),d=z(l);if(m){this.log(` \u2022 ${s.name} \u2014 PAUSED (metadata.autoEvolvePaused). Opt-in preserved.`),this.log(" \u21B3 resume: set autoEvolvePaused=false");continue}let p=null;try{p=(await y(`/api/eval-targets/${s.id}/evals`)).filter(a=>!a.retiredAt).length}catch{}if(this.log(` \u2022 ${s.name}`),p!=null){let t=ne(p,d.minPairs,oe(d,p));if(!t.feasible)this.log(` \u21B3 cannot reach a verdict \u2014 ${t.reason}`);else{let a=Z({liveCases:p,passes:t.passes});this.log(` \u21B3 each night: ${te(a)}`)}}this.log(` \u21B3 pairs budget ${d.minPairs}`+(d.configured?" (metadata.autoEvolvePairs)":" (default)")+` \xB7 writes ${l.autoEvolveApply===!0||l.autoEvolveApply==="true"?"ENABLED":"off (dry run)"}`),d.note&&this.log(` ! ${d.note}`);try{let t=await y(`/api/eval-targets/${s.id}/promotions?limit=1`),a=t.promotions[0];if(a){let n=a.gates?.cost,f=n?.modelCalls?`${n.modelCalls} model calls, ${n.usablePairs??"?"} usable pair(s)`+(n.mde!=null?`, resolved +/-${ee(n.mde)}`:"")+(n.wallMs?`, ${(n.wallMs/6e4).toFixed(0)} min`:""):"cost not recorded (decision predates cost tracking)";this.log(` \u21B3 last run ${new Date(a.createdAt).toISOString().slice(0,10)}: ${a.decision}${a.applied?" (APPLIED)":""} \u2014 ${f}`)}let o=t.counts??{};this.log(` \u21B3 lifetime: ${o.promote??0} promote / ${o.revert??0} revert / ${o.refuse??0} refuse`)}catch{}}this.log(" \u21B3 pause the spend: metadata.autoEvolvePaused=true (keeps the opt-in)")}}};function A(h){if(h===null)return"never";if(h<90)return`${Math.round(h)}s`;let r=Math.round(h/60);return r<90?`${r}m`:`${Math.round(r/60)}h`}S(A,"formatAge");export{I as default};