@rulemetric/local 0.12.4 → 0.12.5

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 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`
1
+ var ry=Object.defineProperty;var c=(e,t)=>ry(e,"name",{value:t,configurable:!0}),Im=(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)ry(e,n,{get:t[n],enumerable:!0})};import{pgTable as uu,text as ti,timestamp as Ja,jsonb as ay,uuid as ss,primaryKey as cy}from"drizzle-orm/pg-core";var X,Q,ee,we,is=Y(()=>{"use strict";X=uu("organizations",{id:ss("id").primaryKey().defaultRandom(),name:ti("name").unique().notNull(),slug:ti("slug").unique().notNull(),metadata:ay("metadata"),createdAt:Ja("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Ja("updated_at",{withTimezone:!0}).defaultNow()}),Q=uu("teams",{id:ss("id").primaryKey().defaultRandom(),orgId:ss("org_id").references(()=>X.id,{onDelete:"cascade"}),name:ti("name").notNull(),slug:ti("slug").notNull(),metadata:ay("metadata"),createdAt:Ja("created_at",{withTimezone:!0}).defaultNow()}),ee=uu("user_organizations",{userId:ss("user_id").notNull(),orgId:ss("org_id").references(()=>X.id,{onDelete:"cascade"}).notNull(),role:ti("role").notNull().default("member"),createdAt:Ja("created_at",{withTimezone:!0}).defaultNow()},e=>[cy({columns:[e.userId,e.orgId]})]),we=uu("user_teams",{userId:ss("user_id").notNull(),teamId:ss("team_id").references(()=>Q.id,{onDelete:"cascade"}).notNull(),role:ti("role").notNull().default("member"),createdAt:Ja("created_at",{withTimezone:!0}).defaultNow()},e=>[cy({columns:[e.userId,e.teamId]})])});import{boolean as lu,integer as Ka,pgTable as YS,real as dy,text as pu,timestamp as km,uuid as uy}from"drizzle-orm/pg-core";var R,Xt=Y(()=>{"use strict";is();R=YS("profiles",{id:uy("id").primaryKey(),email:pu("email"),displayName:pu("display_name"),activeOrgId:uy("active_org_id").references(()=>X.id,{onDelete:"set null"}),isSuperadmin:lu("is_superadmin").notNull().default(!1),claudeCodePlan:pu("claude_code_plan"),planSource:pu("plan_source").notNull().default("detected"),setupCompletedAt:km("setup_completed_at",{withTimezone:!0}),liveSendSkipped:lu("live_send_skipped").notNull().default(!1),autoAcceptSuggestions:lu("auto_accept_suggestions").notNull().default(!0),evolutionPaused:lu("evolution_paused").notNull().default(!1),suggestionConfidenceThreshold:dy("suggestion_confidence_threshold").notNull().default(.7),autoAcceptMinScore:dy("auto_accept_min_score"),autoAcceptMaxPerRun:Ka("auto_accept_max_per_run"),autoAcceptMaxPerWindow:Ka("auto_accept_max_per_window"),autoAcceptWindowDays:Ka("auto_accept_window_days"),trialMaxConcurrent:Ka("trial_max_concurrent"),trialMaxPerRun:Ka("trial_max_per_run"),createdAt:km("created_at",{withTimezone:!0}).defaultNow(),updatedAt:km("updated_at",{withTimezone:!0}).defaultNow()})});import{pgTable as XS,text as jm,timestamp as mu,uuid as fu,index as ly}from"drizzle-orm/pg-core";var se,py=Y(()=>{"use strict";is();Xt();se=XS("org_invitations",{id:fu("id").primaryKey().defaultRandom(),orgId:fu("org_id").notNull().references(()=>X.id,{onDelete:"cascade"}),email:jm("email").notNull(),role:jm("role").notNull().default("member"),teamId:fu("team_id").references(()=>Q.id,{onDelete:"set null"}),invitedBy:fu("invited_by").notNull().references(()=>R.id,{onDelete:"cascade"}),token:jm("token").notNull().unique(),expiresAt:mu("expires_at",{withTimezone:!0}).notNull(),acceptedAt:mu("accepted_at",{withTimezone:!0}),revokedAt:mu("revoked_at",{withTimezone:!0}),createdAt:mu("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[ly("idx_org_invitations_token").on(e.token),ly("idx_org_invitations_org").on(e.orgId)])});import{pgTable as Nm,text as en,timestamp as po,jsonb as gu,uuid as wr,integer as hu,boolean as QS,uniqueIndex as _u,index as Ga}from"drizzle-orm/pg-core";var g,vr,xe,xn=Y(()=>{"use strict";g=Nm("instructions",{id:wr("id").primaryKey().defaultRandom(),name:en("name").notNull(),description:en("description").notNull(),type:en("type").notNull().default("instruction"),scope:en("scope").notNull(),scopeRef:wr("scope_ref"),version:en("version").notNull(),content:en("content").notNull(),frontmatter:gu("frontmatter").notNull(),slots:gu("slots"),tags:en("tags").array(),compatibility:en("compatibility").array(),createdBy:wr("created_by"),createdAt:po("created_at",{withTimezone:!0}).defaultNow(),updatedAt:po("updated_at",{withTimezone:!0}).defaultNow(),archived:QS("archived").default(!1),archivedAt:po("archived_at",{withTimezone:!0}),archivedBy:wr("archived_by"),forkedFromId:wr("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:hu("scan_score"),scanFindings:gu("scan_findings"),popularityScore:hu("popularity_score"),sourceUpdatedAt:po("source_updated_at",{withTimezone:!0})},e=>[_u("instructions_name_scope_ref_idx").on(e.name,e.scope,e.scopeRef),Ga("idx_instructions_scope").on(e.scope,e.scopeRef),Ga("idx_instructions_created_by").on(e.createdBy),Ga("idx_instructions_context_identity").on(e.createdBy,e.contextIdentity),Ga("idx_instructions_public_recency").on(e.scope,e.sourceUpdatedAt.desc())]),vr=Nm("instruction_version_identities",{id:wr("id").primaryKey().defaultRandom(),instructionId:wr("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),contentHash:en("content_hash").notNull(),versionOrdinal:hu("version_ordinal").notNull(),content:en("content"),firstSeenAt:po("first_seen_at",{withTimezone:!0}).notNull().defaultNow(),lastSeenAt:po("last_seen_at",{withTimezone:!0}).notNull().defaultNow(),createdAt:po("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[_u("instruction_version_identities_hash_unique").on(e.instructionId,e.contentHash),_u("instruction_version_identities_ordinal_unique").on(e.instructionId,e.versionOrdinal),Ga("idx_ivi_instruction").on(e.instructionId)]),xe=Nm("instruction_versions",{id:wr("id").primaryKey().defaultRandom(),instructionId:wr("instruction_id").references(()=>g.id,{onDelete:"cascade"}),versionNumber:hu("version_number").notNull(),content:en("content").notNull(),frontmatter:gu("frontmatter").notNull(),changeSummary:en("change_summary"),createdBy:wr("created_by"),createdAt:po("created_at",{withTimezone:!0}).defaultNow()},e=>[_u("instruction_versions_instruction_version_idx").on(e.instructionId,e.versionNumber)])});import{pgTable as ZS,text as ex,timestamp as tx,jsonb as nx,uuid as Pm,index as my}from"drizzle-orm/pg-core";var Ht,fy=Y(()=>{"use strict";xn();Ht=ZS("instruction_events",{id:Pm("id").primaryKey().defaultRandom(),instructionId:Pm("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),eventType:ex("event_type").notNull(),actorId:Pm("actor_id").notNull(),metadata:nx("metadata"),createdAt:tx("created_at",{withTimezone:!0}).defaultNow()},e=>[my("idx_instruction_events_instruction").on(e.instructionId),my("idx_instruction_events_type").on(e.eventType)])});import{boolean as rx,jsonb as ox,pgTable as Om,primaryKey as gy,text as as,timestamp as Ya,uniqueIndex as Dm,uuid as cs}from"drizzle-orm/pg-core";import{sql as sx}from"drizzle-orm";var C,lt,ye,Ir=Y(()=>{"use strict";is();xn();C=Om("projects",{id:cs("id").primaryKey().defaultRandom(),orgId:cs("org_id").references(()=>X.id,{onDelete:"cascade"}),name:as("name").notNull(),description:as("description"),githubRepo:as("github_repo"),gitRemoteUrl:as("git_remote_url"),gitRootCommit:as("git_root_commit"),gitRemoteAliases:as("git_remote_aliases").array().notNull().default([]),metadata:ox("metadata"),createdBy:cs("created_by"),createdAt:Ya("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Ya("updated_at",{withTimezone:!0}).defaultNow()},e=>[Dm("projects_org_name_idx").on(e.orgId,e.name),Dm("projects_git_remote_url_unique").on(e.gitRemoteUrl).where(sx`${e.gitRemoteUrl} IS NOT NULL`)]),lt=Om("project_instructions",{projectId:cs("project_id").references(()=>C.id,{onDelete:"cascade"}).notNull(),instructionId:cs("instruction_id").references(()=>g.id,{onDelete:"cascade"}).notNull(),addedAt:Ya("added_at",{withTimezone:!0}).defaultNow(),addedBy:cs("added_by")},e=>[gy({columns:[e.projectId,e.instructionId]})]),ye=Om("project_checkouts",{projectId:cs("project_id").references(()=>C.id,{onDelete:"cascade"}).notNull(),path:as("path").notNull(),isWorktree:rx("is_worktree").notNull().default(!1),firstSeen:Ya("first_seen",{withTimezone:!0}).notNull().defaultNow(),lastSeen:Ya("last_seen",{withTimezone:!0}).notNull().defaultNow()},e=>[gy({columns:[e.projectId,e.path]}),Dm("project_checkouts_path_unique").on(e.path)])});import{pgTable as ix,text as ni,timestamp as Cm,jsonb as hy,uuid as yu,integer as ax,boolean as cx,index as Lm}from"drizzle-orm/pg-core";var te,wu=Y(()=>{"use strict";Xt();is();Ir();te=ix("agent_runs",{id:yu("id").primaryKey().defaultRandom(),userId:yu("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),orgId:yu("org_id").references(()=>X.id,{onDelete:"set null"}),projectId:yu("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:hy("tool_spec").notNull().default([]),autoWorktree:cx("auto_worktree").notNull().default(!0),status:ni("status").notNull().default("pending"),sessionCount:ax("session_count").notNull().default(0),metadata:hy("metadata").notNull().default({}),createdAt:Cm("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:Cm("updated_at",{withTimezone:!0}).notNull().defaultNow(),completedAt:Cm("completed_at",{withTimezone:!0})},e=>[Lm("idx_agent_runs_user").on(e.userId),Lm("idx_agent_runs_org_created").on(e.orgId,e.createdAt),Lm("idx_agent_runs_project").on(e.projectId)])});import{pgTable as Mm,text as Rn,timestamp as Xa,jsonb as ds,uuid as Wr,integer as vu,uniqueIndex as _y,index as br}from"drizzle-orm/pg-core";var y,Ve,ie,ri=Y(()=>{"use strict";xn();Ir();Xt();is();wu();y=Mm("sessions",{id:Wr("id").primaryKey().defaultRandom(),userId:Wr("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),externalSessionId:Rn("external_session_id"),projectId:Wr("project_id").references(()=>C.id,{onDelete:"set null"}),orgId:Wr("org_id").references(()=>X.id,{onDelete:"set null"}),tool:Rn("tool").notNull(),projectPath:Rn("project_path"),gitBranch:Rn("git_branch"),startedAt:Xa("started_at",{withTimezone:!0}).notNull(),endedAt:Xa("ended_at",{withTimezone:!0}),eventCount:vu("event_count").default(0),tokenUsage:ds("token_usage"),analysis:ds("analysis"),analyzedAt:Xa("analyzed_at",{withTimezone:!0}),analyzedEventCount:vu("analyzed_event_count"),analyzedTurnCount:vu("analyzed_turn_count"),metadata:ds("metadata").default({}),origin:Rn("origin").notNull().default("unknown"),runId:Wr("run_id").references(()=>te.id,{onDelete:"set null"}),model:Rn("model"),harnessVersion:Rn("harness_version"),createdAt:Xa("created_at",{withTimezone:!0}).defaultNow()},e=>[br("idx_sessions_user").on(e.userId),br("idx_sessions_tool").on(e.tool),br("idx_sessions_started_at").on(e.startedAt),br("idx_sessions_project").on(e.projectId),br("idx_sessions_org_started_at").on(e.orgId,e.startedAt),br("idx_sessions_run").on(e.runId),_y("idx_sessions_user_external").on(e.userId,e.externalSessionId)]),Ve=Mm("session_events",{id:Wr("id").primaryKey().defaultRandom(),sessionId:Wr("session_id").notNull().references(()=>y.id,{onDelete:"cascade"}),sequence:vu("sequence").notNull(),eventType:Rn("event_type").notNull(),content:Rn("content"),toolName:Rn("tool_name"),toolInput:ds("tool_input"),toolOutput:ds("tool_output"),tokenUsage:ds("token_usage"),model:Rn("model"),timestamp:Xa("timestamp",{withTimezone:!0}).notNull(),metadata:ds("metadata").default({})},e=>[_y("session_events_session_sequence_idx").on(e.sessionId,e.sequence),br("idx_session_events_session_id").on(e.sessionId),br("idx_session_events_event_type").on(e.eventType),br("idx_session_events_model").on(e.model)]),ie=Mm("session_instructions",{sessionId:Wr("session_id").notNull().references(()=>y.id,{onDelete:"cascade"}),instructionId:Wr("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),linkMethod:Rn("link_method").notNull(),contentHash:Rn("content_hash")},e=>[br("idx_session_instructions_instruction_id").on(e.instructionId)])});import{pgTable as yy,text as Iu,timestamp as wy,uuid as Er,integer as vy,index as oi,unique as dx}from"drizzle-orm/pg-core";var Mt,ne,Iy=Y(()=>{"use strict";Xt();Ir();ri();Mt=yy("treatment_assignments",{id:Er("id").primaryKey().defaultRandom(),userId:Er("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),treatmentType:Iu("treatment_type").notNull(),treatmentId:Er("treatment_id").notNull(),treatmentVersion:vy("treatment_version").notNull().default(1),projectId:Er("project_id").references(()=>C.id,{onDelete:"set null"}),assignedBy:Er("assigned_by").references(()=>R.id,{onDelete:"set null"}),method:Iu("method").notNull(),assignedAt:wy("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=yy("treatment_exposures",{id:Er("id").primaryKey().defaultRandom(),sessionId:Er("session_id").notNull().references(()=>y.id,{onDelete:"cascade"}),userId:Er("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),treatmentType:Iu("treatment_type").notNull(),treatmentId:Er("treatment_id").notNull(),treatmentVersion:vy("treatment_version").notNull().default(1),assignmentId:Er("assignment_id").references(()=>Mt.id,{onDelete:"set null"}),method:Iu("method").notNull(),exposedAt:wy("exposed_at",{withTimezone:!0}).notNull().defaultNow()},e=>[dx("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 ux,text as $m,timestamp as lx,uuid as bu,integer as px,index as by,uniqueIndex as mx}from"drizzle-orm/pg-core";var Eu,Ey=Y(()=>{"use strict";Xt();Ir();Eu=ux("pending_treatment_exposures",{id:bu("id").primaryKey().defaultRandom(),userId:bu("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),externalSessionId:$m("external_session_id").notNull(),treatmentType:$m("treatment_type").notNull(),treatmentId:bu("treatment_id").notNull(),treatmentVersion:px("treatment_version").notNull().default(1),method:$m("method").notNull().default("injected"),projectId:bu("project_id").references(()=>C.id,{onDelete:"set null"}),createdAt:lx("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[mx("pending_treatment_exposures_unique").on(e.externalSessionId,e.treatmentType,e.treatmentId,e.treatmentVersion),by("idx_pending_treatment_exposures_ext").on(e.externalSessionId),by("idx_pending_treatment_exposures_user").on(e.userId)])});import{pgTable as Ay,text as mo,timestamp as Sy,uuid as si,numeric as fx,index as qm,unique as gx}from"drizzle-orm/pg-core";var U,zr,Um=Y(()=>{"use strict";Xt();xn();U=Ay("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:mo("project_path").notNull(),status:mo("status").notNull().default("running"),treatedShare:fx("treated_share").notNull().default("0.5"),salt:mo("salt").notNull(),contentHash:mo("content_hash"),source:mo("source").notNull().default("manual"),stoppedReason:mo("stopped_reason"),createdAt:Sy("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[qm("idx_instruction_experiments_lookup").on(e.userId,e.projectPath)]),zr=Ay("instruction_experiment_arms",{id:si("id").primaryKey().defaultRandom(),experimentId:si("experiment_id").notNull().references(()=>U.id,{onDelete:"cascade"}),userId:si("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),externalSessionId:mo("external_session_id").notNull(),arm:mo("arm").notNull(),assignedAt:Sy("assigned_at",{withTimezone:!0}).notNull().defaultNow()},e=>[gx("instruction_experiment_arms_unique").on(e.experimentId,e.externalSessionId),qm("idx_instruction_experiment_arms_experiment").on(e.experimentId,e.arm),qm("idx_instruction_experiment_arms_session").on(e.externalSessionId)])});import{pgTable as hx,text as Hm,timestamp as _x,uuid as Au,numeric as Bm,integer as xy,jsonb as yx,index as wx,unique as vx}from"drizzle-orm/pg-core";var Z,Ry=Y(()=>{"use strict";Xt();xn();Um();Z=hx("instruction_verdicts",{id:Au("id").primaryKey().defaultRandom(),userId:Au("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),instructionId:Au("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),contentHash:Hm("content_hash").notNull(),projectPath:Hm("project_path").notNull(),segment:yx("segment").notNull().default({}),decision:Hm("decision").notNull(),delta:Bm("delta").notNull(),ciLower:Bm("ci_lower").notNull(),ciUpper:Bm("ci_upper").notNull(),nTreated:xy("n_treated").notNull(),nControl:xy("n_control").notNull(),experimentId:Au("experiment_id").references(()=>U.id,{onDelete:"set null"}),decidedAt:_x("decided_at",{withTimezone:!0}).notNull().defaultNow()},e=>[vx("instruction_verdicts_unique").on(e.instructionId,e.contentHash,e.projectPath),wx("idx_instruction_verdicts_render").on(e.userId,e.projectPath)])});import{pgTable as Ix,text as Su,timestamp as Fm,uuid as Wm,integer as bx,unique as Ex,index as Ax}from"drizzle-orm/pg-core";var Re,Ty=Y(()=>{"use strict";Xt();Re=Ix("insight_recommendation_log",{id:Wm("id").primaryKey().defaultRandom(),userId:Wm("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),projectPath:Su("project_path").notNull().default(""),category:Su("category").notNull(),contentHash:Su("content_hash").notNull(),label:Su("label").notNull().default(""),firstSeenAt:Fm("first_seen_at",{withTimezone:!0}).notNull().defaultNow(),lastSeenAt:Fm("last_seen_at",{withTimezone:!0}).notNull().defaultNow(),timesGenerated:bx("times_generated").notNull().default(1),lastJobId:Wm("last_job_id"),dismissedAt:Fm("dismissed_at",{withTimezone:!0})},e=>[Ex("insight_recommendation_log_unique").on(e.userId,e.projectPath,e.contentHash),Ax("idx_insight_recommendation_log_read").on(e.userId,e.projectPath)])});import{pgTable as Sx,text as ii,timestamp as zm,uuid as Qa,integer as ky,index as xu}from"drizzle-orm/pg-core";var W,Vm=Y(()=>{"use strict";Xt();Ir();W=Sx("memories",{id:Qa("id").primaryKey().defaultRandom(),userId:Qa("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),orgId:Qa("org_id"),projectId:Qa("project_id").references(()=>C.id,{onDelete:"set null"}),version:ky("version").notNull().default(1),parentId:Qa("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:ky("trust_version"),trustComputedAt:zm("trust_computed_at",{withTimezone:!0}),createdAt:zm("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:zm("updated_at",{withTimezone:!0}).notNull().defaultNow()},e=>[xu("idx_memories_user").on(e.userId),xu("idx_memories_project").on(e.projectId),xu("idx_memories_parent").on(e.parentId),xu("idx_memories_user_status").on(e.userId,e.status)])});import{pgTable as xx,text as Za,timestamp as Jm,uuid as Km,integer as jy,jsonb as Rx,index as Ny}from"drizzle-orm/pg-core";var $t,Py=Y(()=>{"use strict";Xt();Vm();$t=xx("memory_experiments",{id:Km("id").primaryKey().defaultRandom(),memoryId:Km("memory_id").notNull().references(()=>W.id,{onDelete:"cascade"}),userId:Km("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),memoryVersion:jy("memory_version").notNull().default(1),taskPrompt:Za("task_prompt").notNull(),expectations:Za("expectations").array().notNull().default([]),trials:jy("trials").notNull().default(10),model:Za("model"),status:Za("status").notNull().default("pending"),result:Rx("result").$type(),error:Za("error"),createdAt:Jm("created_at",{withTimezone:!0}).notNull().defaultNow(),startedAt:Jm("started_at",{withTimezone:!0}),completedAt:Jm("completed_at",{withTimezone:!0})},e=>[Ny("idx_memory_experiments_memory").on(e.memoryId),Ny("idx_memory_experiments_user").on(e.userId)])});import{pgTable as Tx,text as ai,timestamp as Gm,uuid as Ym,jsonb as kx,uniqueIndex as jx,index as Dy}from"drizzle-orm/pg-core";var Ze,Xm=Y(()=>{"use strict";Xt();ri();Ze=Tx("session_terminal_targets",{id:Ym("id").primaryKey().defaultRandom(),userId:Ym("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),sessionId:Ym("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:kx("metadata").notNull().default({}),lastSeenAt:Gm("last_seen_at",{withTimezone:!0}).defaultNow(),createdAt:Gm("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Gm("updated_at",{withTimezone:!0}).defaultNow()},e=>[jx("idx_session_terminal_targets_user_target").on(e.userId,e.target),Dy("idx_session_terminal_targets_session").on(e.sessionId),Dy("idx_session_terminal_targets_user_status").on(e.userId,e.status)])});import{boolean as Nx,index as Ru,jsonb as Oy,pgTable as Px,text as us,timestamp as ec,uuid as Tu,integer as Cy}from"drizzle-orm/pg-core";var ku,Ly=Y(()=>{"use strict";ri();Xm();ku=Px("session_send_jobs",{id:Tu("id").primaryKey().defaultRandom(),userId:Tu("user_id").notNull(),sessionId:Tu("session_id").notNull().references(()=>y.id,{onDelete:"cascade"}),terminalTargetId:Tu("terminal_target_id").references(()=>Ze.id,{onDelete:"set null"}),target:us("target").notNull(),message:us("message").notNull(),submit:Nx("submit").notNull().default(!0),delivery:us("delivery").notNull().default("live"),status:us("status").notNull().default("pending"),result:Oy("result"),error:us("error"),attempts:Cy("attempts").notNull().default(0),taskKind:us("task_kind"),payload:Oy("payload"),claimedBy:us("claimed_by"),claimedAt:ec("claimed_at",{withTimezone:!0}),leaseExpiresAt:ec("lease_expires_at",{withTimezone:!0}),leaseRecoveries:Cy("lease_recoveries").notNull().default(0),createdAt:ec("created_at",{withTimezone:!0}).defaultNow(),updatedAt:ec("updated_at",{withTimezone:!0}).defaultNow(),completedAt:ec("completed_at",{withTimezone:!0})},e=>[Ru("idx_session_send_jobs_user").on(e.userId),Ru("idx_session_send_jobs_session").on(e.sessionId),Ru("idx_session_send_jobs_status").on(e.status),Ru("idx_session_send_jobs_pending").on(e.userId,e.status)])});import{pgTable as $y,text as ls,timestamp as ju,jsonb as qy,uuid as fo,integer as Dx,boolean as Ox,uniqueIndex as Cx,index as My,primaryKey as Lx}from"drizzle-orm/pg-core";var Ue,Me,Uy=Y(()=>{"use strict";xn();Ue=$y("packs",{id:fo("id").primaryKey().defaultRandom(),name:ls("name").notNull(),description:ls("description").notNull(),scope:ls("scope").notNull(),scopeRef:fo("scope_ref"),version:ls("version").notNull().default("1.0.0"),tags:ls("tags").array(),badge:ls("badge"),metadata:qy("metadata"),createdBy:fo("created_by"),createdAt:ju("created_at",{withTimezone:!0}).defaultNow(),updatedAt:ju("updated_at",{withTimezone:!0}).defaultNow(),archived:Ox("archived").default(!1),archivedAt:ju("archived_at",{withTimezone:!0}),archivedBy:fo("archived_by"),forkedFromId:fo("forked_from_id").references(()=>Ue.id,{onDelete:"set null"}),upstreamVersion:ls("upstream_version")},e=>[Cx("packs_name_scope_ref_idx").on(e.name,e.scope,e.scopeRef),My("idx_packs_scope").on(e.scope,e.scopeRef),My("idx_packs_created_by").on(e.createdBy)]),Me=$y("pack_instructions",{packId:fo("pack_id").references(()=>Ue.id,{onDelete:"cascade"}).notNull(),instructionId:fo("instruction_id").references(()=>g.id,{onDelete:"cascade"}).notNull(),position:Dx("position").notNull().default(0),slotOverrides:qy("slot_overrides"),addedAt:ju("added_at",{withTimezone:!0}).defaultNow(),addedBy:fo("added_by")},e=>[Lx({columns:[e.packId,e.instructionId]})])});import{pgTable as Mx,text as Qm,timestamp as $x,jsonb as qx,uuid as Zm,index as ci}from"drizzle-orm/pg-core";var go,Hy=Y(()=>{"use strict";xn();go=Mx("instruction_usage_events",{id:Zm("id").primaryKey().defaultRandom(),instructionId:Zm("instruction_id").references(()=>g.id,{onDelete:"set null"}),userId:Zm("user_id").notNull(),surface:Qm("surface").notNull(),action:Qm("action").notNull(),metadata:qx("metadata"),traceId:Qm("trace_id"),createdAt:$x("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 Ux,text as Nu,timestamp as By,jsonb as Hx,uuid as Fy,index as ef}from"drizzle-orm/pg-core";var fe,Wy=Y(()=>{"use strict";fe=Ux("worker_connections",{id:Fy("id").primaryKey().defaultRandom(),userId:Fy("user_id").notNull(),workerType:Nu("worker_type").notNull().default("mcp"),clientName:Nu("client_name").notNull(),clientVersion:Nu("client_version"),workerVersion:Nu("worker_version"),lastHeartbeat:By("last_heartbeat",{withTimezone:!0}).notNull().defaultNow(),connectedAt:By("connected_at",{withTimezone:!0}).notNull().defaultNow(),metadata:Hx("metadata")},e=>[ef("idx_worker_connections_user").on(e.userId),ef("idx_worker_connections_heartbeat").on(e.userId,e.lastHeartbeat),ef("idx_worker_connections_type").on(e.userId,e.workerType)])});import{pgTable as Bx,text as Pu,timestamp as Fx,jsonb as Wx,uuid as zy,index as Vy}from"drizzle-orm/pg-core";var Du,Jy=Y(()=>{"use strict";Du=Bx("cli_setup_events",{id:zy("id").primaryKey().defaultRandom(),userId:zy("user_id").notNull(),deviceId:Pu("device_id").notNull(),event:Pu("event").notNull(),cliVersion:Pu("cli_version"),os:Pu("os"),props:Wx("props").notNull().default({}),createdAt:Fx("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Vy("idx_cli_setup_events_user").on(e.userId,e.createdAt),Vy("idx_cli_setup_events_device").on(e.deviceId,e.createdAt)])});import{pgTable as zx,text as ps,integer as Vx,boolean as Jx,timestamp as Kx,jsonb as Gx,uuid as Yx,index as Ky}from"drizzle-orm/pg-core";var Ou,Gy=Y(()=>{"use strict";Ou=zx("cli_error_events",{id:Yx("id").primaryKey().defaultRandom(),deviceId:ps("device_id"),event:ps("event").notNull(),command:ps("command"),statusCode:Vx("status_code"),message:ps("message"),cliVersion:ps("cli_version"),os:ps("os"),nodeVersion:ps("node_version"),proxied:Jx("proxied"),props:Gx("props").notNull().default({}),createdAt:Kx("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Ky("idx_cli_error_events_created").on(e.createdAt),Ky("idx_cli_error_events_device").on(e.deviceId,e.createdAt)])});import{sql as tf}from"drizzle-orm";import{pgTable as ms,text as _t,timestamp as hn,jsonb as qn,uuid as pt,integer as Vr,boolean as tc,index as Bt,unique as Yy}from"drizzle-orm/pg-core";var k,Ee,Ie,ot,et,pe,or,nc=Y(()=>{"use strict";xn();k=ms("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:qn("metadata").notNull().default({}),version:Vr("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: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(tf`${e.instructionId} IS NOT NULL`),Bt("idx_eval_targets_project").on(e.projectPath).where(tf`${e.projectPath} IS NOT NULL`)]),Ee=ms("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: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(tf`${e.retiredAt} IS NULL`)]),Ie=ms("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: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: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:Vr("target_a_version").notNull(),targetBVersion:Vr("target_b_version").notNull(),isSwapped:tc("is_swapped").notNull().default(!1),winnerTargetId:pt("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: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:Vr("expectation_index").notNull(),expectationText:_t("expectation_text").notNull(),judgePassed:tc("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),Yy("eval_grade_annotations_eval_run_id_expectation_index_key").on(e.evalRunId,e.expectationIndex)]),pe=ms("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:Vr("expectation_index").notNull(),expectationText:_t("expectation_text").notNull(),judgePassed:tc("judge_passed").notNull(),humanPassed:tc("human_passed").notNull(),reviewerEngine:_t("reviewer_engine").notNull(),reviewerModel:_t("reviewer_model").notNull(),reviewerPassed:tc("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),Yy("judge_reviewer_verdicts_eval_run_id_expectation_index_review_key").on(e.evalRunId,e.expectationIndex,e.reviewerModel)]),or=ms("benchmarks",{id:pt("id").primaryKey().defaultRandom(),evalTargetId:pt("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 nf}from"drizzle-orm";import{pgTable as Xx,text as Jr,timestamp as Qx,jsonb as Cu,uuid as Lu,boolean as Zx,index as rc,uniqueIndex as eR}from"drizzle-orm/pg-core";var ae,Xy=Y(()=>{"use strict";nc();xn();ae=Xx("instruction_promotions",{id:Lu("id").primaryKey().defaultRandom(),userId:Lu("user_id").notNull(),evalTargetId:Lu("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),instructionId:Lu("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:Zx("applied").notNull().default(!1),refusals:Cu("refusals").notNull().default([]),rationale:Jr("rationale").notNull().default(""),effectClass:Jr("effect_class").notNull(),verdict:Cu("verdict").notNull().default({}),gates:Cu("gates").notNull().default({}),touchedSections:Cu("touched_sections").notNull().default([]),createdAt:Qx("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[rc("idx_instruction_promotions_budget").on(e.evalTargetId,e.createdAt.desc()).where(nf`${e.applied}`),rc("idx_instruction_promotions_target").on(e.evalTargetId,e.createdAt.desc()),rc("idx_instruction_promotions_user").on(e.userId,e.createdAt.desc()),rc("idx_instruction_promotions_to_hash").on(e.toContentHash),eR("uq_instruction_promotions_applied").on(e.evalTargetId,e.fromContentHash,e.toContentHash).where(nf`${e.applied}`),rc("idx_instruction_promotions_applied_hash").on(e.toContentHash,e.createdAt.desc()).where(nf`${e.applied}`)])});import{index as oc,integer as tR,jsonb as nR,pgTable as rR,text as Tn,timestamp as di,uniqueIndex as oR,uuid as sc}from"drizzle-orm/pg-core";var Te,Qy=Y(()=>{"use strict";xn();Ir();Te=rR("recommendation_applications",{id:sc("id").primaryKey().defaultRandom(),userId:sc("user_id").notNull(),instructionId:sc("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),projectId:sc("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:di("applied_at",{withTimezone:!0}),measurementStartedAt:di("measurement_started_at",{withTimezone:!0}),measurementEndedAt:di("measurement_ended_at",{withTimezone:!0}),verdict:Tn("verdict"),verdictDetail:Tn("verdict_detail"),revertedAt:di("reverted_at",{withTimezone:!0}),boundaryClass:Tn("boundary_class"),targets:Tn("targets").array().notNull().default([]),inverse:nR("inverse"),requires:Tn("requires").array().notNull().default([]),provides:Tn("provides").array().notNull().default([]),applyBatchId:sc("apply_batch_id"),applySeq:tR("apply_seq"),createdAt:di("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:di("updated_at",{withTimezone:!0}).notNull().defaultNow()},e=>[oR("uq_recommendation_applications_target").on(e.userId,e.instructionId,e.projectPath,e.harness,e.targetPath),oc("idx_recommendation_applications_user_status").on(e.userId,e.status,e.updatedAt.desc()),oc("idx_recommendation_applications_user_harness").on(e.userId,e.harness,e.updatedAt.desc()),oc("idx_recommendation_applications_project").on(e.projectId,e.updatedAt.desc()),oc("idx_recommendation_applications_batch").on(e.userId,e.applyBatchId,e.applySeq.desc()),oc("idx_recommendation_applications_requires").using("gin",e.requires)])});import{pgTable as sR,text as ho,timestamp as iR,jsonb as ic,uuid as rf,integer as of,real as aR,index as ac,uniqueIndex as Zy}from"drizzle-orm/pg-core";var $,ew=Y(()=>{"use strict";ri();Xt();$=sR("context_snapshots",{id:rf("id").primaryKey().defaultRandom(),sessionId:rf("session_id").references(()=>y.id,{onDelete:"cascade"}),userId:rf("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),sequence:of("sequence").notNull().default(0),provider:ho("provider").notNull(),model:ho("model").notNull(),systemPrompt:ho("system_prompt").notNull(),injectedInstructions:ic("injected_instructions").notNull().default([]),messagesSummary:ic("messages_summary").notNull(),tools:ic("tools").notNull().default([]),systemHash:ho("system_hash").notNull(),requestHash:ho("request_hash").notNull().default(""),toolsHash:ho("tools_hash"),injectedHash:ho("injected_hash"),messagesDelta:ic("messages_delta").default([]),messagesDeltaRef:ho("messages_delta_ref"),maxTokens:of("max_tokens"),temperature:aR("temperature"),estimatedTokens:of("estimated_tokens"),capturedAt:iR("captured_at",{withTimezone:!0}).notNull().defaultNow(),metadata:ic("metadata").default({})},e=>[ac("idx_context_snapshots_session").on(e.sessionId),ac("idx_context_snapshots_user").on(e.userId),ac("idx_context_snapshots_hash").on(e.systemHash),ac("idx_context_snapshots_request_hash").on(e.requestHash),Zy("idx_snapshots_session_request").on(e.sessionId,e.requestHash),Zy("idx_snapshots_session_sequence").on(e.sessionId,e.sequence),ac("idx_context_snapshots_user_session_captured").on(e.userId,e.sessionId,e.capturedAt.desc())])});import{pgTable as cR,text as tw,timestamp as dR,jsonb as uR,integer as lR,index as pR}from"drizzle-orm/pg-core";var kn,nw=Y(()=>{"use strict";kn=cR("content_blobs",{hash:tw("hash").primaryKey(),contentType:tw("content_type").notNull(),content:uR("content").notNull(),sizeBytes:lR("size_bytes").notNull().default(0),createdAt:dR("created_at",{withTimezone:!0}).defaultNow()},e=>[pR("idx_content_blobs_type").on(e.contentType)])});import{pgTable as mR,text as Mu,timestamp as cc,jsonb as $u,uuid as sf,index as qu,integer as rw}from"drizzle-orm/pg-core";var Ne,ow=Y(()=>{"use strict";nc();Ne=mR("eval_jobs",{id:sf("id").primaryKey().defaultRandom(),userId:sf("user_id").notNull(),evalTargetId:sf("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),status:Mu("status").notNull().default("pending"),config:$u("config").notNull().default({}),progress:$u("progress").notNull().default({}),result:$u("result"),error:Mu("error"),attempts:rw("attempts").notNull().default(0),taskKind:Mu("task_kind"),payload:$u("payload"),claimedBy:Mu("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}).defaultNow(),updatedAt:cc("updated_at",{withTimezone:!0}).defaultNow(),completedAt:cc("completed_at",{withTimezone:!0})},e=>[qu("idx_eval_jobs_user").on(e.userId),qu("idx_eval_jobs_target").on(e.evalTargetId),qu("idx_eval_jobs_status").on(e.status),qu("idx_eval_jobs_pending").on(e.userId,e.status)])});import{pgTable as fR,text as dc,timestamp as uc,jsonb as sw,uuid as iw,integer as aw,index as cw}from"drizzle-orm/pg-core";var Pe,dw=Y(()=>{"use strict";Pe=fR("agent_jobs",{id:iw("id").primaryKey().defaultRandom(),userId:iw("user_id").notNull(),taskKind:dc("task_kind").notNull(),status:dc("status").notNull().default("pending"),payload:sw("payload").notNull(),dedupeKey:dc("dedupe_key"),result:sw("result"),error:dc("error"),attempts:aw("attempts").notNull().default(0),claimedBy:dc("claimed_by"),claimedAt:uc("claimed_at",{withTimezone:!0}),leaseExpiresAt:uc("lease_expires_at",{withTimezone:!0}),leaseRecoveries:aw("lease_recoveries").notNull().default(0),createdAt:uc("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:uc("updated_at",{withTimezone:!0}).notNull().defaultNow(),completedAt:uc("completed_at",{withTimezone:!0})},e=>[cw("idx_agent_jobs_claim").on(e.userId,e.status,e.taskKind,e.createdAt),cw("idx_agent_jobs_dedupe").on(e.userId,e.taskKind,e.dedupeKey)])});import{pgTable as gR,text as lc,timestamp as pc,jsonb as Uu,uuid as af,index as Hu,integer as uw}from"drizzle-orm/pg-core";var z,lw=Y(()=>{"use strict";Ir();z=gR("insights_jobs",{id:af("id").primaryKey().defaultRandom(),userId:af("user_id").notNull(),status:lc("status").notNull().default("pending"),projectPath:lc("project_path"),projectId:af("project_id").references(()=>C.id,{onDelete:"set null"}),config:Uu("config").notNull().default({}),progress:Uu("progress").notNull().default({}),result:Uu("result"),error:lc("error"),attempts:uw("attempts").notNull().default(0),taskKind:lc("task_kind"),payload:Uu("payload"),claimedBy:lc("claimed_by"),claimedAt:pc("claimed_at",{withTimezone:!0}),leaseExpiresAt:pc("lease_expires_at",{withTimezone:!0}),leaseRecoveries:uw("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})},e=>[Hu("idx_insights_jobs_user").on(e.userId),Hu("idx_insights_jobs_status").on(e.status),Hu("idx_insights_jobs_pending").on(e.userId,e.status),Hu("idx_insights_jobs_project").on(e.projectId)])});import{pgTable as hR,text as cf,timestamp as Bu,uuid as pw,index as _R,uniqueIndex as yR}from"drizzle-orm/pg-core";var Ae,mw=Y(()=>{"use strict";Xt();Ae=hR("api_keys",{id:pw("id").primaryKey().defaultRandom(),userId:pw("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),name:cf("name").notNull(),keyHash:cf("key_hash").notNull(),keyPrefix:cf("key_prefix").notNull(),lastUsedAt:Bu("last_used_at",{withTimezone:!0}),expiresAt:Bu("expires_at",{withTimezone:!0}),revokedAt:Bu("revoked_at",{withTimezone:!0}),createdAt:Bu("created_at",{withTimezone:!0}).defaultNow()},e=>[_R("idx_api_keys_user").on(e.userId),yR("idx_api_keys_hash").on(e.keyHash)])});import{pgTable as wR,text as df,timestamp as fw,uuid as vR,index as IR}from"drizzle-orm/pg-core";var Un,gw=Y(()=>{"use strict";Xt();Un=wR("extension_auth_codes",{code:df("code").primaryKey(),userId:vR("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),editor:df("editor"),email:df("email"),expiresAt:fw("expires_at",{withTimezone:!0}).notNull(),createdAt:fw("created_at",{withTimezone:!0}).defaultNow()},e=>[IR("idx_ext_auth_codes_expiry").on(e.expiresAt)])});import{pgTable as bR,text as ER,timestamp as hw,jsonb as AR,uuid as uf,index as _w}from"drizzle-orm/pg-core";var He,yw=Y(()=>{"use strict";nc();He=bR("eval_conversations",{id:uf("id").primaryKey().defaultRandom(),evalTargetId:uf("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),userId:uf("user_id").notNull(),messages:AR("messages").notNull().default([]),status:ER("status").notNull().default("active"),createdAt:hw("created_at",{withTimezone:!0}).defaultNow(),updatedAt:hw("updated_at",{withTimezone:!0}).defaultNow()},e=>[_w("idx_eval_conversations_target").on(e.evalTargetId),_w("idx_eval_conversations_user").on(e.userId)])});import{pgTable as SR,text as Kr,timestamp as ww,jsonb as xR,uuid as lf}from"drizzle-orm/pg-core";var _o,vw=Y(()=>{"use strict";_o=SR("skill_submissions",{id:lf("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:lf("submitted_by").notNull(),reviewedBy:lf("reviewed_by"),reviewNote:Kr("review_note"),metadata:xR("metadata"),createdAt:ww("created_at",{withTimezone:!0}).defaultNow(),updatedAt:ww("updated_at",{withTimezone:!0}).defaultNow()})});import{pgTable as RR,text as mc,timestamp as Iw,jsonb as TR,uuid as kR,uniqueIndex as jR,index as bw}from"drizzle-orm/pg-core";var qt,Ew=Y(()=>{"use strict";qt=RR("harness_releases",{id:kR("id").primaryKey().defaultRandom(),harness:mc("harness").notNull(),version:mc("version").notNull(),publishedAt:Iw("published_at",{withTimezone:!0}).notNull(),title:mc("title"),body:mc("body"),categories:TR("categories").default({}),url:mc("url"),createdAt:Iw("created_at",{withTimezone:!0}).defaultNow()},e=>[jR("idx_harness_releases_unique").on(e.harness,e.version),bw("idx_harness_releases_harness").on(e.harness),bw("idx_harness_releases_published").on(e.publishedAt)])});import{pgTable as NR,text as ui,timestamp as Aw,jsonb as PR,uuid as Sw,index as xw,uniqueIndex as DR}from"drizzle-orm/pg-core";var Rt,Rw=Y(()=>{"use strict";Rt=NR("notifications",{id:Sw("id").primaryKey().defaultRandom(),userId:Sw("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:PR("metadata").notNull().default({}),readAt:Aw("read_at",{withTimezone:!0}),createdAt:Aw("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[xw("idx_notifications_user_created").on(e.userId,e.createdAt),xw("idx_notifications_user_unread").on(e.userId),DR("idx_notifications_source_dedup").on(e.userId,e.sourceTable,e.sourceId)])});import{pgTable as OR,text as fc,timestamp as gc,jsonb as pf,uuid as mf,index as Fu,integer as Tw}from"drizzle-orm/pg-core";var ue,kw=Y(()=>{"use strict";wu();ue=OR("launch_jobs",{id:mf("id").primaryKey().defaultRandom(),userId:mf("user_id").notNull(),tool:fc("tool").notNull(),status:fc("status").notNull().default("pending"),config:pf("config").notNull().default({}),result:pf("result"),error:fc("error"),attempts:Tw("attempts").notNull().default(0),taskKind:fc("task_kind"),payload:pf("payload"),claimedBy:fc("claimed_by"),claimedAt:gc("claimed_at",{withTimezone:!0}),leaseExpiresAt:gc("lease_expires_at",{withTimezone:!0}),leaseRecoveries:Tw("lease_recoveries").notNull().default(0),createdAt:gc("created_at",{withTimezone:!0}).defaultNow(),updatedAt:gc("updated_at",{withTimezone:!0}).defaultNow(),completedAt:gc("completed_at",{withTimezone:!0}),runId:mf("run_id").references(()=>te.id,{onDelete:"set null"})},e=>[Fu("idx_launch_jobs_user").on(e.userId),Fu("idx_launch_jobs_status").on(e.status),Fu("idx_launch_jobs_pending").on(e.userId,e.status),Fu("idx_launch_jobs_run").on(e.runId)])});import{pgTable as jw,uuid as Gr,text as yo,real as CR,timestamp as hc,boolean as LR,uniqueIndex as MR,index as _c}from"drizzle-orm/pg-core";var Wu,x,Ge,Nw=Y(()=>{"use strict";Xt();xn();Ir();Wu=["add","remove","trim"],x=jw("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:CR("score").notNull(),reason:yo("reason").notNull(),kind:yo("kind").$type().notNull().default("add"),generatedAt:hc("generated_at",{withTimezone:!0}).notNull().defaultNow(),isStale:LR("is_stale").notNull().default(!1),dismissedAt:hc("dismissed_at",{withTimezone:!0}),acceptedAt:hc("accepted_at",{withTimezone:!0}),declinedAt:hc("declined_at",{withTimezone:!0}),declinedReason:yo("declined_reason"),promotedToInstructionId:Gr("promoted_to_instruction_id").references(()=>g.id,{onDelete:"set null"})},e=>[MR("idx_instruction_suggestions_user_project_instruction_kind").on(e.userId,e.projectPath,e.instructionId,e.kind),_c("idx_instruction_suggestions_user_project").on(e.userId,e.projectPath),_c("idx_instruction_suggestions_user_proj_id").on(e.userId,e.projectId),_c("idx_instruction_suggestions_generated_at").on(e.generatedAt)]),Ge=jw("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:hc("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[_c("idx_instruction_suggestion_events_suggestion_id").on(e.suggestionId),_c("idx_instruction_suggestion_events_user_id").on(e.userId)])});import{pgTable as $R,text as ff,integer as qR,numeric as yc,timestamp as gf,index as UR,primaryKey as HR}from"drizzle-orm/pg-core";var st,Pw=Y(()=>{"use strict";st=$R("model_pricing",{provider:ff("provider").notNull(),modelId:ff("model_id").notNull(),inputPerM:yc("input_per_m").notNull(),outputPerM:yc("output_per_m").notNull(),cacheReadPerM:yc("cache_read_per_m").notNull(),cacheWrite5mPerM:yc("cache_write_5m_per_m").notNull(),cacheWrite1hPerM:yc("cache_write_1h_per_m").notNull(),contextWindow:qR("context_window"),effectiveFrom:gf("effective_from",{withTimezone:!0}).notNull(),effectiveUntil:gf("effective_until",{withTimezone:!0}),source:ff("source").notNull(),verifiedAt:gf("verified_at",{withTimezone:!0})},e=>[HR({columns:[e.provider,e.modelId,e.effectiveFrom]}),UR("idx_model_pricing_active").on(e.provider,e.modelId,e.effectiveFrom.desc())])});import{pgTable as BR,text as fs,numeric as Dw,timestamp as Ow,uuid as Cw,jsonb as FR,index as Lw}from"drizzle-orm/pg-core";var ve,Mw=Y(()=>{"use strict";ve=BR("limit_observations",{id:Cw("id").primaryKey().defaultRandom(),observedAt:Ow("observed_at",{withTimezone:!0}).notNull().defaultNow(),provider:fs("provider").notNull(),plan:fs("plan").notNull(),limitType:fs("limit_type").notNull(),value:Dw("value").notNull(),unit:fs("unit").notNull(),comparator:fs("comparator").notNull().default("="),resetsAt:Ow("resets_at",{withTimezone:!0}),sourceType:fs("source_type").notNull(),sourceUrl:fs("source_url"),sourceEvidence:FR("source_evidence"),confidence:Dw("confidence").notNull(),userId:Cw("user_id")},e=>[Lw("idx_limit_obs_lookup").on(e.provider,e.plan,e.limitType,e.observedAt.desc()),Lw("idx_limit_obs_user").on(e.userId,e.observedAt.desc())])});import{pgTable as WR,text as zu,timestamp as zR,uuid as VR,jsonb as JR,boolean as KR,uniqueIndex as GR}from"drizzle-orm/pg-core";var Dt,$w=Y(()=>{"use strict";Dt=WR("provider_docs_snapshots",{id:VR("id").primaryKey().defaultRandom(),fetchedAt:zR("fetched_at",{withTimezone:!0}).notNull().defaultNow(),provider:zu("provider").notNull(),docUrl:zu("doc_url").notNull(),contentHash:zu("content_hash").notNull(),content:zu("content").notNull(),parseSuccess:KR("parse_success").notNull(),parseErrors:JR("parse_errors")},e=>[GR("idx_docs_dedup").on(e.provider,e.docUrl,e.contentHash)])});import{pgTable as YR,text as Vu,numeric as qw,timestamp as Uw,uuid as XR,primaryKey as QR,index as ZR}from"drizzle-orm/pg-core";var tt,Hw=Y(()=>{"use strict";tt=YR("plan_limits_active",{provider:Vu("provider").notNull(),plan:Vu("plan").notNull(),limitType:Vu("limit_type").notNull(),value:qw("value").notNull(),unit:Vu("unit").notNull(),effectiveFrom:Uw("effective_from",{withTimezone:!0}).notNull(),effectiveUntil:Uw("effective_until",{withTimezone:!0}),confidence:qw("confidence").notNull(),sourceObservationIds:XR("source_observation_ids").array().notNull()},e=>[QR({columns:[e.provider,e.plan,e.limitType,e.effectiveFrom]}),ZR("idx_plan_limits_lookup").on(e.provider,e.plan,e.limitType,e.effectiveFrom.desc())])});import{pgTable as eT,text as hf,timestamp as tT,uuid as Bw,jsonb as nT,index as rT}from"drizzle-orm/pg-core";var jn,Fw=Y(()=>{"use strict";jn=eT("alert_dispatches",{id:Bw("id").primaryKey().defaultRandom(),userId:Bw("user_id").notNull(),alertKey:hf("alert_key").notNull(),severity:hf("severity").notNull(),lastDispatchedAt:tT("last_dispatched_at",{withTimezone:!0}).notNull().defaultNow(),lastState:nT("last_state").notNull(),channel:hf("channel").notNull()},e=>[rT("idx_alert_user_key").on(e.userId,e.alertKey,e.lastDispatchedAt.desc())])});import{boolean as oT,date as sT,index as _f,integer as iT,jsonb as aT,pgTable as yf,text as sr,timestamp as wo,uniqueIndex as cT,uuid as li}from"drizzle-orm/pg-core";var $e,Tt,kt,Ww=Y(()=>{"use strict";$e=yf("announcements",{id:li("id").primaryKey().defaultRandom(),version:sr("version").notNull().unique(),releaseDate:sT("release_date").notNull(),subject:sr("subject").notNull(),htmlBody:sr("html_body").notNull(),textBody:sr("text_body").notNull(),sections:aT("sections").notNull().default({}),status:sr("status").notNull().default("draft"),recipientCount:iT("recipient_count"),sentAt:wo("sent_at",{withTimezone:!0}),sentBy:li("sent_by"),error:sr("error"),createdAt:wo("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:wo("updated_at",{withTimezone:!0}).notNull().defaultNow()},e=>[_f("idx_announcements_status").on(e.status),_f("idx_announcements_created").on(e.createdAt)]),Tt=yf("announcement_deliveries",{id:li("id").primaryKey().defaultRandom(),announcementId:li("announcement_id").notNull(),userId:li("user_id").notNull(),email:sr("email").notNull(),status:sr("status").notNull().default("pending"),providerId:sr("provider_id"),error:sr("error"),sentAt:wo("sent_at",{withTimezone:!0}),createdAt:wo("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[cT("uniq_announcement_deliveries_announcement_user").on(e.announcementId,e.userId),_f("idx_announcement_deliveries_user").on(e.userId,e.createdAt)]),kt=yf("notification_preferences",{userId:li("user_id").primaryKey(),productAnnouncements:oT("product_announcements").notNull().default(!0),unsubscribeToken:sr("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 dT,text as wf,timestamp as zw,uuid as vf,integer as uT,index as lT,unique as pT}from"drizzle-orm/pg-core";var Vw,Jw=Y(()=>{"use strict";Vw=dT("scaffolding_fingerprints",{id:vf("id").primaryKey().defaultRandom(),userId:vf("user_id").notNull(),harness:wf("harness").notNull(),model:wf("model").notNull(),toolsHash:wf("tools_hash").notNull(),firstSeenAt:zw("first_seen_at",{withTimezone:!0}).notNull().defaultNow(),lastSeenAt:zw("last_seen_at",{withTimezone:!0}).notNull().defaultNow(),snapshotCount:uT("snapshot_count").notNull().default(1),firstSessionId:vf("first_session_id")},e=>[pT("scaffolding_fingerprints_user_id_harness_model_tools_hash_key").on(e.userId,e.harness,e.model,e.toolsHash),lT("idx_scaffolding_fp_segment").on(e.userId,e.harness,e.model)])});import{pgTable as mT,text as If,timestamp as fT,jsonb as gT,uuid as Kw,integer as hT,unique as _T}from"drizzle-orm/pg-core";var Gw,Yw=Y(()=>{"use strict";Gw=mT("scaffolding_segments",{id:Kw("id").primaryKey().defaultRandom(),userId:Kw("user_id").notNull(),harness:If("harness").notNull(),model:If("model").notNull(),coreNames:gT("core_names").notNull(),coreHash:If("core_hash").notNull(),activeFingerprints:hT("active_fingerprints").notNull(),computedAt:fT("computed_at",{withTimezone:!0}).notNull().defaultNow()},e=>[_T("scaffolding_segments_user_id_harness_model_key").on(e.userId,e.harness,e.model)])});var bf=Y(()=>{"use strict";Xt();is();py();xn();fy();Ir();ri();Iy();Ey();Um();Ry();Ty();Vm();Py();wu();Xm();Ly();Uy();Hy();Wy();Jy();Gy();nc();Xy();Qy();ew();nw();ow();dw();lw();mw();gw();yw();vw();Ew();Rw();kw();Nw();Pw();Mw();$w();Hw();Fw();Ww();Jw();Yw()});import{relations as Ye}from"drizzle-orm";var yT,wT,vT,IT,bT,ET,AT,ST,xT,RT,TT,kT,jT,NT,PT,DT,OT,CT,LT,MT,$T,qT,UT,HT,BT,FT,WT,zT,VT,JT,Xw=Y(()=>{"use strict";bf();yT=Ye(R,({many:e})=>({sessions:e(y),contextSnapshots:e($),apiKeys:e(Ae)})),wT=Ye(Ae,({one:e})=>({profile:e(R,{fields:[Ae.userId],references:[R.id]})})),vT=Ye(X,({many:e})=>({teams:e(Q),userOrganizations:e(ee),projects:e(C),invitations:e(se)})),IT=Ye(Q,({one:e,many:t})=>({organization:e(X,{fields:[Q.orgId],references:[X.id]}),userTeams:t(we),invitations:t(se)})),bT=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]})})),ET=Ye(ee,({one:e})=>({organization:e(X,{fields:[ee.orgId],references:[X.id]})})),AT=Ye(we,({one:e})=>({team:e(Q,{fields:[we.teamId],references:[Q.id]})})),ST=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]})})),xT=Ye(Ht,({one:e})=>({instruction:e(g,{fields:[Ht.instructionId],references:[g.id]})})),RT=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)})),TT=Ye(xe,({one:e})=>({instruction:e(g,{fields:[xe.instructionId],references:[g.id]})})),kT=Ye(C,({one:e,many:t})=>({organization:e(X,{fields:[C.orgId],references:[X.id]}),projectInstructions:t(lt),sessions:t(y)})),jT=Ye(lt,({one:e})=>({project:e(C,{fields:[lt.projectId],references:[C.id]}),instruction:e(g,{fields:[lt.instructionId],references:[g.id]})})),NT=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($)})),PT=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)})),DT=Ye(ue,({one:e})=>({run:e(te,{fields:[ue.runId],references:[te.id]})})),OT=Ye(Ve,({one:e})=>({session:e(y,{fields:[Ve.sessionId],references:[y.id]})})),CT=Ye(ie,({one:e})=>({session:e(y,{fields:[ie.sessionId],references:[y.id]}),instruction:e(g,{fields:[ie.instructionId],references:[g.id]})})),LT=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)})),MT=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]})})),$T=Ye(Ue,({one:e,many:t})=>({packInstructions:t(Me),forkedFrom:e(Ue,{fields:[Ue.forkedFromId],references:[Ue.id]})})),qT=Ye(Me,({one:e})=>({pack:e(Ue,{fields:[Me.packId],references:[Ue.id]}),instruction:e(g,{fields:[Me.instructionId],references:[g.id]})})),UT=Ye(go,({one:e})=>({instruction:e(g,{fields:[go.instructionId],references:[g.id]})})),HT=Ye(k,({one:e,many:t})=>({parent:e(k,{fields:[k.parentId],references:[k.id]}),evals:t(Ee),evalRuns:t(Ie),benchmarks:t(or),evalJobs:t(Ne),evalConversations:t(He)})),BT=Ye(Ee,({one:e,many:t})=>({evalTarget:e(k,{fields:[Ee.evalTargetId],references:[k.id]}),runs:t(Ie)})),FT=Ye(Ie,({one:e})=>({eval:e(Ee,{fields:[Ie.evalId],references:[Ee.id]}),evalTarget:e(k,{fields:[Ie.evalTargetId],references:[k.id]})})),WT=Ye(or,({one:e})=>({evalTarget:e(k,{fields:[or.evalTargetId],references:[k.id]})})),zT=Ye(Ne,({one:e})=>({evalTarget:e(k,{fields:[Ne.evalTargetId],references:[k.id]})})),VT=Ye(He,({one:e})=>({evalTarget:e(k,{fields:[He.evalTargetId],references:[k.id]})})),JT=Ye($,({one:e})=>({session:e(y,{fields:[$.sessionId],references:[y.id]}),profile:e(R,{fields:[$.userId],references:[R.id]})}))});var Ju={};lo(Ju,{SUGGESTION_KINDS:()=>Wu,agentJobs:()=>Pe,agentRuns:()=>te,agentRunsRelations:()=>PT,alertDispatches:()=>jn,announcementDeliveries:()=>Tt,announcements:()=>$e,apiKeys:()=>Ae,apiKeysRelations:()=>wT,benchmarks:()=>or,benchmarksRelations:()=>WT,cliErrorEvents:()=>Ou,cliSetupEvents:()=>Du,contentBlobs:()=>kn,contextSnapshots:()=>$,contextSnapshotsRelations:()=>JT,evalComparisons:()=>ot,evalConversations:()=>He,evalConversationsRelations:()=>VT,evalGradeAnnotations:()=>et,evalJobs:()=>Ne,evalJobsRelations:()=>zT,evalRuns:()=>Ie,evalRunsRelations:()=>FT,evalTargets:()=>k,evalTargetsRelations:()=>HT,evals:()=>Ee,evalsRelations:()=>BT,extensionAuthCodes:()=>Un,harnessReleases:()=>qt,insightRecommendationLog:()=>Re,insightsJobs:()=>z,instructionEvents:()=>Ht,instructionEventsRelations:()=>xT,instructionExperimentArms:()=>zr,instructionExperiments:()=>U,instructionPromotions:()=>ae,instructionSuggestionEvents:()=>Ge,instructionSuggestions:()=>x,instructionUsageEvents:()=>go,instructionUsageEventsRelations:()=>UT,instructionVerdicts:()=>Z,instructionVersionIdentities:()=>vr,instructionVersions:()=>xe,instructionVersionsRelations:()=>TT,instructions:()=>g,instructionsRelations:()=>ST,judgeReviewerVerdicts:()=>pe,launchJobs:()=>ue,launchJobsRelations:()=>DT,limitObservations:()=>ve,memories:()=>W,memoriesRelations:()=>RT,memoryExperiments:()=>$t,modelPricing:()=>st,notificationPreferences:()=>kt,notifications:()=>Rt,orgInvitations:()=>se,orgInvitationsRelations:()=>bT,organizations:()=>X,organizationsRelations:()=>vT,packInstructions:()=>Me,packInstructionsRelations:()=>qT,packs:()=>Ue,packsRelations:()=>$T,pendingTreatmentExposures:()=>Eu,planLimitsActive:()=>tt,profiles:()=>R,profilesRelations:()=>yT,projectCheckouts:()=>ye,projectInstructions:()=>lt,projectInstructionsRelations:()=>jT,projects:()=>C,projectsRelations:()=>kT,providerDocsSnapshots:()=>Dt,recommendationApplications:()=>Te,scaffoldingFingerprints:()=>Vw,scaffoldingSegments:()=>Gw,sessionEvents:()=>Ve,sessionEventsRelations:()=>OT,sessionInstructions:()=>ie,sessionInstructionsRelations:()=>CT,sessionSendJobs:()=>ku,sessionTerminalTargets:()=>Ze,sessions:()=>y,sessionsRelations:()=>NT,skillSubmissions:()=>_o,teams:()=>Q,teamsRelations:()=>IT,treatmentAssignments:()=>Mt,treatmentAssignmentsRelations:()=>LT,treatmentExposures:()=>ne,treatmentExposuresRelations:()=>MT,userOrganizations:()=>ee,userOrganizationsRelations:()=>ET,userTeams:()=>we,userTeamsRelations:()=>AT,workerConnections:()=>fe});var Ku=Y(()=>{"use strict";bf();Xw()});function xf(){gs++,gs>Ef&&(Ef=gs)}function Rf(){gs>0&&gs--}function Tf(){pi++,pi>Af&&(Af=pi)}function kf(){pi>0&&pi--}function wc(){return gs}function jf(){Qw++}function vc(){Zw++}function ev(){Sf++}function Nf(){let e=Sf;return Sf=0,e}function Pf(){return{current:gs,peak:Ef,heavyCurrent:pi,heavyPeak:Af,shedCount:Qw,ingestShedCount:Zw}}function mi(){let e=Number(process.env.PG_INFLIGHT_MAX);return Number.isFinite(e)&&e>0?e:(Number(process.env.PG_POOL_MAX)||3)*4}function Ic(){let e=mi(),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 gs,Ef,pi,Af,Qw,Zw,Sf,Df=Y(()=>{"use strict";gs=0,Ef=0,pi=0,Af=0,Qw=0,Zw=0,Sf=0;c(xf,"trackDbOpStart");c(Rf,"trackDbOpEnd");c(Tf,"trackHeavyDbOpStart");c(kf,"trackHeavyDbOpEnd");c(wc,"getDbLoad");c(jf,"recordDbShed");c(vc,"recordIngestShed");c(ev,"recordQueryDeadline");c(Nf,"consumeDeadlineCount");c(Pf,"getDbLoadStats");c(mi,"dbInflightMax");c(Ic,"dbIngestInflightMax")});import{drizzle as tv}from"drizzle-orm/postgres-js";import Of from"postgres";function Cf(e){let t=process.env[e];if(!t)throw new Error(`Missing required env var: ${e}`);return t}function nv(){if(Ac)throw new Error("getDb() called after closeDb(): the connection pool is closed for shutdown. Stop issuing queries (timers/requests) before draining the pool.");if(!Ec){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=Of(Cf("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}:{}}}),Ec=tv(gi,{schema:Ju})}return Ec}function rv(){if(Ac)throw new Error("getHeavyDb() called after closeDb(): the connection pool is closed for shutdown. Stop issuing queries (timers/requests) before draining the pool.");if(!Yu){let e=(process.env.PG_APPLICATION_NAME||"rulemetric")+":heavy",t=Number(process.env.PG_HEAVY_POOL_MAX)||2;Xu=Of(Cf("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}}),Yu=tv(Xu,{schema:Ju})}return Yu}async function Sc(){if(Gu)return Gu;Ac=!0;let e=gi,t=fi,n=Xu;return gi=void 0,Ec=void 0,fi=void 0,Xu=void 0,Yu=void 0,Gu=Promise.allSettled([e?e.end({timeout:5}):Promise.resolve(),t?t.end({timeout:5}):Promise.resolve(),n?n.end({timeout:5}):Promise.resolve()]).then(()=>{}),Gu}function Lf(){if(Ac)return Promise.resolve();if(bc)return bc;let e=gi;return gi=void 0,Ec=void 0,bc=(async()=>{e&&await e.end({timeout:5}).catch(()=>{})})().finally(()=>{bc=void 0}),bc}async function Mf(e){let t=Date.now();if(Ac)return{ok:!1,ms:0,err:new Error("pool closed for shutdown")};let n=fi;try{return n||(n=Of(Cf("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 xc(e){let t=e?.message;return typeof t=="string"&&t.includes(KT)}function hi(e){let t=e,n=t?.code??t?.cause?.code??t?.errno;return n!==void 0&&GT.has(n)}function Zu(e){let t=e,n=t?.code??t?.cause?.code??t?.errno;return n!==void 0&&YT.has(n)}async function ov(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&&Zu(i);if(s===n-1||!a)throw i;await new Promise(d=>setTimeout(d,r*2**s))}throw o}function Rc(e){return e?.code==="QUERY_DEADLINE"}function sv(){let e=Number(process.env.PG_QUERY_DEADLINE_MS);return Number.isFinite(e)&&e>=0?e:2e4}function iv(){let e=Number(process.env.PG_HEAVY_QUERY_DEADLINE_MS);return Number.isFinite(e)&&e>=0?e:6e4}function XT(e,t,n=!0){let r,o=new Promise((s,i)=>{r=setTimeout(()=>{n&&ev(),i(new Qu(t))},t);let a=r;typeof a.unref=="function"&&a.unref()});return Promise.race([e,o]).finally(()=>clearTimeout(r))}function $f(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,p)=>{let m=r?Tf:xf,_=r?kf:Rf;m();let w=ov(()=>new Promise((h,v)=>d.call(o,h,v)),{retryResets:t});return(n>0?XT(w,n,!r):w).finally(_).then(l,p)}}let a=Reflect.get(o,s,i);return typeof a=="function"?(...d)=>$f(a.apply(o,d),t,n,r):a}})}function dv(e,t=!1){let n=t?Tf:xf,r=t?kf:Rf;n();try{return Promise.resolve(e()).finally(r)}catch(o){throw r(),o}}var Ec,gi,Ac,Gu,bc,fi,Xu,Yu,KT,GT,YT,Qu,av,cv,u,Fe,qf=Y(()=>{"use strict";Ku();Df();Ac=!1;c(Cf,"getEnv");c(nv,"getDb");c(rv,"getHeavyDb");c(Sc,"closeDb");c(Lf,"recyclePool");c(Mf,"probeDbReachable");KT="called after closeDb()";c(xc,"isPoolClosedError");GT=new Set(["CONNECT_TIMEOUT","ETIMEDOUT","ENOTFOUND","ECONNREFUSED","EAI_AGAIN"]);c(hi,"isRetryableConnectError");YT=new Set(["CONNECTION_CLOSED","ECONNRESET","EPIPE"]);c(Zu,"isRetryableResetError");c(ov,"withDbRetry");Qu=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(Rc,"isQueryDeadlineError");c(sv,"queryDeadlineMs");c(iv,"heavyQueryDeadlineMs");c(XT,"raceWithDeadline");av=new Set(["select","selectDistinct","selectDistinctOn","insert","update","delete","execute","with","$count","refreshMaterializedView"]),cv=new Set(["select","selectDistinct","selectDistinctOn","$count"]);c($f,"wrapBuilder");c(dv,"gaugeTransaction");u=new Proxy({},{get(e,t){let n=nv(),r=n[t];if(typeof t=="string"&&av.has(t)&&typeof r=="function"){let o=cv.has(t),s=sv();return(...i)=>$f(r.apply(n,i),o,s)}return t==="transaction"&&typeof r=="function"?(...o)=>dv(()=>r.apply(n,o)):r}}),Fe=new Proxy({},{get(e,t){let n=rv(),r=n[t];if(typeof t=="string"&&av.has(t)&&typeof r=="function"){let o=cv.has(t);return(...s)=>$f(r.apply(n,s),o,iv(),!0)}return t==="transaction"&&typeof r=="function"?(...o)=>dv(()=>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 uv=Y(()=>{"use strict";qf();Ku();c(un,"notifyUser")});var O=Y(()=>{"use strict";Ku();qf();Df();uv()});function oI(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Sl(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]*${oI(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]*${oI(s)}[^\\n]*\\n([\\s\\S]*?)(?=\\nContents of |$)`,"i"))?.[1]?.trim();if(a)return a}}return null}var xg=Y(()=>{"use strict";c(oI,"escapeRegExp");c(Sl,"extractInstructionSection")});var cI={};lo(cI,{GRADUATION_MIN_N:()=>Gc,decideGraduation:()=>iI,graduatedRulesForRender:()=>Rg,instructionContentHash:()=>Yr,maybeGraduate:()=>aI,settleExperiment:()=>ji,verdictRowsForExperiments:()=>Rl});import{createHash as zj}from"node:crypto";import{and as xl,eq as cr,inArray as Vj,sql as sI}from"drizzle-orm";function iI(e){return e.resolution!=="resolved"||e.randomisationSuspect||e.contentChanged||e.delta===null||e.ci===null||e.measured.treated<Gc||e.measured.control<Gc?null:e.delta>0?"always":"never"}function Yr(e,t){let n=Sl(e,t);return n?zj("sha256").update(n).digest("hex"):null}async function aI(e){let{experimentId:t,userId:n,verdict:r}=e,o=iI(r);if(o===null)return null;let[s]=await u.select({id:U.id,instructionId:U.instructionId,projectPath:U.projectPath,status:U.status}).from(U).where(xl(cr(U.id,t),cr(U.userId,n)));if(!s||s.status!=="running")return null;let[i]=await u.select({content:g.content,name:g.name}).from(g).where(cr(g.id,s.instructionId)),a=Yr(i?.content,i?.name);if(!a)return null;let l=(await u.execute(sI`
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 Z_=Object.defineProperty;var c=(e,t)=>Z_(e,"name",{value:t,configurable:!0})
9
9
  AND s.user_id = a.user_id
10
10
  WHERE a.experiment_id = ${t}
11
11
  AND s.analysis->>'outcome' IS NOT NULL
12
- `))[0];return await u.insert(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`
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(U).set({status:"stopped",stoppedReason:"graduated"}).where(cr(U.id,t)),o}async function ji(e){let{experimentId:t,userId:n,verdict:r,source:o,status:s}=e;return s!=="running"?null:r.contentChanged?(await u.update(U).set({status:"stopped",stoppedReason:"content_changed"}).where(xl(cr(U.id,t),cr(U.userId,n))),"content_changed"):await aI({experimentId:t,userId:n,verdict:r})?"graduated":o==="trial"&&r.resolution==="inconclusive"&&!r.randomisationSuspect&&r.measured.treated>=Gc&&r.measured.control>=Gc?(await u.update(U).set({status:"stopped",stoppedReason:"trial_neutral"}).where(xl(cr(U.id,t),cr(U.userId,n))),await u.execute(sI`
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 Z_=Object.defineProperty;var c=(e,t)=>Z_(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 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(`
20
+ `),"trial_neutral"):null}async function Rg(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,cr(Z.instructionId,g.id)).where(xl(cr(Z.userId,e),cr(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 Rl(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(Vj(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 Gc,Is=Y(()=>{"use strict";O();xg();Gc=25;c(iI,"decideGraduation");c(Yr,"instructionContentHash");c(aI,"maybeGraduate");c(ji,"settleExperiment");c(Rg,"graduatedRulesForRender");c(Rl,"verdictRowsForExperiments")});var lP,pP,YI=Y(()=>{"use strict";lP=["claude_code","cursor","vscode_copilot","copilot_agent","rulemetric_mcp","codex","pi","opencode","antigravity"],pP=["user_message","assistant_message","tool_call","tool_result","thinking","error"]});var Ji,Wg=Y(()=>{"use strict";Ji=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 p=[],m=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")p.push({sequence:m++,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"&&p.push({sequence:m++,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,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={};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 S of v)S.type==="text"?p.push({sequence:m++,eventType:"assistant_message",content:S.text??"",toolName:null,toolInput:null,toolOutput:null,tokenUsage:b,timestamp:h,metadata:A}):S.type==="thinking"?p.push({sequence:m++,eventType:"thinking",content:S.thinking??"",toolName:null,toolInput:null,toolOutput:null,tokenUsage:b,timestamp:h,metadata:A}):S.type==="tool_use"&&p.push({sequence:m++,eventType:"tool_call",content:null,toolName:S.name??"unknown",toolInput:S.input??null,toolOutput:null,tokenUsage:b,timestamp:h,metadata:{...A,toolUseId:S.id}})}}let _=p.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:p,metadata:a}}}});var Ki,zg=Y(()=>{"use strict";Ki=class{static{c(this,"CursorAdapter")}tool="cursor";parse(t){let n=Im("better-sqlite3"),r=new n(t,{readonly:!0});try{let o=r.prepare("SELECT value FROM ItemTable WHERE key = 'composer.composerData'").get();return o?this.parseComposerJson(o.value):this.emptySession()}finally{r.close()}}parseComposerJson(t){let n;try{n=JSON.parse(t)}catch{return this.emptySession()}let r=Object.values(n.allComposers??{});if(r.length===0)return this.emptySession();let o=r.sort((l,p)=>{let m=l.createdAt?new Date(l.createdAt).getTime():0;return(p.createdAt?new Date(p.createdAt).getTime():0)-m})[0],s=o.conversation??[],i=[];for(let l=0;l<s.length;l++){let p=s[l],m=p.createdAt??new Date().toISOString();i.push({sequence:l,eventType:p.type===1?"user_message":"assistant_message",content:p.text,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:m,metadata:{}})}let a=i.map(l=>l.timestamp).sort(),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 Gi,Vg=Y(()=>{"use strict";Gi=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 p=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:p,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 Yi,Jg=Y(()=>{"use strict";Yi=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 p of d.toolCalls){let m=p.timestamp?new Date(p.timestamp).toISOString():l;o.push({sequence:s++,eventType:"tool_call",content:null,toolName:p.name??"unknown",toolInput:p.input??null,toolOutput:p.output??null,tokenUsage:null,timestamp:m,metadata:{}})}if(d.response){let p=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:p,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 Xi,Kg=Y(()=>{"use strict";Xi=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 mP(e){try{return JSON.parse(e)}catch{return e}}function XI(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 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(`
23
+ `):""}function fP(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 gP(e){if(!e)return new Date().toISOString();let t=new Date(e);return Number.isFinite(t.getTime())?t.toISOString():new Date().toISOString()}function Gg(){return{sequence:0,model:null,prevCumulativeTotal:0,callNames:{}}}var Qi,Yg=Y(()=>{"use strict";c(mP,"safeJsonParse");c(XI,"textFromBlocks");c(fP,"tokenUsageFromCodex");c(gP,"normalizeTimestamp");c(Gg,"freshCodexState");Qi=class{static{c(this,"CodexAdapter")}tool="codex";parse(t){let n=Gg(),{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(p=>p.trim()),o=[],s={},i=n.callNames,a=null,d=null,l=null;for(let p of r){let m;try{m=JSON.parse(p)}catch{continue}let _=m.payload;if(!_)continue;let w=gP(m.timestamp);if(m.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(m.type==="turn_context"){a=_.cwd??a,_.model&&(n.model=_.model,s.model=_.model);continue}if(m.type==="response_item"&&_.type==="message"){if(_.role==="user"){let f=XI(_.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=XI(_.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(m.type==="response_item"&&_.type==="function_call"){let f=_.name??"unknown";_.call_id&&(i[_.call_id]=f);let h=typeof _.arguments=="string"?mP(_.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(m.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(m.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=fP(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 ad(e){let t=hP[e];if(!t)throw new Error(`Unknown session tool: ${e}`);return t()}function cd(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 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=`
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 hP,QI=Y(()=>{"use strict";Wg();zg();Vg();Jg();Kg();Yg();hP={claude_code:c(()=>new Ji,"claude_code"),cursor:c(()=>new Ki,"cursor"),vscode_copilot:c(()=>new Gi,"vscode_copilot"),copilot_agent:c(()=>new Yi,"copilot_agent"),rulemetric_mcp:c(()=>new Xi,"rulemetric_mcp"),codex:c(()=>new Qi,"codex")};c(ad,"getAdapter");c(cd,"detectTool")});import{readdir as Xg,stat as Qg}from"fs/promises";import{basename as _P,join as Po}from"path";import{homedir as zl}from"os";function wP(){return process.env.CLAUDE_CONFIG_DIR||Po(zl(),".claude")}function vP(){return Po(wP(),"projects")}function IP(){return process.platform==="darwin"?Po(zl(),"Library","Application Support","Claude","local-agent-mode-sessions"):process.platform==="win32"?Po(zl(),"AppData","Roaming","Claude","local-agent-mode-sessions"):Po(zl(),".config","Claude","local-agent-mode-sessions")}async function bP(e){let t=[];async function n(r,o){if(o>8)return;let s=await Xg(r).catch(()=>[]);for(let i of s){if(i==="node_modules"||i===".git")continue;let a=Po(r,i);if((await Qg(a).catch(()=>null))?.isDirectory())if(i==="projects"){let l=await Xg(a).catch(()=>[]);for(let p of l){let m=Po(a,p);(await Qg(m).catch(()=>null))?.isDirectory()&&t.push(m)}}else await n(a,o+1)}}return c(n,"walk"),await n(e,0),t}var yP,ZI,eb=Y(()=>{"use strict";yP={"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(wP,"getClaudeDir");c(vP,"getProjectsDir");c(IP,"getDesktopSessionsDir");c(bP,"findDesktopProjectDirs");ZI={name:"claude",displayName:"Claude Code",modelDisplayName(e){let t=e.replace(/@.*$/,"").replace(/-\d{8}$/,"");for(let[n,r]of Object.entries(yP))if(t.startsWith(n))return r;return t},toolDisplayName(e){return e},async discoverSessions(){let e=[],t=vP();try{let r=await Xg(t);for(let o of r){let s=Po(t,o);(await Qg(s).catch(()=>null))?.isDirectory()&&e.push({path:s,project:o,provider:"claude"})}}catch{}let n=await bP(IP());for(let r of n)e.push({path:r,project:_P(r),provider:"claude"});return e},createSessionParser(){return{async*parse(){}}}}});import{readdir as Vl,readFile as tb,stat as EP}from"fs/promises";import{basename as AP,join as Zi}from"path";import{homedir as SP}from"os";function RP(){return process.env.CODEX_HOME??Zi(SP(),".codex")}function TP(e){return e.replace(/^\//,"").replace(/\//g,"-")}async function kP(e){try{let n=(await tb(e,"utf-8")).split(`
27
+ `)[0];return n?.trim()?JSON.parse(n):null}catch{return null}}async function jP(e){let t=await kP(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 NP(e){let t=Zi(e,"sessions"),n=[],r;try{r=await Vl(t)}catch{return n}for(let o of r){if(!/^\d{4}$/.test(o))continue;let s=Zi(t,o),i=await Vl(s).catch(()=>[]);for(let a of i){if(!/^\d{2}$/.test(a))continue;let d=Zi(s,a),l=await Vl(d).catch(()=>[]);for(let p of l){if(!/^\d{2}$/.test(p))continue;let m=Zi(d,p),_=await Vl(m).catch(()=>[]);for(let w of _){if(!w.startsWith("rollout-")||!w.endsWith(".jsonl"))continue;let f=Zi(m,w);if(!(await EP(f).catch(()=>null))?.isFile())continue;let{valid:v,meta:I}=await jP(f);if(!v||!I)continue;let b=I.payload?.cwd??"unknown";n.push({path:f,project:TP(b),provider:"codex"})}}}}return n}function PP(e,t){return e?.info?.model??e?.info?.model_name??t??"gpt-5"}function DP(e,t){return{async*parse(){let n;try{n=await tb(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,p=0,m=[],_="";for(let w of r){let f;try{f=JSON.parse(w)}catch{continue}if(f.type==="session_meta"){s=f.payload?.session_id??AP(e.path,".jsonl"),o=f.payload?.model;continue}if(f.type==="response_item"&&f.payload?.type==="function_call"){let h=f.payload.name??"";m.push(nb[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,b=0,A=0,S=0,E=0;if(I)b=I.input_tokens??0,A=I.cached_input_tokens??0,S=I.output_tokens??0,E=I.reasoning_output_tokens??0;else if(v>0){let q=h.total_token_usage;if(!q)continue;b=(q.input_tokens??0)-a,A=(q.cached_input_tokens??0)-d,S=(q.output_tokens??0)-l,E=(q.reasoning_output_tokens??0)-p}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,p=q.reasoning_output_tokens??0)}if(b+A+S+E===0)continue;let P=Math.max(0,b-A),H=PP(f.payload,o),N=f.timestamp??"",L=`codex:${e.path}:${N}:${v}`;if(t.has(L))continue;t.add(L),yield{provider:"codex",model:H,inputTokens:P,outputTokens:S,cacheCreationInputTokens:0,cacheReadInputTokens:A,cachedInputTokens:A,reasoningTokens:E,costUSD:0,tools:m,bashCommands:[],timestamp:N,speed:"standard",deduplicationKey:L,userMessage:_,sessionId:s},m=[],_=""}}}}}var xP,nb,rb,ob=Y(()=>{"use strict";xP={"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"},nb={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(RP,"getCodexDir");c(TP,"sanitizeProject");c(kP,"readFirstLine");c(jP,"isValidCodexSession");c(NP,"discoverSessionsInDir");c(PP,"resolveModel");c(DP,"createParser");rb={name:"codex",displayName:"Codex",modelDisplayName(e){for(let[t,n]of Object.entries(xP))if(e.startsWith(t))return n;return e},toolDisplayName(e){return nb[e]??e},async discoverSessions(){return NP(RP())},createSessionParser(e,t){return DP(e,t)}}});import{readdir as OP,readFile as sb,stat as CP}from"fs/promises";import{basename as ib,dirname as LP,join as Zg}from"path";import{homedir as MP}from"os";function UP(){return Zg(MP(),".copilot","session-state")}function HP(e){let t=e.match(/^cwd:\s*(.+)$/m);return t?.[1]&&t[1].replace(/\s*#.*$/,"").replace(/^['"]|['"]$/g,"").trim()||null}function BP(e,t){return{async*parse(){let n;try{n=await sb(e.path,"utf-8")}catch{return}let r=ib(LP(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:p,toolRequests:m=[]}=d.data;if(p===0||!s)continue;let _=`copilot:${r}:${l}`;if(t.has(_))continue;t.add(_);let w=m.map(f=>f.name??"").filter(Boolean).map(f=>ab[f]??f);yield{provider:"copilot",model:s,inputTokens:0,outputTokens:p,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 FP(e){let t=[],n;try{n=await OP(e)}catch{return t}for(let r of n){let o=Zg(e,r,"events.jsonl");if(!(await CP(o).catch(()=>null))?.isFile())continue;let i=r;try{let a=await sb(Zg(e,r,"workspace.yaml"),"utf-8"),d=HP(a);d&&(i=ib(d))}catch{}t.push({path:o,project:i,provider:"copilot"})}return t}var $P,ab,qP,cb,db=Y(()=>{"use strict";$P={"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"},ab={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"},qP=Object.entries($P).sort((e,t)=>t[0].length-e[0].length);c(UP,"getCopilotSessionStateDir");c(HP,"parseCwd");c(BP,"createParser");c(FP,"discoverSessionsInDir");cb={name:"copilot",displayName:"GitHub Copilot",modelDisplayName(e){for(let[t,n]of qP)if(e===t||e.startsWith(t+"-"))return n;return e},toolDisplayName(e){return ab[e]??e},async discoverSessions(){return FP(UP())},createSessionParser(e,t){return BP(e,t)}}});import{readdir as ub,readFile as pb,stat as lb}from"fs/promises";import{basename as mb,join as eh}from"path";import{homedir as WP}from"os";function JP(){return eh(WP(),".pi","agent","sessions")}async function KP(e){try{let n=(await pb(e,"utf-8")).split(`
30
+ `)[0];return n?.trim()?JSON.parse(n):null}catch{return null}}function GP(e){return e.split(/[;&|]+/).map(t=>t.trim().split(/\s+/)[0]).filter(Boolean)}async function YP(e){let t=[],n;try{n=await ub(e)}catch{return t}for(let r of n){let o=eh(e,r);if(!(await lb(o).catch(()=>null))?.isDirectory())continue;let i;try{i=await ub(o)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let d=eh(o,a);if(!(await lb(d).catch(()=>null))?.isFile())continue;let p=await KP(d);if(!p||p.type!=="session")continue;let m=p.cwd??r;t.push({path:d,project:mb(m),provider:"pi"})}}return t}function XP(e,t){return{async*parse(){let n;try{n=await pb(e.path,"utf-8")}catch{return}let r=n.split(`
31
+ `).filter(i=>i.trim()),o=mb(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 E=(l.content??[]).filter(T=>T.type==="text").map(T=>T.text??"").filter(Boolean);E.length>0&&(s=E.join(" "));continue}if(l.role!=="assistant"||!l.usage)continue;let{input:p,output:m,cacheRead:_,cacheWrite:w}=l.usage;if(p===0&&m===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(E=>E.type==="toolCall"&&E.name),b=I.map(E=>fb[E.name]??E.name),A=I.filter(E=>E.name==="bash").flatMap(E=>{let T=E.arguments?.command;return typeof T=="string"?GP(T):[]}),S=d.timestamp??"";yield{provider:"pi",model:f,inputTokens:p,outputTokens:m,cacheCreationInputTokens:w,cacheReadInputTokens:_,cachedInputTokens:_,reasoningTokens:0,costUSD:0,tools:b,bashCommands:A,timestamp:S,speed:"standard",deduplicationKey:v,userMessage:s,sessionId:o},s=""}}}}var zP,fb,VP,gb,hb=Y(()=>{"use strict";zP={"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"},fb={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"},VP=Object.entries(zP).sort((e,t)=>t[0].length-e[0].length);c(JP,"getPiSessionsDir");c(KP,"readFirstEntry");c(GP,"extractBashCommands");c(YP,"discoverSessionsInDir");c(XP,"createParser");gb={name:"pi",displayName:"Pi",modelDisplayName(e){for(let[t,n]of VP)if(e.startsWith(t))return n;return e},toolDisplayName(e){return fb[e]??e},async discoverSessions(){return YP(JP())},createSessionParser(e,t){return XP(e,t)}}});var yb={};lo(yb,{cursor:()=>sD});import{existsSync as QP}from"fs";import{join as th}from"path";import{homedir as nh}from"os";function _b(){if(Jl)return!0;try{return Jl=Im("better-sqlite3"),!0}catch{return!1}}function tD(){return process.platform==="darwin"?th(nh(),"Library","Application Support","Cursor","User","globalStorage","state.vscdb"):process.platform==="win32"?th(nh(),"AppData","Roaming","Cursor","User","globalStorage","state.vscdb"):th(nh(),".config","Cursor","User","globalStorage","state.vscdb")}function nD(e){return!e||e==="default"?ZP:e}function oD(e,t){return{async*parse(){if(!_b()||!Jl)return;let n;try{n=new Jl(e.path,{readonly:!0})}catch{return}try{let o=n.prepare(rD).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",p=`cursor:${l}:${d}:${i}:${a}`;if(t.has(p))continue;t.add(p);let m=nD(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:p,userMessage:s.user_text??"",sessionId:l}}}finally{n.close()}}}}var Jl,ZP,eD,rD,sD,wb=Y(()=>{"use strict";Jl=null;c(_b,"loadSqlite");ZP="claude-sonnet-4-5",eD={"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(tD,"getCursorDbPath");c(nD,"resolveModel");rD=`
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 Z_=Object.defineProperty;var c=(e,t)=>Z_(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");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
43
+ `;c(oD,"createParser");sD={name:"cursor",displayName:"Cursor",modelDisplayName(e){return eD[e]??e},toolDisplayName(e){return e},async discoverSessions(){if(!_b())return[];let e=tD();return QP(e)?[{path:e,project:"cursor",provider:"cursor"}]:[]},createSessionParser(e,t){return oD(e,t)}}});var bb={};lo(bb,{opencode:()=>fD});import{readdir as iD}from"fs/promises";import{join as rh}from"path";import{homedir as aD}from"os";function oh(){if(ea)return!0;try{return ea=Im("better-sqlite3"),!0}catch{return!1}}function vb(e){return e.replace(/^\//,"").replace(/\//g,"-")}function cD(){let e=process.env.XDG_DATA_HOME??rh(aD(),".local","share");return rh(e,"opencode")}async function dD(e){try{return(await iD(e)).filter(n=>n.startsWith("opencode")&&n.endsWith(".db")).map(n=>rh(e,n))}catch{return[]}}function uD(e){let t=e<1e12?e*1e3:e;return new Date(t).toISOString()}function lD(e){return e.split(/[;&|]+/).map(t=>t.trim().split(/\s+/)[0]).filter(Boolean)}function pD(e,t){return{async*parse(){if(!oh()||!ea)return;let n=e.path.split(":"),r=n[n.length-1],o=n.slice(0,-1).join(":"),s;try{s=new ea(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 p of a)try{let m=JSON.parse(p.data),_=d.get(p.message_id)??[];_.push(m),d.set(p.message_id,_)}catch{}let l="";for(let p of i){let m;try{m=JSON.parse(p.data)}catch{continue}if(m.role==="user"){let A=(d.get(p.id)??[]).filter(S=>S.type==="text").map(()=>"").filter(Boolean);A.length>0&&(l=A.join(" "));continue}if(m.role!=="assistant")continue;let _={input:m.tokens?.input??0,output:m.tokens?.output??0,reasoning:m.tokens?.reasoning??0,cacheRead:m.tokens?.cache?.read??0,cacheWrite:m.tokens?.cache?.write??0};if(_.input===0&&_.output===0&&_.reasoning===0&&_.cacheRead===0&&_.cacheWrite===0&&(m.cost??0)===0)continue;let h=(d.get(p.id)??[]).filter(A=>A.type==="tool"),v=h.map(A=>Ib[A.tool??""]??A.tool??"").filter(Boolean),I=h.filter(A=>A.tool==="bash"&&typeof A.state?.input?.command=="string").flatMap(A=>lD(A.state.input.command)),b=`opencode:${r}:${p.id}`;t.has(b)||(t.add(b),yield{provider:"opencode",model:m.modelID??"unknown",inputTokens:_.input,outputTokens:_.output,cacheCreationInputTokens:_.cacheWrite,cacheReadInputTokens:_.cacheRead,cachedInputTokens:_.cacheRead,reasoningTokens:_.reasoning,costUSD:m.cost??0,tools:v,bashCommands:I,timestamp:uD(p.time_created),speed:"standard",deduplicationKey:b,userMessage:l,sessionId:r})}}finally{s.close()}}}}async function mD(e){if(!oh()||!ea)return[];let t;try{t=new ea(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?vb(r.directory):vb(r.title),provider:"opencode"}))}catch{return[]}finally{t.close()}}var ea,Ib,fD,Eb=Y(()=>{"use strict";ea=null;c(oh,"loadSqlite");Ib={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(vb,"sanitize");c(cD,"getDataDir");c(dD,"findDbFiles");c(uD,"parseTimestamp");c(lD,"extractBashCommands");c(pD,"createParser");c(mD,"discoverFromDb");fD={name:"opencode",displayName:"OpenCode",modelDisplayName(e){return e.replace(/^[^/]+\//,"")},toolDisplayName(e){return Ib[e]??e},async discoverSessions(){if(!oh())return[];let e=await dD(cD()),t=[];for(let n of e)t.push(...await mD(n));return t},createSessionParser(e,t){return pD(e,t)}}});async function kb(){if(Sb)return Ab;Sb=!0;try{let{cursor:e}=await Promise.resolve().then(()=>(wb(),yb));return Ab=e,e}catch{return null}}async function jb(){if(Rb)return xb;Rb=!0;try{let{opencode:e}=await Promise.resolve().then(()=>(Eb(),bb));return xb=e,e}catch{return null}}async function sh(){let[e,t]=await Promise.all([kb(),jb()]),n=[...Tb];return e&&n.push(e),t&&n.push(t),n}async function Nb(e){let t=await sh(),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 Pb(e){return e==="cursor"?await kb()??void 0:e==="opencode"?await jb()??void 0:Tb.find(t=>t.name===e)}var Tb,Ab,Sb,xb,Rb,Db=Y(()=>{"use strict";eb();ob();db();hb();Tb=[ZI,rb,cb,gb],Ab=null,Sb=!1;c(kb,"loadCursor");xb=null,Rb=!1;c(jb,"loadOpenCode");c(sh,"getAllProviders");c(Nb,"discoverAllSessions");c(Pb,"getProvider")});import{spawn as gD}from"node:child_process";function Kl(e){return`rm-${e.trim().replace(/[^A-Za-z0-9_.-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,80)||"session"}`}function Gl(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 dd(e,t,n={}){return n.literal===!1?["send-keys","-t",e,t]:["send-keys","-t",e,"-l","--",t]}function Ob(e){return["has-session","-t",e]}function ud(e){return`tmux attach -t ${e}`}function hD(){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 ih(e){return new Promise(t=>{let n=gD("tmux",e,{stdio:["ignore","ignore","pipe"],env:hD()}),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 Cb(){return(await ih(["-V"])).code===0}var ah=Y(()=>{"use strict";c(Kl,"sanitizeTmuxName");c(Gl,"buildTmuxLaunchArgs");c(dd,"buildTmuxSendKeysArgs");c(Ob,"buildTmuxHasSessionArgs");c(ud,"buildTmuxAttachCommand");c(hD,"tmuxSpawnEnv");c(ih,"runTmux");c(Cb,"isTmuxAvailable")});import{spawn as ch}from"node:child_process";import{randomUUID as _D}from"node:crypto";import{writeFile as Lb}from"node:fs/promises";import{tmpdir as Mb}from"node:os";import{join as $b}from"node:path";function wD(e){if(e!==void 0){if(yD.test(e))return e;console.warn(`[claude-code-launcher] dropping non-uuid runId (RULEMETRIC_RUN_ID not injected): ${JSON.stringify(e)}`)}}function vD(e){return`'${e.replace(/'/g,"'\\''")}'`}var yD,Yl,qb=Y(()=>{"use strict";ah();yD=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;c(wD,"validateRunId");c(vD,"shellSingleQuote");Yl=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=_D(),r={...t,runId:wD(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=ch("claude",r,{cwd:t.projectPath,env:o,stdio:["ignore","pipe","pipe"]}),a="",d="";i.stdout.on("data",p=>{a+=p.toString()}),i.stderr.on("data",p=>{d+=p.toString()});let l=t.timeout?setTimeout(()=>{i.kill("SIGTERM")},t.timeout):null;i.on("close",p=>{l&&clearTimeout(l);let m=a;try{let _=JSON.parse(a);m=_.result??_.content??a}catch{}s({sessionId:n,pid:i.pid,exitCode:p,output:m,error:p!==0?d: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??Cb)().catch(()=>!1)?this.launchInteractiveTmux(t,n):this.launchInteractiveTerminal(t,n,"tmux_not_found")}async launchInteractiveTmux(t,n){let r=this.options.runTmux??ih,o=Kl(`claude-${t.resumeSessionId??n}`),s=await r(Gl({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(dd(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(dd(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:ud(o),live:!0}}}async openTerminalAttach(t,n){let r=$b(Mb(),`rulemetric-attach-${n}.command`),o=`#!/bin/zsh
44
44
  rm -- "$0"
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)}
45
+ ${ud(t)}
46
+ `;return await Lb(r,o,{mode:493}),new Promise(s=>{let i=ch("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=$b(Mb(),`rulemetric-launch-${n}.command`),d=t.runId?`export RULEMETRIC_RUN_ID=${vD(t.runId)}
47
47
  `:"",l=`#!/bin/zsh
48
48
  rm -- "$0"
49
49
  cd ${JSON.stringify(t.projectPath)} || exit
50
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}
51
+ `;return await Lb(a,l,{mode:493}),new Promise(p=>{let m=ch("open",["-a","Terminal",a],{stdio:["ignore","pipe","pipe"]}),_="";m.stderr.on("data",w=>{_+=w.toString()}),m.on("close",w=>{if(w===0)p({sessionId:n,pid:m.pid,liveSendAvailable:!1,fallbackReason:r,...o?{error:o}:{}});else{let f=_.trim()||"no stderr";p({sessionId:n,pid:m.pid,liveSendAvailable:!1,fallbackReason:r,error:o?`${o}; open exited ${w}: ${f}`:`open exited ${w}: ${f}`})}}),m.on("error",w=>{p({sessionId:n,liveSendAvailable:!1,fallbackReason:r,error:`Failed to spawn open: ${w.message}`})})})}}});import{spawn as Ub}from"node:child_process";import{randomUUID as ID}from"node:crypto";var Xl,Hb=Y(()=>{"use strict";Xl=class{static{c(this,"CodexLauncher")}tool="codex";capabilities={headless:!0,interactive:!0,remoteSpawn:!0};async launch(t){let n=ID();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=Ub("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=Ub("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 Bb}from"node:child_process";import{randomUUID as bD}from"node:crypto";var Ql,Fb=Y(()=>{"use strict";Ql=class{static{c(this,"AiderLauncher")}tool="aider";capabilities={headless:!0,interactive:!0,remoteSpawn:!0};async launch(t){let n=bD();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=Bb("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=Bb("osascript",["-e",`tell application "Terminal" to do script ${JSON.stringify(o)}`],{stdio:"ignore",detached:!0});return s.unref(),Promise.resolve({sessionId:n,pid:s.pid})}}});import{spawn as ED}from"node:child_process";import{randomUUID as AD}from"node:crypto";var Zl,Wb=Y(()=>{"use strict";Zl=class{static{c(this,"GenericLauncher")}tool;constructor(t){this.tool=t}capabilities={headless:!1,interactive:!0,remoteSpawn:!1};async launch(t){let n=AD();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=ED("osascript",["-e",`tell application "Terminal" to do script ${JSON.stringify(r)}`],{stdio:"ignore",detached:!0});return o.unref(),{sessionId:n,pid:o.pid}}}});function Vb(e){let t=zb[e];return t?t():new Zl(e)}function Jb(){return Object.entries(zb).map(([e,t])=>({tool:e,capabilities:t().capabilities}))}var zb,Kb=Y(()=>{"use strict";qb();Hb();Fb();Wb();zb={claude_code:c(()=>new Yl,"claude_code"),codex:c(()=>new Xl,"codex"),aider:c(()=>new Ql,"aider")};c(Vb,"getLauncher");c(Jb,"getAvailableLaunchers")});import Gb from"node:path";function dh(e){return e.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^[-.]+|[-.]+$/g,"")||"worktree"}function ep(e){return Gb.resolve(e.basePath??Gb.join(e.repoRoot,"..",".rulemetric-worktrees",dh(e.branch)))}var Yb=Y(()=>{"use strict";c(dh,"sanitizeBranch");c(ep,"worktreePathFor")});var Xb={};lo(Xb,{ClaudeCodeAdapter:()=>Ji,CodexAdapter:()=>Qi,CopilotAgentAdapter:()=>Yi,CursorAdapter:()=>Ki,RuleMetricMcpAdapter:()=>Xi,SESSION_EVENT_TYPES:()=>pP,SESSION_TOOLS:()=>lP,VSCodeCopilotAdapter:()=>Gi,buildTmuxAttachCommand:()=>ud,buildTmuxHasSessionArgs:()=>Ob,buildTmuxLaunchArgs:()=>Gl,buildTmuxSendKeysArgs:()=>dd,detectTool:()=>cd,discoverAllSessions:()=>Nb,freshCodexState:()=>Gg,getAdapter:()=>ad,getAllProviders:()=>sh,getAvailableLaunchers:()=>Jb,getLauncher:()=>Vb,getProvider:()=>Pb,sanitizeBranch:()=>dh,sanitizeTmuxName:()=>Kl,worktreePathFor:()=>ep});var tp=Y(()=>{"use strict";YI();Wg();zg();Vg();Jg();Kg();Yg();QI();Db();Kb();Yb();ah()});var s0={};lo(s0,{getSupabaseAdmin:()=>Jn});import{createClient as UD}from"@supabase/supabase-js";function Jn(){if(ip)return ip;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 ip=UD(e,t,{auth:{autoRefreshToken:!1,persistSession:!1}}),ip}var ip,ld=Y(()=>{"use strict";ip=null;c(Jn,"getSupabaseAdmin")});var d0={};lo(d0,{SNAPSHOT_DELTA_BUCKET:()=>ph,decodeDeltaBlob:()=>i0,encodeDeltaBlob:()=>mh,getDeltaBlob:()=>pd,resolveDeltaPage:()=>md,resolveFullRows:()=>gh,uploadEncodedDelta:()=>fh});import{gzipSync as HD,gunzipSync as BD}from"node:zlib";import{createHash as FD}from"node:crypto";function mh(e){let t=JSON.stringify(e??[]),n=HD(Buffer.from(t,"utf-8")),r=FD("sha256").update(n).digest("hex");return{body:n,ref:`sha256/${r}.json.gz`,bytes:n.byteLength}}function i0(e){try{let t=BD(Buffer.from(e)).toString("utf-8"),n=JSON.parse(t);return Array.isArray(n)?n:[]}catch{return[]}}async function fh(e){let{body:t,ref:n,bytes:r}=e,{error:o}=await Jn().storage.from(ph).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 pd(e){let{data:t,error:n}=await Jn().storage.from(ph).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 i0(r)}function ap(e){return typeof e.messagesDeltaRef=="string"&&e.messagesDeltaRef.length>0}async function c0(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 md(e){return e.some(ap)?c0(e,a0,async t=>({sequence:t.sequence,messagesDelta:ap(t)?await pd(t.messagesDeltaRef):t.messagesDelta})):e.map(t=>({sequence:t.sequence,messagesDelta:t.messagesDelta}))}async function gh(e){return e.some(ap)?c0(e,a0,async t=>ap(t)?{...t,messagesDelta:await pd(t.messagesDeltaRef)}:t):e}var ph,a0,cp=Y(()=>{"use strict";ld();ph="snapshot-deltas";c(mh,"encodeDeltaBlob");c(i0,"decodeDeltaBlob");c(fh,"uploadEncodedDelta");c(pd,"getDeltaBlob");a0=8;c(ap,"hasRef");c(c0,"mapCapped");c(md,"resolveDeltaPage");c(gh,"resolveFullRows")});var aS={};lo(aS,{resolveRuntimeWebConfig:()=>iS,stampRuntimeConfig:()=>mU});function iS(e=process.env){let t=e.SUPABASE_URL?.trim(),n=e.SUPABASE_ANON_KEY?.trim();return!t||!n?null:{supabaseUrl:t,supabaseAnonKey:n}}function mU(e,t=process.env){let n=iS(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 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`
53
+ ${e}`}var cS=Y(()=>{"use strict";c(iS,"resolveRuntimeWebConfig");c(mU,"stampRuntimeConfig")});import*as fm from"node:fs";import*as gm from"node:path";import{fileURLToPath as VU}from"node:url";import{serve as JU}from"@hono/node-server";import{trace as sy,context as $S}from"@opentelemetry/api";import{NodeSDK as qS}from"@opentelemetry/sdk-node";import{OTLPTraceExporter as US}from"@opentelemetry/exporter-trace-otlp-http";import{BatchSpanProcessor as HS,ConsoleSpanExporter as BS,SimpleSpanProcessor as FS}from"@opentelemetry/sdk-trace-node";import{Resource as WS}from"@opentelemetry/resources";import{ATTR_SERVICE_NAME as zS,ATTR_SERVICE_VERSION as VS}from"@opentelemetry/semantic-conventions";function oy(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(oy,"parseOtlpHeaders");var Zs=null;function ei(){return process.env.TELEMETRY_ENABLED!=="false"}c(ei,"isTelemetryEnabled");function bm(e){if(!ei()||Zs!==null)return"off";let t=new WS({[zS]:e.serviceName,[VS]:e.serviceVersion??"0.1.0"}),n=process.env.OTEL_EXPORTER_OTLP_ENDPOINT,r,o;if(n){let s=oy(process.env.OTEL_EXPORTER_OTLP_HEADERS),i=new US({url:`${n}/v1/traces`,headers:s});o=new HS(i),r="otlp"}else if(process.env.OTEL_SPAN_EXPORT==="none")o=void 0,r="silent";else{let s=new BS;o=new FS(s),r="console"}return Zs=new qS({resource:t,spanProcessors:o?[o]:[]}),Zs.start(),r}c(bm,"initTelemetry");async function Em(){Zs&&(await Zs.shutdown(),Zs=null)}c(Em,"shutdownTelemetry");function Am(e){return sy.getTracer(e??"rulemetric")}c(Am,"getTracer");function Sm(){return sy.getSpan($S.active())?.spanContext().traceId}c(Sm,"getTraceId");import{SpanKind as JS,SpanStatusCode as iy}from"@opentelemetry/api";function xm(){return async(e,t)=>{if(!ei()){await t();return}let n=Am(),r=e.req.method,o=e.req.path;await n.startActiveSpan(`${r} ${o}`,{kind:JS.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:iy.ERROR})}catch(i){throw s.setStatus({code:iy.ERROR}),s.recordException(i),i}finally{s.end()}})}}c(xm,"telemetryMiddleware");import{trace as KS,context as GS}from"@opentelemetry/api";function Rm(e){let t=KS.getSpan(GS.active());if(t)for(let[n,r]of Object.entries(e))t.setAttribute(n,r)}c(Rm,"setSpanAttributes");import*as Fr from"@sentry/node";var Wa=!1;function Tm(e){if(Wa)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}),Wa=!0,!0):!1}c(Tm,"initSentry");function yr(e,t){if(!Wa)return;let n=e instanceof Error?e:new Error(typeof e=="string"?e:JSON.stringify(e));Fr.captureException(n,t)}c(yr,"captureException");function za(e){if(Wa){if(e===null){Fr.setUser(null);return}Fr.setUser({id:e})}}c(za,"setSentryUser");async function Va(e){Wa&&await Fr.flush(e)}c(Va,"flushSentry");import*as ou from"node:fs";import*as Ma from"node:path";import{fileURLToPath as fU}from"node:url";import{Hono as gU}from"hono";import{cors as hU}from"hono/cors";import{bodyLimit as _U}from"hono/body-limit";import{serveStatic as yU}from"@hono/node-server/serve-static";O();import{createHash as ak}from"node:crypto";import{createClient as ck}from"@supabase/supabase-js";import{eq as hv,and as dk,isNull as uk}from"drizzle-orm";import{createHmac as QT,createPublicKey as ZT,timingSafeEqual as ek,verify as tk}from"node:crypto";var nk=6e4,kc=null,pv=0,Tc=null,rk=null;async function ok(){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(ok,"defaultJwksFetcher");async function Uf(){return Tc||(Tc=(async()=>{try{let e=await(rk??ok)(),t=new Map;for(let n of e.keys)if(n.kid)try{t.set(n.kid,ZT({key:n,format:"jwk"}))}catch{}kc=t,pv=Date.now()}finally{Tc=null}})(),Tc)}c(Uf,"refreshJwks");function lv(e){try{return JSON.parse(Buffer.from(e,"base64url").toString("utf-8"))}catch{return null}}c(lv,"decodeB64Json");function sk(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(sk,"checkPayload");function ik(e,t,n,r){let o=QT("sha256",r).update(`${e}.${t}`).digest(),s;try{s=Buffer.from(n,"base64url")}catch{return!1}return s.length!==o.length?!1:ek(s,o)}c(ik,"verifyHs256");async function mv(e){let t=e.split(".");if(t.length!==3)return{ok:!1,reason:"invalid"};let[n,r,o]=t,s=lv(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(!ik(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(kc===null)try{await Uf()}catch{return{ok:!1,reason:"unavailable"}}let d=kc?.get(s.kid);if(!d&&Date.now()-pv>=nk){try{await Uf()}catch{return{ok:!1,reason:"unavailable"}}d=kc?.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(!tk("sha256",Buffer.from(`${n}.${r}`),{key:d,dsaEncoding:"ieee-p1363"},l))return{ok:!1,reason:"invalid"}}else return{ok:!1,reason:"invalid"};let i=lv(r);if(!i)return{ok:!1,reason:"invalid"};let a=sk(i);return a?{ok:!0,userId:a.userId,payload:i}:{ok:!1,reason:"invalid"}}c(mv,"verifySupabaseJwt");async function fv(e=3){for(let t=0;t<e;t++)try{return await Uf(),kc!==null}catch{await new Promise(n=>setTimeout(n,500*2**t))}return!1}c(fv,"primeJwks");function lk(e){return ak("sha256").update(e).digest("hex")}c(lk,"hashApiKey");var gv=new Map,pk=300*1e3;function mk(e){let t=Date.now(),n=gv.get(e)??0;t-n<pk||(gv.set(e,t),u.update(Ae).set({lastUsedAt:new Date}).where(hv(Ae.id,e)).then(()=>{}).catch(()=>{}))}c(mk,"updateLastUsed");var fk=60*1e3,gk=5e3,_i=new Map;async function _v(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=lk(r),s,i=_i.get(o);if(i&&Date.now()-i.cachedAt<fk)s=i;else{i&&_i.delete(o);let[a]=await u.select({id:Ae.id,userId:Ae.userId,expiresAt:Ae.expiresAt}).from(Ae).where(dk(hv(Ae.keyHash,o),uk(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>=gk&&_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),za(s.userId),mk(s.id),await t();return}try{let o=ck(process.env.SUPABASE_URL,process.env.SUPABASE_ANON_KEY,{global:{headers:{Authorization:`Bearer ${r}`}}}),s=await mv(r);if(s.ok){e.set("userId",s.userId),e.set("supabase",o),za(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),za(a.id),await t()}catch{return e.json({error:"Authentication failed"},401)}}c(_v,"authMiddleware");O();import{HTTPException as hk}from"hono/http-exception";import{ZodError as _k}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 yk=new Set(["ECONNRESET","EPIPE","ECONNABORTED"]);function yv(e,t){return e instanceof _k?t.json({error:"Validation error",details:e.flatten().fieldErrors},400):e instanceof hk?e.getResponse():xc(e)?t.json({error:"Server draining, retry shortly"},503):Rc(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"||yk.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(yv,"errorHandler");function jc(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(jc,"rateLimit");var el=!0,Hf="",wv=0;function Bf(e,t="",n=-1){if(e===el){!e&&t&&(Hf=t);return}el=e,Hf=e?"":t,wv=n,console.log(`[db-readiness] -> ${e?"READY":"NOT READY"}${t?` (${t})`:""}`)}c(Bf,"setDbReady");function Nc(){return el}c(Nc,"isDbReady");function tl(){return{ready:el,reason:Hf,changedAt:wv}}c(tl,"dbReadiness");async function vv(e,t){return Nc()?t():(e.header("Retry-After","5"),e.json({error:"Service temporarily unavailable: the database is recovering. Retry shortly.",reason:tl().reason||void 0},503))}c(vv,"dbShed");O();var wk=5e3,Iv=0;async function bv(e,t){let n=wc(),r=mi();if(n>r){jf();let o=Date.now();return o-Iv>=wk&&(Iv=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(bv,"dbLoadShed");O();var vk=5e3,Ev=0;async function Pc(e,t){if(e.req.method!=="POST")return t();let n=wc(),r=Ic();if(n>=r){vc();let o=Date.now();return o-Ev>=vk&&(Ev=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(Pc,"ingestLoadShed");var Av=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 Sv(){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(Sv,"slowRequestLog");import{Hono as bk}from"hono";import{z as vo}from"zod";import{createClient as xv}from"@supabase/supabase-js";import{createClient as Ik}from"@supabase/supabase-js";async function nl(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=Ik(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(nl,"refreshSupabaseSession");var wi=new bk,Ek=vo.object({email:vo.string().email(),password:vo.string().min(1)}),Ak=vo.object({refreshToken:vo.string().min(1)});wi.post("/auth/login",async e=>{let t=await e.req.json(),n=Ek.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=xv(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 Sk=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=Sk.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=xv(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=Ak.safeParse(t);if(!n.success)return e.json({error:"refreshToken is required"},400);let r=await nl(n.data.refreshToken);return r.ok?e.json(r.session):e.json({error:r.error},r.status)});import{readFileSync as xk}from"node:fs";import{dirname as Rk,resolve as Ff}from"node:path";import{fileURLToPath as Tk}from"node:url";import{Hono as kk}from"hono";var jk="https://registry.npmjs.org/-/package/@rulemetric%2Fcli/dist-tags",Nk=3600*1e3,Pk=3e3,Dc=null;function Dk(){if(process.env.RULEMETRIC_BUNDLED_CLI_VERSION)return process.env.RULEMETRIC_BUNDLED_CLI_VERSION;let e=Rk(Tk(import.meta.url)),t=[Ff(e,"../../../cli/package.json"),Ff(e,"../../../../apps/cli/package.json"),Ff(process.cwd(),"apps/cli/package.json")];for(let n of t)try{let r=JSON.parse(xk(n,"utf-8"));if(r.version)return r.version}catch{}return"0.0.0"}c(Dk,"readBundledCliVersion");async function Ok(){try{let e=await fetch(jk,{headers:{accept:"application/json"},signal:AbortSignal.timeout(Pk)});if(!e.ok)return null;let t=await e.json();return typeof t.latest=="string"&&t.latest?t.latest:null}catch{return null}}c(Ok,"fetchLatestFromNpm");async function Wf(){let e=Date.now();if(Dc&&e-Dc.at<Nk)return Dc.version;let n=await Ok()??Dc?.version??Dk();return Dc={version:n,at:e},n}c(Wf,"getLatestCliVersion");var rl=new kk;rl.get("/cli/latest-version",async e=>e.json({latest:await Wf()}));import{Hono as Jk}from"hono";O();import{sql as Ck}from"drizzle-orm";var Lk=12e3,Mk=3e4,Rv=4,$k=Number(process.env.PG_RECYCLE_DEADLINE_THRESHOLD)||3,qk="pipeline:api_db_pool_wedged",Uk="pipeline:api_db_pool_recycled",vi=0;async function zf(){return Mf(Lk)}c(zf,"probeDb");function Hk(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(Hk,"flattenCauseChain");function Bk(e){let{codes:t,message:n}=Hk(e);return n.includes("max client")||n.includes("emaxconn")||n.includes("max_client_conn")||t.includes("XX000")&&n.includes("client")}c(Bk,"isPoolSaturation");function Fk(e){return Bk(e)?"Supavisor tenant saturated (client cap reached)":hi(e)?"transient connect failure":"DB unreachable / probe timed out"}c(Fk,"classifyProbeFailure");async function Wk(e=zf,t={}){let n=t.consumeDeadlines??Nf,r=t.recycle??Lf,o=t.onRecycle??Vk,s=await e();if(s.ok){let a=!Nc();vi>0&&console.log(`[db-wedge] DB reachable again after ${vi} failed probe(s)`),vi=0,Bf(!0,"",Date.now()),a&&zk();let d=n();d>=$k&&(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=Fk(s.err);console.error(`[db-wedge] dedicated DB probe failed (${vi}/${Rv}) \u2014 ${i}`),vi>=Rv&&Nc()&&(Bf(!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(Wk,"watchdogTick");async function Tv(e,t){try{await u.execute(Ck`
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(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`
59
+ `)}catch(n){console.error(`[db-wedge] failed to record ${e} alert:`,n instanceof Error?n.message:n)}}c(Tv,"dispatchSoftAlert");async function zk(){await Tv(qk,'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(zk,"reportRecovery");async function Vk(e){try{yr(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 Tv(Uk,'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(Vk,"reportPoolRecycle");function kv(){let e=setInterval(()=>{Wk().catch(()=>{})},Mk);return{stop:c(()=>clearInterval(e),"stop")}}c(kv,"startDbWedgeWatchdog");var Ii=new Jk;Ii.get("/health",e=>e.json({status:"ok"}));Ii.get("/ready",e=>{let t=tl();return e.json({ready:t.ready,reason:t.reason||void 0},t.ready?200:503)});Ii.get("/health/deep",async e=>{let t=await zf();return e.json({status:t.ok?"ok":"degraded",db:t.ok?"ok":"wedged",dbProbeMs:t.ms},t.ok?200:503)});O();import{Hono as Kk}from"hono";import{sql as Gk}from"drizzle-orm";import{execFileSync as Yk}from"node:child_process";import*as jv from"node:fs";var ol=new Kk,Xk=["/usr/sbin/lsof","/usr/bin/lsof","/bin/lsof"].find(e=>jv.existsSync(e))??"lsof";function Qk(e=process.pid){try{let t=Yk(Xk,["-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(Qk,"snapshotPoolerSockets");ol.get("/diag/pg-health",async e=>{let t=await u.execute(Gk`
61
61
  SELECT
62
62
  application_name,
63
63
  client_addr::text AS client_addr,
@@ -69,12 +69,12 @@ ${e}`}var rS=Y(()=>{"use strict";c(tS,"resolveRuntimeWebConfig");c(aU,"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=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(`
72
+ `),n=t.reduce((s,i)=>s+i.conns,0),r=Qk(),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=Pf();return{inflight_current:s.current,inflight_peak:s.peak,inflight_shed_count:s.shedCount,inflight_max:mi(),ingest_inflight_max:Ic(),ingest_shed_count:s.ingestShedCount}})()},total_backends:n,breakdown:t})});O();import{Hono as yj}from"hono";import{z as mt}from"zod";import{eq as qe,and as Ar,sql as Ei,ilike as ig,isNull as wj,or as ag,desc as Bv,inArray as Hv}from"drizzle-orm";import{z as tn}from"zod";var Nv=["org","team","project","personal"],Vf=tn.object({name:tn.string().min(1),description:tn.string().min(1),type:tn.literal("instruction").default("instruction"),scope:tn.enum(Nv),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 Pv=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 Oc(e){return e<=3?"light":e<=8?"standard":"heavy"}c(Oc,"computePackTier");var sl={claude_md:"claude_md",memory:"memory",skill_loaded:"skill"};function Jf(e,t){let n=sl[e];return n?`${n}::${t}`:null}c(Jf,"deriveContextIdentity");function Zk(e){return(e.trim().split(`
73
+ `)[0]?.replace(/^#+\s*/,"").trim()||"Suggested instruction").slice(0,120)}c(Zk,"recommendationTitle");function ej(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:Zk(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(ej,"normalizeRecommendationCandidates");function Kf(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 tj(e),ej(e),e}c(Kf,"normalizeRecommendations");function tj(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(tj,"liftNestedCandidates");import nj from"gray-matter";import{z as Dv}from"zod";var o5=Dv.object({type:Dv.enum(["instruction","prompt"])});function il(e){let{data:t,content:n}=nj(e),r=Vf.parse(t),o=r.slots??null;return{frontmatter:r,content:n.trim(),slots:o}}c(il,"parseInstruction");function bi(e){return e.replace(/[\r\n]+/g," ").trim()}c(bi,"sanitizeHeading");function Gf(e,t,n){let r=e.split(`
74
74
  `),o=t.split(`
75
75
  `),s=n.split(`
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}
76
+ `),i=Ov(r,o),a=Ov(r,s),d=[],l=[],p=0;for(;p<r.length||i.has(p)||a.has(p);){let m=i.get(p),_=a.get(p);if(m&&_)oj(m.newLines,_.newLines)?l.push(...m.newLines):(d.push({localLines:_.newLines,upstreamLines:m.newLines,startLine:p}),l.push("<<<<<<< local"),l.push(..._.newLines),l.push("======="),l.push(...m.newLines),l.push(">>>>>>> upstream")),i.delete(p),a.delete(p),p=Math.max(m.endBase,_.endBase);else if(m)l.push(...m.newLines),i.delete(p),p=m.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:d.length>0,conflicts:d}}c(Gf,"threeWayMerge");function Ov(e,t){let n=new Map,r=rj(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(Ov,"diffLines");function rj(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(rj,"computeLCS");function oj(e,t){return e.length===t.length&&e.every((n,r)=>n===t[r])}c(oj,"arraysEqual");var al=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 cl=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 sj={anthropic:c(e=>new al(e),"anthropic"),openai:c(e=>new cl(e),"openai")};function Cc(e,t){let n=sj[e];if(!n)throw new Error(`Unknown LLM provider: ${e}`);return n(t)}c(Cc,"createLLMProvider");function Lc(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 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}
110
+ Only include instructions with a relevance score >= ${.5}. Order by score descending. Return valid JSON only, no markdown fences.`}c(Lc,"buildRecommendationPrompt");function Yf(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(Yf,"parseRecommendationResponse");var Cv=32e3,ij={name:"x".repeat(64),description:"x".repeat(256),languages:["TypeScript","Python","Go"],topics:["x".repeat(32)],dependencies:["x".repeat(32)]};function Xf(e,t={}){if(e.length===0)return[];let n=t.charBudget??Cv,r=Lc(ij,[]).length,o=[],s=[],i=0;for(let a of e){let d=aj(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(Xf,"batchCandidatesForPrompt");function aj(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(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`
114
+ Preview: ${e.contentPreview}`.length+2}c(aj,"renderedSize");async function Qf(e,t,n){if(t.length===0)return{recommendations:[],error:null};let r;try{r=Cc(n.llmProvider,n.llmApiKey)}catch(a){return{recommendations:[],error:a instanceof Error?a.message:String(a)}}let o=Xf(t,{charBudget:n.charBudget}),s=[],i=[];for(let a of o)try{let d=await r.complete(Lc(e,a));s.push(...Yf(d.text))}catch(d){i.push(d instanceof Error?d.message:String(d))}return{recommendations:s,error:i.length>0?i.join("; "):null}}c(Qf,"scoreInstructions");var cj=new Set(["127.0.0.1","localhost","::1","[::1]","0.0.0.0"]);function dj(e){if(!e)return null;try{return new URL(e).hostname}catch{return null}}c(dj,"databaseUrlHost");function Zf(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=dj(e.DATABASE_URL);return n&&cj.has(n)?{mode:"local",source:"inferred"}:{mode:"cloud",source:"default"}}c(Zf,"resolveDeployment");function dl(e){if(!e||typeof e!="object")return null;let t=e.source;return t==="insights"||t==="evolution"?t:null}c(dl,"readStampedSource");function ul(e,t){let n=e.source==="insights"||e.source==="evolution"?e.source:dl(e.frontmatter);return n||(e.createdBy&&e.createdBy===t?"user":"catalog")}c(ul,"classifyProvenance");var Mc=["inside","outside"];function hs(e){return e.trim().toLowerCase()}c(hs,"normalizeDependencyKey");function tg(e){let t=[];if(Mc.includes(e.boundaryClass)||t.push({field:"boundaryClass",message:`must be one of ${Mc.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(tg,"validateArtifactSpec");function ng(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(ng,"validateArtifactInverse");var Lv="artifact";function eg(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"&&t.trim().length>0):[]}c(eg,"stringArray");function rg(e){if(!e||typeof e!="object")return null;let t=e[Lv];if(!t||typeof t!="object")return null;let n=t;return{boundaryClass:n.boundaryClass,targets:eg(n.targets),requires:eg(n.requires),provides:eg(n.provides)}}c(rg,"parseArtifactSpec");function og(e,t,n){let r=new Set((e.provides??[]).map(hs));if(r.size===0)return[];let o=[];for(let s of t){if(n&&s.id===n)continue;let i=(s.requires??[]).map(hs).filter(a=>r.has(a));i.length>0&&o.push({dependentId:s.id,dependentName:s.name,keys:i})}return o}c(og,"blockedWithdrawals");var ll=["applied","measuring","improved","inconclusive","harmful","rollback_ready"];var $c=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 pl(e){return $c.has(e)}c(pl,"needsLlmEngine");O();function nn(e){if(!ei())return;let t=Sm();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 uj={critical:25,high:15,medium:8,low:3},lj=[{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 sg(e,t,n){let r=[],o=[e,t??"",n??""].join(`
115
+ `);for(let i of lj){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-=uj[i.severity]??5;return{score:Math.max(0,Math.min(100,s)),findings:r}}c(sg,"scanContent");O();import{and as pj,arrayOverlaps as mj,eq as $v,inArray as fj,ne as gj}from"drizzle-orm";function hj(e){return hs(`skill:${e.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}`)}c(hj,"skillKeyFor");function _j(e){let t=rg(e.frontmatter)?.provides??[],n=new Set(t.map(hs));return e.type==="skill"&&n.add(hj(e.name)),[...n].filter(r=>r.length>0)}c(_j,"providedKeysFor");async function qv(e,t){let n=_j(t);if(n.length===0)return[];let r=await u.select({id:Te.id,name:g.name,requires:Te.requires}).from(Te).innerJoin(g,$v(g.id,Te.instructionId)).where(pj($v(Te.userId,e),gj(Te.instructionId,t.id),fj(Te.status,[...ll]),mj(Te.requires,n)));return og({provides:n},r.map(o=>({id:o.id,name:o.name,requires:o.requires??[],provides:[]})),t.id)}c(qv,"findBlockedWithdrawals");function Uv(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(Uv,"withdrawalRefusal");var Nn=new yj,vj=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()}),Ij=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),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(ag(ig(g.name,`%${f}%`),ig(g.description,`%${f}%`),ig(g.content,`%${f}%`)))}let l=await u.select().from(g).where(Ar(...d)).orderBy(Bv(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 p=l.map(f=>f.id),m=p.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(p.map(f=>Ei`${f}`),Ei`, `)})`):[],_=new Map;for(let f of m){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(Ar(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(Hv(g.contentHash,r)),o.length>0&&i.push(Hv(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(Ar(...s,i.length===1?i[0]:ag(...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(Ar(qe(ie.instructionId,n),qe(y.userId,t))).orderBy(Bv(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(Ar(qe(g.id,t),qe(g.archived,!1),ag(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 bj=/<\/?(?:system-reminder|system|available-deferred-tools|tool-result)>/i;function Fv(e){return bj.test(e)?"Content contains forbidden system tags":null}c(Fv,"validateNoForbiddenTags");Nn.post("/instructions",async e=>{let t=e.get("userId"),n=await e.req.json(),r=vj.parse(n),o=Fv(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 p=il(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,d=sg(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=Ij.parse(r);if(o.content){let m=Fv(o.content);if(m)return e.json({error:m},422)}o.name&&(o.name=bi(o.name)),o.description&&(o.description=bi(o.description));let[s]=await u.select().from(g).where(Ar(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 m=il(o.content);i=m.frontmatter,a=m.slots}catch{}let d={};if(o.content||o.name||o.description){let m=sg(o.content??s.content,o.name??s.name,o.description??s.description);d.scanScore=m.score,d.scanFindings=m.findings.length>0?m.findings:null}let l,p=4;for(let m=0;m<=p;m++)try{l=await u.transaction(async _=>{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"&&m<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 u.select().from(g).where(Ar(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 qv(n,r);if(i.length>0)return e.json({error:Uv(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(Ar(qe(x.userId,n),qe(x.instructionId,t),wj(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(Ar(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(Ar(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 Ej}from"hono";import{eq as Io,and as cg}from"drizzle-orm";var qc=new Ej;qc.post("/instructions/:id/fork",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(g).where(cg(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(cg(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)});qc.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(cg(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 Aj}from"hono";import{eq as ir,and as Wv,sql as Sj}from"drizzle-orm";var Uc=new Aj;Uc.get("/instructions/:id/upstream",async e=>{let t=e.req.param("id"),[n]=await u.select().from(g).where(Wv(ir(g.id,t),ir(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(ir(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})});Uc.post("/instructions/:id/pull-upstream",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(g).where(Wv(ir(g.id,n),ir(g.createdBy,t),ir(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(ir(g.id,r.forkedFromId));if(!o)return e.json({error:"Parent instruction no longer exists"},404);let[s]=await u.select().from(xe).where(ir(xe.instructionId,o.id)).orderBy(xe.versionNumber).limit(1),i=s?.content??o.content,a=Gf(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 p=0;p<=l;p++)try{d=await u.transaction(async m=>{await m.select({id:g.id}).from(g).where(ir(g.id,n)).for("update");let[_]=await m.select({maxVersion:Sj`COALESCE(MAX(${xe.versionNumber}), 0)`}).from(xe).where(ir(xe.instructionId,n)),w=(_?.maxVersion??0)+1,[f]=await m.update(g).set({content:a.merged,upstreamVersion:o.version,updatedAt:new Date}).where(ir(g.id,n)).returning();return await m.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 m.insert(Ht).values({instructionId:n,eventType:"pull_upstream",actorId:t,metadata:{parentId:o.id,parentVersion:o.version,previousUpstreamVersion:r.upstreamVersion}}),f});break}catch(m){if(m.cause?.code==="23505"&&p<l)continue;throw m}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 xj}from"hono";import{z as bo}from"zod";import{eq as Ft,and as _s,sql as Rj}from"drizzle-orm";var Tj=bo.object({scope:bo.enum(["team","org"]),scopeRef:bo.string().uuid()}),Hc=new xj;Hc.post("/instructions/:id/promote",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=Tj.parse(await e.req.json()),[o]=await u.select().from(g).where(_s(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(_s(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(_s(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 kj=bo.object({targetScope:bo.enum(["personal","team","org"]),targetScopeRef:bo.string().uuid().optional(),name:bo.string().optional(),seedEvalTarget:bo.boolean().optional()});async function jj(e){let[t]=await u.select({id:k.id}).from(k).where(Rj`${k.metadata}->>'instructionId' = ${e}`).limit(1);return t??null}c(jj,"findExistingEvalTarget");Hc.post("/instructions/:id/promote-from-public",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=kj.parse(await e.req.json()),[o]=await u.select().from(g).where(_s(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[m]=await u.select().from(we).where(_s(Ft(we.userId,t),Ft(we.teamId,r.targetScopeRef)));if(!m)return e.json({error:"You are not a member of this team"},403)}else if(r.targetScope==="org"){if(!r.targetScopeRef)return e.json({error:"targetScopeRef is required for org scope"},400);let[m]=await u.select().from(ee).where(_s(Ft(ee.userId,t),Ft(ee.orgId,r.targetScopeRef)));if(!m||m.role!=="admin"&&m.role!=="owner")return e.json({error:"You must be an org admin to promote into an org"},403)}let s=r.targetScope==="personal"?t:r.targetScopeRef,i=r.name??o.name,a=r.seedEvalTarget??(r.targetScope==="org"||r.targetScope==="team"),[d]=await u.select().from(g).where(_s(Ft(g.scope,r.targetScope),Ft(g.scopeRef,s),Ft(g.forkedFromId,n),Ft(g.archived,!1)));if(d){let m=null;return a&&(m=(await jj(d.id))?.id??null),e.json({instructionId:d.id,alreadyExisted:!0,evalTargetId:m})}let[l]=await u.insert(g).values({name:i,description:o.description,type:o.type,scope:r.targetScope,scopeRef:s,version:o.version,content:o.content,frontmatter:o.frontmatter,slots:o.slots,tags:o.tags,compatibility:o.compatibility,createdBy:t,forkedFromId:o.id,upstreamVersion:o.upstreamVersion??o.version,contentHash:o.contentHash,contextIdentity:o.contextIdentity}).returning();if(!l)return e.json({error:"Failed to clone instruction"},500);await u.insert(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 p=null;if(a){let[m]=await u.insert(k).values({userId:t,name:`${i} \u2014 baseline eval`,type:"instruction",content:o.content,description:`Auto-seeded from public skill \`${o.name}\` on promote.`,metadata:{instructionId:l.id,publicSourceId:o.id,publicContentHash:o.contentHash??null,publicVersion:o.version??null}}).returning({id:k.id});p=m?.id??null}return e.json({instructionId:l.id,alreadyExisted:!1,evalTargetId:p})});O();import{Hono as Nj}from"hono";import{z as zv}from"zod";import{eq as Pn,and as Fc,or as Vv,inArray as Jv,sql as Bc,desc as Pj}from"drizzle-orm";var Wc=new Nj,Dj=zv.object({badge:zv.enum(["recommended","required"]).nullable()});Wc.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),p=Math.max(d,0),m=await u.select({orgId:ee.orgId}).from(ee).where(Pn(ee.userId,t)),_=await u.select({teamId:we.teamId}).from(we).where(Pn(we.userId,t)),w=m.map(E=>E.orgId).filter(E=>E!==null),f=_.map(E=>E.teamId).filter(E=>E!==null),h=[Pn(g.archived,!1)],v=[Pn(g.scope,"public")];if(w.length>0&&v.push(Fc(Pn(g.scope,"org"),Jv(g.scopeRef,w))),f.length>0&&v.push(Fc(Pn(g.scope,"team"),Jv(g.scopeRef,f))),h.push(Vv(...v)),e.req.query("proposable")==="1"&&h.push(Bc`coalesce(${g.frontmatter}->>'kind', 'skill') <> 'supporting'`),n&&h.push(Pn(g.badge,n)),r&&h.push(Pn(g.scope,r)),o){let E=ct(o);h.push(Vv(Bc`${g.name} ILIKE ${`%${E}%`}`,Bc`${g.description} ILIKE ${`%${E}%`}`))}let I=[Pj(Bc`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},S=await(i>0?Fe:u).select(i>0?{...b,contentPreview:Bc`left(${g.content}, ${i})`}:b).from(g).where(Fc(...h)).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(S)});Wc.post("/instructions/:id/badge",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=Dj.parse(await e.req.json()),[o]=await u.select().from(g).where(Fc(Pn(g.id,n),Pn(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(Fc(Pn(ee.userId,t),Pn(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(Pn(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 Oj}from"hono";import{eq as Eo,and as ml,or as Cj,inArray as Kv}from"drizzle-orm";var fl=new Oj;fl.post("/projects/:id/recommendations",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(C).where(ml(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(ml(Eo(g.scope,"org"),Kv(g.scopeRef,i))),a.length>0&&d.push(ml(Eo(g.scope,"team"),Kv(g.scopeRef,a)));let l=await u.select().from(g).where(ml(Eo(g.archived,!1),Cj(...d))).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 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 b=await v.json();p.topics=b.topics??[]}if(I.ok){let b=await I.json();p.languages=Object.keys(b)}}catch{}let m=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 Qf(p,m,{llmProvider:_,llmApiKey:w});return e.json(f)});import{Hono as LN}from"hono";O();import{Hono as pN}from"hono";import{z as Pg}from"zod";import{eq as At,and as Zc,desc as hI,sql as dr,inArray as mN}from"drizzle-orm";O();import{and as Jj,eq as Tg,sql as Kj}from"drizzle-orm";function dg(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(dg,"mcnemarExact");function gl(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(gl,"assessSufficiency");var Ao=1.959963984540054;function hl(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(hl,"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 ug(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,p)=>l+p,0)/n,a=new Array(r);for(let l=0;l<r;l++){let p=0;for(let m=0;m<n;m++)p+=e[s()*n|0];a[l]=p/n}a.sort((l,p)=>l-p);let d=(1-o)/2;return{estimate:i,lower:Ai(a,d),upper:Ai(a,1-d),iterations:r}}c(ug,"pairedBootstrapCI");function lg(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,p=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&&p++}d.sort((w,f)=>w-f);let m=(1-o)/2,_=Math.min(1,2*Math.min(l,p)/r);return{estimate:a,lower:Ai(d,m),upper:Ai(d,1-m),pValue:_,iterations:r}}c(lg,"twoSampleBootstrapCI");function pg(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,b)=>v+o[b]*I,0)/s,"combine"),a=i(n.map(h=>r(h.withScores)-r(h.withoutScores))),d=t.iterations??1e4,l=t.ciLevel??.95,p=Si(t.seed??1),m=new Array(d),_=0,w=0;for(let h=0;h<d;h++){let v=n.map(b=>{let A=0;for(let E=0;E<b.withScores.length;E++)A+=b.withScores[p()*b.withScores.length|0];let S=0;for(let E=0;E<b.withoutScores.length;E++)S+=b.withoutScores[p()*b.withoutScores.length|0];return A/b.withScores.length-S/b.withoutScores.length}),I=i(v);m[h]=I,I<=0&&_++,I>=0&&w++}m.sort((h,v)=>h-v);let f=(1-l)/2;return{estimate:a,lower:Ai(m,f),upper:Ai(m,1-f),pValue:Math.min(1,2*Math.min(_,w)/d),iterations:d}}c(pg,"stratifiedBootstrapCI");function mg(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)),p=0,m=l.reduce((w,f)=>w+f,0)/n;for(let w of l)p+=(w-m)*(w-m);let _=a===0?0:1-p/a;return{adjusted:l,theta:d,varianceReduction:_}}c(mg,"cupedAdjust");function fg(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(fg,"diagnoseAssertions");function gg(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(gg,"summarizeDiscrimination");function _l(e,t){let n=e.length,r=t.length;if(n===0||r===0)return 0;let o=[...e.map(l=>({t:l,exposed:!0})),...t.map(l=>({t:l,exposed:!1}))].sort((l,p)=>l.t-p.t),s=0,i=0;for(;i<o.length;){let l=i;for(;l+1<o.length&&o[l+1].t===o[i].t;)l++;let p=(i+1+l+1)/2;for(let m=i;m<=l;m++)o[m].exposed&&(s+=p);i=l+1}let d=(s-n*(n+1)/2)/(n*r);return Math.abs(d-.5)}c(_l,"cohortTimeSeparation");var ys=.35,yl=900*1e3;function hg(e,t,n=ys,r=yl){if(e.length===0||t.length===0)return!1;let o=[...e,...t];return Math.max(...o)-Math.min(...o)<r?!1:_l(e,t)>n}c(hg,"isTimeSeparated");var Gv=c(e=>e===0||e===1,"isBinary");function Yv(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(Yv,"meanPairDelta");function wl(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=ug(s,{seed:t.seed,iterations:t.iterations}),d={lower:a.lower,upper:a.upper},l=e.every(h=>Gv(h.withScore)&&Gv(h.withoutScore)),p=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++;p=dg(h,v).pValue}let{sufficient:m}=gl(o,o,r),_=d.lower>0||d.upper<0,f={mode:"controlled",baseline:n,delta:i,ci:d,pValue:p,significant:m&&_,sufficient:m,nWith:o,nWithout:o,costDelta:Yv(e,"withCost","withoutCost"),latencyDelta:Yv(e,"withLatency","withoutLatency"),confounded:!1};return m||(f.insufficientReason=`insufficient data: need >= ${r} paired tasks per cohort, have ${o}`),f}c(wl,"buildControlledVerdict");var Lj=2;function vl(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),d=[...e,...t],l=d.length>0&&d.every(b=>typeof b.covariate=="number");if(l){let{adjusted:b}=mg(d.map(A=>A.score),d.map(A=>A.covariate));i=b.slice(0,o),a=b.slice(o)}let p=lg(i,a,{seed:n.seed,iterations:n.iterations}),m={lower:p.lower,upper:p.upper},_=p.estimate,w=o>0&&s>0?p.pValue:null,{sufficient:f}=gl(o,s,r),h=f&&(m.lower>0||m.upper<0),v=c(b=>{if(o===0||s===0||!e.every(E=>b(E)!=null)||!t.every(E=>b(E)!=null))return null;let A=e.reduce((E,T)=>E+b(T),0)/o,S=t.reduce((E,T)=>E+b(T),0)/s;return A-S},"meanDiff"),I={mode:"observational",baseline:n.baseline??"no-rule",delta:_,ci:m,pValue:w,significant:h,sufficient:f,nWith:o,nWithout:s,costDelta:v(b=>b.cost),latencyDelta:v(b=>b.latency),confounded:!0,cupedApplied:l};return f||(I.insufficientReason=`insufficient data: need >= ${r} sessions per cohort, have ${o} exposed / ${s} unexposed`),I}c(vl,"buildObservationalVerdict");function Dn(e,t={}){let n=t.minN??10,r=t.minPerStratum??Lj,o=t.maxTimeSeparation??ys,s=t.minStratumSpanMs??yl,i=e.filter(T=>T.withScores.length>=r&&T.withoutScores.length>=r),a=i.filter(T=>T.withTimes!=null&&T.withoutTimes!=null&&hg(T.withTimes,T.withoutTimes,o,s)),d=new Set(a.map(T=>T.key)),l=i.filter(T=>!d.has(T.key)),p=e.filter(T=>T.withScores.length>0&&T.withoutScores.length>0&&(T.withScores.length<r||T.withoutScores.length<r)).length,m=l.reduce((T,P)=>T+P.withScores.length,0),_=l.reduce((T,P)=>T+P.withoutScores.length,0),w=pg(l,{seed:t.seed,iterations:t.iterations}),f={lower:w.lower,upper:w.upper},h=w.estimate,v=l.length>0&&m>=n&&_>=n,I=l.length>0?w.pValue:null,b=v&&(f.lower>0||f.upper<0),A=e.reduce((T,P)=>T+P.withScores.length+P.withoutScores.length,0),S=A>0?(m+_)/A:0,E={mode:"observational",baseline:t.baseline??"no-rule",delta:h,ci:f,pValue:I,significant:b,sufficient:v,nWith:m,nWithout:_,costDelta:null,latencyDelta:null,confounded:!0,strata:l.length,strataDroppedForTimeSeparation:a.length,coverage:S};if(!v){let T=p>0?` (${p} 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`:"";E.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 ${m} exposed / ${_} unexposed${T}${P?`.${P}`:""}`}return E}c(Dn,"buildStratifiedVerdict");function _g(e,t,n={}){return{overall:Dn(e,n),segments:Il(t,n)}}c(_g,"buildSegmentedVerdict");function Il(e,t={}){return e.map(n=>({segment:n.segment,verdict:Dn(n.strata,t)}))}c(Il,"buildSegmentVerdicts");function ws(e){return e.sufficient?e.significant?e.delta<0?"harmful":"helpful":"neutral":"insufficient"}c(ws,"classifyEffect");var xi={achieved:1,fully_achieved:1,mostly_achieved:.75,partially_achieved:.5,unclear_from_transcript:.25,not_achieved:0,abandoned:0},vs=c(e=>{let t=e?xi[e]:void 0;return t===void 0?null:t},"scoreOutcome");var Ri=10,bl=c(e=>e.length===0?0:e.reduce((t,n)=>t+n,0)/e.length,"mean"),yg=c(e=>{if(e.length<2)return 0;let t=bl(e);return e.reduce((n,r)=>n+(r-t)**2,0)/(e.length-1)},"sampleVar"),Xv=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,m)=>l+t[m]*p,0)/n,i=n-r/n,d=(i>0?e.reduce((l,p,m)=>l+t[m]*(p-s)**2,0)/i:0)*r/(n*n);return{mean:s,varOfMean:d,nEff:o}},"weightedStats");function wg(e,t,n={}){let r=n.minAnchors??Ri,o=n.z??Ao,s=e.length,i=t.length,a=[...e,...t.map(S=>S.judge)],d=bl(a),l=t.map(S=>S.weight??1),p=t.map(S=>S.human-S.judge),m=Xv(p,l),_=m.mean,w=i>0?m.nEff:0,f=t.filter(S=>S.validated!==!1).length;if(n.pooledRectifier){let S=n.pooledRectifier,E=s>0?e:t.map(L=>L.judge);if(E.length===0)return{estimate:NaN,ci:{lower:NaN,upper:NaN},se:1/0,naive:d,rectifier:S.rectifier,nLabeled:i,nUnlabeled:s,nEffective:w,nValidated:f,sufficient:!1,insufficientReason:"no judge scores to correct with the pooled rectifier"};let T=bl(E)+S.rectifier,P=yg(E)/E.length+S.variance,H=Math.sqrt(P),N={estimate:T,ci:{lower:T-o*H,upper:T+o*H},se:H,naive:d,rectifier:S.rectifier,nLabeled:i,nUnlabeled:s,nEffective:w,nValidated:f,sufficient:S.sufficient};return S.sufficient||(N.insufficientReason="pooled rectifier not yet adequate"),N}let h,v;if(i===0)h=d,v=a.length>0?yg(a)/a.length:0;else if(s===0){let S=Xv(t.map(E=>E.human),l);h=S.mean,v=S.varOfMean}else h=bl(e)+_,v=yg(e)/s+m.varOfMean;let I=Math.sqrt(v),b=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:b};if(!b){let S=i-f;A.insufficientReason=`insufficient anchors: need >= ${r} VALIDATED human-labeled items, have ${f}${S>0?` (+${S} passive, which don't count toward the floor)`:""}`}return A}c(wg,"ppiMeanEstimate");function zc(e,t,n={}){let r=wg(e.unlabeledJudge,e.labeled,{...n,pooledRectifier:n.withPooledRectifier}),o=wg(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,p=l&&(d.lower>0||d.upper<0),m={delta:i,ci:d,se:a,with:r,without:o,sufficient:l,significant:p};return l||(m.insufficientReason=r.insufficientReason??o.insufficientReason),m}c(zc,"ppiDifference");var Ti=50,eI=.2,tI=.8416212335729143,Mj=c(e=>e.length===0?0:e.reduce((t,n)=>t+n,0)/e.length,"mean"),Vc=c(e=>{if(e.length<2)return 0;let t=Mj(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:Vc(e.unlabeledJudge)/r,scaling:Vc(e.labeled.map(o=>o.human-o.judge)),n}:n>0?{fixed:0,scaling:Vc(e.labeled.map(o=>o.human)),n}:{fixed:r>0?Vc(e.unlabeledJudge)/r:0,scaling:t.labeled.length>0?Vc(t.labeled.map(o=>o.human-o.judge)):null,n:0}}c(Qv,"varianceComponents");var Zv=1e6;function $j(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(Zv)>t)return null;let r=0,o=Zv;for(;r<o;){let s=Math.floor((r+o)/2);n(s)<=t?o=s:r=s+1}return r}c($j,"solvePerCohortIncrement");function vg(e,t,n={}){let r=n.pilotTarget??Ti,o=n.targetEffect??eI,s=n.minAnchors??Ri,i=n.z??Ao,a=n.zPower??tI,d=i+a,l=c(V=>(V*100).toFixed(0),"pp"),p=e.labeled.length,m=t.labeled.length,_=n.humanLabeledRuns??p+m,w=e.unlabeledJudge.length+p+t.unlabeledJudge.length+m,f={nAnchors:_,nAnchorsWith:p,nAnchorsWithout:m,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=zc(e,t,{minAnchors:s,z:i,withPooledRectifier:n.pool?.withPooledRectifier,withoutPooledRectifier:n.pool?.withoutPooledRectifier}).se,v=d*h,I=e.unlabeledJudge.length+p,b=t.unlabeledJudge.length+m,A=Math.min(I,b)<s,S=!Number.isFinite(h)||h<=0,E=A,T=!E&&v<=o,P=`(${I} with / ${b} without, minimum ${s} per cohort)`,H=S?`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:me}=n.pool,F=V>=r,he=me>=3,D=F&&he&&T,re=[];return he||re.push(`pool spans ${me}/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`),E?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:me}}let N=p>=s,L=m>=s,q=f.pilotMet&&N&&L&&T,B,J=0;if(!T){let V=(o/d)**2,me=$j([Qv(e,t),Qv(t,e)],V);J=me===null?null:2*me}if(!f.pilotMet)B=r-_;else if(J===null)B=null;else{let V=Math.max(0,s-p)+Math.max(0,s-m);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 ${p}/${s} labeled runs (minimum for a corrected estimate)`),L||ce.push(`without-target cohort has ${m}/${s} labeled runs (minimum for a corrected estimate)`),E)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(vg,"anchorPowerCheck");function Ig(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(Ig,"localOnly");function El(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)?Ig(e,{rectifierUsed:NaN,variance:1/0,reason:"no anchors on this target and none to pool from"}):Ig(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"),p=o.map(B=>1/l(B.variance)),m=p.reduce((B,J)=>B+J,0),_=p.reduce((B,J)=>B+J*J,0),w=o.reduce((B,J,ce)=>B+p[ce]*J.rectifier,0)/m,f=o.reduce((B,J,ce)=>B+p[ce]*(J.rectifier-w)**2,0),h=s-1,v=m-_/m,I=v>0?Math.max(0,(f-h)/v):0,b=f>0?Math.max(0,(f-h)/f):0,A=o.map(B=>1/(l(B.variance)+I)),S=A.reduce((B,J)=>B+J,0),E=o.reduce((B,J,ce)=>B+A[ce]*J.rectifier,0)/S,T=1/S,P=s<3;if(b>r)return e.n>=1&&Number.isFinite(e.variance)?Ig(e,{pooled:E,pooledVariance:T,tau2:I,i2:b,k:s,assumedExchangeability:P,reason:`heterogeneity too high (I\xB2=${(b*100).toFixed(0)}%) \u2014 targets disagree; not pooling`}):{rectifierUsed:E,variance:T,lambda:1,pooled:E,pooledVariance:T,tau2:I,i2:b,k:s,pooledApplied:!1,assumedExchangeability:P,reason:`no anchors on this target; pooled estimate is high-heterogeneity (I\xB2=${(b*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),L=H?E:N*E+(1-N)*e.rectifier,q=H?T+I:(1-N)*e.variance+N*N*T;return{rectifierUsed:L,variance:q,lambda:N,pooled:E,pooledVariance:T,tau2:I,i2:b,k:s,pooledApplied:!0,assumedExchangeability:P}}c(El,"shrinkRectifier");var ki=3,Kc=7,bg="(preamble)",Fj=/^\s*(`{3,}|~{3,})/,Wj=/^(#{1,6})\s+(.*)$/;function Jc(e){let t=e.split(`
116
+ `),n=[],r=[],o={heading:"",level:0,path:[bg],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=Fj.exec(a);if(d){let p=d[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=Wj.exec(a);if(l){i();let p=l[1].length,m=l[2].trim();r.length=Math.max(0,p-1),r[p-1]=m,o={heading:m,level:p,path:Array.from({length:p},(_,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(Jc,"splitMarkdownSections");function Al(e){let t=new Map,n=new Map;for(let r of e){let o=r.level===0?bg:r.path.join(" > "),s=(t.get(o)??0)+1;t.set(o,s),n.set(s===1?o:`${o} #${s}`,r)}return n}c(Al,"sectionKeys");function Eg(e,t){let n=Al(Jc(e)),r=Al(Jc(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(Eg,"diffSections");function Ag(e){return[...new Set([...e.changed,...e.added,...e.removed])].sort()}c(Ag,"touchedSections");var nI=c(e=>e.trim().toLowerCase(),"normalize");function rI(e,t,n){if(n.length===0)return[];let r=new Set(n.map(nI)),o=Eg(e,t),s=new Set(Ag(o)),i=new Map([...Al(Jc(e)),...Al(Jc(t))]),a=[];for(let d of s){let l=i.get(d);(l?l.path:d.split(" > ")).some(m=>r.has(nI(m)))&&a.push(d)}return a.sort()}c(rI,"protectedViolations");function Sg(e){let{verdict:t,canaryGreen:n,adequate:r,adequacyReasons:o=[],promotionsInWindow:s,maxPromotionsPerWindow:i=ki,immutableSections:a=[],beforeContent:d,afterContent:l,measurementMatchesPredecessor:p}=e,m=Ag(Eg(d,l)),_=ws(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"),p===!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=rI(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:m};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:m}:_==="harmful"?{decision:"revert",refusals:[],rationale:`revert: proposal measured WORSE than its predecessor, ${h(t.delta)} CI ${v}`,effect:_,touched:m}:{decision:"revert",refusals:[],rationale:`revert: no detectable improvement, ${h(t.delta)} CI ${v} spans zero`,effect:_,touched:m}}c(Sg,"evaluatePromotion");async function Yc(e,t){let[n]=await u.select({id:U.id,instructionId:U.instructionId,projectPath:U.projectPath,status:U.status,contentHash:U.contentHash}).from(U).where(Jj(Tg(U.id,e),Tg(U.userId,t)));if(!n)return null;let r=!1;if(n.contentHash){let{instructionContentHash:f}=await Promise.resolve().then(()=>(Is(),cI)),[h]=await u.select({content:g.content,name:g.name}).from(g).where(Tg(g.id,n.instructionId));r=f(h?.content,h?.name)!==n.contentHash}let o=await u.execute(Kj`
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,14 @@ 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=[],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 (
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=vs(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 p={treated:i.length,control:a.length},m={experimentId:n.id,instructionId:n.instructionId,projectPath:n.projectPath,status:n.status,assigned:s,measured:p,contentChanged:r};if(r)return{...m,delta:null,ci:null,significant:!1,resolution:"inconclusive",timeSeparation:null,randomisationSuspect:!1,reason:"the instruction was edited mid-experiment \u2014 the arms measured different texts, so no verdict transfers. It re-enters testing as new content."};if(p.treated<10||p.control<10)return{...m,delta:null,ci:null,significant:!1,resolution:"insufficient",timeSeparation:null,randomisationSuspect:!1,reason:`needs ${10} measured sessions per arm; have ${p.treated} treated / ${p.control} control`};let _=_l(d,l);if(_>ys)return{...m,delta:null,ci:null,significant:!1,resolution:"inconclusive",timeSeparation:_,randomisationSuspect:!0,reason:`arms are time-separated (${_.toFixed(2)} > ${ys}) \u2014 randomisation looks broken, not merely confounded`};let w=vl(i.map(f=>({score:f})),a.map(f=>({score:f})),{minN:10});return{...m,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(Yc,"buildArmVerdict");Is();var Gj=new Set(["cmd","cmds","command","commands","host","hostname","url","uri","todo","tbd","xxx","placeholder","insert","fixme"]),Yj=/(?<![A-Za-z0-9])<([A-Za-z][^<>\n]{0,78}[A-Za-z0-9._/-])>/g,Xj=/\{\{\s*[^{}\n]{1,80}\s*\}\}/g;function Qj(e){let t=e.split(`
127
+ `),n=!1,r="";return t.map(s=>{let i=s.match(/^\s*(\`\`\`|~~~)/);return i&&!n?(n=!0,r=i[1],""):n?(i&&i[1]===r&&(n=!1),""):s}).join(`
128
+ `)}c(Qj,"blankFencedBlocks");var Zj=/_{3,}/g,eN=/[\s:|/]|\.\.\./,tN=/^[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(Yj)){let i=s[1];tN.test(i)||(eN.test(i)||Gj.has(i.toLowerCase()))&&o(s[0],"bracketed")}for(let s of Qj(e).matchAll(Xj))o(s[0],"mustache");for(let s of e.matchAll(Zj))o(s[0],"blank");return n}c(Ni,"findPlaceholders");O();import{and as kg,eq as Sr,gte as nN,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 rN(e,t){let{min:n,max:r}=Bn[e];return Number.isFinite(t)?Math.min(r,Math.max(n,t)):_n[oN[e]]}c(rN,"clampLimit");var oN={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(Sr(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(Sr(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(Sr(R.id,e));if(dI(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(Sr(C.id,t));dI(n,o??null,"project")}return n}c(xo,"resolveAutoAcceptLimits");function dI(e,t,n){if(t)for(let r of Object.keys(Bn)){let o=t[r];o!=null&&(e[r]=rN(r,Number(o)),e.source[r]=n)}}c(dI,"applyOverrides");async function Di(e,t,n,r=_n.WINDOW_DAYS,o){let s=new Date(Date.now()-r*864e5),i=kg(Sr(Ge.userId,e),Sr(Ge.eventType,"accepted"),Sr(Ge.actor,"auto"),nN(Ge.createdAt,s)),a=o?So`exists (
127
129
  select 1 from instruction_suggestions s2
128
130
  join instructions i2 on i2.id = s2.instruction_id
129
131
  where s2.id = ${Ge.suggestionId}
130
132
  and i2.type = ${o}
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`(
133
+ )`:void 0;if(!n){let[l]=await u.select({n:So`count(*)::int`}).from(Ge).where(kg(i,Sr(Ge.projectPath,t),a));return l?.n??0}let[d]=await u.select({n:So`count(*)::int`}).from(Ge).innerJoin(x,Sr(x.id,Ge.suggestionId)).where(kg(i,Sr(x.projectId,n),a));return d?.n??0}c(Di,"autoAcceptsInWindow");O();import{sql as Tl,eq as sN}from"drizzle-orm";var Oi=.7;async function kl(e){try{let[t]=await u.select({t:R.suggestionConfidenceThreshold}).from(R).where(sN(R.id,e)).limit(1);return typeof t?.t=="number"?t.t:Oi}catch{return Oi}}c(kl,"readConfidenceThreshold");var iN=5,aN=90,uI="surface_budget",jg="declined_by_silence",cN=Tl`(
132
134
  SELECT count(*) FROM (
133
135
  SELECT date_trunc('hour', min(e.created_at)) AS h
134
136
  FROM instruction_suggestion_events e
@@ -143,7 +145,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
143
145
  AND e.event_type IN ('surfaced', 'surfaced_with_content')
144
146
  AND e.session_id IS NULL
145
147
  ) hours
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`
148
+ )`,Xc=Tl`(${x.declinedAt} IS NULL OR ${x.declinedAt} < now() - make_interval(days => ${aN}))`,lI=Tl`(${x.declinedAt} IS NULL OR ${x.declinedReason} = ${uI})`;async function jl(e,t){await u.execute(Tl`
147
149
  WITH over_budget AS (
148
150
  SELECT instruction_suggestions.id
149
151
  FROM instruction_suggestions
@@ -159,12 +161,12 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
159
161
  AND instruction_suggestions.accepted_at IS NULL
160
162
  AND (instruction_suggestions.dismissed_at IS NULL
161
163
  OR instruction_suggestions.dismissed_at < now() - interval '30 days')
162
- AND ${rj} >= ${tj}
164
+ AND ${cN} >= ${iN}
163
165
  ),
164
166
  stamped AS (
165
167
  UPDATE instruction_suggestions t
166
168
  SET declined_at = now(),
167
- declined_reason = ${iI}
169
+ declined_reason = ${uI}
168
170
  FROM over_budget o
169
171
  -- Re-checked here, not only in the CTE: under READ COMMITTED two
170
172
  -- concurrent session starts both see declined_at IS NULL, and only
@@ -174,29 +176,48 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
174
176
  RETURNING t.id, t.user_id, t.project_path
175
177
  )
176
178
  INSERT INTO instruction_suggestion_events (suggestion_id, user_id, event_type, project_path)
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
+ SELECT id, user_id, ${jg}, project_path FROM stamped
180
+ `)}c(jl,"sweepDeclinedBySilence");O();import{eq as pI,sql as mI}from"drizzle-orm";var Ci={MAX_CONCURRENT:3,MAX_PER_RUN:3},Qc={maxConcurrent:{min:0,max:10},maxPerRun:{min:0,max:10}},dN={maxConcurrent:"MAX_CONCURRENT",maxPerRun:"MAX_PER_RUN"};function uN(e){for(let t=e,n=0;t&&n<4;n++){if(t.code==="42703")return!0;t=t.cause}return!1}c(uN,"isUndefinedColumn");function Ng(e,t){let{min:n,max:r}=Qc[e];return Number.isFinite(t)?Math.min(r,Math.max(n,Math.trunc(t))):Ci[dN[e]]}c(Ng,"clampTrialLimit");async function bs(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(pI(R.id,e));fI(n,r??null,"account")}catch(r){if(!uN(r))throw r}if(t){let[r]=await u.select({maxConcurrent:mI`(${C.metadata}->'trialLimits'->>'maxConcurrent')::int`,maxPerRun:mI`(${C.metadata}->'trialLimits'->>'maxPerRun')::int`}).from(C).where(pI(C.id,t));fI(n,r??null,"project")}return n}c(bs,"resolveTrialLimits");function fI(e,t,n){if(t)for(let r of Object.keys(Qc)){let o=t[r];o!=null&&(e[r]=Ng(r,Number(o)),e.source[r]=n)}}c(fI,"applyOverrides");function Nl(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(Nl,"trialSlots");O();import{desc as lN,eq as gI}from"drizzle-orm";async function Fn(e){if(!e)return null;try{let[t]=await u.select({projectId:ye.projectId}).from(ye).where(gI(ye.path,e)).orderBy(lN(ye.lastSeen)).limit(1);if(t)return t.projectId;let[n]=await u.select({id:C.id}).from(C).where(gI(C.gitRemoteUrl,e)).limit(1);return n?.id??null}catch{return null}}c(Fn,"resolveProjectIdForPath");var Li=new pN;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(Zc(At(x.userId,t),At(x.projectPath,n),At(x.kind,_n.KIND),dr`(${x.score} >= ${o.minScore} OR ${g.frontmatter}->>'source' = 'insights')`,dr`${x.acceptedAt} IS NULL`,dr`${x.dismissedAt} IS NULL`,lI,At(x.isStale,!1),At(g.archived,!1),mN(g.type,["instruction","skill"]),dr`NOT EXISTS (
179
181
  SELECT 1 FROM instruction_suggestion_events ev
180
182
  WHERE ev.suggestion_id = ${x.id}
181
183
  AND ev.event_type IN ('redundant', 'partial_overlap', 'unresolvable_reference')
182
184
  AND ev.created_at > now() - interval '30 days'
183
- )`,cr`NOT EXISTS (
185
+ )`,dr`NOT EXISTS (
184
186
  SELECT 1 FROM instruction_experiments e
185
187
  WHERE e.instruction_id = ${x.instructionId}
186
188
  AND e.project_path = ${x.projectPath}
187
189
  AND e.status = 'running'
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 (
190
+ )`)).orderBy(hI(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")]),p=Math.max(0,o.maxPerWindow-d),m=[],_=[],w={instruction:0,skill:0};for(let f of s){let h=Ni(f.content??"");if(h.length>0){_.push({id:f.id,name:f.name,reason:`unfilled placeholder(s): ${h.map(S=>S.token).join(", ")}`});continue}let v=f.type??"instruction",I=v==="skill",b=w[v]??0,A=I?Number.POSITIVE_INFINITY:p;if(b>=Math.min(o.maxPerRun,A)){_.push({id:f.id,name:f.name,reason:A<=b?`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]=b+1,m.push({id:f.id,instructionId:f.instructionId,name:f.name,score:f.score,type:v})}return e.json({consent:a,eligible:m,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:U.id,source:U.source,status:U.status,instructionId:U.instructionId,projectPath:U.projectPath}).from(U).where(Zc(At(U.userId,t),At(U.status,"running"),...r?[At(U.projectPath,r)]:[])),s=[],i=0;for(let a of o)try{let d=await Yc(a.id,t);if(!d){i+=1;continue}let l=await ji({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 bs(t,r),[{running:s}]=await u.select({running:dr`count(*)::int`}).from(U).where(Zc(At(U.userId,t),At(U.projectPath,n),At(U.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(Zc(At(x.userId,t),At(x.projectPath,n),At(x.kind,"add"),dr`${x.acceptedAt} IS NULL`,dr`${x.dismissedAt} IS NULL`,dr`${x.declinedAt} IS NULL`,At(x.isStale,!1),At(g.archived,!1),dr`${g.type} NOT IN ('hook','mcp','subagent')`,dr`NOT EXISTS (
189
191
  SELECT 1 FROM instruction_experiments e
190
192
  WHERE e.instruction_id = ${x.instructionId}
191
193
  AND e.project_path = ${x.projectPath}
192
194
  AND e.status = 'running'
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 (
195
+ )`)).orderBy(hI(x.score)).limit(50),d=[],l=[];for(let m of a){if(d.length>=Math.min(i,o.maxPerRun))break;let _=Ni(m.content??"");if(_.length>0){l.push({name:m.name,reason:`unfilled placeholder(s): ${_.map(w=>w.token).join(", ")}`});continue}d.push({id:m.id,instructionId:m.instructionId,name:m.name,score:m.score})}let{blocked:p}=Nl(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:p}})});var fN=Pg.object({projectPath:Pg.string().min(1),instructionId:Pg.string().uuid()});Li.post("/instruction-suggestions/undo",async e=>{let t=e.get("userId"),n=fN.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(Zc(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 yN}from"hono";import{eq as Qt,and as Es,asc as AI,desc as SI,inArray as ed,sql as xr}from"drizzle-orm";var _I=["instruction","skill"];function yI(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(yI,"artifactTypeForFeature");function wI(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(`
196
+
197
+ `)}c(wI,"renderFeatureBody");function vI(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(`
198
+
199
+ `)}c(vI,"renderAdviceBody");O();import{createHash as gN}from"node:crypto";import{and as II,eq as Pl,inArray as hN,sql as zG}from"drizzle-orm";function _N(e,t,n){return gN("sha256").update(`${e}:${t}`).digest().readUIntBE(0,6)/0xffffffffffff<n?"treated":"control"}c(_N,"assignArm");async function bI(e){let{userId:t,projectPath:n,externalSessionId:r}=e;if(!r)return[];let o=await u.select({id:U.id,instructionId:U.instructionId,treatedShare:U.treatedShare,salt:U.salt}).from(U).where(II(Pl(U.userId,t),Pl(U.projectPath,n),Pl(U.status,"running")));if(o.length===0)return[];await u.insert(zr).values(o.map(a=>({experimentId:a.id,userId:t,externalSessionId:r,arm:_N(a.salt,r,Number(a.treatedShare))}))).onConflictDoNothing();let s=await u.select({experimentId:zr.experimentId,arm:zr.arm}).from(zr).where(II(Pl(zr.externalSessionId,r),hN(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(bI,"resolveArmsForSession");function EI(e){return new Set(e.filter(t=>t.arm==="control").map(t=>t.instructionId))}c(EI,"withheldInstructionIds");Is();var Og=new yN,xI=2e3,wN=4,vN={"session-start":{add:3,remove:2,trim:1}},IN=["add","remove","trim"];function Dg(e){return e.length<=xI?e:e.slice(0,xI)+"... [truncated]"}c(Dg,"truncateContent");Og.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?vN[d]:void 0;if(d&&!l)return e.json({error:`unknown renderFor: ${d}`},400);let p=a||l!==void 0;if(!n&&!r)return e.json({error:"projectId or projectPath is required"},400);let m=n?Qt(x.projectId,n):Qt(x.projectPath,r);try{await jl(t,xr`${m}`)}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:xr`(length(${g.content}) / 4)::int`,_rawContent:g.content}).from(x).innerJoin(g,Qt(x.instructionId,g.id)).where(Es(Qt(x.userId,t),m,Qt(g.archived,!1),xr`${x.acceptedAt} IS NULL`,xr`(${x.dismissedAt} IS NULL OR ${x.dismissedAt} < now() - interval '30 days')`,Xc,...l?[ed(g.type,[..._I])]:[])).orderBy(AI(x.isStale),SI(x.score)).limit(s),w=[];if(p){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:xr`(length(${g.content}) / 4)::int`,_rawContent:g.content}).from(x).innerJoin(g,Qt(x.instructionId,g.id)).where(Es(Qt(x.userId,t),m,xr`${x.kind} <> 'add'`,Qt(g.archived,!1),xr`${x.acceptedAt} IS NULL`,xr`(${x.dismissedAt} IS NULL OR ${x.dismissedAt} < now() - interval '30 days')`,Xc)).orderBy(AI(x.isStale),SI(x.score)).limit(wN)).filter(F=>!V.has(F.id))}let f=i?await kl(t):Oi,h=[..._,...w].map(V=>{let{_rawContent:me,...F}=V,he=i&&V.kind==="add"&&V.score>=f&&typeof me=="string"?Dg(me):null;return{...F,content:he}}),v=l?await bI({userId:t,projectPath:r??"",externalSessionId:e.req.query("sessionId")||void 0}):[],I=EI(v),b=l?await Rg(t,r??""):[],A=new Set(b.filter(V=>V.decision==="never").map(V=>V.instructionId)),S=b.filter(V=>V.decision==="always"),E=new Set(b.map(V=>V.instructionId)),T=v.filter(V=>V.arm==="treated"),P=new Set(v.map(V=>V.instructionId)),H=I.size===0&&E.size===0&&P.size===0?h:h.filter(V=>!I.has(V.instructionId)&&!E.has(V.instructionId)&&!P.has(V.instructionId)),N=H,L;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 me=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(Es(ed(g.id,T.map(D=>D.instructionId)),Qt(g.archived,!1)));for(let D of he.reverse())me.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?Dg(D.content??""):null});V.set("add",me)}if(S.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(Es(ed(g.id,S.map(he=>he.instructionId)),Qt(g.archived,!1)));for(let he of F.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?Dg(he.content??""):null});V.set("add",me)}N=IN.flatMap(F=>V.get(F)??[]),L={addCount:me.length,costCount:(V.get("remove")??[]).length+(V.get("trim")??[]).length,highConfidenceCount:me.filter(F=>F.content!==null).length,omitted:H.length-(N.length-me.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:xr`count(*)::int`}).from(Ge).innerJoin(x,Qt(Ge.suggestionId,x.id)).where(Es(Qt(Ge.userId,t),m)).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))],me=await u.select({id:U.id,instructionId:U.instructionId,source:U.source}).from(U).where(Es(Qt(U.userId,t),Qt(U.projectPath,r),Qt(U.status,"running"),ed(U.instructionId,V)));me.length>0&&(J=Object.fromEntries(me.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(Es(Qt(Z.userId,t),ed(Z.instructionId,V),xr`${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,...L?{render:L}:{},...J?{experiments:J}:{},...ce?{crossProject:ce}:{}})});O();import{Hono as bN}from"hono";import{z as RI}from"zod";import{eq as As,and as TI,desc as EN,sql as yn}from"drizzle-orm";var AN=RI.object({threshold:RI.number().min(0).max(1)}),Ss=new bN;Ss.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(TI(As(x.userId,t),yn`${x.acceptedAt} IS NULL`,yn`(${x.dismissedAt} IS NULL OR ${x.dismissedAt} < now() - interval '30 days')`,Xc)).groupBy(x.projectPath).orderBy(EN(yn`count(*)`)),r=n.reduce((o,s)=>o+s.count,0);return e.json({total:r,byProject:n.slice(0,5)})});Ss.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(As(x.userId,t)),r=await u.select({eventType:Ge.eventType,count:yn`count(*)::int`}).from(Ge).where(As(Ge.userId,t)).groupBy(Ge.eventType),o={surfaced:0,surfaced_with_content:0,accepted:0,dismissed:0,promoted:0,proxy_injected:0,[jg]: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"}})});Ss.get("/instruction-suggestions/confidence",async e=>{let t=e.get("userId");return e.json({threshold:await kl(t),default:Oi,governs:"Minimum score at which an add-suggestion carries its instruction body into session context. Surfacing only \u2014 never a write."})});Ss.put("/instruction-suggestions/confidence",async e=>{let t=e.get("userId"),n=AN.safeParse(await e.req.json().catch(()=>null));return n.success?(await u.update(R).set({suggestionConfidenceThreshold:n.data.threshold}).where(As(R.id,t)),e.json({threshold:n.data.threshold})):e.json({error:"threshold must be a number between 0 and 1"},400)});Ss.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,As(x.instructionId,g.id)).where(TI(As(x.id,n),As(x.userId,t)));return r?e.json(r):e.json({error:"Suggestion not found"},404)});O();import{Hono as SN}from"hono";import{z as Wt}from"zod";import{eq as ur,and as Cg,or as xN,desc as RN,sql as xs}from"drizzle-orm";O();import{sql as td}from"drizzle-orm";function Mi(e){return td`
200
+ SELECT project_id::text AS project_id, path, is_worktree, last_seen, is_stale, project_last_seen
201
+ FROM project_canonical_checkouts
202
+ WHERE project_id IN (${td.join(e.map(t=>td`${t}::uuid`),td`, `)})`}c(Mi,"canonicalCheckoutsFor");async function Dl(e,t){if(!e)return t;try{return(await u.execute(Mi([e])))[0]?.path??t}catch{return t}}c(Dl,"canonicalPathForProject");async function Ol(e){try{let n=(await u.execute(td`
203
+ SELECT c.project_id::text AS project_id,
204
+ c.path AS canonical_path,
205
+ (c.path = ${e}) AS is_canonical
206
+ FROM project_canonical_checkouts c
207
+ WHERE c.path = ${e}
208
+ OR c.project_id = (
209
+ SELECT pc.project_id FROM project_checkouts pc
210
+ WHERE pc.path = ${e}
211
+ ORDER BY pc.last_seen DESC LIMIT 1
212
+ )
213
+ ORDER BY is_canonical DESC
214
+ LIMIT 1`))[0];return n?n.is_canonical?{mintable:!0,projectId:n.project_id}:{mintable:!1,reason:"not_canonical",canonicalPath:n.canonical_path}:{mintable:!1,reason:"unknown_path",canonicalPath:null}}catch{return{mintable:!0,projectId:null}}}c(Ol,"assessMintablePath");var nd=new SN,TN=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(Wu).optional()})).max(50)});async function kN(e){try{let[t]=await u.select({projectId:ye.projectId}).from(ye).where(ur(ye.path,e)).orderBy(RN(ye.lastSeen)).limit(1);return t?.projectId??null}catch{return null}}c(kN,"resolveProjectId");var jN=Wt.object({stale:Wt.boolean().default(!0)});nd.post("/instruction-suggestions/batch-upsert",async e=>{let t=e.get("userId"),n=TN.parse(await e.req.json());if(n.suggestions.length===0)return e.json({inserted:0,skipped:0});let r=await Ol(n.projectPath);if(!r.mintable)return e.json({inserted:0,skipped:n.suggestions.length,reason:r.reason,projectPath:n.projectPath,canonicalPath:r.canonicalPath});let o=n.projectId??r.projectId??await kN(n.projectPath),s=n.suggestions.map(i=>({userId:t,instructionId:i.instructionId,projectPath:n.projectPath,projectId:o,score:i.score,reason:i.reason,kind:i.kind??"add",generatedAt:new Date,isStale:!1}));return await u.insert(x).values(s).onConflictDoUpdate({target:[x.userId,x.projectPath,x.instructionId,x.kind],set:{score:xs`excluded.score`,reason:xs`excluded.reason`,generatedAt:xs`excluded.generated_at`,isStale:xs`false`,dismissedAt:xs`CASE WHEN ${x.dismissedAt} IS NOT NULL AND ${x.dismissedAt} >= now() - interval '30 days' THEN ${x.dismissedAt} ELSE NULL END`}}),e.json({inserted:s.length,skipped:0})});nd.post("/instruction-suggestions/mark-stale",async e=>{let t=e.get("userId"),n=await e.req.json().catch(()=>({})),r=jN.parse(n).stale,o=Cg(ur(x.userId,t),ur(x.isStale,!r),xs`EXISTS (
194
215
  SELECT 1 FROM instructions i
195
216
  WHERE i.id = ${x.instructionId}
196
217
  AND i.type = 'skill'
197
218
  AND coalesce(i.frontmatter->>'source', '') <> 'insights'
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`
219
+ )`),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 NN=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")});nd.post("/instruction-suggestions/:id/events",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=NN.parse(await e.req.json()),[o]=await u.select().from(x).where(Cg(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 u.select({id:g.id}).from(g).where(Cg(ur(g.id,r.instructionId),xN(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 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(ur(x.id,n));else if(r.eventType==="dismissed")await u.update(x).set({dismissedAt:new Date}).where(ur(x.id,n));else if(r.eventType==="surfaced"||r.eventType==="surfaced_with_content")try{await jl(t,xs`${ur(x.id,n)}`)}catch{}return e.json({ok:!0})});O();import{Hono as ON}from"hono";import{z as rd}from"zod";import{eq as $i,and as jI,desc as NI,sql as Ll}from"drizzle-orm";Is();O();Is();import{randomUUID as PN}from"node:crypto";import{and as Cl,eq as On,sql as Lg}from"drizzle-orm";var DN=.8;async function kI(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(On(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(Cl(On(Z.instructionId,n),On(Z.contentHash,a),On(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[p]=await u.select({id:x.id}).from(x).where(Cl(On(x.userId,t),On(x.instructionId,n),On(x.projectPath,r),Lg`${x.acceptedAt} IS NULL`,Lg`${x.dismissedAt} IS NULL`,Lg`${x.score} >= ${DN}`));if(!p)return{ok:!1,code:"not_injectable",reason:"not delivered by injection on this project (accepted into a file, or no renderable proposal) \u2014 withholding would measure nothing"}}let[l]=await u.select({id:U.id}).from(U).where(Cl(On(U.instructionId,n),On(U.projectPath,r),On(U.status,"running")));if(l)return{ok:!0,experimentId:l.id,existing:!0};try{let[p]=await u.insert(U).values({userId:t,instructionId:n,projectPath:r,status:"running",treatedShare:String(s),salt:PN(),contentHash:a,source:o}).returning({id:U.id});return{ok:!0,experimentId:p.id,existing:!1}}catch(p){let[m]=await u.select({id:U.id}).from(U).where(Cl(On(U.instructionId,n),On(U.projectPath,r),On(U.status,"running")));if(m)return{ok:!0,experimentId:m.id,existing:!0};throw p}}c(kI,"nominateExperiment");var qi=new ON;qi.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=jI($i(U.userId,t),n?$i(U.projectPath,n):Ll`true`),s=await u.select({id:U.id,instructionId:U.instructionId,instructionName:g.name,projectPath:U.projectPath,status:U.status,source:U.source,instructionSource:Ll`${g.frontmatter}->>'source'`,stoppedReason:U.stoppedReason,createdAt:U.createdAt}).from(U).innerJoin(g,$i(U.instructionId,g.id)).where(o).orderBy(NI(U.createdAt)).limit(r),[{total:i}]=await u.select({total:Ll`count(*)::int`}).from(U).where(o),a=await Promise.all(s.map(async l=>{let p=await Yc(l.id,t),m=l.status,_=l.stoppedReason;if(p&&l.status==="running")try{let w=await ji({experimentId:l.id,userId:t,verdict:p,source:l.source,status:l.status});w&&(m="stopped",_=w)}catch{}return{...l,status:m,stoppedReason:_,verdict:p}})),d=await Rl(a.map(l=>l.id));return e.json({experiments:a.map(l=>({...l,graduation:d.get(l.id)??null})),total:i})});var CN=rd.object({instructionId:rd.string().uuid(),projectPath:rd.string().min(1),source:rd.enum(["manual","groom","trial","borrow"]).default("manual"),treatedShare:rd.number().gt(0).lt(1).optional()});qi.post("/instruction-experiments",async e=>{let t=e.get("userId"),n=CN.safeParse(await e.req.json().catch(()=>({})));if(!n.success)return e.json({error:n.error.flatten()},400);let r=await kI({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)});qi.get("/instruction-experiments/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await Yc(n,t);if(!r)return e.json({error:"not found"},404);try{let[s]=await u.select({source:U.source,status:U.status}).from(U).where($i(U.id,n));s&&await ji({experimentId:n,userId:t,verdict:r,source:s.source,status:s.status})}catch{}let o=await Rl([n]);return e.json({verdict:r,graduation:o.get(n)??null})});qi.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(jI($i(Z.userId,t),n?$i(Z.instructionId,n):Ll`true`)).orderBy(NI(Z.decidedAt)).limit(50);return e.json({verdicts:r,total:r.length})});var Ro=new LN;Ro.route("/",Li);Ro.route("/",Og);Ro.route("/",Ss);Ro.route("/",nd);Ro.route("/",qi);import{Hono as oO}from"hono";import{Hono as kD}from"hono";O();import{Hono as KN}from"hono";import{z as Wn}from"zod";import{eq as Vt,and as zi,desc as qI,sql as zn,or as UI,gte as GN,ne as YN}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(`
220
+ `)}c(To,"findPgMessage");function PI(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(),p=a.slice(d+1);return p?`${l}/${p}`: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(PI,"canonicalizeRemote");var MN=new Set(["","unknown","<synthetic>"]);function Rs(e){if(typeof e!="string")return null;let t=e.trim();return MN.has(t)?null:t}c(Rs,"resolveModelId");var $N=["claudeCodeVersion","codexCliVersion"];function Ui(e){if(typeof e!="object"||e===null)return null;let t=e;for(let n of $N){let r=Rs(t[n]);if(r!==null)return r}return null}c(Ui,"resolveHarnessVersion");O();import{eq as Mg,and as WN,sql as $I}from"drizzle-orm";O();import{randomUUID as Hi}from"node:crypto";import{eq as zt,and as od,gt as qN,sql as DI}from"drizzle-orm";var UN=6e4;async function Bi(e){try{let t=new Date(Date.now()-UN),[n]=await u.select({exists:DI`1`}).from(fe).where(od(zt(fe.userId,e),zt(fe.workerType,"cli-worker"),qN(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(Bi,"hasLiveWorker");async function Ct(e){let t=!await Bi(e.userId),n=Hi(),r={...e.payload,mirrorId:n};switch(e.taskName){case"process_eval":case"process_conversation":{await u.insert(Ne).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(ku).values({...e.mirror,id:n,status:"pending",taskKind:e.taskName,payload:r});break}}return{id:n,noLiveWorker:t}}c(Ct,"enqueueJob");async function Ml(e){let t=`goal-${e.sessionId}-${e.milestone}`,[n]=await u.select({id:Pe.id}).from(Pe).where(od(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=Hi();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(Ml,"enqueueSessionGoalJob");async function OI(e){let t=`distill-${e.sessionId}`,[n]=await u.select({id:Pe.id}).from(Pe).where(od(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=Hi();await u.insert(Pe).values({id:r,userId:e.userId,taskKind:"distill_memories",payload:{sessionId:e.sessionId,mirrorId:r},dedupeKey:t})}c(OI,"enqueueDistillMemoriesJob");async function CI(e){let t=!await Bi(e.userId),n=`run-cleanup:${e.runId}`,[r]=await u.select({id:Pe.id}).from(Pe).where(od(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=Hi();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(CI,"enqueueRunCleanupJob");async function LI(e){let t=`judge-review:${e.evalTargetId}`,n=Hi();await u.execute(DI`
200
221
  INSERT INTO agent_jobs (id, user_id, task_kind, payload, dedupe_key)
201
222
  SELECT ${n}, ${e.userId}, 'process_judge_review',
202
223
  ${JSON.stringify({evalTargetId:e.evalTargetId,mirrorId:n})}::jsonb,
@@ -208,9 +229,9 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
208
229
  AND dedupe_key = ${t}
209
230
  AND status = 'pending'
210
231
  )
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
232
+ `)}c(LI,"enqueueJudgeReviewJob");async function MI(e){let t=!await Bi(e.userId),n=`memory-ab:${e.experimentId}`,[r]=await u.select({id:Pe.id}).from(Pe).where(od(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=Hi();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(MI,"enqueueMemoryAbJob");O();import{and as HN,eq as $l,sql as ko}from"drizzle-orm";var ql=2,BN=200,FN={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"},Fi=c(e=>ko.raw(`CASE WHEN ${e} IS NULL OR ${e} = '' THEN 0
212
233
  ELSE length(${e}) - length(replace(${e}, chr(10), ''))
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`
234
+ + CASE WHEN right(${e}, 1) = chr(10) THEN 0 ELSE 1 END END`),"nl");async function Ul(e,t={}){let{userId:n,force:r=!1}=t,[o]=await u.select({id:y.id,metadata:y.metadata}).from(y).where(n?HN($l(y.id,e),$l(y.userId,n)):$l(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`
214
235
  WITH usage_rows AS (
215
236
  SELECT DISTINCT ON (coalesce(metadata->>'requestId', id::text))
216
237
  coalesce(
@@ -245,7 +266,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
245
266
  (SELECT max(timestamp) FROM session_events WHERE session_id = ${e}) AS last_ts,
246
267
  (SELECT coalesce(sum(input_tokens), 0)::bigint FROM usage_rows) AS input_tokens,
247
268
  (SELECT coalesce(sum(output_tokens), 0)::bigint FROM usage_rows) AS output_tokens
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`
269
+ `),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===ql)return{status:"skipped",reason:"already_enriched"};let d=Number(i.user_message_count),l=Number(i.assistant_message_count),p=Number(i.input_tokens),m=Number(i.output_tokens),_=await Fe.execute(ko`
249
270
  SELECT coalesce(tool_name, 'unknown') AS tool, count(*)::int AS n
250
271
  FROM session_events
251
272
  WHERE session_id = ${e}
@@ -269,19 +290,19 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
269
290
  count(DISTINCT coalesce(tool_input->>'file_path', tool_input->>'notebook_path'))
270
291
  FILTER (WHERE tool_name IN ('Edit','MultiEdit','Write','NotebookEdit'))::int AS files_modified,
271
292
  coalesce(SUM(CASE tool_name
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'")}
293
+ WHEN 'Edit' THEN ${Fi("tool_input->>'new_string'")}
294
+ WHEN 'Write' THEN ${Fi("tool_input->>'content'")}
295
+ WHEN 'NotebookEdit' THEN ${Fi("tool_input->>'new_source'")}
275
296
  WHEN 'MultiEdit' THEN (
276
- SELECT coalesce(SUM(${Bi("e->>'new_string'")}), 0)
297
+ SELECT coalesce(SUM(${Fi("e->>'new_string'")}), 0)
277
298
  FROM jsonb_array_elements(
278
299
  CASE WHEN jsonb_typeof(tool_input->'edits') = 'array'
279
300
  THEN tool_input->'edits' ELSE '[]'::jsonb END) e)
280
301
  ELSE 0 END), 0)::int AS lines_added,
281
302
  coalesce(SUM(CASE tool_name
282
- WHEN 'Edit' THEN ${Bi("tool_input->>'old_string'")}
303
+ WHEN 'Edit' THEN ${Fi("tool_input->>'old_string'")}
283
304
  WHEN 'MultiEdit' THEN (
284
- SELECT coalesce(SUM(${Bi("e->>'old_string'")}), 0)
305
+ SELECT coalesce(SUM(${Fi("e->>'old_string'")}), 0)
285
306
  FROM jsonb_array_elements(
286
307
  CASE WHEN jsonb_typeof(tool_input->'edits') = 'array'
287
308
  THEN tool_input->'edits' ELSE '[]'::jsonb END) e)
@@ -329,7 +350,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
329
350
  COALESCE(jsonb_agg(EXTRACT(hour FROM timestamp AT TIME ZONE 'UTC')::int
330
351
  ORDER BY timestamp), '[]'::jsonb) AS hours,
331
352
  COALESCE(jsonb_agg(to_char(timestamp AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS"Z"')
332
- ORDER BY timestamp) FILTER (WHERE rn <= ${Mj}), '[]'::jsonb) AS timestamps,
353
+ ORDER BY timestamp) FILTER (WHERE rn <= ${BN}), '[]'::jsonb) AS timestamps,
333
354
  COALESCE(jsonb_agg(gap ORDER BY timestamp)
334
355
  FILTER (WHERE gap IS NOT NULL), '[]'::jsonb) AS response_times
335
356
  FROM user_msgs
@@ -355,7 +376,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
355
376
  ) errors
356
377
  ) classified
357
378
  GROUP BY 1
358
- `),I={};for(let N of v)I[N.category]=Number(N.n);let E=await Fe.execute(ko`
379
+ `),I={};for(let N of v)I[N.category]=Number(N.n);let b=await Fe.execute(ko`
359
380
  SELECT DISTINCT coalesce(tool_input->>'file_path', tool_input->>'notebook_path') AS path
360
381
  FROM session_events
361
382
  WHERE session_id = ${e}
@@ -363,7 +384,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
363
384
  AND tool_name IN ('Edit','MultiEdit','Write','NotebookEdit')
364
385
  AND jsonb_typeof(tool_input) = 'object'
365
386
  AND coalesce(tool_input->>'file_path', tool_input->>'notebook_path') IS NOT NULL
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`
387
+ `),A={};for(let N of b){let L=N.path.split(".").pop()?.toLowerCase(),q=L?FN[L]:void 0;q&&(A[q]=(A[q]??0)+1)}let S=i.first_ts,E=i.last_ts,P={duration_minutes:S&&E?Math.round((new Date(E).getTime()-new Date(S).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:ql},H={metadata:ko`COALESCE(${y.metadata}, '{}'::jsonb) || ${JSON.stringify({local_session_meta:P})}::jsonb`};return(p>0||m>0)&&(H.tokenUsage={input_tokens:p,output_tokens:m}),await u.update(y).set(H).where($l(y.id,e)),{status:"enriched",metrics:P}}c(Ul,"deriveSessionEnrichment");async function Hl(e){try{await Ul(e)}catch(t){console.warn("[derive-enrichment] failed for session",e,t instanceof Error?t.message:t)}}c(Hl,"deriveSessionEnrichmentBestEffort");async function jo(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;Rm(s)},"tag");if(t)try{let[r]=await u.select({orgId:ee.orgId}).from(ee).where(WN(Mg(ee.userId,e),Mg(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(Mg(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(jo,"resolveCallerOrgId");async function zN(e,t,n){if(n)try{await u.execute($I`
367
388
  insert into treatment_exposures
368
389
  (session_id, user_id, treatment_type, treatment_id, treatment_version, method, exposed_at)
369
390
  select ${e}::uuid, ${t}::uuid, 'suggestion', s.instruction_id, 1, 'injected', min(ise.created_at)
@@ -373,7 +394,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
373
394
  and ise.event_type in ('surfaced', 'surfaced_with_content', 'proxy_injected')
374
395
  group by s.instruction_id
375
396
  on conflict on constraint treatment_exposures_unique do nothing
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`
397
+ `)}catch(r){console.warn("[reimport] suggestion exposure reconcile failed:",r instanceof Error?r.message:r)}}c(zN,"reconcileSuggestionExposures");async function VN(e,t,n){if(n)try{await u.execute($I`
377
398
  with drained as (
378
399
  insert into treatment_exposures
379
400
  (session_id, user_id, treatment_type, treatment_id, treatment_version, method, exposed_at)
@@ -388,13 +409,13 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
388
409
  delete from pending_treatment_exposures
389
410
  where external_session_id = ${n}
390
411
  and user_id = ${t}::uuid
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`
412
+ `)}catch(r){console.warn("[reimport] memory exposure reconcile failed:",r instanceof Error?r.message:r)}}c(VN,"reconcileMemoryExposures");var JN=6;async function Bl(e,t,n,r,o){await Hl(e),await zN(e,t,n),await VN(e,t,n),r&&o>=JN&&await OI({sessionId:e,userId:t}).catch(s=>{console.warn("[reimport] distill enqueue failed:",s instanceof Error?s.message:s)})}c(Bl,"finalizeSessionIntelligence");function Wi(e){if(typeof e=="string")return e.replace(/\u0000/g,"").replace(/[\uD800-\uDBFF](?![\uDC00-\uDFFF])/g,"\uFFFD").replace(/(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/g,"\uFFFD");if(Array.isArray(e))return e.map(t=>Wi(t));if(e!==null&&typeof e=="object"){let t={};for(let[n,r]of Object.entries(e))t[Wi(n)]=Wi(r);return t}return e}c(Wi,"deepSanitizeForPg");async function sd(e,t){let n=[],r=null,o=PI(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(qI(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(UI(Vt(C.gitRemoteUrl,o),zn`${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:zn`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:zn`${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(sd,"matchProjectForCapture");async function Vi(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(Vi,"upsertProjectCheckout");function id(e){return!!e&&/^\/(Users|home)\/[^/]+\/?$/.test(e)}c(id,"isJunkProjectPath");async function XN(e,t,n,r){let o=!!n.projectPath&&n.projectPath.startsWith("/")&&!id(n.projectPath),s=id(t.projectPath)?t.projectPath:null,i=!!s&&o,a={};if(!t.projectPath&&n.projectPath?(r.projectPath=n.projectPath,t.projectPath=n.projectPath):i&&(a.originalProjectPath=s,r.projectPath=n.projectPath,t.projectPath=n.projectPath),!t.gitBranch&&n.gitBranch&&(r.gitBranch=n.gitBranch,t.gitBranch=n.gitBranch),t.projectId&&i){let{matchedProjects:p}=await sd(e,n.metadata),m=p[0]?.id;m&&m!==t.projectId&&(a.previousProjectId=t.projectId,r.projectId=m,t.projectId=m),a.pathRepairedAt=new Date().toISOString(),r.metadata=zn`COALESCE(${y.metadata}, '{}'::jsonb) || ${JSON.stringify(a)}::jsonb`,m&&await Vi(t.projectId,n.projectPath,n.metadata);return}if(i&&(a.pathRepairedAt=new Date().toISOString(),r.metadata=zn`COALESCE(${y.metadata}, '{}'::jsonb) || ${JSON.stringify(a)}::jsonb`),t.projectId){await Vi(t.projectId,n.projectPath,n.metadata);return}let{matchedProjects:d}=await sd(e,n.metadata),l=d[0]?.id;l&&(r.projectId=l,t.projectId=l,await Vi(l,n.projectPath??t.projectPath,n.metadata))}c(XN,"repairAttribution");var $g=new KN;async function qg(e,t){if(!t)return null;try{let[n]=await u.select({id:te.id}).from(te).where(zi(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(qg,"resolveCallerRunId");var QN=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()});$g.post("/sessions",async e=>{let t=e.get("userId"),n=await e.req.json(),r=QN.parse(n);if(r.projectPath){let p=await u.select({projectPath:y.projectPath}).from(y).where(zi(Vt(y.userId,t),zn`${y.projectPath} IS NOT NULL`)).groupBy(y.projectPath),m=null;for(let _ of p){let w=_.projectPath;!w||w===r.projectPath||r.projectPath.startsWith(w+"/")&&(/^\/(Users|home)\/[^/]+\/?$/.test(w)||(!m||w.length>m.length)&&(m=w))}m&&(r.projectPath=m)}let o=await jo(t,r.orgId??null),s=await qg(t,r.runId??null);if(r.externalSessionId){let[p]=await u.select().from(y).where(zi(Vt(y.userId,t),Vt(y.externalSessionId,r.externalSessionId))).limit(1);if(p){let m={};return!p.orgId&&o&&(m.orgId=o,p.orgId=o),!p.runId&&s&&(m.runId=s,p.runId=s),await XN(t,p,r,m),Object.keys(m).length>0&&await u.update(y).set(m).where(Vt(y.id,p.id)),e.json(p,200)}}if(r.tool&&r.projectPath){let p=new Date(Date.now()-3e4),m=[Vt(y.userId,t),Vt(y.tool,r.tool),Vt(y.projectPath,r.projectPath),GN(y.startedAt,p)],[_]=await u.select().from(y).where(zi(...m)).orderBy(qI(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 sd(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:Ui(r.metadata)??void 0,metadata:{...r.metadata,clientName:r.clientName,mcpServerVersion:r.mcpServerVersion}}).returning()}catch(p){if(p.cause?.code==="23505"&&r.externalSessionId){let[_]=await u.select().from(y).where(zi(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 p}if(!l)return e.json({error:"Failed to create session"},500);i.length>0&&await Vi(i[0].id,r.projectPath,r.metadata);try{if(i.length>0){let p=r.projectPath?r.projectPath.replace(/\/$/,"")+"/":null,m=p?zn`${g.name} LIKE ${p+"%"}`:zn`FALSE`,_=await u.select({instructionId:lt.instructionId}).from(lt).innerJoin(g,Vt(g.id,lt.instructionId)).where(zi(zn`${lt.projectId} IN (${zn.join(i.map(w=>zn`${w.id}`),zn`, `)})`,UI(YN(g.type,"context_file"),m)));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 sP}from"hono";import{z as ft}from"zod";import{eq as KI,and as iP,sql as Rr}from"drizzle-orm";O();import{sql as Vn}from"drizzle-orm";function Fl(){return process.env.EVENT_BATCHING!=="0"}c(Fl,"eventBatchingEnabled");function BI(){let e=Number(process.env.EVENT_BATCH_LINGER_MS);return Number.isFinite(e)&&e>=0?e:50}c(BI,"eventBatchLingerMs");function FI(){let e=Number(process.env.EVENT_BATCH_BUFFER_MAX);return Number.isFinite(e)&&e>0?Math.floor(e):5e3}c(FI,"eventBatchBufferMax");function WI(){let e=Number(process.env.EVENT_BATCH_FLUSH_SIZE);return Number.isFinite(e)&&e>0?Math.floor(e):ZN}c(WI,"eventBatchFlushSize");function zI(){let e=Number(process.env.PG_POOL_MAX)||3;return Math.max(1,e-1)}c(zI,"defaultDrainConcurrency");var ZN=500;function eP(e){let t=e.lingerMs??BI(),n=e.maxBuffered??FI(),r=Math.max(1,e.flushSize??WI()),o=Math.max(1,e.concurrency??zI()),s=new Map,i=0,a=new Set,d=0,l=!1,p=null,m=[];function _(){let S=m;m=[];for(let E of S)E()}c(_,"notifyProgress");function w(){for(;d<o;){let S=null,E=null;for(let[T,P]of s)if(!(a.has(T)||P.length===0)){E=P.splice(0,r),P.length===0&&s.delete(T),S=T;break}if(S==null||E==null)return;i-=E.length,a.add(S),d++,f(S,E)}}c(w,"tick");async function f(S,E){try{await e.drainSession(S,E)}catch(T){console.warn(`[event-batcher] drain failed for session ${S}; dropping ${E.length} event(s):`,T instanceof Error?T.message:T)}finally{d--,a.delete(S),_(),w()}}c(f,"runDrain");function h(){p!=null||l||(p=setTimeout(()=>{p=null,w()},t),p.unref?.())}c(h,"scheduleLinger");function v(S){if(l||i>=n)return!1;let E=s.get(S.sessionId);return E?E.push(S):s.set(S.sessionId,[S]),i++,i>=r?w():h(),!0}c(v,"push");function I(S){return new Promise(E=>{let T=!1,P=c(()=>{T||(T=!0,clearTimeout(H),E())},"finish"),H=setTimeout(P,S);H.unref?.(),m.push(P)})}c(I,"waitForProgress");async function b(S){let E=S!=null?Date.now()+S:Number.POSITIVE_INFINITY;for(;;){if(w(),i===0&&d===0)return;let T=E-Date.now();if(T<=0)return;await I(Math.min(T,50))}}c(b,"flush");function A(){l=!0,p!=null&&(clearTimeout(p),p=null)}return c(A,"stop"),{push:v,flush:b,stop:A,size:c(()=>i,"size"),inFlight:c(()=>d,"inFlight")}}c(eP,"createEventBatcher");var HI=5,tP=[5,20,50];function nP(e){let t=e.cause;return e instanceof Error&&(t?.code==="23505"||e.message.includes("unique")||e.message.includes("duplicate"))}c(nP,"isDuplicateKeyError");function rP(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(rP,"toEventTimestamp");async function oP(e,t){if(t.length===0)return;let n=null,r=!1;for(let o=0;o<=HI;o++)try{let s=t.map((a,d)=>{let l=a.input,p={...l.metadata??{}};l.durationMs!=null&&(p.durationMs=l.durationMs),l.success!=null&&(p.success=l.success);let m=l.toolInput==null?null:JSON.stringify(l.toolInput),_=l.toolOutput==null?null:JSON.stringify(l.toolOutput),w=l.tokenUsage==null?null:JSON.stringify(l.tokenUsage),f=!r&&l.sequence!=null?Vn`${l.sequence}::int`:Vn`NULL::int`;return Vn`(${d+1}::int, ${f}, ${l.eventType}::text, ${l.content??null}::text, ${l.toolName??null}::text, ${m==null?Vn`NULL::jsonb`:Vn`${m}::jsonb`}, ${_==null?Vn`NULL::jsonb`:Vn`${_}::jsonb`}, ${w==null?Vn`NULL::jsonb`:Vn`${w}::jsonb`}, ${l.model??null}::text, ${rP(l.timestamp)}::timestamptz, ${JSON.stringify(p)}::jsonb)`});n=(await u.execute(Vn`
392
413
  WITH base AS (
393
414
  SELECT COALESCE(MAX(sequence), 0) AS seq
394
415
  FROM session_events WHERE session_id = ${e}
395
416
  ),
396
417
  vals (rn, explicit_seq, event_type, content, tool_name, tool_input, tool_output, token_usage, model, ts, metadata) AS (
397
- VALUES ${zn.join(s,zn`, `)}
418
+ VALUES ${Vn.join(s,Vn`, `)}
398
419
  ),
399
420
  ins AS (
400
421
  INSERT INTO session_events (id, session_id, sequence, event_type, content, tool_name, tool_input, tool_output, token_usage, model, timestamp, metadata)
@@ -415,7 +436,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
415
436
  )
416
437
  SELECT (SELECT COUNT(*)::int FROM ins) AS inserted,
417
438
  (SELECT event_count FROM upd) AS new_count
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`
439
+ `))[0]?.new_count??null;break}catch(s){if(nP(s)&&o<HI){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=tP.filter(i=>o<i&&n>=i);for(let i of s)await Ml({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(oP,"drainSessionEvents");var No=null;function Ug(){return No==null&&(No=eP({drainSession:oP})),No}c(Ug,"getEventBatcher");function VI(){Ug(),console.log(`[event-batcher] batched event ingest ON (lingerMs=${BI()} flushSize=${WI()} bufferMax=${FI()} drainConcurrency=${zI()}; EVENT_BATCHING=0 to disable)`)}c(VI,"initEventBatcher");async function JI(e=5e3){if(No==null)return;No.stop(),await No.flush(e);let t=No.size()+No.inFlight();t>0&&console.warn(`[event-batcher] shutdown flush deadline (${e}ms) hit; dropping ~${t} buffered event(s)`)}c(JI,"shutdownEventBatcher");var Hg=new sP,aP=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()});Hg.post("/sessions/:id/events",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=aP.parse(r),[s]=await u.select({id:y.id,eventCount:y.eventCount,userId:y.userId}).from(y).where(iP(KI(y.id,n),KI(y.userId,t)));if(!s)return e.json({error:"Session not found"},404);let i=s.eventCount??0;if(Fl())return Ug().push({sessionId:n,userId:s.userId,input:o})?e.json({buffered:!0,count:1,durable:!1},202):(vc(),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),p=JSON.stringify(a),m=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`
419
440
  WITH ins AS (
420
441
  INSERT INTO session_events (id, session_id, sequence, event_type, content, tool_name, tool_input, tool_output, token_usage, model, timestamp, metadata)
421
442
  SELECT
@@ -427,10 +448,10 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
427
448
  ${o.toolName??null},
428
449
  ${d==null?Rr`NULL`:Rr`${d}::jsonb`},
429
450
  ${l==null?Rr`NULL`:Rr`${l}::jsonb`},
430
- ${p==null?Rr`NULL`:Rr`${p}::jsonb`},
451
+ ${m==null?Rr`NULL`:Rr`${m}::jsonb`},
431
452
  ${o.model??null},
432
453
  ${new Date(o.timestamp).toISOString()}::timestamptz,
433
- ${Rr`${m}::jsonb`}
454
+ ${Rr`${p}::jsonb`}
434
455
  RETURNING sequence
435
456
  ),
436
457
  upd AS (
@@ -440,13 +461,10 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
440
461
  RETURNING id
441
462
  )
442
463
  SELECT ins.sequence FROM ins, upd
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`
444
- SELECT project_id::text AS project_id, path, is_worktree, last_seen, is_stale, project_last_seen
445
- FROM project_canonical_checkouts
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`(
464
+ `))[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 Ml({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 cP}from"hono";import{eq as Ts,and as Wl,desc as dP,sql as uP,ilike as Bg,gte as GI}from"drizzle-orm";var Fg=new cP;Fg.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(Wl(Ts(y.id,n),Ts(y.userId,t)));if(!r)return e.json({error:"Session not found"},404);if(await u.update(y).set({endedAt:new Date}).where(Ts(y.id,n)),await Hl(n),r.projectPath)try{let o=new Date;o.setHours(0,0,0,0);let s=await Dl(r.projectId,r.projectPath)??r.projectPath,[i]=await u.select({id:z.id}).from(z).where(Wl(Ts(z.userId,t),GI(z.createdAt,o),Bg(z.projectPath,`%${ct(s)}%`))).limit(1);if(!i){let[a]=await u.select({completedAt:z.completedAt}).from(z).where(Wl(Ts(z.userId,t),Ts(z.status,"completed"),Bg(z.projectPath,`%${ct(s)}%`))).orderBy(dP(z.completedAt)).limit(1),d=a?.completedAt??new Date(0),[{count:l}]=await u.select({count:uP`COUNT(*)`}).from(y).where(Wl(Ts(y.userId,t),Bg(y.projectPath,`%${ct(r.projectPath)}%`),GI(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();tp();import{createHash as xD}from"node:crypto";import{Hono as RD}from"hono";import{z as np}from"zod";import{eq as wn,and as t0,sql as Do}from"drizzle-orm";import{createHash as SD}from"node:crypto";function Qb(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(Qb,"readImportMarker");function Zb(e,t){return e.length<=t.contentLen?!1:SD("sha256").update(e.slice(0,t.contentLen)).digest("hex")===t.contentHash}c(Zb,"isStrictContentExtension");var e0=new Set(["claude_code","codex"]);var rp=new RD;async function n0(e,t){if(t.projectId)return t.projectId;let n=t.metadata??{},{matchedProjects:r}=await sd(e,n),o=r[0]?.id;return o?(await u.update(y).set({projectId:o}).where(wn(y.id,t.id)),await Vi(o,t.projectPath,n),o):null}c(n0,"attributeImportedSession");var r0=np.object({content:np.string().min(1),tool:np.string().optional(),orgId:np.string().uuid().nullable().optional()});function TD(e){for(let t of[e.metadata?.sessionId,e.metadata?.codexSessionId])if(typeof t=="string"&&t.length>0)return t;return null}c(TD,"importedExternalSessionId");rp.post("/sessions/:id/reimport",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=r0.parse(r),[s]=await u.select({id:y.id,eventCount:y.eventCount,externalSessionId:y.externalSessionId,projectId:y.projectId,projectPath:y.projectPath}).from(y).where(t0(wn(y.id,n),wn(y.userId,t)));if(!s)return e.json({error:"Session not found"},404);let i=o.tool??cd(o.content);if(!i)return e.json({error:"Could not detect session format. Specify tool parameter."},400);let a=ad(i),d=Wi(a.parse(o.content));if(d.events.length===s.eventCount)return id(s.projectPath)&&d.projectPath&&!id(d.projectPath)&&await u.update(y).set({projectPath:d.projectPath,metadata:Do`COALESCE(${y.metadata}, '{}'::jsonb) || ${JSON.stringify({originalProjectPath:s.projectPath,pathRepairedAt:new Date().toISOString()})}::jsonb`}).where(wn(y.id,n)),await Bl(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(wn(y.id,n)),await Bl(n,t,s.externalSessionId,s.projectId,s.eventCount??0),e.json({reimported:!1,skipped:"empty_parse",eventCount:s.eventCount});let l=d.events.map(m=>({sessionId:n,sequence:m.sequence,eventType:m.eventType,content:m.content,toolName:m.toolName,toolInput:m.toolInput,toolOutput:m.toolOutput,tokenUsage:m.tokenUsage,timestamp:new Date(m.timestamp),metadata:m.metadata}));await Fe.transaction(async m=>{await m.execute(Do`SET LOCAL statement_timeout = '60s'`),await m.delete(Ve).where(wn(Ve.sessionId,n));for(let _=0;_<l.length;_+=500)await m.insert(Ve).values(l.slice(_,_+500));await m.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?Do`COALESCE(${y.metadata}, '{}'::jsonb) || ${JSON.stringify(d.metadata)}::jsonb`:void 0,model:Rs(d.metadata?.model)??void 0,harnessVersion:Ui(d.metadata)??void 0}).where(wn(y.id,n))});let p=s.projectId;if(!p){let[m]=await u.select({id:y.id,projectId:y.projectId,projectPath:y.projectPath,metadata:y.metadata}).from(y).where(wn(y.id,n));m&&(p=await n0(t,m))}return await Bl(n,t,s.externalSessionId,p,d.events.length),e.json({reimported:!0,eventCount:d.events.length})});rp.post("/sessions/import",async e=>{let t=e.get("userId"),n=await e.req.json(),r=r0.parse(n),o=r.tool??cd(r.content);if(!o)return e.json({error:"Could not detect session format. Specify tool parameter."},400);let s=ad(o),i=Wi(s.parse(r.content)),a=TD(i),d=xD("sha256").update(r.content).digest("hex"),l,p=c(async()=>(l===void 0&&(l=await jo(t,r.orgId??null)),l),"resolveOrgId"),m=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(t0(wn(y.userId,t),wn(y.externalSessionId,a))).limit(1))[0]??null:null;if(h&&h.metadata?._importContentHash===d)return e.json({...h,deduped:!0},200);let v=await p(),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:Do`COALESCE(${y.metadata}, '{}'::jsonb) || ${JSON.stringify(_)}::jsonb`,model:Rs(i.metadata?.model)??void 0,harnessVersion:Ui(i.metadata)??void 0,...v&&!h.orgId?{orgId:v}:{}}:null;try{if(h&&I&&e0.has(i.tool)){let S=Qb(h.metadata);if(S&&m.length>S.eventCount&&m[S.eventCount]?.sequence===S.eventCount&&Zb(r.content,S)){let[E]=await u.select({count:Do`COUNT(*)::int`,maxSeq:Do`MAX(${Ve.sequence})::int`}).from(Ve).where(wn(Ve.sessionId,h.id)),T=Number(E?.count??-1),P=E?.maxSeq==null?null:Number(E.maxSeq);if(T===S.eventCount&&(S.eventCount===0?P===null:P===S.eventCount-1)){let N=await Fe.transaction(async L=>{await L.execute(Do`SET LOCAL statement_timeout = '60s'`);let q=m.slice(S.eventCount).map(J=>({sessionId:h.id,...J}));for(let J=0;J<q.length;J+=500)await L.insert(Ve).values(q.slice(J,J+500));let[B]=await L.update(y).set(I).where(wn(y.id,h.id)).returning();return B});return e.json({...N,appended:!0},200)}}}let b=await Fe.transaction(async S=>{if(await S.execute(Do`SET LOCAL statement_timeout = '60s'`),h&&I){if(await S.delete(Ve).where(wn(Ve.sessionId,h.id)),m.length>0){let P=m.map(H=>({sessionId:h.id,...H}));for(let H=0;H<P.length;H+=500)await S.insert(Ve).values(P.slice(H,H+500))}let[T]=await S.update(y).set(I).where(wn(y.id,h.id)).returning();return T}let[E]=await S.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:Rs(i.metadata?.model),harnessVersion:Ui(i.metadata),orgId:v}).returning();if(m.length>0){let T=m.map(P=>({sessionId:E.id,...P}));for(let P=0;P<T.length;P+=500)await S.insert(Ve).values(T.slice(P,P+500))}return E}),A=await n0(t,b);return e.json({...b,projectId:A},h?200:201)}catch(b){if(a&&Ot(b)==="23505"&&f<w)continue;throw b}}});var ta=new kD;ta.route("/",$g);ta.route("/",Hg);ta.route("/",Fg);ta.route("/",rp);O();import{Hono as jD}from"hono";import{eq as rn,and as Xr,asc as ND,desc as uh,sql as We,or as o0,ilike as PD,inArray as op}from"drizzle-orm";var ks=new jD;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"),p=Number(e.req.query("limit")??"50"),m=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]:o0(...v))}else if(a||l){let v=[];a&&v.push(PD(y.projectPath,`%${ct(a)}%`)),l&&v.push(We`${y.metadata}->>'gitRemote' = ${l}`),_.push(v.length===1?v[0]:o0(...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
465
  ${y.analysis}->>'outcome' IS NULL
448
466
  OR COALESCE((${y.analysis}->>'graderVersion')::int, 0) < ${I}
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`
467
+ )`)}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(b=>b.sessionId);if(I.length===0)return e.json([]);_.push(We`${y.id} IN (${We.join(I.map(b=>We`${b}`),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(uh(y.startedAt)).limit(p).offset(m);if(h.length>0){let v=h.map(F=>F.id),I=Array.from(new Set(h.map(F=>F.projectId).filter(F=>!!F))),[b,A,S,E,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(op(ie.sessionId,v)),u.select({sessionId:$.sessionId}).from($).where(op($.sessionId,v)).groupBy($.sessionId),u.execute(We`
450
468
  SELECT session_id, MAX(timestamp) AS last_at
451
469
  FROM session_events
452
470
  WHERE session_id IN (${We.join(v.map(F=>We`${F}`),We`, `)})
@@ -476,7 +494,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
476
494
  AND e.content IS NOT NULL
477
495
  AND e.content <> ''
478
496
  ORDER BY e.session_id, e.timestamp ASC
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`
497
+ `),I.length>0?u.select({id:C.id,name:C.name}).from(C).where(op(C.id,I)):Promise.resolve([]),I.length>0?u.execute(Mi(I)):Promise.resolve([])]),N=new Map;for(let F of b){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 L=new Set;for(let F of A)F.sessionId&&L.add(F.sessionId);let q=new Map;for(let F of S)q.set(F.session_id,F.last_at);let B=new Map;for(let F of E)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 me=h.map(F=>({...F,linkedInstructions:N.get(F.id)??[],dataTier:L.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(me)}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
498
  WITH recent AS (
481
499
  SELECT
482
500
  s.project_id,
@@ -578,20 +596,21 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
578
596
  OR NOT EXISTS (
579
597
  SELECT 1 FROM project_checkouts pc WHERE pc.project_id = ${y.projectId}
580
598
  )
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`
599
+ OR ${y.projectPath} ~ '^/(Users|home)/[^/]+/?$'
600
+ )`,[{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,endedAt:y.endedAt}).from(y).where(Xr(rn(y.userId,t),r)).orderBy(uh(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[p]=await u.execute(Mi([r.projectId]));d=p?.path??null}return e.json({...r,linkedInstructions:o.map(l=>({...l,source:dl(l.frontmatter)})),projectName:a,primaryCheckoutPath:d,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}})});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(m=>m.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(op(Ve.eventType,i)),a&&l.push(We`${Ve.content} IS NOT NULL AND ${Ve.content} != ''`);let p=await u.select().from(Ve).where(Xr(...l)).orderBy(s==="desc"?uh(Ve.sequence):ND(Ve.sequence)).limit(r).offset(o);return e.json(p)});O();import{Hono as DD}from"hono";import{z as on}from"zod";import{eq as na,and as lh,desc as OD,sql as ra}from"drizzle-orm";var js=new DD;js.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(lh(na(y.id,n),na(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)});js.post("/sessions/repair-analyzed-at",async e=>{let t=e.get("userId"),n=await u.execute(ra`
582
601
  UPDATE sessions
583
602
  SET analyzed_at = started_at
584
603
  WHERE user_id = ${t}
585
604
  AND analysis IS NOT NULL
586
605
  AND analyzed_at IS NULL
587
606
  RETURNING id
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`(
607
+ `);return e.json({repaired:n.length})});var CD=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();js.patch("/sessions/:id/enrich",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=CD.parse(await e.req.json()),[o]=await u.select({id:y.id}).from(y).where(lh(na(y.id,n),na(y.userId,t)));if(!o)return e.json({error:"Session not found"},404);let s={};return r.metadata&&(s.metadata=ra`COALESCE(${y.metadata}, '{}'::jsonb) || ${JSON.stringify(r.metadata)}::jsonb`),r.analysis&&(s.analysis=ra`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(na(y.id,n)),e.json({enriched:!0,fields:Object.keys(s)}))});js.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 Ul(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 LD=on.object({limit:on.number().int().positive().max(500).default(100),force:on.boolean().default(!1)});js.post("/sessions/derive-enrichment-backfill",async e=>{let t=e.get("userId"),{limit:n,force:r}=LD.parse(await e.req.json().catch(()=>({}))),o=ra`(
589
608
  ${y.metadata}->'local_session_meta' IS NULL
590
609
  OR (
591
610
  (${y.metadata}->'local_session_meta'->>'derived_from_events')::boolean IS TRUE
592
- AND COALESCE((${y.metadata}->'local_session_meta'->>'derived_schema')::int, 1) < ${Dl}
611
+ AND COALESCE((${y.metadata}->'local_session_meta'->>'derived_schema')::int, 1) < ${ql}
593
612
  )
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`
613
+ )`,s=await u.select({id:y.id}).from(y).where(lh(na(y.userId,t),ra`COALESCE(${y.eventCount}, 0) > 0`,r?ra`COALESCE(${y.metadata}->'local_session_meta'->>'derived_from_events', 'true') = 'true'`:o)).orderBy(OD(y.startedAt)).limit(n),i={scanned:s.length,enriched:0,skipped:0,failed:0},a={};for(let d of s)try{let l=await Ul(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 KD}from"hono";import{z as gd}from"zod";import{eq as Ut,and as hd,asc as GD,desc as YD,sql as fd}from"drizzle-orm";var MD=Number(process.env.PG_MESSAGE_RECONSTRUCT_BUDGET_BYTES)||16e6,$D=Number(process.env.PG_MESSAGE_RECONSTRUCT_PAGE_SIZE)||200;function qD(e){try{let t=JSON.stringify(e);return typeof t=="string"?t.length:0}catch{return 0}}c(qD,"estimateBytes");async function sp(e){let t=e.budgetBytes??MD,n=e.pageSize??$D,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 p=qD(l);if(o+p>t)return{messages:r,truncated:!0,bytes:o,pages:s};r.push(l),o+=p}i=d.sequence}if(a.length<n)break}return{messages:r,truncated:!1,bytes:o,pages:s}}c(sp,"reconstructMessagesBounded");cp();O();import{inArray as WD}from"drizzle-orm";async function l0(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:kn.hash,content:kn.content}).from(kn).where(WD(kn.hash,t));return new Map(n.map(r=>[r.hash,r.content]))}c(l0,"fetchBlobMap");async function dp(e,t){return e?(await l0([e])).get(e)??t:t}c(dp,"resolveBlob");async function p0(e){if(e.length===0)return e;let t=await l0(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:u0(n.toolsHash!=null?t.get(n.toolsHash):void 0,n.tools),injectedInstructions:u0(n.injectedHash!=null?t.get(n.injectedHash):void 0,n.injectedInstructions)}))}c(p0,"resolveSnapshotBlobs");function u0(e,t){return Array.isArray(e)?e:t}c(u0,"preferArray");O();import{eq as VD,sql as JD}from"drizzle-orm";var zD=["x-anthropic-billing-header:","You are Claude Code, Anthropic","You are a Claude agent, built on Anthropic's Claude Agent SDK"];function m0(e){if(!e)return!1;let t=e.slice(0,400);return zD.some(n=>t.includes(n))}c(m0,"looksLikeHarnessSystemPrompt");xg();async function f0(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(JD`${k.metadata}->>'content_hash' = ${i}`).limit(1);if(d||a.contentLen===0)continue;let[l]=await u.select({content:g.content}).from(g).where(VD(g.id,a.id)).limit(1),p=Sl(l?.content,a.name);if(p&&!m0(p))try{let[m]=await u.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,w=[...p.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:m.id,name:h.name,prompt:h.prompt,expectations:h.expectations}),s++}catch{}}return s}c(f0,"autoGenerateEvalTargets");function up(){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(up,"makeSingleFlight");var _d=new KD;_d.post("/sessions/:id/link",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),{instructionId:o}=gd.object({instructionId:gd.string().uuid()}).parse(r),[s]=await u.select({id:y.id}).from(y).where(hd(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)});_d.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(hd(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 hh=new Set(["claude_md","memory","skill_loaded"]);function XD(e,t){return Jf(e,t)??`${e}::${t}`}c(XD,"deriveContextIdentityForAutoCreate");function g0(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(g0,"mapContextTypeToDescription");var QD=gd.object({sessionId:gd.string().uuid().optional(),backfill:gd.boolean().optional()});async function ZD(e,t,n,r){for(let s=0;s<=4;s++)try{await u.execute(fd`
595
614
  insert into instruction_version_identities
596
615
  (instruction_id, content_hash, version_ordinal, content, first_seen_at, last_seen_at)
597
616
  select
@@ -613,8 +632,8 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
613
632
  first_seen_at = least(
614
633
  instruction_version_identities.first_seen_at, excluded.first_seen_at),
615
634
  content = coalesce(instruction_version_identities.content, excluded.content)
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`
635
+ `);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(ZD,"registerVersionIdentity");async function eO(e,t){let n=await u.select({id:g.id,contentHash:g.contentHash,name:g.name,contextIdentity:g.contextIdentity,contentLen:fd`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 S=Number(A.contentLen??0);A.contentHash&&r.set(A.contentHash,{id:A.id,name:A.name??"",contentLen:S}),A.contextIdentity&&o.set(A.contextIdentity,{id:A.id,name:A.name??"",contentHash:A.contentHash})}let s=await Fe.selectDistinctOn([$.sessionId],{id:$.id,sessionId:$.sessionId,metadata:$.metadata}).from($).where(t?hd(Ut($.userId,e),Ut($.sessionId,t)):Ut($.userId,e)).orderBy($.sessionId,YD($.capturedAt)).limit(1e3),i=new Set,a=new Set,d=new Map,l=0,p=0,m=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 E=A.metadata?.contextItems??[],T=null;async function P(){if(T)return T;let[N]=await Fe.select({injectedInstructions:$.injectedInstructions,injectedHash:$.injectedHash}).from($).where(Ut($.id,A.id)).limit(1);return T=await dp(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 L=A.sessionId,{messages:q}=await sp({fetchPage:c(async(J,ce)=>md(await Fe.select({sequence:$.sequence,messagesDelta:$.messagesDelta,messagesDeltaRef:$.messagesDeltaRef}).from($).where(hd(Ut($.sessionId,L),Ut($.userId,e),fd`${$.sequence} > ${J}`)).orderBy(GD($.sequence)).limit(ce)),"fetchPage")}),B=q;return d.set(A.sessionId,B),B}c(H,"getMessagesRaw");for(let N of E){let L=N.content_hash;if(!L)continue;a.add(L);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"||!hh.has(q)&&!q&&!B.includes(".md")&&!B.includes("rules"))continue;let J,ce=!1,V=null,me=r.get(L);if(me&&(J=me.id,hh.has(q)&&me.contentLen===0&&(ce=!0)),(!J||ce)&&hh.has(q)){let D=XD(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 M=cn.content;if(!Array.isArray(M))continue;let j=!1,ht=[];for(let Nt of M)Nt.type==="tool_result"&&Nt.tool_use_id===Xe?j=!0:Nt.type==="text"&&j&&ht.push(Nt.text??"");if(j){Ce=ht.length>0?ht.join(`
636
+ `):null;break}}}}if(V=Ce,ce&&Ce&&J)try{await u.update(g).set({content:Ce,updatedAt:new Date}).where(Ut(g.id,J)),me.contentLen=Ce.length,m++}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!==L){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:fd`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:g0(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:L,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(L,{id:le.id,name:le.name,contentLen:de.length}),le.contentHash=L,m++)}J=le.id}else if(!le)try{let de=B,Se=g0(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:L,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(L,{id:Le,name:de,contentLen:ze.length}),o.set(D,{id:Le,name:de,contentHash:L}),J=Le,p++)}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(hd(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}:${L}`,he=h.get(F);he?!he.content&&V&&(he.content=V):h.set(F,{instructionId:J,contentHash:L,content:V}),f.push({sessionId:A.sessionId,instructionId:J,linkMethod:"context_file",contentHash:L}),l++,w.add(A.sessionId)}}for(let A of h.values())await ZD(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:fd`coalesce(${ie.contentHash}, excluded.content_hash)`}})}catch(S){console.warn("[link-instructions] batched link insert failed:",S instanceof Error?S.message:S)}let v=0,I=null;for(let A of s){if(!A.sessionId)continue;let[S]=await u.select({projectId:y.projectId,projectPath:y.projectPath}).from(y).where(Ut(y.id,A.sessionId)).limit(1);if(!S?.projectId||!S.projectPath)continue;let E=S.projectPath.replace(/\/$/,"");I=E;let P=A.metadata?.contextItems??[];for(let H of P){let N=r.get(H.content_hash);if(!N)continue;let L=H.name??"";if(!(L.startsWith("/")&&!L.startsWith(E+"/")))try{await u.insert(lt).values({projectId:S.projectId,instructionId:N.id,addedBy:e}).onConflictDoNothing(),v++}catch{}}break}let b=await f0({userId:e,hashToInstruction:r,seenHashes:a,linkedProjectPath:I});return{linked:l,created:p,updated:m,failed:_,sessionsLinked:w.size,instructionsMatched:r.size,snapshotsScanned:i.size,projectsLinked:v,evalsGenerated:b,scope:t?"session":"backfill"}}c(eO,"runLinkInstructions");var tO=up();_d.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 tO.run(`${t}:${o??"*backfill*"}`,()=>eO(t,o));return e.json(i)});O();import{Hono as nO}from"hono";import{eq as Ns,and as h0,sql as lp,inArray as rO}from"drizzle-orm";var _h=new nO;_h.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(h0(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([u.select({eventCount:lp`count(*)::int`}).from(Ve).where(Ns(Ve.sessionId,n)),u.select({snapshotCount:lp`count(*)::int`}).from($).where(Ns($.sessionId,n)),u.selectDistinct({ref:$.messagesDeltaRef}).from($).where(h0(Ns($.sessionId,n),lp`${$.messagesDeltaRef} IS NOT NULL`))]),a=i.map(m=>m.ref).filter(m=>!!m);await u.transaction(async m=>{await m.update(Ge).set({sessionId:null}).where(Ns(Ge.sessionId,n)),await m.execute(lp`UPDATE scaffolding_fingerprints SET first_session_id = NULL WHERE first_session_id = ${n}`),await m.delete(y).where(Ns(y.id,n))});let d=0,l=0,p=0;if(a.length>0){let m=await u.selectDistinct({ref:$.messagesDeltaRef}).from($).where(rO($.messagesDeltaRef,a)),_=new Set(m.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(()=>(ld(),s0)),{SNAPSHOT_DELTA_BUCKET:h}=await Promise.resolve().then(()=>(cp(),d0)),{error:v}=await f().storage.from(h).remove(w);v?(p=w.length,console.warn(`[sessions:delete] blob GC failed for ${w.length} ref(s): ${v.message}`)):d=w.length}catch(f){p=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:p})});var Oo=new oO;Oo.route("/",ta);Oo.route("/",ks);Oo.route("/",js);Oo.route("/",_d);Oo.route("/",_h);O();import{Hono as sO}from"hono";import{eq as yh}from"drizzle-orm";import{sql as oa}from"drizzle-orm";var yd=new sO;async function _0(e){let[t]=await u.select({activeOrgId:R.activeOrgId}).from(R).where(yh(R.id,e));return t?.activeOrgId??null}c(_0,"getActiveOrgId");var y0="interval '30 minutes'";yd.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 _0(t);if(!o)return e.json({projects:[],total:0});let s=await u.execute(oa`
618
637
  WITH session_activity AS (
619
638
  SELECT
620
639
  s.id,
@@ -634,7 +653,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
634
653
  project_id,
635
654
  COUNT(*)::int AS session_count,
636
655
  COUNT(*) FILTER (
637
- WHERE ended_at IS NULL AND last_at >= now() - ${na.raw(u0)}
656
+ WHERE ended_at IS NULL AND last_at >= now() - ${oa.raw(y0)}
638
657
  )::int AS active_session_count,
639
658
  MAX(last_at) AS last_activity_at
640
659
  FROM session_activity
@@ -660,18 +679,18 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
660
679
  JOIN projects p ON p.id = pa.project_id
661
680
  ORDER BY pa.last_activity_at DESC NULLS LAST, p.created_at DESC
662
681
  LIMIT ${n} OFFSET ${r}
663
- `),[{count:i}={count:0}]=await u.execute(na`
682
+ `),[{count:i}={count:0}]=await u.execute(oa`
664
683
  SELECT COUNT(DISTINCT s.project_id)::int AS count
665
684
  FROM sessions s
666
685
  WHERE s.org_id = ${o}
667
686
  AND s.origin <> 'internal_worker'
668
687
  AND s.project_id IS NOT NULL
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`
688
+ `);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})});yd.get("/projects/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await _0(t);if(!r)return e.json({error:"No active org"},404);let[o]=await u.select().from(C).where(yh(C.id,n));if(!o)return e.json({error:"Project not found"},404);let[{has_session:s}={has_session:!1}]=await u.execute(oa`
670
689
  SELECT EXISTS(
671
690
  SELECT 1 FROM sessions
672
691
  WHERE project_id = ${n} AND org_id = ${r} AND origin <> 'internal_worker'
673
692
  ) AS has_session
674
- `);if(o.orgId!==r&&!s)return e.json({error:"Project not found"},404);let[i]=await u.execute(na`
693
+ `);if(o.orgId!==r&&!s)return e.json({error:"Project not found"},404);let[i]=await u.execute(oa`
675
694
  WITH session_activity AS (
676
695
  SELECT
677
696
  s.id,
@@ -686,11 +705,11 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
686
705
  SELECT
687
706
  COUNT(*)::int AS session_count,
688
707
  COUNT(*) FILTER (
689
- WHERE ended_at IS NULL AND last_at >= now() - ${na.raw(u0)}
708
+ WHERE ended_at IS NULL AND last_at >= now() - ${oa.raw(y0)}
690
709
  )::int AS active_session_count,
691
710
  MAX(last_at) AS last_activity_at
692
711
  FROM session_activity
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`
712
+ `),a=await u.select({path:ye.path,isWorktree:ye.isWorktree,firstSeen:ye.firstSeen,lastSeen:ye.lastSeen}).from(ye).where(yh(ye.projectId,n));return a.sort((d,l)=>{let p=d.lastSeen?.getTime()??0;return(l.lastSeen?.getTime()??0)-p}),e.json({id:o.id,name:o.name,description:o.description,gitRemoteUrl:o.gitRemoteUrl,githubRepo:o.githubRepo,createdAt:o.createdAt,sessionCount:i?.session_count??0,activeSessionCount:i?.active_session_count??0,lastActivityAt:i?.last_activity_at??null,primaryCheckoutPath:a[0]?.path??null,checkouts:a})});O();import{Hono as iO}from"hono";import{z as Kn}from"zod";import{eq as gt,and as Co,sql as w0,desc as aO,inArray as cO}from"drizzle-orm";var Tr=new iO,dO=Kn.object({name:Kn.string().min(1).max(255),description:Kn.string().min(1),scope:Kn.enum(["org","team","personal"]),scopeRef:Kn.string().uuid().optional(),version:Kn.string().default("1.0.0"),tags:Kn.array(Kn.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(Co(...o)).orderBy(aO(Ue.updatedAt)).limit(r),i=s.map(d=>d.id),a={};if(i.length>0){let d=await u.select({packId:Me.packId,count:w0`COUNT(*)::int`}).from(Me).where(cO(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:Oc(l)}}))});Tr.get("/packs/:id",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await u.select().from(Ue).where(Co(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:Oc(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=dO.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:Oc(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}=Kn.object({instructionId:Kn.string().uuid()}).parse(r),[s]=await u.select().from(Ue).where(Co(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(Co(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:w0`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(Co(gt(Ue.id,t),gt(Ue.createdBy,n),gt(Ue.archived,!1)));return o?(await u.delete(Me).where(Co(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}=Kn.object({projectId:Kn.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(Co(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(Co(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 uO}from"hono";import{eq as wh,and as lO,sql as v0}from"drizzle-orm";var pp=new uO;function I0(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(I0,"mapRow");pp.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(lO(wh(g.id,n),wh(g.archived,!1),wh(g.createdBy,t)));if(!r)return e.json({error:"Instruction not found"},404);let o=r.forkedFromId?await u.execute(v0`
694
713
  WITH RECURSIVE ancestors AS (
695
714
  SELECT id, name, forked_from_id, version, scope, created_by, created_at::text, 1 as depth
696
715
  FROM instructions
@@ -703,7 +722,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
703
722
  WHERE i.archived = false AND a.depth < 20
704
723
  )
705
724
  SELECT * FROM ancestors ORDER BY depth DESC
706
- `):[],s=await u.execute(m0`
725
+ `):[],s=await u.execute(v0`
707
726
  WITH RECURSIVE descendants AS (
708
727
  SELECT id, name, forked_from_id, version, scope, created_by, created_at::text, 1 as depth
709
728
  FROM instructions
@@ -716,7 +735,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
716
735
  WHERE i.archived = false AND d.depth < 20
717
736
  )
718
737
  SELECT * FROM descendants ORDER BY depth ASC
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`
738
+ `),i=Array.isArray(o)?o.map(I0):[],a=s.map(I0);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 fO}from"hono";import{z as Ps}from"zod";import{eq as Lo,and as Id,desc as Ih,gt as bh,lt as gO,sql as ln}from"drizzle-orm";function vd(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(vd,"reportedEngines");var pO=10;function fp(e,t){let n=c(m=>e.capabilities===null||e.capabilities.includes(m),"claims"),r=e.engines!=null&&!e.engines.claude&&!e.engines.codex,o=t.filter(m=>n(m.kind)),s=t.filter(m=>!n(m.kind)),i=r?o.filter(m=>pl(m.kind)):[],a=r?o.filter(m=>!pl(m.kind)):o,d=[],l,p;return e.present?e.active?i.length>0?(l="fail",p=`Worker is online but no LLM engine is installed \u2014 ${wd(i)} job(s) cannot produce real output (${mp(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",p=a.length>0?`Worker is running a job \u2014 ${wd(a)} more queued behind it.`:"Worker is online and running a job."):a.some(m=>m.oldestMinutes>=pO)?(l="warn",p=`Worker is online but its queue is not draining \u2014 ${wd(a)} job(s) pending (${mp(a)}).`,d.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 ${mO(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(`${wd(a)} job(s) are waiting on it (${mp(a)}) \u2014 they will drain once it is back.`)):(l="fail",p="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(`${wd(s)} job(s) cannot be claimed by this worker (${mp(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:d,stuck:a,unclaimable:s,engineBlocked:i}}c(fp,"assessWorkerHealth");function wd(e){return e.reduce((t,n)=>t+n.count,0)}c(wd,"totalOf");function mp(e){return e.map(t=>`${t.kind}\xD7${t.count}`).join(", ")}c(mp,"describe");function mO(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(mO,"formatAge");var vh=[{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'"}],b0=vh.map(({table:e,defaultKind:t})=>({table:e,defaultKind:t}));var sa=new fO,Eh=6e4,E0=600*1e3,Ah=3600*1e3,hO=10080*60*1e3,_O={"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"]},yO=new Set([]),wO=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()}),Sh=b0;async function vO(e,t=0){let n=new Date(Date.now()-t).toISOString(),r=Sh.map(({table:i,defaultKind:a})=>ln`
720
739
  SELECT coalesce(task_kind, ${a}) AS kind,
721
740
  count(*)::int AS n,
722
741
  min(created_at) AS oldest
@@ -725,23 +744,23 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
725
744
  AND status = 'pending'
726
745
  AND created_at < ${n}::timestamptz
727
746
  GROUP BY 1
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`
747
+ `),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(vO,"queryPendingKinds");async function A0(e){return(await u.execute(ln`${ln.join(Sh.map(({table:n})=>ln`
729
748
  SELECT count(*)::int AS n
730
749
  FROM ${ln.raw(n)}
731
750
  WHERE user_id = ${e}
732
751
  AND status IN ('claimed', 'running')
733
752
  AND lease_expires_at IS NOT NULL
734
753
  AND lease_expires_at > now()
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,
754
+ `),ln` UNION ALL `)}`)).reduce((n,r)=>n+Number(r.n),0)>0}c(A0,"hasLiveInFlightJob");async function IO(e,t){let n=new Date(Date.now()-E0).toISOString(),r=Sh.map(({table:p,defaultKind:m})=>ln`
755
+ SELECT coalesce(task_kind, ${m}) AS kind,
737
756
  count(*)::int AS n,
738
757
  min(created_at) AS oldest
739
- FROM ${ln.raw(m)}
758
+ FROM ${ln.raw(p)}
740
759
  WHERE user_id = ${e}
741
760
  AND status = 'pending'
742
761
  AND created_at < ${n}::timestamptz
743
762
  GROUP BY 1
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`
763
+ `),o=await u.execute(ln`${ln.join(r,ln` 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,m)=>p+Number(m.n),0),a=Date.now()-new Date(s[0].oldest).getTime(),d=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(E0/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(p=>({kind:p.kind,count:Number(p.n)}))}}}c(IO,"checkStalePendingAdvisory");function xh(e){return!e||!Array.isArray(e.capabilities)?null:e.capabilities.filter(t=>typeof t=="string")}c(xh,"reportedCapabilities");function bO(e,t){if(e!=="cli-worker")return null;let n=vd(t);if(n===null||n.claude||n.codex)return null;let r=xh(t),o=r===null?[...$c]:r.filter(s=>$c.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(bO,"checkEngineAdvisory");function EO(e,t){let n=c(s=>{let i=/^(\d+)\.(\d+)\.(\d+)/.exec((s??"").trim());return i?[Number(i[1]),Number(i[2]),Number(i[3])]:null},"parse"),r=n(e),o=n(t);if(!r||!o)return!1;for(let s=0;s<3;s++)if(r[s]!==o[s])return r[s]<o[s];return!1}c(EO,"isBehind");function AO(e,t,n,r){let o=_O[e];if(!o||o.length===0)return null;let s=t&&Array.isArray(t.capabilities)?t.capabilities.filter(a=>typeof a=="string"):null;if(s===null)return{code:"NO_CAPABILITIES_REPORTED",message:`Worker did not report any capabilities. Expected ${o.join(", ")} \u2014 likely an outdated worker process. Restart it.`};let i=o.filter(a=>!s.includes(a)&&!yO.has(a));return i.length>0?EO(n,r)?{code:"OUTDATED_WORKER",message:`Worker is running CLI ${n} but ${r} is published, and is missing capabilities: ${i.join(", ")}. Jobs of those kinds will sit pending until you upgrade. Run: npm i -g @rulemetric/cli@latest && rulemetric hooks install, then restart the worker.`,meta:{clientVersion:n,latestVersion:r,missing:i}}:{code:"MISSING_CAPABILITIES",message:`Worker is missing capabilities: ${i.join(", ")}. Jobs of those kinds will sit pending. Restart the worker after deploying API updates.`,meta:{missing:i}}:null}c(AO,"checkWorkerAdvisory");sa.post("/workers/heartbeat",async e=>{let t=e.get("userId"),n=await e.req.json(),r=wO.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(Id(Lo(fe.userId,t),gO(fe.lastHeartbeat,new Date(Date.now()-hO)))).catch(()=>{});let o=await Wf().catch(()=>null),s=AO(r.workerType,r.metadata,r.clientVersion,o);return s??=bO(r.workerType,r.metadata),!s&&r.workerType==="cli-worker"&&(s=await IO(t,xh(r.metadata))),s&&console.warn(`[workers/heartbeat] ${r.workerType} ${r.clientName} (version=${r.workerVersion??"unknown"}): ${s.code} \u2014 ${s.message}`),e.json({status:"ok",...s?{advisory:s}:{}})});async function S0(e){let t=new Date(Date.now()-Ah),n=await u.select({lastHeartbeat:fe.lastHeartbeat}).from(fe).where(Id(Lo(fe.userId,e),Lo(fe.workerType,"cli-worker"),bh(fe.lastHeartbeat,t))),r=Date.now();return{cliEverConnected:n.length>0,workerActive:n.some(o=>r-new Date(o.lastHeartbeat).getTime()<Eh)}}c(S0,"computeCliWorkerSetupSignals");async function gp(e){let t=await u.select({lastHeartbeat:fe.lastHeartbeat,metadata:fe.metadata}).from(fe).where(Id(Lo(fe.userId,e),Lo(fe.workerType,"cli-worker"))).orderBy(Ih(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(gp,"getLatestLlmEngines");sa.get("/workers/status",async e=>{let t=e.get("userId"),n=new Date(Date.now()-Ah),r=await u.select().from(fe).where(Id(Lo(fe.userId,t),bh(fe.lastHeartbeat,n))).orderBy(Ih(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<Eh?"active":"inactive"}});return e.json(s)});sa.get("/workers/health",async e=>{let t=e.get("userId"),n=new Date(Date.now()-Ah),[r,o,s]=await Promise.all([u.select({lastHeartbeat:fe.lastHeartbeat,clientName:fe.clientName,clientVersion:fe.clientVersion,metadata:fe.metadata}).from(fe).where(Id(Lo(fe.userId,t),Lo(fe.workerType,"cli-worker"),bh(fe.lastHeartbeat,n))).orderBy(Ih(fe.lastHeartbeat)).limit(1),vO(t),A0(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<Eh,ageSeconds:a==null?null:Math.round(a/1e3),capabilities:i?xh(d):null,busy:s,engines:i?vd(d):null},p=fp(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})});O();import{Hono as NO}from"hono";import{z as yp}from"zod";import{and as Rh,desc as L0,eq as kr,inArray as PO,isNull as DO,sql as Be}from"drizzle-orm";O();import{sql as x0}from"drizzle-orm";async function R0(e,t){return Promise.all(t.filter(n=>n.canonicalPath!=null).map(async n=>{let[r,o,s]=await Promise.all([bs(e,n.projectId),xo(e,n.projectId),Pi(e,n.projectId)]),[i,a,d,l]=await Promise.all([u.execute(x0`
745
764
  SELECT (SELECT count(*)::int FROM instruction_experiments e
746
765
  WHERE e.user_id = ${e}::uuid AND e.status = 'running'
747
766
  AND e.project_path = ${n.canonicalPath}) AS running,
@@ -763,7 +782,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
763
782
  AND e.project_path = s.project_path
764
783
  AND e.status = 'running'
765
784
  )) AS eligible
766
- `),Di(e,n.canonicalPath,n.projectId,o.windowDays),u.execute(y0`
785
+ `),Di(e,n.canonicalPath,n.projectId,o.windowDays),u.execute(x0`
767
786
  SELECT (SELECT count(*)::int FROM instruction_suggestions s
768
787
  JOIN instructions i ON i.id = s.instruction_id
769
788
  WHERE s.user_id = ${e}::uuid
@@ -820,8 +839,25 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
820
839
  AND ev.event_type = 'accepted' AND ev.actor = 'auto'
821
840
  AND s.project_id = ${n.projectId}::uuid
822
841
  AND ev.created_at > now() - make_interval(days => ${o.windowDays})
823
- ) AS window_resets_at
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`
842
+ ) AS window_resets_at,
843
+ -- The 0.5–0.79 band: emitted by the scorer (its floor is
844
+ -- RECOMMENDATION_EMIT_FLOOR in @rulemetric/core), below the
845
+ -- adoption gate. Feed-only by construction — reported so the
846
+ -- operator can tell "the machine has nothing to take" from
847
+ -- "the pool is full of feed material" (census 2026-08-27:
848
+ -- one undifferentiated count hid a 393-row dead band).
849
+ (SELECT count(*)::int FROM instruction_suggestions s
850
+ JOIN instructions i ON i.id = s.instruction_id
851
+ WHERE s.user_id = ${e}::uuid
852
+ AND s.project_path = ${n.canonicalPath}
853
+ AND s.kind = 'add'
854
+ AND s.accepted_at IS NULL AND s.dismissed_at IS NULL
855
+ AND i.archived = false
856
+ AND i.type IN ('instruction', 'skill')
857
+ AND s.score < ${o.minScore}
858
+ AND COALESCE(i.frontmatter->>'source', '') <> 'insights'
859
+ ) AS feed_only
860
+ `),Di(e,n.canonicalPath,n.projectId,o.windowDays,"skill")]),p=i[0],m=p?.running??0,_=p?.eligible??0;return{projectId:n.projectId,trials:{running:m,orphaned:p?.orphaned??0,eligible:_,maxConcurrent:r.maxConcurrent,maxPerRun:r.maxPerRun,blocked:Nl(r,m,_).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,feedOnly:d[0]?.feed_only??0,windowResetsAt:d[0]?.window_resets_at??null}}}))}c(R0,"loadPromotionPaths");O();import{sql as T0}from"drizzle-orm";function j0(e){for(let t=e,n=0;t&&n<4;n++){if(t.code==="42P01")return!0;t=t.cause}return!1}c(j0,"isMissingRelation");var k0=["proposed","ready","applied","measuring","improved","inconclusive","harmful","rollback_ready","reverted","failed"];async function N0(e,t){try{let[n,r]=await Promise.all([u.execute(T0`
825
861
  SELECT a.id::text, a.instruction_id::text, i.name AS title, i.type AS artifact,
826
862
  a.harness, a.target_path, a.project_path, a.status, a.apply_mode,
827
863
  a.verdict_detail, a.updated_at::text
@@ -830,7 +866,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
830
866
  WHERE a.user_id = ${e}::uuid
831
867
  ORDER BY a.updated_at DESC
832
868
  LIMIT 50
833
- `),u.execute(v0`
869
+ `),u.execute(T0`
834
870
  SELECT status, count(*)::int AS n,
835
871
  count(*) FILTER (
836
872
  WHERE a.applied_at > now() - make_interval(hours => ${t})
@@ -839,7 +875,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
839
875
  FROM recommendation_applications a
840
876
  WHERE user_id = ${e}::uuid
841
877
  GROUP BY ROLLUP (status)
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`
878
+ `)]),o=Object.fromEntries(k0.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(!j0(n))throw n;return{available:!1,counts:Object.fromEntries(k0.map(r=>[r,0])),appliedInWindow:0,appliedEver:0,applications:[]}}}c(N0,"loadRecommendationAdoption");O();import{sql as SO}from"drizzle-orm";var xO={blocking:!1,totalAwaitingReview:0,targets:[]};async function hp(e){let t=await u.execute(SO`
843
879
  WITH enrolled AS (
844
880
  -- Segment resolved ONCE per enrolled target. Leaving the function call in
845
881
  -- the join predicate below made Postgres re-evaluate it per row.
@@ -891,7 +927,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
891
927
  GROUP BY id, name
892
928
  )
893
929
  SELECT * FROM per_target
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`
930
+ `);return RO(t)}c(hp,"loadReviewGate");function RO(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?xO:{blocking:!0,totalAwaitingReview:t.reduce((n,r)=>n+r.awaitingReview,0),targets:t}}c(RO,"summarizeReviewGate");function _p(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(_p,"toReviewGateResponse");import{sql as Ds}from"drizzle-orm";var P0=["all","evolution","decided","skipped","failed"],TO=["cron_instruction_evolution","cron_instruction_training","cron_auto_accept_suggestions","cron_suggest_instructions","cron_refine_cases","cron_retire_unused_skills","process_insights"];function ia(e){switch(e){case"evolution":return Ds`kind IN (${Ds.join(TO.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(ia,"clauseFor");function D0(e){return e==="all"?null:ia(e)}c(D0,"filterClause");O();import{sql as O0}from"drizzle-orm";var kO={insights:"regenerate_insights_jobs",training:"enqueue_instruction_training",autoAccept:"enqueue_auto_accept_suggestions",evolution:"enqueue_instruction_evolution",autorun:"enqueue_eval_autorun"};async function jO(e){try{let t=await Fe.execute(O0`SELECT ${O0.raw(e)}() AS r`);return String(t[0]?.r??"0")}catch(t){return`error: ${t instanceof Error?t.message:String(t)}`}}c(jO,"runProducer");async function C0(){let e={};for(let[t,n]of Object.entries(kO))e[t]=await jO(n);return e}c(C0,"runAllProducers");var bd=new NO;var OO=yp.object({limit:yp.coerce.number().int().min(1).max(100).default(20),hours:yp.coerce.number().int().min(1).max(720).default(24),filter:yp.enum(P0).default("all")}),CO=6e4,LO=3600*1e3,MO=8;function M0(e,t){return Be.join(vh.map(({table:n,defaultKind:r,labelIdSql:o,labelTextSql:s})=>Be`
895
931
  SELECT id::text AS id,
896
932
  ${n} AS source_table,
897
933
  coalesce(task_kind, ${r}) AS kind,
@@ -908,8 +944,8 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
908
944
  result->>'decision' AS decision,
909
945
  error
910
946
  FROM ${Be.raw(n)}
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`
947
+ WHERE user_id = ${e}::uuid AND ${t}`),Be` UNION ALL `)}c(M0,"jobSelect");bd.post("/loop/run-now",async e=>e.json(await C0()));bd.get("/loop/status",async e=>{let t=e.get("userId"),n=OO.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=N0(t,o),d=hp(t),l=M0(t,Be`status IN ('pending', 'claimed', 'running')`),p=M0(t,Be`status IN ('completed', 'failed')
948
+ AND completed_at > now() - make_interval(hours => ${o})`),m=D0(s),_=m?Be`SELECT * FROM (${p}) w WHERE ${m}`:Be`SELECT * FROM (${p}) w`,w=u.execute(Be`
913
949
  WITH proj AS (
914
950
  SELECT s.project_id,
915
951
  max(greatest(s.started_at, coalesce(s.ended_at, s.started_at))) AS last_activity
@@ -917,7 +953,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
917
953
  WHERE s.user_id = ${t}::uuid AND s.project_id IS NOT NULL
918
954
  GROUP BY s.project_id
919
955
  ORDER BY last_activity DESC
920
- LIMIT ${jO}
956
+ LIMIT ${MO}
921
957
  )
922
958
  SELECT p.project_id::text AS project_id,
923
959
  pr.name AS name,
@@ -947,13 +983,13 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
947
983
  FROM (SELECT DISTINCT s.project_id FROM sessions s
948
984
  WHERE s.user_id = ${t}::uuid AND s.project_id IS NOT NULL) p
949
985
  LEFT JOIN project_canonical_checkouts c ON c.project_id = p.project_id
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`
986
+ `),[h,v,I,b]=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`
951
987
  SELECT count(*)::int AS total,
952
- count(*) FILTER (WHERE ${oa("evolution")})::int AS evolution,
953
- count(*) FILTER (WHERE ${oa("decided")})::int AS decided,
954
- count(*) FILTER (WHERE ${oa("skipped")})::int AS skipped,
955
- count(*) FILTER (WHERE ${oa("failed")})::int AS failed
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`
988
+ count(*) FILTER (WHERE ${ia("evolution")})::int AS evolution,
989
+ count(*) FILTER (WHERE ${ia("decided")})::int AS decided,
990
+ count(*) FILTER (WHERE ${ia("skipped")})::int AS skipped,
991
+ count(*) FILTER (WHERE ${ia("failed")})::int AS failed
992
+ FROM (${p}) q`)]),A=[...new Set([...h,...v].map(j=>j.label_id).filter(j=>!!j))],S=new Map;if(A.length>0){let j=await u.select({id:k.id,name:k.name}).from(k).where(PO(k.id,A));for(let ht of j)S.set(ht.id,ht.name)}let E=Date.now(),T=c(j=>(j.label_id?S.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((E-new Date(j.claimed_at).getTime())/1e3):null,leaseHealthy:j.lease_expires_at?new Date(j.lease_expires_at).getTime()>E:!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((E-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})),L=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(L0(ae.createdAt)).limit(r),q=u.execute(Be`
957
993
  SELECT count(*)::int AS decisions,
958
994
  count(*) FILTER (WHERE p.applied)::int AS applied,
959
995
  count(*) FILTER (WHERE p.created_at > ${i})::int AS window_decisions,
@@ -995,7 +1031,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
995
1031
  and ${x.declinedAt} is null
996
1032
  and ${x.dismissedAt} is null
997
1033
  and not ${x.isStale}
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`
1034
+ )::int`}).from(x).where(kr(x.userId,t)),[J,ce,V,me]=await Promise.all([u.select({n:Be`count(*)::int`}).from(ae).where(kr(ae.userId,t)),u.select({n:Be`count(*)::int`}).from(U).where(Rh(kr(U.userId,t),kr(U.status,"running"))),u.select({kind:x.kind,n:Be`count(*)::int`}).from(x).where(Rh(kr(x.userId,t),DO(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=R0(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(Rh(kr(fe.userId,t),kr(fe.workerType,"cli-worker"),Be`${fe.lastHeartbeat} > ${new Date(E-LO).toISOString()}::timestamptz`)).orderBy(L0(fe.lastHeartbeat)).limit(1))[0],rt=ze?E-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<CO,ageSeconds:rt==null?null:Math.round(rt/1e3),capabilities:null,busy:P.length>0,engines:ze?vd(ze.metadata):null},be=await a,cn=await le,M=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:fp(Xe,Le),reviewGate:_p(M),running:P,queued:H,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:L,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: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: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 $O}from"hono";var wp=new $O;wp.get("/loop/review-gate",async e=>{let t=e.get("userId");return e.json(_p(await hp(t)))});O();import{Hono as UO}from"hono";import{z as Lt}from"zod";import{and as HO,eq as Cn,sql as Os}from"drizzle-orm";O();import{and as qO,eq as $0}from"drizzle-orm";async function nt(e,t){let[n]=await u.select({id:k.id}).from(k).where(qO($0(k.id,e),$0(k.userId,t)));return n}c(nt,"verifyTargetOwnership");function Ed(e){return e===!0||e==="true"}c(Ed,"flagOn");function vp(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=Ed(n.autoEvolvePaused);return{enabled:Ed(n.autoEvolveEnabled),optOut:Ed(n.autoEvolveOptOut),apply:Ed(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:Ed(n.autoEvolveAccumulate)}}c(vp,"resolveEvolutionSettings");function q0(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(q0,"applyEvolutionPatch");function Ip(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(Ip,"describeEvolutionState");var Gn=new UO,BO=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"});Gn.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 FO={minScore:"autoAcceptMinScore",maxPerRun:"autoAcceptMaxPerRun",maxPerWindow:"autoAcceptMaxPerWindow",windowDays:"autoAcceptWindowDays"};function WO(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(WO,"mergeLimitOverrides");Gn.patch("/settings/auto-accept",async e=>{let t=e.get("userId"),n=BO.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 p=WO(d.autoAcceptLimits,s);Object.keys(p).length>0?l.autoAcceptLimits=p: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(FO)){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 zO=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 bp(e){let[t]=await u.select({paused:R.evolutionPaused}).from(R).where(Cn(R.id,e));return t?.paused??!1}c(bp,"readAccountPaused");var VO=Lt.object({paused:Lt.boolean()});Gn.get("/settings/evolution-account",async e=>{let t=e.get("userId");return e.json({paused:await bp(t)})});Gn.patch("/settings/evolution-account",async e=>{let t=e.get("userId"),n=VO.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)});Gn.get("/settings/evolution/targets",async e=>{let t=e.get("userId"),n=await bp(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(HO(Cn(k.userId,t),Cn(k.type,"instruction"))).orderBy(k.name)).map(i=>{let a=vp(i,n);return{evalTargetId:i.id,name:i.name,settings:a,summary:Ip(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})});Gn.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=vp(o.metadata,await bp(t));return e.json({evalTargetId:n,name:o.name,settings:s,summary:Ip(s),limits:{minPairs:10,maxPairs:128}})});Gn.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=zO.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=q0(s.metadata,r.data);await u.update(k).set({metadata:i}).where(Cn(k.id,n));let a=vp(i,await bp(t));return e.json({evalTargetId:n,settings:a,summary:Ip(a)})});var JO=Lt.object({maxConcurrent:Lt.number().int().nullable().optional(),maxPerRun:Lt.number().int().nullable().optional()});Gn.get("/settings/trial-limits",async e=>{let t=e.get("userId"),n=e.req.query("projectPath"),r=n?await Fn(n):null,o=await bs(t,r);return e.json({...o,defaults:{maxConcurrent:Ci.MAX_CONCURRENT,maxPerRun:Ci.MAX_PER_RUN},bounds:Qc})});Gn.patch("/settings/trial-limits",async e=>{let t=e.get("userId"),n=JO.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(Qc)){let s=n.data[o];s!==void 0&&(r[o==="maxConcurrent"?"trialMaxConcurrent":"trialMaxPerRun"]=s===null?null:Ng(o,s))}return Object.keys(r).length>0&&await u.update(R).set(r).where(Cn(R.id,t)),e.json(await bs(t,null))});O();import{Hono as KO}from"hono";import{and as GO,eq as YO,sql as XO}from"drizzle-orm";var Ep=new KO;Ep.get("/setup/status",async e=>{let t=e.get("userId"),[n,r,o]=await Promise.all([S0(t),u.select({id:y.id}).from(y).where(GO(YO(y.userId,t),XO`${y.origin} <> 'internal_worker'`)).limit(1),gp(t)]);return e.json({cliEverConnected:n.cliEverConnected,anyCapturedSession:r.length>0,workerActive:n.workerActive,llmEngines:o})});O();import{createHash as QO}from"node:crypto";import{Hono as ZO}from"hono";import{z as Ln}from"zod";import{eq as jr,and as Ap,desc as eC,sql as tC}from"drizzle-orm";var Mo=new ZO,nC=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({})}),rC=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()});Mo.post("/eval-targets",async e=>{let t=e.get("userId"),n=await e.req.json(),r=nC.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)});Mo.get("/eval-targets",async e=>{let t=e.get("userId"),n=e.req.query("type"),r=e.req.query("content_hash"),o=[jr(k.userId,t)];n&&o.push(jr(k.type,n)),r&&o.push(tC`${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,p=Number.isFinite(l)?Math.max(0,l):0,m=await u.select({id:k.id,userId:k.userId,name:k.name,type:k.type,description:k.description,metadata:k.metadata,version:k.version,parentId:k.parentId,createdAt:k.createdAt,updatedAt:k.updatedAt}).from(k).where(Ap(...o)).orderBy(eC(k.updatedAt)).limit(d).offset(p);return e.json(m)});Mo.get("/eval-targets/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(k).where(Ap(jr(k.id,n),jr(k.userId,t)));return r?e.json(r):e.json({error:"Eval target not found"},404)});Mo.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(Ap(jr(k.id,n),jr(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:QO("sha256").update(o).digest("hex")},updatedAt:new Date}).where(jr(k.id,n)).returning({version:k.version});return e.json({id:n,synced:!0,version:a.version})});Mo.put("/eval-targets/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=rC.parse(r),[s]=await u.select().from(k).where(Ap(jr(k.id,n),jr(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(jr(k.id,n)).returning();return e.json(i)});O();import{Hono as oC}from"hono";import{z as Jt}from"zod";import{eq as Sp,and as B0,isNull as sC,desc as iC}from"drizzle-orm";var aa=new oC,aC=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([])});aa.post("/eval-targets/:id/evals",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=aC.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)});aa.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?Sp(Ee.evalTargetId,n):B0(Sp(Ee.evalTargetId,n),sC(Ee.retiredAt))).orderBy(iC(Ee.createdAt));return e.json(s)});var cC=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"});aa.patch("/eval-targets/:id/evals/:evalId",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=e.req.param("evalId"),o=cC.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(B0(Sp(Ee.id,r),Sp(Ee.evalTargetId,n))).returning();return a?e.json(a):e.json({error:"Eval case not found"},404)});O();import{Hono as uC}from"hono";import{z as De}from"zod";import{createHash as lC}from"node:crypto";import{and as Rp,eq as pn,gte as z0,desc as pC,sql as kh}from"drizzle-orm";import{eq as dC,sql as Qr}from"drizzle-orm";function Th(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,p=o(l);if(p)return{currentJudgeModel:p,quarantinedElectors:a,electedBy:"anchors"};let m=r(l);return{currentJudgeModel:m,quarantinedElectors:a,electedBy:m?"recency":"none"}}c(Th,"electJudgeSegment");var F0={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 ca(e,t){let r=await u.execute(Qr`
999
1035
  SELECT
1000
1036
  r.configuration,
1001
1037
  r.created_at,
@@ -1041,7 +1077,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
1041
1077
  AND r.configuration IN ('with_target', 'without_target')
1042
1078
  `),s=(await u.execute(Qr`
1043
1079
  SELECT metadata->>'graderModel' AS pin FROM eval_targets WHERE id = ${t}
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`
1080
+ `))[0]?.pin??null,{currentJudgeModel:i,quarantinedElectors:a,electedBy:d}=Th(r.map(M=>({...M,labeled:M.llm_total>0&&M.llm_annotated>=M.llm_total})),{pin:s}),l=null,p=-1;for(let M of r){let j=new Date(M.created_at).getTime();j>p&&(p=j,l=M.methodology)}let m={with_target:{unlabeledJudge:[],labeled:[]},without_target:{unlabeledJudge:[],labeled:[]}},_={with_target:[],without_target:[]},w=0,f=new Map,h=0,v=0,I=0,b=0;for(let M of r){let j=m[M.configuration];if(!j)continue;let ht=M.methodology!==l||M.pre_edit;M.methodology!==l&&(I+=1),M.pre_edit&&(b+=1);let Nt=M.judge_pass?1:0,nr=M.llm_annotated>=M.llm_total;if(M.llm_total>0){let fn=M.judge_model,co=f.get(fn)??{runs:0,labeledRuns:0,latestRunAt:M.created_at};if(co.runs+=1,nr&&(co.labeledRuns+=1),new Date(M.created_at).getTime()>new Date(co.latestRunAt).getTime()&&(co.latestRunAt=M.created_at),f.set(fn,co),fn!==i){h+=1,nr&&(v+=1);continue}}if(nr){let fn=M.det_all_passed&&M.llm_truly_passed===M.llm_total?1:0;_[M.configuration]?.push({human:fn,judge:Nt}),M.llm_total>0&&(w+=1)}if(!ht)if(nr){let fn=M.det_all_passed&&M.llm_truly_passed===M.llm_total?1:0;j.labeled.push({human:fn,judge:Nt})}else j.unlabeledJudge.push(Nt)}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(dC(et.evalTargetId,t)),S=m.with_target.unlabeledJudge.length+m.with_target.labeled.length+m.without_target.unlabeledJudge.length+m.without_target.labeled.length,E=await u.execute(Qr`
1045
1081
  SELECT
1046
1082
  r.eval_target_id::text AS target_id,
1047
1083
  r.configuration,
@@ -1083,7 +1119,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
1083
1119
  AND r.grading->'summary'->>'pass_rate' IS NOT NULL
1084
1120
  AND r.configuration IN ('with_target', 'without_target')
1085
1121
  AND r.grading->>'judge_model' IS NOT DISTINCT FROM ${i}
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`
1122
+ `),T=new Map;for(let M of E){if(M.llm_total<=0||M.llm_annotated<M.llm_total)continue;let j=T.get(M.target_id)??{with_target:[],without_target:[]},ht=M.det_all_passed&&M.llm_truly_passed===M.llm_total?1:0,Nt=M.judge_pass?1:0;M.configuration==="with_target"?j.with_target.push(ht-Nt):j.without_target.push(ht-Nt),T.set(M.target_id,j)}let P=c(M=>{let j=M.length;if(j===0)return{rectifier:0,variance:1/0,n:0};let ht=M.reduce((nr,fn)=>nr+fn,0)/j,Nt=j<2?0:M.reduce((nr,fn)=>nr+(fn-ht)**2,0)/(j-1);return{rectifier:ht,variance:Nt/j,n:j}},"toRectifier"),H=c(M=>M.map(j=>j.human-j.judge),"selfDeltas"),N=[...T.values()].map(M=>P(M.with_target)),L=[...T.values()].map(M=>P(M.without_target)),q=El(P(H(_.with_target)),N),B=El(P(H(_.without_target)),L),J=[...T.values()].reduce((M,j)=>M+j.with_target.length+j.without_target.length,0),ce=w+J,V=(w>0?1:0)+[...T.values()].filter(M=>M.with_target.length+M.without_target.length>0).length,me=q.pooledApplied||B.pooledApplied,F=V>=3&&ce>=Ti,he=c(M=>({rectifier:M.rectifierUsed,variance:M.variance,sufficient:F}),"asInput"),D=S>0?zc(m.with_target,m.without_target,me?{withPooledRectifier:he(q),withoutPooledRectifier:he(B)}:{}):null,re=vg(m.with_target,m.without_target,{humanLabeledRuns:w,...me?{pool:{withPooledRectifier:he(q),withoutPooledRectifier:he(B),totalAnchors:ce,targets:V}}:{}}),Ce=new Map;for(let M of r){if(M.judge_model!==i||M.methodology!==l||M.pre_edit||M.pass_rate==null)continue;let j=Ce.get(M.eval_id)??{name:M.eval_name,withRates:[],withoutRates:[]};M.configuration==="with_target"?j.withRates.push(M.pass_rate):M.configuration==="without_target"&&j.withoutRates.push(M.pass_rate),Ce.set(M.eval_id,j)}let St=[],le=[],de=c(M=>M.length?M.reduce((j,ht)=>j+ht,0)/M.length:null,"mean_"),Se=[];for(let[M,{name:j,withRates:ht,withoutRates:Nt}]of Ce.entries())ht.length>0&&Nt.length>0?(St.push({name:j,withPassRate:de(ht),withoutPassRate:de(Nt)}),le.push(M)):Se.push({evalId:M,name:j,withPassRate:de(ht),withoutPassRate:de(Nt)});let ze=gg(fg(St),{unpaired:Se.length}),rt=[...f.entries()].filter(([M,j])=>M!==i&&j.labeledRuns>0).sort((M,j)=>j[1].labeledRuns-M[1].labeledRuns),Le=rt.reduce((M,[,j])=>M+j.labeledRuns,0),Xe=i?f.get(i):void 0,be=Le>0?`${Le} human-labeled run(s) are stranded on `+rt.map(([M,j])=>`${M} (${j.labeledRuns} labeled / ${j.runs} runs)`).join(", ")+`; the current segment is ${i??"unstamped"} (${Xe?.runs??0} runs, ${Xe?.labeledRuns??0} labeled), `+F0[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(([M,j])=>({model:M,...j})).sort((M,j)=>new Date(j.latestRunAt).getTime()-new Date(M.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?hl(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:b,runsInSegment:S},calibration:D,powerCheck:{...re,reasons:cn},pooling:{engaged:me,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((M,j)=>({evalId:le[j],name:M.name,withPassRate:M.withPassRate,withoutPassRate:M.withoutPassRate,separation:M.separation,discriminating:M.discriminating,note:M.note})).sort((M,j)=>M.separation-j.separation),unpairedCases:Se}}}c(ca,"computeJudgeCalibration");async function W0(e){return(await u.execute(Qr`
1087
1123
  WITH current_judge AS (
1088
1124
  -- Canonical segment (00193), not a fourth hand-copy of the recency rule.
1089
1125
  -- The review queue and the adequacy gate MUST scope to the same judge, or
@@ -1108,7 +1144,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
1108
1144
  AND (SELECT count(*) FROM jsonb_array_elements(r.grading->'expectations') e
1109
1145
  WHERE COALESCE(e->>'method', 'llm') = 'llm'
1110
1146
  AND COALESCE(e->>'errored', 'false') <> 'true') > COALESCE(a.llm_annotated, 0)
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`
1147
+ `))[0]?.remaining??0}c(W0,"countRunsAwaitingReview");var Cs=new uC,xp=c(e=>lC("sha256").update(e).digest("hex"),"sha256"),mC=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()}),fC=De.object({candidateContent:De.string().min(1),proposalSource:De.enum(["llm","groom","human"]),proposalRationale:De.string().default(""),pairs:De.array(mC).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=fC.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(pn(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=wl(d,{baseline:"prior-version"}),p=!1,m=["adequacy could not be computed for this target"];try{let P=await ca(t,n);p=P.powerCheck.adequate,m=P.powerCheck.reasons??[]}catch(P){m=[`adequacy check failed: ${P instanceof Error?P.message:String(P)}`]}let _=r.windowDays??Kc,w=r.maxPromotionsPerWindow??ki,f=new Date(Date.now()-_*24*60*60*1e3),[h]=await u.select({n:kh`count(*)::int`}).from(ae).where(Rp(pn(ae.evalTargetId,n),pn(ae.applied,!0),z0(ae.createdAt,f))),v=h?.n??0,I=xp(i),b=r.measuredAgainstContentHash===void 0?void 0:r.measuredAgainstContentHash===I,A=Sg({verdict:l,canaryGreen:r.canaryGreen,adequate:p,adequacyReasons:m,promotionsInWindow:v,maxPromotionsPerWindow:w,immutableSections:r.immutableSections,beforeContent:i,afterContent:a,measurementMatchesPredecessor:b}),S={canaryGreen:r.canaryGreen,adequate:p,adequacyReasons:m,promotionsInWindow:v,maxPromotionsPerWindow:w,windowDays:_,immutableSections:r.immutableSections,nPairs:d.length,measurementMatchesPredecessor:b??null,measuredAgainstContentHash:r.measuredAgainstContentHash??null,cost:r.measurementCost??null,accumulation:r.accumulation?{...r.accumulation,pairs:d}:null,applied:!1},E=A.decision==="promote"&&r.apply;S.applied=E;let T;try{T=await u.transaction(async P=>{if(E){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:xp(a)},updatedAt:new Date}).where(pn(k.id,n))}let[H]=await P.insert(ae).values({userId:t,evalTargetId:n,fromContentHash:I,toContentHash:xp(a),fromContent:i,toContent:a,proposalSource:r.proposalSource,proposalRationale:r.proposalRationale,decision:A.decision,applied:E,refusals:A.refusals,rationale:A.rationale,effectClass:A.effect,verdict:l,gates:S,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:E,rationale:A.rationale,refusals:A.refusals,effectClass:A.effect,touchedSections:A.touched,verdict:l,gates:S},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(pn(ae.evalTargetId,n)).orderBy(pC(ae.createdAt)).limit(r).offset(o),a=await u.select({decision:ae.decision,n:kh`count(*)::int`}).from(ae).where(pn(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,p)=>l+p,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(Rp(pn(ae.id,n),pn(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(pn(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()-Kc*864e5),[d]=await o.select({n:kh`count(*)::int`}).from(ae).where(Rp(pn(ae.evalTargetId,s.evalTargetId),pn(ae.applied,!0),z0(ae.createdAt,a)));if((d?.n??0)>=ki)return{status:409,body:{error:`Change budget exhausted (${d?.n}/${ki} applied in ${Kc}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:xp(s.toContent)},updatedAt:new Date}).where(pn(k.id,s.evalTargetId));let p=s.gates&&typeof s.gates=="object"&&!Array.isArray(s.gates)?s.gates:{};return await o.update(ae).set({applied:!0,gates:{...p,applied:!0,appliedAt:new Date().toISOString(),appliedVia:"deferred-human-apply"}}).where(pn(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(Rp(pn(ae.id,n),pn(ae.userId,t)));return r?e.json(r):e.json({error:"Promotion not found"},404)});O();import{Hono as hC}from"hono";import{z as ge}from"zod";import{and as da,desc as _C,eq as jt}from"drizzle-orm";var V0=["proposed","ready","applied","measuring","improved","inconclusive","harmful","rollback_ready","reverted","failed"],gC={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 J0(e,t){return gC[e].includes(t)}c(J0,"canTransitionRecommendationApplication");var ua=new hC,K0=ge.enum(["claude_code","codex","shared"]),G0=ge.enum(V0),yC=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)})]),wC=ge.object({instructionId:ge.string().uuid(),projectId:ge.string().uuid().optional(),projectPath:ge.string().min(1),harness:K0,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(Mc).optional(),targets:ge.array(ge.string().min(1)).optional(),inverse:yC.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()});ua.get("/recommendation-applications",async e=>{let t=e.get("userId"),n=ge.object({harness:K0.optional(),artifact:ge.string().min(1).optional(),status:G0.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=[jt(Te.userId,t)];n.instructionId&&r.push(jt(Te.instructionId,n.instructionId)),n.harness&&r.push(jt(Te.harness,n.harness)),n.status&&r.push(jt(Te.status,n.status)),n.projectPath&&r.push(jt(Te.projectPath,n.projectPath)),n.artifact&&r.push(jt(g.type,n.artifact));let o=await u.select({application:Te,artifact:g.type,title:g.name}).from(Te).innerJoin(g,jt(g.id,Te.instructionId)).where(da(...r)).orderBy(_C(Te.updatedAt)).limit(n.limit);return e.json({applications:o.map(({application:s,...i})=>({...s,...i}))})});ua.post("/recommendation-applications",async e=>{let t=e.get("userId"),n=wC.parse(await e.req.json()),[r]=await u.select({id:g.id}).from(g).where(da(jt(g.id,n.instructionId),jt(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"}],...tg(l),...n.inverse?ng(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 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(da(jt(Te.userId,t),jt(Te.instructionId,n.instructionId),jt(Te.projectPath,n.projectPath),jt(Te.harness,n.harness),jt(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(da(jt(Te.id,a.id),jt(Te.userId,t),jt(Te.status,a.status))).returning();if(l)return e.json({application:l},200)}return e.json({application:a},200)});var vC=ge.object({status:G0,beforeHash:ge.string().optional(),appliedHash:ge.string().optional(),verdictDetail:ge.string().optional()});ua.post("/recommendation-applications/:id/transition",async e=>{let t=e.get("userId"),n=vC.parse(await e.req.json()),[r]=await u.select().from(Te).where(da(jt(Te.id,e.req.param("id")),jt(Te.userId,t))).limit(1);if(!r)return e.json({error:"Recommendation application not found"},404);if(!J0(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(da(jt(Te.id,r.id),jt(Te.userId,t),jt(Te.status,r.status))).returning();return i?e.json({application:i}):e.json({error:"Application changed concurrently; retry"},409)});O();import{Hono as IC}from"hono";import{z as yt}from"zod";import{eq as lr,and as jh,asc as bC,desc as Y0,isNull as EC,inArray as AC,sql as SC}from"drizzle-orm";var Ls=new IC,xC=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()}),RC=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=xC.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(jh(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)});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,p=a?parseInt(a,10):NaN,m=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(AC(Ie.evalId,u.select({id:Ee.id}).from(Ee).where(jh(lr(Ee.evalTargetId,n),EC(Ee.retiredAt)))));let w=e.req.query("candidateContentHash");w&&_.push(SC`${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(lr(Ie.jobId,I.data))}let v=(await u.select().from(Ie).where(jh(..._)).orderBy(Y0(Ie.createdAt),bC(Ie.id)).limit(l).offset(m)).map(I=>{let b=I.outputs??{},{diff:A,transcript:S,...E}=b,T=w?E:{...E,transcript:S};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=RC.parse(r);if(!await nt(n,t))return e.json({error:"Eval target not found"},404);let[i]=await u.insert(or).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(or).where(lr(or.evalTargetId,n)).orderBy(Y0(or.createdAt));return e.json(o)});O();import{Hono as TC}from"hono";import{z as Kt}from"zod";import{eq as Ms,and as Q0,or as kC,desc as jC,asc as NC}from"drizzle-orm";import{alias as X0}from"drizzle-orm/pg-core";var la=new TC,PC=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")});la.post("/eval-comparisons",async e=>{let t=e.get("userId"),n=await e.req.json(),r=PC.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)});la.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,p=X0(k,"targets_a"),m=X0(k,"targets_b"),_=await u.select({id:ot.id,userId:ot.userId,targetAId:ot.targetAId,targetBId:ot.targetBId,targetAName:p.name,targetBName:m.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,Ms(ot.targetAId,p.id)).innerJoin(m,Ms(ot.targetBId,m.id)).where(Q0(Ms(ot.userId,t),kC(Ms(ot.targetAId,n),Ms(ot.targetBId,n)))).orderBy(jC(ot.createdAt),NC(ot.id)).limit(a).offset(l);return e.json(_.map(w=>({...w,rawOutput:null})))});la.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(Q0(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 LC}from"hono";import{z as pa}from"zod";import{eq as ma,and as Nh,desc as MC,asc as $C,inArray as qC,sql as UC}from"drizzle-orm";O();import{sql as DC}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 eE=c((e,t)=>({agree:e,total:t,rate:t>0?e/t:null}),"slice");function OC(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:eE(e.judgePassAgree,e.judgePassPairs),onJudgeFail:eE(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(OC,"reviewerAgreementReport");async function tE(e){return(await u.execute(DC`
1112
1148
  SELECT
1113
1149
  j.reviewer_engine,
1114
1150
  array_agg(DISTINCT j.reviewer_model) AS models,
@@ -1140,7 +1176,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
1140
1176
  ) j
1141
1177
  GROUP BY j.reviewer_engine
1142
1178
  ORDER BY j.reviewer_engine
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`
1179
+ `)).map(n=>OC({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(tE,"computeReviewerAgreement");O();import{eq as CC}from"drizzle-orm";async function Ad(e,t,n={}){let{nudge:r=!0}=n;try{let[o]=await u.select({name:k.name,userId:k.userId}).from(k).where(CC(k.id,t));if(!o||o.userId!==e)return;let s=await ca(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 gp(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 W0(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(Ad,"notifyLabelState");var Zr=new LC,HC=pa.object({verdict:pa.enum(["approve","reject"]),flag:pa.enum(["bad_grade","bad_assertion"]).nullable().optional(),note:pa.string().max(2e3).nullable().optional()});async function nE(e,t){let n=pa.string().uuid().safeParse(e);if(!n.success)return null;let[r]=await u.select().from(Ie).where(ma(Ie.id,n.data));return r&&await nt(r.evalTargetId,t)?r:null}c(nE,"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=HC.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 nE(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",p=i.grading.judge_model??null,[m]=await u.insert(et).values({userId:t,evalRunId:i.id,evalTargetId:i.evalTargetId,expectationIndex:s,expectationText:d.text??"",judgePassed:d.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:d.text??"",judgePassed:d.passed,judgeMethod:l,judgeModel:p,updatedAt:new Date}}).returning();await Ad(t,i.evalTargetId,{nudge:!1});try{await LI({evalTargetId:i.evalTargetId,userId:t})}catch(_){console.error("[eval-annotations] judge-review enqueue failed:",_ instanceof Error?_.message:_)}return e.json(m)});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 nE(n,t);return o?(await u.delete(et).where(Nh(ma(et.evalRunId,o.id),ma(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 Ad(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,p=[ma(et.evalTargetId,n)],m=e.req.query("runId");if(m){let w=pa.string().uuid().safeParse(m);if(!w.success)return e.json({error:"Invalid runId"},400);p.push(ma(et.evalRunId,w.data))}let _=await u.select().from(et).where(Nh(...p)).orderBy(MC(et.createdAt),$C(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([ca(t,n),tE(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(UC`
1144
1180
  WITH current_judge AS (
1145
1181
  -- Canonical segment (00193) — NOT a fifth hand-copy of the recency rule.
1146
1182
  -- Labeling a stale-judge run produces an anchor the calibration ignores,
@@ -1194,40 +1230,40 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
1194
1230
  SELECT * FROM queue
1195
1231
  ORDER BY cohort_rank, (llm_annotated > 0) DESC, random()
1196
1232
  LIMIT ${i}
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(
1233
+ `),d=a.map(_=>_.id),l=d.length?await u.select().from(et).where(Nh(ma(et.evalTargetId,n),qC(et.evalRunId,d))):[],p=new Map(l.map(_=>[`${_.evalRunId}:${_.expectationIndex}`,_])),m={};for(let _ of a)m[_.configuration]=_.remaining_in_cohort;return e.json({remaining:a[0]?.remaining??0,remainingByCohort:m,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=p.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 BC}from"hono";import{z as vn}from"zod";import{eq as Yn,and as Sd,isNull as Ph,sql as fa,inArray as FC}from"drizzle-orm";var $s=new BC,WC=vn.object({evalRunId:vn.string().uuid(),expectationIndex:vn.number().int().min(0),expectationText:vn.string(),judgePassed:vn.boolean(),humanPassed:vn.boolean(),reviewerPassed:vn.boolean()}),zC=vn.object({reviewerEngine:vn.enum(["claude","codex"]),reviewerModel:vn.string().min(1).max(200),verdicts:vn.array(WC).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=zC.parse(await e.req.json()),s=[...new Set(o.verdicts.map(d=>d.evalRunId))];if((await u.select({id:Ie.id}).from(Ie).where(Sd(FC(Ie.id,s),Yn(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(pe).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:[pe.evalRunId,pe.expectationIndex,pe.reviewerModel],set:{expectationText:d.expectationText,judgePassed:d.judgePassed,humanPassed:d.humanPassed,reviewerEngine:o.reviewerEngine,reviewerPassed:d.reviewerPassed,resolvedAt:fa`CASE WHEN ${pe.reviewerPassed} <> ${d.reviewerPassed} THEN NULL ELSE ${pe.resolvedAt} END`,resolution:fa`CASE WHEN ${pe.reviewerPassed} <> ${d.reviewerPassed} THEN NULL ELSE ${pe.resolution} END`,updatedAt:new Date}}),a+=1;if(o.verdicts.some(d=>d.reviewerPassed!==d.humanPassed))try{let[{count:d}]=await u.select({count:fa`count(*)::int`}).from(pe).where(Sd(Yn(pe.evalTargetId,n),Ph(pe.resolvedAt),fa`${pe.reviewerPassed} <> ${pe.humanPassed}`));if(d>0){let[l]=await u.select({name:k.name}).from(k).where(Yn(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:pe.evalRunId,expectationIndex:pe.expectationIndex,reviewerEngine:pe.reviewerEngine,reviewerModel:pe.reviewerModel,reviewerPassed:pe.reviewerPassed,humanPassed:pe.humanPassed,resolvedAt:pe.resolvedAt}).from(pe).where(Yn(pe.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: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:fa`LEFT(${Ie.outputs}->>'transcript', 1200)`}).from(pe).innerJoin(Ie,Yn(Ie.id,pe.evalRunId)).leftJoin(Ee,Yn(Ee.id,Ie.evalId)).where(Sd(Yn(pe.evalTargetId,n),Ph(pe.resolvedAt),fa`${pe.reviewerPassed} <> ${pe.humanPassed}`)).orderBy(pe.evalRunId,pe.expectationIndex);return e.json(o)});var VC=vn.object({resolution:vn.enum(["kept","relabeled"])});$s.patch("/judge-reviews/:id/resolve",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=vn.string().uuid().safeParse(n);if(!r.success)return e.json({error:"Invalid id"},400);let o=VC.parse(await e.req.json()),[s]=await u.select().from(pe).where(Sd(Yn(pe.id,r.data),Yn(pe.userId,t)));if(!s)return e.json({error:"Not found"},404);let i=await u.update(pe).set({resolvedAt:new Date,resolution:o.resolution,updatedAt:new Date}).where(Sd(Yn(pe.evalRunId,s.evalRunId),Yn(pe.expectationIndex,s.expectationIndex),Yn(pe.userId,t),Ph(pe.resolvedAt))).returning({id:pe.id});return e.json({resolved:i.length})});O();import{createHash as KC}from"node:crypto";import{Hono as GC}from"hono";import{z as oe}from"zod";import{eq as sn,and as ga,desc as Oh,asc as YC,sql as Nr,isNull as XC}from"drizzle-orm";import{alias as rE}from"drizzle-orm/pg-core";function JC(e){if(e===null||typeof e!="object")return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}c(JC,"isPlainObject");function Tp(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=Tp(e[n]);t===null&&r!==e[n]&&(t=e.slice(0,n)),t!==null&&t.push(r)}return t??e}if(JC(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=Tp(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(Tp,"stripNullBytes");cp();function QC(){return{enabled:process.env.RULEMETRIC_OFFLOAD_DELTAS==="1"||process.env.RULEMETRIC_OFFLOAD_DELTAS==="true",thresholdBytes:Number(process.env.OFFLOAD_GZIP_THRESHOLD_BYTES)||49152}}c(QC,"offloadConfig");function oE(e){return KC("sha256").update(JSON.stringify(e)).digest("hex")}c(oE,"hashJson");function sE(e,t){return Array.isArray(e)?e:Array.isArray(t)?t:[]}c(sE,"arrayOr");function iE(e,t){return Nr`COALESCE(
1198
1234
  CASE WHEN jsonb_typeof(${e}) = 'array' THEN ${e} END,
1199
1235
  CASE WHEN jsonb_typeof(${t}) = 'array' THEN ${t} END,
1200
1236
  '[]'::jsonb
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((
1237
+ )`}c(iE,"resolvedJsonArray");async function ZC(e){let{enabled:t,thresholdBytes:n}=QC();if(!t||e.length===0)return{messagesDelta:e,messagesDeltaRef:null};let r=mh(e);if(r.bytes<=n)return{messagesDelta:e,messagesDeltaRef:null};try{let{ref:o}=await fh(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(ZC,"resolveDeltaStorage");async function Dh(e,t,n){let r=JSON.stringify(n);await u.insert(kn).values({hash:e,contentType:t,content:n,sizeBytes:Buffer.byteLength(r,"utf-8")}).onConflictDoNothing()}c(Dh,"upsertBlob");var ha=new GC,eL=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()}),tL=100,nL=500;async function aE(e,t){let[n]=await u.select({id:$.id,sequence:$.sequence}).from($).where(ga(sn($.sessionId,e),sn($.requestHash,t))).limit(1);return n??null}c(aE,"findSnapshotByHash");ha.post("/sessions/:id/context-snapshots",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=Tp(eL.parse(r)),[s]=await u.select({id:y.id,projectPath:y.projectPath,projectId:y.projectId}).from(y).where(ga(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(ga(sn(y.id,n),XC(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 aE(n,d);if(f)return e.json({id:f.id,sequence:f.sequence,deduplicated:!0})}let p=oE(o.tools),m=oE(l);await Promise.all([Dh(o.system_hash,"system_prompt",o.system_prompt),Dh(p,"tools",o.tools),Dh(m,"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:m,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:$.sequence,messagesSummary:$.messagesSummary}).from($).where(sn($.sessionId,n)).orderBy(Oh($.sequence)).limit(1),v=(h?.sequence??-1)+1,I=Array.isArray(h?.messagesSummary)?h.messagesSummary:[],b=a,A=0,S=Math.min(I.length,b.length);for(;A<S&&JSON.stringify(I[A])===JSON.stringify(b[A]);)A++;let E=b.slice(A),T=await ZC(E);try{let[P]=await u.insert($).values({..._,sequence:v,...T}).returning({id:$.id,sequence:$.sequence});return e.json({id:P.id,sequence:P.sequence},201)}catch(P){let H=P.cause,N=H?.constraint_name??"",L=`${P instanceof Error?P.message:""} ${H?.message??""}`.toLowerCase();if(H?.code==="23505"){if((N==="idx_snapshots_session_request"||L.includes("request"))&&d){let q=await aE(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(L.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)});ha.get("/sessions/:id/context-snapshots",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=Number(e.req.query("limit")||tL),o=Math.min(Math.max(1,r),nL),s=Math.max(0,Number(e.req.query("offset")||0)),[i]=await u.select({id:y.id}).from(y).where(ga(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=rE(kn,"cb_tools"),p=rE(kn,"cb_injected"),_=(await u.select({id:$.id,sessionId:$.sessionId,userId:$.userId,sequence:$.sequence,provider:$.provider,model:$.model,systemHash:$.systemHash,requestHash:$.requestHash,maxTokens:$.maxTokens,temperature:$.temperature,estimatedTokens:$.estimatedTokens,capturedAt:$.capturedAt,injectedCount:Nr`jsonb_array_length(${iE(p.content,$.injectedInstructions)})`,toolsLight:Nr`COALESCE((
1202
1238
  SELECT jsonb_agg(jsonb_build_object('name', t->'name', 'description', left(COALESCE(t->>'description', ''), 80)))
1203
- FROM jsonb_array_elements(${Q0(l.content,M.tools)}) AS t
1204
- ), '[]'::jsonb)`,metadataLight:jr`jsonb_strip_nulls(jsonb_build_object(
1205
- 'usage', ${M.metadata}->'usage',
1206
- 'response', ${M.metadata}->'response',
1207
- 'thinking', ${M.metadata}->'thinking',
1208
- 'stream', ${M.metadata}->'stream',
1209
- 'betaFeatures', ${M.metadata}->'betaFeatures',
1210
- 'responseStatus', ${M.metadata}->'responseStatus',
1211
- 'apiMetadata', ${M.metadata}->'apiMetadata',
1239
+ FROM jsonb_array_elements(${iE(l.content,$.tools)}) AS t
1240
+ ), '[]'::jsonb)`,metadataLight:Nr`jsonb_strip_nulls(jsonb_build_object(
1241
+ 'usage', ${$.metadata}->'usage',
1242
+ 'response', ${$.metadata}->'response',
1243
+ 'thinking', ${$.metadata}->'thinking',
1244
+ 'stream', ${$.metadata}->'stream',
1245
+ 'betaFeatures', ${$.metadata}->'betaFeatures',
1246
+ 'responseStatus', ${$.metadata}->'responseStatus',
1247
+ 'apiMetadata', ${$.metadata}->'apiMetadata',
1212
1248
  'contextItems', CASE
1213
- WHEN jsonb_typeof(${M.metadata}->'contextItems') = 'array' THEN (
1249
+ WHEN jsonb_typeof(${$.metadata}->'contextItems') = 'array' THEN (
1214
1250
  SELECT jsonb_agg(jsonb_build_object('type', ci->'type', 'name', ci->'name', 'estimated_tokens', ci->'estimated_tokens'))
1215
- FROM jsonb_array_elements(${M.metadata}->'contextItems') AS ci
1251
+ FROM jsonb_array_elements(${$.metadata}->'contextItems') AS ci
1216
1252
  )
1217
1253
  ELSE NULL
1218
1254
  END
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`
1255
+ ))`}).from($).leftJoin(l,sn(l.hash,$.toolsHash)).leftJoin(p,sn(p.hash,$.injectedHash)).where(sn($.sessionId,n)).orderBy(Oh($.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($).where(sn($.sessionId,n)).orderBy(Oh($.capturedAt)).limit(o).offset(s);return e.json(await p0(await gh(d)))});ha.get("/context-snapshots/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await Fe.select().from($).where(ga(sn($.id,n),sn($.userId,t)));if(!r)return e.json({error:"Snapshot not found"},404);let o=r.messagesDeltaRef?await pd(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(kn).where(Nr`${kn.hash} IN (${Nr.join(s.map(p=>Nr`${p}`),Nr`, `)})`):[],a=new Map(i.map(p=>[p.hash,p.content])),d=[],l=!1;if(o){let{messages:p,truncated:m}=await sp({fetchPage:c(async(_,w)=>md(await Fe.select({sequence:$.sequence,messagesDelta:$.messagesDelta,messagesDeltaRef:$.messagesDeltaRef}).from($).where(ga(sn($.sessionId,r.sessionId),Nr`${$.sequence} <= ${r.sequence}`,Nr`${$.sequence} > ${_}`)).orderBy(YC($.sequence)).limit(w)),"fetchPage")});d=p,l=m}return e.json({...r,systemPrompt:a.get(r.systemHash)??r.systemPrompt??"",tools:sE(a.get(r.toolsHash??""),r.tools),injectedInstructions:sE(a.get(r.injectedHash??""),r.injectedInstructions),messagesDelta:o,messagesRaw:d,messagesTruncated:l})});O();import{Hono as rL}from"hono";import{z as $o}from"zod";import{eq as pr,and as xd,desc as oL,ne as sL}from"drizzle-orm";import{z as Pr}from"zod";var kp=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 qo=new rL,iL=$o.object({evalTargetId:$o.string().uuid(),config:kp});qo.post("/eval-jobs",async e=>{let t=e.get("userId"),n=await e.req.json(),r=iL.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(Ne).where(pr(Ne.id,o));return e.json({...i,noLiveWorker:s},201)});qo.get("/eval-targets/:id/jobs",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await u.select().from(Ne).where(xd(pr(Ne.evalTargetId,n),pr(Ne.userId,t))).orderBy(oL(Ne.createdAt));return e.json(r)});qo.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(Ne).set({status:s,progress:r.progress,updatedAt:new Date}).where(xd(pr(Ne.id,n),pr(Ne.userId,t))).returning();return i?e.json(i):e.json({error:"Job not found"},404)});var aL=$o.object({status:$o.enum(["running","completed","failed"]).optional(),attempts:$o.number().int().nonnegative().optional(),error:$o.string().optional(),result:$o.record($o.unknown()).optional()});qo.patch("/eval-jobs/:id/state",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=aL.parse(await e.req.json()),o={updatedAt:new Date};r.attempts!==void 0&&(o.attempts=r.attempts),r.status&&(o.status=r.status),r.error&&(o.error=r.error),r.result!==void 0&&(o.result=r.result),(r.status==="completed"||r.status==="failed")&&(o.completedAt=new Date);let[s]=await u.update(Ne).set(o).where(xd(pr(Ne.id,n),pr(Ne.userId,t),sL(Ne.status,"cancelled"))).returning();if(!s){let[i]=await u.select().from(Ne).where(xd(pr(Ne.id,n),pr(Ne.userId,t)));return i?e.json(i):e.json({error:"Job not found"},404)}return e.json(s)});qo.post("/eval-jobs/:id/cancel",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.update(Ne).set({status:"cancelled",updatedAt:new Date}).where(xd(pr(Ne.id,n),pr(Ne.userId,t))).returning();return r?e.json(r):e.json({error:"Job not found"},404)});O();import{Hono as cL}from"hono";import{z as qs}from"zod";import{eq as _a,and as Ch,isNull as dL,desc as uL,sql as cE}from"drizzle-orm";var jp=new cL,lL=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:kp});async function pL(e){let t=await u.select({systemPrompt:$.systemPrompt,systemHash:$.systemHash,metadata:$.metadata}).from($).where(cE`${$.metadata}->'contextItems' @> ${JSON.stringify([{content_hash:e}])}::jsonb`).orderBy(uL($.capturedAt)).limit(1);if(t.length===0)return null;let n=t[0],r=await dp(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,"\\$&"),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(pL,"resolveContentFromSnapshot");jp.post("/eval-from-context",async e=>{let t=e.get("userId"),n=await e.req.json(),r=lL.parse(n),o=!1,s;if(r.evalTargetId){let[_]=await u.select({id:k.id}).from(k).where(Ch(_a(k.id,r.evalTargetId),_a(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(Ch(_a(k.userId,t),cE`${k.metadata}->>'content_hash' = ${r.contentHash}`)).limit(1);if(_)s=_.id;else{let w=r.content;if(w||(w=await pL(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(_a(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(Ch(_a(Ee.evalTargetId,s),dL(Ee.retiredAt))).limit(1)).length===0,d=a?{...r.config,generateIfEmpty:!0}:r.config,{id:l,noLiveWorker:p}=await Ct({taskName:"process_eval",payload:{evalTargetId:s,config:d},userId:t,mirror:{userId:t,evalTargetId:s,config:d}}),[m]=await u.select().from(Ne).where(_a(Ne.id,l));return e.json({evalTargetId:s,evalJobId:m.id,evalCasesCreated:0,generationDeferred:a,isNewTarget:o,noLiveWorker:p},201)});import{Hono as yM}from"hono";O();import{Hono as mL}from"hono";import{and as dE,eq as Lh,sql as In}from"drizzle-orm";var Mh=new mL;Mh.get("/insights/projects",async e=>{let t=e.get("userId"),n=await u.select({projectId:y.projectId,name:C.name,gitRemoteUrl:C.gitRemoteUrl,sessionCount:In`COUNT(*)`,enrichedCount:In`COUNT(CASE WHEN ${y.metadata}->'local_session_meta' IS NOT NULL THEN 1 END)`,analyzedCount:In`COUNT(CASE WHEN ${y.analysis} IS NOT NULL THEN 1 END)`,firstSession:In`MIN(${y.startedAt})`,lastSession:In`MAX(${y.startedAt})`}).from(y).innerJoin(C,Lh(C.id,y.projectId)).where(dE(Lh(y.userId,t),In`${y.projectId} IS NOT NULL`)).groupBy(y.projectId,C.name,C.gitRemoteUrl),r=await u.execute(In`
1220
1256
  select project_id, project_path, count(*)::int as n
1221
1257
  from sessions
1222
1258
  where user_id = ${t}
1223
1259
  and project_id is not null
1224
1260
  and project_path is not null
1225
1261
  group by project_id, project_path
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`
1262
+ `),o=new Map,s=new Map;for(let p of r){let m=s.get(p.project_id)??-1;p.n>m&&(s.set(p.project_id,p.n),o.set(p.project_id,p.project_path))}let i=n.map(p=>({projectId:p.projectId,name:p.name,projectPath:p.projectId?o.get(p.projectId)??"":"",gitRemoteUrl:p.gitRemoteUrl,sessionCount:Number(p.sessionCount),enrichedCount:Number(p.enrichedCount),analyzedCount:Number(p.analyzedCount),firstSession:p.firstSession,lastSession:p.lastSession})),d=(await u.select({projectPath:y.projectPath,sessionCount:In`COUNT(*)`,enrichedCount:In`COUNT(CASE WHEN ${y.metadata}->'local_session_meta' IS NOT NULL THEN 1 END)`,analyzedCount:In`COUNT(CASE WHEN ${y.analysis} IS NOT NULL THEN 1 END)`,firstSession:In`MIN(${y.startedAt})`,lastSession:In`MAX(${y.startedAt})`}).from(y).where(dE(Lh(y.userId,t),In`${y.projectId} IS NULL`,In`${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,...d].sort((p,m)=>m.sessionCount-p.sessionCount);return e.json(l)});O();import PL from"node:fs";import DL from"node:path";import{Hono as OL}from"hono";import{and as Fh,desc as Wh,eq as Bo,gte as CL,ilike as yE,lte as LL,sql as ya}from"drizzle-orm";O();import{createHash as fL}from"node:crypto";import{and as gL,eq as uE,inArray as hL,sql as Uo}from"drizzle-orm";var _L=90,yL=.5,lE=[{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 pE(e,t){let n=Object.keys(t).filter(o=>o!=="id"&&o!=="timesGenerated").sort(),r=JSON.stringify(n.map(o=>[o,t[o]]));return fL("sha256").update(`${e}
1263
+ ${r}`).digest("hex")}c(pE,"recommendationEntryHash");var wL=new Set(["42883","42P01","42704"]),vL=2,Np=!1;function IL(e){let t=e?.code;return typeof t=="string"&&wL.has(t)?"capability-absent":Rc(e)||xc(e)||hi(e)||Zu(e)?"load":"isolable"}c(IL,"classifyProbeFailure");function bL(e,t){return async n=>[...await u.execute(Uo`
1228
1264
  SELECT p.probe_hash, m.content_hash, m.times_generated, m.last_job_id,
1229
1265
  m.dismissed_at, m.sim
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)
1266
+ FROM (VALUES ${Uo.join(n.map(o=>Uo`(${o.hash}::text, ${o.category}::text, ${o.label}::text)`),Uo`, `)}) AS p(probe_hash, category, label)
1231
1267
  -- CROSS JOIN, not LEFT JOIN LATERAL: a probe with no row in its
1232
1268
  -- category simply produces no output row, which reads back as "no
1233
1269
  -- alias" — the same outcome the per-probe query gave via an empty
@@ -1243,10 +1279,10 @@ ${r}`).digest("hex")}c(oE,"recommendationEntryHash");var pL=new Set(["42883","42
1243
1279
  ORDER BY sim DESC
1244
1280
  LIMIT 1
1245
1281
  ) m
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`
1282
+ `)]}c(bL,"dbProbeExecutor");async function $h(e,t,n,r=0){if(e.length===0)return[];if(Np||n.aborted)return n.degraded+=e.length,[];try{return n.statements+=1,await t(e)}catch(o){let s=IL(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"&&(Np=!0),s==="load"&&(n.aborted=!0),!(s==="isolable"&&r<vL&&e.length>1))return n.degraded+=e.length,[];n.bisections+=1;let a=Math.ceil(e.length/2),d=await $h(e.slice(0,a),t,n,r+1),l=await $h(e.slice(a),t,n,r+1);return[...d,...l]}}c($h,"resolveProbes");async function mE(e){let{userId:t,jobId:n}=e,r=e.projectPath??"",o=[];for(let h of lE)for(let v of h.get(e.recs)??[]){if(v===null||typeof v!="object")continue;let I=v;o.push({category:h.category,hash:pE(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(gL(uE(Re.userId,t),uE(Re.projectPath,r),hL(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&&!Np){let h={probes:l.size,statements:0,bisections:0,degraded:0,aborted:!1},v=await $h([...l.values()],bL(t,r),h);for(let I of v)Number(I.sim)<yL||(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}`:"")+(Np?" \u2014 trigram probing disabled for this process":""),h.failure.message)}let p=c(h=>d.get(h)??h,"canonical");if(n){let h=o.filter(v=>{let I=a.get(p(v.hash));return!I||I.lastJobId!==n});if(h.length>0)try{let v=new Set,I=h.filter(b=>!v.has(p(b.hash))&&v.add(p(b.hash)));await u.insert(Re).values(I.map(b=>({userId:t,projectPath:r,category:b.category,contentHash:p(b.hash),label:b.label,lastJobId:n}))).onConflictDoUpdate({target:[Re.userId,Re.projectPath,Re.contentHash],set:{lastSeenAt:Uo`now()`,timesGenerated:Uo`${Re.timesGenerated} + 1`,lastJobId:n}});for(let b of I){let A=p(b.hash),S=a.get(A);a.set(A,{contentHash:A,timesGenerated:(S?.timesGenerated??0)+1,lastJobId:n,dismissedAt:S?.dismissedAt??null})}}catch{}}let m=Date.now()-_L*24*3600*1e3,_=c(h=>{let v=a.get(h)?.dismissedAt;return v!=null&&new Date(v).getTime()>m},"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 lE){let v=h.get(e.recs)??[];if(v.length===0)continue;let I=v.map(b=>{if(b===null||typeof b!="object")return b;let A=b,S=p(pE(h.category,A));return{...A,id:S,timesGenerated:a.get(S)?.timesGenerated??1}}).filter(b=>b===null||typeof b!="object"?!0:!_(b.id??""));f(h.category,I)}return w}c(mE,"applyRecommendationMemory");async function fE(e){let t=e.projectPath??"";await u.insert(Re).values({userId:e.userId,projectPath:t,category:"unknown",contentHash:e.contentHash,dismissedAt:Uo`now()`}).onConflictDoUpdate({target:[Re.userId,Re.projectPath,Re.contentHash],set:{dismissedAt:Uo`now()`}})}c(fE,"dismissRecommendation");O();var qh=[{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 Ho(e){if(!e)return"anthropic";let t=qh.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(Ho,"providerFromModelId");var Uh={provider:"anthropic",modelId:"default-sonnet-equivalent",inputPerMTok:3,outputPerMTok:15,cacheReadPerMTok:.3,cacheWrite5mPerMTok:3.75,cacheWrite1hPerMTok:6,contextWindow:2e5};function Hh(e){return qh.find(t=>t.modelId===e)}c(Hh,"findModel");var Rd=1e6;function EL(e){return Math.round(e*100)/100}c(EL,"roundCents");function Pp(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/Rd,l=o*t.outputPerMTok/Rd,p=s*t.cacheReadPerMTok/Rd,m=i*t.cacheWrite5mPerMTok/Rd,_=a*t.cacheWrite1hPerMTok/Rd,w=m+_,f=d+l+p+w;return{inputUsd:d,outputUsd:l,cacheReadUsd:p,cacheWriteUsd:w,totalUsd:EL(f),estimated:n}}c(Pp,"computePrice");function Bh(e,t,n){let r=Hh(t);return Pp(e,r??Uh,!r)}c(Bh,"priceUsage");O();import{and as AL,desc as SL,eq as gE,isNull as xL,lte as RL,or as TL,gt as kL}from"drizzle-orm";function Td(e){return e==null?0:typeof e=="number"?e:Number(e)}c(Td,"toNumber");async function eo(e,t,n,r,o="anthropic"){let s=await e.select().from(st).where(AL(gE(st.provider,o),gE(st.modelId,n),RL(st.effectiveFrom,r),TL(xL(st.effectiveUntil),kL(st.effectiveUntil,r)))).orderBy(SL(st.effectiveFrom)).limit(1);if(s.length===0)return Bh(t,n,r);let i=s[0];return Pp(t,{inputPerMTok:Td(i.inputPerM),outputPerMTok:Td(i.outputPerM),cacheReadPerMTok:Td(i.cacheReadPerM),cacheWrite5mPerMTok:Td(i.cacheWrite5mPerM),cacheWrite1hPerMTok:Td(i.cacheWrite1hPerM)},!1)}c(eo,"priceUsageFromDb");var kd=1e6,hE=10*6e4,jL=500,Us=new Map;function NL(e,t,n){return`${e}:${t}:${n.toISOString().slice(0,7)}`}c(NL,"rateKey");function _E(e,t){let n=Ho(e),r=NL(n,e,t),o=Us.get(r),s=o&&Date.now()-o.at<hE?o.rates:void 0;if(!s){s=(async()=>{let a={input_tokens:kd},d={output_tokens:kd},l={cache_read_input_tokens:kd},p={cache_creation_5m:kd},m={cache_creation_1h:kd},[_,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,p,e,t,n),eo(Fe,m,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>jL)for(let[a,d]of Us)Date.now()-d.at>=hE&&Us.delete(a)}return s}c(_E,"getRates");var jd=new OL;function ML(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 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((_,[,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(ML,"generateAutoSuggestions");var $L=45e3,Dp=new Map,qL=up();jd.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=Dp.get(a),p=(d&&Date.now()-d.at<$L?d.data:null)??await qL.run(a,async()=>{let w=[Bo(y.userId,t)];r?w.push(Bo(y.projectId,r)):n&&w.push(yE(y.projectPath,`%${ct(n)}%`)),i&&w.push(Bo(y.tool,i)),o&&w.push(CL(y.startedAt,new Date(o))),s&&w.push(LL(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(Fh(...w)).orderBy(Wh(y.startedAt)).limit(f),v=1e6,I=c(async(G,_e,Qe)=>{let Ke=await _E(_e,Qe),at=G.input_tokens??0,Yt=G.output_tokens??0,Sn=G.cache_read_input_tokens??0,dn=(G.cache_creation_5m??0)+(G.cache_creation_input_tokens??0),rr=G.cache_creation_1h??0,ut=at*Ke.inputPerM/v,xt=Yt*Ke.outputPerM/v,Et=Sn*Ke.cacheReadPerM/v,gn=dn*Ke.cacheWrite5mPerM/v+rr*Ke.cacheWrite1hPerM/v,os=Math.round((ut+xt+Et+gn)*100)/100;return{inputUsd:ut,outputUsd:xt,cacheReadUsd:Et,cacheWriteUsd:gn,totalUsd:os,estimated:Ke.estimated}},"getPriced"),b={},A={},S={},E={},T={},P={},H={},N={},L={},q={},B=[],J=[],ce=[],V=0,me=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,M=0,j=0,ht=0,Nt=0,nr=0,fn=0,co=0,Ua=null,Ha=null,kS=Date.now()-720*60*60*1e3,hm=[],su="claude-sonnet-4-6",iu=c(()=>({input_tokens:0,output_tokens:0,cache_read_tokens:0,cache_write_tokens:0,cost_usd:0}),"newBucket"),au=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"),Ba={},Fa={},jS=new Map(h.map(G=>[G.id,G.startedAt])),NS=new Map(h.map(G=>[G.id,G.tool??"unknown"])),Y_=new Set,X_=h.length>0?await Fe.execute(ya`
1247
1283
  SELECT
1248
1284
  deduped.session_id AS "sessionId",
1249
- COALESCE(deduped.model, ${eu}) AS "model",
1285
+ COALESCE(deduped.model, ${su}) AS "model",
1250
1286
  COALESCE(SUM(COALESCE((deduped.token_usage->>'input_tokens')::bigint, (deduped.token_usage->>'input')::bigint)), 0)::bigint AS "inputTokens",
1251
1287
  COALESCE(SUM(COALESCE((deduped.token_usage->>'output_tokens')::bigint, (deduped.token_usage->>'output')::bigint)), 0)::bigint AS "outputTokens",
1252
1288
  COALESCE(SUM(COALESCE((deduped.token_usage->>'cache_read_input_tokens')::bigint, (deduped.token_usage->>'cacheRead')::bigint)), 0)::bigint AS "cacheReadTokens",
@@ -1257,17 +1293,17 @@ ${r}`).digest("hex")}c(oE,"recommendationEntryHash");var pL=new Set(["42883","42
1257
1293
  SELECT DISTINCT ON (se.session_id, COALESCE(se.metadata->>'requestId', se.id::text))
1258
1294
  se.session_id, se.model, se.token_usage
1259
1295
  FROM session_events se
1260
- WHERE se.session_id IN (${ha.join(h.map(G=>ha`${G.id}`),ha`, `)})
1296
+ WHERE se.session_id IN (${ya.join(h.map(G=>ya`${G.id}`),ya`, `)})
1261
1297
  AND se.token_usage IS NOT NULL
1262
1298
  ORDER BY se.session_id, COALESCE(se.metadata->>'requestId', se.id::text), se.sequence
1263
1299
  ) deduped
1264
1300
  GROUP BY deduped.session_id, deduped.model
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`
1301
+ `):[];for(let G of X_)Y_.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;E[at]=(E[at]||0)+1}if(Ke&&!Y_.has(G.id)){let at=Ke.input_tokens??0,Yt=Ke.output_tokens??0,Sn=Ke.cache_read_input_tokens??0,dn=Ke.cache_creation_5m??0,rr=Ke.cache_creation_1h??0,ut=Ke.cache_creation_input_tokens??0,xt=dn+rr||ut;F+=at,he+=Yt,D+=Sn,re+=xt;let Et=await I(Ke,su,G.startedAt);Ce+=Et.inputUsd,St+=Et.outputUsd,le+=Et.cacheReadUsd,de+=Et.cacheWriteUsd;let gn=Et.inputUsd+Et.outputUsd+Et.cacheReadUsd+Et.cacheWriteUsd,os=G.tool??"unknown",ty=Ba[su]??iu();au(ty,at,Yt,Sn,xt,gn),Ba[su]=ty;let ny=Fa[os]??iu();au(ny,at,Yt,Sn,xt,gn),Fa[os]=ny}if(_e){M++;let at=_e.user_message_count??0;V+=at,me+=(_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))b[Et]=(b[Et]||0)+gn;let Sn=_e.languages;if(Sn)for(let[Et,gn]of Object.entries(Sn))S[Et]=(S[Et]||0)+gn;let dn=_e.message_hours;dn&&B.push(...dn);let rr=_e.tool_error_categories;if(rr)for(let[Et,gn]of Object.entries(rr))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&&Nt++;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){nr++;let at=new Date(G.analyzedAt).getTime();(Ua===null||at<Ua)&&(Ua=at),(Ha===null||at>Ha)&&(Ha=at),at<kS&&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 Sn=Qe.user_satisfaction;if(Sn)for(let[ut,xt]of Object.entries(Sn))xt>0&&(H[ut]=(H[ut]||0)+xt);let dn=Qe.session_type;dn&&(N[dn]=(N[dn]||0)+1);let rr=Qe.friction??Qe.friction_counts;if(rr)for(let[ut,xt]of Object.entries(rr))xt>0&&(L[ut]=(L[ut]||0)+xt);hm.length<50&&hm.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 cu=h.map(G=>G.startedAt.toISOString()).sort(),_m=new Set(cu.map(G=>G.split("T")[0]));for(let G of X_){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,Sn=Number(G.cacheWriteLegacy)||0,dn=at+Yt||Sn,rr=jS.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,rr);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=Ba[G.model]??iu();au(Et,_e,Qe,Ke,dn,xt),Ba[G.model]=Et;let gn=NS.get(G.sessionId)??"unknown",os=Fa[gn]??iu();au(os,_e,Qe,Ke,dn,xt),Fa[gn]=os}let rs=c(G=>Math.round(G*100)/100,"round2"),PS=Ce+St+le+de,DS=rs(PS),OS={inputUsd:rs(Ce),outputUsd:rs(St),cacheReadUsd:rs(le),cacheWriteUsd:rs(de)},ym={};for(let[G,_e]of Object.entries(Ba))ym[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:rs(_e.cost_usd)};let wm={};for(let[G,_e]of Object.entries(Fa))wm[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:rs(_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),CS=Xs.length>0?Xs[Math.floor(Xs.length/2)]:0,LS=Xs.length>0?Xs.reduce((G,_e)=>G+_e,0)/Xs.length:0,Q_=0,Z_=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),Q_++)}Z_=_e.size}let Qs={computed:!0,total_sessions:h.length,window:{since:o??null,until:s??null},truncated:h.length>=f,sessions_with_meta:M,sessions_with_analysis:j,tools_used:A,date_range:{start:cu[0]?.split("T")[0]??"",end:cu[cu.length-1]?.split("T")[0]??""},total_messages:V,total_duration_hours:Math.round(me*10)/10,total_input_tokens:F,total_output_tokens:he,total_cache_read_tokens:D,total_cache_write_tokens:re,estimated_cost_usd:DS,estimated_cost_breakdown:OS,estimated_cost_by_model:Object.keys(ym).length>0?ym:void 0,estimated_cost_by_tool:Object.keys(wm).length>0?wm:void 0,tool_counts:b,languages:S,git_commits:Se,git_pushes:ze,projects:E,goal_categories:T,outcomes:P,satisfaction:H,session_types:N,friction:L,tool_error_categories:q,session_summaries:hm,total_tool_errors:be,total_interruptions:cn,total_lines_added:rt,total_lines_removed:Le,total_files_modified:Xe,days_active:_m.size,messages_per_day:_m.size>0?Math.round(V/_m.size*10)/10:0,message_hours:B,sessions_using_task_agent:ht,sessions_using_mcp:Nt,response_time:{median_seconds:Math.round(CS*10)/10,avg_seconds:Math.round(LS*10)/10,histogram:uo,total_samples:J.length},parallel_sessions:{events:Q_,sessions_involved:Z_},analysis_freshness:{with_timestamp:nr,pre_instrumentation:fn,stale_30d:co,oldest_analyzed_at:Ua?new Date(Ua).toISOString():null,newest_analyzed_at:Ha?new Date(Ha).toISOString():null}};Qs.autoAddAvailable=!!(n&&PL.existsSync(DL.join(n,"CLAUDE.md")));let du=[Bo(z.userId,t),Bo(z.status,"completed")];r?du.push(Bo(z.projectId,r)):n?du.push(yE(z.projectPath,`%${ct(n)}%`)):du.push(ya`${z.projectPath} IS NULL`);let[ey]=await Fe.select({id:z.id,result:z.result}).from(z).where(Fh(...du)).orderBy(Wh(z.completedAt)).limit(1),MS=ey?.result,vm=Kf(MS?.recommendations);if(vm&&Object.keys(vm).length>0)Qs.recommendations=vm,Qs._recsJobId=ey?.id??null;else if(h.length>=3){let G=ML({totalSessions:h.length,sessionsWithAnalysis:j,toolCounts:b,toolErrorCategories:q,friction:L,outcomes:P,sessionsUsingMcp:Nt,sessionsUsingTaskAgent:ht,totalToolErrors:be,totalMessages:V,totalDurationHours:me});G&&(Qs.recommendations=G)}return Dp.size>1e3&&Dp.clear(),Dp.set(a,{at:Date.now(),data:Qs}),Qs}),{_recsJobId:m,..._}=p;if(_.recommendations)try{_.recommendations=await mE({userId:t,projectPath:n,jobId:m??null,recs:_.recommendations})}catch{}return e.json(_)});jd.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(Fh(Bo(Re.userId,t),Bo(Re.projectPath,n))).orderBy(ya`${Re.dismissedAt} IS NULL`,Wh(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}))})});jd.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 fE({userId:t,projectPath:o,contentHash:r}),e.json({ok:!0})});O();import{Hono as UL}from"hono";import{and as Mn,count as HL,eq as Oe,ilike as BL,inArray as FL,sql as bn}from"drizzle-orm";Is();var Bs=new UL,Hs=c(e=>vs(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(BL(y.projectPath,`%${ct(n)}%`));let s=await u.select({id:g.id,name:g.name,contentHash:g.contentHash,source:bn`${g.frontmatter}->>'source'`,linkedSessions:bn`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,bn`${g.frontmatter}->>'source'`).orderBy(bn`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),bn`${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 p(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,M]of Object.entries(be))M>0&&(Se[cn]=(Se[cn]||0)+M)}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(p,"computeCohort");let m=p(r),_=p(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"),b=c(D=>[...D].sort((re,Ce)=>Number(Ce.verdict.sufficient)-Number(re.verdict.sufficient)||Ce.verdict.nWith-re.verdict.nWith),"sortSegs"),A=_g([...h.values()],I(D=>Rs(D.model))),S=A.overall,E=b(A.segments).map(D=>({model:D.segment,verdict:D.verdict})),T=b(Il(I(D=>D.tool??null))).map(D=>({harness:D.segment,verdict:D.verdict})),{outcomeScores:P,...H}=m,{outcomeScores:N,...L}=_,[q]=await u.select({name:g.name}).from(g).where(Oe(g.id,n)).limit(1),[B]=await u.select({n:HL(),lastAssignedAt:bn`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),me=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:U.id,projectPath:U.projectPath,source:U.source,status:U.status}).from(U).where(Mn(Oe(U.userId,t),Oe(U.instructionId,n),Oe(U.status,"running"))),he=me.length>0||F.length>0?{verdicts:me,experiments:F}:null;return e.json({instructionId:n,instructionName:q?.name??"Unknown",verdict:S,segments:E,harnessSegments:T,autoAdded:J,randomised:he,with:H,without:L,comparison:{outcomeScoreDelta:m.avgOutcomeScore!=null&&_.avgOutcomeScore!=null?Math.round((m.avgOutcomeScore-_.avgOutcomeScore)*100)/100:null,toolErrorsDelta:m.avgToolErrors!=null&&_.avgToolErrors!=null?Math.round((m.avgToolErrors-_.avgToolErrors)*10)/10:null,durationDelta:m.avgDurationMinutes!=null&&_.avgDurationMinutes!=null?Math.round((m.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:vr.versionOrdinal,contentHash:vr.contentHash,firstSeenAt:vr.firstSeenAt,contentLength:bn`COALESCE(LENGTH(${vr.content}), 0)::int`}).from(vr).where(Oe(vr.instructionId,n)).orderBy(vr.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),bn`${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),d=Number(e.req.query("version")),l=Number(e.req.query("baselineVersion")),p=Number.isFinite(d)&&d>0?d:a.at(-1),m=Number.isFinite(l)&&l>0?l:a.filter(b=>b!==p).at(-1);if(p==null||m==null)return e.json({instructionId:n,versions:i,version:p??null,baselineVersion:m??null,verdict:null,insufficientReason:"only one version of this instruction has attributed sessions; there is no prior version to compare against"});let _=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"),w=c(b=>{if(!b)return 0;let A=typeof b=="string"?new Date(b):b;return Number.isNaN(A.getTime())?0:A.getTime()},"timeOf"),f=new Map,h=c((b,A)=>{let S=Hs(b.analysis);if(S==null)return;let E=`${b.projectId??"(no-project)"}|${_(b.startedAt)}`,T=f.get(E);T||(T={key:E,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},f.set(E,T)),(A?T.withScores:T.withoutScores).push(S),(A?T.withTimes:T.withoutTimes).push(w(b.startedAt))},"add");for(let b of s.get(p)??[])h(b,!0);for(let b of s.get(m)??[])h(b,!1);let v=Dn([...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:p,baselineVersion:m,versions:i,verdict:v,replayableVersions:i.filter(b=>b.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:bn`${y.analysis}->>'outcome'`,startedAt:y.startedAt,inputTokens:bn`coalesce((${y.tokenUsage}->>'input_tokens')::numeric, 0)`,outputTokens:bn`coalesce((${y.tokenUsage}->>'output_tokens')::numeric, 0)`}).from(y).where(Mn(Oe(y.userId,t),bn`${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"),p=c(h=>h.n>0?Math.round(h.tokenSum/h.n):null,"avgTokens"),m=c(h=>{let v=s.get(h)??new Set,I=new Map,b=l(),A=l();for(let H of a){let N=v.has(H.id);if(!N&&i.has(H.id))continue;let L=N?b:A;L.n++,L.tokenSum+=Number(H.inputTokens)+Number(H.outputTokens);let q=Hs({outcome:H.outcome});if(q!=null){L.scoreSum+=q,L.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 S=Dn([...I.values()]),E={sessionCount:b.n,avgOutcomeScore:d(b.scoreSum,b.scoreN),avgTotalTokens:p(b)},T={sessionCount:A.n,avgOutcomeScore:d(A.scoreSum,A.scoreN),avgTotalTokens:p(A)},P={outcomeScoreDelta:E.avgOutcomeScore!=null&&T.avgOutcomeScore!=null?Math.round((E.avgOutcomeScore-T.avgOutcomeScore)*100)/100:null,totalTokensDelta:E.avgTotalTokens!=null&&T.avgTotalTokens!=null?E.avgTotalTokens-T.avgTotalTokens:null};return{verdict:S,with:E,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,...m(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:b,without:A})=>({version:h,isCurrent:v,verdict:I,with:b,without:A})),cost:{estimated:!0}})});var WL=/^[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=>WL.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"),FL(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 u.select({id:y.id,projectId:y.projectId,outcome:bn`${y.analysis}->>'outcome'`,startedAt:y.startedAt}).from(y).where(Mn(Oe(y.userId,t),bn`${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 p=s.get(l);if(!p||p.size===0){d[l]=Dn([]);continue}let m=new Map;for(let _ of a){let w=m.get(_.key);w||(w={key:_.key,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},m.set(_.key,w));let f=p.has(_.id);(f?w.withScores:w.withoutScores).push(_.score),(f?w.withTimes:w.withoutTimes).push(_.time)}d[l]=Dn([...m.values()],{iterations:2e3})}return e.json({impacts:d})});O();import{Hono as VL}from"hono";import{and as Fs,count as Vh,eq as $n,inArray as bE,sql as Dr}from"drizzle-orm";O();import{sql as wE}from"drizzle-orm";var vE=30,zh=14,zL=c(e=>({captureHealthy:!1,reason:e,candidates:[]}),"DARK");async function IE(e){let[t]=await u.execute(wE`
1266
1302
  SELECT count(*)::int AS n
1267
1303
  FROM public.skill_usage
1268
1304
  WHERE user_id = ${e}::uuid
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`
1305
+ AND invoked_at > now() - make_interval(days => ${zh})
1306
+ `);return!t||t.n===0?zL(`No skill invocations captured in ${zh} days \u2014 cannot tell "unused" from "uncaptured". Skill grooming paused (never trust a dark pipeline).`):{captureHealthy:!0,reason:null,candidates:(await u.execute(wE`
1271
1307
  SELECT
1272
1308
  i.id AS instruction_id,
1273
1309
  i.name AS name,
@@ -1296,25 +1332,21 @@ ${r}`).digest("hex")}c(oE,"recommendationEntryHash");var pL=new Set(["42883","42
1296
1332
  AND i.type = 'skill'
1297
1333
  AND i.archived = false
1298
1334
  -- Old enough to have had a fair chance to be used.
1299
- AND i.created_at < now() - make_interval(days => ${mE})
1335
+ AND i.created_at < now() - make_interval(days => ${vE})
1300
1336
  AND coalesce(u.invocations, 0) = 0
1301
1337
  ORDER BY i.created_at
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(`
1338
+ `)).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 ${vE}+ days ago and never invoked \u2014 skill capture is live (other skills were invoked in the last ${zh} days), so this is an absence of use rather than an absence of data`}))}}c(IE,"loadUnusedSkillCandidates");var Kh=new VL,Jh=/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;Kh.get("/insights/groom-candidates",async e=>{let t=e.get("userId"),[n]=await u.select({n:Vh()}).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:Vh(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:Vh()}).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 L=Number(N.n),q=d.get(N.treatmentId);(!q||L>q.n||L===q.n&&N.projectId<q.projectId)&&d.set(N.treatmentId,{projectId:N.projectId,n:L})}let l=c(N=>d.get(N)?.projectId??null,"topProjectId"),p=r.filter(N=>!(N.content&&Jh.test(N.content))),m=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,L)=>N.totalExposures-L.totalExposures).slice(0,50),w=new Map;for(let N of i){let L=N.outcome!=null?xi[N.outcome]:void 0;L!==void 0&&w.set(N.id,{projectId:N.projectId,score:L,time:N.startedAt?.getTime()??0})}let f=new Map;for(let N of s){if(!N.sessionId)continue;let L=f.get(N.treatmentId);L||(L=new Set,f.set(N.treatmentId,L)),L.add(N.sessionId)}let h=[],v=[];for(let N of o){let L=f.get(N.id);if(!L)continue;let q=0;for(let V of L)w.has(V)&&q++;if(q<10)continue;let B=new Map;for(let[V,{projectId:me,score:F,time:he}]of w){let D=me??"(no-project)",re=B.get(D);re||(re={key:D,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},B.set(D,re));let Ce=L.has(V);(Ce?re.withScores:re.withoutScores).push(F),(Ce?re.withTimes:re.withoutTimes).push(he)}let J=Dn([...B.values()]),ce=ws(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,b=h;if(h.length>0){let N=await u.select({id:g.id,content:g.content}).from(g).where(bE(g.id,h.map(q=>q.id))),L=new Map(N.map(q=>[q.id,q.content]));b=h.filter(q=>{let B=L.get(q.id);return B&&Jh.test(B)?(I++,!1):!0})}b.sort((N,L)=>N.verdict.delta-L.verdict.delta);let A=1500,S=[],E=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(bE(g.id,v.map(q=>q.id))),L=new Map(N.map(q=>[q.id,q]));for(let q of v){let B=L.get(q.id),J=Number(B?.estimatedTokens??0);if(J<A)continue;let ce=!!(B?.content&&Jh.test(B.content));ce&&E++,S.push({...q,estimatedTokens:J,containsSafetyLanguage:ce})}S.sort((q,B)=>B.estimatedTokens-q.estimatedTokens),S=S.slice(0,20)}let T=new Set(b.map(N=>N.id)),P=_.filter(N=>!T.has(N.id)),H=await IE(t);return e.json({captureHealthy:!0,candidates:P,safetyGuarded:m,harmful:b,harmfulSafetyGuarded:I,bloated:S,trimSafetyFlagged:E,unusedSkills:H.candidates,skillCaptureHealthy:H.captureHealthy,skillCaptureReason:H.reason})});O();import{Hono as JL}from"hono";import{z as wa}from"zod";import{and as mr,desc as EE,eq as wt,getTableColumns as KL,gte as Gh,ilike as Op,isNull as GL,ne as YL,or as XL,sql as va}from"drizzle-orm";var Fo=new JL;function QL(e,t){let n=t?Op(z.projectPath,`%${ct(t)}%`):void 0;return e&&n?XL(wt(z.projectId,e),mr(GL(z.projectId),n)):e?wt(z.projectId,e):n}c(QL,"insightsJobProjectScope");Fo.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 p=new Date;p.setHours(0,0,0,0);let m=o,_=[wt(z.userId,t),Gh(z.createdAt,p)];s?_.push(wt(z.projectId,s)):m?_.push(Op(z.projectPath,`%${ct(m)}%`)):_.push(va`${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)):m?f.push(Op(z.projectPath,`%${ct(m)}%`)):f.push(va`${z.projectPath} IS NULL`);let[h]=await u.select({completedAt:z.completedAt}).from(z).where(mr(...f)).orderBy(EE(z.completedAt)).limit(1),v=h?.completedAt??new Date(0),I=[wt(y.userId,t),Gh(y.startedAt,v)];s?I.push(wt(y.projectId,s)):m&&I.push(Op(y.projectPath,`%${ct(m)}%`));let[{count:b}]=await u.select({count:va`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 Dl(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)});Fo.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=QL(o,r??null);i&&s.push(i);let{result:a,...d}=KL(z),l=await u.select(d).from(z).where(mr(...s)).orderBy(EE(z.createdAt)).limit(n);return e.json(l)});Fo.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)});Fo.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 ZL=wa.object({status:wa.enum(["running","completed","failed"]).optional(),attempts:wa.number().int().nonnegative().optional(),error:wa.string().optional(),result:wa.record(wa.unknown()).optional()});Fo.patch("/insights-jobs/:id/state",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=ZL.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),YL(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 eM=14400*1e3;Fo.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()-eM),i=await u.select({projectId:y.projectId,sessionCount:va`COUNT(*)`}).from(y).where(mr(wt(y.userId,t),va`${y.projectId} IS NOT NULL`)).groupBy(y.projectId).orderBy(va`COUNT(*) DESC`),a=i.map(w=>w.projectId).filter(w=>!!w),d=new Map;if(a.length>0){let w=await u.execute(Mi(a));for(let f of w)d.set(f.project_id,f.path)}let l=[],p=[],m=[],_=!1;for(let w of i){if(Number(w.sessionCount)<r||!w.projectId)continue;let f=d.get(w.projectId);if(!f){p.push({projectPath:"<unknown>",reason:"no_checkout"});continue}try{if(!o){let[b]=await u.select({id:z.id}).from(z).where(mr(wt(z.userId,t),wt(z.status,"completed"),wt(z.projectPath,f),Gh(z.completedAt,s))).limit(1);if(b){p.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);m.push({projectPath:f,error:v})}}return e.json({created:l.length,jobs:l,skipped:p,errors:m,noLiveWorker:_},201)});O();import Cp from"node:fs";import tM from"node:path";import{createHash as nM}from"node:crypto";import{Hono as rM}from"hono";import{and as AE,desc as oM,eq as Nd}from"drizzle-orm";var Yh=new rM;async function sM(e,t,n){try{let r=`${sl.claude_md}::${n}`,[o]=await u.select({id:g.id,version:g.version}).from(g).where(AE(Nd(g.contextIdentity,r),Nd(g.createdBy,e),Nd(g.archived,!1))).orderBy(oM(g.createdAt)).limit(1);if(!o){let a=Cp.readFileSync(n,"utf-8"),d=nM("sha256").update(a).digest("hex"),l={name:n,description:"Project CLAUDE.md",type:"context_file",scope:"personal",version:"1.0.0"},[p]=await u.insert(g).values({name:n,description:"Project CLAUDE.md",type:"context_file",scope:"personal",scopeRef:e,version:"1.0.0",content:a,frontmatter:l,contentHash:d,contextIdentity:r,createdBy:e}).onConflictDoNothing().returning({id:g.id,version:g.version});o=p}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(sM,"recordAutoAddAssignment");Yh.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(AE(Nd(y.userId,t),Nd(y.projectPath,r))).limit(1);if(!s)return e.json({error:"projectPath is not a known project for this user"},403);let i=tM.join(r,"CLAUDE.md");if(!Cp.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=Cp.readFileSync(i,"utf-8");if(a.includes(o.trim()))return e.json({success:!1,reason:"already_present"},200);let d=a.endsWith(`
1303
1339
  `)?`
1304
1340
  `:`
1305
1341
 
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(`
1308
-
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(`
1310
-
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
1342
+ `;Cp.writeFileSync(i,a+d+o.trim()+`
1343
+ `);let l=await sM(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 dM}from"hono";import{z as ke}from"zod";O();import{createHash as iM}from"node:crypto";import{and as Xh,eq as Wo,inArray as aM,sql as Pd}from"drizzle-orm";var Qh=.5,Zh=.4;function cM(e){let t=!1;for(let n of e.split(`
1344
+ `)){let r=n.trim();if(/^(`{3,}|~{3,})/.test(r)){t=!t;continue}if(!(t||!r)&&!r.startsWith("#"))return r}return""}c(cM,"firstProseLine");var SE=c(e=>iM("sha256").update(e.trim()).digest("hex"),"hashAddition");function Lp(e){let t=e.trim().split(`
1345
+ `)[0].replace(/^#+\s*/,"").trim();return(t.length>0?t:e.trim()).slice(0,80)}c(Lp,"deriveName");function xE(e,t){let n=` (${t.slice(0,6)})`;return`${e.slice(0,80-n.length)}${n}`}c(xE,"disambiguateName");function RE(e){return e?.cause?.code==="23505"||e?.code==="23505"}c(RE,"isUniqueViolation");async function TE(e){let{userId:t,projectPath:n,candidates:r=[],additions:o,skills:s,features:i,advice:a}=e,d=await Ol(n);if(!d.mintable)return{nominated:0,additionsCreated:0,featuresCreated:0,adviceCreated:0,skillsUnresolved:0,additionsRejected:[],itemsFailed:[],mintRefused:{reason:d.reason,canonicalPath:d.canonicalPath}};let l=[],p=0,m=0,_=0,w=0,f=[],h=[];async function v(E,T){try{await T()}catch(P){h.push({name:E.slice(0,80),error:P instanceof Error?P.message:String(P)})}}c(v,"attempt");async function I(E){let T=Ni(E.body);if(T.length>0)return f.push({name:E.name.slice(0,80),placeholders:T.map(L=>L.token)}),null;let P=SE(E.body),[H]=await u.select({id:g.id}).from(g).where(Xh(Wo(g.createdBy,t),Wo(g.contentHash,P),Wo(g.archived,!1))).limit(1);if(H)return{id:H.id,created:!1};let N=c(L=>({name:L,description:cM(E.body).slice(0,500)||"Suggested by insights",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:P}),"values");try{let[L]=await u.insert(g).values(N(E.name.slice(0,80))).returning({id:g.id});return{id:L.id,created:!0}}catch(L){if(!RE(L))throw L;let[q]=await u.insert(g).values(N(xE(E.name,P))).returning({id:g.id});return{id:q.id,created:!0}}}c(I,"materialise");for(let E of r)await v(E.title,async()=>{let T=await I({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}});T&&(T.created&&(E.artifact==="instruction"?m+=1:_+=1),l.push({instructionId:T.id,reason:E.rationale||"Suggested by cross-harness insights",score:E.artifact==="instruction"?Qh:Zh}))});if(s.length>0){let E=s.flatMap(H=>[H.skillId,`skills--${H.skillId}`]),T=await u.select({id:g.id,name:g.name}).from(g).where(Xh(Wo(g.type,"skill"),Wo(g.archived,!1),aM(g.name,E))),P=new Map(T.map(H=>[H.name,H.id]));for(let H of s){let N=P.get(`skills--${H.skillId}`)??P.get(H.skillId);if(!N){p+=1;continue}l.push({instructionId:N,reason:H.reason||"Recommended by insights",score:Qh})}}for(let E of o)await v(Lp(E.addition),async()=>{let T=Ni(E.addition);if(T.length>0){f.push({name:Lp(E.addition),placeholders:T.map(L=>L.token)});return}let P=SE(E.addition),[H]=await u.select({id:g.id}).from(g).where(Xh(Wo(g.createdBy,t),Wo(g.contentHash,P),Wo(g.archived,!1))).limit(1),N=H?.id;if(!N){let L=c(B=>({name:B,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:P}),"addValues"),q;try{[q]=await u.insert(g).values(L(Lp(E.addition))).returning({id:g.id})}catch(B){if(!RE(B))throw B;[q]=await u.insert(g).values(L(xE(Lp(E.addition),P))).returning({id:g.id})}N=q.id,m+=1}l.push({instructionId:N,reason:E.why||"Proposed by insights from your session history",score:Qh})});for(let E of i)await v(E.feature,async()=>{let T=await I({name:E.feature,body:wI(E),type:yI(E.feature),origin:"features_to_try"});T&&(T.created&&(_+=1),l.push({instructionId:T.id,reason:E.why_for_you||E.one_liner||"Suggested by insights from your session history",score:Zh}))});for(let E of a)await v(E.title,async()=>{let T=await I({name:E.title,body:vI(E),type:"feature",origin:E.origin});T&&(T.created&&(w+=1),l.push({instructionId:T.id,reason:E.lead||E.detail||"Surfaced by insights from your session history",score:Zh}))});if(l.length===0)return{nominated:0,additionsCreated:0,featuresCreated:0,adviceCreated:0,skillsUnresolved:p,additionsRejected:f,itemsFailed:h};let b=new Set,A=l.filter(E=>b.has(E.instructionId)?!1:(b.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})),S=d.projectId??await Fn(n);for(let E of A)E.projectId=S;return await u.insert(x).values(A).onConflictDoUpdate({target:[x.userId,x.projectPath,x.instructionId,x.kind],set:{score:Pd`excluded.score`,reason:Pd`excluded.reason`,generatedAt:Pd`excluded.generated_at`,isStale:Pd`false`,dismissedAt:Pd`CASE WHEN ${x.dismissedAt} IS NOT NULL AND ${x.dismissedAt} >= now() - interval '30 days' THEN ${x.dismissedAt} ELSE NULL END`}}),{nominated:A.length,additionsCreated:m,featuresCreated:_,adviceCreated:w,skillsUnresolved:p,additionsRejected:f,itemsFailed:h}}c(TE,"materialiseInsightRecommendations");var e_=new dM,uM=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([])});e_.post("/insights/recommendations/nominate",async e=>{let t=uM.safeParse(await e.req.json());if(!t.success)return e.json({error:"Invalid body",details:t.error.flatten()},400);let n=await TE({userId:e.get("userId"),...t.data});return e.json(n)});O();import{Hono as lM}from"hono";import{and as pM,desc as mM,eq as t_,isNotNull as fM}from"drizzle-orm";var n_=new lM;n_.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(pM(t_(z.userId,t),t_(z.projectPath,n),t_(z.status,"completed"),fM(z.result))).orderBy(mM(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,d=c(p=>Array.isArray(p)?p.flatMap(m=>{if(typeof m=="string")return m.trim()?[m.trim()]:[];if(s(m)){let _=m,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(p)?[p.trim()]:[],"asLines"),l=c((p,m)=>{if(Array.isArray(p))return p;if(s(p)){let _=p[m];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 gM}from"hono";import{and as r_,eq as Ws,inArray as kE,isNotNull as hM,or as _M,sql as o_}from"drizzle-orm";var s_=new gM;s_.get("/insights/provenance-impact",async e=>{let t=e.get("userId"),n=await u.select({treatmentId:ne.treatmentId,sessions:o_`count(distinct ${ne.sessionId})::int`}).from(ne).where(r_(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:o_`${g.frontmatter}->>'source'`,createdBy:g.createdBy,scope:g.scope}).from(g).where(r_(Ws(g.archived,!1),r.length>0?_M(Ws(g.createdBy,t),kE(g.id,r)):Ws(g.createdBy,t))).limit(5e3),s=new Map(o.map(f=>[f.id,ul(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:o_`count(*)::int`}).from(x).where(r_(Ws(x.userId,t),hM(x.acceptedAt),kE(x.instructionId,i))).groupBy(x.instructionId):[],l=new Map,p=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"),m=new Map(n.map(f=>[f.treatmentId,Number(f.sessions)]));for(let f of o){let h=ul(f,t),v=m.get(f.id)??0;if(h==="catalog"&&v===0)continue;let I=p(h);I.instructions+=1,v>0&&(I.exposedInstructions+=1,I.exposedSessions+=v)}for(let f of d){let h=s.get(f.instructionId);h&&(p(h).accepted+=Number(f.n))}let _=new Map;for(let f of a){let h=s.get(f.instructionId);if(!h)continue;p(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=p(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 Xn=new yM;Xn.route("/",Mh);Xn.route("/",jd);Xn.route("/",Bs);Xn.route("/",Kh);Xn.route("/",Fo);Xn.route("/",e_);Xn.route("/",n_);Xn.route("/",s_);Xn.route("/",Yh);O();import{Hono as wM}from"hono";import{z as dt}from"zod";import{and as Qn,desc as Mp,eq as it,sql as mn}from"drizzle-orm";var En=new wM,i_=["fact","decision","correction","convention"],jE=4e3,vM=dt.object({kind:dt.enum(i_),title:dt.string().min(1).max(300),body:dt.string().min(1).max(jE),projectId:dt.string().uuid().optional(),projectPath:dt.string().optional(),source:dt.enum(["manual","distilled"]).optional()}),IM=dt.object({kind:dt.enum(i_).optional(),title:dt.string().min(1).max(300).optional(),body:dt.string().min(1).max(jE).optional(),status:dt.enum(["active","archived"]).optional()});async function a_(e){if(!e)return null;try{let[t]=await u.select({projectId:ye.projectId}).from(ye).where(it(ye.path,e)).orderBy(Mp(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(a_,"resolveProjectId");En.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"),p=n??await a_(r??null),m=[it(W.userId,t)];o!=="all"&&m.push(it(W.status,o));let _=e.req.query("kind");_&&i_.includes(_)&&m.push(it(W.kind,_));let w=e.req.query("search")?.trim();if(w){let I=`%${ct(w)}%`;m.push(mn`(${W.title} ilike ${I} or ${W.body} ilike ${I})`)}(n||r)&&m.push(p?mn`(${W.projectId} = ${p} or ${W.projectId} is null)`:mn`${W.projectId} is null`);let f=mn`${W.trustVersion} = ${W.version}`;l==="trust"&&m.push(mn`coalesce(${W.trustClass} = 'harmful' and ${f}, false) = false`);let h=mn`case
1314
1346
  when ${W.source} = 'manual' or (${W.trustClass} = 'helpful' and ${f}) then 0
1315
1347
  when ${W.trustClass} = 'neutral' and ${f} then 1
1316
1348
  else 2
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`
1349
+ 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(Qn(...m)).orderBy(...l==="trust"?[h,Mp(W.updatedAt)]:[Mp(W.updatedAt)]).limit(i).offset(l==="trust"?0:d);return e.json({memories:v})});En.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):[],p=typeof n.projectId=="string"?n.projectId:void 0,m=typeof n.projectPath=="string"?n.projectPath:void 0,_=p??await a_(m??null),w=p||m?_?mn`(m.project_id = ${_} or m.project_id is null)`:mn`m.project_id is null`:mn`true`,f=l.length?mn`and m.id not in (${mn.join(l.map(v=>mn`${v}::uuid`),mn`, `)})`:mn``,h=await u.execute(mn`
1318
1350
  with raw as (
1319
1351
  select websearch_to_tsquery('english', ${r})::text as t
1320
1352
  ), q as (
@@ -1345,7 +1377,7 @@ ${r}`).digest("hex")}c(oE,"recommendationEntryHash");var pL=new Set(["42883","42
1345
1377
  else 2 end,
1346
1378
  m.updated_at desc
1347
1379
  limit ${s}
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.
1380
+ `);return e.json({memories:[...h]})});En.get("/memories/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(W).where(Qn(it(W.id,n),it(W.userId,t))).limit(1);return r?e.json(r):e.json({error:"not found"},404)});En.post("/memories",async e=>{let t=e.get("userId"),n=vM.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 a_(a??null),[p]=await u.select({orgId:R.activeOrgId}).from(R).where(it(R.id,t)).limit(1),[m]=await u.insert(W).values({userId:t,orgId:p?.orgId??null,projectId:l,kind:r,title:o,body:s,source:d??"manual",status:"active"}).returning();return e.json(m,201)});En.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 u.select().from(W).where(Qn(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,[p]=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(Qn(it(W.id,n),it(W.userId,t))).returning();return e.json(p)});En.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(Qn(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 bM=dt.object({externalSessionId:dt.string().min(1),projectPath:dt.string().optional()});En.post("/memories/:id/exposures",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=bM.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(Qn(it(W.id,n),it(W.userId,t))).limit(1);return o?(await u.insert(Eu).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 EM=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()});En.post("/memories/:id/experiments",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=EM.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(Qn(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 MI({experimentId:s.id,userId:t});return e.json({experiment:s,noLiveWorker:i},201)});En.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(Qn(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(Qn(it($t.memoryId,n),it($t.userId,t))).orderBy(Mp($t.createdAt)).limit(20);return e.json({experiments:o})});En.get("/memory-experiments/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from($t).where(Qn(it($t.id,n),it($t.userId,t))).limit(1);return r?e.json(r):e.json({error:"not found"},404)});var AM=dt.object({status:dt.enum(["running","completed","failed"]),error:dt.string().max(1e3).nullable().optional(),result:dt.record(dt.unknown()).optional()});En.patch("/memory-experiments/:id",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{status:o,error:s,result:i}=r.data,[a]=await u.select({id:$t.id,status:$t.status}).from($t).where(Qn(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(Qn(it($t.id,n),it($t.userId,t))).returning();return e.json(l)});O();import{randomBytes as SM,createHash as xM}from"node:crypto";import{Hono as RM}from"hono";import{z as NE}from"zod";import{eq as $p,and as TM,isNull as kM}from"drizzle-orm";var Ia=new RM;function jM(){let n=`rm_${SM(32).toString("base64url")}`,r=xM("sha256").update(n).digest("hex"),o=n.slice(0,11);return{plaintext:n,hash:r,prefix:o}}c(jM,"generateApiKey");var NM=NE.object({name:NE.string().min(1).max(100)});Ia.post("/auth/api-keys",async e=>{let t=e.get("userId"),n=await e.req.json(),r=NM.parse(n),{plaintext:o,hash:s,prefix:i}=jM(),[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)});Ia.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($p(Ae.userId,t)).orderBy(Ae.createdAt);return e.json(n)});Ia.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(TM($p(Ae.id,n),$p(Ae.userId,t),kM(Ae.revokedAt)));return r?(await u.update(Ae).set({revokedAt:new Date}).where($p(Ae.id,n)),e.json({revoked:!0})):e.json({error:"API key not found"},404)});O();import{Hono as PM}from"hono";import{z as to}from"zod";import{eq as Pt,and as no,isNull as DM,sql as c_}from"drizzle-orm";import{randomUUID as d_}from"node:crypto";var ro=new PM;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 OM=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=OM.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=d_(),i={id:s,role:"user",content:r.content,createdAt:new Date().toISOString()};await u.update(He).set({messages:c_`${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 CM=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=CM.parse(await e.req.json()),o={id:d_(),role:"assistant",content:r.content,type:r.type,data:r.data,createdAt:new Date().toISOString()};return await u.update(He).set({messages:c_`${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 LM=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=LM.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(m=>m.id===r.messageId&&m.type==="proposal");if(!i?.data?.proposedContent)return e.json({error:"Proposal message not found or has no content"},400);let[a]=await u.select().from(k).where(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),DM(Ee.retiredAt)));l.length>0&&await u.insert(Ee).values(l.map(m=>({evalTargetId:d.id,name:m.name,prompt:m.prompt,expectedOutput:m.expectedOutput,files:m.files,expectations:m.expectations})));let p={id:d_(),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:c_`${He.messages} || ${JSON.stringify([p])}::jsonb`,updatedAt:new Date}).where(Pt(He.id,n)),e.json({newTarget:d,message:p})});O();import*as ba from"node:fs";import*as Vs from"node:path";import{createHash as MM}from"node:crypto";import{fileURLToPath as $M}from"node:url";import{createRequire as qM}from"node:module";import{Hono as UM}from"hono";import{z as vt}from"zod";import{eq as zs,desc as HM,and as BM,sql as FM}from"drizzle-orm";var WM=Vs.dirname($M(import.meta.url)),zo=new UM,qp=null,Up=null;function zM(){let e=process.env.RULEMETRIC_SKILLS_REGISTRY_PATH;if(e&&ba.existsSync(e))return e;try{let n=qM(import.meta.url),r=Vs.dirname(n.resolve("@rulemetric/skills-registry/package.json")),o=Vs.join(r,"registry.json");if(ba.existsSync(o))return o}catch{}let t=Vs.resolve(WM,"../../../../packages/skills-registry/registry.json");return ba.existsSync(t)?t:null}c(zM,"resolveRegistryPath");function PE(){if(qp)return qp;let e=zM();return e?(qp=JSON.parse(ba.readFileSync(e,"utf-8")),qp):null}c(PE,"loadRegistry");function VM(){if(Up)return Up;let e=PE();return e?(Up={version:e.version,generatedAt:e.generatedAt,skills:e.skills.map(({content:t,...n})=>n)},Up):null}c(VM,"loadRegistryIndex");zo.get("/skills",e=>{let t=VM();return t?e.json(t):e.json({error:"Skills registry not found"},404)});zo.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)});zo.get("/skills/submissions/approved",async e=>{let n=(await u.select().from(_o).where(zs(_o.status,"approved")).orderBy(HM(_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 DE=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()}),cie=vt.object({skills:vt.array(DE).max(5e3)});zo.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,p=0,m=0;for(let _ of i){let w=DE.safeParse(_);if(!w.success){console.warn("[sync-public] Skipping invalid skill entry:",JSON.stringify(w.error.issues)),m++;continue}let f=w.data,h=MM("sha256").update(f.content).digest("hex"),v=`public_skill::${f.source.repo}::${f.id}`,I=f.updatedAt??"1.0.0",[b]=await u.select({id:g.id,contentHash:g.contentHash,popularityScore:g.popularityScore,sourceUpdatedAt:g.sourceUpdatedAt,frontmatter:g.frontmatter,description:g.description}).from(g).where(BM(zs(g.name,f.id),zs(g.scope,"public"))),A=f.popularity&&Math.max(f.popularity.stars??0,f.popularity.installs??0)||null,S=f.sourceUpdatedAt?new Date(f.sourceUpdatedAt):null,E=S&&!Number.isNaN(S.getTime())?S:null;if(b)if(b.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,b.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:E,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,b.id));let[L]=await N.select({max:FM`coalesce(max(${xe.versionNumber}), 0)`}).from(xe).where(zs(xe.instructionId,b.id));await N.insert(xe).values({instructionId:b.id,versionNumber:(L?.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++,p++}else{let T=b.sourceUpdatedAt?.getTime()??null,P=E?.getTime()??null,H=b.popularityScore!==A,N=E!==null&&T!==P,L=b.frontmatter??{},q=f.kind??"skill",B=L.kind!==q,J=f.description||f.name,ce=b.description!==J,V=L.name!==f.name;(H||N||B||ce||V)&&await u.update(g).set({...H?{popularityScore:A}:{},...N?{sourceUpdatedAt:E}:{},...ce?{description:J}:{},...B||V?{frontmatter:{...L,kind:q,name:f.name}}:{}}).where(zs(g.id,b.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:E}).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"}),p++)}}return e.json({inserted:a,updated:d,unchanged:l,versionsCreated:p,skipped:m})});zo.get("/skills/:id",e=>{let t=PE();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 s$}from"hono";import{desc as i$,eq as a$}from"drizzle-orm";O();import{eq as CE,and as n$}from"drizzle-orm";O();var JM=/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,KM="claude-haiku-4-5-20251001",GM=1e3,YM=.7,XM=`You extract pricing and rate-limit changes from AI provider release notes.
1349
1381
  Return a JSON object: {
1350
1382
  "observations": [
1351
1383
  {
@@ -1360,66 +1392,66 @@ Return a JSON object: {
1360
1392
  }
1361
1393
  Only emit observations if the release notes EXPLICITLY state a numeric value.
1362
1394
  Do NOT speculate. Do NOT emit observations for "increased by X%" without an absolute number.
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}
1395
+ Return { "observations": [] } if nothing concrete.`;function QM(){let e=process.env.ANTHROPIC_API_KEY;if(!e)return null;let t=Cc("anthropic",e);return async n=>{let r=await t.complete(n,{model:KM,maxTokens:GM,temperature:0});return{text:r.text,usage:{inputTokens:r.usage?.inputTokens??0,outputTokens:r.usage?.outputTokens??0}}}}c(QM,"defaultLlm");async function ZM(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(ZM,"defaultObserve");function e$(e){return`${XM}
1364
1396
 
1365
1397
  Release notes (harness=${e.harness}, version=${e.version}):
1366
1398
 
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>
1399
+ ${e.body??""}`}c(e$,"buildPrompt");function t$(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(t$,"parseLlmJson");async function OE(e,t={}){let n=e.body??"";if(!JM.test(n))return{observations:[],llm_called:!1,reason:"no keywords matched"};let r=t.llm===void 0?QM():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(e$(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=t$(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??ZM;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:YM,provider:"anthropic"});return{observations:i,llm_called:!0,llm_tokens:{input:s.inputTokens,output:s.outputTokens}}}c(OE,"extractAndPostObservationsFromRelease");var LE=[{harness:"claude_code",repo:"anthropics/claude-code"},{harness:"codex",repo:"openai/codex"}];function r$(e){return e.prerelease===!0||/-(alpha|beta|rc)\b/i.test(e.tag_name)}c(r$,"isPrerelease");function o$(e){let t=[],n=[],r=[],o=e.split(`
1400
+ `);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(o$,"parseReleaseBody");async function Hp(e){let t=e?LE.filter(o=>o.harness===e):LE,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(r$(l))continue;let p=o$(l.body??"");if((await u.select({id:qt.id}).from(qt).where(n$(CE(qt.harness,o.harness),CE(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:p,url:l.html_url}),n++;try{await OE({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(Hp,"syncHarnessReleases");var Dd=new s$;Dd.get("/harness-releases",async e=>{let t=e.req.query("harness"),n=Math.min(Number(e.req.query("limit")??50),100),r=t?a$(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(i$(qt.publishedAt)).limit(n);return e.json(o)});Dd.post("/harness-releases/sync",async e=>{let t=await e.req.json().catch(()=>({})),n=await Hp(t.harness);return e.json(n)});O();import{Hono as c$}from"hono";import{and as Bp,desc as d$,eq as Ea,isNull as u_,sql as u$}from"drizzle-orm";var Aa=new c$;Aa.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"?Bp(Ea(Rt.userId,t),u_(Rt.readAt)):Ea(Rt.userId,t),i=await u.select().from(Rt).where(s).orderBy(d$(Rt.createdAt)).limit(n).offset(r),[{count:a}]=await u.select({count:u$`count(*)::int`}).from(Rt).where(Bp(Ea(Rt.userId,t),u_(Rt.readAt)));return e.json({items:i,unreadCount:a})});Aa.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(Bp(Ea(Rt.id,t),Ea(Rt.userId,n))).returning();return r?e.json(r):e.json({error:"Not found"},404)});Aa.post("/notifications/read-all",async e=>{let t=e.get("userId");return await u.update(Rt).set({readAt:new Date}).where(Bp(Ea(Rt.userId,t),u_(Rt.readAt))),e.json({success:!0})});O();import{Hono as l$}from"hono";import{z as an}from"zod";import{eq as Or,and as Fp,desc as p$,ne as m$}from"drizzle-orm";var Vo=new l$;function f$(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(f$,"parseTerminalTargetResult");async function g$(e){let t=f$(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(Fp(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(g$,"upsertTerminalTargetFromLaunchResult");var h$=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()})});Vo.post("/launch-jobs",async e=>{let t=e.get("userId"),n=await e.req.json(),r=h$.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)});Vo.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(p$(ue.createdAt)).limit(n);return e.json(r)});var _$=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()});Vo.patch("/launch-jobs/:id/state",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=_$.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(Fp(Or(ue.id,n),Or(ue.userId,t),m$(ue.status,"cancelled"))).returning();if(!s){let[i]=await u.select().from(ue).where(Fp(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 g$({userId:t,jobId:n,config:s.config,result:r.result}),e.json(s)});Vo.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(Fp(Or(ue.id,n),Or(ue.userId,t))).returning();return r?e.json(r):e.json({error:"Job not found"},404)});Vo.get("/launchers",async e=>{let{getAvailableLaunchers:t}=await Promise.resolve().then(()=>(tp(),Xb));return e.json(t())});O();import{Hono as y$}from"hono";import{z as Zn}from"zod";import{eq as je,and as Gt,desc as zp,inArray as Wp,isNull as w$,ne as v$}from"drizzle-orm";tp();var Cr=new y$,I$=Zn.object({tool:Zn.string().min(1),model:Zn.string().optional(),label:Zn.string().optional()}),b$=Zn.object({title:Zn.string().optional(),projectPath:Zn.string().min(1),gitRemote:Zn.string().optional(),baseBranch:Zn.string().optional(),prompt:Zn.string().optional(),autoWorktree:Zn.boolean().optional(),sessions:Zn.array(I$).min(1).max(8)});function E$(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/(^-|-$)/g,"")||"tool"}c(E$,"sanitizeTool");var A$=new Set(["pending","claimed","running"]);var S$=1800*1e3;function ME(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>S$:!1}c(ME,"canSkipRollup");function $E(e,t,n){if(e==="cancelled")return"cancelled";let r=t.length>0,o=t.some(a=>a.endedAt==null),s=n.some(a=>A$.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($E,"rollupRunStatus");async function qE(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(je(te.id,e.runId),je(te.userId,e.userId),v$(te.status,"cancelled")))}catch{}}c(qE,"persistRolledUpStatus");function x$(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(x$,"frictionCount");async function R$(e,t){if(!e||typeof e!="object")return null;let n=e,r="claude-sonnet-4-6",o=Ho(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(R$,"deriveSessionCost");async function UE(e,t){let[n]=await u.select({id:te.id,autoWorktree:te.autoWorktree}).from(te).where(Gt(je(te.id,e),je(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(je(ue.runId,e),je(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(ep({repoRoot:d.projectPath,branch:d.worktree.branch}))}return o.size===0?{linked:0}:{linked:(await u.update(y).set({runId:e}).where(Gt(je(y.userId,t),w$(y.runId),Wp(y.projectPath,[...o]))).returning({id:y.id})).length}}c(UE,"linkRunSessions");Cr.post("/runs",async e=>{let t=e.get("userId"),n=await e.req.json(),r=b$.parse(n),o=await jo(t,null),s=r.autoWorktree??!0,i=r.baseBranch??"HEAD",a=null;if(r.projectPath){let[m]=await u.select({projectId:ye.projectId}).from(ye).where(je(ye.path,r.projectPath)).orderBy(zp(ye.lastSeen)).limit(1);a=m?.projectId??null}if(!a&&r.gitRemote){let[m]=await u.select({id:C.id}).from(C).where(je(C.gitRemoteUrl,r.gitRemote)).limit(1);a=m?.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),p=!1;try{for(let m=0;m<r.sessions.length;m++){let _=r.sessions[m],w=`rm/run-${l}/s${m}-${E$(_.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});p=p||h.noLiveWorker}}catch(m){return await u.update(te).set({status:"failed",updatedAt:new Date}).where(je(te.id,d.id)),await u.update(ue).set({status:"cancelled",updatedAt:new Date}).where(Gt(je(ue.runId,d.id),je(ue.status,"pending"))),e.json({error:"Failed to enqueue all launch jobs",detail:m instanceof Error?m.message:String(m),run:{...d,status:"failed"}},500)}return e.json({run:d,noLiveWorker:p},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(je(te.userId,t),je(te.projectId,i)):je(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(zp(te.createdAt)).limit(r).offset(s),l=d.filter(m=>!ME(m.status,m.completedAt)),p=l.map(m=>m.id);if(p.length>0){let[m,_]=await Promise.all([u.select({runId:y.runId,endedAt:y.endedAt}).from(y).where(Gt(je(y.userId,t),Wp(y.runId,p))),u.select({runId:ue.runId,status:ue.status}).from(ue).where(Gt(je(ue.userId,t),Wp(ue.runId,p)))]),w=new Map;for(let h of m){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=$E(h.status,w.get(h.id)??[],f.get(h.id)??[]);v!==h.status&&(await qE({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(je(te.id,n),je(te.userId,t))).limit(1);if(!r)return e.json({error:"Run not found"},404);try{await UE(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(je(y.runId,n),je(y.userId,t))).orderBy(zp(y.startedAt)),s=o.map(v=>v.id);if(!ME(r.status,r.completedAt)){let v=await u.select({status:ue.status}).from(ue).where(Gt(je(ue.runId,n),je(ue.userId,t))),I=$E(r.status,o.map(b=>({endedAt:b.endedAt})),v);I!==r.status&&(await qE({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,je(g.id,ie.instructionId)).where(Wp(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??{},b=typeof I.goalSummary=="string"?I.goalSummary:null,A=typeof I.outcome=="string"?I.outcome:null,S=I.friction??null,E=await R$(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:b,outcome:A,friction:S,cost:E,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:x$(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})),p=new Map,m=new Map;for(let v of i)p.set(v.instructionId,v.name),m.has(v.instructionId)||m.set(v.instructionId,new Set),m.get(v.instructionId).add(v.sessionId);let _=s.length,w=[],f=[];for(let[v,I]of m){let b=p.get(v)??"Unknown";_>0&&I.size===_?w.push({id:v,name:b}):f.push({id:v,name:b,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(je(te.id,n),je(te.userId,t))).limit(1);if(!r)return e.json({error:"Run not found"},404);let{linked:o}=await UE(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(je(te.id,n),je(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(je(ue.runId,n),je(ue.userId,t))).orderBy(zp(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(je(te.id,n),je(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(je(ue.runId,n),je(ue.userId,t),je(ue.status,"pending")));let[o]=await u.update(te).set({status:"cancelled",updatedAt:new Date}).where(Gt(je(te.id,n),je(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(je(te.id,n),je(te.userId,t))).limit(1);if(!r)return e.json({error:"Run not found"},404);let{noLiveWorker:o}=await CI({runId:n,userId:t});return e.json({enqueued:!0,noLiveWorker:o})});O();import{Hono as T$}from"hono";import{z as Js}from"zod";import{and as Sa,desc as l_,eq as Zt,or as HE}from"drizzle-orm";var Ks=new T$;function k$(e,t){return{liveSend:e?.kind==="tmux"&&e.status==="active"&&t,fallbackResume:!0,tmuxAvailable:e?.kind==="tmux"&&e.status!=="fallback_only",workerOnline:t}}c(k$,"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(Sa(Zt(y.id,n),Zt(y.userId,t))).limit(1);if(!r)return e.json({error:"Session not found"},404);let o=r.externalSessionId?HE(Zt(Ze.sessionId,r.id),Zt(Ze.externalSessionId,r.externalSessionId)):Zt(Ze.sessionId,r.id),[s]=await u.select().from(Ze).where(Sa(Zt(Ze.userId,t),o)).orderBy(l_(Ze.lastSeenAt)).limit(1),i=await Bi(t);return e.json({target:s??null,capabilities:k$(s??null,i),...s?{}:{reason:"no_target"}})});var BE=Js.enum(["active","missing","unknown","fallback_only"]),j$=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=j$.parse(await e.req.json()),[o]=await u.select({id:y.id,externalSessionId:y.externalSessionId,projectPath:y.projectPath}).from(y).where(Sa(Zt(y.id,n),Zt(y.userId,t))).limit(1);if(!o)return e.json({error:"Session not found"},404);let s=o.externalSessionId?HE(Zt(Ze.sessionId,o.id),Zt(Ze.externalSessionId,o.externalSessionId)):Zt(Ze.sessionId,o.id),[i]=await u.select().from(Ze).where(Sa(Zt(Ze.userId,t),Zt(Ze.status,"active"),s)).orderBy(l_(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},m={tool:"claude_code",config:p},{id:_,noLiveWorker:w}=await Ct({taskName:"process_launch",payload:m,userId:t,mirror:{userId:t,tool:"claude_code",config:p}});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 Bi(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 N$=Js.object({status:BE,lastSeenAt:Js.string().datetime().optional()});Ks.patch("/terminal-targets/:id/status",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=N$.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(Sa(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?BE.parse(n):null,o=await u.select().from(Ze).where(Sa(Zt(Ze.userId,t),...r?[Zt(Ze.status,r)]:[])).orderBy(l_(Ze.lastSeenAt)).limit(100);return e.json({targets:o})});import{Hono as _1}from"hono";O();import{Hono as Y$}from"hono";import{z as Lr}from"zod";import{eq as fr,and as YE,asc as XE,sql as X$,isNull as QE}from"drizzle-orm";O();import{eq as p_,and as P$}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(p_(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(P$(p_(ee.orgId,s.id),p_(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 V$}from"zod";import{randomBytes as J$}from"node:crypto";import{eq as g_,and as K$,sql as G$}from"drizzle-orm";import{randomBytes as D$}from"node:crypto";async function m_(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}
1401
+ `),{id:`noop-${D$(8).toString("hex")}`,provider:"noop"}}c(m_,"sendNoopEmail");var Vp=null;async function O$(){if(Vp)return Vp;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 Vp=new t(e),Vp}c(O$,"getClient");var FE=!1;function C$(){let e=process.env.RESEND_FROM_EMAIL;if(e)return e;if(!FE){FE=!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.
1402
+ `)}return"onboarding@resend.dev"}c(C$,"resolveFromEmail");async function WE(e){let t=e.fromName??"RuleMetric",n=C$(),r=`${t} <${n}>`,o=await O$(),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(WE,"sendResendEmail");async function zE(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(zE,"sendSmtpEmail");var L$="#2DD4BF",M$="#0d9488",$$="#0A0C12",Jp="#1a1a1a",Kp="#666666",VE="#f5f5f7",q$="#ffffff",JE="#e5e5e9";function U$(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(U$,"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 H$(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(H$,"roleCopy");function f_(e){let{orgName:t,inviterName:n,role:r,acceptUrl:o,expiresAt:s}=e,i=`${n} invited you to ${t} on RuleMetric`,a=U$(s),{article:d,description:l}=H$(r),p=`<!doctype html>
1371
1403
  <html lang="en">
1372
1404
  <head>
1373
1405
  <meta charset="utf-8" />
1374
1406
  <meta name="viewport" content="width=device-width, initial-scale=1" />
1375
- <title>${Aa(i)}</title>
1407
+ <title>${xa(i)}</title>
1376
1408
  </head>
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;">
1409
+ <body style="margin:0;padding:0;background:${VE};font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;color:${Jp};">
1410
+ <table role="presentation" width="100%" cellspacing="0" cellpadding="0" border="0" style="background:${VE};padding:32px 16px;">
1379
1411
  <tr>
1380
1412
  <td align="center">
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;">
1413
+ <table role="presentation" width="560" cellspacing="0" cellpadding="0" border="0" style="max-width:560px;background:${q$};border:1px solid ${JE};border-radius:8px;overflow:hidden;">
1382
1414
  <tr>
1383
1415
  <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:${Wm};">
1385
- You've been invited to ${Aa(t)}
1416
+ <h1 style="margin:0 0 16px 0;font-size:22px;line-height:1.3;font-weight:600;color:${Jp};">
1417
+ You've been invited to ${xa(t)}
1386
1418
  </h1>
1387
- <p style="margin:0 0 16px 0;font-size:15px;line-height:1.5;color:${Wm};">
1419
+ <p style="margin:0 0 16px 0;font-size:15px;line-height:1.5;color:${Jp};">
1388
1420
  Hi there,
1389
1421
  </p>
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}.
1422
+ <p style="margin:0 0 16px 0;font-size:15px;line-height:1.5;color:${Jp};">
1423
+ <strong>${xa(n)}</strong> invited you to join
1424
+ <strong>${xa(t)}</strong> on RuleMetric as ${d}.
1393
1425
  </p>
1394
- <p style="margin:0 0 24px 0;font-size:15px;line-height:1.5;color:${zm};">
1426
+ <p style="margin:0 0 24px 0;font-size:15px;line-height:1.5;color:${Kp};">
1395
1427
  ${l}
1396
1428
  </p>
1397
1429
  </td>
1398
1430
  </tr>
1399
1431
  <tr>
1400
1432
  <td align="center" style="padding:0 32px 8px 32px;">
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;">
1433
+ <a href="${xa(o)}"
1434
+ style="display:inline-block;padding:12px 24px;background:${L$};color:${$$};text-decoration:none;border-radius:6px;font-size:15px;font-weight:600;">
1403
1435
  Accept invitation
1404
1436
  </a>
1405
1437
  </td>
1406
1438
  </tr>
1407
1439
  <tr>
1408
1440
  <td style="padding:16px 32px 8px 32px;">
1409
- <p style="margin:0 0 8px 0;font-size:13px;line-height:1.5;color:${zm};">
1441
+ <p style="margin:0 0 8px 0;font-size:13px;line-height:1.5;color:${Kp};">
1410
1442
  Or copy and paste this link into your browser:
1411
1443
  </p>
1412
- <p style="margin:0 0 24px 0;font-size:13px;line-height:1.5;color:${j$};word-break:break-all;">
1413
- ${Aa(o)}
1444
+ <p style="margin:0 0 24px 0;font-size:13px;line-height:1.5;color:${M$};word-break:break-all;">
1445
+ ${xa(o)}
1414
1446
  </p>
1415
- <p style="margin:0 0 24px 0;font-size:13px;line-height:1.5;color:${zm};">
1447
+ <p style="margin:0 0 24px 0;font-size:13px;line-height:1.5;color:${Kp};">
1416
1448
  This invitation expires on <strong>${a}</strong>.
1417
1449
  </p>
1418
1450
  </td>
1419
1451
  </tr>
1420
1452
  <tr>
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};">
1453
+ <td style="padding:16px 32px 32px 32px;border-top:1px solid ${JE};">
1454
+ <p style="margin:0;font-size:12px;line-height:1.5;color:${Kp};">
1423
1455
  If you didn't expect this email, you can safely ignore it. The link will expire on its own.
1424
1456
  </p>
1425
1457
  </td>
@@ -1429,17 +1461,17 @@ ${e.body??""}`}c(KM,"buildPrompt");function GM(e){let t=e.trim().replace(/^```(?
1429
1461
  </tr>
1430
1462
  </table>
1431
1463
  </body>
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}
1464
+ </html>`,m=[`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(`
1465
+ `);return{subject:i,html:p,text:m}}c(f_,"renderInvitation");function B$(){let e=process.env.RULEMETRIC_EMAIL_PROVIDER;return e==="resend"||e==="smtp"||e==="noop"?e:process.env.RESEND_API_KEY?"resend":"noop"}c(B$,"selectEmailProvider");var F$=new Set(["test","example","invalid","localhost"]),W$=/^example\.(com|net|org)$/;function z$(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!!(F$.has(o)||W$.test(r))}c(z$,"isUndeliverableRecipient");var KE=!1;async function Gp(e){let t=B$();switch(KE||(KE=!0,process.stderr.write(`[email] active provider: ${t}
1466
+ `)),t){case"resend":return z$(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
1467
+ `),m_(e)):WE(e);case"smtp":return zE(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 m_(e)}}c(Gp,"sendEmail");var oo=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Yp=G$`case ${ee.role}
1436
1468
  when 'owner' then 0
1437
1469
  when 'admin' then 1
1438
1470
  when 'member' then 2
1439
1471
  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`
1472
+ 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(K$(g_(Q.id,t),g_(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 Ra=/^(?=.{3,40}$)[a-z0-9]+(?:-[a-z0-9]+)*$/,Ta="Slug must be 3-40 chars, lowercase alphanumerics with single dashes only \u2014 no leading, trailing, or consecutive dashes";function Od(){return J$(32).toString("base64url")}c(Od,"generateInviteToken");var GE=!1;function Cd(e){let t=process.env.WEB_URL??process.env.RULEMETRIC_WEB_URL;return t||(process.env.NODE_ENV==="production"?(GE||(GE=!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
1473
+ `)),t="https://rulemetric.com"):t="http://localhost:5174"),`${t.replace(/\/$/,"")}/invite/${e}`}c(Cd,"buildAcceptUrl");async function Ld(e){let[t]=await u.select({displayName:R.displayName,email:R.email}).from(R).where(g_(R.id,e));return t?.displayName?.trim()||t?.email||"A teammate"}c(Ld,"getInviterDisplayName");async function Md(e){try{let{subject:t,html:n,text:r}=f_({orgName:e.orgName,inviterName:e.inviterName,role:e.role,acceptUrl:e.acceptUrl,expiresAt:e.expiresAt});return(await Gp({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}
1474
+ `),yr(t,{tags:{source:"invite-email"},extra:{to:e.to,orgName:e.orgName}}),{sent:!1,reason:n}}}c(Md,"sendInvitationEmail");var Xp=V$.enum(["admin","member"]);var Jo=new Y$,Q$=Lr.object({name:Lr.string().min(1).max(100),slug:Lr.string().regex(Ra,{message:Ta}),invite:Lr.object({email:Lr.string().email().max(254),role:Xp.optional()}).optional()}),Z$=Lr.object({name:Lr.string().min(1).max(100).optional(),slug:Lr.string().regex(Ra,{message:Ta}).optional()});Jo.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=Q$.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:p,error:m}=await t.rpc("create_organization",{p_name:s,p_slug:i});if(m){let _=Ot(m),w=To(m);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 m}d=p}else try{d=await u.transaction(async p=>{let[m]=await p.insert(X).values({name:s,slug:i}).returning({id:X.id,name:X.name,slug:X.slug});return await p.insert(ee).values({userId:n,orgId:m.id,role:"owner"}),await p.update(R).set({activeOrgId:m.id}).where(YE(fr(R.id,n),QE(R.activeOrgId))),await p.update(y).set({orgId:m.id}).where(YE(fr(y.userId,n),QE(y.orgId))),m})}catch(p){if(Ot(p)==="23505")return e.json({error:"Slug already taken",code:"ORG_SLUG_TAKEN"},409);throw p}let l;if(a){let p=a.email.toLowerCase(),m=a.role??"member",_=Od(),[w]=await u.insert(se).values({orgId:d.id,email:p,role:m,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=Cd(_),h=await Ld(n),v=await Md({to:p,orgName:d.name,inviterName:h,role:m,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)});Jo.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,fr(ee.orgId,X.id)).where(fr(ee.userId,t)).orderBy(X.createdAt);return e.json(n.map(r=>({id:r.id,name:r.name,slug:r.slug,role:r.role})))});Jo.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(fr(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,fr(ee.userId,R.id)).where(fr(ee.orgId,t)).orderBy(Yp,XE(ee.createdAt)),o=await u.select({id:Q.id,name:Q.name,slug:Q.slug,memberCount:X$`count(${we.userId})::int`}).from(Q).leftJoin(we,fr(we.teamId,Q.id)).where(fr(Q.orgId,t)).groupBy(Q.id,Q.name,Q.slug).orderBy(XE(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)}))})});Jo.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=Z$.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(fr(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}});Jo.delete("/orgs/:slug",It(["owner"]),async e=>{let t=e.get("orgId");return await u.delete(X).where(fr(X.id,t)),e.body(null,204)});var e1=Lr.object({newOwnerId:Lr.string().uuid()});Jo.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=e1.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),p=To(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 d=i;return e.json({orgId:d.orgId,newOwnerId:d.newOwnerId,oldOwnerId:d.oldOwnerId})});O();import{Hono as t1}from"hono";import{z as ZE}from"zod";import{eq as $d,and as eA,asc as n1,max as r1,inArray as tA}from"drizzle-orm";var qd=new t1;qd.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,$d(ee.userId,R.id)).where($d(ee.orgId,t)).orderBy(Yp,n1(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,$d(we.teamId,Q.id)).where(eA($d(Q.orgId,t),tA(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:r1(y.startedAt)}).from(y).where(eA($d(y.orgId,t),tA(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 o1=ZE.object({role:ZE.enum(["owner","admin","member"])});qd.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=o1.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),p=To(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 d=i;return e.json({userId:d.userId,orgId:d.orgId,role:d.role})});qd.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),p=To(d);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 d}return e.body(null,204)});O();import{Hono as s1}from"hono";import{z as Ko}from"zod";import{eq as Go,and as nA,asc as i1,sql as a1}from"drizzle-orm";var Yo=new s1,c1=Ko.object({name:Ko.string().min(1).max(100),slug:Ko.string().regex(Ra,{message:Ta})}),d1=Ko.object({name:Ko.string().min(1).max(100).optional(),slug:Ko.string().regex(Ra,{message:Ta}).optional()}),u1=Ko.object({userId:Ko.string().uuid()});Yo.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:a1`count(${we.userId})::int`}).from(Q).leftJoin(we,Go(we.teamId,Q.id)).where(Go(Q.orgId,t)).groupBy(Q.id,Q.name,Q.slug,Q.createdAt).orderBy(i1(Q.name));return e.json(n.map(r=>({id:r.id,name:r.name,slug:r.slug,memberCount:Number(r.memberCount),createdAt:r.createdAt})))});Yo.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=c1.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}});Yo.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=d1.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(Go(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}});Yo.delete("/orgs/:slug/teams/:teamId",It(["owner","admin"]),async e=>{let t=await Gs(e);return t.ok?(await u.delete(Q).where(Go(Q.id,t.team.id)),e.body(null,204)):t.response});Yo.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=u1.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(nA(Go(ee.userId,o),Go(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)});Yo.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(nA(Go(we.teamId,t.team.id),Go(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 l1}from"hono";import{z as h_}from"zod";import{eq as gr,and as Qp,desc as p1,sql as m1,isNull as ka,gt as f1}from"drizzle-orm";var ja=new l1,g1=h_.object({email:h_.string().email().max(254),role:Xp.optional(),teamId:h_.string().uuid().optional()});ja.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=g1.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(Qp(gr(Q.id,a),gr(Q.orgId,r)));if(!h)return e.json({error:"Team not found in this organization",code:"INVALID_TEAM"},400)}let d=Od(),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 p=Cd(d),[m]=await u.select({name:X.name}).from(X).where(gr(X.id,r)),_=await Ld(o),w=await Md({to:s,orgName:m?.name??"your organization",inviterName:_,role:l.role,acceptUrl:p,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:p,emailSent:w.sent,...w.sent?{}:{emailError:w.reason},...f?{token:d}:{}},201)});ja.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,gr(se.teamId,Q.id)).leftJoin(R,gr(se.invitedBy,R.id)).where(Qp(gr(se.orgId,t),ka(se.acceptedAt),ka(se.revokedAt),f1(se.expiresAt,m1`now()`))).orderBy(p1(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})))});ja.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(Qp(gr(se.id,t),gr(se.orgId,n),ka(se.acceptedAt),ka(se.revokedAt))).returning({id:se.id})).length===0?e.json({error:"Invitation not found",code:"INVITE_NOT_FOUND"},404):e.body(null,204)});ja.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=Od(),o=new Date(Date.now()+10080*60*1e3),s=await u.update(se).set({token:r,expiresAt:o}).where(Qp(gr(se.id,t),gr(se.orgId,n),ka(se.acceptedAt),ka(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=Cd(r),d=e.get("userId"),[l]=await u.select({name:X.name}).from(X).where(gr(X.id,n)),p=await Ld(d),m=await Md({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:m.sent,...m.sent?{}:{emailError:m.reason},..._?{token:r}:{}})});O();import{Hono as h1}from"hono";import{eq as Ud,and as oA,sql as sA,inArray as __,gte as iA}from"drizzle-orm";var em=new h1,Zp={"7d":7,"30d":30},rA={fully_achieved:1,mostly_achieved:.75,partially_achieved:.5,unclear_from_transcript:.25,not_achieved:0};async function y_(e,t,n,r,o,s){let i=new Map;for(let S of e)i.set(S.tool,(i.get(S.tool)??0)+1);let a=[...i.entries()].sort((S,E)=>E[1]-S[1]).slice(0,5).map(([S,E])=>({tool:S,count:E})),d=new Map;for(let S of e)d.set(S.userId,(d.get(S.userId)??0)+1);let l=[...d.entries()].sort((S,E)=>E[1]-S[1]).slice(0,5).map(([S])=>S),p=l.length?await u.select({id:R.id,displayName:R.displayName,email:R.email}).from(R).where(__(R.id,l)):[],m=new Map(p.map(S=>[S.id,S])),_=l.map(S=>{let E=m.get(S);return{userId:S,displayName:E?.displayName??null,email:E?.email??null,count:d.get(S)??0}}),w=new Map;for(let S of e){let E=S.analysis;if(!E)continue;let T=E.friction;if(!T)continue;let P=Object.values(T).reduce((L,q)=>L+(typeof q=="number"?q:0),0),H=S.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(([S],[E])=>S<E?-1:1).map(([S,{sum:E,count:T}])=>({day:S,avgFriction:Math.round(E/T*100)/100})),h=e.map(S=>S.id),v=h.length?await u.select({sessionId:ie.sessionId,instructionId:ie.instructionId,name:g.name,source:sA`${g.frontmatter}->>'source'`}).from(ie).innerJoin(g,Ud(g.id,ie.instructionId)).where(__(ie.sessionId,h)):[],I=new Map;for(let S of v){let E=I.get(S.instructionId);E?E.sessions.add(S.sessionId):I.set(S.instructionId,{name:S.name,source:S.source,sessions:new Set([S.sessionId])})}let b=new Map;for(let S of e){let E=S.analysis;if(!E)continue;let T=E.outcome;T&&T in rA&&b.set(S.id,rA[T])}let A=[];for(let[S,{name:E,source:T,sessions:P}]of I){let H=[],N=[];for(let ce of e){let V=b.get(ce.id);V!==void 0&&(P.has(ce.id)?H.push(V):N.push(V))}let L=c(ce=>ce.length===0?null:ce.reduce((V,me)=>V+me,0)/ce.length,"avg"),q=L(H),B=L(N),J=q!==null&&B!==null?Math.round((q-B)*1e3)/10:null;A.push({instructionId:S,name:E,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(y_,"buildActivityResponse");em.get("/orgs/:slug/activity",It(["owner","admin","member"]),async e=>{let t=e.get("orgId"),n=e.req.query("range")??"7d";if(!(n in Zp))return e.json({error:"Invalid range. Allowed: 7d, 30d",code:"BAD_REQUEST"},400);let r=new Date(Date.now()-Zp[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(oA(Ud(y.orgId,t),iA(y.startedAt,r))),[{count:s}]=await u.select({count:sA`count(*)::int`}).from(ee).where(Ud(ee.orgId,t)),i=await y_(o,n,Number(s),t,r,null);return e.json(i)});em.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 Zp))return e.json({error:"Invalid range. Allowed: 7d, 30d",code:"BAD_REQUEST"},400);let o=new Date(Date.now()-Zp[r]*24*60*60*1e3),s=e.get("orgId"),a=(await u.select({userId:we.userId}).from(we).where(Ud(we.teamId,n.id))).map(p=>p.userId);if(a.length===0){let p=await y_([],r,0,s,o,[]);return e.json(p)}let d=await u.select({id:y.id,userId:y.userId,tool:y.tool,startedAt:y.startedAt,analysis:y.analysis}).from(y).where(oA(Ud(y.orgId,s),iA(y.startedAt,o),__(y.userId,a))),l=await y_(d,r,a.length,s,o,a);return e.json(l)});var Xo=new _1;Xo.route("/",Jo);Xo.route("/",qd);Xo.route("/",Yo);Xo.route("/",ja);Xo.route("/",em);O();import{Hono as y1}from"hono";import{z as w_}from"zod";import{createClient as w1}from"@supabase/supabase-js";import{eq as Hd,and as aA,isNull as cA,sql as dA}from"drizzle-orm";var Bd=new y1;Bd.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,Hd(se.orgId,X.id)).leftJoin(R,Hd(se.invitedBy,R.id)).where(Hd(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 p=w1(process.env.SUPABASE_URL,process.env.SUPABASE_ANON_KEY,{global:{headers:{Authorization:`Bearer ${l}`}}}),{data:m,error:_}=await p.auth.getUser();!_&&m.user&&(s=m.user.id,i=m.user.email)}catch{}}let d=null;if(s&&i&&i.toLowerCase()===n.email.toLowerCase()){let[{cnt:l}]=await u.select({cnt:dA`count(*)::int`}).from(y).where(aA(Hd(y.userId,s),cA(y.orgId)));d=Number(l)}return e.json({orgName:n.orgName,inviterName:n.inviterDisplayName??n.inviterEmail??null,role:n.role,sessionCount:d})});var v1=w_.object({token:w_.string().min(1),acknowledgedSessionCount:w_.number().int().nonnegative()});Bd.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=v1.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:dA`count(*)::int`}).from(y).where(aA(Hd(y.userId,o),cA(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 I1}from"hono";import{z as Fd}from"zod";import{eq as Wd,and as b1}from"drizzle-orm";var zd=new I1;zd.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(Wd(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 E1=["free","pro","max_5x","max_20x"],A1=Fd.object({activeOrgId:Fd.string().uuid().nullable().optional(),claudeCodePlan:Fd.enum(E1).nullable().optional(),setupCompletedAt:Fd.string().datetime().nullable().optional(),liveSendSkipped:Fd.boolean().optional()});zd.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=A1.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(b1(Wd(ee.userId,t),Wd(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(Wd(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(Wd(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 x1}from"hono";import{z as bt}from"zod";import{asc as uA,eq as Ys,sql as er}from"drizzle-orm";O();import{eq as S1}from"drizzle-orm";function Vd(){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(S1(R.id,n));if(!r?.isSuperadmin)return e.json({error:"Forbidden",code:"NOT_SUPERADMIN"},403);await t()}}c(Vd,"requireSuperadmin");ld();var An=new x1;An.use("/superadmin/*",Vd());var R1=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)});An.get("/superadmin/users",async e=>{let t=R1.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(er`
1443
1475
  select
1444
1476
  p.id,
1445
1477
  p.email,
@@ -1461,16 +1493,16 @@ end`;async function Gs(e){let t=e.req.param("teamId");if(!t||!oo.test(t))return{
1461
1493
  count(*) filter (where org_id is null)::int as orphan
1462
1494
  from sessions group by user_id
1463
1495
  ) s on s.user_id = p.id
1464
- ${n?Zn`where p.email ilike ${"%"+ct(n)+"%"}`:Zn``}
1496
+ ${n?er`where p.email ilike ${"%"+ct(n)+"%"}`:er``}
1465
1497
  order by p.created_at desc
1466
1498
  limit ${r} offset ${o}
1467
- `),[{total:i}]=await u.execute(Zn`
1499
+ `),[{total:i}]=await u.execute(er`
1468
1500
  select count(*)::int as total from profiles p
1469
- ${n?Zn`where p.email ilike ${"%"+ct(n)+"%"}`: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`
1501
+ ${n?er`where p.email ilike ${"%"+ct(n)+"%"}`:er``}
1502
+ `);return e.json({users:s,total:i,limit:r,offset:o})});An.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(uA(X.name)),[o]=await u.select({total:er`count(*)::int`,orphan:er`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 Jn().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 lA(e){let[t]=await u.execute(er`
1471
1503
  select count(*)::int as n from profiles
1472
1504
  where is_superadmin = true and id <> ${e}
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`
1505
+ `);return t?.n??0}c(lA,"countOtherSuperadmins");An.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(er`update auth.refresh_tokens set revoked = true where user_id = ${t}`),await u.execute(er`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})});An.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 Jn().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 T1=bt.object({suspended:bt.boolean()});An.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=T1.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 lA(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 Jn().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 k1=bt.object({confirmEmail:bt.string().email()});An.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=k1.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 lA(t)===0)return e.json({error:"Cannot delete the last superadmin",code:"LAST_SUPERADMIN"},409);let{error:s}=await Jn().auth.admin.deleteUser(t);return s?e.json({error:s.message,code:"AUTH_ADMIN_ERROR"},400):e.json({ok:!0})});var j1=bt.object({email:bt.string().email(),orgId:bt.string().uuid().optional(),role:bt.enum(["owner","admin","member"]).optional()});An.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=j1.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=Jn(),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 p=d.user?.id,m=null;if(p&&o&&s){let _=e.get("supabase");if(_){let{error:w}=await _.rpc("superadmin_assign_user_to_org",{p_user_id:p,p_org_id:o,p_role:s,p_claim_sessions:!1});w||(m={orgId:o,role:s})}}return e.json({ok:!0,userId:p??null,email:r,assigned:m})});var N1=bt.object({orgId:bt.string().uuid(),role:bt.enum(["owner","admin","member"]),claimSessions:bt.boolean().default(!0)});An.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=N1.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 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(d)});An.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})});An.get("/superadmin/orgs",async e=>{let t=await u.select({id:X.id,name:X.name,slug:X.slug,memberCount:er`(select count(*)::int from user_organizations where org_id = organizations.id)`,createdAt:X.createdAt}).from(X).orderBy(uA(X.name));return e.json({orgs:t})});import{Hono as P1}from"hono";import{z as Qo}from"zod";var tm=new P1,pA=Qo.object({type:Qo.string().min(1).max(64),payload:Qo.record(Qo.unknown()).optional(),timestamp:Qo.string().datetime().optional()}),D1=Qo.union([pA,Qo.object({events:Qo.array(pA).max(50)})]);tm.post("/telemetry/extension-events",async e=>{let t=e.get("userId"),n=await e.req.json().catch(()=>null),r=D1.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 O1}from"hono";import{z as Mr}from"zod";import{sql as C1}from"drizzle-orm";var Jd=new O1,mA=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()}),L1=Mr.union([mA,Mr.object({events:Mr.array(mA).max(50)})]);Jd.post("/telemetry/cli-events",async e=>{let t=e.get("userId"),n=L1.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(Du).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)});Jd.get("/telemetry/deployments",async e=>{let t=e.get("userId"),n=await u.execute(C1`
1474
1506
  select
1475
1507
  device_id,
1476
1508
  count(*)::int as event_count,
@@ -1487,7 +1519,7 @@ end`;async function Gs(e){let t=e.req.param("teamId");if(!t||!oo.test(t))return{
1487
1519
  group by device_id
1488
1520
  order by max(created_at) desc
1489
1521
  limit 200
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`
1522
+ `);return e.json({deployments:n})});O();import{Hono as M1}from"hono";import{z as tr}from"zod";var nm=new M1,$1=tr.object({event:tr.string().min(1).max(64),deviceId:tr.string().max(128).optional(),command:tr.string().max(128).optional(),statusCode:tr.number().int().optional(),message:tr.string().max(1e3).optional(),cliVersion:tr.string().max(64).optional(),os:tr.string().max(32).optional(),nodeVersion:tr.string().max(32).optional(),proxied:tr.boolean().optional(),props:tr.record(tr.unknown()).optional()});nm.post("/telemetry/cli-error",async e=>{let t=$1.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(Ou).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 _A}from"hono";import{z as so}from"zod";import{createHash as q1,randomBytes as yA}from"node:crypto";import{and as fA,eq as v_,gt as U1,isNull as H1,lt as B1}from"drizzle-orm";var F1={vscode:"VS Code extension","vscode-insiders":"VS Code Insiders extension",cursor:"Cursor extension",windsurf:"Windsurf extension"},gA="VS Code extension";function W1(e){return e?F1[e]??gA:gA}c(W1,"editorKeyName");var hA=6e4;async function z1(){try{await u.delete(Un).where(B1(Un.expiresAt,new Date))}catch{}}c(z1,"sweepExpiredCodes");setInterval(()=>void z1(),5*6e4).unref?.();var Kd=new _A,V1=so.object({code:so.string().min(1).max(256)}),J1=so.object({refreshToken:so.string().min(1).max(2048)});Kd.post("/auth/extension/refresh",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 nl(n.data.refreshToken);return r.ok?e.json(r.session):e.json({error:r.error},r.status)});Kd.post("/auth/extension/exchange",async e=>{let t=await e.req.json().catch(()=>null),n=V1.safeParse(t);if(!n.success)return e.json({error:"invalid request"},400);let[r]=await u.delete(Un).where(fA(v_(Un.code,n.data.code),U1(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=W1(r.editor),{plaintext:s,hash:i,prefix:a}=G1();try{await u.transaction(async d=>{await d.update(Ae).set({revokedAt:new Date}).where(fA(v_(Ae.userId,r.userId),v_(Ae.name,o),H1(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 rm=new _A,K1=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 G1(){let e=`rm_${yA(32).toString("base64url")}`;return{plaintext:e,hash:q1("sha256").update(e).digest("hex"),prefix:e.slice(0,11)}}c(G1,"generateApiKey");rm.post("/auth/extension/code",async e=>{let t=e.get("userId");if(!t)return e.json({error:"unauthenticated"},401);let n=await e.req.json().catch(()=>null),r=K1.safeParse(n);if(!r.success)return e.json({error:"invalid request"},400);let o=yA(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()+hA)})}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(hA/1e3),sessionStrategy:"api_key"})});ld();import{Hono as Y1}from"hono";var om=new Y1;function X1(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(X1,"formatEmbed");async function Q1(e){if(!e)return null;try{let t=Jn(),{data:n}=await t.auth.admin.getUserById(e);return n.user?.email??null}catch{return null}}c(Q1,"lookupEmail");async function Z1(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(Z1,"postToDiscord");om.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 Q1(o.record?.user_id):null,a=X1(o,i);return a?(await Z1(n,a),e.json({ok:!0})):e.json({ok:!0,skipped:!0})});O();import{Hono as pq}from"hono";import{z as Je}from"zod";import{and as Xd,desc as cm,eq as $r,gte as C_,isNull as mq,sql as fq}from"drizzle-orm";var b_="anthropic",eq=[{limitType:"five_hour_percent",unit:"percentage",displayName:"5-hour window"}],I_=[{limitType:"five_hour_percent",unit:"percentage",displayName:"5-hour window"},{limitType:"seven_day_percent",unit:"percentage",displayName:"Weekly window"}];function tq(e){return typeof e=="object"&&e!==null}c(tq,"isOAuthUsageResponse");function wA(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:b_,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(wA,"parseWindow");function nq(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(nq,"parseResetTime");var E_={id:b_,displayName:"Anthropic (Claude Code)",plans:["unknown","pro","max_5x","max_20x"],limits:{unknown:I_,pro:eq,max_5x:I_,max_20x:I_},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(!tq(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=wA(n.five_hour,"five_hour_percent",o,s,i,r);d&&a.push(d);let l=wA(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=nq(t,e.observedAt);return[{provider:b_,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 A_="codex",S_="chatgpt.com",vA="/backend-api/codex/responses",rq="codex.rate_limits",IA=["primary","secondary"];function oq(e,t){return t!=null?t>=1440?"seven_day_percent":"five_hour_percent":e==="secondary"?"seven_day_percent":"five_hour_percent"}c(oq,"limitTypeForWindow");var Na=[{limitType:"five_hour_percent",unit:"percentage",displayName:"5-hour usage"},{limitType:"seven_day_percent",unit:"percentage",displayName:"7-day usage"}],x_={id:A_,displayName:"Codex CLI (OpenAI)",plans:["unknown","free","plus","pro","team","enterprise"],limits:{unknown:Na,free:Na,plus:Na,pro:Na,team:Na,enterprise:Na},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===S_&&t.startsWith(vA)},parse(e,t){let n;try{n=JSON.parse(e)}catch{return null}if(typeof n!="object"||n===null||n.type!==rq)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 IA){let d=r[a];if(typeof d!="object"||d===null)continue;let l=d,p=l.used_percent??l.used_percentage;if(typeof p!="number"||!isFinite(p))continue;let m=p,_=l.window_minutes,w=typeof _=="number"&&isFinite(_)?_:null,f=oq(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:A_,plan:s,limitType:f,value:m,unit:"percentage",comparator:"=",resetsAt:h,sourceType:"live_stream",sourceUrl:`wss://${S_}${vA}`,sourceEvidence:{wireKey:a,frame:n},confidence:1,observedAt:o})}return i.length===0&&IA.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!==S_?null:[{provider:A_,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 Gd={anthropic:E_,codex:x_};function R_(e){for(let t of Object.values(Gd))if(t.liveSource?.headers?.matchesHost(e))return t}c(R_,"matchLiveHeaders");function T_(e,t){for(let n of Object.values(Gd))if(n.liveSource?.streamFrame?.matches(e,t))return n}c(T_,"matchStreamFrame");var Pue=1440*60*1e3;O();import{and as EA,desc as AA,eq as Yd,gte as cq,sql as dq}from"drizzle-orm";function k_(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(k_,"classifySeverity");function Pa(e){switch(e){case"none":return 0;case"soft":return 1;case"approaching":return 2;case"imminent":return 3;case"hit":return 4}}c(Pa,"severityRank");var sm={soft:"soft warning",approaching:"approaching limit",imminent:"imminent limit",hit:"limit reached"};function sq(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(sq,"formatTimeLeft");function j_(e,t,n,r,o=Date.now()){let s=sq(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 ${sm[e]}. Resets ${s}.`}c(j_,"formatAlertMessage");function N_(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),d=o.map(b=>b.value),l=a.length,p=a.reduce((b,A)=>b+A,0),m=d.reduce((b,A)=>b+A,0),_=a.reduce((b,A,S)=>b+A*d[S],0),w=a.reduce((b,A)=>b+A*A,0),f=l*w-p*p;if(f===0)return null;let h=(l*_-p*m)/f;return h<=0?null:(100-s.value)/h}c(N_,"projectExhaustion");var iq=300*1e3,aq=70;function P_(e){let{proposedSeverity:t,lastDispatch:n,currentUsedPercentage:r,now:o,isFirstTime429:s}=e;if(s)return!0;if(!n)return Pa(t)>0;let i=Pa(t),a=Pa(n.severity);return i>a?!0:o.getTime()-n.lastDispatchedAt.getTime()>=iq?a>=Pa("approaching")&&i===a?!(r>=aq):i>0:!1}c(P_,"shouldDispatch");function D_(e){let t=N_(e.observations,e.now),n=Math.max(0,Math.floor((e.currentResetsAt.getTime()-e.now.getTime())/1e3)),r=k_({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=P_({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(D_,"evaluate");function bA(e,t,n){return`${e}:${t}:${n}`}c(bA,"deriveAlertKey");O();async function Da(e){await un({userId:e.userId,type:`usage_${e.severity}`,title:e.title??`Usage limit \u2014 ${sm[e.severity]}`,body:e.message,url:"/usage",sourceTable:"alert_dispatches",sourceId:e.dispatchId})}c(Da,"notifyFromDispatch");var uq=30*6e4;async function im(e,t){let n=new Date((t.observedAt??new Date).getTime()-uq);try{let o=await u.execute(dq`
1491
1523
  SELECT id, observed_at
1492
1524
  FROM limit_observations
1493
1525
  WHERE user_id = ${e}
@@ -1500,15 +1532,15 @@ end`;async function Gs(e){let t=e.req.param("teamId");if(!t||!oo.test(t))return{
1500
1532
  AND observed_at >= ${n.toISOString()}::timestamptz
1501
1533
  ORDER BY observed_at DESC
1502
1534
  LIMIT 1
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}
1535
+ `);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=bA(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(EA(Yd(ve.userId,e),Yd(ve.provider,t.provider),Yd(ve.limitType,t.limitType),cq(ve.observedAt,i))).orderBy(AA(ve.observedAt)).limit(50),d=await u.select().from(jn).where(EA(Yd(jn.userId,e),Yd(jn.alertKey,o))).orderBy(AA(jn.lastDispatchedAt)).limit(1),l=D_({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:d[0]?{severity:d[0].severity,lastDispatchedAt:d[0].lastDispatchedAt,lastState:d[0].lastState}:null,now:s});if(l.shouldDispatch&&l.severity!=="none"){let p=l.severity,[m]=await u.insert(jn).values({userId:e,alertKey:o,severity:p,lastState:l.payload,channel:"banner"}).returning({id:jn.id});m&&await Da({userId:e,dispatchId:m.id,severity:p,message:j_(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(im,"processObservation");function SA(e,t){return`${e}::${t.provider}::${t.sourceType}::${t.limitType}`}c(SA,"observationKey");function am(){return process.env.OBSERVE_BATCHING!=="0"}c(am,"observeBatchingEnabled");function xA(){let e=Number(process.env.OBSERVE_BATCH_BUFFER_MAX);return Number.isFinite(e)&&e>0?Math.floor(e):5e3}c(xA,"observeBufferMax");function RA(){let e=Number(process.env.PG_POOL_MAX)||3;return Math.max(1,e-1)}c(RA,"defaultConcurrency");function lq(e={}){let t=e.process??((I,b)=>im(I,b)),n=e.maxBuffered??xA(),r=Math.max(1,e.concurrency??RA()),o=new Map,s=0,i=new Set,a=0,d=!1,l=[];function p(){let I=l;l=[];for(let b of I)b()}c(p,"notifyProgress");function m(){for(;a<r;){let I=null,b=null;for(let[A,S]of o)if(!(i.has(A)||S.length===0)){b=S,o.delete(A),I=A;break}if(I==null||b==null)return;s-=b.length,i.add(I),a++,_(I,b)}}c(m,"tick");async function _(I,b){try{for(let A of b)try{await t(A.userId,A.obs)}catch(S){console.warn("[observe-batcher] drain failed for one observation; dropping it:",S instanceof Error?S.message:S)}}finally{a--,i.delete(I),p(),m()}}c(_,"runDrain");function w(I){if(d||s>=n)return!1;let b=SA(I.userId,I.obs),A=o.get(b);return A?A.push(I):o.set(b,[I]),s++,m(),!0}c(w,"push");function f(I){return new Promise(b=>{let A=!1,S=c(()=>{A||(A=!0,clearTimeout(E),b())},"finish"),E=setTimeout(S,I);E.unref?.(),l.push(S)})}c(f,"waitForProgress");async function h(I){let b=I!=null?Date.now()+I:Number.POSITIVE_INFINITY;for(;;){if(m(),s===0&&a===0)return;let A=b-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(lq,"createObserveBatcher");var Zo=null;function O_(){return Zo==null&&(Zo=lq()),Zo}c(O_,"getObserveBatcher");function TA(){O_(),console.log(`[observe-batcher] batched observe ingest ON (bufferMax=${xA()} drainConcurrency=${RA()}; OBSERVE_BATCHING=0 to disable)`)}c(TA,"initObserveBatcher");async function kA(e=5e3){if(Zo==null)return;Zo.stop(),await Zo.flush(e);let t=Zo.size()+Zo.inFlight();t>0&&console.warn(`[observe-batcher] shutdown flush deadline (${e}ms) hit; dropping ~${t} buffered observation(s)`)}c(kA,"shutdownObserveBatcher");var hr=new pq,gq=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})});hr.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,p=R_(s);if(!p?.liveSource?.headers)return e.json({observations:[]});let m={host:s,path:i,plan:l??null,observedAt:d?new Date(d):new Date,userId:t},_=p.liveSource.headers.parse(a,m);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})});hr.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,p=T_(s,i);if(!p?.liveSource?.streamFrame)return e.json({observations:[]});let m={host:s,path:i,plan:l??null,observedAt:d?new Date(d):new Date,userId:t},_=p.liveSource.streamFrame.parse(a,m);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})});hr.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=gq.safeParse(n);if(!r.success)return e.json({error:"Invalid observation",issues:r.error.issues},400);let o=r.data;if(am())return O_().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 im(t,o);return e.json({id:s.id,observedAt:s.observedAt,...s.deduped?{deduped:!0}:{}},s.deduped?200:201)});hr.get("/research/active-limits",async e=>{let t=e.req.query("provider"),n=e.req.query("plan"),r=[mq(tt.effectiveUntil)];t&&r.push($r(tt.provider,t)),n&&r.push($r(tt.plan,n));let o=await u.select().from(tt).where(Xd(...r)).orderBy(tt.provider,tt.plan,tt.limitType,cm(tt.effectiveFrom));return e.json({items:o})});hr.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(C_(Dt.fetchedAt,n)).orderBy(Dt.provider,Dt.docUrl,cm(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())})});hr.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(Xd($r(ve.userId,t),C_(ve.observedAt,r))).orderBy(cm(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),p=Math.max(...d);if(l===0)continue;let m=(p-l)/l*100;m>20&&i.push({provider:a.provider,plan:a.plan,limitType:a.limitType,minValue:l,maxValue:p,spreadPct:m,observations:a.observations})}return i.sort((a,d)=>d.spreadPct-a.spreadPct),e.json({items:i.slice(0,100)})});hr.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(Xd($r(tt.provider,t),$r(tt.plan,n),$r(tt.limitType,r),C_(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)}))})});hr.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(Xd(...a)).orderBy(cm(ve.observedAt)).limit(s).offset(i),[{total:l}]=await u.select({total:fq`count(*)::int`}).from(ve).where(Xd(...a));return e.json({items:d,total:l,limit:s,offset:i})});O();import{Hono as hq}from"hono";import{and as DA,desc as _q,eq as Oa,isNull as yq,ne as wq,sql as es}from"drizzle-orm";var jA={free:.2,pro:1,max_5x:5,max_20x:20},M_=new Set(["free","pro","max_5x","max_20x"]),L_={fiveHourMessages:20,sevenDaySonnetHours:14,sevenDayOpusHours:1.65};function NA(e){let t=jA[e]??jA.max_20x;return{fiveHourMessages:Math.round(L_.fiveHourMessages*t),sevenDaySonnetHours:Math.round(L_.sevenDaySonnetHours*t),sevenDayOpusHours:Math.round(L_.sevenDayOpusHours*t)}}c(NA,"planDefaultCaps");var Qd=new hq,vq=60*1e3,$_=new Map;function Iq(e,t){let n=`${e}::${t}`,r=$_.get(n);if(r&&Date.now()-r.at<vq)return r.rows;let o=u.select({limitType:tt.limitType,value:tt.value,unit:tt.unit}).from(tt).where(DA(Oa(tt.provider,e),Oa(tt.plan,t),yq(tt.effectiveUntil)));return o.catch(()=>$_.delete(n)),$_.set(n,{at:Date.now(),rows:o}),o}c(Iq,"getActivePlanLimits");var PA=["five_hour_percent","seven_day_percent","seven_day_opus_percent"],bq={anthropic:["oauth_usage"],codex:["live_stream","self_observed_429"]};function Eq(e){return bq[e]??["oauth_usage"]}c(Eq,"sourceTypesFor");Qd.get("/usage/current-limits",async e=>{let t=e.get("userId"),n=e.req.query("provider")??"anthropic",r=Eq(n),o=es`user_id = ${t}
1504
1536
  AND provider = ${n}
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`
1537
+ AND source_type IN (${es.join(r.map(a=>es`${a}`),es`, `)})
1538
+ AND limit_type = lt.limit_type`,s=await u.execute(es`
1507
1539
  SELECT lt.limit_type AS limit_type,
1508
1540
  CASE WHEN w.resets_at IS NULL THEN recent.value ELSE win.value END AS value,
1509
1541
  CASE WHEN w.resets_at IS NULL THEN recent.resets_at ELSE win.resets_at END AS resets_at,
1510
1542
  CASE WHEN w.resets_at IS NULL THEN recent.observed_at ELSE win.observed_at END AS observed_at
1511
- FROM (VALUES ${Zo.join(RA.map(a=>Zo`(${a})`),Zo`, `)}) AS lt(limit_type)
1543
+ FROM (VALUES ${es.join(PA.map(a=>es`(${a})`),es`, `)}) AS lt(limit_type)
1512
1544
  LEFT JOIN LATERAL (
1513
1545
  SELECT resets_at
1514
1546
  FROM limit_observations
@@ -1531,27 +1563,27 @@ end`;async function Gs(e){let t=e.req.param("teamId");if(!t||!oo.test(t))return{
1531
1563
  ORDER BY observed_at DESC
1532
1564
  LIMIT 1
1533
1565
  ) recent ON true
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`
1566
+ `),i=new Map;for(let a of s)a.value==null||a.observed_at==null||PA.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})});Qd.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(Oa(R.id,t)),o=r?.source==="manual"&&r.plan&&M_.has(r.plan)?r.plan:null,s=await u.select({plan:ve.plan}).from(ve).where(DA(Oa(ve.userId,t),Oa(ve.provider,n),Oa(ve.sourceType,"oauth_usage"),wq(ve.plan,"unknown"))).orderBy(_q(ve.observedAt)).limit(1),i=s[0]?.plan&&M_.has(s[0].plan)?s[0].plan:null,a=o??i??"max_20x",d=o===null&&i===null,l=NA(a),p=await Iq(n,a);function m(h,v,I){let b=p.filter(A=>A.limitType===h&&v.test(A.unit));return b.length===0?I:Math.max(...b.map(A=>Number(A.value)))}c(m,"bestCap");let _=m("five_hour_messages",/msg|message/i,l.fiveHourMessages),w=m("seven_day_sonnet_hours",/hour|hr/i,l.sevenDaySonnetHours),f=m("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 Aq}from"hono";import{z as _r}from"zod";import{and as OA,desc as MA,eq as Zd,sql as Sq}from"drizzle-orm";var tu=new Aq,CA=30,xq=30,Rq=0,q_=1e3,LA=2e3,U_=2;function eu(e){return e==null?0:typeof e=="number"?e:Number(e)}c(eu,"toNum");function Tq(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(Tq,"ageDays");async function kq(){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(MA(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(kq,"loadActiveRows");tu.get("/pricing/coverage",async e=>{if(!e.get("userId"))return e.json({error:"unauthorized"},401);let n=await u.execute(Sq`
1535
1567
  SELECT model,
1536
1568
  COUNT(*)::int AS events,
1537
1569
  MAX(timestamp) AS last_seen
1538
1570
  FROM session_events
1539
1571
  WHERE model IS NOT NULL
1540
1572
  AND model NOT IN ('unknown', '(null)')
1541
- AND timestamp > now() - (${vq} || ' days')::interval
1573
+ AND timestamp > now() - (${xq} || ' days')::interval
1542
1574
  GROUP BY model
1543
1575
  ORDER BY events DESC
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`
1545
- UPDATE ${Da.raw(e)} AS m
1576
+ `),r=await kq(),o=[],s=[],i=0;for(let a of n){let d=a.model,l=Ho(d),p=r.get(`${l}::${d}`);if(!p){o.push({provider:l,modelId:d,events:a.events,lastSeen:String(a.last_seen)});continue}let m=Tq(p.verifiedAt??p.effectiveFrom);m===null||m>CA?s.push({provider:l,modelId:d,events:a.events,verifiedAt:p.verifiedAt?String(p.verifiedAt):null,ageDays:m===null?null:Math.round(m),currentInput:eu(p.inputPerM),currentOutput:eu(p.outputPerM)}):i+=1}return e.json({staleDays:CA,capturedModels:n.length,pricedFresh:i,unpriced:o,stale:s})});var jq=_r.object({provider:_r.string().min(1).optional(),modelId:_r.string().min(1),inputPerM:_r.number(),outputPerM:_r.number(),cacheReadPerM:_r.number().optional(),cacheWrite5mPerM:_r.number().optional(),cacheWrite1hPerM:_r.number().optional(),contextWindow:_r.number().int().positive().nullable().optional(),sourceUrl:_r.string().url(),effectiveFrom:_r.string().datetime().optional()});tu.post("/pricing/rates",async e=>{if(!e.get("userId"))return e.json({error:"unauthorized"},401);let n=jq.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??Ho(r.modelId),s=c((f,h)=>f>Rq&&f<=h,"inRange");if(!s(r.inputPerM,q_)||!s(r.outputPerM,q_))return e.json({status:"rejected",reason:`input/output out of range (0, ${q_}]`},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>LA)return e.json({status:"rejected",reason:`${f} out of range [0, ${LA}]`},422);let p=(await u.select().from(st).where(OA(Zd(st.provider,o),Zd(st.modelId,r.modelId))).orderBy(MA(st.effectiveFrom)).limit(1))[0],m=1e-9;if(p){let f=eu(p.inputPerM),h=eu(p.outputPerM),v=c((S,E)=>E<=0?1/0:S/E,"ratio"),I=Math.max(v(r.inputPerM,f),v(f,r.inputPerM)),b=Math.max(v(r.outputPerM,h),v(h,r.outputPerM));if(I>U_||b>U_)return e.json({status:"flagged",reason:`new rate differs from current by more than ${U_}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)<m&&Math.abs(h-r.outputPerM)<m&&Math.abs(eu(p.cacheReadPerM)-i)<m)return await u.update(st).set({verifiedAt:new Date}).where(OA(Zd(st.provider,o),Zd(st.modelId,r.modelId),Zd(st.effectiveFrom,p.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 Nq}from"hono";import{desc as Pq,eq as Dq}from"drizzle-orm";var dm=new Nq;dm.get("/alerts/recent",async e=>{let t=e.get("userId"),n=await u.select().from(jn).where(Dq(jn.userId,t)).orderBy(Pq(jn.lastDispatchedAt)).limit(20);return e.json({items:n})});O();import{Hono as Oq}from"hono";import{randomUUID as Cq}from"node:crypto";import{sql as Ca}from"drizzle-orm";var um=new Oq,UA=300,$A=3e4,Lq=6e4,Mq=1e3,H_={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"},$q=["session_send_jobs","launch_jobs","eval_jobs","insights_jobs","agent_jobs"];async function qq(e,t,n,r){if(n.length===0)return null;let o=Ca.join(n.map(i=>Ca`${i}`),Ca`, `),s=await u.execute(Ca`
1577
+ UPDATE ${Ca.raw(e)} AS m
1546
1578
  SET status = 'claimed',
1547
1579
  claimed_by = ${r},
1548
1580
  claimed_at = now(),
1549
- lease_expires_at = now() + (${CA}::int * interval '1 second'),
1581
+ lease_expires_at = now() + (${UA}::int * interval '1 second'),
1550
1582
  attempts = m.attempts + 1,
1551
1583
  updated_at = now()
1552
1584
  FROM (
1553
1585
  SELECT id
1554
- FROM ${Da.raw(e)}
1586
+ FROM ${Ca.raw(e)}
1555
1587
  WHERE user_id = ${t}
1556
1588
  AND status = 'pending'
1557
1589
  AND task_kind IN (${o})
@@ -1562,7 +1594,7 @@ end`;async function Gs(e){let t=e.req.param("teamId");if(!t||!oo.test(t))return{
1562
1594
  ) AS picked
1563
1595
  WHERE m.id = picked.id
1564
1596
  RETURNING m.id, m.task_kind, m.payload, m.attempts
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`
1597
+ `);return s.length>0?s[0]:null}c(qq,"claimOne");async function Uq(e,t,n){let r={};for(let o of t){let s=H_[o];s&&(r[s]??=[]).push(o)}for(let o of $q){let s=r[o];if(!s)continue;let i=await qq(o,e,s,n);if(i)return{job:i,table:o}}return null}c(Uq,"tryClaimAcrossTables");var Hq={cron_suggest_instructions:[0,7,37]};function Bq(e){let t=/rulemetric-cli\/(\d+)\.(\d+)\.(\d+)/.exec(e??"");return t?[Number(t[1]),Number(t[2]),Number(t[3])]:null}c(Bq,"parseCliVersion");function Fq(e,t){return e[0]!==t[0]?e[0]>t[0]:e[1]!==t[1]?e[1]>t[1]:e[2]>=t[2]}c(Fq,"versionAtLeast");function Wq(e,t){let n=Bq(t),r=[],o=[];for(let s of e){let i=Hq[s];i&&(!n||!Fq(n,i))?o.push(s):r.push(s)}return{allowed:r,fenced:o}}c(Wq,"fenceCapabilities");var qA=new Set;um.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 H_),{allowed:o,fenced:s}=Wq(r,e.req.header("user-agent"));if(s.length>0&&!qA.has(t)&&(qA.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(H_).join(", ")},400);if(o.length===0)return e.body(null,204);let i=Number.parseInt(e.req.query("waitMs")??`${$A}`,10),a=Number.isFinite(i)?Math.max(0,Math.min(i,Lq)):$A,d=Cq(),l=Date.now()+a;for(;;){let p=await Uq(t,o,d);if(p)return e.json({id:p.job.id,kind:p.job.task_kind,payload:p.job.payload,attempts:p.job.attempts,leaseToken:d,leaseDurationSeconds:UA,table:p.table});if(Date.now()>=l)break;await new Promise(m=>setTimeout(m,Mq))}return e.body(null,204)});O();import{Hono as Jq}from"hono";import{z as nu}from"zod";import{sql as io}from"drizzle-orm";O();import{eq as qr,and as B_}from"drizzle-orm";var zq=c(e=>`${(e*100).toFixed(1)}pp`,"pct"),Vq=c(e=>`${(e/6e4).toFixed(0)} min`,"mins");function HA(e){let{targetName:t,evalTargetId:n,status:r,result:o,error:s}=e,i=t.split("/").pop()||t,a=`/eval-targets/${n}`;if(r==="failed")return{type:"evolution_failed",title:`Evolution cycle crashed \u2014 ${i}`,body:s?.slice(0,400)||"The job failed without recording a reason.",url:a,metadata:{evalTargetId:n,outcome:"crashed"}};if(!o)return null;if(o.skipped==="infrastructure-incomplete"||o.skipped==="quota-exhausted"){let m=o.cost?.modelCalls;return{type:"evolution_blocked",title:`Evolution stopped by the environment \u2014 ${i}`,body:`${o.reason??o.skipped}`+(m?` (${m} model call(s) spent before stopping)`:"")+" This is not a verdict about the instruction.",url:a,metadata:{evalTargetId:n,outcome:o.skipped,reason:o.reason,cost:o.cost}}}if(o.skipped||!o.decision)return null;let d=o.nPairs??o.cost?.usablePairs,l=[];if(d!=null){let m=o.cost?.plannedPairs;l.push(`${d}${m?`/${m}`:""} paired task(s)`)}typeof o.cost?.mde=="number"&&l.push(`resolves \xB1${zq(o.cost.mde)}`),o.cost?.modelCalls&&l.push(`${o.cost.modelCalls} model calls`),o.cost?.wallMs&&l.push(Vq(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:d??null,promotionId:o.promotionId??null,cost:o.cost??null}}}c(HA,"buildEvolutionNotification");async function BA(e,t,n,r){try{let[o]=await u.select({evalTargetId:Ne.evalTargetId,config:Ne.config}).from(Ne).where(B_(qr(Ne.id,t),qr(Ne.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 Ad(e,o.evalTargetId))}catch(o){console.error("[job-notifications] eval notify failed:",o instanceof Error?o.stack:o)}}c(BA,"notifyEvalTerminal");async function FA(e,t,n,r){try{let[o]=await u.select({projectPath:z.projectPath}).from(z).where(B_(qr(z.id,t),qr(z.userId,e)));if(!o)return;let s=null,i;if(o.projectPath){let[p]=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);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),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(FA,"notifyInsightsTerminal");async function WA(e,t,n,r){try{let[o]=await u.select({payload:Pe.payload,result:Pe.result}).from(Pe).where(B_(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=HA({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(WA,"notifyEvolutionTerminal");async function VA(e,t,n,r,o){e==="process_eval"?await BA(t,n,r,o):e==="process_insights"?await FA(t,n,r,o):e==="cron_instruction_evolution"&&await WA(t,n,r,o)}c(VA,"notifyTerminal");var La=new Jq,zA=300,F_={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},Kq=["session_send_jobs","launch_jobs","eval_jobs","insights_jobs","agent_jobs"];async function W_(e,t,n){for(let r of Kq){let o=await u.execute(io`
1566
1598
  SELECT status, attempts, task_kind
1567
1599
  FROM ${io.raw(r)}
1568
1600
  WHERE id = ${e}
@@ -1570,14 +1602,14 @@ end`;async function Gs(e){let t=e.req.param("teamId");if(!t||!oo.test(t))return{
1570
1602
  AND claimed_by = ${n}
1571
1603
  AND status IN ('claimed', 'running')
1572
1604
  LIMIT 1
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`
1605
+ `);if(o.length>0)return{table:r,status:o[0].status,attempts:o[0].attempts,taskKind:o[0].task_kind}}return null}c(W_,"locateRow");var Gq=nu.object({result:nu.unknown().optional()}),Yq=nu.object({error:nu.string().min(1).max(8192),terminal:nu.boolean().optional().default(!1)});La.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 W_(n,t,o);return s?(await u.execute(io`
1574
1606
  UPDATE ${io.raw(s.table)}
1575
- SET lease_expires_at = now() + (${UA}::int * interval '1 second'),
1607
+ SET lease_expires_at = now() + (${zA}::int * interval '1 second'),
1576
1608
  updated_at = now()
1577
1609
  WHERE id = ${n}
1578
1610
  AND claimed_by = ${o}
1579
1611
  AND status IN ('claimed', 'running')
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`
1612
+ `),e.json({ok:!0,leaseDurationSeconds:zA})):e.json({error:"job not found or lease lost"},404)});La.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=Gq.safeParse(r);if(!s.success)return e.json({error:s.error.format()},400);let i=await W_(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
1613
  UPDATE ${io.raw(i.table)}
1582
1614
  SET status = 'completed',
1583
1615
  result = ${a}::jsonb,
@@ -1589,7 +1621,7 @@ end`;async function Gs(e){let t=e.req.param("teamId");if(!t||!oo.test(t))return{
1589
1621
  WHERE id = ${n}
1590
1622
  AND claimed_by = ${o}
1591
1623
  AND status IN ('claimed', 'running')
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`
1624
+ `),await VA(i.taskKind,t,n,"completed"),e.json({ok:!0})});La.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=Yq.safeParse(r);if(!s.success)return e.json({error:s.error.format()},400);let i=await W_(n,t,o);if(!i)return e.json({error:"job not found or lease lost"},404);let a=F_[i.taskKind]??3,d=s.data.terminal||i.attempts>=a,l=d?"failed":"pending";return await u.execute(io`
1593
1625
  UPDATE ${io.raw(i.table)}
1594
1626
  SET status = ${l},
1595
1627
  error = ${s.data.error},
@@ -1601,12 +1633,12 @@ end`;async function Gs(e){let t=e.req.param("teamId");if(!t||!oo.test(t))return{
1601
1633
  WHERE id = ${n}
1602
1634
  AND claimed_by = ${o}
1603
1635
  AND status IN ('claimed', 'running')
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`
1636
+ `),d&&await VA(i.taskKind,t,n,"failed",s.data.error),e.json({ok:!0,requeued:!d,attempts:i.attempts})});O();import{Hono as sU}from"hono";import{z as ts}from"zod";import{and as QA,desc as iU,eq as ao,isNotNull as aU,sql as ZA}from"drizzle-orm";O();import{and as Xq,asc as Qq,eq as Ur,gt as Zq,isNotNull as eU,sql as tU}from"drizzle-orm";var JA=100,KA=10,lm=new Set;function GA(e){return lm.has(e)}c(GA,"isAnnouncementSendInFlight");async function YA(e,t={}){let n=t.db??u,r=t.sendEmail??Gp,o=t.log??(i=>process.stderr.write(`[announcement-sender] ${i}
1637
+ `)),s=t.webBaseUrl??process.env.RULEMETRIC_WEB_URL??process.env.WEB_URL??"https://rulemetric.com";if(lm.has(e))throw new Error(`Announcement ${e} send already in flight`);lm.add(e);try{return await nU({announcementId:e,db:n,sendEmail:r,log:o,webBaseUrl:s})}finally{lm.delete(e)}}c(YA,"sendAnnouncement");async function nU(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,p=0,m=null;try{for(;;){let b=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(Xq(Ur(kt.productAnnouncements,!0),eU(R.email),m?Zq(kt.userId,m):void 0)).orderBy(Qq(kt.userId)).limit(JA);if(b.length===0)break;m=b[b.length-1].userId;for(let A=0;A<b.length;A+=KA){let S=b.slice(A,A+KA),E=await Promise.allSettled(S.map(T=>oU({recipient:T,announcement:i,webBaseUrl:s,sendEmail:r,db:n})));for(let T=0;T<E.length;T++){let P=E[T];if(P.status==="fulfilled")P.value.ok==="sent"?a++:P.value.ok==="skipped"?l++:(d++,P.value.provider==="noop"&&p++,o(` recipient ${S[T].userId}: send failed \u2014 ${P.value.error}`));else{d++;let H=P.reason instanceof Error?P.reason.message:String(P.reason);o(` recipient ${S[T].userId}: send failed \u2014 ${H}`)}}}if(b.length<JA)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:Tt.status,count:tU`count(*)::int`}).from(Tt).where(Ur(Tt.announcementId,t)).groupBy(Tt.status),w={};for(let b of _)w[b.status]=b.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(nU,"runSend");function rU(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}c(rU,"escapeHtml");async function oU(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),p=`${d}/unsubscribe/${l}`,m=t.displayName?.trim().split(/\s+/)[0]||"there",_=n.htmlBody.replaceAll("{{unsubscribe_url}}",p).replaceAll("{{recipient_name}}",rU(m)),w=n.textBody.replaceAll("{{unsubscribe_url}}",p).replaceAll("{{recipient_name}}",m);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(oU,"sendOne");var Hr=new sU;Hr.use("/announcements/*",Vd());Hr.use("/announcements",Vd());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(iU($e.createdAt));return e.json({announcements:t})});Hr.get("/announcements/:id",async e=>{let t=e.req.param("id");if(!ts.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:ZA`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(!ts.string().uuid().safeParse(t).success)return e.json({error:"Invalid id",code:"VALIDATION_ERROR"},400);let n=await cU();return e.json({count:n})});async function cU(){let[e]=await u.select({count:ZA`count(*)::int`}).from(kt).innerJoin(R,ao(R.id,kt.userId)).where(QA(ao(kt.productAnnouncements,!0),aU(R.email)));return e?.count??0}c(cU,"countOptedInRecipients");var XA=c(e=>e.includes("{{unsubscribe_url}}"),"hasUnsubscribePlaceholder"),dU=ts.object({subject:ts.string().min(1).max(500).optional(),htmlBody:ts.string().min(1).refine(XA,{message:"htmlBody must contain the {{unsubscribe_url}} placeholder"}).optional(),textBody:ts.string().min(1).refine(XA,{message:"textBody must contain the {{unsubscribe_url}} placeholder"}).optional()});Hr.patch("/announcements/:id",async e=>{let t=e.req.param("id");if(!ts.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=dU.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(!ts.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(QA(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")&&!GA(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 YA(n).catch(i=>{process.stderr.write(`[announcements] send loop for ${n} failed: ${i instanceof Error?i.message:String(i)}
1638
+ `)}),e.json({processing:!0,resumed:s,announcement:o},202)});O();import{Hono as uU}from"hono";import{inArray as tS,sql as eS}from"drizzle-orm";var ru=new uU;function nS(e){let t;try{t=decodeURIComponent(e)}catch{return[]}let n=t.replace(/=+$/,"").replaceAll("+","-").replaceAll("/","_");return t===n?[t]:[t,n]}c(nS,"tokenCandidates");ru.get("/:token",async e=>{let t=e.req.param("token");if(!t||t.length<8)return e.json({error:"invalid_token"},404);let n=nS(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(tS(kt.unsubscribeToken,n)).limit(1);return r?e.json({valid:!0,alreadyUnsubscribed:r.productAnnouncements===!1}):e.json({error:"invalid_token"},404)});ru.post("/:token",async e=>{let t=e.req.param("token");if(!t||t.length<8)return e.json({error:"invalid_token"},404);let n=nS(t);return n.length===0?e.json({error:"invalid_token"},404):(await u.update(kt).set({productAnnouncements:!1,unsubscribedAt:eS`now()`,updatedAt:eS`now()`}).where(tS(kt.unsubscribeToken,n)).returning({userId:kt.userId})).length===0?e.json({error:"invalid_token"},404):e.json({ok:!0})});O();import{createHash as lU}from"node:crypto";async function rS(){let e=[],t=0,n=0,r=0;for(let[o,s]of Object.entries(Gd)){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=lU("sha256").update(d).digest("hex"),p=!0,m=[],_=null;try{m=i.parse(d)}catch(h){p=!1,_=h instanceof Error?h.message:String(h)}if((await u.insert(Dt).values({provider:o,docUrl:i.url,contentHash:l,content:d,parseSuccess:p,parseErrors:_?[_]:null}).onConflictDoNothing({target:[Dt.provider,Dt.docUrl,Dt.contentHash]}).returning({id:Dt.id})).length===1&&p){for(let h of m)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(rS,"scrapeProviderDocs");var pU=360*60*1e3,oS=!1;function sS(){if(oS)return{stop:c(()=>{},"stop")};oS=!0;let e=setTimeout(()=>{rS().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(()=>{rS().then(n=>{n.errors.length>0&&console.warn("[research] scrape completed with errors:",n)}).catch(n=>console.warn("[research] scrape failed:",n))},pU);return{stop:c(()=>{clearTimeout(e),clearInterval(t)},"stop")}}c(sS,"startScrapeInterval");var K=new gU,wU=process.env.ALLOWED_ORIGINS?.split(",")??["http://localhost:5174","http://localhost:5175"];K.use("*",hU({origin:c(e=>e?wU.includes(e)?e:"":"*","origin"),allowMethods:["GET","POST","PUT","PATCH","DELETE","OPTIONS"],allowHeaders:["Authorization","Content-Type"],credentials:!0}));K.use("*",xm());K.use("*",Sv());K.use("/api/*",_U({maxSize:10*1024*1024}));K.use("*",Av);K.use("/auth/login",jc(900*1e3,10));var dS=jc(60*1e3,10);K.use("/api/auth/api-keys",dS);K.use("/api/auth/api-keys/*",dS);K.use("/api/invitations/*",jc(60*1e3,30));K.use("/api/telemetry/cli-error",jc(60*1e3,60));K.route("/",Ii);K.route("/api",ol);K.route("/",wi);K.route("/",Kd);K.route("/api",rl);K.route("/api",nm);K.route("/",om);K.use("/api/*",vv);K.use("/api/*",bv);K.use("/api/sessions/:id/context-snapshots",Pc);K.use("/api/sessions/:id/events",Pc);K.use("/api/sessions/import",Pc);K.use("/api/internal/research/observe",Pc);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():_v(e,t)});K.route("/api",Nn);K.route("/api",qc);K.route("/api",Uc);K.route("/api",Hc);K.route("/api",Wc);K.route("/api",fl);K.route("/api",Ro);K.route("/api",Oo);K.route("/api",yd);K.route("/api",Tr);K.route("/api",pp);K.route("/api",sa);K.route("/api",bd);K.route("/api",wp);K.route("/api",Gn);K.route("/api",Ep);K.route("/api",Mo);K.route("/api",aa);K.route("/api",Cs);K.route("/api",ua);K.route("/api",Ls);K.route("/api",la);K.route("/api",Zr);K.route("/api",$s);K.route("/api",ha);K.route("/api",qo);K.route("/api",jp);K.route("/api",Xn);K.route("/api",En);K.route("/api",Ia);K.route("/api",ro);K.route("/api",zo);K.route("/api",Dd);K.route("/api",Aa);K.route("/api",Vo);K.route("/api",Cr);K.route("/api",Ks);K.route("/api",Xo);K.route("/api/invitations",Bd);K.route("/api",zd);K.route("/api",An);K.route("/api",tm);K.route("/api",Jd);K.route("/api",hr);K.route("/api",Qd);K.route("/api",tu);K.route("/api",dm);K.route("/api",um);K.route("/api",La);K.route("/api",Hr);K.route("/api/unsubscribe",ru);K.route("/api",rm);var vU=setTimeout(()=>{Hp().catch(()=>{})},5e3),IU=sS(),uS=[{stop:c(()=>clearTimeout(vU),"stop")},IU],bU=Ma.dirname(fU(import.meta.url)),z_=process.env.WEB_DIST_PATH??Ma.resolve(bU,"../../../apps/web/dist");if(ou.existsSync(z_)){let e=c(async t=>{let n=Ma.join(z_,"index.html");if(!ou.existsSync(n))return t.notFound();let{stampRuntimeConfig:r}=await Promise.resolve().then(()=>(cS(),aS));return t.html(r(ou.readFileSync(n,"utf-8")))},"serveIndex");K.get("/",e),K.get("/index.html",e),K.use("/*",yU({root:z_,rewriteRequestPath:c(t=>t,"rewriteRequestPath")})),K.get("*",e)}K.onError(yv);O();import{sql as Br}from"drizzle-orm";var EU=300*1e3,AU="reconciler: lease expired with attempts exhausted \u2014 agent likely crashed mid-run",SU="reconciler: in-flight row had no lease and attempts were exhausted \u2014 unclaimable and unswept until recovered",$a=1,xU=["eval_jobs","insights_jobs","launch_jobs","session_send_jobs","agent_jobs"];function qa(){return Br.join(Object.entries(F_).map(([e,t])=>Br`WHEN ${e} THEN ${t}::int`),Br` `)}c(qa,"maxAttemptsCase");async function RU(e){let t=await u.execute(Br`
1607
1639
  UPDATE ${Br.raw(e)}
1608
1640
  SET status = 'failed',
1609
- error = ${yU},
1641
+ error = ${AU},
1610
1642
  completed_at = now(),
1611
1643
  claimed_by = NULL,
1612
1644
  claimed_at = NULL,
@@ -1615,8 +1647,8 @@ end`;async function Gs(e){let t=e.req.param("teamId");if(!t||!oo.test(t))return{
1615
1647
  WHERE status IN ('claimed', 'running')
1616
1648
  AND claimed_by IS NOT NULL
1617
1649
  AND lease_expires_at < now()
1618
- AND attempts >= (CASE task_kind ${Ma()} ELSE 3 END)
1619
- AND lease_recoveries >= ${La}
1650
+ AND attempts >= (CASE task_kind ${qa()} ELSE 3 END)
1651
+ AND lease_recoveries >= ${$a}
1620
1652
  RETURNING id
1621
1653
  `),n=await u.execute(Br`
1622
1654
  UPDATE ${Br.raw(e)}
@@ -1634,28 +1666,28 @@ end`;async function Gs(e){let t=e.req.param("teamId");if(!t||!oo.test(t))return{
1634
1666
  `),r=await u.execute(Br`
1635
1667
  UPDATE ${Br.raw(e)}
1636
1668
  SET status = CASE
1637
- WHEN attempts >= (CASE task_kind ${Ma()} ELSE 3 END)
1638
- AND lease_recoveries >= ${La} THEN 'failed'
1669
+ WHEN attempts >= (CASE task_kind ${qa()} ELSE 3 END)
1670
+ AND lease_recoveries >= ${$a} THEN 'failed'
1639
1671
  ELSE 'pending'
1640
1672
  END,
1641
1673
  attempts = CASE
1642
- WHEN attempts >= (CASE task_kind ${Ma()} ELSE 3 END)
1643
- AND lease_recoveries >= ${La} THEN attempts
1674
+ WHEN attempts >= (CASE task_kind ${qa()} ELSE 3 END)
1675
+ AND lease_recoveries >= ${$a} THEN attempts
1644
1676
  ELSE GREATEST(attempts - 1, 0)
1645
1677
  END,
1646
1678
  lease_recoveries = CASE
1647
- WHEN attempts >= (CASE task_kind ${Ma()} ELSE 3 END)
1648
- AND lease_recoveries >= ${La} THEN lease_recoveries
1679
+ WHEN attempts >= (CASE task_kind ${qa()} ELSE 3 END)
1680
+ AND lease_recoveries >= ${$a} THEN lease_recoveries
1649
1681
  ELSE lease_recoveries + 1
1650
1682
  END,
1651
1683
  error = CASE
1652
- WHEN attempts >= (CASE task_kind ${Ma()} ELSE 3 END)
1653
- AND lease_recoveries >= ${La} THEN ${wU}
1684
+ WHEN attempts >= (CASE task_kind ${qa()} ELSE 3 END)
1685
+ AND lease_recoveries >= ${$a} THEN ${SU}
1654
1686
  ELSE error
1655
1687
  END,
1656
1688
  completed_at = CASE
1657
- WHEN attempts >= (CASE task_kind ${Ma()} ELSE 3 END)
1658
- AND lease_recoveries >= ${La} THEN now()
1689
+ WHEN attempts >= (CASE task_kind ${qa()} ELSE 3 END)
1690
+ AND lease_recoveries >= ${$a} THEN now()
1659
1691
  ELSE completed_at
1660
1692
  END,
1661
1693
  claimed_at = NULL,
@@ -1665,7 +1697,7 @@ end`;async function Gs(e){let t=e.req.param("teamId");if(!t||!oo.test(t))return{
1665
1697
  AND claimed_by IS NULL
1666
1698
  AND updated_at < now() - interval '15 minutes'
1667
1699
  RETURNING id
1668
- `);return t.length+n.length+r.length}c(IU,"reclaimExpiredLeases");async function bU(){return(await u.execute(Br`
1700
+ `);return t.length+n.length+r.length}c(RU,"reclaimExpiredLeases");async function TU(){return(await u.execute(Br`
1669
1701
  UPDATE memory_experiments me
1670
1702
  SET status = 'failed',
1671
1703
  error = 'reconciler: worker died mid-experiment (backing job terminal, row left running)',
@@ -1678,12 +1710,12 @@ end`;async function Gs(e){let t=e.req.param("teamId");if(!t||!oo.test(t))return{
1678
1710
  AND aj.status IN ('failed', 'completed')
1679
1711
  )
1680
1712
  RETURNING me.id
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`
1713
+ `)).length}c(TU,"failStrandedMemoryExperiments");function lS(){let e=setTimeout(()=>{n()},3e4),t=setInterval(()=>{n()},EU);async function n(){try{let r=[];for(let o of xU)try{let s=await RU(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 TU();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(lS,"startReconciler");O();import{and as jU,eq as J_,sql as pm}from"drizzle-orm";O();import{and as pS,eq as V_,inArray as kU,sql as mS}from"drizzle-orm";async function fS(e,t){let n=new Map;if(t.length===0)return n;let r=t.map(m=>m.id),o=new Map(t.map(m=>[m.id,m.version])),i=(await u.select({id:y.id,projectId:y.projectId,outcome:mS`${y.analysis}->>'outcome'`}).from(y).where(pS(V_(y.userId,e),mS`${y.analysis} is not null`)).orderBy(y.id)).map(m=>({id:m.id,key:m.projectId??"(no-project)",score:vs(m.outcome)})).filter(m=>m.score!=null),a=await u.select({sessionId:ne.sessionId,treatmentId:ne.treatmentId,treatmentVersion:ne.treatmentVersion}).from(ne).where(pS(V_(ne.userId,e),V_(ne.treatmentType,"memory"),kU(ne.treatmentId,r))),d=new Map,l=new Map;for(let m of a){let _=m.treatmentVersion===o.get(m.treatmentId)?d:l,w=_.get(m.treatmentId);w||(w=new Set,_.set(m.treatmentId,w)),w.add(m.sessionId)}let p=c(m=>{let _=d.get(m);if(!_||_.size===0)return"insufficient";let w=l.get(m),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 ws(Dn([...f.values()],{iterations:1e3}))},"effectOf");for(let m of t)n.set(m.id,p(m.id));return n}c(fS,"computeTrustClasses");var NU=1800*1e3;async function PU(e,t){if(t.length===0)return;let n=pm.join(t.map(r=>pm`(${r.id}::uuid, ${r.trustClass}::text, ${r.version}::int)`),pm`, `);await u.execute(pm`
1682
1714
  update memories m
1683
1715
  set trust_class = v.cls, trust_version = v.ver, trust_computed_at = now()
1684
1716
  from (values ${n}) as v(id, cls, ver)
1685
1717
  where m.id = v.id and m.user_id = ${e}
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`
1718
+ `)}c(PU,"applyMaterializedTrust");async function DU(e){let t=await u.select({id:W.id,version:W.version}).from(W).where(jU(J_(W.userId,e),J_(W.status,"active")));if(t.length===0)return 0;let n=await fS(e,t),r=t.map(o=>({id:o.id,trustClass:n.get(o.id)??"insufficient",version:o.version}));return await PU(e,r),r.length}c(DU,"refreshMemoryTrustForUser");async function OU(){let e=await u.selectDistinct({userId:W.userId}).from(W).where(J_(W.status,"active")),t=0;for(let{userId:n}of e)try{t+=await DU(n)}catch(r){console.error(`[memory-trust-refresh] user ${n} failed:`,r instanceof Error?r.stack:r)}return{users:e.length,memories:t}}c(OU,"refreshAllMemoryTrust");function gS(){let e=setTimeout(()=>void n(),45e3),t=setInterval(()=>void n(),NU);async function n(){try{let{users:r,memories:o}=await OU();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(gS,"startMemoryTrustRefresh");O();import{sql as CU}from"drizzle-orm";var LU=30*6e4,hS=24,MU=6,_S="pipeline:usage_observations_stale";async function $U(){let e=await u.execute(CU`
1687
1719
  WITH active_users AS (
1688
1720
  SELECT user_id, count(*) AS sessions_24h
1689
1721
  FROM sessions
@@ -1714,13 +1746,13 @@ end`;async function Gs(e){let t=e.req.param("teamId");if(!t||!oo.test(t))return{
1714
1746
  LEFT JOIN latest_obs o ON o.user_id = a.user_id
1715
1747
  LEFT JOIN first_seen f ON f.user_id = a.user_id
1716
1748
  WHERE (o.last_observed IS NULL
1717
- AND f.first_session < now() - make_interval(hours => ${lS}))
1718
- OR o.last_observed < now() - make_interval(hours => ${lS})
1749
+ AND f.first_session < now() - make_interval(hours => ${hS}))
1750
+ OR o.last_observed < now() - make_interval(hours => ${hS})
1719
1751
  )
1720
1752
  INSERT INTO alert_dispatches (user_id, alert_key, severity, channel, last_state)
1721
1753
  SELECT
1722
1754
  s.user_id,
1723
- ${mS},
1755
+ ${_S},
1724
1756
  'soft',
1725
1757
  'in_app',
1726
1758
  jsonb_build_object(
@@ -1737,11 +1769,11 @@ end`;async function Gs(e){let t=e.req.param("teamId");if(!t||!oo.test(t))return{
1737
1769
  WHERE NOT EXISTS (
1738
1770
  SELECT 1 FROM alert_dispatches d
1739
1771
  WHERE d.user_id = s.user_id
1740
- AND d.alert_key = ${mS}
1741
- AND d.last_dispatched_at > now() - make_interval(hours => ${jU})
1772
+ AND d.alert_key = ${_S}
1773
+ AND d.last_dispatched_at > now() - make_interval(hours => ${MU})
1742
1774
  )
1743
1775
  RETURNING user_id, id, last_state->>'message' AS message
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`
1776
+ `);e.length>0&&console.log(`[usage-staleness] dispatched stale-pipeline alert for ${e.length} user(s)`);for(let t of e)try{await Da({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($U,"checkUsageStalenessOnce");function yS(){let e=setTimeout(()=>{n()},6e4),t=setInterval(()=>{n()},LU);async function n(){try{await $U()}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(yS,"startUsageStalenessChecker");O();import{sql as qU}from"drizzle-orm";var UU=30*6e4,mm=24,HU=6,wS="pipeline:session_capture_stale";async function BU(){let e=await u.execute(qU`
1745
1777
  WITH active_users AS (
1746
1778
  SELECT user_id, max(last_seen) AS last_observed,
1747
1779
  array_agg(DISTINCT signal) AS signals
@@ -1751,13 +1783,13 @@ end`;async function Gs(e){let t=e.req.param("teamId");if(!t||!oo.test(t))return{
1751
1783
  FROM limit_observations
1752
1784
  WHERE source_type = 'oauth_usage'
1753
1785
  AND user_id IS NOT NULL
1754
- AND observed_at > now() - make_interval(hours => ${up})
1786
+ AND observed_at > now() - make_interval(hours => ${mm})
1755
1787
  GROUP BY user_id
1756
1788
  UNION ALL
1757
1789
  SELECT user_id, max(last_heartbeat), 'worker heartbeat'
1758
1790
  FROM worker_connections
1759
1791
  WHERE worker_type = 'cli-worker'
1760
- AND last_heartbeat > now() - make_interval(hours => ${up})
1792
+ AND last_heartbeat > now() - make_interval(hours => ${mm})
1761
1793
  GROUP BY user_id
1762
1794
  UNION ALL
1763
1795
  -- Beacons are unauthenticated (no user_id); attribute via the most
@@ -1773,7 +1805,7 @@ end`;async function Gs(e){let t=e.req.param("teamId");if(!t||!oo.test(t))return{
1773
1805
  ) owner ON true
1774
1806
  WHERE e.event = 'hook_capture_failed'
1775
1807
  AND e.device_id IS NOT NULL
1776
- AND e.created_at > now() - make_interval(hours => ${up})
1808
+ AND e.created_at > now() - make_interval(hours => ${mm})
1777
1809
  GROUP BY owner.user_id
1778
1810
  ) signal_union
1779
1811
  GROUP BY user_id
@@ -1792,12 +1824,12 @@ end`;async function Gs(e){let t=e.req.param("teamId");if(!t||!oo.test(t))return{
1792
1824
  FROM active_users a
1793
1825
  LEFT JOIN latest_session s ON s.user_id = a.user_id
1794
1826
  WHERE s.last_session IS NULL
1795
- OR s.last_session < now() - make_interval(hours => ${up})
1827
+ OR s.last_session < now() - make_interval(hours => ${mm})
1796
1828
  )
1797
1829
  INSERT INTO alert_dispatches (user_id, alert_key, severity, channel, last_state)
1798
1830
  SELECT
1799
1831
  s.user_id,
1800
- ${fS},
1832
+ ${wS},
1801
1833
  'soft',
1802
1834
  'in_app',
1803
1835
  jsonb_build_object(
@@ -1816,11 +1848,11 @@ end`;async function Gs(e){let t=e.req.param("teamId");if(!t||!oo.test(t))return{
1816
1848
  WHERE NOT EXISTS (
1817
1849
  SELECT 1 FROM alert_dispatches d
1818
1850
  WHERE d.user_id = s.user_id
1819
- AND d.alert_key = ${fS}
1820
- AND d.last_dispatched_at > now() - make_interval(hours => ${CU})
1851
+ AND d.alert_key = ${wS}
1852
+ AND d.last_dispatched_at > now() - make_interval(hours => ${HU})
1821
1853
  )
1822
1854
  RETURNING user_id, id, last_state->>'message' AS message
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`
1855
+ `);e.length>0&&console.log(`[capture-staleness] dispatched stale-capture alert for ${e.length} user(s)`);for(let t of e)try{await Da({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(BU,"checkCaptureStalenessOnce");function vS(){let e=setTimeout(()=>{n()},9e4),t=setInterval(()=>{n()},UU);async function n(){try{await BU()}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(vS,"startCaptureStalenessChecker");O();import{sql as IS}from"drizzle-orm";var FU=900*1e3,bS=6,ES=60,WU=IS`array['user_message','tool_call','tool_result']`;async function zU(){return[...await u.execute(IS`
1824
1856
  WITH session_stats AS (
1825
1857
  SELECT s.id,
1826
1858
  s.external_session_id,
@@ -1828,10 +1860,10 @@ end`;async function Gs(e){let t=e.req.param("teamId");if(!t||!oo.test(t))return{
1828
1860
  (
1829
1861
  SELECT MAX(timestamp) FROM session_events e
1830
1862
  WHERE e.session_id = s.id
1831
- AND e.event_type = ANY(${$U})
1863
+ AND e.event_type = ANY(${WU})
1832
1864
  ) AS last_hook_event
1833
1865
  FROM sessions s
1834
- WHERE s.started_at > now() - (${_S}::int * interval '1 hour')
1866
+ WHERE s.started_at > now() - (${bS}::int * interval '1 hour')
1835
1867
  )
1836
1868
  SELECT ss.id AS "sessionId",
1837
1869
  ss.external_session_id AS "externalSessionId",
@@ -1842,8 +1874,8 @@ end`;async function Gs(e){let t=e.req.param("teamId");if(!t||!oo.test(t))return{
1842
1874
  FROM session_stats ss
1843
1875
  JOIN context_snapshots cs ON cs.session_id = ss.id
1844
1876
  WHERE ss.last_hook_event IS NOT NULL
1845
- AND cs.captured_at > ss.last_hook_event + (${yS}::int * interval '1 second')
1877
+ AND cs.captured_at > ss.last_hook_event + (${ES}::int * interval '1 second')
1846
1878
  GROUP BY ss.id, ss.external_session_id, ss.tool
1847
1879
  HAVING COUNT(cs.id) > 0
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);
1880
+ `)]}c(zU,"auditPollutionOnce");function AS(){let e=setTimeout(()=>{n()},6e4),t=setInterval(()=>{n()},FU);async function n(){try{let r=await zU();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=${bS}h, grace=${ES}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(AS,"startPollutionAuditor");O();var KU=gm.dirname(VU(import.meta.url)),SS=gm.resolve(KU,"../../../.env.local");if(fm.existsSync(SS))for(let e of fm.readFileSync(SS,"utf-8").split(`
1881
+ `)){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 GU=Tm({serviceName:"rulemetric-api"});GU?console.log("[sentry] error capture enabled"):process.env.NODE_ENV==="production"&&console.log("[sentry] no SENTRY_DSN \u2014 error capture disabled");var K_=bm({serviceName:"rulemetric-api"});console.log(K_==="otlp"?`[otel] traces exporting to ${process.env.OTEL_EXPORTER_OTLP_ENDPOINT}`:K_==="console"?"[otel] traces printing to stdout (set OTEL_EXPORTER_OTLP_ENDPOINT to ship to a backend)":K_==="silent"?"[otel] traces enabled, span export OFF (OTEL_SPAN_EXPORT=none \u2014 no stdout span dump)":"[otel] disabled (TELEMETRY_ENABLED=false)");var YU=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)}`),yr(e,{tags:{source:"unhandledRejection",code:t??"unknown"}})});process.on("uncaughtException",e=>{let t=yi(e);if(t&&YU.has(t)){console.error(`[guard] uncaughtException (transient net code=${t}) \u2014 surviving: ${e.message}`),yr(e,{tags:{source:"uncaughtException",code:t}});return}console.error("[guard] uncaughtException (fatal):",e),yr(e,{tags:{source:"uncaughtException",code:t??"unknown"}}),Promise.allSettled([Va(2e3),Sc()]).finally(()=>process.exit(1))});var G_=Number(process.env.API_PORT)||3e3;console.log(`RuleMetric API starting on port ${G_}`);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=Zf();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 RS,ns=[],xS=!1;async function XU(){let e=JU({fetch:K.fetch,hostname:"0.0.0.0",port:G_});RS=e,e.keepAliveTimeout=65e3,e.headersTimeout=66e3,console.log(`RuleMetric API running at http://localhost:${G_} (keepAliveTimeout=65s)`),fv().then(t=>console.log(`[auth] JWKS prime ${t?"ok":"deferred (will fetch on first auth)"}`)),ns.push(lS()),ns.push(gS()),Fl()&&VI(),am()&&TA(),ns.push(yS()),ns.push(vS()),ns.push(kv()),ns.push(AS()),ns.push(...uS)}c(XU,"start");XU().catch(e=>{console.error("Failed to start API:",e),yr(e,{tags:{phase:"boot",source:"start"}}),Promise.allSettled([Va(2e3),Sc()]).finally(()=>process.exit(1))});async function TS(){if(!xS){xS=!0;for(let e of ns)try{e.stop()}catch{}try{RS?.close?.()}catch{}try{await JI(5e3)}catch{}try{await kA(5e3)}catch{}await Promise.allSettled([Em(),Va(2e3),Sc()]),process.exit(0)}}c(TS,"gracefulShutdown");process.on("SIGTERM",TS);process.on("SIGINT",TS);