@rulemetric/local 0.12.5 → 0.12.6
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/meta.json +2 -2
- package/dist/server.mjs +158 -158
- package/package.json +2 -2
package/dist/server.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
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&>.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`
|
|
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 po=(e,t)=>{for(var n in t)ry(e,n,{get:t[n],enumerable:!0})};import{pgTable as uu,text as ti,timestamp as Ka,jsonb as ay,uuid as is,primaryKey as cy}from"drizzle-orm/pg-core";var X,Q,ee,we,as=Y(()=>{"use strict";X=uu("organizations",{id:is("id").primaryKey().defaultRandom(),name:ti("name").unique().notNull(),slug:ti("slug").unique().notNull(),metadata:ay("metadata"),createdAt:Ka("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Ka("updated_at",{withTimezone:!0}).defaultNow()}),Q=uu("teams",{id:is("id").primaryKey().defaultRandom(),orgId:is("org_id").references(()=>X.id,{onDelete:"cascade"}),name:ti("name").notNull(),slug:ti("slug").notNull(),metadata:ay("metadata"),createdAt:Ka("created_at",{withTimezone:!0}).defaultNow()}),ee=uu("user_organizations",{userId:is("user_id").notNull(),orgId:is("org_id").references(()=>X.id,{onDelete:"cascade"}).notNull(),role:ti("role").notNull().default("member"),createdAt:Ka("created_at",{withTimezone:!0}).defaultNow()},e=>[cy({columns:[e.userId,e.orgId]})]),we=uu("user_teams",{userId:is("user_id").notNull(),teamId:is("team_id").references(()=>Q.id,{onDelete:"cascade"}).notNull(),role:ti("role").notNull().default("member"),createdAt:Ka("created_at",{withTimezone:!0}).defaultNow()},e=>[cy({columns:[e.userId,e.teamId]})])});import{boolean as lu,integer as Ga,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";as();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:Ga("auto_accept_max_per_run"),autoAcceptMaxPerWindow:Ga("auto_accept_max_per_window"),autoAcceptWindowDays:Ga("auto_accept_window_days"),trialMaxConcurrent:Ga("trial_max_concurrent"),trialMaxPerRun:Ga("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";as();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 mo,jsonb as gu,uuid as vr,integer as hu,boolean as QS,uniqueIndex as _u,index as Ya}from"drizzle-orm/pg-core";var g,Ir,xe,xn=Y(()=>{"use strict";g=Nm("instructions",{id:vr("id").primaryKey().defaultRandom(),name:en("name").notNull(),description:en("description").notNull(),type:en("type").notNull().default("instruction"),scope:en("scope").notNull(),scopeRef:vr("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:vr("created_by"),createdAt:mo("created_at",{withTimezone:!0}).defaultNow(),updatedAt:mo("updated_at",{withTimezone:!0}).defaultNow(),archived:QS("archived").default(!1),archivedAt:mo("archived_at",{withTimezone:!0}),archivedBy:vr("archived_by"),forkedFromId:vr("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:mo("source_updated_at",{withTimezone:!0})},e=>[_u("instructions_name_scope_ref_idx").on(e.name,e.scope,e.scopeRef),Ya("idx_instructions_scope").on(e.scope,e.scopeRef),Ya("idx_instructions_created_by").on(e.createdBy),Ya("idx_instructions_context_identity").on(e.createdBy,e.contextIdentity),Ya("idx_instructions_public_recency").on(e.scope,e.sourceUpdatedAt.desc())]),Ir=Nm("instruction_version_identities",{id:vr("id").primaryKey().defaultRandom(),instructionId:vr("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),contentHash:en("content_hash").notNull(),versionOrdinal:hu("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=>[_u("instruction_version_identities_hash_unique").on(e.instructionId,e.contentHash),_u("instruction_version_identities_ordinal_unique").on(e.instructionId,e.versionOrdinal),Ya("idx_ivi_instruction").on(e.instructionId)]),xe=Nm("instruction_versions",{id:vr("id").primaryKey().defaultRandom(),instructionId:vr("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:vr("created_by"),createdAt:mo("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 cs,timestamp as Xa,uniqueIndex as Dm,uuid as ds}from"drizzle-orm/pg-core";import{sql as sx}from"drizzle-orm";var C,lt,ye,br=Y(()=>{"use strict";as();xn();C=Om("projects",{id:ds("id").primaryKey().defaultRandom(),orgId:ds("org_id").references(()=>X.id,{onDelete:"cascade"}),name:cs("name").notNull(),description:cs("description"),githubRepo:cs("github_repo"),gitRemoteUrl:cs("git_remote_url"),gitRootCommit:cs("git_root_commit"),gitRemoteAliases:cs("git_remote_aliases").array().notNull().default([]),metadata:ox("metadata"),createdBy:ds("created_by"),createdAt:Xa("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Xa("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:ds("project_id").references(()=>C.id,{onDelete:"cascade"}).notNull(),instructionId:ds("instruction_id").references(()=>g.id,{onDelete:"cascade"}).notNull(),addedAt:Xa("added_at",{withTimezone:!0}).defaultNow(),addedBy:ds("added_by")},e=>[gy({columns:[e.projectId,e.instructionId]})]),ye=Om("project_checkouts",{projectId:ds("project_id").references(()=>C.id,{onDelete:"cascade"}).notNull(),path:cs("path").notNull(),isWorktree:rx("is_worktree").notNull().default(!1),firstSeen:Xa("first_seen",{withTimezone:!0}).notNull().defaultNow(),lastSeen:Xa("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();as();br();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 Qa,jsonb as us,uuid as zr,integer as vu,uniqueIndex as _y,index as Er}from"drizzle-orm/pg-core";var y,Ve,ie,ri=Y(()=>{"use strict";xn();br();Xt();as();wu();y=Mm("sessions",{id:zr("id").primaryKey().defaultRandom(),userId:zr("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),externalSessionId:Rn("external_session_id"),projectId:zr("project_id").references(()=>C.id,{onDelete:"set null"}),orgId:zr("org_id").references(()=>X.id,{onDelete:"set null"}),tool:Rn("tool").notNull(),projectPath:Rn("project_path"),gitBranch:Rn("git_branch"),startedAt:Qa("started_at",{withTimezone:!0}).notNull(),endedAt:Qa("ended_at",{withTimezone:!0}),eventCount:vu("event_count").default(0),tokenUsage:us("token_usage"),analysis:us("analysis"),analyzedAt:Qa("analyzed_at",{withTimezone:!0}),analyzedEventCount:vu("analyzed_event_count"),analyzedTurnCount:vu("analyzed_turn_count"),metadata:us("metadata").default({}),origin:Rn("origin").notNull().default("unknown"),runId:zr("run_id").references(()=>te.id,{onDelete:"set null"}),model:Rn("model"),harnessVersion:Rn("harness_version"),createdAt:Qa("created_at",{withTimezone:!0}).defaultNow()},e=>[Er("idx_sessions_user").on(e.userId),Er("idx_sessions_tool").on(e.tool),Er("idx_sessions_started_at").on(e.startedAt),Er("idx_sessions_project").on(e.projectId),Er("idx_sessions_org_started_at").on(e.orgId,e.startedAt),Er("idx_sessions_run").on(e.runId),_y("idx_sessions_user_external").on(e.userId,e.externalSessionId)]),Ve=Mm("session_events",{id:zr("id").primaryKey().defaultRandom(),sessionId:zr("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:us("tool_input"),toolOutput:us("tool_output"),tokenUsage:us("token_usage"),model:Rn("model"),timestamp:Qa("timestamp",{withTimezone:!0}).notNull(),metadata:us("metadata").default({})},e=>[_y("session_events_session_sequence_idx").on(e.sessionId,e.sequence),Er("idx_session_events_session_id").on(e.sessionId),Er("idx_session_events_event_type").on(e.eventType),Er("idx_session_events_model").on(e.model)]),ie=Mm("session_instructions",{sessionId:zr("session_id").notNull().references(()=>y.id,{onDelete:"cascade"}),instructionId:zr("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),linkMethod:Rn("link_method").notNull(),contentHash:Rn("content_hash")},e=>[Er("idx_session_instructions_instruction_id").on(e.instructionId)])});import{pgTable as yy,text as Iu,timestamp as wy,uuid as Ar,integer as vy,index as oi,unique as dx}from"drizzle-orm/pg-core";var Mt,ne,Iy=Y(()=>{"use strict";Xt();br();ri();Mt=yy("treatment_assignments",{id:Ar("id").primaryKey().defaultRandom(),userId:Ar("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),treatmentType:Iu("treatment_type").notNull(),treatmentId:Ar("treatment_id").notNull(),treatmentVersion:vy("treatment_version").notNull().default(1),projectId:Ar("project_id").references(()=>C.id,{onDelete:"set null"}),assignedBy:Ar("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:Ar("id").primaryKey().defaultRandom(),sessionId:Ar("session_id").notNull().references(()=>y.id,{onDelete:"cascade"}),userId:Ar("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),treatmentType:Iu("treatment_type").notNull(),treatmentId:Ar("treatment_id").notNull(),treatmentVersion:vy("treatment_version").notNull().default(1),assignmentId:Ar("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();br();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 fo,timestamp as Sy,uuid as si,numeric as fx,index as qm,unique as gx}from"drizzle-orm/pg-core";var U,Vr,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:fo("project_path").notNull(),status:fo("status").notNull().default("running"),treatedShare:fx("treated_share").notNull().default("0.5"),salt:fo("salt").notNull(),contentHash:fo("content_hash"),source:fo("source").notNull().default("manual"),stoppedReason:fo("stopped_reason"),createdAt:Sy("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[qm("idx_instruction_experiments_lookup").on(e.userId,e.projectPath)]),Vr=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:fo("external_session_id").notNull(),arm:fo("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 Za,integer as ky,index as xu}from"drizzle-orm/pg-core";var W,Vm=Y(()=>{"use strict";Xt();br();W=Sx("memories",{id:Za("id").primaryKey().defaultRandom(),userId:Za("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),orgId:Za("org_id"),projectId:Za("project_id").references(()=>C.id,{onDelete:"set null"}),version:ky("version").notNull().default(1),parentId:Za("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 ec,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:ec("task_prompt").notNull(),expectations:ec("expectations").array().notNull().default([]),trials:jy("trials").notNull().default(10),model:ec("model"),status:ec("status").notNull().default("pending"),result:Rx("result").$type(),error:ec("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 ls,timestamp as tc,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:ls("target").notNull(),message:ls("message").notNull(),submit:Nx("submit").notNull().default(!0),delivery:ls("delivery").notNull().default("live"),status:ls("status").notNull().default("pending"),result:Oy("result"),error:ls("error"),attempts:Cy("attempts").notNull().default(0),taskKind:ls("task_kind"),payload:Oy("payload"),claimedBy:ls("claimed_by"),claimedAt:tc("claimed_at",{withTimezone:!0}),leaseExpiresAt:tc("lease_expires_at",{withTimezone:!0}),leaseRecoveries:Cy("lease_recoveries").notNull().default(0),createdAt:tc("created_at",{withTimezone:!0}).defaultNow(),updatedAt:tc("updated_at",{withTimezone:!0}).defaultNow(),completedAt:tc("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 ps,timestamp as ju,jsonb as qy,uuid as go,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:go("id").primaryKey().defaultRandom(),name:ps("name").notNull(),description:ps("description").notNull(),scope:ps("scope").notNull(),scopeRef:go("scope_ref"),version:ps("version").notNull().default("1.0.0"),tags:ps("tags").array(),badge:ps("badge"),metadata:qy("metadata"),createdBy:go("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:go("archived_by"),forkedFromId:go("forked_from_id").references(()=>Ue.id,{onDelete:"set null"}),upstreamVersion:ps("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:go("pack_id").references(()=>Ue.id,{onDelete:"cascade"}).notNull(),instructionId:go("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:go("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 ho,Hy=Y(()=>{"use strict";xn();ho=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 le,Wy=Y(()=>{"use strict";le=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 ms,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:ms("device_id"),event:ms("event").notNull(),command:ms("command"),statusCode:Vx("status_code"),message:ms("message"),cliVersion:ms("cli_version"),os:ms("os"),nodeVersion:ms("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 fs,text as _t,timestamp as hn,jsonb as qn,uuid as pt,integer as Jr,boolean as nc,index as Bt,unique as Yy}from"drizzle-orm/pg-core";var k,Ee,Ie,ot,et,me,or,rc=Y(()=>{"use strict";xn();k=fs("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:Jr("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=fs("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=fs("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:Jr("eval_target_version").notNull(),configuration:_t("configuration").notNull(),runNumber:Jr("run_number").notNull().default(1),iteration:Jr("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=fs("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:Jr("target_a_version").notNull(),targetBVersion:Jr("target_b_version").notNull(),isSwapped:nc("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=fs("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:Jr("expectation_index").notNull(),expectationText:_t("expectation_text").notNull(),judgePassed:nc("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)]),me=fs("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:Jr("expectation_index").notNull(),expectationText:_t("expectation_text").notNull(),judgePassed:nc("judge_passed").notNull(),humanPassed:nc("human_passed").notNull(),reviewerEngine:_t("reviewer_engine").notNull(),reviewerModel:_t("reviewer_model").notNull(),reviewerPassed:nc("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=fs("benchmarks",{id:pt("id").primaryKey().defaultRandom(),evalTargetId:pt("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),iteration:Jr("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 Kr,timestamp as Qx,jsonb as Cu,uuid as Lu,boolean as Zx,index as oc,uniqueIndex as eR}from"drizzle-orm/pg-core";var ae,Xy=Y(()=>{"use strict";rc();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:Kr("from_content_hash").notNull(),toContentHash:Kr("to_content_hash").notNull(),fromContent:Kr("from_content").notNull(),toContent:Kr("to_content").notNull(),proposalSource:Kr("proposal_source").notNull(),proposalRationale:Kr("proposal_rationale").notNull().default(""),decision:Kr("decision").notNull(),applied:Zx("applied").notNull().default(!1),refusals:Cu("refusals").notNull().default([]),rationale:Kr("rationale").notNull().default(""),effectClass:Kr("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=>[oc("idx_instruction_promotions_budget").on(e.evalTargetId,e.createdAt.desc()).where(nf`${e.applied}`),oc("idx_instruction_promotions_target").on(e.evalTargetId,e.createdAt.desc()),oc("idx_instruction_promotions_user").on(e.userId,e.createdAt.desc()),oc("idx_instruction_promotions_to_hash").on(e.toContentHash),eR("uq_instruction_promotions_applied").on(e.evalTargetId,e.fromContentHash,e.toContentHash).where(nf`${e.applied}`),oc("idx_instruction_promotions_applied_hash").on(e.toContentHash,e.createdAt.desc()).where(nf`${e.applied}`)])});import{index as sc,integer as tR,jsonb as nR,pgTable as rR,text as Tn,timestamp as di,uniqueIndex as oR,uuid as ic}from"drizzle-orm/pg-core";var Te,Qy=Y(()=>{"use strict";xn();br();Te=rR("recommendation_applications",{id:ic("id").primaryKey().defaultRandom(),userId:ic("user_id").notNull(),instructionId:ic("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),projectId:ic("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:ic("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),sc("idx_recommendation_applications_user_status").on(e.userId,e.status,e.updatedAt.desc()),sc("idx_recommendation_applications_user_harness").on(e.userId,e.harness,e.updatedAt.desc()),sc("idx_recommendation_applications_project").on(e.projectId,e.updatedAt.desc()),sc("idx_recommendation_applications_batch").on(e.userId,e.applyBatchId,e.applySeq.desc()),sc("idx_recommendation_applications_requires").using("gin",e.requires)])});import{pgTable as sR,text as _o,timestamp as iR,jsonb as ac,uuid as rf,integer as of,real as aR,index as cc,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:_o("provider").notNull(),model:_o("model").notNull(),systemPrompt:_o("system_prompt").notNull(),injectedInstructions:ac("injected_instructions").notNull().default([]),messagesSummary:ac("messages_summary").notNull(),tools:ac("tools").notNull().default([]),systemHash:_o("system_hash").notNull(),requestHash:_o("request_hash").notNull().default(""),toolsHash:_o("tools_hash"),injectedHash:_o("injected_hash"),messagesDelta:ac("messages_delta").default([]),messagesDeltaRef:_o("messages_delta_ref"),maxTokens:of("max_tokens"),temperature:aR("temperature"),estimatedTokens:of("estimated_tokens"),capturedAt:iR("captured_at",{withTimezone:!0}).notNull().defaultNow(),metadata:ac("metadata").default({})},e=>[cc("idx_context_snapshots_session").on(e.sessionId),cc("idx_context_snapshots_user").on(e.userId),cc("idx_context_snapshots_hash").on(e.systemHash),cc("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),cc("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 dc,jsonb as $u,uuid as sf,index as qu,integer as rw}from"drizzle-orm/pg-core";var Ne,ow=Y(()=>{"use strict";rc();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:dc("claimed_at",{withTimezone:!0}),leaseExpiresAt:dc("lease_expires_at",{withTimezone:!0}),leaseRecoveries:rw("lease_recoveries").notNull().default(0),createdAt:dc("created_at",{withTimezone:!0}).defaultNow(),updatedAt:dc("updated_at",{withTimezone:!0}).defaultNow(),completedAt:dc("completed_at",{withTimezone:!0})},e=>[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 uc,timestamp as lc,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:uc("task_kind").notNull(),status:uc("status").notNull().default("pending"),payload:sw("payload").notNull(),dedupeKey:uc("dedupe_key"),result:sw("result"),error:uc("error"),attempts:aw("attempts").notNull().default(0),claimedBy:uc("claimed_by"),claimedAt:lc("claimed_at",{withTimezone:!0}),leaseExpiresAt:lc("lease_expires_at",{withTimezone:!0}),leaseRecoveries:aw("lease_recoveries").notNull().default(0),createdAt:lc("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:lc("updated_at",{withTimezone:!0}).notNull().defaultNow(),completedAt:lc("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 pc,timestamp as mc,jsonb as Uu,uuid as af,index as Hu,integer as uw}from"drizzle-orm/pg-core";var z,lw=Y(()=>{"use strict";br();z=gR("insights_jobs",{id:af("id").primaryKey().defaultRandom(),userId:af("user_id").notNull(),status:pc("status").notNull().default("pending"),projectPath:pc("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:pc("error"),attempts:uw("attempts").notNull().default(0),taskKind:pc("task_kind"),payload:Uu("payload"),claimedBy:pc("claimed_by"),claimedAt:mc("claimed_at",{withTimezone:!0}),leaseExpiresAt:mc("lease_expires_at",{withTimezone:!0}),leaseRecoveries:uw("lease_recoveries").notNull().default(0),createdAt:mc("created_at",{withTimezone:!0}).defaultNow(),updatedAt:mc("updated_at",{withTimezone:!0}).defaultNow(),completedAt:mc("completed_at",{withTimezone:!0})},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";rc();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 Gr,timestamp as ww,jsonb as xR,uuid as lf}from"drizzle-orm/pg-core";var yo,vw=Y(()=>{"use strict";yo=SR("skill_submissions",{id:lf("id").primaryKey().defaultRandom(),skillId:Gr("skill_id").notNull(),name:Gr("name").notNull(),description:Gr("description").notNull(),category:Gr("category").notNull(),tools:Gr("tools").array().notNull(),tags:Gr("tags").array().default([]),content:Gr("content").notNull(),status:Gr("status").notNull().default("pending"),submittedBy:lf("submitted_by").notNull(),reviewedBy:lf("reviewed_by"),reviewNote:Gr("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 fc,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:fc("harness").notNull(),version:fc("version").notNull(),publishedAt:Iw("published_at",{withTimezone:!0}).notNull(),title:fc("title"),body:fc("body"),categories:TR("categories").default({}),url:fc("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 gc,timestamp as hc,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:gc("tool").notNull(),status:gc("status").notNull().default("pending"),config:pf("config").notNull().default({}),result:pf("result"),error:gc("error"),attempts:Tw("attempts").notNull().default(0),taskKind:gc("task_kind"),payload:pf("payload"),claimedBy:gc("claimed_by"),claimedAt:hc("claimed_at",{withTimezone:!0}),leaseExpiresAt:hc("lease_expires_at",{withTimezone:!0}),leaseRecoveries:Tw("lease_recoveries").notNull().default(0),createdAt:hc("created_at",{withTimezone:!0}).defaultNow(),updatedAt:hc("updated_at",{withTimezone:!0}).defaultNow(),completedAt:hc("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 Yr,text as wo,real as CR,timestamp as _c,boolean as LR,uniqueIndex as MR,index as yc}from"drizzle-orm/pg-core";var Wu,x,Ge,Nw=Y(()=>{"use strict";Xt();xn();br();Wu=["add","remove","trim"],x=jw("instruction_suggestions",{id:Yr("id").primaryKey().defaultRandom(),userId:Yr("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),instructionId:Yr("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),projectPath:wo("project_path").notNull(),projectId:Yr("project_id").references(()=>C.id,{onDelete:"set null"}),score:CR("score").notNull(),reason:wo("reason").notNull(),kind:wo("kind").$type().notNull().default("add"),generatedAt:_c("generated_at",{withTimezone:!0}).notNull().defaultNow(),isStale:LR("is_stale").notNull().default(!1),dismissedAt:_c("dismissed_at",{withTimezone:!0}),acceptedAt:_c("accepted_at",{withTimezone:!0}),declinedAt:_c("declined_at",{withTimezone:!0}),declinedReason:wo("declined_reason"),promotedToInstructionId:Yr("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),yc("idx_instruction_suggestions_user_project").on(e.userId,e.projectPath),yc("idx_instruction_suggestions_user_proj_id").on(e.userId,e.projectId),yc("idx_instruction_suggestions_generated_at").on(e.generatedAt)]),Ge=jw("instruction_suggestion_events",{id:Yr("id").primaryKey().defaultRandom(),suggestionId:Yr("suggestion_id").notNull().references(()=>x.id,{onDelete:"cascade"}),userId:Yr("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),eventType:wo("event_type").notNull(),tool:wo("tool"),sessionId:Yr("session_id"),projectPath:wo("project_path").notNull(),actor:wo("actor"),createdAt:_c("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[yc("idx_instruction_suggestion_events_suggestion_id").on(e.suggestionId),yc("idx_instruction_suggestion_events_user_id").on(e.userId)])});import{pgTable as $R,text as ff,integer as qR,numeric as wc,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:wc("input_per_m").notNull(),outputPerM:wc("output_per_m").notNull(),cacheReadPerM:wc("cache_read_per_m").notNull(),cacheWrite5mPerM:wc("cache_write_5m_per_m").notNull(),cacheWrite1hPerM:wc("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 gs,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:gs("provider").notNull(),plan:gs("plan").notNull(),limitType:gs("limit_type").notNull(),value:Dw("value").notNull(),unit:gs("unit").notNull(),comparator:gs("comparator").notNull().default("="),resetsAt:Ow("resets_at",{withTimezone:!0}),sourceType:gs("source_type").notNull(),sourceUrl:gs("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 vo,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:vo("sent_at",{withTimezone:!0}),sentBy:li("sent_by"),error:sr("error"),createdAt:vo("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:vo("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:vo("sent_at",{withTimezone:!0}),createdAt:vo("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:vo("unsubscribed_at",{withTimezone:!0}),createdAt:vo("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:vo("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();as();py();xn();fy();br();ri();Iy();Ey();Um();Ry();Ty();Vm();Py();wu();Xm();Ly();Uy();Hy();Wy();Jy();Gy();rc();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(ho),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(ho,({one:e})=>({instruction:e(g,{fields:[ho.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={};po(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:()=>Vr,instructionExperiments:()=>U,instructionPromotions:()=>ae,instructionSuggestionEvents:()=>Ge,instructionSuggestions:()=>x,instructionUsageEvents:()=>ho,instructionUsageEventsRelations:()=>UT,instructionVerdicts:()=>Z,instructionVersionIdentities:()=>Ir,instructionVersions:()=>xe,instructionVersionsRelations:()=>TT,instructions:()=>g,instructionsRelations:()=>ST,judgeReviewerVerdicts:()=>me,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:()=>yo,teams:()=>Q,teamsRelations:()=>IT,treatmentAssignments:()=>Mt,treatmentAssignmentsRelations:()=>LT,treatmentExposures:()=>ne,treatmentExposuresRelations:()=>MT,userOrganizations:()=>ee,userOrganizationsRelations:()=>ET,userTeams:()=>we,userTeamsRelations:()=>AT,workerConnections:()=>le});var Ku=Y(()=>{"use strict";bf();Xw()});function xf(){hs++,hs>Ef&&(Ef=hs)}function Rf(){hs>0&&hs--}function Tf(){pi++,pi>Af&&(Af=pi)}function kf(){pi>0&&pi--}function vc(){return hs}function jf(){Qw++}function Ic(){Zw++}function ev(){Sf++}function Nf(){let e=Sf;return Sf=0,e}function Pf(){return{current:hs,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 bc(){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 hs,Ef,pi,Af,Qw,Zw,Sf,Df=Y(()=>{"use strict";hs=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(vc,"getDbLoad");c(jf,"recordDbShed");c(Ic,"recordIngestShed");c(ev,"recordQueryDeadline");c(Nf,"consumeDeadlineCount");c(Pf,"getDbLoadStats");c(mi,"dbInflightMax");c(bc,"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(Sc)throw new Error("getDb() called after closeDb(): the connection pool is closed for shutdown. Stop issuing queries (timers/requests) before draining the pool.");if(!Ac){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}:{}}}),Ac=tv(gi,{schema:Ju})}return Ac}function rv(){if(Sc)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 xc(){if(Gu)return Gu;Sc=!0;let e=gi,t=fi,n=Xu;return gi=void 0,Ac=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(Sc)return Promise.resolve();if(Ec)return Ec;let e=gi;return gi=void 0,Ac=void 0,Ec=(async()=>{e&&await e.end({timeout:5}).catch(()=>{})})().finally(()=>{Ec=void 0}),Ec}async function Mf(e){let t=Date.now();if(Sc)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 Rc(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&>.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 Tc(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 Ac,gi,Sc,Gu,Ec,fi,Xu,Yu,KT,GT,YT,Qu,av,cv,u,Fe,qf=Y(()=>{"use strict";Ku();Df();Sc=!1;c(Cf,"getEnv");c(nv,"getDb");c(rv,"getHeavyDb");c(xc,"closeDb");c(Lf,"recyclePool");c(Mf,"probeDbReachable");KT="called after closeDb()";c(Rc,"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(Tc,"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={};po(cI,{GRADUATION_MIN_N:()=>Yc,decideGraduation:()=>iI,graduatedRulesForRender:()=>Rg,instructionContentHash:()=>Xr,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<Yc||e.measured.control<Yc?null:e.delta>0?"always":"never"}function Xr(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=Xr(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 ry=Object.defineProperty;var c=(e,t)=>ry(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(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>=
|
|
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>=Yc&&r.measured.control>=Yc?(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 ry=Object.defineProperty;var c=(e,t)=>ry(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 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=
|
|
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=Xr(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 Yc,bs=Y(()=>{"use strict";O();xg();Yc=25;c(iI,"decideGraduation");c(Xr,"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
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
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
|
|
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 cd(e){let t=hP[e];if(!t)throw new Error(`Unknown session tool: ${e}`);return t()}function dd(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 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(
|
|
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(cd,"getAdapter");c(dd,"detectTool")});import{readdir as Xg,stat as Qg}from"fs/promises";import{basename as _P,join as Do}from"path";import{homedir as zl}from"os";function wP(){return process.env.CLAUDE_CONFIG_DIR||Do(zl(),".claude")}function vP(){return Do(wP(),"projects")}function IP(){return process.platform==="darwin"?Do(zl(),"Library","Application Support","Claude","local-agent-mode-sessions"):process.platform==="win32"?Do(zl(),"AppData","Roaming","Claude","local-agent-mode-sessions"):Do(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=Do(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=Do(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=Do(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
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
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
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
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={};
|
|
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={};po(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,23 +40,23 @@ var ry=Object.defineProperty;var c=(e,t)=>ry(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(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={};
|
|
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={};po(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 ud(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 ld(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(ud,"buildTmuxSendKeysArgs");c(Ob,"buildTmuxHasSessionArgs");c(ld,"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(ud(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(ud(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:ld(o),live:!0}}}async openTerminalAttach(t,n){let r=$b(Mb(),`rulemetric-attach-${n}.command`),o=`#!/bin/zsh
|
|
44
44
|
rm -- "$0"
|
|
45
|
-
${
|
|
45
|
+
${ld(t)}
|
|
46
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 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={};
|
|
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={};po(Xb,{ClaudeCodeAdapter:()=>Ji,CodexAdapter:()=>Qi,CopilotAgentAdapter:()=>Yi,CursorAdapter:()=>Ki,RuleMetricMcpAdapter:()=>Xi,SESSION_EVENT_TYPES:()=>pP,SESSION_TOOLS:()=>lP,VSCodeCopilotAdapter:()=>Gi,buildTmuxAttachCommand:()=>ld,buildTmuxHasSessionArgs:()=>Ob,buildTmuxLaunchArgs:()=>Gl,buildTmuxSendKeysArgs:()=>ud,detectTool:()=>dd,discoverAllSessions:()=>Nb,freshCodexState:()=>Gg,getAdapter:()=>cd,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={};po(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,pd=Y(()=>{"use strict";ip=null;c(Jn,"getSupabaseAdmin")});var d0={};po(d0,{SNAPSHOT_DELTA_BUCKET:()=>ph,decodeDeltaBlob:()=>i0,encodeDeltaBlob:()=>mh,getDeltaBlob:()=>md,resolveDeltaPage:()=>fd,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 md(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 fd(e){return e.some(ap)?c0(e,a0,async t=>({sequence:t.sequence,messagesDelta:ap(t)?await md(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 md(t.messagesDeltaRef)}:t):e}var ph,a0,cp=Y(()=>{"use strict";pd();ph="snapshot-deltas";c(mh,"encodeDeltaBlob");c(i0,"decodeDeltaBlob");c(fh,"uploadEncodedDelta");c(md,"getDeltaBlob");a0=8;c(ap,"hasRef");c(c0,"mapCapped");c(fd,"resolveDeltaPage");c(gh,"resolveFullRows")});var aS={};po(aS,{resolveRuntimeWebConfig:()=>iS,stampRuntimeConfig:()=>fU});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 fU(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 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`
|
|
53
|
+
${e}`}var cS=Y(()=>{"use strict";c(iS,"resolveRuntimeWebConfig");c(fU,"stampRuntimeConfig")});import*as fm from"node:fs";import*as gm from"node:path";import{fileURLToPath as JU}from"node:url";import{serve as KU}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 Wr from"@sentry/node";var za=!1;function Tm(e){if(za)return!1;let t=process.env.SENTRY_DSN;return t?(Wr.init({dsn:t,serverName:e.serviceName,environment:process.env.NODE_ENV??"development",tracesSampleRate:0}),za=!0,!0):!1}c(Tm,"initSentry");function wr(e,t){if(!za)return;let n=e instanceof Error?e:new Error(typeof e=="string"?e:JSON.stringify(e));Wr.captureException(n,t)}c(wr,"captureException");function Va(e){if(za){if(e===null){Wr.setUser(null);return}Wr.setUser({id:e})}}c(Va,"setSentryUser");async function Ja(e){za&&await Wr.flush(e)}c(Ja,"flushSentry");import*as ou from"node:fs";import*as $a from"node:path";import{fileURLToPath as gU}from"node:url";import{Hono as hU}from"hono";import{cors as _U}from"hono/cors";import{bodyLimit as yU}from"hono/body-limit";import{serveStatic as wU}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,jc=null,pv=0,kc=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 kc||(kc=(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{}jc=t,pv=Date.now()}finally{kc=null}})(),kc)}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(jc===null)try{await Uf()}catch{return{ok:!1,reason:"unavailable"}}let d=jc?.get(s.kid);if(!d&&Date.now()-pv>=nk){try{await Uf()}catch{return{ok:!1,reason:"unavailable"}}d=jc?.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(),jc!==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),Va(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),Va(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),Va(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():Rc(e)?t.json({error:"Server draining, retry shortly"},503):Tc(e)?(process.env.LOG_LEVEL==="debug"&&console.debug("[req] query deadline exceeded \u2014 DB pool saturated; shed 503"),t.json({error:"Database busy, retry shortly"},503,{"Retry-After":"2"})):e.message==="aborted"||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 Nc(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(Nc,"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 Pc(){return el}c(Pc,"isDbReady");function tl(){return{ready:el,reason:Hf,changedAt:wv}}c(tl,"dbReadiness");async function vv(e,t){return Pc()?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=vc(),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 Dc(e,t){if(e.req.method!=="POST")return t();let n=vc(),r=bc();if(n>=r){Ic();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(Dc,"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 Io}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=Io.object({email:Io.string().email(),password:Io.string().min(1)}),Ak=Io.object({refreshToken:Io.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=Io.object({email:Io.string().email(),password:Io.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,Oc=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(Oc&&e-Oc.at<Nk)return Oc.version;let n=await Ok()??Oc?.version??Dk();return Oc={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=!Pc();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&&Pc()&&(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(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{
|
|
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{wr(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
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,
|
|
@@ -69,12 +69,12 @@ ${e}`}var cS=Y(()=>{"use strict";c(iS,"resolveRuntimeWebConfig");c(mU,"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=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:
|
|
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
|
|
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:bc(),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 Sr,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 Cc(e){return e<=3?"light":e<=8?"standard":"heavy"}c(Cc,"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 s5=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
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
|
|
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 Lc(e,t){let n=sj[e];if(!n)throw new Error(`Unknown LLM provider: ${e}`);return n(t)}c(Lc,"createLLMProvider");function Mc(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 >= ${.5}. Order by score descending. Return valid JSON only, no markdown fences.`}c(
|
|
110
|
+
Only include instructions with a relevance score >= ${.5}. Order by score descending. Return valid JSON only, no markdown fences.`}c(Mc,"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=Mc(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(aj,"renderedSize");async function Qf(e,t,n){if(t.length===0)return{recommendations:[],error:null};let r;try{r=
|
|
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(`
|
|
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=Lc(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(Mc(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 $c=["inside","outside"];function _s(e){return e.trim().toLowerCase()}c(_s,"normalizeDependencyKey");function tg(e){let t=[];if($c.includes(e.boundaryClass)||t.push({field:"boundaryClass",message:`must be one of ${$c.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(_s));if(r.size===0)return[];let o=[];for(let s of t){if(n&&s.id===n)continue;let i=(s.requires??[]).map(_s).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 qc=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 qc.has(e)}c(pl,"needsLlmEngine");O();function nn(e){if(!ei())return;let t=Sm();u.insert(ho).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 _s(`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(_s));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(Sr(...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(Sr(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(Sr(...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(Sr(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(Sr(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(Sr(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(Sr(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(Sr(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(Sr(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(Sr(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 bo,and as cg}from"drizzle-orm";var Uc=new Ej;Uc.post("/instructions/:id/fork",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(g).where(cg(bo(g.id,n),bo(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(bo(g.createdBy,t),bo(g.scope,"org"),bo(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)});Uc.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(bo(g.id,t),bo(g.createdBy,n)));if(!r)return e.json({error:"Instruction not found"},404);let o=await u.select().from(Ht).where(bo(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 Hc=new Aj;Hc.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})});Hc.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 Eo}from"zod";import{eq as Ft,and as ys,sql as Rj}from"drizzle-orm";var Tj=Eo.object({scope:Eo.enum(["team","org"]),scopeRef:Eo.string().uuid()}),Bc=new xj;Bc.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(ys(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(ys(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(ys(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=Eo.object({targetScope:Eo.enum(["personal","team","org"]),targetScopeRef:Eo.string().uuid().optional(),name:Eo.string().optional(),seedEvalTarget:Eo.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");Bc.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(ys(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(ys(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(ys(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(ys(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 Wc,or as Vv,inArray as Jv,sql as Fc,desc as Pj}from"drizzle-orm";var zc=new Nj,Dj=zv.object({badge:zv.enum(["recommended","required"]).nullable()});zc.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(Wc(Pn(g.scope,"org"),Jv(g.scopeRef,w))),f.length>0&&v.push(Wc(Pn(g.scope,"team"),Jv(g.scopeRef,f))),h.push(Vv(...v)),e.req.query("proposable")==="1"&&h.push(Fc`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(Fc`${g.name} ILIKE ${`%${E}%`}`,Fc`${g.description} ILIKE ${`%${E}%`}`))}let I=[Pj(Fc`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:Fc`left(${g.content}, ${i})`}:b).from(g).where(Wc(...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)});zc.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(Wc(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(Wc(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 Ao,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(Ao(C.id,n),Ao(C.createdBy,t)));if(!r)return e.json({error:"Project not found"},404);let o=await u.select({orgId:ee.orgId}).from(ee).where(Ao(ee.userId,t)),s=await u.select({teamId:we.teamId}).from(we).where(Ao(we.userId,t)),i=o.map(h=>h.orgId).filter(h=>h!==null),a=s.map(h=>h.teamId).filter(h=>h!==null),d=[Ao(g.scope,"public")];i.length>0&&d.push(ml(Ao(g.scope,"org"),Kv(g.scopeRef,i))),a.length>0&&d.push(ml(Ao(g.scope,"team"),Kv(g.scopeRef,a)));let l=await u.select().from(g).where(ml(Ao(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 ed,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 So=1.959963984540054;function hl(e,t,n=So){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 ws=.35,yl=900*1e3;function hg(e,t,n=ws,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??ws,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 vs(e){return e.sufficient?e.significant?e.delta<0?"harmful":"helpful":"neutral":"insufficient"}c(vs,"classifyEffect");var xi={achieved:1,fully_achieved:1,mostly_achieved:.75,partially_achieved:.5,unclear_from_transcript:.25,not_achieved:0,abandoned:0},Is=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??So,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 Vc(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??So,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(Vc,"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"),Jc=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:Jc(e.unlabeledJudge)/r,scaling:Jc(e.labeled.map(o=>o.human-o.judge)),n}:n>0?{fixed:0,scaling:Jc(e.labeled.map(o=>o.human)),n}:{fixed:r>0?Jc(e.unlabeledJudge)/r:0,scaling:t.labeled.length>0?Jc(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??So,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=Vc(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:fe}=n.pool,F=V>=r,he=fe>=3,D=F&&he&&T,re=[];return he||re.push(`pool spans ${fe}/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:fe}}let N=p>=s,L=m>=s,q=f.pilotMet&&N&&L&&T,B,J=0;if(!T){let V=(o/d)**2,fe=$j([Qv(e,t),Qv(t,e)],V);J=fe===null?null:2*fe}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,Gc=7,bg="(preamble)",Fj=/^\s*(`{3,}|~{3,})/,Wj=/^(#{1,6})\s+(.*)$/;function Kc(e){let t=e.split(`
|
|
116
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(
|
|
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(Kc,"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(Kc(e)),r=Al(Kc(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(Kc(e)),...Al(Kc(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)),_=vs(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 Xc(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(()=>(bs(),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,14 +123,14 @@ Only include instructions with a relevance score >= ${.5}. Order by score descen
|
|
|
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=
|
|
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=Is(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(_>ws)return{...m,delta:null,ci:null,significant:!1,resolution:"inconclusive",timeSeparation:_,randomisationSuspect:!0,reason:`arms are time-separated (${_.toFixed(2)} > ${ws}) \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(Xc,"buildArmVerdict");bs();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
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
|
|
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 xr,gte as nN,sql as xo}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:xo`${C.metadata}->>'autoAcceptSuggestions'`}).from(C).where(xr(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(xr(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 Ro(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(xr(R.id,e));if(dI(n,r??null,"account"),t){let[o]=await u.select({minScore:xo`(${C.metadata}->'autoAcceptLimits'->>'minScore')::real`,maxPerRun:xo`(${C.metadata}->'autoAcceptLimits'->>'maxPerRun')::int`,maxPerWindow:xo`(${C.metadata}->'autoAcceptLimits'->>'maxPerWindow')::int`,windowDays:xo`(${C.metadata}->'autoAcceptLimits'->>'windowDays')::int`}).from(C).where(xr(C.id,t));dI(n,o??null,"project")}return n}c(Ro,"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(xr(Ge.userId,e),xr(Ge.eventType,"accepted"),xr(Ge.actor,"auto"),nN(Ge.createdAt,s)),a=o?xo`exists (
|
|
129
129
|
select 1 from instruction_suggestions s2
|
|
130
130
|
join instructions i2 on i2.id = s2.instruction_id
|
|
131
131
|
where s2.id = ${Ge.suggestionId}
|
|
132
132
|
and i2.type = ${o}
|
|
133
|
-
)`:void 0;if(!n){let[l]=await u.select({n:
|
|
133
|
+
)`:void 0;if(!n){let[l]=await u.select({n:xo`count(*)::int`}).from(Ge).where(kg(i,xr(Ge.projectPath,t),a));return l?.n??0}let[d]=await u.select({n:xo`count(*)::int`}).from(Ge).innerJoin(x,xr(x.id,Ge.suggestionId)).where(kg(i,xr(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`(
|
|
134
134
|
SELECT count(*) FROM (
|
|
135
135
|
SELECT date_trunc('hour', min(e.created_at)) AS h
|
|
136
136
|
FROM instruction_suggestion_events e
|
|
@@ -145,7 +145,7 @@ Only include instructions with a relevance score >= ${.5}. Order by score descen
|
|
|
145
145
|
AND e.event_type IN ('surfaced', 'surfaced_with_content')
|
|
146
146
|
AND e.session_id IS NULL
|
|
147
147
|
) hours
|
|
148
|
-
)`,
|
|
148
|
+
)`,Qc=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`
|
|
149
149
|
WITH over_budget AS (
|
|
150
150
|
SELECT instruction_suggestions.id
|
|
151
151
|
FROM instruction_suggestions
|
|
@@ -177,7 +177,7 @@ Only include instructions with a relevance score >= ${.5}. Order by score descen
|
|
|
177
177
|
)
|
|
178
178
|
INSERT INTO instruction_suggestion_events (suggestion_id, user_id, event_type, project_path)
|
|
179
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},
|
|
180
|
+
`)}c(jl,"sweepDeclinedBySilence");O();import{eq as pI,sql as mI}from"drizzle-orm";var Ci={MAX_CONCURRENT:3,MAX_PER_RUN:3},Zc={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}=Zc[e];return Number.isFinite(t)?Math.min(r,Math.max(n,Math.trunc(t))):Ci[dN[e]]}c(Ng,"clampTrialLimit");async function Es(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(Es,"resolveTrialLimits");function fI(e,t,n){if(t)for(let r of Object.keys(Zc)){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 Ro(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(ed(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 (
|
|
181
181
|
SELECT 1 FROM instruction_suggestion_events ev
|
|
182
182
|
WHERE ev.suggestion_id = ${x.id}
|
|
183
183
|
AND ev.event_type IN ('redundant', 'partial_overlap', 'unresolvable_reference')
|
|
@@ -187,19 +187,19 @@ Only include instructions with a relevance score >= ${.5}. Order by score descen
|
|
|
187
187
|
WHERE e.instruction_id = ${x.instructionId}
|
|
188
188
|
AND e.project_path = ${x.projectPath}
|
|
189
189
|
AND e.status = 'running'
|
|
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(
|
|
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(ed(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 Xc(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 Es(t,r),[{running:s}]=await u.select({running:dr`count(*)::int`}).from(U).where(ed(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(ed(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 (
|
|
191
191
|
SELECT 1 FROM instruction_experiments e
|
|
192
192
|
WHERE e.instruction_id = ${x.instructionId}
|
|
193
193
|
AND e.project_path = ${x.projectPath}
|
|
194
194
|
AND e.status = 'running'
|
|
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(
|
|
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(ed(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 As,asc as AI,desc as SI,inArray as td,sql as Rr}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
196
|
|
|
197
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
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`
|
|
199
|
+
`)}c(vI,"renderAdviceBody");O();import{createHash as gN}from"node:crypto";import{and as II,eq as Pl,inArray as hN,sql as VG}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(Vr).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:Vr.experimentId,arm:Vr.arm}).from(Vr).where(II(Pl(Vr.externalSessionId,r),hN(Vr.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");bs();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,Rr`${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:Rr`(length(${g.content}) / 4)::int`,_rawContent:g.content}).from(x).innerJoin(g,Qt(x.instructionId,g.id)).where(As(Qt(x.userId,t),m,Qt(g.archived,!1),Rr`${x.acceptedAt} IS NULL`,Rr`(${x.dismissedAt} IS NULL OR ${x.dismissedAt} < now() - interval '30 days')`,Qc,...l?[td(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:Rr`(length(${g.content}) / 4)::int`,_rawContent:g.content}).from(x).innerJoin(g,Qt(x.instructionId,g.id)).where(As(Qt(x.userId,t),m,Rr`${x.kind} <> 'add'`,Qt(g.archived,!1),Rr`${x.acceptedAt} IS NULL`,Rr`(${x.dismissedAt} IS NULL OR ${x.dismissedAt} < now() - interval '30 days')`,Qc)).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:fe,...F}=V,he=i&&V.kind==="add"&&V.score>=f&&typeof fe=="string"?Dg(fe):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 fe=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(As(td(g.id,T.map(D=>D.instructionId)),Qt(g.archived,!1)));for(let D of he.reverse())fe.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",fe)}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(As(td(g.id,S.map(he=>he.instructionId)),Qt(g.archived,!1)));for(let he of F.reverse())fe.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",fe)}N=IN.flatMap(F=>V.get(F)??[]),L={addCount:fe.length,costCount:(V.get("remove")??[]).length+(V.get("trim")??[]).length,highConfidenceCount:fe.filter(F=>F.content!==null).length,omitted:H.length-(N.length-fe.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:Rr`count(*)::int`}).from(Ge).innerJoin(x,Qt(Ge.suggestionId,x.id)).where(As(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))],fe=await u.select({id:U.id,instructionId:U.instructionId,source:U.source}).from(U).where(As(Qt(U.userId,t),Qt(U.projectPath,r),Qt(U.status,"running"),td(U.instructionId,V)));fe.length>0&&(J=Object.fromEntries(fe.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(As(Qt(Z.userId,t),td(Z.instructionId,V),Rr`${Z.projectPath} <> ${r}`)),he={};for(let D of F){let re=Xr(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 Ss,and as TI,desc as EN,sql as yn}from"drizzle-orm";var AN=RI.object({threshold:RI.number().min(0).max(1)}),xs=new bN;xs.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(Ss(x.userId,t),yn`${x.acceptedAt} IS NULL`,yn`(${x.dismissedAt} IS NULL OR ${x.dismissedAt} < now() - interval '30 days')`,Qc)).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)})});xs.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(Ss(x.userId,t)),r=await u.select({eventType:Ge.eventType,count:yn`count(*)::int`}).from(Ge).where(Ss(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"}})});xs.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."})});xs.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(Ss(R.id,t)),e.json({threshold:n.data.threshold})):e.json({error:"threshold must be a number between 0 and 1"},400)});xs.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,Ss(x.instructionId,g.id)).where(TI(Ss(x.id,n),Ss(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 Rs}from"drizzle-orm";O();import{sql as nd}from"drizzle-orm";function Mi(e){return nd`
|
|
200
200
|
SELECT project_id::text AS project_id, path, is_worktree, last_seen, is_stale, project_last_seen
|
|
201
201
|
FROM project_canonical_checkouts
|
|
202
|
-
WHERE project_id IN (${
|
|
202
|
+
WHERE project_id IN (${nd.join(e.map(t=>nd`${t}::uuid`),nd`, `)})`}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(nd`
|
|
203
203
|
SELECT c.project_id::text AS project_id,
|
|
204
204
|
c.path AS canonical_path,
|
|
205
205
|
(c.path = ${e}) AS is_canonical
|
|
@@ -211,13 +211,13 @@ Only include instructions with a relevance score >= ${.5}. Order by score descen
|
|
|
211
211
|
ORDER BY pc.last_seen DESC LIMIT 1
|
|
212
212
|
)
|
|
213
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
|
|
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 rd=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)});rd.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:Rs`excluded.score`,reason:Rs`excluded.reason`,generatedAt:Rs`excluded.generated_at`,isStale:Rs`false`,dismissedAt:Rs`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})});rd.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),Rs`EXISTS (
|
|
215
215
|
SELECT 1 FROM instructions i
|
|
216
216
|
WHERE i.id = ${x.instructionId}
|
|
217
217
|
AND i.type = 'skill'
|
|
218
218
|
AND coalesce(i.frontmatter->>'source', '') <> 'insights'
|
|
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")});
|
|
220
|
-
`)}c(
|
|
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")});rd.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,Rs`${ur(x.id,n)}`)}catch{}return e.json({ok:!0})});O();import{Hono as ON}from"hono";import{z as od}from"zod";import{eq as $i,and as jI,desc as NI,sql as Ll}from"drizzle-orm";bs();O();bs();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=Xr(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 Xc(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=od.object({instructionId:od.string().uuid(),projectPath:od.string().min(1),source:od.enum(["manual","groom","trial","borrow"]).default("manual"),treatedShare:od.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 Xc(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 To=new LN;To.route("/",Li);To.route("/",Og);To.route("/",xs);To.route("/",rd);To.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 ko(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(ko,"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 Ts(e){if(typeof e!="string")return null;let t=e.trim();return MN.has(t)?null:t}c(Ts,"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=Ts(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 sd,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(le).where(sd(zt(le.userId,e),zt(le.workerType,"cli-worker"),qN(le.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(sd(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(sd(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(sd(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`
|
|
221
221
|
INSERT INTO agent_jobs (id, user_id, task_kind, payload, dedupe_key)
|
|
222
222
|
SELECT ${n}, ${e.userId}, 'process_judge_review',
|
|
223
223
|
${JSON.stringify({evalTargetId:e.evalTargetId,mirrorId:n})}::jsonb,
|
|
@@ -229,9 +229,9 @@ Only include instructions with a relevance score >= ${.5}. Order by score descen
|
|
|
229
229
|
AND dedupe_key = ${t}
|
|
230
230
|
AND status = 'pending'
|
|
231
231
|
)
|
|
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(
|
|
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(sd(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 jo}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=>jo.raw(`CASE WHEN ${e} IS NULL OR ${e} = '' THEN 0
|
|
233
233
|
ELSE length(${e}) - length(replace(${e}, chr(10), ''))
|
|
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(
|
|
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(jo`
|
|
235
235
|
WITH usage_rows AS (
|
|
236
236
|
SELECT DISTINCT ON (coalesce(metadata->>'requestId', id::text))
|
|
237
237
|
coalesce(
|
|
@@ -266,13 +266,13 @@ Only include instructions with a relevance score >= ${.5}. Order by score descen
|
|
|
266
266
|
(SELECT max(timestamp) FROM session_events WHERE session_id = ${e}) AS last_ts,
|
|
267
267
|
(SELECT coalesce(sum(input_tokens), 0)::bigint FROM usage_rows) AS input_tokens,
|
|
268
268
|
(SELECT coalesce(sum(output_tokens), 0)::bigint FROM usage_rows) AS output_tokens
|
|
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(
|
|
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(jo`
|
|
270
270
|
SELECT coalesce(tool_name, 'unknown') AS tool, count(*)::int AS n
|
|
271
271
|
FROM session_events
|
|
272
272
|
WHERE session_id = ${e}
|
|
273
273
|
AND event_type IN ('tool_call', 'tool_use')
|
|
274
274
|
GROUP BY 1
|
|
275
|
-
`),w={};for(let N of _)w[N.tool]=Number(N.n);let[f]=await Fe.execute(
|
|
275
|
+
`),w={};for(let N of _)w[N.tool]=Number(N.n);let[f]=await Fe.execute(jo`
|
|
276
276
|
WITH tool_events AS (
|
|
277
277
|
SELECT
|
|
278
278
|
tool_name,
|
|
@@ -329,7 +329,7 @@ Only include instructions with a relevance score >= ${.5}. Order by score descen
|
|
|
329
329
|
-- on the way to Postgres as well.
|
|
330
330
|
count(*) FILTER (WHERE left(tool_name, 5) = 'mcp__')::int AS mcp_calls
|
|
331
331
|
FROM tool_events
|
|
332
|
-
`),[h]=await Fe.execute(
|
|
332
|
+
`),[h]=await Fe.execute(jo`
|
|
333
333
|
WITH ordered AS (
|
|
334
334
|
SELECT event_type, timestamp,
|
|
335
335
|
lag(timestamp) OVER (ORDER BY sequence) AS prev_ts
|
|
@@ -354,7 +354,7 @@ Only include instructions with a relevance score >= ${.5}. Order by score descen
|
|
|
354
354
|
COALESCE(jsonb_agg(gap ORDER BY timestamp)
|
|
355
355
|
FILTER (WHERE gap IS NOT NULL), '[]'::jsonb) AS response_times
|
|
356
356
|
FROM user_msgs
|
|
357
|
-
`),v=await Fe.execute(
|
|
357
|
+
`),v=await Fe.execute(jo`
|
|
358
358
|
SELECT category, count(*)::int AS n FROM (
|
|
359
359
|
SELECT CASE
|
|
360
360
|
WHEN e ILIKE '%not found%' OR e ILIKE '%no such file%' OR e ILIKE '%enoent%' THEN 'not_found'
|
|
@@ -376,7 +376,7 @@ Only include instructions with a relevance score >= ${.5}. Order by score descen
|
|
|
376
376
|
) errors
|
|
377
377
|
) classified
|
|
378
378
|
GROUP BY 1
|
|
379
|
-
`),I={};for(let N of v)I[N.category]=Number(N.n);let b=await Fe.execute(
|
|
379
|
+
`),I={};for(let N of v)I[N.category]=Number(N.n);let b=await Fe.execute(jo`
|
|
380
380
|
SELECT DISTINCT coalesce(tool_input->>'file_path', tool_input->>'notebook_path') AS path
|
|
381
381
|
FROM session_events
|
|
382
382
|
WHERE session_id = ${e}
|
|
@@ -384,7 +384,7 @@ Only include instructions with a relevance score >= ${.5}. Order by score descen
|
|
|
384
384
|
AND tool_name IN ('Edit','MultiEdit','Write','NotebookEdit')
|
|
385
385
|
AND jsonb_typeof(tool_input) = 'object'
|
|
386
386
|
AND coalesce(tool_input->>'file_path', tool_input->>'notebook_path') IS NOT NULL
|
|
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:
|
|
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:jo`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 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;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(No,"resolveCallerOrgId");async function zN(e,t,n){if(n)try{await u.execute($I`
|
|
388
388
|
insert into treatment_exposures
|
|
389
389
|
(session_id, user_id, treatment_type, treatment_id, treatment_version, method, exposed_at)
|
|
390
390
|
select ${e}::uuid, ${t}::uuid, 'suggestion', s.instruction_id, 1, 'injected', min(ise.created_at)
|
|
@@ -409,7 +409,7 @@ Only include instructions with a relevance score >= ${.5}. Order by score descen
|
|
|
409
409
|
delete from pending_treatment_exposures
|
|
410
410
|
where external_session_id = ${n}
|
|
411
411
|
and user_id = ${t}::uuid
|
|
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`
|
|
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 id(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(id,"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 ad(e){return!!e&&/^\/(Users|home)\/[^/]+\/?$/.test(e)}c(ad,"isJunkProjectPath");async function XN(e,t,n,r){let o=!!n.projectPath&&n.projectPath.startsWith("/")&&!ad(n.projectPath),s=ad(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 id(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 id(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 No(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 id(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 Tr}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`
|
|
413
413
|
WITH base AS (
|
|
414
414
|
SELECT COALESCE(MAX(sequence), 0) AS seq
|
|
415
415
|
FROM session_events WHERE session_id = ${e}
|
|
@@ -436,7 +436,7 @@ Only include instructions with a relevance score >= ${.5}. Order by score descen
|
|
|
436
436
|
)
|
|
437
437
|
SELECT (SELECT COUNT(*)::int FROM ins) AS inserted,
|
|
438
438
|
(SELECT event_count FROM upd) AS new_count
|
|
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
|
|
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 Po=null;function Ug(){return Po==null&&(Po=eP({drainSession:oP})),Po}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(Po==null)return;Po.stop(),await Po.flush(e);let t=Po.size()+Po.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):(Ic(),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?Tr`${_}::int`:Tr`COALESCE((SELECT MAX(sequence) FROM session_events WHERE session_id = ${n}), 0) + 1`;_=(await u.execute(Tr`
|
|
440
440
|
WITH ins AS (
|
|
441
441
|
INSERT INTO session_events (id, session_id, sequence, event_type, content, tool_name, tool_input, tool_output, token_usage, model, timestamp, metadata)
|
|
442
442
|
SELECT
|
|
@@ -446,12 +446,12 @@ Only include instructions with a relevance score >= ${.5}. Order by score descen
|
|
|
446
446
|
${o.eventType},
|
|
447
447
|
${o.content??null},
|
|
448
448
|
${o.toolName??null},
|
|
449
|
-
${d==null?
|
|
450
|
-
${l==null?
|
|
451
|
-
${m==null?
|
|
449
|
+
${d==null?Tr`NULL`:Tr`${d}::jsonb`},
|
|
450
|
+
${l==null?Tr`NULL`:Tr`${l}::jsonb`},
|
|
451
|
+
${m==null?Tr`NULL`:Tr`${m}::jsonb`},
|
|
452
452
|
${o.model??null},
|
|
453
453
|
${new Date(o.timestamp).toISOString()}::timestamptz,
|
|
454
|
-
${
|
|
454
|
+
${Tr`${p}::jsonb`}
|
|
455
455
|
RETURNING sequence
|
|
456
456
|
),
|
|
457
457
|
upd AS (
|
|
@@ -461,10 +461,10 @@ Only include instructions with a relevance score >= ${.5}. Order by score descen
|
|
|
461
461
|
RETURNING id
|
|
462
462
|
)
|
|
463
463
|
SELECT ins.sequence FROM ins, upd
|
|
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
|
|
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 ks,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(ks(y.id,n),ks(y.userId,t)));if(!r)return e.json({error:"Session not found"},404);if(await u.update(y).set({endedAt:new Date}).where(ks(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(ks(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(ks(z.userId,t),ks(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(ks(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 Oo}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 id(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??dd(o.content);if(!i)return e.json({error:"Could not detect session format. Specify tool parameter."},400);let a=cd(i),d=Wi(a.parse(o.content));if(d.events.length===s.eventCount)return ad(s.projectPath)&&d.projectPath&&!ad(d.projectPath)&&await u.update(y).set({projectPath:d.projectPath,metadata:Oo`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(Oo`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?Oo`COALESCE(${y.metadata}, '{}'::jsonb) || ${JSON.stringify(d.metadata)}::jsonb`:void 0,model:Ts(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??dd(r.content);if(!o)return e.json({error:"Could not detect session format. Specify tool parameter."},400);let s=cd(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 No(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:Oo`COALESCE(${y.metadata}, '{}'::jsonb) || ${JSON.stringify(_)}::jsonb`,model:Ts(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:Oo`COUNT(*)::int`,maxSeq:Oo`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(Oo`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(Oo`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:Ts(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 Qr,asc as ND,desc as uh,sql as We,or as o0,ilike as PD,inArray as op}from"drizzle-orm";var js=new jD;js.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`(
|
|
465
465
|
${y.analysis}->>'outcome' IS NULL
|
|
466
466
|
OR COALESCE((${y.analysis}->>'graderVersion')::int, 0) < ${I}
|
|
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(
|
|
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(Qr(..._)).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(Qr(..._));return e.json({count:Number(v?.count??0)})}let h=await u.select().from(y).where(Qr(..._)).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`
|
|
468
468
|
SELECT session_id, MAX(timestamp) AS last_at
|
|
469
469
|
FROM session_events
|
|
470
470
|
WHERE session_id IN (${We.join(v.map(F=>We`${F}`),We`, `)})
|
|
@@ -494,7 +494,7 @@ Only include instructions with a relevance score >= ${.5}. Order by score descen
|
|
|
494
494
|
AND e.content IS NOT NULL
|
|
495
495
|
AND e.content <> ''
|
|
496
496
|
ORDER BY e.session_id, e.timestamp ASC
|
|
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
|
|
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 fe=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(fe)}return e.json(h)});js.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`
|
|
498
498
|
WITH recent AS (
|
|
499
499
|
SELECT
|
|
500
500
|
s.project_id,
|
|
@@ -591,26 +591,26 @@ Only include instructions with a relevance score >= ${.5}. Order by score descen
|
|
|
591
591
|
) deduped
|
|
592
592
|
ORDER BY last_activity DESC
|
|
593
593
|
LIMIT ${o}
|
|
594
|
-
`),a=Array.from(i).map(d=>d.project_path).filter(d=>typeof d=="string"&&d!=="");return e.json({projectPaths:a})});
|
|
594
|
+
`),a=Array.from(i).map(d=>d.project_path).filter(d=>typeof d=="string"&&d!=="");return e.json({projectPaths:a})});js.get("/sessions/unattributed",async e=>{let t=e.get("userId"),n=Math.min(Number(e.req.query("limit")??200)||200,1e3),r=We`(
|
|
595
595
|
${y.projectId} IS NULL
|
|
596
596
|
OR NOT EXISTS (
|
|
597
597
|
SELECT 1 FROM project_checkouts pc WHERE pc.project_id = ${y.projectId}
|
|
598
598
|
)
|
|
599
599
|
OR ${y.projectPath} ~ '^/(Users|home)/[^/]+/?$'
|
|
600
|
-
)`,[{total:o}]=await u.select({total:We`COUNT(*)::int`}).from(y).where(
|
|
600
|
+
)`,[{total:o}]=await u.select({total:We`COUNT(*)::int`}).from(y).where(Qr(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(Qr(rn(y.userId,t),r)).orderBy(uh(y.startedAt)).limit(n);return e.json({total:Number(o),sessions:s})});js.get("/sessions/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(y).where(Qr(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(Qr(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}})});js.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(Qr(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(Qr(...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 Ns=new DD;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(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)});Ns.post("/sessions/repair-analyzed-at",async e=>{let t=e.get("userId"),n=await u.execute(ra`
|
|
601
601
|
UPDATE sessions
|
|
602
602
|
SET analyzed_at = started_at
|
|
603
603
|
WHERE user_id = ${t}
|
|
604
604
|
AND analysis IS NOT NULL
|
|
605
605
|
AND analyzed_at IS NULL
|
|
606
606
|
RETURNING id
|
|
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();
|
|
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();Ns.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)}))});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 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)});Ns.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`(
|
|
608
608
|
${y.metadata}->'local_session_meta' IS NULL
|
|
609
609
|
OR (
|
|
610
610
|
(${y.metadata}->'local_session_meta'->>'derived_from_events')::boolean IS TRUE
|
|
611
611
|
AND COALESCE((${y.metadata}->'local_session_meta'->>'derived_schema')::int, 1) < ${ql}
|
|
612
612
|
)
|
|
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
|
|
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 hd}from"zod";import{eq as Ut,and as _d,asc as GD,desc as YD,sql as gd}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 yd=new KD;yd.post("/sessions/:id/link",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),{instructionId:o}=hd.object({instructionId:hd.string().uuid()}).parse(r),[s]=await u.select({id:y.id}).from(y).where(_d(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)});yd.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(_d(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=hd.object({sessionId:hd.string().uuid().optional(),backfill:hd.boolean().optional()});async function ZD(e,t,n,r){for(let s=0;s<=4;s++)try{await u.execute(gd`
|
|
614
614
|
insert into instruction_version_identities
|
|
615
615
|
(instruction_id, content_hash, version_ordinal, content, first_seen_at, last_seen_at)
|
|
616
616
|
select
|
|
@@ -632,8 +632,8 @@ Only include instructions with a relevance score >= ${.5}. Order by score descen
|
|
|
632
632
|
first_seen_at = least(
|
|
633
633
|
instruction_version_identities.first_seen_at, excluded.first_seen_at),
|
|
634
634
|
content = coalesce(instruction_version_identities.content, excluded.content)
|
|
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:
|
|
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)),
|
|
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:gd`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?_d(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)=>fd(await Fe.select({sequence:$.sequence,messagesDelta:$.messagesDelta,messagesDeltaRef:$.messagesDeltaRef}).from($).where(_d(Ut($.sessionId,L),Ut($.userId,e),gd`${$.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,fe=r.get(L);if(fe&&(J=fe.id,hh.has(q)&&fe.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)),fe.contentLen=Ce.length,m++}catch(de){console.warn(`[link-instructions] Content backfill failed for instruction ${J}:`,de instanceof Error?de.message:de),_++}let pe=o.get(D);if(pe&&pe.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,pe.id)).for("update");let[{maxVersion:Xe}]=await Le.select({maxVersion:gd`COALESCE(MAX(${xe.versionNumber}), 0)`}).from(xe).where(Ut(xe.instructionId,pe.id)),be=Xe+1;await Le.insert(xe).values({instructionId:pe.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,pe.id))}),ze=!0;break}catch(Le){if(Le.cause?.code==="23505"&&rt<Se)continue;console.warn(`[link-instructions] Version update failed for instruction ${pe.id} (identity: ${D}):`,Le instanceof Error?Le.message:Le),_++;break}ze&&(r.set(L,{id:pe.id,name:pe.name,contentLen:de.length}),pe.contentHash=L,m++)}J=pe.id}else if(!pe)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(_d(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:gd`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();yd.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 Ps,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(Ps(y.id,n),Ps(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(Ps(Ve.sessionId,n)),u.select({snapshotCount:lp`count(*)::int`}).from($).where(Ps($.sessionId,n)),u.selectDistinct({ref:$.messagesDeltaRef}).from($).where(h0(Ps($.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(Ps(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(Ps(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(()=>(pd(),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 Co=new oO;Co.route("/",ta);Co.route("/",js);Co.route("/",Ns);Co.route("/",yd);Co.route("/",_h);O();import{Hono as sO}from"hono";import{eq as yh}from"drizzle-orm";import{sql as oa}from"drizzle-orm";var wd=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'";wd.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`
|
|
637
637
|
WITH session_activity AS (
|
|
638
638
|
SELECT
|
|
639
639
|
s.id,
|
|
@@ -685,7 +685,7 @@ Only include instructions with a relevance score >= ${.5}. Order by score descen
|
|
|
685
685
|
WHERE s.org_id = ${o}
|
|
686
686
|
AND s.origin <> 'internal_worker'
|
|
687
687
|
AND s.project_id IS NOT NULL
|
|
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})});
|
|
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})});wd.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`
|
|
689
689
|
SELECT EXISTS(
|
|
690
690
|
SELECT 1 FROM sessions
|
|
691
691
|
WHERE project_id = ${n} AND org_id = ${r} AND origin <> 'internal_worker'
|
|
@@ -709,7 +709,7 @@ Only include instructions with a relevance score >= ${.5}. Order by score descen
|
|
|
709
709
|
)::int AS active_session_count,
|
|
710
710
|
MAX(last_at) AS last_activity_at
|
|
711
711
|
FROM session_activity
|
|
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
|
|
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 Lo,sql as w0,desc as aO,inArray as cO}from"drizzle-orm";var kr=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()});kr.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(Lo(...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:Cc(l)}}))});kr.get("/packs/:id",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await u.select().from(Ue).where(Lo(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:Cc(s),instructions:o.map(i=>({...i.instruction,position:i.position,slotOverrides:i.slotOverrides,addedAt:i.addedAt}))})});kr.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:Cc(0)},201)});kr.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(Lo(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(Lo(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)});kr.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(Lo(gt(Ue.id,t),gt(Ue.createdBy,n),gt(Ue.archived,!1)));return o?(await u.delete(Me).where(Lo(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)});kr.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(Lo(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})});kr.post("/packs/:id/fork",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(Ue).where(Lo(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`
|
|
713
713
|
WITH RECURSIVE ancestors AS (
|
|
714
714
|
SELECT id, name, forked_from_id, version, scope, created_by, created_at::text, 1 as depth
|
|
715
715
|
FROM instructions
|
|
@@ -735,7 +735,7 @@ Only include instructions with a relevance score >= ${.5}. Order by score descen
|
|
|
735
735
|
WHERE i.archived = false AND d.depth < 20
|
|
736
736
|
)
|
|
737
737
|
SELECT * FROM descendants ORDER BY depth ASC
|
|
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
|
|
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 Mo}from"zod";import{eq as lr,and as sa,desc as Ih,gt as bh,lt as gO,sql as ln}from"drizzle-orm";function Id(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(Id,"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 ${vd(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 ${vd(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 ${vd(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(`${vd(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(`${vd(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 vd(e){return e.reduce((t,n)=>t+n.count,0)}c(vd,"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 ia=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=Mo.object({workerType:Mo.enum(["mcp","cli-worker","gateway","proxy"]),clientName:Mo.string().min(1),clientVersion:Mo.string().optional(),workerVersion:Mo.string().optional(),metadata:Mo.record(Mo.unknown()).optional(),status:Mo.enum(["alive","shutting_down"]).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`
|
|
739
739
|
SELECT coalesce(task_kind, ${a}) AS kind,
|
|
740
740
|
count(*)::int AS n,
|
|
741
741
|
min(created_at) AS oldest
|
|
@@ -760,7 +760,7 @@ Only include instructions with a relevance score >= ${.5}. Order by score descen
|
|
|
760
760
|
AND status = 'pending'
|
|
761
761
|
AND created_at < ${n}::timestamptz
|
|
762
762
|
GROUP BY 1
|
|
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
|
|
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 bO(e){let t=e?.machine;if(!t||typeof t!="object")return null;let n=t;if(typeof n.suspends!="number"||typeof n.stalls!="number"||typeof n.since!="string")return null;let r=n.lastPause,o=r&&typeof r=="object"&&typeof r.detectedAt=="string"?r:null;return{suspends:n.suspends,stalls:n.stalls,pausedMs:typeof n.pausedMs=="number"?n.pausedMs:0,lastPause:o,since:n.since}}c(bO,"reportedMachine");function xh(e){return!e||!Array.isArray(e.capabilities)?null:e.capabilities.filter(t=>typeof t=="string")}c(xh,"reportedCapabilities");function EO(e,t){if(e!=="cli-worker")return null;let n=Id(t);if(n===null||n.claude||n.codex)return null;let r=xh(t),o=r===null?[...qc]:r.filter(s=>qc.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(EO,"checkEngineAdvisory");function AO(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(AO,"isBehind");function SO(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?AO(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(SO,"checkWorkerAdvisory");ia.post("/workers/heartbeat",async e=>{let t=e.get("userId"),n=await e.req.json(),r=wO.parse(n);if(r.status==="shutting_down")return await u.delete(le).where(sa(lr(le.userId,t),lr(le.workerType,r.workerType),lr(le.clientName,r.clientName))),e.json({status:"removed"});await u.insert(le).values({userId:t,workerType:r.workerType,clientName:r.clientName,clientVersion:r.clientVersion??null,workerVersion:r.workerVersion??null,metadata:r.metadata??null}).onConflictDoUpdate({target:[le.userId,le.workerType,le.clientName],set:{lastHeartbeat:new Date,clientVersion:r.clientVersion??null,workerVersion:r.workerVersion??null,metadata:r.metadata??null}}),u.delete(le).where(sa(lr(le.userId,t),gO(le.lastHeartbeat,new Date(Date.now()-hO)))).catch(()=>{});let o=await Wf().catch(()=>null),s=SO(r.workerType,r.metadata,r.clientVersion,o);return s??=EO(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:le.lastHeartbeat}).from(le).where(sa(lr(le.userId,e),lr(le.workerType,"cli-worker"),bh(le.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:le.lastHeartbeat,metadata:le.metadata}).from(le).where(sa(lr(le.userId,e),lr(le.workerType,"cli-worker"))).orderBy(Ih(le.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");ia.get("/workers/status",async e=>{let t=e.get("userId"),n=new Date(Date.now()-Ah),r=await u.select().from(le).where(sa(lr(le.userId,t),bh(le.lastHeartbeat,n))).orderBy(Ih(le.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)});ia.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:le.lastHeartbeat,clientName:le.clientName,clientVersion:le.clientVersion,metadata:le.metadata}).from(le).where(sa(lr(le.userId,t),lr(le.workerType,"cli-worker"),bh(le.lastHeartbeat,n))).orderBy(Ih(le.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?Id(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,machine:bO(d)},pending:o,verdict:p})});O();import{Hono as PO}from"hono";import{z as yp}from"zod";import{and as Rh,desc as L0,eq as jr,inArray as DO,isNull as OO,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([Es(e,n.projectId),Ro(e,n.projectId),Pi(e,n.projectId)]),[i,a,d,l]=await Promise.all([u.execute(x0`
|
|
764
764
|
SELECT (SELECT count(*)::int FROM instruction_experiments e
|
|
765
765
|
WHERE e.user_id = ${e}::uuid AND e.status = 'running'
|
|
766
766
|
AND e.project_path = ${n.canonicalPath}) AS running,
|
|
@@ -875,7 +875,7 @@ Only include instructions with a relevance score >= ${.5}. Order by score descen
|
|
|
875
875
|
FROM recommendation_applications a
|
|
876
876
|
WHERE user_id = ${e}::uuid
|
|
877
877
|
GROUP BY ROLLUP (status)
|
|
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
|
|
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 xO}from"drizzle-orm";var RO={blocking:!1,totalAwaitingReview:0,targets:[]};async function hp(e){let t=await u.execute(xO`
|
|
879
879
|
WITH enrolled AS (
|
|
880
880
|
-- Segment resolved ONCE per enrolled target. Leaving the function call in
|
|
881
881
|
-- the join predicate below made Postgres re-evaluate it per row.
|
|
@@ -927,7 +927,7 @@ Only include instructions with a relevance score >= ${.5}. Order by score descen
|
|
|
927
927
|
GROUP BY id, name
|
|
928
928
|
)
|
|
929
929
|
SELECT * FROM per_target
|
|
930
|
-
`);return
|
|
930
|
+
`);return TO(t)}c(hp,"loadReviewGate");function TO(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?RO:{blocking:!0,totalAwaitingReview:t.reduce((n,r)=>n+r.awaitingReview,0),targets:t}}c(TO,"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"],kO=["cron_instruction_evolution","cron_instruction_training","cron_auto_accept_suggestions","cron_suggest_instructions","cron_refine_cases","cron_retire_unused_skills","process_insights"];function aa(e){switch(e){case"evolution":return Ds`kind IN (${Ds.join(kO.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(aa,"clauseFor");function D0(e){return e==="all"?null:aa(e)}c(D0,"filterClause");O();import{sql as O0}from"drizzle-orm";var jO={insights:"regenerate_insights_jobs",training:"enqueue_instruction_training",autoAccept:"enqueue_auto_accept_suggestions",evolution:"enqueue_instruction_evolution",autorun:"enqueue_eval_autorun"};async function NO(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(NO,"runProducer");async function C0(){let e={};for(let[t,n]of Object.entries(jO))e[t]=await NO(n);return e}c(C0,"runAllProducers");var bd=new PO;var CO=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")}),LO=6e4,MO=3600*1e3,$O=8;function M0(e,t){return Be.join(vh.map(({table:n,defaultKind:r,labelIdSql:o,labelTextSql:s})=>Be`
|
|
931
931
|
SELECT id::text AS id,
|
|
932
932
|
${n} AS source_table,
|
|
933
933
|
coalesce(task_kind, ${r}) AS kind,
|
|
@@ -944,7 +944,7 @@ Only include instructions with a relevance score >= ${.5}. Order by score descen
|
|
|
944
944
|
result->>'decision' AS decision,
|
|
945
945
|
error
|
|
946
946
|
FROM ${Be.raw(n)}
|
|
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=
|
|
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=CO.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
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`
|
|
949
949
|
WITH proj AS (
|
|
950
950
|
SELECT s.project_id,
|
|
@@ -953,7 +953,7 @@ Only include instructions with a relevance score >= ${.5}. Order by score descen
|
|
|
953
953
|
WHERE s.user_id = ${t}::uuid AND s.project_id IS NOT NULL
|
|
954
954
|
GROUP BY s.project_id
|
|
955
955
|
ORDER BY last_activity DESC
|
|
956
|
-
LIMIT ${
|
|
956
|
+
LIMIT ${$O}
|
|
957
957
|
)
|
|
958
958
|
SELECT p.project_id::text AS project_id,
|
|
959
959
|
pr.name AS name,
|
|
@@ -985,11 +985,11 @@ Only include instructions with a relevance score >= ${.5}. Order by score descen
|
|
|
985
985
|
LEFT JOIN project_canonical_checkouts c ON c.project_id = p.project_id
|
|
986
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`
|
|
987
987
|
SELECT count(*)::int AS total,
|
|
988
|
-
count(*) FILTER (WHERE ${
|
|
989
|
-
count(*) FILTER (WHERE ${
|
|
990
|
-
count(*) FILTER (WHERE ${
|
|
991
|
-
count(*) FILTER (WHERE ${
|
|
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(
|
|
988
|
+
count(*) FILTER (WHERE ${aa("evolution")})::int AS evolution,
|
|
989
|
+
count(*) FILTER (WHERE ${aa("decided")})::int AS decided,
|
|
990
|
+
count(*) FILTER (WHERE ${aa("skipped")})::int AS skipped,
|
|
991
|
+
count(*) FILTER (WHERE ${aa("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(DO(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,jr(ae.evalTargetId,k.id)).where(jr(ae.userId,t)).orderBy(L0(ae.createdAt)).limit(r),q=u.execute(Be`
|
|
993
993
|
SELECT count(*)::int AS decisions,
|
|
994
994
|
count(*) FILTER (WHERE p.applied)::int AS applied,
|
|
995
995
|
count(*) FILTER (WHERE p.created_at > ${i})::int AS window_decisions,
|
|
@@ -1031,7 +1031,7 @@ Only include instructions with a relevance score >= ${.5}. Order by score descen
|
|
|
1031
1031
|
and ${x.declinedAt} is null
|
|
1032
1032
|
and ${x.dismissedAt} is null
|
|
1033
1033
|
and not ${x.isStale}
|
|
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`
|
|
1034
|
+
)::int`}).from(x).where(jr(x.userId,t)),[J,ce,V,fe]=await Promise.all([u.select({n:Be`count(*)::int`}).from(ae).where(jr(ae.userId,t)),u.select({n:Be`count(*)::int`}).from(U).where(Rh(jr(U.userId,t),jr(U.status,"running"))),u.select({kind:x.kind,n:Be`count(*)::int`}).from(x).where(Rh(jr(x.userId,t),OO(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(jr(Re.userId,t))]),[F,he]=await Promise.all([q,B]),D=F[0],re=he[0],[Ce,St]=await Promise.all([w,f]),pe=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:le.lastHeartbeat,clientName:le.clientName,clientVersion:le.clientVersion,metadata:le.metadata}).from(le).where(Rh(jr(le.userId,t),jr(le.workerType,"cli-worker"),Be`${le.lastHeartbeat} > ${new Date(E-MO).toISOString()}::timestamptz`)).orderBy(L0(le.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<LO,ageSeconds:rt==null?null:Math.round(rt/1e3),capabilities:null,busy:P.length>0,engines:ze?Id(ze.metadata):null},be=await a,cn=await pe,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:fe[0]?.entries??0,distinct:fe[0]?.distinct??0,repeated:fe[0]?.repeated??0,dismissed:fe[0]?.dismissed??0,maxTimesGenerated:fe[0]?.maxTimesGenerated??0,lastSeenAt:fe[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 qO}from"hono";var wp=new qO;wp.get("/loop/review-gate",async e=>{let t=e.get("userId");return e.json(_p(await hp(t)))});O();import{Hono as HO}from"hono";import{z as Lt}from"zod";import{and as BO,eq as Cn,sql as Os}from"drizzle-orm";O();import{and as UO,eq as $0}from"drizzle-orm";async function nt(e,t){let[n]=await u.select({id:k.id}).from(k).where(UO($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 HO,FO=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 Ro(t,n),bounds:Bn},defaults:{minScore:_n.MIN_SCORE,maxPerRun:_n.MAX_PER_RUN,maxPerWindow:_n.MAX_PER_WINDOW,windowDays:_n.WINDOW_DAYS}})});var WO={minScore:"autoAcceptMinScore",maxPerRun:"autoAcceptMaxPerRun",maxPerWindow:"autoAcceptMaxPerWindow",windowDays:"autoAcceptWindowDays"};function zO(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(zO,"mergeLimitOverrides");Gn.patch("/settings/auto-accept",async e=>{let t=e.get("userId"),n=FO.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=zO(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 Ro(t,o)})}let i={};r!==void 0&&(i.autoAcceptSuggestions=r);for(let[a,d]of Object.entries(WO)){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 Ro(t,null)})});var VO=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 JO=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=JO.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(BO(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=VO.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 KO=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 Es(t,r);return e.json({...o,defaults:{maxConcurrent:Ci.MAX_CONCURRENT,maxPerRun:Ci.MAX_PER_RUN},bounds:Zc})});Gn.patch("/settings/trial-limits",async e=>{let t=e.get("userId"),n=KO.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(Zc)){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 Es(t,null))});O();import{Hono as GO}from"hono";import{and as YO,eq as XO,sql as QO}from"drizzle-orm";var Ep=new GO;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(YO(XO(y.userId,t),QO`${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 ZO}from"node:crypto";import{Hono as eC}from"hono";import{z as Ln}from"zod";import{eq as Nr,and as Ap,desc as tC,sql as nC}from"drizzle-orm";var $o=new eC,rC=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({})}),oC=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()});$o.post("/eval-targets",async e=>{let t=e.get("userId"),n=await e.req.json(),r=rC.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)});$o.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(nC`${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(tC(k.updatedAt)).limit(d).offset(p);return e.json(m)});$o.get("/eval-targets/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(k).where(Ap(Nr(k.id,n),Nr(k.userId,t)));return r?e.json(r):e.json({error:"Eval target not found"},404)});$o.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(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:ZO("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})});$o.put("/eval-targets/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=oC.parse(r),[s]=await u.select().from(k).where(Ap(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 sC}from"hono";import{z as Jt}from"zod";import{eq as Sp,and as B0,isNull as iC,desc as aC}from"drizzle-orm";var ca=new sC,cC=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([])});ca.post("/eval-targets/:id/evals",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=cC.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)});ca.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),iC(Ee.retiredAt))).orderBy(aC(Ee.createdAt));return e.json(s)});var dC=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"});ca.patch("/eval-targets/:id/evals/:evalId",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=e.req.param("evalId"),o=dC.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 lC}from"hono";import{z as De}from"zod";import{createHash as pC}from"node:crypto";import{and as Rp,eq as pn,gte as z0,desc as mC,sql as kh}from"drizzle-orm";import{eq as uC,sql as Zr}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 da(e,t){let r=await u.execute(Zr`
|
|
1035
1035
|
SELECT
|
|
1036
1036
|
r.configuration,
|
|
1037
1037
|
r.created_at,
|
|
@@ -1075,9 +1075,9 @@ Only include instructions with a relevance score >= ${.5}. Order by score descen
|
|
|
1075
1075
|
AND ev.retired_at IS NULL
|
|
1076
1076
|
AND r.grading->'summary'->>'pass_rate' IS NOT NULL
|
|
1077
1077
|
AND r.configuration IN ('with_target', 'without_target')
|
|
1078
|
-
`),s=(await u.execute(
|
|
1078
|
+
`),s=(await u.execute(Zr`
|
|
1079
1079
|
SELECT metadata->>'graderModel' AS pin FROM eval_targets WHERE id = ${t}
|
|
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,
|
|
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,uo=f.get(fn)??{runs:0,labeledRuns:0,latestRunAt:M.created_at};if(uo.runs+=1,nr&&(uo.labeledRuns+=1),new Date(M.created_at).getTime()>new Date(uo.latestRunAt).getTime()&&(uo.latestRunAt=M.created_at),f.set(fn,uo),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:Zr`count(*)::int`,llmAnchors:Zr`count(*) FILTER (WHERE ${et.judgeMethod} = 'llm' AND ${et.judgeModel} IS NOT DISTINCT FROM ${i})::int`,llmApproved:Zr`count(*) FILTER (WHERE ${et.judgeMethod} = 'llm' AND ${et.judgeModel} IS NOT DISTINCT FROM ${i} AND ${et.verdict} = 'approve')::int`,staleLlmAnchors:Zr`count(*) FILTER (WHERE ${et.judgeMethod} = 'llm' AND ${et.judgeModel} IS DISTINCT FROM ${i})::int`,flagged:Zr`count(*) FILTER (WHERE ${et.flag} IS NOT NULL)::int`}).from(et).where(uC(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(Zr`
|
|
1081
1081
|
SELECT
|
|
1082
1082
|
r.eval_target_id::text AS target_id,
|
|
1083
1083
|
r.configuration,
|
|
@@ -1119,7 +1119,7 @@ Only include instructions with a relevance score >= ${.5}. Order by score descen
|
|
|
1119
1119
|
AND r.grading->'summary'->>'pass_rate' IS NOT NULL
|
|
1120
1120
|
AND r.configuration IN ('with_target', 'without_target')
|
|
1121
1121
|
AND r.grading->>'judge_model' IS NOT DISTINCT FROM ${i}
|
|
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,
|
|
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,fe=q.pooledApplied||B.pooledApplied,F=V>=3&&ce>=Ti,he=c(M=>({rectifier:M.rectifierUsed,variance:M.variance,sufficient:F}),"asInput"),D=S>0?Vc(m.with_target,m.without_target,fe?{withPooledRectifier:he(q),withoutPooledRectifier:he(B)}:{}):null,re=vg(m.with_target,m.without_target,{humanLabeledRuns:w,...fe?{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=[],pe=[],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)}),pe.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:fe,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:pe[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(da,"computeJudgeCalibration");async function W0(e){return(await u.execute(Zr`
|
|
1123
1123
|
WITH current_judge AS (
|
|
1124
1124
|
-- Canonical segment (00193), not a fourth hand-copy of the recency rule.
|
|
1125
1125
|
-- The review queue and the adequacy gate MUST scope to the same judge, or
|
|
@@ -1144,7 +1144,7 @@ Only include instructions with a relevance score >= ${.5}. Order by score descen
|
|
|
1144
1144
|
AND (SELECT count(*) FROM jsonb_array_elements(r.grading->'expectations') e
|
|
1145
1145
|
WHERE COALESCE(e->>'method', 'llm') = 'llm'
|
|
1146
1146
|
AND COALESCE(e->>'errored', 'false') <> 'true') > COALESCE(a.llm_annotated, 0)
|
|
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`
|
|
1147
|
+
`))[0]?.remaining??0}c(W0,"countRunsAwaitingReview");var Cs=new lC,xp=c(e=>pC("sha256").update(e).digest("hex"),"sha256"),fC=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()}),gC=De.object({candidateContent:De.string().min(1),proposalSource:De.enum(["llm","groom","human"]),proposalRationale:De.string().default(""),pairs:De.array(fC).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=gC.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 da(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??Gc,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(mC(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()-Gc*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 ${Gc}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 _C}from"hono";import{z as ge}from"zod";import{and as ua,desc as yC,eq as jt}from"drizzle-orm";var V0=["proposed","ready","applied","measuring","improved","inconclusive","harmful","rollback_ready","reverted","failed"],hC={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 hC[e].includes(t)}c(J0,"canTransitionRecommendationApplication");var la=new _C,K0=ge.enum(["claude_code","codex","shared"]),G0=ge.enum(V0),wC=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)})]),vC=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($c).optional(),targets:ge.array(ge.string().min(1)).optional(),inverse:wC.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()});la.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(ua(...r)).orderBy(yC(Te.updatedAt)).limit(n.limit);return e.json({applications:o.map(({application:s,...i})=>({...s,...i}))})});la.post("/recommendation-applications",async e=>{let t=e.get("userId"),n=vC.parse(await e.req.json()),[r]=await u.select({id:g.id}).from(g).where(ua(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(ua(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(ua(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 IC=ge.object({status:G0,beforeHash:ge.string().optional(),appliedHash:ge.string().optional(),verdictDetail:ge.string().optional()});la.post("/recommendation-applications/:id/transition",async e=>{let t=e.get("userId"),n=IC.parse(await e.req.json()),[r]=await u.select().from(Te).where(ua(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(ua(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 bC}from"hono";import{z as yt}from"zod";import{eq as pr,and as jh,asc as EC,desc as Y0,isNull as AC,inArray as SC,sql as xC}from"drizzle-orm";var Ls=new bC,RC=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()}),TC=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=RC.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(pr(Ie.jobId,r.jobId),pr(Ie.evalId,r.evalId),pr(Ie.configuration,r.configuration),pr(Ie.runNumber,r.runNumber),pr(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,_=[pr(Ie.evalTargetId,n)];r&&_.push(pr(Ie.iteration,parseInt(r,10))),o&&_.push(pr(Ie.configuration,o)),e.req.query("activeCasesOnly")==="1"&&_.push(SC(Ie.evalId,u.select({id:Ee.id}).from(Ee).where(jh(pr(Ee.evalTargetId,n),AC(Ee.retiredAt)))));let w=e.req.query("candidateContentHash");w&&_.push(xC`${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(pr(Ie.jobId,I.data))}let v=(await u.select().from(Ie).where(jh(..._)).orderBy(Y0(Ie.createdAt),EC(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=TC.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(pr(or.evalTargetId,n)).orderBy(Y0(or.createdAt));return e.json(o)});O();import{Hono as kC}from"hono";import{z as Kt}from"zod";import{eq as Ms,and as Q0,or as jC,desc as NC,asc as PC}from"drizzle-orm";import{alias as X0}from"drizzle-orm/pg-core";var pa=new kC,DC=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")});pa.post("/eval-comparisons",async e=>{let t=e.get("userId"),n=await e.req.json(),r=DC.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)});pa.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),jC(Ms(ot.targetAId,n),Ms(ot.targetBId,n)))).orderBy(NC(ot.createdAt),PC(ot.id)).limit(a).offset(l);return e.json(_.map(w=>({...w,rawOutput:null})))});pa.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 MC}from"hono";import{z as ma}from"zod";import{eq as fa,and as Nh,desc as $C,asc as qC,inArray as UC,sql as HC}from"drizzle-orm";O();import{sql as OC}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 CC(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(CC,"reviewerAgreementReport");async function tE(e){return(await u.execute(OC`
|
|
1148
1148
|
SELECT
|
|
1149
1149
|
j.reviewer_engine,
|
|
1150
1150
|
array_agg(DISTINCT j.reviewer_model) AS models,
|
|
@@ -1176,7 +1176,7 @@ Only include instructions with a relevance score >= ${.5}. Order by score descen
|
|
|
1176
1176
|
) j
|
|
1177
1177
|
GROUP BY j.reviewer_engine
|
|
1178
1178
|
ORDER BY j.reviewer_engine
|
|
1179
|
-
`)).map(n=>
|
|
1179
|
+
`)).map(n=>CC({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 LC}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(LC(k.id,t));if(!o||o.userId!==e)return;let s=await da(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 eo=new MC,BC=ma.object({verdict:ma.enum(["approve","reject"]),flag:ma.enum(["bad_grade","bad_assertion"]).nullable().optional(),note:ma.string().max(2e3).nullable().optional()});async function nE(e,t){let n=ma.string().uuid().safeParse(e);if(!n.success)return null;let[r]=await u.select().from(Ie).where(fa(Ie.id,n.data));return r&&await nt(r.evalTargetId,t)?r:null}c(nE,"loadOwnedRun");eo.put("/eval-runs/:runId/annotations/:index",async e=>{let t=e.get("userId"),n=e.req.param("runId"),r=e.req.param("index"),o=BC.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)});eo.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(fa(et.evalRunId,o.id),fa(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)});eo.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)});eo.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=[fa(et.evalTargetId,n)],m=e.req.query("runId");if(m){let w=ma.string().uuid().safeParse(m);if(!w.success)return e.json({error:"Invalid runId"},400);p.push(fa(et.evalRunId,w.data))}let _=await u.select().from(et).where(Nh(...p)).orderBy($C(et.createdAt),qC(et.id)).limit(a).offset(l);return e.json(_)});eo.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([da(t,n),tE(n)]);return e.json({...o,reviewers:s})});eo.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(HC`
|
|
1180
1180
|
WITH current_judge AS (
|
|
1181
1181
|
-- Canonical segment (00193) — NOT a fifth hand-copy of the recency rule.
|
|
1182
1182
|
-- Labeling a stale-judge run produces an anchor the calibration ignores,
|
|
@@ -1230,14 +1230,14 @@ Only include instructions with a relevance score >= ${.5}. Order by score descen
|
|
|
1230
1230
|
SELECT * FROM queue
|
|
1231
1231
|
ORDER BY cohort_rank, (llm_annotated > 0) DESC, random()
|
|
1232
1232
|
LIMIT ${i}
|
|
1233
|
-
`),d=a.map(_=>_.id),l=d.length?await u.select().from(et).where(Nh(
|
|
1233
|
+
`),d=a.map(_=>_.id),l=d.length?await u.select().from(et).where(Nh(fa(et.evalTargetId,n),UC(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 FC}from"hono";import{z as vn}from"zod";import{eq as Yn,and as Sd,isNull as Ph,sql as ga,inArray as WC}from"drizzle-orm";var $s=new FC,zC=vn.object({evalRunId:vn.string().uuid(),expectationIndex:vn.number().int().min(0),expectationText:vn.string(),judgePassed:vn.boolean(),humanPassed:vn.boolean(),reviewerPassed:vn.boolean()}),VC=vn.object({reviewerEngine:vn.enum(["claude","codex"]),reviewerModel:vn.string().min(1).max(200),verdicts:vn.array(zC).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=VC.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(WC(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(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:ga`CASE WHEN ${me.reviewerPassed} <> ${d.reviewerPassed} THEN NULL ELSE ${me.resolvedAt} END`,resolution:ga`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:ga`count(*)::int`}).from(me).where(Sd(Yn(me.evalTargetId,n),Ph(me.resolvedAt),ga`${me.reviewerPassed} <> ${me.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:me.evalRunId,expectationIndex:me.expectationIndex,reviewerEngine:me.reviewerEngine,reviewerModel:me.reviewerModel,reviewerPassed:me.reviewerPassed,humanPassed:me.humanPassed,resolvedAt:me.resolvedAt}).from(me).where(Yn(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:ga`LEFT(${Ie.outputs}->>'transcript', 1200)`}).from(me).innerJoin(Ie,Yn(Ie.id,me.evalRunId)).leftJoin(Ee,Yn(Ee.id,Ie.evalId)).where(Sd(Yn(me.evalTargetId,n),Ph(me.resolvedAt),ga`${me.reviewerPassed} <> ${me.humanPassed}`)).orderBy(me.evalRunId,me.expectationIndex);return e.json(o)});var JC=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=JC.parse(await e.req.json()),[s]=await u.select().from(me).where(Sd(Yn(me.id,r.data),Yn(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(Sd(Yn(me.evalRunId,s.evalRunId),Yn(me.expectationIndex,s.expectationIndex),Yn(me.userId,t),Ph(me.resolvedAt))).returning({id:me.id});return e.json({resolved:i.length})});O();import{createHash as GC}from"node:crypto";import{Hono as YC}from"hono";import{z as oe}from"zod";import{eq as sn,and as ha,desc as Oh,asc as XC,sql as Pr,isNull as QC}from"drizzle-orm";import{alias as rE}from"drizzle-orm/pg-core";function KC(e){if(e===null||typeof e!="object")return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}c(KC,"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(KC(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 ZC(){return{enabled:process.env.RULEMETRIC_OFFLOAD_DELTAS==="1"||process.env.RULEMETRIC_OFFLOAD_DELTAS==="true",thresholdBytes:Number(process.env.OFFLOAD_GZIP_THRESHOLD_BYTES)||49152}}c(ZC,"offloadConfig");function oE(e){return GC("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 Pr`COALESCE(
|
|
1234
1234
|
CASE WHEN jsonb_typeof(${e}) = 'array' THEN ${e} END,
|
|
1235
1235
|
CASE WHEN jsonb_typeof(${t}) = 'array' THEN ${t} END,
|
|
1236
1236
|
'[]'::jsonb
|
|
1237
|
-
)`}c(iE,"resolvedJsonArray");async function
|
|
1237
|
+
)`}c(iE,"resolvedJsonArray");async function eL(e){let{enabled:t,thresholdBytes:n}=ZC();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(eL,"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 _a=new YC,tL=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()}),nL=100,rL=500;async function aE(e,t){let[n]=await u.select({id:$.id,sequence:$.sequence}).from($).where(ha(sn($.sessionId,e),sn($.requestHash,t))).limit(1);return n??null}c(aE,"findSnapshotByHash");_a.post("/sessions/:id/context-snapshots",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=Tp(tL.parse(r)),[s]=await u.select({id:y.id,projectPath:y.projectPath,projectId:y.projectId}).from(y).where(ha(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(ha(sn(y.id,n),QC(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 eL(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)});_a.get("/sessions/:id/context-snapshots",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=Number(e.req.query("limit")||nL),o=Math.min(Math.max(1,r),rL),s=Math.max(0,Number(e.req.query("offset")||0)),[i]=await u.select({id:y.id}).from(y).where(ha(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:Pr`jsonb_array_length(${iE(p.content,$.injectedInstructions)})`,toolsLight:Pr`COALESCE((
|
|
1238
1238
|
SELECT jsonb_agg(jsonb_build_object('name', t->'name', 'description', left(COALESCE(t->>'description', ''), 80)))
|
|
1239
1239
|
FROM jsonb_array_elements(${iE(l.content,$.tools)}) AS t
|
|
1240
|
-
), '[]'::jsonb)`,metadataLight:
|
|
1240
|
+
), '[]'::jsonb)`,metadataLight:Pr`jsonb_strip_nulls(jsonb_build_object(
|
|
1241
1241
|
'usage', ${$.metadata}->'usage',
|
|
1242
1242
|
'response', ${$.metadata}->'response',
|
|
1243
1243
|
'thinking', ${$.metadata}->'thinking',
|
|
@@ -1252,18 +1252,18 @@ Only include instructions with a relevance score >= ${.5}. Order by score descen
|
|
|
1252
1252
|
)
|
|
1253
1253
|
ELSE NULL
|
|
1254
1254
|
END
|
|
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)))});
|
|
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)))});_a.get("/context-snapshots/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await Fe.select().from($).where(ha(sn($.id,n),sn($.userId,t)));if(!r)return e.json({error:"Snapshot not found"},404);let o=r.messagesDeltaRef?await md(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(Pr`${kn.hash} IN (${Pr.join(s.map(p=>Pr`${p}`),Pr`, `)})`):[],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)=>fd(await Fe.select({sequence:$.sequence,messagesDelta:$.messagesDelta,messagesDeltaRef:$.messagesDeltaRef}).from($).where(ha(sn($.sessionId,r.sessionId),Pr`${$.sequence} <= ${r.sequence}`,Pr`${$.sequence} > ${_}`)).orderBy(XC($.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 oL}from"hono";import{z as qo}from"zod";import{eq as mr,and as xd,desc as sL,ne as iL}from"drizzle-orm";import{z as Dr}from"zod";var kp=Dr.object({parallel:Dr.number().int().positive().default(1),runsPerEval:Dr.number().int().positive().default(1),iteration:Dr.number().int().positive().default(1),skipBaseline:Dr.boolean().default(!1),skipGrading:Dr.boolean().default(!1),generateIfEmpty:Dr.boolean().default(!1),model:Dr.string().optional(),graderModel:Dr.string().optional(),timeout:Dr.number().int().positive().default(12e4)}).default({});var Uo=new oL,aL=qo.object({evalTargetId:qo.string().uuid(),config:kp});Uo.post("/eval-jobs",async e=>{let t=e.get("userId"),n=await e.req.json(),r=aL.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(mr(Ne.id,o));return e.json({...i,noLiveWorker:s},201)});Uo.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(mr(Ne.evalTargetId,n),mr(Ne.userId,t))).orderBy(sL(Ne.createdAt));return e.json(r)});Uo.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(mr(Ne.id,n),mr(Ne.userId,t))).returning();return i?e.json(i):e.json({error:"Job not found"},404)});var cL=qo.object({status:qo.enum(["running","completed","failed"]).optional(),attempts:qo.number().int().nonnegative().optional(),error:qo.string().optional(),result:qo.record(qo.unknown()).optional()});Uo.patch("/eval-jobs/:id/state",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=cL.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(mr(Ne.id,n),mr(Ne.userId,t),iL(Ne.status,"cancelled"))).returning();if(!s){let[i]=await u.select().from(Ne).where(xd(mr(Ne.id,n),mr(Ne.userId,t)));return i?e.json(i):e.json({error:"Job not found"},404)}return e.json(s)});Uo.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(mr(Ne.id,n),mr(Ne.userId,t))).returning();return r?e.json(r):e.json({error:"Job not found"},404)});O();import{Hono as dL}from"hono";import{z as qs}from"zod";import{eq as ya,and as Ch,isNull as uL,desc as lL,sql as cE}from"drizzle-orm";var jp=new dL,pL=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 mL(e){let t=await u.select({systemPrompt:$.systemPrompt,systemHash:$.systemHash,metadata:$.metadata}).from($).where(cE`${$.metadata}->'contextItems' @> ${JSON.stringify([{content_hash:e}])}::jsonb`).orderBy(lL($.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(mL,"resolveContentFromSnapshot");jp.post("/eval-from-context",async e=>{let t=e.get("userId"),n=await e.req.json(),r=pL.parse(n),o=!1,s;if(r.evalTargetId){let[_]=await u.select({id:k.id}).from(k).where(Ch(ya(k.id,r.evalTargetId),ya(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(ya(k.userId,t),cE`${k.metadata}->>'content_hash' = ${r.contentHash}`)).limit(1);if(_)s=_.id;else{let w=r.content;if(w||(w=await mL(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(ya(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(ya(Ee.evalTargetId,s),uL(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(ya(Ne.id,l));return e.json({evalTargetId:s,evalJobId:m.id,evalCasesCreated:0,generationDeferred:a,isNewTarget:o,noLiveWorker:p},201)});import{Hono as wM}from"hono";O();import{Hono as fL}from"hono";import{and as dE,eq as Lh,sql as In}from"drizzle-orm";var Mh=new fL;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`
|
|
1256
1256
|
select project_id, project_path, count(*)::int as n
|
|
1257
1257
|
from sessions
|
|
1258
1258
|
where user_id = ${t}
|
|
1259
1259
|
and project_id is not null
|
|
1260
1260
|
and project_path is not null
|
|
1261
1261
|
group by project_id, project_path
|
|
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
|
|
1263
|
-
${r}`).digest("hex")}c(pE,"recommendationEntryHash");var
|
|
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 DL from"node:fs";import OL from"node:path";import{Hono as CL}from"hono";import{and as Fh,desc as Wh,eq as Fo,gte as LL,ilike as yE,lte as ML,sql as wa}from"drizzle-orm";O();import{createHash as gL}from"node:crypto";import{and as hL,eq as uE,inArray as _L,sql as Ho}from"drizzle-orm";var yL=90,wL=.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 gL("sha256").update(`${e}
|
|
1263
|
+
${r}`).digest("hex")}c(pE,"recommendationEntryHash");var vL=new Set(["42883","42P01","42704"]),IL=2,Np=!1;function bL(e){let t=e?.code;return typeof t=="string"&&vL.has(t)?"capability-absent":Tc(e)||Rc(e)||hi(e)||Zu(e)?"load":"isolable"}c(bL,"classifyProbeFailure");function EL(e,t){return async n=>[...await u.execute(Ho`
|
|
1264
1264
|
SELECT p.probe_hash, m.content_hash, m.times_generated, m.last_job_id,
|
|
1265
1265
|
m.dismissed_at, m.sim
|
|
1266
|
-
FROM (VALUES ${
|
|
1266
|
+
FROM (VALUES ${Ho.join(n.map(o=>Ho`(${o.hash}::text, ${o.category}::text, ${o.label}::text)`),Ho`, `)}) AS p(probe_hash, category, label)
|
|
1267
1267
|
-- CROSS JOIN, not LEFT JOIN LATERAL: a probe with no row in its
|
|
1268
1268
|
-- category simply produces no output row, which reads back as "no
|
|
1269
1269
|
-- alias" — the same outcome the per-probe query gave via an empty
|
|
@@ -1279,7 +1279,7 @@ ${r}`).digest("hex")}c(pE,"recommendationEntryHash");var wL=new Set(["42883","42
|
|
|
1279
1279
|
ORDER BY sim DESC
|
|
1280
1280
|
LIMIT 1
|
|
1281
1281
|
) m
|
|
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`
|
|
1282
|
+
`)]}c(EL,"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=bL(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<IL&&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(hL(uE(Re.userId,t),uE(Re.projectPath,r),_L(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()],EL(t,r),h);for(let I of v)Number(I.sim)<wL||(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:Ho`now()`,timesGenerated:Ho`${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()-yL*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:Ho`now()`}).onConflictDoUpdate({target:[Re.userId,Re.projectPath,Re.contentHash],set:{dismissedAt:Ho`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 Bo(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(Bo,"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 AL(e){return Math.round(e*100)/100}c(AL,"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:AL(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 SL,desc as xL,eq as gE,isNull as RL,lte as TL,or as kL,gt as jL}from"drizzle-orm";function Td(e){return e==null?0:typeof e=="number"?e:Number(e)}c(Td,"toNumber");async function to(e,t,n,r,o="anthropic"){let s=await e.select().from(st).where(SL(gE(st.provider,o),gE(st.modelId,n),TL(st.effectiveFrom,r),kL(RL(st.effectiveUntil),jL(st.effectiveUntil,r)))).orderBy(xL(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(to,"priceUsageFromDb");var kd=1e6,hE=10*6e4,NL=500,Us=new Map;function PL(e,t,n){return`${e}:${t}:${n.toISOString().slice(0,7)}`}c(PL,"rateKey");function _E(e,t){let n=Bo(e),r=PL(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([to(Fe,a,e,t,n),to(Fe,d,e,t,n),to(Fe,l,e,t,n),to(Fe,p,e,t,n),to(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>NL)for(let[a,d]of Us)Date.now()-d.at>=hE&&Us.delete(a)}return s}c(_E,"getRates");var jd=new CL;function $L(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($L,"generateAutoSuggestions");var qL=45e3,Dp=new Map,UL=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<qL?d.data:null)??await UL.run(a,async()=>{let w=[Fo(y.userId,t)];r?w.push(Fo(y.projectId,r)):n&&w.push(yE(y.projectPath,`%${ct(n)}%`)),i&&w.push(Fo(y.tool,i)),o&&w.push(LL(y.startedAt,new Date(o))),s&&w.push(ML(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,ss=Math.round((ut+xt+Et+gn)*100)/100;return{inputUsd:ut,outputUsd:xt,cacheReadUsd:Et,cacheWriteUsd:gn,totalUsd:ss,estimated:Ke.estimated}},"getPriced"),b={},A={},S={},E={},T={},P={},H={},N={},L={},q={},B=[],J=[],ce=[],V=0,fe=0,F=0,he=0,D=0,re=0,Ce=0,St=0,pe=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,uo=0,Ha=null,Ba=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"),Fa={},Wa={},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(wa`
|
|
1283
1283
|
SELECT
|
|
1284
1284
|
deduped.session_id AS "sessionId",
|
|
1285
1285
|
COALESCE(deduped.model, ${su}) AS "model",
|
|
@@ -1293,17 +1293,17 @@ ${r}`).digest("hex")}c(pE,"recommendationEntryHash");var wL=new Set(["42883","42
|
|
|
1293
1293
|
SELECT DISTINCT ON (se.session_id, COALESCE(se.metadata->>'requestId', se.id::text))
|
|
1294
1294
|
se.session_id, se.model, se.token_usage
|
|
1295
1295
|
FROM session_events se
|
|
1296
|
-
WHERE se.session_id IN (${
|
|
1296
|
+
WHERE se.session_id IN (${wa.join(h.map(G=>wa`${G.id}`),wa`, `)})
|
|
1297
1297
|
AND se.token_usage IS NOT NULL
|
|
1298
1298
|
ORDER BY se.session_id, COALESCE(se.metadata->>'requestId', se.id::text), se.sequence
|
|
1299
1299
|
) deduped
|
|
1300
1300
|
GROUP BY deduped.session_id, deduped.model
|
|
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`
|
|
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,pe+=Et.cacheReadUsd,de+=Et.cacheWriteUsd;let gn=Et.inputUsd+Et.outputUsd+Et.cacheReadUsd+Et.cacheWriteUsd,ss=G.tool??"unknown",ty=Fa[su]??iu();au(ty,at,Yt,Sn,xt,gn),Fa[su]=ty;let ny=Wa[ss]??iu();au(ny,at,Yt,Sn,xt,gn),Wa[ss]=ny}if(_e){M++;let at=_e.user_message_count??0;V+=at,fe+=(_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();(Ha===null||at<Ha)&&(Ha=at),(Ba===null||at>Ba)&&(Ba=at),at<kS&&uo++}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,pe+=ut.cacheReadUsd,de+=ut.cacheWriteUsd,F+=_e,he+=Qe,D+=Ke,re+=dn;let xt=ut.inputUsd+ut.outputUsd+ut.cacheReadUsd+ut.cacheWriteUsd,Et=Fa[G.model]??iu();au(Et,_e,Qe,Ke,dn,xt),Fa[G.model]=Et;let gn=NS.get(G.sessionId)??"unknown",ss=Wa[gn]??iu();au(ss,_e,Qe,Ke,dn,xt),Wa[gn]=ss}let os=c(G=>Math.round(G*100)/100,"round2"),PS=Ce+St+pe+de,DS=os(PS),OS={inputUsd:os(Ce),outputUsd:os(St),cacheReadUsd:os(pe),cacheWriteUsd:os(de)},ym={};for(let[G,_e]of Object.entries(Fa))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:os(_e.cost_usd)};let wm={};for(let[G,_e]of Object.entries(Wa))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:os(_e.cost_usd)};let lo={"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?lo["2-10s"]++:G<30?lo["10-30s"]++:G<60?lo["30s-1m"]++:G<120?lo["1-2m"]++:G<300?lo["2-5m"]++:G<900?lo["5-15m"]++:lo[">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(fe*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:lo,total_samples:J.length},parallel_sessions:{events:Q_,sessions_involved:Z_},analysis_freshness:{with_timestamp:nr,pre_instrumentation:fn,stale_30d:uo,oldest_analyzed_at:Ha?new Date(Ha).toISOString():null,newest_analyzed_at:Ba?new Date(Ba).toISOString():null}};Qs.autoAddAvailable=!!(n&&DL.existsSync(OL.join(n,"CLAUDE.md")));let du=[Fo(z.userId,t),Fo(z.status,"completed")];r?du.push(Fo(z.projectId,r)):n?du.push(yE(z.projectPath,`%${ct(n)}%`)):du.push(wa`${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=$L({totalSessions:h.length,sessionsWithAnalysis:j,toolCounts:b,toolErrorCategories:q,friction:L,outcomes:P,sessionsUsingMcp:Nt,sessionsUsingTaskAgent:ht,totalToolErrors:be,totalMessages:V,totalDurationHours:fe});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(Fo(Re.userId,t),Fo(Re.projectPath,n))).orderBy(wa`${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 HL}from"hono";import{and as Mn,count as BL,eq as Oe,ilike as FL,inArray as WL,sql as bn}from"drizzle-orm";bs();var Bs=new HL,Hs=c(e=>Is(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(FL(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,pe=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&&(pe++,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:pe,outcomeScores:de,avgOutcomeScore:de.length>0?Math.round(de.reduce((rt,Le)=>rt+Le,0)/de.length*100)/100:null,avgToolErrors:pe>0?Math.round(re/pe*10)/10:null,avgDurationMinutes:pe>0?Math.round(Ce/pe*10)/10:null,avgLinesChanged:pe>0?Math.round(St/pe):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 pe=`${D??"(no-project)"}|${w(re)}`,de=h.get(pe);de||(de={key:pe,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},h.set(pe,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((pe,de,Se,ze,rt)=>{let Le=re.get(pe);Le||(Le=new Map,re.set(pe,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 pe of r){let de=Hs(pe.analysis),Se=D(pe);de==null||!Se||(Ce.add(Se),St(Se,pe.projectId,pe.startedAt,de,!0))}for(let pe of l){let de=Hs(pe.analysis),Se=D(pe);de==null||!Se||!Ce.has(Se)||St(Se,pe.projectId,pe.startedAt,de,!1)}return[...Ce].map(pe=>({segment:pe,strata:[...re.get(pe)?.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=>Ts(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:BL(),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=Xr(ce?.content,ce?.name),fe=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=fe.length>0||F.length>0?{verdicts:fe,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:Ir.versionOrdinal,contentHash:Ir.contentHash,firstSeenAt:Ir.firstSeenAt,contentLength:bn`COALESCE(LENGTH(${Ir.content}), 0)::int`}).from(Ir).where(Oe(Ir.instructionId,n)).orderBy(Ir.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 zL=/^[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=>zL.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"),WL(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 JL}from"hono";import{and as Fs,count as Vh,eq as $n,inArray as bE,sql as Or}from"drizzle-orm";O();import{sql as wE}from"drizzle-orm";var vE=30,zh=14,VL=c(e=>({captureHealthy:!1,reason:e,candidates:[]}),"DARK");async function IE(e){let[t]=await u.execute(wE`
|
|
1302
1302
|
SELECT count(*)::int AS n
|
|
1303
1303
|
FROM public.skill_usage
|
|
1304
1304
|
WHERE user_id = ${e}::uuid
|
|
1305
1305
|
AND invoked_at > now() - make_interval(days => ${zh})
|
|
1306
|
-
`);return!t||t.n===0?
|
|
1306
|
+
`);return!t||t.n===0?VL(`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`
|
|
1307
1307
|
SELECT
|
|
1308
1308
|
i.id AS instruction_id,
|
|
1309
1309
|
i.name AS name,
|
|
@@ -1335,14 +1335,14 @@ ${r}`).digest("hex")}c(pE,"recommendationEntryHash");var wL=new Set(["42883","42
|
|
|
1335
1335
|
AND i.created_at < now() - make_interval(days => ${vE})
|
|
1336
1336
|
AND coalesce(u.invocations, 0) = 0
|
|
1337
1337
|
ORDER BY i.created_at
|
|
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(`
|
|
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 JL,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),Or`${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:Or`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),Or`${g.createdAt} < now() - interval '30 days'`,Or`${g.type} is distinct from 'skill'`)).groupBy(g.id).having(Or`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"),Or`${ne.sessionId} is not null`)),u.select({id:y.id,projectId:y.projectId,outcome:Or`${y.analysis}->>'outcome'`,startedAt:y.startedAt}).from(y).where(Fs($n(y.userId,t),Or`${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"),Or`${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:fe,score:F,time:he}]of w){let D=fe??"(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=vs(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:Or`(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 KL}from"hono";import{z as va}from"zod";import{and as fr,desc as EE,eq as wt,getTableColumns as GL,gte as Gh,ilike as Op,isNull as YL,ne as XL,or as QL,sql as Ia}from"drizzle-orm";var Wo=new KL;function ZL(e,t){let n=t?Op(z.projectPath,`%${ct(t)}%`):void 0;return e&&n?QL(wt(z.projectId,e),fr(YL(z.projectId),n)):e?wt(z.projectId,e):n}c(ZL,"insightsJobProjectScope");Wo.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(Ia`${z.projectPath} IS NULL`);let[w]=await u.select({id:z.id}).from(z).where(fr(..._)).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(Ia`${z.projectPath} IS NULL`);let[h]=await u.select({completedAt:z.completedAt}).from(z).where(fr(...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:Ia`COUNT(*)`}).from(y).where(fr(...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)});Wo.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=ZL(o,r??null);i&&s.push(i);let{result:a,...d}=GL(z),l=await u.select(d).from(z).where(fr(...s)).orderBy(EE(z.createdAt)).limit(n);return e.json(l)});Wo.get("/insights-jobs/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(z).where(fr(wt(z.id,n),wt(z.userId,t)));return r?e.json(r):e.json({error:"Job not found"},404)});Wo.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(fr(wt(z.id,n),wt(z.userId,t))).returning();return i?e.json(i):e.json({error:"Job not found"},404)});var eM=va.object({status:va.enum(["running","completed","failed"]).optional(),attempts:va.number().int().nonnegative().optional(),error:va.string().optional(),result:va.record(va.unknown()).optional()});Wo.patch("/insights-jobs/:id/state",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=eM.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(fr(wt(z.id,n),wt(z.userId,t),XL(z.status,"cancelled"))).returning();if(!s){let[i]=await u.select().from(z).where(fr(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 tM=14400*1e3;Wo.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()-tM),i=await u.select({projectId:y.projectId,sessionCount:Ia`COUNT(*)`}).from(y).where(fr(wt(y.userId,t),Ia`${y.projectId} IS NOT NULL`)).groupBy(y.projectId).orderBy(Ia`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(fr(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 nM from"node:path";import{createHash as rM}from"node:crypto";import{Hono as oM}from"hono";import{and as AE,desc as sM,eq as Nd}from"drizzle-orm";var Yh=new oM;async function iM(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(sM(g.createdAt)).limit(1);if(!o){let a=Cp.readFileSync(n,"utf-8"),d=rM("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(iM,"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=nM.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(`
|
|
1339
1339
|
`)?`
|
|
1340
1340
|
`:`
|
|
1341
1341
|
|
|
1342
1342
|
`;Cp.writeFileSync(i,a+d+o.trim()+`
|
|
1343
|
-
`);let l=await
|
|
1344
|
-
`)){let r=n.trim();if(/^(`{3,}|~{3,})/.test(r)){t=!t;continue}if(!(t||!r)&&!r.startsWith("#"))return r}return""}c(
|
|
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
|
|
1343
|
+
`);let l=await iM(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 uM}from"hono";import{z as ke}from"zod";O();import{createHash as aM}from"node:crypto";import{and as Xh,eq as zo,inArray as cM,sql as Pd}from"drizzle-orm";var Qh=.5,Zh=.4;function dM(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(dM,"firstProseLine");var SE=c(e=>aM("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(zo(g.createdBy,t),zo(g.contentHash,P),zo(g.archived,!1))).limit(1);if(H)return{id:H.id,created:!1};let N=c(L=>({name:L,description:dM(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(zo(g.type,"skill"),zo(g.archived,!1),cM(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(zo(g.createdBy,t),zo(g.contentHash,P),zo(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 uM,lM=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=lM.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 pM}from"hono";import{and as mM,desc as fM,eq as t_,isNotNull as gM}from"drizzle-orm";var n_=new pM;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(mM(t_(z.userId,t),t_(z.projectPath,n),t_(z.status,"completed"),gM(z.result))).orderBy(fM(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 hM}from"hono";import{and as r_,eq as Ws,inArray as kE,isNotNull as _M,or as yM,sql as o_}from"drizzle-orm";var s_=new hM;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?yM(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),_M(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 wM;Xn.route("/",Mh);Xn.route("/",jd);Xn.route("/",Bs);Xn.route("/",Kh);Xn.route("/",Wo);Xn.route("/",e_);Xn.route("/",n_);Xn.route("/",s_);Xn.route("/",Yh);O();import{Hono as vM}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 vM,i_=["fact","decision","correction","convention"],jE=4e3,IM=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()}),bM=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
|
|
1346
1346
|
when ${W.source} = 'manual' or (${W.trustClass} = 'helpful' and ${f}) then 0
|
|
1347
1347
|
when ${W.trustClass} = 'neutral' and ${f} then 1
|
|
1348
1348
|
else 2
|
|
@@ -1377,7 +1377,7 @@ ${r}`).digest("hex")}c(pE,"recommendationEntryHash");var wL=new Set(["42883","42
|
|
|
1377
1377
|
else 2 end,
|
|
1378
1378
|
m.updated_at desc
|
|
1379
1379
|
limit ${s}
|
|
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.
|
|
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=IM.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=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().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 EM=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=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,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 AM=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=AM.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 SM=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=SM.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 xM,createHash as RM}from"node:crypto";import{Hono as TM}from"hono";import{z as NE}from"zod";import{eq as $p,and as kM,isNull as jM}from"drizzle-orm";var ba=new TM;function NM(){let n=`rm_${xM(32).toString("base64url")}`,r=RM("sha256").update(n).digest("hex"),o=n.slice(0,11);return{plaintext:n,hash:r,prefix:o}}c(NM,"generateApiKey");var PM=NE.object({name:NE.string().min(1).max(100)});ba.post("/auth/api-keys",async e=>{let t=e.get("userId"),n=await e.req.json(),r=PM.parse(n),{plaintext:o,hash:s,prefix:i}=NM(),[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)});ba.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)});ba.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(kM($p(Ae.id,n),$p(Ae.userId,t),jM(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 DM}from"hono";import{z as no}from"zod";import{eq as Pt,and as ro,isNull as OM,sql as c_}from"drizzle-orm";import{randomUUID as d_}from"node:crypto";var oo=new DM;oo.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(ro(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(ro(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)});oo.get("/eval-targets/:id/conversations",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(He).where(ro(Pt(He.evalTargetId,n),Pt(He.userId,t),Pt(He.status,"active")));return r?e.json(r):e.json(null)});var CM=no.object({content:no.string().min(1).max(5e3)});oo.post("/eval-conversations/:id/messages",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=CM.parse(await e.req.json()),[o]=await u.select().from(He).where(ro(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 LM=no.object({content:no.string(),type:no.enum(["text","status","results","proposal","applied","generated","comparison"]).default("text"),data:no.record(no.unknown()).optional()});oo.post("/eval-conversations/:id/messages/assistant",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=LM.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(ro(Pt(He.id,n),Pt(He.userId,t))),e.json(o,201)});oo.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(ro(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 MM=no.object({messageId:no.string().uuid()});oo.post("/eval-conversations/:id/apply-proposal",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=MM.parse(await e.req.json()),[o]=await u.select().from(He).where(ro(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(ro(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(ro(Pt(Ee.evalTargetId,a.id),OM(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 Ea from"node:fs";import*as Vs from"node:path";import{createHash as $M}from"node:crypto";import{fileURLToPath as qM}from"node:url";import{createRequire as UM}from"node:module";import{Hono as HM}from"hono";import{z as vt}from"zod";import{eq as zs,desc as BM,and as FM,sql as WM}from"drizzle-orm";var zM=Vs.dirname(qM(import.meta.url)),Vo=new HM,qp=null,Up=null;function VM(){let e=process.env.RULEMETRIC_SKILLS_REGISTRY_PATH;if(e&&Ea.existsSync(e))return e;try{let n=UM(import.meta.url),r=Vs.dirname(n.resolve("@rulemetric/skills-registry/package.json")),o=Vs.join(r,"registry.json");if(Ea.existsSync(o))return o}catch{}let t=Vs.resolve(zM,"../../../../packages/skills-registry/registry.json");return Ea.existsSync(t)?t:null}c(VM,"resolveRegistryPath");function PE(){if(qp)return qp;let e=VM();return e?(qp=JSON.parse(Ea.readFileSync(e,"utf-8")),qp):null}c(PE,"loadRegistry");function JM(){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(JM,"loadRegistryIndex");Vo.get("/skills",e=>{let t=JM();return t?e.json(t):e.json({error:"Skills registry not found"},404)});Vo.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(yo).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:yo.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)});Vo.get("/skills/submissions/approved",async e=>{let n=(await u.select().from(yo).where(zs(yo.status,"approved")).orderBy(BM(yo.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()}),die=vt.object({skills:vt.array(DE).max(5e3)});Vo.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=$M("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(FM(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:WM`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})});Vo.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 i$}from"hono";import{desc as a$,eq as c$}from"drizzle-orm";O();import{eq as CE,and as r$}from"drizzle-orm";O();var KM=/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,GM="claude-haiku-4-5-20251001",YM=1e3,XM=.7,QM=`You extract pricing and rate-limit changes from AI provider release notes.
|
|
1381
1381
|
Return a JSON object: {
|
|
1382
1382
|
"observations": [
|
|
1383
1383
|
{
|
|
@@ -1392,36 +1392,36 @@ Return a JSON object: {
|
|
|
1392
1392
|
}
|
|
1393
1393
|
Only emit observations if the release notes EXPLICITLY state a numeric value.
|
|
1394
1394
|
Do NOT speculate. Do NOT emit observations for "increased by X%" without an absolute number.
|
|
1395
|
-
Return { "observations": [] } if nothing concrete.`;function
|
|
1395
|
+
Return { "observations": [] } if nothing concrete.`;function ZM(){let e=process.env.ANTHROPIC_API_KEY;if(!e)return null;let t=Lc("anthropic",e);return async n=>{let r=await t.complete(n,{model:GM,maxTokens:YM,temperature:0});return{text:r.text,usage:{inputTokens:r.usage?.inputTokens??0,outputTokens:r.usage?.outputTokens??0}}}}c(ZM,"defaultLlm");async function e$(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(e$,"defaultObserve");function t$(e){return`${QM}
|
|
1396
1396
|
|
|
1397
1397
|
Release notes (harness=${e.harness}, version=${e.version}):
|
|
1398
1398
|
|
|
1399
|
-
${e.body??""}`}c(
|
|
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-${
|
|
1402
|
-
`)}return"onboarding@resend.dev"}c(
|
|
1399
|
+
${e.body??""}`}c(t$,"buildPrompt");function n$(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(n$,"parseLlmJson");async function OE(e,t={}){let n=e.body??"";if(!KM.test(n))return{observations:[],llm_called:!1,reason:"no keywords matched"};let r=t.llm===void 0?ZM():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(t$(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=n$(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??e$;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:XM,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 o$(e){return e.prerelease===!0||/-(alpha|beta|rc)\b/i.test(e.tag_name)}c(o$,"isPrerelease");function s$(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(s$,"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(o$(l))continue;let p=s$(l.body??"");if((await u.select({id:qt.id}).from(qt).where(r$(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 i$;Dd.get("/harness-releases",async e=>{let t=e.req.query("harness"),n=Math.min(Number(e.req.query("limit")??50),100),r=t?c$(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(a$(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 d$}from"hono";import{and as Bp,desc as u$,eq as Aa,isNull as u_,sql as l$}from"drizzle-orm";var Sa=new d$;Sa.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(Aa(Rt.userId,t),u_(Rt.readAt)):Aa(Rt.userId,t),i=await u.select().from(Rt).where(s).orderBy(u$(Rt.createdAt)).limit(n).offset(r),[{count:a}]=await u.select({count:l$`count(*)::int`}).from(Rt).where(Bp(Aa(Rt.userId,t),u_(Rt.readAt)));return e.json({items:i,unreadCount:a})});Sa.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(Aa(Rt.id,t),Aa(Rt.userId,n))).returning();return r?e.json(r):e.json({error:"Not found"},404)});Sa.post("/notifications/read-all",async e=>{let t=e.get("userId");return await u.update(Rt).set({readAt:new Date}).where(Bp(Aa(Rt.userId,t),u_(Rt.readAt))),e.json({success:!0})});O();import{Hono as p$}from"hono";import{z as an}from"zod";import{eq as Cr,and as Fp,desc as m$,ne as f$}from"drizzle-orm";var Jo=new p$;function g$(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(g$,"parseTerminalTargetResult");async function h$(e){let t=g$(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(Cr(y.userId,e.userId),Cr(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(h$,"upsertTerminalTargetFromLaunchResult");var _$=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()})});Jo.post("/launch-jobs",async e=>{let t=e.get("userId"),n=await e.req.json(),r=_$.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(Cr(ue.id,o));return e.json({...i,noLiveWorker:s},201)});Jo.get("/launch-jobs",async e=>{let t=e.get("userId"),n=Number(e.req.query("limit")??50),r=await u.select().from(ue).where(Cr(ue.userId,t)).orderBy(m$(ue.createdAt)).limit(n);return e.json(r)});var y$=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()});Jo.patch("/launch-jobs/:id/state",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=y$.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(Cr(ue.id,n),Cr(ue.userId,t),f$(ue.status,"cancelled"))).returning();if(!s){let[i]=await u.select().from(ue).where(Fp(Cr(ue.id,n),Cr(ue.userId,t)));return i?e.json(i):e.json({error:"Job not found"},404)}return r.result!==void 0&&await h$({userId:t,jobId:n,config:s.config,result:r.result}),e.json(s)});Jo.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(Cr(ue.id,n),Cr(ue.userId,t))).returning();return r?e.json(r):e.json({error:"Job not found"},404)});Jo.get("/launchers",async e=>{let{getAvailableLaunchers:t}=await Promise.resolve().then(()=>(tp(),Xb));return e.json(t())});O();import{Hono as w$}from"hono";import{z as Zn}from"zod";import{eq as je,and as Gt,desc as zp,inArray as Wp,isNull as v$,ne as I$}from"drizzle-orm";tp();var Lr=new w$,b$=Zn.object({tool:Zn.string().min(1),model:Zn.string().optional(),label:Zn.string().optional()}),E$=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(b$).min(1).max(8)});function A$(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/(^-|-$)/g,"")||"tool"}c(A$,"sanitizeTool");var S$=new Set(["pending","claimed","running"]);var x$=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>x$:!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=>S$.has(a.status));return n.length>0&&n.every(a=>a.status==="failed")&&!r?"failed":o||s&&r?"running":r&&!o&&!s?"completed":"pending"}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),I$(te.status,"cancelled")))}catch{}}c(qE,"persistRolledUpStatus");function R$(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(R$,"frictionCount");async function T$(e,t){if(!e||typeof e!="object")return null;let n=e,r="claude-sonnet-4-6",o=Bo(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 to(u,s,r,t,o);return i?{...i,estimated:!0}:null}c(T$,"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),v$(y.runId),Wp(y.projectPath,[...o]))).returning({id:y.id})).length}}c(UE,"linkRunSessions");Lr.post("/runs",async e=>{let t=e.get("userId"),n=await e.req.json(),r=E$.parse(n),o=await No(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}-${A$(_.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)});Lr.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})});Lr.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 T$(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:R$(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})});Lr.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})});Lr.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)});Lr.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})});Lr.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 k$}from"hono";import{z as Js}from"zod";import{and as xa,desc as l_,eq as Zt,or as HE}from"drizzle-orm";var Ks=new k$;function j$(e,t){return{liveSend:e?.kind==="tmux"&&e.status==="active"&&t,fallbackResume:!0,tmuxAvailable:e?.kind==="tmux"&&e.status!=="fallback_only",workerOnline:t}}c(j$,"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(xa(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(xa(Zt(Ze.userId,t),o)).orderBy(l_(Ze.lastSeenAt)).limit(1),i=await Bi(t);return e.json({target:s??null,capabilities:j$(s??null,i),...s?{}:{reason:"no_target"}})});var BE=Js.enum(["active","missing","unknown","fallback_only"]),N$=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=N$.parse(await e.req.json()),[o]=await u.select({id:y.id,externalSessionId:y.externalSessionId,projectPath:y.projectPath}).from(y).where(xa(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(xa(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 P$=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=P$.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(xa(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(xa(Zt(Ze.userId,t),...r?[Zt(Ze.status,r)]:[])).orderBy(l_(Ze.lastSeenAt)).limit(100);return e.json({targets:o})});import{Hono as y1}from"hono";O();import{Hono as X$}from"hono";import{z as Mr}from"zod";import{eq as gr,and as YE,asc as XE,sql as Q$,isNull as QE}from"drizzle-orm";O();import{eq as p_,and as D$}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(D$(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 J$}from"zod";import{randomBytes as K$}from"node:crypto";import{eq as g_,and as G$,sql as Y$}from"drizzle-orm";import{randomBytes as O$}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-${O$(8).toString("hex")}`,provider:"noop"}}c(m_,"sendNoopEmail");var Vp=null;async function C$(){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(C$,"getClient");var FE=!1;function L$(){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(L$,"resolveFromEmail");async function WE(e){let t=e.fromName??"RuleMetric",n=L$(),r=`${t} <${n}>`,o=await C$(),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 M$="#2DD4BF",$$="#0d9488",q$="#0A0C12",Jp="#1a1a1a",Kp="#666666",VE="#f5f5f7",U$="#ffffff",JE="#e5e5e9";function H$(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(H$,"formatExpiresAt");function Ra(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}c(Ra,"escapeHtml");function B$(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(B$,"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=H$(s),{article:d,description:l}=B$(r),p=`<!doctype html>
|
|
1403
1403
|
<html lang="en">
|
|
1404
1404
|
<head>
|
|
1405
1405
|
<meta charset="utf-8" />
|
|
1406
1406
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
1407
|
-
<title>${
|
|
1407
|
+
<title>${Ra(i)}</title>
|
|
1408
1408
|
</head>
|
|
1409
1409
|
<body style="margin:0;padding:0;background:${VE};font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;color:${Jp};">
|
|
1410
1410
|
<table role="presentation" width="100%" cellspacing="0" cellpadding="0" border="0" style="background:${VE};padding:32px 16px;">
|
|
1411
1411
|
<tr>
|
|
1412
1412
|
<td align="center">
|
|
1413
|
-
<table role="presentation" width="560" cellspacing="0" cellpadding="0" border="0" style="max-width:560px;background:${
|
|
1413
|
+
<table role="presentation" width="560" cellspacing="0" cellpadding="0" border="0" style="max-width:560px;background:${U$};border:1px solid ${JE};border-radius:8px;overflow:hidden;">
|
|
1414
1414
|
<tr>
|
|
1415
1415
|
<td style="padding:32px 32px 8px 32px;">
|
|
1416
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 ${
|
|
1417
|
+
You've been invited to ${Ra(t)}
|
|
1418
1418
|
</h1>
|
|
1419
1419
|
<p style="margin:0 0 16px 0;font-size:15px;line-height:1.5;color:${Jp};">
|
|
1420
1420
|
Hi there,
|
|
1421
1421
|
</p>
|
|
1422
1422
|
<p style="margin:0 0 16px 0;font-size:15px;line-height:1.5;color:${Jp};">
|
|
1423
|
-
<strong>${
|
|
1424
|
-
<strong>${
|
|
1423
|
+
<strong>${Ra(n)}</strong> invited you to join
|
|
1424
|
+
<strong>${Ra(t)}</strong> on RuleMetric as ${d}.
|
|
1425
1425
|
</p>
|
|
1426
1426
|
<p style="margin:0 0 24px 0;font-size:15px;line-height:1.5;color:${Kp};">
|
|
1427
1427
|
${l}
|
|
@@ -1430,8 +1430,8 @@ ${e.body??""}`}c(e$,"buildPrompt");function t$(e){let t=e.trim().replace(/^```(?
|
|
|
1430
1430
|
</tr>
|
|
1431
1431
|
<tr>
|
|
1432
1432
|
<td align="center" style="padding:0 32px 8px 32px;">
|
|
1433
|
-
<a href="${
|
|
1434
|
-
style="display:inline-block;padding:12px 24px;background:${
|
|
1433
|
+
<a href="${Ra(o)}"
|
|
1434
|
+
style="display:inline-block;padding:12px 24px;background:${M$};color:${q$};text-decoration:none;border-radius:6px;font-size:15px;font-weight:600;">
|
|
1435
1435
|
Accept invitation
|
|
1436
1436
|
</a>
|
|
1437
1437
|
</td>
|
|
@@ -1441,8 +1441,8 @@ ${e.body??""}`}c(e$,"buildPrompt");function t$(e){let t=e.trim().replace(/^```(?
|
|
|
1441
1441
|
<p style="margin:0 0 8px 0;font-size:13px;line-height:1.5;color:${Kp};">
|
|
1442
1442
|
Or copy and paste this link into your browser:
|
|
1443
1443
|
</p>
|
|
1444
|
-
<p style="margin:0 0 24px 0;font-size:13px;line-height:1.5;color:${
|
|
1445
|
-
${
|
|
1444
|
+
<p style="margin:0 0 24px 0;font-size:13px;line-height:1.5;color:${$$};word-break:break-all;">
|
|
1445
|
+
${Ra(o)}
|
|
1446
1446
|
</p>
|
|
1447
1447
|
<p style="margin:0 0 24px 0;font-size:13px;line-height:1.5;color:${Kp};">
|
|
1448
1448
|
This invitation expires on <strong>${a}</strong>.
|
|
@@ -1462,16 +1462,16 @@ ${e.body??""}`}c(e$,"buildPrompt");function t$(e){let t=e.trim().replace(/^```(?
|
|
|
1462
1462
|
</table>
|
|
1463
1463
|
</body>
|
|
1464
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
|
|
1466
|
-
`)),t){case"resend":return
|
|
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
|
|
1465
|
+
`);return{subject:i,html:p,text:m}}c(f_,"renderInvitation");function F$(){let e=process.env.RULEMETRIC_EMAIL_PROVIDER;return e==="resend"||e==="smtp"||e==="noop"?e:process.env.RESEND_API_KEY?"resend":"noop"}c(F$,"selectEmailProvider");var W$=new Set(["test","example","invalid","localhost"]),z$=/^example\.(com|net|org)$/;function V$(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!!(W$.has(o)||z$.test(r))}c(V$,"isUndeliverableRecipient");var KE=!1;async function Gp(e){let t=F$();switch(KE||(KE=!0,process.stderr.write(`[email] active provider: ${t}
|
|
1466
|
+
`)),t){case"resend":return V$(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 so=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Yp=Y$`case ${ee.role}
|
|
1468
1468
|
when 'owner' then 0
|
|
1469
1469
|
when 'admin' then 1
|
|
1470
1470
|
when 'member' then 2
|
|
1471
1471
|
else 3
|
|
1472
|
-
end`;async function Gs(e){let t=e.req.param("teamId");if(!t||!
|
|
1472
|
+
end`;async function Gs(e){let t=e.req.param("teamId");if(!t||!so.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(G$(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 Ta=/^(?=.{3,40}$)[a-z0-9]+(?:-[a-z0-9]+)*$/,ka="Slug must be 3-40 chars, lowercase alphanumerics with single dashes only \u2014 no leading, trailing, or consecutive dashes";function Od(){return K$(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
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`
|
|
1474
|
+
`),wr(t,{tags:{source:"invite-email"},extra:{to:e.to,orgName:e.orgName}}),{sent:!1,reason:n}}}c(Md,"sendInvitationEmail");var Xp=J$.enum(["admin","member"]);var Ko=new X$,Z$=Mr.object({name:Mr.string().min(1).max(100),slug:Mr.string().regex(Ta,{message:ka}),invite:Mr.object({email:Mr.string().email().max(254),role:Xp.optional()}).optional()}),e1=Mr.object({name:Mr.string().min(1).max(100).optional(),slug:Mr.string().regex(Ta,{message:ka}).optional()});Ko.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=Z$.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=ko(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(gr(R.id,n),QE(R.activeOrgId))),await p.update(y).set({orgId:m.id}).where(YE(gr(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)});Ko.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,gr(ee.orgId,X.id)).where(gr(ee.userId,t)).orderBy(X.createdAt);return e.json(n.map(r=>({id:r.id,name:r.name,slug:r.slug,role:r.role})))});Ko.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(gr(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,gr(ee.userId,R.id)).where(gr(ee.orgId,t)).orderBy(Yp,XE(ee.createdAt)),o=await u.select({id:Q.id,name:Q.name,slug:Q.slug,memberCount:Q$`count(${we.userId})::int`}).from(Q).leftJoin(we,gr(we.teamId,Q.id)).where(gr(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)}))})});Ko.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=e1.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(gr(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}});Ko.delete("/orgs/:slug",It(["owner"]),async e=>{let t=e.get("orgId");return await u.delete(X).where(gr(X.id,t)),e.body(null,204)});var t1=Mr.object({newOwnerId:Mr.string().uuid()});Ko.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=t1.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=ko(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 n1}from"hono";import{z as ZE}from"zod";import{eq as $d,and as eA,asc as r1,max as o1,inArray as tA}from"drizzle-orm";var qd=new n1;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,r1(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:o1(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 s1=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||!so.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=s1.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=ko(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||!so.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=ko(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 i1}from"hono";import{z as Go}from"zod";import{eq as Yo,and as nA,asc as a1,sql as c1}from"drizzle-orm";var Xo=new i1,d1=Go.object({name:Go.string().min(1).max(100),slug:Go.string().regex(Ta,{message:ka})}),u1=Go.object({name:Go.string().min(1).max(100).optional(),slug:Go.string().regex(Ta,{message:ka}).optional()}),l1=Go.object({userId:Go.string().uuid()});Xo.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:c1`count(${we.userId})::int`}).from(Q).leftJoin(we,Yo(we.teamId,Q.id)).where(Yo(Q.orgId,t)).groupBy(Q.id,Q.name,Q.slug,Q.createdAt).orderBy(a1(Q.name));return e.json(n.map(r=>({id:r.id,name:r.name,slug:r.slug,memberCount:Number(r.memberCount),createdAt:r.createdAt})))});Xo.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=d1.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}});Xo.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=u1.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(Yo(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}});Xo.delete("/orgs/:slug/teams/:teamId",It(["owner","admin"]),async e=>{let t=await Gs(e);return t.ok?(await u.delete(Q).where(Yo(Q.id,t.team.id)),e.body(null,204)):t.response});Xo.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=l1.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(Yo(ee.userId,o),Yo(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)});Xo.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||!so.test(n)?e.json({error:"Invalid userId path param",code:"BAD_REQUEST"},400):(await u.delete(we).where(nA(Yo(we.teamId,t.team.id),Yo(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 p1}from"hono";import{z as h_}from"zod";import{eq as hr,and as Qp,desc as m1,sql as f1,isNull as ja,gt as g1}from"drizzle-orm";var Na=new p1,h1=h_.object({email:h_.string().email().max(254),role:Xp.optional(),teamId:h_.string().uuid().optional()});Na.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=h1.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(hr(Q.id,a),hr(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(hr(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)});Na.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,hr(se.teamId,Q.id)).leftJoin(R,hr(se.invitedBy,R.id)).where(Qp(hr(se.orgId,t),ja(se.acceptedAt),ja(se.revokedAt),g1(se.expiresAt,f1`now()`))).orderBy(m1(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})))});Na.post("/orgs/:slug/invitations/:id/revoke",It(["owner","admin"]),async e=>{let t=e.req.param("id");if(!t||!so.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(hr(se.id,t),hr(se.orgId,n),ja(se.acceptedAt),ja(se.revokedAt))).returning({id:se.id})).length===0?e.json({error:"Invitation not found",code:"INVITE_NOT_FOUND"},404):e.body(null,204)});Na.post("/orgs/:slug/invitations/:id/resend",It(["owner","admin"]),async e=>{let t=e.req.param("id");if(!t||!so.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(hr(se.id,t),hr(se.orgId,n),ja(se.acceptedAt),ja(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(hr(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 _1}from"hono";import{eq as Ud,and as oA,sql as sA,inArray as __,gte as iA}from"drizzle-orm";var em=new _1,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,fe)=>V+fe,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 Qo=new y1;Qo.route("/",Ko);Qo.route("/",qd);Qo.route("/",Xo);Qo.route("/",Na);Qo.route("/",em);O();import{Hono as w1}from"hono";import{z as w_}from"zod";import{createClient as v1}from"@supabase/supabase-js";import{eq as Hd,and as aA,isNull as cA,sql as dA}from"drizzle-orm";var Bd=new w1;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=v1(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 I1=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=I1.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=ko(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 b1}from"hono";import{z as Fd}from"zod";import{eq as Wd,and as E1}from"drizzle-orm";var zd=new b1;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 A1=["free","pro","max_5x","max_20x"],S1=Fd.object({activeOrgId:Fd.string().uuid().nullable().optional(),claudeCodePlan:Fd.enum(A1).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=S1.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let o=r.data;if("activeOrgId"in o&&o.activeOrgId!=null){let[a]=await u.select({orgId:ee.orgId}).from(ee).where(E1(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 R1}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 x1}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(x1(R.id,n));if(!r?.isSuperadmin)return e.json({error:"Forbidden",code:"NOT_SUPERADMIN"},403);await t()}}c(Vd,"requireSuperadmin");pd();var An=new R1;An.use("/superadmin/*",Vd());var T1=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=T1.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`
|
|
1475
1475
|
select
|
|
1476
1476
|
p.id,
|
|
1477
1477
|
p.email,
|
|
@@ -1502,7 +1502,7 @@ end`;async function Gs(e){let t=e.req.param("teamId");if(!t||!oo.test(t))return{
|
|
|
1502
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`
|
|
1503
1503
|
select count(*)::int as n from profiles
|
|
1504
1504
|
where is_superadmin = true and id <> ${e}
|
|
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
|
|
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 k1=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=k1.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 j1=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=j1.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 N1=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=N1.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 P1=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=P1.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let{orgId:o,role:s,claimSessions:i}=r.data,a=e.get("supabase");if(!a)return e.json({error:"Internal: no auth client",code:"INTERNAL"},500);let{data: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 D1}from"hono";import{z as Zo}from"zod";var tm=new D1,pA=Zo.object({type:Zo.string().min(1).max(64),payload:Zo.record(Zo.unknown()).optional(),timestamp:Zo.string().datetime().optional()}),O1=Zo.union([pA,Zo.object({events:Zo.array(pA).max(50)})]);tm.post("/telemetry/extension-events",async e=>{let t=e.get("userId"),n=await e.req.json().catch(()=>null),r=O1.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 C1}from"hono";import{z as $r}from"zod";import{sql as L1}from"drizzle-orm";var Jd=new C1,mA=$r.object({event:$r.string().min(1).max(64),deviceId:$r.string().min(1).max(128),cliVersion:$r.string().max(64).optional(),os:$r.string().max(32).optional(),props:$r.record($r.unknown()).optional()}),M1=$r.union([mA,$r.object({events:$r.array(mA).max(50)})]);Jd.post("/telemetry/cli-events",async e=>{let t=e.get("userId"),n=M1.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(L1`
|
|
1506
1506
|
select
|
|
1507
1507
|
device_id,
|
|
1508
1508
|
count(*)::int as event_count,
|
|
@@ -1519,7 +1519,7 @@ end`;async function Gs(e){let t=e.req.param("teamId");if(!t||!oo.test(t))return{
|
|
|
1519
1519
|
group by device_id
|
|
1520
1520
|
order by max(created_at) desc
|
|
1521
1521
|
limit 200
|
|
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`
|
|
1522
|
+
`);return e.json({deployments:n})});O();import{Hono as $1}from"hono";import{z as tr}from"zod";var nm=new $1,q1=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=q1.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 io}from"zod";import{createHash as U1,randomBytes as yA}from"node:crypto";import{and as fA,eq as v_,gt as H1,isNull as B1,lt as F1}from"drizzle-orm";var W1={vscode:"VS Code extension","vscode-insiders":"VS Code Insiders extension",cursor:"Cursor extension",windsurf:"Windsurf extension"},gA="VS Code extension";function z1(e){return e?W1[e]??gA:gA}c(z1,"editorKeyName");var hA=6e4;async function V1(){try{await u.delete(Un).where(F1(Un.expiresAt,new Date))}catch{}}c(V1,"sweepExpiredCodes");setInterval(()=>void V1(),5*6e4).unref?.();var Kd=new _A,J1=io.object({code:io.string().min(1).max(256)}),K1=io.object({refreshToken:io.string().min(1).max(2048)});Kd.post("/auth/extension/refresh",async e=>{let t=await e.req.json().catch(()=>null),n=K1.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=J1.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),H1(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=z1(r.editor),{plaintext:s,hash:i,prefix:a}=Y1();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),B1(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,G1=io.object({refreshToken:io.string().min(1).nullish(),expiresAt:io.string().nullish(),email:io.string().email().nullish(),editor:io.enum(["vscode","vscode-insiders","cursor","windsurf"]).nullish()});function Y1(){let e=`rm_${yA(32).toString("base64url")}`;return{plaintext:e,hash:U1("sha256").update(e).digest("hex"),prefix:e.slice(0,11)}}c(Y1,"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=G1.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"})});pd();import{Hono as X1}from"hono";var om=new X1;function Q1(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(Q1,"formatEmbed");async function Z1(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(Z1,"lookupEmail");async function eq(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(eq,"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 Z1(o.record?.user_id):null,a=Q1(o,i);return a?(await eq(n,a),e.json({ok:!0})):e.json({ok:!0,skipped:!0})});O();import{Hono as mq}from"hono";import{z as Je}from"zod";import{and as Xd,desc as cm,eq as qr,gte as C_,isNull as fq,sql as gq}from"drizzle-orm";var b_="anthropic",tq=[{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 nq(e){return typeof e=="object"&&e!==null}c(nq,"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 rq(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(rq,"parseResetTime");var E_={id:b_,displayName:"Anthropic (Claude Code)",plans:["unknown","pro","max_5x","max_20x"],limits:{unknown:I_,pro:tq,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(!nq(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=rq(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",oq="codex.rate_limits",IA=["primary","secondary"];function sq(e,t){return t!=null?t>=1440?"seven_day_percent":"five_hour_percent":e==="secondary"?"seven_day_percent":"five_hour_percent"}c(sq,"limitTypeForWindow");var Pa=[{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:Pa,free:Pa,plus:Pa,pro:Pa,team:Pa,enterprise:Pa},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!==oq)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=sq(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 Due=1440*60*1e3;O();import{and as EA,desc as AA,eq as Yd,gte as dq,sql as uq}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 Da(e){switch(e){case"none":return 0;case"soft":return 1;case"approaching":return 2;case"imminent":return 3;case"hit":return 4}}c(Da,"severityRank");var sm={soft:"soft warning",approaching:"approaching limit",imminent:"imminent limit",hit:"limit reached"};function iq(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(iq,"formatTimeLeft");function j_(e,t,n,r,o=Date.now()){let s=iq(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 aq=300*1e3,cq=70;function P_(e){let{proposedSeverity:t,lastDispatch:n,currentUsedPercentage:r,now:o,isFirstTime429:s}=e;if(s)return!0;if(!n)return Da(t)>0;let i=Da(t),a=Da(n.severity);return i>a?!0:o.getTime()-n.lastDispatchedAt.getTime()>=aq?a>=Da("approaching")&&i===a?!(r>=cq):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 Oa(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(Oa,"notifyFromDispatch");var lq=30*6e4;async function im(e,t){let n=new Date((t.observedAt??new Date).getTime()-lq);try{let o=await u.execute(uq`
|
|
1523
1523
|
SELECT id, observed_at
|
|
1524
1524
|
FROM limit_observations
|
|
1525
1525
|
WHERE user_id = ${e}
|
|
@@ -1532,15 +1532,15 @@ end`;async function Gs(e){let t=e.req.param("teamId");if(!t||!oo.test(t))return{
|
|
|
1532
1532
|
AND observed_at >= ${n.toISOString()}::timestamptz
|
|
1533
1533
|
ORDER BY observed_at DESC
|
|
1534
1534
|
LIMIT 1
|
|
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}
|
|
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),dq(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 Oa({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 pq(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(pq,"createObserveBatcher");var es=null;function O_(){return es==null&&(es=pq()),es}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(es==null)return;es.stop(),await es.flush(e);let t=es.size()+es.inFlight();t>0&&console.warn(`[observe-batcher] shutdown flush deadline (${e}ms) hit; dropping ~${t} buffered observation(s)`)}c(kA,"shutdownObserveBatcher");var _r=new mq,hq=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})});_r.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})});_r.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})});_r.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=hq.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)});_r.get("/research/active-limits",async e=>{let t=e.req.query("provider"),n=e.req.query("plan"),r=[fq(tt.effectiveUntil)];t&&r.push(qr(tt.provider,t)),n&&r.push(qr(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})});_r.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())})});_r.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(qr(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)})});_r.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(qr(tt.provider,t),qr(tt.plan,n),qr(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)}))})});_r.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=[qr(ve.userId,t)];n&&a.push(qr(ve.provider,n)),r&&a.push(qr(ve.plan,r)),o&&a.push(qr(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:gq`count(*)::int`}).from(ve).where(Xd(...a));return e.json({items:d,total:l,limit:s,offset:i})});O();import{Hono as _q}from"hono";import{and as DA,desc as yq,eq as Ca,isNull as wq,ne as vq,sql as ts}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 _q,Iq=60*1e3,$_=new Map;function bq(e,t){let n=`${e}::${t}`,r=$_.get(n);if(r&&Date.now()-r.at<Iq)return r.rows;let o=u.select({limitType:tt.limitType,value:tt.value,unit:tt.unit}).from(tt).where(DA(Ca(tt.provider,e),Ca(tt.plan,t),wq(tt.effectiveUntil)));return o.catch(()=>$_.delete(n)),$_.set(n,{at:Date.now(),rows:o}),o}c(bq,"getActivePlanLimits");var PA=["five_hour_percent","seven_day_percent","seven_day_opus_percent"],Eq={anthropic:["oauth_usage"],codex:["live_stream","self_observed_429"]};function Aq(e){return Eq[e]??["oauth_usage"]}c(Aq,"sourceTypesFor");Qd.get("/usage/current-limits",async e=>{let t=e.get("userId"),n=e.req.query("provider")??"anthropic",r=Aq(n),o=ts`user_id = ${t}
|
|
1536
1536
|
AND provider = ${n}
|
|
1537
|
-
AND source_type IN (${
|
|
1538
|
-
AND limit_type = lt.limit_type`,s=await u.execute(
|
|
1537
|
+
AND source_type IN (${ts.join(r.map(a=>ts`${a}`),ts`, `)})
|
|
1538
|
+
AND limit_type = lt.limit_type`,s=await u.execute(ts`
|
|
1539
1539
|
SELECT lt.limit_type AS limit_type,
|
|
1540
1540
|
CASE WHEN w.resets_at IS NULL THEN recent.value ELSE win.value END AS value,
|
|
1541
1541
|
CASE WHEN w.resets_at IS NULL THEN recent.resets_at ELSE win.resets_at END AS resets_at,
|
|
1542
1542
|
CASE WHEN w.resets_at IS NULL THEN recent.observed_at ELSE win.observed_at END AS observed_at
|
|
1543
|
-
FROM (VALUES ${
|
|
1543
|
+
FROM (VALUES ${ts.join(PA.map(a=>ts`(${a})`),ts`, `)}) AS lt(limit_type)
|
|
1544
1544
|
LEFT JOIN LATERAL (
|
|
1545
1545
|
SELECT resets_at
|
|
1546
1546
|
FROM limit_observations
|
|
@@ -1563,18 +1563,18 @@ end`;async function Gs(e){let t=e.req.param("teamId");if(!t||!oo.test(t))return{
|
|
|
1563
1563
|
ORDER BY observed_at DESC
|
|
1564
1564
|
LIMIT 1
|
|
1565
1565
|
) recent ON true
|
|
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(
|
|
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(Ca(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(Ca(ve.userId,t),Ca(ve.provider,n),Ca(ve.sourceType,"oauth_usage"),vq(ve.plan,"unknown"))).orderBy(yq(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 bq(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 Sq}from"hono";import{z as yr}from"zod";import{and as OA,desc as MA,eq as Zd,sql as xq}from"drizzle-orm";var tu=new Sq,CA=30,Rq=30,Tq=0,q_=1e3,LA=2e3,U_=2;function eu(e){return e==null?0:typeof e=="number"?e:Number(e)}c(eu,"toNum");function kq(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(kq,"ageDays");async function jq(){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(jq,"loadActiveRows");tu.get("/pricing/coverage",async e=>{if(!e.get("userId"))return e.json({error:"unauthorized"},401);let n=await u.execute(xq`
|
|
1567
1567
|
SELECT model,
|
|
1568
1568
|
COUNT(*)::int AS events,
|
|
1569
1569
|
MAX(timestamp) AS last_seen
|
|
1570
1570
|
FROM session_events
|
|
1571
1571
|
WHERE model IS NOT NULL
|
|
1572
1572
|
AND model NOT IN ('unknown', '(null)')
|
|
1573
|
-
AND timestamp > now() - (${
|
|
1573
|
+
AND timestamp > now() - (${Rq} || ' days')::interval
|
|
1574
1574
|
GROUP BY model
|
|
1575
1575
|
ORDER BY events DESC
|
|
1576
|
-
`),r=await
|
|
1577
|
-
UPDATE ${
|
|
1576
|
+
`),r=await jq(),o=[],s=[],i=0;for(let a of n){let d=a.model,l=Bo(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=kq(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 Nq=yr.object({provider:yr.string().min(1).optional(),modelId:yr.string().min(1),inputPerM:yr.number(),outputPerM:yr.number(),cacheReadPerM:yr.number().optional(),cacheWrite5mPerM:yr.number().optional(),cacheWrite1hPerM:yr.number().optional(),contextWindow:yr.number().int().positive().nullable().optional(),sourceUrl:yr.string().url(),effectiveFrom:yr.string().datetime().optional()});tu.post("/pricing/rates",async e=>{if(!e.get("userId"))return e.json({error:"unauthorized"},401);let n=Nq.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??Bo(r.modelId),s=c((f,h)=>f>Tq&&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 Pq}from"hono";import{desc as Dq,eq as Oq}from"drizzle-orm";var dm=new Pq;dm.get("/alerts/recent",async e=>{let t=e.get("userId"),n=await u.select().from(jn).where(Oq(jn.userId,t)).orderBy(Dq(jn.lastDispatchedAt)).limit(20);return e.json({items:n})});O();import{Hono as Cq}from"hono";import{randomUUID as Lq}from"node:crypto";import{sql as La}from"drizzle-orm";var um=new Cq,UA=300,$A=3e4,Mq=6e4,$q=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"},qq=["session_send_jobs","launch_jobs","eval_jobs","insights_jobs","agent_jobs"];async function Uq(e,t,n,r){if(n.length===0)return null;let o=La.join(n.map(i=>La`${i}`),La`, `),s=await u.execute(La`
|
|
1577
|
+
UPDATE ${La.raw(e)} AS m
|
|
1578
1578
|
SET status = 'claimed',
|
|
1579
1579
|
claimed_by = ${r},
|
|
1580
1580
|
claimed_at = now(),
|
|
@@ -1583,7 +1583,7 @@ end`;async function Gs(e){let t=e.req.param("teamId");if(!t||!oo.test(t))return{
|
|
|
1583
1583
|
updated_at = now()
|
|
1584
1584
|
FROM (
|
|
1585
1585
|
SELECT id
|
|
1586
|
-
FROM ${
|
|
1586
|
+
FROM ${La.raw(e)}
|
|
1587
1587
|
WHERE user_id = ${t}
|
|
1588
1588
|
AND status = 'pending'
|
|
1589
1589
|
AND task_kind IN (${o})
|
|
@@ -1594,23 +1594,23 @@ end`;async function Gs(e){let t=e.req.param("teamId");if(!t||!oo.test(t))return{
|
|
|
1594
1594
|
) AS picked
|
|
1595
1595
|
WHERE m.id = picked.id
|
|
1596
1596
|
RETURNING m.id, m.task_kind, m.payload, m.attempts
|
|
1597
|
-
`);return s.length>0?s[0]:null}c(
|
|
1597
|
+
`);return s.length>0?s[0]:null}c(Uq,"claimOne");async function Hq(e,t,n){let r={};for(let o of t){let s=H_[o];s&&(r[s]??=[]).push(o)}for(let o of qq){let s=r[o];if(!s)continue;let i=await Uq(o,e,s,n);if(i)return{job:i,table:o}}return null}c(Hq,"tryClaimAcrossTables");var Bq={cron_suggest_instructions:[0,7,37]};function Fq(e){let t=/rulemetric-cli\/(\d+)\.(\d+)\.(\d+)/.exec(e??"");return t?[Number(t[1]),Number(t[2]),Number(t[3])]:null}c(Fq,"parseCliVersion");function Wq(e,t){return e[0]!==t[0]?e[0]>t[0]:e[1]!==t[1]?e[1]>t[1]:e[2]>=t[2]}c(Wq,"versionAtLeast");function zq(e,t){let n=Fq(t),r=[],o=[];for(let s of e){let i=Bq[s];i&&(!n||!Wq(n,i))?o.push(s):r.push(s)}return{allowed:r,fenced:o}}c(zq,"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}=zq(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,Mq)):$A,d=Lq(),l=Date.now()+a;for(;;){let p=await Hq(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,$q))}return e.body(null,204)});O();import{Hono as Kq}from"hono";import{z as nu}from"zod";import{sql as ao}from"drizzle-orm";O();import{eq as Ur,and as B_}from"drizzle-orm";var Vq=c(e=>`${(e*100).toFixed(1)}pp`,"pct"),Jq=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${Vq(o.cost.mde)}`),o.cost?.modelCalls&&l.push(`${o.cost.modelCalls} model calls`),o.cost?.wallMs&&l.push(Jq(o.cost.wallMs));let p=o.applied?"APPLIED \u2014 the instruction was rewritten":"recorded only \u2014 nothing was changed";return{type:"evolution_decided",title:`Evolution: ${o.decision} \u2014 ${i}`,body:`${p}. ${l.join(", ")}.`,url:a,metadata:{evalTargetId:n,outcome:o.decision,applied:o.applied===!0,nPairs: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_(Ur(Ne.id,t),Ur(Ne.userId,e)));if(!o||o.config?.type==="conversation")return;let[s]=await u.select({name:k.name}).from(k).where(Ur(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_(Ur(z.id,t),Ur(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,Ur(C.id,ye.projectId)).where(Ur(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_(Ur(Pe.id,t),Ur(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(Ur(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 Ma=new Kq,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},Gq=["session_send_jobs","launch_jobs","eval_jobs","insights_jobs","agent_jobs"];async function W_(e,t,n){for(let r of Gq){let o=await u.execute(ao`
|
|
1598
1598
|
SELECT status, attempts, task_kind
|
|
1599
|
-
FROM ${
|
|
1599
|
+
FROM ${ao.raw(r)}
|
|
1600
1600
|
WHERE id = ${e}
|
|
1601
1601
|
AND user_id = ${t}
|
|
1602
1602
|
AND claimed_by = ${n}
|
|
1603
1603
|
AND status IN ('claimed', 'running')
|
|
1604
1604
|
LIMIT 1
|
|
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
|
|
1606
|
-
UPDATE ${
|
|
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 Yq=nu.object({result:nu.unknown().optional()}),Xq=nu.object({error:nu.string().min(1).max(8192),terminal:nu.boolean().optional().default(!1)});Ma.post("/work/:id/heartbeat",async e=>{let t=e.get("userId"),n=e.req.param("id"),o=(await e.req.json().catch(()=>({}))).leaseToken;if(!o)return e.json({error:"leaseToken required"},400);let s=await W_(n,t,o);return s?(await u.execute(ao`
|
|
1606
|
+
UPDATE ${ao.raw(s.table)}
|
|
1607
1607
|
SET lease_expires_at = now() + (${zA}::int * interval '1 second'),
|
|
1608
1608
|
updated_at = now()
|
|
1609
1609
|
WHERE id = ${n}
|
|
1610
1610
|
AND claimed_by = ${o}
|
|
1611
1611
|
AND status IN ('claimed', 'running')
|
|
1612
|
-
`),e.json({ok:!0,leaseDurationSeconds:zA})):e.json({error:"job not found or lease lost"},404)});
|
|
1613
|
-
UPDATE ${
|
|
1612
|
+
`),e.json({ok:!0,leaseDurationSeconds:zA})):e.json({error:"job not found or lease lost"},404)});Ma.post("/work/:id/complete",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json().catch(()=>({})),o=r.leaseToken;if(!o)return e.json({error:"leaseToken required"},400);let s=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=JSON.stringify(s.data.result??null);return await u.execute(ao`
|
|
1613
|
+
UPDATE ${ao.raw(i.table)}
|
|
1614
1614
|
SET status = 'completed',
|
|
1615
1615
|
result = ${a}::jsonb,
|
|
1616
1616
|
error = NULL,
|
|
@@ -1621,24 +1621,24 @@ end`;async function Gs(e){let t=e.req.param("teamId");if(!t||!oo.test(t))return{
|
|
|
1621
1621
|
WHERE id = ${n}
|
|
1622
1622
|
AND claimed_by = ${o}
|
|
1623
1623
|
AND status IN ('claimed', 'running')
|
|
1624
|
-
`),await VA(i.taskKind,t,n,"completed"),e.json({ok:!0})});
|
|
1625
|
-
UPDATE ${
|
|
1624
|
+
`),await VA(i.taskKind,t,n,"completed"),e.json({ok:!0})});Ma.post("/work/:id/fail",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json().catch(()=>({})),o=r.leaseToken;if(!o)return e.json({error:"leaseToken required"},400);let s=Xq.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(ao`
|
|
1625
|
+
UPDATE ${ao.raw(i.table)}
|
|
1626
1626
|
SET status = ${l},
|
|
1627
1627
|
error = ${s.data.error},
|
|
1628
1628
|
updated_at = now(),
|
|
1629
|
-
${
|
|
1629
|
+
${ao.raw(d?"completed_at = now(),":"")}
|
|
1630
1630
|
claimed_by = NULL,
|
|
1631
1631
|
claimed_at = NULL,
|
|
1632
1632
|
lease_expires_at = NULL
|
|
1633
1633
|
WHERE id = ${n}
|
|
1634
1634
|
AND claimed_by = ${o}
|
|
1635
1635
|
AND status IN ('claimed', 'running')
|
|
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
|
|
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
|
|
1638
|
-
`)}),e.json({processing:!0,resumed:s,announcement:o},202)});O();import{Hono as
|
|
1639
|
-
UPDATE ${
|
|
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 iU}from"hono";import{z as ns}from"zod";import{and as QA,desc as aU,eq as co,isNotNull as cU,sql as ZA}from"drizzle-orm";O();import{and as Qq,asc as Zq,eq as Hr,gt as eU,isNotNull as tU,sql as nU}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 rU({announcementId:e,db:n,sendEmail:r,log:o,webBaseUrl:s})}finally{lm.delete(e)}}c(YA,"sendAnnouncement");async function rU(e){let{announcementId:t,db:n,sendEmail:r,log:o,webBaseUrl:s}=e,[i]=await n.select().from($e).where(Hr($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(Hr($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,Hr(R.id,kt.userId)).where(Qq(Hr(kt.productAnnouncements,!0),tU(R.email),m?eU(kt.userId,m):void 0)).orderBy(Zq(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=>sU({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:nU`count(*)::int`}).from(Tt).where(Hr(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(Hr($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(Hr($e.id,t)).catch(()=>{}),_}}c(rU,"runSend");function oU(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}c(oU,"escapeHtml");async function sU(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}}",oU(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(Hr(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(Hr(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(Hr(Tt.id,a)).catch(()=>{}),{ok:"failed",error:h}}}c(sU,"sendOne");var Br=new iU;Br.use("/announcements/*",Vd());Br.use("/announcements",Vd());Br.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(aU($e.createdAt));return e.json({announcements:t})});Br.get("/announcements/:id",async e=>{let t=e.req.param("id");if(!ns.string().uuid().safeParse(t).success)return e.json({error:"Invalid id",code:"VALIDATION_ERROR"},400);let[n]=await u.select().from($e).where(co($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(co(Tt.announcementId,t)).groupBy(Tt.status),o={};for(let s of r)o[s.status]=s.count;return e.json({...n,deliveryCounts:o})});Br.get("/announcements/:id/recipients/count",async e=>{let t=e.req.param("id");if(!ns.string().uuid().safeParse(t).success)return e.json({error:"Invalid id",code:"VALIDATION_ERROR"},400);let n=await dU();return e.json({count:n})});async function dU(){let[e]=await u.select({count:ZA`count(*)::int`}).from(kt).innerJoin(R,co(R.id,kt.userId)).where(QA(co(kt.productAnnouncements,!0),cU(R.email)));return e?.count??0}c(dU,"countOptedInRecipients");var XA=c(e=>e.includes("{{unsubscribe_url}}"),"hasUnsubscribePlaceholder"),uU=ns.object({subject:ns.string().min(1).max(500).optional(),htmlBody:ns.string().min(1).refine(XA,{message:"htmlBody must contain the {{unsubscribe_url}} placeholder"}).optional(),textBody:ns.string().min(1).refine(XA,{message:"textBody must contain the {{unsubscribe_url}} placeholder"}).optional()});Br.patch("/announcements/:id",async e=>{let t=e.req.param("id");if(!ns.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=uU.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(co($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(co($e.id,t)).returning();return e.json(i)});Br.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(!ns.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(co($e.id,n),co($e.status,"draft"))).returning(),o=r[0],s=!1;if(r.length===0){let[i]=await u.select().from($e).where(co($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 lU}from"hono";import{inArray as tS,sql as eS}from"drizzle-orm";var ru=new lU;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 pU}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=pU("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 mU=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))},mU);return{stop:c(()=>{clearTimeout(e),clearInterval(t)},"stop")}}c(sS,"startScrapeInterval");var K=new hU,vU=process.env.ALLOWED_ORIGINS?.split(",")??["http://localhost:5174","http://localhost:5175"];K.use("*",_U({origin:c(e=>e?vU.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/*",yU({maxSize:10*1024*1024}));K.use("*",Av);K.use("/auth/login",Nc(900*1e3,10));var dS=Nc(60*1e3,10);K.use("/api/auth/api-keys",dS);K.use("/api/auth/api-keys/*",dS);K.use("/api/invitations/*",Nc(60*1e3,30));K.use("/api/telemetry/cli-error",Nc(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",Dc);K.use("/api/sessions/:id/events",Dc);K.use("/api/sessions/import",Dc);K.use("/api/internal/research/observe",Dc);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",Uc);K.route("/api",Hc);K.route("/api",Bc);K.route("/api",zc);K.route("/api",fl);K.route("/api",To);K.route("/api",Co);K.route("/api",wd);K.route("/api",kr);K.route("/api",pp);K.route("/api",ia);K.route("/api",bd);K.route("/api",wp);K.route("/api",Gn);K.route("/api",Ep);K.route("/api",$o);K.route("/api",ca);K.route("/api",Cs);K.route("/api",la);K.route("/api",Ls);K.route("/api",pa);K.route("/api",eo);K.route("/api",$s);K.route("/api",_a);K.route("/api",Uo);K.route("/api",jp);K.route("/api",Xn);K.route("/api",En);K.route("/api",ba);K.route("/api",oo);K.route("/api",Vo);K.route("/api",Dd);K.route("/api",Sa);K.route("/api",Jo);K.route("/api",Lr);K.route("/api",Ks);K.route("/api",Qo);K.route("/api/invitations",Bd);K.route("/api",zd);K.route("/api",An);K.route("/api",tm);K.route("/api",Jd);K.route("/api",_r);K.route("/api",Qd);K.route("/api",tu);K.route("/api",dm);K.route("/api",um);K.route("/api",Ma);K.route("/api",Br);K.route("/api/unsubscribe",ru);K.route("/api",rm);var IU=setTimeout(()=>{Hp().catch(()=>{})},5e3),bU=sS(),uS=[{stop:c(()=>clearTimeout(IU),"stop")},bU],EU=$a.dirname(gU(import.meta.url)),z_=process.env.WEB_DIST_PATH??$a.resolve(EU,"../../../apps/web/dist");if(ou.existsSync(z_)){let e=c(async t=>{let n=$a.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("/*",wU({root:z_,rewriteRequestPath:c(t=>t,"rewriteRequestPath")})),K.get("*",e)}K.onError(yv);O();import{sql as Fr}from"drizzle-orm";var AU=300*1e3,SU="reconciler: lease expired with attempts exhausted \u2014 agent likely crashed mid-run",xU="reconciler: in-flight row had no lease and attempts were exhausted \u2014 unclaimable and unswept until recovered",qa=1,RU=["eval_jobs","insights_jobs","launch_jobs","session_send_jobs","agent_jobs"];function Ua(){return Fr.join(Object.entries(F_).map(([e,t])=>Fr`WHEN ${e} THEN ${t}::int`),Fr` `)}c(Ua,"maxAttemptsCase");async function TU(e){let t=await u.execute(Fr`
|
|
1639
|
+
UPDATE ${Fr.raw(e)}
|
|
1640
1640
|
SET status = 'failed',
|
|
1641
|
-
error = ${
|
|
1641
|
+
error = ${SU},
|
|
1642
1642
|
completed_at = now(),
|
|
1643
1643
|
claimed_by = NULL,
|
|
1644
1644
|
claimed_at = NULL,
|
|
@@ -1647,11 +1647,11 @@ end`;async function Gs(e){let t=e.req.param("teamId");if(!t||!oo.test(t))return{
|
|
|
1647
1647
|
WHERE status IN ('claimed', 'running')
|
|
1648
1648
|
AND claimed_by IS NOT NULL
|
|
1649
1649
|
AND lease_expires_at < now()
|
|
1650
|
-
AND attempts >= (CASE task_kind ${
|
|
1651
|
-
AND lease_recoveries >= ${
|
|
1650
|
+
AND attempts >= (CASE task_kind ${Ua()} ELSE 3 END)
|
|
1651
|
+
AND lease_recoveries >= ${qa}
|
|
1652
1652
|
RETURNING id
|
|
1653
|
-
`),n=await u.execute(
|
|
1654
|
-
UPDATE ${
|
|
1653
|
+
`),n=await u.execute(Fr`
|
|
1654
|
+
UPDATE ${Fr.raw(e)}
|
|
1655
1655
|
SET status = 'pending',
|
|
1656
1656
|
attempts = GREATEST(attempts - 1, 0),
|
|
1657
1657
|
lease_recoveries = lease_recoveries + 1,
|
|
@@ -1663,31 +1663,31 @@ end`;async function Gs(e){let t=e.req.param("teamId");if(!t||!oo.test(t))return{
|
|
|
1663
1663
|
AND claimed_by IS NOT NULL
|
|
1664
1664
|
AND lease_expires_at < now()
|
|
1665
1665
|
RETURNING id
|
|
1666
|
-
`),r=await u.execute(
|
|
1667
|
-
UPDATE ${
|
|
1666
|
+
`),r=await u.execute(Fr`
|
|
1667
|
+
UPDATE ${Fr.raw(e)}
|
|
1668
1668
|
SET status = CASE
|
|
1669
|
-
WHEN attempts >= (CASE task_kind ${
|
|
1670
|
-
AND lease_recoveries >= ${
|
|
1669
|
+
WHEN attempts >= (CASE task_kind ${Ua()} ELSE 3 END)
|
|
1670
|
+
AND lease_recoveries >= ${qa} THEN 'failed'
|
|
1671
1671
|
ELSE 'pending'
|
|
1672
1672
|
END,
|
|
1673
1673
|
attempts = CASE
|
|
1674
|
-
WHEN attempts >= (CASE task_kind ${
|
|
1675
|
-
AND lease_recoveries >= ${
|
|
1674
|
+
WHEN attempts >= (CASE task_kind ${Ua()} ELSE 3 END)
|
|
1675
|
+
AND lease_recoveries >= ${qa} THEN attempts
|
|
1676
1676
|
ELSE GREATEST(attempts - 1, 0)
|
|
1677
1677
|
END,
|
|
1678
1678
|
lease_recoveries = CASE
|
|
1679
|
-
WHEN attempts >= (CASE task_kind ${
|
|
1680
|
-
AND lease_recoveries >= ${
|
|
1679
|
+
WHEN attempts >= (CASE task_kind ${Ua()} ELSE 3 END)
|
|
1680
|
+
AND lease_recoveries >= ${qa} THEN lease_recoveries
|
|
1681
1681
|
ELSE lease_recoveries + 1
|
|
1682
1682
|
END,
|
|
1683
1683
|
error = CASE
|
|
1684
|
-
WHEN attempts >= (CASE task_kind ${
|
|
1685
|
-
AND lease_recoveries >= ${
|
|
1684
|
+
WHEN attempts >= (CASE task_kind ${Ua()} ELSE 3 END)
|
|
1685
|
+
AND lease_recoveries >= ${qa} THEN ${xU}
|
|
1686
1686
|
ELSE error
|
|
1687
1687
|
END,
|
|
1688
1688
|
completed_at = CASE
|
|
1689
|
-
WHEN attempts >= (CASE task_kind ${
|
|
1690
|
-
AND lease_recoveries >= ${
|
|
1689
|
+
WHEN attempts >= (CASE task_kind ${Ua()} ELSE 3 END)
|
|
1690
|
+
AND lease_recoveries >= ${qa} THEN now()
|
|
1691
1691
|
ELSE completed_at
|
|
1692
1692
|
END,
|
|
1693
1693
|
claimed_at = NULL,
|
|
@@ -1697,7 +1697,7 @@ end`;async function Gs(e){let t=e.req.param("teamId");if(!t||!oo.test(t))return{
|
|
|
1697
1697
|
AND claimed_by IS NULL
|
|
1698
1698
|
AND updated_at < now() - interval '15 minutes'
|
|
1699
1699
|
RETURNING id
|
|
1700
|
-
`);return t.length+n.length+r.length}c(
|
|
1700
|
+
`);return t.length+n.length+r.length}c(TU,"reclaimExpiredLeases");async function kU(){return(await u.execute(Fr`
|
|
1701
1701
|
UPDATE memory_experiments me
|
|
1702
1702
|
SET status = 'failed',
|
|
1703
1703
|
error = 'reconciler: worker died mid-experiment (backing job terminal, row left running)',
|
|
@@ -1710,12 +1710,12 @@ end`;async function Gs(e){let t=e.req.param("teamId");if(!t||!oo.test(t))return{
|
|
|
1710
1710
|
AND aj.status IN ('failed', 'completed')
|
|
1711
1711
|
)
|
|
1712
1712
|
RETURNING me.id
|
|
1713
|
-
`)).length}c(
|
|
1713
|
+
`)).length}c(kU,"failStrandedMemoryExperiments");function lS(){let e=setTimeout(()=>{n()},3e4),t=setInterval(()=>{n()},AU);async function n(){try{let r=[];for(let o of RU)try{let s=await TU(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 kU();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 NU,eq as J_,sql as pm}from"drizzle-orm";O();import{and as pS,eq as V_,inArray as jU,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:Is(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"),jU(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 vs(Dn([...f.values()],{iterations:1e3}))},"effectOf");for(let m of t)n.set(m.id,p(m.id));return n}c(fS,"computeTrustClasses");var PU=1800*1e3;async function DU(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`
|
|
1714
1714
|
update memories m
|
|
1715
1715
|
set trust_class = v.cls, trust_version = v.ver, trust_computed_at = now()
|
|
1716
1716
|
from (values ${n}) as v(id, cls, ver)
|
|
1717
1717
|
where m.id = v.id and m.user_id = ${e}
|
|
1718
|
-
`)}c(
|
|
1718
|
+
`)}c(DU,"applyMaterializedTrust");async function OU(e){let t=await u.select({id:W.id,version:W.version}).from(W).where(NU(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 DU(e,r),r.length}c(OU,"refreshMemoryTrustForUser");async function CU(){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 OU(n)}catch(r){console.error(`[memory-trust-refresh] user ${n} failed:`,r instanceof Error?r.stack:r)}return{users:e.length,memories:t}}c(CU,"refreshAllMemoryTrust");function gS(){let e=setTimeout(()=>void n(),45e3),t=setInterval(()=>void n(),PU);async function n(){try{let{users:r,memories:o}=await CU();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 LU}from"drizzle-orm";var MU=30*6e4,hS=24,$U=6,_S="pipeline:usage_observations_stale";async function qU(){let e=await u.execute(LU`
|
|
1719
1719
|
WITH active_users AS (
|
|
1720
1720
|
SELECT user_id, count(*) AS sessions_24h
|
|
1721
1721
|
FROM sessions
|
|
@@ -1770,10 +1770,10 @@ end`;async function Gs(e){let t=e.req.param("teamId");if(!t||!oo.test(t))return{
|
|
|
1770
1770
|
SELECT 1 FROM alert_dispatches d
|
|
1771
1771
|
WHERE d.user_id = s.user_id
|
|
1772
1772
|
AND d.alert_key = ${_S}
|
|
1773
|
-
AND d.last_dispatched_at > now() - make_interval(hours => ${
|
|
1773
|
+
AND d.last_dispatched_at > now() - make_interval(hours => ${$U})
|
|
1774
1774
|
)
|
|
1775
1775
|
RETURNING user_id, id, last_state->>'message' AS message
|
|
1776
|
-
`);e.length>0&&console.log(`[usage-staleness] dispatched stale-pipeline alert for ${e.length} user(s)`);for(let t of e)try{await
|
|
1776
|
+
`);e.length>0&&console.log(`[usage-staleness] dispatched stale-pipeline alert for ${e.length} user(s)`);for(let t of e)try{await Oa({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(qU,"checkUsageStalenessOnce");function yS(){let e=setTimeout(()=>{n()},6e4),t=setInterval(()=>{n()},MU);async function n(){try{await qU()}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 UU}from"drizzle-orm";var HU=30*6e4,mm=24,BU=6,wS="pipeline:session_capture_stale";async function FU(){let e=await u.execute(UU`
|
|
1777
1777
|
WITH active_users AS (
|
|
1778
1778
|
SELECT user_id, max(last_seen) AS last_observed,
|
|
1779
1779
|
array_agg(DISTINCT signal) AS signals
|
|
@@ -1849,10 +1849,10 @@ end`;async function Gs(e){let t=e.req.param("teamId");if(!t||!oo.test(t))return{
|
|
|
1849
1849
|
SELECT 1 FROM alert_dispatches d
|
|
1850
1850
|
WHERE d.user_id = s.user_id
|
|
1851
1851
|
AND d.alert_key = ${wS}
|
|
1852
|
-
AND d.last_dispatched_at > now() - make_interval(hours => ${
|
|
1852
|
+
AND d.last_dispatched_at > now() - make_interval(hours => ${BU})
|
|
1853
1853
|
)
|
|
1854
1854
|
RETURNING user_id, id, last_state->>'message' AS message
|
|
1855
|
-
`);e.length>0&&console.log(`[capture-staleness] dispatched stale-capture alert for ${e.length} user(s)`);for(let t of e)try{await
|
|
1855
|
+
`);e.length>0&&console.log(`[capture-staleness] dispatched stale-capture alert for ${e.length} user(s)`);for(let t of e)try{await Oa({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(FU,"checkCaptureStalenessOnce");function vS(){let e=setTimeout(()=>{n()},9e4),t=setInterval(()=>{n()},HU);async function n(){try{await FU()}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 WU=900*1e3,bS=6,ES=60,zU=IS`array['user_message','tool_call','tool_result']`;async function VU(){return[...await u.execute(IS`
|
|
1856
1856
|
WITH session_stats AS (
|
|
1857
1857
|
SELECT s.id,
|
|
1858
1858
|
s.external_session_id,
|
|
@@ -1860,7 +1860,7 @@ end`;async function Gs(e){let t=e.req.param("teamId");if(!t||!oo.test(t))return{
|
|
|
1860
1860
|
(
|
|
1861
1861
|
SELECT MAX(timestamp) FROM session_events e
|
|
1862
1862
|
WHERE e.session_id = s.id
|
|
1863
|
-
AND e.event_type = ANY(${
|
|
1863
|
+
AND e.event_type = ANY(${zU})
|
|
1864
1864
|
) AS last_hook_event
|
|
1865
1865
|
FROM sessions s
|
|
1866
1866
|
WHERE s.started_at > now() - (${bS}::int * interval '1 hour')
|
|
@@ -1877,5 +1877,5 @@ end`;async function Gs(e){let t=e.req.param("teamId");if(!t||!oo.test(t))return{
|
|
|
1877
1877
|
AND cs.captured_at > ss.last_hook_event + (${ES}::int * interval '1 second')
|
|
1878
1878
|
GROUP BY ss.id, ss.external_session_id, ss.tool
|
|
1879
1879
|
HAVING COUNT(cs.id) > 0
|
|
1880
|
-
`)]}c(
|
|
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
|
|
1880
|
+
`)]}c(VU,"auditPollutionOnce");function AS(){let e=setTimeout(()=>{n()},6e4),t=setInterval(()=>{n()},WU);async function n(){try{let r=await VU();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 GU=gm.dirname(JU(import.meta.url)),SS=gm.resolve(GU,"../../../.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 YU=Tm({serviceName:"rulemetric-api"});YU?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 XU=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)}`),wr(e,{tags:{source:"unhandledRejection",code:t??"unknown"}})});process.on("uncaughtException",e=>{let t=yi(e);if(t&&XU.has(t)){console.error(`[guard] uncaughtException (transient net code=${t}) \u2014 surviving: ${e.message}`),wr(e,{tags:{source:"uncaughtException",code:t}});return}console.error("[guard] uncaughtException (fatal):",e),wr(e,{tags:{source:"uncaughtException",code:t??"unknown"}}),Promise.allSettled([Ja(2e3),xc()]).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,rs=[],xS=!1;async function QU(){let e=KU({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)"}`)),rs.push(lS()),rs.push(gS()),Fl()&&VI(),am()&&TA(),rs.push(yS()),rs.push(vS()),rs.push(kv()),rs.push(AS()),rs.push(...uS)}c(QU,"start");QU().catch(e=>{console.error("Failed to start API:",e),wr(e,{tags:{phase:"boot",source:"start"}}),Promise.allSettled([Ja(2e3),xc()]).finally(()=>process.exit(1))});async function TS(){if(!xS){xS=!0;for(let e of rs)try{e.stop()}catch{}try{RS?.close?.()}catch{}try{await JI(5e3)}catch{}try{await kA(5e3)}catch{}await Promise.allSettled([Em(),Ja(2e3),xc()]),process.exit(0)}}c(TS,"gracefulShutdown");process.on("SIGTERM",TS);process.on("SIGINT",TS);
|