@rulemetric/local 0.9.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/server.mjs CHANGED
@@ -1,4 +1,4 @@
1
- var o_=Object.defineProperty;var d=(e,t)=>o_(e,"name",{value:t,configurable:!0}),kp=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var J=(e,t)=>()=>(e&&(t=e(e=0)),t);var to=(e,t)=>{for(var n in t)o_(e,n,{get:t[n],enumerable:!0})};import{pgTable as Ed,text as Hs,timestamp as Aa,jsonb as c_,uuid as Yo,primaryKey as d_}from"drizzle-orm/pg-core";var G,K,Q,ye,Xo=J(()=>{"use strict";G=Ed("organizations",{id:Yo("id").primaryKey().defaultRandom(),name:Hs("name").unique().notNull(),slug:Hs("slug").unique().notNull(),metadata:c_("metadata"),createdAt:Aa("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Aa("updated_at",{withTimezone:!0}).defaultNow()}),K=Ed("teams",{id:Yo("id").primaryKey().defaultRandom(),orgId:Yo("org_id").references(()=>G.id,{onDelete:"cascade"}),name:Hs("name").notNull(),slug:Hs("slug").notNull(),metadata:c_("metadata"),createdAt:Aa("created_at",{withTimezone:!0}).defaultNow()}),Q=Ed("user_organizations",{userId:Yo("user_id").notNull(),orgId:Yo("org_id").references(()=>G.id,{onDelete:"cascade"}).notNull(),role:Hs("role").notNull().default("member"),createdAt:Aa("created_at",{withTimezone:!0}).defaultNow()},e=>[d_({columns:[e.userId,e.orgId]})]),ye=Ed("user_teams",{userId:Yo("user_id").notNull(),teamId:Yo("team_id").references(()=>K.id,{onDelete:"cascade"}).notNull(),role:Hs("role").notNull().default("member"),createdAt:Aa("created_at",{withTimezone:!0}).defaultNow()},e=>[d_({columns:[e.userId,e.teamId]})])});import{boolean as xd,pgTable as qE,real as UE,text as Td,timestamp as Lp,uuid as u_}from"drizzle-orm/pg-core";var T,Ft=J(()=>{"use strict";Xo();T=qE("profiles",{id:u_("id").primaryKey(),email:Td("email"),displayName:Td("display_name"),activeOrgId:u_("active_org_id").references(()=>G.id,{onDelete:"set null"}),isSuperadmin:xd("is_superadmin").notNull().default(!1),claudeCodePlan:Td("claude_code_plan"),planSource:Td("plan_source").notNull().default("detected"),setupCompletedAt:Lp("setup_completed_at",{withTimezone:!0}),liveSendSkipped:xd("live_send_skipped").notNull().default(!1),autoAcceptSuggestions:xd("auto_accept_suggestions").notNull().default(!0),evolutionPaused:xd("evolution_paused").notNull().default(!1),suggestionConfidenceThreshold:UE("suggestion_confidence_threshold").notNull().default(.7),createdAt:Lp("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Lp("updated_at",{withTimezone:!0}).defaultNow()})});import{pgTable as HE,text as $p,timestamp as Rd,uuid as kd,index as l_}from"drizzle-orm/pg-core";var ae,p_=J(()=>{"use strict";Xo();Ft();ae=HE("org_invitations",{id:kd("id").primaryKey().defaultRandom(),orgId:kd("org_id").notNull().references(()=>G.id,{onDelete:"cascade"}),email:$p("email").notNull(),role:$p("role").notNull().default("member"),teamId:kd("team_id").references(()=>K.id,{onDelete:"set null"}),invitedBy:kd("invited_by").notNull().references(()=>T.id,{onDelete:"cascade"}),token:$p("token").notNull().unique(),expiresAt:Rd("expires_at",{withTimezone:!0}).notNull(),acceptedAt:Rd("accepted_at",{withTimezone:!0}),revokedAt:Rd("revoked_at",{withTimezone:!0}),createdAt:Rd("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[l_("idx_org_invitations_token").on(e.token),l_("idx_org_invitations_org").on(e.orgId)])});import{pgTable as qp,text as Jt,timestamp as no,jsonb as jd,uuid as or,integer as Nd,boolean as BE,uniqueIndex as Pd,index as Ea}from"drizzle-orm/pg-core";var g,sr,Ie,Fn=J(()=>{"use strict";g=qp("instructions",{id:or("id").primaryKey().defaultRandom(),name:Jt("name").notNull(),description:Jt("description").notNull(),type:Jt("type").notNull().default("instruction"),scope:Jt("scope").notNull(),scopeRef:or("scope_ref"),version:Jt("version").notNull(),content:Jt("content").notNull(),frontmatter:jd("frontmatter").notNull(),slots:jd("slots"),tags:Jt("tags").array(),compatibility:Jt("compatibility").array(),createdBy:or("created_by"),createdAt:no("created_at",{withTimezone:!0}).defaultNow(),updatedAt:no("updated_at",{withTimezone:!0}).defaultNow(),archived:BE("archived").default(!1),archivedAt:no("archived_at",{withTimezone:!0}),archivedBy:or("archived_by"),forkedFromId:or("forked_from_id").references(()=>g.id,{onDelete:"set null"}),upstreamVersion:Jt("upstream_version"),badge:Jt("badge"),contentHash:Jt("content_hash"),contextIdentity:Jt("context_identity"),scanScore:Nd("scan_score"),scanFindings:jd("scan_findings"),popularityScore:Nd("popularity_score"),sourceUpdatedAt:no("source_updated_at",{withTimezone:!0})},e=>[Pd("instructions_name_scope_ref_idx").on(e.name,e.scope,e.scopeRef),Ea("idx_instructions_scope").on(e.scope,e.scopeRef),Ea("idx_instructions_created_by").on(e.createdBy),Ea("idx_instructions_context_identity").on(e.createdBy,e.contextIdentity),Ea("idx_instructions_public_recency").on(e.scope,e.sourceUpdatedAt.desc())]),sr=qp("instruction_version_identities",{id:or("id").primaryKey().defaultRandom(),instructionId:or("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),contentHash:Jt("content_hash").notNull(),versionOrdinal:Nd("version_ordinal").notNull(),content:Jt("content"),firstSeenAt:no("first_seen_at",{withTimezone:!0}).notNull().defaultNow(),lastSeenAt:no("last_seen_at",{withTimezone:!0}).notNull().defaultNow(),createdAt:no("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Pd("instruction_version_identities_hash_unique").on(e.instructionId,e.contentHash),Pd("instruction_version_identities_ordinal_unique").on(e.instructionId,e.versionOrdinal),Ea("idx_ivi_instruction").on(e.instructionId)]),Ie=qp("instruction_versions",{id:or("id").primaryKey().defaultRandom(),instructionId:or("instruction_id").references(()=>g.id,{onDelete:"cascade"}),versionNumber:Nd("version_number").notNull(),content:Jt("content").notNull(),frontmatter:jd("frontmatter").notNull(),changeSummary:Jt("change_summary"),createdBy:or("created_by"),createdAt:no("created_at",{withTimezone:!0}).defaultNow()},e=>[Pd("instruction_versions_instruction_version_idx").on(e.instructionId,e.versionNumber)])});import{pgTable as FE,text as WE,timestamp as zE,jsonb as VE,uuid as Up,index as m_}from"drizzle-orm/pg-core";var Ct,f_=J(()=>{"use strict";Fn();Ct=FE("instruction_events",{id:Up("id").primaryKey().defaultRandom(),instructionId:Up("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),eventType:WE("event_type").notNull(),actorId:Up("actor_id").notNull(),metadata:VE("metadata"),createdAt:zE("created_at",{withTimezone:!0}).defaultNow()},e=>[m_("idx_instruction_events_instruction").on(e.instructionId),m_("idx_instruction_events_type").on(e.eventType)])});import{boolean as JE,jsonb as GE,pgTable as Bp,primaryKey as g_,text as Qo,timestamp as xa,uniqueIndex as Hp,uuid as Zo}from"drizzle-orm/pg-core";import{sql as KE}from"drizzle-orm";var U,at,le,Pr=J(()=>{"use strict";Xo();Fn();U=Bp("projects",{id:Zo("id").primaryKey().defaultRandom(),orgId:Zo("org_id").references(()=>G.id,{onDelete:"cascade"}),name:Qo("name").notNull(),description:Qo("description"),githubRepo:Qo("github_repo"),gitRemoteUrl:Qo("git_remote_url"),gitRootCommit:Qo("git_root_commit"),gitRemoteAliases:Qo("git_remote_aliases").array().notNull().default([]),metadata:GE("metadata"),createdBy:Zo("created_by"),createdAt:xa("created_at",{withTimezone:!0}).defaultNow(),updatedAt:xa("updated_at",{withTimezone:!0}).defaultNow()},e=>[Hp("projects_org_name_idx").on(e.orgId,e.name),Hp("projects_git_remote_url_unique").on(e.gitRemoteUrl).where(KE`${e.gitRemoteUrl} IS NOT NULL`)]),at=Bp("project_instructions",{projectId:Zo("project_id").references(()=>U.id,{onDelete:"cascade"}).notNull(),instructionId:Zo("instruction_id").references(()=>g.id,{onDelete:"cascade"}).notNull(),addedAt:xa("added_at",{withTimezone:!0}).defaultNow(),addedBy:Zo("added_by")},e=>[g_({columns:[e.projectId,e.instructionId]})]),le=Bp("project_checkouts",{projectId:Zo("project_id").references(()=>U.id,{onDelete:"cascade"}).notNull(),path:Qo("path").notNull(),isWorktree:JE("is_worktree").notNull().default(!1),firstSeen:xa("first_seen",{withTimezone:!0}).notNull().defaultNow(),lastSeen:xa("last_seen",{withTimezone:!0}).notNull().defaultNow()},e=>[g_({columns:[e.projectId,e.path]}),Hp("project_checkouts_path_unique").on(e.path)])});import{pgTable as YE,text as Bs,timestamp as Fp,jsonb as h_,uuid as Cd,integer as XE,boolean as QE,index as Wp}from"drizzle-orm/pg-core";var X,Od=J(()=>{"use strict";Ft();Xo();Pr();X=YE("agent_runs",{id:Cd("id").primaryKey().defaultRandom(),userId:Cd("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),orgId:Cd("org_id").references(()=>G.id,{onDelete:"set null"}),projectId:Cd("project_id").references(()=>U.id,{onDelete:"set null"}),projectPath:Bs("project_path"),gitRemote:Bs("git_remote"),baseBranch:Bs("base_branch"),title:Bs("title"),prompt:Bs("prompt"),toolSpec:h_("tool_spec").notNull().default([]),autoWorktree:QE("auto_worktree").notNull().default(!0),status:Bs("status").notNull().default("pending"),sessionCount:XE("session_count").notNull().default(0),metadata:h_("metadata").notNull().default({}),createdAt:Fp("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:Fp("updated_at",{withTimezone:!0}).notNull().defaultNow(),completedAt:Fp("completed_at",{withTimezone:!0})},e=>[Wp("idx_agent_runs_user").on(e.userId),Wp("idx_agent_runs_org_created").on(e.orgId,e.createdAt),Wp("idx_agent_runs_project").on(e.projectId)])});import{pgTable as zp,text as hn,timestamp as Ta,jsonb as es,uuid as Cr,integer as Dd,uniqueIndex as __,index as ir}from"drizzle-orm/pg-core";var _,qe,se,Fs=J(()=>{"use strict";Fn();Pr();Ft();Xo();Od();_=zp("sessions",{id:Cr("id").primaryKey().defaultRandom(),userId:Cr("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),externalSessionId:hn("external_session_id"),projectId:Cr("project_id").references(()=>U.id,{onDelete:"set null"}),orgId:Cr("org_id").references(()=>G.id,{onDelete:"set null"}),tool:hn("tool").notNull(),projectPath:hn("project_path"),gitBranch:hn("git_branch"),startedAt:Ta("started_at",{withTimezone:!0}).notNull(),endedAt:Ta("ended_at",{withTimezone:!0}),eventCount:Dd("event_count").default(0),tokenUsage:es("token_usage"),analysis:es("analysis"),analyzedAt:Ta("analyzed_at",{withTimezone:!0}),analyzedEventCount:Dd("analyzed_event_count"),analyzedTurnCount:Dd("analyzed_turn_count"),metadata:es("metadata").default({}),origin:hn("origin").notNull().default("unknown"),runId:Cr("run_id").references(()=>X.id,{onDelete:"set null"}),model:hn("model"),harnessVersion:hn("harness_version"),createdAt:Ta("created_at",{withTimezone:!0}).defaultNow()},e=>[ir("idx_sessions_user").on(e.userId),ir("idx_sessions_tool").on(e.tool),ir("idx_sessions_started_at").on(e.startedAt),ir("idx_sessions_project").on(e.projectId),ir("idx_sessions_org_started_at").on(e.orgId,e.startedAt),ir("idx_sessions_run").on(e.runId),__("idx_sessions_user_external").on(e.userId,e.externalSessionId)]),qe=zp("session_events",{id:Cr("id").primaryKey().defaultRandom(),sessionId:Cr("session_id").notNull().references(()=>_.id,{onDelete:"cascade"}),sequence:Dd("sequence").notNull(),eventType:hn("event_type").notNull(),content:hn("content"),toolName:hn("tool_name"),toolInput:es("tool_input"),toolOutput:es("tool_output"),tokenUsage:es("token_usage"),model:hn("model"),timestamp:Ta("timestamp",{withTimezone:!0}).notNull(),metadata:es("metadata").default({})},e=>[__("session_events_session_sequence_idx").on(e.sessionId,e.sequence),ir("idx_session_events_session_id").on(e.sessionId),ir("idx_session_events_event_type").on(e.eventType),ir("idx_session_events_model").on(e.model)]),se=zp("session_instructions",{sessionId:Cr("session_id").notNull().references(()=>_.id,{onDelete:"cascade"}),instructionId:Cr("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),linkMethod:hn("link_method").notNull(),contentHash:hn("content_hash")},e=>[ir("idx_session_instructions_instruction_id").on(e.instructionId)])});import{pgTable as y_,text as Md,timestamp as w_,uuid as ar,integer as v_,index as Ws,unique as ZE}from"drizzle-orm/pg-core";var jt,Z,I_=J(()=>{"use strict";Ft();Pr();Fs();jt=y_("treatment_assignments",{id:ar("id").primaryKey().defaultRandom(),userId:ar("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),treatmentType:Md("treatment_type").notNull(),treatmentId:ar("treatment_id").notNull(),treatmentVersion:v_("treatment_version").notNull().default(1),projectId:ar("project_id").references(()=>U.id,{onDelete:"set null"}),assignedBy:ar("assigned_by").references(()=>T.id,{onDelete:"set null"}),method:Md("method").notNull(),assignedAt:w_("assigned_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Ws("idx_treatment_assignments_user").on(e.userId),Ws("idx_treatment_assignments_treatment").on(e.treatmentType,e.treatmentId),Ws("idx_treatment_assignments_project").on(e.projectId)]),Z=y_("treatment_exposures",{id:ar("id").primaryKey().defaultRandom(),sessionId:ar("session_id").notNull().references(()=>_.id,{onDelete:"cascade"}),userId:ar("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),treatmentType:Md("treatment_type").notNull(),treatmentId:ar("treatment_id").notNull(),treatmentVersion:v_("treatment_version").notNull().default(1),assignmentId:ar("assignment_id").references(()=>jt.id,{onDelete:"set null"}),method:Md("method").notNull(),exposedAt:w_("exposed_at",{withTimezone:!0}).notNull().defaultNow()},e=>[ZE("treatment_exposures_unique").on(e.sessionId,e.treatmentType,e.treatmentId,e.treatmentVersion),Ws("idx_treatment_exposures_treatment").on(e.treatmentType,e.treatmentId),Ws("idx_treatment_exposures_user").on(e.userId),Ws("idx_treatment_exposures_session").on(e.sessionId)])});import{pgTable as ex,text as Vp,timestamp as tx,uuid as Ld,integer as nx,index as b_,uniqueIndex as rx}from"drizzle-orm/pg-core";var $d,S_=J(()=>{"use strict";Ft();Pr();$d=ex("pending_treatment_exposures",{id:Ld("id").primaryKey().defaultRandom(),userId:Ld("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),externalSessionId:Vp("external_session_id").notNull(),treatmentType:Vp("treatment_type").notNull(),treatmentId:Ld("treatment_id").notNull(),treatmentVersion:nx("treatment_version").notNull().default(1),method:Vp("method").notNull().default("injected"),projectId:Ld("project_id").references(()=>U.id,{onDelete:"set null"}),createdAt:tx("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[rx("pending_treatment_exposures_unique").on(e.externalSessionId,e.treatmentType,e.treatmentId,e.treatmentVersion),b_("idx_pending_treatment_exposures_ext").on(e.externalSessionId),b_("idx_pending_treatment_exposures_user").on(e.userId)])});import{pgTable as A_,text as ro,timestamp as E_,uuid as zs,numeric as ox,index as Jp,unique as sx}from"drizzle-orm/pg-core";var q,Or,Gp=J(()=>{"use strict";Ft();Fn();q=A_("instruction_experiments",{id:zs("id").primaryKey().defaultRandom(),userId:zs("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),instructionId:zs("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),projectPath:ro("project_path").notNull(),status:ro("status").notNull().default("running"),treatedShare:ox("treated_share").notNull().default("0.5"),salt:ro("salt").notNull(),contentHash:ro("content_hash"),source:ro("source").notNull().default("manual"),stoppedReason:ro("stopped_reason"),createdAt:E_("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Jp("idx_instruction_experiments_lookup").on(e.userId,e.projectPath)]),Or=A_("instruction_experiment_arms",{id:zs("id").primaryKey().defaultRandom(),experimentId:zs("experiment_id").notNull().references(()=>q.id,{onDelete:"cascade"}),userId:zs("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),externalSessionId:ro("external_session_id").notNull(),arm:ro("arm").notNull(),assignedAt:E_("assigned_at",{withTimezone:!0}).notNull().defaultNow()},e=>[sx("instruction_experiment_arms_unique").on(e.experimentId,e.externalSessionId),Jp("idx_instruction_experiment_arms_experiment").on(e.experimentId,e.arm),Jp("idx_instruction_experiment_arms_session").on(e.externalSessionId)])});import{pgTable as ix,text as Kp,timestamp as ax,uuid as qd,numeric as Yp,integer as x_,jsonb as cx,index as dx,unique as ux}from"drizzle-orm/pg-core";var Y,T_=J(()=>{"use strict";Ft();Fn();Gp();Y=ix("instruction_verdicts",{id:qd("id").primaryKey().defaultRandom(),userId:qd("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),instructionId:qd("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),contentHash:Kp("content_hash").notNull(),projectPath:Kp("project_path").notNull(),segment:cx("segment").notNull().default({}),decision:Kp("decision").notNull(),delta:Yp("delta").notNull(),ciLower:Yp("ci_lower").notNull(),ciUpper:Yp("ci_upper").notNull(),nTreated:x_("n_treated").notNull(),nControl:x_("n_control").notNull(),experimentId:qd("experiment_id").references(()=>q.id,{onDelete:"set null"}),decidedAt:ax("decided_at",{withTimezone:!0}).notNull().defaultNow()},e=>[ux("instruction_verdicts_unique").on(e.instructionId,e.contentHash,e.projectPath),dx("idx_instruction_verdicts_render").on(e.userId,e.projectPath)])});import{pgTable as lx,text as Ud,timestamp as Xp,uuid as Qp,integer as px,unique as mx,index as fx}from"drizzle-orm/pg-core";var Ee,R_=J(()=>{"use strict";Ft();Ee=lx("insight_recommendation_log",{id:Qp("id").primaryKey().defaultRandom(),userId:Qp("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),projectPath:Ud("project_path").notNull().default(""),category:Ud("category").notNull(),contentHash:Ud("content_hash").notNull(),label:Ud("label").notNull().default(""),firstSeenAt:Xp("first_seen_at",{withTimezone:!0}).notNull().defaultNow(),lastSeenAt:Xp("last_seen_at",{withTimezone:!0}).notNull().defaultNow(),timesGenerated:px("times_generated").notNull().default(1),lastJobId:Qp("last_job_id"),dismissedAt:Xp("dismissed_at",{withTimezone:!0})},e=>[mx("insight_recommendation_log_unique").on(e.userId,e.projectPath,e.contentHash),fx("idx_insight_recommendation_log_read").on(e.userId,e.projectPath)])});import{pgTable as gx,text as Vs,timestamp as Zp,uuid as Ra,integer as k_,index as Hd}from"drizzle-orm/pg-core";var F,em=J(()=>{"use strict";Ft();Pr();F=gx("memories",{id:Ra("id").primaryKey().defaultRandom(),userId:Ra("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),orgId:Ra("org_id"),projectId:Ra("project_id").references(()=>U.id,{onDelete:"set null"}),version:k_("version").notNull().default(1),parentId:Ra("parent_id").references(()=>F.id,{onDelete:"set null"}),kind:Vs("kind").notNull(),title:Vs("title").notNull(),body:Vs("body").notNull(),source:Vs("source").notNull(),status:Vs("status").notNull().default("active"),trustClass:Vs("trust_class"),trustVersion:k_("trust_version"),trustComputedAt:Zp("trust_computed_at",{withTimezone:!0}),createdAt:Zp("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:Zp("updated_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Hd("idx_memories_user").on(e.userId),Hd("idx_memories_project").on(e.projectId),Hd("idx_memories_parent").on(e.parentId),Hd("idx_memories_user_status").on(e.userId,e.status)])});import{pgTable as hx,text as ka,timestamp as tm,uuid as nm,integer as j_,jsonb as _x,index as N_}from"drizzle-orm/pg-core";var Nt,P_=J(()=>{"use strict";Ft();em();Nt=hx("memory_experiments",{id:nm("id").primaryKey().defaultRandom(),memoryId:nm("memory_id").notNull().references(()=>F.id,{onDelete:"cascade"}),userId:nm("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),memoryVersion:j_("memory_version").notNull().default(1),taskPrompt:ka("task_prompt").notNull(),expectations:ka("expectations").array().notNull().default([]),trials:j_("trials").notNull().default(10),model:ka("model"),status:ka("status").notNull().default("pending"),result:_x("result").$type(),error:ka("error"),createdAt:tm("created_at",{withTimezone:!0}).notNull().defaultNow(),startedAt:tm("started_at",{withTimezone:!0}),completedAt:tm("completed_at",{withTimezone:!0})},e=>[N_("idx_memory_experiments_memory").on(e.memoryId),N_("idx_memory_experiments_user").on(e.userId)])});import{pgTable as yx,text as Js,timestamp as rm,uuid as om,jsonb as wx,uniqueIndex as vx,index as C_}from"drizzle-orm/pg-core";var Ve,sm=J(()=>{"use strict";Ft();Fs();Ve=yx("session_terminal_targets",{id:om("id").primaryKey().defaultRandom(),userId:om("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),sessionId:om("session_id").references(()=>_.id,{onDelete:"set null"}),externalSessionId:Js("external_session_id"),kind:Js("kind").notNull(),target:Js("target").notNull(),status:Js("status").notNull().default("active"),attachCommand:Js("attach_command").notNull(),projectPath:Js("project_path"),metadata:wx("metadata").notNull().default({}),lastSeenAt:rm("last_seen_at",{withTimezone:!0}).defaultNow(),createdAt:rm("created_at",{withTimezone:!0}).defaultNow(),updatedAt:rm("updated_at",{withTimezone:!0}).defaultNow()},e=>[vx("idx_session_terminal_targets_user_target").on(e.userId,e.target),C_("idx_session_terminal_targets_session").on(e.sessionId),C_("idx_session_terminal_targets_user_status").on(e.userId,e.status)])});import{boolean as Ix,index as Bd,jsonb as O_,pgTable as bx,text as ts,timestamp as ja,uuid as Fd,integer as D_}from"drizzle-orm/pg-core";var Wd,M_=J(()=>{"use strict";Fs();sm();Wd=bx("session_send_jobs",{id:Fd("id").primaryKey().defaultRandom(),userId:Fd("user_id").notNull(),sessionId:Fd("session_id").notNull().references(()=>_.id,{onDelete:"cascade"}),terminalTargetId:Fd("terminal_target_id").references(()=>Ve.id,{onDelete:"set null"}),target:ts("target").notNull(),message:ts("message").notNull(),submit:Ix("submit").notNull().default(!0),delivery:ts("delivery").notNull().default("live"),status:ts("status").notNull().default("pending"),result:O_("result"),error:ts("error"),attempts:D_("attempts").notNull().default(0),taskKind:ts("task_kind"),payload:O_("payload"),claimedBy:ts("claimed_by"),claimedAt:ja("claimed_at",{withTimezone:!0}),leaseExpiresAt:ja("lease_expires_at",{withTimezone:!0}),leaseRecoveries:D_("lease_recoveries").notNull().default(0),createdAt:ja("created_at",{withTimezone:!0}).defaultNow(),updatedAt:ja("updated_at",{withTimezone:!0}).defaultNow(),completedAt:ja("completed_at",{withTimezone:!0})},e=>[Bd("idx_session_send_jobs_user").on(e.userId),Bd("idx_session_send_jobs_session").on(e.sessionId),Bd("idx_session_send_jobs_status").on(e.status),Bd("idx_session_send_jobs_pending").on(e.userId,e.status)])});import{pgTable as $_,text as ns,timestamp as zd,jsonb as q_,uuid as oo,integer as Sx,boolean as Ax,uniqueIndex as Ex,index as L_,primaryKey as xx}from"drizzle-orm/pg-core";var Le,Oe,U_=J(()=>{"use strict";Fn();Le=$_("packs",{id:oo("id").primaryKey().defaultRandom(),name:ns("name").notNull(),description:ns("description").notNull(),scope:ns("scope").notNull(),scopeRef:oo("scope_ref"),version:ns("version").notNull().default("1.0.0"),tags:ns("tags").array(),badge:ns("badge"),metadata:q_("metadata"),createdBy:oo("created_by"),createdAt:zd("created_at",{withTimezone:!0}).defaultNow(),updatedAt:zd("updated_at",{withTimezone:!0}).defaultNow(),archived:Ax("archived").default(!1),archivedAt:zd("archived_at",{withTimezone:!0}),archivedBy:oo("archived_by"),forkedFromId:oo("forked_from_id").references(()=>Le.id,{onDelete:"set null"}),upstreamVersion:ns("upstream_version")},e=>[Ex("packs_name_scope_ref_idx").on(e.name,e.scope,e.scopeRef),L_("idx_packs_scope").on(e.scope,e.scopeRef),L_("idx_packs_created_by").on(e.createdBy)]),Oe=$_("pack_instructions",{packId:oo("pack_id").references(()=>Le.id,{onDelete:"cascade"}).notNull(),instructionId:oo("instruction_id").references(()=>g.id,{onDelete:"cascade"}).notNull(),position:Sx("position").notNull().default(0),slotOverrides:q_("slot_overrides"),addedAt:zd("added_at",{withTimezone:!0}).defaultNow(),addedBy:oo("added_by")},e=>[xx({columns:[e.packId,e.instructionId]})])});import{pgTable as Tx,text as im,timestamp as Rx,jsonb as kx,uuid as am,index as Gs}from"drizzle-orm/pg-core";var so,H_=J(()=>{"use strict";Fn();so=Tx("instruction_usage_events",{id:am("id").primaryKey().defaultRandom(),instructionId:am("instruction_id").references(()=>g.id,{onDelete:"set null"}),userId:am("user_id").notNull(),surface:im("surface").notNull(),action:im("action").notNull(),metadata:kx("metadata"),traceId:im("trace_id"),createdAt:Rx("created_at",{withTimezone:!0}).defaultNow()},e=>[Gs("idx_usage_events_instruction").on(e.instructionId),Gs("idx_usage_events_user").on(e.userId),Gs("idx_usage_events_surface").on(e.surface),Gs("idx_usage_events_action").on(e.action),Gs("idx_usage_events_created_at").on(e.createdAt),Gs("idx_usage_events_user_created").on(e.userId,e.createdAt)])});import{pgTable as jx,text as Vd,timestamp as B_,jsonb as Nx,uuid as F_,index as cm}from"drizzle-orm/pg-core";var fe,W_=J(()=>{"use strict";fe=jx("worker_connections",{id:F_("id").primaryKey().defaultRandom(),userId:F_("user_id").notNull(),workerType:Vd("worker_type").notNull().default("mcp"),clientName:Vd("client_name").notNull(),clientVersion:Vd("client_version"),workerVersion:Vd("worker_version"),lastHeartbeat:B_("last_heartbeat",{withTimezone:!0}).notNull().defaultNow(),connectedAt:B_("connected_at",{withTimezone:!0}).notNull().defaultNow(),metadata:Nx("metadata")},e=>[cm("idx_worker_connections_user").on(e.userId),cm("idx_worker_connections_heartbeat").on(e.userId,e.lastHeartbeat),cm("idx_worker_connections_type").on(e.userId,e.workerType)])});import{pgTable as Px,text as Jd,timestamp as Cx,jsonb as Ox,uuid as z_,index as V_}from"drizzle-orm/pg-core";var Gd,J_=J(()=>{"use strict";Gd=Px("cli_setup_events",{id:z_("id").primaryKey().defaultRandom(),userId:z_("user_id").notNull(),deviceId:Jd("device_id").notNull(),event:Jd("event").notNull(),cliVersion:Jd("cli_version"),os:Jd("os"),props:Ox("props").notNull().default({}),createdAt:Cx("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[V_("idx_cli_setup_events_user").on(e.userId,e.createdAt),V_("idx_cli_setup_events_device").on(e.deviceId,e.createdAt)])});import{pgTable as Dx,text as rs,integer as Mx,boolean as Lx,timestamp as $x,jsonb as qx,uuid as Ux,index as G_}from"drizzle-orm/pg-core";var Kd,K_=J(()=>{"use strict";Kd=Dx("cli_error_events",{id:Ux("id").primaryKey().defaultRandom(),deviceId:rs("device_id"),event:rs("event").notNull(),command:rs("command"),statusCode:Mx("status_code"),message:rs("message"),cliVersion:rs("cli_version"),os:rs("os"),nodeVersion:rs("node_version"),proxied:Lx("proxied"),props:qx("props").notNull().default({}),createdAt:$x("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[G_("idx_cli_error_events_created").on(e.createdAt),G_("idx_cli_error_events_device").on(e.deviceId,e.createdAt)])});import{sql as Hx}from"drizzle-orm";import{pgTable as os,text as wt,timestamp as cn,jsonb as Tn,uuid as pt,integer as Dr,boolean as Na,index as Gt,unique as Y_}from"drizzle-orm/pg-core";var k,Se,be,Xe,Je,pe,Wn,Pa=J(()=>{"use strict";k=os("eval_targets",{id:pt("id").primaryKey().defaultRandom(),userId:pt("user_id").notNull(),name:wt("name").notNull(),type:wt("type").notNull(),content:wt("content").notNull(),description:wt("description").notNull().default(""),metadata:Tn("metadata").notNull().default({}),version:Dr("version").notNull().default(1),parentId:pt("parent_id").references(()=>k.id,{onDelete:"set null"}),createdAt:cn("created_at",{withTimezone:!0}).defaultNow(),updatedAt:cn("updated_at",{withTimezone:!0}).defaultNow()},e=>[Gt("eval_targets_name_user_idx").on(e.name,e.userId),Gt("idx_eval_targets_user").on(e.userId),Gt("idx_eval_targets_type").on(e.type),Gt("idx_eval_targets_parent").on(e.parentId)]),Se=os("evals",{id:pt("id").primaryKey().defaultRandom(),evalTargetId:pt("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),name:wt("name").notNull(),prompt:wt("prompt").notNull(),expectedOutput:wt("expected_output").notNull().default(""),files:Tn("files").notNull().default([]),expectations:Tn("expectations").notNull().default([]),retiredAt:cn("retired_at",{withTimezone:!0}),retiredReason:wt("retired_reason"),createdAt:cn("created_at",{withTimezone:!0}).defaultNow(),updatedAt:cn("updated_at",{withTimezone:!0}).defaultNow(),contentUpdatedAt:cn("content_updated_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Gt("idx_evals_target").on(e.evalTargetId),Gt("idx_evals_target_active").on(e.evalTargetId).where(Hx`${e.retiredAt} IS NULL`)]),be=os("eval_runs",{id:pt("id").primaryKey().defaultRandom(),jobId:pt("job_id"),evalId:pt("eval_id").notNull().references(()=>Se.id,{onDelete:"cascade"}),evalTargetId:pt("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),evalTargetVersion:Dr("eval_target_version").notNull(),configuration:wt("configuration").notNull(),runNumber:Dr("run_number").notNull().default(1),iteration:Dr("iteration").notNull().default(1),status:wt("status").notNull().default("completed"),outputs:Tn("outputs").notNull().default({}),timing:Tn("timing").notNull().default({}),grading:Tn("grading").notNull().default({}),comparison:Tn("comparison"),createdAt:cn("created_at",{withTimezone:!0}).defaultNow()},e=>[Gt("idx_eval_runs_eval").on(e.evalId),Gt("idx_eval_runs_target").on(e.evalTargetId),Gt("idx_eval_runs_iteration").on(e.evalTargetId,e.iteration)]),Xe=os("eval_comparisons",{id:pt("id").primaryKey().defaultRandom(),userId:pt("user_id").notNull(),targetAId:pt("target_a_id").notNull().references(()=>k.id,{onDelete:"cascade"}),targetBId:pt("target_b_id").notNull().references(()=>k.id,{onDelete:"cascade"}),targetAVersion:Dr("target_a_version").notNull(),targetBVersion:Dr("target_b_version").notNull(),isSwapped:Na("is_swapped").notNull().default(!1),winnerTargetId:pt("winner_target_id").references(()=>k.id,{onDelete:"set null"}),perEval:Tn("per_eval").notNull().default([]),overall:Tn("overall").notNull().default({}),rawOutput:wt("raw_output"),model:wt("model"),status:wt("status").notNull().default("completed"),createdAt:cn("created_at",{withTimezone:!0}).defaultNow()},e=>[Gt("idx_eval_comparisons_target_a").on(e.targetAId),Gt("idx_eval_comparisons_target_b").on(e.targetBId),Gt("idx_eval_comparisons_user").on(e.userId)]),Je=os("eval_grade_annotations",{id:pt("id").primaryKey().defaultRandom(),userId:pt("user_id").notNull(),evalRunId:pt("eval_run_id").notNull().references(()=>be.id,{onDelete:"cascade"}),evalTargetId:pt("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),expectationIndex:Dr("expectation_index").notNull(),expectationText:wt("expectation_text").notNull(),judgePassed:Na("judge_passed").notNull(),judgeMethod:wt("judge_method").notNull(),judgeModel:wt("judge_model"),verdict:wt("verdict").notNull(),flag:wt("flag"),note:wt("note"),createdAt:cn("created_at",{withTimezone:!0}).defaultNow(),updatedAt:cn("updated_at",{withTimezone:!0}).defaultNow()},e=>[Gt("idx_eval_grade_annotations_target").on(e.evalTargetId),Gt("idx_eval_grade_annotations_run").on(e.evalRunId),Y_("eval_grade_annotations_eval_run_id_expectation_index_key").on(e.evalRunId,e.expectationIndex)]),pe=os("judge_reviewer_verdicts",{id:pt("id").primaryKey().defaultRandom(),userId:pt("user_id").notNull(),evalTargetId:pt("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),evalRunId:pt("eval_run_id").notNull().references(()=>be.id,{onDelete:"cascade"}),expectationIndex:Dr("expectation_index").notNull(),expectationText:wt("expectation_text").notNull(),judgePassed:Na("judge_passed").notNull(),humanPassed:Na("human_passed").notNull(),reviewerEngine:wt("reviewer_engine").notNull(),reviewerModel:wt("reviewer_model").notNull(),reviewerPassed:Na("reviewer_passed").notNull(),resolvedAt:cn("resolved_at",{withTimezone:!0}),resolution:wt("resolution"),createdAt:cn("created_at",{withTimezone:!0}).defaultNow(),updatedAt:cn("updated_at",{withTimezone:!0}).defaultNow()},e=>[Gt("idx_jrv_target").on(e.evalTargetId),Y_("judge_reviewer_verdicts_eval_run_id_expectation_index_review_key").on(e.evalRunId,e.expectationIndex,e.reviewerModel)]),Wn=os("benchmarks",{id:pt("id").primaryKey().defaultRandom(),evalTargetId:pt("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),iteration:Dr("iteration").notNull().default(1),runSummary:Tn("run_summary").notNull().default({}),notes:Tn("notes").notNull().default([]),feedback:Tn("feedback"),createdAt:cn("created_at",{withTimezone:!0}).defaultNow()},e=>[Gt("idx_benchmarks_target").on(e.evalTargetId)])});import{sql as dm}from"drizzle-orm";import{pgTable as Bx,text as Mr,timestamp as Fx,jsonb as Yd,uuid as Xd,boolean as Wx,index as Ca,uniqueIndex as zx}from"drizzle-orm/pg-core";var ie,X_=J(()=>{"use strict";Pa();Fn();ie=Bx("instruction_promotions",{id:Xd("id").primaryKey().defaultRandom(),userId:Xd("user_id").notNull(),evalTargetId:Xd("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),instructionId:Xd("instruction_id").references(()=>g.id,{onDelete:"set null"}),fromContentHash:Mr("from_content_hash").notNull(),toContentHash:Mr("to_content_hash").notNull(),fromContent:Mr("from_content").notNull(),toContent:Mr("to_content").notNull(),proposalSource:Mr("proposal_source").notNull(),proposalRationale:Mr("proposal_rationale").notNull().default(""),decision:Mr("decision").notNull(),applied:Wx("applied").notNull().default(!1),refusals:Yd("refusals").notNull().default([]),rationale:Mr("rationale").notNull().default(""),effectClass:Mr("effect_class").notNull(),verdict:Yd("verdict").notNull().default({}),gates:Yd("gates").notNull().default({}),touchedSections:Yd("touched_sections").notNull().default([]),createdAt:Fx("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Ca("idx_instruction_promotions_budget").on(e.evalTargetId,e.createdAt.desc()).where(dm`${e.applied}`),Ca("idx_instruction_promotions_target").on(e.evalTargetId,e.createdAt.desc()),Ca("idx_instruction_promotions_user").on(e.userId,e.createdAt.desc()),Ca("idx_instruction_promotions_to_hash").on(e.toContentHash),zx("uq_instruction_promotions_applied").on(e.evalTargetId,e.fromContentHash,e.toContentHash).where(dm`${e.applied}`),Ca("idx_instruction_promotions_applied_hash").on(e.toContentHash,e.createdAt.desc()).where(dm`${e.applied}`)])});import{pgTable as Vx,text as io,timestamp as Jx,jsonb as Oa,uuid as um,integer as lm,real as Gx,index as Da,uniqueIndex as Q_}from"drizzle-orm/pg-core";var L,Z_=J(()=>{"use strict";Fs();Ft();L=Vx("context_snapshots",{id:um("id").primaryKey().defaultRandom(),sessionId:um("session_id").references(()=>_.id,{onDelete:"cascade"}),userId:um("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),sequence:lm("sequence").notNull().default(0),provider:io("provider").notNull(),model:io("model").notNull(),systemPrompt:io("system_prompt").notNull(),injectedInstructions:Oa("injected_instructions").notNull().default([]),messagesSummary:Oa("messages_summary").notNull(),tools:Oa("tools").notNull().default([]),systemHash:io("system_hash").notNull(),requestHash:io("request_hash").notNull().default(""),toolsHash:io("tools_hash"),injectedHash:io("injected_hash"),messagesDelta:Oa("messages_delta").default([]),messagesDeltaRef:io("messages_delta_ref"),maxTokens:lm("max_tokens"),temperature:Gx("temperature"),estimatedTokens:lm("estimated_tokens"),capturedAt:Jx("captured_at",{withTimezone:!0}).notNull().defaultNow(),metadata:Oa("metadata").default({})},e=>[Da("idx_context_snapshots_session").on(e.sessionId),Da("idx_context_snapshots_user").on(e.userId),Da("idx_context_snapshots_hash").on(e.systemHash),Da("idx_context_snapshots_request_hash").on(e.requestHash),Q_("idx_snapshots_session_request").on(e.sessionId,e.requestHash),Q_("idx_snapshots_session_sequence").on(e.sessionId,e.sequence),Da("idx_context_snapshots_user_session_captured").on(e.userId,e.sessionId,e.capturedAt.desc())])});import{pgTable as Kx,text as ey,timestamp as Yx,jsonb as Xx,integer as Qx,index as Zx}from"drizzle-orm/pg-core";var _n,ty=J(()=>{"use strict";_n=Kx("content_blobs",{hash:ey("hash").primaryKey(),contentType:ey("content_type").notNull(),content:Xx("content").notNull(),sizeBytes:Qx("size_bytes").notNull().default(0),createdAt:Yx("created_at",{withTimezone:!0}).defaultNow()},e=>[Zx("idx_content_blobs_type").on(e.contentType)])});import{pgTable as eT,text as Qd,timestamp as Ma,jsonb as Zd,uuid as pm,index as eu,integer as ny}from"drizzle-orm/pg-core";var ke,ry=J(()=>{"use strict";Pa();ke=eT("eval_jobs",{id:pm("id").primaryKey().defaultRandom(),userId:pm("user_id").notNull(),evalTargetId:pm("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),status:Qd("status").notNull().default("pending"),config:Zd("config").notNull().default({}),progress:Zd("progress").notNull().default({}),result:Zd("result"),error:Qd("error"),attempts:ny("attempts").notNull().default(0),taskKind:Qd("task_kind"),payload:Zd("payload"),claimedBy:Qd("claimed_by"),claimedAt:Ma("claimed_at",{withTimezone:!0}),leaseExpiresAt:Ma("lease_expires_at",{withTimezone:!0}),leaseRecoveries:ny("lease_recoveries").notNull().default(0),createdAt:Ma("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Ma("updated_at",{withTimezone:!0}).defaultNow(),completedAt:Ma("completed_at",{withTimezone:!0})},e=>[eu("idx_eval_jobs_user").on(e.userId),eu("idx_eval_jobs_target").on(e.evalTargetId),eu("idx_eval_jobs_status").on(e.status),eu("idx_eval_jobs_pending").on(e.userId,e.status)])});import{pgTable as tT,text as La,timestamp as $a,jsonb as oy,uuid as sy,integer as iy,index as ay}from"drizzle-orm/pg-core";var je,cy=J(()=>{"use strict";je=tT("agent_jobs",{id:sy("id").primaryKey().defaultRandom(),userId:sy("user_id").notNull(),taskKind:La("task_kind").notNull(),status:La("status").notNull().default("pending"),payload:oy("payload").notNull(),dedupeKey:La("dedupe_key"),result:oy("result"),error:La("error"),attempts:iy("attempts").notNull().default(0),claimedBy:La("claimed_by"),claimedAt:$a("claimed_at",{withTimezone:!0}),leaseExpiresAt:$a("lease_expires_at",{withTimezone:!0}),leaseRecoveries:iy("lease_recoveries").notNull().default(0),createdAt:$a("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:$a("updated_at",{withTimezone:!0}).notNull().defaultNow(),completedAt:$a("completed_at",{withTimezone:!0})},e=>[ay("idx_agent_jobs_claim").on(e.userId,e.status,e.taskKind,e.createdAt),ay("idx_agent_jobs_dedupe").on(e.userId,e.taskKind,e.dedupeKey)])});import{pgTable as nT,text as qa,timestamp as Ua,jsonb as tu,uuid as mm,index as nu,integer as dy}from"drizzle-orm/pg-core";var W,uy=J(()=>{"use strict";Pr();W=nT("insights_jobs",{id:mm("id").primaryKey().defaultRandom(),userId:mm("user_id").notNull(),status:qa("status").notNull().default("pending"),projectPath:qa("project_path"),projectId:mm("project_id").references(()=>U.id,{onDelete:"set null"}),config:tu("config").notNull().default({}),progress:tu("progress").notNull().default({}),result:tu("result"),error:qa("error"),attempts:dy("attempts").notNull().default(0),taskKind:qa("task_kind"),payload:tu("payload"),claimedBy:qa("claimed_by"),claimedAt:Ua("claimed_at",{withTimezone:!0}),leaseExpiresAt:Ua("lease_expires_at",{withTimezone:!0}),leaseRecoveries:dy("lease_recoveries").notNull().default(0),createdAt:Ua("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Ua("updated_at",{withTimezone:!0}).defaultNow(),completedAt:Ua("completed_at",{withTimezone:!0})},e=>[nu("idx_insights_jobs_user").on(e.userId),nu("idx_insights_jobs_status").on(e.status),nu("idx_insights_jobs_pending").on(e.userId,e.status),nu("idx_insights_jobs_project").on(e.projectId)])});import{pgTable as rT,text as fm,timestamp as ru,uuid as ly,index as oT,uniqueIndex as sT}from"drizzle-orm/pg-core";var Ae,py=J(()=>{"use strict";Ft();Ae=rT("api_keys",{id:ly("id").primaryKey().defaultRandom(),userId:ly("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),name:fm("name").notNull(),keyHash:fm("key_hash").notNull(),keyPrefix:fm("key_prefix").notNull(),lastUsedAt:ru("last_used_at",{withTimezone:!0}),expiresAt:ru("expires_at",{withTimezone:!0}),revokedAt:ru("revoked_at",{withTimezone:!0}),createdAt:ru("created_at",{withTimezone:!0}).defaultNow()},e=>[oT("idx_api_keys_user").on(e.userId),sT("idx_api_keys_hash").on(e.keyHash)])});import{pgTable as iT,text as gm,timestamp as my,uuid as aT,index as cT}from"drizzle-orm/pg-core";var Rn,fy=J(()=>{"use strict";Ft();Rn=iT("extension_auth_codes",{code:gm("code").primaryKey(),userId:aT("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),editor:gm("editor"),email:gm("email"),expiresAt:my("expires_at",{withTimezone:!0}).notNull(),createdAt:my("created_at",{withTimezone:!0}).defaultNow()},e=>[cT("idx_ext_auth_codes_expiry").on(e.expiresAt)])});import{pgTable as dT,text as uT,timestamp as gy,jsonb as lT,uuid as hm,index as hy}from"drizzle-orm/pg-core";var $e,_y=J(()=>{"use strict";Pa();$e=dT("eval_conversations",{id:hm("id").primaryKey().defaultRandom(),evalTargetId:hm("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),userId:hm("user_id").notNull(),messages:lT("messages").notNull().default([]),status:uT("status").notNull().default("active"),createdAt:gy("created_at",{withTimezone:!0}).defaultNow(),updatedAt:gy("updated_at",{withTimezone:!0}).defaultNow()},e=>[hy("idx_eval_conversations_target").on(e.evalTargetId),hy("idx_eval_conversations_user").on(e.userId)])});import{pgTable as pT,text as Lr,timestamp as yy,jsonb as mT,uuid as _m}from"drizzle-orm/pg-core";var ao,wy=J(()=>{"use strict";ao=pT("skill_submissions",{id:_m("id").primaryKey().defaultRandom(),skillId:Lr("skill_id").notNull(),name:Lr("name").notNull(),description:Lr("description").notNull(),category:Lr("category").notNull(),tools:Lr("tools").array().notNull(),tags:Lr("tags").array().default([]),content:Lr("content").notNull(),status:Lr("status").notNull().default("pending"),submittedBy:_m("submitted_by").notNull(),reviewedBy:_m("reviewed_by"),reviewNote:Lr("review_note"),metadata:mT("metadata"),createdAt:yy("created_at",{withTimezone:!0}).defaultNow(),updatedAt:yy("updated_at",{withTimezone:!0}).defaultNow()})});import{pgTable as fT,text as Ha,timestamp as vy,jsonb as gT,uuid as hT,uniqueIndex as _T,index as Iy}from"drizzle-orm/pg-core";var Pt,by=J(()=>{"use strict";Pt=fT("harness_releases",{id:hT("id").primaryKey().defaultRandom(),harness:Ha("harness").notNull(),version:Ha("version").notNull(),publishedAt:vy("published_at",{withTimezone:!0}).notNull(),title:Ha("title"),body:Ha("body"),categories:gT("categories").default({}),url:Ha("url"),createdAt:vy("created_at",{withTimezone:!0}).defaultNow()},e=>[_T("idx_harness_releases_unique").on(e.harness,e.version),Iy("idx_harness_releases_harness").on(e.harness),Iy("idx_harness_releases_published").on(e.publishedAt)])});import{pgTable as yT,text as Ks,timestamp as Sy,jsonb as wT,uuid as Ay,index as Ey,uniqueIndex as vT}from"drizzle-orm/pg-core";var bt,xy=J(()=>{"use strict";bt=yT("notifications",{id:Ay("id").primaryKey().defaultRandom(),userId:Ay("user_id").notNull(),type:Ks("type").notNull(),title:Ks("title").notNull(),body:Ks("body"),url:Ks("url"),sourceTable:Ks("source_table"),sourceId:Ks("source_id"),metadata:wT("metadata").notNull().default({}),readAt:Sy("read_at",{withTimezone:!0}),createdAt:Sy("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Ey("idx_notifications_user_created").on(e.userId,e.createdAt),Ey("idx_notifications_user_unread").on(e.userId),vT("idx_notifications_source_dedup").on(e.userId,e.sourceTable,e.sourceId)])});import{pgTable as IT,text as Ba,timestamp as Fa,jsonb as ym,uuid as wm,index as ou,integer as Ty}from"drizzle-orm/pg-core";var ce,Ry=J(()=>{"use strict";Od();ce=IT("launch_jobs",{id:wm("id").primaryKey().defaultRandom(),userId:wm("user_id").notNull(),tool:Ba("tool").notNull(),status:Ba("status").notNull().default("pending"),config:ym("config").notNull().default({}),result:ym("result"),error:Ba("error"),attempts:Ty("attempts").notNull().default(0),taskKind:Ba("task_kind"),payload:ym("payload"),claimedBy:Ba("claimed_by"),claimedAt:Fa("claimed_at",{withTimezone:!0}),leaseExpiresAt:Fa("lease_expires_at",{withTimezone:!0}),leaseRecoveries:Ty("lease_recoveries").notNull().default(0),createdAt:Fa("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Fa("updated_at",{withTimezone:!0}).defaultNow(),completedAt:Fa("completed_at",{withTimezone:!0}),runId:wm("run_id").references(()=>X.id,{onDelete:"set null"})},e=>[ou("idx_launch_jobs_user").on(e.userId),ou("idx_launch_jobs_status").on(e.status),ou("idx_launch_jobs_pending").on(e.userId,e.status),ou("idx_launch_jobs_run").on(e.runId)])});import{pgTable as ky,uuid as $r,text as co,real as bT,timestamp as Wa,boolean as ST,uniqueIndex as AT,index as za}from"drizzle-orm/pg-core";var su,x,tt,jy=J(()=>{"use strict";Ft();Fn();Pr();su=["add","remove","trim"],x=ky("instruction_suggestions",{id:$r("id").primaryKey().defaultRandom(),userId:$r("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),instructionId:$r("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),projectPath:co("project_path").notNull(),projectId:$r("project_id").references(()=>U.id,{onDelete:"set null"}),score:bT("score").notNull(),reason:co("reason").notNull(),kind:co("kind").$type().notNull().default("add"),generatedAt:Wa("generated_at",{withTimezone:!0}).notNull().defaultNow(),isStale:ST("is_stale").notNull().default(!1),dismissedAt:Wa("dismissed_at",{withTimezone:!0}),acceptedAt:Wa("accepted_at",{withTimezone:!0}),declinedAt:Wa("declined_at",{withTimezone:!0}),declinedReason:co("declined_reason"),promotedToInstructionId:$r("promoted_to_instruction_id").references(()=>g.id,{onDelete:"set null"})},e=>[AT("idx_instruction_suggestions_user_project_instruction_kind").on(e.userId,e.projectPath,e.instructionId,e.kind),za("idx_instruction_suggestions_user_project").on(e.userId,e.projectPath),za("idx_instruction_suggestions_user_proj_id").on(e.userId,e.projectId),za("idx_instruction_suggestions_generated_at").on(e.generatedAt)]),tt=ky("instruction_suggestion_events",{id:$r("id").primaryKey().defaultRandom(),suggestionId:$r("suggestion_id").notNull().references(()=>x.id,{onDelete:"cascade"}),userId:$r("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),eventType:co("event_type").notNull(),tool:co("tool"),sessionId:$r("session_id"),projectPath:co("project_path").notNull(),actor:co("actor"),createdAt:Wa("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[za("idx_instruction_suggestion_events_suggestion_id").on(e.suggestionId),za("idx_instruction_suggestion_events_user_id").on(e.userId)])});import{pgTable as ET,text as vm,integer as xT,numeric as Va,timestamp as Im,index as TT,primaryKey as RT}from"drizzle-orm/pg-core";var Qe,Ny=J(()=>{"use strict";Qe=ET("model_pricing",{provider:vm("provider").notNull(),modelId:vm("model_id").notNull(),inputPerM:Va("input_per_m").notNull(),outputPerM:Va("output_per_m").notNull(),cacheReadPerM:Va("cache_read_per_m").notNull(),cacheWrite5mPerM:Va("cache_write_5m_per_m").notNull(),cacheWrite1hPerM:Va("cache_write_1h_per_m").notNull(),contextWindow:xT("context_window"),effectiveFrom:Im("effective_from",{withTimezone:!0}).notNull(),effectiveUntil:Im("effective_until",{withTimezone:!0}),source:vm("source").notNull(),verifiedAt:Im("verified_at",{withTimezone:!0})},e=>[RT({columns:[e.provider,e.modelId,e.effectiveFrom]}),TT("idx_model_pricing_active").on(e.provider,e.modelId,e.effectiveFrom.desc())])});import{pgTable as kT,text as ss,numeric as Py,timestamp as Cy,uuid as Oy,jsonb as jT,index as Dy}from"drizzle-orm/pg-core";var we,My=J(()=>{"use strict";we=kT("limit_observations",{id:Oy("id").primaryKey().defaultRandom(),observedAt:Cy("observed_at",{withTimezone:!0}).notNull().defaultNow(),provider:ss("provider").notNull(),plan:ss("plan").notNull(),limitType:ss("limit_type").notNull(),value:Py("value").notNull(),unit:ss("unit").notNull(),comparator:ss("comparator").notNull().default("="),resetsAt:Cy("resets_at",{withTimezone:!0}),sourceType:ss("source_type").notNull(),sourceUrl:ss("source_url"),sourceEvidence:jT("source_evidence"),confidence:Py("confidence").notNull(),userId:Oy("user_id")},e=>[Dy("idx_limit_obs_lookup").on(e.provider,e.plan,e.limitType,e.observedAt.desc()),Dy("idx_limit_obs_user").on(e.userId,e.observedAt.desc())])});import{pgTable as NT,text as iu,timestamp as PT,uuid as CT,jsonb as OT,boolean as DT,uniqueIndex as MT}from"drizzle-orm/pg-core";var xt,Ly=J(()=>{"use strict";xt=NT("provider_docs_snapshots",{id:CT("id").primaryKey().defaultRandom(),fetchedAt:PT("fetched_at",{withTimezone:!0}).notNull().defaultNow(),provider:iu("provider").notNull(),docUrl:iu("doc_url").notNull(),contentHash:iu("content_hash").notNull(),content:iu("content").notNull(),parseSuccess:DT("parse_success").notNull(),parseErrors:OT("parse_errors")},e=>[MT("idx_docs_dedup").on(e.provider,e.docUrl,e.contentHash)])});import{pgTable as LT,text as au,numeric as $y,timestamp as qy,uuid as $T,primaryKey as qT,index as UT}from"drizzle-orm/pg-core";var Ge,Uy=J(()=>{"use strict";Ge=LT("plan_limits_active",{provider:au("provider").notNull(),plan:au("plan").notNull(),limitType:au("limit_type").notNull(),value:$y("value").notNull(),unit:au("unit").notNull(),effectiveFrom:qy("effective_from",{withTimezone:!0}).notNull(),effectiveUntil:qy("effective_until",{withTimezone:!0}),confidence:$y("confidence").notNull(),sourceObservationIds:$T("source_observation_ids").array().notNull()},e=>[qT({columns:[e.provider,e.plan,e.limitType,e.effectiveFrom]}),UT("idx_plan_limits_lookup").on(e.provider,e.plan,e.limitType,e.effectiveFrom.desc())])});import{pgTable as HT,text as bm,timestamp as BT,uuid as Hy,jsonb as FT,index as WT}from"drizzle-orm/pg-core";var yn,By=J(()=>{"use strict";yn=HT("alert_dispatches",{id:Hy("id").primaryKey().defaultRandom(),userId:Hy("user_id").notNull(),alertKey:bm("alert_key").notNull(),severity:bm("severity").notNull(),lastDispatchedAt:BT("last_dispatched_at",{withTimezone:!0}).notNull().defaultNow(),lastState:FT("last_state").notNull(),channel:bm("channel").notNull()},e=>[WT("idx_alert_user_key").on(e.userId,e.alertKey,e.lastDispatchedAt.desc())])});import{boolean as zT,date as VT,index as Sm,integer as JT,jsonb as GT,pgTable as Am,text as zn,timestamp as uo,uniqueIndex as KT,uuid as Ys}from"drizzle-orm/pg-core";var De,St,At,Fy=J(()=>{"use strict";De=Am("announcements",{id:Ys("id").primaryKey().defaultRandom(),version:zn("version").notNull().unique(),releaseDate:VT("release_date").notNull(),subject:zn("subject").notNull(),htmlBody:zn("html_body").notNull(),textBody:zn("text_body").notNull(),sections:GT("sections").notNull().default({}),status:zn("status").notNull().default("draft"),recipientCount:JT("recipient_count"),sentAt:uo("sent_at",{withTimezone:!0}),sentBy:Ys("sent_by"),error:zn("error"),createdAt:uo("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:uo("updated_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Sm("idx_announcements_status").on(e.status),Sm("idx_announcements_created").on(e.createdAt)]),St=Am("announcement_deliveries",{id:Ys("id").primaryKey().defaultRandom(),announcementId:Ys("announcement_id").notNull(),userId:Ys("user_id").notNull(),email:zn("email").notNull(),status:zn("status").notNull().default("pending"),providerId:zn("provider_id"),error:zn("error"),sentAt:uo("sent_at",{withTimezone:!0}),createdAt:uo("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[KT("uniq_announcement_deliveries_announcement_user").on(e.announcementId,e.userId),Sm("idx_announcement_deliveries_user").on(e.userId,e.createdAt)]),At=Am("notification_preferences",{userId:Ys("user_id").primaryKey(),productAnnouncements:zT("product_announcements").notNull().default(!0),unsubscribeToken:zn("unsubscribe_token").notNull().unique(),unsubscribedAt:uo("unsubscribed_at",{withTimezone:!0}),createdAt:uo("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:uo("updated_at",{withTimezone:!0}).notNull().defaultNow()})});import{pgTable as YT,text as Em,timestamp as Wy,uuid as xm,integer as XT,index as QT,unique as ZT}from"drizzle-orm/pg-core";var zy,Vy=J(()=>{"use strict";zy=YT("scaffolding_fingerprints",{id:xm("id").primaryKey().defaultRandom(),userId:xm("user_id").notNull(),harness:Em("harness").notNull(),model:Em("model").notNull(),toolsHash:Em("tools_hash").notNull(),firstSeenAt:Wy("first_seen_at",{withTimezone:!0}).notNull().defaultNow(),lastSeenAt:Wy("last_seen_at",{withTimezone:!0}).notNull().defaultNow(),snapshotCount:XT("snapshot_count").notNull().default(1),firstSessionId:xm("first_session_id")},e=>[ZT("scaffolding_fingerprints_user_id_harness_model_tools_hash_key").on(e.userId,e.harness,e.model,e.toolsHash),QT("idx_scaffolding_fp_segment").on(e.userId,e.harness,e.model)])});import{pgTable as eR,text as Tm,timestamp as tR,jsonb as nR,uuid as Jy,integer as rR,unique as oR}from"drizzle-orm/pg-core";var Gy,Ky=J(()=>{"use strict";Gy=eR("scaffolding_segments",{id:Jy("id").primaryKey().defaultRandom(),userId:Jy("user_id").notNull(),harness:Tm("harness").notNull(),model:Tm("model").notNull(),coreNames:nR("core_names").notNull(),coreHash:Tm("core_hash").notNull(),activeFingerprints:rR("active_fingerprints").notNull(),computedAt:tR("computed_at",{withTimezone:!0}).notNull().defaultNow()},e=>[oR("scaffolding_segments_user_id_harness_model_key").on(e.userId,e.harness,e.model)])});var Rm=J(()=>{"use strict";Ft();Xo();p_();Fn();f_();Pr();Fs();I_();S_();Gp();T_();R_();em();P_();Od();sm();M_();U_();H_();W_();J_();K_();Pa();X_();Z_();ty();ry();cy();uy();py();fy();_y();wy();by();xy();Ry();jy();Ny();My();Ly();Uy();By();Fy();Vy();Ky()});import{relations as We}from"drizzle-orm";var sR,iR,aR,cR,dR,uR,lR,pR,mR,fR,gR,hR,_R,yR,wR,vR,IR,bR,SR,AR,ER,xR,TR,RR,kR,jR,NR,PR,CR,OR,Yy=J(()=>{"use strict";Rm();sR=We(T,({many:e})=>({sessions:e(_),contextSnapshots:e(L),apiKeys:e(Ae)})),iR=We(Ae,({one:e})=>({profile:e(T,{fields:[Ae.userId],references:[T.id]})})),aR=We(G,({many:e})=>({teams:e(K),userOrganizations:e(Q),projects:e(U),invitations:e(ae)})),cR=We(K,({one:e,many:t})=>({organization:e(G,{fields:[K.orgId],references:[G.id]}),userTeams:t(ye),invitations:t(ae)})),dR=We(ae,({one:e})=>({organization:e(G,{fields:[ae.orgId],references:[G.id]}),team:e(K,{fields:[ae.teamId],references:[K.id]}),inviter:e(T,{fields:[ae.invitedBy],references:[T.id]})})),uR=We(Q,({one:e})=>({organization:e(G,{fields:[Q.orgId],references:[G.id]})})),lR=We(ye,({one:e})=>({team:e(K,{fields:[ye.teamId],references:[K.id]})})),pR=We(g,({one:e,many:t})=>({versions:t(Ie),projectInstructions:t(at),events:t(Ct),usageEvents:t(so),sessionInstructions:t(se),packInstructions:t(Oe),forkedFrom:e(g,{fields:[g.forkedFromId],references:[g.id]})})),mR=We(Ct,({one:e})=>({instruction:e(g,{fields:[Ct.instructionId],references:[g.id]})})),fR=We(F,({one:e,many:t})=>({project:e(U,{fields:[F.projectId],references:[U.id]}),parent:e(F,{fields:[F.parentId],references:[F.id]}),versions:t(F)})),gR=We(Ie,({one:e})=>({instruction:e(g,{fields:[Ie.instructionId],references:[g.id]})})),hR=We(U,({one:e,many:t})=>({organization:e(G,{fields:[U.orgId],references:[G.id]}),projectInstructions:t(at),sessions:t(_)})),_R=We(at,({one:e})=>({project:e(U,{fields:[at.projectId],references:[U.id]}),instruction:e(g,{fields:[at.instructionId],references:[g.id]})})),yR=We(_,({one:e,many:t})=>({profile:e(T,{fields:[_.userId],references:[T.id]}),project:e(U,{fields:[_.projectId],references:[U.id]}),run:e(X,{fields:[_.runId],references:[X.id]}),events:t(qe),sessionInstructions:t(se),treatmentExposures:t(Z),contextSnapshots:t(L)})),wR=We(X,({one:e,many:t})=>({profile:e(T,{fields:[X.userId],references:[T.id]}),organization:e(G,{fields:[X.orgId],references:[G.id]}),project:e(U,{fields:[X.projectId],references:[U.id]}),sessions:t(_),launchJobs:t(ce)})),vR=We(ce,({one:e})=>({run:e(X,{fields:[ce.runId],references:[X.id]})})),IR=We(qe,({one:e})=>({session:e(_,{fields:[qe.sessionId],references:[_.id]})})),bR=We(se,({one:e})=>({session:e(_,{fields:[se.sessionId],references:[_.id]}),instruction:e(g,{fields:[se.instructionId],references:[g.id]})})),SR=We(jt,({one:e,many:t})=>({owner:e(T,{fields:[jt.userId],references:[T.id]}),project:e(U,{fields:[jt.projectId],references:[U.id]}),exposures:t(Z)})),AR=We(Z,({one:e})=>({session:e(_,{fields:[Z.sessionId],references:[_.id]}),owner:e(T,{fields:[Z.userId],references:[T.id]}),assignment:e(jt,{fields:[Z.assignmentId],references:[jt.id]})})),ER=We(Le,({one:e,many:t})=>({packInstructions:t(Oe),forkedFrom:e(Le,{fields:[Le.forkedFromId],references:[Le.id]})})),xR=We(Oe,({one:e})=>({pack:e(Le,{fields:[Oe.packId],references:[Le.id]}),instruction:e(g,{fields:[Oe.instructionId],references:[g.id]})})),TR=We(so,({one:e})=>({instruction:e(g,{fields:[so.instructionId],references:[g.id]})})),RR=We(k,({one:e,many:t})=>({parent:e(k,{fields:[k.parentId],references:[k.id]}),evals:t(Se),evalRuns:t(be),benchmarks:t(Wn),evalJobs:t(ke),evalConversations:t($e)})),kR=We(Se,({one:e,many:t})=>({evalTarget:e(k,{fields:[Se.evalTargetId],references:[k.id]}),runs:t(be)})),jR=We(be,({one:e})=>({eval:e(Se,{fields:[be.evalId],references:[Se.id]}),evalTarget:e(k,{fields:[be.evalTargetId],references:[k.id]})})),NR=We(Wn,({one:e})=>({evalTarget:e(k,{fields:[Wn.evalTargetId],references:[k.id]})})),PR=We(ke,({one:e})=>({evalTarget:e(k,{fields:[ke.evalTargetId],references:[k.id]})})),CR=We($e,({one:e})=>({evalTarget:e(k,{fields:[$e.evalTargetId],references:[k.id]})})),OR=We(L,({one:e})=>({session:e(_,{fields:[L.sessionId],references:[_.id]}),profile:e(T,{fields:[L.userId],references:[T.id]})}))});var cu={};to(cu,{SUGGESTION_KINDS:()=>su,agentJobs:()=>je,agentRuns:()=>X,agentRunsRelations:()=>wR,alertDispatches:()=>yn,announcementDeliveries:()=>St,announcements:()=>De,apiKeys:()=>Ae,apiKeysRelations:()=>iR,benchmarks:()=>Wn,benchmarksRelations:()=>NR,cliErrorEvents:()=>Kd,cliSetupEvents:()=>Gd,contentBlobs:()=>_n,contextSnapshots:()=>L,contextSnapshotsRelations:()=>OR,evalComparisons:()=>Xe,evalConversations:()=>$e,evalConversationsRelations:()=>CR,evalGradeAnnotations:()=>Je,evalJobs:()=>ke,evalJobsRelations:()=>PR,evalRuns:()=>be,evalRunsRelations:()=>jR,evalTargets:()=>k,evalTargetsRelations:()=>RR,evals:()=>Se,evalsRelations:()=>kR,extensionAuthCodes:()=>Rn,harnessReleases:()=>Pt,insightRecommendationLog:()=>Ee,insightsJobs:()=>W,instructionEvents:()=>Ct,instructionEventsRelations:()=>mR,instructionExperimentArms:()=>Or,instructionExperiments:()=>q,instructionPromotions:()=>ie,instructionSuggestionEvents:()=>tt,instructionSuggestions:()=>x,instructionUsageEvents:()=>so,instructionUsageEventsRelations:()=>TR,instructionVerdicts:()=>Y,instructionVersionIdentities:()=>sr,instructionVersions:()=>Ie,instructionVersionsRelations:()=>gR,instructions:()=>g,instructionsRelations:()=>pR,judgeReviewerVerdicts:()=>pe,launchJobs:()=>ce,launchJobsRelations:()=>vR,limitObservations:()=>we,memories:()=>F,memoriesRelations:()=>fR,memoryExperiments:()=>Nt,modelPricing:()=>Qe,notificationPreferences:()=>At,notifications:()=>bt,orgInvitations:()=>ae,orgInvitationsRelations:()=>dR,organizations:()=>G,organizationsRelations:()=>aR,packInstructions:()=>Oe,packInstructionsRelations:()=>xR,packs:()=>Le,packsRelations:()=>ER,pendingTreatmentExposures:()=>$d,planLimitsActive:()=>Ge,profiles:()=>T,profilesRelations:()=>sR,projectCheckouts:()=>le,projectInstructions:()=>at,projectInstructionsRelations:()=>_R,projects:()=>U,projectsRelations:()=>hR,providerDocsSnapshots:()=>xt,scaffoldingFingerprints:()=>zy,scaffoldingSegments:()=>Gy,sessionEvents:()=>qe,sessionEventsRelations:()=>IR,sessionInstructions:()=>se,sessionInstructionsRelations:()=>bR,sessionSendJobs:()=>Wd,sessionTerminalTargets:()=>Ve,sessions:()=>_,sessionsRelations:()=>yR,skillSubmissions:()=>ao,teams:()=>K,teamsRelations:()=>cR,treatmentAssignments:()=>jt,treatmentAssignmentsRelations:()=>SR,treatmentExposures:()=>Z,treatmentExposuresRelations:()=>AR,userOrganizations:()=>Q,userOrganizationsRelations:()=>uR,userTeams:()=>ye,userTeamsRelations:()=>lR,workerConnections:()=>fe});var du=J(()=>{"use strict";Rm();Yy()});function Pm(){is++,is>km&&(km=is)}function Cm(){is>0&&is--}function Om(){Xs++,Xs>jm&&(jm=Xs)}function Dm(){Xs>0&&Xs--}function Ja(){return is}function Mm(){Xy++}function Ga(){Qy++}function Zy(){Nm++}function Lm(){let e=Nm;return Nm=0,e}function $m(){return{current:is,peak:km,heavyCurrent:Xs,heavyPeak:jm,shedCount:Xy,ingestShedCount:Qy}}function Qs(){let e=Number(process.env.PG_INFLIGHT_MAX);return Number.isFinite(e)&&e>0?e:(Number(process.env.PG_POOL_MAX)||3)*4}function Ka(){let e=Qs(),t=Number(process.env.PG_INGEST_INFLIGHT_MAX);if(Number.isFinite(t)&&t>0)return Math.min(t,e);let n=Number(process.env.PG_POOL_MAX)||3;return Math.min(e,Math.max(n,Math.floor(e/2)))}var is,km,Xs,jm,Xy,Qy,Nm,qm=J(()=>{"use strict";is=0,km=0,Xs=0,jm=0,Xy=0,Qy=0,Nm=0;d(Pm,"trackDbOpStart");d(Cm,"trackDbOpEnd");d(Om,"trackHeavyDbOpStart");d(Dm,"trackHeavyDbOpEnd");d(Ja,"getDbLoad");d(Mm,"recordDbShed");d(Ga,"recordIngestShed");d(Zy,"recordQueryDeadline");d(Lm,"consumeDeadlineCount");d($m,"getDbLoadStats");d(Qs,"dbInflightMax");d(Ka,"dbIngestInflightMax")});import{drizzle as ew}from"drizzle-orm/postgres-js";import Um from"postgres";function Hm(e){let t=process.env[e];if(!t)throw new Error(`Missing required env var: ${e}`);return t}function tw(){if(Qa)throw new Error("getDb() called after closeDb(): the connection pool is closed for shutdown. Stop issuing queries (timers/requests) before draining the pool.");if(!Xa){let e=process.env.PG_APPLICATION_NAME||"rulemetric",t=Number(process.env.PG_POOL_MAX)||3,n=Number(process.env.PG_CONNECT_TIMEOUT_S)||10,r=Number(process.env.PG_STATEMENT_TIMEOUT_MS)||0,o=Number(process.env.PG_IDLE_TIMEOUT)||5,s=Number(process.env.PG_KEEP_ALIVE_S)||60;ei=Um(Hm("DATABASE_URL"),{prepare:!1,max:t,connect_timeout:n,idle_timeout:o,keep_alive:s,max_lifetime:300,connection:{application_name:e,...r>0?{statement_timeout:r}:{}}}),Xa=ew(ei,{schema:cu})}return Xa}function nw(){if(Qa)throw new Error("getHeavyDb() called after closeDb(): the connection pool is closed for shutdown. Stop issuing queries (timers/requests) before draining the pool.");if(!lu){let e=(process.env.PG_APPLICATION_NAME||"rulemetric")+":heavy",t=Number(process.env.PG_HEAVY_POOL_MAX)||2;pu=Um(Hm("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}}),lu=ew(pu,{schema:cu})}return lu}async function Za(){if(uu)return uu;Qa=!0;let e=ei,t=Zs,n=pu;return ei=void 0,Xa=void 0,Zs=void 0,pu=void 0,lu=void 0,uu=Promise.allSettled([e?e.end({timeout:5}):Promise.resolve(),t?t.end({timeout:5}):Promise.resolve(),n?n.end({timeout:5}):Promise.resolve()]).then(()=>{}),uu}function Bm(){if(Qa)return Promise.resolve();if(Ya)return Ya;let e=ei;return ei=void 0,Xa=void 0,Ya=(async()=>{e&&await e.end({timeout:5}).catch(()=>{})})().finally(()=>{Ya=void 0}),Ya}async function Fm(e){let t=Date.now();if(Qa)return{ok:!1,ms:0,err:new Error("pool closed for shutdown")};let n=Zs;try{return n||(n=Um(Hm("DATABASE_URL"),{prepare:!1,max:1,connect_timeout:Number(process.env.PG_CONNECT_TIMEOUT_S)||10,idle_timeout:20,max_lifetime:300,connection:{application_name:(process.env.PG_APPLICATION_NAME||"rulemetric")+":probe",statement_timeout:Math.max(2e3,e-2e3)}}),Zs=n),await Promise.race([n`SELECT 1`,new Promise((r,o)=>setTimeout(()=>o(new Error("db probe timeout")),e))]),{ok:!0,ms:Date.now()-t}}catch(r){return Zs===n&&(Zs=void 0),n?.end({timeout:1}).catch(()=>{}),{ok:!1,ms:Date.now()-t,err:r}}}function ec(e){let t=e?.message;return typeof t=="string"&&t.includes(DR)}function ti(e){let t=e,n=t?.code??t?.cause?.code??t?.errno;return n!==void 0&&MR.has(n)}function fu(e){let t=e,n=t?.code??t?.cause?.code??t?.errno;return n!==void 0&&LR.has(n)}async function rw(e,t={}){let n=t.attempts??3,r=t.baseMs??100,o;for(let s=0;s<n;s++)try{return await e()}catch(i){o=i;let a=ti(i)||t.retryResets===!0&&fu(i);if(s===n-1||!a)throw i;await new Promise(c=>setTimeout(c,r*2**s))}throw o}function tc(e){return e?.code==="QUERY_DEADLINE"}function ow(){let e=Number(process.env.PG_QUERY_DEADLINE_MS);return Number.isFinite(e)&&e>=0?e:2e4}function sw(){let e=Number(process.env.PG_HEAVY_QUERY_DEADLINE_MS);return Number.isFinite(e)&&e>=0?e:6e4}function $R(e,t,n=!0){let r,o=new Promise((s,i)=>{r=setTimeout(()=>{n&&Zy(),i(new mu(t))},t);let a=r;typeof a.unref=="function"&&a.unref()});return Promise.race([e,o]).finally(()=>clearTimeout(r))}function Wm(e,t=!1,n=0,r=!1){return e===null||typeof e!="object"&&typeof e!="function"?e:new Proxy(e,{get(o,s,i){if(s==="then"){let c=Reflect.get(o,s,i);return typeof c!="function"?c:(l,p)=>{let m=r?Om:Pm,y=r?Dm:Cm;m();let v=rw(()=>new Promise((f,w)=>c.call(o,f,w)),{retryResets:t});return(n>0?$R(v,n,!r):v).finally(y).then(l,p)}}let a=Reflect.get(o,s,i);return typeof a=="function"?(...c)=>Wm(a.apply(o,c),t,n,r):a}})}function cw(e,t=!1){let n=t?Om:Pm,r=t?Dm:Cm;n();try{return Promise.resolve(e()).finally(r)}catch(o){throw r(),o}}var Xa,ei,Qa,uu,Ya,Zs,pu,lu,DR,MR,LR,mu,iw,aw,u,nt,zm=J(()=>{"use strict";du();qm();Qa=!1;d(Hm,"getEnv");d(tw,"getDb");d(nw,"getHeavyDb");d(Za,"closeDb");d(Bm,"recyclePool");d(Fm,"probeDbReachable");DR="called after closeDb()";d(ec,"isPoolClosedError");MR=new Set(["CONNECT_TIMEOUT","ETIMEDOUT","ENOTFOUND","ECONNREFUSED","EAI_AGAIN"]);d(ti,"isRetryableConnectError");LR=new Set(["CONNECTION_CLOSED","ECONNRESET","EPIPE"]);d(fu,"isRetryableResetError");d(rw,"withDbRetry");mu=class extends Error{static{d(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"}};d(tc,"isQueryDeadlineError");d(ow,"queryDeadlineMs");d(sw,"heavyQueryDeadlineMs");d($R,"raceWithDeadline");iw=new Set(["select","selectDistinct","selectDistinctOn","insert","update","delete","execute","with","$count","refreshMaterializedView"]),aw=new Set(["select","selectDistinct","selectDistinctOn","$count"]);d(Wm,"wrapBuilder");d(cw,"gaugeTransaction");u=new Proxy({},{get(e,t){let n=tw(),r=n[t];if(typeof t=="string"&&iw.has(t)&&typeof r=="function"){let o=aw.has(t),s=ow();return(...i)=>Wm(r.apply(n,i),o,s)}return t==="transaction"&&typeof r=="function"?(...o)=>cw(()=>r.apply(n,o)):r}}),nt=new Proxy({},{get(e,t){let n=nw(),r=n[t];if(typeof t=="string"&&iw.has(t)&&typeof r=="function"){let o=aw.has(t);return(...s)=>Wm(r.apply(n,s),o,sw(),!0)}return t==="transaction"&&typeof r=="function"?(...o)=>cw(()=>r.apply(n,o),!0):r}})});async function tn(e){let[t]=await u.insert(bt).values({userId:e.userId,type:e.type,title:e.title,body:e.body??null,url:e.url??null,sourceTable:e.sourceTable??null,sourceId:e.sourceId??null,metadata:e.metadata??{}}).onConflictDoNothing({target:[bt.userId,bt.sourceTable,bt.sourceId]}).returning();return t??null}var dw=J(()=>{"use strict";zm();du();d(tn,"notifyUser")});var O=J(()=>{"use strict";du();zm();qm();dw()});function dI(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Fu(e,t){let n=(e??"").trim();if(!n)return null;if(!n.includes("Contents of "))return n;if(t){let o=n.match(new RegExp(`Contents of [^\\n]*${dI(t)}[^\\n]*\\n([\\s\\S]*?)(?=\\nContents of |$)`,"i"))?.[1]?.trim();if(o)return o;let s=t.split("/").pop();if(s&&s!==t){let a=n.match(new RegExp(`Contents of [^\\n]*${dI(s)}[^\\n]*\\n([\\s\\S]*?)(?=\\nContents of |$)`,"i"))?.[1]?.trim();if(a)return a}}return null}var Nf=J(()=>{"use strict";d(dI,"escapeRegExp");d(Fu,"extractInstructionSection")});var mI={};to(mI,{GRADUATION_MIN_N:()=>Ic,decideGraduation:()=>lI,graduatedRulesForRender:()=>Pf,instructionContentHash:()=>Ur,maybeGraduate:()=>pI,settleExperiment:()=>gi,verdictRowsForExperiments:()=>zu});import{createHash as cN}from"node:crypto";import{and as Wu,eq as Gn,inArray as dN,sql as uI}from"drizzle-orm";function lI(e){return e.resolution!=="resolved"||e.randomisationSuspect||e.contentChanged||e.delta===null||e.ci===null||e.measured.treated<Ic||e.measured.control<Ic?null:e.delta>0?"always":"never"}function Ur(e,t){let n=Fu(e,t);return n?cN("sha256").update(n).digest("hex"):null}async function pI(e){let{experimentId:t,userId:n,verdict:r}=e,o=lI(r);if(o===null)return null;let[s]=await u.select({id:q.id,instructionId:q.instructionId,projectPath:q.projectPath,status:q.status}).from(q).where(Wu(Gn(q.id,t),Gn(q.userId,n)));if(!s||s.status!=="running")return null;let[i]=await u.select({content:g.content,name:g.name}).from(g).where(Gn(g.id,s.instructionId)),a=Ur(i?.content,i?.name);if(!a)return null;let l=(await u.execute(uI`
1
+ var t_=Object.defineProperty;var u=(e,t)=>t_(e,"name",{value:t,configurable:!0}),Rm=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var V=(e,t)=>()=>(e&&(t=e(e=0)),t);var to=(e,t)=>{for(var n in t)t_(e,n,{get:t[n],enumerable:!0})};import{pgTable as xu,text as Hs,timestamp as Sa,jsonb as s_,uuid as Go,primaryKey as i_}from"drizzle-orm/pg-core";var K,G,Q,_e,Yo=V(()=>{"use strict";K=xu("organizations",{id:Go("id").primaryKey().defaultRandom(),name:Hs("name").unique().notNull(),slug:Hs("slug").unique().notNull(),metadata:s_("metadata"),createdAt:Sa("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Sa("updated_at",{withTimezone:!0}).defaultNow()}),G=xu("teams",{id:Go("id").primaryKey().defaultRandom(),orgId:Go("org_id").references(()=>K.id,{onDelete:"cascade"}),name:Hs("name").notNull(),slug:Hs("slug").notNull(),metadata:s_("metadata"),createdAt:Sa("created_at",{withTimezone:!0}).defaultNow()}),Q=xu("user_organizations",{userId:Go("user_id").notNull(),orgId:Go("org_id").references(()=>K.id,{onDelete:"cascade"}).notNull(),role:Hs("role").notNull().default("member"),createdAt:Sa("created_at",{withTimezone:!0}).defaultNow()},e=>[i_({columns:[e.userId,e.orgId]})]),_e=xu("user_teams",{userId:Go("user_id").notNull(),teamId:Go("team_id").references(()=>G.id,{onDelete:"cascade"}).notNull(),role:Hs("role").notNull().default("member"),createdAt:Sa("created_at",{withTimezone:!0}).defaultNow()},e=>[i_({columns:[e.userId,e.teamId]})])});import{boolean as Tu,integer as Lm,pgTable as TA,real as a_,text as Ru,timestamp as Mm,uuid as c_}from"drizzle-orm/pg-core";var T,Ht=V(()=>{"use strict";Yo();T=TA("profiles",{id:c_("id").primaryKey(),email:Ru("email"),displayName:Ru("display_name"),activeOrgId:c_("active_org_id").references(()=>K.id,{onDelete:"set null"}),isSuperadmin:Tu("is_superadmin").notNull().default(!1),claudeCodePlan:Ru("claude_code_plan"),planSource:Ru("plan_source").notNull().default("detected"),setupCompletedAt:Mm("setup_completed_at",{withTimezone:!0}),liveSendSkipped:Tu("live_send_skipped").notNull().default(!1),autoAcceptSuggestions:Tu("auto_accept_suggestions").notNull().default(!0),evolutionPaused:Tu("evolution_paused").notNull().default(!1),suggestionConfidenceThreshold:a_("suggestion_confidence_threshold").notNull().default(.7),autoAcceptMinScore:a_("auto_accept_min_score"),autoAcceptMaxPerRun:Lm("auto_accept_max_per_run"),autoAcceptMaxPerWindow:Lm("auto_accept_max_per_window"),autoAcceptWindowDays:Lm("auto_accept_window_days"),createdAt:Mm("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Mm("updated_at",{withTimezone:!0}).defaultNow()})});import{pgTable as RA,text as $m,timestamp as ku,uuid as Nu,index as u_}from"drizzle-orm/pg-core";var ae,d_=V(()=>{"use strict";Yo();Ht();ae=RA("org_invitations",{id:Nu("id").primaryKey().defaultRandom(),orgId:Nu("org_id").notNull().references(()=>K.id,{onDelete:"cascade"}),email:$m("email").notNull(),role:$m("role").notNull().default("member"),teamId:Nu("team_id").references(()=>G.id,{onDelete:"set null"}),invitedBy:Nu("invited_by").notNull().references(()=>T.id,{onDelete:"cascade"}),token:$m("token").notNull().unique(),expiresAt:ku("expires_at",{withTimezone:!0}).notNull(),acceptedAt:ku("accepted_at",{withTimezone:!0}),revokedAt:ku("revoked_at",{withTimezone:!0}),createdAt:ku("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[u_("idx_org_invitations_token").on(e.token),u_("idx_org_invitations_org").on(e.orgId)])});import{pgTable as qm,text as Vt,timestamp as no,jsonb as ju,uuid as or,integer as Pu,boolean as kA,uniqueIndex as Du,index as Aa}from"drizzle-orm/pg-core";var g,sr,Se,zn=V(()=>{"use strict";g=qm("instructions",{id:or("id").primaryKey().defaultRandom(),name:Vt("name").notNull(),description:Vt("description").notNull(),type:Vt("type").notNull().default("instruction"),scope:Vt("scope").notNull(),scopeRef:or("scope_ref"),version:Vt("version").notNull(),content:Vt("content").notNull(),frontmatter:ju("frontmatter").notNull(),slots:ju("slots"),tags:Vt("tags").array(),compatibility:Vt("compatibility").array(),createdBy:or("created_by"),createdAt:no("created_at",{withTimezone:!0}).defaultNow(),updatedAt:no("updated_at",{withTimezone:!0}).defaultNow(),archived:kA("archived").default(!1),archivedAt:no("archived_at",{withTimezone:!0}),archivedBy:or("archived_by"),forkedFromId:or("forked_from_id").references(()=>g.id,{onDelete:"set null"}),upstreamVersion:Vt("upstream_version"),badge:Vt("badge"),contentHash:Vt("content_hash"),contextIdentity:Vt("context_identity"),scanScore:Pu("scan_score"),scanFindings:ju("scan_findings"),popularityScore:Pu("popularity_score"),sourceUpdatedAt:no("source_updated_at",{withTimezone:!0})},e=>[Du("instructions_name_scope_ref_idx").on(e.name,e.scope,e.scopeRef),Aa("idx_instructions_scope").on(e.scope,e.scopeRef),Aa("idx_instructions_created_by").on(e.createdBy),Aa("idx_instructions_context_identity").on(e.createdBy,e.contextIdentity),Aa("idx_instructions_public_recency").on(e.scope,e.sourceUpdatedAt.desc())]),sr=qm("instruction_version_identities",{id:or("id").primaryKey().defaultRandom(),instructionId:or("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),contentHash:Vt("content_hash").notNull(),versionOrdinal:Pu("version_ordinal").notNull(),content:Vt("content"),firstSeenAt:no("first_seen_at",{withTimezone:!0}).notNull().defaultNow(),lastSeenAt:no("last_seen_at",{withTimezone:!0}).notNull().defaultNow(),createdAt:no("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Du("instruction_version_identities_hash_unique").on(e.instructionId,e.contentHash),Du("instruction_version_identities_ordinal_unique").on(e.instructionId,e.versionOrdinal),Aa("idx_ivi_instruction").on(e.instructionId)]),Se=qm("instruction_versions",{id:or("id").primaryKey().defaultRandom(),instructionId:or("instruction_id").references(()=>g.id,{onDelete:"cascade"}),versionNumber:Pu("version_number").notNull(),content:Vt("content").notNull(),frontmatter:ju("frontmatter").notNull(),changeSummary:Vt("change_summary"),createdBy:or("created_by"),createdAt:no("created_at",{withTimezone:!0}).defaultNow()},e=>[Du("instruction_versions_instruction_version_idx").on(e.instructionId,e.versionNumber)])});import{pgTable as NA,text as jA,timestamp as PA,jsonb as DA,uuid as Um,index as l_}from"drizzle-orm/pg-core";var Pt,m_=V(()=>{"use strict";zn();Pt=NA("instruction_events",{id:Um("id").primaryKey().defaultRandom(),instructionId:Um("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),eventType:jA("event_type").notNull(),actorId:Um("actor_id").notNull(),metadata:DA("metadata"),createdAt:PA("created_at",{withTimezone:!0}).defaultNow()},e=>[l_("idx_instruction_events_instruction").on(e.instructionId),l_("idx_instruction_events_type").on(e.eventType)])});import{boolean as OA,jsonb as CA,pgTable as Bm,primaryKey as p_,text as Xo,timestamp as Ea,uniqueIndex as Hm,uuid as Qo}from"drizzle-orm/pg-core";import{sql as LA}from"drizzle-orm";var M,it,de,Pr=V(()=>{"use strict";Yo();zn();M=Bm("projects",{id:Qo("id").primaryKey().defaultRandom(),orgId:Qo("org_id").references(()=>K.id,{onDelete:"cascade"}),name:Xo("name").notNull(),description:Xo("description"),githubRepo:Xo("github_repo"),gitRemoteUrl:Xo("git_remote_url"),gitRootCommit:Xo("git_root_commit"),gitRemoteAliases:Xo("git_remote_aliases").array().notNull().default([]),metadata:CA("metadata"),createdBy:Qo("created_by"),createdAt:Ea("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Ea("updated_at",{withTimezone:!0}).defaultNow()},e=>[Hm("projects_org_name_idx").on(e.orgId,e.name),Hm("projects_git_remote_url_unique").on(e.gitRemoteUrl).where(LA`${e.gitRemoteUrl} IS NOT NULL`)]),it=Bm("project_instructions",{projectId:Qo("project_id").references(()=>M.id,{onDelete:"cascade"}).notNull(),instructionId:Qo("instruction_id").references(()=>g.id,{onDelete:"cascade"}).notNull(),addedAt:Ea("added_at",{withTimezone:!0}).defaultNow(),addedBy:Qo("added_by")},e=>[p_({columns:[e.projectId,e.instructionId]})]),de=Bm("project_checkouts",{projectId:Qo("project_id").references(()=>M.id,{onDelete:"cascade"}).notNull(),path:Xo("path").notNull(),isWorktree:OA("is_worktree").notNull().default(!1),firstSeen:Ea("first_seen",{withTimezone:!0}).notNull().defaultNow(),lastSeen:Ea("last_seen",{withTimezone:!0}).notNull().defaultNow()},e=>[p_({columns:[e.projectId,e.path]}),Hm("project_checkouts_path_unique").on(e.path)])});import{pgTable as MA,text as Bs,timestamp as Fm,jsonb as f_,uuid as Ou,integer as $A,boolean as qA,index as Wm}from"drizzle-orm/pg-core";var X,Cu=V(()=>{"use strict";Ht();Yo();Pr();X=MA("agent_runs",{id:Ou("id").primaryKey().defaultRandom(),userId:Ou("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),orgId:Ou("org_id").references(()=>K.id,{onDelete:"set null"}),projectId:Ou("project_id").references(()=>M.id,{onDelete:"set null"}),projectPath:Bs("project_path"),gitRemote:Bs("git_remote"),baseBranch:Bs("base_branch"),title:Bs("title"),prompt:Bs("prompt"),toolSpec:f_("tool_spec").notNull().default([]),autoWorktree:qA("auto_worktree").notNull().default(!0),status:Bs("status").notNull().default("pending"),sessionCount:$A("session_count").notNull().default(0),metadata:f_("metadata").notNull().default({}),createdAt:Fm("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:Fm("updated_at",{withTimezone:!0}).notNull().defaultNow(),completedAt:Fm("completed_at",{withTimezone:!0})},e=>[Wm("idx_agent_runs_user").on(e.userId),Wm("idx_agent_runs_org_created").on(e.orgId,e.createdAt),Wm("idx_agent_runs_project").on(e.projectId)])});import{pgTable as zm,text as hn,timestamp as xa,jsonb as Zo,uuid as Dr,integer as Lu,uniqueIndex as g_,index as ir}from"drizzle-orm/pg-core";var y,$e,se,Fs=V(()=>{"use strict";zn();Pr();Ht();Yo();Cu();y=zm("sessions",{id:Dr("id").primaryKey().defaultRandom(),userId:Dr("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),externalSessionId:hn("external_session_id"),projectId:Dr("project_id").references(()=>M.id,{onDelete:"set null"}),orgId:Dr("org_id").references(()=>K.id,{onDelete:"set null"}),tool:hn("tool").notNull(),projectPath:hn("project_path"),gitBranch:hn("git_branch"),startedAt:xa("started_at",{withTimezone:!0}).notNull(),endedAt:xa("ended_at",{withTimezone:!0}),eventCount:Lu("event_count").default(0),tokenUsage:Zo("token_usage"),analysis:Zo("analysis"),analyzedAt:xa("analyzed_at",{withTimezone:!0}),analyzedEventCount:Lu("analyzed_event_count"),analyzedTurnCount:Lu("analyzed_turn_count"),metadata:Zo("metadata").default({}),origin:hn("origin").notNull().default("unknown"),runId:Dr("run_id").references(()=>X.id,{onDelete:"set null"}),model:hn("model"),harnessVersion:hn("harness_version"),createdAt:xa("created_at",{withTimezone:!0}).defaultNow()},e=>[ir("idx_sessions_user").on(e.userId),ir("idx_sessions_tool").on(e.tool),ir("idx_sessions_started_at").on(e.startedAt),ir("idx_sessions_project").on(e.projectId),ir("idx_sessions_org_started_at").on(e.orgId,e.startedAt),ir("idx_sessions_run").on(e.runId),g_("idx_sessions_user_external").on(e.userId,e.externalSessionId)]),$e=zm("session_events",{id:Dr("id").primaryKey().defaultRandom(),sessionId:Dr("session_id").notNull().references(()=>y.id,{onDelete:"cascade"}),sequence:Lu("sequence").notNull(),eventType:hn("event_type").notNull(),content:hn("content"),toolName:hn("tool_name"),toolInput:Zo("tool_input"),toolOutput:Zo("tool_output"),tokenUsage:Zo("token_usage"),model:hn("model"),timestamp:xa("timestamp",{withTimezone:!0}).notNull(),metadata:Zo("metadata").default({})},e=>[g_("session_events_session_sequence_idx").on(e.sessionId,e.sequence),ir("idx_session_events_session_id").on(e.sessionId),ir("idx_session_events_event_type").on(e.eventType),ir("idx_session_events_model").on(e.model)]),se=zm("session_instructions",{sessionId:Dr("session_id").notNull().references(()=>y.id,{onDelete:"cascade"}),instructionId:Dr("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),linkMethod:hn("link_method").notNull(),contentHash:hn("content_hash")},e=>[ir("idx_session_instructions_instruction_id").on(e.instructionId)])});import{pgTable as h_,text as Mu,timestamp as __,uuid as ar,integer as y_,index as Ws,unique as UA}from"drizzle-orm/pg-core";var kt,Z,w_=V(()=>{"use strict";Ht();Pr();Fs();kt=h_("treatment_assignments",{id:ar("id").primaryKey().defaultRandom(),userId:ar("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),treatmentType:Mu("treatment_type").notNull(),treatmentId:ar("treatment_id").notNull(),treatmentVersion:y_("treatment_version").notNull().default(1),projectId:ar("project_id").references(()=>M.id,{onDelete:"set null"}),assignedBy:ar("assigned_by").references(()=>T.id,{onDelete:"set null"}),method:Mu("method").notNull(),assignedAt:__("assigned_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Ws("idx_treatment_assignments_user").on(e.userId),Ws("idx_treatment_assignments_treatment").on(e.treatmentType,e.treatmentId),Ws("idx_treatment_assignments_project").on(e.projectId)]),Z=h_("treatment_exposures",{id:ar("id").primaryKey().defaultRandom(),sessionId:ar("session_id").notNull().references(()=>y.id,{onDelete:"cascade"}),userId:ar("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),treatmentType:Mu("treatment_type").notNull(),treatmentId:ar("treatment_id").notNull(),treatmentVersion:y_("treatment_version").notNull().default(1),assignmentId:ar("assignment_id").references(()=>kt.id,{onDelete:"set null"}),method:Mu("method").notNull(),exposedAt:__("exposed_at",{withTimezone:!0}).notNull().defaultNow()},e=>[UA("treatment_exposures_unique").on(e.sessionId,e.treatmentType,e.treatmentId,e.treatmentVersion),Ws("idx_treatment_exposures_treatment").on(e.treatmentType,e.treatmentId),Ws("idx_treatment_exposures_user").on(e.userId),Ws("idx_treatment_exposures_session").on(e.sessionId)])});import{pgTable as HA,text as Vm,timestamp as BA,uuid as $u,integer as FA,index as v_,uniqueIndex as WA}from"drizzle-orm/pg-core";var qu,I_=V(()=>{"use strict";Ht();Pr();qu=HA("pending_treatment_exposures",{id:$u("id").primaryKey().defaultRandom(),userId:$u("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),externalSessionId:Vm("external_session_id").notNull(),treatmentType:Vm("treatment_type").notNull(),treatmentId:$u("treatment_id").notNull(),treatmentVersion:FA("treatment_version").notNull().default(1),method:Vm("method").notNull().default("injected"),projectId:$u("project_id").references(()=>M.id,{onDelete:"set null"}),createdAt:BA("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[WA("pending_treatment_exposures_unique").on(e.externalSessionId,e.treatmentType,e.treatmentId,e.treatmentVersion),v_("idx_pending_treatment_exposures_ext").on(e.externalSessionId),v_("idx_pending_treatment_exposures_user").on(e.userId)])});import{pgTable as b_,text as ro,timestamp as S_,uuid as zs,numeric as zA,index as Jm,unique as VA}from"drizzle-orm/pg-core";var U,Or,Km=V(()=>{"use strict";Ht();zn();U=b_("instruction_experiments",{id:zs("id").primaryKey().defaultRandom(),userId:zs("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),instructionId:zs("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),projectPath:ro("project_path").notNull(),status:ro("status").notNull().default("running"),treatedShare:zA("treated_share").notNull().default("0.5"),salt:ro("salt").notNull(),contentHash:ro("content_hash"),source:ro("source").notNull().default("manual"),stoppedReason:ro("stopped_reason"),createdAt:S_("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Jm("idx_instruction_experiments_lookup").on(e.userId,e.projectPath)]),Or=b_("instruction_experiment_arms",{id:zs("id").primaryKey().defaultRandom(),experimentId:zs("experiment_id").notNull().references(()=>U.id,{onDelete:"cascade"}),userId:zs("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),externalSessionId:ro("external_session_id").notNull(),arm:ro("arm").notNull(),assignedAt:S_("assigned_at",{withTimezone:!0}).notNull().defaultNow()},e=>[VA("instruction_experiment_arms_unique").on(e.experimentId,e.externalSessionId),Jm("idx_instruction_experiment_arms_experiment").on(e.experimentId,e.arm),Jm("idx_instruction_experiment_arms_session").on(e.externalSessionId)])});import{pgTable as JA,text as Gm,timestamp as KA,uuid as Uu,numeric as Ym,integer as A_,jsonb as GA,index as YA,unique as XA}from"drizzle-orm/pg-core";var Y,E_=V(()=>{"use strict";Ht();zn();Km();Y=JA("instruction_verdicts",{id:Uu("id").primaryKey().defaultRandom(),userId:Uu("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),instructionId:Uu("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),contentHash:Gm("content_hash").notNull(),projectPath:Gm("project_path").notNull(),segment:GA("segment").notNull().default({}),decision:Gm("decision").notNull(),delta:Ym("delta").notNull(),ciLower:Ym("ci_lower").notNull(),ciUpper:Ym("ci_upper").notNull(),nTreated:A_("n_treated").notNull(),nControl:A_("n_control").notNull(),experimentId:Uu("experiment_id").references(()=>U.id,{onDelete:"set null"}),decidedAt:KA("decided_at",{withTimezone:!0}).notNull().defaultNow()},e=>[XA("instruction_verdicts_unique").on(e.instructionId,e.contentHash,e.projectPath),YA("idx_instruction_verdicts_render").on(e.userId,e.projectPath)])});import{pgTable as QA,text as Hu,timestamp as Xm,uuid as Qm,integer as ZA,unique as eE,index as tE}from"drizzle-orm/pg-core";var Ae,x_=V(()=>{"use strict";Ht();Ae=QA("insight_recommendation_log",{id:Qm("id").primaryKey().defaultRandom(),userId:Qm("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),projectPath:Hu("project_path").notNull().default(""),category:Hu("category").notNull(),contentHash:Hu("content_hash").notNull(),label:Hu("label").notNull().default(""),firstSeenAt:Xm("first_seen_at",{withTimezone:!0}).notNull().defaultNow(),lastSeenAt:Xm("last_seen_at",{withTimezone:!0}).notNull().defaultNow(),timesGenerated:ZA("times_generated").notNull().default(1),lastJobId:Qm("last_job_id"),dismissedAt:Xm("dismissed_at",{withTimezone:!0})},e=>[eE("insight_recommendation_log_unique").on(e.userId,e.projectPath,e.contentHash),tE("idx_insight_recommendation_log_read").on(e.userId,e.projectPath)])});import{pgTable as nE,text as Vs,timestamp as Zm,uuid as Ta,integer as T_,index as Bu}from"drizzle-orm/pg-core";var F,ep=V(()=>{"use strict";Ht();Pr();F=nE("memories",{id:Ta("id").primaryKey().defaultRandom(),userId:Ta("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),orgId:Ta("org_id"),projectId:Ta("project_id").references(()=>M.id,{onDelete:"set null"}),version:T_("version").notNull().default(1),parentId:Ta("parent_id").references(()=>F.id,{onDelete:"set null"}),kind:Vs("kind").notNull(),title:Vs("title").notNull(),body:Vs("body").notNull(),source:Vs("source").notNull(),status:Vs("status").notNull().default("active"),trustClass:Vs("trust_class"),trustVersion:T_("trust_version"),trustComputedAt:Zm("trust_computed_at",{withTimezone:!0}),createdAt:Zm("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:Zm("updated_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Bu("idx_memories_user").on(e.userId),Bu("idx_memories_project").on(e.projectId),Bu("idx_memories_parent").on(e.parentId),Bu("idx_memories_user_status").on(e.userId,e.status)])});import{pgTable as rE,text as Ra,timestamp as tp,uuid as np,integer as R_,jsonb as oE,index as k_}from"drizzle-orm/pg-core";var Nt,N_=V(()=>{"use strict";Ht();ep();Nt=rE("memory_experiments",{id:np("id").primaryKey().defaultRandom(),memoryId:np("memory_id").notNull().references(()=>F.id,{onDelete:"cascade"}),userId:np("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),memoryVersion:R_("memory_version").notNull().default(1),taskPrompt:Ra("task_prompt").notNull(),expectations:Ra("expectations").array().notNull().default([]),trials:R_("trials").notNull().default(10),model:Ra("model"),status:Ra("status").notNull().default("pending"),result:oE("result").$type(),error:Ra("error"),createdAt:tp("created_at",{withTimezone:!0}).notNull().defaultNow(),startedAt:tp("started_at",{withTimezone:!0}),completedAt:tp("completed_at",{withTimezone:!0})},e=>[k_("idx_memory_experiments_memory").on(e.memoryId),k_("idx_memory_experiments_user").on(e.userId)])});import{pgTable as sE,text as Js,timestamp as rp,uuid as op,jsonb as iE,uniqueIndex as aE,index as j_}from"drizzle-orm/pg-core";var ze,sp=V(()=>{"use strict";Ht();Fs();ze=sE("session_terminal_targets",{id:op("id").primaryKey().defaultRandom(),userId:op("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),sessionId:op("session_id").references(()=>y.id,{onDelete:"set null"}),externalSessionId:Js("external_session_id"),kind:Js("kind").notNull(),target:Js("target").notNull(),status:Js("status").notNull().default("active"),attachCommand:Js("attach_command").notNull(),projectPath:Js("project_path"),metadata:iE("metadata").notNull().default({}),lastSeenAt:rp("last_seen_at",{withTimezone:!0}).defaultNow(),createdAt:rp("created_at",{withTimezone:!0}).defaultNow(),updatedAt:rp("updated_at",{withTimezone:!0}).defaultNow()},e=>[aE("idx_session_terminal_targets_user_target").on(e.userId,e.target),j_("idx_session_terminal_targets_session").on(e.sessionId),j_("idx_session_terminal_targets_user_status").on(e.userId,e.status)])});import{boolean as cE,index as Fu,jsonb as P_,pgTable as uE,text as es,timestamp as ka,uuid as Wu,integer as D_}from"drizzle-orm/pg-core";var zu,O_=V(()=>{"use strict";Fs();sp();zu=uE("session_send_jobs",{id:Wu("id").primaryKey().defaultRandom(),userId:Wu("user_id").notNull(),sessionId:Wu("session_id").notNull().references(()=>y.id,{onDelete:"cascade"}),terminalTargetId:Wu("terminal_target_id").references(()=>ze.id,{onDelete:"set null"}),target:es("target").notNull(),message:es("message").notNull(),submit:cE("submit").notNull().default(!0),delivery:es("delivery").notNull().default("live"),status:es("status").notNull().default("pending"),result:P_("result"),error:es("error"),attempts:D_("attempts").notNull().default(0),taskKind:es("task_kind"),payload:P_("payload"),claimedBy:es("claimed_by"),claimedAt:ka("claimed_at",{withTimezone:!0}),leaseExpiresAt:ka("lease_expires_at",{withTimezone:!0}),leaseRecoveries:D_("lease_recoveries").notNull().default(0),createdAt:ka("created_at",{withTimezone:!0}).defaultNow(),updatedAt:ka("updated_at",{withTimezone:!0}).defaultNow(),completedAt:ka("completed_at",{withTimezone:!0})},e=>[Fu("idx_session_send_jobs_user").on(e.userId),Fu("idx_session_send_jobs_session").on(e.sessionId),Fu("idx_session_send_jobs_status").on(e.status),Fu("idx_session_send_jobs_pending").on(e.userId,e.status)])});import{pgTable as L_,text as ts,timestamp as Vu,jsonb as M_,uuid as oo,integer as dE,boolean as lE,uniqueIndex as mE,index as C_,primaryKey as pE}from"drizzle-orm/pg-core";var Le,De,$_=V(()=>{"use strict";zn();Le=L_("packs",{id:oo("id").primaryKey().defaultRandom(),name:ts("name").notNull(),description:ts("description").notNull(),scope:ts("scope").notNull(),scopeRef:oo("scope_ref"),version:ts("version").notNull().default("1.0.0"),tags:ts("tags").array(),badge:ts("badge"),metadata:M_("metadata"),createdBy:oo("created_by"),createdAt:Vu("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Vu("updated_at",{withTimezone:!0}).defaultNow(),archived:lE("archived").default(!1),archivedAt:Vu("archived_at",{withTimezone:!0}),archivedBy:oo("archived_by"),forkedFromId:oo("forked_from_id").references(()=>Le.id,{onDelete:"set null"}),upstreamVersion:ts("upstream_version")},e=>[mE("packs_name_scope_ref_idx").on(e.name,e.scope,e.scopeRef),C_("idx_packs_scope").on(e.scope,e.scopeRef),C_("idx_packs_created_by").on(e.createdBy)]),De=L_("pack_instructions",{packId:oo("pack_id").references(()=>Le.id,{onDelete:"cascade"}).notNull(),instructionId:oo("instruction_id").references(()=>g.id,{onDelete:"cascade"}).notNull(),position:dE("position").notNull().default(0),slotOverrides:M_("slot_overrides"),addedAt:Vu("added_at",{withTimezone:!0}).defaultNow(),addedBy:oo("added_by")},e=>[pE({columns:[e.packId,e.instructionId]})])});import{pgTable as fE,text as ip,timestamp as gE,jsonb as hE,uuid as ap,index as Ks}from"drizzle-orm/pg-core";var so,q_=V(()=>{"use strict";zn();so=fE("instruction_usage_events",{id:ap("id").primaryKey().defaultRandom(),instructionId:ap("instruction_id").references(()=>g.id,{onDelete:"set null"}),userId:ap("user_id").notNull(),surface:ip("surface").notNull(),action:ip("action").notNull(),metadata:hE("metadata"),traceId:ip("trace_id"),createdAt:gE("created_at",{withTimezone:!0}).defaultNow()},e=>[Ks("idx_usage_events_instruction").on(e.instructionId),Ks("idx_usage_events_user").on(e.userId),Ks("idx_usage_events_surface").on(e.surface),Ks("idx_usage_events_action").on(e.action),Ks("idx_usage_events_created_at").on(e.createdAt),Ks("idx_usage_events_user_created").on(e.userId,e.createdAt)])});import{pgTable as _E,text as Ju,timestamp as U_,jsonb as yE,uuid as H_,index as cp}from"drizzle-orm/pg-core";var pe,B_=V(()=>{"use strict";pe=_E("worker_connections",{id:H_("id").primaryKey().defaultRandom(),userId:H_("user_id").notNull(),workerType:Ju("worker_type").notNull().default("mcp"),clientName:Ju("client_name").notNull(),clientVersion:Ju("client_version"),workerVersion:Ju("worker_version"),lastHeartbeat:U_("last_heartbeat",{withTimezone:!0}).notNull().defaultNow(),connectedAt:U_("connected_at",{withTimezone:!0}).notNull().defaultNow(),metadata:yE("metadata")},e=>[cp("idx_worker_connections_user").on(e.userId),cp("idx_worker_connections_heartbeat").on(e.userId,e.lastHeartbeat),cp("idx_worker_connections_type").on(e.userId,e.workerType)])});import{pgTable as wE,text as Ku,timestamp as vE,jsonb as IE,uuid as F_,index as W_}from"drizzle-orm/pg-core";var Gu,z_=V(()=>{"use strict";Gu=wE("cli_setup_events",{id:F_("id").primaryKey().defaultRandom(),userId:F_("user_id").notNull(),deviceId:Ku("device_id").notNull(),event:Ku("event").notNull(),cliVersion:Ku("cli_version"),os:Ku("os"),props:IE("props").notNull().default({}),createdAt:vE("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[W_("idx_cli_setup_events_user").on(e.userId,e.createdAt),W_("idx_cli_setup_events_device").on(e.deviceId,e.createdAt)])});import{pgTable as bE,text as ns,integer as SE,boolean as AE,timestamp as EE,jsonb as xE,uuid as TE,index as V_}from"drizzle-orm/pg-core";var Yu,J_=V(()=>{"use strict";Yu=bE("cli_error_events",{id:TE("id").primaryKey().defaultRandom(),deviceId:ns("device_id"),event:ns("event").notNull(),command:ns("command"),statusCode:SE("status_code"),message:ns("message"),cliVersion:ns("cli_version"),os:ns("os"),nodeVersion:ns("node_version"),proxied:AE("proxied"),props:xE("props").notNull().default({}),createdAt:EE("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[V_("idx_cli_error_events_created").on(e.createdAt),V_("idx_cli_error_events_device").on(e.deviceId,e.createdAt)])});import{sql as RE}from"drizzle-orm";import{pgTable as rs,text as yt,timestamp as an,jsonb as Tn,uuid as lt,integer as Cr,boolean as Na,index as Jt,unique as K_}from"drizzle-orm/pg-core";var k,Ie,ve,Xe,Ve,le,Vn,ja=V(()=>{"use strict";k=rs("eval_targets",{id:lt("id").primaryKey().defaultRandom(),userId:lt("user_id").notNull(),name:yt("name").notNull(),type:yt("type").notNull(),content:yt("content").notNull(),description:yt("description").notNull().default(""),metadata:Tn("metadata").notNull().default({}),version:Cr("version").notNull().default(1),parentId:lt("parent_id").references(()=>k.id,{onDelete:"set null"}),createdAt:an("created_at",{withTimezone:!0}).defaultNow(),updatedAt:an("updated_at",{withTimezone:!0}).defaultNow()},e=>[Jt("eval_targets_name_user_idx").on(e.name,e.userId),Jt("idx_eval_targets_user").on(e.userId),Jt("idx_eval_targets_type").on(e.type),Jt("idx_eval_targets_parent").on(e.parentId)]),Ie=rs("evals",{id:lt("id").primaryKey().defaultRandom(),evalTargetId:lt("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),name:yt("name").notNull(),prompt:yt("prompt").notNull(),expectedOutput:yt("expected_output").notNull().default(""),files:Tn("files").notNull().default([]),expectations:Tn("expectations").notNull().default([]),retiredAt:an("retired_at",{withTimezone:!0}),retiredReason:yt("retired_reason"),createdAt:an("created_at",{withTimezone:!0}).defaultNow(),updatedAt:an("updated_at",{withTimezone:!0}).defaultNow(),contentUpdatedAt:an("content_updated_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Jt("idx_evals_target").on(e.evalTargetId),Jt("idx_evals_target_active").on(e.evalTargetId).where(RE`${e.retiredAt} IS NULL`)]),ve=rs("eval_runs",{id:lt("id").primaryKey().defaultRandom(),jobId:lt("job_id"),evalId:lt("eval_id").notNull().references(()=>Ie.id,{onDelete:"cascade"}),evalTargetId:lt("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),evalTargetVersion:Cr("eval_target_version").notNull(),configuration:yt("configuration").notNull(),runNumber:Cr("run_number").notNull().default(1),iteration:Cr("iteration").notNull().default(1),status:yt("status").notNull().default("completed"),outputs:Tn("outputs").notNull().default({}),timing:Tn("timing").notNull().default({}),grading:Tn("grading").notNull().default({}),comparison:Tn("comparison"),createdAt:an("created_at",{withTimezone:!0}).defaultNow()},e=>[Jt("idx_eval_runs_eval").on(e.evalId),Jt("idx_eval_runs_target").on(e.evalTargetId),Jt("idx_eval_runs_iteration").on(e.evalTargetId,e.iteration)]),Xe=rs("eval_comparisons",{id:lt("id").primaryKey().defaultRandom(),userId:lt("user_id").notNull(),targetAId:lt("target_a_id").notNull().references(()=>k.id,{onDelete:"cascade"}),targetBId:lt("target_b_id").notNull().references(()=>k.id,{onDelete:"cascade"}),targetAVersion:Cr("target_a_version").notNull(),targetBVersion:Cr("target_b_version").notNull(),isSwapped:Na("is_swapped").notNull().default(!1),winnerTargetId:lt("winner_target_id").references(()=>k.id,{onDelete:"set null"}),perEval:Tn("per_eval").notNull().default([]),overall:Tn("overall").notNull().default({}),rawOutput:yt("raw_output"),model:yt("model"),status:yt("status").notNull().default("completed"),createdAt:an("created_at",{withTimezone:!0}).defaultNow()},e=>[Jt("idx_eval_comparisons_target_a").on(e.targetAId),Jt("idx_eval_comparisons_target_b").on(e.targetBId),Jt("idx_eval_comparisons_user").on(e.userId)]),Ve=rs("eval_grade_annotations",{id:lt("id").primaryKey().defaultRandom(),userId:lt("user_id").notNull(),evalRunId:lt("eval_run_id").notNull().references(()=>ve.id,{onDelete:"cascade"}),evalTargetId:lt("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),expectationIndex:Cr("expectation_index").notNull(),expectationText:yt("expectation_text").notNull(),judgePassed:Na("judge_passed").notNull(),judgeMethod:yt("judge_method").notNull(),judgeModel:yt("judge_model"),verdict:yt("verdict").notNull(),flag:yt("flag"),note:yt("note"),createdAt:an("created_at",{withTimezone:!0}).defaultNow(),updatedAt:an("updated_at",{withTimezone:!0}).defaultNow()},e=>[Jt("idx_eval_grade_annotations_target").on(e.evalTargetId),Jt("idx_eval_grade_annotations_run").on(e.evalRunId),K_("eval_grade_annotations_eval_run_id_expectation_index_key").on(e.evalRunId,e.expectationIndex)]),le=rs("judge_reviewer_verdicts",{id:lt("id").primaryKey().defaultRandom(),userId:lt("user_id").notNull(),evalTargetId:lt("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),evalRunId:lt("eval_run_id").notNull().references(()=>ve.id,{onDelete:"cascade"}),expectationIndex:Cr("expectation_index").notNull(),expectationText:yt("expectation_text").notNull(),judgePassed:Na("judge_passed").notNull(),humanPassed:Na("human_passed").notNull(),reviewerEngine:yt("reviewer_engine").notNull(),reviewerModel:yt("reviewer_model").notNull(),reviewerPassed:Na("reviewer_passed").notNull(),resolvedAt:an("resolved_at",{withTimezone:!0}),resolution:yt("resolution"),createdAt:an("created_at",{withTimezone:!0}).defaultNow(),updatedAt:an("updated_at",{withTimezone:!0}).defaultNow()},e=>[Jt("idx_jrv_target").on(e.evalTargetId),K_("judge_reviewer_verdicts_eval_run_id_expectation_index_review_key").on(e.evalRunId,e.expectationIndex,e.reviewerModel)]),Vn=rs("benchmarks",{id:lt("id").primaryKey().defaultRandom(),evalTargetId:lt("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),iteration:Cr("iteration").notNull().default(1),runSummary:Tn("run_summary").notNull().default({}),notes:Tn("notes").notNull().default([]),feedback:Tn("feedback"),createdAt:an("created_at",{withTimezone:!0}).defaultNow()},e=>[Jt("idx_benchmarks_target").on(e.evalTargetId)])});import{sql as up}from"drizzle-orm";import{pgTable as kE,text as Lr,timestamp as NE,jsonb as Xu,uuid as Qu,boolean as jE,index as Pa,uniqueIndex as PE}from"drizzle-orm/pg-core";var ie,G_=V(()=>{"use strict";ja();zn();ie=kE("instruction_promotions",{id:Qu("id").primaryKey().defaultRandom(),userId:Qu("user_id").notNull(),evalTargetId:Qu("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),instructionId:Qu("instruction_id").references(()=>g.id,{onDelete:"set null"}),fromContentHash:Lr("from_content_hash").notNull(),toContentHash:Lr("to_content_hash").notNull(),fromContent:Lr("from_content").notNull(),toContent:Lr("to_content").notNull(),proposalSource:Lr("proposal_source").notNull(),proposalRationale:Lr("proposal_rationale").notNull().default(""),decision:Lr("decision").notNull(),applied:jE("applied").notNull().default(!1),refusals:Xu("refusals").notNull().default([]),rationale:Lr("rationale").notNull().default(""),effectClass:Lr("effect_class").notNull(),verdict:Xu("verdict").notNull().default({}),gates:Xu("gates").notNull().default({}),touchedSections:Xu("touched_sections").notNull().default([]),createdAt:NE("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Pa("idx_instruction_promotions_budget").on(e.evalTargetId,e.createdAt.desc()).where(up`${e.applied}`),Pa("idx_instruction_promotions_target").on(e.evalTargetId,e.createdAt.desc()),Pa("idx_instruction_promotions_user").on(e.userId,e.createdAt.desc()),Pa("idx_instruction_promotions_to_hash").on(e.toContentHash),PE("uq_instruction_promotions_applied").on(e.evalTargetId,e.fromContentHash,e.toContentHash).where(up`${e.applied}`),Pa("idx_instruction_promotions_applied_hash").on(e.toContentHash,e.createdAt.desc()).where(up`${e.applied}`)])});import{pgTable as DE,text as io,timestamp as OE,jsonb as Da,uuid as dp,integer as lp,real as CE,index as Oa,uniqueIndex as Y_}from"drizzle-orm/pg-core";var $,X_=V(()=>{"use strict";Fs();Ht();$=DE("context_snapshots",{id:dp("id").primaryKey().defaultRandom(),sessionId:dp("session_id").references(()=>y.id,{onDelete:"cascade"}),userId:dp("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),sequence:lp("sequence").notNull().default(0),provider:io("provider").notNull(),model:io("model").notNull(),systemPrompt:io("system_prompt").notNull(),injectedInstructions:Da("injected_instructions").notNull().default([]),messagesSummary:Da("messages_summary").notNull(),tools:Da("tools").notNull().default([]),systemHash:io("system_hash").notNull(),requestHash:io("request_hash").notNull().default(""),toolsHash:io("tools_hash"),injectedHash:io("injected_hash"),messagesDelta:Da("messages_delta").default([]),messagesDeltaRef:io("messages_delta_ref"),maxTokens:lp("max_tokens"),temperature:CE("temperature"),estimatedTokens:lp("estimated_tokens"),capturedAt:OE("captured_at",{withTimezone:!0}).notNull().defaultNow(),metadata:Da("metadata").default({})},e=>[Oa("idx_context_snapshots_session").on(e.sessionId),Oa("idx_context_snapshots_user").on(e.userId),Oa("idx_context_snapshots_hash").on(e.systemHash),Oa("idx_context_snapshots_request_hash").on(e.requestHash),Y_("idx_snapshots_session_request").on(e.sessionId,e.requestHash),Y_("idx_snapshots_session_sequence").on(e.sessionId,e.sequence),Oa("idx_context_snapshots_user_session_captured").on(e.userId,e.sessionId,e.capturedAt.desc())])});import{pgTable as LE,text as Q_,timestamp as ME,jsonb as $E,integer as qE,index as UE}from"drizzle-orm/pg-core";var _n,Z_=V(()=>{"use strict";_n=LE("content_blobs",{hash:Q_("hash").primaryKey(),contentType:Q_("content_type").notNull(),content:$E("content").notNull(),sizeBytes:qE("size_bytes").notNull().default(0),createdAt:ME("created_at",{withTimezone:!0}).defaultNow()},e=>[UE("idx_content_blobs_type").on(e.contentType)])});import{pgTable as HE,text as Zu,timestamp as Ca,jsonb as ed,uuid as mp,index as td,integer as ey}from"drizzle-orm/pg-core";var Re,ty=V(()=>{"use strict";ja();Re=HE("eval_jobs",{id:mp("id").primaryKey().defaultRandom(),userId:mp("user_id").notNull(),evalTargetId:mp("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),status:Zu("status").notNull().default("pending"),config:ed("config").notNull().default({}),progress:ed("progress").notNull().default({}),result:ed("result"),error:Zu("error"),attempts:ey("attempts").notNull().default(0),taskKind:Zu("task_kind"),payload:ed("payload"),claimedBy:Zu("claimed_by"),claimedAt:Ca("claimed_at",{withTimezone:!0}),leaseExpiresAt:Ca("lease_expires_at",{withTimezone:!0}),leaseRecoveries:ey("lease_recoveries").notNull().default(0),createdAt:Ca("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Ca("updated_at",{withTimezone:!0}).defaultNow(),completedAt:Ca("completed_at",{withTimezone:!0})},e=>[td("idx_eval_jobs_user").on(e.userId),td("idx_eval_jobs_target").on(e.evalTargetId),td("idx_eval_jobs_status").on(e.status),td("idx_eval_jobs_pending").on(e.userId,e.status)])});import{pgTable as BE,text as La,timestamp as Ma,jsonb as ny,uuid as ry,integer as oy,index as sy}from"drizzle-orm/pg-core";var ke,iy=V(()=>{"use strict";ke=BE("agent_jobs",{id:ry("id").primaryKey().defaultRandom(),userId:ry("user_id").notNull(),taskKind:La("task_kind").notNull(),status:La("status").notNull().default("pending"),payload:ny("payload").notNull(),dedupeKey:La("dedupe_key"),result:ny("result"),error:La("error"),attempts:oy("attempts").notNull().default(0),claimedBy:La("claimed_by"),claimedAt:Ma("claimed_at",{withTimezone:!0}),leaseExpiresAt:Ma("lease_expires_at",{withTimezone:!0}),leaseRecoveries:oy("lease_recoveries").notNull().default(0),createdAt:Ma("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:Ma("updated_at",{withTimezone:!0}).notNull().defaultNow(),completedAt:Ma("completed_at",{withTimezone:!0})},e=>[sy("idx_agent_jobs_claim").on(e.userId,e.status,e.taskKind,e.createdAt),sy("idx_agent_jobs_dedupe").on(e.userId,e.taskKind,e.dedupeKey)])});import{pgTable as FE,text as $a,timestamp as qa,jsonb as nd,uuid as pp,index as rd,integer as ay}from"drizzle-orm/pg-core";var W,cy=V(()=>{"use strict";Pr();W=FE("insights_jobs",{id:pp("id").primaryKey().defaultRandom(),userId:pp("user_id").notNull(),status:$a("status").notNull().default("pending"),projectPath:$a("project_path"),projectId:pp("project_id").references(()=>M.id,{onDelete:"set null"}),config:nd("config").notNull().default({}),progress:nd("progress").notNull().default({}),result:nd("result"),error:$a("error"),attempts:ay("attempts").notNull().default(0),taskKind:$a("task_kind"),payload:nd("payload"),claimedBy:$a("claimed_by"),claimedAt:qa("claimed_at",{withTimezone:!0}),leaseExpiresAt:qa("lease_expires_at",{withTimezone:!0}),leaseRecoveries:ay("lease_recoveries").notNull().default(0),createdAt:qa("created_at",{withTimezone:!0}).defaultNow(),updatedAt:qa("updated_at",{withTimezone:!0}).defaultNow(),completedAt:qa("completed_at",{withTimezone:!0})},e=>[rd("idx_insights_jobs_user").on(e.userId),rd("idx_insights_jobs_status").on(e.status),rd("idx_insights_jobs_pending").on(e.userId,e.status),rd("idx_insights_jobs_project").on(e.projectId)])});import{pgTable as WE,text as fp,timestamp as od,uuid as uy,index as zE,uniqueIndex as VE}from"drizzle-orm/pg-core";var be,dy=V(()=>{"use strict";Ht();be=WE("api_keys",{id:uy("id").primaryKey().defaultRandom(),userId:uy("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),name:fp("name").notNull(),keyHash:fp("key_hash").notNull(),keyPrefix:fp("key_prefix").notNull(),lastUsedAt:od("last_used_at",{withTimezone:!0}),expiresAt:od("expires_at",{withTimezone:!0}),revokedAt:od("revoked_at",{withTimezone:!0}),createdAt:od("created_at",{withTimezone:!0}).defaultNow()},e=>[zE("idx_api_keys_user").on(e.userId),VE("idx_api_keys_hash").on(e.keyHash)])});import{pgTable as JE,text as gp,timestamp as ly,uuid as KE,index as GE}from"drizzle-orm/pg-core";var Rn,my=V(()=>{"use strict";Ht();Rn=JE("extension_auth_codes",{code:gp("code").primaryKey(),userId:KE("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),editor:gp("editor"),email:gp("email"),expiresAt:ly("expires_at",{withTimezone:!0}).notNull(),createdAt:ly("created_at",{withTimezone:!0}).defaultNow()},e=>[GE("idx_ext_auth_codes_expiry").on(e.expiresAt)])});import{pgTable as YE,text as XE,timestamp as py,jsonb as QE,uuid as hp,index as fy}from"drizzle-orm/pg-core";var Me,gy=V(()=>{"use strict";ja();Me=YE("eval_conversations",{id:hp("id").primaryKey().defaultRandom(),evalTargetId:hp("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),userId:hp("user_id").notNull(),messages:QE("messages").notNull().default([]),status:XE("status").notNull().default("active"),createdAt:py("created_at",{withTimezone:!0}).defaultNow(),updatedAt:py("updated_at",{withTimezone:!0}).defaultNow()},e=>[fy("idx_eval_conversations_target").on(e.evalTargetId),fy("idx_eval_conversations_user").on(e.userId)])});import{pgTable as ZE,text as Mr,timestamp as hy,jsonb as ex,uuid as _p}from"drizzle-orm/pg-core";var ao,_y=V(()=>{"use strict";ao=ZE("skill_submissions",{id:_p("id").primaryKey().defaultRandom(),skillId:Mr("skill_id").notNull(),name:Mr("name").notNull(),description:Mr("description").notNull(),category:Mr("category").notNull(),tools:Mr("tools").array().notNull(),tags:Mr("tags").array().default([]),content:Mr("content").notNull(),status:Mr("status").notNull().default("pending"),submittedBy:_p("submitted_by").notNull(),reviewedBy:_p("reviewed_by"),reviewNote:Mr("review_note"),metadata:ex("metadata"),createdAt:hy("created_at",{withTimezone:!0}).defaultNow(),updatedAt:hy("updated_at",{withTimezone:!0}).defaultNow()})});import{pgTable as tx,text as Ua,timestamp as yy,jsonb as nx,uuid as rx,uniqueIndex as ox,index as wy}from"drizzle-orm/pg-core";var jt,vy=V(()=>{"use strict";jt=tx("harness_releases",{id:rx("id").primaryKey().defaultRandom(),harness:Ua("harness").notNull(),version:Ua("version").notNull(),publishedAt:yy("published_at",{withTimezone:!0}).notNull(),title:Ua("title"),body:Ua("body"),categories:nx("categories").default({}),url:Ua("url"),createdAt:yy("created_at",{withTimezone:!0}).defaultNow()},e=>[ox("idx_harness_releases_unique").on(e.harness,e.version),wy("idx_harness_releases_harness").on(e.harness),wy("idx_harness_releases_published").on(e.publishedAt)])});import{pgTable as sx,text as Gs,timestamp as Iy,jsonb as ix,uuid as by,index as Sy,uniqueIndex as ax}from"drizzle-orm/pg-core";var bt,Ay=V(()=>{"use strict";bt=sx("notifications",{id:by("id").primaryKey().defaultRandom(),userId:by("user_id").notNull(),type:Gs("type").notNull(),title:Gs("title").notNull(),body:Gs("body"),url:Gs("url"),sourceTable:Gs("source_table"),sourceId:Gs("source_id"),metadata:ix("metadata").notNull().default({}),readAt:Iy("read_at",{withTimezone:!0}),createdAt:Iy("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Sy("idx_notifications_user_created").on(e.userId,e.createdAt),Sy("idx_notifications_user_unread").on(e.userId),ax("idx_notifications_source_dedup").on(e.userId,e.sourceTable,e.sourceId)])});import{pgTable as cx,text as Ha,timestamp as Ba,jsonb as yp,uuid as wp,index as sd,integer as Ey}from"drizzle-orm/pg-core";var ce,xy=V(()=>{"use strict";Cu();ce=cx("launch_jobs",{id:wp("id").primaryKey().defaultRandom(),userId:wp("user_id").notNull(),tool:Ha("tool").notNull(),status:Ha("status").notNull().default("pending"),config:yp("config").notNull().default({}),result:yp("result"),error:Ha("error"),attempts:Ey("attempts").notNull().default(0),taskKind:Ha("task_kind"),payload:yp("payload"),claimedBy:Ha("claimed_by"),claimedAt:Ba("claimed_at",{withTimezone:!0}),leaseExpiresAt:Ba("lease_expires_at",{withTimezone:!0}),leaseRecoveries:Ey("lease_recoveries").notNull().default(0),createdAt:Ba("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Ba("updated_at",{withTimezone:!0}).defaultNow(),completedAt:Ba("completed_at",{withTimezone:!0}),runId:wp("run_id").references(()=>X.id,{onDelete:"set null"})},e=>[sd("idx_launch_jobs_user").on(e.userId),sd("idx_launch_jobs_status").on(e.status),sd("idx_launch_jobs_pending").on(e.userId,e.status),sd("idx_launch_jobs_run").on(e.runId)])});import{pgTable as Ty,uuid as $r,text as co,real as ux,timestamp as Fa,boolean as dx,uniqueIndex as lx,index as Wa}from"drizzle-orm/pg-core";var id,x,Je,Ry=V(()=>{"use strict";Ht();zn();Pr();id=["add","remove","trim"],x=Ty("instruction_suggestions",{id:$r("id").primaryKey().defaultRandom(),userId:$r("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),instructionId:$r("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),projectPath:co("project_path").notNull(),projectId:$r("project_id").references(()=>M.id,{onDelete:"set null"}),score:ux("score").notNull(),reason:co("reason").notNull(),kind:co("kind").$type().notNull().default("add"),generatedAt:Fa("generated_at",{withTimezone:!0}).notNull().defaultNow(),isStale:dx("is_stale").notNull().default(!1),dismissedAt:Fa("dismissed_at",{withTimezone:!0}),acceptedAt:Fa("accepted_at",{withTimezone:!0}),declinedAt:Fa("declined_at",{withTimezone:!0}),declinedReason:co("declined_reason"),promotedToInstructionId:$r("promoted_to_instruction_id").references(()=>g.id,{onDelete:"set null"})},e=>[lx("idx_instruction_suggestions_user_project_instruction_kind").on(e.userId,e.projectPath,e.instructionId,e.kind),Wa("idx_instruction_suggestions_user_project").on(e.userId,e.projectPath),Wa("idx_instruction_suggestions_user_proj_id").on(e.userId,e.projectId),Wa("idx_instruction_suggestions_generated_at").on(e.generatedAt)]),Je=Ty("instruction_suggestion_events",{id:$r("id").primaryKey().defaultRandom(),suggestionId:$r("suggestion_id").notNull().references(()=>x.id,{onDelete:"cascade"}),userId:$r("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),eventType:co("event_type").notNull(),tool:co("tool"),sessionId:$r("session_id"),projectPath:co("project_path").notNull(),actor:co("actor"),createdAt:Fa("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Wa("idx_instruction_suggestion_events_suggestion_id").on(e.suggestionId),Wa("idx_instruction_suggestion_events_user_id").on(e.userId)])});import{pgTable as mx,text as vp,integer as px,numeric as za,timestamp as Ip,index as fx,primaryKey as gx}from"drizzle-orm/pg-core";var Qe,ky=V(()=>{"use strict";Qe=mx("model_pricing",{provider:vp("provider").notNull(),modelId:vp("model_id").notNull(),inputPerM:za("input_per_m").notNull(),outputPerM:za("output_per_m").notNull(),cacheReadPerM:za("cache_read_per_m").notNull(),cacheWrite5mPerM:za("cache_write_5m_per_m").notNull(),cacheWrite1hPerM:za("cache_write_1h_per_m").notNull(),contextWindow:px("context_window"),effectiveFrom:Ip("effective_from",{withTimezone:!0}).notNull(),effectiveUntil:Ip("effective_until",{withTimezone:!0}),source:vp("source").notNull(),verifiedAt:Ip("verified_at",{withTimezone:!0})},e=>[gx({columns:[e.provider,e.modelId,e.effectiveFrom]}),fx("idx_model_pricing_active").on(e.provider,e.modelId,e.effectiveFrom.desc())])});import{pgTable as hx,text as os,numeric as Ny,timestamp as jy,uuid as Py,jsonb as _x,index as Dy}from"drizzle-orm/pg-core";var ye,Oy=V(()=>{"use strict";ye=hx("limit_observations",{id:Py("id").primaryKey().defaultRandom(),observedAt:jy("observed_at",{withTimezone:!0}).notNull().defaultNow(),provider:os("provider").notNull(),plan:os("plan").notNull(),limitType:os("limit_type").notNull(),value:Ny("value").notNull(),unit:os("unit").notNull(),comparator:os("comparator").notNull().default("="),resetsAt:jy("resets_at",{withTimezone:!0}),sourceType:os("source_type").notNull(),sourceUrl:os("source_url"),sourceEvidence:_x("source_evidence"),confidence:Ny("confidence").notNull(),userId:Py("user_id")},e=>[Dy("idx_limit_obs_lookup").on(e.provider,e.plan,e.limitType,e.observedAt.desc()),Dy("idx_limit_obs_user").on(e.userId,e.observedAt.desc())])});import{pgTable as yx,text as ad,timestamp as wx,uuid as vx,jsonb as Ix,boolean as bx,uniqueIndex as Sx}from"drizzle-orm/pg-core";var xt,Cy=V(()=>{"use strict";xt=yx("provider_docs_snapshots",{id:vx("id").primaryKey().defaultRandom(),fetchedAt:wx("fetched_at",{withTimezone:!0}).notNull().defaultNow(),provider:ad("provider").notNull(),docUrl:ad("doc_url").notNull(),contentHash:ad("content_hash").notNull(),content:ad("content").notNull(),parseSuccess:bx("parse_success").notNull(),parseErrors:Ix("parse_errors")},e=>[Sx("idx_docs_dedup").on(e.provider,e.docUrl,e.contentHash)])});import{pgTable as Ax,text as cd,numeric as Ly,timestamp as My,uuid as Ex,primaryKey as xx,index as Tx}from"drizzle-orm/pg-core";var Ke,$y=V(()=>{"use strict";Ke=Ax("plan_limits_active",{provider:cd("provider").notNull(),plan:cd("plan").notNull(),limitType:cd("limit_type").notNull(),value:Ly("value").notNull(),unit:cd("unit").notNull(),effectiveFrom:My("effective_from",{withTimezone:!0}).notNull(),effectiveUntil:My("effective_until",{withTimezone:!0}),confidence:Ly("confidence").notNull(),sourceObservationIds:Ex("source_observation_ids").array().notNull()},e=>[xx({columns:[e.provider,e.plan,e.limitType,e.effectiveFrom]}),Tx("idx_plan_limits_lookup").on(e.provider,e.plan,e.limitType,e.effectiveFrom.desc())])});import{pgTable as Rx,text as bp,timestamp as kx,uuid as qy,jsonb as Nx,index as jx}from"drizzle-orm/pg-core";var yn,Uy=V(()=>{"use strict";yn=Rx("alert_dispatches",{id:qy("id").primaryKey().defaultRandom(),userId:qy("user_id").notNull(),alertKey:bp("alert_key").notNull(),severity:bp("severity").notNull(),lastDispatchedAt:kx("last_dispatched_at",{withTimezone:!0}).notNull().defaultNow(),lastState:Nx("last_state").notNull(),channel:bp("channel").notNull()},e=>[jx("idx_alert_user_key").on(e.userId,e.alertKey,e.lastDispatchedAt.desc())])});import{boolean as Px,date as Dx,index as Sp,integer as Ox,jsonb as Cx,pgTable as Ap,text as Jn,timestamp as uo,uniqueIndex as Lx,uuid as Ys}from"drizzle-orm/pg-core";var Oe,St,At,Hy=V(()=>{"use strict";Oe=Ap("announcements",{id:Ys("id").primaryKey().defaultRandom(),version:Jn("version").notNull().unique(),releaseDate:Dx("release_date").notNull(),subject:Jn("subject").notNull(),htmlBody:Jn("html_body").notNull(),textBody:Jn("text_body").notNull(),sections:Cx("sections").notNull().default({}),status:Jn("status").notNull().default("draft"),recipientCount:Ox("recipient_count"),sentAt:uo("sent_at",{withTimezone:!0}),sentBy:Ys("sent_by"),error:Jn("error"),createdAt:uo("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:uo("updated_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Sp("idx_announcements_status").on(e.status),Sp("idx_announcements_created").on(e.createdAt)]),St=Ap("announcement_deliveries",{id:Ys("id").primaryKey().defaultRandom(),announcementId:Ys("announcement_id").notNull(),userId:Ys("user_id").notNull(),email:Jn("email").notNull(),status:Jn("status").notNull().default("pending"),providerId:Jn("provider_id"),error:Jn("error"),sentAt:uo("sent_at",{withTimezone:!0}),createdAt:uo("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Lx("uniq_announcement_deliveries_announcement_user").on(e.announcementId,e.userId),Sp("idx_announcement_deliveries_user").on(e.userId,e.createdAt)]),At=Ap("notification_preferences",{userId:Ys("user_id").primaryKey(),productAnnouncements:Px("product_announcements").notNull().default(!0),unsubscribeToken:Jn("unsubscribe_token").notNull().unique(),unsubscribedAt:uo("unsubscribed_at",{withTimezone:!0}),createdAt:uo("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:uo("updated_at",{withTimezone:!0}).notNull().defaultNow()})});import{pgTable as Mx,text as Ep,timestamp as By,uuid as xp,integer as $x,index as qx,unique as Ux}from"drizzle-orm/pg-core";var Fy,Wy=V(()=>{"use strict";Fy=Mx("scaffolding_fingerprints",{id:xp("id").primaryKey().defaultRandom(),userId:xp("user_id").notNull(),harness:Ep("harness").notNull(),model:Ep("model").notNull(),toolsHash:Ep("tools_hash").notNull(),firstSeenAt:By("first_seen_at",{withTimezone:!0}).notNull().defaultNow(),lastSeenAt:By("last_seen_at",{withTimezone:!0}).notNull().defaultNow(),snapshotCount:$x("snapshot_count").notNull().default(1),firstSessionId:xp("first_session_id")},e=>[Ux("scaffolding_fingerprints_user_id_harness_model_tools_hash_key").on(e.userId,e.harness,e.model,e.toolsHash),qx("idx_scaffolding_fp_segment").on(e.userId,e.harness,e.model)])});import{pgTable as Hx,text as Tp,timestamp as Bx,jsonb as Fx,uuid as zy,integer as Wx,unique as zx}from"drizzle-orm/pg-core";var Vy,Jy=V(()=>{"use strict";Vy=Hx("scaffolding_segments",{id:zy("id").primaryKey().defaultRandom(),userId:zy("user_id").notNull(),harness:Tp("harness").notNull(),model:Tp("model").notNull(),coreNames:Fx("core_names").notNull(),coreHash:Tp("core_hash").notNull(),activeFingerprints:Wx("active_fingerprints").notNull(),computedAt:Bx("computed_at",{withTimezone:!0}).notNull().defaultNow()},e=>[zx("scaffolding_segments_user_id_harness_model_key").on(e.userId,e.harness,e.model)])});var Rp=V(()=>{"use strict";Ht();Yo();d_();zn();m_();Pr();Fs();w_();I_();Km();E_();x_();ep();N_();Cu();sp();O_();$_();q_();B_();z_();J_();ja();G_();X_();Z_();ty();iy();cy();dy();my();gy();_y();vy();Ay();xy();Ry();ky();Oy();Cy();$y();Uy();Hy();Wy();Jy()});import{relations as Fe}from"drizzle-orm";var Vx,Jx,Kx,Gx,Yx,Xx,Qx,Zx,eT,tT,nT,rT,oT,sT,iT,aT,cT,uT,dT,lT,mT,pT,fT,gT,hT,_T,yT,wT,vT,IT,Ky=V(()=>{"use strict";Rp();Vx=Fe(T,({many:e})=>({sessions:e(y),contextSnapshots:e($),apiKeys:e(be)})),Jx=Fe(be,({one:e})=>({profile:e(T,{fields:[be.userId],references:[T.id]})})),Kx=Fe(K,({many:e})=>({teams:e(G),userOrganizations:e(Q),projects:e(M),invitations:e(ae)})),Gx=Fe(G,({one:e,many:t})=>({organization:e(K,{fields:[G.orgId],references:[K.id]}),userTeams:t(_e),invitations:t(ae)})),Yx=Fe(ae,({one:e})=>({organization:e(K,{fields:[ae.orgId],references:[K.id]}),team:e(G,{fields:[ae.teamId],references:[G.id]}),inviter:e(T,{fields:[ae.invitedBy],references:[T.id]})})),Xx=Fe(Q,({one:e})=>({organization:e(K,{fields:[Q.orgId],references:[K.id]})})),Qx=Fe(_e,({one:e})=>({team:e(G,{fields:[_e.teamId],references:[G.id]})})),Zx=Fe(g,({one:e,many:t})=>({versions:t(Se),projectInstructions:t(it),events:t(Pt),usageEvents:t(so),sessionInstructions:t(se),packInstructions:t(De),forkedFrom:e(g,{fields:[g.forkedFromId],references:[g.id]})})),eT=Fe(Pt,({one:e})=>({instruction:e(g,{fields:[Pt.instructionId],references:[g.id]})})),tT=Fe(F,({one:e,many:t})=>({project:e(M,{fields:[F.projectId],references:[M.id]}),parent:e(F,{fields:[F.parentId],references:[F.id]}),versions:t(F)})),nT=Fe(Se,({one:e})=>({instruction:e(g,{fields:[Se.instructionId],references:[g.id]})})),rT=Fe(M,({one:e,many:t})=>({organization:e(K,{fields:[M.orgId],references:[K.id]}),projectInstructions:t(it),sessions:t(y)})),oT=Fe(it,({one:e})=>({project:e(M,{fields:[it.projectId],references:[M.id]}),instruction:e(g,{fields:[it.instructionId],references:[g.id]})})),sT=Fe(y,({one:e,many:t})=>({profile:e(T,{fields:[y.userId],references:[T.id]}),project:e(M,{fields:[y.projectId],references:[M.id]}),run:e(X,{fields:[y.runId],references:[X.id]}),events:t($e),sessionInstructions:t(se),treatmentExposures:t(Z),contextSnapshots:t($)})),iT=Fe(X,({one:e,many:t})=>({profile:e(T,{fields:[X.userId],references:[T.id]}),organization:e(K,{fields:[X.orgId],references:[K.id]}),project:e(M,{fields:[X.projectId],references:[M.id]}),sessions:t(y),launchJobs:t(ce)})),aT=Fe(ce,({one:e})=>({run:e(X,{fields:[ce.runId],references:[X.id]})})),cT=Fe($e,({one:e})=>({session:e(y,{fields:[$e.sessionId],references:[y.id]})})),uT=Fe(se,({one:e})=>({session:e(y,{fields:[se.sessionId],references:[y.id]}),instruction:e(g,{fields:[se.instructionId],references:[g.id]})})),dT=Fe(kt,({one:e,many:t})=>({owner:e(T,{fields:[kt.userId],references:[T.id]}),project:e(M,{fields:[kt.projectId],references:[M.id]}),exposures:t(Z)})),lT=Fe(Z,({one:e})=>({session:e(y,{fields:[Z.sessionId],references:[y.id]}),owner:e(T,{fields:[Z.userId],references:[T.id]}),assignment:e(kt,{fields:[Z.assignmentId],references:[kt.id]})})),mT=Fe(Le,({one:e,many:t})=>({packInstructions:t(De),forkedFrom:e(Le,{fields:[Le.forkedFromId],references:[Le.id]})})),pT=Fe(De,({one:e})=>({pack:e(Le,{fields:[De.packId],references:[Le.id]}),instruction:e(g,{fields:[De.instructionId],references:[g.id]})})),fT=Fe(so,({one:e})=>({instruction:e(g,{fields:[so.instructionId],references:[g.id]})})),gT=Fe(k,({one:e,many:t})=>({parent:e(k,{fields:[k.parentId],references:[k.id]}),evals:t(Ie),evalRuns:t(ve),benchmarks:t(Vn),evalJobs:t(Re),evalConversations:t(Me)})),hT=Fe(Ie,({one:e,many:t})=>({evalTarget:e(k,{fields:[Ie.evalTargetId],references:[k.id]}),runs:t(ve)})),_T=Fe(ve,({one:e})=>({eval:e(Ie,{fields:[ve.evalId],references:[Ie.id]}),evalTarget:e(k,{fields:[ve.evalTargetId],references:[k.id]})})),yT=Fe(Vn,({one:e})=>({evalTarget:e(k,{fields:[Vn.evalTargetId],references:[k.id]})})),wT=Fe(Re,({one:e})=>({evalTarget:e(k,{fields:[Re.evalTargetId],references:[k.id]})})),vT=Fe(Me,({one:e})=>({evalTarget:e(k,{fields:[Me.evalTargetId],references:[k.id]})})),IT=Fe($,({one:e})=>({session:e(y,{fields:[$.sessionId],references:[y.id]}),profile:e(T,{fields:[$.userId],references:[T.id]})}))});var ud={};to(ud,{SUGGESTION_KINDS:()=>id,agentJobs:()=>ke,agentRuns:()=>X,agentRunsRelations:()=>iT,alertDispatches:()=>yn,announcementDeliveries:()=>St,announcements:()=>Oe,apiKeys:()=>be,apiKeysRelations:()=>Jx,benchmarks:()=>Vn,benchmarksRelations:()=>yT,cliErrorEvents:()=>Yu,cliSetupEvents:()=>Gu,contentBlobs:()=>_n,contextSnapshots:()=>$,contextSnapshotsRelations:()=>IT,evalComparisons:()=>Xe,evalConversations:()=>Me,evalConversationsRelations:()=>vT,evalGradeAnnotations:()=>Ve,evalJobs:()=>Re,evalJobsRelations:()=>wT,evalRuns:()=>ve,evalRunsRelations:()=>_T,evalTargets:()=>k,evalTargetsRelations:()=>gT,evals:()=>Ie,evalsRelations:()=>hT,extensionAuthCodes:()=>Rn,harnessReleases:()=>jt,insightRecommendationLog:()=>Ae,insightsJobs:()=>W,instructionEvents:()=>Pt,instructionEventsRelations:()=>eT,instructionExperimentArms:()=>Or,instructionExperiments:()=>U,instructionPromotions:()=>ie,instructionSuggestionEvents:()=>Je,instructionSuggestions:()=>x,instructionUsageEvents:()=>so,instructionUsageEventsRelations:()=>fT,instructionVerdicts:()=>Y,instructionVersionIdentities:()=>sr,instructionVersions:()=>Se,instructionVersionsRelations:()=>nT,instructions:()=>g,instructionsRelations:()=>Zx,judgeReviewerVerdicts:()=>le,launchJobs:()=>ce,launchJobsRelations:()=>aT,limitObservations:()=>ye,memories:()=>F,memoriesRelations:()=>tT,memoryExperiments:()=>Nt,modelPricing:()=>Qe,notificationPreferences:()=>At,notifications:()=>bt,orgInvitations:()=>ae,orgInvitationsRelations:()=>Yx,organizations:()=>K,organizationsRelations:()=>Kx,packInstructions:()=>De,packInstructionsRelations:()=>pT,packs:()=>Le,packsRelations:()=>mT,pendingTreatmentExposures:()=>qu,planLimitsActive:()=>Ke,profiles:()=>T,profilesRelations:()=>Vx,projectCheckouts:()=>de,projectInstructions:()=>it,projectInstructionsRelations:()=>oT,projects:()=>M,projectsRelations:()=>rT,providerDocsSnapshots:()=>xt,scaffoldingFingerprints:()=>Fy,scaffoldingSegments:()=>Vy,sessionEvents:()=>$e,sessionEventsRelations:()=>cT,sessionInstructions:()=>se,sessionInstructionsRelations:()=>uT,sessionSendJobs:()=>zu,sessionTerminalTargets:()=>ze,sessions:()=>y,sessionsRelations:()=>sT,skillSubmissions:()=>ao,teams:()=>G,teamsRelations:()=>Gx,treatmentAssignments:()=>kt,treatmentAssignmentsRelations:()=>dT,treatmentExposures:()=>Z,treatmentExposuresRelations:()=>lT,userOrganizations:()=>Q,userOrganizationsRelations:()=>Xx,userTeams:()=>_e,userTeamsRelations:()=>Qx,workerConnections:()=>pe});var dd=V(()=>{"use strict";Rp();Ky()});function Pp(){ss++,ss>kp&&(kp=ss)}function Dp(){ss>0&&ss--}function Op(){Xs++,Xs>Np&&(Np=Xs)}function Cp(){Xs>0&&Xs--}function Va(){return ss}function Lp(){Gy++}function Ja(){Yy++}function Xy(){jp++}function Mp(){let e=jp;return jp=0,e}function $p(){return{current:ss,peak:kp,heavyCurrent:Xs,heavyPeak:Np,shedCount:Gy,ingestShedCount:Yy}}function Qs(){let e=Number(process.env.PG_INFLIGHT_MAX);return Number.isFinite(e)&&e>0?e:(Number(process.env.PG_POOL_MAX)||3)*4}function Ka(){let e=Qs(),t=Number(process.env.PG_INGEST_INFLIGHT_MAX);if(Number.isFinite(t)&&t>0)return Math.min(t,e);let n=Number(process.env.PG_POOL_MAX)||3;return Math.min(e,Math.max(n,Math.floor(e/2)))}var ss,kp,Xs,Np,Gy,Yy,jp,qp=V(()=>{"use strict";ss=0,kp=0,Xs=0,Np=0,Gy=0,Yy=0,jp=0;u(Pp,"trackDbOpStart");u(Dp,"trackDbOpEnd");u(Op,"trackHeavyDbOpStart");u(Cp,"trackHeavyDbOpEnd");u(Va,"getDbLoad");u(Lp,"recordDbShed");u(Ja,"recordIngestShed");u(Xy,"recordQueryDeadline");u(Mp,"consumeDeadlineCount");u($p,"getDbLoadStats");u(Qs,"dbInflightMax");u(Ka,"dbIngestInflightMax")});import{drizzle as Qy}from"drizzle-orm/postgres-js";import Up from"postgres";function Hp(e){let t=process.env[e];if(!t)throw new Error(`Missing required env var: ${e}`);return t}function Zy(){if(Xa)throw new Error("getDb() called after closeDb(): the connection pool is closed for shutdown. Stop issuing queries (timers/requests) before draining the pool.");if(!Ya){let e=process.env.PG_APPLICATION_NAME||"rulemetric",t=Number(process.env.PG_POOL_MAX)||3,n=Number(process.env.PG_CONNECT_TIMEOUT_S)||10,r=Number(process.env.PG_STATEMENT_TIMEOUT_MS)||0,o=Number(process.env.PG_IDLE_TIMEOUT)||5,s=Number(process.env.PG_KEEP_ALIVE_S)||60;ei=Up(Hp("DATABASE_URL"),{prepare:!1,max:t,connect_timeout:n,idle_timeout:o,keep_alive:s,max_lifetime:300,connection:{application_name:e,...r>0?{statement_timeout:r}:{}}}),Ya=Qy(ei,{schema:ud})}return Ya}function ew(){if(Xa)throw new Error("getHeavyDb() called after closeDb(): the connection pool is closed for shutdown. Stop issuing queries (timers/requests) before draining the pool.");if(!md){let e=(process.env.PG_APPLICATION_NAME||"rulemetric")+":heavy",t=Number(process.env.PG_HEAVY_POOL_MAX)||2;pd=Up(Hp("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}}),md=Qy(pd,{schema:ud})}return md}async function Qa(){if(ld)return ld;Xa=!0;let e=ei,t=Zs,n=pd;return ei=void 0,Ya=void 0,Zs=void 0,pd=void 0,md=void 0,ld=Promise.allSettled([e?e.end({timeout:5}):Promise.resolve(),t?t.end({timeout:5}):Promise.resolve(),n?n.end({timeout:5}):Promise.resolve()]).then(()=>{}),ld}function Bp(){if(Xa)return Promise.resolve();if(Ga)return Ga;let e=ei;return ei=void 0,Ya=void 0,Ga=(async()=>{e&&await e.end({timeout:5}).catch(()=>{})})().finally(()=>{Ga=void 0}),Ga}async function Fp(e){let t=Date.now();if(Xa)return{ok:!1,ms:0,err:new Error("pool closed for shutdown")};let n=Zs;try{return n||(n=Up(Hp("DATABASE_URL"),{prepare:!1,max:1,connect_timeout:Number(process.env.PG_CONNECT_TIMEOUT_S)||10,idle_timeout:20,max_lifetime:300,connection:{application_name:(process.env.PG_APPLICATION_NAME||"rulemetric")+":probe",statement_timeout:Math.max(2e3,e-2e3)}}),Zs=n),await Promise.race([n`SELECT 1`,new Promise((r,o)=>setTimeout(()=>o(new Error("db probe timeout")),e))]),{ok:!0,ms:Date.now()-t}}catch(r){return Zs===n&&(Zs=void 0),n?.end({timeout:1}).catch(()=>{}),{ok:!1,ms:Date.now()-t,err:r}}}function Za(e){let t=e?.message;return typeof t=="string"&&t.includes(bT)}function ti(e){let t=e,n=t?.code??t?.cause?.code??t?.errno;return n!==void 0&&ST.has(n)}function gd(e){let t=e,n=t?.code??t?.cause?.code??t?.errno;return n!==void 0&&AT.has(n)}async function tw(e,t={}){let n=t.attempts??3,r=t.baseMs??100,o;for(let s=0;s<n;s++)try{return await e()}catch(i){o=i;let c=ti(i)||t.retryResets===!0&&gd(i);if(s===n-1||!c)throw i;await new Promise(a=>setTimeout(a,r*2**s))}throw o}function ec(e){return e?.code==="QUERY_DEADLINE"}function nw(){let e=Number(process.env.PG_QUERY_DEADLINE_MS);return Number.isFinite(e)&&e>=0?e:2e4}function rw(){let e=Number(process.env.PG_HEAVY_QUERY_DEADLINE_MS);return Number.isFinite(e)&&e>=0?e:6e4}function ET(e,t,n=!0){let r,o=new Promise((s,i)=>{r=setTimeout(()=>{n&&Xy(),i(new fd(t))},t);let c=r;typeof c.unref=="function"&&c.unref()});return Promise.race([e,o]).finally(()=>clearTimeout(r))}function Wp(e,t=!1,n=0,r=!1){return e===null||typeof e!="object"&&typeof e!="function"?e:new Proxy(e,{get(o,s,i){if(s==="then"){let a=Reflect.get(o,s,i);return typeof a!="function"?a:(l,m)=>{let p=r?Op:Pp,_=r?Cp:Dp;p();let I=tw(()=>new Promise((f,w)=>a.call(o,f,w)),{retryResets:t});return(n>0?ET(I,n,!r):I).finally(_).then(l,m)}}let c=Reflect.get(o,s,i);return typeof c=="function"?(...a)=>Wp(c.apply(o,a),t,n,r):c}})}function iw(e,t=!1){let n=t?Op:Pp,r=t?Cp:Dp;n();try{return Promise.resolve(e()).finally(r)}catch(o){throw r(),o}}var Ya,ei,Xa,ld,Ga,Zs,pd,md,bT,ST,AT,fd,ow,sw,d,tt,zp=V(()=>{"use strict";dd();qp();Xa=!1;u(Hp,"getEnv");u(Zy,"getDb");u(ew,"getHeavyDb");u(Qa,"closeDb");u(Bp,"recyclePool");u(Fp,"probeDbReachable");bT="called after closeDb()";u(Za,"isPoolClosedError");ST=new Set(["CONNECT_TIMEOUT","ETIMEDOUT","ENOTFOUND","ECONNREFUSED","EAI_AGAIN"]);u(ti,"isRetryableConnectError");AT=new Set(["CONNECTION_CLOSED","ECONNRESET","EPIPE"]);u(gd,"isRetryableResetError");u(tw,"withDbRetry");fd=class extends Error{static{u(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"}};u(ec,"isQueryDeadlineError");u(nw,"queryDeadlineMs");u(rw,"heavyQueryDeadlineMs");u(ET,"raceWithDeadline");ow=new Set(["select","selectDistinct","selectDistinctOn","insert","update","delete","execute","with","$count","refreshMaterializedView"]),sw=new Set(["select","selectDistinct","selectDistinctOn","$count"]);u(Wp,"wrapBuilder");u(iw,"gaugeTransaction");d=new Proxy({},{get(e,t){let n=Zy(),r=n[t];if(typeof t=="string"&&ow.has(t)&&typeof r=="function"){let o=sw.has(t),s=nw();return(...i)=>Wp(r.apply(n,i),o,s)}return t==="transaction"&&typeof r=="function"?(...o)=>iw(()=>r.apply(n,o)):r}}),tt=new Proxy({},{get(e,t){let n=ew(),r=n[t];if(typeof t=="string"&&ow.has(t)&&typeof r=="function"){let o=sw.has(t);return(...s)=>Wp(r.apply(n,s),o,rw(),!0)}return t==="transaction"&&typeof r=="function"?(...o)=>iw(()=>r.apply(n,o),!0):r}})});async function en(e){let[t]=await d.insert(bt).values({userId:e.userId,type:e.type,title:e.title,body:e.body??null,url:e.url??null,sourceTable:e.sourceTable??null,sourceId:e.sourceId??null,metadata:e.metadata??{}}).onConflictDoNothing({target:[bt.userId,bt.sourceTable,bt.sourceId]}).returning();return t??null}var aw=V(()=>{"use strict";zp();dd();u(en,"notifyUser")});var C=V(()=>{"use strict";dd();zp();qp();aw()});function Yw(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Bd(e,t){let n=(e??"").trim();if(!n)return null;if(!n.includes("Contents of "))return n;if(t){let o=n.match(new RegExp(`Contents of [^\\n]*${Yw(t)}[^\\n]*\\n([\\s\\S]*?)(?=\\nContents of |$)`,"i"))?.[1]?.trim();if(o)return o;let s=t.split("/").pop();if(s&&s!==t){let c=n.match(new RegExp(`Contents of [^\\n]*${Yw(s)}[^\\n]*\\n([\\s\\S]*?)(?=\\nContents of |$)`,"i"))?.[1]?.trim();if(c)return c}}return null}var Tf=V(()=>{"use strict";u(Yw,"escapeRegExp");u(Bd,"extractInstructionSection")});var ev={};to(ev,{GRADUATION_MIN_N:()=>vc,decideGraduation:()=>Qw,graduatedRulesForRender:()=>Rf,instructionContentHash:()=>qr,maybeGraduate:()=>Zw,settleExperiment:()=>fi,verdictRowsForExperiments:()=>Wd});import{createHash as mk}from"node:crypto";import{and as Fd,eq as Yn,inArray as pk,sql as Xw}from"drizzle-orm";function Qw(e){return e.resolution!=="resolved"||e.randomisationSuspect||e.contentChanged||e.delta===null||e.ci===null||e.measured.treated<vc||e.measured.control<vc?null:e.delta>0?"always":"never"}function qr(e,t){let n=Bd(e,t);return n?mk("sha256").update(n).digest("hex"):null}async function Zw(e){let{experimentId:t,userId:n,verdict:r}=e,o=Qw(r);if(o===null)return null;let[s]=await d.select({id:U.id,instructionId:U.instructionId,projectPath:U.projectPath,status:U.status}).from(U).where(Fd(Yn(U.id,t),Yn(U.userId,n)));if(!s||s.status!=="running")return null;let[i]=await d.select({content:g.content,name:g.name}).from(g).where(Yn(g.id,s.instructionId)),c=qr(i?.content,i?.name);if(!c)return null;let l=(await d.execute(Xw`
2
2
  SELECT array_agg(DISTINCT s.model) FILTER (WHERE s.model IS NOT NULL) AS models,
3
3
  array_agg(DISTINCT s.harness_version) FILTER (WHERE s.harness_version IS NOT NULL) AS harness_versions,
4
4
  min(s.started_at)::text AS from_at,
@@ -9,7 +9,7 @@ var o_=Object.defineProperty;var d=(e,t)=>o_(e,"name",{value:t,configurable:!0})
9
9
  AND s.user_id = a.user_id
10
10
  WHERE a.experiment_id = ${t}
11
11
  AND s.analysis->>'outcome' IS NOT NULL
12
- `))[0];return await u.insert(Y).values({userId:n,instructionId:s.instructionId,contentHash:a,projectPath:s.projectPath,segment:{models:l?.models??[],harnessVersions:l?.harness_versions??[],window:{from:l?.from_at??null,to:l?.to_at??null}},decision:o,delta:String(r.delta),ciLower:String(r.ci.lower),ciUpper:String(r.ci.upper),nTreated:r.measured.treated,nControl:r.measured.control,experimentId:t}).onConflictDoNothing(),await u.update(q).set({status:"stopped",stoppedReason:"graduated"}).where(Gn(q.id,t)),o}async function gi(e){let{experimentId:t,userId:n,verdict:r,source:o,status:s}=e;return s!=="running"?null:r.contentChanged?(await u.update(q).set({status:"stopped",stoppedReason:"content_changed"}).where(Wu(Gn(q.id,t),Gn(q.userId,n))),"content_changed"):await pI({experimentId:t,userId:n,verdict:r})?"graduated":o==="trial"&&r.resolution==="inconclusive"&&!r.randomisationSuspect&&r.measured.treated>=Ic&&r.measured.control>=Ic?(await u.update(q).set({status:"stopped",stoppedReason:"trial_neutral"}).where(Wu(Gn(q.id,t),Gn(q.userId,n))),await u.execute(uI`
12
+ `))[0];return await d.insert(Y).values({userId:n,instructionId:s.instructionId,contentHash:c,projectPath:s.projectPath,segment:{models:l?.models??[],harnessVersions:l?.harness_versions??[],window:{from:l?.from_at??null,to:l?.to_at??null}},decision:o,delta:String(r.delta),ciLower:String(r.ci.lower),ciUpper:String(r.ci.upper),nTreated:r.measured.treated,nControl:r.measured.control,experimentId:t}).onConflictDoNothing(),await d.update(U).set({status:"stopped",stoppedReason:"graduated"}).where(Yn(U.id,t)),o}async function fi(e){let{experimentId:t,userId:n,verdict:r,source:o,status:s}=e;return s!=="running"?null:r.contentChanged?(await d.update(U).set({status:"stopped",stoppedReason:"content_changed"}).where(Fd(Yn(U.id,t),Yn(U.userId,n))),"content_changed"):await Zw({experimentId:t,userId:n,verdict:r})?"graduated":o==="trial"&&r.resolution==="inconclusive"&&!r.randomisationSuspect&&r.measured.treated>=vc&&r.measured.control>=vc?(await d.update(U).set({status:"stopped",stoppedReason:"trial_neutral"}).where(Fd(Yn(U.id,t),Yn(U.userId,n))),await d.execute(Xw`
13
13
  UPDATE instruction_suggestions
14
14
  SET declined_at = now(), declined_reason = 'trial_neutral'
15
15
  WHERE user_id = ${n}
@@ -17,19 +17,19 @@ var o_=Object.defineProperty;var d=(e,t)=>o_(e,"name",{value:t,configurable:!0})
17
17
  AND project_path = ${r.projectPath}
18
18
  AND accepted_at IS NULL
19
19
  AND declined_at IS NULL
20
- `),"trial_neutral"):null}async function Pf(e,t){return(await u.select({instructionId:Y.instructionId,contentHash:Y.contentHash,decision:Y.decision,content:g.content,name:g.name}).from(Y).innerJoin(g,Gn(Y.instructionId,g.id)).where(Wu(Gn(Y.userId,e),Gn(Y.projectPath,t)))).flatMap(r=>{let o=Ur(r.content,r.name);return o===null||o!==r.contentHash?[]:[{instructionId:r.instructionId,decision:r.decision}]})}async function zu(e){if(e.length===0)return new Map;let t=await u.select({experimentId:Y.experimentId,decision:Y.decision,decidedAt:Y.decidedAt,contentHash:Y.contentHash}).from(Y).where(dN(Y.experimentId,e));return new Map(t.filter(n=>n.experimentId!==null).map(n=>[n.experimentId,{decision:n.decision,decidedAt:n.decidedAt,contentHash:n.contentHash}]))}var Ic,ls=J(()=>{"use strict";O();Nf();Ic=25;d(lI,"decideGraduation");d(Ur,"instructionContentHash");d(pI,"maybeGraduate");d(gi,"settleExperiment");d(Pf,"graduatedRulesForRender");d(zu,"verdictRowsForExperiments")});var yP,wP,KI=J(()=>{"use strict";yP=["claude_code","cursor","vscode_copilot","copilot_agent","rulemetric_mcp","codex","pi","opencode","antigravity"],wP=["user_message","assistant_message","tool_call","tool_result","thinking","error"]});var Ti,Jf=J(()=>{"use strict";Ti=class{static{d(this,"ClaudeCodeAdapter")}tool="claude_code";parse(t){let n=t.split(`
21
- `).filter(h=>h.trim()),r=[];for(let h of n)try{r.push(JSON.parse(h))}catch{}let o=r.filter(h=>h.type==="user"||h.type==="assistant"),s=null,i=null,a={},c=r.find(h=>h.type==="user");c&&(s=c.cwd??null,i=c.gitBranch??null,c.version&&(a.claudeCodeVersion=c.version),c.sessionId&&(a.sessionId=c.sessionId));let l=r.find(h=>h.type==="assistant");l?.message?.model&&(a.model=l.message.model);let p=[],m=0;for(let h of o){let f=h.timestamp??new Date().toISOString();if(h.type==="user"){let w=h.message?.content;if(typeof w=="string")p.push({sequence:m++,eventType:"user_message",content:w,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:f,metadata:{}});else if(Array.isArray(w))for(let b of w)b.type==="tool_result"&&p.push({sequence:m++,eventType:"tool_result",content:typeof b.content=="string"?b.content:JSON.stringify(b.content),toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:f,metadata:{toolUseId:b.tool_use_id}})}else if(h.type==="assistant"){let w=Array.isArray(h.message?.content)?h.message.content:[],b=h.message?.usage,I=b?{input:b.input_tokens??0,output:b.output_tokens??0,cacheRead:b.cache_read_input_tokens??0,cacheWrite:b.cache_creation_input_tokens??0}:null,S={};h.message?.model&&(S.model=h.message.model),h.message?.stop_reason&&(S.stopReason=h.message.stop_reason),h.requestId&&(S.requestId=h.requestId),b?.service_tier&&(S.serviceTier=b.service_tier),b?.speed&&(S.speed=b.speed),b?.cache_creation&&(S.cacheCreationDetail=b.cache_creation),b?.server_tool_use&&(S.serverToolUse=b.server_tool_use);for(let A of w)A.type==="text"?p.push({sequence:m++,eventType:"assistant_message",content:A.text??"",toolName:null,toolInput:null,toolOutput:null,tokenUsage:I,timestamp:f,metadata:S}):A.type==="thinking"?p.push({sequence:m++,eventType:"thinking",content:A.thinking??"",toolName:null,toolInput:null,toolOutput:null,tokenUsage:I,timestamp:f,metadata:S}):A.type==="tool_use"&&p.push({sequence:m++,eventType:"tool_call",content:null,toolName:A.name??"unknown",toolInput:A.input??null,toolOutput:null,tokenUsage:I,timestamp:f,metadata:{...S,toolUseId:A.id}})}}let y=p.map(h=>h.timestamp).sort(),v=new Date().toISOString();return{tool:"claude_code",projectPath:s,gitBranch:i,startedAt:y[0]??v,endedAt:y[y.length-1]??null,events:p,metadata:a}}}});var Ri,Gf=J(()=>{"use strict";Ri=class{static{d(this,"CursorAdapter")}tool="cursor";parse(t){let n=kp("better-sqlite3"),r=new n(t,{readonly:!0});try{let o=r.prepare("SELECT value FROM ItemTable WHERE key = 'composer.composerData'").get();return o?this.parseComposerJson(o.value):this.emptySession()}finally{r.close()}}parseComposerJson(t){let n;try{n=JSON.parse(t)}catch{return this.emptySession()}let r=Object.values(n.allComposers??{});if(r.length===0)return this.emptySession();let o=r.sort((l,p)=>{let m=l.createdAt?new Date(l.createdAt).getTime():0;return(p.createdAt?new Date(p.createdAt).getTime():0)-m})[0],s=o.conversation??[],i=[];for(let l=0;l<s.length;l++){let p=s[l],m=p.createdAt??new Date().toISOString();i.push({sequence:l,eventType:p.type===1?"user_message":"assistant_message",content:p.text,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:m,metadata:{}})}let a=i.map(l=>l.timestamp).sort(),c=new Date().toISOString();return{tool:"cursor",projectPath:null,gitBranch:null,startedAt:a[0]??c,endedAt:a[a.length-1]??null,events:i,metadata:{composerId:o.composerId}}}emptySession(){return{tool:"cursor",projectPath:null,gitBranch:null,startedAt:new Date().toISOString(),endedAt:null,events:[],metadata:{}}}}});var ki,Kf=J(()=>{"use strict";ki=class{static{d(this,"VSCodeCopilotAdapter")}tool="vscode_copilot";parse(t){let n;try{n=JSON.parse(t)}catch{return this.emptySession()}let r=n.requests??[],o=[],s=0;for(let c of r){let l=c.timestamp?new Date(c.timestamp).toISOString():new Date().toISOString();if(o.push({sequence:s++,eventType:"user_message",content:c.message,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:l,metadata:{}}),c.response){let p=c.response.timestamp?new Date(c.response.timestamp).toISOString():l;o.push({sequence:s++,eventType:"assistant_message",content:c.response.message,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:p,metadata:{}})}}let i=o.map(c=>c.timestamp).sort(),a=new Date().toISOString();return{tool:"vscode_copilot",projectPath:null,gitBranch:null,startedAt:i[0]??a,endedAt:i[i.length-1]??null,events:o,metadata:{...n.requesterUsername&&{username:n.requesterUsername},...n.customTitle&&{title:n.customTitle}}}}emptySession(){return{tool:"vscode_copilot",projectPath:null,gitBranch:null,startedAt:new Date().toISOString(),endedAt:null,events:[],metadata:{}}}}});var ji,Yf=J(()=>{"use strict";ji=class{static{d(this,"CopilotAgentAdapter")}tool="copilot_agent";parse(t){let n;try{n=JSON.parse(t)}catch{return this.emptySession()}let r=n.requests??[],o=[],s=0;for(let c of r){let l=c.timestamp?new Date(c.timestamp).toISOString():new Date().toISOString();if(o.push({sequence:s++,eventType:"user_message",content:c.message,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:l,metadata:{}}),c.toolCalls)for(let p of c.toolCalls){let m=p.timestamp?new Date(p.timestamp).toISOString():l;o.push({sequence:s++,eventType:"tool_call",content:null,toolName:p.name??"unknown",toolInput:p.input??null,toolOutput:p.output??null,tokenUsage:null,timestamp:m,metadata:{}})}if(c.response){let p=c.response.timestamp?new Date(c.response.timestamp).toISOString():l;o.push({sequence:s++,eventType:"assistant_message",content:c.response.message,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:p,metadata:{}})}}let i=o.map(c=>c.timestamp).sort(),a=new Date().toISOString();return{tool:"copilot_agent",projectPath:null,gitBranch:null,startedAt:i[0]??a,endedAt:i[i.length-1]??null,events:o,metadata:{...n.requesterUsername&&{username:n.requesterUsername},...n.customTitle&&{title:n.customTitle},...n.agentMode!=null&&{agentMode:n.agentMode}}}}emptySession(){return{tool:"copilot_agent",projectPath:null,gitBranch:null,startedAt:new Date().toISOString(),endedAt:null,events:[],metadata:{}}}}});var Ni,Xf=J(()=>{"use strict";Ni=class{static{d(this,"RuleMetricMcpAdapter")}tool="rulemetric_mcp";parse(t){let n;try{n=JSON.parse(t)}catch{return this.emptySession()}let o=(n.events??[]).map((i,a)=>({sequence:i.sequence??a,eventType:this.normalizeEventType(i.eventType),content:i.content??null,toolName:i.toolName??null,toolInput:i.toolInput??null,toolOutput:i.toolOutput??null,tokenUsage:i.tokenUsage??null,timestamp:i.timestamp??new Date().toISOString(),metadata:i.metadata??{}})),s=new Date().toISOString();return{tool:"rulemetric_mcp",projectPath:n.projectPath??null,gitBranch:n.gitBranch??null,startedAt:n.startedAt??o[0]?.timestamp??s,endedAt:n.endedAt??o[o.length-1]?.timestamp??null,events:o,metadata:n.metadata??{}}}normalizeEventType(t){return t&&["user_message","assistant_message","tool_call","tool_result","thinking","error"].includes(t)?t:"assistant_message"}emptySession(){return{tool:"rulemetric_mcp",projectPath:null,gitBranch:null,startedAt:new Date().toISOString(),endedAt:null,events:[],metadata:{}}}}});function vP(e){try{return JSON.parse(e)}catch{return e}}function YI(e,t){return Array.isArray(e)?e.filter(n=>n.type&&t.includes(n.type)).map(n=>n.text??"").filter(Boolean).join(`
20
+ `),"trial_neutral"):null}async function Rf(e,t){return(await d.select({instructionId:Y.instructionId,contentHash:Y.contentHash,decision:Y.decision,content:g.content,name:g.name}).from(Y).innerJoin(g,Yn(Y.instructionId,g.id)).where(Fd(Yn(Y.userId,e),Yn(Y.projectPath,t)))).flatMap(r=>{let o=qr(r.content,r.name);return o===null||o!==r.contentHash?[]:[{instructionId:r.instructionId,decision:r.decision}]})}async function Wd(e){if(e.length===0)return new Map;let t=await d.select({experimentId:Y.experimentId,decision:Y.decision,decidedAt:Y.decidedAt,contentHash:Y.contentHash}).from(Y).where(pk(Y.experimentId,e));return new Map(t.filter(n=>n.experimentId!==null).map(n=>[n.experimentId,{decision:n.decision,decidedAt:n.decidedAt,contentHash:n.contentHash}]))}var vc,ds=V(()=>{"use strict";C();Tf();vc=25;u(Qw,"decideGraduation");u(qr,"instructionContentHash");u(Zw,"maybeGraduate");u(fi,"settleExperiment");u(Rf,"graduatedRulesForRender");u(Wd,"verdictRowsForExperiments")});var AN,EN,Mv=V(()=>{"use strict";AN=["claude_code","cursor","vscode_copilot","copilot_agent","rulemetric_mcp","codex","pi","opencode","antigravity"],EN=["user_message","assistant_message","tool_call","tool_result","thinking","error"]});var xi,Wf=V(()=>{"use strict";xi=class{static{u(this,"ClaudeCodeAdapter")}tool="claude_code";parse(t){let n=t.split(`
21
+ `).filter(h=>h.trim()),r=[];for(let h of n)try{r.push(JSON.parse(h))}catch{}let o=r.filter(h=>h.type==="user"||h.type==="assistant"),s=null,i=null,c={},a=r.find(h=>h.type==="user");a&&(s=a.cwd??null,i=a.gitBranch??null,a.version&&(c.claudeCodeVersion=a.version),a.sessionId&&(c.sessionId=a.sessionId));let l=r.find(h=>h.type==="assistant");l?.message?.model&&(c.model=l.message.model);let m=[],p=0;for(let h of o){let f=h.timestamp??new Date().toISOString();if(h.type==="user"){let w=h.message?.content;if(typeof w=="string")m.push({sequence:p++,eventType:"user_message",content:w,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:f,metadata:{}});else if(Array.isArray(w))for(let b of w)b.type==="tool_result"&&m.push({sequence:p++,eventType:"tool_result",content:typeof b.content=="string"?b.content:JSON.stringify(b.content),toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:f,metadata:{toolUseId:b.tool_use_id}})}else if(h.type==="assistant"){let w=Array.isArray(h.message?.content)?h.message.content:[],b=h.message?.usage,v=b?{input:b.input_tokens??0,output:b.output_tokens??0,cacheRead:b.cache_read_input_tokens??0,cacheWrite:b.cache_creation_input_tokens??0}:null,S={};h.message?.model&&(S.model=h.message.model),h.message?.stop_reason&&(S.stopReason=h.message.stop_reason),h.requestId&&(S.requestId=h.requestId),b?.service_tier&&(S.serviceTier=b.service_tier),b?.speed&&(S.speed=b.speed),b?.cache_creation&&(S.cacheCreationDetail=b.cache_creation),b?.server_tool_use&&(S.serverToolUse=b.server_tool_use);for(let A of w)A.type==="text"?m.push({sequence:p++,eventType:"assistant_message",content:A.text??"",toolName:null,toolInput:null,toolOutput:null,tokenUsage:v,timestamp:f,metadata:S}):A.type==="thinking"?m.push({sequence:p++,eventType:"thinking",content:A.thinking??"",toolName:null,toolInput:null,toolOutput:null,tokenUsage:v,timestamp:f,metadata:S}):A.type==="tool_use"&&m.push({sequence:p++,eventType:"tool_call",content:null,toolName:A.name??"unknown",toolInput:A.input??null,toolOutput:null,tokenUsage:v,timestamp:f,metadata:{...S,toolUseId:A.id}})}}let _=m.map(h=>h.timestamp).sort(),I=new Date().toISOString();return{tool:"claude_code",projectPath:s,gitBranch:i,startedAt:_[0]??I,endedAt:_[_.length-1]??null,events:m,metadata:c}}}});var Ti,zf=V(()=>{"use strict";Ti=class{static{u(this,"CursorAdapter")}tool="cursor";parse(t){let n=Rm("better-sqlite3"),r=new n(t,{readonly:!0});try{let o=r.prepare("SELECT value FROM ItemTable WHERE key = 'composer.composerData'").get();return o?this.parseComposerJson(o.value):this.emptySession()}finally{r.close()}}parseComposerJson(t){let n;try{n=JSON.parse(t)}catch{return this.emptySession()}let r=Object.values(n.allComposers??{});if(r.length===0)return this.emptySession();let o=r.sort((l,m)=>{let p=l.createdAt?new Date(l.createdAt).getTime():0;return(m.createdAt?new Date(m.createdAt).getTime():0)-p})[0],s=o.conversation??[],i=[];for(let l=0;l<s.length;l++){let m=s[l],p=m.createdAt??new Date().toISOString();i.push({sequence:l,eventType:m.type===1?"user_message":"assistant_message",content:m.text,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:p,metadata:{}})}let c=i.map(l=>l.timestamp).sort(),a=new Date().toISOString();return{tool:"cursor",projectPath:null,gitBranch:null,startedAt:c[0]??a,endedAt:c[c.length-1]??null,events:i,metadata:{composerId:o.composerId}}}emptySession(){return{tool:"cursor",projectPath:null,gitBranch:null,startedAt:new Date().toISOString(),endedAt:null,events:[],metadata:{}}}}});var Ri,Vf=V(()=>{"use strict";Ri=class{static{u(this,"VSCodeCopilotAdapter")}tool="vscode_copilot";parse(t){let n;try{n=JSON.parse(t)}catch{return this.emptySession()}let r=n.requests??[],o=[],s=0;for(let a of r){let l=a.timestamp?new Date(a.timestamp).toISOString():new Date().toISOString();if(o.push({sequence:s++,eventType:"user_message",content:a.message,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:l,metadata:{}}),a.response){let m=a.response.timestamp?new Date(a.response.timestamp).toISOString():l;o.push({sequence:s++,eventType:"assistant_message",content:a.response.message,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:m,metadata:{}})}}let i=o.map(a=>a.timestamp).sort(),c=new Date().toISOString();return{tool:"vscode_copilot",projectPath:null,gitBranch:null,startedAt:i[0]??c,endedAt:i[i.length-1]??null,events:o,metadata:{...n.requesterUsername&&{username:n.requesterUsername},...n.customTitle&&{title:n.customTitle}}}}emptySession(){return{tool:"vscode_copilot",projectPath:null,gitBranch:null,startedAt:new Date().toISOString(),endedAt:null,events:[],metadata:{}}}}});var ki,Jf=V(()=>{"use strict";ki=class{static{u(this,"CopilotAgentAdapter")}tool="copilot_agent";parse(t){let n;try{n=JSON.parse(t)}catch{return this.emptySession()}let r=n.requests??[],o=[],s=0;for(let a of r){let l=a.timestamp?new Date(a.timestamp).toISOString():new Date().toISOString();if(o.push({sequence:s++,eventType:"user_message",content:a.message,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:l,metadata:{}}),a.toolCalls)for(let m of a.toolCalls){let p=m.timestamp?new Date(m.timestamp).toISOString():l;o.push({sequence:s++,eventType:"tool_call",content:null,toolName:m.name??"unknown",toolInput:m.input??null,toolOutput:m.output??null,tokenUsage:null,timestamp:p,metadata:{}})}if(a.response){let m=a.response.timestamp?new Date(a.response.timestamp).toISOString():l;o.push({sequence:s++,eventType:"assistant_message",content:a.response.message,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:m,metadata:{}})}}let i=o.map(a=>a.timestamp).sort(),c=new Date().toISOString();return{tool:"copilot_agent",projectPath:null,gitBranch:null,startedAt:i[0]??c,endedAt:i[i.length-1]??null,events:o,metadata:{...n.requesterUsername&&{username:n.requesterUsername},...n.customTitle&&{title:n.customTitle},...n.agentMode!=null&&{agentMode:n.agentMode}}}}emptySession(){return{tool:"copilot_agent",projectPath:null,gitBranch:null,startedAt:new Date().toISOString(),endedAt:null,events:[],metadata:{}}}}});var Ni,Kf=V(()=>{"use strict";Ni=class{static{u(this,"RuleMetricMcpAdapter")}tool="rulemetric_mcp";parse(t){let n;try{n=JSON.parse(t)}catch{return this.emptySession()}let o=(n.events??[]).map((i,c)=>({sequence:i.sequence??c,eventType:this.normalizeEventType(i.eventType),content:i.content??null,toolName:i.toolName??null,toolInput:i.toolInput??null,toolOutput:i.toolOutput??null,tokenUsage:i.tokenUsage??null,timestamp:i.timestamp??new Date().toISOString(),metadata:i.metadata??{}})),s=new Date().toISOString();return{tool:"rulemetric_mcp",projectPath:n.projectPath??null,gitBranch:n.gitBranch??null,startedAt:n.startedAt??o[0]?.timestamp??s,endedAt:n.endedAt??o[o.length-1]?.timestamp??null,events:o,metadata:n.metadata??{}}}normalizeEventType(t){return t&&["user_message","assistant_message","tool_call","tool_result","thinking","error"].includes(t)?t:"assistant_message"}emptySession(){return{tool:"rulemetric_mcp",projectPath:null,gitBranch:null,startedAt:new Date().toISOString(),endedAt:null,events:[],metadata:{}}}}});function xN(e){try{return JSON.parse(e)}catch{return e}}function $v(e,t){return Array.isArray(e)?e.filter(n=>n.type&&t.includes(n.type)).map(n=>n.text??"").filter(Boolean).join(`
22
22
 
23
- `):""}function IP(e){if(!e)return null;let t=e.cached_input_tokens??0,n=Math.max(0,(e.input_tokens??0)-t),r=(e.output_tokens??0)+(e.reasoning_output_tokens??0);return n===0&&r===0&&t===0?null:{input:n,output:r,cacheRead:t,cacheWrite:0}}function bP(e){if(!e)return new Date().toISOString();let t=new Date(e);return Number.isFinite(t.getTime())?t.toISOString():new Date().toISOString()}function Qf(){return{sequence:0,model:null,prevCumulativeTotal:0,callNames:{}}}var Pi,Zf=J(()=>{"use strict";d(vP,"safeJsonParse");d(YI,"textFromBlocks");d(IP,"tokenUsageFromCodex");d(bP,"normalizeTimestamp");d(Qf,"freshCodexState");Pi=class{static{d(this,"CodexAdapter")}tool="codex";parse(t){let n=Qf(),{events:r,projectPath:o,gitBranch:s,metadata:i}=this.parseLines(t,n),a=r.map(l=>l.timestamp).sort(),c=new Date().toISOString();return{tool:"codex",projectPath:o,gitBranch:s,startedAt:a[0]??c,endedAt:a[a.length-1]??null,events:r,metadata:i}}parseAppend(t,n){let r={...n,callNames:{...n.callNames}},{events:o}=this.parseLines(t,r);return{events:o,state:r}}parseLines(t,n){let r=t.split(`
24
- `).filter(p=>p.trim()),o=[],s={},i=n.callNames,a=null,c=null,l=null;for(let p of r){let m;try{m=JSON.parse(p)}catch{continue}let y=m.payload;if(!y)continue;let v=bP(m.timestamp);if(m.type==="session_meta"){l=y.session_id??y.id??l,a=y.cwd??a,y.git_branch&&(c=y.git_branch),y.model&&(n.model=y.model),s.sessionId=l,s.codexSessionId=l,s.originator=y.originator,s.source=y.source,s.modelProvider=y.model_provider,s.codexCliVersion=y.cli_version;continue}if(m.type==="turn_context"){a=y.cwd??a,y.model&&(n.model=y.model,s.model=y.model);continue}if(m.type==="response_item"&&y.type==="message"){if(y.role==="user"){let h=YI(y.content,["input_text"]);if(!h)continue;o.push({sequence:n.sequence++,eventType:"user_message",content:h,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:v,metadata:{}})}else if(y.role==="assistant"){let h=YI(y.content,["output_text"]);if(!h)continue;o.push({sequence:n.sequence++,eventType:"assistant_message",content:h,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,model:n.model,timestamp:v,metadata:n.model?{model:n.model}:{}})}continue}if(m.type==="response_item"&&y.type==="function_call"){let h=y.name??"unknown";y.call_id&&(i[y.call_id]=h);let f=typeof y.arguments=="string"?vP(y.arguments):{};o.push({sequence:n.sequence++,eventType:"tool_call",content:null,toolName:h,toolInput:f&&typeof f=="object"&&!Array.isArray(f)?f:{arguments:f},toolOutput:null,tokenUsage:null,model:n.model,timestamp:v,metadata:{callId:y.call_id}});continue}if(m.type==="response_item"&&y.type==="function_call_output"){let h=y.call_id?i[y.call_id]??null:null;o.push({sequence:n.sequence++,eventType:"tool_result",content:y.output??null,toolName:h,toolInput:null,toolOutput:y.output==null?null:{output:y.output},tokenUsage:null,model:n.model,timestamp:v,metadata:{callId:y.call_id}});continue}if(m.type==="event_msg"&&y.type==="token_count"){let h=y.info,f=h?.total_token_usage?.total_tokens??0;if(f>0&&f===n.prevCumulativeTotal)continue;f>0&&(n.prevCumulativeTotal=f);let w=IP(h?.last_token_usage??h?.total_token_usage);if(!w)continue;let b=h?.model??h?.model_name??n.model;o.push({sequence:n.sequence++,eventType:"assistant_message",content:null,toolName:null,toolInput:null,toolOutput:null,tokenUsage:w,model:b??null,timestamp:v,metadata:{codexEventType:"token_count",...b?{model:b}:{},reasoningOutputTokens:h?.last_token_usage?.reasoning_output_tokens??0}})}}return{events:o,projectPath:a,gitBranch:c,sessionId:l,metadata:s}}}});function Rc(e){let t=SP[e];if(!t)throw new Error(`Unknown session tool: ${e}`);return t()}function kc(e){let t=e.trim();if(t.startsWith("{")){let n=t.split(`
23
+ `):""}function TN(e){if(!e)return null;let t=e.cached_input_tokens??0,n=Math.max(0,(e.input_tokens??0)-t),r=(e.output_tokens??0)+(e.reasoning_output_tokens??0);return n===0&&r===0&&t===0?null:{input:n,output:r,cacheRead:t,cacheWrite:0}}function RN(e){if(!e)return new Date().toISOString();let t=new Date(e);return Number.isFinite(t.getTime())?t.toISOString():new Date().toISOString()}function Gf(){return{sequence:0,model:null,prevCumulativeTotal:0,callNames:{}}}var ji,Yf=V(()=>{"use strict";u(xN,"safeJsonParse");u($v,"textFromBlocks");u(TN,"tokenUsageFromCodex");u(RN,"normalizeTimestamp");u(Gf,"freshCodexState");ji=class{static{u(this,"CodexAdapter")}tool="codex";parse(t){let n=Gf(),{events:r,projectPath:o,gitBranch:s,metadata:i}=this.parseLines(t,n),c=r.map(l=>l.timestamp).sort(),a=new Date().toISOString();return{tool:"codex",projectPath:o,gitBranch:s,startedAt:c[0]??a,endedAt:c[c.length-1]??null,events:r,metadata:i}}parseAppend(t,n){let r={...n,callNames:{...n.callNames}},{events:o}=this.parseLines(t,r);return{events:o,state:r}}parseLines(t,n){let r=t.split(`
24
+ `).filter(m=>m.trim()),o=[],s={},i=n.callNames,c=null,a=null,l=null;for(let m of r){let p;try{p=JSON.parse(m)}catch{continue}let _=p.payload;if(!_)continue;let I=RN(p.timestamp);if(p.type==="session_meta"){l=_.session_id??_.id??l,c=_.cwd??c,_.git_branch&&(a=_.git_branch),_.model&&(n.model=_.model),s.sessionId=l,s.codexSessionId=l,s.originator=_.originator,s.source=_.source,s.modelProvider=_.model_provider,s.codexCliVersion=_.cli_version;continue}if(p.type==="turn_context"){c=_.cwd??c,_.model&&(n.model=_.model,s.model=_.model);continue}if(p.type==="response_item"&&_.type==="message"){if(_.role==="user"){let h=$v(_.content,["input_text"]);if(!h)continue;o.push({sequence:n.sequence++,eventType:"user_message",content:h,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:I,metadata:{}})}else if(_.role==="assistant"){let h=$v(_.content,["output_text"]);if(!h)continue;o.push({sequence:n.sequence++,eventType:"assistant_message",content:h,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,model:n.model,timestamp:I,metadata:n.model?{model:n.model}:{}})}continue}if(p.type==="response_item"&&_.type==="function_call"){let h=_.name??"unknown";_.call_id&&(i[_.call_id]=h);let f=typeof _.arguments=="string"?xN(_.arguments):{};o.push({sequence:n.sequence++,eventType:"tool_call",content:null,toolName:h,toolInput:f&&typeof f=="object"&&!Array.isArray(f)?f:{arguments:f},toolOutput:null,tokenUsage:null,model:n.model,timestamp:I,metadata:{callId:_.call_id}});continue}if(p.type==="response_item"&&_.type==="function_call_output"){let h=_.call_id?i[_.call_id]??null:null;o.push({sequence:n.sequence++,eventType:"tool_result",content:_.output??null,toolName:h,toolInput:null,toolOutput:_.output==null?null:{output:_.output},tokenUsage:null,model:n.model,timestamp:I,metadata:{callId:_.call_id}});continue}if(p.type==="event_msg"&&_.type==="token_count"){let h=_.info,f=h?.total_token_usage?.total_tokens??0;if(f>0&&f===n.prevCumulativeTotal)continue;f>0&&(n.prevCumulativeTotal=f);let w=TN(h?.last_token_usage??h?.total_token_usage);if(!w)continue;let b=h?.model??h?.model_name??n.model;o.push({sequence:n.sequence++,eventType:"assistant_message",content:null,toolName:null,toolInput:null,toolOutput:null,tokenUsage:w,model:b??null,timestamp:I,metadata:{codexEventType:"token_count",...b?{model:b}:{},reasoningOutputTokens:h?.last_token_usage?.reasoning_output_tokens??0}})}}return{events:o,projectPath:c,gitBranch:a,sessionId:l,metadata:s}}}});function Tc(e){let t=kN[e];if(!t)throw new Error(`Unknown session tool: ${e}`);return t()}function Rc(e){let t=e.trim();if(t.startsWith("{")){let n=t.split(`
25
25
  `)[0],r=null;try{r=JSON.parse(n)}catch{try{r=JSON.parse(t)}catch{}}if(r){if(r.type==="user"||r.type==="assistant")return"claude_code";if(Array.isArray(r.events)&&!r.requests&&!r.allComposers)return"rulemetric_mcp";if(Array.isArray(r.requests))return r.requests.some(s=>Array.isArray(s.toolCalls))||r.agentMode?"copilot_agent":"vscode_copilot";if(r.allComposers)return"cursor"}if(!r)try{let o=t.split(`
26
- `).filter(s=>s.trim());if(o.length>1){let s=JSON.parse(o[0]);if(s.type==="user"||s.type==="assistant")return"claude_code"}}catch{}}return null}var SP,XI=J(()=>{"use strict";Jf();Gf();Kf();Yf();Xf();Zf();SP={claude_code:d(()=>new Ti,"claude_code"),cursor:d(()=>new Ri,"cursor"),vscode_copilot:d(()=>new ki,"vscode_copilot"),copilot_agent:d(()=>new ji,"copilot_agent"),rulemetric_mcp:d(()=>new Ni,"rulemetric_mcp"),codex:d(()=>new Pi,"codex")};d(Rc,"getAdapter");d(kc,"detectTool")});function QI(e,t){let n=t.length>0?t.map(o=>`### ${o.name} (ID: ${o.id})
26
+ `).filter(s=>s.trim());if(o.length>1){let s=JSON.parse(o[0]);if(s.type==="user"||s.type==="assistant")return"claude_code"}}catch{}}return null}var kN,qv=V(()=>{"use strict";Wf();zf();Vf();Jf();Kf();Yf();kN={claude_code:u(()=>new xi,"claude_code"),cursor:u(()=>new Ti,"cursor"),vscode_copilot:u(()=>new Ri,"vscode_copilot"),copilot_agent:u(()=>new ki,"copilot_agent"),rulemetric_mcp:u(()=>new Ni,"rulemetric_mcp"),codex:u(()=>new ji,"codex")};u(Tc,"getAdapter");u(Rc,"detectTool")});function Uv(e,t){let n=t.length>0?t.map(o=>`### ${o.name} (ID: ${o.id})
27
27
 
28
28
  ${o.content}`).join(`
29
29
 
30
30
  ---
31
31
 
32
- `):"No instructions were linked to this session.",r=e.map(o=>{let s=`[${o.sequence}] ${o.eventType}`;if(o.eventType==="tool_call")return`${s}: ${o.toolName}(${JSON.stringify(o.toolInput)})`;if(o.eventType==="tool_result"){let a=o.content?.slice(0,200)??"";return`${s}: ${a}${o.content&&o.content.length>200?"...":""}`}let i=o.content?.slice(0,300)??"";return`${s}: ${i}${o.content&&o.content.length>300?"...":""}`}).join(`
32
+ `):"No instructions were linked to this session.",r=e.map(o=>{let s=`[${o.sequence}] ${o.eventType}`;if(o.eventType==="tool_call")return`${s}: ${o.toolName}(${JSON.stringify(o.toolInput)})`;if(o.eventType==="tool_result"){let c=o.content?.slice(0,200)??"";return`${s}: ${c}${o.content&&o.content.length>200?"...":""}`}let i=o.content?.slice(0,300)??"";return`${s}: ${i}${o.content&&o.content.length>300?"...":""}`}).join(`
33
33
  `);return`You are analyzing an AI coding session to evaluate how well the agent followed its instructions and to suggest improvements.
34
34
 
35
35
  ## Active Instructions
@@ -64,12 +64,12 @@ Return your response as JSON matching this schema:
64
64
  "summary": "<string>"
65
65
  }
66
66
 
67
- Return valid JSON only.`}function ZI(e){try{let t=e.match(/\{[\s\S]*\}/);if(!t)return null;let n=JSON.parse(t[0]);return typeof n.adherenceScore!="number"||!Array.isArray(n.deviations)||!Array.isArray(n.suggestions)||typeof n.summary!="string"?null:{adherenceScore:n.adherenceScore,deviations:n.deviations,suggestions:n.suggestions,summary:n.summary,analyzedAt:new Date().toISOString()}}catch{return null}}var eb=J(()=>{"use strict";d(QI,"buildAnalysisPrompt");d(ZI,"parseAnalysisResponse")});import{readdir as eg,stat as tg}from"fs/promises";import{basename as AP,join as wo}from"path";import{homedir as rl}from"os";function xP(){return process.env.CLAUDE_CONFIG_DIR||wo(rl(),".claude")}function TP(){return wo(xP(),"projects")}function RP(){return process.platform==="darwin"?wo(rl(),"Library","Application Support","Claude","local-agent-mode-sessions"):process.platform==="win32"?wo(rl(),"AppData","Roaming","Claude","local-agent-mode-sessions"):wo(rl(),".config","Claude","local-agent-mode-sessions")}async function kP(e){let t=[];async function n(r,o){if(o>8)return;let s=await eg(r).catch(()=>[]);for(let i of s){if(i==="node_modules"||i===".git")continue;let a=wo(r,i);if((await tg(a).catch(()=>null))?.isDirectory())if(i==="projects"){let l=await eg(a).catch(()=>[]);for(let p of l){let m=wo(a,p);(await tg(m).catch(()=>null))?.isDirectory()&&t.push(m)}}else await n(a,o+1)}}return d(n,"walk"),await n(e,0),t}var EP,tb,nb=J(()=>{"use strict";EP={"claude-opus-4-7":"Opus 4.7","claude-opus-4-6":"Opus 4.6","claude-opus-4-5":"Opus 4.5","claude-opus-4-1":"Opus 4.1","claude-opus-4":"Opus 4","claude-sonnet-4-6":"Sonnet 4.6","claude-sonnet-4-5":"Sonnet 4.5","claude-sonnet-4":"Sonnet 4","claude-3-7-sonnet":"Sonnet 3.7","claude-3-5-sonnet":"Sonnet 3.5","claude-haiku-4-5":"Haiku 4.5","claude-3-5-haiku":"Haiku 3.5"};d(xP,"getClaudeDir");d(TP,"getProjectsDir");d(RP,"getDesktopSessionsDir");d(kP,"findDesktopProjectDirs");tb={name:"claude",displayName:"Claude Code",modelDisplayName(e){let t=e.replace(/@.*$/,"").replace(/-\d{8}$/,"");for(let[n,r]of Object.entries(EP))if(t.startsWith(n))return r;return t},toolDisplayName(e){return e},async discoverSessions(){let e=[],t=TP();try{let r=await eg(t);for(let o of r){let s=wo(t,o);(await tg(s).catch(()=>null))?.isDirectory()&&e.push({path:s,project:o,provider:"claude"})}}catch{}let n=await kP(RP());for(let r of n)e.push({path:r,project:AP(r),provider:"claude"});return e},createSessionParser(){return{async*parse(){}}}}});import{readdir as ol,readFile as rb,stat as jP}from"fs/promises";import{basename as NP,join as Ci}from"path";import{homedir as PP}from"os";function OP(){return process.env.CODEX_HOME??Ci(PP(),".codex")}function DP(e){return e.replace(/^\//,"").replace(/\//g,"-")}async function MP(e){try{let n=(await rb(e,"utf-8")).split(`
68
- `)[0];return n?.trim()?JSON.parse(n):null}catch{return null}}async function LP(e){let t=await MP(e);if(!t)return{valid:!1};let n=t.type==="session_meta"&&typeof t.payload?.originator=="string"&&t.payload.originator.toLowerCase().startsWith("codex");return{valid:n,meta:n?t:void 0}}async function $P(e){let t=Ci(e,"sessions"),n=[],r;try{r=await ol(t)}catch{return n}for(let o of r){if(!/^\d{4}$/.test(o))continue;let s=Ci(t,o),i=await ol(s).catch(()=>[]);for(let a of i){if(!/^\d{2}$/.test(a))continue;let c=Ci(s,a),l=await ol(c).catch(()=>[]);for(let p of l){if(!/^\d{2}$/.test(p))continue;let m=Ci(c,p),y=await ol(m).catch(()=>[]);for(let v of y){if(!v.startsWith("rollout-")||!v.endsWith(".jsonl"))continue;let h=Ci(m,v);if(!(await jP(h).catch(()=>null))?.isFile())continue;let{valid:w,meta:b}=await LP(h);if(!w||!b)continue;let I=b.payload?.cwd??"unknown";n.push({path:h,project:DP(I),provider:"codex"})}}}}return n}function qP(e,t){return e?.info?.model??e?.info?.model_name??t??"gpt-5"}function UP(e,t){return{async*parse(){let n;try{n=await rb(e.path,"utf-8")}catch{return}let r=n.split(`
69
- `).filter(v=>v.trim()),o,s="",i=0,a=0,c=0,l=0,p=0,m=[],y="";for(let v of r){let h;try{h=JSON.parse(v)}catch{continue}if(h.type==="session_meta"){s=h.payload?.session_id??NP(e.path,".jsonl"),o=h.payload?.model;continue}if(h.type==="response_item"&&h.payload?.type==="function_call"){let f=h.payload.name??"";m.push(ob[f]??f);continue}if(h.type==="response_item"&&h.payload?.type==="message"&&h.payload?.role==="user"){let f=(h.payload.content??[]).filter(w=>w.type==="input_text").map(w=>w.text??"").filter(Boolean);f.length>0&&(y=f.join(" "));continue}if(h.type==="event_msg"&&h.payload?.type==="token_count"){let f=h.payload.info;if(!f)continue;let w=f.total_token_usage?.total_tokens??0;if(w>0&&w===i)continue;i=w;let b=f.last_token_usage,I=0,S=0,A=0,E=0;if(b)I=b.input_tokens??0,S=b.cached_input_tokens??0,A=b.output_tokens??0,E=b.reasoning_output_tokens??0;else if(w>0){let H=f.total_token_usage;if(!H)continue;I=(H.input_tokens??0)-a,S=(H.cached_input_tokens??0)-c,A=(H.output_tokens??0)-l,E=(H.reasoning_output_tokens??0)-p}if(!b){let H=f.total_token_usage;H&&(a=H.input_tokens??0,c=H.cached_input_tokens??0,l=H.output_tokens??0,p=H.reasoning_output_tokens??0)}if(I+S+A+E===0)continue;let D=Math.max(0,I-S),j=qP(h.payload,o),P=h.timestamp??"",$=`codex:${e.path}:${P}:${w}`;if(t.has($))continue;t.add($),yield{provider:"codex",model:j,inputTokens:D,outputTokens:A,cacheCreationInputTokens:0,cacheReadInputTokens:S,cachedInputTokens:S,reasoningTokens:E,costUSD:0,tools:m,bashCommands:[],timestamp:P,speed:"standard",deduplicationKey:$,userMessage:y,sessionId:s},m=[],y=""}}}}}var CP,ob,sb,ib=J(()=>{"use strict";CP={"gpt-5.3-codex":"GPT-5.3 Codex","gpt-5.4-mini":"GPT-5.4 Mini","gpt-5.4":"GPT-5.4","gpt-5":"GPT-5","gpt-4o-mini":"GPT-4o Mini","gpt-4o":"GPT-4o"},ob={exec_command:"Bash",read_file:"Read",write_file:"Edit",apply_diff:"Edit",apply_patch:"Edit",spawn_agent:"Agent",close_agent:"Agent",wait_agent:"Agent",read_dir:"Glob"};d(OP,"getCodexDir");d(DP,"sanitizeProject");d(MP,"readFirstLine");d(LP,"isValidCodexSession");d($P,"discoverSessionsInDir");d(qP,"resolveModel");d(UP,"createParser");sb={name:"codex",displayName:"Codex",modelDisplayName(e){for(let[t,n]of Object.entries(CP))if(e.startsWith(t))return n;return e},toolDisplayName(e){return ob[e]??e},async discoverSessions(){return $P(OP())},createSessionParser(e,t){return UP(e,t)}}});import{readdir as HP,readFile as ab,stat as BP}from"fs/promises";import{basename as cb,dirname as FP,join as ng}from"path";import{homedir as WP}from"os";function JP(){return ng(WP(),".copilot","session-state")}function GP(e){let t=e.match(/^cwd:\s*(.+)$/m);return t?.[1]&&t[1].replace(/\s*#.*$/,"").replace(/^['"]|['"]$/g,"").trim()||null}function KP(e,t){return{async*parse(){let n;try{n=await ab(e.path,"utf-8")}catch{return}let r=cb(FP(e.path)),o=n.split(`
70
- `).filter(a=>a.trim()),s="",i="";for(let a of o){let c;try{c=JSON.parse(a)}catch{continue}if(c.type==="session.model_change"){s=c.data.newModel??s;continue}if(c.type==="user.message"){i=c.data.content??"";continue}if(c.type==="assistant.message"){let{messageId:l,outputTokens:p,toolRequests:m=[]}=c.data;if(p===0||!s)continue;let y=`copilot:${r}:${l}`;if(t.has(y))continue;t.add(y);let v=m.map(h=>h.name??"").filter(Boolean).map(h=>db[h]??h);yield{provider:"copilot",model:s,inputTokens:0,outputTokens:p,cacheCreationInputTokens:0,cacheReadInputTokens:0,cachedInputTokens:0,reasoningTokens:0,costUSD:0,tools:v,bashCommands:[],timestamp:c.timestamp??"",speed:"standard",deduplicationKey:y,userMessage:i,sessionId:r},i=""}}}}}async function YP(e){let t=[],n;try{n=await HP(e)}catch{return t}for(let r of n){let o=ng(e,r,"events.jsonl");if(!(await BP(o).catch(()=>null))?.isFile())continue;let i=r;try{let a=await ab(ng(e,r,"workspace.yaml"),"utf-8"),c=GP(a);c&&(i=cb(c))}catch{}t.push({path:o,project:i,provider:"copilot"})}return t}var zP,db,VP,ub,lb=J(()=>{"use strict";zP={"gpt-4.1-nano":"GPT-4.1 Nano","gpt-4.1-mini":"GPT-4.1 Mini","gpt-4.1":"GPT-4.1","gpt-4o-mini":"GPT-4o Mini","gpt-4o":"GPT-4o","gpt-5-mini":"GPT-5 Mini","gpt-5":"GPT-5","claude-sonnet-4-5":"Sonnet 4.5","claude-sonnet-4":"Sonnet 4","claude-3-7-sonnet":"Sonnet 3.7","claude-3-5-sonnet":"Sonnet 3.5","o4-mini":"o4-mini",o3:"o3"},db={bash:"Bash",read_file:"Read",write_file:"Edit",edit_file:"Edit",create_file:"Write",delete_file:"Delete",search_files:"Grep",find_files:"Glob",list_directory:"LS",web_search:"WebSearch",fetch_webpage:"WebFetch",github_repo:"GitHub"},VP=Object.entries(zP).sort((e,t)=>t[0].length-e[0].length);d(JP,"getCopilotSessionStateDir");d(GP,"parseCwd");d(KP,"createParser");d(YP,"discoverSessionsInDir");ub={name:"copilot",displayName:"GitHub Copilot",modelDisplayName(e){for(let[t,n]of VP)if(e===t||e.startsWith(t+"-"))return n;return e},toolDisplayName(e){return db[e]??e},async discoverSessions(){return YP(JP())},createSessionParser(e,t){return KP(e,t)}}});import{readdir as pb,readFile as fb,stat as mb}from"fs/promises";import{basename as gb,join as rg}from"path";import{homedir as XP}from"os";function eC(){return rg(XP(),".pi","agent","sessions")}async function tC(e){try{let n=(await fb(e,"utf-8")).split(`
71
- `)[0];return n?.trim()?JSON.parse(n):null}catch{return null}}function nC(e){return e.split(/[;&|]+/).map(t=>t.trim().split(/\s+/)[0]).filter(Boolean)}async function rC(e){let t=[],n;try{n=await pb(e)}catch{return t}for(let r of n){let o=rg(e,r);if(!(await mb(o).catch(()=>null))?.isDirectory())continue;let i;try{i=await pb(o)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let c=rg(o,a);if(!(await mb(c).catch(()=>null))?.isFile())continue;let p=await tC(c);if(!p||p.type!=="session")continue;let m=p.cwd??r;t.push({path:c,project:gb(m),provider:"pi"})}}return t}function oC(e,t){return{async*parse(){let n;try{n=await fb(e.path,"utf-8")}catch{return}let r=n.split(`
72
- `).filter(i=>i.trim()),o=gb(e.path,".jsonl"),s="";for(let[i,a]of r.entries()){let c;try{c=JSON.parse(a)}catch{continue}if(c.type==="session"){o=c.id??o;continue}if(c.type!=="message")continue;let l=c.message;if(!l)continue;if(l.role==="user"){let E=(l.content??[]).filter(R=>R.type==="text").map(R=>R.text??"").filter(Boolean);E.length>0&&(s=E.join(" "));continue}if(l.role!=="assistant"||!l.usage)continue;let{input:p,output:m,cacheRead:y,cacheWrite:v}=l.usage;if(p===0&&m===0)continue;let h=l.model??"gpt-5",f=l.responseId??"",w=`pi:${e.path}:${f||c.id||c.timestamp||String(i)}`;if(t.has(w))continue;t.add(w);let b=(l.content??[]).filter(E=>E.type==="toolCall"&&E.name),I=b.map(E=>hb[E.name]??E.name),S=b.filter(E=>E.name==="bash").flatMap(E=>{let R=E.arguments?.command;return typeof R=="string"?nC(R):[]}),A=c.timestamp??"";yield{provider:"pi",model:h,inputTokens:p,outputTokens:m,cacheCreationInputTokens:v,cacheReadInputTokens:y,cachedInputTokens:y,reasoningTokens:0,costUSD:0,tools:I,bashCommands:S,timestamp:A,speed:"standard",deduplicationKey:w,userMessage:s,sessionId:o},s=""}}}}var QP,hb,ZP,_b,yb=J(()=>{"use strict";QP={"gpt-5.4":"GPT-5.4","gpt-5.4-mini":"GPT-5.4 Mini","gpt-5":"GPT-5","gpt-4o":"GPT-4o","gpt-4o-mini":"GPT-4o Mini"},hb={bash:"Bash",read:"Read",edit:"Edit",write:"Write",glob:"Glob",grep:"Grep",task:"Agent",dispatch_agent:"Agent",fetch:"WebFetch",search:"WebSearch",todo:"TodoWrite",patch:"Patch"},ZP=Object.entries(QP).sort((e,t)=>t[0].length-e[0].length);d(eC,"getPiSessionsDir");d(tC,"readFirstEntry");d(nC,"extractBashCommands");d(rC,"discoverSessionsInDir");d(oC,"createParser");_b={name:"pi",displayName:"Pi",modelDisplayName(e){for(let[t,n]of ZP)if(e.startsWith(t))return n;return e},toolDisplayName(e){return hb[e]??e},async discoverSessions(){return rC(eC())},createSessionParser(e,t){return oC(e,t)}}});var vb={};to(vb,{cursor:()=>pC});import{existsSync as sC}from"fs";import{join as og}from"path";import{homedir as sg}from"os";function wb(){if(sl)return!0;try{return sl=kp("better-sqlite3"),!0}catch{return!1}}function cC(){return process.platform==="darwin"?og(sg(),"Library","Application Support","Cursor","User","globalStorage","state.vscdb"):process.platform==="win32"?og(sg(),"AppData","Roaming","Cursor","User","globalStorage","state.vscdb"):og(sg(),".config","Cursor","User","globalStorage","state.vscdb")}function dC(e){return!e||e==="default"?iC:e}function lC(e,t){return{async*parse(){if(!wb()||!sl)return;let n;try{n=new sl(e.path,{readonly:!0})}catch{return}try{let o=n.prepare(uC).all();for(let s of o){let i=s.input_tokens??0,a=s.output_tokens??0;if(i===0&&a===0)continue;let c=s.created_at??"",l=s.conversation_id??"unknown",p=`cursor:${l}:${c}:${i}:${a}`;if(t.has(p))continue;t.add(p);let m=dC(s.model);yield{provider:"cursor",model:s.model??"default",inputTokens:i,outputTokens:a,cacheCreationInputTokens:0,cacheReadInputTokens:0,cachedInputTokens:0,reasoningTokens:0,costUSD:0,tools:[],bashCommands:[],timestamp:c,speed:"standard",deduplicationKey:p,userMessage:s.user_text??"",sessionId:l}}}finally{n.close()}}}}var sl,iC,aC,uC,pC,Ib=J(()=>{"use strict";sl=null;d(wb,"loadSqlite");iC="claude-sonnet-4-5",aC={"claude-4.5-opus-high-thinking":"Opus 4.5 (Thinking)","claude-4-opus":"Opus 4","claude-4-sonnet-thinking":"Sonnet 4 (Thinking)","claude-4.5-sonnet-thinking":"Sonnet 4.5 (Thinking)","claude-4.6-sonnet":"Sonnet 4.6","composer-1":"Composer 1","gpt-5":"GPT-5","gpt-4.1":"GPT-4.1",default:"Auto (Sonnet est.)"};d(cC,"getCursorDbPath");d(dC,"resolveModel");uC=`
67
+ Return valid JSON only.`}function Hv(e){try{let t=e.match(/\{[\s\S]*\}/);if(!t)return null;let n=JSON.parse(t[0]);return typeof n.adherenceScore!="number"||!Array.isArray(n.deviations)||!Array.isArray(n.suggestions)||typeof n.summary!="string"?null:{adherenceScore:n.adherenceScore,deviations:n.deviations,suggestions:n.suggestions,summary:n.summary,analyzedAt:new Date().toISOString()}}catch{return null}}var Bv=V(()=>{"use strict";u(Uv,"buildAnalysisPrompt");u(Hv,"parseAnalysisResponse")});import{readdir as Xf,stat as Qf}from"fs/promises";import{basename as NN,join as wo}from"path";import{homedir as nl}from"os";function PN(){return process.env.CLAUDE_CONFIG_DIR||wo(nl(),".claude")}function DN(){return wo(PN(),"projects")}function ON(){return process.platform==="darwin"?wo(nl(),"Library","Application Support","Claude","local-agent-mode-sessions"):process.platform==="win32"?wo(nl(),"AppData","Roaming","Claude","local-agent-mode-sessions"):wo(nl(),".config","Claude","local-agent-mode-sessions")}async function CN(e){let t=[];async function n(r,o){if(o>8)return;let s=await Xf(r).catch(()=>[]);for(let i of s){if(i==="node_modules"||i===".git")continue;let c=wo(r,i);if((await Qf(c).catch(()=>null))?.isDirectory())if(i==="projects"){let l=await Xf(c).catch(()=>[]);for(let m of l){let p=wo(c,m);(await Qf(p).catch(()=>null))?.isDirectory()&&t.push(p)}}else await n(c,o+1)}}return u(n,"walk"),await n(e,0),t}var jN,Fv,Wv=V(()=>{"use strict";jN={"claude-opus-4-7":"Opus 4.7","claude-opus-4-6":"Opus 4.6","claude-opus-4-5":"Opus 4.5","claude-opus-4-1":"Opus 4.1","claude-opus-4":"Opus 4","claude-sonnet-4-6":"Sonnet 4.6","claude-sonnet-4-5":"Sonnet 4.5","claude-sonnet-4":"Sonnet 4","claude-3-7-sonnet":"Sonnet 3.7","claude-3-5-sonnet":"Sonnet 3.5","claude-haiku-4-5":"Haiku 4.5","claude-3-5-haiku":"Haiku 3.5"};u(PN,"getClaudeDir");u(DN,"getProjectsDir");u(ON,"getDesktopSessionsDir");u(CN,"findDesktopProjectDirs");Fv={name:"claude",displayName:"Claude Code",modelDisplayName(e){let t=e.replace(/@.*$/,"").replace(/-\d{8}$/,"");for(let[n,r]of Object.entries(jN))if(t.startsWith(n))return r;return t},toolDisplayName(e){return e},async discoverSessions(){let e=[],t=DN();try{let r=await Xf(t);for(let o of r){let s=wo(t,o);(await Qf(s).catch(()=>null))?.isDirectory()&&e.push({path:s,project:o,provider:"claude"})}}catch{}let n=await CN(ON());for(let r of n)e.push({path:r,project:NN(r),provider:"claude"});return e},createSessionParser(){return{async*parse(){}}}}});import{readdir as rl,readFile as zv,stat as LN}from"fs/promises";import{basename as MN,join as Pi}from"path";import{homedir as $N}from"os";function UN(){return process.env.CODEX_HOME??Pi($N(),".codex")}function HN(e){return e.replace(/^\//,"").replace(/\//g,"-")}async function BN(e){try{let n=(await zv(e,"utf-8")).split(`
68
+ `)[0];return n?.trim()?JSON.parse(n):null}catch{return null}}async function FN(e){let t=await BN(e);if(!t)return{valid:!1};let n=t.type==="session_meta"&&typeof t.payload?.originator=="string"&&t.payload.originator.toLowerCase().startsWith("codex");return{valid:n,meta:n?t:void 0}}async function WN(e){let t=Pi(e,"sessions"),n=[],r;try{r=await rl(t)}catch{return n}for(let o of r){if(!/^\d{4}$/.test(o))continue;let s=Pi(t,o),i=await rl(s).catch(()=>[]);for(let c of i){if(!/^\d{2}$/.test(c))continue;let a=Pi(s,c),l=await rl(a).catch(()=>[]);for(let m of l){if(!/^\d{2}$/.test(m))continue;let p=Pi(a,m),_=await rl(p).catch(()=>[]);for(let I of _){if(!I.startsWith("rollout-")||!I.endsWith(".jsonl"))continue;let h=Pi(p,I);if(!(await LN(h).catch(()=>null))?.isFile())continue;let{valid:w,meta:b}=await FN(h);if(!w||!b)continue;let v=b.payload?.cwd??"unknown";n.push({path:h,project:HN(v),provider:"codex"})}}}}return n}function zN(e,t){return e?.info?.model??e?.info?.model_name??t??"gpt-5"}function VN(e,t){return{async*parse(){let n;try{n=await zv(e.path,"utf-8")}catch{return}let r=n.split(`
69
+ `).filter(I=>I.trim()),o,s="",i=0,c=0,a=0,l=0,m=0,p=[],_="";for(let I of r){let h;try{h=JSON.parse(I)}catch{continue}if(h.type==="session_meta"){s=h.payload?.session_id??MN(e.path,".jsonl"),o=h.payload?.model;continue}if(h.type==="response_item"&&h.payload?.type==="function_call"){let f=h.payload.name??"";p.push(Vv[f]??f);continue}if(h.type==="response_item"&&h.payload?.type==="message"&&h.payload?.role==="user"){let f=(h.payload.content??[]).filter(w=>w.type==="input_text").map(w=>w.text??"").filter(Boolean);f.length>0&&(_=f.join(" "));continue}if(h.type==="event_msg"&&h.payload?.type==="token_count"){let f=h.payload.info;if(!f)continue;let w=f.total_token_usage?.total_tokens??0;if(w>0&&w===i)continue;i=w;let b=f.last_token_usage,v=0,S=0,A=0,E=0;if(b)v=b.input_tokens??0,S=b.cached_input_tokens??0,A=b.output_tokens??0,E=b.reasoning_output_tokens??0;else if(w>0){let H=f.total_token_usage;if(!H)continue;v=(H.input_tokens??0)-c,S=(H.cached_input_tokens??0)-a,A=(H.output_tokens??0)-l,E=(H.reasoning_output_tokens??0)-m}if(!b){let H=f.total_token_usage;H&&(c=H.input_tokens??0,a=H.cached_input_tokens??0,l=H.output_tokens??0,m=H.reasoning_output_tokens??0)}if(v+S+A+E===0)continue;let P=Math.max(0,v-S),N=zN(h.payload,o),D=h.timestamp??"",q=`codex:${e.path}:${D}:${w}`;if(t.has(q))continue;t.add(q),yield{provider:"codex",model:N,inputTokens:P,outputTokens:A,cacheCreationInputTokens:0,cacheReadInputTokens:S,cachedInputTokens:S,reasoningTokens:E,costUSD:0,tools:p,bashCommands:[],timestamp:D,speed:"standard",deduplicationKey:q,userMessage:_,sessionId:s},p=[],_=""}}}}}var qN,Vv,Jv,Kv=V(()=>{"use strict";qN={"gpt-5.3-codex":"GPT-5.3 Codex","gpt-5.4-mini":"GPT-5.4 Mini","gpt-5.4":"GPT-5.4","gpt-5":"GPT-5","gpt-4o-mini":"GPT-4o Mini","gpt-4o":"GPT-4o"},Vv={exec_command:"Bash",read_file:"Read",write_file:"Edit",apply_diff:"Edit",apply_patch:"Edit",spawn_agent:"Agent",close_agent:"Agent",wait_agent:"Agent",read_dir:"Glob"};u(UN,"getCodexDir");u(HN,"sanitizeProject");u(BN,"readFirstLine");u(FN,"isValidCodexSession");u(WN,"discoverSessionsInDir");u(zN,"resolveModel");u(VN,"createParser");Jv={name:"codex",displayName:"Codex",modelDisplayName(e){for(let[t,n]of Object.entries(qN))if(e.startsWith(t))return n;return e},toolDisplayName(e){return Vv[e]??e},async discoverSessions(){return WN(UN())},createSessionParser(e,t){return VN(e,t)}}});import{readdir as JN,readFile as Gv,stat as KN}from"fs/promises";import{basename as Yv,dirname as GN,join as Zf}from"path";import{homedir as YN}from"os";function ZN(){return Zf(YN(),".copilot","session-state")}function ej(e){let t=e.match(/^cwd:\s*(.+)$/m);return t?.[1]&&t[1].replace(/\s*#.*$/,"").replace(/^['"]|['"]$/g,"").trim()||null}function tj(e,t){return{async*parse(){let n;try{n=await Gv(e.path,"utf-8")}catch{return}let r=Yv(GN(e.path)),o=n.split(`
70
+ `).filter(c=>c.trim()),s="",i="";for(let c of o){let a;try{a=JSON.parse(c)}catch{continue}if(a.type==="session.model_change"){s=a.data.newModel??s;continue}if(a.type==="user.message"){i=a.data.content??"";continue}if(a.type==="assistant.message"){let{messageId:l,outputTokens:m,toolRequests:p=[]}=a.data;if(m===0||!s)continue;let _=`copilot:${r}:${l}`;if(t.has(_))continue;t.add(_);let I=p.map(h=>h.name??"").filter(Boolean).map(h=>Xv[h]??h);yield{provider:"copilot",model:s,inputTokens:0,outputTokens:m,cacheCreationInputTokens:0,cacheReadInputTokens:0,cachedInputTokens:0,reasoningTokens:0,costUSD:0,tools:I,bashCommands:[],timestamp:a.timestamp??"",speed:"standard",deduplicationKey:_,userMessage:i,sessionId:r},i=""}}}}}async function nj(e){let t=[],n;try{n=await JN(e)}catch{return t}for(let r of n){let o=Zf(e,r,"events.jsonl");if(!(await KN(o).catch(()=>null))?.isFile())continue;let i=r;try{let c=await Gv(Zf(e,r,"workspace.yaml"),"utf-8"),a=ej(c);a&&(i=Yv(a))}catch{}t.push({path:o,project:i,provider:"copilot"})}return t}var XN,Xv,QN,Qv,Zv=V(()=>{"use strict";XN={"gpt-4.1-nano":"GPT-4.1 Nano","gpt-4.1-mini":"GPT-4.1 Mini","gpt-4.1":"GPT-4.1","gpt-4o-mini":"GPT-4o Mini","gpt-4o":"GPT-4o","gpt-5-mini":"GPT-5 Mini","gpt-5":"GPT-5","claude-sonnet-4-5":"Sonnet 4.5","claude-sonnet-4":"Sonnet 4","claude-3-7-sonnet":"Sonnet 3.7","claude-3-5-sonnet":"Sonnet 3.5","o4-mini":"o4-mini",o3:"o3"},Xv={bash:"Bash",read_file:"Read",write_file:"Edit",edit_file:"Edit",create_file:"Write",delete_file:"Delete",search_files:"Grep",find_files:"Glob",list_directory:"LS",web_search:"WebSearch",fetch_webpage:"WebFetch",github_repo:"GitHub"},QN=Object.entries(XN).sort((e,t)=>t[0].length-e[0].length);u(ZN,"getCopilotSessionStateDir");u(ej,"parseCwd");u(tj,"createParser");u(nj,"discoverSessionsInDir");Qv={name:"copilot",displayName:"GitHub Copilot",modelDisplayName(e){for(let[t,n]of QN)if(e===t||e.startsWith(t+"-"))return n;return e},toolDisplayName(e){return Xv[e]??e},async discoverSessions(){return nj(ZN())},createSessionParser(e,t){return tj(e,t)}}});import{readdir as eI,readFile as nI,stat as tI}from"fs/promises";import{basename as rI,join as eg}from"path";import{homedir as rj}from"os";function ij(){return eg(rj(),".pi","agent","sessions")}async function aj(e){try{let n=(await nI(e,"utf-8")).split(`
71
+ `)[0];return n?.trim()?JSON.parse(n):null}catch{return null}}function cj(e){return e.split(/[;&|]+/).map(t=>t.trim().split(/\s+/)[0]).filter(Boolean)}async function uj(e){let t=[],n;try{n=await eI(e)}catch{return t}for(let r of n){let o=eg(e,r);if(!(await tI(o).catch(()=>null))?.isDirectory())continue;let i;try{i=await eI(o)}catch{continue}for(let c of i){if(!c.endsWith(".jsonl"))continue;let a=eg(o,c);if(!(await tI(a).catch(()=>null))?.isFile())continue;let m=await aj(a);if(!m||m.type!=="session")continue;let p=m.cwd??r;t.push({path:a,project:rI(p),provider:"pi"})}}return t}function dj(e,t){return{async*parse(){let n;try{n=await nI(e.path,"utf-8")}catch{return}let r=n.split(`
72
+ `).filter(i=>i.trim()),o=rI(e.path,".jsonl"),s="";for(let[i,c]of r.entries()){let a;try{a=JSON.parse(c)}catch{continue}if(a.type==="session"){o=a.id??o;continue}if(a.type!=="message")continue;let l=a.message;if(!l)continue;if(l.role==="user"){let E=(l.content??[]).filter(R=>R.type==="text").map(R=>R.text??"").filter(Boolean);E.length>0&&(s=E.join(" "));continue}if(l.role!=="assistant"||!l.usage)continue;let{input:m,output:p,cacheRead:_,cacheWrite:I}=l.usage;if(m===0&&p===0)continue;let h=l.model??"gpt-5",f=l.responseId??"",w=`pi:${e.path}:${f||a.id||a.timestamp||String(i)}`;if(t.has(w))continue;t.add(w);let b=(l.content??[]).filter(E=>E.type==="toolCall"&&E.name),v=b.map(E=>oI[E.name]??E.name),S=b.filter(E=>E.name==="bash").flatMap(E=>{let R=E.arguments?.command;return typeof R=="string"?cj(R):[]}),A=a.timestamp??"";yield{provider:"pi",model:h,inputTokens:m,outputTokens:p,cacheCreationInputTokens:I,cacheReadInputTokens:_,cachedInputTokens:_,reasoningTokens:0,costUSD:0,tools:v,bashCommands:S,timestamp:A,speed:"standard",deduplicationKey:w,userMessage:s,sessionId:o},s=""}}}}var oj,oI,sj,sI,iI=V(()=>{"use strict";oj={"gpt-5.4":"GPT-5.4","gpt-5.4-mini":"GPT-5.4 Mini","gpt-5":"GPT-5","gpt-4o":"GPT-4o","gpt-4o-mini":"GPT-4o Mini"},oI={bash:"Bash",read:"Read",edit:"Edit",write:"Write",glob:"Glob",grep:"Grep",task:"Agent",dispatch_agent:"Agent",fetch:"WebFetch",search:"WebSearch",todo:"TodoWrite",patch:"Patch"},sj=Object.entries(oj).sort((e,t)=>t[0].length-e[0].length);u(ij,"getPiSessionsDir");u(aj,"readFirstEntry");u(cj,"extractBashCommands");u(uj,"discoverSessionsInDir");u(dj,"createParser");sI={name:"pi",displayName:"Pi",modelDisplayName(e){for(let[t,n]of sj)if(e.startsWith(t))return n;return e},toolDisplayName(e){return oI[e]??e},async discoverSessions(){return uj(ij())},createSessionParser(e,t){return dj(e,t)}}});var cI={};to(cI,{cursor:()=>yj});import{existsSync as lj}from"fs";import{join as tg}from"path";import{homedir as ng}from"os";function aI(){if(ol)return!0;try{return ol=Rm("better-sqlite3"),!0}catch{return!1}}function fj(){return process.platform==="darwin"?tg(ng(),"Library","Application Support","Cursor","User","globalStorage","state.vscdb"):process.platform==="win32"?tg(ng(),"AppData","Roaming","Cursor","User","globalStorage","state.vscdb"):tg(ng(),".config","Cursor","User","globalStorage","state.vscdb")}function gj(e){return!e||e==="default"?mj:e}function _j(e,t){return{async*parse(){if(!aI()||!ol)return;let n;try{n=new ol(e.path,{readonly:!0})}catch{return}try{let o=n.prepare(hj).all();for(let s of o){let i=s.input_tokens??0,c=s.output_tokens??0;if(i===0&&c===0)continue;let a=s.created_at??"",l=s.conversation_id??"unknown",m=`cursor:${l}:${a}:${i}:${c}`;if(t.has(m))continue;t.add(m);let p=gj(s.model);yield{provider:"cursor",model:s.model??"default",inputTokens:i,outputTokens:c,cacheCreationInputTokens:0,cacheReadInputTokens:0,cachedInputTokens:0,reasoningTokens:0,costUSD:0,tools:[],bashCommands:[],timestamp:a,speed:"standard",deduplicationKey:m,userMessage:s.user_text??"",sessionId:l}}}finally{n.close()}}}}var ol,mj,pj,hj,yj,uI=V(()=>{"use strict";ol=null;u(aI,"loadSqlite");mj="claude-sonnet-4-5",pj={"claude-4.5-opus-high-thinking":"Opus 4.5 (Thinking)","claude-4-opus":"Opus 4","claude-4-sonnet-thinking":"Sonnet 4 (Thinking)","claude-4.5-sonnet-thinking":"Sonnet 4.5 (Thinking)","claude-4.6-sonnet":"Sonnet 4.6","composer-1":"Composer 1","gpt-5":"GPT-5","gpt-4.1":"GPT-4.1",default:"Auto (Sonnet est.)"};u(fj,"getCursorDbPath");u(gj,"resolveModel");hj=`
73
73
  SELECT
74
74
  json_extract(value, '$.tokenCount.inputTokens') as input_tokens,
75
75
  json_extract(value, '$.tokenCount.outputTokens') as output_tokens,
@@ -81,24 +81,24 @@ Return valid JSON only.`}function ZI(e){try{let t=e.match(/\{[\s\S]*\}/);if(!t)r
81
81
  WHERE key LIKE 'bubbleId:%'
82
82
  AND json_extract(value, '$.tokenCount.inputTokens') > 0
83
83
  ORDER BY json_extract(value, '$.createdAt') ASC
84
- `;d(lC,"createParser");pC={name:"cursor",displayName:"Cursor",modelDisplayName(e){return aC[e]??e},toolDisplayName(e){return e},async discoverSessions(){if(!wb())return[];let e=cC();return sC(e)?[{path:e,project:"cursor",provider:"cursor"}]:[]},createSessionParser(e,t){return lC(e,t)}}});var Ab={};to(Ab,{opencode:()=>IC});import{readdir as mC}from"fs/promises";import{join as ig}from"path";import{homedir as fC}from"os";function ag(){if(Oi)return!0;try{return Oi=kp("better-sqlite3"),!0}catch{return!1}}function bb(e){return e.replace(/^\//,"").replace(/\//g,"-")}function gC(){let e=process.env.XDG_DATA_HOME??ig(fC(),".local","share");return ig(e,"opencode")}async function hC(e){try{return(await mC(e)).filter(n=>n.startsWith("opencode")&&n.endsWith(".db")).map(n=>ig(e,n))}catch{return[]}}function _C(e){let t=e<1e12?e*1e3:e;return new Date(t).toISOString()}function yC(e){return e.split(/[;&|]+/).map(t=>t.trim().split(/\s+/)[0]).filter(Boolean)}function wC(e,t){return{async*parse(){if(!ag()||!Oi)return;let n=e.path.split(":"),r=n[n.length-1],o=n.slice(0,-1).join(":"),s;try{s=new Oi(o,{readonly:!0})}catch{return}try{let i=s.prepare("SELECT id, time_created, data FROM message WHERE session_id = ? ORDER BY time_created ASC").all(r),a=s.prepare("SELECT message_id, data FROM part WHERE session_id = ? ORDER BY message_id, id").all(r),c=new Map;for(let p of a)try{let m=JSON.parse(p.data),y=c.get(p.message_id)??[];y.push(m),c.set(p.message_id,y)}catch{}let l="";for(let p of i){let m;try{m=JSON.parse(p.data)}catch{continue}if(m.role==="user"){let S=(c.get(p.id)??[]).filter(A=>A.type==="text").map(()=>"").filter(Boolean);S.length>0&&(l=S.join(" "));continue}if(m.role!=="assistant")continue;let y={input:m.tokens?.input??0,output:m.tokens?.output??0,reasoning:m.tokens?.reasoning??0,cacheRead:m.tokens?.cache?.read??0,cacheWrite:m.tokens?.cache?.write??0};if(y.input===0&&y.output===0&&y.reasoning===0&&y.cacheRead===0&&y.cacheWrite===0&&(m.cost??0)===0)continue;let f=(c.get(p.id)??[]).filter(S=>S.type==="tool"),w=f.map(S=>Sb[S.tool??""]??S.tool??"").filter(Boolean),b=f.filter(S=>S.tool==="bash"&&typeof S.state?.input?.command=="string").flatMap(S=>yC(S.state.input.command)),I=`opencode:${r}:${p.id}`;t.has(I)||(t.add(I),yield{provider:"opencode",model:m.modelID??"unknown",inputTokens:y.input,outputTokens:y.output,cacheCreationInputTokens:y.cacheWrite,cacheReadInputTokens:y.cacheRead,cachedInputTokens:y.cacheRead,reasoningTokens:y.reasoning,costUSD:m.cost??0,tools:w,bashCommands:b,timestamp:_C(p.time_created),speed:"standard",deduplicationKey:I,userMessage:l,sessionId:r})}}finally{s.close()}}}}async function vC(e){if(!ag()||!Oi)return[];let t;try{t=new Oi(e,{readonly:!0})}catch{return[]}try{return t.prepare("SELECT id, directory, title FROM session WHERE time_archived IS NULL AND parent_id IS NULL ORDER BY time_created DESC").all().map(r=>({path:`${e}:${r.id}`,project:r.directory?bb(r.directory):bb(r.title),provider:"opencode"}))}catch{return[]}finally{t.close()}}var Oi,Sb,IC,Eb=J(()=>{"use strict";Oi=null;d(ag,"loadSqlite");Sb={bash:"Bash",read:"Read",edit:"Edit",write:"Write",glob:"Glob",grep:"Grep",task:"Agent",fetch:"WebFetch",search:"WebSearch",todo:"TodoWrite",skill:"Skill",patch:"Patch"};d(bb,"sanitize");d(gC,"getDataDir");d(hC,"findDbFiles");d(_C,"parseTimestamp");d(yC,"extractBashCommands");d(wC,"createParser");d(vC,"discoverFromDb");IC={name:"opencode",displayName:"OpenCode",modelDisplayName(e){return e.replace(/^[^/]+\//,"")},toolDisplayName(e){return Sb[e]??e},async discoverSessions(){if(!ag())return[];let e=await hC(gC()),t=[];for(let n of e)t.push(...await vC(n));return t},createSessionParser(e,t){return wC(e,t)}}});async function Nb(){if(Tb)return xb;Tb=!0;try{let{cursor:e}=await Promise.resolve().then(()=>(Ib(),vb));return xb=e,e}catch{return null}}async function Pb(){if(kb)return Rb;kb=!0;try{let{opencode:e}=await Promise.resolve().then(()=>(Eb(),Ab));return Rb=e,e}catch{return null}}async function cg(){let[e,t]=await Promise.all([Nb(),Pb()]),n=[...jb];return e&&n.push(e),t&&n.push(t),n}async function Cb(e){let t=await cg(),n=e&&e!=="all"?t.filter(o=>o.name===e):t,r=[];for(let o of n){let s=await o.discoverSessions();r.push(...s)}return r}async function Ob(e){return e==="cursor"?await Nb()??void 0:e==="opencode"?await Pb()??void 0:jb.find(t=>t.name===e)}var jb,xb,Tb,Rb,kb,Db=J(()=>{"use strict";nb();ib();lb();yb();jb=[tb,sb,ub,_b],xb=null,Tb=!1;d(Nb,"loadCursor");Rb=null,kb=!1;d(Pb,"loadOpenCode");d(cg,"getAllProviders");d(Cb,"discoverAllSessions");d(Ob,"getProvider")});import{spawn as bC}from"node:child_process";function il(e){return`rm-${e.trim().replace(/[^A-Za-z0-9_.-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,80)||"session"}`}function al(e){let t=e.runId?["env",`RULEMETRIC_RUN_ID=${e.runId}`,"claude"]:["claude"];return e.resumeSessionId&&t.push("--resume",e.resumeSessionId),e.model&&t.push("--model",e.model),["new-session","-d","-s",e.sessionName,"-c",e.projectPath,"--",...t]}function jc(e,t,n={}){return n.literal===!1?["send-keys","-t",e,t]:["send-keys","-t",e,"-l","--",t]}function Mb(e){return["has-session","-t",e]}function Nc(e){return`tmux attach -t ${e}`}function SC(){let e=["/opt/homebrew/bin","/usr/local/bin"],t=(process.env.PATH??"").split(":").filter(Boolean),n=e.filter(r=>!t.includes(r));return n.length===0?process.env:{...process.env,PATH:[...t,...n].join(":")}}function dg(e){return new Promise(t=>{let n=bC("tmux",e,{stdio:["ignore","ignore","pipe"],env:SC()}),r="";n.stderr.on("data",o=>{r+=o.toString()}),n.on("close",o=>t({code:o,stderr:r})),n.on("error",o=>t({code:null,stderr:o.message}))})}async function Lb(){return(await dg(["-V"])).code===0}var ug=J(()=>{"use strict";d(il,"sanitizeTmuxName");d(al,"buildTmuxLaunchArgs");d(jc,"buildTmuxSendKeysArgs");d(Mb,"buildTmuxHasSessionArgs");d(Nc,"buildTmuxAttachCommand");d(SC,"tmuxSpawnEnv");d(dg,"runTmux");d(Lb,"isTmuxAvailable")});import{spawn as lg}from"node:child_process";import{randomUUID as AC}from"node:crypto";import{writeFile as $b}from"node:fs/promises";import{tmpdir as qb}from"node:os";import{join as Ub}from"node:path";function xC(e){if(e!==void 0){if(EC.test(e))return e;console.warn(`[claude-code-launcher] dropping non-uuid runId (RULEMETRIC_RUN_ID not injected): ${JSON.stringify(e)}`)}}function TC(e){return`'${e.replace(/'/g,"'\\''")}'`}var EC,cl,Hb=J(()=>{"use strict";ug();EC=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;d(xC,"validateRunId");d(TC,"shellSingleQuote");cl=class{static{d(this,"ClaudeCodeLauncher")}options;tool="claude_code";constructor(t={}){this.options=t}capabilities={headless:!0,interactive:!0,remoteSpawn:!0};async launch(t){let n=AC(),r={...t,runId:xC(t.runId)};return r.mode==="headless"?this.launchHeadless(r,n):this.launchInteractive(r,n)}async launchHeadless(t,n){let r=["-p",t.prompt??"","--output-format","json"];t.systemPrompt&&r.push("--system-prompt",t.systemPrompt),t.model&&r.push("--model",t.model);let o={...process.env};return delete o.CLAUDECODE,delete o.HTTPS_PROXY,t.runId&&(o.RULEMETRIC_RUN_ID=t.runId),new Promise(s=>{let i=lg("claude",r,{cwd:t.projectPath,env:o,stdio:["ignore","pipe","pipe"]}),a="",c="";i.stdout.on("data",p=>{a+=p.toString()}),i.stderr.on("data",p=>{c+=p.toString()});let l=t.timeout?setTimeout(()=>{i.kill("SIGTERM")},t.timeout):null;i.on("close",p=>{l&&clearTimeout(l);let m=a;try{let y=JSON.parse(a);m=y.result??y.content??a}catch{}s({sessionId:n,pid:i.pid,exitCode:p,output:m,error:p!==0?c:void 0})}),i.on("error",p=>{l&&clearTimeout(l),s({sessionId:n,error:`Failed to spawn claude: ${p.message}`})})})}async launchInteractive(t,n){return await(this.options.tmuxAvailable??Lb)().catch(()=>!1)?this.launchInteractiveTmux(t,n):this.launchInteractiveTerminal(t,n,"tmux_not_found")}async launchInteractiveTmux(t,n){let r=this.options.runTmux??dg,o=il(`claude-${t.resumeSessionId??n}`),s=await r(al({sessionName:o,projectPath:t.projectPath,resumeSessionId:t.resumeSessionId,model:t.model,runId:t.runId}));if(s.code!==0)return this.launchInteractiveTerminal(t,n,"tmux_launch_failed",`tmux new-session exited ${s.code}: ${s.stderr.trim()||"no stderr"}`);let i=await this.openTerminalAttach(o,n);if(t.prompt){let a=await r(jc(o,t.prompt));if(a.code!==0)return{sessionId:n,liveSendAvailable:!1,fallbackReason:"tmux_launch_failed",error:`tmux send-keys exited ${a.code}: ${a.stderr.trim()||"no stderr"}`};let c=await r(jc(o,"Enter",{literal:!1}));if(c.code!==0)return{sessionId:n,liveSendAvailable:!1,fallbackReason:"tmux_launch_failed",error:`tmux send Enter exited ${c.code}: ${c.stderr.trim()||"no stderr"}`}}return{sessionId:n,pid:i.pid,liveSendAvailable:!0,...i.error?{error:i.error}:{},terminalTarget:{kind:"tmux",target:o,attachCommand:Nc(o),live:!0}}}async openTerminalAttach(t,n){let r=Ub(qb(),`rulemetric-attach-${n}.command`),o=`#!/bin/zsh
84
+ `;u(_j,"createParser");yj={name:"cursor",displayName:"Cursor",modelDisplayName(e){return pj[e]??e},toolDisplayName(e){return e},async discoverSessions(){if(!aI())return[];let e=fj();return lj(e)?[{path:e,project:"cursor",provider:"cursor"}]:[]},createSessionParser(e,t){return _j(e,t)}}});var mI={};to(mI,{opencode:()=>Tj});import{readdir as wj}from"fs/promises";import{join as rg}from"path";import{homedir as vj}from"os";function og(){if(Di)return!0;try{return Di=Rm("better-sqlite3"),!0}catch{return!1}}function dI(e){return e.replace(/^\//,"").replace(/\//g,"-")}function Ij(){let e=process.env.XDG_DATA_HOME??rg(vj(),".local","share");return rg(e,"opencode")}async function bj(e){try{return(await wj(e)).filter(n=>n.startsWith("opencode")&&n.endsWith(".db")).map(n=>rg(e,n))}catch{return[]}}function Sj(e){let t=e<1e12?e*1e3:e;return new Date(t).toISOString()}function Aj(e){return e.split(/[;&|]+/).map(t=>t.trim().split(/\s+/)[0]).filter(Boolean)}function Ej(e,t){return{async*parse(){if(!og()||!Di)return;let n=e.path.split(":"),r=n[n.length-1],o=n.slice(0,-1).join(":"),s;try{s=new Di(o,{readonly:!0})}catch{return}try{let i=s.prepare("SELECT id, time_created, data FROM message WHERE session_id = ? ORDER BY time_created ASC").all(r),c=s.prepare("SELECT message_id, data FROM part WHERE session_id = ? ORDER BY message_id, id").all(r),a=new Map;for(let m of c)try{let p=JSON.parse(m.data),_=a.get(m.message_id)??[];_.push(p),a.set(m.message_id,_)}catch{}let l="";for(let m of i){let p;try{p=JSON.parse(m.data)}catch{continue}if(p.role==="user"){let S=(a.get(m.id)??[]).filter(A=>A.type==="text").map(()=>"").filter(Boolean);S.length>0&&(l=S.join(" "));continue}if(p.role!=="assistant")continue;let _={input:p.tokens?.input??0,output:p.tokens?.output??0,reasoning:p.tokens?.reasoning??0,cacheRead:p.tokens?.cache?.read??0,cacheWrite:p.tokens?.cache?.write??0};if(_.input===0&&_.output===0&&_.reasoning===0&&_.cacheRead===0&&_.cacheWrite===0&&(p.cost??0)===0)continue;let f=(a.get(m.id)??[]).filter(S=>S.type==="tool"),w=f.map(S=>lI[S.tool??""]??S.tool??"").filter(Boolean),b=f.filter(S=>S.tool==="bash"&&typeof S.state?.input?.command=="string").flatMap(S=>Aj(S.state.input.command)),v=`opencode:${r}:${m.id}`;t.has(v)||(t.add(v),yield{provider:"opencode",model:p.modelID??"unknown",inputTokens:_.input,outputTokens:_.output,cacheCreationInputTokens:_.cacheWrite,cacheReadInputTokens:_.cacheRead,cachedInputTokens:_.cacheRead,reasoningTokens:_.reasoning,costUSD:p.cost??0,tools:w,bashCommands:b,timestamp:Sj(m.time_created),speed:"standard",deduplicationKey:v,userMessage:l,sessionId:r})}}finally{s.close()}}}}async function xj(e){if(!og()||!Di)return[];let t;try{t=new Di(e,{readonly:!0})}catch{return[]}try{return t.prepare("SELECT id, directory, title FROM session WHERE time_archived IS NULL AND parent_id IS NULL ORDER BY time_created DESC").all().map(r=>({path:`${e}:${r.id}`,project:r.directory?dI(r.directory):dI(r.title),provider:"opencode"}))}catch{return[]}finally{t.close()}}var Di,lI,Tj,pI=V(()=>{"use strict";Di=null;u(og,"loadSqlite");lI={bash:"Bash",read:"Read",edit:"Edit",write:"Write",glob:"Glob",grep:"Grep",task:"Agent",fetch:"WebFetch",search:"WebSearch",todo:"TodoWrite",skill:"Skill",patch:"Patch"};u(dI,"sanitize");u(Ij,"getDataDir");u(bj,"findDbFiles");u(Sj,"parseTimestamp");u(Aj,"extractBashCommands");u(Ej,"createParser");u(xj,"discoverFromDb");Tj={name:"opencode",displayName:"OpenCode",modelDisplayName(e){return e.replace(/^[^/]+\//,"")},toolDisplayName(e){return lI[e]??e},async discoverSessions(){if(!og())return[];let e=await bj(Ij()),t=[];for(let n of e)t.push(...await xj(n));return t},createSessionParser(e,t){return Ej(e,t)}}});async function wI(){if(gI)return fI;gI=!0;try{let{cursor:e}=await Promise.resolve().then(()=>(uI(),cI));return fI=e,e}catch{return null}}async function vI(){if(_I)return hI;_I=!0;try{let{opencode:e}=await Promise.resolve().then(()=>(pI(),mI));return hI=e,e}catch{return null}}async function sg(){let[e,t]=await Promise.all([wI(),vI()]),n=[...yI];return e&&n.push(e),t&&n.push(t),n}async function II(e){let t=await sg(),n=e&&e!=="all"?t.filter(o=>o.name===e):t,r=[];for(let o of n){let s=await o.discoverSessions();r.push(...s)}return r}async function bI(e){return e==="cursor"?await wI()??void 0:e==="opencode"?await vI()??void 0:yI.find(t=>t.name===e)}var yI,fI,gI,hI,_I,SI=V(()=>{"use strict";Wv();Kv();Zv();iI();yI=[Fv,Jv,Qv,sI],fI=null,gI=!1;u(wI,"loadCursor");hI=null,_I=!1;u(vI,"loadOpenCode");u(sg,"getAllProviders");u(II,"discoverAllSessions");u(bI,"getProvider")});import{spawn as Rj}from"node:child_process";function sl(e){return`rm-${e.trim().replace(/[^A-Za-z0-9_.-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,80)||"session"}`}function il(e){let t=e.runId?["env",`RULEMETRIC_RUN_ID=${e.runId}`,"claude"]:["claude"];return e.resumeSessionId&&t.push("--resume",e.resumeSessionId),e.model&&t.push("--model",e.model),["new-session","-d","-s",e.sessionName,"-c",e.projectPath,"--",...t]}function kc(e,t,n={}){return n.literal===!1?["send-keys","-t",e,t]:["send-keys","-t",e,"-l","--",t]}function AI(e){return["has-session","-t",e]}function Nc(e){return`tmux attach -t ${e}`}function kj(){let e=["/opt/homebrew/bin","/usr/local/bin"],t=(process.env.PATH??"").split(":").filter(Boolean),n=e.filter(r=>!t.includes(r));return n.length===0?process.env:{...process.env,PATH:[...t,...n].join(":")}}function ig(e){return new Promise(t=>{let n=Rj("tmux",e,{stdio:["ignore","ignore","pipe"],env:kj()}),r="";n.stderr.on("data",o=>{r+=o.toString()}),n.on("close",o=>t({code:o,stderr:r})),n.on("error",o=>t({code:null,stderr:o.message}))})}async function EI(){return(await ig(["-V"])).code===0}var ag=V(()=>{"use strict";u(sl,"sanitizeTmuxName");u(il,"buildTmuxLaunchArgs");u(kc,"buildTmuxSendKeysArgs");u(AI,"buildTmuxHasSessionArgs");u(Nc,"buildTmuxAttachCommand");u(kj,"tmuxSpawnEnv");u(ig,"runTmux");u(EI,"isTmuxAvailable")});import{spawn as cg}from"node:child_process";import{randomUUID as Nj}from"node:crypto";import{writeFile as xI}from"node:fs/promises";import{tmpdir as TI}from"node:os";import{join as RI}from"node:path";function Pj(e){if(e!==void 0){if(jj.test(e))return e;console.warn(`[claude-code-launcher] dropping non-uuid runId (RULEMETRIC_RUN_ID not injected): ${JSON.stringify(e)}`)}}function Dj(e){return`'${e.replace(/'/g,"'\\''")}'`}var jj,al,kI=V(()=>{"use strict";ag();jj=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;u(Pj,"validateRunId");u(Dj,"shellSingleQuote");al=class{static{u(this,"ClaudeCodeLauncher")}options;tool="claude_code";constructor(t={}){this.options=t}capabilities={headless:!0,interactive:!0,remoteSpawn:!0};async launch(t){let n=Nj(),r={...t,runId:Pj(t.runId)};return r.mode==="headless"?this.launchHeadless(r,n):this.launchInteractive(r,n)}async launchHeadless(t,n){let r=["-p",t.prompt??"","--output-format","json"];t.systemPrompt&&r.push("--system-prompt",t.systemPrompt),t.model&&r.push("--model",t.model);let o={...process.env};return delete o.CLAUDECODE,delete o.HTTPS_PROXY,t.runId&&(o.RULEMETRIC_RUN_ID=t.runId),new Promise(s=>{let i=cg("claude",r,{cwd:t.projectPath,env:o,stdio:["ignore","pipe","pipe"]}),c="",a="";i.stdout.on("data",m=>{c+=m.toString()}),i.stderr.on("data",m=>{a+=m.toString()});let l=t.timeout?setTimeout(()=>{i.kill("SIGTERM")},t.timeout):null;i.on("close",m=>{l&&clearTimeout(l);let p=c;try{let _=JSON.parse(c);p=_.result??_.content??c}catch{}s({sessionId:n,pid:i.pid,exitCode:m,output:p,error:m!==0?a:void 0})}),i.on("error",m=>{l&&clearTimeout(l),s({sessionId:n,error:`Failed to spawn claude: ${m.message}`})})})}async launchInteractive(t,n){return await(this.options.tmuxAvailable??EI)().catch(()=>!1)?this.launchInteractiveTmux(t,n):this.launchInteractiveTerminal(t,n,"tmux_not_found")}async launchInteractiveTmux(t,n){let r=this.options.runTmux??ig,o=sl(`claude-${t.resumeSessionId??n}`),s=await r(il({sessionName:o,projectPath:t.projectPath,resumeSessionId:t.resumeSessionId,model:t.model,runId:t.runId}));if(s.code!==0)return this.launchInteractiveTerminal(t,n,"tmux_launch_failed",`tmux new-session exited ${s.code}: ${s.stderr.trim()||"no stderr"}`);let i=await this.openTerminalAttach(o,n);if(t.prompt){let c=await r(kc(o,t.prompt));if(c.code!==0)return{sessionId:n,liveSendAvailable:!1,fallbackReason:"tmux_launch_failed",error:`tmux send-keys exited ${c.code}: ${c.stderr.trim()||"no stderr"}`};let a=await r(kc(o,"Enter",{literal:!1}));if(a.code!==0)return{sessionId:n,liveSendAvailable:!1,fallbackReason:"tmux_launch_failed",error:`tmux send Enter exited ${a.code}: ${a.stderr.trim()||"no stderr"}`}}return{sessionId:n,pid:i.pid,liveSendAvailable:!0,...i.error?{error:i.error}:{},terminalTarget:{kind:"tmux",target:o,attachCommand:Nc(o),live:!0}}}async openTerminalAttach(t,n){let r=RI(TI(),`rulemetric-attach-${n}.command`),o=`#!/bin/zsh
85
85
  rm -- "$0"
86
86
  ${Nc(t)}
87
- `;return await $b(r,o,{mode:493}),new Promise(s=>{let i=lg("open",["-a","Terminal",r],{stdio:["ignore","pipe","pipe"]}),a="";i.stderr.on("data",c=>{a+=c.toString()}),i.on("close",c=>{s(c===0?{pid:i.pid}:{pid:i.pid,error:`open attach exited ${c}: ${a.trim()||"no stderr"}`})}),i.on("error",c=>{s({error:`Failed to spawn open attach: ${c.message}`})})})}async launchInteractiveTerminal(t,n,r,o){let s=["claude"];t.resumeSessionId?s.push("--resume",t.resumeSessionId):t.prompt&&s.push("-p",JSON.stringify(t.prompt)),t.model&&s.push("--model",t.model);let i=s.join(" "),a=Ub(qb(),`rulemetric-launch-${n}.command`),c=t.runId?`export RULEMETRIC_RUN_ID=${TC(t.runId)}
87
+ `;return await xI(r,o,{mode:493}),new Promise(s=>{let i=cg("open",["-a","Terminal",r],{stdio:["ignore","pipe","pipe"]}),c="";i.stderr.on("data",a=>{c+=a.toString()}),i.on("close",a=>{s(a===0?{pid:i.pid}:{pid:i.pid,error:`open attach exited ${a}: ${c.trim()||"no stderr"}`})}),i.on("error",a=>{s({error:`Failed to spawn open attach: ${a.message}`})})})}async launchInteractiveTerminal(t,n,r,o){let s=["claude"];t.resumeSessionId?s.push("--resume",t.resumeSessionId):t.prompt&&s.push("-p",JSON.stringify(t.prompt)),t.model&&s.push("--model",t.model);let i=s.join(" "),c=RI(TI(),`rulemetric-launch-${n}.command`),a=t.runId?`export RULEMETRIC_RUN_ID=${Dj(t.runId)}
88
88
  `:"",l=`#!/bin/zsh
89
89
  rm -- "$0"
90
90
  cd ${JSON.stringify(t.projectPath)} || exit
91
- `+c+`${i}
92
- `;return await $b(a,l,{mode:493}),new Promise(p=>{let m=lg("open",["-a","Terminal",a],{stdio:["ignore","pipe","pipe"]}),y="";m.stderr.on("data",v=>{y+=v.toString()}),m.on("close",v=>{if(v===0)p({sessionId:n,pid:m.pid,liveSendAvailable:!1,fallbackReason:r,...o?{error:o}:{}});else{let h=y.trim()||"no stderr";p({sessionId:n,pid:m.pid,liveSendAvailable:!1,fallbackReason:r,error:o?`${o}; open exited ${v}: ${h}`:`open exited ${v}: ${h}`})}}),m.on("error",v=>{p({sessionId:n,liveSendAvailable:!1,fallbackReason:r,error:`Failed to spawn open: ${v.message}`})})})}}});import{spawn as Bb}from"node:child_process";import{randomUUID as RC}from"node:crypto";var dl,Fb=J(()=>{"use strict";dl=class{static{d(this,"CodexLauncher")}tool="codex";capabilities={headless:!0,interactive:!0,remoteSpawn:!0};async launch(t){let n=RC();return t.mode==="headless"?this.launchHeadless(t,n):this.launchInteractive(t,n)}launchHeadless(t,n){let r=["-q",t.prompt??""];return t.model&&r.push("--model",t.model),new Promise(o=>{let s=Bb("codex",r,{cwd:t.projectPath,stdio:["ignore","pipe","pipe"]}),i="",a="";s.stdout.on("data",l=>{i+=l.toString()}),s.stderr.on("data",l=>{a+=l.toString()});let c=t.timeout?setTimeout(()=>{s.kill("SIGTERM")},t.timeout):null;s.on("close",l=>{c&&clearTimeout(c),o({sessionId:n,pid:s.pid,exitCode:l,output:i,error:l!==0?a:void 0})}),s.on("error",l=>{c&&clearTimeout(c),o({sessionId:n,error:`Failed to spawn codex: ${l.message}`})})})}launchInteractive(t,n){let r=["codex"];t.prompt&&r.push(JSON.stringify(t.prompt));let o=`cd ${JSON.stringify(t.projectPath)} && ${r.join(" ")}`,s=Bb("osascript",["-e",`tell application "Terminal" to do script ${JSON.stringify(o)}`],{stdio:"ignore",detached:!0});return s.unref(),Promise.resolve({sessionId:n,pid:s.pid})}}});import{spawn as Wb}from"node:child_process";import{randomUUID as kC}from"node:crypto";var ul,zb=J(()=>{"use strict";ul=class{static{d(this,"AiderLauncher")}tool="aider";capabilities={headless:!0,interactive:!0,remoteSpawn:!0};async launch(t){let n=kC();return t.mode==="headless"?this.launchHeadless(t,n):this.launchInteractive(t,n)}launchHeadless(t,n){let r=["--message",t.prompt??"","--yes"];return t.model&&r.push("--model",t.model),new Promise(o=>{let s=Wb("aider",r,{cwd:t.projectPath,stdio:["ignore","pipe","pipe"]}),i="",a="";s.stdout.on("data",l=>{i+=l.toString()}),s.stderr.on("data",l=>{a+=l.toString()});let c=t.timeout?setTimeout(()=>{s.kill("SIGTERM")},t.timeout):null;s.on("close",l=>{c&&clearTimeout(c),o({sessionId:n,pid:s.pid,exitCode:l,output:i,error:l!==0?a:void 0})}),s.on("error",l=>{c&&clearTimeout(c),o({sessionId:n,error:`Failed to spawn aider: ${l.message}`})})})}launchInteractive(t,n){let r=["aider"];t.model&&r.push("--model",t.model);let o=`cd ${JSON.stringify(t.projectPath)} && ${r.join(" ")}`,s=Wb("osascript",["-e",`tell application "Terminal" to do script ${JSON.stringify(o)}`],{stdio:"ignore",detached:!0});return s.unref(),Promise.resolve({sessionId:n,pid:s.pid})}}});import{spawn as jC}from"node:child_process";import{randomUUID as NC}from"node:crypto";var ll,Vb=J(()=>{"use strict";ll=class{static{d(this,"GenericLauncher")}tool;constructor(t){this.tool=t}capabilities={headless:!1,interactive:!0,remoteSpawn:!1};async launch(t){let n=NC();if(t.mode==="headless")return{sessionId:n,error:`${this.tool} does not support headless mode`};let r=`cd ${JSON.stringify(t.projectPath)} && echo "Session ${n} \u2014 tool: ${this.tool}" && exec $SHELL`,o=jC("osascript",["-e",`tell application "Terminal" to do script ${JSON.stringify(r)}`],{stdio:"ignore",detached:!0});return o.unref(),{sessionId:n,pid:o.pid}}}});function Gb(e){let t=Jb[e];return t?t():new ll(e)}function Kb(){return Object.entries(Jb).map(([e,t])=>({tool:e,capabilities:t().capabilities}))}var Jb,Yb=J(()=>{"use strict";Hb();Fb();zb();Vb();Jb={claude_code:d(()=>new cl,"claude_code"),codex:d(()=>new dl,"codex"),aider:d(()=>new ul,"aider")};d(Gb,"getLauncher");d(Kb,"getAvailableLaunchers")});import Xb from"node:path";function pg(e){return e.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^[-.]+|[-.]+$/g,"")||"worktree"}function pl(e){return Xb.resolve(e.basePath??Xb.join(e.repoRoot,"..",".rulemetric-worktrees",pg(e.branch)))}var Qb=J(()=>{"use strict";d(pg,"sanitizeBranch");d(pl,"worktreePathFor")});var Zb={};to(Zb,{ClaudeCodeAdapter:()=>Ti,CodexAdapter:()=>Pi,CopilotAgentAdapter:()=>ji,CursorAdapter:()=>Ri,RuleMetricMcpAdapter:()=>Ni,SESSION_EVENT_TYPES:()=>wP,SESSION_TOOLS:()=>yP,VSCodeCopilotAdapter:()=>ki,buildAnalysisPrompt:()=>QI,buildTmuxAttachCommand:()=>Nc,buildTmuxHasSessionArgs:()=>Mb,buildTmuxLaunchArgs:()=>al,buildTmuxSendKeysArgs:()=>jc,detectTool:()=>kc,discoverAllSessions:()=>Cb,freshCodexState:()=>Qf,getAdapter:()=>Rc,getAllProviders:()=>cg,getAvailableLaunchers:()=>Kb,getLauncher:()=>Gb,getProvider:()=>Ob,parseAnalysisResponse:()=>ZI,sanitizeBranch:()=>pg,sanitizeTmuxName:()=>il,worktreePathFor:()=>pl});var ml=J(()=>{"use strict";KI();Jf();Gf();Kf();Yf();Xf();Zf();XI();eb();Db();Yb();Qb();ug()});var a0={};to(a0,{getSupabaseAdmin:()=>Pn});import{createClient as WC}from"@supabase/supabase-js";function Pn(){if(yl)return yl;let e=process.env.SUPABASE_URL,t=process.env.SUPABASE_SERVICE_ROLE_KEY;if(!e||!t)throw new Error("SUPABASE_URL and SUPABASE_SERVICE_ROLE_KEY are required for admin operations");return yl=WC(e,t,{auth:{autoRefreshToken:!1,persistSession:!1}}),yl}var yl,Pc=J(()=>{"use strict";yl=null;d(Pn,"getSupabaseAdmin")});var l0={};to(l0,{SNAPSHOT_DELTA_BUCKET:()=>gg,decodeDeltaBlob:()=>c0,encodeDeltaBlob:()=>hg,getDeltaBlob:()=>Cc,resolveDeltaPage:()=>Oc,resolveFullRows:()=>yg,uploadEncodedDelta:()=>_g});import{gzipSync as zC,gunzipSync as VC}from"node:zlib";import{createHash as JC}from"node:crypto";function hg(e){let t=JSON.stringify(e??[]),n=zC(Buffer.from(t,"utf-8")),r=JC("sha256").update(n).digest("hex");return{body:n,ref:`sha256/${r}.json.gz`,bytes:n.byteLength}}function c0(e){try{let t=VC(Buffer.from(e)).toString("utf-8"),n=JSON.parse(t);return Array.isArray(n)?n:[]}catch{return[]}}async function _g(e){let{body:t,ref:n,bytes:r}=e,{error:o}=await Pn().storage.from(gg).upload(n,t,{contentType:"application/gzip",upsert:!0});if(o)throw new Error(`uploadEncodedDelta failed for ${n}: ${o.message}`);return{ref:n,bytes:r}}async function Cc(e){let{data:t,error:n}=await Pn().storage.from(gg).download(e);if(n||!t)return console.warn(`[storage-blobs] delta.source=storage_miss ref=${e} err=${n?.message??"no data"}`),[];let r=Buffer.from(await t.arrayBuffer());return c0(r)}function wl(e){return typeof e.messagesDeltaRef=="string"&&e.messagesDeltaRef.length>0}async function u0(e,t,n){let r=new Array(e.length),o=0,s=d(async()=>{for(;;){let i=o++;if(i>=e.length)return;r[i]=await n(e[i])}},"worker");return await Promise.all(Array.from({length:Math.min(t,e.length)},s)),r}async function Oc(e){return e.some(wl)?u0(e,d0,async t=>({sequence:t.sequence,messagesDelta:wl(t)?await Cc(t.messagesDeltaRef):t.messagesDelta})):e.map(t=>({sequence:t.sequence,messagesDelta:t.messagesDelta}))}async function yg(e){return e.some(wl)?u0(e,d0,async t=>wl(t)?{...t,messagesDelta:await Cc(t.messagesDeltaRef)}:t):e}var gg,d0,vl=J(()=>{"use strict";Pc();gg="snapshot-deltas";d(hg,"encodeDeltaBlob");d(c0,"decodeDeltaBlob");d(_g,"uploadEncodedDelta");d(Cc,"getDeltaBlob");d0=8;d(wl,"hasRef");d(u0,"mapCapped");d(Oc,"resolveDeltaPage");d(yg,"resolveFullRows")});var YA={};to(YA,{resolveRuntimeWebConfig:()=>KA,stampRuntimeConfig:()=>Gq});function KA(e=process.env){let t=e.SUPABASE_URL?.trim(),n=e.SUPABASE_ANON_KEY?.trim();return!t||!n?null:{supabaseUrl:t,supabaseAnonKey:n}}function Gq(e,t=process.env){let n=KA(t);if(!n)return e;let o=`<script>window.__RM_CONFIG=${JSON.stringify(n).replace(/</g,"\\u003c")}</script>`;return e.includes("</head>")?e.replace("</head>",`${o}
91
+ `+a+`${i}
92
+ `;return await xI(c,l,{mode:493}),new Promise(m=>{let p=cg("open",["-a","Terminal",c],{stdio:["ignore","pipe","pipe"]}),_="";p.stderr.on("data",I=>{_+=I.toString()}),p.on("close",I=>{if(I===0)m({sessionId:n,pid:p.pid,liveSendAvailable:!1,fallbackReason:r,...o?{error:o}:{}});else{let h=_.trim()||"no stderr";m({sessionId:n,pid:p.pid,liveSendAvailable:!1,fallbackReason:r,error:o?`${o}; open exited ${I}: ${h}`:`open exited ${I}: ${h}`})}}),p.on("error",I=>{m({sessionId:n,liveSendAvailable:!1,fallbackReason:r,error:`Failed to spawn open: ${I.message}`})})})}}});import{spawn as NI}from"node:child_process";import{randomUUID as Oj}from"node:crypto";var cl,jI=V(()=>{"use strict";cl=class{static{u(this,"CodexLauncher")}tool="codex";capabilities={headless:!0,interactive:!0,remoteSpawn:!0};async launch(t){let n=Oj();return t.mode==="headless"?this.launchHeadless(t,n):this.launchInteractive(t,n)}launchHeadless(t,n){let r=["-q",t.prompt??""];return t.model&&r.push("--model",t.model),new Promise(o=>{let s=NI("codex",r,{cwd:t.projectPath,stdio:["ignore","pipe","pipe"]}),i="",c="";s.stdout.on("data",l=>{i+=l.toString()}),s.stderr.on("data",l=>{c+=l.toString()});let a=t.timeout?setTimeout(()=>{s.kill("SIGTERM")},t.timeout):null;s.on("close",l=>{a&&clearTimeout(a),o({sessionId:n,pid:s.pid,exitCode:l,output:i,error:l!==0?c:void 0})}),s.on("error",l=>{a&&clearTimeout(a),o({sessionId:n,error:`Failed to spawn codex: ${l.message}`})})})}launchInteractive(t,n){let r=["codex"];t.prompt&&r.push(JSON.stringify(t.prompt));let o=`cd ${JSON.stringify(t.projectPath)} && ${r.join(" ")}`,s=NI("osascript",["-e",`tell application "Terminal" to do script ${JSON.stringify(o)}`],{stdio:"ignore",detached:!0});return s.unref(),Promise.resolve({sessionId:n,pid:s.pid})}}});import{spawn as PI}from"node:child_process";import{randomUUID as Cj}from"node:crypto";var ul,DI=V(()=>{"use strict";ul=class{static{u(this,"AiderLauncher")}tool="aider";capabilities={headless:!0,interactive:!0,remoteSpawn:!0};async launch(t){let n=Cj();return t.mode==="headless"?this.launchHeadless(t,n):this.launchInteractive(t,n)}launchHeadless(t,n){let r=["--message",t.prompt??"","--yes"];return t.model&&r.push("--model",t.model),new Promise(o=>{let s=PI("aider",r,{cwd:t.projectPath,stdio:["ignore","pipe","pipe"]}),i="",c="";s.stdout.on("data",l=>{i+=l.toString()}),s.stderr.on("data",l=>{c+=l.toString()});let a=t.timeout?setTimeout(()=>{s.kill("SIGTERM")},t.timeout):null;s.on("close",l=>{a&&clearTimeout(a),o({sessionId:n,pid:s.pid,exitCode:l,output:i,error:l!==0?c:void 0})}),s.on("error",l=>{a&&clearTimeout(a),o({sessionId:n,error:`Failed to spawn aider: ${l.message}`})})})}launchInteractive(t,n){let r=["aider"];t.model&&r.push("--model",t.model);let o=`cd ${JSON.stringify(t.projectPath)} && ${r.join(" ")}`,s=PI("osascript",["-e",`tell application "Terminal" to do script ${JSON.stringify(o)}`],{stdio:"ignore",detached:!0});return s.unref(),Promise.resolve({sessionId:n,pid:s.pid})}}});import{spawn as Lj}from"node:child_process";import{randomUUID as Mj}from"node:crypto";var dl,OI=V(()=>{"use strict";dl=class{static{u(this,"GenericLauncher")}tool;constructor(t){this.tool=t}capabilities={headless:!1,interactive:!0,remoteSpawn:!1};async launch(t){let n=Mj();if(t.mode==="headless")return{sessionId:n,error:`${this.tool} does not support headless mode`};let r=`cd ${JSON.stringify(t.projectPath)} && echo "Session ${n} \u2014 tool: ${this.tool}" && exec $SHELL`,o=Lj("osascript",["-e",`tell application "Terminal" to do script ${JSON.stringify(r)}`],{stdio:"ignore",detached:!0});return o.unref(),{sessionId:n,pid:o.pid}}}});function LI(e){let t=CI[e];return t?t():new dl(e)}function MI(){return Object.entries(CI).map(([e,t])=>({tool:e,capabilities:t().capabilities}))}var CI,$I=V(()=>{"use strict";kI();jI();DI();OI();CI={claude_code:u(()=>new al,"claude_code"),codex:u(()=>new cl,"codex"),aider:u(()=>new ul,"aider")};u(LI,"getLauncher");u(MI,"getAvailableLaunchers")});import qI from"node:path";function ug(e){return e.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^[-.]+|[-.]+$/g,"")||"worktree"}function ll(e){return qI.resolve(e.basePath??qI.join(e.repoRoot,"..",".rulemetric-worktrees",ug(e.branch)))}var UI=V(()=>{"use strict";u(ug,"sanitizeBranch");u(ll,"worktreePathFor")});var HI={};to(HI,{ClaudeCodeAdapter:()=>xi,CodexAdapter:()=>ji,CopilotAgentAdapter:()=>ki,CursorAdapter:()=>Ti,RuleMetricMcpAdapter:()=>Ni,SESSION_EVENT_TYPES:()=>EN,SESSION_TOOLS:()=>AN,VSCodeCopilotAdapter:()=>Ri,buildAnalysisPrompt:()=>Uv,buildTmuxAttachCommand:()=>Nc,buildTmuxHasSessionArgs:()=>AI,buildTmuxLaunchArgs:()=>il,buildTmuxSendKeysArgs:()=>kc,detectTool:()=>Rc,discoverAllSessions:()=>II,freshCodexState:()=>Gf,getAdapter:()=>Tc,getAllProviders:()=>sg,getAvailableLaunchers:()=>MI,getLauncher:()=>LI,getProvider:()=>bI,parseAnalysisResponse:()=>Hv,sanitizeBranch:()=>ug,sanitizeTmuxName:()=>sl,worktreePathFor:()=>ll});var ml=V(()=>{"use strict";Mv();Wf();zf();Vf();Jf();Kf();Yf();qv();Bv();SI();$I();UI();ag()});var GI={};to(GI,{getSupabaseAdmin:()=>On});import{createClient as Yj}from"@supabase/supabase-js";function On(){if(_l)return _l;let e=process.env.SUPABASE_URL,t=process.env.SUPABASE_SERVICE_ROLE_KEY;if(!e||!t)throw new Error("SUPABASE_URL and SUPABASE_SERVICE_ROLE_KEY are required for admin operations");return _l=Yj(e,t,{auth:{autoRefreshToken:!1,persistSession:!1}}),_l}var _l,jc=V(()=>{"use strict";_l=null;u(On,"getSupabaseAdmin")});var ZI={};to(ZI,{SNAPSHOT_DELTA_BUCKET:()=>mg,decodeDeltaBlob:()=>YI,encodeDeltaBlob:()=>pg,getDeltaBlob:()=>Pc,resolveDeltaPage:()=>Dc,resolveFullRows:()=>gg,uploadEncodedDelta:()=>fg});import{gzipSync as Xj,gunzipSync as Qj}from"node:zlib";import{createHash as Zj}from"node:crypto";function pg(e){let t=JSON.stringify(e??[]),n=Xj(Buffer.from(t,"utf-8")),r=Zj("sha256").update(n).digest("hex");return{body:n,ref:`sha256/${r}.json.gz`,bytes:n.byteLength}}function YI(e){try{let t=Qj(Buffer.from(e)).toString("utf-8"),n=JSON.parse(t);return Array.isArray(n)?n:[]}catch{return[]}}async function fg(e){let{body:t,ref:n,bytes:r}=e,{error:o}=await On().storage.from(mg).upload(n,t,{contentType:"application/gzip",upsert:!0});if(o)throw new Error(`uploadEncodedDelta failed for ${n}: ${o.message}`);return{ref:n,bytes:r}}async function Pc(e){let{data:t,error:n}=await On().storage.from(mg).download(e);if(n||!t)return console.warn(`[storage-blobs] delta.source=storage_miss ref=${e} err=${n?.message??"no data"}`),[];let r=Buffer.from(await t.arrayBuffer());return YI(r)}function yl(e){return typeof e.messagesDeltaRef=="string"&&e.messagesDeltaRef.length>0}async function QI(e,t,n){let r=new Array(e.length),o=0,s=u(async()=>{for(;;){let i=o++;if(i>=e.length)return;r[i]=await n(e[i])}},"worker");return await Promise.all(Array.from({length:Math.min(t,e.length)},s)),r}async function Dc(e){return e.some(yl)?QI(e,XI,async t=>({sequence:t.sequence,messagesDelta:yl(t)?await Pc(t.messagesDeltaRef):t.messagesDelta})):e.map(t=>({sequence:t.sequence,messagesDelta:t.messagesDelta}))}async function gg(e){return e.some(yl)?QI(e,XI,async t=>yl(t)?{...t,messagesDelta:await Pc(t.messagesDeltaRef)}:t):e}var mg,XI,wl=V(()=>{"use strict";jc();mg="snapshot-deltas";u(pg,"encodeDeltaBlob");u(YI,"decodeDeltaBlob");u(fg,"uploadEncodedDelta");u(Pc,"getDeltaBlob");XI=8;u(yl,"hasRef");u(QI,"mapCapped");u(Dc,"resolveDeltaPage");u(gg,"resolveFullRows")});var $S={};to($S,{resolveRuntimeWebConfig:()=>MS,stampRuntimeConfig:()=>r1});function MS(e=process.env){let t=e.SUPABASE_URL?.trim(),n=e.SUPABASE_ANON_KEY?.trim();return!t||!n?null:{supabaseUrl:t,supabaseAnonKey:n}}function r1(e,t=process.env){let n=MS(t);if(!n)return e;let o=`<script>window.__RM_CONFIG=${JSON.stringify(n).replace(/</g,"\\u003c")}</script>`;return e.includes("</head>")?e.replace("</head>",`${o}
93
93
  </head>`):`${o}
94
- ${e}`}var XA=J(()=>{"use strict";d(KA,"resolveRuntimeWebConfig");d(Gq,"stampRuntimeConfig")});import*as Ip from"node:fs";import*as bp from"node:path";import{fileURLToPath as TU}from"node:url";import{serve as RU}from"@hono/node-server";import{trace as i_,context as TE}from"@opentelemetry/api";import{NodeSDK as RE}from"@opentelemetry/sdk-node";import{OTLPTraceExporter as kE}from"@opentelemetry/exporter-trace-otlp-http";import{BatchSpanProcessor as jE,ConsoleSpanExporter as NE,SimpleSpanProcessor as PE}from"@opentelemetry/sdk-trace-node";import{Resource as CE}from"@opentelemetry/resources";import{ATTR_SERVICE_NAME as OE,ATTR_SERVICE_VERSION as DE}from"@opentelemetry/semantic-conventions";function s_(e){if(!e)return{};let t={};for(let n of e.split(",")){let r=n.indexOf("=");if(r===-1)continue;let o=n.slice(0,r).trim(),s=n.slice(r+1).trim();o&&(t[o]=s)}return t}d(s_,"parseOtlpHeaders");var qs=null;function Us(){return process.env.TELEMETRY_ENABLED!=="false"}d(Us,"isTelemetryEnabled");function jp(e){if(!Us()||qs!==null)return"off";let t=new CE({[OE]:e.serviceName,[DE]:e.serviceVersion??"0.1.0"}),n=process.env.OTEL_EXPORTER_OTLP_ENDPOINT,r,o;if(n){let s=s_(process.env.OTEL_EXPORTER_OTLP_HEADERS),i=new kE({url:`${n}/v1/traces`,headers:s});o=new jE(i),r="otlp"}else if(process.env.OTEL_SPAN_EXPORT==="none")o=void 0,r="silent";else{let s=new NE;o=new PE(s),r="console"}return qs=new RE({resource:t,spanProcessors:o?[o]:[]}),qs.start(),r}d(jp,"initTelemetry");async function Np(){qs&&(await qs.shutdown(),qs=null)}d(Np,"shutdownTelemetry");function Pp(e){return i_.getTracer(e??"rulemetric")}d(Pp,"getTracer");function Cp(){return i_.getSpan(TE.active())?.spanContext().traceId}d(Cp,"getTraceId");import{SpanKind as ME,SpanStatusCode as a_}from"@opentelemetry/api";function Op(){return async(e,t)=>{if(!Us()){await t();return}let n=Pp(),r=e.req.method,o=e.req.path;await n.startActiveSpan(`${r} ${o}`,{kind:ME.SERVER,attributes:{"http.method":r,"http.url":e.req.url,"http.route":o}},async s=>{try{await t(),s.setAttribute("http.status_code",e.res.status);let i=e.get("userId");i&&s.setAttribute("rulemetric.user_id",i),e.res.status>=400&&s.setStatus({code:a_.ERROR})}catch(i){throw s.setStatus({code:a_.ERROR}),s.recordException(i),i}finally{s.end()}})}}d(Op,"telemetryMiddleware");import{trace as LE,context as $E}from"@opentelemetry/api";function Dp(e){let t=LE.getSpan($E.active());if(t)for(let[n,r]of Object.entries(e))t.setAttribute(n,r)}d(Dp,"setSpanAttributes");import*as Nr from"@sentry/node";var Ia=!1;function Mp(e){if(Ia)return!1;let t=process.env.SENTRY_DSN;return t?(Nr.init({dsn:t,serverName:e.serviceName,environment:process.env.NODE_ENV??"development",tracesSampleRate:0}),Ia=!0,!0):!1}d(Mp,"initSentry");function rr(e,t){if(!Ia)return;let n=e instanceof Error?e:new Error(typeof e=="string"?e:JSON.stringify(e));Nr.captureException(n,t)}d(rr,"captureException");function ba(e){if(Ia){if(e===null){Nr.setUser(null);return}Nr.setUser({id:e})}}d(ba,"setSentryUser");async function Sa(e){Ia&&await Nr.flush(e)}d(Sa,"flushSentry");import*as wd from"node:fs";import*as fa from"node:path";import{fileURLToPath as Kq}from"node:url";import{Hono as Yq}from"hono";import{cors as Xq}from"hono/cors";import{bodyLimit as Qq}from"hono/body-limit";import{serveStatic as Zq}from"@hono/node-server/serve-static";O();import{createHash as GR}from"node:crypto";import{createClient as KR}from"@supabase/supabase-js";import{eq as gw,and as YR,isNull as XR}from"drizzle-orm";import{createHmac as qR,createPublicKey as UR,timingSafeEqual as HR,verify as BR}from"node:crypto";var FR=6e4,rc=null,lw=0,nc=null,WR=null;async function zR(){let e=process.env.SUPABASE_URL;if(!e)throw new Error("SUPABASE_URL not set");let t=await fetch(`${e}/auth/v1/.well-known/jwks.json`,{signal:AbortSignal.timeout(5e3)});if(!t.ok)throw new Error(`JWKS fetch failed: ${t.status}`);return await t.json()}d(zR,"defaultJwksFetcher");async function Vm(){return nc||(nc=(async()=>{try{let e=await(WR??zR)(),t=new Map;for(let n of e.keys)if(n.kid)try{t.set(n.kid,UR({key:n,format:"jwk"}))}catch{}rc=t,lw=Date.now()}finally{nc=null}})(),nc)}d(Vm,"refreshJwks");function uw(e){try{return JSON.parse(Buffer.from(e,"base64url").toString("utf-8"))}catch{return null}}d(uw,"decodeB64Json");function VR(e){if(typeof e.exp=="number"&&e.exp*1e3<Date.now()||typeof e.sub!="string"||e.sub.length===0)return null;let t=e.aud;return t==="authenticated"||Array.isArray(t)&&t.includes("authenticated")?{userId:e.sub}:null}d(VR,"checkPayload");function JR(e,t,n,r){let o=qR("sha256",r).update(`${e}.${t}`).digest(),s;try{s=Buffer.from(n,"base64url")}catch{return!1}return s.length!==o.length?!1:HR(s,o)}d(JR,"verifyHs256");async function pw(e){let t=e.split(".");if(t.length!==3)return{ok:!1,reason:"invalid"};let[n,r,o]=t,s=uw(n);if(!s)return{ok:!1,reason:"invalid"};if(s.alg==="HS256"){let c=process.env.SUPABASE_JWT_SECRET;if(!c)return{ok:!1,reason:"unavailable"};if(!JR(n,r,o,c))return{ok:!1,reason:"invalid"}}else if(s.alg==="ES256"){if(typeof s.kid!="string")return{ok:!1,reason:"invalid"};if(rc===null)try{await Vm()}catch{return{ok:!1,reason:"unavailable"}}let c=rc?.get(s.kid);if(!c&&Date.now()-lw>=FR){try{await Vm()}catch{return{ok:!1,reason:"unavailable"}}c=rc?.get(s.kid)}if(!c)return{ok:!1,reason:"invalid"};let l;try{l=Buffer.from(o,"base64url")}catch{return{ok:!1,reason:"invalid"}}if(!BR("sha256",Buffer.from(`${n}.${r}`),{key:c,dsaEncoding:"ieee-p1363"},l))return{ok:!1,reason:"invalid"}}else return{ok:!1,reason:"invalid"};let i=uw(r);if(!i)return{ok:!1,reason:"invalid"};let a=VR(i);return a?{ok:!0,userId:a.userId,payload:i}:{ok:!1,reason:"invalid"}}d(pw,"verifySupabaseJwt");async function mw(e=3){for(let t=0;t<e;t++)try{return await Vm(),rc!==null}catch{await new Promise(n=>setTimeout(n,500*2**t))}return!1}d(mw,"primeJwks");function QR(e){return GR("sha256").update(e).digest("hex")}d(QR,"hashApiKey");var fw=new Map,ZR=300*1e3;function ek(e){let t=Date.now(),n=fw.get(e)??0;t-n<ZR||(fw.set(e,t),u.update(Ae).set({lastUsedAt:new Date}).where(gw(Ae.id,e)).then(()=>{}).catch(()=>{}))}d(ek,"updateLastUsed");var tk=60*1e3,nk=5e3,ni=new Map;async function hw(e,t){let n=e.req.header("Authorization");if(!n?.startsWith("Bearer "))return e.json({error:"Missing authorization header"},401);let r=n.slice(7);if(r.startsWith("rm_")){let o=QR(r),s,i=ni.get(o);if(i&&Date.now()-i.cachedAt<tk)s=i;else{i&&ni.delete(o);let[a]=await u.select({id:Ae.id,userId:Ae.userId,expiresAt:Ae.expiresAt}).from(Ae).where(YR(gw(Ae.keyHash,o),XR(Ae.revokedAt)));if(!a)return e.json({error:"Invalid API key"},401);s={id:a.id,userId:a.userId,expiresAt:a.expiresAt,cachedAt:Date.now()},ni.size>=nk&&ni.clear(),ni.set(o,s)}if(s.expiresAt&&new Date(s.expiresAt)<new Date)return ni.delete(o),e.json({error:"API key expired"},401);e.set("userId",s.userId),ba(s.userId),ek(s.id),await t();return}try{let o=KR(process.env.SUPABASE_URL,process.env.SUPABASE_ANON_KEY,{global:{headers:{Authorization:`Bearer ${r}`}}}),s=await pw(r);if(s.ok){e.set("userId",s.userId),e.set("supabase",o),ba(s.userId),await t();return}if(s.reason==="invalid")return console.log(`[auth] local JWT verify FAIL ${e.req.method} ${e.req.path}`),e.json({error:"Invalid token"},401);let i=Date.now(),{data:{user:a},error:c}=await o.auth.getUser();if(console.log(`[auth] getUser ${e.req.method} ${e.req.path} ms=${Date.now()-i} ${c?`err=${c.message}`:`userId=${a?.id??"?"}`}`),c||!a)return e.json({error:"Invalid token"},401);e.set("user",a),e.set("userId",a.id),e.set("supabase",o),ba(a.id),await t()}catch{return e.json({error:"Authentication failed"},401)}}d(hw,"authMiddleware");O();import{HTTPException as rk}from"hono/http-exception";import{ZodError as ok}from"zod";function ot(e){return e.replace(/[%_\\]/g,"\\$&")}d(ot,"escapeLike");function ri(e){let t=e;return t?.code??t?.cause?.code??t?.errno}d(ri,"transientCode");var sk=new Set(["ECONNRESET","EPIPE","ECONNABORTED"]);function _w(e,t){return e instanceof ok?t.json({error:"Validation error",details:e.flatten().fieldErrors},400):e instanceof rk?e.getResponse():ec(e)?t.json({error:"Server draining, retry shortly"},503):tc(e)?(process.env.LOG_LEVEL==="debug"&&console.debug("[req] query deadline exceeded \u2014 DB pool saturated; shed 503"),t.json({error:"Database busy, retry shortly"},503,{"Retry-After":"2"})):e.message==="aborted"||sk.has(ri(e)??"")?(process.env.LOG_LEVEL==="debug"&&console.debug(`[req] client/transient disconnect code=${ri(e)??"aborted"}`),t.body(null,503)):(console.error("Unhandled error:",e),t.json({error:"Internal server error"},500))}d(_w,"errorHandler");function oc(e,t){let n=new Map;return setInterval(()=>{let r=Date.now();for(let[o,s]of n)r>s.resetAt&&n.delete(o)},6e4).unref(),async(r,o)=>{let i=`${r.req.header("x-forwarded-for")?.split(",")[0]?.trim()??r.req.header("x-real-ip")??"unknown"}:${r.req.path}`,a=Date.now(),c=n.get(i);if((!c||a>c.resetAt)&&(c={count:0,resetAt:a+e},n.set(i,c)),c.count++,r.res.headers.set("X-RateLimit-Limit",String(t)),r.res.headers.set("X-RateLimit-Remaining",String(Math.max(0,t-c.count))),r.res.headers.set("X-RateLimit-Reset",String(Math.ceil(c.resetAt/1e3))),c.count>t)return r.json({error:"Too many requests, please try again later"},429);await o()}}d(oc,"rateLimit");var gu=!0,Jm="",yw=0;function Gm(e,t="",n=-1){if(e===gu){!e&&t&&(Jm=t);return}gu=e,Jm=e?"":t,yw=n,console.log(`[db-readiness] -> ${e?"READY":"NOT READY"}${t?` (${t})`:""}`)}d(Gm,"setDbReady");function sc(){return gu}d(sc,"isDbReady");function hu(){return{ready:gu,reason:Jm,changedAt:yw}}d(hu,"dbReadiness");async function ww(e,t){return sc()?t():(e.header("Retry-After","5"),e.json({error:"Service temporarily unavailable: the database is recovering. Retry shortly.",reason:hu().reason||void 0},503))}d(ww,"dbShed");O();var ik=5e3,vw=0;async function Iw(e,t){let n=Ja(),r=Qs();if(n>r){Mm();let o=Date.now();return o-vw>=ik&&(vw=o,console.warn(`[db_load_shed] shedding: inFlight=${n} > max=${r} path=${e.req.path}`)),e.header("Retry-After","1"),e.json({error:"Service busy: the database is under transient load. Retry shortly.",inFlight:n},503)}return t()}d(Iw,"dbLoadShed");O();var ak=5e3,bw=0;async function ic(e,t){if(e.req.method!=="POST")return t();let n=Ja(),r=Ka();if(n>=r){Ga();let o=Date.now();return o-bw>=ak&&(bw=o,console.warn(`[ingest_load_shed] shedding write: inFlight=${n} >= ingestMax=${r} path=${e.req.path}`)),e.header("Retry-After","2"),e.json({error:"Ingest busy: the database is under transient write load. Retry shortly.",inFlight:n},429)}return t()}d(ic,"ingestLoadShed");var Sw=d(async(e,t)=>{await t(),e.res.headers.set("X-Content-Type-Options","nosniff"),e.res.headers.set("X-Frame-Options","DENY"),e.res.headers.set("X-XSS-Protection","0"),e.res.headers.set("Referrer-Policy","strict-origin-when-cross-origin"),e.res.headers.set("Permissions-Policy","camera=(), microphone=(), geolocation=()")},"securityHeaders");function Aw(){return async(e,t)=>{let n=Date.now();try{await t()}finally{let r=Date.now()-n,o=Number(process.env.SLOW_REQUEST_LOG_MS)||2e3,s=Number(process.env.SLOW_REQUEST_MAX_MS)||12e4;if(r>s||r<o&&e.res.status<500)return;let i=new URL(e.req.url).pathname,a=e.get("userId");console.warn(`[http] slow_or_error method=${e.req.method} path=${i} status=${e.res.status} ms=${r}${a?` user=${a}`:""}`)}}}d(Aw,"slowRequestLog");import{Hono as dk}from"hono";import{z as lo}from"zod";import{createClient as Ew}from"@supabase/supabase-js";import{createClient as ck}from"@supabase/supabase-js";async function _u(e){let t=process.env.SUPABASE_URL,n=process.env.SUPABASE_ANON_KEY;if(!t||!n)return{ok:!1,status:500,error:"Server authentication not configured"};let r=ck(t,n,{auth:{persistSession:!1,autoRefreshToken:!1}}),o=`${e.slice(0,6)}\u2026${e.slice(-4)}`,s=Date.now();console.log(`[auth] refreshSession start refresh_token=${o}`);let{data:i,error:a}=await r.auth.refreshSession({refresh_token:e});return a||!i.session?(console.log(`[auth] refreshSession FAIL refresh_token=${o} ms=${Date.now()-s} err=${a?.message??"no-session"}`),{ok:!1,status:401,error:a?.message??"refresh failed"}):(console.log(`[auth] refreshSession OK refresh_token=${o} ms=${Date.now()-s} userId=${i.user?.id??"?"}`),{ok:!0,session:{accessToken:i.session.access_token,refreshToken:i.session.refresh_token,expiresAt:i.session.expires_at?new Date(i.session.expires_at*1e3).toISOString():null,email:i.user?.email??null}})}d(_u,"refreshSupabaseSession");var oi=new dk,uk=lo.object({email:lo.string().email(),password:lo.string().min(1)}),lk=lo.object({refreshToken:lo.string().min(1)});oi.post("/auth/login",async e=>{let t=await e.req.json(),n=uk.parse(t),r=process.env.SUPABASE_URL,o=process.env.SUPABASE_ANON_KEY;if(!r||!o)return e.json({error:"Server authentication not configured"},500);let s=Ew(r,o),i=Date.now();console.log(`[auth] signInWithPassword start email=${n.email} ua="${e.req.header("user-agent")??""}"`);let{data:a,error:c}=await s.auth.signInWithPassword({email:n.email,password:n.password});return c||!a.session?(console.log(`[auth] signInWithPassword FAIL email=${n.email} ms=${Date.now()-i} err=${c?.message??"no-session"}`),e.json({error:"Invalid email or password"},401)):(console.log(`[auth] signInWithPassword OK email=${n.email} ms=${Date.now()-i} userId=${a.user?.id??"?"}`),e.json({accessToken:a.session.access_token,refreshToken:a.session.refresh_token,expiresAt:a.session.expires_at?new Date(a.session.expires_at*1e3).toISOString():null,email:a.user?.email??n.email}))});var pk=lo.object({email:lo.string().email(),password:lo.string().min(8,"Password must be at least 8 characters")});oi.post("/auth/signup",async e=>{let t=await e.req.json(),n=pk.parse(t),r=process.env.SUPABASE_URL,o=process.env.SUPABASE_ANON_KEY;if(!r||!o)return e.json({error:"Server authentication not configured"},500);let s=Ew(r,o),i=process.env.WEB_URL??"http://localhost:5174",{data:a,error:c}=await s.auth.signUp({email:n.email,password:n.password,options:{emailRedirectTo:`${i}/auth/confirm`}});if(c){let l=/already registered|already exists|user already/i.test(c.message);return e.json({error:c.message},l?409:400)}return a.user&&(a.user.identities?.length??0)===0&&!a.session?e.json({error:"An account with this email already exists. Run `rulemetric auth login`."},409):a.session?e.json({confirmationRequired:!1,accessToken:a.session.access_token,refreshToken:a.session.refresh_token,expiresAt:a.session.expires_at?new Date(a.session.expires_at*1e3).toISOString():null,email:a.user?.email??n.email}):e.json({confirmationRequired:!0,email:a.user?.email??n.email})});oi.post("/auth/refresh",async e=>{let t=await e.req.json().catch(()=>null),n=lk.safeParse(t);if(!n.success)return e.json({error:"refreshToken is required"},400);let r=await _u(n.data.refreshToken);return r.ok?e.json(r.session):e.json({error:r.error},r.status)});import{readFileSync as mk}from"node:fs";import{dirname as fk,resolve as Km}from"node:path";import{fileURLToPath as gk}from"node:url";import{Hono as hk}from"hono";var _k="https://registry.npmjs.org/-/package/@rulemetric%2Fcli/dist-tags",yk=3600*1e3,wk=3e3,ac=null;function vk(){if(process.env.RULEMETRIC_BUNDLED_CLI_VERSION)return process.env.RULEMETRIC_BUNDLED_CLI_VERSION;let e=fk(gk(import.meta.url)),t=[Km(e,"../../../cli/package.json"),Km(e,"../../../../apps/cli/package.json"),Km(process.cwd(),"apps/cli/package.json")];for(let n of t)try{let r=JSON.parse(mk(n,"utf-8"));if(r.version)return r.version}catch{}return"0.0.0"}d(vk,"readBundledCliVersion");async function Ik(){try{let e=await fetch(_k,{headers:{accept:"application/json"},signal:AbortSignal.timeout(wk)});if(!e.ok)return null;let t=await e.json();return typeof t.latest=="string"&&t.latest?t.latest:null}catch{return null}}d(Ik,"fetchLatestFromNpm");async function bk(){let e=Date.now();if(ac&&e-ac.at<yk)return ac.version;let n=await Ik()??ac?.version??vk();return ac={version:n,at:e},n}d(bk,"getLatestCliVersion");var yu=new hk;yu.get("/cli/latest-version",async e=>e.json({latest:await bk()}));import{Hono as Dk}from"hono";O();import{sql as Sk}from"drizzle-orm";var Ak=12e3,Ek=3e4,xw=4,xk=Number(process.env.PG_RECYCLE_DEADLINE_THRESHOLD)||3,Tk="pipeline:api_db_pool_wedged",Rk="pipeline:api_db_pool_recycled",si=0;async function Ym(){return Fm(Ak)}d(Ym,"probeDb");function kk(e){let t=[],n=[],r=e;for(let o=0;r&&o<8;o++){let s=r;typeof s.code=="string"&&t.push(s.code),typeof s.message=="string"&&n.push(s.message),r=s.cause}return{codes:t,message:n.join(" ").toLowerCase()}}d(kk,"flattenCauseChain");function jk(e){let{codes:t,message:n}=kk(e);return n.includes("max client")||n.includes("emaxconn")||n.includes("max_client_conn")||t.includes("XX000")&&n.includes("client")}d(jk,"isPoolSaturation");function Nk(e){return jk(e)?"Supavisor tenant saturated (client cap reached)":ti(e)?"transient connect failure":"DB unreachable / probe timed out"}d(Nk,"classifyProbeFailure");async function Pk(e=Ym,t={}){let n=t.consumeDeadlines??Lm,r=t.recycle??Bm,o=t.onRecycle??Ok,s=await e();if(s.ok){let a=!sc();si>0&&console.log(`[db-wedge] DB reachable again after ${si} failed probe(s)`),si=0,Gm(!0,"",Date.now()),a&&Ck();let c=n();c>=xk&&(console.error(`[db-wedge] recycling the MAIN pool: ${c} client-side query-deadline(s) while a fresh dedicated probe is healthy \u2014 the pool is holding black-holed sockets a restart is not needed to clear.`),Promise.resolve().then(()=>r()).catch(l=>console.error("[db-wedge] pool recycle failed:",l instanceof Error?l.message:l)),o(c));return}si+=1;let i=Nk(s.err);console.error(`[db-wedge] dedicated DB probe failed (${si}/${xw}) \u2014 ${i}`),si>=xw&&sc()&&(Gm(!1,`DB unreachable from a dedicated connection \u2014 ${i}`,Date.now()),console.error("[db-wedge] marking API NOT READY (shedding DB traffic). NOT restarting: a process restart cannot free a shared Supavisor pooler. Readiness restores automatically on the next OK probe."))}d(Pk,"watchdogTick");async function Tw(e,t){try{await u.execute(Sk`
94
+ ${e}`}var qS=V(()=>{"use strict";u(MS,"resolveRuntimeWebConfig");u(r1,"stampRuntimeConfig")});import*as vm from"node:fs";import*as Im from"node:path";import{fileURLToPath as L1}from"node:url";import{serve as M1}from"@hono/node-server";import{trace as r_,context as gA}from"@opentelemetry/api";import{NodeSDK as hA}from"@opentelemetry/sdk-node";import{OTLPTraceExporter as _A}from"@opentelemetry/exporter-trace-otlp-http";import{BatchSpanProcessor as yA,ConsoleSpanExporter as wA,SimpleSpanProcessor as vA}from"@opentelemetry/sdk-trace-node";import{Resource as IA}from"@opentelemetry/resources";import{ATTR_SERVICE_NAME as bA,ATTR_SERVICE_VERSION as SA}from"@opentelemetry/semantic-conventions";function n_(e){if(!e)return{};let t={};for(let n of e.split(",")){let r=n.indexOf("=");if(r===-1)continue;let o=n.slice(0,r).trim(),s=n.slice(r+1).trim();o&&(t[o]=s)}return t}u(n_,"parseOtlpHeaders");var qs=null;function Us(){return process.env.TELEMETRY_ENABLED!=="false"}u(Us,"isTelemetryEnabled");function km(e){if(!Us()||qs!==null)return"off";let t=new IA({[bA]:e.serviceName,[SA]:e.serviceVersion??"0.1.0"}),n=process.env.OTEL_EXPORTER_OTLP_ENDPOINT,r,o;if(n){let s=n_(process.env.OTEL_EXPORTER_OTLP_HEADERS),i=new _A({url:`${n}/v1/traces`,headers:s});o=new yA(i),r="otlp"}else if(process.env.OTEL_SPAN_EXPORT==="none")o=void 0,r="silent";else{let s=new wA;o=new vA(s),r="console"}return qs=new hA({resource:t,spanProcessors:o?[o]:[]}),qs.start(),r}u(km,"initTelemetry");async function Nm(){qs&&(await qs.shutdown(),qs=null)}u(Nm,"shutdownTelemetry");function jm(e){return r_.getTracer(e??"rulemetric")}u(jm,"getTracer");function Pm(){return r_.getSpan(gA.active())?.spanContext().traceId}u(Pm,"getTraceId");import{SpanKind as AA,SpanStatusCode as o_}from"@opentelemetry/api";function Dm(){return async(e,t)=>{if(!Us()){await t();return}let n=jm(),r=e.req.method,o=e.req.path;await n.startActiveSpan(`${r} ${o}`,{kind:AA.SERVER,attributes:{"http.method":r,"http.url":e.req.url,"http.route":o}},async s=>{try{await t(),s.setAttribute("http.status_code",e.res.status);let i=e.get("userId");i&&s.setAttribute("rulemetric.user_id",i),e.res.status>=400&&s.setStatus({code:o_.ERROR})}catch(i){throw s.setStatus({code:o_.ERROR}),s.recordException(i),i}finally{s.end()}})}}u(Dm,"telemetryMiddleware");import{trace as EA,context as xA}from"@opentelemetry/api";function Om(e){let t=EA.getSpan(xA.active());if(t)for(let[n,r]of Object.entries(e))t.setAttribute(n,r)}u(Om,"setSpanAttributes");import*as jr from"@sentry/node";var va=!1;function Cm(e){if(va)return!1;let t=process.env.SENTRY_DSN;return t?(jr.init({dsn:t,serverName:e.serviceName,environment:process.env.NODE_ENV??"development",tracesSampleRate:0}),va=!0,!0):!1}u(Cm,"initSentry");function rr(e,t){if(!va)return;let n=e instanceof Error?e:new Error(typeof e=="string"?e:JSON.stringify(e));jr.captureException(n,t)}u(rr,"captureException");function Ia(e){if(va){if(e===null){jr.setUser(null);return}jr.setUser({id:e})}}u(Ia,"setSentryUser");async function ba(e){va&&await jr.flush(e)}u(ba,"flushSentry");import*as vu from"node:fs";import*as pa from"node:path";import{fileURLToPath as o1}from"node:url";import{Hono as s1}from"hono";import{cors as i1}from"hono/cors";import{bodyLimit as a1}from"hono/body-limit";import{serveStatic as c1}from"@hono/node-server/serve-static";C();import{createHash as CT}from"node:crypto";import{createClient as LT}from"@supabase/supabase-js";import{eq as pw,and as MT,isNull as $T}from"drizzle-orm";import{createHmac as xT,createPublicKey as TT,timingSafeEqual as RT,verify as kT}from"node:crypto";var NT=6e4,nc=null,uw=0,tc=null,jT=null;async function PT(){let e=process.env.SUPABASE_URL;if(!e)throw new Error("SUPABASE_URL not set");let t=await fetch(`${e}/auth/v1/.well-known/jwks.json`,{signal:AbortSignal.timeout(5e3)});if(!t.ok)throw new Error(`JWKS fetch failed: ${t.status}`);return await t.json()}u(PT,"defaultJwksFetcher");async function Vp(){return tc||(tc=(async()=>{try{let e=await(jT??PT)(),t=new Map;for(let n of e.keys)if(n.kid)try{t.set(n.kid,TT({key:n,format:"jwk"}))}catch{}nc=t,uw=Date.now()}finally{tc=null}})(),tc)}u(Vp,"refreshJwks");function cw(e){try{return JSON.parse(Buffer.from(e,"base64url").toString("utf-8"))}catch{return null}}u(cw,"decodeB64Json");function DT(e){if(typeof e.exp=="number"&&e.exp*1e3<Date.now()||typeof e.sub!="string"||e.sub.length===0)return null;let t=e.aud;return t==="authenticated"||Array.isArray(t)&&t.includes("authenticated")?{userId:e.sub}:null}u(DT,"checkPayload");function OT(e,t,n,r){let o=xT("sha256",r).update(`${e}.${t}`).digest(),s;try{s=Buffer.from(n,"base64url")}catch{return!1}return s.length!==o.length?!1:RT(s,o)}u(OT,"verifyHs256");async function dw(e){let t=e.split(".");if(t.length!==3)return{ok:!1,reason:"invalid"};let[n,r,o]=t,s=cw(n);if(!s)return{ok:!1,reason:"invalid"};if(s.alg==="HS256"){let a=process.env.SUPABASE_JWT_SECRET;if(!a)return{ok:!1,reason:"unavailable"};if(!OT(n,r,o,a))return{ok:!1,reason:"invalid"}}else if(s.alg==="ES256"){if(typeof s.kid!="string")return{ok:!1,reason:"invalid"};if(nc===null)try{await Vp()}catch{return{ok:!1,reason:"unavailable"}}let a=nc?.get(s.kid);if(!a&&Date.now()-uw>=NT){try{await Vp()}catch{return{ok:!1,reason:"unavailable"}}a=nc?.get(s.kid)}if(!a)return{ok:!1,reason:"invalid"};let l;try{l=Buffer.from(o,"base64url")}catch{return{ok:!1,reason:"invalid"}}if(!kT("sha256",Buffer.from(`${n}.${r}`),{key:a,dsaEncoding:"ieee-p1363"},l))return{ok:!1,reason:"invalid"}}else return{ok:!1,reason:"invalid"};let i=cw(r);if(!i)return{ok:!1,reason:"invalid"};let c=DT(i);return c?{ok:!0,userId:c.userId,payload:i}:{ok:!1,reason:"invalid"}}u(dw,"verifySupabaseJwt");async function lw(e=3){for(let t=0;t<e;t++)try{return await Vp(),nc!==null}catch{await new Promise(n=>setTimeout(n,500*2**t))}return!1}u(lw,"primeJwks");function qT(e){return CT("sha256").update(e).digest("hex")}u(qT,"hashApiKey");var mw=new Map,UT=300*1e3;function HT(e){let t=Date.now(),n=mw.get(e)??0;t-n<UT||(mw.set(e,t),d.update(be).set({lastUsedAt:new Date}).where(pw(be.id,e)).then(()=>{}).catch(()=>{}))}u(HT,"updateLastUsed");var BT=60*1e3,FT=5e3,ni=new Map;async function fw(e,t){let n=e.req.header("Authorization");if(!n?.startsWith("Bearer "))return e.json({error:"Missing authorization header"},401);let r=n.slice(7);if(r.startsWith("rm_")){let o=qT(r),s,i=ni.get(o);if(i&&Date.now()-i.cachedAt<BT)s=i;else{i&&ni.delete(o);let[c]=await d.select({id:be.id,userId:be.userId,expiresAt:be.expiresAt}).from(be).where(MT(pw(be.keyHash,o),$T(be.revokedAt)));if(!c)return e.json({error:"Invalid API key"},401);s={id:c.id,userId:c.userId,expiresAt:c.expiresAt,cachedAt:Date.now()},ni.size>=FT&&ni.clear(),ni.set(o,s)}if(s.expiresAt&&new Date(s.expiresAt)<new Date)return ni.delete(o),e.json({error:"API key expired"},401);e.set("userId",s.userId),Ia(s.userId),HT(s.id),await t();return}try{let o=LT(process.env.SUPABASE_URL,process.env.SUPABASE_ANON_KEY,{global:{headers:{Authorization:`Bearer ${r}`}}}),s=await dw(r);if(s.ok){e.set("userId",s.userId),e.set("supabase",o),Ia(s.userId),await t();return}if(s.reason==="invalid")return console.log(`[auth] local JWT verify FAIL ${e.req.method} ${e.req.path}`),e.json({error:"Invalid token"},401);let i=Date.now(),{data:{user:c},error:a}=await o.auth.getUser();if(console.log(`[auth] getUser ${e.req.method} ${e.req.path} ms=${Date.now()-i} ${a?`err=${a.message}`:`userId=${c?.id??"?"}`}`),a||!c)return e.json({error:"Invalid token"},401);e.set("user",c),e.set("userId",c.id),e.set("supabase",o),Ia(c.id),await t()}catch{return e.json({error:"Authentication failed"},401)}}u(fw,"authMiddleware");C();import{HTTPException as WT}from"hono/http-exception";import{ZodError as zT}from"zod";function rt(e){return e.replace(/[%_\\]/g,"\\$&")}u(rt,"escapeLike");function ri(e){let t=e;return t?.code??t?.cause?.code??t?.errno}u(ri,"transientCode");var VT=new Set(["ECONNRESET","EPIPE","ECONNABORTED"]);function gw(e,t){return e instanceof zT?t.json({error:"Validation error",details:e.flatten().fieldErrors},400):e instanceof WT?e.getResponse():Za(e)?t.json({error:"Server draining, retry shortly"},503):ec(e)?(process.env.LOG_LEVEL==="debug"&&console.debug("[req] query deadline exceeded \u2014 DB pool saturated; shed 503"),t.json({error:"Database busy, retry shortly"},503,{"Retry-After":"2"})):e.message==="aborted"||VT.has(ri(e)??"")?(process.env.LOG_LEVEL==="debug"&&console.debug(`[req] client/transient disconnect code=${ri(e)??"aborted"}`),t.body(null,503)):(console.error("Unhandled error:",e),t.json({error:"Internal server error"},500))}u(gw,"errorHandler");function rc(e,t){let n=new Map;return setInterval(()=>{let r=Date.now();for(let[o,s]of n)r>s.resetAt&&n.delete(o)},6e4).unref(),async(r,o)=>{let i=`${r.req.header("x-forwarded-for")?.split(",")[0]?.trim()??r.req.header("x-real-ip")??"unknown"}:${r.req.path}`,c=Date.now(),a=n.get(i);if((!a||c>a.resetAt)&&(a={count:0,resetAt:c+e},n.set(i,a)),a.count++,r.res.headers.set("X-RateLimit-Limit",String(t)),r.res.headers.set("X-RateLimit-Remaining",String(Math.max(0,t-a.count))),r.res.headers.set("X-RateLimit-Reset",String(Math.ceil(a.resetAt/1e3))),a.count>t)return r.json({error:"Too many requests, please try again later"},429);await o()}}u(rc,"rateLimit");var hd=!0,Jp="",hw=0;function Kp(e,t="",n=-1){if(e===hd){!e&&t&&(Jp=t);return}hd=e,Jp=e?"":t,hw=n,console.log(`[db-readiness] -> ${e?"READY":"NOT READY"}${t?` (${t})`:""}`)}u(Kp,"setDbReady");function oc(){return hd}u(oc,"isDbReady");function _d(){return{ready:hd,reason:Jp,changedAt:hw}}u(_d,"dbReadiness");async function _w(e,t){return oc()?t():(e.header("Retry-After","5"),e.json({error:"Service temporarily unavailable: the database is recovering. Retry shortly.",reason:_d().reason||void 0},503))}u(_w,"dbShed");C();var JT=5e3,yw=0;async function ww(e,t){let n=Va(),r=Qs();if(n>r){Lp();let o=Date.now();return o-yw>=JT&&(yw=o,console.warn(`[db_load_shed] shedding: inFlight=${n} > max=${r} path=${e.req.path}`)),e.header("Retry-After","1"),e.json({error:"Service busy: the database is under transient load. Retry shortly.",inFlight:n},503)}return t()}u(ww,"dbLoadShed");C();var KT=5e3,vw=0;async function sc(e,t){if(e.req.method!=="POST")return t();let n=Va(),r=Ka();if(n>=r){Ja();let o=Date.now();return o-vw>=KT&&(vw=o,console.warn(`[ingest_load_shed] shedding write: inFlight=${n} >= ingestMax=${r} path=${e.req.path}`)),e.header("Retry-After","2"),e.json({error:"Ingest busy: the database is under transient write load. Retry shortly.",inFlight:n},429)}return t()}u(sc,"ingestLoadShed");var Iw=u(async(e,t)=>{await t(),e.res.headers.set("X-Content-Type-Options","nosniff"),e.res.headers.set("X-Frame-Options","DENY"),e.res.headers.set("X-XSS-Protection","0"),e.res.headers.set("Referrer-Policy","strict-origin-when-cross-origin"),e.res.headers.set("Permissions-Policy","camera=(), microphone=(), geolocation=()")},"securityHeaders");function bw(){return async(e,t)=>{let n=Date.now();try{await t()}finally{let r=Date.now()-n,o=Number(process.env.SLOW_REQUEST_LOG_MS)||2e3,s=Number(process.env.SLOW_REQUEST_MAX_MS)||12e4;if(r>s||r<o&&e.res.status<500)return;let i=new URL(e.req.url).pathname,c=e.get("userId");console.warn(`[http] slow_or_error method=${e.req.method} path=${i} status=${e.res.status} ms=${r}${c?` user=${c}`:""}`)}}}u(bw,"slowRequestLog");import{Hono as YT}from"hono";import{z as lo}from"zod";import{createClient as Sw}from"@supabase/supabase-js";import{createClient as GT}from"@supabase/supabase-js";async function yd(e){let t=process.env.SUPABASE_URL,n=process.env.SUPABASE_ANON_KEY;if(!t||!n)return{ok:!1,status:500,error:"Server authentication not configured"};let r=GT(t,n,{auth:{persistSession:!1,autoRefreshToken:!1}}),o=`${e.slice(0,6)}\u2026${e.slice(-4)}`,s=Date.now();console.log(`[auth] refreshSession start refresh_token=${o}`);let{data:i,error:c}=await r.auth.refreshSession({refresh_token:e});return c||!i.session?(console.log(`[auth] refreshSession FAIL refresh_token=${o} ms=${Date.now()-s} err=${c?.message??"no-session"}`),{ok:!1,status:401,error:c?.message??"refresh failed"}):(console.log(`[auth] refreshSession OK refresh_token=${o} ms=${Date.now()-s} userId=${i.user?.id??"?"}`),{ok:!0,session:{accessToken:i.session.access_token,refreshToken:i.session.refresh_token,expiresAt:i.session.expires_at?new Date(i.session.expires_at*1e3).toISOString():null,email:i.user?.email??null}})}u(yd,"refreshSupabaseSession");var oi=new YT,XT=lo.object({email:lo.string().email(),password:lo.string().min(1)}),QT=lo.object({refreshToken:lo.string().min(1)});oi.post("/auth/login",async e=>{let t=await e.req.json(),n=XT.parse(t),r=process.env.SUPABASE_URL,o=process.env.SUPABASE_ANON_KEY;if(!r||!o)return e.json({error:"Server authentication not configured"},500);let s=Sw(r,o),i=Date.now();console.log(`[auth] signInWithPassword start email=${n.email} ua="${e.req.header("user-agent")??""}"`);let{data:c,error:a}=await s.auth.signInWithPassword({email:n.email,password:n.password});return a||!c.session?(console.log(`[auth] signInWithPassword FAIL email=${n.email} ms=${Date.now()-i} err=${a?.message??"no-session"}`),e.json({error:"Invalid email or password"},401)):(console.log(`[auth] signInWithPassword OK email=${n.email} ms=${Date.now()-i} userId=${c.user?.id??"?"}`),e.json({accessToken:c.session.access_token,refreshToken:c.session.refresh_token,expiresAt:c.session.expires_at?new Date(c.session.expires_at*1e3).toISOString():null,email:c.user?.email??n.email}))});var ZT=lo.object({email:lo.string().email(),password:lo.string().min(8,"Password must be at least 8 characters")});oi.post("/auth/signup",async e=>{let t=await e.req.json(),n=ZT.parse(t),r=process.env.SUPABASE_URL,o=process.env.SUPABASE_ANON_KEY;if(!r||!o)return e.json({error:"Server authentication not configured"},500);let s=Sw(r,o),i=process.env.WEB_URL??"http://localhost:5174",{data:c,error:a}=await s.auth.signUp({email:n.email,password:n.password,options:{emailRedirectTo:`${i}/auth/confirm`}});if(a){let l=/already registered|already exists|user already/i.test(a.message);return e.json({error:a.message},l?409:400)}return c.user&&(c.user.identities?.length??0)===0&&!c.session?e.json({error:"An account with this email already exists. Run `rulemetric auth login`."},409):c.session?e.json({confirmationRequired:!1,accessToken:c.session.access_token,refreshToken:c.session.refresh_token,expiresAt:c.session.expires_at?new Date(c.session.expires_at*1e3).toISOString():null,email:c.user?.email??n.email}):e.json({confirmationRequired:!0,email:c.user?.email??n.email})});oi.post("/auth/refresh",async e=>{let t=await e.req.json().catch(()=>null),n=QT.safeParse(t);if(!n.success)return e.json({error:"refreshToken is required"},400);let r=await yd(n.data.refreshToken);return r.ok?e.json(r.session):e.json({error:r.error},r.status)});import{readFileSync as eR}from"node:fs";import{dirname as tR,resolve as Gp}from"node:path";import{fileURLToPath as nR}from"node:url";import{Hono as rR}from"hono";var oR="https://registry.npmjs.org/-/package/@rulemetric%2Fcli/dist-tags",sR=3600*1e3,iR=3e3,ic=null;function aR(){if(process.env.RULEMETRIC_BUNDLED_CLI_VERSION)return process.env.RULEMETRIC_BUNDLED_CLI_VERSION;let e=tR(nR(import.meta.url)),t=[Gp(e,"../../../cli/package.json"),Gp(e,"../../../../apps/cli/package.json"),Gp(process.cwd(),"apps/cli/package.json")];for(let n of t)try{let r=JSON.parse(eR(n,"utf-8"));if(r.version)return r.version}catch{}return"0.0.0"}u(aR,"readBundledCliVersion");async function cR(){try{let e=await fetch(oR,{headers:{accept:"application/json"},signal:AbortSignal.timeout(iR)});if(!e.ok)return null;let t=await e.json();return typeof t.latest=="string"&&t.latest?t.latest:null}catch{return null}}u(cR,"fetchLatestFromNpm");async function uR(){let e=Date.now();if(ic&&e-ic.at<sR)return ic.version;let n=await cR()??ic?.version??aR();return ic={version:n,at:e},n}u(uR,"getLatestCliVersion");var wd=new rR;wd.get("/cli/latest-version",async e=>e.json({latest:await uR()}));import{Hono as bR}from"hono";C();import{sql as dR}from"drizzle-orm";var lR=12e3,mR=3e4,Aw=4,pR=Number(process.env.PG_RECYCLE_DEADLINE_THRESHOLD)||3,fR="pipeline:api_db_pool_wedged",gR="pipeline:api_db_pool_recycled",si=0;async function Yp(){return Fp(lR)}u(Yp,"probeDb");function hR(e){let t=[],n=[],r=e;for(let o=0;r&&o<8;o++){let s=r;typeof s.code=="string"&&t.push(s.code),typeof s.message=="string"&&n.push(s.message),r=s.cause}return{codes:t,message:n.join(" ").toLowerCase()}}u(hR,"flattenCauseChain");function _R(e){let{codes:t,message:n}=hR(e);return n.includes("max client")||n.includes("emaxconn")||n.includes("max_client_conn")||t.includes("XX000")&&n.includes("client")}u(_R,"isPoolSaturation");function yR(e){return _R(e)?"Supavisor tenant saturated (client cap reached)":ti(e)?"transient connect failure":"DB unreachable / probe timed out"}u(yR,"classifyProbeFailure");async function wR(e=Yp,t={}){let n=t.consumeDeadlines??Mp,r=t.recycle??Bp,o=t.onRecycle??IR,s=await e();if(s.ok){let c=!oc();si>0&&console.log(`[db-wedge] DB reachable again after ${si} failed probe(s)`),si=0,Kp(!0,"",Date.now()),c&&vR();let a=n();a>=pR&&(console.error(`[db-wedge] recycling the MAIN pool: ${a} client-side query-deadline(s) while a fresh dedicated probe is healthy \u2014 the pool is holding black-holed sockets a restart is not needed to clear.`),Promise.resolve().then(()=>r()).catch(l=>console.error("[db-wedge] pool recycle failed:",l instanceof Error?l.message:l)),o(a));return}si+=1;let i=yR(s.err);console.error(`[db-wedge] dedicated DB probe failed (${si}/${Aw}) \u2014 ${i}`),si>=Aw&&oc()&&(Kp(!1,`DB unreachable from a dedicated connection \u2014 ${i}`,Date.now()),console.error("[db-wedge] marking API NOT READY (shedding DB traffic). NOT restarting: a process restart cannot free a shared Supavisor pooler. Readiness restores automatically on the next OK probe."))}u(wR,"watchdogTick");async function Ew(e,t){try{await d.execute(dR`
95
95
  INSERT INTO alert_dispatches (user_id, alert_key, severity, channel, last_state)
96
96
  SELECT DISTINCT user_id, ${e}, 'soft', 'in_app',
97
97
  jsonb_build_object('message', ${t})
98
98
  FROM sessions
99
99
  WHERE created_at > now() - interval '7 days' AND user_id IS NOT NULL
100
- `)}catch(n){console.error(`[db-wedge] failed to record ${e} alert:`,n instanceof Error?n.message:n)}}d(Tw,"dispatchSoftAlert");async function Ck(){await Tw(Tk,'The API database pool was briefly unreachable and shed traffic; it has recovered. Sessions and other pages may have shown 503s during that window. If this recurs, run "bash scripts/debug-loop.sh".')}d(Ck,"reportRecovery");async function Ok(e){try{rr(new Error(`[db-wedge] auto-recycled the main DB pool after ${e} client-side query-deadline(s) with a healthy probe \u2014 black-holed pooler sockets, no restart needed.`),{tags:{source:"db-wedge",action:"pool_recycle"},extra:{deadlines:e}})}catch{}await Tw(Rk,'The API database pool held stale connections after a network interruption and was automatically recycled \u2014 no restart needed. A few requests may have shown 503s briefly. If this recurs often, run "bash scripts/debug-loop.sh".')}d(Ok,"reportPoolRecycle");function Rw(){let e=setInterval(()=>{Pk().catch(()=>{})},Ek);return{stop:d(()=>clearInterval(e),"stop")}}d(Rw,"startDbWedgeWatchdog");var ii=new Dk;ii.get("/health",e=>e.json({status:"ok"}));ii.get("/ready",e=>{let t=hu();return e.json({ready:t.ready,reason:t.reason||void 0},t.ready?200:503)});ii.get("/health/deep",async e=>{let t=await Ym();return e.json({status:t.ok?"ok":"degraded",db:t.ok?"ok":"wedged",dbProbeMs:t.ms},t.ok?200:503)});O();import{Hono as Mk}from"hono";import{sql as Lk}from"drizzle-orm";import{execFileSync as $k}from"node:child_process";import*as kw from"node:fs";var wu=new Mk,qk=["/usr/sbin/lsof","/usr/bin/lsof","/bin/lsof"].find(e=>kw.existsSync(e))??"lsof";function Uk(e=process.pid){try{let t=$k(qk,["-a","-p",String(e),"-i","TCP","-P","-n"],{encoding:"utf8",timeout:3e3}),n=[];for(let r of t.split(`
101
- `)){let o=r.match(/->([\d.]+|\[[^\]]+\]):(?:6543|5432)\b/);o&&n.push({remote:o[1].replace(/^\[|\]$/g,"")})}return n}catch{return[]}}d(Uk,"snapshotPoolerSockets");wu.get("/diag/pg-health",async e=>{let t=await u.execute(Lk`
100
+ `)}catch(n){console.error(`[db-wedge] failed to record ${e} alert:`,n instanceof Error?n.message:n)}}u(Ew,"dispatchSoftAlert");async function vR(){await Ew(fR,'The API database pool was briefly unreachable and shed traffic; it has recovered. Sessions and other pages may have shown 503s during that window. If this recurs, run "bash scripts/debug-loop.sh".')}u(vR,"reportRecovery");async function IR(e){try{rr(new Error(`[db-wedge] auto-recycled the main DB pool after ${e} client-side query-deadline(s) with a healthy probe \u2014 black-holed pooler sockets, no restart needed.`),{tags:{source:"db-wedge",action:"pool_recycle"},extra:{deadlines:e}})}catch{}await Ew(gR,'The API database pool held stale connections after a network interruption and was automatically recycled \u2014 no restart needed. A few requests may have shown 503s briefly. If this recurs often, run "bash scripts/debug-loop.sh".')}u(IR,"reportPoolRecycle");function xw(){let e=setInterval(()=>{wR().catch(()=>{})},mR);return{stop:u(()=>clearInterval(e),"stop")}}u(xw,"startDbWedgeWatchdog");var ii=new bR;ii.get("/health",e=>e.json({status:"ok"}));ii.get("/ready",e=>{let t=_d();return e.json({ready:t.ready,reason:t.reason||void 0},t.ready?200:503)});ii.get("/health/deep",async e=>{let t=await Yp();return e.json({status:t.ok?"ok":"degraded",db:t.ok?"ok":"wedged",dbProbeMs:t.ms},t.ok?200:503)});C();import{Hono as SR}from"hono";import{sql as AR}from"drizzle-orm";import{execFileSync as ER}from"node:child_process";import*as Tw from"node:fs";var vd=new SR,xR=["/usr/sbin/lsof","/usr/bin/lsof","/bin/lsof"].find(e=>Tw.existsSync(e))??"lsof";function TR(e=process.pid){try{let t=ER(xR,["-a","-p",String(e),"-i","TCP","-P","-n"],{encoding:"utf8",timeout:3e3}),n=[];for(let r of t.split(`
101
+ `)){let o=r.match(/->([\d.]+|\[[^\]]+\]):(?:6543|5432)\b/);o&&n.push({remote:o[1].replace(/^\[|\]$/g,"")})}return n}catch{return[]}}u(TR,"snapshotPoolerSockets");vd.get("/diag/pg-health",async e=>{let t=await d.execute(AR`
102
102
  SELECT
103
103
  application_name,
104
104
  client_addr::text AS client_addr,
@@ -110,97 +110,11 @@ ${e}`}var XA=J(()=>{"use strict";d(KA,"resolveRuntimeWebConfig");d(Gq,"stampRunt
110
110
  WHERE datname = current_database()
111
111
  GROUP BY application_name, client_addr, state
112
112
  ORDER BY conns DESC
113
- `),n=t.reduce((s,i)=>s+i.conns,0),r=Uk(),o={};for(let s of r)o[s.remote]=(o[s.remote]??0)+1;return e.json({sampled_at:new Date().toISOString(),self:{process:process.env.PG_APPLICATION_NAME??"rulemetric",pid:process.pid,pool_max:Number(process.env.PG_POOL_MAX)||3,pooler_sockets:r.length,pooler_sockets_by_node:o,...(()=>{let s=$m();return{inflight_current:s.current,inflight_peak:s.peak,inflight_shed_count:s.shedCount,inflight_max:Qs(),ingest_inflight_max:Ka(),ingest_shed_count:s.ingestShedCount}})()},total_backends:n,breakdown:t})});O();import{Hono as kj}from"hono";import{z as ct}from"zod";import{eq as Me,and as dr,sql as di,ilike as uf,isNull as jj,or as lf,desc as Vv,inArray as zv}from"drizzle-orm";import{z as Kt}from"zod";var jw=["org","team","project","personal"],Xm=Kt.object({name:Kt.string().min(1),description:Kt.string().min(1),type:Kt.literal("instruction").default("instruction"),scope:Kt.enum(jw),version:Kt.string().min(1),tags:Kt.array(Kt.string()).optional(),compatibility:Kt.array(Kt.string()).optional(),slots:Kt.record(Kt.string(),Kt.string()).optional(),metadata:Kt.record(Kt.string(),Kt.unknown()).optional()});import{z as kn}from"zod";var Nw=kn.object({name:kn.string().min(1),description:kn.string().min(1),type:kn.literal("prompt"),version:kn.string().min(1),tags:kn.array(kn.string()).optional(),variables:kn.array(kn.string()).optional(),metadata:kn.record(kn.string(),kn.unknown()).optional()});function cc(e){return e<=3?"light":e<=8?"standard":"heavy"}d(cc,"computePackTier");var vu={claude_md:"claude_md",memory:"memory",skill_loaded:"skill"};function Qm(e,t){let n=vu[e];return n?`${n}::${t}`:null}d(Qm,"deriveContextIdentity");function Zm(e){if(!e||typeof e!="object")return e;let t=e,n=t.project_areas;if(n!==void 0&&!Array.isArray(n)){let r=n&&typeof n=="object"?n.areas:void 0;t.project_areas=Array.isArray(r)?r:void 0}return e}d(Zm,"normalizeRecommendations");import Hk from"gray-matter";import{z as Pw}from"zod";var P2=Pw.object({type:Pw.enum(["instruction","prompt"])});function ai(e){let{data:t,content:n}=Hk(e),r=Xm.parse(t),o=r.slots??null;return{frontmatter:r,content:n.trim(),slots:o}}d(ai,"parseInstruction");var Iu=["agents-md","claude-md","cursorrules","copilot","windsurf","cline","roo","aider","gemini","continue","junie","jetbrains","codex","soul-md","amazon-q","goose","kilocode","augment","tabnine","opencode","warp","trae","vscode-copilot","qodo","genkit","amp"];var dc=class{static{d(this,"ConverterRegistry")}converters=new Map;reverseConverters=new Map;register(t,n,r){this.converters.set(t,{converter:n,metadata:r})}registerReverse(t,n){this.reverseConverters.set(t,n)}get(t){return this.converters.get(t)?.converter}getReverse(t){return this.reverseConverters.get(t)}getMetadata(t){return this.converters.get(t)?.metadata}listFormats(){return[...this.converters.keys()]}listAll(){return[...this.converters.values()]}listReverseFormats(){return[...this.reverseConverters.keys()]}};function Cw(e,t){let n=[];for(let[r,o]of Object.entries(t)){let s=e[r];if(!s)continue;let i=s.trim();switch(o.placement){case"prefix":case"suffix":n.push(i);break;case"section":o.header?n.push(`${o.header}
114
-
115
- ${i}`):n.push(i);break}}return n.join(`
116
-
117
- `)}d(Cw,"assembleSlots");function de(e,t,n,r){if(!t||Object.keys(t).length===0)return e;let o=Cw(t,n);return r?.appendContent&&e.trim()?`${o}
118
-
119
- ${e.trim()}`:o}d(de,"buildOutput");function ef(e){let{filename:t,content:n}=e;if(t){let r=t.toLowerCase();if(r==="agents.md")return{format:"agents-md",confidence:.95};if(r==="claude.md")return{format:"claude-md",confidence:.95};if(r===".cursorrules"||r.endsWith(".mdc"))return{format:"cursorrules",confidence:.95};if(r==="copilot-instructions.md"||r.includes("copilot-instructions"))return{format:"copilot",confidence:.95};if(r===".windsurfrules")return{format:"windsurf",confidence:.95};if(r===".clinerules")return{format:"cline",confidence:.9};if(r===".goosehints")return{format:"goose",confidence:.9};if(r==="gemini.md")return{format:"gemini",confidence:.9};if(r==="soul.md")return{format:"soul-md",confidence:.95};if(r==="conventions.md")return{format:"aider",confidence:.7}}if(n){if(n.includes("alwaysApply:")&&n.includes("---"))return{format:"cursorrules",confidence:.8};if(n.includes("## File Access")&&n.includes("## Code Rules"))return{format:"claude-md",confidence:.6};if(n.includes("## Identity")&&n.includes("## File Handling"))return{format:"agents-md",confidence:.6};if(n.includes("## Persona")&&n.includes("## Rules"))return{format:"soul-md",confidence:.6}}return null}d(ef,"detectFormat");var Bk={system_identity:{header:"## Identity",placement:"section"},file_access_rules:{header:"## File Handling",placement:"section"},code_generation_rules:{header:"## Code Generation",placement:"section"},review_checklist:{header:"## Review Process",placement:"section"}},Ow={convert(e,t){let n=[],r={includeTitle:!0,includeDescription:!0,includeMetadata:!1,...t};r.includeTitle&&n.push(`# ${e.frontmatter.name}`),r.includeDescription&&n.push(e.frontmatter.description);let o=de(e.content,e.slots,Bk);return o&&n.push(o),{output:n.join(`
120
-
121
- `),format:"agents-md",outputPath:"AGENTS.md",warnings:[]}}},Dw={id:"agents-md",name:"AGENTS.md",description:"Universal cross-tool standard (Linux Foundation). Used by Codex, Amp, Gemini CLI, Aider, Zed.",tier:1,outputPath:"AGENTS.md",toolUrl:"https://agents.md/",scoringMetadata:{expectedSections:["## Identity","## File Handling","## Code Generation","## Review Process"],idealLengthRange:{min:500,max:8e3},supportedFeatures:["markdown-sections","code-blocks","lists","hierarchy"]}};function tf(e){return e.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n")}d(tf,"escapeYamlString");function cr(e){return e.replace(/[\r\n]+/g," ").trim()}d(cr,"sanitizeHeading");var Fk={system_identity:{header:"",placement:"prefix"},file_access_rules:{header:"## File Access",placement:"section"},code_generation_rules:{header:"## Code Rules",placement:"section"},review_checklist:{header:"## Checklist",placement:"section"}},Mw={convert(e,t){let n=[],r={includeTitle:!0,includeDescription:!0,includeMetadata:!1,...t};r.includeTitle&&n.push(`# ${cr(e.frontmatter.name)}`),r.includeDescription&&n.push(e.frontmatter.description);let o=de(e.content,e.slots,Fk);return o&&n.push(o),{output:n.join(`
122
-
123
- `),format:"claude-md",outputPath:"CLAUDE.md",warnings:[]}}},Lw={id:"claude-md",name:"Claude Code (CLAUDE.md)",description:"Claude Code configuration with hierarchical sections and @import support.",tier:1,outputPath:"CLAUDE.md",toolUrl:"https://docs.anthropic.com/en/docs/claude-code",scoringMetadata:{expectedSections:["## File Access","## Code Rules","## Checklist"],idealLengthRange:{min:300,max:5e3},supportedFeatures:["markdown-sections","code-blocks","import-syntax","hierarchy"]}};var Wk={system_identity:{header:"",placement:"prefix"},file_access_rules:{header:"## File Rules",placement:"section"},code_generation_rules:{header:"## Rules",placement:"section"},review_checklist:{header:"## Review",placement:"section"}},$w={convert(e,t){let n=[],r=["---",`description: "${tf(e.frontmatter.description)}"`,"alwaysApply: true","---"].join(`
124
- `),o=[];({includeTitle:!0,includeDescription:!1,includeMetadata:!1,...t}).includeTitle&&o.push(`# ${cr(e.frontmatter.name)}`);let i=de(e.content,e.slots,Wk);i&&o.push(i);let a=`${r}
125
-
126
- ${o.join(`
127
-
128
- `)}`,c=a.split(`
129
- `).length;return c>50&&n.push(`Output is ${c} lines. Cursor recommends 25-50 lines for .mdc files.`),{output:a,format:"cursorrules",outputPath:".cursor/rules/rulemetric.mdc",warnings:n}}},qw={id:"cursorrules",name:"Cursor Rules (.mdc)",description:"Cursor IDE rules in MDC format with YAML frontmatter. Supports globs and alwaysApply.",tier:1,outputPath:".cursor/rules/rulemetric.mdc",toolUrl:"https://docs.cursor.com/context/rules-for-ai",scoringMetadata:{expectedSections:["## File Rules","## Rules","## Review"],idealLengthRange:{min:200,max:3e3},supportedFeatures:["mdc-frontmatter","globs","markdown-sections","code-blocks"]}};var zk={system_identity:{header:"",placement:"prefix"},file_access_rules:{header:"## File Rules",placement:"section"},code_generation_rules:{header:"## Coding Rules",placement:"section"},review_checklist:{header:"## Review Steps",placement:"section"}},Uw={convert(e,t){let n=[],r={includeTitle:!0,includeDescription:!0,includeMetadata:!1,...t};r.includeTitle&&n.push(`# ${e.frontmatter.name}`),r.includeDescription&&n.push(e.frontmatter.description);let o=de(e.content,e.slots,zk);return o&&n.push(o),{output:n.join(`
130
-
131
- `),format:"copilot",outputPath:".github/copilot-instructions.md",warnings:[]}}},Hw={id:"copilot",name:"GitHub Copilot Instructions",description:"GitHub Copilot custom instructions in .github/copilot-instructions.md.",tier:1,outputPath:".github/copilot-instructions.md",toolUrl:"https://docs.github.com/en/copilot/customizing-copilot/adding-custom-instructions-for-github-copilot",scoringMetadata:{expectedSections:["## File Rules","## Coding Rules","## Review Steps"],idealLengthRange:{min:300,max:4e3},supportedFeatures:["markdown-sections","natural-language","code-blocks"]}};var Vk={system_identity:{header:"## Identity",placement:"section"},file_access_rules:{header:"## File Rules",placement:"section"},code_generation_rules:{header:"## Code Rules",placement:"section"},review_checklist:{header:"## Review",placement:"section"}},Bw={convert(e,t){let n=[],r=[],o={includeTitle:!0,includeDescription:!0,includeMetadata:!1,...t};o.includeTitle&&r.push(`# ${e.frontmatter.name}`),o.includeDescription&&r.push(e.frontmatter.description);let s=de(e.content,e.slots,Vk);s&&r.push(s);let i=r.join(`
132
-
133
- `);return i.length>12e3&&n.push(`Output is ${i.length} characters. Windsurf recommends under 12000 characters.`),{output:i,format:"windsurf",outputPath:".windsurfrules",warnings:n}}},Fw={id:"windsurf",name:"Windsurf Rules (.windsurfrules)",description:"Windsurf IDE rules file with markdown sections. Warns if output exceeds 12000 characters.",tier:2,outputPath:".windsurfrules",toolUrl:"https://docs.windsurf.com/windsurf/cascade#memories-and-rules",scoringMetadata:{expectedSections:["## Identity","## File Rules","## Code Rules","## Review"],idealLengthRange:{min:200,max:12e3},supportedFeatures:["markdown-sections","code-blocks","lists"]}};var Jk={system_identity:{header:"## Identity",placement:"section"},file_access_rules:{header:"## File Handling",placement:"section"},code_generation_rules:{header:"## Code Standards",placement:"section"},review_checklist:{header:"## Review",placement:"section"}},Ww={convert(e,t){let n=[],r={includeTitle:!0,includeDescription:!0,includeMetadata:!1,...t};r.includeTitle&&n.push(`# ${e.frontmatter.name}`),r.includeDescription&&n.push(e.frontmatter.description);let o=de(e.content,e.slots,Jk);return o&&n.push(o),{output:n.join(`
134
-
135
- `),format:"cline",outputPath:".clinerules",warnings:[]}}},zw={id:"cline",name:"Cline Rules (.clinerules)",description:"Cline AI assistant rules file with markdown sections for project-level instructions.",tier:2,outputPath:".clinerules",toolUrl:"https://docs.cline.bot/improving-your-workflow/custom-instructions",scoringMetadata:{expectedSections:["## Identity","## File Handling","## Code Standards","## Review"],idealLengthRange:{min:200,max:8e3},supportedFeatures:["markdown-sections","code-blocks","lists"]}};var Gk={system_identity:{header:"## Identity",placement:"section"},file_access_rules:{header:"## File Rules",placement:"section"},code_generation_rules:{header:"## Code Rules",placement:"section"},review_checklist:{header:"## Review",placement:"section"}},Vw={convert(e,t){let n=[],r={includeTitle:!0,includeDescription:!0,includeMetadata:!1,...t};r.includeTitle&&n.push(`# ${e.frontmatter.name}`),r.includeDescription&&n.push(e.frontmatter.description);let o=de(e.content,e.slots,Gk);return o&&n.push(o),{output:n.join(`
136
-
137
- `),format:"roo",outputPath:".roo/rules/rulemetric.md",warnings:[]}}},Jw={id:"roo",name:"Roo Code Rules (.roo/rules)",description:"Roo Code rules in markdown format stored in .roo/rules/ directory.",tier:2,outputPath:".roo/rules/rulemetric.md",toolUrl:"https://docs.roocode.com/features/custom-rules",scoringMetadata:{expectedSections:["## Identity","## File Rules","## Code Rules","## Review"],idealLengthRange:{min:200,max:8e3},supportedFeatures:["markdown-sections","code-blocks","lists"]}};var Kk={system_identity:{header:"## Identity",placement:"section"},file_access_rules:{header:"## File Conventions",placement:"section"},code_generation_rules:{header:"## Code Conventions",placement:"section"},review_checklist:{header:"## Review Conventions",placement:"section"}},Gw={convert(e,t){let n=[],r={includeTitle:!0,includeDescription:!0,includeMetadata:!1,...t};r.includeTitle&&n.push(`# ${e.frontmatter.name}`),r.includeDescription&&n.push(e.frontmatter.description);let o=de(e.content,e.slots,Kk);return o&&n.push(o),{output:n.join(`
138
-
139
- `),format:"aider",outputPath:"CONVENTIONS.md",warnings:[]}}},Kw={id:"aider",name:"Aider Conventions (CONVENTIONS.md)",description:"Aider coding conventions file in markdown format, loaded automatically from CONVENTIONS.md.",tier:2,outputPath:"CONVENTIONS.md",toolUrl:"https://aider.chat/docs/usage/conventions.html",scoringMetadata:{expectedSections:["## Identity","## File Conventions","## Code Conventions","## Review Conventions"],idealLengthRange:{min:200,max:8e3},supportedFeatures:["markdown-sections","code-blocks","lists"]}};var Yk={system_identity:{header:"## Identity",placement:"section"},file_access_rules:{header:"## File Handling",placement:"section"},code_generation_rules:{header:"## Code Generation",placement:"section"},review_checklist:{header:"## Review",placement:"section"}},Yw={convert(e,t){let n=[],r={includeTitle:!0,includeDescription:!0,includeMetadata:!1,...t};r.includeTitle&&n.push(`# ${e.frontmatter.name}`),r.includeDescription&&n.push(e.frontmatter.description);let o=de(e.content,e.slots,Yk);return o&&n.push(o),{output:n.join(`
140
-
141
- `),format:"gemini",outputPath:"GEMINI.md",warnings:[]}}},Xw={id:"gemini",name:"Gemini Instructions (GEMINI.md)",description:"Gemini CLI and Google AI Studio instructions in markdown format.",tier:2,outputPath:"GEMINI.md",toolUrl:"https://googlegemini.wiki/gemini-cli/customization/",scoringMetadata:{expectedSections:["## Identity","## File Handling","## Code Generation","## Review"],idealLengthRange:{min:200,max:8e3},supportedFeatures:["markdown-sections","code-blocks","lists"]}};var Xk={system_identity:{header:"## Identity",placement:"section"},file_access_rules:{header:"## File Rules",placement:"section"},code_generation_rules:{header:"## Code Rules",placement:"section"},review_checklist:{header:"## Review",placement:"section"}},Qw={convert(e,t){let n=[],r={includeTitle:!0,includeDescription:!0,includeMetadata:!1,...t};r.includeTitle&&n.push(`# ${e.frontmatter.name}`),r.includeDescription&&n.push(e.frontmatter.description);let o=de(e.content,e.slots,Xk);return o&&n.push(o),{output:n.join(`
142
-
143
- `),format:"continue",outputPath:".continuerules",warnings:[]}}},Zw={id:"continue",name:"Continue Rules (.continuerules)",description:"Continue IDE extension rules file with markdown-based project instructions.",tier:2,outputPath:".continuerules",toolUrl:"https://docs.continue.dev/customize/deep-dives/rules",scoringMetadata:{expectedSections:["## Identity","## File Rules","## Code Rules","## Review"],idealLengthRange:{min:200,max:6e3},supportedFeatures:["markdown-sections","code-blocks","lists"]}};var Qk={system_identity:{header:"## Identity",placement:"section"},file_access_rules:{header:"## File Guidelines",placement:"section"},code_generation_rules:{header:"## Code Guidelines",placement:"section"},review_checklist:{header:"## Review",placement:"section"}},ev={convert(e,t){let n=[],r={includeTitle:!0,includeDescription:!0,includeMetadata:!1,...t};r.includeTitle&&n.push(`# ${e.frontmatter.name}`),r.includeDescription&&n.push(e.frontmatter.description);let o=de(e.content,e.slots,Qk);return o&&n.push(o),{output:n.join(`
144
-
145
- `),format:"junie",outputPath:".junie/guidelines.md",warnings:[]}}},tv={id:"junie",name:"Junie Guidelines (.junie/guidelines.md)",description:"JetBrains Junie AI agent guidelines in markdown format.",tier:2,outputPath:".junie/guidelines.md",toolUrl:"https://www.jetbrains.com/help/junie/guidelines.html",scoringMetadata:{expectedSections:["## Identity","## File Guidelines","## Code Guidelines","## Review"],idealLengthRange:{min:200,max:6e3},supportedFeatures:["markdown-sections","code-blocks","lists"]}};var Zk={system_identity:{header:"## Identity",placement:"section"},file_access_rules:{header:"## File Rules",placement:"section"},code_generation_rules:{header:"## Code Rules",placement:"section"},review_checklist:{header:"## Review",placement:"section"}},nv={convert(e,t){let n=[],r={includeTitle:!0,includeDescription:!0,includeMetadata:!1,...t};r.includeTitle&&n.push(`# ${e.frontmatter.name}`),r.includeDescription&&n.push(e.frontmatter.description);let o=de(e.content,e.slots,Zk);return o&&n.push(o),{output:n.join(`
146
-
147
- `),format:"jetbrains",outputPath:".aiassistant/rules/rulemetric.md",warnings:[]}}},rv={id:"jetbrains",name:"JetBrains AI Assistant Rules",description:"JetBrains AI Assistant project-level rules in .aiassistant/rules/ directory.",tier:2,outputPath:".aiassistant/rules/rulemetric.md",toolUrl:"https://www.jetbrains.com/help/idea/ai-prompts.html",scoringMetadata:{expectedSections:["## Identity","## File Rules","## Code Rules","## Review"],idealLengthRange:{min:200,max:6e3},supportedFeatures:["markdown-sections","code-blocks","lists"]}};var ej={system_identity:{header:"## Identity",placement:"section"},file_access_rules:{header:"## File Handling",placement:"section"},code_generation_rules:{header:"## Code Generation",placement:"section"},review_checklist:{header:"## Review Process",placement:"section"}},ov={convert(e,t){let n=[],r={includeTitle:!0,includeDescription:!0,includeMetadata:!1,...t};r.includeTitle&&n.push(`# ${e.frontmatter.name}`),r.includeDescription&&n.push(e.frontmatter.description);let o=de(e.content,e.slots,ej);return o&&n.push(o),{output:n.join(`
148
-
149
- `),format:"codex",outputPath:"AGENTS.md",warnings:[]}}},sv={id:"codex",name:"OpenAI Codex (AGENTS.md)",description:"OpenAI Codex CLI instructions using the AGENTS.md standard format.",tier:2,outputPath:"AGENTS.md",toolUrl:"https://github.com/openai/codex",scoringMetadata:{expectedSections:["## Identity","## File Handling","## Code Generation","## Review Process"],idealLengthRange:{min:200,max:8e3},supportedFeatures:["markdown-sections","code-blocks","lists","hierarchy"]}};var tj={system_identity:{header:"## Identity",placement:"section"},file_access_rules:{header:"## File Rules",placement:"section"},code_generation_rules:{header:"## Code Rules",placement:"section"},review_checklist:{header:"## Review",placement:"section"}},iv={convert(e,t){let n=[],r={includeTitle:!0,includeDescription:!0,includeMetadata:!1,...t};r.includeTitle&&n.push(`# ${e.frontmatter.name}`),r.includeDescription&&n.push(e.frontmatter.description);let o=de(e.content,e.slots,tj);return o&&n.push(o),{output:n.join(`
150
-
151
- `),format:"amazon-q",outputPath:".amazonq/rules/rulemetric.md",warnings:[]}}},av={id:"amazon-q",name:"Amazon Q Developer (experimental)",description:"Amazon Q Developer rules format (experimental). Community-reported path.",tier:3,outputPath:".amazonq/rules/rulemetric.md",toolUrl:"https://aws.amazon.com/q/developer/",scoringMetadata:{expectedSections:["## Identity","## File Rules","## Code Rules","## Review"],idealLengthRange:{min:200,max:6e3},supportedFeatures:["markdown-sections","code-blocks","lists"]}};var nj={system_identity:{header:"## Identity",placement:"section"},file_access_rules:{header:"## File Rules",placement:"section"},code_generation_rules:{header:"## Code Rules",placement:"section"},review_checklist:{header:"## Review",placement:"section"}},cv={convert(e,t){let n=[],r={includeTitle:!0,includeDescription:!0,includeMetadata:!1,...t};r.includeTitle&&n.push(`# ${e.frontmatter.name}`),r.includeDescription&&n.push(e.frontmatter.description);let o=de(e.content,e.slots,nj);return o&&n.push(o),{output:n.join(`
152
-
153
- `),format:"goose",outputPath:".goosehints",warnings:[]}}},dv={id:"goose",name:"Goose Hints (experimental)",description:"Block Goose hints file format (experimental). Community-reported path.",tier:3,outputPath:".goosehints",toolUrl:"https://block.github.io/goose/",scoringMetadata:{expectedSections:["## Identity","## File Rules","## Code Rules","## Review"],idealLengthRange:{min:200,max:6e3},supportedFeatures:["markdown-sections","code-blocks","lists"]}};var rj={system_identity:{header:"## Identity",placement:"section"},file_access_rules:{header:"## File Rules",placement:"section"},code_generation_rules:{header:"## Code Rules",placement:"section"},review_checklist:{header:"## Review",placement:"section"}},uv={convert(e,t){let n=[],r={includeTitle:!0,includeDescription:!0,includeMetadata:!1,...t};r.includeTitle&&n.push(`# ${e.frontmatter.name}`),r.includeDescription&&n.push(e.frontmatter.description);let o=de(e.content,e.slots,rj);return o&&n.push(o),{output:n.join(`
154
-
155
- `),format:"kilocode",outputPath:".kilocode/rules/rulemetric.md",warnings:[]}}},lv={id:"kilocode",name:"Kilocode Rules (experimental)",description:"Kilocode rules file format (experimental). Community-reported path.",tier:3,outputPath:".kilocode/rules/rulemetric.md",toolUrl:"https://kilocode.ai/",scoringMetadata:{expectedSections:["## Identity","## File Rules","## Code Rules","## Review"],idealLengthRange:{min:200,max:6e3},supportedFeatures:["markdown-sections","code-blocks","lists"]}};var oj={system_identity:{header:"## Identity",placement:"section"},file_access_rules:{header:"## File Rules",placement:"section"},code_generation_rules:{header:"## Code Rules",placement:"section"},review_checklist:{header:"## Review",placement:"section"}},pv={convert(e,t){let n=[],r={includeTitle:!0,includeDescription:!0,includeMetadata:!1,...t};r.includeTitle&&n.push(`# ${e.frontmatter.name}`),r.includeDescription&&n.push(e.frontmatter.description);let o=de(e.content,e.slots,oj);return o&&n.push(o),{output:n.join(`
156
-
157
- `),format:"augment",outputPath:".augment-guidelines/rulemetric.md",warnings:[]}}},mv={id:"augment",name:"Augment Code Guidelines (experimental)",description:"Augment Code guidelines file format (experimental). Community-reported path.",tier:3,outputPath:".augment-guidelines/rulemetric.md",toolUrl:"https://www.augmentcode.com/",scoringMetadata:{expectedSections:["## Identity","## File Rules","## Code Rules","## Review"],idealLengthRange:{min:200,max:6e3},supportedFeatures:["markdown-sections","code-blocks","lists"]}};var sj={system_identity:{header:"## Identity",placement:"section"},file_access_rules:{header:"## File Rules",placement:"section"},code_generation_rules:{header:"## Code Rules",placement:"section"},review_checklist:{header:"## Review",placement:"section"}},fv={convert(e,t){let n=[],r={includeTitle:!0,includeDescription:!0,includeMetadata:!1,...t};r.includeTitle&&n.push(`# ${e.frontmatter.name}`),r.includeDescription&&n.push(e.frontmatter.description);let o=de(e.content,e.slots,sj);return o&&n.push(o),{output:n.join(`
158
-
159
- `),format:"tabnine",outputPath:".tabnine/instructions.md",warnings:[]}}},gv={id:"tabnine",name:"Tabnine Instructions (experimental)",description:"Tabnine instructions file format (experimental). Community-reported path.",tier:3,outputPath:".tabnine/instructions.md",toolUrl:"https://www.tabnine.com/",scoringMetadata:{expectedSections:["## Identity","## File Rules","## Code Rules","## Review"],idealLengthRange:{min:200,max:6e3},supportedFeatures:["markdown-sections","code-blocks","lists"]}};var ij={system_identity:{header:"## Identity",placement:"section"},file_access_rules:{header:"## File Rules",placement:"section"},code_generation_rules:{header:"## Code Rules",placement:"section"},review_checklist:{header:"## Review",placement:"section"}},hv={convert(e,t){let n=[],r={includeTitle:!0,includeDescription:!0,includeMetadata:!1,...t};r.includeTitle&&n.push(`# ${e.frontmatter.name}`),r.includeDescription&&n.push(e.frontmatter.description);let o=de(e.content,e.slots,ij);return o&&n.push(o),{output:n.join(`
160
-
161
- `),format:"opencode",outputPath:"AGENTS.md",warnings:[]}}},_v={id:"opencode",name:"OpenCode (experimental)",description:"OpenCode AGENTS.md format (experimental). Uses AGENTS.md standard.",tier:3,outputPath:"AGENTS.md",toolUrl:"https://opencode.ai/",scoringMetadata:{expectedSections:["## Identity","## File Rules","## Code Rules","## Review"],idealLengthRange:{min:200,max:6e3},supportedFeatures:["markdown-sections","code-blocks","lists"]}};var aj={system_identity:{header:"## Identity",placement:"section"},file_access_rules:{header:"## File Rules",placement:"section"},code_generation_rules:{header:"## Code Rules",placement:"section"},review_checklist:{header:"## Review",placement:"section"}},yv={convert(e,t){let n=[],r={includeTitle:!0,includeDescription:!0,includeMetadata:!1,...t};r.includeTitle&&n.push(`# ${e.frontmatter.name}`),r.includeDescription&&n.push(e.frontmatter.description);let o=de(e.content,e.slots,aj);return o&&n.push(o),{output:n.join(`
162
-
163
- `),format:"warp",outputPath:".warp/rules/rulemetric.md",warnings:[]}}},wv={id:"warp",name:"Warp Rules (experimental)",description:"Warp terminal rules file format (experimental). Community-reported path.",tier:3,outputPath:".warp/rules/rulemetric.md",toolUrl:"https://www.warp.dev/",scoringMetadata:{expectedSections:["## Identity","## File Rules","## Code Rules","## Review"],idealLengthRange:{min:200,max:6e3},supportedFeatures:["markdown-sections","code-blocks","lists"]}};var cj={system_identity:{header:"## Identity",placement:"section"},file_access_rules:{header:"## File Rules",placement:"section"},code_generation_rules:{header:"## Code Rules",placement:"section"},review_checklist:{header:"## Review",placement:"section"}},vv={convert(e,t){let n=[],r={includeTitle:!0,includeDescription:!0,includeMetadata:!1,...t};r.includeTitle&&n.push(`# ${e.frontmatter.name}`),r.includeDescription&&n.push(e.frontmatter.description);let o=de(e.content,e.slots,cj);return o&&n.push(o),{output:n.join(`
164
-
165
- `),format:"trae",outputPath:".trae/rules/rulemetric.md",warnings:[]}}},Iv={id:"trae",name:"Trae Rules (experimental)",description:"Trae rules file format (experimental). Community-reported path.",tier:3,outputPath:".trae/rules/rulemetric.md",toolUrl:"https://www.trae.ai/",scoringMetadata:{expectedSections:["## Identity","## File Rules","## Code Rules","## Review"],idealLengthRange:{min:200,max:6e3},supportedFeatures:["markdown-sections","code-blocks","lists"]}};var dj={system_identity:{header:"## Identity",placement:"section"},file_access_rules:{header:"## File Rules",placement:"section"},code_generation_rules:{header:"## Code Rules",placement:"section"},review_checklist:{header:"## Review",placement:"section"}},bv={convert(e,t){let n=[],r={includeTitle:!0,includeDescription:!0,includeMetadata:!1,...t};r.includeTitle&&n.push(`# ${e.frontmatter.name}`),r.includeDescription&&n.push(e.frontmatter.description);let o=de(e.content,e.slots,dj);return o&&n.push(o),{output:n.join(`
166
-
167
- `),format:"vscode-copilot",outputPath:".vscode/copilot-instructions.md",warnings:[]}}},Sv={id:"vscode-copilot",name:"VS Code Copilot Instructions (experimental)",description:"VS Code Copilot instructions file format (experimental). Community-reported path.",tier:3,outputPath:".vscode/copilot-instructions.md",toolUrl:"https://code.visualstudio.com/",scoringMetadata:{expectedSections:["## Identity","## File Rules","## Code Rules","## Review"],idealLengthRange:{min:200,max:6e3},supportedFeatures:["markdown-sections","code-blocks","lists"]}};var uj={system_identity:{header:"## Identity",placement:"section"},file_access_rules:{header:"## File Rules",placement:"section"},code_generation_rules:{header:"## Code Rules",placement:"section"},review_checklist:{header:"## Review",placement:"section"}},Av={convert(e,t){let n=[],r={includeTitle:!0,includeDescription:!0,includeMetadata:!1,...t};r.includeTitle&&n.push(`# ${e.frontmatter.name}`),r.includeDescription&&n.push(e.frontmatter.description);let o=de(e.content,e.slots,uj);return o&&n.push(o),{output:n.join(`
168
-
169
- `),format:"qodo",outputPath:".qodo/guidelines.md",warnings:[]}}},Ev={id:"qodo",name:"Qodo Guidelines (experimental)",description:"Qodo guidelines file format (experimental). Community-reported path.",tier:3,outputPath:".qodo/guidelines.md",toolUrl:"https://www.qodo.ai/",scoringMetadata:{expectedSections:["## Identity","## File Rules","## Code Rules","## Review"],idealLengthRange:{min:200,max:6e3},supportedFeatures:["markdown-sections","code-blocks","lists"]}};var lj={system_identity:{header:"## Identity",placement:"section"},file_access_rules:{header:"## File Rules",placement:"section"},code_generation_rules:{header:"## Code Rules",placement:"section"},review_checklist:{header:"## Review",placement:"section"}},xv={convert(e,t){let n=[],r={includeTitle:!0,includeDescription:!0,includeMetadata:!1,...t};r.includeTitle&&n.push(`# ${e.frontmatter.name}`),r.includeDescription&&n.push(e.frontmatter.description);let o=de(e.content,e.slots,lj);return o&&n.push(o),{output:n.join(`
170
-
171
- `),format:"genkit",outputPath:".genkit/rulemetric.md",warnings:[]}}},Tv={id:"genkit",name:"Firebase Genkit (experimental)",description:"Firebase Genkit rules file format (experimental). Community-reported path.",tier:3,outputPath:".genkit/rulemetric.md",toolUrl:"https://firebase.google.com/docs/genkit",scoringMetadata:{expectedSections:["## Identity","## File Rules","## Code Rules","## Review"],idealLengthRange:{min:200,max:6e3},supportedFeatures:["markdown-sections","code-blocks","lists"]}};var pj={system_identity:{header:"## Identity",placement:"section"},file_access_rules:{header:"## File Rules",placement:"section"},code_generation_rules:{header:"## Code Rules",placement:"section"},review_checklist:{header:"## Review",placement:"section"}},Rv={convert(e,t){let n=[],r={includeTitle:!0,includeDescription:!0,includeMetadata:!1,...t};r.includeTitle&&n.push(`# ${e.frontmatter.name}`),r.includeDescription&&n.push(e.frontmatter.description);let o=de(e.content,e.slots,pj);return o&&n.push(o),{output:n.join(`
172
-
173
- `),format:"amp",outputPath:"AGENTS.md",warnings:[]}}},kv={id:"amp",name:"Amp Rules (experimental)",description:"Amp AGENTS.md format (experimental). Uses AGENTS.md standard.",tier:3,outputPath:"AGENTS.md",toolUrl:"https://amp.dev/",scoringMetadata:{expectedSections:["## Identity","## File Rules","## Code Rules","## Review"],idealLengthRange:{min:200,max:6e3},supportedFeatures:["markdown-sections","code-blocks","lists"]}};var mj={system_identity:{header:"## Persona",placement:"section"},file_access_rules:{header:"## Knowledge",placement:"section"},code_generation_rules:{header:"## Rules",placement:"section"},review_checklist:{header:"## Workflow",placement:"section"}},jv={convert(e,t){let n=[],r={includeTitle:!0,includeDescription:!0,includeMetadata:!1,...t};r.includeTitle&&n.push(`# ${e.frontmatter.name}`),r.includeDescription&&n.push(e.frontmatter.description);let o=de(e.content,e.slots,mj);return o&&n.push(o),{output:n.join(`
174
-
175
- `),format:"soul-md",outputPath:"SOUL.md",warnings:[]}}},Nv={id:"soul-md",name:"SOUL.md",description:"OpenClaw agent personality format. Defines persona, rules, constraints, and knowledge for AI agents.",tier:2,outputPath:"SOUL.md",toolUrl:"https://openclaw.org/",scoringMetadata:{expectedSections:["## Persona","## Rules","## Knowledge","## Workflow"],idealLengthRange:{min:300,max:6e3},supportedFeatures:["markdown-sections","code-blocks","lists","hierarchy"]}};var fj={"## identity":"system_identity","## file handling":"file_access_rules","## code generation":"code_generation_rules","## review process":"review_checklist"},Pv={parse(e,t){let n=e.split(`
176
- `),r=t?.replace(/\.md$/i,"")??"Untitled",o={},s=[],i=null,a=[];for(let l of n){let p=l.toLowerCase().trim();if(l.startsWith("# ")&&r===(t?.replace(/\.md$/i,"")??"Untitled")){r=l.slice(2).trim();continue}let m=fj[p];if(m!==void 0){i&&(o[i]=a.join(`
177
- `).trim()),i=m,a=[];continue}i?a.push(l):s.push(l)}i&&(o[i]=a.join(`
178
- `).trim());let c=Object.keys(o).length>0;return{frontmatter:{name:r,description:`Imported from ${t??"AGENTS.md"}`,type:"instruction",scope:"personal",version:"1.0.0",tags:["imported"],compatibility:["agents-md"],...c?{slots:o}:{}},content:s.join(`
179
- `).trim(),slots:c?o:null}}};var gj={"## file access":"file_access_rules","## code rules":"code_generation_rules","## checklist":"review_checklist"},Cv={parse(e,t){let n=e.split(`
180
- `),r=t?.replace(/\.md$/i,"")??"Untitled",o={},s=[],i=null,a=[];for(let l of n){let p=l.toLowerCase().trim();if(l.startsWith("# ")&&r===(t?.replace(/\.md$/i,"")??"Untitled")){r=l.slice(2).trim();continue}let m=gj[p];if(m!==void 0){i&&(o[i]=a.join(`
181
- `).trim()),i=m,a=[];continue}i?a.push(l):s.push(l)}i&&(o[i]=a.join(`
182
- `).trim());let c=Object.keys(o).length>0;return{frontmatter:{name:r,description:`Imported from ${t??"CLAUDE.md"}`,type:"instruction",scope:"personal",version:"1.0.0",tags:["imported"],compatibility:["claude-code"],...c?{slots:o}:{}},content:s.join(`
183
- `).trim(),slots:c?o:null}}};var hj={"## file rules":"file_access_rules","## rules":"code_generation_rules","## review":"review_checklist"},Ov={parse(e,t){let n=e,r=e.match(/^---\n[\s\S]*?\n---\n?/);r&&(n=e.slice(r[0].length));let o=n.split(`
184
- `),s=t?.replace(/\.(mdc|cursorrules)$/i,"").replace(/^\./,"")??"Untitled",i={},a=[],c=null,l=[];for(let m of o){let y=m.toLowerCase().trim();if(m.startsWith("# ")&&s===(t?.replace(/\.(mdc|cursorrules)$/i,"").replace(/^\./,"")??"Untitled")){s=m.slice(2).trim();continue}let v=hj[y];if(v!==void 0){c&&(i[c]=l.join(`
185
- `).trim()),c=v,l=[];continue}c?l.push(m):a.push(m)}c&&(i[c]=l.join(`
186
- `).trim());let p=Object.keys(i).length>0;return{frontmatter:{name:s,description:`Imported from ${t??".cursorrules"}`,type:"instruction",scope:"personal",version:"1.0.0",tags:["imported"],compatibility:["cursor"],...p?{slots:i}:{}},content:a.join(`
187
- `).trim(),slots:p?i:null}}};var _j={"## file rules":"file_access_rules","## coding rules":"code_generation_rules","## review steps":"review_checklist"},Dv={parse(e,t){let n=e.split(`
188
- `),r=t?.replace(/\.md$/i,"")??"Untitled",o={},s=[],i=null,a=[];for(let l of n){let p=l.toLowerCase().trim();if(l.startsWith("# ")&&r===(t?.replace(/\.md$/i,"")??"Untitled")){r=l.slice(2).trim();continue}let m=_j[p];if(m!==void 0){i&&(o[i]=a.join(`
189
- `).trim()),i=m,a=[];continue}i?a.push(l):s.push(l)}i&&(o[i]=a.join(`
190
- `).trim());let c=Object.keys(o).length>0;return{frontmatter:{name:r,description:`Imported from ${t??"copilot-instructions.md"}`,type:"instruction",scope:"personal",version:"1.0.0",tags:["imported"],compatibility:["github-copilot"],...c?{slots:o}:{}},content:s.join(`
191
- `).trim(),slots:c?o:null}}};var yj={"## identity":"system_identity","## file rules":"file_access_rules","## code rules":"code_generation_rules","## review":"review_checklist"},Mv={parse(e,t){let n=e.split(`
192
- `),r=t?.replace(/^\./,"")??"Untitled",o={},s=[],i=null,a=[];for(let l of n){let p=l.toLowerCase().trim();if(l.startsWith("# ")&&r===(t?.replace(/^\./,"")??"Untitled")){r=l.slice(2).trim();continue}let m=yj[p];if(m!==void 0){i&&(o[i]=a.join(`
193
- `).trim()),i=m,a=[];continue}i?a.push(l):s.push(l)}i&&(o[i]=a.join(`
194
- `).trim());let c=Object.keys(o).length>0;return{frontmatter:{name:r,description:`Imported from ${t??".windsurfrules"}`,type:"instruction",scope:"personal",version:"1.0.0",tags:["imported"],compatibility:["windsurf"],...c?{slots:o}:{}},content:s.join(`
195
- `).trim(),slots:c?o:null}}};var wj={"## persona":"system_identity","## identity":"system_identity","## rules":"code_generation_rules","## constraints":"code_generation_rules","## workflow":"review_checklist","## knowledge":"file_access_rules"},Lv={parse(e,t){let n=e.split(`
196
- `),r=t?.replace(/\.md$/i,"")??"Untitled",o={},s=[],i=null,a=[];for(let l of n){let p=l.toLowerCase().trim();if(l.startsWith("# ")&&r===(t?.replace(/\.md$/i,"")??"Untitled")){r=l.slice(2).trim();continue}let m=wj[p];if(m!==void 0){i&&(o[i]=a.join(`
197
- `).trim()),i=m,a=[];continue}i?a.push(l):s.push(l)}i&&(o[i]=a.join(`
198
- `).trim());let c=Object.keys(o).length>0;return{frontmatter:{name:r,description:`Imported from ${t??"SOUL.md"}`,type:"instruction",scope:"personal",version:"1.0.0",tags:["imported"],compatibility:["soul-md"],...c?{slots:o}:{}},content:s.join(`
199
- `).trim(),slots:c?o:null}}};function ci(){let e=new dc;return e.register("agents-md",Ow,Dw),e.register("claude-md",Mw,Lw),e.register("cursorrules",$w,qw),e.register("copilot",Uw,Hw),e.register("windsurf",Bw,Fw),e.register("cline",Ww,zw),e.register("roo",Vw,Jw),e.register("aider",Gw,Kw),e.register("gemini",Yw,Xw),e.register("continue",Qw,Zw),e.register("junie",ev,tv),e.register("jetbrains",nv,rv),e.register("codex",ov,sv),e.register("soul-md",jv,Nv),e.register("amazon-q",iv,av),e.register("goose",cv,dv),e.register("kilocode",uv,lv),e.register("augment",pv,mv),e.register("tabnine",fv,gv),e.register("opencode",hv,_v),e.register("warp",yv,wv),e.register("trae",vv,Iv),e.register("vscode-copilot",bv,Sv),e.register("qodo",Av,Ev),e.register("genkit",xv,Tv),e.register("amp",Rv,kv),e.registerReverse("agents-md",Pv),e.registerReverse("claude-md",Cv),e.registerReverse("cursorrules",Ov),e.registerReverse("copilot",Dv),e.registerReverse("windsurf",Mv),e.registerReverse("soul-md",Lv),e}d(ci,"defaultRegistry");function $v(e,t){let{expectedSections:n}=t;if(n.length===0)return{name:"completeness",score:100,details:"No expected sections defined."};let r=e.toLowerCase(),o=n.filter(c=>r.includes(c.toLowerCase())),s=Math.round(o.length/n.length*100),i=n.filter(c=>!r.includes(c.toLowerCase())),a=`${o.length}/${n.length} expected sections found.`;return i.length>0&&(a+=` Missing: ${i.join(", ")}`),{name:"completeness",score:s,details:a}}d($v,"scoreCompleteness");function qv(e){let t=50,r=["always","never","must","use","avoid","ensure","require","do not"].filter(l=>e.toLowerCase().includes(l)).length;t+=Math.min(r*5,25);let o=(e.match(/```/g)||[]).length/2;t+=Math.min(o*5,15);let s=(e.match(/\*\.\w+|\.\w+\.\*/g)||[]).length;t+=Math.min(s*3,10);let a=["write good code","be careful","try to","when possible","if appropriate"].filter(l=>e.toLowerCase().includes(l)).length;t-=a*10,t=Math.max(0,Math.min(100,t));let c=t>=70?"Good specificity with concrete rules and examples.":t>=40?"Moderate specificity. Consider adding more concrete rules, code examples, or file patterns.":"Low specificity. Add imperative rules (always/never), code examples, and file patterns.";return{name:"specificity",score:t,details:c}}d(qv,"scoreSpecificity");function Uv(e){let t=100,n=[];/^#{1,6} /m.test(e)||(t-=20,n.push("No markdown headings found.")),(e.match(/```/g)||[]).length%2!==0&&(t-=30,n.push("Unmatched code fence found."));let s=(e.match(/^- /gm)||[]).length,i=(e.match(/^\* /gm)||[]).length;s>0&&i>0&&(t-=10,n.push("Inconsistent list markers (mixing - and *).")),e.trim().length===0&&(t=0,n.push("Output is empty.")),t=Math.max(0,t);let a=n.length>0?n.join(" "):"Well-formatted markdown.";return{name:"formatting",score:t,details:a}}d(Uv,"scoreFormatting");function Hv(e,t){let{min:n,max:r}=t.idealLengthRange,o=e.length;if(o>=n&&o<=r)return{name:"length",score:100,details:`${o} chars is within ideal range (${n}-${r}).`};let s;if(o<n)s=Math.max(0,Math.round(o/n*100));else{let a=o-r,c=r*.5;s=Math.max(0,Math.round((1-a/c)*100))}let i=o<n?`${o} chars is below ideal minimum (${n}). Add more content.`:`${o} chars exceeds ideal maximum (${r}). Consider trimming.`;return{name:"length",score:s,details:i}}d(Hv,"scoreLength");function Bv(e,t){let{supportedFeatures:n}=t,r=100,o=[];!n.includes("mdc-frontmatter")&&/^---\n/m.test(e)&&(r-=20,o.push("Contains YAML frontmatter but format may not support it.")),!n.includes("import-syntax")&&/@import\b/.test(e)&&(r-=15,o.push("Contains @import syntax but format does not support it.")),!n.includes("code-blocks")&&/```/.test(e)&&(r-=10,o.push("Contains code blocks but format may not render them.")),r=Math.max(0,r);let s=o.length>0?o.join(" "):"Output uses only supported features.";return{name:"compatibility",score:r,details:s}}d(Bv,"scoreCompatibility");function nf(e,t){let n=[{...$v(e,t),weight:.3},{...qv(e),weight:.25},{...Uv(e),weight:.15},{...Hv(e,t),weight:.15},{...Bv(e,t),weight:.15}],r=Math.round(n.reduce((s,i)=>s+i.score*i.weight,0)),o=[];for(let s of n)s.score<50?o.push({dimension:s.name,message:s.details,severity:s.score<30?"error":"warning"}):s.score<70&&o.push({dimension:s.name,message:s.details,severity:"info"});return{overall:r,dimensions:n,suggestions:o}}d(nf,"scoreOutput");function rf(e,t,n){let r=e.split(`
113
+ `),n=t.reduce((s,i)=>s+i.conns,0),r=TR(),o={};for(let s of r)o[s.remote]=(o[s.remote]??0)+1;return e.json({sampled_at:new Date().toISOString(),self:{process:process.env.PG_APPLICATION_NAME??"rulemetric",pid:process.pid,pool_max:Number(process.env.PG_POOL_MAX)||3,pooler_sockets:r.length,pooler_sockets_by_node:o,...(()=>{let s=$p();return{inflight_current:s.current,inflight_peak:s.peak,inflight_shed_count:s.shedCount,inflight_max:Qs(),ingest_inflight_max:Ka(),ingest_shed_count:s.ingestShedCount}})()},total_backends:n,breakdown:t})});C();import{Hono as qR}from"hono";import{z as at}from"zod";import{eq as Ce,and as cr,sql as ci,ilike as af,isNull as UR,or as cf,desc as Ow,inArray as Dw}from"drizzle-orm";import{z as Kt}from"zod";var Rw=["org","team","project","personal"],Xp=Kt.object({name:Kt.string().min(1),description:Kt.string().min(1),type:Kt.literal("instruction").default("instruction"),scope:Kt.enum(Rw),version:Kt.string().min(1),tags:Kt.array(Kt.string()).optional(),compatibility:Kt.array(Kt.string()).optional(),slots:Kt.record(Kt.string(),Kt.string()).optional(),metadata:Kt.record(Kt.string(),Kt.unknown()).optional()});import{z as kn}from"zod";var kw=kn.object({name:kn.string().min(1),description:kn.string().min(1),type:kn.literal("prompt"),version:kn.string().min(1),tags:kn.array(kn.string()).optional(),variables:kn.array(kn.string()).optional(),metadata:kn.record(kn.string(),kn.unknown()).optional()});function ac(e){return e<=3?"light":e<=8?"standard":"heavy"}u(ac,"computePackTier");var Id={claude_md:"claude_md",memory:"memory",skill_loaded:"skill"};function Qp(e,t){let n=Id[e];return n?`${n}::${t}`:null}u(Qp,"deriveContextIdentity");function Zp(e){if(!e||typeof e!="object")return e;let t=e,n=t.project_areas;if(n!==void 0&&!Array.isArray(n)){let r=n&&typeof n=="object"?n.areas:void 0;t.project_areas=Array.isArray(r)?r:void 0}return e}u(Zp,"normalizeRecommendations");import RR from"gray-matter";import{z as Nw}from"zod";var HF=Nw.object({type:Nw.enum(["instruction","prompt"])});function bd(e){let{data:t,content:n}=RR(e),r=Xp.parse(t),o=r.slots??null;return{frontmatter:r,content:n.trim(),slots:o}}u(bd,"parseInstruction");function ai(e){return e.replace(/[\r\n]+/g," ").trim()}u(ai,"sanitizeHeading");function ef(e,t,n){let r=e.split(`
200
114
  `),o=t.split(`
201
115
  `),s=n.split(`
202
- `),i=Fv(r,o),a=Fv(r,s),c=[],l=[],p=0;for(;p<r.length||i.has(p)||a.has(p);){let m=i.get(p),y=a.get(p);if(m&&y)Ij(m.newLines,y.newLines)?l.push(...m.newLines):(c.push({localLines:y.newLines,upstreamLines:m.newLines,startLine:p}),l.push("<<<<<<< local"),l.push(...y.newLines),l.push("======="),l.push(...m.newLines),l.push(">>>>>>> upstream")),i.delete(p),a.delete(p),p=Math.max(m.endBase,y.endBase);else if(m)l.push(...m.newLines),i.delete(p),p=m.endBase;else if(y)l.push(...y.newLines),a.delete(p),p=y.endBase;else if(p<r.length)l.push(r[p]),p++;else break}return{merged:l.join(`
203
- `),hasConflicts:c.length>0,conflicts:c}}d(rf,"threeWayMerge");function Fv(e,t){let n=new Map,r=vj(e,t),o=0,s=0,i=0;for(;o<e.length||s<t.length;)if(i<r.length&&o<e.length&&s<t.length&&e[o]===r[i]&&t[s]===r[i])o++,s++,i++;else{let a=o,c=[];for(;o<e.length&&(i>=r.length||e[o]!==r[i]);)o++;for(;s<t.length&&(i>=r.length||t[s]!==r[i]);)c.push(t[s]),s++;n.set(a,{newLines:c,endBase:o})}return n}d(Fv,"diffLines");function vj(e,t){let n=e.length,r=t.length,o=Array.from({length:n+1},()=>Array(r+1).fill(0));for(let c=1;c<=n;c++)for(let l=1;l<=r;l++)o[c][l]=e[c-1]===t[l-1]?o[c-1][l-1]+1:Math.max(o[c-1][l],o[c][l-1]);let s=[],i=n,a=r;for(;i>0&&a>0;)e[i-1]===t[a-1]?(s.unshift(e[i-1]),i--,a--):o[i-1][a]>o[i][a-1]?i--:a--;return s}d(vj,"computeLCS");function Ij(e,t){return e.length===t.length&&e.every((n,r)=>n===t[r])}d(Ij,"arraysEqual");var bu=class{static{d(this,"AnthropicProvider")}name="anthropic";apiKey;constructor(t){this.apiKey=t}async complete(t,n){let r=n?.model??"claude-sonnet-4-5-20250929",o=n?.maxTokens??2048,s=n?.temperature??.3,i=await fetch("https://api.anthropic.com/v1/messages",{method:"POST",headers:{"Content-Type":"application/json","x-api-key":this.apiKey,"anthropic-version":"2023-06-01"},body:JSON.stringify({model:r,max_tokens:o,temperature:s,messages:[{role:"user",content:t}]})});if(!i.ok){let c=await i.text();throw new Error(`Anthropic API error (${i.status}): ${c}`)}let a=await i.json();return{text:a.content.filter(c=>c.type==="text").map(c=>c.text).join(""),usage:{inputTokens:a.usage.input_tokens,outputTokens:a.usage.output_tokens}}}};var Su=class{static{d(this,"OpenAIProvider")}name="openai";apiKey;constructor(t){this.apiKey=t}async complete(t,n){let r=n?.model??"gpt-4o",o=n?.maxTokens??2048,s=n?.temperature??.3,i=await fetch("https://api.openai.com/v1/chat/completions",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`},body:JSON.stringify({model:r,max_tokens:o,temperature:s,messages:[{role:"user",content:t}]})});if(!i.ok){let c=await i.text();throw new Error(`OpenAI API error (${i.status}): ${c}`)}let a=await i.json();return{text:a.choices[0]?.message.content??"",usage:{inputTokens:a.usage.prompt_tokens,outputTokens:a.usage.completion_tokens}}}};var bj={anthropic:d(e=>new bu(e),"anthropic"),openai:d(e=>new Su(e),"openai")};function uc(e,t){let n=bj[e];if(!n)throw new Error(`Unknown LLM provider: ${e}`);return n(t)}d(uc,"createLLMProvider");function lc(e,t){let n=t.map(r=>`- ID: ${r.id}
116
+ `),i=jw(r,o),c=jw(r,s),a=[],l=[],m=0;for(;m<r.length||i.has(m)||c.has(m);){let p=i.get(m),_=c.get(m);if(p&&_)NR(p.newLines,_.newLines)?l.push(...p.newLines):(a.push({localLines:_.newLines,upstreamLines:p.newLines,startLine:m}),l.push("<<<<<<< local"),l.push(..._.newLines),l.push("======="),l.push(...p.newLines),l.push(">>>>>>> upstream")),i.delete(m),c.delete(m),m=Math.max(p.endBase,_.endBase);else if(p)l.push(...p.newLines),i.delete(m),m=p.endBase;else if(_)l.push(..._.newLines),c.delete(m),m=_.endBase;else if(m<r.length)l.push(r[m]),m++;else break}return{merged:l.join(`
117
+ `),hasConflicts:a.length>0,conflicts:a}}u(ef,"threeWayMerge");function jw(e,t){let n=new Map,r=kR(e,t),o=0,s=0,i=0;for(;o<e.length||s<t.length;)if(i<r.length&&o<e.length&&s<t.length&&e[o]===r[i]&&t[s]===r[i])o++,s++,i++;else{let c=o,a=[];for(;o<e.length&&(i>=r.length||e[o]!==r[i]);)o++;for(;s<t.length&&(i>=r.length||t[s]!==r[i]);)a.push(t[s]),s++;n.set(c,{newLines:a,endBase:o})}return n}u(jw,"diffLines");function kR(e,t){let n=e.length,r=t.length,o=Array.from({length:n+1},()=>Array(r+1).fill(0));for(let a=1;a<=n;a++)for(let l=1;l<=r;l++)o[a][l]=e[a-1]===t[l-1]?o[a-1][l-1]+1:Math.max(o[a-1][l],o[a][l-1]);let s=[],i=n,c=r;for(;i>0&&c>0;)e[i-1]===t[c-1]?(s.unshift(e[i-1]),i--,c--):o[i-1][c]>o[i][c-1]?i--:c--;return s}u(kR,"computeLCS");function NR(e,t){return e.length===t.length&&e.every((n,r)=>n===t[r])}u(NR,"arraysEqual");var Sd=class{static{u(this,"AnthropicProvider")}name="anthropic";apiKey;constructor(t){this.apiKey=t}async complete(t,n){let r=n?.model??"claude-sonnet-4-5-20250929",o=n?.maxTokens??2048,s=n?.temperature??.3,i=await fetch("https://api.anthropic.com/v1/messages",{method:"POST",headers:{"Content-Type":"application/json","x-api-key":this.apiKey,"anthropic-version":"2023-06-01"},body:JSON.stringify({model:r,max_tokens:o,temperature:s,messages:[{role:"user",content:t}]})});if(!i.ok){let a=await i.text();throw new Error(`Anthropic API error (${i.status}): ${a}`)}let c=await i.json();return{text:c.content.filter(a=>a.type==="text").map(a=>a.text).join(""),usage:{inputTokens:c.usage.input_tokens,outputTokens:c.usage.output_tokens}}}};var Ad=class{static{u(this,"OpenAIProvider")}name="openai";apiKey;constructor(t){this.apiKey=t}async complete(t,n){let r=n?.model??"gpt-4o",o=n?.maxTokens??2048,s=n?.temperature??.3,i=await fetch("https://api.openai.com/v1/chat/completions",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`},body:JSON.stringify({model:r,max_tokens:o,temperature:s,messages:[{role:"user",content:t}]})});if(!i.ok){let a=await i.text();throw new Error(`OpenAI API error (${i.status}): ${a}`)}let c=await i.json();return{text:c.choices[0]?.message.content??"",usage:{inputTokens:c.usage.prompt_tokens,outputTokens:c.usage.completion_tokens}}}};var jR={anthropic:u(e=>new Sd(e),"anthropic"),openai:u(e=>new Ad(e),"openai")};function cc(e,t){let n=jR[e];if(!n)throw new Error(`Unknown LLM provider: ${e}`);return n(t)}u(cc,"createLLMProvider");function uc(e,t){let n=t.map(r=>`- ID: ${r.id}
204
118
  Name: ${r.name}
205
119
  Description: ${r.description}
206
120
  Tags: ${r.tags.join(", ")}
@@ -233,14 +147,14 @@ Return your response as JSON in this exact format:
233
147
  ]
234
148
  }
235
149
 
236
- Only include instructions with a relevance score >= 0.5. Order by score descending. Return valid JSON only, no markdown fences.`}d(lc,"buildRecommendationPrompt");function of(e){try{let t=e.match(/\{[\s\S]*\}/);if(!t)return[];let n=JSON.parse(t[0]);return!n.recommendations||!Array.isArray(n.recommendations)?[]:n.recommendations.filter(r=>typeof r.instructionId=="string"&&typeof r.score=="number"&&typeof r.reason=="string")}catch{return[]}}d(of,"parseRecommendationResponse");var Wv=32e3,Sj={name:"x".repeat(64),description:"x".repeat(256),languages:["TypeScript","Python","Go"],topics:["x".repeat(32)],dependencies:["x".repeat(32)]};function sf(e,t={}){if(e.length===0)return[];let n=t.charBudget??Wv,r=lc(Sj,[]).length,o=[],s=[],i=0;for(let a of e){let c=Aj(a);s.length>0&&r+i+c>n&&(o.push(s),s=[],i=0),s.push(a),i+=c}return s.length>0&&o.push(s),o}d(sf,"batchCandidatesForPrompt");function Aj(e){return`- ID: ${e.id}
150
+ Only include instructions with a relevance score >= 0.5. Order by score descending. Return valid JSON only, no markdown fences.`}u(uc,"buildRecommendationPrompt");function tf(e){try{let t=e.match(/\{[\s\S]*\}/);if(!t)return[];let n=JSON.parse(t[0]);return!n.recommendations||!Array.isArray(n.recommendations)?[]:n.recommendations.filter(r=>typeof r.instructionId=="string"&&typeof r.score=="number"&&typeof r.reason=="string")}catch{return[]}}u(tf,"parseRecommendationResponse");var Pw=32e3,PR={name:"x".repeat(64),description:"x".repeat(256),languages:["TypeScript","Python","Go"],topics:["x".repeat(32)],dependencies:["x".repeat(32)]};function nf(e,t={}){if(e.length===0)return[];let n=t.charBudget??Pw,r=uc(PR,[]).length,o=[],s=[],i=0;for(let c of e){let a=DR(c);s.length>0&&r+i+a>n&&(o.push(s),s=[],i=0),s.push(c),i+=a}return s.length>0&&o.push(s),o}u(nf,"batchCandidatesForPrompt");function DR(e){return`- ID: ${e.id}
237
151
  Name: ${e.name}
238
152
  Description: ${e.description}
239
153
  Tags: ${e.tags.join(", ")}
240
- Preview: ${e.contentPreview}`.length+2}d(Aj,"renderedSize");async function af(e,t,n){if(t.length===0)return{recommendations:[],error:null};let r;try{r=uc(n.llmProvider,n.llmApiKey)}catch(a){return{recommendations:[],error:a instanceof Error?a.message:String(a)}}let o=sf(t,{charBudget:n.charBudget}),s=[],i=[];for(let a of o)try{let c=await r.complete(lc(e,a));s.push(...of(c.text))}catch(c){i.push(c instanceof Error?c.message:String(c))}return{recommendations:s,error:i.length>0?i.join("; "):null}}d(af,"scoreInstructions");var Ej=new Set(["127.0.0.1","localhost","::1","[::1]","0.0.0.0"]);function xj(e){if(!e)return null;try{return new URL(e).hostname}catch{return null}}d(xj,"databaseUrlHost");function cf(e=process.env){let t=e.RULEMETRIC_DEPLOYMENT?.trim().toLowerCase();if(t==="cloud"||t==="local")return{mode:t,source:"env"};if(t)return{mode:"cloud",source:"default",error:`RULEMETRIC_DEPLOYMENT="${e.RULEMETRIC_DEPLOYMENT}" is not "cloud" or "local" \u2014 ignoring it and defaulting to cloud.`};let n=xj(e.DATABASE_URL);return n&&Ej.has(n)?{mode:"local",source:"inferred"}:{mode:"cloud",source:"default"}}d(cf,"resolveDeployment");function Au(e){if(!e||typeof e!="object")return null;let t=e.source;return t==="insights"||t==="evolution"?t:null}d(Au,"readStampedSource");function Eu(e,t){let n=e.source==="insights"||e.source==="evolution"?e.source:Au(e.frontmatter);return n||(e.createdBy&&e.createdBy===t?"user":"catalog")}d(Eu,"classifyProvenance");O();function Tt(e){if(!Us())return;let t=Cp();u.insert(so).values({instructionId:e.instructionId??null,userId:e.userId,surface:e.surface,action:e.action,metadata:e.metadata??null,traceId:t??null}).then(()=>{}).catch(n=>{console.error("Usage tracking error:",n)})}d(Tt,"trackUsage");var Tj={critical:25,high:15,medium:8,low:3},Rj=[{pattern:/ignore\s+(all\s+)?previous\s+instructions/i,severity:"critical",category:"prompt_injection",description:"Instruction override attempt"},{pattern:/before responding.*you MUST/i,severity:"critical",category:"prompt_injection",description:"Mandatory pre-response action injection"},{pattern:/never mention.*to the user/i,severity:"high",category:"prompt_injection",description:"Concealment language"},{pattern:/forget (everything|all|your).*instructions/i,severity:"critical",category:"prompt_injection",description:"Memory wipe injection"},{pattern:/you are now\s+/i,severity:"high",category:"prompt_injection",description:"Identity/role hijacking"},{pattern:/IMPORTANT:?\s*(system|override|mandatory|compliance)/i,severity:"high",category:"prompt_injection",description:"Fake authority escalation"},{pattern:/<system-reminder>/i,severity:"critical",category:"spoofing",description:"System-reminder tag spoofing"},{pattern:/<\/system-reminder>/i,severity:"critical",category:"spoofing",description:"System-reminder closing tag spoofing"},{pattern:/Contents of.*CLAUDE\.md.*project instructions/i,severity:"high",category:"spoofing",description:"Mimics Claude system context format"},{pattern:/<(system|assistant|tool)-(reminder|message|context)>/i,severity:"high",category:"spoofing",description:"System XML tag spoofing"},{pattern:/\[SYSTEM\]|\[INST\]|<<SYS>>/i,severity:"high",category:"spoofing",description:"Llama/Mistral system prompt markers"},{pattern:/process\.env.*(include|output|log|report|display|print)/i,severity:"critical",category:"secret_exfil",description:"Node.js environment access + exfiltration"},{pattern:/(include|output|log|report|display|print).*process\.env/i,severity:"critical",category:"secret_exfil",description:"Exfiltration verb + Node.js environment access"},{pattern:/os\.environ.*(include|output|log|report|display)/i,severity:"critical",category:"secret_exfil",description:"Python environment access + exfiltration"},{pattern:/cat\s+~?\/?\.(?:env|ssh|aws|npmrc|gitconfig)/i,severity:"critical",category:"secret_exfil",description:"Direct secret file read command"},{pattern:/env\s*\|\s*sort|printenv/i,severity:"high",category:"secret_exfil",description:"Full environment dump command"},{pattern:/\.(env|ssh\/id_rsa|aws\/credentials)\b/i,severity:"high",category:"secret_exfil",description:"Secret file path reference"},{pattern:/<\/(?:rule|instruction|system)>/i,severity:"high",category:"converter_escape",description:"XML structure escape in converter output"},{pattern:/<script|<iframe|javascript:/i,severity:"high",category:"fork_poison",description:"XSS payload"}];function df(e,t,n){let r=[],o=[e,t??"",n??""].join(`
241
- `);for(let i of Rj){let a=o.match(i.pattern);a&&r.push({pattern:i.description,severity:i.severity,category:i.category,match:a[0].slice(0,100)})}let s=100;for(let i of r)s-=Tj[i.severity]??5;return{score:Math.max(0,Math.min(100,s)),findings:r}}d(df,"scanContent");var wn=new kj,Nj=ct.object({name:ct.string().min(1).max(255),description:ct.string().min(1),scope:ct.enum(["org","team","project","personal"]),scopeRef:ct.string().uuid().optional(),version:ct.string().default("1.0.0"),content:ct.string().min(1),tags:ct.array(ct.string()).optional(),compatibility:ct.array(ct.string()).optional()}),Pj=ct.object({name:ct.string().min(1).max(255).optional(),description:ct.string().min(1).optional(),version:ct.string().optional(),content:ct.string().min(1).optional(),tags:ct.array(ct.string()).optional(),compatibility:ct.array(ct.string()).optional(),changeSummary:ct.string().optional()});wn.get("/instructions",async e=>{let t=e.get("userId"),n=e.req.query("search"),r=e.req.query("scope"),o=e.req.query("tags"),s=e.req.query("type"),i=parseInt(e.req.query("limit")??"100",10),a=parseInt(e.req.query("offset")??"0",10),c=[Me(g.archived,!1),Me(g.createdBy,t)];if(r&&c.push(Me(g.scope,r)),s&&c.push(Me(g.type,s)),n){let h=ot(n);c.push(lf(uf(g.name,`%${h}%`),uf(g.description,`%${h}%`),uf(g.content,`%${h}%`)))}let l=await u.select().from(g).where(dr(...c)).orderBy(Vv(g.updatedAt)).limit(i).offset(a);if(o){let h=o.split(",").map(f=>f.trim().toLowerCase());l=l.filter(f=>h.some(w=>f.tags?.some(b=>b.toLowerCase().includes(w))))}let p=l.map(h=>h.id),m=p.length>0?await u.select({instructionId:at.instructionId,projectName:U.name,projectId:U.id}).from(at).innerJoin(U,Me(U.id,at.projectId)).where(di`${at.instructionId} IN (${di.join(p.map(h=>di`${h}`),di`, `)})`):[],y=new Map;for(let h of m){let f=y.get(h.instructionId)??[];f.push({projectId:h.projectId,projectName:h.projectName}),y.set(h.instructionId,f)}let v=l.map(h=>({...h,projects:y.get(h.id)??[]}));return Tt({userId:t,surface:"api",action:"list"}),e.json(v)});wn.get("/instructions/by-hash/:hash",async e=>{let t=e.get("userId"),n=e.req.param("hash"),[r]=await u.select({id:g.id,name:g.name,contextIdentity:g.contextIdentity,version:g.version,type:g.type}).from(g).where(dr(Me(g.contentHash,n),Me(g.createdBy,t),Me(g.archived,!1))).limit(1);return r?e.json({instruction:r}):e.json({instruction:null})});wn.post("/instructions/by-hashes",async e=>{let t=e.get("userId"),n=await e.req.json(),r=ct.array(ct.string()).max(200).parse(n.hashes??[]),o=ct.array(ct.string()).max(200).parse(n.identities??[]);if(r.length===0&&o.length===0)return e.json({instructions:{}});let s=[Me(g.createdBy,t),Me(g.archived,!1)],i=[];r.length>0&&i.push(zv(g.contentHash,r)),o.length>0&&i.push(zv(g.contextIdentity,o));let a=await u.select({id:g.id,name:g.name,contextIdentity:g.contextIdentity,version:g.version,type:g.type,contentHash:g.contentHash,source:di`${g.frontmatter}->>'source'`}).from(g).where(dr(...s,i.length===1?i[0]:lf(...i))),c={};for(let l of a)l.contentHash&&(c[l.contentHash]=l),l.contextIdentity&&(c[l.contextIdentity]=l);return e.json({instructions:c})});wn.get("/instructions/:id/sessions",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await u.select({sessionId:se.sessionId,linkMethod:se.linkMethod,tool:_.tool,projectPath:_.projectPath,startedAt:_.startedAt,endedAt:_.endedAt,analysis:_.analysis}).from(se).innerJoin(_,Me(_.id,se.sessionId)).where(dr(Me(se.instructionId,n),Me(_.userId,t))).orderBy(Vv(_.startedAt)).limit(50);return e.json({sessions:r})});wn.get("/instructions/:id",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await u.select().from(g).where(dr(Me(g.id,t),Me(g.archived,!1),lf(Me(g.createdBy,n),Me(g.scope,"public"))));return r?(Tt({instructionId:t,userId:n,surface:"api",action:"view"}),e.json(r)):e.json({error:"Instruction not found"},404)});var Cj=/<\/?(?:system-reminder|system|available-deferred-tools|tool-result)>/i;function Jv(e){return Cj.test(e)?"Content contains forbidden system tags":null}d(Jv,"validateNoForbiddenTags");wn.post("/instructions",async e=>{let t=e.get("userId"),n=await e.req.json(),r=Nj.parse(n),o=Jv(r.content);if(o)return e.json({error:o},422);r.name=cr(r.name),r.description=cr(r.description);let s={},i=null;try{let p=ai(r.content);s=p.frontmatter,i=p.slots}catch{s={name:r.name,description:r.description,type:"instruction",scope:r.scope,version:r.version}}let a=r.scope==="personal"?t:r.scopeRef??null,c=df(r.content,r.name,r.description),[l]=await u.insert(g).values({name:r.name,description:r.description,type:"instruction",scope:r.scope,scopeRef:a,version:r.version,content:r.content,frontmatter:s,slots:i,tags:r.tags??[],compatibility:r.compatibility??[],createdBy:t,scanScore:c.score,scanFindings:c.findings.length>0?c.findings:null}).returning();return await u.insert(Ie).values({instructionId:l.id,versionNumber:1,content:r.content,frontmatter:s,changeSummary:"Initial version",createdBy:t}),Tt({instructionId:l.id,userId:t,surface:"api",action:"create"}),e.json(l,201)});wn.put("/instructions/:id",async e=>{let t=e.req.param("id"),n=e.get("userId"),r=await e.req.json(),o=Pj.parse(r);if(o.content){let m=Jv(o.content);if(m)return e.json({error:m},422)}o.name&&(o.name=cr(o.name)),o.description&&(o.description=cr(o.description));let[s]=await u.select().from(g).where(dr(Me(g.id,t),Me(g.createdBy,n),Me(g.archived,!1)));if(!s)return e.json({error:"Instruction not found"},404);let i=s.frontmatter,a=s.slots;if(o.content)try{let m=ai(o.content);i=m.frontmatter,a=m.slots}catch{}let c={};if(o.content||o.name||o.description){let m=df(o.content??s.content,o.name??s.name,o.description??s.description);c.scanScore=m.score,c.scanFindings=m.findings.length>0?m.findings:null}let l,p=4;for(let m=0;m<=p;m++)try{l=await u.transaction(async y=>{await y.select({id:g.id}).from(g).where(Me(g.id,t)).for("update");let[{maxVersion:v}]=await y.select({maxVersion:di`COALESCE(MAX(${Ie.versionNumber}), 0)`}).from(Ie).where(Me(Ie.instructionId,t)),h=v+1,[f]=await y.update(g).set({...o.name&&{name:o.name},...o.description&&{description:o.description},...o.version&&{version:o.version},...o.content&&{content:o.content},...o.tags&&{tags:o.tags},...o.compatibility&&{compatibility:o.compatibility},frontmatter:i,slots:a,...c,updatedAt:new Date}).where(Me(g.id,t)).returning();return await y.insert(Ie).values({instructionId:t,versionNumber:h,content:o.content??s.content,frontmatter:i,changeSummary:o.changeSummary??null,createdBy:n}),f});break}catch(y){if(y.cause?.code==="23505"&&m<p)continue;throw y}return l?(Tt({instructionId:t,userId:n,surface:"api",action:"update"}),e.json(l)):e.json({error:"Instruction update failed"},500)});wn.delete("/instructions/:id",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await u.select().from(g).where(dr(Me(g.id,t),Me(g.createdBy,n),Me(g.archived,!1)));if(!r)return e.json({error:"Instruction not found"},404);let[o]=await u.update(g).set({archived:!0,archivedAt:new Date,archivedBy:n}).where(Me(g.id,t)).returning(),s=await u.update(x).set({dismissedAt:new Date,isStale:!0}).where(dr(Me(x.userId,n),Me(x.instructionId,t),jj(x.dismissedAt))).returning({id:x.id});return Tt({instructionId:t,userId:n,surface:"api",action:"delete"}),e.json({...o,dismissedSuggestions:s.length})});wn.post("/instructions/:id/restore",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await u.select().from(g).where(dr(Me(g.id,t),Me(g.createdBy,n),Me(g.archived,!0)));if(!r)return e.json({error:"Archived instruction not found"},404);let[o]=await u.update(g).set({archived:!1,archivedAt:null,archivedBy:null}).where(Me(g.id,t)).returning();return Tt({instructionId:t,userId:n,surface:"api",action:"update"}),e.json(o)});wn.get("/instructions/:id/versions",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await u.select({id:g.id}).from(g).where(dr(Me(g.id,t),Me(g.createdBy,n)));if(!r)return e.json({error:"Instruction not found"},404);let o=await u.select().from(Ie).where(Me(Ie.instructionId,t)).orderBy(Ie.versionNumber);return e.json(o)});O();import{Hono as Oj}from"hono";import{z as pf}from"zod";import{eq as Gv,and as Dj}from"drizzle-orm";var xu=new Oj,Mj=pf.object({format:pf.enum(Iu),score:pf.enum(["true","false"]).optional().default("false")});xu.post("/instructions/:id/convert",async e=>{let t=e.req.param("id"),n=Mj.parse(e.req.query()),r=n.format,o=n.score==="true",[s]=await u.select().from(g).where(Dj(Gv(g.id,t),Gv(g.archived,!1)));if(!s)return e.json({error:"Instruction not found"},404);let i;try{i=ai(s.content)}catch{i={frontmatter:{name:s.name,description:s.description??"",type:"instruction",scope:s.scope,version:s.version??"1.0.0",tags:s.tags??[],compatibility:s.compatibility??[]},content:s.content,slots:s.slots}}let a=ci(),c=a.get(r);if(!c)return e.json({error:`Unsupported format: ${r}`},400);let l=c.convert(i),p=e.get("userId");if(Tt({instructionId:t,userId:p,surface:"api",action:"convert",metadata:{format:r}}),o){let m=a.getMetadata(r);if(m){let y=nf(l.output,m.scoringMetadata);return e.json({...l,score:y})}}return e.json(l)});import{Hono as Lj}from"hono";var Tu=new Lj;Tu.get("/converters",async e=>{let n=ci().listAll().map(r=>({id:r.metadata.id,name:r.metadata.name,description:r.metadata.description,tier:r.metadata.tier,outputPath:r.metadata.outputPath,toolUrl:r.metadata.toolUrl}));return e.json(n)});O();import{Hono as $j}from"hono";import{z as qr}from"zod";var Ru=new $j,qj=qr.object({content:qr.string().min(1),sourceFormat:qr.enum(Iu).optional(),filename:qr.string().optional(),name:qr.string().optional(),scope:qr.enum(["org","team","project","personal"]).default("personal"),scopeRef:qr.string().uuid().optional(),tags:qr.array(qr.string()).optional()});Ru.post("/instructions/import",async e=>{let t=e.get("userId"),n=await e.req.json(),r=qj.parse(n),o=r.sourceFormat??null;if(!o){let m=ef({filename:r.filename,content:r.content});m&&(o=m.format)}if(!o)return e.json({error:"Could not detect format. Provide sourceFormat explicitly."},400);let s=ci(),i=s.getReverse(o);if(!i)return e.json({error:`No import parser for format: ${o}`,supportedFormats:s.listReverseFormats()},400);let a=i.parse(r.content,r.filename),c=r.name??a.frontmatter.name,l=r.scope==="personal"?t:r.scopeRef??null,[p]=await u.insert(g).values({name:c,description:a.frontmatter.description,type:"instruction",scope:r.scope,scopeRef:l,version:"1.0.0",content:a.content,frontmatter:a.frontmatter,slots:a.slots,tags:r.tags??a.frontmatter.tags??[],compatibility:a.frontmatter.compatibility??[],createdBy:t}).returning();return await u.insert(Ie).values({instructionId:p.id,versionNumber:1,content:a.content,frontmatter:a.frontmatter,changeSummary:`Imported from ${o}`,createdBy:t}),Tt({instructionId:p.id,userId:t,surface:"api",action:"import",metadata:{sourceFormat:o}}),e.json({instruction:p,sourceFormat:o,parseWarnings:[]},201)});O();import{Hono as Uj}from"hono";import{eq as po,and as mf}from"drizzle-orm";var pc=new Uj;pc.post("/instructions/:id/fork",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(g).where(mf(po(g.id,n),po(g.archived,!1)));if(!r)return e.json({error:"Instruction not found"},404);if(r.createdBy===t)return e.json({error:"Cannot fork your own instruction"},400);if(r.scope==="org"&&r.scopeRef){let[s]=await u.select({id:g.id}).from(g).where(mf(po(g.createdBy,t),po(g.scope,"org"),po(g.scopeRef,r.scopeRef))).limit(1);if(!s)return e.json({error:"Instruction not found"},404)}else if(r.scope!=="org")return e.json({error:"Instruction not found"},404);let[o]=await u.insert(g).values({name:`${r.name} (fork)`,description:r.description,type:r.type,scope:"personal",scopeRef:t,version:"1.0.0",content:r.content,frontmatter:r.frontmatter,slots:r.slots,tags:r.tags,compatibility:r.compatibility,createdBy:t,forkedFromId:r.id,upstreamVersion:r.version}).returning();return await u.insert(Ie).values({instructionId:o.id,versionNumber:1,content:o.content,frontmatter:o.frontmatter,changeSummary:`Forked from ${r.name}`,createdBy:t}),await u.insert(Ct).values({instructionId:o.id,eventType:"fork",actorId:t,metadata:{sourceId:r.id,sourceName:r.name,sourceVersion:r.version}}),Tt({instructionId:o.id,userId:t,surface:"api",action:"fork"}),e.json(o,201)});pc.get("/instructions/:id/events",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await u.select({id:g.id}).from(g).where(mf(po(g.id,t),po(g.createdBy,n)));if(!r)return e.json({error:"Instruction not found"},404);let o=await u.select().from(Ct).where(po(Ct.instructionId,t)).orderBy(Ct.createdAt);return e.json(o)});O();import{Hono as Hj}from"hono";import{eq as Vn,and as Kv,sql as Bj}from"drizzle-orm";var mc=new Hj;mc.get("/instructions/:id/upstream",async e=>{let t=e.req.param("id"),[n]=await u.select().from(g).where(Kv(Vn(g.id,t),Vn(g.archived,!1)));if(!n)return e.json({error:"Instruction not found"},404);if(!n.forkedFromId)return e.json({error:"This instruction is not a fork"},400);let[r]=await u.select().from(g).where(Vn(g.id,n.forkedFromId));return r?e.json({hasUpdate:r.version!==n.upstreamVersion,currentVersion:n.upstreamVersion,upstreamVersion:r.version,parentId:r.id,parentName:r.name}):e.json({hasUpdate:!1,currentVersion:n.upstreamVersion,upstreamVersion:null,parentId:n.forkedFromId})});mc.post("/instructions/:id/pull-upstream",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(g).where(Kv(Vn(g.id,n),Vn(g.createdBy,t),Vn(g.archived,!1)));if(!r)return e.json({error:"Instruction not found"},404);if(!r.forkedFromId)return e.json({error:"This instruction is not a fork"},400);let[o]=await u.select().from(g).where(Vn(g.id,r.forkedFromId));if(!o)return e.json({error:"Parent instruction no longer exists"},404);let[s]=await u.select().from(Ie).where(Vn(Ie.instructionId,o.id)).orderBy(Ie.versionNumber).limit(1),i=s?.content??o.content,a=rf(i,o.content,r.content);if(a.hasConflicts)return e.json({hasConflicts:!0,merged:a.merged,conflicts:a.conflicts});let c,l=4;for(let p=0;p<=l;p++)try{c=await u.transaction(async m=>{await m.select({id:g.id}).from(g).where(Vn(g.id,n)).for("update");let[y]=await m.select({maxVersion:Bj`COALESCE(MAX(${Ie.versionNumber}), 0)`}).from(Ie).where(Vn(Ie.instructionId,n)),v=(y?.maxVersion??0)+1,[h]=await m.update(g).set({content:a.merged,upstreamVersion:o.version,updatedAt:new Date}).where(Vn(g.id,n)).returning();return await m.insert(Ie).values({instructionId:n,versionNumber:v,content:a.merged,frontmatter:r.frontmatter,changeSummary:`Pulled upstream changes from ${o.name} (${o.version})`,createdBy:t}),await m.insert(Ct).values({instructionId:n,eventType:"pull_upstream",actorId:t,metadata:{parentId:o.id,parentVersion:o.version,previousUpstreamVersion:r.upstreamVersion}}),h});break}catch(m){if(m.cause?.code==="23505"&&p<l)continue;throw m}return c?(Tt({instructionId:n,userId:t,surface:"api",action:"pull_upstream"}),e.json({hasConflicts:!1,instruction:c})):e.json({error:"Pull-upstream failed after version conflict"},500)});O();import{Hono as Fj}from"hono";import{z as mo}from"zod";import{eq as Ot,and as as,sql as Wj}from"drizzle-orm";var zj=mo.object({scope:mo.enum(["team","org"]),scopeRef:mo.string().uuid()}),fc=new Fj;fc.post("/instructions/:id/promote",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=zj.parse(await e.req.json()),[o]=await u.select().from(g).where(as(Ot(g.id,n),Ot(g.createdBy,t),Ot(g.archived,!1)));if(!o)return e.json({error:"Instruction not found"},404);if(o.scope==="org")return e.json({error:"Instruction is already org-scoped"},400);if(r.scope==="team"){let[c]=await u.select().from(ye).where(as(Ot(ye.userId,t),Ot(ye.teamId,r.scopeRef)));if(!c)return e.json({error:"You are not a member of this team"},403)}else if(r.scope==="org"){let[c]=await u.select().from(Q).where(as(Ot(Q.userId,t),Ot(Q.orgId,r.scopeRef)));if(!c||c.role!=="admin"&&c.role!=="owner")return e.json({error:"You must be an org admin to promote to org scope"},403)}let s=o.scope,i=o.scopeRef,[a]=await u.update(g).set({scope:r.scope,scopeRef:r.scopeRef,updatedAt:new Date}).where(Ot(g.id,n)).returning();return await u.insert(Ct).values({instructionId:n,eventType:"promote",actorId:t,metadata:{fromScope:s,fromScopeRef:i,toScope:r.scope,toScopeRef:r.scopeRef}}),Tt({instructionId:n,userId:t,surface:"api",action:"promote"}),e.json(a)});var Vj=mo.object({targetScope:mo.enum(["personal","team","org"]),targetScopeRef:mo.string().uuid().optional(),name:mo.string().optional(),seedEvalTarget:mo.boolean().optional()});async function Jj(e){let[t]=await u.select({id:k.id}).from(k).where(Wj`${k.metadata}->>'instructionId' = ${e}`).limit(1);return t??null}d(Jj,"findExistingEvalTarget");fc.post("/instructions/:id/promote-from-public",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=Vj.parse(await e.req.json()),[o]=await u.select().from(g).where(as(Ot(g.id,n),Ot(g.scope,"public")));if(!o)return e.json({error:"Public instruction not found"},404);if(r.targetScope==="team"){if(!r.targetScopeRef)return e.json({error:"targetScopeRef is required for team scope"},400);let[m]=await u.select().from(ye).where(as(Ot(ye.userId,t),Ot(ye.teamId,r.targetScopeRef)));if(!m)return e.json({error:"You are not a member of this team"},403)}else if(r.targetScope==="org"){if(!r.targetScopeRef)return e.json({error:"targetScopeRef is required for org scope"},400);let[m]=await u.select().from(Q).where(as(Ot(Q.userId,t),Ot(Q.orgId,r.targetScopeRef)));if(!m||m.role!=="admin"&&m.role!=="owner")return e.json({error:"You must be an org admin to promote into an org"},403)}let s=r.targetScope==="personal"?t:r.targetScopeRef,i=r.name??o.name,a=r.seedEvalTarget??(r.targetScope==="org"||r.targetScope==="team"),[c]=await u.select().from(g).where(as(Ot(g.scope,r.targetScope),Ot(g.scopeRef,s),Ot(g.forkedFromId,n),Ot(g.archived,!1)));if(c){let m=null;return a&&(m=(await Jj(c.id))?.id??null),e.json({instructionId:c.id,alreadyExisted:!0,evalTargetId:m})}let[l]=await u.insert(g).values({name:i,description:o.description,type:o.type,scope:r.targetScope,scopeRef:s,version:o.version,content:o.content,frontmatter:o.frontmatter,slots:o.slots,tags:o.tags,compatibility:o.compatibility,createdBy:t,forkedFromId:o.id,upstreamVersion:o.upstreamVersion??o.version,contentHash:o.contentHash,contextIdentity:o.contextIdentity}).returning();if(!l)return e.json({error:"Failed to clone instruction"},500);await u.insert(Ie).values({instructionId:l.id,versionNumber:1,content:o.content,frontmatter:o.frontmatter,changeSummary:`Promoted from public skill ${o.name}`,createdBy:t}),await u.insert(Ct).values({instructionId:l.id,eventType:"promote_from_public",actorId:t,metadata:{sourceInstructionId:o.id,sourceName:o.name,targetScope:r.targetScope,targetScopeRef:s}}),Tt({instructionId:l.id,userId:t,surface:"api",action:"promote_from_public"});let p=null;if(a){let[m]=await u.insert(k).values({userId:t,name:`${i} \u2014 baseline eval`,type:"instruction",content:o.content,description:`Auto-seeded from public skill \`${o.name}\` on promote.`,metadata:{instructionId:l.id,publicSourceId:o.id,publicContentHash:o.contentHash??null,publicVersion:o.version??null}}).returning({id:k.id});p=m?.id??null}return e.json({instructionId:l.id,alreadyExisted:!1,evalTargetId:p})});O();import{Hono as Gj}from"hono";import{z as Yv}from"zod";import{eq as vn,and as gc,or as Xv,inArray as Qv,sql as ku,desc as Kj}from"drizzle-orm";var hc=new Gj,Yj=Yv.object({badge:Yv.enum(["recommended","required"]).nullable()});hc.get("/catalog",async e=>{let t=e.get("userId"),n=e.req.query("badge"),r=e.req.query("scope"),o=e.req.query("search"),s=parseInt(e.req.query("contentPreview")??"0",10),i=Number.isFinite(s)?Math.min(Math.max(s,0),400):0,a=parseInt(e.req.query("limit")??"50",10),c=parseInt(e.req.query("offset")??"0",10),l=Math.min(Math.max(a,1),200),p=Math.max(c,0),m=await u.select({orgId:Q.orgId}).from(Q).where(vn(Q.userId,t)),y=await u.select({teamId:ye.teamId}).from(ye).where(vn(ye.userId,t)),v=m.map(E=>E.orgId).filter(E=>E!==null),h=y.map(E=>E.teamId).filter(E=>E!==null),f=[vn(g.archived,!1)],w=[vn(g.scope,"public")];if(v.length>0&&w.push(gc(vn(g.scope,"org"),Qv(g.scopeRef,v))),h.length>0&&w.push(gc(vn(g.scope,"team"),Qv(g.scopeRef,h))),f.push(Xv(...w)),n&&f.push(vn(g.badge,n)),r&&f.push(vn(g.scope,r)),o){let E=ot(o);f.push(Xv(ku`${g.name} ILIKE ${`%${E}%`}`,ku`${g.description} ILIKE ${`%${E}%`}`))}let b=[Kj(ku`COALESCE(${g.sourceUpdatedAt}, ${g.updatedAt})`)],I={id:g.id,name:g.name,description:g.description,type:g.type,scope:g.scope,scopeRef:g.scopeRef,version:g.version,tags:g.tags,badge:g.badge,popularityScore:g.popularityScore,updatedAt:g.updatedAt,createdAt:g.createdAt,sourceUpdatedAt:g.sourceUpdatedAt},A=await(i>0?nt:u).select(i>0?{...I,contentPreview:ku`left(${g.content}, ${i})`}:I).from(g).where(gc(...f)).orderBy(...b).limit(l).offset(p);return Tt({userId:t,surface:"api",action:"search",metadata:o?{query:o}:void 0}),e.header("Cache-Control","private, max-age=30"),e.json(A)});hc.post("/instructions/:id/badge",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=Yj.parse(await e.req.json()),[o]=await u.select().from(g).where(gc(vn(g.id,n),vn(g.archived,!1)));if(!o)return e.json({error:"Instruction not found"},404);if(o.scope!=="org"&&o.scope!=="team")return e.json({error:"Badges can only be set on org or team-scoped instructions"},400);let s=o.scopeRef;if(!s)return e.json({error:"Instruction has no scope reference"},400);let[i]=await u.select().from(Q).where(gc(vn(Q.userId,t),vn(Q.orgId,s)));if(!i||i.role!=="admin"&&i.role!=="owner")return e.json({error:"Only admins of the owning organization can set badges"},403);let[a]=await u.update(g).set({badge:r.badge,updatedAt:new Date}).where(vn(g.id,n)).returning(),c=r.badge?"badge_set":"badge_removed";return await u.insert(Ct).values({instructionId:n,eventType:c,actorId:t,metadata:{badge:r.badge}}),e.json(a)});O();import{Hono as Xj}from"hono";import{eq as fo,and as ju,or as Qj,inArray as Zv}from"drizzle-orm";var Nu=new Xj;Nu.post("/projects/:id/recommendations",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(U).where(ju(fo(U.id,n),fo(U.createdBy,t)));if(!r)return e.json({error:"Project not found"},404);let o=await u.select({orgId:Q.orgId}).from(Q).where(fo(Q.userId,t)),s=await u.select({teamId:ye.teamId}).from(ye).where(fo(ye.userId,t)),i=o.map(f=>f.orgId).filter(f=>f!==null),a=s.map(f=>f.teamId).filter(f=>f!==null),c=[fo(g.scope,"public")];i.length>0&&c.push(ju(fo(g.scope,"org"),Zv(g.scopeRef,i))),a.length>0&&c.push(ju(fo(g.scope,"team"),Zv(g.scopeRef,a)));let l=await u.select().from(g).where(ju(fo(g.archived,!1),Qj(...c))).limit(50);if(l.length===0)return e.json({recommendations:[],error:null});let p={name:r.name,description:r.description,languages:[],topics:[],dependencies:[]};if(r.githubRepo)try{let f=r.githubRepo.replace("https://github.com/",""),[w,b]=await Promise.all([fetch(`https://api.github.com/repos/${f}`,{headers:{Accept:"application/vnd.github.v3+json","User-Agent":"RuleMetric"}}),fetch(`https://api.github.com/repos/${f}/languages`,{headers:{Accept:"application/vnd.github.v3+json","User-Agent":"RuleMetric"}})]);if(w.ok){let I=await w.json();p.topics=I.topics??[]}if(b.ok){let I=await b.json();p.languages=Object.keys(I)}}catch{}let m=l.map(f=>({id:f.id,name:f.name,description:f.description??"",tags:f.tags??[],contentPreview:(f.content??"").slice(0,400)})),y=process.env.LLM_PROVIDER,v=process.env.LLM_API_KEY;if(!y||!v)return e.json({recommendations:[],error:"LLM not configured"});let h=await af(p,m,{llmProvider:y,llmApiKey:v});return e.json(h)});import{Hono as JN}from"hono";O();import{Hono as vN}from"hono";import{z as Of}from"zod";import{eq as mt,and as Sc,desc as yI,sql as Kn}from"drizzle-orm";O();import{and as uN,eq as Cf,sql as lN}from"drizzle-orm";function ff(e,t){let n=e,r=t,o=n+r;if(o===0)return{pValue:1,nDiscordant:0};let s=Math.min(n,r),i=Math.pow(.5,o),a=i;for(let c=1;c<=s;c++)i*=(o-c+1)/c,a+=i;return{pValue:Math.min(1,2*a),nDiscordant:o}}d(ff,"mcnemarExact");function Pu(e,t,n=10){return{sufficient:e>=n&&t>=n,minN:n,nWith:e,nWithout:t,shortfall:{with:Math.max(0,n-e),without:Math.max(0,n-t)}}}d(Pu,"assessSufficiency");var go=1.959963984540054;function Cu(e,t,n=go){if(t===0)return{lower:0,upper:1};let r=e/t,o=n*n,s=1+o/t,i=(r+o/(2*t))/s,a=n/s*Math.sqrt(r*(1-r)/t+o/(4*t*t));return{lower:Math.max(0,i-a),upper:Math.min(1,i+a)}}d(Cu,"wilsonInterval");function li(e){let t=e>>>0;return()=>{t=t+1831565813|0;let n=Math.imul(t^t>>>15,1|t);return n=n+Math.imul(n^n>>>7,61|n)^n,((n^n>>>14)>>>0)/4294967296}}d(li,"seededRandom");function ui(e,t){let n=e.length;if(n===1)return e[0];let r=(n-1)*t,o=Math.floor(r),s=Math.ceil(r);return o===s?e[o]:e[o]+(r-o)*(e[s]-e[o])}d(ui,"sortedQuantile");function gf(e,t={}){let n=e.length;if(n===0)return{estimate:0,lower:0,upper:0,iterations:0};let r=t.iterations??1e4,o=t.ciLevel??.95,s=li(t.seed??1),i=e.reduce((l,p)=>l+p,0)/n,a=new Array(r);for(let l=0;l<r;l++){let p=0;for(let m=0;m<n;m++)p+=e[s()*n|0];a[l]=p/n}a.sort((l,p)=>l-p);let c=(1-o)/2;return{estimate:i,lower:ui(a,c),upper:ui(a,1-c),iterations:r}}d(gf,"pairedBootstrapCI");function hf(e,t,n={}){if(e.length===0||t.length===0)return{estimate:0,lower:0,upper:0,pValue:1,iterations:0};let r=n.iterations??1e4,o=n.ciLevel??.95,s=li(n.seed??1),i=d(v=>v.reduce((h,f)=>h+f,0)/v.length,"mean"),a=i(e)-i(t),c=new Array(r),l=0,p=0;for(let v=0;v<r;v++){let h=0;for(let b=0;b<e.length;b++)h+=e[s()*e.length|0];let f=0;for(let b=0;b<t.length;b++)f+=t[s()*t.length|0];let w=h/e.length-f/t.length;c[v]=w,w<=0&&l++,w>=0&&p++}c.sort((v,h)=>v-h);let m=(1-o)/2,y=Math.min(1,2*Math.min(l,p)/r);return{estimate:a,lower:ui(c,m),upper:ui(c,1-m),pValue:y,iterations:r}}d(hf,"twoSampleBootstrapCI");function _f(e,t={}){let n=e.filter(f=>f.withScores.length>0&&f.withoutScores.length>0);if(n.length===0)return{estimate:0,lower:0,upper:0,pValue:1,iterations:0};let r=d(f=>f.reduce((w,b)=>w+b,0)/f.length,"mean"),o=n.map(f=>f.withScores.length*f.withoutScores.length/(f.withScores.length+f.withoutScores.length)),s=o.reduce((f,w)=>f+w,0),i=d(f=>f.reduce((w,b,I)=>w+o[I]*b,0)/s,"combine"),a=i(n.map(f=>r(f.withScores)-r(f.withoutScores))),c=t.iterations??1e4,l=t.ciLevel??.95,p=li(t.seed??1),m=new Array(c),y=0,v=0;for(let f=0;f<c;f++){let w=n.map(I=>{let S=0;for(let E=0;E<I.withScores.length;E++)S+=I.withScores[p()*I.withScores.length|0];let A=0;for(let E=0;E<I.withoutScores.length;E++)A+=I.withoutScores[p()*I.withoutScores.length|0];return S/I.withScores.length-A/I.withoutScores.length}),b=i(w);m[f]=b,b<=0&&y++,b>=0&&v++}m.sort((f,w)=>f-w);let h=(1-l)/2;return{estimate:a,lower:ui(m,h),upper:ui(m,1-h),pValue:Math.min(1,2*Math.min(y,v)/c),iterations:c}}d(_f,"stratifiedBootstrapCI");function yf(e,t){if(e.length!==t.length)throw new Error(`cupedAdjust: outcomes (${e.length}) and covariates (${t.length}) must be the same length`);let n=e.length;if(n===0)return{adjusted:[],theta:0,varianceReduction:0};let r=t.reduce((v,h)=>v+h,0)/n,o=e.reduce((v,h)=>v+h,0)/n,s=0,i=0,a=0;for(let v=0;v<n;v++){let h=t[v]-r,f=e[v]-o;s+=h*f,i+=h*h,a+=f*f}if(i===0)return{adjusted:[...e],theta:0,varianceReduction:0};let c=s/i,l=e.map((v,h)=>v-c*(t[h]-r)),p=0,m=l.reduce((v,h)=>v+h,0)/n;for(let v of l)p+=(v-m)*(v-m);let y=a===0?0:1-p/a;return{adjusted:l,theta:c,varianceReduction:y}}d(yf,"cupedAdjust");function wf(e,t=.05){return e.map(n=>{let r=Math.abs(n.withPassRate-n.withoutPassRate),o=r>t,s;return o?s=`discriminates: ${(n.withPassRate*100).toFixed(0)}% with vs ${(n.withoutPassRate*100).toFixed(0)}% without`:n.withPassRate>=1-t&&n.withoutPassRate>=1-t?s="always passes in both cohorts \u2014 measures nothing about the treatment":n.withPassRate<=t&&n.withoutPassRate<=t?s="always fails in both cohorts \u2014 measures nothing about the treatment":s="similar pass rate in both cohorts \u2014 non-discriminating",{...n,discriminating:o,separation:r,note:s}})}d(wf,"diagnoseAssertions");function vf(e,t={}){let n=t.unpaired??0,r=t.materialFraction??.5,o=e.filter(l=>l.discriminating).length,s=e.length-o,i=e.length+n,a=s+n,c=null;if(i>0&&a>0&&a/i>=r){let l=n>0?` (${n} with no baseline cohort)`:"";c=`${a}/${i} cases do not discriminate with vs without${l} \u2014 cull or replace them before adding runs; more runs of a non-discriminating case cannot lower the MDE`}return{total:i,discriminating:o,nonDiscriminating:s,unpaired:n,diagnoses:e,gateReason:c}}d(vf,"summarizeDiscrimination");function Ou(e,t){let n=e.length,r=t.length;if(n===0||r===0)return 0;let o=[...e.map(l=>({t:l,exposed:!0})),...t.map(l=>({t:l,exposed:!1}))].sort((l,p)=>l.t-p.t),s=0,i=0;for(;i<o.length;){let l=i;for(;l+1<o.length&&o[l+1].t===o[i].t;)l++;let p=(i+1+l+1)/2;for(let m=i;m<=l;m++)o[m].exposed&&(s+=p);i=l+1}let c=(s-n*(n+1)/2)/(n*r);return Math.abs(c-.5)}d(Ou,"cohortTimeSeparation");var cs=.35,Du=900*1e3;function If(e,t,n=cs,r=Du){if(e.length===0||t.length===0)return!1;let o=[...e,...t];return Math.max(...o)-Math.min(...o)<r?!1:Ou(e,t)>n}d(If,"isTimeSeparated");var eI=d(e=>e===0||e===1,"isBinary");function tI(e,t,n){return e.every(o=>o[t]!=null&&o[n]!=null)?e.reduce((o,s)=>o+(s[t]-s[n]),0)/e.length:null}d(tI,"meanPairDelta");function Mu(e,t={}){let n=t.baseline??"no-rule",r=t.minN??10,o=e.length,s=e.map(f=>f.withScore-f.withoutScore),i=o===0?0:s.reduce((f,w)=>f+w,0)/o,a=gf(s,{seed:t.seed,iterations:t.iterations}),c={lower:a.lower,upper:a.upper},l=e.every(f=>eI(f.withScore)&&eI(f.withoutScore)),p=null;if(l&&o>0){let f=0,w=0;for(let b of e)b.withScore===1&&b.withoutScore===0?f++:b.withScore===0&&b.withoutScore===1&&w++;p=ff(f,w).pValue}let{sufficient:m}=Pu(o,o,r),y=c.lower>0||c.upper<0,h={mode:"controlled",baseline:n,delta:i,ci:c,pValue:p,significant:m&&y,sufficient:m,nWith:o,nWithout:o,costDelta:tI(e,"withCost","withoutCost"),latencyDelta:tI(e,"withLatency","withoutLatency"),confounded:!1};return m||(h.insufficientReason=`insufficient data: need >= ${r} paired tasks per cohort, have ${o}`),h}d(Mu,"buildControlledVerdict");var Zj=2;function Lu(e,t,n={}){let r=n.minN??10,o=e.length,s=t.length,i=e.map(I=>I.score),a=t.map(I=>I.score),c=[...e,...t],l=c.length>0&&c.every(I=>typeof I.covariate=="number");if(l){let{adjusted:I}=yf(c.map(S=>S.score),c.map(S=>S.covariate));i=I.slice(0,o),a=I.slice(o)}let p=hf(i,a,{seed:n.seed,iterations:n.iterations}),m={lower:p.lower,upper:p.upper},y=p.estimate,v=o>0&&s>0?p.pValue:null,{sufficient:h}=Pu(o,s,r),f=h&&(m.lower>0||m.upper<0),w=d(I=>{if(o===0||s===0||!e.every(E=>I(E)!=null)||!t.every(E=>I(E)!=null))return null;let S=e.reduce((E,R)=>E+I(R),0)/o,A=t.reduce((E,R)=>E+I(R),0)/s;return S-A},"meanDiff"),b={mode:"observational",baseline:n.baseline??"no-rule",delta:y,ci:m,pValue:v,significant:f,sufficient:h,nWith:o,nWithout:s,costDelta:w(I=>I.cost),latencyDelta:w(I=>I.latency),confounded:!0,cupedApplied:l};return h||(b.insufficientReason=`insufficient data: need >= ${r} sessions per cohort, have ${o} exposed / ${s} unexposed`),b}d(Lu,"buildObservationalVerdict");function In(e,t={}){let n=t.minN??10,r=t.minPerStratum??Zj,o=t.maxTimeSeparation??cs,s=t.minStratumSpanMs??Du,i=e.filter(R=>R.withScores.length>=r&&R.withoutScores.length>=r),a=i.filter(R=>R.withTimes!=null&&R.withoutTimes!=null&&If(R.withTimes,R.withoutTimes,o,s)),c=new Set(a.map(R=>R.key)),l=i.filter(R=>!c.has(R.key)),p=e.filter(R=>R.withScores.length>0&&R.withoutScores.length>0&&(R.withScores.length<r||R.withoutScores.length<r)).length,m=l.reduce((R,D)=>R+D.withScores.length,0),y=l.reduce((R,D)=>R+D.withoutScores.length,0),v=_f(l,{seed:t.seed,iterations:t.iterations}),h={lower:v.lower,upper:v.upper},f=v.estimate,w=l.length>0&&m>=n&&y>=n,b=l.length>0?v.pValue:null,I=w&&(h.lower>0||h.upper<0),S=e.reduce((R,D)=>R+D.withScores.length+D.withoutScores.length,0),A=S>0?(m+y)/S:0,E={mode:"observational",baseline:t.baseline??"no-rule",delta:f,ci:h,pValue:b,significant:I,sufficient:w,nWith:m,nWithout:y,costDelta:null,latencyDelta:null,confounded:!0,strata:l.length,strataDroppedForTimeSeparation:a.length,coverage:A};if(!w){let R=p>0?` (${p} project(s) had both cohorts but fewer than ${r} sessions in one of them)`:"",D=a.length>0?` ${a.length} project-month(s) held both cohorts but their sessions are separated in time (exposure predicts when a session ran), so the difference within them is a calendar difference, not a treatment effect`:"";E.insufficientReason=l.length===0?a.length>0?`insufficient data: no comparable cohort.${D}${R}`:`insufficient data: no project has >= ${r} exposed AND >= ${r} unexposed sessions to compare within${R}`:`insufficient data: need >= ${n} sessions per cohort across comparable projects, have ${m} exposed / ${y} unexposed${R}${D?`.${D}`:""}`}return E}d(In,"buildStratifiedVerdict");function bf(e,t,n={}){return{overall:In(e,n),segments:$u(t,n)}}d(bf,"buildSegmentedVerdict");function $u(e,t={}){return e.map(n=>({segment:n.segment,verdict:In(n.strata,t)}))}d($u,"buildSegmentVerdicts");function ds(e){return e.sufficient?e.significant?e.delta<0?"harmful":"helpful":"neutral":"insufficient"}d(ds,"classifyEffect");var pi={achieved:1,fully_achieved:1,mostly_achieved:.75,partially_achieved:.5,unclear_from_transcript:.25,not_achieved:0,abandoned:0},us=d(e=>{let t=e?pi[e]:void 0;return t===void 0?null:t},"scoreOutcome");var mi=10,qu=d(e=>e.length===0?0:e.reduce((t,n)=>t+n,0)/e.length,"mean"),Sf=d(e=>{if(e.length<2)return 0;let t=qu(e);return e.reduce((n,r)=>n+(r-t)**2,0)/(e.length-1)},"sampleVar"),nI=d((e,t)=>{let n=t.reduce((l,p)=>l+p,0);if(n<=0||e.length===0)return{mean:0,varOfMean:0,nEff:0};let r=t.reduce((l,p)=>l+p*p,0),o=n*n/r,s=e.reduce((l,p,m)=>l+t[m]*p,0)/n,i=n-r/n,c=(i>0?e.reduce((l,p,m)=>l+t[m]*(p-s)**2,0)/i:0)*r/(n*n);return{mean:s,varOfMean:c,nEff:o}},"weightedStats");function Af(e,t,n={}){let r=n.minAnchors??mi,o=n.z??go,s=e.length,i=t.length,a=[...e,...t.map(A=>A.judge)],c=qu(a),l=t.map(A=>A.weight??1),p=t.map(A=>A.human-A.judge),m=nI(p,l),y=m.mean,v=i>0?m.nEff:0,h=t.filter(A=>A.validated!==!1).length;if(n.pooledRectifier){let A=n.pooledRectifier,E=s>0?e:t.map($=>$.judge);if(E.length===0)return{estimate:NaN,ci:{lower:NaN,upper:NaN},se:1/0,naive:c,rectifier:A.rectifier,nLabeled:i,nUnlabeled:s,nEffective:v,nValidated:h,sufficient:!1,insufficientReason:"no judge scores to correct with the pooled rectifier"};let R=qu(E)+A.rectifier,D=Sf(E)/E.length+A.variance,j=Math.sqrt(D),P={estimate:R,ci:{lower:R-o*j,upper:R+o*j},se:j,naive:c,rectifier:A.rectifier,nLabeled:i,nUnlabeled:s,nEffective:v,nValidated:h,sufficient:A.sufficient};return A.sufficient||(P.insufficientReason="pooled rectifier not yet adequate"),P}let f,w;if(i===0)f=c,w=a.length>0?Sf(a)/a.length:0;else if(s===0){let A=nI(t.map(E=>E.human),l);f=A.mean,w=A.varOfMean}else f=qu(e)+y,w=Sf(e)/s+m.varOfMean;let b=Math.sqrt(w),I=h>=r,S={estimate:f,ci:{lower:f-o*b,upper:f+o*b},se:b,naive:c,rectifier:y,nLabeled:i,nUnlabeled:s,nEffective:v,nValidated:h,sufficient:I};if(!I){let A=i-h;S.insufficientReason=`insufficient anchors: need >= ${r} VALIDATED human-labeled items, have ${h}${A>0?` (+${A} passive, which don't count toward the floor)`:""}`}return S}d(Af,"ppiMeanEstimate");function _c(e,t,n={}){let r=Af(e.unlabeledJudge,e.labeled,{...n,pooledRectifier:n.withPooledRectifier}),o=Af(t.unlabeledJudge,t.labeled,{...n,pooledRectifier:n.withoutPooledRectifier}),s=n.z??go,i=r.estimate-o.estimate,a=Math.sqrt(r.se**2+o.se**2),c={lower:i-s*a,upper:i+s*a},l=r.sufficient&&o.sufficient,p=l&&(c.lower>0||c.upper<0),m={delta:i,ci:c,se:a,with:r,without:o,sufficient:l,significant:p};return l||(m.insufficientReason=r.insufficientReason??o.insufficientReason),m}d(_c,"ppiDifference");var Uu=50,sI=.2,iI=.8416212335729143,eN=d(e=>e.length===0?0:e.reduce((t,n)=>t+n,0)/e.length,"mean"),yc=d(e=>{if(e.length<2)return 0;let t=eN(e);return e.reduce((n,r)=>n+(r-t)**2,0)/(e.length-1)},"sampleVar");function rI(e,t){let n=e.labeled.length,r=e.unlabeledJudge.length;return n>0&&r>0?{fixed:yc(e.unlabeledJudge)/r,scaling:yc(e.labeled.map(o=>o.human-o.judge)),n}:n>0?{fixed:0,scaling:yc(e.labeled.map(o=>o.human)),n}:{fixed:r>0?yc(e.unlabeledJudge)/r:0,scaling:t.labeled.length>0?yc(t.labeled.map(o=>o.human-o.judge)):null,n:0}}d(rI,"varianceComponents");var oI=1e6;function tN(e,t){if(e.some(s=>s.scaling===null))return null;let n=d(s=>e.reduce((i,a)=>i+a.fixed+(a.scaling===0?0:a.scaling/(a.n+s)),0),"se2");if(n(oI)>t)return null;let r=0,o=oI;for(;r<o;){let s=Math.floor((r+o)/2);n(s)<=t?o=s:r=s+1}return r}d(tN,"solvePerCohortIncrement");function Ef(e,t,n={}){let r=n.pilotTarget??Uu,o=n.targetEffect??sI,s=n.minAnchors??mi,i=n.z??go,a=n.zPower??iI,c=i+a,l=d(j=>(j*100).toFixed(0),"pp"),p=e.labeled.length,m=t.labeled.length,y=n.humanLabeledRuns??p+m,v=e.unlabeledJudge.length+p+t.unlabeledJudge.length+m,h={nAnchors:y,nAnchorsWith:p,nAnchorsWithout:m,pilotTarget:r,pilotMet:y>=r,targetEffect:o};if(v===0)return{...h,seDelta:null,mde:null,powered:!1,adequate:!1,reasons:["no graded runs to calibrate against"],additionalAnchorsNeeded:r};let f=_c(e,t,{minAnchors:s,z:i,withPooledRectifier:n.pool?.withPooledRectifier,withoutPooledRectifier:n.pool?.withoutPooledRectifier}).se,w=c*f,b=w<=o;if(n.pool){let{totalAnchors:j,targets:P}=n.pool,$=j>=r,H=P>=3,B=$&&H&&b,te=[];return H||te.push(`pool spans ${P}/3 same-judge targets \u2014 between-target variance is assumed, not measured`),$||te.push(`pool floor not met: ${j}/${r} human-labeled runs across the same-judge pool`),b||te.push(`MDE \xB1${l(w)}pp exceeds the \xB1${l(o)}pp target effect \u2014 pooling lowers the label cost, not this; more graded runs are needed (\xA76d(f))`),{...h,seDelta:f,mde:w,powered:b,adequate:B,reasons:te,additionalAnchorsNeeded:$?null:r-j,pooled:!0,poolAnchors:j,poolTargets:P}}let I=p>=s,S=m>=s,A=h.pilotMet&&I&&S&&b,E,R=0;if(!b){let j=(o/c)**2,P=tN([rI(e,t),rI(t,e)],j);R=P===null?null:2*P}if(!h.pilotMet)E=r-y;else if(R===null)E=null;else{let j=Math.max(0,s-p)+Math.max(0,s-m);E=Math.max(j,R)}let D=[];if(h.pilotMet||D.push(`pilot target not met: ${y}/${r} human-labeled runs`),I||D.push(`with-target cohort has ${p}/${s} labeled runs (minimum for a corrected estimate)`),S||D.push(`without-target cohort has ${m}/${s} labeled runs (minimum for a corrected estimate)`),!b){let j=R===null?" \u2014 anchors alone cannot reach it; more graded runs are needed":h.pilotMet&&R>0?` \u2014 ~${R} more labeled runs projected to reach it`:"";D.push(`MDE \xB1${l(w)}pp exceeds the \xB1${l(o)}pp target effect${j}`)}return{...h,seDelta:f,mde:w,powered:b,adequate:A,reasons:D,additionalAnchorsNeeded:E}}d(Ef,"anchorPowerCheck");function xf(e,t){return{rectifierUsed:e.rectifier,variance:e.variance,lambda:0,pooled:e.rectifier,pooledVariance:e.variance,tau2:0,i2:0,k:1,pooledApplied:!1,assumedExchangeability:!1,...t}}d(xf,"localOnly");function Hu(e,t,n={}){let r=n.maxI2??.6,o=[e,...t].filter(B=>B.n>=1&&Number.isFinite(B.variance)&&B.variance>=0),s=o.length;if(s<2)return e.n<1||!Number.isFinite(e.variance)?xf(e,{rectifierUsed:NaN,variance:1/0,reason:"no anchors on this target and none to pool from"}):xf(e,{reason:"only one target with anchors \u2014 nothing to pool"});let i=o.map(B=>B.variance).filter(B=>B>0),a=i.length?i.reduce((B,te)=>B+te,0)/i.length:0,c=Math.max(a*.001,1e-12),l=d(B=>Math.max(B,c),"flooredVar"),p=o.map(B=>1/l(B.variance)),m=p.reduce((B,te)=>B+te,0),y=p.reduce((B,te)=>B+te*te,0),v=o.reduce((B,te,_e)=>B+p[_e]*te.rectifier,0)/m,h=o.reduce((B,te,_e)=>B+p[_e]*(te.rectifier-v)**2,0),f=s-1,w=m-y/m,b=w>0?Math.max(0,(h-f)/w):0,I=h>0?Math.max(0,(h-f)/h):0,S=o.map(B=>1/(l(B.variance)+b)),A=S.reduce((B,te)=>B+te,0),E=o.reduce((B,te,_e)=>B+S[_e]*te.rectifier,0)/A,R=1/A,D=s<3;if(I>r)return e.n>=1&&Number.isFinite(e.variance)?xf(e,{pooled:E,pooledVariance:R,tau2:b,i2:I,k:s,assumedExchangeability:D,reason:`heterogeneity too high (I\xB2=${(I*100).toFixed(0)}%) \u2014 targets disagree; not pooling`}):{rectifierUsed:E,variance:R,lambda:1,pooled:E,pooledVariance:R,tau2:b,i2:I,k:s,pooledApplied:!1,assumedExchangeability:D,reason:`no anchors on this target; pooled estimate is high-heterogeneity (I\xB2=${(I*100).toFixed(0)}%) \u2014 treat as unknown`};let j=e.n<1||!Number.isFinite(e.variance),P=j?1:l(e.variance)/(l(e.variance)+b),$=j?E:P*E+(1-P)*e.rectifier,H=j?R+b:(1-P)*e.variance+P*P*R;return{rectifierUsed:$,variance:H,lambda:P,pooled:E,pooledVariance:R,tau2:b,i2:I,k:s,pooledApplied:!0,assumedExchangeability:D}}d(Hu,"shrinkRectifier");var fi=3,vc=7,Tf="(preamble)",iN=/^\s*(`{3,}|~{3,})/,aN=/^(#{1,6})\s+(.*)$/;function wc(e){let t=e.split(`
242
- `),n=[],r=[],o={heading:"",level:0,path:[Tf],body:[]},s=null,i=d(()=>{n.push({heading:o.heading,level:o.level,path:o.path,body:o.body.join(`
243
- `).trim()})},"flush");for(let a of t){let c=iN.exec(a);if(c){let p=c[1];s==null?s={marker:p}:p[0]===s.marker[0]&&p.length>=s.marker.length&&(s=null),o.body.push(a);continue}if(s!=null){o.body.push(a);continue}let l=aN.exec(a);if(l){i();let p=l[1].length,m=l[2].trim();r.length=Math.max(0,p-1),r[p-1]=m,o={heading:m,level:p,path:Array.from({length:p},(y,v)=>r[v]??`(unnamed level ${v+1})`),body:[]};continue}o.body.push(a)}return i(),n.filter((a,c)=>!(c===0&&a.level===0&&a.body===""))}d(wc,"splitMarkdownSections");function Bu(e){let t=new Map,n=new Map;for(let r of e){let o=r.level===0?Tf:r.path.join(" > "),s=(t.get(o)??0)+1;t.set(o,s),n.set(s===1?o:`${o} #${s}`,r)}return n}d(Bu,"sectionKeys");function Rf(e,t){let n=Bu(wc(e)),r=Bu(wc(t)),o=[],s=[],i=[];for(let[a,c]of r){let l=n.get(a);l?l.body!==c.body&&o.push(a):s.push(a)}for(let a of n.keys())r.has(a)||i.push(a);return{changed:o.sort(),added:s.sort(),removed:i.sort()}}d(Rf,"diffSections");function kf(e){return[...new Set([...e.changed,...e.added,...e.removed])].sort()}d(kf,"touchedSections");var aI=d(e=>e.trim().toLowerCase(),"normalize");function cI(e,t,n){if(n.length===0)return[];let r=new Set(n.map(aI)),o=Rf(e,t),s=new Set(kf(o)),i=new Map([...Bu(wc(e)),...Bu(wc(t))]),a=[];for(let c of s){let l=i.get(c);(l?l.path:c.split(" > ")).some(m=>r.has(aI(m)))&&a.push(c)}return a.sort()}d(cI,"protectedViolations");function jf(e){let{verdict:t,canaryGreen:n,adequate:r,adequacyReasons:o=[],promotionsInWindow:s,maxPromotionsPerWindow:i=fi,immutableSections:a=[],beforeContent:c,afterContent:l,measurementMatchesPredecessor:p}=e,m=kf(Rf(c,l)),y=ds(t),v=[];if(c===l&&v.push("proposal is identical to the current version \u2014 nothing to promote"),t.mode!=="controlled"&&v.push(`verdict is ${t.mode}, not controlled \u2014 Phase 2 measured that an observational version-vs-version comparison is refused on 99.4% of real version pairs, because versions are disjoint in time by construction`),t.baseline!=="prior-version"&&v.push(`verdict baseline is '${t.baseline}', not 'prior-version' \u2014 a no-rule comparison says the instruction beats having no instruction, not that this edit beats the last one`),t.confounded&&v.push("verdict is flagged confounded"),p===!1&&v.push("pairs were measured against a different predecessor than the one now live \u2014 the target's content changed after the eval batch ran, so this verdict is about a comparison that no longer exists"),n||v.push("A/A canary is red \u2014 the verdict path can manufacture effects from noise, so no verdict it produces may be promoted"),!r){let b=o.length>0?`: ${o.join("; ")}`:"";v.push(`verdict is not adequately powered${b}`)}s>=i&&v.push(`change budget exhausted: ${s}/${i} promotions already made in the current window`);let h=cI(c,l,a);if(h.length>0&&v.push(`proposal edits protected section(s): ${h.join(", ")}`),y==="insufficient"&&v.push(t.insufficientReason??"verdict did not clear min-n, so no effect was measured"),v.length>0)return{decision:"refuse",refusals:v,rationale:`refused: ${v.length} gate(s) blocked promotion`,effect:y,touched:m};let f=d(b=>`${b>=0?"+":""}${(b*100).toFixed(1)}pp`,"pp"),w=`[${f(t.ci.lower)}, ${f(t.ci.upper)}]`;return y==="helpful"?{decision:"promote",refusals:[],rationale:`promote: ${f(t.delta)} CI ${w} over the prior version, n=${t.nWith} paired cases`,effect:y,touched:m}:y==="harmful"?{decision:"revert",refusals:[],rationale:`revert: proposal measured WORSE than its predecessor, ${f(t.delta)} CI ${w}`,effect:y,touched:m}:{decision:"revert",refusals:[],rationale:`revert: no detectable improvement, ${f(t.delta)} CI ${w} spans zero`,effect:y,touched:m}}d(jf,"evaluatePromotion");async function bc(e,t){let[n]=await u.select({id:q.id,instructionId:q.instructionId,projectPath:q.projectPath,status:q.status,contentHash:q.contentHash}).from(q).where(uN(Cf(q.id,e),Cf(q.userId,t)));if(!n)return null;let r=!1;if(n.contentHash){let{instructionContentHash:h}=await Promise.resolve().then(()=>(ls(),mI)),[f]=await u.select({content:g.content,name:g.name}).from(g).where(Cf(g.id,n.instructionId));r=h(f?.content,f?.name)!==n.contentHash}let o=await u.execute(lN`
154
+ Preview: ${e.contentPreview}`.length+2}u(DR,"renderedSize");async function rf(e,t,n){if(t.length===0)return{recommendations:[],error:null};let r;try{r=cc(n.llmProvider,n.llmApiKey)}catch(c){return{recommendations:[],error:c instanceof Error?c.message:String(c)}}let o=nf(t,{charBudget:n.charBudget}),s=[],i=[];for(let c of o)try{let a=await r.complete(uc(e,c));s.push(...tf(a.text))}catch(a){i.push(a instanceof Error?a.message:String(a))}return{recommendations:s,error:i.length>0?i.join("; "):null}}u(rf,"scoreInstructions");var OR=new Set(["127.0.0.1","localhost","::1","[::1]","0.0.0.0"]);function CR(e){if(!e)return null;try{return new URL(e).hostname}catch{return null}}u(CR,"databaseUrlHost");function of(e=process.env){let t=e.RULEMETRIC_DEPLOYMENT?.trim().toLowerCase();if(t==="cloud"||t==="local")return{mode:t,source:"env"};if(t)return{mode:"cloud",source:"default",error:`RULEMETRIC_DEPLOYMENT="${e.RULEMETRIC_DEPLOYMENT}" is not "cloud" or "local" \u2014 ignoring it and defaulting to cloud.`};let n=CR(e.DATABASE_URL);return n&&OR.has(n)?{mode:"local",source:"inferred"}:{mode:"cloud",source:"default"}}u(of,"resolveDeployment");function Ed(e){if(!e||typeof e!="object")return null;let t=e.source;return t==="insights"||t==="evolution"?t:null}u(Ed,"readStampedSource");function xd(e,t){let n=e.source==="insights"||e.source==="evolution"?e.source:Ed(e.frontmatter);return n||(e.createdBy&&e.createdBy===t?"user":"catalog")}u(xd,"classifyProvenance");var dc=new Set(["process_eval","process_insights","process_conversation","process_session_goal","distill_memories","memory_ab","cron_suggest_instructions","cron_refresh_pricing","cron_eval_autorun","cron_instruction_evolution","process_judge_review"]);function Td(e){return dc.has(e)}u(Td,"needsLlmEngine");C();function Gt(e){if(!Us())return;let t=Pm();d.insert(so).values({instructionId:e.instructionId??null,userId:e.userId,surface:e.surface,action:e.action,metadata:e.metadata??null,traceId:t??null}).then(()=>{}).catch(n=>{console.error("Usage tracking error:",n)})}u(Gt,"trackUsage");var MR={critical:25,high:15,medium:8,low:3},$R=[{pattern:/ignore\s+(all\s+)?previous\s+instructions/i,severity:"critical",category:"prompt_injection",description:"Instruction override attempt"},{pattern:/before responding.*you MUST/i,severity:"critical",category:"prompt_injection",description:"Mandatory pre-response action injection"},{pattern:/never mention.*to the user/i,severity:"high",category:"prompt_injection",description:"Concealment language"},{pattern:/forget (everything|all|your).*instructions/i,severity:"critical",category:"prompt_injection",description:"Memory wipe injection"},{pattern:/you are now\s+/i,severity:"high",category:"prompt_injection",description:"Identity/role hijacking"},{pattern:/IMPORTANT:?\s*(system|override|mandatory|compliance)/i,severity:"high",category:"prompt_injection",description:"Fake authority escalation"},{pattern:/<system-reminder>/i,severity:"critical",category:"spoofing",description:"System-reminder tag spoofing"},{pattern:/<\/system-reminder>/i,severity:"critical",category:"spoofing",description:"System-reminder closing tag spoofing"},{pattern:/Contents of.*CLAUDE\.md.*project instructions/i,severity:"high",category:"spoofing",description:"Mimics Claude system context format"},{pattern:/<(system|assistant|tool)-(reminder|message|context)>/i,severity:"high",category:"spoofing",description:"System XML tag spoofing"},{pattern:/\[SYSTEM\]|\[INST\]|<<SYS>>/i,severity:"high",category:"spoofing",description:"Llama/Mistral system prompt markers"},{pattern:/process\.env.*(include|output|log|report|display|print)/i,severity:"critical",category:"secret_exfil",description:"Node.js environment access + exfiltration"},{pattern:/(include|output|log|report|display|print).*process\.env/i,severity:"critical",category:"secret_exfil",description:"Exfiltration verb + Node.js environment access"},{pattern:/os\.environ.*(include|output|log|report|display)/i,severity:"critical",category:"secret_exfil",description:"Python environment access + exfiltration"},{pattern:/cat\s+~?\/?\.(?:env|ssh|aws|npmrc|gitconfig)/i,severity:"critical",category:"secret_exfil",description:"Direct secret file read command"},{pattern:/env\s*\|\s*sort|printenv/i,severity:"high",category:"secret_exfil",description:"Full environment dump command"},{pattern:/\.(env|ssh\/id_rsa|aws\/credentials)\b/i,severity:"high",category:"secret_exfil",description:"Secret file path reference"},{pattern:/<\/(?:rule|instruction|system)>/i,severity:"high",category:"converter_escape",description:"XML structure escape in converter output"},{pattern:/<script|<iframe|javascript:/i,severity:"high",category:"fork_poison",description:"XSS payload"}];function sf(e,t,n){let r=[],o=[e,t??"",n??""].join(`
155
+ `);for(let i of $R){let c=o.match(i.pattern);c&&r.push({pattern:i.description,severity:i.severity,category:i.category,match:c[0].slice(0,100)})}let s=100;for(let i of r)s-=MR[i.severity]??5;return{score:Math.max(0,Math.min(100,s)),findings:r}}u(sf,"scanContent");var wn=new qR,HR=at.object({name:at.string().min(1).max(255),description:at.string().min(1),scope:at.enum(["org","team","project","personal"]),scopeRef:at.string().uuid().optional(),version:at.string().default("1.0.0"),content:at.string().min(1),tags:at.array(at.string()).optional(),compatibility:at.array(at.string()).optional()}),BR=at.object({name:at.string().min(1).max(255).optional(),description:at.string().min(1).optional(),version:at.string().optional(),content:at.string().min(1).optional(),tags:at.array(at.string()).optional(),compatibility:at.array(at.string()).optional(),changeSummary:at.string().optional()});wn.get("/instructions",async e=>{let t=e.get("userId"),n=e.req.query("search"),r=e.req.query("scope"),o=e.req.query("tags"),s=e.req.query("type"),i=parseInt(e.req.query("limit")??"100",10),c=parseInt(e.req.query("offset")??"0",10),a=[Ce(g.archived,!1),Ce(g.createdBy,t)];if(r&&a.push(Ce(g.scope,r)),s&&a.push(Ce(g.type,s)),n){let h=rt(n);a.push(cf(af(g.name,`%${h}%`),af(g.description,`%${h}%`),af(g.content,`%${h}%`)))}let l=await d.select().from(g).where(cr(...a)).orderBy(Ow(g.updatedAt)).limit(i).offset(c);if(o){let h=o.split(",").map(f=>f.trim().toLowerCase());l=l.filter(f=>h.some(w=>f.tags?.some(b=>b.toLowerCase().includes(w))))}let m=l.map(h=>h.id),p=m.length>0?await d.select({instructionId:it.instructionId,projectName:M.name,projectId:M.id}).from(it).innerJoin(M,Ce(M.id,it.projectId)).where(ci`${it.instructionId} IN (${ci.join(m.map(h=>ci`${h}`),ci`, `)})`):[],_=new Map;for(let h of p){let f=_.get(h.instructionId)??[];f.push({projectId:h.projectId,projectName:h.projectName}),_.set(h.instructionId,f)}let I=l.map(h=>({...h,projects:_.get(h.id)??[]}));return Gt({userId:t,surface:"api",action:"list"}),e.json(I)});wn.get("/instructions/by-hash/:hash",async e=>{let t=e.get("userId"),n=e.req.param("hash"),[r]=await d.select({id:g.id,name:g.name,contextIdentity:g.contextIdentity,version:g.version,type:g.type}).from(g).where(cr(Ce(g.contentHash,n),Ce(g.createdBy,t),Ce(g.archived,!1))).limit(1);return r?e.json({instruction:r}):e.json({instruction:null})});wn.post("/instructions/by-hashes",async e=>{let t=e.get("userId"),n=await e.req.json(),r=at.array(at.string()).max(200).parse(n.hashes??[]),o=at.array(at.string()).max(200).parse(n.identities??[]);if(r.length===0&&o.length===0)return e.json({instructions:{}});let s=[Ce(g.createdBy,t),Ce(g.archived,!1)],i=[];r.length>0&&i.push(Dw(g.contentHash,r)),o.length>0&&i.push(Dw(g.contextIdentity,o));let c=await d.select({id:g.id,name:g.name,contextIdentity:g.contextIdentity,version:g.version,type:g.type,contentHash:g.contentHash,source:ci`${g.frontmatter}->>'source'`}).from(g).where(cr(...s,i.length===1?i[0]:cf(...i))),a={};for(let l of c)l.contentHash&&(a[l.contentHash]=l),l.contextIdentity&&(a[l.contextIdentity]=l);return e.json({instructions:a})});wn.get("/instructions/:id/sessions",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await d.select({sessionId:se.sessionId,linkMethod:se.linkMethod,tool:y.tool,projectPath:y.projectPath,startedAt:y.startedAt,endedAt:y.endedAt,analysis:y.analysis}).from(se).innerJoin(y,Ce(y.id,se.sessionId)).where(cr(Ce(se.instructionId,n),Ce(y.userId,t))).orderBy(Ow(y.startedAt)).limit(50);return e.json({sessions:r})});wn.get("/instructions/:id",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await d.select().from(g).where(cr(Ce(g.id,t),Ce(g.archived,!1),cf(Ce(g.createdBy,n),Ce(g.scope,"public"))));return r?(Gt({instructionId:t,userId:n,surface:"api",action:"view"}),e.json(r)):e.json({error:"Instruction not found"},404)});var FR=/<\/?(?:system-reminder|system|available-deferred-tools|tool-result)>/i;function Cw(e){return FR.test(e)?"Content contains forbidden system tags":null}u(Cw,"validateNoForbiddenTags");wn.post("/instructions",async e=>{let t=e.get("userId"),n=await e.req.json(),r=HR.parse(n),o=Cw(r.content);if(o)return e.json({error:o},422);r.name=ai(r.name),r.description=ai(r.description);let s={},i=null;try{let m=bd(r.content);s=m.frontmatter,i=m.slots}catch{s={name:r.name,description:r.description,type:"instruction",scope:r.scope,version:r.version}}let c=r.scope==="personal"?t:r.scopeRef??null,a=sf(r.content,r.name,r.description),[l]=await d.insert(g).values({name:r.name,description:r.description,type:"instruction",scope:r.scope,scopeRef:c,version:r.version,content:r.content,frontmatter:s,slots:i,tags:r.tags??[],compatibility:r.compatibility??[],createdBy:t,scanScore:a.score,scanFindings:a.findings.length>0?a.findings:null}).returning();return await d.insert(Se).values({instructionId:l.id,versionNumber:1,content:r.content,frontmatter:s,changeSummary:"Initial version",createdBy:t}),Gt({instructionId:l.id,userId:t,surface:"api",action:"create"}),e.json(l,201)});wn.put("/instructions/:id",async e=>{let t=e.req.param("id"),n=e.get("userId"),r=await e.req.json(),o=BR.parse(r);if(o.content){let p=Cw(o.content);if(p)return e.json({error:p},422)}o.name&&(o.name=ai(o.name)),o.description&&(o.description=ai(o.description));let[s]=await d.select().from(g).where(cr(Ce(g.id,t),Ce(g.createdBy,n),Ce(g.archived,!1)));if(!s)return e.json({error:"Instruction not found"},404);let i=s.frontmatter,c=s.slots;if(o.content)try{let p=bd(o.content);i=p.frontmatter,c=p.slots}catch{}let a={};if(o.content||o.name||o.description){let p=sf(o.content??s.content,o.name??s.name,o.description??s.description);a.scanScore=p.score,a.scanFindings=p.findings.length>0?p.findings:null}let l,m=4;for(let p=0;p<=m;p++)try{l=await d.transaction(async _=>{await _.select({id:g.id}).from(g).where(Ce(g.id,t)).for("update");let[{maxVersion:I}]=await _.select({maxVersion:ci`COALESCE(MAX(${Se.versionNumber}), 0)`}).from(Se).where(Ce(Se.instructionId,t)),h=I+1,[f]=await _.update(g).set({...o.name&&{name:o.name},...o.description&&{description:o.description},...o.version&&{version:o.version},...o.content&&{content:o.content},...o.tags&&{tags:o.tags},...o.compatibility&&{compatibility:o.compatibility},frontmatter:i,slots:c,...a,updatedAt:new Date}).where(Ce(g.id,t)).returning();return await _.insert(Se).values({instructionId:t,versionNumber:h,content:o.content??s.content,frontmatter:i,changeSummary:o.changeSummary??null,createdBy:n}),f});break}catch(_){if(_.cause?.code==="23505"&&p<m)continue;throw _}return l?(Gt({instructionId:t,userId:n,surface:"api",action:"update"}),e.json(l)):e.json({error:"Instruction update failed"},500)});wn.delete("/instructions/:id",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await d.select().from(g).where(cr(Ce(g.id,t),Ce(g.createdBy,n),Ce(g.archived,!1)));if(!r)return e.json({error:"Instruction not found"},404);let[o]=await d.update(g).set({archived:!0,archivedAt:new Date,archivedBy:n}).where(Ce(g.id,t)).returning(),s=await d.update(x).set({dismissedAt:new Date,isStale:!0}).where(cr(Ce(x.userId,n),Ce(x.instructionId,t),UR(x.dismissedAt))).returning({id:x.id});return Gt({instructionId:t,userId:n,surface:"api",action:"delete"}),e.json({...o,dismissedSuggestions:s.length})});wn.post("/instructions/:id/restore",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await d.select().from(g).where(cr(Ce(g.id,t),Ce(g.createdBy,n),Ce(g.archived,!0)));if(!r)return e.json({error:"Archived instruction not found"},404);let[o]=await d.update(g).set({archived:!1,archivedAt:null,archivedBy:null}).where(Ce(g.id,t)).returning();return Gt({instructionId:t,userId:n,surface:"api",action:"update"}),e.json(o)});wn.get("/instructions/:id/versions",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await d.select({id:g.id}).from(g).where(cr(Ce(g.id,t),Ce(g.createdBy,n)));if(!r)return e.json({error:"Instruction not found"},404);let o=await d.select().from(Se).where(Ce(Se.instructionId,t)).orderBy(Se.versionNumber);return e.json(o)});C();import{Hono as WR}from"hono";import{eq as mo,and as uf}from"drizzle-orm";var lc=new WR;lc.post("/instructions/:id/fork",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select().from(g).where(uf(mo(g.id,n),mo(g.archived,!1)));if(!r)return e.json({error:"Instruction not found"},404);if(r.createdBy===t)return e.json({error:"Cannot fork your own instruction"},400);if(r.scope==="org"&&r.scopeRef){let[s]=await d.select({id:g.id}).from(g).where(uf(mo(g.createdBy,t),mo(g.scope,"org"),mo(g.scopeRef,r.scopeRef))).limit(1);if(!s)return e.json({error:"Instruction not found"},404)}else if(r.scope!=="org")return e.json({error:"Instruction not found"},404);let[o]=await d.insert(g).values({name:`${r.name} (fork)`,description:r.description,type:r.type,scope:"personal",scopeRef:t,version:"1.0.0",content:r.content,frontmatter:r.frontmatter,slots:r.slots,tags:r.tags,compatibility:r.compatibility,createdBy:t,forkedFromId:r.id,upstreamVersion:r.version}).returning();return await d.insert(Se).values({instructionId:o.id,versionNumber:1,content:o.content,frontmatter:o.frontmatter,changeSummary:`Forked from ${r.name}`,createdBy:t}),await d.insert(Pt).values({instructionId:o.id,eventType:"fork",actorId:t,metadata:{sourceId:r.id,sourceName:r.name,sourceVersion:r.version}}),Gt({instructionId:o.id,userId:t,surface:"api",action:"fork"}),e.json(o,201)});lc.get("/instructions/:id/events",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await d.select({id:g.id}).from(g).where(uf(mo(g.id,t),mo(g.createdBy,n)));if(!r)return e.json({error:"Instruction not found"},404);let o=await d.select().from(Pt).where(mo(Pt.instructionId,t)).orderBy(Pt.createdAt);return e.json(o)});C();import{Hono as zR}from"hono";import{eq as Kn,and as Lw,sql as VR}from"drizzle-orm";var mc=new zR;mc.get("/instructions/:id/upstream",async e=>{let t=e.req.param("id"),[n]=await d.select().from(g).where(Lw(Kn(g.id,t),Kn(g.archived,!1)));if(!n)return e.json({error:"Instruction not found"},404);if(!n.forkedFromId)return e.json({error:"This instruction is not a fork"},400);let[r]=await d.select().from(g).where(Kn(g.id,n.forkedFromId));return r?e.json({hasUpdate:r.version!==n.upstreamVersion,currentVersion:n.upstreamVersion,upstreamVersion:r.version,parentId:r.id,parentName:r.name}):e.json({hasUpdate:!1,currentVersion:n.upstreamVersion,upstreamVersion:null,parentId:n.forkedFromId})});mc.post("/instructions/:id/pull-upstream",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select().from(g).where(Lw(Kn(g.id,n),Kn(g.createdBy,t),Kn(g.archived,!1)));if(!r)return e.json({error:"Instruction not found"},404);if(!r.forkedFromId)return e.json({error:"This instruction is not a fork"},400);let[o]=await d.select().from(g).where(Kn(g.id,r.forkedFromId));if(!o)return e.json({error:"Parent instruction no longer exists"},404);let[s]=await d.select().from(Se).where(Kn(Se.instructionId,o.id)).orderBy(Se.versionNumber).limit(1),i=s?.content??o.content,c=ef(i,o.content,r.content);if(c.hasConflicts)return e.json({hasConflicts:!0,merged:c.merged,conflicts:c.conflicts});let a,l=4;for(let m=0;m<=l;m++)try{a=await d.transaction(async p=>{await p.select({id:g.id}).from(g).where(Kn(g.id,n)).for("update");let[_]=await p.select({maxVersion:VR`COALESCE(MAX(${Se.versionNumber}), 0)`}).from(Se).where(Kn(Se.instructionId,n)),I=(_?.maxVersion??0)+1,[h]=await p.update(g).set({content:c.merged,upstreamVersion:o.version,updatedAt:new Date}).where(Kn(g.id,n)).returning();return await p.insert(Se).values({instructionId:n,versionNumber:I,content:c.merged,frontmatter:r.frontmatter,changeSummary:`Pulled upstream changes from ${o.name} (${o.version})`,createdBy:t}),await p.insert(Pt).values({instructionId:n,eventType:"pull_upstream",actorId:t,metadata:{parentId:o.id,parentVersion:o.version,previousUpstreamVersion:r.upstreamVersion}}),h});break}catch(p){if(p.cause?.code==="23505"&&m<l)continue;throw p}return a?(Gt({instructionId:n,userId:t,surface:"api",action:"pull_upstream"}),e.json({hasConflicts:!1,instruction:a})):e.json({error:"Pull-upstream failed after version conflict"},500)});C();import{Hono as JR}from"hono";import{z as po}from"zod";import{eq as Dt,and as is,sql as KR}from"drizzle-orm";var GR=po.object({scope:po.enum(["team","org"]),scopeRef:po.string().uuid()}),pc=new JR;pc.post("/instructions/:id/promote",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=GR.parse(await e.req.json()),[o]=await d.select().from(g).where(is(Dt(g.id,n),Dt(g.createdBy,t),Dt(g.archived,!1)));if(!o)return e.json({error:"Instruction not found"},404);if(o.scope==="org")return e.json({error:"Instruction is already org-scoped"},400);if(r.scope==="team"){let[a]=await d.select().from(_e).where(is(Dt(_e.userId,t),Dt(_e.teamId,r.scopeRef)));if(!a)return e.json({error:"You are not a member of this team"},403)}else if(r.scope==="org"){let[a]=await d.select().from(Q).where(is(Dt(Q.userId,t),Dt(Q.orgId,r.scopeRef)));if(!a||a.role!=="admin"&&a.role!=="owner")return e.json({error:"You must be an org admin to promote to org scope"},403)}let s=o.scope,i=o.scopeRef,[c]=await d.update(g).set({scope:r.scope,scopeRef:r.scopeRef,updatedAt:new Date}).where(Dt(g.id,n)).returning();return await d.insert(Pt).values({instructionId:n,eventType:"promote",actorId:t,metadata:{fromScope:s,fromScopeRef:i,toScope:r.scope,toScopeRef:r.scopeRef}}),Gt({instructionId:n,userId:t,surface:"api",action:"promote"}),e.json(c)});var YR=po.object({targetScope:po.enum(["personal","team","org"]),targetScopeRef:po.string().uuid().optional(),name:po.string().optional(),seedEvalTarget:po.boolean().optional()});async function XR(e){let[t]=await d.select({id:k.id}).from(k).where(KR`${k.metadata}->>'instructionId' = ${e}`).limit(1);return t??null}u(XR,"findExistingEvalTarget");pc.post("/instructions/:id/promote-from-public",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=YR.parse(await e.req.json()),[o]=await d.select().from(g).where(is(Dt(g.id,n),Dt(g.scope,"public")));if(!o)return e.json({error:"Public instruction not found"},404);if(r.targetScope==="team"){if(!r.targetScopeRef)return e.json({error:"targetScopeRef is required for team scope"},400);let[p]=await d.select().from(_e).where(is(Dt(_e.userId,t),Dt(_e.teamId,r.targetScopeRef)));if(!p)return e.json({error:"You are not a member of this team"},403)}else if(r.targetScope==="org"){if(!r.targetScopeRef)return e.json({error:"targetScopeRef is required for org scope"},400);let[p]=await d.select().from(Q).where(is(Dt(Q.userId,t),Dt(Q.orgId,r.targetScopeRef)));if(!p||p.role!=="admin"&&p.role!=="owner")return e.json({error:"You must be an org admin to promote into an org"},403)}let s=r.targetScope==="personal"?t:r.targetScopeRef,i=r.name??o.name,c=r.seedEvalTarget??(r.targetScope==="org"||r.targetScope==="team"),[a]=await d.select().from(g).where(is(Dt(g.scope,r.targetScope),Dt(g.scopeRef,s),Dt(g.forkedFromId,n),Dt(g.archived,!1)));if(a){let p=null;return c&&(p=(await XR(a.id))?.id??null),e.json({instructionId:a.id,alreadyExisted:!0,evalTargetId:p})}let[l]=await d.insert(g).values({name:i,description:o.description,type:o.type,scope:r.targetScope,scopeRef:s,version:o.version,content:o.content,frontmatter:o.frontmatter,slots:o.slots,tags:o.tags,compatibility:o.compatibility,createdBy:t,forkedFromId:o.id,upstreamVersion:o.upstreamVersion??o.version,contentHash:o.contentHash,contextIdentity:o.contextIdentity}).returning();if(!l)return e.json({error:"Failed to clone instruction"},500);await d.insert(Se).values({instructionId:l.id,versionNumber:1,content:o.content,frontmatter:o.frontmatter,changeSummary:`Promoted from public skill ${o.name}`,createdBy:t}),await d.insert(Pt).values({instructionId:l.id,eventType:"promote_from_public",actorId:t,metadata:{sourceInstructionId:o.id,sourceName:o.name,targetScope:r.targetScope,targetScopeRef:s}}),Gt({instructionId:l.id,userId:t,surface:"api",action:"promote_from_public"});let m=null;if(c){let[p]=await d.insert(k).values({userId:t,name:`${i} \u2014 baseline eval`,type:"instruction",content:o.content,description:`Auto-seeded from public skill \`${o.name}\` on promote.`,metadata:{instructionId:l.id,publicSourceId:o.id,publicContentHash:o.contentHash??null,publicVersion:o.version??null}}).returning({id:k.id});m=p?.id??null}return e.json({instructionId:l.id,alreadyExisted:!1,evalTargetId:m})});C();import{Hono as QR}from"hono";import{z as Mw}from"zod";import{eq as vn,and as fc,or as $w,inArray as qw,sql as Rd,desc as ZR}from"drizzle-orm";var gc=new QR,ek=Mw.object({badge:Mw.enum(["recommended","required"]).nullable()});gc.get("/catalog",async e=>{let t=e.get("userId"),n=e.req.query("badge"),r=e.req.query("scope"),o=e.req.query("search"),s=parseInt(e.req.query("contentPreview")??"0",10),i=Number.isFinite(s)?Math.min(Math.max(s,0),400):0,c=parseInt(e.req.query("limit")??"50",10),a=parseInt(e.req.query("offset")??"0",10),l=Math.min(Math.max(c,1),200),m=Math.max(a,0),p=await d.select({orgId:Q.orgId}).from(Q).where(vn(Q.userId,t)),_=await d.select({teamId:_e.teamId}).from(_e).where(vn(_e.userId,t)),I=p.map(E=>E.orgId).filter(E=>E!==null),h=_.map(E=>E.teamId).filter(E=>E!==null),f=[vn(g.archived,!1)],w=[vn(g.scope,"public")];if(I.length>0&&w.push(fc(vn(g.scope,"org"),qw(g.scopeRef,I))),h.length>0&&w.push(fc(vn(g.scope,"team"),qw(g.scopeRef,h))),f.push($w(...w)),n&&f.push(vn(g.badge,n)),r&&f.push(vn(g.scope,r)),o){let E=rt(o);f.push($w(Rd`${g.name} ILIKE ${`%${E}%`}`,Rd`${g.description} ILIKE ${`%${E}%`}`))}let b=[ZR(Rd`COALESCE(${g.sourceUpdatedAt}, ${g.updatedAt})`)],v={id:g.id,name:g.name,description:g.description,type:g.type,scope:g.scope,scopeRef:g.scopeRef,version:g.version,tags:g.tags,badge:g.badge,popularityScore:g.popularityScore,updatedAt:g.updatedAt,createdAt:g.createdAt,sourceUpdatedAt:g.sourceUpdatedAt},A=await(i>0?tt:d).select(i>0?{...v,contentPreview:Rd`left(${g.content}, ${i})`}:v).from(g).where(fc(...f)).orderBy(...b).limit(l).offset(m);return Gt({userId:t,surface:"api",action:"search",metadata:o?{query:o}:void 0}),e.header("Cache-Control","private, max-age=30"),e.json(A)});gc.post("/instructions/:id/badge",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=ek.parse(await e.req.json()),[o]=await d.select().from(g).where(fc(vn(g.id,n),vn(g.archived,!1)));if(!o)return e.json({error:"Instruction not found"},404);if(o.scope!=="org"&&o.scope!=="team")return e.json({error:"Badges can only be set on org or team-scoped instructions"},400);let s=o.scopeRef;if(!s)return e.json({error:"Instruction has no scope reference"},400);let[i]=await d.select().from(Q).where(fc(vn(Q.userId,t),vn(Q.orgId,s)));if(!i||i.role!=="admin"&&i.role!=="owner")return e.json({error:"Only admins of the owning organization can set badges"},403);let[c]=await d.update(g).set({badge:r.badge,updatedAt:new Date}).where(vn(g.id,n)).returning(),a=r.badge?"badge_set":"badge_removed";return await d.insert(Pt).values({instructionId:n,eventType:a,actorId:t,metadata:{badge:r.badge}}),e.json(c)});C();import{Hono as tk}from"hono";import{eq as fo,and as kd,or as nk,inArray as Uw}from"drizzle-orm";var Nd=new tk;Nd.post("/projects/:id/recommendations",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select().from(M).where(kd(fo(M.id,n),fo(M.createdBy,t)));if(!r)return e.json({error:"Project not found"},404);let o=await d.select({orgId:Q.orgId}).from(Q).where(fo(Q.userId,t)),s=await d.select({teamId:_e.teamId}).from(_e).where(fo(_e.userId,t)),i=o.map(f=>f.orgId).filter(f=>f!==null),c=s.map(f=>f.teamId).filter(f=>f!==null),a=[fo(g.scope,"public")];i.length>0&&a.push(kd(fo(g.scope,"org"),Uw(g.scopeRef,i))),c.length>0&&a.push(kd(fo(g.scope,"team"),Uw(g.scopeRef,c)));let l=await d.select().from(g).where(kd(fo(g.archived,!1),nk(...a))).limit(50);if(l.length===0)return e.json({recommendations:[],error:null});let m={name:r.name,description:r.description,languages:[],topics:[],dependencies:[]};if(r.githubRepo)try{let f=r.githubRepo.replace("https://github.com/",""),[w,b]=await Promise.all([fetch(`https://api.github.com/repos/${f}`,{headers:{Accept:"application/vnd.github.v3+json","User-Agent":"RuleMetric"}}),fetch(`https://api.github.com/repos/${f}/languages`,{headers:{Accept:"application/vnd.github.v3+json","User-Agent":"RuleMetric"}})]);if(w.ok){let v=await w.json();m.topics=v.topics??[]}if(b.ok){let v=await b.json();m.languages=Object.keys(v)}}catch{}let p=l.map(f=>({id:f.id,name:f.name,description:f.description??"",tags:f.tags??[],contentPreview:(f.content??"").slice(0,400)})),_=process.env.LLM_PROVIDER,I=process.env.LLM_API_KEY;if(!_||!I)return e.json({recommendations:[],error:"LLM not configured"});let h=await rf(m,p,{llmProvider:_,llmApiKey:I});return e.json(h)});import{Hono as Zk}from"hono";C();import{Hono as xk}from"hono";import{z as jf}from"zod";import{eq as mt,and as bc,desc as iv,sql as jn}from"drizzle-orm";C();import{and as fk,eq as kf,sql as gk}from"drizzle-orm";function df(e,t){let n=e,r=t,o=n+r;if(o===0)return{pValue:1,nDiscordant:0};let s=Math.min(n,r),i=Math.pow(.5,o),c=i;for(let a=1;a<=s;a++)i*=(o-a+1)/a,c+=i;return{pValue:Math.min(1,2*c),nDiscordant:o}}u(df,"mcnemarExact");function jd(e,t,n=10){return{sufficient:e>=n&&t>=n,minN:n,nWith:e,nWithout:t,shortfall:{with:Math.max(0,n-e),without:Math.max(0,n-t)}}}u(jd,"assessSufficiency");var go=1.959963984540054;function Pd(e,t,n=go){if(t===0)return{lower:0,upper:1};let r=e/t,o=n*n,s=1+o/t,i=(r+o/(2*t))/s,c=n/s*Math.sqrt(r*(1-r)/t+o/(4*t*t));return{lower:Math.max(0,i-c),upper:Math.min(1,i+c)}}u(Pd,"wilsonInterval");function di(e){let t=e>>>0;return()=>{t=t+1831565813|0;let n=Math.imul(t^t>>>15,1|t);return n=n+Math.imul(n^n>>>7,61|n)^n,((n^n>>>14)>>>0)/4294967296}}u(di,"seededRandom");function ui(e,t){let n=e.length;if(n===1)return e[0];let r=(n-1)*t,o=Math.floor(r),s=Math.ceil(r);return o===s?e[o]:e[o]+(r-o)*(e[s]-e[o])}u(ui,"sortedQuantile");function lf(e,t={}){let n=e.length;if(n===0)return{estimate:0,lower:0,upper:0,iterations:0};let r=t.iterations??1e4,o=t.ciLevel??.95,s=di(t.seed??1),i=e.reduce((l,m)=>l+m,0)/n,c=new Array(r);for(let l=0;l<r;l++){let m=0;for(let p=0;p<n;p++)m+=e[s()*n|0];c[l]=m/n}c.sort((l,m)=>l-m);let a=(1-o)/2;return{estimate:i,lower:ui(c,a),upper:ui(c,1-a),iterations:r}}u(lf,"pairedBootstrapCI");function mf(e,t,n={}){if(e.length===0||t.length===0)return{estimate:0,lower:0,upper:0,pValue:1,iterations:0};let r=n.iterations??1e4,o=n.ciLevel??.95,s=di(n.seed??1),i=u(I=>I.reduce((h,f)=>h+f,0)/I.length,"mean"),c=i(e)-i(t),a=new Array(r),l=0,m=0;for(let I=0;I<r;I++){let h=0;for(let b=0;b<e.length;b++)h+=e[s()*e.length|0];let f=0;for(let b=0;b<t.length;b++)f+=t[s()*t.length|0];let w=h/e.length-f/t.length;a[I]=w,w<=0&&l++,w>=0&&m++}a.sort((I,h)=>I-h);let p=(1-o)/2,_=Math.min(1,2*Math.min(l,m)/r);return{estimate:c,lower:ui(a,p),upper:ui(a,1-p),pValue:_,iterations:r}}u(mf,"twoSampleBootstrapCI");function pf(e,t={}){let n=e.filter(f=>f.withScores.length>0&&f.withoutScores.length>0);if(n.length===0)return{estimate:0,lower:0,upper:0,pValue:1,iterations:0};let r=u(f=>f.reduce((w,b)=>w+b,0)/f.length,"mean"),o=n.map(f=>f.withScores.length*f.withoutScores.length/(f.withScores.length+f.withoutScores.length)),s=o.reduce((f,w)=>f+w,0),i=u(f=>f.reduce((w,b,v)=>w+o[v]*b,0)/s,"combine"),c=i(n.map(f=>r(f.withScores)-r(f.withoutScores))),a=t.iterations??1e4,l=t.ciLevel??.95,m=di(t.seed??1),p=new Array(a),_=0,I=0;for(let f=0;f<a;f++){let w=n.map(v=>{let S=0;for(let E=0;E<v.withScores.length;E++)S+=v.withScores[m()*v.withScores.length|0];let A=0;for(let E=0;E<v.withoutScores.length;E++)A+=v.withoutScores[m()*v.withoutScores.length|0];return S/v.withScores.length-A/v.withoutScores.length}),b=i(w);p[f]=b,b<=0&&_++,b>=0&&I++}p.sort((f,w)=>f-w);let h=(1-l)/2;return{estimate:c,lower:ui(p,h),upper:ui(p,1-h),pValue:Math.min(1,2*Math.min(_,I)/a),iterations:a}}u(pf,"stratifiedBootstrapCI");function ff(e,t){if(e.length!==t.length)throw new Error(`cupedAdjust: outcomes (${e.length}) and covariates (${t.length}) must be the same length`);let n=e.length;if(n===0)return{adjusted:[],theta:0,varianceReduction:0};let r=t.reduce((I,h)=>I+h,0)/n,o=e.reduce((I,h)=>I+h,0)/n,s=0,i=0,c=0;for(let I=0;I<n;I++){let h=t[I]-r,f=e[I]-o;s+=h*f,i+=h*h,c+=f*f}if(i===0)return{adjusted:[...e],theta:0,varianceReduction:0};let a=s/i,l=e.map((I,h)=>I-a*(t[h]-r)),m=0,p=l.reduce((I,h)=>I+h,0)/n;for(let I of l)m+=(I-p)*(I-p);let _=c===0?0:1-m/c;return{adjusted:l,theta:a,varianceReduction:_}}u(ff,"cupedAdjust");function gf(e,t=.05){return e.map(n=>{let r=Math.abs(n.withPassRate-n.withoutPassRate),o=r>t,s;return o?s=`discriminates: ${(n.withPassRate*100).toFixed(0)}% with vs ${(n.withoutPassRate*100).toFixed(0)}% without`:n.withPassRate>=1-t&&n.withoutPassRate>=1-t?s="always passes in both cohorts \u2014 measures nothing about the treatment":n.withPassRate<=t&&n.withoutPassRate<=t?s="always fails in both cohorts \u2014 measures nothing about the treatment":s="similar pass rate in both cohorts \u2014 non-discriminating",{...n,discriminating:o,separation:r,note:s}})}u(gf,"diagnoseAssertions");function hf(e,t={}){let n=t.unpaired??0,r=t.materialFraction??.5,o=e.filter(l=>l.discriminating).length,s=e.length-o,i=e.length+n,c=s+n,a=null;if(i>0&&c>0&&c/i>=r){let l=n>0?` (${n} with no baseline cohort)`:"";a=`${c}/${i} cases do not discriminate with vs without${l} \u2014 cull or replace them before adding runs; more runs of a non-discriminating case cannot lower the MDE`}return{total:i,discriminating:o,nonDiscriminating:s,unpaired:n,diagnoses:e,gateReason:a}}u(hf,"summarizeDiscrimination");function Dd(e,t){let n=e.length,r=t.length;if(n===0||r===0)return 0;let o=[...e.map(l=>({t:l,exposed:!0})),...t.map(l=>({t:l,exposed:!1}))].sort((l,m)=>l.t-m.t),s=0,i=0;for(;i<o.length;){let l=i;for(;l+1<o.length&&o[l+1].t===o[i].t;)l++;let m=(i+1+l+1)/2;for(let p=i;p<=l;p++)o[p].exposed&&(s+=m);i=l+1}let a=(s-n*(n+1)/2)/(n*r);return Math.abs(a-.5)}u(Dd,"cohortTimeSeparation");var as=.35,Od=900*1e3;function _f(e,t,n=as,r=Od){if(e.length===0||t.length===0)return!1;let o=[...e,...t];return Math.max(...o)-Math.min(...o)<r?!1:Dd(e,t)>n}u(_f,"isTimeSeparated");var Hw=u(e=>e===0||e===1,"isBinary");function Bw(e,t,n){return e.every(o=>o[t]!=null&&o[n]!=null)?e.reduce((o,s)=>o+(s[t]-s[n]),0)/e.length:null}u(Bw,"meanPairDelta");function Cd(e,t={}){let n=t.baseline??"no-rule",r=t.minN??10,o=e.length,s=e.map(f=>f.withScore-f.withoutScore),i=o===0?0:s.reduce((f,w)=>f+w,0)/o,c=lf(s,{seed:t.seed,iterations:t.iterations}),a={lower:c.lower,upper:c.upper},l=e.every(f=>Hw(f.withScore)&&Hw(f.withoutScore)),m=null;if(l&&o>0){let f=0,w=0;for(let b of e)b.withScore===1&&b.withoutScore===0?f++:b.withScore===0&&b.withoutScore===1&&w++;m=df(f,w).pValue}let{sufficient:p}=jd(o,o,r),_=a.lower>0||a.upper<0,h={mode:"controlled",baseline:n,delta:i,ci:a,pValue:m,significant:p&&_,sufficient:p,nWith:o,nWithout:o,costDelta:Bw(e,"withCost","withoutCost"),latencyDelta:Bw(e,"withLatency","withoutLatency"),confounded:!1};return p||(h.insufficientReason=`insufficient data: need >= ${r} paired tasks per cohort, have ${o}`),h}u(Cd,"buildControlledVerdict");var rk=2;function Ld(e,t,n={}){let r=n.minN??10,o=e.length,s=t.length,i=e.map(v=>v.score),c=t.map(v=>v.score),a=[...e,...t],l=a.length>0&&a.every(v=>typeof v.covariate=="number");if(l){let{adjusted:v}=ff(a.map(S=>S.score),a.map(S=>S.covariate));i=v.slice(0,o),c=v.slice(o)}let m=mf(i,c,{seed:n.seed,iterations:n.iterations}),p={lower:m.lower,upper:m.upper},_=m.estimate,I=o>0&&s>0?m.pValue:null,{sufficient:h}=jd(o,s,r),f=h&&(p.lower>0||p.upper<0),w=u(v=>{if(o===0||s===0||!e.every(E=>v(E)!=null)||!t.every(E=>v(E)!=null))return null;let S=e.reduce((E,R)=>E+v(R),0)/o,A=t.reduce((E,R)=>E+v(R),0)/s;return S-A},"meanDiff"),b={mode:"observational",baseline:n.baseline??"no-rule",delta:_,ci:p,pValue:I,significant:f,sufficient:h,nWith:o,nWithout:s,costDelta:w(v=>v.cost),latencyDelta:w(v=>v.latency),confounded:!0,cupedApplied:l};return h||(b.insufficientReason=`insufficient data: need >= ${r} sessions per cohort, have ${o} exposed / ${s} unexposed`),b}u(Ld,"buildObservationalVerdict");function In(e,t={}){let n=t.minN??10,r=t.minPerStratum??rk,o=t.maxTimeSeparation??as,s=t.minStratumSpanMs??Od,i=e.filter(R=>R.withScores.length>=r&&R.withoutScores.length>=r),c=i.filter(R=>R.withTimes!=null&&R.withoutTimes!=null&&_f(R.withTimes,R.withoutTimes,o,s)),a=new Set(c.map(R=>R.key)),l=i.filter(R=>!a.has(R.key)),m=e.filter(R=>R.withScores.length>0&&R.withoutScores.length>0&&(R.withScores.length<r||R.withoutScores.length<r)).length,p=l.reduce((R,P)=>R+P.withScores.length,0),_=l.reduce((R,P)=>R+P.withoutScores.length,0),I=pf(l,{seed:t.seed,iterations:t.iterations}),h={lower:I.lower,upper:I.upper},f=I.estimate,w=l.length>0&&p>=n&&_>=n,b=l.length>0?I.pValue:null,v=w&&(h.lower>0||h.upper<0),S=e.reduce((R,P)=>R+P.withScores.length+P.withoutScores.length,0),A=S>0?(p+_)/S:0,E={mode:"observational",baseline:t.baseline??"no-rule",delta:f,ci:h,pValue:b,significant:v,sufficient:w,nWith:p,nWithout:_,costDelta:null,latencyDelta:null,confounded:!0,strata:l.length,strataDroppedForTimeSeparation:c.length,coverage:A};if(!w){let R=m>0?` (${m} project(s) had both cohorts but fewer than ${r} sessions in one of them)`:"",P=c.length>0?` ${c.length} project-month(s) held both cohorts but their sessions are separated in time (exposure predicts when a session ran), so the difference within them is a calendar difference, not a treatment effect`:"";E.insufficientReason=l.length===0?c.length>0?`insufficient data: no comparable cohort.${P}${R}`:`insufficient data: no project has >= ${r} exposed AND >= ${r} unexposed sessions to compare within${R}`:`insufficient data: need >= ${n} sessions per cohort across comparable projects, have ${p} exposed / ${_} unexposed${R}${P?`.${P}`:""}`}return E}u(In,"buildStratifiedVerdict");function yf(e,t,n={}){return{overall:In(e,n),segments:Md(t,n)}}u(yf,"buildSegmentedVerdict");function Md(e,t={}){return e.map(n=>({segment:n.segment,verdict:In(n.strata,t)}))}u(Md,"buildSegmentVerdicts");function cs(e){return e.sufficient?e.significant?e.delta<0?"harmful":"helpful":"neutral":"insufficient"}u(cs,"classifyEffect");var li={achieved:1,fully_achieved:1,mostly_achieved:.75,partially_achieved:.5,unclear_from_transcript:.25,not_achieved:0,abandoned:0},us=u(e=>{let t=e?li[e]:void 0;return t===void 0?null:t},"scoreOutcome");var mi=10,$d=u(e=>e.length===0?0:e.reduce((t,n)=>t+n,0)/e.length,"mean"),wf=u(e=>{if(e.length<2)return 0;let t=$d(e);return e.reduce((n,r)=>n+(r-t)**2,0)/(e.length-1)},"sampleVar"),Fw=u((e,t)=>{let n=t.reduce((l,m)=>l+m,0);if(n<=0||e.length===0)return{mean:0,varOfMean:0,nEff:0};let r=t.reduce((l,m)=>l+m*m,0),o=n*n/r,s=e.reduce((l,m,p)=>l+t[p]*m,0)/n,i=n-r/n,a=(i>0?e.reduce((l,m,p)=>l+t[p]*(m-s)**2,0)/i:0)*r/(n*n);return{mean:s,varOfMean:a,nEff:o}},"weightedStats");function vf(e,t,n={}){let r=n.minAnchors??mi,o=n.z??go,s=e.length,i=t.length,c=[...e,...t.map(A=>A.judge)],a=$d(c),l=t.map(A=>A.weight??1),m=t.map(A=>A.human-A.judge),p=Fw(m,l),_=p.mean,I=i>0?p.nEff:0,h=t.filter(A=>A.validated!==!1).length;if(n.pooledRectifier){let A=n.pooledRectifier,E=s>0?e:t.map(q=>q.judge);if(E.length===0)return{estimate:NaN,ci:{lower:NaN,upper:NaN},se:1/0,naive:a,rectifier:A.rectifier,nLabeled:i,nUnlabeled:s,nEffective:I,nValidated:h,sufficient:!1,insufficientReason:"no judge scores to correct with the pooled rectifier"};let R=$d(E)+A.rectifier,P=wf(E)/E.length+A.variance,N=Math.sqrt(P),D={estimate:R,ci:{lower:R-o*N,upper:R+o*N},se:N,naive:a,rectifier:A.rectifier,nLabeled:i,nUnlabeled:s,nEffective:I,nValidated:h,sufficient:A.sufficient};return A.sufficient||(D.insufficientReason="pooled rectifier not yet adequate"),D}let f,w;if(i===0)f=a,w=c.length>0?wf(c)/c.length:0;else if(s===0){let A=Fw(t.map(E=>E.human),l);f=A.mean,w=A.varOfMean}else f=$d(e)+_,w=wf(e)/s+p.varOfMean;let b=Math.sqrt(w),v=h>=r,S={estimate:f,ci:{lower:f-o*b,upper:f+o*b},se:b,naive:a,rectifier:_,nLabeled:i,nUnlabeled:s,nEffective:I,nValidated:h,sufficient:v};if(!v){let A=i-h;S.insufficientReason=`insufficient anchors: need >= ${r} VALIDATED human-labeled items, have ${h}${A>0?` (+${A} passive, which don't count toward the floor)`:""}`}return S}u(vf,"ppiMeanEstimate");function hc(e,t,n={}){let r=vf(e.unlabeledJudge,e.labeled,{...n,pooledRectifier:n.withPooledRectifier}),o=vf(t.unlabeledJudge,t.labeled,{...n,pooledRectifier:n.withoutPooledRectifier}),s=n.z??go,i=r.estimate-o.estimate,c=Math.sqrt(r.se**2+o.se**2),a={lower:i-s*c,upper:i+s*c},l=r.sufficient&&o.sufficient,m=l&&(a.lower>0||a.upper<0),p={delta:i,ci:a,se:c,with:r,without:o,sufficient:l,significant:m};return l||(p.insufficientReason=r.insufficientReason??o.insufficientReason),p}u(hc,"ppiDifference");var qd=50,Vw=.2,Jw=.8416212335729143,ok=u(e=>e.length===0?0:e.reduce((t,n)=>t+n,0)/e.length,"mean"),_c=u(e=>{if(e.length<2)return 0;let t=ok(e);return e.reduce((n,r)=>n+(r-t)**2,0)/(e.length-1)},"sampleVar");function Ww(e,t){let n=e.labeled.length,r=e.unlabeledJudge.length;return n>0&&r>0?{fixed:_c(e.unlabeledJudge)/r,scaling:_c(e.labeled.map(o=>o.human-o.judge)),n}:n>0?{fixed:0,scaling:_c(e.labeled.map(o=>o.human)),n}:{fixed:r>0?_c(e.unlabeledJudge)/r:0,scaling:t.labeled.length>0?_c(t.labeled.map(o=>o.human-o.judge)):null,n:0}}u(Ww,"varianceComponents");var zw=1e6;function sk(e,t){if(e.some(s=>s.scaling===null))return null;let n=u(s=>e.reduce((i,c)=>i+c.fixed+(c.scaling===0?0:c.scaling/(c.n+s)),0),"se2");if(n(zw)>t)return null;let r=0,o=zw;for(;r<o;){let s=Math.floor((r+o)/2);n(s)<=t?o=s:r=s+1}return r}u(sk,"solvePerCohortIncrement");function If(e,t,n={}){let r=n.pilotTarget??qd,o=n.targetEffect??Vw,s=n.minAnchors??mi,i=n.z??go,c=n.zPower??Jw,a=i+c,l=u(N=>(N*100).toFixed(0),"pp"),m=e.labeled.length,p=t.labeled.length,_=n.humanLabeledRuns??m+p,I=e.unlabeledJudge.length+m+t.unlabeledJudge.length+p,h={nAnchors:_,nAnchorsWith:m,nAnchorsWithout:p,pilotTarget:r,pilotMet:_>=r,targetEffect:o};if(I===0)return{...h,seDelta:null,mde:null,powered:!1,adequate:!1,reasons:["no graded runs to calibrate against"],additionalAnchorsNeeded:r};let f=hc(e,t,{minAnchors:s,z:i,withPooledRectifier:n.pool?.withPooledRectifier,withoutPooledRectifier:n.pool?.withoutPooledRectifier}).se,w=a*f,b=w<=o;if(n.pool){let{totalAnchors:N,targets:D}=n.pool,q=N>=r,H=D>=3,B=q&&H&&b,ee=[];return H||ee.push(`pool spans ${D}/3 same-judge targets \u2014 between-target variance is assumed, not measured`),q||ee.push(`pool floor not met: ${N}/${r} human-labeled runs across the same-judge pool`),b||ee.push(`MDE \xB1${l(w)}pp exceeds the \xB1${l(o)}pp target effect \u2014 pooling lowers the label cost, not this; more graded runs are needed (\xA76d(f))`),{...h,seDelta:f,mde:w,powered:b,adequate:B,reasons:ee,additionalAnchorsNeeded:q?null:r-N,pooled:!0,poolAnchors:N,poolTargets:D}}let v=m>=s,S=p>=s,A=h.pilotMet&&v&&S&&b,E,R=0;if(!b){let N=(o/a)**2,D=sk([Ww(e,t),Ww(t,e)],N);R=D===null?null:2*D}if(!h.pilotMet)E=r-_;else if(R===null)E=null;else{let N=Math.max(0,s-m)+Math.max(0,s-p);E=Math.max(N,R)}let P=[];if(h.pilotMet||P.push(`pilot target not met: ${_}/${r} human-labeled runs`),v||P.push(`with-target cohort has ${m}/${s} labeled runs (minimum for a corrected estimate)`),S||P.push(`without-target cohort has ${p}/${s} labeled runs (minimum for a corrected estimate)`),!b){let N=R===null?" \u2014 anchors alone cannot reach it; more graded runs are needed":h.pilotMet&&R>0?` \u2014 ~${R} more labeled runs projected to reach it`:"";P.push(`MDE \xB1${l(w)}pp exceeds the \xB1${l(o)}pp target effect${N}`)}return{...h,seDelta:f,mde:w,powered:b,adequate:A,reasons:P,additionalAnchorsNeeded:E}}u(If,"anchorPowerCheck");function bf(e,t){return{rectifierUsed:e.rectifier,variance:e.variance,lambda:0,pooled:e.rectifier,pooledVariance:e.variance,tau2:0,i2:0,k:1,pooledApplied:!1,assumedExchangeability:!1,...t}}u(bf,"localOnly");function Ud(e,t,n={}){let r=n.maxI2??.6,o=[e,...t].filter(B=>B.n>=1&&Number.isFinite(B.variance)&&B.variance>=0),s=o.length;if(s<2)return e.n<1||!Number.isFinite(e.variance)?bf(e,{rectifierUsed:NaN,variance:1/0,reason:"no anchors on this target and none to pool from"}):bf(e,{reason:"only one target with anchors \u2014 nothing to pool"});let i=o.map(B=>B.variance).filter(B=>B>0),c=i.length?i.reduce((B,ee)=>B+ee,0)/i.length:0,a=Math.max(c*.001,1e-12),l=u(B=>Math.max(B,a),"flooredVar"),m=o.map(B=>1/l(B.variance)),p=m.reduce((B,ee)=>B+ee,0),_=m.reduce((B,ee)=>B+ee*ee,0),I=o.reduce((B,ee,he)=>B+m[he]*ee.rectifier,0)/p,h=o.reduce((B,ee,he)=>B+m[he]*(ee.rectifier-I)**2,0),f=s-1,w=p-_/p,b=w>0?Math.max(0,(h-f)/w):0,v=h>0?Math.max(0,(h-f)/h):0,S=o.map(B=>1/(l(B.variance)+b)),A=S.reduce((B,ee)=>B+ee,0),E=o.reduce((B,ee,he)=>B+S[he]*ee.rectifier,0)/A,R=1/A,P=s<3;if(v>r)return e.n>=1&&Number.isFinite(e.variance)?bf(e,{pooled:E,pooledVariance:R,tau2:b,i2:v,k:s,assumedExchangeability:P,reason:`heterogeneity too high (I\xB2=${(v*100).toFixed(0)}%) \u2014 targets disagree; not pooling`}):{rectifierUsed:E,variance:R,lambda:1,pooled:E,pooledVariance:R,tau2:b,i2:v,k:s,pooledApplied:!1,assumedExchangeability:P,reason:`no anchors on this target; pooled estimate is high-heterogeneity (I\xB2=${(v*100).toFixed(0)}%) \u2014 treat as unknown`};let N=e.n<1||!Number.isFinite(e.variance),D=N?1:l(e.variance)/(l(e.variance)+b),q=N?E:D*E+(1-D)*e.rectifier,H=N?R+b:(1-D)*e.variance+D*D*R;return{rectifierUsed:q,variance:H,lambda:D,pooled:E,pooledVariance:R,tau2:b,i2:v,k:s,pooledApplied:!0,assumedExchangeability:P}}u(Ud,"shrinkRectifier");var pi=3,wc=7,Sf="(preamble)",dk=/^\s*(`{3,}|~{3,})/,lk=/^(#{1,6})\s+(.*)$/;function yc(e){let t=e.split(`
156
+ `),n=[],r=[],o={heading:"",level:0,path:[Sf],body:[]},s=null,i=u(()=>{n.push({heading:o.heading,level:o.level,path:o.path,body:o.body.join(`
157
+ `).trim()})},"flush");for(let c of t){let a=dk.exec(c);if(a){let m=a[1];s==null?s={marker:m}:m[0]===s.marker[0]&&m.length>=s.marker.length&&(s=null),o.body.push(c);continue}if(s!=null){o.body.push(c);continue}let l=lk.exec(c);if(l){i();let m=l[1].length,p=l[2].trim();r.length=Math.max(0,m-1),r[m-1]=p,o={heading:p,level:m,path:Array.from({length:m},(_,I)=>r[I]??`(unnamed level ${I+1})`),body:[]};continue}o.body.push(c)}return i(),n.filter((c,a)=>!(a===0&&c.level===0&&c.body===""))}u(yc,"splitMarkdownSections");function Hd(e){let t=new Map,n=new Map;for(let r of e){let o=r.level===0?Sf:r.path.join(" > "),s=(t.get(o)??0)+1;t.set(o,s),n.set(s===1?o:`${o} #${s}`,r)}return n}u(Hd,"sectionKeys");function Af(e,t){let n=Hd(yc(e)),r=Hd(yc(t)),o=[],s=[],i=[];for(let[c,a]of r){let l=n.get(c);l?l.body!==a.body&&o.push(c):s.push(c)}for(let c of n.keys())r.has(c)||i.push(c);return{changed:o.sort(),added:s.sort(),removed:i.sort()}}u(Af,"diffSections");function Ef(e){return[...new Set([...e.changed,...e.added,...e.removed])].sort()}u(Ef,"touchedSections");var Kw=u(e=>e.trim().toLowerCase(),"normalize");function Gw(e,t,n){if(n.length===0)return[];let r=new Set(n.map(Kw)),o=Af(e,t),s=new Set(Ef(o)),i=new Map([...Hd(yc(e)),...Hd(yc(t))]),c=[];for(let a of s){let l=i.get(a);(l?l.path:a.split(" > ")).some(p=>r.has(Kw(p)))&&c.push(a)}return c.sort()}u(Gw,"protectedViolations");function xf(e){let{verdict:t,canaryGreen:n,adequate:r,adequacyReasons:o=[],promotionsInWindow:s,maxPromotionsPerWindow:i=pi,immutableSections:c=[],beforeContent:a,afterContent:l,measurementMatchesPredecessor:m}=e,p=Ef(Af(a,l)),_=cs(t),I=[];if(a===l&&I.push("proposal is identical to the current version \u2014 nothing to promote"),t.mode!=="controlled"&&I.push(`verdict is ${t.mode}, not controlled \u2014 Phase 2 measured that an observational version-vs-version comparison is refused on 99.4% of real version pairs, because versions are disjoint in time by construction`),t.baseline!=="prior-version"&&I.push(`verdict baseline is '${t.baseline}', not 'prior-version' \u2014 a no-rule comparison says the instruction beats having no instruction, not that this edit beats the last one`),t.confounded&&I.push("verdict is flagged confounded"),m===!1&&I.push("pairs were measured against a different predecessor than the one now live \u2014 the target's content changed after the eval batch ran, so this verdict is about a comparison that no longer exists"),n||I.push("A/A canary is red \u2014 the verdict path can manufacture effects from noise, so no verdict it produces may be promoted"),!r){let b=o.length>0?`: ${o.join("; ")}`:"";I.push(`verdict is not adequately powered${b}`)}s>=i&&I.push(`change budget exhausted: ${s}/${i} promotions already made in the current window`);let h=Gw(a,l,c);if(h.length>0&&I.push(`proposal edits protected section(s): ${h.join(", ")}`),_==="insufficient"&&I.push(t.insufficientReason??"verdict did not clear min-n, so no effect was measured"),I.length>0)return{decision:"refuse",refusals:I,rationale:`refused: ${I.length} gate(s) blocked promotion`,effect:_,touched:p};let f=u(b=>`${b>=0?"+":""}${(b*100).toFixed(1)}pp`,"pp"),w=`[${f(t.ci.lower)}, ${f(t.ci.upper)}]`;return _==="helpful"?{decision:"promote",refusals:[],rationale:`promote: ${f(t.delta)} CI ${w} over the prior version, n=${t.nWith} paired cases`,effect:_,touched:p}:_==="harmful"?{decision:"revert",refusals:[],rationale:`revert: proposal measured WORSE than its predecessor, ${f(t.delta)} CI ${w}`,effect:_,touched:p}:{decision:"revert",refusals:[],rationale:`revert: no detectable improvement, ${f(t.delta)} CI ${w} spans zero`,effect:_,touched:p}}u(xf,"evaluatePromotion");async function Ic(e,t){let[n]=await d.select({id:U.id,instructionId:U.instructionId,projectPath:U.projectPath,status:U.status,contentHash:U.contentHash}).from(U).where(fk(kf(U.id,e),kf(U.userId,t)));if(!n)return null;let r=!1;if(n.contentHash){let{instructionContentHash:h}=await Promise.resolve().then(()=>(ds(),ev)),[f]=await d.select({content:g.content,name:g.name}).from(g).where(kf(g.id,n.instructionId));r=h(f?.content,f?.name)!==n.contentHash}let o=await d.execute(gk`
244
158
  SELECT a.arm,
245
159
  s.analysis->>'outcome' AS outcome,
246
160
  EXTRACT(EPOCH FROM s.started_at) * 1000 AS started_ms
@@ -249,17 +163,22 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
249
163
  ON s.external_session_id = a.external_session_id
250
164
  AND s.user_id = a.user_id
251
165
  WHERE a.experiment_id = ${e}
252
- `),s={treated:0,control:0},i=[],a=[],c=[],l=[];for(let h of o){let f=h.arm==="treated";f?s.treated++:s.control++;let w=us(h.outcome);if(w===null)continue;let b=h.started_ms===null?null:Number(h.started_ms);f?(i.push(w),b!==null&&c.push(b)):(a.push(w),b!==null&&l.push(b))}let p={treated:i.length,control:a.length},m={experimentId:n.id,instructionId:n.instructionId,projectPath:n.projectPath,status:n.status,assigned:s,measured:p,contentChanged:r};if(r)return{...m,delta:null,ci:null,significant:!1,resolution:"inconclusive",timeSeparation:null,randomisationSuspect:!1,reason:"the instruction was edited mid-experiment \u2014 the arms measured different texts, so no verdict transfers. It re-enters testing as new content."};if(p.treated<10||p.control<10)return{...m,delta:null,ci:null,significant:!1,resolution:"insufficient",timeSeparation:null,randomisationSuspect:!1,reason:`needs ${10} measured sessions per arm; have ${p.treated} treated / ${p.control} control`};let y=Ou(c,l);if(y>cs)return{...m,delta:null,ci:null,significant:!1,resolution:"inconclusive",timeSeparation:y,randomisationSuspect:!0,reason:`arms are time-separated (${y.toFixed(2)} > ${cs}) \u2014 randomisation looks broken, not merely confounded`};let v=Lu(i.map(h=>({score:h})),a.map(h=>({score:h})),{minN:10});return{...m,delta:v.delta,ci:v.ci,significant:v.significant,resolution:v.significant?"resolved":"inconclusive",timeSeparation:y,randomisationSuspect:!1,reason:v.significant?null:"the interval still spans zero \u2014 more sessions, or the effect is small"}}d(bc,"buildArmVerdict");ls();var pN=new Set(["cmd","cmds","command","commands","host","hostname","url","uri","todo","tbd","xxx","placeholder","insert","fixme"]),mN=/(?<![A-Za-z0-9])<([A-Za-z][^<>\n]{0,78}[A-Za-z0-9._/-])>/g,fN=/\{\{\s*[^{}\n]{1,80}\s*\}\}/g,gN=/_{3,}/g,hN=/[\s:|/]|\.\.\./,_N=/^[a-z][a-z0-9+.-]*:\/\//i;function hi(e,t=10){let n=[],r=new Set,o=d((s,i)=>{r.has(s)||n.length>=t||(r.add(s),n.push({token:s,rule:i}))},"push");for(let s of e.matchAll(mN)){let i=s[1];_N.test(i)||(hN.test(i)||pN.has(i.toLowerCase()))&&o(s[0],"bracketed")}for(let s of e.matchAll(fN))o(s[0],"mustache");for(let s of e.matchAll(gN))o(s[0],"blank");return n}d(hi,"findPlaceholders");O();import{and as yN,eq as _i,gte as wN,sql as fI}from"drizzle-orm";var Dt={MIN_SCORE:.8,KIND:"add",MAX_PER_RUN:2,MAX_PER_WINDOW:5,WINDOW_DAYS:7};async function Vu(e,t){if(t){let[r]=await u.select({override:fI`${U.metadata}->>'autoAcceptSuggestions'`}).from(U).where(_i(U.id,t));if(r?.override!=null)return r.override==="true"?{allowed:!0,source:"project"}:{allowed:!1,source:"project",reason:"auto-accept is turned off for this project"}}let[n]=await u.select({enabled:T.autoAcceptSuggestions}).from(T).where(_i(T.id,e));return n?n.enabled?{allowed:!0,source:"user-default"}:{allowed:!1,source:"user-default",reason:"auto-accept is turned off for your account"}:{allowed:!1,source:"user-default",reason:"no profile row"}}d(Vu,"resolveAutoAcceptConsent");async function gI(e,t){let n=new Date(Date.now()-Dt.WINDOW_DAYS*864e5),[r]=await u.select({n:fI`count(*)::int`}).from(tt).where(yN(_i(tt.userId,e),_i(tt.projectPath,t),_i(tt.eventType,"accepted"),_i(tt.actor,"auto"),wN(tt.createdAt,n)));return r?.n??0}d(gI,"autoAcceptsInWindow");var yi=new vN,hI=3,_I=1;yi.get("/instruction-suggestions/auto-acceptable",async e=>{let t=e.get("userId"),n=e.req.query("projectPath");if(!n)return e.json({error:"projectPath is required"},400);let r=await u.select({id:x.id,instructionId:x.instructionId,projectId:x.projectId,score:x.score,kind:x.kind,name:g.name,content:g.content,archived:g.archived}).from(x).innerJoin(g,mt(g.id,x.instructionId)).where(Sc(mt(x.userId,t),mt(x.projectPath,n),mt(x.kind,Dt.KIND),Kn`(${x.score} >= ${Dt.MIN_SCORE} OR ${g.frontmatter}->>'source' = 'insights')`,Kn`${x.acceptedAt} IS NULL`,Kn`${x.dismissedAt} IS NULL`,Kn`${x.declinedAt} IS NULL`,mt(x.isStale,!1),mt(g.archived,!1),mt(g.type,"instruction"),Kn`NOT EXISTS (
166
+ `),s={treated:0,control:0},i=[],c=[],a=[],l=[];for(let h of o){let f=h.arm==="treated";f?s.treated++:s.control++;let w=us(h.outcome);if(w===null)continue;let b=h.started_ms===null?null:Number(h.started_ms);f?(i.push(w),b!==null&&a.push(b)):(c.push(w),b!==null&&l.push(b))}let m={treated:i.length,control:c.length},p={experimentId:n.id,instructionId:n.instructionId,projectPath:n.projectPath,status:n.status,assigned:s,measured:m,contentChanged:r};if(r)return{...p,delta:null,ci:null,significant:!1,resolution:"inconclusive",timeSeparation:null,randomisationSuspect:!1,reason:"the instruction was edited mid-experiment \u2014 the arms measured different texts, so no verdict transfers. It re-enters testing as new content."};if(m.treated<10||m.control<10)return{...p,delta:null,ci:null,significant:!1,resolution:"insufficient",timeSeparation:null,randomisationSuspect:!1,reason:`needs ${10} measured sessions per arm; have ${m.treated} treated / ${m.control} control`};let _=Dd(a,l);if(_>as)return{...p,delta:null,ci:null,significant:!1,resolution:"inconclusive",timeSeparation:_,randomisationSuspect:!0,reason:`arms are time-separated (${_.toFixed(2)} > ${as}) \u2014 randomisation looks broken, not merely confounded`};let I=Ld(i.map(h=>({score:h})),c.map(h=>({score:h})),{minN:10});return{...p,delta:I.delta,ci:I.ci,significant:I.significant,resolution:I.significant?"resolved":"inconclusive",timeSeparation:_,randomisationSuspect:!1,reason:I.significant?null:"the interval still spans zero \u2014 more sessions, or the effect is small"}}u(Ic,"buildArmVerdict");ds();var hk=new Set(["cmd","cmds","command","commands","host","hostname","url","uri","todo","tbd","xxx","placeholder","insert","fixme"]),_k=/(?<![A-Za-z0-9])<([A-Za-z][^<>\n]{0,78}[A-Za-z0-9._/-])>/g,yk=/\{\{\s*[^{}\n]{1,80}\s*\}\}/g,wk=/_{3,}/g,vk=/[\s:|/]|\.\.\./,Ik=/^[a-z][a-z0-9+.-]*:\/\//i;function gi(e,t=10){let n=[],r=new Set,o=u((s,i)=>{r.has(s)||n.length>=t||(r.add(s),n.push({token:s,rule:i}))},"push");for(let s of e.matchAll(_k)){let i=s[1];Ik.test(i)||(vk.test(i)||hk.has(i.toLowerCase()))&&o(s[0],"bracketed")}for(let s of e.matchAll(yk))o(s[0],"mustache");for(let s of e.matchAll(wk))o(s[0],"blank");return n}u(gi,"findPlaceholders");C();import{and as Nf,eq as ur,gte as bk,sql as ls}from"drizzle-orm";var cn={MIN_SCORE:.8,KIND:"add",MAX_PER_RUN:3,MAX_PER_WINDOW:15,WINDOW_DAYS:7},Nn={minScore:{min:0,max:1},maxPerRun:{min:0,max:25},maxPerWindow:{min:0,max:100},windowDays:{min:1,max:90}};function Sk(e,t){let{min:n,max:r}=Nn[e];return Number.isFinite(t)?Math.min(r,Math.max(n,t)):cn[Ak[e]]}u(Sk,"clampLimit");var Ak={minScore:"MIN_SCORE",maxPerRun:"MAX_PER_RUN",maxPerWindow:"MAX_PER_WINDOW",windowDays:"WINDOW_DAYS"};async function zd(e,t){if(t){let[r]=await d.select({override:ls`${M.metadata}->>'autoAcceptSuggestions'`}).from(M).where(ur(M.id,t));if(r?.override!=null)return r.override==="true"?{allowed:!0,source:"project"}:{allowed:!1,source:"project",reason:"auto-accept is turned off for this project"}}let[n]=await d.select({enabled:T.autoAcceptSuggestions}).from(T).where(ur(T.id,e));return n?n.enabled?{allowed:!0,source:"user-default"}:{allowed:!1,source:"user-default",reason:"auto-accept is turned off for your account"}:{allowed:!1,source:"user-default",reason:"no profile row"}}u(zd,"resolveAutoAcceptConsent");async function hi(e,t){let n={minScore:cn.MIN_SCORE,maxPerRun:cn.MAX_PER_RUN,maxPerWindow:cn.MAX_PER_WINDOW,windowDays:cn.WINDOW_DAYS,kind:cn.KIND,source:{minScore:"default",maxPerRun:"default",maxPerWindow:"default",windowDays:"default"}},[r]=await d.select({minScore:T.autoAcceptMinScore,maxPerRun:T.autoAcceptMaxPerRun,maxPerWindow:T.autoAcceptMaxPerWindow,windowDays:T.autoAcceptWindowDays}).from(T).where(ur(T.id,e));if(tv(n,r??null,"account"),t){let[o]=await d.select({minScore:ls`(${M.metadata}->'autoAcceptLimits'->>'minScore')::real`,maxPerRun:ls`(${M.metadata}->'autoAcceptLimits'->>'maxPerRun')::int`,maxPerWindow:ls`(${M.metadata}->'autoAcceptLimits'->>'maxPerWindow')::int`,windowDays:ls`(${M.metadata}->'autoAcceptLimits'->>'windowDays')::int`}).from(M).where(ur(M.id,t));tv(n,o??null,"project")}return n}u(hi,"resolveAutoAcceptLimits");function tv(e,t,n){if(t)for(let r of Object.keys(Nn)){let o=t[r];o!=null&&(e[r]=Sk(r,Number(o)),e.source[r]=n)}}u(tv,"applyOverrides");async function nv(e,t,n,r=cn.WINDOW_DAYS){let o=new Date(Date.now()-r*864e5),s=Nf(ur(Je.userId,e),ur(Je.eventType,"accepted"),ur(Je.actor,"auto"),bk(Je.createdAt,o));if(!n){let[c]=await d.select({n:ls`count(*)::int`}).from(Je).where(Nf(s,ur(Je.projectPath,t)));return c?.n??0}let[i]=await d.select({n:ls`count(*)::int`}).from(Je).innerJoin(x,ur(x.id,Je.suggestionId)).where(Nf(s,ur(x.projectId,n)));return i?.n??0}u(nv,"autoAcceptsInWindow");C();import{desc as Ek,eq as rv}from"drizzle-orm";async function Ur(e){if(!e)return null;try{let[t]=await d.select({projectId:de.projectId}).from(de).where(rv(de.path,e)).orderBy(Ek(de.lastSeen)).limit(1);if(t)return t.projectId;let[n]=await d.select({id:M.id}).from(M).where(rv(M.gitRemoteUrl,e)).limit(1);return n?.id??null}catch{return null}}u(Ur,"resolveProjectIdForPath");var _i=new xk,ov=3,sv=1;_i.get("/instruction-suggestions/auto-acceptable",async e=>{let t=e.get("userId"),n=e.req.query("projectPath");if(!n)return e.json({error:"projectPath is required"},400);let r=await Ur(n),o=await hi(t,r),s=await d.select({id:x.id,instructionId:x.instructionId,projectId:x.projectId,score:x.score,kind:x.kind,name:g.name,content:g.content,archived:g.archived}).from(x).innerJoin(g,mt(g.id,x.instructionId)).where(bc(mt(x.userId,t),mt(x.projectPath,n),mt(x.kind,cn.KIND),jn`(${x.score} >= ${o.minScore} OR ${g.frontmatter}->>'source' = 'insights')`,jn`${x.acceptedAt} IS NULL`,jn`${x.dismissedAt} IS NULL`,jn`${x.declinedAt} IS NULL`,mt(x.isStale,!1),mt(g.archived,!1),mt(g.type,"instruction"),jn`NOT EXISTS (
167
+ SELECT 1 FROM instruction_suggestion_events ev
168
+ WHERE ev.suggestion_id = ${x.id}
169
+ AND ev.event_type = 'redundant'
170
+ AND ev.created_at > now() - interval '30 days'
171
+ )`,jn`NOT EXISTS (
253
172
  SELECT 1 FROM instruction_experiments e
254
173
  WHERE e.instruction_id = ${x.instructionId}
255
174
  AND e.project_path = ${x.projectPath}
256
175
  AND e.status = 'running'
257
- )`)).orderBy(yI(x.score)),o=await Vu(t,r[0]?.projectId??null);if(!o.allowed)return e.json({consent:o,eligible:[],refused:r.map(l=>({id:l.id,name:l.name,reason:o.reason})),budget:null});let s=await gI(t,n),i=Math.max(0,Dt.MAX_PER_WINDOW-s),a=[],c=[];for(let l of r){let p=hi(l.content??"");if(p.length>0){c.push({id:l.id,name:l.name,reason:`unfilled placeholder(s): ${p.map(m=>m.token).join(", ")}`});continue}if(a.length>=Math.min(Dt.MAX_PER_RUN,i)){c.push({id:l.id,name:l.name,reason:i<=a.length?`budget: ${s}/${Dt.MAX_PER_WINDOW} auto-accepted in the last ${Dt.WINDOW_DAYS}d`:`over the per-run cap of ${Dt.MAX_PER_RUN}`});continue}a.push({id:l.id,instructionId:l.instructionId,name:l.name,score:l.score})}return e.json({consent:o,eligible:a,refused:c,budget:{used:s,max:Dt.MAX_PER_WINDOW,windowDays:Dt.WINDOW_DAYS,perRun:Dt.MAX_PER_RUN}})});yi.post("/instruction-experiments/settle",async e=>{let t=e.get("userId"),n=await e.req.json().catch(()=>({})),r=typeof n?.projectPath=="string"?n.projectPath:null,o=await u.select({id:q.id,source:q.source,status:q.status,instructionId:q.instructionId,projectPath:q.projectPath}).from(q).where(Sc(mt(q.userId,t),mt(q.status,"running"),...r?[mt(q.projectPath,r)]:[])),s=[],i=0;for(let a of o)try{let c=await bc(a.id,t);if(!c){i+=1;continue}let l=await gi({experimentId:a.id,userId:t,verdict:c,source:a.source,status:a.status});l?s.push({experimentId:a.id,outcome:l}):i+=1}catch{i+=1}return e.json({examined:o.length,settled:s,stillRunning:i})});yi.get("/instruction-suggestions/trialable",async e=>{let t=e.get("userId"),n=e.req.query("projectPath");if(!n)return e.json({error:"projectPath is required"},400);let[{running:r}]=await u.select({running:Kn`count(*)::int`}).from(q).where(Sc(mt(q.userId,t),mt(q.projectPath,n),mt(q.status,"running"))),o=Math.max(0,hI-r),s=await u.select({id:x.id,instructionId:x.instructionId,score:x.score,name:g.name,content:g.content}).from(x).innerJoin(g,mt(g.id,x.instructionId)).where(Sc(mt(x.userId,t),mt(x.projectPath,n),mt(x.kind,"add"),Kn`${x.acceptedAt} IS NULL`,Kn`${x.dismissedAt} IS NULL`,Kn`${x.declinedAt} IS NULL`,mt(x.isStale,!1),mt(g.archived,!1),Kn`${g.type} NOT IN ('hook','mcp','subagent')`,Kn`NOT EXISTS (
176
+ )`)).orderBy(iv(x.score)),i=r??s[0]?.projectId??null,c=await zd(t,i);if(!c.allowed)return e.json({consent:c,eligible:[],refused:s.map(_=>({id:_.id,name:_.name,reason:c.reason})),budget:null});let a=await nv(t,n,i,o.windowDays),l=Math.max(0,o.maxPerWindow-a),m=[],p=[];for(let _ of s){let I=gi(_.content??"");if(I.length>0){p.push({id:_.id,name:_.name,reason:`unfilled placeholder(s): ${I.map(h=>h.token).join(", ")}`});continue}if(m.length>=Math.min(o.maxPerRun,l)){p.push({id:_.id,name:_.name,reason:l<=m.length?`budget: ${a}/${o.maxPerWindow} auto-accepted for this project in the last ${o.windowDays}d (${o.source.maxPerWindow} setting)`:`over the per-run cap of ${o.maxPerRun}`});continue}m.push({id:_.id,instructionId:_.instructionId,name:_.name,score:_.score})}return e.json({consent:c,eligible:m,refused:p,budget:{used:a,max:o.maxPerWindow,windowDays:o.windowDays,perRun:o.maxPerRun,source:o.source}})});_i.post("/instruction-experiments/settle",async e=>{let t=e.get("userId"),n=await e.req.json().catch(()=>({})),r=typeof n?.projectPath=="string"?n.projectPath:null,o=await d.select({id:U.id,source:U.source,status:U.status,instructionId:U.instructionId,projectPath:U.projectPath}).from(U).where(bc(mt(U.userId,t),mt(U.status,"running"),...r?[mt(U.projectPath,r)]:[])),s=[],i=0;for(let c of o)try{let a=await Ic(c.id,t);if(!a){i+=1;continue}let l=await fi({experimentId:c.id,userId:t,verdict:a,source:c.source,status:c.status});l?s.push({experimentId:c.id,outcome:l}):i+=1}catch{i+=1}return e.json({examined:o.length,settled:s,stillRunning:i})});_i.get("/instruction-suggestions/trialable",async e=>{let t=e.get("userId"),n=e.req.query("projectPath");if(!n)return e.json({error:"projectPath is required"},400);let[{running:r}]=await d.select({running:jn`count(*)::int`}).from(U).where(bc(mt(U.userId,t),mt(U.projectPath,n),mt(U.status,"running"))),o=Math.max(0,ov-r),s=await d.select({id:x.id,instructionId:x.instructionId,score:x.score,name:g.name,content:g.content}).from(x).innerJoin(g,mt(g.id,x.instructionId)).where(bc(mt(x.userId,t),mt(x.projectPath,n),mt(x.kind,"add"),jn`${x.acceptedAt} IS NULL`,jn`${x.dismissedAt} IS NULL`,jn`${x.declinedAt} IS NULL`,mt(x.isStale,!1),mt(g.archived,!1),jn`${g.type} NOT IN ('hook','mcp','subagent')`,jn`NOT EXISTS (
258
177
  SELECT 1 FROM instruction_experiments e
259
178
  WHERE e.instruction_id = ${x.instructionId}
260
179
  AND e.project_path = ${x.projectPath}
261
180
  AND e.status = 'running'
262
- )`)).orderBy(yI(x.score)).limit(50),i=[],a=[];for(let c of s){if(i.length>=Math.min(o,_I))break;let l=hi(c.content??"");if(l.length>0){a.push({name:c.name,reason:`unfilled placeholder(s): ${l.map(p=>p.token).join(", ")}`});continue}i.push({id:c.id,instructionId:c.instructionId,name:c.name,score:c.score})}return e.json({candidates:i,refused:a,running:r,slots:o,limits:{maxConcurrent:hI,maxPerRun:_I}})});var IN=Of.object({projectPath:Of.string().min(1),instructionId:Of.string().uuid()});yi.post("/instruction-suggestions/undo",async e=>{let t=e.get("userId"),n=IN.safeParse(await e.req.json().catch(()=>({})));if(!n.success)return e.json({error:n.error.flatten()},400);let{projectPath:r,instructionId:o}=n.data,[s]=await u.select({id:x.id,name:g.name,acceptedAt:x.acceptedAt}).from(x).innerJoin(g,mt(g.id,x.instructionId)).where(Sc(mt(x.userId,t),mt(x.projectPath,r),mt(x.instructionId,o))).limit(1);return s?(await u.update(x).set({acceptedAt:null,dismissedAt:new Date}).where(mt(x.id,s.id)),await u.insert(tt).values({suggestionId:s.id,userId:t,eventType:"dismissed",projectPath:r,actor:"human"}),e.json({id:s.id,name:s.name,wasAccepted:s.acceptedAt!=null})):e.json({error:"No suggestion for that instruction on this project"},404)});O();import{Hono as jN}from"hono";import{eq as Wt,and as ps,asc as bI,desc as SI,inArray as Yu,sql as ur}from"drizzle-orm";O();import{createHash as bN}from"node:crypto";import{and as wI,eq as Ju,inArray as SN,sql as MK}from"drizzle-orm";function AN(e,t,n){return bN("sha256").update(`${e}:${t}`).digest().readUIntBE(0,6)/0xffffffffffff<n?"treated":"control"}d(AN,"assignArm");async function vI(e){let{userId:t,projectPath:n,externalSessionId:r}=e;if(!r)return[];let o=await u.select({id:q.id,instructionId:q.instructionId,treatedShare:q.treatedShare,salt:q.salt}).from(q).where(wI(Ju(q.userId,t),Ju(q.projectPath,n),Ju(q.status,"running")));if(o.length===0)return[];await u.insert(Or).values(o.map(a=>({experimentId:a.id,userId:t,externalSessionId:r,arm:AN(a.salt,r,Number(a.treatedShare))}))).onConflictDoNothing();let s=await u.select({experimentId:Or.experimentId,arm:Or.arm}).from(Or).where(wI(Ju(Or.externalSessionId,r),SN(Or.experimentId,o.map(a=>a.id)))),i=new Map(s.map(a=>[a.experimentId,a.arm]));return o.flatMap(a=>{let c=i.get(a.id);return c?[{experimentId:a.id,instructionId:a.instructionId,arm:c}]:[]})}d(vI,"resolveArmsForSession");function II(e){return new Set(e.filter(t=>t.arm==="control").map(t=>t.instructionId))}d(II,"withheldInstructionIds");ls();O();import{sql as Df,eq as EN}from"drizzle-orm";var wi=.7;async function Gu(e){try{let[t]=await u.select({t:T.suggestionConfidenceThreshold}).from(T).where(EN(T.id,e)).limit(1);return typeof t?.t=="number"?t.t:wi}catch{return wi}}d(Gu,"readConfidenceThreshold");var xN=5,TN=90,RN="surface_budget",Mf="declined_by_silence",kN=Df`(
181
+ )`)).orderBy(iv(x.score)).limit(50),i=[],c=[];for(let a of s){if(i.length>=Math.min(o,sv))break;let l=gi(a.content??"");if(l.length>0){c.push({name:a.name,reason:`unfilled placeholder(s): ${l.map(m=>m.token).join(", ")}`});continue}i.push({id:a.id,instructionId:a.instructionId,name:a.name,score:a.score})}return e.json({candidates:i,refused:c,running:r,slots:o,limits:{maxConcurrent:ov,maxPerRun:sv}})});var Tk=jf.object({projectPath:jf.string().min(1),instructionId:jf.string().uuid()});_i.post("/instruction-suggestions/undo",async e=>{let t=e.get("userId"),n=Tk.safeParse(await e.req.json().catch(()=>({})));if(!n.success)return e.json({error:n.error.flatten()},400);let{projectPath:r,instructionId:o}=n.data,[s]=await d.select({id:x.id,name:g.name,acceptedAt:x.acceptedAt}).from(x).innerJoin(g,mt(g.id,x.instructionId)).where(bc(mt(x.userId,t),mt(x.projectPath,r),mt(x.instructionId,o))).limit(1);return s?(await d.update(x).set({acceptedAt:null,dismissedAt:new Date}).where(mt(x.id,s.id)),await d.insert(Je).values({suggestionId:s.id,userId:t,eventType:"dismissed",projectPath:r,actor:"human"}),e.json({id:s.id,name:s.name,wasAccepted:s.acceptedAt!=null})):e.json({error:"No suggestion for that instruction on this project"},404)});C();import{Hono as Lk}from"hono";import{eq as Bt,and as ms,asc as dv,desc as lv,inArray as Gd,sql as dr}from"drizzle-orm";C();import{createHash as Rk}from"node:crypto";import{and as av,eq as Vd,inArray as kk,sql as jV}from"drizzle-orm";function Nk(e,t,n){return Rk("sha256").update(`${e}:${t}`).digest().readUIntBE(0,6)/0xffffffffffff<n?"treated":"control"}u(Nk,"assignArm");async function cv(e){let{userId:t,projectPath:n,externalSessionId:r}=e;if(!r)return[];let o=await d.select({id:U.id,instructionId:U.instructionId,treatedShare:U.treatedShare,salt:U.salt}).from(U).where(av(Vd(U.userId,t),Vd(U.projectPath,n),Vd(U.status,"running")));if(o.length===0)return[];await d.insert(Or).values(o.map(c=>({experimentId:c.id,userId:t,externalSessionId:r,arm:Nk(c.salt,r,Number(c.treatedShare))}))).onConflictDoNothing();let s=await d.select({experimentId:Or.experimentId,arm:Or.arm}).from(Or).where(av(Vd(Or.externalSessionId,r),kk(Or.experimentId,o.map(c=>c.id)))),i=new Map(s.map(c=>[c.experimentId,c.arm]));return o.flatMap(c=>{let a=i.get(c.id);return a?[{experimentId:c.id,instructionId:c.instructionId,arm:a}]:[]})}u(cv,"resolveArmsForSession");function uv(e){return new Set(e.filter(t=>t.arm==="control").map(t=>t.instructionId))}u(uv,"withheldInstructionIds");ds();C();import{sql as Pf,eq as jk}from"drizzle-orm";var yi=.7;async function Jd(e){try{let[t]=await d.select({t:T.suggestionConfidenceThreshold}).from(T).where(jk(T.id,e)).limit(1);return typeof t?.t=="number"?t.t:yi}catch{return yi}}u(Jd,"readConfidenceThreshold");var Pk=5,Dk=90,Ok="surface_budget",Df="declined_by_silence",Ck=Pf`(
263
182
  SELECT count(*) FROM (
264
183
  SELECT date_trunc('hour', min(e.created_at)) AS h
265
184
  FROM instruction_suggestion_events e
@@ -274,7 +193,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
274
193
  AND e.event_type IN ('surfaced', 'surfaced_with_content')
275
194
  AND e.session_id IS NULL
276
195
  ) hours
277
- )`,Ac=Df`(${x.declinedAt} IS NULL OR ${x.declinedAt} < now() - make_interval(days => ${TN}))`;async function Ku(e,t){await u.execute(Df`
196
+ )`,Sc=Pf`(${x.declinedAt} IS NULL OR ${x.declinedAt} < now() - make_interval(days => ${Dk}))`;async function Kd(e,t){await d.execute(Pf`
278
197
  WITH over_budget AS (
279
198
  SELECT instruction_suggestions.id
280
199
  FROM instruction_suggestions
@@ -290,12 +209,12 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
290
209
  AND instruction_suggestions.accepted_at IS NULL
291
210
  AND (instruction_suggestions.dismissed_at IS NULL
292
211
  OR instruction_suggestions.dismissed_at < now() - interval '30 days')
293
- AND ${kN} >= ${xN}
212
+ AND ${Ck} >= ${Pk}
294
213
  ),
295
214
  stamped AS (
296
215
  UPDATE instruction_suggestions t
297
216
  SET declined_at = now(),
298
- declined_reason = ${RN}
217
+ declined_reason = ${Ok}
299
218
  FROM over_budget o
300
219
  -- Re-checked here, not only in the CTE: under READ COMMITTED two
301
220
  -- concurrent session starts both see declined_at IS NULL, and only
@@ -305,8 +224,8 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
305
224
  RETURNING t.id, t.user_id, t.project_path
306
225
  )
307
226
  INSERT INTO instruction_suggestion_events (suggestion_id, user_id, event_type, project_path)
308
- SELECT id, user_id, ${Mf}, project_path FROM stamped
309
- `)}d(Ku,"sweepDeclinedBySilence");var $f=new jN,AI=2e3,NN=4,PN={"session-start":{add:3,remove:2,trim:1}},CN=["add","remove","trim"];function Lf(e){return e.length<=AI?e:e.slice(0,AI)+"... [truncated]"}d(Lf,"truncateContent");$f.get("/instruction-suggestions",async e=>{let t=e.get("userId"),n=e.req.query("projectId"),r=e.req.query("projectPath"),o=Number(e.req.query("limit")??"5"),s=Math.min(Math.max(o,1),10),i=e.req.query("includeContent")==="true",a=e.req.query("groupByKind")==="true",c=e.req.query("renderFor"),l=c?PN[c]:void 0;if(c&&!l)return e.json({error:`unknown renderFor: ${c}`},400);let p=a||l!==void 0;if(!n&&!r)return e.json({error:"projectId or projectPath is required"},400);let m=n?Wt(x.projectId,n):Wt(x.projectPath,r);try{await Ku(t,ur`${m}`)}catch{}let y=await u.select({id:x.id,instructionId:x.instructionId,score:x.score,reason:x.reason,generatedAt:x.generatedAt,isStale:x.isStale,kind:x.kind,name:g.name,description:g.description,tags:g.tags,instructionScope:g.scope,estimatedTokens:ur`(length(${g.content}) / 4)::int`,_rawContent:g.content}).from(x).innerJoin(g,Wt(x.instructionId,g.id)).where(ps(Wt(x.userId,t),m,Wt(g.archived,!1),ur`${x.acceptedAt} IS NULL`,ur`(${x.dismissedAt} IS NULL OR ${x.dismissedAt} < now() - interval '30 days')`,Ac)).orderBy(bI(x.isStale),SI(x.score)).limit(s),v=[];if(p){let ee=new Set(y.map(N=>N.id));v=(await u.select({id:x.id,instructionId:x.instructionId,score:x.score,reason:x.reason,generatedAt:x.generatedAt,isStale:x.isStale,kind:x.kind,name:g.name,description:g.description,tags:g.tags,instructionScope:g.scope,estimatedTokens:ur`(length(${g.content}) / 4)::int`,_rawContent:g.content}).from(x).innerJoin(g,Wt(x.instructionId,g.id)).where(ps(Wt(x.userId,t),m,ur`${x.kind} <> 'add'`,Wt(g.archived,!1),ur`${x.acceptedAt} IS NULL`,ur`(${x.dismissedAt} IS NULL OR ${x.dismissedAt} < now() - interval '30 days')`,Ac)).orderBy(bI(x.isStale),SI(x.score)).limit(NN)).filter(N=>!ee.has(N.id))}let h=i?await Gu(t):wi,f=[...y,...v].map(ee=>{let{_rawContent:Re,...N}=ee,me=i&&ee.kind==="add"&&ee.score>=h&&typeof Re=="string"?Lf(Re):null;return{...N,content:me}}),w=l?await vI({userId:t,projectPath:r??"",externalSessionId:e.req.query("sessionId")||void 0}):[],b=II(w),I=l?await Pf(t,r??""):[],S=new Set(I.filter(ee=>ee.decision==="never").map(ee=>ee.instructionId)),A=I.filter(ee=>ee.decision==="always"),E=new Set(I.map(ee=>ee.instructionId)),R=w.filter(ee=>ee.arm==="treated"),D=new Set(w.map(ee=>ee.instructionId)),j=b.size===0&&E.size===0&&D.size===0?f:f.filter(ee=>!b.has(ee.instructionId)&&!E.has(ee.instructionId)&&!D.has(ee.instructionId)),P=j,$;if(l){let ee=new Map;for(let N of j){let me=N.kind??"add",M=l[me];if(M===void 0||M<=0)continue;let ue=ee.get(me)??[];ue.length>=M||(ue.push(N),ee.set(me,ue))}let Re=ee.get("add")??[];if(R.length>0){let N=new Map(R.map(M=>[M.instructionId,M.experimentId])),me=await u.select({id:g.id,name:g.name,description:g.description,tags:g.tags,instructionScope:g.scope,content:g.content}).from(g).where(ps(Yu(g.id,R.map(M=>M.instructionId)),Wt(g.archived,!1)));for(let M of me.reverse())Re.unshift({id:`experiment:${N.get(M.id)}`,instructionId:M.id,score:1,reason:"under measurement on this project",generatedAt:new Date,isStale:!1,kind:"add",name:M.name,description:M.description,tags:M.tags,instructionScope:M.instructionScope,estimatedTokens:Math.ceil((M.content?.length??0)/4),content:i?Lf(M.content??""):null});ee.set("add",Re)}if(A.length>0){let N=await u.select({id:g.id,name:g.name,description:g.description,tags:g.tags,instructionScope:g.scope,content:g.content}).from(g).where(ps(Yu(g.id,A.map(me=>me.instructionId)),Wt(g.archived,!1)));for(let me of N.reverse())Re.unshift({id:`graduated:${me.id}`,instructionId:me.id,score:1,reason:"graduated: measured to help on this project",generatedAt:new Date,isStale:!1,kind:"add",name:me.name,description:me.description,tags:me.tags,instructionScope:me.instructionScope,estimatedTokens:Math.ceil((me.content?.length??0)/4),content:i?Lf(me.content??""):null});ee.set("add",Re)}P=CN.flatMap(N=>ee.get(N)??[]),$={addCount:Re.length,costCount:(ee.get("remove")??[]).length+(ee.get("trim")??[]).length,highConfidenceCount:Re.filter(N=>N.content!==null).length,omitted:j.length-(P.length-Re.filter(N=>N.id.startsWith("graduated:")||N.id.startsWith("experiment:")).length),...b.size>0?{withheld:b.size}:{}}}let H=await u.select({eventType:tt.eventType,count:ur`count(*)::int`}).from(tt).innerJoin(x,Wt(tt.suggestionId,x.id)).where(ps(Wt(tt.userId,t),m)).groupBy(tt.eventType),B={};for(let ee of H)B[ee.eventType]=ee.count;let te,_e;if(!l&&r&&P.length>0){let ee=[...new Set(P.map(M=>M.instructionId))],Re=await u.select({id:q.id,instructionId:q.instructionId,source:q.source}).from(q).where(ps(Wt(q.userId,t),Wt(q.projectPath,r),Wt(q.status,"running"),Yu(q.instructionId,ee)));Re.length>0&&(te=Object.fromEntries(Re.map(M=>[M.instructionId,{id:M.id,source:M.source}])));let N=await u.select({instructionId:Y.instructionId,contentHash:Y.contentHash,projectPath:Y.projectPath,decision:Y.decision,delta:Y.delta,ciLower:Y.ciLower,ciUpper:Y.ciUpper,nTreated:Y.nTreated,nControl:Y.nControl,segment:Y.segment,decidedAt:Y.decidedAt,liveContent:g.content,liveName:g.name}).from(Y).innerJoin(g,Wt(Y.instructionId,g.id)).where(ps(Wt(Y.userId,t),Yu(Y.instructionId,ee),ur`${Y.projectPath} <> ${r}`)),me={};for(let M of N){let ue=Ur(M.liveContent,M.liveName);ue===null||ue!==M.contentHash||(me[M.instructionId]??=[]).push({projectPath:M.projectPath,decision:M.decision,delta:M.delta,ciLower:M.ciLower,ciUpper:M.ciUpper,nTreated:M.nTreated,nControl:M.nControl,segment:M.segment,decidedAt:M.decidedAt})}Object.keys(me).length>0&&(_e=me)}return e.json({suggestions:P,stats:B,...$?{render:$}:{},...te?{experiments:te}:{},..._e?{crossProject:_e}:{}})});O();import{Hono as ON}from"hono";import{z as EI}from"zod";import{eq as ms,and as xI,desc as DN,sql as dn}from"drizzle-orm";var MN=EI.object({threshold:EI.number().min(0).max(1)}),fs=new ON;fs.get("/instruction-suggestions/pending-count",async e=>{let t=e.get("userId"),n=await u.select({projectPath:x.projectPath,count:dn`count(*)::int`}).from(x).where(xI(ms(x.userId,t),dn`${x.acceptedAt} IS NULL`,dn`(${x.dismissedAt} IS NULL OR ${x.dismissedAt} < now() - interval '30 days')`,Ac)).groupBy(x.projectPath).orderBy(DN(dn`count(*)`)),r=n.reduce((o,s)=>o+s.count,0);return e.json({total:r,byProject:n.slice(0,5)})});fs.get("/instruction-suggestions/stats",async e=>{let t=e.get("userId"),[n]=await u.select({total:dn`count(*)::int`,accepted:dn`count(*) filter (where ${x.acceptedAt} is not null)::int`,dismissed:dn`count(*) filter (where ${x.acceptedAt} is null and ${x.dismissedAt} is not null)::int`,declinedBySilence:dn`count(*) filter (where ${x.acceptedAt} is null and ${x.dismissedAt} is null and ${x.declinedAt} is not null)::int`,pending:dn`count(*) filter (where ${x.acceptedAt} is null and ${x.dismissedAt} is null and ${x.declinedAt} is null)::int`,stale:dn`count(*) filter (where ${x.isStale})::int`,promoted:dn`count(*) filter (where ${x.promotedToInstructionId} is not null)::int`}).from(x).where(ms(x.userId,t)),r=await u.select({eventType:tt.eventType,count:dn`count(*)::int`}).from(tt).where(ms(tt.userId,t)).groupBy(tt.eventType),o={surfaced:0,surfaced_with_content:0,accepted:0,dismissed:0,promoted:0,proxy_injected:0,[Mf]:0};for(let c of r)o[c.eventType]=c.count;let[s]=await u.select({distinctUsersWithSuggestions:dn`count(distinct ${x.userId})::int`}).from(x),i=o.surfaced+o.surfaced_with_content,a=o.accepted+o.dismissed;return e.json({suggestions:n,events:o,funnel:{surfaced:i,acted:a,adoptionRate:i>0?a/i:0},denominator:{distinctUsersWithSuggestions:s?.distinctUsersWithSuggestions??0,scope:"global"}})});fs.get("/instruction-suggestions/confidence",async e=>{let t=e.get("userId");return e.json({threshold:await Gu(t),default:wi,governs:"Minimum score at which an add-suggestion carries its instruction body into session context. Surfacing only \u2014 never a write."})});fs.put("/instruction-suggestions/confidence",async e=>{let t=e.get("userId"),n=MN.safeParse(await e.req.json().catch(()=>null));return n.success?(await u.update(T).set({suggestionConfidenceThreshold:n.data.threshold}).where(ms(T.id,t)),e.json({threshold:n.data.threshold})):e.json({error:"threshold must be a number between 0 and 1"},400)});fs.get("/instruction-suggestions/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:x.id,instructionId:x.instructionId,projectPath:x.projectPath,score:x.score,reason:x.reason,generatedAt:x.generatedAt,isStale:x.isStale,kind:x.kind,estimatedTokens:dn`(length(${g.content}) / 4)::int`,dismissedAt:x.dismissedAt,acceptedAt:x.acceptedAt,name:g.name,description:g.description,tags:g.tags,instructionScope:g.scope}).from(x).innerJoin(g,ms(x.instructionId,g.id)).where(xI(ms(x.id,n),ms(x.userId,t)));return r?e.json(r):e.json({error:"Suggestion not found"},404)});O();import{Hono as LN}from"hono";import{z as Yt}from"zod";import{eq as lr,and as TI,or as $N,desc as qN,sql as vi}from"drizzle-orm";var Ec=new LN,UN=Yt.object({projectPath:Yt.string().min(1),projectId:Yt.string().uuid().optional(),suggestions:Yt.array(Yt.object({instructionId:Yt.string().uuid(),score:Yt.number().min(0).max(1),reason:Yt.string(),kind:Yt.enum(su).optional()})).max(50)});async function HN(e){try{let[t]=await u.select({projectId:le.projectId}).from(le).where(lr(le.path,e)).orderBy(qN(le.lastSeen)).limit(1);return t?.projectId??null}catch{return null}}d(HN,"resolveProjectId");Ec.post("/instruction-suggestions/batch-upsert",async e=>{let t=e.get("userId"),n=UN.parse(await e.req.json());if(n.suggestions.length===0)return e.json({inserted:0});let r=n.projectId??await HN(n.projectPath),o=n.suggestions.map(s=>({userId:t,instructionId:s.instructionId,projectPath:n.projectPath,projectId:r,score:s.score,reason:s.reason,kind:s.kind??"add",generatedAt:new Date,isStale:!1}));return await u.insert(x).values(o).onConflictDoUpdate({target:[x.userId,x.projectPath,x.instructionId,x.kind],set:{score:vi`excluded.score`,reason:vi`excluded.reason`,generatedAt:vi`excluded.generated_at`,isStale:vi`false`,dismissedAt:vi`CASE WHEN ${x.dismissedAt} IS NOT NULL AND ${x.dismissedAt} >= now() - interval '30 days' THEN ${x.dismissedAt} ELSE NULL END`}}),e.json({inserted:o.length})});Ec.post("/instruction-suggestions/mark-stale",async e=>{let t=e.get("userId");return await u.update(x).set({isStale:!0}).where(lr(x.userId,t)),e.json({ok:!0})});var BN=Yt.object({eventType:Yt.enum(["surfaced","surfaced_with_content","accepted","dismissed","promoted","proxy_injected"]),tool:Yt.string().optional(),sessionId:Yt.string().uuid().optional(),projectPath:Yt.string().min(1),instructionId:Yt.string().uuid().optional(),actor:Yt.enum(["human","auto"]).default("human")});Ec.post("/instruction-suggestions/:id/events",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=BN.parse(await e.req.json()),[o]=await u.select().from(x).where(TI(lr(x.id,n),lr(x.userId,t)));if(!o)return e.json({error:"Suggestion not found"},404);let s=r.eventType==="accepted"||r.eventType==="promoted",i=o.instructionId;if(s&&r.instructionId){let[a]=await u.select({id:g.id}).from(g).where(TI(lr(g.id,r.instructionId),$N(lr(g.createdBy,t),lr(g.scope,"public")))).limit(1);if(!a)return e.json({error:"instructionId not found",code:"INVALID_INSTRUCTION"},400);i=a.id}if(await u.insert(tt).values({suggestionId:n,userId:t,eventType:r.eventType,tool:r.tool??null,sessionId:r.sessionId??null,projectPath:r.projectPath,actor:r.actor}),s)await u.update(x).set({acceptedAt:new Date,promotedToInstructionId:i}).where(lr(x.id,n));else if(r.eventType==="dismissed")await u.update(x).set({dismissedAt:new Date}).where(lr(x.id,n));else if(r.eventType==="surfaced"||r.eventType==="surfaced_with_content")try{await Ku(t,vi`${lr(x.id,n)}`)}catch{}return e.json({ok:!0})});O();import{Hono as zN}from"hono";import{z as xc}from"zod";import{eq as Ii,and as kI,desc as jI,sql as Qu}from"drizzle-orm";ls();O();ls();import{randomUUID as FN}from"node:crypto";import{and as Xu,eq as bn,sql as qf}from"drizzle-orm";var WN=.8;async function RI(e){let{userId:t,instructionId:n,projectPath:r,source:o}=e,s=e.treatedShare??.5,[i]=await u.select({id:g.id,name:g.name,content:g.content,archived:g.archived,scope:g.scope,createdBy:g.createdBy}).from(g).where(bn(g.id,n));if(!i||i.createdBy!==t&&i.scope!=="public")return{ok:!1,code:"not_found",reason:"instruction not found"};if(i.archived)return{ok:!1,code:"archived",reason:"instruction is archived"};let a=Ur(i.content,i.name);if(!a)return{ok:!1,code:"no_body",reason:"instruction body could not be extracted from its content"};let[c]=await u.select({id:Y.id}).from(Y).where(Xu(bn(Y.instructionId,n),bn(Y.contentHash,a),bn(Y.projectPath,r)));if(c)return{ok:!1,code:"already_decided",reason:"this exact content already has a verdict on this project \u2014 edit the instruction to re-enter testing"};if(o==="groom"){let[p]=await u.select({id:x.id}).from(x).where(Xu(bn(x.userId,t),bn(x.instructionId,n),bn(x.projectPath,r),qf`${x.acceptedAt} IS NULL`,qf`${x.dismissedAt} IS NULL`,qf`${x.score} >= ${WN}`));if(!p)return{ok:!1,code:"not_injectable",reason:"not delivered by injection on this project (accepted into a file, or no renderable proposal) \u2014 withholding would measure nothing"}}let[l]=await u.select({id:q.id}).from(q).where(Xu(bn(q.instructionId,n),bn(q.projectPath,r),bn(q.status,"running")));if(l)return{ok:!0,experimentId:l.id,existing:!0};try{let[p]=await u.insert(q).values({userId:t,instructionId:n,projectPath:r,status:"running",treatedShare:String(s),salt:FN(),contentHash:a,source:o}).returning({id:q.id});return{ok:!0,experimentId:p.id,existing:!1}}catch(p){let[m]=await u.select({id:q.id}).from(q).where(Xu(bn(q.instructionId,n),bn(q.projectPath,r),bn(q.status,"running")));if(m)return{ok:!0,experimentId:m.id,existing:!0};throw p}}d(RI,"nominateExperiment");var bi=new zN;bi.get("/instruction-experiments",async e=>{let t=e.get("userId"),n=e.req.query("projectPath"),r=Math.min(Math.max(Number(e.req.query("limit"))||50,1),200),o=kI(Ii(q.userId,t),n?Ii(q.projectPath,n):Qu`true`),s=await u.select({id:q.id,instructionId:q.instructionId,instructionName:g.name,projectPath:q.projectPath,status:q.status,source:q.source,instructionSource:Qu`${g.frontmatter}->>'source'`,stoppedReason:q.stoppedReason,createdAt:q.createdAt}).from(q).innerJoin(g,Ii(q.instructionId,g.id)).where(o).orderBy(jI(q.createdAt)).limit(r),[{total:i}]=await u.select({total:Qu`count(*)::int`}).from(q).where(o),a=await Promise.all(s.map(async l=>{let p=await bc(l.id,t),m=l.status,y=l.stoppedReason;if(p&&l.status==="running")try{let v=await gi({experimentId:l.id,userId:t,verdict:p,source:l.source,status:l.status});v&&(m="stopped",y=v)}catch{}return{...l,status:m,stoppedReason:y,verdict:p}})),c=await zu(a.map(l=>l.id));return e.json({experiments:a.map(l=>({...l,graduation:c.get(l.id)??null})),total:i})});var VN=xc.object({instructionId:xc.string().uuid(),projectPath:xc.string().min(1),source:xc.enum(["manual","groom","trial","borrow"]).default("manual"),treatedShare:xc.number().gt(0).lt(1).optional()});bi.post("/instruction-experiments",async e=>{let t=e.get("userId"),n=VN.safeParse(await e.req.json().catch(()=>({})));if(!n.success)return e.json({error:n.error.flatten()},400);let r=await RI({userId:t,...n.data});if(!r.ok){let o={not_found:404,archived:400,no_body:400,already_decided:409,not_injectable:409};return e.json({error:r.reason,code:r.code},o[r.code])}return e.json({experimentId:r.experimentId,existing:r.existing},r.existing?200:201)});bi.get("/instruction-experiments/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await bc(n,t);if(!r)return e.json({error:"not found"},404);try{let[s]=await u.select({source:q.source,status:q.status}).from(q).where(Ii(q.id,n));s&&await gi({experimentId:n,userId:t,verdict:r,source:s.source,status:s.status})}catch{}let o=await zu([n]);return e.json({verdict:r,graduation:o.get(n)??null})});bi.get("/instruction-verdicts",async e=>{let t=e.get("userId"),n=e.req.query("instructionId"),r=await u.select({id:Y.id,instructionId:Y.instructionId,contentHash:Y.contentHash,projectPath:Y.projectPath,decision:Y.decision,delta:Y.delta,ciLower:Y.ciLower,ciUpper:Y.ciUpper,nTreated:Y.nTreated,nControl:Y.nControl,decidedAt:Y.decidedAt}).from(Y).where(kI(Ii(Y.userId,t),n?Ii(Y.instructionId,n):Qu`true`)).orderBy(jI(Y.decidedAt)).limit(50);return e.json({verdicts:r,total:r.length})});var ho=new JN;ho.route("/",yi);ho.route("/",$f);ho.route("/",fs);ho.route("/",Ec);ho.route("/",bi);import{Hono as iO}from"hono";import{Hono as MC}from"hono";O();import{Hono as nP}from"hono";import{z as jn}from"zod";import{eq as Lt,and as xi,desc as $I,sql as pr,or as qI,gte as rP,ne as oP}from"drizzle-orm";function NI(e){if(!e||typeof e!="string")return null;let t=e.trim();if(!t)return null;if(!t.includes("://")&&!/^([\w.-]+@)?[\w.-]+:[^/]/.test(t)&&/^[\w.-]+(\.[\w.-]+)+\//.test(t)){let a=t.replace(/\.git$/i,"").replace(/\/+$/,""),c=a.indexOf("/"),l=a.slice(0,c).toLowerCase(),p=a.slice(c+1);return p?`${l}/${p}`:null}let n=t,r=/^([\w.-]+@)?([\w.-]+):([^/].*)$/.exec(t);if(r&&!t.includes("://")){let[,,a,c]=r;n=`ssh://${a}/${c}`}let o;try{o=new URL(n)}catch{return null}let s=o.hostname.toLowerCase();if(!s)return null;let i=o.pathname.replace(/^\/+|\/+$/g,"");return!i||(i=i.replace(/\.git$/i,""),!i)?null:`${s}/${i}`}d(NI,"canonicalizeRemote");var GN=new Set(["","unknown","<synthetic>"]);function gs(e){if(typeof e!="string")return null;let t=e.trim();return GN.has(t)?null:t}d(gs,"resolveModelId");var KN=["claudeCodeVersion","codexCliVersion"];function Si(e){if(typeof e!="object"||e===null)return null;let t=e;for(let n of KN){let r=gs(t[n]);if(r!==null)return r}return null}d(Si,"resolveHarnessVersion");O();import{eq as Uf,and as QN,sql as LI}from"drizzle-orm";O();import{randomUUID as Ai}from"node:crypto";import{eq as Mt,and as Tc,gt as YN,sql as PI}from"drizzle-orm";var XN=6e4;async function Ei(e){try{let t=new Date(Date.now()-XN),[n]=await u.select({exists:PI`1`}).from(fe).where(Tc(Mt(fe.userId,e),Mt(fe.workerType,"cli-worker"),YN(fe.lastHeartbeat,t))).limit(1);return n!==void 0}catch(t){return console.warn("[enqueueJob] hasLiveWorker check failed; skipping warning:",t instanceof Error?t.message:t),!0}}d(Ei,"hasLiveWorker");async function Rt(e){let t=!await Ei(e.userId),n=Ai(),r={...e.payload,mirrorId:n};switch(e.taskName){case"process_eval":case"process_conversation":{await u.insert(ke).values({...e.mirror,id:n,status:"pending",taskKind:e.taskName,payload:r});break}case"process_insights":{await u.insert(W).values({...e.mirror,id:n,status:"pending",taskKind:e.taskName,payload:r});break}case"process_launch":{await u.insert(ce).values({...e.mirror,id:n,status:"pending",taskKind:e.taskName,payload:r,...e.runId?{runId:e.runId}:{}});break}case"process_send_message":{await u.insert(Wd).values({...e.mirror,id:n,status:"pending",taskKind:e.taskName,payload:r});break}}return{id:n,noLiveWorker:t}}d(Rt,"enqueueJob");async function Zu(e){let t=`goal-${e.sessionId}-${e.milestone}`,[n]=await u.select({id:je.id}).from(je).where(Tc(Mt(je.userId,e.userId),Mt(je.taskKind,"process_session_goal"),Mt(je.dedupeKey,t),Mt(je.status,"pending"))).limit(1);if(n)return;let r=Ai();await u.insert(je).values({id:r,userId:e.userId,taskKind:"process_session_goal",payload:{sessionId:e.sessionId,milestone:e.milestone,mirrorId:r},dedupeKey:t})}d(Zu,"enqueueSessionGoalJob");async function CI(e){let t=`distill-${e.sessionId}`,[n]=await u.select({id:je.id}).from(je).where(Tc(Mt(je.userId,e.userId),Mt(je.taskKind,"distill_memories"),Mt(je.dedupeKey,t),Mt(je.status,"pending"))).limit(1);if(n)return;let r=Ai();await u.insert(je).values({id:r,userId:e.userId,taskKind:"distill_memories",payload:{sessionId:e.sessionId,mirrorId:r},dedupeKey:t})}d(CI,"enqueueDistillMemoriesJob");async function OI(e){let t=!await Ei(e.userId),n=`run-cleanup:${e.runId}`,[r]=await u.select({id:je.id}).from(je).where(Tc(Mt(je.userId,e.userId),Mt(je.taskKind,"process_run_cleanup"),Mt(je.dedupeKey,n),Mt(je.status,"pending"))).limit(1);if(r)return{jobId:r.id,noLiveWorker:t};let o=Ai();return await u.insert(je).values({id:o,userId:e.userId,taskKind:"process_run_cleanup",payload:{runId:e.runId,mirrorId:o},dedupeKey:n}),{jobId:o,noLiveWorker:t}}d(OI,"enqueueRunCleanupJob");async function DI(e){let t=`judge-review:${e.evalTargetId}`,n=Ai();await u.execute(PI`
227
+ SELECT id, user_id, ${Df}, project_path FROM stamped
228
+ `)}u(Kd,"sweepDeclinedBySilence");var Cf=new Lk,mv=2e3,Mk=4,$k={"session-start":{add:3,remove:2,trim:1}},qk=["add","remove","trim"];function Of(e){return e.length<=mv?e:e.slice(0,mv)+"... [truncated]"}u(Of,"truncateContent");Cf.get("/instruction-suggestions",async e=>{let t=e.get("userId"),n=e.req.query("projectId"),r=e.req.query("projectPath"),o=Number(e.req.query("limit")??"5"),s=Math.min(Math.max(o,1),10),i=e.req.query("includeContent")==="true",c=e.req.query("groupByKind")==="true",a=e.req.query("renderFor"),l=a?$k[a]:void 0;if(a&&!l)return e.json({error:`unknown renderFor: ${a}`},400);let m=c||l!==void 0;if(!n&&!r)return e.json({error:"projectId or projectPath is required"},400);let p=n?Bt(x.projectId,n):Bt(x.projectPath,r);try{await Kd(t,dr`${p}`)}catch{}let _=await d.select({id:x.id,instructionId:x.instructionId,score:x.score,reason:x.reason,generatedAt:x.generatedAt,isStale:x.isStale,kind:x.kind,name:g.name,description:g.description,tags:g.tags,instructionScope:g.scope,estimatedTokens:dr`(length(${g.content}) / 4)::int`,_rawContent:g.content}).from(x).innerJoin(g,Bt(x.instructionId,g.id)).where(ms(Bt(x.userId,t),p,Bt(g.archived,!1),dr`${x.acceptedAt} IS NULL`,dr`(${x.dismissedAt} IS NULL OR ${x.dismissedAt} < now() - interval '30 days')`,Sc)).orderBy(dv(x.isStale),lv(x.score)).limit(s),I=[];if(m){let te=new Set(_.map(j=>j.id));I=(await d.select({id:x.id,instructionId:x.instructionId,score:x.score,reason:x.reason,generatedAt:x.generatedAt,isStale:x.isStale,kind:x.kind,name:g.name,description:g.description,tags:g.tags,instructionScope:g.scope,estimatedTokens:dr`(length(${g.content}) / 4)::int`,_rawContent:g.content}).from(x).innerJoin(g,Bt(x.instructionId,g.id)).where(ms(Bt(x.userId,t),p,dr`${x.kind} <> 'add'`,Bt(g.archived,!1),dr`${x.acceptedAt} IS NULL`,dr`(${x.dismissedAt} IS NULL OR ${x.dismissedAt} < now() - interval '30 days')`,Sc)).orderBy(dv(x.isStale),lv(x.score)).limit(Mk)).filter(j=>!te.has(j.id))}let h=i?await Jd(t):yi,f=[..._,...I].map(te=>{let{_rawContent:Te,...j}=te,me=i&&te.kind==="add"&&te.score>=h&&typeof Te=="string"?Of(Te):null;return{...j,content:me}}),w=l?await cv({userId:t,projectPath:r??"",externalSessionId:e.req.query("sessionId")||void 0}):[],b=uv(w),v=l?await Rf(t,r??""):[],S=new Set(v.filter(te=>te.decision==="never").map(te=>te.instructionId)),A=v.filter(te=>te.decision==="always"),E=new Set(v.map(te=>te.instructionId)),R=w.filter(te=>te.arm==="treated"),P=new Set(w.map(te=>te.instructionId)),N=b.size===0&&E.size===0&&P.size===0?f:f.filter(te=>!b.has(te.instructionId)&&!E.has(te.instructionId)&&!P.has(te.instructionId)),D=N,q;if(l){let te=new Map;for(let j of N){let me=j.kind??"add",L=l[me];if(L===void 0||L<=0)continue;let ue=te.get(me)??[];ue.length>=L||(ue.push(j),te.set(me,ue))}let Te=te.get("add")??[];if(R.length>0){let j=new Map(R.map(L=>[L.instructionId,L.experimentId])),me=await d.select({id:g.id,name:g.name,description:g.description,tags:g.tags,instructionScope:g.scope,content:g.content}).from(g).where(ms(Gd(g.id,R.map(L=>L.instructionId)),Bt(g.archived,!1)));for(let L of me.reverse())Te.unshift({id:`experiment:${j.get(L.id)}`,instructionId:L.id,score:1,reason:"under measurement on this project",generatedAt:new Date,isStale:!1,kind:"add",name:L.name,description:L.description,tags:L.tags,instructionScope:L.instructionScope,estimatedTokens:Math.ceil((L.content?.length??0)/4),content:i?Of(L.content??""):null});te.set("add",Te)}if(A.length>0){let j=await d.select({id:g.id,name:g.name,description:g.description,tags:g.tags,instructionScope:g.scope,content:g.content}).from(g).where(ms(Gd(g.id,A.map(me=>me.instructionId)),Bt(g.archived,!1)));for(let me of j.reverse())Te.unshift({id:`graduated:${me.id}`,instructionId:me.id,score:1,reason:"graduated: measured to help on this project",generatedAt:new Date,isStale:!1,kind:"add",name:me.name,description:me.description,tags:me.tags,instructionScope:me.instructionScope,estimatedTokens:Math.ceil((me.content?.length??0)/4),content:i?Of(me.content??""):null});te.set("add",Te)}D=qk.flatMap(j=>te.get(j)??[]),q={addCount:Te.length,costCount:(te.get("remove")??[]).length+(te.get("trim")??[]).length,highConfidenceCount:Te.filter(j=>j.content!==null).length,omitted:N.length-(D.length-Te.filter(j=>j.id.startsWith("graduated:")||j.id.startsWith("experiment:")).length),...b.size>0?{withheld:b.size}:{}}}let H=await d.select({eventType:Je.eventType,count:dr`count(*)::int`}).from(Je).innerJoin(x,Bt(Je.suggestionId,x.id)).where(ms(Bt(Je.userId,t),p)).groupBy(Je.eventType),B={};for(let te of H)B[te.eventType]=te.count;let ee,he;if(!l&&r&&D.length>0){let te=[...new Set(D.map(L=>L.instructionId))],Te=await d.select({id:U.id,instructionId:U.instructionId,source:U.source}).from(U).where(ms(Bt(U.userId,t),Bt(U.projectPath,r),Bt(U.status,"running"),Gd(U.instructionId,te)));Te.length>0&&(ee=Object.fromEntries(Te.map(L=>[L.instructionId,{id:L.id,source:L.source}])));let j=await d.select({instructionId:Y.instructionId,contentHash:Y.contentHash,projectPath:Y.projectPath,decision:Y.decision,delta:Y.delta,ciLower:Y.ciLower,ciUpper:Y.ciUpper,nTreated:Y.nTreated,nControl:Y.nControl,segment:Y.segment,decidedAt:Y.decidedAt,liveContent:g.content,liveName:g.name}).from(Y).innerJoin(g,Bt(Y.instructionId,g.id)).where(ms(Bt(Y.userId,t),Gd(Y.instructionId,te),dr`${Y.projectPath} <> ${r}`)),me={};for(let L of j){let ue=qr(L.liveContent,L.liveName);ue===null||ue!==L.contentHash||(me[L.instructionId]??=[]).push({projectPath:L.projectPath,decision:L.decision,delta:L.delta,ciLower:L.ciLower,ciUpper:L.ciUpper,nTreated:L.nTreated,nControl:L.nControl,segment:L.segment,decidedAt:L.decidedAt})}Object.keys(me).length>0&&(he=me)}return e.json({suggestions:D,stats:B,...q?{render:q}:{},...ee?{experiments:ee}:{},...he?{crossProject:he}:{}})});C();import{Hono as Uk}from"hono";import{z as pv}from"zod";import{eq as ps,and as fv,desc as Hk,sql as un}from"drizzle-orm";var Bk=pv.object({threshold:pv.number().min(0).max(1)}),fs=new Uk;fs.get("/instruction-suggestions/pending-count",async e=>{let t=e.get("userId"),n=await d.select({projectPath:x.projectPath,count:un`count(*)::int`}).from(x).where(fv(ps(x.userId,t),un`${x.acceptedAt} IS NULL`,un`(${x.dismissedAt} IS NULL OR ${x.dismissedAt} < now() - interval '30 days')`,Sc)).groupBy(x.projectPath).orderBy(Hk(un`count(*)`)),r=n.reduce((o,s)=>o+s.count,0);return e.json({total:r,byProject:n.slice(0,5)})});fs.get("/instruction-suggestions/stats",async e=>{let t=e.get("userId"),[n]=await d.select({total:un`count(*)::int`,accepted:un`count(*) filter (where ${x.acceptedAt} is not null)::int`,dismissed:un`count(*) filter (where ${x.acceptedAt} is null and ${x.dismissedAt} is not null)::int`,declinedBySilence:un`count(*) filter (where ${x.acceptedAt} is null and ${x.dismissedAt} is null and ${x.declinedAt} is not null)::int`,pending:un`count(*) filter (where ${x.acceptedAt} is null and ${x.dismissedAt} is null and ${x.declinedAt} is null)::int`,stale:un`count(*) filter (where ${x.isStale})::int`,promoted:un`count(*) filter (where ${x.promotedToInstructionId} is not null)::int`}).from(x).where(ps(x.userId,t)),r=await d.select({eventType:Je.eventType,count:un`count(*)::int`}).from(Je).where(ps(Je.userId,t)).groupBy(Je.eventType),o={surfaced:0,surfaced_with_content:0,accepted:0,dismissed:0,promoted:0,proxy_injected:0,[Df]:0};for(let a of r)o[a.eventType]=a.count;let[s]=await d.select({distinctUsersWithSuggestions:un`count(distinct ${x.userId})::int`}).from(x),i=o.surfaced+o.surfaced_with_content,c=o.accepted+o.dismissed;return e.json({suggestions:n,events:o,funnel:{surfaced:i,acted:c,adoptionRate:i>0?c/i:0},denominator:{distinctUsersWithSuggestions:s?.distinctUsersWithSuggestions??0,scope:"global"}})});fs.get("/instruction-suggestions/confidence",async e=>{let t=e.get("userId");return e.json({threshold:await Jd(t),default:yi,governs:"Minimum score at which an add-suggestion carries its instruction body into session context. Surfacing only \u2014 never a write."})});fs.put("/instruction-suggestions/confidence",async e=>{let t=e.get("userId"),n=Bk.safeParse(await e.req.json().catch(()=>null));return n.success?(await d.update(T).set({suggestionConfidenceThreshold:n.data.threshold}).where(ps(T.id,t)),e.json({threshold:n.data.threshold})):e.json({error:"threshold must be a number between 0 and 1"},400)});fs.get("/instruction-suggestions/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select({id:x.id,instructionId:x.instructionId,projectPath:x.projectPath,score:x.score,reason:x.reason,generatedAt:x.generatedAt,isStale:x.isStale,kind:x.kind,estimatedTokens:un`(length(${g.content}) / 4)::int`,dismissedAt:x.dismissedAt,acceptedAt:x.acceptedAt,name:g.name,description:g.description,tags:g.tags,instructionScope:g.scope}).from(x).innerJoin(g,ps(x.instructionId,g.id)).where(fv(ps(x.id,n),ps(x.userId,t)));return r?e.json(r):e.json({error:"Suggestion not found"},404)});C();import{Hono as Fk}from"hono";import{z as Yt}from"zod";import{eq as lr,and as gv,or as Wk,desc as zk,sql as wi}from"drizzle-orm";var Ac=new Fk,Vk=Yt.object({projectPath:Yt.string().min(1),projectId:Yt.string().uuid().optional(),suggestions:Yt.array(Yt.object({instructionId:Yt.string().uuid(),score:Yt.number().min(0).max(1),reason:Yt.string(),kind:Yt.enum(id).optional()})).max(50)});async function Jk(e){try{let[t]=await d.select({projectId:de.projectId}).from(de).where(lr(de.path,e)).orderBy(zk(de.lastSeen)).limit(1);return t?.projectId??null}catch{return null}}u(Jk,"resolveProjectId");Ac.post("/instruction-suggestions/batch-upsert",async e=>{let t=e.get("userId"),n=Vk.parse(await e.req.json());if(n.suggestions.length===0)return e.json({inserted:0});let r=n.projectId??await Jk(n.projectPath),o=n.suggestions.map(s=>({userId:t,instructionId:s.instructionId,projectPath:n.projectPath,projectId:r,score:s.score,reason:s.reason,kind:s.kind??"add",generatedAt:new Date,isStale:!1}));return await d.insert(x).values(o).onConflictDoUpdate({target:[x.userId,x.projectPath,x.instructionId,x.kind],set:{score:wi`excluded.score`,reason:wi`excluded.reason`,generatedAt:wi`excluded.generated_at`,isStale:wi`false`,dismissedAt:wi`CASE WHEN ${x.dismissedAt} IS NOT NULL AND ${x.dismissedAt} >= now() - interval '30 days' THEN ${x.dismissedAt} ELSE NULL END`}}),e.json({inserted:o.length})});Ac.post("/instruction-suggestions/mark-stale",async e=>{let t=e.get("userId");return await d.update(x).set({isStale:!0}).where(lr(x.userId,t)),e.json({ok:!0})});var Kk=Yt.object({eventType:Yt.enum(["surfaced","surfaced_with_content","accepted","dismissed","promoted","proxy_injected","redundant"]),tool:Yt.string().optional(),sessionId:Yt.string().uuid().optional(),projectPath:Yt.string().min(1),instructionId:Yt.string().uuid().optional(),actor:Yt.enum(["human","auto"]).default("human")});Ac.post("/instruction-suggestions/:id/events",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=Kk.parse(await e.req.json()),[o]=await d.select().from(x).where(gv(lr(x.id,n),lr(x.userId,t)));if(!o)return e.json({error:"Suggestion not found"},404);let s=r.eventType==="accepted"||r.eventType==="promoted",i=o.instructionId;if(s&&r.instructionId){let[c]=await d.select({id:g.id}).from(g).where(gv(lr(g.id,r.instructionId),Wk(lr(g.createdBy,t),lr(g.scope,"public")))).limit(1);if(!c)return e.json({error:"instructionId not found",code:"INVALID_INSTRUCTION"},400);i=c.id}if(await d.insert(Je).values({suggestionId:n,userId:t,eventType:r.eventType,tool:r.tool??null,sessionId:r.sessionId??null,projectPath:r.projectPath,actor:r.actor}),s)await d.update(x).set({acceptedAt:new Date,promotedToInstructionId:i}).where(lr(x.id,n));else if(r.eventType==="dismissed")await d.update(x).set({dismissedAt:new Date}).where(lr(x.id,n));else if(r.eventType==="surfaced"||r.eventType==="surfaced_with_content")try{await Kd(t,wi`${lr(x.id,n)}`)}catch{}return e.json({ok:!0})});C();import{Hono as Xk}from"hono";import{z as Ec}from"zod";import{eq as vi,and as _v,desc as yv,sql as Xd}from"drizzle-orm";ds();C();ds();import{randomUUID as Gk}from"node:crypto";import{and as Yd,eq as bn,sql as Lf}from"drizzle-orm";var Yk=.8;async function hv(e){let{userId:t,instructionId:n,projectPath:r,source:o}=e,s=e.treatedShare??.5,[i]=await d.select({id:g.id,name:g.name,content:g.content,archived:g.archived,scope:g.scope,createdBy:g.createdBy}).from(g).where(bn(g.id,n));if(!i||i.createdBy!==t&&i.scope!=="public")return{ok:!1,code:"not_found",reason:"instruction not found"};if(i.archived)return{ok:!1,code:"archived",reason:"instruction is archived"};let c=qr(i.content,i.name);if(!c)return{ok:!1,code:"no_body",reason:"instruction body could not be extracted from its content"};let[a]=await d.select({id:Y.id}).from(Y).where(Yd(bn(Y.instructionId,n),bn(Y.contentHash,c),bn(Y.projectPath,r)));if(a)return{ok:!1,code:"already_decided",reason:"this exact content already has a verdict on this project \u2014 edit the instruction to re-enter testing"};if(o==="groom"){let[m]=await d.select({id:x.id}).from(x).where(Yd(bn(x.userId,t),bn(x.instructionId,n),bn(x.projectPath,r),Lf`${x.acceptedAt} IS NULL`,Lf`${x.dismissedAt} IS NULL`,Lf`${x.score} >= ${Yk}`));if(!m)return{ok:!1,code:"not_injectable",reason:"not delivered by injection on this project (accepted into a file, or no renderable proposal) \u2014 withholding would measure nothing"}}let[l]=await d.select({id:U.id}).from(U).where(Yd(bn(U.instructionId,n),bn(U.projectPath,r),bn(U.status,"running")));if(l)return{ok:!0,experimentId:l.id,existing:!0};try{let[m]=await d.insert(U).values({userId:t,instructionId:n,projectPath:r,status:"running",treatedShare:String(s),salt:Gk(),contentHash:c,source:o}).returning({id:U.id});return{ok:!0,experimentId:m.id,existing:!1}}catch(m){let[p]=await d.select({id:U.id}).from(U).where(Yd(bn(U.instructionId,n),bn(U.projectPath,r),bn(U.status,"running")));if(p)return{ok:!0,experimentId:p.id,existing:!0};throw m}}u(hv,"nominateExperiment");var Ii=new Xk;Ii.get("/instruction-experiments",async e=>{let t=e.get("userId"),n=e.req.query("projectPath"),r=Math.min(Math.max(Number(e.req.query("limit"))||50,1),200),o=_v(vi(U.userId,t),n?vi(U.projectPath,n):Xd`true`),s=await d.select({id:U.id,instructionId:U.instructionId,instructionName:g.name,projectPath:U.projectPath,status:U.status,source:U.source,instructionSource:Xd`${g.frontmatter}->>'source'`,stoppedReason:U.stoppedReason,createdAt:U.createdAt}).from(U).innerJoin(g,vi(U.instructionId,g.id)).where(o).orderBy(yv(U.createdAt)).limit(r),[{total:i}]=await d.select({total:Xd`count(*)::int`}).from(U).where(o),c=await Promise.all(s.map(async l=>{let m=await Ic(l.id,t),p=l.status,_=l.stoppedReason;if(m&&l.status==="running")try{let I=await fi({experimentId:l.id,userId:t,verdict:m,source:l.source,status:l.status});I&&(p="stopped",_=I)}catch{}return{...l,status:p,stoppedReason:_,verdict:m}})),a=await Wd(c.map(l=>l.id));return e.json({experiments:c.map(l=>({...l,graduation:a.get(l.id)??null})),total:i})});var Qk=Ec.object({instructionId:Ec.string().uuid(),projectPath:Ec.string().min(1),source:Ec.enum(["manual","groom","trial","borrow"]).default("manual"),treatedShare:Ec.number().gt(0).lt(1).optional()});Ii.post("/instruction-experiments",async e=>{let t=e.get("userId"),n=Qk.safeParse(await e.req.json().catch(()=>({})));if(!n.success)return e.json({error:n.error.flatten()},400);let r=await hv({userId:t,...n.data});if(!r.ok){let o={not_found:404,archived:400,no_body:400,already_decided:409,not_injectable:409};return e.json({error:r.reason,code:r.code},o[r.code])}return e.json({experimentId:r.experimentId,existing:r.existing},r.existing?200:201)});Ii.get("/instruction-experiments/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await Ic(n,t);if(!r)return e.json({error:"not found"},404);try{let[s]=await d.select({source:U.source,status:U.status}).from(U).where(vi(U.id,n));s&&await fi({experimentId:n,userId:t,verdict:r,source:s.source,status:s.status})}catch{}let o=await Wd([n]);return e.json({verdict:r,graduation:o.get(n)??null})});Ii.get("/instruction-verdicts",async e=>{let t=e.get("userId"),n=e.req.query("instructionId"),r=await d.select({id:Y.id,instructionId:Y.instructionId,contentHash:Y.contentHash,projectPath:Y.projectPath,decision:Y.decision,delta:Y.delta,ciLower:Y.ciLower,ciUpper:Y.ciUpper,nTreated:Y.nTreated,nControl:Y.nControl,decidedAt:Y.decidedAt}).from(Y).where(_v(vi(Y.userId,t),n?vi(Y.instructionId,n):Xd`true`)).orderBy(yv(Y.decidedAt)).limit(50);return e.json({verdicts:r,total:r.length})});var ho=new Zk;ho.route("/",_i);ho.route("/",Cf);ho.route("/",fs);ho.route("/",Ac);ho.route("/",Ii);import{Hono as mP}from"hono";import{Hono as Bj}from"hono";C();import{Hono as cN}from"hono";import{z as Pn}from"zod";import{eq as Ct,and as Ei,desc as xv,sql as mr,or as Tv,gte as uN,ne as dN}from"drizzle-orm";function wv(e){if(!e||typeof e!="string")return null;let t=e.trim();if(!t)return null;if(!t.includes("://")&&!/^([\w.-]+@)?[\w.-]+:[^/]/.test(t)&&/^[\w.-]+(\.[\w.-]+)+\//.test(t)){let c=t.replace(/\.git$/i,"").replace(/\/+$/,""),a=c.indexOf("/"),l=c.slice(0,a).toLowerCase(),m=c.slice(a+1);return m?`${l}/${m}`:null}let n=t,r=/^([\w.-]+@)?([\w.-]+):([^/].*)$/.exec(t);if(r&&!t.includes("://")){let[,,c,a]=r;n=`ssh://${c}/${a}`}let o;try{o=new URL(n)}catch{return null}let s=o.hostname.toLowerCase();if(!s)return null;let i=o.pathname.replace(/^\/+|\/+$/g,"");return!i||(i=i.replace(/\.git$/i,""),!i)?null:`${s}/${i}`}u(wv,"canonicalizeRemote");var eN=new Set(["","unknown","<synthetic>"]);function gs(e){if(typeof e!="string")return null;let t=e.trim();return eN.has(t)?null:t}u(gs,"resolveModelId");var tN=["claudeCodeVersion","codexCliVersion"];function bi(e){if(typeof e!="object"||e===null)return null;let t=e;for(let n of tN){let r=gs(t[n]);if(r!==null)return r}return null}u(bi,"resolveHarnessVersion");C();import{eq as Mf,and as oN,sql as Ev}from"drizzle-orm";C();import{randomUUID as Si}from"node:crypto";import{eq as Ot,and as xc,gt as nN,sql as vv}from"drizzle-orm";var rN=6e4;async function Ai(e){try{let t=new Date(Date.now()-rN),[n]=await d.select({exists:vv`1`}).from(pe).where(xc(Ot(pe.userId,e),Ot(pe.workerType,"cli-worker"),nN(pe.lastHeartbeat,t))).limit(1);return n!==void 0}catch(t){return console.warn("[enqueueJob] hasLiveWorker check failed; skipping warning:",t instanceof Error?t.message:t),!0}}u(Ai,"hasLiveWorker");async function Tt(e){let t=!await Ai(e.userId),n=Si(),r={...e.payload,mirrorId:n};switch(e.taskName){case"process_eval":case"process_conversation":{await d.insert(Re).values({...e.mirror,id:n,status:"pending",taskKind:e.taskName,payload:r});break}case"process_insights":{await d.insert(W).values({...e.mirror,id:n,status:"pending",taskKind:e.taskName,payload:r});break}case"process_launch":{await d.insert(ce).values({...e.mirror,id:n,status:"pending",taskKind:e.taskName,payload:r,...e.runId?{runId:e.runId}:{}});break}case"process_send_message":{await d.insert(zu).values({...e.mirror,id:n,status:"pending",taskKind:e.taskName,payload:r});break}}return{id:n,noLiveWorker:t}}u(Tt,"enqueueJob");async function Qd(e){let t=`goal-${e.sessionId}-${e.milestone}`,[n]=await d.select({id:ke.id}).from(ke).where(xc(Ot(ke.userId,e.userId),Ot(ke.taskKind,"process_session_goal"),Ot(ke.dedupeKey,t),Ot(ke.status,"pending"))).limit(1);if(n)return;let r=Si();await d.insert(ke).values({id:r,userId:e.userId,taskKind:"process_session_goal",payload:{sessionId:e.sessionId,milestone:e.milestone,mirrorId:r},dedupeKey:t})}u(Qd,"enqueueSessionGoalJob");async function Iv(e){let t=`distill-${e.sessionId}`,[n]=await d.select({id:ke.id}).from(ke).where(xc(Ot(ke.userId,e.userId),Ot(ke.taskKind,"distill_memories"),Ot(ke.dedupeKey,t),Ot(ke.status,"pending"))).limit(1);if(n)return;let r=Si();await d.insert(ke).values({id:r,userId:e.userId,taskKind:"distill_memories",payload:{sessionId:e.sessionId,mirrorId:r},dedupeKey:t})}u(Iv,"enqueueDistillMemoriesJob");async function bv(e){let t=!await Ai(e.userId),n=`run-cleanup:${e.runId}`,[r]=await d.select({id:ke.id}).from(ke).where(xc(Ot(ke.userId,e.userId),Ot(ke.taskKind,"process_run_cleanup"),Ot(ke.dedupeKey,n),Ot(ke.status,"pending"))).limit(1);if(r)return{jobId:r.id,noLiveWorker:t};let o=Si();return await d.insert(ke).values({id:o,userId:e.userId,taskKind:"process_run_cleanup",payload:{runId:e.runId,mirrorId:o},dedupeKey:n}),{jobId:o,noLiveWorker:t}}u(bv,"enqueueRunCleanupJob");async function Sv(e){let t=`judge-review:${e.evalTargetId}`,n=Si();await d.execute(vv`
310
229
  INSERT INTO agent_jobs (id, user_id, task_kind, payload, dedupe_key)
311
230
  SELECT ${n}, ${e.userId}, 'process_judge_review',
312
231
  ${JSON.stringify({evalTargetId:e.evalTargetId,mirrorId:n})}::jsonb,
@@ -318,7 +237,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
318
237
  AND dedupe_key = ${t}
319
238
  AND status = 'pending'
320
239
  )
321
- `)}d(DI,"enqueueJudgeReviewJob");async function MI(e){let t=!await Ei(e.userId),n=`memory-ab:${e.experimentId}`,[r]=await u.select({id:je.id}).from(je).where(Tc(Mt(je.userId,e.userId),Mt(je.taskKind,"memory_ab"),Mt(je.dedupeKey,n),Mt(je.status,"pending"))).limit(1);if(r)return{jobId:r.id,noLiveWorker:t};let o=Ai();return await u.insert(je).values({id:o,userId:e.userId,taskKind:"memory_ab",payload:{experimentId:e.experimentId,mirrorId:o},dedupeKey:n}),{jobId:o,noLiveWorker:t}}d(MI,"enqueueMemoryAbJob");async function _o(e,t){let n=d((r,o)=>{let s={"org_attribution.source":r};if(o)for(let[i,a]of Object.entries(o))s[`org_attribution.${i}`]=a;Dp(s)},"tag");if(t)try{let[r]=await u.select({orgId:Q.orgId}).from(Q).where(QN(Uf(Q.userId,e),Uf(Q.orgId,t))).limit(1);if(r)return n("claim"),t;console.warn(`[sessions] User ${e} attempted to attribute session to org ${t} but is not a member; falling back to profile.active_org_id.`),n("profile_fallback",{claim_rejected:"not_member"})}catch(r){console.warn(`[sessions] Membership lookup failed for user=${e} org=${t}; falling back to profile.active_org_id:`,r instanceof Error?r.message:r),n("profile_fallback",{claim_rejected:"lookup_error"})}else n("profile_fallback",{claim_rejected:"no_claim"});try{let[r]=await u.select({activeOrgId:T.activeOrgId}).from(T).where(Uf(T.id,e)).limit(1);return r?.activeOrgId?r.activeOrgId:(n("unresolved"),null)}catch(r){return console.warn(`[sessions] active_org_id lookup failed for user=${e}; orgId silenced to null:`,r instanceof Error?r.message:r),n("unresolved",{profile_lookup_error:!0}),null}}d(_o,"resolveCallerOrgId");async function ZN(e,t,n){if(n)try{await u.execute(LI`
240
+ `)}u(Sv,"enqueueJudgeReviewJob");async function Av(e){let t=!await Ai(e.userId),n=`memory-ab:${e.experimentId}`,[r]=await d.select({id:ke.id}).from(ke).where(xc(Ot(ke.userId,e.userId),Ot(ke.taskKind,"memory_ab"),Ot(ke.dedupeKey,n),Ot(ke.status,"pending"))).limit(1);if(r)return{jobId:r.id,noLiveWorker:t};let o=Si();return await d.insert(ke).values({id:o,userId:e.userId,taskKind:"memory_ab",payload:{experimentId:e.experimentId,mirrorId:o},dedupeKey:n}),{jobId:o,noLiveWorker:t}}u(Av,"enqueueMemoryAbJob");async function _o(e,t){let n=u((r,o)=>{let s={"org_attribution.source":r};if(o)for(let[i,c]of Object.entries(o))s[`org_attribution.${i}`]=c;Om(s)},"tag");if(t)try{let[r]=await d.select({orgId:Q.orgId}).from(Q).where(oN(Mf(Q.userId,e),Mf(Q.orgId,t))).limit(1);if(r)return n("claim"),t;console.warn(`[sessions] User ${e} attempted to attribute session to org ${t} but is not a member; falling back to profile.active_org_id.`),n("profile_fallback",{claim_rejected:"not_member"})}catch(r){console.warn(`[sessions] Membership lookup failed for user=${e} org=${t}; falling back to profile.active_org_id:`,r instanceof Error?r.message:r),n("profile_fallback",{claim_rejected:"lookup_error"})}else n("profile_fallback",{claim_rejected:"no_claim"});try{let[r]=await d.select({activeOrgId:T.activeOrgId}).from(T).where(Mf(T.id,e)).limit(1);return r?.activeOrgId?r.activeOrgId:(n("unresolved"),null)}catch(r){return console.warn(`[sessions] active_org_id lookup failed for user=${e}; orgId silenced to null:`,r instanceof Error?r.message:r),n("unresolved",{profile_lookup_error:!0}),null}}u(_o,"resolveCallerOrgId");async function sN(e,t,n){if(n)try{await d.execute(Ev`
322
241
  insert into treatment_exposures
323
242
  (session_id, user_id, treatment_type, treatment_id, treatment_version, method, exposed_at)
324
243
  select ${e}::uuid, ${t}::uuid, 'suggestion', s.instruction_id, 1, 'injected', min(ise.created_at)
@@ -328,7 +247,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
328
247
  and ise.event_type in ('surfaced', 'surfaced_with_content', 'proxy_injected')
329
248
  group by s.instruction_id
330
249
  on conflict on constraint treatment_exposures_unique do nothing
331
- `)}catch(r){console.warn("[reimport] suggestion exposure reconcile failed:",r instanceof Error?r.message:r)}}d(ZN,"reconcileSuggestionExposures");async function eP(e,t,n){if(n)try{await u.execute(LI`
250
+ `)}catch(r){console.warn("[reimport] suggestion exposure reconcile failed:",r instanceof Error?r.message:r)}}u(sN,"reconcileSuggestionExposures");async function iN(e,t,n){if(n)try{await d.execute(Ev`
332
251
  with drained as (
333
252
  insert into treatment_exposures
334
253
  (session_id, user_id, treatment_type, treatment_id, treatment_version, method, exposed_at)
@@ -343,13 +262,13 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
343
262
  delete from pending_treatment_exposures
344
263
  where external_session_id = ${n}
345
264
  and user_id = ${t}::uuid
346
- `)}catch(r){console.warn("[reimport] memory exposure reconcile failed:",r instanceof Error?r.message:r)}}d(eP,"reconcileMemoryExposures");var tP=6;async function el(e,t,n,r,o){await ZN(e,t,n),await eP(e,t,n),r&&o>=tP&&await CI({sessionId:e,userId:t}).catch(s=>{console.warn("[reimport] distill enqueue failed:",s instanceof Error?s.message:s)})}d(el,"finalizeSessionIntelligence");var Hf=new nP;async function Bf(e,t){if(!t)return null;try{let[n]=await u.select({id:X.id}).from(X).where(xi(Lt(X.id,t),Lt(X.userId,e))).limit(1);return n?n.id:(console.warn(`[sessions] User ${e} attempted to attribute session to run ${t} but does not own it; run_id left null.`),null)}catch(n){return console.warn(`[sessions] run ownership lookup failed for user=${e} run=${t}; run_id silenced to null:`,n instanceof Error?n.message:n),null}}d(Bf,"resolveCallerRunId");var sP=jn.object({tool:jn.string(),externalSessionId:jn.string().optional(),clientName:jn.string().optional(),mcpServerVersion:jn.string().optional(),projectPath:jn.string().optional(),gitBranch:jn.string().optional(),startedAt:jn.string().optional(),metadata:jn.record(jn.unknown()).optional(),orgId:jn.string().uuid().nullable().optional(),runId:jn.string().uuid().nullable().optional()});Hf.post("/sessions",async e=>{let t=e.get("userId"),n=await e.req.json(),r=sP.parse(n);if(r.projectPath){let f=await u.select({projectPath:_.projectPath}).from(_).where(xi(Lt(_.userId,t),pr`${_.projectPath} IS NOT NULL`)).groupBy(_.projectPath);for(let w of f)if(w.projectPath&&r.projectPath!==w.projectPath&&r.projectPath.startsWith(w.projectPath+"/")){r.projectPath=w.projectPath;break}}let o=await _o(t,r.orgId??null),s=await Bf(t,r.runId??null);if(r.externalSessionId){let[f]=await u.select().from(_).where(xi(Lt(_.userId,t),Lt(_.externalSessionId,r.externalSessionId))).limit(1);if(f){let w={};return!f.orgId&&o&&(w.orgId=o,f.orgId=o),!f.runId&&s&&(w.runId=s,f.runId=s),Object.keys(w).length>0&&await u.update(_).set(w).where(Lt(_.id,f.id)),e.json(f,200)}}if(r.tool&&r.projectPath){let f=new Date(Date.now()-3e4),w=[Lt(_.userId,t),Lt(_.tool,r.tool),Lt(_.projectPath,r.projectPath),rP(_.startedAt,f)],[b]=await u.select().from(_).where(xi(...w)).orderBy($I(_.startedAt)).limit(1);if(b){let I={};return!b.externalSessionId&&r.externalSessionId&&(I.externalSessionId=r.externalSessionId,b.externalSessionId=r.externalSessionId),!b.orgId&&o&&(I.orgId=o,b.orgId=o),!b.runId&&s&&(I.runId=s,b.runId=s),Object.keys(I).length>0&&await u.update(_).set(I).where(Lt(_.id,b.id)),e.json(b,200)}}let i=[],a=null,c=NI(r.metadata?.gitRemote??null),l=typeof r.metadata?.gitRootCommit=="string"&&r.metadata.gitRootCommit?r.metadata.gitRootCommit:null,p=typeof r.metadata?.launchProjectPath=="string"&&r.metadata.launchProjectPath?r.metadata.launchProjectPath:null;try{if(p){let[f]=await u.select({projectId:le.projectId}).from(le).where(Lt(le.path,p)).orderBy($I(le.lastSeen)).limit(1);f&&(i=[{id:f.projectId}],a="launchPath")}if(i.length===0&&c){let[f]=await u.select({id:U.id}).from(U).where(qI(Lt(U.gitRemoteUrl,c),pr`${c} = ANY(${U.gitRemoteAliases})`)).limit(1);f&&(i=[f],a="remote")}if(i.length===0&&l){let[f]=await u.select({id:U.id,gitRemoteUrl:U.gitRemoteUrl,gitRemoteAliases:U.gitRemoteAliases}).from(U).where(Lt(U.gitRootCommit,l)).limit(1);f&&(i=[{id:f.id}],a="rootCommit",c&&f.gitRemoteUrl&&f.gitRemoteUrl!==c&&!(f.gitRemoteAliases??[]).includes(c)&&await u.update(U).set({gitRemoteUrl:c,gitRemoteAliases:pr`array_append(${U.gitRemoteAliases}, ${f.gitRemoteUrl})`}).where(Lt(U.id,f.id)))}if(i.length===0&&c){let f=c.split("/").filter(Boolean).pop()??c,[w]=await u.insert(U).values({name:f,gitRemoteUrl:c,gitRootCommit:l,createdBy:t}).onConflictDoUpdate({target:U.gitRemoteUrl,targetWhere:pr`${U.gitRemoteUrl} IS NOT NULL`,set:{gitRemoteUrl:c}}).returning({id:U.id});w&&(i=[{id:w.id}],a="remote")}}catch(f){console.warn("[sessions] Project match failed (non-fatal):",f)}let m=e.req.header("X-RuleMetric-Internal")==="true"||e.req.header("x-rulemetric-internal")==="true",y;m?y="internal_worker":r.clientName==="mcp"?y="mcp":r.externalSessionId?y="hook":y="proxy";let v;try{[v]=await u.insert(_).values({userId:t,externalSessionId:r.externalSessionId??null,projectId:i[0]?.id??null,orgId:o,runId:s,tool:r.tool,projectPath:r.projectPath??null,gitBranch:r.gitBranch??null,startedAt:r.startedAt?new Date(r.startedAt):new Date,origin:y,harnessVersion:Si(r.metadata)??void 0,metadata:{...r.metadata,clientName:r.clientName,mcpServerVersion:r.mcpServerVersion}}).returning()}catch(f){if(f.cause?.code==="23505"&&r.externalSessionId){let[b]=await u.select().from(_).where(xi(Lt(_.userId,t),Lt(_.externalSessionId,r.externalSessionId))).limit(1);if(b){let I={};return!b.orgId&&o&&(I.orgId=o,b.orgId=o),!b.runId&&s&&(I.runId=s,b.runId=s),Object.keys(I).length>0&&await u.update(_).set(I).where(Lt(_.id,b.id)),e.json(b,200)}}throw f}if(!v)return e.json({error:"Failed to create session"},500);let h=!!r.projectPath&&/^\/(Users|home)\/[^/]+\/?$/.test(r.projectPath);if(i.length>0&&r.projectPath&&!h){let f=r.metadata?.isWorktree===!0;try{await u.insert(le).values({projectId:i[0].id,path:r.projectPath,isWorktree:f}).onConflictDoUpdate({target:[le.projectId,le.path],set:{lastSeen:new Date,isWorktree:f}})}catch(w){console.warn("[sessions] project_checkouts upsert failed (non-fatal):",w)}}try{if(i.length>0){let f=r.projectPath?r.projectPath.replace(/\/$/,"")+"/":null,w=f?pr`${g.name} LIKE ${f+"%"}`:pr`FALSE`,b=await u.select({instructionId:at.instructionId}).from(at).innerJoin(g,Lt(g.id,at.instructionId)).where(xi(pr`${at.projectId} IN (${pr.join(i.map(I=>pr`${I.id}`),pr`, `)})`,qI(oP(g.type,"context_file"),w)));for(let{instructionId:I}of b)await u.insert(se).values({sessionId:v.id,instructionId:I,linkMethod:"project_match"}).onConflictDoNothing()}}catch{}return e.json(v,201)});O();import{Hono as pP}from"hono";import{z as dt}from"zod";import{eq as JI,and as mP,sql as mr}from"drizzle-orm";O();import{sql as Nn}from"drizzle-orm";function tl(){return process.env.EVENT_BATCHING!=="0"}d(tl,"eventBatchingEnabled");function HI(){let e=Number(process.env.EVENT_BATCH_LINGER_MS);return Number.isFinite(e)&&e>=0?e:50}d(HI,"eventBatchLingerMs");function BI(){let e=Number(process.env.EVENT_BATCH_BUFFER_MAX);return Number.isFinite(e)&&e>0?Math.floor(e):5e3}d(BI,"eventBatchBufferMax");function FI(){let e=Number(process.env.EVENT_BATCH_FLUSH_SIZE);return Number.isFinite(e)&&e>0?Math.floor(e):iP}d(FI,"eventBatchFlushSize");function WI(){let e=Number(process.env.PG_POOL_MAX)||3;return Math.max(1,e-1)}d(WI,"defaultDrainConcurrency");var iP=500;function aP(e){let t=e.lingerMs??HI(),n=e.maxBuffered??BI(),r=Math.max(1,e.flushSize??FI()),o=Math.max(1,e.concurrency??WI()),s=new Map,i=0,a=new Set,c=0,l=!1,p=null,m=[];function y(){let A=m;m=[];for(let E of A)E()}d(y,"notifyProgress");function v(){for(;c<o;){let A=null,E=null;for(let[R,D]of s)if(!(a.has(R)||D.length===0)){E=D.splice(0,r),D.length===0&&s.delete(R),A=R;break}if(A==null||E==null)return;i-=E.length,a.add(A),c++,h(A,E)}}d(v,"tick");async function h(A,E){try{await e.drainSession(A,E)}catch(R){console.warn(`[event-batcher] drain failed for session ${A}; dropping ${E.length} event(s):`,R instanceof Error?R.message:R)}finally{c--,a.delete(A),y(),v()}}d(h,"runDrain");function f(){p!=null||l||(p=setTimeout(()=>{p=null,v()},t),p.unref?.())}d(f,"scheduleLinger");function w(A){if(l||i>=n)return!1;let E=s.get(A.sessionId);return E?E.push(A):s.set(A.sessionId,[A]),i++,i>=r?v():f(),!0}d(w,"push");function b(A){return new Promise(E=>{let R=!1,D=d(()=>{R||(R=!0,clearTimeout(j),E())},"finish"),j=setTimeout(D,A);j.unref?.(),m.push(D)})}d(b,"waitForProgress");async function I(A){let E=A!=null?Date.now()+A:Number.POSITIVE_INFINITY;for(;;){if(v(),i===0&&c===0)return;let R=E-Date.now();if(R<=0)return;await b(Math.min(R,50))}}d(I,"flush");function S(){l=!0,p!=null&&(clearTimeout(p),p=null)}return d(S,"stop"),{push:w,flush:I,stop:S,size:d(()=>i,"size"),inFlight:d(()=>c,"inFlight")}}d(aP,"createEventBatcher");var UI=5,cP=[5,20,50];function dP(e){let t=e.cause;return e instanceof Error&&(t?.code==="23505"||e.message.includes("unique")||e.message.includes("duplicate"))}d(dP,"isDuplicateKeyError");function uP(e){let t=Date.parse(e);return Number.isNaN(t)?(console.warn(`[event-batcher] invalid event timestamp ${JSON.stringify(e)}; using drain wall-clock`),new Date().toISOString()):new Date(t).toISOString()}d(uP,"toEventTimestamp");async function lP(e,t){if(t.length===0)return;let n=null,r=!1;for(let o=0;o<=UI;o++)try{let s=t.map((a,c)=>{let l=a.input,p={...l.metadata??{}};l.durationMs!=null&&(p.durationMs=l.durationMs),l.success!=null&&(p.success=l.success);let m=l.toolInput==null?null:JSON.stringify(l.toolInput),y=l.toolOutput==null?null:JSON.stringify(l.toolOutput),v=l.tokenUsage==null?null:JSON.stringify(l.tokenUsage),h=!r&&l.sequence!=null?Nn`${l.sequence}::int`:Nn`NULL::int`;return Nn`(${c+1}::int, ${h}, ${l.eventType}::text, ${l.content??null}::text, ${l.toolName??null}::text, ${m==null?Nn`NULL::jsonb`:Nn`${m}::jsonb`}, ${y==null?Nn`NULL::jsonb`:Nn`${y}::jsonb`}, ${v==null?Nn`NULL::jsonb`:Nn`${v}::jsonb`}, ${l.model??null}::text, ${uP(l.timestamp)}::timestamptz, ${JSON.stringify(p)}::jsonb)`});n=(await u.execute(Nn`
265
+ `)}catch(r){console.warn("[reimport] memory exposure reconcile failed:",r instanceof Error?r.message:r)}}u(iN,"reconcileMemoryExposures");var aN=6;async function Zd(e,t,n,r,o){await sN(e,t,n),await iN(e,t,n),r&&o>=aN&&await Iv({sessionId:e,userId:t}).catch(s=>{console.warn("[reimport] distill enqueue failed:",s instanceof Error?s.message:s)})}u(Zd,"finalizeSessionIntelligence");var $f=new cN;async function qf(e,t){if(!t)return null;try{let[n]=await d.select({id:X.id}).from(X).where(Ei(Ct(X.id,t),Ct(X.userId,e))).limit(1);return n?n.id:(console.warn(`[sessions] User ${e} attempted to attribute session to run ${t} but does not own it; run_id left null.`),null)}catch(n){return console.warn(`[sessions] run ownership lookup failed for user=${e} run=${t}; run_id silenced to null:`,n instanceof Error?n.message:n),null}}u(qf,"resolveCallerRunId");var lN=Pn.object({tool:Pn.string(),externalSessionId:Pn.string().optional(),clientName:Pn.string().optional(),mcpServerVersion:Pn.string().optional(),projectPath:Pn.string().optional(),gitBranch:Pn.string().optional(),startedAt:Pn.string().optional(),metadata:Pn.record(Pn.unknown()).optional(),orgId:Pn.string().uuid().nullable().optional(),runId:Pn.string().uuid().nullable().optional()});$f.post("/sessions",async e=>{let t=e.get("userId"),n=await e.req.json(),r=lN.parse(n);if(r.projectPath){let f=await d.select({projectPath:y.projectPath}).from(y).where(Ei(Ct(y.userId,t),mr`${y.projectPath} IS NOT NULL`)).groupBy(y.projectPath);for(let w of f)if(w.projectPath&&r.projectPath!==w.projectPath&&r.projectPath.startsWith(w.projectPath+"/")){r.projectPath=w.projectPath;break}}let o=await _o(t,r.orgId??null),s=await qf(t,r.runId??null);if(r.externalSessionId){let[f]=await d.select().from(y).where(Ei(Ct(y.userId,t),Ct(y.externalSessionId,r.externalSessionId))).limit(1);if(f){let w={};return!f.orgId&&o&&(w.orgId=o,f.orgId=o),!f.runId&&s&&(w.runId=s,f.runId=s),Object.keys(w).length>0&&await d.update(y).set(w).where(Ct(y.id,f.id)),e.json(f,200)}}if(r.tool&&r.projectPath){let f=new Date(Date.now()-3e4),w=[Ct(y.userId,t),Ct(y.tool,r.tool),Ct(y.projectPath,r.projectPath),uN(y.startedAt,f)],[b]=await d.select().from(y).where(Ei(...w)).orderBy(xv(y.startedAt)).limit(1);if(b){let v={};return!b.externalSessionId&&r.externalSessionId&&(v.externalSessionId=r.externalSessionId,b.externalSessionId=r.externalSessionId),!b.orgId&&o&&(v.orgId=o,b.orgId=o),!b.runId&&s&&(v.runId=s,b.runId=s),Object.keys(v).length>0&&await d.update(y).set(v).where(Ct(y.id,b.id)),e.json(b,200)}}let i=[],c=null,a=wv(r.metadata?.gitRemote??null),l=typeof r.metadata?.gitRootCommit=="string"&&r.metadata.gitRootCommit?r.metadata.gitRootCommit:null,m=typeof r.metadata?.launchProjectPath=="string"&&r.metadata.launchProjectPath?r.metadata.launchProjectPath:null;try{if(m){let[f]=await d.select({projectId:de.projectId}).from(de).where(Ct(de.path,m)).orderBy(xv(de.lastSeen)).limit(1);f&&(i=[{id:f.projectId}],c="launchPath")}if(i.length===0&&a){let[f]=await d.select({id:M.id}).from(M).where(Tv(Ct(M.gitRemoteUrl,a),mr`${a} = ANY(${M.gitRemoteAliases})`)).limit(1);f&&(i=[f],c="remote")}if(i.length===0&&l){let[f]=await d.select({id:M.id,gitRemoteUrl:M.gitRemoteUrl,gitRemoteAliases:M.gitRemoteAliases}).from(M).where(Ct(M.gitRootCommit,l)).limit(1);f&&(i=[{id:f.id}],c="rootCommit",a&&f.gitRemoteUrl&&f.gitRemoteUrl!==a&&!(f.gitRemoteAliases??[]).includes(a)&&await d.update(M).set({gitRemoteUrl:a,gitRemoteAliases:mr`array_append(${M.gitRemoteAliases}, ${f.gitRemoteUrl})`}).where(Ct(M.id,f.id)))}if(i.length===0&&a){let f=a.split("/").filter(Boolean).pop()??a,[w]=await d.insert(M).values({name:f,gitRemoteUrl:a,gitRootCommit:l,createdBy:t}).onConflictDoUpdate({target:M.gitRemoteUrl,targetWhere:mr`${M.gitRemoteUrl} IS NOT NULL`,set:{gitRemoteUrl:a}}).returning({id:M.id});w&&(i=[{id:w.id}],c="remote")}}catch(f){console.warn("[sessions] Project match failed (non-fatal):",f)}let p=e.req.header("X-RuleMetric-Internal")==="true"||e.req.header("x-rulemetric-internal")==="true",_;p?_="internal_worker":r.clientName==="mcp"?_="mcp":r.externalSessionId?_="hook":_="proxy";let I;try{[I]=await d.insert(y).values({userId:t,externalSessionId:r.externalSessionId??null,projectId:i[0]?.id??null,orgId:o,runId:s,tool:r.tool,projectPath:r.projectPath??null,gitBranch:r.gitBranch??null,startedAt:r.startedAt?new Date(r.startedAt):new Date,origin:_,harnessVersion:bi(r.metadata)??void 0,metadata:{...r.metadata,clientName:r.clientName,mcpServerVersion:r.mcpServerVersion}}).returning()}catch(f){if(f.cause?.code==="23505"&&r.externalSessionId){let[b]=await d.select().from(y).where(Ei(Ct(y.userId,t),Ct(y.externalSessionId,r.externalSessionId))).limit(1);if(b){let v={};return!b.orgId&&o&&(v.orgId=o,b.orgId=o),!b.runId&&s&&(v.runId=s,b.runId=s),Object.keys(v).length>0&&await d.update(y).set(v).where(Ct(y.id,b.id)),e.json(b,200)}}throw f}if(!I)return e.json({error:"Failed to create session"},500);let h=!!r.projectPath&&/^\/(Users|home)\/[^/]+\/?$/.test(r.projectPath);if(i.length>0&&r.projectPath&&!h){let f=r.metadata?.isWorktree===!0;try{await d.insert(de).values({projectId:i[0].id,path:r.projectPath,isWorktree:f}).onConflictDoUpdate({target:[de.projectId,de.path],set:{lastSeen:new Date,isWorktree:f}})}catch(w){console.warn("[sessions] project_checkouts upsert failed (non-fatal):",w)}}try{if(i.length>0){let f=r.projectPath?r.projectPath.replace(/\/$/,"")+"/":null,w=f?mr`${g.name} LIKE ${f+"%"}`:mr`FALSE`,b=await d.select({instructionId:it.instructionId}).from(it).innerJoin(g,Ct(g.id,it.instructionId)).where(Ei(mr`${it.projectId} IN (${mr.join(i.map(v=>mr`${v.id}`),mr`, `)})`,Tv(dN(g.type,"context_file"),w)));for(let{instructionId:v}of b)await d.insert(se).values({sessionId:I.id,instructionId:v,linkMethod:"project_match"}).onConflictDoNothing()}}catch{}return e.json(I,201)});C();import{Hono as yN}from"hono";import{z as ct}from"zod";import{eq as Cv,and as wN,sql as pr}from"drizzle-orm";C();import{sql as Dn}from"drizzle-orm";function el(){return process.env.EVENT_BATCHING!=="0"}u(el,"eventBatchingEnabled");function kv(){let e=Number(process.env.EVENT_BATCH_LINGER_MS);return Number.isFinite(e)&&e>=0?e:50}u(kv,"eventBatchLingerMs");function Nv(){let e=Number(process.env.EVENT_BATCH_BUFFER_MAX);return Number.isFinite(e)&&e>0?Math.floor(e):5e3}u(Nv,"eventBatchBufferMax");function jv(){let e=Number(process.env.EVENT_BATCH_FLUSH_SIZE);return Number.isFinite(e)&&e>0?Math.floor(e):mN}u(jv,"eventBatchFlushSize");function Pv(){let e=Number(process.env.PG_POOL_MAX)||3;return Math.max(1,e-1)}u(Pv,"defaultDrainConcurrency");var mN=500;function pN(e){let t=e.lingerMs??kv(),n=e.maxBuffered??Nv(),r=Math.max(1,e.flushSize??jv()),o=Math.max(1,e.concurrency??Pv()),s=new Map,i=0,c=new Set,a=0,l=!1,m=null,p=[];function _(){let A=p;p=[];for(let E of A)E()}u(_,"notifyProgress");function I(){for(;a<o;){let A=null,E=null;for(let[R,P]of s)if(!(c.has(R)||P.length===0)){E=P.splice(0,r),P.length===0&&s.delete(R),A=R;break}if(A==null||E==null)return;i-=E.length,c.add(A),a++,h(A,E)}}u(I,"tick");async function h(A,E){try{await e.drainSession(A,E)}catch(R){console.warn(`[event-batcher] drain failed for session ${A}; dropping ${E.length} event(s):`,R instanceof Error?R.message:R)}finally{a--,c.delete(A),_(),I()}}u(h,"runDrain");function f(){m!=null||l||(m=setTimeout(()=>{m=null,I()},t),m.unref?.())}u(f,"scheduleLinger");function w(A){if(l||i>=n)return!1;let E=s.get(A.sessionId);return E?E.push(A):s.set(A.sessionId,[A]),i++,i>=r?I():f(),!0}u(w,"push");function b(A){return new Promise(E=>{let R=!1,P=u(()=>{R||(R=!0,clearTimeout(N),E())},"finish"),N=setTimeout(P,A);N.unref?.(),p.push(P)})}u(b,"waitForProgress");async function v(A){let E=A!=null?Date.now()+A:Number.POSITIVE_INFINITY;for(;;){if(I(),i===0&&a===0)return;let R=E-Date.now();if(R<=0)return;await b(Math.min(R,50))}}u(v,"flush");function S(){l=!0,m!=null&&(clearTimeout(m),m=null)}return u(S,"stop"),{push:w,flush:v,stop:S,size:u(()=>i,"size"),inFlight:u(()=>a,"inFlight")}}u(pN,"createEventBatcher");var Rv=5,fN=[5,20,50];function gN(e){let t=e.cause;return e instanceof Error&&(t?.code==="23505"||e.message.includes("unique")||e.message.includes("duplicate"))}u(gN,"isDuplicateKeyError");function hN(e){let t=Date.parse(e);return Number.isNaN(t)?(console.warn(`[event-batcher] invalid event timestamp ${JSON.stringify(e)}; using drain wall-clock`),new Date().toISOString()):new Date(t).toISOString()}u(hN,"toEventTimestamp");async function _N(e,t){if(t.length===0)return;let n=null,r=!1;for(let o=0;o<=Rv;o++)try{let s=t.map((c,a)=>{let l=c.input,m={...l.metadata??{}};l.durationMs!=null&&(m.durationMs=l.durationMs),l.success!=null&&(m.success=l.success);let p=l.toolInput==null?null:JSON.stringify(l.toolInput),_=l.toolOutput==null?null:JSON.stringify(l.toolOutput),I=l.tokenUsage==null?null:JSON.stringify(l.tokenUsage),h=!r&&l.sequence!=null?Dn`${l.sequence}::int`:Dn`NULL::int`;return Dn`(${a+1}::int, ${h}, ${l.eventType}::text, ${l.content??null}::text, ${l.toolName??null}::text, ${p==null?Dn`NULL::jsonb`:Dn`${p}::jsonb`}, ${_==null?Dn`NULL::jsonb`:Dn`${_}::jsonb`}, ${I==null?Dn`NULL::jsonb`:Dn`${I}::jsonb`}, ${l.model??null}::text, ${hN(l.timestamp)}::timestamptz, ${JSON.stringify(m)}::jsonb)`});n=(await d.execute(Dn`
347
266
  WITH base AS (
348
267
  SELECT COALESCE(MAX(sequence), 0) AS seq
349
268
  FROM session_events WHERE session_id = ${e}
350
269
  ),
351
270
  vals (rn, explicit_seq, event_type, content, tool_name, tool_input, tool_output, token_usage, model, ts, metadata) AS (
352
- VALUES ${Nn.join(s,Nn`, `)}
271
+ VALUES ${Dn.join(s,Dn`, `)}
353
272
  ),
354
273
  ins AS (
355
274
  INSERT INTO session_events (id, session_id, sequence, event_type, content, tool_name, tool_input, tool_output, token_usage, model, timestamp, metadata)
@@ -370,7 +289,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
370
289
  )
371
290
  SELECT (SELECT COUNT(*)::int FROM ins) AS inserted,
372
291
  (SELECT event_count FROM upd) AS new_count
373
- `))[0]?.new_count??null;break}catch(s){if(dP(s)&&o<UI){r=!0;continue}throw s}for(let o of t)if(!(!o.input.instructionIds||o.input.instructionIds.length===0))for(let s of o.input.instructionIds)try{await u.insert(se).values({sessionId:e,instructionId:s,linkMethod:"auto_capture"}).onConflictDoNothing()}catch(i){console.warn("[event-batcher] failed to auto-link instructionId:",i instanceof Error?i.message:i)}if(n!=null)try{let o=n-t.length,s=cP.filter(i=>o<i&&n>=i);for(let i of s)await Zu({sessionId:e,milestone:i,userId:t[0].userId})}catch(o){console.warn("[event-batcher] failed to enqueue process_session_goal:",o instanceof Error?o.message:o)}}d(lP,"drainSessionEvents");var yo=null;function Ff(){return yo==null&&(yo=aP({drainSession:lP})),yo}d(Ff,"getEventBatcher");function zI(){Ff(),console.log(`[event-batcher] batched event ingest ON (lingerMs=${HI()} flushSize=${FI()} bufferMax=${BI()} drainConcurrency=${WI()}; EVENT_BATCHING=0 to disable)`)}d(zI,"initEventBatcher");async function VI(e=5e3){if(yo==null)return;yo.stop(),await yo.flush(e);let t=yo.size()+yo.inFlight();t>0&&console.warn(`[event-batcher] shutdown flush deadline (${e}ms) hit; dropping ~${t} buffered event(s)`)}d(VI,"shutdownEventBatcher");var Wf=new pP,fP=dt.object({sequence:dt.number().int().optional(),eventType:dt.string(),content:dt.string().nullable().optional(),toolName:dt.string().nullable().optional(),toolInput:dt.union([dt.record(dt.unknown()),dt.array(dt.unknown())]).nullable().optional(),toolOutput:dt.union([dt.record(dt.unknown()),dt.array(dt.unknown())]).nullable().optional(),durationMs:dt.number().optional(),success:dt.boolean().optional(),metadata:dt.record(dt.unknown()).optional(),timestamp:dt.string(),instructionIds:dt.array(dt.string().uuid()).optional(),model:dt.string().nullable().optional(),tokenUsage:dt.record(dt.unknown()).nullable().optional()});Wf.post("/sessions/:id/events",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=fP.parse(r),[s]=await u.select({id:_.id,eventCount:_.eventCount,userId:_.userId}).from(_).where(mP(JI(_.id,n),JI(_.userId,t)));if(!s)return e.json({error:"Session not found"},404);let i=s.eventCount??0;if(tl())return Ff().push({sessionId:n,userId:s.userId,input:o})?e.json({buffered:!0,count:1,durable:!1},202):(Ga(),e.header("Retry-After","2"),e.json({error:"Ingest busy: the event buffer is full. Retry shortly."},503));let a={...o.metadata??{}};o.durationMs!=null&&(a.durationMs=o.durationMs),o.success!=null&&(a.success=o.success);let c=o.toolInput==null?null:JSON.stringify(o.toolInput),l=o.toolOutput==null?null:JSON.stringify(o.toolOutput),p=JSON.stringify(a),m=o.tokenUsage==null?null:JSON.stringify(o.tokenUsage),y=o.sequence,v=5;for(let h=0;h<=v;h++)try{let f=y!=null?mr`${y}::int`:mr`COALESCE((SELECT MAX(sequence) FROM session_events WHERE session_id = ${n}), 0) + 1`;y=(await u.execute(mr`
292
+ `))[0]?.new_count??null;break}catch(s){if(gN(s)&&o<Rv){r=!0;continue}throw s}for(let o of t)if(!(!o.input.instructionIds||o.input.instructionIds.length===0))for(let s of o.input.instructionIds)try{await d.insert(se).values({sessionId:e,instructionId:s,linkMethod:"auto_capture"}).onConflictDoNothing()}catch(i){console.warn("[event-batcher] failed to auto-link instructionId:",i instanceof Error?i.message:i)}if(n!=null)try{let o=n-t.length,s=fN.filter(i=>o<i&&n>=i);for(let i of s)await Qd({sessionId:e,milestone:i,userId:t[0].userId})}catch(o){console.warn("[event-batcher] failed to enqueue process_session_goal:",o instanceof Error?o.message:o)}}u(_N,"drainSessionEvents");var yo=null;function Uf(){return yo==null&&(yo=pN({drainSession:_N})),yo}u(Uf,"getEventBatcher");function Dv(){Uf(),console.log(`[event-batcher] batched event ingest ON (lingerMs=${kv()} flushSize=${jv()} bufferMax=${Nv()} drainConcurrency=${Pv()}; EVENT_BATCHING=0 to disable)`)}u(Dv,"initEventBatcher");async function Ov(e=5e3){if(yo==null)return;yo.stop(),await yo.flush(e);let t=yo.size()+yo.inFlight();t>0&&console.warn(`[event-batcher] shutdown flush deadline (${e}ms) hit; dropping ~${t} buffered event(s)`)}u(Ov,"shutdownEventBatcher");var Hf=new yN,vN=ct.object({sequence:ct.number().int().optional(),eventType:ct.string(),content:ct.string().nullable().optional(),toolName:ct.string().nullable().optional(),toolInput:ct.union([ct.record(ct.unknown()),ct.array(ct.unknown())]).nullable().optional(),toolOutput:ct.union([ct.record(ct.unknown()),ct.array(ct.unknown())]).nullable().optional(),durationMs:ct.number().optional(),success:ct.boolean().optional(),metadata:ct.record(ct.unknown()).optional(),timestamp:ct.string(),instructionIds:ct.array(ct.string().uuid()).optional(),model:ct.string().nullable().optional(),tokenUsage:ct.record(ct.unknown()).nullable().optional()});Hf.post("/sessions/:id/events",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=vN.parse(r),[s]=await d.select({id:y.id,eventCount:y.eventCount,userId:y.userId}).from(y).where(wN(Cv(y.id,n),Cv(y.userId,t)));if(!s)return e.json({error:"Session not found"},404);let i=s.eventCount??0;if(el())return Uf().push({sessionId:n,userId:s.userId,input:o})?e.json({buffered:!0,count:1,durable:!1},202):(Ja(),e.header("Retry-After","2"),e.json({error:"Ingest busy: the event buffer is full. Retry shortly."},503));let c={...o.metadata??{}};o.durationMs!=null&&(c.durationMs=o.durationMs),o.success!=null&&(c.success=o.success);let a=o.toolInput==null?null:JSON.stringify(o.toolInput),l=o.toolOutput==null?null:JSON.stringify(o.toolOutput),m=JSON.stringify(c),p=o.tokenUsage==null?null:JSON.stringify(o.tokenUsage),_=o.sequence,I=5;for(let h=0;h<=I;h++)try{let f=_!=null?pr`${_}::int`:pr`COALESCE((SELECT MAX(sequence) FROM session_events WHERE session_id = ${n}), 0) + 1`;_=(await d.execute(pr`
374
293
  WITH ins AS (
375
294
  INSERT INTO session_events (id, session_id, sequence, event_type, content, tool_name, tool_input, tool_output, token_usage, model, timestamp, metadata)
376
295
  SELECT
@@ -380,12 +299,12 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
380
299
  ${o.eventType},
381
300
  ${o.content??null},
382
301
  ${o.toolName??null},
383
- ${c==null?mr`NULL`:mr`${c}::jsonb`},
384
- ${l==null?mr`NULL`:mr`${l}::jsonb`},
385
- ${m==null?mr`NULL`:mr`${m}::jsonb`},
302
+ ${a==null?pr`NULL`:pr`${a}::jsonb`},
303
+ ${l==null?pr`NULL`:pr`${l}::jsonb`},
304
+ ${p==null?pr`NULL`:pr`${p}::jsonb`},
386
305
  ${o.model??null},
387
306
  ${new Date(o.timestamp).toISOString()}::timestamptz,
388
- ${mr`${p}::jsonb`}
307
+ ${pr`${m}::jsonb`}
389
308
  RETURNING sequence
390
309
  ),
391
310
  upd AS (
@@ -395,13 +314,13 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
395
314
  RETURNING id
396
315
  )
397
316
  SELECT ins.sequence FROM ins, upd
398
- `))[0]?.sequence??y??1;break}catch(f){let w=f.cause;if(f instanceof Error&&(w?.code==="23505"||f.message.includes("unique")||f.message.includes("duplicate"))&&h<v){y=void 0;continue}throw f}if(o.instructionIds&&o.instructionIds.length>0)for(let h of o.instructionIds)try{await u.insert(se).values({sessionId:n,instructionId:h,linkMethod:"auto_capture"}).onConflictDoNothing()}catch(f){console.warn("[events ingest] failed to auto-link instructionId:",f instanceof Error?f.message:f)}try{let h=i+1,w=[5,20,50].filter(b=>i<b&&h>=b);for(let b of w)await Zu({sessionId:s.id,milestone:b,userId:s.userId})}catch(h){console.warn("[events ingest] failed to enqueue process_session_goal:",h instanceof Error?h.message:h)}return e.json({recorded:!0})});O();import{Hono as gP}from"hono";import{eq as hs,and as nl,desc as hP,sql as _P,ilike as zf,gte as GI}from"drizzle-orm";var Vf=new gP;Vf.post("/sessions/:id/close",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:_.id,projectPath:_.projectPath}).from(_).where(nl(hs(_.id,n),hs(_.userId,t)));if(!r)return e.json({error:"Session not found"},404);if(await u.update(_).set({endedAt:new Date}).where(hs(_.id,n)),r.projectPath)try{let o=new Date;o.setHours(0,0,0,0);let[s]=await u.select({id:W.id}).from(W).where(nl(hs(W.userId,t),GI(W.createdAt,o),zf(W.projectPath,`%${ot(r.projectPath)}%`))).limit(1);if(!s){let[i]=await u.select({completedAt:W.completedAt}).from(W).where(nl(hs(W.userId,t),hs(W.status,"completed"),zf(W.projectPath,`%${ot(r.projectPath)}%`))).orderBy(hP(W.completedAt)).limit(1),a=i?.completedAt??new Date(0),[{count:c}]=await u.select({count:_P`COUNT(*)`}).from(_).where(nl(hs(_.userId,t),zf(_.projectPath,`%${ot(r.projectPath)}%`),GI(_.startedAt,a)));Number(c)>=5&&await Rt({taskName:"process_insights",payload:{projectPath:r.projectPath},userId:t,mirror:{userId:t,projectPath:r.projectPath}})}}catch{}return e.json({closed:!0})});O();ml();import{createHash as CC}from"node:crypto";import{Hono as OC}from"hono";import{z as fl}from"zod";import{eq as Yn,and as r0,sql as _s}from"drizzle-orm";function zt(e){let t=e;for(;t&&typeof t=="object";){let n=t.code;if(typeof n=="string")return n;t=t.cause}}d(zt,"findPgCode");function vo(e){let t=[],n=e;for(;n&&typeof n=="object";){let r=n.message;typeof r=="string"&&t.push(r),n=n.cause}return t.join(`
399
- `)}d(vo,"findPgMessage");import{createHash as PC}from"node:crypto";function e0(e){if(!e||typeof e!="object")return null;let t=e,n=t._importContentHash,r=t._importContentLen,o=t._importEventCount;return typeof n!="string"||n.length===0||typeof r!="number"||!Number.isInteger(r)||r<0||typeof o!="number"||!Number.isInteger(o)||o<0?null:{contentHash:n,contentLen:r,eventCount:o}}d(e0,"readImportMarker");function t0(e,t){return e.length<=t.contentLen?!1:PC("sha256").update(e.slice(0,t.contentLen)).digest("hex")===t.contentHash}d(t0,"isStrictContentExtension");var n0=new Set(["claude_code","codex"]);var gl=new OC,o0=fl.object({content:fl.string().min(1),tool:fl.string().optional(),orgId:fl.string().uuid().nullable().optional()});function DC(e){for(let t of[e.metadata?.sessionId,e.metadata?.codexSessionId])if(typeof t=="string"&&t.length>0)return t;return null}d(DC,"importedExternalSessionId");gl.post("/sessions/:id/reimport",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=o0.parse(r),[s]=await u.select({id:_.id,eventCount:_.eventCount,externalSessionId:_.externalSessionId,projectId:_.projectId}).from(_).where(r0(Yn(_.id,n),Yn(_.userId,t)));if(!s)return e.json({error:"Session not found"},404);let i=o.tool??kc(o.content);if(!i)return e.json({error:"Could not detect session format. Specify tool parameter."},400);let c=Rc(i).parse(o.content);if(c.events.length===s.eventCount)return await el(n,t,s.externalSessionId,s.projectId,s.eventCount??0),e.json({reimported:!1,skipped:"unchanged",eventCount:s.eventCount});if(c.events.length===0&&(s.eventCount??0)>0)return await u.update(_).set({endedAt:c.endedAt?new Date(c.endedAt):new Date}).where(Yn(_.id,n)),await el(n,t,s.externalSessionId,s.projectId,s.eventCount??0),e.json({reimported:!1,skipped:"empty_parse",eventCount:s.eventCount});let l=c.events.map(p=>({sessionId:n,sequence:p.sequence,eventType:p.eventType,content:p.content,toolName:p.toolName,toolInput:p.toolInput,toolOutput:p.toolOutput,tokenUsage:p.tokenUsage,timestamp:new Date(p.timestamp),metadata:p.metadata}));return await nt.transaction(async p=>{await p.execute(_s`SET LOCAL statement_timeout = '60s'`),await p.delete(qe).where(Yn(qe.sessionId,n));for(let m=0;m<l.length;m+=500)await p.insert(qe).values(l.slice(m,m+500));await p.update(_).set({eventCount:c.events.length,endedAt:c.endedAt?new Date(c.endedAt):new Date,projectPath:c.projectPath??void 0,gitBranch:c.gitBranch??void 0,metadata:c.metadata?_s`COALESCE(${_.metadata}, '{}'::jsonb) || ${JSON.stringify(c.metadata)}::jsonb`:void 0,model:gs(c.metadata?.model)??void 0,harnessVersion:Si(c.metadata)??void 0}).where(Yn(_.id,n))}),await el(n,t,s.externalSessionId,s.projectId,c.events.length),e.json({reimported:!0,eventCount:c.events.length})});gl.post("/sessions/import",async e=>{let t=e.get("userId"),n=await e.req.json(),r=o0.parse(n),o=r.tool??kc(r.content);if(!o)return e.json({error:"Could not detect session format. Specify tool parameter."},400);let i=Rc(o).parse(r.content),a=DC(i),c=CC("sha256").update(r.content).digest("hex"),l,p=d(async()=>(l===void 0&&(l=await _o(t,r.orgId??null)),l),"resolveOrgId"),m=i.events.map(h=>({sequence:h.sequence,eventType:h.eventType,content:h.content,toolName:h.toolName,toolInput:h.toolInput,toolOutput:h.toolOutput,tokenUsage:h.tokenUsage,timestamp:new Date(h.timestamp),metadata:h.metadata})),y={...i.metadata??{},_importContentHash:c,_importContentLen:r.content.length,_importEventCount:i.events.length},v=3;for(let h=0;;h++){let f=a?(await u.select().from(_).where(r0(Yn(_.userId,t),Yn(_.externalSessionId,a))).limit(1))[0]??null:null;if(f&&f.metadata?._importContentHash===c)return e.json({...f,deduped:!0},200);let w=await p(),b=f?{tool:i.tool,projectPath:i.projectPath??void 0,gitBranch:i.gitBranch??void 0,startedAt:new Date(i.startedAt),endedAt:i.endedAt?new Date(i.endedAt):void 0,eventCount:i.events.length,metadata:_s`COALESCE(${_.metadata}, '{}'::jsonb) || ${JSON.stringify(y)}::jsonb`,model:gs(i.metadata?.model)??void 0,harnessVersion:Si(i.metadata)??void 0,...w&&!f.orgId?{orgId:w}:{}}:null;try{if(f&&b&&n0.has(i.tool)){let S=e0(f.metadata);if(S&&m.length>S.eventCount&&m[S.eventCount]?.sequence===S.eventCount&&t0(r.content,S)){let[A]=await u.select({count:_s`COUNT(*)::int`,maxSeq:_s`MAX(${qe.sequence})::int`}).from(qe).where(Yn(qe.sessionId,f.id)),E=Number(A?.count??-1),R=A?.maxSeq==null?null:Number(A.maxSeq);if(E===S.eventCount&&(S.eventCount===0?R===null:R===S.eventCount-1)){let j=await nt.transaction(async P=>{await P.execute(_s`SET LOCAL statement_timeout = '60s'`);let $=m.slice(S.eventCount).map(B=>({sessionId:f.id,...B}));for(let B=0;B<$.length;B+=500)await P.insert(qe).values($.slice(B,B+500));let[H]=await P.update(_).set(b).where(Yn(_.id,f.id)).returning();return H});return e.json({...j,appended:!0},200)}}}let I=await nt.transaction(async S=>{if(await S.execute(_s`SET LOCAL statement_timeout = '60s'`),f&&b){if(await S.delete(qe).where(Yn(qe.sessionId,f.id)),m.length>0){let R=m.map(D=>({sessionId:f.id,...D}));for(let D=0;D<R.length;D+=500)await S.insert(qe).values(R.slice(D,D+500))}let[E]=await S.update(_).set(b).where(Yn(_.id,f.id)).returning();return E}let[A]=await S.insert(_).values({userId:t,externalSessionId:a,tool:i.tool,projectPath:i.projectPath,gitBranch:i.gitBranch,startedAt:new Date(i.startedAt),endedAt:i.endedAt?new Date(i.endedAt):null,eventCount:i.events.length,metadata:y,model:gs(i.metadata?.model),harnessVersion:Si(i.metadata),orgId:w}).returning();if(m.length>0){let E=m.map(R=>({sessionId:A.id,...R}));for(let R=0;R<E.length;R+=500)await S.insert(qe).values(E.slice(R,R+500))}return A});return e.json(I,f?200:201)}catch(I){if(a&&zt(I)==="23505"&&h<v)continue;throw I}}});var Di=new MC;Di.route("/",Hf);Di.route("/",Wf);Di.route("/",Vf);Di.route("/",gl);O();import{Hono as LC}from"hono";import{eq as nn,and as Mi,asc as i0,desc as mg,sql as Ue,or as s0,ilike as $C,inArray as hl}from"drizzle-orm";var Li=new LC;Li.get("/sessions",async e=>{let t=e.get("userId"),n=e.req.query("tool"),r=e.req.query("outcome"),o=e.req.query("friction"),s=e.req.query("instructionId"),i=e.req.query("hasAnalysis"),a=e.req.query("projectPath"),c=e.req.query("projectId"),l=e.req.query("gitRemote"),p=Number(e.req.query("limit")??"50"),m=Number(e.req.query("offset")??"0"),y=[nn(_.userId,t)];if(e.req.query("includeInternal")==="true"||y.push(Ue`${_.origin} <> 'internal_worker'`),n&&y.push(nn(_.tool,n)),c){let w=[nn(_.projectId,c)];l&&w.push(Ue`${_.metadata}->>'gitRemote' = ${l}`),y.push(w.length===1?w[0]:s0(...w))}else if(a||l){let w=[];a&&w.push($C(_.projectPath,`%${ot(a)}%`)),l&&w.push(Ue`${_.metadata}->>'gitRemote' = ${l}`),y.push(w.length===1?w[0]:s0(...w))}if(e.req.query("hideEmpty")!=="false"&&y.push(Ue`${_.eventCount} > 0`),i==="true"?y.push(Ue`${_.analysis} IS NOT NULL`):i==="false"&&y.push(Ue`${_.analysis} IS NULL`),r&&y.push(Ue`${_.analysis}->>'outcome' = ${r}`),o&&y.push(Ue`(${_.analysis}->'friction')::text ILIKE ${"%"+ot(o)+"%"}`),s){let b=(await u.select({sessionId:se.sessionId}).from(se).where(nn(se.instructionId,s))).map(I=>I.sessionId);if(b.length===0)return e.json([]);y.push(Ue`${_.id} IN (${Ue.join(b.map(I=>Ue`${I}`),Ue`, `)})`)}if(e.req.query("summary")==="exists"){let[w]=await u.select({id:_.id}).from(_).where(Mi(...y)).limit(1);return e.json({exists:!!w})}let f=await u.select().from(_).where(Mi(...y)).orderBy(mg(_.startedAt)).limit(p).offset(m);if(f.length>0){let w=f.map(N=>N.id),b=Array.from(new Set(f.map(N=>N.projectId).filter(N=>!!N))),[I,S,A,E,R,D,j]=await Promise.all([u.select({sessionId:se.sessionId,name:g.name,contextIdentity:g.contextIdentity,type:g.type,source:Ue`${g.frontmatter}->>'source'`}).from(se).innerJoin(g,nn(g.id,se.instructionId)).where(hl(se.sessionId,w)),u.select({sessionId:L.sessionId}).from(L).where(hl(L.sessionId,w)).groupBy(L.sessionId),u.execute(Ue`
317
+ `))[0]?.sequence??_??1;break}catch(f){let w=f.cause;if(f instanceof Error&&(w?.code==="23505"||f.message.includes("unique")||f.message.includes("duplicate"))&&h<I){_=void 0;continue}throw f}if(o.instructionIds&&o.instructionIds.length>0)for(let h of o.instructionIds)try{await d.insert(se).values({sessionId:n,instructionId:h,linkMethod:"auto_capture"}).onConflictDoNothing()}catch(f){console.warn("[events ingest] failed to auto-link instructionId:",f instanceof Error?f.message:f)}try{let h=i+1,w=[5,20,50].filter(b=>i<b&&h>=b);for(let b of w)await Qd({sessionId:s.id,milestone:b,userId:s.userId})}catch(h){console.warn("[events ingest] failed to enqueue process_session_goal:",h instanceof Error?h.message:h)}return e.json({recorded:!0})});C();import{Hono as IN}from"hono";import{eq as hs,and as tl,desc as bN,sql as SN,ilike as Bf,gte as Lv}from"drizzle-orm";var Ff=new IN;Ff.post("/sessions/:id/close",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select({id:y.id,projectPath:y.projectPath}).from(y).where(tl(hs(y.id,n),hs(y.userId,t)));if(!r)return e.json({error:"Session not found"},404);if(await d.update(y).set({endedAt:new Date}).where(hs(y.id,n)),r.projectPath)try{let o=new Date;o.setHours(0,0,0,0);let[s]=await d.select({id:W.id}).from(W).where(tl(hs(W.userId,t),Lv(W.createdAt,o),Bf(W.projectPath,`%${rt(r.projectPath)}%`))).limit(1);if(!s){let[i]=await d.select({completedAt:W.completedAt}).from(W).where(tl(hs(W.userId,t),hs(W.status,"completed"),Bf(W.projectPath,`%${rt(r.projectPath)}%`))).orderBy(bN(W.completedAt)).limit(1),c=i?.completedAt??new Date(0),[{count:a}]=await d.select({count:SN`COUNT(*)`}).from(y).where(tl(hs(y.userId,t),Bf(y.projectPath,`%${rt(r.projectPath)}%`),Lv(y.startedAt,c)));Number(a)>=5&&await Tt({taskName:"process_insights",payload:{projectPath:r.projectPath},userId:t,mirror:{userId:t,projectPath:r.projectPath}})}}catch{}return e.json({closed:!0})});C();ml();import{createHash as qj}from"node:crypto";import{Hono as Uj}from"hono";import{z as pl}from"zod";import{eq as Xn,and as zI,sql as _s}from"drizzle-orm";function Ft(e){let t=e;for(;t&&typeof t=="object";){let n=t.code;if(typeof n=="string")return n;t=t.cause}}u(Ft,"findPgCode");function vo(e){let t=[],n=e;for(;n&&typeof n=="object";){let r=n.message;typeof r=="string"&&t.push(r),n=n.cause}return t.join(`
318
+ `)}u(vo,"findPgMessage");import{createHash as $j}from"node:crypto";function BI(e){if(!e||typeof e!="object")return null;let t=e,n=t._importContentHash,r=t._importContentLen,o=t._importEventCount;return typeof n!="string"||n.length===0||typeof r!="number"||!Number.isInteger(r)||r<0||typeof o!="number"||!Number.isInteger(o)||o<0?null:{contentHash:n,contentLen:r,eventCount:o}}u(BI,"readImportMarker");function FI(e,t){return e.length<=t.contentLen?!1:$j("sha256").update(e.slice(0,t.contentLen)).digest("hex")===t.contentHash}u(FI,"isStrictContentExtension");var WI=new Set(["claude_code","codex"]);var fl=new Uj,VI=pl.object({content:pl.string().min(1),tool:pl.string().optional(),orgId:pl.string().uuid().nullable().optional()});function Hj(e){for(let t of[e.metadata?.sessionId,e.metadata?.codexSessionId])if(typeof t=="string"&&t.length>0)return t;return null}u(Hj,"importedExternalSessionId");fl.post("/sessions/:id/reimport",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=VI.parse(r),[s]=await d.select({id:y.id,eventCount:y.eventCount,externalSessionId:y.externalSessionId,projectId:y.projectId}).from(y).where(zI(Xn(y.id,n),Xn(y.userId,t)));if(!s)return e.json({error:"Session not found"},404);let i=o.tool??Rc(o.content);if(!i)return e.json({error:"Could not detect session format. Specify tool parameter."},400);let a=Tc(i).parse(o.content);if(a.events.length===s.eventCount)return await Zd(n,t,s.externalSessionId,s.projectId,s.eventCount??0),e.json({reimported:!1,skipped:"unchanged",eventCount:s.eventCount});if(a.events.length===0&&(s.eventCount??0)>0)return await d.update(y).set({endedAt:a.endedAt?new Date(a.endedAt):new Date}).where(Xn(y.id,n)),await Zd(n,t,s.externalSessionId,s.projectId,s.eventCount??0),e.json({reimported:!1,skipped:"empty_parse",eventCount:s.eventCount});let l=a.events.map(m=>({sessionId:n,sequence:m.sequence,eventType:m.eventType,content:m.content,toolName:m.toolName,toolInput:m.toolInput,toolOutput:m.toolOutput,tokenUsage:m.tokenUsage,timestamp:new Date(m.timestamp),metadata:m.metadata}));return await tt.transaction(async m=>{await m.execute(_s`SET LOCAL statement_timeout = '60s'`),await m.delete($e).where(Xn($e.sessionId,n));for(let p=0;p<l.length;p+=500)await m.insert($e).values(l.slice(p,p+500));await m.update(y).set({eventCount:a.events.length,endedAt:a.endedAt?new Date(a.endedAt):new Date,projectPath:a.projectPath??void 0,gitBranch:a.gitBranch??void 0,metadata:a.metadata?_s`COALESCE(${y.metadata}, '{}'::jsonb) || ${JSON.stringify(a.metadata)}::jsonb`:void 0,model:gs(a.metadata?.model)??void 0,harnessVersion:bi(a.metadata)??void 0}).where(Xn(y.id,n))}),await Zd(n,t,s.externalSessionId,s.projectId,a.events.length),e.json({reimported:!0,eventCount:a.events.length})});fl.post("/sessions/import",async e=>{let t=e.get("userId"),n=await e.req.json(),r=VI.parse(n),o=r.tool??Rc(r.content);if(!o)return e.json({error:"Could not detect session format. Specify tool parameter."},400);let i=Tc(o).parse(r.content),c=Hj(i),a=qj("sha256").update(r.content).digest("hex"),l,m=u(async()=>(l===void 0&&(l=await _o(t,r.orgId??null)),l),"resolveOrgId"),p=i.events.map(h=>({sequence:h.sequence,eventType:h.eventType,content:h.content,toolName:h.toolName,toolInput:h.toolInput,toolOutput:h.toolOutput,tokenUsage:h.tokenUsage,timestamp:new Date(h.timestamp),metadata:h.metadata})),_={...i.metadata??{},_importContentHash:a,_importContentLen:r.content.length,_importEventCount:i.events.length},I=3;for(let h=0;;h++){let f=c?(await d.select().from(y).where(zI(Xn(y.userId,t),Xn(y.externalSessionId,c))).limit(1))[0]??null:null;if(f&&f.metadata?._importContentHash===a)return e.json({...f,deduped:!0},200);let w=await m(),b=f?{tool:i.tool,projectPath:i.projectPath??void 0,gitBranch:i.gitBranch??void 0,startedAt:new Date(i.startedAt),endedAt:i.endedAt?new Date(i.endedAt):void 0,eventCount:i.events.length,metadata:_s`COALESCE(${y.metadata}, '{}'::jsonb) || ${JSON.stringify(_)}::jsonb`,model:gs(i.metadata?.model)??void 0,harnessVersion:bi(i.metadata)??void 0,...w&&!f.orgId?{orgId:w}:{}}:null;try{if(f&&b&&WI.has(i.tool)){let S=BI(f.metadata);if(S&&p.length>S.eventCount&&p[S.eventCount]?.sequence===S.eventCount&&FI(r.content,S)){let[A]=await d.select({count:_s`COUNT(*)::int`,maxSeq:_s`MAX(${$e.sequence})::int`}).from($e).where(Xn($e.sessionId,f.id)),E=Number(A?.count??-1),R=A?.maxSeq==null?null:Number(A.maxSeq);if(E===S.eventCount&&(S.eventCount===0?R===null:R===S.eventCount-1)){let N=await tt.transaction(async D=>{await D.execute(_s`SET LOCAL statement_timeout = '60s'`);let q=p.slice(S.eventCount).map(B=>({sessionId:f.id,...B}));for(let B=0;B<q.length;B+=500)await D.insert($e).values(q.slice(B,B+500));let[H]=await D.update(y).set(b).where(Xn(y.id,f.id)).returning();return H});return e.json({...N,appended:!0},200)}}}let v=await tt.transaction(async S=>{if(await S.execute(_s`SET LOCAL statement_timeout = '60s'`),f&&b){if(await S.delete($e).where(Xn($e.sessionId,f.id)),p.length>0){let R=p.map(P=>({sessionId:f.id,...P}));for(let P=0;P<R.length;P+=500)await S.insert($e).values(R.slice(P,P+500))}let[E]=await S.update(y).set(b).where(Xn(y.id,f.id)).returning();return E}let[A]=await S.insert(y).values({userId:t,externalSessionId:c,tool:i.tool,projectPath:i.projectPath,gitBranch:i.gitBranch,startedAt:new Date(i.startedAt),endedAt:i.endedAt?new Date(i.endedAt):null,eventCount:i.events.length,metadata:_,model:gs(i.metadata?.model),harnessVersion:bi(i.metadata),orgId:w}).returning();if(p.length>0){let E=p.map(R=>({sessionId:A.id,...R}));for(let R=0;R<E.length;R+=500)await S.insert($e).values(E.slice(R,R+500))}return A});return e.json(v,f?200:201)}catch(v){if(c&&Ft(v)==="23505"&&h<I)continue;throw v}}});var Oi=new Bj;Oi.route("/",$f);Oi.route("/",Hf);Oi.route("/",Ff);Oi.route("/",fl);C();import{Hono as Fj}from"hono";import{eq as tn,and as Ci,asc as KI,desc as dg,sql as qe,or as JI,ilike as Wj,inArray as gl}from"drizzle-orm";var Li=new Fj;Li.get("/sessions",async e=>{let t=e.get("userId"),n=e.req.query("tool"),r=e.req.query("outcome"),o=e.req.query("friction"),s=e.req.query("instructionId"),i=e.req.query("hasAnalysis"),c=e.req.query("projectPath"),a=e.req.query("projectId"),l=e.req.query("gitRemote"),m=Number(e.req.query("limit")??"50"),p=Number(e.req.query("offset")??"0"),_=[tn(y.userId,t)];if(e.req.query("includeInternal")==="true"||_.push(qe`${y.origin} <> 'internal_worker'`),n&&_.push(tn(y.tool,n)),a){let w=[tn(y.projectId,a)];l&&w.push(qe`${y.metadata}->>'gitRemote' = ${l}`),_.push(w.length===1?w[0]:JI(...w))}else if(c||l){let w=[];c&&w.push(Wj(y.projectPath,`%${rt(c)}%`)),l&&w.push(qe`${y.metadata}->>'gitRemote' = ${l}`),_.push(w.length===1?w[0]:JI(...w))}if(e.req.query("hideEmpty")!=="false"&&_.push(qe`${y.eventCount} > 0`),i==="true"?_.push(qe`${y.analysis} IS NOT NULL`):i==="false"&&_.push(qe`${y.analysis} IS NULL`),r&&_.push(qe`${y.analysis}->>'outcome' = ${r}`),o&&_.push(qe`(${y.analysis}->'friction')::text ILIKE ${"%"+rt(o)+"%"}`),s){let b=(await d.select({sessionId:se.sessionId}).from(se).where(tn(se.instructionId,s))).map(v=>v.sessionId);if(b.length===0)return e.json([]);_.push(qe`${y.id} IN (${qe.join(b.map(v=>qe`${v}`),qe`, `)})`)}if(e.req.query("summary")==="exists"){let[w]=await d.select({id:y.id}).from(y).where(Ci(..._)).limit(1);return e.json({exists:!!w})}let f=await d.select().from(y).where(Ci(..._)).orderBy(dg(y.startedAt)).limit(m).offset(p);if(f.length>0){let w=f.map(j=>j.id),b=Array.from(new Set(f.map(j=>j.projectId).filter(j=>!!j))),[v,S,A,E,R,P,N]=await Promise.all([d.select({sessionId:se.sessionId,name:g.name,contextIdentity:g.contextIdentity,type:g.type,source:qe`${g.frontmatter}->>'source'`}).from(se).innerJoin(g,tn(g.id,se.instructionId)).where(gl(se.sessionId,w)),d.select({sessionId:$.sessionId}).from($).where(gl($.sessionId,w)).groupBy($.sessionId),d.execute(qe`
400
319
  SELECT session_id, MAX(timestamp) AS last_at
401
320
  FROM session_events
402
- WHERE session_id IN (${Ue.join(w.map(N=>Ue`${N}`),Ue`, `)})
321
+ WHERE session_id IN (${qe.join(w.map(j=>qe`${j}`),qe`, `)})
403
322
  GROUP BY session_id
404
- `),u.execute(Ue`
323
+ `),d.execute(qe`
405
324
  SELECT DISTINCT ON (e.session_id)
406
325
  e.session_id,
407
326
  -- Collapse whitespace runs into a single space for preview rendering.
@@ -411,27 +330,27 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
411
330
  -- lowercase s from every preview ever shown.
412
331
  LEFT(REGEXP_REPLACE(COALESCE(e.content, ''), '[[:space:]]+', ' ', 'g'), 120) AS preview
413
332
  FROM session_events e
414
- WHERE e.session_id IN (${Ue.join(w.map(N=>Ue`${N}`),Ue`, `)})
333
+ WHERE e.session_id IN (${qe.join(w.map(j=>qe`${j}`),qe`, `)})
415
334
  AND e.event_type IN ('user_message', 'human')
416
335
  AND e.content IS NOT NULL
417
336
  AND e.content <> ''
418
337
  ORDER BY e.session_id, e.timestamp DESC
419
- `),u.execute(Ue`
338
+ `),d.execute(qe`
420
339
  SELECT DISTINCT ON (e.session_id)
421
340
  e.session_id,
422
341
  LEFT(REGEXP_REPLACE(COALESCE(e.content, ''), '[[:space:]]+', ' ', 'g'), 240) AS first_prompt
423
342
  FROM session_events e
424
- WHERE e.session_id IN (${Ue.join(w.map(N=>Ue`${N}`),Ue`, `)})
343
+ WHERE e.session_id IN (${qe.join(w.map(j=>qe`${j}`),qe`, `)})
425
344
  AND e.event_type IN ('user_message', 'human')
426
345
  AND e.content IS NOT NULL
427
346
  AND e.content <> ''
428
347
  ORDER BY e.session_id, e.timestamp ASC
429
- `),b.length>0?u.select({id:U.id,name:U.name}).from(U).where(hl(U.id,b)):Promise.resolve([]),b.length>0?u.execute(Ue`
348
+ `),b.length>0?d.select({id:M.id,name:M.name}).from(M).where(gl(M.id,b)):Promise.resolve([]),b.length>0?d.execute(qe`
430
349
  SELECT DISTINCT ON (project_id) project_id, path
431
350
  FROM project_checkouts
432
- WHERE project_id IN (${Ue.join(b.map(N=>Ue`${N}`),Ue`, `)})
351
+ WHERE project_id IN (${qe.join(b.map(j=>qe`${j}`),qe`, `)})
433
352
  ORDER BY project_id, is_worktree ASC, last_seen DESC
434
- `):Promise.resolve([])]),P=new Map;for(let N of I){let me=P.get(N.sessionId)??[];me.push({name:N.name,contextIdentity:N.contextIdentity,type:N.type,source:N.source}),P.set(N.sessionId,me)}let $=new Set;for(let N of S)N.sessionId&&$.add(N.sessionId);let H=new Map;for(let N of A)H.set(N.session_id,N.last_at);let B=new Map;for(let N of E)B.set(N.session_id,N.preview);let te=new Map;for(let N of R)te.set(N.session_id,N.first_prompt);let _e=new Map,ee=new Map;for(let N of D)_e.set(N.id,N.name);for(let N of j)ee.set(N.project_id,N.path);let Re=f.map(N=>({...N,linkedInstructions:P.get(N.id)??[],dataTier:$.has(N.id)?"full":(N.eventCount??0)>0?"events":"imported",lastMessagePreview:B.get(N.id)??N.analysis?.goalSummary??null,firstUserPrompt:te.get(N.id)??null,projectName:N.projectId?_e.get(N.projectId)??null:null,primaryCheckoutPath:N.projectId?ee.get(N.projectId)??null:null,lastActivityAt:H.get(N.id)??N.startedAt}));return e.json(Re)}return e.json(f)});Li.get("/sessions/project-paths",async e=>{let t=e.get("userId"),n=e.req.query("since"),r=Number(e.req.query("limit")??"20"),o=Math.min(Math.max(r,1),50),s=n?new Date(n):new Date(Date.now()-720*60*60*1e3);if(isNaN(s.getTime()))return e.json({error:"Invalid since timestamp"},400);let i=await u.execute(Ue`
353
+ `):Promise.resolve([])]),D=new Map;for(let j of v){let me=D.get(j.sessionId)??[];me.push({name:j.name,contextIdentity:j.contextIdentity,type:j.type,source:j.source}),D.set(j.sessionId,me)}let q=new Set;for(let j of S)j.sessionId&&q.add(j.sessionId);let H=new Map;for(let j of A)H.set(j.session_id,j.last_at);let B=new Map;for(let j of E)B.set(j.session_id,j.preview);let ee=new Map;for(let j of R)ee.set(j.session_id,j.first_prompt);let he=new Map,te=new Map;for(let j of P)he.set(j.id,j.name);for(let j of N)te.set(j.project_id,j.path);let Te=f.map(j=>({...j,linkedInstructions:D.get(j.id)??[],dataTier:q.has(j.id)?"full":(j.eventCount??0)>0?"events":"imported",lastMessagePreview:B.get(j.id)??j.analysis?.goalSummary??null,firstUserPrompt:ee.get(j.id)??null,projectName:j.projectId?he.get(j.projectId)??null:null,primaryCheckoutPath:j.projectId?te.get(j.projectId)??null:null,lastActivityAt:H.get(j.id)??j.startedAt}));return e.json(Te)}return e.json(f)});Li.get("/sessions/project-paths",async e=>{let t=e.get("userId"),n=e.req.query("since"),r=Number(e.req.query("limit")??"20"),o=Math.min(Math.max(r,1),50),s=n?new Date(n):new Date(Date.now()-720*60*60*1e3);if(isNaN(s.getTime()))return e.json({error:"Invalid since timestamp"},400);let i=await d.execute(qe`
435
354
  WITH recent AS (
436
355
  SELECT
437
356
  s.project_id,
@@ -487,14 +406,14 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
487
406
  ) deduped
488
407
  ORDER BY last_activity DESC
489
408
  LIMIT ${o}
490
- `),a=Array.from(i).map(c=>c.project_path).filter(c=>typeof c=="string"&&c!=="");return e.json({projectPaths:a})});Li.get("/sessions/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(_).where(Mi(nn(_.id,n),nn(_.userId,t)));if(!r)return e.json({error:"Session not found"},404);let o=await u.select({instructionId:se.instructionId,linkMethod:se.linkMethod,name:g.name,contextIdentity:g.contextIdentity,content:g.content,scope:g.scope,type:g.type,frontmatter:g.frontmatter}).from(se).innerJoin(g,nn(g.id,se.instructionId)).where(Mi(nn(se.sessionId,n),Ue`${g.content} IS NOT NULL AND ${g.content} != ''`)),s=await u.select({eventType:qe.eventType,count:Ue`count(*)::int`}).from(qe).where(nn(qe.sessionId,n)).groupBy(qe.eventType),i={};for(let l of s)i[l.eventType]=Number(l.count);let a=null,c=null;if(r.projectId){let[l]=await u.select({name:U.name}).from(U).where(nn(U.id,r.projectId));a=l?.name??null;let[p]=await u.select({path:le.path}).from(le).where(nn(le.projectId,r.projectId)).orderBy(i0(le.isWorktree),mg(le.lastSeen)).limit(1);c=p?.path??null}return e.json({...r,linkedInstructions:o.map(l=>({...l,source:Au(l.frontmatter)})),projectName:a,primaryCheckoutPath:c,eventCounts:{total:Object.values(i).reduce((l,p)=>l+p,0),messages:(i.user_message??0)+(i.assistant_message??0),toolCalls:i.tool_call??0,assistantResponses:i.assistant_response??0,byType:i}})});Li.get("/sessions/:id/events",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=Number(e.req.query("limit")??"100"),o=Number(e.req.query("offset")??"0"),s=e.req.query("sort")==="desc"?"desc":"asc",i=(e.req.query("eventType")??"").split(",").map(m=>m.trim()).filter(Boolean),a=e.req.query("hasContent")==="true",[c]=await u.select({id:_.id}).from(_).where(Mi(nn(_.id,n),nn(_.userId,t)));if(!c)return e.json({error:"Session not found"},404);let l=[nn(qe.sessionId,n)];i.length>0&&l.push(hl(qe.eventType,i)),a&&l.push(Ue`${qe.content} IS NOT NULL AND ${qe.content} != ''`);let p=await u.select().from(qe).where(Mi(...l)).orderBy(s==="desc"?mg(qe.sequence):i0(qe.sequence)).limit(r).offset(o);return e.json(p)});O();import{Hono as qC}from"hono";import{z as Sn}from"zod";import{eq as Io,and as fg,sql as Hr}from"drizzle-orm";var $i=new qC;$i.post("/sessions/:id/analyze",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:_.id,tool:_.tool}).from(_).where(fg(Io(_.id,n),Io(_.userId,t)));if(!r)return e.json({error:"Session not found"},404);let{id:o}=await Rt({taskName:"process_insights",payload:{config:{type:"analyze_session",sessionId:n}},userId:t,mirror:{userId:t,config:{type:"analyze_session",sessionId:n}}});return e.json({jobId:o,status:"pending",tool:r.tool},202)});$i.post("/sessions/repair-analyzed-at",async e=>{let t=e.get("userId"),n=await u.execute(Hr`
409
+ `),c=Array.from(i).map(a=>a.project_path).filter(a=>typeof a=="string"&&a!=="");return e.json({projectPaths:c})});Li.get("/sessions/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select().from(y).where(Ci(tn(y.id,n),tn(y.userId,t)));if(!r)return e.json({error:"Session not found"},404);let o=await d.select({instructionId:se.instructionId,linkMethod:se.linkMethod,name:g.name,contextIdentity:g.contextIdentity,content:g.content,scope:g.scope,type:g.type,frontmatter:g.frontmatter}).from(se).innerJoin(g,tn(g.id,se.instructionId)).where(Ci(tn(se.sessionId,n),qe`${g.content} IS NOT NULL AND ${g.content} != ''`)),s=await d.select({eventType:$e.eventType,count:qe`count(*)::int`}).from($e).where(tn($e.sessionId,n)).groupBy($e.eventType),i={};for(let l of s)i[l.eventType]=Number(l.count);let c=null,a=null;if(r.projectId){let[l]=await d.select({name:M.name}).from(M).where(tn(M.id,r.projectId));c=l?.name??null;let[m]=await d.select({path:de.path}).from(de).where(tn(de.projectId,r.projectId)).orderBy(KI(de.isWorktree),dg(de.lastSeen)).limit(1);a=m?.path??null}return e.json({...r,linkedInstructions:o.map(l=>({...l,source:Ed(l.frontmatter)})),projectName:c,primaryCheckoutPath:a,eventCounts:{total:Object.values(i).reduce((l,m)=>l+m,0),messages:(i.user_message??0)+(i.assistant_message??0),toolCalls:i.tool_call??0,assistantResponses:i.assistant_response??0,byType:i}})});Li.get("/sessions/:id/events",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=Number(e.req.query("limit")??"100"),o=Number(e.req.query("offset")??"0"),s=e.req.query("sort")==="desc"?"desc":"asc",i=(e.req.query("eventType")??"").split(",").map(p=>p.trim()).filter(Boolean),c=e.req.query("hasContent")==="true",[a]=await d.select({id:y.id}).from(y).where(Ci(tn(y.id,n),tn(y.userId,t)));if(!a)return e.json({error:"Session not found"},404);let l=[tn($e.sessionId,n)];i.length>0&&l.push(gl($e.eventType,i)),c&&l.push(qe`${$e.content} IS NOT NULL AND ${$e.content} != ''`);let m=await d.select().from($e).where(Ci(...l)).orderBy(s==="desc"?dg($e.sequence):KI($e.sequence)).limit(r).offset(o);return e.json(m)});C();import{Hono as zj}from"hono";import{z as Sn}from"zod";import{eq as Io,and as lg,sql as Hr}from"drizzle-orm";var Mi=new zj;Mi.post("/sessions/:id/analyze",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select({id:y.id,tool:y.tool}).from(y).where(lg(Io(y.id,n),Io(y.userId,t)));if(!r)return e.json({error:"Session not found"},404);let{id:o}=await Tt({taskName:"process_insights",payload:{config:{type:"analyze_session",sessionId:n}},userId:t,mirror:{userId:t,config:{type:"analyze_session",sessionId:n}}});return e.json({jobId:o,status:"pending",tool:r.tool},202)});Mi.post("/sessions/repair-analyzed-at",async e=>{let t=e.get("userId"),n=await d.execute(Hr`
491
410
  UPDATE sessions
492
411
  SET analyzed_at = started_at
493
412
  WHERE user_id = ${t}
494
413
  AND analysis IS NOT NULL
495
414
  AND analyzed_at IS NULL
496
415
  RETURNING id
497
- `);return e.json({repaired:n.length})});var UC=Sn.object({metadata:Sn.record(Sn.unknown()).optional(),analysis:Sn.record(Sn.unknown()).optional(),analyzedEventCount:Sn.number().int().nonnegative().optional(),analyzedTurnCount:Sn.number().int().nonnegative().optional(),tokenUsage:Sn.object({inputTokens:Sn.number().optional(),outputTokens:Sn.number().optional(),cacheReadTokens:Sn.number().optional(),cacheWriteTokens:Sn.number().optional()}).optional(),externalSessionId:Sn.string().uuid().optional()}).strict();$i.patch("/sessions/:id/enrich",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=UC.parse(await e.req.json()),[o]=await u.select({id:_.id}).from(_).where(fg(Io(_.id,n),Io(_.userId,t)));if(!o)return e.json({error:"Session not found"},404);let s={};return r.metadata&&(s.metadata=Hr`COALESCE(${_.metadata}, '{}'::jsonb) || ${JSON.stringify(r.metadata)}::jsonb`),r.analysis&&(s.analysis=Hr`COALESCE(${_.analysis}, '{}'::jsonb) || ${JSON.stringify(r.analysis)}::jsonb`,s.analyzedAt=new Date),r.analyzedEventCount!=null&&(s.analyzedEventCount=r.analyzedEventCount),r.analyzedTurnCount!=null&&(s.analyzedTurnCount=r.analyzedTurnCount),r.tokenUsage&&(s.tokenUsage=r.tokenUsage),r.externalSessionId&&(s.externalSessionId=r.externalSessionId),Object.keys(s).length===0?e.json({error:"No enrichment data provided"},400):(await u.update(_).set(s).where(Io(_.id,n)),e.json({enriched:!0,fields:Object.keys(s)}))});$i.post("/sessions/:id/derive-enrichment",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:_.id,startedAt:_.startedAt,endedAt:_.endedAt,metadata:_.metadata}).from(_).where(fg(Io(_.id,n),Io(_.userId,t)));if(!r)return e.json({error:"Session not found"},404);let s=(await e.req.json().catch(()=>({}))).force===!0,a=r.metadata?.local_session_meta;if(a){if(!s)return e.json({skipped:!0,reason:"already_enriched"});if(!a.derived_from_events)return e.json({skipped:!0,reason:"hook_enriched"})}let[c]=await u.execute(Hr`
416
+ `);return e.json({repaired:n.length})});var Vj=Sn.object({metadata:Sn.record(Sn.unknown()).optional(),analysis:Sn.record(Sn.unknown()).optional(),analyzedEventCount:Sn.number().int().nonnegative().optional(),analyzedTurnCount:Sn.number().int().nonnegative().optional(),tokenUsage:Sn.object({inputTokens:Sn.number().optional(),outputTokens:Sn.number().optional(),cacheReadTokens:Sn.number().optional(),cacheWriteTokens:Sn.number().optional()}).optional(),externalSessionId:Sn.string().uuid().optional()}).strict();Mi.patch("/sessions/:id/enrich",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=Vj.parse(await e.req.json()),[o]=await d.select({id:y.id}).from(y).where(lg(Io(y.id,n),Io(y.userId,t)));if(!o)return e.json({error:"Session not found"},404);let s={};return r.metadata&&(s.metadata=Hr`COALESCE(${y.metadata}, '{}'::jsonb) || ${JSON.stringify(r.metadata)}::jsonb`),r.analysis&&(s.analysis=Hr`COALESCE(${y.analysis}, '{}'::jsonb) || ${JSON.stringify(r.analysis)}::jsonb`,s.analyzedAt=new Date),r.analyzedEventCount!=null&&(s.analyzedEventCount=r.analyzedEventCount),r.analyzedTurnCount!=null&&(s.analyzedTurnCount=r.analyzedTurnCount),r.tokenUsage&&(s.tokenUsage=r.tokenUsage),r.externalSessionId&&(s.externalSessionId=r.externalSessionId),Object.keys(s).length===0?e.json({error:"No enrichment data provided"},400):(await d.update(y).set(s).where(Io(y.id,n)),e.json({enriched:!0,fields:Object.keys(s)}))});Mi.post("/sessions/:id/derive-enrichment",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select({id:y.id,startedAt:y.startedAt,endedAt:y.endedAt,metadata:y.metadata}).from(y).where(lg(Io(y.id,n),Io(y.userId,t)));if(!r)return e.json({error:"Session not found"},404);let s=(await e.req.json().catch(()=>({}))).force===!0,c=r.metadata?.local_session_meta;if(c){if(!s)return e.json({skipped:!0,reason:"already_enriched"});if(!c.derived_from_events)return e.json({skipped:!0,reason:"hook_enriched"})}let[a]=await d.execute(Hr`
498
417
  WITH usage_rows AS (
499
418
  SELECT DISTINCT ON (coalesce(metadata->>'requestId', id::text))
500
419
  coalesce(
@@ -529,15 +448,15 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
529
448
  (SELECT max(timestamp) FROM session_events WHERE session_id = ${n}) AS last_ts,
530
449
  (SELECT coalesce(sum(input_tokens), 0)::bigint FROM usage_rows) AS input_tokens,
531
450
  (SELECT coalesce(sum(output_tokens), 0)::bigint FROM usage_rows) AS output_tokens
532
- `);if(!c||Number(c.total_events)===0)return e.json({skipped:!0,reason:"no_events"});let l=Number(c.user_message_count),p=Number(c.assistant_message_count),m=Number(c.input_tokens),y=Number(c.output_tokens),v=await u.execute(Hr`
451
+ `);if(!a||Number(a.total_events)===0)return e.json({skipped:!0,reason:"no_events"});let l=Number(a.user_message_count),m=Number(a.assistant_message_count),p=Number(a.input_tokens),_=Number(a.output_tokens),I=await d.execute(Hr`
533
452
  SELECT coalesce(tool_name, 'unknown') AS tool, count(*)::int AS n
534
453
  FROM session_events
535
454
  WHERE session_id = ${n}
536
455
  AND event_type IN ('tool_call', 'tool_use')
537
456
  GROUP BY 1
538
- `),h={};for(let $ of v)h[$.tool]=Number($.n);let f=d($=>Hr.raw(`CASE WHEN ${$} IS NULL OR ${$} = '' THEN 0
539
- ELSE length(${$}) - length(replace(${$}, chr(10), ''))
540
- + CASE WHEN right(${$}, 1) = chr(10) THEN 0 ELSE 1 END END`),"nl"),[w]=await u.execute(Hr`
457
+ `),h={};for(let q of I)h[q.tool]=Number(q.n);let f=u(q=>Hr.raw(`CASE WHEN ${q} IS NULL OR ${q} = '' THEN 0
458
+ ELSE length(${q}) - length(replace(${q}, chr(10), ''))
459
+ + CASE WHEN right(${q}, 1) = chr(10) THEN 0 ELSE 1 END END`),"nl"),[w]=await d.execute(Hr`
541
460
  WITH tool_events AS (
542
461
  SELECT
543
462
  tool_name,
@@ -585,7 +504,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
585
504
  count(*) FILTER (
586
505
  WHERE jsonb_typeof(tool_output) = 'object' AND tool_output ? 'error')::int AS tool_errors
587
506
  FROM tool_events
588
- `),b={ts:"TypeScript",tsx:"TypeScript",js:"JavaScript",jsx:"JavaScript",py:"Python",sh:"Shell",bash:"Shell",sql:"SQL",md:"Markdown",json:"JSON",yml:"YAML",yaml:"YAML",css:"CSS",html:"HTML",go:"Go",rs:"Rust",rb:"Ruby",java:"Java",toml:"TOML"},I=await u.execute(Hr`
507
+ `),b={ts:"TypeScript",tsx:"TypeScript",js:"JavaScript",jsx:"JavaScript",py:"Python",sh:"Shell",bash:"Shell",sql:"SQL",md:"Markdown",json:"JSON",yml:"YAML",yaml:"YAML",css:"CSS",html:"HTML",go:"Go",rs:"Rust",rb:"Ruby",java:"Java",toml:"TOML"},v=await d.execute(Hr`
589
508
  SELECT DISTINCT coalesce(tool_input->>'file_path', tool_input->>'notebook_path') AS path
590
509
  FROM session_events
591
510
  WHERE session_id = ${n}
@@ -593,7 +512,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
593
512
  AND tool_name IN ('Edit','MultiEdit','Write','NotebookEdit')
594
513
  AND jsonb_typeof(tool_input) = 'object'
595
514
  AND coalesce(tool_input->>'file_path', tool_input->>'notebook_path') IS NOT NULL
596
- `),S={};for(let $ of I){let H=$.path.split(".").pop()?.toLowerCase(),B=H?b[H]:void 0;B&&(S[B]=(S[B]??0)+1)}let A=c.first_ts,E=c.last_ts,D={duration_minutes:A&&E?Math.round((new Date(E).getTime()-new Date(A).getTime())/6e4):0,user_message_count:l,assistant_message_count:p,tool_counts:h,languages:S,git_commits:Number(w?.git_commits??0),git_pushes:Number(w?.git_pushes??0),user_interruptions:0,tool_errors:Number(w?.tool_errors??0),lines_added:Number(w?.lines_added??0),lines_removed:Number(w?.lines_removed??0),files_modified:Number(w?.files_modified??0),derived_from_events:!0},j=m>0||y>0?{input_tokens:m,output_tokens:y}:void 0,P={metadata:Hr`COALESCE(${_.metadata}, '{}'::jsonb) || ${JSON.stringify({local_session_meta:D})}::jsonb`};return j&&(P.tokenUsage=j),await u.update(_).set(P).where(Io(_.id,n)),e.json({enriched:!0,metrics:D})});O();import{Hono as YC}from"hono";import{z as Dc}from"zod";import{eq as kt,and as Mc,asc as XC,desc as QC,sql as qi}from"drizzle-orm";var HC=Number(process.env.PG_MESSAGE_RECONSTRUCT_BUDGET_BYTES)||16e6,BC=Number(process.env.PG_MESSAGE_RECONSTRUCT_PAGE_SIZE)||200;function FC(e){try{let t=JSON.stringify(e);return typeof t=="string"?t.length:0}catch{return 0}}d(FC,"estimateBytes");async function _l(e){let t=e.budgetBytes??HC,n=e.pageSize??BC,r=[],o=0,s=0,i=-1;for(;;){let a=await e.fetchPage(i,n);if(s++,a.length===0)break;for(let c of a){if(Array.isArray(c.messagesDelta))for(let l of c.messagesDelta){let p=FC(l);if(o+p>t)return{messages:r,truncated:!0,bytes:o,pages:s};r.push(l),o+=p}i=c.sequence}if(a.length<n)break}return{messages:r,truncated:!1,bytes:o,pages:s}}d(_l,"reconstructMessagesBounded");vl();O();import{inArray as GC}from"drizzle-orm";async function m0(e){let t=[...new Set(e.filter(r=>typeof r=="string"&&r.length>0))];if(t.length===0)return new Map;let n=await u.select({hash:_n.hash,content:_n.content}).from(_n).where(GC(_n.hash,t));return new Map(n.map(r=>[r.hash,r.content]))}d(m0,"fetchBlobMap");async function Il(e,t){return e?(await m0([e])).get(e)??t:t}d(Il,"resolveBlob");async function f0(e){if(e.length===0)return e;let t=await m0(e.flatMap(n=>[n.systemHash,n.toolsHash,n.injectedHash]));return t.size===0?e:e.map(n=>({...n,systemPrompt:t.get(n.systemHash)??n.systemPrompt,tools:p0(n.toolsHash!=null?t.get(n.toolsHash):void 0,n.tools),injectedInstructions:p0(n.injectedHash!=null?t.get(n.injectedHash):void 0,n.injectedInstructions)}))}d(f0,"resolveSnapshotBlobs");function p0(e,t){return Array.isArray(e)?e:t}d(p0,"preferArray");var KC=["x-anthropic-billing-header:","You are Claude Code, Anthropic","You are a Claude agent, built on Anthropic's Claude Agent SDK"];function g0(e){if(!e)return!1;let t=e.slice(0,400);return KC.some(n=>t.includes(n))}d(g0,"looksLikeHarnessSystemPrompt");Nf();function bl(){let e=new Map;return{run(t,n){let r=e.get(t);if(r)return r;let o=Promise.resolve().then(n).finally(()=>{e.delete(t)});return o.catch(()=>{}),e.set(t,o),o},get size(){return e.size}}}d(bl,"makeSingleFlight");var Lc=new YC;Lc.post("/sessions/:id/link",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),{instructionId:o}=Dc.object({instructionId:Dc.string().uuid()}).parse(r),[s]=await u.select({id:_.id}).from(_).where(Mc(kt(_.id,n),kt(_.userId,t)));return s?(await u.insert(se).values({sessionId:n,instructionId:o,linkMethod:"manual"}).onConflictDoNothing(),e.json({linked:!0})):e.json({error:"Session not found"},404)});Lc.get("/instructions/:id/insights",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await u.select({sessionId:se.sessionId,analysis:_.analysis,tool:_.tool,startedAt:_.startedAt}).from(se).innerJoin(_,kt(_.id,se.sessionId)).where(Mc(kt(se.instructionId,n),kt(_.userId,t))),o=r.filter(c=>c.analysis),s=o.map(c=>c.analysis),i=s.length>0?Math.round(s.reduce((c,l)=>c+(l.adherenceScore??0),0)/s.length):null,a=s.flatMap(c=>c.suggestions??[]).filter(c=>c.instructionId===n);return e.json({instructionId:n,totalSessions:r.length,analyzedSessions:o.length,averageAdherence:i,suggestions:a})});var wg=new Set(["claude_md","memory","skill_loaded"]);function ZC(e,t){return Qm(e,t)??`${e}::${t}`}d(ZC,"deriveContextIdentityForAutoCreate");function h0(e,t){return e==="claude_md"?`Auto-captured CLAUDE.md: ${t}`:e==="skill_loaded"?`Auto-captured skill: ${t}`:e==="memory"?`Auto-captured memory: ${t}`:`Auto-captured context: ${t}`}d(h0,"mapContextTypeToDescription");var eO=Dc.object({sessionId:Dc.string().uuid().optional(),backfill:Dc.boolean().optional()});async function tO(e,t,n,r){for(let s=0;s<=4;s++)try{await u.execute(qi`
515
+ `),S={};for(let q of v){let H=q.path.split(".").pop()?.toLowerCase(),B=H?b[H]:void 0;B&&(S[B]=(S[B]??0)+1)}let A=a.first_ts,E=a.last_ts,P={duration_minutes:A&&E?Math.round((new Date(E).getTime()-new Date(A).getTime())/6e4):0,user_message_count:l,assistant_message_count:m,tool_counts:h,languages:S,git_commits:Number(w?.git_commits??0),git_pushes:Number(w?.git_pushes??0),user_interruptions:0,tool_errors:Number(w?.tool_errors??0),lines_added:Number(w?.lines_added??0),lines_removed:Number(w?.lines_removed??0),files_modified:Number(w?.files_modified??0),derived_from_events:!0},N=p>0||_>0?{input_tokens:p,output_tokens:_}:void 0,D={metadata:Hr`COALESCE(${y.metadata}, '{}'::jsonb) || ${JSON.stringify({local_session_meta:P})}::jsonb`};return N&&(D.tokenUsage=N),await d.update(y).set(D).where(Io(y.id,n)),e.json({enriched:!0,metrics:P})});C();import{Hono as nP}from"hono";import{z as Oc}from"zod";import{eq as Rt,and as Cc,asc as rP,desc as oP,sql as $i}from"drizzle-orm";var Jj=Number(process.env.PG_MESSAGE_RECONSTRUCT_BUDGET_BYTES)||16e6,Kj=Number(process.env.PG_MESSAGE_RECONSTRUCT_PAGE_SIZE)||200;function Gj(e){try{let t=JSON.stringify(e);return typeof t=="string"?t.length:0}catch{return 0}}u(Gj,"estimateBytes");async function hl(e){let t=e.budgetBytes??Jj,n=e.pageSize??Kj,r=[],o=0,s=0,i=-1;for(;;){let c=await e.fetchPage(i,n);if(s++,c.length===0)break;for(let a of c){if(Array.isArray(a.messagesDelta))for(let l of a.messagesDelta){let m=Gj(l);if(o+m>t)return{messages:r,truncated:!0,bytes:o,pages:s};r.push(l),o+=m}i=a.sequence}if(c.length<n)break}return{messages:r,truncated:!1,bytes:o,pages:s}}u(hl,"reconstructMessagesBounded");wl();C();import{inArray as eP}from"drizzle-orm";async function tb(e){let t=[...new Set(e.filter(r=>typeof r=="string"&&r.length>0))];if(t.length===0)return new Map;let n=await d.select({hash:_n.hash,content:_n.content}).from(_n).where(eP(_n.hash,t));return new Map(n.map(r=>[r.hash,r.content]))}u(tb,"fetchBlobMap");async function vl(e,t){return e?(await tb([e])).get(e)??t:t}u(vl,"resolveBlob");async function nb(e){if(e.length===0)return e;let t=await tb(e.flatMap(n=>[n.systemHash,n.toolsHash,n.injectedHash]));return t.size===0?e:e.map(n=>({...n,systemPrompt:t.get(n.systemHash)??n.systemPrompt,tools:eb(n.toolsHash!=null?t.get(n.toolsHash):void 0,n.tools),injectedInstructions:eb(n.injectedHash!=null?t.get(n.injectedHash):void 0,n.injectedInstructions)}))}u(nb,"resolveSnapshotBlobs");function eb(e,t){return Array.isArray(e)?e:t}u(eb,"preferArray");var tP=["x-anthropic-billing-header:","You are Claude Code, Anthropic","You are a Claude agent, built on Anthropic's Claude Agent SDK"];function rb(e){if(!e)return!1;let t=e.slice(0,400);return tP.some(n=>t.includes(n))}u(rb,"looksLikeHarnessSystemPrompt");Tf();function Il(){let e=new Map;return{run(t,n){let r=e.get(t);if(r)return r;let o=Promise.resolve().then(n).finally(()=>{e.delete(t)});return o.catch(()=>{}),e.set(t,o),o},get size(){return e.size}}}u(Il,"makeSingleFlight");var Lc=new nP;Lc.post("/sessions/:id/link",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),{instructionId:o}=Oc.object({instructionId:Oc.string().uuid()}).parse(r),[s]=await d.select({id:y.id}).from(y).where(Cc(Rt(y.id,n),Rt(y.userId,t)));return s?(await d.insert(se).values({sessionId:n,instructionId:o,linkMethod:"manual"}).onConflictDoNothing(),e.json({linked:!0})):e.json({error:"Session not found"},404)});Lc.get("/instructions/:id/insights",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await d.select({sessionId:se.sessionId,analysis:y.analysis,tool:y.tool,startedAt:y.startedAt}).from(se).innerJoin(y,Rt(y.id,se.sessionId)).where(Cc(Rt(se.instructionId,n),Rt(y.userId,t))),o=r.filter(a=>a.analysis),s=o.map(a=>a.analysis),i=s.length>0?Math.round(s.reduce((a,l)=>a+(l.adherenceScore??0),0)/s.length):null,c=s.flatMap(a=>a.suggestions??[]).filter(a=>a.instructionId===n);return e.json({instructionId:n,totalSessions:r.length,analyzedSessions:o.length,averageAdherence:i,suggestions:c})});var hg=new Set(["claude_md","memory","skill_loaded"]);function sP(e,t){return Qp(e,t)??`${e}::${t}`}u(sP,"deriveContextIdentityForAutoCreate");function ob(e,t){return e==="claude_md"?`Auto-captured CLAUDE.md: ${t}`:e==="skill_loaded"?`Auto-captured skill: ${t}`:e==="memory"?`Auto-captured memory: ${t}`:`Auto-captured context: ${t}`}u(ob,"mapContextTypeToDescription");var iP=Oc.object({sessionId:Oc.string().uuid().optional(),backfill:Oc.boolean().optional()});async function aP(e,t,n,r){for(let s=0;s<=4;s++)try{await d.execute($i`
597
516
  insert into instruction_version_identities
598
517
  (instruction_id, content_hash, version_ordinal, content, first_seen_at, last_seen_at)
599
518
  select
@@ -615,8 +534,8 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
615
534
  first_seen_at = least(
616
535
  instruction_version_identities.first_seen_at, excluded.first_seen_at),
617
536
  content = coalesce(instruction_version_identities.content, excluded.content)
618
- `);return}catch(i){if(i.cause?.code==="23505"&&s<4)continue;console.warn(`[link-instructions] version identity registration failed for ${e}:`,i instanceof Error?i.message:i);return}}d(tO,"registerVersionIdentity");async function nO(e,t){let n=await u.select({id:g.id,contentHash:g.contentHash,name:g.name,contextIdentity:g.contextIdentity,contentLen:qi`COALESCE(LENGTH(${g.content}), 0)::int`}).from(g).where(kt(g.createdBy,e)),r=new Map,o=new Map;for(let I of n){let S=Number(I.contentLen??0);I.contentHash&&r.set(I.contentHash,{id:I.id,name:I.name??"",contentLen:S}),I.contextIdentity&&o.set(I.contextIdentity,{id:I.id,name:I.name??"",contentHash:I.contentHash})}let s=await nt.selectDistinctOn([L.sessionId],{id:L.id,sessionId:L.sessionId,metadata:L.metadata}).from(L).where(t?Mc(kt(L.userId,e),kt(L.sessionId,t)):kt(L.userId,e)).orderBy(L.sessionId,QC(L.capturedAt)).limit(1e3),i=new Set,a=new Set,c=new Map,l=0,p=0,m=0,y=0,v=new Set,h=[],f=new Map;for(let I of s){if(!I.sessionId||i.has(I.sessionId))continue;i.add(I.sessionId);let A=I.metadata?.contextItems??[],E=null;async function R(){if(E)return E;let[j]=await nt.select({injectedInstructions:L.injectedInstructions,injectedHash:L.injectedHash}).from(L).where(kt(L.id,I.id)).limit(1);return E=await Il(j?.injectedHash,j?.injectedInstructions??[]),E}d(R,"getInjected");async function D(){if(!I.sessionId)return[];let j=c.get(I.sessionId);if(j)return j;let P=I.sessionId,{messages:$}=await _l({fetchPage:d(async(B,te)=>Oc(await nt.select({sequence:L.sequence,messagesDelta:L.messagesDelta,messagesDeltaRef:L.messagesDeltaRef}).from(L).where(Mc(kt(L.sessionId,P),kt(L.userId,e),qi`${L.sequence} > ${B}`)).orderBy(XC(L.sequence)).limit(te)),"fetchPage")}),H=$;return c.set(I.sessionId,H),H}d(D,"getMessagesRaw");for(let j of A){let P=j.content_hash;if(!P)continue;a.add(P);let $=j.type??"",H=j.name??"";if(["user_input","core_system_prompt","available_tools","tool_definitions"].includes(H)||["system_reminder","system_prompt","hook_output","deferred_tools"].includes($)||["date_change","current_date","task_reminder","git_status","unknown_reminder","available_skills"].includes(H)||$==="skill_catalog"||!wg.has($)&&!$&&!H.includes(".md")&&!H.includes("rules"))continue;let B,te=!1,_e=null,ee=r.get(P);if(ee&&(B=ee.id,wg.has($)&&ee.contentLen===0&&(te=!0)),(!B||te)&&wg.has($)){let me=ZC($,H),M=j.instruction_index,ue=null,lt=M!=null?await R():[];if(M!=null&&lt[M])ue=lt[M];else if($==="skill_loaded"&&j.message_index!=null){let re=await D(),he=j.message_index,C=re[he];if(C){let oe=C.content,Ce=(Array.isArray(oe)?oe.find(Te=>Te.type==="tool_use"&&(Te.name==="Skill"||Te.name==="execute_skill")):void 0)?.id;if(Ce)for(let Te=he+1;Te<re.length&&Te<he+5;Te++){let Ye=re[Te];if(Ye?.role!=="user")continue;let Ht=Ye.content;if(!Array.isArray(Ht))continue;let jr=!1,Jo=[];for(let Zr of Ht)Zr.type==="tool_result"&&Zr.tool_use_id===Ce?jr=!0:Zr.type==="text"&&jr&&Jo.push(Zr.text??"");if(jr){ue=Jo.length>0?Jo.join(`
619
- `):null;break}}}}if(_e=ue,te&&ue&&B)try{await u.update(g).set({content:ue,updatedAt:new Date}).where(kt(g.id,B)),ee.contentLen=ue.length,m++}catch(re){console.warn(`[link-instructions] Content backfill failed for instruction ${B}:`,re instanceof Error?re.message:re),y++}let Be=o.get(me);if(Be&&Be.contentHash!==P){if(ue){let re=ue,he=4,C=!1;for(let oe=0;oe<=he;oe++)try{await u.transaction(async ve=>{await ve.select({id:g.id}).from(g).where(kt(g.id,Be.id)).for("update");let[{maxVersion:Ce}]=await ve.select({maxVersion:qi`COALESCE(MAX(${Ie.versionNumber}), 0)`}).from(Ie).where(kt(Ie.instructionId,Be.id)),Te=Ce+1;await ve.insert(Ie).values({instructionId:Be.id,versionNumber:Te,content:re,frontmatter:{name:H,description:h0($,H),type:"context_file",scope:"personal",version:`1.${Te}.0`},changeSummary:"Auto-detected content change from context snapshot",createdBy:e}),await ve.update(g).set({content:re,contentHash:P,version:`1.${Te}.0`,updatedAt:new Date}).where(kt(g.id,Be.id))}),C=!0;break}catch(ve){if(ve.cause?.code==="23505"&&oe<he)continue;console.warn(`[link-instructions] Version update failed for instruction ${Be.id} (identity: ${me}):`,ve instanceof Error?ve.message:ve),y++;break}C&&(r.set(P,{id:Be.id,name:Be.name,contentLen:re.length}),Be.contentHash=P,m++)}B=Be.id}else if(!Be)try{let re=H,he=h0($,H),C=ue??"",oe={name:re,description:he,type:"context_file",scope:"personal",version:"1.0.0"},ve;await u.transaction(async Ce=>{let[Te]=await Ce.insert(g).values({name:re,description:he,type:"context_file",scope:"personal",scopeRef:e,version:"1.0.0",content:C,frontmatter:oe,contentHash:P,contextIdentity:me,createdBy:e}).onConflictDoNothing().returning({id:g.id});Te&&(await Ce.insert(Ie).values({instructionId:Te.id,versionNumber:1,content:C,frontmatter:oe,changeSummary:"Auto-created from context snapshot",createdBy:e}),ve=Te.id)}),ve&&(r.set(P,{id:ve,name:re,contentLen:C.length}),o.set(me,{id:ve,name:re,contentHash:P}),B=ve,p++)}catch(re){console.warn(`[link-instructions] Auto-create failed for ${me}:`,re instanceof Error?re.message:re),y++;try{let[he]=await u.select({id:g.id}).from(g).where(Mc(kt(g.createdBy,e),kt(g.contextIdentity,me))).limit(1);he&&(B=he.id)}catch(he){console.warn(`[link-instructions] Fallback identity lookup also failed for ${me}:`,he instanceof Error?he.message:he)}}}if(!B||!I.sessionId)continue;let Re=`${B}:${P}`,N=f.get(Re);N?!N.content&&_e&&(N.content=_e):f.set(Re,{instructionId:B,contentHash:P,content:_e}),h.push({sessionId:I.sessionId,instructionId:B,linkMethod:"context_file",contentHash:P}),l++,v.add(I.sessionId)}}for(let I of f.values())await tO(I.instructionId,I.contentHash,I.content,new Date);for(let I=0;I<h.length;I+=500)try{await u.insert(se).values(h.slice(I,I+500)).onConflictDoUpdate({target:[se.sessionId,se.instructionId],set:{contentHash:qi`coalesce(${se.contentHash}, excluded.content_hash)`}})}catch(S){console.warn("[link-instructions] batched link insert failed:",S instanceof Error?S.message:S)}let w=0;for(let I of s){if(!I.sessionId)continue;let[S]=await u.select({projectId:_.projectId,projectPath:_.projectPath}).from(_).where(kt(_.id,I.sessionId)).limit(1);if(!S?.projectId||!S.projectPath)continue;let A=S.projectPath.replace(/\/$/,""),R=I.metadata?.contextItems??[];for(let D of R){let j=r.get(D.content_hash);if(!j)continue;let P=D.name??"";if(!(P.startsWith("/")&&!P.startsWith(A+"/")))try{await u.insert(at).values({projectId:S.projectId,instructionId:j.id,addedBy:e}).onConflictDoNothing(),w++}catch{}}break}let b=0;for(let[I,S]of r){if(!a.has(I)||!S.name.includes("CLAUDE")&&!S.name.includes("rules"))continue;let[A]=await u.select({id:k.id}).from(k).where(qi`${k.metadata}->>'content_hash' = ${I}`).limit(1);if(A||S.contentLen===0)continue;let[E]=await u.select({content:g.content}).from(g).where(kt(g.id,S.id)).limit(1),R=Fu(E?.content,S.name);if(R&&!g0(R))try{let[D]=await u.insert(k).values({userId:e,name:S.name,type:"instruction",content:R,description:`Auto-generated from captured context: ${S.name}`,metadata:{content_hash:I,auto_generated:!0}}).returning({id:k.id}),j=/(?:^|\n)\s*[-*]?\s*((?:NEVER|ALWAYS|MUST|DO NOT|IMPORTANT)[^\n.]+[.\n])/gi,P=[...R.matchAll(j)].map(H=>H[1].trim()).slice(0,3),$=P.length>0?P.map(H=>({name:`rule-adherence: ${H.slice(0,60)}`,prompt:`Given the instruction "${S.name}", perform a task that would test whether this rule is followed: "${H}"`,expectations:[`The response should demonstrate adherence to: ${H}`]})):[{name:`general-adherence: ${S.name}`,prompt:`Perform a typical task guided by this instruction: "${S.name}"`,expectations:["The response should follow conventions described in the instruction"]}];for(let H of $)await u.insert(Se).values({evalTargetId:D.id,name:H.name,prompt:H.prompt,expectations:H.expectations}),b++}catch{}}return{linked:l,created:p,updated:m,failed:y,sessionsLinked:v.size,instructionsMatched:r.size,snapshotsScanned:i.size,projectsLinked:w,evalsGenerated:b,scope:t?"session":"backfill"}}d(nO,"runLinkInstructions");var rO=bl();Lc.post("/sessions/link-instructions",async e=>{let t=e.get("userId"),n=await e.req.json().catch(()=>({})),r=eO.safeParse(n??{});if(!r.success)return e.json({error:"Invalid body",details:r.error.flatten()},400);let{sessionId:o,backfill:s}=r.data;if(!o&&!s)return e.json({linked:0,created:0,updated:0,failed:0,sessionsLinked:0,instructionsMatched:0,snapshotsScanned:0,projectsLinked:0,evalsGenerated:0,skipped:"no_scope"});let i=await rO.run(`${t}:${o??"*backfill*"}`,()=>nO(t,o));return e.json(i)});O();import{Hono as oO}from"hono";import{eq as ys,and as _0,sql as Sl,inArray as sO}from"drizzle-orm";var vg=new oO;vg.delete("/sessions/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:_.id}).from(_).where(_0(ys(_.id,n),ys(_.userId,t))).limit(1);if(!r)return e.json({error:"Session not found"},404);let[[{eventCount:o}],[{snapshotCount:s}],i]=await Promise.all([u.select({eventCount:Sl`count(*)::int`}).from(qe).where(ys(qe.sessionId,n)),u.select({snapshotCount:Sl`count(*)::int`}).from(L).where(ys(L.sessionId,n)),u.selectDistinct({ref:L.messagesDeltaRef}).from(L).where(_0(ys(L.sessionId,n),Sl`${L.messagesDeltaRef} IS NOT NULL`))]),a=i.map(m=>m.ref).filter(m=>!!m);await u.transaction(async m=>{await m.update(tt).set({sessionId:null}).where(ys(tt.sessionId,n)),await m.execute(Sl`UPDATE scaffolding_fingerprints SET first_session_id = NULL WHERE first_session_id = ${n}`),await m.delete(_).where(ys(_.id,n))});let c=0,l=0,p=0;if(a.length>0){let m=await u.selectDistinct({ref:L.messagesDeltaRef}).from(L).where(sO(L.messagesDeltaRef,a)),y=new Set(m.map(h=>h.ref)),v=a.filter(h=>!y.has(h));if(l=a.length-v.length,v.length>0)try{let{getSupabaseAdmin:h}=await Promise.resolve().then(()=>(Pc(),a0)),{SNAPSHOT_DELTA_BUCKET:f}=await Promise.resolve().then(()=>(vl(),l0)),{error:w}=await h().storage.from(f).remove(v);w?(p=v.length,console.warn(`[sessions:delete] blob GC failed for ${v.length} ref(s): ${w.message}`)):c=v.length}catch(h){p=v.length,console.warn(`[sessions:delete] blob GC unavailable: ${h.message}`)}}return e.json({deleted:!0,eventsDeleted:o,snapshotsDeleted:s,blobsDeleted:c,blobsRetained:l,blobsFailed:p})});var bo=new iO;bo.route("/",Di);bo.route("/",Li);bo.route("/",$i);bo.route("/",Lc);bo.route("/",vg);O();import{Hono as aO}from"hono";import{eq as Ig}from"drizzle-orm";import{sql as Ui}from"drizzle-orm";var $c=new aO;async function y0(e){let[t]=await u.select({activeOrgId:T.activeOrgId}).from(T).where(Ig(T.id,e));return t?.activeOrgId??null}d(y0,"getActiveOrgId");var w0="interval '30 minutes'";$c.get("/projects",async e=>{let t=e.get("userId"),n=Math.min(200,Math.max(1,Number(e.req.query("limit")??"50"))),r=Math.max(0,Number(e.req.query("offset")??"0")),o=await y0(t);if(!o)return e.json({projects:[],total:0});let s=await u.execute(Ui`
537
+ `);return}catch(i){if(i.cause?.code==="23505"&&s<4)continue;console.warn(`[link-instructions] version identity registration failed for ${e}:`,i instanceof Error?i.message:i);return}}u(aP,"registerVersionIdentity");async function cP(e,t){let n=await d.select({id:g.id,contentHash:g.contentHash,name:g.name,contextIdentity:g.contextIdentity,contentLen:$i`COALESCE(LENGTH(${g.content}), 0)::int`}).from(g).where(Rt(g.createdBy,e)),r=new Map,o=new Map;for(let v of n){let S=Number(v.contentLen??0);v.contentHash&&r.set(v.contentHash,{id:v.id,name:v.name??"",contentLen:S}),v.contextIdentity&&o.set(v.contextIdentity,{id:v.id,name:v.name??"",contentHash:v.contentHash})}let s=await tt.selectDistinctOn([$.sessionId],{id:$.id,sessionId:$.sessionId,metadata:$.metadata}).from($).where(t?Cc(Rt($.userId,e),Rt($.sessionId,t)):Rt($.userId,e)).orderBy($.sessionId,oP($.capturedAt)).limit(1e3),i=new Set,c=new Set,a=new Map,l=0,m=0,p=0,_=0,I=new Set,h=[],f=new Map;for(let v of s){if(!v.sessionId||i.has(v.sessionId))continue;i.add(v.sessionId);let A=v.metadata?.contextItems??[],E=null;async function R(){if(E)return E;let[N]=await tt.select({injectedInstructions:$.injectedInstructions,injectedHash:$.injectedHash}).from($).where(Rt($.id,v.id)).limit(1);return E=await vl(N?.injectedHash,N?.injectedInstructions??[]),E}u(R,"getInjected");async function P(){if(!v.sessionId)return[];let N=a.get(v.sessionId);if(N)return N;let D=v.sessionId,{messages:q}=await hl({fetchPage:u(async(B,ee)=>Dc(await tt.select({sequence:$.sequence,messagesDelta:$.messagesDelta,messagesDeltaRef:$.messagesDeltaRef}).from($).where(Cc(Rt($.sessionId,D),Rt($.userId,e),$i`${$.sequence} > ${B}`)).orderBy(rP($.sequence)).limit(ee)),"fetchPage")}),H=q;return a.set(v.sessionId,H),H}u(P,"getMessagesRaw");for(let N of A){let D=N.content_hash;if(!D)continue;c.add(D);let q=N.type??"",H=N.name??"";if(["user_input","core_system_prompt","available_tools","tool_definitions"].includes(H)||["system_reminder","system_prompt","hook_output","deferred_tools"].includes(q)||["date_change","current_date","task_reminder","git_status","unknown_reminder","available_skills"].includes(H)||q==="skill_catalog"||!hg.has(q)&&!q&&!H.includes(".md")&&!H.includes("rules"))continue;let B,ee=!1,he=null,te=r.get(D);if(te&&(B=te.id,hg.has(q)&&te.contentLen===0&&(ee=!0)),(!B||ee)&&hg.has(q)){let me=sP(q,H),L=N.instruction_index,ue=null,dt=L!=null?await R():[];if(L!=null&&dt[L])ue=dt[L];else if(q==="skill_loaded"&&N.message_index!=null){let re=await P(),ge=N.message_index,O=re[ge];if(O){let oe=O.content,Pe=(Array.isArray(oe)?oe.find(xe=>xe.type==="tool_use"&&(xe.name==="Skill"||xe.name==="execute_skill")):void 0)?.id;if(Pe)for(let xe=ge+1;xe<re.length&&xe<ge+5;xe++){let Ye=re[xe];if(Ye?.role!=="user")continue;let qt=Ye.content;if(!Array.isArray(qt))continue;let Nr=!1,Vo=[];for(let Zr of qt)Zr.type==="tool_result"&&Zr.tool_use_id===Pe?Nr=!0:Zr.type==="text"&&Nr&&Vo.push(Zr.text??"");if(Nr){ue=Vo.length>0?Vo.join(`
538
+ `):null;break}}}}if(he=ue,ee&&ue&&B)try{await d.update(g).set({content:ue,updatedAt:new Date}).where(Rt(g.id,B)),te.contentLen=ue.length,p++}catch(re){console.warn(`[link-instructions] Content backfill failed for instruction ${B}:`,re instanceof Error?re.message:re),_++}let He=o.get(me);if(He&&He.contentHash!==D){if(ue){let re=ue,ge=4,O=!1;for(let oe=0;oe<=ge;oe++)try{await d.transaction(async we=>{await we.select({id:g.id}).from(g).where(Rt(g.id,He.id)).for("update");let[{maxVersion:Pe}]=await we.select({maxVersion:$i`COALESCE(MAX(${Se.versionNumber}), 0)`}).from(Se).where(Rt(Se.instructionId,He.id)),xe=Pe+1;await we.insert(Se).values({instructionId:He.id,versionNumber:xe,content:re,frontmatter:{name:H,description:ob(q,H),type:"context_file",scope:"personal",version:`1.${xe}.0`},changeSummary:"Auto-detected content change from context snapshot",createdBy:e}),await we.update(g).set({content:re,contentHash:D,version:`1.${xe}.0`,updatedAt:new Date}).where(Rt(g.id,He.id))}),O=!0;break}catch(we){if(we.cause?.code==="23505"&&oe<ge)continue;console.warn(`[link-instructions] Version update failed for instruction ${He.id} (identity: ${me}):`,we instanceof Error?we.message:we),_++;break}O&&(r.set(D,{id:He.id,name:He.name,contentLen:re.length}),He.contentHash=D,p++)}B=He.id}else if(!He)try{let re=H,ge=ob(q,H),O=ue??"",oe={name:re,description:ge,type:"context_file",scope:"personal",version:"1.0.0"},we;await d.transaction(async Pe=>{let[xe]=await Pe.insert(g).values({name:re,description:ge,type:"context_file",scope:"personal",scopeRef:e,version:"1.0.0",content:O,frontmatter:oe,contentHash:D,contextIdentity:me,createdBy:e}).onConflictDoNothing().returning({id:g.id});xe&&(await Pe.insert(Se).values({instructionId:xe.id,versionNumber:1,content:O,frontmatter:oe,changeSummary:"Auto-created from context snapshot",createdBy:e}),we=xe.id)}),we&&(r.set(D,{id:we,name:re,contentLen:O.length}),o.set(me,{id:we,name:re,contentHash:D}),B=we,m++)}catch(re){console.warn(`[link-instructions] Auto-create failed for ${me}:`,re instanceof Error?re.message:re),_++;try{let[ge]=await d.select({id:g.id}).from(g).where(Cc(Rt(g.createdBy,e),Rt(g.contextIdentity,me))).limit(1);ge&&(B=ge.id)}catch(ge){console.warn(`[link-instructions] Fallback identity lookup also failed for ${me}:`,ge instanceof Error?ge.message:ge)}}}if(!B||!v.sessionId)continue;let Te=`${B}:${D}`,j=f.get(Te);j?!j.content&&he&&(j.content=he):f.set(Te,{instructionId:B,contentHash:D,content:he}),h.push({sessionId:v.sessionId,instructionId:B,linkMethod:"context_file",contentHash:D}),l++,I.add(v.sessionId)}}for(let v of f.values())await aP(v.instructionId,v.contentHash,v.content,new Date);for(let v=0;v<h.length;v+=500)try{await d.insert(se).values(h.slice(v,v+500)).onConflictDoUpdate({target:[se.sessionId,se.instructionId],set:{contentHash:$i`coalesce(${se.contentHash}, excluded.content_hash)`}})}catch(S){console.warn("[link-instructions] batched link insert failed:",S instanceof Error?S.message:S)}let w=0;for(let v of s){if(!v.sessionId)continue;let[S]=await d.select({projectId:y.projectId,projectPath:y.projectPath}).from(y).where(Rt(y.id,v.sessionId)).limit(1);if(!S?.projectId||!S.projectPath)continue;let A=S.projectPath.replace(/\/$/,""),R=v.metadata?.contextItems??[];for(let P of R){let N=r.get(P.content_hash);if(!N)continue;let D=P.name??"";if(!(D.startsWith("/")&&!D.startsWith(A+"/")))try{await d.insert(it).values({projectId:S.projectId,instructionId:N.id,addedBy:e}).onConflictDoNothing(),w++}catch{}}break}let b=0;for(let[v,S]of r){if(!c.has(v)||!S.name.includes("CLAUDE")&&!S.name.includes("rules"))continue;let[A]=await d.select({id:k.id}).from(k).where($i`${k.metadata}->>'content_hash' = ${v}`).limit(1);if(A||S.contentLen===0)continue;let[E]=await d.select({content:g.content}).from(g).where(Rt(g.id,S.id)).limit(1),R=Bd(E?.content,S.name);if(R&&!rb(R))try{let[P]=await d.insert(k).values({userId:e,name:S.name,type:"instruction",content:R,description:`Auto-generated from captured context: ${S.name}`,metadata:{content_hash:v,auto_generated:!0}}).returning({id:k.id}),N=/(?:^|\n)\s*[-*]?\s*((?:NEVER|ALWAYS|MUST|DO NOT|IMPORTANT)[^\n.]+[.\n])/gi,D=[...R.matchAll(N)].map(H=>H[1].trim()).slice(0,3),q=D.length>0?D.map(H=>({name:`rule-adherence: ${H.slice(0,60)}`,prompt:`Given the instruction "${S.name}", perform a task that would test whether this rule is followed: "${H}"`,expectations:[`The response should demonstrate adherence to: ${H}`]})):[{name:`general-adherence: ${S.name}`,prompt:`Perform a typical task guided by this instruction: "${S.name}"`,expectations:["The response should follow conventions described in the instruction"]}];for(let H of q)await d.insert(Ie).values({evalTargetId:P.id,name:H.name,prompt:H.prompt,expectations:H.expectations}),b++}catch{}}return{linked:l,created:m,updated:p,failed:_,sessionsLinked:I.size,instructionsMatched:r.size,snapshotsScanned:i.size,projectsLinked:w,evalsGenerated:b,scope:t?"session":"backfill"}}u(cP,"runLinkInstructions");var uP=Il();Lc.post("/sessions/link-instructions",async e=>{let t=e.get("userId"),n=await e.req.json().catch(()=>({})),r=iP.safeParse(n??{});if(!r.success)return e.json({error:"Invalid body",details:r.error.flatten()},400);let{sessionId:o,backfill:s}=r.data;if(!o&&!s)return e.json({linked:0,created:0,updated:0,failed:0,sessionsLinked:0,instructionsMatched:0,snapshotsScanned:0,projectsLinked:0,evalsGenerated:0,skipped:"no_scope"});let i=await uP.run(`${t}:${o??"*backfill*"}`,()=>cP(t,o));return e.json(i)});C();import{Hono as dP}from"hono";import{eq as ys,and as sb,sql as bl,inArray as lP}from"drizzle-orm";var _g=new dP;_g.delete("/sessions/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select({id:y.id}).from(y).where(sb(ys(y.id,n),ys(y.userId,t))).limit(1);if(!r)return e.json({error:"Session not found"},404);let[[{eventCount:o}],[{snapshotCount:s}],i]=await Promise.all([d.select({eventCount:bl`count(*)::int`}).from($e).where(ys($e.sessionId,n)),d.select({snapshotCount:bl`count(*)::int`}).from($).where(ys($.sessionId,n)),d.selectDistinct({ref:$.messagesDeltaRef}).from($).where(sb(ys($.sessionId,n),bl`${$.messagesDeltaRef} IS NOT NULL`))]),c=i.map(p=>p.ref).filter(p=>!!p);await d.transaction(async p=>{await p.update(Je).set({sessionId:null}).where(ys(Je.sessionId,n)),await p.execute(bl`UPDATE scaffolding_fingerprints SET first_session_id = NULL WHERE first_session_id = ${n}`),await p.delete(y).where(ys(y.id,n))});let a=0,l=0,m=0;if(c.length>0){let p=await d.selectDistinct({ref:$.messagesDeltaRef}).from($).where(lP($.messagesDeltaRef,c)),_=new Set(p.map(h=>h.ref)),I=c.filter(h=>!_.has(h));if(l=c.length-I.length,I.length>0)try{let{getSupabaseAdmin:h}=await Promise.resolve().then(()=>(jc(),GI)),{SNAPSHOT_DELTA_BUCKET:f}=await Promise.resolve().then(()=>(wl(),ZI)),{error:w}=await h().storage.from(f).remove(I);w?(m=I.length,console.warn(`[sessions:delete] blob GC failed for ${I.length} ref(s): ${w.message}`)):a=I.length}catch(h){m=I.length,console.warn(`[sessions:delete] blob GC unavailable: ${h.message}`)}}return e.json({deleted:!0,eventsDeleted:o,snapshotsDeleted:s,blobsDeleted:a,blobsRetained:l,blobsFailed:m})});var bo=new mP;bo.route("/",Oi);bo.route("/",Li);bo.route("/",Mi);bo.route("/",Lc);bo.route("/",_g);C();import{Hono as pP}from"hono";import{eq as yg}from"drizzle-orm";import{sql as qi}from"drizzle-orm";var Mc=new pP;async function ib(e){let[t]=await d.select({activeOrgId:T.activeOrgId}).from(T).where(yg(T.id,e));return t?.activeOrgId??null}u(ib,"getActiveOrgId");var ab="interval '30 minutes'";Mc.get("/projects",async e=>{let t=e.get("userId"),n=Math.min(200,Math.max(1,Number(e.req.query("limit")??"50"))),r=Math.max(0,Number(e.req.query("offset")??"0")),o=await ib(t);if(!o)return e.json({projects:[],total:0});let s=await d.execute(qi`
620
539
  WITH session_activity AS (
621
540
  SELECT
622
541
  s.id,
@@ -636,7 +555,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
636
555
  project_id,
637
556
  COUNT(*)::int AS session_count,
638
557
  COUNT(*) FILTER (
639
- WHERE ended_at IS NULL AND last_at >= now() - ${Ui.raw(w0)}
558
+ WHERE ended_at IS NULL AND last_at >= now() - ${qi.raw(ab)}
640
559
  )::int AS active_session_count,
641
560
  MAX(last_at) AS last_activity_at
642
561
  FROM session_activity
@@ -662,18 +581,18 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
662
581
  JOIN projects p ON p.id = pa.project_id
663
582
  ORDER BY pa.last_activity_at DESC NULLS LAST, p.created_at DESC
664
583
  LIMIT ${n} OFFSET ${r}
665
- `),[{count:i}={count:0}]=await u.execute(Ui`
584
+ `),[{count:i}={count:0}]=await d.execute(qi`
666
585
  SELECT COUNT(DISTINCT s.project_id)::int AS count
667
586
  FROM sessions s
668
587
  WHERE s.org_id = ${o}
669
588
  AND s.origin <> 'internal_worker'
670
589
  AND s.project_id IS NOT NULL
671
- `);return e.json({projects:s.map(a=>({id:a.id,name:a.name,description:a.description,gitRemoteUrl:a.git_remote_url,githubRepo:a.github_repo,createdAt:a.created_at,sessionCount:a.session_count,activeSessionCount:a.active_session_count,lastActivityAt:a.last_activity_at,primaryCheckoutPath:a.primary_checkout_path})),total:i})});$c.get("/projects/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await y0(t);if(!r)return e.json({error:"No active org"},404);let[o]=await u.select().from(U).where(Ig(U.id,n));if(!o)return e.json({error:"Project not found"},404);let[{has_session:s}={has_session:!1}]=await u.execute(Ui`
590
+ `);return e.json({projects:s.map(c=>({id:c.id,name:c.name,description:c.description,gitRemoteUrl:c.git_remote_url,githubRepo:c.github_repo,createdAt:c.created_at,sessionCount:c.session_count,activeSessionCount:c.active_session_count,lastActivityAt:c.last_activity_at,primaryCheckoutPath:c.primary_checkout_path})),total:i})});Mc.get("/projects/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await ib(t);if(!r)return e.json({error:"No active org"},404);let[o]=await d.select().from(M).where(yg(M.id,n));if(!o)return e.json({error:"Project not found"},404);let[{has_session:s}={has_session:!1}]=await d.execute(qi`
672
591
  SELECT EXISTS(
673
592
  SELECT 1 FROM sessions
674
593
  WHERE project_id = ${n} AND org_id = ${r} AND origin <> 'internal_worker'
675
594
  ) AS has_session
676
- `);if(o.orgId!==r&&!s)return e.json({error:"Project not found"},404);let[i]=await u.execute(Ui`
595
+ `);if(o.orgId!==r&&!s)return e.json({error:"Project not found"},404);let[i]=await d.execute(qi`
677
596
  WITH session_activity AS (
678
597
  SELECT
679
598
  s.id,
@@ -688,11 +607,11 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
688
607
  SELECT
689
608
  COUNT(*)::int AS session_count,
690
609
  COUNT(*) FILTER (
691
- WHERE ended_at IS NULL AND last_at >= now() - ${Ui.raw(w0)}
610
+ WHERE ended_at IS NULL AND last_at >= now() - ${qi.raw(ab)}
692
611
  )::int AS active_session_count,
693
612
  MAX(last_at) AS last_activity_at
694
613
  FROM session_activity
695
- `),a=await u.select({path:le.path,isWorktree:le.isWorktree,firstSeen:le.firstSeen,lastSeen:le.lastSeen}).from(le).where(Ig(le.projectId,n));return a.sort((c,l)=>{let p=c.lastSeen?.getTime()??0;return(l.lastSeen?.getTime()??0)-p}),e.json({id:o.id,name:o.name,description:o.description,gitRemoteUrl:o.gitRemoteUrl,githubRepo:o.githubRepo,createdAt:o.createdAt,sessionCount:i?.session_count??0,activeSessionCount:i?.active_session_count??0,lastActivityAt:i?.last_activity_at??null,primaryCheckoutPath:a[0]?.path??null,checkouts:a})});O();import{Hono as cO}from"hono";import{z as Cn}from"zod";import{eq as ut,and as So,sql as v0,desc as dO,inArray as uO}from"drizzle-orm";var fr=new cO,lO=Cn.object({name:Cn.string().min(1).max(255),description:Cn.string().min(1),scope:Cn.enum(["org","team","personal"]),scopeRef:Cn.string().uuid().optional(),version:Cn.string().default("1.0.0"),tags:Cn.array(Cn.string()).optional()});fr.get("/packs",async e=>{let t=e.get("userId"),n=e.req.query("scope"),r=parseInt(e.req.query("limit")??"100",10),o=[ut(Le.archived,!1),ut(Le.createdBy,t)];n&&o.push(ut(Le.scope,n));let s=await u.select().from(Le).where(So(...o)).orderBy(dO(Le.updatedAt)).limit(r),i=s.map(c=>c.id),a={};if(i.length>0){let c=await u.select({packId:Oe.packId,count:v0`COUNT(*)::int`}).from(Oe).where(uO(Oe.packId,i)).groupBy(Oe.packId);for(let l of c)a[l.packId]=l.count}return e.json(s.map(c=>{let l=a[c.id]??0;return{...c,instructionCount:l,tier:cc(l)}}))});fr.get("/packs/:id",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await u.select().from(Le).where(So(ut(Le.id,t),ut(Le.createdBy,n),ut(Le.archived,!1)));if(!r)return e.json({error:"Pack not found"},404);let o=await u.select({instruction:g,position:Oe.position,slotOverrides:Oe.slotOverrides,addedAt:Oe.addedAt}).from(Oe).innerJoin(g,ut(Oe.instructionId,g.id)).where(ut(Oe.packId,t)).orderBy(Oe.position),s=o.length;return e.json({...r,instructionCount:s,tier:cc(s),instructions:o.map(i=>({...i.instruction,position:i.position,slotOverrides:i.slotOverrides,addedAt:i.addedAt}))})});fr.post("/packs",async e=>{let t=e.get("userId"),n=await e.req.json(),r=lO.parse(n),o=r.scope==="personal"?t:r.scopeRef??null,[s]=await u.insert(Le).values({name:r.name,description:r.description,scope:r.scope,scopeRef:o,version:r.version,tags:r.tags??[],createdBy:t}).returning();return e.json({...s,instructionCount:0,tier:cc(0)},201)});fr.post("/packs/:id/instructions",async e=>{let t=e.req.param("id"),n=e.get("userId"),r=await e.req.json(),{instructionId:o}=Cn.object({instructionId:Cn.string().uuid()}).parse(r),[s]=await u.select().from(Le).where(So(ut(Le.id,t),ut(Le.createdBy,n),ut(Le.archived,!1)));if(!s)return e.json({error:"Pack not found"},404);let[i]=await u.select().from(Oe).where(So(ut(Oe.packId,t),ut(Oe.instructionId,o)));if(i)return e.json({error:"Instruction already in this pack"},409);let[a]=await u.select({max:v0`COALESCE(MAX(${Oe.position}), -1)`}).from(Oe).where(ut(Oe.packId,t)),[c]=await u.insert(Oe).values({packId:t,instructionId:o,position:(a?.max??-1)+1,addedBy:n}).returning();return e.json(c,201)});fr.delete("/packs/:id/instructions/:instructionId",async e=>{let t=e.req.param("id"),n=e.get("userId"),r=e.req.param("instructionId"),[o]=await u.select({id:Le.id}).from(Le).where(So(ut(Le.id,t),ut(Le.createdBy,n),ut(Le.archived,!1)));return o?(await u.delete(Oe).where(So(ut(Oe.packId,t),ut(Oe.instructionId,r))).returning()).length===0?e.json({error:"Instruction not in this pack"},404):e.json({success:!0}):e.json({error:"Pack not found"},404)});fr.post("/packs/:id/apply",async e=>{let t=e.req.param("id"),n=e.get("userId"),r=await e.req.json(),{projectId:o}=Cn.object({projectId:Cn.string().uuid()}).parse(r),s=await u.select({instructionId:Oe.instructionId}).from(Oe).where(ut(Oe.packId,t));if(s.length===0)return e.json({error:"Pack has no instructions"},400);let i=0;for(let a of s){let[c]=await u.select().from(at).where(So(ut(at.projectId,o),ut(at.instructionId,a.instructionId)));c||(await u.insert(at).values({projectId:o,instructionId:a.instructionId,addedBy:n}),i++)}return e.json({success:!0,linked:i,total:s.length})});fr.post("/packs/:id/fork",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(Le).where(So(ut(Le.id,n),ut(Le.archived,!1)));if(!r)return e.json({error:"Pack not found"},404);if(r.createdBy===t)return e.json({error:"Cannot fork your own pack"},400);let[o]=await u.insert(Le).values({name:`${r.name} (fork)`,description:r.description,scope:"personal",scopeRef:t,version:"1.0.0",tags:r.tags,createdBy:t,forkedFromId:r.id,upstreamVersion:r.version}).returning(),s=await u.select().from(Oe).where(ut(Oe.packId,n));return s.length>0&&await u.insert(Oe).values(s.map(i=>({packId:o.id,instructionId:i.instructionId,position:i.position,slotOverrides:i.slotOverrides,addedBy:t}))),e.json(o,201)});O();import{Hono as pO}from"hono";import{eq as bg,and as mO,sql as I0}from"drizzle-orm";var Al=new pO;function b0(e){return{id:e.id,name:e.name,forkedFromId:e.forked_from_id,version:e.version,scope:e.scope,createdBy:e.created_by,createdAt:e.created_at,depth:e.depth}}d(b0,"mapRow");Al.get("/instructions/:id/lineage",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:g.id,name:g.name,forkedFromId:g.forkedFromId,version:g.version,scope:g.scope,createdBy:g.createdBy,createdAt:g.createdAt}).from(g).where(mO(bg(g.id,n),bg(g.archived,!1),bg(g.createdBy,t)));if(!r)return e.json({error:"Instruction not found"},404);let o=r.forkedFromId?await u.execute(I0`
614
+ `),c=await d.select({path:de.path,isWorktree:de.isWorktree,firstSeen:de.firstSeen,lastSeen:de.lastSeen}).from(de).where(yg(de.projectId,n));return c.sort((a,l)=>{let m=a.lastSeen?.getTime()??0;return(l.lastSeen?.getTime()??0)-m}),e.json({id:o.id,name:o.name,description:o.description,gitRemoteUrl:o.gitRemoteUrl,githubRepo:o.githubRepo,createdAt:o.createdAt,sessionCount:i?.session_count??0,activeSessionCount:i?.active_session_count??0,lastActivityAt:i?.last_activity_at??null,primaryCheckoutPath:c[0]?.path??null,checkouts:c})});C();import{Hono as fP}from"hono";import{z as Cn}from"zod";import{eq as ut,and as So,sql as cb,desc as gP,inArray as hP}from"drizzle-orm";var fr=new fP,_P=Cn.object({name:Cn.string().min(1).max(255),description:Cn.string().min(1),scope:Cn.enum(["org","team","personal"]),scopeRef:Cn.string().uuid().optional(),version:Cn.string().default("1.0.0"),tags:Cn.array(Cn.string()).optional()});fr.get("/packs",async e=>{let t=e.get("userId"),n=e.req.query("scope"),r=parseInt(e.req.query("limit")??"100",10),o=[ut(Le.archived,!1),ut(Le.createdBy,t)];n&&o.push(ut(Le.scope,n));let s=await d.select().from(Le).where(So(...o)).orderBy(gP(Le.updatedAt)).limit(r),i=s.map(a=>a.id),c={};if(i.length>0){let a=await d.select({packId:De.packId,count:cb`COUNT(*)::int`}).from(De).where(hP(De.packId,i)).groupBy(De.packId);for(let l of a)c[l.packId]=l.count}return e.json(s.map(a=>{let l=c[a.id]??0;return{...a,instructionCount:l,tier:ac(l)}}))});fr.get("/packs/:id",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await d.select().from(Le).where(So(ut(Le.id,t),ut(Le.createdBy,n),ut(Le.archived,!1)));if(!r)return e.json({error:"Pack not found"},404);let o=await d.select({instruction:g,position:De.position,slotOverrides:De.slotOverrides,addedAt:De.addedAt}).from(De).innerJoin(g,ut(De.instructionId,g.id)).where(ut(De.packId,t)).orderBy(De.position),s=o.length;return e.json({...r,instructionCount:s,tier:ac(s),instructions:o.map(i=>({...i.instruction,position:i.position,slotOverrides:i.slotOverrides,addedAt:i.addedAt}))})});fr.post("/packs",async e=>{let t=e.get("userId"),n=await e.req.json(),r=_P.parse(n),o=r.scope==="personal"?t:r.scopeRef??null,[s]=await d.insert(Le).values({name:r.name,description:r.description,scope:r.scope,scopeRef:o,version:r.version,tags:r.tags??[],createdBy:t}).returning();return e.json({...s,instructionCount:0,tier:ac(0)},201)});fr.post("/packs/:id/instructions",async e=>{let t=e.req.param("id"),n=e.get("userId"),r=await e.req.json(),{instructionId:o}=Cn.object({instructionId:Cn.string().uuid()}).parse(r),[s]=await d.select().from(Le).where(So(ut(Le.id,t),ut(Le.createdBy,n),ut(Le.archived,!1)));if(!s)return e.json({error:"Pack not found"},404);let[i]=await d.select().from(De).where(So(ut(De.packId,t),ut(De.instructionId,o)));if(i)return e.json({error:"Instruction already in this pack"},409);let[c]=await d.select({max:cb`COALESCE(MAX(${De.position}), -1)`}).from(De).where(ut(De.packId,t)),[a]=await d.insert(De).values({packId:t,instructionId:o,position:(c?.max??-1)+1,addedBy:n}).returning();return e.json(a,201)});fr.delete("/packs/:id/instructions/:instructionId",async e=>{let t=e.req.param("id"),n=e.get("userId"),r=e.req.param("instructionId"),[o]=await d.select({id:Le.id}).from(Le).where(So(ut(Le.id,t),ut(Le.createdBy,n),ut(Le.archived,!1)));return o?(await d.delete(De).where(So(ut(De.packId,t),ut(De.instructionId,r))).returning()).length===0?e.json({error:"Instruction not in this pack"},404):e.json({success:!0}):e.json({error:"Pack not found"},404)});fr.post("/packs/:id/apply",async e=>{let t=e.req.param("id"),n=e.get("userId"),r=await e.req.json(),{projectId:o}=Cn.object({projectId:Cn.string().uuid()}).parse(r),s=await d.select({instructionId:De.instructionId}).from(De).where(ut(De.packId,t));if(s.length===0)return e.json({error:"Pack has no instructions"},400);let i=0;for(let c of s){let[a]=await d.select().from(it).where(So(ut(it.projectId,o),ut(it.instructionId,c.instructionId)));a||(await d.insert(it).values({projectId:o,instructionId:c.instructionId,addedBy:n}),i++)}return e.json({success:!0,linked:i,total:s.length})});fr.post("/packs/:id/fork",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select().from(Le).where(So(ut(Le.id,n),ut(Le.archived,!1)));if(!r)return e.json({error:"Pack not found"},404);if(r.createdBy===t)return e.json({error:"Cannot fork your own pack"},400);let[o]=await d.insert(Le).values({name:`${r.name} (fork)`,description:r.description,scope:"personal",scopeRef:t,version:"1.0.0",tags:r.tags,createdBy:t,forkedFromId:r.id,upstreamVersion:r.version}).returning(),s=await d.select().from(De).where(ut(De.packId,n));return s.length>0&&await d.insert(De).values(s.map(i=>({packId:o.id,instructionId:i.instructionId,position:i.position,slotOverrides:i.slotOverrides,addedBy:t}))),e.json(o,201)});C();import{Hono as yP}from"hono";import{eq as wg,and as wP,sql as ub}from"drizzle-orm";var Sl=new yP;function db(e){return{id:e.id,name:e.name,forkedFromId:e.forked_from_id,version:e.version,scope:e.scope,createdBy:e.created_by,createdAt:e.created_at,depth:e.depth}}u(db,"mapRow");Sl.get("/instructions/:id/lineage",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select({id:g.id,name:g.name,forkedFromId:g.forkedFromId,version:g.version,scope:g.scope,createdBy:g.createdBy,createdAt:g.createdAt}).from(g).where(wP(wg(g.id,n),wg(g.archived,!1),wg(g.createdBy,t)));if(!r)return e.json({error:"Instruction not found"},404);let o=r.forkedFromId?await d.execute(ub`
696
615
  WITH RECURSIVE ancestors AS (
697
616
  SELECT id, name, forked_from_id, version, scope, created_by, created_at::text, 1 as depth
698
617
  FROM instructions
@@ -705,7 +624,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
705
624
  WHERE i.archived = false AND a.depth < 20
706
625
  )
707
626
  SELECT * FROM ancestors ORDER BY depth DESC
708
- `):[],s=await u.execute(I0`
627
+ `):[],s=await d.execute(ub`
709
628
  WITH RECURSIVE descendants AS (
710
629
  SELECT id, name, forked_from_id, version, scope, created_by, created_at::text, 1 as depth
711
630
  FROM instructions
@@ -718,32 +637,32 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
718
637
  WHERE i.archived = false AND d.depth < 20
719
638
  )
720
639
  SELECT * FROM descendants ORDER BY depth ASC
721
- `),i=Array.isArray(o)?o.map(b0):[],a=s.map(b0);return e.json({current:{id:r.id,name:r.name,forkedFromId:r.forkedFromId,version:r.version,scope:r.scope,createdBy:r.createdBy,createdAt:r.createdAt},ancestors:i,descendants:a})});O();import{Hono as gO}from"hono";import{z as ws}from"zod";import{eq as Ao,and as qc,desc as Eg,gt as xg,lt as hO,sql as rn}from"drizzle-orm";function xl(e,t){let n=d(c=>e.capabilities===null||e.capabilities.includes(c),"claims"),r=t.filter(c=>n(c.kind)),o=t.filter(c=>!n(c.kind)),s=[],i,a;return e.present?e.active?e.busy?(i="ok",a=r.length>0?`Worker is running a job \u2014 ${El(r)} more queued behind it.`:"Worker is online and running a job."):r.some(c=>c.oldestMinutes>=10)?(i="warn",a=`Worker is online but its queue is not draining \u2014 ${El(r)} job(s) pending (${Sg(r)}).`,s.push("A handler may be wedged. Restart: `rulemetric worker:restart` (or reinstall the service).")):(i="ok",a="Worker is online and its queue is draining."):(i="fail",a=`Worker is not running \u2014 last heartbeat ${fO(e.ageSeconds)} ago.`,s.push("Restart it: `rulemetric service install --worker-only`"),s.push("If it keeps dying, `launchctl list | grep rulemetric` shows the exit status."),r.length>0&&s.push(`${El(r)} job(s) are waiting on it (${Sg(r)}) \u2014 they will drain once it is back.`)):(i="fail",a="No worker has ever connected \u2014 nothing is analyzing your sessions.",s.push("Start one: `rulemetric service install --worker-only`"),s.push("Session capture works without it (hooks post directly), but analysis, insights, and Codex transcript import all require the worker.")),o.length>0&&(i==="ok"&&(i="warn"),s.push(`${El(o)} job(s) cannot be claimed by this worker (${Sg(o)}). These handlers need direct database credentials, which a worker-only install does not have \u2014 they will stay pending until a worker with DATABASE_URL runs.`)),{severity:i,headline:a,hints:s,stuck:r,unclaimable:o}}d(xl,"assessWorkerHealth");function El(e){return e.reduce((t,n)=>t+n.count,0)}d(El,"totalOf");function Sg(e){return e.map(t=>`${t.kind}\xD7${t.count}`).join(", ")}d(Sg,"describe");function fO(e){if(e===null)return"never";if(e<90)return`${Math.round(e)}s`;let t=Math.round(e/60);return t<90?`${t}m`:`${Math.round(t/60)}h`}d(fO,"formatAge");var Ag=[{table:"session_send_jobs",defaultKind:"process_send_message",labelIdSql:"NULL::uuid",labelTextSql:"session_id::text"},{table:"launch_jobs",defaultKind:"process_launch",labelIdSql:"NULL::uuid",labelTextSql:"tool"},{table:"eval_jobs",defaultKind:"process_eval",labelIdSql:"eval_target_id",labelTextSql:"NULL::text"},{table:"insights_jobs",defaultKind:"process_insights",labelIdSql:"NULL::uuid",labelTextSql:"project_path"},{table:"agent_jobs",defaultKind:"agent_job",labelIdSql:"(payload->>'evalTargetId')::uuid",labelTextSql:"payload->>'projectPath'"}],S0=Ag.map(({table:e,defaultKind:t})=>({table:e,defaultKind:t}));var Hi=new gO,Tg=6e4,A0=600*1e3,Rg=3600*1e3,_O=10080*60*1e3,yO={"cli-worker":["process_eval","process_insights","process_launch","process_send_message","process_conversation","process_session_goal","distill_memories","memory_ab","process_run_cleanup","cron_suggest_instructions","cron_refresh_skills","cron_refresh_pricing","cron_eval_autorun","cron_auto_accept_suggestions","cron_instruction_training","cron_instruction_evolution","process_judge_review"]},wO=new Set([]),vO=ws.object({workerType:ws.enum(["mcp","cli-worker","gateway","proxy"]),clientName:ws.string().min(1),clientVersion:ws.string().optional(),workerVersion:ws.string().optional(),metadata:ws.record(ws.unknown()).optional()}),kg=S0;async function IO(e,t=0){let n=new Date(Date.now()-t).toISOString(),r=kg.map(({table:i,defaultKind:a})=>rn`
722
- SELECT coalesce(task_kind, ${a}) AS kind,
640
+ `),i=Array.isArray(o)?o.map(db):[],c=s.map(db);return e.json({current:{id:r.id,name:r.name,forkedFromId:r.forkedFromId,version:r.version,scope:r.scope,createdBy:r.createdBy,createdAt:r.createdAt},ancestors:i,descendants:c})});C();import{Hono as bP}from"hono";import{z as ws}from"zod";import{eq as Ao,and as Uc,desc as Ig,gt as bg,lt as SP,sql as nn}from"drizzle-orm";function qc(e){let t=e?.llmEngines;if(!t||typeof t!="object")return null;let n=t;return{claude:n.claude===!0,codex:n.codex===!0}}u(qc,"reportedEngines");var vP=10;function El(e,t){let n=u(p=>e.capabilities===null||e.capabilities.includes(p),"claims"),r=e.engines!=null&&!e.engines.claude&&!e.engines.codex,o=t.filter(p=>n(p.kind)),s=t.filter(p=>!n(p.kind)),i=r?o.filter(p=>Td(p.kind)):[],c=r?o.filter(p=>!Td(p.kind)):o,a=[],l,m;return e.present?e.active?i.length>0?(l="fail",m=`Worker is online but no LLM engine is installed \u2014 ${$c(i)} job(s) cannot produce real output (${Al(i)}).`,a.push("Install one on the machine running the worker: `claude` (npm i -g @anthropic-ai/claude-code) or `codex`, then `rulemetric worker:restart`."),a.push("Restarting alone will not help \u2014 the worker is heartbeating fine. It reported no `claude` and no `codex` binary, and these handlers spawn one."),a.push("If an engine IS installed, the worker cannot see it on its PATH: launchd starts with a minimal PATH, so a Homebrew or nvm install needs an absolute path. `rulemetric doctor` prints what the worker resolved.")):e.busy?(l="ok",m=c.length>0?`Worker is running a job \u2014 ${$c(c)} more queued behind it.`:"Worker is online and running a job."):c.some(p=>p.oldestMinutes>=vP)?(l="warn",m=`Worker is online but its queue is not draining \u2014 ${$c(c)} job(s) pending (${Al(c)}).`,a.push("A handler may be wedged. Restart: `rulemetric worker:restart` (or reinstall the service).")):(l="ok",m="Worker is online and its queue is draining."):(l="fail",m=`Worker is not running \u2014 last heartbeat ${IP(e.ageSeconds)} ago.`,a.push("Restart it: `rulemetric service install --worker-only`"),a.push("If it keeps dying, `launchctl list | grep rulemetric` shows the exit status."),c.length>0&&a.push(`${$c(c)} job(s) are waiting on it (${Al(c)}) \u2014 they will drain once it is back.`)):(l="fail",m="No worker has ever connected \u2014 nothing is analyzing your sessions.",a.push("Start one: `rulemetric service install --worker-only`"),a.push("Session capture works without it (hooks post directly), but analysis, insights, and Codex transcript import all require the worker.")),r&&i.length===0&&e.present&&e.active&&(l==="ok"&&(l="warn"),a.push("No LLM engine (`claude` or `codex`) is installed where the worker runs. Analysis, insights, evals and instruction jobs will complete with EMPTY output rather than failing, so nothing will look wrong. Install one and run `rulemetric worker:restart`.")),s.length>0&&(l==="ok"&&(l="warn"),a.push(`${$c(s)} job(s) cannot be claimed by this worker (${Al(s)}). These handlers need direct database credentials, which a worker-only install does not have \u2014 they will stay pending until a worker with DATABASE_URL runs.`)),{severity:l,headline:m,hints:a,stuck:c,unclaimable:s,engineBlocked:i}}u(El,"assessWorkerHealth");function $c(e){return e.reduce((t,n)=>t+n.count,0)}u($c,"totalOf");function Al(e){return e.map(t=>`${t.kind}\xD7${t.count}`).join(", ")}u(Al,"describe");function IP(e){if(e===null)return"never";if(e<90)return`${Math.round(e)}s`;let t=Math.round(e/60);return t<90?`${t}m`:`${Math.round(t/60)}h`}u(IP,"formatAge");var vg=[{table:"session_send_jobs",defaultKind:"process_send_message",labelIdSql:"NULL::uuid",labelTextSql:"session_id::text"},{table:"launch_jobs",defaultKind:"process_launch",labelIdSql:"NULL::uuid",labelTextSql:"tool"},{table:"eval_jobs",defaultKind:"process_eval",labelIdSql:"eval_target_id",labelTextSql:"NULL::text"},{table:"insights_jobs",defaultKind:"process_insights",labelIdSql:"NULL::uuid",labelTextSql:"project_path"},{table:"agent_jobs",defaultKind:"agent_job",labelIdSql:"(payload->>'evalTargetId')::uuid",labelTextSql:"payload->>'projectPath'"}],lb=vg.map(({table:e,defaultKind:t})=>({table:e,defaultKind:t}));var Ui=new bP,Sg=6e4,mb=600*1e3,Ag=3600*1e3,AP=10080*60*1e3,EP={"cli-worker":["process_eval","process_insights","process_launch","process_send_message","process_conversation","process_session_goal","distill_memories","memory_ab","process_run_cleanup","cron_suggest_instructions","cron_refresh_skills","cron_refresh_pricing","cron_eval_autorun","cron_auto_accept_suggestions","cron_instruction_training","cron_instruction_evolution","process_judge_review"]},xP=new Set([]),TP=ws.object({workerType:ws.enum(["mcp","cli-worker","gateway","proxy"]),clientName:ws.string().min(1),clientVersion:ws.string().optional(),workerVersion:ws.string().optional(),metadata:ws.record(ws.unknown()).optional()}),Eg=lb;async function RP(e,t=0){let n=new Date(Date.now()-t).toISOString(),r=Eg.map(({table:i,defaultKind:c})=>nn`
641
+ SELECT coalesce(task_kind, ${c}) AS kind,
723
642
  count(*)::int AS n,
724
643
  min(created_at) AS oldest
725
- FROM ${rn.raw(i)}
644
+ FROM ${nn.raw(i)}
726
645
  WHERE user_id = ${e}
727
646
  AND status = 'pending'
728
647
  AND created_at < ${n}::timestamptz
729
648
  GROUP BY 1
730
- `),o=await u.execute(rn`${rn.join(r,rn` UNION ALL `)} ORDER BY oldest ASC`),s=Date.now();return o.map(i=>({kind:i.kind,count:Number(i.n),oldestMinutes:Math.round((s-new Date(i.oldest).getTime())/6e4)}))}d(IO,"queryPendingKinds");async function E0(e){return(await u.execute(rn`${rn.join(kg.map(({table:n})=>rn`
649
+ `),o=await d.execute(nn`${nn.join(r,nn` UNION ALL `)} ORDER BY oldest ASC`),s=Date.now();return o.map(i=>({kind:i.kind,count:Number(i.n),oldestMinutes:Math.round((s-new Date(i.oldest).getTime())/6e4)}))}u(RP,"queryPendingKinds");async function pb(e){return(await d.execute(nn`${nn.join(Eg.map(({table:n})=>nn`
731
650
  SELECT count(*)::int AS n
732
- FROM ${rn.raw(n)}
651
+ FROM ${nn.raw(n)}
733
652
  WHERE user_id = ${e}
734
653
  AND status IN ('claimed', 'running')
735
654
  AND lease_expires_at IS NOT NULL
736
655
  AND lease_expires_at > now()
737
- `),rn` UNION ALL `)}`)).reduce((n,r)=>n+Number(r.n),0)>0}d(E0,"hasLiveInFlightJob");async function bO(e,t){let n=new Date(Date.now()-A0).toISOString(),r=kg.map(({table:p,defaultKind:m})=>rn`
738
- SELECT coalesce(task_kind, ${m}) AS kind,
656
+ `),nn` UNION ALL `)}`)).reduce((n,r)=>n+Number(r.n),0)>0}u(pb,"hasLiveInFlightJob");async function kP(e,t){let n=new Date(Date.now()-mb).toISOString(),r=Eg.map(({table:m,defaultKind:p})=>nn`
657
+ SELECT coalesce(task_kind, ${p}) AS kind,
739
658
  count(*)::int AS n,
740
659
  min(created_at) AS oldest
741
- FROM ${rn.raw(p)}
660
+ FROM ${nn.raw(m)}
742
661
  WHERE user_id = ${e}
743
662
  AND status = 'pending'
744
663
  AND created_at < ${n}::timestamptz
745
664
  GROUP BY 1
746
- `),o=await u.execute(rn`${rn.join(r,rn` UNION ALL `)} ORDER BY oldest ASC`),s=t===null?o:o.filter(p=>t.includes(p.kind));if(s.length===0||await E0(e))return null;let i=s.reduce((p,m)=>p+Number(m.n),0),a=Date.now()-new Date(s[0].oldest).getTime(),c=Math.round(a/6e4),l=s.map(p=>`${p.kind}\xD7${p.n}`).join(", ");return{code:"STALE_PENDING",message:`${i} job(s) pending >${Math.round(A0/6e4)}m (oldest ${c}m: ${l}). The worker is heartbeating but its queue isn't draining \u2014 check for a wedged handler or restart it.`,meta:{total:i,oldestMinutes:c,byKind:s.map(p=>({kind:p.kind,count:Number(p.n)}))}}}d(bO,"checkStalePendingAdvisory");function x0(e){return!e||!Array.isArray(e.capabilities)?null:e.capabilities.filter(t=>typeof t=="string")}d(x0,"reportedCapabilities");function SO(e,t){let n=yO[e];if(!n||n.length===0)return null;let r=t&&Array.isArray(t.capabilities)?t.capabilities.filter(s=>typeof s=="string"):null;if(r===null)return{code:"NO_CAPABILITIES_REPORTED",message:`Worker did not report any capabilities. Expected ${n.join(", ")} \u2014 likely an outdated worker process. Restart it.`};let o=n.filter(s=>!r.includes(s)&&!wO.has(s));return o.length>0?{code:"MISSING_CAPABILITIES",message:`Worker is missing capabilities: ${o.join(", ")}. Jobs of those kinds will sit pending. Restart the worker after deploying API updates.`}:null}d(SO,"checkWorkerAdvisory");Hi.post("/workers/heartbeat",async e=>{let t=e.get("userId"),n=await e.req.json(),r=vO.parse(n);await u.insert(fe).values({userId:t,workerType:r.workerType,clientName:r.clientName,clientVersion:r.clientVersion??null,workerVersion:r.workerVersion??null,metadata:r.metadata??null}).onConflictDoUpdate({target:[fe.userId,fe.workerType,fe.clientName],set:{lastHeartbeat:new Date,clientVersion:r.clientVersion??null,workerVersion:r.workerVersion??null,metadata:r.metadata??null}}),u.delete(fe).where(qc(Ao(fe.userId,t),hO(fe.lastHeartbeat,new Date(Date.now()-_O)))).catch(()=>{});let o=SO(r.workerType,r.metadata);return!o&&r.workerType==="cli-worker"&&(o=await bO(t,x0(r.metadata))),o&&console.warn(`[workers/heartbeat] ${r.workerType} ${r.clientName} (version=${r.workerVersion??"unknown"}): ${o.code} \u2014 ${o.message}`),e.json({status:"ok",...o?{advisory:o}:{}})});async function T0(e){let t=new Date(Date.now()-Rg),n=await u.select({lastHeartbeat:fe.lastHeartbeat}).from(fe).where(qc(Ao(fe.userId,e),Ao(fe.workerType,"cli-worker"),xg(fe.lastHeartbeat,t))),r=Date.now();return{cliEverConnected:n.length>0,workerActive:n.some(o=>r-new Date(o.lastHeartbeat).getTime()<Tg)}}d(T0,"computeCliWorkerSetupSignals");async function Tl(e){let t=await u.select({lastHeartbeat:fe.lastHeartbeat,metadata:fe.metadata}).from(fe).where(qc(Ao(fe.userId,e),Ao(fe.workerType,"cli-worker"))).orderBy(Eg(fe.lastHeartbeat)).limit(10);for(let n of t){let r=n.metadata?.llmEngines;if(r&&typeof r=="object"){let o=r;return{claude:o.claude===!0,codex:o.codex===!0,codexModel:typeof o.codexModel=="string"?o.codexModel:null,observedAt:new Date(n.lastHeartbeat).toISOString()}}}return null}d(Tl,"getLatestLlmEngines");Hi.get("/workers/status",async e=>{let t=e.get("userId"),n=new Date(Date.now()-Rg),r=await u.select().from(fe).where(qc(Ao(fe.userId,t),xg(fe.lastHeartbeat,n))).orderBy(Eg(fe.lastHeartbeat)),o=Date.now(),s=r.map(i=>{let a=o-new Date(i.lastHeartbeat).getTime();return{id:i.id,workerType:i.workerType,clientName:i.clientName,clientVersion:i.clientVersion,workerVersion:i.workerVersion,lastHeartbeat:i.lastHeartbeat,connectedAt:i.connectedAt,status:a<Tg?"active":"inactive"}});return e.json(s)});Hi.get("/workers/health",async e=>{let t=e.get("userId"),n=new Date(Date.now()-Rg),[r,o,s]=await Promise.all([u.select({lastHeartbeat:fe.lastHeartbeat,clientName:fe.clientName,clientVersion:fe.clientVersion,metadata:fe.metadata}).from(fe).where(qc(Ao(fe.userId,t),Ao(fe.workerType,"cli-worker"),xg(fe.lastHeartbeat,n))).orderBy(Eg(fe.lastHeartbeat)).limit(1),IO(t),E0(t)]),i=r[0],a=i?Date.now()-new Date(i.lastHeartbeat).getTime():null,c={present:i!=null,active:a!=null&&a<Tg,ageSeconds:a==null?null:Math.round(a/1e3),capabilities:i?x0(i.metadata??void 0):null,busy:s},l=xl(c,o);return e.json({worker:{present:c.present,active:c.active,ageSeconds:c.ageSeconds,clientName:i?.clientName??null,clientVersion:i?.clientVersion??null,lastHeartbeat:i?.lastHeartbeat??null,capabilities:c.capabilities},pending:o,verdict:l})});O();import{Hono as AO}from"hono";import{z as jg}from"zod";import{and as Ng,desc as R0,eq as gr,inArray as EO,isNull as xO,sql as rt}from"drizzle-orm";var Uc=new AO,TO=jg.object({limit:jg.coerce.number().int().min(1).max(100).default(20),hours:jg.coerce.number().int().min(1).max(168).default(24)}),RO=6e4,kO=3600*1e3;function k0(e,t){return rt.join(Ag.map(({table:n,defaultKind:r,labelIdSql:o,labelTextSql:s})=>rt`
665
+ `),o=await d.execute(nn`${nn.join(r,nn` UNION ALL `)} ORDER BY oldest ASC`),s=t===null?o:o.filter(m=>t.includes(m.kind));if(s.length===0||await pb(e))return null;let i=s.reduce((m,p)=>m+Number(p.n),0),c=Date.now()-new Date(s[0].oldest).getTime(),a=Math.round(c/6e4),l=s.map(m=>`${m.kind}\xD7${m.n}`).join(", ");return{code:"STALE_PENDING",message:`${i} job(s) pending >${Math.round(mb/6e4)}m (oldest ${a}m: ${l}). The worker is heartbeating but its queue isn't draining \u2014 check for a wedged handler or restart it.`,meta:{total:i,oldestMinutes:a,byKind:s.map(m=>({kind:m.kind,count:Number(m.n)}))}}}u(kP,"checkStalePendingAdvisory");function xg(e){return!e||!Array.isArray(e.capabilities)?null:e.capabilities.filter(t=>typeof t=="string")}u(xg,"reportedCapabilities");function NP(e,t){if(e!=="cli-worker")return null;let n=qc(t);if(n===null||n.claude||n.codex)return null;let r=xg(t),o=r===null?[...dc]:r.filter(s=>dc.has(s));return o.length===0?null:{code:"NO_LLM_ENGINE",message:`No local LLM engine found (neither \`claude\` nor \`codex\`), but this worker advertises ${o.length} kind(s) that spawn one: ${o.join(", ")}. Those jobs COMPLETE WITH EMPTY OUTPUT rather than failing \u2014 a missing binary resolves to a null result. Install an engine and restart the worker. If one IS installed, the worker cannot see it on its PATH (launchd starts minimal).`,meta:{affected:o}}}u(NP,"checkEngineAdvisory");function jP(e,t){let n=EP[e];if(!n||n.length===0)return null;let r=t&&Array.isArray(t.capabilities)?t.capabilities.filter(s=>typeof s=="string"):null;if(r===null)return{code:"NO_CAPABILITIES_REPORTED",message:`Worker did not report any capabilities. Expected ${n.join(", ")} \u2014 likely an outdated worker process. Restart it.`};let o=n.filter(s=>!r.includes(s)&&!xP.has(s));return o.length>0?{code:"MISSING_CAPABILITIES",message:`Worker is missing capabilities: ${o.join(", ")}. Jobs of those kinds will sit pending. Restart the worker after deploying API updates.`}:null}u(jP,"checkWorkerAdvisory");Ui.post("/workers/heartbeat",async e=>{let t=e.get("userId"),n=await e.req.json(),r=TP.parse(n);await d.insert(pe).values({userId:t,workerType:r.workerType,clientName:r.clientName,clientVersion:r.clientVersion??null,workerVersion:r.workerVersion??null,metadata:r.metadata??null}).onConflictDoUpdate({target:[pe.userId,pe.workerType,pe.clientName],set:{lastHeartbeat:new Date,clientVersion:r.clientVersion??null,workerVersion:r.workerVersion??null,metadata:r.metadata??null}}),d.delete(pe).where(Uc(Ao(pe.userId,t),SP(pe.lastHeartbeat,new Date(Date.now()-AP)))).catch(()=>{});let o=jP(r.workerType,r.metadata);return o??=NP(r.workerType,r.metadata),!o&&r.workerType==="cli-worker"&&(o=await kP(t,xg(r.metadata))),o&&console.warn(`[workers/heartbeat] ${r.workerType} ${r.clientName} (version=${r.workerVersion??"unknown"}): ${o.code} \u2014 ${o.message}`),e.json({status:"ok",...o?{advisory:o}:{}})});async function fb(e){let t=new Date(Date.now()-Ag),n=await d.select({lastHeartbeat:pe.lastHeartbeat}).from(pe).where(Uc(Ao(pe.userId,e),Ao(pe.workerType,"cli-worker"),bg(pe.lastHeartbeat,t))),r=Date.now();return{cliEverConnected:n.length>0,workerActive:n.some(o=>r-new Date(o.lastHeartbeat).getTime()<Sg)}}u(fb,"computeCliWorkerSetupSignals");async function xl(e){let t=await d.select({lastHeartbeat:pe.lastHeartbeat,metadata:pe.metadata}).from(pe).where(Uc(Ao(pe.userId,e),Ao(pe.workerType,"cli-worker"))).orderBy(Ig(pe.lastHeartbeat)).limit(10);for(let n of t){let r=n.metadata?.llmEngines;if(r&&typeof r=="object"){let o=r;return{claude:o.claude===!0,codex:o.codex===!0,codexModel:typeof o.codexModel=="string"?o.codexModel:null,observedAt:new Date(n.lastHeartbeat).toISOString()}}}return null}u(xl,"getLatestLlmEngines");Ui.get("/workers/status",async e=>{let t=e.get("userId"),n=new Date(Date.now()-Ag),r=await d.select().from(pe).where(Uc(Ao(pe.userId,t),bg(pe.lastHeartbeat,n))).orderBy(Ig(pe.lastHeartbeat)),o=Date.now(),s=r.map(i=>{let c=o-new Date(i.lastHeartbeat).getTime();return{id:i.id,workerType:i.workerType,clientName:i.clientName,clientVersion:i.clientVersion,workerVersion:i.workerVersion,lastHeartbeat:i.lastHeartbeat,connectedAt:i.connectedAt,status:c<Sg?"active":"inactive"}});return e.json(s)});Ui.get("/workers/health",async e=>{let t=e.get("userId"),n=new Date(Date.now()-Ag),[r,o,s]=await Promise.all([d.select({lastHeartbeat:pe.lastHeartbeat,clientName:pe.clientName,clientVersion:pe.clientVersion,metadata:pe.metadata}).from(pe).where(Uc(Ao(pe.userId,t),Ao(pe.workerType,"cli-worker"),bg(pe.lastHeartbeat,n))).orderBy(Ig(pe.lastHeartbeat)).limit(1),RP(t),pb(t)]),i=r[0],c=i?Date.now()-new Date(i.lastHeartbeat).getTime():null,a=i?i.metadata??void 0:void 0,l={present:i!=null,active:c!=null&&c<Sg,ageSeconds:c==null?null:Math.round(c/1e3),capabilities:i?xg(a):null,busy:s,engines:i?qc(a):null},m=El(l,o);return e.json({worker:{present:l.present,active:l.active,ageSeconds:l.ageSeconds,clientName:i?.clientName??null,clientVersion:i?.clientVersion??null,lastHeartbeat:i?.lastHeartbeat??null,capabilities:l.capabilities,engines:l.engines},pending:o,verdict:m})});C();import{Hono as PP}from"hono";import{z as Tg}from"zod";import{and as Rg,desc as gb,eq as gr,inArray as DP,isNull as OP,sql as nt}from"drizzle-orm";var Hc=new PP,CP=Tg.object({limit:Tg.coerce.number().int().min(1).max(100).default(20),hours:Tg.coerce.number().int().min(1).max(168).default(24)}),LP=6e4,MP=3600*1e3;function hb(e,t){return nt.join(vg.map(({table:n,defaultKind:r,labelIdSql:o,labelTextSql:s})=>nt`
747
666
  SELECT id::text AS id,
748
667
  ${n} AS source_table,
749
668
  coalesce(task_kind, ${r}) AS kind,
@@ -753,15 +672,15 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
753
672
  claimed_at,
754
673
  lease_expires_at,
755
674
  completed_at,
756
- ${rt.raw(o)} AS label_id,
757
- ${rt.raw(s)} AS label_text,
675
+ ${nt.raw(o)} AS label_id,
676
+ ${nt.raw(s)} AS label_text,
758
677
  result->>'skipped' AS skipped,
759
678
  result->>'reason' AS reason,
760
679
  result->>'decision' AS decision,
761
680
  error
762
- FROM ${rt.raw(n)}
763
- WHERE user_id = ${e}::uuid AND ${t}`),rt` UNION ALL `)}d(k0,"jobSelect");Uc.post("/loop/run-now",async e=>{let t=d(async n=>{try{let r=await nt.execute(rt`SELECT ${rt.raw(n)}() AS r`);return String(r[0]?.r??"0")}catch(r){return`error: ${r instanceof Error?r.message:String(r)}`}},"run");return e.json({insights:await t("regenerate_insights_jobs"),training:await t("enqueue_instruction_training"),autoAccept:await t("enqueue_auto_accept_suggestions"),evolution:await t("enqueue_instruction_evolution"),autorun:await t("enqueue_eval_autorun")})});Uc.get("/loop/status",async e=>{let t=e.get("userId"),n=TO.safeParse({limit:e.req.query("limit"),hours:e.req.query("hours")});if(!n.success)return e.json({error:"Invalid query",details:n.error.flatten()},400);let{limit:r,hours:o}=n.data,s=k0(t,rt`status IN ('pending', 'claimed', 'running')`),i=k0(t,rt`status IN ('completed', 'failed')
764
- AND completed_at > now() - make_interval(hours => ${o})`),[a,c,l]=await Promise.all([u.execute(rt`${s} ORDER BY created_at ASC`),u.execute(rt`${i} ORDER BY completed_at DESC LIMIT ${r}`),u.execute(rt`SELECT count(*)::int AS n FROM (${i}) q`)]),p=[...new Set([...a,...c].map(N=>N.label_id).filter(N=>!!N))],m=new Map;if(p.length>0){let N=await u.select({id:k.id,name:k.name}).from(k).where(EO(k.id,p));for(let me of N)m.set(me.id,me.name)}let y=Date.now(),v=d(N=>(N.label_id?m.get(N.label_id)??null:null)??N.label_text,"label"),h=a.filter(N=>N.status==="claimed"||N.status==="running").map(N=>({id:N.id,kind:N.kind,label:v(N),claimedAt:N.claimed_at,elapsedSeconds:N.claimed_at?Math.round((y-new Date(N.claimed_at).getTime())/1e3):null,leaseHealthy:N.lease_expires_at?new Date(N.lease_expires_at).getTime()>y:!1})),f=a.filter(N=>N.status==="pending").map(N=>({id:N.id,kind:N.kind,label:v(N),createdAt:N.created_at,waitedSeconds:Math.round((y-new Date(N.created_at).getTime())/1e3),attempts:N.attempts})),w=c.map(N=>({id:N.id,kind:N.kind,label:v(N),finishedAt:N.completed_at,durationSeconds:N.claimed_at&&N.completed_at?Math.round((new Date(N.completed_at).getTime()-new Date(N.claimed_at).getTime())/1e3):null,outcome:N.status==="failed"?"failed":N.skipped?"skipped":N.decision?"decided":"ok",reason:N.skipped??N.decision??(N.status==="failed"?"failed":null),detail:N.reason??N.error??null})),b=await u.select({id:ie.id,evalTargetId:ie.evalTargetId,targetName:k.name,createdAt:ie.createdAt,decision:ie.decision,applied:ie.applied,effectClass:ie.effectClass,proposalSource:ie.proposalSource}).from(ie).leftJoin(k,gr(ie.evalTargetId,k.id)).where(gr(ie.userId,t)).orderBy(R0(ie.createdAt)).limit(r),I=u.execute(rt`
681
+ FROM ${nt.raw(n)}
682
+ WHERE user_id = ${e}::uuid AND ${t}`),nt` UNION ALL `)}u(hb,"jobSelect");Hc.post("/loop/run-now",async e=>{let t=u(async n=>{try{let r=await tt.execute(nt`SELECT ${nt.raw(n)}() AS r`);return String(r[0]?.r??"0")}catch(r){return`error: ${r instanceof Error?r.message:String(r)}`}},"run");return e.json({insights:await t("regenerate_insights_jobs"),training:await t("enqueue_instruction_training"),autoAccept:await t("enqueue_auto_accept_suggestions"),evolution:await t("enqueue_instruction_evolution"),autorun:await t("enqueue_eval_autorun")})});Hc.get("/loop/status",async e=>{let t=e.get("userId"),n=CP.safeParse({limit:e.req.query("limit"),hours:e.req.query("hours")});if(!n.success)return e.json({error:"Invalid query",details:n.error.flatten()},400);let{limit:r,hours:o}=n.data,s=hb(t,nt`status IN ('pending', 'claimed', 'running')`),i=hb(t,nt`status IN ('completed', 'failed')
683
+ AND completed_at > now() - make_interval(hours => ${o})`),[c,a,l]=await Promise.all([d.execute(nt`${s} ORDER BY created_at ASC`),d.execute(nt`${i} ORDER BY completed_at DESC LIMIT ${r}`),d.execute(nt`SELECT count(*)::int AS n FROM (${i}) q`)]),m=[...new Set([...c,...a].map(j=>j.label_id).filter(j=>!!j))],p=new Map;if(m.length>0){let j=await d.select({id:k.id,name:k.name}).from(k).where(DP(k.id,m));for(let me of j)p.set(me.id,me.name)}let _=Date.now(),I=u(j=>(j.label_id?p.get(j.label_id)??null:null)??j.label_text,"label"),h=c.filter(j=>j.status==="claimed"||j.status==="running").map(j=>({id:j.id,kind:j.kind,label:I(j),claimedAt:j.claimed_at,elapsedSeconds:j.claimed_at?Math.round((_-new Date(j.claimed_at).getTime())/1e3):null,leaseHealthy:j.lease_expires_at?new Date(j.lease_expires_at).getTime()>_:!1})),f=c.filter(j=>j.status==="pending").map(j=>({id:j.id,kind:j.kind,label:I(j),createdAt:j.created_at,waitedSeconds:Math.round((_-new Date(j.created_at).getTime())/1e3),attempts:j.attempts})),w=a.map(j=>({id:j.id,kind:j.kind,label:I(j),finishedAt:j.completed_at,durationSeconds:j.claimed_at&&j.completed_at?Math.round((new Date(j.completed_at).getTime()-new Date(j.claimed_at).getTime())/1e3):null,outcome:j.status==="failed"?"failed":j.skipped?"skipped":j.decision?"decided":"ok",reason:j.skipped??j.decision??(j.status==="failed"?"failed":null),detail:j.reason??j.error??null})),b=await d.select({id:ie.id,evalTargetId:ie.evalTargetId,targetName:k.name,createdAt:ie.createdAt,decision:ie.decision,applied:ie.applied,effectClass:ie.effectClass,proposalSource:ie.proposalSource}).from(ie).leftJoin(k,gr(ie.evalTargetId,k.id)).where(gr(ie.userId,t)).orderBy(gb(ie.createdAt)).limit(r),v=d.execute(nt`
765
684
  SELECT count(*)::int AS decisions,
766
685
  count(*) FILTER (WHERE p.applied)::int AS applied,
767
686
  count(*) FILTER (WHERE p.decision = 'promote')::int AS promote,
@@ -796,7 +715,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
796
715
  FROM instruction_promotions p
797
716
  LEFT JOIN eval_targets t ON t.id = p.eval_target_id
798
717
  WHERE p.user_id = ${t}::uuid
799
- `),S=u.select({proposed:rt`count(*)::int`,accepted:rt`count(*) filter (where ${x.acceptedAt} is not null)::int`,lastAcceptedAt:rt`max(${x.acceptedAt})::text`}).from(x).where(gr(x.userId,t)),[A,E,R,D]=await Promise.all([u.select({n:rt`count(*)::int`}).from(ie).where(gr(ie.userId,t)),u.select({n:rt`count(*)::int`}).from(q).where(Ng(gr(q.userId,t),gr(q.status,"running"))),u.select({kind:x.kind,n:rt`count(*)::int`}).from(x).where(Ng(gr(x.userId,t),xO(x.dismissedAt))).groupBy(x.kind),u.select({entries:rt`count(*)::int`,distinct:rt`count(distinct ${Ee.contentHash})::int`,repeated:rt`count(*) filter (where ${Ee.timesGenerated} > 1)::int`,dismissed:rt`count(*) filter (where ${Ee.dismissedAt} is not null)::int`,maxTimesGenerated:rt`coalesce(max(${Ee.timesGenerated}), 0)::int`,lastSeenAt:rt`max(${Ee.lastSeenAt})`}).from(Ee).where(gr(Ee.userId,t))]),[j,P]=await Promise.all([I,S]),$=j[0],H=P[0],te=(await u.select({lastHeartbeat:fe.lastHeartbeat,clientName:fe.clientName,clientVersion:fe.clientVersion,metadata:fe.metadata}).from(fe).where(Ng(gr(fe.userId,t),gr(fe.workerType,"cli-worker"),rt`${fe.lastHeartbeat} > ${new Date(y-kO).toISOString()}::timestamptz`)).orderBy(R0(fe.lastHeartbeat)).limit(1))[0],_e=te?y-new Date(te.lastHeartbeat).getTime():null,ee=f.map(N=>({kind:N.kind,count:1,oldestMinutes:Math.round(N.waitedSeconds/60)})),Re={present:te!=null,active:_e!=null&&_e<RO,ageSeconds:_e==null?null:Math.round(_e/1e3),capabilities:null,busy:h.length>0};return e.json({worker:{present:Re.present,active:Re.active,ageSeconds:Re.ageSeconds,clientName:te?.clientName??null,clientVersion:te?.clientVersion??null,lastHeartbeat:te?.lastHeartbeat??null},verdict:xl(Re,ee),running:h,queued:f,recent:w,recentTotal:l[0]?.n??0,proposals:b,proposalTotal:A[0]?.n??0,changes:{decisions:$?.decisions??0,applied:$?.applied??0,byDecision:{promote:$?.promote??0,revert:$?.revert??0,refuse:$?.refuse??0},readyToApply:$?.ready_to_apply??0,readyToApplyTargetId:$?.ready_to_apply_target_id??null,readyToApplyPromotionId:$?.ready_to_apply_promotion_id??null,lastAppliedAt:$?.last_applied_at??null,lastDecidedAt:$?.last_decided_at??null,suggestionsProposed:H?.proposed??0,suggestionsAccepted:H?.accepted??0,lastAcceptedAt:H?.lastAcceptedAt??null},counts:{experimentsRunning:E[0]?.n??0,suggestions:Object.fromEntries(R.map(N=>[N.kind,N.n]))},insights:{entries:D[0]?.entries??0,distinct:D[0]?.distinct??0,repeated:D[0]?.repeated??0,dismissed:D[0]?.dismissed??0,maxTimesGenerated:D[0]?.maxTimesGenerated??0,lastSeenAt:D[0]?.lastSeenAt??null},windowHours:o})});O();import{Hono as NO}from"hono";import{z as On}from"zod";import{and as PO,eq as Xn,sql as Eo}from"drizzle-orm";O();import{and as jO,eq as j0}from"drizzle-orm";async function Ke(e,t){let[n]=await u.select({id:k.id}).from(k).where(jO(j0(k.id,e),j0(k.userId,t)));return n}d(Ke,"verifyTargetOwnership");function Hc(e){return e===!0||e==="true"}d(Hc,"flagOn");function Rl(e,t=!1){let n=e??{},r=n.autoEvolvePairs,o=typeof r=="number"?r:typeof r=="string"?Number(r):NaN,s=Number.isFinite(o)&&o>=1,i=Hc(n.autoEvolvePaused);return{enabled:Hc(n.autoEvolveEnabled),optOut:Hc(n.autoEvolveOptOut),apply:Hc(n.autoEvolveApply),paused:t||i,pausedBy:t?"account":i?"target":null,pairs:s?Math.min(128,Math.max(10,Math.floor(o))):10,pairsConfigured:s,accumulate:Hc(n.autoEvolveAccumulate)}}d(Rl,"resolveEvolutionSettings");function N0(e,t){let n={...e??{}};return t.enabled!==void 0&&(n.autoEvolveEnabled=t.enabled),t.optOut!==void 0&&(n.autoEvolveOptOut=t.optOut),t.apply!==void 0&&(n.autoEvolveApply=t.apply),t.paused!==void 0&&(n.autoEvolvePaused=t.paused),t.accumulate!==void 0&&(n.autoEvolveAccumulate=t.accumulate),t.pairs!==void 0&&(n.autoEvolvePairs=Math.min(128,Math.max(10,Math.floor(t.pairs)))),n}d(N0,"applyEvolutionPatch");function kl(e){if(e.paused)return e.pausedBy==="account"?"Paused for the whole account \u2014 no instruction is measured or rewritten.":"Paused \u2014 no model budget is spent, and the opt-in is kept.";if(e.optOut&&!e.enabled)return"Opted out \u2014 this instruction is never enrolled automatically.";let t=e.enabled?"Enrolled manually":"Eligible for automatic enrolment",n=e.apply?"a promote MAY rewrite the file":"decisions are recorded only, nothing is written";return`${t}; ${n}. Needs ${e.pairs} paired tasks before it can act.`}d(kl,"describeEvolutionState");var hr=new NO,CO=On.object({enabled:On.boolean(),projectId:On.string().uuid().optional()});hr.get("/settings/auto-accept",async e=>{let t=e.get("userId"),n=e.req.query("projectId")??null,[r]=await u.select({enabled:T.autoAcceptSuggestions}).from(T).where(Xn(T.id,t)),o=null;if(n){let[i]=await u.select({raw:Eo`${U.metadata}->>'autoAcceptSuggestions'`}).from(U).where(Xn(U.id,n));i?.raw!=null&&(o=i.raw==="true")}let s=await Vu(t,n);return e.json({effective:s.allowed,source:s.source,accountDefault:r?.enabled??!0,projectOverride:o,limits:{minScore:Dt.MIN_SCORE,maxPerRun:Dt.MAX_PER_RUN,maxPerWindow:Dt.MAX_PER_WINDOW,windowDays:Dt.WINDOW_DAYS,kind:Dt.KIND}})});hr.patch("/settings/auto-accept",async e=>{let t=e.get("userId"),n=CO.safeParse(await e.req.json().catch(()=>({})));if(!n.success)return e.json({error:n.error.flatten()},400);let{enabled:r,projectId:o}=n.data;return o?(await u.update(U).set({metadata:Eo`coalesce(${U.metadata}, '{}'::jsonb) || jsonb_build_object('autoAcceptSuggestions', ${r}::boolean)`}).where(Xn(U.id,o)).returning({id:U.id})).length===0?e.json({error:"Project not found"},404):e.json({scope:"project",projectId:o,enabled:r}):(await u.update(T).set({autoAcceptSuggestions:r}).where(Xn(T.id,t)),e.json({scope:"account",enabled:r}))});var OO=On.object({enabled:On.boolean().optional(),optOut:On.boolean().optional(),apply:On.boolean().optional(),paused:On.boolean().optional(),accumulate:On.boolean().optional(),pairs:On.number().int().min(1).max(1e3).optional()}).refine(e=>Object.keys(e).length>0,{message:"no settings supplied"});async function jl(e){let[t]=await u.select({paused:T.evolutionPaused}).from(T).where(Xn(T.id,e));return t?.paused??!1}d(jl,"readAccountPaused");var DO=On.object({paused:On.boolean()});hr.get("/settings/evolution-account",async e=>{let t=e.get("userId");return e.json({paused:await jl(t)})});hr.patch("/settings/evolution-account",async e=>{let t=e.get("userId"),n=DO.safeParse(await e.req.json().catch(()=>({})));return n.success?(await u.update(T).set({evolutionPaused:n.data.paused}).where(Xn(T.id,t)),e.json({paused:n.data.paused})):e.json({error:n.error.flatten()},400)});hr.get("/settings/evolution/targets",async e=>{let t=e.get("userId"),n=await jl(t),o=(await u.select({id:k.id,name:k.name,autoEvolveEnabled:Eo`${k.metadata}->>'autoEvolveEnabled'`,autoEvolveOptOut:Eo`${k.metadata}->>'autoEvolveOptOut'`,autoEvolveApply:Eo`${k.metadata}->>'autoEvolveApply'`,autoEvolvePaused:Eo`${k.metadata}->>'autoEvolvePaused'`,autoEvolveAccumulate:Eo`${k.metadata}->>'autoEvolveAccumulate'`,autoEvolvePairs:Eo`${k.metadata}->>'autoEvolvePairs'`}).from(k).where(PO(Xn(k.userId,t),Xn(k.type,"instruction"))).orderBy(k.name)).map(i=>{let a=Rl(i,n);return{evalTargetId:i.id,name:i.name,settings:a,summary:kl(a)}}),s=o.filter(i=>i.settings.enabled||i.settings.apply||i.settings.paused||i.settings.optOut||i.settings.accumulate||i.settings.pairsConfigured);return e.json({targets:s,accountPaused:n,limits:{minPairs:10,maxPairs:128},totalInstructionTargets:o.length,unconfigured:o.length-s.length,writable:s.filter(i=>i.settings.apply&&!i.settings.paused).length})});hr.get("/settings/evolution",async e=>{let t=e.get("userId"),n=e.req.query("evalTargetId");if(!n)return e.json({error:"evalTargetId is required"},400);if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let[o]=await u.select({name:k.name,metadata:k.metadata}).from(k).where(Xn(k.id,n));if(!o)return e.json({error:"Eval target not found"},404);let s=Rl(o.metadata,await jl(t));return e.json({evalTargetId:n,name:o.name,settings:s,summary:kl(s),limits:{minPairs:10,maxPairs:128}})});hr.patch("/settings/evolution",async e=>{let t=e.get("userId"),n=e.req.query("evalTargetId");if(!n)return e.json({error:"evalTargetId is required"},400);let r=OO.safeParse(await e.req.json().catch(()=>({})));if(!r.success)return e.json({error:r.error.flatten()},400);if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let[s]=await u.select({metadata:k.metadata}).from(k).where(Xn(k.id,n));if(!s)return e.json({error:"Eval target not found"},404);let i=N0(s.metadata,r.data);await u.update(k).set({metadata:i}).where(Xn(k.id,n));let a=Rl(i,await jl(t));return e.json({evalTargetId:n,settings:a,summary:kl(a)})});O();import{Hono as MO}from"hono";import{and as LO,eq as $O,sql as qO}from"drizzle-orm";var Nl=new MO;Nl.get("/setup/status",async e=>{let t=e.get("userId"),[n,r,o]=await Promise.all([T0(t),u.select({id:_.id}).from(_).where(LO($O(_.userId,t),qO`${_.origin} <> 'internal_worker'`)).limit(1),Tl(t)]);return e.json({cliEverConnected:n.cliEverConnected,anyCapturedSession:r.length>0,workerActive:n.workerActive,llmEngines:o})});O();import{createHash as UO}from"node:crypto";import{Hono as HO}from"hono";import{z as An}from"zod";import{eq as _r,and as Pl,desc as BO,sql as FO}from"drizzle-orm";var xo=new HO,WO=An.object({name:An.string().min(1).max(255),type:An.enum(["instruction","skill","prompt","plan"]),content:An.string().min(1),description:An.string().default(""),metadata:An.record(An.unknown()).default({})}),zO=An.object({name:An.string().min(1).max(255).optional(),content:An.string().min(1).optional(),description:An.string().optional(),metadata:An.record(An.unknown()).optional()});xo.post("/eval-targets",async e=>{let t=e.get("userId"),n=await e.req.json(),r=WO.parse(n),[o]=await u.insert(k).values({userId:t,name:r.name,type:r.type,content:r.content,description:r.description,metadata:r.metadata}).returning();return e.json(o,201)});xo.get("/eval-targets",async e=>{let t=e.get("userId"),n=e.req.query("type"),r=e.req.query("content_hash"),o=[_r(k.userId,t)];n&&o.push(_r(k.type,n)),r&&o.push(FO`${k.metadata}->>'content_hash' = ${r}`);let s=e.req.query("limit"),i=e.req.query("offset"),a=s?parseInt(s,10):NaN,c=Number.isFinite(a)?Math.min(Math.max(1,a),200):100,l=i?parseInt(i,10):NaN,p=Number.isFinite(l)?Math.max(0,l):0,m=await u.select({id:k.id,userId:k.userId,name:k.name,type:k.type,description:k.description,metadata:k.metadata,version:k.version,parentId:k.parentId,createdAt:k.createdAt,updatedAt:k.updatedAt}).from(k).where(Pl(...o)).orderBy(BO(k.updatedAt)).limit(c).offset(p);return e.json(m)});xo.get("/eval-targets/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(k).where(Pl(_r(k.id,n),_r(k.userId,t)));return r?e.json(r):e.json({error:"Eval target not found"},404)});xo.post("/eval-targets/:id/sync-content",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json().catch(()=>({})),o=typeof r?.content=="string"?r.content:null;if(!o||o.trim().length===0)return e.json({error:"content is required"},400);let[s]=await u.select().from(k).where(Pl(_r(k.id,n),_r(k.userId,t)));if(!s)return e.json({error:"Eval target not found"},404);if(s.content===o)return e.json({id:n,synced:!1,version:s.version,reason:"already current"});let i=s.metadata&&typeof s.metadata=="object"&&!Array.isArray(s.metadata)?s.metadata:{},[a]=await u.update(k).set({content:o,version:(s.version??1)+1,metadata:{...i,content_hash:UO("sha256").update(o).digest("hex")},updatedAt:new Date}).where(_r(k.id,n)).returning({version:k.version});return e.json({id:n,synced:!0,version:a.version})});xo.put("/eval-targets/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=zO.parse(r),[s]=await u.select().from(k).where(Pl(_r(k.id,n),_r(k.userId,t)));if(!s)return e.json({error:"Eval target not found"},404);if(o.content&&o.content!==s.content){let[a]=await u.insert(k).values({userId:t,name:o.name??s.name,type:s.type,content:o.content,description:o.description??s.description,metadata:o.metadata??s.metadata,version:s.version+1,parentId:s.id}).returning();return e.json(a)}let[i]=await u.update(k).set({name:o.name??s.name,description:o.description??s.description,metadata:o.metadata??s.metadata,updatedAt:new Date}).where(_r(k.id,n)).returning();return e.json(i)});O();import{Hono as VO}from"hono";import{z as $t}from"zod";import{eq as Cl,and as O0,isNull as JO,desc as GO}from"drizzle-orm";var Bi=new VO,KO=$t.object({name:$t.string().min(1).max(255),prompt:$t.string().min(1),expectedOutput:$t.string().default(""),files:$t.array($t.unknown()).default([]),expectations:$t.array($t.string()).default([])});Bi.post("/eval-targets/:id/evals",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=KO.parse(r);if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let[i]=await u.insert(Se).values({evalTargetId:n,name:o.name,prompt:o.prompt,expectedOutput:o.expectedOutput,files:o.files,expectations:o.expectations}).returning();return e.json(i,201)});Bi.get("/eval-targets/:id/evals",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=e.req.query("includeRetired")==="1";if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let s=await u.select().from(Se).where(r?Cl(Se.evalTargetId,n):O0(Cl(Se.evalTargetId,n),JO(Se.retiredAt))).orderBy(GO(Se.createdAt));return e.json(s)});var YO=$t.object({retire:$t.boolean().optional(),retiredReason:$t.string().max(500).optional(),name:$t.string().min(1).max(255).optional(),prompt:$t.string().min(1).optional(),expectedOutput:$t.string().optional(),files:$t.array($t.unknown()).optional(),expectations:$t.array($t.string()).optional()}).refine(e=>e.retire!==void 0||e.name!==void 0||e.prompt!==void 0||e.expectedOutput!==void 0||e.files!==void 0||e.expectations!==void 0,{message:"nothing to update"});Bi.patch("/eval-targets/:id/evals/:evalId",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=e.req.param("evalId"),o=YO.parse(await e.req.json());if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let i={updatedAt:new Date};o.retire!==void 0&&(i.retiredAt=o.retire?new Date:null,i.retiredReason=o.retire?o.retiredReason??null:null),o.name!==void 0&&(i.name=o.name),o.prompt!==void 0&&(i.prompt=o.prompt),o.expectedOutput!==void 0&&(i.expectedOutput=o.expectedOutput),o.files!==void 0&&(i.files=o.files),o.expectations!==void 0&&(i.expectations=o.expectations),(o.prompt!==void 0||o.expectations!==void 0||o.files!==void 0||o.expectedOutput!==void 0)&&(i.contentUpdatedAt=new Date);let[a]=await u.update(Se).set(i).where(O0(Cl(Se.id,r),Cl(Se.evalTargetId,n))).returning();return a?e.json(a):e.json({error:"Eval case not found"},404)});O();import{Hono as QO}from"hono";import{z as Ne}from"zod";import{createHash as ZO}from"node:crypto";import{and as Dl,eq as on,gte as M0,desc as eD,sql as Pg}from"drizzle-orm";O();import{eq as XO,sql as To}from"drizzle-orm";async function Fi(e,t){let r=await u.execute(To`
718
+ `),S=d.select({proposed:nt`count(*)::int`,accepted:nt`count(*) filter (where ${x.acceptedAt} is not null)::int`,lastAcceptedAt:nt`max(${x.acceptedAt})::text`}).from(x).where(gr(x.userId,t)),[A,E,R,P]=await Promise.all([d.select({n:nt`count(*)::int`}).from(ie).where(gr(ie.userId,t)),d.select({n:nt`count(*)::int`}).from(U).where(Rg(gr(U.userId,t),gr(U.status,"running"))),d.select({kind:x.kind,n:nt`count(*)::int`}).from(x).where(Rg(gr(x.userId,t),OP(x.dismissedAt))).groupBy(x.kind),d.select({entries:nt`count(*)::int`,distinct:nt`count(distinct ${Ae.contentHash})::int`,repeated:nt`count(*) filter (where ${Ae.timesGenerated} > 1)::int`,dismissed:nt`count(*) filter (where ${Ae.dismissedAt} is not null)::int`,maxTimesGenerated:nt`coalesce(max(${Ae.timesGenerated}), 0)::int`,lastSeenAt:nt`max(${Ae.lastSeenAt})`}).from(Ae).where(gr(Ae.userId,t))]),[N,D]=await Promise.all([v,S]),q=N[0],H=D[0],ee=(await d.select({lastHeartbeat:pe.lastHeartbeat,clientName:pe.clientName,clientVersion:pe.clientVersion,metadata:pe.metadata}).from(pe).where(Rg(gr(pe.userId,t),gr(pe.workerType,"cli-worker"),nt`${pe.lastHeartbeat} > ${new Date(_-MP).toISOString()}::timestamptz`)).orderBy(gb(pe.lastHeartbeat)).limit(1))[0],he=ee?_-new Date(ee.lastHeartbeat).getTime():null,te=f.map(j=>({kind:j.kind,count:1,oldestMinutes:Math.round(j.waitedSeconds/60)})),Te={present:ee!=null,active:he!=null&&he<LP,ageSeconds:he==null?null:Math.round(he/1e3),capabilities:null,busy:h.length>0,engines:ee?qc(ee.metadata):null};return e.json({worker:{present:Te.present,active:Te.active,ageSeconds:Te.ageSeconds,clientName:ee?.clientName??null,clientVersion:ee?.clientVersion??null,lastHeartbeat:ee?.lastHeartbeat??null},verdict:El(Te,te),running:h,queued:f,recent:w,recentTotal:l[0]?.n??0,proposals:b,proposalTotal:A[0]?.n??0,changes:{decisions:q?.decisions??0,applied:q?.applied??0,byDecision:{promote:q?.promote??0,revert:q?.revert??0,refuse:q?.refuse??0},readyToApply:q?.ready_to_apply??0,readyToApplyTargetId:q?.ready_to_apply_target_id??null,readyToApplyPromotionId:q?.ready_to_apply_promotion_id??null,lastAppliedAt:q?.last_applied_at??null,lastDecidedAt:q?.last_decided_at??null,suggestionsProposed:H?.proposed??0,suggestionsAccepted:H?.accepted??0,lastAcceptedAt:H?.lastAcceptedAt??null},counts:{experimentsRunning:E[0]?.n??0,suggestions:Object.fromEntries(R.map(j=>[j.kind,j.n]))},insights:{entries:P[0]?.entries??0,distinct:P[0]?.distinct??0,repeated:P[0]?.repeated??0,dismissed:P[0]?.dismissed??0,maxTimesGenerated:P[0]?.maxTimesGenerated??0,lastSeenAt:P[0]?.lastSeenAt??null},windowHours:o})});C();import{Hono as qP}from"hono";import{z as Wt}from"zod";import{and as UP,eq as Ln,sql as vs}from"drizzle-orm";C();import{and as $P,eq as _b}from"drizzle-orm";async function Ge(e,t){let[n]=await d.select({id:k.id}).from(k).where($P(_b(k.id,e),_b(k.userId,t)));return n}u(Ge,"verifyTargetOwnership");function Bc(e){return e===!0||e==="true"}u(Bc,"flagOn");function Tl(e,t=!1){let n=e??{},r=n.autoEvolvePairs,o=typeof r=="number"?r:typeof r=="string"?Number(r):NaN,s=Number.isFinite(o)&&o>=1,i=Bc(n.autoEvolvePaused);return{enabled:Bc(n.autoEvolveEnabled),optOut:Bc(n.autoEvolveOptOut),apply:Bc(n.autoEvolveApply),paused:t||i,pausedBy:t?"account":i?"target":null,pairs:s?Math.min(128,Math.max(10,Math.floor(o))):10,pairsConfigured:s,accumulate:Bc(n.autoEvolveAccumulate)}}u(Tl,"resolveEvolutionSettings");function yb(e,t){let n={...e??{}};return t.enabled!==void 0&&(n.autoEvolveEnabled=t.enabled),t.optOut!==void 0&&(n.autoEvolveOptOut=t.optOut),t.apply!==void 0&&(n.autoEvolveApply=t.apply),t.paused!==void 0&&(n.autoEvolvePaused=t.paused),t.accumulate!==void 0&&(n.autoEvolveAccumulate=t.accumulate),t.pairs!==void 0&&(n.autoEvolvePairs=Math.min(128,Math.max(10,Math.floor(t.pairs)))),n}u(yb,"applyEvolutionPatch");function Rl(e){if(e.paused)return e.pausedBy==="account"?"Paused for the whole account \u2014 no instruction is measured or rewritten.":"Paused \u2014 no model budget is spent, and the opt-in is kept.";if(e.optOut&&!e.enabled)return"Opted out \u2014 this instruction is never enrolled automatically.";let t=e.enabled?"Enrolled manually":"Eligible for automatic enrolment",n=e.apply?"a promote MAY rewrite the file":"decisions are recorded only, nothing is written";return`${t}; ${n}. Needs ${e.pairs} paired tasks before it can act.`}u(Rl,"describeEvolutionState");var hr=new qP,HP=Wt.object({enabled:Wt.boolean().optional(),projectId:Wt.string().uuid().optional(),limits:Wt.object({minScore:Wt.number().min(Nn.minScore.min).max(Nn.minScore.max).nullable(),maxPerRun:Wt.number().int().min(Nn.maxPerRun.min).max(Nn.maxPerRun.max).nullable(),maxPerWindow:Wt.number().int().min(Nn.maxPerWindow.min).max(Nn.maxPerWindow.max).nullable(),windowDays:Wt.number().int().min(Nn.windowDays.min).max(Nn.windowDays.max).nullable()}).partial().optional()}).refine(e=>e.enabled!==void 0||e.limits!==void 0,{message:"nothing to change: pass `enabled`, `limits`, or both"});hr.get("/settings/auto-accept",async e=>{let t=e.get("userId"),n=e.req.query("projectId")??null,[r]=await d.select({enabled:T.autoAcceptSuggestions}).from(T).where(Ln(T.id,t)),o=null;if(n){let[i]=await d.select({raw:vs`${M.metadata}->>'autoAcceptSuggestions'`}).from(M).where(Ln(M.id,n));i?.raw!=null&&(o=i.raw==="true")}let s=await zd(t,n);return e.json({effective:s.allowed,source:s.source,accountDefault:r?.enabled??!0,projectOverride:o,limits:{...await hi(t,n),bounds:Nn},defaults:{minScore:cn.MIN_SCORE,maxPerRun:cn.MAX_PER_RUN,maxPerWindow:cn.MAX_PER_WINDOW,windowDays:cn.WINDOW_DAYS}})});var BP={minScore:"autoAcceptMinScore",maxPerRun:"autoAcceptMaxPerRun",maxPerWindow:"autoAcceptMaxPerWindow",windowDays:"autoAcceptWindowDays"};function FP(e,t){let n={...e??{}};for(let[r,o]of Object.entries(t))o!==void 0&&(o===null?delete n[r]:n[r]=o);return n}u(FP,"mergeLimitOverrides");hr.patch("/settings/auto-accept",async e=>{let t=e.get("userId"),n=HP.safeParse(await e.req.json().catch(()=>({})));if(!n.success)return e.json({error:n.error.flatten()},400);let{enabled:r,projectId:o,limits:s}=n.data;if(o){let[c]=await d.select({metadata:M.metadata}).from(M).where(Ln(M.id,o));if(!c)return e.json({error:"Project not found"},404);let a=c.metadata??{},l={...a};if(r!==void 0&&(l.autoAcceptSuggestions=r),s){let m=FP(a.autoAcceptLimits,s);Object.keys(m).length>0?l.autoAcceptLimits=m:delete l.autoAcceptLimits}return await d.update(M).set({metadata:l}).where(Ln(M.id,o)),e.json({scope:"project",projectId:o,enabled:r,limits:await hi(t,o)})}let i={};r!==void 0&&(i.autoAcceptSuggestions=r);for(let[c,a]of Object.entries(BP)){let l=s?.[c];l!==void 0&&(i[a]=l)}return Object.keys(i).length>0&&await d.update(T).set(i).where(Ln(T.id,t)),e.json({scope:"account",enabled:r,limits:await hi(t,null)})});var WP=Wt.object({enabled:Wt.boolean().optional(),optOut:Wt.boolean().optional(),apply:Wt.boolean().optional(),paused:Wt.boolean().optional(),accumulate:Wt.boolean().optional(),pairs:Wt.number().int().min(1).max(1e3).optional()}).refine(e=>Object.keys(e).length>0,{message:"no settings supplied"});async function kl(e){let[t]=await d.select({paused:T.evolutionPaused}).from(T).where(Ln(T.id,e));return t?.paused??!1}u(kl,"readAccountPaused");var zP=Wt.object({paused:Wt.boolean()});hr.get("/settings/evolution-account",async e=>{let t=e.get("userId");return e.json({paused:await kl(t)})});hr.patch("/settings/evolution-account",async e=>{let t=e.get("userId"),n=zP.safeParse(await e.req.json().catch(()=>({})));return n.success?(await d.update(T).set({evolutionPaused:n.data.paused}).where(Ln(T.id,t)),e.json({paused:n.data.paused})):e.json({error:n.error.flatten()},400)});hr.get("/settings/evolution/targets",async e=>{let t=e.get("userId"),n=await kl(t),o=(await d.select({id:k.id,name:k.name,autoEvolveEnabled:vs`${k.metadata}->>'autoEvolveEnabled'`,autoEvolveOptOut:vs`${k.metadata}->>'autoEvolveOptOut'`,autoEvolveApply:vs`${k.metadata}->>'autoEvolveApply'`,autoEvolvePaused:vs`${k.metadata}->>'autoEvolvePaused'`,autoEvolveAccumulate:vs`${k.metadata}->>'autoEvolveAccumulate'`,autoEvolvePairs:vs`${k.metadata}->>'autoEvolvePairs'`}).from(k).where(UP(Ln(k.userId,t),Ln(k.type,"instruction"))).orderBy(k.name)).map(i=>{let c=Tl(i,n);return{evalTargetId:i.id,name:i.name,settings:c,summary:Rl(c)}}),s=o.filter(i=>i.settings.enabled||i.settings.apply||i.settings.paused||i.settings.optOut||i.settings.accumulate||i.settings.pairsConfigured);return e.json({targets:s,accountPaused:n,limits:{minPairs:10,maxPairs:128},totalInstructionTargets:o.length,unconfigured:o.length-s.length,writable:s.filter(i=>i.settings.apply&&!i.settings.paused).length})});hr.get("/settings/evolution",async e=>{let t=e.get("userId"),n=e.req.query("evalTargetId");if(!n)return e.json({error:"evalTargetId is required"},400);if(!await Ge(n,t))return e.json({error:"Eval target not found"},404);let[o]=await d.select({name:k.name,metadata:k.metadata}).from(k).where(Ln(k.id,n));if(!o)return e.json({error:"Eval target not found"},404);let s=Tl(o.metadata,await kl(t));return e.json({evalTargetId:n,name:o.name,settings:s,summary:Rl(s),limits:{minPairs:10,maxPairs:128}})});hr.patch("/settings/evolution",async e=>{let t=e.get("userId"),n=e.req.query("evalTargetId");if(!n)return e.json({error:"evalTargetId is required"},400);let r=WP.safeParse(await e.req.json().catch(()=>({})));if(!r.success)return e.json({error:r.error.flatten()},400);if(!await Ge(n,t))return e.json({error:"Eval target not found"},404);let[s]=await d.select({metadata:k.metadata}).from(k).where(Ln(k.id,n));if(!s)return e.json({error:"Eval target not found"},404);let i=yb(s.metadata,r.data);await d.update(k).set({metadata:i}).where(Ln(k.id,n));let c=Tl(i,await kl(t));return e.json({evalTargetId:n,settings:c,summary:Rl(c)})});C();import{Hono as VP}from"hono";import{and as JP,eq as KP,sql as GP}from"drizzle-orm";var Nl=new VP;Nl.get("/setup/status",async e=>{let t=e.get("userId"),[n,r,o]=await Promise.all([fb(t),d.select({id:y.id}).from(y).where(JP(KP(y.userId,t),GP`${y.origin} <> 'internal_worker'`)).limit(1),xl(t)]);return e.json({cliEverConnected:n.cliEverConnected,anyCapturedSession:r.length>0,workerActive:n.workerActive,llmEngines:o})});C();import{createHash as YP}from"node:crypto";import{Hono as XP}from"hono";import{z as An}from"zod";import{eq as _r,and as jl,desc as QP,sql as ZP}from"drizzle-orm";var Eo=new XP,eD=An.object({name:An.string().min(1).max(255),type:An.enum(["instruction","skill","prompt","plan"]),content:An.string().min(1),description:An.string().default(""),metadata:An.record(An.unknown()).default({})}),tD=An.object({name:An.string().min(1).max(255).optional(),content:An.string().min(1).optional(),description:An.string().optional(),metadata:An.record(An.unknown()).optional()});Eo.post("/eval-targets",async e=>{let t=e.get("userId"),n=await e.req.json(),r=eD.parse(n),[o]=await d.insert(k).values({userId:t,name:r.name,type:r.type,content:r.content,description:r.description,metadata:r.metadata}).returning();return e.json(o,201)});Eo.get("/eval-targets",async e=>{let t=e.get("userId"),n=e.req.query("type"),r=e.req.query("content_hash"),o=[_r(k.userId,t)];n&&o.push(_r(k.type,n)),r&&o.push(ZP`${k.metadata}->>'content_hash' = ${r}`);let s=e.req.query("limit"),i=e.req.query("offset"),c=s?parseInt(s,10):NaN,a=Number.isFinite(c)?Math.min(Math.max(1,c),200):100,l=i?parseInt(i,10):NaN,m=Number.isFinite(l)?Math.max(0,l):0,p=await d.select({id:k.id,userId:k.userId,name:k.name,type:k.type,description:k.description,metadata:k.metadata,version:k.version,parentId:k.parentId,createdAt:k.createdAt,updatedAt:k.updatedAt}).from(k).where(jl(...o)).orderBy(QP(k.updatedAt)).limit(a).offset(m);return e.json(p)});Eo.get("/eval-targets/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select().from(k).where(jl(_r(k.id,n),_r(k.userId,t)));return r?e.json(r):e.json({error:"Eval target not found"},404)});Eo.post("/eval-targets/:id/sync-content",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json().catch(()=>({})),o=typeof r?.content=="string"?r.content:null;if(!o||o.trim().length===0)return e.json({error:"content is required"},400);let[s]=await d.select().from(k).where(jl(_r(k.id,n),_r(k.userId,t)));if(!s)return e.json({error:"Eval target not found"},404);if(s.content===o)return e.json({id:n,synced:!1,version:s.version,reason:"already current"});let i=s.metadata&&typeof s.metadata=="object"&&!Array.isArray(s.metadata)?s.metadata:{},[c]=await d.update(k).set({content:o,version:(s.version??1)+1,metadata:{...i,content_hash:YP("sha256").update(o).digest("hex")},updatedAt:new Date}).where(_r(k.id,n)).returning({version:k.version});return e.json({id:n,synced:!0,version:c.version})});Eo.put("/eval-targets/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=tD.parse(r),[s]=await d.select().from(k).where(jl(_r(k.id,n),_r(k.userId,t)));if(!s)return e.json({error:"Eval target not found"},404);if(o.content&&o.content!==s.content){let[c]=await d.insert(k).values({userId:t,name:o.name??s.name,type:s.type,content:o.content,description:o.description??s.description,metadata:o.metadata??s.metadata,version:s.version+1,parentId:s.id}).returning();return e.json(c)}let[i]=await d.update(k).set({name:o.name??s.name,description:o.description??s.description,metadata:o.metadata??s.metadata,updatedAt:new Date}).where(_r(k.id,n)).returning();return e.json(i)});C();import{Hono as nD}from"hono";import{z as Lt}from"zod";import{eq as Pl,and as Ib,isNull as rD,desc as oD}from"drizzle-orm";var Hi=new nD,sD=Lt.object({name:Lt.string().min(1).max(255),prompt:Lt.string().min(1),expectedOutput:Lt.string().default(""),files:Lt.array(Lt.unknown()).default([]),expectations:Lt.array(Lt.string()).default([])});Hi.post("/eval-targets/:id/evals",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=sD.parse(r);if(!await Ge(n,t))return e.json({error:"Eval target not found"},404);let[i]=await d.insert(Ie).values({evalTargetId:n,name:o.name,prompt:o.prompt,expectedOutput:o.expectedOutput,files:o.files,expectations:o.expectations}).returning();return e.json(i,201)});Hi.get("/eval-targets/:id/evals",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=e.req.query("includeRetired")==="1";if(!await Ge(n,t))return e.json({error:"Eval target not found"},404);let s=await d.select().from(Ie).where(r?Pl(Ie.evalTargetId,n):Ib(Pl(Ie.evalTargetId,n),rD(Ie.retiredAt))).orderBy(oD(Ie.createdAt));return e.json(s)});var iD=Lt.object({retire:Lt.boolean().optional(),retiredReason:Lt.string().max(500).optional(),name:Lt.string().min(1).max(255).optional(),prompt:Lt.string().min(1).optional(),expectedOutput:Lt.string().optional(),files:Lt.array(Lt.unknown()).optional(),expectations:Lt.array(Lt.string()).optional()}).refine(e=>e.retire!==void 0||e.name!==void 0||e.prompt!==void 0||e.expectedOutput!==void 0||e.files!==void 0||e.expectations!==void 0,{message:"nothing to update"});Hi.patch("/eval-targets/:id/evals/:evalId",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=e.req.param("evalId"),o=iD.parse(await e.req.json());if(!await Ge(n,t))return e.json({error:"Eval target not found"},404);let i={updatedAt:new Date};o.retire!==void 0&&(i.retiredAt=o.retire?new Date:null,i.retiredReason=o.retire?o.retiredReason??null:null),o.name!==void 0&&(i.name=o.name),o.prompt!==void 0&&(i.prompt=o.prompt),o.expectedOutput!==void 0&&(i.expectedOutput=o.expectedOutput),o.files!==void 0&&(i.files=o.files),o.expectations!==void 0&&(i.expectations=o.expectations),(o.prompt!==void 0||o.expectations!==void 0||o.files!==void 0||o.expectedOutput!==void 0)&&(i.contentUpdatedAt=new Date);let[c]=await d.update(Ie).set(i).where(Ib(Pl(Ie.id,r),Pl(Ie.evalTargetId,n))).returning();return c?e.json(c):e.json({error:"Eval case not found"},404)});C();import{Hono as cD}from"hono";import{z as Ne}from"zod";import{createHash as uD}from"node:crypto";import{and as Ol,eq as rn,gte as Sb,desc as dD,sql as kg}from"drizzle-orm";C();import{eq as aD,sql as xo}from"drizzle-orm";async function Bi(e,t){let r=await d.execute(xo`
800
719
  SELECT
801
720
  r.configuration,
802
721
  r.created_at,
@@ -839,7 +758,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
839
758
  AND ev.retired_at IS NULL
840
759
  AND r.grading->'summary'->>'pass_rate' IS NOT NULL
841
760
  AND r.configuration IN ('with_target', 'without_target')
842
- `),o=null,s=-1;for(let C of r){if(!C.judge_model)continue;let oe=new Date(C.created_at).getTime();(oe>s||oe===s&&C.judge_model>(o??""))&&(s=oe,o=C.judge_model)}let i=null,a=-1;for(let C of r){let oe=new Date(C.created_at).getTime();oe>a&&(a=oe,i=C.methodology)}let c={with_target:{unlabeledJudge:[],labeled:[]},without_target:{unlabeledJudge:[],labeled:[]}},l={with_target:[],without_target:[]},p=0,m=new Map,y=0,v=0,h=0,f=0;for(let C of r){let oe=c[C.configuration];if(!oe)continue;let ve=C.methodology!==i||C.pre_edit;C.methodology!==i&&(h+=1),C.pre_edit&&(f+=1);let Ce=C.judge_pass?1:0,Te=C.llm_annotated>=C.llm_total;if(C.llm_total>0){let Ye=C.judge_model,Ht=m.get(Ye)??{runs:0,labeledRuns:0,latestRunAt:C.created_at};if(Ht.runs+=1,Te&&(Ht.labeledRuns+=1),new Date(C.created_at).getTime()>new Date(Ht.latestRunAt).getTime()&&(Ht.latestRunAt=C.created_at),m.set(Ye,Ht),Ye!==o){y+=1,Te&&(v+=1);continue}}if(Te){let Ye=C.det_all_passed&&C.llm_truly_passed===C.llm_total?1:0;l[C.configuration]?.push({human:Ye,judge:Ce}),C.llm_total>0&&(p+=1)}if(!ve)if(Te){let Ye=C.det_all_passed&&C.llm_truly_passed===C.llm_total?1:0;oe.labeled.push({human:Ye,judge:Ce})}else oe.unlabeledJudge.push(Ce)}let[w]=await u.select({total:To`count(*)::int`,llmAnchors:To`count(*) FILTER (WHERE ${Je.judgeMethod} = 'llm' AND ${Je.judgeModel} IS NOT DISTINCT FROM ${o})::int`,llmApproved:To`count(*) FILTER (WHERE ${Je.judgeMethod} = 'llm' AND ${Je.judgeModel} IS NOT DISTINCT FROM ${o} AND ${Je.verdict} = 'approve')::int`,staleLlmAnchors:To`count(*) FILTER (WHERE ${Je.judgeMethod} = 'llm' AND ${Je.judgeModel} IS DISTINCT FROM ${o})::int`,flagged:To`count(*) FILTER (WHERE ${Je.flag} IS NOT NULL)::int`}).from(Je).where(XO(Je.evalTargetId,t)),b=c.with_target.unlabeledJudge.length+c.with_target.labeled.length+c.without_target.unlabeledJudge.length+c.without_target.labeled.length,I=await u.execute(To`
761
+ `),o=null,s=-1;for(let O of r){if(!O.judge_model)continue;let oe=new Date(O.created_at).getTime();(oe>s||oe===s&&O.judge_model>(o??""))&&(s=oe,o=O.judge_model)}let i=null,c=-1;for(let O of r){let oe=new Date(O.created_at).getTime();oe>c&&(c=oe,i=O.methodology)}let a={with_target:{unlabeledJudge:[],labeled:[]},without_target:{unlabeledJudge:[],labeled:[]}},l={with_target:[],without_target:[]},m=0,p=new Map,_=0,I=0,h=0,f=0;for(let O of r){let oe=a[O.configuration];if(!oe)continue;let we=O.methodology!==i||O.pre_edit;O.methodology!==i&&(h+=1),O.pre_edit&&(f+=1);let Pe=O.judge_pass?1:0,xe=O.llm_annotated>=O.llm_total;if(O.llm_total>0){let Ye=O.judge_model,qt=p.get(Ye)??{runs:0,labeledRuns:0,latestRunAt:O.created_at};if(qt.runs+=1,xe&&(qt.labeledRuns+=1),new Date(O.created_at).getTime()>new Date(qt.latestRunAt).getTime()&&(qt.latestRunAt=O.created_at),p.set(Ye,qt),Ye!==o){_+=1,xe&&(I+=1);continue}}if(xe){let Ye=O.det_all_passed&&O.llm_truly_passed===O.llm_total?1:0;l[O.configuration]?.push({human:Ye,judge:Pe}),O.llm_total>0&&(m+=1)}if(!we)if(xe){let Ye=O.det_all_passed&&O.llm_truly_passed===O.llm_total?1:0;oe.labeled.push({human:Ye,judge:Pe})}else oe.unlabeledJudge.push(Pe)}let[w]=await d.select({total:xo`count(*)::int`,llmAnchors:xo`count(*) FILTER (WHERE ${Ve.judgeMethod} = 'llm' AND ${Ve.judgeModel} IS NOT DISTINCT FROM ${o})::int`,llmApproved:xo`count(*) FILTER (WHERE ${Ve.judgeMethod} = 'llm' AND ${Ve.judgeModel} IS NOT DISTINCT FROM ${o} AND ${Ve.verdict} = 'approve')::int`,staleLlmAnchors:xo`count(*) FILTER (WHERE ${Ve.judgeMethod} = 'llm' AND ${Ve.judgeModel} IS DISTINCT FROM ${o})::int`,flagged:xo`count(*) FILTER (WHERE ${Ve.flag} IS NOT NULL)::int`}).from(Ve).where(aD(Ve.evalTargetId,t)),b=a.with_target.unlabeledJudge.length+a.with_target.labeled.length+a.without_target.unlabeledJudge.length+a.without_target.labeled.length,v=await d.execute(xo`
843
762
  SELECT
844
763
  r.eval_target_id::text AS target_id,
845
764
  r.configuration,
@@ -881,7 +800,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
881
800
  AND r.grading->'summary'->>'pass_rate' IS NOT NULL
882
801
  AND r.configuration IN ('with_target', 'without_target')
883
802
  AND r.grading->>'judge_model' IS NOT DISTINCT FROM ${o}
884
- `),S=new Map;for(let C of I){if(C.llm_total<=0||C.llm_annotated<C.llm_total)continue;let oe=S.get(C.target_id)??{with_target:[],without_target:[]},ve=C.det_all_passed&&C.llm_truly_passed===C.llm_total?1:0,Ce=C.judge_pass?1:0;C.configuration==="with_target"?oe.with_target.push(ve-Ce):oe.without_target.push(ve-Ce),S.set(C.target_id,oe)}let A=d(C=>{let oe=C.length;if(oe===0)return{rectifier:0,variance:1/0,n:0};let ve=C.reduce((Te,Ye)=>Te+Ye,0)/oe,Ce=oe<2?0:C.reduce((Te,Ye)=>Te+(Ye-ve)**2,0)/(oe-1);return{rectifier:ve,variance:Ce/oe,n:oe}},"toRectifier"),E=d(C=>C.map(oe=>oe.human-oe.judge),"selfDeltas"),R=[...S.values()].map(C=>A(C.with_target)),D=[...S.values()].map(C=>A(C.without_target)),j=Hu(A(E(l.with_target)),R),P=Hu(A(E(l.without_target)),D),$=[...S.values()].reduce((C,oe)=>C+oe.with_target.length+oe.without_target.length,0),H=p+$,B=(p>0?1:0)+[...S.values()].filter(C=>C.with_target.length+C.without_target.length>0).length,te=j.pooledApplied||P.pooledApplied,_e=B>=3&&H>=Uu,ee=d(C=>({rectifier:C.rectifierUsed,variance:C.variance,sufficient:_e}),"asInput"),Re=b>0?_c(c.with_target,c.without_target,te?{withPooledRectifier:ee(j),withoutPooledRectifier:ee(P)}:{}):null,N=Ef(c.with_target,c.without_target,{humanLabeledRuns:p,...te?{pool:{withPooledRectifier:ee(j),withoutPooledRectifier:ee(P),totalAnchors:H,targets:B}}:{}}),me=new Map;for(let C of r){if(C.judge_model!==o||C.methodology!==i||C.pre_edit||C.pass_rate==null)continue;let oe=me.get(C.eval_id)??{name:C.eval_name,withRates:[],withoutRates:[]};C.configuration==="with_target"?oe.withRates.push(C.pass_rate):C.configuration==="without_target"&&oe.withoutRates.push(C.pass_rate),me.set(C.eval_id,oe)}let M=[],ue=[],lt=d(C=>C.length?C.reduce((oe,ve)=>oe+ve,0)/C.length:null,"mean_"),Be=[];for(let[C,{name:oe,withRates:ve,withoutRates:Ce}]of me.entries())ve.length>0&&Ce.length>0?(M.push({name:oe,withPassRate:lt(ve),withoutPassRate:lt(Ce)}),ue.push(C)):Be.push({evalId:C,name:oe,withPassRate:lt(ve),withoutPassRate:lt(Ce)});let re=vf(wf(M),{unpaired:Be.length}),he=re.gateReason?[re.gateReason,...N.reasons]:N.reasons;return{judge:{currentModel:o,models:[...m.entries()].map(([C,oe])=>({model:C,...oe})).sort((C,oe)=>new Date(oe.latestRunAt).getTime()-new Date(C.latestRunAt).getTime()),staleRuns:y,staleLabeledRuns:v,staleAnchors:w?.staleLlmAnchors??0},anchors:{total:w?.total??0,llmAnchors:w?.llmAnchors??0,agreementRate:w&&w.llmAnchors>0?w.llmApproved/w.llmAnchors:null,agreementCi:w&&w.llmAnchors>0?Cu(w.llmApproved,w.llmAnchors):null,flagged:w?.flagged??0,minAnchors:mi,labeledRuns:{with:l.with_target.length,without:l.without_target.length}},methodology:{current:i,supersededRuns:h,preEditRuns:f,runsInSegment:b},calibration:Re,powerCheck:{...N,reasons:he},pooling:{engaged:te,judgeModel:o,poolTargets:B,poolAnchors:H,assumedExchangeability:j.assumedExchangeability||P.assumedExchangeability,sufficient:_e,withLambda:j.lambda,withoutLambda:P.lambda,tau2:j.tau2,i2:j.i2,withReason:j.reason??null,withoutReason:P.reason??null},caseDiscrimination:{total:re.total,discriminating:re.discriminating,nonDiscriminating:re.nonDiscriminating,unpaired:re.unpaired,cases:re.diagnoses.map((C,oe)=>({evalId:ue[oe],name:C.name,withPassRate:C.withPassRate,withoutPassRate:C.withoutPassRate,separation:C.separation,discriminating:C.discriminating,note:C.note})).sort((C,oe)=>C.separation-oe.separation),unpairedCases:Be}}}d(Fi,"computeJudgeCalibration");async function D0(e){return(await u.execute(To`
803
+ `),S=new Map;for(let O of v){if(O.llm_total<=0||O.llm_annotated<O.llm_total)continue;let oe=S.get(O.target_id)??{with_target:[],without_target:[]},we=O.det_all_passed&&O.llm_truly_passed===O.llm_total?1:0,Pe=O.judge_pass?1:0;O.configuration==="with_target"?oe.with_target.push(we-Pe):oe.without_target.push(we-Pe),S.set(O.target_id,oe)}let A=u(O=>{let oe=O.length;if(oe===0)return{rectifier:0,variance:1/0,n:0};let we=O.reduce((xe,Ye)=>xe+Ye,0)/oe,Pe=oe<2?0:O.reduce((xe,Ye)=>xe+(Ye-we)**2,0)/(oe-1);return{rectifier:we,variance:Pe/oe,n:oe}},"toRectifier"),E=u(O=>O.map(oe=>oe.human-oe.judge),"selfDeltas"),R=[...S.values()].map(O=>A(O.with_target)),P=[...S.values()].map(O=>A(O.without_target)),N=Ud(A(E(l.with_target)),R),D=Ud(A(E(l.without_target)),P),q=[...S.values()].reduce((O,oe)=>O+oe.with_target.length+oe.without_target.length,0),H=m+q,B=(m>0?1:0)+[...S.values()].filter(O=>O.with_target.length+O.without_target.length>0).length,ee=N.pooledApplied||D.pooledApplied,he=B>=3&&H>=qd,te=u(O=>({rectifier:O.rectifierUsed,variance:O.variance,sufficient:he}),"asInput"),Te=b>0?hc(a.with_target,a.without_target,ee?{withPooledRectifier:te(N),withoutPooledRectifier:te(D)}:{}):null,j=If(a.with_target,a.without_target,{humanLabeledRuns:m,...ee?{pool:{withPooledRectifier:te(N),withoutPooledRectifier:te(D),totalAnchors:H,targets:B}}:{}}),me=new Map;for(let O of r){if(O.judge_model!==o||O.methodology!==i||O.pre_edit||O.pass_rate==null)continue;let oe=me.get(O.eval_id)??{name:O.eval_name,withRates:[],withoutRates:[]};O.configuration==="with_target"?oe.withRates.push(O.pass_rate):O.configuration==="without_target"&&oe.withoutRates.push(O.pass_rate),me.set(O.eval_id,oe)}let L=[],ue=[],dt=u(O=>O.length?O.reduce((oe,we)=>oe+we,0)/O.length:null,"mean_"),He=[];for(let[O,{name:oe,withRates:we,withoutRates:Pe}]of me.entries())we.length>0&&Pe.length>0?(L.push({name:oe,withPassRate:dt(we),withoutPassRate:dt(Pe)}),ue.push(O)):He.push({evalId:O,name:oe,withPassRate:dt(we),withoutPassRate:dt(Pe)});let re=hf(gf(L),{unpaired:He.length}),ge=re.gateReason?[re.gateReason,...j.reasons]:j.reasons;return{judge:{currentModel:o,models:[...p.entries()].map(([O,oe])=>({model:O,...oe})).sort((O,oe)=>new Date(oe.latestRunAt).getTime()-new Date(O.latestRunAt).getTime()),staleRuns:_,staleLabeledRuns:I,staleAnchors:w?.staleLlmAnchors??0},anchors:{total:w?.total??0,llmAnchors:w?.llmAnchors??0,agreementRate:w&&w.llmAnchors>0?w.llmApproved/w.llmAnchors:null,agreementCi:w&&w.llmAnchors>0?Pd(w.llmApproved,w.llmAnchors):null,flagged:w?.flagged??0,minAnchors:mi,labeledRuns:{with:l.with_target.length,without:l.without_target.length}},methodology:{current:i,supersededRuns:h,preEditRuns:f,runsInSegment:b},calibration:Te,powerCheck:{...j,reasons:ge},pooling:{engaged:ee,judgeModel:o,poolTargets:B,poolAnchors:H,assumedExchangeability:N.assumedExchangeability||D.assumedExchangeability,sufficient:he,withLambda:N.lambda,withoutLambda:D.lambda,tau2:N.tau2,i2:N.i2,withReason:N.reason??null,withoutReason:D.reason??null},caseDiscrimination:{total:re.total,discriminating:re.discriminating,nonDiscriminating:re.nonDiscriminating,unpaired:re.unpaired,cases:re.diagnoses.map((O,oe)=>({evalId:ue[oe],name:O.name,withPassRate:O.withPassRate,withoutPassRate:O.withoutPassRate,separation:O.separation,discriminating:O.discriminating,note:O.note})).sort((O,oe)=>O.separation-oe.separation),unpairedCases:He}}}u(Bi,"computeJudgeCalibration");async function bb(e){return(await d.execute(xo`
885
804
  WITH current_judge AS (
886
805
  SELECT r.grading->>'judge_model' AS model
887
806
  FROM eval_runs r
@@ -910,7 +829,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
910
829
  AND (SELECT count(*) FROM jsonb_array_elements(r.grading->'expectations') e
911
830
  WHERE COALESCE(e->>'method', 'llm') = 'llm'
912
831
  AND COALESCE(e->>'errored', 'false') <> 'true') > COALESCE(a.llm_annotated, 0)
913
- `))[0]?.remaining??0}d(D0,"countRunsAwaitingReview");var vs=new QO,Ol=d(e=>ZO("sha256").update(e).digest("hex"),"sha256"),tD=Ne.object({withScore:Ne.number().min(0).max(1),withoutScore:Ne.number().min(0).max(1),withCost:Ne.number().nonnegative().optional(),withoutCost:Ne.number().nonnegative().optional(),withLatency:Ne.number().nonnegative().optional(),withoutLatency:Ne.number().nonnegative().optional()}),nD=Ne.object({candidateContent:Ne.string().min(1),proposalSource:Ne.enum(["llm","groom","human"]),proposalRationale:Ne.string().default(""),pairs:Ne.array(tD).default([]),canaryGreen:Ne.boolean(),measuredAgainstContentHash:Ne.string().optional(),accumulation:Ne.object({candidateContentHash:Ne.string(),priorContentHash:Ne.string(),targetPairs:Ne.number().int().positive(),carriedPairs:Ne.number().int().nonnegative(),runs:Ne.number().int().positive()}).optional(),immutableSections:Ne.array(Ne.string()).default([]),maxPromotionsPerWindow:Ne.number().int().positive().optional(),windowDays:Ne.number().int().positive().optional(),measurementCost:Ne.object({modelCalls:Ne.number().int().nonnegative(),proposalCalls:Ne.number().int().nonnegative(),executorCalls:Ne.number().int().nonnegative(),graderCalls:Ne.number().int().nonnegative(),plannedPairs:Ne.number().int().nonnegative(),usablePairs:Ne.number().int().nonnegative(),verdictPairs:Ne.number().int().nonnegative().optional(),passes:Ne.number().int().nonnegative(),liveCases:Ne.number().int().nonnegative(),mde:Ne.number().nonnegative().nullable(),wallMs:Ne.number().nonnegative()}).optional(),apply:Ne.boolean().default(!0)});vs.post("/eval-targets/:id/promotions",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=nD.parse(await e.req.json());if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let[s]=await u.select({id:k.id,content:k.content,version:k.version,metadata:k.metadata}).from(k).where(on(k.id,n));if(!s)return e.json({error:"Eval target not found"},404);let i=s.content,a=r.candidateContent,c=r.pairs,l=Mu(c,{baseline:"prior-version"}),p=!1,m=["adequacy could not be computed for this target"];try{let D=await Fi(t,n);p=D.powerCheck.adequate,m=D.powerCheck.reasons??[]}catch(D){m=[`adequacy check failed: ${D instanceof Error?D.message:String(D)}`]}let y=r.windowDays??vc,v=r.maxPromotionsPerWindow??fi,h=new Date(Date.now()-y*24*60*60*1e3),[f]=await u.select({n:Pg`count(*)::int`}).from(ie).where(Dl(on(ie.evalTargetId,n),on(ie.applied,!0),M0(ie.createdAt,h))),w=f?.n??0,b=Ol(i),I=r.measuredAgainstContentHash===void 0?void 0:r.measuredAgainstContentHash===b,S=jf({verdict:l,canaryGreen:r.canaryGreen,adequate:p,adequacyReasons:m,promotionsInWindow:w,maxPromotionsPerWindow:v,immutableSections:r.immutableSections,beforeContent:i,afterContent:a,measurementMatchesPredecessor:I}),A={canaryGreen:r.canaryGreen,adequate:p,adequacyReasons:m,promotionsInWindow:w,maxPromotionsPerWindow:v,windowDays:y,immutableSections:r.immutableSections,nPairs:c.length,measurementMatchesPredecessor:I??null,measuredAgainstContentHash:r.measuredAgainstContentHash??null,cost:r.measurementCost??null,accumulation:r.accumulation?{...r.accumulation,pairs:c}:null,applied:!1},E=S.decision==="promote"&&r.apply;A.applied=E;let R;try{R=await u.transaction(async D=>{if(E){let P=s.metadata&&typeof s.metadata=="object"&&!Array.isArray(s.metadata)?s.metadata:{};await D.update(k).set({content:a,version:(s.version??1)+1,metadata:{...P,content_hash:Ol(a)},updatedAt:new Date}).where(on(k.id,n))}let[j]=await D.insert(ie).values({userId:t,evalTargetId:n,fromContentHash:b,toContentHash:Ol(a),fromContent:i,toContent:a,proposalSource:r.proposalSource,proposalRationale:r.proposalRationale,decision:S.decision,applied:E,refusals:S.refusals,rationale:S.rationale,effectClass:S.effect,verdict:l,gates:A,touchedSections:S.touched}).returning({id:ie.id,createdAt:ie.createdAt});return j})}catch(D){if(D?.code==="23505")return e.json({error:"This edit has already been applied to this target",code:"PROMOTION_ALREADY_APPLIED"},409);throw D}return e.json({id:R.id,createdAt:R.createdAt,decision:S.decision,applied:E,rationale:S.rationale,refusals:S.refusals,effectClass:S.effect,touchedSections:S.touched,verdict:l,gates:A},201)});vs.get("/eval-targets/:id/promotions",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=Math.min(Number(e.req.query("limit")??50)||50,200),o=Math.max(Number(e.req.query("offset")??0)||0,0);if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let i=await u.select({id:ie.id,createdAt:ie.createdAt,decision:ie.decision,applied:ie.applied,effectClass:ie.effectClass,rationale:ie.rationale,refusals:ie.refusals,proposalSource:ie.proposalSource,proposalRationale:ie.proposalRationale,fromContentHash:ie.fromContentHash,toContentHash:ie.toContentHash,touchedSections:ie.touchedSections,verdict:ie.verdict,gates:ie.gates}).from(ie).where(on(ie.evalTargetId,n)).orderBy(eD(ie.createdAt)).limit(r).offset(o),a=await u.select({decision:ie.decision,n:Pg`count(*)::int`}).from(ie).where(on(ie.evalTargetId,n)).groupBy(ie.decision),c={promote:0,revert:0,refuse:0};for(let l of a)c[l.decision]=l.n;return e.json({promotions:i,counts:c,total:Object.values(c).reduce((l,p)=>l+p,0),limit:r,offset:o})});vs.post("/promotions/:promotionId/apply",async e=>{let t=e.get("userId"),n=e.req.param("promotionId");try{let r=await u.transaction(async o=>{let[s]=await o.select().from(ie).where(Dl(on(ie.id,n),on(ie.userId,t))).for("update");if(!s)return{status:404,body:{error:"Promotion not found"}};if(s.applied)return{status:409,body:{error:"Already applied",code:"ALREADY_APPLIED"}};if(s.decision!=="promote")return{status:409,body:{error:`Only a "promote" can be applied; this decision was "${s.decision}"`,code:"NOT_A_PROMOTE"}};let[i]=await o.select().from(k).where(on(k.id,s.evalTargetId));if(!i)return{status:404,body:{error:"Eval target not found"}};if(i.content!==s.fromContent)return{status:409,body:{error:"The target has changed since this was measured \u2014 the verdict no longer describes this edit. Re-measure rather than applying a stale decision.",code:"STALE_MEASUREMENT"}};let a=new Date(Date.now()-vc*864e5),[c]=await o.select({n:Pg`count(*)::int`}).from(ie).where(Dl(on(ie.evalTargetId,s.evalTargetId),on(ie.applied,!0),M0(ie.createdAt,a)));if((c?.n??0)>=fi)return{status:409,body:{error:`Change budget exhausted (${c?.n}/${fi} applied in ${vc}d)`,code:"BUDGET_EXHAUSTED"}};let l=i.metadata&&typeof i.metadata=="object"&&!Array.isArray(i.metadata)?i.metadata:{};await o.update(k).set({content:s.toContent,version:(i.version??1)+1,metadata:{...l,content_hash:Ol(s.toContent)},updatedAt:new Date}).where(on(k.id,s.evalTargetId));let p=s.gates&&typeof s.gates=="object"&&!Array.isArray(s.gates)?s.gates:{};return await o.update(ie).set({applied:!0,gates:{...p,applied:!0,appliedAt:new Date().toISOString(),appliedVia:"deferred-human-apply"}}).where(on(ie.id,s.id)),{status:200,body:{id:s.id,applied:!0,evalTargetId:s.evalTargetId,newVersion:(i.version??1)+1}}});return e.json(r.body,r.status)}catch(r){if(r?.code==="23505")return e.json({error:"This edit is already applied to this target",code:"PROMOTION_ALREADY_APPLIED"},409);throw r}});vs.get("/promotions/:promotionId",async e=>{let t=e.get("userId"),n=e.req.param("promotionId"),[r]=await u.select().from(ie).where(Dl(on(ie.id,n),on(ie.userId,t)));return r?e.json(r):e.json({error:"Promotion not found"},404)});O();import{Hono as rD}from"hono";import{z as ft}from"zod";import{eq as Qn,and as Cg,asc as oD,desc as L0,isNull as sD,inArray as iD,sql as aD}from"drizzle-orm";var Is=new rD,cD=ft.object({jobId:ft.string().uuid().optional(),evalId:ft.string().uuid(),evalTargetId:ft.string().uuid(),evalTargetVersion:ft.number().int(),configuration:ft.enum(["with_target","without_target","baseline","with_candidate","with_prior_version"]),runNumber:ft.number().int().default(1),iteration:ft.number().int().default(1),status:ft.enum(["pending","running","completed","failed"]).default("completed"),outputs:ft.record(ft.unknown()).default({}),timing:ft.record(ft.unknown()).default({}),grading:ft.record(ft.unknown()).default({}),comparison:ft.record(ft.unknown()).nullable().optional()}),dD=ft.object({iteration:ft.number().int().default(1),runSummary:ft.record(ft.unknown()).default({}),notes:ft.array(ft.string()).default([])});Is.post("/eval-runs",async e=>{let t=e.get("userId"),n=await e.req.json(),r=cD.parse(n);if(!await Ke(r.evalTargetId,t))return e.json({error:"Eval target not found"},404);let[s]=await u.insert(be).values({jobId:r.jobId??null,evalId:r.evalId,evalTargetId:r.evalTargetId,evalTargetVersion:r.evalTargetVersion,configuration:r.configuration,runNumber:r.runNumber,iteration:r.iteration,status:r.status,outputs:r.outputs,timing:r.timing,grading:r.grading,comparison:r.comparison??null}).onConflictDoNothing().returning();if(s)return e.json(s,201);if(!r.jobId)return e.json({error:"Insert conflicted without a jobId"},409);let[i]=await u.select().from(be).where(Cg(Qn(be.jobId,r.jobId),Qn(be.evalId,r.evalId),Qn(be.configuration,r.configuration),Qn(be.runNumber,r.runNumber),Qn(be.iteration,r.iteration))).limit(1);return i?e.json({...i,deduped:!0},200):e.json({error:"Run conflicted but existing row not found"},409)});Is.get("/eval-targets/:id/runs",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=e.req.query("iteration"),o=e.req.query("configuration");if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let i=e.req.query("limit"),a=e.req.query("offset"),c=i?parseInt(i,10):NaN,l=Number.isFinite(c)?Math.min(Math.max(1,c),100):50,p=a?parseInt(a,10):NaN,m=Number.isFinite(p)?Math.max(0,p):0,y=[Qn(be.evalTargetId,n)];r&&y.push(Qn(be.iteration,parseInt(r,10))),o&&y.push(Qn(be.configuration,o)),e.req.query("activeCasesOnly")==="1"&&y.push(iD(be.evalId,u.select({id:Se.id}).from(Se).where(Cg(Qn(Se.evalTargetId,n),sD(Se.retiredAt)))));let v=e.req.query("candidateContentHash");v&&y.push(aD`${be.outputs}->>'candidateContentHash' = ${v}`);let h=e.req.query("jobId");if(h){let b=ft.string().uuid().safeParse(h);if(!b.success)return e.json({error:"Invalid jobId"},400);y.push(Qn(be.jobId,b.data))}let w=(await u.select().from(be).where(Cg(...y)).orderBy(L0(be.createdAt),oD(be.id)).limit(l).offset(m)).map(b=>{let I=b.outputs??{},{diff:S,transcript:A,...E}=I,R=v?E:{...E,transcript:A};return{...b,outputs:R,comparison:null}});return e.json(w)});Is.post("/eval-targets/:id/benchmarks",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=dD.parse(r);if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let[i]=await u.insert(Wn).values({evalTargetId:n,iteration:o.iteration,runSummary:o.runSummary,notes:o.notes}).returning();return e.json(i,201)});Is.get("/eval-targets/:id/benchmarks",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let o=await u.select().from(Wn).where(Qn(Wn.evalTargetId,n)).orderBy(L0(Wn.createdAt));return e.json(o)});O();import{Hono as uD}from"hono";import{z as qt}from"zod";import{eq as bs,and as q0,or as lD,desc as pD,asc as mD}from"drizzle-orm";import{alias as $0}from"drizzle-orm/pg-core";var Wi=new uD,fD=qt.object({targetAId:qt.string().uuid(),targetBId:qt.string().uuid(),targetAVersion:qt.number().int(),targetBVersion:qt.number().int(),isSwapped:qt.boolean(),winnerTargetId:qt.string().uuid().nullable(),perEval:qt.array(qt.object({evalName:qt.string(),winnerTargetId:qt.string().uuid().nullable(),reasoning:qt.string().default("")})).default([]),overall:qt.record(qt.unknown()).default({}),rawOutput:qt.string().nullable().optional(),model:qt.string().nullable().optional(),status:qt.enum(["completed","parse_failed"]).default("completed")});Wi.post("/eval-comparisons",async e=>{let t=e.get("userId"),n=await e.req.json(),r=fD.parse(n),[o,s]=await Promise.all([Ke(r.targetAId,t),Ke(r.targetBId,t)]);if(!o||!s)return e.json({error:"Eval target not found"},404);let i=d(c=>c===null||c===r.targetAId||c===r.targetBId,"validWinner");if(!i(r.winnerTargetId)||!r.perEval.every(c=>i(c.winnerTargetId)))return e.json({error:"winnerTargetId must be one of the compared targets or null"},400);let[a]=await u.insert(Xe).values({userId:t,targetAId:r.targetAId,targetBId:r.targetBId,targetAVersion:r.targetAVersion,targetBVersion:r.targetBVersion,isSwapped:r.isSwapped,winnerTargetId:r.winnerTargetId,perEval:r.perEval,overall:r.overall,rawOutput:r.rawOutput??null,model:r.model??null,status:r.status}).returning();return e.json(a,201)});Wi.get("/eval-targets/:id/comparisons",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let o=e.req.query("limit"),s=e.req.query("offset"),i=o?parseInt(o,10):NaN,a=Number.isFinite(i)?Math.min(Math.max(1,i),100):50,c=s?parseInt(s,10):NaN,l=Number.isFinite(c)?Math.max(0,c):0,p=$0(k,"targets_a"),m=$0(k,"targets_b"),y=await u.select({id:Xe.id,userId:Xe.userId,targetAId:Xe.targetAId,targetBId:Xe.targetBId,targetAName:p.name,targetBName:m.name,targetAVersion:Xe.targetAVersion,targetBVersion:Xe.targetBVersion,isSwapped:Xe.isSwapped,winnerTargetId:Xe.winnerTargetId,perEval:Xe.perEval,overall:Xe.overall,model:Xe.model,status:Xe.status,createdAt:Xe.createdAt}).from(Xe).innerJoin(p,bs(Xe.targetAId,p.id)).innerJoin(m,bs(Xe.targetBId,m.id)).where(q0(bs(Xe.userId,t),lD(bs(Xe.targetAId,n),bs(Xe.targetBId,n)))).orderBy(pD(Xe.createdAt),mD(Xe.id)).limit(a).offset(l);return e.json(y.map(v=>({...v,rawOutput:null})))});Wi.get("/eval-comparisons/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=qt.string().uuid().safeParse(n);if(!r.success)return e.json({error:"Invalid comparison id"},400);let[o]=await u.select().from(Xe).where(q0(bs(Xe.id,r.data),bs(Xe.userId,t)));return o?e.json(o):e.json({error:"Comparison not found"},404)});O();import{Hono as yD}from"hono";import{z as zi}from"zod";import{eq as Vi,and as Og,desc as wD,asc as vD,inArray as ID,sql as bD}from"drizzle-orm";O();import{sql as gD}from"drizzle-orm";function U0(e){if(e.n===0)return null;let t=e.agree/e.n,n=e.aYes/e.n,r=e.bYes/e.n,o=n*r+(1-n)*(1-r);return o>=1?null:(t-o)/(1-o)}d(U0,"kappaFromCounts");var H0=d((e,t)=>({agree:e,total:t,rate:t>0?e/t:null}),"slice");function hD(e){let t=e.pairs>0?e.agreeHuman/e.pairs:null;return{engine:e.reviewerEngine,models:e.models,pairs:e.pairs,orphaned:e.orphaned,agreementRate:t,kappa:U0({n:e.pairs,agree:e.agreeHuman,aYes:e.humanYes,bYes:e.reviewerYes}),snapshotAgreementRate:e.pairs>0?e.snapshotAgree/e.pairs:null,snapshotKappa:U0({n:e.pairs,agree:e.snapshotAgree,aYes:e.snapshotHumanYes,bYes:e.reviewerYes}),judgeAgreementRate:e.pairs>0?e.judgeAgreeHuman/e.pairs:null,onJudgePass:H0(e.judgePassAgree,e.judgePassPairs),onJudgeFail:H0(e.agreeHuman-e.judgePassAgree,e.pairs-e.judgePassPairs),suggestedAnchorWeight:t==null?null:Math.max(0,2*t-1)**2,unresolvedFlags:e.unresolvedFlags,kept:e.kept,relabeled:e.relabeled,lastReviewedAt:e.lastReviewedAt}}d(hD,"reviewerAgreementReport");async function B0(e){return(await u.execute(gD`
832
+ `))[0]?.remaining??0}u(bb,"countRunsAwaitingReview");var Is=new cD,Dl=u(e=>uD("sha256").update(e).digest("hex"),"sha256"),lD=Ne.object({withScore:Ne.number().min(0).max(1),withoutScore:Ne.number().min(0).max(1),withCost:Ne.number().nonnegative().optional(),withoutCost:Ne.number().nonnegative().optional(),withLatency:Ne.number().nonnegative().optional(),withoutLatency:Ne.number().nonnegative().optional()}),mD=Ne.object({candidateContent:Ne.string().min(1),proposalSource:Ne.enum(["llm","groom","human"]),proposalRationale:Ne.string().default(""),pairs:Ne.array(lD).default([]),canaryGreen:Ne.boolean(),measuredAgainstContentHash:Ne.string().optional(),accumulation:Ne.object({candidateContentHash:Ne.string(),priorContentHash:Ne.string(),targetPairs:Ne.number().int().positive(),carriedPairs:Ne.number().int().nonnegative(),runs:Ne.number().int().positive()}).optional(),immutableSections:Ne.array(Ne.string()).default([]),maxPromotionsPerWindow:Ne.number().int().positive().optional(),windowDays:Ne.number().int().positive().optional(),measurementCost:Ne.object({modelCalls:Ne.number().int().nonnegative(),proposalCalls:Ne.number().int().nonnegative(),executorCalls:Ne.number().int().nonnegative(),graderCalls:Ne.number().int().nonnegative(),plannedPairs:Ne.number().int().nonnegative(),usablePairs:Ne.number().int().nonnegative(),verdictPairs:Ne.number().int().nonnegative().optional(),passes:Ne.number().int().nonnegative(),liveCases:Ne.number().int().nonnegative(),mde:Ne.number().nonnegative().nullable(),wallMs:Ne.number().nonnegative()}).optional(),apply:Ne.boolean().default(!0)});Is.post("/eval-targets/:id/promotions",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=mD.parse(await e.req.json());if(!await Ge(n,t))return e.json({error:"Eval target not found"},404);let[s]=await d.select({id:k.id,content:k.content,version:k.version,metadata:k.metadata}).from(k).where(rn(k.id,n));if(!s)return e.json({error:"Eval target not found"},404);let i=s.content,c=r.candidateContent,a=r.pairs,l=Cd(a,{baseline:"prior-version"}),m=!1,p=["adequacy could not be computed for this target"];try{let P=await Bi(t,n);m=P.powerCheck.adequate,p=P.powerCheck.reasons??[]}catch(P){p=[`adequacy check failed: ${P instanceof Error?P.message:String(P)}`]}let _=r.windowDays??wc,I=r.maxPromotionsPerWindow??pi,h=new Date(Date.now()-_*24*60*60*1e3),[f]=await d.select({n:kg`count(*)::int`}).from(ie).where(Ol(rn(ie.evalTargetId,n),rn(ie.applied,!0),Sb(ie.createdAt,h))),w=f?.n??0,b=Dl(i),v=r.measuredAgainstContentHash===void 0?void 0:r.measuredAgainstContentHash===b,S=xf({verdict:l,canaryGreen:r.canaryGreen,adequate:m,adequacyReasons:p,promotionsInWindow:w,maxPromotionsPerWindow:I,immutableSections:r.immutableSections,beforeContent:i,afterContent:c,measurementMatchesPredecessor:v}),A={canaryGreen:r.canaryGreen,adequate:m,adequacyReasons:p,promotionsInWindow:w,maxPromotionsPerWindow:I,windowDays:_,immutableSections:r.immutableSections,nPairs:a.length,measurementMatchesPredecessor:v??null,measuredAgainstContentHash:r.measuredAgainstContentHash??null,cost:r.measurementCost??null,accumulation:r.accumulation?{...r.accumulation,pairs:a}:null,applied:!1},E=S.decision==="promote"&&r.apply;A.applied=E;let R;try{R=await d.transaction(async P=>{if(E){let D=s.metadata&&typeof s.metadata=="object"&&!Array.isArray(s.metadata)?s.metadata:{};await P.update(k).set({content:c,version:(s.version??1)+1,metadata:{...D,content_hash:Dl(c)},updatedAt:new Date}).where(rn(k.id,n))}let[N]=await P.insert(ie).values({userId:t,evalTargetId:n,fromContentHash:b,toContentHash:Dl(c),fromContent:i,toContent:c,proposalSource:r.proposalSource,proposalRationale:r.proposalRationale,decision:S.decision,applied:E,refusals:S.refusals,rationale:S.rationale,effectClass:S.effect,verdict:l,gates:A,touchedSections:S.touched}).returning({id:ie.id,createdAt:ie.createdAt});return N})}catch(P){if(P?.code==="23505")return e.json({error:"This edit has already been applied to this target",code:"PROMOTION_ALREADY_APPLIED"},409);throw P}return e.json({id:R.id,createdAt:R.createdAt,decision:S.decision,applied:E,rationale:S.rationale,refusals:S.refusals,effectClass:S.effect,touchedSections:S.touched,verdict:l,gates:A},201)});Is.get("/eval-targets/:id/promotions",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=Math.min(Number(e.req.query("limit")??50)||50,200),o=Math.max(Number(e.req.query("offset")??0)||0,0);if(!await Ge(n,t))return e.json({error:"Eval target not found"},404);let i=await d.select({id:ie.id,createdAt:ie.createdAt,decision:ie.decision,applied:ie.applied,effectClass:ie.effectClass,rationale:ie.rationale,refusals:ie.refusals,proposalSource:ie.proposalSource,proposalRationale:ie.proposalRationale,fromContentHash:ie.fromContentHash,toContentHash:ie.toContentHash,touchedSections:ie.touchedSections,verdict:ie.verdict,gates:ie.gates}).from(ie).where(rn(ie.evalTargetId,n)).orderBy(dD(ie.createdAt)).limit(r).offset(o),c=await d.select({decision:ie.decision,n:kg`count(*)::int`}).from(ie).where(rn(ie.evalTargetId,n)).groupBy(ie.decision),a={promote:0,revert:0,refuse:0};for(let l of c)a[l.decision]=l.n;return e.json({promotions:i,counts:a,total:Object.values(a).reduce((l,m)=>l+m,0),limit:r,offset:o})});Is.post("/promotions/:promotionId/apply",async e=>{let t=e.get("userId"),n=e.req.param("promotionId");try{let r=await d.transaction(async o=>{let[s]=await o.select().from(ie).where(Ol(rn(ie.id,n),rn(ie.userId,t))).for("update");if(!s)return{status:404,body:{error:"Promotion not found"}};if(s.applied)return{status:409,body:{error:"Already applied",code:"ALREADY_APPLIED"}};if(s.decision!=="promote")return{status:409,body:{error:`Only a "promote" can be applied; this decision was "${s.decision}"`,code:"NOT_A_PROMOTE"}};let[i]=await o.select().from(k).where(rn(k.id,s.evalTargetId));if(!i)return{status:404,body:{error:"Eval target not found"}};if(i.content!==s.fromContent)return{status:409,body:{error:"The target has changed since this was measured \u2014 the verdict no longer describes this edit. Re-measure rather than applying a stale decision.",code:"STALE_MEASUREMENT"}};let c=new Date(Date.now()-wc*864e5),[a]=await o.select({n:kg`count(*)::int`}).from(ie).where(Ol(rn(ie.evalTargetId,s.evalTargetId),rn(ie.applied,!0),Sb(ie.createdAt,c)));if((a?.n??0)>=pi)return{status:409,body:{error:`Change budget exhausted (${a?.n}/${pi} applied in ${wc}d)`,code:"BUDGET_EXHAUSTED"}};let l=i.metadata&&typeof i.metadata=="object"&&!Array.isArray(i.metadata)?i.metadata:{};await o.update(k).set({content:s.toContent,version:(i.version??1)+1,metadata:{...l,content_hash:Dl(s.toContent)},updatedAt:new Date}).where(rn(k.id,s.evalTargetId));let m=s.gates&&typeof s.gates=="object"&&!Array.isArray(s.gates)?s.gates:{};return await o.update(ie).set({applied:!0,gates:{...m,applied:!0,appliedAt:new Date().toISOString(),appliedVia:"deferred-human-apply"}}).where(rn(ie.id,s.id)),{status:200,body:{id:s.id,applied:!0,evalTargetId:s.evalTargetId,newVersion:(i.version??1)+1}}});return e.json(r.body,r.status)}catch(r){if(r?.code==="23505")return e.json({error:"This edit is already applied to this target",code:"PROMOTION_ALREADY_APPLIED"},409);throw r}});Is.get("/promotions/:promotionId",async e=>{let t=e.get("userId"),n=e.req.param("promotionId"),[r]=await d.select().from(ie).where(Ol(rn(ie.id,n),rn(ie.userId,t)));return r?e.json(r):e.json({error:"Promotion not found"},404)});C();import{Hono as pD}from"hono";import{z as pt}from"zod";import{eq as Qn,and as Ng,asc as fD,desc as Ab,isNull as gD,inArray as hD,sql as _D}from"drizzle-orm";var bs=new pD,yD=pt.object({jobId:pt.string().uuid().optional(),evalId:pt.string().uuid(),evalTargetId:pt.string().uuid(),evalTargetVersion:pt.number().int(),configuration:pt.enum(["with_target","without_target","baseline","with_candidate","with_prior_version"]),runNumber:pt.number().int().default(1),iteration:pt.number().int().default(1),status:pt.enum(["pending","running","completed","failed"]).default("completed"),outputs:pt.record(pt.unknown()).default({}),timing:pt.record(pt.unknown()).default({}),grading:pt.record(pt.unknown()).default({}),comparison:pt.record(pt.unknown()).nullable().optional()}),wD=pt.object({iteration:pt.number().int().default(1),runSummary:pt.record(pt.unknown()).default({}),notes:pt.array(pt.string()).default([])});bs.post("/eval-runs",async e=>{let t=e.get("userId"),n=await e.req.json(),r=yD.parse(n);if(!await Ge(r.evalTargetId,t))return e.json({error:"Eval target not found"},404);let[s]=await d.insert(ve).values({jobId:r.jobId??null,evalId:r.evalId,evalTargetId:r.evalTargetId,evalTargetVersion:r.evalTargetVersion,configuration:r.configuration,runNumber:r.runNumber,iteration:r.iteration,status:r.status,outputs:r.outputs,timing:r.timing,grading:r.grading,comparison:r.comparison??null}).onConflictDoNothing().returning();if(s)return e.json(s,201);if(!r.jobId)return e.json({error:"Insert conflicted without a jobId"},409);let[i]=await d.select().from(ve).where(Ng(Qn(ve.jobId,r.jobId),Qn(ve.evalId,r.evalId),Qn(ve.configuration,r.configuration),Qn(ve.runNumber,r.runNumber),Qn(ve.iteration,r.iteration))).limit(1);return i?e.json({...i,deduped:!0},200):e.json({error:"Run conflicted but existing row not found"},409)});bs.get("/eval-targets/:id/runs",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=e.req.query("iteration"),o=e.req.query("configuration");if(!await Ge(n,t))return e.json({error:"Eval target not found"},404);let i=e.req.query("limit"),c=e.req.query("offset"),a=i?parseInt(i,10):NaN,l=Number.isFinite(a)?Math.min(Math.max(1,a),100):50,m=c?parseInt(c,10):NaN,p=Number.isFinite(m)?Math.max(0,m):0,_=[Qn(ve.evalTargetId,n)];r&&_.push(Qn(ve.iteration,parseInt(r,10))),o&&_.push(Qn(ve.configuration,o)),e.req.query("activeCasesOnly")==="1"&&_.push(hD(ve.evalId,d.select({id:Ie.id}).from(Ie).where(Ng(Qn(Ie.evalTargetId,n),gD(Ie.retiredAt)))));let I=e.req.query("candidateContentHash");I&&_.push(_D`${ve.outputs}->>'candidateContentHash' = ${I}`);let h=e.req.query("jobId");if(h){let b=pt.string().uuid().safeParse(h);if(!b.success)return e.json({error:"Invalid jobId"},400);_.push(Qn(ve.jobId,b.data))}let w=(await d.select().from(ve).where(Ng(..._)).orderBy(Ab(ve.createdAt),fD(ve.id)).limit(l).offset(p)).map(b=>{let v=b.outputs??{},{diff:S,transcript:A,...E}=v,R=I?E:{...E,transcript:A};return{...b,outputs:R,comparison:null}});return e.json(w)});bs.post("/eval-targets/:id/benchmarks",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=wD.parse(r);if(!await Ge(n,t))return e.json({error:"Eval target not found"},404);let[i]=await d.insert(Vn).values({evalTargetId:n,iteration:o.iteration,runSummary:o.runSummary,notes:o.notes}).returning();return e.json(i,201)});bs.get("/eval-targets/:id/benchmarks",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await Ge(n,t))return e.json({error:"Eval target not found"},404);let o=await d.select().from(Vn).where(Qn(Vn.evalTargetId,n)).orderBy(Ab(Vn.createdAt));return e.json(o)});C();import{Hono as vD}from"hono";import{z as Mt}from"zod";import{eq as Ss,and as xb,or as ID,desc as bD,asc as SD}from"drizzle-orm";import{alias as Eb}from"drizzle-orm/pg-core";var Fi=new vD,AD=Mt.object({targetAId:Mt.string().uuid(),targetBId:Mt.string().uuid(),targetAVersion:Mt.number().int(),targetBVersion:Mt.number().int(),isSwapped:Mt.boolean(),winnerTargetId:Mt.string().uuid().nullable(),perEval:Mt.array(Mt.object({evalName:Mt.string(),winnerTargetId:Mt.string().uuid().nullable(),reasoning:Mt.string().default("")})).default([]),overall:Mt.record(Mt.unknown()).default({}),rawOutput:Mt.string().nullable().optional(),model:Mt.string().nullable().optional(),status:Mt.enum(["completed","parse_failed"]).default("completed")});Fi.post("/eval-comparisons",async e=>{let t=e.get("userId"),n=await e.req.json(),r=AD.parse(n),[o,s]=await Promise.all([Ge(r.targetAId,t),Ge(r.targetBId,t)]);if(!o||!s)return e.json({error:"Eval target not found"},404);let i=u(a=>a===null||a===r.targetAId||a===r.targetBId,"validWinner");if(!i(r.winnerTargetId)||!r.perEval.every(a=>i(a.winnerTargetId)))return e.json({error:"winnerTargetId must be one of the compared targets or null"},400);let[c]=await d.insert(Xe).values({userId:t,targetAId:r.targetAId,targetBId:r.targetBId,targetAVersion:r.targetAVersion,targetBVersion:r.targetBVersion,isSwapped:r.isSwapped,winnerTargetId:r.winnerTargetId,perEval:r.perEval,overall:r.overall,rawOutput:r.rawOutput??null,model:r.model??null,status:r.status}).returning();return e.json(c,201)});Fi.get("/eval-targets/:id/comparisons",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await Ge(n,t))return e.json({error:"Eval target not found"},404);let o=e.req.query("limit"),s=e.req.query("offset"),i=o?parseInt(o,10):NaN,c=Number.isFinite(i)?Math.min(Math.max(1,i),100):50,a=s?parseInt(s,10):NaN,l=Number.isFinite(a)?Math.max(0,a):0,m=Eb(k,"targets_a"),p=Eb(k,"targets_b"),_=await d.select({id:Xe.id,userId:Xe.userId,targetAId:Xe.targetAId,targetBId:Xe.targetBId,targetAName:m.name,targetBName:p.name,targetAVersion:Xe.targetAVersion,targetBVersion:Xe.targetBVersion,isSwapped:Xe.isSwapped,winnerTargetId:Xe.winnerTargetId,perEval:Xe.perEval,overall:Xe.overall,model:Xe.model,status:Xe.status,createdAt:Xe.createdAt}).from(Xe).innerJoin(m,Ss(Xe.targetAId,m.id)).innerJoin(p,Ss(Xe.targetBId,p.id)).where(xb(Ss(Xe.userId,t),ID(Ss(Xe.targetAId,n),Ss(Xe.targetBId,n)))).orderBy(bD(Xe.createdAt),SD(Xe.id)).limit(c).offset(l);return e.json(_.map(I=>({...I,rawOutput:null})))});Fi.get("/eval-comparisons/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=Mt.string().uuid().safeParse(n);if(!r.success)return e.json({error:"Invalid comparison id"},400);let[o]=await d.select().from(Xe).where(xb(Ss(Xe.id,r.data),Ss(Xe.userId,t)));return o?e.json(o):e.json({error:"Comparison not found"},404)});C();import{Hono as RD}from"hono";import{z as Wi}from"zod";import{eq as zi,and as jg,desc as kD,asc as ND,inArray as jD,sql as PD}from"drizzle-orm";C();import{sql as ED}from"drizzle-orm";function Tb(e){if(e.n===0)return null;let t=e.agree/e.n,n=e.aYes/e.n,r=e.bYes/e.n,o=n*r+(1-n)*(1-r);return o>=1?null:(t-o)/(1-o)}u(Tb,"kappaFromCounts");var Rb=u((e,t)=>({agree:e,total:t,rate:t>0?e/t:null}),"slice");function xD(e){let t=e.pairs>0?e.agreeHuman/e.pairs:null;return{engine:e.reviewerEngine,models:e.models,pairs:e.pairs,orphaned:e.orphaned,agreementRate:t,kappa:Tb({n:e.pairs,agree:e.agreeHuman,aYes:e.humanYes,bYes:e.reviewerYes}),snapshotAgreementRate:e.pairs>0?e.snapshotAgree/e.pairs:null,snapshotKappa:Tb({n:e.pairs,agree:e.snapshotAgree,aYes:e.snapshotHumanYes,bYes:e.reviewerYes}),judgeAgreementRate:e.pairs>0?e.judgeAgreeHuman/e.pairs:null,onJudgePass:Rb(e.judgePassAgree,e.judgePassPairs),onJudgeFail:Rb(e.agreeHuman-e.judgePassAgree,e.pairs-e.judgePassPairs),suggestedAnchorWeight:t==null?null:Math.max(0,2*t-1)**2,unresolvedFlags:e.unresolvedFlags,kept:e.kept,relabeled:e.relabeled,lastReviewedAt:e.lastReviewedAt}}u(xD,"reviewerAgreementReport");async function kb(e){return(await d.execute(ED`
914
833
  SELECT
915
834
  j.reviewer_engine,
916
835
  array_agg(DISTINCT j.reviewer_model) AS models,
@@ -942,7 +861,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
942
861
  ) j
943
862
  GROUP BY j.reviewer_engine
944
863
  ORDER BY j.reviewer_engine
945
- `)).map(n=>hD({reviewerEngine:n.reviewer_engine,models:n.models,pairs:n.pairs,orphaned:n.orphaned,agreeHuman:n.agree_human,humanYes:n.human_yes,reviewerYes:n.reviewer_yes,judgeAgreeHuman:n.judge_agree_human,judgePassPairs:n.judge_pass_pairs,judgePassAgree:n.judge_pass_agree,snapshotAgree:n.snapshot_agree,snapshotHumanYes:n.snapshot_human_yes,unresolvedFlags:n.unresolved_flags,kept:n.kept,relabeled:n.relabeled,lastReviewedAt:n.last_reviewed_at}))}d(B0,"computeReviewerAgreement");O();import{eq as _D}from"drizzle-orm";async function Bc(e,t,n={}){let{nudge:r=!0}=n;try{let[o]=await u.select({name:k.name,userId:k.userId}).from(k).where(_D(k.id,t));if(!o||o.userId!==e)return;let s=await Fi(e,t);if(s.powerCheck.adequate){await tn({userId:e,type:"calibration_ready",title:"Anchor set adequate \u2014 calibrated verdicts unlocked",body:`${o.name}: enough human labels for a calibrated judge verdict. Automated updates (optimize / auto-run) can now be trusted on this target.`,url:`/eval-targets/${t}?tab=review`,sourceTable:"eval_targets",sourceId:`calibration:${t}:${s.pooling.judgeModel??"unstamped"}`,metadata:{evalTargetId:t,judgeModel:s.pooling.judgeModel,labeledRuns:s.anchors.labeledRuns,pooled:s.pooling.engaged}});let c=await Tl(e);c&&!(c.claude&&c.codex)&&await tn({userId:e,type:"second_engine_needed",title:"Add a second engine to validate your judge",body:`${o.name}: your judge is calibrated. Cross-vendor validation (rulemetric evals validate-judge) needs a second LLM engine \u2014 `+(c.codex?"the claude CLI was not detected on your worker machine.":"install the Codex CLI (npm install -g @openai/codex) on your worker machine."),url:"/connect",sourceTable:"profiles",sourceId:"second-engine",metadata:{evalTargetId:t,engines:c}});return}if(!r)return;let i=await D0(t);if(i<=0)return;let a=s.powerCheck.reasons[0];await tn({userId:e,type:"labels_needed",title:"Review needed to calibrate the judge",body:`${o.name}: ${i} graded output${i===1?"":"s"} awaiting your review.${a?` ${a}.`:""}`,url:`/eval-targets/${t}?tab=review`,sourceTable:"eval_targets",sourceId:`labels:${t}:${new Date().toISOString().slice(0,10)}`,metadata:{evalTargetId:t,remaining:i}})}catch(o){console.error("[label-notifications] notify failed:",o instanceof Error?o.stack:o)}}d(Bc,"notifyLabelState");var Br=new yD,SD=zi.object({verdict:zi.enum(["approve","reject"]),flag:zi.enum(["bad_grade","bad_assertion"]).nullable().optional(),note:zi.string().max(2e3).nullable().optional()});async function F0(e,t){let n=zi.string().uuid().safeParse(e);if(!n.success)return null;let[r]=await u.select().from(be).where(Vi(be.id,n.data));return r&&await Ke(r.evalTargetId,t)?r:null}d(F0,"loadOwnedRun");Br.put("/eval-runs/:runId/annotations/:index",async e=>{let t=e.get("userId"),n=e.req.param("runId"),r=e.req.param("index"),o=SD.parse(await e.req.json()),s=parseInt(r,10);if(!Number.isInteger(s)||s<0||String(s)!==r)return e.json({error:"Invalid expectation index"},400);let i=await F0(n,t);if(!i)return e.json({error:"Eval run not found"},404);let a=i.grading.expectations;if(!Array.isArray(a)||s>=a.length)return e.json({error:"Expectation index out of range for this run"},400);let c=a[s];if(typeof c?.passed!="boolean")return e.json({error:"Expectation has no grade to annotate"},400);if(c.errored===!0)return e.json({error:"Expectation errored during grading \u2014 no judge verdict exists to annotate"},400);let l=c.method==="deterministic"?"deterministic":"llm",p=i.grading.judge_model??null,[m]=await u.insert(Je).values({userId:t,evalRunId:i.id,evalTargetId:i.evalTargetId,expectationIndex:s,expectationText:c.text??"",judgePassed:c.passed,judgeMethod:l,judgeModel:p,verdict:o.verdict,flag:o.flag??null,note:o.note??null}).onConflictDoUpdate({target:[Je.evalRunId,Je.expectationIndex],set:{verdict:o.verdict,...o.flag!==void 0?{flag:o.flag}:{},...o.note!==void 0?{note:o.note}:{},expectationText:c.text??"",judgePassed:c.passed,judgeMethod:l,judgeModel:p,updatedAt:new Date}}).returning();await Bc(t,i.evalTargetId,{nudge:!1});try{await DI({evalTargetId:i.evalTargetId,userId:t})}catch(y){console.error("[eval-annotations] judge-review enqueue failed:",y instanceof Error?y.message:y)}return e.json(m)});Br.delete("/eval-runs/:runId/annotations/:index",async e=>{let t=e.get("userId"),n=e.req.param("runId"),r=parseInt(e.req.param("index"),10);if(!Number.isInteger(r)||r<0)return e.json({error:"Invalid expectation index"},400);let o=await F0(n,t);return o?(await u.delete(Je).where(Og(Vi(Je.evalRunId,o.id),Vi(Je.expectationIndex,r))).returning({id:Je.id})).length===0?e.json({error:"Annotation not found"},404):e.json({deleted:!0}):e.json({error:"Eval run not found"},404)});Br.post("/eval-targets/:id/label-state",async e=>{let t=e.get("userId"),n=e.req.param("id");return await Ke(n,t)?(await Bc(t,n),e.json({ok:!0})):e.json({error:"Eval target not found"},404)});Br.get("/eval-targets/:id/annotations",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let o=e.req.query("limit"),s=e.req.query("offset"),i=o?parseInt(o,10):NaN,a=Number.isFinite(i)?Math.min(Math.max(1,i),500):200,c=s?parseInt(s,10):NaN,l=Number.isFinite(c)?Math.max(0,c):0,p=[Vi(Je.evalTargetId,n)],m=e.req.query("runId");if(m){let v=zi.string().uuid().safeParse(m);if(!v.success)return e.json({error:"Invalid runId"},400);p.push(Vi(Je.evalRunId,v.data))}let y=await u.select().from(Je).where(Og(...p)).orderBy(wD(Je.createdAt),vD(Je.id)).limit(a).offset(l);return e.json(y)});Br.get("/eval-targets/:id/judge-calibration",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let[o,s]=await Promise.all([Fi(t,n),B0(n)]);return e.json({...o,reviewers:s})});Br.get("/eval-targets/:id/annotation-queue",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let o=e.req.query("limit"),s=o?parseInt(o,10):NaN,i=Number.isFinite(s)?Math.min(Math.max(1,s),20):5,a=await u.execute(bD`
864
+ `)).map(n=>xD({reviewerEngine:n.reviewer_engine,models:n.models,pairs:n.pairs,orphaned:n.orphaned,agreeHuman:n.agree_human,humanYes:n.human_yes,reviewerYes:n.reviewer_yes,judgeAgreeHuman:n.judge_agree_human,judgePassPairs:n.judge_pass_pairs,judgePassAgree:n.judge_pass_agree,snapshotAgree:n.snapshot_agree,snapshotHumanYes:n.snapshot_human_yes,unresolvedFlags:n.unresolved_flags,kept:n.kept,relabeled:n.relabeled,lastReviewedAt:n.last_reviewed_at}))}u(kb,"computeReviewerAgreement");C();import{eq as TD}from"drizzle-orm";async function Fc(e,t,n={}){let{nudge:r=!0}=n;try{let[o]=await d.select({name:k.name,userId:k.userId}).from(k).where(TD(k.id,t));if(!o||o.userId!==e)return;let s=await Bi(e,t);if(s.powerCheck.adequate){await en({userId:e,type:"calibration_ready",title:"Anchor set adequate \u2014 calibrated verdicts unlocked",body:`${o.name}: enough human labels for a calibrated judge verdict. Automated updates (optimize / auto-run) can now be trusted on this target.`,url:`/eval-targets/${t}?tab=review`,sourceTable:"eval_targets",sourceId:`calibration:${t}:${s.pooling.judgeModel??"unstamped"}`,metadata:{evalTargetId:t,judgeModel:s.pooling.judgeModel,labeledRuns:s.anchors.labeledRuns,pooled:s.pooling.engaged}});let a=await xl(e);a&&!(a.claude&&a.codex)&&await en({userId:e,type:"second_engine_needed",title:"Add a second engine to validate your judge",body:`${o.name}: your judge is calibrated. Cross-vendor validation (rulemetric evals validate-judge) needs a second LLM engine \u2014 `+(a.codex?"the claude CLI was not detected on your worker machine.":"install the Codex CLI (npm install -g @openai/codex) on your worker machine."),url:"/connect",sourceTable:"profiles",sourceId:"second-engine",metadata:{evalTargetId:t,engines:a}});return}if(!r)return;let i=await bb(t);if(i<=0)return;let c=s.powerCheck.reasons[0];await en({userId:e,type:"labels_needed",title:"Review needed to calibrate the judge",body:`${o.name}: ${i} graded output${i===1?"":"s"} awaiting your review.${c?` ${c}.`:""}`,url:`/eval-targets/${t}?tab=review`,sourceTable:"eval_targets",sourceId:`labels:${t}:${new Date().toISOString().slice(0,10)}`,metadata:{evalTargetId:t,remaining:i}})}catch(o){console.error("[label-notifications] notify failed:",o instanceof Error?o.stack:o)}}u(Fc,"notifyLabelState");var Br=new RD,DD=Wi.object({verdict:Wi.enum(["approve","reject"]),flag:Wi.enum(["bad_grade","bad_assertion"]).nullable().optional(),note:Wi.string().max(2e3).nullable().optional()});async function Nb(e,t){let n=Wi.string().uuid().safeParse(e);if(!n.success)return null;let[r]=await d.select().from(ve).where(zi(ve.id,n.data));return r&&await Ge(r.evalTargetId,t)?r:null}u(Nb,"loadOwnedRun");Br.put("/eval-runs/:runId/annotations/:index",async e=>{let t=e.get("userId"),n=e.req.param("runId"),r=e.req.param("index"),o=DD.parse(await e.req.json()),s=parseInt(r,10);if(!Number.isInteger(s)||s<0||String(s)!==r)return e.json({error:"Invalid expectation index"},400);let i=await Nb(n,t);if(!i)return e.json({error:"Eval run not found"},404);let c=i.grading.expectations;if(!Array.isArray(c)||s>=c.length)return e.json({error:"Expectation index out of range for this run"},400);let a=c[s];if(typeof a?.passed!="boolean")return e.json({error:"Expectation has no grade to annotate"},400);if(a.errored===!0)return e.json({error:"Expectation errored during grading \u2014 no judge verdict exists to annotate"},400);let l=a.method==="deterministic"?"deterministic":"llm",m=i.grading.judge_model??null,[p]=await d.insert(Ve).values({userId:t,evalRunId:i.id,evalTargetId:i.evalTargetId,expectationIndex:s,expectationText:a.text??"",judgePassed:a.passed,judgeMethod:l,judgeModel:m,verdict:o.verdict,flag:o.flag??null,note:o.note??null}).onConflictDoUpdate({target:[Ve.evalRunId,Ve.expectationIndex],set:{verdict:o.verdict,...o.flag!==void 0?{flag:o.flag}:{},...o.note!==void 0?{note:o.note}:{},expectationText:a.text??"",judgePassed:a.passed,judgeMethod:l,judgeModel:m,updatedAt:new Date}}).returning();await Fc(t,i.evalTargetId,{nudge:!1});try{await Sv({evalTargetId:i.evalTargetId,userId:t})}catch(_){console.error("[eval-annotations] judge-review enqueue failed:",_ instanceof Error?_.message:_)}return e.json(p)});Br.delete("/eval-runs/:runId/annotations/:index",async e=>{let t=e.get("userId"),n=e.req.param("runId"),r=parseInt(e.req.param("index"),10);if(!Number.isInteger(r)||r<0)return e.json({error:"Invalid expectation index"},400);let o=await Nb(n,t);return o?(await d.delete(Ve).where(jg(zi(Ve.evalRunId,o.id),zi(Ve.expectationIndex,r))).returning({id:Ve.id})).length===0?e.json({error:"Annotation not found"},404):e.json({deleted:!0}):e.json({error:"Eval run not found"},404)});Br.post("/eval-targets/:id/label-state",async e=>{let t=e.get("userId"),n=e.req.param("id");return await Ge(n,t)?(await Fc(t,n),e.json({ok:!0})):e.json({error:"Eval target not found"},404)});Br.get("/eval-targets/:id/annotations",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await Ge(n,t))return e.json({error:"Eval target not found"},404);let o=e.req.query("limit"),s=e.req.query("offset"),i=o?parseInt(o,10):NaN,c=Number.isFinite(i)?Math.min(Math.max(1,i),500):200,a=s?parseInt(s,10):NaN,l=Number.isFinite(a)?Math.max(0,a):0,m=[zi(Ve.evalTargetId,n)],p=e.req.query("runId");if(p){let I=Wi.string().uuid().safeParse(p);if(!I.success)return e.json({error:"Invalid runId"},400);m.push(zi(Ve.evalRunId,I.data))}let _=await d.select().from(Ve).where(jg(...m)).orderBy(kD(Ve.createdAt),ND(Ve.id)).limit(c).offset(l);return e.json(_)});Br.get("/eval-targets/:id/judge-calibration",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await Ge(n,t))return e.json({error:"Eval target not found"},404);let[o,s]=await Promise.all([Bi(t,n),kb(n)]);return e.json({...o,reviewers:s})});Br.get("/eval-targets/:id/annotation-queue",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await Ge(n,t))return e.json({error:"Eval target not found"},404);let o=e.req.query("limit"),s=o?parseInt(o,10):NaN,i=Number.isFinite(s)?Math.min(Math.max(1,s),20):5,c=await d.execute(PD`
946
865
  WITH current_judge AS (
947
866
  -- Same definition as judge-calibration: most recently stamped run's
948
867
  -- model; empty (NULL) until any grading carries judge_model. Labeling a
@@ -987,40 +906,40 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
987
906
  WHERE llm_total > llm_annotated
988
907
  ORDER BY (llm_annotated > 0) DESC, random()
989
908
  LIMIT ${i}
990
- `),c=a.map(m=>m.id),l=c.length?await u.select().from(Je).where(Og(Vi(Je.evalTargetId,n),ID(Je.evalRunId,c))):[],p=new Map(l.map(m=>[`${m.evalRunId}:${m.expectationIndex}`,m]));return e.json({remaining:a[0]?.remaining??0,runs:a.map(m=>({id:m.id,configuration:m.configuration,runNumber:m.run_number,iteration:m.iteration,createdAt:m.created_at,evalName:m.eval_name,prompt:m.prompt,output:m.output,outputTruncated:m.output_truncated,expectations:(m.expectations??[]).map((y,v)=>{let h=p.get(`${m.id}:${v}`);return{index:v,text:y.text??"",passed:y.passed??!1,evidence:y.evidence??"",method:y.method==="deterministic"?"deterministic":"llm",errored:y.errored===!0,annotation:h?{verdict:h.verdict,flag:h.flag}:null}})}))})});O();import{Hono as AD}from"hono";import{z as un}from"zod";import{eq as Dn,and as Fc,isNull as Dg,sql as Ji,inArray as ED}from"drizzle-orm";var Ss=new AD,xD=un.object({evalRunId:un.string().uuid(),expectationIndex:un.number().int().min(0),expectationText:un.string(),judgePassed:un.boolean(),humanPassed:un.boolean(),reviewerPassed:un.boolean()}),TD=un.object({reviewerEngine:un.enum(["claude","codex"]),reviewerModel:un.string().min(1).max(200),verdicts:un.array(xD).min(1).max(500)});Ss.put("/eval-targets/:id/judge-reviews",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let o=TD.parse(await e.req.json()),s=[...new Set(o.verdicts.map(c=>c.evalRunId))];if((await u.select({id:be.id}).from(be).where(Fc(ED(be.id,s),Dn(be.evalTargetId,n)))).length!==s.length)return e.json({error:"One or more runs do not belong to this target"},400);let a=0;for(let c of o.verdicts)await u.insert(pe).values({userId:t,evalTargetId:n,evalRunId:c.evalRunId,expectationIndex:c.expectationIndex,expectationText:c.expectationText,judgePassed:c.judgePassed,humanPassed:c.humanPassed,reviewerEngine:o.reviewerEngine,reviewerModel:o.reviewerModel,reviewerPassed:c.reviewerPassed}).onConflictDoUpdate({target:[pe.evalRunId,pe.expectationIndex,pe.reviewerModel],set:{expectationText:c.expectationText,judgePassed:c.judgePassed,humanPassed:c.humanPassed,reviewerEngine:o.reviewerEngine,reviewerPassed:c.reviewerPassed,resolvedAt:Ji`CASE WHEN ${pe.reviewerPassed} <> ${c.reviewerPassed} THEN NULL ELSE ${pe.resolvedAt} END`,resolution:Ji`CASE WHEN ${pe.reviewerPassed} <> ${c.reviewerPassed} THEN NULL ELSE ${pe.resolution} END`,updatedAt:new Date}}),a+=1;if(o.verdicts.some(c=>c.reviewerPassed!==c.humanPassed))try{let[{count:c}]=await u.select({count:Ji`count(*)::int`}).from(pe).where(Fc(Dn(pe.evalTargetId,n),Dg(pe.resolvedAt),Ji`${pe.reviewerPassed} <> ${pe.humanPassed}`));if(c>0){let[l]=await u.select({name:k.name}).from(k).where(Dn(k.id,n));await tn({userId:t,type:"second_opinions_flagged",title:"Second opinions flag some of your labels",body:`${l?.name??"Eval target"}: a ${o.reviewerModel} review pass disagrees with ${c} of your label${c===1?"":"s"} \u2014 worth a second look; genuine judge errors become reject anchors.`,url:`/eval-targets/${n}?tab=review`,sourceTable:"eval_targets",sourceId:`second-opinions:${n}:${new Date().toISOString().slice(0,10)}`,metadata:{evalTargetId:n,unresolved:c,reviewerModel:o.reviewerModel}})}}catch(c){console.error("[judge-reviews] flag notification failed:",c instanceof Error?c.message:c)}return e.json({upserted:a})});Ss.get("/eval-targets/:id/judge-reviews",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let o=await u.select({evalRunId:pe.evalRunId,expectationIndex:pe.expectationIndex,reviewerEngine:pe.reviewerEngine,reviewerModel:pe.reviewerModel,reviewerPassed:pe.reviewerPassed,humanPassed:pe.humanPassed,resolvedAt:pe.resolvedAt}).from(pe).where(Dn(pe.evalTargetId,n));return e.json(o)});Ss.get("/eval-targets/:id/judge-reviews/disagreements",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let o=await u.select({id:pe.id,evalRunId:pe.evalRunId,expectationIndex:pe.expectationIndex,expectationText:pe.expectationText,judgePassed:pe.judgePassed,humanPassed:pe.humanPassed,reviewerEngine:pe.reviewerEngine,reviewerModel:pe.reviewerModel,reviewerPassed:pe.reviewerPassed,evalName:Se.name,configuration:be.configuration,runNumber:be.runNumber,outputExcerpt:Ji`LEFT(${be.outputs}->>'transcript', 1200)`}).from(pe).innerJoin(be,Dn(be.id,pe.evalRunId)).leftJoin(Se,Dn(Se.id,be.evalId)).where(Fc(Dn(pe.evalTargetId,n),Dg(pe.resolvedAt),Ji`${pe.reviewerPassed} <> ${pe.humanPassed}`)).orderBy(pe.evalRunId,pe.expectationIndex);return e.json(o)});var RD=un.object({resolution:un.enum(["kept","relabeled"])});Ss.patch("/judge-reviews/:id/resolve",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=un.string().uuid().safeParse(n);if(!r.success)return e.json({error:"Invalid id"},400);let o=RD.parse(await e.req.json()),[s]=await u.select().from(pe).where(Fc(Dn(pe.id,r.data),Dn(pe.userId,t)));if(!s)return e.json({error:"Not found"},404);let i=await u.update(pe).set({resolvedAt:new Date,resolution:o.resolution,updatedAt:new Date}).where(Fc(Dn(pe.evalRunId,s.evalRunId),Dn(pe.expectationIndex,s.expectationIndex),Dn(pe.userId,t),Dg(pe.resolvedAt))).returning({id:pe.id});return e.json({resolved:i.length})});O();import{createHash as jD}from"node:crypto";import{Hono as ND}from"hono";import{z as ne}from"zod";import{eq as Xt,and as Gi,desc as Lg,asc as PD,sql as yr,isNull as CD}from"drizzle-orm";import{alias as W0}from"drizzle-orm/pg-core";function kD(e){if(e===null||typeof e!="object")return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}d(kD,"isPlainObject");function Ml(e){if(typeof e=="string")return e.indexOf("\0")===-1?e:e.split("\0").join("");if(Array.isArray(e)){let t=null;for(let n=0;n<e.length;n++){let r=Ml(e[n]);t===null&&r!==e[n]&&(t=e.slice(0,n)),t!==null&&t.push(r)}return t??e}if(kD(e)){let t=Object.entries(e),n=null;for(let r=0;r<t.length;r++){let[o,s]=t[r],i=o.indexOf("\0")===-1?o:o.split("\0").join(""),a=Ml(s);if(n===null&&(i!==o||a!==s)){n={};for(let c=0;c<r;c++)n[t[c][0]]=t[c][1]}n!==null&&(n[i]=a)}return n??e}return e}d(Ml,"stripNullBytes");vl();function OD(){return{enabled:process.env.RULEMETRIC_OFFLOAD_DELTAS==="1"||process.env.RULEMETRIC_OFFLOAD_DELTAS==="true",thresholdBytes:Number(process.env.OFFLOAD_GZIP_THRESHOLD_BYTES)||49152}}d(OD,"offloadConfig");function z0(e){return jD("sha256").update(JSON.stringify(e)).digest("hex")}d(z0,"hashJson");function V0(e,t){return Array.isArray(e)?e:Array.isArray(t)?t:[]}d(V0,"arrayOr");function J0(e,t){return yr`COALESCE(
909
+ `),a=c.map(p=>p.id),l=a.length?await d.select().from(Ve).where(jg(zi(Ve.evalTargetId,n),jD(Ve.evalRunId,a))):[],m=new Map(l.map(p=>[`${p.evalRunId}:${p.expectationIndex}`,p]));return e.json({remaining:c[0]?.remaining??0,runs:c.map(p=>({id:p.id,configuration:p.configuration,runNumber:p.run_number,iteration:p.iteration,createdAt:p.created_at,evalName:p.eval_name,prompt:p.prompt,output:p.output,outputTruncated:p.output_truncated,expectations:(p.expectations??[]).map((_,I)=>{let h=m.get(`${p.id}:${I}`);return{index:I,text:_.text??"",passed:_.passed??!1,evidence:_.evidence??"",method:_.method==="deterministic"?"deterministic":"llm",errored:_.errored===!0,annotation:h?{verdict:h.verdict,flag:h.flag}:null}})}))})});C();import{Hono as OD}from"hono";import{z as dn}from"zod";import{eq as Mn,and as Wc,isNull as Pg,sql as Vi,inArray as CD}from"drizzle-orm";var As=new OD,LD=dn.object({evalRunId:dn.string().uuid(),expectationIndex:dn.number().int().min(0),expectationText:dn.string(),judgePassed:dn.boolean(),humanPassed:dn.boolean(),reviewerPassed:dn.boolean()}),MD=dn.object({reviewerEngine:dn.enum(["claude","codex"]),reviewerModel:dn.string().min(1).max(200),verdicts:dn.array(LD).min(1).max(500)});As.put("/eval-targets/:id/judge-reviews",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await Ge(n,t))return e.json({error:"Eval target not found"},404);let o=MD.parse(await e.req.json()),s=[...new Set(o.verdicts.map(a=>a.evalRunId))];if((await d.select({id:ve.id}).from(ve).where(Wc(CD(ve.id,s),Mn(ve.evalTargetId,n)))).length!==s.length)return e.json({error:"One or more runs do not belong to this target"},400);let c=0;for(let a of o.verdicts)await d.insert(le).values({userId:t,evalTargetId:n,evalRunId:a.evalRunId,expectationIndex:a.expectationIndex,expectationText:a.expectationText,judgePassed:a.judgePassed,humanPassed:a.humanPassed,reviewerEngine:o.reviewerEngine,reviewerModel:o.reviewerModel,reviewerPassed:a.reviewerPassed}).onConflictDoUpdate({target:[le.evalRunId,le.expectationIndex,le.reviewerModel],set:{expectationText:a.expectationText,judgePassed:a.judgePassed,humanPassed:a.humanPassed,reviewerEngine:o.reviewerEngine,reviewerPassed:a.reviewerPassed,resolvedAt:Vi`CASE WHEN ${le.reviewerPassed} <> ${a.reviewerPassed} THEN NULL ELSE ${le.resolvedAt} END`,resolution:Vi`CASE WHEN ${le.reviewerPassed} <> ${a.reviewerPassed} THEN NULL ELSE ${le.resolution} END`,updatedAt:new Date}}),c+=1;if(o.verdicts.some(a=>a.reviewerPassed!==a.humanPassed))try{let[{count:a}]=await d.select({count:Vi`count(*)::int`}).from(le).where(Wc(Mn(le.evalTargetId,n),Pg(le.resolvedAt),Vi`${le.reviewerPassed} <> ${le.humanPassed}`));if(a>0){let[l]=await d.select({name:k.name}).from(k).where(Mn(k.id,n));await en({userId:t,type:"second_opinions_flagged",title:"Second opinions flag some of your labels",body:`${l?.name??"Eval target"}: a ${o.reviewerModel} review pass disagrees with ${a} of your label${a===1?"":"s"} \u2014 worth a second look; genuine judge errors become reject anchors.`,url:`/eval-targets/${n}?tab=review`,sourceTable:"eval_targets",sourceId:`second-opinions:${n}:${new Date().toISOString().slice(0,10)}`,metadata:{evalTargetId:n,unresolved:a,reviewerModel:o.reviewerModel}})}}catch(a){console.error("[judge-reviews] flag notification failed:",a instanceof Error?a.message:a)}return e.json({upserted:c})});As.get("/eval-targets/:id/judge-reviews",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await Ge(n,t))return e.json({error:"Eval target not found"},404);let o=await d.select({evalRunId:le.evalRunId,expectationIndex:le.expectationIndex,reviewerEngine:le.reviewerEngine,reviewerModel:le.reviewerModel,reviewerPassed:le.reviewerPassed,humanPassed:le.humanPassed,resolvedAt:le.resolvedAt}).from(le).where(Mn(le.evalTargetId,n));return e.json(o)});As.get("/eval-targets/:id/judge-reviews/disagreements",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await Ge(n,t))return e.json({error:"Eval target not found"},404);let o=await d.select({id:le.id,evalRunId:le.evalRunId,expectationIndex:le.expectationIndex,expectationText:le.expectationText,judgePassed:le.judgePassed,humanPassed:le.humanPassed,reviewerEngine:le.reviewerEngine,reviewerModel:le.reviewerModel,reviewerPassed:le.reviewerPassed,evalName:Ie.name,configuration:ve.configuration,runNumber:ve.runNumber,outputExcerpt:Vi`LEFT(${ve.outputs}->>'transcript', 1200)`}).from(le).innerJoin(ve,Mn(ve.id,le.evalRunId)).leftJoin(Ie,Mn(Ie.id,ve.evalId)).where(Wc(Mn(le.evalTargetId,n),Pg(le.resolvedAt),Vi`${le.reviewerPassed} <> ${le.humanPassed}`)).orderBy(le.evalRunId,le.expectationIndex);return e.json(o)});var $D=dn.object({resolution:dn.enum(["kept","relabeled"])});As.patch("/judge-reviews/:id/resolve",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=dn.string().uuid().safeParse(n);if(!r.success)return e.json({error:"Invalid id"},400);let o=$D.parse(await e.req.json()),[s]=await d.select().from(le).where(Wc(Mn(le.id,r.data),Mn(le.userId,t)));if(!s)return e.json({error:"Not found"},404);let i=await d.update(le).set({resolvedAt:new Date,resolution:o.resolution,updatedAt:new Date}).where(Wc(Mn(le.evalRunId,s.evalRunId),Mn(le.expectationIndex,s.expectationIndex),Mn(le.userId,t),Pg(le.resolvedAt))).returning({id:le.id});return e.json({resolved:i.length})});C();import{createHash as UD}from"node:crypto";import{Hono as HD}from"hono";import{z as ne}from"zod";import{eq as Xt,and as Ji,desc as Og,asc as BD,sql as yr,isNull as FD}from"drizzle-orm";import{alias as jb}from"drizzle-orm/pg-core";function qD(e){if(e===null||typeof e!="object")return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}u(qD,"isPlainObject");function Cl(e){if(typeof e=="string")return e.indexOf("\0")===-1?e:e.split("\0").join("");if(Array.isArray(e)){let t=null;for(let n=0;n<e.length;n++){let r=Cl(e[n]);t===null&&r!==e[n]&&(t=e.slice(0,n)),t!==null&&t.push(r)}return t??e}if(qD(e)){let t=Object.entries(e),n=null;for(let r=0;r<t.length;r++){let[o,s]=t[r],i=o.indexOf("\0")===-1?o:o.split("\0").join(""),c=Cl(s);if(n===null&&(i!==o||c!==s)){n={};for(let a=0;a<r;a++)n[t[a][0]]=t[a][1]}n!==null&&(n[i]=c)}return n??e}return e}u(Cl,"stripNullBytes");wl();function WD(){return{enabled:process.env.RULEMETRIC_OFFLOAD_DELTAS==="1"||process.env.RULEMETRIC_OFFLOAD_DELTAS==="true",thresholdBytes:Number(process.env.OFFLOAD_GZIP_THRESHOLD_BYTES)||49152}}u(WD,"offloadConfig");function Pb(e){return UD("sha256").update(JSON.stringify(e)).digest("hex")}u(Pb,"hashJson");function Db(e,t){return Array.isArray(e)?e:Array.isArray(t)?t:[]}u(Db,"arrayOr");function Ob(e,t){return yr`COALESCE(
991
910
  CASE WHEN jsonb_typeof(${e}) = 'array' THEN ${e} END,
992
911
  CASE WHEN jsonb_typeof(${t}) = 'array' THEN ${t} END,
993
912
  '[]'::jsonb
994
- )`}d(J0,"resolvedJsonArray");async function DD(e){let{enabled:t,thresholdBytes:n}=OD();if(!t||e.length===0)return{messagesDelta:e,messagesDeltaRef:null};let r=hg(e);if(r.bytes<=n)return{messagesDelta:e,messagesDeltaRef:null};try{let{ref:o}=await _g(r);return{messagesDelta:null,messagesDeltaRef:o}}catch(o){return console.error("[context-snapshots] delta offload failed, writing inline:",o instanceof Error?o.message:o),{messagesDelta:e,messagesDeltaRef:null}}}d(DD,"resolveDeltaStorage");async function Mg(e,t,n){let r=JSON.stringify(n);await u.insert(_n).values({hash:e,contentType:t,content:n,sizeBytes:Buffer.byteLength(r,"utf-8")}).onConflictDoNothing()}d(Mg,"upsertBlob");var Ki=new ND,MD=ne.object({provider:ne.string(),model:ne.string(),system_prompt:ne.string(),system_blocks:ne.array(ne.unknown()).default([]),injected_instructions:ne.union([ne.array(ne.string()),ne.string()]).default([]),messages:ne.array(ne.unknown()).optional(),messages_raw:ne.array(ne.unknown()).optional(),messages_summary:ne.unknown().optional(),tools:ne.array(ne.unknown()).default([]),system_hash:ne.string(),request_hash:ne.string().optional(),sequence:ne.number().int().optional(),max_tokens:ne.number().nullable().optional(),temperature:ne.number().nullable().optional(),top_p:ne.number().nullable().optional(),top_k:ne.number().nullable().optional(),stop_sequences:ne.array(ne.string()).optional(),stream:ne.boolean().optional(),tool_choice:ne.unknown().optional(),thinking:ne.unknown().optional(),api_metadata:ne.unknown().optional(),request_headers:ne.record(ne.string()).optional(),response_headers:ne.record(ne.string()).optional(),response_status:ne.number().optional(),beta_features:ne.array(ne.string()).optional(),usage:ne.object({input_tokens:ne.number().nullable().optional(),output_tokens:ne.number().nullable().optional(),cache_creation_input_tokens:ne.number().nullable().optional(),cache_read_input_tokens:ne.number().nullable().optional(),total_tokens:ne.number().nullable().optional()}).optional(),response:ne.record(ne.unknown()).optional(),estimated_tokens:ne.number().nullable().optional(),captured_at:ne.string().optional(),metadata:ne.record(ne.unknown()).optional(),context_items:ne.array(ne.object({type:ne.string(),name:ne.string(),content_hash:ne.string().optional(),char_count:ne.number().optional(),estimated_tokens:ne.number().optional(),triggered_by:ne.string().optional(),message_index:ne.number().optional(),preview:ne.string().optional(),skill_names:ne.array(ne.string()).optional(),tool_names:ne.array(ne.string()).optional()}).passthrough()).optional()}),LD=100,$D=500;async function G0(e,t){let[n]=await u.select({id:L.id,sequence:L.sequence}).from(L).where(Gi(Xt(L.sessionId,e),Xt(L.requestHash,t))).limit(1);return n??null}d(G0,"findSnapshotByHash");Ki.post("/sessions/:id/context-snapshots",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=Ml(MD.parse(r)),[s]=await u.select({id:_.id,projectPath:_.projectPath,projectId:_.projectId}).from(_).where(Gi(Xt(_.id,n),Xt(_.userId,t)));if(!s)return e.json({error:"Session not found"},404);if(!s.projectPath&&o.context_items?.length){let h=o.context_items.find(f=>f.type==="claude_md"&&typeof f.name=="string"&&f.name.startsWith("/")&&f.name.endsWith("/CLAUDE.md"));if(h){let f=h.name.slice(0,-10),w=null;if(!s.projectId){let[b]=await u.select({projectId:le.projectId}).from(le).where(Xt(le.path,f)).limit(1);w=b?.projectId??null}await u.update(_).set({projectPath:f,...w?{projectId:w}:{}}).where(Gi(Xt(_.id,n),CD(_.projectPath)))}}let i=o.messages??o.messages_summary??[],a=o.messages_raw??[],c=o.request_hash??"",l=Array.isArray(o.injected_instructions)?o.injected_instructions:[o.injected_instructions];if(c){let h=await G0(n,c);if(h)return e.json({id:h.id,sequence:h.sequence,deduplicated:!0})}let p=z0(o.tools),m=z0(l);await Promise.all([Mg(o.system_hash,"system_prompt",o.system_prompt),Mg(p,"tools",o.tools),Mg(m,"injected_instructions",l)]);let y={sessionId:n,userId:t,provider:o.provider,model:o.model,systemPrompt:"",injectedInstructions:[],messagesSummary:i,tools:[],systemHash:o.system_hash,toolsHash:p,injectedHash:m,requestHash:c,maxTokens:o.max_tokens??null,temperature:o.temperature??null,estimatedTokens:o.estimated_tokens??null,capturedAt:o.captured_at?new Date(o.captured_at):new Date,metadata:{...o.metadata,...o.context_items?.length&&{contextItems:o.context_items},...o.top_p!=null&&{topP:o.top_p},...o.top_k!=null&&{topK:o.top_k},...o.stop_sequences?.length&&{stopSequences:o.stop_sequences},...o.stream!=null&&{stream:o.stream},...o.tool_choice!=null&&{toolChoice:o.tool_choice},...o.thinking!=null&&{thinking:o.thinking},...o.api_metadata!=null&&{apiMetadata:o.api_metadata},...o.request_headers!=null&&{requestHeaders:o.request_headers},...o.response_headers!=null&&{responseHeaders:o.response_headers},...o.response_status!=null&&{responseStatus:o.response_status},...o.beta_features?.length&&{betaFeatures:o.beta_features},...o.usage!=null&&{usage:o.usage},...o.response!=null&&{response:o.response}}},v=5;for(let h=0;h<=v;h++){let[f]=await u.select({sequence:L.sequence,messagesSummary:L.messagesSummary}).from(L).where(Xt(L.sessionId,n)).orderBy(Lg(L.sequence)).limit(1),w=(f?.sequence??-1)+1,b=Array.isArray(f?.messagesSummary)?f.messagesSummary:[],I=a,S=0,A=Math.min(b.length,I.length);for(;S<A&&JSON.stringify(b[S])===JSON.stringify(I[S]);)S++;let E=I.slice(S),R=await DD(E);try{let[D]=await u.insert(L).values({...y,sequence:w,...R}).returning({id:L.id,sequence:L.sequence});return e.json({id:D.id,sequence:D.sequence},201)}catch(D){let j=D.cause,P=j?.constraint_name??"",$=`${D instanceof Error?D.message:""} ${j?.message??""}`.toLowerCase();if(j?.code==="23505"){if((P==="idx_snapshots_session_request"||$.includes("request"))&&c){let H=await G0(n,c);if(H)return e.json({id:H.id,sequence:H.sequence,deduplicated:!0})}if(h<v)continue;return e.json({error:"snapshot sequence assignment failed after retries"},503)}if($.includes("foreign key"))return e.json({error:"Session no longer exists"},404);throw D}}return e.json({error:"snapshot sequence assignment failed after retries"},503)});Ki.get("/sessions/:id/context-snapshots",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=Number(e.req.query("limit")||LD),o=Math.min(Math.max(1,r),$D),s=Math.max(0,Number(e.req.query("offset")||0)),[i]=await u.select({id:_.id}).from(_).where(Gi(Xt(_.id,n),Xt(_.userId,t)));if(!i)return e.json({error:"Session not found"},404);if(!(e.req.query("full")==="true")){let l=W0(_n,"cb_tools"),p=W0(_n,"cb_injected"),y=(await u.select({id:L.id,sessionId:L.sessionId,userId:L.userId,sequence:L.sequence,provider:L.provider,model:L.model,systemHash:L.systemHash,requestHash:L.requestHash,maxTokens:L.maxTokens,temperature:L.temperature,estimatedTokens:L.estimatedTokens,capturedAt:L.capturedAt,injectedCount:yr`jsonb_array_length(${J0(p.content,L.injectedInstructions)})`,toolsLight:yr`COALESCE((
913
+ )`}u(Ob,"resolvedJsonArray");async function zD(e){let{enabled:t,thresholdBytes:n}=WD();if(!t||e.length===0)return{messagesDelta:e,messagesDeltaRef:null};let r=pg(e);if(r.bytes<=n)return{messagesDelta:e,messagesDeltaRef:null};try{let{ref:o}=await fg(r);return{messagesDelta:null,messagesDeltaRef:o}}catch(o){return console.error("[context-snapshots] delta offload failed, writing inline:",o instanceof Error?o.message:o),{messagesDelta:e,messagesDeltaRef:null}}}u(zD,"resolveDeltaStorage");async function Dg(e,t,n){let r=JSON.stringify(n);await d.insert(_n).values({hash:e,contentType:t,content:n,sizeBytes:Buffer.byteLength(r,"utf-8")}).onConflictDoNothing()}u(Dg,"upsertBlob");var Ki=new HD,VD=ne.object({provider:ne.string(),model:ne.string(),system_prompt:ne.string(),system_blocks:ne.array(ne.unknown()).default([]),injected_instructions:ne.union([ne.array(ne.string()),ne.string()]).default([]),messages:ne.array(ne.unknown()).optional(),messages_raw:ne.array(ne.unknown()).optional(),messages_summary:ne.unknown().optional(),tools:ne.array(ne.unknown()).default([]),system_hash:ne.string(),request_hash:ne.string().optional(),sequence:ne.number().int().optional(),max_tokens:ne.number().nullable().optional(),temperature:ne.number().nullable().optional(),top_p:ne.number().nullable().optional(),top_k:ne.number().nullable().optional(),stop_sequences:ne.array(ne.string()).optional(),stream:ne.boolean().optional(),tool_choice:ne.unknown().optional(),thinking:ne.unknown().optional(),api_metadata:ne.unknown().optional(),request_headers:ne.record(ne.string()).optional(),response_headers:ne.record(ne.string()).optional(),response_status:ne.number().optional(),beta_features:ne.array(ne.string()).optional(),usage:ne.object({input_tokens:ne.number().nullable().optional(),output_tokens:ne.number().nullable().optional(),cache_creation_input_tokens:ne.number().nullable().optional(),cache_read_input_tokens:ne.number().nullable().optional(),total_tokens:ne.number().nullable().optional()}).optional(),response:ne.record(ne.unknown()).optional(),estimated_tokens:ne.number().nullable().optional(),captured_at:ne.string().optional(),metadata:ne.record(ne.unknown()).optional(),context_items:ne.array(ne.object({type:ne.string(),name:ne.string(),content_hash:ne.string().optional(),char_count:ne.number().optional(),estimated_tokens:ne.number().optional(),triggered_by:ne.string().optional(),message_index:ne.number().optional(),preview:ne.string().optional(),skill_names:ne.array(ne.string()).optional(),tool_names:ne.array(ne.string()).optional()}).passthrough()).optional()}),JD=100,KD=500;async function Cb(e,t){let[n]=await d.select({id:$.id,sequence:$.sequence}).from($).where(Ji(Xt($.sessionId,e),Xt($.requestHash,t))).limit(1);return n??null}u(Cb,"findSnapshotByHash");Ki.post("/sessions/:id/context-snapshots",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=Cl(VD.parse(r)),[s]=await d.select({id:y.id,projectPath:y.projectPath,projectId:y.projectId}).from(y).where(Ji(Xt(y.id,n),Xt(y.userId,t)));if(!s)return e.json({error:"Session not found"},404);if(!s.projectPath&&o.context_items?.length){let h=o.context_items.find(f=>f.type==="claude_md"&&typeof f.name=="string"&&f.name.startsWith("/")&&f.name.endsWith("/CLAUDE.md"));if(h){let f=h.name.slice(0,-10),w=null;if(!s.projectId){let[b]=await d.select({projectId:de.projectId}).from(de).where(Xt(de.path,f)).limit(1);w=b?.projectId??null}await d.update(y).set({projectPath:f,...w?{projectId:w}:{}}).where(Ji(Xt(y.id,n),FD(y.projectPath)))}}let i=o.messages??o.messages_summary??[],c=o.messages_raw??[],a=o.request_hash??"",l=Array.isArray(o.injected_instructions)?o.injected_instructions:[o.injected_instructions];if(a){let h=await Cb(n,a);if(h)return e.json({id:h.id,sequence:h.sequence,deduplicated:!0})}let m=Pb(o.tools),p=Pb(l);await Promise.all([Dg(o.system_hash,"system_prompt",o.system_prompt),Dg(m,"tools",o.tools),Dg(p,"injected_instructions",l)]);let _={sessionId:n,userId:t,provider:o.provider,model:o.model,systemPrompt:"",injectedInstructions:[],messagesSummary:i,tools:[],systemHash:o.system_hash,toolsHash:m,injectedHash:p,requestHash:a,maxTokens:o.max_tokens??null,temperature:o.temperature??null,estimatedTokens:o.estimated_tokens??null,capturedAt:o.captured_at?new Date(o.captured_at):new Date,metadata:{...o.metadata,...o.context_items?.length&&{contextItems:o.context_items},...o.top_p!=null&&{topP:o.top_p},...o.top_k!=null&&{topK:o.top_k},...o.stop_sequences?.length&&{stopSequences:o.stop_sequences},...o.stream!=null&&{stream:o.stream},...o.tool_choice!=null&&{toolChoice:o.tool_choice},...o.thinking!=null&&{thinking:o.thinking},...o.api_metadata!=null&&{apiMetadata:o.api_metadata},...o.request_headers!=null&&{requestHeaders:o.request_headers},...o.response_headers!=null&&{responseHeaders:o.response_headers},...o.response_status!=null&&{responseStatus:o.response_status},...o.beta_features?.length&&{betaFeatures:o.beta_features},...o.usage!=null&&{usage:o.usage},...o.response!=null&&{response:o.response}}},I=5;for(let h=0;h<=I;h++){let[f]=await d.select({sequence:$.sequence,messagesSummary:$.messagesSummary}).from($).where(Xt($.sessionId,n)).orderBy(Og($.sequence)).limit(1),w=(f?.sequence??-1)+1,b=Array.isArray(f?.messagesSummary)?f.messagesSummary:[],v=c,S=0,A=Math.min(b.length,v.length);for(;S<A&&JSON.stringify(b[S])===JSON.stringify(v[S]);)S++;let E=v.slice(S),R=await zD(E);try{let[P]=await d.insert($).values({..._,sequence:w,...R}).returning({id:$.id,sequence:$.sequence});return e.json({id:P.id,sequence:P.sequence},201)}catch(P){let N=P.cause,D=N?.constraint_name??"",q=`${P instanceof Error?P.message:""} ${N?.message??""}`.toLowerCase();if(N?.code==="23505"){if((D==="idx_snapshots_session_request"||q.includes("request"))&&a){let H=await Cb(n,a);if(H)return e.json({id:H.id,sequence:H.sequence,deduplicated:!0})}if(h<I)continue;return e.json({error:"snapshot sequence assignment failed after retries"},503)}if(q.includes("foreign key"))return e.json({error:"Session no longer exists"},404);throw P}}return e.json({error:"snapshot sequence assignment failed after retries"},503)});Ki.get("/sessions/:id/context-snapshots",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=Number(e.req.query("limit")||JD),o=Math.min(Math.max(1,r),KD),s=Math.max(0,Number(e.req.query("offset")||0)),[i]=await d.select({id:y.id}).from(y).where(Ji(Xt(y.id,n),Xt(y.userId,t)));if(!i)return e.json({error:"Session not found"},404);if(!(e.req.query("full")==="true")){let l=jb(_n,"cb_tools"),m=jb(_n,"cb_injected"),_=(await d.select({id:$.id,sessionId:$.sessionId,userId:$.userId,sequence:$.sequence,provider:$.provider,model:$.model,systemHash:$.systemHash,requestHash:$.requestHash,maxTokens:$.maxTokens,temperature:$.temperature,estimatedTokens:$.estimatedTokens,capturedAt:$.capturedAt,injectedCount:yr`jsonb_array_length(${Ob(m.content,$.injectedInstructions)})`,toolsLight:yr`COALESCE((
995
914
  SELECT jsonb_agg(jsonb_build_object('name', t->'name', 'description', left(COALESCE(t->>'description', ''), 80)))
996
- FROM jsonb_array_elements(${J0(l.content,L.tools)}) AS t
915
+ FROM jsonb_array_elements(${Ob(l.content,$.tools)}) AS t
997
916
  ), '[]'::jsonb)`,metadataLight:yr`jsonb_strip_nulls(jsonb_build_object(
998
- 'usage', ${L.metadata}->'usage',
999
- 'response', ${L.metadata}->'response',
1000
- 'thinking', ${L.metadata}->'thinking',
1001
- 'stream', ${L.metadata}->'stream',
1002
- 'betaFeatures', ${L.metadata}->'betaFeatures',
1003
- 'responseStatus', ${L.metadata}->'responseStatus',
1004
- 'apiMetadata', ${L.metadata}->'apiMetadata',
917
+ 'usage', ${$.metadata}->'usage',
918
+ 'response', ${$.metadata}->'response',
919
+ 'thinking', ${$.metadata}->'thinking',
920
+ 'stream', ${$.metadata}->'stream',
921
+ 'betaFeatures', ${$.metadata}->'betaFeatures',
922
+ 'responseStatus', ${$.metadata}->'responseStatus',
923
+ 'apiMetadata', ${$.metadata}->'apiMetadata',
1005
924
  'contextItems', CASE
1006
- WHEN jsonb_typeof(${L.metadata}->'contextItems') = 'array' THEN (
925
+ WHEN jsonb_typeof(${$.metadata}->'contextItems') = 'array' THEN (
1007
926
  SELECT jsonb_agg(jsonb_build_object('type', ci->'type', 'name', ci->'name', 'estimated_tokens', ci->'estimated_tokens'))
1008
- FROM jsonb_array_elements(${L.metadata}->'contextItems') AS ci
927
+ FROM jsonb_array_elements(${$.metadata}->'contextItems') AS ci
1009
928
  )
1010
929
  ELSE NULL
1011
930
  END
1012
- ))`}).from(L).leftJoin(l,Xt(l.hash,L.toolsHash)).leftJoin(p,Xt(p.hash,L.injectedHash)).where(Xt(L.sessionId,n)).orderBy(Lg(L.capturedAt)).limit(o).offset(s)).map(v=>({id:v.id,sessionId:v.sessionId,userId:v.userId,sequence:v.sequence,provider:v.provider,model:v.model,systemHash:v.systemHash,requestHash:v.requestHash,maxTokens:v.maxTokens,temperature:v.temperature,estimatedTokens:v.estimatedTokens,capturedAt:v.capturedAt,metadata:v.metadataLight??{},systemPrompt:"",messagesSummary:[],tools:v.toolsLight??[],injectedInstructions:new Array(Number(v.injectedCount??0)).fill("[omitted]")}));return e.json(y)}let c=await nt.select().from(L).where(Xt(L.sessionId,n)).orderBy(Lg(L.capturedAt)).limit(o).offset(s);return e.json(await f0(await yg(c)))});Ki.get("/context-snapshots/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await nt.select().from(L).where(Gi(Xt(L.id,n),Xt(L.userId,t)));if(!r)return e.json({error:"Snapshot not found"},404);let o=r.messagesDeltaRef?await Cc(r.messagesDeltaRef):r.messagesDelta;if(r.systemPrompt||r.tools?.length>0)return e.json(r.messagesDeltaRef?{...r,messagesDelta:o}:r);let s=[r.systemHash,r.toolsHash,r.injectedHash].filter(Boolean),i=s.length>0?await u.select().from(_n).where(yr`${_n.hash} IN (${yr.join(s.map(p=>yr`${p}`),yr`, `)})`):[],a=new Map(i.map(p=>[p.hash,p.content])),c=[],l=!1;if(o){let{messages:p,truncated:m}=await _l({fetchPage:d(async(y,v)=>Oc(await nt.select({sequence:L.sequence,messagesDelta:L.messagesDelta,messagesDeltaRef:L.messagesDeltaRef}).from(L).where(Gi(Xt(L.sessionId,r.sessionId),yr`${L.sequence} <= ${r.sequence}`,yr`${L.sequence} > ${y}`)).orderBy(PD(L.sequence)).limit(v)),"fetchPage")});c=p,l=m}return e.json({...r,systemPrompt:a.get(r.systemHash)??r.systemPrompt??"",tools:V0(a.get(r.toolsHash??""),r.tools),injectedInstructions:V0(a.get(r.injectedHash??""),r.injectedInstructions),messagesDelta:o,messagesRaw:c,messagesTruncated:l})});O();import{Hono as qD}from"hono";import{z as Ro}from"zod";import{eq as Zn,and as Wc,desc as UD,ne as HD}from"drizzle-orm";import{z as wr}from"zod";var Ll=wr.object({parallel:wr.number().int().positive().default(1),runsPerEval:wr.number().int().positive().default(1),iteration:wr.number().int().positive().default(1),skipBaseline:wr.boolean().default(!1),skipGrading:wr.boolean().default(!1),generateIfEmpty:wr.boolean().default(!1),model:wr.string().optional(),graderModel:wr.string().optional(),timeout:wr.number().int().positive().default(12e4)}).default({});var ko=new qD,BD=Ro.object({evalTargetId:Ro.string().uuid(),config:Ll});ko.post("/eval-jobs",async e=>{let t=e.get("userId"),n=await e.req.json(),r=BD.parse(n),{id:o,noLiveWorker:s}=await Rt({taskName:"process_eval",payload:{evalTargetId:r.evalTargetId,config:r.config},userId:t,mirror:{userId:t,evalTargetId:r.evalTargetId,config:r.config}}),[i]=await u.select().from(ke).where(Zn(ke.id,o));return e.json({...i,noLiveWorker:s},201)});ko.get("/eval-targets/:id/jobs",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await u.select().from(ke).where(Wc(Zn(ke.evalTargetId,n),Zn(ke.userId,t))).orderBy(UD(ke.createdAt));return e.json(r)});ko.patch("/eval-jobs/:id/progress",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),s=["running","paused"].includes(r.status)?r.status:"running",[i]=await u.update(ke).set({status:s,progress:r.progress,updatedAt:new Date}).where(Wc(Zn(ke.id,n),Zn(ke.userId,t))).returning();return i?e.json(i):e.json({error:"Job not found"},404)});var FD=Ro.object({status:Ro.enum(["running","completed","failed"]).optional(),attempts:Ro.number().int().nonnegative().optional(),error:Ro.string().optional(),result:Ro.record(Ro.unknown()).optional()});ko.patch("/eval-jobs/:id/state",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=FD.parse(await e.req.json()),o={updatedAt:new Date};r.attempts!==void 0&&(o.attempts=r.attempts),r.status&&(o.status=r.status),r.error&&(o.error=r.error),r.result!==void 0&&(o.result=r.result),(r.status==="completed"||r.status==="failed")&&(o.completedAt=new Date);let[s]=await u.update(ke).set(o).where(Wc(Zn(ke.id,n),Zn(ke.userId,t),HD(ke.status,"cancelled"))).returning();if(!s){let[i]=await u.select().from(ke).where(Wc(Zn(ke.id,n),Zn(ke.userId,t)));return i?e.json(i):e.json({error:"Job not found"},404)}return e.json(s)});ko.post("/eval-jobs/:id/cancel",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.update(ke).set({status:"cancelled",updatedAt:new Date}).where(Wc(Zn(ke.id,n),Zn(ke.userId,t))).returning();return r?e.json(r):e.json({error:"Job not found"},404)});O();import{Hono as WD}from"hono";import{z as As}from"zod";import{eq as zc,and as $g,isNull as zD,desc as VD,sql as K0}from"drizzle-orm";var $l=new WD,JD=As.object({contentHash:As.string().min(1).optional(),evalTargetId:As.string().uuid().optional(),name:As.string().min(1).max(255),type:As.enum(["instruction","skill","prompt","plan"]).default("instruction"),content:As.string().optional(),sessionId:As.string().uuid().optional(),config:Ll});async function GD(e){let t=await u.select({systemPrompt:L.systemPrompt,systemHash:L.systemHash,metadata:L.metadata}).from(L).where(K0`${L.metadata}->'contextItems' @> ${JSON.stringify([{content_hash:e}])}::jsonb`).orderBy(VD(L.capturedAt)).limit(1);if(t.length===0)return null;let n=t[0],r=await Il(n.systemHash,n.systemPrompt),i=(n.metadata?.contextItems??[]).find(p=>p.content_hash===e);if(!i?.name)return r;let a=i.name.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),c=new RegExp(`Contents of [^\\n]*${a}[^\\n]*\\n([\\s\\S]*?)(?=Contents of |$)`,"i"),l=r.match(c);return l?l[1].trim():r}d(GD,"resolveContentFromSnapshot");$l.post("/eval-from-context",async e=>{let t=e.get("userId"),n=await e.req.json(),r=JD.parse(n),o=!1,s;if(r.evalTargetId){let[y]=await u.select({id:k.id}).from(k).where($g(zc(k.id,r.evalTargetId),zc(k.userId,t))).limit(1);if(!y)return e.json({error:"Eval target not found"},404);s=y.id}else if(r.contentHash){let[y]=await u.select({id:k.id}).from(k).where($g(zc(k.userId,t),K0`${k.metadata}->>'content_hash' = ${r.contentHash}`)).limit(1);if(y)s=y.id;else{let v=r.content;if(v||(v=await GD(r.contentHash)??void 0),!v)return e.json({error:"Content not provided and could not be resolved from snapshots"},400);let[h]=await u.insert(k).values({userId:t,name:r.name,type:r.type,content:v,description:`Auto-created from session context item: ${r.name}`,metadata:{content_hash:r.contentHash,source_session_id:r.sessionId}}).returning();s=h.id,o=!0}}else return e.json({error:"Provide contentHash or evalTargetId"},400);let a=(await u.select({id:Se.id}).from(Se).where($g(zc(Se.evalTargetId,s),zD(Se.retiredAt))).limit(1)).length===0,c=a?{...r.config,generateIfEmpty:!0}:r.config,{id:l,noLiveWorker:p}=await Rt({taskName:"process_eval",payload:{evalTargetId:s,config:c},userId:t,mirror:{userId:t,evalTargetId:s,config:c}}),[m]=await u.select().from(ke).where(zc(ke.id,l));return e.json({evalTargetId:s,evalJobId:m.id,evalCasesCreated:0,generationDeferred:a,isNewTarget:o,noLiveWorker:p},201)});import{Hono as eL}from"hono";O();import{Hono as KD}from"hono";import{and as Y0,eq as qg,sql as ln}from"drizzle-orm";var Ug=new KD;Ug.get("/insights/projects",async e=>{let t=e.get("userId"),n=await u.select({projectId:_.projectId,name:U.name,gitRemoteUrl:U.gitRemoteUrl,sessionCount:ln`COUNT(*)`,enrichedCount:ln`COUNT(CASE WHEN ${_.metadata}->'local_session_meta' IS NOT NULL THEN 1 END)`,analyzedCount:ln`COUNT(CASE WHEN ${_.analysis} IS NOT NULL THEN 1 END)`,firstSession:ln`MIN(${_.startedAt})`,lastSession:ln`MAX(${_.startedAt})`}).from(_).innerJoin(U,qg(U.id,_.projectId)).where(Y0(qg(_.userId,t),ln`${_.projectId} IS NOT NULL`)).groupBy(_.projectId,U.name,U.gitRemoteUrl),r=await u.execute(ln`
931
+ ))`}).from($).leftJoin(l,Xt(l.hash,$.toolsHash)).leftJoin(m,Xt(m.hash,$.injectedHash)).where(Xt($.sessionId,n)).orderBy(Og($.capturedAt)).limit(o).offset(s)).map(I=>({id:I.id,sessionId:I.sessionId,userId:I.userId,sequence:I.sequence,provider:I.provider,model:I.model,systemHash:I.systemHash,requestHash:I.requestHash,maxTokens:I.maxTokens,temperature:I.temperature,estimatedTokens:I.estimatedTokens,capturedAt:I.capturedAt,metadata:I.metadataLight??{},systemPrompt:"",messagesSummary:[],tools:I.toolsLight??[],injectedInstructions:new Array(Number(I.injectedCount??0)).fill("[omitted]")}));return e.json(_)}let a=await tt.select().from($).where(Xt($.sessionId,n)).orderBy(Og($.capturedAt)).limit(o).offset(s);return e.json(await nb(await gg(a)))});Ki.get("/context-snapshots/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await tt.select().from($).where(Ji(Xt($.id,n),Xt($.userId,t)));if(!r)return e.json({error:"Snapshot not found"},404);let o=r.messagesDeltaRef?await Pc(r.messagesDeltaRef):r.messagesDelta;if(r.systemPrompt||r.tools?.length>0)return e.json(r.messagesDeltaRef?{...r,messagesDelta:o}:r);let s=[r.systemHash,r.toolsHash,r.injectedHash].filter(Boolean),i=s.length>0?await d.select().from(_n).where(yr`${_n.hash} IN (${yr.join(s.map(m=>yr`${m}`),yr`, `)})`):[],c=new Map(i.map(m=>[m.hash,m.content])),a=[],l=!1;if(o){let{messages:m,truncated:p}=await hl({fetchPage:u(async(_,I)=>Dc(await tt.select({sequence:$.sequence,messagesDelta:$.messagesDelta,messagesDeltaRef:$.messagesDeltaRef}).from($).where(Ji(Xt($.sessionId,r.sessionId),yr`${$.sequence} <= ${r.sequence}`,yr`${$.sequence} > ${_}`)).orderBy(BD($.sequence)).limit(I)),"fetchPage")});a=m,l=p}return e.json({...r,systemPrompt:c.get(r.systemHash)??r.systemPrompt??"",tools:Db(c.get(r.toolsHash??""),r.tools),injectedInstructions:Db(c.get(r.injectedHash??""),r.injectedInstructions),messagesDelta:o,messagesRaw:a,messagesTruncated:l})});C();import{Hono as GD}from"hono";import{z as To}from"zod";import{eq as Zn,and as zc,desc as YD,ne as XD}from"drizzle-orm";import{z as wr}from"zod";var Ll=wr.object({parallel:wr.number().int().positive().default(1),runsPerEval:wr.number().int().positive().default(1),iteration:wr.number().int().positive().default(1),skipBaseline:wr.boolean().default(!1),skipGrading:wr.boolean().default(!1),generateIfEmpty:wr.boolean().default(!1),model:wr.string().optional(),graderModel:wr.string().optional(),timeout:wr.number().int().positive().default(12e4)}).default({});var Ro=new GD,QD=To.object({evalTargetId:To.string().uuid(),config:Ll});Ro.post("/eval-jobs",async e=>{let t=e.get("userId"),n=await e.req.json(),r=QD.parse(n),{id:o,noLiveWorker:s}=await Tt({taskName:"process_eval",payload:{evalTargetId:r.evalTargetId,config:r.config},userId:t,mirror:{userId:t,evalTargetId:r.evalTargetId,config:r.config}}),[i]=await d.select().from(Re).where(Zn(Re.id,o));return e.json({...i,noLiveWorker:s},201)});Ro.get("/eval-targets/:id/jobs",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await d.select().from(Re).where(zc(Zn(Re.evalTargetId,n),Zn(Re.userId,t))).orderBy(YD(Re.createdAt));return e.json(r)});Ro.patch("/eval-jobs/:id/progress",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),s=["running","paused"].includes(r.status)?r.status:"running",[i]=await d.update(Re).set({status:s,progress:r.progress,updatedAt:new Date}).where(zc(Zn(Re.id,n),Zn(Re.userId,t))).returning();return i?e.json(i):e.json({error:"Job not found"},404)});var ZD=To.object({status:To.enum(["running","completed","failed"]).optional(),attempts:To.number().int().nonnegative().optional(),error:To.string().optional(),result:To.record(To.unknown()).optional()});Ro.patch("/eval-jobs/:id/state",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=ZD.parse(await e.req.json()),o={updatedAt:new Date};r.attempts!==void 0&&(o.attempts=r.attempts),r.status&&(o.status=r.status),r.error&&(o.error=r.error),r.result!==void 0&&(o.result=r.result),(r.status==="completed"||r.status==="failed")&&(o.completedAt=new Date);let[s]=await d.update(Re).set(o).where(zc(Zn(Re.id,n),Zn(Re.userId,t),XD(Re.status,"cancelled"))).returning();if(!s){let[i]=await d.select().from(Re).where(zc(Zn(Re.id,n),Zn(Re.userId,t)));return i?e.json(i):e.json({error:"Job not found"},404)}return e.json(s)});Ro.post("/eval-jobs/:id/cancel",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.update(Re).set({status:"cancelled",updatedAt:new Date}).where(zc(Zn(Re.id,n),Zn(Re.userId,t))).returning();return r?e.json(r):e.json({error:"Job not found"},404)});C();import{Hono as eO}from"hono";import{z as Es}from"zod";import{eq as Vc,and as Cg,isNull as tO,desc as nO,sql as Lb}from"drizzle-orm";var Ml=new eO,rO=Es.object({contentHash:Es.string().min(1).optional(),evalTargetId:Es.string().uuid().optional(),name:Es.string().min(1).max(255),type:Es.enum(["instruction","skill","prompt","plan"]).default("instruction"),content:Es.string().optional(),sessionId:Es.string().uuid().optional(),config:Ll});async function oO(e){let t=await d.select({systemPrompt:$.systemPrompt,systemHash:$.systemHash,metadata:$.metadata}).from($).where(Lb`${$.metadata}->'contextItems' @> ${JSON.stringify([{content_hash:e}])}::jsonb`).orderBy(nO($.capturedAt)).limit(1);if(t.length===0)return null;let n=t[0],r=await vl(n.systemHash,n.systemPrompt),i=(n.metadata?.contextItems??[]).find(m=>m.content_hash===e);if(!i?.name)return r;let c=i.name.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),a=new RegExp(`Contents of [^\\n]*${c}[^\\n]*\\n([\\s\\S]*?)(?=Contents of |$)`,"i"),l=r.match(a);return l?l[1].trim():r}u(oO,"resolveContentFromSnapshot");Ml.post("/eval-from-context",async e=>{let t=e.get("userId"),n=await e.req.json(),r=rO.parse(n),o=!1,s;if(r.evalTargetId){let[_]=await d.select({id:k.id}).from(k).where(Cg(Vc(k.id,r.evalTargetId),Vc(k.userId,t))).limit(1);if(!_)return e.json({error:"Eval target not found"},404);s=_.id}else if(r.contentHash){let[_]=await d.select({id:k.id}).from(k).where(Cg(Vc(k.userId,t),Lb`${k.metadata}->>'content_hash' = ${r.contentHash}`)).limit(1);if(_)s=_.id;else{let I=r.content;if(I||(I=await oO(r.contentHash)??void 0),!I)return e.json({error:"Content not provided and could not be resolved from snapshots"},400);let[h]=await d.insert(k).values({userId:t,name:r.name,type:r.type,content:I,description:`Auto-created from session context item: ${r.name}`,metadata:{content_hash:r.contentHash,source_session_id:r.sessionId}}).returning();s=h.id,o=!0}}else return e.json({error:"Provide contentHash or evalTargetId"},400);let c=(await d.select({id:Ie.id}).from(Ie).where(Cg(Vc(Ie.evalTargetId,s),tO(Ie.retiredAt))).limit(1)).length===0,a=c?{...r.config,generateIfEmpty:!0}:r.config,{id:l,noLiveWorker:m}=await Tt({taskName:"process_eval",payload:{evalTargetId:s,config:a},userId:t,mirror:{userId:t,evalTargetId:s,config:a}}),[p]=await d.select().from(Re).where(Vc(Re.id,l));return e.json({evalTargetId:s,evalJobId:p.id,evalCasesCreated:0,generationDeferred:c,isNewTarget:o,noLiveWorker:m},201)});import{Hono as cC}from"hono";C();import{Hono as sO}from"hono";import{and as Mb,eq as Lg,sql as ln}from"drizzle-orm";var Mg=new sO;Mg.get("/insights/projects",async e=>{let t=e.get("userId"),n=await d.select({projectId:y.projectId,name:M.name,gitRemoteUrl:M.gitRemoteUrl,sessionCount:ln`COUNT(*)`,enrichedCount:ln`COUNT(CASE WHEN ${y.metadata}->'local_session_meta' IS NOT NULL THEN 1 END)`,analyzedCount:ln`COUNT(CASE WHEN ${y.analysis} IS NOT NULL THEN 1 END)`,firstSession:ln`MIN(${y.startedAt})`,lastSession:ln`MAX(${y.startedAt})`}).from(y).innerJoin(M,Lg(M.id,y.projectId)).where(Mb(Lg(y.userId,t),ln`${y.projectId} IS NOT NULL`)).groupBy(y.projectId,M.name,M.gitRemoteUrl),r=await d.execute(ln`
1013
932
  select project_id, project_path, count(*)::int as n
1014
933
  from sessions
1015
934
  where user_id = ${t}
1016
935
  and project_id is not null
1017
936
  and project_path is not null
1018
937
  group by project_id, project_path
1019
- `),o=new Map,s=new Map;for(let p of r){let m=s.get(p.project_id)??-1;p.n>m&&(s.set(p.project_id,p.n),o.set(p.project_id,p.project_path))}let i=n.map(p=>({projectId:p.projectId,name:p.name,projectPath:p.projectId?o.get(p.projectId)??"":"",gitRemoteUrl:p.gitRemoteUrl,sessionCount:Number(p.sessionCount),enrichedCount:Number(p.enrichedCount),analyzedCount:Number(p.analyzedCount),firstSession:p.firstSession,lastSession:p.lastSession})),c=(await u.select({projectPath:_.projectPath,sessionCount:ln`COUNT(*)`,enrichedCount:ln`COUNT(CASE WHEN ${_.metadata}->'local_session_meta' IS NOT NULL THEN 1 END)`,analyzedCount:ln`COUNT(CASE WHEN ${_.analysis} IS NOT NULL THEN 1 END)`,firstSession:ln`MIN(${_.startedAt})`,lastSession:ln`MAX(${_.startedAt})`}).from(_).where(Y0(qg(_.userId,t),ln`${_.projectId} IS NULL`,ln`${_.projectPath} IS NOT NULL`)).groupBy(_.projectPath)).map(p=>({projectId:null,name:(p.projectPath??"").split("/").pop()||"unknown",projectPath:p.projectPath??"",gitRemoteUrl:null,sessionCount:Number(p.sessionCount),enrichedCount:Number(p.enrichedCount),analyzedCount:Number(p.analyzedCount),firstSession:p.firstSession,lastSession:p.lastSession})),l=[...i,...c].sort((p,m)=>m.sessionCount-p.sessionCount);return e.json(l)});O();import fM from"node:fs";import gM from"node:path";import{Hono as hM}from"hono";import{and as Vg,desc as Jg,eq as Po,gte as _M,ilike as sS,lte as yM,sql as Yi}from"drizzle-orm";O();import{createHash as YD}from"node:crypto";import{and as XD,eq as X0,inArray as QD,sql as jo}from"drizzle-orm";var ZD=90,eM=.5,Q0=[{category:"claude_md_additions",get:d(e=>e.suggestions?.claude_md_additions,"get"),label:d(e=>String(e.addition??"").slice(0,120),"label")},{category:"features_to_try",get:d(e=>e.suggestions?.features_to_try,"get"),label:d(e=>String(e.feature??"").slice(0,120),"label")},{category:"usage_patterns",get:d(e=>e.suggestions?.usage_patterns,"get"),label:d(e=>String(e.title??"").slice(0,120),"label")},{category:"friction_categories",get:d(e=>e.friction_analysis?.categories,"get"),label:d(e=>String(e.category??"").slice(0,120),"label")},{category:"opportunities",get:d(e=>e.on_the_horizon?.opportunities,"get"),label:d(e=>String(e.title??"").slice(0,120),"label")},{category:"impressive_workflows",get:d(e=>e.what_works?.impressive_workflows,"get"),label:d(e=>String(e.title??"").slice(0,120),"label")},{category:"project_areas",get:d(e=>e.project_areas,"get"),label:d(e=>String(e.name??"").slice(0,120),"label")}];function Z0(e,t){let n=Object.keys(t).filter(o=>o!=="id"&&o!=="timesGenerated").sort(),r=JSON.stringify(n.map(o=>[o,t[o]]));return YD("sha256").update(`${e}
1020
- ${r}`).digest("hex")}d(Z0,"recommendationEntryHash");var tM=new Set(["42883","42P01","42704"]),nM=2,ql=!1;function rM(e){let t=e?.code;return typeof t=="string"&&tM.has(t)?"capability-absent":tc(e)||ec(e)||ti(e)||fu(e)?"load":"isolable"}d(rM,"classifyProbeFailure");function oM(e,t){return async n=>[...await u.execute(jo`
938
+ `),o=new Map,s=new Map;for(let m of r){let p=s.get(m.project_id)??-1;m.n>p&&(s.set(m.project_id,m.n),o.set(m.project_id,m.project_path))}let i=n.map(m=>({projectId:m.projectId,name:m.name,projectPath:m.projectId?o.get(m.projectId)??"":"",gitRemoteUrl:m.gitRemoteUrl,sessionCount:Number(m.sessionCount),enrichedCount:Number(m.enrichedCount),analyzedCount:Number(m.analyzedCount),firstSession:m.firstSession,lastSession:m.lastSession})),a=(await d.select({projectPath:y.projectPath,sessionCount:ln`COUNT(*)`,enrichedCount:ln`COUNT(CASE WHEN ${y.metadata}->'local_session_meta' IS NOT NULL THEN 1 END)`,analyzedCount:ln`COUNT(CASE WHEN ${y.analysis} IS NOT NULL THEN 1 END)`,firstSession:ln`MIN(${y.startedAt})`,lastSession:ln`MAX(${y.startedAt})`}).from(y).where(Mb(Lg(y.userId,t),ln`${y.projectId} IS NULL`,ln`${y.projectPath} IS NOT NULL`)).groupBy(y.projectPath)).map(m=>({projectId:null,name:(m.projectPath??"").split("/").pop()||"unknown",projectPath:m.projectPath??"",gitRemoteUrl:null,sessionCount:Number(m.sessionCount),enrichedCount:Number(m.enrichedCount),analyzedCount:Number(m.analyzedCount),firstSession:m.firstSession,lastSession:m.lastSession})),l=[...i,...a].sort((m,p)=>p.sessionCount-m.sessionCount);return e.json(l)});C();import AO from"node:fs";import EO from"node:path";import{Hono as xO}from"hono";import{and as Fg,desc as Wg,eq as jo,gte as TO,ilike as Vb,lte as RO,sql as Gi}from"drizzle-orm";C();import{createHash as iO}from"node:crypto";import{and as aO,eq as $b,inArray as cO,sql as ko}from"drizzle-orm";var uO=90,dO=.5,qb=[{category:"claude_md_additions",get:u(e=>e.suggestions?.claude_md_additions,"get"),label:u(e=>String(e.addition??"").slice(0,120),"label")},{category:"features_to_try",get:u(e=>e.suggestions?.features_to_try,"get"),label:u(e=>String(e.feature??"").slice(0,120),"label")},{category:"usage_patterns",get:u(e=>e.suggestions?.usage_patterns,"get"),label:u(e=>String(e.title??"").slice(0,120),"label")},{category:"friction_categories",get:u(e=>e.friction_analysis?.categories,"get"),label:u(e=>String(e.category??"").slice(0,120),"label")},{category:"opportunities",get:u(e=>e.on_the_horizon?.opportunities,"get"),label:u(e=>String(e.title??"").slice(0,120),"label")},{category:"impressive_workflows",get:u(e=>e.what_works?.impressive_workflows,"get"),label:u(e=>String(e.title??"").slice(0,120),"label")},{category:"project_areas",get:u(e=>e.project_areas,"get"),label:u(e=>String(e.name??"").slice(0,120),"label")}];function Ub(e,t){let n=Object.keys(t).filter(o=>o!=="id"&&o!=="timesGenerated").sort(),r=JSON.stringify(n.map(o=>[o,t[o]]));return iO("sha256").update(`${e}
939
+ ${r}`).digest("hex")}u(Ub,"recommendationEntryHash");var lO=new Set(["42883","42P01","42704"]),mO=2,$l=!1;function pO(e){let t=e?.code;return typeof t=="string"&&lO.has(t)?"capability-absent":ec(e)||Za(e)||ti(e)||gd(e)?"load":"isolable"}u(pO,"classifyProbeFailure");function fO(e,t){return async n=>[...await d.execute(ko`
1021
940
  SELECT p.probe_hash, m.content_hash, m.times_generated, m.last_job_id,
1022
941
  m.dismissed_at, m.sim
1023
- FROM (VALUES ${jo.join(n.map(o=>jo`(${o.hash}::text, ${o.category}::text, ${o.label}::text)`),jo`, `)}) AS p(probe_hash, category, label)
942
+ FROM (VALUES ${ko.join(n.map(o=>ko`(${o.hash}::text, ${o.category}::text, ${o.label}::text)`),ko`, `)}) AS p(probe_hash, category, label)
1024
943
  -- CROSS JOIN, not LEFT JOIN LATERAL: a probe with no row in its
1025
944
  -- category simply produces no output row, which reads back as "no
1026
945
  -- alias" — the same outcome the per-probe query gave via an empty
@@ -1036,10 +955,10 @@ ${r}`).digest("hex")}d(Z0,"recommendationEntryHash");var tM=new Set(["42883","42
1036
955
  ORDER BY sim DESC
1037
956
  LIMIT 1
1038
957
  ) m
1039
- `)]}d(oM,"dbProbeExecutor");async function Hg(e,t,n,r=0){if(e.length===0)return[];if(ql||n.aborted)return n.degraded+=e.length,[];try{return n.statements+=1,await t(e)}catch(o){let s=rM(o);if(n.failure??={kind:s,code:typeof o?.code=="string"?String(o.code):void 0,message:o instanceof Error?o.message:String(o)},s==="capability-absent"&&(ql=!0),s==="load"&&(n.aborted=!0),!(s==="isolable"&&r<nM&&e.length>1))return n.degraded+=e.length,[];n.bisections+=1;let a=Math.ceil(e.length/2),c=await Hg(e.slice(0,a),t,n,r+1),l=await Hg(e.slice(a),t,n,r+1);return[...c,...l]}}d(Hg,"resolveProbes");async function eS(e){let{userId:t,jobId:n}=e,r=e.projectPath??"",o=[];for(let f of Q0)for(let w of f.get(e.recs)??[]){if(w===null||typeof w!="object")continue;let b=w;o.push({category:f.category,hash:Z0(f.category,b),label:f.label(b)})}if(o.length===0)return e.recs;let s=[...new Set(o.map(f=>f.hash))],i=await u.select({contentHash:Ee.contentHash,timesGenerated:Ee.timesGenerated,lastJobId:Ee.lastJobId,dismissedAt:Ee.dismissedAt}).from(Ee).where(XD(X0(Ee.userId,t),X0(Ee.projectPath,r),QD(Ee.contentHash,s))),a=new Map(i.map(f=>[f.contentHash,f])),c=new Map,l=new Map;for(let f of o)a.has(f.hash)||f.label.trim().length===0||l.has(f.hash)||l.set(f.hash,f);if(l.size>0&&!ql){let f={probes:l.size,statements:0,bisections:0,degraded:0,aborted:!1},w=await Hg([...l.values()],oM(t,r),f);for(let b of w)Number(b.sim)<eM||(c.set(b.probe_hash,b.content_hash),a.has(b.content_hash)||a.set(b.content_hash,{contentHash:b.content_hash,timesGenerated:Number(b.times_generated),lastJobId:b.last_job_id,dismissedAt:b.dismissed_at?new Date(b.dismissed_at):null}));f.failure&&console.warn(`[insight-memory] semantic probe degraded to verbatim identity: ${f.degraded}/${f.probes} probes, ${f.statements} statement(s), ${f.bisections} bisection(s), class=${f.failure.kind}`+(f.failure.code?` code=${f.failure.code}`:"")+(ql?" \u2014 trigram probing disabled for this process":""),f.failure.message)}let p=d(f=>c.get(f)??f,"canonical");if(n){let f=o.filter(w=>{let b=a.get(p(w.hash));return!b||b.lastJobId!==n});if(f.length>0)try{let w=new Set,b=f.filter(I=>!w.has(p(I.hash))&&w.add(p(I.hash)));await u.insert(Ee).values(b.map(I=>({userId:t,projectPath:r,category:I.category,contentHash:p(I.hash),label:I.label,lastJobId:n}))).onConflictDoUpdate({target:[Ee.userId,Ee.projectPath,Ee.contentHash],set:{lastSeenAt:jo`now()`,timesGenerated:jo`${Ee.timesGenerated} + 1`,lastJobId:n}});for(let I of b){let S=p(I.hash),A=a.get(S);a.set(S,{contentHash:S,timesGenerated:(A?.timesGenerated??0)+1,lastJobId:n,dismissedAt:A?.dismissedAt??null})}}catch{}}let m=Date.now()-ZD*24*3600*1e3,y=d(f=>{let w=a.get(f)?.dismissedAt;return w!=null&&new Date(w).getTime()>m},"suppressed"),v={...e.recs},h=d((f,w)=>{switch(f){case"claude_md_additions":case"features_to_try":case"usage_patterns":{let b={...v.suggestions};b[f]=w,v.suggestions=b;break}case"friction_categories":{v.friction_analysis={...v.friction_analysis,categories:w};break}case"opportunities":{v.on_the_horizon={...v.on_the_horizon,opportunities:w};break}case"impressive_workflows":{v.what_works={...v.what_works,impressive_workflows:w};break}case"project_areas":{v.project_areas=w;break}}},"setPath");for(let f of Q0){let w=f.get(e.recs)??[];if(w.length===0)continue;let b=w.map(I=>{if(I===null||typeof I!="object")return I;let S=I,A=p(Z0(f.category,S));return{...S,id:A,timesGenerated:a.get(A)?.timesGenerated??1}}).filter(I=>I===null||typeof I!="object"?!0:!y(I.id??""));h(f.category,b)}return v}d(eS,"applyRecommendationMemory");async function tS(e){let t=e.projectPath??"";await u.insert(Ee).values({userId:e.userId,projectPath:t,category:"unknown",contentHash:e.contentHash,dismissedAt:jo`now()`}).onConflictDoUpdate({target:[Ee.userId,Ee.projectPath,Ee.contentHash],set:{dismissedAt:jo`now()`}})}d(tS,"dismissRecommendation");O();var Bg=[{provider:"anthropic",modelId:"claude-fable-5",inputPerMTok:10,outputPerMTok:50,cacheReadPerMTok:1,cacheWrite5mPerMTok:12.5,cacheWrite1hPerMTok:20,contextWindow:1e6},{provider:"anthropic",modelId:"claude-opus-4-8",inputPerMTok:5,outputPerMTok:25,cacheReadPerMTok:.5,cacheWrite5mPerMTok:6.25,cacheWrite1hPerMTok:10,contextWindow:1e6},{provider:"anthropic",modelId:"claude-opus-4-7",inputPerMTok:5,outputPerMTok:25,cacheReadPerMTok:.5,cacheWrite5mPerMTok:6.25,cacheWrite1hPerMTok:10,contextWindow:1e6},{provider:"anthropic",modelId:"claude-opus-4-6",inputPerMTok:5,outputPerMTok:25,cacheReadPerMTok:.5,cacheWrite5mPerMTok:6.25,cacheWrite1hPerMTok:10,contextWindow:1e6},{provider:"anthropic",modelId:"claude-sonnet-5",inputPerMTok:3,outputPerMTok:15,cacheReadPerMTok:.3,cacheWrite5mPerMTok:3.75,cacheWrite1hPerMTok:6,contextWindow:1e6},{provider:"anthropic",modelId:"claude-sonnet-4-6",inputPerMTok:3,outputPerMTok:15,cacheReadPerMTok:.3,cacheWrite5mPerMTok:3.75,cacheWrite1hPerMTok:6,contextWindow:2e5},{provider:"anthropic",modelId:"claude-haiku-4-5-20251001",inputPerMTok:1,outputPerMTok:5,cacheReadPerMTok:.1,cacheWrite5mPerMTok:1.25,cacheWrite1hPerMTok:2,contextWindow:2e5},{provider:"anthropic",modelId:"claude-haiku-4-5",inputPerMTok:1,outputPerMTok:5,cacheReadPerMTok:.1,cacheWrite5mPerMTok:1.25,cacheWrite1hPerMTok:2,contextWindow:2e5},{provider:"openai",modelId:"gpt-5.5",inputPerMTok:5,outputPerMTok:30,cacheReadPerMTok:.5,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:4e5},{provider:"openai",modelId:"gpt-4o",inputPerMTok:2.5,outputPerMTok:10,cacheReadPerMTok:1.25,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:128e3},{provider:"openai",modelId:"gpt-4o-mini",inputPerMTok:.15,outputPerMTok:.6,cacheReadPerMTok:.075,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:128e3},{provider:"openai",modelId:"gpt-4.1",inputPerMTok:2,outputPerMTok:8,cacheReadPerMTok:.5,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:1e6},{provider:"openai",modelId:"gpt-4.1-mini",inputPerMTok:.4,outputPerMTok:1.6,cacheReadPerMTok:.1,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:1e6},{provider:"openai",modelId:"o1",inputPerMTok:15,outputPerMTok:60,cacheReadPerMTok:7.5,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:2e5},{provider:"openai",modelId:"o3",inputPerMTok:2,outputPerMTok:8,cacheReadPerMTok:.5,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:2e5},{provider:"openai",modelId:"o4-mini",inputPerMTok:1.1,outputPerMTok:4.4,cacheReadPerMTok:.275,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:2e5},{provider:"google",modelId:"gemini-2.5-pro",inputPerMTok:1.25,outputPerMTok:10,cacheReadPerMTok:.31,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:1e6},{provider:"google",modelId:"gemini-2.5-flash",inputPerMTok:.3,outputPerMTok:2.5,cacheReadPerMTok:.075,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:1e6},{provider:"google",modelId:"gemini-2.0-flash",inputPerMTok:.1,outputPerMTok:.4,cacheReadPerMTok:.025,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:1e6},{provider:"google",modelId:"gemini-1.5-pro",inputPerMTok:1.25,outputPerMTok:5,cacheReadPerMTok:.3125,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:2e6},{provider:"google",modelId:"gemini-1.5-flash",inputPerMTok:.075,outputPerMTok:.3,cacheReadPerMTok:.01875,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:1e6},{provider:"xai",modelId:"grok-4",inputPerMTok:3,outputPerMTok:15,cacheReadPerMTok:.75,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:256e3},{provider:"xai",modelId:"grok-3",inputPerMTok:3,outputPerMTok:15,cacheReadPerMTok:.75,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:131072},{provider:"deepseek",modelId:"deepseek-chat",inputPerMTok:.27,outputPerMTok:1.1,cacheReadPerMTok:.07,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:128e3},{provider:"deepseek",modelId:"deepseek-reasoner",inputPerMTok:.55,outputPerMTok:2.19,cacheReadPerMTok:.14,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:128e3}];function No(e){if(!e)return"anthropic";let t=Bg.find(r=>r.modelId===e);if(t)return t.provider;let n=e.toLowerCase();return n.startsWith("claude")?"anthropic":n.startsWith("gpt")||n.startsWith("o1")||n.startsWith("o3")||n.startsWith("o4")||n.startsWith("chatgpt")?"openai":n.startsWith("gemini")?"google":n.startsWith("grok")?"xai":n.startsWith("deepseek")?"deepseek":n.startsWith("mistral")||n.startsWith("mixtral")||n.startsWith("magistral")||n.startsWith("codestral")?"mistral":n.startsWith("llama")||n.startsWith("meta-llama")?"meta":"anthropic"}d(No,"providerFromModelId");var Fg={provider:"anthropic",modelId:"default-sonnet-equivalent",inputPerMTok:3,outputPerMTok:15,cacheReadPerMTok:.3,cacheWrite5mPerMTok:3.75,cacheWrite1hPerMTok:6,contextWindow:2e5};function Wg(e){return Bg.find(t=>t.modelId===e)}d(Wg,"findModel");var Vc=1e6;function sM(e){return Math.round(e*100)/100}d(sM,"roundCents");function Ul(e,t,n){let r=e.input_tokens??0,o=e.output_tokens??0,s=e.cache_read_input_tokens??0,i=(e.cache_creation_5m??0)+(e.cache_creation_input_tokens??0),a=e.cache_creation_1h??0,c=r*t.inputPerMTok/Vc,l=o*t.outputPerMTok/Vc,p=s*t.cacheReadPerMTok/Vc,m=i*t.cacheWrite5mPerMTok/Vc,y=a*t.cacheWrite1hPerMTok/Vc,v=m+y,h=c+l+p+v;return{inputUsd:c,outputUsd:l,cacheReadUsd:p,cacheWriteUsd:v,totalUsd:sM(h),estimated:n}}d(Ul,"computePrice");function zg(e,t,n){let r=Wg(t);return Ul(e,r??Fg,!r)}d(zg,"priceUsage");O();import{and as iM,desc as aM,eq as nS,isNull as cM,lte as dM,or as uM,gt as lM}from"drizzle-orm";function Jc(e){return e==null?0:typeof e=="number"?e:Number(e)}d(Jc,"toNumber");async function Fr(e,t,n,r,o="anthropic"){let s=await e.select().from(Qe).where(iM(nS(Qe.provider,o),nS(Qe.modelId,n),dM(Qe.effectiveFrom,r),uM(cM(Qe.effectiveUntil),lM(Qe.effectiveUntil,r)))).orderBy(aM(Qe.effectiveFrom)).limit(1);if(s.length===0)return zg(t,n,r);let i=s[0];return Ul(t,{inputPerMTok:Jc(i.inputPerM),outputPerMTok:Jc(i.outputPerM),cacheReadPerMTok:Jc(i.cacheReadPerM),cacheWrite5mPerMTok:Jc(i.cacheWrite5mPerM),cacheWrite1hPerMTok:Jc(i.cacheWrite1hPerM)},!1)}d(Fr,"priceUsageFromDb");var Gc=1e6,rS=10*6e4,pM=500,Es=new Map;function mM(e,t,n){return`${e}:${t}:${n.toISOString().slice(0,7)}`}d(mM,"rateKey");function oS(e,t){let n=No(e),r=mM(n,e,t),o=Es.get(r),s=o&&Date.now()-o.at<rS?o.rates:void 0;if(!s){s=(async()=>{let a={input_tokens:Gc},c={output_tokens:Gc},l={cache_read_input_tokens:Gc},p={cache_creation_5m:Gc},m={cache_creation_1h:Gc},[y,v,h,f,w]=await Promise.all([Fr(nt,a,e,t,n),Fr(nt,c,e,t,n),Fr(nt,l,e,t,n),Fr(nt,p,e,t,n),Fr(nt,m,e,t,n)]);return{inputPerM:y.inputUsd,outputPerM:v.outputUsd,cacheReadPerM:h.cacheReadUsd,cacheWrite5mPerM:f.cacheWriteUsd,cacheWrite1hPerM:w.cacheWriteUsd,estimated:y.estimated}})();let i=s;if(i.catch(()=>{Es.get(r)?.rates===i&&Es.delete(r)}),Es.set(r,{at:Date.now(),rates:i}),Es.size>pM)for(let[a,c]of Es)Date.now()-c.at>=rS&&Es.delete(a)}return s}d(oS,"getRates");var Kc=new hM;function wM(e){let t=[],n=[];if(e.sessionsUsingMcp===0&&e.totalSessions>=5&&t.push({feature:"MCP Servers",one_liner:"Extend Claude with external tools via MCP",why_for_you:`Across ${e.totalSessions} sessions, you haven't used any MCP servers. MCP lets Claude access databases, APIs, and custom tools directly. Set up the RuleMetric MCP server from the /connect page in the dashboard.`,example_code:"claude mcp add <server-name> -- <command>"}),e.sessionsUsingTaskAgent===0&&e.totalSessions>=5&&t.push({feature:"Task Agents",one_liner:"Parallelize work with subagents",why_for_you:"You haven't used task agents yet. They can parallelize independent tasks \u2014 like running tests while editing code \u2014 saving significant time.",example_code:"claude -p 'Use an explore agent to map the architecture of this project, then use parallel agents to implement each change independently.'"}),e.totalToolErrors>10){let y=Object.entries(e.toolErrorCategories).sort(([,v],[,h])=>h-v)[0];y&&t.push({feature:"Hooks",one_liner:"Auto-run checks after tool calls",why_for_you:`You had ${e.totalToolErrors} tool errors, with "${y[0]}" being the most common (${y[1]}). Hooks can auto-run type-checks or linters after every edit to catch errors immediately.`,example_code:'Add to .claude/settings.json: {"hooks": {"PostToolUse": [{"matcher": "Edit|Write", "hooks": [{"type": "command", "command": "pnpm type-check 2>&1 | head -5"}]}]}}'})}if(e.totalMessages>100&&e.totalSessions>=10&&t.push({feature:"Headless Mode",one_liner:"Run Claude non-interactively for batch tasks",why_for_you:`With ${e.totalMessages} messages across ${e.totalSessions} sessions, you could automate repetitive tasks using headless mode.`,example_code:"claude -p 'Run pnpm type-check and pnpm test. Report only failures with file paths and line numbers.' --allowedTools 'Bash,Read,Grep'"}),Object.values(e.friction).reduce((y,v)=>y+v,0)>5){let v=Object.entries(e.friction).sort(([,h],[,f])=>f-h).slice(0,2).map(([h,f])=>`${h.replace(/_/g," ")} (${f}x)`).join(", ");n.push({title:"Reduce Friction with Structured Prompts",suggestion:`Your top friction points are: ${v}. Giving Claude more context upfront reduces back-and-forth.`,detail:"Start each session with a clear goal statement and constraints.",copyable_prompt:"This session has ONE goal: [describe goal]. Before making any changes, read the relevant files and explain your plan. Do not modify code until I approve the approach."})}e.sessionsWithAnalysis<e.totalSessions*.3&&e.totalSessions>=5&&n.push({title:"Enrich Sessions for Better Insights",suggestion:`Only ${e.sessionsWithAnalysis} of ${e.totalSessions} sessions have quality analysis. Enriching them unlocks outcome tracking, friction detection, and deeper recommendations.`,detail:"Sessions are analyzed automatically by the background worker. Start it with `rulemetric evals agent` (or use the Regenerate button on the dashboard) and enrichment catches up on its own.",copyable_prompt:"rulemetric evals agent"});let o=(e.outcomes.not_achieved??0)+(e.outcomes.partially_achieved??0),s=Object.values(e.outcomes).reduce((y,v)=>y+v,0);s>5&&o/s>.3&&n.push({title:"Scope Sessions to One Goal",suggestion:`${Math.round(o/s*100)}% of analyzed sessions didn't fully achieve their goal. Breaking work into focused, single-goal sessions improves success rates.`,detail:"Start each session with a clear, narrow objective.",copyable_prompt:"This session has ONE goal: [describe specific goal]. Do not touch any other code. When this specific task is done and verified, stop."});let i=[];e.totalToolErrors>10&&i.push({skillId:"type-check-hook",reason:`You had ${e.totalToolErrors} tool errors. This hook auto-runs type-check after every edit to catch them immediately.`});let a=e.friction.wrong_approach??0,c=e.friction.buggy_code??0;a+c>3&&i.push({skillId:"structured-debugging",reason:`${a+c} sessions had wrong-approach or buggy-code friction. Structured debugging prevents spiraling.`}),((e.toolErrorCategories.test_failure??e.toolErrorCategories.assertion??0)>3||(e.friction.buggy_code??0)>2)&&i.push({skillId:"tdd-workflow",reason:"Frequent test failures or buggy code suggest adopting red-green-refactor discipline."});let p=e.friction.excessive_changes??0;return p>2&&i.push({skillId:"git-commit-conventions",reason:`${p} sessions had excessive changes. Conventional commits enforce focused, atomic changes.`}),Object.entries(e.toolErrorCategories).filter(([y])=>y.includes("auth")||y.includes("security")||y.includes("permission")).reduce((y,[,v])=>y+v,0)>0&&i.push({skillId:"security-review",reason:"Security-related errors detected. A security review checklist catches vulnerabilities before they ship."}),t.length===0&&n.length===0&&i.length===0?null:{suggestions:{features_to_try:t,usage_patterns:n,claude_md_additions:[]},recommended_skills:i.length>0?i:void 0,_auto_generated:!0}}d(wM,"generateAutoSuggestions");var vM=45e3,Hl=new Map,IM=bl();Kc.get("/insights/compute",async e=>{let t=e.get("userId"),n=e.req.query("projectPath"),r=e.req.query("projectId"),o=e.req.query("since"),s=e.req.query("until"),i=e.req.query("tool"),a=`${t}:${r??n??""}:${o??""}:${s??""}:${i??""}`,c=Hl.get(a),p=(c&&Date.now()-c.at<vM?c.data:null)??await IM.run(a,async()=>{let v=[Po(_.userId,t)];r?v.push(Po(_.projectId,r)):n&&v.push(sS(_.projectPath,`%${ot(n)}%`)),i&&v.push(Po(_.tool,i)),o&&v.push(_M(_.startedAt,new Date(o))),s&&v.push(yM(_.startedAt,new Date(s)));let h=500,f=await nt.select({id:_.id,externalSessionId:_.externalSessionId,tool:_.tool,projectPath:_.projectPath,startedAt:_.startedAt,endedAt:_.endedAt,eventCount:_.eventCount,tokenUsage:_.tokenUsage,analysis:_.analysis,analyzedAt:_.analyzedAt,metadata:_.metadata}).from(_).where(Vg(...v)).orderBy(Jg(_.startedAt)).limit(h),w=1e6,b=d(async(V,ge,ze)=>{let Fe=await oS(ge,ze),et=V.input_tokens??0,Bt=V.output_tokens??0,gn=V.cache_read_input_tokens??0,en=(V.cache_creation_5m??0)+(V.cache_creation_input_tokens??0),Bn=V.cache_creation_1h??0,it=et*Fe.inputPerM/w,It=Bt*Fe.outputPerM/w,yt=gn*Fe.cacheReadPerM/w,an=en*Fe.cacheWrite5mPerM/w+Bn*Fe.cacheWrite1hPerM/w,Ko=Math.round((it+It+yt+an)*100)/100;return{inputUsd:it,outputUsd:It,cacheReadUsd:yt,cacheWriteUsd:an,totalUsd:Ko,estimated:Fe.estimated}},"getPriced"),I={},S={},A={},E={},R={},D={},j={},P={},$={},H={},B=[],te=[],_e=[],ee=0,Re=0,N=0,me=0,M=0,ue=0,lt=0,Be=0,re=0,he=0,C=0,oe=0,ve=0,Ce=0,Te=0,Ye=0,Ht=0,jr=0,Jo=0,Zr=0,Sp=0,Gh=0,Kh=0,Yh=0,_a=null,ya=null,yE=Date.now()-720*60*60*1e3,Ap=[],vd="claude-sonnet-4-6",Id=d(()=>({input_tokens:0,output_tokens:0,cache_read_tokens:0,cache_write_tokens:0,cost_usd:0}),"newBucket"),bd=d((V,ge,ze,Fe,et,Bt)=>{V.input_tokens+=ge,V.output_tokens+=ze,V.cache_read_tokens+=Fe,V.cache_write_tokens+=et,V.cost_usd+=Bt},"accumulateBucket"),wa={},va={},wE=new Map(f.map(V=>[V.id,V.startedAt])),vE=new Map(f.map(V=>[V.id,V.tool??"unknown"])),Xh=new Set,Qh=f.length>0?await nt.execute(Yi`
958
+ `)]}u(fO,"dbProbeExecutor");async function $g(e,t,n,r=0){if(e.length===0)return[];if($l||n.aborted)return n.degraded+=e.length,[];try{return n.statements+=1,await t(e)}catch(o){let s=pO(o);if(n.failure??={kind:s,code:typeof o?.code=="string"?String(o.code):void 0,message:o instanceof Error?o.message:String(o)},s==="capability-absent"&&($l=!0),s==="load"&&(n.aborted=!0),!(s==="isolable"&&r<mO&&e.length>1))return n.degraded+=e.length,[];n.bisections+=1;let c=Math.ceil(e.length/2),a=await $g(e.slice(0,c),t,n,r+1),l=await $g(e.slice(c),t,n,r+1);return[...a,...l]}}u($g,"resolveProbes");async function Hb(e){let{userId:t,jobId:n}=e,r=e.projectPath??"",o=[];for(let f of qb)for(let w of f.get(e.recs)??[]){if(w===null||typeof w!="object")continue;let b=w;o.push({category:f.category,hash:Ub(f.category,b),label:f.label(b)})}if(o.length===0)return e.recs;let s=[...new Set(o.map(f=>f.hash))],i=await d.select({contentHash:Ae.contentHash,timesGenerated:Ae.timesGenerated,lastJobId:Ae.lastJobId,dismissedAt:Ae.dismissedAt}).from(Ae).where(aO($b(Ae.userId,t),$b(Ae.projectPath,r),cO(Ae.contentHash,s))),c=new Map(i.map(f=>[f.contentHash,f])),a=new Map,l=new Map;for(let f of o)c.has(f.hash)||f.label.trim().length===0||l.has(f.hash)||l.set(f.hash,f);if(l.size>0&&!$l){let f={probes:l.size,statements:0,bisections:0,degraded:0,aborted:!1},w=await $g([...l.values()],fO(t,r),f);for(let b of w)Number(b.sim)<dO||(a.set(b.probe_hash,b.content_hash),c.has(b.content_hash)||c.set(b.content_hash,{contentHash:b.content_hash,timesGenerated:Number(b.times_generated),lastJobId:b.last_job_id,dismissedAt:b.dismissed_at?new Date(b.dismissed_at):null}));f.failure&&console.warn(`[insight-memory] semantic probe degraded to verbatim identity: ${f.degraded}/${f.probes} probes, ${f.statements} statement(s), ${f.bisections} bisection(s), class=${f.failure.kind}`+(f.failure.code?` code=${f.failure.code}`:"")+($l?" \u2014 trigram probing disabled for this process":""),f.failure.message)}let m=u(f=>a.get(f)??f,"canonical");if(n){let f=o.filter(w=>{let b=c.get(m(w.hash));return!b||b.lastJobId!==n});if(f.length>0)try{let w=new Set,b=f.filter(v=>!w.has(m(v.hash))&&w.add(m(v.hash)));await d.insert(Ae).values(b.map(v=>({userId:t,projectPath:r,category:v.category,contentHash:m(v.hash),label:v.label,lastJobId:n}))).onConflictDoUpdate({target:[Ae.userId,Ae.projectPath,Ae.contentHash],set:{lastSeenAt:ko`now()`,timesGenerated:ko`${Ae.timesGenerated} + 1`,lastJobId:n}});for(let v of b){let S=m(v.hash),A=c.get(S);c.set(S,{contentHash:S,timesGenerated:(A?.timesGenerated??0)+1,lastJobId:n,dismissedAt:A?.dismissedAt??null})}}catch{}}let p=Date.now()-uO*24*3600*1e3,_=u(f=>{let w=c.get(f)?.dismissedAt;return w!=null&&new Date(w).getTime()>p},"suppressed"),I={...e.recs},h=u((f,w)=>{switch(f){case"claude_md_additions":case"features_to_try":case"usage_patterns":{let b={...I.suggestions};b[f]=w,I.suggestions=b;break}case"friction_categories":{I.friction_analysis={...I.friction_analysis,categories:w};break}case"opportunities":{I.on_the_horizon={...I.on_the_horizon,opportunities:w};break}case"impressive_workflows":{I.what_works={...I.what_works,impressive_workflows:w};break}case"project_areas":{I.project_areas=w;break}}},"setPath");for(let f of qb){let w=f.get(e.recs)??[];if(w.length===0)continue;let b=w.map(v=>{if(v===null||typeof v!="object")return v;let S=v,A=m(Ub(f.category,S));return{...S,id:A,timesGenerated:c.get(A)?.timesGenerated??1}}).filter(v=>v===null||typeof v!="object"?!0:!_(v.id??""));h(f.category,b)}return I}u(Hb,"applyRecommendationMemory");async function Bb(e){let t=e.projectPath??"";await d.insert(Ae).values({userId:e.userId,projectPath:t,category:"unknown",contentHash:e.contentHash,dismissedAt:ko`now()`}).onConflictDoUpdate({target:[Ae.userId,Ae.projectPath,Ae.contentHash],set:{dismissedAt:ko`now()`}})}u(Bb,"dismissRecommendation");C();var qg=[{provider:"anthropic",modelId:"claude-fable-5",inputPerMTok:10,outputPerMTok:50,cacheReadPerMTok:1,cacheWrite5mPerMTok:12.5,cacheWrite1hPerMTok:20,contextWindow:1e6},{provider:"anthropic",modelId:"claude-opus-4-8",inputPerMTok:5,outputPerMTok:25,cacheReadPerMTok:.5,cacheWrite5mPerMTok:6.25,cacheWrite1hPerMTok:10,contextWindow:1e6},{provider:"anthropic",modelId:"claude-opus-4-7",inputPerMTok:5,outputPerMTok:25,cacheReadPerMTok:.5,cacheWrite5mPerMTok:6.25,cacheWrite1hPerMTok:10,contextWindow:1e6},{provider:"anthropic",modelId:"claude-opus-4-6",inputPerMTok:5,outputPerMTok:25,cacheReadPerMTok:.5,cacheWrite5mPerMTok:6.25,cacheWrite1hPerMTok:10,contextWindow:1e6},{provider:"anthropic",modelId:"claude-sonnet-5",inputPerMTok:3,outputPerMTok:15,cacheReadPerMTok:.3,cacheWrite5mPerMTok:3.75,cacheWrite1hPerMTok:6,contextWindow:1e6},{provider:"anthropic",modelId:"claude-sonnet-4-6",inputPerMTok:3,outputPerMTok:15,cacheReadPerMTok:.3,cacheWrite5mPerMTok:3.75,cacheWrite1hPerMTok:6,contextWindow:2e5},{provider:"anthropic",modelId:"claude-haiku-4-5-20251001",inputPerMTok:1,outputPerMTok:5,cacheReadPerMTok:.1,cacheWrite5mPerMTok:1.25,cacheWrite1hPerMTok:2,contextWindow:2e5},{provider:"anthropic",modelId:"claude-haiku-4-5",inputPerMTok:1,outputPerMTok:5,cacheReadPerMTok:.1,cacheWrite5mPerMTok:1.25,cacheWrite1hPerMTok:2,contextWindow:2e5},{provider:"openai",modelId:"gpt-5.5",inputPerMTok:5,outputPerMTok:30,cacheReadPerMTok:.5,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:4e5},{provider:"openai",modelId:"gpt-4o",inputPerMTok:2.5,outputPerMTok:10,cacheReadPerMTok:1.25,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:128e3},{provider:"openai",modelId:"gpt-4o-mini",inputPerMTok:.15,outputPerMTok:.6,cacheReadPerMTok:.075,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:128e3},{provider:"openai",modelId:"gpt-4.1",inputPerMTok:2,outputPerMTok:8,cacheReadPerMTok:.5,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:1e6},{provider:"openai",modelId:"gpt-4.1-mini",inputPerMTok:.4,outputPerMTok:1.6,cacheReadPerMTok:.1,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:1e6},{provider:"openai",modelId:"o1",inputPerMTok:15,outputPerMTok:60,cacheReadPerMTok:7.5,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:2e5},{provider:"openai",modelId:"o3",inputPerMTok:2,outputPerMTok:8,cacheReadPerMTok:.5,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:2e5},{provider:"openai",modelId:"o4-mini",inputPerMTok:1.1,outputPerMTok:4.4,cacheReadPerMTok:.275,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:2e5},{provider:"google",modelId:"gemini-2.5-pro",inputPerMTok:1.25,outputPerMTok:10,cacheReadPerMTok:.31,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:1e6},{provider:"google",modelId:"gemini-2.5-flash",inputPerMTok:.3,outputPerMTok:2.5,cacheReadPerMTok:.075,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:1e6},{provider:"google",modelId:"gemini-2.0-flash",inputPerMTok:.1,outputPerMTok:.4,cacheReadPerMTok:.025,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:1e6},{provider:"google",modelId:"gemini-1.5-pro",inputPerMTok:1.25,outputPerMTok:5,cacheReadPerMTok:.3125,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:2e6},{provider:"google",modelId:"gemini-1.5-flash",inputPerMTok:.075,outputPerMTok:.3,cacheReadPerMTok:.01875,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:1e6},{provider:"xai",modelId:"grok-4",inputPerMTok:3,outputPerMTok:15,cacheReadPerMTok:.75,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:256e3},{provider:"xai",modelId:"grok-3",inputPerMTok:3,outputPerMTok:15,cacheReadPerMTok:.75,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:131072},{provider:"deepseek",modelId:"deepseek-chat",inputPerMTok:.27,outputPerMTok:1.1,cacheReadPerMTok:.07,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:128e3},{provider:"deepseek",modelId:"deepseek-reasoner",inputPerMTok:.55,outputPerMTok:2.19,cacheReadPerMTok:.14,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:128e3}];function No(e){if(!e)return"anthropic";let t=qg.find(r=>r.modelId===e);if(t)return t.provider;let n=e.toLowerCase();return n.startsWith("claude")?"anthropic":n.startsWith("gpt")||n.startsWith("o1")||n.startsWith("o3")||n.startsWith("o4")||n.startsWith("chatgpt")?"openai":n.startsWith("gemini")?"google":n.startsWith("grok")?"xai":n.startsWith("deepseek")?"deepseek":n.startsWith("mistral")||n.startsWith("mixtral")||n.startsWith("magistral")||n.startsWith("codestral")?"mistral":n.startsWith("llama")||n.startsWith("meta-llama")?"meta":"anthropic"}u(No,"providerFromModelId");var Ug={provider:"anthropic",modelId:"default-sonnet-equivalent",inputPerMTok:3,outputPerMTok:15,cacheReadPerMTok:.3,cacheWrite5mPerMTok:3.75,cacheWrite1hPerMTok:6,contextWindow:2e5};function Hg(e){return qg.find(t=>t.modelId===e)}u(Hg,"findModel");var Jc=1e6;function gO(e){return Math.round(e*100)/100}u(gO,"roundCents");function ql(e,t,n){let r=e.input_tokens??0,o=e.output_tokens??0,s=e.cache_read_input_tokens??0,i=(e.cache_creation_5m??0)+(e.cache_creation_input_tokens??0),c=e.cache_creation_1h??0,a=r*t.inputPerMTok/Jc,l=o*t.outputPerMTok/Jc,m=s*t.cacheReadPerMTok/Jc,p=i*t.cacheWrite5mPerMTok/Jc,_=c*t.cacheWrite1hPerMTok/Jc,I=p+_,h=a+l+m+I;return{inputUsd:a,outputUsd:l,cacheReadUsd:m,cacheWriteUsd:I,totalUsd:gO(h),estimated:n}}u(ql,"computePrice");function Bg(e,t,n){let r=Hg(t);return ql(e,r??Ug,!r)}u(Bg,"priceUsage");C();import{and as hO,desc as _O,eq as Fb,isNull as yO,lte as wO,or as vO,gt as IO}from"drizzle-orm";function Kc(e){return e==null?0:typeof e=="number"?e:Number(e)}u(Kc,"toNumber");async function Fr(e,t,n,r,o="anthropic"){let s=await e.select().from(Qe).where(hO(Fb(Qe.provider,o),Fb(Qe.modelId,n),wO(Qe.effectiveFrom,r),vO(yO(Qe.effectiveUntil),IO(Qe.effectiveUntil,r)))).orderBy(_O(Qe.effectiveFrom)).limit(1);if(s.length===0)return Bg(t,n,r);let i=s[0];return ql(t,{inputPerMTok:Kc(i.inputPerM),outputPerMTok:Kc(i.outputPerM),cacheReadPerMTok:Kc(i.cacheReadPerM),cacheWrite5mPerMTok:Kc(i.cacheWrite5mPerM),cacheWrite1hPerMTok:Kc(i.cacheWrite1hPerM)},!1)}u(Fr,"priceUsageFromDb");var Gc=1e6,Wb=10*6e4,bO=500,xs=new Map;function SO(e,t,n){return`${e}:${t}:${n.toISOString().slice(0,7)}`}u(SO,"rateKey");function zb(e,t){let n=No(e),r=SO(n,e,t),o=xs.get(r),s=o&&Date.now()-o.at<Wb?o.rates:void 0;if(!s){s=(async()=>{let c={input_tokens:Gc},a={output_tokens:Gc},l={cache_read_input_tokens:Gc},m={cache_creation_5m:Gc},p={cache_creation_1h:Gc},[_,I,h,f,w]=await Promise.all([Fr(tt,c,e,t,n),Fr(tt,a,e,t,n),Fr(tt,l,e,t,n),Fr(tt,m,e,t,n),Fr(tt,p,e,t,n)]);return{inputPerM:_.inputUsd,outputPerM:I.outputUsd,cacheReadPerM:h.cacheReadUsd,cacheWrite5mPerM:f.cacheWriteUsd,cacheWrite1hPerM:w.cacheWriteUsd,estimated:_.estimated}})();let i=s;if(i.catch(()=>{xs.get(r)?.rates===i&&xs.delete(r)}),xs.set(r,{at:Date.now(),rates:i}),xs.size>bO)for(let[c,a]of xs)Date.now()-a.at>=Wb&&xs.delete(c)}return s}u(zb,"getRates");var Yc=new xO;function kO(e){let t=[],n=[];if(e.sessionsUsingMcp===0&&e.totalSessions>=5&&t.push({feature:"MCP Servers",one_liner:"Extend Claude with external tools via MCP",why_for_you:`Across ${e.totalSessions} sessions, you haven't used any MCP servers. MCP lets Claude access databases, APIs, and custom tools directly. Set up the RuleMetric MCP server from the /connect page in the dashboard.`,example_code:"claude mcp add <server-name> -- <command>"}),e.sessionsUsingTaskAgent===0&&e.totalSessions>=5&&t.push({feature:"Task Agents",one_liner:"Parallelize work with subagents",why_for_you:"You haven't used task agents yet. They can parallelize independent tasks \u2014 like running tests while editing code \u2014 saving significant time.",example_code:"claude -p 'Use an explore agent to map the architecture of this project, then use parallel agents to implement each change independently.'"}),e.totalToolErrors>10){let _=Object.entries(e.toolErrorCategories).sort(([,I],[,h])=>h-I)[0];_&&t.push({feature:"Hooks",one_liner:"Auto-run checks after tool calls",why_for_you:`You had ${e.totalToolErrors} tool errors, with "${_[0]}" being the most common (${_[1]}). Hooks can auto-run type-checks or linters after every edit to catch errors immediately.`,example_code:'Add to .claude/settings.json: {"hooks": {"PostToolUse": [{"matcher": "Edit|Write", "hooks": [{"type": "command", "command": "pnpm type-check 2>&1 | head -5"}]}]}}'})}if(e.totalMessages>100&&e.totalSessions>=10&&t.push({feature:"Headless Mode",one_liner:"Run Claude non-interactively for batch tasks",why_for_you:`With ${e.totalMessages} messages across ${e.totalSessions} sessions, you could automate repetitive tasks using headless mode.`,example_code:"claude -p 'Run pnpm type-check and pnpm test. Report only failures with file paths and line numbers.' --allowedTools 'Bash,Read,Grep'"}),Object.values(e.friction).reduce((_,I)=>_+I,0)>5){let I=Object.entries(e.friction).sort(([,h],[,f])=>f-h).slice(0,2).map(([h,f])=>`${h.replace(/_/g," ")} (${f}x)`).join(", ");n.push({title:"Reduce Friction with Structured Prompts",suggestion:`Your top friction points are: ${I}. Giving Claude more context upfront reduces back-and-forth.`,detail:"Start each session with a clear goal statement and constraints.",copyable_prompt:"This session has ONE goal: [describe goal]. Before making any changes, read the relevant files and explain your plan. Do not modify code until I approve the approach."})}e.sessionsWithAnalysis<e.totalSessions*.3&&e.totalSessions>=5&&n.push({title:"Enrich Sessions for Better Insights",suggestion:`Only ${e.sessionsWithAnalysis} of ${e.totalSessions} sessions have quality analysis. Enriching them unlocks outcome tracking, friction detection, and deeper recommendations.`,detail:"Sessions are analyzed automatically by the background worker. Start it with `rulemetric evals agent` (or use the Regenerate button on the dashboard) and enrichment catches up on its own.",copyable_prompt:"rulemetric evals agent"});let o=(e.outcomes.not_achieved??0)+(e.outcomes.partially_achieved??0),s=Object.values(e.outcomes).reduce((_,I)=>_+I,0);s>5&&o/s>.3&&n.push({title:"Scope Sessions to One Goal",suggestion:`${Math.round(o/s*100)}% of analyzed sessions didn't fully achieve their goal. Breaking work into focused, single-goal sessions improves success rates.`,detail:"Start each session with a clear, narrow objective.",copyable_prompt:"This session has ONE goal: [describe specific goal]. Do not touch any other code. When this specific task is done and verified, stop."});let i=[];e.totalToolErrors>10&&i.push({skillId:"type-check-hook",reason:`You had ${e.totalToolErrors} tool errors. This hook auto-runs type-check after every edit to catch them immediately.`});let c=e.friction.wrong_approach??0,a=e.friction.buggy_code??0;c+a>3&&i.push({skillId:"structured-debugging",reason:`${c+a} sessions had wrong-approach or buggy-code friction. Structured debugging prevents spiraling.`}),((e.toolErrorCategories.test_failure??e.toolErrorCategories.assertion??0)>3||(e.friction.buggy_code??0)>2)&&i.push({skillId:"tdd-workflow",reason:"Frequent test failures or buggy code suggest adopting red-green-refactor discipline."});let m=e.friction.excessive_changes??0;return m>2&&i.push({skillId:"git-commit-conventions",reason:`${m} sessions had excessive changes. Conventional commits enforce focused, atomic changes.`}),Object.entries(e.toolErrorCategories).filter(([_])=>_.includes("auth")||_.includes("security")||_.includes("permission")).reduce((_,[,I])=>_+I,0)>0&&i.push({skillId:"security-review",reason:"Security-related errors detected. A security review checklist catches vulnerabilities before they ship."}),t.length===0&&n.length===0&&i.length===0?null:{suggestions:{features_to_try:t,usage_patterns:n,claude_md_additions:[]},recommended_skills:i.length>0?i:void 0,_auto_generated:!0}}u(kO,"generateAutoSuggestions");var NO=45e3,Ul=new Map,jO=Il();Yc.get("/insights/compute",async e=>{let t=e.get("userId"),n=e.req.query("projectPath"),r=e.req.query("projectId"),o=e.req.query("since"),s=e.req.query("until"),i=e.req.query("tool"),c=`${t}:${r??n??""}:${o??""}:${s??""}:${i??""}`,a=Ul.get(c),m=(a&&Date.now()-a.at<NO?a.data:null)??await jO.run(c,async()=>{let I=[jo(y.userId,t)];r?I.push(jo(y.projectId,r)):n&&I.push(Vb(y.projectPath,`%${rt(n)}%`)),i&&I.push(jo(y.tool,i)),o&&I.push(TO(y.startedAt,new Date(o))),s&&I.push(RO(y.startedAt,new Date(s)));let h=500,f=await tt.select({id:y.id,externalSessionId:y.externalSessionId,tool:y.tool,projectPath:y.projectPath,startedAt:y.startedAt,endedAt:y.endedAt,eventCount:y.eventCount,tokenUsage:y.tokenUsage,analysis:y.analysis,analyzedAt:y.analyzedAt,metadata:y.metadata}).from(y).where(Fg(...I)).orderBy(Wg(y.startedAt)).limit(h),w=1e6,b=u(async(z,fe,We)=>{let Be=await zb(fe,We),et=z.input_tokens??0,Ut=z.output_tokens??0,gn=z.cache_read_input_tokens??0,Zt=(z.cache_creation_5m??0)+(z.cache_creation_input_tokens??0),Wn=z.cache_creation_1h??0,st=et*Be.inputPerM/w,It=Ut*Be.outputPerM/w,_t=gn*Be.cacheReadPerM/w,sn=Zt*Be.cacheWrite5mPerM/w+Wn*Be.cacheWrite1hPerM/w,Ko=Math.round((st+It+_t+sn)*100)/100;return{inputUsd:st,outputUsd:It,cacheReadUsd:_t,cacheWriteUsd:sn,totalUsd:Ko,estimated:Be.estimated}},"getPriced"),v={},S={},A={},E={},R={},P={},N={},D={},q={},H={},B=[],ee=[],he=[],te=0,Te=0,j=0,me=0,L=0,ue=0,dt=0,He=0,re=0,ge=0,O=0,oe=0,we=0,Pe=0,xe=0,Ye=0,qt=0,Nr=0,Vo=0,Zr=0,bm=0,zh=0,Vh=0,Jh=0,ha=null,_a=null,iA=Date.now()-720*60*60*1e3,Sm=[],Iu="claude-sonnet-4-6",bu=u(()=>({input_tokens:0,output_tokens:0,cache_read_tokens:0,cache_write_tokens:0,cost_usd:0}),"newBucket"),Su=u((z,fe,We,Be,et,Ut)=>{z.input_tokens+=fe,z.output_tokens+=We,z.cache_read_tokens+=Be,z.cache_write_tokens+=et,z.cost_usd+=Ut},"accumulateBucket"),ya={},wa={},aA=new Map(f.map(z=>[z.id,z.startedAt])),cA=new Map(f.map(z=>[z.id,z.tool??"unknown"])),Kh=new Set,Gh=f.length>0?await tt.execute(Gi`
1040
959
  SELECT
1041
960
  deduped.session_id AS "sessionId",
1042
- COALESCE(deduped.model, ${vd}) AS "model",
961
+ COALESCE(deduped.model, ${Iu}) AS "model",
1043
962
  COALESCE(SUM(COALESCE((deduped.token_usage->>'input_tokens')::bigint, (deduped.token_usage->>'input')::bigint)), 0)::bigint AS "inputTokens",
1044
963
  COALESCE(SUM(COALESCE((deduped.token_usage->>'output_tokens')::bigint, (deduped.token_usage->>'output')::bigint)), 0)::bigint AS "outputTokens",
1045
964
  COALESCE(SUM(COALESCE((deduped.token_usage->>'cache_read_input_tokens')::bigint, (deduped.token_usage->>'cacheRead')::bigint)), 0)::bigint AS "cacheReadTokens",
@@ -1050,29 +969,32 @@ ${r}`).digest("hex")}d(Z0,"recommendationEntryHash");var tM=new Set(["42883","42
1050
969
  SELECT DISTINCT ON (se.session_id, COALESCE(se.metadata->>'requestId', se.id::text))
1051
970
  se.session_id, se.model, se.token_usage
1052
971
  FROM session_events se
1053
- WHERE se.session_id IN (${Yi.join(f.map(V=>Yi`${V.id}`),Yi`, `)})
972
+ WHERE se.session_id IN (${Gi.join(f.map(z=>Gi`${z.id}`),Gi`, `)})
1054
973
  AND se.token_usage IS NOT NULL
1055
974
  ORDER BY se.session_id, COALESCE(se.metadata->>'requestId', se.id::text), se.sequence
1056
975
  ) deduped
1057
976
  GROUP BY deduped.session_id, deduped.model
1058
- `):[];for(let V of Qh)Xh.add(V.sessionId);for(let V of f){let ge=V.metadata?.local_session_meta,ze=V.analysis,Fe=V.tokenUsage;if(V.tool&&(S[V.tool]=(S[V.tool]||0)+1),V.projectPath){let et=V.projectPath.split("/").pop()??V.projectPath;E[et]=(E[et]||0)+1}if(Fe&&!Xh.has(V.id)){let et=Fe.input_tokens??0,Bt=Fe.output_tokens??0,gn=Fe.cache_read_input_tokens??0,en=Fe.cache_creation_5m??0,Bn=Fe.cache_creation_1h??0,it=Fe.cache_creation_input_tokens??0,It=en+Bn||it;N+=et,me+=Bt,M+=gn,ue+=It;let yt=await b(Fe,vd,V.startedAt);lt+=yt.inputUsd,Be+=yt.outputUsd,re+=yt.cacheReadUsd,he+=yt.cacheWriteUsd;let an=yt.inputUsd+yt.outputUsd+yt.cacheReadUsd+yt.cacheWriteUsd,Ko=V.tool??"unknown",n_=wa[vd]??Id();bd(n_,et,Bt,gn,It,an),wa[vd]=n_;let r_=va[Ko]??Id();bd(r_,et,Bt,gn,It,an),va[Ko]=r_}if(ge){jr++;let et=ge.user_message_count??0;ee+=et,Re+=(ge.duration_minutes??0)/60,C+=ge.git_commits??0,oe+=ge.git_pushes??0,ve+=ge.lines_added??0,Ce+=ge.lines_removed??0,Te+=ge.files_modified??0,Ye+=ge.tool_errors??0;let Bt=ge.tool_counts;if(Bt)for(let[yt,an]of Object.entries(Bt))I[yt]=(I[yt]||0)+an;let gn=ge.languages;if(gn)for(let[yt,an]of Object.entries(gn))A[yt]=(A[yt]||0)+an;let en=ge.message_hours;en&&B.push(...en);let Bn=ge.tool_error_categories;if(Bn)for(let[yt,an]of Object.entries(Bn))H[yt]=(H[yt]||0)+an;let it=ge.user_response_times;it&&te.push(...it),Ht+=ge.user_interruptions??0,ge.uses_task_agent&&Zr++,ge.uses_mcp&&Sp++;let It=ge.user_message_timestamps;It&&It.length>0&&_e.push({id:V.id,start:V.startedAt.toISOString(),timestamps:It})}if(ze)if(V.analyzedAt){Gh++;let et=new Date(V.analyzedAt).getTime();(_a===null||et<_a)&&(_a=et),(ya===null||et>ya)&&(ya=et),et<yE&&Yh++}else Kh++;if(ze){Jo++;let et=ze.goal_categories;if(et)for(let[it,It]of Object.entries(et))It>0&&(R[it]=(R[it]||0)+It);let Bt=ze.outcome;Bt&&(D[Bt]=(D[Bt]||0)+1);let gn=ze.user_satisfaction;if(gn)for(let[it,It]of Object.entries(gn))It>0&&(j[it]=(j[it]||0)+It);let en=ze.session_type;en&&(P[en]=(P[en]||0)+1);let Bn=ze.friction??ze.friction_counts;if(Bn)for(let[it,It]of Object.entries(Bn))It>0&&($[it]=($[it]||0)+It);Ap.length<50&&Ap.push({id:V.id,externalId:V.externalSessionId,date:V.startedAt.toISOString().split("T")[0]??"",summary:ze.brief_summary??"",goal:ze.underlying_goal,outcome:Bt})}}let Sd=f.map(V=>V.startedAt.toISOString()).sort(),Ep=new Set(Sd.map(V=>V.split("T")[0]));for(let V of Qh){let ge=Number(V.inputTokens)||0,ze=Number(V.outputTokens)||0,Fe=Number(V.cacheReadTokens)||0,et=Number(V.cacheWrite5m)||0,Bt=Number(V.cacheWrite1h)||0,gn=Number(V.cacheWriteLegacy)||0,en=et+Bt||gn,Bn=wE.get(V.sessionId)??new Date,it=await b({input_tokens:ge,output_tokens:ze,cache_read_input_tokens:Fe,cache_creation_input_tokens:en},V.model,Bn);lt+=it.inputUsd,Be+=it.outputUsd,re+=it.cacheReadUsd,he+=it.cacheWriteUsd,N+=ge,me+=ze,M+=Fe,ue+=en;let It=it.inputUsd+it.outputUsd+it.cacheReadUsd+it.cacheWriteUsd,yt=wa[V.model]??Id();bd(yt,ge,ze,Fe,en,It),wa[V.model]=yt;let an=vE.get(V.sessionId)??"unknown",Ko=va[an]??Id();bd(Ko,ge,ze,Fe,en,It),va[an]=Ko}let Go=d(V=>Math.round(V*100)/100,"round2"),IE=lt+Be+re+he,bE=Go(IE),SE={inputUsd:Go(lt),outputUsd:Go(Be),cacheReadUsd:Go(re),cacheWriteUsd:Go(he)},xp={};for(let[V,ge]of Object.entries(wa))xp[V]={input_tokens:ge.input_tokens,output_tokens:ge.output_tokens,cache_read_tokens:ge.cache_read_tokens,cache_write_tokens:ge.cache_write_tokens,cost_usd:Go(ge.cost_usd)};let Tp={};for(let[V,ge]of Object.entries(va))Tp[V]={input_tokens:ge.input_tokens,output_tokens:ge.output_tokens,cache_read_tokens:ge.cache_read_tokens,cache_write_tokens:ge.cache_write_tokens,cost_usd:Go(ge.cost_usd)};let eo={"2-10s":0,"10-30s":0,"30s-1m":0,"1-2m":0,"2-5m":0,"5-15m":0,">15m":0};for(let V of te)V<10?eo["2-10s"]++:V<30?eo["10-30s"]++:V<60?eo["30s-1m"]++:V<120?eo["1-2m"]++:V<300?eo["2-5m"]++:V<900?eo["5-15m"]++:eo[">15m"]++;let Ls=[...te].sort((V,ge)=>V-ge),AE=Ls.length>0?Ls[Math.floor(Ls.length/2)]:0,EE=Ls.length>0?Ls.reduce((V,ge)=>V+ge,0)/Ls.length:0,Zh=0,e_=0;if(_e.length>1){let V=_e.flatMap(ze=>ze.timestamps.map(Fe=>({sessionId:ze.id,time:new Date(Fe).getTime()}))).sort((ze,Fe)=>ze.time-Fe.time),ge=new Set;for(let ze=0;ze<V.length-1;ze++){let Fe=V[ze],et=V[ze+1];Fe.sessionId!==et.sessionId&&et.time-Fe.time<1800*1e3&&(ge.add(Fe.sessionId),ge.add(et.sessionId),Zh++)}e_=ge.size}let $s={computed:!0,total_sessions:f.length,window:{since:o??null,until:s??null},truncated:f.length>=h,sessions_with_meta:jr,sessions_with_analysis:Jo,tools_used:S,date_range:{start:Sd[0]?.split("T")[0]??"",end:Sd[Sd.length-1]?.split("T")[0]??""},total_messages:ee,total_duration_hours:Math.round(Re*10)/10,total_input_tokens:N,total_output_tokens:me,total_cache_read_tokens:M,total_cache_write_tokens:ue,estimated_cost_usd:bE,estimated_cost_breakdown:SE,estimated_cost_by_model:Object.keys(xp).length>0?xp:void 0,estimated_cost_by_tool:Object.keys(Tp).length>0?Tp:void 0,tool_counts:I,languages:A,git_commits:C,git_pushes:oe,projects:E,goal_categories:R,outcomes:D,satisfaction:j,session_types:P,friction:$,tool_error_categories:H,session_summaries:Ap,total_tool_errors:Ye,total_interruptions:Ht,total_lines_added:ve,total_lines_removed:Ce,total_files_modified:Te,days_active:Ep.size,messages_per_day:Ep.size>0?Math.round(ee/Ep.size*10)/10:0,message_hours:B,sessions_using_task_agent:Zr,sessions_using_mcp:Sp,response_time:{median_seconds:Math.round(AE*10)/10,avg_seconds:Math.round(EE*10)/10,histogram:eo,total_samples:te.length},parallel_sessions:{events:Zh,sessions_involved:e_},analysis_freshness:{with_timestamp:Gh,pre_instrumentation:Kh,stale_30d:Yh,oldest_analyzed_at:_a?new Date(_a).toISOString():null,newest_analyzed_at:ya?new Date(ya).toISOString():null}};$s.autoAddAvailable=!!(n&&fM.existsSync(gM.join(n,"CLAUDE.md")));let Ad=[Po(W.userId,t),Po(W.status,"completed")];r?Ad.push(Po(W.projectId,r)):n?Ad.push(sS(W.projectPath,`%${ot(n)}%`)):Ad.push(Yi`${W.projectPath} IS NULL`);let[t_]=await nt.select({id:W.id,result:W.result}).from(W).where(Vg(...Ad)).orderBy(Jg(W.completedAt)).limit(1),xE=t_?.result,Rp=Zm(xE?.recommendations);if(Rp&&Object.keys(Rp).length>0)$s.recommendations=Rp,$s._recsJobId=t_?.id??null;else if(f.length>=3){let V=wM({totalSessions:f.length,sessionsWithAnalysis:Jo,toolCounts:I,toolErrorCategories:H,friction:$,outcomes:D,sessionsUsingMcp:Sp,sessionsUsingTaskAgent:Zr,totalToolErrors:Ye,totalMessages:ee,totalDurationHours:Re});V&&($s.recommendations=V)}return Hl.size>1e3&&Hl.clear(),Hl.set(a,{at:Date.now(),data:$s}),$s}),{_recsJobId:m,...y}=p;if(y.recommendations)try{y.recommendations=await eS({userId:t,projectPath:n,jobId:m??null,recs:y.recommendations})}catch{}return e.json(y)});Kc.get("/insights/recommendations/history",async e=>{let t=e.get("userId"),n=e.req.query("projectPath")??"",r=await u.select({category:Ee.category,label:Ee.label,timesGenerated:Ee.timesGenerated,dismissedAt:Ee.dismissedAt,lastSeenAt:Ee.lastSeenAt}).from(Ee).where(Vg(Po(Ee.userId,t),Po(Ee.projectPath,n))).orderBy(Yi`${Ee.dismissedAt} IS NULL`,Jg(Ee.timesGenerated)).limit(40);return e.json({dismissed:r.filter(o=>o.dismissedAt!==null&&o.label!=="").map(o=>({category:o.category,label:o.label,dismissedAt:o.dismissedAt})),repeated:r.filter(o=>o.dismissedAt===null&&o.timesGenerated>=2&&o.label!=="").map(o=>({category:o.category,label:o.label,timesGenerated:o.timesGenerated}))})});Kc.post("/insights/recommendations/dismiss",async e=>{let t=e.get("userId"),n=await e.req.json().catch(()=>({})),r=typeof n.contentHash=="string"?n.contentHash:"";if(!/^[0-9a-f]{64}$/.test(r))return e.json({error:"contentHash must be the 64-hex entry id from the compute response"},400);let o=typeof n.projectPath=="string"?n.projectPath:void 0;return await tS({userId:t,projectPath:o,contentHash:r}),e.json({ok:!0})});O();import{Hono as bM}from"hono";import{and as En,count as SM,eq as Pe,ilike as AM,inArray as EM,sql as pn}from"drizzle-orm";ls();var Ts=new bM,xs=d(e=>us(e?.outcome??null),"scoreOf");Ts.get("/insights/linked-instructions",async e=>{let t=e.get("userId"),n=e.req.query("projectPath"),r=Number(e.req.query("limit")??20),o=[Pe(_.userId,t)];n&&o.push(AM(_.projectPath,`%${ot(n)}%`));let s=await u.select({id:g.id,name:g.name,contentHash:g.contentHash,source:pn`${g.frontmatter}->>'source'`,linkedSessions:pn`COUNT(DISTINCT ${se.sessionId})`}).from(se).innerJoin(_,Pe(_.id,se.sessionId)).innerJoin(g,Pe(g.id,se.instructionId)).where(En(...o)).groupBy(g.id,g.name,g.contentHash,pn`${g.frontmatter}->>'source'`).orderBy(pn`COUNT(DISTINCT ${se.sessionId}) DESC`).limit(r);return e.json(s.map(i=>({id:i.id,name:i.name,contentHash:i.contentHash,source:i.source,linkedSessions:Number(i.linkedSessions)})))});Ts.get("/insights/instruction-impact",async e=>{let t=e.get("userId"),n=e.req.query("instructionId");if(!n)return e.json({error:"instructionId query param required"},400);let r=await u.select({id:_.id,projectId:_.projectId,model:_.model,tool:_.tool,tokenUsage:_.tokenUsage,analysis:_.analysis,metadata:_.metadata,eventCount:_.eventCount,startedAt:_.startedAt}).from(_).innerJoin(Z,Pe(Z.sessionId,_.id)).where(En(Pe(_.userId,t),Pe(Z.treatmentType,"instruction"),Pe(Z.treatmentId,n))),o=r.map(M=>M.id),s=await u.select({id:_.id,projectId:_.projectId,model:_.model,tool:_.tool,tokenUsage:_.tokenUsage,analysis:_.analysis,metadata:_.metadata,eventCount:_.eventCount,startedAt:_.startedAt}).from(_).where(En(Pe(_.userId,t),pn`${_.analysis} IS NOT NULL`)),i=await u.selectDistinct({sessionId:Z.sessionId}).from(Z).where(En(Pe(Z.userId,t),Pe(Z.treatmentType,"instruction"))),a=new Set(i.map(M=>M.sessionId)),c=new Set(o),l=s.filter(M=>!c.has(M.id)&&a.has(M.id));function p(M){let ue=0,lt=0,Be=0,re=0,he=[],C={},oe={achieved:1,fully_achieved:1,mostly_achieved:.75,partially_achieved:.5,unclear_from_transcript:.25,not_achieved:0,abandoned:0};for(let ve of M){let Ce=ve.analysis,Te=ve.metadata?.local_session_meta;if(Ce?.outcome){let Ht=oe[Ce.outcome];Ht!==void 0&&he.push(Ht)}Te&&(re++,ue+=Te.tool_errors??0,lt+=Te.duration_minutes??0,Be+=(Te.lines_added??0)+(Te.lines_removed??0));let Ye=Ce?.goal_categories??{};for(let[Ht,jr]of Object.entries(Ye))jr>0&&(C[Ht]=(C[Ht]||0)+jr)}return{sessionCount:M.length,enrichedCount:re,outcomeScores:he,avgOutcomeScore:he.length>0?Math.round(he.reduce((ve,Ce)=>ve+Ce,0)/he.length*100)/100:null,avgToolErrors:re>0?Math.round(ue/re*10)/10:null,avgDurationMinutes:re>0?Math.round(lt/re*10)/10:null,avgLinesChanged:re>0?Math.round(Be/re):null,topGoalCategories:C}}d(p,"computeCohort");let m=p(r),y=p(l),v=d(M=>{if(!M)return"(no-date)";let ue=typeof M=="string"?new Date(M):M;return Number.isNaN(ue.getTime())?"(no-date)":`${ue.getUTCFullYear()}-${String(ue.getUTCMonth()+1).padStart(2,"0")}`},"monthKey"),h=d(M=>{if(!M)return 0;let ue=typeof M=="string"?new Date(M):M;return Number.isNaN(ue.getTime())?0:ue.getTime()},"timeOf"),f=new Map,w=d((M,ue,lt,Be)=>{let re=`${M??"(no-project)"}|${v(ue)}`,he=f.get(re);he||(he={key:re,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},f.set(re,he)),(Be?he.withScores:he.withoutScores).push(lt),(Be?he.withTimes:he.withoutTimes).push(h(ue))},"addToStratum");for(let M of r){let ue=xs(M.analysis);ue!=null&&w(M.projectId,M.startedAt,ue,!0)}for(let M of l){let ue=xs(M.analysis);ue!=null&&w(M.projectId,M.startedAt,ue,!1)}let b=d(M=>{let ue=new Map,lt=new Set,Be=d((re,he,C,oe,ve)=>{let Ce=ue.get(re);Ce||(Ce=new Map,ue.set(re,Ce));let Te=`${he??"(no-project)"}|${v(C)}`,Ye=Ce.get(Te);Ye||(Ye={key:Te,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},Ce.set(Te,Ye)),(ve?Ye.withScores:Ye.withoutScores).push(oe),(ve?Ye.withTimes:Ye.withoutTimes).push(h(C))},"add");for(let re of r){let he=xs(re.analysis),C=M(re);he==null||!C||(lt.add(C),Be(C,re.projectId,re.startedAt,he,!0))}for(let re of l){let he=xs(re.analysis),C=M(re);he==null||!C||!lt.has(C)||Be(C,re.projectId,re.startedAt,he,!1)}return[...lt].map(re=>({segment:re,strata:[...ue.get(re)?.values()??[]]}))},"buildAxisSegments"),I=d(M=>[...M].sort((ue,lt)=>Number(lt.verdict.sufficient)-Number(ue.verdict.sufficient)||lt.verdict.nWith-ue.verdict.nWith),"sortSegs"),S=bf([...f.values()],b(M=>gs(M.model))),A=S.overall,E=I(S.segments).map(M=>({model:M.segment,verdict:M.verdict})),R=I($u(b(M=>M.tool??null))).map(M=>({harness:M.segment,verdict:M.verdict})),{outcomeScores:D,...j}=m,{outcomeScores:P,...$}=y,[H]=await u.select({name:g.name}).from(g).where(Pe(g.id,n)).limit(1),[B]=await u.select({n:SM(),lastAssignedAt:pn`max(${jt.assignedAt})`}).from(jt).where(En(Pe(jt.userId,t),Pe(jt.treatmentType,"instruction"),Pe(jt.treatmentId,n),Pe(jt.method,"auto_added"))),te=B&&Number(B.n)>0?{count:Number(B.n),lastAssignedAt:B.lastAssignedAt}:null,[_e]=await u.select({content:g.content,name:g.name}).from(g).where(Pe(g.id,n)),ee=Ur(_e?.content,_e?.name),Re=ee?(await u.select({projectPath:Y.projectPath,decision:Y.decision,delta:Y.delta,ciLower:Y.ciLower,ciUpper:Y.ciUpper,nTreated:Y.nTreated,nControl:Y.nControl,segment:Y.segment,decidedAt:Y.decidedAt}).from(Y).where(En(Pe(Y.userId,t),Pe(Y.instructionId,n),Pe(Y.contentHash,ee)))).map(M=>({projectPath:M.projectPath,decision:M.decision,delta:Number(M.delta),ciLower:Number(M.ciLower),ciUpper:Number(M.ciUpper),nTreated:M.nTreated,nControl:M.nControl,segment:M.segment,decidedAt:M.decidedAt})):[],N=await u.select({id:q.id,projectPath:q.projectPath,source:q.source,status:q.status}).from(q).where(En(Pe(q.userId,t),Pe(q.instructionId,n),Pe(q.status,"running"))),me=Re.length>0||N.length>0?{verdicts:Re,experiments:N}:null;return e.json({instructionId:n,instructionName:H?.name??"Unknown",verdict:A,segments:E,harnessSegments:R,autoAdded:te,randomised:me,with:j,without:$,comparison:{outcomeScoreDelta:m.avgOutcomeScore!=null&&y.avgOutcomeScore!=null?Math.round((m.avgOutcomeScore-y.avgOutcomeScore)*100)/100:null,toolErrorsDelta:m.avgToolErrors!=null&&y.avgToolErrors!=null?Math.round((m.avgToolErrors-y.avgToolErrors)*10)/10:null,durationDelta:m.avgDurationMinutes!=null&&y.avgDurationMinutes!=null?Math.round((m.avgDurationMinutes-y.avgDurationMinutes)*10)/10:null}})});Ts.get("/insights/instruction-version-impact",async e=>{let t=e.get("userId"),n=e.req.query("instructionId");if(!n)return e.json({error:"instructionId query param required"},400);let r=await u.select({versionOrdinal:sr.versionOrdinal,contentHash:sr.contentHash,firstSeenAt:sr.firstSeenAt,contentLength:pn`COALESCE(LENGTH(${sr.content}), 0)::int`}).from(sr).where(Pe(sr.instructionId,n)).orderBy(sr.versionOrdinal),o=await u.select({id:_.id,projectId:_.projectId,analysis:_.analysis,startedAt:_.startedAt,version:Z.treatmentVersion}).from(_).innerJoin(Z,Pe(Z.sessionId,_.id)).where(En(Pe(_.userId,t),Pe(Z.treatmentType,"instruction"),Pe(Z.treatmentId,n),pn`${Z.treatmentVersion} > 0`)),s=new Map;for(let I of o){let S=s.get(I.version)??[];S.push(I),s.set(I.version,S)}let i=r.map(I=>({version:I.versionOrdinal,contentHash:I.contentHash,firstSeenAt:I.firstSeenAt,sessions:s.get(I.versionOrdinal)?.length??0,replayable:Number(I.contentLength)>0})),a=i.filter(I=>I.sessions>0).map(I=>I.version).sort((I,S)=>I-S),c=Number(e.req.query("version")),l=Number(e.req.query("baselineVersion")),p=Number.isFinite(c)&&c>0?c:a.at(-1),m=Number.isFinite(l)&&l>0?l:a.filter(I=>I!==p).at(-1);if(p==null||m==null)return e.json({instructionId:n,versions:i,version:p??null,baselineVersion:m??null,verdict:null,insufficientReason:"only one version of this instruction has attributed sessions; there is no prior version to compare against"});let y=d(I=>{if(!I)return"(no-date)";let S=typeof I=="string"?new Date(I):I;return Number.isNaN(S.getTime())?"(no-date)":`${S.getUTCFullYear()}-${String(S.getUTCMonth()+1).padStart(2,"0")}`},"monthKey"),v=d(I=>{if(!I)return 0;let S=typeof I=="string"?new Date(I):I;return Number.isNaN(S.getTime())?0:S.getTime()},"timeOf"),h=new Map,f=d((I,S)=>{let A=xs(I.analysis);if(A==null)return;let E=`${I.projectId??"(no-project)"}|${y(I.startedAt)}`,R=h.get(E);R||(R={key:E,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},h.set(E,R)),(S?R.withScores:R.withoutScores).push(A),(S?R.withTimes:R.withoutTimes).push(v(I.startedAt))},"add");for(let I of s.get(p)??[])f(I,!0);for(let I of s.get(m)??[])f(I,!1);let w=In([...h.values()],{baseline:"prior-version"}),[b]=await u.select({name:g.name}).from(g).where(Pe(g.id,n)).limit(1);return e.json({instructionId:n,instructionName:b?.name??"Unknown",version:p,baselineVersion:m,versions:i,verdict:w,replayableVersions:i.filter(I=>I.replayable).length})});Ts.get("/insights/memory-impact",async e=>{let t=e.get("userId"),n=e.req.query("memoryId");if(!n)return e.json({error:"memoryId query param required"},400);let[r]=await u.select({id:F.id,title:F.title,kind:F.kind,version:F.version,status:F.status}).from(F).where(En(Pe(F.id,n),Pe(F.userId,t))).limit(1);if(!r)return e.json({error:"memory not found"},404);let o=await u.select({sessionId:Z.sessionId,treatmentVersion:Z.treatmentVersion}).from(Z).where(En(Pe(Z.userId,t),Pe(Z.treatmentType,"memory"),Pe(Z.treatmentId,n))),s=new Map,i=new Set;for(let f of o){let w=s.get(f.treatmentVersion);w||(w=new Set,s.set(f.treatmentVersion,w)),w.add(f.sessionId),i.add(f.sessionId)}let a=await u.select({id:_.id,projectId:_.projectId,outcome:pn`${_.analysis}->>'outcome'`,startedAt:_.startedAt,inputTokens:pn`coalesce((${_.tokenUsage}->>'input_tokens')::numeric, 0)`,outputTokens:pn`coalesce((${_.tokenUsage}->>'output_tokens')::numeric, 0)`}).from(_).where(En(Pe(_.userId,t),pn`${_.analysis} is not null`)).orderBy(_.id),c=d((f,w)=>w>0?Math.round(f/w*100)/100:null,"avg"),l=d(()=>({n:0,scoreSum:0,scoreN:0,tokenSum:0}),"cohort"),p=d(f=>f.n>0?Math.round(f.tokenSum/f.n):null,"avgTokens"),m=d(f=>{let w=s.get(f)??new Set,b=new Map,I=l(),S=l();for(let j of a){let P=w.has(j.id);if(!P&&i.has(j.id))continue;let $=P?I:S;$.n++,$.tokenSum+=Number(j.inputTokens)+Number(j.outputTokens);let H=xs({outcome:j.outcome});if(H!=null){$.scoreSum+=H,$.scoreN++;let B=j.projectId??"(no-project)",te=b.get(B);te||(te={key:B,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},b.set(B,te)),(P?te.withScores:te.withoutScores).push(H),(P?te.withTimes:te.withoutTimes).push(j.startedAt?.getTime()??0)}}let A=In([...b.values()]),E={sessionCount:I.n,avgOutcomeScore:c(I.scoreSum,I.scoreN),avgTotalTokens:p(I)},R={sessionCount:S.n,avgOutcomeScore:c(S.scoreSum,S.scoreN),avgTotalTokens:p(S)},D={outcomeScoreDelta:E.avgOutcomeScore!=null&&R.avgOutcomeScore!=null?Math.round((E.avgOutcomeScore-R.avgOutcomeScore)*100)/100:null,totalTokensDelta:E.avgTotalTokens!=null&&R.avgTotalTokens!=null?E.avgTotalTokens-R.avgTotalTokens:null};return{verdict:A,with:E,without:R,comparison:D}},"computeVersion"),v=[...new Set([r.version,...s.keys()])].sort((f,w)=>w-f).map(f=>({version:f,isCurrent:f===r.version,...m(f)})),h=v.find(f=>f.isCurrent);return e.json({memoryId:n,memoryTitle:r.title,memoryKind:r.kind,memoryVersion:r.version,verdict:h.verdict,with:h.with,without:h.without,comparison:h.comparison,versions:v.map(({version:f,isCurrent:w,verdict:b,with:I,without:S})=>({version:f,isCurrent:w,verdict:b,with:I,without:S})),cost:{estimated:!0}})});var xM=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;Ts.get("/insights/suggestion-impact",async e=>{let t=e.get("userId"),n=e.req.query("instructionIds")??e.req.query("instructionId")??"",r=[...new Set(n.split(",").map(l=>l.trim()).filter(l=>xM.test(l)))].slice(0,200);if(r.length===0)return e.json({error:"instructionIds query param (comma-separated uuids) required"},400);let o=await u.select({sessionId:Z.sessionId,treatmentId:Z.treatmentId}).from(Z).where(En(Pe(Z.userId,t),Pe(Z.treatmentType,"suggestion"),EM(Z.treatmentId,r))),s=new Map;for(let l of o){let p=s.get(l.treatmentId);p||(p=new Set,s.set(l.treatmentId,p)),p.add(l.sessionId)}let a=(await u.select({id:_.id,projectId:_.projectId,outcome:pn`${_.analysis}->>'outcome'`,startedAt:_.startedAt}).from(_).where(En(Pe(_.userId,t),pn`${_.analysis} is not null`)).orderBy(_.id)).map(l=>({id:l.id,key:l.projectId??"(no-project)",score:xs({outcome:l.outcome}),time:l.startedAt?.getTime()??0})).filter(l=>l.score!=null),c={};for(let l of r){let p=s.get(l);if(!p||p.size===0){c[l]=In([]);continue}let m=new Map;for(let y of a){let v=m.get(y.key);v||(v={key:y.key,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},m.set(y.key,v));let h=p.has(y.id);(h?v.withScores:v.withoutScores).push(y.score),(h?v.withTimes:v.withoutTimes).push(y.time)}c[l]=In([...m.values()],{iterations:2e3})}return e.json({impacts:c})});O();import{Hono as TM}from"hono";import{and as Rs,count as Gg,eq as xn,inArray as iS,sql as Wr}from"drizzle-orm";var Yg=new TM,Kg=/force[- ]?push|rm\s+-rf|git\s+reset\s+--hard|drop\s+table|truncate\b|--no-verify|chmod\s+777|\bsudo\b|secret|credential|password|api[- ]?key|never\s+(delete|drop|force|push|commit|run|deploy)|do\s+not\s+(delete|drop|force|push|commit|run|deploy)/i;Yg.get("/insights/groom-candidates",async e=>{let t=e.get("userId"),[n]=await u.select({n:Gg()}).from(_).where(Rs(xn(_.userId,t),Wr`${_.startedAt} > now() - interval '7 days'`));if(Number(n?.n??0)===0)return e.json({captureHealthy:!1,reason:'No sessions captured in the last 7 days \u2014 cannot tell "unused" from "uncaptured". Grooming paused (never trust a dark pipeline).',candidates:[],harmful:[],safetyGuarded:0,harmfulSafetyGuarded:0,bloated:[],trimSafetyFlagged:0});let[r,o,s,i]=await Promise.all([u.select({id:g.id,name:g.name,type:g.type,content:g.content,lastExposedAt:Wr`max(${Z.exposedAt})`,totalExposures:Gg(Z.id)}).from(g).leftJoin(Z,Rs(xn(Z.treatmentId,g.id),xn(Z.userId,t))).where(Rs(xn(g.createdBy,t),xn(g.archived,!1),Wr`${g.createdAt} < now() - interval '30 days'`)).groupBy(g.id).having(Wr`max(${Z.exposedAt}) is null or max(${Z.exposedAt}) < now() - interval '30 days'`),u.select({id:g.id,name:g.name,type:g.type}).from(g).where(Rs(xn(g.createdBy,t),xn(g.archived,!1))),u.select({treatmentId:Z.treatmentId,sessionId:Z.sessionId}).from(Z).where(Rs(xn(Z.userId,t),xn(Z.treatmentType,"instruction"),Wr`${Z.sessionId} is not null`)),u.select({id:_.id,projectId:_.projectId,outcome:Wr`${_.analysis}->>'outcome'`,startedAt:_.startedAt}).from(_).where(Rs(xn(_.userId,t),Wr`${_.analysis} is not null`))]),a=await u.select({treatmentId:Z.treatmentId,projectId:_.projectId,n:Gg()}).from(Z).innerJoin(_,xn(_.id,Z.sessionId)).where(Rs(xn(Z.userId,t),xn(Z.treatmentType,"instruction"),Wr`${_.projectId} is not null`)).groupBy(Z.treatmentId,_.projectId),c=new Map;for(let j of a){if(!j.projectId)continue;let P=Number(j.n),$=c.get(j.treatmentId);(!$||P>$.n||P===$.n&&j.projectId<$.projectId)&&c.set(j.treatmentId,{projectId:j.projectId,n:P})}let l=d(j=>c.get(j)?.projectId??null,"topProjectId"),p=r.filter(j=>!(j.content&&Kg.test(j.content))),m=r.length-p.length,y=p.map(j=>({id:j.id,name:j.name,type:j.type,reason:Number(j.totalExposures)===0?"never used":"not used in 30+ days",lastExposedAt:j.lastExposedAt,totalExposures:Number(j.totalExposures),topProjectId:l(j.id)})).sort((j,P)=>j.totalExposures-P.totalExposures).slice(0,50),v=new Map;for(let j of i){let P=j.outcome!=null?pi[j.outcome]:void 0;P!==void 0&&v.set(j.id,{projectId:j.projectId,score:P,time:j.startedAt?.getTime()??0})}let h=new Map;for(let j of s){if(!j.sessionId)continue;let P=h.get(j.treatmentId);P||(P=new Set,h.set(j.treatmentId,P)),P.add(j.sessionId)}let f=[],w=[];for(let j of o){let P=h.get(j.id);if(!P)continue;let $=0;for(let _e of P)v.has(_e)&&$++;if($<10)continue;let H=new Map;for(let[_e,{projectId:ee,score:Re,time:N}]of v){let me=ee??"(no-project)",M=H.get(me);M||(M={key:me,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},H.set(me,M));let ue=P.has(_e);(ue?M.withScores:M.withoutScores).push(Re),(ue?M.withTimes:M.withoutTimes).push(N)}let B=In([...H.values()]),te=ds(B);te==="harmful"?f.push({id:j.id,name:j.name,type:j.type,verdict:B,exposures:B.nWith,topProjectId:l(j.id)}):te==="neutral"&&w.push({id:j.id,name:j.name,type:j.type,verdict:B,exposures:B.nWith,topProjectId:l(j.id)})}let b=0,I=f;if(f.length>0){let j=await u.select({id:g.id,content:g.content}).from(g).where(iS(g.id,f.map($=>$.id))),P=new Map(j.map($=>[$.id,$.content]));I=f.filter($=>{let H=P.get($.id);return H&&Kg.test(H)?(b++,!1):!0})}I.sort((j,P)=>j.verdict.delta-P.verdict.delta);let S=1500,A=[],E=0;if(w.length>0){let j=await u.select({id:g.id,estimatedTokens:Wr`(length(${g.content}) / 4)::int`,content:g.content}).from(g).where(iS(g.id,w.map($=>$.id))),P=new Map(j.map($=>[$.id,$]));for(let $ of w){let H=P.get($.id),B=Number(H?.estimatedTokens??0);if(B<S)continue;let te=!!(H?.content&&Kg.test(H.content));te&&E++,A.push({...$,estimatedTokens:B,containsSafetyLanguage:te})}A.sort(($,H)=>H.estimatedTokens-$.estimatedTokens),A=A.slice(0,20)}let R=new Set(I.map(j=>j.id)),D=y.filter(j=>!R.has(j.id));return e.json({captureHealthy:!0,candidates:D,safetyGuarded:m,harmful:I,harmfulSafetyGuarded:b,bloated:A,trimSafetyFlagged:E})});O();import{Hono as kM}from"hono";import{z as Xi}from"zod";import{and as er,desc as cS,eq as gt,getTableColumns as jM,gte as Xg,ilike as Bl,isNull as NM,ne as PM,or as CM,sql as vr}from"drizzle-orm";O();import{desc as RM,eq as aS}from"drizzle-orm";async function ks(e){if(!e)return null;try{let[t]=await u.select({projectId:le.projectId}).from(le).where(aS(le.path,e)).orderBy(RM(le.lastSeen)).limit(1);if(t)return t.projectId;let[n]=await u.select({id:U.id}).from(U).where(aS(U.gitRemoteUrl,e)).limit(1);return n?.id??null}catch{return null}}d(ks,"resolveProjectIdForPath");var Co=new kM;function OM(e,t){let n=t?Bl(W.projectPath,`%${ot(t)}%`):void 0;return e&&n?CM(gt(W.projectId,e),er(NM(W.projectId),n)):e?gt(W.projectId,e):n}d(OM,"insightsJobProjectScope");Co.post("/insights-jobs",async e=>{let t=e.get("userId"),n=await e.req.json().catch(()=>({})),r=n.dedup,o=n.projectPath??null,s=await ks(o);if(r==="daily"){let p=new Date;p.setHours(0,0,0,0);let m=o,y=[gt(W.userId,t),Xg(W.createdAt,p)];s?y.push(gt(W.projectId,s)):m?y.push(Bl(W.projectPath,`%${ot(m)}%`)):y.push(vr`${W.projectPath} IS NULL`);let[v]=await u.select({id:W.id}).from(W).where(er(...y)).limit(1);if(v)return e.json({skipped:!0,reason:"already_generated_today",existingJobId:v.id},200);let h=[gt(W.userId,t),gt(W.status,"completed")];s?h.push(gt(W.projectId,s)):m?h.push(Bl(W.projectPath,`%${ot(m)}%`)):h.push(vr`${W.projectPath} IS NULL`);let[f]=await u.select({completedAt:W.completedAt}).from(W).where(er(...h)).orderBy(cS(W.completedAt)).limit(1),w=f?.completedAt??new Date(0),b=[gt(_.userId,t),Xg(_.startedAt,w)];s?b.push(gt(_.projectId,s)):m&&b.push(Bl(_.projectPath,`%${ot(m)}%`));let[{count:I}]=await u.select({count:vr`COUNT(*)`}).from(_).where(er(...b));if(Number(I)<5)return e.json({skipped:!0,reason:"insufficient_sessions",sessionsSinceLastRun:Number(I),threshold:5},200)}let i=o,{id:a,noLiveWorker:c}=await Rt({taskName:"process_insights",payload:{projectPath:i,projectId:s},userId:t,mirror:{userId:t,projectPath:i,projectId:s}}),[l]=await u.select().from(W).where(gt(W.id,a));return e.json({...l,noLiveWorker:c},201)});Co.get("/insights-jobs",async e=>{let t=e.get("userId"),n=Number(e.req.query("limit")??10),r=e.req.query("projectPath"),o=e.req.query("projectId")??await ks(r??null),s=[gt(W.userId,t)],i=OM(o,r??null);i&&s.push(i);let{result:a,...c}=jM(W),l=await u.select(c).from(W).where(er(...s)).orderBy(cS(W.createdAt)).limit(n);return e.json(l)});Co.get("/insights-jobs/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(W).where(er(gt(W.id,n),gt(W.userId,t)));return r?e.json(r):e.json({error:"Job not found"},404)});Co.patch("/insights-jobs/:id/progress",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),s=["running","paused"].includes(r.status)?r.status:"running",[i]=await u.update(W).set({status:s,progress:r.progress,updatedAt:new Date}).where(er(gt(W.id,n),gt(W.userId,t))).returning();return i?e.json(i):e.json({error:"Job not found"},404)});var DM=Xi.object({status:Xi.enum(["running","completed","failed"]).optional(),attempts:Xi.number().int().nonnegative().optional(),error:Xi.string().optional(),result:Xi.record(Xi.unknown()).optional()});Co.patch("/insights-jobs/:id/state",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=DM.parse(await e.req.json()),o={updatedAt:new Date};r.attempts!==void 0&&(o.attempts=r.attempts),r.status&&(o.status=r.status),r.error&&(o.error=r.error),r.result!==void 0&&(o.result=r.result),(r.status==="completed"||r.status==="failed")&&(o.completedAt=new Date);let[s]=await u.update(W).set(o).where(er(gt(W.id,n),gt(W.userId,t),PM(W.status,"cancelled"))).returning();if(!s){let[i]=await u.select().from(W).where(er(gt(W.id,n),gt(W.userId,t)));return i?e.json(i):e.json({error:"Job not found"},404)}return e.json(s)});var MM=14400*1e3;Co.post("/insights-jobs/regenerate-all",async e=>{let t=e.get("userId"),n=await e.req.json().catch(()=>({})),r=Number(n.minSessions??3),o=n.force===!0,s=new Date(Date.now()-MM),i=await u.select({projectId:_.projectId,sessionCount:vr`COUNT(*)`}).from(_).where(er(gt(_.userId,t),vr`${_.projectId} IS NOT NULL`)).groupBy(_.projectId).orderBy(vr`COUNT(*) DESC`),a=i.map(v=>v.projectId).filter(v=>!!v),c=new Map;if(a.length>0){let v=await u.execute(vr`
977
+ `):[];for(let z of Gh)Kh.add(z.sessionId);for(let z of f){let fe=z.metadata?.local_session_meta,We=z.analysis,Be=z.tokenUsage;if(z.tool&&(S[z.tool]=(S[z.tool]||0)+1),z.projectPath){let et=z.projectPath.split("/").pop()??z.projectPath;E[et]=(E[et]||0)+1}if(Be&&!Kh.has(z.id)){let et=Be.input_tokens??0,Ut=Be.output_tokens??0,gn=Be.cache_read_input_tokens??0,Zt=Be.cache_creation_5m??0,Wn=Be.cache_creation_1h??0,st=Be.cache_creation_input_tokens??0,It=Zt+Wn||st;j+=et,me+=Ut,L+=gn,ue+=It;let _t=await b(Be,Iu,z.startedAt);dt+=_t.inputUsd,He+=_t.outputUsd,re+=_t.cacheReadUsd,ge+=_t.cacheWriteUsd;let sn=_t.inputUsd+_t.outputUsd+_t.cacheReadUsd+_t.cacheWriteUsd,Ko=z.tool??"unknown",Zh=ya[Iu]??bu();Su(Zh,et,Ut,gn,It,sn),ya[Iu]=Zh;let e_=wa[Ko]??bu();Su(e_,et,Ut,gn,It,sn),wa[Ko]=e_}if(fe){Nr++;let et=fe.user_message_count??0;te+=et,Te+=(fe.duration_minutes??0)/60,O+=fe.git_commits??0,oe+=fe.git_pushes??0,we+=fe.lines_added??0,Pe+=fe.lines_removed??0,xe+=fe.files_modified??0,Ye+=fe.tool_errors??0;let Ut=fe.tool_counts;if(Ut)for(let[_t,sn]of Object.entries(Ut))v[_t]=(v[_t]||0)+sn;let gn=fe.languages;if(gn)for(let[_t,sn]of Object.entries(gn))A[_t]=(A[_t]||0)+sn;let Zt=fe.message_hours;Zt&&B.push(...Zt);let Wn=fe.tool_error_categories;if(Wn)for(let[_t,sn]of Object.entries(Wn))H[_t]=(H[_t]||0)+sn;let st=fe.user_response_times;st&&ee.push(...st),qt+=fe.user_interruptions??0,fe.uses_task_agent&&Zr++,fe.uses_mcp&&bm++;let It=fe.user_message_timestamps;It&&It.length>0&&he.push({id:z.id,start:z.startedAt.toISOString(),timestamps:It})}if(We)if(z.analyzedAt){zh++;let et=new Date(z.analyzedAt).getTime();(ha===null||et<ha)&&(ha=et),(_a===null||et>_a)&&(_a=et),et<iA&&Jh++}else Vh++;if(We){Vo++;let et=We.goal_categories;if(et)for(let[st,It]of Object.entries(et))It>0&&(R[st]=(R[st]||0)+It);let Ut=We.outcome;Ut&&(P[Ut]=(P[Ut]||0)+1);let gn=We.user_satisfaction;if(gn)for(let[st,It]of Object.entries(gn))It>0&&(N[st]=(N[st]||0)+It);let Zt=We.session_type;Zt&&(D[Zt]=(D[Zt]||0)+1);let Wn=We.friction??We.friction_counts;if(Wn)for(let[st,It]of Object.entries(Wn))It>0&&(q[st]=(q[st]||0)+It);Sm.length<50&&Sm.push({id:z.id,externalId:z.externalSessionId,date:z.startedAt.toISOString().split("T")[0]??"",summary:We.brief_summary??"",goal:We.underlying_goal,outcome:Ut})}}let Au=f.map(z=>z.startedAt.toISOString()).sort(),Am=new Set(Au.map(z=>z.split("T")[0]));for(let z of Gh){let fe=Number(z.inputTokens)||0,We=Number(z.outputTokens)||0,Be=Number(z.cacheReadTokens)||0,et=Number(z.cacheWrite5m)||0,Ut=Number(z.cacheWrite1h)||0,gn=Number(z.cacheWriteLegacy)||0,Zt=et+Ut||gn,Wn=aA.get(z.sessionId)??new Date,st=await b({input_tokens:fe,output_tokens:We,cache_read_input_tokens:Be,cache_creation_input_tokens:Zt},z.model,Wn);dt+=st.inputUsd,He+=st.outputUsd,re+=st.cacheReadUsd,ge+=st.cacheWriteUsd,j+=fe,me+=We,L+=Be,ue+=Zt;let It=st.inputUsd+st.outputUsd+st.cacheReadUsd+st.cacheWriteUsd,_t=ya[z.model]??bu();Su(_t,fe,We,Be,Zt,It),ya[z.model]=_t;let sn=cA.get(z.sessionId)??"unknown",Ko=wa[sn]??bu();Su(Ko,fe,We,Be,Zt,It),wa[sn]=Ko}let Jo=u(z=>Math.round(z*100)/100,"round2"),uA=dt+He+re+ge,dA=Jo(uA),lA={inputUsd:Jo(dt),outputUsd:Jo(He),cacheReadUsd:Jo(re),cacheWriteUsd:Jo(ge)},Em={};for(let[z,fe]of Object.entries(ya))Em[z]={input_tokens:fe.input_tokens,output_tokens:fe.output_tokens,cache_read_tokens:fe.cache_read_tokens,cache_write_tokens:fe.cache_write_tokens,cost_usd:Jo(fe.cost_usd)};let xm={};for(let[z,fe]of Object.entries(wa))xm[z]={input_tokens:fe.input_tokens,output_tokens:fe.output_tokens,cache_read_tokens:fe.cache_read_tokens,cache_write_tokens:fe.cache_write_tokens,cost_usd:Jo(fe.cost_usd)};let eo={"2-10s":0,"10-30s":0,"30s-1m":0,"1-2m":0,"2-5m":0,"5-15m":0,">15m":0};for(let z of ee)z<10?eo["2-10s"]++:z<30?eo["10-30s"]++:z<60?eo["30s-1m"]++:z<120?eo["1-2m"]++:z<300?eo["2-5m"]++:z<900?eo["5-15m"]++:eo[">15m"]++;let Ms=[...ee].sort((z,fe)=>z-fe),mA=Ms.length>0?Ms[Math.floor(Ms.length/2)]:0,pA=Ms.length>0?Ms.reduce((z,fe)=>z+fe,0)/Ms.length:0,Yh=0,Xh=0;if(he.length>1){let z=he.flatMap(We=>We.timestamps.map(Be=>({sessionId:We.id,time:new Date(Be).getTime()}))).sort((We,Be)=>We.time-Be.time),fe=new Set;for(let We=0;We<z.length-1;We++){let Be=z[We],et=z[We+1];Be.sessionId!==et.sessionId&&et.time-Be.time<1800*1e3&&(fe.add(Be.sessionId),fe.add(et.sessionId),Yh++)}Xh=fe.size}let $s={computed:!0,total_sessions:f.length,window:{since:o??null,until:s??null},truncated:f.length>=h,sessions_with_meta:Nr,sessions_with_analysis:Vo,tools_used:S,date_range:{start:Au[0]?.split("T")[0]??"",end:Au[Au.length-1]?.split("T")[0]??""},total_messages:te,total_duration_hours:Math.round(Te*10)/10,total_input_tokens:j,total_output_tokens:me,total_cache_read_tokens:L,total_cache_write_tokens:ue,estimated_cost_usd:dA,estimated_cost_breakdown:lA,estimated_cost_by_model:Object.keys(Em).length>0?Em:void 0,estimated_cost_by_tool:Object.keys(xm).length>0?xm:void 0,tool_counts:v,languages:A,git_commits:O,git_pushes:oe,projects:E,goal_categories:R,outcomes:P,satisfaction:N,session_types:D,friction:q,tool_error_categories:H,session_summaries:Sm,total_tool_errors:Ye,total_interruptions:qt,total_lines_added:we,total_lines_removed:Pe,total_files_modified:xe,days_active:Am.size,messages_per_day:Am.size>0?Math.round(te/Am.size*10)/10:0,message_hours:B,sessions_using_task_agent:Zr,sessions_using_mcp:bm,response_time:{median_seconds:Math.round(mA*10)/10,avg_seconds:Math.round(pA*10)/10,histogram:eo,total_samples:ee.length},parallel_sessions:{events:Yh,sessions_involved:Xh},analysis_freshness:{with_timestamp:zh,pre_instrumentation:Vh,stale_30d:Jh,oldest_analyzed_at:ha?new Date(ha).toISOString():null,newest_analyzed_at:_a?new Date(_a).toISOString():null}};$s.autoAddAvailable=!!(n&&AO.existsSync(EO.join(n,"CLAUDE.md")));let Eu=[jo(W.userId,t),jo(W.status,"completed")];r?Eu.push(jo(W.projectId,r)):n?Eu.push(Vb(W.projectPath,`%${rt(n)}%`)):Eu.push(Gi`${W.projectPath} IS NULL`);let[Qh]=await tt.select({id:W.id,result:W.result}).from(W).where(Fg(...Eu)).orderBy(Wg(W.completedAt)).limit(1),fA=Qh?.result,Tm=Zp(fA?.recommendations);if(Tm&&Object.keys(Tm).length>0)$s.recommendations=Tm,$s._recsJobId=Qh?.id??null;else if(f.length>=3){let z=kO({totalSessions:f.length,sessionsWithAnalysis:Vo,toolCounts:v,toolErrorCategories:H,friction:q,outcomes:P,sessionsUsingMcp:bm,sessionsUsingTaskAgent:Zr,totalToolErrors:Ye,totalMessages:te,totalDurationHours:Te});z&&($s.recommendations=z)}return Ul.size>1e3&&Ul.clear(),Ul.set(c,{at:Date.now(),data:$s}),$s}),{_recsJobId:p,..._}=m;if(_.recommendations)try{_.recommendations=await Hb({userId:t,projectPath:n,jobId:p??null,recs:_.recommendations})}catch{}return e.json(_)});Yc.get("/insights/recommendations/history",async e=>{let t=e.get("userId"),n=e.req.query("projectPath")??"",r=await d.select({category:Ae.category,label:Ae.label,timesGenerated:Ae.timesGenerated,dismissedAt:Ae.dismissedAt,lastSeenAt:Ae.lastSeenAt}).from(Ae).where(Fg(jo(Ae.userId,t),jo(Ae.projectPath,n))).orderBy(Gi`${Ae.dismissedAt} IS NULL`,Wg(Ae.timesGenerated)).limit(40);return e.json({dismissed:r.filter(o=>o.dismissedAt!==null&&o.label!=="").map(o=>({category:o.category,label:o.label,dismissedAt:o.dismissedAt})),repeated:r.filter(o=>o.dismissedAt===null&&o.timesGenerated>=2&&o.label!=="").map(o=>({category:o.category,label:o.label,timesGenerated:o.timesGenerated}))})});Yc.post("/insights/recommendations/dismiss",async e=>{let t=e.get("userId"),n=await e.req.json().catch(()=>({})),r=typeof n.contentHash=="string"?n.contentHash:"";if(!/^[0-9a-f]{64}$/.test(r))return e.json({error:"contentHash must be the 64-hex entry id from the compute response"},400);let o=typeof n.projectPath=="string"?n.projectPath:void 0;return await Bb({userId:t,projectPath:o,contentHash:r}),e.json({ok:!0})});C();import{Hono as PO}from"hono";import{and as En,count as DO,eq as je,ilike as OO,inArray as CO,sql as mn}from"drizzle-orm";ds();var Rs=new PO,Ts=u(e=>us(e?.outcome??null),"scoreOf");Rs.get("/insights/linked-instructions",async e=>{let t=e.get("userId"),n=e.req.query("projectPath"),r=Number(e.req.query("limit")??20),o=[je(y.userId,t)];n&&o.push(OO(y.projectPath,`%${rt(n)}%`));let s=await d.select({id:g.id,name:g.name,contentHash:g.contentHash,source:mn`${g.frontmatter}->>'source'`,linkedSessions:mn`COUNT(DISTINCT ${se.sessionId})`}).from(se).innerJoin(y,je(y.id,se.sessionId)).innerJoin(g,je(g.id,se.instructionId)).where(En(...o)).groupBy(g.id,g.name,g.contentHash,mn`${g.frontmatter}->>'source'`).orderBy(mn`COUNT(DISTINCT ${se.sessionId}) DESC`).limit(r);return e.json(s.map(i=>({id:i.id,name:i.name,contentHash:i.contentHash,source:i.source,linkedSessions:Number(i.linkedSessions)})))});Rs.get("/insights/instruction-impact",async e=>{let t=e.get("userId"),n=e.req.query("instructionId");if(!n)return e.json({error:"instructionId query param required"},400);let r=await d.select({id:y.id,projectId:y.projectId,model:y.model,tool:y.tool,tokenUsage:y.tokenUsage,analysis:y.analysis,metadata:y.metadata,eventCount:y.eventCount,startedAt:y.startedAt}).from(y).innerJoin(Z,je(Z.sessionId,y.id)).where(En(je(y.userId,t),je(Z.treatmentType,"instruction"),je(Z.treatmentId,n))),o=r.map(L=>L.id),s=await d.select({id:y.id,projectId:y.projectId,model:y.model,tool:y.tool,tokenUsage:y.tokenUsage,analysis:y.analysis,metadata:y.metadata,eventCount:y.eventCount,startedAt:y.startedAt}).from(y).where(En(je(y.userId,t),mn`${y.analysis} IS NOT NULL`)),i=await d.selectDistinct({sessionId:Z.sessionId}).from(Z).where(En(je(Z.userId,t),je(Z.treatmentType,"instruction"))),c=new Set(i.map(L=>L.sessionId)),a=new Set(o),l=s.filter(L=>!a.has(L.id)&&c.has(L.id));function m(L){let ue=0,dt=0,He=0,re=0,ge=[],O={},oe={achieved:1,fully_achieved:1,mostly_achieved:.75,partially_achieved:.5,unclear_from_transcript:.25,not_achieved:0,abandoned:0};for(let we of L){let Pe=we.analysis,xe=we.metadata?.local_session_meta;if(Pe?.outcome){let qt=oe[Pe.outcome];qt!==void 0&&ge.push(qt)}xe&&(re++,ue+=xe.tool_errors??0,dt+=xe.duration_minutes??0,He+=(xe.lines_added??0)+(xe.lines_removed??0));let Ye=Pe?.goal_categories??{};for(let[qt,Nr]of Object.entries(Ye))Nr>0&&(O[qt]=(O[qt]||0)+Nr)}return{sessionCount:L.length,enrichedCount:re,outcomeScores:ge,avgOutcomeScore:ge.length>0?Math.round(ge.reduce((we,Pe)=>we+Pe,0)/ge.length*100)/100:null,avgToolErrors:re>0?Math.round(ue/re*10)/10:null,avgDurationMinutes:re>0?Math.round(dt/re*10)/10:null,avgLinesChanged:re>0?Math.round(He/re):null,topGoalCategories:O}}u(m,"computeCohort");let p=m(r),_=m(l),I=u(L=>{if(!L)return"(no-date)";let ue=typeof L=="string"?new Date(L):L;return Number.isNaN(ue.getTime())?"(no-date)":`${ue.getUTCFullYear()}-${String(ue.getUTCMonth()+1).padStart(2,"0")}`},"monthKey"),h=u(L=>{if(!L)return 0;let ue=typeof L=="string"?new Date(L):L;return Number.isNaN(ue.getTime())?0:ue.getTime()},"timeOf"),f=new Map,w=u((L,ue,dt,He)=>{let re=`${L??"(no-project)"}|${I(ue)}`,ge=f.get(re);ge||(ge={key:re,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},f.set(re,ge)),(He?ge.withScores:ge.withoutScores).push(dt),(He?ge.withTimes:ge.withoutTimes).push(h(ue))},"addToStratum");for(let L of r){let ue=Ts(L.analysis);ue!=null&&w(L.projectId,L.startedAt,ue,!0)}for(let L of l){let ue=Ts(L.analysis);ue!=null&&w(L.projectId,L.startedAt,ue,!1)}let b=u(L=>{let ue=new Map,dt=new Set,He=u((re,ge,O,oe,we)=>{let Pe=ue.get(re);Pe||(Pe=new Map,ue.set(re,Pe));let xe=`${ge??"(no-project)"}|${I(O)}`,Ye=Pe.get(xe);Ye||(Ye={key:xe,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},Pe.set(xe,Ye)),(we?Ye.withScores:Ye.withoutScores).push(oe),(we?Ye.withTimes:Ye.withoutTimes).push(h(O))},"add");for(let re of r){let ge=Ts(re.analysis),O=L(re);ge==null||!O||(dt.add(O),He(O,re.projectId,re.startedAt,ge,!0))}for(let re of l){let ge=Ts(re.analysis),O=L(re);ge==null||!O||!dt.has(O)||He(O,re.projectId,re.startedAt,ge,!1)}return[...dt].map(re=>({segment:re,strata:[...ue.get(re)?.values()??[]]}))},"buildAxisSegments"),v=u(L=>[...L].sort((ue,dt)=>Number(dt.verdict.sufficient)-Number(ue.verdict.sufficient)||dt.verdict.nWith-ue.verdict.nWith),"sortSegs"),S=yf([...f.values()],b(L=>gs(L.model))),A=S.overall,E=v(S.segments).map(L=>({model:L.segment,verdict:L.verdict})),R=v(Md(b(L=>L.tool??null))).map(L=>({harness:L.segment,verdict:L.verdict})),{outcomeScores:P,...N}=p,{outcomeScores:D,...q}=_,[H]=await d.select({name:g.name}).from(g).where(je(g.id,n)).limit(1),[B]=await d.select({n:DO(),lastAssignedAt:mn`max(${kt.assignedAt})`}).from(kt).where(En(je(kt.userId,t),je(kt.treatmentType,"instruction"),je(kt.treatmentId,n),je(kt.method,"auto_added"))),ee=B&&Number(B.n)>0?{count:Number(B.n),lastAssignedAt:B.lastAssignedAt}:null,[he]=await d.select({content:g.content,name:g.name}).from(g).where(je(g.id,n)),te=qr(he?.content,he?.name),Te=te?(await d.select({projectPath:Y.projectPath,decision:Y.decision,delta:Y.delta,ciLower:Y.ciLower,ciUpper:Y.ciUpper,nTreated:Y.nTreated,nControl:Y.nControl,segment:Y.segment,decidedAt:Y.decidedAt}).from(Y).where(En(je(Y.userId,t),je(Y.instructionId,n),je(Y.contentHash,te)))).map(L=>({projectPath:L.projectPath,decision:L.decision,delta:Number(L.delta),ciLower:Number(L.ciLower),ciUpper:Number(L.ciUpper),nTreated:L.nTreated,nControl:L.nControl,segment:L.segment,decidedAt:L.decidedAt})):[],j=await d.select({id:U.id,projectPath:U.projectPath,source:U.source,status:U.status}).from(U).where(En(je(U.userId,t),je(U.instructionId,n),je(U.status,"running"))),me=Te.length>0||j.length>0?{verdicts:Te,experiments:j}:null;return e.json({instructionId:n,instructionName:H?.name??"Unknown",verdict:A,segments:E,harnessSegments:R,autoAdded:ee,randomised:me,with:N,without:q,comparison:{outcomeScoreDelta:p.avgOutcomeScore!=null&&_.avgOutcomeScore!=null?Math.round((p.avgOutcomeScore-_.avgOutcomeScore)*100)/100:null,toolErrorsDelta:p.avgToolErrors!=null&&_.avgToolErrors!=null?Math.round((p.avgToolErrors-_.avgToolErrors)*10)/10:null,durationDelta:p.avgDurationMinutes!=null&&_.avgDurationMinutes!=null?Math.round((p.avgDurationMinutes-_.avgDurationMinutes)*10)/10:null}})});Rs.get("/insights/instruction-version-impact",async e=>{let t=e.get("userId"),n=e.req.query("instructionId");if(!n)return e.json({error:"instructionId query param required"},400);let r=await d.select({versionOrdinal:sr.versionOrdinal,contentHash:sr.contentHash,firstSeenAt:sr.firstSeenAt,contentLength:mn`COALESCE(LENGTH(${sr.content}), 0)::int`}).from(sr).where(je(sr.instructionId,n)).orderBy(sr.versionOrdinal),o=await d.select({id:y.id,projectId:y.projectId,analysis:y.analysis,startedAt:y.startedAt,version:Z.treatmentVersion}).from(y).innerJoin(Z,je(Z.sessionId,y.id)).where(En(je(y.userId,t),je(Z.treatmentType,"instruction"),je(Z.treatmentId,n),mn`${Z.treatmentVersion} > 0`)),s=new Map;for(let v of o){let S=s.get(v.version)??[];S.push(v),s.set(v.version,S)}let i=r.map(v=>({version:v.versionOrdinal,contentHash:v.contentHash,firstSeenAt:v.firstSeenAt,sessions:s.get(v.versionOrdinal)?.length??0,replayable:Number(v.contentLength)>0})),c=i.filter(v=>v.sessions>0).map(v=>v.version).sort((v,S)=>v-S),a=Number(e.req.query("version")),l=Number(e.req.query("baselineVersion")),m=Number.isFinite(a)&&a>0?a:c.at(-1),p=Number.isFinite(l)&&l>0?l:c.filter(v=>v!==m).at(-1);if(m==null||p==null)return e.json({instructionId:n,versions:i,version:m??null,baselineVersion:p??null,verdict:null,insufficientReason:"only one version of this instruction has attributed sessions; there is no prior version to compare against"});let _=u(v=>{if(!v)return"(no-date)";let S=typeof v=="string"?new Date(v):v;return Number.isNaN(S.getTime())?"(no-date)":`${S.getUTCFullYear()}-${String(S.getUTCMonth()+1).padStart(2,"0")}`},"monthKey"),I=u(v=>{if(!v)return 0;let S=typeof v=="string"?new Date(v):v;return Number.isNaN(S.getTime())?0:S.getTime()},"timeOf"),h=new Map,f=u((v,S)=>{let A=Ts(v.analysis);if(A==null)return;let E=`${v.projectId??"(no-project)"}|${_(v.startedAt)}`,R=h.get(E);R||(R={key:E,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},h.set(E,R)),(S?R.withScores:R.withoutScores).push(A),(S?R.withTimes:R.withoutTimes).push(I(v.startedAt))},"add");for(let v of s.get(m)??[])f(v,!0);for(let v of s.get(p)??[])f(v,!1);let w=In([...h.values()],{baseline:"prior-version"}),[b]=await d.select({name:g.name}).from(g).where(je(g.id,n)).limit(1);return e.json({instructionId:n,instructionName:b?.name??"Unknown",version:m,baselineVersion:p,versions:i,verdict:w,replayableVersions:i.filter(v=>v.replayable).length})});Rs.get("/insights/memory-impact",async e=>{let t=e.get("userId"),n=e.req.query("memoryId");if(!n)return e.json({error:"memoryId query param required"},400);let[r]=await d.select({id:F.id,title:F.title,kind:F.kind,version:F.version,status:F.status}).from(F).where(En(je(F.id,n),je(F.userId,t))).limit(1);if(!r)return e.json({error:"memory not found"},404);let o=await d.select({sessionId:Z.sessionId,treatmentVersion:Z.treatmentVersion}).from(Z).where(En(je(Z.userId,t),je(Z.treatmentType,"memory"),je(Z.treatmentId,n))),s=new Map,i=new Set;for(let f of o){let w=s.get(f.treatmentVersion);w||(w=new Set,s.set(f.treatmentVersion,w)),w.add(f.sessionId),i.add(f.sessionId)}let c=await d.select({id:y.id,projectId:y.projectId,outcome:mn`${y.analysis}->>'outcome'`,startedAt:y.startedAt,inputTokens:mn`coalesce((${y.tokenUsage}->>'input_tokens')::numeric, 0)`,outputTokens:mn`coalesce((${y.tokenUsage}->>'output_tokens')::numeric, 0)`}).from(y).where(En(je(y.userId,t),mn`${y.analysis} is not null`)).orderBy(y.id),a=u((f,w)=>w>0?Math.round(f/w*100)/100:null,"avg"),l=u(()=>({n:0,scoreSum:0,scoreN:0,tokenSum:0}),"cohort"),m=u(f=>f.n>0?Math.round(f.tokenSum/f.n):null,"avgTokens"),p=u(f=>{let w=s.get(f)??new Set,b=new Map,v=l(),S=l();for(let N of c){let D=w.has(N.id);if(!D&&i.has(N.id))continue;let q=D?v:S;q.n++,q.tokenSum+=Number(N.inputTokens)+Number(N.outputTokens);let H=Ts({outcome:N.outcome});if(H!=null){q.scoreSum+=H,q.scoreN++;let B=N.projectId??"(no-project)",ee=b.get(B);ee||(ee={key:B,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},b.set(B,ee)),(D?ee.withScores:ee.withoutScores).push(H),(D?ee.withTimes:ee.withoutTimes).push(N.startedAt?.getTime()??0)}}let A=In([...b.values()]),E={sessionCount:v.n,avgOutcomeScore:a(v.scoreSum,v.scoreN),avgTotalTokens:m(v)},R={sessionCount:S.n,avgOutcomeScore:a(S.scoreSum,S.scoreN),avgTotalTokens:m(S)},P={outcomeScoreDelta:E.avgOutcomeScore!=null&&R.avgOutcomeScore!=null?Math.round((E.avgOutcomeScore-R.avgOutcomeScore)*100)/100:null,totalTokensDelta:E.avgTotalTokens!=null&&R.avgTotalTokens!=null?E.avgTotalTokens-R.avgTotalTokens:null};return{verdict:A,with:E,without:R,comparison:P}},"computeVersion"),I=[...new Set([r.version,...s.keys()])].sort((f,w)=>w-f).map(f=>({version:f,isCurrent:f===r.version,...p(f)})),h=I.find(f=>f.isCurrent);return e.json({memoryId:n,memoryTitle:r.title,memoryKind:r.kind,memoryVersion:r.version,verdict:h.verdict,with:h.with,without:h.without,comparison:h.comparison,versions:I.map(({version:f,isCurrent:w,verdict:b,with:v,without:S})=>({version:f,isCurrent:w,verdict:b,with:v,without:S})),cost:{estimated:!0}})});var LO=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;Rs.get("/insights/suggestion-impact",async e=>{let t=e.get("userId"),n=e.req.query("instructionIds")??e.req.query("instructionId")??"",r=[...new Set(n.split(",").map(l=>l.trim()).filter(l=>LO.test(l)))].slice(0,200);if(r.length===0)return e.json({error:"instructionIds query param (comma-separated uuids) required"},400);let o=await d.select({sessionId:Z.sessionId,treatmentId:Z.treatmentId}).from(Z).where(En(je(Z.userId,t),je(Z.treatmentType,"suggestion"),CO(Z.treatmentId,r))),s=new Map;for(let l of o){let m=s.get(l.treatmentId);m||(m=new Set,s.set(l.treatmentId,m)),m.add(l.sessionId)}let c=(await d.select({id:y.id,projectId:y.projectId,outcome:mn`${y.analysis}->>'outcome'`,startedAt:y.startedAt}).from(y).where(En(je(y.userId,t),mn`${y.analysis} is not null`)).orderBy(y.id)).map(l=>({id:l.id,key:l.projectId??"(no-project)",score:Ts({outcome:l.outcome}),time:l.startedAt?.getTime()??0})).filter(l=>l.score!=null),a={};for(let l of r){let m=s.get(l);if(!m||m.size===0){a[l]=In([]);continue}let p=new Map;for(let _ of c){let I=p.get(_.key);I||(I={key:_.key,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},p.set(_.key,I));let h=m.has(_.id);(h?I.withScores:I.withoutScores).push(_.score),(h?I.withTimes:I.withoutTimes).push(_.time)}a[l]=In([...p.values()],{iterations:2e3})}return e.json({impacts:a})});C();import{Hono as MO}from"hono";import{and as ks,count as zg,eq as xn,inArray as Jb,sql as Wr}from"drizzle-orm";var Jg=new MO,Vg=/force[- ]?push|rm\s+-rf|git\s+reset\s+--hard|drop\s+table|truncate\b|--no-verify|chmod\s+777|\bsudo\b|secret|credential|password|api[- ]?key|never\s+(delete|drop|force|push|commit|run|deploy)|do\s+not\s+(delete|drop|force|push|commit|run|deploy)/i;Jg.get("/insights/groom-candidates",async e=>{let t=e.get("userId"),[n]=await d.select({n:zg()}).from(y).where(ks(xn(y.userId,t),Wr`${y.startedAt} > now() - interval '7 days'`));if(Number(n?.n??0)===0)return e.json({captureHealthy:!1,reason:'No sessions captured in the last 7 days \u2014 cannot tell "unused" from "uncaptured". Grooming paused (never trust a dark pipeline).',candidates:[],harmful:[],safetyGuarded:0,harmfulSafetyGuarded:0,bloated:[],trimSafetyFlagged:0});let[r,o,s,i]=await Promise.all([d.select({id:g.id,name:g.name,type:g.type,content:g.content,lastExposedAt:Wr`max(${Z.exposedAt})`,totalExposures:zg(Z.id)}).from(g).leftJoin(Z,ks(xn(Z.treatmentId,g.id),xn(Z.userId,t))).where(ks(xn(g.createdBy,t),xn(g.archived,!1),Wr`${g.createdAt} < now() - interval '30 days'`)).groupBy(g.id).having(Wr`max(${Z.exposedAt}) is null or max(${Z.exposedAt}) < now() - interval '30 days'`),d.select({id:g.id,name:g.name,type:g.type}).from(g).where(ks(xn(g.createdBy,t),xn(g.archived,!1))),d.select({treatmentId:Z.treatmentId,sessionId:Z.sessionId}).from(Z).where(ks(xn(Z.userId,t),xn(Z.treatmentType,"instruction"),Wr`${Z.sessionId} is not null`)),d.select({id:y.id,projectId:y.projectId,outcome:Wr`${y.analysis}->>'outcome'`,startedAt:y.startedAt}).from(y).where(ks(xn(y.userId,t),Wr`${y.analysis} is not null`))]),c=await d.select({treatmentId:Z.treatmentId,projectId:y.projectId,n:zg()}).from(Z).innerJoin(y,xn(y.id,Z.sessionId)).where(ks(xn(Z.userId,t),xn(Z.treatmentType,"instruction"),Wr`${y.projectId} is not null`)).groupBy(Z.treatmentId,y.projectId),a=new Map;for(let N of c){if(!N.projectId)continue;let D=Number(N.n),q=a.get(N.treatmentId);(!q||D>q.n||D===q.n&&N.projectId<q.projectId)&&a.set(N.treatmentId,{projectId:N.projectId,n:D})}let l=u(N=>a.get(N)?.projectId??null,"topProjectId"),m=r.filter(N=>!(N.content&&Vg.test(N.content))),p=r.length-m.length,_=m.map(N=>({id:N.id,name:N.name,type:N.type,reason:Number(N.totalExposures)===0?"never used":"not used in 30+ days",lastExposedAt:N.lastExposedAt,totalExposures:Number(N.totalExposures),topProjectId:l(N.id)})).sort((N,D)=>N.totalExposures-D.totalExposures).slice(0,50),I=new Map;for(let N of i){let D=N.outcome!=null?li[N.outcome]:void 0;D!==void 0&&I.set(N.id,{projectId:N.projectId,score:D,time:N.startedAt?.getTime()??0})}let h=new Map;for(let N of s){if(!N.sessionId)continue;let D=h.get(N.treatmentId);D||(D=new Set,h.set(N.treatmentId,D)),D.add(N.sessionId)}let f=[],w=[];for(let N of o){let D=h.get(N.id);if(!D)continue;let q=0;for(let he of D)I.has(he)&&q++;if(q<10)continue;let H=new Map;for(let[he,{projectId:te,score:Te,time:j}]of I){let me=te??"(no-project)",L=H.get(me);L||(L={key:me,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},H.set(me,L));let ue=D.has(he);(ue?L.withScores:L.withoutScores).push(Te),(ue?L.withTimes:L.withoutTimes).push(j)}let B=In([...H.values()]),ee=cs(B);ee==="harmful"?f.push({id:N.id,name:N.name,type:N.type,verdict:B,exposures:B.nWith,topProjectId:l(N.id)}):ee==="neutral"&&w.push({id:N.id,name:N.name,type:N.type,verdict:B,exposures:B.nWith,topProjectId:l(N.id)})}let b=0,v=f;if(f.length>0){let N=await d.select({id:g.id,content:g.content}).from(g).where(Jb(g.id,f.map(q=>q.id))),D=new Map(N.map(q=>[q.id,q.content]));v=f.filter(q=>{let H=D.get(q.id);return H&&Vg.test(H)?(b++,!1):!0})}v.sort((N,D)=>N.verdict.delta-D.verdict.delta);let S=1500,A=[],E=0;if(w.length>0){let N=await d.select({id:g.id,estimatedTokens:Wr`(length(${g.content}) / 4)::int`,content:g.content}).from(g).where(Jb(g.id,w.map(q=>q.id))),D=new Map(N.map(q=>[q.id,q]));for(let q of w){let H=D.get(q.id),B=Number(H?.estimatedTokens??0);if(B<S)continue;let ee=!!(H?.content&&Vg.test(H.content));ee&&E++,A.push({...q,estimatedTokens:B,containsSafetyLanguage:ee})}A.sort((q,H)=>H.estimatedTokens-q.estimatedTokens),A=A.slice(0,20)}let R=new Set(v.map(N=>N.id)),P=_.filter(N=>!R.has(N.id));return e.json({captureHealthy:!0,candidates:P,safetyGuarded:p,harmful:v,harmfulSafetyGuarded:b,bloated:A,trimSafetyFlagged:E})});C();import{Hono as $O}from"hono";import{z as Yi}from"zod";import{and as er,desc as Kb,eq as ft,getTableColumns as qO,gte as Kg,ilike as Hl,isNull as UO,ne as HO,or as BO,sql as vr}from"drizzle-orm";var Po=new $O;function FO(e,t){let n=t?Hl(W.projectPath,`%${rt(t)}%`):void 0;return e&&n?BO(ft(W.projectId,e),er(UO(W.projectId),n)):e?ft(W.projectId,e):n}u(FO,"insightsJobProjectScope");Po.post("/insights-jobs",async e=>{let t=e.get("userId"),n=await e.req.json().catch(()=>({})),r=n.dedup,o=n.projectPath??null,s=await Ur(o);if(r==="daily"){let m=new Date;m.setHours(0,0,0,0);let p=o,_=[ft(W.userId,t),Kg(W.createdAt,m)];s?_.push(ft(W.projectId,s)):p?_.push(Hl(W.projectPath,`%${rt(p)}%`)):_.push(vr`${W.projectPath} IS NULL`);let[I]=await d.select({id:W.id}).from(W).where(er(..._)).limit(1);if(I)return e.json({skipped:!0,reason:"already_generated_today",existingJobId:I.id},200);let h=[ft(W.userId,t),ft(W.status,"completed")];s?h.push(ft(W.projectId,s)):p?h.push(Hl(W.projectPath,`%${rt(p)}%`)):h.push(vr`${W.projectPath} IS NULL`);let[f]=await d.select({completedAt:W.completedAt}).from(W).where(er(...h)).orderBy(Kb(W.completedAt)).limit(1),w=f?.completedAt??new Date(0),b=[ft(y.userId,t),Kg(y.startedAt,w)];s?b.push(ft(y.projectId,s)):p&&b.push(Hl(y.projectPath,`%${rt(p)}%`));let[{count:v}]=await d.select({count:vr`COUNT(*)`}).from(y).where(er(...b));if(Number(v)<5)return e.json({skipped:!0,reason:"insufficient_sessions",sessionsSinceLastRun:Number(v),threshold:5},200)}let i=o,{id:c,noLiveWorker:a}=await Tt({taskName:"process_insights",payload:{projectPath:i,projectId:s},userId:t,mirror:{userId:t,projectPath:i,projectId:s}}),[l]=await d.select().from(W).where(ft(W.id,c));return e.json({...l,noLiveWorker:a},201)});Po.get("/insights-jobs",async e=>{let t=e.get("userId"),n=Number(e.req.query("limit")??10),r=e.req.query("projectPath"),o=e.req.query("projectId")??await Ur(r??null),s=[ft(W.userId,t)],i=FO(o,r??null);i&&s.push(i);let{result:c,...a}=qO(W),l=await d.select(a).from(W).where(er(...s)).orderBy(Kb(W.createdAt)).limit(n);return e.json(l)});Po.get("/insights-jobs/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select().from(W).where(er(ft(W.id,n),ft(W.userId,t)));return r?e.json(r):e.json({error:"Job not found"},404)});Po.patch("/insights-jobs/:id/progress",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),s=["running","paused"].includes(r.status)?r.status:"running",[i]=await d.update(W).set({status:s,progress:r.progress,updatedAt:new Date}).where(er(ft(W.id,n),ft(W.userId,t))).returning();return i?e.json(i):e.json({error:"Job not found"},404)});var WO=Yi.object({status:Yi.enum(["running","completed","failed"]).optional(),attempts:Yi.number().int().nonnegative().optional(),error:Yi.string().optional(),result:Yi.record(Yi.unknown()).optional()});Po.patch("/insights-jobs/:id/state",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=WO.parse(await e.req.json()),o={updatedAt:new Date};r.attempts!==void 0&&(o.attempts=r.attempts),r.status&&(o.status=r.status),r.error&&(o.error=r.error),r.result!==void 0&&(o.result=r.result),(r.status==="completed"||r.status==="failed")&&(o.completedAt=new Date);let[s]=await d.update(W).set(o).where(er(ft(W.id,n),ft(W.userId,t),HO(W.status,"cancelled"))).returning();if(!s){let[i]=await d.select().from(W).where(er(ft(W.id,n),ft(W.userId,t)));return i?e.json(i):e.json({error:"Job not found"},404)}return e.json(s)});var zO=14400*1e3;Po.post("/insights-jobs/regenerate-all",async e=>{let t=e.get("userId"),n=await e.req.json().catch(()=>({})),r=Number(n.minSessions??3),o=n.force===!0,s=new Date(Date.now()-zO),i=await d.select({projectId:y.projectId,sessionCount:vr`COUNT(*)`}).from(y).where(er(ft(y.userId,t),vr`${y.projectId} IS NOT NULL`)).groupBy(y.projectId).orderBy(vr`COUNT(*) DESC`),c=i.map(I=>I.projectId).filter(I=>!!I),a=new Map;if(c.length>0){let I=await d.execute(vr`
1059
978
  SELECT DISTINCT ON (project_id) project_id, path
1060
979
  FROM project_checkouts
1061
- WHERE project_id IN (${vr.join(a.map(h=>vr`${h}`),vr`, `)})
980
+ WHERE project_id IN (${vr.join(c.map(h=>vr`${h}`),vr`, `)})
1062
981
  ORDER BY project_id, is_worktree ASC, last_seen DESC
1063
- `);for(let h of v)c.set(h.project_id,h.path)}let l=[],p=[],m=[],y=!1;for(let v of i){if(Number(v.sessionCount)<r||!v.projectId)continue;let h=c.get(v.projectId);if(!h){p.push({projectPath:"<unknown>",reason:"no_checkout"});continue}try{if(!o){let[I]=await u.select({id:W.id}).from(W).where(er(gt(W.userId,t),gt(W.status,"completed"),gt(W.projectPath,h),Xg(W.completedAt,s))).limit(1);if(I){p.push({projectPath:h,reason:"fresh"});continue}}let{id:f,noLiveWorker:w}=await Rt({taskName:"process_insights",payload:{projectPath:h},userId:t,mirror:{userId:t,projectPath:h}});w&&(y=!0);let[b]=await u.select().from(W).where(gt(W.id,f));b&&l.push(b)}catch(f){let w=f instanceof Error?f.message:String(f);m.push({projectPath:h,error:w})}}return e.json({created:l.length,jobs:l,skipped:p,errors:m,noLiveWorker:y},201)});O();import Fl from"node:fs";import LM from"node:path";import{createHash as $M}from"node:crypto";import{Hono as qM}from"hono";import{and as dS,desc as UM,eq as Yc}from"drizzle-orm";var Qg=new qM;async function HM(e,t,n){try{let r=`${vu.claude_md}::${n}`,[o]=await u.select({id:g.id,version:g.version}).from(g).where(dS(Yc(g.contextIdentity,r),Yc(g.createdBy,e),Yc(g.archived,!1))).orderBy(UM(g.createdAt)).limit(1);if(!o){let a=Fl.readFileSync(n,"utf-8"),c=$M("sha256").update(a).digest("hex"),l={name:n,description:"Project CLAUDE.md",type:"context_file",scope:"personal",version:"1.0.0"},[p]=await u.insert(g).values({name:n,description:"Project CLAUDE.md",type:"context_file",scope:"personal",scopeRef:e,version:"1.0.0",content:a,frontmatter:l,contentHash:c,contextIdentity:r,createdBy:e}).onConflictDoNothing().returning({id:g.id,version:g.version});o=p}if(!o)return null;let s=await ks(t),[i]=await u.insert(jt).values({userId:e,treatmentType:"instruction",treatmentId:o.id,projectId:s??void 0,assignedBy:e,method:"auto_added"}).returning({id:jt.id});return i?.id??null}catch(r){return console.warn("[auto-add] failed to record treatment_assignment:",r instanceof Error?r.message:r),null}}d(HM,"recordAutoAddAssignment");Qg.post("/insights/auto-add",async e=>{let t=e.get("userId"),n=await e.req.json(),{projectPath:r,addition:o}=n;if(!r||!o)return e.json({error:"projectPath and addition are required"},400);let[s]=await u.select({id:_.id}).from(_).where(dS(Yc(_.userId,t),Yc(_.projectPath,r))).limit(1);if(!s)return e.json({error:"projectPath is not a known project for this user"},403);let i=LM.join(r,"CLAUDE.md");if(!Fl.existsSync(i))return e.json({error:`CLAUDE.md not found at ${i} on the API host \u2014 auto-add only works when the API runs on the same machine as the project (local mode)`,code:"not_local_mode"},501);try{let a=Fl.readFileSync(i,"utf-8");if(a.includes(o.trim()))return e.json({success:!1,reason:"already_present"},200);let c=a.endsWith(`
982
+ `);for(let h of I)a.set(h.project_id,h.path)}let l=[],m=[],p=[],_=!1;for(let I of i){if(Number(I.sessionCount)<r||!I.projectId)continue;let h=a.get(I.projectId);if(!h){m.push({projectPath:"<unknown>",reason:"no_checkout"});continue}try{if(!o){let[v]=await d.select({id:W.id}).from(W).where(er(ft(W.userId,t),ft(W.status,"completed"),ft(W.projectPath,h),Kg(W.completedAt,s))).limit(1);if(v){m.push({projectPath:h,reason:"fresh"});continue}}let{id:f,noLiveWorker:w}=await Tt({taskName:"process_insights",payload:{projectPath:h},userId:t,mirror:{userId:t,projectPath:h}});w&&(_=!0);let[b]=await d.select().from(W).where(ft(W.id,f));b&&l.push(b)}catch(f){let w=f instanceof Error?f.message:String(f);p.push({projectPath:h,error:w})}}return e.json({created:l.length,jobs:l,skipped:m,errors:p,noLiveWorker:_},201)});C();import Bl from"node:fs";import VO from"node:path";import{createHash as JO}from"node:crypto";import{Hono as KO}from"hono";import{and as Gb,desc as GO,eq as Xc}from"drizzle-orm";var Gg=new KO;async function YO(e,t,n){try{let r=`${Id.claude_md}::${n}`,[o]=await d.select({id:g.id,version:g.version}).from(g).where(Gb(Xc(g.contextIdentity,r),Xc(g.createdBy,e),Xc(g.archived,!1))).orderBy(GO(g.createdAt)).limit(1);if(!o){let c=Bl.readFileSync(n,"utf-8"),a=JO("sha256").update(c).digest("hex"),l={name:n,description:"Project CLAUDE.md",type:"context_file",scope:"personal",version:"1.0.0"},[m]=await d.insert(g).values({name:n,description:"Project CLAUDE.md",type:"context_file",scope:"personal",scopeRef:e,version:"1.0.0",content:c,frontmatter:l,contentHash:a,contextIdentity:r,createdBy:e}).onConflictDoNothing().returning({id:g.id,version:g.version});o=m}if(!o)return null;let s=await Ur(t),[i]=await d.insert(kt).values({userId:e,treatmentType:"instruction",treatmentId:o.id,projectId:s??void 0,assignedBy:e,method:"auto_added"}).returning({id:kt.id});return i?.id??null}catch(r){return console.warn("[auto-add] failed to record treatment_assignment:",r instanceof Error?r.message:r),null}}u(YO,"recordAutoAddAssignment");Gg.post("/insights/auto-add",async e=>{let t=e.get("userId"),n=await e.req.json(),{projectPath:r,addition:o}=n;if(!r||!o)return e.json({error:"projectPath and addition are required"},400);let[s]=await d.select({id:y.id}).from(y).where(Gb(Xc(y.userId,t),Xc(y.projectPath,r))).limit(1);if(!s)return e.json({error:"projectPath is not a known project for this user"},403);let i=VO.join(r,"CLAUDE.md");if(!Bl.existsSync(i))return e.json({error:`CLAUDE.md not found at ${i} on the API host \u2014 auto-add only works when the API runs on the same machine as the project (local mode)`,code:"not_local_mode"},501);try{let c=Bl.readFileSync(i,"utf-8");if(c.includes(o.trim()))return e.json({success:!1,reason:"already_present"},200);let a=c.endsWith(`
1064
983
  `)?`
1065
984
  `:`
1066
985
 
1067
- `;Fl.writeFileSync(i,a+c+o.trim()+`
1068
- `);let l=await HM(t,r,i);return e.json({success:!0,path:i,addedAt:new Date().toISOString(),assignmentId:l,tracked:l!=null})}catch(a){let c=a instanceof Error?a.message:String(a);return e.json({error:`Failed to write: ${c}`},500)}});O();import{createHash as BM}from"node:crypto";import{Hono as FM}from"hono";import{z as Qt}from"zod";import{and as Zg,eq as Oo,inArray as WM,sql as Xc}from"drizzle-orm";function uS(e){let t=e.toLowerCase();return t.includes("hook")?"hook":t.includes("mcp")?"mcp":t.includes("subagent")||t.includes("sub-agent")||t.includes("agent")?"subagent":t.includes("skill")?"skill":"feature"}d(uS,"artifactTypeForFeature");function lS(e){let t=[`## ${e.feature}`];return e.one_liner&&t.push(e.one_liner),e.why_for_you&&t.push(`**Why for you:** ${e.why_for_you}`),e.example_code&&t.push("```\n"+e.example_code+"\n```"),t.join(`
986
+ `;Bl.writeFileSync(i,c+a+o.trim()+`
987
+ `);let l=await YO(t,r,i);return e.json({success:!0,path:i,addedAt:new Date().toISOString(),assignmentId:l,tracked:l!=null})}catch(c){let a=c instanceof Error?c.message:String(c);return e.json({error:`Failed to write: ${a}`},500)}});C();import{createHash as XO}from"node:crypto";import{Hono as QO}from"hono";import{z as wt}from"zod";import{and as Yg,eq as Do,inArray as ZO,sql as Qc}from"drizzle-orm";function Yb(e){let t=e.toLowerCase();return t.includes("hook")?"hook":t.includes("mcp")?"mcp":t.includes("subagent")||t.includes("sub-agent")||t.includes("agent")?"subagent":t.includes("skill")?"skill":"feature"}u(Yb,"artifactTypeForFeature");function Xb(e){let t=[`## ${e.feature}`];return e.one_liner&&t.push(e.one_liner),e.why_for_you&&t.push(`**Why for you:** ${e.why_for_you}`),e.example_code&&t.push("```\n"+e.example_code+"\n```"),t.join(`
988
+
989
+ `)}u(Xb,"renderFeatureBody");function Qb(e){let t=[`## ${e.title}`];return e.lead&&t.push(e.lead),e.detail&&t.push(e.detail),e.copyable_prompt&&t.push("```\n"+e.copyable_prompt+"\n```"),t.join(`
1069
990
 
1070
- `)}d(lS,"renderFeatureBody");var eh=new FM,zM=Qt.object({projectPath:Qt.string().min(1),additions:Qt.array(Qt.object({addition:Qt.string().min(12).max(4e3),why:Qt.string().max(2e3).default("")})).max(20).default([]),skills:Qt.array(Qt.object({skillId:Qt.string().min(1).max(200),reason:Qt.string().max(2e3).default("")})).max(20).default([]),features:Qt.array(Qt.object({feature:Qt.string().min(2).max(200),one_liner:Qt.string().max(1e3).default(""),why_for_you:Qt.string().max(4e3).default(""),example_code:Qt.string().max(8e3).default("")})).max(20).default([])}),pS=.5,VM=.4,mS=d(e=>BM("sha256").update(e.trim()).digest("hex"),"hashAddition");function fS(e){let t=e.trim().split(`
1071
- `)[0].replace(/^#+\s*/,"").trim();return(t.length>0?t:e.trim()).slice(0,80)}d(fS,"deriveName");eh.post("/insights/recommendations/nominate",async e=>{let t=e.get("userId"),n=zM.safeParse(await e.req.json());if(!n.success)return e.json({error:"Invalid body",details:n.error.flatten()},400);let{projectPath:r,additions:o,skills:s,features:i}=n.data,a=[],c=0,l=0,p=0,m=[];if(s.length>0){let f=s.flatMap(I=>[I.skillId,`skills--${I.skillId}`]),w=await u.select({id:g.id,name:g.name}).from(g).where(Zg(Oo(g.type,"skill"),Oo(g.archived,!1),WM(g.name,f))),b=new Map(w.map(I=>[I.name,I.id]));for(let I of s){let S=b.get(`skills--${I.skillId}`)??b.get(I.skillId);if(!S){c+=1;continue}a.push({instructionId:S,reason:I.reason||"Recommended by insights",score:pS})}}for(let f of o){let w=hi(f.addition);if(w.length>0){m.push({name:fS(f.addition),placeholders:w.map(A=>A.token)});continue}let b=mS(f.addition),[I]=await u.select({id:g.id}).from(g).where(Zg(Oo(g.createdBy,t),Oo(g.contentHash,b),Oo(g.archived,!1))).limit(1),S=I?.id;if(!S){let[A]=await u.insert(g).values({name:fS(f.addition),description:f.why.slice(0,500)||"Proposed by insights from your session history",type:"instruction",scope:"personal",scopeRef:t,version:"1.0.0",content:f.addition,frontmatter:{source:"insights",projectPath:r,proposedAt:new Date().toISOString()},createdBy:t,contentHash:b}).returning({id:g.id});S=A.id,l+=1}a.push({instructionId:S,reason:f.why||"Proposed by insights from your session history",score:pS})}for(let f of i){let w=uS(f.feature),b=lS(f),I=hi(b);if(I.length>0){m.push({name:f.feature.slice(0,80),placeholders:I.map(R=>R.token)});continue}let S=mS(b),[A]=await u.select({id:g.id}).from(g).where(Zg(Oo(g.createdBy,t),Oo(g.contentHash,S),Oo(g.archived,!1))).limit(1),E=A?.id;if(!E){let[R]=await u.insert(g).values({name:f.feature.slice(0,80),description:(f.one_liner||"Suggested by insights").slice(0,500),type:w,scope:"personal",scopeRef:t,version:"1.0.0",content:b,frontmatter:{source:"insights",artifactType:w,projectPath:r,proposedAt:new Date().toISOString()},createdBy:t,contentHash:S}).returning({id:g.id});E=R.id,p+=1}a.push({instructionId:E,reason:f.why_for_you||f.one_liner||"Suggested by insights from your session history",score:VM})}if(a.length===0)return e.json({nominated:0,additionsCreated:0,featuresCreated:0,skillsUnresolved:c,additionsRejected:m});let y=new Set,v=a.filter(f=>y.has(f.instructionId)?!1:(y.add(f.instructionId),!0)).map(f=>({userId:t,instructionId:f.instructionId,projectPath:r,projectId:null,score:f.score,reason:f.reason,kind:"add",generatedAt:new Date,isStale:!1})),h=await ks(r);for(let f of v)f.projectId=h;return await u.insert(x).values(v).onConflictDoUpdate({target:[x.userId,x.projectPath,x.instructionId,x.kind],set:{score:Xc`excluded.score`,reason:Xc`excluded.reason`,generatedAt:Xc`excluded.generated_at`,isStale:Xc`false`,dismissedAt:Xc`CASE WHEN ${x.dismissedAt} IS NOT NULL AND ${x.dismissedAt} >= now() - interval '30 days' THEN ${x.dismissedAt} ELSE NULL END`}}),e.json({nominated:v.length,additionsCreated:l,featuresCreated:p,skillsUnresolved:c,additionsRejected:m})});O();import{Hono as JM}from"hono";import{and as GM,desc as KM,eq as th,isNotNull as YM}from"drizzle-orm";var nh=new JM;nh.get("/insights/evidence",async e=>{let t=e.get("userId"),n=e.req.query("projectPath");if(!n)return e.json({error:"projectPath is required"},400);let[r]=await u.select({result:W.result,completedAt:W.completedAt}).from(W).where(GM(th(W.userId,t),th(W.projectPath,n),th(W.status,"completed"),YM(W.result))).orderBy(KM(W.completedAt)).limit(1);if(!r)return e.json({analyzedAt:null,friction:[],whatWorks:[]});let o=d(p=>typeof p=="string"&&p.trim().length>0,"isStr"),s=d(p=>p!==null&&typeof p=="object"&&!Array.isArray(p),"isRecord"),i=r.result,a=s(i)&&s(i.recommendations)?i.recommendations:void 0,c=d(p=>Array.isArray(p)?p.flatMap(m=>{if(typeof m=="string")return m.trim()?[m.trim()]:[];if(s(m)){let y=m,v=[y.title,y.category,y.pattern].find(o),h=[y.detail,y.description,y.summary,Array.isArray(y.examples)?y.examples.find(o):void 0].find(o),f=[v,h].filter(o).join(" \u2014 ");return f?[f]:[]}return[]}):o(p)?[p.trim()]:[],"asLines"),l=d((p,m)=>{if(Array.isArray(p))return p;if(s(p)){let y=p[m];if(Array.isArray(y))return y}return[]},"listAt");return e.json({analyzedAt:r.completedAt,friction:c(l(a?.friction_analysis,"categories")).slice(0,8),whatWorks:c(l(a?.what_works,"impressive_workflows")).slice(0,8)})});O();import{Hono as XM}from"hono";import{and as rh,eq as js,inArray as gS,isNotNull as QM,or as ZM,sql as oh}from"drizzle-orm";var sh=new XM;sh.get("/insights/provenance-impact",async e=>{let t=e.get("userId"),n=await u.select({treatmentId:Z.treatmentId,sessions:oh`count(distinct ${Z.sessionId})::int`}).from(Z).where(rh(js(Z.userId,t),js(Z.treatmentType,"instruction"))).groupBy(Z.treatmentId),r=n.map(h=>h.treatmentId),o=await u.select({id:g.id,name:g.name,source:oh`${g.frontmatter}->>'source'`,createdBy:g.createdBy,scope:g.scope}).from(g).where(rh(js(g.archived,!1),r.length>0?ZM(js(g.createdBy,t),gS(g.id,r)):js(g.createdBy,t))).limit(5e3),s=new Map(o.map(h=>[h.id,Eu(h,t)])),i=o.map(h=>h.id),a=await u.select({instructionId:Y.instructionId,decision:Y.decision,delta:Y.delta}).from(Y).where(js(Y.userId,t)),c=i.length>0?await u.select({instructionId:x.instructionId,n:oh`count(*)::int`}).from(x).where(rh(js(x.userId,t),QM(x.acceptedAt),gS(x.instructionId,i))).groupBy(x.instructionId):[],l=new Map,p=d(h=>{let f=l.get(h);return f||(f={provenance:h,instructions:0,exposedInstructions:0,exposedSessions:0,accepted:0,randomisedVerdicts:0,meanDelta:null,evidenceClass:"none"},l.set(h,f)),f},"ensure"),m=new Map(n.map(h=>[h.treatmentId,Number(h.sessions)]));for(let h of o){let f=Eu(h,t),w=m.get(h.id)??0;if(f==="catalog"&&w===0)continue;let b=p(f);b.instructions+=1,w>0&&(b.exposedInstructions+=1,b.exposedSessions+=w)}for(let h of c){let f=s.get(h.instructionId);f&&(p(f).accepted+=Number(h.n))}let y=new Map;for(let h of a){let f=s.get(h.instructionId);if(!f)continue;p(f).randomisedVerdicts+=1;let w=y.get(f)??{sum:0,n:0};w.sum+=Number(h.delta),w.n+=1,y.set(f,w)}for(let[h,f]of y){let w=p(h);w.meanDelta=f.n>0?f.sum/f.n:null,w.evidenceClass=f.n>0?"randomised":"none"}let v=["insights","evolution","user","catalog"];return e.json({groups:v.filter(h=>l.has(h)).map(h=>l.get(h)),measurable:a.length>0,note:a.length===0?"No randomised verdicts exist yet, so no group is measurable. Exposure counts show reach, not effect.":null})});var Mn=new eL;Mn.route("/",Ug);Mn.route("/",Kc);Mn.route("/",Ts);Mn.route("/",Yg);Mn.route("/",Co);Mn.route("/",eh);Mn.route("/",nh);Mn.route("/",sh);Mn.route("/",Qg);O();import{Hono as tL}from"hono";import{z as st}from"zod";import{and as Ln,desc as Wl,eq as Ze,sql as sn}from"drizzle-orm";var mn=new tL,ih=["fact","decision","correction","convention"],hS=4e3,nL=st.object({kind:st.enum(ih),title:st.string().min(1).max(300),body:st.string().min(1).max(hS),projectId:st.string().uuid().optional(),projectPath:st.string().optional(),source:st.enum(["manual","distilled"]).optional()}),rL=st.object({kind:st.enum(ih).optional(),title:st.string().min(1).max(300).optional(),body:st.string().min(1).max(hS).optional(),status:st.enum(["active","archived"]).optional()});async function ah(e){if(!e)return null;try{let[t]=await u.select({projectId:le.projectId}).from(le).where(Ze(le.path,e)).orderBy(Wl(le.lastSeen)).limit(1);if(t)return t.projectId;let[n]=await u.select({id:U.id}).from(U).where(Ze(U.gitRemoteUrl,e)).limit(1);return n?.id??null}catch{return null}}d(ah,"resolveProjectId");mn.get("/memories",async e=>{let t=e.get("userId"),n=e.req.query("projectId"),r=e.req.query("projectPath"),o=e.req.query("status")??"active",s=Number(e.req.query("limit")??"50"),i=Math.min(Math.max(Number.isFinite(s)?s:50,1),200),a=Number(e.req.query("offset")??"0"),c=Math.max(Number.isFinite(a)?a:0,0),l=e.req.query("rank"),p=n??await ah(r??null),m=[Ze(F.userId,t)];o!=="all"&&m.push(Ze(F.status,o));let y=e.req.query("kind");y&&ih.includes(y)&&m.push(Ze(F.kind,y));let v=e.req.query("search")?.trim();if(v){let b=`%${ot(v)}%`;m.push(sn`(${F.title} ilike ${b} or ${F.body} ilike ${b})`)}(n||r)&&m.push(p?sn`(${F.projectId} = ${p} or ${F.projectId} is null)`:sn`${F.projectId} is null`);let h=sn`${F.trustVersion} = ${F.version}`;l==="trust"&&m.push(sn`coalesce(${F.trustClass} = 'harmful' and ${h}, false) = false`);let f=sn`case
991
+ `)}u(Qb,"renderAdviceBody");var Xg=new QO,eC=wt.object({projectPath:wt.string().min(1),additions:wt.array(wt.object({addition:wt.string().min(12).max(4e3),why:wt.string().max(2e3).default("")})).max(20).default([]),skills:wt.array(wt.object({skillId:wt.string().min(1).max(200),reason:wt.string().max(2e3).default("")})).max(20).default([]),features:wt.array(wt.object({feature:wt.string().min(2).max(200),one_liner:wt.string().max(1e3).default(""),why_for_you:wt.string().max(4e3).default(""),example_code:wt.string().max(8e3).default("")})).max(20).default([]),advice:wt.array(wt.object({title:wt.string().min(2).max(200),lead:wt.string().max(4e3).default(""),detail:wt.string().max(8e3).default(""),copyable_prompt:wt.string().max(8e3).default(""),origin:wt.enum(["usage_pattern","opportunity"])})).max(40).default([])}),Zb=.5,e0=.4,t0=u(e=>XO("sha256").update(e.trim()).digest("hex"),"hashAddition");function n0(e){let t=e.trim().split(`
992
+ `)[0].replace(/^#+\s*/,"").trim();return(t.length>0?t:e.trim()).slice(0,80)}u(n0,"deriveName");Xg.post("/insights/recommendations/nominate",async e=>{let t=e.get("userId"),n=eC.safeParse(await e.req.json());if(!n.success)return e.json({error:"Invalid body",details:n.error.flatten()},400);let{projectPath:r,additions:o,skills:s,features:i,advice:c}=n.data,a=[],l=0,m=0,p=0,_=0,I=[];async function h(v){let S=gi(v.body);if(S.length>0)return I.push({name:v.name.slice(0,80),placeholders:S.map(P=>P.token)}),null;let A=t0(v.body),[E]=await d.select({id:g.id}).from(g).where(Yg(Do(g.createdBy,t),Do(g.contentHash,A),Do(g.archived,!1))).limit(1);if(E)return{id:E.id,created:!1};let[R]=await d.insert(g).values({name:v.name.slice(0,80),description:(v.body.split(`
993
+ `).find(P=>P.trim()&&!P.startsWith("#"))??"Suggested by insights").slice(0,500),type:v.type,scope:"personal",scopeRef:t,version:"1.0.0",content:v.body,frontmatter:{source:"insights",artifactType:v.type,origin:v.origin,projectPath:r,proposedAt:new Date().toISOString()},createdBy:t,contentHash:A}).returning({id:g.id});return{id:R.id,created:!0}}if(u(h,"materialise"),s.length>0){let v=s.flatMap(E=>[E.skillId,`skills--${E.skillId}`]),S=await d.select({id:g.id,name:g.name}).from(g).where(Yg(Do(g.type,"skill"),Do(g.archived,!1),ZO(g.name,v))),A=new Map(S.map(E=>[E.name,E.id]));for(let E of s){let R=A.get(`skills--${E.skillId}`)??A.get(E.skillId);if(!R){l+=1;continue}a.push({instructionId:R,reason:E.reason||"Recommended by insights",score:Zb})}}for(let v of o){let S=gi(v.addition);if(S.length>0){I.push({name:n0(v.addition),placeholders:S.map(P=>P.token)});continue}let A=t0(v.addition),[E]=await d.select({id:g.id}).from(g).where(Yg(Do(g.createdBy,t),Do(g.contentHash,A),Do(g.archived,!1))).limit(1),R=E?.id;if(!R){let[P]=await d.insert(g).values({name:n0(v.addition),description:v.why.slice(0,500)||"Proposed by insights from your session history",type:"instruction",scope:"personal",scopeRef:t,version:"1.0.0",content:v.addition,frontmatter:{source:"insights",projectPath:r,proposedAt:new Date().toISOString()},createdBy:t,contentHash:A}).returning({id:g.id});R=P.id,m+=1}a.push({instructionId:R,reason:v.why||"Proposed by insights from your session history",score:Zb})}for(let v of i){let S=await h({name:v.feature,body:Xb(v),type:Yb(v.feature),origin:"features_to_try"});S&&(S.created&&(p+=1),a.push({instructionId:S.id,reason:v.why_for_you||v.one_liner||"Suggested by insights from your session history",score:e0}))}for(let v of c){let S=await h({name:v.title,body:Qb(v),type:"feature",origin:v.origin});S&&(S.created&&(_+=1),a.push({instructionId:S.id,reason:v.lead||v.detail||"Surfaced by insights from your session history",score:e0}))}if(a.length===0)return e.json({nominated:0,additionsCreated:0,featuresCreated:0,adviceCreated:0,skillsUnresolved:l,additionsRejected:I});let f=new Set,w=a.filter(v=>f.has(v.instructionId)?!1:(f.add(v.instructionId),!0)).map(v=>({userId:t,instructionId:v.instructionId,projectPath:r,projectId:null,score:v.score,reason:v.reason,kind:"add",generatedAt:new Date,isStale:!1})),b=await Ur(r);for(let v of w)v.projectId=b;return await d.insert(x).values(w).onConflictDoUpdate({target:[x.userId,x.projectPath,x.instructionId,x.kind],set:{score:Qc`excluded.score`,reason:Qc`excluded.reason`,generatedAt:Qc`excluded.generated_at`,isStale:Qc`false`,dismissedAt:Qc`CASE WHEN ${x.dismissedAt} IS NOT NULL AND ${x.dismissedAt} >= now() - interval '30 days' THEN ${x.dismissedAt} ELSE NULL END`}}),e.json({nominated:w.length,additionsCreated:m,featuresCreated:p,adviceCreated:_,skillsUnresolved:l,additionsRejected:I})});C();import{Hono as tC}from"hono";import{and as nC,desc as rC,eq as Qg,isNotNull as oC}from"drizzle-orm";var Zg=new tC;Zg.get("/insights/evidence",async e=>{let t=e.get("userId"),n=e.req.query("projectPath");if(!n)return e.json({error:"projectPath is required"},400);let[r]=await d.select({result:W.result,completedAt:W.completedAt}).from(W).where(nC(Qg(W.userId,t),Qg(W.projectPath,n),Qg(W.status,"completed"),oC(W.result))).orderBy(rC(W.completedAt)).limit(1);if(!r)return e.json({analyzedAt:null,friction:[],whatWorks:[]});let o=u(m=>typeof m=="string"&&m.trim().length>0,"isStr"),s=u(m=>m!==null&&typeof m=="object"&&!Array.isArray(m),"isRecord"),i=r.result,c=s(i)&&s(i.recommendations)?i.recommendations:void 0,a=u(m=>Array.isArray(m)?m.flatMap(p=>{if(typeof p=="string")return p.trim()?[p.trim()]:[];if(s(p)){let _=p,I=[_.title,_.category,_.pattern].find(o),h=[_.detail,_.description,_.summary,Array.isArray(_.examples)?_.examples.find(o):void 0].find(o),f=[I,h].filter(o).join(" \u2014 ");return f?[f]:[]}return[]}):o(m)?[m.trim()]:[],"asLines"),l=u((m,p)=>{if(Array.isArray(m))return m;if(s(m)){let _=m[p];if(Array.isArray(_))return _}return[]},"listAt");return e.json({analyzedAt:r.completedAt,friction:a(l(c?.friction_analysis,"categories")).slice(0,8),whatWorks:a(l(c?.what_works,"impressive_workflows")).slice(0,8)})});C();import{Hono as sC}from"hono";import{and as eh,eq as Ns,inArray as r0,isNotNull as iC,or as aC,sql as th}from"drizzle-orm";var nh=new sC;nh.get("/insights/provenance-impact",async e=>{let t=e.get("userId"),n=await d.select({treatmentId:Z.treatmentId,sessions:th`count(distinct ${Z.sessionId})::int`}).from(Z).where(eh(Ns(Z.userId,t),Ns(Z.treatmentType,"instruction"))).groupBy(Z.treatmentId),r=n.map(h=>h.treatmentId),o=await d.select({id:g.id,name:g.name,source:th`${g.frontmatter}->>'source'`,createdBy:g.createdBy,scope:g.scope}).from(g).where(eh(Ns(g.archived,!1),r.length>0?aC(Ns(g.createdBy,t),r0(g.id,r)):Ns(g.createdBy,t))).limit(5e3),s=new Map(o.map(h=>[h.id,xd(h,t)])),i=o.map(h=>h.id),c=await d.select({instructionId:Y.instructionId,decision:Y.decision,delta:Y.delta}).from(Y).where(Ns(Y.userId,t)),a=i.length>0?await d.select({instructionId:x.instructionId,n:th`count(*)::int`}).from(x).where(eh(Ns(x.userId,t),iC(x.acceptedAt),r0(x.instructionId,i))).groupBy(x.instructionId):[],l=new Map,m=u(h=>{let f=l.get(h);return f||(f={provenance:h,instructions:0,exposedInstructions:0,exposedSessions:0,accepted:0,randomisedVerdicts:0,meanDelta:null,evidenceClass:"none"},l.set(h,f)),f},"ensure"),p=new Map(n.map(h=>[h.treatmentId,Number(h.sessions)]));for(let h of o){let f=xd(h,t),w=p.get(h.id)??0;if(f==="catalog"&&w===0)continue;let b=m(f);b.instructions+=1,w>0&&(b.exposedInstructions+=1,b.exposedSessions+=w)}for(let h of a){let f=s.get(h.instructionId);f&&(m(f).accepted+=Number(h.n))}let _=new Map;for(let h of c){let f=s.get(h.instructionId);if(!f)continue;m(f).randomisedVerdicts+=1;let w=_.get(f)??{sum:0,n:0};w.sum+=Number(h.delta),w.n+=1,_.set(f,w)}for(let[h,f]of _){let w=m(h);w.meanDelta=f.n>0?f.sum/f.n:null,w.evidenceClass=f.n>0?"randomised":"none"}let I=["insights","evolution","user","catalog"];return e.json({groups:I.filter(h=>l.has(h)).map(h=>l.get(h)),measurable:c.length>0,note:c.length===0?"No randomised verdicts exist yet, so no group is measurable. Exposure counts show reach, not effect.":null})});var $n=new cC;$n.route("/",Mg);$n.route("/",Yc);$n.route("/",Rs);$n.route("/",Jg);$n.route("/",Po);$n.route("/",Xg);$n.route("/",Zg);$n.route("/",nh);$n.route("/",Gg);C();import{Hono as uC}from"hono";import{z as ot}from"zod";import{and as qn,desc as Fl,eq as Ze,sql as on}from"drizzle-orm";var pn=new uC,rh=["fact","decision","correction","convention"],o0=4e3,dC=ot.object({kind:ot.enum(rh),title:ot.string().min(1).max(300),body:ot.string().min(1).max(o0),projectId:ot.string().uuid().optional(),projectPath:ot.string().optional(),source:ot.enum(["manual","distilled"]).optional()}),lC=ot.object({kind:ot.enum(rh).optional(),title:ot.string().min(1).max(300).optional(),body:ot.string().min(1).max(o0).optional(),status:ot.enum(["active","archived"]).optional()});async function oh(e){if(!e)return null;try{let[t]=await d.select({projectId:de.projectId}).from(de).where(Ze(de.path,e)).orderBy(Fl(de.lastSeen)).limit(1);if(t)return t.projectId;let[n]=await d.select({id:M.id}).from(M).where(Ze(M.gitRemoteUrl,e)).limit(1);return n?.id??null}catch{return null}}u(oh,"resolveProjectId");pn.get("/memories",async e=>{let t=e.get("userId"),n=e.req.query("projectId"),r=e.req.query("projectPath"),o=e.req.query("status")??"active",s=Number(e.req.query("limit")??"50"),i=Math.min(Math.max(Number.isFinite(s)?s:50,1),200),c=Number(e.req.query("offset")??"0"),a=Math.max(Number.isFinite(c)?c:0,0),l=e.req.query("rank"),m=n??await oh(r??null),p=[Ze(F.userId,t)];o!=="all"&&p.push(Ze(F.status,o));let _=e.req.query("kind");_&&rh.includes(_)&&p.push(Ze(F.kind,_));let I=e.req.query("search")?.trim();if(I){let b=`%${rt(I)}%`;p.push(on`(${F.title} ilike ${b} or ${F.body} ilike ${b})`)}(n||r)&&p.push(m?on`(${F.projectId} = ${m} or ${F.projectId} is null)`:on`${F.projectId} is null`);let h=on`${F.trustVersion} = ${F.version}`;l==="trust"&&p.push(on`coalesce(${F.trustClass} = 'harmful' and ${h}, false) = false`);let f=on`case
1072
994
  when ${F.source} = 'manual' or (${F.trustClass} = 'helpful' and ${h}) then 0
1073
995
  when ${F.trustClass} = 'neutral' and ${h} then 1
1074
996
  else 2
1075
- end`,w=await u.select({id:F.id,version:F.version,kind:F.kind,title:F.title,body:F.body,source:F.source,status:F.status,projectId:F.projectId,createdAt:F.createdAt,updatedAt:F.updatedAt}).from(F).where(Ln(...m)).orderBy(...l==="trust"?[f,Wl(F.updatedAt)]:[Wl(F.updatedAt)]).limit(i).offset(l==="trust"?0:c);return e.json({memories:w})});mn.post("/memories/relevant",async e=>{let t=e.get("userId"),n=await e.req.json().catch(()=>({})),r=typeof n.prompt=="string"?n.prompt.slice(0,2e3):"";if(!r.trim())return e.json({memories:[]});let o=Number(n.limit),s=Math.min(Math.max(Number.isFinite(o)?o:10,1),50),i=.035,a=Number(n.minRank),c=Number.isFinite(a)?Math.min(Math.max(a,0),1):i,l=Array.isArray(n.excludeIds)?n.excludeIds.filter(w=>typeof w=="string").slice(0,500):[],p=typeof n.projectId=="string"?n.projectId:void 0,m=typeof n.projectPath=="string"?n.projectPath:void 0,y=p??await ah(m??null),v=p||m?y?sn`(m.project_id = ${y} or m.project_id is null)`:sn`m.project_id is null`:sn`true`,h=l.length?sn`and m.id not in (${sn.join(l.map(w=>sn`${w}::uuid`),sn`, `)})`:sn``,f=await u.execute(sn`
997
+ end`,w=await d.select({id:F.id,version:F.version,kind:F.kind,title:F.title,body:F.body,source:F.source,status:F.status,projectId:F.projectId,createdAt:F.createdAt,updatedAt:F.updatedAt}).from(F).where(qn(...p)).orderBy(...l==="trust"?[f,Fl(F.updatedAt)]:[Fl(F.updatedAt)]).limit(i).offset(l==="trust"?0:a);return e.json({memories:w})});pn.post("/memories/relevant",async e=>{let t=e.get("userId"),n=await e.req.json().catch(()=>({})),r=typeof n.prompt=="string"?n.prompt.slice(0,2e3):"";if(!r.trim())return e.json({memories:[]});let o=Number(n.limit),s=Math.min(Math.max(Number.isFinite(o)?o:10,1),50),i=.035,c=Number(n.minRank),a=Number.isFinite(c)?Math.min(Math.max(c,0),1):i,l=Array.isArray(n.excludeIds)?n.excludeIds.filter(w=>typeof w=="string").slice(0,500):[],m=typeof n.projectId=="string"?n.projectId:void 0,p=typeof n.projectPath=="string"?n.projectPath:void 0,_=m??await oh(p??null),I=m||p?_?on`(m.project_id = ${_} or m.project_id is null)`:on`m.project_id is null`:on`true`,h=l.length?on`and m.id not in (${on.join(l.map(w=>on`${w}::uuid`),on`, `)})`:on``,f=await d.execute(on`
1076
998
  with raw as (
1077
999
  select websearch_to_tsquery('english', ${r})::text as t
1078
1000
  ), q as (
@@ -1084,7 +1006,7 @@ ${r}`).digest("hex")}d(Z0,"recommendationEntryHash");var tM=new Set(["42883","42
1084
1006
  from memories m, q
1085
1007
  where m.user_id = ${t}
1086
1008
  and m.status = 'active'
1087
- and ${v}
1009
+ and ${I}
1088
1010
  and coalesce(m.trust_class = 'harmful' and m.trust_version = m.version, false) = false
1089
1011
  ${h}
1090
1012
  and q.query is not null
@@ -1096,14 +1018,14 @@ ${r}`).digest("hex")}d(Z0,"recommendationEntryHash");var tM=new Set(["42883","42
1096
1018
  -- memories into context AND stamp false exposures. The floor (default 0.035,
1097
1019
  -- clamped to >= 0) subsumes the old rank-zero negation guard AND cuts the weak
1098
1020
  -- single-word overlap band, keeping only memories with real topical overlap.
1099
- and ts_rank(m.search_tsv, q.query) > ${c}
1021
+ and ts_rank(m.search_tsv, q.query) > ${a}
1100
1022
  order by ts_rank(m.search_tsv, q.query) desc,
1101
1023
  case when m.source = 'manual' or (m.trust_class = 'helpful' and m.trust_version = m.version) then 0
1102
1024
  when m.trust_class = 'neutral' and m.trust_version = m.version then 1
1103
1025
  else 2 end,
1104
1026
  m.updated_at desc
1105
1027
  limit ${s}
1106
- `);return e.json({memories:[...f]})});mn.get("/memories/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(F).where(Ln(Ze(F.id,n),Ze(F.userId,t))).limit(1);return r?e.json(r):e.json({error:"not found"},404)});mn.post("/memories",async e=>{let t=e.get("userId"),n=nL.safeParse(await e.req.json().catch(()=>({})));if(!n.success)return e.json({error:"invalid body",details:n.error.flatten()},400);let{kind:r,title:o,body:s,projectId:i,projectPath:a,source:c}=n.data,l=i??await ah(a??null),[p]=await u.select({orgId:T.activeOrgId}).from(T).where(Ze(T.id,t)).limit(1),[m]=await u.insert(F).values({userId:t,orgId:p?.orgId??null,projectId:l,kind:r,title:o,body:s,source:c??"manual",status:"active"}).returning();return e.json(m,201)});mn.patch("/memories/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=rL.safeParse(await e.req.json().catch(()=>({})));if(!r.success)return e.json({error:"invalid body",details:r.error.flatten()},400);let[o]=await u.select().from(F).where(Ln(Ze(F.id,n),Ze(F.userId,t))).limit(1);if(!o)return e.json({error:"not found"},404);let{kind:s,title:i,body:a,status:c}=r.data,l=s!==void 0&&s!==o.kind||i!==void 0&&i!==o.title||a!==void 0&&a!==o.body,[p]=await u.update(F).set({kind:s??o.kind,title:i??o.title,body:a??o.body,status:c??o.status,version:l?o.version+1:o.version,updatedAt:new Date}).where(Ln(Ze(F.id,n),Ze(F.userId,t))).returning();return e.json(p)});mn.delete("/memories/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.update(F).set({status:"archived",updatedAt:new Date}).where(Ln(Ze(F.id,n),Ze(F.userId,t))).returning({id:F.id,status:F.status});return r?e.json({ok:!0,id:r.id,status:r.status}):e.json({error:"not found"},404)});var oL=st.object({externalSessionId:st.string().min(1),projectPath:st.string().optional()});mn.post("/memories/:id/exposures",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=oL.safeParse(await e.req.json().catch(()=>({})));if(!r.success)return e.json({error:"invalid body",details:r.error.flatten()},400);let[o]=await u.select({id:F.id,version:F.version,projectId:F.projectId}).from(F).where(Ln(Ze(F.id,n),Ze(F.userId,t))).limit(1);return o?(await u.insert($d).values({userId:t,externalSessionId:r.data.externalSessionId,treatmentType:"memory",treatmentId:o.id,treatmentVersion:o.version,method:"injected",projectId:o.projectId}).onConflictDoNothing(),e.json({ok:!0})):e.json({error:"not found"},404)});var sL=st.object({taskPrompt:st.string().min(1).max(8e3),expectations:st.array(st.string().min(1)).min(1).max(20),trials:st.number().int().min(1).max(50).default(10),model:st.string().min(1).max(100).optional()});mn.post("/memories/:id/experiments",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=sL.safeParse(await e.req.json().catch(()=>({})));if(!r.success)return e.json({error:"invalid body",details:r.error.flatten()},400);let[o]=await u.select({id:F.id,version:F.version}).from(F).where(Ln(Ze(F.id,n),Ze(F.userId,t))).limit(1);if(!o)return e.json({error:"not found"},404);let[s]=await u.insert(Nt).values({memoryId:o.id,userId:t,memoryVersion:o.version,taskPrompt:r.data.taskPrompt,expectations:r.data.expectations,trials:r.data.trials,model:r.data.model??null,status:"pending"}).returning(),{noLiveWorker:i}=await MI({experimentId:s.id,userId:t});return e.json({experiment:s,noLiveWorker:i},201)});mn.get("/memories/:id/experiments",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:F.id}).from(F).where(Ln(Ze(F.id,n),Ze(F.userId,t))).limit(1);if(!r)return e.json({error:"not found"},404);let o=await u.select().from(Nt).where(Ln(Ze(Nt.memoryId,n),Ze(Nt.userId,t))).orderBy(Wl(Nt.createdAt)).limit(20);return e.json({experiments:o})});mn.get("/memory-experiments/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(Nt).where(Ln(Ze(Nt.id,n),Ze(Nt.userId,t))).limit(1);return r?e.json(r):e.json({error:"not found"},404)});var iL=st.object({status:st.enum(["running","completed","failed"]),error:st.string().max(1e3).nullable().optional(),result:st.record(st.unknown()).optional()});mn.patch("/memory-experiments/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=iL.safeParse(await e.req.json().catch(()=>({})));if(!r.success)return e.json({error:"invalid body",details:r.error.flatten()},400);let{status:o,error:s,result:i}=r.data,[a]=await u.select({id:Nt.id,status:Nt.status}).from(Nt).where(Ln(Ze(Nt.id,n),Ze(Nt.userId,t))).limit(1);if(!a)return e.json({error:"not found"},404);if(a.status==="completed"||a.status==="failed")return e.json({error:`experiment is already terminal (status='${a.status}')`,code:"INVALID_STATE"},409);let c=o==="completed"||o==="failed",[l]=await u.update(Nt).set({status:o,...s!==void 0?{error:s}:{},...i!==void 0?{result:i}:{},...o==="running"?{startedAt:new Date}:{},...c?{completedAt:new Date}:{}}).where(Ln(Ze(Nt.id,n),Ze(Nt.userId,t))).returning();return e.json(l)});O();import{randomBytes as aL,createHash as cL}from"node:crypto";import{Hono as dL}from"hono";import{z as _S}from"zod";import{eq as zl,and as uL,isNull as lL}from"drizzle-orm";var Qi=new dL;function pL(){let n=`rm_${aL(32).toString("base64url")}`,r=cL("sha256").update(n).digest("hex"),o=n.slice(0,11);return{plaintext:n,hash:r,prefix:o}}d(pL,"generateApiKey");var mL=_S.object({name:_S.string().min(1).max(100)});Qi.post("/auth/api-keys",async e=>{let t=e.get("userId"),n=await e.req.json(),r=mL.parse(n),{plaintext:o,hash:s,prefix:i}=pL(),[a]=await u.insert(Ae).values({userId:t,name:r.name,keyHash:s,keyPrefix:i}).returning();return e.json({id:a.id,name:a.name,key:o,keyPrefix:i,createdAt:a.createdAt},201)});Qi.get("/auth/api-keys",async e=>{let t=e.get("userId"),n=await u.select({id:Ae.id,name:Ae.name,keyPrefix:Ae.keyPrefix,lastUsedAt:Ae.lastUsedAt,expiresAt:Ae.expiresAt,revokedAt:Ae.revokedAt,createdAt:Ae.createdAt}).from(Ae).where(zl(Ae.userId,t)).orderBy(Ae.createdAt);return e.json(n)});Qi.delete("/auth/api-keys/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:Ae.id}).from(Ae).where(uL(zl(Ae.id,n),zl(Ae.userId,t),lL(Ae.revokedAt)));return r?(await u.update(Ae).set({revokedAt:new Date}).where(zl(Ae.id,n)),e.json({revoked:!0})):e.json({error:"API key not found"},404)});O();import{Hono as fL}from"hono";import{z as zr}from"zod";import{eq as Et,and as Vr,isNull as gL,sql as ch}from"drizzle-orm";import{randomUUID as dh}from"node:crypto";var Jr=new fL;Jr.post("/eval-targets/:id/conversations",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:k.id}).from(k).where(Vr(Et(k.id,n),Et(k.userId,t)));if(!r)return e.json({error:"Target not found"},404);let[o]=await u.select().from($e).where(Vr(Et($e.evalTargetId,n),Et($e.userId,t),Et($e.status,"active")));if(o)return e.json(o);let[s]=await u.insert($e).values({evalTargetId:n,userId:t}).returning();return e.json(s,201)});Jr.get("/eval-targets/:id/conversations",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from($e).where(Vr(Et($e.evalTargetId,n),Et($e.userId,t),Et($e.status,"active")));return r?e.json(r):e.json(null)});var hL=zr.object({content:zr.string().min(1).max(5e3)});Jr.post("/eval-conversations/:id/messages",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=hL.parse(await e.req.json()),[o]=await u.select().from($e).where(Vr(Et($e.id,n),Et($e.userId,t)));if(!o)return e.json({error:"Conversation not found"},404);let s=dh(),i={id:s,role:"user",content:r.content,createdAt:new Date().toISOString()};await u.update($e).set({messages:ch`${$e.messages} || ${JSON.stringify([i])}::jsonb`,updatedAt:new Date}).where(Et($e.id,n));let a={type:"conversation",conversationId:n,messageId:s,messageContent:r.content},{id:c,noLiveWorker:l}=await Rt({taskName:"process_conversation",payload:{evalTargetId:o.evalTargetId,config:a},userId:t,mirror:{userId:t,evalTargetId:o.evalTargetId,config:a}});return e.json({message:i,jobId:c,noLiveWorker:l},201)});var _L=zr.object({content:zr.string(),type:zr.enum(["text","status","results","proposal","applied","generated","comparison"]).default("text"),data:zr.record(zr.unknown()).optional()});Jr.post("/eval-conversations/:id/messages/assistant",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=_L.parse(await e.req.json()),o={id:dh(),role:"assistant",content:r.content,type:r.type,data:r.data,createdAt:new Date().toISOString()};return await u.update($e).set({messages:ch`${$e.messages} || ${JSON.stringify([o])}::jsonb`,updatedAt:new Date}).where(Vr(Et($e.id,n),Et($e.userId,t))),e.json(o,201)});Jr.get("/eval-conversations/:id/messages",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=e.req.query("after"),[o]=await u.select().from($e).where(Vr(Et($e.id,n),Et($e.userId,t)));if(!o)return e.json({error:"Conversation not found"},404);let s=o.messages;if(r){let i=s.filter(a=>a.createdAt>r);return e.json(i)}return e.json(s)});var yL=zr.object({messageId:zr.string().uuid()});Jr.post("/eval-conversations/:id/apply-proposal",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=yL.parse(await e.req.json()),[o]=await u.select().from($e).where(Vr(Et($e.id,n),Et($e.userId,t)));if(!o)return e.json({error:"Conversation not found"},404);let i=o.messages.find(m=>m.id===r.messageId&&m.type==="proposal");if(!i?.data?.proposedContent)return e.json({error:"Proposal message not found or has no content"},400);let[a]=await u.select().from(k).where(Vr(Et(k.id,o.evalTargetId),Et(k.userId,t)));if(!a)return e.json({error:"Target not found"},404);let[c]=await u.insert(k).values({userId:t,name:a.name,type:a.type,content:i.data.proposedContent,description:a.description,metadata:a.metadata,version:a.version+1,parentId:a.id}).returning(),l=await u.select().from(Se).where(Vr(Et(Se.evalTargetId,a.id),gL(Se.retiredAt)));l.length>0&&await u.insert(Se).values(l.map(m=>({evalTargetId:c.id,name:m.name,prompt:m.prompt,expectedOutput:m.expectedOutput,files:m.files,expectations:m.expectations})));let p={id:dh(),role:"assistant",content:`Applied changes \u2014 created v${c.version}`,type:"applied",data:{newVersion:c.version,evalTargetId:c.id},createdAt:new Date().toISOString()};return await u.update($e).set({evalTargetId:c.id,messages:ch`${$e.messages} || ${JSON.stringify([p])}::jsonb`,updatedAt:new Date}).where(Et($e.id,n)),e.json({newTarget:c,message:p})});O();import*as Zi from"node:fs";import*as Ps from"node:path";import{createHash as wL}from"node:crypto";import{fileURLToPath as vL}from"node:url";import{createRequire as IL}from"node:module";import{Hono as bL}from"hono";import{z as vt}from"zod";import{eq as Ns,desc as SL,and as AL,sql as EL}from"drizzle-orm";var xL=Ps.dirname(vL(import.meta.url)),Do=new bL,Vl=null,Jl=null;function TL(){let e=process.env.RULEMETRIC_SKILLS_REGISTRY_PATH;if(e&&Zi.existsSync(e))return e;try{let n=IL(import.meta.url),r=Ps.dirname(n.resolve("@rulemetric/skills-registry/package.json")),o=Ps.join(r,"registry.json");if(Zi.existsSync(o))return o}catch{}let t=Ps.resolve(xL,"../../../../packages/skills-registry/registry.json");return Zi.existsSync(t)?t:null}d(TL,"resolveRegistryPath");function yS(){if(Vl)return Vl;let e=TL();return e?(Vl=JSON.parse(Zi.readFileSync(e,"utf-8")),Vl):null}d(yS,"loadRegistry");function RL(){if(Jl)return Jl;let e=yS();return e?(Jl={version:e.version,generatedAt:e.generatedAt,skills:e.skills.map(({content:t,...n})=>n)},Jl):null}d(RL,"loadRegistryIndex");Do.get("/skills",e=>{let t=RL();return t?e.json(t):e.json({error:"Skills registry not found"},404)});Do.post("/skills/publish",async e=>{let t=e.get("userId"),n=await e.req.json();if(!n.id||!n.name||!n.content)return e.json({error:"Missing required fields: id, name, content"},400);if(n.content.trim().length<20)return e.json({error:"Content too short (minimum 20 characters)"},400);let[r]=await u.insert(ao).values({skillId:n.id,name:n.name,description:n.description,category:n.category,tools:n.tools,tags:n.tags,content:n.content,submittedBy:t}).returning({id:ao.id});return e.json({id:r.id,skillId:n.id,message:`Skill "${n.name}" submitted for review. It will appear in the registry after approval.`},201)});Do.get("/skills/submissions/approved",async e=>{let n=(await u.select().from(ao).where(Ns(ao.status,"approved")).orderBy(SL(ao.createdAt))).map(r=>({id:r.skillId,name:r.name,description:r.description,category:r.category,tags:r.tags??[],tools:r.tools,source:{repo:"community",path:`published/${r.skillId}.md`,url:"",license:"MIT"},content:r.content,popularity:{installs:0},updatedAt:r.updatedAt?.toISOString()??new Date().toISOString()}));return e.json(n)});var wS=vt.object({id:vt.string().min(1),name:vt.string().min(1),description:vt.string(),content:vt.string().min(1),source:vt.object({repo:vt.string(),path:vt.string(),url:vt.string(),license:vt.string().optional()}),tags:vt.array(vt.string()).optional(),category:vt.string().optional(),updatedAt:vt.string().optional(),sourceUpdatedAt:vt.string().optional(),popularity:vt.object({stars:vt.number().int().nonnegative().optional(),installs:vt.number().int().nonnegative().optional()}).optional()}),Use=vt.object({skills:vt.array(wS).max(5e3)});Do.post("/skills/sync-public",async e=>{let t=process.env.RULEMETRIC_REGISTRY_BOT_TOKEN;if(!t)return e.json({error:"Registry bot token not configured"},503);let n=e.req.header("authorization")??"";if((n.startsWith("Bearer ")?n.slice(7):"")!==t)return e.json({error:"Invalid bot token"},401);let o=await e.req.json(),s=vt.object({skills:vt.array(vt.unknown()).max(5e3)}).safeParse(o);if(!s.success)return e.json({error:"Invalid request body",issues:s.error.issues},400);let i=s.data.skills,a=0,c=0,l=0,p=0,m=0;for(let y of i){let v=wS.safeParse(y);if(!v.success){console.warn("[sync-public] Skipping invalid skill entry:",JSON.stringify(v.error.issues)),m++;continue}let h=v.data,f=wL("sha256").update(h.content).digest("hex"),w=`public_skill::${h.source.repo}::${h.id}`,b=h.updatedAt??"1.0.0",[I]=await u.select({id:g.id,contentHash:g.contentHash,popularityScore:g.popularityScore,sourceUpdatedAt:g.sourceUpdatedAt}).from(g).where(AL(Ns(g.name,h.id),Ns(g.scope,"public"))),S=h.popularity&&Math.max(h.popularity.stars??0,h.popularity.installs??0)||null,A=h.sourceUpdatedAt?new Date(h.sourceUpdatedAt):null,E=A&&!Number.isNaN(A.getTime())?A:null;if(I)if(I.contentHash!==f){let D=!1;for(let j=0;j<=4;j++)try{await u.transaction(async P=>{await P.select({id:g.id}).from(g).where(Ns(g.id,I.id)).for("update"),await P.update(g).set({description:h.description||h.name,content:h.content,contentHash:f,version:b,upstreamVersion:b,popularityScore:S,sourceUpdatedAt:E,frontmatter:{name:h.name,source:h.source,category:h.category??null,popularity:h.popularity??null},updatedAt:new Date}).where(Ns(g.id,I.id));let[$]=await P.select({max:EL`coalesce(max(${Ie.versionNumber}), 0)`}).from(Ie).where(Ns(Ie.instructionId,I.id));await P.insert(Ie).values({instructionId:I.id,versionNumber:($?.max??0)+1,content:h.content,frontmatter:{name:h.name,source:h.source,category:h.category??null},changeSummary:`Synced from registry (${b})`})}),D=!0;break}catch(P){if(P.cause?.code==="23505"){if(j<4)continue;break}throw P}if(!D)continue;c++,p++}else{let R=I.sourceUpdatedAt?.getTime()??null,D=E?.getTime()??null,j=I.popularityScore!==S,P=E!==null&&R!==D;(j||P)&&await u.update(g).set({...j?{popularityScore:S}:{},...P?{sourceUpdatedAt:E}:{}}).where(Ns(g.id,I.id)),l++}else{let[R]=await u.insert(g).values({name:h.id,description:h.description||h.name,type:"skill",scope:"public",scopeRef:null,version:b,content:h.content,frontmatter:{name:h.name,source:h.source,category:h.category??null,popularity:h.popularity??null},tags:h.tags??null,contentHash:f,contextIdentity:w,upstreamVersion:b,popularityScore:S,sourceUpdatedAt:E}).returning({id:g.id});R&&(a++,await u.insert(Ie).values({instructionId:R.id,versionNumber:1,content:h.content,frontmatter:{name:h.name,source:h.source,category:h.category??null},changeSummary:"Initial sync from public registry"}),p++)}}return e.json({inserted:a,updated:c,unchanged:l,versionsCreated:p,skipped:m})});Do.get("/skills/:id",e=>{let t=yS();if(!t?.skills)return e.json({error:"Skills registry not found"},404);let n=t.skills.find(r=>r.id===e.req.param("id"));return n?e.json(n):e.json({error:"Skill not found"},404)});O();import{Hono as UL}from"hono";import{desc as HL,eq as BL}from"drizzle-orm";O();import{eq as IS,and as $L}from"drizzle-orm";O();var kL=/pricing|rate.?limit|rate.?cap|messages.?per|tokens.?per|RPM|TPM|TPD|cache.?write|cache.?read|context.?window|5.?hour|five.?hour|7.?day|seven.?day|weekly.?limit/i,jL="claude-haiku-4-5-20251001",NL=1e3,PL=.7,CL=`You extract pricing and rate-limit changes from AI provider release notes.
1028
+ `);return e.json({memories:[...f]})});pn.get("/memories/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select().from(F).where(qn(Ze(F.id,n),Ze(F.userId,t))).limit(1);return r?e.json(r):e.json({error:"not found"},404)});pn.post("/memories",async e=>{let t=e.get("userId"),n=dC.safeParse(await e.req.json().catch(()=>({})));if(!n.success)return e.json({error:"invalid body",details:n.error.flatten()},400);let{kind:r,title:o,body:s,projectId:i,projectPath:c,source:a}=n.data,l=i??await oh(c??null),[m]=await d.select({orgId:T.activeOrgId}).from(T).where(Ze(T.id,t)).limit(1),[p]=await d.insert(F).values({userId:t,orgId:m?.orgId??null,projectId:l,kind:r,title:o,body:s,source:a??"manual",status:"active"}).returning();return e.json(p,201)});pn.patch("/memories/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=lC.safeParse(await e.req.json().catch(()=>({})));if(!r.success)return e.json({error:"invalid body",details:r.error.flatten()},400);let[o]=await d.select().from(F).where(qn(Ze(F.id,n),Ze(F.userId,t))).limit(1);if(!o)return e.json({error:"not found"},404);let{kind:s,title:i,body:c,status:a}=r.data,l=s!==void 0&&s!==o.kind||i!==void 0&&i!==o.title||c!==void 0&&c!==o.body,[m]=await d.update(F).set({kind:s??o.kind,title:i??o.title,body:c??o.body,status:a??o.status,version:l?o.version+1:o.version,updatedAt:new Date}).where(qn(Ze(F.id,n),Ze(F.userId,t))).returning();return e.json(m)});pn.delete("/memories/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.update(F).set({status:"archived",updatedAt:new Date}).where(qn(Ze(F.id,n),Ze(F.userId,t))).returning({id:F.id,status:F.status});return r?e.json({ok:!0,id:r.id,status:r.status}):e.json({error:"not found"},404)});var mC=ot.object({externalSessionId:ot.string().min(1),projectPath:ot.string().optional()});pn.post("/memories/:id/exposures",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=mC.safeParse(await e.req.json().catch(()=>({})));if(!r.success)return e.json({error:"invalid body",details:r.error.flatten()},400);let[o]=await d.select({id:F.id,version:F.version,projectId:F.projectId}).from(F).where(qn(Ze(F.id,n),Ze(F.userId,t))).limit(1);return o?(await d.insert(qu).values({userId:t,externalSessionId:r.data.externalSessionId,treatmentType:"memory",treatmentId:o.id,treatmentVersion:o.version,method:"injected",projectId:o.projectId}).onConflictDoNothing(),e.json({ok:!0})):e.json({error:"not found"},404)});var pC=ot.object({taskPrompt:ot.string().min(1).max(8e3),expectations:ot.array(ot.string().min(1)).min(1).max(20),trials:ot.number().int().min(1).max(50).default(10),model:ot.string().min(1).max(100).optional()});pn.post("/memories/:id/experiments",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=pC.safeParse(await e.req.json().catch(()=>({})));if(!r.success)return e.json({error:"invalid body",details:r.error.flatten()},400);let[o]=await d.select({id:F.id,version:F.version}).from(F).where(qn(Ze(F.id,n),Ze(F.userId,t))).limit(1);if(!o)return e.json({error:"not found"},404);let[s]=await d.insert(Nt).values({memoryId:o.id,userId:t,memoryVersion:o.version,taskPrompt:r.data.taskPrompt,expectations:r.data.expectations,trials:r.data.trials,model:r.data.model??null,status:"pending"}).returning(),{noLiveWorker:i}=await Av({experimentId:s.id,userId:t});return e.json({experiment:s,noLiveWorker:i},201)});pn.get("/memories/:id/experiments",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select({id:F.id}).from(F).where(qn(Ze(F.id,n),Ze(F.userId,t))).limit(1);if(!r)return e.json({error:"not found"},404);let o=await d.select().from(Nt).where(qn(Ze(Nt.memoryId,n),Ze(Nt.userId,t))).orderBy(Fl(Nt.createdAt)).limit(20);return e.json({experiments:o})});pn.get("/memory-experiments/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select().from(Nt).where(qn(Ze(Nt.id,n),Ze(Nt.userId,t))).limit(1);return r?e.json(r):e.json({error:"not found"},404)});var fC=ot.object({status:ot.enum(["running","completed","failed"]),error:ot.string().max(1e3).nullable().optional(),result:ot.record(ot.unknown()).optional()});pn.patch("/memory-experiments/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=fC.safeParse(await e.req.json().catch(()=>({})));if(!r.success)return e.json({error:"invalid body",details:r.error.flatten()},400);let{status:o,error:s,result:i}=r.data,[c]=await d.select({id:Nt.id,status:Nt.status}).from(Nt).where(qn(Ze(Nt.id,n),Ze(Nt.userId,t))).limit(1);if(!c)return e.json({error:"not found"},404);if(c.status==="completed"||c.status==="failed")return e.json({error:`experiment is already terminal (status='${c.status}')`,code:"INVALID_STATE"},409);let a=o==="completed"||o==="failed",[l]=await d.update(Nt).set({status:o,...s!==void 0?{error:s}:{},...i!==void 0?{result:i}:{},...o==="running"?{startedAt:new Date}:{},...a?{completedAt:new Date}:{}}).where(qn(Ze(Nt.id,n),Ze(Nt.userId,t))).returning();return e.json(l)});C();import{randomBytes as gC,createHash as hC}from"node:crypto";import{Hono as _C}from"hono";import{z as s0}from"zod";import{eq as Wl,and as yC,isNull as wC}from"drizzle-orm";var Xi=new _C;function vC(){let n=`rm_${gC(32).toString("base64url")}`,r=hC("sha256").update(n).digest("hex"),o=n.slice(0,11);return{plaintext:n,hash:r,prefix:o}}u(vC,"generateApiKey");var IC=s0.object({name:s0.string().min(1).max(100)});Xi.post("/auth/api-keys",async e=>{let t=e.get("userId"),n=await e.req.json(),r=IC.parse(n),{plaintext:o,hash:s,prefix:i}=vC(),[c]=await d.insert(be).values({userId:t,name:r.name,keyHash:s,keyPrefix:i}).returning();return e.json({id:c.id,name:c.name,key:o,keyPrefix:i,createdAt:c.createdAt},201)});Xi.get("/auth/api-keys",async e=>{let t=e.get("userId"),n=await d.select({id:be.id,name:be.name,keyPrefix:be.keyPrefix,lastUsedAt:be.lastUsedAt,expiresAt:be.expiresAt,revokedAt:be.revokedAt,createdAt:be.createdAt}).from(be).where(Wl(be.userId,t)).orderBy(be.createdAt);return e.json(n)});Xi.delete("/auth/api-keys/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select({id:be.id}).from(be).where(yC(Wl(be.id,n),Wl(be.userId,t),wC(be.revokedAt)));return r?(await d.update(be).set({revokedAt:new Date}).where(Wl(be.id,n)),e.json({revoked:!0})):e.json({error:"API key not found"},404)});C();import{Hono as bC}from"hono";import{z as zr}from"zod";import{eq as Et,and as Vr,isNull as SC,sql as sh}from"drizzle-orm";import{randomUUID as ih}from"node:crypto";var Jr=new bC;Jr.post("/eval-targets/:id/conversations",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select({id:k.id}).from(k).where(Vr(Et(k.id,n),Et(k.userId,t)));if(!r)return e.json({error:"Target not found"},404);let[o]=await d.select().from(Me).where(Vr(Et(Me.evalTargetId,n),Et(Me.userId,t),Et(Me.status,"active")));if(o)return e.json(o);let[s]=await d.insert(Me).values({evalTargetId:n,userId:t}).returning();return e.json(s,201)});Jr.get("/eval-targets/:id/conversations",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select().from(Me).where(Vr(Et(Me.evalTargetId,n),Et(Me.userId,t),Et(Me.status,"active")));return r?e.json(r):e.json(null)});var AC=zr.object({content:zr.string().min(1).max(5e3)});Jr.post("/eval-conversations/:id/messages",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=AC.parse(await e.req.json()),[o]=await d.select().from(Me).where(Vr(Et(Me.id,n),Et(Me.userId,t)));if(!o)return e.json({error:"Conversation not found"},404);let s=ih(),i={id:s,role:"user",content:r.content,createdAt:new Date().toISOString()};await d.update(Me).set({messages:sh`${Me.messages} || ${JSON.stringify([i])}::jsonb`,updatedAt:new Date}).where(Et(Me.id,n));let c={type:"conversation",conversationId:n,messageId:s,messageContent:r.content},{id:a,noLiveWorker:l}=await Tt({taskName:"process_conversation",payload:{evalTargetId:o.evalTargetId,config:c},userId:t,mirror:{userId:t,evalTargetId:o.evalTargetId,config:c}});return e.json({message:i,jobId:a,noLiveWorker:l},201)});var EC=zr.object({content:zr.string(),type:zr.enum(["text","status","results","proposal","applied","generated","comparison"]).default("text"),data:zr.record(zr.unknown()).optional()});Jr.post("/eval-conversations/:id/messages/assistant",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=EC.parse(await e.req.json()),o={id:ih(),role:"assistant",content:r.content,type:r.type,data:r.data,createdAt:new Date().toISOString()};return await d.update(Me).set({messages:sh`${Me.messages} || ${JSON.stringify([o])}::jsonb`,updatedAt:new Date}).where(Vr(Et(Me.id,n),Et(Me.userId,t))),e.json(o,201)});Jr.get("/eval-conversations/:id/messages",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=e.req.query("after"),[o]=await d.select().from(Me).where(Vr(Et(Me.id,n),Et(Me.userId,t)));if(!o)return e.json({error:"Conversation not found"},404);let s=o.messages;if(r){let i=s.filter(c=>c.createdAt>r);return e.json(i)}return e.json(s)});var xC=zr.object({messageId:zr.string().uuid()});Jr.post("/eval-conversations/:id/apply-proposal",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=xC.parse(await e.req.json()),[o]=await d.select().from(Me).where(Vr(Et(Me.id,n),Et(Me.userId,t)));if(!o)return e.json({error:"Conversation not found"},404);let i=o.messages.find(p=>p.id===r.messageId&&p.type==="proposal");if(!i?.data?.proposedContent)return e.json({error:"Proposal message not found or has no content"},400);let[c]=await d.select().from(k).where(Vr(Et(k.id,o.evalTargetId),Et(k.userId,t)));if(!c)return e.json({error:"Target not found"},404);let[a]=await d.insert(k).values({userId:t,name:c.name,type:c.type,content:i.data.proposedContent,description:c.description,metadata:c.metadata,version:c.version+1,parentId:c.id}).returning(),l=await d.select().from(Ie).where(Vr(Et(Ie.evalTargetId,c.id),SC(Ie.retiredAt)));l.length>0&&await d.insert(Ie).values(l.map(p=>({evalTargetId:a.id,name:p.name,prompt:p.prompt,expectedOutput:p.expectedOutput,files:p.files,expectations:p.expectations})));let m={id:ih(),role:"assistant",content:`Applied changes \u2014 created v${a.version}`,type:"applied",data:{newVersion:a.version,evalTargetId:a.id},createdAt:new Date().toISOString()};return await d.update(Me).set({evalTargetId:a.id,messages:sh`${Me.messages} || ${JSON.stringify([m])}::jsonb`,updatedAt:new Date}).where(Et(Me.id,n)),e.json({newTarget:a,message:m})});C();import*as Qi from"node:fs";import*as Ps from"node:path";import{createHash as TC}from"node:crypto";import{fileURLToPath as RC}from"node:url";import{createRequire as kC}from"node:module";import{Hono as NC}from"hono";import{z as vt}from"zod";import{eq as js,desc as jC,and as PC,sql as DC}from"drizzle-orm";var OC=Ps.dirname(RC(import.meta.url)),Oo=new NC,zl=null,Vl=null;function CC(){let e=process.env.RULEMETRIC_SKILLS_REGISTRY_PATH;if(e&&Qi.existsSync(e))return e;try{let n=kC(import.meta.url),r=Ps.dirname(n.resolve("@rulemetric/skills-registry/package.json")),o=Ps.join(r,"registry.json");if(Qi.existsSync(o))return o}catch{}let t=Ps.resolve(OC,"../../../../packages/skills-registry/registry.json");return Qi.existsSync(t)?t:null}u(CC,"resolveRegistryPath");function i0(){if(zl)return zl;let e=CC();return e?(zl=JSON.parse(Qi.readFileSync(e,"utf-8")),zl):null}u(i0,"loadRegistry");function LC(){if(Vl)return Vl;let e=i0();return e?(Vl={version:e.version,generatedAt:e.generatedAt,skills:e.skills.map(({content:t,...n})=>n)},Vl):null}u(LC,"loadRegistryIndex");Oo.get("/skills",e=>{let t=LC();return t?e.json(t):e.json({error:"Skills registry not found"},404)});Oo.post("/skills/publish",async e=>{let t=e.get("userId"),n=await e.req.json();if(!n.id||!n.name||!n.content)return e.json({error:"Missing required fields: id, name, content"},400);if(n.content.trim().length<20)return e.json({error:"Content too short (minimum 20 characters)"},400);let[r]=await d.insert(ao).values({skillId:n.id,name:n.name,description:n.description,category:n.category,tools:n.tools,tags:n.tags,content:n.content,submittedBy:t}).returning({id:ao.id});return e.json({id:r.id,skillId:n.id,message:`Skill "${n.name}" submitted for review. It will appear in the registry after approval.`},201)});Oo.get("/skills/submissions/approved",async e=>{let n=(await d.select().from(ao).where(js(ao.status,"approved")).orderBy(jC(ao.createdAt))).map(r=>({id:r.skillId,name:r.name,description:r.description,category:r.category,tags:r.tags??[],tools:r.tools,source:{repo:"community",path:`published/${r.skillId}.md`,url:"",license:"MIT"},content:r.content,popularity:{installs:0},updatedAt:r.updatedAt?.toISOString()??new Date().toISOString()}));return e.json(n)});var a0=vt.object({id:vt.string().min(1),name:vt.string().min(1),description:vt.string(),content:vt.string().min(1),source:vt.object({repo:vt.string(),path:vt.string(),url:vt.string(),license:vt.string().optional()}),tags:vt.array(vt.string()).optional(),category:vt.string().optional(),updatedAt:vt.string().optional(),sourceUpdatedAt:vt.string().optional(),popularity:vt.object({stars:vt.number().int().nonnegative().optional(),installs:vt.number().int().nonnegative().optional()}).optional()}),Dte=vt.object({skills:vt.array(a0).max(5e3)});Oo.post("/skills/sync-public",async e=>{let t=process.env.RULEMETRIC_REGISTRY_BOT_TOKEN;if(!t)return e.json({error:"Registry bot token not configured"},503);let n=e.req.header("authorization")??"";if((n.startsWith("Bearer ")?n.slice(7):"")!==t)return e.json({error:"Invalid bot token"},401);let o=await e.req.json(),s=vt.object({skills:vt.array(vt.unknown()).max(5e3)}).safeParse(o);if(!s.success)return e.json({error:"Invalid request body",issues:s.error.issues},400);let i=s.data.skills,c=0,a=0,l=0,m=0,p=0;for(let _ of i){let I=a0.safeParse(_);if(!I.success){console.warn("[sync-public] Skipping invalid skill entry:",JSON.stringify(I.error.issues)),p++;continue}let h=I.data,f=TC("sha256").update(h.content).digest("hex"),w=`public_skill::${h.source.repo}::${h.id}`,b=h.updatedAt??"1.0.0",[v]=await d.select({id:g.id,contentHash:g.contentHash,popularityScore:g.popularityScore,sourceUpdatedAt:g.sourceUpdatedAt}).from(g).where(PC(js(g.name,h.id),js(g.scope,"public"))),S=h.popularity&&Math.max(h.popularity.stars??0,h.popularity.installs??0)||null,A=h.sourceUpdatedAt?new Date(h.sourceUpdatedAt):null,E=A&&!Number.isNaN(A.getTime())?A:null;if(v)if(v.contentHash!==f){let P=!1;for(let N=0;N<=4;N++)try{await d.transaction(async D=>{await D.select({id:g.id}).from(g).where(js(g.id,v.id)).for("update"),await D.update(g).set({description:h.description||h.name,content:h.content,contentHash:f,version:b,upstreamVersion:b,popularityScore:S,sourceUpdatedAt:E,frontmatter:{name:h.name,source:h.source,category:h.category??null,popularity:h.popularity??null},updatedAt:new Date}).where(js(g.id,v.id));let[q]=await D.select({max:DC`coalesce(max(${Se.versionNumber}), 0)`}).from(Se).where(js(Se.instructionId,v.id));await D.insert(Se).values({instructionId:v.id,versionNumber:(q?.max??0)+1,content:h.content,frontmatter:{name:h.name,source:h.source,category:h.category??null},changeSummary:`Synced from registry (${b})`})}),P=!0;break}catch(D){if(D.cause?.code==="23505"){if(N<4)continue;break}throw D}if(!P)continue;a++,m++}else{let R=v.sourceUpdatedAt?.getTime()??null,P=E?.getTime()??null,N=v.popularityScore!==S,D=E!==null&&R!==P;(N||D)&&await d.update(g).set({...N?{popularityScore:S}:{},...D?{sourceUpdatedAt:E}:{}}).where(js(g.id,v.id)),l++}else{let[R]=await d.insert(g).values({name:h.id,description:h.description||h.name,type:"skill",scope:"public",scopeRef:null,version:b,content:h.content,frontmatter:{name:h.name,source:h.source,category:h.category??null,popularity:h.popularity??null},tags:h.tags??null,contentHash:f,contextIdentity:w,upstreamVersion:b,popularityScore:S,sourceUpdatedAt:E}).returning({id:g.id});R&&(c++,await d.insert(Se).values({instructionId:R.id,versionNumber:1,content:h.content,frontmatter:{name:h.name,source:h.source,category:h.category??null},changeSummary:"Initial sync from public registry"}),m++)}}return e.json({inserted:c,updated:a,unchanged:l,versionsCreated:m,skipped:p})});Oo.get("/skills/:id",e=>{let t=i0();if(!t?.skills)return e.json({error:"Skills registry not found"},404);let n=t.skills.find(r=>r.id===e.req.param("id"));return n?e.json(n):e.json({error:"Skill not found"},404)});C();import{Hono as GC}from"hono";import{desc as YC,eq as XC}from"drizzle-orm";C();import{eq as u0,and as VC}from"drizzle-orm";C();var MC=/pricing|rate.?limit|rate.?cap|messages.?per|tokens.?per|RPM|TPM|TPD|cache.?write|cache.?read|context.?window|5.?hour|five.?hour|7.?day|seven.?day|weekly.?limit/i,$C="claude-haiku-4-5-20251001",qC=1e3,UC=.7,HC=`You extract pricing and rate-limit changes from AI provider release notes.
1107
1029
  Return a JSON object: {
1108
1030
  "observations": [
1109
1031
  {
@@ -1118,71 +1040,71 @@ Return a JSON object: {
1118
1040
  }
1119
1041
  Only emit observations if the release notes EXPLICITLY state a numeric value.
1120
1042
  Do NOT speculate. Do NOT emit observations for "increased by X%" without an absolute number.
1121
- Return { "observations": [] } if nothing concrete.`;function OL(){let e=process.env.ANTHROPIC_API_KEY;if(!e)return null;let t=uc("anthropic",e);return async n=>{let r=await t.complete(n,{model:jL,maxTokens:NL,temperature:0});return{text:r.text,usage:{inputTokens:r.usage?.inputTokens??0,outputTokens:r.usage?.outputTokens??0}}}}d(OL,"defaultLlm");async function DL(e){await u.insert(we).values({provider:"anthropic",plan:e.plan,limitType:e.limitType,value:String(e.value),unit:e.unit,comparator:e.comparator,sourceType:e.sourceType,sourceUrl:e.sourceUrl,sourceEvidence:e.sourceEvidence,confidence:String(e.confidence)})}d(DL,"defaultObserve");function ML(e){return`${CL}
1043
+ Return { "observations": [] } if nothing concrete.`;function BC(){let e=process.env.ANTHROPIC_API_KEY;if(!e)return null;let t=cc("anthropic",e);return async n=>{let r=await t.complete(n,{model:$C,maxTokens:qC,temperature:0});return{text:r.text,usage:{inputTokens:r.usage?.inputTokens??0,outputTokens:r.usage?.outputTokens??0}}}}u(BC,"defaultLlm");async function FC(e){await d.insert(ye).values({provider:"anthropic",plan:e.plan,limitType:e.limitType,value:String(e.value),unit:e.unit,comparator:e.comparator,sourceType:e.sourceType,sourceUrl:e.sourceUrl,sourceEvidence:e.sourceEvidence,confidence:String(e.confidence)})}u(FC,"defaultObserve");function WC(e){return`${HC}
1122
1044
 
1123
1045
  Release notes (harness=${e.harness}, version=${e.version}):
1124
1046
 
1125
- ${e.body??""}`}d(ML,"buildPrompt");function LL(e){let t=e.trim().replace(/^```(?:json)?\s*/i,"").replace(/\s*```$/i,"").trim(),n=t.indexOf("{"),r=t.lastIndexOf("}"),o=n>=0&&r>n?t.slice(n,r+1):t,s=JSON.parse(o);if(!s.observations||!Array.isArray(s.observations))return{observations:[]};let i=[];for(let a of s.observations){if(!a||typeof a!="object")continue;let c=a;if(typeof c.limitType!="string"||typeof c.plan!="string"||typeof c.value!="number"||!Number.isFinite(c.value)||typeof c.unit!="string")continue;let l=c.comparator===">="||c.comparator==="<="?c.comparator:"=";i.push({limitType:c.limitType,plan:c.plan,value:c.value,unit:c.unit,comparator:l,evidence_quote:typeof c.evidence_quote=="string"?c.evidence_quote:""})}return{observations:i}}d(LL,"parseLlmJson");async function vS(e,t={}){let n=e.body??"";if(!kL.test(n))return{observations:[],llm_called:!1,reason:"no keywords matched"};let r=t.llm===void 0?OL():t.llm;if(!r)return console.warn("[harness-release-extractor] ANTHROPIC_API_KEY missing; skipping extraction"),{observations:[],llm_called:!1,reason:"no LLM available"};let o,s;try{let c=await r(ML(e));o=c.text,s=c.usage}catch(c){return{observations:[],llm_called:!0,error:`LLM call failed: ${c instanceof Error?c.message:String(c)}`}}let i;try{i=LL(o).observations}catch(c){return{observations:[],llm_called:!0,llm_tokens:{input:s.inputTokens,output:s.outputTokens},error:`failed to parse LLM JSON: ${c instanceof Error?c.message:String(c)}`}}if(i.length===0)return{observations:[],llm_called:!0,llm_tokens:{input:s.inputTokens,output:s.outputTokens},reason:"LLM returned no observations"};let a=t.observe??DL;for(let c of i)await a({plan:c.plan,limitType:c.limitType,value:c.value,unit:c.unit,comparator:c.comparator,sourceType:"release_notes",sourceUrl:e.url,sourceEvidence:{harness:e.harness,version:e.version,publishedAt:e.publishedAt.toISOString(),quote:c.evidence_quote,fullBody:n},confidence:PL,provider:"anthropic"});return{observations:i,llm_called:!0,llm_tokens:{input:s.inputTokens,output:s.outputTokens}}}d(vS,"extractAndPostObservationsFromRelease");var bS=[{harness:"claude_code",repo:"anthropics/claude-code"}];function qL(e){let t=[],n=[],r=[],o=e.split(`
1126
- `);for(let s of o){let i=s.trim();if(!i.startsWith("- ")&&!i.startsWith("* "))continue;let a=i.replace(/^[-*]\s+/,"").trim();if(!a)continue;let c=a.toLowerCase();c.startsWith("security:")||c.includes("security fix")||c.includes("cve-")?r.push(a):c.startsWith("fixed ")||c.startsWith("fix ")||c.startsWith("fixed:")?n.push(a):t.push(a)}return{features:t,fixes:n,security:r}}d(qL,"parseReleaseBody");async function Gl(e){let t=e?bS.filter(o=>o.harness===e):bS,n=0,r=0;for(let o of t){let s=`https://api.github.com/repos/${o.repo}/releases?per_page=100`,i={Accept:"application/vnd.github+json"};process.env.GITHUB_TOKEN&&(i.Authorization=`Bearer ${process.env.GITHUB_TOKEN}`);let a=await fetch(s,{headers:i});if(!a.ok)continue;let c=await a.json();r+=c.length;for(let l of c){let p=qL(l.body??"");if((await u.select({id:Pt.id}).from(Pt).where($L(IS(Pt.harness,o.harness),IS(Pt.version,l.tag_name)))).length===0){await u.insert(Pt).values({harness:o.harness,version:l.tag_name,publishedAt:new Date(l.published_at),title:l.name,body:l.body,categories:p,url:l.html_url}),n++;try{await vS({harness:o.harness,version:l.tag_name,url:l.html_url,publishedAt:new Date(l.published_at),body:l.body})}catch(y){console.warn("release notes extraction failed:",y)}}}}return{synced:n,total:r}}d(Gl,"syncHarnessReleases");var Qc=new UL;Qc.get("/harness-releases",async e=>{let t=e.req.query("harness"),n=Math.min(Number(e.req.query("limit")??50),100),r=t?BL(Pt.harness,t):void 0,o=await u.select({id:Pt.id,harness:Pt.harness,version:Pt.version,publishedAt:Pt.publishedAt,title:Pt.title,categories:Pt.categories,url:Pt.url}).from(Pt).where(r).orderBy(HL(Pt.publishedAt)).limit(n);return e.json(o)});Qc.post("/harness-releases/sync",async e=>{let t=await e.req.json().catch(()=>({})),n=await Gl(t.harness);return e.json(n)});O();import{Hono as FL}from"hono";import{and as Kl,desc as WL,eq as ea,isNull as uh,sql as zL}from"drizzle-orm";var ta=new FL;ta.get("/notifications",async e=>{let t=e.get("userId"),n=Math.min(parseInt(e.req.query("limit")??"20",10),100),r=parseInt(e.req.query("offset")??"0",10),s=e.req.query("unread")==="true"?Kl(ea(bt.userId,t),uh(bt.readAt)):ea(bt.userId,t),i=await u.select().from(bt).where(s).orderBy(WL(bt.createdAt)).limit(n).offset(r),[{count:a}]=await u.select({count:zL`count(*)::int`}).from(bt).where(Kl(ea(bt.userId,t),uh(bt.readAt)));return e.json({items:i,unreadCount:a})});ta.post("/notifications/:id/read",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await u.update(bt).set({readAt:new Date}).where(Kl(ea(bt.id,t),ea(bt.userId,n))).returning();return r?e.json(r):e.json({error:"Not found"},404)});ta.post("/notifications/read-all",async e=>{let t=e.get("userId");return await u.update(bt).set({readAt:new Date}).where(Kl(ea(bt.userId,t),uh(bt.readAt))),e.json({success:!0})});O();import{Hono as VL}from"hono";import{z as Zt}from"zod";import{eq as Ir,and as Yl,desc as JL,ne as GL}from"drizzle-orm";var Mo=new VL;function KL(e){let t=e.terminalTarget;if(!t||typeof t!="object")return null;let n=t;return n.kind!=="tmux"||typeof n.target!="string"||typeof n.attachCommand!="string"?null:{sessionId:typeof e.sessionId=="string"?e.sessionId:void 0,terminalTarget:{kind:"tmux",target:n.target,attachCommand:n.attachCommand,live:typeof n.live=="boolean"?n.live:void 0}}}d(KL,"parseTerminalTargetResult");async function YL(e){let t=KL(e.result);if(!t?.terminalTarget)return;let n=e.config&&typeof e.config=="object"?e.config:{},r=typeof n.projectPath=="string"?n.projectPath:null,o=typeof n.resumeSessionId=="string"?n.resumeSessionId:null,[s]=o?await u.select({id:_.id}).from(_).where(Yl(Ir(_.userId,e.userId),Ir(_.externalSessionId,o))).limit(1):[];await u.insert(Ve).values({userId:e.userId,sessionId:s?.id??null,externalSessionId:o,kind:"tmux",target:t.terminalTarget.target,status:t.terminalTarget.live===!1?"unknown":"active",attachCommand:t.terminalTarget.attachCommand,projectPath:r,metadata:{launchJobId:e.jobId,launcherSessionId:t.sessionId}}).onConflictDoUpdate({target:[Ve.userId,Ve.target],set:{sessionId:s?.id??null,externalSessionId:o,status:t.terminalTarget.live===!1?"unknown":"active",attachCommand:t.terminalTarget.attachCommand,projectPath:r,metadata:{launchJobId:e.jobId,launcherSessionId:t.sessionId},lastSeenAt:new Date,updatedAt:new Date}})}d(YL,"upsertTerminalTargetFromLaunchResult");var XL=Zt.object({tool:Zt.string().min(1),config:Zt.object({projectPath:Zt.string().min(1),prompt:Zt.string().optional(),systemPrompt:Zt.string().optional(),model:Zt.string().optional(),mode:Zt.enum(["headless","interactive"]).default("interactive"),timeout:Zt.number().int().positive().optional(),resumeSessionId:Zt.string().optional()})});Mo.post("/launch-jobs",async e=>{let t=e.get("userId"),n=await e.req.json(),r=XL.parse(n),{id:o,noLiveWorker:s}=await Rt({taskName:"process_launch",payload:{tool:r.tool,config:r.config},userId:t,mirror:{userId:t,tool:r.tool,config:r.config}}),[i]=await u.select().from(ce).where(Ir(ce.id,o));return e.json({...i,noLiveWorker:s},201)});Mo.get("/launch-jobs",async e=>{let t=e.get("userId"),n=Number(e.req.query("limit")??50),r=await u.select().from(ce).where(Ir(ce.userId,t)).orderBy(JL(ce.createdAt)).limit(n);return e.json(r)});var QL=Zt.object({status:Zt.enum(["running","completed","failed"]).optional(),attempts:Zt.number().int().nonnegative().optional(),error:Zt.string().optional(),result:Zt.record(Zt.unknown()).optional()});Mo.patch("/launch-jobs/:id/state",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=QL.parse(await e.req.json()),o={updatedAt:new Date};r.attempts!==void 0&&(o.attempts=r.attempts),r.status&&(o.status=r.status),r.error&&(o.error=r.error),r.result!==void 0&&(o.result=r.result),(r.status==="completed"||r.status==="failed")&&(o.completedAt=new Date);let[s]=await u.update(ce).set(o).where(Yl(Ir(ce.id,n),Ir(ce.userId,t),GL(ce.status,"cancelled"))).returning();if(!s){let[i]=await u.select().from(ce).where(Yl(Ir(ce.id,n),Ir(ce.userId,t)));return i?e.json(i):e.json({error:"Job not found"},404)}return r.result!==void 0&&await YL({userId:t,jobId:n,config:s.config,result:r.result}),e.json(s)});Mo.post("/launch-jobs/:id/cancel",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.update(ce).set({status:"cancelled",updatedAt:new Date}).where(Yl(Ir(ce.id,n),Ir(ce.userId,t))).returning();return r?e.json(r):e.json({error:"Job not found"},404)});Mo.get("/launchers",async e=>{let{getAvailableLaunchers:t}=await Promise.resolve().then(()=>(ml(),Zb));return e.json(t())});O();import{Hono as ZL}from"hono";import{z as $n}from"zod";import{eq as xe,and as Ut,desc as Ql,inArray as Xl,isNull as e$,ne as t$}from"drizzle-orm";ml();var br=new ZL,n$=$n.object({tool:$n.string().min(1),model:$n.string().optional(),label:$n.string().optional()}),r$=$n.object({title:$n.string().optional(),projectPath:$n.string().min(1),gitRemote:$n.string().optional(),baseBranch:$n.string().optional(),prompt:$n.string().optional(),autoWorktree:$n.boolean().optional(),sessions:$n.array(n$).min(1).max(8)});function o$(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/(^-|-$)/g,"")||"tool"}d(o$,"sanitizeTool");var s$=new Set(["pending","claimed","running"]);var i$=1800*1e3;function SS(e,t){if(e==="cancelled")return!0;if(e!=="completed"&&e!=="failed"||t==null)return!1;let n=t instanceof Date?t.getTime():Date.parse(t);return Number.isFinite(n)?Date.now()-n>i$:!1}d(SS,"canSkipRollup");function AS(e,t,n){if(e==="cancelled")return"cancelled";let r=t.length>0,o=t.some(a=>a.endedAt==null),s=n.some(a=>s$.has(a.status));return n.length>0&&n.every(a=>a.status==="failed")&&!r?"failed":o||s&&r?"running":r&&!o&&!s?"completed":"pending"}d(AS,"rollupRunStatus");async function ES(e){if(e.rolled===e.stored)return;let t=e.rolled==="completed"||e.rolled==="failed"||e.rolled==="cancelled",n={status:e.rolled,updatedAt:new Date};t&&!e.hadCompletedAt&&(n.completedAt=new Date);try{await u.update(X).set(n).where(Ut(xe(X.id,e.runId),xe(X.userId,e.userId),t$(X.status,"cancelled")))}catch{}}d(ES,"persistRolledUpStatus");function a$(e){return Array.isArray(e)?e.length:e&&typeof e=="object"?Object.values(e).reduce((t,n)=>t+(typeof n=="number"&&n>0?n:0),0):0}d(a$,"frictionCount");async function c$(e,t){if(!e||typeof e!="object")return null;let n=e,r="claude-sonnet-4-6",o=No(r),s={input_tokens:n.input_tokens??0,output_tokens:n.output_tokens??0,cache_read_input_tokens:n.cache_read_input_tokens??0,cache_creation_5m:n.cache_creation_5m??0,cache_creation_1h:n.cache_creation_1h??0,cache_creation_input_tokens:n.cache_creation_input_tokens??0},i=await Fr(u,s,r,t,o);return i?{...i,estimated:!0}:null}d(c$,"deriveSessionCost");async function xS(e,t){let[n]=await u.select({id:X.id,autoWorktree:X.autoWorktree}).from(X).where(Ut(xe(X.id,e),xe(X.userId,t))).limit(1);if(!n||!n.autoWorktree)return{linked:0};let r=await u.select({config:ce.config,result:ce.result}).from(ce).where(Ut(xe(ce.runId,e),xe(ce.userId,t))),o=new Set;for(let i of r){let a=i.result??{};typeof a.worktreePath=="string"&&a.worktreePath&&o.add(a.worktreePath);let c=i.config??{};c.worktree?.create&&typeof c.worktree.branch=="string"&&typeof c.projectPath=="string"&&o.add(pl({repoRoot:c.projectPath,branch:c.worktree.branch}))}return o.size===0?{linked:0}:{linked:(await u.update(_).set({runId:e}).where(Ut(xe(_.userId,t),e$(_.runId),Xl(_.projectPath,[...o]))).returning({id:_.id})).length}}d(xS,"linkRunSessions");br.post("/runs",async e=>{let t=e.get("userId"),n=await e.req.json(),r=r$.parse(n),o=await _o(t,null),s=r.autoWorktree??!0,i=r.baseBranch??"HEAD",a=null;if(r.projectPath){let[m]=await u.select({projectId:le.projectId}).from(le).where(xe(le.path,r.projectPath)).orderBy(Ql(le.lastSeen)).limit(1);a=m?.projectId??null}if(!a&&r.gitRemote){let[m]=await u.select({id:U.id}).from(U).where(xe(U.gitRemoteUrl,r.gitRemote)).limit(1);a=m?.id??null}let[c]=await u.insert(X).values({userId:t,orgId:o,projectPath:r.projectPath,projectId:a,gitRemote:r.gitRemote??null,baseBranch:r.baseBranch??null,title:r.title??null,prompt:r.prompt??null,toolSpec:r.sessions,autoWorktree:s,status:"pending",sessionCount:r.sessions.length}).returning(),l=c.id.slice(0,8),p=!1;try{for(let m=0;m<r.sessions.length;m++){let y=r.sessions[m],v=`rm/run-${l}/s${m}-${o$(y.tool)}`,h={projectPath:r.projectPath,prompt:r.prompt,systemPrompt:void 0,model:y.model,mode:"interactive",worktree:{create:s,branch:v,baseRef:i},runId:c.id},f=await Rt({taskName:"process_launch",userId:t,payload:{tool:y.tool,config:h},mirror:{userId:t,tool:y.tool,config:h},runId:c.id});p=p||f.noLiveWorker}}catch(m){return await u.update(X).set({status:"failed",updatedAt:new Date}).where(xe(X.id,c.id)),await u.update(ce).set({status:"cancelled",updatedAt:new Date}).where(Ut(xe(ce.runId,c.id),xe(ce.status,"pending"))),e.json({error:"Failed to enqueue all launch jobs",detail:m instanceof Error?m.message:String(m),run:{...c,status:"failed"}},500)}return e.json({run:c,noLiveWorker:p},201)});br.get("/runs",async e=>{let t=e.get("userId"),n=Number(e.req.query("limit")),r=Math.min(Math.max(Number.isFinite(n)?n:50,1),100),o=Number(e.req.query("offset")),s=Math.max(Number.isFinite(o)?o:0,0),i=e.req.query("projectId"),a=i?Ut(xe(X.userId,t),xe(X.projectId,i)):xe(X.userId,t),c=await u.select({id:X.id,userId:X.userId,orgId:X.orgId,projectId:X.projectId,projectPath:X.projectPath,gitRemote:X.gitRemote,baseBranch:X.baseBranch,title:X.title,toolSpec:X.toolSpec,autoWorktree:X.autoWorktree,status:X.status,sessionCount:X.sessionCount,createdAt:X.createdAt,updatedAt:X.updatedAt,completedAt:X.completedAt}).from(X).where(a).orderBy(Ql(X.createdAt)).limit(r).offset(s),l=c.filter(m=>!SS(m.status,m.completedAt)),p=l.map(m=>m.id);if(p.length>0){let[m,y]=await Promise.all([u.select({runId:_.runId,endedAt:_.endedAt}).from(_).where(Ut(xe(_.userId,t),Xl(_.runId,p))),u.select({runId:ce.runId,status:ce.status}).from(ce).where(Ut(xe(ce.userId,t),Xl(ce.runId,p)))]),v=new Map;for(let f of m){if(!f.runId)continue;let w=v.get(f.runId)??[];w.push({endedAt:f.endedAt}),v.set(f.runId,w)}let h=new Map;for(let f of y){if(!f.runId)continue;let w=h.get(f.runId)??[];w.push({status:f.status}),h.set(f.runId,w)}await Promise.all(l.map(async f=>{let w=AS(f.status,v.get(f.id)??[],h.get(f.id)??[]);w!==f.status&&(await ES({runId:f.id,userId:t,stored:f.status,rolled:w,hadCompletedAt:f.completedAt!=null}),f.status=w,f.completedAt==null&&(w==="completed"||w==="failed"||w==="cancelled")&&(f.completedAt=new Date))}))}return e.json({runs:c})});br.get("/runs/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(X).where(Ut(xe(X.id,n),xe(X.userId,t))).limit(1);if(!r)return e.json({error:"Run not found"},404);try{await xS(n,t)}catch{}let o=await u.select({id:_.id,tool:_.tool,gitBranch:_.gitBranch,projectPath:_.projectPath,startedAt:_.startedAt,endedAt:_.endedAt,eventCount:_.eventCount,tokenUsage:_.tokenUsage,analysis:_.analysis}).from(_).where(Ut(xe(_.runId,n),xe(_.userId,t))).orderBy(Ql(_.startedAt)),s=o.map(w=>w.id);if(!SS(r.status,r.completedAt)){let w=await u.select({status:ce.status}).from(ce).where(Ut(xe(ce.runId,n),xe(ce.userId,t))),b=AS(r.status,o.map(I=>({endedAt:I.endedAt})),w);b!==r.status&&(await ES({runId:n,userId:t,stored:r.status,rolled:b,hadCompletedAt:r.completedAt!=null}),r.status=b,r.completedAt==null&&(b==="completed"||b==="failed"||b==="cancelled")&&(r.completedAt=new Date))}let i=s.length>0?await u.select({sessionId:se.sessionId,instructionId:g.id,name:g.name}).from(se).innerJoin(g,xe(g.id,se.instructionId)).where(Xl(se.sessionId,s)):[],a=new Map;for(let w of s)a.set(w,[]);for(let w of i)a.get(w.sessionId)?.push({id:w.instructionId,name:w.name});let c=await Promise.all(o.map(async w=>{let b=w.analysis??{},I=typeof b.goalSummary=="string"?b.goalSummary:null,S=typeof b.outcome=="string"?b.outcome:null,A=b.friction??null,E=await c$(w.tokenUsage,w.startedAt??new Date);return{id:w.id,tool:w.tool,gitBranch:w.gitBranch,projectPath:w.projectPath,startedAt:w.startedAt,endedAt:w.endedAt,eventCount:w.eventCount,tokenUsage:w.tokenUsage,goalSummary:I,outcome:S,friction:A,cost:E,instructions:a.get(w.id)??[]}})),l=c.map(w=>({sessionId:w.id,score:w.outcome!=null?pi[w.outcome]??-1:-1,costUsd:w.cost?.totalUsd??Number.POSITIVE_INFINITY,frictionCount:a$(w.friction)})).sort((w,b)=>b.score!==w.score?b.score-w.score:w.costUsd!==b.costUsd?w.costUsd-b.costUsd:w.frictionCount-b.frictionCount).map((w,b)=>({sessionId:w.sessionId,rank:b+1,isWinner:b===0&&w.score>=0,score:w.score,costUsd:Number.isFinite(w.costUsd)?w.costUsd:null,frictionCount:w.frictionCount})),p=new Map,m=new Map;for(let w of i)p.set(w.instructionId,w.name),m.has(w.instructionId)||m.set(w.instructionId,new Set),m.get(w.instructionId).add(w.sessionId);let y=s.length,v=[],h=[];for(let[w,b]of m){let I=p.get(w)??"Unknown";y>0&&b.size===y?v.push({id:w,name:I}):h.push({id:w,name:I,sessionIds:[...b]})}let f=null;return r.autoWorktree?r.sessionCount>0&&c.length<r.sessionCount&&(f=`Only ${c.length} of ${r.sessionCount} expected sessions are attributed to this run so far \u2014 the comparison may be incomplete while sessions are still launching or being linked.`):f="This run did not auto-create per-session worktrees, so sessions are attributed only via the launch hook. Sessions from tools that do not run RuleMetric hooks may be missing from this comparison.",e.json({run:r,sessions:c,comparison:{ranking:l,instructionDiff:{shared:v,differing:h}},attributionCaveat:f})});br.post("/runs/:id/link-sessions",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:X.id}).from(X).where(Ut(xe(X.id,n),xe(X.userId,t))).limit(1);if(!r)return e.json({error:"Run not found"},404);let{linked:o}=await xS(n,t);return e.json({linked:o})});br.get("/runs/:id/jobs",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:X.id}).from(X).where(Ut(xe(X.id,n),xe(X.userId,t))).limit(1);if(!r)return e.json({error:"Run not found"},404);let o=await u.select({id:ce.id,runId:ce.runId,status:ce.status,tool:ce.tool}).from(ce).where(Ut(xe(ce.runId,n),xe(ce.userId,t))).orderBy(Ql(ce.createdAt));return e.json(o)});br.post("/runs/:id/cancel",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:X.id}).from(X).where(Ut(xe(X.id,n),xe(X.userId,t))).limit(1);if(!r)return e.json({error:"Run not found"},404);await u.update(ce).set({status:"cancelled",updatedAt:new Date}).where(Ut(xe(ce.runId,n),xe(ce.userId,t),xe(ce.status,"pending")));let[o]=await u.update(X).set({status:"cancelled",updatedAt:new Date}).where(Ut(xe(X.id,n),xe(X.userId,t))).returning();return e.json({run:o})});br.post("/runs/:id/cleanup",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:X.id}).from(X).where(Ut(xe(X.id,n),xe(X.userId,t))).limit(1);if(!r)return e.json({error:"Run not found"},404);let{noLiveWorker:o}=await OI({runId:n,userId:t});return e.json({enqueued:!0,noLiveWorker:o})});O();import{Hono as d$}from"hono";import{z as Cs}from"zod";import{and as na,desc as lh,eq as Vt,or as TS}from"drizzle-orm";var Os=new d$;function u$(e,t){return{liveSend:e?.kind==="tmux"&&e.status==="active"&&t,fallbackResume:!0,tmuxAvailable:e?.kind==="tmux"&&e.status!=="fallback_only",workerOnline:t}}d(u$,"capabilitiesFor");Os.get("/sessions/:id/terminal-target",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:_.id,externalSessionId:_.externalSessionId}).from(_).where(na(Vt(_.id,n),Vt(_.userId,t))).limit(1);if(!r)return e.json({error:"Session not found"},404);let o=r.externalSessionId?TS(Vt(Ve.sessionId,r.id),Vt(Ve.externalSessionId,r.externalSessionId)):Vt(Ve.sessionId,r.id),[s]=await u.select().from(Ve).where(na(Vt(Ve.userId,t),o)).orderBy(lh(Ve.lastSeenAt)).limit(1),i=await Ei(t);return e.json({target:s??null,capabilities:u$(s??null,i),...s?{}:{reason:"no_target"}})});var RS=Cs.enum(["active","missing","unknown","fallback_only"]),l$=Cs.object({message:Cs.string().min(1).max(16*1024),delivery:Cs.enum(["live","fallback"]).default("live"),submit:Cs.boolean().optional().default(!0)});Os.post("/sessions/:id/send",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=l$.parse(await e.req.json()),[o]=await u.select({id:_.id,externalSessionId:_.externalSessionId,projectPath:_.projectPath}).from(_).where(na(Vt(_.id,n),Vt(_.userId,t))).limit(1);if(!o)return e.json({error:"Session not found"},404);let s=o.externalSessionId?TS(Vt(Ve.sessionId,o.id),Vt(Ve.externalSessionId,o.externalSessionId)):Vt(Ve.sessionId,o.id),[i]=await u.select().from(Ve).where(na(Vt(Ve.userId,t),Vt(Ve.status,"active"),s)).orderBy(lh(Ve.lastSeenAt)).limit(1);if(!i){if(r.delivery==="fallback"){if(!o.externalSessionId||!o.projectPath)return e.json({error:"Live target unavailable",code:"LIVE_TARGET_UNAVAILABLE"},409);let p={projectPath:o.projectPath,mode:"interactive",resumeSessionId:o.externalSessionId,prompt:r.message},m={tool:"claude_code",config:p},{id:y,noLiveWorker:v}=await Rt({taskName:"process_launch",payload:m,userId:t,mirror:{userId:t,tool:"claude_code",config:p}});return e.json({delivery:"fallback",job:{id:y,kind:"process_launch"},noLiveWorker:v},202)}return e.json({error:"Live target unavailable",code:"LIVE_TARGET_UNAVAILABLE",fallback:{available:!!(o.externalSessionId&&o.projectPath),action:"resume_terminal"}},409)}if(!await Ei(t))return e.json({error:"Worker offline",code:"WORKER_OFFLINE"},409);let c={sessionId:o.id,terminalTargetId:i.id,target:i.target,message:r.message,submit:r.submit},{id:l}=await Rt({taskName:"process_send_message",payload:c,userId:t,mirror:{userId:t,sessionId:o.id,terminalTargetId:i.id,target:i.target,message:r.message,submit:r.submit,delivery:"live"}});return e.json({delivery:"live",job:{id:l,kind:"process_send_message"},target:i},202)});var p$=Cs.object({status:RS,lastSeenAt:Cs.string().datetime().optional()});Os.patch("/terminal-targets/:id/status",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=p$.parse(await e.req.json()),o=r.lastSeenAt?new Date(r.lastSeenAt):new Date,s=new Date,[i]=await u.update(Ve).set({status:r.status,lastSeenAt:o,updatedAt:s}).where(na(Vt(Ve.id,n),Vt(Ve.userId,t))).returning();return i?e.json({target:i}):e.json({error:"Terminal target not found"},404)});Os.get("/terminal-targets",async e=>{let t=e.get("userId"),n=e.req.query("status"),r=n?RS.parse(n):null,o=await u.select().from(Ve).where(na(Vt(Ve.userId,t),...r?[Vt(Ve.status,r)]:[])).orderBy(lh(Ve.lastSeenAt)).limit(100);return e.json({targets:o})});import{Hono as Q$}from"hono";O();import{Hono as h$}from"hono";import{z as Lo}from"zod";import{eq as Kr,asc as jS,sql as _$}from"drizzle-orm";O();import{eq as ph,and as m$}from"drizzle-orm";function ht(e){return async(t,n)=>{let r=t.get("userId");if(!r)return t.json({error:"Unauthenticated",code:"UNAUTHENTICATED"},401);let o=t.req.param("slug");if(!o)return t.json({error:"Missing org slug",code:"BAD_REQUEST"},400);let[s]=await u.select({id:G.id,slug:G.slug}).from(G).where(ph(G.slug,o));if(!s)return t.json({error:"Organization not found",code:"ORG_NOT_FOUND"},404);let[i]=await u.select({role:Q.role}).from(Q).where(m$(ph(Q.orgId,s.id),ph(Q.userId,r)));if(!i||!e.includes(i.role))return t.json({error:"Forbidden",code:"ORG_FORBIDDEN"},403);t.set("orgId",s.id),t.set("orgSlug",o),t.set("orgRole",i.role),await n()}}d(ht,"requireOrgRole");O();import{eq as kS,and as f$,sql as g$}from"drizzle-orm";var Gr=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Zl=g$`case ${Q.role}
1047
+ ${e.body??""}`}u(WC,"buildPrompt");function zC(e){let t=e.trim().replace(/^```(?:json)?\s*/i,"").replace(/\s*```$/i,"").trim(),n=t.indexOf("{"),r=t.lastIndexOf("}"),o=n>=0&&r>n?t.slice(n,r+1):t,s=JSON.parse(o);if(!s.observations||!Array.isArray(s.observations))return{observations:[]};let i=[];for(let c of s.observations){if(!c||typeof c!="object")continue;let a=c;if(typeof a.limitType!="string"||typeof a.plan!="string"||typeof a.value!="number"||!Number.isFinite(a.value)||typeof a.unit!="string")continue;let l=a.comparator===">="||a.comparator==="<="?a.comparator:"=";i.push({limitType:a.limitType,plan:a.plan,value:a.value,unit:a.unit,comparator:l,evidence_quote:typeof a.evidence_quote=="string"?a.evidence_quote:""})}return{observations:i}}u(zC,"parseLlmJson");async function c0(e,t={}){let n=e.body??"";if(!MC.test(n))return{observations:[],llm_called:!1,reason:"no keywords matched"};let r=t.llm===void 0?BC():t.llm;if(!r)return console.warn("[harness-release-extractor] ANTHROPIC_API_KEY missing; skipping extraction"),{observations:[],llm_called:!1,reason:"no LLM available"};let o,s;try{let a=await r(WC(e));o=a.text,s=a.usage}catch(a){return{observations:[],llm_called:!0,error:`LLM call failed: ${a instanceof Error?a.message:String(a)}`}}let i;try{i=zC(o).observations}catch(a){return{observations:[],llm_called:!0,llm_tokens:{input:s.inputTokens,output:s.outputTokens},error:`failed to parse LLM JSON: ${a instanceof Error?a.message:String(a)}`}}if(i.length===0)return{observations:[],llm_called:!0,llm_tokens:{input:s.inputTokens,output:s.outputTokens},reason:"LLM returned no observations"};let c=t.observe??FC;for(let a of i)await c({plan:a.plan,limitType:a.limitType,value:a.value,unit:a.unit,comparator:a.comparator,sourceType:"release_notes",sourceUrl:e.url,sourceEvidence:{harness:e.harness,version:e.version,publishedAt:e.publishedAt.toISOString(),quote:a.evidence_quote,fullBody:n},confidence:UC,provider:"anthropic"});return{observations:i,llm_called:!0,llm_tokens:{input:s.inputTokens,output:s.outputTokens}}}u(c0,"extractAndPostObservationsFromRelease");var d0=[{harness:"claude_code",repo:"anthropics/claude-code"},{harness:"codex",repo:"openai/codex"}];function JC(e){return e.prerelease===!0||/-(alpha|beta|rc)\b/i.test(e.tag_name)}u(JC,"isPrerelease");function KC(e){let t=[],n=[],r=[],o=e.split(`
1048
+ `);for(let s of o){let i=s.trim();if(!i.startsWith("- ")&&!i.startsWith("* "))continue;let c=i.replace(/^[-*]\s+/,"").trim();if(!c)continue;let a=c.toLowerCase();a.startsWith("security:")||a.includes("security fix")||a.includes("cve-")?r.push(c):a.startsWith("fixed ")||a.startsWith("fix ")||a.startsWith("fixed:")?n.push(c):t.push(c)}return{features:t,fixes:n,security:r}}u(KC,"parseReleaseBody");async function Jl(e){let t=e?d0.filter(o=>o.harness===e):d0,n=0,r=0;for(let o of t){let s=`https://api.github.com/repos/${o.repo}/releases?per_page=100`,i={Accept:"application/vnd.github+json"};process.env.GITHUB_TOKEN&&(i.Authorization=`Bearer ${process.env.GITHUB_TOKEN}`);let c=await fetch(s,{headers:i});if(!c.ok)continue;let a=await c.json();r+=a.length;for(let l of a){if(JC(l))continue;let m=KC(l.body??"");if((await d.select({id:jt.id}).from(jt).where(VC(u0(jt.harness,o.harness),u0(jt.version,l.tag_name)))).length===0){await d.insert(jt).values({harness:o.harness,version:l.tag_name,publishedAt:new Date(l.published_at),title:l.name,body:l.body,categories:m,url:l.html_url}),n++;try{await c0({harness:o.harness,version:l.tag_name,url:l.html_url,publishedAt:new Date(l.published_at),body:l.body})}catch(_){console.warn("release notes extraction failed:",_)}}}}return{synced:n,total:r}}u(Jl,"syncHarnessReleases");var Zc=new GC;Zc.get("/harness-releases",async e=>{let t=e.req.query("harness"),n=Math.min(Number(e.req.query("limit")??50),100),r=t?XC(jt.harness,t):void 0,o=await d.select({id:jt.id,harness:jt.harness,version:jt.version,publishedAt:jt.publishedAt,title:jt.title,categories:jt.categories,url:jt.url}).from(jt).where(r).orderBy(YC(jt.publishedAt)).limit(n);return e.json(o)});Zc.post("/harness-releases/sync",async e=>{let t=await e.req.json().catch(()=>({})),n=await Jl(t.harness);return e.json(n)});C();import{Hono as QC}from"hono";import{and as Kl,desc as ZC,eq as Zi,isNull as ah,sql as eL}from"drizzle-orm";var ea=new QC;ea.get("/notifications",async e=>{let t=e.get("userId"),n=Math.min(parseInt(e.req.query("limit")??"20",10),100),r=parseInt(e.req.query("offset")??"0",10),s=e.req.query("unread")==="true"?Kl(Zi(bt.userId,t),ah(bt.readAt)):Zi(bt.userId,t),i=await d.select().from(bt).where(s).orderBy(ZC(bt.createdAt)).limit(n).offset(r),[{count:c}]=await d.select({count:eL`count(*)::int`}).from(bt).where(Kl(Zi(bt.userId,t),ah(bt.readAt)));return e.json({items:i,unreadCount:c})});ea.post("/notifications/:id/read",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await d.update(bt).set({readAt:new Date}).where(Kl(Zi(bt.id,t),Zi(bt.userId,n))).returning();return r?e.json(r):e.json({error:"Not found"},404)});ea.post("/notifications/read-all",async e=>{let t=e.get("userId");return await d.update(bt).set({readAt:new Date}).where(Kl(Zi(bt.userId,t),ah(bt.readAt))),e.json({success:!0})});C();import{Hono as tL}from"hono";import{z as Qt}from"zod";import{eq as Ir,and as Gl,desc as nL,ne as rL}from"drizzle-orm";var Co=new tL;function oL(e){let t=e.terminalTarget;if(!t||typeof t!="object")return null;let n=t;return n.kind!=="tmux"||typeof n.target!="string"||typeof n.attachCommand!="string"?null:{sessionId:typeof e.sessionId=="string"?e.sessionId:void 0,terminalTarget:{kind:"tmux",target:n.target,attachCommand:n.attachCommand,live:typeof n.live=="boolean"?n.live:void 0}}}u(oL,"parseTerminalTargetResult");async function sL(e){let t=oL(e.result);if(!t?.terminalTarget)return;let n=e.config&&typeof e.config=="object"?e.config:{},r=typeof n.projectPath=="string"?n.projectPath:null,o=typeof n.resumeSessionId=="string"?n.resumeSessionId:null,[s]=o?await d.select({id:y.id}).from(y).where(Gl(Ir(y.userId,e.userId),Ir(y.externalSessionId,o))).limit(1):[];await d.insert(ze).values({userId:e.userId,sessionId:s?.id??null,externalSessionId:o,kind:"tmux",target:t.terminalTarget.target,status:t.terminalTarget.live===!1?"unknown":"active",attachCommand:t.terminalTarget.attachCommand,projectPath:r,metadata:{launchJobId:e.jobId,launcherSessionId:t.sessionId}}).onConflictDoUpdate({target:[ze.userId,ze.target],set:{sessionId:s?.id??null,externalSessionId:o,status:t.terminalTarget.live===!1?"unknown":"active",attachCommand:t.terminalTarget.attachCommand,projectPath:r,metadata:{launchJobId:e.jobId,launcherSessionId:t.sessionId},lastSeenAt:new Date,updatedAt:new Date}})}u(sL,"upsertTerminalTargetFromLaunchResult");var iL=Qt.object({tool:Qt.string().min(1),config:Qt.object({projectPath:Qt.string().min(1),prompt:Qt.string().optional(),systemPrompt:Qt.string().optional(),model:Qt.string().optional(),mode:Qt.enum(["headless","interactive"]).default("interactive"),timeout:Qt.number().int().positive().optional(),resumeSessionId:Qt.string().optional()})});Co.post("/launch-jobs",async e=>{let t=e.get("userId"),n=await e.req.json(),r=iL.parse(n),{id:o,noLiveWorker:s}=await Tt({taskName:"process_launch",payload:{tool:r.tool,config:r.config},userId:t,mirror:{userId:t,tool:r.tool,config:r.config}}),[i]=await d.select().from(ce).where(Ir(ce.id,o));return e.json({...i,noLiveWorker:s},201)});Co.get("/launch-jobs",async e=>{let t=e.get("userId"),n=Number(e.req.query("limit")??50),r=await d.select().from(ce).where(Ir(ce.userId,t)).orderBy(nL(ce.createdAt)).limit(n);return e.json(r)});var aL=Qt.object({status:Qt.enum(["running","completed","failed"]).optional(),attempts:Qt.number().int().nonnegative().optional(),error:Qt.string().optional(),result:Qt.record(Qt.unknown()).optional()});Co.patch("/launch-jobs/:id/state",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=aL.parse(await e.req.json()),o={updatedAt:new Date};r.attempts!==void 0&&(o.attempts=r.attempts),r.status&&(o.status=r.status),r.error&&(o.error=r.error),r.result!==void 0&&(o.result=r.result),(r.status==="completed"||r.status==="failed")&&(o.completedAt=new Date);let[s]=await d.update(ce).set(o).where(Gl(Ir(ce.id,n),Ir(ce.userId,t),rL(ce.status,"cancelled"))).returning();if(!s){let[i]=await d.select().from(ce).where(Gl(Ir(ce.id,n),Ir(ce.userId,t)));return i?e.json(i):e.json({error:"Job not found"},404)}return r.result!==void 0&&await sL({userId:t,jobId:n,config:s.config,result:r.result}),e.json(s)});Co.post("/launch-jobs/:id/cancel",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.update(ce).set({status:"cancelled",updatedAt:new Date}).where(Gl(Ir(ce.id,n),Ir(ce.userId,t))).returning();return r?e.json(r):e.json({error:"Job not found"},404)});Co.get("/launchers",async e=>{let{getAvailableLaunchers:t}=await Promise.resolve().then(()=>(ml(),HI));return e.json(t())});C();import{Hono as cL}from"hono";import{z as Un}from"zod";import{eq as Ee,and as $t,desc as Xl,inArray as Yl,isNull as uL,ne as dL}from"drizzle-orm";ml();var br=new cL,lL=Un.object({tool:Un.string().min(1),model:Un.string().optional(),label:Un.string().optional()}),mL=Un.object({title:Un.string().optional(),projectPath:Un.string().min(1),gitRemote:Un.string().optional(),baseBranch:Un.string().optional(),prompt:Un.string().optional(),autoWorktree:Un.boolean().optional(),sessions:Un.array(lL).min(1).max(8)});function pL(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/(^-|-$)/g,"")||"tool"}u(pL,"sanitizeTool");var fL=new Set(["pending","claimed","running"]);var gL=1800*1e3;function l0(e,t){if(e==="cancelled")return!0;if(e!=="completed"&&e!=="failed"||t==null)return!1;let n=t instanceof Date?t.getTime():Date.parse(t);return Number.isFinite(n)?Date.now()-n>gL:!1}u(l0,"canSkipRollup");function m0(e,t,n){if(e==="cancelled")return"cancelled";let r=t.length>0,o=t.some(c=>c.endedAt==null),s=n.some(c=>fL.has(c.status));return n.length>0&&n.every(c=>c.status==="failed")&&!r?"failed":o||s&&r?"running":r&&!o&&!s?"completed":"pending"}u(m0,"rollupRunStatus");async function p0(e){if(e.rolled===e.stored)return;let t=e.rolled==="completed"||e.rolled==="failed"||e.rolled==="cancelled",n={status:e.rolled,updatedAt:new Date};t&&!e.hadCompletedAt&&(n.completedAt=new Date);try{await d.update(X).set(n).where($t(Ee(X.id,e.runId),Ee(X.userId,e.userId),dL(X.status,"cancelled")))}catch{}}u(p0,"persistRolledUpStatus");function hL(e){return Array.isArray(e)?e.length:e&&typeof e=="object"?Object.values(e).reduce((t,n)=>t+(typeof n=="number"&&n>0?n:0),0):0}u(hL,"frictionCount");async function _L(e,t){if(!e||typeof e!="object")return null;let n=e,r="claude-sonnet-4-6",o=No(r),s={input_tokens:n.input_tokens??0,output_tokens:n.output_tokens??0,cache_read_input_tokens:n.cache_read_input_tokens??0,cache_creation_5m:n.cache_creation_5m??0,cache_creation_1h:n.cache_creation_1h??0,cache_creation_input_tokens:n.cache_creation_input_tokens??0},i=await Fr(d,s,r,t,o);return i?{...i,estimated:!0}:null}u(_L,"deriveSessionCost");async function f0(e,t){let[n]=await d.select({id:X.id,autoWorktree:X.autoWorktree}).from(X).where($t(Ee(X.id,e),Ee(X.userId,t))).limit(1);if(!n||!n.autoWorktree)return{linked:0};let r=await d.select({config:ce.config,result:ce.result}).from(ce).where($t(Ee(ce.runId,e),Ee(ce.userId,t))),o=new Set;for(let i of r){let c=i.result??{};typeof c.worktreePath=="string"&&c.worktreePath&&o.add(c.worktreePath);let a=i.config??{};a.worktree?.create&&typeof a.worktree.branch=="string"&&typeof a.projectPath=="string"&&o.add(ll({repoRoot:a.projectPath,branch:a.worktree.branch}))}return o.size===0?{linked:0}:{linked:(await d.update(y).set({runId:e}).where($t(Ee(y.userId,t),uL(y.runId),Yl(y.projectPath,[...o]))).returning({id:y.id})).length}}u(f0,"linkRunSessions");br.post("/runs",async e=>{let t=e.get("userId"),n=await e.req.json(),r=mL.parse(n),o=await _o(t,null),s=r.autoWorktree??!0,i=r.baseBranch??"HEAD",c=null;if(r.projectPath){let[p]=await d.select({projectId:de.projectId}).from(de).where(Ee(de.path,r.projectPath)).orderBy(Xl(de.lastSeen)).limit(1);c=p?.projectId??null}if(!c&&r.gitRemote){let[p]=await d.select({id:M.id}).from(M).where(Ee(M.gitRemoteUrl,r.gitRemote)).limit(1);c=p?.id??null}let[a]=await d.insert(X).values({userId:t,orgId:o,projectPath:r.projectPath,projectId:c,gitRemote:r.gitRemote??null,baseBranch:r.baseBranch??null,title:r.title??null,prompt:r.prompt??null,toolSpec:r.sessions,autoWorktree:s,status:"pending",sessionCount:r.sessions.length}).returning(),l=a.id.slice(0,8),m=!1;try{for(let p=0;p<r.sessions.length;p++){let _=r.sessions[p],I=`rm/run-${l}/s${p}-${pL(_.tool)}`,h={projectPath:r.projectPath,prompt:r.prompt,systemPrompt:void 0,model:_.model,mode:"interactive",worktree:{create:s,branch:I,baseRef:i},runId:a.id},f=await Tt({taskName:"process_launch",userId:t,payload:{tool:_.tool,config:h},mirror:{userId:t,tool:_.tool,config:h},runId:a.id});m=m||f.noLiveWorker}}catch(p){return await d.update(X).set({status:"failed",updatedAt:new Date}).where(Ee(X.id,a.id)),await d.update(ce).set({status:"cancelled",updatedAt:new Date}).where($t(Ee(ce.runId,a.id),Ee(ce.status,"pending"))),e.json({error:"Failed to enqueue all launch jobs",detail:p instanceof Error?p.message:String(p),run:{...a,status:"failed"}},500)}return e.json({run:a,noLiveWorker:m},201)});br.get("/runs",async e=>{let t=e.get("userId"),n=Number(e.req.query("limit")),r=Math.min(Math.max(Number.isFinite(n)?n:50,1),100),o=Number(e.req.query("offset")),s=Math.max(Number.isFinite(o)?o:0,0),i=e.req.query("projectId"),c=i?$t(Ee(X.userId,t),Ee(X.projectId,i)):Ee(X.userId,t),a=await d.select({id:X.id,userId:X.userId,orgId:X.orgId,projectId:X.projectId,projectPath:X.projectPath,gitRemote:X.gitRemote,baseBranch:X.baseBranch,title:X.title,toolSpec:X.toolSpec,autoWorktree:X.autoWorktree,status:X.status,sessionCount:X.sessionCount,createdAt:X.createdAt,updatedAt:X.updatedAt,completedAt:X.completedAt}).from(X).where(c).orderBy(Xl(X.createdAt)).limit(r).offset(s),l=a.filter(p=>!l0(p.status,p.completedAt)),m=l.map(p=>p.id);if(m.length>0){let[p,_]=await Promise.all([d.select({runId:y.runId,endedAt:y.endedAt}).from(y).where($t(Ee(y.userId,t),Yl(y.runId,m))),d.select({runId:ce.runId,status:ce.status}).from(ce).where($t(Ee(ce.userId,t),Yl(ce.runId,m)))]),I=new Map;for(let f of p){if(!f.runId)continue;let w=I.get(f.runId)??[];w.push({endedAt:f.endedAt}),I.set(f.runId,w)}let h=new Map;for(let f of _){if(!f.runId)continue;let w=h.get(f.runId)??[];w.push({status:f.status}),h.set(f.runId,w)}await Promise.all(l.map(async f=>{let w=m0(f.status,I.get(f.id)??[],h.get(f.id)??[]);w!==f.status&&(await p0({runId:f.id,userId:t,stored:f.status,rolled:w,hadCompletedAt:f.completedAt!=null}),f.status=w,f.completedAt==null&&(w==="completed"||w==="failed"||w==="cancelled")&&(f.completedAt=new Date))}))}return e.json({runs:a})});br.get("/runs/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select().from(X).where($t(Ee(X.id,n),Ee(X.userId,t))).limit(1);if(!r)return e.json({error:"Run not found"},404);try{await f0(n,t)}catch{}let o=await d.select({id:y.id,tool:y.tool,gitBranch:y.gitBranch,projectPath:y.projectPath,startedAt:y.startedAt,endedAt:y.endedAt,eventCount:y.eventCount,tokenUsage:y.tokenUsage,analysis:y.analysis}).from(y).where($t(Ee(y.runId,n),Ee(y.userId,t))).orderBy(Xl(y.startedAt)),s=o.map(w=>w.id);if(!l0(r.status,r.completedAt)){let w=await d.select({status:ce.status}).from(ce).where($t(Ee(ce.runId,n),Ee(ce.userId,t))),b=m0(r.status,o.map(v=>({endedAt:v.endedAt})),w);b!==r.status&&(await p0({runId:n,userId:t,stored:r.status,rolled:b,hadCompletedAt:r.completedAt!=null}),r.status=b,r.completedAt==null&&(b==="completed"||b==="failed"||b==="cancelled")&&(r.completedAt=new Date))}let i=s.length>0?await d.select({sessionId:se.sessionId,instructionId:g.id,name:g.name}).from(se).innerJoin(g,Ee(g.id,se.instructionId)).where(Yl(se.sessionId,s)):[],c=new Map;for(let w of s)c.set(w,[]);for(let w of i)c.get(w.sessionId)?.push({id:w.instructionId,name:w.name});let a=await Promise.all(o.map(async w=>{let b=w.analysis??{},v=typeof b.goalSummary=="string"?b.goalSummary:null,S=typeof b.outcome=="string"?b.outcome:null,A=b.friction??null,E=await _L(w.tokenUsage,w.startedAt??new Date);return{id:w.id,tool:w.tool,gitBranch:w.gitBranch,projectPath:w.projectPath,startedAt:w.startedAt,endedAt:w.endedAt,eventCount:w.eventCount,tokenUsage:w.tokenUsage,goalSummary:v,outcome:S,friction:A,cost:E,instructions:c.get(w.id)??[]}})),l=a.map(w=>({sessionId:w.id,score:w.outcome!=null?li[w.outcome]??-1:-1,costUsd:w.cost?.totalUsd??Number.POSITIVE_INFINITY,frictionCount:hL(w.friction)})).sort((w,b)=>b.score!==w.score?b.score-w.score:w.costUsd!==b.costUsd?w.costUsd-b.costUsd:w.frictionCount-b.frictionCount).map((w,b)=>({sessionId:w.sessionId,rank:b+1,isWinner:b===0&&w.score>=0,score:w.score,costUsd:Number.isFinite(w.costUsd)?w.costUsd:null,frictionCount:w.frictionCount})),m=new Map,p=new Map;for(let w of i)m.set(w.instructionId,w.name),p.has(w.instructionId)||p.set(w.instructionId,new Set),p.get(w.instructionId).add(w.sessionId);let _=s.length,I=[],h=[];for(let[w,b]of p){let v=m.get(w)??"Unknown";_>0&&b.size===_?I.push({id:w,name:v}):h.push({id:w,name:v,sessionIds:[...b]})}let f=null;return r.autoWorktree?r.sessionCount>0&&a.length<r.sessionCount&&(f=`Only ${a.length} of ${r.sessionCount} expected sessions are attributed to this run so far \u2014 the comparison may be incomplete while sessions are still launching or being linked.`):f="This run did not auto-create per-session worktrees, so sessions are attributed only via the launch hook. Sessions from tools that do not run RuleMetric hooks may be missing from this comparison.",e.json({run:r,sessions:a,comparison:{ranking:l,instructionDiff:{shared:I,differing:h}},attributionCaveat:f})});br.post("/runs/:id/link-sessions",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select({id:X.id}).from(X).where($t(Ee(X.id,n),Ee(X.userId,t))).limit(1);if(!r)return e.json({error:"Run not found"},404);let{linked:o}=await f0(n,t);return e.json({linked:o})});br.get("/runs/:id/jobs",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select({id:X.id}).from(X).where($t(Ee(X.id,n),Ee(X.userId,t))).limit(1);if(!r)return e.json({error:"Run not found"},404);let o=await d.select({id:ce.id,runId:ce.runId,status:ce.status,tool:ce.tool}).from(ce).where($t(Ee(ce.runId,n),Ee(ce.userId,t))).orderBy(Xl(ce.createdAt));return e.json(o)});br.post("/runs/:id/cancel",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select({id:X.id}).from(X).where($t(Ee(X.id,n),Ee(X.userId,t))).limit(1);if(!r)return e.json({error:"Run not found"},404);await d.update(ce).set({status:"cancelled",updatedAt:new Date}).where($t(Ee(ce.runId,n),Ee(ce.userId,t),Ee(ce.status,"pending")));let[o]=await d.update(X).set({status:"cancelled",updatedAt:new Date}).where($t(Ee(X.id,n),Ee(X.userId,t))).returning();return e.json({run:o})});br.post("/runs/:id/cleanup",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select({id:X.id}).from(X).where($t(Ee(X.id,n),Ee(X.userId,t))).limit(1);if(!r)return e.json({error:"Run not found"},404);let{noLiveWorker:o}=await bv({runId:n,userId:t});return e.json({enqueued:!0,noLiveWorker:o})});C();import{Hono as yL}from"hono";import{z as Ds}from"zod";import{and as ta,desc as ch,eq as zt,or as g0}from"drizzle-orm";var Os=new yL;function wL(e,t){return{liveSend:e?.kind==="tmux"&&e.status==="active"&&t,fallbackResume:!0,tmuxAvailable:e?.kind==="tmux"&&e.status!=="fallback_only",workerOnline:t}}u(wL,"capabilitiesFor");Os.get("/sessions/:id/terminal-target",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select({id:y.id,externalSessionId:y.externalSessionId}).from(y).where(ta(zt(y.id,n),zt(y.userId,t))).limit(1);if(!r)return e.json({error:"Session not found"},404);let o=r.externalSessionId?g0(zt(ze.sessionId,r.id),zt(ze.externalSessionId,r.externalSessionId)):zt(ze.sessionId,r.id),[s]=await d.select().from(ze).where(ta(zt(ze.userId,t),o)).orderBy(ch(ze.lastSeenAt)).limit(1),i=await Ai(t);return e.json({target:s??null,capabilities:wL(s??null,i),...s?{}:{reason:"no_target"}})});var h0=Ds.enum(["active","missing","unknown","fallback_only"]),vL=Ds.object({message:Ds.string().min(1).max(16*1024),delivery:Ds.enum(["live","fallback"]).default("live"),submit:Ds.boolean().optional().default(!0)});Os.post("/sessions/:id/send",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=vL.parse(await e.req.json()),[o]=await d.select({id:y.id,externalSessionId:y.externalSessionId,projectPath:y.projectPath}).from(y).where(ta(zt(y.id,n),zt(y.userId,t))).limit(1);if(!o)return e.json({error:"Session not found"},404);let s=o.externalSessionId?g0(zt(ze.sessionId,o.id),zt(ze.externalSessionId,o.externalSessionId)):zt(ze.sessionId,o.id),[i]=await d.select().from(ze).where(ta(zt(ze.userId,t),zt(ze.status,"active"),s)).orderBy(ch(ze.lastSeenAt)).limit(1);if(!i){if(r.delivery==="fallback"){if(!o.externalSessionId||!o.projectPath)return e.json({error:"Live target unavailable",code:"LIVE_TARGET_UNAVAILABLE"},409);let m={projectPath:o.projectPath,mode:"interactive",resumeSessionId:o.externalSessionId,prompt:r.message},p={tool:"claude_code",config:m},{id:_,noLiveWorker:I}=await Tt({taskName:"process_launch",payload:p,userId:t,mirror:{userId:t,tool:"claude_code",config:m}});return e.json({delivery:"fallback",job:{id:_,kind:"process_launch"},noLiveWorker:I},202)}return e.json({error:"Live target unavailable",code:"LIVE_TARGET_UNAVAILABLE",fallback:{available:!!(o.externalSessionId&&o.projectPath),action:"resume_terminal"}},409)}if(!await Ai(t))return e.json({error:"Worker offline",code:"WORKER_OFFLINE"},409);let a={sessionId:o.id,terminalTargetId:i.id,target:i.target,message:r.message,submit:r.submit},{id:l}=await Tt({taskName:"process_send_message",payload:a,userId:t,mirror:{userId:t,sessionId:o.id,terminalTargetId:i.id,target:i.target,message:r.message,submit:r.submit,delivery:"live"}});return e.json({delivery:"live",job:{id:l,kind:"process_send_message"},target:i},202)});var IL=Ds.object({status:h0,lastSeenAt:Ds.string().datetime().optional()});Os.patch("/terminal-targets/:id/status",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=IL.parse(await e.req.json()),o=r.lastSeenAt?new Date(r.lastSeenAt):new Date,s=new Date,[i]=await d.update(ze).set({status:r.status,lastSeenAt:o,updatedAt:s}).where(ta(zt(ze.id,n),zt(ze.userId,t))).returning();return i?e.json({target:i}):e.json({error:"Terminal target not found"},404)});Os.get("/terminal-targets",async e=>{let t=e.get("userId"),n=e.req.query("status"),r=n?h0.parse(n):null,o=await d.select().from(ze).where(ta(zt(ze.userId,t),...r?[zt(ze.status,r)]:[])).orderBy(ch(ze.lastSeenAt)).limit(100);return e.json({targets:o})});import{Hono as aM}from"hono";C();import{Hono as EL}from"hono";import{z as Lo}from"zod";import{eq as Gr,asc as y0,sql as xL}from"drizzle-orm";C();import{eq as uh,and as bL}from"drizzle-orm";function gt(e){return async(t,n)=>{let r=t.get("userId");if(!r)return t.json({error:"Unauthenticated",code:"UNAUTHENTICATED"},401);let o=t.req.param("slug");if(!o)return t.json({error:"Missing org slug",code:"BAD_REQUEST"},400);let[s]=await d.select({id:K.id,slug:K.slug}).from(K).where(uh(K.slug,o));if(!s)return t.json({error:"Organization not found",code:"ORG_NOT_FOUND"},404);let[i]=await d.select({role:Q.role}).from(Q).where(bL(uh(Q.orgId,s.id),uh(Q.userId,r)));if(!i||!e.includes(i.role))return t.json({error:"Forbidden",code:"ORG_FORBIDDEN"},403);t.set("orgId",s.id),t.set("orgSlug",o),t.set("orgRole",i.role),await n()}}u(gt,"requireOrgRole");C();import{eq as _0,and as SL,sql as AL}from"drizzle-orm";var Kr=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Ql=AL`case ${Q.role}
1127
1049
  when 'owner' then 0
1128
1050
  when 'admin' then 1
1129
1051
  when 'member' then 2
1130
1052
  else 3
1131
- end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{ok:!1,response:e.json({error:"Invalid teamId path param",code:"BAD_REQUEST"},400)};let n=e.get("orgId"),[r]=await u.select({id:K.id,orgId:K.orgId,name:K.name,slug:K.slug,createdAt:K.createdAt}).from(K).where(f$(kS(K.id,t),kS(K.orgId,n)));return r?{ok:!0,team:{id:r.id,orgId:r.orgId,name:r.name,slug:r.slug,createdAt:r.createdAt}}:{ok:!1,response:e.json({error:"Team not found",code:"TEAM_NOT_FOUND"},404)}}d(Ds,"loadTeamInOrg");var ra=/^(?=.{3,40}$)[a-z0-9]+(?:-[a-z0-9]+)*$/,oa="Slug must be 3-40 chars, lowercase alphanumerics with single dashes only \u2014 no leading, trailing, or consecutive dashes";var $o=new h$,y$=Lo.object({name:Lo.string().min(1).max(100),slug:Lo.string().regex(ra,{message:oa})}),w$=Lo.object({name:Lo.string().min(1).max(100).optional(),slug:Lo.string().regex(ra,{message:oa}).optional()});$o.post("/orgs",async e=>{let t=e.get("supabase");if(!t)return e.json({error:"JWT authentication required for this endpoint",code:"JWT_REQUIRED"},401);let n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let r=y$.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let{name:o,slug:s}=r.data,{data:i,error:a}=await t.rpc("create_organization",{p_name:o,p_slug:s});if(a){let l=zt(a),p=vo(a);if(l==="23505")return e.json({error:"Slug already taken",code:"ORG_SLUG_TAKEN"},409);if(l==="P0001"&&/unauthenticated/i.test(p))return e.json({error:"Unauthenticated",code:"UNAUTHENTICATED"},401);throw a}let c=i;return e.json({id:c.id,name:c.name,slug:c.slug,role:"owner"},201)});$o.get("/orgs",async e=>{let t=e.get("userId"),n=await u.select({id:G.id,name:G.name,slug:G.slug,role:Q.role,createdAt:G.createdAt}).from(Q).innerJoin(G,Kr(Q.orgId,G.id)).where(Kr(Q.userId,t)).orderBy(G.createdAt);return e.json(n.map(r=>({id:r.id,name:r.name,slug:r.slug,role:r.role})))});$o.get("/orgs/:slug",ht(["owner","admin","member"]),async e=>{let t=e.get("orgId"),[n]=await u.select({id:G.id,name:G.name,slug:G.slug,createdAt:G.createdAt}).from(G).where(Kr(G.id,t)),r=await u.select({userId:Q.userId,role:Q.role,joinedAt:Q.createdAt,email:T.email,displayName:T.displayName}).from(Q).leftJoin(T,Kr(Q.userId,T.id)).where(Kr(Q.orgId,t)).orderBy(Zl,jS(Q.createdAt)),o=await u.select({id:K.id,name:K.name,slug:K.slug,memberCount:_$`count(${ye.userId})::int`}).from(K).leftJoin(ye,Kr(ye.teamId,K.id)).where(Kr(K.orgId,t)).groupBy(K.id,K.name,K.slug).orderBy(jS(K.name));return e.json({id:n.id,name:n.name,slug:n.slug,createdAt:n.createdAt,members:r.map(s=>({userId:s.userId,email:s.email,displayName:s.displayName,role:s.role,joinedAt:s.joinedAt})),teams:o.map(s=>({id:s.id,name:s.name,slug:s.slug,memberCount:Number(s.memberCount)}))})});$o.patch("/orgs/:slug",ht(["owner","admin"]),async e=>{let t=e.get("orgId"),n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let r=w$.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let{name:o,slug:s}=r.data;if(o===void 0&&s===void 0)return e.json({error:"At least one of `name` or `slug` is required",code:"BAD_REQUEST"},400);let i={};o!==void 0&&(i.name=o),s!==void 0&&(i.slug=s);try{let[a]=await u.update(G).set(i).where(Kr(G.id,t)).returning({id:G.id,name:G.name,slug:G.slug});return e.json({id:a.id,name:a.name,slug:a.slug})}catch(a){if(zt(a)==="23505")return e.json({error:"Slug already taken",code:"ORG_SLUG_TAKEN"},409);throw a}});$o.delete("/orgs/:slug",ht(["owner"]),async e=>{let t=e.get("orgId");return await u.delete(G).where(Kr(G.id,t)),e.body(null,204)});var v$=Lo.object({newOwnerId:Lo.string().uuid()});$o.post("/orgs/:slug/transfer",ht(["owner"]),async e=>{let t=e.get("supabase");if(!t)return e.json({error:"JWT authentication required for this endpoint",code:"JWT_REQUIRED"},401);let n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let r=v$.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let{newOwnerId:o}=r.data,s=e.get("orgId"),{data:i,error:a}=await t.rpc("transfer_ownership",{p_org:s,p_new_owner_id:o});if(a){let l=zt(a),p=vo(a);if(l==="P0001"){if(/same_user/i.test(p))return e.json({error:"Cannot transfer ownership to yourself",code:"SAME_USER"},400);if(/not_a_member/i.test(p))return e.json({error:"Target user is not a member of this organization",code:"NOT_A_MEMBER"},404);if(/forbidden/i.test(p))return e.json({error:"Forbidden",code:"ORG_FORBIDDEN"},403)}throw a}let c=i;return e.json({orgId:c.orgId,newOwnerId:c.newOwnerId,oldOwnerId:c.oldOwnerId})});O();import{Hono as I$}from"hono";import{z as NS}from"zod";import{eq as Zc,and as PS,asc as b$,max as S$,inArray as CS}from"drizzle-orm";var ed=new I$;ed.get("/orgs/:slug/members",ht(["owner","admin"]),async e=>{let t=e.get("orgId"),n=await u.select({userId:Q.userId,role:Q.role,joinedAt:Q.createdAt,email:T.email,displayName:T.displayName}).from(Q).leftJoin(T,Zc(Q.userId,T.id)).where(Zc(Q.orgId,t)).orderBy(Zl,b$(Q.createdAt)),r=n.map(c=>c.userId),o=r.length?await u.select({userId:ye.userId,teamId:K.id,teamName:K.name,teamSlug:K.slug}).from(ye).innerJoin(K,Zc(ye.teamId,K.id)).where(PS(Zc(K.orgId,t),CS(ye.userId,r))):[],s=new Map;for(let c of o){let l=s.get(c.userId)??[];l.push({id:c.teamId,name:c.teamName,slug:c.teamSlug}),s.set(c.userId,l)}let i=r.length?await u.select({userId:_.userId,lastActiveAt:S$(_.startedAt)}).from(_).where(PS(Zc(_.orgId,t),CS(_.userId,r))).groupBy(_.userId):[],a=new Map;for(let c of i)a.set(c.userId,c.lastActiveAt);return e.json(n.map(c=>{let l=a.get(c.userId)??null;return{userId:c.userId,email:c.email,displayName:c.displayName,role:c.role,joinedAt:c.joinedAt,teams:s.get(c.userId)??[],lastActiveAt:l?new Date(l).toISOString():null}}))});var A$=NS.object({role:NS.enum(["owner","admin","member"])});ed.patch("/orgs/:slug/members/:userId",ht(["owner","admin"]),async e=>{let t=e.get("supabase");if(!t)return e.json({error:"JWT authentication required for this endpoint",code:"JWT_REQUIRED"},401);let n=e.req.param("userId");if(!n||!Gr.test(n))return e.json({error:"Invalid userId path param",code:"BAD_REQUEST"},400);let r;try{r=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let o=A$.safeParse(r);if(!o.success)return e.json({error:o.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let s=e.get("orgId"),{data:i,error:a}=await t.rpc("change_member_role",{p_org:s,p_user:n,p_new_role:o.data.role});if(a){let l=zt(a),p=vo(a);if(l==="P0001"){if(/invalid_role/i.test(p))return e.json({error:"Invalid role",code:"INVALID_ROLE"},400);if(/not_a_member/i.test(p))return e.json({error:"Target user is not a member of this organization",code:"NOT_A_MEMBER"},404);if(/last_owner_violation/i.test(p))return e.json({error:"Cannot demote the last owner of this organization",code:"LAST_OWNER"},409);if(/forbidden/i.test(p))return e.json({error:"Forbidden",code:"ORG_FORBIDDEN"},403)}throw a}let c=i;return e.json({userId:c.userId,orgId:c.orgId,role:c.role})});ed.delete("/orgs/:slug/members/:userId",ht(["owner","admin","member"]),async e=>{let t=e.get("supabase");if(!t)return e.json({error:"JWT authentication required for this endpoint",code:"JWT_REQUIRED"},401);let n=e.req.param("userId");if(!n||!Gr.test(n))return e.json({error:"Invalid userId path param",code:"BAD_REQUEST"},400);let r=e.get("orgRole"),o=e.get("userId");if(!(n===o)&&!(r==="owner"||r==="admin"))return e.json({error:"Forbidden",code:"ORG_FORBIDDEN"},403);let a=e.get("orgId"),{error:c}=await t.rpc("remove_member",{p_org:a,p_user:n});if(c){let l=zt(c),p=vo(c);if(l==="P0001"){if(/not_a_member/i.test(p))return e.json({error:"Target user is not a member of this organization",code:"NOT_A_MEMBER"},404);if(/last_owner_violation/i.test(p))return e.json({error:"Cannot remove the last owner of this organization",code:"LAST_OWNER"},409);if(/forbidden/i.test(p))return e.json({error:"Forbidden",code:"ORG_FORBIDDEN"},403)}throw c}return e.body(null,204)});O();import{Hono as E$}from"hono";import{z as qo}from"zod";import{eq as Uo,and as OS,asc as x$,sql as T$}from"drizzle-orm";var Ho=new E$,R$=qo.object({name:qo.string().min(1).max(100),slug:qo.string().regex(ra,{message:oa})}),k$=qo.object({name:qo.string().min(1).max(100).optional(),slug:qo.string().regex(ra,{message:oa}).optional()}),j$=qo.object({userId:qo.string().uuid()});Ho.get("/orgs/:slug/teams",ht(["owner","admin","member"]),async e=>{let t=e.get("orgId"),n=await u.select({id:K.id,name:K.name,slug:K.slug,createdAt:K.createdAt,memberCount:T$`count(${ye.userId})::int`}).from(K).leftJoin(ye,Uo(ye.teamId,K.id)).where(Uo(K.orgId,t)).groupBy(K.id,K.name,K.slug,K.createdAt).orderBy(x$(K.name));return e.json(n.map(r=>({id:r.id,name:r.name,slug:r.slug,memberCount:Number(r.memberCount),createdAt:r.createdAt})))});Ho.post("/orgs/:slug/teams",ht(["owner","admin"]),async e=>{let t;try{t=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let n=R$.safeParse(t);if(!n.success)return e.json({error:n.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let r=e.get("orgId"),{name:o,slug:s}=n.data;try{let[i]=await u.insert(K).values({orgId:r,name:o,slug:s}).returning({id:K.id,orgId:K.orgId,name:K.name,slug:K.slug,createdAt:K.createdAt});return e.json({id:i.id,orgId:i.orgId,name:i.name,slug:i.slug,createdAt:i.createdAt,memberCount:0},201)}catch(i){if(zt(i)==="23505")return e.json({error:"Slug already taken",code:"TEAM_SLUG_TAKEN"},409);throw i}});Ho.patch("/orgs/:slug/teams/:teamId",ht(["owner","admin"]),async e=>{let t=await Ds(e);if(!t.ok)return t.response;let n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let r=k$.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let{name:o,slug:s}=r.data;if(o===void 0&&s===void 0)return e.json({error:"At least one of `name` or `slug` is required",code:"BAD_REQUEST"},400);let i={};o!==void 0&&(i.name=o),s!==void 0&&(i.slug=s);try{let[a]=await u.update(K).set(i).where(Uo(K.id,t.team.id)).returning({id:K.id,orgId:K.orgId,name:K.name,slug:K.slug,createdAt:K.createdAt});return e.json({id:a.id,orgId:a.orgId,name:a.name,slug:a.slug,createdAt:a.createdAt})}catch(a){if(zt(a)==="23505")return e.json({error:"Slug already taken",code:"TEAM_SLUG_TAKEN"},409);throw a}});Ho.delete("/orgs/:slug/teams/:teamId",ht(["owner","admin"]),async e=>{let t=await Ds(e);return t.ok?(await u.delete(K).where(Uo(K.id,t.team.id)),e.body(null,204)):t.response});Ho.post("/orgs/:slug/teams/:teamId/members",ht(["owner","admin"]),async e=>{let t=await Ds(e);if(!t.ok)return t.response;let n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let r=j$.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let{userId:o}=r.data,s=e.get("orgId"),[i]=await u.select({userId:Q.userId}).from(Q).where(OS(Uo(Q.userId,o),Uo(Q.orgId,s)));if(!i)return e.json({error:"Target user is not a member of this organization",code:"NOT_ORG_MEMBER"},400);try{await u.insert(ye).values({userId:o,teamId:t.team.id})}catch(a){if(zt(a)==="23505")return e.json({error:"User is already a member of this team",code:"ALREADY_TEAM_MEMBER"},409);throw a}return e.json({userId:o,teamId:t.team.id},201)});Ho.delete("/orgs/:slug/teams/:teamId/members/:userId",ht(["owner","admin"]),async e=>{let t=await Ds(e);if(!t.ok)return t.response;let n=e.req.param("userId");return!n||!Gr.test(n)?e.json({error:"Invalid userId path param",code:"BAD_REQUEST"},400):(await u.delete(ye).where(OS(Uo(ye.teamId,t.team.id),Uo(ye.userId,n))).returning({userId:ye.userId})).length===0?e.json({error:"User is not a member of this team",code:"NOT_TEAM_MEMBER"},404):e.body(null,204)});O();import{Hono as W$}from"hono";import{z as op}from"zod";import{randomBytes as z$}from"node:crypto";import{eq as qn,and as sp,desc as V$,sql as J$,isNull as ia,gt as G$}from"drizzle-orm";import{randomBytes as N$}from"node:crypto";async function mh(e){let t=e.idempotencyKey?` idempotencyKey=${e.idempotencyKey}`:"";return process.stderr.write(`[email:noop] would send to=${e.to} subject=${JSON.stringify(e.subject)}${t}
1132
- `),{id:`noop-${N$(8).toString("hex")}`,provider:"noop"}}d(mh,"sendNoopEmail");var ep=null;async function P$(){if(ep)return ep;let e=process.env.RESEND_API_KEY;if(!e)throw new Error("RESEND_API_KEY is not set");let{Resend:t}=await import("resend");return ep=new t(e),ep}d(P$,"getClient");var DS=!1;function C$(){let e=process.env.RESEND_FROM_EMAIL;if(e)return e;if(!DS){DS=!0;let t=process.env.NODE_ENV==="production"?"PRODUCTION":"dev";process.stderr.write(`[email:resend] ${t}: RESEND_FROM_EMAIL not set \u2014 sending from the shared sandbox sender onboarding@resend.dev, which Gmail spam-filters. Set RESEND_FROM_EMAIL to an address on a verified domain.
1133
- `)}return"onboarding@resend.dev"}d(C$,"resolveFromEmail");async function MS(e){let t=e.fromName??"RuleMetric",n=C$(),r=`${t} <${n}>`,o=await P$(),s=e.idempotencyKey?{idempotencyKey:e.idempotencyKey}:void 0,i=await o.emails.send({from:r,to:e.to,subject:e.subject,html:e.html,text:e.text,...e.headers?{headers:e.headers}:{}},s);if(i.error)throw new Error(`Resend send failed: ${i.error.message}`);if(!i.data)throw new Error("Resend send returned no data and no error");return{id:i.data.id,provider:"resend"}}d(MS,"sendResendEmail");async function LS(e){throw new Error("SMTP provider not implemented. Set RESEND_API_KEY to use Resend, or unset RULEMETRIC_EMAIL_PROVIDER to fall back to noop.")}d(LS,"sendSmtpEmail");var O$="#2DD4BF",D$="#0d9488",M$="#0A0C12",tp="#1a1a1a",np="#666666",$S="#f5f5f7",L$="#ffffff",qS="#e5e5e9";function $$(e){let n=["January","February","March","April","May","June","July","August","September","October","November","December"][e.getUTCMonth()],r=e.getUTCDate(),o=e.getUTCFullYear();return`${n} ${r}, ${o}`}d($$,"formatExpiresAt");function sa(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}d(sa,"escapeHtml");function q$(e){return e==="admin"?{article:"an admin",description:"As an admin, you can manage members, teams, and invitations for the organization."}:{article:"a member",description:"As a member, you can view organization activity and participate in shared sessions."}}d(q$,"roleCopy");function fh(e){let{orgName:t,inviterName:n,role:r,acceptUrl:o,expiresAt:s}=e,i=`${n} invited you to ${t} on RuleMetric`,a=$$(s),{article:c,description:l}=q$(r),p=`<!doctype html>
1053
+ end`;async function Cs(e){let t=e.req.param("teamId");if(!t||!Kr.test(t))return{ok:!1,response:e.json({error:"Invalid teamId path param",code:"BAD_REQUEST"},400)};let n=e.get("orgId"),[r]=await d.select({id:G.id,orgId:G.orgId,name:G.name,slug:G.slug,createdAt:G.createdAt}).from(G).where(SL(_0(G.id,t),_0(G.orgId,n)));return r?{ok:!0,team:{id:r.id,orgId:r.orgId,name:r.name,slug:r.slug,createdAt:r.createdAt}}:{ok:!1,response:e.json({error:"Team not found",code:"TEAM_NOT_FOUND"},404)}}u(Cs,"loadTeamInOrg");var na=/^(?=.{3,40}$)[a-z0-9]+(?:-[a-z0-9]+)*$/,ra="Slug must be 3-40 chars, lowercase alphanumerics with single dashes only \u2014 no leading, trailing, or consecutive dashes";var Mo=new EL,TL=Lo.object({name:Lo.string().min(1).max(100),slug:Lo.string().regex(na,{message:ra})}),RL=Lo.object({name:Lo.string().min(1).max(100).optional(),slug:Lo.string().regex(na,{message:ra}).optional()});Mo.post("/orgs",async e=>{let t=e.get("supabase");if(!t)return e.json({error:"JWT authentication required for this endpoint",code:"JWT_REQUIRED"},401);let n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let r=TL.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let{name:o,slug:s}=r.data,{data:i,error:c}=await t.rpc("create_organization",{p_name:o,p_slug:s});if(c){let l=Ft(c),m=vo(c);if(l==="23505")return e.json({error:"Slug already taken",code:"ORG_SLUG_TAKEN"},409);if(l==="P0001"&&/unauthenticated/i.test(m))return e.json({error:"Unauthenticated",code:"UNAUTHENTICATED"},401);throw c}let a=i;return e.json({id:a.id,name:a.name,slug:a.slug,role:"owner"},201)});Mo.get("/orgs",async e=>{let t=e.get("userId"),n=await d.select({id:K.id,name:K.name,slug:K.slug,role:Q.role,createdAt:K.createdAt}).from(Q).innerJoin(K,Gr(Q.orgId,K.id)).where(Gr(Q.userId,t)).orderBy(K.createdAt);return e.json(n.map(r=>({id:r.id,name:r.name,slug:r.slug,role:r.role})))});Mo.get("/orgs/:slug",gt(["owner","admin","member"]),async e=>{let t=e.get("orgId"),[n]=await d.select({id:K.id,name:K.name,slug:K.slug,createdAt:K.createdAt}).from(K).where(Gr(K.id,t)),r=await d.select({userId:Q.userId,role:Q.role,joinedAt:Q.createdAt,email:T.email,displayName:T.displayName}).from(Q).leftJoin(T,Gr(Q.userId,T.id)).where(Gr(Q.orgId,t)).orderBy(Ql,y0(Q.createdAt)),o=await d.select({id:G.id,name:G.name,slug:G.slug,memberCount:xL`count(${_e.userId})::int`}).from(G).leftJoin(_e,Gr(_e.teamId,G.id)).where(Gr(G.orgId,t)).groupBy(G.id,G.name,G.slug).orderBy(y0(G.name));return e.json({id:n.id,name:n.name,slug:n.slug,createdAt:n.createdAt,members:r.map(s=>({userId:s.userId,email:s.email,displayName:s.displayName,role:s.role,joinedAt:s.joinedAt})),teams:o.map(s=>({id:s.id,name:s.name,slug:s.slug,memberCount:Number(s.memberCount)}))})});Mo.patch("/orgs/:slug",gt(["owner","admin"]),async e=>{let t=e.get("orgId"),n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let r=RL.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let{name:o,slug:s}=r.data;if(o===void 0&&s===void 0)return e.json({error:"At least one of `name` or `slug` is required",code:"BAD_REQUEST"},400);let i={};o!==void 0&&(i.name=o),s!==void 0&&(i.slug=s);try{let[c]=await d.update(K).set(i).where(Gr(K.id,t)).returning({id:K.id,name:K.name,slug:K.slug});return e.json({id:c.id,name:c.name,slug:c.slug})}catch(c){if(Ft(c)==="23505")return e.json({error:"Slug already taken",code:"ORG_SLUG_TAKEN"},409);throw c}});Mo.delete("/orgs/:slug",gt(["owner"]),async e=>{let t=e.get("orgId");return await d.delete(K).where(Gr(K.id,t)),e.body(null,204)});var kL=Lo.object({newOwnerId:Lo.string().uuid()});Mo.post("/orgs/:slug/transfer",gt(["owner"]),async e=>{let t=e.get("supabase");if(!t)return e.json({error:"JWT authentication required for this endpoint",code:"JWT_REQUIRED"},401);let n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let r=kL.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let{newOwnerId:o}=r.data,s=e.get("orgId"),{data:i,error:c}=await t.rpc("transfer_ownership",{p_org:s,p_new_owner_id:o});if(c){let l=Ft(c),m=vo(c);if(l==="P0001"){if(/same_user/i.test(m))return e.json({error:"Cannot transfer ownership to yourself",code:"SAME_USER"},400);if(/not_a_member/i.test(m))return e.json({error:"Target user is not a member of this organization",code:"NOT_A_MEMBER"},404);if(/forbidden/i.test(m))return e.json({error:"Forbidden",code:"ORG_FORBIDDEN"},403)}throw c}let a=i;return e.json({orgId:a.orgId,newOwnerId:a.newOwnerId,oldOwnerId:a.oldOwnerId})});C();import{Hono as NL}from"hono";import{z as w0}from"zod";import{eq as eu,and as v0,asc as jL,max as PL,inArray as I0}from"drizzle-orm";var tu=new NL;tu.get("/orgs/:slug/members",gt(["owner","admin"]),async e=>{let t=e.get("orgId"),n=await d.select({userId:Q.userId,role:Q.role,joinedAt:Q.createdAt,email:T.email,displayName:T.displayName}).from(Q).leftJoin(T,eu(Q.userId,T.id)).where(eu(Q.orgId,t)).orderBy(Ql,jL(Q.createdAt)),r=n.map(a=>a.userId),o=r.length?await d.select({userId:_e.userId,teamId:G.id,teamName:G.name,teamSlug:G.slug}).from(_e).innerJoin(G,eu(_e.teamId,G.id)).where(v0(eu(G.orgId,t),I0(_e.userId,r))):[],s=new Map;for(let a of o){let l=s.get(a.userId)??[];l.push({id:a.teamId,name:a.teamName,slug:a.teamSlug}),s.set(a.userId,l)}let i=r.length?await d.select({userId:y.userId,lastActiveAt:PL(y.startedAt)}).from(y).where(v0(eu(y.orgId,t),I0(y.userId,r))).groupBy(y.userId):[],c=new Map;for(let a of i)c.set(a.userId,a.lastActiveAt);return e.json(n.map(a=>{let l=c.get(a.userId)??null;return{userId:a.userId,email:a.email,displayName:a.displayName,role:a.role,joinedAt:a.joinedAt,teams:s.get(a.userId)??[],lastActiveAt:l?new Date(l).toISOString():null}}))});var DL=w0.object({role:w0.enum(["owner","admin","member"])});tu.patch("/orgs/:slug/members/:userId",gt(["owner","admin"]),async e=>{let t=e.get("supabase");if(!t)return e.json({error:"JWT authentication required for this endpoint",code:"JWT_REQUIRED"},401);let n=e.req.param("userId");if(!n||!Kr.test(n))return e.json({error:"Invalid userId path param",code:"BAD_REQUEST"},400);let r;try{r=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let o=DL.safeParse(r);if(!o.success)return e.json({error:o.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let s=e.get("orgId"),{data:i,error:c}=await t.rpc("change_member_role",{p_org:s,p_user:n,p_new_role:o.data.role});if(c){let l=Ft(c),m=vo(c);if(l==="P0001"){if(/invalid_role/i.test(m))return e.json({error:"Invalid role",code:"INVALID_ROLE"},400);if(/not_a_member/i.test(m))return e.json({error:"Target user is not a member of this organization",code:"NOT_A_MEMBER"},404);if(/last_owner_violation/i.test(m))return e.json({error:"Cannot demote the last owner of this organization",code:"LAST_OWNER"},409);if(/forbidden/i.test(m))return e.json({error:"Forbidden",code:"ORG_FORBIDDEN"},403)}throw c}let a=i;return e.json({userId:a.userId,orgId:a.orgId,role:a.role})});tu.delete("/orgs/:slug/members/:userId",gt(["owner","admin","member"]),async e=>{let t=e.get("supabase");if(!t)return e.json({error:"JWT authentication required for this endpoint",code:"JWT_REQUIRED"},401);let n=e.req.param("userId");if(!n||!Kr.test(n))return e.json({error:"Invalid userId path param",code:"BAD_REQUEST"},400);let r=e.get("orgRole"),o=e.get("userId");if(!(n===o)&&!(r==="owner"||r==="admin"))return e.json({error:"Forbidden",code:"ORG_FORBIDDEN"},403);let c=e.get("orgId"),{error:a}=await t.rpc("remove_member",{p_org:c,p_user:n});if(a){let l=Ft(a),m=vo(a);if(l==="P0001"){if(/not_a_member/i.test(m))return e.json({error:"Target user is not a member of this organization",code:"NOT_A_MEMBER"},404);if(/last_owner_violation/i.test(m))return e.json({error:"Cannot remove the last owner of this organization",code:"LAST_OWNER"},409);if(/forbidden/i.test(m))return e.json({error:"Forbidden",code:"ORG_FORBIDDEN"},403)}throw a}return e.body(null,204)});C();import{Hono as OL}from"hono";import{z as $o}from"zod";import{eq as qo,and as b0,asc as CL,sql as LL}from"drizzle-orm";var Uo=new OL,ML=$o.object({name:$o.string().min(1).max(100),slug:$o.string().regex(na,{message:ra})}),$L=$o.object({name:$o.string().min(1).max(100).optional(),slug:$o.string().regex(na,{message:ra}).optional()}),qL=$o.object({userId:$o.string().uuid()});Uo.get("/orgs/:slug/teams",gt(["owner","admin","member"]),async e=>{let t=e.get("orgId"),n=await d.select({id:G.id,name:G.name,slug:G.slug,createdAt:G.createdAt,memberCount:LL`count(${_e.userId})::int`}).from(G).leftJoin(_e,qo(_e.teamId,G.id)).where(qo(G.orgId,t)).groupBy(G.id,G.name,G.slug,G.createdAt).orderBy(CL(G.name));return e.json(n.map(r=>({id:r.id,name:r.name,slug:r.slug,memberCount:Number(r.memberCount),createdAt:r.createdAt})))});Uo.post("/orgs/:slug/teams",gt(["owner","admin"]),async e=>{let t;try{t=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let n=ML.safeParse(t);if(!n.success)return e.json({error:n.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let r=e.get("orgId"),{name:o,slug:s}=n.data;try{let[i]=await d.insert(G).values({orgId:r,name:o,slug:s}).returning({id:G.id,orgId:G.orgId,name:G.name,slug:G.slug,createdAt:G.createdAt});return e.json({id:i.id,orgId:i.orgId,name:i.name,slug:i.slug,createdAt:i.createdAt,memberCount:0},201)}catch(i){if(Ft(i)==="23505")return e.json({error:"Slug already taken",code:"TEAM_SLUG_TAKEN"},409);throw i}});Uo.patch("/orgs/:slug/teams/:teamId",gt(["owner","admin"]),async e=>{let t=await Cs(e);if(!t.ok)return t.response;let n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let r=$L.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let{name:o,slug:s}=r.data;if(o===void 0&&s===void 0)return e.json({error:"At least one of `name` or `slug` is required",code:"BAD_REQUEST"},400);let i={};o!==void 0&&(i.name=o),s!==void 0&&(i.slug=s);try{let[c]=await d.update(G).set(i).where(qo(G.id,t.team.id)).returning({id:G.id,orgId:G.orgId,name:G.name,slug:G.slug,createdAt:G.createdAt});return e.json({id:c.id,orgId:c.orgId,name:c.name,slug:c.slug,createdAt:c.createdAt})}catch(c){if(Ft(c)==="23505")return e.json({error:"Slug already taken",code:"TEAM_SLUG_TAKEN"},409);throw c}});Uo.delete("/orgs/:slug/teams/:teamId",gt(["owner","admin"]),async e=>{let t=await Cs(e);return t.ok?(await d.delete(G).where(qo(G.id,t.team.id)),e.body(null,204)):t.response});Uo.post("/orgs/:slug/teams/:teamId/members",gt(["owner","admin"]),async e=>{let t=await Cs(e);if(!t.ok)return t.response;let n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let r=qL.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let{userId:o}=r.data,s=e.get("orgId"),[i]=await d.select({userId:Q.userId}).from(Q).where(b0(qo(Q.userId,o),qo(Q.orgId,s)));if(!i)return e.json({error:"Target user is not a member of this organization",code:"NOT_ORG_MEMBER"},400);try{await d.insert(_e).values({userId:o,teamId:t.team.id})}catch(c){if(Ft(c)==="23505")return e.json({error:"User is already a member of this team",code:"ALREADY_TEAM_MEMBER"},409);throw c}return e.json({userId:o,teamId:t.team.id},201)});Uo.delete("/orgs/:slug/teams/:teamId/members/:userId",gt(["owner","admin"]),async e=>{let t=await Cs(e);if(!t.ok)return t.response;let n=e.req.param("userId");return!n||!Kr.test(n)?e.json({error:"Invalid userId path param",code:"BAD_REQUEST"},400):(await d.delete(_e).where(b0(qo(_e.teamId,t.team.id),qo(_e.userId,n))).returning({userId:_e.userId})).length===0?e.json({error:"User is not a member of this team",code:"NOT_TEAM_MEMBER"},404):e.body(null,204)});C();import{Hono as ZL}from"hono";import{z as rm}from"zod";import{randomBytes as eM}from"node:crypto";import{eq as Hn,and as om,desc as tM,sql as nM,isNull as sa,gt as rM}from"drizzle-orm";import{randomBytes as UL}from"node:crypto";async function dh(e){let t=e.idempotencyKey?` idempotencyKey=${e.idempotencyKey}`:"";return process.stderr.write(`[email:noop] would send to=${e.to} subject=${JSON.stringify(e.subject)}${t}
1054
+ `),{id:`noop-${UL(8).toString("hex")}`,provider:"noop"}}u(dh,"sendNoopEmail");var Zl=null;async function HL(){if(Zl)return Zl;let e=process.env.RESEND_API_KEY;if(!e)throw new Error("RESEND_API_KEY is not set");let{Resend:t}=await import("resend");return Zl=new t(e),Zl}u(HL,"getClient");var S0=!1;function BL(){let e=process.env.RESEND_FROM_EMAIL;if(e)return e;if(!S0){S0=!0;let t=process.env.NODE_ENV==="production"?"PRODUCTION":"dev";process.stderr.write(`[email:resend] ${t}: RESEND_FROM_EMAIL not set \u2014 sending from the shared sandbox sender onboarding@resend.dev, which Gmail spam-filters. Set RESEND_FROM_EMAIL to an address on a verified domain.
1055
+ `)}return"onboarding@resend.dev"}u(BL,"resolveFromEmail");async function A0(e){let t=e.fromName??"RuleMetric",n=BL(),r=`${t} <${n}>`,o=await HL(),s=e.idempotencyKey?{idempotencyKey:e.idempotencyKey}:void 0,i=await o.emails.send({from:r,to:e.to,subject:e.subject,html:e.html,text:e.text,...e.headers?{headers:e.headers}:{}},s);if(i.error)throw new Error(`Resend send failed: ${i.error.message}`);if(!i.data)throw new Error("Resend send returned no data and no error");return{id:i.data.id,provider:"resend"}}u(A0,"sendResendEmail");async function E0(e){throw new Error("SMTP provider not implemented. Set RESEND_API_KEY to use Resend, or unset RULEMETRIC_EMAIL_PROVIDER to fall back to noop.")}u(E0,"sendSmtpEmail");var FL="#2DD4BF",WL="#0d9488",zL="#0A0C12",em="#1a1a1a",tm="#666666",x0="#f5f5f7",VL="#ffffff",T0="#e5e5e9";function JL(e){let n=["January","February","March","April","May","June","July","August","September","October","November","December"][e.getUTCMonth()],r=e.getUTCDate(),o=e.getUTCFullYear();return`${n} ${r}, ${o}`}u(JL,"formatExpiresAt");function oa(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}u(oa,"escapeHtml");function KL(e){return e==="admin"?{article:"an admin",description:"As an admin, you can manage members, teams, and invitations for the organization."}:{article:"a member",description:"As a member, you can view organization activity and participate in shared sessions."}}u(KL,"roleCopy");function lh(e){let{orgName:t,inviterName:n,role:r,acceptUrl:o,expiresAt:s}=e,i=`${n} invited you to ${t} on RuleMetric`,c=JL(s),{article:a,description:l}=KL(r),m=`<!doctype html>
1134
1056
  <html lang="en">
1135
1057
  <head>
1136
1058
  <meta charset="utf-8" />
1137
1059
  <meta name="viewport" content="width=device-width, initial-scale=1" />
1138
- <title>${sa(i)}</title>
1060
+ <title>${oa(i)}</title>
1139
1061
  </head>
1140
- <body style="margin:0;padding:0;background:${$S};font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;color:${tp};">
1141
- <table role="presentation" width="100%" cellspacing="0" cellpadding="0" border="0" style="background:${$S};padding:32px 16px;">
1062
+ <body style="margin:0;padding:0;background:${x0};font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;color:${em};">
1063
+ <table role="presentation" width="100%" cellspacing="0" cellpadding="0" border="0" style="background:${x0};padding:32px 16px;">
1142
1064
  <tr>
1143
1065
  <td align="center">
1144
- <table role="presentation" width="560" cellspacing="0" cellpadding="0" border="0" style="max-width:560px;background:${L$};border:1px solid ${qS};border-radius:8px;overflow:hidden;">
1066
+ <table role="presentation" width="560" cellspacing="0" cellpadding="0" border="0" style="max-width:560px;background:${VL};border:1px solid ${T0};border-radius:8px;overflow:hidden;">
1145
1067
  <tr>
1146
1068
  <td style="padding:32px 32px 8px 32px;">
1147
- <h1 style="margin:0 0 16px 0;font-size:22px;line-height:1.3;font-weight:600;color:${tp};">
1148
- You've been invited to ${sa(t)}
1069
+ <h1 style="margin:0 0 16px 0;font-size:22px;line-height:1.3;font-weight:600;color:${em};">
1070
+ You've been invited to ${oa(t)}
1149
1071
  </h1>
1150
- <p style="margin:0 0 16px 0;font-size:15px;line-height:1.5;color:${tp};">
1072
+ <p style="margin:0 0 16px 0;font-size:15px;line-height:1.5;color:${em};">
1151
1073
  Hi there,
1152
1074
  </p>
1153
- <p style="margin:0 0 16px 0;font-size:15px;line-height:1.5;color:${tp};">
1154
- <strong>${sa(n)}</strong> invited you to join
1155
- <strong>${sa(t)}</strong> on RuleMetric as ${c}.
1075
+ <p style="margin:0 0 16px 0;font-size:15px;line-height:1.5;color:${em};">
1076
+ <strong>${oa(n)}</strong> invited you to join
1077
+ <strong>${oa(t)}</strong> on RuleMetric as ${a}.
1156
1078
  </p>
1157
- <p style="margin:0 0 24px 0;font-size:15px;line-height:1.5;color:${np};">
1079
+ <p style="margin:0 0 24px 0;font-size:15px;line-height:1.5;color:${tm};">
1158
1080
  ${l}
1159
1081
  </p>
1160
1082
  </td>
1161
1083
  </tr>
1162
1084
  <tr>
1163
1085
  <td align="center" style="padding:0 32px 8px 32px;">
1164
- <a href="${sa(o)}"
1165
- style="display:inline-block;padding:12px 24px;background:${O$};color:${M$};text-decoration:none;border-radius:6px;font-size:15px;font-weight:600;">
1086
+ <a href="${oa(o)}"
1087
+ style="display:inline-block;padding:12px 24px;background:${FL};color:${zL};text-decoration:none;border-radius:6px;font-size:15px;font-weight:600;">
1166
1088
  Accept invitation
1167
1089
  </a>
1168
1090
  </td>
1169
1091
  </tr>
1170
1092
  <tr>
1171
1093
  <td style="padding:16px 32px 8px 32px;">
1172
- <p style="margin:0 0 8px 0;font-size:13px;line-height:1.5;color:${np};">
1094
+ <p style="margin:0 0 8px 0;font-size:13px;line-height:1.5;color:${tm};">
1173
1095
  Or copy and paste this link into your browser:
1174
1096
  </p>
1175
- <p style="margin:0 0 24px 0;font-size:13px;line-height:1.5;color:${D$};word-break:break-all;">
1176
- ${sa(o)}
1097
+ <p style="margin:0 0 24px 0;font-size:13px;line-height:1.5;color:${WL};word-break:break-all;">
1098
+ ${oa(o)}
1177
1099
  </p>
1178
- <p style="margin:0 0 24px 0;font-size:13px;line-height:1.5;color:${np};">
1179
- This invitation expires on <strong>${a}</strong>.
1100
+ <p style="margin:0 0 24px 0;font-size:13px;line-height:1.5;color:${tm};">
1101
+ This invitation expires on <strong>${c}</strong>.
1180
1102
  </p>
1181
1103
  </td>
1182
1104
  </tr>
1183
1105
  <tr>
1184
- <td style="padding:16px 32px 32px 32px;border-top:1px solid ${qS};">
1185
- <p style="margin:0;font-size:12px;line-height:1.5;color:${np};">
1106
+ <td style="padding:16px 32px 32px 32px;border-top:1px solid ${T0};">
1107
+ <p style="margin:0;font-size:12px;line-height:1.5;color:${tm};">
1186
1108
  If you didn't expect this email, you can safely ignore it. The link will expire on its own.
1187
1109
  </p>
1188
1110
  </td>
@@ -1192,12 +1114,12 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
1192
1114
  </tr>
1193
1115
  </table>
1194
1116
  </body>
1195
- </html>`,m=[`You've been invited to ${t}`,"","Hi there,","",`${n} invited you to join ${t} on RuleMetric as ${c}.`,"",l,"","Accept the invitation:",o,"",`This invitation expires on ${a}.`,"","--","If you didn't expect this email, you can safely ignore it. The link will expire on its own."].join(`
1196
- `);return{subject:i,html:p,text:m}}d(fh,"renderInvitation");function U$(){let e=process.env.RULEMETRIC_EMAIL_PROVIDER;return e==="resend"||e==="smtp"||e==="noop"?e:process.env.RESEND_API_KEY?"resend":"noop"}d(U$,"selectEmailProvider");var H$=new Set(["test","example","invalid","localhost"]),B$=/^example\.(com|net|org)$/;function F$(e){let t=e.trim().toLowerCase(),n=t.lastIndexOf("@");if(n<0)return!1;let r=t.slice(n+1);if(!r)return!1;let o=r.slice(r.lastIndexOf(".")+1);return!!(H$.has(o)||B$.test(r))}d(F$,"isUndeliverableRecipient");var US=!1;async function rp(e){let t=U$();switch(US||(US=!0,process.stderr.write(`[email] active provider: ${t}
1197
- `)),t){case"resend":return F$(e.to)?(process.stderr.write(`[email] skipping real send to reserved/undeliverable address ${e.to} (RFC 2606/6761) \u2014 routed to noop to protect sender reputation
1198
- `),mh(e)):MS(e);case"smtp":return LS(e);case"noop":if(process.env.NODE_ENV==="production"&&process.env.RULEMETRIC_EMAIL_PROVIDER!=="noop")throw new Error("email provider unconfigured in production: RESEND_API_KEY is not set (set it, or force RULEMETRIC_EMAIL_PROVIDER=noop to intentionally disable email)");return mh(e)}}d(rp,"sendEmail");var aa=new W$;function BS(){return z$(32).toString("base64url")}d(BS,"generateInviteToken");var HS=!1;function FS(e){let t=process.env.WEB_URL??process.env.RULEMETRIC_WEB_URL;return t||(process.env.NODE_ENV==="production"?(HS||(HS=!0,process.stderr.write(`[invite] WEB_URL / RULEMETRIC_WEB_URL is not set in production \u2014 falling back to https://rulemetric.com for invite accept links
1199
- `)),t="https://rulemetric.com"):t="http://localhost:5174"),`${t.replace(/\/$/,"")}/invite/${e}`}d(FS,"buildAcceptUrl");async function WS(e){let[t]=await u.select({displayName:T.displayName,email:T.email}).from(T).where(qn(T.id,e));return t?.displayName?.trim()||t?.email||"A teammate"}d(WS,"getInviterDisplayName");async function zS(e){try{let{subject:t,html:n,text:r}=fh({orgName:e.orgName,inviterName:e.inviterName,role:e.role,acceptUrl:e.acceptUrl,expiresAt:e.expiresAt});return(await rp({to:e.to,subject:t,html:n,text:r})).provider==="noop"?{sent:!1,reason:"email provider is noop \u2014 no email was delivered; share the accept link directly"}:{sent:!0}}catch(t){let n=t instanceof Error?t.message:String(t);return process.stderr.write(`[invite] email send failed for ${e.to}: ${n}
1200
- `),rr(t,{tags:{source:"invite-email"},extra:{to:e.to,orgName:e.orgName}}),{sent:!1,reason:n}}}d(zS,"sendInvitationEmail");var K$=op.enum(["admin","member"]),Y$=op.object({email:op.string().email().max(254),role:K$.optional(),teamId:op.string().uuid().optional()});aa.post("/orgs/:slug/invitations",ht(["owner","admin"]),async e=>{let t;try{t=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let n=Y$.safeParse(t);if(!n.success)return e.json({error:n.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let r=e.get("orgId"),o=e.get("userId"),s=n.data.email.toLowerCase(),i=n.data.role??"member",a=n.data.teamId;if(a){let[f]=await u.select({id:K.id}).from(K).where(sp(qn(K.id,a),qn(K.orgId,r)));if(!f)return e.json({error:"Team not found in this organization",code:"INVALID_TEAM"},400)}let c=BS(),l;try{let[f]=await u.insert(ae).values({orgId:r,email:s,role:i,teamId:a??null,invitedBy:o,token:c,expiresAt:new Date(Date.now()+6048e5)}).returning({id:ae.id,email:ae.email,role:ae.role,teamId:ae.teamId,expiresAt:ae.expiresAt});l=f}catch(f){if(zt(f)==="23505")return e.json({error:"A pending invitation for this email already exists",code:"INVITE_ALREADY_PENDING"},409);throw f}let p=FS(c),[m]=await u.select({name:G.name}).from(G).where(qn(G.id,r)),y=await WS(o),v=await zS({to:s,orgName:m?.name??"your organization",inviterName:y,role:l.role,acceptUrl:p,expiresAt:l.expiresAt}),h=process.env.NODE_ENV==="test";return e.json({id:l.id,email:l.email,role:l.role,teamId:l.teamId,expiresAt:l.expiresAt,acceptUrl:p,emailSent:v.sent,...v.sent?{}:{emailError:v.reason},...h?{token:c}:{}},201)});aa.get("/orgs/:slug/invitations",ht(["owner","admin"]),async e=>{let t=e.get("orgId"),n=await u.select({id:ae.id,email:ae.email,role:ae.role,teamId:ae.teamId,teamName:K.name,invitedById:ae.invitedBy,invitedByDisplayName:T.displayName,invitedByEmail:T.email,createdAt:ae.createdAt,expiresAt:ae.expiresAt}).from(ae).leftJoin(K,qn(ae.teamId,K.id)).leftJoin(T,qn(ae.invitedBy,T.id)).where(sp(qn(ae.orgId,t),ia(ae.acceptedAt),ia(ae.revokedAt),G$(ae.expiresAt,J$`now()`))).orderBy(V$(ae.createdAt));return e.json(n.map(r=>({id:r.id,email:r.email,role:r.role,teamId:r.teamId,teamName:r.teamName,invitedById:r.invitedById,invitedByName:r.invitedByDisplayName??r.invitedByEmail??null,createdAt:r.createdAt,expiresAt:r.expiresAt})))});aa.post("/orgs/:slug/invitations/:id/revoke",ht(["owner","admin"]),async e=>{let t=e.req.param("id");if(!t||!Gr.test(t))return e.json({error:"Invalid invitation id",code:"BAD_REQUEST"},400);let n=e.get("orgId");return(await u.update(ae).set({revokedAt:new Date}).where(sp(qn(ae.id,t),qn(ae.orgId,n),ia(ae.acceptedAt),ia(ae.revokedAt))).returning({id:ae.id})).length===0?e.json({error:"Invitation not found",code:"INVITE_NOT_FOUND"},404):e.body(null,204)});aa.post("/orgs/:slug/invitations/:id/resend",ht(["owner","admin"]),async e=>{let t=e.req.param("id");if(!t||!Gr.test(t))return e.json({error:"Invalid invitation id",code:"BAD_REQUEST"},400);let n=e.get("orgId"),r=BS(),o=new Date(Date.now()+10080*60*1e3),s=await u.update(ae).set({token:r,expiresAt:o}).where(sp(qn(ae.id,t),qn(ae.orgId,n),ia(ae.acceptedAt),ia(ae.revokedAt))).returning({id:ae.id,email:ae.email,role:ae.role,expiresAt:ae.expiresAt});if(s.length===0)return e.json({error:"Invitation not found",code:"INVITE_NOT_FOUND"},404);let i=s[0],a=FS(r),c=e.get("userId"),[l]=await u.select({name:G.name}).from(G).where(qn(G.id,n)),p=await WS(c),m=await zS({to:i.email,orgName:l?.name??"your organization",inviterName:p,role:i.role,acceptUrl:a,expiresAt:i.expiresAt}),y=process.env.NODE_ENV==="test";return e.json({id:i.id,email:i.email,expiresAt:i.expiresAt,acceptUrl:a,emailSent:m.sent,...m.sent?{}:{emailError:m.reason},...y?{token:r}:{}})});O();import{Hono as X$}from"hono";import{eq as td,and as JS,sql as GS,inArray as gh,gte as KS}from"drizzle-orm";var ap=new X$,ip={"7d":7,"30d":30},VS={fully_achieved:1,mostly_achieved:.75,partially_achieved:.5,unclear_from_transcript:.25,not_achieved:0};async function hh(e,t,n,r,o,s){let i=new Map;for(let A of e)i.set(A.tool,(i.get(A.tool)??0)+1);let a=[...i.entries()].sort((A,E)=>E[1]-A[1]).slice(0,5).map(([A,E])=>({tool:A,count:E})),c=new Map;for(let A of e)c.set(A.userId,(c.get(A.userId)??0)+1);let l=[...c.entries()].sort((A,E)=>E[1]-A[1]).slice(0,5).map(([A])=>A),p=l.length?await u.select({id:T.id,displayName:T.displayName,email:T.email}).from(T).where(gh(T.id,l)):[],m=new Map(p.map(A=>[A.id,A])),y=l.map(A=>{let E=m.get(A);return{userId:A,displayName:E?.displayName??null,email:E?.email??null,count:c.get(A)??0}}),v=new Map;for(let A of e){let E=A.analysis;if(!E)continue;let R=E.friction;if(!R)continue;let D=Object.values(R).reduce(($,H)=>$+(typeof H=="number"?H:0),0),j=A.startedAt.toISOString().split("T")[0]??"",P=v.get(j)??{sum:0,count:0};P.sum+=D,P.count+=1,v.set(j,P)}let h=[...v.entries()].sort(([A],[E])=>A<E?-1:1).map(([A,{sum:E,count:R}])=>({day:A,avgFriction:Math.round(E/R*100)/100})),f=e.map(A=>A.id),w=f.length?await u.select({sessionId:se.sessionId,instructionId:se.instructionId,name:g.name,source:GS`${g.frontmatter}->>'source'`}).from(se).innerJoin(g,td(g.id,se.instructionId)).where(gh(se.sessionId,f)):[],b=new Map;for(let A of w){let E=b.get(A.instructionId);E?E.sessions.add(A.sessionId):b.set(A.instructionId,{name:A.name,source:A.source,sessions:new Set([A.sessionId])})}let I=new Map;for(let A of e){let E=A.analysis;if(!E)continue;let R=E.outcome;R&&R in VS&&I.set(A.id,VS[R])}let S=[];for(let[A,{name:E,source:R,sessions:D}]of b){let j=[],P=[];for(let _e of e){let ee=I.get(_e.id);ee!==void 0&&(D.has(_e.id)?j.push(ee):P.push(ee))}let $=d(_e=>_e.length===0?null:_e.reduce((ee,Re)=>ee+Re,0)/_e.length,"avg"),H=$(j),B=$(P),te=H!==null&&B!==null?Math.round((H-B)*1e3)/10:null;S.push({instructionId:A,name:E,source:R,withSessions:D.size,withoutSessions:e.length-D.size,deltaPct:te})}return{range:t,sessionCount:e.length,memberCount:n,topTools:a,topMembers:y,frictionTrend:h,instructionEffectiveness:S}}d(hh,"buildActivityResponse");ap.get("/orgs/:slug/activity",ht(["owner","admin","member"]),async e=>{let t=e.get("orgId"),n=e.req.query("range")??"7d";if(!(n in ip))return e.json({error:"Invalid range. Allowed: 7d, 30d",code:"BAD_REQUEST"},400);let r=new Date(Date.now()-ip[n]*24*60*60*1e3),o=await u.select({id:_.id,userId:_.userId,tool:_.tool,startedAt:_.startedAt,analysis:_.analysis}).from(_).where(JS(td(_.orgId,t),KS(_.startedAt,r))),[{count:s}]=await u.select({count:GS`count(*)::int`}).from(Q).where(td(Q.orgId,t)),i=await hh(o,n,Number(s),t,r,null);return e.json(i)});ap.get("/orgs/:slug/teams/:teamId/activity",ht(["owner","admin","member"]),async e=>{let t=await Ds(e);if(!t.ok)return t.response;let n=t.team,r=e.req.query("range")??"7d";if(!(r in ip))return e.json({error:"Invalid range. Allowed: 7d, 30d",code:"BAD_REQUEST"},400);let o=new Date(Date.now()-ip[r]*24*60*60*1e3),s=e.get("orgId"),a=(await u.select({userId:ye.userId}).from(ye).where(td(ye.teamId,n.id))).map(p=>p.userId);if(a.length===0){let p=await hh([],r,0,s,o,[]);return e.json(p)}let c=await u.select({id:_.id,userId:_.userId,tool:_.tool,startedAt:_.startedAt,analysis:_.analysis}).from(_).where(JS(td(_.orgId,s),KS(_.startedAt,o),gh(_.userId,a))),l=await hh(c,r,a.length,s,o,a);return e.json(l)});var Bo=new Q$;Bo.route("/",$o);Bo.route("/",ed);Bo.route("/",Ho);Bo.route("/",aa);Bo.route("/",ap);O();import{Hono as Z$}from"hono";import{z as _h}from"zod";import{createClient as e1}from"@supabase/supabase-js";import{eq as nd,and as YS,isNull as XS,sql as QS}from"drizzle-orm";var rd=new Z$;rd.get("/:token",async e=>{let t=e.req.param("token");if(!t||t.length<8)return e.json({error:"Invitation no longer valid",code:"INVITE_GONE"},410);let[n]=await u.select({orgName:G.name,role:ae.role,email:ae.email,acceptedAt:ae.acceptedAt,revokedAt:ae.revokedAt,expiresAt:ae.expiresAt,inviterDisplayName:T.displayName,inviterEmail:T.email}).from(ae).innerJoin(G,nd(ae.orgId,G.id)).leftJoin(T,nd(ae.invitedBy,T.id)).where(nd(ae.token,t));if(!n)return e.json({error:"Invitation no longer valid",code:"INVITE_GONE"},410);let r=Date.now(),o=new Date(n.expiresAt).getTime()<r;if(n.acceptedAt||n.revokedAt||o)return e.json({error:"Invitation no longer valid",code:"INVITE_GONE"},410);let s=null,i,a=e.req.header("Authorization");if(a?.startsWith("Bearer ")){let l=a.slice(7);if(l&&!l.startsWith("rm_"))try{let p=e1(process.env.SUPABASE_URL,process.env.SUPABASE_ANON_KEY,{global:{headers:{Authorization:`Bearer ${l}`}}}),{data:m,error:y}=await p.auth.getUser();!y&&m.user&&(s=m.user.id,i=m.user.email)}catch{}}let c=null;if(s&&i&&i.toLowerCase()===n.email.toLowerCase()){let[{cnt:l}]=await u.select({cnt:QS`count(*)::int`}).from(_).where(YS(nd(_.userId,s),XS(_.orgId)));c=Number(l)}return e.json({orgName:n.orgName,inviterName:n.inviterDisplayName??n.inviterEmail??null,role:n.role,sessionCount:c})});var t1=_h.object({token:_h.string().min(1),acknowledgedSessionCount:_h.number().int().nonnegative()});rd.post("/accept",async e=>{let t=e.get("supabase");if(!t)return e.json({error:"JWT authentication required for this endpoint",code:"JWT_REQUIRED"},401);let n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let r=t1.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let o=e.get("userId");if(o){let[{cnt:c}]=await u.select({cnt:QS`count(*)::int`}).from(_).where(YS(nd(_.userId,o),XS(_.orgId))),l=Number(c);if(l>r.data.acknowledgedSessionCount)return e.json({error:"Session count changed since you reviewed the consent notice \u2014 please re-confirm",code:"SESSION_COUNT_CHANGED",currentSessionCount:l},409)}let{data:s,error:i}=await t.rpc("accept_invitation",{p_token:r.data.token});if(i){let c=zt(i),l=vo(i);if(c==="P0001"){if(/invitation_not_found/i.test(l))return e.json({error:"Invitation not found",code:"INVITE_NOT_FOUND"},404);if(/invitation_revoked/i.test(l))return e.json({error:"Invitation no longer valid",code:"INVITE_GONE"},410);if(/invitation_already_accepted/i.test(l))return e.json({error:"Invitation no longer valid",code:"INVITE_GONE"},410);if(/invitation_expired/i.test(l))return e.json({error:"Invitation no longer valid",code:"INVITE_GONE"},410);if(/invitation_email_mismatch/i.test(l))return e.json({error:"This invitation is for a different email address",code:"INVITE_EMAIL_MISMATCH"},403);if(/already_member/i.test(l))return e.json({error:"You are already a member of this organization",code:"ALREADY_MEMBER"},409);if(/already_team_member/i.test(l))return e.json({error:"You are already a member of this team",code:"ALREADY_TEAM_MEMBER"},409);if(/unauthenticated/i.test(l))return e.json({error:"Unauthenticated",code:"UNAUTHENTICATED"},401)}throw i}let a=s;return e.json({orgId:a.orgId,role:a.role})});O();import{Hono as n1}from"hono";import{z as od}from"zod";import{eq as sd,and as r1}from"drizzle-orm";var id=new n1;id.get("/profile",async e=>{let t=e.get("userId"),[n]=await u.select({id:T.id,email:T.email,displayName:T.displayName,activeOrgId:T.activeOrgId,isSuperadmin:T.isSuperadmin,claudeCodePlan:T.claudeCodePlan,planSource:T.planSource,setupCompletedAt:T.setupCompletedAt,liveSendSkipped:T.liveSendSkipped}).from(T).where(sd(T.id,t));return n?(e.header("Cache-Control","private, max-age=15"),e.json({id:n.id,email:n.email,displayName:n.displayName,activeOrgId:n.activeOrgId,isSuperadmin:n.isSuperadmin,claudeCodePlan:n.claudeCodePlan,planSource:n.planSource,setupCompletedAt:n.setupCompletedAt,liveSendSkipped:n.liveSendSkipped})):e.json({error:"Profile not found",code:"PROFILE_NOT_FOUND"},404)});var o1=["free","pro","max_5x","max_20x"],s1=od.object({activeOrgId:od.string().uuid().nullable().optional(),claudeCodePlan:od.enum(o1).nullable().optional(),setupCompletedAt:od.string().datetime().nullable().optional(),liveSendSkipped:od.boolean().optional()});id.patch("/profile",async e=>{let t=e.get("userId"),n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let r=s1.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let o=r.data;if("activeOrgId"in o&&o.activeOrgId!=null){let[a]=await u.select({orgId:Q.orgId}).from(Q).where(r1(sd(Q.userId,t),sd(Q.orgId,o.activeOrgId)));if(!a)return e.json({error:"You are not a member of the requested organization",code:"NOT_A_MEMBER"},403)}let s={};"activeOrgId"in o&&(s.activeOrgId=o.activeOrgId??null),"claudeCodePlan"in o&&(s.claudeCodePlan=o.claudeCodePlan??null,s.planSource=o.claudeCodePlan==null?"detected":"manual"),"setupCompletedAt"in o&&(s.setupCompletedAt=o.setupCompletedAt?new Date(o.setupCompletedAt):null),"liveSendSkipped"in o&&(s.liveSendSkipped=o.liveSendSkipped),Object.keys(s).length>0&&await u.update(T).set(s).where(sd(T.id,t));let[i]=await u.select({activeOrgId:T.activeOrgId,claudeCodePlan:T.claudeCodePlan,planSource:T.planSource,setupCompletedAt:T.setupCompletedAt,liveSendSkipped:T.liveSendSkipped}).from(T).where(sd(T.id,t));return e.json({activeOrgId:i.activeOrgId,claudeCodePlan:i.claudeCodePlan,planSource:i.planSource,setupCompletedAt:i.setupCompletedAt,liveSendSkipped:i.liveSendSkipped})});O();import{Hono as a1}from"hono";import{z as _t}from"zod";import{asc as ZS,eq as Ms,sql as Un}from"drizzle-orm";O();import{eq as i1}from"drizzle-orm";function ad(){return async(e,t)=>{let n=e.get("userId");if(!n)return e.json({error:"Unauthenticated",code:"UNAUTHENTICATED"},401);let[r]=await u.select({isSuperadmin:T.isSuperadmin}).from(T).where(i1(T.id,n));if(!r?.isSuperadmin)return e.json({error:"Forbidden",code:"NOT_SUPERADMIN"},403);await t()}}d(ad,"requireSuperadmin");Pc();var fn=new a1;fn.use("/superadmin/*",ad());var c1=_t.object({search:_t.string().trim().min(1).max(120).optional(),limit:_t.coerce.number().int().min(1).max(200).default(50),offset:_t.coerce.number().int().min(0).default(0)});fn.get("/superadmin/users",async e=>{let t=c1.safeParse({search:e.req.query("search"),limit:e.req.query("limit"),offset:e.req.query("offset")});if(!t.success)return e.json({error:t.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let{search:n,limit:r,offset:o}=t.data,s=await u.execute(Un`
1117
+ </html>`,p=[`You've been invited to ${t}`,"","Hi there,","",`${n} invited you to join ${t} on RuleMetric as ${a}.`,"",l,"","Accept the invitation:",o,"",`This invitation expires on ${c}.`,"","--","If you didn't expect this email, you can safely ignore it. The link will expire on its own."].join(`
1118
+ `);return{subject:i,html:m,text:p}}u(lh,"renderInvitation");function GL(){let e=process.env.RULEMETRIC_EMAIL_PROVIDER;return e==="resend"||e==="smtp"||e==="noop"?e:process.env.RESEND_API_KEY?"resend":"noop"}u(GL,"selectEmailProvider");var YL=new Set(["test","example","invalid","localhost"]),XL=/^example\.(com|net|org)$/;function QL(e){let t=e.trim().toLowerCase(),n=t.lastIndexOf("@");if(n<0)return!1;let r=t.slice(n+1);if(!r)return!1;let o=r.slice(r.lastIndexOf(".")+1);return!!(YL.has(o)||XL.test(r))}u(QL,"isUndeliverableRecipient");var R0=!1;async function nm(e){let t=GL();switch(R0||(R0=!0,process.stderr.write(`[email] active provider: ${t}
1119
+ `)),t){case"resend":return QL(e.to)?(process.stderr.write(`[email] skipping real send to reserved/undeliverable address ${e.to} (RFC 2606/6761) \u2014 routed to noop to protect sender reputation
1120
+ `),dh(e)):A0(e);case"smtp":return E0(e);case"noop":if(process.env.NODE_ENV==="production"&&process.env.RULEMETRIC_EMAIL_PROVIDER!=="noop")throw new Error("email provider unconfigured in production: RESEND_API_KEY is not set (set it, or force RULEMETRIC_EMAIL_PROVIDER=noop to intentionally disable email)");return dh(e)}}u(nm,"sendEmail");var ia=new ZL;function N0(){return eM(32).toString("base64url")}u(N0,"generateInviteToken");var k0=!1;function j0(e){let t=process.env.WEB_URL??process.env.RULEMETRIC_WEB_URL;return t||(process.env.NODE_ENV==="production"?(k0||(k0=!0,process.stderr.write(`[invite] WEB_URL / RULEMETRIC_WEB_URL is not set in production \u2014 falling back to https://rulemetric.com for invite accept links
1121
+ `)),t="https://rulemetric.com"):t="http://localhost:5174"),`${t.replace(/\/$/,"")}/invite/${e}`}u(j0,"buildAcceptUrl");async function P0(e){let[t]=await d.select({displayName:T.displayName,email:T.email}).from(T).where(Hn(T.id,e));return t?.displayName?.trim()||t?.email||"A teammate"}u(P0,"getInviterDisplayName");async function D0(e){try{let{subject:t,html:n,text:r}=lh({orgName:e.orgName,inviterName:e.inviterName,role:e.role,acceptUrl:e.acceptUrl,expiresAt:e.expiresAt});return(await nm({to:e.to,subject:t,html:n,text:r})).provider==="noop"?{sent:!1,reason:"email provider is noop \u2014 no email was delivered; share the accept link directly"}:{sent:!0}}catch(t){let n=t instanceof Error?t.message:String(t);return process.stderr.write(`[invite] email send failed for ${e.to}: ${n}
1122
+ `),rr(t,{tags:{source:"invite-email"},extra:{to:e.to,orgName:e.orgName}}),{sent:!1,reason:n}}}u(D0,"sendInvitationEmail");var oM=rm.enum(["admin","member"]),sM=rm.object({email:rm.string().email().max(254),role:oM.optional(),teamId:rm.string().uuid().optional()});ia.post("/orgs/:slug/invitations",gt(["owner","admin"]),async e=>{let t;try{t=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let n=sM.safeParse(t);if(!n.success)return e.json({error:n.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let r=e.get("orgId"),o=e.get("userId"),s=n.data.email.toLowerCase(),i=n.data.role??"member",c=n.data.teamId;if(c){let[f]=await d.select({id:G.id}).from(G).where(om(Hn(G.id,c),Hn(G.orgId,r)));if(!f)return e.json({error:"Team not found in this organization",code:"INVALID_TEAM"},400)}let a=N0(),l;try{let[f]=await d.insert(ae).values({orgId:r,email:s,role:i,teamId:c??null,invitedBy:o,token:a,expiresAt:new Date(Date.now()+6048e5)}).returning({id:ae.id,email:ae.email,role:ae.role,teamId:ae.teamId,expiresAt:ae.expiresAt});l=f}catch(f){if(Ft(f)==="23505")return e.json({error:"A pending invitation for this email already exists",code:"INVITE_ALREADY_PENDING"},409);throw f}let m=j0(a),[p]=await d.select({name:K.name}).from(K).where(Hn(K.id,r)),_=await P0(o),I=await D0({to:s,orgName:p?.name??"your organization",inviterName:_,role:l.role,acceptUrl:m,expiresAt:l.expiresAt}),h=process.env.NODE_ENV==="test";return e.json({id:l.id,email:l.email,role:l.role,teamId:l.teamId,expiresAt:l.expiresAt,acceptUrl:m,emailSent:I.sent,...I.sent?{}:{emailError:I.reason},...h?{token:a}:{}},201)});ia.get("/orgs/:slug/invitations",gt(["owner","admin"]),async e=>{let t=e.get("orgId"),n=await d.select({id:ae.id,email:ae.email,role:ae.role,teamId:ae.teamId,teamName:G.name,invitedById:ae.invitedBy,invitedByDisplayName:T.displayName,invitedByEmail:T.email,createdAt:ae.createdAt,expiresAt:ae.expiresAt}).from(ae).leftJoin(G,Hn(ae.teamId,G.id)).leftJoin(T,Hn(ae.invitedBy,T.id)).where(om(Hn(ae.orgId,t),sa(ae.acceptedAt),sa(ae.revokedAt),rM(ae.expiresAt,nM`now()`))).orderBy(tM(ae.createdAt));return e.json(n.map(r=>({id:r.id,email:r.email,role:r.role,teamId:r.teamId,teamName:r.teamName,invitedById:r.invitedById,invitedByName:r.invitedByDisplayName??r.invitedByEmail??null,createdAt:r.createdAt,expiresAt:r.expiresAt})))});ia.post("/orgs/:slug/invitations/:id/revoke",gt(["owner","admin"]),async e=>{let t=e.req.param("id");if(!t||!Kr.test(t))return e.json({error:"Invalid invitation id",code:"BAD_REQUEST"},400);let n=e.get("orgId");return(await d.update(ae).set({revokedAt:new Date}).where(om(Hn(ae.id,t),Hn(ae.orgId,n),sa(ae.acceptedAt),sa(ae.revokedAt))).returning({id:ae.id})).length===0?e.json({error:"Invitation not found",code:"INVITE_NOT_FOUND"},404):e.body(null,204)});ia.post("/orgs/:slug/invitations/:id/resend",gt(["owner","admin"]),async e=>{let t=e.req.param("id");if(!t||!Kr.test(t))return e.json({error:"Invalid invitation id",code:"BAD_REQUEST"},400);let n=e.get("orgId"),r=N0(),o=new Date(Date.now()+10080*60*1e3),s=await d.update(ae).set({token:r,expiresAt:o}).where(om(Hn(ae.id,t),Hn(ae.orgId,n),sa(ae.acceptedAt),sa(ae.revokedAt))).returning({id:ae.id,email:ae.email,role:ae.role,expiresAt:ae.expiresAt});if(s.length===0)return e.json({error:"Invitation not found",code:"INVITE_NOT_FOUND"},404);let i=s[0],c=j0(r),a=e.get("userId"),[l]=await d.select({name:K.name}).from(K).where(Hn(K.id,n)),m=await P0(a),p=await D0({to:i.email,orgName:l?.name??"your organization",inviterName:m,role:i.role,acceptUrl:c,expiresAt:i.expiresAt}),_=process.env.NODE_ENV==="test";return e.json({id:i.id,email:i.email,expiresAt:i.expiresAt,acceptUrl:c,emailSent:p.sent,...p.sent?{}:{emailError:p.reason},..._?{token:r}:{}})});C();import{Hono as iM}from"hono";import{eq as nu,and as C0,sql as L0,inArray as mh,gte as M0}from"drizzle-orm";var im=new iM,sm={"7d":7,"30d":30},O0={fully_achieved:1,mostly_achieved:.75,partially_achieved:.5,unclear_from_transcript:.25,not_achieved:0};async function ph(e,t,n,r,o,s){let i=new Map;for(let A of e)i.set(A.tool,(i.get(A.tool)??0)+1);let c=[...i.entries()].sort((A,E)=>E[1]-A[1]).slice(0,5).map(([A,E])=>({tool:A,count:E})),a=new Map;for(let A of e)a.set(A.userId,(a.get(A.userId)??0)+1);let l=[...a.entries()].sort((A,E)=>E[1]-A[1]).slice(0,5).map(([A])=>A),m=l.length?await d.select({id:T.id,displayName:T.displayName,email:T.email}).from(T).where(mh(T.id,l)):[],p=new Map(m.map(A=>[A.id,A])),_=l.map(A=>{let E=p.get(A);return{userId:A,displayName:E?.displayName??null,email:E?.email??null,count:a.get(A)??0}}),I=new Map;for(let A of e){let E=A.analysis;if(!E)continue;let R=E.friction;if(!R)continue;let P=Object.values(R).reduce((q,H)=>q+(typeof H=="number"?H:0),0),N=A.startedAt.toISOString().split("T")[0]??"",D=I.get(N)??{sum:0,count:0};D.sum+=P,D.count+=1,I.set(N,D)}let h=[...I.entries()].sort(([A],[E])=>A<E?-1:1).map(([A,{sum:E,count:R}])=>({day:A,avgFriction:Math.round(E/R*100)/100})),f=e.map(A=>A.id),w=f.length?await d.select({sessionId:se.sessionId,instructionId:se.instructionId,name:g.name,source:L0`${g.frontmatter}->>'source'`}).from(se).innerJoin(g,nu(g.id,se.instructionId)).where(mh(se.sessionId,f)):[],b=new Map;for(let A of w){let E=b.get(A.instructionId);E?E.sessions.add(A.sessionId):b.set(A.instructionId,{name:A.name,source:A.source,sessions:new Set([A.sessionId])})}let v=new Map;for(let A of e){let E=A.analysis;if(!E)continue;let R=E.outcome;R&&R in O0&&v.set(A.id,O0[R])}let S=[];for(let[A,{name:E,source:R,sessions:P}]of b){let N=[],D=[];for(let he of e){let te=v.get(he.id);te!==void 0&&(P.has(he.id)?N.push(te):D.push(te))}let q=u(he=>he.length===0?null:he.reduce((te,Te)=>te+Te,0)/he.length,"avg"),H=q(N),B=q(D),ee=H!==null&&B!==null?Math.round((H-B)*1e3)/10:null;S.push({instructionId:A,name:E,source:R,withSessions:P.size,withoutSessions:e.length-P.size,deltaPct:ee})}return{range:t,sessionCount:e.length,memberCount:n,topTools:c,topMembers:_,frictionTrend:h,instructionEffectiveness:S}}u(ph,"buildActivityResponse");im.get("/orgs/:slug/activity",gt(["owner","admin","member"]),async e=>{let t=e.get("orgId"),n=e.req.query("range")??"7d";if(!(n in sm))return e.json({error:"Invalid range. Allowed: 7d, 30d",code:"BAD_REQUEST"},400);let r=new Date(Date.now()-sm[n]*24*60*60*1e3),o=await d.select({id:y.id,userId:y.userId,tool:y.tool,startedAt:y.startedAt,analysis:y.analysis}).from(y).where(C0(nu(y.orgId,t),M0(y.startedAt,r))),[{count:s}]=await d.select({count:L0`count(*)::int`}).from(Q).where(nu(Q.orgId,t)),i=await ph(o,n,Number(s),t,r,null);return e.json(i)});im.get("/orgs/:slug/teams/:teamId/activity",gt(["owner","admin","member"]),async e=>{let t=await Cs(e);if(!t.ok)return t.response;let n=t.team,r=e.req.query("range")??"7d";if(!(r in sm))return e.json({error:"Invalid range. Allowed: 7d, 30d",code:"BAD_REQUEST"},400);let o=new Date(Date.now()-sm[r]*24*60*60*1e3),s=e.get("orgId"),c=(await d.select({userId:_e.userId}).from(_e).where(nu(_e.teamId,n.id))).map(m=>m.userId);if(c.length===0){let m=await ph([],r,0,s,o,[]);return e.json(m)}let a=await d.select({id:y.id,userId:y.userId,tool:y.tool,startedAt:y.startedAt,analysis:y.analysis}).from(y).where(C0(nu(y.orgId,s),M0(y.startedAt,o),mh(y.userId,c))),l=await ph(a,r,c.length,s,o,c);return e.json(l)});var Ho=new aM;Ho.route("/",Mo);Ho.route("/",tu);Ho.route("/",Uo);Ho.route("/",ia);Ho.route("/",im);C();import{Hono as cM}from"hono";import{z as fh}from"zod";import{createClient as uM}from"@supabase/supabase-js";import{eq as ru,and as $0,isNull as q0,sql as U0}from"drizzle-orm";var ou=new cM;ou.get("/:token",async e=>{let t=e.req.param("token");if(!t||t.length<8)return e.json({error:"Invitation no longer valid",code:"INVITE_GONE"},410);let[n]=await d.select({orgName:K.name,role:ae.role,email:ae.email,acceptedAt:ae.acceptedAt,revokedAt:ae.revokedAt,expiresAt:ae.expiresAt,inviterDisplayName:T.displayName,inviterEmail:T.email}).from(ae).innerJoin(K,ru(ae.orgId,K.id)).leftJoin(T,ru(ae.invitedBy,T.id)).where(ru(ae.token,t));if(!n)return e.json({error:"Invitation no longer valid",code:"INVITE_GONE"},410);let r=Date.now(),o=new Date(n.expiresAt).getTime()<r;if(n.acceptedAt||n.revokedAt||o)return e.json({error:"Invitation no longer valid",code:"INVITE_GONE"},410);let s=null,i,c=e.req.header("Authorization");if(c?.startsWith("Bearer ")){let l=c.slice(7);if(l&&!l.startsWith("rm_"))try{let m=uM(process.env.SUPABASE_URL,process.env.SUPABASE_ANON_KEY,{global:{headers:{Authorization:`Bearer ${l}`}}}),{data:p,error:_}=await m.auth.getUser();!_&&p.user&&(s=p.user.id,i=p.user.email)}catch{}}let a=null;if(s&&i&&i.toLowerCase()===n.email.toLowerCase()){let[{cnt:l}]=await d.select({cnt:U0`count(*)::int`}).from(y).where($0(ru(y.userId,s),q0(y.orgId)));a=Number(l)}return e.json({orgName:n.orgName,inviterName:n.inviterDisplayName??n.inviterEmail??null,role:n.role,sessionCount:a})});var dM=fh.object({token:fh.string().min(1),acknowledgedSessionCount:fh.number().int().nonnegative()});ou.post("/accept",async e=>{let t=e.get("supabase");if(!t)return e.json({error:"JWT authentication required for this endpoint",code:"JWT_REQUIRED"},401);let n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let r=dM.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let o=e.get("userId");if(o){let[{cnt:a}]=await d.select({cnt:U0`count(*)::int`}).from(y).where($0(ru(y.userId,o),q0(y.orgId))),l=Number(a);if(l>r.data.acknowledgedSessionCount)return e.json({error:"Session count changed since you reviewed the consent notice \u2014 please re-confirm",code:"SESSION_COUNT_CHANGED",currentSessionCount:l},409)}let{data:s,error:i}=await t.rpc("accept_invitation",{p_token:r.data.token});if(i){let a=Ft(i),l=vo(i);if(a==="P0001"){if(/invitation_not_found/i.test(l))return e.json({error:"Invitation not found",code:"INVITE_NOT_FOUND"},404);if(/invitation_revoked/i.test(l))return e.json({error:"Invitation no longer valid",code:"INVITE_GONE"},410);if(/invitation_already_accepted/i.test(l))return e.json({error:"Invitation no longer valid",code:"INVITE_GONE"},410);if(/invitation_expired/i.test(l))return e.json({error:"Invitation no longer valid",code:"INVITE_GONE"},410);if(/invitation_email_mismatch/i.test(l))return e.json({error:"This invitation is for a different email address",code:"INVITE_EMAIL_MISMATCH"},403);if(/already_member/i.test(l))return e.json({error:"You are already a member of this organization",code:"ALREADY_MEMBER"},409);if(/already_team_member/i.test(l))return e.json({error:"You are already a member of this team",code:"ALREADY_TEAM_MEMBER"},409);if(/unauthenticated/i.test(l))return e.json({error:"Unauthenticated",code:"UNAUTHENTICATED"},401)}throw i}let c=s;return e.json({orgId:c.orgId,role:c.role})});C();import{Hono as lM}from"hono";import{z as su}from"zod";import{eq as iu,and as mM}from"drizzle-orm";var au=new lM;au.get("/profile",async e=>{let t=e.get("userId"),[n]=await d.select({id:T.id,email:T.email,displayName:T.displayName,activeOrgId:T.activeOrgId,isSuperadmin:T.isSuperadmin,claudeCodePlan:T.claudeCodePlan,planSource:T.planSource,setupCompletedAt:T.setupCompletedAt,liveSendSkipped:T.liveSendSkipped}).from(T).where(iu(T.id,t));return n?(e.header("Cache-Control","private, max-age=15"),e.json({id:n.id,email:n.email,displayName:n.displayName,activeOrgId:n.activeOrgId,isSuperadmin:n.isSuperadmin,claudeCodePlan:n.claudeCodePlan,planSource:n.planSource,setupCompletedAt:n.setupCompletedAt,liveSendSkipped:n.liveSendSkipped})):e.json({error:"Profile not found",code:"PROFILE_NOT_FOUND"},404)});var pM=["free","pro","max_5x","max_20x"],fM=su.object({activeOrgId:su.string().uuid().nullable().optional(),claudeCodePlan:su.enum(pM).nullable().optional(),setupCompletedAt:su.string().datetime().nullable().optional(),liveSendSkipped:su.boolean().optional()});au.patch("/profile",async e=>{let t=e.get("userId"),n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let r=fM.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let o=r.data;if("activeOrgId"in o&&o.activeOrgId!=null){let[c]=await d.select({orgId:Q.orgId}).from(Q).where(mM(iu(Q.userId,t),iu(Q.orgId,o.activeOrgId)));if(!c)return e.json({error:"You are not a member of the requested organization",code:"NOT_A_MEMBER"},403)}let s={};"activeOrgId"in o&&(s.activeOrgId=o.activeOrgId??null),"claudeCodePlan"in o&&(s.claudeCodePlan=o.claudeCodePlan??null,s.planSource=o.claudeCodePlan==null?"detected":"manual"),"setupCompletedAt"in o&&(s.setupCompletedAt=o.setupCompletedAt?new Date(o.setupCompletedAt):null),"liveSendSkipped"in o&&(s.liveSendSkipped=o.liveSendSkipped),Object.keys(s).length>0&&await d.update(T).set(s).where(iu(T.id,t));let[i]=await d.select({activeOrgId:T.activeOrgId,claudeCodePlan:T.claudeCodePlan,planSource:T.planSource,setupCompletedAt:T.setupCompletedAt,liveSendSkipped:T.liveSendSkipped}).from(T).where(iu(T.id,t));return e.json({activeOrgId:i.activeOrgId,claudeCodePlan:i.claudeCodePlan,planSource:i.planSource,setupCompletedAt:i.setupCompletedAt,liveSendSkipped:i.liveSendSkipped})});C();import{Hono as hM}from"hono";import{z as ht}from"zod";import{asc as H0,eq as Ls,sql as Bn}from"drizzle-orm";C();import{eq as gM}from"drizzle-orm";function cu(){return async(e,t)=>{let n=e.get("userId");if(!n)return e.json({error:"Unauthenticated",code:"UNAUTHENTICATED"},401);let[r]=await d.select({isSuperadmin:T.isSuperadmin}).from(T).where(gM(T.id,n));if(!r?.isSuperadmin)return e.json({error:"Forbidden",code:"NOT_SUPERADMIN"},403);await t()}}u(cu,"requireSuperadmin");jc();var fn=new hM;fn.use("/superadmin/*",cu());var _M=ht.object({search:ht.string().trim().min(1).max(120).optional(),limit:ht.coerce.number().int().min(1).max(200).default(50),offset:ht.coerce.number().int().min(0).default(0)});fn.get("/superadmin/users",async e=>{let t=_M.safeParse({search:e.req.query("search"),limit:e.req.query("limit"),offset:e.req.query("offset")});if(!t.success)return e.json({error:t.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let{search:n,limit:r,offset:o}=t.data,s=await d.execute(Bn`
1201
1123
  select
1202
1124
  p.id,
1203
1125
  p.email,
@@ -1219,16 +1141,16 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
1219
1141
  count(*) filter (where org_id is null)::int as orphan
1220
1142
  from sessions group by user_id
1221
1143
  ) s on s.user_id = p.id
1222
- ${n?Un`where p.email ilike ${"%"+ot(n)+"%"}`:Un``}
1144
+ ${n?Bn`where p.email ilike ${"%"+rt(n)+"%"}`:Bn``}
1223
1145
  order by p.created_at desc
1224
1146
  limit ${r} offset ${o}
1225
- `),[{total:i}]=await u.execute(Un`
1147
+ `),[{total:i}]=await d.execute(Bn`
1226
1148
  select count(*)::int as total from profiles p
1227
- ${n?Un`where p.email ilike ${"%"+ot(n)+"%"}`:Un``}
1228
- `);return e.json({users:s,total:i,limit:r,offset:o})});fn.get("/superadmin/users/:id",async e=>{let t=e.req.param("id");if(!_t.string().uuid().safeParse(t).success)return e.json({error:"Invalid user id",code:"VALIDATION_ERROR"},400);let[n]=await u.select({id:T.id,email:T.email,displayName:T.displayName,isSuperadmin:T.isSuperadmin,activeOrgId:T.activeOrgId,createdAt:T.createdAt}).from(T).where(Ms(T.id,t));if(!n)return e.json({error:"User not found",code:"USER_NOT_FOUND"},404);let r=await u.select({orgId:G.id,orgName:G.name,orgSlug:G.slug,role:Q.role}).from(Q).innerJoin(G,Ms(G.id,Q.orgId)).where(Ms(Q.userId,t)).orderBy(ZS(G.name)),[o]=await u.select({total:Un`count(*)::int`,orphan:Un`count(*) filter (where org_id is null)::int`}).from(_).where(Ms(_.userId,t)),s={banned:!1,bannedUntil:null,lastSignInAt:null};try{let{data:i,error:a}=await Pn().auth.admin.getUserById(t);!a&&i?.user&&(s={banned:i.user.banned_until?new Date(i.user.banned_until)>new Date:!1,bannedUntil:i.user.banned_until??null,lastSignInAt:i.user.last_sign_in_at??null})}catch{}return e.json({user:{...n,...s},memberships:r,sessionCounts:o??{total:0,orphan:0}})});async function eA(e){let[t]=await u.execute(Un`
1149
+ ${n?Bn`where p.email ilike ${"%"+rt(n)+"%"}`:Bn``}
1150
+ `);return e.json({users:s,total:i,limit:r,offset:o})});fn.get("/superadmin/users/:id",async e=>{let t=e.req.param("id");if(!ht.string().uuid().safeParse(t).success)return e.json({error:"Invalid user id",code:"VALIDATION_ERROR"},400);let[n]=await d.select({id:T.id,email:T.email,displayName:T.displayName,isSuperadmin:T.isSuperadmin,activeOrgId:T.activeOrgId,createdAt:T.createdAt}).from(T).where(Ls(T.id,t));if(!n)return e.json({error:"User not found",code:"USER_NOT_FOUND"},404);let r=await d.select({orgId:K.id,orgName:K.name,orgSlug:K.slug,role:Q.role}).from(Q).innerJoin(K,Ls(K.id,Q.orgId)).where(Ls(Q.userId,t)).orderBy(H0(K.name)),[o]=await d.select({total:Bn`count(*)::int`,orphan:Bn`count(*) filter (where org_id is null)::int`}).from(y).where(Ls(y.userId,t)),s={banned:!1,bannedUntil:null,lastSignInAt:null};try{let{data:i,error:c}=await On().auth.admin.getUserById(t);!c&&i?.user&&(s={banned:i.user.banned_until?new Date(i.user.banned_until)>new Date:!1,bannedUntil:i.user.banned_until??null,lastSignInAt:i.user.last_sign_in_at??null})}catch{}return e.json({user:{...n,...s},memberships:r,sessionCounts:o??{total:0,orphan:0}})});async function B0(e){let[t]=await d.execute(Bn`
1229
1151
  select count(*)::int as n from profiles
1230
1152
  where is_superadmin = true and id <> ${e}
1231
- `);return t?.n??0}d(eA,"countOtherSuperadmins");fn.post("/superadmin/users/:id/force-logout",async e=>{let t=e.req.param("id");if(!_t.string().uuid().safeParse(t).success)return e.json({error:"Invalid user id",code:"VALIDATION_ERROR"},400);if(t===e.get("userId"))return e.json({error:"Cannot force-logout yourself",code:"SELF_ACTION_FORBIDDEN"},400);try{await u.execute(Un`update auth.refresh_tokens set revoked = true where user_id = ${t}`),await u.execute(Un`delete from auth.sessions where user_id = ${t}`)}catch(n){return e.json({error:n.message,code:"AUTH_ADMIN_ERROR"},400)}return e.json({ok:!0})});fn.post("/superadmin/users/:id/reset-password",async e=>{let t=e.req.param("id");if(!_t.string().uuid().safeParse(t).success)return e.json({error:"Invalid user id",code:"VALIDATION_ERROR"},400);let[n]=await u.select({email:T.email}).from(T).where(Ms(T.id,t));if(!n?.email)return e.json({error:"User not found",code:"USER_NOT_FOUND"},404);let{data:r,error:o}=await Pn().auth.admin.generateLink({type:"recovery",email:n.email});return o?e.json({error:o.message,code:"AUTH_ADMIN_ERROR"},400):e.json({actionLink:r.properties?.action_link??null,email:n.email})});var d1=_t.object({suspended:_t.boolean()});fn.patch("/superadmin/users/:id/suspend",async e=>{let t=e.req.param("id");if(!_t.string().uuid().safeParse(t).success)return e.json({error:"Invalid user id",code:"VALIDATION_ERROR"},400);if(t===e.get("userId"))return e.json({error:"Cannot suspend yourself",code:"SELF_ACTION_FORBIDDEN"},400);let n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON",code:"VALIDATION_ERROR"},400)}let r=d1.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);if(r.data.suspended){let[a]=await u.select({isSuperadmin:T.isSuperadmin}).from(T).where(Ms(T.id,t));if(a?.isSuperadmin&&await eA(t)===0)return e.json({error:"Cannot suspend the last superadmin",code:"LAST_SUPERADMIN"},409)}let o=r.data.suspended?"876000h":"none",{data:s,error:i}=await Pn().auth.admin.updateUserById(t,{ban_duration:o});return i?e.json({error:i.message,code:"AUTH_ADMIN_ERROR"},400):e.json({ok:!0,suspended:r.data.suspended,bannedUntil:s.user?.banned_until??null})});var u1=_t.object({confirmEmail:_t.string().email()});fn.delete("/superadmin/users/:id",async e=>{let t=e.req.param("id");if(!_t.string().uuid().safeParse(t).success)return e.json({error:"Invalid user id",code:"VALIDATION_ERROR"},400);if(t===e.get("userId"))return e.json({error:"Cannot delete yourself",code:"SELF_ACTION_FORBIDDEN"},400);let n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON",code:"VALIDATION_ERROR"},400)}let r=u1.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let[o]=await u.select({email:T.email,isSuperadmin:T.isSuperadmin}).from(T).where(Ms(T.id,t));if(!o)return e.json({error:"User not found",code:"USER_NOT_FOUND"},404);if(o.email?.toLowerCase()!==r.data.confirmEmail.toLowerCase())return e.json({error:"confirmEmail does not match",code:"CONFIRMATION_MISMATCH"},400);if(o.isSuperadmin&&await eA(t)===0)return e.json({error:"Cannot delete the last superadmin",code:"LAST_SUPERADMIN"},409);let{error:s}=await Pn().auth.admin.deleteUser(t);return s?e.json({error:s.message,code:"AUTH_ADMIN_ERROR"},400):e.json({ok:!0})});var l1=_t.object({email:_t.string().email(),orgId:_t.string().uuid().optional(),role:_t.enum(["owner","admin","member"]).optional()});fn.post("/superadmin/users/invite",async e=>{let t;try{t=await e.req.json()}catch{return e.json({error:"Invalid JSON",code:"VALIDATION_ERROR"},400)}let n=l1.safeParse(t);if(!n.success)return e.json({error:n.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let{email:r,orgId:o,role:s}=n.data;if(o&&!s)return e.json({error:"role is required when orgId is set",code:"VALIDATION_ERROR"},400);let i=Pn(),a=process.env.WEB_URL??"http://localhost:5174",{data:c,error:l}=await i.auth.admin.inviteUserByEmail(r,{redirectTo:`${a}/auth/confirm`});if(l)return e.json({error:l.message,code:"AUTH_ADMIN_ERROR"},400);let p=c.user?.id,m=null;if(p&&o&&s){let y=e.get("supabase");if(y){let{error:v}=await y.rpc("superadmin_assign_user_to_org",{p_user_id:p,p_org_id:o,p_role:s,p_claim_sessions:!1});v||(m={orgId:o,role:s})}}return e.json({ok:!0,userId:p??null,email:r,assigned:m})});var p1=_t.object({orgId:_t.string().uuid(),role:_t.enum(["owner","admin","member"]),claimSessions:_t.boolean().default(!0)});fn.post("/superadmin/users/:id/assign",async e=>{let t=e.req.param("id");if(!_t.string().uuid().safeParse(t).success)return e.json({error:"Invalid user id",code:"VALIDATION_ERROR"},400);let n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON",code:"VALIDATION_ERROR"},400)}let r=p1.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let{orgId:o,role:s,claimSessions:i}=r.data,a=e.get("supabase");if(!a)return e.json({error:"Internal: no auth client",code:"INTERNAL"},500);let{data:c,error:l}=await a.rpc("superadmin_assign_user_to_org",{p_user_id:t,p_org_id:o,p_role:s,p_claim_sessions:i});if(l){let p=l.message.includes("not_authorized")?403:l.message.includes("org_not_found")||l.message.includes("user_not_found")?404:400;return e.json({error:l.message,code:"RPC_ERROR"},p)}return e.json(c)});fn.delete("/superadmin/users/:id/orgs/:orgId",async e=>{let t=e.req.param("id"),n=e.req.param("orgId");if(!_t.string().uuid().safeParse(t).success||!_t.string().uuid().safeParse(n).success)return e.json({error:"Invalid id",code:"VALIDATION_ERROR"},400);let r=e.get("supabase");if(!r)return e.json({error:"Internal: no auth client",code:"INTERNAL"},500);let{error:o}=await r.rpc("superadmin_remove_member",{p_user_id:t,p_org_id:n});if(o){let s=o.message.includes("last_owner_violation")?409:o.message.includes("not_authorized")?403:400;return e.json({error:o.message,code:"RPC_ERROR"},s)}return e.json({ok:!0})});fn.get("/superadmin/orgs",async e=>{let t=await u.select({id:G.id,name:G.name,slug:G.slug,memberCount:Un`(select count(*)::int from user_organizations where org_id = organizations.id)`,createdAt:G.createdAt}).from(G).orderBy(ZS(G.name));return e.json({orgs:t})});import{Hono as m1}from"hono";import{z as Fo}from"zod";var cp=new m1,tA=Fo.object({type:Fo.string().min(1).max(64),payload:Fo.record(Fo.unknown()).optional(),timestamp:Fo.string().datetime().optional()}),f1=Fo.union([tA,Fo.object({events:Fo.array(tA).max(50)})]);cp.post("/telemetry/extension-events",async e=>{let t=e.get("userId"),n=await e.req.json().catch(()=>null),r=f1.safeParse(n);if(!r.success)return e.json({error:"invalid payload",details:r.error.flatten()},400);let o="events"in r.data?r.data.events:[r.data];for(let s of o)console.log(`[ext-telemetry] user=${t} type=${s.type} payload=${JSON.stringify(s.payload??{})}`);return e.body(null,204)});O();import{Hono as g1}from"hono";import{z as Sr}from"zod";import{sql as h1}from"drizzle-orm";var cd=new g1,nA=Sr.object({event:Sr.string().min(1).max(64),deviceId:Sr.string().min(1).max(128),cliVersion:Sr.string().max(64).optional(),os:Sr.string().max(32).optional(),props:Sr.record(Sr.unknown()).optional()}),_1=Sr.union([nA,Sr.object({events:Sr.array(nA).max(50)})]);cd.post("/telemetry/cli-events",async e=>{let t=e.get("userId"),n=_1.safeParse(await e.req.json().catch(()=>null));if(!n.success)return e.json({error:"invalid payload",details:n.error.flatten()},400);let r="events"in n.data?n.data.events:[n.data];return r.length===0||await u.insert(Gd).values(r.map(o=>({userId:t,deviceId:o.deviceId,event:o.event,cliVersion:o.cliVersion??null,os:o.os??null,props:o.props??{}}))),e.body(null,204)});cd.get("/telemetry/deployments",async e=>{let t=e.get("userId"),n=await u.execute(h1`
1153
+ `);return t?.n??0}u(B0,"countOtherSuperadmins");fn.post("/superadmin/users/:id/force-logout",async e=>{let t=e.req.param("id");if(!ht.string().uuid().safeParse(t).success)return e.json({error:"Invalid user id",code:"VALIDATION_ERROR"},400);if(t===e.get("userId"))return e.json({error:"Cannot force-logout yourself",code:"SELF_ACTION_FORBIDDEN"},400);try{await d.execute(Bn`update auth.refresh_tokens set revoked = true where user_id = ${t}`),await d.execute(Bn`delete from auth.sessions where user_id = ${t}`)}catch(n){return e.json({error:n.message,code:"AUTH_ADMIN_ERROR"},400)}return e.json({ok:!0})});fn.post("/superadmin/users/:id/reset-password",async e=>{let t=e.req.param("id");if(!ht.string().uuid().safeParse(t).success)return e.json({error:"Invalid user id",code:"VALIDATION_ERROR"},400);let[n]=await d.select({email:T.email}).from(T).where(Ls(T.id,t));if(!n?.email)return e.json({error:"User not found",code:"USER_NOT_FOUND"},404);let{data:r,error:o}=await On().auth.admin.generateLink({type:"recovery",email:n.email});return o?e.json({error:o.message,code:"AUTH_ADMIN_ERROR"},400):e.json({actionLink:r.properties?.action_link??null,email:n.email})});var yM=ht.object({suspended:ht.boolean()});fn.patch("/superadmin/users/:id/suspend",async e=>{let t=e.req.param("id");if(!ht.string().uuid().safeParse(t).success)return e.json({error:"Invalid user id",code:"VALIDATION_ERROR"},400);if(t===e.get("userId"))return e.json({error:"Cannot suspend yourself",code:"SELF_ACTION_FORBIDDEN"},400);let n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON",code:"VALIDATION_ERROR"},400)}let r=yM.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);if(r.data.suspended){let[c]=await d.select({isSuperadmin:T.isSuperadmin}).from(T).where(Ls(T.id,t));if(c?.isSuperadmin&&await B0(t)===0)return e.json({error:"Cannot suspend the last superadmin",code:"LAST_SUPERADMIN"},409)}let o=r.data.suspended?"876000h":"none",{data:s,error:i}=await On().auth.admin.updateUserById(t,{ban_duration:o});return i?e.json({error:i.message,code:"AUTH_ADMIN_ERROR"},400):e.json({ok:!0,suspended:r.data.suspended,bannedUntil:s.user?.banned_until??null})});var wM=ht.object({confirmEmail:ht.string().email()});fn.delete("/superadmin/users/:id",async e=>{let t=e.req.param("id");if(!ht.string().uuid().safeParse(t).success)return e.json({error:"Invalid user id",code:"VALIDATION_ERROR"},400);if(t===e.get("userId"))return e.json({error:"Cannot delete yourself",code:"SELF_ACTION_FORBIDDEN"},400);let n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON",code:"VALIDATION_ERROR"},400)}let r=wM.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let[o]=await d.select({email:T.email,isSuperadmin:T.isSuperadmin}).from(T).where(Ls(T.id,t));if(!o)return e.json({error:"User not found",code:"USER_NOT_FOUND"},404);if(o.email?.toLowerCase()!==r.data.confirmEmail.toLowerCase())return e.json({error:"confirmEmail does not match",code:"CONFIRMATION_MISMATCH"},400);if(o.isSuperadmin&&await B0(t)===0)return e.json({error:"Cannot delete the last superadmin",code:"LAST_SUPERADMIN"},409);let{error:s}=await On().auth.admin.deleteUser(t);return s?e.json({error:s.message,code:"AUTH_ADMIN_ERROR"},400):e.json({ok:!0})});var vM=ht.object({email:ht.string().email(),orgId:ht.string().uuid().optional(),role:ht.enum(["owner","admin","member"]).optional()});fn.post("/superadmin/users/invite",async e=>{let t;try{t=await e.req.json()}catch{return e.json({error:"Invalid JSON",code:"VALIDATION_ERROR"},400)}let n=vM.safeParse(t);if(!n.success)return e.json({error:n.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let{email:r,orgId:o,role:s}=n.data;if(o&&!s)return e.json({error:"role is required when orgId is set",code:"VALIDATION_ERROR"},400);let i=On(),c=process.env.WEB_URL??"http://localhost:5174",{data:a,error:l}=await i.auth.admin.inviteUserByEmail(r,{redirectTo:`${c}/auth/confirm`});if(l)return e.json({error:l.message,code:"AUTH_ADMIN_ERROR"},400);let m=a.user?.id,p=null;if(m&&o&&s){let _=e.get("supabase");if(_){let{error:I}=await _.rpc("superadmin_assign_user_to_org",{p_user_id:m,p_org_id:o,p_role:s,p_claim_sessions:!1});I||(p={orgId:o,role:s})}}return e.json({ok:!0,userId:m??null,email:r,assigned:p})});var IM=ht.object({orgId:ht.string().uuid(),role:ht.enum(["owner","admin","member"]),claimSessions:ht.boolean().default(!0)});fn.post("/superadmin/users/:id/assign",async e=>{let t=e.req.param("id");if(!ht.string().uuid().safeParse(t).success)return e.json({error:"Invalid user id",code:"VALIDATION_ERROR"},400);let n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON",code:"VALIDATION_ERROR"},400)}let r=IM.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let{orgId:o,role:s,claimSessions:i}=r.data,c=e.get("supabase");if(!c)return e.json({error:"Internal: no auth client",code:"INTERNAL"},500);let{data:a,error:l}=await c.rpc("superadmin_assign_user_to_org",{p_user_id:t,p_org_id:o,p_role:s,p_claim_sessions:i});if(l){let m=l.message.includes("not_authorized")?403:l.message.includes("org_not_found")||l.message.includes("user_not_found")?404:400;return e.json({error:l.message,code:"RPC_ERROR"},m)}return e.json(a)});fn.delete("/superadmin/users/:id/orgs/:orgId",async e=>{let t=e.req.param("id"),n=e.req.param("orgId");if(!ht.string().uuid().safeParse(t).success||!ht.string().uuid().safeParse(n).success)return e.json({error:"Invalid id",code:"VALIDATION_ERROR"},400);let r=e.get("supabase");if(!r)return e.json({error:"Internal: no auth client",code:"INTERNAL"},500);let{error:o}=await r.rpc("superadmin_remove_member",{p_user_id:t,p_org_id:n});if(o){let s=o.message.includes("last_owner_violation")?409:o.message.includes("not_authorized")?403:400;return e.json({error:o.message,code:"RPC_ERROR"},s)}return e.json({ok:!0})});fn.get("/superadmin/orgs",async e=>{let t=await d.select({id:K.id,name:K.name,slug:K.slug,memberCount:Bn`(select count(*)::int from user_organizations where org_id = organizations.id)`,createdAt:K.createdAt}).from(K).orderBy(H0(K.name));return e.json({orgs:t})});import{Hono as bM}from"hono";import{z as Bo}from"zod";var am=new bM,F0=Bo.object({type:Bo.string().min(1).max(64),payload:Bo.record(Bo.unknown()).optional(),timestamp:Bo.string().datetime().optional()}),SM=Bo.union([F0,Bo.object({events:Bo.array(F0).max(50)})]);am.post("/telemetry/extension-events",async e=>{let t=e.get("userId"),n=await e.req.json().catch(()=>null),r=SM.safeParse(n);if(!r.success)return e.json({error:"invalid payload",details:r.error.flatten()},400);let o="events"in r.data?r.data.events:[r.data];for(let s of o)console.log(`[ext-telemetry] user=${t} type=${s.type} payload=${JSON.stringify(s.payload??{})}`);return e.body(null,204)});C();import{Hono as AM}from"hono";import{z as Sr}from"zod";import{sql as EM}from"drizzle-orm";var uu=new AM,W0=Sr.object({event:Sr.string().min(1).max(64),deviceId:Sr.string().min(1).max(128),cliVersion:Sr.string().max(64).optional(),os:Sr.string().max(32).optional(),props:Sr.record(Sr.unknown()).optional()}),xM=Sr.union([W0,Sr.object({events:Sr.array(W0).max(50)})]);uu.post("/telemetry/cli-events",async e=>{let t=e.get("userId"),n=xM.safeParse(await e.req.json().catch(()=>null));if(!n.success)return e.json({error:"invalid payload",details:n.error.flatten()},400);let r="events"in n.data?n.data.events:[n.data];return r.length===0||await d.insert(Gu).values(r.map(o=>({userId:t,deviceId:o.deviceId,event:o.event,cliVersion:o.cliVersion??null,os:o.os??null,props:o.props??{}}))),e.body(null,204)});uu.get("/telemetry/deployments",async e=>{let t=e.get("userId"),n=await d.execute(EM`
1232
1154
  select
1233
1155
  device_id,
1234
1156
  count(*)::int as event_count,
@@ -1245,7 +1167,7 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
1245
1167
  group by device_id
1246
1168
  order by max(created_at) desc
1247
1169
  limit 200
1248
- `);return e.json({deployments:n})});O();import{Hono as y1}from"hono";import{z as Hn}from"zod";var dp=new y1,w1=Hn.object({event:Hn.string().min(1).max(64),deviceId:Hn.string().max(128).optional(),command:Hn.string().max(128).optional(),statusCode:Hn.number().int().optional(),message:Hn.string().max(1e3).optional(),cliVersion:Hn.string().max(64).optional(),os:Hn.string().max(32).optional(),nodeVersion:Hn.string().max(32).optional(),proxied:Hn.boolean().optional(),props:Hn.record(Hn.unknown()).optional()});dp.post("/telemetry/cli-error",async e=>{let t=w1.safeParse(await e.req.json().catch(()=>null));if(!t.success)return e.json({error:"invalid payload",details:t.error.flatten()},400);let n=t.data;console.warn(`[cli-error-beacon] event=${n.event} command=${n.command??""} status=${n.statusCode??""} proxied=${n.proxied??""} cli=${n.cliVersion??""} os=${n.os??""} node=${n.nodeVersion??""} device=${n.deviceId??""} msg=${JSON.stringify(n.message??"")}`);try{await u.insert(Kd).values({deviceId:n.deviceId??null,event:n.event,command:n.command??null,statusCode:n.statusCode??null,message:n.message??null,cliVersion:n.cliVersion??null,os:n.os??null,nodeVersion:n.nodeVersion??null,proxied:n.proxied??null,props:n.props??{}})}catch{}return e.body(null,204)});O();import{Hono as iA}from"hono";import{z as Yr}from"zod";import{createHash as v1,randomBytes as aA}from"node:crypto";import{and as rA,eq as yh,gt as I1,isNull as b1,lt as S1}from"drizzle-orm";var A1={vscode:"VS Code extension","vscode-insiders":"VS Code Insiders extension",cursor:"Cursor extension",windsurf:"Windsurf extension"},oA="VS Code extension";function E1(e){return e?A1[e]??oA:oA}d(E1,"editorKeyName");var sA=6e4;async function x1(){try{await u.delete(Rn).where(S1(Rn.expiresAt,new Date))}catch{}}d(x1,"sweepExpiredCodes");setInterval(()=>void x1(),5*6e4).unref?.();var dd=new iA,T1=Yr.object({code:Yr.string().min(1).max(256)}),R1=Yr.object({refreshToken:Yr.string().min(1).max(2048)});dd.post("/auth/extension/refresh",async e=>{let t=await e.req.json().catch(()=>null),n=R1.safeParse(t);if(!n.success)return e.json({error:"invalid request"},400);let r=await _u(n.data.refreshToken);return r.ok?e.json(r.session):e.json({error:r.error},r.status)});dd.post("/auth/extension/exchange",async e=>{let t=await e.req.json().catch(()=>null),n=T1.safeParse(t);if(!n.success)return e.json({error:"invalid request"},400);let[r]=await u.delete(Rn).where(rA(yh(Rn.code,n.data.code),I1(Rn.expiresAt,new Date))).returning({userId:Rn.userId,editor:Rn.editor,email:Rn.email});if(!r)return e.json({error:"code not found or expired"},404);let o=E1(r.editor),{plaintext:s,hash:i,prefix:a}=j1();try{await u.transaction(async c=>{await c.update(Ae).set({revokedAt:new Date}).where(rA(yh(Ae.userId,r.userId),yh(Ae.name,o),b1(Ae.revokedAt))),await c.insert(Ae).values({userId:r.userId,name:o,keyHash:i,keyPrefix:a})})}catch(c){return console.log(`[auth] extension/exchange mint failed userId=${r.userId} err=${c.message}`),e.json({error:"could not mint session"},500)}return e.json({accessToken:s,expiresAt:null,email:r.email})});var up=new iA,k1=Yr.object({refreshToken:Yr.string().min(1).nullish(),expiresAt:Yr.string().nullish(),email:Yr.string().email().nullish(),editor:Yr.enum(["vscode","vscode-insiders","cursor","windsurf"]).nullish()});function j1(){let e=`rm_${aA(32).toString("base64url")}`;return{plaintext:e,hash:v1("sha256").update(e).digest("hex"),prefix:e.slice(0,11)}}d(j1,"generateApiKey");up.post("/auth/extension/code",async e=>{let t=e.get("userId");if(!t)return e.json({error:"unauthenticated"},401);let n=await e.req.json().catch(()=>null),r=k1.safeParse(n);if(!r.success)return e.json({error:"invalid request"},400);let o=aA(32).toString("base64url");try{await u.insert(Rn).values({code:o,userId:t,editor:r.data.editor??null,email:r.data.email??null,expiresAt:new Date(Date.now()+sA)})}catch(s){return console.log(`[auth] extension/code intent insert failed userId=${t} err=${s.message}`),e.json({error:"could not start sign-in"},500)}return e.json({code:o,expiresInSeconds:Math.floor(sA/1e3),sessionStrategy:"api_key"})});Pc();import{Hono as N1}from"hono";var lp=new N1;function P1(e,t){let n=e.record??{};return e.schema==="auth"&&e.table==="users"&&e.type==="INSERT"?{title:"\u{1F389} New signup",color:2278750,fields:[{name:"Email",value:n.email??t??"unknown",inline:!0},{name:"User ID",value:String(n.id??"unknown"),inline:!0}],timestamp:new Date().toISOString()}:e.schema==="auth"&&e.table==="sessions"&&e.type==="INSERT"?{title:"\u{1F44B} Login",color:3900150,fields:[{name:"Email",value:t??"unknown",inline:!0},{name:"User ID",value:String(n.user_id??"unknown"),inline:!0}],timestamp:new Date().toISOString()}:null}d(P1,"formatEmbed");async function C1(e){if(!e)return null;try{let t=Pn(),{data:n}=await t.auth.admin.getUserById(e);return n.user?.email??null}catch{return null}}d(C1,"lookupEmail");async function O1(e,t){let n=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({embeds:[t]})});n.ok||console.error("[webhooks] Discord post failed",n.status,await n.text().catch(()=>""))}d(O1,"postToDiscord");lp.post("/webhooks/supabase-auth",async e=>{let t=process.env.SUPABASE_WEBHOOK_SECRET,n=process.env.DISCORD_WEBHOOK_URL;if(!t||!n)return e.json({error:"webhook not configured"},503);if(e.req.header("x-webhook-secret")!==t)return e.json({error:"unauthorized"},401);let o;try{o=await e.req.json()}catch{return e.json({error:"invalid json"},400)}let i=o.schema==="auth"&&o.table==="sessions"&&o.type==="INSERT"?await C1(o.record?.user_id):null,a=P1(o,i);return a?(await O1(n,a),e.json({ok:!0})):e.json({ok:!0,skipped:!0})});O();import{Hono as J1}from"hono";import{z as He}from"zod";import{and as pd,desc as gp,eq as Ar,gte as Ch,isNull as G1,sql as K1}from"drizzle-orm";var vh="anthropic",D1=[{limitType:"five_hour_percent",unit:"percentage",displayName:"5-hour window"}],wh=[{limitType:"five_hour_percent",unit:"percentage",displayName:"5-hour window"},{limitType:"seven_day_percent",unit:"percentage",displayName:"Weekly window"}];function M1(e){return typeof e=="object"&&e!==null}d(M1,"isOAuthUsageResponse");function cA(e,t,n,r,o,s){if(!e||typeof e.used_percentage!="number")return null;let i=typeof e.resets_at=="number"?new Date(e.resets_at*1e3):null;return{provider:vh,plan:n,limitType:t,value:e.used_percentage,unit:"percentage",comparator:"=",resetsAt:i,sourceType:"oauth_usage",sourceUrl:r,sourceEvidence:o,confidence:1,observedAt:s}}d(cA,"parseWindow");function L1(e,t){let n=e.match(/reset(?:s|\s+at)?\s+(?:at\s+)?(\d{1,2}):(\d{2})\s*(am|pm)?\s*(?:\(([^)]+)\))?/i);if(!n)return null;let r=parseInt(n[1],10),o=parseInt(n[2],10),s=n[3]?.toLowerCase();if(s==="pm"&&r<12&&(r+=12),s==="am"&&r===12&&(r=0),isNaN(r)||isNaN(o)||r>23||o>59)return null;let i=new Date(t);return i.setHours(r,o,0,0),i.getTime()<=t.getTime()&&i.setDate(i.getDate()+1),i}d(L1,"parseResetTime");var Ih={id:vh,displayName:"Anthropic (Claude Code)",plans:["unknown","pro","max_5x","max_20x"],limits:{unknown:wh,pro:D1,max_5x:wh,max_20x:wh},docs:[{url:"https://docs.claude.com/en/docs/claude-code/setup#usage-limits",parse(e){let t=[],n=e.replace(/<script[\s\S]*?<\/script>/gi," ").replace(/<style[\s\S]*?<\/style>/gi," ").replace(/<[^>]+>/g," ").replace(/\s+/g," ").trim(),r=n.match(/(\d{1,4})\s+messages?\s+(?:every|per)\s+5[-\s]?hours?/i);r&&t.push({plan:"unknown",limitType:"five_hour_messages",value:parseInt(r[1],10),unit:"messages",comparator:"="});let o=n.match(/(\d{1,5})\s+messages?\s+(?:per|every)\s+(?:week|7[-\s]?days?)/i);return o&&t.push({plan:"unknown",limitType:"seven_day_messages",value:parseInt(o[1],10),unit:"messages",comparator:"="}),t}}],liveSource:{matches(e,t){return e==="api.anthropic.com"&&t==="/api/oauth/usage"},parse(e,t){if(!M1(e))return null;let n=e.rate_limits;if(!n||typeof n!="object")return[];let r=t.observedAt??new Date,o=t.plan??"unknown",s=`https://${t.host}${t.path}`,i={rawResponse:e},a=[],c=cA(n.five_hour,"five_hour_percent",o,s,i,r);c&&a.push(c);let l=cA(n.seven_day,"seven_day_percent",o,s,i,r);return l&&a.push(l),a}},observe429(e){if(e.statusCode!==429||e.host!=="api.anthropic.com")return null;let t="",n=e.responseBody;if(typeof n=="string")t=n;else if(n&&typeof n=="object"){let o=n,s=o.error;if(s&&typeof s.message=="string")t=s.message;else if(typeof o.message=="string")t=o.message;else try{t=JSON.stringify(n)}catch{return null}}if(!t)return null;let r=L1(t,e.observedAt);return[{provider:vh,plan:e.plan??"unknown",limitType:"five_hour_percent",value:100,unit:"percentage",comparator:">=",resetsAt:r,sourceType:"self_observed_429",sourceUrl:`https://${e.host}${e.path}`,sourceEvidence:{responseBody:n,parsedText:t},confidence:.9,userId:e.userId??null,observedAt:e.observedAt}]}};var bh="codex",Sh="chatgpt.com",dA="/backend-api/codex/responses",$1="codex.rate_limits",uA=["primary","secondary"];function q1(e,t){return t!=null?t>=1440?"seven_day_percent":"five_hour_percent":e==="secondary"?"seven_day_percent":"five_hour_percent"}d(q1,"limitTypeForWindow");var ca=[{limitType:"five_hour_percent",unit:"percentage",displayName:"5-hour usage"},{limitType:"seven_day_percent",unit:"percentage",displayName:"7-day usage"}],Ah={id:bh,displayName:"Codex CLI (OpenAI)",plans:["unknown","free","plus","pro","team","enterprise"],limits:{unknown:ca,free:ca,plus:ca,pro:ca,team:ca,enterprise:ca},docs:[{url:"https://platform.openai.com/docs/guides/rate-limits",parse(e){return[]}}],liveSource:{matches(e,t){return!1},parse(e,t){return null},streamFrame:{matches(e,t){return e===Sh&&t.startsWith(dA)},parse(e,t){let n;try{n=JSON.parse(e)}catch{return null}if(typeof n!="object"||n===null||n.type!==$1)return null;let r=n.rate_limits;if(typeof r!="object"||r===null)return null;let o=t.observedAt??new Date,s=t.plan??"unknown",i=[];for(let a of uA){let c=r[a];if(typeof c!="object"||c===null)continue;let l=c,p=l.used_percent??l.used_percentage;if(typeof p!="number"||!isFinite(p))continue;let m=p,y=l.window_minutes,v=typeof y=="number"&&isFinite(y)?y:null,h=q1(a,v),f=null,w=l.reset_at??l.resets_at;if(typeof w=="string"){let b=new Date(w);isNaN(b.getTime())||(f=b)}else typeof w=="number"&&isFinite(w)&&(f=new Date(w*1e3));i.push({provider:bh,plan:s,limitType:h,value:m,unit:"percentage",comparator:"=",resetsAt:f,sourceType:"live_stream",sourceUrl:`wss://${Sh}${dA}`,sourceEvidence:{wireKey:a,frame:n},confidence:1,observedAt:o})}return i.length===0&&uA.some(c=>{let l=r[c];return typeof l=="object"&&l!==null})&&console.warn(`[codex] rate_limits windows present but none parsed \u2014 field drift? sample=${JSON.stringify(r).slice(0,300)}`),i.length>0?i:null}}},observe429(e){return e.statusCode!==429||e.host!==Sh?null:[{provider:bh,plan:e.plan??"unknown",limitType:"five_hour_percent",value:100,unit:"percentage",comparator:">=",resetsAt:null,sourceType:"self_observed_429",sourceUrl:`https://${e.host}${e.path}`,sourceEvidence:{responseBody:e.responseBody},confidence:.9,userId:e.userId??null,observedAt:e.observedAt}]}};var ud={anthropic:Ih,codex:Ah};function Eh(e){for(let t of Object.values(ud))if(t.liveSource?.headers?.matchesHost(e))return t}d(Eh,"matchLiveHeaders");function xh(e,t){for(let n of Object.values(ud))if(n.liveSource?.streamFrame?.matches(e,t))return n}d(xh,"matchStreamFrame");var gue=1440*60*1e3;O();import{and as pA,desc as mA,eq as ld,gte as F1,sql as W1}from"drizzle-orm";function Th(e){let{used_percentage:t,burnRateEtaSeconds:n,secondsUntilReset:r,hadObserved429:o}=e;return t>=100||o?"hit":t>=95||t>=80&&n!==null&&n<900?"imminent":t>=80&&n!==null&&n<r?"approaching":t>=80?"soft":"none"}d(Th,"classifySeverity");function da(e){switch(e){case"none":return 0;case"soft":return 1;case"approaching":return 2;case"imminent":return 3;case"hit":return 4}}d(da,"severityRank");var pp={soft:"soft warning",approaching:"approaching limit",imminent:"imminent limit",hit:"limit reached"};function U1(e,t){if(!e)return"soon";let n=new Date(e).getTime()-t;if(n<=0)return"now";let r=Math.round(n/6e4);if(r<60)return`in ${r} min`;let o=Math.floor(r/60),s=r%60;return s>0?`in ${o}h ${s}m`:`in ${o}h`}d(U1,"formatTimeLeft");function Rh(e,t,n,r,o=Date.now()){let s=U1(r,o);if(e==="hit")return`Claude ${t} reached 100% \u2014 requests will fail. Resets ${s}.`;let i=n!=null?`${n.toFixed(0)}%`:"limit";return`Claude ${t} at ${i} \u2014 ${pp[e]}. Resets ${s}.`}d(Rh,"formatAlertMessage");function kh(e,t=new Date){if(e.length<2)return null;let n=300*1e3,r=t.getTime()-n,o=e.filter(I=>I.observedAt.getTime()>=r).sort((I,S)=>I.observedAt.getTime()-S.observedAt.getTime());if(o.length<2)return null;let s=o[o.length-1];if(s.value>=100)return null;let i=o[0].observedAt.getTime(),a=o.map(I=>(I.observedAt.getTime()-i)/1e3),c=o.map(I=>I.value),l=a.length,p=a.reduce((I,S)=>I+S,0),m=c.reduce((I,S)=>I+S,0),y=a.reduce((I,S,A)=>I+S*c[A],0),v=a.reduce((I,S)=>I+S*S,0),h=l*v-p*p;if(h===0)return null;let f=(l*y-p*m)/h;return f<=0?null:(100-s.value)/f}d(kh,"projectExhaustion");var H1=300*1e3,B1=70;function jh(e){let{proposedSeverity:t,lastDispatch:n,currentUsedPercentage:r,now:o,isFirstTime429:s}=e;if(s)return!0;if(!n)return da(t)>0;let i=da(t),a=da(n.severity);return i>a?!0:o.getTime()-n.lastDispatchedAt.getTime()>=H1?a>=da("approaching")&&i===a?!(r>=B1):i>0:!1}d(jh,"shouldDispatch");function Nh(e){let t=kh(e.observations,e.now),n=Math.max(0,Math.floor((e.currentResetsAt.getTime()-e.now.getTime())/1e3)),r=Th({used_percentage:e.currentUsedPercentage,burnRateEtaSeconds:t,secondsUntilReset:n,hadObserved429:e.hadObserved429}),o={alertKey:e.alertKey,severity:r,usedPercentage:e.currentUsedPercentage,resetsAt:e.currentResetsAt.toISOString(),burnRateEtaSeconds:t};if(r==="none")return{shouldDispatch:!1,severity:"none",reason:"below threshold",payload:o};let s=e.hadObserved429&&(e.lastDispatch===null||e.lastDispatch.severity!=="hit"),i=jh({proposedSeverity:r,lastDispatch:e.lastDispatch,currentResetsAt:e.currentResetsAt,currentUsedPercentage:e.currentUsedPercentage,now:e.now,isFirstTime429:s});return{shouldDispatch:i,severity:r,reason:i?"dispatch":"suppressed by cooldown/hysteresis",payload:o}}d(Nh,"evaluate");function lA(e,t,n){return`${e}:${t}:${n}`}d(lA,"deriveAlertKey");O();async function ua(e){await tn({userId:e.userId,type:`usage_${e.severity}`,title:e.title??`Usage limit \u2014 ${pp[e.severity]}`,body:e.message,url:"/usage",sourceTable:"alert_dispatches",sourceId:e.dispatchId})}d(ua,"notifyFromDispatch");var z1=30*6e4;async function mp(e,t){let n=new Date((t.observedAt??new Date).getTime()-z1);try{let o=await u.execute(W1`
1170
+ `);return e.json({deployments:n})});C();import{Hono as TM}from"hono";import{z as Fn}from"zod";var cm=new TM,RM=Fn.object({event:Fn.string().min(1).max(64),deviceId:Fn.string().max(128).optional(),command:Fn.string().max(128).optional(),statusCode:Fn.number().int().optional(),message:Fn.string().max(1e3).optional(),cliVersion:Fn.string().max(64).optional(),os:Fn.string().max(32).optional(),nodeVersion:Fn.string().max(32).optional(),proxied:Fn.boolean().optional(),props:Fn.record(Fn.unknown()).optional()});cm.post("/telemetry/cli-error",async e=>{let t=RM.safeParse(await e.req.json().catch(()=>null));if(!t.success)return e.json({error:"invalid payload",details:t.error.flatten()},400);let n=t.data;console.warn(`[cli-error-beacon] event=${n.event} command=${n.command??""} status=${n.statusCode??""} proxied=${n.proxied??""} cli=${n.cliVersion??""} os=${n.os??""} node=${n.nodeVersion??""} device=${n.deviceId??""} msg=${JSON.stringify(n.message??"")}`);try{await d.insert(Yu).values({deviceId:n.deviceId??null,event:n.event,command:n.command??null,statusCode:n.statusCode??null,message:n.message??null,cliVersion:n.cliVersion??null,os:n.os??null,nodeVersion:n.nodeVersion??null,proxied:n.proxied??null,props:n.props??{}})}catch{}return e.body(null,204)});C();import{Hono as K0}from"hono";import{z as Yr}from"zod";import{createHash as kM,randomBytes as G0}from"node:crypto";import{and as z0,eq as gh,gt as NM,isNull as jM,lt as PM}from"drizzle-orm";var DM={vscode:"VS Code extension","vscode-insiders":"VS Code Insiders extension",cursor:"Cursor extension",windsurf:"Windsurf extension"},V0="VS Code extension";function OM(e){return e?DM[e]??V0:V0}u(OM,"editorKeyName");var J0=6e4;async function CM(){try{await d.delete(Rn).where(PM(Rn.expiresAt,new Date))}catch{}}u(CM,"sweepExpiredCodes");setInterval(()=>void CM(),5*6e4).unref?.();var du=new K0,LM=Yr.object({code:Yr.string().min(1).max(256)}),MM=Yr.object({refreshToken:Yr.string().min(1).max(2048)});du.post("/auth/extension/refresh",async e=>{let t=await e.req.json().catch(()=>null),n=MM.safeParse(t);if(!n.success)return e.json({error:"invalid request"},400);let r=await yd(n.data.refreshToken);return r.ok?e.json(r.session):e.json({error:r.error},r.status)});du.post("/auth/extension/exchange",async e=>{let t=await e.req.json().catch(()=>null),n=LM.safeParse(t);if(!n.success)return e.json({error:"invalid request"},400);let[r]=await d.delete(Rn).where(z0(gh(Rn.code,n.data.code),NM(Rn.expiresAt,new Date))).returning({userId:Rn.userId,editor:Rn.editor,email:Rn.email});if(!r)return e.json({error:"code not found or expired"},404);let o=OM(r.editor),{plaintext:s,hash:i,prefix:c}=qM();try{await d.transaction(async a=>{await a.update(be).set({revokedAt:new Date}).where(z0(gh(be.userId,r.userId),gh(be.name,o),jM(be.revokedAt))),await a.insert(be).values({userId:r.userId,name:o,keyHash:i,keyPrefix:c})})}catch(a){return console.log(`[auth] extension/exchange mint failed userId=${r.userId} err=${a.message}`),e.json({error:"could not mint session"},500)}return e.json({accessToken:s,expiresAt:null,email:r.email})});var um=new K0,$M=Yr.object({refreshToken:Yr.string().min(1).nullish(),expiresAt:Yr.string().nullish(),email:Yr.string().email().nullish(),editor:Yr.enum(["vscode","vscode-insiders","cursor","windsurf"]).nullish()});function qM(){let e=`rm_${G0(32).toString("base64url")}`;return{plaintext:e,hash:kM("sha256").update(e).digest("hex"),prefix:e.slice(0,11)}}u(qM,"generateApiKey");um.post("/auth/extension/code",async e=>{let t=e.get("userId");if(!t)return e.json({error:"unauthenticated"},401);let n=await e.req.json().catch(()=>null),r=$M.safeParse(n);if(!r.success)return e.json({error:"invalid request"},400);let o=G0(32).toString("base64url");try{await d.insert(Rn).values({code:o,userId:t,editor:r.data.editor??null,email:r.data.email??null,expiresAt:new Date(Date.now()+J0)})}catch(s){return console.log(`[auth] extension/code intent insert failed userId=${t} err=${s.message}`),e.json({error:"could not start sign-in"},500)}return e.json({code:o,expiresInSeconds:Math.floor(J0/1e3),sessionStrategy:"api_key"})});jc();import{Hono as UM}from"hono";var dm=new UM;function HM(e,t){let n=e.record??{};return e.schema==="auth"&&e.table==="users"&&e.type==="INSERT"?{title:"\u{1F389} New signup",color:2278750,fields:[{name:"Email",value:n.email??t??"unknown",inline:!0},{name:"User ID",value:String(n.id??"unknown"),inline:!0}],timestamp:new Date().toISOString()}:e.schema==="auth"&&e.table==="sessions"&&e.type==="INSERT"?{title:"\u{1F44B} Login",color:3900150,fields:[{name:"Email",value:t??"unknown",inline:!0},{name:"User ID",value:String(n.user_id??"unknown"),inline:!0}],timestamp:new Date().toISOString()}:null}u(HM,"formatEmbed");async function BM(e){if(!e)return null;try{let t=On(),{data:n}=await t.auth.admin.getUserById(e);return n.user?.email??null}catch{return null}}u(BM,"lookupEmail");async function FM(e,t){let n=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({embeds:[t]})});n.ok||console.error("[webhooks] Discord post failed",n.status,await n.text().catch(()=>""))}u(FM,"postToDiscord");dm.post("/webhooks/supabase-auth",async e=>{let t=process.env.SUPABASE_WEBHOOK_SECRET,n=process.env.DISCORD_WEBHOOK_URL;if(!t||!n)return e.json({error:"webhook not configured"},503);if(e.req.header("x-webhook-secret")!==t)return e.json({error:"unauthorized"},401);let o;try{o=await e.req.json()}catch{return e.json({error:"invalid json"},400)}let i=o.schema==="auth"&&o.table==="sessions"&&o.type==="INSERT"?await BM(o.record?.user_id):null,c=HM(o,i);return c?(await FM(n,c),e.json({ok:!0})):e.json({ok:!0,skipped:!0})});C();import{Hono as n$}from"hono";import{z as Ue}from"zod";import{and as pu,desc as fm,eq as Ar,gte as Nh,isNull as r$,sql as o$}from"drizzle-orm";var _h="anthropic",WM=[{limitType:"five_hour_percent",unit:"percentage",displayName:"5-hour window"}],hh=[{limitType:"five_hour_percent",unit:"percentage",displayName:"5-hour window"},{limitType:"seven_day_percent",unit:"percentage",displayName:"Weekly window"}];function zM(e){return typeof e=="object"&&e!==null}u(zM,"isOAuthUsageResponse");function Y0(e,t,n,r,o,s){if(!e||typeof e.used_percentage!="number")return null;let i=typeof e.resets_at=="number"?new Date(e.resets_at*1e3):null;return{provider:_h,plan:n,limitType:t,value:e.used_percentage,unit:"percentage",comparator:"=",resetsAt:i,sourceType:"oauth_usage",sourceUrl:r,sourceEvidence:o,confidence:1,observedAt:s}}u(Y0,"parseWindow");function VM(e,t){let n=e.match(/reset(?:s|\s+at)?\s+(?:at\s+)?(\d{1,2}):(\d{2})\s*(am|pm)?\s*(?:\(([^)]+)\))?/i);if(!n)return null;let r=parseInt(n[1],10),o=parseInt(n[2],10),s=n[3]?.toLowerCase();if(s==="pm"&&r<12&&(r+=12),s==="am"&&r===12&&(r=0),isNaN(r)||isNaN(o)||r>23||o>59)return null;let i=new Date(t);return i.setHours(r,o,0,0),i.getTime()<=t.getTime()&&i.setDate(i.getDate()+1),i}u(VM,"parseResetTime");var yh={id:_h,displayName:"Anthropic (Claude Code)",plans:["unknown","pro","max_5x","max_20x"],limits:{unknown:hh,pro:WM,max_5x:hh,max_20x:hh},docs:[{url:"https://docs.claude.com/en/docs/claude-code/setup#usage-limits",parse(e){let t=[],n=e.replace(/<script[\s\S]*?<\/script>/gi," ").replace(/<style[\s\S]*?<\/style>/gi," ").replace(/<[^>]+>/g," ").replace(/\s+/g," ").trim(),r=n.match(/(\d{1,4})\s+messages?\s+(?:every|per)\s+5[-\s]?hours?/i);r&&t.push({plan:"unknown",limitType:"five_hour_messages",value:parseInt(r[1],10),unit:"messages",comparator:"="});let o=n.match(/(\d{1,5})\s+messages?\s+(?:per|every)\s+(?:week|7[-\s]?days?)/i);return o&&t.push({plan:"unknown",limitType:"seven_day_messages",value:parseInt(o[1],10),unit:"messages",comparator:"="}),t}}],liveSource:{matches(e,t){return e==="api.anthropic.com"&&t==="/api/oauth/usage"},parse(e,t){if(!zM(e))return null;let n=e.rate_limits;if(!n||typeof n!="object")return[];let r=t.observedAt??new Date,o=t.plan??"unknown",s=`https://${t.host}${t.path}`,i={rawResponse:e},c=[],a=Y0(n.five_hour,"five_hour_percent",o,s,i,r);a&&c.push(a);let l=Y0(n.seven_day,"seven_day_percent",o,s,i,r);return l&&c.push(l),c}},observe429(e){if(e.statusCode!==429||e.host!=="api.anthropic.com")return null;let t="",n=e.responseBody;if(typeof n=="string")t=n;else if(n&&typeof n=="object"){let o=n,s=o.error;if(s&&typeof s.message=="string")t=s.message;else if(typeof o.message=="string")t=o.message;else try{t=JSON.stringify(n)}catch{return null}}if(!t)return null;let r=VM(t,e.observedAt);return[{provider:_h,plan:e.plan??"unknown",limitType:"five_hour_percent",value:100,unit:"percentage",comparator:">=",resetsAt:r,sourceType:"self_observed_429",sourceUrl:`https://${e.host}${e.path}`,sourceEvidence:{responseBody:n,parsedText:t},confidence:.9,userId:e.userId??null,observedAt:e.observedAt}]}};var wh="codex",vh="chatgpt.com",X0="/backend-api/codex/responses",JM="codex.rate_limits",Q0=["primary","secondary"];function KM(e,t){return t!=null?t>=1440?"seven_day_percent":"five_hour_percent":e==="secondary"?"seven_day_percent":"five_hour_percent"}u(KM,"limitTypeForWindow");var aa=[{limitType:"five_hour_percent",unit:"percentage",displayName:"5-hour usage"},{limitType:"seven_day_percent",unit:"percentage",displayName:"7-day usage"}],Ih={id:wh,displayName:"Codex CLI (OpenAI)",plans:["unknown","free","plus","pro","team","enterprise"],limits:{unknown:aa,free:aa,plus:aa,pro:aa,team:aa,enterprise:aa},docs:[{url:"https://platform.openai.com/docs/guides/rate-limits",parse(e){return[]}}],liveSource:{matches(e,t){return!1},parse(e,t){return null},streamFrame:{matches(e,t){return e===vh&&t.startsWith(X0)},parse(e,t){let n;try{n=JSON.parse(e)}catch{return null}if(typeof n!="object"||n===null||n.type!==JM)return null;let r=n.rate_limits;if(typeof r!="object"||r===null)return null;let o=t.observedAt??new Date,s=t.plan??"unknown",i=[];for(let c of Q0){let a=r[c];if(typeof a!="object"||a===null)continue;let l=a,m=l.used_percent??l.used_percentage;if(typeof m!="number"||!isFinite(m))continue;let p=m,_=l.window_minutes,I=typeof _=="number"&&isFinite(_)?_:null,h=KM(c,I),f=null,w=l.reset_at??l.resets_at;if(typeof w=="string"){let b=new Date(w);isNaN(b.getTime())||(f=b)}else typeof w=="number"&&isFinite(w)&&(f=new Date(w*1e3));i.push({provider:wh,plan:s,limitType:h,value:p,unit:"percentage",comparator:"=",resetsAt:f,sourceType:"live_stream",sourceUrl:`wss://${vh}${X0}`,sourceEvidence:{wireKey:c,frame:n},confidence:1,observedAt:o})}return i.length===0&&Q0.some(a=>{let l=r[a];return typeof l=="object"&&l!==null})&&console.warn(`[codex] rate_limits windows present but none parsed \u2014 field drift? sample=${JSON.stringify(r).slice(0,300)}`),i.length>0?i:null}}},observe429(e){return e.statusCode!==429||e.host!==vh?null:[{provider:wh,plan:e.plan??"unknown",limitType:"five_hour_percent",value:100,unit:"percentage",comparator:">=",resetsAt:null,sourceType:"self_observed_429",sourceUrl:`https://${e.host}${e.path}`,sourceEvidence:{responseBody:e.responseBody},confidence:.9,userId:e.userId??null,observedAt:e.observedAt}]}};var lu={anthropic:yh,codex:Ih};function bh(e){for(let t of Object.values(lu))if(t.liveSource?.headers?.matchesHost(e))return t}u(bh,"matchLiveHeaders");function Sh(e,t){for(let n of Object.values(lu))if(n.liveSource?.streamFrame?.matches(e,t))return n}u(Sh,"matchStreamFrame");var cie=1440*60*1e3;C();import{and as eS,desc as tS,eq as mu,gte as QM,sql as ZM}from"drizzle-orm";function Ah(e){let{used_percentage:t,burnRateEtaSeconds:n,secondsUntilReset:r,hadObserved429:o}=e;return t>=100||o?"hit":t>=95||t>=80&&n!==null&&n<900?"imminent":t>=80&&n!==null&&n<r?"approaching":t>=80?"soft":"none"}u(Ah,"classifySeverity");function ca(e){switch(e){case"none":return 0;case"soft":return 1;case"approaching":return 2;case"imminent":return 3;case"hit":return 4}}u(ca,"severityRank");var lm={soft:"soft warning",approaching:"approaching limit",imminent:"imminent limit",hit:"limit reached"};function GM(e,t){if(!e)return"soon";let n=new Date(e).getTime()-t;if(n<=0)return"now";let r=Math.round(n/6e4);if(r<60)return`in ${r} min`;let o=Math.floor(r/60),s=r%60;return s>0?`in ${o}h ${s}m`:`in ${o}h`}u(GM,"formatTimeLeft");function Eh(e,t,n,r,o=Date.now()){let s=GM(r,o);if(e==="hit")return`Claude ${t} reached 100% \u2014 requests will fail. Resets ${s}.`;let i=n!=null?`${n.toFixed(0)}%`:"limit";return`Claude ${t} at ${i} \u2014 ${lm[e]}. Resets ${s}.`}u(Eh,"formatAlertMessage");function xh(e,t=new Date){if(e.length<2)return null;let n=300*1e3,r=t.getTime()-n,o=e.filter(v=>v.observedAt.getTime()>=r).sort((v,S)=>v.observedAt.getTime()-S.observedAt.getTime());if(o.length<2)return null;let s=o[o.length-1];if(s.value>=100)return null;let i=o[0].observedAt.getTime(),c=o.map(v=>(v.observedAt.getTime()-i)/1e3),a=o.map(v=>v.value),l=c.length,m=c.reduce((v,S)=>v+S,0),p=a.reduce((v,S)=>v+S,0),_=c.reduce((v,S,A)=>v+S*a[A],0),I=c.reduce((v,S)=>v+S*S,0),h=l*I-m*m;if(h===0)return null;let f=(l*_-m*p)/h;return f<=0?null:(100-s.value)/f}u(xh,"projectExhaustion");var YM=300*1e3,XM=70;function Th(e){let{proposedSeverity:t,lastDispatch:n,currentUsedPercentage:r,now:o,isFirstTime429:s}=e;if(s)return!0;if(!n)return ca(t)>0;let i=ca(t),c=ca(n.severity);return i>c?!0:o.getTime()-n.lastDispatchedAt.getTime()>=YM?c>=ca("approaching")&&i===c?!(r>=XM):i>0:!1}u(Th,"shouldDispatch");function Rh(e){let t=xh(e.observations,e.now),n=Math.max(0,Math.floor((e.currentResetsAt.getTime()-e.now.getTime())/1e3)),r=Ah({used_percentage:e.currentUsedPercentage,burnRateEtaSeconds:t,secondsUntilReset:n,hadObserved429:e.hadObserved429}),o={alertKey:e.alertKey,severity:r,usedPercentage:e.currentUsedPercentage,resetsAt:e.currentResetsAt.toISOString(),burnRateEtaSeconds:t};if(r==="none")return{shouldDispatch:!1,severity:"none",reason:"below threshold",payload:o};let s=e.hadObserved429&&(e.lastDispatch===null||e.lastDispatch.severity!=="hit"),i=Th({proposedSeverity:r,lastDispatch:e.lastDispatch,currentResetsAt:e.currentResetsAt,currentUsedPercentage:e.currentUsedPercentage,now:e.now,isFirstTime429:s});return{shouldDispatch:i,severity:r,reason:i?"dispatch":"suppressed by cooldown/hysteresis",payload:o}}u(Rh,"evaluate");function Z0(e,t,n){return`${e}:${t}:${n}`}u(Z0,"deriveAlertKey");C();async function ua(e){await en({userId:e.userId,type:`usage_${e.severity}`,title:e.title??`Usage limit \u2014 ${lm[e.severity]}`,body:e.message,url:"/usage",sourceTable:"alert_dispatches",sourceId:e.dispatchId})}u(ua,"notifyFromDispatch");var e$=30*6e4;async function mm(e,t){let n=new Date((t.observedAt??new Date).getTime()-e$);try{let o=await d.execute(ZM`
1249
1171
  SELECT id, observed_at
1250
1172
  FROM limit_observations
1251
1173
  WHERE user_id = ${e}
@@ -1258,9 +1180,9 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
1258
1180
  AND observed_at >= ${n.toISOString()}::timestamptz
1259
1181
  ORDER BY observed_at DESC
1260
1182
  LIMIT 1
1261
- `);if(o.length>0){let s=o[0];return{id:s.id,observedAt:new Date(s.observed_at).toISOString(),deduped:!0}}}catch(o){console.warn("[observe] dedup probe failed; proceeding to insert",o)}let[r]=await u.insert(we).values({provider:t.provider,plan:t.plan,limitType:t.limitType,value:String(t.value),unit:t.unit,comparator:t.comparator,resetsAt:t.resetsAt??null,sourceType:t.sourceType,sourceUrl:t.sourceUrl??null,sourceEvidence:t.sourceEvidence??null,confidence:String(t.confidence),userId:e,...t.observedAt?{observedAt:t.observedAt}:{}}).returning({id:we.id,observedAt:we.observedAt});if(t.sourceType==="oauth_usage"||t.sourceType==="self_observed_429")try{let o=lA(t.provider,t.plan,t.limitType),s=new Date,i=new Date(s.getTime()-600*1e3),a=await u.select({observedAt:we.observedAt,value:we.value}).from(we).where(pA(ld(we.userId,e),ld(we.provider,t.provider),ld(we.limitType,t.limitType),F1(we.observedAt,i))).orderBy(mA(we.observedAt)).limit(50),c=await u.select().from(yn).where(pA(ld(yn.userId,e),ld(yn.alertKey,o))).orderBy(mA(yn.lastDispatchedAt)).limit(1),l=Nh({alertKey:o,observations:a.map(p=>({observedAt:p.observedAt,value:Number(p.value)})),currentUsedPercentage:t.value,currentResetsAt:t.resetsAt??new Date(s.getTime()+300*60*1e3),hadObserved429:t.sourceType==="self_observed_429",lastDispatch:c[0]?{severity:c[0].severity,lastDispatchedAt:c[0].lastDispatchedAt,lastState:c[0].lastState}:null,now:s});if(l.shouldDispatch&&l.severity!=="none"){let p=l.severity,[m]=await u.insert(yn).values({userId:e,alertKey:o,severity:p,lastState:l.payload,channel:"banner"}).returning({id:yn.id});m&&await ua({userId:e,dispatchId:m.id,severity:p,message:Rh(p,t.limitType,l.payload.usedPercentage,l.payload.resetsAt)})}}catch(o){console.error("alert evaluation failed",o)}return{id:r.id,observedAt:new Date(r.observedAt).toISOString(),deduped:!1}}d(mp,"processObservation");function fA(e,t){return`${e}::${t.provider}::${t.sourceType}::${t.limitType}`}d(fA,"observationKey");function fp(){return process.env.OBSERVE_BATCHING!=="0"}d(fp,"observeBatchingEnabled");function gA(){let e=Number(process.env.OBSERVE_BATCH_BUFFER_MAX);return Number.isFinite(e)&&e>0?Math.floor(e):5e3}d(gA,"observeBufferMax");function hA(){let e=Number(process.env.PG_POOL_MAX)||3;return Math.max(1,e-1)}d(hA,"defaultConcurrency");function V1(e={}){let t=e.process??((b,I)=>mp(b,I)),n=e.maxBuffered??gA(),r=Math.max(1,e.concurrency??hA()),o=new Map,s=0,i=new Set,a=0,c=!1,l=[];function p(){let b=l;l=[];for(let I of b)I()}d(p,"notifyProgress");function m(){for(;a<r;){let b=null,I=null;for(let[S,A]of o)if(!(i.has(S)||A.length===0)){I=A,o.delete(S),b=S;break}if(b==null||I==null)return;s-=I.length,i.add(b),a++,y(b,I)}}d(m,"tick");async function y(b,I){try{for(let S of I)try{await t(S.userId,S.obs)}catch(A){console.warn("[observe-batcher] drain failed for one observation; dropping it:",A instanceof Error?A.message:A)}}finally{a--,i.delete(b),p(),m()}}d(y,"runDrain");function v(b){if(c||s>=n)return!1;let I=fA(b.userId,b.obs),S=o.get(I);return S?S.push(b):o.set(I,[b]),s++,m(),!0}d(v,"push");function h(b){return new Promise(I=>{let S=!1,A=d(()=>{S||(S=!0,clearTimeout(E),I())},"finish"),E=setTimeout(A,b);E.unref?.(),l.push(A)})}d(h,"waitForProgress");async function f(b){let I=b!=null?Date.now()+b:Number.POSITIVE_INFINITY;for(;;){if(m(),s===0&&a===0)return;let S=I-Date.now();if(S<=0)return;await h(Math.min(S,50))}}d(f,"flush");function w(){c=!0}return d(w,"stop"),{push:v,flush:f,stop:w,size:d(()=>s,"size"),inFlight:d(()=>a,"inFlight")}}d(V1,"createObserveBatcher");var Wo=null;function Ph(){return Wo==null&&(Wo=V1()),Wo}d(Ph,"getObserveBatcher");function _A(){Ph(),console.log(`[observe-batcher] batched observe ingest ON (bufferMax=${gA()} drainConcurrency=${hA()}; OBSERVE_BATCHING=0 to disable)`)}d(_A,"initObserveBatcher");async function yA(e=5e3){if(Wo==null)return;Wo.stop(),await Wo.flush(e);let t=Wo.size()+Wo.inFlight();t>0&&console.warn(`[observe-batcher] shutdown flush deadline (${e}ms) hit; dropping ~${t} buffered observation(s)`)}d(yA,"shutdownObserveBatcher");var tr=new J1,Y1=He.object({provider:He.string().min(1).max(64),plan:He.string().min(1).max(64),limitType:He.string().min(1).max(128),value:He.number().finite(),unit:He.string().min(1).max(32),comparator:He.enum(["=",">=","<="]).default("="),resetsAt:He.union([He.string(),He.date(),He.null()]).optional().transform(e=>{if(e==null)return null;if(e instanceof Date)return e;let t=new Date(e);return isNaN(t.getTime())?null:t}),sourceType:He.enum(["oauth_usage","self_observed_429","official_docs","self_observed_lower_bound","community","llm_research","release_notes","live_headers","live_stream"]),sourceUrl:He.string().url().optional().nullable(),sourceEvidence:He.unknown().optional(),confidence:He.number().min(0).max(1),observedAt:He.union([He.string(),He.date()]).optional().transform(e=>{if(e==null)return;if(e instanceof Date)return e;let t=new Date(e);return isNaN(t.getTime())?void 0:t})});tr.post("/internal/research/match-headers",async e=>{let t=e.get("userId"),n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON"},400)}let o=He.object({host:He.string(),path:He.string().default("/"),responseHeaders:He.record(He.string()),observedAt:He.string().optional(),plan:He.string().optional()}).safeParse(n);if(!o.success)return e.json({error:"Invalid request body",issues:o.error.issues},400);let{host:s,path:i,responseHeaders:a,observedAt:c,plan:l}=o.data,p=Eh(s);if(!p?.liveSource?.headers)return e.json({observations:[]});let m={host:s,path:i,plan:l??null,observedAt:c?new Date(c):new Date,userId:t},y=p.liveSource.headers.parse(a,m);if(!y||y.length===0)return e.json({observations:[]});let v=[];for(let h of y)try{let f=h.observedAt instanceof Date?h.observedAt:typeof h.observedAt=="string"?new Date(h.observedAt):void 0,[w]=await u.insert(we).values({provider:h.provider,plan:h.plan,limitType:h.limitType,value:String(h.value),unit:h.unit,comparator:h.comparator??"=",resetsAt:h.resetsAt instanceof Date?h.resetsAt:null,sourceType:h.sourceType,sourceUrl:h.sourceUrl??null,sourceEvidence:h.sourceEvidence??null,confidence:String(h.confidence),userId:t,...f?{observedAt:f}:{}}).returning({id:we.id});v.push({...h,id:w.id})}catch{}return e.json({observations:v})});tr.post("/internal/research/match-stream-frame",async e=>{let t=e.get("userId"),n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON"},400)}let o=He.object({host:He.string(),path:He.string().default("/"),frameText:He.string(),observedAt:He.string().optional(),plan:He.string().optional()}).safeParse(n);if(!o.success)return e.json({error:"Invalid request body",issues:o.error.issues},400);let{host:s,path:i,frameText:a,observedAt:c,plan:l}=o.data,p=xh(s,i);if(!p?.liveSource?.streamFrame)return e.json({observations:[]});let m={host:s,path:i,plan:l??null,observedAt:c?new Date(c):new Date,userId:t},y=p.liveSource.streamFrame.parse(a,m);if(!y||y.length===0)return e.json({observations:[]});let v=[];for(let h of y)try{let f=h.observedAt instanceof Date?h.observedAt:typeof h.observedAt=="string"?new Date(h.observedAt):void 0,[w]=await u.insert(we).values({provider:h.provider,plan:h.plan,limitType:h.limitType,value:String(h.value),unit:h.unit,comparator:h.comparator??"=",resetsAt:h.resetsAt instanceof Date?h.resetsAt:null,sourceType:h.sourceType,sourceUrl:h.sourceUrl??null,sourceEvidence:h.sourceEvidence??null,confidence:String(h.confidence),userId:t,...f?{observedAt:f}:{}}).returning({id:we.id});v.push({...h,id:w.id})}catch{}return e.json({observations:v})});tr.post("/internal/research/observe",async e=>{let t=e.get("userId"),n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON"},400)}let r=Y1.safeParse(n);if(!r.success)return e.json({error:"Invalid observation",issues:r.error.issues},400);let o=r.data;if(fp())return Ph().push({userId:t,obs:o})?e.json({buffered:!0,durable:!1},202):(e.header("Retry-After","2"),e.json({error:"Observe buffer full; retry shortly.",durable:!1},429));let s=await mp(t,o);return e.json({id:s.id,observedAt:s.observedAt,...s.deduped?{deduped:!0}:{}},s.deduped?200:201)});tr.get("/research/active-limits",async e=>{let t=e.req.query("provider"),n=e.req.query("plan"),r=[G1(Ge.effectiveUntil)];t&&r.push(Ar(Ge.provider,t)),n&&r.push(Ar(Ge.plan,n));let o=await u.select().from(Ge).where(pd(...r)).orderBy(Ge.provider,Ge.plan,Ge.limitType,gp(Ge.effectiveFrom));return e.json({items:o})});tr.get("/research/doc-changes",async e=>{let t=e.req.query("since"),n=t?new Date(t):new Date(Date.now()-7*864e5);if(isNaN(n.getTime()))return e.json({error:"Invalid since parameter"},400);let r=await u.select({id:xt.id,fetchedAt:xt.fetchedAt,provider:xt.provider,docUrl:xt.docUrl,contentHash:xt.contentHash,parseSuccess:xt.parseSuccess}).from(xt).where(Ch(xt.fetchedAt,n)).orderBy(xt.provider,xt.docUrl,gp(xt.fetchedAt)),o=new Map;for(let s of r){let i=`${s.provider}::${s.docUrl}`,a=o.get(i);a?(a.previousHash===null&&s.contentHash!==a.latestHash&&(a.previousHash=s.contentHash,a.changed=!0),a.snapshots.push(s)):o.set(i,{provider:s.provider,docUrl:s.docUrl,latestFetchedAt:s.fetchedAt,latestHash:s.contentHash,previousHash:null,parseSuccess:s.parseSuccess,changed:!1,snapshots:[s]})}return e.json({items:Array.from(o.values())})});tr.get("/research/disagreements",async e=>{let t=e.get("userId"),n=Math.min(parseInt(e.req.query("since_days")??"14",10)||14,90),r=new Date(Date.now()-n*864e5),o=await u.select().from(we).where(pd(Ar(we.userId,t),Ch(we.observedAt,r))).orderBy(gp(we.observedAt)),s=new Map;for(let a of o){let c=`${a.provider}::${a.plan}::${a.limitType}`,l=s.get(c);l||(l={provider:a.provider,plan:a.plan,limitType:a.limitType,observations:[]},s.set(c,l)),l.observations.push({id:a.id,value:Number(a.value),unit:a.unit,sourceType:a.sourceType,confidence:Number(a.confidence),observedAt:a.observedAt})}let i=[];for(let a of s.values()){if(a.observations.length<2)continue;let c=a.observations.map(y=>y.value).filter(y=>y>0);if(c.length<2)continue;let l=Math.min(...c),p=Math.max(...c);if(l===0)continue;let m=(p-l)/l*100;m>20&&i.push({provider:a.provider,plan:a.plan,limitType:a.limitType,minValue:l,maxValue:p,spreadPct:m,observations:a.observations})}return i.sort((a,c)=>c.spreadPct-a.spreadPct),e.json({items:i.slice(0,100)})});tr.get("/research/confidence-history",async e=>{let t=e.req.query("provider"),n=e.req.query("plan"),r=e.req.query("limit_type"),o=Math.min(parseInt(e.req.query("days")??"90",10)||90,365);if(!t||!n||!r)return e.json({error:"provider, plan, limit_type required"},400);let s=new Date(Date.now()-o*864e5),i=await u.select({effectiveFrom:Ge.effectiveFrom,effectiveUntil:Ge.effectiveUntil,confidence:Ge.confidence,value:Ge.value}).from(Ge).where(pd(Ar(Ge.provider,t),Ar(Ge.plan,n),Ar(Ge.limitType,r),Ch(Ge.effectiveFrom,s))).orderBy(Ge.effectiveFrom);return e.json({items:i.map(a=>({effectiveFrom:a.effectiveFrom,effectiveUntil:a.effectiveUntil,confidence:Number(a.confidence),value:Number(a.value)}))})});tr.get("/research/observations",async e=>{let t=e.get("userId"),n=e.req.query("provider"),r=e.req.query("plan"),o=e.req.query("limit_type"),s=Math.min(parseInt(e.req.query("limit")??"50",10)||50,200),i=Math.max(parseInt(e.req.query("offset")??"0",10)||0,0),a=[Ar(we.userId,t)];n&&a.push(Ar(we.provider,n)),r&&a.push(Ar(we.plan,r)),o&&a.push(Ar(we.limitType,o));let c=await u.select().from(we).where(pd(...a)).orderBy(gp(we.observedAt)).limit(s).offset(i),[{total:l}]=await u.select({total:K1`count(*)::int`}).from(we).where(pd(...a));return e.json({items:c,total:l,limit:s,offset:i})});O();import{Hono as X1}from"hono";import{and as bA,desc as Q1,eq as la,isNull as Z1,ne as eq,sql as Er}from"drizzle-orm";var wA={free:.2,pro:1,max_5x:5,max_20x:20},Dh=new Set(["free","pro","max_5x","max_20x"]),Oh={fiveHourMessages:20,sevenDaySonnetHours:14,sevenDayOpusHours:1.65};function vA(e){let t=wA[e]??wA.max_20x;return{fiveHourMessages:Math.round(Oh.fiveHourMessages*t),sevenDaySonnetHours:Math.round(Oh.sevenDaySonnetHours*t),sevenDayOpusHours:Math.round(Oh.sevenDayOpusHours*t)}}d(vA,"planDefaultCaps");var md=new X1,tq=60*1e3,Mh=new Map;function nq(e,t){let n=`${e}::${t}`,r=Mh.get(n);if(r&&Date.now()-r.at<tq)return r.rows;let o=u.select({limitType:Ge.limitType,value:Ge.value,unit:Ge.unit}).from(Ge).where(bA(la(Ge.provider,e),la(Ge.plan,t),Z1(Ge.effectiveUntil)));return o.catch(()=>Mh.delete(n)),Mh.set(n,{at:Date.now(),rows:o}),o}d(nq,"getActivePlanLimits");var IA=["five_hour_percent","seven_day_percent","seven_day_opus_percent"],rq={anthropic:["oauth_usage"],codex:["live_stream","self_observed_429"]};function oq(e){return rq[e]??["oauth_usage"]}d(oq,"sourceTypesFor");md.get("/usage/current-limits",async e=>{let t=e.get("userId"),n=e.req.query("provider")??"anthropic",r=oq(n),o=await u.execute(Er`
1183
+ `);if(o.length>0){let s=o[0];return{id:s.id,observedAt:new Date(s.observed_at).toISOString(),deduped:!0}}}catch(o){console.warn("[observe] dedup probe failed; proceeding to insert",o)}let[r]=await d.insert(ye).values({provider:t.provider,plan:t.plan,limitType:t.limitType,value:String(t.value),unit:t.unit,comparator:t.comparator,resetsAt:t.resetsAt??null,sourceType:t.sourceType,sourceUrl:t.sourceUrl??null,sourceEvidence:t.sourceEvidence??null,confidence:String(t.confidence),userId:e,...t.observedAt?{observedAt:t.observedAt}:{}}).returning({id:ye.id,observedAt:ye.observedAt});if(t.sourceType==="oauth_usage"||t.sourceType==="self_observed_429")try{let o=Z0(t.provider,t.plan,t.limitType),s=new Date,i=new Date(s.getTime()-600*1e3),c=await d.select({observedAt:ye.observedAt,value:ye.value}).from(ye).where(eS(mu(ye.userId,e),mu(ye.provider,t.provider),mu(ye.limitType,t.limitType),QM(ye.observedAt,i))).orderBy(tS(ye.observedAt)).limit(50),a=await d.select().from(yn).where(eS(mu(yn.userId,e),mu(yn.alertKey,o))).orderBy(tS(yn.lastDispatchedAt)).limit(1),l=Rh({alertKey:o,observations:c.map(m=>({observedAt:m.observedAt,value:Number(m.value)})),currentUsedPercentage:t.value,currentResetsAt:t.resetsAt??new Date(s.getTime()+300*60*1e3),hadObserved429:t.sourceType==="self_observed_429",lastDispatch:a[0]?{severity:a[0].severity,lastDispatchedAt:a[0].lastDispatchedAt,lastState:a[0].lastState}:null,now:s});if(l.shouldDispatch&&l.severity!=="none"){let m=l.severity,[p]=await d.insert(yn).values({userId:e,alertKey:o,severity:m,lastState:l.payload,channel:"banner"}).returning({id:yn.id});p&&await ua({userId:e,dispatchId:p.id,severity:m,message:Eh(m,t.limitType,l.payload.usedPercentage,l.payload.resetsAt)})}}catch(o){console.error("alert evaluation failed",o)}return{id:r.id,observedAt:new Date(r.observedAt).toISOString(),deduped:!1}}u(mm,"processObservation");function nS(e,t){return`${e}::${t.provider}::${t.sourceType}::${t.limitType}`}u(nS,"observationKey");function pm(){return process.env.OBSERVE_BATCHING!=="0"}u(pm,"observeBatchingEnabled");function rS(){let e=Number(process.env.OBSERVE_BATCH_BUFFER_MAX);return Number.isFinite(e)&&e>0?Math.floor(e):5e3}u(rS,"observeBufferMax");function oS(){let e=Number(process.env.PG_POOL_MAX)||3;return Math.max(1,e-1)}u(oS,"defaultConcurrency");function t$(e={}){let t=e.process??((b,v)=>mm(b,v)),n=e.maxBuffered??rS(),r=Math.max(1,e.concurrency??oS()),o=new Map,s=0,i=new Set,c=0,a=!1,l=[];function m(){let b=l;l=[];for(let v of b)v()}u(m,"notifyProgress");function p(){for(;c<r;){let b=null,v=null;for(let[S,A]of o)if(!(i.has(S)||A.length===0)){v=A,o.delete(S),b=S;break}if(b==null||v==null)return;s-=v.length,i.add(b),c++,_(b,v)}}u(p,"tick");async function _(b,v){try{for(let S of v)try{await t(S.userId,S.obs)}catch(A){console.warn("[observe-batcher] drain failed for one observation; dropping it:",A instanceof Error?A.message:A)}}finally{c--,i.delete(b),m(),p()}}u(_,"runDrain");function I(b){if(a||s>=n)return!1;let v=nS(b.userId,b.obs),S=o.get(v);return S?S.push(b):o.set(v,[b]),s++,p(),!0}u(I,"push");function h(b){return new Promise(v=>{let S=!1,A=u(()=>{S||(S=!0,clearTimeout(E),v())},"finish"),E=setTimeout(A,b);E.unref?.(),l.push(A)})}u(h,"waitForProgress");async function f(b){let v=b!=null?Date.now()+b:Number.POSITIVE_INFINITY;for(;;){if(p(),s===0&&c===0)return;let S=v-Date.now();if(S<=0)return;await h(Math.min(S,50))}}u(f,"flush");function w(){a=!0}return u(w,"stop"),{push:I,flush:f,stop:w,size:u(()=>s,"size"),inFlight:u(()=>c,"inFlight")}}u(t$,"createObserveBatcher");var Fo=null;function kh(){return Fo==null&&(Fo=t$()),Fo}u(kh,"getObserveBatcher");function sS(){kh(),console.log(`[observe-batcher] batched observe ingest ON (bufferMax=${rS()} drainConcurrency=${oS()}; OBSERVE_BATCHING=0 to disable)`)}u(sS,"initObserveBatcher");async function iS(e=5e3){if(Fo==null)return;Fo.stop(),await Fo.flush(e);let t=Fo.size()+Fo.inFlight();t>0&&console.warn(`[observe-batcher] shutdown flush deadline (${e}ms) hit; dropping ~${t} buffered observation(s)`)}u(iS,"shutdownObserveBatcher");var tr=new n$,s$=Ue.object({provider:Ue.string().min(1).max(64),plan:Ue.string().min(1).max(64),limitType:Ue.string().min(1).max(128),value:Ue.number().finite(),unit:Ue.string().min(1).max(32),comparator:Ue.enum(["=",">=","<="]).default("="),resetsAt:Ue.union([Ue.string(),Ue.date(),Ue.null()]).optional().transform(e=>{if(e==null)return null;if(e instanceof Date)return e;let t=new Date(e);return isNaN(t.getTime())?null:t}),sourceType:Ue.enum(["oauth_usage","self_observed_429","official_docs","self_observed_lower_bound","community","llm_research","release_notes","live_headers","live_stream"]),sourceUrl:Ue.string().url().optional().nullable(),sourceEvidence:Ue.unknown().optional(),confidence:Ue.number().min(0).max(1),observedAt:Ue.union([Ue.string(),Ue.date()]).optional().transform(e=>{if(e==null)return;if(e instanceof Date)return e;let t=new Date(e);return isNaN(t.getTime())?void 0:t})});tr.post("/internal/research/match-headers",async e=>{let t=e.get("userId"),n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON"},400)}let o=Ue.object({host:Ue.string(),path:Ue.string().default("/"),responseHeaders:Ue.record(Ue.string()),observedAt:Ue.string().optional(),plan:Ue.string().optional()}).safeParse(n);if(!o.success)return e.json({error:"Invalid request body",issues:o.error.issues},400);let{host:s,path:i,responseHeaders:c,observedAt:a,plan:l}=o.data,m=bh(s);if(!m?.liveSource?.headers)return e.json({observations:[]});let p={host:s,path:i,plan:l??null,observedAt:a?new Date(a):new Date,userId:t},_=m.liveSource.headers.parse(c,p);if(!_||_.length===0)return e.json({observations:[]});let I=[];for(let h of _)try{let f=h.observedAt instanceof Date?h.observedAt:typeof h.observedAt=="string"?new Date(h.observedAt):void 0,[w]=await d.insert(ye).values({provider:h.provider,plan:h.plan,limitType:h.limitType,value:String(h.value),unit:h.unit,comparator:h.comparator??"=",resetsAt:h.resetsAt instanceof Date?h.resetsAt:null,sourceType:h.sourceType,sourceUrl:h.sourceUrl??null,sourceEvidence:h.sourceEvidence??null,confidence:String(h.confidence),userId:t,...f?{observedAt:f}:{}}).returning({id:ye.id});I.push({...h,id:w.id})}catch{}return e.json({observations:I})});tr.post("/internal/research/match-stream-frame",async e=>{let t=e.get("userId"),n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON"},400)}let o=Ue.object({host:Ue.string(),path:Ue.string().default("/"),frameText:Ue.string(),observedAt:Ue.string().optional(),plan:Ue.string().optional()}).safeParse(n);if(!o.success)return e.json({error:"Invalid request body",issues:o.error.issues},400);let{host:s,path:i,frameText:c,observedAt:a,plan:l}=o.data,m=Sh(s,i);if(!m?.liveSource?.streamFrame)return e.json({observations:[]});let p={host:s,path:i,plan:l??null,observedAt:a?new Date(a):new Date,userId:t},_=m.liveSource.streamFrame.parse(c,p);if(!_||_.length===0)return e.json({observations:[]});let I=[];for(let h of _)try{let f=h.observedAt instanceof Date?h.observedAt:typeof h.observedAt=="string"?new Date(h.observedAt):void 0,[w]=await d.insert(ye).values({provider:h.provider,plan:h.plan,limitType:h.limitType,value:String(h.value),unit:h.unit,comparator:h.comparator??"=",resetsAt:h.resetsAt instanceof Date?h.resetsAt:null,sourceType:h.sourceType,sourceUrl:h.sourceUrl??null,sourceEvidence:h.sourceEvidence??null,confidence:String(h.confidence),userId:t,...f?{observedAt:f}:{}}).returning({id:ye.id});I.push({...h,id:w.id})}catch{}return e.json({observations:I})});tr.post("/internal/research/observe",async e=>{let t=e.get("userId"),n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON"},400)}let r=s$.safeParse(n);if(!r.success)return e.json({error:"Invalid observation",issues:r.error.issues},400);let o=r.data;if(pm())return kh().push({userId:t,obs:o})?e.json({buffered:!0,durable:!1},202):(e.header("Retry-After","2"),e.json({error:"Observe buffer full; retry shortly.",durable:!1},429));let s=await mm(t,o);return e.json({id:s.id,observedAt:s.observedAt,...s.deduped?{deduped:!0}:{}},s.deduped?200:201)});tr.get("/research/active-limits",async e=>{let t=e.req.query("provider"),n=e.req.query("plan"),r=[r$(Ke.effectiveUntil)];t&&r.push(Ar(Ke.provider,t)),n&&r.push(Ar(Ke.plan,n));let o=await d.select().from(Ke).where(pu(...r)).orderBy(Ke.provider,Ke.plan,Ke.limitType,fm(Ke.effectiveFrom));return e.json({items:o})});tr.get("/research/doc-changes",async e=>{let t=e.req.query("since"),n=t?new Date(t):new Date(Date.now()-7*864e5);if(isNaN(n.getTime()))return e.json({error:"Invalid since parameter"},400);let r=await d.select({id:xt.id,fetchedAt:xt.fetchedAt,provider:xt.provider,docUrl:xt.docUrl,contentHash:xt.contentHash,parseSuccess:xt.parseSuccess}).from(xt).where(Nh(xt.fetchedAt,n)).orderBy(xt.provider,xt.docUrl,fm(xt.fetchedAt)),o=new Map;for(let s of r){let i=`${s.provider}::${s.docUrl}`,c=o.get(i);c?(c.previousHash===null&&s.contentHash!==c.latestHash&&(c.previousHash=s.contentHash,c.changed=!0),c.snapshots.push(s)):o.set(i,{provider:s.provider,docUrl:s.docUrl,latestFetchedAt:s.fetchedAt,latestHash:s.contentHash,previousHash:null,parseSuccess:s.parseSuccess,changed:!1,snapshots:[s]})}return e.json({items:Array.from(o.values())})});tr.get("/research/disagreements",async e=>{let t=e.get("userId"),n=Math.min(parseInt(e.req.query("since_days")??"14",10)||14,90),r=new Date(Date.now()-n*864e5),o=await d.select().from(ye).where(pu(Ar(ye.userId,t),Nh(ye.observedAt,r))).orderBy(fm(ye.observedAt)),s=new Map;for(let c of o){let a=`${c.provider}::${c.plan}::${c.limitType}`,l=s.get(a);l||(l={provider:c.provider,plan:c.plan,limitType:c.limitType,observations:[]},s.set(a,l)),l.observations.push({id:c.id,value:Number(c.value),unit:c.unit,sourceType:c.sourceType,confidence:Number(c.confidence),observedAt:c.observedAt})}let i=[];for(let c of s.values()){if(c.observations.length<2)continue;let a=c.observations.map(_=>_.value).filter(_=>_>0);if(a.length<2)continue;let l=Math.min(...a),m=Math.max(...a);if(l===0)continue;let p=(m-l)/l*100;p>20&&i.push({provider:c.provider,plan:c.plan,limitType:c.limitType,minValue:l,maxValue:m,spreadPct:p,observations:c.observations})}return i.sort((c,a)=>a.spreadPct-c.spreadPct),e.json({items:i.slice(0,100)})});tr.get("/research/confidence-history",async e=>{let t=e.req.query("provider"),n=e.req.query("plan"),r=e.req.query("limit_type"),o=Math.min(parseInt(e.req.query("days")??"90",10)||90,365);if(!t||!n||!r)return e.json({error:"provider, plan, limit_type required"},400);let s=new Date(Date.now()-o*864e5),i=await d.select({effectiveFrom:Ke.effectiveFrom,effectiveUntil:Ke.effectiveUntil,confidence:Ke.confidence,value:Ke.value}).from(Ke).where(pu(Ar(Ke.provider,t),Ar(Ke.plan,n),Ar(Ke.limitType,r),Nh(Ke.effectiveFrom,s))).orderBy(Ke.effectiveFrom);return e.json({items:i.map(c=>({effectiveFrom:c.effectiveFrom,effectiveUntil:c.effectiveUntil,confidence:Number(c.confidence),value:Number(c.value)}))})});tr.get("/research/observations",async e=>{let t=e.get("userId"),n=e.req.query("provider"),r=e.req.query("plan"),o=e.req.query("limit_type"),s=Math.min(parseInt(e.req.query("limit")??"50",10)||50,200),i=Math.max(parseInt(e.req.query("offset")??"0",10)||0,0),c=[Ar(ye.userId,t)];n&&c.push(Ar(ye.provider,n)),r&&c.push(Ar(ye.plan,r)),o&&c.push(Ar(ye.limitType,o));let a=await d.select().from(ye).where(pu(...c)).orderBy(fm(ye.observedAt)).limit(s).offset(i),[{total:l}]=await d.select({total:o$`count(*)::int`}).from(ye).where(pu(...c));return e.json({items:a,total:l,limit:s,offset:i})});C();import{Hono as i$}from"hono";import{and as dS,desc as a$,eq as da,isNull as c$,ne as u$,sql as Er}from"drizzle-orm";var aS={free:.2,pro:1,max_5x:5,max_20x:20},Ph=new Set(["free","pro","max_5x","max_20x"]),jh={fiveHourMessages:20,sevenDaySonnetHours:14,sevenDayOpusHours:1.65};function cS(e){let t=aS[e]??aS.max_20x;return{fiveHourMessages:Math.round(jh.fiveHourMessages*t),sevenDaySonnetHours:Math.round(jh.sevenDaySonnetHours*t),sevenDayOpusHours:Math.round(jh.sevenDayOpusHours*t)}}u(cS,"planDefaultCaps");var fu=new i$,d$=60*1e3,Dh=new Map;function l$(e,t){let n=`${e}::${t}`,r=Dh.get(n);if(r&&Date.now()-r.at<d$)return r.rows;let o=d.select({limitType:Ke.limitType,value:Ke.value,unit:Ke.unit}).from(Ke).where(dS(da(Ke.provider,e),da(Ke.plan,t),c$(Ke.effectiveUntil)));return o.catch(()=>Dh.delete(n)),Dh.set(n,{at:Date.now(),rows:o}),o}u(l$,"getActivePlanLimits");var uS=["five_hour_percent","seven_day_percent","seven_day_opus_percent"],m$={anthropic:["oauth_usage"],codex:["live_stream","self_observed_429"]};function p$(e){return m$[e]??["oauth_usage"]}u(p$,"sourceTypesFor");fu.get("/usage/current-limits",async e=>{let t=e.get("userId"),n=e.req.query("provider")??"anthropic",r=p$(n),o=await d.execute(Er`
1262
1184
  SELECT lt.limit_type AS limit_type, o.value AS value, o.resets_at AS resets_at, o.observed_at AS observed_at
1263
- FROM (VALUES ${Er.join(IA.map(i=>Er`(${i})`),Er`, `)}) AS lt(limit_type)
1185
+ FROM (VALUES ${Er.join(uS.map(i=>Er`(${i})`),Er`, `)}) AS lt(limit_type)
1264
1186
  LEFT JOIN LATERAL (
1265
1187
  SELECT max(resets_at) AS resets_at
1266
1188
  FROM limit_observations
@@ -1281,27 +1203,27 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
1281
1203
  ORDER BY (CASE WHEN w.resets_at IS NULL THEN 0 ELSE value END) DESC, observed_at DESC
1282
1204
  LIMIT 1
1283
1205
  ) o ON true
1284
- `),s=new Map;for(let i of o)i.value==null||i.observed_at==null||IA.includes(i.limit_type)&&s.set(i.limit_type,{used_percentage:Number(i.value),resets_at:i.resets_at?new Date(i.resets_at).toISOString():null,observed_at:new Date(i.observed_at).toISOString()});return e.header("Cache-Control","private, max-age=15"),e.json({provider:n,five_hour:s.get("five_hour_percent")??null,seven_day:s.get("seven_day_percent")??null,seven_day_opus:s.get("seven_day_opus_percent")??null})});md.get("/usage/inferred-caps",async e=>{let t=e.get("userId"),n=e.req.query("provider")??"anthropic",[r]=await u.select({plan:T.claudeCodePlan,source:T.planSource}).from(T).where(la(T.id,t)),o=r?.source==="manual"&&r.plan&&Dh.has(r.plan)?r.plan:null,s=await u.select({plan:we.plan}).from(we).where(bA(la(we.userId,t),la(we.provider,n),la(we.sourceType,"oauth_usage"),eq(we.plan,"unknown"))).orderBy(Q1(we.observedAt)).limit(1),i=s[0]?.plan&&Dh.has(s[0].plan)?s[0].plan:null,a=o??i??"max_20x",c=o===null&&i===null,l=vA(a),p=await nq(n,a);function m(f,w,b){let I=p.filter(S=>S.limitType===f&&w.test(S.unit));return I.length===0?b:Math.max(...I.map(S=>Number(S.value)))}d(m,"bestCap");let y=m("five_hour_messages",/msg|message/i,l.fiveHourMessages),v=m("seven_day_sonnet_hours",/hour|hr/i,l.sevenDaySonnetHours),h=m("seven_day_opus_hours",/hour|hr/i,l.sevenDayOpusHours);return e.header("Cache-Control","private, max-age=15"),e.json({plan:a,assumed:c,five_hour_percent:{inferred_cap:y,unit:"messages",confidence_band_pct:20},seven_day_percent:{inferred_cap:v,unit:"hours",confidence_band_pct:20},seven_day_opus_percent:{inferred_cap:h,unit:"hours",confidence_band_pct:20}})});O();import{Hono as sq}from"hono";import{z as nr}from"zod";import{and as SA,desc as xA,eq as fd,sql as iq}from"drizzle-orm";var hd=new sq,AA=30,aq=30,cq=0,Lh=1e3,EA=2e3,$h=2;function gd(e){return e==null?0:typeof e=="number"?e:Number(e)}d(gd,"toNum");function dq(e){if(!e)return null;let t=typeof e=="string"?Date.parse(e):e.getTime();return Number.isNaN(t)?null:(Date.now()-t)/864e5}d(dq,"ageDays");async function uq(){let e=await u.select({provider:Qe.provider,modelId:Qe.modelId,inputPerM:Qe.inputPerM,outputPerM:Qe.outputPerM,effectiveFrom:Qe.effectiveFrom,verifiedAt:Qe.verifiedAt}).from(Qe).orderBy(xA(Qe.effectiveFrom)),t=new Map;for(let n of e){let r=`${n.provider}::${n.modelId}`;t.has(r)||t.set(r,n)}return t}d(uq,"loadActiveRows");hd.get("/pricing/coverage",async e=>{if(!e.get("userId"))return e.json({error:"unauthorized"},401);let n=await u.execute(iq`
1206
+ `),s=new Map;for(let i of o)i.value==null||i.observed_at==null||uS.includes(i.limit_type)&&s.set(i.limit_type,{used_percentage:Number(i.value),resets_at:i.resets_at?new Date(i.resets_at).toISOString():null,observed_at:new Date(i.observed_at).toISOString()});return e.header("Cache-Control","private, max-age=15"),e.json({provider:n,five_hour:s.get("five_hour_percent")??null,seven_day:s.get("seven_day_percent")??null,seven_day_opus:s.get("seven_day_opus_percent")??null})});fu.get("/usage/inferred-caps",async e=>{let t=e.get("userId"),n=e.req.query("provider")??"anthropic",[r]=await d.select({plan:T.claudeCodePlan,source:T.planSource}).from(T).where(da(T.id,t)),o=r?.source==="manual"&&r.plan&&Ph.has(r.plan)?r.plan:null,s=await d.select({plan:ye.plan}).from(ye).where(dS(da(ye.userId,t),da(ye.provider,n),da(ye.sourceType,"oauth_usage"),u$(ye.plan,"unknown"))).orderBy(a$(ye.observedAt)).limit(1),i=s[0]?.plan&&Ph.has(s[0].plan)?s[0].plan:null,c=o??i??"max_20x",a=o===null&&i===null,l=cS(c),m=await l$(n,c);function p(f,w,b){let v=m.filter(S=>S.limitType===f&&w.test(S.unit));return v.length===0?b:Math.max(...v.map(S=>Number(S.value)))}u(p,"bestCap");let _=p("five_hour_messages",/msg|message/i,l.fiveHourMessages),I=p("seven_day_sonnet_hours",/hour|hr/i,l.sevenDaySonnetHours),h=p("seven_day_opus_hours",/hour|hr/i,l.sevenDayOpusHours);return e.header("Cache-Control","private, max-age=15"),e.json({plan:c,assumed:a,five_hour_percent:{inferred_cap:_,unit:"messages",confidence_band_pct:20},seven_day_percent:{inferred_cap:I,unit:"hours",confidence_band_pct:20},seven_day_opus_percent:{inferred_cap:h,unit:"hours",confidence_band_pct:20}})});C();import{Hono as f$}from"hono";import{z as nr}from"zod";import{and as lS,desc as fS,eq as gu,sql as g$}from"drizzle-orm";var _u=new f$,mS=30,h$=30,_$=0,Oh=1e3,pS=2e3,Ch=2;function hu(e){return e==null?0:typeof e=="number"?e:Number(e)}u(hu,"toNum");function y$(e){if(!e)return null;let t=typeof e=="string"?Date.parse(e):e.getTime();return Number.isNaN(t)?null:(Date.now()-t)/864e5}u(y$,"ageDays");async function w$(){let e=await d.select({provider:Qe.provider,modelId:Qe.modelId,inputPerM:Qe.inputPerM,outputPerM:Qe.outputPerM,effectiveFrom:Qe.effectiveFrom,verifiedAt:Qe.verifiedAt}).from(Qe).orderBy(fS(Qe.effectiveFrom)),t=new Map;for(let n of e){let r=`${n.provider}::${n.modelId}`;t.has(r)||t.set(r,n)}return t}u(w$,"loadActiveRows");_u.get("/pricing/coverage",async e=>{if(!e.get("userId"))return e.json({error:"unauthorized"},401);let n=await d.execute(g$`
1285
1207
  SELECT model,
1286
1208
  COUNT(*)::int AS events,
1287
1209
  MAX(timestamp) AS last_seen
1288
1210
  FROM session_events
1289
1211
  WHERE model IS NOT NULL
1290
1212
  AND model NOT IN ('unknown', '(null)')
1291
- AND timestamp > now() - (${aq} || ' days')::interval
1213
+ AND timestamp > now() - (${h$} || ' days')::interval
1292
1214
  GROUP BY model
1293
1215
  ORDER BY events DESC
1294
- `),r=await uq(),o=[],s=[],i=0;for(let a of n){let c=a.model,l=No(c),p=r.get(`${l}::${c}`);if(!p){o.push({provider:l,modelId:c,events:a.events,lastSeen:String(a.last_seen)});continue}let m=dq(p.verifiedAt??p.effectiveFrom);m===null||m>AA?s.push({provider:l,modelId:c,events:a.events,verifiedAt:p.verifiedAt?String(p.verifiedAt):null,ageDays:m===null?null:Math.round(m),currentInput:gd(p.inputPerM),currentOutput:gd(p.outputPerM)}):i+=1}return e.json({staleDays:AA,capturedModels:n.length,pricedFresh:i,unpriced:o,stale:s})});var lq=nr.object({provider:nr.string().min(1).optional(),modelId:nr.string().min(1),inputPerM:nr.number(),outputPerM:nr.number(),cacheReadPerM:nr.number().optional(),cacheWrite5mPerM:nr.number().optional(),cacheWrite1hPerM:nr.number().optional(),contextWindow:nr.number().int().positive().nullable().optional(),sourceUrl:nr.string().url(),effectiveFrom:nr.string().datetime().optional()});hd.post("/pricing/rates",async e=>{if(!e.get("userId"))return e.json({error:"unauthorized"},401);let n=lq.safeParse(await e.req.json().catch(()=>null));if(!n.success)return e.json({status:"rejected",reason:"invalid body",detail:n.error.flatten()},400);let r=n.data,o=r.provider??No(r.modelId),s=d((h,f)=>h>cq&&h<=f,"inRange");if(!s(r.inputPerM,Lh)||!s(r.outputPerM,Lh))return e.json({status:"rejected",reason:`input/output out of range (0, ${Lh}]`},422);let i=r.cacheReadPerM??0,a=r.cacheWrite5mPerM??0,c=r.cacheWrite1hPerM??0;for(let[h,f]of[["cacheReadPerM",i],["cacheWrite5mPerM",a],["cacheWrite1hPerM",c]])if(f<0||f>EA)return e.json({status:"rejected",reason:`${h} out of range [0, ${EA}]`},422);let p=(await u.select().from(Qe).where(SA(fd(Qe.provider,o),fd(Qe.modelId,r.modelId))).orderBy(xA(Qe.effectiveFrom)).limit(1))[0],m=1e-9;if(p){let h=gd(p.inputPerM),f=gd(p.outputPerM),w=d((A,E)=>E<=0?1/0:A/E,"ratio"),b=Math.max(w(r.inputPerM,h),w(h,r.inputPerM)),I=Math.max(w(r.outputPerM,f),w(f,r.outputPerM));if(b>$h||I>$h)return e.json({status:"flagged",reason:`new rate differs from current by more than ${$h}x \u2014 needs human review`,current:{inputPerM:h,outputPerM:f},proposed:{inputPerM:r.inputPerM,outputPerM:r.outputPerM},sourceUrl:r.sourceUrl});if(Math.abs(h-r.inputPerM)<m&&Math.abs(f-r.outputPerM)<m&&Math.abs(gd(p.cacheReadPerM)-i)<m)return await u.update(Qe).set({verifiedAt:new Date}).where(SA(fd(Qe.provider,o),fd(Qe.modelId,r.modelId),fd(Qe.effectiveFrom,p.effectiveFrom))),e.json({status:"unchanged",modelId:r.modelId})}let y=r.effectiveFrom?new Date(r.effectiveFrom):new Date,v=new Date().toISOString().slice(0,10);return await u.insert(Qe).values({provider:o,modelId:r.modelId,inputPerM:String(r.inputPerM),outputPerM:String(r.outputPerM),cacheReadPerM:String(i),cacheWrite5mPerM:String(a),cacheWrite1hPerM:String(c),contextWindow:r.contextWindow??null,effectiveFrom:y,verifiedAt:new Date,source:`auto-refresh-${v}`}).onConflictDoNothing(),e.json({status:"written",modelId:r.modelId,provider:o,effectiveFrom:y.toISOString()})});O();import{Hono as pq}from"hono";import{desc as mq,eq as fq}from"drizzle-orm";var hp=new pq;hp.get("/alerts/recent",async e=>{let t=e.get("userId"),n=await u.select().from(yn).where(fq(yn.userId,t)).orderBy(mq(yn.lastDispatchedAt)).limit(20);return e.json({items:n})});O();import{Hono as gq}from"hono";import{randomUUID as hq}from"node:crypto";import{sql as pa}from"drizzle-orm";var _p=new gq,kA=300,TA=3e4,_q=6e4,yq=1e3,qh={process_send_message:"session_send_jobs",process_launch:"launch_jobs",process_eval:"eval_jobs",process_conversation:"eval_jobs",process_insights:"insights_jobs",process_session_goal:"agent_jobs",distill_memories:"agent_jobs",memory_ab:"agent_jobs",process_run_cleanup:"agent_jobs",cron_suggest_instructions:"agent_jobs",cron_refresh_skills:"agent_jobs",cron_refresh_pricing:"agent_jobs",cron_eval_autorun:"agent_jobs",cron_auto_accept_suggestions:"agent_jobs",cron_instruction_training:"agent_jobs",cron_instruction_evolution:"agent_jobs",process_judge_review:"agent_jobs"},wq=["session_send_jobs","launch_jobs","eval_jobs","insights_jobs","agent_jobs"];async function vq(e,t,n,r){if(n.length===0)return null;let o=pa.join(n.map(i=>pa`${i}`),pa`, `),s=await u.execute(pa`
1295
- UPDATE ${pa.raw(e)} AS m
1216
+ `),r=await w$(),o=[],s=[],i=0;for(let c of n){let a=c.model,l=No(a),m=r.get(`${l}::${a}`);if(!m){o.push({provider:l,modelId:a,events:c.events,lastSeen:String(c.last_seen)});continue}let p=y$(m.verifiedAt??m.effectiveFrom);p===null||p>mS?s.push({provider:l,modelId:a,events:c.events,verifiedAt:m.verifiedAt?String(m.verifiedAt):null,ageDays:p===null?null:Math.round(p),currentInput:hu(m.inputPerM),currentOutput:hu(m.outputPerM)}):i+=1}return e.json({staleDays:mS,capturedModels:n.length,pricedFresh:i,unpriced:o,stale:s})});var v$=nr.object({provider:nr.string().min(1).optional(),modelId:nr.string().min(1),inputPerM:nr.number(),outputPerM:nr.number(),cacheReadPerM:nr.number().optional(),cacheWrite5mPerM:nr.number().optional(),cacheWrite1hPerM:nr.number().optional(),contextWindow:nr.number().int().positive().nullable().optional(),sourceUrl:nr.string().url(),effectiveFrom:nr.string().datetime().optional()});_u.post("/pricing/rates",async e=>{if(!e.get("userId"))return e.json({error:"unauthorized"},401);let n=v$.safeParse(await e.req.json().catch(()=>null));if(!n.success)return e.json({status:"rejected",reason:"invalid body",detail:n.error.flatten()},400);let r=n.data,o=r.provider??No(r.modelId),s=u((h,f)=>h>_$&&h<=f,"inRange");if(!s(r.inputPerM,Oh)||!s(r.outputPerM,Oh))return e.json({status:"rejected",reason:`input/output out of range (0, ${Oh}]`},422);let i=r.cacheReadPerM??0,c=r.cacheWrite5mPerM??0,a=r.cacheWrite1hPerM??0;for(let[h,f]of[["cacheReadPerM",i],["cacheWrite5mPerM",c],["cacheWrite1hPerM",a]])if(f<0||f>pS)return e.json({status:"rejected",reason:`${h} out of range [0, ${pS}]`},422);let m=(await d.select().from(Qe).where(lS(gu(Qe.provider,o),gu(Qe.modelId,r.modelId))).orderBy(fS(Qe.effectiveFrom)).limit(1))[0],p=1e-9;if(m){let h=hu(m.inputPerM),f=hu(m.outputPerM),w=u((A,E)=>E<=0?1/0:A/E,"ratio"),b=Math.max(w(r.inputPerM,h),w(h,r.inputPerM)),v=Math.max(w(r.outputPerM,f),w(f,r.outputPerM));if(b>Ch||v>Ch)return e.json({status:"flagged",reason:`new rate differs from current by more than ${Ch}x \u2014 needs human review`,current:{inputPerM:h,outputPerM:f},proposed:{inputPerM:r.inputPerM,outputPerM:r.outputPerM},sourceUrl:r.sourceUrl});if(Math.abs(h-r.inputPerM)<p&&Math.abs(f-r.outputPerM)<p&&Math.abs(hu(m.cacheReadPerM)-i)<p)return await d.update(Qe).set({verifiedAt:new Date}).where(lS(gu(Qe.provider,o),gu(Qe.modelId,r.modelId),gu(Qe.effectiveFrom,m.effectiveFrom))),e.json({status:"unchanged",modelId:r.modelId})}let _=r.effectiveFrom?new Date(r.effectiveFrom):new Date,I=new Date().toISOString().slice(0,10);return await d.insert(Qe).values({provider:o,modelId:r.modelId,inputPerM:String(r.inputPerM),outputPerM:String(r.outputPerM),cacheReadPerM:String(i),cacheWrite5mPerM:String(c),cacheWrite1hPerM:String(a),contextWindow:r.contextWindow??null,effectiveFrom:_,verifiedAt:new Date,source:`auto-refresh-${I}`}).onConflictDoNothing(),e.json({status:"written",modelId:r.modelId,provider:o,effectiveFrom:_.toISOString()})});C();import{Hono as I$}from"hono";import{desc as b$,eq as S$}from"drizzle-orm";var gm=new I$;gm.get("/alerts/recent",async e=>{let t=e.get("userId"),n=await d.select().from(yn).where(S$(yn.userId,t)).orderBy(b$(yn.lastDispatchedAt)).limit(20);return e.json({items:n})});C();import{Hono as A$}from"hono";import{randomUUID as E$}from"node:crypto";import{sql as la}from"drizzle-orm";var hm=new A$,_S=300,gS=3e4,x$=6e4,T$=1e3,Lh={process_send_message:"session_send_jobs",process_launch:"launch_jobs",process_eval:"eval_jobs",process_conversation:"eval_jobs",process_insights:"insights_jobs",process_session_goal:"agent_jobs",distill_memories:"agent_jobs",memory_ab:"agent_jobs",process_run_cleanup:"agent_jobs",cron_suggest_instructions:"agent_jobs",cron_refresh_skills:"agent_jobs",cron_refresh_pricing:"agent_jobs",cron_eval_autorun:"agent_jobs",cron_auto_accept_suggestions:"agent_jobs",cron_instruction_training:"agent_jobs",cron_instruction_evolution:"agent_jobs",process_judge_review:"agent_jobs"},R$=["session_send_jobs","launch_jobs","eval_jobs","insights_jobs","agent_jobs"];async function k$(e,t,n,r){if(n.length===0)return null;let o=la.join(n.map(i=>la`${i}`),la`, `),s=await d.execute(la`
1217
+ UPDATE ${la.raw(e)} AS m
1296
1218
  SET status = 'claimed',
1297
1219
  claimed_by = ${r},
1298
1220
  claimed_at = now(),
1299
- lease_expires_at = now() + (${kA}::int * interval '1 second'),
1221
+ lease_expires_at = now() + (${_S}::int * interval '1 second'),
1300
1222
  attempts = m.attempts + 1,
1301
1223
  updated_at = now()
1302
1224
  FROM (
1303
1225
  SELECT id
1304
- FROM ${pa.raw(e)}
1226
+ FROM ${la.raw(e)}
1305
1227
  WHERE user_id = ${t}
1306
1228
  AND status = 'pending'
1307
1229
  AND task_kind IN (${o})
@@ -1312,7 +1234,7 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
1312
1234
  ) AS picked
1313
1235
  WHERE m.id = picked.id
1314
1236
  RETURNING m.id, m.task_kind, m.payload, m.attempts
1315
- `);return s.length>0?s[0]:null}d(vq,"claimOne");async function Iq(e,t,n){let r={};for(let o of t){let s=qh[o];s&&(r[s]??=[]).push(o)}for(let o of wq){let s=r[o];if(!s)continue;let i=await vq(o,e,s,n);if(i)return{job:i,table:o}}return null}d(Iq,"tryClaimAcrossTables");var bq={cron_suggest_instructions:[0,7,37]};function Sq(e){let t=/rulemetric-cli\/(\d+)\.(\d+)\.(\d+)/.exec(e??"");return t?[Number(t[1]),Number(t[2]),Number(t[3])]:null}d(Sq,"parseCliVersion");function Aq(e,t){return e[0]!==t[0]?e[0]>t[0]:e[1]!==t[1]?e[1]>t[1]:e[2]>=t[2]}d(Aq,"versionAtLeast");function Eq(e,t){let n=Sq(t),r=[],o=[];for(let s of e){let i=bq[s];i&&(!n||!Aq(n,i))?o.push(s):r.push(s)}return{allowed:r,fenced:o}}d(Eq,"fenceCapabilities");var RA=new Set;_p.get("/work/next",async e=>{let t=e.get("userId"),r=(e.req.query("capabilities")??"").split(",").map(p=>p.trim()).filter(p=>p.length>0&&p in qh),{allowed:o,fenced:s}=Eq(r,e.req.header("user-agent"));if(s.length>0&&!RA.has(t)&&(RA.add(t),console.warn(`[work] version fence: user=${t} ua=${e.req.header("user-agent")??"none"} withheld kinds: ${s.join(", ")} \u2014 worker below minimum CLI version; jobs stay pending until upgrade`)),r.length===0)return e.json({error:"capabilities must list one or more of: "+Object.keys(qh).join(", ")},400);if(o.length===0)return e.body(null,204);let i=Number.parseInt(e.req.query("waitMs")??`${TA}`,10),a=Number.isFinite(i)?Math.max(0,Math.min(i,_q)):TA,c=hq(),l=Date.now()+a;for(;;){let p=await Iq(t,o,c);if(p)return e.json({id:p.job.id,kind:p.job.task_kind,payload:p.job.payload,attempts:p.job.attempts,leaseToken:c,leaseDurationSeconds:kA,table:p.table});if(Date.now()>=l)break;await new Promise(m=>setTimeout(m,yq))}return e.body(null,204)});O();import{Hono as Rq}from"hono";import{z as _d}from"zod";import{sql as Xr}from"drizzle-orm";O();import{eq as xr,and as Uh}from"drizzle-orm";var xq=d(e=>`${(e*100).toFixed(1)}pp`,"pct"),Tq=d(e=>`${(e/6e4).toFixed(0)} min`,"mins");function jA(e){let{targetName:t,evalTargetId:n,status:r,result:o,error:s}=e,i=t.split("/").pop()||t,a=`/eval-targets/${n}`;if(r==="failed")return{type:"evolution_failed",title:`Evolution cycle crashed \u2014 ${i}`,body:s?.slice(0,400)||"The job failed without recording a reason.",url:a,metadata:{evalTargetId:n,outcome:"crashed"}};if(!o)return null;if(o.skipped==="infrastructure-incomplete"||o.skipped==="quota-exhausted"){let m=o.cost?.modelCalls;return{type:"evolution_blocked",title:`Evolution stopped by the environment \u2014 ${i}`,body:`${o.reason??o.skipped}`+(m?` (${m} model call(s) spent before stopping)`:"")+" This is not a verdict about the instruction.",url:a,metadata:{evalTargetId:n,outcome:o.skipped,reason:o.reason,cost:o.cost}}}if(o.skipped||!o.decision)return null;let c=o.nPairs??o.cost?.usablePairs,l=[];if(c!=null){let m=o.cost?.plannedPairs;l.push(`${c}${m?`/${m}`:""} paired task(s)`)}typeof o.cost?.mde=="number"&&l.push(`resolves \xB1${xq(o.cost.mde)}`),o.cost?.modelCalls&&l.push(`${o.cost.modelCalls} model calls`),o.cost?.wallMs&&l.push(Tq(o.cost.wallMs));let p=o.applied?"APPLIED \u2014 the instruction was rewritten":"recorded only \u2014 nothing was changed";return{type:"evolution_decided",title:`Evolution: ${o.decision} \u2014 ${i}`,body:`${p}. ${l.join(", ")}.`,url:a,metadata:{evalTargetId:n,outcome:o.decision,applied:o.applied===!0,nPairs:c??null,promotionId:o.promotionId??null,cost:o.cost??null}}}d(jA,"buildEvolutionNotification");async function NA(e,t,n,r){try{let[o]=await u.select({evalTargetId:ke.evalTargetId,config:ke.config}).from(ke).where(Uh(xr(ke.id,t),xr(ke.userId,e)));if(!o||o.config?.type==="conversation")return;let[s]=await u.select({name:k.name}).from(k).where(xr(k.id,o.evalTargetId)),i=s?.name??"eval target";n==="failed"?await tn({userId:e,type:"eval_failed",title:"Eval run failed",body:`${i}: ${String(r??"").slice(0,200)}`,url:`/eval-targets/${o.evalTargetId}`,sourceTable:"eval_jobs",sourceId:t}):(await tn({userId:e,type:"eval_completed",title:"Eval run complete",body:`${i} finished`,url:`/eval-targets/${o.evalTargetId}`,sourceTable:"eval_jobs",sourceId:t}),await Bc(e,o.evalTargetId))}catch(o){console.error("[job-notifications] eval notify failed:",o instanceof Error?o.stack:o)}}d(NA,"notifyEvalTerminal");async function PA(e,t,n,r){try{let[o]=await u.select({projectPath:W.projectPath}).from(W).where(Uh(xr(W.id,t),xr(W.userId,e)));if(!o)return;let s=null,i;if(o.projectPath){let[p]=await u.select({id:U.id,name:U.name}).from(le).innerJoin(U,xr(U.id,le.projectId)).where(xr(le.path,o.projectPath)).limit(1);p?(s=p.id,i=p.name):i=`${o.projectPath.split("/").pop()||"Unknown"} (unregistered)`}else i="All Projects";let a=new Date().toISOString().slice(0,10),c=`${s??"unmatched"}-${a}`,l=o.projectPath?`/insights/computed?projectPath=${encodeURIComponent(o.projectPath)}&tab=recommendations`:"/insights";n==="failed"?await tn({userId:e,type:"insights_failed",title:"Insights generation failed",body:`${i}: ${String(r??"").slice(0,200)}`,url:l,sourceTable:"insights_jobs",sourceId:c}):await tn({userId:e,type:"insights_ready",title:`Insights ready: ${i}`,body:"New recommendations are available",url:l,sourceTable:"insights_jobs",sourceId:c})}catch(o){console.error("[job-notifications] insights notify failed:",o instanceof Error?o.stack:o)}}d(PA,"notifyInsightsTerminal");async function CA(e,t,n,r){try{let[o]=await u.select({payload:je.payload,result:je.result}).from(je).where(Uh(xr(je.id,t),xr(je.userId,e)));if(!o)return;let s=o.payload?.evalTargetId;if(!s)return;let[i]=await u.select({name:k.name}).from(k).where(xr(k.id,s)),a=jA({targetName:i?.name??"instruction",evalTargetId:s,status:n,result:o.result,error:r});if(!a)return;await tn({userId:e,type:a.type,title:a.title,body:a.body,url:a.url,sourceTable:"agent_jobs",sourceId:t,metadata:a.metadata})}catch(o){console.error("[job-notifications] evolution notify failed:",o instanceof Error?o.stack:o)}}d(CA,"notifyEvolutionTerminal");async function DA(e,t,n,r,o){e==="process_eval"?await NA(t,n,r,o):e==="process_insights"?await PA(t,n,r,o):e==="cron_instruction_evolution"&&await CA(t,n,r,o)}d(DA,"notifyTerminal");var ma=new Rq,OA=300,Hh={process_eval:3,process_insights:3,process_launch:3,process_send_message:1,process_conversation:1,process_session_goal:1,distill_memories:1,memory_ab:1,process_run_cleanup:1,cron_suggest_instructions:1,cron_refresh_skills:1,cron_refresh_pricing:1,cron_eval_autorun:1,cron_auto_accept_suggestions:1,cron_instruction_training:1,process_judge_review:1,cron_instruction_evolution:1},kq=["session_send_jobs","launch_jobs","eval_jobs","insights_jobs","agent_jobs"];async function Bh(e,t,n){for(let r of kq){let o=await u.execute(Xr`
1237
+ `);return s.length>0?s[0]:null}u(k$,"claimOne");async function N$(e,t,n){let r={};for(let o of t){let s=Lh[o];s&&(r[s]??=[]).push(o)}for(let o of R$){let s=r[o];if(!s)continue;let i=await k$(o,e,s,n);if(i)return{job:i,table:o}}return null}u(N$,"tryClaimAcrossTables");var j$={cron_suggest_instructions:[0,7,37]};function P$(e){let t=/rulemetric-cli\/(\d+)\.(\d+)\.(\d+)/.exec(e??"");return t?[Number(t[1]),Number(t[2]),Number(t[3])]:null}u(P$,"parseCliVersion");function D$(e,t){return e[0]!==t[0]?e[0]>t[0]:e[1]!==t[1]?e[1]>t[1]:e[2]>=t[2]}u(D$,"versionAtLeast");function O$(e,t){let n=P$(t),r=[],o=[];for(let s of e){let i=j$[s];i&&(!n||!D$(n,i))?o.push(s):r.push(s)}return{allowed:r,fenced:o}}u(O$,"fenceCapabilities");var hS=new Set;hm.get("/work/next",async e=>{let t=e.get("userId"),r=(e.req.query("capabilities")??"").split(",").map(m=>m.trim()).filter(m=>m.length>0&&m in Lh),{allowed:o,fenced:s}=O$(r,e.req.header("user-agent"));if(s.length>0&&!hS.has(t)&&(hS.add(t),console.warn(`[work] version fence: user=${t} ua=${e.req.header("user-agent")??"none"} withheld kinds: ${s.join(", ")} \u2014 worker below minimum CLI version; jobs stay pending until upgrade`)),r.length===0)return e.json({error:"capabilities must list one or more of: "+Object.keys(Lh).join(", ")},400);if(o.length===0)return e.body(null,204);let i=Number.parseInt(e.req.query("waitMs")??`${gS}`,10),c=Number.isFinite(i)?Math.max(0,Math.min(i,x$)):gS,a=E$(),l=Date.now()+c;for(;;){let m=await N$(t,o,a);if(m)return e.json({id:m.job.id,kind:m.job.task_kind,payload:m.job.payload,attempts:m.job.attempts,leaseToken:a,leaseDurationSeconds:_S,table:m.table});if(Date.now()>=l)break;await new Promise(p=>setTimeout(p,T$))}return e.body(null,204)});C();import{Hono as M$}from"hono";import{z as yu}from"zod";import{sql as Xr}from"drizzle-orm";C();import{eq as xr,and as Mh}from"drizzle-orm";var C$=u(e=>`${(e*100).toFixed(1)}pp`,"pct"),L$=u(e=>`${(e/6e4).toFixed(0)} min`,"mins");function yS(e){let{targetName:t,evalTargetId:n,status:r,result:o,error:s}=e,i=t.split("/").pop()||t,c=`/eval-targets/${n}`;if(r==="failed")return{type:"evolution_failed",title:`Evolution cycle crashed \u2014 ${i}`,body:s?.slice(0,400)||"The job failed without recording a reason.",url:c,metadata:{evalTargetId:n,outcome:"crashed"}};if(!o)return null;if(o.skipped==="infrastructure-incomplete"||o.skipped==="quota-exhausted"){let p=o.cost?.modelCalls;return{type:"evolution_blocked",title:`Evolution stopped by the environment \u2014 ${i}`,body:`${o.reason??o.skipped}`+(p?` (${p} model call(s) spent before stopping)`:"")+" This is not a verdict about the instruction.",url:c,metadata:{evalTargetId:n,outcome:o.skipped,reason:o.reason,cost:o.cost}}}if(o.skipped||!o.decision)return null;let a=o.nPairs??o.cost?.usablePairs,l=[];if(a!=null){let p=o.cost?.plannedPairs;l.push(`${a}${p?`/${p}`:""} paired task(s)`)}typeof o.cost?.mde=="number"&&l.push(`resolves \xB1${C$(o.cost.mde)}`),o.cost?.modelCalls&&l.push(`${o.cost.modelCalls} model calls`),o.cost?.wallMs&&l.push(L$(o.cost.wallMs));let m=o.applied?"APPLIED \u2014 the instruction was rewritten":"recorded only \u2014 nothing was changed";return{type:"evolution_decided",title:`Evolution: ${o.decision} \u2014 ${i}`,body:`${m}. ${l.join(", ")}.`,url:c,metadata:{evalTargetId:n,outcome:o.decision,applied:o.applied===!0,nPairs:a??null,promotionId:o.promotionId??null,cost:o.cost??null}}}u(yS,"buildEvolutionNotification");async function wS(e,t,n,r){try{let[o]=await d.select({evalTargetId:Re.evalTargetId,config:Re.config}).from(Re).where(Mh(xr(Re.id,t),xr(Re.userId,e)));if(!o||o.config?.type==="conversation")return;let[s]=await d.select({name:k.name}).from(k).where(xr(k.id,o.evalTargetId)),i=s?.name??"eval target";n==="failed"?await en({userId:e,type:"eval_failed",title:"Eval run failed",body:`${i}: ${String(r??"").slice(0,200)}`,url:`/eval-targets/${o.evalTargetId}`,sourceTable:"eval_jobs",sourceId:t}):(await en({userId:e,type:"eval_completed",title:"Eval run complete",body:`${i} finished`,url:`/eval-targets/${o.evalTargetId}`,sourceTable:"eval_jobs",sourceId:t}),await Fc(e,o.evalTargetId))}catch(o){console.error("[job-notifications] eval notify failed:",o instanceof Error?o.stack:o)}}u(wS,"notifyEvalTerminal");async function vS(e,t,n,r){try{let[o]=await d.select({projectPath:W.projectPath}).from(W).where(Mh(xr(W.id,t),xr(W.userId,e)));if(!o)return;let s=null,i;if(o.projectPath){let[m]=await d.select({id:M.id,name:M.name}).from(de).innerJoin(M,xr(M.id,de.projectId)).where(xr(de.path,o.projectPath)).limit(1);m?(s=m.id,i=m.name):i=`${o.projectPath.split("/").pop()||"Unknown"} (unregistered)`}else i="All Projects";let c=new Date().toISOString().slice(0,10),a=`${s??"unmatched"}-${c}`,l=o.projectPath?`/insights/computed?projectPath=${encodeURIComponent(o.projectPath)}&tab=recommendations`:"/insights";n==="failed"?await en({userId:e,type:"insights_failed",title:"Insights generation failed",body:`${i}: ${String(r??"").slice(0,200)}`,url:l,sourceTable:"insights_jobs",sourceId:a}):await en({userId:e,type:"insights_ready",title:`Insights ready: ${i}`,body:"New recommendations are available",url:l,sourceTable:"insights_jobs",sourceId:a})}catch(o){console.error("[job-notifications] insights notify failed:",o instanceof Error?o.stack:o)}}u(vS,"notifyInsightsTerminal");async function IS(e,t,n,r){try{let[o]=await d.select({payload:ke.payload,result:ke.result}).from(ke).where(Mh(xr(ke.id,t),xr(ke.userId,e)));if(!o)return;let s=o.payload?.evalTargetId;if(!s)return;let[i]=await d.select({name:k.name}).from(k).where(xr(k.id,s)),c=yS({targetName:i?.name??"instruction",evalTargetId:s,status:n,result:o.result,error:r});if(!c)return;await en({userId:e,type:c.type,title:c.title,body:c.body,url:c.url,sourceTable:"agent_jobs",sourceId:t,metadata:c.metadata})}catch(o){console.error("[job-notifications] evolution notify failed:",o instanceof Error?o.stack:o)}}u(IS,"notifyEvolutionTerminal");async function SS(e,t,n,r,o){e==="process_eval"?await wS(t,n,r,o):e==="process_insights"?await vS(t,n,r,o):e==="cron_instruction_evolution"&&await IS(t,n,r,o)}u(SS,"notifyTerminal");var ma=new M$,bS=300,$h={process_eval:3,process_insights:3,process_launch:3,process_send_message:1,process_conversation:1,process_session_goal:1,distill_memories:1,memory_ab:1,process_run_cleanup:1,cron_suggest_instructions:1,cron_refresh_skills:1,cron_refresh_pricing:1,cron_eval_autorun:1,cron_auto_accept_suggestions:1,cron_instruction_training:1,process_judge_review:1,cron_instruction_evolution:1},$$=["session_send_jobs","launch_jobs","eval_jobs","insights_jobs","agent_jobs"];async function qh(e,t,n){for(let r of $$){let o=await d.execute(Xr`
1316
1238
  SELECT status, attempts, task_kind
1317
1239
  FROM ${Xr.raw(r)}
1318
1240
  WHERE id = ${e}
@@ -1320,17 +1242,17 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
1320
1242
  AND claimed_by = ${n}
1321
1243
  AND status IN ('claimed', 'running')
1322
1244
  LIMIT 1
1323
- `);if(o.length>0)return{table:r,status:o[0].status,attempts:o[0].attempts,taskKind:o[0].task_kind}}return null}d(Bh,"locateRow");var jq=_d.object({result:_d.unknown().optional()}),Nq=_d.object({error:_d.string().min(1).max(8192),terminal:_d.boolean().optional().default(!1)});ma.post("/work/:id/heartbeat",async e=>{let t=e.get("userId"),n=e.req.param("id"),o=(await e.req.json().catch(()=>({}))).leaseToken;if(!o)return e.json({error:"leaseToken required"},400);let s=await Bh(n,t,o);return s?(await u.execute(Xr`
1245
+ `);if(o.length>0)return{table:r,status:o[0].status,attempts:o[0].attempts,taskKind:o[0].task_kind}}return null}u(qh,"locateRow");var q$=yu.object({result:yu.unknown().optional()}),U$=yu.object({error:yu.string().min(1).max(8192),terminal:yu.boolean().optional().default(!1)});ma.post("/work/:id/heartbeat",async e=>{let t=e.get("userId"),n=e.req.param("id"),o=(await e.req.json().catch(()=>({}))).leaseToken;if(!o)return e.json({error:"leaseToken required"},400);let s=await qh(n,t,o);return s?(await d.execute(Xr`
1324
1246
  UPDATE ${Xr.raw(s.table)}
1325
- SET lease_expires_at = now() + (${OA}::int * interval '1 second'),
1247
+ SET lease_expires_at = now() + (${bS}::int * interval '1 second'),
1326
1248
  updated_at = now()
1327
1249
  WHERE id = ${n}
1328
1250
  AND claimed_by = ${o}
1329
1251
  AND status IN ('claimed', 'running')
1330
- `),e.json({ok:!0,leaseDurationSeconds:OA})):e.json({error:"job not found or lease lost"},404)});ma.post("/work/:id/complete",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json().catch(()=>({})),o=r.leaseToken;if(!o)return e.json({error:"leaseToken required"},400);let s=jq.safeParse(r);if(!s.success)return e.json({error:s.error.format()},400);let i=await Bh(n,t,o);if(!i)return e.json({error:"job not found or lease lost"},404);let a=JSON.stringify(s.data.result??null);return await u.execute(Xr`
1252
+ `),e.json({ok:!0,leaseDurationSeconds:bS})):e.json({error:"job not found or lease lost"},404)});ma.post("/work/:id/complete",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json().catch(()=>({})),o=r.leaseToken;if(!o)return e.json({error:"leaseToken required"},400);let s=q$.safeParse(r);if(!s.success)return e.json({error:s.error.format()},400);let i=await qh(n,t,o);if(!i)return e.json({error:"job not found or lease lost"},404);let c=JSON.stringify(s.data.result??null);return await d.execute(Xr`
1331
1253
  UPDATE ${Xr.raw(i.table)}
1332
1254
  SET status = 'completed',
1333
- result = ${a}::jsonb,
1255
+ result = ${c}::jsonb,
1334
1256
  error = NULL,
1335
1257
  completed_at = now(),
1336
1258
  updated_at = now(),
@@ -1339,24 +1261,24 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
1339
1261
  WHERE id = ${n}
1340
1262
  AND claimed_by = ${o}
1341
1263
  AND status IN ('claimed', 'running')
1342
- `),await DA(i.taskKind,t,n,"completed"),e.json({ok:!0})});ma.post("/work/:id/fail",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json().catch(()=>({})),o=r.leaseToken;if(!o)return e.json({error:"leaseToken required"},400);let s=Nq.safeParse(r);if(!s.success)return e.json({error:s.error.format()},400);let i=await Bh(n,t,o);if(!i)return e.json({error:"job not found or lease lost"},404);let a=Hh[i.taskKind]??3,c=s.data.terminal||i.attempts>=a,l=c?"failed":"pending";return await u.execute(Xr`
1264
+ `),await SS(i.taskKind,t,n,"completed"),e.json({ok:!0})});ma.post("/work/:id/fail",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json().catch(()=>({})),o=r.leaseToken;if(!o)return e.json({error:"leaseToken required"},400);let s=U$.safeParse(r);if(!s.success)return e.json({error:s.error.format()},400);let i=await qh(n,t,o);if(!i)return e.json({error:"job not found or lease lost"},404);let c=$h[i.taskKind]??3,a=s.data.terminal||i.attempts>=c,l=a?"failed":"pending";return await d.execute(Xr`
1343
1265
  UPDATE ${Xr.raw(i.table)}
1344
1266
  SET status = ${l},
1345
1267
  error = ${s.data.error},
1346
1268
  updated_at = now(),
1347
- ${Xr.raw(c?"completed_at = now(),":"")}
1269
+ ${Xr.raw(a?"completed_at = now(),":"")}
1348
1270
  claimed_by = NULL,
1349
1271
  claimed_at = NULL,
1350
1272
  lease_expires_at = NULL
1351
1273
  WHERE id = ${n}
1352
1274
  AND claimed_by = ${o}
1353
1275
  AND status IN ('claimed', 'running')
1354
- `),c&&await DA(i.taskKind,t,n,"failed",s.data.error),e.json({ok:!0,requeued:!c,attempts:i.attempts})});O();import{Hono as Uq}from"hono";import{z as zo}from"zod";import{and as HA,desc as Hq,eq as Qr,isNotNull as Bq,sql as BA}from"drizzle-orm";O();import{and as Pq,asc as Cq,eq as Tr,gt as Oq,isNotNull as Dq,sql as Mq}from"drizzle-orm";var MA=100,LA=10,yp=new Set;function $A(e){return yp.has(e)}d($A,"isAnnouncementSendInFlight");async function qA(e,t={}){let n=t.db??u,r=t.sendEmail??rp,o=t.log??(i=>process.stderr.write(`[announcement-sender] ${i}
1355
- `)),s=t.webBaseUrl??process.env.RULEMETRIC_WEB_URL??process.env.WEB_URL??"https://rulemetric.com";if(yp.has(e))throw new Error(`Announcement ${e} send already in flight`);yp.add(e);try{return await Lq({announcementId:e,db:n,sendEmail:r,log:o,webBaseUrl:s})}finally{yp.delete(e)}}d(qA,"sendAnnouncement");async function Lq(e){let{announcementId:t,db:n,sendEmail:r,log:o,webBaseUrl:s}=e,[i]=await n.select().from(De).where(Tr(De.id,t)).limit(1);if(!i)throw new Error(`Announcement ${t} not found`);if(i.status!=="queued"&&i.status!=="sending")throw new Error(`Announcement ${t} is in status='${i.status}'; expected 'queued' or 'sending'.`);await n.update(De).set({status:"sending",updatedAt:new Date}).where(Tr(De.id,t)),o(`Sending announcement ${t} (${i.subject??""})`);let a=0,c=0,l=0,p=0,m=null;try{for(;;){let I=await n.select({userId:At.userId,email:T.email,displayName:T.displayName,unsubscribeToken:At.unsubscribeToken}).from(At).innerJoin(T,Tr(T.id,At.userId)).where(Pq(Tr(At.productAnnouncements,!0),Dq(T.email),m?Oq(At.userId,m):void 0)).orderBy(Cq(At.userId)).limit(MA);if(I.length===0)break;m=I[I.length-1].userId;for(let S=0;S<I.length;S+=LA){let A=I.slice(S,S+LA),E=await Promise.allSettled(A.map(R=>qq({recipient:R,announcement:i,webBaseUrl:s,sendEmail:r,db:n})));for(let R=0;R<E.length;R++){let D=E[R];if(D.status==="fulfilled")D.value.ok==="sent"?a++:D.value.ok==="skipped"?l++:(c++,D.value.provider==="noop"&&p++,o(` recipient ${A[R].userId}: send failed \u2014 ${D.value.error}`));else{c++;let j=D.reason instanceof Error?D.reason.message:String(D.reason);o(` recipient ${A[R].userId}: send failed \u2014 ${j}`)}}}if(I.length<MA)break}p>0&&o(`WARNING: ${p} recipient(s) hit the noop email provider and were recorded as FAILED \u2014 no email provider is configured on this API instance (set RESEND_API_KEY)`);let y=await n.select({status:St.status,count:Mq`count(*)::int`}).from(St).where(Tr(St.announcementId,t)).groupBy(St.status),v={};for(let I of y)v[I.status]=I.count;let h=v.sent??0,f=v.failed??0,w=h===0&&f>0?"failed":"sent",b=f>0?`${f} of ${h+f} recipient(s) failed; see announcement_deliveries`:null;return await n.update(De).set({status:w,recipientCount:h,...w==="sent"?{sentAt:new Date}:{},error:b,updatedAt:new Date}).where(Tr(De.id,t)),o(`Done: status=${w} sent=${h} failed=${f} (this attempt: sent=${a} failed=${c} skipped=${l})`),{sent:a,failed:c,skipped:l}}catch(y){let v=y instanceof Error?y.message:String(y);throw await n.update(De).set({status:"failed",error:v.slice(0,1e3),updatedAt:new Date}).where(Tr(De.id,t)).catch(()=>{}),y}}d(Lq,"runSend");function $q(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}d($q,"escapeHtml");async function qq(e){let{recipient:t,announcement:n,webBaseUrl:r,sendEmail:o,db:s}=e;if(!t.email)return{ok:"skipped",reason:"no-email"};let i=await s.insert(St).values({announcementId:n.id,userId:t.userId,email:t.email,status:"pending"}).onConflictDoNothing({target:[St.announcementId,St.userId]}).returning({id:St.id});if(i.length===0)return{ok:"skipped",reason:"already-claimed"};let a=i[0].id,c=r.replace(/\/$/,""),l=encodeURIComponent(t.unsubscribeToken),p=`${c}/unsubscribe/${l}`,m=t.displayName?.trim().split(/\s+/)[0]||"there",y=n.htmlBody.replaceAll("{{unsubscribe_url}}",p).replaceAll("{{recipient_name}}",$q(m)),v=n.textBody.replaceAll("{{unsubscribe_url}}",p).replaceAll("{{recipient_name}}",m);try{let h=await o({to:t.email,subject:n.subject,html:y,text:v,fromName:"RuleMetric",idempotencyKey:a,headers:{"List-Unsubscribe":`<${c}/api/unsubscribe/${l}>`,"List-Unsubscribe-Post":"List-Unsubscribe=One-Click"}});if(h.provider==="noop"){let f="no email provider configured (RESEND_API_KEY unset on the API)";return await s.update(St).set({status:"failed",error:f}).where(Tr(St.id,a)),{ok:"failed",error:f,provider:h.provider}}return await s.update(St).set({status:"sent",providerId:h.id,sentAt:new Date}).where(Tr(St.id,a)),{ok:"sent",providerId:h.id,provider:h.provider}}catch(h){let f=h instanceof Error?h.message:String(h);return await s.update(St).set({status:"failed",error:f.slice(0,1e3)}).where(Tr(St.id,a)).catch(()=>{}),{ok:"failed",error:f}}}d(qq,"sendOne");var Rr=new Uq;Rr.use("/announcements/*",ad());Rr.use("/announcements",ad());Rr.get("/announcements",async e=>{let t=await u.select({id:De.id,version:De.version,releaseDate:De.releaseDate,subject:De.subject,status:De.status,recipientCount:De.recipientCount,sentAt:De.sentAt,sentBy:De.sentBy,error:De.error,createdAt:De.createdAt,updatedAt:De.updatedAt}).from(De).orderBy(Hq(De.createdAt));return e.json({announcements:t})});Rr.get("/announcements/:id",async e=>{let t=e.req.param("id");if(!zo.string().uuid().safeParse(t).success)return e.json({error:"Invalid id",code:"VALIDATION_ERROR"},400);let[n]=await u.select().from(De).where(Qr(De.id,t));if(!n)return e.json({error:"Announcement not found",code:"NOT_FOUND"},404);let r=await u.select({status:St.status,count:BA`count(*)::int`}).from(St).where(Qr(St.announcementId,t)).groupBy(St.status),o={};for(let s of r)o[s.status]=s.count;return e.json({...n,deliveryCounts:o})});Rr.get("/announcements/:id/recipients/count",async e=>{let t=e.req.param("id");if(!zo.string().uuid().safeParse(t).success)return e.json({error:"Invalid id",code:"VALIDATION_ERROR"},400);let n=await Fq();return e.json({count:n})});async function Fq(){let[e]=await u.select({count:BA`count(*)::int`}).from(At).innerJoin(T,Qr(T.id,At.userId)).where(HA(Qr(At.productAnnouncements,!0),Bq(T.email)));return e?.count??0}d(Fq,"countOptedInRecipients");var UA=d(e=>e.includes("{{unsubscribe_url}}"),"hasUnsubscribePlaceholder"),Wq=zo.object({subject:zo.string().min(1).max(500).optional(),htmlBody:zo.string().min(1).refine(UA,{message:"htmlBody must contain the {{unsubscribe_url}} placeholder"}).optional(),textBody:zo.string().min(1).refine(UA,{message:"textBody must contain the {{unsubscribe_url}} placeholder"}).optional()});Rr.patch("/announcements/:id",async e=>{let t=e.req.param("id");if(!zo.string().uuid().safeParse(t).success)return e.json({error:"Invalid id",code:"VALIDATION_ERROR"},400);let n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON",code:"VALIDATION_ERROR"},400)}let r=Wq.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let o=r.data;if(Object.keys(o).length===0)return e.json({error:"No fields to update",code:"VALIDATION_ERROR"},400);let[s]=await u.select().from(De).where(Qr(De.id,t));if(!s)return e.json({error:"Announcement not found",code:"NOT_FOUND"},404);if(s.status!=="draft")return e.json({error:"Can only edit draft announcements",code:"INVALID_STATE",status:s.status},409);let[i]=await u.update(De).set({...o.subject!==void 0?{subject:o.subject}:{},...o.htmlBody!==void 0?{htmlBody:o.htmlBody}:{},...o.textBody!==void 0?{textBody:o.textBody}:{},updatedAt:new Date}).where(Qr(De.id,t)).returning();return e.json(i)});Rr.post("/announcements/:id/send",async e=>{let t=e.get("userId");if(!t)return e.json({error:"Unauthenticated",code:"UNAUTHENTICATED"},401);let n=e.req.param("id");if(!zo.string().uuid().safeParse(n).success)return e.json({error:"Invalid id",code:"VALIDATION_ERROR"},400);let r=await u.update(De).set({status:"queued",sentBy:t,updatedAt:new Date}).where(HA(Qr(De.id,n),Qr(De.status,"draft"))).returning(),o=r[0],s=!1;if(r.length===0){let[i]=await u.select().from(De).where(Qr(De.id,n));if(!i)return e.json({error:"Announcement not found",code:"NOT_FOUND"},404);if(!((i.status==="queued"||i.status==="sending")&&!$A(n)))return e.json({error:`Cannot send from status='${i.status}' (must be 'draft', or a stalled 'queued'/'sending' to resume)`,code:"INVALID_STATE",status:i.status},409);o=i,s=!0}return qA(n).catch(i=>{process.stderr.write(`[announcements] send loop for ${n} failed: ${i instanceof Error?i.message:String(i)}
1356
- `)}),e.json({processing:!0,resumed:s,announcement:o},202)});O();import{Hono as zq}from"hono";import{inArray as WA,sql as FA}from"drizzle-orm";var yd=new zq;function zA(e){let t;try{t=decodeURIComponent(e)}catch{return[]}let n=t.replace(/=+$/,"").replaceAll("+","-").replaceAll("/","_");return t===n?[t]:[t,n]}d(zA,"tokenCandidates");yd.get("/:token",async e=>{let t=e.req.param("token");if(!t||t.length<8)return e.json({error:"invalid_token"},404);let n=zA(t);if(n.length===0)return e.json({error:"invalid_token"},404);let[r]=await u.select({productAnnouncements:At.productAnnouncements,unsubscribedAt:At.unsubscribedAt}).from(At).where(WA(At.unsubscribeToken,n)).limit(1);return r?e.json({valid:!0,alreadyUnsubscribed:r.productAnnouncements===!1}):e.json({error:"invalid_token"},404)});yd.post("/:token",async e=>{let t=e.req.param("token");if(!t||t.length<8)return e.json({error:"invalid_token"},404);let n=zA(t);return n.length===0?e.json({error:"invalid_token"},404):(await u.update(At).set({productAnnouncements:!1,unsubscribedAt:FA`now()`,updatedAt:FA`now()`}).where(WA(At.unsubscribeToken,n)).returning({userId:At.userId})).length===0?e.json({error:"invalid_token"},404):e.json({ok:!0})});O();import{createHash as Vq}from"node:crypto";async function VA(){let e=[],t=0,n=0,r=0;for(let[o,s]of Object.entries(ud)){t++;for(let i of s.docs)try{let a=await fetch(i.url,{headers:{"User-Agent":"RuleMetric-Research/1.0"}});if(!a.ok){e.push({provider:o,url:i.url,message:`HTTP ${a.status}`});continue}let c=await a.text(),l=Vq("sha256").update(c).digest("hex"),p=!0,m=[],y=null;try{m=i.parse(c)}catch(f){p=!1,y=f instanceof Error?f.message:String(f)}if((await u.insert(xt).values({provider:o,docUrl:i.url,contentHash:l,content:c,parseSuccess:p,parseErrors:y?[y]:null}).onConflictDoNothing({target:[xt.provider,xt.docUrl,xt.contentHash]}).returning({id:xt.id})).length===1&&p){for(let f of m)await u.insert(we).values({provider:o,plan:f.plan,limitType:f.limitType,value:String(f.value),unit:f.unit,comparator:f.comparator??"=",resetsAt:null,sourceType:"official_docs",sourceUrl:i.url,sourceEvidence:{snapshotHash:l},confidence:"0.85",userId:null}),r++;n++}}catch(a){e.push({provider:o,url:i.url,message:a instanceof Error?a.message:String(a)})}}return{providers_scraped:t,snapshots_inserted:n,observations_inserted:r,errors:e}}d(VA,"scrapeProviderDocs");var Jq=360*60*1e3,JA=!1;function GA(){if(JA)return{stop:d(()=>{},"stop")};JA=!0;let e=setTimeout(()=>{VA().then(n=>{n.errors.length>0?console.warn("[research] scrape completed with errors:",n):console.log(`[research] scrape ok: providers=${n.providers_scraped}, snapshots+=${n.snapshots_inserted}, observations+=${n.observations_inserted}`)}).catch(n=>console.warn("[research] scrape failed:",n))},3e4),t=setInterval(()=>{VA().then(n=>{n.errors.length>0&&console.warn("[research] scrape completed with errors:",n)}).catch(n=>console.warn("[research] scrape failed:",n))},Jq);return{stop:d(()=>{clearTimeout(e),clearInterval(t)},"stop")}}d(GA,"startScrapeInterval");var z=new Yq,eU=process.env.ALLOWED_ORIGINS?.split(",")??["http://localhost:5174","http://localhost:5175"];z.use("*",Xq({origin:d(e=>e?eU.includes(e)?e:"":"*","origin"),allowMethods:["GET","POST","PUT","PATCH","DELETE","OPTIONS"],allowHeaders:["Authorization","Content-Type"],credentials:!0}));z.use("*",Op());z.use("*",Aw());z.use("/api/*",Qq({maxSize:10*1024*1024}));z.use("*",Sw);z.use("/auth/login",oc(900*1e3,10));var QA=oc(60*1e3,10);z.use("/api/auth/api-keys",QA);z.use("/api/auth/api-keys/*",QA);z.use("/api/invitations/*",oc(60*1e3,30));z.use("/api/telemetry/cli-error",oc(60*1e3,60));z.route("/",ii);z.route("/api",wu);z.route("/",oi);z.route("/",dd);z.route("/api",yu);z.route("/api",dp);z.route("/",lp);z.use("/api/*",ww);z.use("/api/*",Iw);z.use("/api/sessions/:id/context-snapshots",ic);z.use("/api/sessions/:id/events",ic);z.use("/api/sessions/import",ic);z.use("/api/internal/research/observe",ic);z.use("/api/*",async(e,t)=>{let n=e.req.path,r=e.req.method,o=r==="GET"&&n.startsWith("/api/invitations/")&&n!=="/api/invitations/accept",s=r==="GET"&&n==="/api/cli/latest-version",i=r==="POST"&&n==="/api/skills/sync-public",a=(r==="GET"||r==="POST")&&n.startsWith("/api/unsubscribe/");return o||s||i||a?t():hw(e,t)});z.route("/api",wn);z.route("/api",xu);z.route("/api",Tu);z.route("/api",Ru);z.route("/api",pc);z.route("/api",mc);z.route("/api",fc);z.route("/api",hc);z.route("/api",Nu);z.route("/api",ho);z.route("/api",bo);z.route("/api",$c);z.route("/api",fr);z.route("/api",Al);z.route("/api",Hi);z.route("/api",Uc);z.route("/api",hr);z.route("/api",Nl);z.route("/api",xo);z.route("/api",Bi);z.route("/api",vs);z.route("/api",Is);z.route("/api",Wi);z.route("/api",Br);z.route("/api",Ss);z.route("/api",Ki);z.route("/api",ko);z.route("/api",$l);z.route("/api",Mn);z.route("/api",mn);z.route("/api",Qi);z.route("/api",Jr);z.route("/api",Do);z.route("/api",Qc);z.route("/api",ta);z.route("/api",Mo);z.route("/api",br);z.route("/api",Os);z.route("/api",Bo);z.route("/api/invitations",rd);z.route("/api",id);z.route("/api",fn);z.route("/api",cp);z.route("/api",cd);z.route("/api",tr);z.route("/api",md);z.route("/api",hd);z.route("/api",hp);z.route("/api",_p);z.route("/api",ma);z.route("/api",Rr);z.route("/api/unsubscribe",yd);z.route("/api",up);var tU=setTimeout(()=>{Gl().catch(()=>{})},5e3),nU=GA(),ZA=[{stop:d(()=>clearTimeout(tU),"stop")},nU],rU=fa.dirname(Kq(import.meta.url)),Fh=process.env.WEB_DIST_PATH??fa.resolve(rU,"../../../apps/web/dist");if(wd.existsSync(Fh)){let e=d(async t=>{let n=fa.join(Fh,"index.html");if(!wd.existsSync(n))return t.notFound();let{stampRuntimeConfig:r}=await Promise.resolve().then(()=>(XA(),YA));return t.html(r(wd.readFileSync(n,"utf-8")))},"serveIndex");z.get("/",e),z.get("/index.html",e),z.use("/*",Zq({root:Fh,rewriteRequestPath:d(t=>t,"rewriteRequestPath")})),z.get("*",e)}z.onError(_w);O();import{sql as kr}from"drizzle-orm";var oU=300*1e3,sU="reconciler: lease expired with attempts exhausted \u2014 agent likely crashed mid-run",iU="reconciler: in-flight row had no lease and attempts were exhausted \u2014 unclaimable and unswept until recovered",ga=1,aU=["eval_jobs","insights_jobs","launch_jobs","session_send_jobs","agent_jobs"];function ha(){return kr.join(Object.entries(Hh).map(([e,t])=>kr`WHEN ${e} THEN ${t}::int`),kr` `)}d(ha,"maxAttemptsCase");async function cU(e){let t=await u.execute(kr`
1276
+ `),a&&await SS(i.taskKind,t,n,"failed",s.data.error),e.json({ok:!0,requeued:!a,attempts:i.attempts})});C();import{Hono as G$}from"hono";import{z as Wo}from"zod";import{and as kS,desc as Y$,eq as Qr,isNotNull as X$,sql as NS}from"drizzle-orm";C();import{and as H$,asc as B$,eq as Tr,gt as F$,isNotNull as W$,sql as z$}from"drizzle-orm";var AS=100,ES=10,_m=new Set;function xS(e){return _m.has(e)}u(xS,"isAnnouncementSendInFlight");async function TS(e,t={}){let n=t.db??d,r=t.sendEmail??nm,o=t.log??(i=>process.stderr.write(`[announcement-sender] ${i}
1277
+ `)),s=t.webBaseUrl??process.env.RULEMETRIC_WEB_URL??process.env.WEB_URL??"https://rulemetric.com";if(_m.has(e))throw new Error(`Announcement ${e} send already in flight`);_m.add(e);try{return await V$({announcementId:e,db:n,sendEmail:r,log:o,webBaseUrl:s})}finally{_m.delete(e)}}u(TS,"sendAnnouncement");async function V$(e){let{announcementId:t,db:n,sendEmail:r,log:o,webBaseUrl:s}=e,[i]=await n.select().from(Oe).where(Tr(Oe.id,t)).limit(1);if(!i)throw new Error(`Announcement ${t} not found`);if(i.status!=="queued"&&i.status!=="sending")throw new Error(`Announcement ${t} is in status='${i.status}'; expected 'queued' or 'sending'.`);await n.update(Oe).set({status:"sending",updatedAt:new Date}).where(Tr(Oe.id,t)),o(`Sending announcement ${t} (${i.subject??""})`);let c=0,a=0,l=0,m=0,p=null;try{for(;;){let v=await n.select({userId:At.userId,email:T.email,displayName:T.displayName,unsubscribeToken:At.unsubscribeToken}).from(At).innerJoin(T,Tr(T.id,At.userId)).where(H$(Tr(At.productAnnouncements,!0),W$(T.email),p?F$(At.userId,p):void 0)).orderBy(B$(At.userId)).limit(AS);if(v.length===0)break;p=v[v.length-1].userId;for(let S=0;S<v.length;S+=ES){let A=v.slice(S,S+ES),E=await Promise.allSettled(A.map(R=>K$({recipient:R,announcement:i,webBaseUrl:s,sendEmail:r,db:n})));for(let R=0;R<E.length;R++){let P=E[R];if(P.status==="fulfilled")P.value.ok==="sent"?c++:P.value.ok==="skipped"?l++:(a++,P.value.provider==="noop"&&m++,o(` recipient ${A[R].userId}: send failed \u2014 ${P.value.error}`));else{a++;let N=P.reason instanceof Error?P.reason.message:String(P.reason);o(` recipient ${A[R].userId}: send failed \u2014 ${N}`)}}}if(v.length<AS)break}m>0&&o(`WARNING: ${m} recipient(s) hit the noop email provider and were recorded as FAILED \u2014 no email provider is configured on this API instance (set RESEND_API_KEY)`);let _=await n.select({status:St.status,count:z$`count(*)::int`}).from(St).where(Tr(St.announcementId,t)).groupBy(St.status),I={};for(let v of _)I[v.status]=v.count;let h=I.sent??0,f=I.failed??0,w=h===0&&f>0?"failed":"sent",b=f>0?`${f} of ${h+f} recipient(s) failed; see announcement_deliveries`:null;return await n.update(Oe).set({status:w,recipientCount:h,...w==="sent"?{sentAt:new Date}:{},error:b,updatedAt:new Date}).where(Tr(Oe.id,t)),o(`Done: status=${w} sent=${h} failed=${f} (this attempt: sent=${c} failed=${a} skipped=${l})`),{sent:c,failed:a,skipped:l}}catch(_){let I=_ instanceof Error?_.message:String(_);throw await n.update(Oe).set({status:"failed",error:I.slice(0,1e3),updatedAt:new Date}).where(Tr(Oe.id,t)).catch(()=>{}),_}}u(V$,"runSend");function J$(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}u(J$,"escapeHtml");async function K$(e){let{recipient:t,announcement:n,webBaseUrl:r,sendEmail:o,db:s}=e;if(!t.email)return{ok:"skipped",reason:"no-email"};let i=await s.insert(St).values({announcementId:n.id,userId:t.userId,email:t.email,status:"pending"}).onConflictDoNothing({target:[St.announcementId,St.userId]}).returning({id:St.id});if(i.length===0)return{ok:"skipped",reason:"already-claimed"};let c=i[0].id,a=r.replace(/\/$/,""),l=encodeURIComponent(t.unsubscribeToken),m=`${a}/unsubscribe/${l}`,p=t.displayName?.trim().split(/\s+/)[0]||"there",_=n.htmlBody.replaceAll("{{unsubscribe_url}}",m).replaceAll("{{recipient_name}}",J$(p)),I=n.textBody.replaceAll("{{unsubscribe_url}}",m).replaceAll("{{recipient_name}}",p);try{let h=await o({to:t.email,subject:n.subject,html:_,text:I,fromName:"RuleMetric",idempotencyKey:c,headers:{"List-Unsubscribe":`<${a}/api/unsubscribe/${l}>`,"List-Unsubscribe-Post":"List-Unsubscribe=One-Click"}});if(h.provider==="noop"){let f="no email provider configured (RESEND_API_KEY unset on the API)";return await s.update(St).set({status:"failed",error:f}).where(Tr(St.id,c)),{ok:"failed",error:f,provider:h.provider}}return await s.update(St).set({status:"sent",providerId:h.id,sentAt:new Date}).where(Tr(St.id,c)),{ok:"sent",providerId:h.id,provider:h.provider}}catch(h){let f=h instanceof Error?h.message:String(h);return await s.update(St).set({status:"failed",error:f.slice(0,1e3)}).where(Tr(St.id,c)).catch(()=>{}),{ok:"failed",error:f}}}u(K$,"sendOne");var Rr=new G$;Rr.use("/announcements/*",cu());Rr.use("/announcements",cu());Rr.get("/announcements",async e=>{let t=await d.select({id:Oe.id,version:Oe.version,releaseDate:Oe.releaseDate,subject:Oe.subject,status:Oe.status,recipientCount:Oe.recipientCount,sentAt:Oe.sentAt,sentBy:Oe.sentBy,error:Oe.error,createdAt:Oe.createdAt,updatedAt:Oe.updatedAt}).from(Oe).orderBy(Y$(Oe.createdAt));return e.json({announcements:t})});Rr.get("/announcements/:id",async e=>{let t=e.req.param("id");if(!Wo.string().uuid().safeParse(t).success)return e.json({error:"Invalid id",code:"VALIDATION_ERROR"},400);let[n]=await d.select().from(Oe).where(Qr(Oe.id,t));if(!n)return e.json({error:"Announcement not found",code:"NOT_FOUND"},404);let r=await d.select({status:St.status,count:NS`count(*)::int`}).from(St).where(Qr(St.announcementId,t)).groupBy(St.status),o={};for(let s of r)o[s.status]=s.count;return e.json({...n,deliveryCounts:o})});Rr.get("/announcements/:id/recipients/count",async e=>{let t=e.req.param("id");if(!Wo.string().uuid().safeParse(t).success)return e.json({error:"Invalid id",code:"VALIDATION_ERROR"},400);let n=await Q$();return e.json({count:n})});async function Q$(){let[e]=await d.select({count:NS`count(*)::int`}).from(At).innerJoin(T,Qr(T.id,At.userId)).where(kS(Qr(At.productAnnouncements,!0),X$(T.email)));return e?.count??0}u(Q$,"countOptedInRecipients");var RS=u(e=>e.includes("{{unsubscribe_url}}"),"hasUnsubscribePlaceholder"),Z$=Wo.object({subject:Wo.string().min(1).max(500).optional(),htmlBody:Wo.string().min(1).refine(RS,{message:"htmlBody must contain the {{unsubscribe_url}} placeholder"}).optional(),textBody:Wo.string().min(1).refine(RS,{message:"textBody must contain the {{unsubscribe_url}} placeholder"}).optional()});Rr.patch("/announcements/:id",async e=>{let t=e.req.param("id");if(!Wo.string().uuid().safeParse(t).success)return e.json({error:"Invalid id",code:"VALIDATION_ERROR"},400);let n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON",code:"VALIDATION_ERROR"},400)}let r=Z$.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let o=r.data;if(Object.keys(o).length===0)return e.json({error:"No fields to update",code:"VALIDATION_ERROR"},400);let[s]=await d.select().from(Oe).where(Qr(Oe.id,t));if(!s)return e.json({error:"Announcement not found",code:"NOT_FOUND"},404);if(s.status!=="draft")return e.json({error:"Can only edit draft announcements",code:"INVALID_STATE",status:s.status},409);let[i]=await d.update(Oe).set({...o.subject!==void 0?{subject:o.subject}:{},...o.htmlBody!==void 0?{htmlBody:o.htmlBody}:{},...o.textBody!==void 0?{textBody:o.textBody}:{},updatedAt:new Date}).where(Qr(Oe.id,t)).returning();return e.json(i)});Rr.post("/announcements/:id/send",async e=>{let t=e.get("userId");if(!t)return e.json({error:"Unauthenticated",code:"UNAUTHENTICATED"},401);let n=e.req.param("id");if(!Wo.string().uuid().safeParse(n).success)return e.json({error:"Invalid id",code:"VALIDATION_ERROR"},400);let r=await d.update(Oe).set({status:"queued",sentBy:t,updatedAt:new Date}).where(kS(Qr(Oe.id,n),Qr(Oe.status,"draft"))).returning(),o=r[0],s=!1;if(r.length===0){let[i]=await d.select().from(Oe).where(Qr(Oe.id,n));if(!i)return e.json({error:"Announcement not found",code:"NOT_FOUND"},404);if(!((i.status==="queued"||i.status==="sending")&&!xS(n)))return e.json({error:`Cannot send from status='${i.status}' (must be 'draft', or a stalled 'queued'/'sending' to resume)`,code:"INVALID_STATE",status:i.status},409);o=i,s=!0}return TS(n).catch(i=>{process.stderr.write(`[announcements] send loop for ${n} failed: ${i instanceof Error?i.message:String(i)}
1278
+ `)}),e.json({processing:!0,resumed:s,announcement:o},202)});C();import{Hono as e1}from"hono";import{inArray as PS,sql as jS}from"drizzle-orm";var wu=new e1;function DS(e){let t;try{t=decodeURIComponent(e)}catch{return[]}let n=t.replace(/=+$/,"").replaceAll("+","-").replaceAll("/","_");return t===n?[t]:[t,n]}u(DS,"tokenCandidates");wu.get("/:token",async e=>{let t=e.req.param("token");if(!t||t.length<8)return e.json({error:"invalid_token"},404);let n=DS(t);if(n.length===0)return e.json({error:"invalid_token"},404);let[r]=await d.select({productAnnouncements:At.productAnnouncements,unsubscribedAt:At.unsubscribedAt}).from(At).where(PS(At.unsubscribeToken,n)).limit(1);return r?e.json({valid:!0,alreadyUnsubscribed:r.productAnnouncements===!1}):e.json({error:"invalid_token"},404)});wu.post("/:token",async e=>{let t=e.req.param("token");if(!t||t.length<8)return e.json({error:"invalid_token"},404);let n=DS(t);return n.length===0?e.json({error:"invalid_token"},404):(await d.update(At).set({productAnnouncements:!1,unsubscribedAt:jS`now()`,updatedAt:jS`now()`}).where(PS(At.unsubscribeToken,n)).returning({userId:At.userId})).length===0?e.json({error:"invalid_token"},404):e.json({ok:!0})});C();import{createHash as t1}from"node:crypto";async function OS(){let e=[],t=0,n=0,r=0;for(let[o,s]of Object.entries(lu)){t++;for(let i of s.docs)try{let c=await fetch(i.url,{headers:{"User-Agent":"RuleMetric-Research/1.0"}});if(!c.ok){e.push({provider:o,url:i.url,message:`HTTP ${c.status}`});continue}let a=await c.text(),l=t1("sha256").update(a).digest("hex"),m=!0,p=[],_=null;try{p=i.parse(a)}catch(f){m=!1,_=f instanceof Error?f.message:String(f)}if((await d.insert(xt).values({provider:o,docUrl:i.url,contentHash:l,content:a,parseSuccess:m,parseErrors:_?[_]:null}).onConflictDoNothing({target:[xt.provider,xt.docUrl,xt.contentHash]}).returning({id:xt.id})).length===1&&m){for(let f of p)await d.insert(ye).values({provider:o,plan:f.plan,limitType:f.limitType,value:String(f.value),unit:f.unit,comparator:f.comparator??"=",resetsAt:null,sourceType:"official_docs",sourceUrl:i.url,sourceEvidence:{snapshotHash:l},confidence:"0.85",userId:null}),r++;n++}}catch(c){e.push({provider:o,url:i.url,message:c instanceof Error?c.message:String(c)})}}return{providers_scraped:t,snapshots_inserted:n,observations_inserted:r,errors:e}}u(OS,"scrapeProviderDocs");var n1=360*60*1e3,CS=!1;function LS(){if(CS)return{stop:u(()=>{},"stop")};CS=!0;let e=setTimeout(()=>{OS().then(n=>{n.errors.length>0?console.warn("[research] scrape completed with errors:",n):console.log(`[research] scrape ok: providers=${n.providers_scraped}, snapshots+=${n.snapshots_inserted}, observations+=${n.observations_inserted}`)}).catch(n=>console.warn("[research] scrape failed:",n))},3e4),t=setInterval(()=>{OS().then(n=>{n.errors.length>0&&console.warn("[research] scrape completed with errors:",n)}).catch(n=>console.warn("[research] scrape failed:",n))},n1);return{stop:u(()=>{clearTimeout(e),clearInterval(t)},"stop")}}u(LS,"startScrapeInterval");var J=new s1,u1=process.env.ALLOWED_ORIGINS?.split(",")??["http://localhost:5174","http://localhost:5175"];J.use("*",i1({origin:u(e=>e?u1.includes(e)?e:"":"*","origin"),allowMethods:["GET","POST","PUT","PATCH","DELETE","OPTIONS"],allowHeaders:["Authorization","Content-Type"],credentials:!0}));J.use("*",Dm());J.use("*",bw());J.use("/api/*",a1({maxSize:10*1024*1024}));J.use("*",Iw);J.use("/auth/login",rc(900*1e3,10));var US=rc(60*1e3,10);J.use("/api/auth/api-keys",US);J.use("/api/auth/api-keys/*",US);J.use("/api/invitations/*",rc(60*1e3,30));J.use("/api/telemetry/cli-error",rc(60*1e3,60));J.route("/",ii);J.route("/api",vd);J.route("/",oi);J.route("/",du);J.route("/api",wd);J.route("/api",cm);J.route("/",dm);J.use("/api/*",_w);J.use("/api/*",ww);J.use("/api/sessions/:id/context-snapshots",sc);J.use("/api/sessions/:id/events",sc);J.use("/api/sessions/import",sc);J.use("/api/internal/research/observe",sc);J.use("/api/*",async(e,t)=>{let n=e.req.path,r=e.req.method,o=r==="GET"&&n.startsWith("/api/invitations/")&&n!=="/api/invitations/accept",s=r==="GET"&&n==="/api/cli/latest-version",i=r==="POST"&&n==="/api/skills/sync-public",c=(r==="GET"||r==="POST")&&n.startsWith("/api/unsubscribe/");return o||s||i||c?t():fw(e,t)});J.route("/api",wn);J.route("/api",lc);J.route("/api",mc);J.route("/api",pc);J.route("/api",gc);J.route("/api",Nd);J.route("/api",ho);J.route("/api",bo);J.route("/api",Mc);J.route("/api",fr);J.route("/api",Sl);J.route("/api",Ui);J.route("/api",Hc);J.route("/api",hr);J.route("/api",Nl);J.route("/api",Eo);J.route("/api",Hi);J.route("/api",Is);J.route("/api",bs);J.route("/api",Fi);J.route("/api",Br);J.route("/api",As);J.route("/api",Ki);J.route("/api",Ro);J.route("/api",Ml);J.route("/api",$n);J.route("/api",pn);J.route("/api",Xi);J.route("/api",Jr);J.route("/api",Oo);J.route("/api",Zc);J.route("/api",ea);J.route("/api",Co);J.route("/api",br);J.route("/api",Os);J.route("/api",Ho);J.route("/api/invitations",ou);J.route("/api",au);J.route("/api",fn);J.route("/api",am);J.route("/api",uu);J.route("/api",tr);J.route("/api",fu);J.route("/api",_u);J.route("/api",gm);J.route("/api",hm);J.route("/api",ma);J.route("/api",Rr);J.route("/api/unsubscribe",wu);J.route("/api",um);var d1=setTimeout(()=>{Jl().catch(()=>{})},5e3),l1=LS(),HS=[{stop:u(()=>clearTimeout(d1),"stop")},l1],m1=pa.dirname(o1(import.meta.url)),Uh=process.env.WEB_DIST_PATH??pa.resolve(m1,"../../../apps/web/dist");if(vu.existsSync(Uh)){let e=u(async t=>{let n=pa.join(Uh,"index.html");if(!vu.existsSync(n))return t.notFound();let{stampRuntimeConfig:r}=await Promise.resolve().then(()=>(qS(),$S));return t.html(r(vu.readFileSync(n,"utf-8")))},"serveIndex");J.get("/",e),J.get("/index.html",e),J.use("/*",c1({root:Uh,rewriteRequestPath:u(t=>t,"rewriteRequestPath")})),J.get("*",e)}J.onError(gw);C();import{sql as kr}from"drizzle-orm";var p1=300*1e3,f1="reconciler: lease expired with attempts exhausted \u2014 agent likely crashed mid-run",g1="reconciler: in-flight row had no lease and attempts were exhausted \u2014 unclaimable and unswept until recovered",fa=1,h1=["eval_jobs","insights_jobs","launch_jobs","session_send_jobs","agent_jobs"];function ga(){return kr.join(Object.entries($h).map(([e,t])=>kr`WHEN ${e} THEN ${t}::int`),kr` `)}u(ga,"maxAttemptsCase");async function _1(e){let t=await d.execute(kr`
1357
1279
  UPDATE ${kr.raw(e)}
1358
1280
  SET status = 'failed',
1359
- error = ${sU},
1281
+ error = ${f1},
1360
1282
  completed_at = now(),
1361
1283
  claimed_by = NULL,
1362
1284
  claimed_at = NULL,
@@ -1365,10 +1287,10 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
1365
1287
  WHERE status IN ('claimed', 'running')
1366
1288
  AND claimed_by IS NOT NULL
1367
1289
  AND lease_expires_at < now()
1368
- AND attempts >= (CASE task_kind ${ha()} ELSE 3 END)
1369
- AND lease_recoveries >= ${ga}
1290
+ AND attempts >= (CASE task_kind ${ga()} ELSE 3 END)
1291
+ AND lease_recoveries >= ${fa}
1370
1292
  RETURNING id
1371
- `),n=await u.execute(kr`
1293
+ `),n=await d.execute(kr`
1372
1294
  UPDATE ${kr.raw(e)}
1373
1295
  SET status = 'pending',
1374
1296
  attempts = GREATEST(attempts - 1, 0),
@@ -1381,31 +1303,31 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
1381
1303
  AND claimed_by IS NOT NULL
1382
1304
  AND lease_expires_at < now()
1383
1305
  RETURNING id
1384
- `),r=await u.execute(kr`
1306
+ `),r=await d.execute(kr`
1385
1307
  UPDATE ${kr.raw(e)}
1386
1308
  SET status = CASE
1387
- WHEN attempts >= (CASE task_kind ${ha()} ELSE 3 END)
1388
- AND lease_recoveries >= ${ga} THEN 'failed'
1309
+ WHEN attempts >= (CASE task_kind ${ga()} ELSE 3 END)
1310
+ AND lease_recoveries >= ${fa} THEN 'failed'
1389
1311
  ELSE 'pending'
1390
1312
  END,
1391
1313
  attempts = CASE
1392
- WHEN attempts >= (CASE task_kind ${ha()} ELSE 3 END)
1393
- AND lease_recoveries >= ${ga} THEN attempts
1314
+ WHEN attempts >= (CASE task_kind ${ga()} ELSE 3 END)
1315
+ AND lease_recoveries >= ${fa} THEN attempts
1394
1316
  ELSE GREATEST(attempts - 1, 0)
1395
1317
  END,
1396
1318
  lease_recoveries = CASE
1397
- WHEN attempts >= (CASE task_kind ${ha()} ELSE 3 END)
1398
- AND lease_recoveries >= ${ga} THEN lease_recoveries
1319
+ WHEN attempts >= (CASE task_kind ${ga()} ELSE 3 END)
1320
+ AND lease_recoveries >= ${fa} THEN lease_recoveries
1399
1321
  ELSE lease_recoveries + 1
1400
1322
  END,
1401
1323
  error = CASE
1402
- WHEN attempts >= (CASE task_kind ${ha()} ELSE 3 END)
1403
- AND lease_recoveries >= ${ga} THEN ${iU}
1324
+ WHEN attempts >= (CASE task_kind ${ga()} ELSE 3 END)
1325
+ AND lease_recoveries >= ${fa} THEN ${g1}
1404
1326
  ELSE error
1405
1327
  END,
1406
1328
  completed_at = CASE
1407
- WHEN attempts >= (CASE task_kind ${ha()} ELSE 3 END)
1408
- AND lease_recoveries >= ${ga} THEN now()
1329
+ WHEN attempts >= (CASE task_kind ${ga()} ELSE 3 END)
1330
+ AND lease_recoveries >= ${fa} THEN now()
1409
1331
  ELSE completed_at
1410
1332
  END,
1411
1333
  claimed_at = NULL,
@@ -1415,7 +1337,7 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
1415
1337
  AND claimed_by IS NULL
1416
1338
  AND updated_at < now() - interval '15 minutes'
1417
1339
  RETURNING id
1418
- `);return t.length+n.length+r.length}d(cU,"reclaimExpiredLeases");async function dU(){return(await u.execute(kr`
1340
+ `);return t.length+n.length+r.length}u(_1,"reclaimExpiredLeases");async function y1(){return(await d.execute(kr`
1419
1341
  UPDATE memory_experiments me
1420
1342
  SET status = 'failed',
1421
1343
  error = 'reconciler: worker died mid-experiment (backing job terminal, row left running)',
@@ -1428,12 +1350,12 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
1428
1350
  AND aj.status IN ('failed', 'completed')
1429
1351
  )
1430
1352
  RETURNING me.id
1431
- `)).length}d(dU,"failStrandedMemoryExperiments");function eE(){let e=setTimeout(()=>{n()},3e4),t=setInterval(()=>{n()},oU);async function n(){try{let r=[];for(let o of aU)try{let s=await cU(o);s>0&&r.push({table:o,count:s})}catch(s){console.error(`[reconciler] ${o} lease sweep failed:`,s instanceof Error?s.stack:s)}if(r.length>0){let o=r.map(s=>`${s.table}=${s.count}`).join(" ");console.log(`[reconciler] reclaimed expired leases: ${o}`)}try{let o=await dU();o>0&&console.log(`[reconciler] failed ${o} stranded memory experiment(s)`)}catch(o){console.error("[reconciler] memory-experiment sweep failed:",o instanceof Error?o.stack:o)}}catch(r){console.error("[reconciler] unexpected error:",r instanceof Error?r.stack:r)}}return d(n,"runOnce"),{stop(){clearTimeout(e),clearInterval(t)}}}d(eE,"startReconciler");O();import{and as lU,eq as zh,sql as wp}from"drizzle-orm";O();import{and as tE,eq as Wh,inArray as uU,sql as nE}from"drizzle-orm";async function rE(e,t){let n=new Map;if(t.length===0)return n;let r=t.map(m=>m.id),o=new Map(t.map(m=>[m.id,m.version])),i=(await u.select({id:_.id,projectId:_.projectId,outcome:nE`${_.analysis}->>'outcome'`}).from(_).where(tE(Wh(_.userId,e),nE`${_.analysis} is not null`)).orderBy(_.id)).map(m=>({id:m.id,key:m.projectId??"(no-project)",score:us(m.outcome)})).filter(m=>m.score!=null),a=await u.select({sessionId:Z.sessionId,treatmentId:Z.treatmentId,treatmentVersion:Z.treatmentVersion}).from(Z).where(tE(Wh(Z.userId,e),Wh(Z.treatmentType,"memory"),uU(Z.treatmentId,r))),c=new Map,l=new Map;for(let m of a){let y=m.treatmentVersion===o.get(m.treatmentId)?c:l,v=y.get(m.treatmentId);v||(v=new Set,y.set(m.treatmentId,v)),v.add(m.sessionId)}let p=d(m=>{let y=c.get(m);if(!y||y.size===0)return"insufficient";let v=l.get(m),h=new Map;for(let f of i){if(v?.has(f.id)&&!y.has(f.id))continue;let w=h.get(f.key);w||(w={key:f.key,withScores:[],withoutScores:[]},h.set(f.key,w)),(y.has(f.id)?w.withScores:w.withoutScores).push(f.score)}return ds(In([...h.values()],{iterations:1e3}))},"effectOf");for(let m of t)n.set(m.id,p(m.id));return n}d(rE,"computeTrustClasses");var pU=1800*1e3;async function mU(e,t){if(t.length===0)return;let n=wp.join(t.map(r=>wp`(${r.id}::uuid, ${r.trustClass}::text, ${r.version}::int)`),wp`, `);await u.execute(wp`
1353
+ `)).length}u(y1,"failStrandedMemoryExperiments");function BS(){let e=setTimeout(()=>{n()},3e4),t=setInterval(()=>{n()},p1);async function n(){try{let r=[];for(let o of h1)try{let s=await _1(o);s>0&&r.push({table:o,count:s})}catch(s){console.error(`[reconciler] ${o} lease sweep failed:`,s instanceof Error?s.stack:s)}if(r.length>0){let o=r.map(s=>`${s.table}=${s.count}`).join(" ");console.log(`[reconciler] reclaimed expired leases: ${o}`)}try{let o=await y1();o>0&&console.log(`[reconciler] failed ${o} stranded memory experiment(s)`)}catch(o){console.error("[reconciler] memory-experiment sweep failed:",o instanceof Error?o.stack:o)}}catch(r){console.error("[reconciler] unexpected error:",r instanceof Error?r.stack:r)}}return u(n,"runOnce"),{stop(){clearTimeout(e),clearInterval(t)}}}u(BS,"startReconciler");C();import{and as v1,eq as Bh,sql as ym}from"drizzle-orm";C();import{and as FS,eq as Hh,inArray as w1,sql as WS}from"drizzle-orm";async function zS(e,t){let n=new Map;if(t.length===0)return n;let r=t.map(p=>p.id),o=new Map(t.map(p=>[p.id,p.version])),i=(await d.select({id:y.id,projectId:y.projectId,outcome:WS`${y.analysis}->>'outcome'`}).from(y).where(FS(Hh(y.userId,e),WS`${y.analysis} is not null`)).orderBy(y.id)).map(p=>({id:p.id,key:p.projectId??"(no-project)",score:us(p.outcome)})).filter(p=>p.score!=null),c=await d.select({sessionId:Z.sessionId,treatmentId:Z.treatmentId,treatmentVersion:Z.treatmentVersion}).from(Z).where(FS(Hh(Z.userId,e),Hh(Z.treatmentType,"memory"),w1(Z.treatmentId,r))),a=new Map,l=new Map;for(let p of c){let _=p.treatmentVersion===o.get(p.treatmentId)?a:l,I=_.get(p.treatmentId);I||(I=new Set,_.set(p.treatmentId,I)),I.add(p.sessionId)}let m=u(p=>{let _=a.get(p);if(!_||_.size===0)return"insufficient";let I=l.get(p),h=new Map;for(let f of i){if(I?.has(f.id)&&!_.has(f.id))continue;let w=h.get(f.key);w||(w={key:f.key,withScores:[],withoutScores:[]},h.set(f.key,w)),(_.has(f.id)?w.withScores:w.withoutScores).push(f.score)}return cs(In([...h.values()],{iterations:1e3}))},"effectOf");for(let p of t)n.set(p.id,m(p.id));return n}u(zS,"computeTrustClasses");var I1=1800*1e3;async function b1(e,t){if(t.length===0)return;let n=ym.join(t.map(r=>ym`(${r.id}::uuid, ${r.trustClass}::text, ${r.version}::int)`),ym`, `);await d.execute(ym`
1432
1354
  update memories m
1433
1355
  set trust_class = v.cls, trust_version = v.ver, trust_computed_at = now()
1434
1356
  from (values ${n}) as v(id, cls, ver)
1435
1357
  where m.id = v.id and m.user_id = ${e}
1436
- `)}d(mU,"applyMaterializedTrust");async function fU(e){let t=await u.select({id:F.id,version:F.version}).from(F).where(lU(zh(F.userId,e),zh(F.status,"active")));if(t.length===0)return 0;let n=await rE(e,t),r=t.map(o=>({id:o.id,trustClass:n.get(o.id)??"insufficient",version:o.version}));return await mU(e,r),r.length}d(fU,"refreshMemoryTrustForUser");async function gU(){let e=await u.selectDistinct({userId:F.userId}).from(F).where(zh(F.status,"active")),t=0;for(let{userId:n}of e)try{t+=await fU(n)}catch(r){console.error(`[memory-trust-refresh] user ${n} failed:`,r instanceof Error?r.stack:r)}return{users:e.length,memories:t}}d(gU,"refreshAllMemoryTrust");function oE(){let e=setTimeout(()=>void n(),45e3),t=setInterval(()=>void n(),pU);async function n(){try{let{users:r,memories:o}=await gU();o>0&&console.log(`[memory-trust-refresh] materialized ${o} memory class(es) across ${r} user(s)`)}catch(r){console.error("[memory-trust-refresh] sweep failed:",r instanceof Error?r.stack:r)}}return d(n,"runOnce"),{stop(){clearTimeout(e),clearInterval(t)}}}d(oE,"startMemoryTrustRefresh");O();import{sql as hU}from"drizzle-orm";var _U=30*6e4,sE=24,yU=6,iE="pipeline:usage_observations_stale";async function wU(){let e=await u.execute(hU`
1358
+ `)}u(b1,"applyMaterializedTrust");async function S1(e){let t=await d.select({id:F.id,version:F.version}).from(F).where(v1(Bh(F.userId,e),Bh(F.status,"active")));if(t.length===0)return 0;let n=await zS(e,t),r=t.map(o=>({id:o.id,trustClass:n.get(o.id)??"insufficient",version:o.version}));return await b1(e,r),r.length}u(S1,"refreshMemoryTrustForUser");async function A1(){let e=await d.selectDistinct({userId:F.userId}).from(F).where(Bh(F.status,"active")),t=0;for(let{userId:n}of e)try{t+=await S1(n)}catch(r){console.error(`[memory-trust-refresh] user ${n} failed:`,r instanceof Error?r.stack:r)}return{users:e.length,memories:t}}u(A1,"refreshAllMemoryTrust");function VS(){let e=setTimeout(()=>void n(),45e3),t=setInterval(()=>void n(),I1);async function n(){try{let{users:r,memories:o}=await A1();o>0&&console.log(`[memory-trust-refresh] materialized ${o} memory class(es) across ${r} user(s)`)}catch(r){console.error("[memory-trust-refresh] sweep failed:",r instanceof Error?r.stack:r)}}return u(n,"runOnce"),{stop(){clearTimeout(e),clearInterval(t)}}}u(VS,"startMemoryTrustRefresh");C();import{sql as E1}from"drizzle-orm";var x1=30*6e4,JS=24,T1=6,KS="pipeline:usage_observations_stale";async function R1(){let e=await d.execute(E1`
1437
1359
  WITH active_users AS (
1438
1360
  SELECT user_id, count(*) AS sessions_24h
1439
1361
  FROM sessions
@@ -1464,13 +1386,13 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
1464
1386
  LEFT JOIN latest_obs o ON o.user_id = a.user_id
1465
1387
  LEFT JOIN first_seen f ON f.user_id = a.user_id
1466
1388
  WHERE (o.last_observed IS NULL
1467
- AND f.first_session < now() - make_interval(hours => ${sE}))
1468
- OR o.last_observed < now() - make_interval(hours => ${sE})
1389
+ AND f.first_session < now() - make_interval(hours => ${JS}))
1390
+ OR o.last_observed < now() - make_interval(hours => ${JS})
1469
1391
  )
1470
1392
  INSERT INTO alert_dispatches (user_id, alert_key, severity, channel, last_state)
1471
1393
  SELECT
1472
1394
  s.user_id,
1473
- ${iE},
1395
+ ${KS},
1474
1396
  'soft',
1475
1397
  'in_app',
1476
1398
  jsonb_build_object(
@@ -1487,11 +1409,11 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
1487
1409
  WHERE NOT EXISTS (
1488
1410
  SELECT 1 FROM alert_dispatches d
1489
1411
  WHERE d.user_id = s.user_id
1490
- AND d.alert_key = ${iE}
1491
- AND d.last_dispatched_at > now() - make_interval(hours => ${yU})
1412
+ AND d.alert_key = ${KS}
1413
+ AND d.last_dispatched_at > now() - make_interval(hours => ${T1})
1492
1414
  )
1493
1415
  RETURNING user_id, id, last_state->>'message' AS message
1494
- `);e.length>0&&console.log(`[usage-staleness] dispatched stale-pipeline alert for ${e.length} user(s)`);for(let t of e)try{await ua({userId:t.user_id,dispatchId:t.id,severity:"soft",message:t.message??"Usage tracking looks broken \u2014 open /usage.",title:"Usage tracking issue"})}catch(n){console.error("[usage-staleness] bell mirror failed:",n instanceof Error?n.message:n)}return e.length}d(wU,"checkUsageStalenessOnce");function aE(){let e=setTimeout(()=>{n()},6e4),t=setInterval(()=>{n()},_U);async function n(){try{await wU()}catch(r){console.error("[usage-staleness] check failed:",r instanceof Error?r.stack:r)}}return d(n,"runOnce"),{stop:d(()=>{clearTimeout(e),clearInterval(t)},"stop")}}d(aE,"startUsageStalenessChecker");O();import{sql as vU}from"drizzle-orm";var IU=30*6e4,vp=24,bU=6,cE="pipeline:session_capture_stale";async function SU(){let e=await u.execute(vU`
1416
+ `);e.length>0&&console.log(`[usage-staleness] dispatched stale-pipeline alert for ${e.length} user(s)`);for(let t of e)try{await ua({userId:t.user_id,dispatchId:t.id,severity:"soft",message:t.message??"Usage tracking looks broken \u2014 open /usage.",title:"Usage tracking issue"})}catch(n){console.error("[usage-staleness] bell mirror failed:",n instanceof Error?n.message:n)}return e.length}u(R1,"checkUsageStalenessOnce");function GS(){let e=setTimeout(()=>{n()},6e4),t=setInterval(()=>{n()},x1);async function n(){try{await R1()}catch(r){console.error("[usage-staleness] check failed:",r instanceof Error?r.stack:r)}}return u(n,"runOnce"),{stop:u(()=>{clearTimeout(e),clearInterval(t)},"stop")}}u(GS,"startUsageStalenessChecker");C();import{sql as k1}from"drizzle-orm";var N1=30*6e4,wm=24,j1=6,YS="pipeline:session_capture_stale";async function P1(){let e=await d.execute(k1`
1495
1417
  WITH active_users AS (
1496
1418
  SELECT user_id, max(last_seen) AS last_observed,
1497
1419
  array_agg(DISTINCT signal) AS signals
@@ -1501,13 +1423,13 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
1501
1423
  FROM limit_observations
1502
1424
  WHERE source_type = 'oauth_usage'
1503
1425
  AND user_id IS NOT NULL
1504
- AND observed_at > now() - make_interval(hours => ${vp})
1426
+ AND observed_at > now() - make_interval(hours => ${wm})
1505
1427
  GROUP BY user_id
1506
1428
  UNION ALL
1507
1429
  SELECT user_id, max(last_heartbeat), 'worker heartbeat'
1508
1430
  FROM worker_connections
1509
1431
  WHERE worker_type = 'cli-worker'
1510
- AND last_heartbeat > now() - make_interval(hours => ${vp})
1432
+ AND last_heartbeat > now() - make_interval(hours => ${wm})
1511
1433
  GROUP BY user_id
1512
1434
  UNION ALL
1513
1435
  -- Beacons are unauthenticated (no user_id); attribute via the most
@@ -1523,7 +1445,7 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
1523
1445
  ) owner ON true
1524
1446
  WHERE e.event = 'hook_capture_failed'
1525
1447
  AND e.device_id IS NOT NULL
1526
- AND e.created_at > now() - make_interval(hours => ${vp})
1448
+ AND e.created_at > now() - make_interval(hours => ${wm})
1527
1449
  GROUP BY owner.user_id
1528
1450
  ) signal_union
1529
1451
  GROUP BY user_id
@@ -1542,12 +1464,12 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
1542
1464
  FROM active_users a
1543
1465
  LEFT JOIN latest_session s ON s.user_id = a.user_id
1544
1466
  WHERE s.last_session IS NULL
1545
- OR s.last_session < now() - make_interval(hours => ${vp})
1467
+ OR s.last_session < now() - make_interval(hours => ${wm})
1546
1468
  )
1547
1469
  INSERT INTO alert_dispatches (user_id, alert_key, severity, channel, last_state)
1548
1470
  SELECT
1549
1471
  s.user_id,
1550
- ${cE},
1472
+ ${YS},
1551
1473
  'soft',
1552
1474
  'in_app',
1553
1475
  jsonb_build_object(
@@ -1566,11 +1488,11 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
1566
1488
  WHERE NOT EXISTS (
1567
1489
  SELECT 1 FROM alert_dispatches d
1568
1490
  WHERE d.user_id = s.user_id
1569
- AND d.alert_key = ${cE}
1570
- AND d.last_dispatched_at > now() - make_interval(hours => ${bU})
1491
+ AND d.alert_key = ${YS}
1492
+ AND d.last_dispatched_at > now() - make_interval(hours => ${j1})
1571
1493
  )
1572
1494
  RETURNING user_id, id, last_state->>'message' AS message
1573
- `);e.length>0&&console.log(`[capture-staleness] dispatched stale-capture alert for ${e.length} user(s)`);for(let t of e)try{await ua({userId:t.user_id,dispatchId:t.id,severity:"soft",message:t.message??"Session capture looks broken \u2014 check the proxy.",title:"Session capture issue"})}catch(n){console.error("[capture-staleness] bell mirror failed:",n instanceof Error?n.message:n)}return e.length}d(SU,"checkCaptureStalenessOnce");function dE(){let e=setTimeout(()=>{n()},9e4),t=setInterval(()=>{n()},IU);async function n(){try{await SU()}catch(r){console.error("[capture-staleness] check failed:",r instanceof Error?r.stack:r)}}return d(n,"runOnce"),{stop:d(()=>{clearTimeout(e),clearInterval(t)},"stop")}}d(dE,"startCaptureStalenessChecker");O();import{sql as uE}from"drizzle-orm";var AU=900*1e3,lE=6,pE=60,EU=uE`array['user_message','tool_call','tool_result']`;async function xU(){return[...await u.execute(uE`
1495
+ `);e.length>0&&console.log(`[capture-staleness] dispatched stale-capture alert for ${e.length} user(s)`);for(let t of e)try{await ua({userId:t.user_id,dispatchId:t.id,severity:"soft",message:t.message??"Session capture looks broken \u2014 check the proxy.",title:"Session capture issue"})}catch(n){console.error("[capture-staleness] bell mirror failed:",n instanceof Error?n.message:n)}return e.length}u(P1,"checkCaptureStalenessOnce");function XS(){let e=setTimeout(()=>{n()},9e4),t=setInterval(()=>{n()},N1);async function n(){try{await P1()}catch(r){console.error("[capture-staleness] check failed:",r instanceof Error?r.stack:r)}}return u(n,"runOnce"),{stop:u(()=>{clearTimeout(e),clearInterval(t)},"stop")}}u(XS,"startCaptureStalenessChecker");C();import{sql as QS}from"drizzle-orm";var D1=900*1e3,ZS=6,eA=60,O1=QS`array['user_message','tool_call','tool_result']`;async function C1(){return[...await d.execute(QS`
1574
1496
  WITH session_stats AS (
1575
1497
  SELECT s.id,
1576
1498
  s.external_session_id,
@@ -1578,10 +1500,10 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
1578
1500
  (
1579
1501
  SELECT MAX(timestamp) FROM session_events e
1580
1502
  WHERE e.session_id = s.id
1581
- AND e.event_type = ANY(${EU})
1503
+ AND e.event_type = ANY(${O1})
1582
1504
  ) AS last_hook_event
1583
1505
  FROM sessions s
1584
- WHERE s.started_at > now() - (${lE}::int * interval '1 hour')
1506
+ WHERE s.started_at > now() - (${ZS}::int * interval '1 hour')
1585
1507
  )
1586
1508
  SELECT ss.id AS "sessionId",
1587
1509
  ss.external_session_id AS "externalSessionId",
@@ -1592,8 +1514,8 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
1592
1514
  FROM session_stats ss
1593
1515
  JOIN context_snapshots cs ON cs.session_id = ss.id
1594
1516
  WHERE ss.last_hook_event IS NOT NULL
1595
- AND cs.captured_at > ss.last_hook_event + (${pE}::int * interval '1 second')
1517
+ AND cs.captured_at > ss.last_hook_event + (${eA}::int * interval '1 second')
1596
1518
  GROUP BY ss.id, ss.external_session_id, ss.tool
1597
1519
  HAVING COUNT(cs.id) > 0
1598
- `)]}d(xU,"auditPollutionOnce");function mE(){let e=setTimeout(()=>{n()},6e4),t=setInterval(()=>{n()},AU);async function n(){try{let r=await xU();if(r.length===0)return;for(let o of r)console.warn(`[pollution-auditor] suspected_pollution session_id=${o.sessionId} external_session_id=${o.externalSessionId??"(null)"} tool=${o.tool} polluted_snapshots=${o.pollutedSnapshots} first_polluted_at=${o.firstPollutedAt} last_polluted_at=${o.lastPollutedAt}`);console.warn(`[pollution-auditor] pass summary: ${r.length} sessions flagged (window=${lE}h, grace=${pE}s)`)}catch(r){console.error("[pollution-auditor] pass failed:",r instanceof Error?r.stack:r)}}return d(n,"runOnce"),{stop(){clearTimeout(e),clearInterval(t)}}}d(mE,"startPollutionAuditor");O();var kU=bp.dirname(TU(import.meta.url)),fE=bp.resolve(kU,"../../../.env.local");if(Ip.existsSync(fE))for(let e of Ip.readFileSync(fE,"utf-8").split(`
1599
- `)){let t=e.trim();if(!t||t.startsWith("#"))continue;let n=t.indexOf("=");if(n===-1)continue;let r=t.slice(0,n),o=t.slice(n+1);process.env[r]||(process.env[r]=o)}process.env.PG_APPLICATION_NAME||="rulemetric-api";var jU=Mp({serviceName:"rulemetric-api"});jU?console.log("[sentry] error capture enabled"):process.env.NODE_ENV==="production"&&console.log("[sentry] no SENTRY_DSN \u2014 error capture disabled");var Vh=jp({serviceName:"rulemetric-api"});console.log(Vh==="otlp"?`[otel] traces exporting to ${process.env.OTEL_EXPORTER_OTLP_ENDPOINT}`:Vh==="console"?"[otel] traces printing to stdout (set OTEL_EXPORTER_OTLP_ENDPOINT to ship to a backend)":Vh==="silent"?"[otel] traces enabled, span export OFF (OTEL_SPAN_EXPORT=none \u2014 no stdout span dump)":"[otel] disabled (TELEMETRY_ENABLED=false)");var NU=new Set(["CONNECT_TIMEOUT","ETIMEDOUT","ENOTFOUND","ECONNRESET","ECONNREFUSED","EAI_AGAIN","EPIPE"]);process.on("unhandledRejection",e=>{let t=ri(e);console.error(`[guard] unhandledRejection${t?` code=${t}`:""}: ${e instanceof Error?e.message:String(e)}`),rr(e,{tags:{source:"unhandledRejection",code:t??"unknown"}})});process.on("uncaughtException",e=>{let t=ri(e);if(t&&NU.has(t)){console.error(`[guard] uncaughtException (transient net code=${t}) \u2014 surviving: ${e.message}`),rr(e,{tags:{source:"uncaughtException",code:t}});return}console.error("[guard] uncaughtException (fatal):",e),rr(e,{tags:{source:"uncaughtException",code:t??"unknown"}}),Promise.allSettled([Sa(2e3),Za()]).finally(()=>process.exit(1))});var Jh=Number(process.env.API_PORT)||3e3;console.log(`RuleMetric API starting on port ${Jh}`);console.log(`[auth] JWT verification: ${process.env.SUPABASE_JWT_SECRET?"local (fast path)":"remote getUser (set SUPABASE_JWT_SECRET to enable fast path)"}`);{let e=cf();e.error&&console.warn(`[deployment] ${e.error}`);let t=process.env.DATABASE_URL?.match(/:(\d+)\/[^/]*$/)?.[1];e.mode==="local"?console.log(`[db] deployment=local (${e.source}) \u2014 direct postgres :${t??"?"}, pooler heuristics disabled`):console.log(`[db] deployment=cloud \u2014 pooler port ${t??"?"} \u2014 ${t==="6543"?"transaction mode (correct)":t==="5432"?"SESSION mode \u2014 WRONG for the always-on API (15-slot cap!)":"unknown"}`)}var hE,Vo=[],gE=!1;async function PU(){let e=RU({fetch:z.fetch,hostname:"0.0.0.0",port:Jh});hE=e,e.keepAliveTimeout=65e3,e.headersTimeout=66e3,console.log(`RuleMetric API running at http://localhost:${Jh} (keepAliveTimeout=65s)`),mw().then(t=>console.log(`[auth] JWKS prime ${t?"ok":"deferred (will fetch on first auth)"}`)),Vo.push(eE()),Vo.push(oE()),tl()&&zI(),fp()&&_A(),Vo.push(aE()),Vo.push(dE()),Vo.push(Rw()),Vo.push(mE()),Vo.push(...ZA)}d(PU,"start");PU().catch(e=>{console.error("Failed to start API:",e),rr(e,{tags:{phase:"boot",source:"start"}}),Promise.allSettled([Sa(2e3),Za()]).finally(()=>process.exit(1))});async function _E(){if(!gE){gE=!0;for(let e of Vo)try{e.stop()}catch{}try{hE?.close?.()}catch{}try{await VI(5e3)}catch{}try{await yA(5e3)}catch{}await Promise.allSettled([Np(),Sa(2e3),Za()]),process.exit(0)}}d(_E,"gracefulShutdown");process.on("SIGTERM",_E);process.on("SIGINT",_E);
1520
+ `)]}u(C1,"auditPollutionOnce");function tA(){let e=setTimeout(()=>{n()},6e4),t=setInterval(()=>{n()},D1);async function n(){try{let r=await C1();if(r.length===0)return;for(let o of r)console.warn(`[pollution-auditor] suspected_pollution session_id=${o.sessionId} external_session_id=${o.externalSessionId??"(null)"} tool=${o.tool} polluted_snapshots=${o.pollutedSnapshots} first_polluted_at=${o.firstPollutedAt} last_polluted_at=${o.lastPollutedAt}`);console.warn(`[pollution-auditor] pass summary: ${r.length} sessions flagged (window=${ZS}h, grace=${eA}s)`)}catch(r){console.error("[pollution-auditor] pass failed:",r instanceof Error?r.stack:r)}}return u(n,"runOnce"),{stop(){clearTimeout(e),clearInterval(t)}}}u(tA,"startPollutionAuditor");C();var $1=Im.dirname(L1(import.meta.url)),nA=Im.resolve($1,"../../../.env.local");if(vm.existsSync(nA))for(let e of vm.readFileSync(nA,"utf-8").split(`
1521
+ `)){let t=e.trim();if(!t||t.startsWith("#"))continue;let n=t.indexOf("=");if(n===-1)continue;let r=t.slice(0,n),o=t.slice(n+1);process.env[r]||(process.env[r]=o)}process.env.PG_APPLICATION_NAME||="rulemetric-api";var q1=Cm({serviceName:"rulemetric-api"});q1?console.log("[sentry] error capture enabled"):process.env.NODE_ENV==="production"&&console.log("[sentry] no SENTRY_DSN \u2014 error capture disabled");var Fh=km({serviceName:"rulemetric-api"});console.log(Fh==="otlp"?`[otel] traces exporting to ${process.env.OTEL_EXPORTER_OTLP_ENDPOINT}`:Fh==="console"?"[otel] traces printing to stdout (set OTEL_EXPORTER_OTLP_ENDPOINT to ship to a backend)":Fh==="silent"?"[otel] traces enabled, span export OFF (OTEL_SPAN_EXPORT=none \u2014 no stdout span dump)":"[otel] disabled (TELEMETRY_ENABLED=false)");var U1=new Set(["CONNECT_TIMEOUT","ETIMEDOUT","ENOTFOUND","ECONNRESET","ECONNREFUSED","EAI_AGAIN","EPIPE"]);process.on("unhandledRejection",e=>{let t=ri(e);console.error(`[guard] unhandledRejection${t?` code=${t}`:""}: ${e instanceof Error?e.message:String(e)}`),rr(e,{tags:{source:"unhandledRejection",code:t??"unknown"}})});process.on("uncaughtException",e=>{let t=ri(e);if(t&&U1.has(t)){console.error(`[guard] uncaughtException (transient net code=${t}) \u2014 surviving: ${e.message}`),rr(e,{tags:{source:"uncaughtException",code:t}});return}console.error("[guard] uncaughtException (fatal):",e),rr(e,{tags:{source:"uncaughtException",code:t??"unknown"}}),Promise.allSettled([ba(2e3),Qa()]).finally(()=>process.exit(1))});var Wh=Number(process.env.API_PORT)||3e3;console.log(`RuleMetric API starting on port ${Wh}`);console.log(`[auth] JWT verification: ${process.env.SUPABASE_JWT_SECRET?"local (fast path)":"remote getUser (set SUPABASE_JWT_SECRET to enable fast path)"}`);{let e=of();e.error&&console.warn(`[deployment] ${e.error}`);let t=process.env.DATABASE_URL?.match(/:(\d+)\/[^/]*$/)?.[1];e.mode==="local"?console.log(`[db] deployment=local (${e.source}) \u2014 direct postgres :${t??"?"}, pooler heuristics disabled`):console.log(`[db] deployment=cloud \u2014 pooler port ${t??"?"} \u2014 ${t==="6543"?"transaction mode (correct)":t==="5432"?"SESSION mode \u2014 WRONG for the always-on API (15-slot cap!)":"unknown"}`)}var oA,zo=[],rA=!1;async function H1(){let e=M1({fetch:J.fetch,hostname:"0.0.0.0",port:Wh});oA=e,e.keepAliveTimeout=65e3,e.headersTimeout=66e3,console.log(`RuleMetric API running at http://localhost:${Wh} (keepAliveTimeout=65s)`),lw().then(t=>console.log(`[auth] JWKS prime ${t?"ok":"deferred (will fetch on first auth)"}`)),zo.push(BS()),zo.push(VS()),el()&&Dv(),pm()&&sS(),zo.push(GS()),zo.push(XS()),zo.push(xw()),zo.push(tA()),zo.push(...HS)}u(H1,"start");H1().catch(e=>{console.error("Failed to start API:",e),rr(e,{tags:{phase:"boot",source:"start"}}),Promise.allSettled([ba(2e3),Qa()]).finally(()=>process.exit(1))});async function sA(){if(!rA){rA=!0;for(let e of zo)try{e.stop()}catch{}try{oA?.close?.()}catch{}try{await Ov(5e3)}catch{}try{await iS(5e3)}catch{}await Promise.allSettled([Nm(),ba(2e3),Qa()]),process.exit(0)}}u(sA,"gracefulShutdown");process.on("SIGTERM",sA);process.on("SIGINT",sA);