@rulemetric/local 0.12.2 → 0.12.4

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 W_=Object.defineProperty;var c=(e,t)=>W_(e,"name",{value:t,configurable:!0}),pm=(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 G=(e,t)=>()=>(e&&(t=e(e=0)),t);var co=(e,t)=>{for(var n in t)W_(e,n,{get:t[n],enumerable:!0})};import{pgTable as Zu,text as ei,timestamp as za,jsonb as K_,uuid as rs,primaryKey as G_}from"drizzle-orm/pg-core";var Y,X,ee,we,os=G(()=>{"use strict";Y=Zu("organizations",{id:rs("id").primaryKey().defaultRandom(),name:ei("name").unique().notNull(),slug:ei("slug").unique().notNull(),metadata:K_("metadata"),createdAt:za("created_at",{withTimezone:!0}).defaultNow(),updatedAt:za("updated_at",{withTimezone:!0}).defaultNow()}),X=Zu("teams",{id:rs("id").primaryKey().defaultRandom(),orgId:rs("org_id").references(()=>Y.id,{onDelete:"cascade"}),name:ei("name").notNull(),slug:ei("slug").notNull(),metadata:K_("metadata"),createdAt:za("created_at",{withTimezone:!0}).defaultNow()}),ee=Zu("user_organizations",{userId:rs("user_id").notNull(),orgId:rs("org_id").references(()=>Y.id,{onDelete:"cascade"}).notNull(),role:ei("role").notNull().default("member"),createdAt:za("created_at",{withTimezone:!0}).defaultNow()},e=>[G_({columns:[e.userId,e.orgId]})]),we=Zu("user_teams",{userId:rs("user_id").notNull(),teamId:rs("team_id").references(()=>X.id,{onDelete:"cascade"}).notNull(),role:ei("role").notNull().default("member"),createdAt:za("created_at",{withTimezone:!0}).defaultNow()},e=>[G_({columns:[e.userId,e.teamId]})])});import{boolean as ed,integer as Va,pgTable as qS,real as Y_,text as td,timestamp as vm,uuid as X_}from"drizzle-orm/pg-core";var T,Yt=G(()=>{"use strict";os();T=qS("profiles",{id:X_("id").primaryKey(),email:td("email"),displayName:td("display_name"),activeOrgId:X_("active_org_id").references(()=>Y.id,{onDelete:"set null"}),isSuperadmin:ed("is_superadmin").notNull().default(!1),claudeCodePlan:td("claude_code_plan"),planSource:td("plan_source").notNull().default("detected"),setupCompletedAt:vm("setup_completed_at",{withTimezone:!0}),liveSendSkipped:ed("live_send_skipped").notNull().default(!1),autoAcceptSuggestions:ed("auto_accept_suggestions").notNull().default(!0),evolutionPaused:ed("evolution_paused").notNull().default(!1),suggestionConfidenceThreshold:Y_("suggestion_confidence_threshold").notNull().default(.7),autoAcceptMinScore:Y_("auto_accept_min_score"),autoAcceptMaxPerRun:Va("auto_accept_max_per_run"),autoAcceptMaxPerWindow:Va("auto_accept_max_per_window"),autoAcceptWindowDays:Va("auto_accept_window_days"),trialMaxConcurrent:Va("trial_max_concurrent"),trialMaxPerRun:Va("trial_max_per_run"),createdAt:vm("created_at",{withTimezone:!0}).defaultNow(),updatedAt:vm("updated_at",{withTimezone:!0}).defaultNow()})});import{pgTable as US,text as Im,timestamp as nd,uuid as rd,index as Q_}from"drizzle-orm/pg-core";var ae,Z_=G(()=>{"use strict";os();Yt();ae=US("org_invitations",{id:rd("id").primaryKey().defaultRandom(),orgId:rd("org_id").notNull().references(()=>Y.id,{onDelete:"cascade"}),email:Im("email").notNull(),role:Im("role").notNull().default("member"),teamId:rd("team_id").references(()=>X.id,{onDelete:"set null"}),invitedBy:rd("invited_by").notNull().references(()=>T.id,{onDelete:"cascade"}),token:Im("token").notNull().unique(),expiresAt:nd("expires_at",{withTimezone:!0}).notNull(),acceptedAt:nd("accepted_at",{withTimezone:!0}),revokedAt:nd("revoked_at",{withTimezone:!0}),createdAt:nd("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Q_("idx_org_invitations_token").on(e.token),Q_("idx_org_invitations_org").on(e.orgId)])});import{pgTable as bm,text as en,timestamp as uo,jsonb as od,uuid as _r,integer as sd,boolean as HS,uniqueIndex as id,index as Ja}from"drizzle-orm/pg-core";var g,yr,xe,Sn=G(()=>{"use strict";g=bm("instructions",{id:_r("id").primaryKey().defaultRandom(),name:en("name").notNull(),description:en("description").notNull(),type:en("type").notNull().default("instruction"),scope:en("scope").notNull(),scopeRef:_r("scope_ref"),version:en("version").notNull(),content:en("content").notNull(),frontmatter:od("frontmatter").notNull(),slots:od("slots"),tags:en("tags").array(),compatibility:en("compatibility").array(),createdBy:_r("created_by"),createdAt:uo("created_at",{withTimezone:!0}).defaultNow(),updatedAt:uo("updated_at",{withTimezone:!0}).defaultNow(),archived:HS("archived").default(!1),archivedAt:uo("archived_at",{withTimezone:!0}),archivedBy:_r("archived_by"),forkedFromId:_r("forked_from_id").references(()=>g.id,{onDelete:"set null"}),upstreamVersion:en("upstream_version"),badge:en("badge"),contentHash:en("content_hash"),contextIdentity:en("context_identity"),scanScore:sd("scan_score"),scanFindings:od("scan_findings"),popularityScore:sd("popularity_score"),sourceUpdatedAt:uo("source_updated_at",{withTimezone:!0})},e=>[id("instructions_name_scope_ref_idx").on(e.name,e.scope,e.scopeRef),Ja("idx_instructions_scope").on(e.scope,e.scopeRef),Ja("idx_instructions_created_by").on(e.createdBy),Ja("idx_instructions_context_identity").on(e.createdBy,e.contextIdentity),Ja("idx_instructions_public_recency").on(e.scope,e.sourceUpdatedAt.desc())]),yr=bm("instruction_version_identities",{id:_r("id").primaryKey().defaultRandom(),instructionId:_r("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),contentHash:en("content_hash").notNull(),versionOrdinal:sd("version_ordinal").notNull(),content:en("content"),firstSeenAt:uo("first_seen_at",{withTimezone:!0}).notNull().defaultNow(),lastSeenAt:uo("last_seen_at",{withTimezone:!0}).notNull().defaultNow(),createdAt:uo("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[id("instruction_version_identities_hash_unique").on(e.instructionId,e.contentHash),id("instruction_version_identities_ordinal_unique").on(e.instructionId,e.versionOrdinal),Ja("idx_ivi_instruction").on(e.instructionId)]),xe=bm("instruction_versions",{id:_r("id").primaryKey().defaultRandom(),instructionId:_r("instruction_id").references(()=>g.id,{onDelete:"cascade"}),versionNumber:sd("version_number").notNull(),content:en("content").notNull(),frontmatter:od("frontmatter").notNull(),changeSummary:en("change_summary"),createdBy:_r("created_by"),createdAt:uo("created_at",{withTimezone:!0}).defaultNow()},e=>[id("instruction_versions_instruction_version_idx").on(e.instructionId,e.versionNumber)])});import{pgTable as BS,text as FS,timestamp as WS,jsonb as zS,uuid as Em,index as ey}from"drizzle-orm/pg-core";var Ut,ty=G(()=>{"use strict";Sn();Ut=BS("instruction_events",{id:Em("id").primaryKey().defaultRandom(),instructionId:Em("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),eventType:FS("event_type").notNull(),actorId:Em("actor_id").notNull(),metadata:zS("metadata"),createdAt:WS("created_at",{withTimezone:!0}).defaultNow()},e=>[ey("idx_instruction_events_instruction").on(e.instructionId),ey("idx_instruction_events_type").on(e.eventType)])});import{boolean as VS,jsonb as JS,pgTable as Sm,primaryKey as ny,text as ss,timestamp as Ka,uniqueIndex as Am,uuid as is}from"drizzle-orm/pg-core";import{sql as KS}from"drizzle-orm";var C,lt,ye,wr=G(()=>{"use strict";os();Sn();C=Sm("projects",{id:is("id").primaryKey().defaultRandom(),orgId:is("org_id").references(()=>Y.id,{onDelete:"cascade"}),name:ss("name").notNull(),description:ss("description"),githubRepo:ss("github_repo"),gitRemoteUrl:ss("git_remote_url"),gitRootCommit:ss("git_root_commit"),gitRemoteAliases:ss("git_remote_aliases").array().notNull().default([]),metadata:JS("metadata"),createdBy:is("created_by"),createdAt:Ka("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Ka("updated_at",{withTimezone:!0}).defaultNow()},e=>[Am("projects_org_name_idx").on(e.orgId,e.name),Am("projects_git_remote_url_unique").on(e.gitRemoteUrl).where(KS`${e.gitRemoteUrl} IS NOT NULL`)]),lt=Sm("project_instructions",{projectId:is("project_id").references(()=>C.id,{onDelete:"cascade"}).notNull(),instructionId:is("instruction_id").references(()=>g.id,{onDelete:"cascade"}).notNull(),addedAt:Ka("added_at",{withTimezone:!0}).defaultNow(),addedBy:is("added_by")},e=>[ny({columns:[e.projectId,e.instructionId]})]),ye=Sm("project_checkouts",{projectId:is("project_id").references(()=>C.id,{onDelete:"cascade"}).notNull(),path:ss("path").notNull(),isWorktree:VS("is_worktree").notNull().default(!1),firstSeen:Ka("first_seen",{withTimezone:!0}).notNull().defaultNow(),lastSeen:Ka("last_seen",{withTimezone:!0}).notNull().defaultNow()},e=>[ny({columns:[e.projectId,e.path]}),Am("project_checkouts_path_unique").on(e.path)])});import{pgTable as GS,text as ti,timestamp as xm,jsonb as ry,uuid as ad,integer as YS,boolean as XS,index as Tm}from"drizzle-orm/pg-core";var Z,cd=G(()=>{"use strict";Yt();os();wr();Z=GS("agent_runs",{id:ad("id").primaryKey().defaultRandom(),userId:ad("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),orgId:ad("org_id").references(()=>Y.id,{onDelete:"set null"}),projectId:ad("project_id").references(()=>C.id,{onDelete:"set null"}),projectPath:ti("project_path"),gitRemote:ti("git_remote"),baseBranch:ti("base_branch"),title:ti("title"),prompt:ti("prompt"),toolSpec:ry("tool_spec").notNull().default([]),autoWorktree:XS("auto_worktree").notNull().default(!0),status:ti("status").notNull().default("pending"),sessionCount:YS("session_count").notNull().default(0),metadata:ry("metadata").notNull().default({}),createdAt:xm("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:xm("updated_at",{withTimezone:!0}).notNull().defaultNow(),completedAt:xm("completed_at",{withTimezone:!0})},e=>[Tm("idx_agent_runs_user").on(e.userId),Tm("idx_agent_runs_org_created").on(e.orgId,e.createdAt),Tm("idx_agent_runs_project").on(e.projectId)])});import{pgTable as Rm,text as xn,timestamp as Ga,jsonb as as,uuid as Br,integer as ud,uniqueIndex as oy,index as vr}from"drizzle-orm/pg-core";var y,ze,se,ni=G(()=>{"use strict";Sn();wr();Yt();os();cd();y=Rm("sessions",{id:Br("id").primaryKey().defaultRandom(),userId:Br("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),externalSessionId:xn("external_session_id"),projectId:Br("project_id").references(()=>C.id,{onDelete:"set null"}),orgId:Br("org_id").references(()=>Y.id,{onDelete:"set null"}),tool:xn("tool").notNull(),projectPath:xn("project_path"),gitBranch:xn("git_branch"),startedAt:Ga("started_at",{withTimezone:!0}).notNull(),endedAt:Ga("ended_at",{withTimezone:!0}),eventCount:ud("event_count").default(0),tokenUsage:as("token_usage"),analysis:as("analysis"),analyzedAt:Ga("analyzed_at",{withTimezone:!0}),analyzedEventCount:ud("analyzed_event_count"),analyzedTurnCount:ud("analyzed_turn_count"),metadata:as("metadata").default({}),origin:xn("origin").notNull().default("unknown"),runId:Br("run_id").references(()=>Z.id,{onDelete:"set null"}),model:xn("model"),harnessVersion:xn("harness_version"),createdAt:Ga("created_at",{withTimezone:!0}).defaultNow()},e=>[vr("idx_sessions_user").on(e.userId),vr("idx_sessions_tool").on(e.tool),vr("idx_sessions_started_at").on(e.startedAt),vr("idx_sessions_project").on(e.projectId),vr("idx_sessions_org_started_at").on(e.orgId,e.startedAt),vr("idx_sessions_run").on(e.runId),oy("idx_sessions_user_external").on(e.userId,e.externalSessionId)]),ze=Rm("session_events",{id:Br("id").primaryKey().defaultRandom(),sessionId:Br("session_id").notNull().references(()=>y.id,{onDelete:"cascade"}),sequence:ud("sequence").notNull(),eventType:xn("event_type").notNull(),content:xn("content"),toolName:xn("tool_name"),toolInput:as("tool_input"),toolOutput:as("tool_output"),tokenUsage:as("token_usage"),model:xn("model"),timestamp:Ga("timestamp",{withTimezone:!0}).notNull(),metadata:as("metadata").default({})},e=>[oy("session_events_session_sequence_idx").on(e.sessionId,e.sequence),vr("idx_session_events_session_id").on(e.sessionId),vr("idx_session_events_event_type").on(e.eventType),vr("idx_session_events_model").on(e.model)]),se=Rm("session_instructions",{sessionId:Br("session_id").notNull().references(()=>y.id,{onDelete:"cascade"}),instructionId:Br("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),linkMethod:xn("link_method").notNull(),contentHash:xn("content_hash")},e=>[vr("idx_session_instructions_instruction_id").on(e.instructionId)])});import{pgTable as sy,text as dd,timestamp as iy,uuid as Ir,integer as ay,index as ri,unique as QS}from"drizzle-orm/pg-core";var Lt,ne,cy=G(()=>{"use strict";Yt();wr();ni();Lt=sy("treatment_assignments",{id:Ir("id").primaryKey().defaultRandom(),userId:Ir("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),treatmentType:dd("treatment_type").notNull(),treatmentId:Ir("treatment_id").notNull(),treatmentVersion:ay("treatment_version").notNull().default(1),projectId:Ir("project_id").references(()=>C.id,{onDelete:"set null"}),assignedBy:Ir("assigned_by").references(()=>T.id,{onDelete:"set null"}),method:dd("method").notNull(),assignedAt:iy("assigned_at",{withTimezone:!0}).notNull().defaultNow()},e=>[ri("idx_treatment_assignments_user").on(e.userId),ri("idx_treatment_assignments_treatment").on(e.treatmentType,e.treatmentId),ri("idx_treatment_assignments_project").on(e.projectId)]),ne=sy("treatment_exposures",{id:Ir("id").primaryKey().defaultRandom(),sessionId:Ir("session_id").notNull().references(()=>y.id,{onDelete:"cascade"}),userId:Ir("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),treatmentType:dd("treatment_type").notNull(),treatmentId:Ir("treatment_id").notNull(),treatmentVersion:ay("treatment_version").notNull().default(1),assignmentId:Ir("assignment_id").references(()=>Lt.id,{onDelete:"set null"}),method:dd("method").notNull(),exposedAt:iy("exposed_at",{withTimezone:!0}).notNull().defaultNow()},e=>[QS("treatment_exposures_unique").on(e.sessionId,e.treatmentType,e.treatmentId,e.treatmentVersion),ri("idx_treatment_exposures_treatment").on(e.treatmentType,e.treatmentId),ri("idx_treatment_exposures_user").on(e.userId),ri("idx_treatment_exposures_session").on(e.sessionId)])});import{pgTable as ZS,text as km,timestamp as ex,uuid as ld,integer as tx,index as uy,uniqueIndex as nx}from"drizzle-orm/pg-core";var pd,dy=G(()=>{"use strict";Yt();wr();pd=ZS("pending_treatment_exposures",{id:ld("id").primaryKey().defaultRandom(),userId:ld("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),externalSessionId:km("external_session_id").notNull(),treatmentType:km("treatment_type").notNull(),treatmentId:ld("treatment_id").notNull(),treatmentVersion:tx("treatment_version").notNull().default(1),method:km("method").notNull().default("injected"),projectId:ld("project_id").references(()=>C.id,{onDelete:"set null"}),createdAt:ex("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[nx("pending_treatment_exposures_unique").on(e.externalSessionId,e.treatmentType,e.treatmentId,e.treatmentVersion),uy("idx_pending_treatment_exposures_ext").on(e.externalSessionId),uy("idx_pending_treatment_exposures_user").on(e.userId)])});import{pgTable as ly,text as lo,timestamp as py,uuid as oi,numeric as rx,index as Nm,unique as ox}from"drizzle-orm/pg-core";var $,Fr,jm=G(()=>{"use strict";Yt();Sn();$=ly("instruction_experiments",{id:oi("id").primaryKey().defaultRandom(),userId:oi("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),instructionId:oi("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),projectPath:lo("project_path").notNull(),status:lo("status").notNull().default("running"),treatedShare:rx("treated_share").notNull().default("0.5"),salt:lo("salt").notNull(),contentHash:lo("content_hash"),source:lo("source").notNull().default("manual"),stoppedReason:lo("stopped_reason"),createdAt:py("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Nm("idx_instruction_experiments_lookup").on(e.userId,e.projectPath)]),Fr=ly("instruction_experiment_arms",{id:oi("id").primaryKey().defaultRandom(),experimentId:oi("experiment_id").notNull().references(()=>$.id,{onDelete:"cascade"}),userId:oi("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),externalSessionId:lo("external_session_id").notNull(),arm:lo("arm").notNull(),assignedAt:py("assigned_at",{withTimezone:!0}).notNull().defaultNow()},e=>[ox("instruction_experiment_arms_unique").on(e.experimentId,e.externalSessionId),Nm("idx_instruction_experiment_arms_experiment").on(e.experimentId,e.arm),Nm("idx_instruction_experiment_arms_session").on(e.externalSessionId)])});import{pgTable as sx,text as Pm,timestamp as ix,uuid as md,numeric as Dm,integer as my,jsonb as ax,index as cx,unique as ux}from"drizzle-orm/pg-core";var Q,fy=G(()=>{"use strict";Yt();Sn();jm();Q=sx("instruction_verdicts",{id:md("id").primaryKey().defaultRandom(),userId:md("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),instructionId:md("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),contentHash:Pm("content_hash").notNull(),projectPath:Pm("project_path").notNull(),segment:ax("segment").notNull().default({}),decision:Pm("decision").notNull(),delta:Dm("delta").notNull(),ciLower:Dm("ci_lower").notNull(),ciUpper:Dm("ci_upper").notNull(),nTreated:my("n_treated").notNull(),nControl:my("n_control").notNull(),experimentId:md("experiment_id").references(()=>$.id,{onDelete:"set null"}),decidedAt:ix("decided_at",{withTimezone:!0}).notNull().defaultNow()},e=>[ux("instruction_verdicts_unique").on(e.instructionId,e.contentHash,e.projectPath),cx("idx_instruction_verdicts_render").on(e.userId,e.projectPath)])});import{pgTable as dx,text as fd,timestamp as Om,uuid as Cm,integer as lx,unique as px,index as mx}from"drizzle-orm/pg-core";var Te,gy=G(()=>{"use strict";Yt();Te=dx("insight_recommendation_log",{id:Cm("id").primaryKey().defaultRandom(),userId:Cm("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),projectPath:fd("project_path").notNull().default(""),category:fd("category").notNull(),contentHash:fd("content_hash").notNull(),label:fd("label").notNull().default(""),firstSeenAt:Om("first_seen_at",{withTimezone:!0}).notNull().defaultNow(),lastSeenAt:Om("last_seen_at",{withTimezone:!0}).notNull().defaultNow(),timesGenerated:lx("times_generated").notNull().default(1),lastJobId:Cm("last_job_id"),dismissedAt:Om("dismissed_at",{withTimezone:!0})},e=>[px("insight_recommendation_log_unique").on(e.userId,e.projectPath,e.contentHash),mx("idx_insight_recommendation_log_read").on(e.userId,e.projectPath)])});import{pgTable as fx,text as si,timestamp as Lm,uuid as Ya,integer as hy,index as gd}from"drizzle-orm/pg-core";var F,Mm=G(()=>{"use strict";Yt();wr();F=fx("memories",{id:Ya("id").primaryKey().defaultRandom(),userId:Ya("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),orgId:Ya("org_id"),projectId:Ya("project_id").references(()=>C.id,{onDelete:"set null"}),version:hy("version").notNull().default(1),parentId:Ya("parent_id").references(()=>F.id,{onDelete:"set null"}),kind:si("kind").notNull(),title:si("title").notNull(),body:si("body").notNull(),source:si("source").notNull(),status:si("status").notNull().default("active"),trustClass:si("trust_class"),trustVersion:hy("trust_version"),trustComputedAt:Lm("trust_computed_at",{withTimezone:!0}),createdAt:Lm("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:Lm("updated_at",{withTimezone:!0}).notNull().defaultNow()},e=>[gd("idx_memories_user").on(e.userId),gd("idx_memories_project").on(e.projectId),gd("idx_memories_parent").on(e.parentId),gd("idx_memories_user_status").on(e.userId,e.status)])});import{pgTable as gx,text as Xa,timestamp as $m,uuid as qm,integer as _y,jsonb as hx,index as yy}from"drizzle-orm/pg-core";var Mt,wy=G(()=>{"use strict";Yt();Mm();Mt=gx("memory_experiments",{id:qm("id").primaryKey().defaultRandom(),memoryId:qm("memory_id").notNull().references(()=>F.id,{onDelete:"cascade"}),userId:qm("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),memoryVersion:_y("memory_version").notNull().default(1),taskPrompt:Xa("task_prompt").notNull(),expectations:Xa("expectations").array().notNull().default([]),trials:_y("trials").notNull().default(10),model:Xa("model"),status:Xa("status").notNull().default("pending"),result:hx("result").$type(),error:Xa("error"),createdAt:$m("created_at",{withTimezone:!0}).notNull().defaultNow(),startedAt:$m("started_at",{withTimezone:!0}),completedAt:$m("completed_at",{withTimezone:!0})},e=>[yy("idx_memory_experiments_memory").on(e.memoryId),yy("idx_memory_experiments_user").on(e.userId)])});import{pgTable as _x,text as ii,timestamp as Um,uuid as Hm,jsonb as yx,uniqueIndex as wx,index as vy}from"drizzle-orm/pg-core";var Ze,Bm=G(()=>{"use strict";Yt();ni();Ze=_x("session_terminal_targets",{id:Hm("id").primaryKey().defaultRandom(),userId:Hm("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),sessionId:Hm("session_id").references(()=>y.id,{onDelete:"set null"}),externalSessionId:ii("external_session_id"),kind:ii("kind").notNull(),target:ii("target").notNull(),status:ii("status").notNull().default("active"),attachCommand:ii("attach_command").notNull(),projectPath:ii("project_path"),metadata:yx("metadata").notNull().default({}),lastSeenAt:Um("last_seen_at",{withTimezone:!0}).defaultNow(),createdAt:Um("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Um("updated_at",{withTimezone:!0}).defaultNow()},e=>[wx("idx_session_terminal_targets_user_target").on(e.userId,e.target),vy("idx_session_terminal_targets_session").on(e.sessionId),vy("idx_session_terminal_targets_user_status").on(e.userId,e.status)])});import{boolean as vx,index as hd,jsonb as Iy,pgTable as Ix,text as cs,timestamp as Qa,uuid as _d,integer as by}from"drizzle-orm/pg-core";var yd,Ey=G(()=>{"use strict";ni();Bm();yd=Ix("session_send_jobs",{id:_d("id").primaryKey().defaultRandom(),userId:_d("user_id").notNull(),sessionId:_d("session_id").notNull().references(()=>y.id,{onDelete:"cascade"}),terminalTargetId:_d("terminal_target_id").references(()=>Ze.id,{onDelete:"set null"}),target:cs("target").notNull(),message:cs("message").notNull(),submit:vx("submit").notNull().default(!0),delivery:cs("delivery").notNull().default("live"),status:cs("status").notNull().default("pending"),result:Iy("result"),error:cs("error"),attempts:by("attempts").notNull().default(0),taskKind:cs("task_kind"),payload:Iy("payload"),claimedBy:cs("claimed_by"),claimedAt:Qa("claimed_at",{withTimezone:!0}),leaseExpiresAt:Qa("lease_expires_at",{withTimezone:!0}),leaseRecoveries:by("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=>[hd("idx_session_send_jobs_user").on(e.userId),hd("idx_session_send_jobs_session").on(e.sessionId),hd("idx_session_send_jobs_status").on(e.status),hd("idx_session_send_jobs_pending").on(e.userId,e.status)])});import{pgTable as Sy,text as us,timestamp as wd,jsonb as xy,uuid as po,integer as bx,boolean as Ex,uniqueIndex as Ax,index as Ay,primaryKey as Sx}from"drizzle-orm/pg-core";var Ue,Me,Ty=G(()=>{"use strict";Sn();Ue=Sy("packs",{id:po("id").primaryKey().defaultRandom(),name:us("name").notNull(),description:us("description").notNull(),scope:us("scope").notNull(),scopeRef:po("scope_ref"),version:us("version").notNull().default("1.0.0"),tags:us("tags").array(),badge:us("badge"),metadata:xy("metadata"),createdBy:po("created_by"),createdAt:wd("created_at",{withTimezone:!0}).defaultNow(),updatedAt:wd("updated_at",{withTimezone:!0}).defaultNow(),archived:Ex("archived").default(!1),archivedAt:wd("archived_at",{withTimezone:!0}),archivedBy:po("archived_by"),forkedFromId:po("forked_from_id").references(()=>Ue.id,{onDelete:"set null"}),upstreamVersion:us("upstream_version")},e=>[Ax("packs_name_scope_ref_idx").on(e.name,e.scope,e.scopeRef),Ay("idx_packs_scope").on(e.scope,e.scopeRef),Ay("idx_packs_created_by").on(e.createdBy)]),Me=Sy("pack_instructions",{packId:po("pack_id").references(()=>Ue.id,{onDelete:"cascade"}).notNull(),instructionId:po("instruction_id").references(()=>g.id,{onDelete:"cascade"}).notNull(),position:bx("position").notNull().default(0),slotOverrides:xy("slot_overrides"),addedAt:wd("added_at",{withTimezone:!0}).defaultNow(),addedBy:po("added_by")},e=>[Sx({columns:[e.packId,e.instructionId]})])});import{pgTable as xx,text as Fm,timestamp as Tx,jsonb as Rx,uuid as Wm,index as ai}from"drizzle-orm/pg-core";var mo,Ry=G(()=>{"use strict";Sn();mo=xx("instruction_usage_events",{id:Wm("id").primaryKey().defaultRandom(),instructionId:Wm("instruction_id").references(()=>g.id,{onDelete:"set null"}),userId:Wm("user_id").notNull(),surface:Fm("surface").notNull(),action:Fm("action").notNull(),metadata:Rx("metadata"),traceId:Fm("trace_id"),createdAt:Tx("created_at",{withTimezone:!0}).defaultNow()},e=>[ai("idx_usage_events_instruction").on(e.instructionId),ai("idx_usage_events_user").on(e.userId),ai("idx_usage_events_surface").on(e.surface),ai("idx_usage_events_action").on(e.action),ai("idx_usage_events_created_at").on(e.createdAt),ai("idx_usage_events_user_created").on(e.userId,e.createdAt)])});import{pgTable as kx,text as vd,timestamp as ky,jsonb as Nx,uuid as Ny,index as zm}from"drizzle-orm/pg-core";var fe,jy=G(()=>{"use strict";fe=kx("worker_connections",{id:Ny("id").primaryKey().defaultRandom(),userId:Ny("user_id").notNull(),workerType:vd("worker_type").notNull().default("mcp"),clientName:vd("client_name").notNull(),clientVersion:vd("client_version"),workerVersion:vd("worker_version"),lastHeartbeat:ky("last_heartbeat",{withTimezone:!0}).notNull().defaultNow(),connectedAt:ky("connected_at",{withTimezone:!0}).notNull().defaultNow(),metadata:Nx("metadata")},e=>[zm("idx_worker_connections_user").on(e.userId),zm("idx_worker_connections_heartbeat").on(e.userId,e.lastHeartbeat),zm("idx_worker_connections_type").on(e.userId,e.workerType)])});import{pgTable as jx,text as Id,timestamp as Px,jsonb as Dx,uuid as Py,index as Dy}from"drizzle-orm/pg-core";var bd,Oy=G(()=>{"use strict";bd=jx("cli_setup_events",{id:Py("id").primaryKey().defaultRandom(),userId:Py("user_id").notNull(),deviceId:Id("device_id").notNull(),event:Id("event").notNull(),cliVersion:Id("cli_version"),os:Id("os"),props:Dx("props").notNull().default({}),createdAt:Px("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Dy("idx_cli_setup_events_user").on(e.userId,e.createdAt),Dy("idx_cli_setup_events_device").on(e.deviceId,e.createdAt)])});import{pgTable as Ox,text as ds,integer as Cx,boolean as Lx,timestamp as Mx,jsonb as $x,uuid as qx,index as Cy}from"drizzle-orm/pg-core";var Ed,Ly=G(()=>{"use strict";Ed=Ox("cli_error_events",{id:qx("id").primaryKey().defaultRandom(),deviceId:ds("device_id"),event:ds("event").notNull(),command:ds("command"),statusCode:Cx("status_code"),message:ds("message"),cliVersion:ds("cli_version"),os:ds("os"),nodeVersion:ds("node_version"),proxied:Lx("proxied"),props:$x("props").notNull().default({}),createdAt:Mx("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Cy("idx_cli_error_events_created").on(e.createdAt),Cy("idx_cli_error_events_device").on(e.deviceId,e.createdAt)])});import{sql as Vm}from"drizzle-orm";import{pgTable as ls,text as _t,timestamp as gn,jsonb as $n,uuid as pt,integer as Wr,boolean as Za,index as Ht,unique as My}from"drizzle-orm/pg-core";var k,Ee,Ie,ot,et,pe,rr,ec=G(()=>{"use strict";Sn();k=ls("eval_targets",{id:pt("id").primaryKey().defaultRandom(),userId:pt("user_id").notNull(),name:_t("name").notNull(),type:_t("type").notNull(),content:_t("content").notNull(),description:_t("description").notNull().default(""),metadata:$n("metadata").notNull().default({}),version:Wr("version").notNull().default(1),parentId:pt("parent_id").references(()=>k.id,{onDelete:"set null"}),instructionId:pt("instruction_id").references(()=>g.id,{onDelete:"set null"}),projectPath:_t("project_path"),createdAt:gn("created_at",{withTimezone:!0}).defaultNow(),updatedAt:gn("updated_at",{withTimezone:!0}).defaultNow()},e=>[Ht("eval_targets_name_user_idx").on(e.name,e.userId),Ht("idx_eval_targets_user").on(e.userId),Ht("idx_eval_targets_type").on(e.type),Ht("idx_eval_targets_parent").on(e.parentId),Ht("idx_eval_targets_instruction").on(e.instructionId).where(Vm`${e.instructionId} IS NOT NULL`),Ht("idx_eval_targets_project").on(e.projectPath).where(Vm`${e.projectPath} IS NOT NULL`)]),Ee=ls("evals",{id:pt("id").primaryKey().defaultRandom(),evalTargetId:pt("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),name:_t("name").notNull(),prompt:_t("prompt").notNull(),expectedOutput:_t("expected_output").notNull().default(""),files:$n("files").notNull().default([]),expectations:$n("expectations").notNull().default([]),retiredAt:gn("retired_at",{withTimezone:!0}),retiredReason:_t("retired_reason"),createdAt:gn("created_at",{withTimezone:!0}).defaultNow(),updatedAt:gn("updated_at",{withTimezone:!0}).defaultNow(),contentUpdatedAt:gn("content_updated_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Ht("idx_evals_target").on(e.evalTargetId),Ht("idx_evals_target_active").on(e.evalTargetId).where(Vm`${e.retiredAt} IS NULL`)]),Ie=ls("eval_runs",{id:pt("id").primaryKey().defaultRandom(),jobId:pt("job_id"),evalId:pt("eval_id").notNull().references(()=>Ee.id,{onDelete:"cascade"}),evalTargetId:pt("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),evalTargetVersion:Wr("eval_target_version").notNull(),configuration:_t("configuration").notNull(),runNumber:Wr("run_number").notNull().default(1),iteration:Wr("iteration").notNull().default(1),status:_t("status").notNull().default("completed"),outputs:$n("outputs").notNull().default({}),timing:$n("timing").notNull().default({}),grading:$n("grading").notNull().default({}),comparison:$n("comparison"),createdAt:gn("created_at",{withTimezone:!0}).defaultNow()},e=>[Ht("idx_eval_runs_eval").on(e.evalId),Ht("idx_eval_runs_target").on(e.evalTargetId),Ht("idx_eval_runs_iteration").on(e.evalTargetId,e.iteration)]),ot=ls("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:Wr("target_a_version").notNull(),targetBVersion:Wr("target_b_version").notNull(),isSwapped:Za("is_swapped").notNull().default(!1),winnerTargetId:pt("winner_target_id").references(()=>k.id,{onDelete:"set null"}),perEval:$n("per_eval").notNull().default([]),overall:$n("overall").notNull().default({}),rawOutput:_t("raw_output"),model:_t("model"),status:_t("status").notNull().default("completed"),createdAt:gn("created_at",{withTimezone:!0}).defaultNow()},e=>[Ht("idx_eval_comparisons_target_a").on(e.targetAId),Ht("idx_eval_comparisons_target_b").on(e.targetBId),Ht("idx_eval_comparisons_user").on(e.userId)]),et=ls("eval_grade_annotations",{id:pt("id").primaryKey().defaultRandom(),userId:pt("user_id").notNull(),evalRunId:pt("eval_run_id").notNull().references(()=>Ie.id,{onDelete:"cascade"}),evalTargetId:pt("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),expectationIndex:Wr("expectation_index").notNull(),expectationText:_t("expectation_text").notNull(),judgePassed:Za("judge_passed").notNull(),judgeMethod:_t("judge_method").notNull(),judgeModel:_t("judge_model"),verdict:_t("verdict").notNull(),flag:_t("flag"),note:_t("note"),createdAt:gn("created_at",{withTimezone:!0}).defaultNow(),updatedAt:gn("updated_at",{withTimezone:!0}).defaultNow()},e=>[Ht("idx_eval_grade_annotations_target").on(e.evalTargetId),Ht("idx_eval_grade_annotations_run").on(e.evalRunId),My("eval_grade_annotations_eval_run_id_expectation_index_key").on(e.evalRunId,e.expectationIndex)]),pe=ls("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(()=>Ie.id,{onDelete:"cascade"}),expectationIndex:Wr("expectation_index").notNull(),expectationText:_t("expectation_text").notNull(),judgePassed:Za("judge_passed").notNull(),humanPassed:Za("human_passed").notNull(),reviewerEngine:_t("reviewer_engine").notNull(),reviewerModel:_t("reviewer_model").notNull(),reviewerPassed:Za("reviewer_passed").notNull(),resolvedAt:gn("resolved_at",{withTimezone:!0}),resolution:_t("resolution"),createdAt:gn("created_at",{withTimezone:!0}).defaultNow(),updatedAt:gn("updated_at",{withTimezone:!0}).defaultNow()},e=>[Ht("idx_jrv_target").on(e.evalTargetId),My("judge_reviewer_verdicts_eval_run_id_expectation_index_review_key").on(e.evalRunId,e.expectationIndex,e.reviewerModel)]),rr=ls("benchmarks",{id:pt("id").primaryKey().defaultRandom(),evalTargetId:pt("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),iteration:Wr("iteration").notNull().default(1),runSummary:$n("run_summary").notNull().default({}),notes:$n("notes").notNull().default([]),feedback:$n("feedback"),createdAt:gn("created_at",{withTimezone:!0}).defaultNow()},e=>[Ht("idx_benchmarks_target").on(e.evalTargetId)])});import{sql as Jm}from"drizzle-orm";import{pgTable as Ux,text as zr,timestamp as Hx,jsonb as Ad,uuid as Sd,boolean as Bx,index as tc,uniqueIndex as Fx}from"drizzle-orm/pg-core";var ie,$y=G(()=>{"use strict";ec();Sn();ie=Ux("instruction_promotions",{id:Sd("id").primaryKey().defaultRandom(),userId:Sd("user_id").notNull(),evalTargetId:Sd("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),instructionId:Sd("instruction_id").references(()=>g.id,{onDelete:"set null"}),fromContentHash:zr("from_content_hash").notNull(),toContentHash:zr("to_content_hash").notNull(),fromContent:zr("from_content").notNull(),toContent:zr("to_content").notNull(),proposalSource:zr("proposal_source").notNull(),proposalRationale:zr("proposal_rationale").notNull().default(""),decision:zr("decision").notNull(),applied:Bx("applied").notNull().default(!1),refusals:Ad("refusals").notNull().default([]),rationale:zr("rationale").notNull().default(""),effectClass:zr("effect_class").notNull(),verdict:Ad("verdict").notNull().default({}),gates:Ad("gates").notNull().default({}),touchedSections:Ad("touched_sections").notNull().default([]),createdAt:Hx("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[tc("idx_instruction_promotions_budget").on(e.evalTargetId,e.createdAt.desc()).where(Jm`${e.applied}`),tc("idx_instruction_promotions_target").on(e.evalTargetId,e.createdAt.desc()),tc("idx_instruction_promotions_user").on(e.userId,e.createdAt.desc()),tc("idx_instruction_promotions_to_hash").on(e.toContentHash),Fx("uq_instruction_promotions_applied").on(e.evalTargetId,e.fromContentHash,e.toContentHash).where(Jm`${e.applied}`),tc("idx_instruction_promotions_applied_hash").on(e.toContentHash,e.createdAt.desc()).where(Jm`${e.applied}`)])});import{index as nc,integer as Wx,jsonb as zx,pgTable as Vx,text as Tn,timestamp as ci,uniqueIndex as Jx,uuid as rc}from"drizzle-orm/pg-core";var Re,qy=G(()=>{"use strict";Sn();wr();Re=Vx("recommendation_applications",{id:rc("id").primaryKey().defaultRandom(),userId:rc("user_id").notNull(),instructionId:rc("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),projectId:rc("project_id").references(()=>C.id,{onDelete:"set null"}),projectPath:Tn("project_path").notNull(),harness:Tn("harness").notNull(),targetPath:Tn("target_path").notNull(),status:Tn("status").notNull().default("proposed"),applyMode:Tn("apply_mode").notNull(),beforeHash:Tn("before_hash"),appliedHash:Tn("applied_hash"),appliedAt:ci("applied_at",{withTimezone:!0}),measurementStartedAt:ci("measurement_started_at",{withTimezone:!0}),measurementEndedAt:ci("measurement_ended_at",{withTimezone:!0}),verdict:Tn("verdict"),verdictDetail:Tn("verdict_detail"),revertedAt:ci("reverted_at",{withTimezone:!0}),boundaryClass:Tn("boundary_class"),targets:Tn("targets").array().notNull().default([]),inverse:zx("inverse"),requires:Tn("requires").array().notNull().default([]),provides:Tn("provides").array().notNull().default([]),applyBatchId:rc("apply_batch_id"),applySeq:Wx("apply_seq"),createdAt:ci("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:ci("updated_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Jx("uq_recommendation_applications_target").on(e.userId,e.instructionId,e.projectPath,e.harness,e.targetPath),nc("idx_recommendation_applications_user_status").on(e.userId,e.status,e.updatedAt.desc()),nc("idx_recommendation_applications_user_harness").on(e.userId,e.harness,e.updatedAt.desc()),nc("idx_recommendation_applications_project").on(e.projectId,e.updatedAt.desc()),nc("idx_recommendation_applications_batch").on(e.userId,e.applyBatchId,e.applySeq.desc()),nc("idx_recommendation_applications_requires").using("gin",e.requires)])});import{pgTable as Kx,text as fo,timestamp as Gx,jsonb as oc,uuid as Km,integer as Gm,real as Yx,index as sc,uniqueIndex as Uy}from"drizzle-orm/pg-core";var M,Hy=G(()=>{"use strict";ni();Yt();M=Kx("context_snapshots",{id:Km("id").primaryKey().defaultRandom(),sessionId:Km("session_id").references(()=>y.id,{onDelete:"cascade"}),userId:Km("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),sequence:Gm("sequence").notNull().default(0),provider:fo("provider").notNull(),model:fo("model").notNull(),systemPrompt:fo("system_prompt").notNull(),injectedInstructions:oc("injected_instructions").notNull().default([]),messagesSummary:oc("messages_summary").notNull(),tools:oc("tools").notNull().default([]),systemHash:fo("system_hash").notNull(),requestHash:fo("request_hash").notNull().default(""),toolsHash:fo("tools_hash"),injectedHash:fo("injected_hash"),messagesDelta:oc("messages_delta").default([]),messagesDeltaRef:fo("messages_delta_ref"),maxTokens:Gm("max_tokens"),temperature:Yx("temperature"),estimatedTokens:Gm("estimated_tokens"),capturedAt:Gx("captured_at",{withTimezone:!0}).notNull().defaultNow(),metadata:oc("metadata").default({})},e=>[sc("idx_context_snapshots_session").on(e.sessionId),sc("idx_context_snapshots_user").on(e.userId),sc("idx_context_snapshots_hash").on(e.systemHash),sc("idx_context_snapshots_request_hash").on(e.requestHash),Uy("idx_snapshots_session_request").on(e.sessionId,e.requestHash),Uy("idx_snapshots_session_sequence").on(e.sessionId,e.sequence),sc("idx_context_snapshots_user_session_captured").on(e.userId,e.sessionId,e.capturedAt.desc())])});import{pgTable as Xx,text as By,timestamp as Qx,jsonb as Zx,integer as eT,index as tT}from"drizzle-orm/pg-core";var Rn,Fy=G(()=>{"use strict";Rn=Xx("content_blobs",{hash:By("hash").primaryKey(),contentType:By("content_type").notNull(),content:Zx("content").notNull(),sizeBytes:eT("size_bytes").notNull().default(0),createdAt:Qx("created_at",{withTimezone:!0}).defaultNow()},e=>[tT("idx_content_blobs_type").on(e.contentType)])});import{pgTable as nT,text as xd,timestamp as ic,jsonb as Td,uuid as Ym,index as Rd,integer as Wy}from"drizzle-orm/pg-core";var je,zy=G(()=>{"use strict";ec();je=nT("eval_jobs",{id:Ym("id").primaryKey().defaultRandom(),userId:Ym("user_id").notNull(),evalTargetId:Ym("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),status:xd("status").notNull().default("pending"),config:Td("config").notNull().default({}),progress:Td("progress").notNull().default({}),result:Td("result"),error:xd("error"),attempts:Wy("attempts").notNull().default(0),taskKind:xd("task_kind"),payload:Td("payload"),claimedBy:xd("claimed_by"),claimedAt:ic("claimed_at",{withTimezone:!0}),leaseExpiresAt:ic("lease_expires_at",{withTimezone:!0}),leaseRecoveries:Wy("lease_recoveries").notNull().default(0),createdAt:ic("created_at",{withTimezone:!0}).defaultNow(),updatedAt:ic("updated_at",{withTimezone:!0}).defaultNow(),completedAt:ic("completed_at",{withTimezone:!0})},e=>[Rd("idx_eval_jobs_user").on(e.userId),Rd("idx_eval_jobs_target").on(e.evalTargetId),Rd("idx_eval_jobs_status").on(e.status),Rd("idx_eval_jobs_pending").on(e.userId,e.status)])});import{pgTable as rT,text as ac,timestamp as cc,jsonb as Vy,uuid as Jy,integer as Ky,index as Gy}from"drizzle-orm/pg-core";var Pe,Yy=G(()=>{"use strict";Pe=rT("agent_jobs",{id:Jy("id").primaryKey().defaultRandom(),userId:Jy("user_id").notNull(),taskKind:ac("task_kind").notNull(),status:ac("status").notNull().default("pending"),payload:Vy("payload").notNull(),dedupeKey:ac("dedupe_key"),result:Vy("result"),error:ac("error"),attempts:Ky("attempts").notNull().default(0),claimedBy:ac("claimed_by"),claimedAt:cc("claimed_at",{withTimezone:!0}),leaseExpiresAt:cc("lease_expires_at",{withTimezone:!0}),leaseRecoveries:Ky("lease_recoveries").notNull().default(0),createdAt:cc("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:cc("updated_at",{withTimezone:!0}).notNull().defaultNow(),completedAt:cc("completed_at",{withTimezone:!0})},e=>[Gy("idx_agent_jobs_claim").on(e.userId,e.status,e.taskKind,e.createdAt),Gy("idx_agent_jobs_dedupe").on(e.userId,e.taskKind,e.dedupeKey)])});import{pgTable as oT,text as uc,timestamp as dc,jsonb as kd,uuid as Xm,index as Nd,integer as Xy}from"drizzle-orm/pg-core";var z,Qy=G(()=>{"use strict";wr();z=oT("insights_jobs",{id:Xm("id").primaryKey().defaultRandom(),userId:Xm("user_id").notNull(),status:uc("status").notNull().default("pending"),projectPath:uc("project_path"),projectId:Xm("project_id").references(()=>C.id,{onDelete:"set null"}),config:kd("config").notNull().default({}),progress:kd("progress").notNull().default({}),result:kd("result"),error:uc("error"),attempts:Xy("attempts").notNull().default(0),taskKind:uc("task_kind"),payload:kd("payload"),claimedBy:uc("claimed_by"),claimedAt:dc("claimed_at",{withTimezone:!0}),leaseExpiresAt:dc("lease_expires_at",{withTimezone:!0}),leaseRecoveries:Xy("lease_recoveries").notNull().default(0),createdAt:dc("created_at",{withTimezone:!0}).defaultNow(),updatedAt:dc("updated_at",{withTimezone:!0}).defaultNow(),completedAt:dc("completed_at",{withTimezone:!0})},e=>[Nd("idx_insights_jobs_user").on(e.userId),Nd("idx_insights_jobs_status").on(e.status),Nd("idx_insights_jobs_pending").on(e.userId,e.status),Nd("idx_insights_jobs_project").on(e.projectId)])});import{pgTable as sT,text as Qm,timestamp as jd,uuid as Zy,index as iT,uniqueIndex as aT}from"drizzle-orm/pg-core";var Ae,ew=G(()=>{"use strict";Yt();Ae=sT("api_keys",{id:Zy("id").primaryKey().defaultRandom(),userId:Zy("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),name:Qm("name").notNull(),keyHash:Qm("key_hash").notNull(),keyPrefix:Qm("key_prefix").notNull(),lastUsedAt:jd("last_used_at",{withTimezone:!0}),expiresAt:jd("expires_at",{withTimezone:!0}),revokedAt:jd("revoked_at",{withTimezone:!0}),createdAt:jd("created_at",{withTimezone:!0}).defaultNow()},e=>[iT("idx_api_keys_user").on(e.userId),aT("idx_api_keys_hash").on(e.keyHash)])});import{pgTable as cT,text as Zm,timestamp as tw,uuid as uT,index as dT}from"drizzle-orm/pg-core";var qn,nw=G(()=>{"use strict";Yt();qn=cT("extension_auth_codes",{code:Zm("code").primaryKey(),userId:uT("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),editor:Zm("editor"),email:Zm("email"),expiresAt:tw("expires_at",{withTimezone:!0}).notNull(),createdAt:tw("created_at",{withTimezone:!0}).defaultNow()},e=>[dT("idx_ext_auth_codes_expiry").on(e.expiresAt)])});import{pgTable as lT,text as pT,timestamp as rw,jsonb as mT,uuid as ef,index as ow}from"drizzle-orm/pg-core";var He,sw=G(()=>{"use strict";ec();He=lT("eval_conversations",{id:ef("id").primaryKey().defaultRandom(),evalTargetId:ef("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),userId:ef("user_id").notNull(),messages:mT("messages").notNull().default([]),status:pT("status").notNull().default("active"),createdAt:rw("created_at",{withTimezone:!0}).defaultNow(),updatedAt:rw("updated_at",{withTimezone:!0}).defaultNow()},e=>[ow("idx_eval_conversations_target").on(e.evalTargetId),ow("idx_eval_conversations_user").on(e.userId)])});import{pgTable as fT,text as Vr,timestamp as iw,jsonb as gT,uuid as tf}from"drizzle-orm/pg-core";var go,aw=G(()=>{"use strict";go=fT("skill_submissions",{id:tf("id").primaryKey().defaultRandom(),skillId:Vr("skill_id").notNull(),name:Vr("name").notNull(),description:Vr("description").notNull(),category:Vr("category").notNull(),tools:Vr("tools").array().notNull(),tags:Vr("tags").array().default([]),content:Vr("content").notNull(),status:Vr("status").notNull().default("pending"),submittedBy:tf("submitted_by").notNull(),reviewedBy:tf("reviewed_by"),reviewNote:Vr("review_note"),metadata:gT("metadata"),createdAt:iw("created_at",{withTimezone:!0}).defaultNow(),updatedAt:iw("updated_at",{withTimezone:!0}).defaultNow()})});import{pgTable as hT,text as lc,timestamp as cw,jsonb as _T,uuid as yT,uniqueIndex as wT,index as uw}from"drizzle-orm/pg-core";var $t,dw=G(()=>{"use strict";$t=hT("harness_releases",{id:yT("id").primaryKey().defaultRandom(),harness:lc("harness").notNull(),version:lc("version").notNull(),publishedAt:cw("published_at",{withTimezone:!0}).notNull(),title:lc("title"),body:lc("body"),categories:_T("categories").default({}),url:lc("url"),createdAt:cw("created_at",{withTimezone:!0}).defaultNow()},e=>[wT("idx_harness_releases_unique").on(e.harness,e.version),uw("idx_harness_releases_harness").on(e.harness),uw("idx_harness_releases_published").on(e.publishedAt)])});import{pgTable as vT,text as ui,timestamp as lw,jsonb as IT,uuid as pw,index as mw,uniqueIndex as bT}from"drizzle-orm/pg-core";var Tt,fw=G(()=>{"use strict";Tt=vT("notifications",{id:pw("id").primaryKey().defaultRandom(),userId:pw("user_id").notNull(),type:ui("type").notNull(),title:ui("title").notNull(),body:ui("body"),url:ui("url"),sourceTable:ui("source_table"),sourceId:ui("source_id"),metadata:IT("metadata").notNull().default({}),readAt:lw("read_at",{withTimezone:!0}),createdAt:lw("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[mw("idx_notifications_user_created").on(e.userId,e.createdAt),mw("idx_notifications_user_unread").on(e.userId),bT("idx_notifications_source_dedup").on(e.userId,e.sourceTable,e.sourceId)])});import{pgTable as ET,text as pc,timestamp as mc,jsonb as nf,uuid as rf,index as Pd,integer as gw}from"drizzle-orm/pg-core";var ue,hw=G(()=>{"use strict";cd();ue=ET("launch_jobs",{id:rf("id").primaryKey().defaultRandom(),userId:rf("user_id").notNull(),tool:pc("tool").notNull(),status:pc("status").notNull().default("pending"),config:nf("config").notNull().default({}),result:nf("result"),error:pc("error"),attempts:gw("attempts").notNull().default(0),taskKind:pc("task_kind"),payload:nf("payload"),claimedBy:pc("claimed_by"),claimedAt:mc("claimed_at",{withTimezone:!0}),leaseExpiresAt:mc("lease_expires_at",{withTimezone:!0}),leaseRecoveries:gw("lease_recoveries").notNull().default(0),createdAt:mc("created_at",{withTimezone:!0}).defaultNow(),updatedAt:mc("updated_at",{withTimezone:!0}).defaultNow(),completedAt:mc("completed_at",{withTimezone:!0}),runId:rf("run_id").references(()=>Z.id,{onDelete:"set null"})},e=>[Pd("idx_launch_jobs_user").on(e.userId),Pd("idx_launch_jobs_status").on(e.status),Pd("idx_launch_jobs_pending").on(e.userId,e.status),Pd("idx_launch_jobs_run").on(e.runId)])});import{pgTable as _w,uuid as Jr,text as ho,real as AT,timestamp as fc,boolean as ST,uniqueIndex as xT,index as gc}from"drizzle-orm/pg-core";var Dd,x,Ge,yw=G(()=>{"use strict";Yt();Sn();wr();Dd=["add","remove","trim"],x=_w("instruction_suggestions",{id:Jr("id").primaryKey().defaultRandom(),userId:Jr("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),instructionId:Jr("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),projectPath:ho("project_path").notNull(),projectId:Jr("project_id").references(()=>C.id,{onDelete:"set null"}),score:AT("score").notNull(),reason:ho("reason").notNull(),kind:ho("kind").$type().notNull().default("add"),generatedAt:fc("generated_at",{withTimezone:!0}).notNull().defaultNow(),isStale:ST("is_stale").notNull().default(!1),dismissedAt:fc("dismissed_at",{withTimezone:!0}),acceptedAt:fc("accepted_at",{withTimezone:!0}),declinedAt:fc("declined_at",{withTimezone:!0}),declinedReason:ho("declined_reason"),promotedToInstructionId:Jr("promoted_to_instruction_id").references(()=>g.id,{onDelete:"set null"})},e=>[xT("idx_instruction_suggestions_user_project_instruction_kind").on(e.userId,e.projectPath,e.instructionId,e.kind),gc("idx_instruction_suggestions_user_project").on(e.userId,e.projectPath),gc("idx_instruction_suggestions_user_proj_id").on(e.userId,e.projectId),gc("idx_instruction_suggestions_generated_at").on(e.generatedAt)]),Ge=_w("instruction_suggestion_events",{id:Jr("id").primaryKey().defaultRandom(),suggestionId:Jr("suggestion_id").notNull().references(()=>x.id,{onDelete:"cascade"}),userId:Jr("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),eventType:ho("event_type").notNull(),tool:ho("tool"),sessionId:Jr("session_id"),projectPath:ho("project_path").notNull(),actor:ho("actor"),createdAt:fc("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[gc("idx_instruction_suggestion_events_suggestion_id").on(e.suggestionId),gc("idx_instruction_suggestion_events_user_id").on(e.userId)])});import{pgTable as TT,text as of,integer as RT,numeric as hc,timestamp as sf,index as kT,primaryKey as NT}from"drizzle-orm/pg-core";var st,ww=G(()=>{"use strict";st=TT("model_pricing",{provider:of("provider").notNull(),modelId:of("model_id").notNull(),inputPerM:hc("input_per_m").notNull(),outputPerM:hc("output_per_m").notNull(),cacheReadPerM:hc("cache_read_per_m").notNull(),cacheWrite5mPerM:hc("cache_write_5m_per_m").notNull(),cacheWrite1hPerM:hc("cache_write_1h_per_m").notNull(),contextWindow:RT("context_window"),effectiveFrom:sf("effective_from",{withTimezone:!0}).notNull(),effectiveUntil:sf("effective_until",{withTimezone:!0}),source:of("source").notNull(),verifiedAt:sf("verified_at",{withTimezone:!0})},e=>[NT({columns:[e.provider,e.modelId,e.effectiveFrom]}),kT("idx_model_pricing_active").on(e.provider,e.modelId,e.effectiveFrom.desc())])});import{pgTable as jT,text as ps,numeric as vw,timestamp as Iw,uuid as bw,jsonb as PT,index as Ew}from"drizzle-orm/pg-core";var ve,Aw=G(()=>{"use strict";ve=jT("limit_observations",{id:bw("id").primaryKey().defaultRandom(),observedAt:Iw("observed_at",{withTimezone:!0}).notNull().defaultNow(),provider:ps("provider").notNull(),plan:ps("plan").notNull(),limitType:ps("limit_type").notNull(),value:vw("value").notNull(),unit:ps("unit").notNull(),comparator:ps("comparator").notNull().default("="),resetsAt:Iw("resets_at",{withTimezone:!0}),sourceType:ps("source_type").notNull(),sourceUrl:ps("source_url"),sourceEvidence:PT("source_evidence"),confidence:vw("confidence").notNull(),userId:bw("user_id")},e=>[Ew("idx_limit_obs_lookup").on(e.provider,e.plan,e.limitType,e.observedAt.desc()),Ew("idx_limit_obs_user").on(e.userId,e.observedAt.desc())])});import{pgTable as DT,text as Od,timestamp as OT,uuid as CT,jsonb as LT,boolean as MT,uniqueIndex as $T}from"drizzle-orm/pg-core";var Dt,Sw=G(()=>{"use strict";Dt=DT("provider_docs_snapshots",{id:CT("id").primaryKey().defaultRandom(),fetchedAt:OT("fetched_at",{withTimezone:!0}).notNull().defaultNow(),provider:Od("provider").notNull(),docUrl:Od("doc_url").notNull(),contentHash:Od("content_hash").notNull(),content:Od("content").notNull(),parseSuccess:MT("parse_success").notNull(),parseErrors:LT("parse_errors")},e=>[$T("idx_docs_dedup").on(e.provider,e.docUrl,e.contentHash)])});import{pgTable as qT,text as Cd,numeric as xw,timestamp as Tw,uuid as UT,primaryKey as HT,index as BT}from"drizzle-orm/pg-core";var tt,Rw=G(()=>{"use strict";tt=qT("plan_limits_active",{provider:Cd("provider").notNull(),plan:Cd("plan").notNull(),limitType:Cd("limit_type").notNull(),value:xw("value").notNull(),unit:Cd("unit").notNull(),effectiveFrom:Tw("effective_from",{withTimezone:!0}).notNull(),effectiveUntil:Tw("effective_until",{withTimezone:!0}),confidence:xw("confidence").notNull(),sourceObservationIds:UT("source_observation_ids").array().notNull()},e=>[HT({columns:[e.provider,e.plan,e.limitType,e.effectiveFrom]}),BT("idx_plan_limits_lookup").on(e.provider,e.plan,e.limitType,e.effectiveFrom.desc())])});import{pgTable as FT,text as af,timestamp as WT,uuid as kw,jsonb as zT,index as VT}from"drizzle-orm/pg-core";var kn,Nw=G(()=>{"use strict";kn=FT("alert_dispatches",{id:kw("id").primaryKey().defaultRandom(),userId:kw("user_id").notNull(),alertKey:af("alert_key").notNull(),severity:af("severity").notNull(),lastDispatchedAt:WT("last_dispatched_at",{withTimezone:!0}).notNull().defaultNow(),lastState:zT("last_state").notNull(),channel:af("channel").notNull()},e=>[VT("idx_alert_user_key").on(e.userId,e.alertKey,e.lastDispatchedAt.desc())])});import{boolean as JT,date as KT,index as cf,integer as GT,jsonb as YT,pgTable as uf,text as or,timestamp as _o,uniqueIndex as XT,uuid as di}from"drizzle-orm/pg-core";var $e,Rt,kt,jw=G(()=>{"use strict";$e=uf("announcements",{id:di("id").primaryKey().defaultRandom(),version:or("version").notNull().unique(),releaseDate:KT("release_date").notNull(),subject:or("subject").notNull(),htmlBody:or("html_body").notNull(),textBody:or("text_body").notNull(),sections:YT("sections").notNull().default({}),status:or("status").notNull().default("draft"),recipientCount:GT("recipient_count"),sentAt:_o("sent_at",{withTimezone:!0}),sentBy:di("sent_by"),error:or("error"),createdAt:_o("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:_o("updated_at",{withTimezone:!0}).notNull().defaultNow()},e=>[cf("idx_announcements_status").on(e.status),cf("idx_announcements_created").on(e.createdAt)]),Rt=uf("announcement_deliveries",{id:di("id").primaryKey().defaultRandom(),announcementId:di("announcement_id").notNull(),userId:di("user_id").notNull(),email:or("email").notNull(),status:or("status").notNull().default("pending"),providerId:or("provider_id"),error:or("error"),sentAt:_o("sent_at",{withTimezone:!0}),createdAt:_o("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[XT("uniq_announcement_deliveries_announcement_user").on(e.announcementId,e.userId),cf("idx_announcement_deliveries_user").on(e.userId,e.createdAt)]),kt=uf("notification_preferences",{userId:di("user_id").primaryKey(),productAnnouncements:JT("product_announcements").notNull().default(!0),unsubscribeToken:or("unsubscribe_token").notNull().unique(),unsubscribedAt:_o("unsubscribed_at",{withTimezone:!0}),createdAt:_o("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:_o("updated_at",{withTimezone:!0}).notNull().defaultNow()})});import{pgTable as QT,text as df,timestamp as Pw,uuid as lf,integer as ZT,index as eR,unique as tR}from"drizzle-orm/pg-core";var Dw,Ow=G(()=>{"use strict";Dw=QT("scaffolding_fingerprints",{id:lf("id").primaryKey().defaultRandom(),userId:lf("user_id").notNull(),harness:df("harness").notNull(),model:df("model").notNull(),toolsHash:df("tools_hash").notNull(),firstSeenAt:Pw("first_seen_at",{withTimezone:!0}).notNull().defaultNow(),lastSeenAt:Pw("last_seen_at",{withTimezone:!0}).notNull().defaultNow(),snapshotCount:ZT("snapshot_count").notNull().default(1),firstSessionId:lf("first_session_id")},e=>[tR("scaffolding_fingerprints_user_id_harness_model_tools_hash_key").on(e.userId,e.harness,e.model,e.toolsHash),eR("idx_scaffolding_fp_segment").on(e.userId,e.harness,e.model)])});import{pgTable as nR,text as pf,timestamp as rR,jsonb as oR,uuid as Cw,integer as sR,unique as iR}from"drizzle-orm/pg-core";var Lw,Mw=G(()=>{"use strict";Lw=nR("scaffolding_segments",{id:Cw("id").primaryKey().defaultRandom(),userId:Cw("user_id").notNull(),harness:pf("harness").notNull(),model:pf("model").notNull(),coreNames:oR("core_names").notNull(),coreHash:pf("core_hash").notNull(),activeFingerprints:sR("active_fingerprints").notNull(),computedAt:rR("computed_at",{withTimezone:!0}).notNull().defaultNow()},e=>[iR("scaffolding_segments_user_id_harness_model_key").on(e.userId,e.harness,e.model)])});var mf=G(()=>{"use strict";Yt();os();Z_();Sn();ty();wr();ni();cy();dy();jm();fy();gy();Mm();wy();cd();Bm();Ey();Ty();Ry();jy();Oy();Ly();ec();$y();qy();Hy();Fy();zy();Yy();Qy();ew();nw();sw();aw();dw();fw();hw();yw();ww();Aw();Sw();Rw();Nw();jw();Ow();Mw()});import{relations as Ye}from"drizzle-orm";var aR,cR,uR,dR,lR,pR,mR,fR,gR,hR,_R,yR,wR,vR,IR,bR,ER,AR,SR,xR,TR,RR,kR,NR,jR,PR,DR,OR,CR,LR,$w=G(()=>{"use strict";mf();aR=Ye(T,({many:e})=>({sessions:e(y),contextSnapshots:e(M),apiKeys:e(Ae)})),cR=Ye(Ae,({one:e})=>({profile:e(T,{fields:[Ae.userId],references:[T.id]})})),uR=Ye(Y,({many:e})=>({teams:e(X),userOrganizations:e(ee),projects:e(C),invitations:e(ae)})),dR=Ye(X,({one:e,many:t})=>({organization:e(Y,{fields:[X.orgId],references:[Y.id]}),userTeams:t(we),invitations:t(ae)})),lR=Ye(ae,({one:e})=>({organization:e(Y,{fields:[ae.orgId],references:[Y.id]}),team:e(X,{fields:[ae.teamId],references:[X.id]}),inviter:e(T,{fields:[ae.invitedBy],references:[T.id]})})),pR=Ye(ee,({one:e})=>({organization:e(Y,{fields:[ee.orgId],references:[Y.id]})})),mR=Ye(we,({one:e})=>({team:e(X,{fields:[we.teamId],references:[X.id]})})),fR=Ye(g,({one:e,many:t})=>({versions:t(xe),projectInstructions:t(lt),events:t(Ut),usageEvents:t(mo),sessionInstructions:t(se),packInstructions:t(Me),forkedFrom:e(g,{fields:[g.forkedFromId],references:[g.id]})})),gR=Ye(Ut,({one:e})=>({instruction:e(g,{fields:[Ut.instructionId],references:[g.id]})})),hR=Ye(F,({one:e,many:t})=>({project:e(C,{fields:[F.projectId],references:[C.id]}),parent:e(F,{fields:[F.parentId],references:[F.id]}),versions:t(F)})),_R=Ye(xe,({one:e})=>({instruction:e(g,{fields:[xe.instructionId],references:[g.id]})})),yR=Ye(C,({one:e,many:t})=>({organization:e(Y,{fields:[C.orgId],references:[Y.id]}),projectInstructions:t(lt),sessions:t(y)})),wR=Ye(lt,({one:e})=>({project:e(C,{fields:[lt.projectId],references:[C.id]}),instruction:e(g,{fields:[lt.instructionId],references:[g.id]})})),vR=Ye(y,({one:e,many:t})=>({profile:e(T,{fields:[y.userId],references:[T.id]}),project:e(C,{fields:[y.projectId],references:[C.id]}),run:e(Z,{fields:[y.runId],references:[Z.id]}),events:t(ze),sessionInstructions:t(se),treatmentExposures:t(ne),contextSnapshots:t(M)})),IR=Ye(Z,({one:e,many:t})=>({profile:e(T,{fields:[Z.userId],references:[T.id]}),organization:e(Y,{fields:[Z.orgId],references:[Y.id]}),project:e(C,{fields:[Z.projectId],references:[C.id]}),sessions:t(y),launchJobs:t(ue)})),bR=Ye(ue,({one:e})=>({run:e(Z,{fields:[ue.runId],references:[Z.id]})})),ER=Ye(ze,({one:e})=>({session:e(y,{fields:[ze.sessionId],references:[y.id]})})),AR=Ye(se,({one:e})=>({session:e(y,{fields:[se.sessionId],references:[y.id]}),instruction:e(g,{fields:[se.instructionId],references:[g.id]})})),SR=Ye(Lt,({one:e,many:t})=>({owner:e(T,{fields:[Lt.userId],references:[T.id]}),project:e(C,{fields:[Lt.projectId],references:[C.id]}),exposures:t(ne)})),xR=Ye(ne,({one:e})=>({session:e(y,{fields:[ne.sessionId],references:[y.id]}),owner:e(T,{fields:[ne.userId],references:[T.id]}),assignment:e(Lt,{fields:[ne.assignmentId],references:[Lt.id]})})),TR=Ye(Ue,({one:e,many:t})=>({packInstructions:t(Me),forkedFrom:e(Ue,{fields:[Ue.forkedFromId],references:[Ue.id]})})),RR=Ye(Me,({one:e})=>({pack:e(Ue,{fields:[Me.packId],references:[Ue.id]}),instruction:e(g,{fields:[Me.instructionId],references:[g.id]})})),kR=Ye(mo,({one:e})=>({instruction:e(g,{fields:[mo.instructionId],references:[g.id]})})),NR=Ye(k,({one:e,many:t})=>({parent:e(k,{fields:[k.parentId],references:[k.id]}),evals:t(Ee),evalRuns:t(Ie),benchmarks:t(rr),evalJobs:t(je),evalConversations:t(He)})),jR=Ye(Ee,({one:e,many:t})=>({evalTarget:e(k,{fields:[Ee.evalTargetId],references:[k.id]}),runs:t(Ie)})),PR=Ye(Ie,({one:e})=>({eval:e(Ee,{fields:[Ie.evalId],references:[Ee.id]}),evalTarget:e(k,{fields:[Ie.evalTargetId],references:[k.id]})})),DR=Ye(rr,({one:e})=>({evalTarget:e(k,{fields:[rr.evalTargetId],references:[k.id]})})),OR=Ye(je,({one:e})=>({evalTarget:e(k,{fields:[je.evalTargetId],references:[k.id]})})),CR=Ye(He,({one:e})=>({evalTarget:e(k,{fields:[He.evalTargetId],references:[k.id]})})),LR=Ye(M,({one:e})=>({session:e(y,{fields:[M.sessionId],references:[y.id]}),profile:e(T,{fields:[M.userId],references:[T.id]})}))});var Ld={};co(Ld,{SUGGESTION_KINDS:()=>Dd,agentJobs:()=>Pe,agentRuns:()=>Z,agentRunsRelations:()=>IR,alertDispatches:()=>kn,announcementDeliveries:()=>Rt,announcements:()=>$e,apiKeys:()=>Ae,apiKeysRelations:()=>cR,benchmarks:()=>rr,benchmarksRelations:()=>DR,cliErrorEvents:()=>Ed,cliSetupEvents:()=>bd,contentBlobs:()=>Rn,contextSnapshots:()=>M,contextSnapshotsRelations:()=>LR,evalComparisons:()=>ot,evalConversations:()=>He,evalConversationsRelations:()=>CR,evalGradeAnnotations:()=>et,evalJobs:()=>je,evalJobsRelations:()=>OR,evalRuns:()=>Ie,evalRunsRelations:()=>PR,evalTargets:()=>k,evalTargetsRelations:()=>NR,evals:()=>Ee,evalsRelations:()=>jR,extensionAuthCodes:()=>qn,harnessReleases:()=>$t,insightRecommendationLog:()=>Te,insightsJobs:()=>z,instructionEvents:()=>Ut,instructionEventsRelations:()=>gR,instructionExperimentArms:()=>Fr,instructionExperiments:()=>$,instructionPromotions:()=>ie,instructionSuggestionEvents:()=>Ge,instructionSuggestions:()=>x,instructionUsageEvents:()=>mo,instructionUsageEventsRelations:()=>kR,instructionVerdicts:()=>Q,instructionVersionIdentities:()=>yr,instructionVersions:()=>xe,instructionVersionsRelations:()=>_R,instructions:()=>g,instructionsRelations:()=>fR,judgeReviewerVerdicts:()=>pe,launchJobs:()=>ue,launchJobsRelations:()=>bR,limitObservations:()=>ve,memories:()=>F,memoriesRelations:()=>hR,memoryExperiments:()=>Mt,modelPricing:()=>st,notificationPreferences:()=>kt,notifications:()=>Tt,orgInvitations:()=>ae,orgInvitationsRelations:()=>lR,organizations:()=>Y,organizationsRelations:()=>uR,packInstructions:()=>Me,packInstructionsRelations:()=>RR,packs:()=>Ue,packsRelations:()=>TR,pendingTreatmentExposures:()=>pd,planLimitsActive:()=>tt,profiles:()=>T,profilesRelations:()=>aR,projectCheckouts:()=>ye,projectInstructions:()=>lt,projectInstructionsRelations:()=>wR,projects:()=>C,projectsRelations:()=>yR,providerDocsSnapshots:()=>Dt,recommendationApplications:()=>Re,scaffoldingFingerprints:()=>Dw,scaffoldingSegments:()=>Lw,sessionEvents:()=>ze,sessionEventsRelations:()=>ER,sessionInstructions:()=>se,sessionInstructionsRelations:()=>AR,sessionSendJobs:()=>yd,sessionTerminalTargets:()=>Ze,sessions:()=>y,sessionsRelations:()=>vR,skillSubmissions:()=>go,teams:()=>X,teamsRelations:()=>dR,treatmentAssignments:()=>Lt,treatmentAssignmentsRelations:()=>SR,treatmentExposures:()=>ne,treatmentExposuresRelations:()=>xR,userOrganizations:()=>ee,userOrganizationsRelations:()=>pR,userTeams:()=>we,userTeamsRelations:()=>mR,workerConnections:()=>fe});var Md=G(()=>{"use strict";mf();$w()});function _f(){ms++,ms>ff&&(ff=ms)}function yf(){ms>0&&ms--}function wf(){li++,li>gf&&(gf=li)}function vf(){li>0&&li--}function _c(){return ms}function If(){qw++}function yc(){Uw++}function Hw(){hf++}function bf(){let e=hf;return hf=0,e}function Ef(){return{current:ms,peak:ff,heavyCurrent:li,heavyPeak:gf,shedCount:qw,ingestShedCount:Uw}}function pi(){let e=Number(process.env.PG_INFLIGHT_MAX);return Number.isFinite(e)&&e>0?e:(Number(process.env.PG_POOL_MAX)||3)*4}function wc(){let e=pi(),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 ms,ff,li,gf,qw,Uw,hf,Af=G(()=>{"use strict";ms=0,ff=0,li=0,gf=0,qw=0,Uw=0,hf=0;c(_f,"trackDbOpStart");c(yf,"trackDbOpEnd");c(wf,"trackHeavyDbOpStart");c(vf,"trackHeavyDbOpEnd");c(_c,"getDbLoad");c(If,"recordDbShed");c(yc,"recordIngestShed");c(Hw,"recordQueryDeadline");c(bf,"consumeDeadlineCount");c(Ef,"getDbLoadStats");c(pi,"dbInflightMax");c(wc,"dbIngestInflightMax")});import{drizzle as Bw}from"drizzle-orm/postgres-js";import Sf from"postgres";function xf(e){let t=process.env[e];if(!t)throw new Error(`Missing required env var: ${e}`);return t}function Fw(){if(bc)throw new Error("getDb() called after closeDb(): the connection pool is closed for shutdown. Stop issuing queries (timers/requests) before draining the pool.");if(!Ic){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;fi=Sf(xf("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}:{}}}),Ic=Bw(fi,{schema:Ld})}return Ic}function Ww(){if(bc)throw new Error("getHeavyDb() called after closeDb(): the connection pool is closed for shutdown. Stop issuing queries (timers/requests) before draining the pool.");if(!qd){let e=(process.env.PG_APPLICATION_NAME||"rulemetric")+":heavy",t=Number(process.env.PG_HEAVY_POOL_MAX)||2;Ud=Sf(xf("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}}),qd=Bw(Ud,{schema:Ld})}return qd}async function Ec(){if($d)return $d;bc=!0;let e=fi,t=mi,n=Ud;return fi=void 0,Ic=void 0,mi=void 0,Ud=void 0,qd=void 0,$d=Promise.allSettled([e?e.end({timeout:5}):Promise.resolve(),t?t.end({timeout:5}):Promise.resolve(),n?n.end({timeout:5}):Promise.resolve()]).then(()=>{}),$d}function Tf(){if(bc)return Promise.resolve();if(vc)return vc;let e=fi;return fi=void 0,Ic=void 0,vc=(async()=>{e&&await e.end({timeout:5}).catch(()=>{})})().finally(()=>{vc=void 0}),vc}async function Rf(e){let t=Date.now();if(bc)return{ok:!1,ms:0,err:new Error("pool closed for shutdown")};let n=mi;try{return n||(n=Sf(xf("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)}}),mi=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 mi===n&&(mi=void 0),n?.end({timeout:1}).catch(()=>{}),{ok:!1,ms:Date.now()-t,err:r}}}function Ac(e){let t=e?.message;return typeof t=="string"&&t.includes(MR)}function gi(e){let t=e,n=t?.code??t?.cause?.code??t?.errno;return n!==void 0&&$R.has(n)}function Bd(e){let t=e,n=t?.code??t?.cause?.code??t?.errno;return n!==void 0&&qR.has(n)}async function zw(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=gi(i)||t.retryResets===!0&&Bd(i);if(s===n-1||!a)throw i;await new Promise(u=>setTimeout(u,r*2**s))}throw o}function Sc(e){return e?.code==="QUERY_DEADLINE"}function Vw(){let e=Number(process.env.PG_QUERY_DEADLINE_MS);return Number.isFinite(e)&&e>=0?e:2e4}function Jw(){let e=Number(process.env.PG_HEAVY_QUERY_DEADLINE_MS);return Number.isFinite(e)&&e>=0?e:6e4}function UR(e,t,n=!0){let r,o=new Promise((s,i)=>{r=setTimeout(()=>{n&&Hw(),i(new Hd(t))},t);let a=r;typeof a.unref=="function"&&a.unref()});return Promise.race([e,o]).finally(()=>clearTimeout(r))}function kf(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 u=Reflect.get(o,s,i);return typeof u!="function"?u:(l,p)=>{let f=r?wf:_f,_=r?vf:yf;f();let v=zw(()=>new Promise((m,w)=>u.call(o,m,w)),{retryResets:t});return(n>0?UR(v,n,!r):v).finally(_).then(l,p)}}let a=Reflect.get(o,s,i);return typeof a=="function"?(...u)=>kf(a.apply(o,u),t,n,r):a}})}function Yw(e,t=!1){let n=t?wf:_f,r=t?vf:yf;n();try{return Promise.resolve(e()).finally(r)}catch(o){throw r(),o}}var Ic,fi,bc,$d,vc,mi,Ud,qd,MR,$R,qR,Hd,Kw,Gw,d,Fe,Nf=G(()=>{"use strict";Md();Af();bc=!1;c(xf,"getEnv");c(Fw,"getDb");c(Ww,"getHeavyDb");c(Ec,"closeDb");c(Tf,"recyclePool");c(Rf,"probeDbReachable");MR="called after closeDb()";c(Ac,"isPoolClosedError");$R=new Set(["CONNECT_TIMEOUT","ETIMEDOUT","ENOTFOUND","ECONNREFUSED","EAI_AGAIN"]);c(gi,"isRetryableConnectError");qR=new Set(["CONNECTION_CLOSED","ECONNRESET","EPIPE"]);c(Bd,"isRetryableResetError");c(zw,"withDbRetry");Hd=class extends Error{static{c(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"}};c(Sc,"isQueryDeadlineError");c(Vw,"queryDeadlineMs");c(Jw,"heavyQueryDeadlineMs");c(UR,"raceWithDeadline");Kw=new Set(["select","selectDistinct","selectDistinctOn","insert","update","delete","execute","with","$count","refreshMaterializedView"]),Gw=new Set(["select","selectDistinct","selectDistinctOn","$count"]);c(kf,"wrapBuilder");c(Yw,"gaugeTransaction");d=new Proxy({},{get(e,t){let n=Fw(),r=n[t];if(typeof t=="string"&&Kw.has(t)&&typeof r=="function"){let o=Gw.has(t),s=Vw();return(...i)=>kf(r.apply(n,i),o,s)}return t==="transaction"&&typeof r=="function"?(...o)=>Yw(()=>r.apply(n,o)):r}}),Fe=new Proxy({},{get(e,t){let n=Ww(),r=n[t];if(typeof t=="string"&&Kw.has(t)&&typeof r=="function"){let o=Gw.has(t);return(...s)=>kf(r.apply(n,s),o,Jw(),!0)}return t==="transaction"&&typeof r=="function"?(...o)=>Yw(()=>r.apply(n,o),!0):r}})});async function un(e){let[t]=await d.insert(Tt).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:[Tt.userId,Tt.sourceTable,Tt.sourceId]}).returning();return t??null}var Xw=G(()=>{"use strict";Nf();Md();c(un,"notifyUser")});var D=G(()=>{"use strict";Md();Nf();Af();Xw()});function zv(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function gl(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]*${zv(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]*${zv(s)}[^\\n]*\\n([\\s\\S]*?)(?=\\nContents of |$)`,"i"))?.[1]?.trim();if(a)return a}}return null}var hg=G(()=>{"use strict";c(zv,"escapeRegExp");c(gl,"extractInstructionSection")});var Gv={};co(Gv,{GRADUATION_MIN_N:()=>Vc,decideGraduation:()=>Jv,graduatedRulesForRender:()=>_g,instructionContentHash:()=>Kr,maybeGraduate:()=>Kv,settleExperiment:()=>ki,verdictRowsForExperiments:()=>_l});import{createHash as ON}from"node:crypto";import{and as hl,eq as ar,inArray as CN,sql as Vv}from"drizzle-orm";function Jv(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 Kr(e,t){let n=gl(e,t);return n?ON("sha256").update(n).digest("hex"):null}async function Kv(e){let{experimentId:t,userId:n,verdict:r}=e,o=Jv(r);if(o===null)return null;let[s]=await d.select({id:$.id,instructionId:$.instructionId,projectPath:$.projectPath,status:$.status}).from($).where(hl(ar($.id,t),ar($.userId,n)));if(!s||s.status!=="running")return null;let[i]=await d.select({content:g.content,name:g.name}).from(g).where(ar(g.id,s.instructionId)),a=Kr(i?.content,i?.name);if(!a)return null;let l=(await d.execute(Vv`
1
+ var Z_=Object.defineProperty;var c=(e,t)=>Z_(e,"name",{value:t,configurable:!0}),yp=(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 Y=(e,t)=>()=>(e&&(t=e(e=0)),t);var lo=(e,t)=>{for(var n in t)Z_(e,n,{get:t[n],enumerable:!0})};import{pgTable as su,text as ti,timestamp as za,jsonb as ry,uuid as os,primaryKey as oy}from"drizzle-orm/pg-core";var X,Q,ee,we,ss=Y(()=>{"use strict";X=su("organizations",{id:os("id").primaryKey().defaultRandom(),name:ti("name").unique().notNull(),slug:ti("slug").unique().notNull(),metadata:ry("metadata"),createdAt:za("created_at",{withTimezone:!0}).defaultNow(),updatedAt:za("updated_at",{withTimezone:!0}).defaultNow()}),Q=su("teams",{id:os("id").primaryKey().defaultRandom(),orgId:os("org_id").references(()=>X.id,{onDelete:"cascade"}),name:ti("name").notNull(),slug:ti("slug").notNull(),metadata:ry("metadata"),createdAt:za("created_at",{withTimezone:!0}).defaultNow()}),ee=su("user_organizations",{userId:os("user_id").notNull(),orgId:os("org_id").references(()=>X.id,{onDelete:"cascade"}).notNull(),role:ti("role").notNull().default("member"),createdAt:za("created_at",{withTimezone:!0}).defaultNow()},e=>[oy({columns:[e.userId,e.orgId]})]),we=su("user_teams",{userId:os("user_id").notNull(),teamId:os("team_id").references(()=>Q.id,{onDelete:"cascade"}).notNull(),role:ti("role").notNull().default("member"),createdAt:za("created_at",{withTimezone:!0}).defaultNow()},e=>[oy({columns:[e.userId,e.teamId]})])});import{boolean as iu,integer as Va,pgTable as zS,real as sy,text as au,timestamp as xp,uuid as iy}from"drizzle-orm/pg-core";var R,Xt=Y(()=>{"use strict";ss();R=zS("profiles",{id:iy("id").primaryKey(),email:au("email"),displayName:au("display_name"),activeOrgId:iy("active_org_id").references(()=>X.id,{onDelete:"set null"}),isSuperadmin:iu("is_superadmin").notNull().default(!1),claudeCodePlan:au("claude_code_plan"),planSource:au("plan_source").notNull().default("detected"),setupCompletedAt:xp("setup_completed_at",{withTimezone:!0}),liveSendSkipped:iu("live_send_skipped").notNull().default(!1),autoAcceptSuggestions:iu("auto_accept_suggestions").notNull().default(!0),evolutionPaused:iu("evolution_paused").notNull().default(!1),suggestionConfidenceThreshold:sy("suggestion_confidence_threshold").notNull().default(.7),autoAcceptMinScore:sy("auto_accept_min_score"),autoAcceptMaxPerRun:Va("auto_accept_max_per_run"),autoAcceptMaxPerWindow:Va("auto_accept_max_per_window"),autoAcceptWindowDays:Va("auto_accept_window_days"),trialMaxConcurrent:Va("trial_max_concurrent"),trialMaxPerRun:Va("trial_max_per_run"),createdAt:xp("created_at",{withTimezone:!0}).defaultNow(),updatedAt:xp("updated_at",{withTimezone:!0}).defaultNow()})});import{pgTable as VS,text as Rp,timestamp as cu,uuid as du,index as ay}from"drizzle-orm/pg-core";var se,cy=Y(()=>{"use strict";ss();Xt();se=VS("org_invitations",{id:du("id").primaryKey().defaultRandom(),orgId:du("org_id").notNull().references(()=>X.id,{onDelete:"cascade"}),email:Rp("email").notNull(),role:Rp("role").notNull().default("member"),teamId:du("team_id").references(()=>Q.id,{onDelete:"set null"}),invitedBy:du("invited_by").notNull().references(()=>R.id,{onDelete:"cascade"}),token:Rp("token").notNull().unique(),expiresAt:cu("expires_at",{withTimezone:!0}).notNull(),acceptedAt:cu("accepted_at",{withTimezone:!0}),revokedAt:cu("revoked_at",{withTimezone:!0}),createdAt:cu("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[ay("idx_org_invitations_token").on(e.token),ay("idx_org_invitations_org").on(e.orgId)])});import{pgTable as Tp,text as en,timestamp as mo,jsonb as uu,uuid as yr,integer as lu,boolean as JS,uniqueIndex as mu,index as Ja}from"drizzle-orm/pg-core";var g,wr,xe,Sn=Y(()=>{"use strict";g=Tp("instructions",{id:yr("id").primaryKey().defaultRandom(),name:en("name").notNull(),description:en("description").notNull(),type:en("type").notNull().default("instruction"),scope:en("scope").notNull(),scopeRef:yr("scope_ref"),version:en("version").notNull(),content:en("content").notNull(),frontmatter:uu("frontmatter").notNull(),slots:uu("slots"),tags:en("tags").array(),compatibility:en("compatibility").array(),createdBy:yr("created_by"),createdAt:mo("created_at",{withTimezone:!0}).defaultNow(),updatedAt:mo("updated_at",{withTimezone:!0}).defaultNow(),archived:JS("archived").default(!1),archivedAt:mo("archived_at",{withTimezone:!0}),archivedBy:yr("archived_by"),forkedFromId:yr("forked_from_id").references(()=>g.id,{onDelete:"set null"}),upstreamVersion:en("upstream_version"),badge:en("badge"),contentHash:en("content_hash"),contextIdentity:en("context_identity"),scanScore:lu("scan_score"),scanFindings:uu("scan_findings"),popularityScore:lu("popularity_score"),sourceUpdatedAt:mo("source_updated_at",{withTimezone:!0})},e=>[mu("instructions_name_scope_ref_idx").on(e.name,e.scope,e.scopeRef),Ja("idx_instructions_scope").on(e.scope,e.scopeRef),Ja("idx_instructions_created_by").on(e.createdBy),Ja("idx_instructions_context_identity").on(e.createdBy,e.contextIdentity),Ja("idx_instructions_public_recency").on(e.scope,e.sourceUpdatedAt.desc())]),wr=Tp("instruction_version_identities",{id:yr("id").primaryKey().defaultRandom(),instructionId:yr("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),contentHash:en("content_hash").notNull(),versionOrdinal:lu("version_ordinal").notNull(),content:en("content"),firstSeenAt:mo("first_seen_at",{withTimezone:!0}).notNull().defaultNow(),lastSeenAt:mo("last_seen_at",{withTimezone:!0}).notNull().defaultNow(),createdAt:mo("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[mu("instruction_version_identities_hash_unique").on(e.instructionId,e.contentHash),mu("instruction_version_identities_ordinal_unique").on(e.instructionId,e.versionOrdinal),Ja("idx_ivi_instruction").on(e.instructionId)]),xe=Tp("instruction_versions",{id:yr("id").primaryKey().defaultRandom(),instructionId:yr("instruction_id").references(()=>g.id,{onDelete:"cascade"}),versionNumber:lu("version_number").notNull(),content:en("content").notNull(),frontmatter:uu("frontmatter").notNull(),changeSummary:en("change_summary"),createdBy:yr("created_by"),createdAt:mo("created_at",{withTimezone:!0}).defaultNow()},e=>[mu("instruction_versions_instruction_version_idx").on(e.instructionId,e.versionNumber)])});import{pgTable as KS,text as GS,timestamp as YS,jsonb as XS,uuid as kp,index as dy}from"drizzle-orm/pg-core";var Ht,uy=Y(()=>{"use strict";Sn();Ht=KS("instruction_events",{id:kp("id").primaryKey().defaultRandom(),instructionId:kp("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),eventType:GS("event_type").notNull(),actorId:kp("actor_id").notNull(),metadata:XS("metadata"),createdAt:YS("created_at",{withTimezone:!0}).defaultNow()},e=>[dy("idx_instruction_events_instruction").on(e.instructionId),dy("idx_instruction_events_type").on(e.eventType)])});import{boolean as QS,jsonb as ZS,pgTable as jp,primaryKey as ly,text as is,timestamp as Ka,uniqueIndex as Np,uuid as as}from"drizzle-orm/pg-core";import{sql as ex}from"drizzle-orm";var C,lt,ye,vr=Y(()=>{"use strict";ss();Sn();C=jp("projects",{id:as("id").primaryKey().defaultRandom(),orgId:as("org_id").references(()=>X.id,{onDelete:"cascade"}),name:is("name").notNull(),description:is("description"),githubRepo:is("github_repo"),gitRemoteUrl:is("git_remote_url"),gitRootCommit:is("git_root_commit"),gitRemoteAliases:is("git_remote_aliases").array().notNull().default([]),metadata:ZS("metadata"),createdBy:as("created_by"),createdAt:Ka("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Ka("updated_at",{withTimezone:!0}).defaultNow()},e=>[Np("projects_org_name_idx").on(e.orgId,e.name),Np("projects_git_remote_url_unique").on(e.gitRemoteUrl).where(ex`${e.gitRemoteUrl} IS NOT NULL`)]),lt=jp("project_instructions",{projectId:as("project_id").references(()=>C.id,{onDelete:"cascade"}).notNull(),instructionId:as("instruction_id").references(()=>g.id,{onDelete:"cascade"}).notNull(),addedAt:Ka("added_at",{withTimezone:!0}).defaultNow(),addedBy:as("added_by")},e=>[ly({columns:[e.projectId,e.instructionId]})]),ye=jp("project_checkouts",{projectId:as("project_id").references(()=>C.id,{onDelete:"cascade"}).notNull(),path:is("path").notNull(),isWorktree:QS("is_worktree").notNull().default(!1),firstSeen:Ka("first_seen",{withTimezone:!0}).notNull().defaultNow(),lastSeen:Ka("last_seen",{withTimezone:!0}).notNull().defaultNow()},e=>[ly({columns:[e.projectId,e.path]}),Np("project_checkouts_path_unique").on(e.path)])});import{pgTable as tx,text as ni,timestamp as Pp,jsonb as my,uuid as pu,integer as nx,boolean as rx,index as Dp}from"drizzle-orm/pg-core";var te,fu=Y(()=>{"use strict";Xt();ss();vr();te=tx("agent_runs",{id:pu("id").primaryKey().defaultRandom(),userId:pu("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),orgId:pu("org_id").references(()=>X.id,{onDelete:"set null"}),projectId:pu("project_id").references(()=>C.id,{onDelete:"set null"}),projectPath:ni("project_path"),gitRemote:ni("git_remote"),baseBranch:ni("base_branch"),title:ni("title"),prompt:ni("prompt"),toolSpec:my("tool_spec").notNull().default([]),autoWorktree:rx("auto_worktree").notNull().default(!0),status:ni("status").notNull().default("pending"),sessionCount:nx("session_count").notNull().default(0),metadata:my("metadata").notNull().default({}),createdAt:Pp("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:Pp("updated_at",{withTimezone:!0}).notNull().defaultNow(),completedAt:Pp("completed_at",{withTimezone:!0})},e=>[Dp("idx_agent_runs_user").on(e.userId),Dp("idx_agent_runs_org_created").on(e.orgId,e.createdAt),Dp("idx_agent_runs_project").on(e.projectId)])});import{pgTable as Op,text as xn,timestamp as Ga,jsonb as cs,uuid as Wr,integer as gu,uniqueIndex as py,index as Ir}from"drizzle-orm/pg-core";var y,Ve,ie,ri=Y(()=>{"use strict";Sn();vr();Xt();ss();fu();y=Op("sessions",{id:Wr("id").primaryKey().defaultRandom(),userId:Wr("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),externalSessionId:xn("external_session_id"),projectId:Wr("project_id").references(()=>C.id,{onDelete:"set null"}),orgId:Wr("org_id").references(()=>X.id,{onDelete:"set null"}),tool:xn("tool").notNull(),projectPath:xn("project_path"),gitBranch:xn("git_branch"),startedAt:Ga("started_at",{withTimezone:!0}).notNull(),endedAt:Ga("ended_at",{withTimezone:!0}),eventCount:gu("event_count").default(0),tokenUsage:cs("token_usage"),analysis:cs("analysis"),analyzedAt:Ga("analyzed_at",{withTimezone:!0}),analyzedEventCount:gu("analyzed_event_count"),analyzedTurnCount:gu("analyzed_turn_count"),metadata:cs("metadata").default({}),origin:xn("origin").notNull().default("unknown"),runId:Wr("run_id").references(()=>te.id,{onDelete:"set null"}),model:xn("model"),harnessVersion:xn("harness_version"),createdAt:Ga("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),py("idx_sessions_user_external").on(e.userId,e.externalSessionId)]),Ve=Op("session_events",{id:Wr("id").primaryKey().defaultRandom(),sessionId:Wr("session_id").notNull().references(()=>y.id,{onDelete:"cascade"}),sequence:gu("sequence").notNull(),eventType:xn("event_type").notNull(),content:xn("content"),toolName:xn("tool_name"),toolInput:cs("tool_input"),toolOutput:cs("tool_output"),tokenUsage:cs("token_usage"),model:xn("model"),timestamp:Ga("timestamp",{withTimezone:!0}).notNull(),metadata:cs("metadata").default({})},e=>[py("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)]),ie=Op("session_instructions",{sessionId:Wr("session_id").notNull().references(()=>y.id,{onDelete:"cascade"}),instructionId:Wr("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),linkMethod:xn("link_method").notNull(),contentHash:xn("content_hash")},e=>[Ir("idx_session_instructions_instruction_id").on(e.instructionId)])});import{pgTable as fy,text as hu,timestamp as gy,uuid as br,integer as hy,index as oi,unique as ox}from"drizzle-orm/pg-core";var Mt,ne,_y=Y(()=>{"use strict";Xt();vr();ri();Mt=fy("treatment_assignments",{id:br("id").primaryKey().defaultRandom(),userId:br("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),treatmentType:hu("treatment_type").notNull(),treatmentId:br("treatment_id").notNull(),treatmentVersion:hy("treatment_version").notNull().default(1),projectId:br("project_id").references(()=>C.id,{onDelete:"set null"}),assignedBy:br("assigned_by").references(()=>R.id,{onDelete:"set null"}),method:hu("method").notNull(),assignedAt:gy("assigned_at",{withTimezone:!0}).notNull().defaultNow()},e=>[oi("idx_treatment_assignments_user").on(e.userId),oi("idx_treatment_assignments_treatment").on(e.treatmentType,e.treatmentId),oi("idx_treatment_assignments_project").on(e.projectId)]),ne=fy("treatment_exposures",{id:br("id").primaryKey().defaultRandom(),sessionId:br("session_id").notNull().references(()=>y.id,{onDelete:"cascade"}),userId:br("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),treatmentType:hu("treatment_type").notNull(),treatmentId:br("treatment_id").notNull(),treatmentVersion:hy("treatment_version").notNull().default(1),assignmentId:br("assignment_id").references(()=>Mt.id,{onDelete:"set null"}),method:hu("method").notNull(),exposedAt:gy("exposed_at",{withTimezone:!0}).notNull().defaultNow()},e=>[ox("treatment_exposures_unique").on(e.sessionId,e.treatmentType,e.treatmentId,e.treatmentVersion),oi("idx_treatment_exposures_treatment").on(e.treatmentType,e.treatmentId),oi("idx_treatment_exposures_user").on(e.userId),oi("idx_treatment_exposures_session").on(e.sessionId)])});import{pgTable as sx,text as Cp,timestamp as ix,uuid as _u,integer as ax,index as yy,uniqueIndex as cx}from"drizzle-orm/pg-core";var yu,wy=Y(()=>{"use strict";Xt();vr();yu=sx("pending_treatment_exposures",{id:_u("id").primaryKey().defaultRandom(),userId:_u("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),externalSessionId:Cp("external_session_id").notNull(),treatmentType:Cp("treatment_type").notNull(),treatmentId:_u("treatment_id").notNull(),treatmentVersion:ax("treatment_version").notNull().default(1),method:Cp("method").notNull().default("injected"),projectId:_u("project_id").references(()=>C.id,{onDelete:"set null"}),createdAt:ix("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[cx("pending_treatment_exposures_unique").on(e.externalSessionId,e.treatmentType,e.treatmentId,e.treatmentVersion),yy("idx_pending_treatment_exposures_ext").on(e.externalSessionId),yy("idx_pending_treatment_exposures_user").on(e.userId)])});import{pgTable as vy,text as po,timestamp as Iy,uuid as si,numeric as dx,index as Lp,unique as ux}from"drizzle-orm/pg-core";var $,zr,Mp=Y(()=>{"use strict";Xt();Sn();$=vy("instruction_experiments",{id:si("id").primaryKey().defaultRandom(),userId:si("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),instructionId:si("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),projectPath:po("project_path").notNull(),status:po("status").notNull().default("running"),treatedShare:dx("treated_share").notNull().default("0.5"),salt:po("salt").notNull(),contentHash:po("content_hash"),source:po("source").notNull().default("manual"),stoppedReason:po("stopped_reason"),createdAt:Iy("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Lp("idx_instruction_experiments_lookup").on(e.userId,e.projectPath)]),zr=vy("instruction_experiment_arms",{id:si("id").primaryKey().defaultRandom(),experimentId:si("experiment_id").notNull().references(()=>$.id,{onDelete:"cascade"}),userId:si("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),externalSessionId:po("external_session_id").notNull(),arm:po("arm").notNull(),assignedAt:Iy("assigned_at",{withTimezone:!0}).notNull().defaultNow()},e=>[ux("instruction_experiment_arms_unique").on(e.experimentId,e.externalSessionId),Lp("idx_instruction_experiment_arms_experiment").on(e.experimentId,e.arm),Lp("idx_instruction_experiment_arms_session").on(e.externalSessionId)])});import{pgTable as lx,text as $p,timestamp as mx,uuid as wu,numeric as qp,integer as by,jsonb as px,index as fx,unique as gx}from"drizzle-orm/pg-core";var Z,Ey=Y(()=>{"use strict";Xt();Sn();Mp();Z=lx("instruction_verdicts",{id:wu("id").primaryKey().defaultRandom(),userId:wu("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),instructionId:wu("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),contentHash:$p("content_hash").notNull(),projectPath:$p("project_path").notNull(),segment:px("segment").notNull().default({}),decision:$p("decision").notNull(),delta:qp("delta").notNull(),ciLower:qp("ci_lower").notNull(),ciUpper:qp("ci_upper").notNull(),nTreated:by("n_treated").notNull(),nControl:by("n_control").notNull(),experimentId:wu("experiment_id").references(()=>$.id,{onDelete:"set null"}),decidedAt:mx("decided_at",{withTimezone:!0}).notNull().defaultNow()},e=>[gx("instruction_verdicts_unique").on(e.instructionId,e.contentHash,e.projectPath),fx("idx_instruction_verdicts_render").on(e.userId,e.projectPath)])});import{pgTable as hx,text as vu,timestamp as Up,uuid as Hp,integer as _x,unique as yx,index as wx}from"drizzle-orm/pg-core";var Re,Ay=Y(()=>{"use strict";Xt();Re=hx("insight_recommendation_log",{id:Hp("id").primaryKey().defaultRandom(),userId:Hp("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),projectPath:vu("project_path").notNull().default(""),category:vu("category").notNull(),contentHash:vu("content_hash").notNull(),label:vu("label").notNull().default(""),firstSeenAt:Up("first_seen_at",{withTimezone:!0}).notNull().defaultNow(),lastSeenAt:Up("last_seen_at",{withTimezone:!0}).notNull().defaultNow(),timesGenerated:_x("times_generated").notNull().default(1),lastJobId:Hp("last_job_id"),dismissedAt:Up("dismissed_at",{withTimezone:!0})},e=>[yx("insight_recommendation_log_unique").on(e.userId,e.projectPath,e.contentHash),wx("idx_insight_recommendation_log_read").on(e.userId,e.projectPath)])});import{pgTable as vx,text as ii,timestamp as Bp,uuid as Ya,integer as Sy,index as Iu}from"drizzle-orm/pg-core";var W,Fp=Y(()=>{"use strict";Xt();vr();W=vx("memories",{id:Ya("id").primaryKey().defaultRandom(),userId:Ya("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),orgId:Ya("org_id"),projectId:Ya("project_id").references(()=>C.id,{onDelete:"set null"}),version:Sy("version").notNull().default(1),parentId:Ya("parent_id").references(()=>W.id,{onDelete:"set null"}),kind:ii("kind").notNull(),title:ii("title").notNull(),body:ii("body").notNull(),source:ii("source").notNull(),status:ii("status").notNull().default("active"),trustClass:ii("trust_class"),trustVersion:Sy("trust_version"),trustComputedAt:Bp("trust_computed_at",{withTimezone:!0}),createdAt:Bp("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:Bp("updated_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Iu("idx_memories_user").on(e.userId),Iu("idx_memories_project").on(e.projectId),Iu("idx_memories_parent").on(e.parentId),Iu("idx_memories_user_status").on(e.userId,e.status)])});import{pgTable as Ix,text as Xa,timestamp as Wp,uuid as zp,integer as xy,jsonb as bx,index as Ry}from"drizzle-orm/pg-core";var $t,Ty=Y(()=>{"use strict";Xt();Fp();$t=Ix("memory_experiments",{id:zp("id").primaryKey().defaultRandom(),memoryId:zp("memory_id").notNull().references(()=>W.id,{onDelete:"cascade"}),userId:zp("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),memoryVersion:xy("memory_version").notNull().default(1),taskPrompt:Xa("task_prompt").notNull(),expectations:Xa("expectations").array().notNull().default([]),trials:xy("trials").notNull().default(10),model:Xa("model"),status:Xa("status").notNull().default("pending"),result:bx("result").$type(),error:Xa("error"),createdAt:Wp("created_at",{withTimezone:!0}).notNull().defaultNow(),startedAt:Wp("started_at",{withTimezone:!0}),completedAt:Wp("completed_at",{withTimezone:!0})},e=>[Ry("idx_memory_experiments_memory").on(e.memoryId),Ry("idx_memory_experiments_user").on(e.userId)])});import{pgTable as Ex,text as ai,timestamp as Vp,uuid as Jp,jsonb as Ax,uniqueIndex as Sx,index as ky}from"drizzle-orm/pg-core";var Ze,Kp=Y(()=>{"use strict";Xt();ri();Ze=Ex("session_terminal_targets",{id:Jp("id").primaryKey().defaultRandom(),userId:Jp("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),sessionId:Jp("session_id").references(()=>y.id,{onDelete:"set null"}),externalSessionId:ai("external_session_id"),kind:ai("kind").notNull(),target:ai("target").notNull(),status:ai("status").notNull().default("active"),attachCommand:ai("attach_command").notNull(),projectPath:ai("project_path"),metadata:Ax("metadata").notNull().default({}),lastSeenAt:Vp("last_seen_at",{withTimezone:!0}).defaultNow(),createdAt:Vp("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Vp("updated_at",{withTimezone:!0}).defaultNow()},e=>[Sx("idx_session_terminal_targets_user_target").on(e.userId,e.target),ky("idx_session_terminal_targets_session").on(e.sessionId),ky("idx_session_terminal_targets_user_status").on(e.userId,e.status)])});import{boolean as xx,index as bu,jsonb as Ny,pgTable as Rx,text as ds,timestamp as Qa,uuid as Eu,integer as jy}from"drizzle-orm/pg-core";var Au,Py=Y(()=>{"use strict";ri();Kp();Au=Rx("session_send_jobs",{id:Eu("id").primaryKey().defaultRandom(),userId:Eu("user_id").notNull(),sessionId:Eu("session_id").notNull().references(()=>y.id,{onDelete:"cascade"}),terminalTargetId:Eu("terminal_target_id").references(()=>Ze.id,{onDelete:"set null"}),target:ds("target").notNull(),message:ds("message").notNull(),submit:xx("submit").notNull().default(!0),delivery:ds("delivery").notNull().default("live"),status:ds("status").notNull().default("pending"),result:Ny("result"),error:ds("error"),attempts:jy("attempts").notNull().default(0),taskKind:ds("task_kind"),payload:Ny("payload"),claimedBy:ds("claimed_by"),claimedAt:Qa("claimed_at",{withTimezone:!0}),leaseExpiresAt:Qa("lease_expires_at",{withTimezone:!0}),leaseRecoveries:jy("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=>[bu("idx_session_send_jobs_user").on(e.userId),bu("idx_session_send_jobs_session").on(e.sessionId),bu("idx_session_send_jobs_status").on(e.status),bu("idx_session_send_jobs_pending").on(e.userId,e.status)])});import{pgTable as Oy,text as us,timestamp as Su,jsonb as Cy,uuid as fo,integer as Tx,boolean as kx,uniqueIndex as Nx,index as Dy,primaryKey as jx}from"drizzle-orm/pg-core";var Ue,Me,Ly=Y(()=>{"use strict";Sn();Ue=Oy("packs",{id:fo("id").primaryKey().defaultRandom(),name:us("name").notNull(),description:us("description").notNull(),scope:us("scope").notNull(),scopeRef:fo("scope_ref"),version:us("version").notNull().default("1.0.0"),tags:us("tags").array(),badge:us("badge"),metadata:Cy("metadata"),createdBy:fo("created_by"),createdAt:Su("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Su("updated_at",{withTimezone:!0}).defaultNow(),archived:kx("archived").default(!1),archivedAt:Su("archived_at",{withTimezone:!0}),archivedBy:fo("archived_by"),forkedFromId:fo("forked_from_id").references(()=>Ue.id,{onDelete:"set null"}),upstreamVersion:us("upstream_version")},e=>[Nx("packs_name_scope_ref_idx").on(e.name,e.scope,e.scopeRef),Dy("idx_packs_scope").on(e.scope,e.scopeRef),Dy("idx_packs_created_by").on(e.createdBy)]),Me=Oy("pack_instructions",{packId:fo("pack_id").references(()=>Ue.id,{onDelete:"cascade"}).notNull(),instructionId:fo("instruction_id").references(()=>g.id,{onDelete:"cascade"}).notNull(),position:Tx("position").notNull().default(0),slotOverrides:Cy("slot_overrides"),addedAt:Su("added_at",{withTimezone:!0}).defaultNow(),addedBy:fo("added_by")},e=>[jx({columns:[e.packId,e.instructionId]})])});import{pgTable as Px,text as Gp,timestamp as Dx,jsonb as Ox,uuid as Yp,index as ci}from"drizzle-orm/pg-core";var go,My=Y(()=>{"use strict";Sn();go=Px("instruction_usage_events",{id:Yp("id").primaryKey().defaultRandom(),instructionId:Yp("instruction_id").references(()=>g.id,{onDelete:"set null"}),userId:Yp("user_id").notNull(),surface:Gp("surface").notNull(),action:Gp("action").notNull(),metadata:Ox("metadata"),traceId:Gp("trace_id"),createdAt:Dx("created_at",{withTimezone:!0}).defaultNow()},e=>[ci("idx_usage_events_instruction").on(e.instructionId),ci("idx_usage_events_user").on(e.userId),ci("idx_usage_events_surface").on(e.surface),ci("idx_usage_events_action").on(e.action),ci("idx_usage_events_created_at").on(e.createdAt),ci("idx_usage_events_user_created").on(e.userId,e.createdAt)])});import{pgTable as Cx,text as xu,timestamp as $y,jsonb as Lx,uuid as qy,index as Xp}from"drizzle-orm/pg-core";var fe,Uy=Y(()=>{"use strict";fe=Cx("worker_connections",{id:qy("id").primaryKey().defaultRandom(),userId:qy("user_id").notNull(),workerType:xu("worker_type").notNull().default("mcp"),clientName:xu("client_name").notNull(),clientVersion:xu("client_version"),workerVersion:xu("worker_version"),lastHeartbeat:$y("last_heartbeat",{withTimezone:!0}).notNull().defaultNow(),connectedAt:$y("connected_at",{withTimezone:!0}).notNull().defaultNow(),metadata:Lx("metadata")},e=>[Xp("idx_worker_connections_user").on(e.userId),Xp("idx_worker_connections_heartbeat").on(e.userId,e.lastHeartbeat),Xp("idx_worker_connections_type").on(e.userId,e.workerType)])});import{pgTable as Mx,text as Ru,timestamp as $x,jsonb as qx,uuid as Hy,index as By}from"drizzle-orm/pg-core";var Tu,Fy=Y(()=>{"use strict";Tu=Mx("cli_setup_events",{id:Hy("id").primaryKey().defaultRandom(),userId:Hy("user_id").notNull(),deviceId:Ru("device_id").notNull(),event:Ru("event").notNull(),cliVersion:Ru("cli_version"),os:Ru("os"),props:qx("props").notNull().default({}),createdAt:$x("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[By("idx_cli_setup_events_user").on(e.userId,e.createdAt),By("idx_cli_setup_events_device").on(e.deviceId,e.createdAt)])});import{pgTable as Ux,text as ls,integer as Hx,boolean as Bx,timestamp as Fx,jsonb as Wx,uuid as zx,index as Wy}from"drizzle-orm/pg-core";var ku,zy=Y(()=>{"use strict";ku=Ux("cli_error_events",{id:zx("id").primaryKey().defaultRandom(),deviceId:ls("device_id"),event:ls("event").notNull(),command:ls("command"),statusCode:Hx("status_code"),message:ls("message"),cliVersion:ls("cli_version"),os:ls("os"),nodeVersion:ls("node_version"),proxied:Bx("proxied"),props:Wx("props").notNull().default({}),createdAt:Fx("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Wy("idx_cli_error_events_created").on(e.createdAt),Wy("idx_cli_error_events_device").on(e.deviceId,e.createdAt)])});import{sql as Qp}from"drizzle-orm";import{pgTable as ms,text as _t,timestamp as hn,jsonb as qn,uuid as mt,integer as Vr,boolean as Za,index as Bt,unique as Vy}from"drizzle-orm/pg-core";var k,Ee,Ie,ot,et,me,rr,ec=Y(()=>{"use strict";Sn();k=ms("eval_targets",{id:mt("id").primaryKey().defaultRandom(),userId:mt("user_id").notNull(),name:_t("name").notNull(),type:_t("type").notNull(),content:_t("content").notNull(),description:_t("description").notNull().default(""),metadata:qn("metadata").notNull().default({}),version:Vr("version").notNull().default(1),parentId:mt("parent_id").references(()=>k.id,{onDelete:"set null"}),instructionId:mt("instruction_id").references(()=>g.id,{onDelete:"set null"}),projectPath:_t("project_path"),createdAt:hn("created_at",{withTimezone:!0}).defaultNow(),updatedAt:hn("updated_at",{withTimezone:!0}).defaultNow()},e=>[Bt("eval_targets_name_user_idx").on(e.name,e.userId),Bt("idx_eval_targets_user").on(e.userId),Bt("idx_eval_targets_type").on(e.type),Bt("idx_eval_targets_parent").on(e.parentId),Bt("idx_eval_targets_instruction").on(e.instructionId).where(Qp`${e.instructionId} IS NOT NULL`),Bt("idx_eval_targets_project").on(e.projectPath).where(Qp`${e.projectPath} IS NOT NULL`)]),Ee=ms("evals",{id:mt("id").primaryKey().defaultRandom(),evalTargetId:mt("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),name:_t("name").notNull(),prompt:_t("prompt").notNull(),expectedOutput:_t("expected_output").notNull().default(""),files:qn("files").notNull().default([]),expectations:qn("expectations").notNull().default([]),retiredAt:hn("retired_at",{withTimezone:!0}),retiredReason:_t("retired_reason"),createdAt:hn("created_at",{withTimezone:!0}).defaultNow(),updatedAt:hn("updated_at",{withTimezone:!0}).defaultNow(),contentUpdatedAt:hn("content_updated_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Bt("idx_evals_target").on(e.evalTargetId),Bt("idx_evals_target_active").on(e.evalTargetId).where(Qp`${e.retiredAt} IS NULL`)]),Ie=ms("eval_runs",{id:mt("id").primaryKey().defaultRandom(),jobId:mt("job_id"),evalId:mt("eval_id").notNull().references(()=>Ee.id,{onDelete:"cascade"}),evalTargetId:mt("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),evalTargetVersion:Vr("eval_target_version").notNull(),configuration:_t("configuration").notNull(),runNumber:Vr("run_number").notNull().default(1),iteration:Vr("iteration").notNull().default(1),status:_t("status").notNull().default("completed"),outputs:qn("outputs").notNull().default({}),timing:qn("timing").notNull().default({}),grading:qn("grading").notNull().default({}),comparison:qn("comparison"),createdAt:hn("created_at",{withTimezone:!0}).defaultNow()},e=>[Bt("idx_eval_runs_eval").on(e.evalId),Bt("idx_eval_runs_target").on(e.evalTargetId),Bt("idx_eval_runs_iteration").on(e.evalTargetId,e.iteration)]),ot=ms("eval_comparisons",{id:mt("id").primaryKey().defaultRandom(),userId:mt("user_id").notNull(),targetAId:mt("target_a_id").notNull().references(()=>k.id,{onDelete:"cascade"}),targetBId:mt("target_b_id").notNull().references(()=>k.id,{onDelete:"cascade"}),targetAVersion:Vr("target_a_version").notNull(),targetBVersion:Vr("target_b_version").notNull(),isSwapped:Za("is_swapped").notNull().default(!1),winnerTargetId:mt("winner_target_id").references(()=>k.id,{onDelete:"set null"}),perEval:qn("per_eval").notNull().default([]),overall:qn("overall").notNull().default({}),rawOutput:_t("raw_output"),model:_t("model"),status:_t("status").notNull().default("completed"),createdAt:hn("created_at",{withTimezone:!0}).defaultNow()},e=>[Bt("idx_eval_comparisons_target_a").on(e.targetAId),Bt("idx_eval_comparisons_target_b").on(e.targetBId),Bt("idx_eval_comparisons_user").on(e.userId)]),et=ms("eval_grade_annotations",{id:mt("id").primaryKey().defaultRandom(),userId:mt("user_id").notNull(),evalRunId:mt("eval_run_id").notNull().references(()=>Ie.id,{onDelete:"cascade"}),evalTargetId:mt("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),expectationIndex:Vr("expectation_index").notNull(),expectationText:_t("expectation_text").notNull(),judgePassed:Za("judge_passed").notNull(),judgeMethod:_t("judge_method").notNull(),judgeModel:_t("judge_model"),verdict:_t("verdict").notNull(),flag:_t("flag"),note:_t("note"),createdAt:hn("created_at",{withTimezone:!0}).defaultNow(),updatedAt:hn("updated_at",{withTimezone:!0}).defaultNow()},e=>[Bt("idx_eval_grade_annotations_target").on(e.evalTargetId),Bt("idx_eval_grade_annotations_run").on(e.evalRunId),Vy("eval_grade_annotations_eval_run_id_expectation_index_key").on(e.evalRunId,e.expectationIndex)]),me=ms("judge_reviewer_verdicts",{id:mt("id").primaryKey().defaultRandom(),userId:mt("user_id").notNull(),evalTargetId:mt("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),evalRunId:mt("eval_run_id").notNull().references(()=>Ie.id,{onDelete:"cascade"}),expectationIndex:Vr("expectation_index").notNull(),expectationText:_t("expectation_text").notNull(),judgePassed:Za("judge_passed").notNull(),humanPassed:Za("human_passed").notNull(),reviewerEngine:_t("reviewer_engine").notNull(),reviewerModel:_t("reviewer_model").notNull(),reviewerPassed:Za("reviewer_passed").notNull(),resolvedAt:hn("resolved_at",{withTimezone:!0}),resolution:_t("resolution"),createdAt:hn("created_at",{withTimezone:!0}).defaultNow(),updatedAt:hn("updated_at",{withTimezone:!0}).defaultNow()},e=>[Bt("idx_jrv_target").on(e.evalTargetId),Vy("judge_reviewer_verdicts_eval_run_id_expectation_index_review_key").on(e.evalRunId,e.expectationIndex,e.reviewerModel)]),rr=ms("benchmarks",{id:mt("id").primaryKey().defaultRandom(),evalTargetId:mt("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),iteration:Vr("iteration").notNull().default(1),runSummary:qn("run_summary").notNull().default({}),notes:qn("notes").notNull().default([]),feedback:qn("feedback"),createdAt:hn("created_at",{withTimezone:!0}).defaultNow()},e=>[Bt("idx_benchmarks_target").on(e.evalTargetId)])});import{sql as Zp}from"drizzle-orm";import{pgTable as Vx,text as Jr,timestamp as Jx,jsonb as Nu,uuid as ju,boolean as Kx,index as tc,uniqueIndex as Gx}from"drizzle-orm/pg-core";var ae,Jy=Y(()=>{"use strict";ec();Sn();ae=Vx("instruction_promotions",{id:ju("id").primaryKey().defaultRandom(),userId:ju("user_id").notNull(),evalTargetId:ju("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),instructionId:ju("instruction_id").references(()=>g.id,{onDelete:"set null"}),fromContentHash:Jr("from_content_hash").notNull(),toContentHash:Jr("to_content_hash").notNull(),fromContent:Jr("from_content").notNull(),toContent:Jr("to_content").notNull(),proposalSource:Jr("proposal_source").notNull(),proposalRationale:Jr("proposal_rationale").notNull().default(""),decision:Jr("decision").notNull(),applied:Kx("applied").notNull().default(!1),refusals:Nu("refusals").notNull().default([]),rationale:Jr("rationale").notNull().default(""),effectClass:Jr("effect_class").notNull(),verdict:Nu("verdict").notNull().default({}),gates:Nu("gates").notNull().default({}),touchedSections:Nu("touched_sections").notNull().default([]),createdAt:Jx("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[tc("idx_instruction_promotions_budget").on(e.evalTargetId,e.createdAt.desc()).where(Zp`${e.applied}`),tc("idx_instruction_promotions_target").on(e.evalTargetId,e.createdAt.desc()),tc("idx_instruction_promotions_user").on(e.userId,e.createdAt.desc()),tc("idx_instruction_promotions_to_hash").on(e.toContentHash),Gx("uq_instruction_promotions_applied").on(e.evalTargetId,e.fromContentHash,e.toContentHash).where(Zp`${e.applied}`),tc("idx_instruction_promotions_applied_hash").on(e.toContentHash,e.createdAt.desc()).where(Zp`${e.applied}`)])});import{index as nc,integer as Yx,jsonb as Xx,pgTable as Qx,text as Rn,timestamp as di,uniqueIndex as Zx,uuid as rc}from"drizzle-orm/pg-core";var Te,Ky=Y(()=>{"use strict";Sn();vr();Te=Qx("recommendation_applications",{id:rc("id").primaryKey().defaultRandom(),userId:rc("user_id").notNull(),instructionId:rc("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),projectId:rc("project_id").references(()=>C.id,{onDelete:"set null"}),projectPath:Rn("project_path").notNull(),harness:Rn("harness").notNull(),targetPath:Rn("target_path").notNull(),status:Rn("status").notNull().default("proposed"),applyMode:Rn("apply_mode").notNull(),beforeHash:Rn("before_hash"),appliedHash:Rn("applied_hash"),appliedAt:di("applied_at",{withTimezone:!0}),measurementStartedAt:di("measurement_started_at",{withTimezone:!0}),measurementEndedAt:di("measurement_ended_at",{withTimezone:!0}),verdict:Rn("verdict"),verdictDetail:Rn("verdict_detail"),revertedAt:di("reverted_at",{withTimezone:!0}),boundaryClass:Rn("boundary_class"),targets:Rn("targets").array().notNull().default([]),inverse:Xx("inverse"),requires:Rn("requires").array().notNull().default([]),provides:Rn("provides").array().notNull().default([]),applyBatchId:rc("apply_batch_id"),applySeq:Yx("apply_seq"),createdAt:di("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:di("updated_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Zx("uq_recommendation_applications_target").on(e.userId,e.instructionId,e.projectPath,e.harness,e.targetPath),nc("idx_recommendation_applications_user_status").on(e.userId,e.status,e.updatedAt.desc()),nc("idx_recommendation_applications_user_harness").on(e.userId,e.harness,e.updatedAt.desc()),nc("idx_recommendation_applications_project").on(e.projectId,e.updatedAt.desc()),nc("idx_recommendation_applications_batch").on(e.userId,e.applyBatchId,e.applySeq.desc()),nc("idx_recommendation_applications_requires").using("gin",e.requires)])});import{pgTable as eR,text as ho,timestamp as tR,jsonb as oc,uuid as ef,integer as tf,real as nR,index as sc,uniqueIndex as Gy}from"drizzle-orm/pg-core";var M,Yy=Y(()=>{"use strict";ri();Xt();M=eR("context_snapshots",{id:ef("id").primaryKey().defaultRandom(),sessionId:ef("session_id").references(()=>y.id,{onDelete:"cascade"}),userId:ef("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),sequence:tf("sequence").notNull().default(0),provider:ho("provider").notNull(),model:ho("model").notNull(),systemPrompt:ho("system_prompt").notNull(),injectedInstructions:oc("injected_instructions").notNull().default([]),messagesSummary:oc("messages_summary").notNull(),tools:oc("tools").notNull().default([]),systemHash:ho("system_hash").notNull(),requestHash:ho("request_hash").notNull().default(""),toolsHash:ho("tools_hash"),injectedHash:ho("injected_hash"),messagesDelta:oc("messages_delta").default([]),messagesDeltaRef:ho("messages_delta_ref"),maxTokens:tf("max_tokens"),temperature:nR("temperature"),estimatedTokens:tf("estimated_tokens"),capturedAt:tR("captured_at",{withTimezone:!0}).notNull().defaultNow(),metadata:oc("metadata").default({})},e=>[sc("idx_context_snapshots_session").on(e.sessionId),sc("idx_context_snapshots_user").on(e.userId),sc("idx_context_snapshots_hash").on(e.systemHash),sc("idx_context_snapshots_request_hash").on(e.requestHash),Gy("idx_snapshots_session_request").on(e.sessionId,e.requestHash),Gy("idx_snapshots_session_sequence").on(e.sessionId,e.sequence),sc("idx_context_snapshots_user_session_captured").on(e.userId,e.sessionId,e.capturedAt.desc())])});import{pgTable as rR,text as Xy,timestamp as oR,jsonb as sR,integer as iR,index as aR}from"drizzle-orm/pg-core";var Tn,Qy=Y(()=>{"use strict";Tn=rR("content_blobs",{hash:Xy("hash").primaryKey(),contentType:Xy("content_type").notNull(),content:sR("content").notNull(),sizeBytes:iR("size_bytes").notNull().default(0),createdAt:oR("created_at",{withTimezone:!0}).defaultNow()},e=>[aR("idx_content_blobs_type").on(e.contentType)])});import{pgTable as cR,text as Pu,timestamp as ic,jsonb as Du,uuid as nf,index as Ou,integer as Zy}from"drizzle-orm/pg-core";var je,ew=Y(()=>{"use strict";ec();je=cR("eval_jobs",{id:nf("id").primaryKey().defaultRandom(),userId:nf("user_id").notNull(),evalTargetId:nf("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),status:Pu("status").notNull().default("pending"),config:Du("config").notNull().default({}),progress:Du("progress").notNull().default({}),result:Du("result"),error:Pu("error"),attempts:Zy("attempts").notNull().default(0),taskKind:Pu("task_kind"),payload:Du("payload"),claimedBy:Pu("claimed_by"),claimedAt:ic("claimed_at",{withTimezone:!0}),leaseExpiresAt:ic("lease_expires_at",{withTimezone:!0}),leaseRecoveries:Zy("lease_recoveries").notNull().default(0),createdAt:ic("created_at",{withTimezone:!0}).defaultNow(),updatedAt:ic("updated_at",{withTimezone:!0}).defaultNow(),completedAt:ic("completed_at",{withTimezone:!0})},e=>[Ou("idx_eval_jobs_user").on(e.userId),Ou("idx_eval_jobs_target").on(e.evalTargetId),Ou("idx_eval_jobs_status").on(e.status),Ou("idx_eval_jobs_pending").on(e.userId,e.status)])});import{pgTable as dR,text as ac,timestamp as cc,jsonb as tw,uuid as nw,integer as rw,index as ow}from"drizzle-orm/pg-core";var Pe,sw=Y(()=>{"use strict";Pe=dR("agent_jobs",{id:nw("id").primaryKey().defaultRandom(),userId:nw("user_id").notNull(),taskKind:ac("task_kind").notNull(),status:ac("status").notNull().default("pending"),payload:tw("payload").notNull(),dedupeKey:ac("dedupe_key"),result:tw("result"),error:ac("error"),attempts:rw("attempts").notNull().default(0),claimedBy:ac("claimed_by"),claimedAt:cc("claimed_at",{withTimezone:!0}),leaseExpiresAt:cc("lease_expires_at",{withTimezone:!0}),leaseRecoveries:rw("lease_recoveries").notNull().default(0),createdAt:cc("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:cc("updated_at",{withTimezone:!0}).notNull().defaultNow(),completedAt:cc("completed_at",{withTimezone:!0})},e=>[ow("idx_agent_jobs_claim").on(e.userId,e.status,e.taskKind,e.createdAt),ow("idx_agent_jobs_dedupe").on(e.userId,e.taskKind,e.dedupeKey)])});import{pgTable as uR,text as dc,timestamp as uc,jsonb as Cu,uuid as rf,index as Lu,integer as iw}from"drizzle-orm/pg-core";var z,aw=Y(()=>{"use strict";vr();z=uR("insights_jobs",{id:rf("id").primaryKey().defaultRandom(),userId:rf("user_id").notNull(),status:dc("status").notNull().default("pending"),projectPath:dc("project_path"),projectId:rf("project_id").references(()=>C.id,{onDelete:"set null"}),config:Cu("config").notNull().default({}),progress:Cu("progress").notNull().default({}),result:Cu("result"),error:dc("error"),attempts:iw("attempts").notNull().default(0),taskKind:dc("task_kind"),payload:Cu("payload"),claimedBy:dc("claimed_by"),claimedAt:uc("claimed_at",{withTimezone:!0}),leaseExpiresAt:uc("lease_expires_at",{withTimezone:!0}),leaseRecoveries:iw("lease_recoveries").notNull().default(0),createdAt:uc("created_at",{withTimezone:!0}).defaultNow(),updatedAt:uc("updated_at",{withTimezone:!0}).defaultNow(),completedAt:uc("completed_at",{withTimezone:!0})},e=>[Lu("idx_insights_jobs_user").on(e.userId),Lu("idx_insights_jobs_status").on(e.status),Lu("idx_insights_jobs_pending").on(e.userId,e.status),Lu("idx_insights_jobs_project").on(e.projectId)])});import{pgTable as lR,text as of,timestamp as Mu,uuid as cw,index as mR,uniqueIndex as pR}from"drizzle-orm/pg-core";var Ae,dw=Y(()=>{"use strict";Xt();Ae=lR("api_keys",{id:cw("id").primaryKey().defaultRandom(),userId:cw("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),name:of("name").notNull(),keyHash:of("key_hash").notNull(),keyPrefix:of("key_prefix").notNull(),lastUsedAt:Mu("last_used_at",{withTimezone:!0}),expiresAt:Mu("expires_at",{withTimezone:!0}),revokedAt:Mu("revoked_at",{withTimezone:!0}),createdAt:Mu("created_at",{withTimezone:!0}).defaultNow()},e=>[mR("idx_api_keys_user").on(e.userId),pR("idx_api_keys_hash").on(e.keyHash)])});import{pgTable as fR,text as sf,timestamp as uw,uuid as gR,index as hR}from"drizzle-orm/pg-core";var Un,lw=Y(()=>{"use strict";Xt();Un=fR("extension_auth_codes",{code:sf("code").primaryKey(),userId:gR("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),editor:sf("editor"),email:sf("email"),expiresAt:uw("expires_at",{withTimezone:!0}).notNull(),createdAt:uw("created_at",{withTimezone:!0}).defaultNow()},e=>[hR("idx_ext_auth_codes_expiry").on(e.expiresAt)])});import{pgTable as _R,text as yR,timestamp as mw,jsonb as wR,uuid as af,index as pw}from"drizzle-orm/pg-core";var He,fw=Y(()=>{"use strict";ec();He=_R("eval_conversations",{id:af("id").primaryKey().defaultRandom(),evalTargetId:af("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),userId:af("user_id").notNull(),messages:wR("messages").notNull().default([]),status:yR("status").notNull().default("active"),createdAt:mw("created_at",{withTimezone:!0}).defaultNow(),updatedAt:mw("updated_at",{withTimezone:!0}).defaultNow()},e=>[pw("idx_eval_conversations_target").on(e.evalTargetId),pw("idx_eval_conversations_user").on(e.userId)])});import{pgTable as vR,text as Kr,timestamp as gw,jsonb as IR,uuid as cf}from"drizzle-orm/pg-core";var _o,hw=Y(()=>{"use strict";_o=vR("skill_submissions",{id:cf("id").primaryKey().defaultRandom(),skillId:Kr("skill_id").notNull(),name:Kr("name").notNull(),description:Kr("description").notNull(),category:Kr("category").notNull(),tools:Kr("tools").array().notNull(),tags:Kr("tags").array().default([]),content:Kr("content").notNull(),status:Kr("status").notNull().default("pending"),submittedBy:cf("submitted_by").notNull(),reviewedBy:cf("reviewed_by"),reviewNote:Kr("review_note"),metadata:IR("metadata"),createdAt:gw("created_at",{withTimezone:!0}).defaultNow(),updatedAt:gw("updated_at",{withTimezone:!0}).defaultNow()})});import{pgTable as bR,text as lc,timestamp as _w,jsonb as ER,uuid as AR,uniqueIndex as SR,index as yw}from"drizzle-orm/pg-core";var qt,ww=Y(()=>{"use strict";qt=bR("harness_releases",{id:AR("id").primaryKey().defaultRandom(),harness:lc("harness").notNull(),version:lc("version").notNull(),publishedAt:_w("published_at",{withTimezone:!0}).notNull(),title:lc("title"),body:lc("body"),categories:ER("categories").default({}),url:lc("url"),createdAt:_w("created_at",{withTimezone:!0}).defaultNow()},e=>[SR("idx_harness_releases_unique").on(e.harness,e.version),yw("idx_harness_releases_harness").on(e.harness),yw("idx_harness_releases_published").on(e.publishedAt)])});import{pgTable as xR,text as ui,timestamp as vw,jsonb as RR,uuid as Iw,index as bw,uniqueIndex as TR}from"drizzle-orm/pg-core";var Rt,Ew=Y(()=>{"use strict";Rt=xR("notifications",{id:Iw("id").primaryKey().defaultRandom(),userId:Iw("user_id").notNull(),type:ui("type").notNull(),title:ui("title").notNull(),body:ui("body"),url:ui("url"),sourceTable:ui("source_table"),sourceId:ui("source_id"),metadata:RR("metadata").notNull().default({}),readAt:vw("read_at",{withTimezone:!0}),createdAt:vw("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[bw("idx_notifications_user_created").on(e.userId,e.createdAt),bw("idx_notifications_user_unread").on(e.userId),TR("idx_notifications_source_dedup").on(e.userId,e.sourceTable,e.sourceId)])});import{pgTable as kR,text as mc,timestamp as pc,jsonb as df,uuid as uf,index as $u,integer as Aw}from"drizzle-orm/pg-core";var ue,Sw=Y(()=>{"use strict";fu();ue=kR("launch_jobs",{id:uf("id").primaryKey().defaultRandom(),userId:uf("user_id").notNull(),tool:mc("tool").notNull(),status:mc("status").notNull().default("pending"),config:df("config").notNull().default({}),result:df("result"),error:mc("error"),attempts:Aw("attempts").notNull().default(0),taskKind:mc("task_kind"),payload:df("payload"),claimedBy:mc("claimed_by"),claimedAt:pc("claimed_at",{withTimezone:!0}),leaseExpiresAt:pc("lease_expires_at",{withTimezone:!0}),leaseRecoveries:Aw("lease_recoveries").notNull().default(0),createdAt:pc("created_at",{withTimezone:!0}).defaultNow(),updatedAt:pc("updated_at",{withTimezone:!0}).defaultNow(),completedAt:pc("completed_at",{withTimezone:!0}),runId:uf("run_id").references(()=>te.id,{onDelete:"set null"})},e=>[$u("idx_launch_jobs_user").on(e.userId),$u("idx_launch_jobs_status").on(e.status),$u("idx_launch_jobs_pending").on(e.userId,e.status),$u("idx_launch_jobs_run").on(e.runId)])});import{pgTable as xw,uuid as Gr,text as yo,real as NR,timestamp as fc,boolean as jR,uniqueIndex as PR,index as gc}from"drizzle-orm/pg-core";var qu,x,Ge,Rw=Y(()=>{"use strict";Xt();Sn();vr();qu=["add","remove","trim"],x=xw("instruction_suggestions",{id:Gr("id").primaryKey().defaultRandom(),userId:Gr("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),instructionId:Gr("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),projectPath:yo("project_path").notNull(),projectId:Gr("project_id").references(()=>C.id,{onDelete:"set null"}),score:NR("score").notNull(),reason:yo("reason").notNull(),kind:yo("kind").$type().notNull().default("add"),generatedAt:fc("generated_at",{withTimezone:!0}).notNull().defaultNow(),isStale:jR("is_stale").notNull().default(!1),dismissedAt:fc("dismissed_at",{withTimezone:!0}),acceptedAt:fc("accepted_at",{withTimezone:!0}),declinedAt:fc("declined_at",{withTimezone:!0}),declinedReason:yo("declined_reason"),promotedToInstructionId:Gr("promoted_to_instruction_id").references(()=>g.id,{onDelete:"set null"})},e=>[PR("idx_instruction_suggestions_user_project_instruction_kind").on(e.userId,e.projectPath,e.instructionId,e.kind),gc("idx_instruction_suggestions_user_project").on(e.userId,e.projectPath),gc("idx_instruction_suggestions_user_proj_id").on(e.userId,e.projectId),gc("idx_instruction_suggestions_generated_at").on(e.generatedAt)]),Ge=xw("instruction_suggestion_events",{id:Gr("id").primaryKey().defaultRandom(),suggestionId:Gr("suggestion_id").notNull().references(()=>x.id,{onDelete:"cascade"}),userId:Gr("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),eventType:yo("event_type").notNull(),tool:yo("tool"),sessionId:Gr("session_id"),projectPath:yo("project_path").notNull(),actor:yo("actor"),createdAt:fc("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[gc("idx_instruction_suggestion_events_suggestion_id").on(e.suggestionId),gc("idx_instruction_suggestion_events_user_id").on(e.userId)])});import{pgTable as DR,text as lf,integer as OR,numeric as hc,timestamp as mf,index as CR,primaryKey as LR}from"drizzle-orm/pg-core";var st,Tw=Y(()=>{"use strict";st=DR("model_pricing",{provider:lf("provider").notNull(),modelId:lf("model_id").notNull(),inputPerM:hc("input_per_m").notNull(),outputPerM:hc("output_per_m").notNull(),cacheReadPerM:hc("cache_read_per_m").notNull(),cacheWrite5mPerM:hc("cache_write_5m_per_m").notNull(),cacheWrite1hPerM:hc("cache_write_1h_per_m").notNull(),contextWindow:OR("context_window"),effectiveFrom:mf("effective_from",{withTimezone:!0}).notNull(),effectiveUntil:mf("effective_until",{withTimezone:!0}),source:lf("source").notNull(),verifiedAt:mf("verified_at",{withTimezone:!0})},e=>[LR({columns:[e.provider,e.modelId,e.effectiveFrom]}),CR("idx_model_pricing_active").on(e.provider,e.modelId,e.effectiveFrom.desc())])});import{pgTable as MR,text as ps,numeric as kw,timestamp as Nw,uuid as jw,jsonb as $R,index as Pw}from"drizzle-orm/pg-core";var ve,Dw=Y(()=>{"use strict";ve=MR("limit_observations",{id:jw("id").primaryKey().defaultRandom(),observedAt:Nw("observed_at",{withTimezone:!0}).notNull().defaultNow(),provider:ps("provider").notNull(),plan:ps("plan").notNull(),limitType:ps("limit_type").notNull(),value:kw("value").notNull(),unit:ps("unit").notNull(),comparator:ps("comparator").notNull().default("="),resetsAt:Nw("resets_at",{withTimezone:!0}),sourceType:ps("source_type").notNull(),sourceUrl:ps("source_url"),sourceEvidence:$R("source_evidence"),confidence:kw("confidence").notNull(),userId:jw("user_id")},e=>[Pw("idx_limit_obs_lookup").on(e.provider,e.plan,e.limitType,e.observedAt.desc()),Pw("idx_limit_obs_user").on(e.userId,e.observedAt.desc())])});import{pgTable as qR,text as Uu,timestamp as UR,uuid as HR,jsonb as BR,boolean as FR,uniqueIndex as WR}from"drizzle-orm/pg-core";var Dt,Ow=Y(()=>{"use strict";Dt=qR("provider_docs_snapshots",{id:HR("id").primaryKey().defaultRandom(),fetchedAt:UR("fetched_at",{withTimezone:!0}).notNull().defaultNow(),provider:Uu("provider").notNull(),docUrl:Uu("doc_url").notNull(),contentHash:Uu("content_hash").notNull(),content:Uu("content").notNull(),parseSuccess:FR("parse_success").notNull(),parseErrors:BR("parse_errors")},e=>[WR("idx_docs_dedup").on(e.provider,e.docUrl,e.contentHash)])});import{pgTable as zR,text as Hu,numeric as Cw,timestamp as Lw,uuid as VR,primaryKey as JR,index as KR}from"drizzle-orm/pg-core";var tt,Mw=Y(()=>{"use strict";tt=zR("plan_limits_active",{provider:Hu("provider").notNull(),plan:Hu("plan").notNull(),limitType:Hu("limit_type").notNull(),value:Cw("value").notNull(),unit:Hu("unit").notNull(),effectiveFrom:Lw("effective_from",{withTimezone:!0}).notNull(),effectiveUntil:Lw("effective_until",{withTimezone:!0}),confidence:Cw("confidence").notNull(),sourceObservationIds:VR("source_observation_ids").array().notNull()},e=>[JR({columns:[e.provider,e.plan,e.limitType,e.effectiveFrom]}),KR("idx_plan_limits_lookup").on(e.provider,e.plan,e.limitType,e.effectiveFrom.desc())])});import{pgTable as GR,text as pf,timestamp as YR,uuid as $w,jsonb as XR,index as QR}from"drizzle-orm/pg-core";var kn,qw=Y(()=>{"use strict";kn=GR("alert_dispatches",{id:$w("id").primaryKey().defaultRandom(),userId:$w("user_id").notNull(),alertKey:pf("alert_key").notNull(),severity:pf("severity").notNull(),lastDispatchedAt:YR("last_dispatched_at",{withTimezone:!0}).notNull().defaultNow(),lastState:XR("last_state").notNull(),channel:pf("channel").notNull()},e=>[QR("idx_alert_user_key").on(e.userId,e.alertKey,e.lastDispatchedAt.desc())])});import{boolean as ZR,date as eT,index as ff,integer as tT,jsonb as nT,pgTable as gf,text as or,timestamp as wo,uniqueIndex as rT,uuid as li}from"drizzle-orm/pg-core";var $e,Tt,kt,Uw=Y(()=>{"use strict";$e=gf("announcements",{id:li("id").primaryKey().defaultRandom(),version:or("version").notNull().unique(),releaseDate:eT("release_date").notNull(),subject:or("subject").notNull(),htmlBody:or("html_body").notNull(),textBody:or("text_body").notNull(),sections:nT("sections").notNull().default({}),status:or("status").notNull().default("draft"),recipientCount:tT("recipient_count"),sentAt:wo("sent_at",{withTimezone:!0}),sentBy:li("sent_by"),error:or("error"),createdAt:wo("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:wo("updated_at",{withTimezone:!0}).notNull().defaultNow()},e=>[ff("idx_announcements_status").on(e.status),ff("idx_announcements_created").on(e.createdAt)]),Tt=gf("announcement_deliveries",{id:li("id").primaryKey().defaultRandom(),announcementId:li("announcement_id").notNull(),userId:li("user_id").notNull(),email:or("email").notNull(),status:or("status").notNull().default("pending"),providerId:or("provider_id"),error:or("error"),sentAt:wo("sent_at",{withTimezone:!0}),createdAt:wo("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[rT("uniq_announcement_deliveries_announcement_user").on(e.announcementId,e.userId),ff("idx_announcement_deliveries_user").on(e.userId,e.createdAt)]),kt=gf("notification_preferences",{userId:li("user_id").primaryKey(),productAnnouncements:ZR("product_announcements").notNull().default(!0),unsubscribeToken:or("unsubscribe_token").notNull().unique(),unsubscribedAt:wo("unsubscribed_at",{withTimezone:!0}),createdAt:wo("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:wo("updated_at",{withTimezone:!0}).notNull().defaultNow()})});import{pgTable as oT,text as hf,timestamp as Hw,uuid as _f,integer as sT,index as iT,unique as aT}from"drizzle-orm/pg-core";var Bw,Fw=Y(()=>{"use strict";Bw=oT("scaffolding_fingerprints",{id:_f("id").primaryKey().defaultRandom(),userId:_f("user_id").notNull(),harness:hf("harness").notNull(),model:hf("model").notNull(),toolsHash:hf("tools_hash").notNull(),firstSeenAt:Hw("first_seen_at",{withTimezone:!0}).notNull().defaultNow(),lastSeenAt:Hw("last_seen_at",{withTimezone:!0}).notNull().defaultNow(),snapshotCount:sT("snapshot_count").notNull().default(1),firstSessionId:_f("first_session_id")},e=>[aT("scaffolding_fingerprints_user_id_harness_model_tools_hash_key").on(e.userId,e.harness,e.model,e.toolsHash),iT("idx_scaffolding_fp_segment").on(e.userId,e.harness,e.model)])});import{pgTable as cT,text as yf,timestamp as dT,jsonb as uT,uuid as Ww,integer as lT,unique as mT}from"drizzle-orm/pg-core";var zw,Vw=Y(()=>{"use strict";zw=cT("scaffolding_segments",{id:Ww("id").primaryKey().defaultRandom(),userId:Ww("user_id").notNull(),harness:yf("harness").notNull(),model:yf("model").notNull(),coreNames:uT("core_names").notNull(),coreHash:yf("core_hash").notNull(),activeFingerprints:lT("active_fingerprints").notNull(),computedAt:dT("computed_at",{withTimezone:!0}).notNull().defaultNow()},e=>[mT("scaffolding_segments_user_id_harness_model_key").on(e.userId,e.harness,e.model)])});var wf=Y(()=>{"use strict";Xt();ss();cy();Sn();uy();vr();ri();_y();wy();Mp();Ey();Ay();Fp();Ty();fu();Kp();Py();Ly();My();Uy();Fy();zy();ec();Jy();Ky();Yy();Qy();ew();sw();aw();dw();lw();fw();hw();ww();Ew();Sw();Rw();Tw();Dw();Ow();Mw();qw();Uw();Fw();Vw()});import{relations as Ye}from"drizzle-orm";var pT,fT,gT,hT,_T,yT,wT,vT,IT,bT,ET,AT,ST,xT,RT,TT,kT,NT,jT,PT,DT,OT,CT,LT,MT,$T,qT,UT,HT,BT,Jw=Y(()=>{"use strict";wf();pT=Ye(R,({many:e})=>({sessions:e(y),contextSnapshots:e(M),apiKeys:e(Ae)})),fT=Ye(Ae,({one:e})=>({profile:e(R,{fields:[Ae.userId],references:[R.id]})})),gT=Ye(X,({many:e})=>({teams:e(Q),userOrganizations:e(ee),projects:e(C),invitations:e(se)})),hT=Ye(Q,({one:e,many:t})=>({organization:e(X,{fields:[Q.orgId],references:[X.id]}),userTeams:t(we),invitations:t(se)})),_T=Ye(se,({one:e})=>({organization:e(X,{fields:[se.orgId],references:[X.id]}),team:e(Q,{fields:[se.teamId],references:[Q.id]}),inviter:e(R,{fields:[se.invitedBy],references:[R.id]})})),yT=Ye(ee,({one:e})=>({organization:e(X,{fields:[ee.orgId],references:[X.id]})})),wT=Ye(we,({one:e})=>({team:e(Q,{fields:[we.teamId],references:[Q.id]})})),vT=Ye(g,({one:e,many:t})=>({versions:t(xe),projectInstructions:t(lt),events:t(Ht),usageEvents:t(go),sessionInstructions:t(ie),packInstructions:t(Me),forkedFrom:e(g,{fields:[g.forkedFromId],references:[g.id]})})),IT=Ye(Ht,({one:e})=>({instruction:e(g,{fields:[Ht.instructionId],references:[g.id]})})),bT=Ye(W,({one:e,many:t})=>({project:e(C,{fields:[W.projectId],references:[C.id]}),parent:e(W,{fields:[W.parentId],references:[W.id]}),versions:t(W)})),ET=Ye(xe,({one:e})=>({instruction:e(g,{fields:[xe.instructionId],references:[g.id]})})),AT=Ye(C,({one:e,many:t})=>({organization:e(X,{fields:[C.orgId],references:[X.id]}),projectInstructions:t(lt),sessions:t(y)})),ST=Ye(lt,({one:e})=>({project:e(C,{fields:[lt.projectId],references:[C.id]}),instruction:e(g,{fields:[lt.instructionId],references:[g.id]})})),xT=Ye(y,({one:e,many:t})=>({profile:e(R,{fields:[y.userId],references:[R.id]}),project:e(C,{fields:[y.projectId],references:[C.id]}),run:e(te,{fields:[y.runId],references:[te.id]}),events:t(Ve),sessionInstructions:t(ie),treatmentExposures:t(ne),contextSnapshots:t(M)})),RT=Ye(te,({one:e,many:t})=>({profile:e(R,{fields:[te.userId],references:[R.id]}),organization:e(X,{fields:[te.orgId],references:[X.id]}),project:e(C,{fields:[te.projectId],references:[C.id]}),sessions:t(y),launchJobs:t(ue)})),TT=Ye(ue,({one:e})=>({run:e(te,{fields:[ue.runId],references:[te.id]})})),kT=Ye(Ve,({one:e})=>({session:e(y,{fields:[Ve.sessionId],references:[y.id]})})),NT=Ye(ie,({one:e})=>({session:e(y,{fields:[ie.sessionId],references:[y.id]}),instruction:e(g,{fields:[ie.instructionId],references:[g.id]})})),jT=Ye(Mt,({one:e,many:t})=>({owner:e(R,{fields:[Mt.userId],references:[R.id]}),project:e(C,{fields:[Mt.projectId],references:[C.id]}),exposures:t(ne)})),PT=Ye(ne,({one:e})=>({session:e(y,{fields:[ne.sessionId],references:[y.id]}),owner:e(R,{fields:[ne.userId],references:[R.id]}),assignment:e(Mt,{fields:[ne.assignmentId],references:[Mt.id]})})),DT=Ye(Ue,({one:e,many:t})=>({packInstructions:t(Me),forkedFrom:e(Ue,{fields:[Ue.forkedFromId],references:[Ue.id]})})),OT=Ye(Me,({one:e})=>({pack:e(Ue,{fields:[Me.packId],references:[Ue.id]}),instruction:e(g,{fields:[Me.instructionId],references:[g.id]})})),CT=Ye(go,({one:e})=>({instruction:e(g,{fields:[go.instructionId],references:[g.id]})})),LT=Ye(k,({one:e,many:t})=>({parent:e(k,{fields:[k.parentId],references:[k.id]}),evals:t(Ee),evalRuns:t(Ie),benchmarks:t(rr),evalJobs:t(je),evalConversations:t(He)})),MT=Ye(Ee,({one:e,many:t})=>({evalTarget:e(k,{fields:[Ee.evalTargetId],references:[k.id]}),runs:t(Ie)})),$T=Ye(Ie,({one:e})=>({eval:e(Ee,{fields:[Ie.evalId],references:[Ee.id]}),evalTarget:e(k,{fields:[Ie.evalTargetId],references:[k.id]})})),qT=Ye(rr,({one:e})=>({evalTarget:e(k,{fields:[rr.evalTargetId],references:[k.id]})})),UT=Ye(je,({one:e})=>({evalTarget:e(k,{fields:[je.evalTargetId],references:[k.id]})})),HT=Ye(He,({one:e})=>({evalTarget:e(k,{fields:[He.evalTargetId],references:[k.id]})})),BT=Ye(M,({one:e})=>({session:e(y,{fields:[M.sessionId],references:[y.id]}),profile:e(R,{fields:[M.userId],references:[R.id]})}))});var Bu={};lo(Bu,{SUGGESTION_KINDS:()=>qu,agentJobs:()=>Pe,agentRuns:()=>te,agentRunsRelations:()=>RT,alertDispatches:()=>kn,announcementDeliveries:()=>Tt,announcements:()=>$e,apiKeys:()=>Ae,apiKeysRelations:()=>fT,benchmarks:()=>rr,benchmarksRelations:()=>qT,cliErrorEvents:()=>ku,cliSetupEvents:()=>Tu,contentBlobs:()=>Tn,contextSnapshots:()=>M,contextSnapshotsRelations:()=>BT,evalComparisons:()=>ot,evalConversations:()=>He,evalConversationsRelations:()=>HT,evalGradeAnnotations:()=>et,evalJobs:()=>je,evalJobsRelations:()=>UT,evalRuns:()=>Ie,evalRunsRelations:()=>$T,evalTargets:()=>k,evalTargetsRelations:()=>LT,evals:()=>Ee,evalsRelations:()=>MT,extensionAuthCodes:()=>Un,harnessReleases:()=>qt,insightRecommendationLog:()=>Re,insightsJobs:()=>z,instructionEvents:()=>Ht,instructionEventsRelations:()=>IT,instructionExperimentArms:()=>zr,instructionExperiments:()=>$,instructionPromotions:()=>ae,instructionSuggestionEvents:()=>Ge,instructionSuggestions:()=>x,instructionUsageEvents:()=>go,instructionUsageEventsRelations:()=>CT,instructionVerdicts:()=>Z,instructionVersionIdentities:()=>wr,instructionVersions:()=>xe,instructionVersionsRelations:()=>ET,instructions:()=>g,instructionsRelations:()=>vT,judgeReviewerVerdicts:()=>me,launchJobs:()=>ue,launchJobsRelations:()=>TT,limitObservations:()=>ve,memories:()=>W,memoriesRelations:()=>bT,memoryExperiments:()=>$t,modelPricing:()=>st,notificationPreferences:()=>kt,notifications:()=>Rt,orgInvitations:()=>se,orgInvitationsRelations:()=>_T,organizations:()=>X,organizationsRelations:()=>gT,packInstructions:()=>Me,packInstructionsRelations:()=>OT,packs:()=>Ue,packsRelations:()=>DT,pendingTreatmentExposures:()=>yu,planLimitsActive:()=>tt,profiles:()=>R,profilesRelations:()=>pT,projectCheckouts:()=>ye,projectInstructions:()=>lt,projectInstructionsRelations:()=>ST,projects:()=>C,projectsRelations:()=>AT,providerDocsSnapshots:()=>Dt,recommendationApplications:()=>Te,scaffoldingFingerprints:()=>Bw,scaffoldingSegments:()=>zw,sessionEvents:()=>Ve,sessionEventsRelations:()=>kT,sessionInstructions:()=>ie,sessionInstructionsRelations:()=>NT,sessionSendJobs:()=>Au,sessionTerminalTargets:()=>Ze,sessions:()=>y,sessionsRelations:()=>xT,skillSubmissions:()=>_o,teams:()=>Q,teamsRelations:()=>hT,treatmentAssignments:()=>Mt,treatmentAssignmentsRelations:()=>jT,treatmentExposures:()=>ne,treatmentExposuresRelations:()=>PT,userOrganizations:()=>ee,userOrganizationsRelations:()=>yT,userTeams:()=>we,userTeamsRelations:()=>wT,workerConnections:()=>fe});var Fu=Y(()=>{"use strict";wf();Jw()});function Ef(){fs++,fs>vf&&(vf=fs)}function Af(){fs>0&&fs--}function Sf(){mi++,mi>If&&(If=mi)}function xf(){mi>0&&mi--}function _c(){return fs}function Rf(){Kw++}function yc(){Gw++}function Yw(){bf++}function Tf(){let e=bf;return bf=0,e}function kf(){return{current:fs,peak:vf,heavyCurrent:mi,heavyPeak:If,shedCount:Kw,ingestShedCount:Gw}}function pi(){let e=Number(process.env.PG_INFLIGHT_MAX);return Number.isFinite(e)&&e>0?e:(Number(process.env.PG_POOL_MAX)||3)*4}function wc(){let e=pi(),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 fs,vf,mi,If,Kw,Gw,bf,Nf=Y(()=>{"use strict";fs=0,vf=0,mi=0,If=0,Kw=0,Gw=0,bf=0;c(Ef,"trackDbOpStart");c(Af,"trackDbOpEnd");c(Sf,"trackHeavyDbOpStart");c(xf,"trackHeavyDbOpEnd");c(_c,"getDbLoad");c(Rf,"recordDbShed");c(yc,"recordIngestShed");c(Yw,"recordQueryDeadline");c(Tf,"consumeDeadlineCount");c(kf,"getDbLoadStats");c(pi,"dbInflightMax");c(wc,"dbIngestInflightMax")});import{drizzle as Xw}from"drizzle-orm/postgres-js";import jf from"postgres";function Pf(e){let t=process.env[e];if(!t)throw new Error(`Missing required env var: ${e}`);return t}function Qw(){if(bc)throw new Error("getDb() called after closeDb(): the connection pool is closed for shutdown. Stop issuing queries (timers/requests) before draining the pool.");if(!Ic){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;gi=jf(Pf("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}:{}}}),Ic=Xw(gi,{schema:Bu})}return Ic}function Zw(){if(bc)throw new Error("getHeavyDb() called after closeDb(): the connection pool is closed for shutdown. Stop issuing queries (timers/requests) before draining the pool.");if(!zu){let e=(process.env.PG_APPLICATION_NAME||"rulemetric")+":heavy",t=Number(process.env.PG_HEAVY_POOL_MAX)||2;Vu=jf(Pf("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}}),zu=Xw(Vu,{schema:Bu})}return zu}async function Ec(){if(Wu)return Wu;bc=!0;let e=gi,t=fi,n=Vu;return gi=void 0,Ic=void 0,fi=void 0,Vu=void 0,zu=void 0,Wu=Promise.allSettled([e?e.end({timeout:5}):Promise.resolve(),t?t.end({timeout:5}):Promise.resolve(),n?n.end({timeout:5}):Promise.resolve()]).then(()=>{}),Wu}function Df(){if(bc)return Promise.resolve();if(vc)return vc;let e=gi;return gi=void 0,Ic=void 0,vc=(async()=>{e&&await e.end({timeout:5}).catch(()=>{})})().finally(()=>{vc=void 0}),vc}async function Of(e){let t=Date.now();if(bc)return{ok:!1,ms:0,err:new Error("pool closed for shutdown")};let n=fi;try{return n||(n=jf(Pf("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)}}),fi=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 fi===n&&(fi=void 0),n?.end({timeout:1}).catch(()=>{}),{ok:!1,ms:Date.now()-t,err:r}}}function Ac(e){let t=e?.message;return typeof t=="string"&&t.includes(FT)}function hi(e){let t=e,n=t?.code??t?.cause?.code??t?.errno;return n!==void 0&&WT.has(n)}function Ku(e){let t=e,n=t?.code??t?.cause?.code??t?.errno;return n!==void 0&&zT.has(n)}async function ev(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=hi(i)||t.retryResets===!0&&Ku(i);if(s===n-1||!a)throw i;await new Promise(d=>setTimeout(d,r*2**s))}throw o}function Sc(e){return e?.code==="QUERY_DEADLINE"}function tv(){let e=Number(process.env.PG_QUERY_DEADLINE_MS);return Number.isFinite(e)&&e>=0?e:2e4}function nv(){let e=Number(process.env.PG_HEAVY_QUERY_DEADLINE_MS);return Number.isFinite(e)&&e>=0?e:6e4}function VT(e,t,n=!0){let r,o=new Promise((s,i)=>{r=setTimeout(()=>{n&&Yw(),i(new Ju(t))},t);let a=r;typeof a.unref=="function"&&a.unref()});return Promise.race([e,o]).finally(()=>clearTimeout(r))}function Cf(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 d=Reflect.get(o,s,i);return typeof d!="function"?d:(l,m)=>{let p=r?Sf:Ef,_=r?xf:Af;p();let w=ev(()=>new Promise((h,v)=>d.call(o,h,v)),{retryResets:t});return(n>0?VT(w,n,!r):w).finally(_).then(l,m)}}let a=Reflect.get(o,s,i);return typeof a=="function"?(...d)=>Cf(a.apply(o,d),t,n,r):a}})}function sv(e,t=!1){let n=t?Sf:Ef,r=t?xf:Af;n();try{return Promise.resolve(e()).finally(r)}catch(o){throw r(),o}}var Ic,gi,bc,Wu,vc,fi,Vu,zu,FT,WT,zT,Ju,rv,ov,u,Fe,Lf=Y(()=>{"use strict";Fu();Nf();bc=!1;c(Pf,"getEnv");c(Qw,"getDb");c(Zw,"getHeavyDb");c(Ec,"closeDb");c(Df,"recyclePool");c(Of,"probeDbReachable");FT="called after closeDb()";c(Ac,"isPoolClosedError");WT=new Set(["CONNECT_TIMEOUT","ETIMEDOUT","ENOTFOUND","ECONNREFUSED","EAI_AGAIN"]);c(hi,"isRetryableConnectError");zT=new Set(["CONNECTION_CLOSED","ECONNRESET","EPIPE"]);c(Ku,"isRetryableResetError");c(ev,"withDbRetry");Ju=class extends Error{static{c(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"}};c(Sc,"isQueryDeadlineError");c(tv,"queryDeadlineMs");c(nv,"heavyQueryDeadlineMs");c(VT,"raceWithDeadline");rv=new Set(["select","selectDistinct","selectDistinctOn","insert","update","delete","execute","with","$count","refreshMaterializedView"]),ov=new Set(["select","selectDistinct","selectDistinctOn","$count"]);c(Cf,"wrapBuilder");c(sv,"gaugeTransaction");u=new Proxy({},{get(e,t){let n=Qw(),r=n[t];if(typeof t=="string"&&rv.has(t)&&typeof r=="function"){let o=ov.has(t),s=tv();return(...i)=>Cf(r.apply(n,i),o,s)}return t==="transaction"&&typeof r=="function"?(...o)=>sv(()=>r.apply(n,o)):r}}),Fe=new Proxy({},{get(e,t){let n=Zw(),r=n[t];if(typeof t=="string"&&rv.has(t)&&typeof r=="function"){let o=ov.has(t);return(...s)=>Cf(r.apply(n,s),o,nv(),!0)}return t==="transaction"&&typeof r=="function"?(...o)=>sv(()=>r.apply(n,o),!0):r}})});async function un(e){let[t]=await u.insert(Rt).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:[Rt.userId,Rt.sourceTable,Rt.sourceId]}).returning();return t??null}var iv=Y(()=>{"use strict";Lf();Fu();c(un,"notifyUser")});var O=Y(()=>{"use strict";Fu();Lf();Nf();iv()});function eI(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function vl(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]*${eI(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]*${eI(s)}[^\\n]*\\n([\\s\\S]*?)(?=\\nContents of |$)`,"i"))?.[1]?.trim();if(a)return a}}return null}var bg=Y(()=>{"use strict";c(eI,"escapeRegExp");c(vl,"extractInstructionSection")});var oI={};lo(oI,{GRADUATION_MIN_N:()=>Jc,decideGraduation:()=>nI,graduatedRulesForRender:()=>Eg,instructionContentHash:()=>Yr,maybeGraduate:()=>rI,settleExperiment:()=>Ni,verdictRowsForExperiments:()=>bl});import{createHash as HN}from"node:crypto";import{and as Il,eq as ar,inArray as BN,sql as tI}from"drizzle-orm";function nI(e){return e.resolution!=="resolved"||e.randomisationSuspect||e.contentChanged||e.delta===null||e.ci===null||e.measured.treated<Jc||e.measured.control<Jc?null:e.delta>0?"always":"never"}function Yr(e,t){let n=vl(e,t);return n?HN("sha256").update(n).digest("hex"):null}async function rI(e){let{experimentId:t,userId:n,verdict:r}=e,o=nI(r);if(o===null)return null;let[s]=await u.select({id:$.id,instructionId:$.instructionId,projectPath:$.projectPath,status:$.status}).from($).where(Il(ar($.id,t),ar($.userId,n)));if(!s||s.status!=="running")return null;let[i]=await u.select({content:g.content,name:g.name}).from(g).where(ar(g.id,s.instructionId)),a=Yr(i?.content,i?.name);if(!a)return null;let l=(await u.execute(tI`
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 W_=Object.defineProperty;var c=(e,t)=>W_(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 d.insert(Q).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 d.update($).set({status:"stopped",stoppedReason:"graduated"}).where(ar($.id,t)),o}async function ki(e){let{experimentId:t,userId:n,verdict:r,source:o,status:s}=e;return s!=="running"?null:r.contentChanged?(await d.update($).set({status:"stopped",stoppedReason:"content_changed"}).where(hl(ar($.id,t),ar($.userId,n))),"content_changed"):await Kv({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($).set({status:"stopped",stoppedReason:"trial_neutral"}).where(hl(ar($.id,t),ar($.userId,n))),await d.execute(Vv`
12
+ `))[0];return await u.insert(Z).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($).set({status:"stopped",stoppedReason:"graduated"}).where(ar($.id,t)),o}async function Ni(e){let{experimentId:t,userId:n,verdict:r,source:o,status:s}=e;return s!=="running"?null:r.contentChanged?(await u.update($).set({status:"stopped",stoppedReason:"content_changed"}).where(Il(ar($.id,t),ar($.userId,n))),"content_changed"):await rI({experimentId:t,userId:n,verdict:r})?"graduated":o==="trial"&&r.resolution==="inconclusive"&&!r.randomisationSuspect&&r.measured.treated>=Jc&&r.measured.control>=Jc?(await u.update($).set({status:"stopped",stoppedReason:"trial_neutral"}).where(Il(ar($.id,t),ar($.userId,n))),await u.execute(tI`
13
13
  UPDATE instruction_suggestions
14
14
  SET declined_at = now(), declined_reason = 'trial_neutral'
15
15
  WHERE user_id = ${n}
@@ -17,18 +17,18 @@ var W_=Object.defineProperty;var c=(e,t)=>W_(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 _g(e,t){return(await d.select({instructionId:Q.instructionId,contentHash:Q.contentHash,decision:Q.decision,content:g.content,name:g.name}).from(Q).innerJoin(g,ar(Q.instructionId,g.id)).where(hl(ar(Q.userId,e),ar(Q.projectPath,t)))).flatMap(r=>{let o=Kr(r.content,r.name);return o===null||o!==r.contentHash?[]:[{instructionId:r.instructionId,decision:r.decision}]})}async function _l(e){if(e.length===0)return new Map;let t=await d.select({experimentId:Q.experimentId,decision:Q.decision,decidedAt:Q.decidedAt,contentHash:Q.contentHash}).from(Q).where(CN(Q.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,ws=G(()=>{"use strict";D();hg();Vc=25;c(Jv,"decideGraduation");c(Kr,"instructionContentHash");c(Kv,"maybeGraduate");c(ki,"settleExperiment");c(_g,"graduatedRulesForRender");c(_l,"verdictRowsForExperiments")});var Qj,Zj,DI=G(()=>{"use strict";Qj=["claude_code","cursor","vscode_copilot","copilot_agent","rulemetric_mcp","codex","pi","opencode","antigravity"],Zj=["user_message","assistant_message","tool_call","tool_result","thinking","error"]});var Wi,Og=G(()=>{"use strict";Wi=class{static{c(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={},u=r.find(h=>h.type==="user");u&&(s=u.cwd??null,i=u.gitBranch??null,u.version&&(a.claudeCodeVersion=u.version),u.sessionId&&(a.sessionId=u.sessionId));let l=r.find(h=>h.type==="assistant");l?.message?.model&&(a.model=l.message.model);let p=[],f=0;for(let h of o){let m=h.timestamp??new Date().toISOString();if(h.type==="user"){let w=h.message?.content;if(typeof w=="string")p.push({sequence:f++,eventType:"user_message",content:w,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:m,metadata:{}});else if(Array.isArray(w))for(let I of w)I.type==="tool_result"&&p.push({sequence:f++,eventType:"tool_result",content:typeof I.content=="string"?I.content:JSON.stringify(I.content),toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:m,metadata:{toolUseId:I.tool_use_id}})}else if(h.type==="assistant"){let w=Array.isArray(h.message?.content)?h.message.content:[],I=h.message?.usage,b=I?{input:I.input_tokens??0,output:I.output_tokens??0,cacheRead:I.cache_read_input_tokens??0,cacheWrite:I.cache_creation_input_tokens??0}:null,A={};h.message?.model&&(A.model=h.message.model),h.message?.stop_reason&&(A.stopReason=h.message.stop_reason),h.requestId&&(A.requestId=h.requestId),I?.service_tier&&(A.serviceTier=I.service_tier),I?.speed&&(A.speed=I.speed),I?.cache_creation&&(A.cacheCreationDetail=I.cache_creation),I?.server_tool_use&&(A.serverToolUse=I.server_tool_use);for(let E of w)E.type==="text"?p.push({sequence:f++,eventType:"assistant_message",content:E.text??"",toolName:null,toolInput:null,toolOutput:null,tokenUsage:b,timestamp:m,metadata:A}):E.type==="thinking"?p.push({sequence:f++,eventType:"thinking",content:E.thinking??"",toolName:null,toolInput:null,toolOutput:null,tokenUsage:b,timestamp:m,metadata:A}):E.type==="tool_use"&&p.push({sequence:f++,eventType:"tool_call",content:null,toolName:E.name??"unknown",toolInput:E.input??null,toolOutput:null,tokenUsage:b,timestamp:m,metadata:{...A,toolUseId:E.id}})}}let _=p.map(h=>h.timestamp).sort(),v=new Date().toISOString();return{tool:"claude_code",projectPath:s,gitBranch:i,startedAt:_[0]??v,endedAt:_[_.length-1]??null,events:p,metadata:a}}}});var zi,Cg=G(()=>{"use strict";zi=class{static{c(this,"CursorAdapter")}tool="cursor";parse(t){let n=pm("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 f=l.createdAt?new Date(l.createdAt).getTime():0;return(p.createdAt?new Date(p.createdAt).getTime():0)-f})[0],s=o.conversation??[],i=[];for(let l=0;l<s.length;l++){let p=s[l],f=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:f,metadata:{}})}let a=i.map(l=>l.timestamp).sort(),u=new Date().toISOString();return{tool:"cursor",projectPath:null,gitBranch:null,startedAt:a[0]??u,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 Vi,Lg=G(()=>{"use strict";Vi=class{static{c(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 u of r){let l=u.timestamp?new Date(u.timestamp).toISOString():new Date().toISOString();if(o.push({sequence:s++,eventType:"user_message",content:u.message,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:l,metadata:{}}),u.response){let p=u.response.timestamp?new Date(u.response.timestamp).toISOString():l;o.push({sequence:s++,eventType:"assistant_message",content:u.response.message,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:p,metadata:{}})}}let i=o.map(u=>u.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,Mg=G(()=>{"use strict";Ji=class{static{c(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 u of r){let l=u.timestamp?new Date(u.timestamp).toISOString():new Date().toISOString();if(o.push({sequence:s++,eventType:"user_message",content:u.message,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:l,metadata:{}}),u.toolCalls)for(let p of u.toolCalls){let f=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:f,metadata:{}})}if(u.response){let p=u.response.timestamp?new Date(u.response.timestamp).toISOString():l;o.push({sequence:s++,eventType:"assistant_message",content:u.response.message,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:p,metadata:{}})}}let i=o.map(u=>u.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 Ki,$g=G(()=>{"use strict";Ki=class{static{c(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 eP(e){try{return JSON.parse(e)}catch{return e}}function OI(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 Eg(e,t){return(await u.select({instructionId:Z.instructionId,contentHash:Z.contentHash,decision:Z.decision,content:g.content,name:g.name}).from(Z).innerJoin(g,ar(Z.instructionId,g.id)).where(Il(ar(Z.userId,e),ar(Z.projectPath,t)))).flatMap(r=>{let o=Yr(r.content,r.name);return o===null||o!==r.contentHash?[]:[{instructionId:r.instructionId,decision:r.decision}]})}async function bl(e){if(e.length===0)return new Map;let t=await u.select({experimentId:Z.experimentId,decision:Z.decision,decidedAt:Z.decidedAt,contentHash:Z.contentHash}).from(Z).where(BN(Z.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 Jc,vs=Y(()=>{"use strict";O();bg();Jc=25;c(nI,"decideGraduation");c(Yr,"instructionContentHash");c(rI,"maybeGraduate");c(Ni,"settleExperiment");c(Eg,"graduatedRulesForRender");c(bl,"verdictRowsForExperiments")});var iP,aP,BI=Y(()=>{"use strict";iP=["claude_code","cursor","vscode_copilot","copilot_agent","rulemetric_mcp","codex","pi","opencode","antigravity"],aP=["user_message","assistant_message","tool_call","tool_result","thinking","error"]});var zi,Ug=Y(()=>{"use strict";zi=class{static{c(this,"ClaudeCodeAdapter")}tool="claude_code";parse(t){let n=t.split(`
21
+ `).filter(f=>f.trim()),r=[];for(let f of n)try{r.push(JSON.parse(f))}catch{}let o=r.filter(f=>f.type==="user"||f.type==="assistant"),s=null,i=null,a={},d=r.find(f=>f.type==="user");d&&(s=d.cwd??null,i=d.gitBranch??null,d.version&&(a.claudeCodeVersion=d.version),d.sessionId&&(a.sessionId=d.sessionId));let l=r.find(f=>f.type==="assistant");l?.message?.model&&(a.model=l.message.model);let m=[],p=0;for(let f of o){let h=f.timestamp??new Date().toISOString();if(f.type==="user"){let v=f.message?.content;if(typeof v=="string")m.push({sequence:p++,eventType:"user_message",content:v,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:h,metadata:{}});else if(Array.isArray(v))for(let I of v)I.type==="tool_result"&&m.push({sequence:p++,eventType:"tool_result",content:typeof I.content=="string"?I.content:JSON.stringify(I.content),toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:h,metadata:{toolUseId:I.tool_use_id}})}else if(f.type==="assistant"){let v=Array.isArray(f.message?.content)?f.message.content:[],I=f.message?.usage,E=I?{input:I.input_tokens??0,output:I.output_tokens??0,cacheRead:I.cache_read_input_tokens??0,cacheWrite:I.cache_creation_input_tokens??0}:null,A={};f.message?.model&&(A.model=f.message.model),f.message?.stop_reason&&(A.stopReason=f.message.stop_reason),f.requestId&&(A.requestId=f.requestId),I?.service_tier&&(A.serviceTier=I.service_tier),I?.speed&&(A.speed=I.speed),I?.cache_creation&&(A.cacheCreationDetail=I.cache_creation),I?.server_tool_use&&(A.serverToolUse=I.server_tool_use);for(let b of v)b.type==="text"?m.push({sequence:p++,eventType:"assistant_message",content:b.text??"",toolName:null,toolInput:null,toolOutput:null,tokenUsage:E,timestamp:h,metadata:A}):b.type==="thinking"?m.push({sequence:p++,eventType:"thinking",content:b.thinking??"",toolName:null,toolInput:null,toolOutput:null,tokenUsage:E,timestamp:h,metadata:A}):b.type==="tool_use"&&m.push({sequence:p++,eventType:"tool_call",content:null,toolName:b.name??"unknown",toolInput:b.input??null,toolOutput:null,tokenUsage:E,timestamp:h,metadata:{...A,toolUseId:b.id}})}}let _=m.map(f=>f.timestamp).sort(),w=new Date().toISOString();return{tool:"claude_code",projectPath:s,gitBranch:i,startedAt:_[0]??w,endedAt:_[_.length-1]??null,events:m,metadata:a}}}});var Vi,Hg=Y(()=>{"use strict";Vi=class{static{c(this,"CursorAdapter")}tool="cursor";parse(t){let n=yp("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 a=i.map(l=>l.timestamp).sort(),d=new Date().toISOString();return{tool:"cursor",projectPath:null,gitBranch:null,startedAt:a[0]??d,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 Ji,Bg=Y(()=>{"use strict";Ji=class{static{c(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 d of r){let l=d.timestamp?new Date(d.timestamp).toISOString():new Date().toISOString();if(o.push({sequence:s++,eventType:"user_message",content:d.message,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:l,metadata:{}}),d.response){let m=d.response.timestamp?new Date(d.response.timestamp).toISOString():l;o.push({sequence:s++,eventType:"assistant_message",content:d.response.message,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:m,metadata:{}})}}let i=o.map(d=>d.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 Ki,Fg=Y(()=>{"use strict";Ki=class{static{c(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 d of r){let l=d.timestamp?new Date(d.timestamp).toISOString():new Date().toISOString();if(o.push({sequence:s++,eventType:"user_message",content:d.message,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:l,metadata:{}}),d.toolCalls)for(let m of d.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(d.response){let m=d.response.timestamp?new Date(d.response.timestamp).toISOString():l;o.push({sequence:s++,eventType:"assistant_message",content:d.response.message,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:m,metadata:{}})}}let i=o.map(d=>d.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 Gi,Wg=Y(()=>{"use strict";Gi=class{static{c(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 cP(e){try{return JSON.parse(e)}catch{return e}}function FI(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 tP(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 nP(e){if(!e)return new Date().toISOString();let t=new Date(e);return Number.isFinite(t.getTime())?t.toISOString():new Date().toISOString()}function qg(){return{sequence:0,model:null,prevCumulativeTotal:0,callNames:{}}}var Gi,Ug=G(()=>{"use strict";c(eP,"safeJsonParse");c(OI,"textFromBlocks");c(tP,"tokenUsageFromCodex");c(nP,"normalizeTimestamp");c(qg,"freshCodexState");Gi=class{static{c(this,"CodexAdapter")}tool="codex";parse(t){let n=qg(),{events:r,projectPath:o,gitBranch:s,metadata:i}=this.parseLines(t,n),a=r.map(l=>l.timestamp).sort(),u=new Date().toISOString();return{tool:"codex",projectPath:o,gitBranch:s,startedAt:a[0]??u,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,u=null,l=null;for(let p of r){let f;try{f=JSON.parse(p)}catch{continue}let _=f.payload;if(!_)continue;let v=nP(f.timestamp);if(f.type==="session_meta"){l=_.session_id??_.id??l,a=_.cwd??a,_.git_branch&&(u=_.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(f.type==="turn_context"){a=_.cwd??a,_.model&&(n.model=_.model,s.model=_.model);continue}if(f.type==="response_item"&&_.type==="message"){if(_.role==="user"){let h=OI(_.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(_.role==="assistant"){let h=OI(_.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(f.type==="response_item"&&_.type==="function_call"){let h=_.name??"unknown";_.call_id&&(i[_.call_id]=h);let m=typeof _.arguments=="string"?eP(_.arguments):{};o.push({sequence:n.sequence++,eventType:"tool_call",content:null,toolName:h,toolInput:m&&typeof m=="object"&&!Array.isArray(m)?m:{arguments:m},toolOutput:null,tokenUsage:null,model:n.model,timestamp:v,metadata:{callId:_.call_id}});continue}if(f.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:v,metadata:{callId:_.call_id}});continue}if(f.type==="event_msg"&&_.type==="token_count"){let h=_.info,m=h?.total_token_usage?.total_tokens??0;if(m>0&&m===n.prevCumulativeTotal)continue;m>0&&(n.prevCumulativeTotal=m);let w=tP(h?.last_token_usage??h?.total_token_usage);if(!w)continue;let I=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:I??null,timestamp:v,metadata:{codexEventType:"token_count",...I?{model:I}:{},reasoningOutputTokens:h?.last_token_usage?.reasoning_output_tokens??0}})}}return{events:o,projectPath:a,gitBranch:u,sessionId:l,metadata:s}}}});function eu(e){let t=rP[e];if(!t)throw new Error(`Unknown session tool: ${e}`);return t()}function tu(e){let t=e.trim();if(t.startsWith("{")){let n=t.split(`
23
+ `):""}function dP(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 uP(e){if(!e)return new Date().toISOString();let t=new Date(e);return Number.isFinite(t.getTime())?t.toISOString():new Date().toISOString()}function zg(){return{sequence:0,model:null,prevCumulativeTotal:0,callNames:{}}}var Yi,Vg=Y(()=>{"use strict";c(cP,"safeJsonParse");c(FI,"textFromBlocks");c(dP,"tokenUsageFromCodex");c(uP,"normalizeTimestamp");c(zg,"freshCodexState");Yi=class{static{c(this,"CodexAdapter")}tool="codex";parse(t){let n=zg(),{events:r,projectPath:o,gitBranch:s,metadata:i}=this.parseLines(t,n),a=r.map(l=>l.timestamp).sort(),d=new Date().toISOString();return{tool:"codex",projectPath:o,gitBranch:s,startedAt:a[0]??d,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(m=>m.trim()),o=[],s={},i=n.callNames,a=null,d=null,l=null;for(let m of r){let p;try{p=JSON.parse(m)}catch{continue}let _=p.payload;if(!_)continue;let w=uP(p.timestamp);if(p.type==="session_meta"){l=_.session_id??_.id??l,a=_.cwd??a,_.git_branch&&(d=_.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"){a=_.cwd??a,_.model&&(n.model=_.model,s.model=_.model);continue}if(p.type==="response_item"&&_.type==="message"){if(_.role==="user"){let f=FI(_.content,["input_text"]);if(!f)continue;o.push({sequence:n.sequence++,eventType:"user_message",content:f,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:w,metadata:{}})}else if(_.role==="assistant"){let f=FI(_.content,["output_text"]);if(!f)continue;o.push({sequence:n.sequence++,eventType:"assistant_message",content:f,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,model:n.model,timestamp:w,metadata:n.model?{model:n.model}:{}})}continue}if(p.type==="response_item"&&_.type==="function_call"){let f=_.name??"unknown";_.call_id&&(i[_.call_id]=f);let h=typeof _.arguments=="string"?cP(_.arguments):{};o.push({sequence:n.sequence++,eventType:"tool_call",content:null,toolName:f,toolInput:h&&typeof h=="object"&&!Array.isArray(h)?h:{arguments:h},toolOutput:null,tokenUsage:null,model:n.model,timestamp:w,metadata:{callId:_.call_id}});continue}if(p.type==="response_item"&&_.type==="function_call_output"){let f=_.call_id?i[_.call_id]??null:null;o.push({sequence:n.sequence++,eventType:"tool_result",content:_.output??null,toolName:f,toolInput:null,toolOutput:_.output==null?null:{output:_.output},tokenUsage:null,model:n.model,timestamp:w,metadata:{callId:_.call_id}});continue}if(p.type==="event_msg"&&_.type==="token_count"){let f=_.info,h=f?.total_token_usage?.total_tokens??0;if(h>0&&h===n.prevCumulativeTotal)continue;h>0&&(n.prevCumulativeTotal=h);let v=dP(f?.last_token_usage??f?.total_token_usage);if(!v)continue;let I=f?.model??f?.model_name??n.model;o.push({sequence:n.sequence++,eventType:"assistant_message",content:null,toolName:null,toolInput:null,toolOutput:null,tokenUsage:v,model:I??null,timestamp:w,metadata:{codexEventType:"token_count",...I?{model:I}:{},reasoningOutputTokens:f?.last_token_usage?.reasoning_output_tokens??0}})}}return{events:o,projectPath:a,gitBranch:d,sessionId:l,metadata:s}}}});function nd(e){let t=lP[e];if(!t)throw new Error(`Unknown session tool: ${e}`);return t()}function rd(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 rP,CI=G(()=>{"use strict";Og();Cg();Lg();Mg();$g();Ug();rP={claude_code:c(()=>new Wi,"claude_code"),cursor:c(()=>new zi,"cursor"),vscode_copilot:c(()=>new Vi,"vscode_copilot"),copilot_agent:c(()=>new Ji,"copilot_agent"),rulemetric_mcp:c(()=>new Ki,"rulemetric_mcp"),codex:c(()=>new Gi,"codex")};c(eu,"getAdapter");c(tu,"detectTool")});import{readdir as Hg,stat as Bg}from"fs/promises";import{basename as oP,join as ko}from"path";import{homedir as Ll}from"os";function iP(){return process.env.CLAUDE_CONFIG_DIR||ko(Ll(),".claude")}function aP(){return ko(iP(),"projects")}function cP(){return process.platform==="darwin"?ko(Ll(),"Library","Application Support","Claude","local-agent-mode-sessions"):process.platform==="win32"?ko(Ll(),"AppData","Roaming","Claude","local-agent-mode-sessions"):ko(Ll(),".config","Claude","local-agent-mode-sessions")}async function uP(e){let t=[];async function n(r,o){if(o>8)return;let s=await Hg(r).catch(()=>[]);for(let i of s){if(i==="node_modules"||i===".git")continue;let a=ko(r,i);if((await Bg(a).catch(()=>null))?.isDirectory())if(i==="projects"){let l=await Hg(a).catch(()=>[]);for(let p of l){let f=ko(a,p);(await Bg(f).catch(()=>null))?.isDirectory()&&t.push(f)}}else await n(a,o+1)}}return c(n,"walk"),await n(e,0),t}var sP,LI,MI=G(()=>{"use strict";sP={"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"};c(iP,"getClaudeDir");c(aP,"getProjectsDir");c(cP,"getDesktopSessionsDir");c(uP,"findDesktopProjectDirs");LI={name:"claude",displayName:"Claude Code",modelDisplayName(e){let t=e.replace(/@.*$/,"").replace(/-\d{8}$/,"");for(let[n,r]of Object.entries(sP))if(t.startsWith(n))return r;return t},toolDisplayName(e){return e},async discoverSessions(){let e=[],t=aP();try{let r=await Hg(t);for(let o of r){let s=ko(t,o);(await Bg(s).catch(()=>null))?.isDirectory()&&e.push({path:s,project:o,provider:"claude"})}}catch{}let n=await uP(cP());for(let r of n)e.push({path:r,project:oP(r),provider:"claude"});return e},createSessionParser(){return{async*parse(){}}}}});import{readdir as Ml,readFile as $I,stat as dP}from"fs/promises";import{basename as lP,join as Yi}from"path";import{homedir as pP}from"os";function fP(){return process.env.CODEX_HOME??Yi(pP(),".codex")}function gP(e){return e.replace(/^\//,"").replace(/\//g,"-")}async function hP(e){try{let n=(await $I(e,"utf-8")).split(`
27
- `)[0];return n?.trim()?JSON.parse(n):null}catch{return null}}async function _P(e){let t=await hP(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 yP(e){let t=Yi(e,"sessions"),n=[],r;try{r=await Ml(t)}catch{return n}for(let o of r){if(!/^\d{4}$/.test(o))continue;let s=Yi(t,o),i=await Ml(s).catch(()=>[]);for(let a of i){if(!/^\d{2}$/.test(a))continue;let u=Yi(s,a),l=await Ml(u).catch(()=>[]);for(let p of l){if(!/^\d{2}$/.test(p))continue;let f=Yi(u,p),_=await Ml(f).catch(()=>[]);for(let v of _){if(!v.startsWith("rollout-")||!v.endsWith(".jsonl"))continue;let h=Yi(f,v);if(!(await dP(h).catch(()=>null))?.isFile())continue;let{valid:w,meta:I}=await _P(h);if(!w||!I)continue;let b=I.payload?.cwd??"unknown";n.push({path:h,project:gP(b),provider:"codex"})}}}}return n}function wP(e,t){return e?.info?.model??e?.info?.model_name??t??"gpt-5"}function vP(e,t){return{async*parse(){let n;try{n=await $I(e.path,"utf-8")}catch{return}let r=n.split(`
28
- `).filter(v=>v.trim()),o,s="",i=0,a=0,u=0,l=0,p=0,f=[],_="";for(let v of r){let h;try{h=JSON.parse(v)}catch{continue}if(h.type==="session_meta"){s=h.payload?.session_id??lP(e.path,".jsonl"),o=h.payload?.model;continue}if(h.type==="response_item"&&h.payload?.type==="function_call"){let m=h.payload.name??"";f.push(qI[m]??m);continue}if(h.type==="response_item"&&h.payload?.type==="message"&&h.payload?.role==="user"){let m=(h.payload.content??[]).filter(w=>w.type==="input_text").map(w=>w.text??"").filter(Boolean);m.length>0&&(_=m.join(" "));continue}if(h.type==="event_msg"&&h.payload?.type==="token_count"){let m=h.payload.info;if(!m)continue;let w=m.total_token_usage?.total_tokens??0;if(w>0&&w===i)continue;i=w;let I=m.last_token_usage,b=0,A=0,E=0,S=0;if(I)b=I.input_tokens??0,A=I.cached_input_tokens??0,E=I.output_tokens??0,S=I.reasoning_output_tokens??0;else if(w>0){let U=m.total_token_usage;if(!U)continue;b=(U.input_tokens??0)-a,A=(U.cached_input_tokens??0)-u,E=(U.output_tokens??0)-l,S=(U.reasoning_output_tokens??0)-p}if(!I){let U=m.total_token_usage;U&&(a=U.input_tokens??0,u=U.cached_input_tokens??0,l=U.output_tokens??0,p=U.reasoning_output_tokens??0)}if(b+A+E+S===0)continue;let O=Math.max(0,b-A),W=wP(h.payload,o),N=h.timestamp??"",q=`codex:${e.path}:${N}:${w}`;if(t.has(q))continue;t.add(q),yield{provider:"codex",model:W,inputTokens:O,outputTokens:E,cacheCreationInputTokens:0,cacheReadInputTokens:A,cachedInputTokens:A,reasoningTokens:S,costUSD:0,tools:f,bashCommands:[],timestamp:N,speed:"standard",deduplicationKey:q,userMessage:_,sessionId:s},f=[],_=""}}}}}var mP,qI,UI,HI=G(()=>{"use strict";mP={"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"},qI={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"};c(fP,"getCodexDir");c(gP,"sanitizeProject");c(hP,"readFirstLine");c(_P,"isValidCodexSession");c(yP,"discoverSessionsInDir");c(wP,"resolveModel");c(vP,"createParser");UI={name:"codex",displayName:"Codex",modelDisplayName(e){for(let[t,n]of Object.entries(mP))if(e.startsWith(t))return n;return e},toolDisplayName(e){return qI[e]??e},async discoverSessions(){return yP(fP())},createSessionParser(e,t){return vP(e,t)}}});import{readdir as IP,readFile as BI,stat as bP}from"fs/promises";import{basename as FI,dirname as EP,join as Fg}from"path";import{homedir as AP}from"os";function TP(){return Fg(AP(),".copilot","session-state")}function RP(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 BI(e.path,"utf-8")}catch{return}let r=FI(EP(e.path)),o=n.split(`
29
- `).filter(a=>a.trim()),s="",i="";for(let a of o){let u;try{u=JSON.parse(a)}catch{continue}if(u.type==="session.model_change"){s=u.data.newModel??s;continue}if(u.type==="user.message"){i=u.data.content??"";continue}if(u.type==="assistant.message"){let{messageId:l,outputTokens:p,toolRequests:f=[]}=u.data;if(p===0||!s)continue;let _=`copilot:${r}:${l}`;if(t.has(_))continue;t.add(_);let v=f.map(h=>h.name??"").filter(Boolean).map(h=>WI[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:u.timestamp??"",speed:"standard",deduplicationKey:_,userMessage:i,sessionId:r},i=""}}}}}async function NP(e){let t=[],n;try{n=await IP(e)}catch{return t}for(let r of n){let o=Fg(e,r,"events.jsonl");if(!(await bP(o).catch(()=>null))?.isFile())continue;let i=r;try{let a=await BI(Fg(e,r,"workspace.yaml"),"utf-8"),u=RP(a);u&&(i=FI(u))}catch{}t.push({path:o,project:i,provider:"copilot"})}return t}var SP,WI,xP,zI,VI=G(()=>{"use strict";SP={"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"},WI={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"},xP=Object.entries(SP).sort((e,t)=>t[0].length-e[0].length);c(TP,"getCopilotSessionStateDir");c(RP,"parseCwd");c(kP,"createParser");c(NP,"discoverSessionsInDir");zI={name:"copilot",displayName:"GitHub Copilot",modelDisplayName(e){for(let[t,n]of xP)if(e===t||e.startsWith(t+"-"))return n;return e},toolDisplayName(e){return WI[e]??e},async discoverSessions(){return NP(TP())},createSessionParser(e,t){return kP(e,t)}}});import{readdir as JI,readFile as GI,stat as KI}from"fs/promises";import{basename as YI,join as Wg}from"path";import{homedir as jP}from"os";function OP(){return Wg(jP(),".pi","agent","sessions")}async function CP(e){try{let n=(await GI(e,"utf-8")).split(`
30
- `)[0];return n?.trim()?JSON.parse(n):null}catch{return null}}function LP(e){return e.split(/[;&|]+/).map(t=>t.trim().split(/\s+/)[0]).filter(Boolean)}async function MP(e){let t=[],n;try{n=await JI(e)}catch{return t}for(let r of n){let o=Wg(e,r);if(!(await KI(o).catch(()=>null))?.isDirectory())continue;let i;try{i=await JI(o)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let u=Wg(o,a);if(!(await KI(u).catch(()=>null))?.isFile())continue;let p=await CP(u);if(!p||p.type!=="session")continue;let f=p.cwd??r;t.push({path:u,project:YI(f),provider:"pi"})}}return t}function $P(e,t){return{async*parse(){let n;try{n=await GI(e.path,"utf-8")}catch{return}let r=n.split(`
31
- `).filter(i=>i.trim()),o=YI(e.path,".jsonl"),s="";for(let[i,a]of r.entries()){let u;try{u=JSON.parse(a)}catch{continue}if(u.type==="session"){o=u.id??o;continue}if(u.type!=="message")continue;let l=u.message;if(!l)continue;if(l.role==="user"){let S=(l.content??[]).filter(R=>R.type==="text").map(R=>R.text??"").filter(Boolean);S.length>0&&(s=S.join(" "));continue}if(l.role!=="assistant"||!l.usage)continue;let{input:p,output:f,cacheRead:_,cacheWrite:v}=l.usage;if(p===0&&f===0)continue;let h=l.model??"gpt-5",m=l.responseId??"",w=`pi:${e.path}:${m||u.id||u.timestamp||String(i)}`;if(t.has(w))continue;t.add(w);let I=(l.content??[]).filter(S=>S.type==="toolCall"&&S.name),b=I.map(S=>XI[S.name]??S.name),A=I.filter(S=>S.name==="bash").flatMap(S=>{let R=S.arguments?.command;return typeof R=="string"?LP(R):[]}),E=u.timestamp??"";yield{provider:"pi",model:h,inputTokens:p,outputTokens:f,cacheCreationInputTokens:v,cacheReadInputTokens:_,cachedInputTokens:_,reasoningTokens:0,costUSD:0,tools:b,bashCommands:A,timestamp:E,speed:"standard",deduplicationKey:w,userMessage:s,sessionId:o},s=""}}}}var PP,XI,DP,QI,ZI=G(()=>{"use strict";PP={"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"},XI={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"},DP=Object.entries(PP).sort((e,t)=>t[0].length-e[0].length);c(OP,"getPiSessionsDir");c(CP,"readFirstEntry");c(LP,"extractBashCommands");c(MP,"discoverSessionsInDir");c($P,"createParser");QI={name:"pi",displayName:"Pi",modelDisplayName(e){for(let[t,n]of DP)if(e.startsWith(t))return n;return e},toolDisplayName(e){return XI[e]??e},async discoverSessions(){return MP(OP())},createSessionParser(e,t){return $P(e,t)}}});var tb={};co(tb,{cursor:()=>VP});import{existsSync as qP}from"fs";import{join as zg}from"path";import{homedir as Vg}from"os";function eb(){if($l)return!0;try{return $l=pm("better-sqlite3"),!0}catch{return!1}}function BP(){return process.platform==="darwin"?zg(Vg(),"Library","Application Support","Cursor","User","globalStorage","state.vscdb"):process.platform==="win32"?zg(Vg(),"AppData","Roaming","Cursor","User","globalStorage","state.vscdb"):zg(Vg(),".config","Cursor","User","globalStorage","state.vscdb")}function FP(e){return!e||e==="default"?UP:e}function zP(e,t){return{async*parse(){if(!eb()||!$l)return;let n;try{n=new $l(e.path,{readonly:!0})}catch{return}try{let o=n.prepare(WP).all();for(let s of o){let i=s.input_tokens??0,a=s.output_tokens??0;if(i===0&&a===0)continue;let u=s.created_at??"",l=s.conversation_id??"unknown",p=`cursor:${l}:${u}:${i}:${a}`;if(t.has(p))continue;t.add(p);let f=FP(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:u,speed:"standard",deduplicationKey:p,userMessage:s.user_text??"",sessionId:l}}}finally{n.close()}}}}var $l,UP,HP,WP,VP,nb=G(()=>{"use strict";$l=null;c(eb,"loadSqlite");UP="claude-sonnet-4-5",HP={"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.)"};c(BP,"getCursorDbPath");c(FP,"resolveModel");WP=`
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 lP,WI=Y(()=>{"use strict";Ug();Hg();Bg();Fg();Wg();Vg();lP={claude_code:c(()=>new zi,"claude_code"),cursor:c(()=>new Vi,"cursor"),vscode_copilot:c(()=>new Ji,"vscode_copilot"),copilot_agent:c(()=>new Ki,"copilot_agent"),rulemetric_mcp:c(()=>new Gi,"rulemetric_mcp"),codex:c(()=>new Yi,"codex")};c(nd,"getAdapter");c(rd,"detectTool")});import{readdir as Jg,stat as Kg}from"fs/promises";import{basename as mP,join as Po}from"path";import{homedir as Bl}from"os";function fP(){return process.env.CLAUDE_CONFIG_DIR||Po(Bl(),".claude")}function gP(){return Po(fP(),"projects")}function hP(){return process.platform==="darwin"?Po(Bl(),"Library","Application Support","Claude","local-agent-mode-sessions"):process.platform==="win32"?Po(Bl(),"AppData","Roaming","Claude","local-agent-mode-sessions"):Po(Bl(),".config","Claude","local-agent-mode-sessions")}async function _P(e){let t=[];async function n(r,o){if(o>8)return;let s=await Jg(r).catch(()=>[]);for(let i of s){if(i==="node_modules"||i===".git")continue;let a=Po(r,i);if((await Kg(a).catch(()=>null))?.isDirectory())if(i==="projects"){let l=await Jg(a).catch(()=>[]);for(let m of l){let p=Po(a,m);(await Kg(p).catch(()=>null))?.isDirectory()&&t.push(p)}}else await n(a,o+1)}}return c(n,"walk"),await n(e,0),t}var pP,zI,VI=Y(()=>{"use strict";pP={"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"};c(fP,"getClaudeDir");c(gP,"getProjectsDir");c(hP,"getDesktopSessionsDir");c(_P,"findDesktopProjectDirs");zI={name:"claude",displayName:"Claude Code",modelDisplayName(e){let t=e.replace(/@.*$/,"").replace(/-\d{8}$/,"");for(let[n,r]of Object.entries(pP))if(t.startsWith(n))return r;return t},toolDisplayName(e){return e},async discoverSessions(){let e=[],t=gP();try{let r=await Jg(t);for(let o of r){let s=Po(t,o);(await Kg(s).catch(()=>null))?.isDirectory()&&e.push({path:s,project:o,provider:"claude"})}}catch{}let n=await _P(hP());for(let r of n)e.push({path:r,project:mP(r),provider:"claude"});return e},createSessionParser(){return{async*parse(){}}}}});import{readdir as Fl,readFile as JI,stat as yP}from"fs/promises";import{basename as wP,join as Xi}from"path";import{homedir as vP}from"os";function bP(){return process.env.CODEX_HOME??Xi(vP(),".codex")}function EP(e){return e.replace(/^\//,"").replace(/\//g,"-")}async function AP(e){try{let n=(await JI(e,"utf-8")).split(`
27
+ `)[0];return n?.trim()?JSON.parse(n):null}catch{return null}}async function SP(e){let t=await AP(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 xP(e){let t=Xi(e,"sessions"),n=[],r;try{r=await Fl(t)}catch{return n}for(let o of r){if(!/^\d{4}$/.test(o))continue;let s=Xi(t,o),i=await Fl(s).catch(()=>[]);for(let a of i){if(!/^\d{2}$/.test(a))continue;let d=Xi(s,a),l=await Fl(d).catch(()=>[]);for(let m of l){if(!/^\d{2}$/.test(m))continue;let p=Xi(d,m),_=await Fl(p).catch(()=>[]);for(let w of _){if(!w.startsWith("rollout-")||!w.endsWith(".jsonl"))continue;let f=Xi(p,w);if(!(await yP(f).catch(()=>null))?.isFile())continue;let{valid:v,meta:I}=await SP(f);if(!v||!I)continue;let E=I.payload?.cwd??"unknown";n.push({path:f,project:EP(E),provider:"codex"})}}}}return n}function RP(e,t){return e?.info?.model??e?.info?.model_name??t??"gpt-5"}function TP(e,t){return{async*parse(){let n;try{n=await JI(e.path,"utf-8")}catch{return}let r=n.split(`
28
+ `).filter(w=>w.trim()),o,s="",i=0,a=0,d=0,l=0,m=0,p=[],_="";for(let w of r){let f;try{f=JSON.parse(w)}catch{continue}if(f.type==="session_meta"){s=f.payload?.session_id??wP(e.path,".jsonl"),o=f.payload?.model;continue}if(f.type==="response_item"&&f.payload?.type==="function_call"){let h=f.payload.name??"";p.push(KI[h]??h);continue}if(f.type==="response_item"&&f.payload?.type==="message"&&f.payload?.role==="user"){let h=(f.payload.content??[]).filter(v=>v.type==="input_text").map(v=>v.text??"").filter(Boolean);h.length>0&&(_=h.join(" "));continue}if(f.type==="event_msg"&&f.payload?.type==="token_count"){let h=f.payload.info;if(!h)continue;let v=h.total_token_usage?.total_tokens??0;if(v>0&&v===i)continue;i=v;let I=h.last_token_usage,E=0,A=0,b=0,S=0;if(I)E=I.input_tokens??0,A=I.cached_input_tokens??0,b=I.output_tokens??0,S=I.reasoning_output_tokens??0;else if(v>0){let q=h.total_token_usage;if(!q)continue;E=(q.input_tokens??0)-a,A=(q.cached_input_tokens??0)-d,b=(q.output_tokens??0)-l,S=(q.reasoning_output_tokens??0)-m}if(!I){let q=h.total_token_usage;q&&(a=q.input_tokens??0,d=q.cached_input_tokens??0,l=q.output_tokens??0,m=q.reasoning_output_tokens??0)}if(E+A+b+S===0)continue;let P=Math.max(0,E-A),H=RP(f.payload,o),N=f.timestamp??"",U=`codex:${e.path}:${N}:${v}`;if(t.has(U))continue;t.add(U),yield{provider:"codex",model:H,inputTokens:P,outputTokens:b,cacheCreationInputTokens:0,cacheReadInputTokens:A,cachedInputTokens:A,reasoningTokens:S,costUSD:0,tools:p,bashCommands:[],timestamp:N,speed:"standard",deduplicationKey:U,userMessage:_,sessionId:s},p=[],_=""}}}}}var IP,KI,GI,YI=Y(()=>{"use strict";IP={"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"},KI={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"};c(bP,"getCodexDir");c(EP,"sanitizeProject");c(AP,"readFirstLine");c(SP,"isValidCodexSession");c(xP,"discoverSessionsInDir");c(RP,"resolveModel");c(TP,"createParser");GI={name:"codex",displayName:"Codex",modelDisplayName(e){for(let[t,n]of Object.entries(IP))if(e.startsWith(t))return n;return e},toolDisplayName(e){return KI[e]??e},async discoverSessions(){return xP(bP())},createSessionParser(e,t){return TP(e,t)}}});import{readdir as kP,readFile as XI,stat as NP}from"fs/promises";import{basename as QI,dirname as jP,join as Gg}from"path";import{homedir as PP}from"os";function CP(){return Gg(PP(),".copilot","session-state")}function LP(e){let t=e.match(/^cwd:\s*(.+)$/m);return t?.[1]&&t[1].replace(/\s*#.*$/,"").replace(/^['"]|['"]$/g,"").trim()||null}function MP(e,t){return{async*parse(){let n;try{n=await XI(e.path,"utf-8")}catch{return}let r=QI(jP(e.path)),o=n.split(`
29
+ `).filter(a=>a.trim()),s="",i="";for(let a of o){let d;try{d=JSON.parse(a)}catch{continue}if(d.type==="session.model_change"){s=d.data.newModel??s;continue}if(d.type==="user.message"){i=d.data.content??"";continue}if(d.type==="assistant.message"){let{messageId:l,outputTokens:m,toolRequests:p=[]}=d.data;if(m===0||!s)continue;let _=`copilot:${r}:${l}`;if(t.has(_))continue;t.add(_);let w=p.map(f=>f.name??"").filter(Boolean).map(f=>ZI[f]??f);yield{provider:"copilot",model:s,inputTokens:0,outputTokens:m,cacheCreationInputTokens:0,cacheReadInputTokens:0,cachedInputTokens:0,reasoningTokens:0,costUSD:0,tools:w,bashCommands:[],timestamp:d.timestamp??"",speed:"standard",deduplicationKey:_,userMessage:i,sessionId:r},i=""}}}}}async function $P(e){let t=[],n;try{n=await kP(e)}catch{return t}for(let r of n){let o=Gg(e,r,"events.jsonl");if(!(await NP(o).catch(()=>null))?.isFile())continue;let i=r;try{let a=await XI(Gg(e,r,"workspace.yaml"),"utf-8"),d=LP(a);d&&(i=QI(d))}catch{}t.push({path:o,project:i,provider:"copilot"})}return t}var DP,ZI,OP,eb,tb=Y(()=>{"use strict";DP={"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"},ZI={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"},OP=Object.entries(DP).sort((e,t)=>t[0].length-e[0].length);c(CP,"getCopilotSessionStateDir");c(LP,"parseCwd");c(MP,"createParser");c($P,"discoverSessionsInDir");eb={name:"copilot",displayName:"GitHub Copilot",modelDisplayName(e){for(let[t,n]of OP)if(e===t||e.startsWith(t+"-"))return n;return e},toolDisplayName(e){return ZI[e]??e},async discoverSessions(){return $P(CP())},createSessionParser(e,t){return MP(e,t)}}});import{readdir as nb,readFile as ob,stat as rb}from"fs/promises";import{basename as sb,join as Yg}from"path";import{homedir as qP}from"os";function BP(){return Yg(qP(),".pi","agent","sessions")}async function FP(e){try{let n=(await ob(e,"utf-8")).split(`
30
+ `)[0];return n?.trim()?JSON.parse(n):null}catch{return null}}function WP(e){return e.split(/[;&|]+/).map(t=>t.trim().split(/\s+/)[0]).filter(Boolean)}async function zP(e){let t=[],n;try{n=await nb(e)}catch{return t}for(let r of n){let o=Yg(e,r);if(!(await rb(o).catch(()=>null))?.isDirectory())continue;let i;try{i=await nb(o)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let d=Yg(o,a);if(!(await rb(d).catch(()=>null))?.isFile())continue;let m=await FP(d);if(!m||m.type!=="session")continue;let p=m.cwd??r;t.push({path:d,project:sb(p),provider:"pi"})}}return t}function VP(e,t){return{async*parse(){let n;try{n=await ob(e.path,"utf-8")}catch{return}let r=n.split(`
31
+ `).filter(i=>i.trim()),o=sb(e.path,".jsonl"),s="";for(let[i,a]of r.entries()){let d;try{d=JSON.parse(a)}catch{continue}if(d.type==="session"){o=d.id??o;continue}if(d.type!=="message")continue;let l=d.message;if(!l)continue;if(l.role==="user"){let S=(l.content??[]).filter(T=>T.type==="text").map(T=>T.text??"").filter(Boolean);S.length>0&&(s=S.join(" "));continue}if(l.role!=="assistant"||!l.usage)continue;let{input:m,output:p,cacheRead:_,cacheWrite:w}=l.usage;if(m===0&&p===0)continue;let f=l.model??"gpt-5",h=l.responseId??"",v=`pi:${e.path}:${h||d.id||d.timestamp||String(i)}`;if(t.has(v))continue;t.add(v);let I=(l.content??[]).filter(S=>S.type==="toolCall"&&S.name),E=I.map(S=>ib[S.name]??S.name),A=I.filter(S=>S.name==="bash").flatMap(S=>{let T=S.arguments?.command;return typeof T=="string"?WP(T):[]}),b=d.timestamp??"";yield{provider:"pi",model:f,inputTokens:m,outputTokens:p,cacheCreationInputTokens:w,cacheReadInputTokens:_,cachedInputTokens:_,reasoningTokens:0,costUSD:0,tools:E,bashCommands:A,timestamp:b,speed:"standard",deduplicationKey:v,userMessage:s,sessionId:o},s=""}}}}var UP,ib,HP,ab,cb=Y(()=>{"use strict";UP={"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"},ib={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"},HP=Object.entries(UP).sort((e,t)=>t[0].length-e[0].length);c(BP,"getPiSessionsDir");c(FP,"readFirstEntry");c(WP,"extractBashCommands");c(zP,"discoverSessionsInDir");c(VP,"createParser");ab={name:"pi",displayName:"Pi",modelDisplayName(e){for(let[t,n]of HP)if(e.startsWith(t))return n;return e},toolDisplayName(e){return ib[e]??e},async discoverSessions(){return zP(BP())},createSessionParser(e,t){return VP(e,t)}}});var ub={};lo(ub,{cursor:()=>eD});import{existsSync as JP}from"fs";import{join as Xg}from"path";import{homedir as Qg}from"os";function db(){if(Wl)return!0;try{return Wl=yp("better-sqlite3"),!0}catch{return!1}}function YP(){return process.platform==="darwin"?Xg(Qg(),"Library","Application Support","Cursor","User","globalStorage","state.vscdb"):process.platform==="win32"?Xg(Qg(),"AppData","Roaming","Cursor","User","globalStorage","state.vscdb"):Xg(Qg(),".config","Cursor","User","globalStorage","state.vscdb")}function XP(e){return!e||e==="default"?KP:e}function ZP(e,t){return{async*parse(){if(!db()||!Wl)return;let n;try{n=new Wl(e.path,{readonly:!0})}catch{return}try{let o=n.prepare(QP).all();for(let s of o){let i=s.input_tokens??0,a=s.output_tokens??0;if(i===0&&a===0)continue;let d=s.created_at??"",l=s.conversation_id??"unknown",m=`cursor:${l}:${d}:${i}:${a}`;if(t.has(m))continue;t.add(m);let p=XP(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:d,speed:"standard",deduplicationKey:m,userMessage:s.user_text??"",sessionId:l}}}finally{n.close()}}}}var Wl,KP,GP,QP,eD,lb=Y(()=>{"use strict";Wl=null;c(db,"loadSqlite");KP="claude-sonnet-4-5",GP={"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.)"};c(YP,"getCursorDbPath");c(XP,"resolveModel");QP=`
32
32
  SELECT
33
33
  json_extract(value, '$.tokenCount.inputTokens') as input_tokens,
34
34
  json_extract(value, '$.tokenCount.outputTokens') as output_tokens,
@@ -40,24 +40,24 @@ var W_=Object.defineProperty;var c=(e,t)=>W_(e,"name",{value:t,configurable:!0})
40
40
  WHERE key LIKE 'bubbleId:%'
41
41
  AND json_extract(value, '$.tokenCount.inputTokens') > 0
42
42
  ORDER BY json_extract(value, '$.createdAt') ASC
43
- `;c(zP,"createParser");VP={name:"cursor",displayName:"Cursor",modelDisplayName(e){return HP[e]??e},toolDisplayName(e){return e},async discoverSessions(){if(!eb())return[];let e=BP();return qP(e)?[{path:e,project:"cursor",provider:"cursor"}]:[]},createSessionParser(e,t){return zP(e,t)}}});var sb={};co(sb,{opencode:()=>tD});import{readdir as JP}from"fs/promises";import{join as Jg}from"path";import{homedir as KP}from"os";function Kg(){if(Xi)return!0;try{return Xi=pm("better-sqlite3"),!0}catch{return!1}}function rb(e){return e.replace(/^\//,"").replace(/\//g,"-")}function GP(){let e=process.env.XDG_DATA_HOME??Jg(KP(),".local","share");return Jg(e,"opencode")}async function YP(e){try{return(await JP(e)).filter(n=>n.startsWith("opencode")&&n.endsWith(".db")).map(n=>Jg(e,n))}catch{return[]}}function XP(e){let t=e<1e12?e*1e3:e;return new Date(t).toISOString()}function QP(e){return e.split(/[;&|]+/).map(t=>t.trim().split(/\s+/)[0]).filter(Boolean)}function ZP(e,t){return{async*parse(){if(!Kg()||!Xi)return;let n=e.path.split(":"),r=n[n.length-1],o=n.slice(0,-1).join(":"),s;try{s=new Xi(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),u=new Map;for(let p of a)try{let f=JSON.parse(p.data),_=u.get(p.message_id)??[];_.push(f),u.set(p.message_id,_)}catch{}let l="";for(let p of i){let f;try{f=JSON.parse(p.data)}catch{continue}if(f.role==="user"){let A=(u.get(p.id)??[]).filter(E=>E.type==="text").map(()=>"").filter(Boolean);A.length>0&&(l=A.join(" "));continue}if(f.role!=="assistant")continue;let _={input:f.tokens?.input??0,output:f.tokens?.output??0,reasoning:f.tokens?.reasoning??0,cacheRead:f.tokens?.cache?.read??0,cacheWrite:f.tokens?.cache?.write??0};if(_.input===0&&_.output===0&&_.reasoning===0&&_.cacheRead===0&&_.cacheWrite===0&&(f.cost??0)===0)continue;let m=(u.get(p.id)??[]).filter(A=>A.type==="tool"),w=m.map(A=>ob[A.tool??""]??A.tool??"").filter(Boolean),I=m.filter(A=>A.tool==="bash"&&typeof A.state?.input?.command=="string").flatMap(A=>QP(A.state.input.command)),b=`opencode:${r}:${p.id}`;t.has(b)||(t.add(b),yield{provider:"opencode",model:f.modelID??"unknown",inputTokens:_.input,outputTokens:_.output,cacheCreationInputTokens:_.cacheWrite,cacheReadInputTokens:_.cacheRead,cachedInputTokens:_.cacheRead,reasoningTokens:_.reasoning,costUSD:f.cost??0,tools:w,bashCommands:I,timestamp:XP(p.time_created),speed:"standard",deduplicationKey:b,userMessage:l,sessionId:r})}}finally{s.close()}}}}async function eD(e){if(!Kg()||!Xi)return[];let t;try{t=new Xi(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?rb(r.directory):rb(r.title),provider:"opencode"}))}catch{return[]}finally{t.close()}}var Xi,ob,tD,ib=G(()=>{"use strict";Xi=null;c(Kg,"loadSqlite");ob={bash:"Bash",read:"Read",edit:"Edit",write:"Write",glob:"Glob",grep:"Grep",task:"Agent",fetch:"WebFetch",search:"WebSearch",todo:"TodoWrite",skill:"Skill",patch:"Patch"};c(rb,"sanitize");c(GP,"getDataDir");c(YP,"findDbFiles");c(XP,"parseTimestamp");c(QP,"extractBashCommands");c(ZP,"createParser");c(eD,"discoverFromDb");tD={name:"opencode",displayName:"OpenCode",modelDisplayName(e){return e.replace(/^[^/]+\//,"")},toolDisplayName(e){return ob[e]??e},async discoverSessions(){if(!Kg())return[];let e=await YP(GP()),t=[];for(let n of e)t.push(...await eD(n));return t},createSessionParser(e,t){return ZP(e,t)}}});async function pb(){if(cb)return ab;cb=!0;try{let{cursor:e}=await Promise.resolve().then(()=>(nb(),tb));return ab=e,e}catch{return null}}async function mb(){if(db)return ub;db=!0;try{let{opencode:e}=await Promise.resolve().then(()=>(ib(),sb));return ub=e,e}catch{return null}}async function Gg(){let[e,t]=await Promise.all([pb(),mb()]),n=[...lb];return e&&n.push(e),t&&n.push(t),n}async function fb(e){let t=await Gg(),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 gb(e){return e==="cursor"?await pb()??void 0:e==="opencode"?await mb()??void 0:lb.find(t=>t.name===e)}var lb,ab,cb,ub,db,hb=G(()=>{"use strict";MI();HI();VI();ZI();lb=[LI,UI,zI,QI],ab=null,cb=!1;c(pb,"loadCursor");ub=null,db=!1;c(mb,"loadOpenCode");c(Gg,"getAllProviders");c(fb,"discoverAllSessions");c(gb,"getProvider")});import{spawn as nD}from"node:child_process";function ql(e){return`rm-${e.trim().replace(/[^A-Za-z0-9_.-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,80)||"session"}`}function Ul(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 nu(e,t,n={}){return n.literal===!1?["send-keys","-t",e,t]:["send-keys","-t",e,"-l","--",t]}function _b(e){return["has-session","-t",e]}function ru(e){return`tmux attach -t ${e}`}function rD(){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 Yg(e){return new Promise(t=>{let n=nD("tmux",e,{stdio:["ignore","ignore","pipe"],env:rD()}),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 yb(){return(await Yg(["-V"])).code===0}var Xg=G(()=>{"use strict";c(ql,"sanitizeTmuxName");c(Ul,"buildTmuxLaunchArgs");c(nu,"buildTmuxSendKeysArgs");c(_b,"buildTmuxHasSessionArgs");c(ru,"buildTmuxAttachCommand");c(rD,"tmuxSpawnEnv");c(Yg,"runTmux");c(yb,"isTmuxAvailable")});import{spawn as Qg}from"node:child_process";import{randomUUID as oD}from"node:crypto";import{writeFile as wb}from"node:fs/promises";import{tmpdir as vb}from"node:os";import{join as Ib}from"node:path";function iD(e){if(e!==void 0){if(sD.test(e))return e;console.warn(`[claude-code-launcher] dropping non-uuid runId (RULEMETRIC_RUN_ID not injected): ${JSON.stringify(e)}`)}}function aD(e){return`'${e.replace(/'/g,"'\\''")}'`}var sD,Hl,bb=G(()=>{"use strict";Xg();sD=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;c(iD,"validateRunId");c(aD,"shellSingleQuote");Hl=class{static{c(this,"ClaudeCodeLauncher")}options;tool="claude_code";constructor(t={}){this.options=t}capabilities={headless:!0,interactive:!0,remoteSpawn:!0};async launch(t){let n=oD(),r={...t,runId:iD(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=Qg("claude",r,{cwd:t.projectPath,env:o,stdio:["ignore","pipe","pipe"]}),a="",u="";i.stdout.on("data",p=>{a+=p.toString()}),i.stderr.on("data",p=>{u+=p.toString()});let l=t.timeout?setTimeout(()=>{i.kill("SIGTERM")},t.timeout):null;i.on("close",p=>{l&&clearTimeout(l);let f=a;try{let _=JSON.parse(a);f=_.result??_.content??a}catch{}s({sessionId:n,pid:i.pid,exitCode:p,output:f,error:p!==0?u: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??yb)().catch(()=>!1)?this.launchInteractiveTmux(t,n):this.launchInteractiveTerminal(t,n,"tmux_not_found")}async launchInteractiveTmux(t,n){let r=this.options.runTmux??Yg,o=ql(`claude-${t.resumeSessionId??n}`),s=await r(Ul({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(nu(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 u=await r(nu(o,"Enter",{literal:!1}));if(u.code!==0)return{sessionId:n,liveSendAvailable:!1,fallbackReason:"tmux_launch_failed",error:`tmux send Enter exited ${u.code}: ${u.stderr.trim()||"no stderr"}`}}return{sessionId:n,pid:i.pid,liveSendAvailable:!0,...i.error?{error:i.error}:{},terminalTarget:{kind:"tmux",target:o,attachCommand:ru(o),live:!0}}}async openTerminalAttach(t,n){let r=Ib(vb(),`rulemetric-attach-${n}.command`),o=`#!/bin/zsh
43
+ `;c(ZP,"createParser");eD={name:"cursor",displayName:"Cursor",modelDisplayName(e){return GP[e]??e},toolDisplayName(e){return e},async discoverSessions(){if(!db())return[];let e=YP();return JP(e)?[{path:e,project:"cursor",provider:"cursor"}]:[]},createSessionParser(e,t){return ZP(e,t)}}});var fb={};lo(fb,{opencode:()=>dD});import{readdir as tD}from"fs/promises";import{join as Zg}from"path";import{homedir as nD}from"os";function eh(){if(Qi)return!0;try{return Qi=yp("better-sqlite3"),!0}catch{return!1}}function mb(e){return e.replace(/^\//,"").replace(/\//g,"-")}function rD(){let e=process.env.XDG_DATA_HOME??Zg(nD(),".local","share");return Zg(e,"opencode")}async function oD(e){try{return(await tD(e)).filter(n=>n.startsWith("opencode")&&n.endsWith(".db")).map(n=>Zg(e,n))}catch{return[]}}function sD(e){let t=e<1e12?e*1e3:e;return new Date(t).toISOString()}function iD(e){return e.split(/[;&|]+/).map(t=>t.trim().split(/\s+/)[0]).filter(Boolean)}function aD(e,t){return{async*parse(){if(!eh()||!Qi)return;let n=e.path.split(":"),r=n[n.length-1],o=n.slice(0,-1).join(":"),s;try{s=new Qi(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),d=new Map;for(let m of a)try{let p=JSON.parse(m.data),_=d.get(m.message_id)??[];_.push(p),d.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 A=(d.get(m.id)??[]).filter(b=>b.type==="text").map(()=>"").filter(Boolean);A.length>0&&(l=A.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 h=(d.get(m.id)??[]).filter(A=>A.type==="tool"),v=h.map(A=>pb[A.tool??""]??A.tool??"").filter(Boolean),I=h.filter(A=>A.tool==="bash"&&typeof A.state?.input?.command=="string").flatMap(A=>iD(A.state.input.command)),E=`opencode:${r}:${m.id}`;t.has(E)||(t.add(E),yield{provider:"opencode",model:p.modelID??"unknown",inputTokens:_.input,outputTokens:_.output,cacheCreationInputTokens:_.cacheWrite,cacheReadInputTokens:_.cacheRead,cachedInputTokens:_.cacheRead,reasoningTokens:_.reasoning,costUSD:p.cost??0,tools:v,bashCommands:I,timestamp:sD(m.time_created),speed:"standard",deduplicationKey:E,userMessage:l,sessionId:r})}}finally{s.close()}}}}async function cD(e){if(!eh()||!Qi)return[];let t;try{t=new Qi(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?mb(r.directory):mb(r.title),provider:"opencode"}))}catch{return[]}finally{t.close()}}var Qi,pb,dD,gb=Y(()=>{"use strict";Qi=null;c(eh,"loadSqlite");pb={bash:"Bash",read:"Read",edit:"Edit",write:"Write",glob:"Glob",grep:"Grep",task:"Agent",fetch:"WebFetch",search:"WebSearch",todo:"TodoWrite",skill:"Skill",patch:"Patch"};c(mb,"sanitize");c(rD,"getDataDir");c(oD,"findDbFiles");c(sD,"parseTimestamp");c(iD,"extractBashCommands");c(aD,"createParser");c(cD,"discoverFromDb");dD={name:"opencode",displayName:"OpenCode",modelDisplayName(e){return e.replace(/^[^/]+\//,"")},toolDisplayName(e){return pb[e]??e},async discoverSessions(){if(!eh())return[];let e=await oD(rD()),t=[];for(let n of e)t.push(...await cD(n));return t},createSessionParser(e,t){return aD(e,t)}}});async function Ib(){if(_b)return hb;_b=!0;try{let{cursor:e}=await Promise.resolve().then(()=>(lb(),ub));return hb=e,e}catch{return null}}async function bb(){if(wb)return yb;wb=!0;try{let{opencode:e}=await Promise.resolve().then(()=>(gb(),fb));return yb=e,e}catch{return null}}async function th(){let[e,t]=await Promise.all([Ib(),bb()]),n=[...vb];return e&&n.push(e),t&&n.push(t),n}async function Eb(e){let t=await th(),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 Ab(e){return e==="cursor"?await Ib()??void 0:e==="opencode"?await bb()??void 0:vb.find(t=>t.name===e)}var vb,hb,_b,yb,wb,Sb=Y(()=>{"use strict";VI();YI();tb();cb();vb=[zI,GI,eb,ab],hb=null,_b=!1;c(Ib,"loadCursor");yb=null,wb=!1;c(bb,"loadOpenCode");c(th,"getAllProviders");c(Eb,"discoverAllSessions");c(Ab,"getProvider")});import{spawn as uD}from"node:child_process";function zl(e){return`rm-${e.trim().replace(/[^A-Za-z0-9_.-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,80)||"session"}`}function Vl(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 od(e,t,n={}){return n.literal===!1?["send-keys","-t",e,t]:["send-keys","-t",e,"-l","--",t]}function xb(e){return["has-session","-t",e]}function sd(e){return`tmux attach -t ${e}`}function lD(){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 nh(e){return new Promise(t=>{let n=uD("tmux",e,{stdio:["ignore","ignore","pipe"],env:lD()}),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 Rb(){return(await nh(["-V"])).code===0}var rh=Y(()=>{"use strict";c(zl,"sanitizeTmuxName");c(Vl,"buildTmuxLaunchArgs");c(od,"buildTmuxSendKeysArgs");c(xb,"buildTmuxHasSessionArgs");c(sd,"buildTmuxAttachCommand");c(lD,"tmuxSpawnEnv");c(nh,"runTmux");c(Rb,"isTmuxAvailable")});import{spawn as oh}from"node:child_process";import{randomUUID as mD}from"node:crypto";import{writeFile as Tb}from"node:fs/promises";import{tmpdir as kb}from"node:os";import{join as Nb}from"node:path";function fD(e){if(e!==void 0){if(pD.test(e))return e;console.warn(`[claude-code-launcher] dropping non-uuid runId (RULEMETRIC_RUN_ID not injected): ${JSON.stringify(e)}`)}}function gD(e){return`'${e.replace(/'/g,"'\\''")}'`}var pD,Jl,jb=Y(()=>{"use strict";rh();pD=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;c(fD,"validateRunId");c(gD,"shellSingleQuote");Jl=class{static{c(this,"ClaudeCodeLauncher")}options;tool="claude_code";constructor(t={}){this.options=t}capabilities={headless:!0,interactive:!0,remoteSpawn:!0};async launch(t){let n=mD(),r={...t,runId:fD(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=oh("claude",r,{cwd:t.projectPath,env:o,stdio:["ignore","pipe","pipe"]}),a="",d="";i.stdout.on("data",m=>{a+=m.toString()}),i.stderr.on("data",m=>{d+=m.toString()});let l=t.timeout?setTimeout(()=>{i.kill("SIGTERM")},t.timeout):null;i.on("close",m=>{l&&clearTimeout(l);let p=a;try{let _=JSON.parse(a);p=_.result??_.content??a}catch{}s({sessionId:n,pid:i.pid,exitCode:m,output:p,error:m!==0?d: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??Rb)().catch(()=>!1)?this.launchInteractiveTmux(t,n):this.launchInteractiveTerminal(t,n,"tmux_not_found")}async launchInteractiveTmux(t,n){let r=this.options.runTmux??nh,o=zl(`claude-${t.resumeSessionId??n}`),s=await r(Vl({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(od(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 d=await r(od(o,"Enter",{literal:!1}));if(d.code!==0)return{sessionId:n,liveSendAvailable:!1,fallbackReason:"tmux_launch_failed",error:`tmux send Enter exited ${d.code}: ${d.stderr.trim()||"no stderr"}`}}return{sessionId:n,pid:i.pid,liveSendAvailable:!0,...i.error?{error:i.error}:{},terminalTarget:{kind:"tmux",target:o,attachCommand:sd(o),live:!0}}}async openTerminalAttach(t,n){let r=Nb(kb(),`rulemetric-attach-${n}.command`),o=`#!/bin/zsh
44
44
  rm -- "$0"
45
- ${ru(t)}
46
- `;return await wb(r,o,{mode:493}),new Promise(s=>{let i=Qg("open",["-a","Terminal",r],{stdio:["ignore","pipe","pipe"]}),a="";i.stderr.on("data",u=>{a+=u.toString()}),i.on("close",u=>{s(u===0?{pid:i.pid}:{pid:i.pid,error:`open attach exited ${u}: ${a.trim()||"no stderr"}`})}),i.on("error",u=>{s({error:`Failed to spawn open attach: ${u.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=Ib(vb(),`rulemetric-launch-${n}.command`),u=t.runId?`export RULEMETRIC_RUN_ID=${aD(t.runId)}
45
+ ${sd(t)}
46
+ `;return await Tb(r,o,{mode:493}),new Promise(s=>{let i=oh("open",["-a","Terminal",r],{stdio:["ignore","pipe","pipe"]}),a="";i.stderr.on("data",d=>{a+=d.toString()}),i.on("close",d=>{s(d===0?{pid:i.pid}:{pid:i.pid,error:`open attach exited ${d}: ${a.trim()||"no stderr"}`})}),i.on("error",d=>{s({error:`Failed to spawn open attach: ${d.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=Nb(kb(),`rulemetric-launch-${n}.command`),d=t.runId?`export RULEMETRIC_RUN_ID=${gD(t.runId)}
47
47
  `:"",l=`#!/bin/zsh
48
48
  rm -- "$0"
49
49
  cd ${JSON.stringify(t.projectPath)} || exit
50
- `+u+`${i}
51
- `;return await wb(a,l,{mode:493}),new Promise(p=>{let f=Qg("open",["-a","Terminal",a],{stdio:["ignore","pipe","pipe"]}),_="";f.stderr.on("data",v=>{_+=v.toString()}),f.on("close",v=>{if(v===0)p({sessionId:n,pid:f.pid,liveSendAvailable:!1,fallbackReason:r,...o?{error:o}:{}});else{let h=_.trim()||"no stderr";p({sessionId:n,pid:f.pid,liveSendAvailable:!1,fallbackReason:r,error:o?`${o}; open exited ${v}: ${h}`:`open exited ${v}: ${h}`})}}),f.on("error",v=>{p({sessionId:n,liveSendAvailable:!1,fallbackReason:r,error:`Failed to spawn open: ${v.message}`})})})}}});import{spawn as Eb}from"node:child_process";import{randomUUID as cD}from"node:crypto";var Bl,Ab=G(()=>{"use strict";Bl=class{static{c(this,"CodexLauncher")}tool="codex";capabilities={headless:!0,interactive:!0,remoteSpawn:!0};async launch(t){let n=cD();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=Eb("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 u=t.timeout?setTimeout(()=>{s.kill("SIGTERM")},t.timeout):null;s.on("close",l=>{u&&clearTimeout(u),o({sessionId:n,pid:s.pid,exitCode:l,output:i,error:l!==0?a:void 0})}),s.on("error",l=>{u&&clearTimeout(u),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=Eb("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 Sb}from"node:child_process";import{randomUUID as uD}from"node:crypto";var Fl,xb=G(()=>{"use strict";Fl=class{static{c(this,"AiderLauncher")}tool="aider";capabilities={headless:!0,interactive:!0,remoteSpawn:!0};async launch(t){let n=uD();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=Sb("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 u=t.timeout?setTimeout(()=>{s.kill("SIGTERM")},t.timeout):null;s.on("close",l=>{u&&clearTimeout(u),o({sessionId:n,pid:s.pid,exitCode:l,output:i,error:l!==0?a:void 0})}),s.on("error",l=>{u&&clearTimeout(u),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=Sb("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 dD}from"node:child_process";import{randomUUID as lD}from"node:crypto";var Wl,Tb=G(()=>{"use strict";Wl=class{static{c(this,"GenericLauncher")}tool;constructor(t){this.tool=t}capabilities={headless:!1,interactive:!0,remoteSpawn:!1};async launch(t){let n=lD();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=dD("osascript",["-e",`tell application "Terminal" to do script ${JSON.stringify(r)}`],{stdio:"ignore",detached:!0});return o.unref(),{sessionId:n,pid:o.pid}}}});function kb(e){let t=Rb[e];return t?t():new Wl(e)}function Nb(){return Object.entries(Rb).map(([e,t])=>({tool:e,capabilities:t().capabilities}))}var Rb,jb=G(()=>{"use strict";bb();Ab();xb();Tb();Rb={claude_code:c(()=>new Hl,"claude_code"),codex:c(()=>new Bl,"codex"),aider:c(()=>new Fl,"aider")};c(kb,"getLauncher");c(Nb,"getAvailableLaunchers")});import Pb from"node:path";function Zg(e){return e.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^[-.]+|[-.]+$/g,"")||"worktree"}function zl(e){return Pb.resolve(e.basePath??Pb.join(e.repoRoot,"..",".rulemetric-worktrees",Zg(e.branch)))}var Db=G(()=>{"use strict";c(Zg,"sanitizeBranch");c(zl,"worktreePathFor")});var Ob={};co(Ob,{ClaudeCodeAdapter:()=>Wi,CodexAdapter:()=>Gi,CopilotAgentAdapter:()=>Ji,CursorAdapter:()=>zi,RuleMetricMcpAdapter:()=>Ki,SESSION_EVENT_TYPES:()=>Zj,SESSION_TOOLS:()=>Qj,VSCodeCopilotAdapter:()=>Vi,buildTmuxAttachCommand:()=>ru,buildTmuxHasSessionArgs:()=>_b,buildTmuxLaunchArgs:()=>Ul,buildTmuxSendKeysArgs:()=>nu,detectTool:()=>tu,discoverAllSessions:()=>fb,freshCodexState:()=>qg,getAdapter:()=>eu,getAllProviders:()=>Gg,getAvailableLaunchers:()=>Nb,getLauncher:()=>kb,getProvider:()=>gb,sanitizeBranch:()=>Zg,sanitizeTmuxName:()=>ql,worktreePathFor:()=>zl});var Vl=G(()=>{"use strict";DI();Og();Cg();Lg();Mg();$g();Ug();CI();hb();jb();Db();Xg()});var Bb={};co(Bb,{getSupabaseAdmin:()=>zn});import{createClient as TD}from"@supabase/supabase-js";function zn(){if(Xl)return Xl;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 Xl=TD(e,t,{auth:{autoRefreshToken:!1,persistSession:!1}}),Xl}var Xl,ou=G(()=>{"use strict";Xl=null;c(zn,"getSupabaseAdmin")});var Vb={};co(Vb,{SNAPSHOT_DELTA_BUCKET:()=>th,decodeDeltaBlob:()=>Fb,encodeDeltaBlob:()=>nh,getDeltaBlob:()=>su,resolveDeltaPage:()=>iu,resolveFullRows:()=>oh,uploadEncodedDelta:()=>rh});import{gzipSync as RD,gunzipSync as kD}from"node:zlib";import{createHash as ND}from"node:crypto";function nh(e){let t=JSON.stringify(e??[]),n=RD(Buffer.from(t,"utf-8")),r=ND("sha256").update(n).digest("hex");return{body:n,ref:`sha256/${r}.json.gz`,bytes:n.byteLength}}function Fb(e){try{let t=kD(Buffer.from(e)).toString("utf-8"),n=JSON.parse(t);return Array.isArray(n)?n:[]}catch{return[]}}async function rh(e){let{body:t,ref:n,bytes:r}=e,{error:o}=await zn().storage.from(th).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 su(e){let{data:t,error:n}=await zn().storage.from(th).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 Fb(r)}function Ql(e){return typeof e.messagesDeltaRef=="string"&&e.messagesDeltaRef.length>0}async function zb(e,t,n){let r=new Array(e.length),o=0,s=c(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 iu(e){return e.some(Ql)?zb(e,Wb,async t=>({sequence:t.sequence,messagesDelta:Ql(t)?await su(t.messagesDeltaRef):t.messagesDelta})):e.map(t=>({sequence:t.sequence,messagesDelta:t.messagesDelta}))}async function oh(e){return e.some(Ql)?zb(e,Wb,async t=>Ql(t)?{...t,messagesDelta:await su(t.messagesDeltaRef)}:t):e}var th,Wb,Zl=G(()=>{"use strict";ou();th="snapshot-deltas";c(nh,"encodeDeltaBlob");c(Fb,"decodeDeltaBlob");c(rh,"uploadEncodedDelta");c(su,"getDeltaBlob");Wb=8;c(Ql,"hasRef");c(zb,"mapCapped");c(iu,"resolveDeltaPage");c(oh,"resolveFullRows")});var YA={};co(YA,{resolveRuntimeWebConfig:()=>GA,stampRuntimeConfig:()=>Qq});function GA(e=process.env){let t=e.SUPABASE_URL?.trim(),n=e.SUPABASE_ANON_KEY?.trim();return!t||!n?null:{supabaseUrl:t,supabaseAnonKey:n}}function Qq(e,t=process.env){let n=GA(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}
50
+ `+d+`${i}
51
+ `;return await Tb(a,l,{mode:493}),new Promise(m=>{let p=oh("open",["-a","Terminal",a],{stdio:["ignore","pipe","pipe"]}),_="";p.stderr.on("data",w=>{_+=w.toString()}),p.on("close",w=>{if(w===0)m({sessionId:n,pid:p.pid,liveSendAvailable:!1,fallbackReason:r,...o?{error:o}:{}});else{let f=_.trim()||"no stderr";m({sessionId:n,pid:p.pid,liveSendAvailable:!1,fallbackReason:r,error:o?`${o}; open exited ${w}: ${f}`:`open exited ${w}: ${f}`})}}),p.on("error",w=>{m({sessionId:n,liveSendAvailable:!1,fallbackReason:r,error:`Failed to spawn open: ${w.message}`})})})}}});import{spawn as Pb}from"node:child_process";import{randomUUID as hD}from"node:crypto";var Kl,Db=Y(()=>{"use strict";Kl=class{static{c(this,"CodexLauncher")}tool="codex";capabilities={headless:!0,interactive:!0,remoteSpawn:!0};async launch(t){let n=hD();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=Pb("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 d=t.timeout?setTimeout(()=>{s.kill("SIGTERM")},t.timeout):null;s.on("close",l=>{d&&clearTimeout(d),o({sessionId:n,pid:s.pid,exitCode:l,output:i,error:l!==0?a:void 0})}),s.on("error",l=>{d&&clearTimeout(d),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=Pb("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 Ob}from"node:child_process";import{randomUUID as _D}from"node:crypto";var Gl,Cb=Y(()=>{"use strict";Gl=class{static{c(this,"AiderLauncher")}tool="aider";capabilities={headless:!0,interactive:!0,remoteSpawn:!0};async launch(t){let n=_D();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=Ob("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 d=t.timeout?setTimeout(()=>{s.kill("SIGTERM")},t.timeout):null;s.on("close",l=>{d&&clearTimeout(d),o({sessionId:n,pid:s.pid,exitCode:l,output:i,error:l!==0?a:void 0})}),s.on("error",l=>{d&&clearTimeout(d),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=Ob("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 yD}from"node:child_process";import{randomUUID as wD}from"node:crypto";var Yl,Lb=Y(()=>{"use strict";Yl=class{static{c(this,"GenericLauncher")}tool;constructor(t){this.tool=t}capabilities={headless:!1,interactive:!0,remoteSpawn:!1};async launch(t){let n=wD();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=yD("osascript",["-e",`tell application "Terminal" to do script ${JSON.stringify(r)}`],{stdio:"ignore",detached:!0});return o.unref(),{sessionId:n,pid:o.pid}}}});function $b(e){let t=Mb[e];return t?t():new Yl(e)}function qb(){return Object.entries(Mb).map(([e,t])=>({tool:e,capabilities:t().capabilities}))}var Mb,Ub=Y(()=>{"use strict";jb();Db();Cb();Lb();Mb={claude_code:c(()=>new Jl,"claude_code"),codex:c(()=>new Kl,"codex"),aider:c(()=>new Gl,"aider")};c($b,"getLauncher");c(qb,"getAvailableLaunchers")});import Hb from"node:path";function sh(e){return e.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^[-.]+|[-.]+$/g,"")||"worktree"}function Xl(e){return Hb.resolve(e.basePath??Hb.join(e.repoRoot,"..",".rulemetric-worktrees",sh(e.branch)))}var Bb=Y(()=>{"use strict";c(sh,"sanitizeBranch");c(Xl,"worktreePathFor")});var Fb={};lo(Fb,{ClaudeCodeAdapter:()=>zi,CodexAdapter:()=>Yi,CopilotAgentAdapter:()=>Ki,CursorAdapter:()=>Vi,RuleMetricMcpAdapter:()=>Gi,SESSION_EVENT_TYPES:()=>aP,SESSION_TOOLS:()=>iP,VSCodeCopilotAdapter:()=>Ji,buildTmuxAttachCommand:()=>sd,buildTmuxHasSessionArgs:()=>xb,buildTmuxLaunchArgs:()=>Vl,buildTmuxSendKeysArgs:()=>od,detectTool:()=>rd,discoverAllSessions:()=>Eb,freshCodexState:()=>zg,getAdapter:()=>nd,getAllProviders:()=>th,getAvailableLaunchers:()=>qb,getLauncher:()=>$b,getProvider:()=>Ab,sanitizeBranch:()=>sh,sanitizeTmuxName:()=>zl,worktreePathFor:()=>Xl});var Ql=Y(()=>{"use strict";BI();Ug();Hg();Bg();Fg();Wg();Vg();WI();Sb();Ub();Bb();rh()});var Xb={};lo(Xb,{getSupabaseAdmin:()=>Vn});import{createClient as CD}from"@supabase/supabase-js";function Vn(){if(rm)return rm;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 rm=CD(e,t,{auth:{autoRefreshToken:!1,persistSession:!1}}),rm}var rm,id=Y(()=>{"use strict";rm=null;c(Vn,"getSupabaseAdmin")});var t0={};lo(t0,{SNAPSHOT_DELTA_BUCKET:()=>ch,decodeDeltaBlob:()=>Qb,encodeDeltaBlob:()=>dh,getDeltaBlob:()=>ad,resolveDeltaPage:()=>cd,resolveFullRows:()=>lh,uploadEncodedDelta:()=>uh});import{gzipSync as LD,gunzipSync as MD}from"node:zlib";import{createHash as $D}from"node:crypto";function dh(e){let t=JSON.stringify(e??[]),n=LD(Buffer.from(t,"utf-8")),r=$D("sha256").update(n).digest("hex");return{body:n,ref:`sha256/${r}.json.gz`,bytes:n.byteLength}}function Qb(e){try{let t=MD(Buffer.from(e)).toString("utf-8"),n=JSON.parse(t);return Array.isArray(n)?n:[]}catch{return[]}}async function uh(e){let{body:t,ref:n,bytes:r}=e,{error:o}=await Vn().storage.from(ch).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 ad(e){let{data:t,error:n}=await Vn().storage.from(ch).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 Qb(r)}function om(e){return typeof e.messagesDeltaRef=="string"&&e.messagesDeltaRef.length>0}async function e0(e,t,n){let r=new Array(e.length),o=0,s=c(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 cd(e){return e.some(om)?e0(e,Zb,async t=>({sequence:t.sequence,messagesDelta:om(t)?await ad(t.messagesDeltaRef):t.messagesDelta})):e.map(t=>({sequence:t.sequence,messagesDelta:t.messagesDelta}))}async function lh(e){return e.some(om)?e0(e,Zb,async t=>om(t)?{...t,messagesDelta:await ad(t.messagesDeltaRef)}:t):e}var ch,Zb,sm=Y(()=>{"use strict";id();ch="snapshot-deltas";c(dh,"encodeDeltaBlob");c(Qb,"decodeDeltaBlob");c(uh,"uploadEncodedDelta");c(ad,"getDeltaBlob");Zb=8;c(om,"hasRef");c(e0,"mapCapped");c(cd,"resolveDeltaPage");c(lh,"resolveFullRows")});var nS={};lo(nS,{resolveRuntimeWebConfig:()=>tS,stampRuntimeConfig:()=>aU});function tS(e=process.env){let t=e.SUPABASE_URL?.trim(),n=e.SUPABASE_ANON_KEY?.trim();return!t||!n?null:{supabaseUrl:t,supabaseAnonKey:n}}function aU(e,t=process.env){let n=tS(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}
52
52
  </head>`):`${o}
53
- ${e}`}var XA=G(()=>{"use strict";c(GA,"resolveRuntimeWebConfig");c(Qq,"stampRuntimeConfig")});import*as sm from"node:fs";import*as im from"node:path";import{fileURLToPath as jU}from"node:url";import{serve as PU}from"@hono/node-server";import{trace as V_,context as TS}from"@opentelemetry/api";import{NodeSDK as RS}from"@opentelemetry/sdk-node";import{OTLPTraceExporter as kS}from"@opentelemetry/exporter-trace-otlp-http";import{BatchSpanProcessor as NS,ConsoleSpanExporter as jS,SimpleSpanProcessor as PS}from"@opentelemetry/sdk-trace-node";import{Resource as DS}from"@opentelemetry/resources";import{ATTR_SERVICE_NAME as OS,ATTR_SERVICE_VERSION as CS}from"@opentelemetry/semantic-conventions";function z_(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}c(z_,"parseOtlpHeaders");var Qs=null;function Zs(){return process.env.TELEMETRY_ENABLED!=="false"}c(Zs,"isTelemetryEnabled");function mm(e){if(!Zs()||Qs!==null)return"off";let t=new DS({[OS]:e.serviceName,[CS]:e.serviceVersion??"0.1.0"}),n=process.env.OTEL_EXPORTER_OTLP_ENDPOINT,r,o;if(n){let s=z_(process.env.OTEL_EXPORTER_OTLP_HEADERS),i=new kS({url:`${n}/v1/traces`,headers:s});o=new NS(i),r="otlp"}else if(process.env.OTEL_SPAN_EXPORT==="none")o=void 0,r="silent";else{let s=new jS;o=new PS(s),r="console"}return Qs=new RS({resource:t,spanProcessors:o?[o]:[]}),Qs.start(),r}c(mm,"initTelemetry");async function fm(){Qs&&(await Qs.shutdown(),Qs=null)}c(fm,"shutdownTelemetry");function gm(e){return V_.getTracer(e??"rulemetric")}c(gm,"getTracer");function hm(){return V_.getSpan(TS.active())?.spanContext().traceId}c(hm,"getTraceId");import{SpanKind as LS,SpanStatusCode as J_}from"@opentelemetry/api";function _m(){return async(e,t)=>{if(!Zs()){await t();return}let n=gm(),r=e.req.method,o=e.req.path;await n.startActiveSpan(`${r} ${o}`,{kind:LS.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:J_.ERROR})}catch(i){throw s.setStatus({code:J_.ERROR}),s.recordException(i),i}finally{s.end()}})}}c(_m,"telemetryMiddleware");import{trace as MS,context as $S}from"@opentelemetry/api";function ym(e){let t=MS.getSpan($S.active());if(t)for(let[n,r]of Object.entries(e))t.setAttribute(n,r)}c(ym,"setSpanAttributes");import*as Hr from"@sentry/node";var Ba=!1;function wm(e){if(Ba)return!1;let t=process.env.SENTRY_DSN;return t?(Hr.init({dsn:t,serverName:e.serviceName,environment:process.env.NODE_ENV??"development",tracesSampleRate:0}),Ba=!0,!0):!1}c(wm,"initSentry");function hr(e,t){if(!Ba)return;let n=e instanceof Error?e:new Error(typeof e=="string"?e:JSON.stringify(e));Hr.captureException(n,t)}c(hr,"captureException");function Fa(e){if(Ba){if(e===null){Hr.setUser(null);return}Hr.setUser({id:e})}}c(Fa,"setSentryUser");async function Wa(e){Ba&&await Hr.flush(e)}c(Wa,"flushSentry");import*as Ju from"node:fs";import*as Ca from"node:path";import{fileURLToPath as Zq}from"node:url";import{Hono as eU}from"hono";import{cors as tU}from"hono/cors";import{bodyLimit as nU}from"hono/body-limit";import{serveStatic as rU}from"@hono/node-server/serve-static";D();import{createHash as YR}from"node:crypto";import{createClient as XR}from"@supabase/supabase-js";import{eq as rv,and as QR,isNull as ZR}from"drizzle-orm";import{createHmac as HR,createPublicKey as BR,timingSafeEqual as FR,verify as WR}from"node:crypto";var zR=6e4,Tc=null,Zw=0,xc=null,VR=null;async function JR(){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()}c(JR,"defaultJwksFetcher");async function jf(){return xc||(xc=(async()=>{try{let e=await(VR??JR)(),t=new Map;for(let n of e.keys)if(n.kid)try{t.set(n.kid,BR({key:n,format:"jwk"}))}catch{}Tc=t,Zw=Date.now()}finally{xc=null}})(),xc)}c(jf,"refreshJwks");function Qw(e){try{return JSON.parse(Buffer.from(e,"base64url").toString("utf-8"))}catch{return null}}c(Qw,"decodeB64Json");function KR(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}c(KR,"checkPayload");function GR(e,t,n,r){let o=HR("sha256",r).update(`${e}.${t}`).digest(),s;try{s=Buffer.from(n,"base64url")}catch{return!1}return s.length!==o.length?!1:FR(s,o)}c(GR,"verifyHs256");async function ev(e){let t=e.split(".");if(t.length!==3)return{ok:!1,reason:"invalid"};let[n,r,o]=t,s=Qw(n);if(!s)return{ok:!1,reason:"invalid"};if(s.alg==="HS256"){let u=process.env.SUPABASE_JWT_SECRET;if(!u)return{ok:!1,reason:"unavailable"};if(!GR(n,r,o,u))return{ok:!1,reason:"invalid"}}else if(s.alg==="ES256"){if(typeof s.kid!="string")return{ok:!1,reason:"invalid"};if(Tc===null)try{await jf()}catch{return{ok:!1,reason:"unavailable"}}let u=Tc?.get(s.kid);if(!u&&Date.now()-Zw>=zR){try{await jf()}catch{return{ok:!1,reason:"unavailable"}}u=Tc?.get(s.kid)}if(!u)return{ok:!1,reason:"invalid"};let l;try{l=Buffer.from(o,"base64url")}catch{return{ok:!1,reason:"invalid"}}if(!WR("sha256",Buffer.from(`${n}.${r}`),{key:u,dsaEncoding:"ieee-p1363"},l))return{ok:!1,reason:"invalid"}}else return{ok:!1,reason:"invalid"};let i=Qw(r);if(!i)return{ok:!1,reason:"invalid"};let a=KR(i);return a?{ok:!0,userId:a.userId,payload:i}:{ok:!1,reason:"invalid"}}c(ev,"verifySupabaseJwt");async function tv(e=3){for(let t=0;t<e;t++)try{return await jf(),Tc!==null}catch{await new Promise(n=>setTimeout(n,500*2**t))}return!1}c(tv,"primeJwks");function ek(e){return YR("sha256").update(e).digest("hex")}c(ek,"hashApiKey");var nv=new Map,tk=300*1e3;function nk(e){let t=Date.now(),n=nv.get(e)??0;t-n<tk||(nv.set(e,t),d.update(Ae).set({lastUsedAt:new Date}).where(rv(Ae.id,e)).then(()=>{}).catch(()=>{}))}c(nk,"updateLastUsed");var rk=60*1e3,ok=5e3,hi=new Map;async function ov(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=ek(r),s,i=hi.get(o);if(i&&Date.now()-i.cachedAt<rk)s=i;else{i&&hi.delete(o);let[a]=await d.select({id:Ae.id,userId:Ae.userId,expiresAt:Ae.expiresAt}).from(Ae).where(QR(rv(Ae.keyHash,o),ZR(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()},hi.size>=ok&&hi.clear(),hi.set(o,s)}if(s.expiresAt&&new Date(s.expiresAt)<new Date)return hi.delete(o),e.json({error:"API key expired"},401);e.set("userId",s.userId),Fa(s.userId),nk(s.id),await t();return}try{let o=XR(process.env.SUPABASE_URL,process.env.SUPABASE_ANON_KEY,{global:{headers:{Authorization:`Bearer ${r}`}}}),s=await ev(r);if(s.ok){e.set("userId",s.userId),e.set("supabase",o),Fa(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:u}=await o.auth.getUser();if(console.log(`[auth] getUser ${e.req.method} ${e.req.path} ms=${Date.now()-i} ${u?`err=${u.message}`:`userId=${a?.id??"?"}`}`),u||!a)return e.json({error:"Invalid token"},401);e.set("user",a),e.set("userId",a.id),e.set("supabase",o),Fa(a.id),await t()}catch{return e.json({error:"Authentication failed"},401)}}c(ov,"authMiddleware");D();import{HTTPException as sk}from"hono/http-exception";import{ZodError as ik}from"zod";function ct(e){return e.replace(/[%_\\]/g,"\\$&")}c(ct,"escapeLike");function _i(e){let t=e;return t?.code??t?.cause?.code??t?.errno}c(_i,"transientCode");var ak=new Set(["ECONNRESET","EPIPE","ECONNABORTED"]);function sv(e,t){return e instanceof ik?t.json({error:"Validation error",details:e.flatten().fieldErrors},400):e instanceof sk?e.getResponse():Ac(e)?t.json({error:"Server draining, retry shortly"},503):Sc(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"||ak.has(_i(e)??"")?(process.env.LOG_LEVEL==="debug"&&console.debug(`[req] client/transient disconnect code=${_i(e)??"aborted"}`),t.body(null,503)):(console.error("Unhandled error:",e),t.json({error:"Internal server error"},500))}c(sv,"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}`,a=Date.now(),u=n.get(i);if((!u||a>u.resetAt)&&(u={count:0,resetAt:a+e},n.set(i,u)),u.count++,r.res.headers.set("X-RateLimit-Limit",String(t)),r.res.headers.set("X-RateLimit-Remaining",String(Math.max(0,t-u.count))),r.res.headers.set("X-RateLimit-Reset",String(Math.ceil(u.resetAt/1e3))),u.count>t)return r.json({error:"Too many requests, please try again later"},429);await o()}}c(Rc,"rateLimit");var Fd=!0,Pf="",iv=0;function Df(e,t="",n=-1){if(e===Fd){!e&&t&&(Pf=t);return}Fd=e,Pf=e?"":t,iv=n,console.log(`[db-readiness] -> ${e?"READY":"NOT READY"}${t?` (${t})`:""}`)}c(Df,"setDbReady");function kc(){return Fd}c(kc,"isDbReady");function Wd(){return{ready:Fd,reason:Pf,changedAt:iv}}c(Wd,"dbReadiness");async function av(e,t){return kc()?t():(e.header("Retry-After","5"),e.json({error:"Service temporarily unavailable: the database is recovering. Retry shortly.",reason:Wd().reason||void 0},503))}c(av,"dbShed");D();var ck=5e3,cv=0;async function uv(e,t){let n=_c(),r=pi();if(n>r){If();let o=Date.now();return o-cv>=ck&&(cv=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()}c(uv,"dbLoadShed");D();var uk=5e3,dv=0;async function Nc(e,t){if(e.req.method!=="POST")return t();let n=_c(),r=wc();if(n>=r){yc();let o=Date.now();return o-dv>=uk&&(dv=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()}c(Nc,"ingestLoadShed");var lv=c(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 pv(){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}`:""}`)}}}c(pv,"slowRequestLog");import{Hono as lk}from"hono";import{z as yo}from"zod";import{createClient as mv}from"@supabase/supabase-js";import{createClient as dk}from"@supabase/supabase-js";async function zd(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=dk(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}})}c(zd,"refreshSupabaseSession");var yi=new lk,pk=yo.object({email:yo.string().email(),password:yo.string().min(1)}),mk=yo.object({refreshToken:yo.string().min(1)});yi.post("/auth/login",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=mv(r,o),i=Date.now();console.log(`[auth] signInWithPassword start email=${n.email} ua="${e.req.header("user-agent")??""}"`);let{data:a,error:u}=await s.auth.signInWithPassword({email:n.email,password:n.password});return u||!a.session?(console.log(`[auth] signInWithPassword FAIL email=${n.email} ms=${Date.now()-i} err=${u?.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 fk=yo.object({email:yo.string().email(),password:yo.string().min(8,"Password must be at least 8 characters")});yi.post("/auth/signup",async e=>{let t=await e.req.json(),n=fk.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=mv(r,o),i=process.env.WEB_URL??"http://localhost:5174",{data:a,error:u}=await s.auth.signUp({email:n.email,password:n.password,options:{emailRedirectTo:`${i}/auth/confirm`}});if(u){let l=/already registered|already exists|user already/i.test(u.message);return e.json({error:u.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})});yi.post("/auth/refresh",async e=>{let t=await e.req.json().catch(()=>null),n=mk.safeParse(t);if(!n.success)return e.json({error:"refreshToken is required"},400);let r=await zd(n.data.refreshToken);return r.ok?e.json(r.session):e.json({error:r.error},r.status)});import{readFileSync as gk}from"node:fs";import{dirname as hk,resolve as Of}from"node:path";import{fileURLToPath as _k}from"node:url";import{Hono as yk}from"hono";var wk="https://registry.npmjs.org/-/package/@rulemetric%2Fcli/dist-tags",vk=3600*1e3,Ik=3e3,jc=null;function bk(){if(process.env.RULEMETRIC_BUNDLED_CLI_VERSION)return process.env.RULEMETRIC_BUNDLED_CLI_VERSION;let e=hk(_k(import.meta.url)),t=[Of(e,"../../../cli/package.json"),Of(e,"../../../../apps/cli/package.json"),Of(process.cwd(),"apps/cli/package.json")];for(let n of t)try{let r=JSON.parse(gk(n,"utf-8"));if(r.version)return r.version}catch{}return"0.0.0"}c(bk,"readBundledCliVersion");async function Ek(){try{let e=await fetch(wk,{headers:{accept:"application/json"},signal:AbortSignal.timeout(Ik)});if(!e.ok)return null;let t=await e.json();return typeof t.latest=="string"&&t.latest?t.latest:null}catch{return null}}c(Ek,"fetchLatestFromNpm");async function Ak(){let e=Date.now();if(jc&&e-jc.at<vk)return jc.version;let n=await Ek()??jc?.version??bk();return jc={version:n,at:e},n}c(Ak,"getLatestCliVersion");var Vd=new yk;Vd.get("/cli/latest-version",async e=>e.json({latest:await Ak()}));import{Hono as Mk}from"hono";D();import{sql as Sk}from"drizzle-orm";var xk=12e3,Tk=3e4,fv=4,Rk=Number(process.env.PG_RECYCLE_DEADLINE_THRESHOLD)||3,kk="pipeline:api_db_pool_wedged",Nk="pipeline:api_db_pool_recycled",wi=0;async function Cf(){return Rf(xk)}c(Cf,"probeDb");function jk(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()}}c(jk,"flattenCauseChain");function Pk(e){let{codes:t,message:n}=jk(e);return n.includes("max client")||n.includes("emaxconn")||n.includes("max_client_conn")||t.includes("XX000")&&n.includes("client")}c(Pk,"isPoolSaturation");function Dk(e){return Pk(e)?"Supavisor tenant saturated (client cap reached)":gi(e)?"transient connect failure":"DB unreachable / probe timed out"}c(Dk,"classifyProbeFailure");async function Ok(e=Cf,t={}){let n=t.consumeDeadlines??bf,r=t.recycle??Tf,o=t.onRecycle??Lk,s=await e();if(s.ok){let a=!kc();wi>0&&console.log(`[db-wedge] DB reachable again after ${wi} failed probe(s)`),wi=0,Df(!0,"",Date.now()),a&&Ck();let u=n();u>=Rk&&(console.error(`[db-wedge] recycling the MAIN pool: ${u} 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(u));return}wi+=1;let i=Dk(s.err);console.error(`[db-wedge] dedicated DB probe failed (${wi}/${fv}) \u2014 ${i}`),wi>=fv&&kc()&&(Df(!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."))}c(Ok,"watchdogTick");async function gv(e,t){try{await d.execute(Sk`
53
+ ${e}`}var rS=Y(()=>{"use strict";c(tS,"resolveRuntimeWebConfig");c(aU,"stampRuntimeConfig")});import*as lp from"node:fs";import*as mp from"node:path";import{fileURLToPath as UU}from"node:url";import{serve as HU}from"@hono/node-server";import{trace as ty,context as DS}from"@opentelemetry/api";import{NodeSDK as OS}from"@opentelemetry/sdk-node";import{OTLPTraceExporter as CS}from"@opentelemetry/exporter-trace-otlp-http";import{BatchSpanProcessor as LS,ConsoleSpanExporter as MS,SimpleSpanProcessor as $S}from"@opentelemetry/sdk-trace-node";import{Resource as qS}from"@opentelemetry/resources";import{ATTR_SERVICE_NAME as US,ATTR_SERVICE_VERSION as HS}from"@opentelemetry/semantic-conventions";function ey(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}c(ey,"parseOtlpHeaders");var Zs=null;function ei(){return process.env.TELEMETRY_ENABLED!=="false"}c(ei,"isTelemetryEnabled");function wp(e){if(!ei()||Zs!==null)return"off";let t=new qS({[US]:e.serviceName,[HS]:e.serviceVersion??"0.1.0"}),n=process.env.OTEL_EXPORTER_OTLP_ENDPOINT,r,o;if(n){let s=ey(process.env.OTEL_EXPORTER_OTLP_HEADERS),i=new CS({url:`${n}/v1/traces`,headers:s});o=new LS(i),r="otlp"}else if(process.env.OTEL_SPAN_EXPORT==="none")o=void 0,r="silent";else{let s=new MS;o=new $S(s),r="console"}return Zs=new OS({resource:t,spanProcessors:o?[o]:[]}),Zs.start(),r}c(wp,"initTelemetry");async function vp(){Zs&&(await Zs.shutdown(),Zs=null)}c(vp,"shutdownTelemetry");function Ip(e){return ty.getTracer(e??"rulemetric")}c(Ip,"getTracer");function bp(){return ty.getSpan(DS.active())?.spanContext().traceId}c(bp,"getTraceId");import{SpanKind as BS,SpanStatusCode as ny}from"@opentelemetry/api";function Ep(){return async(e,t)=>{if(!ei()){await t();return}let n=Ip(),r=e.req.method,o=e.req.path;await n.startActiveSpan(`${r} ${o}`,{kind:BS.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:ny.ERROR})}catch(i){throw s.setStatus({code:ny.ERROR}),s.recordException(i),i}finally{s.end()}})}}c(Ep,"telemetryMiddleware");import{trace as FS,context as WS}from"@opentelemetry/api";function Ap(e){let t=FS.getSpan(WS.active());if(t)for(let[n,r]of Object.entries(e))t.setAttribute(n,r)}c(Ap,"setSpanAttributes");import*as Fr from"@sentry/node";var Ba=!1;function Sp(e){if(Ba)return!1;let t=process.env.SENTRY_DSN;return t?(Fr.init({dsn:t,serverName:e.serviceName,environment:process.env.NODE_ENV??"development",tracesSampleRate:0}),Ba=!0,!0):!1}c(Sp,"initSentry");function _r(e,t){if(!Ba)return;let n=e instanceof Error?e:new Error(typeof e=="string"?e:JSON.stringify(e));Fr.captureException(n,t)}c(_r,"captureException");function Fa(e){if(Ba){if(e===null){Fr.setUser(null);return}Fr.setUser({id:e})}}c(Fa,"setSentryUser");async function Wa(e){Ba&&await Fr.flush(e)}c(Wa,"flushSentry");import*as Zd from"node:fs";import*as Ca from"node:path";import{fileURLToPath as cU}from"node:url";import{Hono as dU}from"hono";import{cors as uU}from"hono/cors";import{bodyLimit as lU}from"hono/body-limit";import{serveStatic as mU}from"@hono/node-server/serve-static";O();import{createHash as nk}from"node:crypto";import{createClient as rk}from"@supabase/supabase-js";import{eq as mv,and as ok,isNull as sk}from"drizzle-orm";import{createHmac as JT,createPublicKey as KT,timingSafeEqual as GT,verify as YT}from"node:crypto";var XT=6e4,Rc=null,cv=0,xc=null,QT=null;async function ZT(){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()}c(ZT,"defaultJwksFetcher");async function Mf(){return xc||(xc=(async()=>{try{let e=await(QT??ZT)(),t=new Map;for(let n of e.keys)if(n.kid)try{t.set(n.kid,KT({key:n,format:"jwk"}))}catch{}Rc=t,cv=Date.now()}finally{xc=null}})(),xc)}c(Mf,"refreshJwks");function av(e){try{return JSON.parse(Buffer.from(e,"base64url").toString("utf-8"))}catch{return null}}c(av,"decodeB64Json");function ek(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}c(ek,"checkPayload");function tk(e,t,n,r){let o=JT("sha256",r).update(`${e}.${t}`).digest(),s;try{s=Buffer.from(n,"base64url")}catch{return!1}return s.length!==o.length?!1:GT(s,o)}c(tk,"verifyHs256");async function dv(e){let t=e.split(".");if(t.length!==3)return{ok:!1,reason:"invalid"};let[n,r,o]=t,s=av(n);if(!s)return{ok:!1,reason:"invalid"};if(s.alg==="HS256"){let d=process.env.SUPABASE_JWT_SECRET;if(!d)return{ok:!1,reason:"unavailable"};if(!tk(n,r,o,d))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 Mf()}catch{return{ok:!1,reason:"unavailable"}}let d=Rc?.get(s.kid);if(!d&&Date.now()-cv>=XT){try{await Mf()}catch{return{ok:!1,reason:"unavailable"}}d=Rc?.get(s.kid)}if(!d)return{ok:!1,reason:"invalid"};let l;try{l=Buffer.from(o,"base64url")}catch{return{ok:!1,reason:"invalid"}}if(!YT("sha256",Buffer.from(`${n}.${r}`),{key:d,dsaEncoding:"ieee-p1363"},l))return{ok:!1,reason:"invalid"}}else return{ok:!1,reason:"invalid"};let i=av(r);if(!i)return{ok:!1,reason:"invalid"};let a=ek(i);return a?{ok:!0,userId:a.userId,payload:i}:{ok:!1,reason:"invalid"}}c(dv,"verifySupabaseJwt");async function uv(e=3){for(let t=0;t<e;t++)try{return await Mf(),Rc!==null}catch{await new Promise(n=>setTimeout(n,500*2**t))}return!1}c(uv,"primeJwks");function ik(e){return nk("sha256").update(e).digest("hex")}c(ik,"hashApiKey");var lv=new Map,ak=300*1e3;function ck(e){let t=Date.now(),n=lv.get(e)??0;t-n<ak||(lv.set(e,t),u.update(Ae).set({lastUsedAt:new Date}).where(mv(Ae.id,e)).then(()=>{}).catch(()=>{}))}c(ck,"updateLastUsed");var dk=60*1e3,uk=5e3,_i=new Map;async function pv(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=ik(r),s,i=_i.get(o);if(i&&Date.now()-i.cachedAt<dk)s=i;else{i&&_i.delete(o);let[a]=await u.select({id:Ae.id,userId:Ae.userId,expiresAt:Ae.expiresAt}).from(Ae).where(ok(mv(Ae.keyHash,o),sk(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()},_i.size>=uk&&_i.clear(),_i.set(o,s)}if(s.expiresAt&&new Date(s.expiresAt)<new Date)return _i.delete(o),e.json({error:"API key expired"},401);e.set("userId",s.userId),Fa(s.userId),ck(s.id),await t();return}try{let o=rk(process.env.SUPABASE_URL,process.env.SUPABASE_ANON_KEY,{global:{headers:{Authorization:`Bearer ${r}`}}}),s=await dv(r);if(s.ok){e.set("userId",s.userId),e.set("supabase",o),Fa(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:d}=await o.auth.getUser();if(console.log(`[auth] getUser ${e.req.method} ${e.req.path} ms=${Date.now()-i} ${d?`err=${d.message}`:`userId=${a?.id??"?"}`}`),d||!a)return e.json({error:"Invalid token"},401);e.set("user",a),e.set("userId",a.id),e.set("supabase",o),Fa(a.id),await t()}catch{return e.json({error:"Authentication failed"},401)}}c(pv,"authMiddleware");O();import{HTTPException as lk}from"hono/http-exception";import{ZodError as mk}from"zod";function ct(e){return e.replace(/[%_\\]/g,"\\$&")}c(ct,"escapeLike");function yi(e){let t=e;return t?.code??t?.cause?.code??t?.errno}c(yi,"transientCode");var pk=new Set(["ECONNRESET","EPIPE","ECONNABORTED"]);function fv(e,t){return e instanceof mk?t.json({error:"Validation error",details:e.flatten().fieldErrors},400):e instanceof lk?e.getResponse():Ac(e)?t.json({error:"Server draining, retry shortly"},503):Sc(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"||pk.has(yi(e)??"")?(process.env.LOG_LEVEL==="debug"&&console.debug(`[req] client/transient disconnect code=${yi(e)??"aborted"}`),t.body(null,503)):(console.error("Unhandled error:",e),t.json({error:"Internal server error"},500))}c(fv,"errorHandler");function Tc(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(),d=n.get(i);if((!d||a>d.resetAt)&&(d={count:0,resetAt:a+e},n.set(i,d)),d.count++,r.res.headers.set("X-RateLimit-Limit",String(t)),r.res.headers.set("X-RateLimit-Remaining",String(Math.max(0,t-d.count))),r.res.headers.set("X-RateLimit-Reset",String(Math.ceil(d.resetAt/1e3))),d.count>t)return r.json({error:"Too many requests, please try again later"},429);await o()}}c(Tc,"rateLimit");var Gu=!0,$f="",gv=0;function qf(e,t="",n=-1){if(e===Gu){!e&&t&&($f=t);return}Gu=e,$f=e?"":t,gv=n,console.log(`[db-readiness] -> ${e?"READY":"NOT READY"}${t?` (${t})`:""}`)}c(qf,"setDbReady");function kc(){return Gu}c(kc,"isDbReady");function Yu(){return{ready:Gu,reason:$f,changedAt:gv}}c(Yu,"dbReadiness");async function hv(e,t){return kc()?t():(e.header("Retry-After","5"),e.json({error:"Service temporarily unavailable: the database is recovering. Retry shortly.",reason:Yu().reason||void 0},503))}c(hv,"dbShed");O();var fk=5e3,_v=0;async function yv(e,t){let n=_c(),r=pi();if(n>r){Rf();let o=Date.now();return o-_v>=fk&&(_v=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()}c(yv,"dbLoadShed");O();var gk=5e3,wv=0;async function Nc(e,t){if(e.req.method!=="POST")return t();let n=_c(),r=wc();if(n>=r){yc();let o=Date.now();return o-wv>=gk&&(wv=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()}c(Nc,"ingestLoadShed");var vv=c(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 Iv(){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}`:""}`)}}}c(Iv,"slowRequestLog");import{Hono as _k}from"hono";import{z as vo}from"zod";import{createClient as bv}from"@supabase/supabase-js";import{createClient as hk}from"@supabase/supabase-js";async function Xu(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=hk(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}})}c(Xu,"refreshSupabaseSession");var wi=new _k,yk=vo.object({email:vo.string().email(),password:vo.string().min(1)}),wk=vo.object({refreshToken:vo.string().min(1)});wi.post("/auth/login",async e=>{let t=await e.req.json(),n=yk.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=bv(r,o),i=Date.now();console.log(`[auth] signInWithPassword start email=${n.email} ua="${e.req.header("user-agent")??""}"`);let{data:a,error:d}=await s.auth.signInWithPassword({email:n.email,password:n.password});return d||!a.session?(console.log(`[auth] signInWithPassword FAIL email=${n.email} ms=${Date.now()-i} err=${d?.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 vk=vo.object({email:vo.string().email(),password:vo.string().min(8,"Password must be at least 8 characters")});wi.post("/auth/signup",async e=>{let t=await e.req.json(),n=vk.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=bv(r,o),i=process.env.WEB_URL??"http://localhost:5174",{data:a,error:d}=await s.auth.signUp({email:n.email,password:n.password,options:{emailRedirectTo:`${i}/auth/confirm`}});if(d){let l=/already registered|already exists|user already/i.test(d.message);return e.json({error:d.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})});wi.post("/auth/refresh",async e=>{let t=await e.req.json().catch(()=>null),n=wk.safeParse(t);if(!n.success)return e.json({error:"refreshToken is required"},400);let r=await Xu(n.data.refreshToken);return r.ok?e.json(r.session):e.json({error:r.error},r.status)});import{readFileSync as Ik}from"node:fs";import{dirname as bk,resolve as Uf}from"node:path";import{fileURLToPath as Ek}from"node:url";import{Hono as Ak}from"hono";var Sk="https://registry.npmjs.org/-/package/@rulemetric%2Fcli/dist-tags",xk=3600*1e3,Rk=3e3,jc=null;function Tk(){if(process.env.RULEMETRIC_BUNDLED_CLI_VERSION)return process.env.RULEMETRIC_BUNDLED_CLI_VERSION;let e=bk(Ek(import.meta.url)),t=[Uf(e,"../../../cli/package.json"),Uf(e,"../../../../apps/cli/package.json"),Uf(process.cwd(),"apps/cli/package.json")];for(let n of t)try{let r=JSON.parse(Ik(n,"utf-8"));if(r.version)return r.version}catch{}return"0.0.0"}c(Tk,"readBundledCliVersion");async function kk(){try{let e=await fetch(Sk,{headers:{accept:"application/json"},signal:AbortSignal.timeout(Rk)});if(!e.ok)return null;let t=await e.json();return typeof t.latest=="string"&&t.latest?t.latest:null}catch{return null}}c(kk,"fetchLatestFromNpm");async function Nk(){let e=Date.now();if(jc&&e-jc.at<xk)return jc.version;let n=await kk()??jc?.version??Tk();return jc={version:n,at:e},n}c(Nk,"getLatestCliVersion");var Qu=new Ak;Qu.get("/cli/latest-version",async e=>e.json({latest:await Nk()}));import{Hono as Fk}from"hono";O();import{sql as jk}from"drizzle-orm";var Pk=12e3,Dk=3e4,Ev=4,Ok=Number(process.env.PG_RECYCLE_DEADLINE_THRESHOLD)||3,Ck="pipeline:api_db_pool_wedged",Lk="pipeline:api_db_pool_recycled",vi=0;async function Hf(){return Of(Pk)}c(Hf,"probeDb");function Mk(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()}}c(Mk,"flattenCauseChain");function $k(e){let{codes:t,message:n}=Mk(e);return n.includes("max client")||n.includes("emaxconn")||n.includes("max_client_conn")||t.includes("XX000")&&n.includes("client")}c($k,"isPoolSaturation");function qk(e){return $k(e)?"Supavisor tenant saturated (client cap reached)":hi(e)?"transient connect failure":"DB unreachable / probe timed out"}c(qk,"classifyProbeFailure");async function Uk(e=Hf,t={}){let n=t.consumeDeadlines??Tf,r=t.recycle??Df,o=t.onRecycle??Bk,s=await e();if(s.ok){let a=!kc();vi>0&&console.log(`[db-wedge] DB reachable again after ${vi} failed probe(s)`),vi=0,qf(!0,"",Date.now()),a&&Hk();let d=n();d>=Ok&&(console.error(`[db-wedge] recycling the MAIN pool: ${d} 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(d));return}vi+=1;let i=qk(s.err);console.error(`[db-wedge] dedicated DB probe failed (${vi}/${Ev}) \u2014 ${i}`),vi>=Ev&&kc()&&(qf(!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."))}c(Uk,"watchdogTick");async function Av(e,t){try{await u.execute(jk`
54
54
  INSERT INTO alert_dispatches (user_id, alert_key, severity, channel, last_state)
55
55
  SELECT DISTINCT user_id, ${e}, 'soft', 'in_app',
56
56
  jsonb_build_object('message', ${t})
57
57
  FROM sessions
58
58
  WHERE created_at > now() - interval '7 days' AND user_id IS NOT NULL
59
- `)}catch(n){console.error(`[db-wedge] failed to record ${e} alert:`,n instanceof Error?n.message:n)}}c(gv,"dispatchSoftAlert");async function Ck(){await gv(kk,'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/dev/debug-loop.sh".')}c(Ck,"reportRecovery");async function Lk(e){try{hr(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 gv(Nk,'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/dev/debug-loop.sh".')}c(Lk,"reportPoolRecycle");function hv(){let e=setInterval(()=>{Ok().catch(()=>{})},Tk);return{stop:c(()=>clearInterval(e),"stop")}}c(hv,"startDbWedgeWatchdog");var vi=new Mk;vi.get("/health",e=>e.json({status:"ok"}));vi.get("/ready",e=>{let t=Wd();return e.json({ready:t.ready,reason:t.reason||void 0},t.ready?200:503)});vi.get("/health/deep",async e=>{let t=await Cf();return e.json({status:t.ok?"ok":"degraded",db:t.ok?"ok":"wedged",dbProbeMs:t.ms},t.ok?200:503)});D();import{Hono as $k}from"hono";import{sql as qk}from"drizzle-orm";import{execFileSync as Uk}from"node:child_process";import*as _v from"node:fs";var Jd=new $k,Hk=["/usr/sbin/lsof","/usr/bin/lsof","/bin/lsof"].find(e=>_v.existsSync(e))??"lsof";function Bk(e=process.pid){try{let t=Uk(Hk,["-a","-p",String(e),"-i","TCP","-P","-n"],{encoding:"utf8",timeout:3e3}),n=[];for(let r of t.split(`
60
- `)){let o=r.match(/->([\d.]+|\[[^\]]+\]):(?:6543|5432)\b/);o&&n.push({remote:o[1].replace(/^\[|\]$/g,"")})}return n}catch{return[]}}c(Bk,"snapshotPoolerSockets");Jd.get("/diag/pg-health",async e=>{let t=await d.execute(qk`
59
+ `)}catch(n){console.error(`[db-wedge] failed to record ${e} alert:`,n instanceof Error?n.message:n)}}c(Av,"dispatchSoftAlert");async function Hk(){await Av(Ck,'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/dev/debug-loop.sh".')}c(Hk,"reportRecovery");async function Bk(e){try{_r(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 Av(Lk,'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/dev/debug-loop.sh".')}c(Bk,"reportPoolRecycle");function Sv(){let e=setInterval(()=>{Uk().catch(()=>{})},Dk);return{stop:c(()=>clearInterval(e),"stop")}}c(Sv,"startDbWedgeWatchdog");var Ii=new Fk;Ii.get("/health",e=>e.json({status:"ok"}));Ii.get("/ready",e=>{let t=Yu();return e.json({ready:t.ready,reason:t.reason||void 0},t.ready?200:503)});Ii.get("/health/deep",async e=>{let t=await Hf();return e.json({status:t.ok?"ok":"degraded",db:t.ok?"ok":"wedged",dbProbeMs:t.ms},t.ok?200:503)});O();import{Hono as Wk}from"hono";import{sql as zk}from"drizzle-orm";import{execFileSync as Vk}from"node:child_process";import*as xv from"node:fs";var Zu=new Wk,Jk=["/usr/sbin/lsof","/usr/bin/lsof","/bin/lsof"].find(e=>xv.existsSync(e))??"lsof";function Kk(e=process.pid){try{let t=Vk(Jk,["-a","-p",String(e),"-i","TCP","-P","-n"],{encoding:"utf8",timeout:3e3}),n=[];for(let r of t.split(`
60
+ `)){let o=r.match(/->([\d.]+|\[[^\]]+\]):(?:6543|5432)\b/);o&&n.push({remote:o[1].replace(/^\[|\]$/g,"")})}return n}catch{return[]}}c(Kk,"snapshotPoolerSockets");Zu.get("/diag/pg-health",async e=>{let t=await u.execute(zk`
61
61
  SELECT
62
62
  application_name,
63
63
  client_addr::text AS client_addr,
@@ -69,12 +69,12 @@ ${e}`}var XA=G(()=>{"use strict";c(GA,"resolveRuntimeWebConfig");c(Qq,"stampRunt
69
69
  WHERE datname = current_database()
70
70
  GROUP BY application_name, client_addr, state
71
71
  ORDER BY conns DESC
72
- `),n=t.reduce((s,i)=>s+i.conns,0),r=Bk(),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=Ef();return{inflight_current:s.current,inflight_peak:s.peak,inflight_shed_count:s.shedCount,inflight_max:pi(),ingest_inflight_max:wc(),ingest_shed_count:s.ingestShedCount}})()},total_backends:n,breakdown:t})});D();import{Hono as aN}from"hono";import{z as mt}from"zod";import{eq as qe,and as br,sql as bi,ilike as Yf,isNull as cN,or as Xf,desc as kv,inArray as Rv}from"drizzle-orm";import{z as tn}from"zod";var yv=["org","team","project","personal"],Lf=tn.object({name:tn.string().min(1),description:tn.string().min(1),type:tn.literal("instruction").default("instruction"),scope:tn.enum(yv),version:tn.string().min(1),tags:tn.array(tn.string()).optional(),compatibility:tn.array(tn.string()).optional(),slots:tn.record(tn.string(),tn.string()).optional(),metadata:tn.record(tn.string(),tn.unknown()).optional()});import{z as Un}from"zod";var wv=Un.object({name:Un.string().min(1),description:Un.string().min(1),type:Un.literal("prompt"),version:Un.string().min(1),tags:Un.array(Un.string()).optional(),variables:Un.array(Un.string()).optional(),metadata:Un.record(Un.string(),Un.unknown()).optional()});function Pc(e){return e<=3?"light":e<=8?"standard":"heavy"}c(Pc,"computePackTier");var Kd={claude_md:"claude_md",memory:"memory",skill_loaded:"skill"};function Mf(e,t){let n=Kd[e];return n?`${n}::${t}`:null}c(Mf,"deriveContextIdentity");function Fk(e){return(e.trim().split(`
73
- `)[0]?.replace(/^#+\s*/,"").trim()||"Suggested instruction").slice(0,120)}c(Fk,"recommendationTitle");function Wk(e){if(!e||typeof e!="object")return e;let t=e;if(Array.isArray(t.recommendation_candidates))return e;let n=t.suggestions;if(!n||typeof n!="object")return e;let r=n.claude_md_additions;return Array.isArray(r)&&(t.recommendation_candidates=r.flatMap(o=>{if(!o||typeof o!="object")return[];let s=o;if(typeof s.addition!="string"||s.addition.trim()==="")return[];let i=s.addition.trim();return[{title:Fk(i),artifact:"instruction",canonicalBody:i,rationale:typeof s.why=="string"?s.why:"",evidence:[],outcomeMetric:"session_outcome",renderings:[{harness:"claude_code",target:"CLAUDE.md",body:i},{harness:"codex",target:"AGENTS.md",body:i}]}]})),e}c(Wk,"normalizeRecommendationCandidates");function $f(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 Wk(e),e}c($f,"normalizeRecommendations");import zk from"gray-matter";import{z as vv}from"zod";var B2=vv.object({type:vv.enum(["instruction","prompt"])});function Gd(e){let{data:t,content:n}=zk(e),r=Lf.parse(t),o=r.slots??null;return{frontmatter:r,content:n.trim(),slots:o}}c(Gd,"parseInstruction");function Ii(e){return e.replace(/[\r\n]+/g," ").trim()}c(Ii,"sanitizeHeading");function qf(e,t,n){let r=e.split(`
72
+ `),n=t.reduce((s,i)=>s+i.conns,0),r=Kk(),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=kf();return{inflight_current:s.current,inflight_peak:s.peak,inflight_shed_count:s.shedCount,inflight_max:pi(),ingest_inflight_max:wc(),ingest_shed_count:s.ingestShedCount}})()},total_backends:n,breakdown:t})});O();import{Hono as fN}from"hono";import{z as pt}from"zod";import{eq as qe,and as Er,sql as Ei,ilike as ng,isNull as gN,or as rg,desc as $v,inArray as Mv}from"drizzle-orm";import{z as tn}from"zod";var Rv=["org","team","project","personal"],Bf=tn.object({name:tn.string().min(1),description:tn.string().min(1),type:tn.literal("instruction").default("instruction"),scope:tn.enum(Rv),version:tn.string().min(1),tags:tn.array(tn.string()).optional(),compatibility:tn.array(tn.string()).optional(),slots:tn.record(tn.string(),tn.string()).optional(),metadata:tn.record(tn.string(),tn.unknown()).optional()});import{z as Hn}from"zod";var Tv=Hn.object({name:Hn.string().min(1),description:Hn.string().min(1),type:Hn.literal("prompt"),version:Hn.string().min(1),tags:Hn.array(Hn.string()).optional(),variables:Hn.array(Hn.string()).optional(),metadata:Hn.record(Hn.string(),Hn.unknown()).optional()});function Pc(e){return e<=3?"light":e<=8?"standard":"heavy"}c(Pc,"computePackTier");var el={claude_md:"claude_md",memory:"memory",skill_loaded:"skill"};function Ff(e,t){let n=el[e];return n?`${n}::${t}`:null}c(Ff,"deriveContextIdentity");function Gk(e){return(e.trim().split(`
73
+ `)[0]?.replace(/^#+\s*/,"").trim()||"Suggested instruction").slice(0,120)}c(Gk,"recommendationTitle");function Yk(e){if(!e||typeof e!="object")return e;let t=e;if(Array.isArray(t.recommendation_candidates))return e;let n=t.suggestions;if(!n||typeof n!="object")return e;let r=n.claude_md_additions;return Array.isArray(r)&&(t.recommendation_candidates=r.flatMap(o=>{if(!o||typeof o!="object")return[];let s=o;if(typeof s.addition!="string"||s.addition.trim()==="")return[];let i=s.addition.trim();return[{title:Gk(i),artifact:"instruction",canonicalBody:i,rationale:typeof s.why=="string"?s.why:"",evidence:[],outcomeMetric:"session_outcome",renderings:[{harness:"claude_code",target:"CLAUDE.md",body:i},{harness:"codex",target:"AGENTS.md",body:i}]}]})),e}c(Yk,"normalizeRecommendationCandidates");function Wf(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 Xk(e),Yk(e),e}c(Wf,"normalizeRecommendations");function Xk(e){if(!e||typeof e!="object")return;let t=e;if(Array.isArray(t.recommendation_candidates)&&t.recommendation_candidates.length>0)return;let n=t.suggestions;if(!n||typeof n!="object")return;let r=n.recommendation_candidates;!Array.isArray(r)||r.length===0||(t.recommendation_candidates=r)}c(Xk,"liftNestedCandidates");import Qk from"gray-matter";import{z as kv}from"zod";var Q2=kv.object({type:kv.enum(["instruction","prompt"])});function tl(e){let{data:t,content:n}=Qk(e),r=Bf.parse(t),o=r.slots??null;return{frontmatter:r,content:n.trim(),slots:o}}c(tl,"parseInstruction");function bi(e){return e.replace(/[\r\n]+/g," ").trim()}c(bi,"sanitizeHeading");function zf(e,t,n){let r=e.split(`
74
74
  `),o=t.split(`
75
75
  `),s=n.split(`
76
- `),i=Iv(r,o),a=Iv(r,s),u=[],l=[],p=0;for(;p<r.length||i.has(p)||a.has(p);){let f=i.get(p),_=a.get(p);if(f&&_)Jk(f.newLines,_.newLines)?l.push(...f.newLines):(u.push({localLines:_.newLines,upstreamLines:f.newLines,startLine:p}),l.push("<<<<<<< local"),l.push(..._.newLines),l.push("======="),l.push(...f.newLines),l.push(">>>>>>> upstream")),i.delete(p),a.delete(p),p=Math.max(f.endBase,_.endBase);else if(f)l.push(...f.newLines),i.delete(p),p=f.endBase;else if(_)l.push(..._.newLines),a.delete(p),p=_.endBase;else if(p<r.length)l.push(r[p]),p++;else break}return{merged:l.join(`
77
- `),hasConflicts:u.length>0,conflicts:u}}c(qf,"threeWayMerge");function Iv(e,t){let n=new Map,r=Vk(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,u=[];for(;o<e.length&&(i>=r.length||e[o]!==r[i]);)o++;for(;s<t.length&&(i>=r.length||t[s]!==r[i]);)u.push(t[s]),s++;n.set(a,{newLines:u,endBase:o})}return n}c(Iv,"diffLines");function Vk(e,t){let n=e.length,r=t.length,o=Array.from({length:n+1},()=>Array(r+1).fill(0));for(let u=1;u<=n;u++)for(let l=1;l<=r;l++)o[u][l]=e[u-1]===t[l-1]?o[u-1][l-1]+1:Math.max(o[u-1][l],o[u][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}c(Vk,"computeLCS");function Jk(e,t){return e.length===t.length&&e.every((n,r)=>n===t[r])}c(Jk,"arraysEqual");var Yd=class{static{c(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 u=await i.text();throw new Error(`Anthropic API error (${i.status}): ${u}`)}let a=await i.json();return{text:a.content.filter(u=>u.type==="text").map(u=>u.text).join(""),usage:{inputTokens:a.usage.input_tokens,outputTokens:a.usage.output_tokens}}}};var Xd=class{static{c(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 u=await i.text();throw new Error(`OpenAI API error (${i.status}): ${u}`)}let a=await i.json();return{text:a.choices[0]?.message.content??"",usage:{inputTokens:a.usage.prompt_tokens,outputTokens:a.usage.completion_tokens}}}};var Kk={anthropic:c(e=>new Yd(e),"anthropic"),openai:c(e=>new Xd(e),"openai")};function Dc(e,t){let n=Kk[e];if(!n)throw new Error(`Unknown LLM provider: ${e}`);return n(t)}c(Dc,"createLLMProvider");function Oc(e,t){let n=t.map(r=>`- ID: ${r.id}
76
+ `),i=Nv(r,o),a=Nv(r,s),d=[],l=[],m=0;for(;m<r.length||i.has(m)||a.has(m);){let p=i.get(m),_=a.get(m);if(p&&_)eN(p.newLines,_.newLines)?l.push(...p.newLines):(d.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),a.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),a.delete(m),m=_.endBase;else if(m<r.length)l.push(r[m]),m++;else break}return{merged:l.join(`
77
+ `),hasConflicts:d.length>0,conflicts:d}}c(zf,"threeWayMerge");function Nv(e,t){let n=new Map,r=Zk(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,d=[];for(;o<e.length&&(i>=r.length||e[o]!==r[i]);)o++;for(;s<t.length&&(i>=r.length||t[s]!==r[i]);)d.push(t[s]),s++;n.set(a,{newLines:d,endBase:o})}return n}c(Nv,"diffLines");function Zk(e,t){let n=e.length,r=t.length,o=Array.from({length:n+1},()=>Array(r+1).fill(0));for(let d=1;d<=n;d++)for(let l=1;l<=r;l++)o[d][l]=e[d-1]===t[l-1]?o[d-1][l-1]+1:Math.max(o[d-1][l],o[d][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}c(Zk,"computeLCS");function eN(e,t){return e.length===t.length&&e.every((n,r)=>n===t[r])}c(eN,"arraysEqual");var nl=class{static{c(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 d=await i.text();throw new Error(`Anthropic API error (${i.status}): ${d}`)}let a=await i.json();return{text:a.content.filter(d=>d.type==="text").map(d=>d.text).join(""),usage:{inputTokens:a.usage.input_tokens,outputTokens:a.usage.output_tokens}}}};var rl=class{static{c(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 d=await i.text();throw new Error(`OpenAI API error (${i.status}): ${d}`)}let a=await i.json();return{text:a.choices[0]?.message.content??"",usage:{inputTokens:a.usage.prompt_tokens,outputTokens:a.usage.completion_tokens}}}};var tN={anthropic:c(e=>new nl(e),"anthropic"),openai:c(e=>new rl(e),"openai")};function Dc(e,t){let n=tN[e];if(!n)throw new Error(`Unknown LLM provider: ${e}`);return n(t)}c(Dc,"createLLMProvider");function Oc(e,t){let n=t.map(r=>`- ID: ${r.id}
78
78
  Name: ${r.name}
79
79
  Description: ${r.description}
80
80
  Tags: ${r.tags.join(", ")}
@@ -107,14 +107,14 @@ Return your response as JSON in this exact format:
107
107
  ]
108
108
  }
109
109
 
110
- Only include instructions with a relevance score >= 0.5. Order by score descending. Return valid JSON only, no markdown fences.`}c(Oc,"buildRecommendationPrompt");function Uf(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[]}}c(Uf,"parseRecommendationResponse");var bv=32e3,Gk={name:"x".repeat(64),description:"x".repeat(256),languages:["TypeScript","Python","Go"],topics:["x".repeat(32)],dependencies:["x".repeat(32)]};function Hf(e,t={}){if(e.length===0)return[];let n=t.charBudget??bv,r=Oc(Gk,[]).length,o=[],s=[],i=0;for(let a of e){let u=Yk(a);s.length>0&&r+i+u>n&&(o.push(s),s=[],i=0),s.push(a),i+=u}return s.length>0&&o.push(s),o}c(Hf,"batchCandidatesForPrompt");function Yk(e){return`- ID: ${e.id}
110
+ Only include instructions with a relevance score >= 0.5. Order by score descending. Return valid JSON only, no markdown fences.`}c(Oc,"buildRecommendationPrompt");function Vf(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[]}}c(Vf,"parseRecommendationResponse");var jv=32e3,nN={name:"x".repeat(64),description:"x".repeat(256),languages:["TypeScript","Python","Go"],topics:["x".repeat(32)],dependencies:["x".repeat(32)]};function Jf(e,t={}){if(e.length===0)return[];let n=t.charBudget??jv,r=Oc(nN,[]).length,o=[],s=[],i=0;for(let a of e){let d=rN(a);s.length>0&&r+i+d>n&&(o.push(s),s=[],i=0),s.push(a),i+=d}return s.length>0&&o.push(s),o}c(Jf,"batchCandidatesForPrompt");function rN(e){return`- ID: ${e.id}
111
111
  Name: ${e.name}
112
112
  Description: ${e.description}
113
113
  Tags: ${e.tags.join(", ")}
114
- Preview: ${e.contentPreview}`.length+2}c(Yk,"renderedSize");async function Bf(e,t,n){if(t.length===0)return{recommendations:[],error:null};let r;try{r=Dc(n.llmProvider,n.llmApiKey)}catch(a){return{recommendations:[],error:a instanceof Error?a.message:String(a)}}let o=Hf(t,{charBudget:n.charBudget}),s=[],i=[];for(let a of o)try{let u=await r.complete(Oc(e,a));s.push(...Uf(u.text))}catch(u){i.push(u instanceof Error?u.message:String(u))}return{recommendations:s,error:i.length>0?i.join("; "):null}}c(Bf,"scoreInstructions");var Xk=new Set(["127.0.0.1","localhost","::1","[::1]","0.0.0.0"]);function Qk(e){if(!e)return null;try{return new URL(e).hostname}catch{return null}}c(Qk,"databaseUrlHost");function Ff(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=Qk(e.DATABASE_URL);return n&&Xk.has(n)?{mode:"local",source:"inferred"}:{mode:"cloud",source:"default"}}c(Ff,"resolveDeployment");function Qd(e){if(!e||typeof e!="object")return null;let t=e.source;return t==="insights"||t==="evolution"?t:null}c(Qd,"readStampedSource");function Zd(e,t){let n=e.source==="insights"||e.source==="evolution"?e.source:Qd(e.frontmatter);return n||(e.createdBy&&e.createdBy===t?"user":"catalog")}c(Zd,"classifyProvenance");var Cc=["inside","outside"];function fs(e){return e.trim().toLowerCase()}c(fs,"normalizeDependencyKey");function zf(e){let t=[];if(Cc.includes(e.boundaryClass)||t.push({field:"boundaryClass",message:`must be one of ${Cc.join(" | ")}`}),!Array.isArray(e.targets)||e.targets.length===0)t.push({field:"targets",message:"a proposal that cannot name the paths it writes cannot be applied"});else{for(let o of e.targets)if(typeof o!="string"||o.trim().length===0){t.push({field:"targets",message:"target paths must be non-empty"});break}let n=e.targets.filter(o=>typeof o=="string"&&(o.startsWith("/")||/^[A-Za-z]:[\\/]/.test(o)));n.length>0&&t.push({field:"targets",message:`targets must be project-relative (absolute: ${n.join(", ")})`});let r=e.targets.filter(o=>typeof o=="string"&&o.split(/[\\/]/).includes(".."));r.length>0&&t.push({field:"targets",message:`targets must not traverse outside the project (${r.join(", ")})`})}for(let n of["requires","provides"]){let r=e[n];if(!Array.isArray(r)){t.push({field:n,message:"must be an array of dependency keys"});continue}r.some(o=>typeof o!="string"||o.trim().length===0)&&t.push({field:n,message:"dependency keys must be non-empty strings"})}return t}c(zf,"validateArtifactSpec");function Vf(e,t){let n=[],r=new Set(e.targets??[]);if(t.kind==="delete-paths"){e.boundaryClass!=="inside"&&n.push({field:"inverse",message:"deleting paths is only an inverse for `inside` artifacts; an `outside` path may hold text we did not write"}),t.paths.length===0&&n.push({field:"inverse.paths",message:"nothing to delete \u2014 this is not an inverse"});let o=t.paths.filter(s=>!r.has(s));return o.length>0&&n.push({field:"inverse.paths",message:`would delete paths the spec never declared: ${o.join(", ")}`}),n}return e.boundaryClass!=="outside"&&n.push({field:"inverse",message:"a compensation is only an inverse for `outside` artifacts; an `inside` path owes an exact undo"}),(!t.backupPath||t.backupPath.trim().length===0)&&n.push({field:"inverse.backupPath",message:"an `outside` write owes a backup"}),(!t.hashAtWrite||t.hashAtWrite.trim().length===0)&&n.push({field:"inverse.hashAtWrite",message:"without the post-write hash the undo cannot tell a drifted file from an untouched one"}),r.has(t.file)||n.push({field:"inverse.file",message:`wrote ${t.file}, which the spec did not declare as a target`}),t.kind==="remove-marked-region"?(!t.startMarker||!t.endMarker)&&n.push({field:"inverse",message:"an `outside` region needs both markers, or the undo cannot tell where our text ends"}):t.command.trim().length===0&&n.push({field:"inverse.command",message:"the exact command written is the identity of the entry; without it the undo is a search"}),n}c(Vf,"validateArtifactInverse");var Ev="artifact";function Wf(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"&&t.trim().length>0):[]}c(Wf,"stringArray");function Jf(e){if(!e||typeof e!="object")return null;let t=e[Ev];if(!t||typeof t!="object")return null;let n=t;return{boundaryClass:n.boundaryClass,targets:Wf(n.targets),requires:Wf(n.requires),provides:Wf(n.provides)}}c(Jf,"parseArtifactSpec");function Kf(e,t,n){let r=new Set((e.provides??[]).map(fs));if(r.size===0)return[];let o=[];for(let s of t){if(n&&s.id===n)continue;let i=(s.requires??[]).map(fs).filter(a=>r.has(a));i.length>0&&o.push({dependentId:s.id,dependentName:s.name,keys:i})}return o}c(Kf,"blockedWithdrawals");var el=["applied","measuring","improved","inconclusive","harmful","rollback_ready"];var Lc=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","cron_refine_cases","process_judge_review"]);function tl(e){return Lc.has(e)}c(tl,"needsLlmEngine");D();function nn(e){if(!Zs())return;let t=hm();d.insert(mo).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)})}c(nn,"trackUsage");var Zk={critical:25,high:15,medium:8,low:3},eN=[{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 Gf(e,t,n){let r=[],o=[e,t??"",n??""].join(`
115
- `);for(let i of eN){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-=Zk[i.severity]??5;return{score:Math.max(0,Math.min(100,s)),findings:r}}c(Gf,"scanContent");D();import{and as tN,arrayOverlaps as nN,eq as Sv,inArray as rN,ne as oN}from"drizzle-orm";function sN(e){return fs(`skill:${e.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}`)}c(sN,"skillKeyFor");function iN(e){let t=Jf(e.frontmatter)?.provides??[],n=new Set(t.map(fs));return e.type==="skill"&&n.add(sN(e.name)),[...n].filter(r=>r.length>0)}c(iN,"providedKeysFor");async function xv(e,t){let n=iN(t);if(n.length===0)return[];let r=await d.select({id:Re.id,name:g.name,requires:Re.requires}).from(Re).innerJoin(g,Sv(g.id,Re.instructionId)).where(tN(Sv(Re.userId,e),oN(Re.instructionId,t.id),rN(Re.status,[...el]),nN(Re.requires,n)));return Kf({provides:n},r.map(o=>({id:o.id,name:o.name,requires:o.requires??[],provides:[]})),t.id)}c(xv,"findBlockedWithdrawals");function Tv(e,t){let n=t.map(r=>`${r.dependentName} (needs ${r.keys.join(", ")})`).join("; ");return`Cannot archive ${e}: ${t.length} applied artifact${t.length===1?"":"s"} still rel${t.length===1?"ies":"y"} on it \u2014 ${n}. Remove or revert those first, or archive anyway with ?force=true.`}c(Tv,"withdrawalRefusal");var Nn=new aN,uN=mt.object({name:mt.string().min(1).max(255),description:mt.string().min(1),scope:mt.enum(["org","team","project","personal"]),scopeRef:mt.string().uuid().optional(),version:mt.string().default("1.0.0"),content:mt.string().min(1),tags:mt.array(mt.string()).optional(),compatibility:mt.array(mt.string()).optional()}),dN=mt.object({name:mt.string().min(1).max(255).optional(),description:mt.string().min(1).optional(),version:mt.string().optional(),content:mt.string().min(1).optional(),tags:mt.array(mt.string()).optional(),compatibility:mt.array(mt.string()).optional(),changeSummary:mt.string().optional()});Nn.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),u=[qe(g.archived,!1),qe(g.createdBy,t)];if(r&&u.push(qe(g.scope,r)),s&&u.push(qe(g.type,s)),n){let h=ct(n);u.push(Xf(Yf(g.name,`%${h}%`),Yf(g.description,`%${h}%`),Yf(g.content,`%${h}%`)))}let l=await d.select().from(g).where(br(...u)).orderBy(kv(g.updatedAt)).limit(i).offset(a);if(o){let h=o.split(",").map(m=>m.trim().toLowerCase());l=l.filter(m=>h.some(w=>m.tags?.some(I=>I.toLowerCase().includes(w))))}let p=l.map(h=>h.id),f=p.length>0?await d.select({instructionId:lt.instructionId,projectName:C.name,projectId:C.id}).from(lt).innerJoin(C,qe(C.id,lt.projectId)).where(bi`${lt.instructionId} IN (${bi.join(p.map(h=>bi`${h}`),bi`, `)})`):[],_=new Map;for(let h of f){let m=_.get(h.instructionId)??[];m.push({projectId:h.projectId,projectName:h.projectName}),_.set(h.instructionId,m)}let v=l.map(h=>({...h,projects:_.get(h.id)??[]}));return nn({userId:t,surface:"api",action:"list"}),e.json(v)});Nn.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(br(qe(g.contentHash,n),qe(g.createdBy,t),qe(g.archived,!1))).limit(1);return r?e.json({instruction:r}):e.json({instruction:null})});Nn.post("/instructions/by-hashes",async e=>{let t=e.get("userId"),n=await e.req.json(),r=mt.array(mt.string()).max(200).parse(n.hashes??[]),o=mt.array(mt.string()).max(200).parse(n.identities??[]);if(r.length===0&&o.length===0)return e.json({instructions:{}});let s=[qe(g.createdBy,t),qe(g.archived,!1)],i=[];r.length>0&&i.push(Rv(g.contentHash,r)),o.length>0&&i.push(Rv(g.contextIdentity,o));let a=await d.select({id:g.id,name:g.name,contextIdentity:g.contextIdentity,version:g.version,type:g.type,contentHash:g.contentHash,source:bi`${g.frontmatter}->>'source'`}).from(g).where(br(...s,i.length===1?i[0]:Xf(...i))),u={};for(let l of a)l.contentHash&&(u[l.contentHash]=l),l.contextIdentity&&(u[l.contextIdentity]=l);return e.json({instructions:u})});Nn.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,qe(y.id,se.sessionId)).where(br(qe(se.instructionId,n),qe(y.userId,t))).orderBy(kv(y.startedAt)).limit(50);return e.json({sessions:r})});Nn.get("/instructions/:id",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await d.select().from(g).where(br(qe(g.id,t),qe(g.archived,!1),Xf(qe(g.createdBy,n),qe(g.scope,"public"))));return r?(nn({instructionId:t,userId:n,surface:"api",action:"view"}),e.json(r)):e.json({error:"Instruction not found"},404)});var lN=/<\/?(?:system-reminder|system|available-deferred-tools|tool-result)>/i;function Nv(e){return lN.test(e)?"Content contains forbidden system tags":null}c(Nv,"validateNoForbiddenTags");Nn.post("/instructions",async e=>{let t=e.get("userId"),n=await e.req.json(),r=uN.parse(n),o=Nv(r.content);if(o)return e.json({error:o},422);r.name=Ii(r.name),r.description=Ii(r.description);let s={},i=null;try{let p=Gd(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,u=Gf(r.content,r.name,r.description),[l]=await d.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:u.score,scanFindings:u.findings.length>0?u.findings:null}).returning();return await d.insert(xe).values({instructionId:l.id,versionNumber:1,content:r.content,frontmatter:s,changeSummary:"Initial version",createdBy:t}),nn({instructionId:l.id,userId:t,surface:"api",action:"create"}),e.json(l,201)});Nn.put("/instructions/:id",async e=>{let t=e.req.param("id"),n=e.get("userId"),r=await e.req.json(),o=dN.parse(r);if(o.content){let f=Nv(o.content);if(f)return e.json({error:f},422)}o.name&&(o.name=Ii(o.name)),o.description&&(o.description=Ii(o.description));let[s]=await d.select().from(g).where(br(qe(g.id,t),qe(g.createdBy,n),qe(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 f=Gd(o.content);i=f.frontmatter,a=f.slots}catch{}let u={};if(o.content||o.name||o.description){let f=Gf(o.content??s.content,o.name??s.name,o.description??s.description);u.scanScore=f.score,u.scanFindings=f.findings.length>0?f.findings:null}let l,p=4;for(let f=0;f<=p;f++)try{l=await d.transaction(async _=>{await _.select({id:g.id}).from(g).where(qe(g.id,t)).for("update");let[{maxVersion:v}]=await _.select({maxVersion:bi`COALESCE(MAX(${xe.versionNumber}), 0)`}).from(xe).where(qe(xe.instructionId,t)),h=v+1,[m]=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:a,...u,updatedAt:new Date}).where(qe(g.id,t)).returning();return await _.insert(xe).values({instructionId:t,versionNumber:h,content:o.content??s.content,frontmatter:i,changeSummary:o.changeSummary??null,createdBy:n}),m});break}catch(_){if(_.cause?.code==="23505"&&f<p)continue;throw _}return l?(nn({instructionId:t,userId:n,surface:"api",action:"update"}),e.json(l)):e.json({error:"Instruction update failed"},500)});Nn.delete("/instructions/:id",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await d.select().from(g).where(br(qe(g.id,t),qe(g.createdBy,n),qe(g.archived,!1)));if(!r)return e.json({error:"Instruction not found"},404);if(e.req.query("force")!=="true"){let i=await xv(n,r);if(i.length>0)return e.json({error:Tv(r.name,i),blockedBy:i},409)}let[o]=await d.update(g).set({archived:!0,archivedAt:new Date,archivedBy:n}).where(qe(g.id,t)).returning(),s=await d.update(x).set({dismissedAt:new Date,isStale:!0}).where(br(qe(x.userId,n),qe(x.instructionId,t),cN(x.dismissedAt))).returning({id:x.id});return nn({instructionId:t,userId:n,surface:"api",action:"delete"}),e.json({...o,dismissedSuggestions:s.length})});Nn.post("/instructions/:id/restore",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await d.select().from(g).where(br(qe(g.id,t),qe(g.createdBy,n),qe(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(qe(g.id,t)).returning();return nn({instructionId:t,userId:n,surface:"api",action:"update"}),e.json(o)});Nn.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(br(qe(g.id,t),qe(g.createdBy,n)));if(!r)return e.json({error:"Instruction not found"},404);let o=await d.select().from(xe).where(qe(xe.instructionId,t)).orderBy(xe.versionNumber);return e.json(o)});D();import{Hono as pN}from"hono";import{eq as wo,and as Qf}from"drizzle-orm";var Mc=new pN;Mc.post("/instructions/:id/fork",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select().from(g).where(Qf(wo(g.id,n),wo(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(Qf(wo(g.createdBy,t),wo(g.scope,"org"),wo(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(xe).values({instructionId:o.id,versionNumber:1,content:o.content,frontmatter:o.frontmatter,changeSummary:`Forked from ${r.name}`,createdBy:t}),await d.insert(Ut).values({instructionId:o.id,eventType:"fork",actorId:t,metadata:{sourceId:r.id,sourceName:r.name,sourceVersion:r.version}}),nn({instructionId:o.id,userId:t,surface:"api",action:"fork"}),e.json(o,201)});Mc.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(Qf(wo(g.id,t),wo(g.createdBy,n)));if(!r)return e.json({error:"Instruction not found"},404);let o=await d.select().from(Ut).where(wo(Ut.instructionId,t)).orderBy(Ut.createdAt);return e.json(o)});D();import{Hono as mN}from"hono";import{eq as sr,and as jv,sql as fN}from"drizzle-orm";var $c=new mN;$c.get("/instructions/:id/upstream",async e=>{let t=e.req.param("id"),[n]=await d.select().from(g).where(jv(sr(g.id,t),sr(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(sr(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})});$c.post("/instructions/:id/pull-upstream",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select().from(g).where(jv(sr(g.id,n),sr(g.createdBy,t),sr(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(sr(g.id,r.forkedFromId));if(!o)return e.json({error:"Parent instruction no longer exists"},404);let[s]=await d.select().from(xe).where(sr(xe.instructionId,o.id)).orderBy(xe.versionNumber).limit(1),i=s?.content??o.content,a=qf(i,o.content,r.content);if(a.hasConflicts)return e.json({hasConflicts:!0,merged:a.merged,conflicts:a.conflicts});let u,l=4;for(let p=0;p<=l;p++)try{u=await d.transaction(async f=>{await f.select({id:g.id}).from(g).where(sr(g.id,n)).for("update");let[_]=await f.select({maxVersion:fN`COALESCE(MAX(${xe.versionNumber}), 0)`}).from(xe).where(sr(xe.instructionId,n)),v=(_?.maxVersion??0)+1,[h]=await f.update(g).set({content:a.merged,upstreamVersion:o.version,updatedAt:new Date}).where(sr(g.id,n)).returning();return await f.insert(xe).values({instructionId:n,versionNumber:v,content:a.merged,frontmatter:r.frontmatter,changeSummary:`Pulled upstream changes from ${o.name} (${o.version})`,createdBy:t}),await f.insert(Ut).values({instructionId:n,eventType:"pull_upstream",actorId:t,metadata:{parentId:o.id,parentVersion:o.version,previousUpstreamVersion:r.upstreamVersion}}),h});break}catch(f){if(f.cause?.code==="23505"&&p<l)continue;throw f}return u?(nn({instructionId:n,userId:t,surface:"api",action:"pull_upstream"}),e.json({hasConflicts:!1,instruction:u})):e.json({error:"Pull-upstream failed after version conflict"},500)});D();import{Hono as gN}from"hono";import{z as vo}from"zod";import{eq as Bt,and as gs,sql as hN}from"drizzle-orm";var _N=vo.object({scope:vo.enum(["team","org"]),scopeRef:vo.string().uuid()}),qc=new gN;qc.post("/instructions/:id/promote",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=_N.parse(await e.req.json()),[o]=await d.select().from(g).where(gs(Bt(g.id,n),Bt(g.createdBy,t),Bt(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[u]=await d.select().from(we).where(gs(Bt(we.userId,t),Bt(we.teamId,r.scopeRef)));if(!u)return e.json({error:"You are not a member of this team"},403)}else if(r.scope==="org"){let[u]=await d.select().from(ee).where(gs(Bt(ee.userId,t),Bt(ee.orgId,r.scopeRef)));if(!u||u.role!=="admin"&&u.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 d.update(g).set({scope:r.scope,scopeRef:r.scopeRef,updatedAt:new Date}).where(Bt(g.id,n)).returning();return await d.insert(Ut).values({instructionId:n,eventType:"promote",actorId:t,metadata:{fromScope:s,fromScopeRef:i,toScope:r.scope,toScopeRef:r.scopeRef}}),nn({instructionId:n,userId:t,surface:"api",action:"promote"}),e.json(a)});var yN=vo.object({targetScope:vo.enum(["personal","team","org"]),targetScopeRef:vo.string().uuid().optional(),name:vo.string().optional(),seedEvalTarget:vo.boolean().optional()});async function wN(e){let[t]=await d.select({id:k.id}).from(k).where(hN`${k.metadata}->>'instructionId' = ${e}`).limit(1);return t??null}c(wN,"findExistingEvalTarget");qc.post("/instructions/:id/promote-from-public",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=yN.parse(await e.req.json()),[o]=await d.select().from(g).where(gs(Bt(g.id,n),Bt(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[f]=await d.select().from(we).where(gs(Bt(we.userId,t),Bt(we.teamId,r.targetScopeRef)));if(!f)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[f]=await d.select().from(ee).where(gs(Bt(ee.userId,t),Bt(ee.orgId,r.targetScopeRef)));if(!f||f.role!=="admin"&&f.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"),[u]=await d.select().from(g).where(gs(Bt(g.scope,r.targetScope),Bt(g.scopeRef,s),Bt(g.forkedFromId,n),Bt(g.archived,!1)));if(u){let f=null;return a&&(f=(await wN(u.id))?.id??null),e.json({instructionId:u.id,alreadyExisted:!0,evalTargetId:f})}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(xe).values({instructionId:l.id,versionNumber:1,content:o.content,frontmatter:o.frontmatter,changeSummary:`Promoted from public skill ${o.name}`,createdBy:t}),await d.insert(Ut).values({instructionId:l.id,eventType:"promote_from_public",actorId:t,metadata:{sourceInstructionId:o.id,sourceName:o.name,targetScope:r.targetScope,targetScopeRef:s}}),nn({instructionId:l.id,userId:t,surface:"api",action:"promote_from_public"});let p=null;if(a){let[f]=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});p=f?.id??null}return e.json({instructionId:l.id,alreadyExisted:!1,evalTargetId:p})});D();import{Hono as vN}from"hono";import{z as Pv}from"zod";import{eq as jn,and as Uc,or as Dv,inArray as Ov,sql as nl,desc as IN}from"drizzle-orm";var Hc=new vN,bN=Pv.object({badge:Pv.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),u=parseInt(e.req.query("offset")??"0",10),l=Math.min(Math.max(a,1),200),p=Math.max(u,0),f=await d.select({orgId:ee.orgId}).from(ee).where(jn(ee.userId,t)),_=await d.select({teamId:we.teamId}).from(we).where(jn(we.userId,t)),v=f.map(S=>S.orgId).filter(S=>S!==null),h=_.map(S=>S.teamId).filter(S=>S!==null),m=[jn(g.archived,!1)],w=[jn(g.scope,"public")];if(v.length>0&&w.push(Uc(jn(g.scope,"org"),Ov(g.scopeRef,v))),h.length>0&&w.push(Uc(jn(g.scope,"team"),Ov(g.scopeRef,h))),m.push(Dv(...w)),n&&m.push(jn(g.badge,n)),r&&m.push(jn(g.scope,r)),o){let S=ct(o);m.push(Dv(nl`${g.name} ILIKE ${`%${S}%`}`,nl`${g.description} ILIKE ${`%${S}%`}`))}let I=[IN(nl`COALESCE(${g.sourceUpdatedAt}, ${g.updatedAt})`)],b={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},E=await(i>0?Fe:d).select(i>0?{...b,contentPreview:nl`left(${g.content}, ${i})`}:b).from(g).where(Uc(...m)).orderBy(...I).limit(l).offset(p);return nn({userId:t,surface:"api",action:"search",metadata:o?{query:o}:void 0}),e.header("Cache-Control","private, max-age=30"),e.json(E)});Hc.post("/instructions/:id/badge",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=bN.parse(await e.req.json()),[o]=await d.select().from(g).where(Uc(jn(g.id,n),jn(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(ee).where(Uc(jn(ee.userId,t),jn(ee.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 d.update(g).set({badge:r.badge,updatedAt:new Date}).where(jn(g.id,n)).returning(),u=r.badge?"badge_set":"badge_removed";return await d.insert(Ut).values({instructionId:n,eventType:u,actorId:t,metadata:{badge:r.badge}}),e.json(a)});D();import{Hono as EN}from"hono";import{eq as Io,and as rl,or as AN,inArray as Cv}from"drizzle-orm";var ol=new EN;ol.post("/projects/:id/recommendations",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select().from(C).where(rl(Io(C.id,n),Io(C.createdBy,t)));if(!r)return e.json({error:"Project not found"},404);let o=await d.select({orgId:ee.orgId}).from(ee).where(Io(ee.userId,t)),s=await d.select({teamId:we.teamId}).from(we).where(Io(we.userId,t)),i=o.map(m=>m.orgId).filter(m=>m!==null),a=s.map(m=>m.teamId).filter(m=>m!==null),u=[Io(g.scope,"public")];i.length>0&&u.push(rl(Io(g.scope,"org"),Cv(g.scopeRef,i))),a.length>0&&u.push(rl(Io(g.scope,"team"),Cv(g.scopeRef,a)));let l=await d.select().from(g).where(rl(Io(g.archived,!1),AN(...u))).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 m=r.githubRepo.replace("https://github.com/",""),[w,I]=await Promise.all([fetch(`https://api.github.com/repos/${m}`,{headers:{Accept:"application/vnd.github.v3+json","User-Agent":"RuleMetric"}}),fetch(`https://api.github.com/repos/${m}/languages`,{headers:{Accept:"application/vnd.github.v3+json","User-Agent":"RuleMetric"}})]);if(w.ok){let b=await w.json();p.topics=b.topics??[]}if(I.ok){let b=await I.json();p.languages=Object.keys(b)}}catch{}let f=l.map(m=>({id:m.id,name:m.name,description:m.description??"",tags:m.tags??[],contentPreview:(m.content??"").slice(0,400)})),_=process.env.LLM_PROVIDER,v=process.env.LLM_API_KEY;if(!_||!v)return e.json({recommendations:[],error:"LLM not configured"});let h=await Bf(p,f,{llmProvider:_,llmApiKey:v});return e.json(h)});import{Hono as Aj}from"hono";D();import{Hono as ej}from"hono";import{z as bg}from"zod";import{eq as Et,and as Yc,desc as rI,sql as cr,inArray as tj}from"drizzle-orm";D();import{and as LN,eq as yg,sql as MN}from"drizzle-orm";function Zf(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 u=1;u<=s;u++)i*=(o-u+1)/u,a+=i;return{pValue:Math.min(1,2*a),nDiscordant:o}}c(Zf,"mcnemarExact");function sl(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)}}}c(sl,"assessSufficiency");var bo=1.959963984540054;function il(e,t,n=bo){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)}}c(il,"wilsonInterval");function Ai(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}}c(Ai,"seededRandom");function Ei(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])}c(Ei,"sortedQuantile");function eg(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=Ai(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 f=0;f<n;f++)p+=e[s()*n|0];a[l]=p/n}a.sort((l,p)=>l-p);let u=(1-o)/2;return{estimate:i,lower:Ei(a,u),upper:Ei(a,1-u),iterations:r}}c(eg,"pairedBootstrapCI");function tg(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=Ai(n.seed??1),i=c(v=>v.reduce((h,m)=>h+m,0)/v.length,"mean"),a=i(e)-i(t),u=new Array(r),l=0,p=0;for(let v=0;v<r;v++){let h=0;for(let I=0;I<e.length;I++)h+=e[s()*e.length|0];let m=0;for(let I=0;I<t.length;I++)m+=t[s()*t.length|0];let w=h/e.length-m/t.length;u[v]=w,w<=0&&l++,w>=0&&p++}u.sort((v,h)=>v-h);let f=(1-o)/2,_=Math.min(1,2*Math.min(l,p)/r);return{estimate:a,lower:Ei(u,f),upper:Ei(u,1-f),pValue:_,iterations:r}}c(tg,"twoSampleBootstrapCI");function ng(e,t={}){let n=e.filter(m=>m.withScores.length>0&&m.withoutScores.length>0);if(n.length===0)return{estimate:0,lower:0,upper:0,pValue:1,iterations:0};let r=c(m=>m.reduce((w,I)=>w+I,0)/m.length,"mean"),o=n.map(m=>m.withScores.length*m.withoutScores.length/(m.withScores.length+m.withoutScores.length)),s=o.reduce((m,w)=>m+w,0),i=c(m=>m.reduce((w,I,b)=>w+o[b]*I,0)/s,"combine"),a=i(n.map(m=>r(m.withScores)-r(m.withoutScores))),u=t.iterations??1e4,l=t.ciLevel??.95,p=Ai(t.seed??1),f=new Array(u),_=0,v=0;for(let m=0;m<u;m++){let w=n.map(b=>{let A=0;for(let S=0;S<b.withScores.length;S++)A+=b.withScores[p()*b.withScores.length|0];let E=0;for(let S=0;S<b.withoutScores.length;S++)E+=b.withoutScores[p()*b.withoutScores.length|0];return A/b.withScores.length-E/b.withoutScores.length}),I=i(w);f[m]=I,I<=0&&_++,I>=0&&v++}f.sort((m,w)=>m-w);let h=(1-l)/2;return{estimate:a,lower:Ei(f,h),upper:Ei(f,1-h),pValue:Math.min(1,2*Math.min(_,v)/u),iterations:u}}c(ng,"stratifiedBootstrapCI");function rg(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,m=e[v]-o;s+=h*m,i+=h*h,a+=m*m}if(i===0)return{adjusted:[...e],theta:0,varianceReduction:0};let u=s/i,l=e.map((v,h)=>v-u*(t[h]-r)),p=0,f=l.reduce((v,h)=>v+h,0)/n;for(let v of l)p+=(v-f)*(v-f);let _=a===0?0:1-p/a;return{adjusted:l,theta:u,varianceReduction:_}}c(rg,"cupedAdjust");function og(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}})}c(og,"diagnoseAssertions");function sg(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,u=null;if(i>0&&a>0&&a/i>=r){let l=n>0?` (${n} with no baseline cohort)`:"";u=`${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:u}}c(sg,"summarizeDiscrimination");function al(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 f=i;f<=l;f++)o[f].exposed&&(s+=p);i=l+1}let u=(s-n*(n+1)/2)/(n*r);return Math.abs(u-.5)}c(al,"cohortTimeSeparation");var hs=.35,cl=900*1e3;function ig(e,t,n=hs,r=cl){if(e.length===0||t.length===0)return!1;let o=[...e,...t];return Math.max(...o)-Math.min(...o)<r?!1:al(e,t)>n}c(ig,"isTimeSeparated");var Lv=c(e=>e===0||e===1,"isBinary");function Mv(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}c(Mv,"meanPairDelta");function ul(e,t={}){let n=t.baseline??"no-rule",r=t.minN??10,o=e.length,s=e.map(m=>m.withScore-m.withoutScore),i=o===0?0:s.reduce((m,w)=>m+w,0)/o,a=eg(s,{seed:t.seed,iterations:t.iterations}),u={lower:a.lower,upper:a.upper},l=e.every(m=>Lv(m.withScore)&&Lv(m.withoutScore)),p=null;if(l&&o>0){let m=0,w=0;for(let I of e)I.withScore===1&&I.withoutScore===0?m++:I.withScore===0&&I.withoutScore===1&&w++;p=Zf(m,w).pValue}let{sufficient:f}=sl(o,o,r),_=u.lower>0||u.upper<0,h={mode:"controlled",baseline:n,delta:i,ci:u,pValue:p,significant:f&&_,sufficient:f,nWith:o,nWithout:o,costDelta:Mv(e,"withCost","withoutCost"),latencyDelta:Mv(e,"withLatency","withoutLatency"),confounded:!1};return f||(h.insufficientReason=`insufficient data: need >= ${r} paired tasks per cohort, have ${o}`),h}c(ul,"buildControlledVerdict");var SN=2;function dl(e,t,n={}){let r=n.minN??10,o=e.length,s=t.length,i=e.map(b=>b.score),a=t.map(b=>b.score),u=[...e,...t],l=u.length>0&&u.every(b=>typeof b.covariate=="number");if(l){let{adjusted:b}=rg(u.map(A=>A.score),u.map(A=>A.covariate));i=b.slice(0,o),a=b.slice(o)}let p=tg(i,a,{seed:n.seed,iterations:n.iterations}),f={lower:p.lower,upper:p.upper},_=p.estimate,v=o>0&&s>0?p.pValue:null,{sufficient:h}=sl(o,s,r),m=h&&(f.lower>0||f.upper<0),w=c(b=>{if(o===0||s===0||!e.every(S=>b(S)!=null)||!t.every(S=>b(S)!=null))return null;let A=e.reduce((S,R)=>S+b(R),0)/o,E=t.reduce((S,R)=>S+b(R),0)/s;return A-E},"meanDiff"),I={mode:"observational",baseline:n.baseline??"no-rule",delta:_,ci:f,pValue:v,significant:m,sufficient:h,nWith:o,nWithout:s,costDelta:w(b=>b.cost),latencyDelta:w(b=>b.latency),confounded:!0,cupedApplied:l};return h||(I.insufficientReason=`insufficient data: need >= ${r} sessions per cohort, have ${o} exposed / ${s} unexposed`),I}c(dl,"buildObservationalVerdict");function Pn(e,t={}){let n=t.minN??10,r=t.minPerStratum??SN,o=t.maxTimeSeparation??hs,s=t.minStratumSpanMs??cl,i=e.filter(R=>R.withScores.length>=r&&R.withoutScores.length>=r),a=i.filter(R=>R.withTimes!=null&&R.withoutTimes!=null&&ig(R.withTimes,R.withoutTimes,o,s)),u=new Set(a.map(R=>R.key)),l=i.filter(R=>!u.has(R.key)),p=e.filter(R=>R.withScores.length>0&&R.withoutScores.length>0&&(R.withScores.length<r||R.withoutScores.length<r)).length,f=l.reduce((R,O)=>R+O.withScores.length,0),_=l.reduce((R,O)=>R+O.withoutScores.length,0),v=ng(l,{seed:t.seed,iterations:t.iterations}),h={lower:v.lower,upper:v.upper},m=v.estimate,w=l.length>0&&f>=n&&_>=n,I=l.length>0?v.pValue:null,b=w&&(h.lower>0||h.upper<0),A=e.reduce((R,O)=>R+O.withScores.length+O.withoutScores.length,0),E=A>0?(f+_)/A:0,S={mode:"observational",baseline:t.baseline??"no-rule",delta:m,ci:h,pValue:I,significant:b,sufficient:w,nWith:f,nWithout:_,costDelta:null,latencyDelta:null,confounded:!0,strata:l.length,strataDroppedForTimeSeparation:a.length,coverage:E};if(!w){let R=p>0?` (${p} project(s) had both cohorts but fewer than ${r} sessions in one of them)`:"",O=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`:"";S.insufficientReason=l.length===0?a.length>0?`insufficient data: no comparable cohort.${O}${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 ${f} exposed / ${_} unexposed${R}${O?`.${O}`:""}`}return S}c(Pn,"buildStratifiedVerdict");function ag(e,t,n={}){return{overall:Pn(e,n),segments:ll(t,n)}}c(ag,"buildSegmentedVerdict");function ll(e,t={}){return e.map(n=>({segment:n.segment,verdict:Pn(n.strata,t)}))}c(ll,"buildSegmentVerdicts");function _s(e){return e.sufficient?e.significant?e.delta<0?"harmful":"helpful":"neutral":"insufficient"}c(_s,"classifyEffect");var Si={achieved:1,fully_achieved:1,mostly_achieved:.75,partially_achieved:.5,unclear_from_transcript:.25,not_achieved:0,abandoned:0},ys=c(e=>{let t=e?Si[e]:void 0;return t===void 0?null:t},"scoreOutcome");var xi=10,pl=c(e=>e.length===0?0:e.reduce((t,n)=>t+n,0)/e.length,"mean"),cg=c(e=>{if(e.length<2)return 0;let t=pl(e);return e.reduce((n,r)=>n+(r-t)**2,0)/(e.length-1)},"sampleVar"),$v=c((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,f)=>l+t[f]*p,0)/n,i=n-r/n,u=(i>0?e.reduce((l,p,f)=>l+t[f]*(p-s)**2,0)/i:0)*r/(n*n);return{mean:s,varOfMean:u,nEff:o}},"weightedStats");function ug(e,t,n={}){let r=n.minAnchors??xi,o=n.z??bo,s=e.length,i=t.length,a=[...e,...t.map(E=>E.judge)],u=pl(a),l=t.map(E=>E.weight??1),p=t.map(E=>E.human-E.judge),f=$v(p,l),_=f.mean,v=i>0?f.nEff:0,h=t.filter(E=>E.validated!==!1).length;if(n.pooledRectifier){let E=n.pooledRectifier,S=s>0?e:t.map(q=>q.judge);if(S.length===0)return{estimate:NaN,ci:{lower:NaN,upper:NaN},se:1/0,naive:u,rectifier:E.rectifier,nLabeled:i,nUnlabeled:s,nEffective:v,nValidated:h,sufficient:!1,insufficientReason:"no judge scores to correct with the pooled rectifier"};let R=pl(S)+E.rectifier,O=cg(S)/S.length+E.variance,W=Math.sqrt(O),N={estimate:R,ci:{lower:R-o*W,upper:R+o*W},se:W,naive:u,rectifier:E.rectifier,nLabeled:i,nUnlabeled:s,nEffective:v,nValidated:h,sufficient:E.sufficient};return E.sufficient||(N.insufficientReason="pooled rectifier not yet adequate"),N}let m,w;if(i===0)m=u,w=a.length>0?cg(a)/a.length:0;else if(s===0){let E=$v(t.map(S=>S.human),l);m=E.mean,w=E.varOfMean}else m=pl(e)+_,w=cg(e)/s+f.varOfMean;let I=Math.sqrt(w),b=h>=r,A={estimate:m,ci:{lower:m-o*I,upper:m+o*I},se:I,naive:u,rectifier:_,nLabeled:i,nUnlabeled:s,nEffective:v,nValidated:h,sufficient:b};if(!b){let E=i-h;A.insufficientReason=`insufficient anchors: need >= ${r} VALIDATED human-labeled items, have ${h}${E>0?` (+${E} passive, which don't count toward the floor)`:""}`}return A}c(ug,"ppiMeanEstimate");function Bc(e,t,n={}){let r=ug(e.unlabeledJudge,e.labeled,{...n,pooledRectifier:n.withPooledRectifier}),o=ug(t.unlabeledJudge,t.labeled,{...n,pooledRectifier:n.withoutPooledRectifier}),s=n.z??bo,i=r.estimate-o.estimate,a=Math.sqrt(r.se**2+o.se**2),u={lower:i-s*a,upper:i+s*a},l=r.sufficient&&o.sufficient,p=l&&(u.lower>0||u.upper<0),f={delta:i,ci:u,se:a,with:r,without:o,sufficient:l,significant:p};return l||(f.insufficientReason=r.insufficientReason??o.insufficientReason),f}c(Bc,"ppiDifference");var Ti=50,Hv=.2,Bv=.8416212335729143,xN=c(e=>e.length===0?0:e.reduce((t,n)=>t+n,0)/e.length,"mean"),Fc=c(e=>{if(e.length<2)return 0;let t=xN(e);return e.reduce((n,r)=>n+(r-t)**2,0)/(e.length-1)},"sampleVar");function qv(e,t){let n=e.labeled.length,r=e.unlabeledJudge.length;return n>0&&r>0?{fixed:Fc(e.unlabeledJudge)/r,scaling:Fc(e.labeled.map(o=>o.human-o.judge)),n}:n>0?{fixed:0,scaling:Fc(e.labeled.map(o=>o.human)),n}:{fixed:r>0?Fc(e.unlabeledJudge)/r:0,scaling:t.labeled.length>0?Fc(t.labeled.map(o=>o.human-o.judge)):null,n:0}}c(qv,"varianceComponents");var Uv=1e6;function TN(e,t){if(e.some(s=>s.scaling===null))return null;let n=c(s=>e.reduce((i,a)=>i+a.fixed+(a.scaling===0?0:a.scaling/(a.n+s)),0),"se2");if(n(Uv)>t)return null;let r=0,o=Uv;for(;r<o;){let s=Math.floor((r+o)/2);n(s)<=t?o=s:r=s+1}return r}c(TN,"solvePerCohortIncrement");function dg(e,t,n={}){let r=n.pilotTarget??Ti,o=n.targetEffect??Hv,s=n.minAnchors??xi,i=n.z??bo,a=n.zPower??Bv,u=i+a,l=c(K=>(K*100).toFixed(0),"pp"),p=e.labeled.length,f=t.labeled.length,_=n.humanLabeledRuns??p+f,v=e.unlabeledJudge.length+p+t.unlabeledJudge.length+f,h={nAnchors:_,nAnchorsWith:p,nAnchorsWithout:f,pilotTarget:r,pilotMet:_>=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 m=Bc(e,t,{minAnchors:s,z:i,withPooledRectifier:n.pool?.withPooledRectifier,withoutPooledRectifier:n.pool?.withoutPooledRectifier}).se,w=u*m,I=e.unlabeledJudge.length+p,b=t.unlabeledJudge.length+f,A=Math.min(I,b)<s,E=!Number.isFinite(m)||m<=0,S=A,R=!S&&w<=o,O=`(${I} with / ${b} without, minimum ${s} per cohort)`,W=E?`sample too thin to estimate a variance ${O} \u2014 no variance in it at all, so the estimate has no spread to be precise about; this is missing data, not power`:`sample too thin to claim precision ${O} \u2014 an MDE of \xB1${l(w)}pp estimated from this few runs is an artefact of the sample size, not power`;if(n.pool){let{totalAnchors:K,targets:me}=n.pool,B=K>=r,he=me>=3,P=B&&he&&R,re=[];return he||re.push(`pool spans ${me}/3 same-judge targets \u2014 between-target variance is assumed, not measured`),B||re.push(`pool floor not met: ${K}/${r} human-labeled runs across the same-judge pool`),S?re.push(W):R||re.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:m,mde:w,powered:R,adequate:P,reasons:re,additionalAnchorsNeeded:B?null:r-K,pooled:!0,poolAnchors:K,poolTargets:me}}let N=p>=s,q=f>=s,U=h.pilotMet&&N&&q&&R,H,te=0;if(!R){let K=(o/u)**2,me=TN([qv(e,t),qv(t,e)],K);te=me===null?null:2*me}if(!h.pilotMet)H=r-_;else if(te===null)H=null;else{let K=Math.max(0,s-p)+Math.max(0,s-f);H=Math.max(K,te)}let de=[];if(h.pilotMet||de.push(`pilot target not met: ${_}/${r} human-labeled runs`),N||de.push(`with-target cohort has ${p}/${s} labeled runs (minimum for a corrected estimate)`),q||de.push(`without-target cohort has ${f}/${s} labeled runs (minimum for a corrected estimate)`),S)de.push(W);else if(!R){let K=te===null?" \u2014 anchors alone cannot reach it; more graded runs are needed":h.pilotMet&&te>0?` \u2014 ~${te} more labeled runs projected to reach it`:"";de.push(`MDE \xB1${l(w)}pp exceeds the \xB1${l(o)}pp target effect${K}`)}return{...h,seDelta:m,mde:w,powered:R,adequate:U,reasons:de,additionalAnchorsNeeded:H}}c(dg,"anchorPowerCheck");function lg(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}}c(lg,"localOnly");function ml(e,t,n={}){let r=n.maxI2??.6,o=[e,...t].filter(H=>H.n>=1&&Number.isFinite(H.variance)&&H.variance>=0),s=o.length;if(s<2)return e.n<1||!Number.isFinite(e.variance)?lg(e,{rectifierUsed:NaN,variance:1/0,reason:"no anchors on this target and none to pool from"}):lg(e,{reason:"only one target with anchors \u2014 nothing to pool"});let i=o.map(H=>H.variance).filter(H=>H>0),a=i.length?i.reduce((H,te)=>H+te,0)/i.length:0,u=Math.max(a*.001,1e-12),l=c(H=>Math.max(H,u),"flooredVar"),p=o.map(H=>1/l(H.variance)),f=p.reduce((H,te)=>H+te,0),_=p.reduce((H,te)=>H+te*te,0),v=o.reduce((H,te,de)=>H+p[de]*te.rectifier,0)/f,h=o.reduce((H,te,de)=>H+p[de]*(te.rectifier-v)**2,0),m=s-1,w=f-_/f,I=w>0?Math.max(0,(h-m)/w):0,b=h>0?Math.max(0,(h-m)/h):0,A=o.map(H=>1/(l(H.variance)+I)),E=A.reduce((H,te)=>H+te,0),S=o.reduce((H,te,de)=>H+A[de]*te.rectifier,0)/E,R=1/E,O=s<3;if(b>r)return e.n>=1&&Number.isFinite(e.variance)?lg(e,{pooled:S,pooledVariance:R,tau2:I,i2:b,k:s,assumedExchangeability:O,reason:`heterogeneity too high (I\xB2=${(b*100).toFixed(0)}%) \u2014 targets disagree; not pooling`}):{rectifierUsed:S,variance:R,lambda:1,pooled:S,pooledVariance:R,tau2:I,i2:b,k:s,pooledApplied:!1,assumedExchangeability:O,reason:`no anchors on this target; pooled estimate is high-heterogeneity (I\xB2=${(b*100).toFixed(0)}%) \u2014 treat as unknown`};let W=e.n<1||!Number.isFinite(e.variance),N=W?1:l(e.variance)/(l(e.variance)+I),q=W?S:N*S+(1-N)*e.rectifier,U=W?R+I:(1-N)*e.variance+N*N*R;return{rectifierUsed:q,variance:U,lambda:N,pooled:S,pooledVariance:R,tau2:I,i2:b,k:s,pooledApplied:!0,assumedExchangeability:O}}c(ml,"shrinkRectifier");var Ri=3,zc=7,pg="(preamble)",PN=/^\s*(`{3,}|~{3,})/,DN=/^(#{1,6})\s+(.*)$/;function Wc(e){let t=e.split(`
116
- `),n=[],r=[],o={heading:"",level:0,path:[pg],body:[]},s=null,i=c(()=>{n.push({heading:o.heading,level:o.level,path:o.path,body:o.body.join(`
117
- `).trim()})},"flush");for(let a of t){let u=PN.exec(a);if(u){let p=u[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=DN.exec(a);if(l){i();let p=l[1].length,f=l[2].trim();r.length=Math.max(0,p-1),r[p-1]=f,o={heading:f,level:p,path:Array.from({length:p},(_,v)=>r[v]??`(unnamed level ${v+1})`),body:[]};continue}o.body.push(a)}return i(),n.filter((a,u)=>!(u===0&&a.level===0&&a.body===""))}c(Wc,"splitMarkdownSections");function fl(e){let t=new Map,n=new Map;for(let r of e){let o=r.level===0?pg:r.path.join(" > "),s=(t.get(o)??0)+1;t.set(o,s),n.set(s===1?o:`${o} #${s}`,r)}return n}c(fl,"sectionKeys");function mg(e,t){let n=fl(Wc(e)),r=fl(Wc(t)),o=[],s=[],i=[];for(let[a,u]of r){let l=n.get(a);l?l.body!==u.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()}}c(mg,"diffSections");function fg(e){return[...new Set([...e.changed,...e.added,...e.removed])].sort()}c(fg,"touchedSections");var Fv=c(e=>e.trim().toLowerCase(),"normalize");function Wv(e,t,n){if(n.length===0)return[];let r=new Set(n.map(Fv)),o=mg(e,t),s=new Set(fg(o)),i=new Map([...fl(Wc(e)),...fl(Wc(t))]),a=[];for(let u of s){let l=i.get(u);(l?l.path:u.split(" > ")).some(f=>r.has(Fv(f)))&&a.push(u)}return a.sort()}c(Wv,"protectedViolations");function gg(e){let{verdict:t,canaryGreen:n,adequate:r,adequacyReasons:o=[],promotionsInWindow:s,maxPromotionsPerWindow:i=Ri,immutableSections:a=[],beforeContent:u,afterContent:l,measurementMatchesPredecessor:p}=e,f=fg(mg(u,l)),_=_s(t),v=[];if(u===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 I=o.length>0?`: ${o.join("; ")}`:"";v.push(`verdict is not adequately powered${I}`)}s>=i&&v.push(`change budget exhausted: ${s}/${i} promotions already made in the current window`);let h=Wv(u,l,a);if(h.length>0&&v.push(`proposal edits protected section(s): ${h.join(", ")}`),_==="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:_,touched:f};let m=c(I=>`${I>=0?"+":""}${(I*100).toFixed(1)}pp`,"pp"),w=`[${m(t.ci.lower)}, ${m(t.ci.upper)}]`;return _==="helpful"?{decision:"promote",refusals:[],rationale:`promote: ${m(t.delta)} CI ${w} over the prior version, n=${t.nWith} paired cases`,effect:_,touched:f}:_==="harmful"?{decision:"revert",refusals:[],rationale:`revert: proposal measured WORSE than its predecessor, ${m(t.delta)} CI ${w}`,effect:_,touched:f}:{decision:"revert",refusals:[],rationale:`revert: no detectable improvement, ${m(t.delta)} CI ${w} spans zero`,effect:_,touched:f}}c(gg,"evaluatePromotion");async function Jc(e,t){let[n]=await d.select({id:$.id,instructionId:$.instructionId,projectPath:$.projectPath,status:$.status,contentHash:$.contentHash}).from($).where(LN(yg($.id,e),yg($.userId,t)));if(!n)return null;let r=!1;if(n.contentHash){let{instructionContentHash:h}=await Promise.resolve().then(()=>(ws(),Gv)),[m]=await d.select({content:g.content,name:g.name}).from(g).where(yg(g.id,n.instructionId));r=h(m?.content,m?.name)!==n.contentHash}let o=await d.execute(MN`
114
+ Preview: ${e.contentPreview}`.length+2}c(rN,"renderedSize");async function Kf(e,t,n){if(t.length===0)return{recommendations:[],error:null};let r;try{r=Dc(n.llmProvider,n.llmApiKey)}catch(a){return{recommendations:[],error:a instanceof Error?a.message:String(a)}}let o=Jf(t,{charBudget:n.charBudget}),s=[],i=[];for(let a of o)try{let d=await r.complete(Oc(e,a));s.push(...Vf(d.text))}catch(d){i.push(d instanceof Error?d.message:String(d))}return{recommendations:s,error:i.length>0?i.join("; "):null}}c(Kf,"scoreInstructions");var oN=new Set(["127.0.0.1","localhost","::1","[::1]","0.0.0.0"]);function sN(e){if(!e)return null;try{return new URL(e).hostname}catch{return null}}c(sN,"databaseUrlHost");function Gf(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=sN(e.DATABASE_URL);return n&&oN.has(n)?{mode:"local",source:"inferred"}:{mode:"cloud",source:"default"}}c(Gf,"resolveDeployment");function ol(e){if(!e||typeof e!="object")return null;let t=e.source;return t==="insights"||t==="evolution"?t:null}c(ol,"readStampedSource");function sl(e,t){let n=e.source==="insights"||e.source==="evolution"?e.source:ol(e.frontmatter);return n||(e.createdBy&&e.createdBy===t?"user":"catalog")}c(sl,"classifyProvenance");var Cc=["inside","outside"];function gs(e){return e.trim().toLowerCase()}c(gs,"normalizeDependencyKey");function Xf(e){let t=[];if(Cc.includes(e.boundaryClass)||t.push({field:"boundaryClass",message:`must be one of ${Cc.join(" | ")}`}),!Array.isArray(e.targets)||e.targets.length===0)t.push({field:"targets",message:"a proposal that cannot name the paths it writes cannot be applied"});else{for(let o of e.targets)if(typeof o!="string"||o.trim().length===0){t.push({field:"targets",message:"target paths must be non-empty"});break}let n=e.targets.filter(o=>typeof o=="string"&&(o.startsWith("/")||/^[A-Za-z]:[\\/]/.test(o)));n.length>0&&t.push({field:"targets",message:`targets must be project-relative (absolute: ${n.join(", ")})`});let r=e.targets.filter(o=>typeof o=="string"&&o.split(/[\\/]/).includes(".."));r.length>0&&t.push({field:"targets",message:`targets must not traverse outside the project (${r.join(", ")})`})}for(let n of["requires","provides"]){let r=e[n];if(!Array.isArray(r)){t.push({field:n,message:"must be an array of dependency keys"});continue}r.some(o=>typeof o!="string"||o.trim().length===0)&&t.push({field:n,message:"dependency keys must be non-empty strings"})}return t}c(Xf,"validateArtifactSpec");function Qf(e,t){let n=[],r=new Set(e.targets??[]);if(t.kind==="delete-paths"){e.boundaryClass!=="inside"&&n.push({field:"inverse",message:"deleting paths is only an inverse for `inside` artifacts; an `outside` path may hold text we did not write"}),t.paths.length===0&&n.push({field:"inverse.paths",message:"nothing to delete \u2014 this is not an inverse"});let o=t.paths.filter(s=>!r.has(s));return o.length>0&&n.push({field:"inverse.paths",message:`would delete paths the spec never declared: ${o.join(", ")}`}),n}return e.boundaryClass!=="outside"&&n.push({field:"inverse",message:"a compensation is only an inverse for `outside` artifacts; an `inside` path owes an exact undo"}),(!t.backupPath||t.backupPath.trim().length===0)&&n.push({field:"inverse.backupPath",message:"an `outside` write owes a backup"}),(!t.hashAtWrite||t.hashAtWrite.trim().length===0)&&n.push({field:"inverse.hashAtWrite",message:"without the post-write hash the undo cannot tell a drifted file from an untouched one"}),r.has(t.file)||n.push({field:"inverse.file",message:`wrote ${t.file}, which the spec did not declare as a target`}),t.kind==="remove-marked-region"?(!t.startMarker||!t.endMarker)&&n.push({field:"inverse",message:"an `outside` region needs both markers, or the undo cannot tell where our text ends"}):t.command.trim().length===0&&n.push({field:"inverse.command",message:"the exact command written is the identity of the entry; without it the undo is a search"}),n}c(Qf,"validateArtifactInverse");var Pv="artifact";function Yf(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"&&t.trim().length>0):[]}c(Yf,"stringArray");function Zf(e){if(!e||typeof e!="object")return null;let t=e[Pv];if(!t||typeof t!="object")return null;let n=t;return{boundaryClass:n.boundaryClass,targets:Yf(n.targets),requires:Yf(n.requires),provides:Yf(n.provides)}}c(Zf,"parseArtifactSpec");function eg(e,t,n){let r=new Set((e.provides??[]).map(gs));if(r.size===0)return[];let o=[];for(let s of t){if(n&&s.id===n)continue;let i=(s.requires??[]).map(gs).filter(a=>r.has(a));i.length>0&&o.push({dependentId:s.id,dependentName:s.name,keys:i})}return o}c(eg,"blockedWithdrawals");var il=["applied","measuring","improved","inconclusive","harmful","rollback_ready"];var Lc=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","cron_refine_cases","process_judge_review"]);function al(e){return Lc.has(e)}c(al,"needsLlmEngine");O();function nn(e){if(!ei())return;let t=bp();u.insert(go).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)})}c(nn,"trackUsage");var iN={critical:25,high:15,medium:8,low:3},aN=[{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 tg(e,t,n){let r=[],o=[e,t??"",n??""].join(`
115
+ `);for(let i of aN){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-=iN[i.severity]??5;return{score:Math.max(0,Math.min(100,s)),findings:r}}c(tg,"scanContent");O();import{and as cN,arrayOverlaps as dN,eq as Ov,inArray as uN,ne as lN}from"drizzle-orm";function mN(e){return gs(`skill:${e.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}`)}c(mN,"skillKeyFor");function pN(e){let t=Zf(e.frontmatter)?.provides??[],n=new Set(t.map(gs));return e.type==="skill"&&n.add(mN(e.name)),[...n].filter(r=>r.length>0)}c(pN,"providedKeysFor");async function Cv(e,t){let n=pN(t);if(n.length===0)return[];let r=await u.select({id:Te.id,name:g.name,requires:Te.requires}).from(Te).innerJoin(g,Ov(g.id,Te.instructionId)).where(cN(Ov(Te.userId,e),lN(Te.instructionId,t.id),uN(Te.status,[...il]),dN(Te.requires,n)));return eg({provides:n},r.map(o=>({id:o.id,name:o.name,requires:o.requires??[],provides:[]})),t.id)}c(Cv,"findBlockedWithdrawals");function Lv(e,t){let n=t.map(r=>`${r.dependentName} (needs ${r.keys.join(", ")})`).join("; ");return`Cannot archive ${e}: ${t.length} applied artifact${t.length===1?"":"s"} still rel${t.length===1?"ies":"y"} on it \u2014 ${n}. Remove or revert those first, or archive anyway with ?force=true.`}c(Lv,"withdrawalRefusal");var Nn=new fN,hN=pt.object({name:pt.string().min(1).max(255),description:pt.string().min(1),scope:pt.enum(["org","team","project","personal"]),scopeRef:pt.string().uuid().optional(),version:pt.string().default("1.0.0"),content:pt.string().min(1),tags:pt.array(pt.string()).optional(),compatibility:pt.array(pt.string()).optional()}),_N=pt.object({name:pt.string().min(1).max(255).optional(),description:pt.string().min(1).optional(),version:pt.string().optional(),content:pt.string().min(1).optional(),tags:pt.array(pt.string()).optional(),compatibility:pt.array(pt.string()).optional(),changeSummary:pt.string().optional()});Nn.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),d=[qe(g.archived,!1),qe(g.createdBy,t)];if(r&&d.push(qe(g.scope,r)),s&&d.push(qe(g.type,s)),n){let f=ct(n);d.push(rg(ng(g.name,`%${f}%`),ng(g.description,`%${f}%`),ng(g.content,`%${f}%`)))}let l=await u.select().from(g).where(Er(...d)).orderBy($v(g.updatedAt)).limit(i).offset(a);if(o){let f=o.split(",").map(h=>h.trim().toLowerCase());l=l.filter(h=>f.some(v=>h.tags?.some(I=>I.toLowerCase().includes(v))))}let m=l.map(f=>f.id),p=m.length>0?await u.select({instructionId:lt.instructionId,projectName:C.name,projectId:C.id}).from(lt).innerJoin(C,qe(C.id,lt.projectId)).where(Ei`${lt.instructionId} IN (${Ei.join(m.map(f=>Ei`${f}`),Ei`, `)})`):[],_=new Map;for(let f of p){let h=_.get(f.instructionId)??[];h.push({projectId:f.projectId,projectName:f.projectName}),_.set(f.instructionId,h)}let w=l.map(f=>({...f,projects:_.get(f.id)??[]}));return nn({userId:t,surface:"api",action:"list"}),e.json(w)});Nn.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(Er(qe(g.contentHash,n),qe(g.createdBy,t),qe(g.archived,!1))).limit(1);return r?e.json({instruction:r}):e.json({instruction:null})});Nn.post("/instructions/by-hashes",async e=>{let t=e.get("userId"),n=await e.req.json(),r=pt.array(pt.string()).max(200).parse(n.hashes??[]),o=pt.array(pt.string()).max(200).parse(n.identities??[]);if(r.length===0&&o.length===0)return e.json({instructions:{}});let s=[qe(g.createdBy,t),qe(g.archived,!1)],i=[];r.length>0&&i.push(Mv(g.contentHash,r)),o.length>0&&i.push(Mv(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:Ei`${g.frontmatter}->>'source'`}).from(g).where(Er(...s,i.length===1?i[0]:rg(...i))),d={};for(let l of a)l.contentHash&&(d[l.contentHash]=l),l.contextIdentity&&(d[l.contextIdentity]=l);return e.json({instructions:d})});Nn.get("/instructions/:id/sessions",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await u.select({sessionId:ie.sessionId,linkMethod:ie.linkMethod,tool:y.tool,projectPath:y.projectPath,startedAt:y.startedAt,endedAt:y.endedAt,analysis:y.analysis}).from(ie).innerJoin(y,qe(y.id,ie.sessionId)).where(Er(qe(ie.instructionId,n),qe(y.userId,t))).orderBy($v(y.startedAt)).limit(50);return e.json({sessions:r})});Nn.get("/instructions/:id",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await u.select().from(g).where(Er(qe(g.id,t),qe(g.archived,!1),rg(qe(g.createdBy,n),qe(g.scope,"public"))));return r?(nn({instructionId:t,userId:n,surface:"api",action:"view"}),e.json(r)):e.json({error:"Instruction not found"},404)});var yN=/<\/?(?:system-reminder|system|available-deferred-tools|tool-result)>/i;function qv(e){return yN.test(e)?"Content contains forbidden system tags":null}c(qv,"validateNoForbiddenTags");Nn.post("/instructions",async e=>{let t=e.get("userId"),n=await e.req.json(),r=hN.parse(n),o=qv(r.content);if(o)return e.json({error:o},422);r.name=bi(r.name),r.description=bi(r.description);let s={},i=null;try{let m=tl(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 a=r.scope==="personal"?t:r.scopeRef??null,d=tg(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:d.score,scanFindings:d.findings.length>0?d.findings:null}).returning();return await u.insert(xe).values({instructionId:l.id,versionNumber:1,content:r.content,frontmatter:s,changeSummary:"Initial version",createdBy:t}),nn({instructionId:l.id,userId:t,surface:"api",action:"create"}),e.json(l,201)});Nn.put("/instructions/:id",async e=>{let t=e.req.param("id"),n=e.get("userId"),r=await e.req.json(),o=_N.parse(r);if(o.content){let p=qv(o.content);if(p)return e.json({error:p},422)}o.name&&(o.name=bi(o.name)),o.description&&(o.description=bi(o.description));let[s]=await u.select().from(g).where(Er(qe(g.id,t),qe(g.createdBy,n),qe(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 p=tl(o.content);i=p.frontmatter,a=p.slots}catch{}let d={};if(o.content||o.name||o.description){let p=tg(o.content??s.content,o.name??s.name,o.description??s.description);d.scanScore=p.score,d.scanFindings=p.findings.length>0?p.findings:null}let l,m=4;for(let p=0;p<=m;p++)try{l=await u.transaction(async _=>{await _.select({id:g.id}).from(g).where(qe(g.id,t)).for("update");let[{maxVersion:w}]=await _.select({maxVersion:Ei`COALESCE(MAX(${xe.versionNumber}), 0)`}).from(xe).where(qe(xe.instructionId,t)),f=w+1,[h]=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:a,...d,updatedAt:new Date}).where(qe(g.id,t)).returning();return await _.insert(xe).values({instructionId:t,versionNumber:f,content:o.content??s.content,frontmatter:i,changeSummary:o.changeSummary??null,createdBy:n}),h});break}catch(_){if(_.cause?.code==="23505"&&p<m)continue;throw _}return l?(nn({instructionId:t,userId:n,surface:"api",action:"update"}),e.json(l)):e.json({error:"Instruction update failed"},500)});Nn.delete("/instructions/:id",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await u.select().from(g).where(Er(qe(g.id,t),qe(g.createdBy,n),qe(g.archived,!1)));if(!r)return e.json({error:"Instruction not found"},404);if(e.req.query("force")!=="true"){let i=await Cv(n,r);if(i.length>0)return e.json({error:Lv(r.name,i),blockedBy:i},409)}let[o]=await u.update(g).set({archived:!0,archivedAt:new Date,archivedBy:n}).where(qe(g.id,t)).returning(),s=await u.update(x).set({dismissedAt:new Date,isStale:!0}).where(Er(qe(x.userId,n),qe(x.instructionId,t),gN(x.dismissedAt))).returning({id:x.id});return nn({instructionId:t,userId:n,surface:"api",action:"delete"}),e.json({...o,dismissedSuggestions:s.length})});Nn.post("/instructions/:id/restore",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await u.select().from(g).where(Er(qe(g.id,t),qe(g.createdBy,n),qe(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(qe(g.id,t)).returning();return nn({instructionId:t,userId:n,surface:"api",action:"update"}),e.json(o)});Nn.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(Er(qe(g.id,t),qe(g.createdBy,n)));if(!r)return e.json({error:"Instruction not found"},404);let o=await u.select().from(xe).where(qe(xe.instructionId,t)).orderBy(xe.versionNumber);return e.json(o)});O();import{Hono as wN}from"hono";import{eq as Io,and as og}from"drizzle-orm";var Mc=new wN;Mc.post("/instructions/:id/fork",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(g).where(og(Io(g.id,n),Io(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(og(Io(g.createdBy,t),Io(g.scope,"org"),Io(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(xe).values({instructionId:o.id,versionNumber:1,content:o.content,frontmatter:o.frontmatter,changeSummary:`Forked from ${r.name}`,createdBy:t}),await u.insert(Ht).values({instructionId:o.id,eventType:"fork",actorId:t,metadata:{sourceId:r.id,sourceName:r.name,sourceVersion:r.version}}),nn({instructionId:o.id,userId:t,surface:"api",action:"fork"}),e.json(o,201)});Mc.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(og(Io(g.id,t),Io(g.createdBy,n)));if(!r)return e.json({error:"Instruction not found"},404);let o=await u.select().from(Ht).where(Io(Ht.instructionId,t)).orderBy(Ht.createdAt);return e.json(o)});O();import{Hono as vN}from"hono";import{eq as sr,and as Uv,sql as IN}from"drizzle-orm";var $c=new vN;$c.get("/instructions/:id/upstream",async e=>{let t=e.req.param("id"),[n]=await u.select().from(g).where(Uv(sr(g.id,t),sr(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(sr(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})});$c.post("/instructions/:id/pull-upstream",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(g).where(Uv(sr(g.id,n),sr(g.createdBy,t),sr(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(sr(g.id,r.forkedFromId));if(!o)return e.json({error:"Parent instruction no longer exists"},404);let[s]=await u.select().from(xe).where(sr(xe.instructionId,o.id)).orderBy(xe.versionNumber).limit(1),i=s?.content??o.content,a=zf(i,o.content,r.content);if(a.hasConflicts)return e.json({hasConflicts:!0,merged:a.merged,conflicts:a.conflicts});let d,l=4;for(let m=0;m<=l;m++)try{d=await u.transaction(async p=>{await p.select({id:g.id}).from(g).where(sr(g.id,n)).for("update");let[_]=await p.select({maxVersion:IN`COALESCE(MAX(${xe.versionNumber}), 0)`}).from(xe).where(sr(xe.instructionId,n)),w=(_?.maxVersion??0)+1,[f]=await p.update(g).set({content:a.merged,upstreamVersion:o.version,updatedAt:new Date}).where(sr(g.id,n)).returning();return await p.insert(xe).values({instructionId:n,versionNumber:w,content:a.merged,frontmatter:r.frontmatter,changeSummary:`Pulled upstream changes from ${o.name} (${o.version})`,createdBy:t}),await p.insert(Ht).values({instructionId:n,eventType:"pull_upstream",actorId:t,metadata:{parentId:o.id,parentVersion:o.version,previousUpstreamVersion:r.upstreamVersion}}),f});break}catch(p){if(p.cause?.code==="23505"&&m<l)continue;throw p}return d?(nn({instructionId:n,userId:t,surface:"api",action:"pull_upstream"}),e.json({hasConflicts:!1,instruction:d})):e.json({error:"Pull-upstream failed after version conflict"},500)});O();import{Hono as bN}from"hono";import{z as bo}from"zod";import{eq as Ft,and as hs,sql as EN}from"drizzle-orm";var AN=bo.object({scope:bo.enum(["team","org"]),scopeRef:bo.string().uuid()}),qc=new bN;qc.post("/instructions/:id/promote",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=AN.parse(await e.req.json()),[o]=await u.select().from(g).where(hs(Ft(g.id,n),Ft(g.createdBy,t),Ft(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[d]=await u.select().from(we).where(hs(Ft(we.userId,t),Ft(we.teamId,r.scopeRef)));if(!d)return e.json({error:"You are not a member of this team"},403)}else if(r.scope==="org"){let[d]=await u.select().from(ee).where(hs(Ft(ee.userId,t),Ft(ee.orgId,r.scopeRef)));if(!d||d.role!=="admin"&&d.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(Ft(g.id,n)).returning();return await u.insert(Ht).values({instructionId:n,eventType:"promote",actorId:t,metadata:{fromScope:s,fromScopeRef:i,toScope:r.scope,toScopeRef:r.scopeRef}}),nn({instructionId:n,userId:t,surface:"api",action:"promote"}),e.json(a)});var SN=bo.object({targetScope:bo.enum(["personal","team","org"]),targetScopeRef:bo.string().uuid().optional(),name:bo.string().optional(),seedEvalTarget:bo.boolean().optional()});async function xN(e){let[t]=await u.select({id:k.id}).from(k).where(EN`${k.metadata}->>'instructionId' = ${e}`).limit(1);return t??null}c(xN,"findExistingEvalTarget");qc.post("/instructions/:id/promote-from-public",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=SN.parse(await e.req.json()),[o]=await u.select().from(g).where(hs(Ft(g.id,n),Ft(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 u.select().from(we).where(hs(Ft(we.userId,t),Ft(we.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 u.select().from(ee).where(hs(Ft(ee.userId,t),Ft(ee.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,a=r.seedEvalTarget??(r.targetScope==="org"||r.targetScope==="team"),[d]=await u.select().from(g).where(hs(Ft(g.scope,r.targetScope),Ft(g.scopeRef,s),Ft(g.forkedFromId,n),Ft(g.archived,!1)));if(d){let p=null;return a&&(p=(await xN(d.id))?.id??null),e.json({instructionId:d.id,alreadyExisted:!0,evalTargetId:p})}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(xe).values({instructionId:l.id,versionNumber:1,content:o.content,frontmatter:o.frontmatter,changeSummary:`Promoted from public skill ${o.name}`,createdBy:t}),await u.insert(Ht).values({instructionId:l.id,eventType:"promote_from_public",actorId:t,metadata:{sourceInstructionId:o.id,sourceName:o.name,targetScope:r.targetScope,targetScopeRef:s}}),nn({instructionId:l.id,userId:t,surface:"api",action:"promote_from_public"});let m=null;if(a){let[p]=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});m=p?.id??null}return e.json({instructionId:l.id,alreadyExisted:!1,evalTargetId:m})});O();import{Hono as RN}from"hono";import{z as Hv}from"zod";import{eq as jn,and as Hc,or as Bv,inArray as Fv,sql as Uc,desc as TN}from"drizzle-orm";var Bc=new RN,kN=Hv.object({badge:Hv.enum(["recommended","required"]).nullable()});Bc.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),d=parseInt(e.req.query("offset")??"0",10),l=Math.min(Math.max(a,1),200),m=Math.max(d,0),p=await u.select({orgId:ee.orgId}).from(ee).where(jn(ee.userId,t)),_=await u.select({teamId:we.teamId}).from(we).where(jn(we.userId,t)),w=p.map(S=>S.orgId).filter(S=>S!==null),f=_.map(S=>S.teamId).filter(S=>S!==null),h=[jn(g.archived,!1)],v=[jn(g.scope,"public")];if(w.length>0&&v.push(Hc(jn(g.scope,"org"),Fv(g.scopeRef,w))),f.length>0&&v.push(Hc(jn(g.scope,"team"),Fv(g.scopeRef,f))),h.push(Bv(...v)),e.req.query("proposable")==="1"&&h.push(Uc`coalesce(${g.frontmatter}->>'kind', 'skill') <> 'supporting'`),n&&h.push(jn(g.badge,n)),r&&h.push(jn(g.scope,r)),o){let S=ct(o);h.push(Bv(Uc`${g.name} ILIKE ${`%${S}%`}`,Uc`${g.description} ILIKE ${`%${S}%`}`))}let I=[TN(Uc`COALESCE(${g.sourceUpdatedAt}, ${g.updatedAt})`)],E={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},b=await(i>0?Fe:u).select(i>0?{...E,contentPreview:Uc`left(${g.content}, ${i})`}:E).from(g).where(Hc(...h)).orderBy(...I).limit(l).offset(m);return nn({userId:t,surface:"api",action:"search",metadata:o?{query:o}:void 0}),e.header("Cache-Control","private, max-age=30"),e.json(b)});Bc.post("/instructions/:id/badge",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=kN.parse(await e.req.json()),[o]=await u.select().from(g).where(Hc(jn(g.id,n),jn(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(ee).where(Hc(jn(ee.userId,t),jn(ee.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(jn(g.id,n)).returning(),d=r.badge?"badge_set":"badge_removed";return await u.insert(Ht).values({instructionId:n,eventType:d,actorId:t,metadata:{badge:r.badge}}),e.json(a)});O();import{Hono as NN}from"hono";import{eq as Eo,and as cl,or as jN,inArray as Wv}from"drizzle-orm";var dl=new NN;dl.post("/projects/:id/recommendations",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(C).where(cl(Eo(C.id,n),Eo(C.createdBy,t)));if(!r)return e.json({error:"Project not found"},404);let o=await u.select({orgId:ee.orgId}).from(ee).where(Eo(ee.userId,t)),s=await u.select({teamId:we.teamId}).from(we).where(Eo(we.userId,t)),i=o.map(h=>h.orgId).filter(h=>h!==null),a=s.map(h=>h.teamId).filter(h=>h!==null),d=[Eo(g.scope,"public")];i.length>0&&d.push(cl(Eo(g.scope,"org"),Wv(g.scopeRef,i))),a.length>0&&d.push(cl(Eo(g.scope,"team"),Wv(g.scopeRef,a)));let l=await u.select().from(g).where(cl(Eo(g.archived,!1),jN(...d))).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 h=r.githubRepo.replace("https://github.com/",""),[v,I]=await Promise.all([fetch(`https://api.github.com/repos/${h}`,{headers:{Accept:"application/vnd.github.v3+json","User-Agent":"RuleMetric"}}),fetch(`https://api.github.com/repos/${h}/languages`,{headers:{Accept:"application/vnd.github.v3+json","User-Agent":"RuleMetric"}})]);if(v.ok){let E=await v.json();m.topics=E.topics??[]}if(I.ok){let E=await I.json();m.languages=Object.keys(E)}}catch{}let p=l.map(h=>({id:h.id,name:h.name,description:h.description??"",tags:h.tags??[],contentPreview:(h.content??"").slice(0,400)})),_=process.env.LLM_PROVIDER,w=process.env.LLM_API_KEY;if(!_||!w)return e.json({recommendations:[],error:"LLM not configured"});let f=await Kf(m,p,{llmProvider:_,llmApiKey:w});return e.json(f)});import{Hono as jj}from"hono";O();import{Hono as aj}from"hono";import{z as Tg}from"zod";import{eq as At,and as Xc,desc as mI,sql as cr,inArray as cj}from"drizzle-orm";O();import{and as FN,eq as Ag,sql as WN}from"drizzle-orm";function sg(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 d=1;d<=s;d++)i*=(o-d+1)/d,a+=i;return{pValue:Math.min(1,2*a),nDiscordant:o}}c(sg,"mcnemarExact");function ul(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)}}}c(ul,"assessSufficiency");var Ao=1.959963984540054;function ll(e,t,n=Ao){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)}}c(ll,"wilsonInterval");function Si(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}}c(Si,"seededRandom");function Ai(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])}c(Ai,"sortedQuantile");function ig(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=Si(t.seed??1),i=e.reduce((l,m)=>l+m,0)/n,a=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];a[l]=m/n}a.sort((l,m)=>l-m);let d=(1-o)/2;return{estimate:i,lower:Ai(a,d),upper:Ai(a,1-d),iterations:r}}c(ig,"pairedBootstrapCI");function ag(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=Si(n.seed??1),i=c(w=>w.reduce((f,h)=>f+h,0)/w.length,"mean"),a=i(e)-i(t),d=new Array(r),l=0,m=0;for(let w=0;w<r;w++){let f=0;for(let I=0;I<e.length;I++)f+=e[s()*e.length|0];let h=0;for(let I=0;I<t.length;I++)h+=t[s()*t.length|0];let v=f/e.length-h/t.length;d[w]=v,v<=0&&l++,v>=0&&m++}d.sort((w,f)=>w-f);let p=(1-o)/2,_=Math.min(1,2*Math.min(l,m)/r);return{estimate:a,lower:Ai(d,p),upper:Ai(d,1-p),pValue:_,iterations:r}}c(ag,"twoSampleBootstrapCI");function cg(e,t={}){let n=e.filter(h=>h.withScores.length>0&&h.withoutScores.length>0);if(n.length===0)return{estimate:0,lower:0,upper:0,pValue:1,iterations:0};let r=c(h=>h.reduce((v,I)=>v+I,0)/h.length,"mean"),o=n.map(h=>h.withScores.length*h.withoutScores.length/(h.withScores.length+h.withoutScores.length)),s=o.reduce((h,v)=>h+v,0),i=c(h=>h.reduce((v,I,E)=>v+o[E]*I,0)/s,"combine"),a=i(n.map(h=>r(h.withScores)-r(h.withoutScores))),d=t.iterations??1e4,l=t.ciLevel??.95,m=Si(t.seed??1),p=new Array(d),_=0,w=0;for(let h=0;h<d;h++){let v=n.map(E=>{let A=0;for(let S=0;S<E.withScores.length;S++)A+=E.withScores[m()*E.withScores.length|0];let b=0;for(let S=0;S<E.withoutScores.length;S++)b+=E.withoutScores[m()*E.withoutScores.length|0];return A/E.withScores.length-b/E.withoutScores.length}),I=i(v);p[h]=I,I<=0&&_++,I>=0&&w++}p.sort((h,v)=>h-v);let f=(1-l)/2;return{estimate:a,lower:Ai(p,f),upper:Ai(p,1-f),pValue:Math.min(1,2*Math.min(_,w)/d),iterations:d}}c(cg,"stratifiedBootstrapCI");function dg(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((w,f)=>w+f,0)/n,o=e.reduce((w,f)=>w+f,0)/n,s=0,i=0,a=0;for(let w=0;w<n;w++){let f=t[w]-r,h=e[w]-o;s+=f*h,i+=f*f,a+=h*h}if(i===0)return{adjusted:[...e],theta:0,varianceReduction:0};let d=s/i,l=e.map((w,f)=>w-d*(t[f]-r)),m=0,p=l.reduce((w,f)=>w+f,0)/n;for(let w of l)m+=(w-p)*(w-p);let _=a===0?0:1-m/a;return{adjusted:l,theta:d,varianceReduction:_}}c(dg,"cupedAdjust");function ug(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}})}c(ug,"diagnoseAssertions");function lg(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,d=null;if(i>0&&a>0&&a/i>=r){let l=n>0?` (${n} with no baseline cohort)`:"";d=`${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:d}}c(lg,"summarizeDiscrimination");function ml(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 d=(s-n*(n+1)/2)/(n*r);return Math.abs(d-.5)}c(ml,"cohortTimeSeparation");var _s=.35,pl=900*1e3;function mg(e,t,n=_s,r=pl){if(e.length===0||t.length===0)return!1;let o=[...e,...t];return Math.max(...o)-Math.min(...o)<r?!1:ml(e,t)>n}c(mg,"isTimeSeparated");var zv=c(e=>e===0||e===1,"isBinary");function Vv(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}c(Vv,"meanPairDelta");function fl(e,t={}){let n=t.baseline??"no-rule",r=t.minN??10,o=e.length,s=e.map(h=>h.withScore-h.withoutScore),i=o===0?0:s.reduce((h,v)=>h+v,0)/o,a=ig(s,{seed:t.seed,iterations:t.iterations}),d={lower:a.lower,upper:a.upper},l=e.every(h=>zv(h.withScore)&&zv(h.withoutScore)),m=null;if(l&&o>0){let h=0,v=0;for(let I of e)I.withScore===1&&I.withoutScore===0?h++:I.withScore===0&&I.withoutScore===1&&v++;m=sg(h,v).pValue}let{sufficient:p}=ul(o,o,r),_=d.lower>0||d.upper<0,f={mode:"controlled",baseline:n,delta:i,ci:d,pValue:m,significant:p&&_,sufficient:p,nWith:o,nWithout:o,costDelta:Vv(e,"withCost","withoutCost"),latencyDelta:Vv(e,"withLatency","withoutLatency"),confounded:!1};return p||(f.insufficientReason=`insufficient data: need >= ${r} paired tasks per cohort, have ${o}`),f}c(fl,"buildControlledVerdict");var PN=2;function gl(e,t,n={}){let r=n.minN??10,o=e.length,s=t.length,i=e.map(E=>E.score),a=t.map(E=>E.score),d=[...e,...t],l=d.length>0&&d.every(E=>typeof E.covariate=="number");if(l){let{adjusted:E}=dg(d.map(A=>A.score),d.map(A=>A.covariate));i=E.slice(0,o),a=E.slice(o)}let m=ag(i,a,{seed:n.seed,iterations:n.iterations}),p={lower:m.lower,upper:m.upper},_=m.estimate,w=o>0&&s>0?m.pValue:null,{sufficient:f}=ul(o,s,r),h=f&&(p.lower>0||p.upper<0),v=c(E=>{if(o===0||s===0||!e.every(S=>E(S)!=null)||!t.every(S=>E(S)!=null))return null;let A=e.reduce((S,T)=>S+E(T),0)/o,b=t.reduce((S,T)=>S+E(T),0)/s;return A-b},"meanDiff"),I={mode:"observational",baseline:n.baseline??"no-rule",delta:_,ci:p,pValue:w,significant:h,sufficient:f,nWith:o,nWithout:s,costDelta:v(E=>E.cost),latencyDelta:v(E=>E.latency),confounded:!0,cupedApplied:l};return f||(I.insufficientReason=`insufficient data: need >= ${r} sessions per cohort, have ${o} exposed / ${s} unexposed`),I}c(gl,"buildObservationalVerdict");function Pn(e,t={}){let n=t.minN??10,r=t.minPerStratum??PN,o=t.maxTimeSeparation??_s,s=t.minStratumSpanMs??pl,i=e.filter(T=>T.withScores.length>=r&&T.withoutScores.length>=r),a=i.filter(T=>T.withTimes!=null&&T.withoutTimes!=null&&mg(T.withTimes,T.withoutTimes,o,s)),d=new Set(a.map(T=>T.key)),l=i.filter(T=>!d.has(T.key)),m=e.filter(T=>T.withScores.length>0&&T.withoutScores.length>0&&(T.withScores.length<r||T.withoutScores.length<r)).length,p=l.reduce((T,P)=>T+P.withScores.length,0),_=l.reduce((T,P)=>T+P.withoutScores.length,0),w=cg(l,{seed:t.seed,iterations:t.iterations}),f={lower:w.lower,upper:w.upper},h=w.estimate,v=l.length>0&&p>=n&&_>=n,I=l.length>0?w.pValue:null,E=v&&(f.lower>0||f.upper<0),A=e.reduce((T,P)=>T+P.withScores.length+P.withoutScores.length,0),b=A>0?(p+_)/A:0,S={mode:"observational",baseline:t.baseline??"no-rule",delta:h,ci:f,pValue:I,significant:E,sufficient:v,nWith:p,nWithout:_,costDelta:null,latencyDelta:null,confounded:!0,strata:l.length,strataDroppedForTimeSeparation:a.length,coverage:b};if(!v){let T=m>0?` (${m} project(s) had both cohorts but fewer than ${r} sessions in one of them)`:"",P=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`:"";S.insufficientReason=l.length===0?a.length>0?`insufficient data: no comparable cohort.${P}${T}`:`insufficient data: no project has >= ${r} exposed AND >= ${r} unexposed sessions to compare within${T}`:`insufficient data: need >= ${n} sessions per cohort across comparable projects, have ${p} exposed / ${_} unexposed${T}${P?`.${P}`:""}`}return S}c(Pn,"buildStratifiedVerdict");function pg(e,t,n={}){return{overall:Pn(e,n),segments:hl(t,n)}}c(pg,"buildSegmentedVerdict");function hl(e,t={}){return e.map(n=>({segment:n.segment,verdict:Pn(n.strata,t)}))}c(hl,"buildSegmentVerdicts");function ys(e){return e.sufficient?e.significant?e.delta<0?"harmful":"helpful":"neutral":"insufficient"}c(ys,"classifyEffect");var xi={achieved:1,fully_achieved:1,mostly_achieved:.75,partially_achieved:.5,unclear_from_transcript:.25,not_achieved:0,abandoned:0},ws=c(e=>{let t=e?xi[e]:void 0;return t===void 0?null:t},"scoreOutcome");var Ri=10,_l=c(e=>e.length===0?0:e.reduce((t,n)=>t+n,0)/e.length,"mean"),fg=c(e=>{if(e.length<2)return 0;let t=_l(e);return e.reduce((n,r)=>n+(r-t)**2,0)/(e.length-1)},"sampleVar"),Jv=c((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,d=(i>0?e.reduce((l,m,p)=>l+t[p]*(m-s)**2,0)/i:0)*r/(n*n);return{mean:s,varOfMean:d,nEff:o}},"weightedStats");function gg(e,t,n={}){let r=n.minAnchors??Ri,o=n.z??Ao,s=e.length,i=t.length,a=[...e,...t.map(b=>b.judge)],d=_l(a),l=t.map(b=>b.weight??1),m=t.map(b=>b.human-b.judge),p=Jv(m,l),_=p.mean,w=i>0?p.nEff:0,f=t.filter(b=>b.validated!==!1).length;if(n.pooledRectifier){let b=n.pooledRectifier,S=s>0?e:t.map(U=>U.judge);if(S.length===0)return{estimate:NaN,ci:{lower:NaN,upper:NaN},se:1/0,naive:d,rectifier:b.rectifier,nLabeled:i,nUnlabeled:s,nEffective:w,nValidated:f,sufficient:!1,insufficientReason:"no judge scores to correct with the pooled rectifier"};let T=_l(S)+b.rectifier,P=fg(S)/S.length+b.variance,H=Math.sqrt(P),N={estimate:T,ci:{lower:T-o*H,upper:T+o*H},se:H,naive:d,rectifier:b.rectifier,nLabeled:i,nUnlabeled:s,nEffective:w,nValidated:f,sufficient:b.sufficient};return b.sufficient||(N.insufficientReason="pooled rectifier not yet adequate"),N}let h,v;if(i===0)h=d,v=a.length>0?fg(a)/a.length:0;else if(s===0){let b=Jv(t.map(S=>S.human),l);h=b.mean,v=b.varOfMean}else h=_l(e)+_,v=fg(e)/s+p.varOfMean;let I=Math.sqrt(v),E=f>=r,A={estimate:h,ci:{lower:h-o*I,upper:h+o*I},se:I,naive:d,rectifier:_,nLabeled:i,nUnlabeled:s,nEffective:w,nValidated:f,sufficient:E};if(!E){let b=i-f;A.insufficientReason=`insufficient anchors: need >= ${r} VALIDATED human-labeled items, have ${f}${b>0?` (+${b} passive, which don't count toward the floor)`:""}`}return A}c(gg,"ppiMeanEstimate");function Fc(e,t,n={}){let r=gg(e.unlabeledJudge,e.labeled,{...n,pooledRectifier:n.withPooledRectifier}),o=gg(t.unlabeledJudge,t.labeled,{...n,pooledRectifier:n.withoutPooledRectifier}),s=n.z??Ao,i=r.estimate-o.estimate,a=Math.sqrt(r.se**2+o.se**2),d={lower:i-s*a,upper:i+s*a},l=r.sufficient&&o.sufficient,m=l&&(d.lower>0||d.upper<0),p={delta:i,ci:d,se:a,with:r,without:o,sufficient:l,significant:m};return l||(p.insufficientReason=r.insufficientReason??o.insufficientReason),p}c(Fc,"ppiDifference");var Ti=50,Yv=.2,Xv=.8416212335729143,DN=c(e=>e.length===0?0:e.reduce((t,n)=>t+n,0)/e.length,"mean"),Wc=c(e=>{if(e.length<2)return 0;let t=DN(e);return e.reduce((n,r)=>n+(r-t)**2,0)/(e.length-1)},"sampleVar");function Kv(e,t){let n=e.labeled.length,r=e.unlabeledJudge.length;return n>0&&r>0?{fixed:Wc(e.unlabeledJudge)/r,scaling:Wc(e.labeled.map(o=>o.human-o.judge)),n}:n>0?{fixed:0,scaling:Wc(e.labeled.map(o=>o.human)),n}:{fixed:r>0?Wc(e.unlabeledJudge)/r:0,scaling:t.labeled.length>0?Wc(t.labeled.map(o=>o.human-o.judge)):null,n:0}}c(Kv,"varianceComponents");var Gv=1e6;function ON(e,t){if(e.some(s=>s.scaling===null))return null;let n=c(s=>e.reduce((i,a)=>i+a.fixed+(a.scaling===0?0:a.scaling/(a.n+s)),0),"se2");if(n(Gv)>t)return null;let r=0,o=Gv;for(;r<o;){let s=Math.floor((r+o)/2);n(s)<=t?o=s:r=s+1}return r}c(ON,"solvePerCohortIncrement");function hg(e,t,n={}){let r=n.pilotTarget??Ti,o=n.targetEffect??Yv,s=n.minAnchors??Ri,i=n.z??Ao,a=n.zPower??Xv,d=i+a,l=c(V=>(V*100).toFixed(0),"pp"),m=e.labeled.length,p=t.labeled.length,_=n.humanLabeledRuns??m+p,w=e.unlabeledJudge.length+m+t.unlabeledJudge.length+p,f={nAnchors:_,nAnchorsWith:m,nAnchorsWithout:p,pilotTarget:r,pilotMet:_>=r,targetEffect:o};if(w===0)return{...f,seDelta:null,mde:null,powered:!1,adequate:!1,reasons:["no graded runs to calibrate against"],additionalAnchorsNeeded:r};let h=Fc(e,t,{minAnchors:s,z:i,withPooledRectifier:n.pool?.withPooledRectifier,withoutPooledRectifier:n.pool?.withoutPooledRectifier}).se,v=d*h,I=e.unlabeledJudge.length+m,E=t.unlabeledJudge.length+p,A=Math.min(I,E)<s,b=!Number.isFinite(h)||h<=0,S=A,T=!S&&v<=o,P=`(${I} with / ${E} without, minimum ${s} per cohort)`,H=b?`sample too thin to estimate a variance ${P} \u2014 no variance in it at all, so the estimate has no spread to be precise about; this is missing data, not power`:`sample too thin to claim precision ${P} \u2014 an MDE of \xB1${l(v)}pp estimated from this few runs is an artefact of the sample size, not power`;if(n.pool){let{totalAnchors:V,targets:pe}=n.pool,F=V>=r,he=pe>=3,D=F&&he&&T,re=[];return he||re.push(`pool spans ${pe}/3 same-judge targets \u2014 between-target variance is assumed, not measured`),F||re.push(`pool floor not met: ${V}/${r} human-labeled runs across the same-judge pool`),S?re.push(H):T||re.push(`MDE \xB1${l(v)}pp exceeds the \xB1${l(o)}pp target effect \u2014 pooling lowers the label cost, not this; more graded runs are needed (\xA76d(f))`),{...f,seDelta:h,mde:v,powered:T,adequate:D,reasons:re,additionalAnchorsNeeded:F?null:r-V,pooled:!0,poolAnchors:V,poolTargets:pe}}let N=m>=s,U=p>=s,q=f.pilotMet&&N&&U&&T,B,J=0;if(!T){let V=(o/d)**2,pe=ON([Kv(e,t),Kv(t,e)],V);J=pe===null?null:2*pe}if(!f.pilotMet)B=r-_;else if(J===null)B=null;else{let V=Math.max(0,s-m)+Math.max(0,s-p);B=Math.max(V,J)}let ce=[];if(f.pilotMet||ce.push(`pilot target not met: ${_}/${r} human-labeled runs`),N||ce.push(`with-target cohort has ${m}/${s} labeled runs (minimum for a corrected estimate)`),U||ce.push(`without-target cohort has ${p}/${s} labeled runs (minimum for a corrected estimate)`),S)ce.push(H);else if(!T){let V=J===null?" \u2014 anchors alone cannot reach it; more graded runs are needed":f.pilotMet&&J>0?` \u2014 ~${J} more labeled runs projected to reach it`:"";ce.push(`MDE \xB1${l(v)}pp exceeds the \xB1${l(o)}pp target effect${V}`)}return{...f,seDelta:h,mde:v,powered:T,adequate:q,reasons:ce,additionalAnchorsNeeded:B}}c(hg,"anchorPowerCheck");function _g(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}}c(_g,"localOnly");function yl(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)?_g(e,{rectifierUsed:NaN,variance:1/0,reason:"no anchors on this target and none to pool from"}):_g(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,J)=>B+J,0)/i.length:0,d=Math.max(a*.001,1e-12),l=c(B=>Math.max(B,d),"flooredVar"),m=o.map(B=>1/l(B.variance)),p=m.reduce((B,J)=>B+J,0),_=m.reduce((B,J)=>B+J*J,0),w=o.reduce((B,J,ce)=>B+m[ce]*J.rectifier,0)/p,f=o.reduce((B,J,ce)=>B+m[ce]*(J.rectifier-w)**2,0),h=s-1,v=p-_/p,I=v>0?Math.max(0,(f-h)/v):0,E=f>0?Math.max(0,(f-h)/f):0,A=o.map(B=>1/(l(B.variance)+I)),b=A.reduce((B,J)=>B+J,0),S=o.reduce((B,J,ce)=>B+A[ce]*J.rectifier,0)/b,T=1/b,P=s<3;if(E>r)return e.n>=1&&Number.isFinite(e.variance)?_g(e,{pooled:S,pooledVariance:T,tau2:I,i2:E,k:s,assumedExchangeability:P,reason:`heterogeneity too high (I\xB2=${(E*100).toFixed(0)}%) \u2014 targets disagree; not pooling`}):{rectifierUsed:S,variance:T,lambda:1,pooled:S,pooledVariance:T,tau2:I,i2:E,k:s,pooledApplied:!1,assumedExchangeability:P,reason:`no anchors on this target; pooled estimate is high-heterogeneity (I\xB2=${(E*100).toFixed(0)}%) \u2014 treat as unknown`};let H=e.n<1||!Number.isFinite(e.variance),N=H?1:l(e.variance)/(l(e.variance)+I),U=H?S:N*S+(1-N)*e.rectifier,q=H?T+I:(1-N)*e.variance+N*N*T;return{rectifierUsed:U,variance:q,lambda:N,pooled:S,pooledVariance:T,tau2:I,i2:E,k:s,pooledApplied:!0,assumedExchangeability:P}}c(yl,"shrinkRectifier");var ki=3,Vc=7,yg="(preamble)",qN=/^\s*(`{3,}|~{3,})/,UN=/^(#{1,6})\s+(.*)$/;function zc(e){let t=e.split(`
116
+ `),n=[],r=[],o={heading:"",level:0,path:[yg],body:[]},s=null,i=c(()=>{n.push({heading:o.heading,level:o.level,path:o.path,body:o.body.join(`
117
+ `).trim()})},"flush");for(let a of t){let d=qN.exec(a);if(d){let m=d[1];s==null?s={marker:m}:m[0]===s.marker[0]&&m.length>=s.marker.length&&(s=null),o.body.push(a);continue}if(s!=null){o.body.push(a);continue}let l=UN.exec(a);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},(_,w)=>r[w]??`(unnamed level ${w+1})`),body:[]};continue}o.body.push(a)}return i(),n.filter((a,d)=>!(d===0&&a.level===0&&a.body===""))}c(zc,"splitMarkdownSections");function wl(e){let t=new Map,n=new Map;for(let r of e){let o=r.level===0?yg:r.path.join(" > "),s=(t.get(o)??0)+1;t.set(o,s),n.set(s===1?o:`${o} #${s}`,r)}return n}c(wl,"sectionKeys");function wg(e,t){let n=wl(zc(e)),r=wl(zc(t)),o=[],s=[],i=[];for(let[a,d]of r){let l=n.get(a);l?l.body!==d.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()}}c(wg,"diffSections");function vg(e){return[...new Set([...e.changed,...e.added,...e.removed])].sort()}c(vg,"touchedSections");var Qv=c(e=>e.trim().toLowerCase(),"normalize");function Zv(e,t,n){if(n.length===0)return[];let r=new Set(n.map(Qv)),o=wg(e,t),s=new Set(vg(o)),i=new Map([...wl(zc(e)),...wl(zc(t))]),a=[];for(let d of s){let l=i.get(d);(l?l.path:d.split(" > ")).some(p=>r.has(Qv(p)))&&a.push(d)}return a.sort()}c(Zv,"protectedViolations");function Ig(e){let{verdict:t,canaryGreen:n,adequate:r,adequacyReasons:o=[],promotionsInWindow:s,maxPromotionsPerWindow:i=ki,immutableSections:a=[],beforeContent:d,afterContent:l,measurementMatchesPredecessor:m}=e,p=vg(wg(d,l)),_=ys(t),w=[];if(d===l&&w.push("proposal is identical to the current version \u2014 nothing to promote"),t.mode!=="controlled"&&w.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"&&w.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&&w.push("verdict is flagged confounded"),m===!1&&w.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||w.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 I=o.length>0?`: ${o.join("; ")}`:"";w.push(`verdict is not adequately powered${I}`)}s>=i&&w.push(`change budget exhausted: ${s}/${i} promotions already made in the current window`);let f=Zv(d,l,a);if(f.length>0&&w.push(`proposal edits protected section(s): ${f.join(", ")}`),_==="insufficient"&&w.push(t.insufficientReason??"verdict did not clear min-n, so no effect was measured"),w.length>0)return{decision:"refuse",refusals:w,rationale:`refused: ${w.length} gate(s) blocked promotion`,effect:_,touched:p};let h=c(I=>`${I>=0?"+":""}${(I*100).toFixed(1)}pp`,"pp"),v=`[${h(t.ci.lower)}, ${h(t.ci.upper)}]`;return _==="helpful"?{decision:"promote",refusals:[],rationale:`promote: ${h(t.delta)} CI ${v} over the prior version, n=${t.nWith} paired cases`,effect:_,touched:p}:_==="harmful"?{decision:"revert",refusals:[],rationale:`revert: proposal measured WORSE than its predecessor, ${h(t.delta)} CI ${v}`,effect:_,touched:p}:{decision:"revert",refusals:[],rationale:`revert: no detectable improvement, ${h(t.delta)} CI ${v} spans zero`,effect:_,touched:p}}c(Ig,"evaluatePromotion");async function Kc(e,t){let[n]=await u.select({id:$.id,instructionId:$.instructionId,projectPath:$.projectPath,status:$.status,contentHash:$.contentHash}).from($).where(FN(Ag($.id,e),Ag($.userId,t)));if(!n)return null;let r=!1;if(n.contentHash){let{instructionContentHash:f}=await Promise.resolve().then(()=>(vs(),oI)),[h]=await u.select({content:g.content,name:g.name}).from(g).where(Ag(g.id,n.instructionId));r=f(h?.content,h?.name)!==n.contentHash}let o=await u.execute(WN`
118
118
  SELECT a.arm,
119
119
  s.analysis->>'outcome' AS outcome,
120
120
  EXTRACT(EPOCH FROM s.started_at) * 1000 AS started_ms
@@ -123,12 +123,12 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
123
123
  ON s.external_session_id = a.external_session_id
124
124
  AND s.user_id = a.user_id
125
125
  WHERE a.experiment_id = ${e}
126
- `),s={treated:0,control:0},i=[],a=[],u=[],l=[];for(let h of o){let m=h.arm==="treated";m?s.treated++:s.control++;let w=ys(h.outcome);if(w===null)continue;let I=h.started_ms===null?null:Number(h.started_ms);m?(i.push(w),I!==null&&u.push(I)):(a.push(w),I!==null&&l.push(I))}let p={treated:i.length,control:a.length},f={experimentId:n.id,instructionId:n.instructionId,projectPath:n.projectPath,status:n.status,assigned:s,measured:p,contentChanged:r};if(r)return{...f,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{...f,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 _=al(u,l);if(_>hs)return{...f,delta:null,ci:null,significant:!1,resolution:"inconclusive",timeSeparation:_,randomisationSuspect:!0,reason:`arms are time-separated (${_.toFixed(2)} > ${hs}) \u2014 randomisation looks broken, not merely confounded`};let v=dl(i.map(h=>({score:h})),a.map(h=>({score:h})),{minN:10});return{...f,delta:v.delta,ci:v.ci,significant:v.significant,resolution:v.significant?"resolved":"inconclusive",timeSeparation:_,randomisationSuspect:!1,reason:v.significant?null:"the interval still spans zero \u2014 more sessions, or the effect is small"}}c(Jc,"buildArmVerdict");ws();var $N=new Set(["cmd","cmds","command","commands","host","hostname","url","uri","todo","tbd","xxx","placeholder","insert","fixme"]),qN=/(?<![A-Za-z0-9])<([A-Za-z][^<>\n]{0,78}[A-Za-z0-9._/-])>/g,UN=/\{\{\s*[^{}\n]{1,80}\s*\}\}/g,HN=/_{3,}/g,BN=/[\s:|/]|\.\.\./,FN=/^[a-z][a-z0-9+.-]*:\/\//i;function Ni(e,t=10){let n=[],r=new Set,o=c((s,i)=>{r.has(s)||n.length>=t||(r.add(s),n.push({token:s,rule:i}))},"push");for(let s of e.matchAll(qN)){let i=s[1];FN.test(i)||(BN.test(i)||$N.has(i.toLowerCase()))&&o(s[0],"bracketed")}for(let s of e.matchAll(UN))o(s[0],"mustache");for(let s of e.matchAll(HN))o(s[0],"blank");return n}c(Ni,"findPlaceholders");D();import{and as wg,eq as Er,gte as WN,sql as Eo}from"drizzle-orm";var hn={MIN_SCORE:.8,KIND:"add",MAX_PER_RUN:3,MAX_PER_WINDOW:15,WINDOW_DAYS:7},Hn={minScore:{min:0,max:1},maxPerRun:{min:0,max:25},maxPerWindow:{min:0,max:100},windowDays:{min:1,max:90}};function zN(e,t){let{min:n,max:r}=Hn[e];return Number.isFinite(t)?Math.min(r,Math.max(n,t)):hn[VN[e]]}c(zN,"clampLimit");var VN={minScore:"MIN_SCORE",maxPerRun:"MAX_PER_RUN",maxPerWindow:"MAX_PER_WINDOW",windowDays:"WINDOW_DAYS"};async function ji(e,t){if(t){let[r]=await d.select({override:Eo`${C.metadata}->>'autoAcceptSuggestions'`}).from(C).where(Er(C.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(Er(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"}}c(ji,"resolveAutoAcceptConsent");async function Ao(e,t){let n={minScore:hn.MIN_SCORE,maxPerRun:hn.MAX_PER_RUN,maxPerWindow:hn.MAX_PER_WINDOW,windowDays:hn.WINDOW_DAYS,kind:hn.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(Er(T.id,e));if(Yv(n,r??null,"account"),t){let[o]=await d.select({minScore:Eo`(${C.metadata}->'autoAcceptLimits'->>'minScore')::real`,maxPerRun:Eo`(${C.metadata}->'autoAcceptLimits'->>'maxPerRun')::int`,maxPerWindow:Eo`(${C.metadata}->'autoAcceptLimits'->>'maxPerWindow')::int`,windowDays:Eo`(${C.metadata}->'autoAcceptLimits'->>'windowDays')::int`}).from(C).where(Er(C.id,t));Yv(n,o??null,"project")}return n}c(Ao,"resolveAutoAcceptLimits");function Yv(e,t,n){if(t)for(let r of Object.keys(Hn)){let o=t[r];o!=null&&(e[r]=zN(r,Number(o)),e.source[r]=n)}}c(Yv,"applyOverrides");async function Pi(e,t,n,r=hn.WINDOW_DAYS,o){let s=new Date(Date.now()-r*864e5),i=wg(Er(Ge.userId,e),Er(Ge.eventType,"accepted"),Er(Ge.actor,"auto"),WN(Ge.createdAt,s)),a=o?Eo`exists (
126
+ `),s={treated:0,control:0},i=[],a=[],d=[],l=[];for(let f of o){let h=f.arm==="treated";h?s.treated++:s.control++;let v=ws(f.outcome);if(v===null)continue;let I=f.started_ms===null?null:Number(f.started_ms);h?(i.push(v),I!==null&&d.push(I)):(a.push(v),I!==null&&l.push(I))}let m={treated:i.length,control:a.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 _=ml(d,l);if(_>_s)return{...p,delta:null,ci:null,significant:!1,resolution:"inconclusive",timeSeparation:_,randomisationSuspect:!0,reason:`arms are time-separated (${_.toFixed(2)} > ${_s}) \u2014 randomisation looks broken, not merely confounded`};let w=gl(i.map(f=>({score:f})),a.map(f=>({score:f})),{minN:10});return{...p,delta:w.delta,ci:w.ci,significant:w.significant,resolution:w.significant?"resolved":"inconclusive",timeSeparation:_,randomisationSuspect:!1,reason:w.significant?null:"the interval still spans zero \u2014 more sessions, or the effect is small"}}c(Kc,"buildArmVerdict");vs();var zN=new Set(["cmd","cmds","command","commands","host","hostname","url","uri","todo","tbd","xxx","placeholder","insert","fixme"]),VN=/(?<![A-Za-z0-9])<([A-Za-z][^<>\n]{0,78}[A-Za-z0-9._/-])>/g,JN=/\{\{\s*[^{}\n]{1,80}\s*\}\}/g,KN=/_{3,}/g,GN=/[\s:|/]|\.\.\./,YN=/^[a-z][a-z0-9+.-]*:\/\//i;function ji(e,t=10){let n=[],r=new Set,o=c((s,i)=>{r.has(s)||n.length>=t||(r.add(s),n.push({token:s,rule:i}))},"push");for(let s of e.matchAll(VN)){let i=s[1];YN.test(i)||(GN.test(i)||zN.has(i.toLowerCase()))&&o(s[0],"bracketed")}for(let s of e.matchAll(JN))o(s[0],"mustache");for(let s of e.matchAll(KN))o(s[0],"blank");return n}c(ji,"findPlaceholders");O();import{and as Sg,eq as Ar,gte as XN,sql as So}from"drizzle-orm";var _n={MIN_SCORE:.8,KIND:"add",MAX_PER_RUN:3,MAX_PER_WINDOW:15,WINDOW_DAYS:7},Bn={minScore:{min:0,max:1},maxPerRun:{min:0,max:25},maxPerWindow:{min:0,max:100},windowDays:{min:1,max:90}};function QN(e,t){let{min:n,max:r}=Bn[e];return Number.isFinite(t)?Math.min(r,Math.max(n,t)):_n[ZN[e]]}c(QN,"clampLimit");var ZN={minScore:"MIN_SCORE",maxPerRun:"MAX_PER_RUN",maxPerWindow:"MAX_PER_WINDOW",windowDays:"WINDOW_DAYS"};async function Pi(e,t){if(t){let[r]=await u.select({override:So`${C.metadata}->>'autoAcceptSuggestions'`}).from(C).where(Ar(C.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:R.autoAcceptSuggestions}).from(R).where(Ar(R.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"}}c(Pi,"resolveAutoAcceptConsent");async function xo(e,t){let n={minScore:_n.MIN_SCORE,maxPerRun:_n.MAX_PER_RUN,maxPerWindow:_n.MAX_PER_WINDOW,windowDays:_n.WINDOW_DAYS,kind:_n.KIND,source:{minScore:"default",maxPerRun:"default",maxPerWindow:"default",windowDays:"default"}},[r]=await u.select({minScore:R.autoAcceptMinScore,maxPerRun:R.autoAcceptMaxPerRun,maxPerWindow:R.autoAcceptMaxPerWindow,windowDays:R.autoAcceptWindowDays}).from(R).where(Ar(R.id,e));if(sI(n,r??null,"account"),t){let[o]=await u.select({minScore:So`(${C.metadata}->'autoAcceptLimits'->>'minScore')::real`,maxPerRun:So`(${C.metadata}->'autoAcceptLimits'->>'maxPerRun')::int`,maxPerWindow:So`(${C.metadata}->'autoAcceptLimits'->>'maxPerWindow')::int`,windowDays:So`(${C.metadata}->'autoAcceptLimits'->>'windowDays')::int`}).from(C).where(Ar(C.id,t));sI(n,o??null,"project")}return n}c(xo,"resolveAutoAcceptLimits");function sI(e,t,n){if(t)for(let r of Object.keys(Bn)){let o=t[r];o!=null&&(e[r]=QN(r,Number(o)),e.source[r]=n)}}c(sI,"applyOverrides");async function Di(e,t,n,r=_n.WINDOW_DAYS,o){let s=new Date(Date.now()-r*864e5),i=Sg(Ar(Ge.userId,e),Ar(Ge.eventType,"accepted"),Ar(Ge.actor,"auto"),XN(Ge.createdAt,s)),a=o?So`exists (
127
127
  select 1 from instruction_suggestions s2
128
128
  join instructions i2 on i2.id = s2.instruction_id
129
129
  where s2.id = ${Ge.suggestionId}
130
130
  and i2.type = ${o}
131
- )`:void 0;if(!n){let[l]=await d.select({n:Eo`count(*)::int`}).from(Ge).where(wg(i,Er(Ge.projectPath,t),a));return l?.n??0}let[u]=await d.select({n:Eo`count(*)::int`}).from(Ge).innerJoin(x,Er(x.id,Ge.suggestionId)).where(wg(i,Er(x.projectId,n),a));return u?.n??0}c(Pi,"autoAcceptsInWindow");D();import{sql as yl,eq as JN}from"drizzle-orm";var Di=.7;async function wl(e){try{let[t]=await d.select({t:T.suggestionConfidenceThreshold}).from(T).where(JN(T.id,e)).limit(1);return typeof t?.t=="number"?t.t:Di}catch{return Di}}c(wl,"readConfidenceThreshold");var KN=5,GN=90,Xv="surface_budget",vg="declined_by_silence",YN=yl`(
131
+ )`:void 0;if(!n){let[l]=await u.select({n:So`count(*)::int`}).from(Ge).where(Sg(i,Ar(Ge.projectPath,t),a));return l?.n??0}let[d]=await u.select({n:So`count(*)::int`}).from(Ge).innerJoin(x,Ar(x.id,Ge.suggestionId)).where(Sg(i,Ar(x.projectId,n),a));return d?.n??0}c(Di,"autoAcceptsInWindow");O();import{sql as El,eq as ej}from"drizzle-orm";var Oi=.7;async function Al(e){try{let[t]=await u.select({t:R.suggestionConfidenceThreshold}).from(R).where(ej(R.id,e)).limit(1);return typeof t?.t=="number"?t.t:Oi}catch{return Oi}}c(Al,"readConfidenceThreshold");var tj=5,nj=90,iI="surface_budget",xg="declined_by_silence",rj=El`(
132
132
  SELECT count(*) FROM (
133
133
  SELECT date_trunc('hour', min(e.created_at)) AS h
134
134
  FROM instruction_suggestion_events e
@@ -143,7 +143,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
143
143
  AND e.event_type IN ('surfaced', 'surfaced_with_content')
144
144
  AND e.session_id IS NULL
145
145
  ) hours
146
- )`,Kc=yl`(${x.declinedAt} IS NULL OR ${x.declinedAt} < now() - make_interval(days => ${GN}))`,Qv=yl`(${x.declinedAt} IS NULL OR ${x.declinedReason} = ${Xv})`;async function vl(e,t){await d.execute(yl`
146
+ )`,Gc=El`(${x.declinedAt} IS NULL OR ${x.declinedAt} < now() - make_interval(days => ${nj}))`,aI=El`(${x.declinedAt} IS NULL OR ${x.declinedReason} = ${iI})`;async function Sl(e,t){await u.execute(El`
147
147
  WITH over_budget AS (
148
148
  SELECT instruction_suggestions.id
149
149
  FROM instruction_suggestions
@@ -159,12 +159,12 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
159
159
  AND instruction_suggestions.accepted_at IS NULL
160
160
  AND (instruction_suggestions.dismissed_at IS NULL
161
161
  OR instruction_suggestions.dismissed_at < now() - interval '30 days')
162
- AND ${YN} >= ${KN}
162
+ AND ${rj} >= ${tj}
163
163
  ),
164
164
  stamped AS (
165
165
  UPDATE instruction_suggestions t
166
166
  SET declined_at = now(),
167
- declined_reason = ${Xv}
167
+ declined_reason = ${iI}
168
168
  FROM over_budget o
169
169
  -- Re-checked here, not only in the CTE: under READ COMMITTED two
170
170
  -- concurrent session starts both see declined_at IS NULL, and only
@@ -174,8 +174,8 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
174
174
  RETURNING t.id, t.user_id, t.project_path
175
175
  )
176
176
  INSERT INTO instruction_suggestion_events (suggestion_id, user_id, event_type, project_path)
177
- SELECT id, user_id, ${vg}, project_path FROM stamped
178
- `)}c(vl,"sweepDeclinedBySilence");D();import{eq as Zv,sql as eI}from"drizzle-orm";var Oi={MAX_CONCURRENT:3,MAX_PER_RUN:3},Gc={maxConcurrent:{min:0,max:10},maxPerRun:{min:0,max:10}},XN={maxConcurrent:"MAX_CONCURRENT",maxPerRun:"MAX_PER_RUN"};function QN(e){for(let t=e,n=0;t&&n<4;n++){if(t.code==="42703")return!0;t=t.cause}return!1}c(QN,"isUndefinedColumn");function Ig(e,t){let{min:n,max:r}=Gc[e];return Number.isFinite(t)?Math.min(r,Math.max(n,Math.trunc(t))):Oi[XN[e]]}c(Ig,"clampTrialLimit");async function vs(e,t){let n={maxConcurrent:Oi.MAX_CONCURRENT,maxPerRun:Oi.MAX_PER_RUN,source:{maxConcurrent:"default",maxPerRun:"default"}};try{let[r]=await d.select({maxConcurrent:T.trialMaxConcurrent,maxPerRun:T.trialMaxPerRun}).from(T).where(Zv(T.id,e));tI(n,r??null,"account")}catch(r){if(!QN(r))throw r}if(t){let[r]=await d.select({maxConcurrent:eI`(${C.metadata}->'trialLimits'->>'maxConcurrent')::int`,maxPerRun:eI`(${C.metadata}->'trialLimits'->>'maxPerRun')::int`}).from(C).where(Zv(C.id,t));tI(n,r??null,"project")}return n}c(vs,"resolveTrialLimits");function tI(e,t,n){if(t)for(let r of Object.keys(Gc)){let o=t[r];o!=null&&(e[r]=Ig(r,Number(o)),e.source[r]=n)}}c(tI,"applyOverrides");function Il(e,t,n){let r=Math.max(0,e.maxConcurrent-t);if(r===0)return{slots:0,blocked:"concurrency"};if(n===0)return{slots:0,blocked:"no-candidates"};let o=Math.min(r,e.maxPerRun,n);return{slots:o,blocked:o<Math.min(r,n)?"per-run":"none"}}c(Il,"trialSlots");D();import{desc as ZN,eq as nI}from"drizzle-orm";async function Bn(e){if(!e)return null;try{let[t]=await d.select({projectId:ye.projectId}).from(ye).where(nI(ye.path,e)).orderBy(ZN(ye.lastSeen)).limit(1);if(t)return t.projectId;let[n]=await d.select({id:C.id}).from(C).where(nI(C.gitRemoteUrl,e)).limit(1);return n?.id??null}catch{return null}}c(Bn,"resolveProjectIdForPath");var Ci=new ej;Ci.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 Bn(n),o=await Ao(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,type:g.type}).from(x).innerJoin(g,Et(g.id,x.instructionId)).where(Yc(Et(x.userId,t),Et(x.projectPath,n),Et(x.kind,hn.KIND),cr`(${x.score} >= ${o.minScore} OR ${g.frontmatter}->>'source' = 'insights')`,cr`${x.acceptedAt} IS NULL`,cr`${x.dismissedAt} IS NULL`,Qv,Et(x.isStale,!1),Et(g.archived,!1),tj(g.type,["instruction","skill"]),cr`NOT EXISTS (
177
+ SELECT id, user_id, ${xg}, project_path FROM stamped
178
+ `)}c(Sl,"sweepDeclinedBySilence");O();import{eq as cI,sql as dI}from"drizzle-orm";var Ci={MAX_CONCURRENT:3,MAX_PER_RUN:3},Yc={maxConcurrent:{min:0,max:10},maxPerRun:{min:0,max:10}},oj={maxConcurrent:"MAX_CONCURRENT",maxPerRun:"MAX_PER_RUN"};function sj(e){for(let t=e,n=0;t&&n<4;n++){if(t.code==="42703")return!0;t=t.cause}return!1}c(sj,"isUndefinedColumn");function Rg(e,t){let{min:n,max:r}=Yc[e];return Number.isFinite(t)?Math.min(r,Math.max(n,Math.trunc(t))):Ci[oj[e]]}c(Rg,"clampTrialLimit");async function Is(e,t){let n={maxConcurrent:Ci.MAX_CONCURRENT,maxPerRun:Ci.MAX_PER_RUN,source:{maxConcurrent:"default",maxPerRun:"default"}};try{let[r]=await u.select({maxConcurrent:R.trialMaxConcurrent,maxPerRun:R.trialMaxPerRun}).from(R).where(cI(R.id,e));uI(n,r??null,"account")}catch(r){if(!sj(r))throw r}if(t){let[r]=await u.select({maxConcurrent:dI`(${C.metadata}->'trialLimits'->>'maxConcurrent')::int`,maxPerRun:dI`(${C.metadata}->'trialLimits'->>'maxPerRun')::int`}).from(C).where(cI(C.id,t));uI(n,r??null,"project")}return n}c(Is,"resolveTrialLimits");function uI(e,t,n){if(t)for(let r of Object.keys(Yc)){let o=t[r];o!=null&&(e[r]=Rg(r,Number(o)),e.source[r]=n)}}c(uI,"applyOverrides");function xl(e,t,n){let r=Math.max(0,e.maxConcurrent-t);if(r===0)return{slots:0,blocked:"concurrency"};if(n===0)return{slots:0,blocked:"no-candidates"};let o=Math.min(r,e.maxPerRun,n);return{slots:o,blocked:o<Math.min(r,n)?"per-run":"none"}}c(xl,"trialSlots");O();import{desc as ij,eq as lI}from"drizzle-orm";async function Fn(e){if(!e)return null;try{let[t]=await u.select({projectId:ye.projectId}).from(ye).where(lI(ye.path,e)).orderBy(ij(ye.lastSeen)).limit(1);if(t)return t.projectId;let[n]=await u.select({id:C.id}).from(C).where(lI(C.gitRemoteUrl,e)).limit(1);return n?.id??null}catch{return null}}c(Fn,"resolveProjectIdForPath");var Li=new aj;Li.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 Fn(n),o=await xo(t,r),s=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,type:g.type}).from(x).innerJoin(g,At(g.id,x.instructionId)).where(Xc(At(x.userId,t),At(x.projectPath,n),At(x.kind,_n.KIND),cr`(${x.score} >= ${o.minScore} OR ${g.frontmatter}->>'source' = 'insights')`,cr`${x.acceptedAt} IS NULL`,cr`${x.dismissedAt} IS NULL`,aI,At(x.isStale,!1),At(g.archived,!1),cj(g.type,["instruction","skill"]),cr`NOT EXISTS (
179
179
  SELECT 1 FROM instruction_suggestion_events ev
180
180
  WHERE ev.suggestion_id = ${x.id}
181
181
  AND ev.event_type IN ('redundant', 'partial_overlap', 'unresolvable_reference')
@@ -185,17 +185,18 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
185
185
  WHERE e.instruction_id = ${x.instructionId}
186
186
  AND e.project_path = ${x.projectPath}
187
187
  AND e.status = 'running'
188
- )`)).orderBy(rI(x.score)),i=r??s[0]?.projectId??null,a=await ji(t,i);if(!a.allowed)return e.json({consent:a,eligible:[],refused:s.map(h=>({id:h.id,name:h.name,reason:a.reason})),budget:null});let[u,l]=await Promise.all([Pi(t,n,i,o.windowDays,"instruction"),Pi(t,n,i,o.windowDays,"skill")]),p=Math.max(0,o.maxPerWindow-u),f=[],_=[],v={instruction:0,skill:0};for(let h of s){let m=Ni(h.content??"");if(m.length>0){_.push({id:h.id,name:h.name,reason:`unfilled placeholder(s): ${m.map(E=>E.token).join(", ")}`});continue}let w=h.type??"instruction",I=w==="skill",b=v[w]??0,A=I?Number.POSITIVE_INFINITY:p;if(b>=Math.min(o.maxPerRun,A)){_.push({id:h.id,name:h.name,reason:A<=b?`budget: ${u}/${o.maxPerWindow} rules auto-accepted for this project in the last ${o.windowDays}d (${o.source.maxPerWindow} setting)`:`over the per-run cap of ${o.maxPerRun} ${I?"skills":"rules"}`});continue}v[w]=b+1,f.push({id:h.id,instructionId:h.instructionId,name:h.name,score:h.score,type:w})}return e.json({consent:a,eligible:f,refused:_,budget:{used:u,max:o.maxPerWindow,skillsUsed:l,skillsMax:null,windowDays:o.windowDays,perRun:o.maxPerRun,source:o.source}})});Ci.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:$.id,source:$.source,status:$.status,instructionId:$.instructionId,projectPath:$.projectPath}).from($).where(Yc(Et($.userId,t),Et($.status,"running"),...r?[Et($.projectPath,r)]:[])),s=[],i=0;for(let a of o)try{let u=await Jc(a.id,t);if(!u){i+=1;continue}let l=await ki({experimentId:a.id,userId:t,verdict:u,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})});Ci.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 r=await Bn(n),o=await vs(t,r),[{running:s}]=await d.select({running:cr`count(*)::int`}).from($).where(Yc(Et($.userId,t),Et($.projectPath,n),Et($.status,"running"))),i=Math.max(0,o.maxConcurrent-s),a=await d.select({id:x.id,instructionId:x.instructionId,score:x.score,name:g.name,content:g.content}).from(x).innerJoin(g,Et(g.id,x.instructionId)).where(Yc(Et(x.userId,t),Et(x.projectPath,n),Et(x.kind,"add"),cr`${x.acceptedAt} IS NULL`,cr`${x.dismissedAt} IS NULL`,cr`${x.declinedAt} IS NULL`,Et(x.isStale,!1),Et(g.archived,!1),cr`${g.type} NOT IN ('hook','mcp','subagent')`,cr`NOT EXISTS (
188
+ )`)).orderBy(mI(x.score)),i=r??s[0]?.projectId??null,a=await Pi(t,i);if(!a.allowed)return e.json({consent:a,eligible:[],refused:s.map(f=>({id:f.id,name:f.name,reason:a.reason})),budget:null});let[d,l]=await Promise.all([Di(t,n,i,o.windowDays,"instruction"),Di(t,n,i,o.windowDays,"skill")]),m=Math.max(0,o.maxPerWindow-d),p=[],_=[],w={instruction:0,skill:0};for(let f of s){let h=ji(f.content??"");if(h.length>0){_.push({id:f.id,name:f.name,reason:`unfilled placeholder(s): ${h.map(b=>b.token).join(", ")}`});continue}let v=f.type??"instruction",I=v==="skill",E=w[v]??0,A=I?Number.POSITIVE_INFINITY:m;if(E>=Math.min(o.maxPerRun,A)){_.push({id:f.id,name:f.name,reason:A<=E?`budget: ${d}/${o.maxPerWindow} rules auto-accepted for this project in the last ${o.windowDays}d (${o.source.maxPerWindow} setting)`:`over the per-run cap of ${o.maxPerRun} ${I?"skills":"rules"}`});continue}w[v]=E+1,p.push({id:f.id,instructionId:f.instructionId,name:f.name,score:f.score,type:v})}return e.json({consent:a,eligible:p,refused:_,budget:{used:d,max:o.maxPerWindow,skillsUsed:l,skillsMax:null,windowDays:o.windowDays,perRun:o.maxPerRun,source:o.source}})});Li.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:$.id,source:$.source,status:$.status,instructionId:$.instructionId,projectPath:$.projectPath}).from($).where(Xc(At($.userId,t),At($.status,"running"),...r?[At($.projectPath,r)]:[])),s=[],i=0;for(let a of o)try{let d=await Kc(a.id,t);if(!d){i+=1;continue}let l=await Ni({experimentId:a.id,userId:t,verdict:d,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})});Li.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 r=await Fn(n),o=await Is(t,r),[{running:s}]=await u.select({running:cr`count(*)::int`}).from($).where(Xc(At($.userId,t),At($.projectPath,n),At($.status,"running"))),i=Math.max(0,o.maxConcurrent-s),a=await u.select({id:x.id,instructionId:x.instructionId,score:x.score,name:g.name,content:g.content}).from(x).innerJoin(g,At(g.id,x.instructionId)).where(Xc(At(x.userId,t),At(x.projectPath,n),At(x.kind,"add"),cr`${x.acceptedAt} IS NULL`,cr`${x.dismissedAt} IS NULL`,cr`${x.declinedAt} IS NULL`,At(x.isStale,!1),At(g.archived,!1),cr`${g.type} NOT IN ('hook','mcp','subagent')`,cr`NOT EXISTS (
189
189
  SELECT 1 FROM instruction_experiments e
190
190
  WHERE e.instruction_id = ${x.instructionId}
191
191
  AND e.project_path = ${x.projectPath}
192
192
  AND e.status = 'running'
193
- )`)).orderBy(rI(x.score)).limit(50),u=[],l=[];for(let f of a){if(u.length>=Math.min(i,o.maxPerRun))break;let _=Ni(f.content??"");if(_.length>0){l.push({name:f.name,reason:`unfilled placeholder(s): ${_.map(v=>v.token).join(", ")}`});continue}u.push({id:f.id,instructionId:f.instructionId,name:f.name,score:f.score})}let{blocked:p}=Il(o,s,a.length);return e.json({candidates:u,refused:l,running:s,slots:i,limits:o,funnel:{eligible:a.length,refusedTemplates:l.length,starting:u.length,blocked:p}})});var nj=bg.object({projectPath:bg.string().min(1),instructionId:bg.string().uuid()});Ci.post("/instruction-suggestions/undo",async e=>{let t=e.get("userId"),n=nj.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,Et(g.id,x.instructionId)).where(Yc(Et(x.userId,t),Et(x.projectPath,r),Et(x.instructionId,o))).limit(1);return s?(await d.update(x).set({acceptedAt:null,dismissedAt:new Date}).where(Et(x.id,s.id)),await d.insert(Ge).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)});D();import{Hono as ij}from"hono";import{eq as Xt,and as Is,asc as aI,desc as cI,inArray as El,sql as Ar}from"drizzle-orm";D();import{createHash as rj}from"node:crypto";import{and as oI,eq as bl,inArray as oj,sql as xG}from"drizzle-orm";function sj(e,t,n){return rj("sha256").update(`${e}:${t}`).digest().readUIntBE(0,6)/0xffffffffffff<n?"treated":"control"}c(sj,"assignArm");async function sI(e){let{userId:t,projectPath:n,externalSessionId:r}=e;if(!r)return[];let o=await d.select({id:$.id,instructionId:$.instructionId,treatedShare:$.treatedShare,salt:$.salt}).from($).where(oI(bl($.userId,t),bl($.projectPath,n),bl($.status,"running")));if(o.length===0)return[];await d.insert(Fr).values(o.map(a=>({experimentId:a.id,userId:t,externalSessionId:r,arm:sj(a.salt,r,Number(a.treatedShare))}))).onConflictDoNothing();let s=await d.select({experimentId:Fr.experimentId,arm:Fr.arm}).from(Fr).where(oI(bl(Fr.externalSessionId,r),oj(Fr.experimentId,o.map(a=>a.id)))),i=new Map(s.map(a=>[a.experimentId,a.arm]));return o.flatMap(a=>{let u=i.get(a.id);return u?[{experimentId:a.id,instructionId:a.instructionId,arm:u}]:[]})}c(sI,"resolveArmsForSession");function iI(e){return new Set(e.filter(t=>t.arm==="control").map(t=>t.instructionId))}c(iI,"withheldInstructionIds");ws();var Ag=new ij,uI=2e3,aj=4,cj={"session-start":{add:3,remove:2,trim:1}},uj=["add","remove","trim"];function Eg(e){return e.length<=uI?e:e.slice(0,uI)+"... [truncated]"}c(Eg,"truncateContent");Ag.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",u=e.req.query("renderFor"),l=u?cj[u]:void 0;if(u&&!l)return e.json({error:`unknown renderFor: ${u}`},400);let p=a||l!==void 0;if(!n&&!r)return e.json({error:"projectId or projectPath is required"},400);let f=n?Xt(x.projectId,n):Xt(x.projectPath,r);try{await vl(t,Ar`${f}`)}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:Ar`(length(${g.content}) / 4)::int`,_rawContent:g.content}).from(x).innerJoin(g,Xt(x.instructionId,g.id)).where(Is(Xt(x.userId,t),f,Xt(g.archived,!1),Ar`${x.acceptedAt} IS NULL`,Ar`(${x.dismissedAt} IS NULL OR ${x.dismissedAt} < now() - interval '30 days')`,Kc)).orderBy(aI(x.isStale),cI(x.score)).limit(s),v=[];if(p){let K=new Set(_.map(B=>B.id));v=(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:Ar`(length(${g.content}) / 4)::int`,_rawContent:g.content}).from(x).innerJoin(g,Xt(x.instructionId,g.id)).where(Is(Xt(x.userId,t),f,Ar`${x.kind} <> 'add'`,Xt(g.archived,!1),Ar`${x.acceptedAt} IS NULL`,Ar`(${x.dismissedAt} IS NULL OR ${x.dismissedAt} < now() - interval '30 days')`,Kc)).orderBy(aI(x.isStale),cI(x.score)).limit(aj)).filter(B=>!K.has(B.id))}let h=i?await wl(t):Di,m=[..._,...v].map(K=>{let{_rawContent:me,...B}=K,he=i&&K.kind==="add"&&K.score>=h&&typeof me=="string"?Eg(me):null;return{...B,content:he}}),w=l?await sI({userId:t,projectPath:r??"",externalSessionId:e.req.query("sessionId")||void 0}):[],I=iI(w),b=l?await _g(t,r??""):[],A=new Set(b.filter(K=>K.decision==="never").map(K=>K.instructionId)),E=b.filter(K=>K.decision==="always"),S=new Set(b.map(K=>K.instructionId)),R=w.filter(K=>K.arm==="treated"),O=new Set(w.map(K=>K.instructionId)),W=I.size===0&&S.size===0&&O.size===0?m:m.filter(K=>!I.has(K.instructionId)&&!S.has(K.instructionId)&&!O.has(K.instructionId)),N=W,q;if(l){let K=new Map;for(let B of W){let he=B.kind??"add",P=l[he];if(P===void 0||P<=0)continue;let re=K.get(he)??[];re.length>=P||(re.push(B),K.set(he,re))}let me=K.get("add")??[];if(R.length>0){let B=new Map(R.map(P=>[P.instructionId,P.experimentId])),he=await d.select({id:g.id,name:g.name,description:g.description,tags:g.tags,instructionScope:g.scope,content:g.content}).from(g).where(Is(El(g.id,R.map(P=>P.instructionId)),Xt(g.archived,!1)));for(let P of he.reverse())me.unshift({id:`experiment:${B.get(P.id)}`,instructionId:P.id,score:1,reason:"under measurement on this project",generatedAt:new Date,isStale:!1,kind:"add",name:P.name,description:P.description,tags:P.tags,instructionScope:P.instructionScope,estimatedTokens:Math.ceil((P.content?.length??0)/4),content:i?Eg(P.content??""):null});K.set("add",me)}if(E.length>0){let B=await d.select({id:g.id,name:g.name,description:g.description,tags:g.tags,instructionScope:g.scope,content:g.content}).from(g).where(Is(El(g.id,E.map(he=>he.instructionId)),Xt(g.archived,!1)));for(let he of B.reverse())me.unshift({id:`graduated:${he.id}`,instructionId:he.id,score:1,reason:"graduated: measured to help on this project",generatedAt:new Date,isStale:!1,kind:"add",name:he.name,description:he.description,tags:he.tags,instructionScope:he.instructionScope,estimatedTokens:Math.ceil((he.content?.length??0)/4),content:i?Eg(he.content??""):null});K.set("add",me)}N=uj.flatMap(B=>K.get(B)??[]),q={addCount:me.length,costCount:(K.get("remove")??[]).length+(K.get("trim")??[]).length,highConfidenceCount:me.filter(B=>B.content!==null).length,omitted:W.length-(N.length-me.filter(B=>B.id.startsWith("graduated:")||B.id.startsWith("experiment:")).length),...I.size>0?{withheld:I.size}:{}}}let U=await d.select({eventType:Ge.eventType,count:Ar`count(*)::int`}).from(Ge).innerJoin(x,Xt(Ge.suggestionId,x.id)).where(Is(Xt(Ge.userId,t),f)).groupBy(Ge.eventType),H={};for(let K of U)H[K.eventType]=K.count;let te,de;if(!l&&r&&N.length>0){let K=[...new Set(N.map(P=>P.instructionId))],me=await d.select({id:$.id,instructionId:$.instructionId,source:$.source}).from($).where(Is(Xt($.userId,t),Xt($.projectPath,r),Xt($.status,"running"),El($.instructionId,K)));me.length>0&&(te=Object.fromEntries(me.map(P=>[P.instructionId,{id:P.id,source:P.source}])));let B=await d.select({instructionId:Q.instructionId,contentHash:Q.contentHash,projectPath:Q.projectPath,decision:Q.decision,delta:Q.delta,ciLower:Q.ciLower,ciUpper:Q.ciUpper,nTreated:Q.nTreated,nControl:Q.nControl,segment:Q.segment,decidedAt:Q.decidedAt,liveContent:g.content,liveName:g.name}).from(Q).innerJoin(g,Xt(Q.instructionId,g.id)).where(Is(Xt(Q.userId,t),El(Q.instructionId,K),Ar`${Q.projectPath} <> ${r}`)),he={};for(let P of B){let re=Kr(P.liveContent,P.liveName);re===null||re!==P.contentHash||(he[P.instructionId]??=[]).push({projectPath:P.projectPath,decision:P.decision,delta:P.delta,ciLower:P.ciLower,ciUpper:P.ciUpper,nTreated:P.nTreated,nControl:P.nControl,segment:P.segment,decidedAt:P.decidedAt})}Object.keys(he).length>0&&(de=he)}return e.json({suggestions:N,stats:H,...q?{render:q}:{},...te?{experiments:te}:{},...de?{crossProject:de}:{}})});D();import{Hono as dj}from"hono";import{z as dI}from"zod";import{eq as bs,and as lI,desc as lj,sql as _n}from"drizzle-orm";var pj=dI.object({threshold:dI.number().min(0).max(1)}),Es=new dj;Es.get("/instruction-suggestions/pending-count",async e=>{let t=e.get("userId"),n=await d.select({projectPath:x.projectPath,count:_n`count(*)::int`}).from(x).where(lI(bs(x.userId,t),_n`${x.acceptedAt} IS NULL`,_n`(${x.dismissedAt} IS NULL OR ${x.dismissedAt} < now() - interval '30 days')`,Kc)).groupBy(x.projectPath).orderBy(lj(_n`count(*)`)),r=n.reduce((o,s)=>o+s.count,0);return e.json({total:r,byProject:n.slice(0,5)})});Es.get("/instruction-suggestions/stats",async e=>{let t=e.get("userId"),[n]=await d.select({total:_n`count(*)::int`,accepted:_n`count(*) filter (where ${x.acceptedAt} is not null)::int`,dismissed:_n`count(*) filter (where ${x.acceptedAt} is null and ${x.dismissedAt} is not null)::int`,declinedBySilence:_n`count(*) filter (where ${x.acceptedAt} is null and ${x.dismissedAt} is null and ${x.declinedAt} is not null)::int`,pending:_n`count(*) filter (where ${x.acceptedAt} is null and ${x.dismissedAt} is null and ${x.declinedAt} is null)::int`,stale:_n`count(*) filter (where ${x.isStale})::int`,promoted:_n`count(*) filter (where ${x.promotedToInstructionId} is not null)::int`}).from(x).where(bs(x.userId,t)),r=await d.select({eventType:Ge.eventType,count:_n`count(*)::int`}).from(Ge).where(bs(Ge.userId,t)).groupBy(Ge.eventType),o={surfaced:0,surfaced_with_content:0,accepted:0,dismissed:0,promoted:0,proxy_injected:0,[vg]:0};for(let u of r)o[u.eventType]=u.count;let[s]=await d.select({distinctUsersWithSuggestions:_n`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"}})});Es.get("/instruction-suggestions/confidence",async e=>{let t=e.get("userId");return e.json({threshold:await wl(t),default:Di,governs:"Minimum score at which an add-suggestion carries its instruction body into session context. Surfacing only \u2014 never a write."})});Es.put("/instruction-suggestions/confidence",async e=>{let t=e.get("userId"),n=pj.safeParse(await e.req.json().catch(()=>null));return n.success?(await d.update(T).set({suggestionConfidenceThreshold:n.data.threshold}).where(bs(T.id,t)),e.json({threshold:n.data.threshold})):e.json({error:"threshold must be a number between 0 and 1"},400)});Es.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:_n`(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,bs(x.instructionId,g.id)).where(lI(bs(x.id,n),bs(x.userId,t)));return r?e.json(r):e.json({error:"Suggestion not found"},404)});D();import{Hono as mj}from"hono";import{z as Ft}from"zod";import{eq as ur,and as Sg,or as fj,desc as gj,sql as As}from"drizzle-orm";var Xc=new mj,hj=Ft.object({projectPath:Ft.string().min(1),projectId:Ft.string().uuid().optional(),suggestions:Ft.array(Ft.object({instructionId:Ft.string().uuid(),score:Ft.number().min(0).max(1),reason:Ft.string(),kind:Ft.enum(Dd).optional()})).max(50)});async function _j(e){try{let[t]=await d.select({projectId:ye.projectId}).from(ye).where(ur(ye.path,e)).orderBy(gj(ye.lastSeen)).limit(1);return t?.projectId??null}catch{return null}}c(_j,"resolveProjectId");var yj=Ft.object({stale:Ft.boolean().default(!0)});Xc.post("/instruction-suggestions/batch-upsert",async e=>{let t=e.get("userId"),n=hj.parse(await e.req.json());if(n.suggestions.length===0)return e.json({inserted:0});let r=n.projectId??await _j(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:As`excluded.score`,reason:As`excluded.reason`,generatedAt:As`excluded.generated_at`,isStale:As`false`,dismissedAt:As`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})});Xc.post("/instruction-suggestions/mark-stale",async e=>{let t=e.get("userId"),n=await e.req.json().catch(()=>({})),r=yj.parse(n).stale,o=Sg(ur(x.userId,t),ur(x.isStale,!r),As`EXISTS (
193
+ )`)).orderBy(mI(x.score)).limit(50),d=[],l=[];for(let p of a){if(d.length>=Math.min(i,o.maxPerRun))break;let _=ji(p.content??"");if(_.length>0){l.push({name:p.name,reason:`unfilled placeholder(s): ${_.map(w=>w.token).join(", ")}`});continue}d.push({id:p.id,instructionId:p.instructionId,name:p.name,score:p.score})}let{blocked:m}=xl(o,s,a.length);return e.json({candidates:d,refused:l,running:s,slots:i,limits:o,funnel:{eligible:a.length,refusedTemplates:l.length,starting:d.length,blocked:m}})});var dj=Tg.object({projectPath:Tg.string().min(1),instructionId:Tg.string().uuid()});Li.post("/instruction-suggestions/undo",async e=>{let t=e.get("userId"),n=dj.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,At(g.id,x.instructionId)).where(Xc(At(x.userId,t),At(x.projectPath,r),At(x.instructionId,o))).limit(1);return s?(await u.update(x).set({acceptedAt:null,dismissedAt:new Date}).where(At(x.id,s.id)),await u.insert(Ge).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 pj}from"hono";import{eq as Qt,and as bs,asc as hI,desc as _I,inArray as Tl,sql as Sr}from"drizzle-orm";O();import{createHash as uj}from"node:crypto";import{and as pI,eq as Rl,inArray as lj,sql as LG}from"drizzle-orm";function mj(e,t,n){return uj("sha256").update(`${e}:${t}`).digest().readUIntBE(0,6)/0xffffffffffff<n?"treated":"control"}c(mj,"assignArm");async function fI(e){let{userId:t,projectPath:n,externalSessionId:r}=e;if(!r)return[];let o=await u.select({id:$.id,instructionId:$.instructionId,treatedShare:$.treatedShare,salt:$.salt}).from($).where(pI(Rl($.userId,t),Rl($.projectPath,n),Rl($.status,"running")));if(o.length===0)return[];await u.insert(zr).values(o.map(a=>({experimentId:a.id,userId:t,externalSessionId:r,arm:mj(a.salt,r,Number(a.treatedShare))}))).onConflictDoNothing();let s=await u.select({experimentId:zr.experimentId,arm:zr.arm}).from(zr).where(pI(Rl(zr.externalSessionId,r),lj(zr.experimentId,o.map(a=>a.id)))),i=new Map(s.map(a=>[a.experimentId,a.arm]));return o.flatMap(a=>{let d=i.get(a.id);return d?[{experimentId:a.id,instructionId:a.instructionId,arm:d}]:[]})}c(fI,"resolveArmsForSession");function gI(e){return new Set(e.filter(t=>t.arm==="control").map(t=>t.instructionId))}c(gI,"withheldInstructionIds");vs();var Ng=new pj,yI=2e3,fj=4,gj={"session-start":{add:3,remove:2,trim:1}},hj=["add","remove","trim"];function kg(e){return e.length<=yI?e:e.slice(0,yI)+"... [truncated]"}c(kg,"truncateContent");Ng.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",d=e.req.query("renderFor"),l=d?gj[d]:void 0;if(d&&!l)return e.json({error:`unknown renderFor: ${d}`},400);let m=a||l!==void 0;if(!n&&!r)return e.json({error:"projectId or projectPath is required"},400);let p=n?Qt(x.projectId,n):Qt(x.projectPath,r);try{await Sl(t,Sr`${p}`)}catch{}let _=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:Sr`(length(${g.content}) / 4)::int`,_rawContent:g.content}).from(x).innerJoin(g,Qt(x.instructionId,g.id)).where(bs(Qt(x.userId,t),p,Qt(g.archived,!1),Sr`${x.acceptedAt} IS NULL`,Sr`(${x.dismissedAt} IS NULL OR ${x.dismissedAt} < now() - interval '30 days')`,Gc)).orderBy(hI(x.isStale),_I(x.score)).limit(s),w=[];if(m){let V=new Set(_.map(F=>F.id));w=(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:Sr`(length(${g.content}) / 4)::int`,_rawContent:g.content}).from(x).innerJoin(g,Qt(x.instructionId,g.id)).where(bs(Qt(x.userId,t),p,Sr`${x.kind} <> 'add'`,Qt(g.archived,!1),Sr`${x.acceptedAt} IS NULL`,Sr`(${x.dismissedAt} IS NULL OR ${x.dismissedAt} < now() - interval '30 days')`,Gc)).orderBy(hI(x.isStale),_I(x.score)).limit(fj)).filter(F=>!V.has(F.id))}let f=i?await Al(t):Oi,h=[..._,...w].map(V=>{let{_rawContent:pe,...F}=V,he=i&&V.kind==="add"&&V.score>=f&&typeof pe=="string"?kg(pe):null;return{...F,content:he}}),v=l?await fI({userId:t,projectPath:r??"",externalSessionId:e.req.query("sessionId")||void 0}):[],I=gI(v),E=l?await Eg(t,r??""):[],A=new Set(E.filter(V=>V.decision==="never").map(V=>V.instructionId)),b=E.filter(V=>V.decision==="always"),S=new Set(E.map(V=>V.instructionId)),T=v.filter(V=>V.arm==="treated"),P=new Set(v.map(V=>V.instructionId)),H=I.size===0&&S.size===0&&P.size===0?h:h.filter(V=>!I.has(V.instructionId)&&!S.has(V.instructionId)&&!P.has(V.instructionId)),N=H,U;if(l){let V=new Map;for(let F of H){let he=F.kind??"add",D=l[he];if(D===void 0||D<=0)continue;let re=V.get(he)??[];re.length>=D||(re.push(F),V.set(he,re))}let pe=V.get("add")??[];if(T.length>0){let F=new Map(T.map(D=>[D.instructionId,D.experimentId])),he=await u.select({id:g.id,name:g.name,description:g.description,tags:g.tags,instructionScope:g.scope,content:g.content}).from(g).where(bs(Tl(g.id,T.map(D=>D.instructionId)),Qt(g.archived,!1)));for(let D of he.reverse())pe.unshift({id:`experiment:${F.get(D.id)}`,instructionId:D.id,score:1,reason:"under measurement on this project",generatedAt:new Date,isStale:!1,kind:"add",name:D.name,description:D.description,tags:D.tags,instructionScope:D.instructionScope,estimatedTokens:Math.ceil((D.content?.length??0)/4),content:i?kg(D.content??""):null});V.set("add",pe)}if(b.length>0){let F=await u.select({id:g.id,name:g.name,description:g.description,tags:g.tags,instructionScope:g.scope,content:g.content}).from(g).where(bs(Tl(g.id,b.map(he=>he.instructionId)),Qt(g.archived,!1)));for(let he of F.reverse())pe.unshift({id:`graduated:${he.id}`,instructionId:he.id,score:1,reason:"graduated: measured to help on this project",generatedAt:new Date,isStale:!1,kind:"add",name:he.name,description:he.description,tags:he.tags,instructionScope:he.instructionScope,estimatedTokens:Math.ceil((he.content?.length??0)/4),content:i?kg(he.content??""):null});V.set("add",pe)}N=hj.flatMap(F=>V.get(F)??[]),U={addCount:pe.length,costCount:(V.get("remove")??[]).length+(V.get("trim")??[]).length,highConfidenceCount:pe.filter(F=>F.content!==null).length,omitted:H.length-(N.length-pe.filter(F=>F.id.startsWith("graduated:")||F.id.startsWith("experiment:")).length),...I.size>0?{withheld:I.size}:{}}}let q=await u.select({eventType:Ge.eventType,count:Sr`count(*)::int`}).from(Ge).innerJoin(x,Qt(Ge.suggestionId,x.id)).where(bs(Qt(Ge.userId,t),p)).groupBy(Ge.eventType),B={};for(let V of q)B[V.eventType]=V.count;let J,ce;if(!l&&r&&N.length>0){let V=[...new Set(N.map(D=>D.instructionId))],pe=await u.select({id:$.id,instructionId:$.instructionId,source:$.source}).from($).where(bs(Qt($.userId,t),Qt($.projectPath,r),Qt($.status,"running"),Tl($.instructionId,V)));pe.length>0&&(J=Object.fromEntries(pe.map(D=>[D.instructionId,{id:D.id,source:D.source}])));let F=await u.select({instructionId:Z.instructionId,contentHash:Z.contentHash,projectPath:Z.projectPath,decision:Z.decision,delta:Z.delta,ciLower:Z.ciLower,ciUpper:Z.ciUpper,nTreated:Z.nTreated,nControl:Z.nControl,segment:Z.segment,decidedAt:Z.decidedAt,liveContent:g.content,liveName:g.name}).from(Z).innerJoin(g,Qt(Z.instructionId,g.id)).where(bs(Qt(Z.userId,t),Tl(Z.instructionId,V),Sr`${Z.projectPath} <> ${r}`)),he={};for(let D of F){let re=Yr(D.liveContent,D.liveName);re===null||re!==D.contentHash||(he[D.instructionId]??=[]).push({projectPath:D.projectPath,decision:D.decision,delta:D.delta,ciLower:D.ciLower,ciUpper:D.ciUpper,nTreated:D.nTreated,nControl:D.nControl,segment:D.segment,decidedAt:D.decidedAt})}Object.keys(he).length>0&&(ce=he)}return e.json({suggestions:N,stats:B,...U?{render:U}:{},...J?{experiments:J}:{},...ce?{crossProject:ce}:{}})});O();import{Hono as _j}from"hono";import{z as wI}from"zod";import{eq as Es,and as vI,desc as yj,sql as yn}from"drizzle-orm";var wj=wI.object({threshold:wI.number().min(0).max(1)}),As=new _j;As.get("/instruction-suggestions/pending-count",async e=>{let t=e.get("userId"),n=await u.select({projectPath:x.projectPath,count:yn`count(*)::int`}).from(x).where(vI(Es(x.userId,t),yn`${x.acceptedAt} IS NULL`,yn`(${x.dismissedAt} IS NULL OR ${x.dismissedAt} < now() - interval '30 days')`,Gc)).groupBy(x.projectPath).orderBy(yj(yn`count(*)`)),r=n.reduce((o,s)=>o+s.count,0);return e.json({total:r,byProject:n.slice(0,5)})});As.get("/instruction-suggestions/stats",async e=>{let t=e.get("userId"),[n]=await u.select({total:yn`count(*)::int`,accepted:yn`count(*) filter (where ${x.acceptedAt} is not null)::int`,dismissed:yn`count(*) filter (where ${x.acceptedAt} is null and ${x.dismissedAt} is not null)::int`,declinedBySilence:yn`count(*) filter (where ${x.acceptedAt} is null and ${x.dismissedAt} is null and ${x.declinedAt} is not null)::int`,pending:yn`count(*) filter (where ${x.acceptedAt} is null and ${x.dismissedAt} is null and ${x.declinedAt} is null)::int`,stale:yn`count(*) filter (where ${x.isStale})::int`,promoted:yn`count(*) filter (where ${x.promotedToInstructionId} is not null)::int`}).from(x).where(Es(x.userId,t)),r=await u.select({eventType:Ge.eventType,count:yn`count(*)::int`}).from(Ge).where(Es(Ge.userId,t)).groupBy(Ge.eventType),o={surfaced:0,surfaced_with_content:0,accepted:0,dismissed:0,promoted:0,proxy_injected:0,[xg]:0};for(let d of r)o[d.eventType]=d.count;let[s]=await u.select({distinctUsersWithSuggestions:yn`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"}})});As.get("/instruction-suggestions/confidence",async e=>{let t=e.get("userId");return e.json({threshold:await Al(t),default:Oi,governs:"Minimum score at which an add-suggestion carries its instruction body into session context. Surfacing only \u2014 never a write."})});As.put("/instruction-suggestions/confidence",async e=>{let t=e.get("userId"),n=wj.safeParse(await e.req.json().catch(()=>null));return n.success?(await u.update(R).set({suggestionConfidenceThreshold:n.data.threshold}).where(Es(R.id,t)),e.json({threshold:n.data.threshold})):e.json({error:"threshold must be a number between 0 and 1"},400)});As.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:yn`(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,Es(x.instructionId,g.id)).where(vI(Es(x.id,n),Es(x.userId,t)));return r?e.json(r):e.json({error:"Suggestion not found"},404)});O();import{Hono as vj}from"hono";import{z as Wt}from"zod";import{eq as dr,and as jg,or as Ij,desc as bj,sql as Ss}from"drizzle-orm";var Qc=new vj,Ej=Wt.object({projectPath:Wt.string().min(1),projectId:Wt.string().uuid().optional(),suggestions:Wt.array(Wt.object({instructionId:Wt.string().uuid(),score:Wt.number().min(0).max(1),reason:Wt.string(),kind:Wt.enum(qu).optional()})).max(50)});async function Aj(e){try{let[t]=await u.select({projectId:ye.projectId}).from(ye).where(dr(ye.path,e)).orderBy(bj(ye.lastSeen)).limit(1);return t?.projectId??null}catch{return null}}c(Aj,"resolveProjectId");var Sj=Wt.object({stale:Wt.boolean().default(!0)});Qc.post("/instruction-suggestions/batch-upsert",async e=>{let t=e.get("userId"),n=Ej.parse(await e.req.json());if(n.suggestions.length===0)return e.json({inserted:0});let r=n.projectId??await Aj(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:Ss`excluded.score`,reason:Ss`excluded.reason`,generatedAt:Ss`excluded.generated_at`,isStale:Ss`false`,dismissedAt:Ss`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})});Qc.post("/instruction-suggestions/mark-stale",async e=>{let t=e.get("userId"),n=await e.req.json().catch(()=>({})),r=Sj.parse(n).stale,o=jg(dr(x.userId,t),dr(x.isStale,!r),Ss`EXISTS (
194
194
  SELECT 1 FROM instructions i
195
195
  WHERE i.id = ${x.instructionId}
196
196
  AND i.type = 'skill'
197
197
  AND coalesce(i.frontmatter->>'source', '') <> 'insights'
198
- )`),s=await d.update(x).set({isStale:r}).where(o).returning({id:x.id});return e.json({ok:!0,stale:r,marked:r?s.length:0,cleared:r?0:s.length})});var wj=Ft.object({eventType:Ft.enum(["surfaced","surfaced_with_content","accepted","dismissed","promoted","proxy_injected","redundant","partial_overlap","unresolvable_reference"]),tool:Ft.string().optional(),sessionId:Ft.string().uuid().optional(),projectPath:Ft.string().min(1),instructionId:Ft.string().uuid().optional(),actor:Ft.enum(["human","auto"]).default("human")});Xc.post("/instruction-suggestions/:id/events",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=wj.parse(await e.req.json()),[o]=await d.select().from(x).where(Sg(ur(x.id,n),ur(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 d.select({id:g.id}).from(g).where(Sg(ur(g.id,r.instructionId),fj(ur(g.createdBy,t),ur(g.scope,"public")))).limit(1);if(!a)return e.json({error:"instructionId not found",code:"INVALID_INSTRUCTION"},400);i=a.id}if(await d.insert(Ge).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(ur(x.id,n));else if(r.eventType==="dismissed")await d.update(x).set({dismissedAt:new Date}).where(ur(x.id,n));else if(r.eventType==="surfaced"||r.eventType==="surfaced_with_content")try{await vl(t,As`${ur(x.id,n)}`)}catch{}return e.json({ok:!0})});D();import{Hono as bj}from"hono";import{z as Qc}from"zod";import{eq as Li,and as mI,desc as fI,sql as Sl}from"drizzle-orm";ws();D();ws();import{randomUUID as vj}from"node:crypto";import{and as Al,eq as Dn,sql as xg}from"drizzle-orm";var Ij=.8;async function pI(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(Dn(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=Kr(i.content,i.name);if(!a)return{ok:!1,code:"no_body",reason:"instruction body could not be extracted from its content"};let[u]=await d.select({id:Q.id}).from(Q).where(Al(Dn(Q.instructionId,n),Dn(Q.contentHash,a),Dn(Q.projectPath,r)));if(u)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 d.select({id:x.id}).from(x).where(Al(Dn(x.userId,t),Dn(x.instructionId,n),Dn(x.projectPath,r),xg`${x.acceptedAt} IS NULL`,xg`${x.dismissedAt} IS NULL`,xg`${x.score} >= ${Ij}`));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 d.select({id:$.id}).from($).where(Al(Dn($.instructionId,n),Dn($.projectPath,r),Dn($.status,"running")));if(l)return{ok:!0,experimentId:l.id,existing:!0};try{let[p]=await d.insert($).values({userId:t,instructionId:n,projectPath:r,status:"running",treatedShare:String(s),salt:vj(),contentHash:a,source:o}).returning({id:$.id});return{ok:!0,experimentId:p.id,existing:!1}}catch(p){let[f]=await d.select({id:$.id}).from($).where(Al(Dn($.instructionId,n),Dn($.projectPath,r),Dn($.status,"running")));if(f)return{ok:!0,experimentId:f.id,existing:!0};throw p}}c(pI,"nominateExperiment");var Mi=new bj;Mi.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=mI(Li($.userId,t),n?Li($.projectPath,n):Sl`true`),s=await d.select({id:$.id,instructionId:$.instructionId,instructionName:g.name,projectPath:$.projectPath,status:$.status,source:$.source,instructionSource:Sl`${g.frontmatter}->>'source'`,stoppedReason:$.stoppedReason,createdAt:$.createdAt}).from($).innerJoin(g,Li($.instructionId,g.id)).where(o).orderBy(fI($.createdAt)).limit(r),[{total:i}]=await d.select({total:Sl`count(*)::int`}).from($).where(o),a=await Promise.all(s.map(async l=>{let p=await Jc(l.id,t),f=l.status,_=l.stoppedReason;if(p&&l.status==="running")try{let v=await ki({experimentId:l.id,userId:t,verdict:p,source:l.source,status:l.status});v&&(f="stopped",_=v)}catch{}return{...l,status:f,stoppedReason:_,verdict:p}})),u=await _l(a.map(l=>l.id));return e.json({experiments:a.map(l=>({...l,graduation:u.get(l.id)??null})),total:i})});var Ej=Qc.object({instructionId:Qc.string().uuid(),projectPath:Qc.string().min(1),source:Qc.enum(["manual","groom","trial","borrow"]).default("manual"),treatedShare:Qc.number().gt(0).lt(1).optional()});Mi.post("/instruction-experiments",async e=>{let t=e.get("userId"),n=Ej.safeParse(await e.req.json().catch(()=>({})));if(!n.success)return e.json({error:n.error.flatten()},400);let r=await pI({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)});Mi.get("/instruction-experiments/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await Jc(n,t);if(!r)return e.json({error:"not found"},404);try{let[s]=await d.select({source:$.source,status:$.status}).from($).where(Li($.id,n));s&&await ki({experimentId:n,userId:t,verdict:r,source:s.source,status:s.status})}catch{}let o=await _l([n]);return e.json({verdict:r,graduation:o.get(n)??null})});Mi.get("/instruction-verdicts",async e=>{let t=e.get("userId"),n=e.req.query("instructionId"),r=await d.select({id:Q.id,instructionId:Q.instructionId,contentHash:Q.contentHash,projectPath:Q.projectPath,decision:Q.decision,delta:Q.delta,ciLower:Q.ciLower,ciUpper:Q.ciUpper,nTreated:Q.nTreated,nControl:Q.nControl,decidedAt:Q.decidedAt}).from(Q).where(mI(Li(Q.userId,t),n?Li(Q.instructionId,n):Sl`true`)).orderBy(fI(Q.decidedAt)).limit(50);return e.json({verdicts:r,total:r.length})});var So=new Aj;So.route("/",Ci);So.route("/",Ag);So.route("/",Es);So.route("/",Xc);So.route("/",Mi);import{Hono as zD}from"hono";import{Hono as hD}from"hono";D();import{Hono as Lj}from"hono";import{z as Fn}from"zod";import{eq as zt,and as Bi,desc as bI,sql as Sr,or as EI,gte as Mj,ne as $j}from"drizzle-orm";function gI(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(/\/+$/,""),u=a.indexOf("/"),l=a.slice(0,u).toLowerCase(),p=a.slice(u+1);return p?`${l}/${p}`:null}let n=t,r=/^([\w.-]+@)?([\w.-]+):([^/].*)$/.exec(t);if(r&&!t.includes("://")){let[,,a,u]=r;n=`ssh://${a}/${u}`}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}`}c(gI,"canonicalizeRemote");var Sj=new Set(["","unknown","<synthetic>"]);function Ss(e){if(typeof e!="string")return null;let t=e.trim();return Sj.has(t)?null:t}c(Ss,"resolveModelId");var xj=["claudeCodeVersion","codexCliVersion"];function $i(e){if(typeof e!="object"||e===null)return null;let t=e;for(let n of xj){let r=Ss(t[n]);if(r!==null)return r}return null}c($i,"resolveHarnessVersion");D();import{eq as Tg,and as Pj,sql as II}from"drizzle-orm";D();import{randomUUID as qi}from"node:crypto";import{eq as Wt,and as Zc,gt as Tj,sql as hI}from"drizzle-orm";var Rj=6e4;async function Ui(e){try{let t=new Date(Date.now()-Rj),[n]=await d.select({exists:hI`1`}).from(fe).where(Zc(Wt(fe.userId,e),Wt(fe.workerType,"cli-worker"),Tj(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}}c(Ui,"hasLiveWorker");async function Ot(e){let t=!await Ui(e.userId),n=qi(),r={...e.payload,mirrorId:n};switch(e.taskName){case"process_eval":case"process_conversation":{await d.insert(je).values({...e.mirror,id:n,status:"pending",taskKind:e.taskName,payload:r});break}case"process_insights":{await d.insert(z).values({...e.mirror,id:n,status:"pending",taskKind:e.taskName,payload:r});break}case"process_launch":{await d.insert(ue).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(yd).values({...e.mirror,id:n,status:"pending",taskKind:e.taskName,payload:r});break}}return{id:n,noLiveWorker:t}}c(Ot,"enqueueJob");async function xl(e){let t=`goal-${e.sessionId}-${e.milestone}`,[n]=await d.select({id:Pe.id}).from(Pe).where(Zc(Wt(Pe.userId,e.userId),Wt(Pe.taskKind,"process_session_goal"),Wt(Pe.dedupeKey,t),Wt(Pe.status,"pending"))).limit(1);if(n)return;let r=qi();await d.insert(Pe).values({id:r,userId:e.userId,taskKind:"process_session_goal",payload:{sessionId:e.sessionId,milestone:e.milestone,mirrorId:r},dedupeKey:t})}c(xl,"enqueueSessionGoalJob");async function _I(e){let t=`distill-${e.sessionId}`,[n]=await d.select({id:Pe.id}).from(Pe).where(Zc(Wt(Pe.userId,e.userId),Wt(Pe.taskKind,"distill_memories"),Wt(Pe.dedupeKey,t),Wt(Pe.status,"pending"))).limit(1);if(n)return;let r=qi();await d.insert(Pe).values({id:r,userId:e.userId,taskKind:"distill_memories",payload:{sessionId:e.sessionId,mirrorId:r},dedupeKey:t})}c(_I,"enqueueDistillMemoriesJob");async function yI(e){let t=!await Ui(e.userId),n=`run-cleanup:${e.runId}`,[r]=await d.select({id:Pe.id}).from(Pe).where(Zc(Wt(Pe.userId,e.userId),Wt(Pe.taskKind,"process_run_cleanup"),Wt(Pe.dedupeKey,n),Wt(Pe.status,"pending"))).limit(1);if(r)return{jobId:r.id,noLiveWorker:t};let o=qi();return await d.insert(Pe).values({id:o,userId:e.userId,taskKind:"process_run_cleanup",payload:{runId:e.runId,mirrorId:o},dedupeKey:n}),{jobId:o,noLiveWorker:t}}c(yI,"enqueueRunCleanupJob");async function wI(e){let t=`judge-review:${e.evalTargetId}`,n=qi();await d.execute(hI`
198
+ )`),s=await u.update(x).set({isStale:r}).where(o).returning({id:x.id});return e.json({ok:!0,stale:r,marked:r?s.length:0,cleared:r?0:s.length})});var xj=Wt.object({eventType:Wt.enum(["surfaced","surfaced_with_content","accepted","dismissed","promoted","proxy_injected","redundant","partial_overlap","unresolvable_reference"]),tool:Wt.string().optional(),sessionId:Wt.string().uuid().optional(),projectPath:Wt.string().min(1),instructionId:Wt.string().uuid().optional(),actor:Wt.enum(["human","auto"]).default("human")});Qc.post("/instruction-suggestions/:id/events",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=xj.parse(await e.req.json()),[o]=await u.select().from(x).where(jg(dr(x.id,n),dr(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(jg(dr(g.id,r.instructionId),Ij(dr(g.createdBy,t),dr(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(Ge).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(dr(x.id,n));else if(r.eventType==="dismissed")await u.update(x).set({dismissedAt:new Date}).where(dr(x.id,n));else if(r.eventType==="surfaced"||r.eventType==="surfaced_with_content")try{await Sl(t,Ss`${dr(x.id,n)}`)}catch{}return e.json({ok:!0})});O();import{Hono as kj}from"hono";import{z as Zc}from"zod";import{eq as Mi,and as bI,desc as EI,sql as Nl}from"drizzle-orm";vs();O();vs();import{randomUUID as Rj}from"node:crypto";import{and as kl,eq as Dn,sql as Pg}from"drizzle-orm";var Tj=.8;async function II(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(Dn(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=Yr(i.content,i.name);if(!a)return{ok:!1,code:"no_body",reason:"instruction body could not be extracted from its content"};let[d]=await u.select({id:Z.id}).from(Z).where(kl(Dn(Z.instructionId,n),Dn(Z.contentHash,a),Dn(Z.projectPath,r)));if(d)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 u.select({id:x.id}).from(x).where(kl(Dn(x.userId,t),Dn(x.instructionId,n),Dn(x.projectPath,r),Pg`${x.acceptedAt} IS NULL`,Pg`${x.dismissedAt} IS NULL`,Pg`${x.score} >= ${Tj}`));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 u.select({id:$.id}).from($).where(kl(Dn($.instructionId,n),Dn($.projectPath,r),Dn($.status,"running")));if(l)return{ok:!0,experimentId:l.id,existing:!0};try{let[m]=await u.insert($).values({userId:t,instructionId:n,projectPath:r,status:"running",treatedShare:String(s),salt:Rj(),contentHash:a,source:o}).returning({id:$.id});return{ok:!0,experimentId:m.id,existing:!1}}catch(m){let[p]=await u.select({id:$.id}).from($).where(kl(Dn($.instructionId,n),Dn($.projectPath,r),Dn($.status,"running")));if(p)return{ok:!0,experimentId:p.id,existing:!0};throw m}}c(II,"nominateExperiment");var $i=new kj;$i.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=bI(Mi($.userId,t),n?Mi($.projectPath,n):Nl`true`),s=await u.select({id:$.id,instructionId:$.instructionId,instructionName:g.name,projectPath:$.projectPath,status:$.status,source:$.source,instructionSource:Nl`${g.frontmatter}->>'source'`,stoppedReason:$.stoppedReason,createdAt:$.createdAt}).from($).innerJoin(g,Mi($.instructionId,g.id)).where(o).orderBy(EI($.createdAt)).limit(r),[{total:i}]=await u.select({total:Nl`count(*)::int`}).from($).where(o),a=await Promise.all(s.map(async l=>{let m=await Kc(l.id,t),p=l.status,_=l.stoppedReason;if(m&&l.status==="running")try{let w=await Ni({experimentId:l.id,userId:t,verdict:m,source:l.source,status:l.status});w&&(p="stopped",_=w)}catch{}return{...l,status:p,stoppedReason:_,verdict:m}})),d=await bl(a.map(l=>l.id));return e.json({experiments:a.map(l=>({...l,graduation:d.get(l.id)??null})),total:i})});var Nj=Zc.object({instructionId:Zc.string().uuid(),projectPath:Zc.string().min(1),source:Zc.enum(["manual","groom","trial","borrow"]).default("manual"),treatedShare:Zc.number().gt(0).lt(1).optional()});$i.post("/instruction-experiments",async e=>{let t=e.get("userId"),n=Nj.safeParse(await e.req.json().catch(()=>({})));if(!n.success)return e.json({error:n.error.flatten()},400);let r=await II({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)});$i.get("/instruction-experiments/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await Kc(n,t);if(!r)return e.json({error:"not found"},404);try{let[s]=await u.select({source:$.source,status:$.status}).from($).where(Mi($.id,n));s&&await Ni({experimentId:n,userId:t,verdict:r,source:s.source,status:s.status})}catch{}let o=await bl([n]);return e.json({verdict:r,graduation:o.get(n)??null})});$i.get("/instruction-verdicts",async e=>{let t=e.get("userId"),n=e.req.query("instructionId"),r=await u.select({id:Z.id,instructionId:Z.instructionId,contentHash:Z.contentHash,projectPath:Z.projectPath,decision:Z.decision,delta:Z.delta,ciLower:Z.ciLower,ciUpper:Z.ciUpper,nTreated:Z.nTreated,nControl:Z.nControl,decidedAt:Z.decidedAt}).from(Z).where(bI(Mi(Z.userId,t),n?Mi(Z.instructionId,n):Nl`true`)).orderBy(EI(Z.decidedAt)).limit(50);return e.json({verdicts:r,total:r.length})});var Ro=new jj;Ro.route("/",Li);Ro.route("/",Ng);Ro.route("/",As);Ro.route("/",Qc);Ro.route("/",$i);import{Hono as ZD}from"hono";import{Hono as AD}from"hono";O();import{Hono as Fj}from"hono";import{z as Wn}from"zod";import{eq as Vt,and as Fi,desc as jI,sql as xr,or as PI,gte as Wj,ne as zj}from"drizzle-orm";function Ot(e){let t=e;for(;t&&typeof t=="object";){let n=t.code;if(typeof n=="string")return n;t=t.cause}}c(Ot,"findPgCode");function To(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(`
199
+ `)}c(To,"findPgMessage");function AI(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(/\/+$/,""),d=a.indexOf("/"),l=a.slice(0,d).toLowerCase(),m=a.slice(d+1);return m?`${l}/${m}`:null}let n=t,r=/^([\w.-]+@)?([\w.-]+):([^/].*)$/.exec(t);if(r&&!t.includes("://")){let[,,a,d]=r;n=`ssh://${a}/${d}`}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}`}c(AI,"canonicalizeRemote");var Pj=new Set(["","unknown","<synthetic>"]);function xs(e){if(typeof e!="string")return null;let t=e.trim();return Pj.has(t)?null:t}c(xs,"resolveModelId");var Dj=["claudeCodeVersion","codexCliVersion"];function qi(e){if(typeof e!="object"||e===null)return null;let t=e;for(let n of Dj){let r=xs(t[n]);if(r!==null)return r}return null}c(qi,"resolveHarnessVersion");O();import{eq as Dg,and as qj,sql as NI}from"drizzle-orm";O();import{randomUUID as Ui}from"node:crypto";import{eq as zt,and as ed,gt as Oj,sql as SI}from"drizzle-orm";var Cj=6e4;async function Hi(e){try{let t=new Date(Date.now()-Cj),[n]=await u.select({exists:SI`1`}).from(fe).where(ed(zt(fe.userId,e),zt(fe.workerType,"cli-worker"),Oj(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}}c(Hi,"hasLiveWorker");async function Ct(e){let t=!await Hi(e.userId),n=Ui(),r={...e.payload,mirrorId:n};switch(e.taskName){case"process_eval":case"process_conversation":{await u.insert(je).values({...e.mirror,id:n,status:"pending",taskKind:e.taskName,payload:r});break}case"process_insights":{await u.insert(z).values({...e.mirror,id:n,status:"pending",taskKind:e.taskName,payload:r});break}case"process_launch":{await u.insert(ue).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(Au).values({...e.mirror,id:n,status:"pending",taskKind:e.taskName,payload:r});break}}return{id:n,noLiveWorker:t}}c(Ct,"enqueueJob");async function jl(e){let t=`goal-${e.sessionId}-${e.milestone}`,[n]=await u.select({id:Pe.id}).from(Pe).where(ed(zt(Pe.userId,e.userId),zt(Pe.taskKind,"process_session_goal"),zt(Pe.dedupeKey,t),zt(Pe.status,"pending"))).limit(1);if(n)return;let r=Ui();await u.insert(Pe).values({id:r,userId:e.userId,taskKind:"process_session_goal",payload:{sessionId:e.sessionId,milestone:e.milestone,mirrorId:r},dedupeKey:t})}c(jl,"enqueueSessionGoalJob");async function xI(e){let t=`distill-${e.sessionId}`,[n]=await u.select({id:Pe.id}).from(Pe).where(ed(zt(Pe.userId,e.userId),zt(Pe.taskKind,"distill_memories"),zt(Pe.dedupeKey,t),zt(Pe.status,"pending"))).limit(1);if(n)return;let r=Ui();await u.insert(Pe).values({id:r,userId:e.userId,taskKind:"distill_memories",payload:{sessionId:e.sessionId,mirrorId:r},dedupeKey:t})}c(xI,"enqueueDistillMemoriesJob");async function RI(e){let t=!await Hi(e.userId),n=`run-cleanup:${e.runId}`,[r]=await u.select({id:Pe.id}).from(Pe).where(ed(zt(Pe.userId,e.userId),zt(Pe.taskKind,"process_run_cleanup"),zt(Pe.dedupeKey,n),zt(Pe.status,"pending"))).limit(1);if(r)return{jobId:r.id,noLiveWorker:t};let o=Ui();return await u.insert(Pe).values({id:o,userId:e.userId,taskKind:"process_run_cleanup",payload:{runId:e.runId,mirrorId:o},dedupeKey:n}),{jobId:o,noLiveWorker:t}}c(RI,"enqueueRunCleanupJob");async function TI(e){let t=`judge-review:${e.evalTargetId}`,n=Ui();await u.execute(SI`
199
200
  INSERT INTO agent_jobs (id, user_id, task_kind, payload, dedupe_key)
200
201
  SELECT ${n}, ${e.userId}, 'process_judge_review',
201
202
  ${JSON.stringify({evalTargetId:e.evalTargetId,mirrorId:n})}::jsonb,
@@ -207,9 +208,9 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
207
208
  AND dedupe_key = ${t}
208
209
  AND status = 'pending'
209
210
  )
210
- `)}c(wI,"enqueueJudgeReviewJob");async function vI(e){let t=!await Ui(e.userId),n=`memory-ab:${e.experimentId}`,[r]=await d.select({id:Pe.id}).from(Pe).where(Zc(Wt(Pe.userId,e.userId),Wt(Pe.taskKind,"memory_ab"),Wt(Pe.dedupeKey,n),Wt(Pe.status,"pending"))).limit(1);if(r)return{jobId:r.id,noLiveWorker:t};let o=qi();return await d.insert(Pe).values({id:o,userId:e.userId,taskKind:"memory_ab",payload:{experimentId:e.experimentId,mirrorId:o},dedupeKey:n}),{jobId:o,noLiveWorker:t}}c(vI,"enqueueMemoryAbJob");D();import{and as kj,eq as Tl,sql as xo}from"drizzle-orm";var Rl=2,Nj=200,jj={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"},Hi=c(e=>xo.raw(`CASE WHEN ${e} IS NULL OR ${e} = '' THEN 0
211
+ `)}c(TI,"enqueueJudgeReviewJob");async function kI(e){let t=!await Hi(e.userId),n=`memory-ab:${e.experimentId}`,[r]=await u.select({id:Pe.id}).from(Pe).where(ed(zt(Pe.userId,e.userId),zt(Pe.taskKind,"memory_ab"),zt(Pe.dedupeKey,n),zt(Pe.status,"pending"))).limit(1);if(r)return{jobId:r.id,noLiveWorker:t};let o=Ui();return await u.insert(Pe).values({id:o,userId:e.userId,taskKind:"memory_ab",payload:{experimentId:e.experimentId,mirrorId:o},dedupeKey:n}),{jobId:o,noLiveWorker:t}}c(kI,"enqueueMemoryAbJob");O();import{and as Lj,eq as Pl,sql as ko}from"drizzle-orm";var Dl=2,Mj=200,$j={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"},Bi=c(e=>ko.raw(`CASE WHEN ${e} IS NULL OR ${e} = '' THEN 0
211
212
  ELSE length(${e}) - length(replace(${e}, chr(10), ''))
212
- + CASE WHEN right(${e}, 1) = chr(10) THEN 0 ELSE 1 END END`),"nl");async function kl(e,t={}){let{userId:n,force:r=!1}=t,[o]=await d.select({id:y.id,metadata:y.metadata}).from(y).where(n?kj(Tl(y.id,e),Tl(y.userId,n)):Tl(y.id,e));if(!o)return{status:"skipped",reason:"not_found"};let s=o.metadata?.local_session_meta;if(s&&!s.derived_from_events)return{status:"skipped",reason:"hook_enriched"};let[i]=await Fe.execute(xo`
213
+ + CASE WHEN right(${e}, 1) = chr(10) THEN 0 ELSE 1 END END`),"nl");async function Ol(e,t={}){let{userId:n,force:r=!1}=t,[o]=await u.select({id:y.id,metadata:y.metadata}).from(y).where(n?Lj(Pl(y.id,e),Pl(y.userId,n)):Pl(y.id,e));if(!o)return{status:"skipped",reason:"not_found"};let s=o.metadata?.local_session_meta;if(s&&!s.derived_from_events)return{status:"skipped",reason:"hook_enriched"};let[i]=await Fe.execute(ko`
213
214
  WITH usage_rows AS (
214
215
  SELECT DISTINCT ON (coalesce(metadata->>'requestId', id::text))
215
216
  coalesce(
@@ -244,13 +245,13 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
244
245
  (SELECT max(timestamp) FROM session_events WHERE session_id = ${e}) AS last_ts,
245
246
  (SELECT coalesce(sum(input_tokens), 0)::bigint FROM usage_rows) AS input_tokens,
246
247
  (SELECT coalesce(sum(output_tokens), 0)::bigint FROM usage_rows) AS output_tokens
247
- `),a=Number(i?.total_events??0);if(!i||a===0)return{status:"skipped",reason:"no_events"};if(!r&&s?.derived_from_events&&s.derived_event_count===a&&s.derived_schema===Rl)return{status:"skipped",reason:"already_enriched"};let u=Number(i.user_message_count),l=Number(i.assistant_message_count),p=Number(i.input_tokens),f=Number(i.output_tokens),_=await Fe.execute(xo`
248
+ `),a=Number(i?.total_events??0);if(!i||a===0)return{status:"skipped",reason:"no_events"};if(!r&&s?.derived_from_events&&s.derived_event_count===a&&s.derived_schema===Dl)return{status:"skipped",reason:"already_enriched"};let d=Number(i.user_message_count),l=Number(i.assistant_message_count),m=Number(i.input_tokens),p=Number(i.output_tokens),_=await Fe.execute(ko`
248
249
  SELECT coalesce(tool_name, 'unknown') AS tool, count(*)::int AS n
249
250
  FROM session_events
250
251
  WHERE session_id = ${e}
251
252
  AND event_type IN ('tool_call', 'tool_use')
252
253
  GROUP BY 1
253
- `),v={};for(let N of _)v[N.tool]=Number(N.n);let[h]=await Fe.execute(xo`
254
+ `),w={};for(let N of _)w[N.tool]=Number(N.n);let[f]=await Fe.execute(ko`
254
255
  WITH tool_events AS (
255
256
  SELECT
256
257
  tool_name,
@@ -268,19 +269,19 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
268
269
  count(DISTINCT coalesce(tool_input->>'file_path', tool_input->>'notebook_path'))
269
270
  FILTER (WHERE tool_name IN ('Edit','MultiEdit','Write','NotebookEdit'))::int AS files_modified,
270
271
  coalesce(SUM(CASE tool_name
271
- WHEN 'Edit' THEN ${Hi("tool_input->>'new_string'")}
272
- WHEN 'Write' THEN ${Hi("tool_input->>'content'")}
273
- WHEN 'NotebookEdit' THEN ${Hi("tool_input->>'new_source'")}
272
+ WHEN 'Edit' THEN ${Bi("tool_input->>'new_string'")}
273
+ WHEN 'Write' THEN ${Bi("tool_input->>'content'")}
274
+ WHEN 'NotebookEdit' THEN ${Bi("tool_input->>'new_source'")}
274
275
  WHEN 'MultiEdit' THEN (
275
- SELECT coalesce(SUM(${Hi("e->>'new_string'")}), 0)
276
+ SELECT coalesce(SUM(${Bi("e->>'new_string'")}), 0)
276
277
  FROM jsonb_array_elements(
277
278
  CASE WHEN jsonb_typeof(tool_input->'edits') = 'array'
278
279
  THEN tool_input->'edits' ELSE '[]'::jsonb END) e)
279
280
  ELSE 0 END), 0)::int AS lines_added,
280
281
  coalesce(SUM(CASE tool_name
281
- WHEN 'Edit' THEN ${Hi("tool_input->>'old_string'")}
282
+ WHEN 'Edit' THEN ${Bi("tool_input->>'old_string'")}
282
283
  WHEN 'MultiEdit' THEN (
283
- SELECT coalesce(SUM(${Hi("e->>'old_string'")}), 0)
284
+ SELECT coalesce(SUM(${Bi("e->>'old_string'")}), 0)
284
285
  FROM jsonb_array_elements(
285
286
  CASE WHEN jsonb_typeof(tool_input->'edits') = 'array'
286
287
  THEN tool_input->'edits' ELSE '[]'::jsonb END) e)
@@ -307,7 +308,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
307
308
  -- on the way to Postgres as well.
308
309
  count(*) FILTER (WHERE left(tool_name, 5) = 'mcp__')::int AS mcp_calls
309
310
  FROM tool_events
310
- `),[m]=await Fe.execute(xo`
311
+ `),[h]=await Fe.execute(ko`
311
312
  WITH ordered AS (
312
313
  SELECT event_type, timestamp,
313
314
  lag(timestamp) OVER (ORDER BY sequence) AS prev_ts
@@ -328,11 +329,11 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
328
329
  COALESCE(jsonb_agg(EXTRACT(hour FROM timestamp AT TIME ZONE 'UTC')::int
329
330
  ORDER BY timestamp), '[]'::jsonb) AS hours,
330
331
  COALESCE(jsonb_agg(to_char(timestamp AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS"Z"')
331
- ORDER BY timestamp) FILTER (WHERE rn <= ${Nj}), '[]'::jsonb) AS timestamps,
332
+ ORDER BY timestamp) FILTER (WHERE rn <= ${Mj}), '[]'::jsonb) AS timestamps,
332
333
  COALESCE(jsonb_agg(gap ORDER BY timestamp)
333
334
  FILTER (WHERE gap IS NOT NULL), '[]'::jsonb) AS response_times
334
335
  FROM user_msgs
335
- `),w=await Fe.execute(xo`
336
+ `),v=await Fe.execute(ko`
336
337
  SELECT category, count(*)::int AS n FROM (
337
338
  SELECT CASE
338
339
  WHEN e ILIKE '%not found%' OR e ILIKE '%no such file%' OR e ILIKE '%enoent%' THEN 'not_found'
@@ -354,7 +355,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
354
355
  ) errors
355
356
  ) classified
356
357
  GROUP BY 1
357
- `),I={};for(let N of w)I[N.category]=Number(N.n);let b=await Fe.execute(xo`
358
+ `),I={};for(let N of v)I[N.category]=Number(N.n);let E=await Fe.execute(ko`
358
359
  SELECT DISTINCT coalesce(tool_input->>'file_path', tool_input->>'notebook_path') AS path
359
360
  FROM session_events
360
361
  WHERE session_id = ${e}
@@ -362,7 +363,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
362
363
  AND tool_name IN ('Edit','MultiEdit','Write','NotebookEdit')
363
364
  AND jsonb_typeof(tool_input) = 'object'
364
365
  AND coalesce(tool_input->>'file_path', tool_input->>'notebook_path') IS NOT NULL
365
- `),A={};for(let N of b){let q=N.path.split(".").pop()?.toLowerCase(),U=q?jj[q]:void 0;U&&(A[U]=(A[U]??0)+1)}let E=i.first_ts,S=i.last_ts,O={duration_minutes:E&&S?Math.round((new Date(S).getTime()-new Date(E).getTime())/6e4):0,user_message_count:u,assistant_message_count:l,tool_counts:v,languages:A,git_commits:Number(h?.git_commits??0),git_pushes:Number(h?.git_pushes??0),user_interruptions:0,tool_errors:Number(h?.tool_errors??0),lines_added:Number(h?.lines_added??0),lines_removed:Number(h?.lines_removed??0),files_modified:Number(h?.files_modified??0),message_hours:m?.hours??[],user_message_timestamps:m?.timestamps??[],user_response_times:m?.response_times??[],tool_error_categories:I,uses_task_agent:Number(h?.task_agent_calls??0)>0,uses_mcp:Number(h?.mcp_calls??0)>0,derived_from_events:!0,derived_event_count:a,derived_schema:Rl},W={metadata:xo`COALESCE(${y.metadata}, '{}'::jsonb) || ${JSON.stringify({local_session_meta:O})}::jsonb`};return(p>0||f>0)&&(W.tokenUsage={input_tokens:p,output_tokens:f}),await d.update(y).set(W).where(Tl(y.id,e)),{status:"enriched",metrics:O}}c(kl,"deriveSessionEnrichment");async function Nl(e){try{await kl(e)}catch(t){console.warn("[derive-enrichment] failed for session",e,t instanceof Error?t.message:t)}}c(Nl,"deriveSessionEnrichmentBestEffort");async function To(e,t){let n=c((r,o)=>{let s={"org_attribution.source":r};if(o)for(let[i,a]of Object.entries(o))s[`org_attribution.${i}`]=a;ym(s)},"tag");if(t)try{let[r]=await d.select({orgId:ee.orgId}).from(ee).where(Pj(Tg(ee.userId,e),Tg(ee.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(Tg(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}}c(To,"resolveCallerOrgId");async function Dj(e,t,n){if(n)try{await d.execute(II`
366
+ `),A={};for(let N of E){let U=N.path.split(".").pop()?.toLowerCase(),q=U?$j[U]:void 0;q&&(A[q]=(A[q]??0)+1)}let b=i.first_ts,S=i.last_ts,P={duration_minutes:b&&S?Math.round((new Date(S).getTime()-new Date(b).getTime())/6e4):0,user_message_count:d,assistant_message_count:l,tool_counts:w,languages:A,git_commits:Number(f?.git_commits??0),git_pushes:Number(f?.git_pushes??0),user_interruptions:0,tool_errors:Number(f?.tool_errors??0),lines_added:Number(f?.lines_added??0),lines_removed:Number(f?.lines_removed??0),files_modified:Number(f?.files_modified??0),message_hours:h?.hours??[],user_message_timestamps:h?.timestamps??[],user_response_times:h?.response_times??[],tool_error_categories:I,uses_task_agent:Number(f?.task_agent_calls??0)>0,uses_mcp:Number(f?.mcp_calls??0)>0,derived_from_events:!0,derived_event_count:a,derived_schema:Dl},H={metadata:ko`COALESCE(${y.metadata}, '{}'::jsonb) || ${JSON.stringify({local_session_meta:P})}::jsonb`};return(m>0||p>0)&&(H.tokenUsage={input_tokens:m,output_tokens:p}),await u.update(y).set(H).where(Pl(y.id,e)),{status:"enriched",metrics:P}}c(Ol,"deriveSessionEnrichment");async function Cl(e){try{await Ol(e)}catch(t){console.warn("[derive-enrichment] failed for session",e,t instanceof Error?t.message:t)}}c(Cl,"deriveSessionEnrichmentBestEffort");async function No(e,t){let n=c((r,o)=>{let s={"org_attribution.source":r};if(o)for(let[i,a]of Object.entries(o))s[`org_attribution.${i}`]=a;Ap(s)},"tag");if(t)try{let[r]=await u.select({orgId:ee.orgId}).from(ee).where(qj(Dg(ee.userId,e),Dg(ee.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:R.activeOrgId}).from(R).where(Dg(R.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}}c(No,"resolveCallerOrgId");async function Uj(e,t,n){if(n)try{await u.execute(NI`
366
367
  insert into treatment_exposures
367
368
  (session_id, user_id, treatment_type, treatment_id, treatment_version, method, exposed_at)
368
369
  select ${e}::uuid, ${t}::uuid, 'suggestion', s.instruction_id, 1, 'injected', min(ise.created_at)
@@ -372,7 +373,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
372
373
  and ise.event_type in ('surfaced', 'surfaced_with_content', 'proxy_injected')
373
374
  group by s.instruction_id
374
375
  on conflict on constraint treatment_exposures_unique do nothing
375
- `)}catch(r){console.warn("[reimport] suggestion exposure reconcile failed:",r instanceof Error?r.message:r)}}c(Dj,"reconcileSuggestionExposures");async function Oj(e,t,n){if(n)try{await d.execute(II`
376
+ `)}catch(r){console.warn("[reimport] suggestion exposure reconcile failed:",r instanceof Error?r.message:r)}}c(Uj,"reconcileSuggestionExposures");async function Hj(e,t,n){if(n)try{await u.execute(NI`
376
377
  with drained as (
377
378
  insert into treatment_exposures
378
379
  (session_id, user_id, treatment_type, treatment_id, treatment_version, method, exposed_at)
@@ -387,13 +388,13 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
387
388
  delete from pending_treatment_exposures
388
389
  where external_session_id = ${n}
389
390
  and user_id = ${t}::uuid
390
- `)}catch(r){console.warn("[reimport] memory exposure reconcile failed:",r instanceof Error?r.message:r)}}c(Oj,"reconcileMemoryExposures");var Cj=6;async function jl(e,t,n,r,o){await Nl(e),await Dj(e,t,n),await Oj(e,t,n),r&&o>=Cj&&await _I({sessionId:e,userId:t}).catch(s=>{console.warn("[reimport] distill enqueue failed:",s instanceof Error?s.message:s)})}c(jl,"finalizeSessionIntelligence");var Rg=new Lj;async function kg(e,t){if(!t)return null;try{let[n]=await d.select({id:Z.id}).from(Z).where(Bi(zt(Z.id,t),zt(Z.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}}c(kg,"resolveCallerRunId");var qj=Fn.object({tool:Fn.string(),externalSessionId:Fn.string().optional(),clientName:Fn.string().optional(),mcpServerVersion:Fn.string().optional(),projectPath:Fn.string().optional(),gitBranch:Fn.string().optional(),startedAt:Fn.string().optional(),metadata:Fn.record(Fn.unknown()).optional(),orgId:Fn.string().uuid().nullable().optional(),runId:Fn.string().uuid().nullable().optional()});Rg.post("/sessions",async e=>{let t=e.get("userId"),n=await e.req.json(),r=qj.parse(n);if(r.projectPath){let m=await d.select({projectPath:y.projectPath}).from(y).where(Bi(zt(y.userId,t),Sr`${y.projectPath} IS NOT NULL`)).groupBy(y.projectPath);for(let w of m)if(w.projectPath&&r.projectPath!==w.projectPath&&r.projectPath.startsWith(w.projectPath+"/")){r.projectPath=w.projectPath;break}}let o=await To(t,r.orgId??null),s=await kg(t,r.runId??null);if(r.externalSessionId){let[m]=await d.select().from(y).where(Bi(zt(y.userId,t),zt(y.externalSessionId,r.externalSessionId))).limit(1);if(m){let w={};return!m.orgId&&o&&(w.orgId=o,m.orgId=o),!m.runId&&s&&(w.runId=s,m.runId=s),Object.keys(w).length>0&&await d.update(y).set(w).where(zt(y.id,m.id)),e.json(m,200)}}if(r.tool&&r.projectPath){let m=new Date(Date.now()-3e4),w=[zt(y.userId,t),zt(y.tool,r.tool),zt(y.projectPath,r.projectPath),Mj(y.startedAt,m)],[I]=await d.select().from(y).where(Bi(...w)).orderBy(bI(y.startedAt)).limit(1);if(I){let b={};return!I.externalSessionId&&r.externalSessionId&&(b.externalSessionId=r.externalSessionId,I.externalSessionId=r.externalSessionId),!I.orgId&&o&&(b.orgId=o,I.orgId=o),!I.runId&&s&&(b.runId=s,I.runId=s),Object.keys(b).length>0&&await d.update(y).set(b).where(zt(y.id,I.id)),e.json(I,200)}}let i=[],a=null,u=gI(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[m]=await d.select({projectId:ye.projectId}).from(ye).where(zt(ye.path,p)).orderBy(bI(ye.lastSeen)).limit(1);m&&(i=[{id:m.projectId}],a="launchPath")}if(i.length===0&&u){let[m]=await d.select({id:C.id}).from(C).where(EI(zt(C.gitRemoteUrl,u),Sr`${u} = ANY(${C.gitRemoteAliases})`)).limit(1);m&&(i=[m],a="remote")}if(i.length===0&&l){let[m]=await d.select({id:C.id,gitRemoteUrl:C.gitRemoteUrl,gitRemoteAliases:C.gitRemoteAliases}).from(C).where(zt(C.gitRootCommit,l)).limit(1);m&&(i=[{id:m.id}],a="rootCommit",u&&m.gitRemoteUrl&&m.gitRemoteUrl!==u&&!(m.gitRemoteAliases??[]).includes(u)&&await d.update(C).set({gitRemoteUrl:u,gitRemoteAliases:Sr`array_append(${C.gitRemoteAliases}, ${m.gitRemoteUrl})`}).where(zt(C.id,m.id)))}if(i.length===0&&u){let m=u.split("/").filter(Boolean).pop()??u,[w]=await d.insert(C).values({name:m,gitRemoteUrl:u,gitRootCommit:l,createdBy:t}).onConflictDoUpdate({target:C.gitRemoteUrl,targetWhere:Sr`${C.gitRemoteUrl} IS NOT NULL`,set:{gitRemoteUrl:u}}).returning({id:C.id});w&&(i=[{id:w.id}],a="remote")}}catch(m){console.warn("[sessions] Project match failed (non-fatal):",m)}let f=e.req.header("X-RuleMetric-Internal")==="true"||e.req.header("x-rulemetric-internal")==="true",_;f?_="internal_worker":r.clientName==="mcp"?_="mcp":r.externalSessionId?_="hook":_="proxy";let v;try{[v]=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:$i(r.metadata)??void 0,metadata:{...r.metadata,clientName:r.clientName,mcpServerVersion:r.mcpServerVersion}}).returning()}catch(m){if(m.cause?.code==="23505"&&r.externalSessionId){let[I]=await d.select().from(y).where(Bi(zt(y.userId,t),zt(y.externalSessionId,r.externalSessionId))).limit(1);if(I){let b={};return!I.orgId&&o&&(b.orgId=o,I.orgId=o),!I.runId&&s&&(b.runId=s,I.runId=s),Object.keys(b).length>0&&await d.update(y).set(b).where(zt(y.id,I.id)),e.json(I,200)}}throw m}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 m=r.metadata?.isWorktree===!0;try{await d.insert(ye).values({projectId:i[0].id,path:r.projectPath,isWorktree:m}).onConflictDoUpdate({target:[ye.projectId,ye.path],set:{lastSeen:new Date,isWorktree:m}})}catch(w){console.warn("[sessions] project_checkouts upsert failed (non-fatal):",w)}}try{if(i.length>0){let m=r.projectPath?r.projectPath.replace(/\/$/,"")+"/":null,w=m?Sr`${g.name} LIKE ${m+"%"}`:Sr`FALSE`,I=await d.select({instructionId:lt.instructionId}).from(lt).innerJoin(g,zt(g.id,lt.instructionId)).where(Bi(Sr`${lt.projectId} IN (${Sr.join(i.map(b=>Sr`${b.id}`),Sr`, `)})`,EI($j(g.type,"context_file"),w)));for(let{instructionId:b}of I)await d.insert(se).values({sessionId:v.id,instructionId:b,linkMethod:"project_match"}).onConflictDoNothing()}}catch{}return e.json(v,201)});D();import{Hono as Vj}from"hono";import{z as ft}from"zod";import{eq as jI,and as Jj,sql as xr}from"drizzle-orm";D();import{sql as Wn}from"drizzle-orm";function Pl(){return process.env.EVENT_BATCHING!=="0"}c(Pl,"eventBatchingEnabled");function SI(){let e=Number(process.env.EVENT_BATCH_LINGER_MS);return Number.isFinite(e)&&e>=0?e:50}c(SI,"eventBatchLingerMs");function xI(){let e=Number(process.env.EVENT_BATCH_BUFFER_MAX);return Number.isFinite(e)&&e>0?Math.floor(e):5e3}c(xI,"eventBatchBufferMax");function TI(){let e=Number(process.env.EVENT_BATCH_FLUSH_SIZE);return Number.isFinite(e)&&e>0?Math.floor(e):Uj}c(TI,"eventBatchFlushSize");function RI(){let e=Number(process.env.PG_POOL_MAX)||3;return Math.max(1,e-1)}c(RI,"defaultDrainConcurrency");var Uj=500;function Hj(e){let t=e.lingerMs??SI(),n=e.maxBuffered??xI(),r=Math.max(1,e.flushSize??TI()),o=Math.max(1,e.concurrency??RI()),s=new Map,i=0,a=new Set,u=0,l=!1,p=null,f=[];function _(){let E=f;f=[];for(let S of E)S()}c(_,"notifyProgress");function v(){for(;u<o;){let E=null,S=null;for(let[R,O]of s)if(!(a.has(R)||O.length===0)){S=O.splice(0,r),O.length===0&&s.delete(R),E=R;break}if(E==null||S==null)return;i-=S.length,a.add(E),u++,h(E,S)}}c(v,"tick");async function h(E,S){try{await e.drainSession(E,S)}catch(R){console.warn(`[event-batcher] drain failed for session ${E}; dropping ${S.length} event(s):`,R instanceof Error?R.message:R)}finally{u--,a.delete(E),_(),v()}}c(h,"runDrain");function m(){p!=null||l||(p=setTimeout(()=>{p=null,v()},t),p.unref?.())}c(m,"scheduleLinger");function w(E){if(l||i>=n)return!1;let S=s.get(E.sessionId);return S?S.push(E):s.set(E.sessionId,[E]),i++,i>=r?v():m(),!0}c(w,"push");function I(E){return new Promise(S=>{let R=!1,O=c(()=>{R||(R=!0,clearTimeout(W),S())},"finish"),W=setTimeout(O,E);W.unref?.(),f.push(O)})}c(I,"waitForProgress");async function b(E){let S=E!=null?Date.now()+E:Number.POSITIVE_INFINITY;for(;;){if(v(),i===0&&u===0)return;let R=S-Date.now();if(R<=0)return;await I(Math.min(R,50))}}c(b,"flush");function A(){l=!0,p!=null&&(clearTimeout(p),p=null)}return c(A,"stop"),{push:w,flush:b,stop:A,size:c(()=>i,"size"),inFlight:c(()=>u,"inFlight")}}c(Hj,"createEventBatcher");var AI=5,Bj=[5,20,50];function Fj(e){let t=e.cause;return e instanceof Error&&(t?.code==="23505"||e.message.includes("unique")||e.message.includes("duplicate"))}c(Fj,"isDuplicateKeyError");function Wj(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()}c(Wj,"toEventTimestamp");async function zj(e,t){if(t.length===0)return;let n=null,r=!1;for(let o=0;o<=AI;o++)try{let s=t.map((a,u)=>{let l=a.input,p={...l.metadata??{}};l.durationMs!=null&&(p.durationMs=l.durationMs),l.success!=null&&(p.success=l.success);let f=l.toolInput==null?null:JSON.stringify(l.toolInput),_=l.toolOutput==null?null:JSON.stringify(l.toolOutput),v=l.tokenUsage==null?null:JSON.stringify(l.tokenUsage),h=!r&&l.sequence!=null?Wn`${l.sequence}::int`:Wn`NULL::int`;return Wn`(${u+1}::int, ${h}, ${l.eventType}::text, ${l.content??null}::text, ${l.toolName??null}::text, ${f==null?Wn`NULL::jsonb`:Wn`${f}::jsonb`}, ${_==null?Wn`NULL::jsonb`:Wn`${_}::jsonb`}, ${v==null?Wn`NULL::jsonb`:Wn`${v}::jsonb`}, ${l.model??null}::text, ${Wj(l.timestamp)}::timestamptz, ${JSON.stringify(p)}::jsonb)`});n=(await d.execute(Wn`
391
+ `)}catch(r){console.warn("[reimport] memory exposure reconcile failed:",r instanceof Error?r.message:r)}}c(Hj,"reconcileMemoryExposures");var Bj=6;async function Ll(e,t,n,r,o){await Cl(e),await Uj(e,t,n),await Hj(e,t,n),r&&o>=Bj&&await xI({sessionId:e,userId:t}).catch(s=>{console.warn("[reimport] distill enqueue failed:",s instanceof Error?s.message:s)})}c(Ll,"finalizeSessionIntelligence");async function Ml(e,t){let n=[],r=null,o=AI(t?.gitRemote??null),s=typeof t?.gitRootCommit=="string"&&t.gitRootCommit?t.gitRootCommit:null,i=typeof t?.launchProjectPath=="string"&&t.launchProjectPath?t.launchProjectPath:null;try{if(i){let[a]=await u.select({projectId:ye.projectId}).from(ye).where(Vt(ye.path,i)).orderBy(jI(ye.lastSeen)).limit(1);a&&(n=[{id:a.projectId}],r="launchPath")}if(n.length===0&&o){let[a]=await u.select({id:C.id}).from(C).where(PI(Vt(C.gitRemoteUrl,o),xr`${o} = ANY(${C.gitRemoteAliases})`)).limit(1);a&&(n=[a],r="remote")}if(n.length===0&&s){let[a]=await u.select({id:C.id,gitRemoteUrl:C.gitRemoteUrl,gitRemoteAliases:C.gitRemoteAliases}).from(C).where(Vt(C.gitRootCommit,s)).limit(1);a&&(n=[{id:a.id}],r="rootCommit",o&&a.gitRemoteUrl&&a.gitRemoteUrl!==o&&!(a.gitRemoteAliases??[]).includes(o)&&await u.update(C).set({gitRemoteUrl:o,gitRemoteAliases:xr`array_append(${C.gitRemoteAliases}, ${a.gitRemoteUrl})`}).where(Vt(C.id,a.id)))}if(n.length===0&&o){let a=o.split("/").filter(Boolean).pop()??o,[d]=await u.insert(C).values({name:a,gitRemoteUrl:o,gitRootCommit:s,createdBy:e}).onConflictDoUpdate({target:C.gitRemoteUrl,targetWhere:xr`${C.gitRemoteUrl} IS NOT NULL`,set:{gitRemoteUrl:o}}).returning({id:C.id});d&&(n=[{id:d.id}],r="remote")}}catch(a){console.warn("[sessions] Project match failed (non-fatal):",a)}return{matchedProjects:n,matchedBy:r}}c(Ml,"matchProjectForCapture");async function td(e,t,n){if(t&&!/^\/(Users|home)\/[^/]+\/?$/.test(t))try{await u.insert(ye).values({projectId:e,path:t,isWorktree:n?.isWorktree===!0}).onConflictDoUpdate({target:[ye.projectId,ye.path],set:{lastSeen:new Date,isWorktree:n?.isWorktree===!0}})}catch(r){if(Ot(r)==="23505"){console.warn(`[sessions] project_checkouts: path ${t} is already claimed by another project \u2014 ${e} cannot record it. Likely duplicate projects rows for one repo.`);return}console.warn("[sessions] project_checkouts upsert failed (non-fatal):",r)}}c(td,"upsertProjectCheckout");async function Vj(e,t,n,r){if(!t.projectPath&&n.projectPath&&(r.projectPath=n.projectPath,t.projectPath=n.projectPath),!t.gitBranch&&n.gitBranch&&(r.gitBranch=n.gitBranch,t.gitBranch=n.gitBranch),t.projectId){await td(t.projectId,n.projectPath,n.metadata);return}let{matchedProjects:o}=await Ml(e,n.metadata),s=o[0]?.id;s&&(r.projectId=s,t.projectId=s,await td(s,n.projectPath??t.projectPath,n.metadata))}c(Vj,"repairAttribution");var Og=new Fj;async function Cg(e,t){if(!t)return null;try{let[n]=await u.select({id:te.id}).from(te).where(Fi(Vt(te.id,t),Vt(te.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}}c(Cg,"resolveCallerRunId");var Jj=Wn.object({tool:Wn.string(),externalSessionId:Wn.string().optional(),clientName:Wn.string().optional(),mcpServerVersion:Wn.string().optional(),projectPath:Wn.string().optional(),gitBranch:Wn.string().optional(),startedAt:Wn.string().optional(),metadata:Wn.record(Wn.unknown()).optional(),orgId:Wn.string().uuid().nullable().optional(),runId:Wn.string().uuid().nullable().optional()});Og.post("/sessions",async e=>{let t=e.get("userId"),n=await e.req.json(),r=Jj.parse(n);if(r.projectPath){let m=await u.select({projectPath:y.projectPath}).from(y).where(Fi(Vt(y.userId,t),xr`${y.projectPath} IS NOT NULL`)).groupBy(y.projectPath),p=null;for(let _ of m){let w=_.projectPath;!w||w===r.projectPath||r.projectPath.startsWith(w+"/")&&(/^\/(Users|home)\/[^/]+\/?$/.test(w)||(!p||w.length>p.length)&&(p=w))}p&&(r.projectPath=p)}let o=await No(t,r.orgId??null),s=await Cg(t,r.runId??null);if(r.externalSessionId){let[m]=await u.select().from(y).where(Fi(Vt(y.userId,t),Vt(y.externalSessionId,r.externalSessionId))).limit(1);if(m){let p={};return!m.orgId&&o&&(p.orgId=o,m.orgId=o),!m.runId&&s&&(p.runId=s,m.runId=s),await Vj(t,m,r,p),Object.keys(p).length>0&&await u.update(y).set(p).where(Vt(y.id,m.id)),e.json(m,200)}}if(r.tool&&r.projectPath){let m=new Date(Date.now()-3e4),p=[Vt(y.userId,t),Vt(y.tool,r.tool),Vt(y.projectPath,r.projectPath),Wj(y.startedAt,m)],[_]=await u.select().from(y).where(Fi(...p)).orderBy(jI(y.startedAt)).limit(1);if(_){let w={};return!_.externalSessionId&&r.externalSessionId&&(w.externalSessionId=r.externalSessionId,_.externalSessionId=r.externalSessionId),!_.orgId&&o&&(w.orgId=o,_.orgId=o),!_.runId&&s&&(w.runId=s,_.runId=s),Object.keys(w).length>0&&await u.update(y).set(w).where(Vt(y.id,_.id)),e.json(_,200)}}let{matchedProjects:i}=await Ml(t,r.metadata),a=e.req.header("X-RuleMetric-Internal")==="true"||e.req.header("x-rulemetric-internal")==="true",d;a?d="internal_worker":r.clientName==="mcp"?d="mcp":r.externalSessionId?d="hook":d="proxy";let l;try{[l]=await u.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:d,harnessVersion:qi(r.metadata)??void 0,metadata:{...r.metadata,clientName:r.clientName,mcpServerVersion:r.mcpServerVersion}}).returning()}catch(m){if(m.cause?.code==="23505"&&r.externalSessionId){let[_]=await u.select().from(y).where(Fi(Vt(y.userId,t),Vt(y.externalSessionId,r.externalSessionId))).limit(1);if(_){let w={};return!_.orgId&&o&&(w.orgId=o,_.orgId=o),!_.runId&&s&&(w.runId=s,_.runId=s),Object.keys(w).length>0&&await u.update(y).set(w).where(Vt(y.id,_.id)),e.json(_,200)}}throw m}if(!l)return e.json({error:"Failed to create session"},500);i.length>0&&await td(i[0].id,r.projectPath,r.metadata);try{if(i.length>0){let m=r.projectPath?r.projectPath.replace(/\/$/,"")+"/":null,p=m?xr`${g.name} LIKE ${m+"%"}`:xr`FALSE`,_=await u.select({instructionId:lt.instructionId}).from(lt).innerJoin(g,Vt(g.id,lt.instructionId)).where(Fi(xr`${lt.projectId} IN (${xr.join(i.map(w=>xr`${w.id}`),xr`, `)})`,PI(zj(g.type,"context_file"),p)));for(let{instructionId:w}of _)await u.insert(ie).values({sessionId:l.id,instructionId:w,linkMethod:"project_match"}).onConflictDoNothing()}}catch{}return e.json(l,201)});O();import{Hono as eP}from"hono";import{z as ft}from"zod";import{eq as UI,and as tP,sql as Rr}from"drizzle-orm";O();import{sql as zn}from"drizzle-orm";function $l(){return process.env.EVENT_BATCHING!=="0"}c($l,"eventBatchingEnabled");function OI(){let e=Number(process.env.EVENT_BATCH_LINGER_MS);return Number.isFinite(e)&&e>=0?e:50}c(OI,"eventBatchLingerMs");function CI(){let e=Number(process.env.EVENT_BATCH_BUFFER_MAX);return Number.isFinite(e)&&e>0?Math.floor(e):5e3}c(CI,"eventBatchBufferMax");function LI(){let e=Number(process.env.EVENT_BATCH_FLUSH_SIZE);return Number.isFinite(e)&&e>0?Math.floor(e):Kj}c(LI,"eventBatchFlushSize");function MI(){let e=Number(process.env.PG_POOL_MAX)||3;return Math.max(1,e-1)}c(MI,"defaultDrainConcurrency");var Kj=500;function Gj(e){let t=e.lingerMs??OI(),n=e.maxBuffered??CI(),r=Math.max(1,e.flushSize??LI()),o=Math.max(1,e.concurrency??MI()),s=new Map,i=0,a=new Set,d=0,l=!1,m=null,p=[];function _(){let b=p;p=[];for(let S of b)S()}c(_,"notifyProgress");function w(){for(;d<o;){let b=null,S=null;for(let[T,P]of s)if(!(a.has(T)||P.length===0)){S=P.splice(0,r),P.length===0&&s.delete(T),b=T;break}if(b==null||S==null)return;i-=S.length,a.add(b),d++,f(b,S)}}c(w,"tick");async function f(b,S){try{await e.drainSession(b,S)}catch(T){console.warn(`[event-batcher] drain failed for session ${b}; dropping ${S.length} event(s):`,T instanceof Error?T.message:T)}finally{d--,a.delete(b),_(),w()}}c(f,"runDrain");function h(){m!=null||l||(m=setTimeout(()=>{m=null,w()},t),m.unref?.())}c(h,"scheduleLinger");function v(b){if(l||i>=n)return!1;let S=s.get(b.sessionId);return S?S.push(b):s.set(b.sessionId,[b]),i++,i>=r?w():h(),!0}c(v,"push");function I(b){return new Promise(S=>{let T=!1,P=c(()=>{T||(T=!0,clearTimeout(H),S())},"finish"),H=setTimeout(P,b);H.unref?.(),p.push(P)})}c(I,"waitForProgress");async function E(b){let S=b!=null?Date.now()+b:Number.POSITIVE_INFINITY;for(;;){if(w(),i===0&&d===0)return;let T=S-Date.now();if(T<=0)return;await I(Math.min(T,50))}}c(E,"flush");function A(){l=!0,m!=null&&(clearTimeout(m),m=null)}return c(A,"stop"),{push:v,flush:E,stop:A,size:c(()=>i,"size"),inFlight:c(()=>d,"inFlight")}}c(Gj,"createEventBatcher");var DI=5,Yj=[5,20,50];function Xj(e){let t=e.cause;return e instanceof Error&&(t?.code==="23505"||e.message.includes("unique")||e.message.includes("duplicate"))}c(Xj,"isDuplicateKeyError");function Qj(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()}c(Qj,"toEventTimestamp");async function Zj(e,t){if(t.length===0)return;let n=null,r=!1;for(let o=0;o<=DI;o++)try{let s=t.map((a,d)=>{let l=a.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),w=l.tokenUsage==null?null:JSON.stringify(l.tokenUsage),f=!r&&l.sequence!=null?zn`${l.sequence}::int`:zn`NULL::int`;return zn`(${d+1}::int, ${f}, ${l.eventType}::text, ${l.content??null}::text, ${l.toolName??null}::text, ${p==null?zn`NULL::jsonb`:zn`${p}::jsonb`}, ${_==null?zn`NULL::jsonb`:zn`${_}::jsonb`}, ${w==null?zn`NULL::jsonb`:zn`${w}::jsonb`}, ${l.model??null}::text, ${Qj(l.timestamp)}::timestamptz, ${JSON.stringify(m)}::jsonb)`});n=(await u.execute(zn`
391
392
  WITH base AS (
392
393
  SELECT COALESCE(MAX(sequence), 0) AS seq
393
394
  FROM session_events WHERE session_id = ${e}
394
395
  ),
395
396
  vals (rn, explicit_seq, event_type, content, tool_name, tool_input, tool_output, token_usage, model, ts, metadata) AS (
396
- VALUES ${Wn.join(s,Wn`, `)}
397
+ VALUES ${zn.join(s,zn`, `)}
397
398
  ),
398
399
  ins AS (
399
400
  INSERT INTO session_events (id, session_id, sequence, event_type, content, tool_name, tool_input, tool_output, token_usage, model, timestamp, metadata)
@@ -414,22 +415,22 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
414
415
  )
415
416
  SELECT (SELECT COUNT(*)::int FROM ins) AS inserted,
416
417
  (SELECT event_count FROM upd) AS new_count
417
- `))[0]?.new_count??null;break}catch(s){if(Fj(s)&&o<AI){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=Bj.filter(i=>o<i&&n>=i);for(let i of s)await xl({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)}}c(zj,"drainSessionEvents");var Ro=null;function Ng(){return Ro==null&&(Ro=Hj({drainSession:zj})),Ro}c(Ng,"getEventBatcher");function kI(){Ng(),console.log(`[event-batcher] batched event ingest ON (lingerMs=${SI()} flushSize=${TI()} bufferMax=${xI()} drainConcurrency=${RI()}; EVENT_BATCHING=0 to disable)`)}c(kI,"initEventBatcher");async function NI(e=5e3){if(Ro==null)return;Ro.stop(),await Ro.flush(e);let t=Ro.size()+Ro.inFlight();t>0&&console.warn(`[event-batcher] shutdown flush deadline (${e}ms) hit; dropping ~${t} buffered event(s)`)}c(NI,"shutdownEventBatcher");var jg=new Vj,Kj=ft.object({sequence:ft.number().int().optional(),eventType:ft.string(),content:ft.string().nullable().optional(),toolName:ft.string().nullable().optional(),toolInput:ft.union([ft.record(ft.unknown()),ft.array(ft.unknown())]).nullable().optional(),toolOutput:ft.union([ft.record(ft.unknown()),ft.array(ft.unknown())]).nullable().optional(),durationMs:ft.number().optional(),success:ft.boolean().optional(),metadata:ft.record(ft.unknown()).optional(),timestamp:ft.string(),instructionIds:ft.array(ft.string().uuid()).optional(),model:ft.string().nullable().optional(),tokenUsage:ft.record(ft.unknown()).nullable().optional()});jg.post("/sessions/:id/events",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=Kj.parse(r),[s]=await d.select({id:y.id,eventCount:y.eventCount,userId:y.userId}).from(y).where(Jj(jI(y.id,n),jI(y.userId,t)));if(!s)return e.json({error:"Session not found"},404);let i=s.eventCount??0;if(Pl())return Ng().push({sessionId:n,userId:s.userId,input:o})?e.json({buffered:!0,count:1,durable:!1},202):(yc(),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 u=o.toolInput==null?null:JSON.stringify(o.toolInput),l=o.toolOutput==null?null:JSON.stringify(o.toolOutput),p=JSON.stringify(a),f=o.tokenUsage==null?null:JSON.stringify(o.tokenUsage),_=o.sequence,v=5;for(let h=0;h<=v;h++)try{let m=_!=null?xr`${_}::int`:xr`COALESCE((SELECT MAX(sequence) FROM session_events WHERE session_id = ${n}), 0) + 1`;_=(await d.execute(xr`
418
+ `))[0]?.new_count??null;break}catch(s){if(Xj(s)&&o<DI){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(ie).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=Yj.filter(i=>o<i&&n>=i);for(let i of s)await jl({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)}}c(Zj,"drainSessionEvents");var jo=null;function Lg(){return jo==null&&(jo=Gj({drainSession:Zj})),jo}c(Lg,"getEventBatcher");function $I(){Lg(),console.log(`[event-batcher] batched event ingest ON (lingerMs=${OI()} flushSize=${LI()} bufferMax=${CI()} drainConcurrency=${MI()}; EVENT_BATCHING=0 to disable)`)}c($I,"initEventBatcher");async function qI(e=5e3){if(jo==null)return;jo.stop(),await jo.flush(e);let t=jo.size()+jo.inFlight();t>0&&console.warn(`[event-batcher] shutdown flush deadline (${e}ms) hit; dropping ~${t} buffered event(s)`)}c(qI,"shutdownEventBatcher");var Mg=new eP,nP=ft.object({sequence:ft.number().int().optional(),eventType:ft.string(),content:ft.string().nullable().optional(),toolName:ft.string().nullable().optional(),toolInput:ft.union([ft.record(ft.unknown()),ft.array(ft.unknown())]).nullable().optional(),toolOutput:ft.union([ft.record(ft.unknown()),ft.array(ft.unknown())]).nullable().optional(),durationMs:ft.number().optional(),success:ft.boolean().optional(),metadata:ft.record(ft.unknown()).optional(),timestamp:ft.string(),instructionIds:ft.array(ft.string().uuid()).optional(),model:ft.string().nullable().optional(),tokenUsage:ft.record(ft.unknown()).nullable().optional()});Mg.post("/sessions/:id/events",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=nP.parse(r),[s]=await u.select({id:y.id,eventCount:y.eventCount,userId:y.userId}).from(y).where(tP(UI(y.id,n),UI(y.userId,t)));if(!s)return e.json({error:"Session not found"},404);let i=s.eventCount??0;if($l())return Lg().push({sessionId:n,userId:s.userId,input:o})?e.json({buffered:!0,count:1,durable:!1},202):(yc(),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 d=o.toolInput==null?null:JSON.stringify(o.toolInput),l=o.toolOutput==null?null:JSON.stringify(o.toolOutput),m=JSON.stringify(a),p=o.tokenUsage==null?null:JSON.stringify(o.tokenUsage),_=o.sequence,w=5;for(let f=0;f<=w;f++)try{let h=_!=null?Rr`${_}::int`:Rr`COALESCE((SELECT MAX(sequence) FROM session_events WHERE session_id = ${n}), 0) + 1`;_=(await u.execute(Rr`
418
419
  WITH ins AS (
419
420
  INSERT INTO session_events (id, session_id, sequence, event_type, content, tool_name, tool_input, tool_output, token_usage, model, timestamp, metadata)
420
421
  SELECT
421
422
  gen_random_uuid(),
422
423
  ${n},
423
- ${m},
424
+ ${h},
424
425
  ${o.eventType},
425
426
  ${o.content??null},
426
427
  ${o.toolName??null},
427
- ${u==null?xr`NULL`:xr`${u}::jsonb`},
428
- ${l==null?xr`NULL`:xr`${l}::jsonb`},
429
- ${f==null?xr`NULL`:xr`${f}::jsonb`},
428
+ ${d==null?Rr`NULL`:Rr`${d}::jsonb`},
429
+ ${l==null?Rr`NULL`:Rr`${l}::jsonb`},
430
+ ${p==null?Rr`NULL`:Rr`${p}::jsonb`},
430
431
  ${o.model??null},
431
432
  ${new Date(o.timestamp).toISOString()}::timestamptz,
432
- ${xr`${p}::jsonb`}
433
+ ${Rr`${m}::jsonb`}
433
434
  RETURNING sequence
434
435
  ),
435
436
  upd AS (
@@ -439,19 +440,18 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
439
440
  RETURNING id
440
441
  )
441
442
  SELECT ins.sequence FROM ins, upd
442
- `))[0]?.sequence??_??1;break}catch(m){let w=m.cause;if(m instanceof Error&&(w?.code==="23505"||m.message.includes("unique")||m.message.includes("duplicate"))&&h<v){_=void 0;continue}throw m}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(m){console.warn("[events ingest] failed to auto-link instructionId:",m instanceof Error?m.message:m)}try{let h=i+1,w=[5,20,50].filter(I=>i<I&&h>=I);for(let I of w)await xl({sessionId:s.id,milestone:I,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})});D();import{Hono as Gj}from"hono";import{eq as xs,and as Cl,desc as Yj,sql as Xj,ilike as Pg,gte as PI}from"drizzle-orm";D();import{sql as Dl}from"drizzle-orm";function Fi(e){return Dl`
443
+ `))[0]?.sequence??_??1;break}catch(h){let v=h.cause;if(h instanceof Error&&(v?.code==="23505"||h.message.includes("unique")||h.message.includes("duplicate"))&&f<w){_=void 0;continue}throw h}if(o.instructionIds&&o.instructionIds.length>0)for(let f of o.instructionIds)try{await u.insert(ie).values({sessionId:n,instructionId:f,linkMethod:"auto_capture"}).onConflictDoNothing()}catch(h){console.warn("[events ingest] failed to auto-link instructionId:",h instanceof Error?h.message:h)}try{let f=i+1,v=[5,20,50].filter(I=>i<I&&f>=I);for(let I of v)await jl({sessionId:s.id,milestone:I,userId:s.userId})}catch(f){console.warn("[events ingest] failed to enqueue process_session_goal:",f instanceof Error?f.message:f)}return e.json({recorded:!0})});O();import{Hono as rP}from"hono";import{eq as Rs,and as Hl,desc as oP,sql as sP,ilike as $g,gte as HI}from"drizzle-orm";O();import{sql as ql}from"drizzle-orm";function Wi(e){return ql`
443
444
  SELECT project_id::text AS project_id, path, is_worktree, last_seen, is_stale, project_last_seen
444
445
  FROM project_canonical_checkouts
445
- WHERE project_id IN (${Dl.join(e.map(t=>Dl`${t}::uuid`),Dl`, `)})`}c(Fi,"canonicalCheckoutsFor");async function Ol(e,t){if(!e)return t;try{return(await d.execute(Fi([e])))[0]?.path??t}catch{return t}}c(Ol,"canonicalPathForProject");var Dg=new Gj;Dg.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,projectId:y.projectId}).from(y).where(Cl(xs(y.id,n),xs(y.userId,t)));if(!r)return e.json({error:"Session not found"},404);if(await d.update(y).set({endedAt:new Date}).where(xs(y.id,n)),await Nl(n),r.projectPath)try{let o=new Date;o.setHours(0,0,0,0);let s=await Ol(r.projectId,r.projectPath)??r.projectPath,[i]=await d.select({id:z.id}).from(z).where(Cl(xs(z.userId,t),PI(z.createdAt,o),Pg(z.projectPath,`%${ct(s)}%`))).limit(1);if(!i){let[a]=await d.select({completedAt:z.completedAt}).from(z).where(Cl(xs(z.userId,t),xs(z.status,"completed"),Pg(z.projectPath,`%${ct(s)}%`))).orderBy(Yj(z.completedAt)).limit(1),u=a?.completedAt??new Date(0),[{count:l}]=await d.select({count:Xj`COUNT(*)`}).from(y).where(Cl(xs(y.userId,t),Pg(y.projectPath,`%${ct(r.projectPath)}%`),PI(y.startedAt,u)));Number(l)>=5&&await Ot({taskName:"process_insights",payload:{projectPath:s,projectId:r.projectId},userId:t,mirror:{userId:t,projectPath:s,projectId:r.projectId}})}}catch{}return e.json({closed:!0})});D();Vl();import{createHash as mD}from"node:crypto";import{Hono as fD}from"hono";import{z as Jl}from"zod";import{eq as dr,and as $b,sql as Ts}from"drizzle-orm";function Qt(e){let t=e;for(;t&&typeof t=="object";){let n=t.code;if(typeof n=="string")return n;t=t.cause}}c(Qt,"findPgCode");function No(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(`
446
- `)}c(No,"findPgMessage");import{createHash as pD}from"node:crypto";function Cb(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}}c(Cb,"readImportMarker");function Lb(e,t){return e.length<=t.contentLen?!1:pD("sha256").update(e.slice(0,t.contentLen)).digest("hex")===t.contentHash}c(Lb,"isStrictContentExtension");var Mb=new Set(["claude_code","codex"]);var Kl=new fD,qb=Jl.object({content:Jl.string().min(1),tool:Jl.string().optional(),orgId:Jl.string().uuid().nullable().optional()});function gD(e){for(let t of[e.metadata?.sessionId,e.metadata?.codexSessionId])if(typeof t=="string"&&t.length>0)return t;return null}c(gD,"importedExternalSessionId");Kl.post("/sessions/:id/reimport",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=qb.parse(r),[s]=await d.select({id:y.id,eventCount:y.eventCount,externalSessionId:y.externalSessionId,projectId:y.projectId}).from(y).where($b(dr(y.id,n),dr(y.userId,t)));if(!s)return e.json({error:"Session not found"},404);let i=o.tool??tu(o.content);if(!i)return e.json({error:"Could not detect session format. Specify tool parameter."},400);let u=eu(i).parse(o.content);if(u.events.length===s.eventCount)return await jl(n,t,s.externalSessionId,s.projectId,s.eventCount??0),e.json({reimported:!1,skipped:"unchanged",eventCount:s.eventCount});if(u.events.length===0&&(s.eventCount??0)>0)return await d.update(y).set({endedAt:u.endedAt?new Date(u.endedAt):new Date}).where(dr(y.id,n)),await jl(n,t,s.externalSessionId,s.projectId,s.eventCount??0),e.json({reimported:!1,skipped:"empty_parse",eventCount:s.eventCount});let l=u.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 Fe.transaction(async p=>{await p.execute(Ts`SET LOCAL statement_timeout = '60s'`),await p.delete(ze).where(dr(ze.sessionId,n));for(let f=0;f<l.length;f+=500)await p.insert(ze).values(l.slice(f,f+500));await p.update(y).set({eventCount:u.events.length,endedAt:u.endedAt?new Date(u.endedAt):new Date,projectPath:u.projectPath??void 0,gitBranch:u.gitBranch??void 0,metadata:u.metadata?Ts`COALESCE(${y.metadata}, '{}'::jsonb) || ${JSON.stringify(u.metadata)}::jsonb`:void 0,model:Ss(u.metadata?.model)??void 0,harnessVersion:$i(u.metadata)??void 0}).where(dr(y.id,n))}),await jl(n,t,s.externalSessionId,s.projectId,u.events.length),e.json({reimported:!0,eventCount:u.events.length})});Kl.post("/sessions/import",async e=>{let t=e.get("userId"),n=await e.req.json(),r=qb.parse(n),o=r.tool??tu(r.content);if(!o)return e.json({error:"Could not detect session format. Specify tool parameter."},400);let i=eu(o).parse(r.content),a=gD(i),u=mD("sha256").update(r.content).digest("hex"),l,p=c(async()=>(l===void 0&&(l=await To(t,r.orgId??null)),l),"resolveOrgId"),f=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:u,_importContentLen:r.content.length,_importEventCount:i.events.length},v=3;for(let h=0;;h++){let m=a?(await d.select().from(y).where($b(dr(y.userId,t),dr(y.externalSessionId,a))).limit(1))[0]??null:null;if(m&&m.metadata?._importContentHash===u)return e.json({...m,deduped:!0},200);let w=await p(),I=m?{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:Ts`COALESCE(${y.metadata}, '{}'::jsonb) || ${JSON.stringify(_)}::jsonb`,model:Ss(i.metadata?.model)??void 0,harnessVersion:$i(i.metadata)??void 0,...w&&!m.orgId?{orgId:w}:{}}:null;try{if(m&&I&&Mb.has(i.tool)){let A=Cb(m.metadata);if(A&&f.length>A.eventCount&&f[A.eventCount]?.sequence===A.eventCount&&Lb(r.content,A)){let[E]=await d.select({count:Ts`COUNT(*)::int`,maxSeq:Ts`MAX(${ze.sequence})::int`}).from(ze).where(dr(ze.sessionId,m.id)),S=Number(E?.count??-1),R=E?.maxSeq==null?null:Number(E.maxSeq);if(S===A.eventCount&&(A.eventCount===0?R===null:R===A.eventCount-1)){let W=await Fe.transaction(async N=>{await N.execute(Ts`SET LOCAL statement_timeout = '60s'`);let q=f.slice(A.eventCount).map(H=>({sessionId:m.id,...H}));for(let H=0;H<q.length;H+=500)await N.insert(ze).values(q.slice(H,H+500));let[U]=await N.update(y).set(I).where(dr(y.id,m.id)).returning();return U});return e.json({...W,appended:!0},200)}}}let b=await Fe.transaction(async A=>{if(await A.execute(Ts`SET LOCAL statement_timeout = '60s'`),m&&I){if(await A.delete(ze).where(dr(ze.sessionId,m.id)),f.length>0){let R=f.map(O=>({sessionId:m.id,...O}));for(let O=0;O<R.length;O+=500)await A.insert(ze).values(R.slice(O,O+500))}let[S]=await A.update(y).set(I).where(dr(y.id,m.id)).returning();return S}let[E]=await A.insert(y).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:_,model:Ss(i.metadata?.model),harnessVersion:$i(i.metadata),orgId:w}).returning();if(f.length>0){let S=f.map(R=>({sessionId:E.id,...R}));for(let R=0;R<S.length;R+=500)await A.insert(ze).values(S.slice(R,R+500))}return E});return e.json(b,m?200:201)}catch(b){if(a&&Qt(b)==="23505"&&h<v)continue;throw b}}});var Qi=new hD;Qi.route("/",Rg);Qi.route("/",jg);Qi.route("/",Dg);Qi.route("/",Kl);D();import{Hono as _D}from"hono";import{eq as yn,and as Rs,asc as yD,desc as Hb,sql as Ve,or as Ub,ilike as wD,inArray as Gl}from"drizzle-orm";var Zi=new _D;Zi.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"),u=e.req.query("projectId"),l=e.req.query("gitRemote"),p=Number(e.req.query("limit")??"50"),f=Number(e.req.query("offset")??"0"),_=[yn(y.userId,t)];if(e.req.query("includeInternal")==="true"||_.push(Ve`${y.origin} <> 'internal_worker'`),n&&_.push(yn(y.tool,n)),u){let w=[yn(y.projectId,u)];l&&w.push(Ve`${y.metadata}->>'gitRemote' = ${l}`),_.push(w.length===1?w[0]:Ub(...w))}else if(a||l){let w=[];a&&w.push(wD(y.projectPath,`%${ct(a)}%`)),l&&w.push(Ve`${y.metadata}->>'gitRemote' = ${l}`),_.push(w.length===1?w[0]:Ub(...w))}if(e.req.query("hideEmpty")!=="false"&&_.push(Ve`${y.eventCount} > 0`),i==="true"?_.push(Ve`${y.analysis} IS NOT NULL`):i==="false"&&_.push(Ve`${y.analysis} IS NULL`),e.req.query("needsFacets")==="true"){let w=e.req.query("graderVersion"),I=w!=null&&/^\d+$/.test(w)?Number(w):null;I===null?_.push(Ve`${y.analysis}->>'outcome' IS NULL`):_.push(Ve`(
446
+ WHERE project_id IN (${ql.join(e.map(t=>ql`${t}::uuid`),ql`, `)})`}c(Wi,"canonicalCheckoutsFor");async function Ul(e,t){if(!e)return t;try{return(await u.execute(Wi([e])))[0]?.path??t}catch{return t}}c(Ul,"canonicalPathForProject");var qg=new rP;qg.post("/sessions/:id/close",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:y.id,projectPath:y.projectPath,projectId:y.projectId}).from(y).where(Hl(Rs(y.id,n),Rs(y.userId,t)));if(!r)return e.json({error:"Session not found"},404);if(await u.update(y).set({endedAt:new Date}).where(Rs(y.id,n)),await Cl(n),r.projectPath)try{let o=new Date;o.setHours(0,0,0,0);let s=await Ul(r.projectId,r.projectPath)??r.projectPath,[i]=await u.select({id:z.id}).from(z).where(Hl(Rs(z.userId,t),HI(z.createdAt,o),$g(z.projectPath,`%${ct(s)}%`))).limit(1);if(!i){let[a]=await u.select({completedAt:z.completedAt}).from(z).where(Hl(Rs(z.userId,t),Rs(z.status,"completed"),$g(z.projectPath,`%${ct(s)}%`))).orderBy(oP(z.completedAt)).limit(1),d=a?.completedAt??new Date(0),[{count:l}]=await u.select({count:sP`COUNT(*)`}).from(y).where(Hl(Rs(y.userId,t),$g(y.projectPath,`%${ct(r.projectPath)}%`),HI(y.startedAt,d)));Number(l)>=5&&await Ct({taskName:"process_insights",payload:{projectPath:s,projectId:r.projectId},userId:t,mirror:{userId:t,projectPath:s,projectId:r.projectId}})}}catch{}return e.json({closed:!0})});O();Ql();import{createHash as ID}from"node:crypto";import{Hono as bD}from"hono";import{z as Zl}from"zod";import{eq as On,and as Jb,sql as Ts}from"drizzle-orm";import{createHash as vD}from"node:crypto";function Wb(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}}c(Wb,"readImportMarker");function zb(e,t){return e.length<=t.contentLen?!1:vD("sha256").update(e.slice(0,t.contentLen)).digest("hex")===t.contentHash}c(zb,"isStrictContentExtension");var Vb=new Set(["claude_code","codex"]);var em=new bD;async function Kb(e,t){if(t.projectId)return t.projectId;let n=t.metadata??{},{matchedProjects:r}=await Ml(e,n),o=r[0]?.id;return o?(await u.update(y).set({projectId:o}).where(On(y.id,t.id)),await td(o,t.projectPath,n),o):null}c(Kb,"attributeImportedSession");var Gb=Zl.object({content:Zl.string().min(1),tool:Zl.string().optional(),orgId:Zl.string().uuid().nullable().optional()});function ED(e){for(let t of[e.metadata?.sessionId,e.metadata?.codexSessionId])if(typeof t=="string"&&t.length>0)return t;return null}c(ED,"importedExternalSessionId");em.post("/sessions/:id/reimport",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=Gb.parse(r),[s]=await u.select({id:y.id,eventCount:y.eventCount,externalSessionId:y.externalSessionId,projectId:y.projectId}).from(y).where(Jb(On(y.id,n),On(y.userId,t)));if(!s)return e.json({error:"Session not found"},404);let i=o.tool??rd(o.content);if(!i)return e.json({error:"Could not detect session format. Specify tool parameter."},400);let d=nd(i).parse(o.content);if(d.events.length===s.eventCount)return await Ll(n,t,s.externalSessionId,s.projectId,s.eventCount??0),e.json({reimported:!1,skipped:"unchanged",eventCount:s.eventCount});if(d.events.length===0&&(s.eventCount??0)>0)return await u.update(y).set({endedAt:d.endedAt?new Date(d.endedAt):new Date}).where(On(y.id,n)),await Ll(n,t,s.externalSessionId,s.projectId,s.eventCount??0),e.json({reimported:!1,skipped:"empty_parse",eventCount:s.eventCount});let l=d.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}));await Fe.transaction(async p=>{await p.execute(Ts`SET LOCAL statement_timeout = '60s'`),await p.delete(Ve).where(On(Ve.sessionId,n));for(let _=0;_<l.length;_+=500)await p.insert(Ve).values(l.slice(_,_+500));await p.update(y).set({eventCount:d.events.length,endedAt:d.endedAt?new Date(d.endedAt):new Date,projectPath:d.projectPath??void 0,gitBranch:d.gitBranch??void 0,metadata:d.metadata?Ts`COALESCE(${y.metadata}, '{}'::jsonb) || ${JSON.stringify(d.metadata)}::jsonb`:void 0,model:xs(d.metadata?.model)??void 0,harnessVersion:qi(d.metadata)??void 0}).where(On(y.id,n))});let m=s.projectId;if(!m){let[p]=await u.select({id:y.id,projectId:y.projectId,projectPath:y.projectPath,metadata:y.metadata}).from(y).where(On(y.id,n));p&&(m=await Kb(t,p))}return await Ll(n,t,s.externalSessionId,m,d.events.length),e.json({reimported:!0,eventCount:d.events.length})});em.post("/sessions/import",async e=>{let t=e.get("userId"),n=await e.req.json(),r=Gb.parse(n),o=r.tool??rd(r.content);if(!o)return e.json({error:"Could not detect session format. Specify tool parameter."},400);let i=nd(o).parse(r.content),a=ED(i),d=ID("sha256").update(r.content).digest("hex"),l,m=c(async()=>(l===void 0&&(l=await No(t,r.orgId??null)),l),"resolveOrgId"),p=i.events.map(f=>({sequence:f.sequence,eventType:f.eventType,content:f.content,toolName:f.toolName,toolInput:f.toolInput,toolOutput:f.toolOutput,tokenUsage:f.tokenUsage,timestamp:new Date(f.timestamp),metadata:f.metadata})),_={...i.metadata??{},_importContentHash:d,_importContentLen:r.content.length,_importEventCount:i.events.length},w=3;for(let f=0;;f++){let h=a?(await u.select().from(y).where(Jb(On(y.userId,t),On(y.externalSessionId,a))).limit(1))[0]??null:null;if(h&&h.metadata?._importContentHash===d)return e.json({...h,deduped:!0},200);let v=await m(),I=h?{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:Ts`COALESCE(${y.metadata}, '{}'::jsonb) || ${JSON.stringify(_)}::jsonb`,model:xs(i.metadata?.model)??void 0,harnessVersion:qi(i.metadata)??void 0,...v&&!h.orgId?{orgId:v}:{}}:null;try{if(h&&I&&Vb.has(i.tool)){let b=Wb(h.metadata);if(b&&p.length>b.eventCount&&p[b.eventCount]?.sequence===b.eventCount&&zb(r.content,b)){let[S]=await u.select({count:Ts`COUNT(*)::int`,maxSeq:Ts`MAX(${Ve.sequence})::int`}).from(Ve).where(On(Ve.sessionId,h.id)),T=Number(S?.count??-1),P=S?.maxSeq==null?null:Number(S.maxSeq);if(T===b.eventCount&&(b.eventCount===0?P===null:P===b.eventCount-1)){let N=await Fe.transaction(async U=>{await U.execute(Ts`SET LOCAL statement_timeout = '60s'`);let q=p.slice(b.eventCount).map(J=>({sessionId:h.id,...J}));for(let J=0;J<q.length;J+=500)await U.insert(Ve).values(q.slice(J,J+500));let[B]=await U.update(y).set(I).where(On(y.id,h.id)).returning();return B});return e.json({...N,appended:!0},200)}}}let E=await Fe.transaction(async b=>{if(await b.execute(Ts`SET LOCAL statement_timeout = '60s'`),h&&I){if(await b.delete(Ve).where(On(Ve.sessionId,h.id)),p.length>0){let P=p.map(H=>({sessionId:h.id,...H}));for(let H=0;H<P.length;H+=500)await b.insert(Ve).values(P.slice(H,H+500))}let[T]=await b.update(y).set(I).where(On(y.id,h.id)).returning();return T}let[S]=await b.insert(y).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:_,model:xs(i.metadata?.model),harnessVersion:qi(i.metadata),orgId:v}).returning();if(p.length>0){let T=p.map(P=>({sessionId:S.id,...P}));for(let P=0;P<T.length;P+=500)await b.insert(Ve).values(T.slice(P,P+500))}return S}),A=await Kb(t,E);return e.json({...E,projectId:A},h?200:201)}catch(E){if(a&&Ot(E)==="23505"&&f<w)continue;throw E}}});var Zi=new AD;Zi.route("/",Og);Zi.route("/",Mg);Zi.route("/",qg);Zi.route("/",em);O();import{Hono as SD}from"hono";import{eq as rn,and as Xr,asc as xD,desc as ih,sql as We,or as Yb,ilike as RD,inArray as tm}from"drizzle-orm";var ks=new SD;ks.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"),d=e.req.query("projectId"),l=e.req.query("gitRemote"),m=Number(e.req.query("limit")??"50"),p=Number(e.req.query("offset")??"0"),_=[rn(y.userId,t)];if(e.req.query("includeInternal")==="true"||_.push(We`${y.origin} <> 'internal_worker'`),n&&_.push(rn(y.tool,n)),d){let v=[rn(y.projectId,d)];l&&v.push(We`${y.metadata}->>'gitRemote' = ${l}`),_.push(v.length===1?v[0]:Yb(...v))}else if(a||l){let v=[];a&&v.push(RD(y.projectPath,`%${ct(a)}%`)),l&&v.push(We`${y.metadata}->>'gitRemote' = ${l}`),_.push(v.length===1?v[0]:Yb(...v))}if(e.req.query("hideEmpty")!=="false"&&_.push(We`${y.eventCount} > 0`),i==="true"?_.push(We`${y.analysis} IS NOT NULL`):i==="false"&&_.push(We`${y.analysis} IS NULL`),e.req.query("needsFacets")==="true"){let v=e.req.query("graderVersion"),I=v!=null&&/^\d+$/.test(v)?Number(v):null;I===null?_.push(We`${y.analysis}->>'outcome' IS NULL`):_.push(We`(
447
447
  ${y.analysis}->>'outcome' IS NULL
448
448
  OR COALESCE((${y.analysis}->>'graderVersion')::int, 0) < ${I}
449
- )`)}if(r&&_.push(Ve`${y.analysis}->>'outcome' = ${r}`),o&&_.push(Ve`(${y.analysis}->'friction')::text ILIKE ${"%"+ct(o)+"%"}`),s){let I=(await d.select({sessionId:se.sessionId}).from(se).where(yn(se.instructionId,s))).map(b=>b.sessionId);if(I.length===0)return e.json([]);_.push(Ve`${y.id} IN (${Ve.join(I.map(b=>Ve`${b}`),Ve`, `)})`)}if(e.req.query("summary")==="exists"){let[w]=await d.select({id:y.id}).from(y).where(Rs(..._)).limit(1);return e.json({exists:!!w})}if(e.req.query("summary")==="count"){let[w]=await d.select({count:Ve`count(*)::int`}).from(y).where(Rs(..._));return e.json({count:Number(w?.count??0)})}let m=await d.select().from(y).where(Rs(..._)).orderBy(Hb(y.startedAt)).limit(p).offset(f);if(m.length>0){let w=m.map(B=>B.id),I=Array.from(new Set(m.map(B=>B.projectId).filter(B=>!!B))),[b,A,E,S,R,O,W]=await Promise.all([d.select({sessionId:se.sessionId,name:g.name,contextIdentity:g.contextIdentity,type:g.type,source:Ve`${g.frontmatter}->>'source'`}).from(se).innerJoin(g,yn(g.id,se.instructionId)).where(Gl(se.sessionId,w)),d.select({sessionId:M.sessionId}).from(M).where(Gl(M.sessionId,w)).groupBy(M.sessionId),d.execute(Ve`
449
+ )`)}if(r&&_.push(We`${y.analysis}->>'outcome' = ${r}`),o&&_.push(We`(${y.analysis}->'friction')::text ILIKE ${"%"+ct(o)+"%"}`),s){let I=(await u.select({sessionId:ie.sessionId}).from(ie).where(rn(ie.instructionId,s))).map(E=>E.sessionId);if(I.length===0)return e.json([]);_.push(We`${y.id} IN (${We.join(I.map(E=>We`${E}`),We`, `)})`)}if(e.req.query("summary")==="exists"){let[v]=await u.select({id:y.id}).from(y).where(Xr(..._)).limit(1);return e.json({exists:!!v})}if(e.req.query("summary")==="count"){let[v]=await u.select({count:We`count(*)::int`}).from(y).where(Xr(..._));return e.json({count:Number(v?.count??0)})}let h=await u.select().from(y).where(Xr(..._)).orderBy(ih(y.startedAt)).limit(m).offset(p);if(h.length>0){let v=h.map(F=>F.id),I=Array.from(new Set(h.map(F=>F.projectId).filter(F=>!!F))),[E,A,b,S,T,P,H]=await Promise.all([u.select({sessionId:ie.sessionId,name:g.name,contextIdentity:g.contextIdentity,type:g.type,source:We`${g.frontmatter}->>'source'`}).from(ie).innerJoin(g,rn(g.id,ie.instructionId)).where(tm(ie.sessionId,v)),u.select({sessionId:M.sessionId}).from(M).where(tm(M.sessionId,v)).groupBy(M.sessionId),u.execute(We`
450
450
  SELECT session_id, MAX(timestamp) AS last_at
451
451
  FROM session_events
452
- WHERE session_id IN (${Ve.join(w.map(B=>Ve`${B}`),Ve`, `)})
452
+ WHERE session_id IN (${We.join(v.map(F=>We`${F}`),We`, `)})
453
453
  GROUP BY session_id
454
- `),d.execute(Ve`
454
+ `),u.execute(We`
455
455
  SELECT DISTINCT ON (e.session_id)
456
456
  e.session_id,
457
457
  -- Collapse whitespace runs into a single space for preview rendering.
@@ -461,22 +461,22 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
461
461
  -- lowercase s from every preview ever shown.
462
462
  LEFT(REGEXP_REPLACE(COALESCE(e.content, ''), '[[:space:]]+', ' ', 'g'), 120) AS preview
463
463
  FROM session_events e
464
- WHERE e.session_id IN (${Ve.join(w.map(B=>Ve`${B}`),Ve`, `)})
464
+ WHERE e.session_id IN (${We.join(v.map(F=>We`${F}`),We`, `)})
465
465
  AND e.event_type IN ('user_message', 'human')
466
466
  AND e.content IS NOT NULL
467
467
  AND e.content <> ''
468
468
  ORDER BY e.session_id, e.timestamp DESC
469
- `),d.execute(Ve`
469
+ `),u.execute(We`
470
470
  SELECT DISTINCT ON (e.session_id)
471
471
  e.session_id,
472
472
  LEFT(REGEXP_REPLACE(COALESCE(e.content, ''), '[[:space:]]+', ' ', 'g'), 240) AS first_prompt
473
473
  FROM session_events e
474
- WHERE e.session_id IN (${Ve.join(w.map(B=>Ve`${B}`),Ve`, `)})
474
+ WHERE e.session_id IN (${We.join(v.map(F=>We`${F}`),We`, `)})
475
475
  AND e.event_type IN ('user_message', 'human')
476
476
  AND e.content IS NOT NULL
477
477
  AND e.content <> ''
478
478
  ORDER BY e.session_id, e.timestamp ASC
479
- `),I.length>0?d.select({id:C.id,name:C.name}).from(C).where(Gl(C.id,I)):Promise.resolve([]),I.length>0?d.execute(Fi(I)):Promise.resolve([])]),N=new Map;for(let B of b){let he=N.get(B.sessionId)??[];he.push({name:B.name,contextIdentity:B.contextIdentity,type:B.type,source:B.source}),N.set(B.sessionId,he)}let q=new Set;for(let B of A)B.sessionId&&q.add(B.sessionId);let U=new Map;for(let B of E)U.set(B.session_id,B.last_at);let H=new Map;for(let B of S)H.set(B.session_id,B.preview);let te=new Map;for(let B of R)te.set(B.session_id,B.first_prompt);let de=new Map,K=new Map;for(let B of O)de.set(B.id,B.name);for(let B of W)K.set(B.project_id,B.path);let me=m.map(B=>({...B,linkedInstructions:N.get(B.id)??[],dataTier:q.has(B.id)?"full":(B.eventCount??0)>0?"events":"imported",lastMessagePreview:H.get(B.id)??B.analysis?.goalSummary??null,firstUserPrompt:te.get(B.id)??null,projectName:B.projectId?de.get(B.projectId)??null:null,primaryCheckoutPath:B.projectId?K.get(B.projectId)??null:null,lastActivityAt:U.get(B.id)??B.startedAt}));return e.json(me)}return e.json(m)});Zi.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(Ve`
479
+ `),I.length>0?u.select({id:C.id,name:C.name}).from(C).where(tm(C.id,I)):Promise.resolve([]),I.length>0?u.execute(Wi(I)):Promise.resolve([])]),N=new Map;for(let F of E){let he=N.get(F.sessionId)??[];he.push({name:F.name,contextIdentity:F.contextIdentity,type:F.type,source:F.source}),N.set(F.sessionId,he)}let U=new Set;for(let F of A)F.sessionId&&U.add(F.sessionId);let q=new Map;for(let F of b)q.set(F.session_id,F.last_at);let B=new Map;for(let F of S)B.set(F.session_id,F.preview);let J=new Map;for(let F of T)J.set(F.session_id,F.first_prompt);let ce=new Map,V=new Map;for(let F of P)ce.set(F.id,F.name);for(let F of H)V.set(F.project_id,F.path);let pe=h.map(F=>({...F,linkedInstructions:N.get(F.id)??[],dataTier:U.has(F.id)?"full":(F.eventCount??0)>0?"events":"imported",lastMessagePreview:B.get(F.id)??F.analysis?.goalSummary??null,firstUserPrompt:J.get(F.id)??null,projectName:F.projectId?ce.get(F.projectId)??null:null,primaryCheckoutPath:F.projectId?V.get(F.projectId)??null:null,lastActivityAt:q.get(F.id)??F.startedAt}));return e.json(pe)}return e.json(h)});ks.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(We`
480
480
  WITH recent AS (
481
481
  SELECT
482
482
  s.project_id,
@@ -573,20 +573,25 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
573
573
  ) deduped
574
574
  ORDER BY last_activity DESC
575
575
  LIMIT ${o}
576
- `),a=Array.from(i).map(u=>u.project_path).filter(u=>typeof u=="string"&&u!=="");return e.json({projectPaths:a})});Zi.get("/sessions/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select().from(y).where(Rs(yn(y.id,n),yn(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,yn(g.id,se.instructionId)).where(Rs(yn(se.sessionId,n),Ve`${g.content} IS NOT NULL AND ${g.content} != ''`)),s=await d.select({eventType:ze.eventType,count:Ve`count(*)::int`}).from(ze).where(yn(ze.sessionId,n)).groupBy(ze.eventType),i={};for(let l of s)i[l.eventType]=Number(l.count);let a=null,u=null;if(r.projectId){let[l]=await d.select({name:C.name}).from(C).where(yn(C.id,r.projectId));a=l?.name??null;let[p]=await d.execute(Fi([r.projectId]));u=p?.path??null}return e.json({...r,linkedInstructions:o.map(l=>({...l,source:Qd(l.frontmatter)})),projectName:a,primaryCheckoutPath:u,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}})});Zi.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(f=>f.trim()).filter(Boolean),a=e.req.query("hasContent")==="true",[u]=await d.select({id:y.id}).from(y).where(Rs(yn(y.id,n),yn(y.userId,t)));if(!u)return e.json({error:"Session not found"},404);let l=[yn(ze.sessionId,n)];i.length>0&&l.push(Gl(ze.eventType,i)),a&&l.push(Ve`${ze.content} IS NOT NULL AND ${ze.content} != ''`);let p=await d.select().from(ze).where(Rs(...l)).orderBy(s==="desc"?Hb(ze.sequence):yD(ze.sequence)).limit(r).offset(o);return e.json(p)});D();import{Hono as vD}from"hono";import{z as rn}from"zod";import{eq as ea,and as eh,desc as ID,sql as ta}from"drizzle-orm";var ks=new vD;ks.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(eh(ea(y.id,n),ea(y.userId,t)));if(!r)return e.json({error:"Session not found"},404);let{id:o}=await Ot({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)});ks.post("/sessions/repair-analyzed-at",async e=>{let t=e.get("userId"),n=await d.execute(ta`
576
+ `),a=Array.from(i).map(d=>d.project_path).filter(d=>typeof d=="string"&&d!=="");return e.json({projectPaths:a})});ks.get("/sessions/unattributed",async e=>{let t=e.get("userId"),n=Math.min(Number(e.req.query("limit")??200)||200,1e3),r=We`(
577
+ ${y.projectId} IS NULL
578
+ OR NOT EXISTS (
579
+ SELECT 1 FROM project_checkouts pc WHERE pc.project_id = ${y.projectId}
580
+ )
581
+ )`,[{total:o}]=await u.select({total:We`COUNT(*)::int`}).from(y).where(Xr(rn(y.userId,t),r)),s=await u.select({id:y.id,externalSessionId:y.externalSessionId,tool:y.tool,projectPath:y.projectPath,eventCount:y.eventCount,startedAt:y.startedAt}).from(y).where(Xr(rn(y.userId,t),r)).orderBy(ih(y.startedAt)).limit(n);return e.json({total:Number(o),sessions:s})});ks.get("/sessions/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(y).where(Xr(rn(y.id,n),rn(y.userId,t)));if(!r)return e.json({error:"Session not found"},404);let o=await u.select({instructionId:ie.instructionId,linkMethod:ie.linkMethod,name:g.name,contextIdentity:g.contextIdentity,content:g.content,scope:g.scope,type:g.type,frontmatter:g.frontmatter}).from(ie).innerJoin(g,rn(g.id,ie.instructionId)).where(Xr(rn(ie.sessionId,n),We`${g.content} IS NOT NULL AND ${g.content} != ''`)),s=await u.select({eventType:Ve.eventType,count:We`count(*)::int`}).from(Ve).where(rn(Ve.sessionId,n)).groupBy(Ve.eventType),i={};for(let l of s)i[l.eventType]=Number(l.count);let a=null,d=null;if(r.projectId){let[l]=await u.select({name:C.name}).from(C).where(rn(C.id,r.projectId));a=l?.name??null;let[m]=await u.execute(Wi([r.projectId]));d=m?.path??null}return e.json({...r,linkedInstructions:o.map(l=>({...l,source:ol(l.frontmatter)})),projectName:a,primaryCheckoutPath:d,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}})});ks.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),a=e.req.query("hasContent")==="true",[d]=await u.select({id:y.id}).from(y).where(Xr(rn(y.id,n),rn(y.userId,t)));if(!d)return e.json({error:"Session not found"},404);let l=[rn(Ve.sessionId,n)];i.length>0&&l.push(tm(Ve.eventType,i)),a&&l.push(We`${Ve.content} IS NOT NULL AND ${Ve.content} != ''`);let m=await u.select().from(Ve).where(Xr(...l)).orderBy(s==="desc"?ih(Ve.sequence):xD(Ve.sequence)).limit(r).offset(o);return e.json(m)});O();import{Hono as TD}from"hono";import{z as on}from"zod";import{eq as ea,and as ah,desc as kD,sql as ta}from"drizzle-orm";var Ns=new TD;Ns.post("/sessions/:id/analyze",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:y.id,tool:y.tool}).from(y).where(ah(ea(y.id,n),ea(y.userId,t)));if(!r)return e.json({error:"Session not found"},404);let{id:o}=await Ct({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)});Ns.post("/sessions/repair-analyzed-at",async e=>{let t=e.get("userId"),n=await u.execute(ta`
577
582
  UPDATE sessions
578
583
  SET analyzed_at = started_at
579
584
  WHERE user_id = ${t}
580
585
  AND analysis IS NOT NULL
581
586
  AND analyzed_at IS NULL
582
587
  RETURNING id
583
- `);return e.json({repaired:n.length})});var bD=rn.object({metadata:rn.record(rn.unknown()).optional(),analysis:rn.record(rn.unknown()).optional(),analyzedEventCount:rn.number().int().nonnegative().optional(),analyzedTurnCount:rn.number().int().nonnegative().optional(),tokenUsage:rn.object({inputTokens:rn.number().optional(),outputTokens:rn.number().optional(),cacheReadTokens:rn.number().optional(),cacheWriteTokens:rn.number().optional()}).optional(),externalSessionId:rn.string().uuid().optional()}).strict();ks.patch("/sessions/:id/enrich",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=bD.parse(await e.req.json()),[o]=await d.select({id:y.id}).from(y).where(eh(ea(y.id,n),ea(y.userId,t)));if(!o)return e.json({error:"Session not found"},404);let s={};return r.metadata&&(s.metadata=ta`COALESCE(${y.metadata}, '{}'::jsonb) || ${JSON.stringify(r.metadata)}::jsonb`),r.analysis&&(s.analysis=ta`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(ea(y.id,n)),e.json({enriched:!0,fields:Object.keys(s)}))});ks.post("/sessions/:id/derive-enrichment",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json().catch(()=>({})),o=await kl(n,{userId:t,force:r.force===!0});return o.status==="skipped"?o.reason==="not_found"?e.json({error:"Session not found"},404):e.json({skipped:!0,reason:o.reason}):e.json({enriched:!0,metrics:o.metrics})});var ED=rn.object({limit:rn.number().int().positive().max(500).default(100),force:rn.boolean().default(!1)});ks.post("/sessions/derive-enrichment-backfill",async e=>{let t=e.get("userId"),{limit:n,force:r}=ED.parse(await e.req.json().catch(()=>({}))),o=ta`(
588
+ `);return e.json({repaired:n.length})});var ND=on.object({metadata:on.record(on.unknown()).optional(),analysis:on.record(on.unknown()).optional(),analyzedEventCount:on.number().int().nonnegative().optional(),analyzedTurnCount:on.number().int().nonnegative().optional(),tokenUsage:on.object({inputTokens:on.number().optional(),outputTokens:on.number().optional(),cacheReadTokens:on.number().optional(),cacheWriteTokens:on.number().optional()}).optional(),externalSessionId:on.string().uuid().optional()}).strict();Ns.patch("/sessions/:id/enrich",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=ND.parse(await e.req.json()),[o]=await u.select({id:y.id}).from(y).where(ah(ea(y.id,n),ea(y.userId,t)));if(!o)return e.json({error:"Session not found"},404);let s={};return r.metadata&&(s.metadata=ta`COALESCE(${y.metadata}, '{}'::jsonb) || ${JSON.stringify(r.metadata)}::jsonb`),r.analysis&&(s.analysis=ta`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 u.update(y).set(s).where(ea(y.id,n)),e.json({enriched:!0,fields:Object.keys(s)}))});Ns.post("/sessions/:id/derive-enrichment",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json().catch(()=>({})),o=await Ol(n,{userId:t,force:r.force===!0});return o.status==="skipped"?o.reason==="not_found"?e.json({error:"Session not found"},404):e.json({skipped:!0,reason:o.reason}):e.json({enriched:!0,metrics:o.metrics})});var jD=on.object({limit:on.number().int().positive().max(500).default(100),force:on.boolean().default(!1)});Ns.post("/sessions/derive-enrichment-backfill",async e=>{let t=e.get("userId"),{limit:n,force:r}=jD.parse(await e.req.json().catch(()=>({}))),o=ta`(
584
589
  ${y.metadata}->'local_session_meta' IS NULL
585
590
  OR (
586
591
  (${y.metadata}->'local_session_meta'->>'derived_from_events')::boolean IS TRUE
587
- AND COALESCE((${y.metadata}->'local_session_meta'->>'derived_schema')::int, 1) < ${Rl}
592
+ AND COALESCE((${y.metadata}->'local_session_meta'->>'derived_schema')::int, 1) < ${Dl}
588
593
  )
589
- )`,s=await d.select({id:y.id}).from(y).where(eh(ea(y.userId,t),ta`COALESCE(${y.eventCount}, 0) > 0`,r?ta`COALESCE(${y.metadata}->'local_session_meta'->>'derived_from_events', 'true') = 'true'`:o)).orderBy(ID(y.startedAt)).limit(n),i={scanned:s.length,enriched:0,skipped:0,failed:0},a={};for(let u of s)try{let l=await kl(u.id,{userId:t,force:r});l.status==="enriched"?i.enriched++:(i.skipped++,a[l.reason]=(a[l.reason]??0)+1)}catch(l){i.failed++,console.warn("[derive-enrichment-backfill] session",u.id,"failed:",l instanceof Error?l.message:l)}return e.json({...i,reasons:a})});D();import{Hono as CD}from"hono";import{z as cu}from"zod";import{eq as qt,and as uu,asc as LD,desc as MD,sql as au}from"drizzle-orm";var AD=Number(process.env.PG_MESSAGE_RECONSTRUCT_BUDGET_BYTES)||16e6,SD=Number(process.env.PG_MESSAGE_RECONSTRUCT_PAGE_SIZE)||200;function xD(e){try{let t=JSON.stringify(e);return typeof t=="string"?t.length:0}catch{return 0}}c(xD,"estimateBytes");async function Yl(e){let t=e.budgetBytes??AD,n=e.pageSize??SD,r=[],o=0,s=0,i=-1;for(;;){let a=await e.fetchPage(i,n);if(s++,a.length===0)break;for(let u of a){if(Array.isArray(u.messagesDelta))for(let l of u.messagesDelta){let p=xD(l);if(o+p>t)return{messages:r,truncated:!0,bytes:o,pages:s};r.push(l),o+=p}i=u.sequence}if(a.length<n)break}return{messages:r,truncated:!1,bytes:o,pages:s}}c(Yl,"reconstructMessagesBounded");Zl();D();import{inArray as jD}from"drizzle-orm";async function Kb(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:Rn.hash,content:Rn.content}).from(Rn).where(jD(Rn.hash,t));return new Map(n.map(r=>[r.hash,r.content]))}c(Kb,"fetchBlobMap");async function ep(e,t){return e?(await Kb([e])).get(e)??t:t}c(ep,"resolveBlob");async function Gb(e){if(e.length===0)return e;let t=await Kb(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:Jb(n.toolsHash!=null?t.get(n.toolsHash):void 0,n.tools),injectedInstructions:Jb(n.injectedHash!=null?t.get(n.injectedHash):void 0,n.injectedInstructions)}))}c(Gb,"resolveSnapshotBlobs");function Jb(e,t){return Array.isArray(e)?e:t}c(Jb,"preferArray");D();import{eq as DD,sql as OD}from"drizzle-orm";var PD=["x-anthropic-billing-header:","You are Claude Code, Anthropic","You are a Claude agent, built on Anthropic's Claude Agent SDK"];function Yb(e){if(!e)return!1;let t=e.slice(0,400);return PD.some(n=>t.includes(n))}c(Yb,"looksLikeHarnessSystemPrompt");hg();async function Xb(e){let{userId:t,hashToInstruction:n,seenHashes:r,linkedProjectPath:o}=e,s=0;for(let[i,a]of n){if(!r.has(i)||!a.name.includes("CLAUDE")&&!a.name.includes("rules"))continue;let[u]=await d.select({id:k.id}).from(k).where(OD`${k.metadata}->>'content_hash' = ${i}`).limit(1);if(u||a.contentLen===0)continue;let[l]=await d.select({content:g.content}).from(g).where(DD(g.id,a.id)).limit(1),p=gl(l?.content,a.name);if(p&&!Yb(p))try{let[f]=await d.insert(k).values({userId:t,name:a.name,type:"instruction",content:p,description:`Auto-generated from captured context: ${a.name}`,instructionId:a.id,projectPath:o,metadata:{content_hash:i,auto_generated:!0}}).returning({id:k.id}),_=/(?:^|\n)\s*[-*]?\s*((?:NEVER|ALWAYS|MUST|DO NOT|IMPORTANT)[^\n.]+[.\n])/gi,v=[...p.matchAll(_)].map(m=>m[1].trim()).slice(0,3),h=v.length>0?v.map(m=>({name:`rule-adherence: ${m.slice(0,60)}`,prompt:`Given the instruction "${a.name}", perform a task that would test whether this rule is followed: "${m}"`,expectations:[`The response should demonstrate adherence to: ${m}`]})):[{name:`general-adherence: ${a.name}`,prompt:`Perform a typical task guided by this instruction: "${a.name}"`,expectations:["The response should follow conventions described in the instruction"]}];for(let m of h)await d.insert(Ee).values({evalTargetId:f.id,name:m.name,prompt:m.prompt,expectations:m.expectations}),s++}catch{}}return s}c(Xb,"autoGenerateEvalTargets");function tp(){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}}}c(tp,"makeSingleFlight");var du=new CD;du.post("/sessions/:id/link",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),{instructionId:o}=cu.object({instructionId:cu.string().uuid()}).parse(r),[s]=await d.select({id:y.id}).from(y).where(uu(qt(y.id,n),qt(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)});du.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,qt(y.id,se.sessionId)).where(uu(qt(se.instructionId,n),qt(y.userId,t))),o=r.filter(u=>u.analysis),s=o.map(u=>u.analysis),i=s.length>0?Math.round(s.reduce((u,l)=>u+(l.adherenceScore??0),0)/s.length):null,a=s.flatMap(u=>u.suggestions??[]).filter(u=>u.instructionId===n);return e.json({instructionId:n,totalSessions:r.length,analyzedSessions:o.length,averageAdherence:i,suggestions:a})});var sh=new Set(["claude_md","memory","skill_loaded"]);function $D(e,t){return Mf(e,t)??`${e}::${t}`}c($D,"deriveContextIdentityForAutoCreate");function Qb(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}`}c(Qb,"mapContextTypeToDescription");var qD=cu.object({sessionId:cu.string().uuid().optional(),backfill:cu.boolean().optional()});async function UD(e,t,n,r){for(let s=0;s<=4;s++)try{await d.execute(au`
594
+ )`,s=await u.select({id:y.id}).from(y).where(ah(ea(y.userId,t),ta`COALESCE(${y.eventCount}, 0) > 0`,r?ta`COALESCE(${y.metadata}->'local_session_meta'->>'derived_from_events', 'true') = 'true'`:o)).orderBy(kD(y.startedAt)).limit(n),i={scanned:s.length,enriched:0,skipped:0,failed:0},a={};for(let d of s)try{let l=await Ol(d.id,{userId:t,force:r});l.status==="enriched"?i.enriched++:(i.skipped++,a[l.reason]=(a[l.reason]??0)+1)}catch(l){i.failed++,console.warn("[derive-enrichment-backfill] session",d.id,"failed:",l instanceof Error?l.message:l)}return e.json({...i,reasons:a})});O();import{Hono as FD}from"hono";import{z as ud}from"zod";import{eq as Ut,and as ld,asc as WD,desc as zD,sql as dd}from"drizzle-orm";var PD=Number(process.env.PG_MESSAGE_RECONSTRUCT_BUDGET_BYTES)||16e6,DD=Number(process.env.PG_MESSAGE_RECONSTRUCT_PAGE_SIZE)||200;function OD(e){try{let t=JSON.stringify(e);return typeof t=="string"?t.length:0}catch{return 0}}c(OD,"estimateBytes");async function nm(e){let t=e.budgetBytes??PD,n=e.pageSize??DD,r=[],o=0,s=0,i=-1;for(;;){let a=await e.fetchPage(i,n);if(s++,a.length===0)break;for(let d of a){if(Array.isArray(d.messagesDelta))for(let l of d.messagesDelta){let m=OD(l);if(o+m>t)return{messages:r,truncated:!0,bytes:o,pages:s};r.push(l),o+=m}i=d.sequence}if(a.length<n)break}return{messages:r,truncated:!1,bytes:o,pages:s}}c(nm,"reconstructMessagesBounded");sm();O();import{inArray as qD}from"drizzle-orm";async function r0(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:Tn.hash,content:Tn.content}).from(Tn).where(qD(Tn.hash,t));return new Map(n.map(r=>[r.hash,r.content]))}c(r0,"fetchBlobMap");async function im(e,t){return e?(await r0([e])).get(e)??t:t}c(im,"resolveBlob");async function o0(e){if(e.length===0)return e;let t=await r0(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:n0(n.toolsHash!=null?t.get(n.toolsHash):void 0,n.tools),injectedInstructions:n0(n.injectedHash!=null?t.get(n.injectedHash):void 0,n.injectedInstructions)}))}c(o0,"resolveSnapshotBlobs");function n0(e,t){return Array.isArray(e)?e:t}c(n0,"preferArray");O();import{eq as HD,sql as BD}from"drizzle-orm";var UD=["x-anthropic-billing-header:","You are Claude Code, Anthropic","You are a Claude agent, built on Anthropic's Claude Agent SDK"];function s0(e){if(!e)return!1;let t=e.slice(0,400);return UD.some(n=>t.includes(n))}c(s0,"looksLikeHarnessSystemPrompt");bg();async function i0(e){let{userId:t,hashToInstruction:n,seenHashes:r,linkedProjectPath:o}=e,s=0;for(let[i,a]of n){if(!r.has(i)||!a.name.includes("CLAUDE")&&!a.name.includes("rules"))continue;let[d]=await u.select({id:k.id}).from(k).where(BD`${k.metadata}->>'content_hash' = ${i}`).limit(1);if(d||a.contentLen===0)continue;let[l]=await u.select({content:g.content}).from(g).where(HD(g.id,a.id)).limit(1),m=vl(l?.content,a.name);if(m&&!s0(m))try{let[p]=await u.insert(k).values({userId:t,name:a.name,type:"instruction",content:m,description:`Auto-generated from captured context: ${a.name}`,instructionId:a.id,projectPath:o,metadata:{content_hash:i,auto_generated:!0}}).returning({id:k.id}),_=/(?:^|\n)\s*[-*]?\s*((?:NEVER|ALWAYS|MUST|DO NOT|IMPORTANT)[^\n.]+[.\n])/gi,w=[...m.matchAll(_)].map(h=>h[1].trim()).slice(0,3),f=w.length>0?w.map(h=>({name:`rule-adherence: ${h.slice(0,60)}`,prompt:`Given the instruction "${a.name}", perform a task that would test whether this rule is followed: "${h}"`,expectations:[`The response should demonstrate adherence to: ${h}`]})):[{name:`general-adherence: ${a.name}`,prompt:`Perform a typical task guided by this instruction: "${a.name}"`,expectations:["The response should follow conventions described in the instruction"]}];for(let h of f)await u.insert(Ee).values({evalTargetId:p.id,name:h.name,prompt:h.prompt,expectations:h.expectations}),s++}catch{}}return s}c(i0,"autoGenerateEvalTargets");function am(){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}}}c(am,"makeSingleFlight");var md=new FD;md.post("/sessions/:id/link",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),{instructionId:o}=ud.object({instructionId:ud.string().uuid()}).parse(r),[s]=await u.select({id:y.id}).from(y).where(ld(Ut(y.id,n),Ut(y.userId,t)));return s?(await u.insert(ie).values({sessionId:n,instructionId:o,linkMethod:"manual"}).onConflictDoNothing(),e.json({linked:!0})):e.json({error:"Session not found"},404)});md.get("/instructions/:id/insights",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await u.select({sessionId:ie.sessionId,analysis:y.analysis,tool:y.tool,startedAt:y.startedAt}).from(ie).innerJoin(y,Ut(y.id,ie.sessionId)).where(ld(Ut(ie.instructionId,n),Ut(y.userId,t))),o=r.filter(d=>d.analysis),s=o.map(d=>d.analysis),i=s.length>0?Math.round(s.reduce((d,l)=>d+(l.adherenceScore??0),0)/s.length):null,a=s.flatMap(d=>d.suggestions??[]).filter(d=>d.instructionId===n);return e.json({instructionId:n,totalSessions:r.length,analyzedSessions:o.length,averageAdherence:i,suggestions:a})});var mh=new Set(["claude_md","memory","skill_loaded"]);function VD(e,t){return Ff(e,t)??`${e}::${t}`}c(VD,"deriveContextIdentityForAutoCreate");function a0(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}`}c(a0,"mapContextTypeToDescription");var JD=ud.object({sessionId:ud.string().uuid().optional(),backfill:ud.boolean().optional()});async function KD(e,t,n,r){for(let s=0;s<=4;s++)try{await u.execute(dd`
590
595
  insert into instruction_version_identities
591
596
  (instruction_id, content_hash, version_ordinal, content, first_seen_at, last_seen_at)
592
597
  select
@@ -608,8 +613,8 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
608
613
  first_seen_at = least(
609
614
  instruction_version_identities.first_seen_at, excluded.first_seen_at),
610
615
  content = coalesce(instruction_version_identities.content, excluded.content)
611
- `);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}}c(UD,"registerVersionIdentity");async function HD(e,t){let n=await d.select({id:g.id,contentHash:g.contentHash,name:g.name,contextIdentity:g.contextIdentity,contentLen:au`COALESCE(LENGTH(${g.content}), 0)::int`}).from(g).where(qt(g.createdBy,e)),r=new Map,o=new Map;for(let A of n){let E=Number(A.contentLen??0);A.contentHash&&r.set(A.contentHash,{id:A.id,name:A.name??"",contentLen:E}),A.contextIdentity&&o.set(A.contextIdentity,{id:A.id,name:A.name??"",contentHash:A.contentHash})}let s=await Fe.selectDistinctOn([M.sessionId],{id:M.id,sessionId:M.sessionId,metadata:M.metadata}).from(M).where(t?uu(qt(M.userId,e),qt(M.sessionId,t)):qt(M.userId,e)).orderBy(M.sessionId,MD(M.capturedAt)).limit(1e3),i=new Set,a=new Set,u=new Map,l=0,p=0,f=0,_=0,v=new Set,h=[],m=new Map;for(let A of s){if(!A.sessionId||i.has(A.sessionId))continue;i.add(A.sessionId);let S=A.metadata?.contextItems??[],R=null;async function O(){if(R)return R;let[N]=await Fe.select({injectedInstructions:M.injectedInstructions,injectedHash:M.injectedHash}).from(M).where(qt(M.id,A.id)).limit(1);return R=await ep(N?.injectedHash,N?.injectedInstructions??[]),R}c(O,"getInjected");async function W(){if(!A.sessionId)return[];let N=u.get(A.sessionId);if(N)return N;let q=A.sessionId,{messages:U}=await Yl({fetchPage:c(async(te,de)=>iu(await Fe.select({sequence:M.sequence,messagesDelta:M.messagesDelta,messagesDeltaRef:M.messagesDeltaRef}).from(M).where(uu(qt(M.sessionId,q),qt(M.userId,e),au`${M.sequence} > ${te}`)).orderBy(LD(M.sequence)).limit(de)),"fetchPage")}),H=U;return u.set(A.sessionId,H),H}c(W,"getMessagesRaw");for(let N of S){let q=N.content_hash;if(!q)continue;a.add(q);let U=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(U)||["date_change","current_date","task_reminder","git_status","unknown_reminder","available_skills"].includes(H)||U==="skill_catalog"||!sh.has(U)&&!U&&!H.includes(".md")&&!H.includes("rules"))continue;let te,de=!1,K=null,me=r.get(q);if(me&&(te=me.id,sh.has(U)&&me.contentLen===0&&(de=!0)),(!te||de)&&sh.has(U)){let P=$D(U,H),re=N.instruction_index,Ce=null,St=re!=null?await O():[];if(re!=null&&St[re])Ce=St[re];else if(U==="skill_loaded"&&N.message_index!=null){let ce=await W(),Se=N.message_index,We=ce[Se];if(We){let rt=We.content,Xe=(Array.isArray(rt)?rt.find(be=>be.type==="tool_use"&&(be.name==="Skill"||be.name==="execute_skill")):void 0)?.id;if(Xe)for(let be=Se+1;be<ce.length&&be<Se+5;be++){let an=ce[be];if(an?.role!=="user")continue;let L=an.content;if(!Array.isArray(L))continue;let j=!1,ht=[];for(let jt of L)jt.type==="tool_result"&&jt.tool_use_id===Xe?j=!0:jt.type==="text"&&j&&ht.push(jt.text??"");if(j){Ce=ht.length>0?ht.join(`
612
- `):null;break}}}}if(K=Ce,de&&Ce&&te)try{await d.update(g).set({content:Ce,updatedAt:new Date}).where(qt(g.id,te)),me.contentLen=Ce.length,f++}catch(ce){console.warn(`[link-instructions] Content backfill failed for instruction ${te}:`,ce instanceof Error?ce.message:ce),_++}let le=o.get(P);if(le&&le.contentHash!==q){if(Ce){let ce=Ce,Se=4,We=!1;for(let rt=0;rt<=Se;rt++)try{await d.transaction(async Le=>{await Le.select({id:g.id}).from(g).where(qt(g.id,le.id)).for("update");let[{maxVersion:Xe}]=await Le.select({maxVersion:au`COALESCE(MAX(${xe.versionNumber}), 0)`}).from(xe).where(qt(xe.instructionId,le.id)),be=Xe+1;await Le.insert(xe).values({instructionId:le.id,versionNumber:be,content:ce,frontmatter:{name:H,description:Qb(U,H),type:"context_file",scope:"personal",version:`1.${be}.0`},changeSummary:"Auto-detected content change from context snapshot",createdBy:e}),await Le.update(g).set({content:ce,contentHash:q,version:`1.${be}.0`,updatedAt:new Date}).where(qt(g.id,le.id))}),We=!0;break}catch(Le){if(Le.cause?.code==="23505"&&rt<Se)continue;console.warn(`[link-instructions] Version update failed for instruction ${le.id} (identity: ${P}):`,Le instanceof Error?Le.message:Le),_++;break}We&&(r.set(q,{id:le.id,name:le.name,contentLen:ce.length}),le.contentHash=q,f++)}te=le.id}else if(!le)try{let ce=H,Se=Qb(U,H),We=Ce??"",rt={name:ce,description:Se,type:"context_file",scope:"personal",version:"1.0.0"},Le;await d.transaction(async Xe=>{let[be]=await Xe.insert(g).values({name:ce,description:Se,type:"context_file",scope:"personal",scopeRef:e,version:"1.0.0",content:We,frontmatter:rt,contentHash:q,contextIdentity:P,createdBy:e}).onConflictDoNothing().returning({id:g.id});be&&(await Xe.insert(xe).values({instructionId:be.id,versionNumber:1,content:We,frontmatter:rt,changeSummary:"Auto-created from context snapshot",createdBy:e}),Le=be.id)}),Le&&(r.set(q,{id:Le,name:ce,contentLen:We.length}),o.set(P,{id:Le,name:ce,contentHash:q}),te=Le,p++)}catch(ce){console.warn(`[link-instructions] Auto-create failed for ${P}:`,ce instanceof Error?ce.message:ce),_++;try{let[Se]=await d.select({id:g.id}).from(g).where(uu(qt(g.createdBy,e),qt(g.contextIdentity,P))).limit(1);Se&&(te=Se.id)}catch(Se){console.warn(`[link-instructions] Fallback identity lookup also failed for ${P}:`,Se instanceof Error?Se.message:Se)}}}if(!te||!A.sessionId)continue;let B=`${te}:${q}`,he=m.get(B);he?!he.content&&K&&(he.content=K):m.set(B,{instructionId:te,contentHash:q,content:K}),h.push({sessionId:A.sessionId,instructionId:te,linkMethod:"context_file",contentHash:q}),l++,v.add(A.sessionId)}}for(let A of m.values())await UD(A.instructionId,A.contentHash,A.content,new Date);for(let A=0;A<h.length;A+=500)try{await d.insert(se).values(h.slice(A,A+500)).onConflictDoUpdate({target:[se.sessionId,se.instructionId],set:{contentHash:au`coalesce(${se.contentHash}, excluded.content_hash)`}})}catch(E){console.warn("[link-instructions] batched link insert failed:",E instanceof Error?E.message:E)}let w=0,I=null;for(let A of s){if(!A.sessionId)continue;let[E]=await d.select({projectId:y.projectId,projectPath:y.projectPath}).from(y).where(qt(y.id,A.sessionId)).limit(1);if(!E?.projectId||!E.projectPath)continue;let S=E.projectPath.replace(/\/$/,"");I=S;let O=A.metadata?.contextItems??[];for(let W of O){let N=r.get(W.content_hash);if(!N)continue;let q=W.name??"";if(!(q.startsWith("/")&&!q.startsWith(S+"/")))try{await d.insert(lt).values({projectId:E.projectId,instructionId:N.id,addedBy:e}).onConflictDoNothing(),w++}catch{}}break}let b=await Xb({userId:e,hashToInstruction:r,seenHashes:a,linkedProjectPath:I});return{linked:l,created:p,updated:f,failed:_,sessionsLinked:v.size,instructionsMatched:r.size,snapshotsScanned:i.size,projectsLinked:w,evalsGenerated:b,scope:t?"session":"backfill"}}c(HD,"runLinkInstructions");var BD=tp();du.post("/sessions/link-instructions",async e=>{let t=e.get("userId"),n=await e.req.json().catch(()=>({})),r=qD.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 BD.run(`${t}:${o??"*backfill*"}`,()=>HD(t,o));return e.json(i)});D();import{Hono as FD}from"hono";import{eq as Ns,and as Zb,sql as np,inArray as WD}from"drizzle-orm";var ih=new FD;ih.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(Zb(Ns(y.id,n),Ns(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:np`count(*)::int`}).from(ze).where(Ns(ze.sessionId,n)),d.select({snapshotCount:np`count(*)::int`}).from(M).where(Ns(M.sessionId,n)),d.selectDistinct({ref:M.messagesDeltaRef}).from(M).where(Zb(Ns(M.sessionId,n),np`${M.messagesDeltaRef} IS NOT NULL`))]),a=i.map(f=>f.ref).filter(f=>!!f);await d.transaction(async f=>{await f.update(Ge).set({sessionId:null}).where(Ns(Ge.sessionId,n)),await f.execute(np`UPDATE scaffolding_fingerprints SET first_session_id = NULL WHERE first_session_id = ${n}`),await f.delete(y).where(Ns(y.id,n))});let u=0,l=0,p=0;if(a.length>0){let f=await d.selectDistinct({ref:M.messagesDeltaRef}).from(M).where(WD(M.messagesDeltaRef,a)),_=new Set(f.map(h=>h.ref)),v=a.filter(h=>!_.has(h));if(l=a.length-v.length,v.length>0)try{let{getSupabaseAdmin:h}=await Promise.resolve().then(()=>(ou(),Bb)),{SNAPSHOT_DELTA_BUCKET:m}=await Promise.resolve().then(()=>(Zl(),Vb)),{error:w}=await h().storage.from(m).remove(v);w?(p=v.length,console.warn(`[sessions:delete] blob GC failed for ${v.length} ref(s): ${w.message}`)):u=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:u,blobsRetained:l,blobsFailed:p})});var jo=new zD;jo.route("/",Qi);jo.route("/",Zi);jo.route("/",ks);jo.route("/",du);jo.route("/",ih);D();import{Hono as VD}from"hono";import{eq as ah}from"drizzle-orm";import{sql as na}from"drizzle-orm";var lu=new VD;async function e0(e){let[t]=await d.select({activeOrgId:T.activeOrgId}).from(T).where(ah(T.id,e));return t?.activeOrgId??null}c(e0,"getActiveOrgId");var t0="interval '30 minutes'";lu.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 e0(t);if(!o)return e.json({projects:[],total:0});let s=await d.execute(na`
616
+ `);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}}c(KD,"registerVersionIdentity");async function GD(e,t){let n=await u.select({id:g.id,contentHash:g.contentHash,name:g.name,contextIdentity:g.contextIdentity,contentLen:dd`COALESCE(LENGTH(${g.content}), 0)::int`}).from(g).where(Ut(g.createdBy,e)),r=new Map,o=new Map;for(let A of n){let b=Number(A.contentLen??0);A.contentHash&&r.set(A.contentHash,{id:A.id,name:A.name??"",contentLen:b}),A.contextIdentity&&o.set(A.contextIdentity,{id:A.id,name:A.name??"",contentHash:A.contentHash})}let s=await Fe.selectDistinctOn([M.sessionId],{id:M.id,sessionId:M.sessionId,metadata:M.metadata}).from(M).where(t?ld(Ut(M.userId,e),Ut(M.sessionId,t)):Ut(M.userId,e)).orderBy(M.sessionId,zD(M.capturedAt)).limit(1e3),i=new Set,a=new Set,d=new Map,l=0,m=0,p=0,_=0,w=new Set,f=[],h=new Map;for(let A of s){if(!A.sessionId||i.has(A.sessionId))continue;i.add(A.sessionId);let S=A.metadata?.contextItems??[],T=null;async function P(){if(T)return T;let[N]=await Fe.select({injectedInstructions:M.injectedInstructions,injectedHash:M.injectedHash}).from(M).where(Ut(M.id,A.id)).limit(1);return T=await im(N?.injectedHash,N?.injectedInstructions??[]),T}c(P,"getInjected");async function H(){if(!A.sessionId)return[];let N=d.get(A.sessionId);if(N)return N;let U=A.sessionId,{messages:q}=await nm({fetchPage:c(async(J,ce)=>cd(await Fe.select({sequence:M.sequence,messagesDelta:M.messagesDelta,messagesDeltaRef:M.messagesDeltaRef}).from(M).where(ld(Ut(M.sessionId,U),Ut(M.userId,e),dd`${M.sequence} > ${J}`)).orderBy(WD(M.sequence)).limit(ce)),"fetchPage")}),B=q;return d.set(A.sessionId,B),B}c(H,"getMessagesRaw");for(let N of S){let U=N.content_hash;if(!U)continue;a.add(U);let q=N.type??"",B=N.name??"";if(["user_input","core_system_prompt","available_tools","tool_definitions"].includes(B)||["system_reminder","system_prompt","hook_output","deferred_tools"].includes(q)||["date_change","current_date","task_reminder","git_status","unknown_reminder","available_skills"].includes(B)||q==="skill_catalog"||!mh.has(q)&&!q&&!B.includes(".md")&&!B.includes("rules"))continue;let J,ce=!1,V=null,pe=r.get(U);if(pe&&(J=pe.id,mh.has(q)&&pe.contentLen===0&&(ce=!0)),(!J||ce)&&mh.has(q)){let D=VD(q,B),re=N.instruction_index,Ce=null,St=re!=null?await P():[];if(re!=null&&St[re])Ce=St[re];else if(q==="skill_loaded"&&N.message_index!=null){let de=await H(),Se=N.message_index,ze=de[Se];if(ze){let rt=ze.content,Xe=(Array.isArray(rt)?rt.find(be=>be.type==="tool_use"&&(be.name==="Skill"||be.name==="execute_skill")):void 0)?.id;if(Xe)for(let be=Se+1;be<de.length&&be<Se+5;be++){let cn=de[be];if(cn?.role!=="user")continue;let L=cn.content;if(!Array.isArray(L))continue;let j=!1,ht=[];for(let jt of L)jt.type==="tool_result"&&jt.tool_use_id===Xe?j=!0:jt.type==="text"&&j&&ht.push(jt.text??"");if(j){Ce=ht.length>0?ht.join(`
617
+ `):null;break}}}}if(V=Ce,ce&&Ce&&J)try{await u.update(g).set({content:Ce,updatedAt:new Date}).where(Ut(g.id,J)),pe.contentLen=Ce.length,p++}catch(de){console.warn(`[link-instructions] Content backfill failed for instruction ${J}:`,de instanceof Error?de.message:de),_++}let le=o.get(D);if(le&&le.contentHash!==U){if(Ce){let de=Ce,Se=4,ze=!1;for(let rt=0;rt<=Se;rt++)try{await u.transaction(async Le=>{await Le.select({id:g.id}).from(g).where(Ut(g.id,le.id)).for("update");let[{maxVersion:Xe}]=await Le.select({maxVersion:dd`COALESCE(MAX(${xe.versionNumber}), 0)`}).from(xe).where(Ut(xe.instructionId,le.id)),be=Xe+1;await Le.insert(xe).values({instructionId:le.id,versionNumber:be,content:de,frontmatter:{name:B,description:a0(q,B),type:"context_file",scope:"personal",version:`1.${be}.0`},changeSummary:"Auto-detected content change from context snapshot",createdBy:e}),await Le.update(g).set({content:de,contentHash:U,version:`1.${be}.0`,updatedAt:new Date}).where(Ut(g.id,le.id))}),ze=!0;break}catch(Le){if(Le.cause?.code==="23505"&&rt<Se)continue;console.warn(`[link-instructions] Version update failed for instruction ${le.id} (identity: ${D}):`,Le instanceof Error?Le.message:Le),_++;break}ze&&(r.set(U,{id:le.id,name:le.name,contentLen:de.length}),le.contentHash=U,p++)}J=le.id}else if(!le)try{let de=B,Se=a0(q,B),ze=Ce??"",rt={name:de,description:Se,type:"context_file",scope:"personal",version:"1.0.0"},Le;await u.transaction(async Xe=>{let[be]=await Xe.insert(g).values({name:de,description:Se,type:"context_file",scope:"personal",scopeRef:e,version:"1.0.0",content:ze,frontmatter:rt,contentHash:U,contextIdentity:D,createdBy:e}).onConflictDoNothing().returning({id:g.id});be&&(await Xe.insert(xe).values({instructionId:be.id,versionNumber:1,content:ze,frontmatter:rt,changeSummary:"Auto-created from context snapshot",createdBy:e}),Le=be.id)}),Le&&(r.set(U,{id:Le,name:de,contentLen:ze.length}),o.set(D,{id:Le,name:de,contentHash:U}),J=Le,m++)}catch(de){console.warn(`[link-instructions] Auto-create failed for ${D}:`,de instanceof Error?de.message:de),_++;try{let[Se]=await u.select({id:g.id}).from(g).where(ld(Ut(g.createdBy,e),Ut(g.contextIdentity,D))).limit(1);Se&&(J=Se.id)}catch(Se){console.warn(`[link-instructions] Fallback identity lookup also failed for ${D}:`,Se instanceof Error?Se.message:Se)}}}if(!J||!A.sessionId)continue;let F=`${J}:${U}`,he=h.get(F);he?!he.content&&V&&(he.content=V):h.set(F,{instructionId:J,contentHash:U,content:V}),f.push({sessionId:A.sessionId,instructionId:J,linkMethod:"context_file",contentHash:U}),l++,w.add(A.sessionId)}}for(let A of h.values())await KD(A.instructionId,A.contentHash,A.content,new Date);for(let A=0;A<f.length;A+=500)try{await u.insert(ie).values(f.slice(A,A+500)).onConflictDoUpdate({target:[ie.sessionId,ie.instructionId],set:{contentHash:dd`coalesce(${ie.contentHash}, excluded.content_hash)`}})}catch(b){console.warn("[link-instructions] batched link insert failed:",b instanceof Error?b.message:b)}let v=0,I=null;for(let A of s){if(!A.sessionId)continue;let[b]=await u.select({projectId:y.projectId,projectPath:y.projectPath}).from(y).where(Ut(y.id,A.sessionId)).limit(1);if(!b?.projectId||!b.projectPath)continue;let S=b.projectPath.replace(/\/$/,"");I=S;let P=A.metadata?.contextItems??[];for(let H of P){let N=r.get(H.content_hash);if(!N)continue;let U=H.name??"";if(!(U.startsWith("/")&&!U.startsWith(S+"/")))try{await u.insert(lt).values({projectId:b.projectId,instructionId:N.id,addedBy:e}).onConflictDoNothing(),v++}catch{}}break}let E=await i0({userId:e,hashToInstruction:r,seenHashes:a,linkedProjectPath:I});return{linked:l,created:m,updated:p,failed:_,sessionsLinked:w.size,instructionsMatched:r.size,snapshotsScanned:i.size,projectsLinked:v,evalsGenerated:E,scope:t?"session":"backfill"}}c(GD,"runLinkInstructions");var YD=am();md.post("/sessions/link-instructions",async e=>{let t=e.get("userId"),n=await e.req.json().catch(()=>({})),r=JD.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 YD.run(`${t}:${o??"*backfill*"}`,()=>GD(t,o));return e.json(i)});O();import{Hono as XD}from"hono";import{eq as js,and as c0,sql as cm,inArray as QD}from"drizzle-orm";var ph=new XD;ph.delete("/sessions/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:y.id}).from(y).where(c0(js(y.id,n),js(y.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:cm`count(*)::int`}).from(Ve).where(js(Ve.sessionId,n)),u.select({snapshotCount:cm`count(*)::int`}).from(M).where(js(M.sessionId,n)),u.selectDistinct({ref:M.messagesDeltaRef}).from(M).where(c0(js(M.sessionId,n),cm`${M.messagesDeltaRef} IS NOT NULL`))]),a=i.map(p=>p.ref).filter(p=>!!p);await u.transaction(async p=>{await p.update(Ge).set({sessionId:null}).where(js(Ge.sessionId,n)),await p.execute(cm`UPDATE scaffolding_fingerprints SET first_session_id = NULL WHERE first_session_id = ${n}`),await p.delete(y).where(js(y.id,n))});let d=0,l=0,m=0;if(a.length>0){let p=await u.selectDistinct({ref:M.messagesDeltaRef}).from(M).where(QD(M.messagesDeltaRef,a)),_=new Set(p.map(f=>f.ref)),w=a.filter(f=>!_.has(f));if(l=a.length-w.length,w.length>0)try{let{getSupabaseAdmin:f}=await Promise.resolve().then(()=>(id(),Xb)),{SNAPSHOT_DELTA_BUCKET:h}=await Promise.resolve().then(()=>(sm(),t0)),{error:v}=await f().storage.from(h).remove(w);v?(m=w.length,console.warn(`[sessions:delete] blob GC failed for ${w.length} ref(s): ${v.message}`)):d=w.length}catch(f){m=w.length,console.warn(`[sessions:delete] blob GC unavailable: ${f.message}`)}}return e.json({deleted:!0,eventsDeleted:o,snapshotsDeleted:s,blobsDeleted:d,blobsRetained:l,blobsFailed:m})});var Do=new ZD;Do.route("/",Zi);Do.route("/",ks);Do.route("/",Ns);Do.route("/",md);Do.route("/",ph);O();import{Hono as eO}from"hono";import{eq as fh}from"drizzle-orm";import{sql as na}from"drizzle-orm";var pd=new eO;async function d0(e){let[t]=await u.select({activeOrgId:R.activeOrgId}).from(R).where(fh(R.id,e));return t?.activeOrgId??null}c(d0,"getActiveOrgId");var u0="interval '30 minutes'";pd.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 d0(t);if(!o)return e.json({projects:[],total:0});let s=await u.execute(na`
613
618
  WITH session_activity AS (
614
619
  SELECT
615
620
  s.id,
@@ -629,7 +634,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
629
634
  project_id,
630
635
  COUNT(*)::int AS session_count,
631
636
  COUNT(*) FILTER (
632
- WHERE ended_at IS NULL AND last_at >= now() - ${na.raw(t0)}
637
+ WHERE ended_at IS NULL AND last_at >= now() - ${na.raw(u0)}
633
638
  )::int AS active_session_count,
634
639
  MAX(last_at) AS last_activity_at
635
640
  FROM session_activity
@@ -655,18 +660,18 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
655
660
  JOIN projects p ON p.id = pa.project_id
656
661
  ORDER BY pa.last_activity_at DESC NULLS LAST, p.created_at DESC
657
662
  LIMIT ${n} OFFSET ${r}
658
- `),[{count:i}={count:0}]=await d.execute(na`
663
+ `),[{count:i}={count:0}]=await u.execute(na`
659
664
  SELECT COUNT(DISTINCT s.project_id)::int AS count
660
665
  FROM sessions s
661
666
  WHERE s.org_id = ${o}
662
667
  AND s.origin <> 'internal_worker'
663
668
  AND s.project_id IS NOT NULL
664
- `);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})});lu.get("/projects/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e0(t);if(!r)return e.json({error:"No active org"},404);let[o]=await d.select().from(C).where(ah(C.id,n));if(!o)return e.json({error:"Project not found"},404);let[{has_session:s}={has_session:!1}]=await d.execute(na`
669
+ `);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})});pd.get("/projects/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await d0(t);if(!r)return e.json({error:"No active org"},404);let[o]=await u.select().from(C).where(fh(C.id,n));if(!o)return e.json({error:"Project not found"},404);let[{has_session:s}={has_session:!1}]=await u.execute(na`
665
670
  SELECT EXISTS(
666
671
  SELECT 1 FROM sessions
667
672
  WHERE project_id = ${n} AND org_id = ${r} AND origin <> 'internal_worker'
668
673
  ) AS has_session
669
- `);if(o.orgId!==r&&!s)return e.json({error:"Project not found"},404);let[i]=await d.execute(na`
674
+ `);if(o.orgId!==r&&!s)return e.json({error:"Project not found"},404);let[i]=await u.execute(na`
670
675
  WITH session_activity AS (
671
676
  SELECT
672
677
  s.id,
@@ -681,11 +686,11 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
681
686
  SELECT
682
687
  COUNT(*)::int AS session_count,
683
688
  COUNT(*) FILTER (
684
- WHERE ended_at IS NULL AND last_at >= now() - ${na.raw(t0)}
689
+ WHERE ended_at IS NULL AND last_at >= now() - ${na.raw(u0)}
685
690
  )::int AS active_session_count,
686
691
  MAX(last_at) AS last_activity_at
687
692
  FROM session_activity
688
- `),a=await d.select({path:ye.path,isWorktree:ye.isWorktree,firstSeen:ye.firstSeen,lastSeen:ye.lastSeen}).from(ye).where(ah(ye.projectId,n));return a.sort((u,l)=>{let p=u.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})});D();import{Hono as JD}from"hono";import{z as Vn}from"zod";import{eq as gt,and as Po,sql as n0,desc as KD,inArray as GD}from"drizzle-orm";var Tr=new JD,YD=Vn.object({name:Vn.string().min(1).max(255),description:Vn.string().min(1),scope:Vn.enum(["org","team","personal"]),scopeRef:Vn.string().uuid().optional(),version:Vn.string().default("1.0.0"),tags:Vn.array(Vn.string()).optional()});Tr.get("/packs",async e=>{let t=e.get("userId"),n=e.req.query("scope"),r=parseInt(e.req.query("limit")??"100",10),o=[gt(Ue.archived,!1),gt(Ue.createdBy,t)];n&&o.push(gt(Ue.scope,n));let s=await d.select().from(Ue).where(Po(...o)).orderBy(KD(Ue.updatedAt)).limit(r),i=s.map(u=>u.id),a={};if(i.length>0){let u=await d.select({packId:Me.packId,count:n0`COUNT(*)::int`}).from(Me).where(GD(Me.packId,i)).groupBy(Me.packId);for(let l of u)a[l.packId]=l.count}return e.json(s.map(u=>{let l=a[u.id]??0;return{...u,instructionCount:l,tier:Pc(l)}}))});Tr.get("/packs/:id",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await d.select().from(Ue).where(Po(gt(Ue.id,t),gt(Ue.createdBy,n),gt(Ue.archived,!1)));if(!r)return e.json({error:"Pack not found"},404);let o=await d.select({instruction:g,position:Me.position,slotOverrides:Me.slotOverrides,addedAt:Me.addedAt}).from(Me).innerJoin(g,gt(Me.instructionId,g.id)).where(gt(Me.packId,t)).orderBy(Me.position),s=o.length;return e.json({...r,instructionCount:s,tier:Pc(s),instructions:o.map(i=>({...i.instruction,position:i.position,slotOverrides:i.slotOverrides,addedAt:i.addedAt}))})});Tr.post("/packs",async e=>{let t=e.get("userId"),n=await e.req.json(),r=YD.parse(n),o=r.scope==="personal"?t:r.scopeRef??null,[s]=await d.insert(Ue).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:Pc(0)},201)});Tr.post("/packs/:id/instructions",async e=>{let t=e.req.param("id"),n=e.get("userId"),r=await e.req.json(),{instructionId:o}=Vn.object({instructionId:Vn.string().uuid()}).parse(r),[s]=await d.select().from(Ue).where(Po(gt(Ue.id,t),gt(Ue.createdBy,n),gt(Ue.archived,!1)));if(!s)return e.json({error:"Pack not found"},404);let[i]=await d.select().from(Me).where(Po(gt(Me.packId,t),gt(Me.instructionId,o)));if(i)return e.json({error:"Instruction already in this pack"},409);let[a]=await d.select({max:n0`COALESCE(MAX(${Me.position}), -1)`}).from(Me).where(gt(Me.packId,t)),[u]=await d.insert(Me).values({packId:t,instructionId:o,position:(a?.max??-1)+1,addedBy:n}).returning();return e.json(u,201)});Tr.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:Ue.id}).from(Ue).where(Po(gt(Ue.id,t),gt(Ue.createdBy,n),gt(Ue.archived,!1)));return o?(await d.delete(Me).where(Po(gt(Me.packId,t),gt(Me.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)});Tr.post("/packs/:id/apply",async e=>{let t=e.req.param("id"),n=e.get("userId"),r=await e.req.json(),{projectId:o}=Vn.object({projectId:Vn.string().uuid()}).parse(r),s=await d.select({instructionId:Me.instructionId}).from(Me).where(gt(Me.packId,t));if(s.length===0)return e.json({error:"Pack has no instructions"},400);let i=0;for(let a of s){let[u]=await d.select().from(lt).where(Po(gt(lt.projectId,o),gt(lt.instructionId,a.instructionId)));u||(await d.insert(lt).values({projectId:o,instructionId:a.instructionId,addedBy:n}),i++)}return e.json({success:!0,linked:i,total:s.length})});Tr.post("/packs/:id/fork",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select().from(Ue).where(Po(gt(Ue.id,n),gt(Ue.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(Ue).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(Me).where(gt(Me.packId,n));return s.length>0&&await d.insert(Me).values(s.map(i=>({packId:o.id,instructionId:i.instructionId,position:i.position,slotOverrides:i.slotOverrides,addedBy:t}))),e.json(o,201)});D();import{Hono as XD}from"hono";import{eq as ch,and as QD,sql as r0}from"drizzle-orm";var rp=new XD;function o0(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}}c(o0,"mapRow");rp.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(QD(ch(g.id,n),ch(g.archived,!1),ch(g.createdBy,t)));if(!r)return e.json({error:"Instruction not found"},404);let o=r.forkedFromId?await d.execute(r0`
693
+ `),a=await u.select({path:ye.path,isWorktree:ye.isWorktree,firstSeen:ye.firstSeen,lastSeen:ye.lastSeen}).from(ye).where(fh(ye.projectId,n));return a.sort((d,l)=>{let m=d.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:a[0]?.path??null,checkouts:a})});O();import{Hono as tO}from"hono";import{z as Jn}from"zod";import{eq as gt,and as Oo,sql as l0,desc as nO,inArray as rO}from"drizzle-orm";var Tr=new tO,oO=Jn.object({name:Jn.string().min(1).max(255),description:Jn.string().min(1),scope:Jn.enum(["org","team","personal"]),scopeRef:Jn.string().uuid().optional(),version:Jn.string().default("1.0.0"),tags:Jn.array(Jn.string()).optional()});Tr.get("/packs",async e=>{let t=e.get("userId"),n=e.req.query("scope"),r=parseInt(e.req.query("limit")??"100",10),o=[gt(Ue.archived,!1),gt(Ue.createdBy,t)];n&&o.push(gt(Ue.scope,n));let s=await u.select().from(Ue).where(Oo(...o)).orderBy(nO(Ue.updatedAt)).limit(r),i=s.map(d=>d.id),a={};if(i.length>0){let d=await u.select({packId:Me.packId,count:l0`COUNT(*)::int`}).from(Me).where(rO(Me.packId,i)).groupBy(Me.packId);for(let l of d)a[l.packId]=l.count}return e.json(s.map(d=>{let l=a[d.id]??0;return{...d,instructionCount:l,tier:Pc(l)}}))});Tr.get("/packs/:id",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await u.select().from(Ue).where(Oo(gt(Ue.id,t),gt(Ue.createdBy,n),gt(Ue.archived,!1)));if(!r)return e.json({error:"Pack not found"},404);let o=await u.select({instruction:g,position:Me.position,slotOverrides:Me.slotOverrides,addedAt:Me.addedAt}).from(Me).innerJoin(g,gt(Me.instructionId,g.id)).where(gt(Me.packId,t)).orderBy(Me.position),s=o.length;return e.json({...r,instructionCount:s,tier:Pc(s),instructions:o.map(i=>({...i.instruction,position:i.position,slotOverrides:i.slotOverrides,addedAt:i.addedAt}))})});Tr.post("/packs",async e=>{let t=e.get("userId"),n=await e.req.json(),r=oO.parse(n),o=r.scope==="personal"?t:r.scopeRef??null,[s]=await u.insert(Ue).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:Pc(0)},201)});Tr.post("/packs/:id/instructions",async e=>{let t=e.req.param("id"),n=e.get("userId"),r=await e.req.json(),{instructionId:o}=Jn.object({instructionId:Jn.string().uuid()}).parse(r),[s]=await u.select().from(Ue).where(Oo(gt(Ue.id,t),gt(Ue.createdBy,n),gt(Ue.archived,!1)));if(!s)return e.json({error:"Pack not found"},404);let[i]=await u.select().from(Me).where(Oo(gt(Me.packId,t),gt(Me.instructionId,o)));if(i)return e.json({error:"Instruction already in this pack"},409);let[a]=await u.select({max:l0`COALESCE(MAX(${Me.position}), -1)`}).from(Me).where(gt(Me.packId,t)),[d]=await u.insert(Me).values({packId:t,instructionId:o,position:(a?.max??-1)+1,addedBy:n}).returning();return e.json(d,201)});Tr.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:Ue.id}).from(Ue).where(Oo(gt(Ue.id,t),gt(Ue.createdBy,n),gt(Ue.archived,!1)));return o?(await u.delete(Me).where(Oo(gt(Me.packId,t),gt(Me.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)});Tr.post("/packs/:id/apply",async e=>{let t=e.req.param("id"),n=e.get("userId"),r=await e.req.json(),{projectId:o}=Jn.object({projectId:Jn.string().uuid()}).parse(r),s=await u.select({instructionId:Me.instructionId}).from(Me).where(gt(Me.packId,t));if(s.length===0)return e.json({error:"Pack has no instructions"},400);let i=0;for(let a of s){let[d]=await u.select().from(lt).where(Oo(gt(lt.projectId,o),gt(lt.instructionId,a.instructionId)));d||(await u.insert(lt).values({projectId:o,instructionId:a.instructionId,addedBy:n}),i++)}return e.json({success:!0,linked:i,total:s.length})});Tr.post("/packs/:id/fork",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(Ue).where(Oo(gt(Ue.id,n),gt(Ue.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(Ue).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(Me).where(gt(Me.packId,n));return s.length>0&&await u.insert(Me).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 sO}from"hono";import{eq as gh,and as iO,sql as m0}from"drizzle-orm";var dm=new sO;function p0(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}}c(p0,"mapRow");dm.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(iO(gh(g.id,n),gh(g.archived,!1),gh(g.createdBy,t)));if(!r)return e.json({error:"Instruction not found"},404);let o=r.forkedFromId?await u.execute(m0`
689
694
  WITH RECURSIVE ancestors AS (
690
695
  SELECT id, name, forked_from_id, version, scope, created_by, created_at::text, 1 as depth
691
696
  FROM instructions
@@ -698,7 +703,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
698
703
  WHERE i.archived = false AND a.depth < 20
699
704
  )
700
705
  SELECT * FROM ancestors ORDER BY depth DESC
701
- `):[],s=await d.execute(r0`
706
+ `):[],s=await u.execute(m0`
702
707
  WITH RECURSIVE descendants AS (
703
708
  SELECT id, name, forked_from_id, version, scope, created_by, created_at::text, 1 as depth
704
709
  FROM instructions
@@ -711,32 +716,32 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
711
716
  WHERE i.archived = false AND d.depth < 20
712
717
  )
713
718
  SELECT * FROM descendants ORDER BY depth ASC
714
- `),i=Array.isArray(o)?o.map(o0):[],a=s.map(o0);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})});D();import{Hono as tO}from"hono";import{z as js}from"zod";import{eq as Do,and as fu,desc as dh,gt as lh,lt as nO,sql as dn}from"drizzle-orm";function mu(e){let t=e?.llmEngines;if(!t||typeof t!="object")return null;let n=t;return{claude:n.claude===!0,codex:n.codex===!0}}c(mu,"reportedEngines");var ZD=10;function sp(e,t){let n=c(f=>e.capabilities===null||e.capabilities.includes(f),"claims"),r=e.engines!=null&&!e.engines.claude&&!e.engines.codex,o=t.filter(f=>n(f.kind)),s=t.filter(f=>!n(f.kind)),i=r?o.filter(f=>tl(f.kind)):[],a=r?o.filter(f=>!tl(f.kind)):o,u=[],l,p;return e.present?e.active?i.length>0?(l="fail",p=`Worker is online but no LLM engine is installed \u2014 ${pu(i)} job(s) cannot produce real output (${op(i)}).`,u.push("Install one on the machine running the worker: `claude` (npm i -g @anthropic-ai/claude-code) or `codex`, then `rulemetric worker:restart`."),u.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."),u.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",p=a.length>0?`Worker is running a job \u2014 ${pu(a)} more queued behind it.`:"Worker is online and running a job."):a.some(f=>f.oldestMinutes>=ZD)?(l="warn",p=`Worker is online but its queue is not draining \u2014 ${pu(a)} job(s) pending (${op(a)}).`,u.push("A handler may be wedged. Restart: `rulemetric worker:restart` (or reinstall the service).")):(l="ok",p="Worker is online and its queue is draining."):(l="fail",p=`Worker is not running \u2014 last heartbeat ${eO(e.ageSeconds)} ago.`,u.push("Restart it: `rulemetric service install --worker-only`"),u.push("If it keeps dying, `launchctl list | grep rulemetric` shows the exit status."),a.length>0&&u.push(`${pu(a)} job(s) are waiting on it (${op(a)}) \u2014 they will drain once it is back.`)):(l="fail",p="No worker has ever connected \u2014 nothing is analyzing your sessions.",u.push("Start one: `rulemetric service install --worker-only`"),u.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"),u.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"),u.push(`${pu(s)} job(s) cannot be claimed by this worker (${op(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:p,hints:u,stuck:a,unclaimable:s,engineBlocked:i}}c(sp,"assessWorkerHealth");function pu(e){return e.reduce((t,n)=>t+n.count,0)}c(pu,"totalOf");function op(e){return e.map(t=>`${t.kind}\xD7${t.count}`).join(", ")}c(op,"describe");function eO(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`}c(eO,"formatAge");var uh=[{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=uh.map(({table:e,defaultKind:t})=>({table:e,defaultKind:t}));var ra=new tO,ph=6e4,i0=600*1e3,mh=3600*1e3,rO=10080*60*1e3,oO={"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_refine_cases","cron_retire_unused_skills","cron_refresh_skills","cron_refresh_pricing","cron_eval_autorun","cron_auto_accept_suggestions","cron_instruction_training","cron_instruction_evolution","process_judge_review"]},sO=new Set([]),iO=js.object({workerType:js.enum(["mcp","cli-worker","gateway","proxy"]),clientName:js.string().min(1),clientVersion:js.string().optional(),workerVersion:js.string().optional(),metadata:js.record(js.unknown()).optional()}),fh=s0;async function aO(e,t=0){let n=new Date(Date.now()-t).toISOString(),r=fh.map(({table:i,defaultKind:a})=>dn`
719
+ `),i=Array.isArray(o)?o.map(p0):[],a=s.map(p0);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 dO}from"hono";import{z as Ps}from"zod";import{eq as Co,and as hd,desc as _h,gt as yh,lt as uO,sql as ln}from"drizzle-orm";function gd(e){let t=e?.llmEngines;if(!t||typeof t!="object")return null;let n=t;return{claude:n.claude===!0,codex:n.codex===!0}}c(gd,"reportedEngines");var aO=10;function lm(e,t){let n=c(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=>al(p.kind)):[],a=r?o.filter(p=>!al(p.kind)):o,d=[],l,m;return e.present?e.active?i.length>0?(l="fail",m=`Worker is online but no LLM engine is installed \u2014 ${fd(i)} job(s) cannot produce real output (${um(i)}).`,d.push("Install one on the machine running the worker: `claude` (npm i -g @anthropic-ai/claude-code) or `codex`, then `rulemetric worker:restart`."),d.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."),d.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=a.length>0?`Worker is running a job \u2014 ${fd(a)} more queued behind it.`:"Worker is online and running a job."):a.some(p=>p.oldestMinutes>=aO)?(l="warn",m=`Worker is online but its queue is not draining \u2014 ${fd(a)} job(s) pending (${um(a)}).`,d.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 ${cO(e.ageSeconds)} ago.`,d.push("Restart it: `rulemetric service install --worker-only`"),d.push("If it keeps dying, `launchctl list | grep rulemetric` shows the exit status."),a.length>0&&d.push(`${fd(a)} job(s) are waiting on it (${um(a)}) \u2014 they will drain once it is back.`)):(l="fail",m="No worker has ever connected \u2014 nothing is analyzing your sessions.",d.push("Start one: `rulemetric service install --worker-only`"),d.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"),d.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"),d.push(`${fd(s)} job(s) cannot be claimed by this worker (${um(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:d,stuck:a,unclaimable:s,engineBlocked:i}}c(lm,"assessWorkerHealth");function fd(e){return e.reduce((t,n)=>t+n.count,0)}c(fd,"totalOf");function um(e){return e.map(t=>`${t.kind}\xD7${t.count}`).join(", ")}c(um,"describe");function cO(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`}c(cO,"formatAge");var hh=[{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'"}],f0=hh.map(({table:e,defaultKind:t})=>({table:e,defaultKind:t}));var ra=new dO,wh=6e4,g0=600*1e3,vh=3600*1e3,lO=10080*60*1e3,mO={"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_refine_cases","cron_retire_unused_skills","cron_reconcile_attribution","cron_refresh_skills","cron_refresh_pricing","cron_eval_autorun","cron_auto_accept_suggestions","cron_instruction_training","cron_instruction_evolution","process_judge_review"]},pO=new Set([]),fO=Ps.object({workerType:Ps.enum(["mcp","cli-worker","gateway","proxy"]),clientName:Ps.string().min(1),clientVersion:Ps.string().optional(),workerVersion:Ps.string().optional(),metadata:Ps.record(Ps.unknown()).optional()}),Ih=f0;async function gO(e,t=0){let n=new Date(Date.now()-t).toISOString(),r=Ih.map(({table:i,defaultKind:a})=>ln`
715
720
  SELECT coalesce(task_kind, ${a}) AS kind,
716
721
  count(*)::int AS n,
717
722
  min(created_at) AS oldest
718
- FROM ${dn.raw(i)}
723
+ FROM ${ln.raw(i)}
719
724
  WHERE user_id = ${e}
720
725
  AND status = 'pending'
721
726
  AND created_at < ${n}::timestamptz
722
727
  GROUP BY 1
723
- `),o=await d.execute(dn`${dn.join(r,dn` 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)}))}c(aO,"queryPendingKinds");async function a0(e){return(await d.execute(dn`${dn.join(fh.map(({table:n})=>dn`
728
+ `),o=await u.execute(ln`${ln.join(r,ln` 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)}))}c(gO,"queryPendingKinds");async function h0(e){return(await u.execute(ln`${ln.join(Ih.map(({table:n})=>ln`
724
729
  SELECT count(*)::int AS n
725
- FROM ${dn.raw(n)}
730
+ FROM ${ln.raw(n)}
726
731
  WHERE user_id = ${e}
727
732
  AND status IN ('claimed', 'running')
728
733
  AND lease_expires_at IS NOT NULL
729
734
  AND lease_expires_at > now()
730
- `),dn` UNION ALL `)}`)).reduce((n,r)=>n+Number(r.n),0)>0}c(a0,"hasLiveInFlightJob");async function cO(e,t){let n=new Date(Date.now()-i0).toISOString(),r=fh.map(({table:p,defaultKind:f})=>dn`
731
- SELECT coalesce(task_kind, ${f}) AS kind,
735
+ `),ln` UNION ALL `)}`)).reduce((n,r)=>n+Number(r.n),0)>0}c(h0,"hasLiveInFlightJob");async function hO(e,t){let n=new Date(Date.now()-g0).toISOString(),r=Ih.map(({table:m,defaultKind:p})=>ln`
736
+ SELECT coalesce(task_kind, ${p}) AS kind,
732
737
  count(*)::int AS n,
733
738
  min(created_at) AS oldest
734
- FROM ${dn.raw(p)}
739
+ FROM ${ln.raw(m)}
735
740
  WHERE user_id = ${e}
736
741
  AND status = 'pending'
737
742
  AND created_at < ${n}::timestamptz
738
743
  GROUP BY 1
739
- `),o=await d.execute(dn`${dn.join(r,dn` UNION ALL `)} ORDER BY oldest ASC`),s=t===null?o:o.filter(p=>t.includes(p.kind));if(s.length===0||await a0(e))return null;let i=s.reduce((p,f)=>p+Number(f.n),0),a=Date.now()-new Date(s[0].oldest).getTime(),u=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(i0/6e4)}m (oldest ${u}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:u,byKind:s.map(p=>({kind:p.kind,count:Number(p.n)}))}}}c(cO,"checkStalePendingAdvisory");function gh(e){return!e||!Array.isArray(e.capabilities)?null:e.capabilities.filter(t=>typeof t=="string")}c(gh,"reportedCapabilities");function uO(e,t){if(e!=="cli-worker")return null;let n=mu(t);if(n===null||n.claude||n.codex)return null;let r=gh(t),o=r===null?[...Lc]:r.filter(s=>Lc.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}}}c(uO,"checkEngineAdvisory");function dO(e,t){let n=oO[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)&&!sO.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}c(dO,"checkWorkerAdvisory");ra.post("/workers/heartbeat",async e=>{let t=e.get("userId"),n=await e.req.json(),r=iO.parse(n);await d.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}}),d.delete(fe).where(fu(Do(fe.userId,t),nO(fe.lastHeartbeat,new Date(Date.now()-rO)))).catch(()=>{});let o=dO(r.workerType,r.metadata);return o??=uO(r.workerType,r.metadata),!o&&r.workerType==="cli-worker"&&(o=await cO(t,gh(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 c0(e){let t=new Date(Date.now()-mh),n=await d.select({lastHeartbeat:fe.lastHeartbeat}).from(fe).where(fu(Do(fe.userId,e),Do(fe.workerType,"cli-worker"),lh(fe.lastHeartbeat,t))),r=Date.now();return{cliEverConnected:n.length>0,workerActive:n.some(o=>r-new Date(o.lastHeartbeat).getTime()<ph)}}c(c0,"computeCliWorkerSetupSignals");async function ip(e){let t=await d.select({lastHeartbeat:fe.lastHeartbeat,metadata:fe.metadata}).from(fe).where(fu(Do(fe.userId,e),Do(fe.workerType,"cli-worker"))).orderBy(dh(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}c(ip,"getLatestLlmEngines");ra.get("/workers/status",async e=>{let t=e.get("userId"),n=new Date(Date.now()-mh),r=await d.select().from(fe).where(fu(Do(fe.userId,t),lh(fe.lastHeartbeat,n))).orderBy(dh(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<ph?"active":"inactive"}});return e.json(s)});ra.get("/workers/health",async e=>{let t=e.get("userId"),n=new Date(Date.now()-mh),[r,o,s]=await Promise.all([d.select({lastHeartbeat:fe.lastHeartbeat,clientName:fe.clientName,clientVersion:fe.clientVersion,metadata:fe.metadata}).from(fe).where(fu(Do(fe.userId,t),Do(fe.workerType,"cli-worker"),lh(fe.lastHeartbeat,n))).orderBy(dh(fe.lastHeartbeat)).limit(1),aO(t),a0(t)]),i=r[0],a=i?Date.now()-new Date(i.lastHeartbeat).getTime():null,u=i?i.metadata??void 0:void 0,l={present:i!=null,active:a!=null&&a<ph,ageSeconds:a==null?null:Math.round(a/1e3),capabilities:i?gh(u):null,busy:s,engines:i?mu(u):null},p=sp(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:p})});D();import{Hono as _O}from"hono";import{z as up}from"zod";import{and as hh,desc as w0,eq as Rr,inArray as yO,isNull as wO,sql as Be}from"drizzle-orm";D();import{sql as u0}from"drizzle-orm";async function d0(e,t){return Promise.all(t.filter(n=>n.canonicalPath!=null).map(async n=>{let[r,o,s]=await Promise.all([vs(e,n.projectId),Ao(e,n.projectId),ji(e,n.projectId)]),[i,a,u,l]=await Promise.all([d.execute(u0`
744
+ `),o=await u.execute(ln`${ln.join(r,ln` UNION ALL `)} ORDER BY oldest ASC`),s=t===null?o:o.filter(m=>t.includes(m.kind));if(s.length===0||await h0(e))return null;let i=s.reduce((m,p)=>m+Number(p.n),0),a=Date.now()-new Date(s[0].oldest).getTime(),d=Math.round(a/6e4),l=s.map(m=>`${m.kind}\xD7${m.n}`).join(", ");return{code:"STALE_PENDING",message:`${i} job(s) pending >${Math.round(g0/6e4)}m (oldest ${d}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:d,byKind:s.map(m=>({kind:m.kind,count:Number(m.n)}))}}}c(hO,"checkStalePendingAdvisory");function bh(e){return!e||!Array.isArray(e.capabilities)?null:e.capabilities.filter(t=>typeof t=="string")}c(bh,"reportedCapabilities");function _O(e,t){if(e!=="cli-worker")return null;let n=gd(t);if(n===null||n.claude||n.codex)return null;let r=bh(t),o=r===null?[...Lc]:r.filter(s=>Lc.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}}}c(_O,"checkEngineAdvisory");function yO(e,t){let n=mO[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)&&!pO.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}c(yO,"checkWorkerAdvisory");ra.post("/workers/heartbeat",async e=>{let t=e.get("userId"),n=await e.req.json(),r=fO.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(hd(Co(fe.userId,t),uO(fe.lastHeartbeat,new Date(Date.now()-lO)))).catch(()=>{});let o=yO(r.workerType,r.metadata);return o??=_O(r.workerType,r.metadata),!o&&r.workerType==="cli-worker"&&(o=await hO(t,bh(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 _0(e){let t=new Date(Date.now()-vh),n=await u.select({lastHeartbeat:fe.lastHeartbeat}).from(fe).where(hd(Co(fe.userId,e),Co(fe.workerType,"cli-worker"),yh(fe.lastHeartbeat,t))),r=Date.now();return{cliEverConnected:n.length>0,workerActive:n.some(o=>r-new Date(o.lastHeartbeat).getTime()<wh)}}c(_0,"computeCliWorkerSetupSignals");async function mm(e){let t=await u.select({lastHeartbeat:fe.lastHeartbeat,metadata:fe.metadata}).from(fe).where(hd(Co(fe.userId,e),Co(fe.workerType,"cli-worker"))).orderBy(_h(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}c(mm,"getLatestLlmEngines");ra.get("/workers/status",async e=>{let t=e.get("userId"),n=new Date(Date.now()-vh),r=await u.select().from(fe).where(hd(Co(fe.userId,t),yh(fe.lastHeartbeat,n))).orderBy(_h(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<wh?"active":"inactive"}});return e.json(s)});ra.get("/workers/health",async e=>{let t=e.get("userId"),n=new Date(Date.now()-vh),[r,o,s]=await Promise.all([u.select({lastHeartbeat:fe.lastHeartbeat,clientName:fe.clientName,clientVersion:fe.clientVersion,metadata:fe.metadata}).from(fe).where(hd(Co(fe.userId,t),Co(fe.workerType,"cli-worker"),yh(fe.lastHeartbeat,n))).orderBy(_h(fe.lastHeartbeat)).limit(1),gO(t),h0(t)]),i=r[0],a=i?Date.now()-new Date(i.lastHeartbeat).getTime():null,d=i?i.metadata??void 0:void 0,l={present:i!=null,active:a!=null&&a<wh,ageSeconds:a==null?null:Math.round(a/1e3),capabilities:i?bh(d):null,busy:s,engines:i?gd(d):null},m=lm(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})});O();import{Hono as SO}from"hono";import{z as gm}from"zod";import{and as Eh,desc as T0,eq as kr,inArray as xO,isNull as RO,sql as Be}from"drizzle-orm";O();import{sql as y0}from"drizzle-orm";async function w0(e,t){return Promise.all(t.filter(n=>n.canonicalPath!=null).map(async n=>{let[r,o,s]=await Promise.all([Is(e,n.projectId),xo(e,n.projectId),Pi(e,n.projectId)]),[i,a,d,l]=await Promise.all([u.execute(y0`
740
745
  SELECT (SELECT count(*)::int FROM instruction_experiments e
741
746
  WHERE e.user_id = ${e}::uuid AND e.status = 'running'
742
747
  AND e.project_path = ${n.canonicalPath}) AS running,
@@ -758,7 +763,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
758
763
  AND e.project_path = s.project_path
759
764
  AND e.status = 'running'
760
765
  )) AS eligible
761
- `),Pi(e,n.canonicalPath,n.projectId,o.windowDays),d.execute(u0`
766
+ `),Di(e,n.canonicalPath,n.projectId,o.windowDays),u.execute(y0`
762
767
  SELECT (SELECT count(*)::int FROM instruction_suggestions s
763
768
  JOIN instructions i ON i.id = s.instruction_id
764
769
  WHERE s.user_id = ${e}::uuid
@@ -816,7 +821,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
816
821
  AND s.project_id = ${n.projectId}::uuid
817
822
  AND ev.created_at > now() - make_interval(days => ${o.windowDays})
818
823
  ) AS window_resets_at
819
- `),Pi(e,n.canonicalPath,n.projectId,o.windowDays,"skill")]),p=i[0],f=p?.running??0,_=p?.eligible??0;return{projectId:n.projectId,trials:{running:f,orphaned:p?.orphaned??0,eligible:_,maxConcurrent:r.maxConcurrent,maxPerRun:r.maxPerRun,blocked:Il(r,f,_).blocked},autoAccept:{enabled:s.allowed,usedInWindow:a,skillsUsedInWindow:l,maxSkillsPerWindow:null,maxPerWindow:o.maxPerWindow,maxPerRun:o.maxPerRun,windowDays:o.windowDays,eligible:u[0]?.eligible??0,windowResetsAt:u[0]?.window_resets_at??null}}}))}c(d0,"loadPromotionPaths");D();import{sql as l0}from"drizzle-orm";function m0(e){for(let t=e,n=0;t&&n<4;n++){if(t.code==="42P01")return!0;t=t.cause}return!1}c(m0,"isMissingRelation");var p0=["proposed","ready","applied","measuring","improved","inconclusive","harmful","rollback_ready","reverted","failed"];async function f0(e,t){try{let[n,r]=await Promise.all([d.execute(l0`
824
+ `),Di(e,n.canonicalPath,n.projectId,o.windowDays,"skill")]),m=i[0],p=m?.running??0,_=m?.eligible??0;return{projectId:n.projectId,trials:{running:p,orphaned:m?.orphaned??0,eligible:_,maxConcurrent:r.maxConcurrent,maxPerRun:r.maxPerRun,blocked:xl(r,p,_).blocked},autoAccept:{enabled:s.allowed,usedInWindow:a,skillsUsedInWindow:l,maxSkillsPerWindow:null,maxPerWindow:o.maxPerWindow,maxPerRun:o.maxPerRun,windowDays:o.windowDays,eligible:d[0]?.eligible??0,windowResetsAt:d[0]?.window_resets_at??null}}}))}c(w0,"loadPromotionPaths");O();import{sql as v0}from"drizzle-orm";function b0(e){for(let t=e,n=0;t&&n<4;n++){if(t.code==="42P01")return!0;t=t.cause}return!1}c(b0,"isMissingRelation");var I0=["proposed","ready","applied","measuring","improved","inconclusive","harmful","rollback_ready","reverted","failed"];async function E0(e,t){try{let[n,r]=await Promise.all([u.execute(v0`
820
825
  SELECT a.id::text, a.instruction_id::text, i.name AS title, i.type AS artifact,
821
826
  a.harness, a.target_path, a.project_path, a.status, a.apply_mode,
822
827
  a.verdict_detail, a.updated_at::text
@@ -825,7 +830,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
825
830
  WHERE a.user_id = ${e}::uuid
826
831
  ORDER BY a.updated_at DESC
827
832
  LIMIT 50
828
- `),d.execute(l0`
833
+ `),u.execute(v0`
829
834
  SELECT status, count(*)::int AS n,
830
835
  count(*) FILTER (
831
836
  WHERE a.applied_at > now() - make_interval(hours => ${t})
@@ -834,7 +839,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
834
839
  FROM recommendation_applications a
835
840
  WHERE user_id = ${e}::uuid
836
841
  GROUP BY ROLLUP (status)
837
- `)]),o=Object.fromEntries(p0.map(a=>[a,0])),s=0,i=0;for(let a of r)a.status===null?(s=a.applied_in_window,i=a.applied_ever):o[a.status]=a.n;return{available:!0,counts:o,appliedInWindow:s,appliedEver:i,applications:n.map(a=>({id:a.id,instructionId:a.instruction_id,title:a.title,artifact:a.artifact,harness:a.harness,targetPath:a.target_path,projectPath:a.project_path,status:a.status,applyMode:a.apply_mode,verdictDetail:a.verdict_detail,updatedAt:a.updated_at}))}}catch(n){if(!m0(n))throw n;return{available:!1,counts:Object.fromEntries(p0.map(r=>[r,0])),appliedInWindow:0,appliedEver:0,applications:[]}}}c(f0,"loadRecommendationAdoption");D();import{sql as lO}from"drizzle-orm";var pO={blocking:!1,totalAwaitingReview:0,targets:[]};async function ap(e){let t=await d.execute(lO`
842
+ `)]),o=Object.fromEntries(I0.map(a=>[a,0])),s=0,i=0;for(let a of r)a.status===null?(s=a.applied_in_window,i=a.applied_ever):o[a.status]=a.n;return{available:!0,counts:o,appliedInWindow:s,appliedEver:i,applications:n.map(a=>({id:a.id,instructionId:a.instruction_id,title:a.title,artifact:a.artifact,harness:a.harness,targetPath:a.target_path,projectPath:a.project_path,status:a.status,applyMode:a.apply_mode,verdictDetail:a.verdict_detail,updatedAt:a.updated_at}))}}catch(n){if(!b0(n))throw n;return{available:!1,counts:Object.fromEntries(I0.map(r=>[r,0])),appliedInWindow:0,appliedEver:0,applications:[]}}}c(E0,"loadRecommendationAdoption");O();import{sql as wO}from"drizzle-orm";var vO={blocking:!1,totalAwaitingReview:0,targets:[]};async function pm(e){let t=await u.execute(wO`
838
843
  WITH enrolled AS (
839
844
  -- Segment resolved ONCE per enrolled target. Leaving the function call in
840
845
  -- the join predicate below made Postgres re-evaluate it per row.
@@ -886,7 +891,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
886
891
  GROUP BY id, name
887
892
  )
888
893
  SELECT * FROM per_target
889
- `);return mO(t)}c(ap,"loadReviewGate");function mO(e){let t=e.map(n=>({id:n.id,name:n.name,awaitingReview:n.awaiting_review,humanLabeled:n.human_labeled,humanLabeledWith:n.human_labeled_with,humanLabeledWithout:n.human_labeled_without,pilotTarget:Ti})).filter(n=>n.awaitingReview>0&&n.humanLabeled===0).sort((n,r)=>r.awaitingReview-n.awaitingReview);return t.length===0?pO:{blocking:!0,totalAwaitingReview:t.reduce((n,r)=>n+r.awaitingReview,0),targets:t}}c(mO,"summarizeReviewGate");function cp(e){return{blocking:e.blocking,totalAwaitingReview:e.totalAwaitingReview,targets:e.targets.map(t=>({id:t.id,name:t.name,awaitingReview:t.awaitingReview,humanLabeled:t.humanLabeled,humanLabeledWith:t.humanLabeledWith,humanLabeledWithout:t.humanLabeledWithout,pilotTarget:t.pilotTarget}))}}c(cp,"toReviewGateResponse");import{sql as Ps}from"drizzle-orm";var g0=["all","evolution","decided","skipped","failed"],fO=["cron_instruction_evolution","cron_instruction_training","cron_auto_accept_suggestions","cron_suggest_instructions","cron_refine_cases","cron_retire_unused_skills","process_insights"];function oa(e){switch(e){case"evolution":return Ps`kind IN (${Ps.join(fO.map(t=>Ps`${t}`),Ps`, `)})`;case"decided":return Ps`decision IS NOT NULL`;case"skipped":return Ps`skipped IS NOT NULL`;case"failed":return Ps`status = 'failed'`}}c(oa,"clauseFor");function h0(e){return e==="all"?null:oa(e)}c(h0,"filterClause");D();import{sql as _0}from"drizzle-orm";var gO={insights:"regenerate_insights_jobs",training:"enqueue_instruction_training",autoAccept:"enqueue_auto_accept_suggestions",evolution:"enqueue_instruction_evolution",autorun:"enqueue_eval_autorun"};async function hO(e){try{let t=await Fe.execute(_0`SELECT ${_0.raw(e)}() AS r`);return String(t[0]?.r??"0")}catch(t){return`error: ${t instanceof Error?t.message:String(t)}`}}c(hO,"runProducer");async function y0(){let e={};for(let[t,n]of Object.entries(gO))e[t]=await hO(n);return e}c(y0,"runAllProducers");var gu=new _O;var vO=up.object({limit:up.coerce.number().int().min(1).max(100).default(20),hours:up.coerce.number().int().min(1).max(720).default(24),filter:up.enum(g0).default("all")}),IO=6e4,bO=3600*1e3,EO=8;function v0(e,t){return Be.join(uh.map(({table:n,defaultKind:r,labelIdSql:o,labelTextSql:s})=>Be`
894
+ `);return IO(t)}c(pm,"loadReviewGate");function IO(e){let t=e.map(n=>({id:n.id,name:n.name,awaitingReview:n.awaiting_review,humanLabeled:n.human_labeled,humanLabeledWith:n.human_labeled_with,humanLabeledWithout:n.human_labeled_without,pilotTarget:Ti})).filter(n=>n.awaitingReview>0&&n.humanLabeled===0).sort((n,r)=>r.awaitingReview-n.awaitingReview);return t.length===0?vO:{blocking:!0,totalAwaitingReview:t.reduce((n,r)=>n+r.awaitingReview,0),targets:t}}c(IO,"summarizeReviewGate");function fm(e){return{blocking:e.blocking,totalAwaitingReview:e.totalAwaitingReview,targets:e.targets.map(t=>({id:t.id,name:t.name,awaitingReview:t.awaitingReview,humanLabeled:t.humanLabeled,humanLabeledWith:t.humanLabeledWith,humanLabeledWithout:t.humanLabeledWithout,pilotTarget:t.pilotTarget}))}}c(fm,"toReviewGateResponse");import{sql as Ds}from"drizzle-orm";var A0=["all","evolution","decided","skipped","failed"],bO=["cron_instruction_evolution","cron_instruction_training","cron_auto_accept_suggestions","cron_suggest_instructions","cron_refine_cases","cron_retire_unused_skills","process_insights"];function oa(e){switch(e){case"evolution":return Ds`kind IN (${Ds.join(bO.map(t=>Ds`${t}`),Ds`, `)})`;case"decided":return Ds`decision IS NOT NULL`;case"skipped":return Ds`skipped IS NOT NULL`;case"failed":return Ds`status = 'failed'`}}c(oa,"clauseFor");function S0(e){return e==="all"?null:oa(e)}c(S0,"filterClause");O();import{sql as x0}from"drizzle-orm";var EO={insights:"regenerate_insights_jobs",training:"enqueue_instruction_training",autoAccept:"enqueue_auto_accept_suggestions",evolution:"enqueue_instruction_evolution",autorun:"enqueue_eval_autorun"};async function AO(e){try{let t=await Fe.execute(x0`SELECT ${x0.raw(e)}() AS r`);return String(t[0]?.r??"0")}catch(t){return`error: ${t instanceof Error?t.message:String(t)}`}}c(AO,"runProducer");async function R0(){let e={};for(let[t,n]of Object.entries(EO))e[t]=await AO(n);return e}c(R0,"runAllProducers");var _d=new SO;var TO=gm.object({limit:gm.coerce.number().int().min(1).max(100).default(20),hours:gm.coerce.number().int().min(1).max(720).default(24),filter:gm.enum(A0).default("all")}),kO=6e4,NO=3600*1e3,jO=8;function k0(e,t){return Be.join(hh.map(({table:n,defaultKind:r,labelIdSql:o,labelTextSql:s})=>Be`
890
895
  SELECT id::text AS id,
891
896
  ${n} AS source_table,
892
897
  coalesce(task_kind, ${r}) AS kind,
@@ -903,8 +908,8 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
903
908
  result->>'decision' AS decision,
904
909
  error
905
910
  FROM ${Be.raw(n)}
906
- WHERE user_id = ${e}::uuid AND ${t}`),Be` UNION ALL `)}c(v0,"jobSelect");gu.post("/loop/run-now",async e=>e.json(await y0()));gu.get("/loop/status",async e=>{let t=e.get("userId"),n=vO.safeParse({limit:e.req.query("limit"),hours:e.req.query("hours"),filter:e.req.query("filter")??void 0});if(!n.success)return e.json({error:"Invalid query",details:n.error.flatten()},400);let{limit:r,hours:o,filter:s}=n.data,i=Be`now() - make_interval(hours => ${o})`,a=f0(t,o),u=ap(t),l=v0(t,Be`status IN ('pending', 'claimed', 'running')`),p=v0(t,Be`status IN ('completed', 'failed')
907
- AND completed_at > now() - make_interval(hours => ${o})`),f=h0(s),_=f?Be`SELECT * FROM (${p}) w WHERE ${f}`:Be`SELECT * FROM (${p}) w`,v=d.execute(Be`
911
+ WHERE user_id = ${e}::uuid AND ${t}`),Be` UNION ALL `)}c(k0,"jobSelect");_d.post("/loop/run-now",async e=>e.json(await R0()));_d.get("/loop/status",async e=>{let t=e.get("userId"),n=TO.safeParse({limit:e.req.query("limit"),hours:e.req.query("hours"),filter:e.req.query("filter")??void 0});if(!n.success)return e.json({error:"Invalid query",details:n.error.flatten()},400);let{limit:r,hours:o,filter:s}=n.data,i=Be`now() - make_interval(hours => ${o})`,a=E0(t,o),d=pm(t),l=k0(t,Be`status IN ('pending', 'claimed', 'running')`),m=k0(t,Be`status IN ('completed', 'failed')
912
+ AND completed_at > now() - make_interval(hours => ${o})`),p=S0(s),_=p?Be`SELECT * FROM (${m}) w WHERE ${p}`:Be`SELECT * FROM (${m}) w`,w=u.execute(Be`
908
913
  WITH proj AS (
909
914
  SELECT s.project_id,
910
915
  max(greatest(s.started_at, coalesce(s.ended_at, s.started_at))) AS last_activity
@@ -912,7 +917,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
912
917
  WHERE s.user_id = ${t}::uuid AND s.project_id IS NOT NULL
913
918
  GROUP BY s.project_id
914
919
  ORDER BY last_activity DESC
915
- LIMIT ${EO}
920
+ LIMIT ${jO}
916
921
  )
917
922
  SELECT p.project_id::text AS project_id,
918
923
  pr.name AS name,
@@ -936,19 +941,19 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
936
941
  LEFT JOIN projects pr ON pr.id = p.project_id
937
942
  LEFT JOIN project_canonical_checkouts c ON c.project_id = p.project_id
938
943
  ORDER BY p.last_activity DESC
939
- `),h=d.execute(Be`
944
+ `),f=u.execute(Be`
940
945
  SELECT count(*)::int AS total,
941
946
  count(*) FILTER (WHERE coalesce(c.is_stale, false))::int AS stale
942
947
  FROM (SELECT DISTINCT s.project_id FROM sessions s
943
948
  WHERE s.user_id = ${t}::uuid AND s.project_id IS NOT NULL) p
944
949
  LEFT JOIN project_canonical_checkouts c ON c.project_id = p.project_id
945
- `),[m,w,I,b]=await Promise.all([d.execute(Be`${l} ORDER BY created_at ASC`),d.execute(Be`${_} ORDER BY completed_at DESC LIMIT ${r}`),d.execute(Be`SELECT count(*)::int AS n FROM (${_}) q`),d.execute(Be`
950
+ `),[h,v,I,E]=await Promise.all([u.execute(Be`${l} ORDER BY created_at ASC`),u.execute(Be`${_} ORDER BY completed_at DESC LIMIT ${r}`),u.execute(Be`SELECT count(*)::int AS n FROM (${_}) q`),u.execute(Be`
946
951
  SELECT count(*)::int AS total,
947
952
  count(*) FILTER (WHERE ${oa("evolution")})::int AS evolution,
948
953
  count(*) FILTER (WHERE ${oa("decided")})::int AS decided,
949
954
  count(*) FILTER (WHERE ${oa("skipped")})::int AS skipped,
950
955
  count(*) FILTER (WHERE ${oa("failed")})::int AS failed
951
- FROM (${p}) q`)]),A=[...new Set([...m,...w].map(j=>j.label_id).filter(j=>!!j))],E=new Map;if(A.length>0){let j=await d.select({id:k.id,name:k.name}).from(k).where(yO(k.id,A));for(let ht of j)E.set(ht.id,ht.name)}let S=Date.now(),R=c(j=>(j.label_id?E.get(j.label_id)??null:null)??j.label_text,"label"),O=m.filter(j=>j.status==="claimed"||j.status==="running").map(j=>({id:j.id,kind:j.kind,label:R(j),claimedAt:j.claimed_at,elapsedSeconds:j.claimed_at?Math.round((S-new Date(j.claimed_at).getTime())/1e3):null,leaseHealthy:j.lease_expires_at?new Date(j.lease_expires_at).getTime()>S:!1})),W=m.filter(j=>j.status==="pending").map(j=>({id:j.id,kind:j.kind,label:R(j),createdAt:j.created_at,waitedSeconds:Math.round((S-new Date(j.created_at).getTime())/1e3),attempts:j.attempts})),N=w.map(j=>({id:j.id,kind:j.kind,label:R(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})),q=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,Rr(ie.evalTargetId,k.id)).where(Rr(ie.userId,t)).orderBy(w0(ie.createdAt)).limit(r),U=d.execute(Be`
956
+ FROM (${m}) q`)]),A=[...new Set([...h,...v].map(j=>j.label_id).filter(j=>!!j))],b=new Map;if(A.length>0){let j=await u.select({id:k.id,name:k.name}).from(k).where(xO(k.id,A));for(let ht of j)b.set(ht.id,ht.name)}let S=Date.now(),T=c(j=>(j.label_id?b.get(j.label_id)??null:null)??j.label_text,"label"),P=h.filter(j=>j.status==="claimed"||j.status==="running").map(j=>({id:j.id,kind:j.kind,label:T(j),claimedAt:j.claimed_at,elapsedSeconds:j.claimed_at?Math.round((S-new Date(j.claimed_at).getTime())/1e3):null,leaseHealthy:j.lease_expires_at?new Date(j.lease_expires_at).getTime()>S:!1})),H=h.filter(j=>j.status==="pending").map(j=>({id:j.id,kind:j.kind,label:T(j),createdAt:j.created_at,waitedSeconds:Math.round((S-new Date(j.created_at).getTime())/1e3),attempts:j.attempts})),N=v.map(j=>({id:j.id,kind:j.kind,label:T(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})),U=await u.select({id:ae.id,evalTargetId:ae.evalTargetId,targetName:k.name,createdAt:ae.createdAt,decision:ae.decision,applied:ae.applied,effectClass:ae.effectClass,proposalSource:ae.proposalSource}).from(ae).leftJoin(k,kr(ae.evalTargetId,k.id)).where(kr(ae.userId,t)).orderBy(T0(ae.createdAt)).limit(r),q=u.execute(Be`
952
957
  SELECT count(*)::int AS decisions,
953
958
  count(*) FILTER (WHERE p.applied)::int AS applied,
954
959
  count(*) FILTER (WHERE p.created_at > ${i})::int AS window_decisions,
@@ -985,12 +990,12 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
985
990
  FROM instruction_promotions p
986
991
  LEFT JOIN eval_targets t ON t.id = p.eval_target_id
987
992
  WHERE p.user_id = ${t}::uuid
988
- `),H=d.select({proposed:Be`count(*)::int`,accepted:Be`count(*) filter (where ${x.acceptedAt} is not null)::int`,lastAcceptedAt:Be`max(${x.acceptedAt})::text`,windowSurfaced:Be`count(*) filter (where ${x.generatedAt} > ${i})::int`,windowAccepted:Be`count(*) filter (where ${x.acceptedAt} > ${i})::int`,windowDeclined:Be`count(*) filter (where ${x.declinedAt} > ${i})::int`,pending:Be`count(*) filter (
993
+ `),B=u.select({proposed:Be`count(*)::int`,accepted:Be`count(*) filter (where ${x.acceptedAt} is not null)::int`,lastAcceptedAt:Be`max(${x.acceptedAt})::text`,windowSurfaced:Be`count(*) filter (where ${x.generatedAt} > ${i})::int`,windowAccepted:Be`count(*) filter (where ${x.acceptedAt} > ${i})::int`,windowDeclined:Be`count(*) filter (where ${x.declinedAt} > ${i})::int`,pending:Be`count(*) filter (
989
994
  where ${x.acceptedAt} is null
990
995
  and ${x.declinedAt} is null
991
996
  and ${x.dismissedAt} is null
992
997
  and not ${x.isStale}
993
- )::int`}).from(x).where(Rr(x.userId,t)),[te,de,K,me]=await Promise.all([d.select({n:Be`count(*)::int`}).from(ie).where(Rr(ie.userId,t)),d.select({n:Be`count(*)::int`}).from($).where(hh(Rr($.userId,t),Rr($.status,"running"))),d.select({kind:x.kind,n:Be`count(*)::int`}).from(x).where(hh(Rr(x.userId,t),wO(x.dismissedAt))).groupBy(x.kind),d.select({entries:Be`count(*)::int`,distinct:Be`count(distinct ${Te.contentHash})::int`,repeated:Be`count(*) filter (where ${Te.timesGenerated} > 1)::int`,dismissed:Be`count(*) filter (where ${Te.dismissedAt} is not null)::int`,maxTimesGenerated:Be`coalesce(max(${Te.timesGenerated}), 0)::int`,lastSeenAt:Be`max(${Te.lastSeenAt})`}).from(Te).where(Rr(Te.userId,t))]),[B,he]=await Promise.all([U,H]),P=B[0],re=he[0],[Ce,St]=await Promise.all([v,h]),le=d0(t,Ce.map(j=>({projectId:j.project_id,canonicalPath:j.canonical_path}))),ce=Ce.map(j=>({projectId:j.project_id,name:j.name,canonicalPath:j.canonical_path,canonicalLastSeenAt:j.canonical_last_seen_at,stale:j.stale,lastActivityAt:j.last_activity_at,lastAnalysedAt:j.last_analysed_at,suggestionsPending:j.suggestions_pending,suggestionsAccepted:j.suggestions_accepted,lastAcceptedAt:j.last_accepted_at})),We=(await d.select({lastHeartbeat:fe.lastHeartbeat,clientName:fe.clientName,clientVersion:fe.clientVersion,metadata:fe.metadata}).from(fe).where(hh(Rr(fe.userId,t),Rr(fe.workerType,"cli-worker"),Be`${fe.lastHeartbeat} > ${new Date(S-bO).toISOString()}::timestamptz`)).orderBy(w0(fe.lastHeartbeat)).limit(1))[0],rt=We?S-new Date(We.lastHeartbeat).getTime():null,Le=W.map(j=>({kind:j.kind,count:1,oldestMinutes:Math.round(j.waitedSeconds/60)})),Xe={present:We!=null,active:rt!=null&&rt<IO,ageSeconds:rt==null?null:Math.round(rt/1e3),capabilities:null,busy:O.length>0,engines:We?mu(We.metadata):null},be=await a,an=await le,L=await u;return e.json({worker:{present:Xe.present,active:Xe.active,ageSeconds:Xe.ageSeconds,clientName:We?.clientName??null,clientVersion:We?.clientVersion??null,lastHeartbeat:We?.lastHeartbeat??null},verdict:sp(Xe,Le),reviewGate:cp(L),running:O,queued:W,recent:N,recentTotal:I[0]?.n??0,filterCounts:{all:b[0]?.total??0,evolution:b[0]?.evolution??0,decided:b[0]?.decided??0,skipped:b[0]?.skipped??0,failed:b[0]?.failed??0},proposals:q,proposalTotal:te[0]?.n??0,changes:{decisions:P?.decisions??0,applied:P?.applied??0,byDecision:{promote:P?.promote??0,revert:P?.revert??0,refuse:P?.refuse??0},readyToApply:P?.ready_to_apply??0,readyToApplyTargetId:P?.ready_to_apply_target_id??null,readyToApplyPromotionId:P?.ready_to_apply_promotion_id??null,lastAppliedAt:P?.last_applied_at??null,lastDecidedAt:P?.last_decided_at??null,suggestionsProposed:re?.proposed??0,suggestionsAccepted:re?.accepted??0,suggestionsPending:re?.pending??0,lastAcceptedAt:re?.lastAcceptedAt??null,landedTotal:(P?.applied??0)+(re?.accepted??0)+be.appliedEver,window:{hours:o,landed:(P?.window_applied??0)+(re?.windowAccepted??0)+be.appliedInWindow,decisions:P?.window_decisions??0,promotionsApplied:P?.window_applied??0,adoptionApplied:be.appliedInWindow,suggestionsSurfaced:re?.windowSurfaced??0,suggestionsAccepted:re?.windowAccepted??0,suggestionsDeclined:re?.windowDeclined??0}},counts:{experimentsRunning:de[0]?.n??0,suggestions:Object.fromEntries(K.map(j=>[j.kind,j.n]))},insights:{entries:me[0]?.entries??0,distinct:me[0]?.distinct??0,repeated:me[0]?.repeated??0,dismissed:me[0]?.dismissed??0,maxTimesGenerated:me[0]?.maxTimesGenerated??0,lastSeenAt:me[0]?.lastSeenAt??null},delivery:{projects:ce,total:St[0]?.total??0,staleCount:St[0]?.stale??0},promotionPaths:{projects:an.map(j=>({projectId:j.projectId,trials:{running:j.trials.running,orphaned:j.trials.orphaned,eligible:j.trials.eligible,maxConcurrent:j.trials.maxConcurrent,maxPerRun:j.trials.maxPerRun,blocked:j.trials.blocked},autoAccept:{enabled:j.autoAccept.enabled,usedInWindow:j.autoAccept.usedInWindow,maxPerWindow:j.autoAccept.maxPerWindow,maxPerRun:j.autoAccept.maxPerRun,windowDays:j.autoAccept.windowDays,eligible:j.autoAccept.eligible,windowResetsAt:j.autoAccept.windowResetsAt}}))},adoption:{available:be.available,counts:be.counts,applications:be.applications.map(j=>({id:j.id,instructionId:j.instructionId,title:j.title,artifact:j.artifact,harness:j.harness,targetPath:j.targetPath,projectPath:j.projectPath,status:j.status,applyMode:j.applyMode,verdictDetail:j.verdictDetail,updatedAt:j.updatedAt}))},windowHours:o,limit:r,filter:s})});import{Hono as AO}from"hono";var dp=new AO;dp.get("/loop/review-gate",async e=>{let t=e.get("userId");return e.json(cp(await ap(t)))});D();import{Hono as xO}from"hono";import{z as Ct}from"zod";import{and as TO,eq as On,sql as Ds}from"drizzle-orm";D();import{and as SO,eq as I0}from"drizzle-orm";async function nt(e,t){let[n]=await d.select({id:k.id}).from(k).where(SO(I0(k.id,e),I0(k.userId,t)));return n}c(nt,"verifyTargetOwnership");function hu(e){return e===!0||e==="true"}c(hu,"flagOn");function lp(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=hu(n.autoEvolvePaused);return{enabled:hu(n.autoEvolveEnabled),optOut:hu(n.autoEvolveOptOut),apply:hu(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:hu(n.autoEvolveAccumulate)}}c(lp,"resolveEvolutionSettings");function b0(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}c(b0,"applyEvolutionPatch");function pp(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.`}c(pp,"describeEvolutionState");var Jn=new xO,RO=Ct.object({enabled:Ct.boolean().optional(),projectId:Ct.string().uuid().optional(),limits:Ct.object({minScore:Ct.number().min(Hn.minScore.min).max(Hn.minScore.max).nullable(),maxPerRun:Ct.number().int().min(Hn.maxPerRun.min).max(Hn.maxPerRun.max).nullable(),maxPerWindow:Ct.number().int().min(Hn.maxPerWindow.min).max(Hn.maxPerWindow.max).nullable(),windowDays:Ct.number().int().min(Hn.windowDays.min).max(Hn.windowDays.max).nullable()}).partial().optional()}).refine(e=>e.enabled!==void 0||e.limits!==void 0,{message:"nothing to change: pass `enabled`, `limits`, or both"});Jn.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(On(T.id,t)),o=null;if(n){let[i]=await d.select({raw:Ds`${C.metadata}->>'autoAcceptSuggestions'`}).from(C).where(On(C.id,n));i?.raw!=null&&(o=i.raw==="true")}let s=await ji(t,n);return e.json({effective:s.allowed,source:s.source,accountDefault:r?.enabled??!0,projectOverride:o,limits:{...await Ao(t,n),bounds:Hn},defaults:{minScore:hn.MIN_SCORE,maxPerRun:hn.MAX_PER_RUN,maxPerWindow:hn.MAX_PER_WINDOW,windowDays:hn.WINDOW_DAYS}})});var kO={minScore:"autoAcceptMinScore",maxPerRun:"autoAcceptMaxPerRun",maxPerWindow:"autoAcceptMaxPerWindow",windowDays:"autoAcceptWindowDays"};function NO(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}c(NO,"mergeLimitOverrides");Jn.patch("/settings/auto-accept",async e=>{let t=e.get("userId"),n=RO.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[a]=await d.select({metadata:C.metadata}).from(C).where(On(C.id,o));if(!a)return e.json({error:"Project not found"},404);let u=a.metadata??{},l={...u};if(r!==void 0&&(l.autoAcceptSuggestions=r),s){let p=NO(u.autoAcceptLimits,s);Object.keys(p).length>0?l.autoAcceptLimits=p:delete l.autoAcceptLimits}return await d.update(C).set({metadata:l}).where(On(C.id,o)),e.json({scope:"project",projectId:o,enabled:r,limits:await Ao(t,o)})}let i={};r!==void 0&&(i.autoAcceptSuggestions=r);for(let[a,u]of Object.entries(kO)){let l=s?.[a];l!==void 0&&(i[u]=l)}return Object.keys(i).length>0&&await d.update(T).set(i).where(On(T.id,t)),e.json({scope:"account",enabled:r,limits:await Ao(t,null)})});var jO=Ct.object({enabled:Ct.boolean().optional(),optOut:Ct.boolean().optional(),apply:Ct.boolean().optional(),paused:Ct.boolean().optional(),accumulate:Ct.boolean().optional(),pairs:Ct.number().int().min(1).max(1e3).optional()}).refine(e=>Object.keys(e).length>0,{message:"no settings supplied"});async function mp(e){let[t]=await d.select({paused:T.evolutionPaused}).from(T).where(On(T.id,e));return t?.paused??!1}c(mp,"readAccountPaused");var PO=Ct.object({paused:Ct.boolean()});Jn.get("/settings/evolution-account",async e=>{let t=e.get("userId");return e.json({paused:await mp(t)})});Jn.patch("/settings/evolution-account",async e=>{let t=e.get("userId"),n=PO.safeParse(await e.req.json().catch(()=>({})));return n.success?(await d.update(T).set({evolutionPaused:n.data.paused}).where(On(T.id,t)),e.json({paused:n.data.paused})):e.json({error:n.error.flatten()},400)});Jn.get("/settings/evolution/targets",async e=>{let t=e.get("userId"),n=await mp(t),o=(await d.select({id:k.id,name:k.name,autoEvolveEnabled:Ds`${k.metadata}->>'autoEvolveEnabled'`,autoEvolveOptOut:Ds`${k.metadata}->>'autoEvolveOptOut'`,autoEvolveApply:Ds`${k.metadata}->>'autoEvolveApply'`,autoEvolvePaused:Ds`${k.metadata}->>'autoEvolvePaused'`,autoEvolveAccumulate:Ds`${k.metadata}->>'autoEvolveAccumulate'`,autoEvolvePairs:Ds`${k.metadata}->>'autoEvolvePairs'`}).from(k).where(TO(On(k.userId,t),On(k.type,"instruction"))).orderBy(k.name)).map(i=>{let a=lp(i,n);return{evalTargetId:i.id,name:i.name,settings:a,summary:pp(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})});Jn.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 nt(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(On(k.id,n));if(!o)return e.json({error:"Eval target not found"},404);let s=lp(o.metadata,await mp(t));return e.json({evalTargetId:n,name:o.name,settings:s,summary:pp(s),limits:{minPairs:10,maxPairs:128}})});Jn.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=jO.safeParse(await e.req.json().catch(()=>({})));if(!r.success)return e.json({error:r.error.flatten()},400);if(!await nt(n,t))return e.json({error:"Eval target not found"},404);let[s]=await d.select({metadata:k.metadata}).from(k).where(On(k.id,n));if(!s)return e.json({error:"Eval target not found"},404);let i=b0(s.metadata,r.data);await d.update(k).set({metadata:i}).where(On(k.id,n));let a=lp(i,await mp(t));return e.json({evalTargetId:n,settings:a,summary:pp(a)})});var DO=Ct.object({maxConcurrent:Ct.number().int().nullable().optional(),maxPerRun:Ct.number().int().nullable().optional()});Jn.get("/settings/trial-limits",async e=>{let t=e.get("userId"),n=e.req.query("projectPath"),r=n?await Bn(n):null,o=await vs(t,r);return e.json({...o,defaults:{maxConcurrent:Oi.MAX_CONCURRENT,maxPerRun:Oi.MAX_PER_RUN},bounds:Gc})});Jn.patch("/settings/trial-limits",async e=>{let t=e.get("userId"),n=DO.safeParse(await e.req.json().catch(()=>({})));if(!n.success)return e.json({error:n.error.flatten()},400);let r={};for(let o of Object.keys(Gc)){let s=n.data[o];s!==void 0&&(r[o==="maxConcurrent"?"trialMaxConcurrent":"trialMaxPerRun"]=s===null?null:Ig(o,s))}return Object.keys(r).length>0&&await d.update(T).set(r).where(On(T.id,t)),e.json(await vs(t,null))});D();import{Hono as OO}from"hono";import{and as CO,eq as LO,sql as MO}from"drizzle-orm";var fp=new OO;fp.get("/setup/status",async e=>{let t=e.get("userId"),[n,r,o]=await Promise.all([c0(t),d.select({id:y.id}).from(y).where(CO(LO(y.userId,t),MO`${y.origin} <> 'internal_worker'`)).limit(1),ip(t)]);return e.json({cliEverConnected:n.cliEverConnected,anyCapturedSession:r.length>0,workerActive:n.workerActive,llmEngines:o})});D();import{createHash as $O}from"node:crypto";import{Hono as qO}from"hono";import{z as Cn}from"zod";import{eq as kr,and as gp,desc as UO,sql as HO}from"drizzle-orm";var Oo=new qO,BO=Cn.object({name:Cn.string().min(1).max(255),type:Cn.enum(["instruction","skill","prompt","plan"]),content:Cn.string().min(1),description:Cn.string().default(""),metadata:Cn.record(Cn.unknown()).default({})}),FO=Cn.object({name:Cn.string().min(1).max(255).optional(),content:Cn.string().min(1).optional(),description:Cn.string().optional(),metadata:Cn.record(Cn.unknown()).optional()});Oo.post("/eval-targets",async e=>{let t=e.get("userId"),n=await e.req.json(),r=BO.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)});Oo.get("/eval-targets",async e=>{let t=e.get("userId"),n=e.req.query("type"),r=e.req.query("content_hash"),o=[kr(k.userId,t)];n&&o.push(kr(k.type,n)),r&&o.push(HO`${k.metadata}->>'content_hash' = ${r}`);let s=e.req.query("limit"),i=e.req.query("offset"),a=s?parseInt(s,10):NaN,u=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,f=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(gp(...o)).orderBy(UO(k.updatedAt)).limit(u).offset(p);return e.json(f)});Oo.get("/eval-targets/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select().from(k).where(gp(kr(k.id,n),kr(k.userId,t)));return r?e.json(r):e.json({error:"Eval target not found"},404)});Oo.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(gp(kr(k.id,n),kr(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 d.update(k).set({content:o,version:(s.version??1)+1,metadata:{...i,content_hash:$O("sha256").update(o).digest("hex")},updatedAt:new Date}).where(kr(k.id,n)).returning({version:k.version});return e.json({id:n,synced:!0,version:a.version})});Oo.put("/eval-targets/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=FO.parse(r),[s]=await d.select().from(k).where(gp(kr(k.id,n),kr(k.userId,t)));if(!s)return e.json({error:"Eval target not found"},404);if(o.content&&o.content!==s.content){let[a]=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(a)}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(kr(k.id,n)).returning();return e.json(i)});D();import{Hono as WO}from"hono";import{z as Vt}from"zod";import{eq as hp,and as S0,isNull as zO,desc as VO}from"drizzle-orm";var sa=new WO,JO=Vt.object({name:Vt.string().min(1).max(255),prompt:Vt.string().min(1),expectedOutput:Vt.string().default(""),files:Vt.array(Vt.unknown()).default([]),expectations:Vt.array(Vt.string()).default([])});sa.post("/eval-targets/:id/evals",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=JO.parse(r);if(!await nt(n,t))return e.json({error:"Eval target not found"},404);let[i]=await d.insert(Ee).values({evalTargetId:n,name:o.name,prompt:o.prompt,expectedOutput:o.expectedOutput,files:o.files,expectations:o.expectations}).returning();return e.json(i,201)});sa.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 nt(n,t))return e.json({error:"Eval target not found"},404);let s=await d.select().from(Ee).where(r?hp(Ee.evalTargetId,n):S0(hp(Ee.evalTargetId,n),zO(Ee.retiredAt))).orderBy(VO(Ee.createdAt));return e.json(s)});var KO=Vt.object({retire:Vt.boolean().optional(),retiredReason:Vt.string().max(500).optional(),name:Vt.string().min(1).max(255).optional(),prompt:Vt.string().min(1).optional(),expectedOutput:Vt.string().optional(),files:Vt.array(Vt.unknown()).optional(),expectations:Vt.array(Vt.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"});sa.patch("/eval-targets/:id/evals/:evalId",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=e.req.param("evalId"),o=KO.parse(await e.req.json());if(!await nt(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 d.update(Ee).set(i).where(S0(hp(Ee.id,r),hp(Ee.evalTargetId,n))).returning();return a?e.json(a):e.json({error:"Eval case not found"},404)});D();import{Hono as YO}from"hono";import{z as De}from"zod";import{createHash as XO}from"node:crypto";import{and as yp,eq as ln,gte as R0,desc as QO,sql as yh}from"drizzle-orm";import{eq as GO,sql as Gr}from"drizzle-orm";function _h(e,t={}){let n=c(_=>_.judge_model_requested!=null&&_.judge_model!==_.judge_model_requested,"fellBack"),r=c(_=>{let v=null,h=-1;for(let m of _){if(!m.judge_model)continue;let w=new Date(m.created_at).getTime();(w>h||w===h&&m.judge_model>(v??""))&&(h=w,v=m.judge_model)}return v},"byRecency"),o=c(_=>{let v=new Map;for(let w of _){if(!w.judge_model)continue;let I=v.get(w.judge_model)??{labeled:0,latest:-1};w.labeled&&(I.labeled+=1),I.latest=Math.max(I.latest,new Date(w.created_at).getTime()),v.set(w.judge_model,I)}let h=null,m={labeled:0,latest:-1};for(let[w,I]of v){if(I.labeled===0)continue;(I.labeled>m.labeled||I.labeled===m.labeled&&(I.latest>m.latest||I.latest===m.latest&&w>(h??"")))&&(h=w,m=I)}return h},"byAnchors"),s=e.filter(_=>_.judge_model),i=s.filter(_=>!n(_)),a=s.length-i.length,u=t.pin?.trim()?t.pin.trim():null;if(u)return{currentJudgeModel:u,quarantinedElectors:a,electedBy:"pin"};let l=i.length>0?i:s,p=o(l);if(p)return{currentJudgeModel:p,quarantinedElectors:a,electedBy:"anchors"};let f=r(l);return{currentJudgeModel:f,quarantinedElectors:a,electedBy:f?"recency":"none"}}c(_h,"electJudgeSegment");var x0={pin:"pinned on the target (metadata.graderModel)",anchors:"elected because it holds the most human-labeled runs",recency:"elected because it graded most recently, no segment having any labels",none:"unstamped"};D();async function ia(e,t){let r=await d.execute(Gr`
998
+ )::int`}).from(x).where(kr(x.userId,t)),[J,ce,V,pe]=await Promise.all([u.select({n:Be`count(*)::int`}).from(ae).where(kr(ae.userId,t)),u.select({n:Be`count(*)::int`}).from($).where(Eh(kr($.userId,t),kr($.status,"running"))),u.select({kind:x.kind,n:Be`count(*)::int`}).from(x).where(Eh(kr(x.userId,t),RO(x.dismissedAt))).groupBy(x.kind),u.select({entries:Be`count(*)::int`,distinct:Be`count(distinct ${Re.contentHash})::int`,repeated:Be`count(*) filter (where ${Re.timesGenerated} > 1)::int`,dismissed:Be`count(*) filter (where ${Re.dismissedAt} is not null)::int`,maxTimesGenerated:Be`coalesce(max(${Re.timesGenerated}), 0)::int`,lastSeenAt:Be`max(${Re.lastSeenAt})`}).from(Re).where(kr(Re.userId,t))]),[F,he]=await Promise.all([q,B]),D=F[0],re=he[0],[Ce,St]=await Promise.all([w,f]),le=w0(t,Ce.map(j=>({projectId:j.project_id,canonicalPath:j.canonical_path}))),de=Ce.map(j=>({projectId:j.project_id,name:j.name,canonicalPath:j.canonical_path,canonicalLastSeenAt:j.canonical_last_seen_at,stale:j.stale,lastActivityAt:j.last_activity_at,lastAnalysedAt:j.last_analysed_at,suggestionsPending:j.suggestions_pending,suggestionsAccepted:j.suggestions_accepted,lastAcceptedAt:j.last_accepted_at})),ze=(await u.select({lastHeartbeat:fe.lastHeartbeat,clientName:fe.clientName,clientVersion:fe.clientVersion,metadata:fe.metadata}).from(fe).where(Eh(kr(fe.userId,t),kr(fe.workerType,"cli-worker"),Be`${fe.lastHeartbeat} > ${new Date(S-NO).toISOString()}::timestamptz`)).orderBy(T0(fe.lastHeartbeat)).limit(1))[0],rt=ze?S-new Date(ze.lastHeartbeat).getTime():null,Le=H.map(j=>({kind:j.kind,count:1,oldestMinutes:Math.round(j.waitedSeconds/60)})),Xe={present:ze!=null,active:rt!=null&&rt<kO,ageSeconds:rt==null?null:Math.round(rt/1e3),capabilities:null,busy:P.length>0,engines:ze?gd(ze.metadata):null},be=await a,cn=await le,L=await d;return e.json({worker:{present:Xe.present,active:Xe.active,ageSeconds:Xe.ageSeconds,clientName:ze?.clientName??null,clientVersion:ze?.clientVersion??null,lastHeartbeat:ze?.lastHeartbeat??null},verdict:lm(Xe,Le),reviewGate:fm(L),running:P,queued:H,recent:N,recentTotal:I[0]?.n??0,filterCounts:{all:E[0]?.total??0,evolution:E[0]?.evolution??0,decided:E[0]?.decided??0,skipped:E[0]?.skipped??0,failed:E[0]?.failed??0},proposals:U,proposalTotal:J[0]?.n??0,changes:{decisions:D?.decisions??0,applied:D?.applied??0,byDecision:{promote:D?.promote??0,revert:D?.revert??0,refuse:D?.refuse??0},readyToApply:D?.ready_to_apply??0,readyToApplyTargetId:D?.ready_to_apply_target_id??null,readyToApplyPromotionId:D?.ready_to_apply_promotion_id??null,lastAppliedAt:D?.last_applied_at??null,lastDecidedAt:D?.last_decided_at??null,suggestionsProposed:re?.proposed??0,suggestionsAccepted:re?.accepted??0,suggestionsPending:re?.pending??0,lastAcceptedAt:re?.lastAcceptedAt??null,landedTotal:(D?.applied??0)+(re?.accepted??0)+be.appliedEver,window:{hours:o,landed:(D?.window_applied??0)+(re?.windowAccepted??0)+be.appliedInWindow,decisions:D?.window_decisions??0,promotionsApplied:D?.window_applied??0,adoptionApplied:be.appliedInWindow,suggestionsSurfaced:re?.windowSurfaced??0,suggestionsAccepted:re?.windowAccepted??0,suggestionsDeclined:re?.windowDeclined??0}},counts:{experimentsRunning:ce[0]?.n??0,suggestions:Object.fromEntries(V.map(j=>[j.kind,j.n]))},insights:{entries:pe[0]?.entries??0,distinct:pe[0]?.distinct??0,repeated:pe[0]?.repeated??0,dismissed:pe[0]?.dismissed??0,maxTimesGenerated:pe[0]?.maxTimesGenerated??0,lastSeenAt:pe[0]?.lastSeenAt??null},delivery:{projects:de,total:St[0]?.total??0,staleCount:St[0]?.stale??0},promotionPaths:{projects:cn.map(j=>({projectId:j.projectId,trials:{running:j.trials.running,orphaned:j.trials.orphaned,eligible:j.trials.eligible,maxConcurrent:j.trials.maxConcurrent,maxPerRun:j.trials.maxPerRun,blocked:j.trials.blocked},autoAccept:{enabled:j.autoAccept.enabled,usedInWindow:j.autoAccept.usedInWindow,maxPerWindow:j.autoAccept.maxPerWindow,maxPerRun:j.autoAccept.maxPerRun,windowDays:j.autoAccept.windowDays,eligible:j.autoAccept.eligible,windowResetsAt:j.autoAccept.windowResetsAt}}))},adoption:{available:be.available,counts:be.counts,applications:be.applications.map(j=>({id:j.id,instructionId:j.instructionId,title:j.title,artifact:j.artifact,harness:j.harness,targetPath:j.targetPath,projectPath:j.projectPath,status:j.status,applyMode:j.applyMode,verdictDetail:j.verdictDetail,updatedAt:j.updatedAt}))},windowHours:o,limit:r,filter:s})});import{Hono as PO}from"hono";var hm=new PO;hm.get("/loop/review-gate",async e=>{let t=e.get("userId");return e.json(fm(await pm(t)))});O();import{Hono as OO}from"hono";import{z as Lt}from"zod";import{and as CO,eq as Cn,sql as Os}from"drizzle-orm";O();import{and as DO,eq as N0}from"drizzle-orm";async function nt(e,t){let[n]=await u.select({id:k.id}).from(k).where(DO(N0(k.id,e),N0(k.userId,t)));return n}c(nt,"verifyTargetOwnership");function yd(e){return e===!0||e==="true"}c(yd,"flagOn");function _m(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=yd(n.autoEvolvePaused);return{enabled:yd(n.autoEvolveEnabled),optOut:yd(n.autoEvolveOptOut),apply:yd(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:yd(n.autoEvolveAccumulate)}}c(_m,"resolveEvolutionSettings");function j0(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}c(j0,"applyEvolutionPatch");function ym(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.`}c(ym,"describeEvolutionState");var Kn=new OO,LO=Lt.object({enabled:Lt.boolean().optional(),projectId:Lt.string().uuid().optional(),limits:Lt.object({minScore:Lt.number().min(Bn.minScore.min).max(Bn.minScore.max).nullable(),maxPerRun:Lt.number().int().min(Bn.maxPerRun.min).max(Bn.maxPerRun.max).nullable(),maxPerWindow:Lt.number().int().min(Bn.maxPerWindow.min).max(Bn.maxPerWindow.max).nullable(),windowDays:Lt.number().int().min(Bn.windowDays.min).max(Bn.windowDays.max).nullable()}).partial().optional()}).refine(e=>e.enabled!==void 0||e.limits!==void 0,{message:"nothing to change: pass `enabled`, `limits`, or both"});Kn.get("/settings/auto-accept",async e=>{let t=e.get("userId"),n=e.req.query("projectId")??null,[r]=await u.select({enabled:R.autoAcceptSuggestions}).from(R).where(Cn(R.id,t)),o=null;if(n){let[i]=await u.select({raw:Os`${C.metadata}->>'autoAcceptSuggestions'`}).from(C).where(Cn(C.id,n));i?.raw!=null&&(o=i.raw==="true")}let s=await Pi(t,n);return e.json({effective:s.allowed,source:s.source,accountDefault:r?.enabled??!0,projectOverride:o,limits:{...await xo(t,n),bounds:Bn},defaults:{minScore:_n.MIN_SCORE,maxPerRun:_n.MAX_PER_RUN,maxPerWindow:_n.MAX_PER_WINDOW,windowDays:_n.WINDOW_DAYS}})});var MO={minScore:"autoAcceptMinScore",maxPerRun:"autoAcceptMaxPerRun",maxPerWindow:"autoAcceptMaxPerWindow",windowDays:"autoAcceptWindowDays"};function $O(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}c($O,"mergeLimitOverrides");Kn.patch("/settings/auto-accept",async e=>{let t=e.get("userId"),n=LO.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[a]=await u.select({metadata:C.metadata}).from(C).where(Cn(C.id,o));if(!a)return e.json({error:"Project not found"},404);let d=a.metadata??{},l={...d};if(r!==void 0&&(l.autoAcceptSuggestions=r),s){let m=$O(d.autoAcceptLimits,s);Object.keys(m).length>0?l.autoAcceptLimits=m:delete l.autoAcceptLimits}return await u.update(C).set({metadata:l}).where(Cn(C.id,o)),e.json({scope:"project",projectId:o,enabled:r,limits:await xo(t,o)})}let i={};r!==void 0&&(i.autoAcceptSuggestions=r);for(let[a,d]of Object.entries(MO)){let l=s?.[a];l!==void 0&&(i[d]=l)}return Object.keys(i).length>0&&await u.update(R).set(i).where(Cn(R.id,t)),e.json({scope:"account",enabled:r,limits:await xo(t,null)})});var qO=Lt.object({enabled:Lt.boolean().optional(),optOut:Lt.boolean().optional(),apply:Lt.boolean().optional(),paused:Lt.boolean().optional(),accumulate:Lt.boolean().optional(),pairs:Lt.number().int().min(1).max(1e3).optional()}).refine(e=>Object.keys(e).length>0,{message:"no settings supplied"});async function wm(e){let[t]=await u.select({paused:R.evolutionPaused}).from(R).where(Cn(R.id,e));return t?.paused??!1}c(wm,"readAccountPaused");var UO=Lt.object({paused:Lt.boolean()});Kn.get("/settings/evolution-account",async e=>{let t=e.get("userId");return e.json({paused:await wm(t)})});Kn.patch("/settings/evolution-account",async e=>{let t=e.get("userId"),n=UO.safeParse(await e.req.json().catch(()=>({})));return n.success?(await u.update(R).set({evolutionPaused:n.data.paused}).where(Cn(R.id,t)),e.json({paused:n.data.paused})):e.json({error:n.error.flatten()},400)});Kn.get("/settings/evolution/targets",async e=>{let t=e.get("userId"),n=await wm(t),o=(await u.select({id:k.id,name:k.name,autoEvolveEnabled:Os`${k.metadata}->>'autoEvolveEnabled'`,autoEvolveOptOut:Os`${k.metadata}->>'autoEvolveOptOut'`,autoEvolveApply:Os`${k.metadata}->>'autoEvolveApply'`,autoEvolvePaused:Os`${k.metadata}->>'autoEvolvePaused'`,autoEvolveAccumulate:Os`${k.metadata}->>'autoEvolveAccumulate'`,autoEvolvePairs:Os`${k.metadata}->>'autoEvolvePairs'`}).from(k).where(CO(Cn(k.userId,t),Cn(k.type,"instruction"))).orderBy(k.name)).map(i=>{let a=_m(i,n);return{evalTargetId:i.id,name:i.name,settings:a,summary:ym(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})});Kn.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 nt(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(Cn(k.id,n));if(!o)return e.json({error:"Eval target not found"},404);let s=_m(o.metadata,await wm(t));return e.json({evalTargetId:n,name:o.name,settings:s,summary:ym(s),limits:{minPairs:10,maxPairs:128}})});Kn.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=qO.safeParse(await e.req.json().catch(()=>({})));if(!r.success)return e.json({error:r.error.flatten()},400);if(!await nt(n,t))return e.json({error:"Eval target not found"},404);let[s]=await u.select({metadata:k.metadata}).from(k).where(Cn(k.id,n));if(!s)return e.json({error:"Eval target not found"},404);let i=j0(s.metadata,r.data);await u.update(k).set({metadata:i}).where(Cn(k.id,n));let a=_m(i,await wm(t));return e.json({evalTargetId:n,settings:a,summary:ym(a)})});var HO=Lt.object({maxConcurrent:Lt.number().int().nullable().optional(),maxPerRun:Lt.number().int().nullable().optional()});Kn.get("/settings/trial-limits",async e=>{let t=e.get("userId"),n=e.req.query("projectPath"),r=n?await Fn(n):null,o=await Is(t,r);return e.json({...o,defaults:{maxConcurrent:Ci.MAX_CONCURRENT,maxPerRun:Ci.MAX_PER_RUN},bounds:Yc})});Kn.patch("/settings/trial-limits",async e=>{let t=e.get("userId"),n=HO.safeParse(await e.req.json().catch(()=>({})));if(!n.success)return e.json({error:n.error.flatten()},400);let r={};for(let o of Object.keys(Yc)){let s=n.data[o];s!==void 0&&(r[o==="maxConcurrent"?"trialMaxConcurrent":"trialMaxPerRun"]=s===null?null:Rg(o,s))}return Object.keys(r).length>0&&await u.update(R).set(r).where(Cn(R.id,t)),e.json(await Is(t,null))});O();import{Hono as BO}from"hono";import{and as FO,eq as WO,sql as zO}from"drizzle-orm";var vm=new BO;vm.get("/setup/status",async e=>{let t=e.get("userId"),[n,r,o]=await Promise.all([_0(t),u.select({id:y.id}).from(y).where(FO(WO(y.userId,t),zO`${y.origin} <> 'internal_worker'`)).limit(1),mm(t)]);return e.json({cliEverConnected:n.cliEverConnected,anyCapturedSession:r.length>0,workerActive:n.workerActive,llmEngines:o})});O();import{createHash as VO}from"node:crypto";import{Hono as JO}from"hono";import{z as Ln}from"zod";import{eq as Nr,and as Im,desc as KO,sql as GO}from"drizzle-orm";var Lo=new JO,YO=Ln.object({name:Ln.string().min(1).max(255),type:Ln.enum(["instruction","skill","prompt","plan"]),content:Ln.string().min(1),description:Ln.string().default(""),metadata:Ln.record(Ln.unknown()).default({})}),XO=Ln.object({name:Ln.string().min(1).max(255).optional(),content:Ln.string().min(1).optional(),description:Ln.string().optional(),metadata:Ln.record(Ln.unknown()).optional()});Lo.post("/eval-targets",async e=>{let t=e.get("userId"),n=await e.req.json(),r=YO.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)});Lo.get("/eval-targets",async e=>{let t=e.get("userId"),n=e.req.query("type"),r=e.req.query("content_hash"),o=[Nr(k.userId,t)];n&&o.push(Nr(k.type,n)),r&&o.push(GO`${k.metadata}->>'content_hash' = ${r}`);let s=e.req.query("limit"),i=e.req.query("offset"),a=s?parseInt(s,10):NaN,d=Number.isFinite(a)?Math.min(Math.max(1,a),200):100,l=i?parseInt(i,10):NaN,m=Number.isFinite(l)?Math.max(0,l):0,p=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(Im(...o)).orderBy(KO(k.updatedAt)).limit(d).offset(m);return e.json(p)});Lo.get("/eval-targets/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(k).where(Im(Nr(k.id,n),Nr(k.userId,t)));return r?e.json(r):e.json({error:"Eval target not found"},404)});Lo.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(Im(Nr(k.id,n),Nr(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:VO("sha256").update(o).digest("hex")},updatedAt:new Date}).where(Nr(k.id,n)).returning({version:k.version});return e.json({id:n,synced:!0,version:a.version})});Lo.put("/eval-targets/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=XO.parse(r),[s]=await u.select().from(k).where(Im(Nr(k.id,n),Nr(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(Nr(k.id,n)).returning();return e.json(i)});O();import{Hono as QO}from"hono";import{z as Jt}from"zod";import{eq as bm,and as O0,isNull as ZO,desc as eC}from"drizzle-orm";var sa=new QO,tC=Jt.object({name:Jt.string().min(1).max(255),prompt:Jt.string().min(1),expectedOutput:Jt.string().default(""),files:Jt.array(Jt.unknown()).default([]),expectations:Jt.array(Jt.string()).default([])});sa.post("/eval-targets/:id/evals",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=tC.parse(r);if(!await nt(n,t))return e.json({error:"Eval target not found"},404);let[i]=await u.insert(Ee).values({evalTargetId:n,name:o.name,prompt:o.prompt,expectedOutput:o.expectedOutput,files:o.files,expectations:o.expectations}).returning();return e.json(i,201)});sa.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 nt(n,t))return e.json({error:"Eval target not found"},404);let s=await u.select().from(Ee).where(r?bm(Ee.evalTargetId,n):O0(bm(Ee.evalTargetId,n),ZO(Ee.retiredAt))).orderBy(eC(Ee.createdAt));return e.json(s)});var nC=Jt.object({retire:Jt.boolean().optional(),retiredReason:Jt.string().max(500).optional(),name:Jt.string().min(1).max(255).optional(),prompt:Jt.string().min(1).optional(),expectedOutput:Jt.string().optional(),files:Jt.array(Jt.unknown()).optional(),expectations:Jt.array(Jt.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"});sa.patch("/eval-targets/:id/evals/:evalId",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=e.req.param("evalId"),o=nC.parse(await e.req.json());if(!await nt(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(Ee).set(i).where(O0(bm(Ee.id,r),bm(Ee.evalTargetId,n))).returning();return a?e.json(a):e.json({error:"Eval case not found"},404)});O();import{Hono as oC}from"hono";import{z as De}from"zod";import{createHash as sC}from"node:crypto";import{and as Am,eq as mn,gte as M0,desc as iC,sql as Sh}from"drizzle-orm";import{eq as rC,sql as Qr}from"drizzle-orm";function Ah(e,t={}){let n=c(_=>_.judge_model_requested!=null&&_.judge_model!==_.judge_model_requested,"fellBack"),r=c(_=>{let w=null,f=-1;for(let h of _){if(!h.judge_model)continue;let v=new Date(h.created_at).getTime();(v>f||v===f&&h.judge_model>(w??""))&&(f=v,w=h.judge_model)}return w},"byRecency"),o=c(_=>{let w=new Map;for(let v of _){if(!v.judge_model)continue;let I=w.get(v.judge_model)??{labeled:0,latest:-1};v.labeled&&(I.labeled+=1),I.latest=Math.max(I.latest,new Date(v.created_at).getTime()),w.set(v.judge_model,I)}let f=null,h={labeled:0,latest:-1};for(let[v,I]of w){if(I.labeled===0)continue;(I.labeled>h.labeled||I.labeled===h.labeled&&(I.latest>h.latest||I.latest===h.latest&&v>(f??"")))&&(f=v,h=I)}return f},"byAnchors"),s=e.filter(_=>_.judge_model),i=s.filter(_=>!n(_)),a=s.length-i.length,d=t.pin?.trim()?t.pin.trim():null;if(d)return{currentJudgeModel:d,quarantinedElectors:a,electedBy:"pin"};let l=i.length>0?i:s,m=o(l);if(m)return{currentJudgeModel:m,quarantinedElectors:a,electedBy:"anchors"};let p=r(l);return{currentJudgeModel:p,quarantinedElectors:a,electedBy:p?"recency":"none"}}c(Ah,"electJudgeSegment");var C0={pin:"pinned on the target (metadata.graderModel)",anchors:"elected because it holds the most human-labeled runs",recency:"elected because it graded most recently, no segment having any labels",none:"unstamped"};O();async function ia(e,t){let r=await u.execute(Qr`
994
999
  SELECT
995
1000
  r.configuration,
996
1001
  r.created_at,
@@ -1034,9 +1039,9 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
1034
1039
  AND ev.retired_at IS NULL
1035
1040
  AND r.grading->'summary'->>'pass_rate' IS NOT NULL
1036
1041
  AND r.configuration IN ('with_target', 'without_target')
1037
- `),s=(await d.execute(Gr`
1042
+ `),s=(await u.execute(Qr`
1038
1043
  SELECT metadata->>'graderModel' AS pin FROM eval_targets WHERE id = ${t}
1039
- `))[0]?.pin??null,{currentJudgeModel:i,quarantinedElectors:a,electedBy:u}=_h(r.map(L=>({...L,labeled:L.llm_total>0&&L.llm_annotated>=L.llm_total})),{pin:s}),l=null,p=-1;for(let L of r){let j=new Date(L.created_at).getTime();j>p&&(p=j,l=L.methodology)}let f={with_target:{unlabeledJudge:[],labeled:[]},without_target:{unlabeledJudge:[],labeled:[]}},_={with_target:[],without_target:[]},v=0,h=new Map,m=0,w=0,I=0,b=0;for(let L of r){let j=f[L.configuration];if(!j)continue;let ht=L.methodology!==l||L.pre_edit;L.methodology!==l&&(I+=1),L.pre_edit&&(b+=1);let jt=L.judge_pass?1:0,tr=L.llm_annotated>=L.llm_total;if(L.llm_total>0){let mn=L.judge_model,io=h.get(mn)??{runs:0,labeledRuns:0,latestRunAt:L.created_at};if(io.runs+=1,tr&&(io.labeledRuns+=1),new Date(L.created_at).getTime()>new Date(io.latestRunAt).getTime()&&(io.latestRunAt=L.created_at),h.set(mn,io),mn!==i){m+=1,tr&&(w+=1);continue}}if(tr){let mn=L.det_all_passed&&L.llm_truly_passed===L.llm_total?1:0;_[L.configuration]?.push({human:mn,judge:jt}),L.llm_total>0&&(v+=1)}if(!ht)if(tr){let mn=L.det_all_passed&&L.llm_truly_passed===L.llm_total?1:0;j.labeled.push({human:mn,judge:jt})}else j.unlabeledJudge.push(jt)}let[A]=await d.select({total:Gr`count(*)::int`,llmAnchors:Gr`count(*) FILTER (WHERE ${et.judgeMethod} = 'llm' AND ${et.judgeModel} IS NOT DISTINCT FROM ${i})::int`,llmApproved:Gr`count(*) FILTER (WHERE ${et.judgeMethod} = 'llm' AND ${et.judgeModel} IS NOT DISTINCT FROM ${i} AND ${et.verdict} = 'approve')::int`,staleLlmAnchors:Gr`count(*) FILTER (WHERE ${et.judgeMethod} = 'llm' AND ${et.judgeModel} IS DISTINCT FROM ${i})::int`,flagged:Gr`count(*) FILTER (WHERE ${et.flag} IS NOT NULL)::int`}).from(et).where(GO(et.evalTargetId,t)),E=f.with_target.unlabeledJudge.length+f.with_target.labeled.length+f.without_target.unlabeledJudge.length+f.without_target.labeled.length,S=await d.execute(Gr`
1044
+ `))[0]?.pin??null,{currentJudgeModel:i,quarantinedElectors:a,electedBy:d}=Ah(r.map(L=>({...L,labeled:L.llm_total>0&&L.llm_annotated>=L.llm_total})),{pin:s}),l=null,m=-1;for(let L of r){let j=new Date(L.created_at).getTime();j>m&&(m=j,l=L.methodology)}let p={with_target:{unlabeledJudge:[],labeled:[]},without_target:{unlabeledJudge:[],labeled:[]}},_={with_target:[],without_target:[]},w=0,f=new Map,h=0,v=0,I=0,E=0;for(let L of r){let j=p[L.configuration];if(!j)continue;let ht=L.methodology!==l||L.pre_edit;L.methodology!==l&&(I+=1),L.pre_edit&&(E+=1);let jt=L.judge_pass?1:0,tr=L.llm_annotated>=L.llm_total;if(L.llm_total>0){let fn=L.judge_model,co=f.get(fn)??{runs:0,labeledRuns:0,latestRunAt:L.created_at};if(co.runs+=1,tr&&(co.labeledRuns+=1),new Date(L.created_at).getTime()>new Date(co.latestRunAt).getTime()&&(co.latestRunAt=L.created_at),f.set(fn,co),fn!==i){h+=1,tr&&(v+=1);continue}}if(tr){let fn=L.det_all_passed&&L.llm_truly_passed===L.llm_total?1:0;_[L.configuration]?.push({human:fn,judge:jt}),L.llm_total>0&&(w+=1)}if(!ht)if(tr){let fn=L.det_all_passed&&L.llm_truly_passed===L.llm_total?1:0;j.labeled.push({human:fn,judge:jt})}else j.unlabeledJudge.push(jt)}let[A]=await u.select({total:Qr`count(*)::int`,llmAnchors:Qr`count(*) FILTER (WHERE ${et.judgeMethod} = 'llm' AND ${et.judgeModel} IS NOT DISTINCT FROM ${i})::int`,llmApproved:Qr`count(*) FILTER (WHERE ${et.judgeMethod} = 'llm' AND ${et.judgeModel} IS NOT DISTINCT FROM ${i} AND ${et.verdict} = 'approve')::int`,staleLlmAnchors:Qr`count(*) FILTER (WHERE ${et.judgeMethod} = 'llm' AND ${et.judgeModel} IS DISTINCT FROM ${i})::int`,flagged:Qr`count(*) FILTER (WHERE ${et.flag} IS NOT NULL)::int`}).from(et).where(rC(et.evalTargetId,t)),b=p.with_target.unlabeledJudge.length+p.with_target.labeled.length+p.without_target.unlabeledJudge.length+p.without_target.labeled.length,S=await u.execute(Qr`
1040
1045
  SELECT
1041
1046
  r.eval_target_id::text AS target_id,
1042
1047
  r.configuration,
@@ -1078,7 +1083,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
1078
1083
  AND r.grading->'summary'->>'pass_rate' IS NOT NULL
1079
1084
  AND r.configuration IN ('with_target', 'without_target')
1080
1085
  AND r.grading->>'judge_model' IS NOT DISTINCT FROM ${i}
1081
- `),R=new Map;for(let L of S){if(L.llm_total<=0||L.llm_annotated<L.llm_total)continue;let j=R.get(L.target_id)??{with_target:[],without_target:[]},ht=L.det_all_passed&&L.llm_truly_passed===L.llm_total?1:0,jt=L.judge_pass?1:0;L.configuration==="with_target"?j.with_target.push(ht-jt):j.without_target.push(ht-jt),R.set(L.target_id,j)}let O=c(L=>{let j=L.length;if(j===0)return{rectifier:0,variance:1/0,n:0};let ht=L.reduce((tr,mn)=>tr+mn,0)/j,jt=j<2?0:L.reduce((tr,mn)=>tr+(mn-ht)**2,0)/(j-1);return{rectifier:ht,variance:jt/j,n:j}},"toRectifier"),W=c(L=>L.map(j=>j.human-j.judge),"selfDeltas"),N=[...R.values()].map(L=>O(L.with_target)),q=[...R.values()].map(L=>O(L.without_target)),U=ml(O(W(_.with_target)),N),H=ml(O(W(_.without_target)),q),te=[...R.values()].reduce((L,j)=>L+j.with_target.length+j.without_target.length,0),de=v+te,K=(v>0?1:0)+[...R.values()].filter(L=>L.with_target.length+L.without_target.length>0).length,me=U.pooledApplied||H.pooledApplied,B=K>=3&&de>=Ti,he=c(L=>({rectifier:L.rectifierUsed,variance:L.variance,sufficient:B}),"asInput"),P=E>0?Bc(f.with_target,f.without_target,me?{withPooledRectifier:he(U),withoutPooledRectifier:he(H)}:{}):null,re=dg(f.with_target,f.without_target,{humanLabeledRuns:v,...me?{pool:{withPooledRectifier:he(U),withoutPooledRectifier:he(H),totalAnchors:de,targets:K}}:{}}),Ce=new Map;for(let L of r){if(L.judge_model!==i||L.methodology!==l||L.pre_edit||L.pass_rate==null)continue;let j=Ce.get(L.eval_id)??{name:L.eval_name,withRates:[],withoutRates:[]};L.configuration==="with_target"?j.withRates.push(L.pass_rate):L.configuration==="without_target"&&j.withoutRates.push(L.pass_rate),Ce.set(L.eval_id,j)}let St=[],le=[],ce=c(L=>L.length?L.reduce((j,ht)=>j+ht,0)/L.length:null,"mean_"),Se=[];for(let[L,{name:j,withRates:ht,withoutRates:jt}]of Ce.entries())ht.length>0&&jt.length>0?(St.push({name:j,withPassRate:ce(ht),withoutPassRate:ce(jt)}),le.push(L)):Se.push({evalId:L,name:j,withPassRate:ce(ht),withoutPassRate:ce(jt)});let We=sg(og(St),{unpaired:Se.length}),rt=[...h.entries()].filter(([L,j])=>L!==i&&j.labeledRuns>0).sort((L,j)=>j[1].labeledRuns-L[1].labeledRuns),Le=rt.reduce((L,[,j])=>L+j.labeledRuns,0),Xe=i?h.get(i):void 0,be=Le>0?`${Le} human-labeled run(s) are stranded on `+rt.map(([L,j])=>`${L} (${j.labeledRuns} labeled / ${j.runs} runs)`).join(", ")+`; the current segment is ${i??"unstamped"} (${Xe?.runs??0} runs, ${Xe?.labeledRuns??0} labeled), `+x0[u]+". Re-point the judge segment rather than labeling more runs \u2014 the segment is the binding problem, not the label count.":null,an=[...We.gateReason?[We.gateReason]:[],...be?[be]:[],...re.reasons];return{judge:{currentModel:i,electedBy:u,pin:s,models:[...h.entries()].map(([L,j])=>({model:L,...j})).sort((L,j)=>new Date(j.latestRunAt).getTime()-new Date(L.latestRunAt).getTime()),staleRuns:m,staleLabeledRuns:w,staleAnchors:A?.staleLlmAnchors??0,quarantinedElectors:a},anchors:{total:A?.total??0,llmAnchors:A?.llmAnchors??0,agreementRate:A&&A.llmAnchors>0?A.llmApproved/A.llmAnchors:null,agreementCi:A&&A.llmAnchors>0?il(A.llmApproved,A.llmAnchors):null,flagged:A?.flagged??0,minAnchors:xi,labeledRuns:{with:_.with_target.length,without:_.without_target.length}},methodology:{current:l,supersededRuns:I,preEditRuns:b,runsInSegment:E},calibration:P,powerCheck:{...re,reasons:an},pooling:{engaged:me,judgeModel:i,poolTargets:K,poolAnchors:de,assumedExchangeability:U.assumedExchangeability||H.assumedExchangeability,sufficient:B,withLambda:U.lambda,withoutLambda:H.lambda,tau2:U.tau2,i2:U.i2,withReason:U.reason??null,withoutReason:H.reason??null},caseDiscrimination:{total:We.total,discriminating:We.discriminating,nonDiscriminating:We.nonDiscriminating,unpaired:We.unpaired,cases:We.diagnoses.map((L,j)=>({evalId:le[j],name:L.name,withPassRate:L.withPassRate,withoutPassRate:L.withoutPassRate,separation:L.separation,discriminating:L.discriminating,note:L.note})).sort((L,j)=>L.separation-j.separation),unpairedCases:Se}}}c(ia,"computeJudgeCalibration");async function T0(e){return(await d.execute(Gr`
1086
+ `),T=new Map;for(let L of S){if(L.llm_total<=0||L.llm_annotated<L.llm_total)continue;let j=T.get(L.target_id)??{with_target:[],without_target:[]},ht=L.det_all_passed&&L.llm_truly_passed===L.llm_total?1:0,jt=L.judge_pass?1:0;L.configuration==="with_target"?j.with_target.push(ht-jt):j.without_target.push(ht-jt),T.set(L.target_id,j)}let P=c(L=>{let j=L.length;if(j===0)return{rectifier:0,variance:1/0,n:0};let ht=L.reduce((tr,fn)=>tr+fn,0)/j,jt=j<2?0:L.reduce((tr,fn)=>tr+(fn-ht)**2,0)/(j-1);return{rectifier:ht,variance:jt/j,n:j}},"toRectifier"),H=c(L=>L.map(j=>j.human-j.judge),"selfDeltas"),N=[...T.values()].map(L=>P(L.with_target)),U=[...T.values()].map(L=>P(L.without_target)),q=yl(P(H(_.with_target)),N),B=yl(P(H(_.without_target)),U),J=[...T.values()].reduce((L,j)=>L+j.with_target.length+j.without_target.length,0),ce=w+J,V=(w>0?1:0)+[...T.values()].filter(L=>L.with_target.length+L.without_target.length>0).length,pe=q.pooledApplied||B.pooledApplied,F=V>=3&&ce>=Ti,he=c(L=>({rectifier:L.rectifierUsed,variance:L.variance,sufficient:F}),"asInput"),D=b>0?Fc(p.with_target,p.without_target,pe?{withPooledRectifier:he(q),withoutPooledRectifier:he(B)}:{}):null,re=hg(p.with_target,p.without_target,{humanLabeledRuns:w,...pe?{pool:{withPooledRectifier:he(q),withoutPooledRectifier:he(B),totalAnchors:ce,targets:V}}:{}}),Ce=new Map;for(let L of r){if(L.judge_model!==i||L.methodology!==l||L.pre_edit||L.pass_rate==null)continue;let j=Ce.get(L.eval_id)??{name:L.eval_name,withRates:[],withoutRates:[]};L.configuration==="with_target"?j.withRates.push(L.pass_rate):L.configuration==="without_target"&&j.withoutRates.push(L.pass_rate),Ce.set(L.eval_id,j)}let St=[],le=[],de=c(L=>L.length?L.reduce((j,ht)=>j+ht,0)/L.length:null,"mean_"),Se=[];for(let[L,{name:j,withRates:ht,withoutRates:jt}]of Ce.entries())ht.length>0&&jt.length>0?(St.push({name:j,withPassRate:de(ht),withoutPassRate:de(jt)}),le.push(L)):Se.push({evalId:L,name:j,withPassRate:de(ht),withoutPassRate:de(jt)});let ze=lg(ug(St),{unpaired:Se.length}),rt=[...f.entries()].filter(([L,j])=>L!==i&&j.labeledRuns>0).sort((L,j)=>j[1].labeledRuns-L[1].labeledRuns),Le=rt.reduce((L,[,j])=>L+j.labeledRuns,0),Xe=i?f.get(i):void 0,be=Le>0?`${Le} human-labeled run(s) are stranded on `+rt.map(([L,j])=>`${L} (${j.labeledRuns} labeled / ${j.runs} runs)`).join(", ")+`; the current segment is ${i??"unstamped"} (${Xe?.runs??0} runs, ${Xe?.labeledRuns??0} labeled), `+C0[d]+". Re-point the judge segment rather than labeling more runs \u2014 the segment is the binding problem, not the label count.":null,cn=[...ze.gateReason?[ze.gateReason]:[],...be?[be]:[],...re.reasons];return{judge:{currentModel:i,electedBy:d,pin:s,models:[...f.entries()].map(([L,j])=>({model:L,...j})).sort((L,j)=>new Date(j.latestRunAt).getTime()-new Date(L.latestRunAt).getTime()),staleRuns:h,staleLabeledRuns:v,staleAnchors:A?.staleLlmAnchors??0,quarantinedElectors:a},anchors:{total:A?.total??0,llmAnchors:A?.llmAnchors??0,agreementRate:A&&A.llmAnchors>0?A.llmApproved/A.llmAnchors:null,agreementCi:A&&A.llmAnchors>0?ll(A.llmApproved,A.llmAnchors):null,flagged:A?.flagged??0,minAnchors:Ri,labeledRuns:{with:_.with_target.length,without:_.without_target.length}},methodology:{current:l,supersededRuns:I,preEditRuns:E,runsInSegment:b},calibration:D,powerCheck:{...re,reasons:cn},pooling:{engaged:pe,judgeModel:i,poolTargets:V,poolAnchors:ce,assumedExchangeability:q.assumedExchangeability||B.assumedExchangeability,sufficient:F,withLambda:q.lambda,withoutLambda:B.lambda,tau2:q.tau2,i2:q.i2,withReason:q.reason??null,withoutReason:B.reason??null},caseDiscrimination:{total:ze.total,discriminating:ze.discriminating,nonDiscriminating:ze.nonDiscriminating,unpaired:ze.unpaired,cases:ze.diagnoses.map((L,j)=>({evalId:le[j],name:L.name,withPassRate:L.withPassRate,withoutPassRate:L.withoutPassRate,separation:L.separation,discriminating:L.discriminating,note:L.note})).sort((L,j)=>L.separation-j.separation),unpairedCases:Se}}}c(ia,"computeJudgeCalibration");async function L0(e){return(await u.execute(Qr`
1082
1087
  WITH current_judge AS (
1083
1088
  -- Canonical segment (00193), not a fourth hand-copy of the recency rule.
1084
1089
  -- The review queue and the adequacy gate MUST scope to the same judge, or
@@ -1103,7 +1108,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
1103
1108
  AND (SELECT count(*) FROM jsonb_array_elements(r.grading->'expectations') e
1104
1109
  WHERE COALESCE(e->>'method', 'llm') = 'llm'
1105
1110
  AND COALESCE(e->>'errored', 'false') <> 'true') > COALESCE(a.llm_annotated, 0)
1106
- `))[0]?.remaining??0}c(T0,"countRunsAwaitingReview");var Os=new YO,_p=c(e=>XO("sha256").update(e).digest("hex"),"sha256"),ZO=De.object({withScore:De.number().min(0).max(1),withoutScore:De.number().min(0).max(1),withCost:De.number().nonnegative().optional(),withoutCost:De.number().nonnegative().optional(),withLatency:De.number().nonnegative().optional(),withoutLatency:De.number().nonnegative().optional()}),eC=De.object({candidateContent:De.string().min(1),proposalSource:De.enum(["llm","groom","human"]),proposalRationale:De.string().default(""),pairs:De.array(ZO).default([]),canaryGreen:De.boolean(),measuredAgainstContentHash:De.string().optional(),accumulation:De.object({candidateContentHash:De.string(),priorContentHash:De.string(),targetPairs:De.number().int().positive(),carriedPairs:De.number().int().nonnegative(),runs:De.number().int().positive()}).optional(),immutableSections:De.array(De.string()).default([]),maxPromotionsPerWindow:De.number().int().positive().optional(),windowDays:De.number().int().positive().optional(),measurementCost:De.object({modelCalls:De.number().int().nonnegative(),proposalCalls:De.number().int().nonnegative(),executorCalls:De.number().int().nonnegative(),graderCalls:De.number().int().nonnegative(),plannedPairs:De.number().int().nonnegative(),usablePairs:De.number().int().nonnegative(),verdictPairs:De.number().int().nonnegative().optional(),passes:De.number().int().nonnegative(),liveCases:De.number().int().nonnegative(),mde:De.number().nonnegative().nullable(),wallMs:De.number().nonnegative()}).optional(),apply:De.boolean().default(!0)});Os.post("/eval-targets/:id/promotions",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=eC.parse(await e.req.json());if(!await nt(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(ln(k.id,n));if(!s)return e.json({error:"Eval target not found"},404);let i=s.content,a=r.candidateContent,u=r.pairs,l=ul(u,{baseline:"prior-version"}),p=!1,f=["adequacy could not be computed for this target"];try{let O=await ia(t,n);p=O.powerCheck.adequate,f=O.powerCheck.reasons??[]}catch(O){f=[`adequacy check failed: ${O instanceof Error?O.message:String(O)}`]}let _=r.windowDays??zc,v=r.maxPromotionsPerWindow??Ri,h=new Date(Date.now()-_*24*60*60*1e3),[m]=await d.select({n:yh`count(*)::int`}).from(ie).where(yp(ln(ie.evalTargetId,n),ln(ie.applied,!0),R0(ie.createdAt,h))),w=m?.n??0,I=_p(i),b=r.measuredAgainstContentHash===void 0?void 0:r.measuredAgainstContentHash===I,A=gg({verdict:l,canaryGreen:r.canaryGreen,adequate:p,adequacyReasons:f,promotionsInWindow:w,maxPromotionsPerWindow:v,immutableSections:r.immutableSections,beforeContent:i,afterContent:a,measurementMatchesPredecessor:b}),E={canaryGreen:r.canaryGreen,adequate:p,adequacyReasons:f,promotionsInWindow:w,maxPromotionsPerWindow:v,windowDays:_,immutableSections:r.immutableSections,nPairs:u.length,measurementMatchesPredecessor:b??null,measuredAgainstContentHash:r.measuredAgainstContentHash??null,cost:r.measurementCost??null,accumulation:r.accumulation?{...r.accumulation,pairs:u}:null,applied:!1},S=A.decision==="promote"&&r.apply;E.applied=S;let R;try{R=await d.transaction(async O=>{if(S){let N=s.metadata&&typeof s.metadata=="object"&&!Array.isArray(s.metadata)?s.metadata:{};await O.update(k).set({content:a,version:(s.version??1)+1,metadata:{...N,content_hash:_p(a)},updatedAt:new Date}).where(ln(k.id,n))}let[W]=await O.insert(ie).values({userId:t,evalTargetId:n,fromContentHash:I,toContentHash:_p(a),fromContent:i,toContent:a,proposalSource:r.proposalSource,proposalRationale:r.proposalRationale,decision:A.decision,applied:S,refusals:A.refusals,rationale:A.rationale,effectClass:A.effect,verdict:l,gates:E,touchedSections:A.touched}).returning({id:ie.id,createdAt:ie.createdAt});return W})}catch(O){if(O?.code==="23505")return e.json({error:"This edit has already been applied to this target",code:"PROMOTION_ALREADY_APPLIED"},409);throw O}return e.json({id:R.id,createdAt:R.createdAt,decision:A.decision,applied:S,rationale:A.rationale,refusals:A.refusals,effectClass:A.effect,touchedSections:A.touched,verdict:l,gates:E},201)});Os.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 nt(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(ln(ie.evalTargetId,n)).orderBy(QO(ie.createdAt)).limit(r).offset(o),a=await d.select({decision:ie.decision,n:yh`count(*)::int`}).from(ie).where(ln(ie.evalTargetId,n)).groupBy(ie.decision),u={promote:0,revert:0,refuse:0};for(let l of a)u[l.decision]=l.n;return e.json({promotions:i,counts:u,total:Object.values(u).reduce((l,p)=>l+p,0),limit:r,offset:o})});Os.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(yp(ln(ie.id,n),ln(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(ln(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()-zc*864e5),[u]=await o.select({n:yh`count(*)::int`}).from(ie).where(yp(ln(ie.evalTargetId,s.evalTargetId),ln(ie.applied,!0),R0(ie.createdAt,a)));if((u?.n??0)>=Ri)return{status:409,body:{error:`Change budget exhausted (${u?.n}/${Ri} applied in ${zc}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:_p(s.toContent)},updatedAt:new Date}).where(ln(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(ln(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}});Os.get("/promotions/:promotionId",async e=>{let t=e.get("userId"),n=e.req.param("promotionId"),[r]=await d.select().from(ie).where(yp(ln(ie.id,n),ln(ie.userId,t)));return r?e.json(r):e.json({error:"Promotion not found"},404)});D();import{Hono as nC}from"hono";import{z as ge}from"zod";import{and as aa,desc as rC,eq as Nt}from"drizzle-orm";var k0=["proposed","ready","applied","measuring","improved","inconclusive","harmful","rollback_ready","reverted","failed"],tC={proposed:["ready","failed"],ready:["applied","failed"],applied:["measuring","reverted","failed"],measuring:["improved","inconclusive","harmful","reverted","failed"],inconclusive:["measuring","improved","harmful","failed"],harmful:["rollback_ready"],rollback_ready:["reverted","failed"],improved:[],reverted:[],failed:[]};function N0(e,t){return tC[e].includes(t)}c(N0,"canTransitionRecommendationApplication");var ca=new nC,j0=ge.enum(["claude_code","codex","shared"]),P0=ge.enum(k0),oC=ge.discriminatedUnion("kind",[ge.object({kind:ge.literal("delete-paths"),paths:ge.array(ge.string().min(1)).min(1)}),ge.object({kind:ge.literal("remove-marked-region"),file:ge.string().min(1),startMarker:ge.string().min(1),endMarker:ge.string().min(1),backupPath:ge.string().min(1),hashAtWrite:ge.string().min(1)}),ge.object({kind:ge.literal("remove-hook-entry"),file:ge.string().min(1),event:ge.string().min(1),command:ge.string().min(1),backupPath:ge.string().min(1),hashAtWrite:ge.string().min(1)})]),sC=ge.object({instructionId:ge.string().uuid(),projectId:ge.string().uuid().optional(),projectPath:ge.string().min(1),harness:j0,targetPath:ge.string().min(1),applyMode:ge.enum(["auto","human"]),status:ge.enum(["proposed","applied"]).default("proposed"),beforeHash:ge.string().optional(),appliedHash:ge.string().optional(),boundaryClass:ge.enum(Cc).optional(),targets:ge.array(ge.string().min(1)).optional(),inverse:oC.optional(),requires:ge.array(ge.string().min(1)).optional(),provides:ge.array(ge.string().min(1)).optional(),applyBatchId:ge.string().uuid().optional(),applySeq:ge.number().int().min(0).optional()});ca.get("/recommendation-applications",async e=>{let t=e.get("userId"),n=ge.object({harness:j0.optional(),artifact:ge.string().min(1).optional(),status:P0.optional(),projectPath:ge.string().min(1).optional(),instructionId:ge.string().uuid().optional(),limit:ge.coerce.number().int().min(1).max(200).default(50)}).parse(e.req.query()),r=[Nt(Re.userId,t)];n.instructionId&&r.push(Nt(Re.instructionId,n.instructionId)),n.harness&&r.push(Nt(Re.harness,n.harness)),n.status&&r.push(Nt(Re.status,n.status)),n.projectPath&&r.push(Nt(Re.projectPath,n.projectPath)),n.artifact&&r.push(Nt(g.type,n.artifact));let o=await d.select({application:Re,artifact:g.type,title:g.name}).from(Re).innerJoin(g,Nt(g.id,Re.instructionId)).where(aa(...r)).orderBy(rC(Re.updatedAt)).limit(n.limit);return e.json({applications:o.map(({application:s,...i})=>({...s,...i}))})});ca.post("/recommendation-applications",async e=>{let t=e.get("userId"),n=sC.parse(await e.req.json()),[r]=await d.select({id:g.id}).from(g).where(aa(Nt(g.id,n.instructionId),Nt(g.createdBy,t))).limit(1);if(!r)return e.json({error:"Recommendation not found"},404);if(n.status==="applied"){let l={boundaryClass:n.boundaryClass,targets:n.targets??[],requires:n.requires??[],provides:n.provides??[]},p=[...n.boundaryClass?[]:[{field:"boundaryClass",message:"required when recording an applied effect"}],...n.inverse?[]:[{field:"inverse",message:"an applied effect must record how to undo it"}],...zf(l),...n.inverse?Vf(l,n.inverse):[]];if(p.length>0)return e.json({error:"Applied effect is not recordable",problems:p},422)}let o=new Date,s={status:n.status,beforeHash:n.beforeHash,appliedHash:n.appliedHash,boundaryClass:n.boundaryClass,targets:n.targets??[],inverse:n.inverse,requires:n.requires??[],provides:n.provides??[],applyBatchId:n.applyBatchId,applySeq:n.applySeq,...n.status==="applied"?{appliedAt:o}:{}},[i]=await d.insert(Re).values({userId:t,instructionId:n.instructionId,projectId:n.projectId,projectPath:n.projectPath,harness:n.harness,targetPath:n.targetPath,applyMode:n.applyMode,...s}).onConflictDoNothing().returning();if(i)return e.json({application:i},201);let[a]=await d.select().from(Re).where(aa(Nt(Re.userId,t),Nt(Re.instructionId,n.instructionId),Nt(Re.projectPath,n.projectPath),Nt(Re.harness,n.harness),Nt(Re.targetPath,n.targetPath))).limit(1),u=new Set(["proposed","ready","reverted","failed"]);if(a&&n.status==="applied"&&u.has(a.status)){let[l]=await d.update(Re).set({...s,updatedAt:o,revertedAt:null,verdict:null,verdictDetail:null}).where(aa(Nt(Re.id,a.id),Nt(Re.userId,t),Nt(Re.status,a.status))).returning();if(l)return e.json({application:l},200)}return e.json({application:a},200)});var iC=ge.object({status:P0,beforeHash:ge.string().optional(),appliedHash:ge.string().optional(),verdictDetail:ge.string().optional()});ca.post("/recommendation-applications/:id/transition",async e=>{let t=e.get("userId"),n=iC.parse(await e.req.json()),[r]=await d.select().from(Re).where(aa(Nt(Re.id,e.req.param("id")),Nt(Re.userId,t))).limit(1);if(!r)return e.json({error:"Recommendation application not found"},404);if(!N0(r.status,n.status))return e.json({error:`Invalid transition: ${r.status} -> ${n.status}`},409);let o=new Date,s={...n.status==="applied"?{appliedAt:o}:{},...n.status==="measuring"&&!r.measurementStartedAt?{measurementStartedAt:o}:{},...["improved","inconclusive","harmful"].includes(n.status)?{measurementEndedAt:o,verdict:n.status}:{},...n.status==="reverted"?{revertedAt:o}:{}},[i]=await d.update(Re).set({status:n.status,beforeHash:n.beforeHash??r.beforeHash,appliedHash:n.appliedHash??r.appliedHash,verdictDetail:n.verdictDetail??r.verdictDetail,updatedAt:o,...s}).where(aa(Nt(Re.id,r.id),Nt(Re.userId,t),Nt(Re.status,r.status))).returning();return i?e.json({application:i}):e.json({error:"Application changed concurrently; retry"},409)});D();import{Hono as aC}from"hono";import{z as yt}from"zod";import{eq as lr,and as wh,asc as cC,desc as D0,isNull as uC,inArray as dC,sql as lC}from"drizzle-orm";var Cs=new aC,pC=yt.object({jobId:yt.string().uuid().optional(),evalId:yt.string().uuid(),evalTargetId:yt.string().uuid(),evalTargetVersion:yt.number().int(),configuration:yt.enum(["with_target","without_target","baseline","with_candidate","with_prior_version"]),runNumber:yt.number().int().default(1),iteration:yt.number().int().default(1),status:yt.enum(["pending","running","completed","failed"]).default("completed"),outputs:yt.record(yt.unknown()).default({}),timing:yt.record(yt.unknown()).default({}),grading:yt.record(yt.unknown()).default({}),comparison:yt.record(yt.unknown()).nullable().optional()}),mC=yt.object({iteration:yt.number().int().default(1),runSummary:yt.record(yt.unknown()).default({}),notes:yt.array(yt.string()).default([])});Cs.post("/eval-runs",async e=>{let t=e.get("userId"),n=await e.req.json(),r=pC.parse(n);if(!await nt(r.evalTargetId,t))return e.json({error:"Eval target not found"},404);let[s]=await d.insert(Ie).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(Ie).where(wh(lr(Ie.jobId,r.jobId),lr(Ie.evalId,r.evalId),lr(Ie.configuration,r.configuration),lr(Ie.runNumber,r.runNumber),lr(Ie.iteration,r.iteration))).limit(1);return i?e.json({...i,deduped:!0},200):e.json({error:"Run conflicted but existing row not found"},409)});Cs.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 nt(n,t))return e.json({error:"Eval target not found"},404);let i=e.req.query("limit"),a=e.req.query("offset"),u=i?parseInt(i,10):NaN,l=Number.isFinite(u)?Math.min(Math.max(1,u),100):50,p=a?parseInt(a,10):NaN,f=Number.isFinite(p)?Math.max(0,p):0,_=[lr(Ie.evalTargetId,n)];r&&_.push(lr(Ie.iteration,parseInt(r,10))),o&&_.push(lr(Ie.configuration,o)),e.req.query("activeCasesOnly")==="1"&&_.push(dC(Ie.evalId,d.select({id:Ee.id}).from(Ee).where(wh(lr(Ee.evalTargetId,n),uC(Ee.retiredAt)))));let v=e.req.query("candidateContentHash");v&&_.push(lC`${Ie.outputs}->>'candidateContentHash' = ${v}`);let h=e.req.query("jobId");if(h){let I=yt.string().uuid().safeParse(h);if(!I.success)return e.json({error:"Invalid jobId"},400);_.push(lr(Ie.jobId,I.data))}let w=(await d.select().from(Ie).where(wh(..._)).orderBy(D0(Ie.createdAt),cC(Ie.id)).limit(l).offset(f)).map(I=>{let b=I.outputs??{},{diff:A,transcript:E,...S}=b,R=v?S:{...S,transcript:E};return{...I,outputs:R,comparison:null}});return e.json(w)});Cs.post("/eval-targets/:id/benchmarks",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=mC.parse(r);if(!await nt(n,t))return e.json({error:"Eval target not found"},404);let[i]=await d.insert(rr).values({evalTargetId:n,iteration:o.iteration,runSummary:o.runSummary,notes:o.notes}).returning();return e.json(i,201)});Cs.get("/eval-targets/:id/benchmarks",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await nt(n,t))return e.json({error:"Eval target not found"},404);let o=await d.select().from(rr).where(lr(rr.evalTargetId,n)).orderBy(D0(rr.createdAt));return e.json(o)});D();import{Hono as fC}from"hono";import{z as Jt}from"zod";import{eq as Ls,and as C0,or as gC,desc as hC,asc as _C}from"drizzle-orm";import{alias as O0}from"drizzle-orm/pg-core";var ua=new fC,yC=Jt.object({targetAId:Jt.string().uuid(),targetBId:Jt.string().uuid(),targetAVersion:Jt.number().int(),targetBVersion:Jt.number().int(),isSwapped:Jt.boolean(),winnerTargetId:Jt.string().uuid().nullable(),perEval:Jt.array(Jt.object({evalName:Jt.string(),winnerTargetId:Jt.string().uuid().nullable(),reasoning:Jt.string().default("")})).default([]),overall:Jt.record(Jt.unknown()).default({}),rawOutput:Jt.string().nullable().optional(),model:Jt.string().nullable().optional(),status:Jt.enum(["completed","parse_failed"]).default("completed")});ua.post("/eval-comparisons",async e=>{let t=e.get("userId"),n=await e.req.json(),r=yC.parse(n),[o,s]=await Promise.all([nt(r.targetAId,t),nt(r.targetBId,t)]);if(!o||!s)return e.json({error:"Eval target not found"},404);let i=c(u=>u===null||u===r.targetAId||u===r.targetBId,"validWinner");if(!i(r.winnerTargetId)||!r.perEval.every(u=>i(u.winnerTargetId)))return e.json({error:"winnerTargetId must be one of the compared targets or null"},400);let[a]=await d.insert(ot).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)});ua.get("/eval-targets/:id/comparisons",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await nt(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,u=s?parseInt(s,10):NaN,l=Number.isFinite(u)?Math.max(0,u):0,p=O0(k,"targets_a"),f=O0(k,"targets_b"),_=await d.select({id:ot.id,userId:ot.userId,targetAId:ot.targetAId,targetBId:ot.targetBId,targetAName:p.name,targetBName:f.name,targetAVersion:ot.targetAVersion,targetBVersion:ot.targetBVersion,isSwapped:ot.isSwapped,winnerTargetId:ot.winnerTargetId,perEval:ot.perEval,overall:ot.overall,model:ot.model,status:ot.status,createdAt:ot.createdAt}).from(ot).innerJoin(p,Ls(ot.targetAId,p.id)).innerJoin(f,Ls(ot.targetBId,f.id)).where(C0(Ls(ot.userId,t),gC(Ls(ot.targetAId,n),Ls(ot.targetBId,n)))).orderBy(hC(ot.createdAt),_C(ot.id)).limit(a).offset(l);return e.json(_.map(v=>({...v,rawOutput:null})))});ua.get("/eval-comparisons/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=Jt.string().uuid().safeParse(n);if(!r.success)return e.json({error:"Invalid comparison id"},400);let[o]=await d.select().from(ot).where(C0(Ls(ot.id,r.data),Ls(ot.userId,t)));return o?e.json(o):e.json({error:"Comparison not found"},404)});D();import{Hono as bC}from"hono";import{z as da}from"zod";import{eq as la,and as vh,desc as EC,asc as AC,inArray as SC,sql as xC}from"drizzle-orm";D();import{sql as wC}from"drizzle-orm";function L0(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)}c(L0,"kappaFromCounts");var M0=c((e,t)=>({agree:e,total:t,rate:t>0?e/t:null}),"slice");function vC(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:L0({n:e.pairs,agree:e.agreeHuman,aYes:e.humanYes,bYes:e.reviewerYes}),snapshotAgreementRate:e.pairs>0?e.snapshotAgree/e.pairs:null,snapshotKappa:L0({n:e.pairs,agree:e.snapshotAgree,aYes:e.snapshotHumanYes,bYes:e.reviewerYes}),judgeAgreementRate:e.pairs>0?e.judgeAgreeHuman/e.pairs:null,onJudgePass:M0(e.judgePassAgree,e.judgePassPairs),onJudgeFail:M0(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}}c(vC,"reviewerAgreementReport");async function $0(e){return(await d.execute(wC`
1111
+ `))[0]?.remaining??0}c(L0,"countRunsAwaitingReview");var Cs=new oC,Em=c(e=>sC("sha256").update(e).digest("hex"),"sha256"),aC=De.object({withScore:De.number().min(0).max(1),withoutScore:De.number().min(0).max(1),withCost:De.number().nonnegative().optional(),withoutCost:De.number().nonnegative().optional(),withLatency:De.number().nonnegative().optional(),withoutLatency:De.number().nonnegative().optional()}),cC=De.object({candidateContent:De.string().min(1),proposalSource:De.enum(["llm","groom","human"]),proposalRationale:De.string().default(""),pairs:De.array(aC).default([]),canaryGreen:De.boolean(),measuredAgainstContentHash:De.string().optional(),accumulation:De.object({candidateContentHash:De.string(),priorContentHash:De.string(),targetPairs:De.number().int().positive(),carriedPairs:De.number().int().nonnegative(),runs:De.number().int().positive()}).optional(),immutableSections:De.array(De.string()).default([]),maxPromotionsPerWindow:De.number().int().positive().optional(),windowDays:De.number().int().positive().optional(),measurementCost:De.object({modelCalls:De.number().int().nonnegative(),proposalCalls:De.number().int().nonnegative(),executorCalls:De.number().int().nonnegative(),graderCalls:De.number().int().nonnegative(),plannedPairs:De.number().int().nonnegative(),usablePairs:De.number().int().nonnegative(),verdictPairs:De.number().int().nonnegative().optional(),passes:De.number().int().nonnegative(),liveCases:De.number().int().nonnegative(),mde:De.number().nonnegative().nullable(),wallMs:De.number().nonnegative()}).optional(),apply:De.boolean().default(!0)});Cs.post("/eval-targets/:id/promotions",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=cC.parse(await e.req.json());if(!await nt(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(mn(k.id,n));if(!s)return e.json({error:"Eval target not found"},404);let i=s.content,a=r.candidateContent,d=r.pairs,l=fl(d,{baseline:"prior-version"}),m=!1,p=["adequacy could not be computed for this target"];try{let P=await ia(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??Vc,w=r.maxPromotionsPerWindow??ki,f=new Date(Date.now()-_*24*60*60*1e3),[h]=await u.select({n:Sh`count(*)::int`}).from(ae).where(Am(mn(ae.evalTargetId,n),mn(ae.applied,!0),M0(ae.createdAt,f))),v=h?.n??0,I=Em(i),E=r.measuredAgainstContentHash===void 0?void 0:r.measuredAgainstContentHash===I,A=Ig({verdict:l,canaryGreen:r.canaryGreen,adequate:m,adequacyReasons:p,promotionsInWindow:v,maxPromotionsPerWindow:w,immutableSections:r.immutableSections,beforeContent:i,afterContent:a,measurementMatchesPredecessor:E}),b={canaryGreen:r.canaryGreen,adequate:m,adequacyReasons:p,promotionsInWindow:v,maxPromotionsPerWindow:w,windowDays:_,immutableSections:r.immutableSections,nPairs:d.length,measurementMatchesPredecessor:E??null,measuredAgainstContentHash:r.measuredAgainstContentHash??null,cost:r.measurementCost??null,accumulation:r.accumulation?{...r.accumulation,pairs:d}:null,applied:!1},S=A.decision==="promote"&&r.apply;b.applied=S;let T;try{T=await u.transaction(async P=>{if(S){let N=s.metadata&&typeof s.metadata=="object"&&!Array.isArray(s.metadata)?s.metadata:{};await P.update(k).set({content:a,version:(s.version??1)+1,metadata:{...N,content_hash:Em(a)},updatedAt:new Date}).where(mn(k.id,n))}let[H]=await P.insert(ae).values({userId:t,evalTargetId:n,fromContentHash:I,toContentHash:Em(a),fromContent:i,toContent:a,proposalSource:r.proposalSource,proposalRationale:r.proposalRationale,decision:A.decision,applied:S,refusals:A.refusals,rationale:A.rationale,effectClass:A.effect,verdict:l,gates:b,touchedSections:A.touched}).returning({id:ae.id,createdAt:ae.createdAt});return H})}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:T.id,createdAt:T.createdAt,decision:A.decision,applied:S,rationale:A.rationale,refusals:A.refusals,effectClass:A.effect,touchedSections:A.touched,verdict:l,gates:b},201)});Cs.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 nt(n,t))return e.json({error:"Eval target not found"},404);let i=await u.select({id:ae.id,createdAt:ae.createdAt,decision:ae.decision,applied:ae.applied,effectClass:ae.effectClass,rationale:ae.rationale,refusals:ae.refusals,proposalSource:ae.proposalSource,proposalRationale:ae.proposalRationale,fromContentHash:ae.fromContentHash,toContentHash:ae.toContentHash,touchedSections:ae.touchedSections,verdict:ae.verdict,gates:ae.gates}).from(ae).where(mn(ae.evalTargetId,n)).orderBy(iC(ae.createdAt)).limit(r).offset(o),a=await u.select({decision:ae.decision,n:Sh`count(*)::int`}).from(ae).where(mn(ae.evalTargetId,n)).groupBy(ae.decision),d={promote:0,revert:0,refuse:0};for(let l of a)d[l.decision]=l.n;return e.json({promotions:i,counts:d,total:Object.values(d).reduce((l,m)=>l+m,0),limit:r,offset:o})});Cs.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(ae).where(Am(mn(ae.id,n),mn(ae.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(mn(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),[d]=await o.select({n:Sh`count(*)::int`}).from(ae).where(Am(mn(ae.evalTargetId,s.evalTargetId),mn(ae.applied,!0),M0(ae.createdAt,a)));if((d?.n??0)>=ki)return{status:409,body:{error:`Change budget exhausted (${d?.n}/${ki} 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:Em(s.toContent)},updatedAt:new Date}).where(mn(k.id,s.evalTargetId));let m=s.gates&&typeof s.gates=="object"&&!Array.isArray(s.gates)?s.gates:{};return await o.update(ae).set({applied:!0,gates:{...m,applied:!0,appliedAt:new Date().toISOString(),appliedVia:"deferred-human-apply"}}).where(mn(ae.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}});Cs.get("/promotions/:promotionId",async e=>{let t=e.get("userId"),n=e.req.param("promotionId"),[r]=await u.select().from(ae).where(Am(mn(ae.id,n),mn(ae.userId,t)));return r?e.json(r):e.json({error:"Promotion not found"},404)});O();import{Hono as uC}from"hono";import{z as ge}from"zod";import{and as aa,desc as lC,eq as Nt}from"drizzle-orm";var $0=["proposed","ready","applied","measuring","improved","inconclusive","harmful","rollback_ready","reverted","failed"],dC={proposed:["ready","failed"],ready:["applied","failed"],applied:["measuring","reverted","failed"],measuring:["improved","inconclusive","harmful","reverted","failed"],inconclusive:["measuring","improved","harmful","failed"],harmful:["rollback_ready"],rollback_ready:["reverted","failed"],improved:[],reverted:[],failed:[]};function q0(e,t){return dC[e].includes(t)}c(q0,"canTransitionRecommendationApplication");var ca=new uC,U0=ge.enum(["claude_code","codex","shared"]),H0=ge.enum($0),mC=ge.discriminatedUnion("kind",[ge.object({kind:ge.literal("delete-paths"),paths:ge.array(ge.string().min(1)).min(1)}),ge.object({kind:ge.literal("remove-marked-region"),file:ge.string().min(1),startMarker:ge.string().min(1),endMarker:ge.string().min(1),backupPath:ge.string().min(1),hashAtWrite:ge.string().min(1)}),ge.object({kind:ge.literal("remove-hook-entry"),file:ge.string().min(1),event:ge.string().min(1),command:ge.string().min(1),backupPath:ge.string().min(1),hashAtWrite:ge.string().min(1)})]),pC=ge.object({instructionId:ge.string().uuid(),projectId:ge.string().uuid().optional(),projectPath:ge.string().min(1),harness:U0,targetPath:ge.string().min(1),applyMode:ge.enum(["auto","human"]),status:ge.enum(["proposed","applied"]).default("proposed"),beforeHash:ge.string().optional(),appliedHash:ge.string().optional(),boundaryClass:ge.enum(Cc).optional(),targets:ge.array(ge.string().min(1)).optional(),inverse:mC.optional(),requires:ge.array(ge.string().min(1)).optional(),provides:ge.array(ge.string().min(1)).optional(),applyBatchId:ge.string().uuid().optional(),applySeq:ge.number().int().min(0).optional()});ca.get("/recommendation-applications",async e=>{let t=e.get("userId"),n=ge.object({harness:U0.optional(),artifact:ge.string().min(1).optional(),status:H0.optional(),projectPath:ge.string().min(1).optional(),instructionId:ge.string().uuid().optional(),limit:ge.coerce.number().int().min(1).max(200).default(50)}).parse(e.req.query()),r=[Nt(Te.userId,t)];n.instructionId&&r.push(Nt(Te.instructionId,n.instructionId)),n.harness&&r.push(Nt(Te.harness,n.harness)),n.status&&r.push(Nt(Te.status,n.status)),n.projectPath&&r.push(Nt(Te.projectPath,n.projectPath)),n.artifact&&r.push(Nt(g.type,n.artifact));let o=await u.select({application:Te,artifact:g.type,title:g.name}).from(Te).innerJoin(g,Nt(g.id,Te.instructionId)).where(aa(...r)).orderBy(lC(Te.updatedAt)).limit(n.limit);return e.json({applications:o.map(({application:s,...i})=>({...s,...i}))})});ca.post("/recommendation-applications",async e=>{let t=e.get("userId"),n=pC.parse(await e.req.json()),[r]=await u.select({id:g.id}).from(g).where(aa(Nt(g.id,n.instructionId),Nt(g.createdBy,t))).limit(1);if(!r)return e.json({error:"Recommendation not found"},404);if(n.status==="applied"){let l={boundaryClass:n.boundaryClass,targets:n.targets??[],requires:n.requires??[],provides:n.provides??[]},m=[...n.boundaryClass?[]:[{field:"boundaryClass",message:"required when recording an applied effect"}],...n.inverse?[]:[{field:"inverse",message:"an applied effect must record how to undo it"}],...Xf(l),...n.inverse?Qf(l,n.inverse):[]];if(m.length>0)return e.json({error:"Applied effect is not recordable",problems:m},422)}let o=new Date,s={status:n.status,beforeHash:n.beforeHash,appliedHash:n.appliedHash,boundaryClass:n.boundaryClass,targets:n.targets??[],inverse:n.inverse,requires:n.requires??[],provides:n.provides??[],applyBatchId:n.applyBatchId,applySeq:n.applySeq,...n.status==="applied"?{appliedAt:o}:{}},[i]=await u.insert(Te).values({userId:t,instructionId:n.instructionId,projectId:n.projectId,projectPath:n.projectPath,harness:n.harness,targetPath:n.targetPath,applyMode:n.applyMode,...s}).onConflictDoNothing().returning();if(i)return e.json({application:i},201);let[a]=await u.select().from(Te).where(aa(Nt(Te.userId,t),Nt(Te.instructionId,n.instructionId),Nt(Te.projectPath,n.projectPath),Nt(Te.harness,n.harness),Nt(Te.targetPath,n.targetPath))).limit(1),d=new Set(["proposed","ready","reverted","failed"]);if(a&&n.status==="applied"&&d.has(a.status)){let[l]=await u.update(Te).set({...s,updatedAt:o,revertedAt:null,verdict:null,verdictDetail:null}).where(aa(Nt(Te.id,a.id),Nt(Te.userId,t),Nt(Te.status,a.status))).returning();if(l)return e.json({application:l},200)}return e.json({application:a},200)});var fC=ge.object({status:H0,beforeHash:ge.string().optional(),appliedHash:ge.string().optional(),verdictDetail:ge.string().optional()});ca.post("/recommendation-applications/:id/transition",async e=>{let t=e.get("userId"),n=fC.parse(await e.req.json()),[r]=await u.select().from(Te).where(aa(Nt(Te.id,e.req.param("id")),Nt(Te.userId,t))).limit(1);if(!r)return e.json({error:"Recommendation application not found"},404);if(!q0(r.status,n.status))return e.json({error:`Invalid transition: ${r.status} -> ${n.status}`},409);let o=new Date,s={...n.status==="applied"?{appliedAt:o}:{},...n.status==="measuring"&&!r.measurementStartedAt?{measurementStartedAt:o}:{},...["improved","inconclusive","harmful"].includes(n.status)?{measurementEndedAt:o,verdict:n.status}:{},...n.status==="reverted"?{revertedAt:o}:{}},[i]=await u.update(Te).set({status:n.status,beforeHash:n.beforeHash??r.beforeHash,appliedHash:n.appliedHash??r.appliedHash,verdictDetail:n.verdictDetail??r.verdictDetail,updatedAt:o,...s}).where(aa(Nt(Te.id,r.id),Nt(Te.userId,t),Nt(Te.status,r.status))).returning();return i?e.json({application:i}):e.json({error:"Application changed concurrently; retry"},409)});O();import{Hono as gC}from"hono";import{z as yt}from"zod";import{eq as ur,and as xh,asc as hC,desc as B0,isNull as _C,inArray as yC,sql as wC}from"drizzle-orm";var Ls=new gC,vC=yt.object({jobId:yt.string().uuid().optional(),evalId:yt.string().uuid(),evalTargetId:yt.string().uuid(),evalTargetVersion:yt.number().int(),configuration:yt.enum(["with_target","without_target","baseline","with_candidate","with_prior_version"]),runNumber:yt.number().int().default(1),iteration:yt.number().int().default(1),status:yt.enum(["pending","running","completed","failed"]).default("completed"),outputs:yt.record(yt.unknown()).default({}),timing:yt.record(yt.unknown()).default({}),grading:yt.record(yt.unknown()).default({}),comparison:yt.record(yt.unknown()).nullable().optional()}),IC=yt.object({iteration:yt.number().int().default(1),runSummary:yt.record(yt.unknown()).default({}),notes:yt.array(yt.string()).default([])});Ls.post("/eval-runs",async e=>{let t=e.get("userId"),n=await e.req.json(),r=vC.parse(n);if(!await nt(r.evalTargetId,t))return e.json({error:"Eval target not found"},404);let[s]=await u.insert(Ie).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(Ie).where(xh(ur(Ie.jobId,r.jobId),ur(Ie.evalId,r.evalId),ur(Ie.configuration,r.configuration),ur(Ie.runNumber,r.runNumber),ur(Ie.iteration,r.iteration))).limit(1);return i?e.json({...i,deduped:!0},200):e.json({error:"Run conflicted but existing row not found"},409)});Ls.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 nt(n,t))return e.json({error:"Eval target not found"},404);let i=e.req.query("limit"),a=e.req.query("offset"),d=i?parseInt(i,10):NaN,l=Number.isFinite(d)?Math.min(Math.max(1,d),100):50,m=a?parseInt(a,10):NaN,p=Number.isFinite(m)?Math.max(0,m):0,_=[ur(Ie.evalTargetId,n)];r&&_.push(ur(Ie.iteration,parseInt(r,10))),o&&_.push(ur(Ie.configuration,o)),e.req.query("activeCasesOnly")==="1"&&_.push(yC(Ie.evalId,u.select({id:Ee.id}).from(Ee).where(xh(ur(Ee.evalTargetId,n),_C(Ee.retiredAt)))));let w=e.req.query("candidateContentHash");w&&_.push(wC`${Ie.outputs}->>'candidateContentHash' = ${w}`);let f=e.req.query("jobId");if(f){let I=yt.string().uuid().safeParse(f);if(!I.success)return e.json({error:"Invalid jobId"},400);_.push(ur(Ie.jobId,I.data))}let v=(await u.select().from(Ie).where(xh(..._)).orderBy(B0(Ie.createdAt),hC(Ie.id)).limit(l).offset(p)).map(I=>{let E=I.outputs??{},{diff:A,transcript:b,...S}=E,T=w?S:{...S,transcript:b};return{...I,outputs:T,comparison:null}});return e.json(v)});Ls.post("/eval-targets/:id/benchmarks",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=IC.parse(r);if(!await nt(n,t))return e.json({error:"Eval target not found"},404);let[i]=await u.insert(rr).values({evalTargetId:n,iteration:o.iteration,runSummary:o.runSummary,notes:o.notes}).returning();return e.json(i,201)});Ls.get("/eval-targets/:id/benchmarks",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await nt(n,t))return e.json({error:"Eval target not found"},404);let o=await u.select().from(rr).where(ur(rr.evalTargetId,n)).orderBy(B0(rr.createdAt));return e.json(o)});O();import{Hono as bC}from"hono";import{z as Kt}from"zod";import{eq as Ms,and as W0,or as EC,desc as AC,asc as SC}from"drizzle-orm";import{alias as F0}from"drizzle-orm/pg-core";var da=new bC,xC=Kt.object({targetAId:Kt.string().uuid(),targetBId:Kt.string().uuid(),targetAVersion:Kt.number().int(),targetBVersion:Kt.number().int(),isSwapped:Kt.boolean(),winnerTargetId:Kt.string().uuid().nullable(),perEval:Kt.array(Kt.object({evalName:Kt.string(),winnerTargetId:Kt.string().uuid().nullable(),reasoning:Kt.string().default("")})).default([]),overall:Kt.record(Kt.unknown()).default({}),rawOutput:Kt.string().nullable().optional(),model:Kt.string().nullable().optional(),status:Kt.enum(["completed","parse_failed"]).default("completed")});da.post("/eval-comparisons",async e=>{let t=e.get("userId"),n=await e.req.json(),r=xC.parse(n),[o,s]=await Promise.all([nt(r.targetAId,t),nt(r.targetBId,t)]);if(!o||!s)return e.json({error:"Eval target not found"},404);let i=c(d=>d===null||d===r.targetAId||d===r.targetBId,"validWinner");if(!i(r.winnerTargetId)||!r.perEval.every(d=>i(d.winnerTargetId)))return e.json({error:"winnerTargetId must be one of the compared targets or null"},400);let[a]=await u.insert(ot).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)});da.get("/eval-targets/:id/comparisons",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await nt(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,d=s?parseInt(s,10):NaN,l=Number.isFinite(d)?Math.max(0,d):0,m=F0(k,"targets_a"),p=F0(k,"targets_b"),_=await u.select({id:ot.id,userId:ot.userId,targetAId:ot.targetAId,targetBId:ot.targetBId,targetAName:m.name,targetBName:p.name,targetAVersion:ot.targetAVersion,targetBVersion:ot.targetBVersion,isSwapped:ot.isSwapped,winnerTargetId:ot.winnerTargetId,perEval:ot.perEval,overall:ot.overall,model:ot.model,status:ot.status,createdAt:ot.createdAt}).from(ot).innerJoin(m,Ms(ot.targetAId,m.id)).innerJoin(p,Ms(ot.targetBId,p.id)).where(W0(Ms(ot.userId,t),EC(Ms(ot.targetAId,n),Ms(ot.targetBId,n)))).orderBy(AC(ot.createdAt),SC(ot.id)).limit(a).offset(l);return e.json(_.map(w=>({...w,rawOutput:null})))});da.get("/eval-comparisons/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=Kt.string().uuid().safeParse(n);if(!r.success)return e.json({error:"Invalid comparison id"},400);let[o]=await u.select().from(ot).where(W0(Ms(ot.id,r.data),Ms(ot.userId,t)));return o?e.json(o):e.json({error:"Comparison not found"},404)});O();import{Hono as NC}from"hono";import{z as ua}from"zod";import{eq as la,and as Rh,desc as jC,asc as PC,inArray as DC,sql as OC}from"drizzle-orm";O();import{sql as RC}from"drizzle-orm";function z0(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)}c(z0,"kappaFromCounts");var V0=c((e,t)=>({agree:e,total:t,rate:t>0?e/t:null}),"slice");function TC(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:z0({n:e.pairs,agree:e.agreeHuman,aYes:e.humanYes,bYes:e.reviewerYes}),snapshotAgreementRate:e.pairs>0?e.snapshotAgree/e.pairs:null,snapshotKappa:z0({n:e.pairs,agree:e.snapshotAgree,aYes:e.snapshotHumanYes,bYes:e.reviewerYes}),judgeAgreementRate:e.pairs>0?e.judgeAgreeHuman/e.pairs:null,onJudgePass:V0(e.judgePassAgree,e.judgePassPairs),onJudgeFail:V0(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}}c(TC,"reviewerAgreementReport");async function J0(e){return(await u.execute(RC`
1107
1112
  SELECT
1108
1113
  j.reviewer_engine,
1109
1114
  array_agg(DISTINCT j.reviewer_model) AS models,
@@ -1135,7 +1140,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
1135
1140
  ) j
1136
1141
  GROUP BY j.reviewer_engine
1137
1142
  ORDER BY j.reviewer_engine
1138
- `)).map(n=>vC({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}))}c($0,"computeReviewerAgreement");D();import{eq as IC}from"drizzle-orm";async function _u(e,t,n={}){let{nudge:r=!0}=n;try{let[o]=await d.select({name:k.name,userId:k.userId}).from(k).where(IC(k.id,t));if(!o||o.userId!==e)return;let s=await ia(e,t);if(s.powerCheck.adequate){await un({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 u=await ip(e);u&&!(u.claude&&u.codex)&&await un({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 `+(u.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:u}});return}if(!r)return;let i=await T0(t);if(i<=0)return;let a=s.powerCheck.reasons[0];await un({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)}}c(_u,"notifyLabelState");var Yr=new bC,TC=da.object({verdict:da.enum(["approve","reject"]),flag:da.enum(["bad_grade","bad_assertion"]).nullable().optional(),note:da.string().max(2e3).nullable().optional()});async function q0(e,t){let n=da.string().uuid().safeParse(e);if(!n.success)return null;let[r]=await d.select().from(Ie).where(la(Ie.id,n.data));return r&&await nt(r.evalTargetId,t)?r:null}c(q0,"loadOwnedRun");Yr.put("/eval-runs/:runId/annotations/:index",async e=>{let t=e.get("userId"),n=e.req.param("runId"),r=e.req.param("index"),o=TC.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 q0(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 u=a[s];if(typeof u?.passed!="boolean")return e.json({error:"Expectation has no grade to annotate"},400);if(u.errored===!0)return e.json({error:"Expectation errored during grading \u2014 no judge verdict exists to annotate"},400);let l=u.method==="deterministic"?"deterministic":"llm",p=i.grading.judge_model??null,[f]=await d.insert(et).values({userId:t,evalRunId:i.id,evalTargetId:i.evalTargetId,expectationIndex:s,expectationText:u.text??"",judgePassed:u.passed,judgeMethod:l,judgeModel:p,verdict:o.verdict,flag:o.flag??null,note:o.note??null}).onConflictDoUpdate({target:[et.evalRunId,et.expectationIndex],set:{verdict:o.verdict,...o.flag!==void 0?{flag:o.flag}:{},...o.note!==void 0?{note:o.note}:{},expectationText:u.text??"",judgePassed:u.passed,judgeMethod:l,judgeModel:p,updatedAt:new Date}}).returning();await _u(t,i.evalTargetId,{nudge:!1});try{await wI({evalTargetId:i.evalTargetId,userId:t})}catch(_){console.error("[eval-annotations] judge-review enqueue failed:",_ instanceof Error?_.message:_)}return e.json(f)});Yr.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 q0(n,t);return o?(await d.delete(et).where(vh(la(et.evalRunId,o.id),la(et.expectationIndex,r))).returning({id:et.id})).length===0?e.json({error:"Annotation not found"},404):e.json({deleted:!0}):e.json({error:"Eval run not found"},404)});Yr.post("/eval-targets/:id/label-state",async e=>{let t=e.get("userId"),n=e.req.param("id");return await nt(n,t)?(await _u(t,n),e.json({ok:!0})):e.json({error:"Eval target not found"},404)});Yr.get("/eval-targets/:id/annotations",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await nt(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,u=s?parseInt(s,10):NaN,l=Number.isFinite(u)?Math.max(0,u):0,p=[la(et.evalTargetId,n)],f=e.req.query("runId");if(f){let v=da.string().uuid().safeParse(f);if(!v.success)return e.json({error:"Invalid runId"},400);p.push(la(et.evalRunId,v.data))}let _=await d.select().from(et).where(vh(...p)).orderBy(EC(et.createdAt),AC(et.id)).limit(a).offset(l);return e.json(_)});Yr.get("/eval-targets/:id/judge-calibration",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await nt(n,t))return e.json({error:"Eval target not found"},404);let[o,s]=await Promise.all([ia(t,n),$0(n)]);return e.json({...o,reviewers:s})});Yr.get("/eval-targets/:id/annotation-queue",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await nt(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 d.execute(xC`
1143
+ `)).map(n=>TC({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}))}c(J0,"computeReviewerAgreement");O();import{eq as kC}from"drizzle-orm";async function wd(e,t,n={}){let{nudge:r=!0}=n;try{let[o]=await u.select({name:k.name,userId:k.userId}).from(k).where(kC(k.id,t));if(!o||o.userId!==e)return;let s=await ia(e,t);if(s.powerCheck.adequate){await un({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 d=await mm(e);d&&!(d.claude&&d.codex)&&await un({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 `+(d.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:d}});return}if(!r)return;let i=await L0(t);if(i<=0)return;let a=s.powerCheck.reasons[0];await un({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)}}c(wd,"notifyLabelState");var Zr=new NC,CC=ua.object({verdict:ua.enum(["approve","reject"]),flag:ua.enum(["bad_grade","bad_assertion"]).nullable().optional(),note:ua.string().max(2e3).nullable().optional()});async function K0(e,t){let n=ua.string().uuid().safeParse(e);if(!n.success)return null;let[r]=await u.select().from(Ie).where(la(Ie.id,n.data));return r&&await nt(r.evalTargetId,t)?r:null}c(K0,"loadOwnedRun");Zr.put("/eval-runs/:runId/annotations/:index",async e=>{let t=e.get("userId"),n=e.req.param("runId"),r=e.req.param("index"),o=CC.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 K0(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 d=a[s];if(typeof d?.passed!="boolean")return e.json({error:"Expectation has no grade to annotate"},400);if(d.errored===!0)return e.json({error:"Expectation errored during grading \u2014 no judge verdict exists to annotate"},400);let l=d.method==="deterministic"?"deterministic":"llm",m=i.grading.judge_model??null,[p]=await u.insert(et).values({userId:t,evalRunId:i.id,evalTargetId:i.evalTargetId,expectationIndex:s,expectationText:d.text??"",judgePassed:d.passed,judgeMethod:l,judgeModel:m,verdict:o.verdict,flag:o.flag??null,note:o.note??null}).onConflictDoUpdate({target:[et.evalRunId,et.expectationIndex],set:{verdict:o.verdict,...o.flag!==void 0?{flag:o.flag}:{},...o.note!==void 0?{note:o.note}:{},expectationText:d.text??"",judgePassed:d.passed,judgeMethod:l,judgeModel:m,updatedAt:new Date}}).returning();await wd(t,i.evalTargetId,{nudge:!1});try{await TI({evalTargetId:i.evalTargetId,userId:t})}catch(_){console.error("[eval-annotations] judge-review enqueue failed:",_ instanceof Error?_.message:_)}return e.json(p)});Zr.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 K0(n,t);return o?(await u.delete(et).where(Rh(la(et.evalRunId,o.id),la(et.expectationIndex,r))).returning({id:et.id})).length===0?e.json({error:"Annotation not found"},404):e.json({deleted:!0}):e.json({error:"Eval run not found"},404)});Zr.post("/eval-targets/:id/label-state",async e=>{let t=e.get("userId"),n=e.req.param("id");return await nt(n,t)?(await wd(t,n),e.json({ok:!0})):e.json({error:"Eval target not found"},404)});Zr.get("/eval-targets/:id/annotations",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await nt(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,d=s?parseInt(s,10):NaN,l=Number.isFinite(d)?Math.max(0,d):0,m=[la(et.evalTargetId,n)],p=e.req.query("runId");if(p){let w=ua.string().uuid().safeParse(p);if(!w.success)return e.json({error:"Invalid runId"},400);m.push(la(et.evalRunId,w.data))}let _=await u.select().from(et).where(Rh(...m)).orderBy(jC(et.createdAt),PC(et.id)).limit(a).offset(l);return e.json(_)});Zr.get("/eval-targets/:id/judge-calibration",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await nt(n,t))return e.json({error:"Eval target not found"},404);let[o,s]=await Promise.all([ia(t,n),J0(n)]);return e.json({...o,reviewers:s})});Zr.get("/eval-targets/:id/annotation-queue",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await nt(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(OC`
1139
1144
  WITH current_judge AS (
1140
1145
  -- Canonical segment (00193) — NOT a fifth hand-copy of the recency rule.
1141
1146
  -- Labeling a stale-judge run produces an anchor the calibration ignores,
@@ -1189,14 +1194,14 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
1189
1194
  SELECT * FROM queue
1190
1195
  ORDER BY cohort_rank, (llm_annotated > 0) DESC, random()
1191
1196
  LIMIT ${i}
1192
- `),u=a.map(_=>_.id),l=u.length?await d.select().from(et).where(vh(la(et.evalTargetId,n),SC(et.evalRunId,u))):[],p=new Map(l.map(_=>[`${_.evalRunId}:${_.expectationIndex}`,_])),f={};for(let _ of a)f[_.configuration]=_.remaining_in_cohort;return e.json({remaining:a[0]?.remaining??0,remainingByCohort:f,runs:a.map(_=>({id:_.id,configuration:_.configuration,runNumber:_.run_number,iteration:_.iteration,createdAt:_.created_at,evalName:_.eval_name,prompt:_.prompt,output:_.output,outputTruncated:_.output_truncated,expectations:(_.expectations??[]).map((v,h)=>{let m=p.get(`${_.id}:${h}`);return{index:h,text:v.text??"",passed:v.passed??!1,evidence:v.evidence??"",method:v.method==="deterministic"?"deterministic":"llm",errored:v.errored===!0,annotation:m?{verdict:m.verdict,flag:m.flag}:null}})}))})});D();import{Hono as RC}from"hono";import{z as wn}from"zod";import{eq as Kn,and as yu,isNull as Ih,sql as pa,inArray as kC}from"drizzle-orm";var Ms=new RC,NC=wn.object({evalRunId:wn.string().uuid(),expectationIndex:wn.number().int().min(0),expectationText:wn.string(),judgePassed:wn.boolean(),humanPassed:wn.boolean(),reviewerPassed:wn.boolean()}),jC=wn.object({reviewerEngine:wn.enum(["claude","codex"]),reviewerModel:wn.string().min(1).max(200),verdicts:wn.array(NC).min(1).max(500)});Ms.put("/eval-targets/:id/judge-reviews",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await nt(n,t))return e.json({error:"Eval target not found"},404);let o=jC.parse(await e.req.json()),s=[...new Set(o.verdicts.map(u=>u.evalRunId))];if((await d.select({id:Ie.id}).from(Ie).where(yu(kC(Ie.id,s),Kn(Ie.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 u of o.verdicts)await d.insert(pe).values({userId:t,evalTargetId:n,evalRunId:u.evalRunId,expectationIndex:u.expectationIndex,expectationText:u.expectationText,judgePassed:u.judgePassed,humanPassed:u.humanPassed,reviewerEngine:o.reviewerEngine,reviewerModel:o.reviewerModel,reviewerPassed:u.reviewerPassed}).onConflictDoUpdate({target:[pe.evalRunId,pe.expectationIndex,pe.reviewerModel],set:{expectationText:u.expectationText,judgePassed:u.judgePassed,humanPassed:u.humanPassed,reviewerEngine:o.reviewerEngine,reviewerPassed:u.reviewerPassed,resolvedAt:pa`CASE WHEN ${pe.reviewerPassed} <> ${u.reviewerPassed} THEN NULL ELSE ${pe.resolvedAt} END`,resolution:pa`CASE WHEN ${pe.reviewerPassed} <> ${u.reviewerPassed} THEN NULL ELSE ${pe.resolution} END`,updatedAt:new Date}}),a+=1;if(o.verdicts.some(u=>u.reviewerPassed!==u.humanPassed))try{let[{count:u}]=await d.select({count:pa`count(*)::int`}).from(pe).where(yu(Kn(pe.evalTargetId,n),Ih(pe.resolvedAt),pa`${pe.reviewerPassed} <> ${pe.humanPassed}`));if(u>0){let[l]=await d.select({name:k.name}).from(k).where(Kn(k.id,n));await un({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 ${u} of your label${u===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:u,reviewerModel:o.reviewerModel}})}}catch(u){console.error("[judge-reviews] flag notification failed:",u instanceof Error?u.message:u)}return e.json({upserted:a})});Ms.get("/eval-targets/:id/judge-reviews",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await nt(n,t))return e.json({error:"Eval target not found"},404);let o=await d.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(Kn(pe.evalTargetId,n));return e.json(o)});Ms.get("/eval-targets/:id/judge-reviews/disagreements",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await nt(n,t))return e.json({error:"Eval target not found"},404);let o=await d.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:Ee.name,configuration:Ie.configuration,runNumber:Ie.runNumber,outputExcerpt:pa`LEFT(${Ie.outputs}->>'transcript', 1200)`}).from(pe).innerJoin(Ie,Kn(Ie.id,pe.evalRunId)).leftJoin(Ee,Kn(Ee.id,Ie.evalId)).where(yu(Kn(pe.evalTargetId,n),Ih(pe.resolvedAt),pa`${pe.reviewerPassed} <> ${pe.humanPassed}`)).orderBy(pe.evalRunId,pe.expectationIndex);return e.json(o)});var PC=wn.object({resolution:wn.enum(["kept","relabeled"])});Ms.patch("/judge-reviews/:id/resolve",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=wn.string().uuid().safeParse(n);if(!r.success)return e.json({error:"Invalid id"},400);let o=PC.parse(await e.req.json()),[s]=await d.select().from(pe).where(yu(Kn(pe.id,r.data),Kn(pe.userId,t)));if(!s)return e.json({error:"Not found"},404);let i=await d.update(pe).set({resolvedAt:new Date,resolution:o.resolution,updatedAt:new Date}).where(yu(Kn(pe.evalRunId,s.evalRunId),Kn(pe.expectationIndex,s.expectationIndex),Kn(pe.userId,t),Ih(pe.resolvedAt))).returning({id:pe.id});return e.json({resolved:i.length})});D();import{createHash as OC}from"node:crypto";import{Hono as CC}from"hono";import{z as oe}from"zod";import{eq as on,and as ma,desc as Eh,asc as LC,sql as Nr,isNull as MC}from"drizzle-orm";import{alias as U0}from"drizzle-orm/pg-core";function DC(e){if(e===null||typeof e!="object")return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}c(DC,"isPlainObject");function wp(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=wp(e[n]);t===null&&r!==e[n]&&(t=e.slice(0,n)),t!==null&&t.push(r)}return t??e}if(DC(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=wp(s);if(n===null&&(i!==o||a!==s)){n={};for(let u=0;u<r;u++)n[t[u][0]]=t[u][1]}n!==null&&(n[i]=a)}return n??e}return e}c(wp,"stripNullBytes");Zl();function $C(){return{enabled:process.env.RULEMETRIC_OFFLOAD_DELTAS==="1"||process.env.RULEMETRIC_OFFLOAD_DELTAS==="true",thresholdBytes:Number(process.env.OFFLOAD_GZIP_THRESHOLD_BYTES)||49152}}c($C,"offloadConfig");function H0(e){return OC("sha256").update(JSON.stringify(e)).digest("hex")}c(H0,"hashJson");function B0(e,t){return Array.isArray(e)?e:Array.isArray(t)?t:[]}c(B0,"arrayOr");function F0(e,t){return Nr`COALESCE(
1197
+ `),d=a.map(_=>_.id),l=d.length?await u.select().from(et).where(Rh(la(et.evalTargetId,n),DC(et.evalRunId,d))):[],m=new Map(l.map(_=>[`${_.evalRunId}:${_.expectationIndex}`,_])),p={};for(let _ of a)p[_.configuration]=_.remaining_in_cohort;return e.json({remaining:a[0]?.remaining??0,remainingByCohort:p,runs:a.map(_=>({id:_.id,configuration:_.configuration,runNumber:_.run_number,iteration:_.iteration,createdAt:_.created_at,evalName:_.eval_name,prompt:_.prompt,output:_.output,outputTruncated:_.output_truncated,expectations:(_.expectations??[]).map((w,f)=>{let h=m.get(`${_.id}:${f}`);return{index:f,text:w.text??"",passed:w.passed??!1,evidence:w.evidence??"",method:w.method==="deterministic"?"deterministic":"llm",errored:w.errored===!0,annotation:h?{verdict:h.verdict,flag:h.flag}:null}})}))})});O();import{Hono as LC}from"hono";import{z as wn}from"zod";import{eq as Gn,and as vd,isNull as Th,sql as ma,inArray as MC}from"drizzle-orm";var $s=new LC,$C=wn.object({evalRunId:wn.string().uuid(),expectationIndex:wn.number().int().min(0),expectationText:wn.string(),judgePassed:wn.boolean(),humanPassed:wn.boolean(),reviewerPassed:wn.boolean()}),qC=wn.object({reviewerEngine:wn.enum(["claude","codex"]),reviewerModel:wn.string().min(1).max(200),verdicts:wn.array($C).min(1).max(500)});$s.put("/eval-targets/:id/judge-reviews",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await nt(n,t))return e.json({error:"Eval target not found"},404);let o=qC.parse(await e.req.json()),s=[...new Set(o.verdicts.map(d=>d.evalRunId))];if((await u.select({id:Ie.id}).from(Ie).where(vd(MC(Ie.id,s),Gn(Ie.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 d of o.verdicts)await u.insert(me).values({userId:t,evalTargetId:n,evalRunId:d.evalRunId,expectationIndex:d.expectationIndex,expectationText:d.expectationText,judgePassed:d.judgePassed,humanPassed:d.humanPassed,reviewerEngine:o.reviewerEngine,reviewerModel:o.reviewerModel,reviewerPassed:d.reviewerPassed}).onConflictDoUpdate({target:[me.evalRunId,me.expectationIndex,me.reviewerModel],set:{expectationText:d.expectationText,judgePassed:d.judgePassed,humanPassed:d.humanPassed,reviewerEngine:o.reviewerEngine,reviewerPassed:d.reviewerPassed,resolvedAt:ma`CASE WHEN ${me.reviewerPassed} <> ${d.reviewerPassed} THEN NULL ELSE ${me.resolvedAt} END`,resolution:ma`CASE WHEN ${me.reviewerPassed} <> ${d.reviewerPassed} THEN NULL ELSE ${me.resolution} END`,updatedAt:new Date}}),a+=1;if(o.verdicts.some(d=>d.reviewerPassed!==d.humanPassed))try{let[{count:d}]=await u.select({count:ma`count(*)::int`}).from(me).where(vd(Gn(me.evalTargetId,n),Th(me.resolvedAt),ma`${me.reviewerPassed} <> ${me.humanPassed}`));if(d>0){let[l]=await u.select({name:k.name}).from(k).where(Gn(k.id,n));await un({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 ${d} of your label${d===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:d,reviewerModel:o.reviewerModel}})}}catch(d){console.error("[judge-reviews] flag notification failed:",d instanceof Error?d.message:d)}return e.json({upserted:a})});$s.get("/eval-targets/:id/judge-reviews",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await nt(n,t))return e.json({error:"Eval target not found"},404);let o=await u.select({evalRunId:me.evalRunId,expectationIndex:me.expectationIndex,reviewerEngine:me.reviewerEngine,reviewerModel:me.reviewerModel,reviewerPassed:me.reviewerPassed,humanPassed:me.humanPassed,resolvedAt:me.resolvedAt}).from(me).where(Gn(me.evalTargetId,n));return e.json(o)});$s.get("/eval-targets/:id/judge-reviews/disagreements",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await nt(n,t))return e.json({error:"Eval target not found"},404);let o=await u.select({id:me.id,evalRunId:me.evalRunId,expectationIndex:me.expectationIndex,expectationText:me.expectationText,judgePassed:me.judgePassed,humanPassed:me.humanPassed,reviewerEngine:me.reviewerEngine,reviewerModel:me.reviewerModel,reviewerPassed:me.reviewerPassed,evalName:Ee.name,configuration:Ie.configuration,runNumber:Ie.runNumber,outputExcerpt:ma`LEFT(${Ie.outputs}->>'transcript', 1200)`}).from(me).innerJoin(Ie,Gn(Ie.id,me.evalRunId)).leftJoin(Ee,Gn(Ee.id,Ie.evalId)).where(vd(Gn(me.evalTargetId,n),Th(me.resolvedAt),ma`${me.reviewerPassed} <> ${me.humanPassed}`)).orderBy(me.evalRunId,me.expectationIndex);return e.json(o)});var UC=wn.object({resolution:wn.enum(["kept","relabeled"])});$s.patch("/judge-reviews/:id/resolve",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=wn.string().uuid().safeParse(n);if(!r.success)return e.json({error:"Invalid id"},400);let o=UC.parse(await e.req.json()),[s]=await u.select().from(me).where(vd(Gn(me.id,r.data),Gn(me.userId,t)));if(!s)return e.json({error:"Not found"},404);let i=await u.update(me).set({resolvedAt:new Date,resolution:o.resolution,updatedAt:new Date}).where(vd(Gn(me.evalRunId,s.evalRunId),Gn(me.expectationIndex,s.expectationIndex),Gn(me.userId,t),Th(me.resolvedAt))).returning({id:me.id});return e.json({resolved:i.length})});O();import{createHash as BC}from"node:crypto";import{Hono as FC}from"hono";import{z as oe}from"zod";import{eq as sn,and as pa,desc as Nh,asc as WC,sql as jr,isNull as zC}from"drizzle-orm";import{alias as G0}from"drizzle-orm/pg-core";function HC(e){if(e===null||typeof e!="object")return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}c(HC,"isPlainObject");function Sm(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=Sm(e[n]);t===null&&r!==e[n]&&(t=e.slice(0,n)),t!==null&&t.push(r)}return t??e}if(HC(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=Sm(s);if(n===null&&(i!==o||a!==s)){n={};for(let d=0;d<r;d++)n[t[d][0]]=t[d][1]}n!==null&&(n[i]=a)}return n??e}return e}c(Sm,"stripNullBytes");sm();function VC(){return{enabled:process.env.RULEMETRIC_OFFLOAD_DELTAS==="1"||process.env.RULEMETRIC_OFFLOAD_DELTAS==="true",thresholdBytes:Number(process.env.OFFLOAD_GZIP_THRESHOLD_BYTES)||49152}}c(VC,"offloadConfig");function Y0(e){return BC("sha256").update(JSON.stringify(e)).digest("hex")}c(Y0,"hashJson");function X0(e,t){return Array.isArray(e)?e:Array.isArray(t)?t:[]}c(X0,"arrayOr");function Q0(e,t){return jr`COALESCE(
1193
1198
  CASE WHEN jsonb_typeof(${e}) = 'array' THEN ${e} END,
1194
1199
  CASE WHEN jsonb_typeof(${t}) = 'array' THEN ${t} END,
1195
1200
  '[]'::jsonb
1196
- )`}c(F0,"resolvedJsonArray");async function qC(e){let{enabled:t,thresholdBytes:n}=$C();if(!t||e.length===0)return{messagesDelta:e,messagesDeltaRef:null};let r=nh(e);if(r.bytes<=n)return{messagesDelta:e,messagesDeltaRef:null};try{let{ref:o}=await rh(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}}}c(qC,"resolveDeltaStorage");async function bh(e,t,n){let r=JSON.stringify(n);await d.insert(Rn).values({hash:e,contentType:t,content:n,sizeBytes:Buffer.byteLength(r,"utf-8")}).onConflictDoNothing()}c(bh,"upsertBlob");var fa=new CC,UC=oe.object({provider:oe.string(),model:oe.string(),system_prompt:oe.string(),system_blocks:oe.array(oe.unknown()).default([]),injected_instructions:oe.union([oe.array(oe.string()),oe.string()]).default([]),messages:oe.array(oe.unknown()).optional(),messages_raw:oe.array(oe.unknown()).optional(),messages_summary:oe.unknown().optional(),tools:oe.array(oe.unknown()).default([]),system_hash:oe.string(),request_hash:oe.string().optional(),sequence:oe.number().int().optional(),max_tokens:oe.number().nullable().optional(),temperature:oe.number().nullable().optional(),top_p:oe.number().nullable().optional(),top_k:oe.number().nullable().optional(),stop_sequences:oe.array(oe.string()).optional(),stream:oe.boolean().optional(),tool_choice:oe.unknown().optional(),thinking:oe.unknown().optional(),api_metadata:oe.unknown().optional(),request_headers:oe.record(oe.string()).optional(),response_headers:oe.record(oe.string()).optional(),response_status:oe.number().optional(),beta_features:oe.array(oe.string()).optional(),usage:oe.object({input_tokens:oe.number().nullable().optional(),output_tokens:oe.number().nullable().optional(),cache_creation_input_tokens:oe.number().nullable().optional(),cache_read_input_tokens:oe.number().nullable().optional(),total_tokens:oe.number().nullable().optional()}).optional(),response:oe.record(oe.unknown()).optional(),estimated_tokens:oe.number().nullable().optional(),captured_at:oe.string().optional(),metadata:oe.record(oe.unknown()).optional(),context_items:oe.array(oe.object({type:oe.string(),name:oe.string(),content_hash:oe.string().optional(),char_count:oe.number().optional(),estimated_tokens:oe.number().optional(),triggered_by:oe.string().optional(),message_index:oe.number().optional(),preview:oe.string().optional(),skill_names:oe.array(oe.string()).optional(),tool_names:oe.array(oe.string()).optional()}).passthrough()).optional()}),HC=100,BC=500;async function W0(e,t){let[n]=await d.select({id:M.id,sequence:M.sequence}).from(M).where(ma(on(M.sessionId,e),on(M.requestHash,t))).limit(1);return n??null}c(W0,"findSnapshotByHash");fa.post("/sessions/:id/context-snapshots",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=wp(UC.parse(r)),[s]=await d.select({id:y.id,projectPath:y.projectPath,projectId:y.projectId}).from(y).where(ma(on(y.id,n),on(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(m=>m.type==="claude_md"&&typeof m.name=="string"&&m.name.startsWith("/")&&m.name.endsWith("/CLAUDE.md"));if(h){let m=h.name.slice(0,-10),w=null;if(!s.projectId){let[I]=await d.select({projectId:ye.projectId}).from(ye).where(on(ye.path,m)).limit(1);w=I?.projectId??null}await d.update(y).set({projectPath:m,...w?{projectId:w}:{}}).where(ma(on(y.id,n),MC(y.projectPath)))}}let i=o.messages??o.messages_summary??[],a=o.messages_raw??[],u=o.request_hash??"",l=Array.isArray(o.injected_instructions)?o.injected_instructions:[o.injected_instructions];if(u){let h=await W0(n,u);if(h)return e.json({id:h.id,sequence:h.sequence,deduplicated:!0})}let p=H0(o.tools),f=H0(l);await Promise.all([bh(o.system_hash,"system_prompt",o.system_prompt),bh(p,"tools",o.tools),bh(f,"injected_instructions",l)]);let _={sessionId:n,userId:t,provider:o.provider,model:o.model,systemPrompt:"",injectedInstructions:[],messagesSummary:i,tools:[],systemHash:o.system_hash,toolsHash:p,injectedHash:f,requestHash:u,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[m]=await d.select({sequence:M.sequence,messagesSummary:M.messagesSummary}).from(M).where(on(M.sessionId,n)).orderBy(Eh(M.sequence)).limit(1),w=(m?.sequence??-1)+1,I=Array.isArray(m?.messagesSummary)?m.messagesSummary:[],b=a,A=0,E=Math.min(I.length,b.length);for(;A<E&&JSON.stringify(I[A])===JSON.stringify(b[A]);)A++;let S=b.slice(A),R=await qC(S);try{let[O]=await d.insert(M).values({..._,sequence:w,...R}).returning({id:M.id,sequence:M.sequence});return e.json({id:O.id,sequence:O.sequence},201)}catch(O){let W=O.cause,N=W?.constraint_name??"",q=`${O instanceof Error?O.message:""} ${W?.message??""}`.toLowerCase();if(W?.code==="23505"){if((N==="idx_snapshots_session_request"||q.includes("request"))&&u){let U=await W0(n,u);if(U)return e.json({id:U.id,sequence:U.sequence,deduplicated:!0})}if(h<v)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 O}}return e.json({error:"snapshot sequence assignment failed after retries"},503)});fa.get("/sessions/:id/context-snapshots",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=Number(e.req.query("limit")||HC),o=Math.min(Math.max(1,r),BC),s=Math.max(0,Number(e.req.query("offset")||0)),[i]=await d.select({id:y.id}).from(y).where(ma(on(y.id,n),on(y.userId,t)));if(!i)return e.json({error:"Session not found"},404);if(!(e.req.query("full")==="true")){let l=U0(Rn,"cb_tools"),p=U0(Rn,"cb_injected"),_=(await d.select({id:M.id,sessionId:M.sessionId,userId:M.userId,sequence:M.sequence,provider:M.provider,model:M.model,systemHash:M.systemHash,requestHash:M.requestHash,maxTokens:M.maxTokens,temperature:M.temperature,estimatedTokens:M.estimatedTokens,capturedAt:M.capturedAt,injectedCount:Nr`jsonb_array_length(${F0(p.content,M.injectedInstructions)})`,toolsLight:Nr`COALESCE((
1201
+ )`}c(Q0,"resolvedJsonArray");async function JC(e){let{enabled:t,thresholdBytes:n}=VC();if(!t||e.length===0)return{messagesDelta:e,messagesDeltaRef:null};let r=dh(e);if(r.bytes<=n)return{messagesDelta:e,messagesDeltaRef:null};try{let{ref:o}=await uh(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}}}c(JC,"resolveDeltaStorage");async function kh(e,t,n){let r=JSON.stringify(n);await u.insert(Tn).values({hash:e,contentType:t,content:n,sizeBytes:Buffer.byteLength(r,"utf-8")}).onConflictDoNothing()}c(kh,"upsertBlob");var fa=new FC,KC=oe.object({provider:oe.string(),model:oe.string(),system_prompt:oe.string(),system_blocks:oe.array(oe.unknown()).default([]),injected_instructions:oe.union([oe.array(oe.string()),oe.string()]).default([]),messages:oe.array(oe.unknown()).optional(),messages_raw:oe.array(oe.unknown()).optional(),messages_summary:oe.unknown().optional(),tools:oe.array(oe.unknown()).default([]),system_hash:oe.string(),request_hash:oe.string().optional(),sequence:oe.number().int().optional(),max_tokens:oe.number().nullable().optional(),temperature:oe.number().nullable().optional(),top_p:oe.number().nullable().optional(),top_k:oe.number().nullable().optional(),stop_sequences:oe.array(oe.string()).optional(),stream:oe.boolean().optional(),tool_choice:oe.unknown().optional(),thinking:oe.unknown().optional(),api_metadata:oe.unknown().optional(),request_headers:oe.record(oe.string()).optional(),response_headers:oe.record(oe.string()).optional(),response_status:oe.number().optional(),beta_features:oe.array(oe.string()).optional(),usage:oe.object({input_tokens:oe.number().nullable().optional(),output_tokens:oe.number().nullable().optional(),cache_creation_input_tokens:oe.number().nullable().optional(),cache_read_input_tokens:oe.number().nullable().optional(),total_tokens:oe.number().nullable().optional()}).optional(),response:oe.record(oe.unknown()).optional(),estimated_tokens:oe.number().nullable().optional(),captured_at:oe.string().optional(),metadata:oe.record(oe.unknown()).optional(),context_items:oe.array(oe.object({type:oe.string(),name:oe.string(),content_hash:oe.string().optional(),char_count:oe.number().optional(),estimated_tokens:oe.number().optional(),triggered_by:oe.string().optional(),message_index:oe.number().optional(),preview:oe.string().optional(),skill_names:oe.array(oe.string()).optional(),tool_names:oe.array(oe.string()).optional()}).passthrough()).optional()}),GC=100,YC=500;async function Z0(e,t){let[n]=await u.select({id:M.id,sequence:M.sequence}).from(M).where(pa(sn(M.sessionId,e),sn(M.requestHash,t))).limit(1);return n??null}c(Z0,"findSnapshotByHash");fa.post("/sessions/:id/context-snapshots",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=Sm(KC.parse(r)),[s]=await u.select({id:y.id,projectPath:y.projectPath,projectId:y.projectId}).from(y).where(pa(sn(y.id,n),sn(y.userId,t)));if(!s)return e.json({error:"Session not found"},404);if(!s.projectPath&&o.context_items?.length){let f=o.context_items.find(h=>h.type==="claude_md"&&typeof h.name=="string"&&h.name.startsWith("/")&&h.name.endsWith("/CLAUDE.md"));if(f){let h=f.name.slice(0,-10),v=null;if(!s.projectId){let[I]=await u.select({projectId:ye.projectId}).from(ye).where(sn(ye.path,h)).limit(1);v=I?.projectId??null}await u.update(y).set({projectPath:h,...v?{projectId:v}:{}}).where(pa(sn(y.id,n),zC(y.projectPath)))}}let i=o.messages??o.messages_summary??[],a=o.messages_raw??[],d=o.request_hash??"",l=Array.isArray(o.injected_instructions)?o.injected_instructions:[o.injected_instructions];if(d){let f=await Z0(n,d);if(f)return e.json({id:f.id,sequence:f.sequence,deduplicated:!0})}let m=Y0(o.tools),p=Y0(l);await Promise.all([kh(o.system_hash,"system_prompt",o.system_prompt),kh(m,"tools",o.tools),kh(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:d,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}}},w=5;for(let f=0;f<=w;f++){let[h]=await u.select({sequence:M.sequence,messagesSummary:M.messagesSummary}).from(M).where(sn(M.sessionId,n)).orderBy(Nh(M.sequence)).limit(1),v=(h?.sequence??-1)+1,I=Array.isArray(h?.messagesSummary)?h.messagesSummary:[],E=a,A=0,b=Math.min(I.length,E.length);for(;A<b&&JSON.stringify(I[A])===JSON.stringify(E[A]);)A++;let S=E.slice(A),T=await JC(S);try{let[P]=await u.insert(M).values({..._,sequence:v,...T}).returning({id:M.id,sequence:M.sequence});return e.json({id:P.id,sequence:P.sequence},201)}catch(P){let H=P.cause,N=H?.constraint_name??"",U=`${P instanceof Error?P.message:""} ${H?.message??""}`.toLowerCase();if(H?.code==="23505"){if((N==="idx_snapshots_session_request"||U.includes("request"))&&d){let q=await Z0(n,d);if(q)return e.json({id:q.id,sequence:q.sequence,deduplicated:!0})}if(f<w)continue;return e.json({error:"snapshot sequence assignment failed after retries"},503)}if(U.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)});fa.get("/sessions/:id/context-snapshots",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=Number(e.req.query("limit")||GC),o=Math.min(Math.max(1,r),YC),s=Math.max(0,Number(e.req.query("offset")||0)),[i]=await u.select({id:y.id}).from(y).where(pa(sn(y.id,n),sn(y.userId,t)));if(!i)return e.json({error:"Session not found"},404);if(!(e.req.query("full")==="true")){let l=G0(Tn,"cb_tools"),m=G0(Tn,"cb_injected"),_=(await u.select({id:M.id,sessionId:M.sessionId,userId:M.userId,sequence:M.sequence,provider:M.provider,model:M.model,systemHash:M.systemHash,requestHash:M.requestHash,maxTokens:M.maxTokens,temperature:M.temperature,estimatedTokens:M.estimatedTokens,capturedAt:M.capturedAt,injectedCount:jr`jsonb_array_length(${Q0(m.content,M.injectedInstructions)})`,toolsLight:jr`COALESCE((
1197
1202
  SELECT jsonb_agg(jsonb_build_object('name', t->'name', 'description', left(COALESCE(t->>'description', ''), 80)))
1198
- FROM jsonb_array_elements(${F0(l.content,M.tools)}) AS t
1199
- ), '[]'::jsonb)`,metadataLight:Nr`jsonb_strip_nulls(jsonb_build_object(
1203
+ FROM jsonb_array_elements(${Q0(l.content,M.tools)}) AS t
1204
+ ), '[]'::jsonb)`,metadataLight:jr`jsonb_strip_nulls(jsonb_build_object(
1200
1205
  'usage', ${M.metadata}->'usage',
1201
1206
  'response', ${M.metadata}->'response',
1202
1207
  'thinking', ${M.metadata}->'thinking',
@@ -1211,18 +1216,18 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
1211
1216
  )
1212
1217
  ELSE NULL
1213
1218
  END
1214
- ))`}).from(M).leftJoin(l,on(l.hash,M.toolsHash)).leftJoin(p,on(p.hash,M.injectedHash)).where(on(M.sessionId,n)).orderBy(Eh(M.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(_)}let u=await Fe.select().from(M).where(on(M.sessionId,n)).orderBy(Eh(M.capturedAt)).limit(o).offset(s);return e.json(await Gb(await oh(u)))});fa.get("/context-snapshots/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await Fe.select().from(M).where(ma(on(M.id,n),on(M.userId,t)));if(!r)return e.json({error:"Snapshot not found"},404);let o=r.messagesDeltaRef?await su(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(Rn).where(Nr`${Rn.hash} IN (${Nr.join(s.map(p=>Nr`${p}`),Nr`, `)})`):[],a=new Map(i.map(p=>[p.hash,p.content])),u=[],l=!1;if(o){let{messages:p,truncated:f}=await Yl({fetchPage:c(async(_,v)=>iu(await Fe.select({sequence:M.sequence,messagesDelta:M.messagesDelta,messagesDeltaRef:M.messagesDeltaRef}).from(M).where(ma(on(M.sessionId,r.sessionId),Nr`${M.sequence} <= ${r.sequence}`,Nr`${M.sequence} > ${_}`)).orderBy(LC(M.sequence)).limit(v)),"fetchPage")});u=p,l=f}return e.json({...r,systemPrompt:a.get(r.systemHash)??r.systemPrompt??"",tools:B0(a.get(r.toolsHash??""),r.tools),injectedInstructions:B0(a.get(r.injectedHash??""),r.injectedInstructions),messagesDelta:o,messagesRaw:u,messagesTruncated:l})});D();import{Hono as FC}from"hono";import{z as Co}from"zod";import{eq as pr,and as wu,desc as WC,ne as zC}from"drizzle-orm";import{z as jr}from"zod";var vp=jr.object({parallel:jr.number().int().positive().default(1),runsPerEval:jr.number().int().positive().default(1),iteration:jr.number().int().positive().default(1),skipBaseline:jr.boolean().default(!1),skipGrading:jr.boolean().default(!1),generateIfEmpty:jr.boolean().default(!1),model:jr.string().optional(),graderModel:jr.string().optional(),timeout:jr.number().int().positive().default(12e4)}).default({});var Lo=new FC,VC=Co.object({evalTargetId:Co.string().uuid(),config:vp});Lo.post("/eval-jobs",async e=>{let t=e.get("userId"),n=await e.req.json(),r=VC.parse(n),{id:o,noLiveWorker:s}=await Ot({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(je).where(pr(je.id,o));return e.json({...i,noLiveWorker:s},201)});Lo.get("/eval-targets/:id/jobs",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await d.select().from(je).where(wu(pr(je.evalTargetId,n),pr(je.userId,t))).orderBy(WC(je.createdAt));return e.json(r)});Lo.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(je).set({status:s,progress:r.progress,updatedAt:new Date}).where(wu(pr(je.id,n),pr(je.userId,t))).returning();return i?e.json(i):e.json({error:"Job not found"},404)});var JC=Co.object({status:Co.enum(["running","completed","failed"]).optional(),attempts:Co.number().int().nonnegative().optional(),error:Co.string().optional(),result:Co.record(Co.unknown()).optional()});Lo.patch("/eval-jobs/:id/state",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=JC.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(je).set(o).where(wu(pr(je.id,n),pr(je.userId,t),zC(je.status,"cancelled"))).returning();if(!s){let[i]=await d.select().from(je).where(wu(pr(je.id,n),pr(je.userId,t)));return i?e.json(i):e.json({error:"Job not found"},404)}return e.json(s)});Lo.post("/eval-jobs/:id/cancel",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.update(je).set({status:"cancelled",updatedAt:new Date}).where(wu(pr(je.id,n),pr(je.userId,t))).returning();return r?e.json(r):e.json({error:"Job not found"},404)});D();import{Hono as KC}from"hono";import{z as $s}from"zod";import{eq as ga,and as Ah,isNull as GC,desc as YC,sql as z0}from"drizzle-orm";var Ip=new KC,XC=$s.object({contentHash:$s.string().min(1).optional(),evalTargetId:$s.string().uuid().optional(),name:$s.string().min(1).max(255),type:$s.enum(["instruction","skill","prompt","plan"]).default("instruction"),content:$s.string().optional(),sessionId:$s.string().uuid().optional(),config:vp});async function QC(e){let t=await d.select({systemPrompt:M.systemPrompt,systemHash:M.systemHash,metadata:M.metadata}).from(M).where(z0`${M.metadata}->'contextItems' @> ${JSON.stringify([{content_hash:e}])}::jsonb`).orderBy(YC(M.capturedAt)).limit(1);if(t.length===0)return null;let n=t[0],r=await ep(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,"\\$&"),u=new RegExp(`Contents of [^\\n]*${a}[^\\n]*\\n([\\s\\S]*?)(?=Contents of |$)`,"i"),l=r.match(u);return l?l[1].trim():r}c(QC,"resolveContentFromSnapshot");Ip.post("/eval-from-context",async e=>{let t=e.get("userId"),n=await e.req.json(),r=XC.parse(n),o=!1,s;if(r.evalTargetId){let[_]=await d.select({id:k.id}).from(k).where(Ah(ga(k.id,r.evalTargetId),ga(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(Ah(ga(k.userId,t),z0`${k.metadata}->>'content_hash' = ${r.contentHash}`)).limit(1);if(_)s=_.id;else{let v=r.content;if(v||(v=await QC(r.contentHash)??void 0),!v)return e.json({error:"Content not provided and could not be resolved from snapshots"},400);let h=null;if(r.sessionId){let[w]=await d.select({projectPath:y.projectPath}).from(y).where(ga(y.id,r.sessionId)).limit(1);h=w?.projectPath?.replace(/\/$/,"")??null}let[m]=await d.insert(k).values({userId:t,name:r.name,type:r.type,content:v,description:`Auto-created from session context item: ${r.name}`,projectPath:h,metadata:{content_hash:r.contentHash,source_session_id:r.sessionId}}).returning();s=m.id,o=!0}}else return e.json({error:"Provide contentHash or evalTargetId"},400);let a=(await d.select({id:Ee.id}).from(Ee).where(Ah(ga(Ee.evalTargetId,s),GC(Ee.retiredAt))).limit(1)).length===0,u=a?{...r.config,generateIfEmpty:!0}:r.config,{id:l,noLiveWorker:p}=await Ot({taskName:"process_eval",payload:{evalTargetId:s,config:u},userId:t,mirror:{userId:t,evalTargetId:s,config:u}}),[f]=await d.select().from(je).where(ga(je.id,l));return e.json({evalTargetId:s,evalJobId:f.id,evalCasesCreated:0,generationDeferred:a,isNewTarget:o,noLiveWorker:p},201)});import{Hono as rM}from"hono";D();import{Hono as ZC}from"hono";import{and as V0,eq as Sh,sql as vn}from"drizzle-orm";var xh=new ZC;xh.get("/insights/projects",async e=>{let t=e.get("userId"),n=await d.select({projectId:y.projectId,name:C.name,gitRemoteUrl:C.gitRemoteUrl,sessionCount:vn`COUNT(*)`,enrichedCount:vn`COUNT(CASE WHEN ${y.metadata}->'local_session_meta' IS NOT NULL THEN 1 END)`,analyzedCount:vn`COUNT(CASE WHEN ${y.analysis} IS NOT NULL THEN 1 END)`,firstSession:vn`MIN(${y.startedAt})`,lastSession:vn`MAX(${y.startedAt})`}).from(y).innerJoin(C,Sh(C.id,y.projectId)).where(V0(Sh(y.userId,t),vn`${y.projectId} IS NOT NULL`)).groupBy(y.projectId,C.name,C.gitRemoteUrl),r=await d.execute(vn`
1219
+ ))`}).from(M).leftJoin(l,sn(l.hash,M.toolsHash)).leftJoin(m,sn(m.hash,M.injectedHash)).where(sn(M.sessionId,n)).orderBy(Nh(M.capturedAt)).limit(o).offset(s)).map(w=>({id:w.id,sessionId:w.sessionId,userId:w.userId,sequence:w.sequence,provider:w.provider,model:w.model,systemHash:w.systemHash,requestHash:w.requestHash,maxTokens:w.maxTokens,temperature:w.temperature,estimatedTokens:w.estimatedTokens,capturedAt:w.capturedAt,metadata:w.metadataLight??{},systemPrompt:"",messagesSummary:[],tools:w.toolsLight??[],injectedInstructions:new Array(Number(w.injectedCount??0)).fill("[omitted]")}));return e.json(_)}let d=await Fe.select().from(M).where(sn(M.sessionId,n)).orderBy(Nh(M.capturedAt)).limit(o).offset(s);return e.json(await o0(await lh(d)))});fa.get("/context-snapshots/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await Fe.select().from(M).where(pa(sn(M.id,n),sn(M.userId,t)));if(!r)return e.json({error:"Snapshot not found"},404);let o=r.messagesDeltaRef?await ad(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(Tn).where(jr`${Tn.hash} IN (${jr.join(s.map(m=>jr`${m}`),jr`, `)})`):[],a=new Map(i.map(m=>[m.hash,m.content])),d=[],l=!1;if(o){let{messages:m,truncated:p}=await nm({fetchPage:c(async(_,w)=>cd(await Fe.select({sequence:M.sequence,messagesDelta:M.messagesDelta,messagesDeltaRef:M.messagesDeltaRef}).from(M).where(pa(sn(M.sessionId,r.sessionId),jr`${M.sequence} <= ${r.sequence}`,jr`${M.sequence} > ${_}`)).orderBy(WC(M.sequence)).limit(w)),"fetchPage")});d=m,l=p}return e.json({...r,systemPrompt:a.get(r.systemHash)??r.systemPrompt??"",tools:X0(a.get(r.toolsHash??""),r.tools),injectedInstructions:X0(a.get(r.injectedHash??""),r.injectedInstructions),messagesDelta:o,messagesRaw:d,messagesTruncated:l})});O();import{Hono as XC}from"hono";import{z as Mo}from"zod";import{eq as lr,and as Id,desc as QC,ne as ZC}from"drizzle-orm";import{z as Pr}from"zod";var xm=Pr.object({parallel:Pr.number().int().positive().default(1),runsPerEval:Pr.number().int().positive().default(1),iteration:Pr.number().int().positive().default(1),skipBaseline:Pr.boolean().default(!1),skipGrading:Pr.boolean().default(!1),generateIfEmpty:Pr.boolean().default(!1),model:Pr.string().optional(),graderModel:Pr.string().optional(),timeout:Pr.number().int().positive().default(12e4)}).default({});var $o=new XC,eL=Mo.object({evalTargetId:Mo.string().uuid(),config:xm});$o.post("/eval-jobs",async e=>{let t=e.get("userId"),n=await e.req.json(),r=eL.parse(n),{id:o,noLiveWorker:s}=await Ct({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(je).where(lr(je.id,o));return e.json({...i,noLiveWorker:s},201)});$o.get("/eval-targets/:id/jobs",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await u.select().from(je).where(Id(lr(je.evalTargetId,n),lr(je.userId,t))).orderBy(QC(je.createdAt));return e.json(r)});$o.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(je).set({status:s,progress:r.progress,updatedAt:new Date}).where(Id(lr(je.id,n),lr(je.userId,t))).returning();return i?e.json(i):e.json({error:"Job not found"},404)});var tL=Mo.object({status:Mo.enum(["running","completed","failed"]).optional(),attempts:Mo.number().int().nonnegative().optional(),error:Mo.string().optional(),result:Mo.record(Mo.unknown()).optional()});$o.patch("/eval-jobs/:id/state",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=tL.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(je).set(o).where(Id(lr(je.id,n),lr(je.userId,t),ZC(je.status,"cancelled"))).returning();if(!s){let[i]=await u.select().from(je).where(Id(lr(je.id,n),lr(je.userId,t)));return i?e.json(i):e.json({error:"Job not found"},404)}return e.json(s)});$o.post("/eval-jobs/:id/cancel",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.update(je).set({status:"cancelled",updatedAt:new Date}).where(Id(lr(je.id,n),lr(je.userId,t))).returning();return r?e.json(r):e.json({error:"Job not found"},404)});O();import{Hono as nL}from"hono";import{z as qs}from"zod";import{eq as ga,and as jh,isNull as rL,desc as oL,sql as eE}from"drizzle-orm";var Rm=new nL,sL=qs.object({contentHash:qs.string().min(1).optional(),evalTargetId:qs.string().uuid().optional(),name:qs.string().min(1).max(255),type:qs.enum(["instruction","skill","prompt","plan"]).default("instruction"),content:qs.string().optional(),sessionId:qs.string().uuid().optional(),config:xm});async function iL(e){let t=await u.select({systemPrompt:M.systemPrompt,systemHash:M.systemHash,metadata:M.metadata}).from(M).where(eE`${M.metadata}->'contextItems' @> ${JSON.stringify([{content_hash:e}])}::jsonb`).orderBy(oL(M.capturedAt)).limit(1);if(t.length===0)return null;let n=t[0],r=await im(n.systemHash,n.systemPrompt),i=(n.metadata?.contextItems??[]).find(m=>m.content_hash===e);if(!i?.name)return r;let a=i.name.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),d=new RegExp(`Contents of [^\\n]*${a}[^\\n]*\\n([\\s\\S]*?)(?=Contents of |$)`,"i"),l=r.match(d);return l?l[1].trim():r}c(iL,"resolveContentFromSnapshot");Rm.post("/eval-from-context",async e=>{let t=e.get("userId"),n=await e.req.json(),r=sL.parse(n),o=!1,s;if(r.evalTargetId){let[_]=await u.select({id:k.id}).from(k).where(jh(ga(k.id,r.evalTargetId),ga(k.userId,t))).limit(1);if(!_)return e.json({error:"Eval target not found"},404);s=_.id}else if(r.contentHash){let[_]=await u.select({id:k.id}).from(k).where(jh(ga(k.userId,t),eE`${k.metadata}->>'content_hash' = ${r.contentHash}`)).limit(1);if(_)s=_.id;else{let w=r.content;if(w||(w=await iL(r.contentHash)??void 0),!w)return e.json({error:"Content not provided and could not be resolved from snapshots"},400);let f=null;if(r.sessionId){let[v]=await u.select({projectPath:y.projectPath}).from(y).where(ga(y.id,r.sessionId)).limit(1);f=v?.projectPath?.replace(/\/$/,"")??null}let[h]=await u.insert(k).values({userId:t,name:r.name,type:r.type,content:w,description:`Auto-created from session context item: ${r.name}`,projectPath:f,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:Ee.id}).from(Ee).where(jh(ga(Ee.evalTargetId,s),rL(Ee.retiredAt))).limit(1)).length===0,d=a?{...r.config,generateIfEmpty:!0}:r.config,{id:l,noLiveWorker:m}=await Ct({taskName:"process_eval",payload:{evalTargetId:s,config:d},userId:t,mirror:{userId:t,evalTargetId:s,config:d}}),[p]=await u.select().from(je).where(ga(je.id,l));return e.json({evalTargetId:s,evalJobId:p.id,evalCasesCreated:0,generationDeferred:a,isNewTarget:o,noLiveWorker:m},201)});import{Hono as mM}from"hono";O();import{Hono as aL}from"hono";import{and as tE,eq as Ph,sql as vn}from"drizzle-orm";var Dh=new aL;Dh.get("/insights/projects",async e=>{let t=e.get("userId"),n=await u.select({projectId:y.projectId,name:C.name,gitRemoteUrl:C.gitRemoteUrl,sessionCount:vn`COUNT(*)`,enrichedCount:vn`COUNT(CASE WHEN ${y.metadata}->'local_session_meta' IS NOT NULL THEN 1 END)`,analyzedCount:vn`COUNT(CASE WHEN ${y.analysis} IS NOT NULL THEN 1 END)`,firstSession:vn`MIN(${y.startedAt})`,lastSession:vn`MAX(${y.startedAt})`}).from(y).innerJoin(C,Ph(C.id,y.projectId)).where(tE(Ph(y.userId,t),vn`${y.projectId} IS NOT NULL`)).groupBy(y.projectId,C.name,C.gitRemoteUrl),r=await u.execute(vn`
1215
1220
  select project_id, project_path, count(*)::int as n
1216
1221
  from sessions
1217
1222
  where user_id = ${t}
1218
1223
  and project_id is not null
1219
1224
  and project_path is not null
1220
1225
  group by project_id, project_path
1221
- `),o=new Map,s=new Map;for(let p of r){let f=s.get(p.project_id)??-1;p.n>f&&(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})),u=(await d.select({projectPath:y.projectPath,sessionCount:vn`COUNT(*)`,enrichedCount:vn`COUNT(CASE WHEN ${y.metadata}->'local_session_meta' IS NOT NULL THEN 1 END)`,analyzedCount:vn`COUNT(CASE WHEN ${y.analysis} IS NOT NULL THEN 1 END)`,firstSession:vn`MIN(${y.startedAt})`,lastSession:vn`MAX(${y.startedAt})`}).from(y).where(V0(Sh(y.userId,t),vn`${y.projectId} IS NULL`,vn`${y.projectPath} IS NOT NULL`)).groupBy(y.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,...u].sort((p,f)=>f.sessionCount-p.sessionCount);return e.json(l)});D();import yL from"node:fs";import wL from"node:path";import{Hono as vL}from"hono";import{and as Ph,desc as Dh,eq as qo,gte as IL,ilike as tE,lte as bL,sql as ha}from"drizzle-orm";D();import{createHash as eL}from"node:crypto";import{and as tL,eq as J0,inArray as nL,sql as Mo}from"drizzle-orm";var rL=90,oL=.5,K0=[{category:"claude_md_additions",get:c(e=>e.suggestions?.claude_md_additions,"get"),label:c(e=>String(e.addition??"").slice(0,120),"label")},{category:"features_to_try",get:c(e=>e.suggestions?.features_to_try,"get"),label:c(e=>String(e.feature??"").slice(0,120),"label")},{category:"usage_patterns",get:c(e=>e.suggestions?.usage_patterns,"get"),label:c(e=>String(e.title??"").slice(0,120),"label")},{category:"friction_categories",get:c(e=>e.friction_analysis?.categories,"get"),label:c(e=>String(e.category??"").slice(0,120),"label")},{category:"opportunities",get:c(e=>e.on_the_horizon?.opportunities,"get"),label:c(e=>String(e.title??"").slice(0,120),"label")},{category:"impressive_workflows",get:c(e=>e.what_works?.impressive_workflows,"get"),label:c(e=>String(e.title??"").slice(0,120),"label")},{category:"project_areas",get:c(e=>e.project_areas,"get"),label:c(e=>String(e.name??"").slice(0,120),"label")}];function G0(e,t){let n=Object.keys(t).filter(o=>o!=="id"&&o!=="timesGenerated").sort(),r=JSON.stringify(n.map(o=>[o,t[o]]));return eL("sha256").update(`${e}
1222
- ${r}`).digest("hex")}c(G0,"recommendationEntryHash");var sL=new Set(["42883","42P01","42704"]),iL=2,bp=!1;function aL(e){let t=e?.code;return typeof t=="string"&&sL.has(t)?"capability-absent":Sc(e)||Ac(e)||gi(e)||Bd(e)?"load":"isolable"}c(aL,"classifyProbeFailure");function cL(e,t){return async n=>[...await d.execute(Mo`
1226
+ `),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})),d=(await u.select({projectPath:y.projectPath,sessionCount:vn`COUNT(*)`,enrichedCount:vn`COUNT(CASE WHEN ${y.metadata}->'local_session_meta' IS NOT NULL THEN 1 END)`,analyzedCount:vn`COUNT(CASE WHEN ${y.analysis} IS NOT NULL THEN 1 END)`,firstSession:vn`MIN(${y.startedAt})`,lastSession:vn`MAX(${y.startedAt})`}).from(y).where(tE(Ph(y.userId,t),vn`${y.projectId} IS NULL`,vn`${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,...d].sort((m,p)=>p.sessionCount-m.sessionCount);return e.json(l)});O();import xL from"node:fs";import RL from"node:path";import{Hono as TL}from"hono";import{and as qh,desc as Uh,eq as Ho,gte as kL,ilike as uE,lte as NL,sql as ha}from"drizzle-orm";O();import{createHash as cL}from"node:crypto";import{and as dL,eq as nE,inArray as uL,sql as qo}from"drizzle-orm";var lL=90,mL=.5,rE=[{category:"claude_md_additions",get:c(e=>e.suggestions?.claude_md_additions,"get"),label:c(e=>String(e.addition??"").slice(0,120),"label")},{category:"features_to_try",get:c(e=>e.suggestions?.features_to_try,"get"),label:c(e=>String(e.feature??"").slice(0,120),"label")},{category:"usage_patterns",get:c(e=>e.suggestions?.usage_patterns,"get"),label:c(e=>String(e.title??"").slice(0,120),"label")},{category:"friction_categories",get:c(e=>e.friction_analysis?.categories,"get"),label:c(e=>String(e.category??"").slice(0,120),"label")},{category:"opportunities",get:c(e=>e.on_the_horizon?.opportunities,"get"),label:c(e=>String(e.title??"").slice(0,120),"label")},{category:"impressive_workflows",get:c(e=>e.what_works?.impressive_workflows,"get"),label:c(e=>String(e.title??"").slice(0,120),"label")},{category:"project_areas",get:c(e=>e.project_areas,"get"),label:c(e=>String(e.name??"").slice(0,120),"label")}];function oE(e,t){let n=Object.keys(t).filter(o=>o!=="id"&&o!=="timesGenerated").sort(),r=JSON.stringify(n.map(o=>[o,t[o]]));return cL("sha256").update(`${e}
1227
+ ${r}`).digest("hex")}c(oE,"recommendationEntryHash");var pL=new Set(["42883","42P01","42704"]),fL=2,Tm=!1;function gL(e){let t=e?.code;return typeof t=="string"&&pL.has(t)?"capability-absent":Sc(e)||Ac(e)||hi(e)||Ku(e)?"load":"isolable"}c(gL,"classifyProbeFailure");function hL(e,t){return async n=>[...await u.execute(qo`
1223
1228
  SELECT p.probe_hash, m.content_hash, m.times_generated, m.last_job_id,
1224
1229
  m.dismissed_at, m.sim
1225
- FROM (VALUES ${Mo.join(n.map(o=>Mo`(${o.hash}::text, ${o.category}::text, ${o.label}::text)`),Mo`, `)}) AS p(probe_hash, category, label)
1230
+ FROM (VALUES ${qo.join(n.map(o=>qo`(${o.hash}::text, ${o.category}::text, ${o.label}::text)`),qo`, `)}) AS p(probe_hash, category, label)
1226
1231
  -- CROSS JOIN, not LEFT JOIN LATERAL: a probe with no row in its
1227
1232
  -- category simply produces no output row, which reads back as "no
1228
1233
  -- alias" — the same outcome the per-probe query gave via an empty
@@ -1238,10 +1243,10 @@ ${r}`).digest("hex")}c(G0,"recommendationEntryHash");var sL=new Set(["42883","42
1238
1243
  ORDER BY sim DESC
1239
1244
  LIMIT 1
1240
1245
  ) m
1241
- `)]}c(cL,"dbProbeExecutor");async function Th(e,t,n,r=0){if(e.length===0)return[];if(bp||n.aborted)return n.degraded+=e.length,[];try{return n.statements+=1,await t(e)}catch(o){let s=aL(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"&&(bp=!0),s==="load"&&(n.aborted=!0),!(s==="isolable"&&r<iL&&e.length>1))return n.degraded+=e.length,[];n.bisections+=1;let a=Math.ceil(e.length/2),u=await Th(e.slice(0,a),t,n,r+1),l=await Th(e.slice(a),t,n,r+1);return[...u,...l]}}c(Th,"resolveProbes");async function Y0(e){let{userId:t,jobId:n}=e,r=e.projectPath??"",o=[];for(let m of K0)for(let w of m.get(e.recs)??[]){if(w===null||typeof w!="object")continue;let I=w;o.push({category:m.category,hash:G0(m.category,I),label:m.label(I)})}if(o.length===0)return e.recs;let s=[...new Set(o.map(m=>m.hash))],i=await d.select({contentHash:Te.contentHash,timesGenerated:Te.timesGenerated,lastJobId:Te.lastJobId,dismissedAt:Te.dismissedAt}).from(Te).where(tL(J0(Te.userId,t),J0(Te.projectPath,r),nL(Te.contentHash,s))),a=new Map(i.map(m=>[m.contentHash,m])),u=new Map,l=new Map;for(let m of o)a.has(m.hash)||m.label.trim().length===0||l.has(m.hash)||l.set(m.hash,m);if(l.size>0&&!bp){let m={probes:l.size,statements:0,bisections:0,degraded:0,aborted:!1},w=await Th([...l.values()],cL(t,r),m);for(let I of w)Number(I.sim)<oL||(u.set(I.probe_hash,I.content_hash),a.has(I.content_hash)||a.set(I.content_hash,{contentHash:I.content_hash,timesGenerated:Number(I.times_generated),lastJobId:I.last_job_id,dismissedAt:I.dismissed_at?new Date(I.dismissed_at):null}));m.failure&&console.warn(`[insight-memory] semantic probe degraded to verbatim identity: ${m.degraded}/${m.probes} probes, ${m.statements} statement(s), ${m.bisections} bisection(s), class=${m.failure.kind}`+(m.failure.code?` code=${m.failure.code}`:"")+(bp?" \u2014 trigram probing disabled for this process":""),m.failure.message)}let p=c(m=>u.get(m)??m,"canonical");if(n){let m=o.filter(w=>{let I=a.get(p(w.hash));return!I||I.lastJobId!==n});if(m.length>0)try{let w=new Set,I=m.filter(b=>!w.has(p(b.hash))&&w.add(p(b.hash)));await d.insert(Te).values(I.map(b=>({userId:t,projectPath:r,category:b.category,contentHash:p(b.hash),label:b.label,lastJobId:n}))).onConflictDoUpdate({target:[Te.userId,Te.projectPath,Te.contentHash],set:{lastSeenAt:Mo`now()`,timesGenerated:Mo`${Te.timesGenerated} + 1`,lastJobId:n}});for(let b of I){let A=p(b.hash),E=a.get(A);a.set(A,{contentHash:A,timesGenerated:(E?.timesGenerated??0)+1,lastJobId:n,dismissedAt:E?.dismissedAt??null})}}catch{}}let f=Date.now()-rL*24*3600*1e3,_=c(m=>{let w=a.get(m)?.dismissedAt;return w!=null&&new Date(w).getTime()>f},"suppressed"),v={...e.recs},h=c((m,w)=>{switch(m){case"claude_md_additions":case"features_to_try":case"usage_patterns":{let I={...v.suggestions};I[m]=w,v.suggestions=I;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 m of K0){let w=m.get(e.recs)??[];if(w.length===0)continue;let I=w.map(b=>{if(b===null||typeof b!="object")return b;let A=b,E=p(G0(m.category,A));return{...A,id:E,timesGenerated:a.get(E)?.timesGenerated??1}}).filter(b=>b===null||typeof b!="object"?!0:!_(b.id??""));h(m.category,I)}return v}c(Y0,"applyRecommendationMemory");async function X0(e){let t=e.projectPath??"";await d.insert(Te).values({userId:e.userId,projectPath:t,category:"unknown",contentHash:e.contentHash,dismissedAt:Mo`now()`}).onConflictDoUpdate({target:[Te.userId,Te.projectPath,Te.contentHash],set:{dismissedAt:Mo`now()`}})}c(X0,"dismissRecommendation");D();var Rh=[{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 $o(e){if(!e)return"anthropic";let t=Rh.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"}c($o,"providerFromModelId");var kh={provider:"anthropic",modelId:"default-sonnet-equivalent",inputPerMTok:3,outputPerMTok:15,cacheReadPerMTok:.3,cacheWrite5mPerMTok:3.75,cacheWrite1hPerMTok:6,contextWindow:2e5};function Nh(e){return Rh.find(t=>t.modelId===e)}c(Nh,"findModel");var vu=1e6;function uL(e){return Math.round(e*100)/100}c(uL,"roundCents");function Ep(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,u=r*t.inputPerMTok/vu,l=o*t.outputPerMTok/vu,p=s*t.cacheReadPerMTok/vu,f=i*t.cacheWrite5mPerMTok/vu,_=a*t.cacheWrite1hPerMTok/vu,v=f+_,h=u+l+p+v;return{inputUsd:u,outputUsd:l,cacheReadUsd:p,cacheWriteUsd:v,totalUsd:uL(h),estimated:n}}c(Ep,"computePrice");function jh(e,t,n){let r=Nh(t);return Ep(e,r??kh,!r)}c(jh,"priceUsage");D();import{and as dL,desc as lL,eq as Q0,isNull as pL,lte as mL,or as fL,gt as gL}from"drizzle-orm";function Iu(e){return e==null?0:typeof e=="number"?e:Number(e)}c(Iu,"toNumber");async function Xr(e,t,n,r,o="anthropic"){let s=await e.select().from(st).where(dL(Q0(st.provider,o),Q0(st.modelId,n),mL(st.effectiveFrom,r),fL(pL(st.effectiveUntil),gL(st.effectiveUntil,r)))).orderBy(lL(st.effectiveFrom)).limit(1);if(s.length===0)return jh(t,n,r);let i=s[0];return Ep(t,{inputPerMTok:Iu(i.inputPerM),outputPerMTok:Iu(i.outputPerM),cacheReadPerMTok:Iu(i.cacheReadPerM),cacheWrite5mPerMTok:Iu(i.cacheWrite5mPerM),cacheWrite1hPerMTok:Iu(i.cacheWrite1hPerM)},!1)}c(Xr,"priceUsageFromDb");var bu=1e6,Z0=10*6e4,hL=500,qs=new Map;function _L(e,t,n){return`${e}:${t}:${n.toISOString().slice(0,7)}`}c(_L,"rateKey");function eE(e,t){let n=$o(e),r=_L(n,e,t),o=qs.get(r),s=o&&Date.now()-o.at<Z0?o.rates:void 0;if(!s){s=(async()=>{let a={input_tokens:bu},u={output_tokens:bu},l={cache_read_input_tokens:bu},p={cache_creation_5m:bu},f={cache_creation_1h:bu},[_,v,h,m,w]=await Promise.all([Xr(Fe,a,e,t,n),Xr(Fe,u,e,t,n),Xr(Fe,l,e,t,n),Xr(Fe,p,e,t,n),Xr(Fe,f,e,t,n)]);return{inputPerM:_.inputUsd,outputPerM:v.outputUsd,cacheReadPerM:h.cacheReadUsd,cacheWrite5mPerM:m.cacheWriteUsd,cacheWrite1hPerM:w.cacheWriteUsd,estimated:_.estimated}})();let i=s;if(i.catch(()=>{qs.get(r)?.rates===i&&qs.delete(r)}),qs.set(r,{at:Date.now(),rates:i}),qs.size>hL)for(let[a,u]of qs)Date.now()-u.at>=Z0&&qs.delete(a)}return s}c(eE,"getRates");var Eu=new vL;function EL(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(([,v],[,h])=>h-v)[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((_,v)=>_+v,0)>5){let v=Object.entries(e.friction).sort(([,h],[,m])=>m-h).slice(0,2).map(([h,m])=>`${h.replace(/_/g," ")} (${m}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((_,v)=>_+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,u=e.friction.buggy_code??0;a+u>3&&i.push({skillId:"structured-debugging",reason:`${a+u} 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(([_])=>_.includes("auth")||_.includes("security")||_.includes("permission")).reduce((_,[,v])=>_+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}}c(EL,"generateAutoSuggestions");var AL=45e3,Ap=new Map,SL=tp();Eu.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??""}`,u=Ap.get(a),p=(u&&Date.now()-u.at<AL?u.data:null)??await SL.run(a,async()=>{let v=[qo(y.userId,t)];r?v.push(qo(y.projectId,r)):n&&v.push(tE(y.projectPath,`%${ct(n)}%`)),i&&v.push(qo(y.tool,i)),o&&v.push(IL(y.startedAt,new Date(o))),s&&v.push(bL(y.startedAt,new Date(s)));let h=500,m=await Fe.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(Ph(...v)).orderBy(Dh(y.startedAt)).limit(h),w=1e6,I=c(async(J,_e,Qe)=>{let Ke=await eE(_e,Qe),at=J.input_tokens??0,Gt=J.output_tokens??0,An=J.cache_read_input_tokens??0,cn=(J.cache_creation_5m??0)+(J.cache_creation_input_tokens??0),nr=J.cache_creation_1h??0,dt=at*Ke.inputPerM/w,xt=Gt*Ke.outputPerM/w,bt=An*Ke.cacheReadPerM/w,fn=cn*Ke.cacheWrite5mPerM/w+nr*Ke.cacheWrite1hPerM/w,ns=Math.round((dt+xt+bt+fn)*100)/100;return{inputUsd:dt,outputUsd:xt,cacheReadUsd:bt,cacheWriteUsd:fn,totalUsd:ns,estimated:Ke.estimated}},"getPriced"),b={},A={},E={},S={},R={},O={},W={},N={},q={},U={},H=[],te=[],de=[],K=0,me=0,B=0,he=0,P=0,re=0,Ce=0,St=0,le=0,ce=0,Se=0,We=0,rt=0,Le=0,Xe=0,be=0,an=0,L=0,j=0,ht=0,jt=0,tr=0,mn=0,io=0,$a=null,qa=null,yS=Date.now()-720*60*60*1e3,am=[],Ku="claude-sonnet-4-6",Gu=c(()=>({input_tokens:0,output_tokens:0,cache_read_tokens:0,cache_write_tokens:0,cost_usd:0}),"newBucket"),Yu=c((J,_e,Qe,Ke,at,Gt)=>{J.input_tokens+=_e,J.output_tokens+=Qe,J.cache_read_tokens+=Ke,J.cache_write_tokens+=at,J.cost_usd+=Gt},"accumulateBucket"),Ua={},Ha={},wS=new Map(m.map(J=>[J.id,J.startedAt])),vS=new Map(m.map(J=>[J.id,J.tool??"unknown"])),M_=new Set,$_=m.length>0?await Fe.execute(ha`
1246
+ `)]}c(hL,"dbProbeExecutor");async function Oh(e,t,n,r=0){if(e.length===0)return[];if(Tm||n.aborted)return n.degraded+=e.length,[];try{return n.statements+=1,await t(e)}catch(o){let s=gL(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"&&(Tm=!0),s==="load"&&(n.aborted=!0),!(s==="isolable"&&r<fL&&e.length>1))return n.degraded+=e.length,[];n.bisections+=1;let a=Math.ceil(e.length/2),d=await Oh(e.slice(0,a),t,n,r+1),l=await Oh(e.slice(a),t,n,r+1);return[...d,...l]}}c(Oh,"resolveProbes");async function sE(e){let{userId:t,jobId:n}=e,r=e.projectPath??"",o=[];for(let h of rE)for(let v of h.get(e.recs)??[]){if(v===null||typeof v!="object")continue;let I=v;o.push({category:h.category,hash:oE(h.category,I),label:h.label(I)})}if(o.length===0)return e.recs;let s=[...new Set(o.map(h=>h.hash))],i=await u.select({contentHash:Re.contentHash,timesGenerated:Re.timesGenerated,lastJobId:Re.lastJobId,dismissedAt:Re.dismissedAt}).from(Re).where(dL(nE(Re.userId,t),nE(Re.projectPath,r),uL(Re.contentHash,s))),a=new Map(i.map(h=>[h.contentHash,h])),d=new Map,l=new Map;for(let h of o)a.has(h.hash)||h.label.trim().length===0||l.has(h.hash)||l.set(h.hash,h);if(l.size>0&&!Tm){let h={probes:l.size,statements:0,bisections:0,degraded:0,aborted:!1},v=await Oh([...l.values()],hL(t,r),h);for(let I of v)Number(I.sim)<mL||(d.set(I.probe_hash,I.content_hash),a.has(I.content_hash)||a.set(I.content_hash,{contentHash:I.content_hash,timesGenerated:Number(I.times_generated),lastJobId:I.last_job_id,dismissedAt:I.dismissed_at?new Date(I.dismissed_at):null}));h.failure&&console.warn(`[insight-memory] semantic probe degraded to verbatim identity: ${h.degraded}/${h.probes} probes, ${h.statements} statement(s), ${h.bisections} bisection(s), class=${h.failure.kind}`+(h.failure.code?` code=${h.failure.code}`:"")+(Tm?" \u2014 trigram probing disabled for this process":""),h.failure.message)}let m=c(h=>d.get(h)??h,"canonical");if(n){let h=o.filter(v=>{let I=a.get(m(v.hash));return!I||I.lastJobId!==n});if(h.length>0)try{let v=new Set,I=h.filter(E=>!v.has(m(E.hash))&&v.add(m(E.hash)));await u.insert(Re).values(I.map(E=>({userId:t,projectPath:r,category:E.category,contentHash:m(E.hash),label:E.label,lastJobId:n}))).onConflictDoUpdate({target:[Re.userId,Re.projectPath,Re.contentHash],set:{lastSeenAt:qo`now()`,timesGenerated:qo`${Re.timesGenerated} + 1`,lastJobId:n}});for(let E of I){let A=m(E.hash),b=a.get(A);a.set(A,{contentHash:A,timesGenerated:(b?.timesGenerated??0)+1,lastJobId:n,dismissedAt:b?.dismissedAt??null})}}catch{}}let p=Date.now()-lL*24*3600*1e3,_=c(h=>{let v=a.get(h)?.dismissedAt;return v!=null&&new Date(v).getTime()>p},"suppressed"),w={...e.recs},f=c((h,v)=>{switch(h){case"claude_md_additions":case"features_to_try":case"usage_patterns":{let I={...w.suggestions};I[h]=v,w.suggestions=I;break}case"friction_categories":{w.friction_analysis={...w.friction_analysis,categories:v};break}case"opportunities":{w.on_the_horizon={...w.on_the_horizon,opportunities:v};break}case"impressive_workflows":{w.what_works={...w.what_works,impressive_workflows:v};break}case"project_areas":{w.project_areas=v;break}}},"setPath");for(let h of rE){let v=h.get(e.recs)??[];if(v.length===0)continue;let I=v.map(E=>{if(E===null||typeof E!="object")return E;let A=E,b=m(oE(h.category,A));return{...A,id:b,timesGenerated:a.get(b)?.timesGenerated??1}}).filter(E=>E===null||typeof E!="object"?!0:!_(E.id??""));f(h.category,I)}return w}c(sE,"applyRecommendationMemory");async function iE(e){let t=e.projectPath??"";await u.insert(Re).values({userId:e.userId,projectPath:t,category:"unknown",contentHash:e.contentHash,dismissedAt:qo`now()`}).onConflictDoUpdate({target:[Re.userId,Re.projectPath,Re.contentHash],set:{dismissedAt:qo`now()`}})}c(iE,"dismissRecommendation");O();var Ch=[{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 Uo(e){if(!e)return"anthropic";let t=Ch.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"}c(Uo,"providerFromModelId");var Lh={provider:"anthropic",modelId:"default-sonnet-equivalent",inputPerMTok:3,outputPerMTok:15,cacheReadPerMTok:.3,cacheWrite5mPerMTok:3.75,cacheWrite1hPerMTok:6,contextWindow:2e5};function Mh(e){return Ch.find(t=>t.modelId===e)}c(Mh,"findModel");var bd=1e6;function _L(e){return Math.round(e*100)/100}c(_L,"roundCents");function km(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,d=r*t.inputPerMTok/bd,l=o*t.outputPerMTok/bd,m=s*t.cacheReadPerMTok/bd,p=i*t.cacheWrite5mPerMTok/bd,_=a*t.cacheWrite1hPerMTok/bd,w=p+_,f=d+l+m+w;return{inputUsd:d,outputUsd:l,cacheReadUsd:m,cacheWriteUsd:w,totalUsd:_L(f),estimated:n}}c(km,"computePrice");function $h(e,t,n){let r=Mh(t);return km(e,r??Lh,!r)}c($h,"priceUsage");O();import{and as yL,desc as wL,eq as aE,isNull as vL,lte as IL,or as bL,gt as EL}from"drizzle-orm";function Ed(e){return e==null?0:typeof e=="number"?e:Number(e)}c(Ed,"toNumber");async function eo(e,t,n,r,o="anthropic"){let s=await e.select().from(st).where(yL(aE(st.provider,o),aE(st.modelId,n),IL(st.effectiveFrom,r),bL(vL(st.effectiveUntil),EL(st.effectiveUntil,r)))).orderBy(wL(st.effectiveFrom)).limit(1);if(s.length===0)return $h(t,n,r);let i=s[0];return km(t,{inputPerMTok:Ed(i.inputPerM),outputPerMTok:Ed(i.outputPerM),cacheReadPerMTok:Ed(i.cacheReadPerM),cacheWrite5mPerMTok:Ed(i.cacheWrite5mPerM),cacheWrite1hPerMTok:Ed(i.cacheWrite1hPerM)},!1)}c(eo,"priceUsageFromDb");var Ad=1e6,cE=10*6e4,AL=500,Us=new Map;function SL(e,t,n){return`${e}:${t}:${n.toISOString().slice(0,7)}`}c(SL,"rateKey");function dE(e,t){let n=Uo(e),r=SL(n,e,t),o=Us.get(r),s=o&&Date.now()-o.at<cE?o.rates:void 0;if(!s){s=(async()=>{let a={input_tokens:Ad},d={output_tokens:Ad},l={cache_read_input_tokens:Ad},m={cache_creation_5m:Ad},p={cache_creation_1h:Ad},[_,w,f,h,v]=await Promise.all([eo(Fe,a,e,t,n),eo(Fe,d,e,t,n),eo(Fe,l,e,t,n),eo(Fe,m,e,t,n),eo(Fe,p,e,t,n)]);return{inputPerM:_.inputUsd,outputPerM:w.outputUsd,cacheReadPerM:f.cacheReadUsd,cacheWrite5mPerM:h.cacheWriteUsd,cacheWrite1hPerM:v.cacheWriteUsd,estimated:_.estimated}})();let i=s;if(i.catch(()=>{Us.get(r)?.rates===i&&Us.delete(r)}),Us.set(r,{at:Date.now(),rates:i}),Us.size>AL)for(let[a,d]of Us)Date.now()-d.at>=cE&&Us.delete(a)}return s}c(dE,"getRates");var Sd=new TL;function jL(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(([,w],[,f])=>f-w)[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((_,w)=>_+w,0)>5){let w=Object.entries(e.friction).sort(([,f],[,h])=>h-f).slice(0,2).map(([f,h])=>`${f.replace(/_/g," ")} (${h}x)`).join(", ");n.push({title:"Reduce Friction with Structured Prompts",suggestion:`Your top friction points are: ${w}. 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((_,w)=>_+w,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,d=e.friction.buggy_code??0;a+d>3&&i.push({skillId:"structured-debugging",reason:`${a+d} 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((_,[,w])=>_+w,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}}c(jL,"generateAutoSuggestions");var PL=45e3,Nm=new Map,DL=am();Sd.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??""}`,d=Nm.get(a),m=(d&&Date.now()-d.at<PL?d.data:null)??await DL.run(a,async()=>{let w=[Ho(y.userId,t)];r?w.push(Ho(y.projectId,r)):n&&w.push(uE(y.projectPath,`%${ct(n)}%`)),i&&w.push(Ho(y.tool,i)),o&&w.push(kL(y.startedAt,new Date(o))),s&&w.push(NL(y.startedAt,new Date(s)));let f=500,h=await Fe.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(qh(...w)).orderBy(Uh(y.startedAt)).limit(f),v=1e6,I=c(async(G,_e,Qe)=>{let Ke=await dE(_e,Qe),at=G.input_tokens??0,Yt=G.output_tokens??0,An=G.cache_read_input_tokens??0,dn=(G.cache_creation_5m??0)+(G.cache_creation_input_tokens??0),nr=G.cache_creation_1h??0,ut=at*Ke.inputPerM/v,xt=Yt*Ke.outputPerM/v,Et=An*Ke.cacheReadPerM/v,gn=dn*Ke.cacheWrite5mPerM/v+nr*Ke.cacheWrite1hPerM/v,rs=Math.round((ut+xt+Et+gn)*100)/100;return{inputUsd:ut,outputUsd:xt,cacheReadUsd:Et,cacheWriteUsd:gn,totalUsd:rs,estimated:Ke.estimated}},"getPriced"),E={},A={},b={},S={},T={},P={},H={},N={},U={},q={},B=[],J=[],ce=[],V=0,pe=0,F=0,he=0,D=0,re=0,Ce=0,St=0,le=0,de=0,Se=0,ze=0,rt=0,Le=0,Xe=0,be=0,cn=0,L=0,j=0,ht=0,jt=0,tr=0,fn=0,co=0,$a=null,qa=null,AS=Date.now()-720*60*60*1e3,pp=[],eu="claude-sonnet-4-6",tu=c(()=>({input_tokens:0,output_tokens:0,cache_read_tokens:0,cache_write_tokens:0,cost_usd:0}),"newBucket"),nu=c((G,_e,Qe,Ke,at,Yt)=>{G.input_tokens+=_e,G.output_tokens+=Qe,G.cache_read_tokens+=Ke,G.cache_write_tokens+=at,G.cost_usd+=Yt},"accumulateBucket"),Ua={},Ha={},SS=new Map(h.map(G=>[G.id,G.startedAt])),xS=new Map(h.map(G=>[G.id,G.tool??"unknown"])),V_=new Set,J_=h.length>0?await Fe.execute(ha`
1242
1247
  SELECT
1243
1248
  deduped.session_id AS "sessionId",
1244
- COALESCE(deduped.model, ${Ku}) AS "model",
1249
+ COALESCE(deduped.model, ${eu}) AS "model",
1245
1250
  COALESCE(SUM(COALESCE((deduped.token_usage->>'input_tokens')::bigint, (deduped.token_usage->>'input')::bigint)), 0)::bigint AS "inputTokens",
1246
1251
  COALESCE(SUM(COALESCE((deduped.token_usage->>'output_tokens')::bigint, (deduped.token_usage->>'output')::bigint)), 0)::bigint AS "outputTokens",
1247
1252
  COALESCE(SUM(COALESCE((deduped.token_usage->>'cache_read_input_tokens')::bigint, (deduped.token_usage->>'cacheRead')::bigint)), 0)::bigint AS "cacheReadTokens",
@@ -1252,17 +1257,17 @@ ${r}`).digest("hex")}c(G0,"recommendationEntryHash");var sL=new Set(["42883","42
1252
1257
  SELECT DISTINCT ON (se.session_id, COALESCE(se.metadata->>'requestId', se.id::text))
1253
1258
  se.session_id, se.model, se.token_usage
1254
1259
  FROM session_events se
1255
- WHERE se.session_id IN (${ha.join(m.map(J=>ha`${J.id}`),ha`, `)})
1260
+ WHERE se.session_id IN (${ha.join(h.map(G=>ha`${G.id}`),ha`, `)})
1256
1261
  AND se.token_usage IS NOT NULL
1257
1262
  ORDER BY se.session_id, COALESCE(se.metadata->>'requestId', se.id::text), se.sequence
1258
1263
  ) deduped
1259
1264
  GROUP BY deduped.session_id, deduped.model
1260
- `):[];for(let J of $_)M_.add(J.sessionId);for(let J of m){let _e=J.metadata?.local_session_meta,Qe=J.analysis,Ke=J.tokenUsage;if(J.tool&&(A[J.tool]=(A[J.tool]||0)+1),J.projectPath){let at=J.projectPath.split("/").pop()??J.projectPath;S[at]=(S[at]||0)+1}if(Ke&&!M_.has(J.id)){let at=Ke.input_tokens??0,Gt=Ke.output_tokens??0,An=Ke.cache_read_input_tokens??0,cn=Ke.cache_creation_5m??0,nr=Ke.cache_creation_1h??0,dt=Ke.cache_creation_input_tokens??0,xt=cn+nr||dt;B+=at,he+=Gt,P+=An,re+=xt;let bt=await I(Ke,Ku,J.startedAt);Ce+=bt.inputUsd,St+=bt.outputUsd,le+=bt.cacheReadUsd,ce+=bt.cacheWriteUsd;let fn=bt.inputUsd+bt.outputUsd+bt.cacheReadUsd+bt.cacheWriteUsd,ns=J.tool??"unknown",B_=Ua[Ku]??Gu();Yu(B_,at,Gt,An,xt,fn),Ua[Ku]=B_;let F_=Ha[ns]??Gu();Yu(F_,at,Gt,An,xt,fn),Ha[ns]=F_}if(_e){L++;let at=_e.user_message_count??0;K+=at,me+=(_e.duration_minutes??0)/60,Se+=_e.git_commits??0,We+=_e.git_pushes??0,rt+=_e.lines_added??0,Le+=_e.lines_removed??0,Xe+=_e.files_modified??0,be+=_e.tool_errors??0;let Gt=_e.tool_counts;if(Gt)for(let[bt,fn]of Object.entries(Gt))b[bt]=(b[bt]||0)+fn;let An=_e.languages;if(An)for(let[bt,fn]of Object.entries(An))E[bt]=(E[bt]||0)+fn;let cn=_e.message_hours;cn&&H.push(...cn);let nr=_e.tool_error_categories;if(nr)for(let[bt,fn]of Object.entries(nr))U[bt]=(U[bt]||0)+fn;let dt=_e.user_response_times;dt&&te.push(...dt),an+=_e.user_interruptions??0,_e.uses_task_agent&&ht++,_e.uses_mcp&&jt++;let xt=_e.user_message_timestamps;xt&&xt.length>0&&de.push({id:J.id,start:J.startedAt.toISOString(),timestamps:xt})}if(Qe)if(J.analyzedAt){tr++;let at=new Date(J.analyzedAt).getTime();($a===null||at<$a)&&($a=at),(qa===null||at>qa)&&(qa=at),at<yS&&io++}else mn++;if(Qe){j++;let at=Qe.goal_categories;if(at)for(let[dt,xt]of Object.entries(at))xt>0&&(R[dt]=(R[dt]||0)+xt);let Gt=Qe.outcome;Gt&&(O[Gt]=(O[Gt]||0)+1);let An=Qe.user_satisfaction;if(An)for(let[dt,xt]of Object.entries(An))xt>0&&(W[dt]=(W[dt]||0)+xt);let cn=Qe.session_type;cn&&(N[cn]=(N[cn]||0)+1);let nr=Qe.friction??Qe.friction_counts;if(nr)for(let[dt,xt]of Object.entries(nr))xt>0&&(q[dt]=(q[dt]||0)+xt);am.length<50&&am.push({id:J.id,externalId:J.externalSessionId,date:J.startedAt.toISOString().split("T")[0]??"",summary:Qe.brief_summary??"",goal:Qe.underlying_goal,outcome:Gt})}}let Xu=m.map(J=>J.startedAt.toISOString()).sort(),cm=new Set(Xu.map(J=>J.split("T")[0]));for(let J of $_){let _e=Number(J.inputTokens)||0,Qe=Number(J.outputTokens)||0,Ke=Number(J.cacheReadTokens)||0,at=Number(J.cacheWrite5m)||0,Gt=Number(J.cacheWrite1h)||0,An=Number(J.cacheWriteLegacy)||0,cn=at+Gt||An,nr=wS.get(J.sessionId)??new Date,dt=await I({input_tokens:_e,output_tokens:Qe,cache_read_input_tokens:Ke,cache_creation_input_tokens:cn},J.model,nr);Ce+=dt.inputUsd,St+=dt.outputUsd,le+=dt.cacheReadUsd,ce+=dt.cacheWriteUsd,B+=_e,he+=Qe,P+=Ke,re+=cn;let xt=dt.inputUsd+dt.outputUsd+dt.cacheReadUsd+dt.cacheWriteUsd,bt=Ua[J.model]??Gu();Yu(bt,_e,Qe,Ke,cn,xt),Ua[J.model]=bt;let fn=vS.get(J.sessionId)??"unknown",ns=Ha[fn]??Gu();Yu(ns,_e,Qe,Ke,cn,xt),Ha[fn]=ns}let ts=c(J=>Math.round(J*100)/100,"round2"),IS=Ce+St+le+ce,bS=ts(IS),ES={inputUsd:ts(Ce),outputUsd:ts(St),cacheReadUsd:ts(le),cacheWriteUsd:ts(ce)},um={};for(let[J,_e]of Object.entries(Ua))um[J]={input_tokens:_e.input_tokens,output_tokens:_e.output_tokens,cache_read_tokens:_e.cache_read_tokens,cache_write_tokens:_e.cache_write_tokens,cost_usd:ts(_e.cost_usd)};let dm={};for(let[J,_e]of Object.entries(Ha))dm[J]={input_tokens:_e.input_tokens,output_tokens:_e.output_tokens,cache_read_tokens:_e.cache_read_tokens,cache_write_tokens:_e.cache_write_tokens,cost_usd:ts(_e.cost_usd)};let ao={"2-10s":0,"10-30s":0,"30s-1m":0,"1-2m":0,"2-5m":0,"5-15m":0,">15m":0};for(let J of te)J<10?ao["2-10s"]++:J<30?ao["10-30s"]++:J<60?ao["30s-1m"]++:J<120?ao["1-2m"]++:J<300?ao["2-5m"]++:J<900?ao["5-15m"]++:ao[">15m"]++;let Ys=[...te].sort((J,_e)=>J-_e),AS=Ys.length>0?Ys[Math.floor(Ys.length/2)]:0,SS=Ys.length>0?Ys.reduce((J,_e)=>J+_e,0)/Ys.length:0,q_=0,U_=0;if(de.length>1){let J=de.flatMap(Qe=>Qe.timestamps.map(Ke=>({sessionId:Qe.id,time:new Date(Ke).getTime()}))).sort((Qe,Ke)=>Qe.time-Ke.time),_e=new Set;for(let Qe=0;Qe<J.length-1;Qe++){let Ke=J[Qe],at=J[Qe+1];Ke.sessionId!==at.sessionId&&at.time-Ke.time<1800*1e3&&(_e.add(Ke.sessionId),_e.add(at.sessionId),q_++)}U_=_e.size}let Xs={computed:!0,total_sessions:m.length,window:{since:o??null,until:s??null},truncated:m.length>=h,sessions_with_meta:L,sessions_with_analysis:j,tools_used:A,date_range:{start:Xu[0]?.split("T")[0]??"",end:Xu[Xu.length-1]?.split("T")[0]??""},total_messages:K,total_duration_hours:Math.round(me*10)/10,total_input_tokens:B,total_output_tokens:he,total_cache_read_tokens:P,total_cache_write_tokens:re,estimated_cost_usd:bS,estimated_cost_breakdown:ES,estimated_cost_by_model:Object.keys(um).length>0?um:void 0,estimated_cost_by_tool:Object.keys(dm).length>0?dm:void 0,tool_counts:b,languages:E,git_commits:Se,git_pushes:We,projects:S,goal_categories:R,outcomes:O,satisfaction:W,session_types:N,friction:q,tool_error_categories:U,session_summaries:am,total_tool_errors:be,total_interruptions:an,total_lines_added:rt,total_lines_removed:Le,total_files_modified:Xe,days_active:cm.size,messages_per_day:cm.size>0?Math.round(K/cm.size*10)/10:0,message_hours:H,sessions_using_task_agent:ht,sessions_using_mcp:jt,response_time:{median_seconds:Math.round(AS*10)/10,avg_seconds:Math.round(SS*10)/10,histogram:ao,total_samples:te.length},parallel_sessions:{events:q_,sessions_involved:U_},analysis_freshness:{with_timestamp:tr,pre_instrumentation:mn,stale_30d:io,oldest_analyzed_at:$a?new Date($a).toISOString():null,newest_analyzed_at:qa?new Date(qa).toISOString():null}};Xs.autoAddAvailable=!!(n&&yL.existsSync(wL.join(n,"CLAUDE.md")));let Qu=[qo(z.userId,t),qo(z.status,"completed")];r?Qu.push(qo(z.projectId,r)):n?Qu.push(tE(z.projectPath,`%${ct(n)}%`)):Qu.push(ha`${z.projectPath} IS NULL`);let[H_]=await Fe.select({id:z.id,result:z.result}).from(z).where(Ph(...Qu)).orderBy(Dh(z.completedAt)).limit(1),xS=H_?.result,lm=$f(xS?.recommendations);if(lm&&Object.keys(lm).length>0)Xs.recommendations=lm,Xs._recsJobId=H_?.id??null;else if(m.length>=3){let J=EL({totalSessions:m.length,sessionsWithAnalysis:j,toolCounts:b,toolErrorCategories:U,friction:q,outcomes:O,sessionsUsingMcp:jt,sessionsUsingTaskAgent:ht,totalToolErrors:be,totalMessages:K,totalDurationHours:me});J&&(Xs.recommendations=J)}return Ap.size>1e3&&Ap.clear(),Ap.set(a,{at:Date.now(),data:Xs}),Xs}),{_recsJobId:f,..._}=p;if(_.recommendations)try{_.recommendations=await Y0({userId:t,projectPath:n,jobId:f??null,recs:_.recommendations})}catch{}return e.json(_)});Eu.get("/insights/recommendations/history",async e=>{let t=e.get("userId"),n=e.req.query("projectPath")??"",r=await d.select({category:Te.category,label:Te.label,timesGenerated:Te.timesGenerated,dismissedAt:Te.dismissedAt,lastSeenAt:Te.lastSeenAt}).from(Te).where(Ph(qo(Te.userId,t),qo(Te.projectPath,n))).orderBy(ha`${Te.dismissedAt} IS NULL`,Dh(Te.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}))})});Eu.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 X0({userId:t,projectPath:o,contentHash:r}),e.json({ok:!0})});D();import{Hono as xL}from"hono";import{and as Ln,count as TL,eq as Oe,ilike as RL,inArray as kL,sql as In}from"drizzle-orm";ws();var Hs=new xL,Us=c(e=>ys(e?.outcome??null),"scoreOf");Hs.get("/insights/linked-instructions",async e=>{let t=e.get("userId"),n=e.req.query("projectPath"),r=Number(e.req.query("limit")??20),o=[Oe(y.userId,t)];n&&o.push(RL(y.projectPath,`%${ct(n)}%`));let s=await d.select({id:g.id,name:g.name,contentHash:g.contentHash,source:In`${g.frontmatter}->>'source'`,linkedSessions:In`COUNT(DISTINCT ${se.sessionId})`}).from(se).innerJoin(y,Oe(y.id,se.sessionId)).innerJoin(g,Oe(g.id,se.instructionId)).where(Ln(...o)).groupBy(g.id,g.name,g.contentHash,In`${g.frontmatter}->>'source'`).orderBy(In`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)})))});Hs.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(ne,Oe(ne.sessionId,y.id)).where(Ln(Oe(y.userId,t),Oe(ne.treatmentType,"instruction"),Oe(ne.treatmentId,n))),o=r.map(P=>P.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(Ln(Oe(y.userId,t),In`${y.analysis} IS NOT NULL`)),i=await d.selectDistinct({sessionId:ne.sessionId}).from(ne).where(Ln(Oe(ne.userId,t),Oe(ne.treatmentType,"instruction"))),a=new Set(i.map(P=>P.sessionId)),u=new Set(o),l=s.filter(P=>!u.has(P.id)&&a.has(P.id));function p(P){let re=0,Ce=0,St=0,le=0,ce=[],Se={},We={achieved:1,fully_achieved:1,mostly_achieved:.75,partially_achieved:.5,unclear_from_transcript:.25,not_achieved:0,abandoned:0};for(let rt of P){let Le=rt.analysis,Xe=rt.metadata?.local_session_meta;if(Le?.outcome){let an=We[Le.outcome];an!==void 0&&ce.push(an)}Xe&&(le++,re+=Xe.tool_errors??0,Ce+=Xe.duration_minutes??0,St+=(Xe.lines_added??0)+(Xe.lines_removed??0));let be=Le?.goal_categories??{};for(let[an,L]of Object.entries(be))L>0&&(Se[an]=(Se[an]||0)+L)}return{sessionCount:P.length,enrichedCount:le,outcomeScores:ce,avgOutcomeScore:ce.length>0?Math.round(ce.reduce((rt,Le)=>rt+Le,0)/ce.length*100)/100:null,avgToolErrors:le>0?Math.round(re/le*10)/10:null,avgDurationMinutes:le>0?Math.round(Ce/le*10)/10:null,avgLinesChanged:le>0?Math.round(St/le):null,topGoalCategories:Se}}c(p,"computeCohort");let f=p(r),_=p(l),v=c(P=>{if(!P)return"(no-date)";let re=typeof P=="string"?new Date(P):P;return Number.isNaN(re.getTime())?"(no-date)":`${re.getUTCFullYear()}-${String(re.getUTCMonth()+1).padStart(2,"0")}`},"monthKey"),h=c(P=>{if(!P)return 0;let re=typeof P=="string"?new Date(P):P;return Number.isNaN(re.getTime())?0:re.getTime()},"timeOf"),m=new Map,w=c((P,re,Ce,St)=>{let le=`${P??"(no-project)"}|${v(re)}`,ce=m.get(le);ce||(ce={key:le,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},m.set(le,ce)),(St?ce.withScores:ce.withoutScores).push(Ce),(St?ce.withTimes:ce.withoutTimes).push(h(re))},"addToStratum");for(let P of r){let re=Us(P.analysis);re!=null&&w(P.projectId,P.startedAt,re,!0)}for(let P of l){let re=Us(P.analysis);re!=null&&w(P.projectId,P.startedAt,re,!1)}let I=c(P=>{let re=new Map,Ce=new Set,St=c((le,ce,Se,We,rt)=>{let Le=re.get(le);Le||(Le=new Map,re.set(le,Le));let Xe=`${ce??"(no-project)"}|${v(Se)}`,be=Le.get(Xe);be||(be={key:Xe,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},Le.set(Xe,be)),(rt?be.withScores:be.withoutScores).push(We),(rt?be.withTimes:be.withoutTimes).push(h(Se))},"add");for(let le of r){let ce=Us(le.analysis),Se=P(le);ce==null||!Se||(Ce.add(Se),St(Se,le.projectId,le.startedAt,ce,!0))}for(let le of l){let ce=Us(le.analysis),Se=P(le);ce==null||!Se||!Ce.has(Se)||St(Se,le.projectId,le.startedAt,ce,!1)}return[...Ce].map(le=>({segment:le,strata:[...re.get(le)?.values()??[]]}))},"buildAxisSegments"),b=c(P=>[...P].sort((re,Ce)=>Number(Ce.verdict.sufficient)-Number(re.verdict.sufficient)||Ce.verdict.nWith-re.verdict.nWith),"sortSegs"),A=ag([...m.values()],I(P=>Ss(P.model))),E=A.overall,S=b(A.segments).map(P=>({model:P.segment,verdict:P.verdict})),R=b(ll(I(P=>P.tool??null))).map(P=>({harness:P.segment,verdict:P.verdict})),{outcomeScores:O,...W}=f,{outcomeScores:N,...q}=_,[U]=await d.select({name:g.name}).from(g).where(Oe(g.id,n)).limit(1),[H]=await d.select({n:TL(),lastAssignedAt:In`max(${Lt.assignedAt})`}).from(Lt).where(Ln(Oe(Lt.userId,t),Oe(Lt.treatmentType,"instruction"),Oe(Lt.treatmentId,n),Oe(Lt.method,"auto_added"))),te=H&&Number(H.n)>0?{count:Number(H.n),lastAssignedAt:H.lastAssignedAt}:null,[de]=await d.select({content:g.content,name:g.name}).from(g).where(Oe(g.id,n)),K=Kr(de?.content,de?.name),me=K?(await d.select({projectPath:Q.projectPath,decision:Q.decision,delta:Q.delta,ciLower:Q.ciLower,ciUpper:Q.ciUpper,nTreated:Q.nTreated,nControl:Q.nControl,segment:Q.segment,decidedAt:Q.decidedAt}).from(Q).where(Ln(Oe(Q.userId,t),Oe(Q.instructionId,n),Oe(Q.contentHash,K)))).map(P=>({projectPath:P.projectPath,decision:P.decision,delta:Number(P.delta),ciLower:Number(P.ciLower),ciUpper:Number(P.ciUpper),nTreated:P.nTreated,nControl:P.nControl,segment:P.segment,decidedAt:P.decidedAt})):[],B=await d.select({id:$.id,projectPath:$.projectPath,source:$.source,status:$.status}).from($).where(Ln(Oe($.userId,t),Oe($.instructionId,n),Oe($.status,"running"))),he=me.length>0||B.length>0?{verdicts:me,experiments:B}:null;return e.json({instructionId:n,instructionName:U?.name??"Unknown",verdict:E,segments:S,harnessSegments:R,autoAdded:te,randomised:he,with:W,without:q,comparison:{outcomeScoreDelta:f.avgOutcomeScore!=null&&_.avgOutcomeScore!=null?Math.round((f.avgOutcomeScore-_.avgOutcomeScore)*100)/100:null,toolErrorsDelta:f.avgToolErrors!=null&&_.avgToolErrors!=null?Math.round((f.avgToolErrors-_.avgToolErrors)*10)/10:null,durationDelta:f.avgDurationMinutes!=null&&_.avgDurationMinutes!=null?Math.round((f.avgDurationMinutes-_.avgDurationMinutes)*10)/10:null}})});Hs.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:yr.versionOrdinal,contentHash:yr.contentHash,firstSeenAt:yr.firstSeenAt,contentLength:In`COALESCE(LENGTH(${yr.content}), 0)::int`}).from(yr).where(Oe(yr.instructionId,n)).orderBy(yr.versionOrdinal),o=await d.select({id:y.id,projectId:y.projectId,analysis:y.analysis,startedAt:y.startedAt,version:ne.treatmentVersion}).from(y).innerJoin(ne,Oe(ne.sessionId,y.id)).where(Ln(Oe(y.userId,t),Oe(ne.treatmentType,"instruction"),Oe(ne.treatmentId,n),In`${ne.treatmentVersion} > 0`)),s=new Map;for(let b of o){let A=s.get(b.version)??[];A.push(b),s.set(b.version,A)}let i=r.map(b=>({version:b.versionOrdinal,contentHash:b.contentHash,firstSeenAt:b.firstSeenAt,sessions:s.get(b.versionOrdinal)?.length??0,replayable:Number(b.contentLength)>0})),a=i.filter(b=>b.sessions>0).map(b=>b.version).sort((b,A)=>b-A),u=Number(e.req.query("version")),l=Number(e.req.query("baselineVersion")),p=Number.isFinite(u)&&u>0?u:a.at(-1),f=Number.isFinite(l)&&l>0?l:a.filter(b=>b!==p).at(-1);if(p==null||f==null)return e.json({instructionId:n,versions:i,version:p??null,baselineVersion:f??null,verdict:null,insufficientReason:"only one version of this instruction has attributed sessions; there is no prior version to compare against"});let _=c(b=>{if(!b)return"(no-date)";let A=typeof b=="string"?new Date(b):b;return Number.isNaN(A.getTime())?"(no-date)":`${A.getUTCFullYear()}-${String(A.getUTCMonth()+1).padStart(2,"0")}`},"monthKey"),v=c(b=>{if(!b)return 0;let A=typeof b=="string"?new Date(b):b;return Number.isNaN(A.getTime())?0:A.getTime()},"timeOf"),h=new Map,m=c((b,A)=>{let E=Us(b.analysis);if(E==null)return;let S=`${b.projectId??"(no-project)"}|${_(b.startedAt)}`,R=h.get(S);R||(R={key:S,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},h.set(S,R)),(A?R.withScores:R.withoutScores).push(E),(A?R.withTimes:R.withoutTimes).push(v(b.startedAt))},"add");for(let b of s.get(p)??[])m(b,!0);for(let b of s.get(f)??[])m(b,!1);let w=Pn([...h.values()],{baseline:"prior-version"}),[I]=await d.select({name:g.name}).from(g).where(Oe(g.id,n)).limit(1);return e.json({instructionId:n,instructionName:I?.name??"Unknown",version:p,baselineVersion:f,versions:i,verdict:w,replayableVersions:i.filter(b=>b.replayable).length})});Hs.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(Ln(Oe(F.id,n),Oe(F.userId,t))).limit(1);if(!r)return e.json({error:"memory not found"},404);let o=await d.select({sessionId:ne.sessionId,treatmentVersion:ne.treatmentVersion}).from(ne).where(Ln(Oe(ne.userId,t),Oe(ne.treatmentType,"memory"),Oe(ne.treatmentId,n))),s=new Map,i=new Set;for(let m of o){let w=s.get(m.treatmentVersion);w||(w=new Set,s.set(m.treatmentVersion,w)),w.add(m.sessionId),i.add(m.sessionId)}let a=await d.select({id:y.id,projectId:y.projectId,outcome:In`${y.analysis}->>'outcome'`,startedAt:y.startedAt,inputTokens:In`coalesce((${y.tokenUsage}->>'input_tokens')::numeric, 0)`,outputTokens:In`coalesce((${y.tokenUsage}->>'output_tokens')::numeric, 0)`}).from(y).where(Ln(Oe(y.userId,t),In`${y.analysis} is not null`)).orderBy(y.id),u=c((m,w)=>w>0?Math.round(m/w*100)/100:null,"avg"),l=c(()=>({n:0,scoreSum:0,scoreN:0,tokenSum:0}),"cohort"),p=c(m=>m.n>0?Math.round(m.tokenSum/m.n):null,"avgTokens"),f=c(m=>{let w=s.get(m)??new Set,I=new Map,b=l(),A=l();for(let W of a){let N=w.has(W.id);if(!N&&i.has(W.id))continue;let q=N?b:A;q.n++,q.tokenSum+=Number(W.inputTokens)+Number(W.outputTokens);let U=Us({outcome:W.outcome});if(U!=null){q.scoreSum+=U,q.scoreN++;let H=W.projectId??"(no-project)",te=I.get(H);te||(te={key:H,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},I.set(H,te)),(N?te.withScores:te.withoutScores).push(U),(N?te.withTimes:te.withoutTimes).push(W.startedAt?.getTime()??0)}}let E=Pn([...I.values()]),S={sessionCount:b.n,avgOutcomeScore:u(b.scoreSum,b.scoreN),avgTotalTokens:p(b)},R={sessionCount:A.n,avgOutcomeScore:u(A.scoreSum,A.scoreN),avgTotalTokens:p(A)},O={outcomeScoreDelta:S.avgOutcomeScore!=null&&R.avgOutcomeScore!=null?Math.round((S.avgOutcomeScore-R.avgOutcomeScore)*100)/100:null,totalTokensDelta:S.avgTotalTokens!=null&&R.avgTotalTokens!=null?S.avgTotalTokens-R.avgTotalTokens:null};return{verdict:E,with:S,without:R,comparison:O}},"computeVersion"),v=[...new Set([r.version,...s.keys()])].sort((m,w)=>w-m).map(m=>({version:m,isCurrent:m===r.version,...f(m)})),h=v.find(m=>m.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:m,isCurrent:w,verdict:I,with:b,without:A})=>({version:m,isCurrent:w,verdict:I,with:b,without:A})),cost:{estimated:!0}})});var NL=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;Hs.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=>NL.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:ne.sessionId,treatmentId:ne.treatmentId}).from(ne).where(Ln(Oe(ne.userId,t),Oe(ne.treatmentType,"suggestion"),kL(ne.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 d.select({id:y.id,projectId:y.projectId,outcome:In`${y.analysis}->>'outcome'`,startedAt:y.startedAt}).from(y).where(Ln(Oe(y.userId,t),In`${y.analysis} is not null`)).orderBy(y.id)).map(l=>({id:l.id,key:l.projectId??"(no-project)",score:Us({outcome:l.outcome}),time:l.startedAt?.getTime()??0})).filter(l=>l.score!=null),u={};for(let l of r){let p=s.get(l);if(!p||p.size===0){u[l]=Pn([]);continue}let f=new Map;for(let _ of a){let v=f.get(_.key);v||(v={key:_.key,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},f.set(_.key,v));let h=p.has(_.id);(h?v.withScores:v.withoutScores).push(_.score),(h?v.withTimes:v.withoutTimes).push(_.time)}u[l]=Pn([...f.values()],{iterations:2e3})}return e.json({impacts:u})});D();import{Hono as PL}from"hono";import{and as Bs,count as Ch,eq as Mn,inArray as sE,sql as Pr}from"drizzle-orm";D();import{sql as nE}from"drizzle-orm";var rE=30,Oh=14,jL=c(e=>({captureHealthy:!1,reason:e,candidates:[]}),"DARK");async function oE(e){let[t]=await d.execute(nE`
1265
+ `):[];for(let G of J_)V_.add(G.sessionId);for(let G of h){let _e=G.metadata?.local_session_meta,Qe=G.analysis,Ke=G.tokenUsage;if(G.tool&&(A[G.tool]=(A[G.tool]||0)+1),G.projectPath){let at=G.projectPath.split("/").pop()??G.projectPath;S[at]=(S[at]||0)+1}if(Ke&&!V_.has(G.id)){let at=Ke.input_tokens??0,Yt=Ke.output_tokens??0,An=Ke.cache_read_input_tokens??0,dn=Ke.cache_creation_5m??0,nr=Ke.cache_creation_1h??0,ut=Ke.cache_creation_input_tokens??0,xt=dn+nr||ut;F+=at,he+=Yt,D+=An,re+=xt;let Et=await I(Ke,eu,G.startedAt);Ce+=Et.inputUsd,St+=Et.outputUsd,le+=Et.cacheReadUsd,de+=Et.cacheWriteUsd;let gn=Et.inputUsd+Et.outputUsd+Et.cacheReadUsd+Et.cacheWriteUsd,rs=G.tool??"unknown",X_=Ua[eu]??tu();nu(X_,at,Yt,An,xt,gn),Ua[eu]=X_;let Q_=Ha[rs]??tu();nu(Q_,at,Yt,An,xt,gn),Ha[rs]=Q_}if(_e){L++;let at=_e.user_message_count??0;V+=at,pe+=(_e.duration_minutes??0)/60,Se+=_e.git_commits??0,ze+=_e.git_pushes??0,rt+=_e.lines_added??0,Le+=_e.lines_removed??0,Xe+=_e.files_modified??0,be+=_e.tool_errors??0;let Yt=_e.tool_counts;if(Yt)for(let[Et,gn]of Object.entries(Yt))E[Et]=(E[Et]||0)+gn;let An=_e.languages;if(An)for(let[Et,gn]of Object.entries(An))b[Et]=(b[Et]||0)+gn;let dn=_e.message_hours;dn&&B.push(...dn);let nr=_e.tool_error_categories;if(nr)for(let[Et,gn]of Object.entries(nr))q[Et]=(q[Et]||0)+gn;let ut=_e.user_response_times;ut&&J.push(...ut),cn+=_e.user_interruptions??0,_e.uses_task_agent&&ht++,_e.uses_mcp&&jt++;let xt=_e.user_message_timestamps;xt&&xt.length>0&&ce.push({id:G.id,start:G.startedAt.toISOString(),timestamps:xt})}if(Qe)if(G.analyzedAt){tr++;let at=new Date(G.analyzedAt).getTime();($a===null||at<$a)&&($a=at),(qa===null||at>qa)&&(qa=at),at<AS&&co++}else fn++;if(Qe){j++;let at=Qe.goal_categories;if(at)for(let[ut,xt]of Object.entries(at))xt>0&&(T[ut]=(T[ut]||0)+xt);let Yt=Qe.outcome;Yt&&(P[Yt]=(P[Yt]||0)+1);let An=Qe.user_satisfaction;if(An)for(let[ut,xt]of Object.entries(An))xt>0&&(H[ut]=(H[ut]||0)+xt);let dn=Qe.session_type;dn&&(N[dn]=(N[dn]||0)+1);let nr=Qe.friction??Qe.friction_counts;if(nr)for(let[ut,xt]of Object.entries(nr))xt>0&&(U[ut]=(U[ut]||0)+xt);pp.length<50&&pp.push({id:G.id,externalId:G.externalSessionId,date:G.startedAt.toISOString().split("T")[0]??"",summary:Qe.brief_summary??"",goal:Qe.underlying_goal,outcome:Yt})}}let ru=h.map(G=>G.startedAt.toISOString()).sort(),fp=new Set(ru.map(G=>G.split("T")[0]));for(let G of J_){let _e=Number(G.inputTokens)||0,Qe=Number(G.outputTokens)||0,Ke=Number(G.cacheReadTokens)||0,at=Number(G.cacheWrite5m)||0,Yt=Number(G.cacheWrite1h)||0,An=Number(G.cacheWriteLegacy)||0,dn=at+Yt||An,nr=SS.get(G.sessionId)??new Date,ut=await I({input_tokens:_e,output_tokens:Qe,cache_read_input_tokens:Ke,cache_creation_input_tokens:dn},G.model,nr);Ce+=ut.inputUsd,St+=ut.outputUsd,le+=ut.cacheReadUsd,de+=ut.cacheWriteUsd,F+=_e,he+=Qe,D+=Ke,re+=dn;let xt=ut.inputUsd+ut.outputUsd+ut.cacheReadUsd+ut.cacheWriteUsd,Et=Ua[G.model]??tu();nu(Et,_e,Qe,Ke,dn,xt),Ua[G.model]=Et;let gn=xS.get(G.sessionId)??"unknown",rs=Ha[gn]??tu();nu(rs,_e,Qe,Ke,dn,xt),Ha[gn]=rs}let ns=c(G=>Math.round(G*100)/100,"round2"),RS=Ce+St+le+de,TS=ns(RS),kS={inputUsd:ns(Ce),outputUsd:ns(St),cacheReadUsd:ns(le),cacheWriteUsd:ns(de)},gp={};for(let[G,_e]of Object.entries(Ua))gp[G]={input_tokens:_e.input_tokens,output_tokens:_e.output_tokens,cache_read_tokens:_e.cache_read_tokens,cache_write_tokens:_e.cache_write_tokens,cost_usd:ns(_e.cost_usd)};let hp={};for(let[G,_e]of Object.entries(Ha))hp[G]={input_tokens:_e.input_tokens,output_tokens:_e.output_tokens,cache_read_tokens:_e.cache_read_tokens,cache_write_tokens:_e.cache_write_tokens,cost_usd:ns(_e.cost_usd)};let uo={"2-10s":0,"10-30s":0,"30s-1m":0,"1-2m":0,"2-5m":0,"5-15m":0,">15m":0};for(let G of J)G<10?uo["2-10s"]++:G<30?uo["10-30s"]++:G<60?uo["30s-1m"]++:G<120?uo["1-2m"]++:G<300?uo["2-5m"]++:G<900?uo["5-15m"]++:uo[">15m"]++;let Xs=[...J].sort((G,_e)=>G-_e),NS=Xs.length>0?Xs[Math.floor(Xs.length/2)]:0,jS=Xs.length>0?Xs.reduce((G,_e)=>G+_e,0)/Xs.length:0,K_=0,G_=0;if(ce.length>1){let G=ce.flatMap(Qe=>Qe.timestamps.map(Ke=>({sessionId:Qe.id,time:new Date(Ke).getTime()}))).sort((Qe,Ke)=>Qe.time-Ke.time),_e=new Set;for(let Qe=0;Qe<G.length-1;Qe++){let Ke=G[Qe],at=G[Qe+1];Ke.sessionId!==at.sessionId&&at.time-Ke.time<1800*1e3&&(_e.add(Ke.sessionId),_e.add(at.sessionId),K_++)}G_=_e.size}let Qs={computed:!0,total_sessions:h.length,window:{since:o??null,until:s??null},truncated:h.length>=f,sessions_with_meta:L,sessions_with_analysis:j,tools_used:A,date_range:{start:ru[0]?.split("T")[0]??"",end:ru[ru.length-1]?.split("T")[0]??""},total_messages:V,total_duration_hours:Math.round(pe*10)/10,total_input_tokens:F,total_output_tokens:he,total_cache_read_tokens:D,total_cache_write_tokens:re,estimated_cost_usd:TS,estimated_cost_breakdown:kS,estimated_cost_by_model:Object.keys(gp).length>0?gp:void 0,estimated_cost_by_tool:Object.keys(hp).length>0?hp:void 0,tool_counts:E,languages:b,git_commits:Se,git_pushes:ze,projects:S,goal_categories:T,outcomes:P,satisfaction:H,session_types:N,friction:U,tool_error_categories:q,session_summaries:pp,total_tool_errors:be,total_interruptions:cn,total_lines_added:rt,total_lines_removed:Le,total_files_modified:Xe,days_active:fp.size,messages_per_day:fp.size>0?Math.round(V/fp.size*10)/10:0,message_hours:B,sessions_using_task_agent:ht,sessions_using_mcp:jt,response_time:{median_seconds:Math.round(NS*10)/10,avg_seconds:Math.round(jS*10)/10,histogram:uo,total_samples:J.length},parallel_sessions:{events:K_,sessions_involved:G_},analysis_freshness:{with_timestamp:tr,pre_instrumentation:fn,stale_30d:co,oldest_analyzed_at:$a?new Date($a).toISOString():null,newest_analyzed_at:qa?new Date(qa).toISOString():null}};Qs.autoAddAvailable=!!(n&&xL.existsSync(RL.join(n,"CLAUDE.md")));let ou=[Ho(z.userId,t),Ho(z.status,"completed")];r?ou.push(Ho(z.projectId,r)):n?ou.push(uE(z.projectPath,`%${ct(n)}%`)):ou.push(ha`${z.projectPath} IS NULL`);let[Y_]=await Fe.select({id:z.id,result:z.result}).from(z).where(qh(...ou)).orderBy(Uh(z.completedAt)).limit(1),PS=Y_?.result,_p=Wf(PS?.recommendations);if(_p&&Object.keys(_p).length>0)Qs.recommendations=_p,Qs._recsJobId=Y_?.id??null;else if(h.length>=3){let G=jL({totalSessions:h.length,sessionsWithAnalysis:j,toolCounts:E,toolErrorCategories:q,friction:U,outcomes:P,sessionsUsingMcp:jt,sessionsUsingTaskAgent:ht,totalToolErrors:be,totalMessages:V,totalDurationHours:pe});G&&(Qs.recommendations=G)}return Nm.size>1e3&&Nm.clear(),Nm.set(a,{at:Date.now(),data:Qs}),Qs}),{_recsJobId:p,..._}=m;if(_.recommendations)try{_.recommendations=await sE({userId:t,projectPath:n,jobId:p??null,recs:_.recommendations})}catch{}return e.json(_)});Sd.get("/insights/recommendations/history",async e=>{let t=e.get("userId"),n=e.req.query("projectPath")??"",r=await u.select({category:Re.category,label:Re.label,timesGenerated:Re.timesGenerated,dismissedAt:Re.dismissedAt,lastSeenAt:Re.lastSeenAt}).from(Re).where(qh(Ho(Re.userId,t),Ho(Re.projectPath,n))).orderBy(ha`${Re.dismissedAt} IS NULL`,Uh(Re.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}))})});Sd.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 iE({userId:t,projectPath:o,contentHash:r}),e.json({ok:!0})});O();import{Hono as OL}from"hono";import{and as Mn,count as CL,eq as Oe,ilike as LL,inArray as ML,sql as In}from"drizzle-orm";vs();var Bs=new OL,Hs=c(e=>ws(e?.outcome??null),"scoreOf");Bs.get("/insights/linked-instructions",async e=>{let t=e.get("userId"),n=e.req.query("projectPath"),r=Number(e.req.query("limit")??20),o=[Oe(y.userId,t)];n&&o.push(LL(y.projectPath,`%${ct(n)}%`));let s=await u.select({id:g.id,name:g.name,contentHash:g.contentHash,source:In`${g.frontmatter}->>'source'`,linkedSessions:In`COUNT(DISTINCT ${ie.sessionId})`}).from(ie).innerJoin(y,Oe(y.id,ie.sessionId)).innerJoin(g,Oe(g.id,ie.instructionId)).where(Mn(...o)).groupBy(g.id,g.name,g.contentHash,In`${g.frontmatter}->>'source'`).orderBy(In`COUNT(DISTINCT ${ie.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)})))});Bs.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: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(ne,Oe(ne.sessionId,y.id)).where(Mn(Oe(y.userId,t),Oe(ne.treatmentType,"instruction"),Oe(ne.treatmentId,n))),o=r.map(D=>D.id),s=await u.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(Mn(Oe(y.userId,t),In`${y.analysis} IS NOT NULL`)),i=await u.selectDistinct({sessionId:ne.sessionId}).from(ne).where(Mn(Oe(ne.userId,t),Oe(ne.treatmentType,"instruction"))),a=new Set(i.map(D=>D.sessionId)),d=new Set(o),l=s.filter(D=>!d.has(D.id)&&a.has(D.id));function m(D){let re=0,Ce=0,St=0,le=0,de=[],Se={},ze={achieved:1,fully_achieved:1,mostly_achieved:.75,partially_achieved:.5,unclear_from_transcript:.25,not_achieved:0,abandoned:0};for(let rt of D){let Le=rt.analysis,Xe=rt.metadata?.local_session_meta;if(Le?.outcome){let cn=ze[Le.outcome];cn!==void 0&&de.push(cn)}Xe&&(le++,re+=Xe.tool_errors??0,Ce+=Xe.duration_minutes??0,St+=(Xe.lines_added??0)+(Xe.lines_removed??0));let be=Le?.goal_categories??{};for(let[cn,L]of Object.entries(be))L>0&&(Se[cn]=(Se[cn]||0)+L)}return{sessionCount:D.length,enrichedCount:le,outcomeScores:de,avgOutcomeScore:de.length>0?Math.round(de.reduce((rt,Le)=>rt+Le,0)/de.length*100)/100:null,avgToolErrors:le>0?Math.round(re/le*10)/10:null,avgDurationMinutes:le>0?Math.round(Ce/le*10)/10:null,avgLinesChanged:le>0?Math.round(St/le):null,topGoalCategories:Se}}c(m,"computeCohort");let p=m(r),_=m(l),w=c(D=>{if(!D)return"(no-date)";let re=typeof D=="string"?new Date(D):D;return Number.isNaN(re.getTime())?"(no-date)":`${re.getUTCFullYear()}-${String(re.getUTCMonth()+1).padStart(2,"0")}`},"monthKey"),f=c(D=>{if(!D)return 0;let re=typeof D=="string"?new Date(D):D;return Number.isNaN(re.getTime())?0:re.getTime()},"timeOf"),h=new Map,v=c((D,re,Ce,St)=>{let le=`${D??"(no-project)"}|${w(re)}`,de=h.get(le);de||(de={key:le,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},h.set(le,de)),(St?de.withScores:de.withoutScores).push(Ce),(St?de.withTimes:de.withoutTimes).push(f(re))},"addToStratum");for(let D of r){let re=Hs(D.analysis);re!=null&&v(D.projectId,D.startedAt,re,!0)}for(let D of l){let re=Hs(D.analysis);re!=null&&v(D.projectId,D.startedAt,re,!1)}let I=c(D=>{let re=new Map,Ce=new Set,St=c((le,de,Se,ze,rt)=>{let Le=re.get(le);Le||(Le=new Map,re.set(le,Le));let Xe=`${de??"(no-project)"}|${w(Se)}`,be=Le.get(Xe);be||(be={key:Xe,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},Le.set(Xe,be)),(rt?be.withScores:be.withoutScores).push(ze),(rt?be.withTimes:be.withoutTimes).push(f(Se))},"add");for(let le of r){let de=Hs(le.analysis),Se=D(le);de==null||!Se||(Ce.add(Se),St(Se,le.projectId,le.startedAt,de,!0))}for(let le of l){let de=Hs(le.analysis),Se=D(le);de==null||!Se||!Ce.has(Se)||St(Se,le.projectId,le.startedAt,de,!1)}return[...Ce].map(le=>({segment:le,strata:[...re.get(le)?.values()??[]]}))},"buildAxisSegments"),E=c(D=>[...D].sort((re,Ce)=>Number(Ce.verdict.sufficient)-Number(re.verdict.sufficient)||Ce.verdict.nWith-re.verdict.nWith),"sortSegs"),A=pg([...h.values()],I(D=>xs(D.model))),b=A.overall,S=E(A.segments).map(D=>({model:D.segment,verdict:D.verdict})),T=E(hl(I(D=>D.tool??null))).map(D=>({harness:D.segment,verdict:D.verdict})),{outcomeScores:P,...H}=p,{outcomeScores:N,...U}=_,[q]=await u.select({name:g.name}).from(g).where(Oe(g.id,n)).limit(1),[B]=await u.select({n:CL(),lastAssignedAt:In`max(${Mt.assignedAt})`}).from(Mt).where(Mn(Oe(Mt.userId,t),Oe(Mt.treatmentType,"instruction"),Oe(Mt.treatmentId,n),Oe(Mt.method,"auto_added"))),J=B&&Number(B.n)>0?{count:Number(B.n),lastAssignedAt:B.lastAssignedAt}:null,[ce]=await u.select({content:g.content,name:g.name}).from(g).where(Oe(g.id,n)),V=Yr(ce?.content,ce?.name),pe=V?(await u.select({projectPath:Z.projectPath,decision:Z.decision,delta:Z.delta,ciLower:Z.ciLower,ciUpper:Z.ciUpper,nTreated:Z.nTreated,nControl:Z.nControl,segment:Z.segment,decidedAt:Z.decidedAt}).from(Z).where(Mn(Oe(Z.userId,t),Oe(Z.instructionId,n),Oe(Z.contentHash,V)))).map(D=>({projectPath:D.projectPath,decision:D.decision,delta:Number(D.delta),ciLower:Number(D.ciLower),ciUpper:Number(D.ciUpper),nTreated:D.nTreated,nControl:D.nControl,segment:D.segment,decidedAt:D.decidedAt})):[],F=await u.select({id:$.id,projectPath:$.projectPath,source:$.source,status:$.status}).from($).where(Mn(Oe($.userId,t),Oe($.instructionId,n),Oe($.status,"running"))),he=pe.length>0||F.length>0?{verdicts:pe,experiments:F}:null;return e.json({instructionId:n,instructionName:q?.name??"Unknown",verdict:b,segments:S,harnessSegments:T,autoAdded:J,randomised:he,with:H,without:U,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}})});Bs.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:wr.versionOrdinal,contentHash:wr.contentHash,firstSeenAt:wr.firstSeenAt,contentLength:In`COALESCE(LENGTH(${wr.content}), 0)::int`}).from(wr).where(Oe(wr.instructionId,n)).orderBy(wr.versionOrdinal),o=await u.select({id:y.id,projectId:y.projectId,analysis:y.analysis,startedAt:y.startedAt,version:ne.treatmentVersion}).from(y).innerJoin(ne,Oe(ne.sessionId,y.id)).where(Mn(Oe(y.userId,t),Oe(ne.treatmentType,"instruction"),Oe(ne.treatmentId,n),In`${ne.treatmentVersion} > 0`)),s=new Map;for(let E of o){let A=s.get(E.version)??[];A.push(E),s.set(E.version,A)}let i=r.map(E=>({version:E.versionOrdinal,contentHash:E.contentHash,firstSeenAt:E.firstSeenAt,sessions:s.get(E.versionOrdinal)?.length??0,replayable:Number(E.contentLength)>0})),a=i.filter(E=>E.sessions>0).map(E=>E.version).sort((E,A)=>E-A),d=Number(e.req.query("version")),l=Number(e.req.query("baselineVersion")),m=Number.isFinite(d)&&d>0?d:a.at(-1),p=Number.isFinite(l)&&l>0?l:a.filter(E=>E!==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 _=c(E=>{if(!E)return"(no-date)";let A=typeof E=="string"?new Date(E):E;return Number.isNaN(A.getTime())?"(no-date)":`${A.getUTCFullYear()}-${String(A.getUTCMonth()+1).padStart(2,"0")}`},"monthKey"),w=c(E=>{if(!E)return 0;let A=typeof E=="string"?new Date(E):E;return Number.isNaN(A.getTime())?0:A.getTime()},"timeOf"),f=new Map,h=c((E,A)=>{let b=Hs(E.analysis);if(b==null)return;let S=`${E.projectId??"(no-project)"}|${_(E.startedAt)}`,T=f.get(S);T||(T={key:S,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},f.set(S,T)),(A?T.withScores:T.withoutScores).push(b),(A?T.withTimes:T.withoutTimes).push(w(E.startedAt))},"add");for(let E of s.get(m)??[])h(E,!0);for(let E of s.get(p)??[])h(E,!1);let v=Pn([...f.values()],{baseline:"prior-version"}),[I]=await u.select({name:g.name}).from(g).where(Oe(g.id,n)).limit(1);return e.json({instructionId:n,instructionName:I?.name??"Unknown",version:m,baselineVersion:p,versions:i,verdict:v,replayableVersions:i.filter(E=>E.replayable).length})});Bs.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:W.id,title:W.title,kind:W.kind,version:W.version,status:W.status}).from(W).where(Mn(Oe(W.id,n),Oe(W.userId,t))).limit(1);if(!r)return e.json({error:"memory not found"},404);let o=await u.select({sessionId:ne.sessionId,treatmentVersion:ne.treatmentVersion}).from(ne).where(Mn(Oe(ne.userId,t),Oe(ne.treatmentType,"memory"),Oe(ne.treatmentId,n))),s=new Map,i=new Set;for(let h of o){let v=s.get(h.treatmentVersion);v||(v=new Set,s.set(h.treatmentVersion,v)),v.add(h.sessionId),i.add(h.sessionId)}let a=await u.select({id:y.id,projectId:y.projectId,outcome:In`${y.analysis}->>'outcome'`,startedAt:y.startedAt,inputTokens:In`coalesce((${y.tokenUsage}->>'input_tokens')::numeric, 0)`,outputTokens:In`coalesce((${y.tokenUsage}->>'output_tokens')::numeric, 0)`}).from(y).where(Mn(Oe(y.userId,t),In`${y.analysis} is not null`)).orderBy(y.id),d=c((h,v)=>v>0?Math.round(h/v*100)/100:null,"avg"),l=c(()=>({n:0,scoreSum:0,scoreN:0,tokenSum:0}),"cohort"),m=c(h=>h.n>0?Math.round(h.tokenSum/h.n):null,"avgTokens"),p=c(h=>{let v=s.get(h)??new Set,I=new Map,E=l(),A=l();for(let H of a){let N=v.has(H.id);if(!N&&i.has(H.id))continue;let U=N?E:A;U.n++,U.tokenSum+=Number(H.inputTokens)+Number(H.outputTokens);let q=Hs({outcome:H.outcome});if(q!=null){U.scoreSum+=q,U.scoreN++;let B=H.projectId??"(no-project)",J=I.get(B);J||(J={key:B,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},I.set(B,J)),(N?J.withScores:J.withoutScores).push(q),(N?J.withTimes:J.withoutTimes).push(H.startedAt?.getTime()??0)}}let b=Pn([...I.values()]),S={sessionCount:E.n,avgOutcomeScore:d(E.scoreSum,E.scoreN),avgTotalTokens:m(E)},T={sessionCount:A.n,avgOutcomeScore:d(A.scoreSum,A.scoreN),avgTotalTokens:m(A)},P={outcomeScoreDelta:S.avgOutcomeScore!=null&&T.avgOutcomeScore!=null?Math.round((S.avgOutcomeScore-T.avgOutcomeScore)*100)/100:null,totalTokensDelta:S.avgTotalTokens!=null&&T.avgTotalTokens!=null?S.avgTotalTokens-T.avgTotalTokens:null};return{verdict:b,with:S,without:T,comparison:P}},"computeVersion"),w=[...new Set([r.version,...s.keys()])].sort((h,v)=>v-h).map(h=>({version:h,isCurrent:h===r.version,...p(h)})),f=w.find(h=>h.isCurrent);return e.json({memoryId:n,memoryTitle:r.title,memoryKind:r.kind,memoryVersion:r.version,verdict:f.verdict,with:f.with,without:f.without,comparison:f.comparison,versions:w.map(({version:h,isCurrent:v,verdict:I,with:E,without:A})=>({version:h,isCurrent:v,verdict:I,with:E,without:A})),cost:{estimated:!0}})});var $L=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;Bs.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=>$L.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:ne.sessionId,treatmentId:ne.treatmentId}).from(ne).where(Mn(Oe(ne.userId,t),Oe(ne.treatmentType,"suggestion"),ML(ne.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 a=(await u.select({id:y.id,projectId:y.projectId,outcome:In`${y.analysis}->>'outcome'`,startedAt:y.startedAt}).from(y).where(Mn(Oe(y.userId,t),In`${y.analysis} is not null`)).orderBy(y.id)).map(l=>({id:l.id,key:l.projectId??"(no-project)",score:Hs({outcome:l.outcome}),time:l.startedAt?.getTime()??0})).filter(l=>l.score!=null),d={};for(let l of r){let m=s.get(l);if(!m||m.size===0){d[l]=Pn([]);continue}let p=new Map;for(let _ of a){let w=p.get(_.key);w||(w={key:_.key,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},p.set(_.key,w));let f=m.has(_.id);(f?w.withScores:w.withoutScores).push(_.score),(f?w.withTimes:w.withoutTimes).push(_.time)}d[l]=Pn([...p.values()],{iterations:2e3})}return e.json({impacts:d})});O();import{Hono as UL}from"hono";import{and as Fs,count as Bh,eq as $n,inArray as fE,sql as Dr}from"drizzle-orm";O();import{sql as lE}from"drizzle-orm";var mE=30,Hh=14,qL=c(e=>({captureHealthy:!1,reason:e,candidates:[]}),"DARK");async function pE(e){let[t]=await u.execute(lE`
1261
1266
  SELECT count(*)::int AS n
1262
1267
  FROM public.skill_usage
1263
1268
  WHERE user_id = ${e}::uuid
1264
- AND invoked_at > now() - make_interval(days => ${Oh})
1265
- `);return!t||t.n===0?jL(`No skill invocations captured in ${Oh} days \u2014 cannot tell "unused" from "uncaptured". Skill grooming paused (never trust a dark pipeline).`):{captureHealthy:!0,reason:null,candidates:(await d.execute(nE`
1269
+ AND invoked_at > now() - make_interval(days => ${Hh})
1270
+ `);return!t||t.n===0?qL(`No skill invocations captured in ${Hh} days \u2014 cannot tell "unused" from "uncaptured". Skill grooming paused (never trust a dark pipeline).`):{captureHealthy:!0,reason:null,candidates:(await u.execute(lE`
1266
1271
  SELECT
1267
1272
  i.id AS instruction_id,
1268
1273
  i.name AS name,
@@ -1291,25 +1296,25 @@ ${r}`).digest("hex")}c(G0,"recommendationEntryHash");var sL=new Set(["42883","42
1291
1296
  AND i.type = 'skill'
1292
1297
  AND i.archived = false
1293
1298
  -- Old enough to have had a fair chance to be used.
1294
- AND i.created_at < now() - make_interval(days => ${rE})
1299
+ AND i.created_at < now() - make_interval(days => ${mE})
1295
1300
  AND coalesce(u.invocations, 0) = 0
1296
1301
  ORDER BY i.created_at
1297
- `)).map(r=>({instructionId:r.instruction_id,name:r.name,installedAt:r.installed_at,lastInvokedAt:r.last_invoked_at,invocations:r.invocations,installedByLoop:r.installed_by_loop,reason:`installed ${rE}+ days ago and never invoked \u2014 skill capture is live (other skills were invoked in the last ${Oh} days), so this is an absence of use rather than an absence of data`}))}}c(oE,"loadUnusedSkillCandidates");var Mh=new PL,Lh=/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;Mh.get("/insights/groom-candidates",async e=>{let t=e.get("userId"),[n]=await d.select({n:Ch()}).from(y).where(Bs(Mn(y.userId,t),Pr`${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:Pr`max(${ne.exposedAt})`,totalExposures:Ch(ne.id)}).from(g).leftJoin(ne,Bs(Mn(ne.treatmentId,g.id),Mn(ne.userId,t))).where(Bs(Mn(g.createdBy,t),Mn(g.archived,!1),Pr`${g.createdAt} < now() - interval '30 days'`,Pr`${g.type} is distinct from 'skill'`)).groupBy(g.id).having(Pr`max(${ne.exposedAt}) is null or max(${ne.exposedAt}) < now() - interval '30 days'`),d.select({id:g.id,name:g.name,type:g.type}).from(g).where(Bs(Mn(g.createdBy,t),Mn(g.archived,!1))),d.select({treatmentId:ne.treatmentId,sessionId:ne.sessionId}).from(ne).where(Bs(Mn(ne.userId,t),Mn(ne.treatmentType,"instruction"),Pr`${ne.sessionId} is not null`)),d.select({id:y.id,projectId:y.projectId,outcome:Pr`${y.analysis}->>'outcome'`,startedAt:y.startedAt}).from(y).where(Bs(Mn(y.userId,t),Pr`${y.analysis} is not null`))]),a=await d.select({treatmentId:ne.treatmentId,projectId:y.projectId,n:Ch()}).from(ne).innerJoin(y,Mn(y.id,ne.sessionId)).where(Bs(Mn(ne.userId,t),Mn(ne.treatmentType,"instruction"),Pr`${y.projectId} is not null`)).groupBy(ne.treatmentId,y.projectId),u=new Map;for(let N of a){if(!N.projectId)continue;let q=Number(N.n),U=u.get(N.treatmentId);(!U||q>U.n||q===U.n&&N.projectId<U.projectId)&&u.set(N.treatmentId,{projectId:N.projectId,n:q})}let l=c(N=>u.get(N)?.projectId??null,"topProjectId"),p=r.filter(N=>!(N.content&&Lh.test(N.content))),f=r.length-p.length,_=p.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,q)=>N.totalExposures-q.totalExposures).slice(0,50),v=new Map;for(let N of i){let q=N.outcome!=null?Si[N.outcome]:void 0;q!==void 0&&v.set(N.id,{projectId:N.projectId,score:q,time:N.startedAt?.getTime()??0})}let h=new Map;for(let N of s){if(!N.sessionId)continue;let q=h.get(N.treatmentId);q||(q=new Set,h.set(N.treatmentId,q)),q.add(N.sessionId)}let m=[],w=[];for(let N of o){let q=h.get(N.id);if(!q)continue;let U=0;for(let K of q)v.has(K)&&U++;if(U<10)continue;let H=new Map;for(let[K,{projectId:me,score:B,time:he}]of v){let P=me??"(no-project)",re=H.get(P);re||(re={key:P,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},H.set(P,re));let Ce=q.has(K);(Ce?re.withScores:re.withoutScores).push(B),(Ce?re.withTimes:re.withoutTimes).push(he)}let te=Pn([...H.values()]),de=_s(te);de==="harmful"?m.push({id:N.id,name:N.name,type:N.type,verdict:te,exposures:te.nWith,topProjectId:l(N.id)}):de==="neutral"&&w.push({id:N.id,name:N.name,type:N.type,verdict:te,exposures:te.nWith,topProjectId:l(N.id)})}let I=0,b=m;if(m.length>0){let N=await d.select({id:g.id,content:g.content}).from(g).where(sE(g.id,m.map(U=>U.id))),q=new Map(N.map(U=>[U.id,U.content]));b=m.filter(U=>{let H=q.get(U.id);return H&&Lh.test(H)?(I++,!1):!0})}b.sort((N,q)=>N.verdict.delta-q.verdict.delta);let A=1500,E=[],S=0;if(w.length>0){let N=await d.select({id:g.id,estimatedTokens:Pr`(length(${g.content}) / 4)::int`,content:g.content}).from(g).where(sE(g.id,w.map(U=>U.id))),q=new Map(N.map(U=>[U.id,U]));for(let U of w){let H=q.get(U.id),te=Number(H?.estimatedTokens??0);if(te<A)continue;let de=!!(H?.content&&Lh.test(H.content));de&&S++,E.push({...U,estimatedTokens:te,containsSafetyLanguage:de})}E.sort((U,H)=>H.estimatedTokens-U.estimatedTokens),E=E.slice(0,20)}let R=new Set(b.map(N=>N.id)),O=_.filter(N=>!R.has(N.id)),W=await oE(t);return e.json({captureHealthy:!0,candidates:O,safetyGuarded:f,harmful:b,harmfulSafetyGuarded:I,bloated:E,trimSafetyFlagged:S,unusedSkills:W.candidates,skillCaptureHealthy:W.captureHealthy,skillCaptureReason:W.reason})});D();import{Hono as DL}from"hono";import{z as _a}from"zod";import{and as mr,desc as iE,eq as wt,getTableColumns as OL,gte as $h,ilike as Sp,isNull as CL,ne as LL,or as ML,sql as ya}from"drizzle-orm";var Uo=new DL;function $L(e,t){let n=t?Sp(z.projectPath,`%${ct(t)}%`):void 0;return e&&n?ML(wt(z.projectId,e),mr(CL(z.projectId),n)):e?wt(z.projectId,e):n}c($L,"insightsJobProjectScope");Uo.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 Bn(o);if(r==="daily"){let p=new Date;p.setHours(0,0,0,0);let f=o,_=[wt(z.userId,t),$h(z.createdAt,p)];s?_.push(wt(z.projectId,s)):f?_.push(Sp(z.projectPath,`%${ct(f)}%`)):_.push(ya`${z.projectPath} IS NULL`);let[v]=await d.select({id:z.id}).from(z).where(mr(..._)).limit(1);if(v)return e.json({skipped:!0,reason:"already_generated_today",existingJobId:v.id},200);let h=[wt(z.userId,t),wt(z.status,"completed")];s?h.push(wt(z.projectId,s)):f?h.push(Sp(z.projectPath,`%${ct(f)}%`)):h.push(ya`${z.projectPath} IS NULL`);let[m]=await d.select({completedAt:z.completedAt}).from(z).where(mr(...h)).orderBy(iE(z.completedAt)).limit(1),w=m?.completedAt??new Date(0),I=[wt(y.userId,t),$h(y.startedAt,w)];s?I.push(wt(y.projectId,s)):f&&I.push(Sp(y.projectPath,`%${ct(f)}%`));let[{count:b}]=await d.select({count:ya`COUNT(*)`}).from(y).where(mr(...I));if(Number(b)<5)return e.json({skipped:!0,reason:"insufficient_sessions",sessionsSinceLastRun:Number(b),threshold:5},200)}let i=await Ol(s,o),{id:a,noLiveWorker:u}=await Ot({taskName:"process_insights",payload:{projectPath:i,projectId:s},userId:t,mirror:{userId:t,projectPath:i,projectId:s}}),[l]=await d.select().from(z).where(wt(z.id,a));return e.json({...l,noLiveWorker:u},201)});Uo.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 Bn(r??null),s=[wt(z.userId,t)],i=$L(o,r??null);i&&s.push(i);let{result:a,...u}=OL(z),l=await d.select(u).from(z).where(mr(...s)).orderBy(iE(z.createdAt)).limit(n);return e.json(l)});Uo.get("/insights-jobs/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select().from(z).where(mr(wt(z.id,n),wt(z.userId,t)));return r?e.json(r):e.json({error:"Job not found"},404)});Uo.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(z).set({status:s,progress:r.progress,updatedAt:new Date}).where(mr(wt(z.id,n),wt(z.userId,t))).returning();return i?e.json(i):e.json({error:"Job not found"},404)});var qL=_a.object({status:_a.enum(["running","completed","failed"]).optional(),attempts:_a.number().int().nonnegative().optional(),error:_a.string().optional(),result:_a.record(_a.unknown()).optional()});Uo.patch("/insights-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 d.update(z).set(o).where(mr(wt(z.id,n),wt(z.userId,t),LL(z.status,"cancelled"))).returning();if(!s){let[i]=await d.select().from(z).where(mr(wt(z.id,n),wt(z.userId,t)));return i?e.json(i):e.json({error:"Job not found"},404)}return e.json(s)});var UL=14400*1e3;Uo.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()-UL),i=await d.select({projectId:y.projectId,sessionCount:ya`COUNT(*)`}).from(y).where(mr(wt(y.userId,t),ya`${y.projectId} IS NOT NULL`)).groupBy(y.projectId).orderBy(ya`COUNT(*) DESC`),a=i.map(v=>v.projectId).filter(v=>!!v),u=new Map;if(a.length>0){let v=await d.execute(Fi(a));for(let h of v)u.set(h.project_id,h.path)}let l=[],p=[],f=[],_=!1;for(let v of i){if(Number(v.sessionCount)<r||!v.projectId)continue;let h=u.get(v.projectId);if(!h){p.push({projectPath:"<unknown>",reason:"no_checkout"});continue}try{if(!o){let[b]=await d.select({id:z.id}).from(z).where(mr(wt(z.userId,t),wt(z.status,"completed"),wt(z.projectPath,h),$h(z.completedAt,s))).limit(1);if(b){p.push({projectPath:h,reason:"fresh"});continue}}let{id:m,noLiveWorker:w}=await Ot({taskName:"process_insights",payload:{projectPath:h},userId:t,mirror:{userId:t,projectPath:h}});w&&(_=!0);let[I]=await d.select().from(z).where(wt(z.id,m));I&&l.push(I)}catch(m){let w=m instanceof Error?m.message:String(m);f.push({projectPath:h,error:w})}}return e.json({created:l.length,jobs:l,skipped:p,errors:f,noLiveWorker:_},201)});D();import xp from"node:fs";import HL from"node:path";import{createHash as BL}from"node:crypto";import{Hono as FL}from"hono";import{and as aE,desc as WL,eq as Au}from"drizzle-orm";var qh=new FL;async function zL(e,t,n){try{let r=`${Kd.claude_md}::${n}`,[o]=await d.select({id:g.id,version:g.version}).from(g).where(aE(Au(g.contextIdentity,r),Au(g.createdBy,e),Au(g.archived,!1))).orderBy(WL(g.createdAt)).limit(1);if(!o){let a=xp.readFileSync(n,"utf-8"),u=BL("sha256").update(a).digest("hex"),l={name:n,description:"Project CLAUDE.md",type:"context_file",scope:"personal",version:"1.0.0"},[p]=await d.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:u,contextIdentity:r,createdBy:e}).onConflictDoNothing().returning({id:g.id,version:g.version});o=p}if(!o)return null;let s=await Bn(t),[i]=await d.insert(Lt).values({userId:e,treatmentType:"instruction",treatmentId:o.id,projectId:s??void 0,assignedBy:e,method:"auto_added"}).returning({id:Lt.id});return i?.id??null}catch(r){return console.warn("[auto-add] failed to record treatment_assignment:",r instanceof Error?r.message:r),null}}c(zL,"recordAutoAddAssignment");qh.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(aE(Au(y.userId,t),Au(y.projectPath,r))).limit(1);if(!s)return e.json({error:"projectPath is not a known project for this user"},403);let i=HL.join(r,"CLAUDE.md");if(!xp.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=xp.readFileSync(i,"utf-8");if(a.includes(o.trim()))return e.json({success:!1,reason:"already_present"},200);let u=a.endsWith(`
1302
+ `)).map(r=>({instructionId:r.instruction_id,name:r.name,installedAt:r.installed_at,lastInvokedAt:r.last_invoked_at,invocations:r.invocations,installedByLoop:r.installed_by_loop,reason:`installed ${mE}+ days ago and never invoked \u2014 skill capture is live (other skills were invoked in the last ${Hh} days), so this is an absence of use rather than an absence of data`}))}}c(pE,"loadUnusedSkillCandidates");var Wh=new UL,Fh=/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;Wh.get("/insights/groom-candidates",async e=>{let t=e.get("userId"),[n]=await u.select({n:Bh()}).from(y).where(Fs($n(y.userId,t),Dr`${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([u.select({id:g.id,name:g.name,type:g.type,content:g.content,lastExposedAt:Dr`max(${ne.exposedAt})`,totalExposures:Bh(ne.id)}).from(g).leftJoin(ne,Fs($n(ne.treatmentId,g.id),$n(ne.userId,t))).where(Fs($n(g.createdBy,t),$n(g.archived,!1),Dr`${g.createdAt} < now() - interval '30 days'`,Dr`${g.type} is distinct from 'skill'`)).groupBy(g.id).having(Dr`max(${ne.exposedAt}) is null or max(${ne.exposedAt}) < now() - interval '30 days'`),u.select({id:g.id,name:g.name,type:g.type}).from(g).where(Fs($n(g.createdBy,t),$n(g.archived,!1))),u.select({treatmentId:ne.treatmentId,sessionId:ne.sessionId}).from(ne).where(Fs($n(ne.userId,t),$n(ne.treatmentType,"instruction"),Dr`${ne.sessionId} is not null`)),u.select({id:y.id,projectId:y.projectId,outcome:Dr`${y.analysis}->>'outcome'`,startedAt:y.startedAt}).from(y).where(Fs($n(y.userId,t),Dr`${y.analysis} is not null`))]),a=await u.select({treatmentId:ne.treatmentId,projectId:y.projectId,n:Bh()}).from(ne).innerJoin(y,$n(y.id,ne.sessionId)).where(Fs($n(ne.userId,t),$n(ne.treatmentType,"instruction"),Dr`${y.projectId} is not null`)).groupBy(ne.treatmentId,y.projectId),d=new Map;for(let N of a){if(!N.projectId)continue;let U=Number(N.n),q=d.get(N.treatmentId);(!q||U>q.n||U===q.n&&N.projectId<q.projectId)&&d.set(N.treatmentId,{projectId:N.projectId,n:U})}let l=c(N=>d.get(N)?.projectId??null,"topProjectId"),m=r.filter(N=>!(N.content&&Fh.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,U)=>N.totalExposures-U.totalExposures).slice(0,50),w=new Map;for(let N of i){let U=N.outcome!=null?xi[N.outcome]:void 0;U!==void 0&&w.set(N.id,{projectId:N.projectId,score:U,time:N.startedAt?.getTime()??0})}let f=new Map;for(let N of s){if(!N.sessionId)continue;let U=f.get(N.treatmentId);U||(U=new Set,f.set(N.treatmentId,U)),U.add(N.sessionId)}let h=[],v=[];for(let N of o){let U=f.get(N.id);if(!U)continue;let q=0;for(let V of U)w.has(V)&&q++;if(q<10)continue;let B=new Map;for(let[V,{projectId:pe,score:F,time:he}]of w){let D=pe??"(no-project)",re=B.get(D);re||(re={key:D,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},B.set(D,re));let Ce=U.has(V);(Ce?re.withScores:re.withoutScores).push(F),(Ce?re.withTimes:re.withoutTimes).push(he)}let J=Pn([...B.values()]),ce=ys(J);ce==="harmful"?h.push({id:N.id,name:N.name,type:N.type,verdict:J,exposures:J.nWith,topProjectId:l(N.id)}):ce==="neutral"&&v.push({id:N.id,name:N.name,type:N.type,verdict:J,exposures:J.nWith,topProjectId:l(N.id)})}let I=0,E=h;if(h.length>0){let N=await u.select({id:g.id,content:g.content}).from(g).where(fE(g.id,h.map(q=>q.id))),U=new Map(N.map(q=>[q.id,q.content]));E=h.filter(q=>{let B=U.get(q.id);return B&&Fh.test(B)?(I++,!1):!0})}E.sort((N,U)=>N.verdict.delta-U.verdict.delta);let A=1500,b=[],S=0;if(v.length>0){let N=await u.select({id:g.id,estimatedTokens:Dr`(length(${g.content}) / 4)::int`,content:g.content}).from(g).where(fE(g.id,v.map(q=>q.id))),U=new Map(N.map(q=>[q.id,q]));for(let q of v){let B=U.get(q.id),J=Number(B?.estimatedTokens??0);if(J<A)continue;let ce=!!(B?.content&&Fh.test(B.content));ce&&S++,b.push({...q,estimatedTokens:J,containsSafetyLanguage:ce})}b.sort((q,B)=>B.estimatedTokens-q.estimatedTokens),b=b.slice(0,20)}let T=new Set(E.map(N=>N.id)),P=_.filter(N=>!T.has(N.id)),H=await pE(t);return e.json({captureHealthy:!0,candidates:P,safetyGuarded:p,harmful:E,harmfulSafetyGuarded:I,bloated:b,trimSafetyFlagged:S,unusedSkills:H.candidates,skillCaptureHealthy:H.captureHealthy,skillCaptureReason:H.reason})});O();import{Hono as HL}from"hono";import{z as _a}from"zod";import{and as mr,desc as gE,eq as wt,getTableColumns as BL,gte as zh,ilike as jm,isNull as FL,ne as WL,or as zL,sql as ya}from"drizzle-orm";var Bo=new HL;function VL(e,t){let n=t?jm(z.projectPath,`%${ct(t)}%`):void 0;return e&&n?zL(wt(z.projectId,e),mr(FL(z.projectId),n)):e?wt(z.projectId,e):n}c(VL,"insightsJobProjectScope");Bo.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 Fn(o);if(r==="daily"){let m=new Date;m.setHours(0,0,0,0);let p=o,_=[wt(z.userId,t),zh(z.createdAt,m)];s?_.push(wt(z.projectId,s)):p?_.push(jm(z.projectPath,`%${ct(p)}%`)):_.push(ya`${z.projectPath} IS NULL`);let[w]=await u.select({id:z.id}).from(z).where(mr(..._)).limit(1);if(w)return e.json({skipped:!0,reason:"already_generated_today",existingJobId:w.id},200);let f=[wt(z.userId,t),wt(z.status,"completed")];s?f.push(wt(z.projectId,s)):p?f.push(jm(z.projectPath,`%${ct(p)}%`)):f.push(ya`${z.projectPath} IS NULL`);let[h]=await u.select({completedAt:z.completedAt}).from(z).where(mr(...f)).orderBy(gE(z.completedAt)).limit(1),v=h?.completedAt??new Date(0),I=[wt(y.userId,t),zh(y.startedAt,v)];s?I.push(wt(y.projectId,s)):p&&I.push(jm(y.projectPath,`%${ct(p)}%`));let[{count:E}]=await u.select({count:ya`COUNT(*)`}).from(y).where(mr(...I));if(Number(E)<5)return e.json({skipped:!0,reason:"insufficient_sessions",sessionsSinceLastRun:Number(E),threshold:5},200)}let i=await Ul(s,o),{id:a,noLiveWorker:d}=await Ct({taskName:"process_insights",payload:{projectPath:i,projectId:s},userId:t,mirror:{userId:t,projectPath:i,projectId:s}}),[l]=await u.select().from(z).where(wt(z.id,a));return e.json({...l,noLiveWorker:d},201)});Bo.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 Fn(r??null),s=[wt(z.userId,t)],i=VL(o,r??null);i&&s.push(i);let{result:a,...d}=BL(z),l=await u.select(d).from(z).where(mr(...s)).orderBy(gE(z.createdAt)).limit(n);return e.json(l)});Bo.get("/insights-jobs/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(z).where(mr(wt(z.id,n),wt(z.userId,t)));return r?e.json(r):e.json({error:"Job not found"},404)});Bo.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(z).set({status:s,progress:r.progress,updatedAt:new Date}).where(mr(wt(z.id,n),wt(z.userId,t))).returning();return i?e.json(i):e.json({error:"Job not found"},404)});var JL=_a.object({status:_a.enum(["running","completed","failed"]).optional(),attempts:_a.number().int().nonnegative().optional(),error:_a.string().optional(),result:_a.record(_a.unknown()).optional()});Bo.patch("/insights-jobs/:id/state",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=JL.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(z).set(o).where(mr(wt(z.id,n),wt(z.userId,t),WL(z.status,"cancelled"))).returning();if(!s){let[i]=await u.select().from(z).where(mr(wt(z.id,n),wt(z.userId,t)));return i?e.json(i):e.json({error:"Job not found"},404)}return e.json(s)});var KL=14400*1e3;Bo.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()-KL),i=await u.select({projectId:y.projectId,sessionCount:ya`COUNT(*)`}).from(y).where(mr(wt(y.userId,t),ya`${y.projectId} IS NOT NULL`)).groupBy(y.projectId).orderBy(ya`COUNT(*) DESC`),a=i.map(w=>w.projectId).filter(w=>!!w),d=new Map;if(a.length>0){let w=await u.execute(Wi(a));for(let f of w)d.set(f.project_id,f.path)}let l=[],m=[],p=[],_=!1;for(let w of i){if(Number(w.sessionCount)<r||!w.projectId)continue;let f=d.get(w.projectId);if(!f){m.push({projectPath:"<unknown>",reason:"no_checkout"});continue}try{if(!o){let[E]=await u.select({id:z.id}).from(z).where(mr(wt(z.userId,t),wt(z.status,"completed"),wt(z.projectPath,f),zh(z.completedAt,s))).limit(1);if(E){m.push({projectPath:f,reason:"fresh"});continue}}let{id:h,noLiveWorker:v}=await Ct({taskName:"process_insights",payload:{projectPath:f},userId:t,mirror:{userId:t,projectPath:f}});v&&(_=!0);let[I]=await u.select().from(z).where(wt(z.id,h));I&&l.push(I)}catch(h){let v=h instanceof Error?h.message:String(h);p.push({projectPath:f,error:v})}}return e.json({created:l.length,jobs:l,skipped:m,errors:p,noLiveWorker:_},201)});O();import Pm from"node:fs";import GL from"node:path";import{createHash as YL}from"node:crypto";import{Hono as XL}from"hono";import{and as hE,desc as QL,eq as xd}from"drizzle-orm";var Vh=new XL;async function ZL(e,t,n){try{let r=`${el.claude_md}::${n}`,[o]=await u.select({id:g.id,version:g.version}).from(g).where(hE(xd(g.contextIdentity,r),xd(g.createdBy,e),xd(g.archived,!1))).orderBy(QL(g.createdAt)).limit(1);if(!o){let a=Pm.readFileSync(n,"utf-8"),d=YL("sha256").update(a).digest("hex"),l={name:n,description:"Project CLAUDE.md",type:"context_file",scope:"personal",version:"1.0.0"},[m]=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:d,contextIdentity:r,createdBy:e}).onConflictDoNothing().returning({id:g.id,version:g.version});o=m}if(!o)return null;let s=await Fn(t),[i]=await u.insert(Mt).values({userId:e,treatmentType:"instruction",treatmentId:o.id,projectId:s??void 0,assignedBy:e,method:"auto_added"}).returning({id:Mt.id});return i?.id??null}catch(r){return console.warn("[auto-add] failed to record treatment_assignment:",r instanceof Error?r.message:r),null}}c(ZL,"recordAutoAddAssignment");Vh.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:y.id}).from(y).where(hE(xd(y.userId,t),xd(y.projectPath,r))).limit(1);if(!s)return e.json({error:"projectPath is not a known project for this user"},403);let i=GL.join(r,"CLAUDE.md");if(!Pm.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=Pm.readFileSync(i,"utf-8");if(a.includes(o.trim()))return e.json({success:!1,reason:"already_present"},200);let d=a.endsWith(`
1298
1303
  `)?`
1299
1304
  `:`
1300
1305
 
1301
- `;xp.writeFileSync(i,a+u+o.trim()+`
1302
- `);let l=await zL(t,r,i);return e.json({success:!0,path:i,addedAt:new Date().toISOString(),assignmentId:l,tracked:l!=null})}catch(a){let u=a instanceof Error?a.message:String(a);return e.json({error:`Failed to write: ${u}`},500)}});import{Hono as KL}from"hono";import{z as ke}from"zod";D();import{createHash as VL}from"node:crypto";import{and as Uh,eq as Ho,inArray as JL,sql as Su}from"drizzle-orm";function cE(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("script")?"script":t.includes("routine")||t.includes("schedule")||t.includes("cron")?"routine":t.includes("skill")?"skill":"feature"}c(cE,"artifactTypeForFeature");function uE(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(`
1306
+ `;Pm.writeFileSync(i,a+d+o.trim()+`
1307
+ `);let l=await ZL(t,r,i);return e.json({success:!0,path:i,addedAt:new Date().toISOString(),assignmentId:l,tracked:l!=null})}catch(a){let d=a instanceof Error?a.message:String(a);return e.json({error:`Failed to write: ${d}`},500)}});import{Hono as rM}from"hono";import{z as ke}from"zod";O();import{createHash as eM}from"node:crypto";import{and as Jh,eq as Fo,inArray as tM,sql as Rd}from"drizzle-orm";function _E(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("script")?"script":t.includes("routine")||t.includes("schedule")||t.includes("cron")?"routine":t.includes("skill")?"skill":"feature"}c(_E,"artifactTypeForFeature");function yE(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(`
1303
1308
 
1304
- `)}c(uE,"renderFeatureBody");function dE(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(`
1309
+ `)}c(yE,"renderFeatureBody");function wE(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(`
1305
1310
 
1306
- `)}c(dE,"renderAdviceBody");var Hh=.5,Bh=.4,lE=c(e=>VL("sha256").update(e.trim()).digest("hex"),"hashAddition");function Tp(e){let t=e.trim().split(`
1307
- `)[0].replace(/^#+\s*/,"").trim();return(t.length>0?t:e.trim()).slice(0,80)}c(Tp,"deriveName");function pE(e,t){let n=` (${t.slice(0,6)})`;return`${e.slice(0,80-n.length)}${n}`}c(pE,"disambiguateName");function mE(e){return e?.cause?.code==="23505"||e?.code==="23505"}c(mE,"isUniqueViolation");async function fE(e){let{userId:t,projectPath:n,candidates:r=[],additions:o,skills:s,features:i,advice:a}=e,u=[],l=0,p=0,f=0,_=0,v=[],h=[];async function m(E,S){try{await S()}catch(R){h.push({name:E.slice(0,80),error:R instanceof Error?R.message:String(R)})}}c(m,"attempt");async function w(E){let S=Ni(E.body);if(S.length>0)return v.push({name:E.name.slice(0,80),placeholders:S.map(N=>N.token)}),null;let R=lE(E.body),[O]=await d.select({id:g.id}).from(g).where(Uh(Ho(g.createdBy,t),Ho(g.contentHash,R),Ho(g.archived,!1))).limit(1);if(O)return{id:O.id,created:!1};let W=c(N=>({name:N,description:(E.body.split(`
1308
- `).find(q=>q.trim()&&!q.startsWith("#"))??"Suggested by insights").slice(0,500),type:E.type,scope:"personal",scopeRef:t,version:"1.0.0",content:E.body,frontmatter:{source:"insights",artifactType:E.type,origin:E.origin,projectPath:n,proposedAt:new Date().toISOString(),...E.provenance},createdBy:t,contentHash:R}),"values");try{let[N]=await d.insert(g).values(W(E.name.slice(0,80))).returning({id:g.id});return{id:N.id,created:!0}}catch(N){if(!mE(N))throw N;let[q]=await d.insert(g).values(W(pE(E.name,R))).returning({id:g.id});return{id:q.id,created:!0}}}c(w,"materialise");for(let E of r)await m(E.title,async()=>{let S=await w({name:E.title,body:E.canonicalBody,type:E.artifact,origin:"recommendation_candidates",provenance:{canonicalBody:E.canonicalBody,rationale:E.rationale,evidence:E.evidence,outcomeMetric:E.outcomeMetric,renderings:E.renderings}});S&&(S.created&&(E.artifact==="instruction"?p+=1:f+=1),u.push({instructionId:S.id,reason:E.rationale||"Suggested by cross-harness insights",score:E.artifact==="instruction"?Hh:Bh}))});if(s.length>0){let E=s.flatMap(O=>[O.skillId,`skills--${O.skillId}`]),S=await d.select({id:g.id,name:g.name}).from(g).where(Uh(Ho(g.type,"skill"),Ho(g.archived,!1),JL(g.name,E))),R=new Map(S.map(O=>[O.name,O.id]));for(let O of s){let W=R.get(`skills--${O.skillId}`)??R.get(O.skillId);if(!W){l+=1;continue}u.push({instructionId:W,reason:O.reason||"Recommended by insights",score:Hh})}}for(let E of o)await m(Tp(E.addition),async()=>{let S=Ni(E.addition);if(S.length>0){v.push({name:Tp(E.addition),placeholders:S.map(N=>N.token)});return}let R=lE(E.addition),[O]=await d.select({id:g.id}).from(g).where(Uh(Ho(g.createdBy,t),Ho(g.contentHash,R),Ho(g.archived,!1))).limit(1),W=O?.id;if(!W){let N=c(U=>({name:U,description:E.why.slice(0,500)||"Proposed by insights from your session history",type:"instruction",scope:"personal",scopeRef:t,version:"1.0.0",content:E.addition,frontmatter:{source:"insights",projectPath:n,proposedAt:new Date().toISOString()},createdBy:t,contentHash:R}),"addValues"),q;try{[q]=await d.insert(g).values(N(Tp(E.addition))).returning({id:g.id})}catch(U){if(!mE(U))throw U;[q]=await d.insert(g).values(N(pE(Tp(E.addition),R))).returning({id:g.id})}W=q.id,p+=1}u.push({instructionId:W,reason:E.why||"Proposed by insights from your session history",score:Hh})});for(let E of i)await m(E.feature,async()=>{let S=await w({name:E.feature,body:uE(E),type:cE(E.feature),origin:"features_to_try"});S&&(S.created&&(f+=1),u.push({instructionId:S.id,reason:E.why_for_you||E.one_liner||"Suggested by insights from your session history",score:Bh}))});for(let E of a)await m(E.title,async()=>{let S=await w({name:E.title,body:dE(E),type:"feature",origin:E.origin});S&&(S.created&&(_+=1),u.push({instructionId:S.id,reason:E.lead||E.detail||"Surfaced by insights from your session history",score:Bh}))});if(u.length===0)return{nominated:0,additionsCreated:0,featuresCreated:0,adviceCreated:0,skillsUnresolved:l,additionsRejected:v,itemsFailed:h};let I=new Set,b=u.filter(E=>I.has(E.instructionId)?!1:(I.add(E.instructionId),!0)).map(E=>({userId:t,instructionId:E.instructionId,projectPath:n,projectId:null,score:E.score,reason:E.reason,kind:"add",generatedAt:new Date,isStale:!1})),A=await Bn(n);for(let E of b)E.projectId=A;return await d.insert(x).values(b).onConflictDoUpdate({target:[x.userId,x.projectPath,x.instructionId,x.kind],set:{score:Su`excluded.score`,reason:Su`excluded.reason`,generatedAt:Su`excluded.generated_at`,isStale:Su`false`,dismissedAt:Su`CASE WHEN ${x.dismissedAt} IS NOT NULL AND ${x.dismissedAt} >= now() - interval '30 days' THEN ${x.dismissedAt} ELSE NULL END`}}),{nominated:b.length,additionsCreated:p,featuresCreated:f,adviceCreated:_,skillsUnresolved:l,additionsRejected:v,itemsFailed:h}}c(fE,"materialiseInsightRecommendations");var Fh=new KL,GL=ke.object({projectPath:ke.string().min(1),candidates:ke.array(ke.object({title:ke.string().min(2).max(200),artifact:ke.enum(["instruction","skill","hook","script","mcp","subagent","routine","feature"]),canonicalBody:ke.string().min(12).max(16e3),rationale:ke.string().max(4e3).default(""),evidence:ke.array(ke.object({sessionId:ke.string().max(200).optional(),finding:ke.string().min(1).max(4e3)})).max(50).default([]),outcomeMetric:ke.string().min(1).max(200).default("session_outcome"),renderings:ke.array(ke.object({harness:ke.enum(["claude_code","codex","shared"]),target:ke.enum(["CLAUDE.md","AGENTS.md","manual"]),body:ke.string().min(1).max(16e3)})).max(10).default([])})).max(40).default([]),additions:ke.array(ke.object({addition:ke.string().min(12).max(4e3),why:ke.string().max(2e3).default("")})).max(20).default([]),skills:ke.array(ke.object({skillId:ke.string().min(1).max(200),reason:ke.string().max(2e3).default("")})).max(20).default([]),features:ke.array(ke.object({feature:ke.string().min(2).max(200),one_liner:ke.string().max(1e3).default(""),why_for_you:ke.string().max(4e3).default(""),example_code:ke.string().max(8e3).default("")})).max(20).default([]),advice:ke.array(ke.object({title:ke.string().min(2).max(200),lead:ke.string().max(4e3).default(""),detail:ke.string().max(8e3).default(""),copyable_prompt:ke.string().max(8e3).default(""),origin:ke.enum(["usage_pattern","opportunity"])})).max(40).default([])});Fh.post("/insights/recommendations/nominate",async e=>{let t=GL.safeParse(await e.req.json());if(!t.success)return e.json({error:"Invalid body",details:t.error.flatten()},400);let n=await fE({userId:e.get("userId"),...t.data});return e.json(n)});D();import{Hono as YL}from"hono";import{and as XL,desc as QL,eq as Wh,isNotNull as ZL}from"drizzle-orm";var zh=new YL;zh.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:z.result,completedAt:z.completedAt}).from(z).where(XL(Wh(z.userId,t),Wh(z.projectPath,n),Wh(z.status,"completed"),ZL(z.result))).orderBy(QL(z.completedAt)).limit(1);if(!r)return e.json({analyzedAt:null,friction:[],whatWorks:[]});let o=c(p=>typeof p=="string"&&p.trim().length>0,"isStr"),s=c(p=>p!==null&&typeof p=="object"&&!Array.isArray(p),"isRecord"),i=r.result,a=s(i)&&s(i.recommendations)?i.recommendations:void 0,u=c(p=>Array.isArray(p)?p.flatMap(f=>{if(typeof f=="string")return f.trim()?[f.trim()]:[];if(s(f)){let _=f,v=[_.title,_.category,_.pattern].find(o),h=[_.detail,_.description,_.summary,Array.isArray(_.examples)?_.examples.find(o):void 0].find(o),m=[v,h].filter(o).join(" \u2014 ");return m?[m]:[]}return[]}):o(p)?[p.trim()]:[],"asLines"),l=c((p,f)=>{if(Array.isArray(p))return p;if(s(p)){let _=p[f];if(Array.isArray(_))return _}return[]},"listAt");return e.json({analyzedAt:r.completedAt,friction:u(l(a?.friction_analysis,"categories")).slice(0,8),whatWorks:u(l(a?.what_works,"impressive_workflows")).slice(0,8)})});D();import{Hono as eM}from"hono";import{and as Vh,eq as Fs,inArray as gE,isNotNull as tM,or as nM,sql as Jh}from"drizzle-orm";var Kh=new eM;Kh.get("/insights/provenance-impact",async e=>{let t=e.get("userId"),n=await d.select({treatmentId:ne.treatmentId,sessions:Jh`count(distinct ${ne.sessionId})::int`}).from(ne).where(Vh(Fs(ne.userId,t),Fs(ne.treatmentType,"instruction"))).groupBy(ne.treatmentId),r=n.map(h=>h.treatmentId),o=await d.select({id:g.id,name:g.name,source:Jh`${g.frontmatter}->>'source'`,createdBy:g.createdBy,scope:g.scope}).from(g).where(Vh(Fs(g.archived,!1),r.length>0?nM(Fs(g.createdBy,t),gE(g.id,r)):Fs(g.createdBy,t))).limit(5e3),s=new Map(o.map(h=>[h.id,Zd(h,t)])),i=o.map(h=>h.id),a=await d.select({instructionId:Q.instructionId,decision:Q.decision,delta:Q.delta}).from(Q).where(Fs(Q.userId,t)),u=i.length>0?await d.select({instructionId:x.instructionId,n:Jh`count(*)::int`}).from(x).where(Vh(Fs(x.userId,t),tM(x.acceptedAt),gE(x.instructionId,i))).groupBy(x.instructionId):[],l=new Map,p=c(h=>{let m=l.get(h);return m||(m={provenance:h,instructions:0,exposedInstructions:0,exposedSessions:0,accepted:0,randomisedVerdicts:0,meanDelta:null,evidenceClass:"none"},l.set(h,m)),m},"ensure"),f=new Map(n.map(h=>[h.treatmentId,Number(h.sessions)]));for(let h of o){let m=Zd(h,t),w=f.get(h.id)??0;if(m==="catalog"&&w===0)continue;let I=p(m);I.instructions+=1,w>0&&(I.exposedInstructions+=1,I.exposedSessions+=w)}for(let h of u){let m=s.get(h.instructionId);m&&(p(m).accepted+=Number(h.n))}let _=new Map;for(let h of a){let m=s.get(h.instructionId);if(!m)continue;p(m).randomisedVerdicts+=1;let w=_.get(m)??{sum:0,n:0};w.sum+=Number(h.delta),w.n+=1,_.set(m,w)}for(let[h,m]of _){let w=p(h);w.meanDelta=m.n>0?m.sum/m.n:null,w.evidenceClass=m.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 Gn=new rM;Gn.route("/",xh);Gn.route("/",Eu);Gn.route("/",Hs);Gn.route("/",Mh);Gn.route("/",Uo);Gn.route("/",Fh);Gn.route("/",zh);Gn.route("/",Kh);Gn.route("/",qh);D();import{Hono as oM}from"hono";import{z as ut}from"zod";import{and as Yn,desc as Rp,eq as it,sql as pn}from"drizzle-orm";var bn=new oM,Gh=["fact","decision","correction","convention"],hE=4e3,sM=ut.object({kind:ut.enum(Gh),title:ut.string().min(1).max(300),body:ut.string().min(1).max(hE),projectId:ut.string().uuid().optional(),projectPath:ut.string().optional(),source:ut.enum(["manual","distilled"]).optional()}),iM=ut.object({kind:ut.enum(Gh).optional(),title:ut.string().min(1).max(300).optional(),body:ut.string().min(1).max(hE).optional(),status:ut.enum(["active","archived"]).optional()});async function Yh(e){if(!e)return null;try{let[t]=await d.select({projectId:ye.projectId}).from(ye).where(it(ye.path,e)).orderBy(Rp(ye.lastSeen)).limit(1);if(t)return t.projectId;let[n]=await d.select({id:C.id}).from(C).where(it(C.gitRemoteUrl,e)).limit(1);return n?.id??null}catch{return null}}c(Yh,"resolveProjectId");bn.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"),u=Math.max(Number.isFinite(a)?a:0,0),l=e.req.query("rank"),p=n??await Yh(r??null),f=[it(F.userId,t)];o!=="all"&&f.push(it(F.status,o));let _=e.req.query("kind");_&&Gh.includes(_)&&f.push(it(F.kind,_));let v=e.req.query("search")?.trim();if(v){let I=`%${ct(v)}%`;f.push(pn`(${F.title} ilike ${I} or ${F.body} ilike ${I})`)}(n||r)&&f.push(p?pn`(${F.projectId} = ${p} or ${F.projectId} is null)`:pn`${F.projectId} is null`);let h=pn`${F.trustVersion} = ${F.version}`;l==="trust"&&f.push(pn`coalesce(${F.trustClass} = 'harmful' and ${h}, false) = false`);let m=pn`case
1309
- when ${F.source} = 'manual' or (${F.trustClass} = 'helpful' and ${h}) then 0
1310
- when ${F.trustClass} = 'neutral' and ${h} then 1
1311
+ `)}c(wE,"renderAdviceBody");var Kh=.5,Gh=.4;function nM(e){let t=!1;for(let n of e.split(`
1312
+ `)){let r=n.trim();if(/^(`{3,}|~{3,})/.test(r)){t=!t;continue}if(!(t||!r)&&!r.startsWith("#"))return r}return""}c(nM,"firstProseLine");var vE=c(e=>eM("sha256").update(e.trim()).digest("hex"),"hashAddition");function Dm(e){let t=e.trim().split(`
1313
+ `)[0].replace(/^#+\s*/,"").trim();return(t.length>0?t:e.trim()).slice(0,80)}c(Dm,"deriveName");function IE(e,t){let n=` (${t.slice(0,6)})`;return`${e.slice(0,80-n.length)}${n}`}c(IE,"disambiguateName");function bE(e){return e?.cause?.code==="23505"||e?.code==="23505"}c(bE,"isUniqueViolation");async function EE(e){let{userId:t,projectPath:n,candidates:r=[],additions:o,skills:s,features:i,advice:a}=e,d=[],l=0,m=0,p=0,_=0,w=[],f=[];async function h(b,S){try{await S()}catch(T){f.push({name:b.slice(0,80),error:T instanceof Error?T.message:String(T)})}}c(h,"attempt");async function v(b){let S=ji(b.body);if(S.length>0)return w.push({name:b.name.slice(0,80),placeholders:S.map(N=>N.token)}),null;let T=vE(b.body),[P]=await u.select({id:g.id}).from(g).where(Jh(Fo(g.createdBy,t),Fo(g.contentHash,T),Fo(g.archived,!1))).limit(1);if(P)return{id:P.id,created:!1};let H=c(N=>({name:N,description:nM(b.body).slice(0,500)||"Suggested by insights",type:b.type,scope:"personal",scopeRef:t,version:"1.0.0",content:b.body,frontmatter:{source:"insights",artifactType:b.type,origin:b.origin,projectPath:n,proposedAt:new Date().toISOString(),...b.provenance},createdBy:t,contentHash:T}),"values");try{let[N]=await u.insert(g).values(H(b.name.slice(0,80))).returning({id:g.id});return{id:N.id,created:!0}}catch(N){if(!bE(N))throw N;let[U]=await u.insert(g).values(H(IE(b.name,T))).returning({id:g.id});return{id:U.id,created:!0}}}c(v,"materialise");for(let b of r)await h(b.title,async()=>{let S=await v({name:b.title,body:b.canonicalBody,type:b.artifact,origin:"recommendation_candidates",provenance:{canonicalBody:b.canonicalBody,rationale:b.rationale,evidence:b.evidence,outcomeMetric:b.outcomeMetric,renderings:b.renderings}});S&&(S.created&&(b.artifact==="instruction"?m+=1:p+=1),d.push({instructionId:S.id,reason:b.rationale||"Suggested by cross-harness insights",score:b.artifact==="instruction"?Kh:Gh}))});if(s.length>0){let b=s.flatMap(P=>[P.skillId,`skills--${P.skillId}`]),S=await u.select({id:g.id,name:g.name}).from(g).where(Jh(Fo(g.type,"skill"),Fo(g.archived,!1),tM(g.name,b))),T=new Map(S.map(P=>[P.name,P.id]));for(let P of s){let H=T.get(`skills--${P.skillId}`)??T.get(P.skillId);if(!H){l+=1;continue}d.push({instructionId:H,reason:P.reason||"Recommended by insights",score:Kh})}}for(let b of o)await h(Dm(b.addition),async()=>{let S=ji(b.addition);if(S.length>0){w.push({name:Dm(b.addition),placeholders:S.map(N=>N.token)});return}let T=vE(b.addition),[P]=await u.select({id:g.id}).from(g).where(Jh(Fo(g.createdBy,t),Fo(g.contentHash,T),Fo(g.archived,!1))).limit(1),H=P?.id;if(!H){let N=c(q=>({name:q,description:b.why.slice(0,500)||"Proposed by insights from your session history",type:"instruction",scope:"personal",scopeRef:t,version:"1.0.0",content:b.addition,frontmatter:{source:"insights",projectPath:n,proposedAt:new Date().toISOString()},createdBy:t,contentHash:T}),"addValues"),U;try{[U]=await u.insert(g).values(N(Dm(b.addition))).returning({id:g.id})}catch(q){if(!bE(q))throw q;[U]=await u.insert(g).values(N(IE(Dm(b.addition),T))).returning({id:g.id})}H=U.id,m+=1}d.push({instructionId:H,reason:b.why||"Proposed by insights from your session history",score:Kh})});for(let b of i)await h(b.feature,async()=>{let S=await v({name:b.feature,body:yE(b),type:_E(b.feature),origin:"features_to_try"});S&&(S.created&&(p+=1),d.push({instructionId:S.id,reason:b.why_for_you||b.one_liner||"Suggested by insights from your session history",score:Gh}))});for(let b of a)await h(b.title,async()=>{let S=await v({name:b.title,body:wE(b),type:"feature",origin:b.origin});S&&(S.created&&(_+=1),d.push({instructionId:S.id,reason:b.lead||b.detail||"Surfaced by insights from your session history",score:Gh}))});if(d.length===0)return{nominated:0,additionsCreated:0,featuresCreated:0,adviceCreated:0,skillsUnresolved:l,additionsRejected:w,itemsFailed:f};let I=new Set,E=d.filter(b=>I.has(b.instructionId)?!1:(I.add(b.instructionId),!0)).map(b=>({userId:t,instructionId:b.instructionId,projectPath:n,projectId:null,score:b.score,reason:b.reason,kind:"add",generatedAt:new Date,isStale:!1})),A=await Fn(n);for(let b of E)b.projectId=A;return await u.insert(x).values(E).onConflictDoUpdate({target:[x.userId,x.projectPath,x.instructionId,x.kind],set:{score:Rd`excluded.score`,reason:Rd`excluded.reason`,generatedAt:Rd`excluded.generated_at`,isStale:Rd`false`,dismissedAt:Rd`CASE WHEN ${x.dismissedAt} IS NOT NULL AND ${x.dismissedAt} >= now() - interval '30 days' THEN ${x.dismissedAt} ELSE NULL END`}}),{nominated:E.length,additionsCreated:m,featuresCreated:p,adviceCreated:_,skillsUnresolved:l,additionsRejected:w,itemsFailed:f}}c(EE,"materialiseInsightRecommendations");var Yh=new rM,oM=ke.object({projectPath:ke.string().min(1),candidates:ke.array(ke.object({title:ke.string().min(2).max(200),artifact:ke.enum(["instruction","skill","hook","script","mcp","subagent","routine","feature"]),canonicalBody:ke.string().min(12).max(16e3),rationale:ke.string().max(4e3).default(""),evidence:ke.array(ke.object({sessionId:ke.string().max(200).optional(),finding:ke.string().min(1).max(4e3)})).max(50).default([]),outcomeMetric:ke.string().min(1).max(200).default("session_outcome"),renderings:ke.array(ke.object({harness:ke.enum(["claude_code","codex","shared"]),target:ke.enum(["CLAUDE.md","AGENTS.md","manual"]),body:ke.string().min(1).max(16e3)})).max(10).default([])})).max(40).default([]),additions:ke.array(ke.object({addition:ke.string().min(12).max(4e3),why:ke.string().max(2e3).default("")})).max(20).default([]),skills:ke.array(ke.object({skillId:ke.string().min(1).max(200),reason:ke.string().max(2e3).default("")})).max(20).default([]),features:ke.array(ke.object({feature:ke.string().min(2).max(200),one_liner:ke.string().max(1e3).default(""),why_for_you:ke.string().max(4e3).default(""),example_code:ke.string().max(8e3).default("")})).max(20).default([]),advice:ke.array(ke.object({title:ke.string().min(2).max(200),lead:ke.string().max(4e3).default(""),detail:ke.string().max(8e3).default(""),copyable_prompt:ke.string().max(8e3).default(""),origin:ke.enum(["usage_pattern","opportunity"])})).max(40).default([])});Yh.post("/insights/recommendations/nominate",async e=>{let t=oM.safeParse(await e.req.json());if(!t.success)return e.json({error:"Invalid body",details:t.error.flatten()},400);let n=await EE({userId:e.get("userId"),...t.data});return e.json(n)});O();import{Hono as sM}from"hono";import{and as iM,desc as aM,eq as Xh,isNotNull as cM}from"drizzle-orm";var Qh=new sM;Qh.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:z.result,completedAt:z.completedAt}).from(z).where(iM(Xh(z.userId,t),Xh(z.projectPath,n),Xh(z.status,"completed"),cM(z.result))).orderBy(aM(z.completedAt)).limit(1);if(!r)return e.json({analyzedAt:null,friction:[],whatWorks:[]});let o=c(m=>typeof m=="string"&&m.trim().length>0,"isStr"),s=c(m=>m!==null&&typeof m=="object"&&!Array.isArray(m),"isRecord"),i=r.result,a=s(i)&&s(i.recommendations)?i.recommendations:void 0,d=c(m=>Array.isArray(m)?m.flatMap(p=>{if(typeof p=="string")return p.trim()?[p.trim()]:[];if(s(p)){let _=p,w=[_.title,_.category,_.pattern].find(o),f=[_.detail,_.description,_.summary,Array.isArray(_.examples)?_.examples.find(o):void 0].find(o),h=[w,f].filter(o).join(" \u2014 ");return h?[h]:[]}return[]}):o(m)?[m.trim()]:[],"asLines"),l=c((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:d(l(a?.friction_analysis,"categories")).slice(0,8),whatWorks:d(l(a?.what_works,"impressive_workflows")).slice(0,8)})});O();import{Hono as dM}from"hono";import{and as Zh,eq as Ws,inArray as AE,isNotNull as uM,or as lM,sql as e_}from"drizzle-orm";var t_=new dM;t_.get("/insights/provenance-impact",async e=>{let t=e.get("userId"),n=await u.select({treatmentId:ne.treatmentId,sessions:e_`count(distinct ${ne.sessionId})::int`}).from(ne).where(Zh(Ws(ne.userId,t),Ws(ne.treatmentType,"instruction"))).groupBy(ne.treatmentId),r=n.map(f=>f.treatmentId),o=await u.select({id:g.id,name:g.name,source:e_`${g.frontmatter}->>'source'`,createdBy:g.createdBy,scope:g.scope}).from(g).where(Zh(Ws(g.archived,!1),r.length>0?lM(Ws(g.createdBy,t),AE(g.id,r)):Ws(g.createdBy,t))).limit(5e3),s=new Map(o.map(f=>[f.id,sl(f,t)])),i=o.map(f=>f.id),a=await u.select({instructionId:Z.instructionId,decision:Z.decision,delta:Z.delta}).from(Z).where(Ws(Z.userId,t)),d=i.length>0?await u.select({instructionId:x.instructionId,n:e_`count(*)::int`}).from(x).where(Zh(Ws(x.userId,t),uM(x.acceptedAt),AE(x.instructionId,i))).groupBy(x.instructionId):[],l=new Map,m=c(f=>{let h=l.get(f);return h||(h={provenance:f,instructions:0,exposedInstructions:0,exposedSessions:0,accepted:0,randomisedVerdicts:0,meanDelta:null,evidenceClass:"none"},l.set(f,h)),h},"ensure"),p=new Map(n.map(f=>[f.treatmentId,Number(f.sessions)]));for(let f of o){let h=sl(f,t),v=p.get(f.id)??0;if(h==="catalog"&&v===0)continue;let I=m(h);I.instructions+=1,v>0&&(I.exposedInstructions+=1,I.exposedSessions+=v)}for(let f of d){let h=s.get(f.instructionId);h&&(m(h).accepted+=Number(f.n))}let _=new Map;for(let f of a){let h=s.get(f.instructionId);if(!h)continue;m(h).randomisedVerdicts+=1;let v=_.get(h)??{sum:0,n:0};v.sum+=Number(f.delta),v.n+=1,_.set(h,v)}for(let[f,h]of _){let v=m(f);v.meanDelta=h.n>0?h.sum/h.n:null,v.evidenceClass=h.n>0?"randomised":"none"}let w=["insights","evolution","user","catalog"];return e.json({groups:w.filter(f=>l.has(f)).map(f=>l.get(f)),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 Yn=new mM;Yn.route("/",Dh);Yn.route("/",Sd);Yn.route("/",Bs);Yn.route("/",Wh);Yn.route("/",Bo);Yn.route("/",Yh);Yn.route("/",Qh);Yn.route("/",t_);Yn.route("/",Vh);O();import{Hono as pM}from"hono";import{z as dt}from"zod";import{and as Xn,desc as Om,eq as it,sql as pn}from"drizzle-orm";var bn=new pM,n_=["fact","decision","correction","convention"],SE=4e3,fM=dt.object({kind:dt.enum(n_),title:dt.string().min(1).max(300),body:dt.string().min(1).max(SE),projectId:dt.string().uuid().optional(),projectPath:dt.string().optional(),source:dt.enum(["manual","distilled"]).optional()}),gM=dt.object({kind:dt.enum(n_).optional(),title:dt.string().min(1).max(300).optional(),body:dt.string().min(1).max(SE).optional(),status:dt.enum(["active","archived"]).optional()});async function r_(e){if(!e)return null;try{let[t]=await u.select({projectId:ye.projectId}).from(ye).where(it(ye.path,e)).orderBy(Om(ye.lastSeen)).limit(1);if(t)return t.projectId;let[n]=await u.select({id:C.id}).from(C).where(it(C.gitRemoteUrl,e)).limit(1);return n?.id??null}catch{return null}}c(r_,"resolveProjectId");bn.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"),d=Math.max(Number.isFinite(a)?a:0,0),l=e.req.query("rank"),m=n??await r_(r??null),p=[it(W.userId,t)];o!=="all"&&p.push(it(W.status,o));let _=e.req.query("kind");_&&n_.includes(_)&&p.push(it(W.kind,_));let w=e.req.query("search")?.trim();if(w){let I=`%${ct(w)}%`;p.push(pn`(${W.title} ilike ${I} or ${W.body} ilike ${I})`)}(n||r)&&p.push(m?pn`(${W.projectId} = ${m} or ${W.projectId} is null)`:pn`${W.projectId} is null`);let f=pn`${W.trustVersion} = ${W.version}`;l==="trust"&&p.push(pn`coalesce(${W.trustClass} = 'harmful' and ${f}, false) = false`);let h=pn`case
1314
+ when ${W.source} = 'manual' or (${W.trustClass} = 'helpful' and ${f}) then 0
1315
+ when ${W.trustClass} = 'neutral' and ${f} then 1
1311
1316
  else 2
1312
- 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(Yn(...f)).orderBy(...l==="trust"?[m,Rp(F.updatedAt)]:[Rp(F.updatedAt)]).limit(i).offset(l==="trust"?0:u);return e.json({memories:w})});bn.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),u=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,f=typeof n.projectPath=="string"?n.projectPath:void 0,_=p??await Yh(f??null),v=p||f?_?pn`(m.project_id = ${_} or m.project_id is null)`:pn`m.project_id is null`:pn`true`,h=l.length?pn`and m.id not in (${pn.join(l.map(w=>pn`${w}::uuid`),pn`, `)})`:pn``,m=await d.execute(pn`
1317
+ end`,v=await u.select({id:W.id,version:W.version,kind:W.kind,title:W.title,body:W.body,source:W.source,status:W.status,projectId:W.projectId,createdAt:W.createdAt,updatedAt:W.updatedAt}).from(W).where(Xn(...p)).orderBy(...l==="trust"?[h,Om(W.updatedAt)]:[Om(W.updatedAt)]).limit(i).offset(l==="trust"?0:d);return e.json({memories:v})});bn.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),d=Number.isFinite(a)?Math.min(Math.max(a,0),1):i,l=Array.isArray(n.excludeIds)?n.excludeIds.filter(v=>typeof v=="string").slice(0,500):[],m=typeof n.projectId=="string"?n.projectId:void 0,p=typeof n.projectPath=="string"?n.projectPath:void 0,_=m??await r_(p??null),w=m||p?_?pn`(m.project_id = ${_} or m.project_id is null)`:pn`m.project_id is null`:pn`true`,f=l.length?pn`and m.id not in (${pn.join(l.map(v=>pn`${v}::uuid`),pn`, `)})`:pn``,h=await u.execute(pn`
1313
1318
  with raw as (
1314
1319
  select websearch_to_tsquery('english', ${r})::text as t
1315
1320
  ), q as (
@@ -1321,9 +1326,9 @@ ${r}`).digest("hex")}c(G0,"recommendationEntryHash");var sL=new Set(["42883","42
1321
1326
  from memories m, q
1322
1327
  where m.user_id = ${t}
1323
1328
  and m.status = 'active'
1324
- and ${v}
1329
+ and ${w}
1325
1330
  and coalesce(m.trust_class = 'harmful' and m.trust_version = m.version, false) = false
1326
- ${h}
1331
+ ${f}
1327
1332
  and q.query is not null
1328
1333
  and m.search_tsv @@ q.query
1329
1334
  -- Require relevance above the min floor. websearch turns a -flag token into a
@@ -1333,14 +1338,14 @@ ${r}`).digest("hex")}c(G0,"recommendationEntryHash");var sL=new Set(["42883","42
1333
1338
  -- memories into context AND stamp false exposures. The floor (default 0.035,
1334
1339
  -- clamped to >= 0) subsumes the old rank-zero negation guard AND cuts the weak
1335
1340
  -- single-word overlap band, keeping only memories with real topical overlap.
1336
- and ts_rank(m.search_tsv, q.query) > ${u}
1341
+ and ts_rank(m.search_tsv, q.query) > ${d}
1337
1342
  order by ts_rank(m.search_tsv, q.query) desc,
1338
1343
  case when m.source = 'manual' or (m.trust_class = 'helpful' and m.trust_version = m.version) then 0
1339
1344
  when m.trust_class = 'neutral' and m.trust_version = m.version then 1
1340
1345
  else 2 end,
1341
1346
  m.updated_at desc
1342
1347
  limit ${s}
1343
- `);return e.json({memories:[...m]})});bn.get("/memories/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select().from(F).where(Yn(it(F.id,n),it(F.userId,t))).limit(1);return r?e.json(r):e.json({error:"not found"},404)});bn.post("/memories",async e=>{let t=e.get("userId"),n=sM.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:u}=n.data,l=i??await Yh(a??null),[p]=await d.select({orgId:T.activeOrgId}).from(T).where(it(T.id,t)).limit(1),[f]=await d.insert(F).values({userId:t,orgId:p?.orgId??null,projectId:l,kind:r,title:o,body:s,source:u??"manual",status:"active"}).returning();return e.json(f,201)});bn.patch("/memories/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=iM.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(Yn(it(F.id,n),it(F.userId,t))).limit(1);if(!o)return e.json({error:"not found"},404);let{kind:s,title:i,body:a,status:u}=r.data,l=s!==void 0&&s!==o.kind||i!==void 0&&i!==o.title||a!==void 0&&a!==o.body,[p]=await d.update(F).set({kind:s??o.kind,title:i??o.title,body:a??o.body,status:u??o.status,version:l?o.version+1:o.version,updatedAt:new Date}).where(Yn(it(F.id,n),it(F.userId,t))).returning();return e.json(p)});bn.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(Yn(it(F.id,n),it(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 aM=ut.object({externalSessionId:ut.string().min(1),projectPath:ut.string().optional()});bn.post("/memories/:id/exposures",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=aM.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(Yn(it(F.id,n),it(F.userId,t))).limit(1);return o?(await d.insert(pd).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 cM=ut.object({taskPrompt:ut.string().min(1).max(8e3),expectations:ut.array(ut.string().min(1)).min(1).max(20),trials:ut.number().int().min(1).max(50).default(10),model:ut.string().min(1).max(100).optional()});bn.post("/memories/:id/experiments",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=cM.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(Yn(it(F.id,n),it(F.userId,t))).limit(1);if(!o)return e.json({error:"not found"},404);let[s]=await d.insert(Mt).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 vI({experimentId:s.id,userId:t});return e.json({experiment:s,noLiveWorker:i},201)});bn.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(Yn(it(F.id,n),it(F.userId,t))).limit(1);if(!r)return e.json({error:"not found"},404);let o=await d.select().from(Mt).where(Yn(it(Mt.memoryId,n),it(Mt.userId,t))).orderBy(Rp(Mt.createdAt)).limit(20);return e.json({experiments:o})});bn.get("/memory-experiments/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select().from(Mt).where(Yn(it(Mt.id,n),it(Mt.userId,t))).limit(1);return r?e.json(r):e.json({error:"not found"},404)});var uM=ut.object({status:ut.enum(["running","completed","failed"]),error:ut.string().max(1e3).nullable().optional(),result:ut.record(ut.unknown()).optional()});bn.patch("/memory-experiments/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=uM.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 d.select({id:Mt.id,status:Mt.status}).from(Mt).where(Yn(it(Mt.id,n),it(Mt.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 u=o==="completed"||o==="failed",[l]=await d.update(Mt).set({status:o,...s!==void 0?{error:s}:{},...i!==void 0?{result:i}:{},...o==="running"?{startedAt:new Date}:{},...u?{completedAt:new Date}:{}}).where(Yn(it(Mt.id,n),it(Mt.userId,t))).returning();return e.json(l)});D();import{randomBytes as dM,createHash as lM}from"node:crypto";import{Hono as pM}from"hono";import{z as _E}from"zod";import{eq as kp,and as mM,isNull as fM}from"drizzle-orm";var wa=new pM;function gM(){let n=`rm_${dM(32).toString("base64url")}`,r=lM("sha256").update(n).digest("hex"),o=n.slice(0,11);return{plaintext:n,hash:r,prefix:o}}c(gM,"generateApiKey");var hM=_E.object({name:_E.string().min(1).max(100)});wa.post("/auth/api-keys",async e=>{let t=e.get("userId"),n=await e.req.json(),r=hM.parse(n),{plaintext:o,hash:s,prefix:i}=gM(),[a]=await d.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)});wa.get("/auth/api-keys",async e=>{let t=e.get("userId"),n=await d.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(kp(Ae.userId,t)).orderBy(Ae.createdAt);return e.json(n)});wa.delete("/auth/api-keys/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select({id:Ae.id}).from(Ae).where(mM(kp(Ae.id,n),kp(Ae.userId,t),fM(Ae.revokedAt)));return r?(await d.update(Ae).set({revokedAt:new Date}).where(kp(Ae.id,n)),e.json({revoked:!0})):e.json({error:"API key not found"},404)});D();import{Hono as _M}from"hono";import{z as Qr}from"zod";import{eq as Pt,and as Zr,isNull as yM,sql as Xh}from"drizzle-orm";import{randomUUID as Qh}from"node:crypto";var eo=new _M;eo.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(Zr(Pt(k.id,n),Pt(k.userId,t)));if(!r)return e.json({error:"Target not found"},404);let[o]=await d.select().from(He).where(Zr(Pt(He.evalTargetId,n),Pt(He.userId,t),Pt(He.status,"active")));if(o)return e.json(o);let[s]=await d.insert(He).values({evalTargetId:n,userId:t}).returning();return e.json(s,201)});eo.get("/eval-targets/:id/conversations",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select().from(He).where(Zr(Pt(He.evalTargetId,n),Pt(He.userId,t),Pt(He.status,"active")));return r?e.json(r):e.json(null)});var wM=Qr.object({content:Qr.string().min(1).max(5e3)});eo.post("/eval-conversations/:id/messages",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=wM.parse(await e.req.json()),[o]=await d.select().from(He).where(Zr(Pt(He.id,n),Pt(He.userId,t)));if(!o)return e.json({error:"Conversation not found"},404);let s=Qh(),i={id:s,role:"user",content:r.content,createdAt:new Date().toISOString()};await d.update(He).set({messages:Xh`${He.messages} || ${JSON.stringify([i])}::jsonb`,updatedAt:new Date}).where(Pt(He.id,n));let a={type:"conversation",conversationId:n,messageId:s,messageContent:r.content},{id:u,noLiveWorker:l}=await Ot({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:u,noLiveWorker:l},201)});var vM=Qr.object({content:Qr.string(),type:Qr.enum(["text","status","results","proposal","applied","generated","comparison"]).default("text"),data:Qr.record(Qr.unknown()).optional()});eo.post("/eval-conversations/:id/messages/assistant",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=vM.parse(await e.req.json()),o={id:Qh(),role:"assistant",content:r.content,type:r.type,data:r.data,createdAt:new Date().toISOString()};return await d.update(He).set({messages:Xh`${He.messages} || ${JSON.stringify([o])}::jsonb`,updatedAt:new Date}).where(Zr(Pt(He.id,n),Pt(He.userId,t))),e.json(o,201)});eo.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(He).where(Zr(Pt(He.id,n),Pt(He.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 IM=Qr.object({messageId:Qr.string().uuid()});eo.post("/eval-conversations/:id/apply-proposal",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=IM.parse(await e.req.json()),[o]=await d.select().from(He).where(Zr(Pt(He.id,n),Pt(He.userId,t)));if(!o)return e.json({error:"Conversation not found"},404);let i=o.messages.find(f=>f.id===r.messageId&&f.type==="proposal");if(!i?.data?.proposedContent)return e.json({error:"Proposal message not found or has no content"},400);let[a]=await d.select().from(k).where(Zr(Pt(k.id,o.evalTargetId),Pt(k.userId,t)));if(!a)return e.json({error:"Target not found"},404);let[u]=await d.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 d.select().from(Ee).where(Zr(Pt(Ee.evalTargetId,a.id),yM(Ee.retiredAt)));l.length>0&&await d.insert(Ee).values(l.map(f=>({evalTargetId:u.id,name:f.name,prompt:f.prompt,expectedOutput:f.expectedOutput,files:f.files,expectations:f.expectations})));let p={id:Qh(),role:"assistant",content:`Applied changes \u2014 created v${u.version}`,type:"applied",data:{newVersion:u.version,evalTargetId:u.id},createdAt:new Date().toISOString()};return await d.update(He).set({evalTargetId:u.id,messages:Xh`${He.messages} || ${JSON.stringify([p])}::jsonb`,updatedAt:new Date}).where(Pt(He.id,n)),e.json({newTarget:u,message:p})});D();import*as va from"node:fs";import*as zs from"node:path";import{createHash as bM}from"node:crypto";import{fileURLToPath as EM}from"node:url";import{createRequire as AM}from"node:module";import{Hono as SM}from"hono";import{z as At}from"zod";import{eq as Ws,desc as xM,and as TM,sql as RM}from"drizzle-orm";var kM=zs.dirname(EM(import.meta.url)),Bo=new SM,Np=null,jp=null;function NM(){let e=process.env.RULEMETRIC_SKILLS_REGISTRY_PATH;if(e&&va.existsSync(e))return e;try{let n=AM(import.meta.url),r=zs.dirname(n.resolve("@rulemetric/skills-registry/package.json")),o=zs.join(r,"registry.json");if(va.existsSync(o))return o}catch{}let t=zs.resolve(kM,"../../../../packages/skills-registry/registry.json");return va.existsSync(t)?t:null}c(NM,"resolveRegistryPath");function yE(){if(Np)return Np;let e=NM();return e?(Np=JSON.parse(va.readFileSync(e,"utf-8")),Np):null}c(yE,"loadRegistry");function jM(){if(jp)return jp;let e=yE();return e?(jp={version:e.version,generatedAt:e.generatedAt,skills:e.skills.map(({content:t,...n})=>n)},jp):null}c(jM,"loadRegistryIndex");Bo.get("/skills",e=>{let t=jM();return t?e.json(t):e.json({error:"Skills registry not found"},404)});Bo.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(go).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:go.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)});Bo.get("/skills/submissions/approved",async e=>{let n=(await d.select().from(go).where(Ws(go.status,"approved")).orderBy(xM(go.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 wE=At.object({id:At.string().min(1),name:At.string().min(1),description:At.string(),content:At.string().min(1),source:At.object({repo:At.string(),path:At.string(),url:At.string(),license:At.string().optional()}),tags:At.array(At.string()).optional(),category:At.string().optional(),updatedAt:At.string().optional(),sourceUpdatedAt:At.string().optional(),popularity:At.object({stars:At.number().int().nonnegative().optional(),installs:At.number().int().nonnegative().optional()}).optional()}),$se=At.object({skills:At.array(wE).max(5e3)});Bo.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=At.object({skills:At.array(At.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,u=0,l=0,p=0,f=0;for(let _ of i){let v=wE.safeParse(_);if(!v.success){console.warn("[sync-public] Skipping invalid skill entry:",JSON.stringify(v.error.issues)),f++;continue}let h=v.data,m=bM("sha256").update(h.content).digest("hex"),w=`public_skill::${h.source.repo}::${h.id}`,I=h.updatedAt??"1.0.0",[b]=await d.select({id:g.id,contentHash:g.contentHash,popularityScore:g.popularityScore,sourceUpdatedAt:g.sourceUpdatedAt}).from(g).where(TM(Ws(g.name,h.id),Ws(g.scope,"public"))),A=h.popularity&&Math.max(h.popularity.stars??0,h.popularity.installs??0)||null,E=h.sourceUpdatedAt?new Date(h.sourceUpdatedAt):null,S=E&&!Number.isNaN(E.getTime())?E:null;if(b)if(b.contentHash!==m){let O=!1;for(let W=0;W<=4;W++)try{await d.transaction(async N=>{await N.select({id:g.id}).from(g).where(Ws(g.id,b.id)).for("update"),await N.update(g).set({description:h.description||h.name,content:h.content,contentHash:m,version:I,upstreamVersion:I,popularityScore:A,sourceUpdatedAt:S,frontmatter:{name:h.name,source:h.source,category:h.category??null,popularity:h.popularity??null},updatedAt:new Date}).where(Ws(g.id,b.id));let[q]=await N.select({max:RM`coalesce(max(${xe.versionNumber}), 0)`}).from(xe).where(Ws(xe.instructionId,b.id));await N.insert(xe).values({instructionId:b.id,versionNumber:(q?.max??0)+1,content:h.content,frontmatter:{name:h.name,source:h.source,category:h.category??null},changeSummary:`Synced from registry (${I})`})}),O=!0;break}catch(N){if(N.cause?.code==="23505"){if(W<4)continue;break}throw N}if(!O)continue;u++,p++}else{let R=b.sourceUpdatedAt?.getTime()??null,O=S?.getTime()??null,W=b.popularityScore!==A,N=S!==null&&R!==O;(W||N)&&await d.update(g).set({...W?{popularityScore:A}:{},...N?{sourceUpdatedAt:S}:{}}).where(Ws(g.id,b.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:I,content:h.content,frontmatter:{name:h.name,source:h.source,category:h.category??null,popularity:h.popularity??null},tags:h.tags??null,contentHash:m,contextIdentity:w,upstreamVersion:I,popularityScore:A,sourceUpdatedAt:S}).returning({id:g.id});R&&(a++,await d.insert(xe).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:u,unchanged:l,versionsCreated:p,skipped:f})});Bo.get("/skills/:id",e=>{let t=yE();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)});D();import{Hono as WM}from"hono";import{desc as zM,eq as VM}from"drizzle-orm";D();import{eq as IE,and as HM}from"drizzle-orm";D();var PM=/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,DM="claude-haiku-4-5-20251001",OM=1e3,CM=.7,LM=`You extract pricing and rate-limit changes from AI provider release notes.
1348
+ `);return e.json({memories:[...h]})});bn.get("/memories/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(W).where(Xn(it(W.id,n),it(W.userId,t))).limit(1);return r?e.json(r):e.json({error:"not found"},404)});bn.post("/memories",async e=>{let t=e.get("userId"),n=fM.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:d}=n.data,l=i??await r_(a??null),[m]=await u.select({orgId:R.activeOrgId}).from(R).where(it(R.id,t)).limit(1),[p]=await u.insert(W).values({userId:t,orgId:m?.orgId??null,projectId:l,kind:r,title:o,body:s,source:d??"manual",status:"active"}).returning();return e.json(p,201)});bn.patch("/memories/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=gM.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(W).where(Xn(it(W.id,n),it(W.userId,t))).limit(1);if(!o)return e.json({error:"not found"},404);let{kind:s,title:i,body:a,status:d}=r.data,l=s!==void 0&&s!==o.kind||i!==void 0&&i!==o.title||a!==void 0&&a!==o.body,[m]=await u.update(W).set({kind:s??o.kind,title:i??o.title,body:a??o.body,status:d??o.status,version:l?o.version+1:o.version,updatedAt:new Date}).where(Xn(it(W.id,n),it(W.userId,t))).returning();return e.json(m)});bn.delete("/memories/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.update(W).set({status:"archived",updatedAt:new Date}).where(Xn(it(W.id,n),it(W.userId,t))).returning({id:W.id,status:W.status});return r?e.json({ok:!0,id:r.id,status:r.status}):e.json({error:"not found"},404)});var hM=dt.object({externalSessionId:dt.string().min(1),projectPath:dt.string().optional()});bn.post("/memories/:id/exposures",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=hM.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:W.id,version:W.version,projectId:W.projectId}).from(W).where(Xn(it(W.id,n),it(W.userId,t))).limit(1);return o?(await u.insert(yu).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 _M=dt.object({taskPrompt:dt.string().min(1).max(8e3),expectations:dt.array(dt.string().min(1)).min(1).max(20),trials:dt.number().int().min(1).max(50).default(10),model:dt.string().min(1).max(100).optional()});bn.post("/memories/:id/experiments",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=_M.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:W.id,version:W.version}).from(W).where(Xn(it(W.id,n),it(W.userId,t))).limit(1);if(!o)return e.json({error:"not found"},404);let[s]=await u.insert($t).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 kI({experimentId:s.id,userId:t});return e.json({experiment:s,noLiveWorker:i},201)});bn.get("/memories/:id/experiments",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:W.id}).from(W).where(Xn(it(W.id,n),it(W.userId,t))).limit(1);if(!r)return e.json({error:"not found"},404);let o=await u.select().from($t).where(Xn(it($t.memoryId,n),it($t.userId,t))).orderBy(Om($t.createdAt)).limit(20);return e.json({experiments:o})});bn.get("/memory-experiments/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from($t).where(Xn(it($t.id,n),it($t.userId,t))).limit(1);return r?e.json(r):e.json({error:"not found"},404)});var yM=dt.object({status:dt.enum(["running","completed","failed"]),error:dt.string().max(1e3).nullable().optional(),result:dt.record(dt.unknown()).optional()});bn.patch("/memory-experiments/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=yM.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:$t.id,status:$t.status}).from($t).where(Xn(it($t.id,n),it($t.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 d=o==="completed"||o==="failed",[l]=await u.update($t).set({status:o,...s!==void 0?{error:s}:{},...i!==void 0?{result:i}:{},...o==="running"?{startedAt:new Date}:{},...d?{completedAt:new Date}:{}}).where(Xn(it($t.id,n),it($t.userId,t))).returning();return e.json(l)});O();import{randomBytes as wM,createHash as vM}from"node:crypto";import{Hono as IM}from"hono";import{z as xE}from"zod";import{eq as Cm,and as bM,isNull as EM}from"drizzle-orm";var wa=new IM;function AM(){let n=`rm_${wM(32).toString("base64url")}`,r=vM("sha256").update(n).digest("hex"),o=n.slice(0,11);return{plaintext:n,hash:r,prefix:o}}c(AM,"generateApiKey");var SM=xE.object({name:xE.string().min(1).max(100)});wa.post("/auth/api-keys",async e=>{let t=e.get("userId"),n=await e.req.json(),r=SM.parse(n),{plaintext:o,hash:s,prefix:i}=AM(),[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)});wa.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(Cm(Ae.userId,t)).orderBy(Ae.createdAt);return e.json(n)});wa.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(bM(Cm(Ae.id,n),Cm(Ae.userId,t),EM(Ae.revokedAt)));return r?(await u.update(Ae).set({revokedAt:new Date}).where(Cm(Ae.id,n)),e.json({revoked:!0})):e.json({error:"API key not found"},404)});O();import{Hono as xM}from"hono";import{z as to}from"zod";import{eq as Pt,and as no,isNull as RM,sql as o_}from"drizzle-orm";import{randomUUID as s_}from"node:crypto";var ro=new xM;ro.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(no(Pt(k.id,n),Pt(k.userId,t)));if(!r)return e.json({error:"Target not found"},404);let[o]=await u.select().from(He).where(no(Pt(He.evalTargetId,n),Pt(He.userId,t),Pt(He.status,"active")));if(o)return e.json(o);let[s]=await u.insert(He).values({evalTargetId:n,userId:t}).returning();return e.json(s,201)});ro.get("/eval-targets/:id/conversations",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(He).where(no(Pt(He.evalTargetId,n),Pt(He.userId,t),Pt(He.status,"active")));return r?e.json(r):e.json(null)});var TM=to.object({content:to.string().min(1).max(5e3)});ro.post("/eval-conversations/:id/messages",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=TM.parse(await e.req.json()),[o]=await u.select().from(He).where(no(Pt(He.id,n),Pt(He.userId,t)));if(!o)return e.json({error:"Conversation not found"},404);let s=s_(),i={id:s,role:"user",content:r.content,createdAt:new Date().toISOString()};await u.update(He).set({messages:o_`${He.messages} || ${JSON.stringify([i])}::jsonb`,updatedAt:new Date}).where(Pt(He.id,n));let a={type:"conversation",conversationId:n,messageId:s,messageContent:r.content},{id:d,noLiveWorker:l}=await Ct({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:d,noLiveWorker:l},201)});var kM=to.object({content:to.string(),type:to.enum(["text","status","results","proposal","applied","generated","comparison"]).default("text"),data:to.record(to.unknown()).optional()});ro.post("/eval-conversations/:id/messages/assistant",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=kM.parse(await e.req.json()),o={id:s_(),role:"assistant",content:r.content,type:r.type,data:r.data,createdAt:new Date().toISOString()};return await u.update(He).set({messages:o_`${He.messages} || ${JSON.stringify([o])}::jsonb`,updatedAt:new Date}).where(no(Pt(He.id,n),Pt(He.userId,t))),e.json(o,201)});ro.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(He).where(no(Pt(He.id,n),Pt(He.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 NM=to.object({messageId:to.string().uuid()});ro.post("/eval-conversations/:id/apply-proposal",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=NM.parse(await e.req.json()),[o]=await u.select().from(He).where(no(Pt(He.id,n),Pt(He.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[a]=await u.select().from(k).where(no(Pt(k.id,o.evalTargetId),Pt(k.userId,t)));if(!a)return e.json({error:"Target not found"},404);let[d]=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(Ee).where(no(Pt(Ee.evalTargetId,a.id),RM(Ee.retiredAt)));l.length>0&&await u.insert(Ee).values(l.map(p=>({evalTargetId:d.id,name:p.name,prompt:p.prompt,expectedOutput:p.expectedOutput,files:p.files,expectations:p.expectations})));let m={id:s_(),role:"assistant",content:`Applied changes \u2014 created v${d.version}`,type:"applied",data:{newVersion:d.version,evalTargetId:d.id},createdAt:new Date().toISOString()};return await u.update(He).set({evalTargetId:d.id,messages:o_`${He.messages} || ${JSON.stringify([m])}::jsonb`,updatedAt:new Date}).where(Pt(He.id,n)),e.json({newTarget:d,message:m})});O();import*as va from"node:fs";import*as Vs from"node:path";import{createHash as jM}from"node:crypto";import{fileURLToPath as PM}from"node:url";import{createRequire as DM}from"node:module";import{Hono as OM}from"hono";import{z as vt}from"zod";import{eq as zs,desc as CM,and as LM,sql as MM}from"drizzle-orm";var $M=Vs.dirname(PM(import.meta.url)),Wo=new OM,Lm=null,Mm=null;function qM(){let e=process.env.RULEMETRIC_SKILLS_REGISTRY_PATH;if(e&&va.existsSync(e))return e;try{let n=DM(import.meta.url),r=Vs.dirname(n.resolve("@rulemetric/skills-registry/package.json")),o=Vs.join(r,"registry.json");if(va.existsSync(o))return o}catch{}let t=Vs.resolve($M,"../../../../packages/skills-registry/registry.json");return va.existsSync(t)?t:null}c(qM,"resolveRegistryPath");function RE(){if(Lm)return Lm;let e=qM();return e?(Lm=JSON.parse(va.readFileSync(e,"utf-8")),Lm):null}c(RE,"loadRegistry");function UM(){if(Mm)return Mm;let e=RE();return e?(Mm={version:e.version,generatedAt:e.generatedAt,skills:e.skills.map(({content:t,...n})=>n)},Mm):null}c(UM,"loadRegistryIndex");Wo.get("/skills",e=>{let t=UM();return t?e.json(t):e.json({error:"Skills registry not found"},404)});Wo.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(_o).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:_o.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)});Wo.get("/skills/submissions/approved",async e=>{let n=(await u.select().from(_o).where(zs(_o.status,"approved")).orderBy(CM(_o.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 TE=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(),kind:vt.enum(["skill","supporting"]).optional()}),Xse=vt.object({skills:vt.array(TE).max(5e3)});Wo.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,d=0,l=0,m=0,p=0;for(let _ of i){let w=TE.safeParse(_);if(!w.success){console.warn("[sync-public] Skipping invalid skill entry:",JSON.stringify(w.error.issues)),p++;continue}let f=w.data,h=jM("sha256").update(f.content).digest("hex"),v=`public_skill::${f.source.repo}::${f.id}`,I=f.updatedAt??"1.0.0",[E]=await u.select({id:g.id,contentHash:g.contentHash,popularityScore:g.popularityScore,sourceUpdatedAt:g.sourceUpdatedAt,frontmatter:g.frontmatter,description:g.description}).from(g).where(LM(zs(g.name,f.id),zs(g.scope,"public"))),A=f.popularity&&Math.max(f.popularity.stars??0,f.popularity.installs??0)||null,b=f.sourceUpdatedAt?new Date(f.sourceUpdatedAt):null,S=b&&!Number.isNaN(b.getTime())?b:null;if(E)if(E.contentHash!==h){let P=!1;for(let H=0;H<=4;H++)try{await u.transaction(async N=>{await N.select({id:g.id}).from(g).where(zs(g.id,E.id)).for("update"),await N.update(g).set({description:f.description||f.name,content:f.content,contentHash:h,version:I,upstreamVersion:I,popularityScore:A,sourceUpdatedAt:S,frontmatter:{name:f.name,source:f.source,category:f.category??null,popularity:f.popularity??null,kind:f.kind??"skill"},updatedAt:new Date}).where(zs(g.id,E.id));let[U]=await N.select({max:MM`coalesce(max(${xe.versionNumber}), 0)`}).from(xe).where(zs(xe.instructionId,E.id));await N.insert(xe).values({instructionId:E.id,versionNumber:(U?.max??0)+1,content:f.content,frontmatter:{name:f.name,source:f.source,category:f.category??null},changeSummary:`Synced from registry (${I})`})}),P=!0;break}catch(N){if(N.cause?.code==="23505"){if(H<4)continue;break}throw N}if(!P)continue;d++,m++}else{let T=E.sourceUpdatedAt?.getTime()??null,P=S?.getTime()??null,H=E.popularityScore!==A,N=S!==null&&T!==P,U=E.frontmatter??{},q=f.kind??"skill",B=U.kind!==q,J=f.description||f.name,ce=E.description!==J,V=U.name!==f.name;(H||N||B||ce||V)&&await u.update(g).set({...H?{popularityScore:A}:{},...N?{sourceUpdatedAt:S}:{},...ce?{description:J}:{},...B||V?{frontmatter:{...U,kind:q,name:f.name}}:{}}).where(zs(g.id,E.id)),l++}else{let[T]=await u.insert(g).values({name:f.id,description:f.description||f.name,type:"skill",scope:"public",scopeRef:null,version:I,content:f.content,frontmatter:{name:f.name,source:f.source,category:f.category??null,popularity:f.popularity??null,kind:f.kind??"skill"},tags:f.tags??null,contentHash:h,contextIdentity:v,upstreamVersion:I,popularityScore:A,sourceUpdatedAt:S}).returning({id:g.id});T&&(a++,await u.insert(xe).values({instructionId:T.id,versionNumber:1,content:f.content,frontmatter:{name:f.name,source:f.source,category:f.category??null},changeSummary:"Initial sync from public registry"}),m++)}}return e.json({inserted:a,updated:d,unchanged:l,versionsCreated:m,skipped:p})});Wo.get("/skills/:id",e=>{let t=RE();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 ZM}from"hono";import{desc as e$,eq as t$}from"drizzle-orm";O();import{eq as NE,and as YM}from"drizzle-orm";O();var HM=/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,BM="claude-haiku-4-5-20251001",FM=1e3,WM=.7,zM=`You extract pricing and rate-limit changes from AI provider release notes.
1344
1349
  Return a JSON object: {
1345
1350
  "observations": [
1346
1351
  {
@@ -1355,71 +1360,66 @@ Return a JSON object: {
1355
1360
  }
1356
1361
  Only emit observations if the release notes EXPLICITLY state a numeric value.
1357
1362
  Do NOT speculate. Do NOT emit observations for "increased by X%" without an absolute number.
1358
- Return { "observations": [] } if nothing concrete.`;function MM(){let e=process.env.ANTHROPIC_API_KEY;if(!e)return null;let t=Dc("anthropic",e);return async n=>{let r=await t.complete(n,{model:DM,maxTokens:OM,temperature:0});return{text:r.text,usage:{inputTokens:r.usage?.inputTokens??0,outputTokens:r.usage?.outputTokens??0}}}}c(MM,"defaultLlm");async function $M(e){await d.insert(ve).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)})}c($M,"defaultObserve");function qM(e){return`${LM}
1363
+ Return { "observations": [] } if nothing concrete.`;function VM(){let e=process.env.ANTHROPIC_API_KEY;if(!e)return null;let t=Dc("anthropic",e);return async n=>{let r=await t.complete(n,{model:BM,maxTokens:FM,temperature:0});return{text:r.text,usage:{inputTokens:r.usage?.inputTokens??0,outputTokens:r.usage?.outputTokens??0}}}}c(VM,"defaultLlm");async function JM(e){await u.insert(ve).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)})}c(JM,"defaultObserve");function KM(e){return`${zM}
1359
1364
 
1360
1365
  Release notes (harness=${e.harness}, version=${e.version}):
1361
1366
 
1362
- ${e.body??""}`}c(qM,"buildPrompt");function UM(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 u=a;if(typeof u.limitType!="string"||typeof u.plan!="string"||typeof u.value!="number"||!Number.isFinite(u.value)||typeof u.unit!="string")continue;let l=u.comparator===">="||u.comparator==="<="?u.comparator:"=";i.push({limitType:u.limitType,plan:u.plan,value:u.value,unit:u.unit,comparator:l,evidence_quote:typeof u.evidence_quote=="string"?u.evidence_quote:""})}return{observations:i}}c(UM,"parseLlmJson");async function vE(e,t={}){let n=e.body??"";if(!PM.test(n))return{observations:[],llm_called:!1,reason:"no keywords matched"};let r=t.llm===void 0?MM():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 u=await r(qM(e));o=u.text,s=u.usage}catch(u){return{observations:[],llm_called:!0,error:`LLM call failed: ${u instanceof Error?u.message:String(u)}`}}let i;try{i=UM(o).observations}catch(u){return{observations:[],llm_called:!0,llm_tokens:{input:s.inputTokens,output:s.outputTokens},error:`failed to parse LLM JSON: ${u instanceof Error?u.message:String(u)}`}}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??$M;for(let u of i)await a({plan:u.plan,limitType:u.limitType,value:u.value,unit:u.unit,comparator:u.comparator,sourceType:"release_notes",sourceUrl:e.url,sourceEvidence:{harness:e.harness,version:e.version,publishedAt:e.publishedAt.toISOString(),quote:u.evidence_quote,fullBody:n},confidence:CM,provider:"anthropic"});return{observations:i,llm_called:!0,llm_tokens:{input:s.inputTokens,output:s.outputTokens}}}c(vE,"extractAndPostObservationsFromRelease");var bE=[{harness:"claude_code",repo:"anthropics/claude-code"},{harness:"codex",repo:"openai/codex"}];function BM(e){return e.prerelease===!0||/-(alpha|beta|rc)\b/i.test(e.tag_name)}c(BM,"isPrerelease");function FM(e){let t=[],n=[],r=[],o=e.split(`
1363
- `);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 u=a.toLowerCase();u.startsWith("security:")||u.includes("security fix")||u.includes("cve-")?r.push(a):u.startsWith("fixed ")||u.startsWith("fix ")||u.startsWith("fixed:")?n.push(a):t.push(a)}return{features:t,fixes:n,security:r}}c(FM,"parseReleaseBody");async function Pp(e){let t=e?bE.filter(o=>o.harness===e):bE,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 u=await a.json();r+=u.length;for(let l of u){if(BM(l))continue;let p=FM(l.body??"");if((await d.select({id:$t.id}).from($t).where(HM(IE($t.harness,o.harness),IE($t.version,l.tag_name)))).length===0){await d.insert($t).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 vE({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}}c(Pp,"syncHarnessReleases");var xu=new WM;xu.get("/harness-releases",async e=>{let t=e.req.query("harness"),n=Math.min(Number(e.req.query("limit")??50),100),r=t?VM($t.harness,t):void 0,o=await d.select({id:$t.id,harness:$t.harness,version:$t.version,publishedAt:$t.publishedAt,title:$t.title,categories:$t.categories,url:$t.url}).from($t).where(r).orderBy(zM($t.publishedAt)).limit(n);return e.json(o)});xu.post("/harness-releases/sync",async e=>{let t=await e.req.json().catch(()=>({})),n=await Pp(t.harness);return e.json(n)});D();import{Hono as JM}from"hono";import{and as Dp,desc as KM,eq as Ia,isNull as Zh,sql as GM}from"drizzle-orm";var ba=new JM;ba.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"?Dp(Ia(Tt.userId,t),Zh(Tt.readAt)):Ia(Tt.userId,t),i=await d.select().from(Tt).where(s).orderBy(KM(Tt.createdAt)).limit(n).offset(r),[{count:a}]=await d.select({count:GM`count(*)::int`}).from(Tt).where(Dp(Ia(Tt.userId,t),Zh(Tt.readAt)));return e.json({items:i,unreadCount:a})});ba.post("/notifications/:id/read",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await d.update(Tt).set({readAt:new Date}).where(Dp(Ia(Tt.id,t),Ia(Tt.userId,n))).returning();return r?e.json(r):e.json({error:"Not found"},404)});ba.post("/notifications/read-all",async e=>{let t=e.get("userId");return await d.update(Tt).set({readAt:new Date}).where(Dp(Ia(Tt.userId,t),Zh(Tt.readAt))),e.json({success:!0})});D();import{Hono as YM}from"hono";import{z as sn}from"zod";import{eq as Dr,and as Op,desc as XM,ne as QM}from"drizzle-orm";var Fo=new YM;function ZM(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}}}c(ZM,"parseTerminalTargetResult");async function e$(e){let t=ZM(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(Op(Dr(y.userId,e.userId),Dr(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}})}c(e$,"upsertTerminalTargetFromLaunchResult");var t$=sn.object({tool:sn.string().min(1),config:sn.object({projectPath:sn.string().min(1),prompt:sn.string().optional(),systemPrompt:sn.string().optional(),model:sn.string().optional(),mode:sn.enum(["headless","interactive"]).default("interactive"),timeout:sn.number().int().positive().optional(),resumeSessionId:sn.string().optional()})});Fo.post("/launch-jobs",async e=>{let t=e.get("userId"),n=await e.req.json(),r=t$.parse(n),{id:o,noLiveWorker:s}=await Ot({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(ue).where(Dr(ue.id,o));return e.json({...i,noLiveWorker:s},201)});Fo.get("/launch-jobs",async e=>{let t=e.get("userId"),n=Number(e.req.query("limit")??50),r=await d.select().from(ue).where(Dr(ue.userId,t)).orderBy(XM(ue.createdAt)).limit(n);return e.json(r)});var n$=sn.object({status:sn.enum(["running","completed","failed"]).optional(),attempts:sn.number().int().nonnegative().optional(),error:sn.string().optional(),result:sn.record(sn.unknown()).optional()});Fo.patch("/launch-jobs/:id/state",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=n$.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(ue).set(o).where(Op(Dr(ue.id,n),Dr(ue.userId,t),QM(ue.status,"cancelled"))).returning();if(!s){let[i]=await d.select().from(ue).where(Op(Dr(ue.id,n),Dr(ue.userId,t)));return i?e.json(i):e.json({error:"Job not found"},404)}return r.result!==void 0&&await e$({userId:t,jobId:n,config:s.config,result:r.result}),e.json(s)});Fo.post("/launch-jobs/:id/cancel",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.update(ue).set({status:"cancelled",updatedAt:new Date}).where(Op(Dr(ue.id,n),Dr(ue.userId,t))).returning();return r?e.json(r):e.json({error:"Job not found"},404)});Fo.get("/launchers",async e=>{let{getAvailableLaunchers:t}=await Promise.resolve().then(()=>(Vl(),Ob));return e.json(t())});D();import{Hono as r$}from"hono";import{z as Xn}from"zod";import{eq as Ne,and as Kt,desc as Lp,inArray as Cp,isNull as o$,ne as s$}from"drizzle-orm";Vl();var Or=new r$,i$=Xn.object({tool:Xn.string().min(1),model:Xn.string().optional(),label:Xn.string().optional()}),a$=Xn.object({title:Xn.string().optional(),projectPath:Xn.string().min(1),gitRemote:Xn.string().optional(),baseBranch:Xn.string().optional(),prompt:Xn.string().optional(),autoWorktree:Xn.boolean().optional(),sessions:Xn.array(i$).min(1).max(8)});function c$(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/(^-|-$)/g,"")||"tool"}c(c$,"sanitizeTool");var u$=new Set(["pending","claimed","running"]);var d$=1800*1e3;function EE(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>d$:!1}c(EE,"canSkipRollup");function AE(e,t,n){if(e==="cancelled")return"cancelled";let r=t.length>0,o=t.some(a=>a.endedAt==null),s=n.some(a=>u$.has(a.status));return n.length>0&&n.every(a=>a.status==="failed")&&!r?"failed":o||s&&r?"running":r&&!o&&!s?"completed":"pending"}c(AE,"rollupRunStatus");async function SE(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(Z).set(n).where(Kt(Ne(Z.id,e.runId),Ne(Z.userId,e.userId),s$(Z.status,"cancelled")))}catch{}}c(SE,"persistRolledUpStatus");function l$(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}c(l$,"frictionCount");async function p$(e,t){if(!e||typeof e!="object")return null;let n=e,r="claude-sonnet-4-6",o=$o(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 Xr(d,s,r,t,o);return i?{...i,estimated:!0}:null}c(p$,"deriveSessionCost");async function xE(e,t){let[n]=await d.select({id:Z.id,autoWorktree:Z.autoWorktree}).from(Z).where(Kt(Ne(Z.id,e),Ne(Z.userId,t))).limit(1);if(!n||!n.autoWorktree)return{linked:0};let r=await d.select({config:ue.config,result:ue.result}).from(ue).where(Kt(Ne(ue.runId,e),Ne(ue.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 u=i.config??{};u.worktree?.create&&typeof u.worktree.branch=="string"&&typeof u.projectPath=="string"&&o.add(zl({repoRoot:u.projectPath,branch:u.worktree.branch}))}return o.size===0?{linked:0}:{linked:(await d.update(y).set({runId:e}).where(Kt(Ne(y.userId,t),o$(y.runId),Cp(y.projectPath,[...o]))).returning({id:y.id})).length}}c(xE,"linkRunSessions");Or.post("/runs",async e=>{let t=e.get("userId"),n=await e.req.json(),r=a$.parse(n),o=await To(t,null),s=r.autoWorktree??!0,i=r.baseBranch??"HEAD",a=null;if(r.projectPath){let[f]=await d.select({projectId:ye.projectId}).from(ye).where(Ne(ye.path,r.projectPath)).orderBy(Lp(ye.lastSeen)).limit(1);a=f?.projectId??null}if(!a&&r.gitRemote){let[f]=await d.select({id:C.id}).from(C).where(Ne(C.gitRemoteUrl,r.gitRemote)).limit(1);a=f?.id??null}let[u]=await d.insert(Z).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=u.id.slice(0,8),p=!1;try{for(let f=0;f<r.sessions.length;f++){let _=r.sessions[f],v=`rm/run-${l}/s${f}-${c$(_.tool)}`,h={projectPath:r.projectPath,prompt:r.prompt,systemPrompt:void 0,model:_.model,mode:"interactive",worktree:{create:s,branch:v,baseRef:i},runId:u.id},m=await Ot({taskName:"process_launch",userId:t,payload:{tool:_.tool,config:h},mirror:{userId:t,tool:_.tool,config:h},runId:u.id});p=p||m.noLiveWorker}}catch(f){return await d.update(Z).set({status:"failed",updatedAt:new Date}).where(Ne(Z.id,u.id)),await d.update(ue).set({status:"cancelled",updatedAt:new Date}).where(Kt(Ne(ue.runId,u.id),Ne(ue.status,"pending"))),e.json({error:"Failed to enqueue all launch jobs",detail:f instanceof Error?f.message:String(f),run:{...u,status:"failed"}},500)}return e.json({run:u,noLiveWorker:p},201)});Or.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?Kt(Ne(Z.userId,t),Ne(Z.projectId,i)):Ne(Z.userId,t),u=await d.select({id:Z.id,userId:Z.userId,orgId:Z.orgId,projectId:Z.projectId,projectPath:Z.projectPath,gitRemote:Z.gitRemote,baseBranch:Z.baseBranch,title:Z.title,toolSpec:Z.toolSpec,autoWorktree:Z.autoWorktree,status:Z.status,sessionCount:Z.sessionCount,createdAt:Z.createdAt,updatedAt:Z.updatedAt,completedAt:Z.completedAt}).from(Z).where(a).orderBy(Lp(Z.createdAt)).limit(r).offset(s),l=u.filter(f=>!EE(f.status,f.completedAt)),p=l.map(f=>f.id);if(p.length>0){let[f,_]=await Promise.all([d.select({runId:y.runId,endedAt:y.endedAt}).from(y).where(Kt(Ne(y.userId,t),Cp(y.runId,p))),d.select({runId:ue.runId,status:ue.status}).from(ue).where(Kt(Ne(ue.userId,t),Cp(ue.runId,p)))]),v=new Map;for(let m of f){if(!m.runId)continue;let w=v.get(m.runId)??[];w.push({endedAt:m.endedAt}),v.set(m.runId,w)}let h=new Map;for(let m of _){if(!m.runId)continue;let w=h.get(m.runId)??[];w.push({status:m.status}),h.set(m.runId,w)}await Promise.all(l.map(async m=>{let w=AE(m.status,v.get(m.id)??[],h.get(m.id)??[]);w!==m.status&&(await SE({runId:m.id,userId:t,stored:m.status,rolled:w,hadCompletedAt:m.completedAt!=null}),m.status=w,m.completedAt==null&&(w==="completed"||w==="failed"||w==="cancelled")&&(m.completedAt=new Date))}))}return e.json({runs:u})});Or.get("/runs/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select().from(Z).where(Kt(Ne(Z.id,n),Ne(Z.userId,t))).limit(1);if(!r)return e.json({error:"Run not found"},404);try{await xE(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(Kt(Ne(y.runId,n),Ne(y.userId,t))).orderBy(Lp(y.startedAt)),s=o.map(w=>w.id);if(!EE(r.status,r.completedAt)){let w=await d.select({status:ue.status}).from(ue).where(Kt(Ne(ue.runId,n),Ne(ue.userId,t))),I=AE(r.status,o.map(b=>({endedAt:b.endedAt})),w);I!==r.status&&(await SE({runId:n,userId:t,stored:r.status,rolled:I,hadCompletedAt:r.completedAt!=null}),r.status=I,r.completedAt==null&&(I==="completed"||I==="failed"||I==="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,Ne(g.id,se.instructionId)).where(Cp(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 u=await Promise.all(o.map(async w=>{let I=w.analysis??{},b=typeof I.goalSummary=="string"?I.goalSummary:null,A=typeof I.outcome=="string"?I.outcome:null,E=I.friction??null,S=await p$(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:b,outcome:A,friction:E,cost:S,instructions:a.get(w.id)??[]}})),l=u.map(w=>({sessionId:w.id,score:w.outcome!=null?Si[w.outcome]??-1:-1,costUsd:w.cost?.totalUsd??Number.POSITIVE_INFINITY,frictionCount:l$(w.friction)})).sort((w,I)=>I.score!==w.score?I.score-w.score:w.costUsd!==I.costUsd?w.costUsd-I.costUsd:w.frictionCount-I.frictionCount).map((w,I)=>({sessionId:w.sessionId,rank:I+1,isWinner:I===0&&w.score>=0,score:w.score,costUsd:Number.isFinite(w.costUsd)?w.costUsd:null,frictionCount:w.frictionCount})),p=new Map,f=new Map;for(let w of i)p.set(w.instructionId,w.name),f.has(w.instructionId)||f.set(w.instructionId,new Set),f.get(w.instructionId).add(w.sessionId);let _=s.length,v=[],h=[];for(let[w,I]of f){let b=p.get(w)??"Unknown";_>0&&I.size===_?v.push({id:w,name:b}):h.push({id:w,name:b,sessionIds:[...I]})}let m=null;return r.autoWorktree?r.sessionCount>0&&u.length<r.sessionCount&&(m=`Only ${u.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.`):m="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:u,comparison:{ranking:l,instructionDiff:{shared:v,differing:h}},attributionCaveat:m})});Or.post("/runs/:id/link-sessions",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select({id:Z.id}).from(Z).where(Kt(Ne(Z.id,n),Ne(Z.userId,t))).limit(1);if(!r)return e.json({error:"Run not found"},404);let{linked:o}=await xE(n,t);return e.json({linked:o})});Or.get("/runs/:id/jobs",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select({id:Z.id}).from(Z).where(Kt(Ne(Z.id,n),Ne(Z.userId,t))).limit(1);if(!r)return e.json({error:"Run not found"},404);let o=await d.select({id:ue.id,runId:ue.runId,status:ue.status,tool:ue.tool}).from(ue).where(Kt(Ne(ue.runId,n),Ne(ue.userId,t))).orderBy(Lp(ue.createdAt));return e.json(o)});Or.post("/runs/:id/cancel",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select({id:Z.id}).from(Z).where(Kt(Ne(Z.id,n),Ne(Z.userId,t))).limit(1);if(!r)return e.json({error:"Run not found"},404);await d.update(ue).set({status:"cancelled",updatedAt:new Date}).where(Kt(Ne(ue.runId,n),Ne(ue.userId,t),Ne(ue.status,"pending")));let[o]=await d.update(Z).set({status:"cancelled",updatedAt:new Date}).where(Kt(Ne(Z.id,n),Ne(Z.userId,t))).returning();return e.json({run:o})});Or.post("/runs/:id/cleanup",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select({id:Z.id}).from(Z).where(Kt(Ne(Z.id,n),Ne(Z.userId,t))).limit(1);if(!r)return e.json({error:"Run not found"},404);let{noLiveWorker:o}=await yI({runId:n,userId:t});return e.json({enqueued:!0,noLiveWorker:o})});D();import{Hono as m$}from"hono";import{z as Vs}from"zod";import{and as Ea,desc as e_,eq as Zt,or as TE}from"drizzle-orm";var Js=new m$;function f$(e,t){return{liveSend:e?.kind==="tmux"&&e.status==="active"&&t,fallbackResume:!0,tmuxAvailable:e?.kind==="tmux"&&e.status!=="fallback_only",workerOnline:t}}c(f$,"capabilitiesFor");Js.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(Ea(Zt(y.id,n),Zt(y.userId,t))).limit(1);if(!r)return e.json({error:"Session not found"},404);let o=r.externalSessionId?TE(Zt(Ze.sessionId,r.id),Zt(Ze.externalSessionId,r.externalSessionId)):Zt(Ze.sessionId,r.id),[s]=await d.select().from(Ze).where(Ea(Zt(Ze.userId,t),o)).orderBy(e_(Ze.lastSeenAt)).limit(1),i=await Ui(t);return e.json({target:s??null,capabilities:f$(s??null,i),...s?{}:{reason:"no_target"}})});var RE=Vs.enum(["active","missing","unknown","fallback_only"]),g$=Vs.object({message:Vs.string().min(1).max(16*1024),delivery:Vs.enum(["live","fallback"]).default("live"),submit:Vs.boolean().optional().default(!0)});Js.post("/sessions/:id/send",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=g$.parse(await e.req.json()),[o]=await d.select({id:y.id,externalSessionId:y.externalSessionId,projectPath:y.projectPath}).from(y).where(Ea(Zt(y.id,n),Zt(y.userId,t))).limit(1);if(!o)return e.json({error:"Session not found"},404);let s=o.externalSessionId?TE(Zt(Ze.sessionId,o.id),Zt(Ze.externalSessionId,o.externalSessionId)):Zt(Ze.sessionId,o.id),[i]=await d.select().from(Ze).where(Ea(Zt(Ze.userId,t),Zt(Ze.status,"active"),s)).orderBy(e_(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 p={projectPath:o.projectPath,mode:"interactive",resumeSessionId:o.externalSessionId,prompt:r.message},f={tool:"claude_code",config:p},{id:_,noLiveWorker:v}=await Ot({taskName:"process_launch",payload:f,userId:t,mirror:{userId:t,tool:"claude_code",config:p}});return e.json({delivery:"fallback",job:{id:_,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 Ui(t))return e.json({error:"Worker offline",code:"WORKER_OFFLINE"},409);let u={sessionId:o.id,terminalTargetId:i.id,target:i.target,message:r.message,submit:r.submit},{id:l}=await Ot({taskName:"process_send_message",payload:u,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 h$=Vs.object({status:RE,lastSeenAt:Vs.string().datetime().optional()});Js.patch("/terminal-targets/:id/status",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=h$.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(Ea(Zt(Ze.id,n),Zt(Ze.userId,t))).returning();return i?e.json({target:i}):e.json({error:"Terminal target not found"},404)});Js.get("/terminal-targets",async e=>{let t=e.get("userId"),n=e.req.query("status"),r=n?RE.parse(n):null,o=await d.select().from(Ze).where(Ea(Zt(Ze.userId,t),...r?[Zt(Ze.status,r)]:[])).orderBy(e_(Ze.lastSeenAt)).limit(100);return e.json({targets:o})});import{Hono as n1}from"hono";D();import{Hono as v$}from"hono";import{z as Wo}from"zod";import{eq as no,asc as NE,sql as I$}from"drizzle-orm";D();import{eq as t_,and as _$}from"drizzle-orm";function vt(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:Y.id,slug:Y.slug}).from(Y).where(t_(Y.slug,o));if(!s)return t.json({error:"Organization not found",code:"ORG_NOT_FOUND"},404);let[i]=await d.select({role:ee.role}).from(ee).where(_$(t_(ee.orgId,s.id),t_(ee.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()}}c(vt,"requireOrgRole");D();import{eq as kE,and as y$,sql as w$}from"drizzle-orm";var to=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Mp=w$`case ${ee.role}
1364
- when 'owner' then 0
1365
- when 'admin' then 1
1366
- when 'member' then 2
1367
- else 3
1368
- end`;async function Ks(e){let t=e.req.param("teamId");if(!t||!to.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:X.id,orgId:X.orgId,name:X.name,slug:X.slug,createdAt:X.createdAt}).from(X).where(y$(kE(X.id,t),kE(X.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)}}c(Ks,"loadTeamInOrg");var Aa=/^(?=.{3,40}$)[a-z0-9]+(?:-[a-z0-9]+)*$/,Sa="Slug must be 3-40 chars, lowercase alphanumerics with single dashes only \u2014 no leading, trailing, or consecutive dashes";var zo=new v$,b$=Wo.object({name:Wo.string().min(1).max(100),slug:Wo.string().regex(Aa,{message:Sa})}),E$=Wo.object({name:Wo.string().min(1).max(100).optional(),slug:Wo.string().regex(Aa,{message:Sa}).optional()});zo.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=b$.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=Qt(a),p=No(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 u=i;return e.json({id:u.id,name:u.name,slug:u.slug,role:"owner"},201)});zo.get("/orgs",async e=>{let t=e.get("userId"),n=await d.select({id:Y.id,name:Y.name,slug:Y.slug,role:ee.role,createdAt:Y.createdAt}).from(ee).innerJoin(Y,no(ee.orgId,Y.id)).where(no(ee.userId,t)).orderBy(Y.createdAt);return e.json(n.map(r=>({id:r.id,name:r.name,slug:r.slug,role:r.role})))});zo.get("/orgs/:slug",vt(["owner","admin","member"]),async e=>{let t=e.get("orgId"),[n]=await d.select({id:Y.id,name:Y.name,slug:Y.slug,createdAt:Y.createdAt}).from(Y).where(no(Y.id,t)),r=await d.select({userId:ee.userId,role:ee.role,joinedAt:ee.createdAt,email:T.email,displayName:T.displayName}).from(ee).leftJoin(T,no(ee.userId,T.id)).where(no(ee.orgId,t)).orderBy(Mp,NE(ee.createdAt)),o=await d.select({id:X.id,name:X.name,slug:X.slug,memberCount:I$`count(${we.userId})::int`}).from(X).leftJoin(we,no(we.teamId,X.id)).where(no(X.orgId,t)).groupBy(X.id,X.name,X.slug).orderBy(NE(X.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)}))})});zo.patch("/orgs/:slug",vt(["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=E$.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 d.update(Y).set(i).where(no(Y.id,t)).returning({id:Y.id,name:Y.name,slug:Y.slug});return e.json({id:a.id,name:a.name,slug:a.slug})}catch(a){if(Qt(a)==="23505")return e.json({error:"Slug already taken",code:"ORG_SLUG_TAKEN"},409);throw a}});zo.delete("/orgs/:slug",vt(["owner"]),async e=>{let t=e.get("orgId");return await d.delete(Y).where(no(Y.id,t)),e.body(null,204)});var A$=Wo.object({newOwnerId:Wo.string().uuid()});zo.post("/orgs/:slug/transfer",vt(["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=A$.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=Qt(a),p=No(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 u=i;return e.json({orgId:u.orgId,newOwnerId:u.newOwnerId,oldOwnerId:u.oldOwnerId})});D();import{Hono as S$}from"hono";import{z as jE}from"zod";import{eq as Tu,and as PE,asc as x$,max as T$,inArray as DE}from"drizzle-orm";var Ru=new S$;Ru.get("/orgs/:slug/members",vt(["owner","admin"]),async e=>{let t=e.get("orgId"),n=await d.select({userId:ee.userId,role:ee.role,joinedAt:ee.createdAt,email:T.email,displayName:T.displayName}).from(ee).leftJoin(T,Tu(ee.userId,T.id)).where(Tu(ee.orgId,t)).orderBy(Mp,x$(ee.createdAt)),r=n.map(u=>u.userId),o=r.length?await d.select({userId:we.userId,teamId:X.id,teamName:X.name,teamSlug:X.slug}).from(we).innerJoin(X,Tu(we.teamId,X.id)).where(PE(Tu(X.orgId,t),DE(we.userId,r))):[],s=new Map;for(let u of o){let l=s.get(u.userId)??[];l.push({id:u.teamId,name:u.teamName,slug:u.teamSlug}),s.set(u.userId,l)}let i=r.length?await d.select({userId:y.userId,lastActiveAt:T$(y.startedAt)}).from(y).where(PE(Tu(y.orgId,t),DE(y.userId,r))).groupBy(y.userId):[],a=new Map;for(let u of i)a.set(u.userId,u.lastActiveAt);return e.json(n.map(u=>{let l=a.get(u.userId)??null;return{userId:u.userId,email:u.email,displayName:u.displayName,role:u.role,joinedAt:u.joinedAt,teams:s.get(u.userId)??[],lastActiveAt:l?new Date(l).toISOString():null}}))});var R$=jE.object({role:jE.enum(["owner","admin","member"])});Ru.patch("/orgs/:slug/members/:userId",vt(["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||!to.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=R$.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=Qt(a),p=No(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 u=i;return e.json({userId:u.userId,orgId:u.orgId,role:u.role})});Ru.delete("/orgs/:slug/members/:userId",vt(["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||!to.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:u}=await t.rpc("remove_member",{p_org:a,p_user:n});if(u){let l=Qt(u),p=No(u);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 u}return e.body(null,204)});D();import{Hono as k$}from"hono";import{z as Vo}from"zod";import{eq as Jo,and as OE,asc as N$,sql as j$}from"drizzle-orm";var Ko=new k$,P$=Vo.object({name:Vo.string().min(1).max(100),slug:Vo.string().regex(Aa,{message:Sa})}),D$=Vo.object({name:Vo.string().min(1).max(100).optional(),slug:Vo.string().regex(Aa,{message:Sa}).optional()}),O$=Vo.object({userId:Vo.string().uuid()});Ko.get("/orgs/:slug/teams",vt(["owner","admin","member"]),async e=>{let t=e.get("orgId"),n=await d.select({id:X.id,name:X.name,slug:X.slug,createdAt:X.createdAt,memberCount:j$`count(${we.userId})::int`}).from(X).leftJoin(we,Jo(we.teamId,X.id)).where(Jo(X.orgId,t)).groupBy(X.id,X.name,X.slug,X.createdAt).orderBy(N$(X.name));return e.json(n.map(r=>({id:r.id,name:r.name,slug:r.slug,memberCount:Number(r.memberCount),createdAt:r.createdAt})))});Ko.post("/orgs/:slug/teams",vt(["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=P$.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(X).values({orgId:r,name:o,slug:s}).returning({id:X.id,orgId:X.orgId,name:X.name,slug:X.slug,createdAt:X.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(Qt(i)==="23505")return e.json({error:"Slug already taken",code:"TEAM_SLUG_TAKEN"},409);throw i}});Ko.patch("/orgs/:slug/teams/:teamId",vt(["owner","admin"]),async e=>{let t=await Ks(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=D$.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 d.update(X).set(i).where(Jo(X.id,t.team.id)).returning({id:X.id,orgId:X.orgId,name:X.name,slug:X.slug,createdAt:X.createdAt});return e.json({id:a.id,orgId:a.orgId,name:a.name,slug:a.slug,createdAt:a.createdAt})}catch(a){if(Qt(a)==="23505")return e.json({error:"Slug already taken",code:"TEAM_SLUG_TAKEN"},409);throw a}});Ko.delete("/orgs/:slug/teams/:teamId",vt(["owner","admin"]),async e=>{let t=await Ks(e);return t.ok?(await d.delete(X).where(Jo(X.id,t.team.id)),e.body(null,204)):t.response});Ko.post("/orgs/:slug/teams/:teamId/members",vt(["owner","admin"]),async e=>{let t=await Ks(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=O$.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:ee.userId}).from(ee).where(OE(Jo(ee.userId,o),Jo(ee.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(we).values({userId:o,teamId:t.team.id})}catch(a){if(Qt(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)});Ko.delete("/orgs/:slug/teams/:teamId/members/:userId",vt(["owner","admin"]),async e=>{let t=await Ks(e);if(!t.ok)return t.response;let n=e.req.param("userId");return!n||!to.test(n)?e.json({error:"Invalid userId path param",code:"BAD_REQUEST"},400):(await d.delete(we).where(OE(Jo(we.teamId,t.team.id),Jo(we.userId,n))).returning({userId:we.userId})).length===0?e.json({error:"User is not a member of this team",code:"NOT_TEAM_MEMBER"},404):e.body(null,204)});D();import{Hono as K$}from"hono";import{z as Bp}from"zod";import{randomBytes as G$}from"node:crypto";import{eq as Qn,and as Fp,desc as Y$,sql as X$,isNull as Ta,gt as Q$}from"drizzle-orm";import{randomBytes as C$}from"node:crypto";async function n_(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}
1369
- `),{id:`noop-${C$(8).toString("hex")}`,provider:"noop"}}c(n_,"sendNoopEmail");var $p=null;async function L$(){if($p)return $p;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 $p=new t(e),$p}c(L$,"getClient");var CE=!1;function M$(){let e=process.env.RESEND_FROM_EMAIL;if(e)return e;if(!CE){CE=!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.
1370
- `)}return"onboarding@resend.dev"}c(M$,"resolveFromEmail");async function LE(e){let t=e.fromName??"RuleMetric",n=M$(),r=`${t} <${n}>`,o=await L$(),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"}}c(LE,"sendResendEmail");async function ME(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.")}c(ME,"sendSmtpEmail");var $$="#2DD4BF",q$="#0d9488",U$="#0A0C12",qp="#1a1a1a",Up="#666666",$E="#f5f5f7",H$="#ffffff",qE="#e5e5e9";function B$(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}`}c(B$,"formatExpiresAt");function xa(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}c(xa,"escapeHtml");function F$(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."}}c(F$,"roleCopy");function r_(e){let{orgName:t,inviterName:n,role:r,acceptUrl:o,expiresAt:s}=e,i=`${n} invited you to ${t} on RuleMetric`,a=B$(s),{article:u,description:l}=F$(r),p=`<!doctype html>
1367
+ ${e.body??""}`}c(KM,"buildPrompt");function GM(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 d=a;if(typeof d.limitType!="string"||typeof d.plan!="string"||typeof d.value!="number"||!Number.isFinite(d.value)||typeof d.unit!="string")continue;let l=d.comparator===">="||d.comparator==="<="?d.comparator:"=";i.push({limitType:d.limitType,plan:d.plan,value:d.value,unit:d.unit,comparator:l,evidence_quote:typeof d.evidence_quote=="string"?d.evidence_quote:""})}return{observations:i}}c(GM,"parseLlmJson");async function kE(e,t={}){let n=e.body??"";if(!HM.test(n))return{observations:[],llm_called:!1,reason:"no keywords matched"};let r=t.llm===void 0?VM():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 d=await r(KM(e));o=d.text,s=d.usage}catch(d){return{observations:[],llm_called:!0,error:`LLM call failed: ${d instanceof Error?d.message:String(d)}`}}let i;try{i=GM(o).observations}catch(d){return{observations:[],llm_called:!0,llm_tokens:{input:s.inputTokens,output:s.outputTokens},error:`failed to parse LLM JSON: ${d instanceof Error?d.message:String(d)}`}}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??JM;for(let d of i)await a({plan:d.plan,limitType:d.limitType,value:d.value,unit:d.unit,comparator:d.comparator,sourceType:"release_notes",sourceUrl:e.url,sourceEvidence:{harness:e.harness,version:e.version,publishedAt:e.publishedAt.toISOString(),quote:d.evidence_quote,fullBody:n},confidence:WM,provider:"anthropic"});return{observations:i,llm_called:!0,llm_tokens:{input:s.inputTokens,output:s.outputTokens}}}c(kE,"extractAndPostObservationsFromRelease");var jE=[{harness:"claude_code",repo:"anthropics/claude-code"},{harness:"codex",repo:"openai/codex"}];function XM(e){return e.prerelease===!0||/-(alpha|beta|rc)\b/i.test(e.tag_name)}c(XM,"isPrerelease");function QM(e){let t=[],n=[],r=[],o=e.split(`
1368
+ `);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 d=a.toLowerCase();d.startsWith("security:")||d.includes("security fix")||d.includes("cve-")?r.push(a):d.startsWith("fixed ")||d.startsWith("fix ")||d.startsWith("fixed:")?n.push(a):t.push(a)}return{features:t,fixes:n,security:r}}c(QM,"parseReleaseBody");async function $m(e){let t=e?jE.filter(o=>o.harness===e):jE,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 d=await a.json();r+=d.length;for(let l of d){if(XM(l))continue;let m=QM(l.body??"");if((await u.select({id:qt.id}).from(qt).where(YM(NE(qt.harness,o.harness),NE(qt.version,l.tag_name)))).length===0){await u.insert(qt).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 kE({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}}c($m,"syncHarnessReleases");var Td=new ZM;Td.get("/harness-releases",async e=>{let t=e.req.query("harness"),n=Math.min(Number(e.req.query("limit")??50),100),r=t?t$(qt.harness,t):void 0,o=await u.select({id:qt.id,harness:qt.harness,version:qt.version,publishedAt:qt.publishedAt,title:qt.title,categories:qt.categories,url:qt.url}).from(qt).where(r).orderBy(e$(qt.publishedAt)).limit(n);return e.json(o)});Td.post("/harness-releases/sync",async e=>{let t=await e.req.json().catch(()=>({})),n=await $m(t.harness);return e.json(n)});O();import{Hono as n$}from"hono";import{and as qm,desc as r$,eq as Ia,isNull as i_,sql as o$}from"drizzle-orm";var ba=new n$;ba.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"?qm(Ia(Rt.userId,t),i_(Rt.readAt)):Ia(Rt.userId,t),i=await u.select().from(Rt).where(s).orderBy(r$(Rt.createdAt)).limit(n).offset(r),[{count:a}]=await u.select({count:o$`count(*)::int`}).from(Rt).where(qm(Ia(Rt.userId,t),i_(Rt.readAt)));return e.json({items:i,unreadCount:a})});ba.post("/notifications/:id/read",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await u.update(Rt).set({readAt:new Date}).where(qm(Ia(Rt.id,t),Ia(Rt.userId,n))).returning();return r?e.json(r):e.json({error:"Not found"},404)});ba.post("/notifications/read-all",async e=>{let t=e.get("userId");return await u.update(Rt).set({readAt:new Date}).where(qm(Ia(Rt.userId,t),i_(Rt.readAt))),e.json({success:!0})});O();import{Hono as s$}from"hono";import{z as an}from"zod";import{eq as Or,and as Um,desc as i$,ne as a$}from"drizzle-orm";var zo=new s$;function c$(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}}}c(c$,"parseTerminalTargetResult");async function d$(e){let t=c$(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:y.id}).from(y).where(Um(Or(y.userId,e.userId),Or(y.externalSessionId,o))).limit(1):[];await u.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}})}c(d$,"upsertTerminalTargetFromLaunchResult");var u$=an.object({tool:an.string().min(1),config:an.object({projectPath:an.string().min(1),prompt:an.string().optional(),systemPrompt:an.string().optional(),model:an.string().optional(),mode:an.enum(["headless","interactive"]).default("interactive"),timeout:an.number().int().positive().optional(),resumeSessionId:an.string().optional()})});zo.post("/launch-jobs",async e=>{let t=e.get("userId"),n=await e.req.json(),r=u$.parse(n),{id:o,noLiveWorker:s}=await Ct({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(ue).where(Or(ue.id,o));return e.json({...i,noLiveWorker:s},201)});zo.get("/launch-jobs",async e=>{let t=e.get("userId"),n=Number(e.req.query("limit")??50),r=await u.select().from(ue).where(Or(ue.userId,t)).orderBy(i$(ue.createdAt)).limit(n);return e.json(r)});var l$=an.object({status:an.enum(["running","completed","failed"]).optional(),attempts:an.number().int().nonnegative().optional(),error:an.string().optional(),result:an.record(an.unknown()).optional()});zo.patch("/launch-jobs/:id/state",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=l$.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(ue).set(o).where(Um(Or(ue.id,n),Or(ue.userId,t),a$(ue.status,"cancelled"))).returning();if(!s){let[i]=await u.select().from(ue).where(Um(Or(ue.id,n),Or(ue.userId,t)));return i?e.json(i):e.json({error:"Job not found"},404)}return r.result!==void 0&&await d$({userId:t,jobId:n,config:s.config,result:r.result}),e.json(s)});zo.post("/launch-jobs/:id/cancel",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.update(ue).set({status:"cancelled",updatedAt:new Date}).where(Um(Or(ue.id,n),Or(ue.userId,t))).returning();return r?e.json(r):e.json({error:"Job not found"},404)});zo.get("/launchers",async e=>{let{getAvailableLaunchers:t}=await Promise.resolve().then(()=>(Ql(),Fb));return e.json(t())});O();import{Hono as m$}from"hono";import{z as Qn}from"zod";import{eq as Ne,and as Gt,desc as Bm,inArray as Hm,isNull as p$,ne as f$}from"drizzle-orm";Ql();var Cr=new m$,g$=Qn.object({tool:Qn.string().min(1),model:Qn.string().optional(),label:Qn.string().optional()}),h$=Qn.object({title:Qn.string().optional(),projectPath:Qn.string().min(1),gitRemote:Qn.string().optional(),baseBranch:Qn.string().optional(),prompt:Qn.string().optional(),autoWorktree:Qn.boolean().optional(),sessions:Qn.array(g$).min(1).max(8)});function _$(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/(^-|-$)/g,"")||"tool"}c(_$,"sanitizeTool");var y$=new Set(["pending","claimed","running"]);var w$=1800*1e3;function PE(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>w$:!1}c(PE,"canSkipRollup");function DE(e,t,n){if(e==="cancelled")return"cancelled";let r=t.length>0,o=t.some(a=>a.endedAt==null),s=n.some(a=>y$.has(a.status));return n.length>0&&n.every(a=>a.status==="failed")&&!r?"failed":o||s&&r?"running":r&&!o&&!s?"completed":"pending"}c(DE,"rollupRunStatus");async function OE(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(te).set(n).where(Gt(Ne(te.id,e.runId),Ne(te.userId,e.userId),f$(te.status,"cancelled")))}catch{}}c(OE,"persistRolledUpStatus");function v$(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}c(v$,"frictionCount");async function I$(e,t){if(!e||typeof e!="object")return null;let n=e,r="claude-sonnet-4-6",o=Uo(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 eo(u,s,r,t,o);return i?{...i,estimated:!0}:null}c(I$,"deriveSessionCost");async function CE(e,t){let[n]=await u.select({id:te.id,autoWorktree:te.autoWorktree}).from(te).where(Gt(Ne(te.id,e),Ne(te.userId,t))).limit(1);if(!n||!n.autoWorktree)return{linked:0};let r=await u.select({config:ue.config,result:ue.result}).from(ue).where(Gt(Ne(ue.runId,e),Ne(ue.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 d=i.config??{};d.worktree?.create&&typeof d.worktree.branch=="string"&&typeof d.projectPath=="string"&&o.add(Xl({repoRoot:d.projectPath,branch:d.worktree.branch}))}return o.size===0?{linked:0}:{linked:(await u.update(y).set({runId:e}).where(Gt(Ne(y.userId,t),p$(y.runId),Hm(y.projectPath,[...o]))).returning({id:y.id})).length}}c(CE,"linkRunSessions");Cr.post("/runs",async e=>{let t=e.get("userId"),n=await e.req.json(),r=h$.parse(n),o=await No(t,null),s=r.autoWorktree??!0,i=r.baseBranch??"HEAD",a=null;if(r.projectPath){let[p]=await u.select({projectId:ye.projectId}).from(ye).where(Ne(ye.path,r.projectPath)).orderBy(Bm(ye.lastSeen)).limit(1);a=p?.projectId??null}if(!a&&r.gitRemote){let[p]=await u.select({id:C.id}).from(C).where(Ne(C.gitRemoteUrl,r.gitRemote)).limit(1);a=p?.id??null}let[d]=await u.insert(te).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=d.id.slice(0,8),m=!1;try{for(let p=0;p<r.sessions.length;p++){let _=r.sessions[p],w=`rm/run-${l}/s${p}-${_$(_.tool)}`,f={projectPath:r.projectPath,prompt:r.prompt,systemPrompt:void 0,model:_.model,mode:"interactive",worktree:{create:s,branch:w,baseRef:i},runId:d.id},h=await Ct({taskName:"process_launch",userId:t,payload:{tool:_.tool,config:f},mirror:{userId:t,tool:_.tool,config:f},runId:d.id});m=m||h.noLiveWorker}}catch(p){return await u.update(te).set({status:"failed",updatedAt:new Date}).where(Ne(te.id,d.id)),await u.update(ue).set({status:"cancelled",updatedAt:new Date}).where(Gt(Ne(ue.runId,d.id),Ne(ue.status,"pending"))),e.json({error:"Failed to enqueue all launch jobs",detail:p instanceof Error?p.message:String(p),run:{...d,status:"failed"}},500)}return e.json({run:d,noLiveWorker:m},201)});Cr.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?Gt(Ne(te.userId,t),Ne(te.projectId,i)):Ne(te.userId,t),d=await u.select({id:te.id,userId:te.userId,orgId:te.orgId,projectId:te.projectId,projectPath:te.projectPath,gitRemote:te.gitRemote,baseBranch:te.baseBranch,title:te.title,toolSpec:te.toolSpec,autoWorktree:te.autoWorktree,status:te.status,sessionCount:te.sessionCount,createdAt:te.createdAt,updatedAt:te.updatedAt,completedAt:te.completedAt}).from(te).where(a).orderBy(Bm(te.createdAt)).limit(r).offset(s),l=d.filter(p=>!PE(p.status,p.completedAt)),m=l.map(p=>p.id);if(m.length>0){let[p,_]=await Promise.all([u.select({runId:y.runId,endedAt:y.endedAt}).from(y).where(Gt(Ne(y.userId,t),Hm(y.runId,m))),u.select({runId:ue.runId,status:ue.status}).from(ue).where(Gt(Ne(ue.userId,t),Hm(ue.runId,m)))]),w=new Map;for(let h of p){if(!h.runId)continue;let v=w.get(h.runId)??[];v.push({endedAt:h.endedAt}),w.set(h.runId,v)}let f=new Map;for(let h of _){if(!h.runId)continue;let v=f.get(h.runId)??[];v.push({status:h.status}),f.set(h.runId,v)}await Promise.all(l.map(async h=>{let v=DE(h.status,w.get(h.id)??[],f.get(h.id)??[]);v!==h.status&&(await OE({runId:h.id,userId:t,stored:h.status,rolled:v,hadCompletedAt:h.completedAt!=null}),h.status=v,h.completedAt==null&&(v==="completed"||v==="failed"||v==="cancelled")&&(h.completedAt=new Date))}))}return e.json({runs:d})});Cr.get("/runs/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(te).where(Gt(Ne(te.id,n),Ne(te.userId,t))).limit(1);if(!r)return e.json({error:"Run not found"},404);try{await CE(n,t)}catch{}let o=await u.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(Gt(Ne(y.runId,n),Ne(y.userId,t))).orderBy(Bm(y.startedAt)),s=o.map(v=>v.id);if(!PE(r.status,r.completedAt)){let v=await u.select({status:ue.status}).from(ue).where(Gt(Ne(ue.runId,n),Ne(ue.userId,t))),I=DE(r.status,o.map(E=>({endedAt:E.endedAt})),v);I!==r.status&&(await OE({runId:n,userId:t,stored:r.status,rolled:I,hadCompletedAt:r.completedAt!=null}),r.status=I,r.completedAt==null&&(I==="completed"||I==="failed"||I==="cancelled")&&(r.completedAt=new Date))}let i=s.length>0?await u.select({sessionId:ie.sessionId,instructionId:g.id,name:g.name}).from(ie).innerJoin(g,Ne(g.id,ie.instructionId)).where(Hm(ie.sessionId,s)):[],a=new Map;for(let v of s)a.set(v,[]);for(let v of i)a.get(v.sessionId)?.push({id:v.instructionId,name:v.name});let d=await Promise.all(o.map(async v=>{let I=v.analysis??{},E=typeof I.goalSummary=="string"?I.goalSummary:null,A=typeof I.outcome=="string"?I.outcome:null,b=I.friction??null,S=await I$(v.tokenUsage,v.startedAt??new Date);return{id:v.id,tool:v.tool,gitBranch:v.gitBranch,projectPath:v.projectPath,startedAt:v.startedAt,endedAt:v.endedAt,eventCount:v.eventCount,tokenUsage:v.tokenUsage,goalSummary:E,outcome:A,friction:b,cost:S,instructions:a.get(v.id)??[]}})),l=d.map(v=>({sessionId:v.id,score:v.outcome!=null?xi[v.outcome]??-1:-1,costUsd:v.cost?.totalUsd??Number.POSITIVE_INFINITY,frictionCount:v$(v.friction)})).sort((v,I)=>I.score!==v.score?I.score-v.score:v.costUsd!==I.costUsd?v.costUsd-I.costUsd:v.frictionCount-I.frictionCount).map((v,I)=>({sessionId:v.sessionId,rank:I+1,isWinner:I===0&&v.score>=0,score:v.score,costUsd:Number.isFinite(v.costUsd)?v.costUsd:null,frictionCount:v.frictionCount})),m=new Map,p=new Map;for(let v of i)m.set(v.instructionId,v.name),p.has(v.instructionId)||p.set(v.instructionId,new Set),p.get(v.instructionId).add(v.sessionId);let _=s.length,w=[],f=[];for(let[v,I]of p){let E=m.get(v)??"Unknown";_>0&&I.size===_?w.push({id:v,name:E}):f.push({id:v,name:E,sessionIds:[...I]})}let h=null;return r.autoWorktree?r.sessionCount>0&&d.length<r.sessionCount&&(h=`Only ${d.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.`):h="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:d,comparison:{ranking:l,instructionDiff:{shared:w,differing:f}},attributionCaveat:h})});Cr.post("/runs/:id/link-sessions",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:te.id}).from(te).where(Gt(Ne(te.id,n),Ne(te.userId,t))).limit(1);if(!r)return e.json({error:"Run not found"},404);let{linked:o}=await CE(n,t);return e.json({linked:o})});Cr.get("/runs/:id/jobs",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:te.id}).from(te).where(Gt(Ne(te.id,n),Ne(te.userId,t))).limit(1);if(!r)return e.json({error:"Run not found"},404);let o=await u.select({id:ue.id,runId:ue.runId,status:ue.status,tool:ue.tool}).from(ue).where(Gt(Ne(ue.runId,n),Ne(ue.userId,t))).orderBy(Bm(ue.createdAt));return e.json(o)});Cr.post("/runs/:id/cancel",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:te.id}).from(te).where(Gt(Ne(te.id,n),Ne(te.userId,t))).limit(1);if(!r)return e.json({error:"Run not found"},404);await u.update(ue).set({status:"cancelled",updatedAt:new Date}).where(Gt(Ne(ue.runId,n),Ne(ue.userId,t),Ne(ue.status,"pending")));let[o]=await u.update(te).set({status:"cancelled",updatedAt:new Date}).where(Gt(Ne(te.id,n),Ne(te.userId,t))).returning();return e.json({run:o})});Cr.post("/runs/:id/cleanup",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:te.id}).from(te).where(Gt(Ne(te.id,n),Ne(te.userId,t))).limit(1);if(!r)return e.json({error:"Run not found"},404);let{noLiveWorker:o}=await RI({runId:n,userId:t});return e.json({enqueued:!0,noLiveWorker:o})});O();import{Hono as b$}from"hono";import{z as Js}from"zod";import{and as Ea,desc as a_,eq as Zt,or as LE}from"drizzle-orm";var Ks=new b$;function E$(e,t){return{liveSend:e?.kind==="tmux"&&e.status==="active"&&t,fallbackResume:!0,tmuxAvailable:e?.kind==="tmux"&&e.status!=="fallback_only",workerOnline:t}}c(E$,"capabilitiesFor");Ks.get("/sessions/:id/terminal-target",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:y.id,externalSessionId:y.externalSessionId}).from(y).where(Ea(Zt(y.id,n),Zt(y.userId,t))).limit(1);if(!r)return e.json({error:"Session not found"},404);let o=r.externalSessionId?LE(Zt(Ze.sessionId,r.id),Zt(Ze.externalSessionId,r.externalSessionId)):Zt(Ze.sessionId,r.id),[s]=await u.select().from(Ze).where(Ea(Zt(Ze.userId,t),o)).orderBy(a_(Ze.lastSeenAt)).limit(1),i=await Hi(t);return e.json({target:s??null,capabilities:E$(s??null,i),...s?{}:{reason:"no_target"}})});var ME=Js.enum(["active","missing","unknown","fallback_only"]),A$=Js.object({message:Js.string().min(1).max(16*1024),delivery:Js.enum(["live","fallback"]).default("live"),submit:Js.boolean().optional().default(!0)});Ks.post("/sessions/:id/send",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=A$.parse(await e.req.json()),[o]=await u.select({id:y.id,externalSessionId:y.externalSessionId,projectPath:y.projectPath}).from(y).where(Ea(Zt(y.id,n),Zt(y.userId,t))).limit(1);if(!o)return e.json({error:"Session not found"},404);let s=o.externalSessionId?LE(Zt(Ze.sessionId,o.id),Zt(Ze.externalSessionId,o.externalSessionId)):Zt(Ze.sessionId,o.id),[i]=await u.select().from(Ze).where(Ea(Zt(Ze.userId,t),Zt(Ze.status,"active"),s)).orderBy(a_(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:w}=await Ct({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:w},202)}return e.json({error:"Live target unavailable",code:"LIVE_TARGET_UNAVAILABLE",fallback:{available:!!(o.externalSessionId&&o.projectPath),action:"resume_terminal"}},409)}if(!await Hi(t))return e.json({error:"Worker offline",code:"WORKER_OFFLINE"},409);let d={sessionId:o.id,terminalTargetId:i.id,target:i.target,message:r.message,submit:r.submit},{id:l}=await Ct({taskName:"process_send_message",payload:d,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 S$=Js.object({status:ME,lastSeenAt:Js.string().datetime().optional()});Ks.patch("/terminal-targets/:id/status",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=S$.parse(await e.req.json()),o=r.lastSeenAt?new Date(r.lastSeenAt):new Date,s=new Date,[i]=await u.update(Ze).set({status:r.status,lastSeenAt:o,updatedAt:s}).where(Ea(Zt(Ze.id,n),Zt(Ze.userId,t))).returning();return i?e.json({target:i}):e.json({error:"Terminal target not found"},404)});Ks.get("/terminal-targets",async e=>{let t=e.get("userId"),n=e.req.query("status"),r=n?ME.parse(n):null,o=await u.select().from(Ze).where(Ea(Zt(Ze.userId,t),...r?[Zt(Ze.status,r)]:[])).orderBy(a_(Ze.lastSeenAt)).limit(100);return e.json({targets:o})});import{Hono as l1}from"hono";O();import{Hono as W$}from"hono";import{z as Lr}from"zod";import{eq as pr,and as zE,asc as VE,sql as z$,isNull as JE}from"drizzle-orm";O();import{eq as c_,and as x$}from"drizzle-orm";function It(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:X.id,slug:X.slug}).from(X).where(c_(X.slug,o));if(!s)return t.json({error:"Organization not found",code:"ORG_NOT_FOUND"},404);let[i]=await u.select({role:ee.role}).from(ee).where(x$(c_(ee.orgId,s.id),c_(ee.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()}}c(It,"requireOrgRole");O();import{z as U$}from"zod";import{randomBytes as H$}from"node:crypto";import{eq as l_,and as B$,sql as F$}from"drizzle-orm";import{randomBytes as R$}from"node:crypto";async function d_(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}
1369
+ `),{id:`noop-${R$(8).toString("hex")}`,provider:"noop"}}c(d_,"sendNoopEmail");var Fm=null;async function T$(){if(Fm)return Fm;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 Fm=new t(e),Fm}c(T$,"getClient");var $E=!1;function k$(){let e=process.env.RESEND_FROM_EMAIL;if(e)return e;if(!$E){$E=!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.
1370
+ `)}return"onboarding@resend.dev"}c(k$,"resolveFromEmail");async function qE(e){let t=e.fromName??"RuleMetric",n=k$(),r=`${t} <${n}>`,o=await T$(),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"}}c(qE,"sendResendEmail");async function UE(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.")}c(UE,"sendSmtpEmail");var N$="#2DD4BF",j$="#0d9488",P$="#0A0C12",Wm="#1a1a1a",zm="#666666",HE="#f5f5f7",D$="#ffffff",BE="#e5e5e9";function O$(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}`}c(O$,"formatExpiresAt");function Aa(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}c(Aa,"escapeHtml");function C$(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."}}c(C$,"roleCopy");function u_(e){let{orgName:t,inviterName:n,role:r,acceptUrl:o,expiresAt:s}=e,i=`${n} invited you to ${t} on RuleMetric`,a=O$(s),{article:d,description:l}=C$(r),m=`<!doctype html>
1371
1371
  <html lang="en">
1372
1372
  <head>
1373
1373
  <meta charset="utf-8" />
1374
1374
  <meta name="viewport" content="width=device-width, initial-scale=1" />
1375
- <title>${xa(i)}</title>
1375
+ <title>${Aa(i)}</title>
1376
1376
  </head>
1377
- <body style="margin:0;padding:0;background:${$E};font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;color:${qp};">
1378
- <table role="presentation" width="100%" cellspacing="0" cellpadding="0" border="0" style="background:${$E};padding:32px 16px;">
1377
+ <body style="margin:0;padding:0;background:${HE};font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;color:${Wm};">
1378
+ <table role="presentation" width="100%" cellspacing="0" cellpadding="0" border="0" style="background:${HE};padding:32px 16px;">
1379
1379
  <tr>
1380
1380
  <td align="center">
1381
- <table role="presentation" width="560" cellspacing="0" cellpadding="0" border="0" style="max-width:560px;background:${H$};border:1px solid ${qE};border-radius:8px;overflow:hidden;">
1381
+ <table role="presentation" width="560" cellspacing="0" cellpadding="0" border="0" style="max-width:560px;background:${D$};border:1px solid ${BE};border-radius:8px;overflow:hidden;">
1382
1382
  <tr>
1383
1383
  <td style="padding:32px 32px 8px 32px;">
1384
- <h1 style="margin:0 0 16px 0;font-size:22px;line-height:1.3;font-weight:600;color:${qp};">
1385
- You've been invited to ${xa(t)}
1384
+ <h1 style="margin:0 0 16px 0;font-size:22px;line-height:1.3;font-weight:600;color:${Wm};">
1385
+ You've been invited to ${Aa(t)}
1386
1386
  </h1>
1387
- <p style="margin:0 0 16px 0;font-size:15px;line-height:1.5;color:${qp};">
1387
+ <p style="margin:0 0 16px 0;font-size:15px;line-height:1.5;color:${Wm};">
1388
1388
  Hi there,
1389
1389
  </p>
1390
- <p style="margin:0 0 16px 0;font-size:15px;line-height:1.5;color:${qp};">
1391
- <strong>${xa(n)}</strong> invited you to join
1392
- <strong>${xa(t)}</strong> on RuleMetric as ${u}.
1390
+ <p style="margin:0 0 16px 0;font-size:15px;line-height:1.5;color:${Wm};">
1391
+ <strong>${Aa(n)}</strong> invited you to join
1392
+ <strong>${Aa(t)}</strong> on RuleMetric as ${d}.
1393
1393
  </p>
1394
- <p style="margin:0 0 24px 0;font-size:15px;line-height:1.5;color:${Up};">
1394
+ <p style="margin:0 0 24px 0;font-size:15px;line-height:1.5;color:${zm};">
1395
1395
  ${l}
1396
1396
  </p>
1397
1397
  </td>
1398
1398
  </tr>
1399
1399
  <tr>
1400
1400
  <td align="center" style="padding:0 32px 8px 32px;">
1401
- <a href="${xa(o)}"
1402
- style="display:inline-block;padding:12px 24px;background:${$$};color:${U$};text-decoration:none;border-radius:6px;font-size:15px;font-weight:600;">
1401
+ <a href="${Aa(o)}"
1402
+ style="display:inline-block;padding:12px 24px;background:${N$};color:${P$};text-decoration:none;border-radius:6px;font-size:15px;font-weight:600;">
1403
1403
  Accept invitation
1404
1404
  </a>
1405
1405
  </td>
1406
1406
  </tr>
1407
1407
  <tr>
1408
1408
  <td style="padding:16px 32px 8px 32px;">
1409
- <p style="margin:0 0 8px 0;font-size:13px;line-height:1.5;color:${Up};">
1409
+ <p style="margin:0 0 8px 0;font-size:13px;line-height:1.5;color:${zm};">
1410
1410
  Or copy and paste this link into your browser:
1411
1411
  </p>
1412
- <p style="margin:0 0 24px 0;font-size:13px;line-height:1.5;color:${q$};word-break:break-all;">
1413
- ${xa(o)}
1412
+ <p style="margin:0 0 24px 0;font-size:13px;line-height:1.5;color:${j$};word-break:break-all;">
1413
+ ${Aa(o)}
1414
1414
  </p>
1415
- <p style="margin:0 0 24px 0;font-size:13px;line-height:1.5;color:${Up};">
1415
+ <p style="margin:0 0 24px 0;font-size:13px;line-height:1.5;color:${zm};">
1416
1416
  This invitation expires on <strong>${a}</strong>.
1417
1417
  </p>
1418
1418
  </td>
1419
1419
  </tr>
1420
1420
  <tr>
1421
- <td style="padding:16px 32px 32px 32px;border-top:1px solid ${qE};">
1422
- <p style="margin:0;font-size:12px;line-height:1.5;color:${Up};">
1421
+ <td style="padding:16px 32px 32px 32px;border-top:1px solid ${BE};">
1422
+ <p style="margin:0;font-size:12px;line-height:1.5;color:${zm};">
1423
1423
  If you didn't expect this email, you can safely ignore it. The link will expire on its own.
1424
1424
  </p>
1425
1425
  </td>
@@ -1429,12 +1429,17 @@ end`;async function Ks(e){let t=e.req.param("teamId");if(!t||!to.test(t))return{
1429
1429
  </tr>
1430
1430
  </table>
1431
1431
  </body>
1432
- </html>`,f=[`You've been invited to ${t}`,"","Hi there,","",`${n} invited you to join ${t} on RuleMetric as ${u}.`,"",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(`
1433
- `);return{subject:i,html:p,text:f}}c(r_,"renderInvitation");function W$(){let e=process.env.RULEMETRIC_EMAIL_PROVIDER;return e==="resend"||e==="smtp"||e==="noop"?e:process.env.RESEND_API_KEY?"resend":"noop"}c(W$,"selectEmailProvider");var z$=new Set(["test","example","invalid","localhost"]),V$=/^example\.(com|net|org)$/;function J$(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!!(z$.has(o)||V$.test(r))}c(J$,"isUndeliverableRecipient");var UE=!1;async function Hp(e){let t=W$();switch(UE||(UE=!0,process.stderr.write(`[email] active provider: ${t}
1434
- `)),t){case"resend":return J$(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
1435
- `),n_(e)):LE(e);case"smtp":return ME(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 n_(e)}}c(Hp,"sendEmail");var Ra=new K$;function BE(){return G$(32).toString("base64url")}c(BE,"generateInviteToken");var HE=!1;function FE(e){let t=process.env.WEB_URL??process.env.RULEMETRIC_WEB_URL;return t||(process.env.NODE_ENV==="production"?(HE||(HE=!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
1436
- `)),t="https://rulemetric.com"):t="http://localhost:5174"),`${t.replace(/\/$/,"")}/invite/${e}`}c(FE,"buildAcceptUrl");async function WE(e){let[t]=await d.select({displayName:T.displayName,email:T.email}).from(T).where(Qn(T.id,e));return t?.displayName?.trim()||t?.email||"A teammate"}c(WE,"getInviterDisplayName");async function zE(e){try{let{subject:t,html:n,text:r}=r_({orgName:e.orgName,inviterName:e.inviterName,role:e.role,acceptUrl:e.acceptUrl,expiresAt:e.expiresAt});return(await Hp({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}
1437
- `),hr(t,{tags:{source:"invite-email"},extra:{to:e.to,orgName:e.orgName}}),{sent:!1,reason:n}}}c(zE,"sendInvitationEmail");var Z$=Bp.enum(["admin","member"]),e1=Bp.object({email:Bp.string().email().max(254),role:Z$.optional(),teamId:Bp.string().uuid().optional()});Ra.post("/orgs/:slug/invitations",vt(["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=e1.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[m]=await d.select({id:X.id}).from(X).where(Fp(Qn(X.id,a),Qn(X.orgId,r)));if(!m)return e.json({error:"Team not found in this organization",code:"INVALID_TEAM"},400)}let u=BE(),l;try{let[m]=await d.insert(ae).values({orgId:r,email:s,role:i,teamId:a??null,invitedBy:o,token:u,expiresAt:new Date(Date.now()+6048e5)}).returning({id:ae.id,email:ae.email,role:ae.role,teamId:ae.teamId,expiresAt:ae.expiresAt});l=m}catch(m){if(Qt(m)==="23505")return e.json({error:"A pending invitation for this email already exists",code:"INVITE_ALREADY_PENDING"},409);throw m}let p=FE(u),[f]=await d.select({name:Y.name}).from(Y).where(Qn(Y.id,r)),_=await WE(o),v=await zE({to:s,orgName:f?.name??"your organization",inviterName:_,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:u}:{}},201)});Ra.get("/orgs/:slug/invitations",vt(["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:X.name,invitedById:ae.invitedBy,invitedByDisplayName:T.displayName,invitedByEmail:T.email,createdAt:ae.createdAt,expiresAt:ae.expiresAt}).from(ae).leftJoin(X,Qn(ae.teamId,X.id)).leftJoin(T,Qn(ae.invitedBy,T.id)).where(Fp(Qn(ae.orgId,t),Ta(ae.acceptedAt),Ta(ae.revokedAt),Q$(ae.expiresAt,X$`now()`))).orderBy(Y$(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})))});Ra.post("/orgs/:slug/invitations/:id/revoke",vt(["owner","admin"]),async e=>{let t=e.req.param("id");if(!t||!to.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(Fp(Qn(ae.id,t),Qn(ae.orgId,n),Ta(ae.acceptedAt),Ta(ae.revokedAt))).returning({id:ae.id})).length===0?e.json({error:"Invitation not found",code:"INVITE_NOT_FOUND"},404):e.body(null,204)});Ra.post("/orgs/:slug/invitations/:id/resend",vt(["owner","admin"]),async e=>{let t=e.req.param("id");if(!t||!to.test(t))return e.json({error:"Invalid invitation id",code:"BAD_REQUEST"},400);let n=e.get("orgId"),r=BE(),o=new Date(Date.now()+10080*60*1e3),s=await d.update(ae).set({token:r,expiresAt:o}).where(Fp(Qn(ae.id,t),Qn(ae.orgId,n),Ta(ae.acceptedAt),Ta(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=FE(r),u=e.get("userId"),[l]=await d.select({name:Y.name}).from(Y).where(Qn(Y.id,n)),p=await WE(u),f=await zE({to:i.email,orgName:l?.name??"your organization",inviterName:p,role:i.role,acceptUrl:a,expiresAt:i.expiresAt}),_=process.env.NODE_ENV==="test";return e.json({id:i.id,email:i.email,expiresAt:i.expiresAt,acceptUrl:a,emailSent:f.sent,...f.sent?{}:{emailError:f.reason},..._?{token:r}:{}})});D();import{Hono as t1}from"hono";import{eq as ku,and as JE,sql as KE,inArray as o_,gte as GE}from"drizzle-orm";var zp=new t1,Wp={"7d":7,"30d":30},VE={fully_achieved:1,mostly_achieved:.75,partially_achieved:.5,unclear_from_transcript:.25,not_achieved:0};async function s_(e,t,n,r,o,s){let i=new Map;for(let E of e)i.set(E.tool,(i.get(E.tool)??0)+1);let a=[...i.entries()].sort((E,S)=>S[1]-E[1]).slice(0,5).map(([E,S])=>({tool:E,count:S})),u=new Map;for(let E of e)u.set(E.userId,(u.get(E.userId)??0)+1);let l=[...u.entries()].sort((E,S)=>S[1]-E[1]).slice(0,5).map(([E])=>E),p=l.length?await d.select({id:T.id,displayName:T.displayName,email:T.email}).from(T).where(o_(T.id,l)):[],f=new Map(p.map(E=>[E.id,E])),_=l.map(E=>{let S=f.get(E);return{userId:E,displayName:S?.displayName??null,email:S?.email??null,count:u.get(E)??0}}),v=new Map;for(let E of e){let S=E.analysis;if(!S)continue;let R=S.friction;if(!R)continue;let O=Object.values(R).reduce((q,U)=>q+(typeof U=="number"?U:0),0),W=E.startedAt.toISOString().split("T")[0]??"",N=v.get(W)??{sum:0,count:0};N.sum+=O,N.count+=1,v.set(W,N)}let h=[...v.entries()].sort(([E],[S])=>E<S?-1:1).map(([E,{sum:S,count:R}])=>({day:E,avgFriction:Math.round(S/R*100)/100})),m=e.map(E=>E.id),w=m.length?await d.select({sessionId:se.sessionId,instructionId:se.instructionId,name:g.name,source:KE`${g.frontmatter}->>'source'`}).from(se).innerJoin(g,ku(g.id,se.instructionId)).where(o_(se.sessionId,m)):[],I=new Map;for(let E of w){let S=I.get(E.instructionId);S?S.sessions.add(E.sessionId):I.set(E.instructionId,{name:E.name,source:E.source,sessions:new Set([E.sessionId])})}let b=new Map;for(let E of e){let S=E.analysis;if(!S)continue;let R=S.outcome;R&&R in VE&&b.set(E.id,VE[R])}let A=[];for(let[E,{name:S,source:R,sessions:O}]of I){let W=[],N=[];for(let de of e){let K=b.get(de.id);K!==void 0&&(O.has(de.id)?W.push(K):N.push(K))}let q=c(de=>de.length===0?null:de.reduce((K,me)=>K+me,0)/de.length,"avg"),U=q(W),H=q(N),te=U!==null&&H!==null?Math.round((U-H)*1e3)/10:null;A.push({instructionId:E,name:S,source:R,withSessions:O.size,withoutSessions:e.length-O.size,deltaPct:te})}return{range:t,sessionCount:e.length,memberCount:n,topTools:a,topMembers:_,frictionTrend:h,instructionEffectiveness:A}}c(s_,"buildActivityResponse");zp.get("/orgs/:slug/activity",vt(["owner","admin","member"]),async e=>{let t=e.get("orgId"),n=e.req.query("range")??"7d";if(!(n in Wp))return e.json({error:"Invalid range. Allowed: 7d, 30d",code:"BAD_REQUEST"},400);let r=new Date(Date.now()-Wp[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(JE(ku(y.orgId,t),GE(y.startedAt,r))),[{count:s}]=await d.select({count:KE`count(*)::int`}).from(ee).where(ku(ee.orgId,t)),i=await s_(o,n,Number(s),t,r,null);return e.json(i)});zp.get("/orgs/:slug/teams/:teamId/activity",vt(["owner","admin","member"]),async e=>{let t=await Ks(e);if(!t.ok)return t.response;let n=t.team,r=e.req.query("range")??"7d";if(!(r in Wp))return e.json({error:"Invalid range. Allowed: 7d, 30d",code:"BAD_REQUEST"},400);let o=new Date(Date.now()-Wp[r]*24*60*60*1e3),s=e.get("orgId"),a=(await d.select({userId:we.userId}).from(we).where(ku(we.teamId,n.id))).map(p=>p.userId);if(a.length===0){let p=await s_([],r,0,s,o,[]);return e.json(p)}let u=await d.select({id:y.id,userId:y.userId,tool:y.tool,startedAt:y.startedAt,analysis:y.analysis}).from(y).where(JE(ku(y.orgId,s),GE(y.startedAt,o),o_(y.userId,a))),l=await s_(u,r,a.length,s,o,a);return e.json(l)});var Go=new n1;Go.route("/",zo);Go.route("/",Ru);Go.route("/",Ko);Go.route("/",Ra);Go.route("/",zp);D();import{Hono as r1}from"hono";import{z as i_}from"zod";import{createClient as o1}from"@supabase/supabase-js";import{eq as Nu,and as YE,isNull as XE,sql as QE}from"drizzle-orm";var ju=new r1;ju.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:Y.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(Y,Nu(ae.orgId,Y.id)).leftJoin(T,Nu(ae.invitedBy,T.id)).where(Nu(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=o1(process.env.SUPABASE_URL,process.env.SUPABASE_ANON_KEY,{global:{headers:{Authorization:`Bearer ${l}`}}}),{data:f,error:_}=await p.auth.getUser();!_&&f.user&&(s=f.user.id,i=f.user.email)}catch{}}let u=null;if(s&&i&&i.toLowerCase()===n.email.toLowerCase()){let[{cnt:l}]=await d.select({cnt:QE`count(*)::int`}).from(y).where(YE(Nu(y.userId,s),XE(y.orgId)));u=Number(l)}return e.json({orgName:n.orgName,inviterName:n.inviterDisplayName??n.inviterEmail??null,role:n.role,sessionCount:u})});var s1=i_.object({token:i_.string().min(1),acknowledgedSessionCount:i_.number().int().nonnegative()});ju.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=s1.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:u}]=await d.select({cnt:QE`count(*)::int`}).from(y).where(YE(Nu(y.userId,o),XE(y.orgId))),l=Number(u);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 u=Qt(i),l=No(i);if(u==="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})});D();import{Hono as i1}from"hono";import{z as Pu}from"zod";import{eq as Du,and as a1}from"drizzle-orm";var Ou=new i1;Ou.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(Du(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 c1=["free","pro","max_5x","max_20x"],u1=Pu.object({activeOrgId:Pu.string().uuid().nullable().optional(),claudeCodePlan:Pu.enum(c1).nullable().optional(),setupCompletedAt:Pu.string().datetime().nullable().optional(),liveSendSkipped:Pu.boolean().optional()});Ou.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=u1.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 d.select({orgId:ee.orgId}).from(ee).where(a1(Du(ee.userId,t),Du(ee.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 d.update(T).set(s).where(Du(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(Du(T.id,t));return e.json({activeOrgId:i.activeOrgId,claudeCodePlan:i.claudeCodePlan,planSource:i.planSource,setupCompletedAt:i.setupCompletedAt,liveSendSkipped:i.liveSendSkipped})});D();import{Hono as l1}from"hono";import{z as It}from"zod";import{asc as ZE,eq as Gs,sql as Zn}from"drizzle-orm";D();import{eq as d1}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(d1(T.id,n));if(!r?.isSuperadmin)return e.json({error:"Forbidden",code:"NOT_SUPERADMIN"},403);await t()}}c(Cu,"requireSuperadmin");ou();var En=new l1;En.use("/superadmin/*",Cu());var p1=It.object({search:It.string().trim().min(1).max(120).optional(),limit:It.coerce.number().int().min(1).max(200).default(50),offset:It.coerce.number().int().min(0).default(0)});En.get("/superadmin/users",async e=>{let t=p1.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(Zn`
1432
+ </html>`,p=[`You've been invited to ${t}`,"","Hi there,","",`${n} invited you to join ${t} on RuleMetric as ${d}.`,"",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(`
1433
+ `);return{subject:i,html:m,text:p}}c(u_,"renderInvitation");function L$(){let e=process.env.RULEMETRIC_EMAIL_PROVIDER;return e==="resend"||e==="smtp"||e==="noop"?e:process.env.RESEND_API_KEY?"resend":"noop"}c(L$,"selectEmailProvider");var M$=new Set(["test","example","invalid","localhost"]),$$=/^example\.(com|net|org)$/;function q$(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!!(M$.has(o)||$$.test(r))}c(q$,"isUndeliverableRecipient");var FE=!1;async function Vm(e){let t=L$();switch(FE||(FE=!0,process.stderr.write(`[email] active provider: ${t}
1434
+ `)),t){case"resend":return q$(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
1435
+ `),d_(e)):qE(e);case"smtp":return UE(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 d_(e)}}c(Vm,"sendEmail");var oo=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Jm=F$`case ${ee.role}
1436
+ when 'owner' then 0
1437
+ when 'admin' then 1
1438
+ when 'member' then 2
1439
+ else 3
1440
+ end`;async function Gs(e){let t=e.req.param("teamId");if(!t||!oo.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:Q.id,orgId:Q.orgId,name:Q.name,slug:Q.slug,createdAt:Q.createdAt}).from(Q).where(B$(l_(Q.id,t),l_(Q.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)}}c(Gs,"loadTeamInOrg");var Sa=/^(?=.{3,40}$)[a-z0-9]+(?:-[a-z0-9]+)*$/,xa="Slug must be 3-40 chars, lowercase alphanumerics with single dashes only \u2014 no leading, trailing, or consecutive dashes";function kd(){return H$(32).toString("base64url")}c(kd,"generateInviteToken");var WE=!1;function Nd(e){let t=process.env.WEB_URL??process.env.RULEMETRIC_WEB_URL;return t||(process.env.NODE_ENV==="production"?(WE||(WE=!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
1441
+ `)),t="https://rulemetric.com"):t="http://localhost:5174"),`${t.replace(/\/$/,"")}/invite/${e}`}c(Nd,"buildAcceptUrl");async function jd(e){let[t]=await u.select({displayName:R.displayName,email:R.email}).from(R).where(l_(R.id,e));return t?.displayName?.trim()||t?.email||"A teammate"}c(jd,"getInviterDisplayName");async function Pd(e){try{let{subject:t,html:n,text:r}=u_({orgName:e.orgName,inviterName:e.inviterName,role:e.role,acceptUrl:e.acceptUrl,expiresAt:e.expiresAt});return(await Vm({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}
1442
+ `),_r(t,{tags:{source:"invite-email"},extra:{to:e.to,orgName:e.orgName}}),{sent:!1,reason:n}}}c(Pd,"sendInvitationEmail");var Km=U$.enum(["admin","member"]);var Vo=new W$,V$=Lr.object({name:Lr.string().min(1).max(100),slug:Lr.string().regex(Sa,{message:xa}),invite:Lr.object({email:Lr.string().email().max(254),role:Km.optional()}).optional()}),J$=Lr.object({name:Lr.string().min(1).max(100).optional(),slug:Lr.string().regex(Sa,{message:xa}).optional()});Vo.post("/orgs",async e=>{let t=e.get("supabase"),n=e.get("userId");if(!n)return e.json({error:"Unauthenticated",code:"UNAUTHENTICATED"},401);let r;try{r=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let o=V$.safeParse(r);if(!o.success)return e.json({error:o.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let{name:s,slug:i,invite:a}=o.data,d;if(t){let{data:m,error:p}=await t.rpc("create_organization",{p_name:s,p_slug:i});if(p){let _=Ot(p),w=To(p);if(_==="23505")return e.json({error:"Slug already taken",code:"ORG_SLUG_TAKEN"},409);if(_==="P0001"&&/unauthenticated/i.test(w))return e.json({error:"Unauthenticated",code:"UNAUTHENTICATED"},401);throw p}d=m}else try{d=await u.transaction(async m=>{let[p]=await m.insert(X).values({name:s,slug:i}).returning({id:X.id,name:X.name,slug:X.slug});return await m.insert(ee).values({userId:n,orgId:p.id,role:"owner"}),await m.update(R).set({activeOrgId:p.id}).where(zE(pr(R.id,n),JE(R.activeOrgId))),await m.update(y).set({orgId:p.id}).where(zE(pr(y.userId,n),JE(y.orgId))),p})}catch(m){if(Ot(m)==="23505")return e.json({error:"Slug already taken",code:"ORG_SLUG_TAKEN"},409);throw m}let l;if(a){let m=a.email.toLowerCase(),p=a.role??"member",_=kd(),[w]=await u.insert(se).values({orgId:d.id,email:m,role:p,teamId:null,invitedBy:n,token:_,expiresAt:new Date(Date.now()+10080*60*1e3)}).returning({id:se.id,email:se.email,role:se.role,expiresAt:se.expiresAt}),f=Nd(_),h=await jd(n),v=await Pd({to:m,orgName:d.name,inviterName:h,role:p,acceptUrl:f,expiresAt:w.expiresAt});l={id:w.id,email:w.email,role:w.role,expiresAt:w.expiresAt,acceptUrl:f,emailSent:v.sent,...v.sent?{}:{emailError:v.reason},...process.env.NODE_ENV==="test"?{token:_}:{}}}return e.json({id:d.id,name:d.name,slug:d.slug,role:"owner",...l?{invite:l}:{}},201)});Vo.get("/orgs",async e=>{let t=e.get("userId"),n=await u.select({id:X.id,name:X.name,slug:X.slug,role:ee.role,createdAt:X.createdAt}).from(ee).innerJoin(X,pr(ee.orgId,X.id)).where(pr(ee.userId,t)).orderBy(X.createdAt);return e.json(n.map(r=>({id:r.id,name:r.name,slug:r.slug,role:r.role})))});Vo.get("/orgs/:slug",It(["owner","admin","member"]),async e=>{let t=e.get("orgId"),[n]=await u.select({id:X.id,name:X.name,slug:X.slug,createdAt:X.createdAt}).from(X).where(pr(X.id,t)),r=await u.select({userId:ee.userId,role:ee.role,joinedAt:ee.createdAt,email:R.email,displayName:R.displayName}).from(ee).leftJoin(R,pr(ee.userId,R.id)).where(pr(ee.orgId,t)).orderBy(Jm,VE(ee.createdAt)),o=await u.select({id:Q.id,name:Q.name,slug:Q.slug,memberCount:z$`count(${we.userId})::int`}).from(Q).leftJoin(we,pr(we.teamId,Q.id)).where(pr(Q.orgId,t)).groupBy(Q.id,Q.name,Q.slug).orderBy(VE(Q.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)}))})});Vo.patch("/orgs/:slug",It(["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=J$.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(X).set(i).where(pr(X.id,t)).returning({id:X.id,name:X.name,slug:X.slug});return e.json({id:a.id,name:a.name,slug:a.slug})}catch(a){if(Ot(a)==="23505")return e.json({error:"Slug already taken",code:"ORG_SLUG_TAKEN"},409);throw a}});Vo.delete("/orgs/:slug",It(["owner"]),async e=>{let t=e.get("orgId");return await u.delete(X).where(pr(X.id,t)),e.body(null,204)});var K$=Lr.object({newOwnerId:Lr.string().uuid()});Vo.post("/orgs/:slug/transfer",It(["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=K$.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=Ot(a),m=To(a);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 a}let d=i;return e.json({orgId:d.orgId,newOwnerId:d.newOwnerId,oldOwnerId:d.oldOwnerId})});O();import{Hono as G$}from"hono";import{z as KE}from"zod";import{eq as Dd,and as GE,asc as Y$,max as X$,inArray as YE}from"drizzle-orm";var Od=new G$;Od.get("/orgs/:slug/members",It(["owner","admin"]),async e=>{let t=e.get("orgId"),n=await u.select({userId:ee.userId,role:ee.role,joinedAt:ee.createdAt,email:R.email,displayName:R.displayName}).from(ee).leftJoin(R,Dd(ee.userId,R.id)).where(Dd(ee.orgId,t)).orderBy(Jm,Y$(ee.createdAt)),r=n.map(d=>d.userId),o=r.length?await u.select({userId:we.userId,teamId:Q.id,teamName:Q.name,teamSlug:Q.slug}).from(we).innerJoin(Q,Dd(we.teamId,Q.id)).where(GE(Dd(Q.orgId,t),YE(we.userId,r))):[],s=new Map;for(let d of o){let l=s.get(d.userId)??[];l.push({id:d.teamId,name:d.teamName,slug:d.teamSlug}),s.set(d.userId,l)}let i=r.length?await u.select({userId:y.userId,lastActiveAt:X$(y.startedAt)}).from(y).where(GE(Dd(y.orgId,t),YE(y.userId,r))).groupBy(y.userId):[],a=new Map;for(let d of i)a.set(d.userId,d.lastActiveAt);return e.json(n.map(d=>{let l=a.get(d.userId)??null;return{userId:d.userId,email:d.email,displayName:d.displayName,role:d.role,joinedAt:d.joinedAt,teams:s.get(d.userId)??[],lastActiveAt:l?new Date(l).toISOString():null}}))});var Q$=KE.object({role:KE.enum(["owner","admin","member"])});Od.patch("/orgs/:slug/members/:userId",It(["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||!oo.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=Q$.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=Ot(a),m=To(a);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 a}let d=i;return e.json({userId:d.userId,orgId:d.orgId,role:d.role})});Od.delete("/orgs/:slug/members/:userId",It(["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||!oo.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:d}=await t.rpc("remove_member",{p_org:a,p_user:n});if(d){let l=Ot(d),m=To(d);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 d}return e.body(null,204)});O();import{Hono as Z$}from"hono";import{z as Jo}from"zod";import{eq as Ko,and as XE,asc as e1,sql as t1}from"drizzle-orm";var Go=new Z$,n1=Jo.object({name:Jo.string().min(1).max(100),slug:Jo.string().regex(Sa,{message:xa})}),r1=Jo.object({name:Jo.string().min(1).max(100).optional(),slug:Jo.string().regex(Sa,{message:xa}).optional()}),o1=Jo.object({userId:Jo.string().uuid()});Go.get("/orgs/:slug/teams",It(["owner","admin","member"]),async e=>{let t=e.get("orgId"),n=await u.select({id:Q.id,name:Q.name,slug:Q.slug,createdAt:Q.createdAt,memberCount:t1`count(${we.userId})::int`}).from(Q).leftJoin(we,Ko(we.teamId,Q.id)).where(Ko(Q.orgId,t)).groupBy(Q.id,Q.name,Q.slug,Q.createdAt).orderBy(e1(Q.name));return e.json(n.map(r=>({id:r.id,name:r.name,slug:r.slug,memberCount:Number(r.memberCount),createdAt:r.createdAt})))});Go.post("/orgs/:slug/teams",It(["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=n1.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(Q).values({orgId:r,name:o,slug:s}).returning({id:Q.id,orgId:Q.orgId,name:Q.name,slug:Q.slug,createdAt:Q.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(Ot(i)==="23505")return e.json({error:"Slug already taken",code:"TEAM_SLUG_TAKEN"},409);throw i}});Go.patch("/orgs/:slug/teams/:teamId",It(["owner","admin"]),async e=>{let t=await Gs(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=r1.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(Q).set(i).where(Ko(Q.id,t.team.id)).returning({id:Q.id,orgId:Q.orgId,name:Q.name,slug:Q.slug,createdAt:Q.createdAt});return e.json({id:a.id,orgId:a.orgId,name:a.name,slug:a.slug,createdAt:a.createdAt})}catch(a){if(Ot(a)==="23505")return e.json({error:"Slug already taken",code:"TEAM_SLUG_TAKEN"},409);throw a}});Go.delete("/orgs/:slug/teams/:teamId",It(["owner","admin"]),async e=>{let t=await Gs(e);return t.ok?(await u.delete(Q).where(Ko(Q.id,t.team.id)),e.body(null,204)):t.response});Go.post("/orgs/:slug/teams/:teamId/members",It(["owner","admin"]),async e=>{let t=await Gs(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=o1.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:ee.userId}).from(ee).where(XE(Ko(ee.userId,o),Ko(ee.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(we).values({userId:o,teamId:t.team.id})}catch(a){if(Ot(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)});Go.delete("/orgs/:slug/teams/:teamId/members/:userId",It(["owner","admin"]),async e=>{let t=await Gs(e);if(!t.ok)return t.response;let n=e.req.param("userId");return!n||!oo.test(n)?e.json({error:"Invalid userId path param",code:"BAD_REQUEST"},400):(await u.delete(we).where(XE(Ko(we.teamId,t.team.id),Ko(we.userId,n))).returning({userId:we.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 s1}from"hono";import{z as m_}from"zod";import{eq as fr,and as Gm,desc as i1,sql as a1,isNull as Ra,gt as c1}from"drizzle-orm";var Ta=new s1,d1=m_.object({email:m_.string().email().max(254),role:Km.optional(),teamId:m_.string().uuid().optional()});Ta.post("/orgs/:slug/invitations",It(["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=d1.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[h]=await u.select({id:Q.id}).from(Q).where(Gm(fr(Q.id,a),fr(Q.orgId,r)));if(!h)return e.json({error:"Team not found in this organization",code:"INVALID_TEAM"},400)}let d=kd(),l;try{let[h]=await u.insert(se).values({orgId:r,email:s,role:i,teamId:a??null,invitedBy:o,token:d,expiresAt:new Date(Date.now()+6048e5)}).returning({id:se.id,email:se.email,role:se.role,teamId:se.teamId,expiresAt:se.expiresAt});l=h}catch(h){if(Ot(h)==="23505")return e.json({error:"A pending invitation for this email already exists",code:"INVITE_ALREADY_PENDING"},409);throw h}let m=Nd(d),[p]=await u.select({name:X.name}).from(X).where(fr(X.id,r)),_=await jd(o),w=await Pd({to:s,orgName:p?.name??"your organization",inviterName:_,role:l.role,acceptUrl:m,expiresAt:l.expiresAt}),f=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:w.sent,...w.sent?{}:{emailError:w.reason},...f?{token:d}:{}},201)});Ta.get("/orgs/:slug/invitations",It(["owner","admin"]),async e=>{let t=e.get("orgId"),n=await u.select({id:se.id,email:se.email,role:se.role,teamId:se.teamId,teamName:Q.name,invitedById:se.invitedBy,invitedByDisplayName:R.displayName,invitedByEmail:R.email,createdAt:se.createdAt,expiresAt:se.expiresAt}).from(se).leftJoin(Q,fr(se.teamId,Q.id)).leftJoin(R,fr(se.invitedBy,R.id)).where(Gm(fr(se.orgId,t),Ra(se.acceptedAt),Ra(se.revokedAt),c1(se.expiresAt,a1`now()`))).orderBy(i1(se.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})))});Ta.post("/orgs/:slug/invitations/:id/revoke",It(["owner","admin"]),async e=>{let t=e.req.param("id");if(!t||!oo.test(t))return e.json({error:"Invalid invitation id",code:"BAD_REQUEST"},400);let n=e.get("orgId");return(await u.update(se).set({revokedAt:new Date}).where(Gm(fr(se.id,t),fr(se.orgId,n),Ra(se.acceptedAt),Ra(se.revokedAt))).returning({id:se.id})).length===0?e.json({error:"Invitation not found",code:"INVITE_NOT_FOUND"},404):e.body(null,204)});Ta.post("/orgs/:slug/invitations/:id/resend",It(["owner","admin"]),async e=>{let t=e.req.param("id");if(!t||!oo.test(t))return e.json({error:"Invalid invitation id",code:"BAD_REQUEST"},400);let n=e.get("orgId"),r=kd(),o=new Date(Date.now()+10080*60*1e3),s=await u.update(se).set({token:r,expiresAt:o}).where(Gm(fr(se.id,t),fr(se.orgId,n),Ra(se.acceptedAt),Ra(se.revokedAt))).returning({id:se.id,email:se.email,role:se.role,expiresAt:se.expiresAt});if(s.length===0)return e.json({error:"Invitation not found",code:"INVITE_NOT_FOUND"},404);let i=s[0],a=Nd(r),d=e.get("userId"),[l]=await u.select({name:X.name}).from(X).where(fr(X.id,n)),m=await jd(d),p=await Pd({to:i.email,orgName:l?.name??"your organization",inviterName:m,role:i.role,acceptUrl:a,expiresAt:i.expiresAt}),_=process.env.NODE_ENV==="test";return e.json({id:i.id,email:i.email,expiresAt:i.expiresAt,acceptUrl:a,emailSent:p.sent,...p.sent?{}:{emailError:p.reason},..._?{token:r}:{}})});O();import{Hono as u1}from"hono";import{eq as Cd,and as ZE,sql as eA,inArray as p_,gte as tA}from"drizzle-orm";var Xm=new u1,Ym={"7d":7,"30d":30},QE={fully_achieved:1,mostly_achieved:.75,partially_achieved:.5,unclear_from_transcript:.25,not_achieved:0};async function f_(e,t,n,r,o,s){let i=new Map;for(let b of e)i.set(b.tool,(i.get(b.tool)??0)+1);let a=[...i.entries()].sort((b,S)=>S[1]-b[1]).slice(0,5).map(([b,S])=>({tool:b,count:S})),d=new Map;for(let b of e)d.set(b.userId,(d.get(b.userId)??0)+1);let l=[...d.entries()].sort((b,S)=>S[1]-b[1]).slice(0,5).map(([b])=>b),m=l.length?await u.select({id:R.id,displayName:R.displayName,email:R.email}).from(R).where(p_(R.id,l)):[],p=new Map(m.map(b=>[b.id,b])),_=l.map(b=>{let S=p.get(b);return{userId:b,displayName:S?.displayName??null,email:S?.email??null,count:d.get(b)??0}}),w=new Map;for(let b of e){let S=b.analysis;if(!S)continue;let T=S.friction;if(!T)continue;let P=Object.values(T).reduce((U,q)=>U+(typeof q=="number"?q:0),0),H=b.startedAt.toISOString().split("T")[0]??"",N=w.get(H)??{sum:0,count:0};N.sum+=P,N.count+=1,w.set(H,N)}let f=[...w.entries()].sort(([b],[S])=>b<S?-1:1).map(([b,{sum:S,count:T}])=>({day:b,avgFriction:Math.round(S/T*100)/100})),h=e.map(b=>b.id),v=h.length?await u.select({sessionId:ie.sessionId,instructionId:ie.instructionId,name:g.name,source:eA`${g.frontmatter}->>'source'`}).from(ie).innerJoin(g,Cd(g.id,ie.instructionId)).where(p_(ie.sessionId,h)):[],I=new Map;for(let b of v){let S=I.get(b.instructionId);S?S.sessions.add(b.sessionId):I.set(b.instructionId,{name:b.name,source:b.source,sessions:new Set([b.sessionId])})}let E=new Map;for(let b of e){let S=b.analysis;if(!S)continue;let T=S.outcome;T&&T in QE&&E.set(b.id,QE[T])}let A=[];for(let[b,{name:S,source:T,sessions:P}]of I){let H=[],N=[];for(let ce of e){let V=E.get(ce.id);V!==void 0&&(P.has(ce.id)?H.push(V):N.push(V))}let U=c(ce=>ce.length===0?null:ce.reduce((V,pe)=>V+pe,0)/ce.length,"avg"),q=U(H),B=U(N),J=q!==null&&B!==null?Math.round((q-B)*1e3)/10:null;A.push({instructionId:b,name:S,source:T,withSessions:P.size,withoutSessions:e.length-P.size,deltaPct:J})}return{range:t,sessionCount:e.length,memberCount:n,topTools:a,topMembers:_,frictionTrend:f,instructionEffectiveness:A}}c(f_,"buildActivityResponse");Xm.get("/orgs/:slug/activity",It(["owner","admin","member"]),async e=>{let t=e.get("orgId"),n=e.req.query("range")??"7d";if(!(n in Ym))return e.json({error:"Invalid range. Allowed: 7d, 30d",code:"BAD_REQUEST"},400);let r=new Date(Date.now()-Ym[n]*24*60*60*1e3),o=await u.select({id:y.id,userId:y.userId,tool:y.tool,startedAt:y.startedAt,analysis:y.analysis}).from(y).where(ZE(Cd(y.orgId,t),tA(y.startedAt,r))),[{count:s}]=await u.select({count:eA`count(*)::int`}).from(ee).where(Cd(ee.orgId,t)),i=await f_(o,n,Number(s),t,r,null);return e.json(i)});Xm.get("/orgs/:slug/teams/:teamId/activity",It(["owner","admin","member"]),async e=>{let t=await Gs(e);if(!t.ok)return t.response;let n=t.team,r=e.req.query("range")??"7d";if(!(r in Ym))return e.json({error:"Invalid range. Allowed: 7d, 30d",code:"BAD_REQUEST"},400);let o=new Date(Date.now()-Ym[r]*24*60*60*1e3),s=e.get("orgId"),a=(await u.select({userId:we.userId}).from(we).where(Cd(we.teamId,n.id))).map(m=>m.userId);if(a.length===0){let m=await f_([],r,0,s,o,[]);return e.json(m)}let d=await u.select({id:y.id,userId:y.userId,tool:y.tool,startedAt:y.startedAt,analysis:y.analysis}).from(y).where(ZE(Cd(y.orgId,s),tA(y.startedAt,o),p_(y.userId,a))),l=await f_(d,r,a.length,s,o,a);return e.json(l)});var Yo=new l1;Yo.route("/",Vo);Yo.route("/",Od);Yo.route("/",Go);Yo.route("/",Ta);Yo.route("/",Xm);O();import{Hono as m1}from"hono";import{z as g_}from"zod";import{createClient as p1}from"@supabase/supabase-js";import{eq as Ld,and as nA,isNull as rA,sql as oA}from"drizzle-orm";var Md=new m1;Md.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:X.name,role:se.role,email:se.email,acceptedAt:se.acceptedAt,revokedAt:se.revokedAt,expiresAt:se.expiresAt,inviterDisplayName:R.displayName,inviterEmail:R.email}).from(se).innerJoin(X,Ld(se.orgId,X.id)).leftJoin(R,Ld(se.invitedBy,R.id)).where(Ld(se.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 m=p1(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 d=null;if(s&&i&&i.toLowerCase()===n.email.toLowerCase()){let[{cnt:l}]=await u.select({cnt:oA`count(*)::int`}).from(y).where(nA(Ld(y.userId,s),rA(y.orgId)));d=Number(l)}return e.json({orgName:n.orgName,inviterName:n.inviterDisplayName??n.inviterEmail??null,role:n.role,sessionCount:d})});var f1=g_.object({token:g_.string().min(1),acknowledgedSessionCount:g_.number().int().nonnegative()});Md.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=f1.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:d}]=await u.select({cnt:oA`count(*)::int`}).from(y).where(nA(Ld(y.userId,o),rA(y.orgId))),l=Number(d);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 d=Ot(i),l=To(i);if(d==="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 g1}from"hono";import{z as $d}from"zod";import{eq as qd,and as h1}from"drizzle-orm";var Ud=new g1;Ud.get("/profile",async e=>{let t=e.get("userId"),[n]=await u.select({id:R.id,email:R.email,displayName:R.displayName,activeOrgId:R.activeOrgId,isSuperadmin:R.isSuperadmin,claudeCodePlan:R.claudeCodePlan,planSource:R.planSource,setupCompletedAt:R.setupCompletedAt,liveSendSkipped:R.liveSendSkipped}).from(R).where(qd(R.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 _1=["free","pro","max_5x","max_20x"],y1=$d.object({activeOrgId:$d.string().uuid().nullable().optional(),claudeCodePlan:$d.enum(_1).nullable().optional(),setupCompletedAt:$d.string().datetime().nullable().optional(),liveSendSkipped:$d.boolean().optional()});Ud.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=y1.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:ee.orgId}).from(ee).where(h1(qd(ee.userId,t),qd(ee.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(R).set(s).where(qd(R.id,t));let[i]=await u.select({activeOrgId:R.activeOrgId,claudeCodePlan:R.claudeCodePlan,planSource:R.planSource,setupCompletedAt:R.setupCompletedAt,liveSendSkipped:R.liveSendSkipped}).from(R).where(qd(R.id,t));return e.json({activeOrgId:i.activeOrgId,claudeCodePlan:i.claudeCodePlan,planSource:i.planSource,setupCompletedAt:i.setupCompletedAt,liveSendSkipped:i.liveSendSkipped})});O();import{Hono as v1}from"hono";import{z as bt}from"zod";import{asc as sA,eq as Ys,sql as Zn}from"drizzle-orm";O();import{eq as w1}from"drizzle-orm";function Hd(){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:R.isSuperadmin}).from(R).where(w1(R.id,n));if(!r?.isSuperadmin)return e.json({error:"Forbidden",code:"NOT_SUPERADMIN"},403);await t()}}c(Hd,"requireSuperadmin");id();var En=new v1;En.use("/superadmin/*",Hd());var I1=bt.object({search:bt.string().trim().min(1).max(120).optional(),limit:bt.coerce.number().int().min(1).max(200).default(50),offset:bt.coerce.number().int().min(0).default(0)});En.get("/superadmin/users",async e=>{let t=I1.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(Zn`
1438
1443
  select
1439
1444
  p.id,
1440
1445
  p.email,
@@ -1459,13 +1464,13 @@ end`;async function Ks(e){let t=e.req.param("teamId");if(!t||!to.test(t))return{
1459
1464
  ${n?Zn`where p.email ilike ${"%"+ct(n)+"%"}`:Zn``}
1460
1465
  order by p.created_at desc
1461
1466
  limit ${r} offset ${o}
1462
- `),[{total:i}]=await d.execute(Zn`
1467
+ `),[{total:i}]=await u.execute(Zn`
1463
1468
  select count(*)::int as total from profiles p
1464
1469
  ${n?Zn`where p.email ilike ${"%"+ct(n)+"%"}`:Zn``}
1465
- `);return e.json({users:s,total:i,limit:r,offset:o})});En.get("/superadmin/users/:id",async e=>{let t=e.req.param("id");if(!It.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(Gs(T.id,t));if(!n)return e.json({error:"User not found",code:"USER_NOT_FOUND"},404);let r=await d.select({orgId:Y.id,orgName:Y.name,orgSlug:Y.slug,role:ee.role}).from(ee).innerJoin(Y,Gs(Y.id,ee.orgId)).where(Gs(ee.userId,t)).orderBy(ZE(Y.name)),[o]=await d.select({total:Zn`count(*)::int`,orphan:Zn`count(*) filter (where org_id is null)::int`}).from(y).where(Gs(y.userId,t)),s={banned:!1,bannedUntil:null,lastSignInAt:null};try{let{data:i,error:a}=await zn().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 d.execute(Zn`
1470
+ `);return e.json({users:s,total:i,limit:r,offset:o})});En.get("/superadmin/users/:id",async e=>{let t=e.req.param("id");if(!bt.string().uuid().safeParse(t).success)return e.json({error:"Invalid user id",code:"VALIDATION_ERROR"},400);let[n]=await u.select({id:R.id,email:R.email,displayName:R.displayName,isSuperadmin:R.isSuperadmin,activeOrgId:R.activeOrgId,createdAt:R.createdAt}).from(R).where(Ys(R.id,t));if(!n)return e.json({error:"User not found",code:"USER_NOT_FOUND"},404);let r=await u.select({orgId:X.id,orgName:X.name,orgSlug:X.slug,role:ee.role}).from(ee).innerJoin(X,Ys(X.id,ee.orgId)).where(Ys(ee.userId,t)).orderBy(sA(X.name)),[o]=await u.select({total:Zn`count(*)::int`,orphan:Zn`count(*) filter (where org_id is null)::int`}).from(y).where(Ys(y.userId,t)),s={banned:!1,bannedUntil:null,lastSignInAt:null};try{let{data:i,error:a}=await Vn().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 iA(e){let[t]=await u.execute(Zn`
1466
1471
  select count(*)::int as n from profiles
1467
1472
  where is_superadmin = true and id <> ${e}
1468
- `);return t?.n??0}c(eA,"countOtherSuperadmins");En.post("/superadmin/users/:id/force-logout",async e=>{let t=e.req.param("id");if(!It.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(Zn`update auth.refresh_tokens set revoked = true where user_id = ${t}`),await d.execute(Zn`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})});En.post("/superadmin/users/:id/reset-password",async e=>{let t=e.req.param("id");if(!It.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(Gs(T.id,t));if(!n?.email)return e.json({error:"User not found",code:"USER_NOT_FOUND"},404);let{data:r,error:o}=await zn().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 m1=It.object({suspended:It.boolean()});En.patch("/superadmin/users/:id/suspend",async e=>{let t=e.req.param("id");if(!It.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=m1.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);if(r.data.suspended){let[a]=await d.select({isSuperadmin:T.isSuperadmin}).from(T).where(Gs(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 zn().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 f1=It.object({confirmEmail:It.string().email()});En.delete("/superadmin/users/:id",async e=>{let t=e.req.param("id");if(!It.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=f1.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(Gs(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 zn().auth.admin.deleteUser(t);return s?e.json({error:s.message,code:"AUTH_ADMIN_ERROR"},400):e.json({ok:!0})});var g1=It.object({email:It.string().email(),orgId:It.string().uuid().optional(),role:It.enum(["owner","admin","member"]).optional()});En.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=g1.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=zn(),a=process.env.WEB_URL??"http://localhost:5174",{data:u,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=u.user?.id,f=null;if(p&&o&&s){let _=e.get("supabase");if(_){let{error:v}=await _.rpc("superadmin_assign_user_to_org",{p_user_id:p,p_org_id:o,p_role:s,p_claim_sessions:!1});v||(f={orgId:o,role:s})}}return e.json({ok:!0,userId:p??null,email:r,assigned:f})});var h1=It.object({orgId:It.string().uuid(),role:It.enum(["owner","admin","member"]),claimSessions:It.boolean().default(!0)});En.post("/superadmin/users/:id/assign",async e=>{let t=e.req.param("id");if(!It.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=h1.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:u,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(u)});En.delete("/superadmin/users/:id/orgs/:orgId",async e=>{let t=e.req.param("id"),n=e.req.param("orgId");if(!It.string().uuid().safeParse(t).success||!It.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})});En.get("/superadmin/orgs",async e=>{let t=await d.select({id:Y.id,name:Y.name,slug:Y.slug,memberCount:Zn`(select count(*)::int from user_organizations where org_id = organizations.id)`,createdAt:Y.createdAt}).from(Y).orderBy(ZE(Y.name));return e.json({orgs:t})});import{Hono as _1}from"hono";import{z as Yo}from"zod";var Vp=new _1,tA=Yo.object({type:Yo.string().min(1).max(64),payload:Yo.record(Yo.unknown()).optional(),timestamp:Yo.string().datetime().optional()}),y1=Yo.union([tA,Yo.object({events:Yo.array(tA).max(50)})]);Vp.post("/telemetry/extension-events",async e=>{let t=e.get("userId"),n=await e.req.json().catch(()=>null),r=y1.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)});D();import{Hono as w1}from"hono";import{z as Cr}from"zod";import{sql as v1}from"drizzle-orm";var Lu=new w1,nA=Cr.object({event:Cr.string().min(1).max(64),deviceId:Cr.string().min(1).max(128),cliVersion:Cr.string().max(64).optional(),os:Cr.string().max(32).optional(),props:Cr.record(Cr.unknown()).optional()}),I1=Cr.union([nA,Cr.object({events:Cr.array(nA).max(50)})]);Lu.post("/telemetry/cli-events",async e=>{let t=e.get("userId"),n=I1.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(bd).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)});Lu.get("/telemetry/deployments",async e=>{let t=e.get("userId"),n=await d.execute(v1`
1473
+ `);return t?.n??0}c(iA,"countOtherSuperadmins");En.post("/superadmin/users/:id/force-logout",async e=>{let t=e.req.param("id");if(!bt.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(Zn`update auth.refresh_tokens set revoked = true where user_id = ${t}`),await u.execute(Zn`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})});En.post("/superadmin/users/:id/reset-password",async e=>{let t=e.req.param("id");if(!bt.string().uuid().safeParse(t).success)return e.json({error:"Invalid user id",code:"VALIDATION_ERROR"},400);let[n]=await u.select({email:R.email}).from(R).where(Ys(R.id,t));if(!n?.email)return e.json({error:"User not found",code:"USER_NOT_FOUND"},404);let{data:r,error:o}=await Vn().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 b1=bt.object({suspended:bt.boolean()});En.patch("/superadmin/users/:id/suspend",async e=>{let t=e.req.param("id");if(!bt.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=b1.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:R.isSuperadmin}).from(R).where(Ys(R.id,t));if(a?.isSuperadmin&&await iA(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 Vn().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 E1=bt.object({confirmEmail:bt.string().email()});En.delete("/superadmin/users/:id",async e=>{let t=e.req.param("id");if(!bt.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=E1.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let[o]=await u.select({email:R.email,isSuperadmin:R.isSuperadmin}).from(R).where(Ys(R.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 iA(t)===0)return e.json({error:"Cannot delete the last superadmin",code:"LAST_SUPERADMIN"},409);let{error:s}=await Vn().auth.admin.deleteUser(t);return s?e.json({error:s.message,code:"AUTH_ADMIN_ERROR"},400):e.json({ok:!0})});var A1=bt.object({email:bt.string().email(),orgId:bt.string().uuid().optional(),role:bt.enum(["owner","admin","member"]).optional()});En.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=A1.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=Vn(),a=process.env.WEB_URL??"http://localhost:5174",{data:d,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 m=d.user?.id,p=null;if(m&&o&&s){let _=e.get("supabase");if(_){let{error:w}=await _.rpc("superadmin_assign_user_to_org",{p_user_id:m,p_org_id:o,p_role:s,p_claim_sessions:!1});w||(p={orgId:o,role:s})}}return e.json({ok:!0,userId:m??null,email:r,assigned:p})});var S1=bt.object({orgId:bt.string().uuid(),role:bt.enum(["owner","admin","member"]),claimSessions:bt.boolean().default(!0)});En.post("/superadmin/users/:id/assign",async e=>{let t=e.req.param("id");if(!bt.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=S1.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:d,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 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(d)});En.delete("/superadmin/users/:id/orgs/:orgId",async e=>{let t=e.req.param("id"),n=e.req.param("orgId");if(!bt.string().uuid().safeParse(t).success||!bt.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})});En.get("/superadmin/orgs",async e=>{let t=await u.select({id:X.id,name:X.name,slug:X.slug,memberCount:Zn`(select count(*)::int from user_organizations where org_id = organizations.id)`,createdAt:X.createdAt}).from(X).orderBy(sA(X.name));return e.json({orgs:t})});import{Hono as x1}from"hono";import{z as Xo}from"zod";var Qm=new x1,aA=Xo.object({type:Xo.string().min(1).max(64),payload:Xo.record(Xo.unknown()).optional(),timestamp:Xo.string().datetime().optional()}),R1=Xo.union([aA,Xo.object({events:Xo.array(aA).max(50)})]);Qm.post("/telemetry/extension-events",async e=>{let t=e.get("userId"),n=await e.req.json().catch(()=>null),r=R1.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 T1}from"hono";import{z as Mr}from"zod";import{sql as k1}from"drizzle-orm";var Bd=new T1,cA=Mr.object({event:Mr.string().min(1).max(64),deviceId:Mr.string().min(1).max(128),cliVersion:Mr.string().max(64).optional(),os:Mr.string().max(32).optional(),props:Mr.record(Mr.unknown()).optional()}),N1=Mr.union([cA,Mr.object({events:Mr.array(cA).max(50)})]);Bd.post("/telemetry/cli-events",async e=>{let t=e.get("userId"),n=N1.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(Tu).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)});Bd.get("/telemetry/deployments",async e=>{let t=e.get("userId"),n=await u.execute(k1`
1469
1474
  select
1470
1475
  device_id,
1471
1476
  count(*)::int as event_count,
@@ -1482,7 +1487,7 @@ end`;async function Ks(e){let t=e.req.param("teamId");if(!t||!to.test(t))return{
1482
1487
  group by device_id
1483
1488
  order by max(created_at) desc
1484
1489
  limit 200
1485
- `);return e.json({deployments:n})});D();import{Hono as b1}from"hono";import{z as er}from"zod";var Jp=new b1,E1=er.object({event:er.string().min(1).max(64),deviceId:er.string().max(128).optional(),command:er.string().max(128).optional(),statusCode:er.number().int().optional(),message:er.string().max(1e3).optional(),cliVersion:er.string().max(64).optional(),os:er.string().max(32).optional(),nodeVersion:er.string().max(32).optional(),proxied:er.boolean().optional(),props:er.record(er.unknown()).optional()});Jp.post("/telemetry/cli-error",async e=>{let t=E1.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(Ed).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)});D();import{Hono as iA}from"hono";import{z as ro}from"zod";import{createHash as A1,randomBytes as aA}from"node:crypto";import{and as rA,eq as a_,gt as S1,isNull as x1,lt as T1}from"drizzle-orm";var R1={vscode:"VS Code extension","vscode-insiders":"VS Code Insiders extension",cursor:"Cursor extension",windsurf:"Windsurf extension"},oA="VS Code extension";function k1(e){return e?R1[e]??oA:oA}c(k1,"editorKeyName");var sA=6e4;async function N1(){try{await d.delete(qn).where(T1(qn.expiresAt,new Date))}catch{}}c(N1,"sweepExpiredCodes");setInterval(()=>void N1(),5*6e4).unref?.();var Mu=new iA,j1=ro.object({code:ro.string().min(1).max(256)}),P1=ro.object({refreshToken:ro.string().min(1).max(2048)});Mu.post("/auth/extension/refresh",async e=>{let t=await e.req.json().catch(()=>null),n=P1.safeParse(t);if(!n.success)return e.json({error:"invalid request"},400);let r=await zd(n.data.refreshToken);return r.ok?e.json(r.session):e.json({error:r.error},r.status)});Mu.post("/auth/extension/exchange",async e=>{let t=await e.req.json().catch(()=>null),n=j1.safeParse(t);if(!n.success)return e.json({error:"invalid request"},400);let[r]=await d.delete(qn).where(rA(a_(qn.code,n.data.code),S1(qn.expiresAt,new Date))).returning({userId:qn.userId,editor:qn.editor,email:qn.email});if(!r)return e.json({error:"code not found or expired"},404);let o=k1(r.editor),{plaintext:s,hash:i,prefix:a}=O1();try{await d.transaction(async u=>{await u.update(Ae).set({revokedAt:new Date}).where(rA(a_(Ae.userId,r.userId),a_(Ae.name,o),x1(Ae.revokedAt))),await u.insert(Ae).values({userId:r.userId,name:o,keyHash:i,keyPrefix:a})})}catch(u){return console.log(`[auth] extension/exchange mint failed userId=${r.userId} err=${u.message}`),e.json({error:"could not mint session"},500)}return e.json({accessToken:s,expiresAt:null,email:r.email})});var Kp=new iA,D1=ro.object({refreshToken:ro.string().min(1).nullish(),expiresAt:ro.string().nullish(),email:ro.string().email().nullish(),editor:ro.enum(["vscode","vscode-insiders","cursor","windsurf"]).nullish()});function O1(){let e=`rm_${aA(32).toString("base64url")}`;return{plaintext:e,hash:A1("sha256").update(e).digest("hex"),prefix:e.slice(0,11)}}c(O1,"generateApiKey");Kp.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=D1.safeParse(n);if(!r.success)return e.json({error:"invalid request"},400);let o=aA(32).toString("base64url");try{await d.insert(qn).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"})});ou();import{Hono as C1}from"hono";var Gp=new C1;function L1(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}c(L1,"formatEmbed");async function M1(e){if(!e)return null;try{let t=zn(),{data:n}=await t.auth.admin.getUserById(e);return n.user?.email??null}catch{return null}}c(M1,"lookupEmail");async function $1(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(()=>""))}c($1,"postToDiscord");Gp.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 M1(o.record?.user_id):null,a=L1(o,i);return a?(await $1(n,a),e.json({ok:!0})):e.json({ok:!0,skipped:!0})});D();import{Hono as X1}from"hono";import{z as Je}from"zod";import{and as Uu,desc as Zp,eq as Lr,gte as b_,isNull as Q1,sql as Z1}from"drizzle-orm";var u_="anthropic",q1=[{limitType:"five_hour_percent",unit:"percentage",displayName:"5-hour window"}],c_=[{limitType:"five_hour_percent",unit:"percentage",displayName:"5-hour window"},{limitType:"seven_day_percent",unit:"percentage",displayName:"Weekly window"}];function U1(e){return typeof e=="object"&&e!==null}c(U1,"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:u_,plan:n,limitType:t,value:e.used_percentage,unit:"percentage",comparator:"=",resetsAt:i,sourceType:"oauth_usage",sourceUrl:r,sourceEvidence:o,confidence:1,observedAt:s}}c(cA,"parseWindow");function H1(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}c(H1,"parseResetTime");var d_={id:u_,displayName:"Anthropic (Claude Code)",plans:["unknown","pro","max_5x","max_20x"],limits:{unknown:c_,pro:q1,max_5x:c_,max_20x:c_},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(!U1(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=[],u=cA(n.five_hour,"five_hour_percent",o,s,i,r);u&&a.push(u);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=H1(t,e.observedAt);return[{provider:u_,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 l_="codex",p_="chatgpt.com",uA="/backend-api/codex/responses",B1="codex.rate_limits",dA=["primary","secondary"];function F1(e,t){return t!=null?t>=1440?"seven_day_percent":"five_hour_percent":e==="secondary"?"seven_day_percent":"five_hour_percent"}c(F1,"limitTypeForWindow");var ka=[{limitType:"five_hour_percent",unit:"percentage",displayName:"5-hour usage"},{limitType:"seven_day_percent",unit:"percentage",displayName:"7-day usage"}],m_={id:l_,displayName:"Codex CLI (OpenAI)",plans:["unknown","free","plus","pro","team","enterprise"],limits:{unknown:ka,free:ka,plus:ka,pro:ka,team:ka,enterprise:ka},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===p_&&t.startsWith(uA)},parse(e,t){let n;try{n=JSON.parse(e)}catch{return null}if(typeof n!="object"||n===null||n.type!==B1)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 dA){let u=r[a];if(typeof u!="object"||u===null)continue;let l=u,p=l.used_percent??l.used_percentage;if(typeof p!="number"||!isFinite(p))continue;let f=p,_=l.window_minutes,v=typeof _=="number"&&isFinite(_)?_:null,h=F1(a,v),m=null,w=l.reset_at??l.resets_at;if(typeof w=="string"){let I=new Date(w);isNaN(I.getTime())||(m=I)}else typeof w=="number"&&isFinite(w)&&(m=new Date(w*1e3));i.push({provider:l_,plan:s,limitType:h,value:f,unit:"percentage",comparator:"=",resetsAt:m,sourceType:"live_stream",sourceUrl:`wss://${p_}${uA}`,sourceEvidence:{wireKey:a,frame:n},confidence:1,observedAt:o})}return i.length===0&&dA.some(u=>{let l=r[u];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!==p_?null:[{provider:l_,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 $u={anthropic:d_,codex:m_};function f_(e){for(let t of Object.values($u))if(t.liveSource?.headers?.matchesHost(e))return t}c(f_,"matchLiveHeaders");function g_(e,t){for(let n of Object.values($u))if(n.liveSource?.streamFrame?.matches(e,t))return n}c(g_,"matchStreamFrame");var mde=1440*60*1e3;D();import{and as pA,desc as mA,eq as qu,gte as J1,sql as K1}from"drizzle-orm";function h_(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"}c(h_,"classifySeverity");function Na(e){switch(e){case"none":return 0;case"soft":return 1;case"approaching":return 2;case"imminent":return 3;case"hit":return 4}}c(Na,"severityRank");var Yp={soft:"soft warning",approaching:"approaching limit",imminent:"imminent limit",hit:"limit reached"};function W1(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`}c(W1,"formatTimeLeft");function __(e,t,n,r,o=Date.now()){let s=W1(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 ${Yp[e]}. Resets ${s}.`}c(__,"formatAlertMessage");function y_(e,t=new Date){if(e.length<2)return null;let n=300*1e3,r=t.getTime()-n,o=e.filter(b=>b.observedAt.getTime()>=r).sort((b,A)=>b.observedAt.getTime()-A.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(b=>(b.observedAt.getTime()-i)/1e3),u=o.map(b=>b.value),l=a.length,p=a.reduce((b,A)=>b+A,0),f=u.reduce((b,A)=>b+A,0),_=a.reduce((b,A,E)=>b+A*u[E],0),v=a.reduce((b,A)=>b+A*A,0),h=l*v-p*p;if(h===0)return null;let m=(l*_-p*f)/h;return m<=0?null:(100-s.value)/m}c(y_,"projectExhaustion");var z1=300*1e3,V1=70;function w_(e){let{proposedSeverity:t,lastDispatch:n,currentUsedPercentage:r,now:o,isFirstTime429:s}=e;if(s)return!0;if(!n)return Na(t)>0;let i=Na(t),a=Na(n.severity);return i>a?!0:o.getTime()-n.lastDispatchedAt.getTime()>=z1?a>=Na("approaching")&&i===a?!(r>=V1):i>0:!1}c(w_,"shouldDispatch");function v_(e){let t=y_(e.observations,e.now),n=Math.max(0,Math.floor((e.currentResetsAt.getTime()-e.now.getTime())/1e3)),r=h_({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=w_({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}}c(v_,"evaluate");function lA(e,t,n){return`${e}:${t}:${n}`}c(lA,"deriveAlertKey");D();async function ja(e){await un({userId:e.userId,type:`usage_${e.severity}`,title:e.title??`Usage limit \u2014 ${Yp[e.severity]}`,body:e.message,url:"/usage",sourceTable:"alert_dispatches",sourceId:e.dispatchId})}c(ja,"notifyFromDispatch");var G1=30*6e4;async function Xp(e,t){let n=new Date((t.observedAt??new Date).getTime()-G1);try{let o=await d.execute(K1`
1490
+ `);return e.json({deployments:n})});O();import{Hono as j1}from"hono";import{z as er}from"zod";var Zm=new j1,P1=er.object({event:er.string().min(1).max(64),deviceId:er.string().max(128).optional(),command:er.string().max(128).optional(),statusCode:er.number().int().optional(),message:er.string().max(1e3).optional(),cliVersion:er.string().max(64).optional(),os:er.string().max(32).optional(),nodeVersion:er.string().max(32).optional(),proxied:er.boolean().optional(),props:er.record(er.unknown()).optional()});Zm.post("/telemetry/cli-error",async e=>{let t=P1.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(ku).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 mA}from"hono";import{z as so}from"zod";import{createHash as D1,randomBytes as pA}from"node:crypto";import{and as dA,eq as h_,gt as O1,isNull as C1,lt as L1}from"drizzle-orm";var M1={vscode:"VS Code extension","vscode-insiders":"VS Code Insiders extension",cursor:"Cursor extension",windsurf:"Windsurf extension"},uA="VS Code extension";function $1(e){return e?M1[e]??uA:uA}c($1,"editorKeyName");var lA=6e4;async function q1(){try{await u.delete(Un).where(L1(Un.expiresAt,new Date))}catch{}}c(q1,"sweepExpiredCodes");setInterval(()=>void q1(),5*6e4).unref?.();var Fd=new mA,U1=so.object({code:so.string().min(1).max(256)}),H1=so.object({refreshToken:so.string().min(1).max(2048)});Fd.post("/auth/extension/refresh",async e=>{let t=await e.req.json().catch(()=>null),n=H1.safeParse(t);if(!n.success)return e.json({error:"invalid request"},400);let r=await Xu(n.data.refreshToken);return r.ok?e.json(r.session):e.json({error:r.error},r.status)});Fd.post("/auth/extension/exchange",async e=>{let t=await e.req.json().catch(()=>null),n=U1.safeParse(t);if(!n.success)return e.json({error:"invalid request"},400);let[r]=await u.delete(Un).where(dA(h_(Un.code,n.data.code),O1(Un.expiresAt,new Date))).returning({userId:Un.userId,editor:Un.editor,email:Un.email});if(!r)return e.json({error:"code not found or expired"},404);let o=$1(r.editor),{plaintext:s,hash:i,prefix:a}=F1();try{await u.transaction(async d=>{await d.update(Ae).set({revokedAt:new Date}).where(dA(h_(Ae.userId,r.userId),h_(Ae.name,o),C1(Ae.revokedAt))),await d.insert(Ae).values({userId:r.userId,name:o,keyHash:i,keyPrefix:a})})}catch(d){return console.log(`[auth] extension/exchange mint failed userId=${r.userId} err=${d.message}`),e.json({error:"could not mint session"},500)}return e.json({accessToken:s,expiresAt:null,email:r.email})});var ep=new mA,B1=so.object({refreshToken:so.string().min(1).nullish(),expiresAt:so.string().nullish(),email:so.string().email().nullish(),editor:so.enum(["vscode","vscode-insiders","cursor","windsurf"]).nullish()});function F1(){let e=`rm_${pA(32).toString("base64url")}`;return{plaintext:e,hash:D1("sha256").update(e).digest("hex"),prefix:e.slice(0,11)}}c(F1,"generateApiKey");ep.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=B1.safeParse(n);if(!r.success)return e.json({error:"invalid request"},400);let o=pA(32).toString("base64url");try{await u.insert(Un).values({code:o,userId:t,editor:r.data.editor??null,email:r.data.email??null,expiresAt:new Date(Date.now()+lA)})}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(lA/1e3),sessionStrategy:"api_key"})});id();import{Hono as W1}from"hono";var tp=new W1;function z1(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}c(z1,"formatEmbed");async function V1(e){if(!e)return null;try{let t=Vn(),{data:n}=await t.auth.admin.getUserById(e);return n.user?.email??null}catch{return null}}c(V1,"lookupEmail");async function J1(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(()=>""))}c(J1,"postToDiscord");tp.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 V1(o.record?.user_id):null,a=z1(o,i);return a?(await J1(n,a),e.json({ok:!0})):e.json({ok:!0,skipped:!0})});O();import{Hono as iq}from"hono";import{z as Je}from"zod";import{and as Vd,desc as sp,eq as $r,gte as j_,isNull as aq,sql as cq}from"drizzle-orm";var y_="anthropic",K1=[{limitType:"five_hour_percent",unit:"percentage",displayName:"5-hour window"}],__=[{limitType:"five_hour_percent",unit:"percentage",displayName:"5-hour window"},{limitType:"seven_day_percent",unit:"percentage",displayName:"Weekly window"}];function G1(e){return typeof e=="object"&&e!==null}c(G1,"isOAuthUsageResponse");function fA(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:y_,plan:n,limitType:t,value:e.used_percentage,unit:"percentage",comparator:"=",resetsAt:i,sourceType:"oauth_usage",sourceUrl:r,sourceEvidence:o,confidence:1,observedAt:s}}c(fA,"parseWindow");function Y1(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}c(Y1,"parseResetTime");var w_={id:y_,displayName:"Anthropic (Claude Code)",plans:["unknown","pro","max_5x","max_20x"],limits:{unknown:__,pro:K1,max_5x:__,max_20x:__},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(!G1(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=[],d=fA(n.five_hour,"five_hour_percent",o,s,i,r);d&&a.push(d);let l=fA(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=Y1(t,e.observedAt);return[{provider:y_,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 v_="codex",I_="chatgpt.com",gA="/backend-api/codex/responses",X1="codex.rate_limits",hA=["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"}c(Q1,"limitTypeForWindow");var ka=[{limitType:"five_hour_percent",unit:"percentage",displayName:"5-hour usage"},{limitType:"seven_day_percent",unit:"percentage",displayName:"7-day usage"}],b_={id:v_,displayName:"Codex CLI (OpenAI)",plans:["unknown","free","plus","pro","team","enterprise"],limits:{unknown:ka,free:ka,plus:ka,pro:ka,team:ka,enterprise:ka},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===I_&&t.startsWith(gA)},parse(e,t){let n;try{n=JSON.parse(e)}catch{return null}if(typeof n!="object"||n===null||n.type!==X1)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 hA){let d=r[a];if(typeof d!="object"||d===null)continue;let l=d,m=l.used_percent??l.used_percentage;if(typeof m!="number"||!isFinite(m))continue;let p=m,_=l.window_minutes,w=typeof _=="number"&&isFinite(_)?_:null,f=Q1(a,w),h=null,v=l.reset_at??l.resets_at;if(typeof v=="string"){let I=new Date(v);isNaN(I.getTime())||(h=I)}else typeof v=="number"&&isFinite(v)&&(h=new Date(v*1e3));i.push({provider:v_,plan:s,limitType:f,value:p,unit:"percentage",comparator:"=",resetsAt:h,sourceType:"live_stream",sourceUrl:`wss://${I_}${gA}`,sourceEvidence:{wireKey:a,frame:n},confidence:1,observedAt:o})}return i.length===0&&hA.some(d=>{let l=r[d];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!==I_?null:[{provider:v_,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 Wd={anthropic:w_,codex:b_};function E_(e){for(let t of Object.values(Wd))if(t.liveSource?.headers?.matchesHost(e))return t}c(E_,"matchLiveHeaders");function A_(e,t){for(let n of Object.values(Wd))if(n.liveSource?.streamFrame?.matches(e,t))return n}c(A_,"matchStreamFrame");var Iue=1440*60*1e3;O();import{and as yA,desc as wA,eq as zd,gte as nq,sql as rq}from"drizzle-orm";function S_(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"}c(S_,"classifySeverity");function Na(e){switch(e){case"none":return 0;case"soft":return 1;case"approaching":return 2;case"imminent":return 3;case"hit":return 4}}c(Na,"severityRank");var np={soft:"soft warning",approaching:"approaching limit",imminent:"imminent limit",hit:"limit reached"};function Z1(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`}c(Z1,"formatTimeLeft");function x_(e,t,n,r,o=Date.now()){let s=Z1(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 ${np[e]}. Resets ${s}.`}c(x_,"formatAlertMessage");function R_(e,t=new Date){if(e.length<2)return null;let n=300*1e3,r=t.getTime()-n,o=e.filter(E=>E.observedAt.getTime()>=r).sort((E,A)=>E.observedAt.getTime()-A.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(E=>(E.observedAt.getTime()-i)/1e3),d=o.map(E=>E.value),l=a.length,m=a.reduce((E,A)=>E+A,0),p=d.reduce((E,A)=>E+A,0),_=a.reduce((E,A,b)=>E+A*d[b],0),w=a.reduce((E,A)=>E+A*A,0),f=l*w-m*m;if(f===0)return null;let h=(l*_-m*p)/f;return h<=0?null:(100-s.value)/h}c(R_,"projectExhaustion");var eq=300*1e3,tq=70;function T_(e){let{proposedSeverity:t,lastDispatch:n,currentUsedPercentage:r,now:o,isFirstTime429:s}=e;if(s)return!0;if(!n)return Na(t)>0;let i=Na(t),a=Na(n.severity);return i>a?!0:o.getTime()-n.lastDispatchedAt.getTime()>=eq?a>=Na("approaching")&&i===a?!(r>=tq):i>0:!1}c(T_,"shouldDispatch");function k_(e){let t=R_(e.observations,e.now),n=Math.max(0,Math.floor((e.currentResetsAt.getTime()-e.now.getTime())/1e3)),r=S_({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=T_({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}}c(k_,"evaluate");function _A(e,t,n){return`${e}:${t}:${n}`}c(_A,"deriveAlertKey");O();async function ja(e){await un({userId:e.userId,type:`usage_${e.severity}`,title:e.title??`Usage limit \u2014 ${np[e.severity]}`,body:e.message,url:"/usage",sourceTable:"alert_dispatches",sourceId:e.dispatchId})}c(ja,"notifyFromDispatch");var oq=30*6e4;async function rp(e,t){let n=new Date((t.observedAt??new Date).getTime()-oq);try{let o=await u.execute(rq`
1486
1491
  SELECT id, observed_at
1487
1492
  FROM limit_observations
1488
1493
  WHERE user_id = ${e}
@@ -1495,15 +1500,15 @@ end`;async function Ks(e){let t=e.req.param("teamId");if(!t||!to.test(t))return{
1495
1500
  AND observed_at >= ${n.toISOString()}::timestamptz
1496
1501
  ORDER BY observed_at DESC
1497
1502
  LIMIT 1
1498
- `);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(ve).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:ve.id,observedAt:ve.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 d.select({observedAt:ve.observedAt,value:ve.value}).from(ve).where(pA(qu(ve.userId,e),qu(ve.provider,t.provider),qu(ve.limitType,t.limitType),J1(ve.observedAt,i))).orderBy(mA(ve.observedAt)).limit(50),u=await d.select().from(kn).where(pA(qu(kn.userId,e),qu(kn.alertKey,o))).orderBy(mA(kn.lastDispatchedAt)).limit(1),l=v_({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:u[0]?{severity:u[0].severity,lastDispatchedAt:u[0].lastDispatchedAt,lastState:u[0].lastState}:null,now:s});if(l.shouldDispatch&&l.severity!=="none"){let p=l.severity,[f]=await d.insert(kn).values({userId:e,alertKey:o,severity:p,lastState:l.payload,channel:"banner"}).returning({id:kn.id});f&&await ja({userId:e,dispatchId:f.id,severity:p,message:__(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}}c(Xp,"processObservation");function fA(e,t){return`${e}::${t.provider}::${t.sourceType}::${t.limitType}`}c(fA,"observationKey");function Qp(){return process.env.OBSERVE_BATCHING!=="0"}c(Qp,"observeBatchingEnabled");function gA(){let e=Number(process.env.OBSERVE_BATCH_BUFFER_MAX);return Number.isFinite(e)&&e>0?Math.floor(e):5e3}c(gA,"observeBufferMax");function hA(){let e=Number(process.env.PG_POOL_MAX)||3;return Math.max(1,e-1)}c(hA,"defaultConcurrency");function Y1(e={}){let t=e.process??((I,b)=>Xp(I,b)),n=e.maxBuffered??gA(),r=Math.max(1,e.concurrency??hA()),o=new Map,s=0,i=new Set,a=0,u=!1,l=[];function p(){let I=l;l=[];for(let b of I)b()}c(p,"notifyProgress");function f(){for(;a<r;){let I=null,b=null;for(let[A,E]of o)if(!(i.has(A)||E.length===0)){b=E,o.delete(A),I=A;break}if(I==null||b==null)return;s-=b.length,i.add(I),a++,_(I,b)}}c(f,"tick");async function _(I,b){try{for(let A of b)try{await t(A.userId,A.obs)}catch(E){console.warn("[observe-batcher] drain failed for one observation; dropping it:",E instanceof Error?E.message:E)}}finally{a--,i.delete(I),p(),f()}}c(_,"runDrain");function v(I){if(u||s>=n)return!1;let b=fA(I.userId,I.obs),A=o.get(b);return A?A.push(I):o.set(b,[I]),s++,f(),!0}c(v,"push");function h(I){return new Promise(b=>{let A=!1,E=c(()=>{A||(A=!0,clearTimeout(S),b())},"finish"),S=setTimeout(E,I);S.unref?.(),l.push(E)})}c(h,"waitForProgress");async function m(I){let b=I!=null?Date.now()+I:Number.POSITIVE_INFINITY;for(;;){if(f(),s===0&&a===0)return;let A=b-Date.now();if(A<=0)return;await h(Math.min(A,50))}}c(m,"flush");function w(){u=!0}return c(w,"stop"),{push:v,flush:m,stop:w,size:c(()=>s,"size"),inFlight:c(()=>a,"inFlight")}}c(Y1,"createObserveBatcher");var Xo=null;function I_(){return Xo==null&&(Xo=Y1()),Xo}c(I_,"getObserveBatcher");function _A(){I_(),console.log(`[observe-batcher] batched observe ingest ON (bufferMax=${gA()} drainConcurrency=${hA()}; OBSERVE_BATCHING=0 to disable)`)}c(_A,"initObserveBatcher");async function yA(e=5e3){if(Xo==null)return;Xo.stop(),await Xo.flush(e);let t=Xo.size()+Xo.inFlight();t>0&&console.warn(`[observe-batcher] shutdown flush deadline (${e}ms) hit; dropping ~${t} buffered observation(s)`)}c(yA,"shutdownObserveBatcher");var fr=new X1,eq=Je.object({provider:Je.string().min(1).max(64),plan:Je.string().min(1).max(64),limitType:Je.string().min(1).max(128),value:Je.number().finite(),unit:Je.string().min(1).max(32),comparator:Je.enum(["=",">=","<="]).default("="),resetsAt:Je.union([Je.string(),Je.date(),Je.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:Je.enum(["oauth_usage","self_observed_429","official_docs","self_observed_lower_bound","community","llm_research","release_notes","live_headers","live_stream"]),sourceUrl:Je.string().url().optional().nullable(),sourceEvidence:Je.unknown().optional(),confidence:Je.number().min(0).max(1),observedAt:Je.union([Je.string(),Je.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})});fr.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=Je.object({host:Je.string(),path:Je.string().default("/"),responseHeaders:Je.record(Je.string()),observedAt:Je.string().optional(),plan:Je.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:u,plan:l}=o.data,p=f_(s);if(!p?.liveSource?.headers)return e.json({observations:[]});let f={host:s,path:i,plan:l??null,observedAt:u?new Date(u):new Date,userId:t},_=p.liveSource.headers.parse(a,f);if(!_||_.length===0)return e.json({observations:[]});let v=[];for(let h of _)try{let m=h.observedAt instanceof Date?h.observedAt:typeof h.observedAt=="string"?new Date(h.observedAt):void 0,[w]=await d.insert(ve).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,...m?{observedAt:m}:{}}).returning({id:ve.id});v.push({...h,id:w.id})}catch{}return e.json({observations:v})});fr.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=Je.object({host:Je.string(),path:Je.string().default("/"),frameText:Je.string(),observedAt:Je.string().optional(),plan:Je.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:u,plan:l}=o.data,p=g_(s,i);if(!p?.liveSource?.streamFrame)return e.json({observations:[]});let f={host:s,path:i,plan:l??null,observedAt:u?new Date(u):new Date,userId:t},_=p.liveSource.streamFrame.parse(a,f);if(!_||_.length===0)return e.json({observations:[]});let v=[];for(let h of _)try{let m=h.observedAt instanceof Date?h.observedAt:typeof h.observedAt=="string"?new Date(h.observedAt):void 0,[w]=await d.insert(ve).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,...m?{observedAt:m}:{}}).returning({id:ve.id});v.push({...h,id:w.id})}catch{}return e.json({observations:v})});fr.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=eq.safeParse(n);if(!r.success)return e.json({error:"Invalid observation",issues:r.error.issues},400);let o=r.data;if(Qp())return I_().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 Xp(t,o);return e.json({id:s.id,observedAt:s.observedAt,...s.deduped?{deduped:!0}:{}},s.deduped?200:201)});fr.get("/research/active-limits",async e=>{let t=e.req.query("provider"),n=e.req.query("plan"),r=[Q1(tt.effectiveUntil)];t&&r.push(Lr(tt.provider,t)),n&&r.push(Lr(tt.plan,n));let o=await d.select().from(tt).where(Uu(...r)).orderBy(tt.provider,tt.plan,tt.limitType,Zp(tt.effectiveFrom));return e.json({items:o})});fr.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:Dt.id,fetchedAt:Dt.fetchedAt,provider:Dt.provider,docUrl:Dt.docUrl,contentHash:Dt.contentHash,parseSuccess:Dt.parseSuccess}).from(Dt).where(b_(Dt.fetchedAt,n)).orderBy(Dt.provider,Dt.docUrl,Zp(Dt.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())})});fr.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(ve).where(Uu(Lr(ve.userId,t),b_(ve.observedAt,r))).orderBy(Zp(ve.observedAt)),s=new Map;for(let a of o){let u=`${a.provider}::${a.plan}::${a.limitType}`,l=s.get(u);l||(l={provider:a.provider,plan:a.plan,limitType:a.limitType,observations:[]},s.set(u,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 u=a.observations.map(_=>_.value).filter(_=>_>0);if(u.length<2)continue;let l=Math.min(...u),p=Math.max(...u);if(l===0)continue;let f=(p-l)/l*100;f>20&&i.push({provider:a.provider,plan:a.plan,limitType:a.limitType,minValue:l,maxValue:p,spreadPct:f,observations:a.observations})}return i.sort((a,u)=>u.spreadPct-a.spreadPct),e.json({items:i.slice(0,100)})});fr.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:tt.effectiveFrom,effectiveUntil:tt.effectiveUntil,confidence:tt.confidence,value:tt.value}).from(tt).where(Uu(Lr(tt.provider,t),Lr(tt.plan,n),Lr(tt.limitType,r),b_(tt.effectiveFrom,s))).orderBy(tt.effectiveFrom);return e.json({items:i.map(a=>({effectiveFrom:a.effectiveFrom,effectiveUntil:a.effectiveUntil,confidence:Number(a.confidence),value:Number(a.value)}))})});fr.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=[Lr(ve.userId,t)];n&&a.push(Lr(ve.provider,n)),r&&a.push(Lr(ve.plan,r)),o&&a.push(Lr(ve.limitType,o));let u=await d.select().from(ve).where(Uu(...a)).orderBy(Zp(ve.observedAt)).limit(s).offset(i),[{total:l}]=await d.select({total:Z1`count(*)::int`}).from(ve).where(Uu(...a));return e.json({items:u,total:l,limit:s,offset:i})});D();import{Hono as tq}from"hono";import{and as bA,desc as nq,eq as Pa,isNull as rq,ne as oq,sql as Qo}from"drizzle-orm";var wA={free:.2,pro:1,max_5x:5,max_20x:20},A_=new Set(["free","pro","max_5x","max_20x"]),E_={fiveHourMessages:20,sevenDaySonnetHours:14,sevenDayOpusHours:1.65};function vA(e){let t=wA[e]??wA.max_20x;return{fiveHourMessages:Math.round(E_.fiveHourMessages*t),sevenDaySonnetHours:Math.round(E_.sevenDaySonnetHours*t),sevenDayOpusHours:Math.round(E_.sevenDayOpusHours*t)}}c(vA,"planDefaultCaps");var Hu=new tq,sq=60*1e3,S_=new Map;function iq(e,t){let n=`${e}::${t}`,r=S_.get(n);if(r&&Date.now()-r.at<sq)return r.rows;let o=d.select({limitType:tt.limitType,value:tt.value,unit:tt.unit}).from(tt).where(bA(Pa(tt.provider,e),Pa(tt.plan,t),rq(tt.effectiveUntil)));return o.catch(()=>S_.delete(n)),S_.set(n,{at:Date.now(),rows:o}),o}c(iq,"getActivePlanLimits");var IA=["five_hour_percent","seven_day_percent","seven_day_opus_percent"],aq={anthropic:["oauth_usage"],codex:["live_stream","self_observed_429"]};function cq(e){return aq[e]??["oauth_usage"]}c(cq,"sourceTypesFor");Hu.get("/usage/current-limits",async e=>{let t=e.get("userId"),n=e.req.query("provider")??"anthropic",r=cq(n),o=Qo`user_id = ${t}
1503
+ `);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(ve).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:ve.id,observedAt:ve.observedAt});if(t.sourceType==="oauth_usage"||t.sourceType==="self_observed_429")try{let o=_A(t.provider,t.plan,t.limitType),s=new Date,i=new Date(s.getTime()-600*1e3),a=await u.select({observedAt:ve.observedAt,value:ve.value}).from(ve).where(yA(zd(ve.userId,e),zd(ve.provider,t.provider),zd(ve.limitType,t.limitType),nq(ve.observedAt,i))).orderBy(wA(ve.observedAt)).limit(50),d=await u.select().from(kn).where(yA(zd(kn.userId,e),zd(kn.alertKey,o))).orderBy(wA(kn.lastDispatchedAt)).limit(1),l=k_({alertKey:o,observations:a.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:d[0]?{severity:d[0].severity,lastDispatchedAt:d[0].lastDispatchedAt,lastState:d[0].lastState}:null,now:s});if(l.shouldDispatch&&l.severity!=="none"){let m=l.severity,[p]=await u.insert(kn).values({userId:e,alertKey:o,severity:m,lastState:l.payload,channel:"banner"}).returning({id:kn.id});p&&await ja({userId:e,dispatchId:p.id,severity:m,message:x_(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}}c(rp,"processObservation");function vA(e,t){return`${e}::${t.provider}::${t.sourceType}::${t.limitType}`}c(vA,"observationKey");function op(){return process.env.OBSERVE_BATCHING!=="0"}c(op,"observeBatchingEnabled");function IA(){let e=Number(process.env.OBSERVE_BATCH_BUFFER_MAX);return Number.isFinite(e)&&e>0?Math.floor(e):5e3}c(IA,"observeBufferMax");function bA(){let e=Number(process.env.PG_POOL_MAX)||3;return Math.max(1,e-1)}c(bA,"defaultConcurrency");function sq(e={}){let t=e.process??((I,E)=>rp(I,E)),n=e.maxBuffered??IA(),r=Math.max(1,e.concurrency??bA()),o=new Map,s=0,i=new Set,a=0,d=!1,l=[];function m(){let I=l;l=[];for(let E of I)E()}c(m,"notifyProgress");function p(){for(;a<r;){let I=null,E=null;for(let[A,b]of o)if(!(i.has(A)||b.length===0)){E=b,o.delete(A),I=A;break}if(I==null||E==null)return;s-=E.length,i.add(I),a++,_(I,E)}}c(p,"tick");async function _(I,E){try{for(let A of E)try{await t(A.userId,A.obs)}catch(b){console.warn("[observe-batcher] drain failed for one observation; dropping it:",b instanceof Error?b.message:b)}}finally{a--,i.delete(I),m(),p()}}c(_,"runDrain");function w(I){if(d||s>=n)return!1;let E=vA(I.userId,I.obs),A=o.get(E);return A?A.push(I):o.set(E,[I]),s++,p(),!0}c(w,"push");function f(I){return new Promise(E=>{let A=!1,b=c(()=>{A||(A=!0,clearTimeout(S),E())},"finish"),S=setTimeout(b,I);S.unref?.(),l.push(b)})}c(f,"waitForProgress");async function h(I){let E=I!=null?Date.now()+I:Number.POSITIVE_INFINITY;for(;;){if(p(),s===0&&a===0)return;let A=E-Date.now();if(A<=0)return;await f(Math.min(A,50))}}c(h,"flush");function v(){d=!0}return c(v,"stop"),{push:w,flush:h,stop:v,size:c(()=>s,"size"),inFlight:c(()=>a,"inFlight")}}c(sq,"createObserveBatcher");var Qo=null;function N_(){return Qo==null&&(Qo=sq()),Qo}c(N_,"getObserveBatcher");function EA(){N_(),console.log(`[observe-batcher] batched observe ingest ON (bufferMax=${IA()} drainConcurrency=${bA()}; OBSERVE_BATCHING=0 to disable)`)}c(EA,"initObserveBatcher");async function AA(e=5e3){if(Qo==null)return;Qo.stop(),await Qo.flush(e);let t=Qo.size()+Qo.inFlight();t>0&&console.warn(`[observe-batcher] shutdown flush deadline (${e}ms) hit; dropping ~${t} buffered observation(s)`)}c(AA,"shutdownObserveBatcher");var gr=new iq,dq=Je.object({provider:Je.string().min(1).max(64),plan:Je.string().min(1).max(64),limitType:Je.string().min(1).max(128),value:Je.number().finite(),unit:Je.string().min(1).max(32),comparator:Je.enum(["=",">=","<="]).default("="),resetsAt:Je.union([Je.string(),Je.date(),Je.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:Je.enum(["oauth_usage","self_observed_429","official_docs","self_observed_lower_bound","community","llm_research","release_notes","live_headers","live_stream"]),sourceUrl:Je.string().url().optional().nullable(),sourceEvidence:Je.unknown().optional(),confidence:Je.number().min(0).max(1),observedAt:Je.union([Je.string(),Je.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})});gr.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=Je.object({host:Je.string(),path:Je.string().default("/"),responseHeaders:Je.record(Je.string()),observedAt:Je.string().optional(),plan:Je.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:d,plan:l}=o.data,m=E_(s);if(!m?.liveSource?.headers)return e.json({observations:[]});let p={host:s,path:i,plan:l??null,observedAt:d?new Date(d):new Date,userId:t},_=m.liveSource.headers.parse(a,p);if(!_||_.length===0)return e.json({observations:[]});let w=[];for(let f of _)try{let h=f.observedAt instanceof Date?f.observedAt:typeof f.observedAt=="string"?new Date(f.observedAt):void 0,[v]=await u.insert(ve).values({provider:f.provider,plan:f.plan,limitType:f.limitType,value:String(f.value),unit:f.unit,comparator:f.comparator??"=",resetsAt:f.resetsAt instanceof Date?f.resetsAt:null,sourceType:f.sourceType,sourceUrl:f.sourceUrl??null,sourceEvidence:f.sourceEvidence??null,confidence:String(f.confidence),userId:t,...h?{observedAt:h}:{}}).returning({id:ve.id});w.push({...f,id:v.id})}catch{}return e.json({observations:w})});gr.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=Je.object({host:Je.string(),path:Je.string().default("/"),frameText:Je.string(),observedAt:Je.string().optional(),plan:Je.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:d,plan:l}=o.data,m=A_(s,i);if(!m?.liveSource?.streamFrame)return e.json({observations:[]});let p={host:s,path:i,plan:l??null,observedAt:d?new Date(d):new Date,userId:t},_=m.liveSource.streamFrame.parse(a,p);if(!_||_.length===0)return e.json({observations:[]});let w=[];for(let f of _)try{let h=f.observedAt instanceof Date?f.observedAt:typeof f.observedAt=="string"?new Date(f.observedAt):void 0,[v]=await u.insert(ve).values({provider:f.provider,plan:f.plan,limitType:f.limitType,value:String(f.value),unit:f.unit,comparator:f.comparator??"=",resetsAt:f.resetsAt instanceof Date?f.resetsAt:null,sourceType:f.sourceType,sourceUrl:f.sourceUrl??null,sourceEvidence:f.sourceEvidence??null,confidence:String(f.confidence),userId:t,...h?{observedAt:h}:{}}).returning({id:ve.id});w.push({...f,id:v.id})}catch{}return e.json({observations:w})});gr.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=dq.safeParse(n);if(!r.success)return e.json({error:"Invalid observation",issues:r.error.issues},400);let o=r.data;if(op())return N_().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 rp(t,o);return e.json({id:s.id,observedAt:s.observedAt,...s.deduped?{deduped:!0}:{}},s.deduped?200:201)});gr.get("/research/active-limits",async e=>{let t=e.req.query("provider"),n=e.req.query("plan"),r=[aq(tt.effectiveUntil)];t&&r.push($r(tt.provider,t)),n&&r.push($r(tt.plan,n));let o=await u.select().from(tt).where(Vd(...r)).orderBy(tt.provider,tt.plan,tt.limitType,sp(tt.effectiveFrom));return e.json({items:o})});gr.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:Dt.id,fetchedAt:Dt.fetchedAt,provider:Dt.provider,docUrl:Dt.docUrl,contentHash:Dt.contentHash,parseSuccess:Dt.parseSuccess}).from(Dt).where(j_(Dt.fetchedAt,n)).orderBy(Dt.provider,Dt.docUrl,sp(Dt.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())})});gr.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(ve).where(Vd($r(ve.userId,t),j_(ve.observedAt,r))).orderBy(sp(ve.observedAt)),s=new Map;for(let a of o){let d=`${a.provider}::${a.plan}::${a.limitType}`,l=s.get(d);l||(l={provider:a.provider,plan:a.plan,limitType:a.limitType,observations:[]},s.set(d,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 d=a.observations.map(_=>_.value).filter(_=>_>0);if(d.length<2)continue;let l=Math.min(...d),m=Math.max(...d);if(l===0)continue;let p=(m-l)/l*100;p>20&&i.push({provider:a.provider,plan:a.plan,limitType:a.limitType,minValue:l,maxValue:m,spreadPct:p,observations:a.observations})}return i.sort((a,d)=>d.spreadPct-a.spreadPct),e.json({items:i.slice(0,100)})});gr.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:tt.effectiveFrom,effectiveUntil:tt.effectiveUntil,confidence:tt.confidence,value:tt.value}).from(tt).where(Vd($r(tt.provider,t),$r(tt.plan,n),$r(tt.limitType,r),j_(tt.effectiveFrom,s))).orderBy(tt.effectiveFrom);return e.json({items:i.map(a=>({effectiveFrom:a.effectiveFrom,effectiveUntil:a.effectiveUntil,confidence:Number(a.confidence),value:Number(a.value)}))})});gr.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=[$r(ve.userId,t)];n&&a.push($r(ve.provider,n)),r&&a.push($r(ve.plan,r)),o&&a.push($r(ve.limitType,o));let d=await u.select().from(ve).where(Vd(...a)).orderBy(sp(ve.observedAt)).limit(s).offset(i),[{total:l}]=await u.select({total:cq`count(*)::int`}).from(ve).where(Vd(...a));return e.json({items:d,total:l,limit:s,offset:i})});O();import{Hono as uq}from"hono";import{and as TA,desc as lq,eq as Pa,isNull as mq,ne as pq,sql as Zo}from"drizzle-orm";var SA={free:.2,pro:1,max_5x:5,max_20x:20},D_=new Set(["free","pro","max_5x","max_20x"]),P_={fiveHourMessages:20,sevenDaySonnetHours:14,sevenDayOpusHours:1.65};function xA(e){let t=SA[e]??SA.max_20x;return{fiveHourMessages:Math.round(P_.fiveHourMessages*t),sevenDaySonnetHours:Math.round(P_.sevenDaySonnetHours*t),sevenDayOpusHours:Math.round(P_.sevenDayOpusHours*t)}}c(xA,"planDefaultCaps");var Jd=new uq,fq=60*1e3,O_=new Map;function gq(e,t){let n=`${e}::${t}`,r=O_.get(n);if(r&&Date.now()-r.at<fq)return r.rows;let o=u.select({limitType:tt.limitType,value:tt.value,unit:tt.unit}).from(tt).where(TA(Pa(tt.provider,e),Pa(tt.plan,t),mq(tt.effectiveUntil)));return o.catch(()=>O_.delete(n)),O_.set(n,{at:Date.now(),rows:o}),o}c(gq,"getActivePlanLimits");var RA=["five_hour_percent","seven_day_percent","seven_day_opus_percent"],hq={anthropic:["oauth_usage"],codex:["live_stream","self_observed_429"]};function _q(e){return hq[e]??["oauth_usage"]}c(_q,"sourceTypesFor");Jd.get("/usage/current-limits",async e=>{let t=e.get("userId"),n=e.req.query("provider")??"anthropic",r=_q(n),o=Zo`user_id = ${t}
1499
1504
  AND provider = ${n}
1500
- AND source_type IN (${Qo.join(r.map(a=>Qo`${a}`),Qo`, `)})
1501
- AND limit_type = lt.limit_type`,s=await d.execute(Qo`
1505
+ AND source_type IN (${Zo.join(r.map(a=>Zo`${a}`),Zo`, `)})
1506
+ AND limit_type = lt.limit_type`,s=await u.execute(Zo`
1502
1507
  SELECT lt.limit_type AS limit_type,
1503
1508
  CASE WHEN w.resets_at IS NULL THEN recent.value ELSE win.value END AS value,
1504
1509
  CASE WHEN w.resets_at IS NULL THEN recent.resets_at ELSE win.resets_at END AS resets_at,
1505
1510
  CASE WHEN w.resets_at IS NULL THEN recent.observed_at ELSE win.observed_at END AS observed_at
1506
- FROM (VALUES ${Qo.join(IA.map(a=>Qo`(${a})`),Qo`, `)}) AS lt(limit_type)
1511
+ FROM (VALUES ${Zo.join(RA.map(a=>Zo`(${a})`),Zo`, `)}) AS lt(limit_type)
1507
1512
  LEFT JOIN LATERAL (
1508
1513
  SELECT resets_at
1509
1514
  FROM limit_observations
@@ -1526,22 +1531,22 @@ end`;async function Ks(e){let t=e.req.param("teamId");if(!t||!to.test(t))return{
1526
1531
  ORDER BY observed_at DESC
1527
1532
  LIMIT 1
1528
1533
  ) recent ON true
1529
- `),i=new Map;for(let a of s)a.value==null||a.observed_at==null||IA.includes(a.limit_type)&&i.set(a.limit_type,{used_percentage:Number(a.value),resets_at:a.resets_at?new Date(a.resets_at).toISOString():null,observed_at:new Date(a.observed_at).toISOString()});return e.header("Cache-Control","private, max-age=15"),e.json({provider:n,five_hour:i.get("five_hour_percent")??null,seven_day:i.get("seven_day_percent")??null,seven_day_opus:i.get("seven_day_opus_percent")??null})});Hu.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(Pa(T.id,t)),o=r?.source==="manual"&&r.plan&&A_.has(r.plan)?r.plan:null,s=await d.select({plan:ve.plan}).from(ve).where(bA(Pa(ve.userId,t),Pa(ve.provider,n),Pa(ve.sourceType,"oauth_usage"),oq(ve.plan,"unknown"))).orderBy(nq(ve.observedAt)).limit(1),i=s[0]?.plan&&A_.has(s[0].plan)?s[0].plan:null,a=o??i??"max_20x",u=o===null&&i===null,l=vA(a),p=await iq(n,a);function f(m,w,I){let b=p.filter(A=>A.limitType===m&&w.test(A.unit));return b.length===0?I:Math.max(...b.map(A=>Number(A.value)))}c(f,"bestCap");let _=f("five_hour_messages",/msg|message/i,l.fiveHourMessages),v=f("seven_day_sonnet_hours",/hour|hr/i,l.sevenDaySonnetHours),h=f("seven_day_opus_hours",/hour|hr/i,l.sevenDayOpusHours);return e.header("Cache-Control","private, max-age=15"),e.json({plan:a,assumed:u,five_hour_percent:{inferred_cap:_,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}})});D();import{Hono as uq}from"hono";import{z as gr}from"zod";import{and as EA,desc as xA,eq as Bu,sql as dq}from"drizzle-orm";var Wu=new uq,AA=30,lq=30,pq=0,x_=1e3,SA=2e3,T_=2;function Fu(e){return e==null?0:typeof e=="number"?e:Number(e)}c(Fu,"toNum");function mq(e){if(!e)return null;let t=typeof e=="string"?Date.parse(e):e.getTime();return Number.isNaN(t)?null:(Date.now()-t)/864e5}c(mq,"ageDays");async function fq(){let e=await d.select({provider:st.provider,modelId:st.modelId,inputPerM:st.inputPerM,outputPerM:st.outputPerM,effectiveFrom:st.effectiveFrom,verifiedAt:st.verifiedAt}).from(st).orderBy(xA(st.effectiveFrom)),t=new Map;for(let n of e){let r=`${n.provider}::${n.modelId}`;t.has(r)||t.set(r,n)}return t}c(fq,"loadActiveRows");Wu.get("/pricing/coverage",async e=>{if(!e.get("userId"))return e.json({error:"unauthorized"},401);let n=await d.execute(dq`
1534
+ `),i=new Map;for(let a of s)a.value==null||a.observed_at==null||RA.includes(a.limit_type)&&i.set(a.limit_type,{used_percentage:Number(a.value),resets_at:a.resets_at?new Date(a.resets_at).toISOString():null,observed_at:new Date(a.observed_at).toISOString()});return e.header("Cache-Control","private, max-age=15"),e.json({provider:n,five_hour:i.get("five_hour_percent")??null,seven_day:i.get("seven_day_percent")??null,seven_day_opus:i.get("seven_day_opus_percent")??null})});Jd.get("/usage/inferred-caps",async e=>{let t=e.get("userId"),n=e.req.query("provider")??"anthropic",[r]=await u.select({plan:R.claudeCodePlan,source:R.planSource}).from(R).where(Pa(R.id,t)),o=r?.source==="manual"&&r.plan&&D_.has(r.plan)?r.plan:null,s=await u.select({plan:ve.plan}).from(ve).where(TA(Pa(ve.userId,t),Pa(ve.provider,n),Pa(ve.sourceType,"oauth_usage"),pq(ve.plan,"unknown"))).orderBy(lq(ve.observedAt)).limit(1),i=s[0]?.plan&&D_.has(s[0].plan)?s[0].plan:null,a=o??i??"max_20x",d=o===null&&i===null,l=xA(a),m=await gq(n,a);function p(h,v,I){let E=m.filter(A=>A.limitType===h&&v.test(A.unit));return E.length===0?I:Math.max(...E.map(A=>Number(A.value)))}c(p,"bestCap");let _=p("five_hour_messages",/msg|message/i,l.fiveHourMessages),w=p("seven_day_sonnet_hours",/hour|hr/i,l.sevenDaySonnetHours),f=p("seven_day_opus_hours",/hour|hr/i,l.sevenDayOpusHours);return e.header("Cache-Control","private, max-age=15"),e.json({plan:a,assumed:d,five_hour_percent:{inferred_cap:_,unit:"messages",confidence_band_pct:20},seven_day_percent:{inferred_cap:w,unit:"hours",confidence_band_pct:20},seven_day_opus_percent:{inferred_cap:f,unit:"hours",confidence_band_pct:20}})});O();import{Hono as yq}from"hono";import{z as hr}from"zod";import{and as kA,desc as PA,eq as Kd,sql as wq}from"drizzle-orm";var Yd=new yq,NA=30,vq=30,Iq=0,C_=1e3,jA=2e3,L_=2;function Gd(e){return e==null?0:typeof e=="number"?e:Number(e)}c(Gd,"toNum");function bq(e){if(!e)return null;let t=typeof e=="string"?Date.parse(e):e.getTime();return Number.isNaN(t)?null:(Date.now()-t)/864e5}c(bq,"ageDays");async function Eq(){let e=await u.select({provider:st.provider,modelId:st.modelId,inputPerM:st.inputPerM,outputPerM:st.outputPerM,effectiveFrom:st.effectiveFrom,verifiedAt:st.verifiedAt}).from(st).orderBy(PA(st.effectiveFrom)),t=new Map;for(let n of e){let r=`${n.provider}::${n.modelId}`;t.has(r)||t.set(r,n)}return t}c(Eq,"loadActiveRows");Yd.get("/pricing/coverage",async e=>{if(!e.get("userId"))return e.json({error:"unauthorized"},401);let n=await u.execute(wq`
1530
1535
  SELECT model,
1531
1536
  COUNT(*)::int AS events,
1532
1537
  MAX(timestamp) AS last_seen
1533
1538
  FROM session_events
1534
1539
  WHERE model IS NOT NULL
1535
1540
  AND model NOT IN ('unknown', '(null)')
1536
- AND timestamp > now() - (${lq} || ' days')::interval
1541
+ AND timestamp > now() - (${vq} || ' days')::interval
1537
1542
  GROUP BY model
1538
1543
  ORDER BY events DESC
1539
- `),r=await fq(),o=[],s=[],i=0;for(let a of n){let u=a.model,l=$o(u),p=r.get(`${l}::${u}`);if(!p){o.push({provider:l,modelId:u,events:a.events,lastSeen:String(a.last_seen)});continue}let f=mq(p.verifiedAt??p.effectiveFrom);f===null||f>AA?s.push({provider:l,modelId:u,events:a.events,verifiedAt:p.verifiedAt?String(p.verifiedAt):null,ageDays:f===null?null:Math.round(f),currentInput:Fu(p.inputPerM),currentOutput:Fu(p.outputPerM)}):i+=1}return e.json({staleDays:AA,capturedModels:n.length,pricedFresh:i,unpriced:o,stale:s})});var gq=gr.object({provider:gr.string().min(1).optional(),modelId:gr.string().min(1),inputPerM:gr.number(),outputPerM:gr.number(),cacheReadPerM:gr.number().optional(),cacheWrite5mPerM:gr.number().optional(),cacheWrite1hPerM:gr.number().optional(),contextWindow:gr.number().int().positive().nullable().optional(),sourceUrl:gr.string().url(),effectiveFrom:gr.string().datetime().optional()});Wu.post("/pricing/rates",async e=>{if(!e.get("userId"))return e.json({error:"unauthorized"},401);let n=gq.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??$o(r.modelId),s=c((h,m)=>h>pq&&h<=m,"inRange");if(!s(r.inputPerM,x_)||!s(r.outputPerM,x_))return e.json({status:"rejected",reason:`input/output out of range (0, ${x_}]`},422);let i=r.cacheReadPerM??0,a=r.cacheWrite5mPerM??0,u=r.cacheWrite1hPerM??0;for(let[h,m]of[["cacheReadPerM",i],["cacheWrite5mPerM",a],["cacheWrite1hPerM",u]])if(m<0||m>SA)return e.json({status:"rejected",reason:`${h} out of range [0, ${SA}]`},422);let p=(await d.select().from(st).where(EA(Bu(st.provider,o),Bu(st.modelId,r.modelId))).orderBy(xA(st.effectiveFrom)).limit(1))[0],f=1e-9;if(p){let h=Fu(p.inputPerM),m=Fu(p.outputPerM),w=c((E,S)=>S<=0?1/0:E/S,"ratio"),I=Math.max(w(r.inputPerM,h),w(h,r.inputPerM)),b=Math.max(w(r.outputPerM,m),w(m,r.outputPerM));if(I>T_||b>T_)return e.json({status:"flagged",reason:`new rate differs from current by more than ${T_}x \u2014 needs human review`,current:{inputPerM:h,outputPerM:m},proposed:{inputPerM:r.inputPerM,outputPerM:r.outputPerM},sourceUrl:r.sourceUrl});if(Math.abs(h-r.inputPerM)<f&&Math.abs(m-r.outputPerM)<f&&Math.abs(Fu(p.cacheReadPerM)-i)<f)return await d.update(st).set({verifiedAt:new Date}).where(EA(Bu(st.provider,o),Bu(st.modelId,r.modelId),Bu(st.effectiveFrom,p.effectiveFrom))),e.json({status:"unchanged",modelId:r.modelId})}let _=r.effectiveFrom?new Date(r.effectiveFrom):new Date,v=new Date().toISOString().slice(0,10);return await d.insert(st).values({provider:o,modelId:r.modelId,inputPerM:String(r.inputPerM),outputPerM:String(r.outputPerM),cacheReadPerM:String(i),cacheWrite5mPerM:String(a),cacheWrite1hPerM:String(u),contextWindow:r.contextWindow??null,effectiveFrom:_,verifiedAt:new Date,source:`auto-refresh-${v}`}).onConflictDoNothing(),e.json({status:"written",modelId:r.modelId,provider:o,effectiveFrom:_.toISOString()})});D();import{Hono as hq}from"hono";import{desc as _q,eq as yq}from"drizzle-orm";var em=new hq;em.get("/alerts/recent",async e=>{let t=e.get("userId"),n=await d.select().from(kn).where(yq(kn.userId,t)).orderBy(_q(kn.lastDispatchedAt)).limit(20);return e.json({items:n})});D();import{Hono as wq}from"hono";import{randomUUID as vq}from"node:crypto";import{sql as Da}from"drizzle-orm";var tm=new wq,kA=300,TA=3e4,Iq=6e4,bq=1e3,R_={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_refine_cases:"agent_jobs",cron_retire_unused_skills:"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"},Eq=["session_send_jobs","launch_jobs","eval_jobs","insights_jobs","agent_jobs"];async function Aq(e,t,n,r){if(n.length===0)return null;let o=Da.join(n.map(i=>Da`${i}`),Da`, `),s=await d.execute(Da`
1544
+ `),r=await Eq(),o=[],s=[],i=0;for(let a of n){let d=a.model,l=Uo(d),m=r.get(`${l}::${d}`);if(!m){o.push({provider:l,modelId:d,events:a.events,lastSeen:String(a.last_seen)});continue}let p=bq(m.verifiedAt??m.effectiveFrom);p===null||p>NA?s.push({provider:l,modelId:d,events:a.events,verifiedAt:m.verifiedAt?String(m.verifiedAt):null,ageDays:p===null?null:Math.round(p),currentInput:Gd(m.inputPerM),currentOutput:Gd(m.outputPerM)}):i+=1}return e.json({staleDays:NA,capturedModels:n.length,pricedFresh:i,unpriced:o,stale:s})});var Aq=hr.object({provider:hr.string().min(1).optional(),modelId:hr.string().min(1),inputPerM:hr.number(),outputPerM:hr.number(),cacheReadPerM:hr.number().optional(),cacheWrite5mPerM:hr.number().optional(),cacheWrite1hPerM:hr.number().optional(),contextWindow:hr.number().int().positive().nullable().optional(),sourceUrl:hr.string().url(),effectiveFrom:hr.string().datetime().optional()});Yd.post("/pricing/rates",async e=>{if(!e.get("userId"))return e.json({error:"unauthorized"},401);let n=Aq.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??Uo(r.modelId),s=c((f,h)=>f>Iq&&f<=h,"inRange");if(!s(r.inputPerM,C_)||!s(r.outputPerM,C_))return e.json({status:"rejected",reason:`input/output out of range (0, ${C_}]`},422);let i=r.cacheReadPerM??0,a=r.cacheWrite5mPerM??0,d=r.cacheWrite1hPerM??0;for(let[f,h]of[["cacheReadPerM",i],["cacheWrite5mPerM",a],["cacheWrite1hPerM",d]])if(h<0||h>jA)return e.json({status:"rejected",reason:`${f} out of range [0, ${jA}]`},422);let m=(await u.select().from(st).where(kA(Kd(st.provider,o),Kd(st.modelId,r.modelId))).orderBy(PA(st.effectiveFrom)).limit(1))[0],p=1e-9;if(m){let f=Gd(m.inputPerM),h=Gd(m.outputPerM),v=c((b,S)=>S<=0?1/0:b/S,"ratio"),I=Math.max(v(r.inputPerM,f),v(f,r.inputPerM)),E=Math.max(v(r.outputPerM,h),v(h,r.outputPerM));if(I>L_||E>L_)return e.json({status:"flagged",reason:`new rate differs from current by more than ${L_}x \u2014 needs human review`,current:{inputPerM:f,outputPerM:h},proposed:{inputPerM:r.inputPerM,outputPerM:r.outputPerM},sourceUrl:r.sourceUrl});if(Math.abs(f-r.inputPerM)<p&&Math.abs(h-r.outputPerM)<p&&Math.abs(Gd(m.cacheReadPerM)-i)<p)return await u.update(st).set({verifiedAt:new Date}).where(kA(Kd(st.provider,o),Kd(st.modelId,r.modelId),Kd(st.effectiveFrom,m.effectiveFrom))),e.json({status:"unchanged",modelId:r.modelId})}let _=r.effectiveFrom?new Date(r.effectiveFrom):new Date,w=new Date().toISOString().slice(0,10);return await u.insert(st).values({provider:o,modelId:r.modelId,inputPerM:String(r.inputPerM),outputPerM:String(r.outputPerM),cacheReadPerM:String(i),cacheWrite5mPerM:String(a),cacheWrite1hPerM:String(d),contextWindow:r.contextWindow??null,effectiveFrom:_,verifiedAt:new Date,source:`auto-refresh-${w}`}).onConflictDoNothing(),e.json({status:"written",modelId:r.modelId,provider:o,effectiveFrom:_.toISOString()})});O();import{Hono as Sq}from"hono";import{desc as xq,eq as Rq}from"drizzle-orm";var ip=new Sq;ip.get("/alerts/recent",async e=>{let t=e.get("userId"),n=await u.select().from(kn).where(Rq(kn.userId,t)).orderBy(xq(kn.lastDispatchedAt)).limit(20);return e.json({items:n})});O();import{Hono as Tq}from"hono";import{randomUUID as kq}from"node:crypto";import{sql as Da}from"drizzle-orm";var ap=new Tq,CA=300,DA=3e4,Nq=6e4,jq=1e3,M_={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_refine_cases:"agent_jobs",cron_retire_unused_skills:"agent_jobs",cron_reconcile_attribution:"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"},Pq=["session_send_jobs","launch_jobs","eval_jobs","insights_jobs","agent_jobs"];async function Dq(e,t,n,r){if(n.length===0)return null;let o=Da.join(n.map(i=>Da`${i}`),Da`, `),s=await u.execute(Da`
1540
1545
  UPDATE ${Da.raw(e)} AS m
1541
1546
  SET status = 'claimed',
1542
1547
  claimed_by = ${r},
1543
1548
  claimed_at = now(),
1544
- lease_expires_at = now() + (${kA}::int * interval '1 second'),
1549
+ lease_expires_at = now() + (${CA}::int * interval '1 second'),
1545
1550
  attempts = m.attempts + 1,
1546
1551
  updated_at = now()
1547
1552
  FROM (
@@ -1557,23 +1562,23 @@ end`;async function Ks(e){let t=e.req.param("teamId");if(!t||!to.test(t))return{
1557
1562
  ) AS picked
1558
1563
  WHERE m.id = picked.id
1559
1564
  RETURNING m.id, m.task_kind, m.payload, m.attempts
1560
- `);return s.length>0?s[0]:null}c(Aq,"claimOne");async function Sq(e,t,n){let r={};for(let o of t){let s=R_[o];s&&(r[s]??=[]).push(o)}for(let o of Eq){let s=r[o];if(!s)continue;let i=await Aq(o,e,s,n);if(i)return{job:i,table:o}}return null}c(Sq,"tryClaimAcrossTables");var xq={cron_suggest_instructions:[0,7,37]};function Tq(e){let t=/rulemetric-cli\/(\d+)\.(\d+)\.(\d+)/.exec(e??"");return t?[Number(t[1]),Number(t[2]),Number(t[3])]:null}c(Tq,"parseCliVersion");function Rq(e,t){return e[0]!==t[0]?e[0]>t[0]:e[1]!==t[1]?e[1]>t[1]:e[2]>=t[2]}c(Rq,"versionAtLeast");function kq(e,t){let n=Tq(t),r=[],o=[];for(let s of e){let i=xq[s];i&&(!n||!Rq(n,i))?o.push(s):r.push(s)}return{allowed:r,fenced:o}}c(kq,"fenceCapabilities");var RA=new Set;tm.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 R_),{allowed:o,fenced:s}=kq(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(R_).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,Iq)):TA,u=vq(),l=Date.now()+a;for(;;){let p=await Sq(t,o,u);if(p)return e.json({id:p.job.id,kind:p.job.task_kind,payload:p.job.payload,attempts:p.job.attempts,leaseToken:u,leaseDurationSeconds:kA,table:p.table});if(Date.now()>=l)break;await new Promise(f=>setTimeout(f,bq))}return e.body(null,204)});D();import{Hono as Pq}from"hono";import{z as zu}from"zod";import{sql as oo}from"drizzle-orm";D();import{eq as Mr,and as k_}from"drizzle-orm";var Nq=c(e=>`${(e*100).toFixed(1)}pp`,"pct"),jq=c(e=>`${(e/6e4).toFixed(0)} min`,"mins");function NA(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 f=o.cost?.modelCalls;return{type:"evolution_blocked",title:`Evolution stopped by the environment \u2014 ${i}`,body:`${o.reason??o.skipped}`+(f?` (${f} 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 u=o.nPairs??o.cost?.usablePairs,l=[];if(u!=null){let f=o.cost?.plannedPairs;l.push(`${u}${f?`/${f}`:""} paired task(s)`)}typeof o.cost?.mde=="number"&&l.push(`resolves \xB1${Nq(o.cost.mde)}`),o.cost?.modelCalls&&l.push(`${o.cost.modelCalls} model calls`),o.cost?.wallMs&&l.push(jq(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:u??null,promotionId:o.promotionId??null,cost:o.cost??null}}}c(NA,"buildEvolutionNotification");async function jA(e,t,n,r){try{let[o]=await d.select({evalTargetId:je.evalTargetId,config:je.config}).from(je).where(k_(Mr(je.id,t),Mr(je.userId,e)));if(!o||o.config?.type==="conversation")return;let[s]=await d.select({name:k.name}).from(k).where(Mr(k.id,o.evalTargetId)),i=s?.name??"eval target";n==="failed"?await un({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 un({userId:e,type:"eval_completed",title:"Eval run complete",body:`${i} finished`,url:`/eval-targets/${o.evalTargetId}`,sourceTable:"eval_jobs",sourceId:t}),await _u(e,o.evalTargetId))}catch(o){console.error("[job-notifications] eval notify failed:",o instanceof Error?o.stack:o)}}c(jA,"notifyEvalTerminal");async function PA(e,t,n,r){try{let[o]=await d.select({projectPath:z.projectPath}).from(z).where(k_(Mr(z.id,t),Mr(z.userId,e)));if(!o)return;let s=null,i;if(o.projectPath){let[p]=await d.select({id:C.id,name:C.name}).from(ye).innerJoin(C,Mr(C.id,ye.projectId)).where(Mr(ye.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),u=`${s??"unmatched"}-${a}`,l=o.projectPath?`/insights/computed?projectPath=${encodeURIComponent(o.projectPath)}&tab=recommendations`:"/insights";n==="failed"?await un({userId:e,type:"insights_failed",title:"Insights generation failed",body:`${i}: ${String(r??"").slice(0,200)}`,url:l,sourceTable:"insights_jobs",sourceId:u}):await un({userId:e,type:"insights_ready",title:`Insights ready: ${i}`,body:"New recommendations are available",url:l,sourceTable:"insights_jobs",sourceId:u})}catch(o){console.error("[job-notifications] insights notify failed:",o instanceof Error?o.stack:o)}}c(PA,"notifyInsightsTerminal");async function DA(e,t,n,r){try{let[o]=await d.select({payload:Pe.payload,result:Pe.result}).from(Pe).where(k_(Mr(Pe.id,t),Mr(Pe.userId,e)));if(!o)return;let s=o.payload?.evalTargetId;if(!s)return;let[i]=await d.select({name:k.name}).from(k).where(Mr(k.id,s)),a=NA({targetName:i?.name??"instruction",evalTargetId:s,status:n,result:o.result,error:r});if(!a)return;await un({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)}}c(DA,"notifyEvolutionTerminal");async function CA(e,t,n,r,o){e==="process_eval"?await jA(t,n,r,o):e==="process_insights"?await PA(t,n,r,o):e==="cron_instruction_evolution"&&await DA(t,n,r,o)}c(CA,"notifyTerminal");var Oa=new Pq,OA=300,N_={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_refine_cases:1,cron_retire_unused_skills: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},Dq=["session_send_jobs","launch_jobs","eval_jobs","insights_jobs","agent_jobs"];async function j_(e,t,n){for(let r of Dq){let o=await d.execute(oo`
1565
+ `);return s.length>0?s[0]:null}c(Dq,"claimOne");async function Oq(e,t,n){let r={};for(let o of t){let s=M_[o];s&&(r[s]??=[]).push(o)}for(let o of Pq){let s=r[o];if(!s)continue;let i=await Dq(o,e,s,n);if(i)return{job:i,table:o}}return null}c(Oq,"tryClaimAcrossTables");var Cq={cron_suggest_instructions:[0,7,37]};function Lq(e){let t=/rulemetric-cli\/(\d+)\.(\d+)\.(\d+)/.exec(e??"");return t?[Number(t[1]),Number(t[2]),Number(t[3])]:null}c(Lq,"parseCliVersion");function Mq(e,t){return e[0]!==t[0]?e[0]>t[0]:e[1]!==t[1]?e[1]>t[1]:e[2]>=t[2]}c(Mq,"versionAtLeast");function $q(e,t){let n=Lq(t),r=[],o=[];for(let s of e){let i=Cq[s];i&&(!n||!Mq(n,i))?o.push(s):r.push(s)}return{allowed:r,fenced:o}}c($q,"fenceCapabilities");var OA=new Set;ap.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 M_),{allowed:o,fenced:s}=$q(r,e.req.header("user-agent"));if(s.length>0&&!OA.has(t)&&(OA.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(M_).join(", ")},400);if(o.length===0)return e.body(null,204);let i=Number.parseInt(e.req.query("waitMs")??`${DA}`,10),a=Number.isFinite(i)?Math.max(0,Math.min(i,Nq)):DA,d=kq(),l=Date.now()+a;for(;;){let m=await Oq(t,o,d);if(m)return e.json({id:m.job.id,kind:m.job.task_kind,payload:m.job.payload,attempts:m.job.attempts,leaseToken:d,leaseDurationSeconds:CA,table:m.table});if(Date.now()>=l)break;await new Promise(p=>setTimeout(p,jq))}return e.body(null,204)});O();import{Hono as Hq}from"hono";import{z as Xd}from"zod";import{sql as io}from"drizzle-orm";O();import{eq as qr,and as $_}from"drizzle-orm";var qq=c(e=>`${(e*100).toFixed(1)}pp`,"pct"),Uq=c(e=>`${(e/6e4).toFixed(0)} min`,"mins");function LA(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 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:a,metadata:{evalTargetId:n,outcome:o.skipped,reason:o.reason,cost:o.cost}}}if(o.skipped||!o.decision)return null;let d=o.nPairs??o.cost?.usablePairs,l=[];if(d!=null){let p=o.cost?.plannedPairs;l.push(`${d}${p?`/${p}`:""} paired task(s)`)}typeof o.cost?.mde=="number"&&l.push(`resolves \xB1${qq(o.cost.mde)}`),o.cost?.modelCalls&&l.push(`${o.cost.modelCalls} model calls`),o.cost?.wallMs&&l.push(Uq(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:a,metadata:{evalTargetId:n,outcome:o.decision,applied:o.applied===!0,nPairs:d??null,promotionId:o.promotionId??null,cost:o.cost??null}}}c(LA,"buildEvolutionNotification");async function MA(e,t,n,r){try{let[o]=await u.select({evalTargetId:je.evalTargetId,config:je.config}).from(je).where($_(qr(je.id,t),qr(je.userId,e)));if(!o||o.config?.type==="conversation")return;let[s]=await u.select({name:k.name}).from(k).where(qr(k.id,o.evalTargetId)),i=s?.name??"eval target";n==="failed"?await un({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 un({userId:e,type:"eval_completed",title:"Eval run complete",body:`${i} finished`,url:`/eval-targets/${o.evalTargetId}`,sourceTable:"eval_jobs",sourceId:t}),await wd(e,o.evalTargetId))}catch(o){console.error("[job-notifications] eval notify failed:",o instanceof Error?o.stack:o)}}c(MA,"notifyEvalTerminal");async function $A(e,t,n,r){try{let[o]=await u.select({projectPath:z.projectPath}).from(z).where($_(qr(z.id,t),qr(z.userId,e)));if(!o)return;let s=null,i;if(o.projectPath){let[m]=await u.select({id:C.id,name:C.name}).from(ye).innerJoin(C,qr(C.id,ye.projectId)).where(qr(ye.path,o.projectPath)).limit(1);m?(s=m.id,i=m.name):i=`${o.projectPath.split("/").pop()||"Unknown"} (unregistered)`}else i="All Projects";let a=new Date().toISOString().slice(0,10),d=`${s??"unmatched"}-${a}`,l=o.projectPath?`/insights/computed?projectPath=${encodeURIComponent(o.projectPath)}&tab=recommendations`:"/insights";n==="failed"?await un({userId:e,type:"insights_failed",title:"Insights generation failed",body:`${i}: ${String(r??"").slice(0,200)}`,url:l,sourceTable:"insights_jobs",sourceId:d}):await un({userId:e,type:"insights_ready",title:`Insights ready: ${i}`,body:"New recommendations are available",url:l,sourceTable:"insights_jobs",sourceId:d})}catch(o){console.error("[job-notifications] insights notify failed:",o instanceof Error?o.stack:o)}}c($A,"notifyInsightsTerminal");async function qA(e,t,n,r){try{let[o]=await u.select({payload:Pe.payload,result:Pe.result}).from(Pe).where($_(qr(Pe.id,t),qr(Pe.userId,e)));if(!o)return;let s=o.payload?.evalTargetId;if(!s)return;let[i]=await u.select({name:k.name}).from(k).where(qr(k.id,s)),a=LA({targetName:i?.name??"instruction",evalTargetId:s,status:n,result:o.result,error:r});if(!a)return;await un({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)}}c(qA,"notifyEvolutionTerminal");async function HA(e,t,n,r,o){e==="process_eval"?await MA(t,n,r,o):e==="process_insights"?await $A(t,n,r,o):e==="cron_instruction_evolution"&&await qA(t,n,r,o)}c(HA,"notifyTerminal");var Oa=new Hq,UA=300,q_={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_reconcile_attribution:1,cron_refine_cases:1,cron_retire_unused_skills: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},Bq=["session_send_jobs","launch_jobs","eval_jobs","insights_jobs","agent_jobs"];async function U_(e,t,n){for(let r of Bq){let o=await u.execute(io`
1561
1566
  SELECT status, attempts, task_kind
1562
- FROM ${oo.raw(r)}
1567
+ FROM ${io.raw(r)}
1563
1568
  WHERE id = ${e}
1564
1569
  AND user_id = ${t}
1565
1570
  AND claimed_by = ${n}
1566
1571
  AND status IN ('claimed', 'running')
1567
1572
  LIMIT 1
1568
- `);if(o.length>0)return{table:r,status:o[0].status,attempts:o[0].attempts,taskKind:o[0].task_kind}}return null}c(j_,"locateRow");var Oq=zu.object({result:zu.unknown().optional()}),Cq=zu.object({error:zu.string().min(1).max(8192),terminal:zu.boolean().optional().default(!1)});Oa.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 j_(n,t,o);return s?(await d.execute(oo`
1569
- UPDATE ${oo.raw(s.table)}
1570
- SET lease_expires_at = now() + (${OA}::int * interval '1 second'),
1573
+ `);if(o.length>0)return{table:r,status:o[0].status,attempts:o[0].attempts,taskKind:o[0].task_kind}}return null}c(U_,"locateRow");var Fq=Xd.object({result:Xd.unknown().optional()}),Wq=Xd.object({error:Xd.string().min(1).max(8192),terminal:Xd.boolean().optional().default(!1)});Oa.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 U_(n,t,o);return s?(await u.execute(io`
1574
+ UPDATE ${io.raw(s.table)}
1575
+ SET lease_expires_at = now() + (${UA}::int * interval '1 second'),
1571
1576
  updated_at = now()
1572
1577
  WHERE id = ${n}
1573
1578
  AND claimed_by = ${o}
1574
1579
  AND status IN ('claimed', 'running')
1575
- `),e.json({ok:!0,leaseDurationSeconds:OA})):e.json({error:"job not found or lease lost"},404)});Oa.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=Oq.safeParse(r);if(!s.success)return e.json({error:s.error.format()},400);let i=await j_(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 d.execute(oo`
1576
- UPDATE ${oo.raw(i.table)}
1580
+ `),e.json({ok:!0,leaseDurationSeconds:UA})):e.json({error:"job not found or lease lost"},404)});Oa.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=Fq.safeParse(r);if(!s.success)return e.json({error:s.error.format()},400);let i=await U_(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(io`
1581
+ UPDATE ${io.raw(i.table)}
1577
1582
  SET status = 'completed',
1578
1583
  result = ${a}::jsonb,
1579
1584
  error = NULL,
@@ -1584,24 +1589,24 @@ end`;async function Ks(e){let t=e.req.param("teamId");if(!t||!to.test(t))return{
1584
1589
  WHERE id = ${n}
1585
1590
  AND claimed_by = ${o}
1586
1591
  AND status IN ('claimed', 'running')
1587
- `),await CA(i.taskKind,t,n,"completed"),e.json({ok:!0})});Oa.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=Cq.safeParse(r);if(!s.success)return e.json({error:s.error.format()},400);let i=await j_(n,t,o);if(!i)return e.json({error:"job not found or lease lost"},404);let a=N_[i.taskKind]??3,u=s.data.terminal||i.attempts>=a,l=u?"failed":"pending";return await d.execute(oo`
1588
- UPDATE ${oo.raw(i.table)}
1592
+ `),await HA(i.taskKind,t,n,"completed"),e.json({ok:!0})});Oa.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=Wq.safeParse(r);if(!s.success)return e.json({error:s.error.format()},400);let i=await U_(n,t,o);if(!i)return e.json({error:"job not found or lease lost"},404);let a=q_[i.taskKind]??3,d=s.data.terminal||i.attempts>=a,l=d?"failed":"pending";return await u.execute(io`
1593
+ UPDATE ${io.raw(i.table)}
1589
1594
  SET status = ${l},
1590
1595
  error = ${s.data.error},
1591
1596
  updated_at = now(),
1592
- ${oo.raw(u?"completed_at = now(),":"")}
1597
+ ${io.raw(d?"completed_at = now(),":"")}
1593
1598
  claimed_by = NULL,
1594
1599
  claimed_at = NULL,
1595
1600
  lease_expires_at = NULL
1596
1601
  WHERE id = ${n}
1597
1602
  AND claimed_by = ${o}
1598
1603
  AND status IN ('claimed', 'running')
1599
- `),u&&await CA(i.taskKind,t,n,"failed",s.data.error),e.json({ok:!0,requeued:!u,attempts:i.attempts})});D();import{Hono as Wq}from"hono";import{z as Zo}from"zod";import{and as HA,desc as zq,eq as so,isNotNull as Vq,sql as BA}from"drizzle-orm";D();import{and as Lq,asc as Mq,eq as $r,gt as $q,isNotNull as qq,sql as Uq}from"drizzle-orm";var LA=100,MA=10,nm=new Set;function $A(e){return nm.has(e)}c($A,"isAnnouncementSendInFlight");async function qA(e,t={}){let n=t.db??d,r=t.sendEmail??Hp,o=t.log??(i=>process.stderr.write(`[announcement-sender] ${i}
1600
- `)),s=t.webBaseUrl??process.env.RULEMETRIC_WEB_URL??process.env.WEB_URL??"https://rulemetric.com";if(nm.has(e))throw new Error(`Announcement ${e} send already in flight`);nm.add(e);try{return await Hq({announcementId:e,db:n,sendEmail:r,log:o,webBaseUrl:s})}finally{nm.delete(e)}}c(qA,"sendAnnouncement");async function Hq(e){let{announcementId:t,db:n,sendEmail:r,log:o,webBaseUrl:s}=e,[i]=await n.select().from($e).where($r($e.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($e).set({status:"sending",updatedAt:new Date}).where($r($e.id,t)),o(`Sending announcement ${t} (${i.subject??""})`);let a=0,u=0,l=0,p=0,f=null;try{for(;;){let b=await n.select({userId:kt.userId,email:T.email,displayName:T.displayName,unsubscribeToken:kt.unsubscribeToken}).from(kt).innerJoin(T,$r(T.id,kt.userId)).where(Lq($r(kt.productAnnouncements,!0),qq(T.email),f?$q(kt.userId,f):void 0)).orderBy(Mq(kt.userId)).limit(LA);if(b.length===0)break;f=b[b.length-1].userId;for(let A=0;A<b.length;A+=MA){let E=b.slice(A,A+MA),S=await Promise.allSettled(E.map(R=>Fq({recipient:R,announcement:i,webBaseUrl:s,sendEmail:r,db:n})));for(let R=0;R<S.length;R++){let O=S[R];if(O.status==="fulfilled")O.value.ok==="sent"?a++:O.value.ok==="skipped"?l++:(u++,O.value.provider==="noop"&&p++,o(` recipient ${E[R].userId}: send failed \u2014 ${O.value.error}`));else{u++;let W=O.reason instanceof Error?O.reason.message:String(O.reason);o(` recipient ${E[R].userId}: send failed \u2014 ${W}`)}}}if(b.length<LA)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 _=await n.select({status:Rt.status,count:Uq`count(*)::int`}).from(Rt).where($r(Rt.announcementId,t)).groupBy(Rt.status),v={};for(let b of _)v[b.status]=b.count;let h=v.sent??0,m=v.failed??0,w=h===0&&m>0?"failed":"sent",I=m>0?`${m} of ${h+m} recipient(s) failed; see announcement_deliveries`:null;return await n.update($e).set({status:w,recipientCount:h,...w==="sent"?{sentAt:new Date}:{},error:I,updatedAt:new Date}).where($r($e.id,t)),o(`Done: status=${w} sent=${h} failed=${m} (this attempt: sent=${a} failed=${u} skipped=${l})`),{sent:a,failed:u,skipped:l}}catch(_){let v=_ instanceof Error?_.message:String(_);throw await n.update($e).set({status:"failed",error:v.slice(0,1e3),updatedAt:new Date}).where($r($e.id,t)).catch(()=>{}),_}}c(Hq,"runSend");function Bq(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}c(Bq,"escapeHtml");async function Fq(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(Rt).values({announcementId:n.id,userId:t.userId,email:t.email,status:"pending"}).onConflictDoNothing({target:[Rt.announcementId,Rt.userId]}).returning({id:Rt.id});if(i.length===0)return{ok:"skipped",reason:"already-claimed"};let a=i[0].id,u=r.replace(/\/$/,""),l=encodeURIComponent(t.unsubscribeToken),p=`${u}/unsubscribe/${l}`,f=t.displayName?.trim().split(/\s+/)[0]||"there",_=n.htmlBody.replaceAll("{{unsubscribe_url}}",p).replaceAll("{{recipient_name}}",Bq(f)),v=n.textBody.replaceAll("{{unsubscribe_url}}",p).replaceAll("{{recipient_name}}",f);try{let h=await o({to:t.email,subject:n.subject,html:_,text:v,fromName:"RuleMetric",idempotencyKey:a,headers:{"List-Unsubscribe":`<${u}/api/unsubscribe/${l}>`,"List-Unsubscribe-Post":"List-Unsubscribe=One-Click"}});if(h.provider==="noop"){let m="no email provider configured (RESEND_API_KEY unset on the API)";return await s.update(Rt).set({status:"failed",error:m}).where($r(Rt.id,a)),{ok:"failed",error:m,provider:h.provider}}return await s.update(Rt).set({status:"sent",providerId:h.id,sentAt:new Date}).where($r(Rt.id,a)),{ok:"sent",providerId:h.id,provider:h.provider}}catch(h){let m=h instanceof Error?h.message:String(h);return await s.update(Rt).set({status:"failed",error:m.slice(0,1e3)}).where($r(Rt.id,a)).catch(()=>{}),{ok:"failed",error:m}}}c(Fq,"sendOne");var qr=new Wq;qr.use("/announcements/*",Cu());qr.use("/announcements",Cu());qr.get("/announcements",async e=>{let t=await d.select({id:$e.id,version:$e.version,releaseDate:$e.releaseDate,subject:$e.subject,status:$e.status,recipientCount:$e.recipientCount,sentAt:$e.sentAt,sentBy:$e.sentBy,error:$e.error,createdAt:$e.createdAt,updatedAt:$e.updatedAt}).from($e).orderBy(zq($e.createdAt));return e.json({announcements:t})});qr.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 d.select().from($e).where(so($e.id,t));if(!n)return e.json({error:"Announcement not found",code:"NOT_FOUND"},404);let r=await d.select({status:Rt.status,count:BA`count(*)::int`}).from(Rt).where(so(Rt.announcementId,t)).groupBy(Rt.status),o={};for(let s of r)o[s.status]=s.count;return e.json({...n,deliveryCounts:o})});qr.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 Jq();return e.json({count:n})});async function Jq(){let[e]=await d.select({count:BA`count(*)::int`}).from(kt).innerJoin(T,so(T.id,kt.userId)).where(HA(so(kt.productAnnouncements,!0),Vq(T.email)));return e?.count??0}c(Jq,"countOptedInRecipients");var UA=c(e=>e.includes("{{unsubscribe_url}}"),"hasUnsubscribePlaceholder"),Kq=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()});qr.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=Kq.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($e).where(so($e.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($e).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(so($e.id,t)).returning();return e.json(i)});qr.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 d.update($e).set({status:"queued",sentBy:t,updatedAt:new Date}).where(HA(so($e.id,n),so($e.status,"draft"))).returning(),o=r[0],s=!1;if(r.length===0){let[i]=await d.select().from($e).where(so($e.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)}
1601
- `)}),e.json({processing:!0,resumed:s,announcement:o},202)});D();import{Hono as Gq}from"hono";import{inArray as WA,sql as FA}from"drizzle-orm";var Vu=new Gq;function zA(e){let t;try{t=decodeURIComponent(e)}catch{return[]}let n=t.replace(/=+$/,"").replaceAll("+","-").replaceAll("/","_");return t===n?[t]:[t,n]}c(zA,"tokenCandidates");Vu.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 d.select({productAnnouncements:kt.productAnnouncements,unsubscribedAt:kt.unsubscribedAt}).from(kt).where(WA(kt.unsubscribeToken,n)).limit(1);return r?e.json({valid:!0,alreadyUnsubscribed:r.productAnnouncements===!1}):e.json({error:"invalid_token"},404)});Vu.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 d.update(kt).set({productAnnouncements:!1,unsubscribedAt:FA`now()`,updatedAt:FA`now()`}).where(WA(kt.unsubscribeToken,n)).returning({userId:kt.userId})).length===0?e.json({error:"invalid_token"},404):e.json({ok:!0})});D();import{createHash as Yq}from"node:crypto";async function VA(){let e=[],t=0,n=0,r=0;for(let[o,s]of Object.entries($u)){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 u=await a.text(),l=Yq("sha256").update(u).digest("hex"),p=!0,f=[],_=null;try{f=i.parse(u)}catch(m){p=!1,_=m instanceof Error?m.message:String(m)}if((await d.insert(Dt).values({provider:o,docUrl:i.url,contentHash:l,content:u,parseSuccess:p,parseErrors:_?[_]:null}).onConflictDoNothing({target:[Dt.provider,Dt.docUrl,Dt.contentHash]}).returning({id:Dt.id})).length===1&&p){for(let m of f)await d.insert(ve).values({provider:o,plan:m.plan,limitType:m.limitType,value:String(m.value),unit:m.unit,comparator:m.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}}c(VA,"scrapeProviderDocs");var Xq=360*60*1e3,JA=!1;function KA(){if(JA)return{stop:c(()=>{},"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))},Xq);return{stop:c(()=>{clearTimeout(e),clearInterval(t)},"stop")}}c(KA,"startScrapeInterval");var V=new eU,oU=process.env.ALLOWED_ORIGINS?.split(",")??["http://localhost:5174","http://localhost:5175"];V.use("*",tU({origin:c(e=>e?oU.includes(e)?e:"":"*","origin"),allowMethods:["GET","POST","PUT","PATCH","DELETE","OPTIONS"],allowHeaders:["Authorization","Content-Type"],credentials:!0}));V.use("*",_m());V.use("*",pv());V.use("/api/*",nU({maxSize:10*1024*1024}));V.use("*",lv);V.use("/auth/login",Rc(900*1e3,10));var QA=Rc(60*1e3,10);V.use("/api/auth/api-keys",QA);V.use("/api/auth/api-keys/*",QA);V.use("/api/invitations/*",Rc(60*1e3,30));V.use("/api/telemetry/cli-error",Rc(60*1e3,60));V.route("/",vi);V.route("/api",Jd);V.route("/",yi);V.route("/",Mu);V.route("/api",Vd);V.route("/api",Jp);V.route("/",Gp);V.use("/api/*",av);V.use("/api/*",uv);V.use("/api/sessions/:id/context-snapshots",Nc);V.use("/api/sessions/:id/events",Nc);V.use("/api/sessions/import",Nc);V.use("/api/internal/research/observe",Nc);V.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():ov(e,t)});V.route("/api",Nn);V.route("/api",Mc);V.route("/api",$c);V.route("/api",qc);V.route("/api",Hc);V.route("/api",ol);V.route("/api",So);V.route("/api",jo);V.route("/api",lu);V.route("/api",Tr);V.route("/api",rp);V.route("/api",ra);V.route("/api",gu);V.route("/api",dp);V.route("/api",Jn);V.route("/api",fp);V.route("/api",Oo);V.route("/api",sa);V.route("/api",Os);V.route("/api",ca);V.route("/api",Cs);V.route("/api",ua);V.route("/api",Yr);V.route("/api",Ms);V.route("/api",fa);V.route("/api",Lo);V.route("/api",Ip);V.route("/api",Gn);V.route("/api",bn);V.route("/api",wa);V.route("/api",eo);V.route("/api",Bo);V.route("/api",xu);V.route("/api",ba);V.route("/api",Fo);V.route("/api",Or);V.route("/api",Js);V.route("/api",Go);V.route("/api/invitations",ju);V.route("/api",Ou);V.route("/api",En);V.route("/api",Vp);V.route("/api",Lu);V.route("/api",fr);V.route("/api",Hu);V.route("/api",Wu);V.route("/api",em);V.route("/api",tm);V.route("/api",Oa);V.route("/api",qr);V.route("/api/unsubscribe",Vu);V.route("/api",Kp);var sU=setTimeout(()=>{Pp().catch(()=>{})},5e3),iU=KA(),ZA=[{stop:c(()=>clearTimeout(sU),"stop")},iU],aU=Ca.dirname(Zq(import.meta.url)),P_=process.env.WEB_DIST_PATH??Ca.resolve(aU,"../../../apps/web/dist");if(Ju.existsSync(P_)){let e=c(async t=>{let n=Ca.join(P_,"index.html");if(!Ju.existsSync(n))return t.notFound();let{stampRuntimeConfig:r}=await Promise.resolve().then(()=>(XA(),YA));return t.html(r(Ju.readFileSync(n,"utf-8")))},"serveIndex");V.get("/",e),V.get("/index.html",e),V.use("/*",rU({root:P_,rewriteRequestPath:c(t=>t,"rewriteRequestPath")})),V.get("*",e)}V.onError(sv);D();import{sql as Ur}from"drizzle-orm";var cU=300*1e3,uU="reconciler: lease expired with attempts exhausted \u2014 agent likely crashed mid-run",dU="reconciler: in-flight row had no lease and attempts were exhausted \u2014 unclaimable and unswept until recovered",La=1,lU=["eval_jobs","insights_jobs","launch_jobs","session_send_jobs","agent_jobs"];function Ma(){return Ur.join(Object.entries(N_).map(([e,t])=>Ur`WHEN ${e} THEN ${t}::int`),Ur` `)}c(Ma,"maxAttemptsCase");async function pU(e){let t=await d.execute(Ur`
1602
- UPDATE ${Ur.raw(e)}
1604
+ `),d&&await HA(i.taskKind,t,n,"failed",s.data.error),e.json({ok:!0,requeued:!d,attempts:i.attempts})});O();import{Hono as Zq}from"hono";import{z as es}from"zod";import{and as JA,desc as eU,eq as ao,isNotNull as tU,sql as KA}from"drizzle-orm";O();import{and as zq,asc as Vq,eq as Ur,gt as Jq,isNotNull as Kq,sql as Gq}from"drizzle-orm";var BA=100,FA=10,cp=new Set;function WA(e){return cp.has(e)}c(WA,"isAnnouncementSendInFlight");async function zA(e,t={}){let n=t.db??u,r=t.sendEmail??Vm,o=t.log??(i=>process.stderr.write(`[announcement-sender] ${i}
1605
+ `)),s=t.webBaseUrl??process.env.RULEMETRIC_WEB_URL??process.env.WEB_URL??"https://rulemetric.com";if(cp.has(e))throw new Error(`Announcement ${e} send already in flight`);cp.add(e);try{return await Yq({announcementId:e,db:n,sendEmail:r,log:o,webBaseUrl:s})}finally{cp.delete(e)}}c(zA,"sendAnnouncement");async function Yq(e){let{announcementId:t,db:n,sendEmail:r,log:o,webBaseUrl:s}=e,[i]=await n.select().from($e).where(Ur($e.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($e).set({status:"sending",updatedAt:new Date}).where(Ur($e.id,t)),o(`Sending announcement ${t} (${i.subject??""})`);let a=0,d=0,l=0,m=0,p=null;try{for(;;){let E=await n.select({userId:kt.userId,email:R.email,displayName:R.displayName,unsubscribeToken:kt.unsubscribeToken}).from(kt).innerJoin(R,Ur(R.id,kt.userId)).where(zq(Ur(kt.productAnnouncements,!0),Kq(R.email),p?Jq(kt.userId,p):void 0)).orderBy(Vq(kt.userId)).limit(BA);if(E.length===0)break;p=E[E.length-1].userId;for(let A=0;A<E.length;A+=FA){let b=E.slice(A,A+FA),S=await Promise.allSettled(b.map(T=>Qq({recipient:T,announcement:i,webBaseUrl:s,sendEmail:r,db:n})));for(let T=0;T<S.length;T++){let P=S[T];if(P.status==="fulfilled")P.value.ok==="sent"?a++:P.value.ok==="skipped"?l++:(d++,P.value.provider==="noop"&&m++,o(` recipient ${b[T].userId}: send failed \u2014 ${P.value.error}`));else{d++;let H=P.reason instanceof Error?P.reason.message:String(P.reason);o(` recipient ${b[T].userId}: send failed \u2014 ${H}`)}}}if(E.length<BA)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:Tt.status,count:Gq`count(*)::int`}).from(Tt).where(Ur(Tt.announcementId,t)).groupBy(Tt.status),w={};for(let E of _)w[E.status]=E.count;let f=w.sent??0,h=w.failed??0,v=f===0&&h>0?"failed":"sent",I=h>0?`${h} of ${f+h} recipient(s) failed; see announcement_deliveries`:null;return await n.update($e).set({status:v,recipientCount:f,...v==="sent"?{sentAt:new Date}:{},error:I,updatedAt:new Date}).where(Ur($e.id,t)),o(`Done: status=${v} sent=${f} failed=${h} (this attempt: sent=${a} failed=${d} skipped=${l})`),{sent:a,failed:d,skipped:l}}catch(_){let w=_ instanceof Error?_.message:String(_);throw await n.update($e).set({status:"failed",error:w.slice(0,1e3),updatedAt:new Date}).where(Ur($e.id,t)).catch(()=>{}),_}}c(Yq,"runSend");function Xq(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}c(Xq,"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(Tt).values({announcementId:n.id,userId:t.userId,email:t.email,status:"pending"}).onConflictDoNothing({target:[Tt.announcementId,Tt.userId]}).returning({id:Tt.id});if(i.length===0)return{ok:"skipped",reason:"already-claimed"};let a=i[0].id,d=r.replace(/\/$/,""),l=encodeURIComponent(t.unsubscribeToken),m=`${d}/unsubscribe/${l}`,p=t.displayName?.trim().split(/\s+/)[0]||"there",_=n.htmlBody.replaceAll("{{unsubscribe_url}}",m).replaceAll("{{recipient_name}}",Xq(p)),w=n.textBody.replaceAll("{{unsubscribe_url}}",m).replaceAll("{{recipient_name}}",p);try{let f=await o({to:t.email,subject:n.subject,html:_,text:w,fromName:"RuleMetric",idempotencyKey:a,headers:{"List-Unsubscribe":`<${d}/api/unsubscribe/${l}>`,"List-Unsubscribe-Post":"List-Unsubscribe=One-Click"}});if(f.provider==="noop"){let h="no email provider configured (RESEND_API_KEY unset on the API)";return await s.update(Tt).set({status:"failed",error:h}).where(Ur(Tt.id,a)),{ok:"failed",error:h,provider:f.provider}}return await s.update(Tt).set({status:"sent",providerId:f.id,sentAt:new Date}).where(Ur(Tt.id,a)),{ok:"sent",providerId:f.id,provider:f.provider}}catch(f){let h=f instanceof Error?f.message:String(f);return await s.update(Tt).set({status:"failed",error:h.slice(0,1e3)}).where(Ur(Tt.id,a)).catch(()=>{}),{ok:"failed",error:h}}}c(Qq,"sendOne");var Hr=new Zq;Hr.use("/announcements/*",Hd());Hr.use("/announcements",Hd());Hr.get("/announcements",async e=>{let t=await u.select({id:$e.id,version:$e.version,releaseDate:$e.releaseDate,subject:$e.subject,status:$e.status,recipientCount:$e.recipientCount,sentAt:$e.sentAt,sentBy:$e.sentBy,error:$e.error,createdAt:$e.createdAt,updatedAt:$e.updatedAt}).from($e).orderBy(eU($e.createdAt));return e.json({announcements:t})});Hr.get("/announcements/:id",async e=>{let t=e.req.param("id");if(!es.string().uuid().safeParse(t).success)return e.json({error:"Invalid id",code:"VALIDATION_ERROR"},400);let[n]=await u.select().from($e).where(ao($e.id,t));if(!n)return e.json({error:"Announcement not found",code:"NOT_FOUND"},404);let r=await u.select({status:Tt.status,count:KA`count(*)::int`}).from(Tt).where(ao(Tt.announcementId,t)).groupBy(Tt.status),o={};for(let s of r)o[s.status]=s.count;return e.json({...n,deliveryCounts:o})});Hr.get("/announcements/:id/recipients/count",async e=>{let t=e.req.param("id");if(!es.string().uuid().safeParse(t).success)return e.json({error:"Invalid id",code:"VALIDATION_ERROR"},400);let n=await nU();return e.json({count:n})});async function nU(){let[e]=await u.select({count:KA`count(*)::int`}).from(kt).innerJoin(R,ao(R.id,kt.userId)).where(JA(ao(kt.productAnnouncements,!0),tU(R.email)));return e?.count??0}c(nU,"countOptedInRecipients");var VA=c(e=>e.includes("{{unsubscribe_url}}"),"hasUnsubscribePlaceholder"),rU=es.object({subject:es.string().min(1).max(500).optional(),htmlBody:es.string().min(1).refine(VA,{message:"htmlBody must contain the {{unsubscribe_url}} placeholder"}).optional(),textBody:es.string().min(1).refine(VA,{message:"textBody must contain the {{unsubscribe_url}} placeholder"}).optional()});Hr.patch("/announcements/:id",async e=>{let t=e.req.param("id");if(!es.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=rU.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($e).where(ao($e.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($e).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(ao($e.id,t)).returning();return e.json(i)});Hr.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(!es.string().uuid().safeParse(n).success)return e.json({error:"Invalid id",code:"VALIDATION_ERROR"},400);let r=await u.update($e).set({status:"queued",sentBy:t,updatedAt:new Date}).where(JA(ao($e.id,n),ao($e.status,"draft"))).returning(),o=r[0],s=!1;if(r.length===0){let[i]=await u.select().from($e).where(ao($e.id,n));if(!i)return e.json({error:"Announcement not found",code:"NOT_FOUND"},404);if(!((i.status==="queued"||i.status==="sending")&&!WA(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 zA(n).catch(i=>{process.stderr.write(`[announcements] send loop for ${n} failed: ${i instanceof Error?i.message:String(i)}
1606
+ `)}),e.json({processing:!0,resumed:s,announcement:o},202)});O();import{Hono as oU}from"hono";import{inArray as YA,sql as GA}from"drizzle-orm";var Qd=new oU;function XA(e){let t;try{t=decodeURIComponent(e)}catch{return[]}let n=t.replace(/=+$/,"").replaceAll("+","-").replaceAll("/","_");return t===n?[t]:[t,n]}c(XA,"tokenCandidates");Qd.get("/:token",async e=>{let t=e.req.param("token");if(!t||t.length<8)return e.json({error:"invalid_token"},404);let n=XA(t);if(n.length===0)return e.json({error:"invalid_token"},404);let[r]=await u.select({productAnnouncements:kt.productAnnouncements,unsubscribedAt:kt.unsubscribedAt}).from(kt).where(YA(kt.unsubscribeToken,n)).limit(1);return r?e.json({valid:!0,alreadyUnsubscribed:r.productAnnouncements===!1}):e.json({error:"invalid_token"},404)});Qd.post("/:token",async e=>{let t=e.req.param("token");if(!t||t.length<8)return e.json({error:"invalid_token"},404);let n=XA(t);return n.length===0?e.json({error:"invalid_token"},404):(await u.update(kt).set({productAnnouncements:!1,unsubscribedAt:GA`now()`,updatedAt:GA`now()`}).where(YA(kt.unsubscribeToken,n)).returning({userId:kt.userId})).length===0?e.json({error:"invalid_token"},404):e.json({ok:!0})});O();import{createHash as sU}from"node:crypto";async function QA(){let e=[],t=0,n=0,r=0;for(let[o,s]of Object.entries(Wd)){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 d=await a.text(),l=sU("sha256").update(d).digest("hex"),m=!0,p=[],_=null;try{p=i.parse(d)}catch(h){m=!1,_=h instanceof Error?h.message:String(h)}if((await u.insert(Dt).values({provider:o,docUrl:i.url,contentHash:l,content:d,parseSuccess:m,parseErrors:_?[_]:null}).onConflictDoNothing({target:[Dt.provider,Dt.docUrl,Dt.contentHash]}).returning({id:Dt.id})).length===1&&m){for(let h of p)await u.insert(ve).values({provider:o,plan:h.plan,limitType:h.limitType,value:String(h.value),unit:h.unit,comparator:h.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}}c(QA,"scrapeProviderDocs");var iU=360*60*1e3,ZA=!1;function eS(){if(ZA)return{stop:c(()=>{},"stop")};ZA=!0;let e=setTimeout(()=>{QA().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(()=>{QA().then(n=>{n.errors.length>0&&console.warn("[research] scrape completed with errors:",n)}).catch(n=>console.warn("[research] scrape failed:",n))},iU);return{stop:c(()=>{clearTimeout(e),clearInterval(t)},"stop")}}c(eS,"startScrapeInterval");var K=new dU,pU=process.env.ALLOWED_ORIGINS?.split(",")??["http://localhost:5174","http://localhost:5175"];K.use("*",uU({origin:c(e=>e?pU.includes(e)?e:"":"*","origin"),allowMethods:["GET","POST","PUT","PATCH","DELETE","OPTIONS"],allowHeaders:["Authorization","Content-Type"],credentials:!0}));K.use("*",Ep());K.use("*",Iv());K.use("/api/*",lU({maxSize:10*1024*1024}));K.use("*",vv);K.use("/auth/login",Tc(900*1e3,10));var oS=Tc(60*1e3,10);K.use("/api/auth/api-keys",oS);K.use("/api/auth/api-keys/*",oS);K.use("/api/invitations/*",Tc(60*1e3,30));K.use("/api/telemetry/cli-error",Tc(60*1e3,60));K.route("/",Ii);K.route("/api",Zu);K.route("/",wi);K.route("/",Fd);K.route("/api",Qu);K.route("/api",Zm);K.route("/",tp);K.use("/api/*",hv);K.use("/api/*",yv);K.use("/api/sessions/:id/context-snapshots",Nc);K.use("/api/sessions/:id/events",Nc);K.use("/api/sessions/import",Nc);K.use("/api/internal/research/observe",Nc);K.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():pv(e,t)});K.route("/api",Nn);K.route("/api",Mc);K.route("/api",$c);K.route("/api",qc);K.route("/api",Bc);K.route("/api",dl);K.route("/api",Ro);K.route("/api",Do);K.route("/api",pd);K.route("/api",Tr);K.route("/api",dm);K.route("/api",ra);K.route("/api",_d);K.route("/api",hm);K.route("/api",Kn);K.route("/api",vm);K.route("/api",Lo);K.route("/api",sa);K.route("/api",Cs);K.route("/api",ca);K.route("/api",Ls);K.route("/api",da);K.route("/api",Zr);K.route("/api",$s);K.route("/api",fa);K.route("/api",$o);K.route("/api",Rm);K.route("/api",Yn);K.route("/api",bn);K.route("/api",wa);K.route("/api",ro);K.route("/api",Wo);K.route("/api",Td);K.route("/api",ba);K.route("/api",zo);K.route("/api",Cr);K.route("/api",Ks);K.route("/api",Yo);K.route("/api/invitations",Md);K.route("/api",Ud);K.route("/api",En);K.route("/api",Qm);K.route("/api",Bd);K.route("/api",gr);K.route("/api",Jd);K.route("/api",Yd);K.route("/api",ip);K.route("/api",ap);K.route("/api",Oa);K.route("/api",Hr);K.route("/api/unsubscribe",Qd);K.route("/api",ep);var fU=setTimeout(()=>{$m().catch(()=>{})},5e3),gU=eS(),sS=[{stop:c(()=>clearTimeout(fU),"stop")},gU],hU=Ca.dirname(cU(import.meta.url)),H_=process.env.WEB_DIST_PATH??Ca.resolve(hU,"../../../apps/web/dist");if(Zd.existsSync(H_)){let e=c(async t=>{let n=Ca.join(H_,"index.html");if(!Zd.existsSync(n))return t.notFound();let{stampRuntimeConfig:r}=await Promise.resolve().then(()=>(rS(),nS));return t.html(r(Zd.readFileSync(n,"utf-8")))},"serveIndex");K.get("/",e),K.get("/index.html",e),K.use("/*",mU({root:H_,rewriteRequestPath:c(t=>t,"rewriteRequestPath")})),K.get("*",e)}K.onError(fv);O();import{sql as Br}from"drizzle-orm";var _U=300*1e3,yU="reconciler: lease expired with attempts exhausted \u2014 agent likely crashed mid-run",wU="reconciler: in-flight row had no lease and attempts were exhausted \u2014 unclaimable and unswept until recovered",La=1,vU=["eval_jobs","insights_jobs","launch_jobs","session_send_jobs","agent_jobs"];function Ma(){return Br.join(Object.entries(q_).map(([e,t])=>Br`WHEN ${e} THEN ${t}::int`),Br` `)}c(Ma,"maxAttemptsCase");async function IU(e){let t=await u.execute(Br`
1607
+ UPDATE ${Br.raw(e)}
1603
1608
  SET status = 'failed',
1604
- error = ${uU},
1609
+ error = ${yU},
1605
1610
  completed_at = now(),
1606
1611
  claimed_by = NULL,
1607
1612
  claimed_at = NULL,
@@ -1613,8 +1618,8 @@ end`;async function Ks(e){let t=e.req.param("teamId");if(!t||!to.test(t))return{
1613
1618
  AND attempts >= (CASE task_kind ${Ma()} ELSE 3 END)
1614
1619
  AND lease_recoveries >= ${La}
1615
1620
  RETURNING id
1616
- `),n=await d.execute(Ur`
1617
- UPDATE ${Ur.raw(e)}
1621
+ `),n=await u.execute(Br`
1622
+ UPDATE ${Br.raw(e)}
1618
1623
  SET status = 'pending',
1619
1624
  attempts = GREATEST(attempts - 1, 0),
1620
1625
  lease_recoveries = lease_recoveries + 1,
@@ -1626,8 +1631,8 @@ end`;async function Ks(e){let t=e.req.param("teamId");if(!t||!to.test(t))return{
1626
1631
  AND claimed_by IS NOT NULL
1627
1632
  AND lease_expires_at < now()
1628
1633
  RETURNING id
1629
- `),r=await d.execute(Ur`
1630
- UPDATE ${Ur.raw(e)}
1634
+ `),r=await u.execute(Br`
1635
+ UPDATE ${Br.raw(e)}
1631
1636
  SET status = CASE
1632
1637
  WHEN attempts >= (CASE task_kind ${Ma()} ELSE 3 END)
1633
1638
  AND lease_recoveries >= ${La} THEN 'failed'
@@ -1645,7 +1650,7 @@ end`;async function Ks(e){let t=e.req.param("teamId");if(!t||!to.test(t))return{
1645
1650
  END,
1646
1651
  error = CASE
1647
1652
  WHEN attempts >= (CASE task_kind ${Ma()} ELSE 3 END)
1648
- AND lease_recoveries >= ${La} THEN ${dU}
1653
+ AND lease_recoveries >= ${La} THEN ${wU}
1649
1654
  ELSE error
1650
1655
  END,
1651
1656
  completed_at = CASE
@@ -1660,7 +1665,7 @@ end`;async function Ks(e){let t=e.req.param("teamId");if(!t||!to.test(t))return{
1660
1665
  AND claimed_by IS NULL
1661
1666
  AND updated_at < now() - interval '15 minutes'
1662
1667
  RETURNING id
1663
- `);return t.length+n.length+r.length}c(pU,"reclaimExpiredLeases");async function mU(){return(await d.execute(Ur`
1668
+ `);return t.length+n.length+r.length}c(IU,"reclaimExpiredLeases");async function bU(){return(await u.execute(Br`
1664
1669
  UPDATE memory_experiments me
1665
1670
  SET status = 'failed',
1666
1671
  error = 'reconciler: worker died mid-experiment (backing job terminal, row left running)',
@@ -1673,12 +1678,12 @@ end`;async function Ks(e){let t=e.req.param("teamId");if(!t||!to.test(t))return{
1673
1678
  AND aj.status IN ('failed', 'completed')
1674
1679
  )
1675
1680
  RETURNING me.id
1676
- `)).length}c(mU,"failStrandedMemoryExperiments");function eS(){let e=setTimeout(()=>{n()},3e4),t=setInterval(()=>{n()},cU);async function n(){try{let r=[];for(let o of lU)try{let s=await pU(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 mU();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 c(n,"runOnce"),{stop(){clearTimeout(e),clearInterval(t)}}}c(eS,"startReconciler");D();import{and as gU,eq as O_,sql as rm}from"drizzle-orm";D();import{and as tS,eq as D_,inArray as fU,sql as nS}from"drizzle-orm";async function rS(e,t){let n=new Map;if(t.length===0)return n;let r=t.map(f=>f.id),o=new Map(t.map(f=>[f.id,f.version])),i=(await d.select({id:y.id,projectId:y.projectId,outcome:nS`${y.analysis}->>'outcome'`}).from(y).where(tS(D_(y.userId,e),nS`${y.analysis} is not null`)).orderBy(y.id)).map(f=>({id:f.id,key:f.projectId??"(no-project)",score:ys(f.outcome)})).filter(f=>f.score!=null),a=await d.select({sessionId:ne.sessionId,treatmentId:ne.treatmentId,treatmentVersion:ne.treatmentVersion}).from(ne).where(tS(D_(ne.userId,e),D_(ne.treatmentType,"memory"),fU(ne.treatmentId,r))),u=new Map,l=new Map;for(let f of a){let _=f.treatmentVersion===o.get(f.treatmentId)?u:l,v=_.get(f.treatmentId);v||(v=new Set,_.set(f.treatmentId,v)),v.add(f.sessionId)}let p=c(f=>{let _=u.get(f);if(!_||_.size===0)return"insufficient";let v=l.get(f),h=new Map;for(let m of i){if(v?.has(m.id)&&!_.has(m.id))continue;let w=h.get(m.key);w||(w={key:m.key,withScores:[],withoutScores:[]},h.set(m.key,w)),(_.has(m.id)?w.withScores:w.withoutScores).push(m.score)}return _s(Pn([...h.values()],{iterations:1e3}))},"effectOf");for(let f of t)n.set(f.id,p(f.id));return n}c(rS,"computeTrustClasses");var hU=1800*1e3;async function _U(e,t){if(t.length===0)return;let n=rm.join(t.map(r=>rm`(${r.id}::uuid, ${r.trustClass}::text, ${r.version}::int)`),rm`, `);await d.execute(rm`
1681
+ `)).length}c(bU,"failStrandedMemoryExperiments");function iS(){let e=setTimeout(()=>{n()},3e4),t=setInterval(()=>{n()},_U);async function n(){try{let r=[];for(let o of vU)try{let s=await IU(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 bU();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 c(n,"runOnce"),{stop(){clearTimeout(e),clearInterval(t)}}}c(iS,"startReconciler");O();import{and as AU,eq as F_,sql as dp}from"drizzle-orm";O();import{and as aS,eq as B_,inArray as EU,sql as cS}from"drizzle-orm";async function dS(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 u.select({id:y.id,projectId:y.projectId,outcome:cS`${y.analysis}->>'outcome'`}).from(y).where(aS(B_(y.userId,e),cS`${y.analysis} is not null`)).orderBy(y.id)).map(p=>({id:p.id,key:p.projectId??"(no-project)",score:ws(p.outcome)})).filter(p=>p.score!=null),a=await u.select({sessionId:ne.sessionId,treatmentId:ne.treatmentId,treatmentVersion:ne.treatmentVersion}).from(ne).where(aS(B_(ne.userId,e),B_(ne.treatmentType,"memory"),EU(ne.treatmentId,r))),d=new Map,l=new Map;for(let p of a){let _=p.treatmentVersion===o.get(p.treatmentId)?d:l,w=_.get(p.treatmentId);w||(w=new Set,_.set(p.treatmentId,w)),w.add(p.sessionId)}let m=c(p=>{let _=d.get(p);if(!_||_.size===0)return"insufficient";let w=l.get(p),f=new Map;for(let h of i){if(w?.has(h.id)&&!_.has(h.id))continue;let v=f.get(h.key);v||(v={key:h.key,withScores:[],withoutScores:[]},f.set(h.key,v)),(_.has(h.id)?v.withScores:v.withoutScores).push(h.score)}return ys(Pn([...f.values()],{iterations:1e3}))},"effectOf");for(let p of t)n.set(p.id,m(p.id));return n}c(dS,"computeTrustClasses");var SU=1800*1e3;async function xU(e,t){if(t.length===0)return;let n=dp.join(t.map(r=>dp`(${r.id}::uuid, ${r.trustClass}::text, ${r.version}::int)`),dp`, `);await u.execute(dp`
1677
1682
  update memories m
1678
1683
  set trust_class = v.cls, trust_version = v.ver, trust_computed_at = now()
1679
1684
  from (values ${n}) as v(id, cls, ver)
1680
1685
  where m.id = v.id and m.user_id = ${e}
1681
- `)}c(_U,"applyMaterializedTrust");async function yU(e){let t=await d.select({id:F.id,version:F.version}).from(F).where(gU(O_(F.userId,e),O_(F.status,"active")));if(t.length===0)return 0;let n=await rS(e,t),r=t.map(o=>({id:o.id,trustClass:n.get(o.id)??"insufficient",version:o.version}));return await _U(e,r),r.length}c(yU,"refreshMemoryTrustForUser");async function wU(){let e=await d.selectDistinct({userId:F.userId}).from(F).where(O_(F.status,"active")),t=0;for(let{userId:n}of e)try{t+=await yU(n)}catch(r){console.error(`[memory-trust-refresh] user ${n} failed:`,r instanceof Error?r.stack:r)}return{users:e.length,memories:t}}c(wU,"refreshAllMemoryTrust");function oS(){let e=setTimeout(()=>void n(),45e3),t=setInterval(()=>void n(),hU);async function n(){try{let{users:r,memories:o}=await wU();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 c(n,"runOnce"),{stop(){clearTimeout(e),clearInterval(t)}}}c(oS,"startMemoryTrustRefresh");D();import{sql as vU}from"drizzle-orm";var IU=30*6e4,sS=24,bU=6,iS="pipeline:usage_observations_stale";async function EU(){let e=await d.execute(vU`
1686
+ `)}c(xU,"applyMaterializedTrust");async function RU(e){let t=await u.select({id:W.id,version:W.version}).from(W).where(AU(F_(W.userId,e),F_(W.status,"active")));if(t.length===0)return 0;let n=await dS(e,t),r=t.map(o=>({id:o.id,trustClass:n.get(o.id)??"insufficient",version:o.version}));return await xU(e,r),r.length}c(RU,"refreshMemoryTrustForUser");async function TU(){let e=await u.selectDistinct({userId:W.userId}).from(W).where(F_(W.status,"active")),t=0;for(let{userId:n}of e)try{t+=await RU(n)}catch(r){console.error(`[memory-trust-refresh] user ${n} failed:`,r instanceof Error?r.stack:r)}return{users:e.length,memories:t}}c(TU,"refreshAllMemoryTrust");function uS(){let e=setTimeout(()=>void n(),45e3),t=setInterval(()=>void n(),SU);async function n(){try{let{users:r,memories:o}=await TU();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 c(n,"runOnce"),{stop(){clearTimeout(e),clearInterval(t)}}}c(uS,"startMemoryTrustRefresh");O();import{sql as kU}from"drizzle-orm";var NU=30*6e4,lS=24,jU=6,mS="pipeline:usage_observations_stale";async function PU(){let e=await u.execute(kU`
1682
1687
  WITH active_users AS (
1683
1688
  SELECT user_id, count(*) AS sessions_24h
1684
1689
  FROM sessions
@@ -1709,13 +1714,13 @@ end`;async function Ks(e){let t=e.req.param("teamId");if(!t||!to.test(t))return{
1709
1714
  LEFT JOIN latest_obs o ON o.user_id = a.user_id
1710
1715
  LEFT JOIN first_seen f ON f.user_id = a.user_id
1711
1716
  WHERE (o.last_observed IS NULL
1712
- AND f.first_session < now() - make_interval(hours => ${sS}))
1713
- OR o.last_observed < now() - make_interval(hours => ${sS})
1717
+ AND f.first_session < now() - make_interval(hours => ${lS}))
1718
+ OR o.last_observed < now() - make_interval(hours => ${lS})
1714
1719
  )
1715
1720
  INSERT INTO alert_dispatches (user_id, alert_key, severity, channel, last_state)
1716
1721
  SELECT
1717
1722
  s.user_id,
1718
- ${iS},
1723
+ ${mS},
1719
1724
  'soft',
1720
1725
  'in_app',
1721
1726
  jsonb_build_object(
@@ -1732,11 +1737,11 @@ end`;async function Ks(e){let t=e.req.param("teamId");if(!t||!to.test(t))return{
1732
1737
  WHERE NOT EXISTS (
1733
1738
  SELECT 1 FROM alert_dispatches d
1734
1739
  WHERE d.user_id = s.user_id
1735
- AND d.alert_key = ${iS}
1736
- AND d.last_dispatched_at > now() - make_interval(hours => ${bU})
1740
+ AND d.alert_key = ${mS}
1741
+ AND d.last_dispatched_at > now() - make_interval(hours => ${jU})
1737
1742
  )
1738
1743
  RETURNING user_id, id, last_state->>'message' AS message
1739
- `);e.length>0&&console.log(`[usage-staleness] dispatched stale-pipeline alert for ${e.length} user(s)`);for(let t of e)try{await ja({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}c(EU,"checkUsageStalenessOnce");function aS(){let e=setTimeout(()=>{n()},6e4),t=setInterval(()=>{n()},IU);async function n(){try{await EU()}catch(r){console.error("[usage-staleness] check failed:",r instanceof Error?r.stack:r)}}return c(n,"runOnce"),{stop:c(()=>{clearTimeout(e),clearInterval(t)},"stop")}}c(aS,"startUsageStalenessChecker");D();import{sql as AU}from"drizzle-orm";var SU=30*6e4,om=24,xU=6,cS="pipeline:session_capture_stale";async function TU(){let e=await d.execute(AU`
1744
+ `);e.length>0&&console.log(`[usage-staleness] dispatched stale-pipeline alert for ${e.length} user(s)`);for(let t of e)try{await ja({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}c(PU,"checkUsageStalenessOnce");function pS(){let e=setTimeout(()=>{n()},6e4),t=setInterval(()=>{n()},NU);async function n(){try{await PU()}catch(r){console.error("[usage-staleness] check failed:",r instanceof Error?r.stack:r)}}return c(n,"runOnce"),{stop:c(()=>{clearTimeout(e),clearInterval(t)},"stop")}}c(pS,"startUsageStalenessChecker");O();import{sql as DU}from"drizzle-orm";var OU=30*6e4,up=24,CU=6,fS="pipeline:session_capture_stale";async function LU(){let e=await u.execute(DU`
1740
1745
  WITH active_users AS (
1741
1746
  SELECT user_id, max(last_seen) AS last_observed,
1742
1747
  array_agg(DISTINCT signal) AS signals
@@ -1746,13 +1751,13 @@ end`;async function Ks(e){let t=e.req.param("teamId");if(!t||!to.test(t))return{
1746
1751
  FROM limit_observations
1747
1752
  WHERE source_type = 'oauth_usage'
1748
1753
  AND user_id IS NOT NULL
1749
- AND observed_at > now() - make_interval(hours => ${om})
1754
+ AND observed_at > now() - make_interval(hours => ${up})
1750
1755
  GROUP BY user_id
1751
1756
  UNION ALL
1752
1757
  SELECT user_id, max(last_heartbeat), 'worker heartbeat'
1753
1758
  FROM worker_connections
1754
1759
  WHERE worker_type = 'cli-worker'
1755
- AND last_heartbeat > now() - make_interval(hours => ${om})
1760
+ AND last_heartbeat > now() - make_interval(hours => ${up})
1756
1761
  GROUP BY user_id
1757
1762
  UNION ALL
1758
1763
  -- Beacons are unauthenticated (no user_id); attribute via the most
@@ -1768,7 +1773,7 @@ end`;async function Ks(e){let t=e.req.param("teamId");if(!t||!to.test(t))return{
1768
1773
  ) owner ON true
1769
1774
  WHERE e.event = 'hook_capture_failed'
1770
1775
  AND e.device_id IS NOT NULL
1771
- AND e.created_at > now() - make_interval(hours => ${om})
1776
+ AND e.created_at > now() - make_interval(hours => ${up})
1772
1777
  GROUP BY owner.user_id
1773
1778
  ) signal_union
1774
1779
  GROUP BY user_id
@@ -1787,12 +1792,12 @@ end`;async function Ks(e){let t=e.req.param("teamId");if(!t||!to.test(t))return{
1787
1792
  FROM active_users a
1788
1793
  LEFT JOIN latest_session s ON s.user_id = a.user_id
1789
1794
  WHERE s.last_session IS NULL
1790
- OR s.last_session < now() - make_interval(hours => ${om})
1795
+ OR s.last_session < now() - make_interval(hours => ${up})
1791
1796
  )
1792
1797
  INSERT INTO alert_dispatches (user_id, alert_key, severity, channel, last_state)
1793
1798
  SELECT
1794
1799
  s.user_id,
1795
- ${cS},
1800
+ ${fS},
1796
1801
  'soft',
1797
1802
  'in_app',
1798
1803
  jsonb_build_object(
@@ -1811,11 +1816,11 @@ end`;async function Ks(e){let t=e.req.param("teamId");if(!t||!to.test(t))return{
1811
1816
  WHERE NOT EXISTS (
1812
1817
  SELECT 1 FROM alert_dispatches d
1813
1818
  WHERE d.user_id = s.user_id
1814
- AND d.alert_key = ${cS}
1815
- AND d.last_dispatched_at > now() - make_interval(hours => ${xU})
1819
+ AND d.alert_key = ${fS}
1820
+ AND d.last_dispatched_at > now() - make_interval(hours => ${CU})
1816
1821
  )
1817
1822
  RETURNING user_id, id, last_state->>'message' AS message
1818
- `);e.length>0&&console.log(`[capture-staleness] dispatched stale-capture alert for ${e.length} user(s)`);for(let t of e)try{await ja({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}c(TU,"checkCaptureStalenessOnce");function uS(){let e=setTimeout(()=>{n()},9e4),t=setInterval(()=>{n()},SU);async function n(){try{await TU()}catch(r){console.error("[capture-staleness] check failed:",r instanceof Error?r.stack:r)}}return c(n,"runOnce"),{stop:c(()=>{clearTimeout(e),clearInterval(t)},"stop")}}c(uS,"startCaptureStalenessChecker");D();import{sql as dS}from"drizzle-orm";var RU=900*1e3,lS=6,pS=60,kU=dS`array['user_message','tool_call','tool_result']`;async function NU(){return[...await d.execute(dS`
1823
+ `);e.length>0&&console.log(`[capture-staleness] dispatched stale-capture alert for ${e.length} user(s)`);for(let t of e)try{await ja({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}c(LU,"checkCaptureStalenessOnce");function gS(){let e=setTimeout(()=>{n()},9e4),t=setInterval(()=>{n()},OU);async function n(){try{await LU()}catch(r){console.error("[capture-staleness] check failed:",r instanceof Error?r.stack:r)}}return c(n,"runOnce"),{stop:c(()=>{clearTimeout(e),clearInterval(t)},"stop")}}c(gS,"startCaptureStalenessChecker");O();import{sql as hS}from"drizzle-orm";var MU=900*1e3,_S=6,yS=60,$U=hS`array['user_message','tool_call','tool_result']`;async function qU(){return[...await u.execute(hS`
1819
1824
  WITH session_stats AS (
1820
1825
  SELECT s.id,
1821
1826
  s.external_session_id,
@@ -1823,10 +1828,10 @@ end`;async function Ks(e){let t=e.req.param("teamId");if(!t||!to.test(t))return{
1823
1828
  (
1824
1829
  SELECT MAX(timestamp) FROM session_events e
1825
1830
  WHERE e.session_id = s.id
1826
- AND e.event_type = ANY(${kU})
1831
+ AND e.event_type = ANY(${$U})
1827
1832
  ) AS last_hook_event
1828
1833
  FROM sessions s
1829
- WHERE s.started_at > now() - (${lS}::int * interval '1 hour')
1834
+ WHERE s.started_at > now() - (${_S}::int * interval '1 hour')
1830
1835
  )
1831
1836
  SELECT ss.id AS "sessionId",
1832
1837
  ss.external_session_id AS "externalSessionId",
@@ -1837,8 +1842,8 @@ end`;async function Ks(e){let t=e.req.param("teamId");if(!t||!to.test(t))return{
1837
1842
  FROM session_stats ss
1838
1843
  JOIN context_snapshots cs ON cs.session_id = ss.id
1839
1844
  WHERE ss.last_hook_event IS NOT NULL
1840
- AND cs.captured_at > ss.last_hook_event + (${pS}::int * interval '1 second')
1845
+ AND cs.captured_at > ss.last_hook_event + (${yS}::int * interval '1 second')
1841
1846
  GROUP BY ss.id, ss.external_session_id, ss.tool
1842
1847
  HAVING COUNT(cs.id) > 0
1843
- `)]}c(NU,"auditPollutionOnce");function mS(){let e=setTimeout(()=>{n()},6e4),t=setInterval(()=>{n()},RU);async function n(){try{let r=await NU();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=${lS}h, grace=${pS}s)`)}catch(r){console.error("[pollution-auditor] pass failed:",r instanceof Error?r.stack:r)}}return c(n,"runOnce"),{stop(){clearTimeout(e),clearInterval(t)}}}c(mS,"startPollutionAuditor");D();var DU=im.dirname(jU(import.meta.url)),fS=im.resolve(DU,"../../../.env.local");if(sm.existsSync(fS))for(let e of sm.readFileSync(fS,"utf-8").split(`
1844
- `)){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 OU=wm({serviceName:"rulemetric-api"});OU?console.log("[sentry] error capture enabled"):process.env.NODE_ENV==="production"&&console.log("[sentry] no SENTRY_DSN \u2014 error capture disabled");var C_=mm({serviceName:"rulemetric-api"});console.log(C_==="otlp"?`[otel] traces exporting to ${process.env.OTEL_EXPORTER_OTLP_ENDPOINT}`:C_==="console"?"[otel] traces printing to stdout (set OTEL_EXPORTER_OTLP_ENDPOINT to ship to a backend)":C_==="silent"?"[otel] traces enabled, span export OFF (OTEL_SPAN_EXPORT=none \u2014 no stdout span dump)":"[otel] disabled (TELEMETRY_ENABLED=false)");var CU=new Set(["CONNECT_TIMEOUT","ETIMEDOUT","ENOTFOUND","ECONNRESET","ECONNREFUSED","EAI_AGAIN","EPIPE"]);process.on("unhandledRejection",e=>{let t=_i(e);console.error(`[guard] unhandledRejection${t?` code=${t}`:""}: ${e instanceof Error?e.message:String(e)}`),hr(e,{tags:{source:"unhandledRejection",code:t??"unknown"}})});process.on("uncaughtException",e=>{let t=_i(e);if(t&&CU.has(t)){console.error(`[guard] uncaughtException (transient net code=${t}) \u2014 surviving: ${e.message}`),hr(e,{tags:{source:"uncaughtException",code:t}});return}console.error("[guard] uncaughtException (fatal):",e),hr(e,{tags:{source:"uncaughtException",code:t??"unknown"}}),Promise.allSettled([Wa(2e3),Ec()]).finally(()=>process.exit(1))});var L_=Number(process.env.API_PORT)||3e3;console.log(`RuleMetric API starting on port ${L_}`);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=Ff();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 hS,es=[],gS=!1;async function LU(){let e=PU({fetch:V.fetch,hostname:"0.0.0.0",port:L_});hS=e,e.keepAliveTimeout=65e3,e.headersTimeout=66e3,console.log(`RuleMetric API running at http://localhost:${L_} (keepAliveTimeout=65s)`),tv().then(t=>console.log(`[auth] JWKS prime ${t?"ok":"deferred (will fetch on first auth)"}`)),es.push(eS()),es.push(oS()),Pl()&&kI(),Qp()&&_A(),es.push(aS()),es.push(uS()),es.push(hv()),es.push(mS()),es.push(...ZA)}c(LU,"start");LU().catch(e=>{console.error("Failed to start API:",e),hr(e,{tags:{phase:"boot",source:"start"}}),Promise.allSettled([Wa(2e3),Ec()]).finally(()=>process.exit(1))});async function _S(){if(!gS){gS=!0;for(let e of es)try{e.stop()}catch{}try{hS?.close?.()}catch{}try{await NI(5e3)}catch{}try{await yA(5e3)}catch{}await Promise.allSettled([fm(),Wa(2e3),Ec()]),process.exit(0)}}c(_S,"gracefulShutdown");process.on("SIGTERM",_S);process.on("SIGINT",_S);
1848
+ `)]}c(qU,"auditPollutionOnce");function wS(){let e=setTimeout(()=>{n()},6e4),t=setInterval(()=>{n()},MU);async function n(){try{let r=await qU();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=${_S}h, grace=${yS}s)`)}catch(r){console.error("[pollution-auditor] pass failed:",r instanceof Error?r.stack:r)}}return c(n,"runOnce"),{stop(){clearTimeout(e),clearInterval(t)}}}c(wS,"startPollutionAuditor");O();var BU=mp.dirname(UU(import.meta.url)),vS=mp.resolve(BU,"../../../.env.local");if(lp.existsSync(vS))for(let e of lp.readFileSync(vS,"utf-8").split(`
1849
+ `)){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 FU=Sp({serviceName:"rulemetric-api"});FU?console.log("[sentry] error capture enabled"):process.env.NODE_ENV==="production"&&console.log("[sentry] no SENTRY_DSN \u2014 error capture disabled");var W_=wp({serviceName:"rulemetric-api"});console.log(W_==="otlp"?`[otel] traces exporting to ${process.env.OTEL_EXPORTER_OTLP_ENDPOINT}`:W_==="console"?"[otel] traces printing to stdout (set OTEL_EXPORTER_OTLP_ENDPOINT to ship to a backend)":W_==="silent"?"[otel] traces enabled, span export OFF (OTEL_SPAN_EXPORT=none \u2014 no stdout span dump)":"[otel] disabled (TELEMETRY_ENABLED=false)");var WU=new Set(["CONNECT_TIMEOUT","ETIMEDOUT","ENOTFOUND","ECONNRESET","ECONNREFUSED","EAI_AGAIN","EPIPE"]);process.on("unhandledRejection",e=>{let t=yi(e);console.error(`[guard] unhandledRejection${t?` code=${t}`:""}: ${e instanceof Error?e.message:String(e)}`),_r(e,{tags:{source:"unhandledRejection",code:t??"unknown"}})});process.on("uncaughtException",e=>{let t=yi(e);if(t&&WU.has(t)){console.error(`[guard] uncaughtException (transient net code=${t}) \u2014 surviving: ${e.message}`),_r(e,{tags:{source:"uncaughtException",code:t}});return}console.error("[guard] uncaughtException (fatal):",e),_r(e,{tags:{source:"uncaughtException",code:t??"unknown"}}),Promise.allSettled([Wa(2e3),Ec()]).finally(()=>process.exit(1))});var z_=Number(process.env.API_PORT)||3e3;console.log(`RuleMetric API starting on port ${z_}`);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=Gf();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 bS,ts=[],IS=!1;async function zU(){let e=HU({fetch:K.fetch,hostname:"0.0.0.0",port:z_});bS=e,e.keepAliveTimeout=65e3,e.headersTimeout=66e3,console.log(`RuleMetric API running at http://localhost:${z_} (keepAliveTimeout=65s)`),uv().then(t=>console.log(`[auth] JWKS prime ${t?"ok":"deferred (will fetch on first auth)"}`)),ts.push(iS()),ts.push(uS()),$l()&&$I(),op()&&EA(),ts.push(pS()),ts.push(gS()),ts.push(Sv()),ts.push(wS()),ts.push(...sS)}c(zU,"start");zU().catch(e=>{console.error("Failed to start API:",e),_r(e,{tags:{phase:"boot",source:"start"}}),Promise.allSettled([Wa(2e3),Ec()]).finally(()=>process.exit(1))});async function ES(){if(!IS){IS=!0;for(let e of ts)try{e.stop()}catch{}try{bS?.close?.()}catch{}try{await qI(5e3)}catch{}try{await AA(5e3)}catch{}await Promise.allSettled([vp(),Wa(2e3),Ec()]),process.exit(0)}}c(ES,"gracefulShutdown");process.on("SIGTERM",ES);process.on("SIGINT",ES);