@rulemetric/local 0.12.1 → 0.12.3
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 +223 -176
- package/dist/skills-registry.json +29037 -23187
- package/dist/supabase/migrations/00205_auto_accept_writes_only_to_canonical_checkouts.sql +110 -0
- package/package.json +2 -2
package/dist/server.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var W_=Object.defineProperty;var c=(e,t)=>W_(e,"name",{value:t,configurable:!0}),mp=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var G=(e,t)=>()=>(e&&(t=e(e=0)),t);var co=(e,t)=>{for(var n in t)W_(e,n,{get:t[n],enumerable:!0})};import{pgTable as Zu,text as ei,timestamp as za,jsonb as K_,uuid as rs,primaryKey as G_}from"drizzle-orm/pg-core";var Y,X,ee,we,os=G(()=>{"use strict";Y=Zu("organizations",{id:rs("id").primaryKey().defaultRandom(),name:ei("name").unique().notNull(),slug:ei("slug").unique().notNull(),metadata:K_("metadata"),createdAt:za("created_at",{withTimezone:!0}).defaultNow(),updatedAt:za("updated_at",{withTimezone:!0}).defaultNow()}),X=Zu("teams",{id:rs("id").primaryKey().defaultRandom(),orgId:rs("org_id").references(()=>Y.id,{onDelete:"cascade"}),name:ei("name").notNull(),slug:ei("slug").notNull(),metadata:K_("metadata"),createdAt:za("created_at",{withTimezone:!0}).defaultNow()}),ee=Zu("user_organizations",{userId:rs("user_id").notNull(),orgId:rs("org_id").references(()=>Y.id,{onDelete:"cascade"}).notNull(),role:ei("role").notNull().default("member"),createdAt:za("created_at",{withTimezone:!0}).defaultNow()},e=>[G_({columns:[e.userId,e.orgId]})]),we=Zu("user_teams",{userId:rs("user_id").notNull(),teamId:rs("team_id").references(()=>X.id,{onDelete:"cascade"}).notNull(),role:ei("role").notNull().default("member"),createdAt:za("created_at",{withTimezone:!0}).defaultNow()},e=>[G_({columns:[e.userId,e.teamId]})])});import{boolean as ed,integer as Va,pgTable as qS,real as Y_,text as td,timestamp as vp,uuid as X_}from"drizzle-orm/pg-core";var R,Yt=G(()=>{"use strict";os();R=qS("profiles",{id:X_("id").primaryKey(),email:td("email"),displayName:td("display_name"),activeOrgId:X_("active_org_id").references(()=>Y.id,{onDelete:"set null"}),isSuperadmin:ed("is_superadmin").notNull().default(!1),claudeCodePlan:td("claude_code_plan"),planSource:td("plan_source").notNull().default("detected"),setupCompletedAt:vp("setup_completed_at",{withTimezone:!0}),liveSendSkipped:ed("live_send_skipped").notNull().default(!1),autoAcceptSuggestions:ed("auto_accept_suggestions").notNull().default(!0),evolutionPaused:ed("evolution_paused").notNull().default(!1),suggestionConfidenceThreshold:Y_("suggestion_confidence_threshold").notNull().default(.7),autoAcceptMinScore:Y_("auto_accept_min_score"),autoAcceptMaxPerRun:Va("auto_accept_max_per_run"),autoAcceptMaxPerWindow:Va("auto_accept_max_per_window"),autoAcceptWindowDays:Va("auto_accept_window_days"),trialMaxConcurrent:Va("trial_max_concurrent"),trialMaxPerRun:Va("trial_max_per_run"),createdAt:vp("created_at",{withTimezone:!0}).defaultNow(),updatedAt:vp("updated_at",{withTimezone:!0}).defaultNow()})});import{pgTable as US,text as Ip,timestamp as nd,uuid as rd,index as Q_}from"drizzle-orm/pg-core";var ae,Z_=G(()=>{"use strict";os();Yt();ae=US("org_invitations",{id:rd("id").primaryKey().defaultRandom(),orgId:rd("org_id").notNull().references(()=>Y.id,{onDelete:"cascade"}),email:Ip("email").notNull(),role:Ip("role").notNull().default("member"),teamId:rd("team_id").references(()=>X.id,{onDelete:"set null"}),invitedBy:rd("invited_by").notNull().references(()=>R.id,{onDelete:"cascade"}),token:Ip("token").notNull().unique(),expiresAt:nd("expires_at",{withTimezone:!0}).notNull(),acceptedAt:nd("accepted_at",{withTimezone:!0}),revokedAt:nd("revoked_at",{withTimezone:!0}),createdAt:nd("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Q_("idx_org_invitations_token").on(e.token),Q_("idx_org_invitations_org").on(e.orgId)])});import{pgTable as bp,text as en,timestamp as uo,jsonb as od,uuid as _r,integer as sd,boolean as HS,uniqueIndex as id,index as Ja}from"drizzle-orm/pg-core";var g,yr,xe,Sn=G(()=>{"use strict";g=bp("instructions",{id:_r("id").primaryKey().defaultRandom(),name:en("name").notNull(),description:en("description").notNull(),type:en("type").notNull().default("instruction"),scope:en("scope").notNull(),scopeRef:_r("scope_ref"),version:en("version").notNull(),content:en("content").notNull(),frontmatter:od("frontmatter").notNull(),slots:od("slots"),tags:en("tags").array(),compatibility:en("compatibility").array(),createdBy:_r("created_by"),createdAt:uo("created_at",{withTimezone:!0}).defaultNow(),updatedAt:uo("updated_at",{withTimezone:!0}).defaultNow(),archived:HS("archived").default(!1),archivedAt:uo("archived_at",{withTimezone:!0}),archivedBy:_r("archived_by"),forkedFromId:_r("forked_from_id").references(()=>g.id,{onDelete:"set null"}),upstreamVersion:en("upstream_version"),badge:en("badge"),contentHash:en("content_hash"),contextIdentity:en("context_identity"),scanScore:sd("scan_score"),scanFindings:od("scan_findings"),popularityScore:sd("popularity_score"),sourceUpdatedAt:uo("source_updated_at",{withTimezone:!0})},e=>[id("instructions_name_scope_ref_idx").on(e.name,e.scope,e.scopeRef),Ja("idx_instructions_scope").on(e.scope,e.scopeRef),Ja("idx_instructions_created_by").on(e.createdBy),Ja("idx_instructions_context_identity").on(e.createdBy,e.contextIdentity),Ja("idx_instructions_public_recency").on(e.scope,e.sourceUpdatedAt.desc())]),yr=bp("instruction_version_identities",{id:_r("id").primaryKey().defaultRandom(),instructionId:_r("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),contentHash:en("content_hash").notNull(),versionOrdinal:sd("version_ordinal").notNull(),content:en("content"),firstSeenAt:uo("first_seen_at",{withTimezone:!0}).notNull().defaultNow(),lastSeenAt:uo("last_seen_at",{withTimezone:!0}).notNull().defaultNow(),createdAt:uo("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[id("instruction_version_identities_hash_unique").on(e.instructionId,e.contentHash),id("instruction_version_identities_ordinal_unique").on(e.instructionId,e.versionOrdinal),Ja("idx_ivi_instruction").on(e.instructionId)]),xe=bp("instruction_versions",{id:_r("id").primaryKey().defaultRandom(),instructionId:_r("instruction_id").references(()=>g.id,{onDelete:"cascade"}),versionNumber:sd("version_number").notNull(),content:en("content").notNull(),frontmatter:od("frontmatter").notNull(),changeSummary:en("change_summary"),createdBy:_r("created_by"),createdAt:uo("created_at",{withTimezone:!0}).defaultNow()},e=>[id("instruction_versions_instruction_version_idx").on(e.instructionId,e.versionNumber)])});import{pgTable as BS,text as FS,timestamp as WS,jsonb as zS,uuid as Ep,index as ey}from"drizzle-orm/pg-core";var Ut,ty=G(()=>{"use strict";Sn();Ut=BS("instruction_events",{id:Ep("id").primaryKey().defaultRandom(),instructionId:Ep("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),eventType:FS("event_type").notNull(),actorId:Ep("actor_id").notNull(),metadata:zS("metadata"),createdAt:WS("created_at",{withTimezone:!0}).defaultNow()},e=>[ey("idx_instruction_events_instruction").on(e.instructionId),ey("idx_instruction_events_type").on(e.eventType)])});import{boolean as VS,jsonb as JS,pgTable as Sp,primaryKey as ny,text as ss,timestamp as Ka,uniqueIndex as Ap,uuid as is}from"drizzle-orm/pg-core";import{sql as KS}from"drizzle-orm";var C,lt,ye,wr=G(()=>{"use strict";os();Sn();C=Sp("projects",{id:is("id").primaryKey().defaultRandom(),orgId:is("org_id").references(()=>Y.id,{onDelete:"cascade"}),name:ss("name").notNull(),description:ss("description"),githubRepo:ss("github_repo"),gitRemoteUrl:ss("git_remote_url"),gitRootCommit:ss("git_root_commit"),gitRemoteAliases:ss("git_remote_aliases").array().notNull().default([]),metadata:JS("metadata"),createdBy:is("created_by"),createdAt:Ka("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Ka("updated_at",{withTimezone:!0}).defaultNow()},e=>[Ap("projects_org_name_idx").on(e.orgId,e.name),Ap("projects_git_remote_url_unique").on(e.gitRemoteUrl).where(KS`${e.gitRemoteUrl} IS NOT NULL`)]),lt=Sp("project_instructions",{projectId:is("project_id").references(()=>C.id,{onDelete:"cascade"}).notNull(),instructionId:is("instruction_id").references(()=>g.id,{onDelete:"cascade"}).notNull(),addedAt:Ka("added_at",{withTimezone:!0}).defaultNow(),addedBy:is("added_by")},e=>[ny({columns:[e.projectId,e.instructionId]})]),ye=Sp("project_checkouts",{projectId:is("project_id").references(()=>C.id,{onDelete:"cascade"}).notNull(),path:ss("path").notNull(),isWorktree:VS("is_worktree").notNull().default(!1),firstSeen:Ka("first_seen",{withTimezone:!0}).notNull().defaultNow(),lastSeen:Ka("last_seen",{withTimezone:!0}).notNull().defaultNow()},e=>[ny({columns:[e.projectId,e.path]}),Ap("project_checkouts_path_unique").on(e.path)])});import{pgTable as GS,text as ti,timestamp as xp,jsonb as ry,uuid as ad,integer as YS,boolean as XS,index as Rp}from"drizzle-orm/pg-core";var Z,cd=G(()=>{"use strict";Yt();os();wr();Z=GS("agent_runs",{id:ad("id").primaryKey().defaultRandom(),userId:ad("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),orgId:ad("org_id").references(()=>Y.id,{onDelete:"set null"}),projectId:ad("project_id").references(()=>C.id,{onDelete:"set null"}),projectPath:ti("project_path"),gitRemote:ti("git_remote"),baseBranch:ti("base_branch"),title:ti("title"),prompt:ti("prompt"),toolSpec:ry("tool_spec").notNull().default([]),autoWorktree:XS("auto_worktree").notNull().default(!0),status:ti("status").notNull().default("pending"),sessionCount:YS("session_count").notNull().default(0),metadata:ry("metadata").notNull().default({}),createdAt:xp("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:xp("updated_at",{withTimezone:!0}).notNull().defaultNow(),completedAt:xp("completed_at",{withTimezone:!0})},e=>[Rp("idx_agent_runs_user").on(e.userId),Rp("idx_agent_runs_org_created").on(e.orgId,e.createdAt),Rp("idx_agent_runs_project").on(e.projectId)])});import{pgTable as Tp,text as xn,timestamp as Ga,jsonb as as,uuid as Br,integer as ud,uniqueIndex as oy,index as vr}from"drizzle-orm/pg-core";var y,ze,se,ni=G(()=>{"use strict";Sn();wr();Yt();os();cd();y=Tp("sessions",{id:Br("id").primaryKey().defaultRandom(),userId:Br("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),externalSessionId:xn("external_session_id"),projectId:Br("project_id").references(()=>C.id,{onDelete:"set null"}),orgId:Br("org_id").references(()=>Y.id,{onDelete:"set null"}),tool:xn("tool").notNull(),projectPath:xn("project_path"),gitBranch:xn("git_branch"),startedAt:Ga("started_at",{withTimezone:!0}).notNull(),endedAt:Ga("ended_at",{withTimezone:!0}),eventCount:ud("event_count").default(0),tokenUsage:as("token_usage"),analysis:as("analysis"),analyzedAt:Ga("analyzed_at",{withTimezone:!0}),analyzedEventCount:ud("analyzed_event_count"),analyzedTurnCount:ud("analyzed_turn_count"),metadata:as("metadata").default({}),origin:xn("origin").notNull().default("unknown"),runId:Br("run_id").references(()=>Z.id,{onDelete:"set null"}),model:xn("model"),harnessVersion:xn("harness_version"),createdAt:Ga("created_at",{withTimezone:!0}).defaultNow()},e=>[vr("idx_sessions_user").on(e.userId),vr("idx_sessions_tool").on(e.tool),vr("idx_sessions_started_at").on(e.startedAt),vr("idx_sessions_project").on(e.projectId),vr("idx_sessions_org_started_at").on(e.orgId,e.startedAt),vr("idx_sessions_run").on(e.runId),oy("idx_sessions_user_external").on(e.userId,e.externalSessionId)]),ze=Tp("session_events",{id:Br("id").primaryKey().defaultRandom(),sessionId:Br("session_id").notNull().references(()=>y.id,{onDelete:"cascade"}),sequence:ud("sequence").notNull(),eventType:xn("event_type").notNull(),content:xn("content"),toolName:xn("tool_name"),toolInput:as("tool_input"),toolOutput:as("tool_output"),tokenUsage:as("token_usage"),model:xn("model"),timestamp:Ga("timestamp",{withTimezone:!0}).notNull(),metadata:as("metadata").default({})},e=>[oy("session_events_session_sequence_idx").on(e.sessionId,e.sequence),vr("idx_session_events_session_id").on(e.sessionId),vr("idx_session_events_event_type").on(e.eventType),vr("idx_session_events_model").on(e.model)]),se=Tp("session_instructions",{sessionId:Br("session_id").notNull().references(()=>y.id,{onDelete:"cascade"}),instructionId:Br("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),linkMethod:xn("link_method").notNull(),contentHash:xn("content_hash")},e=>[vr("idx_session_instructions_instruction_id").on(e.instructionId)])});import{pgTable as sy,text as dd,timestamp as iy,uuid as Ir,integer as ay,index as ri,unique as QS}from"drizzle-orm/pg-core";var Lt,ne,cy=G(()=>{"use strict";Yt();wr();ni();Lt=sy("treatment_assignments",{id:Ir("id").primaryKey().defaultRandom(),userId:Ir("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),treatmentType:dd("treatment_type").notNull(),treatmentId:Ir("treatment_id").notNull(),treatmentVersion:ay("treatment_version").notNull().default(1),projectId:Ir("project_id").references(()=>C.id,{onDelete:"set null"}),assignedBy:Ir("assigned_by").references(()=>R.id,{onDelete:"set null"}),method:dd("method").notNull(),assignedAt:iy("assigned_at",{withTimezone:!0}).notNull().defaultNow()},e=>[ri("idx_treatment_assignments_user").on(e.userId),ri("idx_treatment_assignments_treatment").on(e.treatmentType,e.treatmentId),ri("idx_treatment_assignments_project").on(e.projectId)]),ne=sy("treatment_exposures",{id:Ir("id").primaryKey().defaultRandom(),sessionId:Ir("session_id").notNull().references(()=>y.id,{onDelete:"cascade"}),userId:Ir("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),treatmentType:dd("treatment_type").notNull(),treatmentId:Ir("treatment_id").notNull(),treatmentVersion:ay("treatment_version").notNull().default(1),assignmentId:Ir("assignment_id").references(()=>Lt.id,{onDelete:"set null"}),method:dd("method").notNull(),exposedAt:iy("exposed_at",{withTimezone:!0}).notNull().defaultNow()},e=>[QS("treatment_exposures_unique").on(e.sessionId,e.treatmentType,e.treatmentId,e.treatmentVersion),ri("idx_treatment_exposures_treatment").on(e.treatmentType,e.treatmentId),ri("idx_treatment_exposures_user").on(e.userId),ri("idx_treatment_exposures_session").on(e.sessionId)])});import{pgTable as ZS,text as kp,timestamp as ex,uuid as ld,integer as tx,index as uy,uniqueIndex as nx}from"drizzle-orm/pg-core";var md,dy=G(()=>{"use strict";Yt();wr();md=ZS("pending_treatment_exposures",{id:ld("id").primaryKey().defaultRandom(),userId:ld("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),externalSessionId:kp("external_session_id").notNull(),treatmentType:kp("treatment_type").notNull(),treatmentId:ld("treatment_id").notNull(),treatmentVersion:tx("treatment_version").notNull().default(1),method:kp("method").notNull().default("injected"),projectId:ld("project_id").references(()=>C.id,{onDelete:"set null"}),createdAt:ex("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[nx("pending_treatment_exposures_unique").on(e.externalSessionId,e.treatmentType,e.treatmentId,e.treatmentVersion),uy("idx_pending_treatment_exposures_ext").on(e.externalSessionId),uy("idx_pending_treatment_exposures_user").on(e.userId)])});import{pgTable as ly,text as lo,timestamp as my,uuid as oi,numeric as rx,index as Np,unique as ox}from"drizzle-orm/pg-core";var $,Fr,jp=G(()=>{"use strict";Yt();Sn();$=ly("instruction_experiments",{id:oi("id").primaryKey().defaultRandom(),userId:oi("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),instructionId:oi("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),projectPath:lo("project_path").notNull(),status:lo("status").notNull().default("running"),treatedShare:rx("treated_share").notNull().default("0.5"),salt:lo("salt").notNull(),contentHash:lo("content_hash"),source:lo("source").notNull().default("manual"),stoppedReason:lo("stopped_reason"),createdAt:my("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Np("idx_instruction_experiments_lookup").on(e.userId,e.projectPath)]),Fr=ly("instruction_experiment_arms",{id:oi("id").primaryKey().defaultRandom(),experimentId:oi("experiment_id").notNull().references(()=>$.id,{onDelete:"cascade"}),userId:oi("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),externalSessionId:lo("external_session_id").notNull(),arm:lo("arm").notNull(),assignedAt:my("assigned_at",{withTimezone:!0}).notNull().defaultNow()},e=>[ox("instruction_experiment_arms_unique").on(e.experimentId,e.externalSessionId),Np("idx_instruction_experiment_arms_experiment").on(e.experimentId,e.arm),Np("idx_instruction_experiment_arms_session").on(e.externalSessionId)])});import{pgTable as sx,text as Pp,timestamp as ix,uuid as pd,numeric as Dp,integer as py,jsonb as ax,index as cx,unique as ux}from"drizzle-orm/pg-core";var Q,fy=G(()=>{"use strict";Yt();Sn();jp();Q=sx("instruction_verdicts",{id:pd("id").primaryKey().defaultRandom(),userId:pd("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),instructionId:pd("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),contentHash:Pp("content_hash").notNull(),projectPath:Pp("project_path").notNull(),segment:ax("segment").notNull().default({}),decision:Pp("decision").notNull(),delta:Dp("delta").notNull(),ciLower:Dp("ci_lower").notNull(),ciUpper:Dp("ci_upper").notNull(),nTreated:py("n_treated").notNull(),nControl:py("n_control").notNull(),experimentId:pd("experiment_id").references(()=>$.id,{onDelete:"set null"}),decidedAt:ix("decided_at",{withTimezone:!0}).notNull().defaultNow()},e=>[ux("instruction_verdicts_unique").on(e.instructionId,e.contentHash,e.projectPath),cx("idx_instruction_verdicts_render").on(e.userId,e.projectPath)])});import{pgTable as dx,text as fd,timestamp as Op,uuid as Cp,integer as lx,unique as mx,index as px}from"drizzle-orm/pg-core";var Re,gy=G(()=>{"use strict";Yt();Re=dx("insight_recommendation_log",{id:Cp("id").primaryKey().defaultRandom(),userId:Cp("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),projectPath:fd("project_path").notNull().default(""),category:fd("category").notNull(),contentHash:fd("content_hash").notNull(),label:fd("label").notNull().default(""),firstSeenAt:Op("first_seen_at",{withTimezone:!0}).notNull().defaultNow(),lastSeenAt:Op("last_seen_at",{withTimezone:!0}).notNull().defaultNow(),timesGenerated:lx("times_generated").notNull().default(1),lastJobId:Cp("last_job_id"),dismissedAt:Op("dismissed_at",{withTimezone:!0})},e=>[mx("insight_recommendation_log_unique").on(e.userId,e.projectPath,e.contentHash),px("idx_insight_recommendation_log_read").on(e.userId,e.projectPath)])});import{pgTable as fx,text as si,timestamp as Lp,uuid as Ya,integer as hy,index as gd}from"drizzle-orm/pg-core";var F,Mp=G(()=>{"use strict";Yt();wr();F=fx("memories",{id:Ya("id").primaryKey().defaultRandom(),userId:Ya("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),orgId:Ya("org_id"),projectId:Ya("project_id").references(()=>C.id,{onDelete:"set null"}),version:hy("version").notNull().default(1),parentId:Ya("parent_id").references(()=>F.id,{onDelete:"set null"}),kind:si("kind").notNull(),title:si("title").notNull(),body:si("body").notNull(),source:si("source").notNull(),status:si("status").notNull().default("active"),trustClass:si("trust_class"),trustVersion:hy("trust_version"),trustComputedAt:Lp("trust_computed_at",{withTimezone:!0}),createdAt:Lp("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:Lp("updated_at",{withTimezone:!0}).notNull().defaultNow()},e=>[gd("idx_memories_user").on(e.userId),gd("idx_memories_project").on(e.projectId),gd("idx_memories_parent").on(e.parentId),gd("idx_memories_user_status").on(e.userId,e.status)])});import{pgTable as gx,text as Xa,timestamp as $p,uuid as qp,integer as _y,jsonb as hx,index as yy}from"drizzle-orm/pg-core";var Mt,wy=G(()=>{"use strict";Yt();Mp();Mt=gx("memory_experiments",{id:qp("id").primaryKey().defaultRandom(),memoryId:qp("memory_id").notNull().references(()=>F.id,{onDelete:"cascade"}),userId:qp("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),memoryVersion:_y("memory_version").notNull().default(1),taskPrompt:Xa("task_prompt").notNull(),expectations:Xa("expectations").array().notNull().default([]),trials:_y("trials").notNull().default(10),model:Xa("model"),status:Xa("status").notNull().default("pending"),result:hx("result").$type(),error:Xa("error"),createdAt:$p("created_at",{withTimezone:!0}).notNull().defaultNow(),startedAt:$p("started_at",{withTimezone:!0}),completedAt:$p("completed_at",{withTimezone:!0})},e=>[yy("idx_memory_experiments_memory").on(e.memoryId),yy("idx_memory_experiments_user").on(e.userId)])});import{pgTable as _x,text as ii,timestamp as Up,uuid as Hp,jsonb as yx,uniqueIndex as wx,index as vy}from"drizzle-orm/pg-core";var Ze,Bp=G(()=>{"use strict";Yt();ni();Ze=_x("session_terminal_targets",{id:Hp("id").primaryKey().defaultRandom(),userId:Hp("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),sessionId:Hp("session_id").references(()=>y.id,{onDelete:"set null"}),externalSessionId:ii("external_session_id"),kind:ii("kind").notNull(),target:ii("target").notNull(),status:ii("status").notNull().default("active"),attachCommand:ii("attach_command").notNull(),projectPath:ii("project_path"),metadata:yx("metadata").notNull().default({}),lastSeenAt:Up("last_seen_at",{withTimezone:!0}).defaultNow(),createdAt:Up("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Up("updated_at",{withTimezone:!0}).defaultNow()},e=>[wx("idx_session_terminal_targets_user_target").on(e.userId,e.target),vy("idx_session_terminal_targets_session").on(e.sessionId),vy("idx_session_terminal_targets_user_status").on(e.userId,e.status)])});import{boolean as vx,index as hd,jsonb as Iy,pgTable as Ix,text as cs,timestamp as Qa,uuid as _d,integer as by}from"drizzle-orm/pg-core";var yd,Ey=G(()=>{"use strict";ni();Bp();yd=Ix("session_send_jobs",{id:_d("id").primaryKey().defaultRandom(),userId:_d("user_id").notNull(),sessionId:_d("session_id").notNull().references(()=>y.id,{onDelete:"cascade"}),terminalTargetId:_d("terminal_target_id").references(()=>Ze.id,{onDelete:"set null"}),target:cs("target").notNull(),message:cs("message").notNull(),submit:vx("submit").notNull().default(!0),delivery:cs("delivery").notNull().default("live"),status:cs("status").notNull().default("pending"),result:Iy("result"),error:cs("error"),attempts:by("attempts").notNull().default(0),taskKind:cs("task_kind"),payload:Iy("payload"),claimedBy:cs("claimed_by"),claimedAt:Qa("claimed_at",{withTimezone:!0}),leaseExpiresAt:Qa("lease_expires_at",{withTimezone:!0}),leaseRecoveries:by("lease_recoveries").notNull().default(0),createdAt:Qa("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Qa("updated_at",{withTimezone:!0}).defaultNow(),completedAt:Qa("completed_at",{withTimezone:!0})},e=>[hd("idx_session_send_jobs_user").on(e.userId),hd("idx_session_send_jobs_session").on(e.sessionId),hd("idx_session_send_jobs_status").on(e.status),hd("idx_session_send_jobs_pending").on(e.userId,e.status)])});import{pgTable as Sy,text as us,timestamp as wd,jsonb as xy,uuid as mo,integer as bx,boolean as Ex,uniqueIndex as Ax,index as Ay,primaryKey as Sx}from"drizzle-orm/pg-core";var Ue,Me,Ry=G(()=>{"use strict";Sn();Ue=Sy("packs",{id:mo("id").primaryKey().defaultRandom(),name:us("name").notNull(),description:us("description").notNull(),scope:us("scope").notNull(),scopeRef:mo("scope_ref"),version:us("version").notNull().default("1.0.0"),tags:us("tags").array(),badge:us("badge"),metadata:xy("metadata"),createdBy:mo("created_by"),createdAt:wd("created_at",{withTimezone:!0}).defaultNow(),updatedAt:wd("updated_at",{withTimezone:!0}).defaultNow(),archived:Ex("archived").default(!1),archivedAt:wd("archived_at",{withTimezone:!0}),archivedBy:mo("archived_by"),forkedFromId:mo("forked_from_id").references(()=>Ue.id,{onDelete:"set null"}),upstreamVersion:us("upstream_version")},e=>[Ax("packs_name_scope_ref_idx").on(e.name,e.scope,e.scopeRef),Ay("idx_packs_scope").on(e.scope,e.scopeRef),Ay("idx_packs_created_by").on(e.createdBy)]),Me=Sy("pack_instructions",{packId:mo("pack_id").references(()=>Ue.id,{onDelete:"cascade"}).notNull(),instructionId:mo("instruction_id").references(()=>g.id,{onDelete:"cascade"}).notNull(),position:bx("position").notNull().default(0),slotOverrides:xy("slot_overrides"),addedAt:wd("added_at",{withTimezone:!0}).defaultNow(),addedBy:mo("added_by")},e=>[Sx({columns:[e.packId,e.instructionId]})])});import{pgTable as xx,text as Fp,timestamp as Rx,jsonb as Tx,uuid as Wp,index as ai}from"drizzle-orm/pg-core";var po,Ty=G(()=>{"use strict";Sn();po=xx("instruction_usage_events",{id:Wp("id").primaryKey().defaultRandom(),instructionId:Wp("instruction_id").references(()=>g.id,{onDelete:"set null"}),userId:Wp("user_id").notNull(),surface:Fp("surface").notNull(),action:Fp("action").notNull(),metadata:Tx("metadata"),traceId:Fp("trace_id"),createdAt:Rx("created_at",{withTimezone:!0}).defaultNow()},e=>[ai("idx_usage_events_instruction").on(e.instructionId),ai("idx_usage_events_user").on(e.userId),ai("idx_usage_events_surface").on(e.surface),ai("idx_usage_events_action").on(e.action),ai("idx_usage_events_created_at").on(e.createdAt),ai("idx_usage_events_user_created").on(e.userId,e.createdAt)])});import{pgTable as kx,text as vd,timestamp as ky,jsonb as Nx,uuid as Ny,index as zp}from"drizzle-orm/pg-core";var fe,jy=G(()=>{"use strict";fe=kx("worker_connections",{id:Ny("id").primaryKey().defaultRandom(),userId:Ny("user_id").notNull(),workerType:vd("worker_type").notNull().default("mcp"),clientName:vd("client_name").notNull(),clientVersion:vd("client_version"),workerVersion:vd("worker_version"),lastHeartbeat:ky("last_heartbeat",{withTimezone:!0}).notNull().defaultNow(),connectedAt:ky("connected_at",{withTimezone:!0}).notNull().defaultNow(),metadata:Nx("metadata")},e=>[zp("idx_worker_connections_user").on(e.userId),zp("idx_worker_connections_heartbeat").on(e.userId,e.lastHeartbeat),zp("idx_worker_connections_type").on(e.userId,e.workerType)])});import{pgTable as jx,text as Id,timestamp as Px,jsonb as Dx,uuid as Py,index as Dy}from"drizzle-orm/pg-core";var bd,Oy=G(()=>{"use strict";bd=jx("cli_setup_events",{id:Py("id").primaryKey().defaultRandom(),userId:Py("user_id").notNull(),deviceId:Id("device_id").notNull(),event:Id("event").notNull(),cliVersion:Id("cli_version"),os:Id("os"),props:Dx("props").notNull().default({}),createdAt:Px("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Dy("idx_cli_setup_events_user").on(e.userId,e.createdAt),Dy("idx_cli_setup_events_device").on(e.deviceId,e.createdAt)])});import{pgTable as Ox,text as ds,integer as Cx,boolean as Lx,timestamp as Mx,jsonb as $x,uuid as qx,index as Cy}from"drizzle-orm/pg-core";var Ed,Ly=G(()=>{"use strict";Ed=Ox("cli_error_events",{id:qx("id").primaryKey().defaultRandom(),deviceId:ds("device_id"),event:ds("event").notNull(),command:ds("command"),statusCode:Cx("status_code"),message:ds("message"),cliVersion:ds("cli_version"),os:ds("os"),nodeVersion:ds("node_version"),proxied:Lx("proxied"),props:$x("props").notNull().default({}),createdAt:Mx("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Cy("idx_cli_error_events_created").on(e.createdAt),Cy("idx_cli_error_events_device").on(e.deviceId,e.createdAt)])});import{sql as Vp}from"drizzle-orm";import{pgTable as ls,text as _t,timestamp as gn,jsonb as $n,uuid as mt,integer as Wr,boolean as Za,index as Ht,unique as My}from"drizzle-orm/pg-core";var k,Ee,Ie,ot,et,me,rr,ec=G(()=>{"use strict";Sn();k=ls("eval_targets",{id:mt("id").primaryKey().defaultRandom(),userId:mt("user_id").notNull(),name:_t("name").notNull(),type:_t("type").notNull(),content:_t("content").notNull(),description:_t("description").notNull().default(""),metadata:$n("metadata").notNull().default({}),version:Wr("version").notNull().default(1),parentId:mt("parent_id").references(()=>k.id,{onDelete:"set null"}),instructionId:mt("instruction_id").references(()=>g.id,{onDelete:"set null"}),projectPath:_t("project_path"),createdAt:gn("created_at",{withTimezone:!0}).defaultNow(),updatedAt:gn("updated_at",{withTimezone:!0}).defaultNow()},e=>[Ht("eval_targets_name_user_idx").on(e.name,e.userId),Ht("idx_eval_targets_user").on(e.userId),Ht("idx_eval_targets_type").on(e.type),Ht("idx_eval_targets_parent").on(e.parentId),Ht("idx_eval_targets_instruction").on(e.instructionId).where(Vp`${e.instructionId} IS NOT NULL`),Ht("idx_eval_targets_project").on(e.projectPath).where(Vp`${e.projectPath} IS NOT NULL`)]),Ee=ls("evals",{id:mt("id").primaryKey().defaultRandom(),evalTargetId:mt("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),name:_t("name").notNull(),prompt:_t("prompt").notNull(),expectedOutput:_t("expected_output").notNull().default(""),files:$n("files").notNull().default([]),expectations:$n("expectations").notNull().default([]),retiredAt:gn("retired_at",{withTimezone:!0}),retiredReason:_t("retired_reason"),createdAt:gn("created_at",{withTimezone:!0}).defaultNow(),updatedAt:gn("updated_at",{withTimezone:!0}).defaultNow(),contentUpdatedAt:gn("content_updated_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Ht("idx_evals_target").on(e.evalTargetId),Ht("idx_evals_target_active").on(e.evalTargetId).where(Vp`${e.retiredAt} IS NULL`)]),Ie=ls("eval_runs",{id:mt("id").primaryKey().defaultRandom(),jobId:mt("job_id"),evalId:mt("eval_id").notNull().references(()=>Ee.id,{onDelete:"cascade"}),evalTargetId:mt("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),evalTargetVersion:Wr("eval_target_version").notNull(),configuration:_t("configuration").notNull(),runNumber:Wr("run_number").notNull().default(1),iteration:Wr("iteration").notNull().default(1),status:_t("status").notNull().default("completed"),outputs:$n("outputs").notNull().default({}),timing:$n("timing").notNull().default({}),grading:$n("grading").notNull().default({}),comparison:$n("comparison"),createdAt:gn("created_at",{withTimezone:!0}).defaultNow()},e=>[Ht("idx_eval_runs_eval").on(e.evalId),Ht("idx_eval_runs_target").on(e.evalTargetId),Ht("idx_eval_runs_iteration").on(e.evalTargetId,e.iteration)]),ot=ls("eval_comparisons",{id:mt("id").primaryKey().defaultRandom(),userId:mt("user_id").notNull(),targetAId:mt("target_a_id").notNull().references(()=>k.id,{onDelete:"cascade"}),targetBId:mt("target_b_id").notNull().references(()=>k.id,{onDelete:"cascade"}),targetAVersion:Wr("target_a_version").notNull(),targetBVersion:Wr("target_b_version").notNull(),isSwapped:Za("is_swapped").notNull().default(!1),winnerTargetId:mt("winner_target_id").references(()=>k.id,{onDelete:"set null"}),perEval:$n("per_eval").notNull().default([]),overall:$n("overall").notNull().default({}),rawOutput:_t("raw_output"),model:_t("model"),status:_t("status").notNull().default("completed"),createdAt:gn("created_at",{withTimezone:!0}).defaultNow()},e=>[Ht("idx_eval_comparisons_target_a").on(e.targetAId),Ht("idx_eval_comparisons_target_b").on(e.targetBId),Ht("idx_eval_comparisons_user").on(e.userId)]),et=ls("eval_grade_annotations",{id:mt("id").primaryKey().defaultRandom(),userId:mt("user_id").notNull(),evalRunId:mt("eval_run_id").notNull().references(()=>Ie.id,{onDelete:"cascade"}),evalTargetId:mt("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),expectationIndex:Wr("expectation_index").notNull(),expectationText:_t("expectation_text").notNull(),judgePassed:Za("judge_passed").notNull(),judgeMethod:_t("judge_method").notNull(),judgeModel:_t("judge_model"),verdict:_t("verdict").notNull(),flag:_t("flag"),note:_t("note"),createdAt:gn("created_at",{withTimezone:!0}).defaultNow(),updatedAt:gn("updated_at",{withTimezone:!0}).defaultNow()},e=>[Ht("idx_eval_grade_annotations_target").on(e.evalTargetId),Ht("idx_eval_grade_annotations_run").on(e.evalRunId),My("eval_grade_annotations_eval_run_id_expectation_index_key").on(e.evalRunId,e.expectationIndex)]),me=ls("judge_reviewer_verdicts",{id:mt("id").primaryKey().defaultRandom(),userId:mt("user_id").notNull(),evalTargetId:mt("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),evalRunId:mt("eval_run_id").notNull().references(()=>Ie.id,{onDelete:"cascade"}),expectationIndex:Wr("expectation_index").notNull(),expectationText:_t("expectation_text").notNull(),judgePassed:Za("judge_passed").notNull(),humanPassed:Za("human_passed").notNull(),reviewerEngine:_t("reviewer_engine").notNull(),reviewerModel:_t("reviewer_model").notNull(),reviewerPassed:Za("reviewer_passed").notNull(),resolvedAt:gn("resolved_at",{withTimezone:!0}),resolution:_t("resolution"),createdAt:gn("created_at",{withTimezone:!0}).defaultNow(),updatedAt:gn("updated_at",{withTimezone:!0}).defaultNow()},e=>[Ht("idx_jrv_target").on(e.evalTargetId),My("judge_reviewer_verdicts_eval_run_id_expectation_index_review_key").on(e.evalRunId,e.expectationIndex,e.reviewerModel)]),rr=ls("benchmarks",{id:mt("id").primaryKey().defaultRandom(),evalTargetId:mt("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),iteration:Wr("iteration").notNull().default(1),runSummary:$n("run_summary").notNull().default({}),notes:$n("notes").notNull().default([]),feedback:$n("feedback"),createdAt:gn("created_at",{withTimezone:!0}).defaultNow()},e=>[Ht("idx_benchmarks_target").on(e.evalTargetId)])});import{sql as Jp}from"drizzle-orm";import{pgTable as Ux,text as zr,timestamp as Hx,jsonb as Ad,uuid as Sd,boolean as Bx,index as tc,uniqueIndex as Fx}from"drizzle-orm/pg-core";var ie,$y=G(()=>{"use strict";ec();Sn();ie=Ux("instruction_promotions",{id:Sd("id").primaryKey().defaultRandom(),userId:Sd("user_id").notNull(),evalTargetId:Sd("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),instructionId:Sd("instruction_id").references(()=>g.id,{onDelete:"set null"}),fromContentHash:zr("from_content_hash").notNull(),toContentHash:zr("to_content_hash").notNull(),fromContent:zr("from_content").notNull(),toContent:zr("to_content").notNull(),proposalSource:zr("proposal_source").notNull(),proposalRationale:zr("proposal_rationale").notNull().default(""),decision:zr("decision").notNull(),applied:Bx("applied").notNull().default(!1),refusals:Ad("refusals").notNull().default([]),rationale:zr("rationale").notNull().default(""),effectClass:zr("effect_class").notNull(),verdict:Ad("verdict").notNull().default({}),gates:Ad("gates").notNull().default({}),touchedSections:Ad("touched_sections").notNull().default([]),createdAt:Hx("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[tc("idx_instruction_promotions_budget").on(e.evalTargetId,e.createdAt.desc()).where(Jp`${e.applied}`),tc("idx_instruction_promotions_target").on(e.evalTargetId,e.createdAt.desc()),tc("idx_instruction_promotions_user").on(e.userId,e.createdAt.desc()),tc("idx_instruction_promotions_to_hash").on(e.toContentHash),Fx("uq_instruction_promotions_applied").on(e.evalTargetId,e.fromContentHash,e.toContentHash).where(Jp`${e.applied}`),tc("idx_instruction_promotions_applied_hash").on(e.toContentHash,e.createdAt.desc()).where(Jp`${e.applied}`)])});import{index as nc,integer as Wx,jsonb as zx,pgTable as Vx,text as Rn,timestamp as ci,uniqueIndex as Jx,uuid as rc}from"drizzle-orm/pg-core";var Te,qy=G(()=>{"use strict";Sn();wr();Te=Vx("recommendation_applications",{id:rc("id").primaryKey().defaultRandom(),userId:rc("user_id").notNull(),instructionId:rc("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),projectId:rc("project_id").references(()=>C.id,{onDelete:"set null"}),projectPath:Rn("project_path").notNull(),harness:Rn("harness").notNull(),targetPath:Rn("target_path").notNull(),status:Rn("status").notNull().default("proposed"),applyMode:Rn("apply_mode").notNull(),beforeHash:Rn("before_hash"),appliedHash:Rn("applied_hash"),appliedAt:ci("applied_at",{withTimezone:!0}),measurementStartedAt:ci("measurement_started_at",{withTimezone:!0}),measurementEndedAt:ci("measurement_ended_at",{withTimezone:!0}),verdict:Rn("verdict"),verdictDetail:Rn("verdict_detail"),revertedAt:ci("reverted_at",{withTimezone:!0}),boundaryClass:Rn("boundary_class"),targets:Rn("targets").array().notNull().default([]),inverse:zx("inverse"),requires:Rn("requires").array().notNull().default([]),provides:Rn("provides").array().notNull().default([]),applyBatchId:rc("apply_batch_id"),applySeq:Wx("apply_seq"),createdAt:ci("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:ci("updated_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Jx("uq_recommendation_applications_target").on(e.userId,e.instructionId,e.projectPath,e.harness,e.targetPath),nc("idx_recommendation_applications_user_status").on(e.userId,e.status,e.updatedAt.desc()),nc("idx_recommendation_applications_user_harness").on(e.userId,e.harness,e.updatedAt.desc()),nc("idx_recommendation_applications_project").on(e.projectId,e.updatedAt.desc()),nc("idx_recommendation_applications_batch").on(e.userId,e.applyBatchId,e.applySeq.desc()),nc("idx_recommendation_applications_requires").using("gin",e.requires)])});import{pgTable as Kx,text as fo,timestamp as Gx,jsonb as oc,uuid as Kp,integer as Gp,real as Yx,index as sc,uniqueIndex as Uy}from"drizzle-orm/pg-core";var M,Hy=G(()=>{"use strict";ni();Yt();M=Kx("context_snapshots",{id:Kp("id").primaryKey().defaultRandom(),sessionId:Kp("session_id").references(()=>y.id,{onDelete:"cascade"}),userId:Kp("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),sequence:Gp("sequence").notNull().default(0),provider:fo("provider").notNull(),model:fo("model").notNull(),systemPrompt:fo("system_prompt").notNull(),injectedInstructions:oc("injected_instructions").notNull().default([]),messagesSummary:oc("messages_summary").notNull(),tools:oc("tools").notNull().default([]),systemHash:fo("system_hash").notNull(),requestHash:fo("request_hash").notNull().default(""),toolsHash:fo("tools_hash"),injectedHash:fo("injected_hash"),messagesDelta:oc("messages_delta").default([]),messagesDeltaRef:fo("messages_delta_ref"),maxTokens:Gp("max_tokens"),temperature:Yx("temperature"),estimatedTokens:Gp("estimated_tokens"),capturedAt:Gx("captured_at",{withTimezone:!0}).notNull().defaultNow(),metadata:oc("metadata").default({})},e=>[sc("idx_context_snapshots_session").on(e.sessionId),sc("idx_context_snapshots_user").on(e.userId),sc("idx_context_snapshots_hash").on(e.systemHash),sc("idx_context_snapshots_request_hash").on(e.requestHash),Uy("idx_snapshots_session_request").on(e.sessionId,e.requestHash),Uy("idx_snapshots_session_sequence").on(e.sessionId,e.sequence),sc("idx_context_snapshots_user_session_captured").on(e.userId,e.sessionId,e.capturedAt.desc())])});import{pgTable as Xx,text as By,timestamp as Qx,jsonb as Zx,integer as eR,index as tR}from"drizzle-orm/pg-core";var Tn,Fy=G(()=>{"use strict";Tn=Xx("content_blobs",{hash:By("hash").primaryKey(),contentType:By("content_type").notNull(),content:Zx("content").notNull(),sizeBytes:eR("size_bytes").notNull().default(0),createdAt:Qx("created_at",{withTimezone:!0}).defaultNow()},e=>[tR("idx_content_blobs_type").on(e.contentType)])});import{pgTable as nR,text as xd,timestamp as ic,jsonb as Rd,uuid as Yp,index as Td,integer as Wy}from"drizzle-orm/pg-core";var je,zy=G(()=>{"use strict";ec();je=nR("eval_jobs",{id:Yp("id").primaryKey().defaultRandom(),userId:Yp("user_id").notNull(),evalTargetId:Yp("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),status:xd("status").notNull().default("pending"),config:Rd("config").notNull().default({}),progress:Rd("progress").notNull().default({}),result:Rd("result"),error:xd("error"),attempts:Wy("attempts").notNull().default(0),taskKind:xd("task_kind"),payload:Rd("payload"),claimedBy:xd("claimed_by"),claimedAt:ic("claimed_at",{withTimezone:!0}),leaseExpiresAt:ic("lease_expires_at",{withTimezone:!0}),leaseRecoveries:Wy("lease_recoveries").notNull().default(0),createdAt:ic("created_at",{withTimezone:!0}).defaultNow(),updatedAt:ic("updated_at",{withTimezone:!0}).defaultNow(),completedAt:ic("completed_at",{withTimezone:!0})},e=>[Td("idx_eval_jobs_user").on(e.userId),Td("idx_eval_jobs_target").on(e.evalTargetId),Td("idx_eval_jobs_status").on(e.status),Td("idx_eval_jobs_pending").on(e.userId,e.status)])});import{pgTable as rR,text as ac,timestamp as cc,jsonb as Vy,uuid as Jy,integer as Ky,index as Gy}from"drizzle-orm/pg-core";var Pe,Yy=G(()=>{"use strict";Pe=rR("agent_jobs",{id:Jy("id").primaryKey().defaultRandom(),userId:Jy("user_id").notNull(),taskKind:ac("task_kind").notNull(),status:ac("status").notNull().default("pending"),payload:Vy("payload").notNull(),dedupeKey:ac("dedupe_key"),result:Vy("result"),error:ac("error"),attempts:Ky("attempts").notNull().default(0),claimedBy:ac("claimed_by"),claimedAt:cc("claimed_at",{withTimezone:!0}),leaseExpiresAt:cc("lease_expires_at",{withTimezone:!0}),leaseRecoveries:Ky("lease_recoveries").notNull().default(0),createdAt:cc("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:cc("updated_at",{withTimezone:!0}).notNull().defaultNow(),completedAt:cc("completed_at",{withTimezone:!0})},e=>[Gy("idx_agent_jobs_claim").on(e.userId,e.status,e.taskKind,e.createdAt),Gy("idx_agent_jobs_dedupe").on(e.userId,e.taskKind,e.dedupeKey)])});import{pgTable as oR,text as uc,timestamp as dc,jsonb as kd,uuid as Xp,index as Nd,integer as Xy}from"drizzle-orm/pg-core";var z,Qy=G(()=>{"use strict";wr();z=oR("insights_jobs",{id:Xp("id").primaryKey().defaultRandom(),userId:Xp("user_id").notNull(),status:uc("status").notNull().default("pending"),projectPath:uc("project_path"),projectId:Xp("project_id").references(()=>C.id,{onDelete:"set null"}),config:kd("config").notNull().default({}),progress:kd("progress").notNull().default({}),result:kd("result"),error:uc("error"),attempts:Xy("attempts").notNull().default(0),taskKind:uc("task_kind"),payload:kd("payload"),claimedBy:uc("claimed_by"),claimedAt:dc("claimed_at",{withTimezone:!0}),leaseExpiresAt:dc("lease_expires_at",{withTimezone:!0}),leaseRecoveries:Xy("lease_recoveries").notNull().default(0),createdAt:dc("created_at",{withTimezone:!0}).defaultNow(),updatedAt:dc("updated_at",{withTimezone:!0}).defaultNow(),completedAt:dc("completed_at",{withTimezone:!0})},e=>[Nd("idx_insights_jobs_user").on(e.userId),Nd("idx_insights_jobs_status").on(e.status),Nd("idx_insights_jobs_pending").on(e.userId,e.status),Nd("idx_insights_jobs_project").on(e.projectId)])});import{pgTable as sR,text as Qp,timestamp as jd,uuid as Zy,index as iR,uniqueIndex as aR}from"drizzle-orm/pg-core";var Ae,ew=G(()=>{"use strict";Yt();Ae=sR("api_keys",{id:Zy("id").primaryKey().defaultRandom(),userId:Zy("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),name:Qp("name").notNull(),keyHash:Qp("key_hash").notNull(),keyPrefix:Qp("key_prefix").notNull(),lastUsedAt:jd("last_used_at",{withTimezone:!0}),expiresAt:jd("expires_at",{withTimezone:!0}),revokedAt:jd("revoked_at",{withTimezone:!0}),createdAt:jd("created_at",{withTimezone:!0}).defaultNow()},e=>[iR("idx_api_keys_user").on(e.userId),aR("idx_api_keys_hash").on(e.keyHash)])});import{pgTable as cR,text as Zp,timestamp as tw,uuid as uR,index as dR}from"drizzle-orm/pg-core";var qn,nw=G(()=>{"use strict";Yt();qn=cR("extension_auth_codes",{code:Zp("code").primaryKey(),userId:uR("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),editor:Zp("editor"),email:Zp("email"),expiresAt:tw("expires_at",{withTimezone:!0}).notNull(),createdAt:tw("created_at",{withTimezone:!0}).defaultNow()},e=>[dR("idx_ext_auth_codes_expiry").on(e.expiresAt)])});import{pgTable as lR,text as mR,timestamp as rw,jsonb as pR,uuid as ef,index as ow}from"drizzle-orm/pg-core";var He,sw=G(()=>{"use strict";ec();He=lR("eval_conversations",{id:ef("id").primaryKey().defaultRandom(),evalTargetId:ef("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),userId:ef("user_id").notNull(),messages:pR("messages").notNull().default([]),status:mR("status").notNull().default("active"),createdAt:rw("created_at",{withTimezone:!0}).defaultNow(),updatedAt:rw("updated_at",{withTimezone:!0}).defaultNow()},e=>[ow("idx_eval_conversations_target").on(e.evalTargetId),ow("idx_eval_conversations_user").on(e.userId)])});import{pgTable as fR,text as Vr,timestamp as iw,jsonb as gR,uuid as tf}from"drizzle-orm/pg-core";var go,aw=G(()=>{"use strict";go=fR("skill_submissions",{id:tf("id").primaryKey().defaultRandom(),skillId:Vr("skill_id").notNull(),name:Vr("name").notNull(),description:Vr("description").notNull(),category:Vr("category").notNull(),tools:Vr("tools").array().notNull(),tags:Vr("tags").array().default([]),content:Vr("content").notNull(),status:Vr("status").notNull().default("pending"),submittedBy:tf("submitted_by").notNull(),reviewedBy:tf("reviewed_by"),reviewNote:Vr("review_note"),metadata:gR("metadata"),createdAt:iw("created_at",{withTimezone:!0}).defaultNow(),updatedAt:iw("updated_at",{withTimezone:!0}).defaultNow()})});import{pgTable as hR,text as lc,timestamp as cw,jsonb as _R,uuid as yR,uniqueIndex as wR,index as uw}from"drizzle-orm/pg-core";var $t,dw=G(()=>{"use strict";$t=hR("harness_releases",{id:yR("id").primaryKey().defaultRandom(),harness:lc("harness").notNull(),version:lc("version").notNull(),publishedAt:cw("published_at",{withTimezone:!0}).notNull(),title:lc("title"),body:lc("body"),categories:_R("categories").default({}),url:lc("url"),createdAt:cw("created_at",{withTimezone:!0}).defaultNow()},e=>[wR("idx_harness_releases_unique").on(e.harness,e.version),uw("idx_harness_releases_harness").on(e.harness),uw("idx_harness_releases_published").on(e.publishedAt)])});import{pgTable as vR,text as ui,timestamp as lw,jsonb as IR,uuid as mw,index as pw,uniqueIndex as bR}from"drizzle-orm/pg-core";var Rt,fw=G(()=>{"use strict";Rt=vR("notifications",{id:mw("id").primaryKey().defaultRandom(),userId:mw("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:IR("metadata").notNull().default({}),readAt:lw("read_at",{withTimezone:!0}),createdAt:lw("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[pw("idx_notifications_user_created").on(e.userId,e.createdAt),pw("idx_notifications_user_unread").on(e.userId),bR("idx_notifications_source_dedup").on(e.userId,e.sourceTable,e.sourceId)])});import{pgTable as ER,text as mc,timestamp as pc,jsonb as nf,uuid as rf,index as Pd,integer as gw}from"drizzle-orm/pg-core";var ue,hw=G(()=>{"use strict";cd();ue=ER("launch_jobs",{id:rf("id").primaryKey().defaultRandom(),userId:rf("user_id").notNull(),tool:mc("tool").notNull(),status:mc("status").notNull().default("pending"),config:nf("config").notNull().default({}),result:nf("result"),error:mc("error"),attempts:gw("attempts").notNull().default(0),taskKind:mc("task_kind"),payload:nf("payload"),claimedBy:mc("claimed_by"),claimedAt:pc("claimed_at",{withTimezone:!0}),leaseExpiresAt:pc("lease_expires_at",{withTimezone:!0}),leaseRecoveries:gw("lease_recoveries").notNull().default(0),createdAt:pc("created_at",{withTimezone:!0}).defaultNow(),updatedAt:pc("updated_at",{withTimezone:!0}).defaultNow(),completedAt:pc("completed_at",{withTimezone:!0}),runId:rf("run_id").references(()=>Z.id,{onDelete:"set null"})},e=>[Pd("idx_launch_jobs_user").on(e.userId),Pd("idx_launch_jobs_status").on(e.status),Pd("idx_launch_jobs_pending").on(e.userId,e.status),Pd("idx_launch_jobs_run").on(e.runId)])});import{pgTable as _w,uuid as Jr,text as ho,real as AR,timestamp as fc,boolean as SR,uniqueIndex as xR,index as gc}from"drizzle-orm/pg-core";var Dd,x,Ge,yw=G(()=>{"use strict";Yt();Sn();wr();Dd=["add","remove","trim"],x=_w("instruction_suggestions",{id:Jr("id").primaryKey().defaultRandom(),userId:Jr("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),instructionId:Jr("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),projectPath:ho("project_path").notNull(),projectId:Jr("project_id").references(()=>C.id,{onDelete:"set null"}),score:AR("score").notNull(),reason:ho("reason").notNull(),kind:ho("kind").$type().notNull().default("add"),generatedAt:fc("generated_at",{withTimezone:!0}).notNull().defaultNow(),isStale:SR("is_stale").notNull().default(!1),dismissedAt:fc("dismissed_at",{withTimezone:!0}),acceptedAt:fc("accepted_at",{withTimezone:!0}),declinedAt:fc("declined_at",{withTimezone:!0}),declinedReason:ho("declined_reason"),promotedToInstructionId:Jr("promoted_to_instruction_id").references(()=>g.id,{onDelete:"set null"})},e=>[xR("idx_instruction_suggestions_user_project_instruction_kind").on(e.userId,e.projectPath,e.instructionId,e.kind),gc("idx_instruction_suggestions_user_project").on(e.userId,e.projectPath),gc("idx_instruction_suggestions_user_proj_id").on(e.userId,e.projectId),gc("idx_instruction_suggestions_generated_at").on(e.generatedAt)]),Ge=_w("instruction_suggestion_events",{id:Jr("id").primaryKey().defaultRandom(),suggestionId:Jr("suggestion_id").notNull().references(()=>x.id,{onDelete:"cascade"}),userId:Jr("user_id").notNull().references(()=>R.id,{onDelete:"cascade"}),eventType:ho("event_type").notNull(),tool:ho("tool"),sessionId:Jr("session_id"),projectPath:ho("project_path").notNull(),actor:ho("actor"),createdAt:fc("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[gc("idx_instruction_suggestion_events_suggestion_id").on(e.suggestionId),gc("idx_instruction_suggestion_events_user_id").on(e.userId)])});import{pgTable as RR,text as of,integer as TR,numeric as hc,timestamp as sf,index as kR,primaryKey as NR}from"drizzle-orm/pg-core";var st,ww=G(()=>{"use strict";st=RR("model_pricing",{provider:of("provider").notNull(),modelId:of("model_id").notNull(),inputPerM:hc("input_per_m").notNull(),outputPerM:hc("output_per_m").notNull(),cacheReadPerM:hc("cache_read_per_m").notNull(),cacheWrite5mPerM:hc("cache_write_5m_per_m").notNull(),cacheWrite1hPerM:hc("cache_write_1h_per_m").notNull(),contextWindow:TR("context_window"),effectiveFrom:sf("effective_from",{withTimezone:!0}).notNull(),effectiveUntil:sf("effective_until",{withTimezone:!0}),source:of("source").notNull(),verifiedAt:sf("verified_at",{withTimezone:!0})},e=>[NR({columns:[e.provider,e.modelId,e.effectiveFrom]}),kR("idx_model_pricing_active").on(e.provider,e.modelId,e.effectiveFrom.desc())])});import{pgTable as jR,text as ms,numeric as vw,timestamp as Iw,uuid as bw,jsonb as PR,index as Ew}from"drizzle-orm/pg-core";var ve,Aw=G(()=>{"use strict";ve=jR("limit_observations",{id:bw("id").primaryKey().defaultRandom(),observedAt:Iw("observed_at",{withTimezone:!0}).notNull().defaultNow(),provider:ms("provider").notNull(),plan:ms("plan").notNull(),limitType:ms("limit_type").notNull(),value:vw("value").notNull(),unit:ms("unit").notNull(),comparator:ms("comparator").notNull().default("="),resetsAt:Iw("resets_at",{withTimezone:!0}),sourceType:ms("source_type").notNull(),sourceUrl:ms("source_url"),sourceEvidence:PR("source_evidence"),confidence:vw("confidence").notNull(),userId:bw("user_id")},e=>[Ew("idx_limit_obs_lookup").on(e.provider,e.plan,e.limitType,e.observedAt.desc()),Ew("idx_limit_obs_user").on(e.userId,e.observedAt.desc())])});import{pgTable as DR,text as Od,timestamp as OR,uuid as CR,jsonb as LR,boolean as MR,uniqueIndex as $R}from"drizzle-orm/pg-core";var Dt,Sw=G(()=>{"use strict";Dt=DR("provider_docs_snapshots",{id:CR("id").primaryKey().defaultRandom(),fetchedAt:OR("fetched_at",{withTimezone:!0}).notNull().defaultNow(),provider:Od("provider").notNull(),docUrl:Od("doc_url").notNull(),contentHash:Od("content_hash").notNull(),content:Od("content").notNull(),parseSuccess:MR("parse_success").notNull(),parseErrors:LR("parse_errors")},e=>[$R("idx_docs_dedup").on(e.provider,e.docUrl,e.contentHash)])});import{pgTable as qR,text as Cd,numeric as xw,timestamp as Rw,uuid as UR,primaryKey as HR,index as BR}from"drizzle-orm/pg-core";var tt,Tw=G(()=>{"use strict";tt=qR("plan_limits_active",{provider:Cd("provider").notNull(),plan:Cd("plan").notNull(),limitType:Cd("limit_type").notNull(),value:xw("value").notNull(),unit:Cd("unit").notNull(),effectiveFrom:Rw("effective_from",{withTimezone:!0}).notNull(),effectiveUntil:Rw("effective_until",{withTimezone:!0}),confidence:xw("confidence").notNull(),sourceObservationIds:UR("source_observation_ids").array().notNull()},e=>[HR({columns:[e.provider,e.plan,e.limitType,e.effectiveFrom]}),BR("idx_plan_limits_lookup").on(e.provider,e.plan,e.limitType,e.effectiveFrom.desc())])});import{pgTable as FR,text as af,timestamp as WR,uuid as kw,jsonb as zR,index as VR}from"drizzle-orm/pg-core";var kn,Nw=G(()=>{"use strict";kn=FR("alert_dispatches",{id:kw("id").primaryKey().defaultRandom(),userId:kw("user_id").notNull(),alertKey:af("alert_key").notNull(),severity:af("severity").notNull(),lastDispatchedAt:WR("last_dispatched_at",{withTimezone:!0}).notNull().defaultNow(),lastState:zR("last_state").notNull(),channel:af("channel").notNull()},e=>[VR("idx_alert_user_key").on(e.userId,e.alertKey,e.lastDispatchedAt.desc())])});import{boolean as JR,date as KR,index as cf,integer as GR,jsonb as YR,pgTable as uf,text as or,timestamp as _o,uniqueIndex as XR,uuid as di}from"drizzle-orm/pg-core";var $e,Tt,kt,jw=G(()=>{"use strict";$e=uf("announcements",{id:di("id").primaryKey().defaultRandom(),version:or("version").notNull().unique(),releaseDate:KR("release_date").notNull(),subject:or("subject").notNull(),htmlBody:or("html_body").notNull(),textBody:or("text_body").notNull(),sections:YR("sections").notNull().default({}),status:or("status").notNull().default("draft"),recipientCount:GR("recipient_count"),sentAt:_o("sent_at",{withTimezone:!0}),sentBy:di("sent_by"),error:or("error"),createdAt:_o("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:_o("updated_at",{withTimezone:!0}).notNull().defaultNow()},e=>[cf("idx_announcements_status").on(e.status),cf("idx_announcements_created").on(e.createdAt)]),Tt=uf("announcement_deliveries",{id:di("id").primaryKey().defaultRandom(),announcementId:di("announcement_id").notNull(),userId:di("user_id").notNull(),email:or("email").notNull(),status:or("status").notNull().default("pending"),providerId:or("provider_id"),error:or("error"),sentAt:_o("sent_at",{withTimezone:!0}),createdAt:_o("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[XR("uniq_announcement_deliveries_announcement_user").on(e.announcementId,e.userId),cf("idx_announcement_deliveries_user").on(e.userId,e.createdAt)]),kt=uf("notification_preferences",{userId:di("user_id").primaryKey(),productAnnouncements:JR("product_announcements").notNull().default(!0),unsubscribeToken:or("unsubscribe_token").notNull().unique(),unsubscribedAt:_o("unsubscribed_at",{withTimezone:!0}),createdAt:_o("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:_o("updated_at",{withTimezone:!0}).notNull().defaultNow()})});import{pgTable as QR,text as df,timestamp as Pw,uuid as lf,integer as ZR,index as eT,unique as tT}from"drizzle-orm/pg-core";var Dw,Ow=G(()=>{"use strict";Dw=QR("scaffolding_fingerprints",{id:lf("id").primaryKey().defaultRandom(),userId:lf("user_id").notNull(),harness:df("harness").notNull(),model:df("model").notNull(),toolsHash:df("tools_hash").notNull(),firstSeenAt:Pw("first_seen_at",{withTimezone:!0}).notNull().defaultNow(),lastSeenAt:Pw("last_seen_at",{withTimezone:!0}).notNull().defaultNow(),snapshotCount:ZR("snapshot_count").notNull().default(1),firstSessionId:lf("first_session_id")},e=>[tT("scaffolding_fingerprints_user_id_harness_model_tools_hash_key").on(e.userId,e.harness,e.model,e.toolsHash),eT("idx_scaffolding_fp_segment").on(e.userId,e.harness,e.model)])});import{pgTable as nT,text as mf,timestamp as rT,jsonb as oT,uuid as Cw,integer as sT,unique as iT}from"drizzle-orm/pg-core";var Lw,Mw=G(()=>{"use strict";Lw=nT("scaffolding_segments",{id:Cw("id").primaryKey().defaultRandom(),userId:Cw("user_id").notNull(),harness:mf("harness").notNull(),model:mf("model").notNull(),coreNames:oT("core_names").notNull(),coreHash:mf("core_hash").notNull(),activeFingerprints:sT("active_fingerprints").notNull(),computedAt:rT("computed_at",{withTimezone:!0}).notNull().defaultNow()},e=>[iT("scaffolding_segments_user_id_harness_model_key").on(e.userId,e.harness,e.model)])});var pf=G(()=>{"use strict";Yt();os();Z_();Sn();ty();wr();ni();cy();dy();jp();fy();gy();Mp();wy();cd();Bp();Ey();Ry();Ty();jy();Oy();Ly();ec();$y();qy();Hy();Fy();zy();Yy();Qy();ew();nw();sw();aw();dw();fw();hw();yw();ww();Aw();Sw();Tw();Nw();jw();Ow();Mw()});import{relations as Ye}from"drizzle-orm";var aT,cT,uT,dT,lT,mT,pT,fT,gT,hT,_T,yT,wT,vT,IT,bT,ET,AT,ST,xT,RT,TT,kT,NT,jT,PT,DT,OT,CT,LT,$w=G(()=>{"use strict";pf();aT=Ye(R,({many:e})=>({sessions:e(y),contextSnapshots:e(M),apiKeys:e(Ae)})),cT=Ye(Ae,({one:e})=>({profile:e(R,{fields:[Ae.userId],references:[R.id]})})),uT=Ye(Y,({many:e})=>({teams:e(X),userOrganizations:e(ee),projects:e(C),invitations:e(ae)})),dT=Ye(X,({one:e,many:t})=>({organization:e(Y,{fields:[X.orgId],references:[Y.id]}),userTeams:t(we),invitations:t(ae)})),lT=Ye(ae,({one:e})=>({organization:e(Y,{fields:[ae.orgId],references:[Y.id]}),team:e(X,{fields:[ae.teamId],references:[X.id]}),inviter:e(R,{fields:[ae.invitedBy],references:[R.id]})})),mT=Ye(ee,({one:e})=>({organization:e(Y,{fields:[ee.orgId],references:[Y.id]})})),pT=Ye(we,({one:e})=>({team:e(X,{fields:[we.teamId],references:[X.id]})})),fT=Ye(g,({one:e,many:t})=>({versions:t(xe),projectInstructions:t(lt),events:t(Ut),usageEvents:t(po),sessionInstructions:t(se),packInstructions:t(Me),forkedFrom:e(g,{fields:[g.forkedFromId],references:[g.id]})})),gT=Ye(Ut,({one:e})=>({instruction:e(g,{fields:[Ut.instructionId],references:[g.id]})})),hT=Ye(F,({one:e,many:t})=>({project:e(C,{fields:[F.projectId],references:[C.id]}),parent:e(F,{fields:[F.parentId],references:[F.id]}),versions:t(F)})),_T=Ye(xe,({one:e})=>({instruction:e(g,{fields:[xe.instructionId],references:[g.id]})})),yT=Ye(C,({one:e,many:t})=>({organization:e(Y,{fields:[C.orgId],references:[Y.id]}),projectInstructions:t(lt),sessions:t(y)})),wT=Ye(lt,({one:e})=>({project:e(C,{fields:[lt.projectId],references:[C.id]}),instruction:e(g,{fields:[lt.instructionId],references:[g.id]})})),vT=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(Z,{fields:[y.runId],references:[Z.id]}),events:t(ze),sessionInstructions:t(se),treatmentExposures:t(ne),contextSnapshots:t(M)})),IT=Ye(Z,({one:e,many:t})=>({profile:e(R,{fields:[Z.userId],references:[R.id]}),organization:e(Y,{fields:[Z.orgId],references:[Y.id]}),project:e(C,{fields:[Z.projectId],references:[C.id]}),sessions:t(y),launchJobs:t(ue)})),bT=Ye(ue,({one:e})=>({run:e(Z,{fields:[ue.runId],references:[Z.id]})})),ET=Ye(ze,({one:e})=>({session:e(y,{fields:[ze.sessionId],references:[y.id]})})),AT=Ye(se,({one:e})=>({session:e(y,{fields:[se.sessionId],references:[y.id]}),instruction:e(g,{fields:[se.instructionId],references:[g.id]})})),ST=Ye(Lt,({one:e,many:t})=>({owner:e(R,{fields:[Lt.userId],references:[R.id]}),project:e(C,{fields:[Lt.projectId],references:[C.id]}),exposures:t(ne)})),xT=Ye(ne,({one:e})=>({session:e(y,{fields:[ne.sessionId],references:[y.id]}),owner:e(R,{fields:[ne.userId],references:[R.id]}),assignment:e(Lt,{fields:[ne.assignmentId],references:[Lt.id]})})),RT=Ye(Ue,({one:e,many:t})=>({packInstructions:t(Me),forkedFrom:e(Ue,{fields:[Ue.forkedFromId],references:[Ue.id]})})),TT=Ye(Me,({one:e})=>({pack:e(Ue,{fields:[Me.packId],references:[Ue.id]}),instruction:e(g,{fields:[Me.instructionId],references:[g.id]})})),kT=Ye(po,({one:e})=>({instruction:e(g,{fields:[po.instructionId],references:[g.id]})})),NT=Ye(k,({one:e,many:t})=>({parent:e(k,{fields:[k.parentId],references:[k.id]}),evals:t(Ee),evalRuns:t(Ie),benchmarks:t(rr),evalJobs:t(je),evalConversations:t(He)})),jT=Ye(Ee,({one:e,many:t})=>({evalTarget:e(k,{fields:[Ee.evalTargetId],references:[k.id]}),runs:t(Ie)})),PT=Ye(Ie,({one:e})=>({eval:e(Ee,{fields:[Ie.evalId],references:[Ee.id]}),evalTarget:e(k,{fields:[Ie.evalTargetId],references:[k.id]})})),DT=Ye(rr,({one:e})=>({evalTarget:e(k,{fields:[rr.evalTargetId],references:[k.id]})})),OT=Ye(je,({one:e})=>({evalTarget:e(k,{fields:[je.evalTargetId],references:[k.id]})})),CT=Ye(He,({one:e})=>({evalTarget:e(k,{fields:[He.evalTargetId],references:[k.id]})})),LT=Ye(M,({one:e})=>({session:e(y,{fields:[M.sessionId],references:[y.id]}),profile:e(R,{fields:[M.userId],references:[R.id]})}))});var Ld={};co(Ld,{SUGGESTION_KINDS:()=>Dd,agentJobs:()=>Pe,agentRuns:()=>Z,agentRunsRelations:()=>IT,alertDispatches:()=>kn,announcementDeliveries:()=>Tt,announcements:()=>$e,apiKeys:()=>Ae,apiKeysRelations:()=>cT,benchmarks:()=>rr,benchmarksRelations:()=>DT,cliErrorEvents:()=>Ed,cliSetupEvents:()=>bd,contentBlobs:()=>Tn,contextSnapshots:()=>M,contextSnapshotsRelations:()=>LT,evalComparisons:()=>ot,evalConversations:()=>He,evalConversationsRelations:()=>CT,evalGradeAnnotations:()=>et,evalJobs:()=>je,evalJobsRelations:()=>OT,evalRuns:()=>Ie,evalRunsRelations:()=>PT,evalTargets:()=>k,evalTargetsRelations:()=>NT,evals:()=>Ee,evalsRelations:()=>jT,extensionAuthCodes:()=>qn,harnessReleases:()=>$t,insightRecommendationLog:()=>Re,insightsJobs:()=>z,instructionEvents:()=>Ut,instructionEventsRelations:()=>gT,instructionExperimentArms:()=>Fr,instructionExperiments:()=>$,instructionPromotions:()=>ie,instructionSuggestionEvents:()=>Ge,instructionSuggestions:()=>x,instructionUsageEvents:()=>po,instructionUsageEventsRelations:()=>kT,instructionVerdicts:()=>Q,instructionVersionIdentities:()=>yr,instructionVersions:()=>xe,instructionVersionsRelations:()=>_T,instructions:()=>g,instructionsRelations:()=>fT,judgeReviewerVerdicts:()=>me,launchJobs:()=>ue,launchJobsRelations:()=>bT,limitObservations:()=>ve,memories:()=>F,memoriesRelations:()=>hT,memoryExperiments:()=>Mt,modelPricing:()=>st,notificationPreferences:()=>kt,notifications:()=>Rt,orgInvitations:()=>ae,orgInvitationsRelations:()=>lT,organizations:()=>Y,organizationsRelations:()=>uT,packInstructions:()=>Me,packInstructionsRelations:()=>TT,packs:()=>Ue,packsRelations:()=>RT,pendingTreatmentExposures:()=>md,planLimitsActive:()=>tt,profiles:()=>R,profilesRelations:()=>aT,projectCheckouts:()=>ye,projectInstructions:()=>lt,projectInstructionsRelations:()=>wT,projects:()=>C,projectsRelations:()=>yT,providerDocsSnapshots:()=>Dt,recommendationApplications:()=>Te,scaffoldingFingerprints:()=>Dw,scaffoldingSegments:()=>Lw,sessionEvents:()=>ze,sessionEventsRelations:()=>ET,sessionInstructions:()=>se,sessionInstructionsRelations:()=>AT,sessionSendJobs:()=>yd,sessionTerminalTargets:()=>Ze,sessions:()=>y,sessionsRelations:()=>vT,skillSubmissions:()=>go,teams:()=>X,teamsRelations:()=>dT,treatmentAssignments:()=>Lt,treatmentAssignmentsRelations:()=>ST,treatmentExposures:()=>ne,treatmentExposuresRelations:()=>xT,userOrganizations:()=>ee,userOrganizationsRelations:()=>mT,userTeams:()=>we,userTeamsRelations:()=>pT,workerConnections:()=>fe});var Md=G(()=>{"use strict";pf();$w()});function _f(){ps++,ps>ff&&(ff=ps)}function yf(){ps>0&&ps--}function wf(){li++,li>gf&&(gf=li)}function vf(){li>0&&li--}function _c(){return ps}function If(){qw++}function yc(){Uw++}function Hw(){hf++}function bf(){let e=hf;return hf=0,e}function Ef(){return{current:ps,peak:ff,heavyCurrent:li,heavyPeak:gf,shedCount:qw,ingestShedCount:Uw}}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 wc(){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 ps,ff,li,gf,qw,Uw,hf,Af=G(()=>{"use strict";ps=0,ff=0,li=0,gf=0,qw=0,Uw=0,hf=0;c(_f,"trackDbOpStart");c(yf,"trackDbOpEnd");c(wf,"trackHeavyDbOpStart");c(vf,"trackHeavyDbOpEnd");c(_c,"getDbLoad");c(If,"recordDbShed");c(yc,"recordIngestShed");c(Hw,"recordQueryDeadline");c(bf,"consumeDeadlineCount");c(Ef,"getDbLoadStats");c(mi,"dbInflightMax");c(wc,"dbIngestInflightMax")});import{drizzle as Bw}from"drizzle-orm/postgres-js";import Sf from"postgres";function xf(e){let t=process.env[e];if(!t)throw new Error(`Missing required env var: ${e}`);return t}function Fw(){if(bc)throw new Error("getDb() called after closeDb(): the connection pool is closed for shutdown. Stop issuing queries (timers/requests) before draining the pool.");if(!Ic){let e=process.env.PG_APPLICATION_NAME||"rulemetric",t=Number(process.env.PG_POOL_MAX)||3,n=Number(process.env.PG_CONNECT_TIMEOUT_S)||10,r=Number(process.env.PG_STATEMENT_TIMEOUT_MS)||0,o=Number(process.env.PG_IDLE_TIMEOUT)||5,s=Number(process.env.PG_KEEP_ALIVE_S)||60;fi=Sf(xf("DATABASE_URL"),{prepare:!1,max:t,connect_timeout:n,idle_timeout:o,keep_alive:s,max_lifetime:300,connection:{application_name:e,...r>0?{statement_timeout:r}:{}}}),Ic=Bw(fi,{schema:Ld})}return Ic}function Ww(){if(bc)throw new Error("getHeavyDb() called after closeDb(): the connection pool is closed for shutdown. Stop issuing queries (timers/requests) before draining the pool.");if(!qd){let e=(process.env.PG_APPLICATION_NAME||"rulemetric")+":heavy",t=Number(process.env.PG_HEAVY_POOL_MAX)||2;Ud=Sf(xf("DATABASE_URL"),{prepare:!1,max:t,connect_timeout:Number(process.env.PG_CONNECT_TIMEOUT_S)||10,idle_timeout:Number(process.env.PG_IDLE_TIMEOUT)||5,keep_alive:Number(process.env.PG_KEEP_ALIVE_S)||60,max_lifetime:300,connection:{application_name:e}}),qd=Bw(Ud,{schema:Ld})}return qd}async function Ec(){if($d)return $d;bc=!0;let e=fi,t=pi,n=Ud;return fi=void 0,Ic=void 0,pi=void 0,Ud=void 0,qd=void 0,$d=Promise.allSettled([e?e.end({timeout:5}):Promise.resolve(),t?t.end({timeout:5}):Promise.resolve(),n?n.end({timeout:5}):Promise.resolve()]).then(()=>{}),$d}function Rf(){if(bc)return Promise.resolve();if(vc)return vc;let e=fi;return fi=void 0,Ic=void 0,vc=(async()=>{e&&await e.end({timeout:5}).catch(()=>{})})().finally(()=>{vc=void 0}),vc}async function Tf(e){let t=Date.now();if(bc)return{ok:!1,ms:0,err:new Error("pool closed for shutdown")};let n=pi;try{return n||(n=Sf(xf("DATABASE_URL"),{prepare:!1,max:1,connect_timeout:Number(process.env.PG_CONNECT_TIMEOUT_S)||10,idle_timeout:20,max_lifetime:300,connection:{application_name:(process.env.PG_APPLICATION_NAME||"rulemetric")+":probe",statement_timeout:Math.max(2e3,e-2e3)}}),pi=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 pi===n&&(pi=void 0),n?.end({timeout:1}).catch(()=>{}),{ok:!1,ms:Date.now()-t,err:r}}}function Ac(e){let t=e?.message;return typeof t=="string"&&t.includes(MT)}function gi(e){let t=e,n=t?.code??t?.cause?.code??t?.errno;return n!==void 0&&$T.has(n)}function Bd(e){let t=e,n=t?.code??t?.cause?.code??t?.errno;return n!==void 0&&qT.has(n)}async function zw(e,t={}){let n=t.attempts??3,r=t.baseMs??100,o;for(let s=0;s<n;s++)try{return await e()}catch(i){o=i;let a=gi(i)||t.retryResets===!0&&Bd(i);if(s===n-1||!a)throw i;await new Promise(u=>setTimeout(u,r*2**s))}throw o}function Sc(e){return e?.code==="QUERY_DEADLINE"}function Vw(){let e=Number(process.env.PG_QUERY_DEADLINE_MS);return Number.isFinite(e)&&e>=0?e:2e4}function Jw(){let e=Number(process.env.PG_HEAVY_QUERY_DEADLINE_MS);return Number.isFinite(e)&&e>=0?e:6e4}function UT(e,t,n=!0){let r,o=new Promise((s,i)=>{r=setTimeout(()=>{n&&Hw(),i(new Hd(t))},t);let a=r;typeof a.unref=="function"&&a.unref()});return Promise.race([e,o]).finally(()=>clearTimeout(r))}function kf(e,t=!1,n=0,r=!1){return e===null||typeof e!="object"&&typeof e!="function"?e:new Proxy(e,{get(o,s,i){if(s==="then"){let u=Reflect.get(o,s,i);return typeof u!="function"?u:(l,m)=>{let f=r?wf:_f,_=r?vf:yf;f();let v=zw(()=>new Promise((p,w)=>u.call(o,p,w)),{retryResets:t});return(n>0?UT(v,n,!r):v).finally(_).then(l,m)}}let a=Reflect.get(o,s,i);return typeof a=="function"?(...u)=>kf(a.apply(o,u),t,n,r):a}})}function Yw(e,t=!1){let n=t?wf:_f,r=t?vf:yf;n();try{return Promise.resolve(e()).finally(r)}catch(o){throw r(),o}}var Ic,fi,bc,$d,vc,pi,Ud,qd,MT,$T,qT,Hd,Kw,Gw,d,Fe,Nf=G(()=>{"use strict";Md();Af();bc=!1;c(xf,"getEnv");c(Fw,"getDb");c(Ww,"getHeavyDb");c(Ec,"closeDb");c(Rf,"recyclePool");c(Tf,"probeDbReachable");MT="called after closeDb()";c(Ac,"isPoolClosedError");$T=new Set(["CONNECT_TIMEOUT","ETIMEDOUT","ENOTFOUND","ECONNREFUSED","EAI_AGAIN"]);c(gi,"isRetryableConnectError");qT=new Set(["CONNECTION_CLOSED","ECONNRESET","EPIPE"]);c(Bd,"isRetryableResetError");c(zw,"withDbRetry");Hd=class extends Error{static{c(this,"QueryDeadlineError")}code="QUERY_DEADLINE";constructor(t){super(`Query exceeded the client-side deadline of ${t}ms \u2014 the DB pool is likely saturated (acquire-wait) or holding a dead socket; failing fast to avoid pinning the caller. See client.ts.`),this.name="QueryDeadlineError"}};c(Sc,"isQueryDeadlineError");c(Vw,"queryDeadlineMs");c(Jw,"heavyQueryDeadlineMs");c(UT,"raceWithDeadline");Kw=new Set(["select","selectDistinct","selectDistinctOn","insert","update","delete","execute","with","$count","refreshMaterializedView"]),Gw=new Set(["select","selectDistinct","selectDistinctOn","$count"]);c(kf,"wrapBuilder");c(Yw,"gaugeTransaction");d=new Proxy({},{get(e,t){let n=Fw(),r=n[t];if(typeof t=="string"&&Kw.has(t)&&typeof r=="function"){let o=Gw.has(t),s=Vw();return(...i)=>kf(r.apply(n,i),o,s)}return t==="transaction"&&typeof r=="function"?(...o)=>Yw(()=>r.apply(n,o)):r}}),Fe=new Proxy({},{get(e,t){let n=Ww(),r=n[t];if(typeof t=="string"&&Kw.has(t)&&typeof r=="function"){let o=Gw.has(t);return(...s)=>kf(r.apply(n,s),o,Jw(),!0)}return t==="transaction"&&typeof r=="function"?(...o)=>Yw(()=>r.apply(n,o),!0):r}})});async function un(e){let[t]=await d.insert(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 Xw=G(()=>{"use strict";Nf();Md();c(un,"notifyUser")});var D=G(()=>{"use strict";Md();Nf();Af();Xw()});function zv(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function gl(e,t){let n=(e??"").trim();if(!n)return null;if(!n.includes("Contents of "))return n;if(t){let o=n.match(new RegExp(`Contents of [^\\n]*${zv(t)}[^\\n]*\\n([\\s\\S]*?)(?=\\nContents of |$)`,"i"))?.[1]?.trim();if(o)return o;let s=t.split("/").pop();if(s&&s!==t){let a=n.match(new RegExp(`Contents of [^\\n]*${zv(s)}[^\\n]*\\n([\\s\\S]*?)(?=\\nContents of |$)`,"i"))?.[1]?.trim();if(a)return a}}return null}var hg=G(()=>{"use strict";c(zv,"escapeRegExp");c(gl,"extractInstructionSection")});var Gv={};co(Gv,{GRADUATION_MIN_N:()=>Vc,decideGraduation:()=>Jv,graduatedRulesForRender:()=>_g,instructionContentHash:()=>Kr,maybeGraduate:()=>Kv,settleExperiment:()=>ki,verdictRowsForExperiments:()=>_l});import{createHash as ON}from"node:crypto";import{and as hl,eq as ar,inArray as CN,sql as Vv}from"drizzle-orm";function Jv(e){return e.resolution!=="resolved"||e.randomisationSuspect||e.contentChanged||e.delta===null||e.ci===null||e.measured.treated<Vc||e.measured.control<Vc?null:e.delta>0?"always":"never"}function Kr(e,t){let n=gl(e,t);return n?ON("sha256").update(n).digest("hex"):null}async function Kv(e){let{experimentId:t,userId:n,verdict:r}=e,o=Jv(r);if(o===null)return null;let[s]=await d.select({id:$.id,instructionId:$.instructionId,projectPath:$.projectPath,status:$.status}).from($).where(hl(ar($.id,t),ar($.userId,n)));if(!s||s.status!=="running")return null;let[i]=await d.select({content:g.content,name:g.name}).from(g).where(ar(g.id,s.instructionId)),a=Kr(i?.content,i?.name);if(!a)return null;let l=(await d.execute(Vv`
|
|
1
|
+
var W_=Object.defineProperty;var c=(e,t)=>W_(e,"name",{value:t,configurable:!0}),pm=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var G=(e,t)=>()=>(e&&(t=e(e=0)),t);var co=(e,t)=>{for(var n in t)W_(e,n,{get:t[n],enumerable:!0})};import{pgTable as eu,text as ei,timestamp as za,jsonb as K_,uuid as rs,primaryKey as G_}from"drizzle-orm/pg-core";var X,Q,te,we,os=G(()=>{"use strict";X=eu("organizations",{id:rs("id").primaryKey().defaultRandom(),name:ei("name").unique().notNull(),slug:ei("slug").unique().notNull(),metadata:K_("metadata"),createdAt:za("created_at",{withTimezone:!0}).defaultNow(),updatedAt:za("updated_at",{withTimezone:!0}).defaultNow()}),Q=eu("teams",{id:rs("id").primaryKey().defaultRandom(),orgId:rs("org_id").references(()=>X.id,{onDelete:"cascade"}),name:ei("name").notNull(),slug:ei("slug").notNull(),metadata:K_("metadata"),createdAt:za("created_at",{withTimezone:!0}).defaultNow()}),te=eu("user_organizations",{userId:rs("user_id").notNull(),orgId:rs("org_id").references(()=>X.id,{onDelete:"cascade"}).notNull(),role:ei("role").notNull().default("member"),createdAt:za("created_at",{withTimezone:!0}).defaultNow()},e=>[G_({columns:[e.userId,e.orgId]})]),we=eu("user_teams",{userId:rs("user_id").notNull(),teamId:rs("team_id").references(()=>Q.id,{onDelete:"cascade"}).notNull(),role:ei("role").notNull().default("member"),createdAt:za("created_at",{withTimezone:!0}).defaultNow()},e=>[G_({columns:[e.userId,e.teamId]})])});import{boolean as tu,integer as Va,pgTable as qS,real as Y_,text as nu,timestamp as vm,uuid as X_}from"drizzle-orm/pg-core";var T,Yt=G(()=>{"use strict";os();T=qS("profiles",{id:X_("id").primaryKey(),email:nu("email"),displayName:nu("display_name"),activeOrgId:X_("active_org_id").references(()=>X.id,{onDelete:"set null"}),isSuperadmin:tu("is_superadmin").notNull().default(!1),claudeCodePlan:nu("claude_code_plan"),planSource:nu("plan_source").notNull().default("detected"),setupCompletedAt:vm("setup_completed_at",{withTimezone:!0}),liveSendSkipped:tu("live_send_skipped").notNull().default(!1),autoAcceptSuggestions:tu("auto_accept_suggestions").notNull().default(!0),evolutionPaused:tu("evolution_paused").notNull().default(!1),suggestionConfidenceThreshold:Y_("suggestion_confidence_threshold").notNull().default(.7),autoAcceptMinScore:Y_("auto_accept_min_score"),autoAcceptMaxPerRun:Va("auto_accept_max_per_run"),autoAcceptMaxPerWindow:Va("auto_accept_max_per_window"),autoAcceptWindowDays:Va("auto_accept_window_days"),trialMaxConcurrent:Va("trial_max_concurrent"),trialMaxPerRun:Va("trial_max_per_run"),createdAt:vm("created_at",{withTimezone:!0}).defaultNow(),updatedAt:vm("updated_at",{withTimezone:!0}).defaultNow()})});import{pgTable as US,text as Im,timestamp as ru,uuid as ou,index as Q_}from"drizzle-orm/pg-core";var ae,Z_=G(()=>{"use strict";os();Yt();ae=US("org_invitations",{id:ou("id").primaryKey().defaultRandom(),orgId:ou("org_id").notNull().references(()=>X.id,{onDelete:"cascade"}),email:Im("email").notNull(),role:Im("role").notNull().default("member"),teamId:ou("team_id").references(()=>Q.id,{onDelete:"set null"}),invitedBy:ou("invited_by").notNull().references(()=>T.id,{onDelete:"cascade"}),token:Im("token").notNull().unique(),expiresAt:ru("expires_at",{withTimezone:!0}).notNull(),acceptedAt:ru("accepted_at",{withTimezone:!0}),revokedAt:ru("revoked_at",{withTimezone:!0}),createdAt:ru("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Q_("idx_org_invitations_token").on(e.token),Q_("idx_org_invitations_org").on(e.orgId)])});import{pgTable as bm,text as en,timestamp as uo,jsonb as su,uuid as _r,integer as iu,boolean as HS,uniqueIndex as au,index as Ja}from"drizzle-orm/pg-core";var h,yr,xe,Sn=G(()=>{"use strict";h=bm("instructions",{id:_r("id").primaryKey().defaultRandom(),name:en("name").notNull(),description:en("description").notNull(),type:en("type").notNull().default("instruction"),scope:en("scope").notNull(),scopeRef:_r("scope_ref"),version:en("version").notNull(),content:en("content").notNull(),frontmatter:su("frontmatter").notNull(),slots:su("slots"),tags:en("tags").array(),compatibility:en("compatibility").array(),createdBy:_r("created_by"),createdAt:uo("created_at",{withTimezone:!0}).defaultNow(),updatedAt:uo("updated_at",{withTimezone:!0}).defaultNow(),archived:HS("archived").default(!1),archivedAt:uo("archived_at",{withTimezone:!0}),archivedBy:_r("archived_by"),forkedFromId:_r("forked_from_id").references(()=>h.id,{onDelete:"set null"}),upstreamVersion:en("upstream_version"),badge:en("badge"),contentHash:en("content_hash"),contextIdentity:en("context_identity"),scanScore:iu("scan_score"),scanFindings:su("scan_findings"),popularityScore:iu("popularity_score"),sourceUpdatedAt:uo("source_updated_at",{withTimezone:!0})},e=>[au("instructions_name_scope_ref_idx").on(e.name,e.scope,e.scopeRef),Ja("idx_instructions_scope").on(e.scope,e.scopeRef),Ja("idx_instructions_created_by").on(e.createdBy),Ja("idx_instructions_context_identity").on(e.createdBy,e.contextIdentity),Ja("idx_instructions_public_recency").on(e.scope,e.sourceUpdatedAt.desc())]),yr=bm("instruction_version_identities",{id:_r("id").primaryKey().defaultRandom(),instructionId:_r("instruction_id").notNull().references(()=>h.id,{onDelete:"cascade"}),contentHash:en("content_hash").notNull(),versionOrdinal:iu("version_ordinal").notNull(),content:en("content"),firstSeenAt:uo("first_seen_at",{withTimezone:!0}).notNull().defaultNow(),lastSeenAt:uo("last_seen_at",{withTimezone:!0}).notNull().defaultNow(),createdAt:uo("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[au("instruction_version_identities_hash_unique").on(e.instructionId,e.contentHash),au("instruction_version_identities_ordinal_unique").on(e.instructionId,e.versionOrdinal),Ja("idx_ivi_instruction").on(e.instructionId)]),xe=bm("instruction_versions",{id:_r("id").primaryKey().defaultRandom(),instructionId:_r("instruction_id").references(()=>h.id,{onDelete:"cascade"}),versionNumber:iu("version_number").notNull(),content:en("content").notNull(),frontmatter:su("frontmatter").notNull(),changeSummary:en("change_summary"),createdBy:_r("created_by"),createdAt:uo("created_at",{withTimezone:!0}).defaultNow()},e=>[au("instruction_versions_instruction_version_idx").on(e.instructionId,e.versionNumber)])});import{pgTable as BS,text as FS,timestamp as WS,jsonb as zS,uuid as Em,index as ey}from"drizzle-orm/pg-core";var Ut,ty=G(()=>{"use strict";Sn();Ut=BS("instruction_events",{id:Em("id").primaryKey().defaultRandom(),instructionId:Em("instruction_id").notNull().references(()=>h.id,{onDelete:"cascade"}),eventType:FS("event_type").notNull(),actorId:Em("actor_id").notNull(),metadata:zS("metadata"),createdAt:WS("created_at",{withTimezone:!0}).defaultNow()},e=>[ey("idx_instruction_events_instruction").on(e.instructionId),ey("idx_instruction_events_type").on(e.eventType)])});import{boolean as VS,jsonb as JS,pgTable as Sm,primaryKey as ny,text as ss,timestamp as Ka,uniqueIndex as Am,uuid as is}from"drizzle-orm/pg-core";import{sql as KS}from"drizzle-orm";var C,lt,ye,wr=G(()=>{"use strict";os();Sn();C=Sm("projects",{id:is("id").primaryKey().defaultRandom(),orgId:is("org_id").references(()=>X.id,{onDelete:"cascade"}),name:ss("name").notNull(),description:ss("description"),githubRepo:ss("github_repo"),gitRemoteUrl:ss("git_remote_url"),gitRootCommit:ss("git_root_commit"),gitRemoteAliases:ss("git_remote_aliases").array().notNull().default([]),metadata:JS("metadata"),createdBy:is("created_by"),createdAt:Ka("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Ka("updated_at",{withTimezone:!0}).defaultNow()},e=>[Am("projects_org_name_idx").on(e.orgId,e.name),Am("projects_git_remote_url_unique").on(e.gitRemoteUrl).where(KS`${e.gitRemoteUrl} IS NOT NULL`)]),lt=Sm("project_instructions",{projectId:is("project_id").references(()=>C.id,{onDelete:"cascade"}).notNull(),instructionId:is("instruction_id").references(()=>h.id,{onDelete:"cascade"}).notNull(),addedAt:Ka("added_at",{withTimezone:!0}).defaultNow(),addedBy:is("added_by")},e=>[ny({columns:[e.projectId,e.instructionId]})]),ye=Sm("project_checkouts",{projectId:is("project_id").references(()=>C.id,{onDelete:"cascade"}).notNull(),path:ss("path").notNull(),isWorktree:VS("is_worktree").notNull().default(!1),firstSeen:Ka("first_seen",{withTimezone:!0}).notNull().defaultNow(),lastSeen:Ka("last_seen",{withTimezone:!0}).notNull().defaultNow()},e=>[ny({columns:[e.projectId,e.path]}),Am("project_checkouts_path_unique").on(e.path)])});import{pgTable as GS,text as ti,timestamp as xm,jsonb as ry,uuid as cu,integer as YS,boolean as XS,index as Tm}from"drizzle-orm/pg-core";var ee,du=G(()=>{"use strict";Yt();os();wr();ee=GS("agent_runs",{id:cu("id").primaryKey().defaultRandom(),userId:cu("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),orgId:cu("org_id").references(()=>X.id,{onDelete:"set null"}),projectId:cu("project_id").references(()=>C.id,{onDelete:"set null"}),projectPath:ti("project_path"),gitRemote:ti("git_remote"),baseBranch:ti("base_branch"),title:ti("title"),prompt:ti("prompt"),toolSpec:ry("tool_spec").notNull().default([]),autoWorktree:XS("auto_worktree").notNull().default(!0),status:ti("status").notNull().default("pending"),sessionCount:YS("session_count").notNull().default(0),metadata:ry("metadata").notNull().default({}),createdAt:xm("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:xm("updated_at",{withTimezone:!0}).notNull().defaultNow(),completedAt:xm("completed_at",{withTimezone:!0})},e=>[Tm("idx_agent_runs_user").on(e.userId),Tm("idx_agent_runs_org_created").on(e.orgId,e.createdAt),Tm("idx_agent_runs_project").on(e.projectId)])});import{pgTable as Rm,text as xn,timestamp as Ga,jsonb as as,uuid as Br,integer as uu,uniqueIndex as oy,index as vr}from"drizzle-orm/pg-core";var y,ze,se,ni=G(()=>{"use strict";Sn();wr();Yt();os();du();y=Rm("sessions",{id:Br("id").primaryKey().defaultRandom(),userId:Br("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),externalSessionId:xn("external_session_id"),projectId:Br("project_id").references(()=>C.id,{onDelete:"set null"}),orgId:Br("org_id").references(()=>X.id,{onDelete:"set null"}),tool:xn("tool").notNull(),projectPath:xn("project_path"),gitBranch:xn("git_branch"),startedAt:Ga("started_at",{withTimezone:!0}).notNull(),endedAt:Ga("ended_at",{withTimezone:!0}),eventCount:uu("event_count").default(0),tokenUsage:as("token_usage"),analysis:as("analysis"),analyzedAt:Ga("analyzed_at",{withTimezone:!0}),analyzedEventCount:uu("analyzed_event_count"),analyzedTurnCount:uu("analyzed_turn_count"),metadata:as("metadata").default({}),origin:xn("origin").notNull().default("unknown"),runId:Br("run_id").references(()=>ee.id,{onDelete:"set null"}),model:xn("model"),harnessVersion:xn("harness_version"),createdAt:Ga("created_at",{withTimezone:!0}).defaultNow()},e=>[vr("idx_sessions_user").on(e.userId),vr("idx_sessions_tool").on(e.tool),vr("idx_sessions_started_at").on(e.startedAt),vr("idx_sessions_project").on(e.projectId),vr("idx_sessions_org_started_at").on(e.orgId,e.startedAt),vr("idx_sessions_run").on(e.runId),oy("idx_sessions_user_external").on(e.userId,e.externalSessionId)]),ze=Rm("session_events",{id:Br("id").primaryKey().defaultRandom(),sessionId:Br("session_id").notNull().references(()=>y.id,{onDelete:"cascade"}),sequence:uu("sequence").notNull(),eventType:xn("event_type").notNull(),content:xn("content"),toolName:xn("tool_name"),toolInput:as("tool_input"),toolOutput:as("tool_output"),tokenUsage:as("token_usage"),model:xn("model"),timestamp:Ga("timestamp",{withTimezone:!0}).notNull(),metadata:as("metadata").default({})},e=>[oy("session_events_session_sequence_idx").on(e.sessionId,e.sequence),vr("idx_session_events_session_id").on(e.sessionId),vr("idx_session_events_event_type").on(e.eventType),vr("idx_session_events_model").on(e.model)]),se=Rm("session_instructions",{sessionId:Br("session_id").notNull().references(()=>y.id,{onDelete:"cascade"}),instructionId:Br("instruction_id").notNull().references(()=>h.id,{onDelete:"cascade"}),linkMethod:xn("link_method").notNull(),contentHash:xn("content_hash")},e=>[vr("idx_session_instructions_instruction_id").on(e.instructionId)])});import{pgTable as sy,text as lu,timestamp as iy,uuid as Ir,integer as ay,index as ri,unique as QS}from"drizzle-orm/pg-core";var Lt,ne,cy=G(()=>{"use strict";Yt();wr();ni();Lt=sy("treatment_assignments",{id:Ir("id").primaryKey().defaultRandom(),userId:Ir("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),treatmentType:lu("treatment_type").notNull(),treatmentId:Ir("treatment_id").notNull(),treatmentVersion:ay("treatment_version").notNull().default(1),projectId:Ir("project_id").references(()=>C.id,{onDelete:"set null"}),assignedBy:Ir("assigned_by").references(()=>T.id,{onDelete:"set null"}),method:lu("method").notNull(),assignedAt:iy("assigned_at",{withTimezone:!0}).notNull().defaultNow()},e=>[ri("idx_treatment_assignments_user").on(e.userId),ri("idx_treatment_assignments_treatment").on(e.treatmentType,e.treatmentId),ri("idx_treatment_assignments_project").on(e.projectId)]),ne=sy("treatment_exposures",{id:Ir("id").primaryKey().defaultRandom(),sessionId:Ir("session_id").notNull().references(()=>y.id,{onDelete:"cascade"}),userId:Ir("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),treatmentType:lu("treatment_type").notNull(),treatmentId:Ir("treatment_id").notNull(),treatmentVersion:ay("treatment_version").notNull().default(1),assignmentId:Ir("assignment_id").references(()=>Lt.id,{onDelete:"set null"}),method:lu("method").notNull(),exposedAt:iy("exposed_at",{withTimezone:!0}).notNull().defaultNow()},e=>[QS("treatment_exposures_unique").on(e.sessionId,e.treatmentType,e.treatmentId,e.treatmentVersion),ri("idx_treatment_exposures_treatment").on(e.treatmentType,e.treatmentId),ri("idx_treatment_exposures_user").on(e.userId),ri("idx_treatment_exposures_session").on(e.sessionId)])});import{pgTable as ZS,text as km,timestamp as ex,uuid as pu,integer as tx,index as dy,uniqueIndex as nx}from"drizzle-orm/pg-core";var mu,uy=G(()=>{"use strict";Yt();wr();mu=ZS("pending_treatment_exposures",{id:pu("id").primaryKey().defaultRandom(),userId:pu("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),externalSessionId:km("external_session_id").notNull(),treatmentType:km("treatment_type").notNull(),treatmentId:pu("treatment_id").notNull(),treatmentVersion:tx("treatment_version").notNull().default(1),method:km("method").notNull().default("injected"),projectId:pu("project_id").references(()=>C.id,{onDelete:"set null"}),createdAt:ex("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[nx("pending_treatment_exposures_unique").on(e.externalSessionId,e.treatmentType,e.treatmentId,e.treatmentVersion),dy("idx_pending_treatment_exposures_ext").on(e.externalSessionId),dy("idx_pending_treatment_exposures_user").on(e.userId)])});import{pgTable as ly,text as lo,timestamp as py,uuid as oi,numeric as rx,index as Nm,unique as ox}from"drizzle-orm/pg-core";var $,Fr,jm=G(()=>{"use strict";Yt();Sn();$=ly("instruction_experiments",{id:oi("id").primaryKey().defaultRandom(),userId:oi("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),instructionId:oi("instruction_id").notNull().references(()=>h.id,{onDelete:"cascade"}),projectPath:lo("project_path").notNull(),status:lo("status").notNull().default("running"),treatedShare:rx("treated_share").notNull().default("0.5"),salt:lo("salt").notNull(),contentHash:lo("content_hash"),source:lo("source").notNull().default("manual"),stoppedReason:lo("stopped_reason"),createdAt:py("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Nm("idx_instruction_experiments_lookup").on(e.userId,e.projectPath)]),Fr=ly("instruction_experiment_arms",{id:oi("id").primaryKey().defaultRandom(),experimentId:oi("experiment_id").notNull().references(()=>$.id,{onDelete:"cascade"}),userId:oi("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),externalSessionId:lo("external_session_id").notNull(),arm:lo("arm").notNull(),assignedAt:py("assigned_at",{withTimezone:!0}).notNull().defaultNow()},e=>[ox("instruction_experiment_arms_unique").on(e.experimentId,e.externalSessionId),Nm("idx_instruction_experiment_arms_experiment").on(e.experimentId,e.arm),Nm("idx_instruction_experiment_arms_session").on(e.externalSessionId)])});import{pgTable as sx,text as Pm,timestamp as ix,uuid as fu,numeric as Dm,integer as my,jsonb as ax,index as cx,unique as dx}from"drizzle-orm/pg-core";var Z,fy=G(()=>{"use strict";Yt();Sn();jm();Z=sx("instruction_verdicts",{id:fu("id").primaryKey().defaultRandom(),userId:fu("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),instructionId:fu("instruction_id").notNull().references(()=>h.id,{onDelete:"cascade"}),contentHash:Pm("content_hash").notNull(),projectPath:Pm("project_path").notNull(),segment:ax("segment").notNull().default({}),decision:Pm("decision").notNull(),delta:Dm("delta").notNull(),ciLower:Dm("ci_lower").notNull(),ciUpper:Dm("ci_upper").notNull(),nTreated:my("n_treated").notNull(),nControl:my("n_control").notNull(),experimentId:fu("experiment_id").references(()=>$.id,{onDelete:"set null"}),decidedAt:ix("decided_at",{withTimezone:!0}).notNull().defaultNow()},e=>[dx("instruction_verdicts_unique").on(e.instructionId,e.contentHash,e.projectPath),cx("idx_instruction_verdicts_render").on(e.userId,e.projectPath)])});import{pgTable as ux,text as gu,timestamp as Om,uuid as Cm,integer as lx,unique as px,index as mx}from"drizzle-orm/pg-core";var Te,gy=G(()=>{"use strict";Yt();Te=ux("insight_recommendation_log",{id:Cm("id").primaryKey().defaultRandom(),userId:Cm("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),projectPath:gu("project_path").notNull().default(""),category:gu("category").notNull(),contentHash:gu("content_hash").notNull(),label:gu("label").notNull().default(""),firstSeenAt:Om("first_seen_at",{withTimezone:!0}).notNull().defaultNow(),lastSeenAt:Om("last_seen_at",{withTimezone:!0}).notNull().defaultNow(),timesGenerated:lx("times_generated").notNull().default(1),lastJobId:Cm("last_job_id"),dismissedAt:Om("dismissed_at",{withTimezone:!0})},e=>[px("insight_recommendation_log_unique").on(e.userId,e.projectPath,e.contentHash),mx("idx_insight_recommendation_log_read").on(e.userId,e.projectPath)])});import{pgTable as fx,text as si,timestamp as Lm,uuid as Ya,integer as hy,index as hu}from"drizzle-orm/pg-core";var F,Mm=G(()=>{"use strict";Yt();wr();F=fx("memories",{id:Ya("id").primaryKey().defaultRandom(),userId:Ya("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),orgId:Ya("org_id"),projectId:Ya("project_id").references(()=>C.id,{onDelete:"set null"}),version:hy("version").notNull().default(1),parentId:Ya("parent_id").references(()=>F.id,{onDelete:"set null"}),kind:si("kind").notNull(),title:si("title").notNull(),body:si("body").notNull(),source:si("source").notNull(),status:si("status").notNull().default("active"),trustClass:si("trust_class"),trustVersion:hy("trust_version"),trustComputedAt:Lm("trust_computed_at",{withTimezone:!0}),createdAt:Lm("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:Lm("updated_at",{withTimezone:!0}).notNull().defaultNow()},e=>[hu("idx_memories_user").on(e.userId),hu("idx_memories_project").on(e.projectId),hu("idx_memories_parent").on(e.parentId),hu("idx_memories_user_status").on(e.userId,e.status)])});import{pgTable as gx,text as Xa,timestamp as $m,uuid as qm,integer as _y,jsonb as hx,index as yy}from"drizzle-orm/pg-core";var Mt,wy=G(()=>{"use strict";Yt();Mm();Mt=gx("memory_experiments",{id:qm("id").primaryKey().defaultRandom(),memoryId:qm("memory_id").notNull().references(()=>F.id,{onDelete:"cascade"}),userId:qm("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),memoryVersion:_y("memory_version").notNull().default(1),taskPrompt:Xa("task_prompt").notNull(),expectations:Xa("expectations").array().notNull().default([]),trials:_y("trials").notNull().default(10),model:Xa("model"),status:Xa("status").notNull().default("pending"),result:hx("result").$type(),error:Xa("error"),createdAt:$m("created_at",{withTimezone:!0}).notNull().defaultNow(),startedAt:$m("started_at",{withTimezone:!0}),completedAt:$m("completed_at",{withTimezone:!0})},e=>[yy("idx_memory_experiments_memory").on(e.memoryId),yy("idx_memory_experiments_user").on(e.userId)])});import{pgTable as _x,text as ii,timestamp as Um,uuid as Hm,jsonb as yx,uniqueIndex as wx,index as vy}from"drizzle-orm/pg-core";var Ze,Bm=G(()=>{"use strict";Yt();ni();Ze=_x("session_terminal_targets",{id:Hm("id").primaryKey().defaultRandom(),userId:Hm("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),sessionId:Hm("session_id").references(()=>y.id,{onDelete:"set null"}),externalSessionId:ii("external_session_id"),kind:ii("kind").notNull(),target:ii("target").notNull(),status:ii("status").notNull().default("active"),attachCommand:ii("attach_command").notNull(),projectPath:ii("project_path"),metadata:yx("metadata").notNull().default({}),lastSeenAt:Um("last_seen_at",{withTimezone:!0}).defaultNow(),createdAt:Um("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Um("updated_at",{withTimezone:!0}).defaultNow()},e=>[wx("idx_session_terminal_targets_user_target").on(e.userId,e.target),vy("idx_session_terminal_targets_session").on(e.sessionId),vy("idx_session_terminal_targets_user_status").on(e.userId,e.status)])});import{boolean as vx,index as _u,jsonb as Iy,pgTable as Ix,text as cs,timestamp as Qa,uuid as yu,integer as by}from"drizzle-orm/pg-core";var wu,Ey=G(()=>{"use strict";ni();Bm();wu=Ix("session_send_jobs",{id:yu("id").primaryKey().defaultRandom(),userId:yu("user_id").notNull(),sessionId:yu("session_id").notNull().references(()=>y.id,{onDelete:"cascade"}),terminalTargetId:yu("terminal_target_id").references(()=>Ze.id,{onDelete:"set null"}),target:cs("target").notNull(),message:cs("message").notNull(),submit:vx("submit").notNull().default(!0),delivery:cs("delivery").notNull().default("live"),status:cs("status").notNull().default("pending"),result:Iy("result"),error:cs("error"),attempts:by("attempts").notNull().default(0),taskKind:cs("task_kind"),payload:Iy("payload"),claimedBy:cs("claimed_by"),claimedAt:Qa("claimed_at",{withTimezone:!0}),leaseExpiresAt:Qa("lease_expires_at",{withTimezone:!0}),leaseRecoveries:by("lease_recoveries").notNull().default(0),createdAt:Qa("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Qa("updated_at",{withTimezone:!0}).defaultNow(),completedAt:Qa("completed_at",{withTimezone:!0})},e=>[_u("idx_session_send_jobs_user").on(e.userId),_u("idx_session_send_jobs_session").on(e.sessionId),_u("idx_session_send_jobs_status").on(e.status),_u("idx_session_send_jobs_pending").on(e.userId,e.status)])});import{pgTable as Sy,text as ds,timestamp as vu,jsonb as xy,uuid as po,integer as bx,boolean as Ex,uniqueIndex as Ax,index as Ay,primaryKey as Sx}from"drizzle-orm/pg-core";var Ue,Me,Ty=G(()=>{"use strict";Sn();Ue=Sy("packs",{id:po("id").primaryKey().defaultRandom(),name:ds("name").notNull(),description:ds("description").notNull(),scope:ds("scope").notNull(),scopeRef:po("scope_ref"),version:ds("version").notNull().default("1.0.0"),tags:ds("tags").array(),badge:ds("badge"),metadata:xy("metadata"),createdBy:po("created_by"),createdAt:vu("created_at",{withTimezone:!0}).defaultNow(),updatedAt:vu("updated_at",{withTimezone:!0}).defaultNow(),archived:Ex("archived").default(!1),archivedAt:vu("archived_at",{withTimezone:!0}),archivedBy:po("archived_by"),forkedFromId:po("forked_from_id").references(()=>Ue.id,{onDelete:"set null"}),upstreamVersion:ds("upstream_version")},e=>[Ax("packs_name_scope_ref_idx").on(e.name,e.scope,e.scopeRef),Ay("idx_packs_scope").on(e.scope,e.scopeRef),Ay("idx_packs_created_by").on(e.createdBy)]),Me=Sy("pack_instructions",{packId:po("pack_id").references(()=>Ue.id,{onDelete:"cascade"}).notNull(),instructionId:po("instruction_id").references(()=>h.id,{onDelete:"cascade"}).notNull(),position:bx("position").notNull().default(0),slotOverrides:xy("slot_overrides"),addedAt:vu("added_at",{withTimezone:!0}).defaultNow(),addedBy:po("added_by")},e=>[Sx({columns:[e.packId,e.instructionId]})])});import{pgTable as xx,text as Fm,timestamp as Tx,jsonb as Rx,uuid as Wm,index as ai}from"drizzle-orm/pg-core";var mo,Ry=G(()=>{"use strict";Sn();mo=xx("instruction_usage_events",{id:Wm("id").primaryKey().defaultRandom(),instructionId:Wm("instruction_id").references(()=>h.id,{onDelete:"set null"}),userId:Wm("user_id").notNull(),surface:Fm("surface").notNull(),action:Fm("action").notNull(),metadata:Rx("metadata"),traceId:Fm("trace_id"),createdAt:Tx("created_at",{withTimezone:!0}).defaultNow()},e=>[ai("idx_usage_events_instruction").on(e.instructionId),ai("idx_usage_events_user").on(e.userId),ai("idx_usage_events_surface").on(e.surface),ai("idx_usage_events_action").on(e.action),ai("idx_usage_events_created_at").on(e.createdAt),ai("idx_usage_events_user_created").on(e.userId,e.createdAt)])});import{pgTable as kx,text as Iu,timestamp as ky,jsonb as Nx,uuid as Ny,index as zm}from"drizzle-orm/pg-core";var fe,jy=G(()=>{"use strict";fe=kx("worker_connections",{id:Ny("id").primaryKey().defaultRandom(),userId:Ny("user_id").notNull(),workerType:Iu("worker_type").notNull().default("mcp"),clientName:Iu("client_name").notNull(),clientVersion:Iu("client_version"),workerVersion:Iu("worker_version"),lastHeartbeat:ky("last_heartbeat",{withTimezone:!0}).notNull().defaultNow(),connectedAt:ky("connected_at",{withTimezone:!0}).notNull().defaultNow(),metadata:Nx("metadata")},e=>[zm("idx_worker_connections_user").on(e.userId),zm("idx_worker_connections_heartbeat").on(e.userId,e.lastHeartbeat),zm("idx_worker_connections_type").on(e.userId,e.workerType)])});import{pgTable as jx,text as bu,timestamp as Px,jsonb as Dx,uuid as Py,index as Dy}from"drizzle-orm/pg-core";var Eu,Oy=G(()=>{"use strict";Eu=jx("cli_setup_events",{id:Py("id").primaryKey().defaultRandom(),userId:Py("user_id").notNull(),deviceId:bu("device_id").notNull(),event:bu("event").notNull(),cliVersion:bu("cli_version"),os:bu("os"),props:Dx("props").notNull().default({}),createdAt:Px("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Dy("idx_cli_setup_events_user").on(e.userId,e.createdAt),Dy("idx_cli_setup_events_device").on(e.deviceId,e.createdAt)])});import{pgTable as Ox,text as us,integer as Cx,boolean as Lx,timestamp as Mx,jsonb as $x,uuid as qx,index as Cy}from"drizzle-orm/pg-core";var Au,Ly=G(()=>{"use strict";Au=Ox("cli_error_events",{id:qx("id").primaryKey().defaultRandom(),deviceId:us("device_id"),event:us("event").notNull(),command:us("command"),statusCode:Cx("status_code"),message:us("message"),cliVersion:us("cli_version"),os:us("os"),nodeVersion:us("node_version"),proxied:Lx("proxied"),props:$x("props").notNull().default({}),createdAt:Mx("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Cy("idx_cli_error_events_created").on(e.createdAt),Cy("idx_cli_error_events_device").on(e.deviceId,e.createdAt)])});import{sql as Vm}from"drizzle-orm";import{pgTable as ls,text as _t,timestamp as gn,jsonb as $n,uuid as pt,integer as Wr,boolean as Za,index as Ht,unique as My}from"drizzle-orm/pg-core";var k,Ee,Ie,ot,et,pe,rr,ec=G(()=>{"use strict";Sn();k=ls("eval_targets",{id:pt("id").primaryKey().defaultRandom(),userId:pt("user_id").notNull(),name:_t("name").notNull(),type:_t("type").notNull(),content:_t("content").notNull(),description:_t("description").notNull().default(""),metadata:$n("metadata").notNull().default({}),version:Wr("version").notNull().default(1),parentId:pt("parent_id").references(()=>k.id,{onDelete:"set null"}),instructionId:pt("instruction_id").references(()=>h.id,{onDelete:"set null"}),projectPath:_t("project_path"),createdAt:gn("created_at",{withTimezone:!0}).defaultNow(),updatedAt:gn("updated_at",{withTimezone:!0}).defaultNow()},e=>[Ht("eval_targets_name_user_idx").on(e.name,e.userId),Ht("idx_eval_targets_user").on(e.userId),Ht("idx_eval_targets_type").on(e.type),Ht("idx_eval_targets_parent").on(e.parentId),Ht("idx_eval_targets_instruction").on(e.instructionId).where(Vm`${e.instructionId} IS NOT NULL`),Ht("idx_eval_targets_project").on(e.projectPath).where(Vm`${e.projectPath} IS NOT NULL`)]),Ee=ls("evals",{id:pt("id").primaryKey().defaultRandom(),evalTargetId:pt("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),name:_t("name").notNull(),prompt:_t("prompt").notNull(),expectedOutput:_t("expected_output").notNull().default(""),files:$n("files").notNull().default([]),expectations:$n("expectations").notNull().default([]),retiredAt:gn("retired_at",{withTimezone:!0}),retiredReason:_t("retired_reason"),createdAt:gn("created_at",{withTimezone:!0}).defaultNow(),updatedAt:gn("updated_at",{withTimezone:!0}).defaultNow(),contentUpdatedAt:gn("content_updated_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Ht("idx_evals_target").on(e.evalTargetId),Ht("idx_evals_target_active").on(e.evalTargetId).where(Vm`${e.retiredAt} IS NULL`)]),Ie=ls("eval_runs",{id:pt("id").primaryKey().defaultRandom(),jobId:pt("job_id"),evalId:pt("eval_id").notNull().references(()=>Ee.id,{onDelete:"cascade"}),evalTargetId:pt("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),evalTargetVersion:Wr("eval_target_version").notNull(),configuration:_t("configuration").notNull(),runNumber:Wr("run_number").notNull().default(1),iteration:Wr("iteration").notNull().default(1),status:_t("status").notNull().default("completed"),outputs:$n("outputs").notNull().default({}),timing:$n("timing").notNull().default({}),grading:$n("grading").notNull().default({}),comparison:$n("comparison"),createdAt:gn("created_at",{withTimezone:!0}).defaultNow()},e=>[Ht("idx_eval_runs_eval").on(e.evalId),Ht("idx_eval_runs_target").on(e.evalTargetId),Ht("idx_eval_runs_iteration").on(e.evalTargetId,e.iteration)]),ot=ls("eval_comparisons",{id:pt("id").primaryKey().defaultRandom(),userId:pt("user_id").notNull(),targetAId:pt("target_a_id").notNull().references(()=>k.id,{onDelete:"cascade"}),targetBId:pt("target_b_id").notNull().references(()=>k.id,{onDelete:"cascade"}),targetAVersion:Wr("target_a_version").notNull(),targetBVersion:Wr("target_b_version").notNull(),isSwapped:Za("is_swapped").notNull().default(!1),winnerTargetId:pt("winner_target_id").references(()=>k.id,{onDelete:"set null"}),perEval:$n("per_eval").notNull().default([]),overall:$n("overall").notNull().default({}),rawOutput:_t("raw_output"),model:_t("model"),status:_t("status").notNull().default("completed"),createdAt:gn("created_at",{withTimezone:!0}).defaultNow()},e=>[Ht("idx_eval_comparisons_target_a").on(e.targetAId),Ht("idx_eval_comparisons_target_b").on(e.targetBId),Ht("idx_eval_comparisons_user").on(e.userId)]),et=ls("eval_grade_annotations",{id:pt("id").primaryKey().defaultRandom(),userId:pt("user_id").notNull(),evalRunId:pt("eval_run_id").notNull().references(()=>Ie.id,{onDelete:"cascade"}),evalTargetId:pt("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),expectationIndex:Wr("expectation_index").notNull(),expectationText:_t("expectation_text").notNull(),judgePassed:Za("judge_passed").notNull(),judgeMethod:_t("judge_method").notNull(),judgeModel:_t("judge_model"),verdict:_t("verdict").notNull(),flag:_t("flag"),note:_t("note"),createdAt:gn("created_at",{withTimezone:!0}).defaultNow(),updatedAt:gn("updated_at",{withTimezone:!0}).defaultNow()},e=>[Ht("idx_eval_grade_annotations_target").on(e.evalTargetId),Ht("idx_eval_grade_annotations_run").on(e.evalRunId),My("eval_grade_annotations_eval_run_id_expectation_index_key").on(e.evalRunId,e.expectationIndex)]),pe=ls("judge_reviewer_verdicts",{id:pt("id").primaryKey().defaultRandom(),userId:pt("user_id").notNull(),evalTargetId:pt("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),evalRunId:pt("eval_run_id").notNull().references(()=>Ie.id,{onDelete:"cascade"}),expectationIndex:Wr("expectation_index").notNull(),expectationText:_t("expectation_text").notNull(),judgePassed:Za("judge_passed").notNull(),humanPassed:Za("human_passed").notNull(),reviewerEngine:_t("reviewer_engine").notNull(),reviewerModel:_t("reviewer_model").notNull(),reviewerPassed:Za("reviewer_passed").notNull(),resolvedAt:gn("resolved_at",{withTimezone:!0}),resolution:_t("resolution"),createdAt:gn("created_at",{withTimezone:!0}).defaultNow(),updatedAt:gn("updated_at",{withTimezone:!0}).defaultNow()},e=>[Ht("idx_jrv_target").on(e.evalTargetId),My("judge_reviewer_verdicts_eval_run_id_expectation_index_review_key").on(e.evalRunId,e.expectationIndex,e.reviewerModel)]),rr=ls("benchmarks",{id:pt("id").primaryKey().defaultRandom(),evalTargetId:pt("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),iteration:Wr("iteration").notNull().default(1),runSummary:$n("run_summary").notNull().default({}),notes:$n("notes").notNull().default([]),feedback:$n("feedback"),createdAt:gn("created_at",{withTimezone:!0}).defaultNow()},e=>[Ht("idx_benchmarks_target").on(e.evalTargetId)])});import{sql as Jm}from"drizzle-orm";import{pgTable as Ux,text as zr,timestamp as Hx,jsonb as Su,uuid as xu,boolean as Bx,index as tc,uniqueIndex as Fx}from"drizzle-orm/pg-core";var ie,$y=G(()=>{"use strict";ec();Sn();ie=Ux("instruction_promotions",{id:xu("id").primaryKey().defaultRandom(),userId:xu("user_id").notNull(),evalTargetId:xu("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),instructionId:xu("instruction_id").references(()=>h.id,{onDelete:"set null"}),fromContentHash:zr("from_content_hash").notNull(),toContentHash:zr("to_content_hash").notNull(),fromContent:zr("from_content").notNull(),toContent:zr("to_content").notNull(),proposalSource:zr("proposal_source").notNull(),proposalRationale:zr("proposal_rationale").notNull().default(""),decision:zr("decision").notNull(),applied:Bx("applied").notNull().default(!1),refusals:Su("refusals").notNull().default([]),rationale:zr("rationale").notNull().default(""),effectClass:zr("effect_class").notNull(),verdict:Su("verdict").notNull().default({}),gates:Su("gates").notNull().default({}),touchedSections:Su("touched_sections").notNull().default([]),createdAt:Hx("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[tc("idx_instruction_promotions_budget").on(e.evalTargetId,e.createdAt.desc()).where(Jm`${e.applied}`),tc("idx_instruction_promotions_target").on(e.evalTargetId,e.createdAt.desc()),tc("idx_instruction_promotions_user").on(e.userId,e.createdAt.desc()),tc("idx_instruction_promotions_to_hash").on(e.toContentHash),Fx("uq_instruction_promotions_applied").on(e.evalTargetId,e.fromContentHash,e.toContentHash).where(Jm`${e.applied}`),tc("idx_instruction_promotions_applied_hash").on(e.toContentHash,e.createdAt.desc()).where(Jm`${e.applied}`)])});import{index as nc,integer as Wx,jsonb as zx,pgTable as Vx,text as Tn,timestamp as ci,uniqueIndex as Jx,uuid as rc}from"drizzle-orm/pg-core";var Re,qy=G(()=>{"use strict";Sn();wr();Re=Vx("recommendation_applications",{id:rc("id").primaryKey().defaultRandom(),userId:rc("user_id").notNull(),instructionId:rc("instruction_id").notNull().references(()=>h.id,{onDelete:"cascade"}),projectId:rc("project_id").references(()=>C.id,{onDelete:"set null"}),projectPath:Tn("project_path").notNull(),harness:Tn("harness").notNull(),targetPath:Tn("target_path").notNull(),status:Tn("status").notNull().default("proposed"),applyMode:Tn("apply_mode").notNull(),beforeHash:Tn("before_hash"),appliedHash:Tn("applied_hash"),appliedAt:ci("applied_at",{withTimezone:!0}),measurementStartedAt:ci("measurement_started_at",{withTimezone:!0}),measurementEndedAt:ci("measurement_ended_at",{withTimezone:!0}),verdict:Tn("verdict"),verdictDetail:Tn("verdict_detail"),revertedAt:ci("reverted_at",{withTimezone:!0}),boundaryClass:Tn("boundary_class"),targets:Tn("targets").array().notNull().default([]),inverse:zx("inverse"),requires:Tn("requires").array().notNull().default([]),provides:Tn("provides").array().notNull().default([]),applyBatchId:rc("apply_batch_id"),applySeq:Wx("apply_seq"),createdAt:ci("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:ci("updated_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Jx("uq_recommendation_applications_target").on(e.userId,e.instructionId,e.projectPath,e.harness,e.targetPath),nc("idx_recommendation_applications_user_status").on(e.userId,e.status,e.updatedAt.desc()),nc("idx_recommendation_applications_user_harness").on(e.userId,e.harness,e.updatedAt.desc()),nc("idx_recommendation_applications_project").on(e.projectId,e.updatedAt.desc()),nc("idx_recommendation_applications_batch").on(e.userId,e.applyBatchId,e.applySeq.desc()),nc("idx_recommendation_applications_requires").using("gin",e.requires)])});import{pgTable as Kx,text as fo,timestamp as Gx,jsonb as oc,uuid as Km,integer as Gm,real as Yx,index as sc,uniqueIndex as Uy}from"drizzle-orm/pg-core";var M,Hy=G(()=>{"use strict";ni();Yt();M=Kx("context_snapshots",{id:Km("id").primaryKey().defaultRandom(),sessionId:Km("session_id").references(()=>y.id,{onDelete:"cascade"}),userId:Km("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),sequence:Gm("sequence").notNull().default(0),provider:fo("provider").notNull(),model:fo("model").notNull(),systemPrompt:fo("system_prompt").notNull(),injectedInstructions:oc("injected_instructions").notNull().default([]),messagesSummary:oc("messages_summary").notNull(),tools:oc("tools").notNull().default([]),systemHash:fo("system_hash").notNull(),requestHash:fo("request_hash").notNull().default(""),toolsHash:fo("tools_hash"),injectedHash:fo("injected_hash"),messagesDelta:oc("messages_delta").default([]),messagesDeltaRef:fo("messages_delta_ref"),maxTokens:Gm("max_tokens"),temperature:Yx("temperature"),estimatedTokens:Gm("estimated_tokens"),capturedAt:Gx("captured_at",{withTimezone:!0}).notNull().defaultNow(),metadata:oc("metadata").default({})},e=>[sc("idx_context_snapshots_session").on(e.sessionId),sc("idx_context_snapshots_user").on(e.userId),sc("idx_context_snapshots_hash").on(e.systemHash),sc("idx_context_snapshots_request_hash").on(e.requestHash),Uy("idx_snapshots_session_request").on(e.sessionId,e.requestHash),Uy("idx_snapshots_session_sequence").on(e.sessionId,e.sequence),sc("idx_context_snapshots_user_session_captured").on(e.userId,e.sessionId,e.capturedAt.desc())])});import{pgTable as Xx,text as By,timestamp as Qx,jsonb as Zx,integer as eT,index as tT}from"drizzle-orm/pg-core";var Rn,Fy=G(()=>{"use strict";Rn=Xx("content_blobs",{hash:By("hash").primaryKey(),contentType:By("content_type").notNull(),content:Zx("content").notNull(),sizeBytes:eT("size_bytes").notNull().default(0),createdAt:Qx("created_at",{withTimezone:!0}).defaultNow()},e=>[tT("idx_content_blobs_type").on(e.contentType)])});import{pgTable as nT,text as Tu,timestamp as ic,jsonb as Ru,uuid as Ym,index as ku,integer as Wy}from"drizzle-orm/pg-core";var je,zy=G(()=>{"use strict";ec();je=nT("eval_jobs",{id:Ym("id").primaryKey().defaultRandom(),userId:Ym("user_id").notNull(),evalTargetId:Ym("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),status:Tu("status").notNull().default("pending"),config:Ru("config").notNull().default({}),progress:Ru("progress").notNull().default({}),result:Ru("result"),error:Tu("error"),attempts:Wy("attempts").notNull().default(0),taskKind:Tu("task_kind"),payload:Ru("payload"),claimedBy:Tu("claimed_by"),claimedAt:ic("claimed_at",{withTimezone:!0}),leaseExpiresAt:ic("lease_expires_at",{withTimezone:!0}),leaseRecoveries:Wy("lease_recoveries").notNull().default(0),createdAt:ic("created_at",{withTimezone:!0}).defaultNow(),updatedAt:ic("updated_at",{withTimezone:!0}).defaultNow(),completedAt:ic("completed_at",{withTimezone:!0})},e=>[ku("idx_eval_jobs_user").on(e.userId),ku("idx_eval_jobs_target").on(e.evalTargetId),ku("idx_eval_jobs_status").on(e.status),ku("idx_eval_jobs_pending").on(e.userId,e.status)])});import{pgTable as rT,text as ac,timestamp as cc,jsonb as Vy,uuid as Jy,integer as Ky,index as Gy}from"drizzle-orm/pg-core";var Pe,Yy=G(()=>{"use strict";Pe=rT("agent_jobs",{id:Jy("id").primaryKey().defaultRandom(),userId:Jy("user_id").notNull(),taskKind:ac("task_kind").notNull(),status:ac("status").notNull().default("pending"),payload:Vy("payload").notNull(),dedupeKey:ac("dedupe_key"),result:Vy("result"),error:ac("error"),attempts:Ky("attempts").notNull().default(0),claimedBy:ac("claimed_by"),claimedAt:cc("claimed_at",{withTimezone:!0}),leaseExpiresAt:cc("lease_expires_at",{withTimezone:!0}),leaseRecoveries:Ky("lease_recoveries").notNull().default(0),createdAt:cc("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:cc("updated_at",{withTimezone:!0}).notNull().defaultNow(),completedAt:cc("completed_at",{withTimezone:!0})},e=>[Gy("idx_agent_jobs_claim").on(e.userId,e.status,e.taskKind,e.createdAt),Gy("idx_agent_jobs_dedupe").on(e.userId,e.taskKind,e.dedupeKey)])});import{pgTable as oT,text as dc,timestamp as uc,jsonb as Nu,uuid as Xm,index as ju,integer as Xy}from"drizzle-orm/pg-core";var z,Qy=G(()=>{"use strict";wr();z=oT("insights_jobs",{id:Xm("id").primaryKey().defaultRandom(),userId:Xm("user_id").notNull(),status:dc("status").notNull().default("pending"),projectPath:dc("project_path"),projectId:Xm("project_id").references(()=>C.id,{onDelete:"set null"}),config:Nu("config").notNull().default({}),progress:Nu("progress").notNull().default({}),result:Nu("result"),error:dc("error"),attempts:Xy("attempts").notNull().default(0),taskKind:dc("task_kind"),payload:Nu("payload"),claimedBy:dc("claimed_by"),claimedAt:uc("claimed_at",{withTimezone:!0}),leaseExpiresAt:uc("lease_expires_at",{withTimezone:!0}),leaseRecoveries:Xy("lease_recoveries").notNull().default(0),createdAt:uc("created_at",{withTimezone:!0}).defaultNow(),updatedAt:uc("updated_at",{withTimezone:!0}).defaultNow(),completedAt:uc("completed_at",{withTimezone:!0})},e=>[ju("idx_insights_jobs_user").on(e.userId),ju("idx_insights_jobs_status").on(e.status),ju("idx_insights_jobs_pending").on(e.userId,e.status),ju("idx_insights_jobs_project").on(e.projectId)])});import{pgTable as sT,text as Qm,timestamp as Pu,uuid as Zy,index as iT,uniqueIndex as aT}from"drizzle-orm/pg-core";var Ae,ew=G(()=>{"use strict";Yt();Ae=sT("api_keys",{id:Zy("id").primaryKey().defaultRandom(),userId:Zy("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),name:Qm("name").notNull(),keyHash:Qm("key_hash").notNull(),keyPrefix:Qm("key_prefix").notNull(),lastUsedAt:Pu("last_used_at",{withTimezone:!0}),expiresAt:Pu("expires_at",{withTimezone:!0}),revokedAt:Pu("revoked_at",{withTimezone:!0}),createdAt:Pu("created_at",{withTimezone:!0}).defaultNow()},e=>[iT("idx_api_keys_user").on(e.userId),aT("idx_api_keys_hash").on(e.keyHash)])});import{pgTable as cT,text as Zm,timestamp as tw,uuid as dT,index as uT}from"drizzle-orm/pg-core";var qn,nw=G(()=>{"use strict";Yt();qn=cT("extension_auth_codes",{code:Zm("code").primaryKey(),userId:dT("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),editor:Zm("editor"),email:Zm("email"),expiresAt:tw("expires_at",{withTimezone:!0}).notNull(),createdAt:tw("created_at",{withTimezone:!0}).defaultNow()},e=>[uT("idx_ext_auth_codes_expiry").on(e.expiresAt)])});import{pgTable as lT,text as pT,timestamp as rw,jsonb as mT,uuid as ef,index as ow}from"drizzle-orm/pg-core";var He,sw=G(()=>{"use strict";ec();He=lT("eval_conversations",{id:ef("id").primaryKey().defaultRandom(),evalTargetId:ef("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),userId:ef("user_id").notNull(),messages:mT("messages").notNull().default([]),status:pT("status").notNull().default("active"),createdAt:rw("created_at",{withTimezone:!0}).defaultNow(),updatedAt:rw("updated_at",{withTimezone:!0}).defaultNow()},e=>[ow("idx_eval_conversations_target").on(e.evalTargetId),ow("idx_eval_conversations_user").on(e.userId)])});import{pgTable as fT,text as Vr,timestamp as iw,jsonb as gT,uuid as tf}from"drizzle-orm/pg-core";var go,aw=G(()=>{"use strict";go=fT("skill_submissions",{id:tf("id").primaryKey().defaultRandom(),skillId:Vr("skill_id").notNull(),name:Vr("name").notNull(),description:Vr("description").notNull(),category:Vr("category").notNull(),tools:Vr("tools").array().notNull(),tags:Vr("tags").array().default([]),content:Vr("content").notNull(),status:Vr("status").notNull().default("pending"),submittedBy:tf("submitted_by").notNull(),reviewedBy:tf("reviewed_by"),reviewNote:Vr("review_note"),metadata:gT("metadata"),createdAt:iw("created_at",{withTimezone:!0}).defaultNow(),updatedAt:iw("updated_at",{withTimezone:!0}).defaultNow()})});import{pgTable as hT,text as lc,timestamp as cw,jsonb as _T,uuid as yT,uniqueIndex as wT,index as dw}from"drizzle-orm/pg-core";var $t,uw=G(()=>{"use strict";$t=hT("harness_releases",{id:yT("id").primaryKey().defaultRandom(),harness:lc("harness").notNull(),version:lc("version").notNull(),publishedAt:cw("published_at",{withTimezone:!0}).notNull(),title:lc("title"),body:lc("body"),categories:_T("categories").default({}),url:lc("url"),createdAt:cw("created_at",{withTimezone:!0}).defaultNow()},e=>[wT("idx_harness_releases_unique").on(e.harness,e.version),dw("idx_harness_releases_harness").on(e.harness),dw("idx_harness_releases_published").on(e.publishedAt)])});import{pgTable as vT,text as di,timestamp as lw,jsonb as IT,uuid as pw,index as mw,uniqueIndex as bT}from"drizzle-orm/pg-core";var Tt,fw=G(()=>{"use strict";Tt=vT("notifications",{id:pw("id").primaryKey().defaultRandom(),userId:pw("user_id").notNull(),type:di("type").notNull(),title:di("title").notNull(),body:di("body"),url:di("url"),sourceTable:di("source_table"),sourceId:di("source_id"),metadata:IT("metadata").notNull().default({}),readAt:lw("read_at",{withTimezone:!0}),createdAt:lw("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[mw("idx_notifications_user_created").on(e.userId,e.createdAt),mw("idx_notifications_user_unread").on(e.userId),bT("idx_notifications_source_dedup").on(e.userId,e.sourceTable,e.sourceId)])});import{pgTable as ET,text as pc,timestamp as mc,jsonb as nf,uuid as rf,index as Du,integer as gw}from"drizzle-orm/pg-core";var ue,hw=G(()=>{"use strict";du();ue=ET("launch_jobs",{id:rf("id").primaryKey().defaultRandom(),userId:rf("user_id").notNull(),tool:pc("tool").notNull(),status:pc("status").notNull().default("pending"),config:nf("config").notNull().default({}),result:nf("result"),error:pc("error"),attempts:gw("attempts").notNull().default(0),taskKind:pc("task_kind"),payload:nf("payload"),claimedBy:pc("claimed_by"),claimedAt:mc("claimed_at",{withTimezone:!0}),leaseExpiresAt:mc("lease_expires_at",{withTimezone:!0}),leaseRecoveries:gw("lease_recoveries").notNull().default(0),createdAt:mc("created_at",{withTimezone:!0}).defaultNow(),updatedAt:mc("updated_at",{withTimezone:!0}).defaultNow(),completedAt:mc("completed_at",{withTimezone:!0}),runId:rf("run_id").references(()=>ee.id,{onDelete:"set null"})},e=>[Du("idx_launch_jobs_user").on(e.userId),Du("idx_launch_jobs_status").on(e.status),Du("idx_launch_jobs_pending").on(e.userId,e.status),Du("idx_launch_jobs_run").on(e.runId)])});import{pgTable as _w,uuid as Jr,text as ho,real as AT,timestamp as fc,boolean as ST,uniqueIndex as xT,index as gc}from"drizzle-orm/pg-core";var Ou,x,Ge,yw=G(()=>{"use strict";Yt();Sn();wr();Ou=["add","remove","trim"],x=_w("instruction_suggestions",{id:Jr("id").primaryKey().defaultRandom(),userId:Jr("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),instructionId:Jr("instruction_id").notNull().references(()=>h.id,{onDelete:"cascade"}),projectPath:ho("project_path").notNull(),projectId:Jr("project_id").references(()=>C.id,{onDelete:"set null"}),score:AT("score").notNull(),reason:ho("reason").notNull(),kind:ho("kind").$type().notNull().default("add"),generatedAt:fc("generated_at",{withTimezone:!0}).notNull().defaultNow(),isStale:ST("is_stale").notNull().default(!1),dismissedAt:fc("dismissed_at",{withTimezone:!0}),acceptedAt:fc("accepted_at",{withTimezone:!0}),declinedAt:fc("declined_at",{withTimezone:!0}),declinedReason:ho("declined_reason"),promotedToInstructionId:Jr("promoted_to_instruction_id").references(()=>h.id,{onDelete:"set null"})},e=>[xT("idx_instruction_suggestions_user_project_instruction_kind").on(e.userId,e.projectPath,e.instructionId,e.kind),gc("idx_instruction_suggestions_user_project").on(e.userId,e.projectPath),gc("idx_instruction_suggestions_user_proj_id").on(e.userId,e.projectId),gc("idx_instruction_suggestions_generated_at").on(e.generatedAt)]),Ge=_w("instruction_suggestion_events",{id:Jr("id").primaryKey().defaultRandom(),suggestionId:Jr("suggestion_id").notNull().references(()=>x.id,{onDelete:"cascade"}),userId:Jr("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),eventType:ho("event_type").notNull(),tool:ho("tool"),sessionId:Jr("session_id"),projectPath:ho("project_path").notNull(),actor:ho("actor"),createdAt:fc("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[gc("idx_instruction_suggestion_events_suggestion_id").on(e.suggestionId),gc("idx_instruction_suggestion_events_user_id").on(e.userId)])});import{pgTable as TT,text as of,integer as RT,numeric as hc,timestamp as sf,index as kT,primaryKey as NT}from"drizzle-orm/pg-core";var st,ww=G(()=>{"use strict";st=TT("model_pricing",{provider:of("provider").notNull(),modelId:of("model_id").notNull(),inputPerM:hc("input_per_m").notNull(),outputPerM:hc("output_per_m").notNull(),cacheReadPerM:hc("cache_read_per_m").notNull(),cacheWrite5mPerM:hc("cache_write_5m_per_m").notNull(),cacheWrite1hPerM:hc("cache_write_1h_per_m").notNull(),contextWindow:RT("context_window"),effectiveFrom:sf("effective_from",{withTimezone:!0}).notNull(),effectiveUntil:sf("effective_until",{withTimezone:!0}),source:of("source").notNull(),verifiedAt:sf("verified_at",{withTimezone:!0})},e=>[NT({columns:[e.provider,e.modelId,e.effectiveFrom]}),kT("idx_model_pricing_active").on(e.provider,e.modelId,e.effectiveFrom.desc())])});import{pgTable as jT,text as ps,numeric as vw,timestamp as Iw,uuid as bw,jsonb as PT,index as Ew}from"drizzle-orm/pg-core";var ve,Aw=G(()=>{"use strict";ve=jT("limit_observations",{id:bw("id").primaryKey().defaultRandom(),observedAt:Iw("observed_at",{withTimezone:!0}).notNull().defaultNow(),provider:ps("provider").notNull(),plan:ps("plan").notNull(),limitType:ps("limit_type").notNull(),value:vw("value").notNull(),unit:ps("unit").notNull(),comparator:ps("comparator").notNull().default("="),resetsAt:Iw("resets_at",{withTimezone:!0}),sourceType:ps("source_type").notNull(),sourceUrl:ps("source_url"),sourceEvidence:PT("source_evidence"),confidence:vw("confidence").notNull(),userId:bw("user_id")},e=>[Ew("idx_limit_obs_lookup").on(e.provider,e.plan,e.limitType,e.observedAt.desc()),Ew("idx_limit_obs_user").on(e.userId,e.observedAt.desc())])});import{pgTable as DT,text as Cu,timestamp as OT,uuid as CT,jsonb as LT,boolean as MT,uniqueIndex as $T}from"drizzle-orm/pg-core";var Dt,Sw=G(()=>{"use strict";Dt=DT("provider_docs_snapshots",{id:CT("id").primaryKey().defaultRandom(),fetchedAt:OT("fetched_at",{withTimezone:!0}).notNull().defaultNow(),provider:Cu("provider").notNull(),docUrl:Cu("doc_url").notNull(),contentHash:Cu("content_hash").notNull(),content:Cu("content").notNull(),parseSuccess:MT("parse_success").notNull(),parseErrors:LT("parse_errors")},e=>[$T("idx_docs_dedup").on(e.provider,e.docUrl,e.contentHash)])});import{pgTable as qT,text as Lu,numeric as xw,timestamp as Tw,uuid as UT,primaryKey as HT,index as BT}from"drizzle-orm/pg-core";var tt,Rw=G(()=>{"use strict";tt=qT("plan_limits_active",{provider:Lu("provider").notNull(),plan:Lu("plan").notNull(),limitType:Lu("limit_type").notNull(),value:xw("value").notNull(),unit:Lu("unit").notNull(),effectiveFrom:Tw("effective_from",{withTimezone:!0}).notNull(),effectiveUntil:Tw("effective_until",{withTimezone:!0}),confidence:xw("confidence").notNull(),sourceObservationIds:UT("source_observation_ids").array().notNull()},e=>[HT({columns:[e.provider,e.plan,e.limitType,e.effectiveFrom]}),BT("idx_plan_limits_lookup").on(e.provider,e.plan,e.limitType,e.effectiveFrom.desc())])});import{pgTable as FT,text as af,timestamp as WT,uuid as kw,jsonb as zT,index as VT}from"drizzle-orm/pg-core";var kn,Nw=G(()=>{"use strict";kn=FT("alert_dispatches",{id:kw("id").primaryKey().defaultRandom(),userId:kw("user_id").notNull(),alertKey:af("alert_key").notNull(),severity:af("severity").notNull(),lastDispatchedAt:WT("last_dispatched_at",{withTimezone:!0}).notNull().defaultNow(),lastState:zT("last_state").notNull(),channel:af("channel").notNull()},e=>[VT("idx_alert_user_key").on(e.userId,e.alertKey,e.lastDispatchedAt.desc())])});import{boolean as JT,date as KT,index as cf,integer as GT,jsonb as YT,pgTable as df,text as or,timestamp as _o,uniqueIndex as XT,uuid as ui}from"drizzle-orm/pg-core";var $e,Rt,kt,jw=G(()=>{"use strict";$e=df("announcements",{id:ui("id").primaryKey().defaultRandom(),version:or("version").notNull().unique(),releaseDate:KT("release_date").notNull(),subject:or("subject").notNull(),htmlBody:or("html_body").notNull(),textBody:or("text_body").notNull(),sections:YT("sections").notNull().default({}),status:or("status").notNull().default("draft"),recipientCount:GT("recipient_count"),sentAt:_o("sent_at",{withTimezone:!0}),sentBy:ui("sent_by"),error:or("error"),createdAt:_o("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:_o("updated_at",{withTimezone:!0}).notNull().defaultNow()},e=>[cf("idx_announcements_status").on(e.status),cf("idx_announcements_created").on(e.createdAt)]),Rt=df("announcement_deliveries",{id:ui("id").primaryKey().defaultRandom(),announcementId:ui("announcement_id").notNull(),userId:ui("user_id").notNull(),email:or("email").notNull(),status:or("status").notNull().default("pending"),providerId:or("provider_id"),error:or("error"),sentAt:_o("sent_at",{withTimezone:!0}),createdAt:_o("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[XT("uniq_announcement_deliveries_announcement_user").on(e.announcementId,e.userId),cf("idx_announcement_deliveries_user").on(e.userId,e.createdAt)]),kt=df("notification_preferences",{userId:ui("user_id").primaryKey(),productAnnouncements:JT("product_announcements").notNull().default(!0),unsubscribeToken:or("unsubscribe_token").notNull().unique(),unsubscribedAt:_o("unsubscribed_at",{withTimezone:!0}),createdAt:_o("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:_o("updated_at",{withTimezone:!0}).notNull().defaultNow()})});import{pgTable as QT,text as uf,timestamp as Pw,uuid as lf,integer as ZT,index as eR,unique as tR}from"drizzle-orm/pg-core";var Dw,Ow=G(()=>{"use strict";Dw=QT("scaffolding_fingerprints",{id:lf("id").primaryKey().defaultRandom(),userId:lf("user_id").notNull(),harness:uf("harness").notNull(),model:uf("model").notNull(),toolsHash:uf("tools_hash").notNull(),firstSeenAt:Pw("first_seen_at",{withTimezone:!0}).notNull().defaultNow(),lastSeenAt:Pw("last_seen_at",{withTimezone:!0}).notNull().defaultNow(),snapshotCount:ZT("snapshot_count").notNull().default(1),firstSessionId:lf("first_session_id")},e=>[tR("scaffolding_fingerprints_user_id_harness_model_tools_hash_key").on(e.userId,e.harness,e.model,e.toolsHash),eR("idx_scaffolding_fp_segment").on(e.userId,e.harness,e.model)])});import{pgTable as nR,text as pf,timestamp as rR,jsonb as oR,uuid as Cw,integer as sR,unique as iR}from"drizzle-orm/pg-core";var Lw,Mw=G(()=>{"use strict";Lw=nR("scaffolding_segments",{id:Cw("id").primaryKey().defaultRandom(),userId:Cw("user_id").notNull(),harness:pf("harness").notNull(),model:pf("model").notNull(),coreNames:oR("core_names").notNull(),coreHash:pf("core_hash").notNull(),activeFingerprints:sR("active_fingerprints").notNull(),computedAt:rR("computed_at",{withTimezone:!0}).notNull().defaultNow()},e=>[iR("scaffolding_segments_user_id_harness_model_key").on(e.userId,e.harness,e.model)])});var mf=G(()=>{"use strict";Yt();os();Z_();Sn();ty();wr();ni();cy();uy();jm();fy();gy();Mm();wy();du();Bm();Ey();Ty();Ry();jy();Oy();Ly();ec();$y();qy();Hy();Fy();zy();Yy();Qy();ew();nw();sw();aw();uw();fw();hw();yw();ww();Aw();Sw();Rw();Nw();jw();Ow();Mw()});import{relations as Ye}from"drizzle-orm";var aR,cR,dR,uR,lR,pR,mR,fR,gR,hR,_R,yR,wR,vR,IR,bR,ER,AR,SR,xR,TR,RR,kR,NR,jR,PR,DR,OR,CR,LR,$w=G(()=>{"use strict";mf();aR=Ye(T,({many:e})=>({sessions:e(y),contextSnapshots:e(M),apiKeys:e(Ae)})),cR=Ye(Ae,({one:e})=>({profile:e(T,{fields:[Ae.userId],references:[T.id]})})),dR=Ye(X,({many:e})=>({teams:e(Q),userOrganizations:e(te),projects:e(C),invitations:e(ae)})),uR=Ye(Q,({one:e,many:t})=>({organization:e(X,{fields:[Q.orgId],references:[X.id]}),userTeams:t(we),invitations:t(ae)})),lR=Ye(ae,({one:e})=>({organization:e(X,{fields:[ae.orgId],references:[X.id]}),team:e(Q,{fields:[ae.teamId],references:[Q.id]}),inviter:e(T,{fields:[ae.invitedBy],references:[T.id]})})),pR=Ye(te,({one:e})=>({organization:e(X,{fields:[te.orgId],references:[X.id]})})),mR=Ye(we,({one:e})=>({team:e(Q,{fields:[we.teamId],references:[Q.id]})})),fR=Ye(h,({one:e,many:t})=>({versions:t(xe),projectInstructions:t(lt),events:t(Ut),usageEvents:t(mo),sessionInstructions:t(se),packInstructions:t(Me),forkedFrom:e(h,{fields:[h.forkedFromId],references:[h.id]})})),gR=Ye(Ut,({one:e})=>({instruction:e(h,{fields:[Ut.instructionId],references:[h.id]})})),hR=Ye(F,({one:e,many:t})=>({project:e(C,{fields:[F.projectId],references:[C.id]}),parent:e(F,{fields:[F.parentId],references:[F.id]}),versions:t(F)})),_R=Ye(xe,({one:e})=>({instruction:e(h,{fields:[xe.instructionId],references:[h.id]})})),yR=Ye(C,({one:e,many:t})=>({organization:e(X,{fields:[C.orgId],references:[X.id]}),projectInstructions:t(lt),sessions:t(y)})),wR=Ye(lt,({one:e})=>({project:e(C,{fields:[lt.projectId],references:[C.id]}),instruction:e(h,{fields:[lt.instructionId],references:[h.id]})})),vR=Ye(y,({one:e,many:t})=>({profile:e(T,{fields:[y.userId],references:[T.id]}),project:e(C,{fields:[y.projectId],references:[C.id]}),run:e(ee,{fields:[y.runId],references:[ee.id]}),events:t(ze),sessionInstructions:t(se),treatmentExposures:t(ne),contextSnapshots:t(M)})),IR=Ye(ee,({one:e,many:t})=>({profile:e(T,{fields:[ee.userId],references:[T.id]}),organization:e(X,{fields:[ee.orgId],references:[X.id]}),project:e(C,{fields:[ee.projectId],references:[C.id]}),sessions:t(y),launchJobs:t(ue)})),bR=Ye(ue,({one:e})=>({run:e(ee,{fields:[ue.runId],references:[ee.id]})})),ER=Ye(ze,({one:e})=>({session:e(y,{fields:[ze.sessionId],references:[y.id]})})),AR=Ye(se,({one:e})=>({session:e(y,{fields:[se.sessionId],references:[y.id]}),instruction:e(h,{fields:[se.instructionId],references:[h.id]})})),SR=Ye(Lt,({one:e,many:t})=>({owner:e(T,{fields:[Lt.userId],references:[T.id]}),project:e(C,{fields:[Lt.projectId],references:[C.id]}),exposures:t(ne)})),xR=Ye(ne,({one:e})=>({session:e(y,{fields:[ne.sessionId],references:[y.id]}),owner:e(T,{fields:[ne.userId],references:[T.id]}),assignment:e(Lt,{fields:[ne.assignmentId],references:[Lt.id]})})),TR=Ye(Ue,({one:e,many:t})=>({packInstructions:t(Me),forkedFrom:e(Ue,{fields:[Ue.forkedFromId],references:[Ue.id]})})),RR=Ye(Me,({one:e})=>({pack:e(Ue,{fields:[Me.packId],references:[Ue.id]}),instruction:e(h,{fields:[Me.instructionId],references:[h.id]})})),kR=Ye(mo,({one:e})=>({instruction:e(h,{fields:[mo.instructionId],references:[h.id]})})),NR=Ye(k,({one:e,many:t})=>({parent:e(k,{fields:[k.parentId],references:[k.id]}),evals:t(Ee),evalRuns:t(Ie),benchmarks:t(rr),evalJobs:t(je),evalConversations:t(He)})),jR=Ye(Ee,({one:e,many:t})=>({evalTarget:e(k,{fields:[Ee.evalTargetId],references:[k.id]}),runs:t(Ie)})),PR=Ye(Ie,({one:e})=>({eval:e(Ee,{fields:[Ie.evalId],references:[Ee.id]}),evalTarget:e(k,{fields:[Ie.evalTargetId],references:[k.id]})})),DR=Ye(rr,({one:e})=>({evalTarget:e(k,{fields:[rr.evalTargetId],references:[k.id]})})),OR=Ye(je,({one:e})=>({evalTarget:e(k,{fields:[je.evalTargetId],references:[k.id]})})),CR=Ye(He,({one:e})=>({evalTarget:e(k,{fields:[He.evalTargetId],references:[k.id]})})),LR=Ye(M,({one:e})=>({session:e(y,{fields:[M.sessionId],references:[y.id]}),profile:e(T,{fields:[M.userId],references:[T.id]})}))});var Mu={};co(Mu,{SUGGESTION_KINDS:()=>Ou,agentJobs:()=>Pe,agentRuns:()=>ee,agentRunsRelations:()=>IR,alertDispatches:()=>kn,announcementDeliveries:()=>Rt,announcements:()=>$e,apiKeys:()=>Ae,apiKeysRelations:()=>cR,benchmarks:()=>rr,benchmarksRelations:()=>DR,cliErrorEvents:()=>Au,cliSetupEvents:()=>Eu,contentBlobs:()=>Rn,contextSnapshots:()=>M,contextSnapshotsRelations:()=>LR,evalComparisons:()=>ot,evalConversations:()=>He,evalConversationsRelations:()=>CR,evalGradeAnnotations:()=>et,evalJobs:()=>je,evalJobsRelations:()=>OR,evalRuns:()=>Ie,evalRunsRelations:()=>PR,evalTargets:()=>k,evalTargetsRelations:()=>NR,evals:()=>Ee,evalsRelations:()=>jR,extensionAuthCodes:()=>qn,harnessReleases:()=>$t,insightRecommendationLog:()=>Te,insightsJobs:()=>z,instructionEvents:()=>Ut,instructionEventsRelations:()=>gR,instructionExperimentArms:()=>Fr,instructionExperiments:()=>$,instructionPromotions:()=>ie,instructionSuggestionEvents:()=>Ge,instructionSuggestions:()=>x,instructionUsageEvents:()=>mo,instructionUsageEventsRelations:()=>kR,instructionVerdicts:()=>Z,instructionVersionIdentities:()=>yr,instructionVersions:()=>xe,instructionVersionsRelations:()=>_R,instructions:()=>h,instructionsRelations:()=>fR,judgeReviewerVerdicts:()=>pe,launchJobs:()=>ue,launchJobsRelations:()=>bR,limitObservations:()=>ve,memories:()=>F,memoriesRelations:()=>hR,memoryExperiments:()=>Mt,modelPricing:()=>st,notificationPreferences:()=>kt,notifications:()=>Tt,orgInvitations:()=>ae,orgInvitationsRelations:()=>lR,organizations:()=>X,organizationsRelations:()=>dR,packInstructions:()=>Me,packInstructionsRelations:()=>RR,packs:()=>Ue,packsRelations:()=>TR,pendingTreatmentExposures:()=>mu,planLimitsActive:()=>tt,profiles:()=>T,profilesRelations:()=>aR,projectCheckouts:()=>ye,projectInstructions:()=>lt,projectInstructionsRelations:()=>wR,projects:()=>C,projectsRelations:()=>yR,providerDocsSnapshots:()=>Dt,recommendationApplications:()=>Re,scaffoldingFingerprints:()=>Dw,scaffoldingSegments:()=>Lw,sessionEvents:()=>ze,sessionEventsRelations:()=>ER,sessionInstructions:()=>se,sessionInstructionsRelations:()=>AR,sessionSendJobs:()=>wu,sessionTerminalTargets:()=>Ze,sessions:()=>y,sessionsRelations:()=>vR,skillSubmissions:()=>go,teams:()=>Q,teamsRelations:()=>uR,treatmentAssignments:()=>Lt,treatmentAssignmentsRelations:()=>SR,treatmentExposures:()=>ne,treatmentExposuresRelations:()=>xR,userOrganizations:()=>te,userOrganizationsRelations:()=>pR,userTeams:()=>we,userTeamsRelations:()=>mR,workerConnections:()=>fe});var $u=G(()=>{"use strict";mf();$w()});function _f(){ms++,ms>ff&&(ff=ms)}function yf(){ms>0&&ms--}function wf(){li++,li>gf&&(gf=li)}function vf(){li>0&&li--}function _c(){return ms}function If(){qw++}function yc(){Uw++}function Hw(){hf++}function bf(){let e=hf;return hf=0,e}function Ef(){return{current:ms,peak:ff,heavyCurrent:li,heavyPeak:gf,shedCount:qw,ingestShedCount:Uw}}function pi(){let e=Number(process.env.PG_INFLIGHT_MAX);return Number.isFinite(e)&&e>0?e:(Number(process.env.PG_POOL_MAX)||3)*4}function wc(){let e=pi(),t=Number(process.env.PG_INGEST_INFLIGHT_MAX);if(Number.isFinite(t)&&t>0)return Math.min(t,e);let n=Number(process.env.PG_POOL_MAX)||3;return Math.min(e,Math.max(n,Math.floor(e/2)))}var ms,ff,li,gf,qw,Uw,hf,Af=G(()=>{"use strict";ms=0,ff=0,li=0,gf=0,qw=0,Uw=0,hf=0;c(_f,"trackDbOpStart");c(yf,"trackDbOpEnd");c(wf,"trackHeavyDbOpStart");c(vf,"trackHeavyDbOpEnd");c(_c,"getDbLoad");c(If,"recordDbShed");c(yc,"recordIngestShed");c(Hw,"recordQueryDeadline");c(bf,"consumeDeadlineCount");c(Ef,"getDbLoadStats");c(pi,"dbInflightMax");c(wc,"dbIngestInflightMax")});import{drizzle as Bw}from"drizzle-orm/postgres-js";import Sf from"postgres";function xf(e){let t=process.env[e];if(!t)throw new Error(`Missing required env var: ${e}`);return t}function Fw(){if(bc)throw new Error("getDb() called after closeDb(): the connection pool is closed for shutdown. Stop issuing queries (timers/requests) before draining the pool.");if(!Ic){let e=process.env.PG_APPLICATION_NAME||"rulemetric",t=Number(process.env.PG_POOL_MAX)||3,n=Number(process.env.PG_CONNECT_TIMEOUT_S)||10,r=Number(process.env.PG_STATEMENT_TIMEOUT_MS)||0,o=Number(process.env.PG_IDLE_TIMEOUT)||5,s=Number(process.env.PG_KEEP_ALIVE_S)||60;fi=Sf(xf("DATABASE_URL"),{prepare:!1,max:t,connect_timeout:n,idle_timeout:o,keep_alive:s,max_lifetime:300,connection:{application_name:e,...r>0?{statement_timeout:r}:{}}}),Ic=Bw(fi,{schema:Mu})}return Ic}function Ww(){if(bc)throw new Error("getHeavyDb() called after closeDb(): the connection pool is closed for shutdown. Stop issuing queries (timers/requests) before draining the pool.");if(!Uu){let e=(process.env.PG_APPLICATION_NAME||"rulemetric")+":heavy",t=Number(process.env.PG_HEAVY_POOL_MAX)||2;Hu=Sf(xf("DATABASE_URL"),{prepare:!1,max:t,connect_timeout:Number(process.env.PG_CONNECT_TIMEOUT_S)||10,idle_timeout:Number(process.env.PG_IDLE_TIMEOUT)||5,keep_alive:Number(process.env.PG_KEEP_ALIVE_S)||60,max_lifetime:300,connection:{application_name:e}}),Uu=Bw(Hu,{schema:Mu})}return Uu}async function Ec(){if(qu)return qu;bc=!0;let e=fi,t=mi,n=Hu;return fi=void 0,Ic=void 0,mi=void 0,Hu=void 0,Uu=void 0,qu=Promise.allSettled([e?e.end({timeout:5}):Promise.resolve(),t?t.end({timeout:5}):Promise.resolve(),n?n.end({timeout:5}):Promise.resolve()]).then(()=>{}),qu}function Tf(){if(bc)return Promise.resolve();if(vc)return vc;let e=fi;return fi=void 0,Ic=void 0,vc=(async()=>{e&&await e.end({timeout:5}).catch(()=>{})})().finally(()=>{vc=void 0}),vc}async function Rf(e){let t=Date.now();if(bc)return{ok:!1,ms:0,err:new Error("pool closed for shutdown")};let n=mi;try{return n||(n=Sf(xf("DATABASE_URL"),{prepare:!1,max:1,connect_timeout:Number(process.env.PG_CONNECT_TIMEOUT_S)||10,idle_timeout:20,max_lifetime:300,connection:{application_name:(process.env.PG_APPLICATION_NAME||"rulemetric")+":probe",statement_timeout:Math.max(2e3,e-2e3)}}),mi=n),await Promise.race([n`SELECT 1`,new Promise((r,o)=>setTimeout(()=>o(new Error("db probe timeout")),e))]),{ok:!0,ms:Date.now()-t}}catch(r){return mi===n&&(mi=void 0),n?.end({timeout:1}).catch(()=>{}),{ok:!1,ms:Date.now()-t,err:r}}}function Ac(e){let t=e?.message;return typeof t=="string"&&t.includes(MR)}function gi(e){let t=e,n=t?.code??t?.cause?.code??t?.errno;return n!==void 0&&$R.has(n)}function Fu(e){let t=e,n=t?.code??t?.cause?.code??t?.errno;return n!==void 0&&qR.has(n)}async function zw(e,t={}){let n=t.attempts??3,r=t.baseMs??100,o;for(let s=0;s<n;s++)try{return await e()}catch(i){o=i;let a=gi(i)||t.retryResets===!0&&Fu(i);if(s===n-1||!a)throw i;await new Promise(d=>setTimeout(d,r*2**s))}throw o}function Sc(e){return e?.code==="QUERY_DEADLINE"}function Vw(){let e=Number(process.env.PG_QUERY_DEADLINE_MS);return Number.isFinite(e)&&e>=0?e:2e4}function Jw(){let e=Number(process.env.PG_HEAVY_QUERY_DEADLINE_MS);return Number.isFinite(e)&&e>=0?e:6e4}function UR(e,t,n=!0){let r,o=new Promise((s,i)=>{r=setTimeout(()=>{n&&Hw(),i(new Bu(t))},t);let a=r;typeof a.unref=="function"&&a.unref()});return Promise.race([e,o]).finally(()=>clearTimeout(r))}function kf(e,t=!1,n=0,r=!1){return e===null||typeof e!="object"&&typeof e!="function"?e:new Proxy(e,{get(o,s,i){if(s==="then"){let d=Reflect.get(o,s,i);return typeof d!="function"?d:(l,p)=>{let f=r?wf:_f,_=r?vf:yf;f();let v=zw(()=>new Promise((m,w)=>d.call(o,m,w)),{retryResets:t});return(n>0?UR(v,n,!r):v).finally(_).then(l,p)}}let a=Reflect.get(o,s,i);return typeof a=="function"?(...d)=>kf(a.apply(o,d),t,n,r):a}})}function Yw(e,t=!1){let n=t?wf:_f,r=t?vf:yf;n();try{return Promise.resolve(e()).finally(r)}catch(o){throw r(),o}}var Ic,fi,bc,qu,vc,mi,Hu,Uu,MR,$R,qR,Bu,Kw,Gw,u,Fe,Nf=G(()=>{"use strict";$u();Af();bc=!1;c(xf,"getEnv");c(Fw,"getDb");c(Ww,"getHeavyDb");c(Ec,"closeDb");c(Tf,"recyclePool");c(Rf,"probeDbReachable");MR="called after closeDb()";c(Ac,"isPoolClosedError");$R=new Set(["CONNECT_TIMEOUT","ETIMEDOUT","ENOTFOUND","ECONNREFUSED","EAI_AGAIN"]);c(gi,"isRetryableConnectError");qR=new Set(["CONNECTION_CLOSED","ECONNRESET","EPIPE"]);c(Fu,"isRetryableResetError");c(zw,"withDbRetry");Bu=class extends Error{static{c(this,"QueryDeadlineError")}code="QUERY_DEADLINE";constructor(t){super(`Query exceeded the client-side deadline of ${t}ms \u2014 the DB pool is likely saturated (acquire-wait) or holding a dead socket; failing fast to avoid pinning the caller. See client.ts.`),this.name="QueryDeadlineError"}};c(Sc,"isQueryDeadlineError");c(Vw,"queryDeadlineMs");c(Jw,"heavyQueryDeadlineMs");c(UR,"raceWithDeadline");Kw=new Set(["select","selectDistinct","selectDistinctOn","insert","update","delete","execute","with","$count","refreshMaterializedView"]),Gw=new Set(["select","selectDistinct","selectDistinctOn","$count"]);c(kf,"wrapBuilder");c(Yw,"gaugeTransaction");u=new Proxy({},{get(e,t){let n=Fw(),r=n[t];if(typeof t=="string"&&Kw.has(t)&&typeof r=="function"){let o=Gw.has(t),s=Vw();return(...i)=>kf(r.apply(n,i),o,s)}return t==="transaction"&&typeof r=="function"?(...o)=>Yw(()=>r.apply(n,o)):r}}),Fe=new Proxy({},{get(e,t){let n=Ww(),r=n[t];if(typeof t=="string"&&Kw.has(t)&&typeof r=="function"){let o=Gw.has(t);return(...s)=>kf(r.apply(n,s),o,Jw(),!0)}return t==="transaction"&&typeof r=="function"?(...o)=>Yw(()=>r.apply(n,o),!0):r}})});async function dn(e){let[t]=await u.insert(Tt).values({userId:e.userId,type:e.type,title:e.title,body:e.body??null,url:e.url??null,sourceTable:e.sourceTable??null,sourceId:e.sourceId??null,metadata:e.metadata??{}}).onConflictDoNothing({target:[Tt.userId,Tt.sourceTable,Tt.sourceId]}).returning();return t??null}var Xw=G(()=>{"use strict";Nf();$u();c(dn,"notifyUser")});var D=G(()=>{"use strict";$u();Nf();Af();Xw()});function zv(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function gl(e,t){let n=(e??"").trim();if(!n)return null;if(!n.includes("Contents of "))return n;if(t){let o=n.match(new RegExp(`Contents of [^\\n]*${zv(t)}[^\\n]*\\n([\\s\\S]*?)(?=\\nContents of |$)`,"i"))?.[1]?.trim();if(o)return o;let s=t.split("/").pop();if(s&&s!==t){let a=n.match(new RegExp(`Contents of [^\\n]*${zv(s)}[^\\n]*\\n([\\s\\S]*?)(?=\\nContents of |$)`,"i"))?.[1]?.trim();if(a)return a}}return null}var hg=G(()=>{"use strict";c(zv,"escapeRegExp");c(gl,"extractInstructionSection")});var Gv={};co(Gv,{GRADUATION_MIN_N:()=>Jc,decideGraduation:()=>Jv,graduatedRulesForRender:()=>_g,instructionContentHash:()=>Kr,maybeGraduate:()=>Kv,settleExperiment:()=>ki,verdictRowsForExperiments:()=>_l});import{createHash as CN}from"node:crypto";import{and as hl,eq as ar,inArray as LN,sql as Vv}from"drizzle-orm";function Jv(e){return e.resolution!=="resolved"||e.randomisationSuspect||e.contentChanged||e.delta===null||e.ci===null||e.measured.treated<Jc||e.measured.control<Jc?null:e.delta>0?"always":"never"}function Kr(e,t){let n=gl(e,t);return n?CN("sha256").update(n).digest("hex"):null}async function Kv(e){let{experimentId:t,userId:n,verdict:r}=e,o=Jv(r);if(o===null)return null;let[s]=await u.select({id:$.id,instructionId:$.instructionId,projectPath:$.projectPath,status:$.status}).from($).where(hl(ar($.id,t),ar($.userId,n)));if(!s||s.status!=="running")return null;let[i]=await u.select({content:h.content,name:h.name}).from(h).where(ar(h.id,s.instructionId)),a=Kr(i?.content,i?.name);if(!a)return null;let l=(await u.execute(Vv`
|
|
2
2
|
SELECT array_agg(DISTINCT s.model) FILTER (WHERE s.model IS NOT NULL) AS models,
|
|
3
3
|
array_agg(DISTINCT s.harness_version) FILTER (WHERE s.harness_version IS NOT NULL) AS harness_versions,
|
|
4
4
|
min(s.started_at)::text AS from_at,
|
|
@@ -9,7 +9,7 @@ var W_=Object.defineProperty;var c=(e,t)=>W_(e,"name",{value:t,configurable:!0})
|
|
|
9
9
|
AND s.user_id = a.user_id
|
|
10
10
|
WHERE a.experiment_id = ${t}
|
|
11
11
|
AND s.analysis->>'outcome' IS NOT NULL
|
|
12
|
-
`))[0];return await
|
|
12
|
+
`))[0];return await u.insert(Z).values({userId:n,instructionId:s.instructionId,contentHash:a,projectPath:s.projectPath,segment:{models:l?.models??[],harnessVersions:l?.harness_versions??[],window:{from:l?.from_at??null,to:l?.to_at??null}},decision:o,delta:String(r.delta),ciLower:String(r.ci.lower),ciUpper:String(r.ci.upper),nTreated:r.measured.treated,nControl:r.measured.control,experimentId:t}).onConflictDoNothing(),await u.update($).set({status:"stopped",stoppedReason:"graduated"}).where(ar($.id,t)),o}async function ki(e){let{experimentId:t,userId:n,verdict:r,source:o,status:s}=e;return s!=="running"?null:r.contentChanged?(await u.update($).set({status:"stopped",stoppedReason:"content_changed"}).where(hl(ar($.id,t),ar($.userId,n))),"content_changed"):await Kv({experimentId:t,userId:n,verdict:r})?"graduated":o==="trial"&&r.resolution==="inconclusive"&&!r.randomisationSuspect&&r.measured.treated>=Jc&&r.measured.control>=Jc?(await u.update($).set({status:"stopped",stoppedReason:"trial_neutral"}).where(hl(ar($.id,t),ar($.userId,n))),await u.execute(Vv`
|
|
13
13
|
UPDATE instruction_suggestions
|
|
14
14
|
SET declined_at = now(), declined_reason = 'trial_neutral'
|
|
15
15
|
WHERE user_id = ${n}
|
|
@@ -17,18 +17,18 @@ var W_=Object.defineProperty;var c=(e,t)=>W_(e,"name",{value:t,configurable:!0})
|
|
|
17
17
|
AND project_path = ${r.projectPath}
|
|
18
18
|
AND accepted_at IS NULL
|
|
19
19
|
AND declined_at IS NULL
|
|
20
|
-
`),"trial_neutral"):null}async function _g(e,t){return(await
|
|
21
|
-
`).filter(
|
|
20
|
+
`),"trial_neutral"):null}async function _g(e,t){return(await u.select({instructionId:Z.instructionId,contentHash:Z.contentHash,decision:Z.decision,content:h.content,name:h.name}).from(Z).innerJoin(h,ar(Z.instructionId,h.id)).where(hl(ar(Z.userId,e),ar(Z.projectPath,t)))).flatMap(r=>{let o=Kr(r.content,r.name);return o===null||o!==r.contentHash?[]:[{instructionId:r.instructionId,decision:r.decision}]})}async function _l(e){if(e.length===0)return new Map;let t=await u.select({experimentId:Z.experimentId,decision:Z.decision,decidedAt:Z.decidedAt,contentHash:Z.contentHash}).from(Z).where(LN(Z.experimentId,e));return new Map(t.filter(n=>n.experimentId!==null).map(n=>[n.experimentId,{decision:n.decision,decidedAt:n.decidedAt,contentHash:n.contentHash}]))}var Jc,ws=G(()=>{"use strict";D();hg();Jc=25;c(Jv,"decideGraduation");c(Kr,"instructionContentHash");c(Kv,"maybeGraduate");c(ki,"settleExperiment");c(_g,"graduatedRulesForRender");c(_l,"verdictRowsForExperiments")});var Zj,eP,DI=G(()=>{"use strict";Zj=["claude_code","cursor","vscode_copilot","copilot_agent","rulemetric_mcp","codex","pi","opencode","antigravity"],eP=["user_message","assistant_message","tool_call","tool_result","thinking","error"]});var Wi,Og=G(()=>{"use strict";Wi=class{static{c(this,"ClaudeCodeAdapter")}tool="claude_code";parse(t){let n=t.split(`
|
|
21
|
+
`).filter(g=>g.trim()),r=[];for(let g of n)try{r.push(JSON.parse(g))}catch{}let o=r.filter(g=>g.type==="user"||g.type==="assistant"),s=null,i=null,a={},d=r.find(g=>g.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(g=>g.type==="assistant");l?.message?.model&&(a.model=l.message.model);let p=[],f=0;for(let g of o){let m=g.timestamp??new Date().toISOString();if(g.type==="user"){let w=g.message?.content;if(typeof w=="string")p.push({sequence:f++,eventType:"user_message",content:w,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:m,metadata:{}});else if(Array.isArray(w))for(let I of w)I.type==="tool_result"&&p.push({sequence:f++,eventType:"tool_result",content:typeof I.content=="string"?I.content:JSON.stringify(I.content),toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:m,metadata:{toolUseId:I.tool_use_id}})}else if(g.type==="assistant"){let w=Array.isArray(g.message?.content)?g.message.content:[],I=g.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={};g.message?.model&&(A.model=g.message.model),g.message?.stop_reason&&(A.stopReason=g.message.stop_reason),g.requestId&&(A.requestId=g.requestId),I?.service_tier&&(A.serviceTier=I.service_tier),I?.speed&&(A.speed=I.speed),I?.cache_creation&&(A.cacheCreationDetail=I.cache_creation),I?.server_tool_use&&(A.serverToolUse=I.server_tool_use);for(let E of w)E.type==="text"?p.push({sequence:f++,eventType:"assistant_message",content:E.text??"",toolName:null,toolInput:null,toolOutput:null,tokenUsage:b,timestamp:m,metadata:A}):E.type==="thinking"?p.push({sequence:f++,eventType:"thinking",content:E.thinking??"",toolName:null,toolInput:null,toolOutput:null,tokenUsage:b,timestamp:m,metadata:A}):E.type==="tool_use"&&p.push({sequence:f++,eventType:"tool_call",content:null,toolName:E.name??"unknown",toolInput:E.input??null,toolOutput:null,tokenUsage:b,timestamp:m,metadata:{...A,toolUseId:E.id}})}}let _=p.map(g=>g.timestamp).sort(),v=new Date().toISOString();return{tool:"claude_code",projectPath:s,gitBranch:i,startedAt:_[0]??v,endedAt:_[_.length-1]??null,events:p,metadata:a}}}});var zi,Cg=G(()=>{"use strict";zi=class{static{c(this,"CursorAdapter")}tool="cursor";parse(t){let n=pm("better-sqlite3"),r=new n(t,{readonly:!0});try{let o=r.prepare("SELECT value FROM ItemTable WHERE key = 'composer.composerData'").get();return o?this.parseComposerJson(o.value):this.emptySession()}finally{r.close()}}parseComposerJson(t){let n;try{n=JSON.parse(t)}catch{return this.emptySession()}let r=Object.values(n.allComposers??{});if(r.length===0)return this.emptySession();let o=r.sort((l,p)=>{let f=l.createdAt?new Date(l.createdAt).getTime():0;return(p.createdAt?new Date(p.createdAt).getTime():0)-f})[0],s=o.conversation??[],i=[];for(let l=0;l<s.length;l++){let p=s[l],f=p.createdAt??new Date().toISOString();i.push({sequence:l,eventType:p.type===1?"user_message":"assistant_message",content:p.text,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:f,metadata:{}})}let a=i.map(l=>l.timestamp).sort(),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 Vi,Lg=G(()=>{"use strict";Vi=class{static{c(this,"VSCodeCopilotAdapter")}tool="vscode_copilot";parse(t){let n;try{n=JSON.parse(t)}catch{return this.emptySession()}let r=n.requests??[],o=[],s=0;for(let 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 Ji,Mg=G(()=>{"use strict";Ji=class{static{c(this,"CopilotAgentAdapter")}tool="copilot_agent";parse(t){let n;try{n=JSON.parse(t)}catch{return this.emptySession()}let r=n.requests??[],o=[],s=0;for(let 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 f=p.timestamp?new Date(p.timestamp).toISOString():l;o.push({sequence:s++,eventType:"tool_call",content:null,toolName:p.name??"unknown",toolInput:p.input??null,toolOutput:p.output??null,tokenUsage:null,timestamp:f,metadata:{}})}if(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 Ki,$g=G(()=>{"use strict";Ki=class{static{c(this,"RuleMetricMcpAdapter")}tool="rulemetric_mcp";parse(t){let n;try{n=JSON.parse(t)}catch{return this.emptySession()}let o=(n.events??[]).map((i,a)=>({sequence:i.sequence??a,eventType:this.normalizeEventType(i.eventType),content:i.content??null,toolName:i.toolName??null,toolInput:i.toolInput??null,toolOutput:i.toolOutput??null,tokenUsage:i.tokenUsage??null,timestamp:i.timestamp??new Date().toISOString(),metadata:i.metadata??{}})),s=new Date().toISOString();return{tool:"rulemetric_mcp",projectPath:n.projectPath??null,gitBranch:n.gitBranch??null,startedAt:n.startedAt??o[0]?.timestamp??s,endedAt:n.endedAt??o[o.length-1]?.timestamp??null,events:o,metadata:n.metadata??{}}}normalizeEventType(t){return t&&["user_message","assistant_message","tool_call","tool_result","thinking","error"].includes(t)?t:"assistant_message"}emptySession(){return{tool:"rulemetric_mcp",projectPath:null,gitBranch:null,startedAt:new Date().toISOString(),endedAt:null,events:[],metadata:{}}}}});function tP(e){try{return JSON.parse(e)}catch{return e}}function OI(e,t){return Array.isArray(e)?e.filter(n=>n.type&&t.includes(n.type)).map(n=>n.text??"").filter(Boolean).join(`
|
|
22
22
|
|
|
23
|
-
`):""}function
|
|
24
|
-
`).filter(
|
|
23
|
+
`):""}function nP(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 rP(e){if(!e)return new Date().toISOString();let t=new Date(e);return Number.isFinite(t.getTime())?t.toISOString():new Date().toISOString()}function qg(){return{sequence:0,model:null,prevCumulativeTotal:0,callNames:{}}}var Gi,Ug=G(()=>{"use strict";c(tP,"safeJsonParse");c(OI,"textFromBlocks");c(nP,"tokenUsageFromCodex");c(rP,"normalizeTimestamp");c(qg,"freshCodexState");Gi=class{static{c(this,"CodexAdapter")}tool="codex";parse(t){let n=qg(),{events:r,projectPath:o,gitBranch:s,metadata:i}=this.parseLines(t,n),a=r.map(l=>l.timestamp).sort(),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 f;try{f=JSON.parse(p)}catch{continue}let _=f.payload;if(!_)continue;let v=rP(f.timestamp);if(f.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(f.type==="turn_context"){a=_.cwd??a,_.model&&(n.model=_.model,s.model=_.model);continue}if(f.type==="response_item"&&_.type==="message"){if(_.role==="user"){let g=OI(_.content,["input_text"]);if(!g)continue;o.push({sequence:n.sequence++,eventType:"user_message",content:g,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:v,metadata:{}})}else if(_.role==="assistant"){let g=OI(_.content,["output_text"]);if(!g)continue;o.push({sequence:n.sequence++,eventType:"assistant_message",content:g,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,model:n.model,timestamp:v,metadata:n.model?{model:n.model}:{}})}continue}if(f.type==="response_item"&&_.type==="function_call"){let g=_.name??"unknown";_.call_id&&(i[_.call_id]=g);let m=typeof _.arguments=="string"?tP(_.arguments):{};o.push({sequence:n.sequence++,eventType:"tool_call",content:null,toolName:g,toolInput:m&&typeof m=="object"&&!Array.isArray(m)?m:{arguments:m},toolOutput:null,tokenUsage:null,model:n.model,timestamp:v,metadata:{callId:_.call_id}});continue}if(f.type==="response_item"&&_.type==="function_call_output"){let g=_.call_id?i[_.call_id]??null:null;o.push({sequence:n.sequence++,eventType:"tool_result",content:_.output??null,toolName:g,toolInput:null,toolOutput:_.output==null?null:{output:_.output},tokenUsage:null,model:n.model,timestamp:v,metadata:{callId:_.call_id}});continue}if(f.type==="event_msg"&&_.type==="token_count"){let g=_.info,m=g?.total_token_usage?.total_tokens??0;if(m>0&&m===n.prevCumulativeTotal)continue;m>0&&(n.prevCumulativeTotal=m);let w=nP(g?.last_token_usage??g?.total_token_usage);if(!w)continue;let I=g?.model??g?.model_name??n.model;o.push({sequence:n.sequence++,eventType:"assistant_message",content:null,toolName:null,toolInput:null,toolOutput:null,tokenUsage:w,model:I??null,timestamp:v,metadata:{codexEventType:"token_count",...I?{model:I}:{},reasoningOutputTokens:g?.last_token_usage?.reasoning_output_tokens??0}})}}return{events:o,projectPath:a,gitBranch:d,sessionId:l,metadata:s}}}});function td(e){let t=oP[e];if(!t)throw new Error(`Unknown session tool: ${e}`);return t()}function nd(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
|
|
27
|
-
`)[0];return n?.trim()?JSON.parse(n):null}catch{return null}}async function
|
|
28
|
-
`).filter(v=>v.trim()),o,s="",i=0,a=0,
|
|
29
|
-
`).filter(a=>a.trim()),s="",i="";for(let a of o){let
|
|
30
|
-
`)[0];return n?.trim()?JSON.parse(n):null}catch{return null}}function
|
|
31
|
-
`).filter(i=>i.trim()),o=YI(e.path,".jsonl"),s="";for(let[i,a]of r.entries()){let
|
|
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 oP,CI=G(()=>{"use strict";Og();Cg();Lg();Mg();$g();Ug();oP={claude_code:c(()=>new Wi,"claude_code"),cursor:c(()=>new zi,"cursor"),vscode_copilot:c(()=>new Vi,"vscode_copilot"),copilot_agent:c(()=>new Ji,"copilot_agent"),rulemetric_mcp:c(()=>new Ki,"rulemetric_mcp"),codex:c(()=>new Gi,"codex")};c(td,"getAdapter");c(nd,"detectTool")});import{readdir as Hg,stat as Bg}from"fs/promises";import{basename as sP,join as ko}from"path";import{homedir as Ll}from"os";function aP(){return process.env.CLAUDE_CONFIG_DIR||ko(Ll(),".claude")}function cP(){return ko(aP(),"projects")}function dP(){return process.platform==="darwin"?ko(Ll(),"Library","Application Support","Claude","local-agent-mode-sessions"):process.platform==="win32"?ko(Ll(),"AppData","Roaming","Claude","local-agent-mode-sessions"):ko(Ll(),".config","Claude","local-agent-mode-sessions")}async function uP(e){let t=[];async function n(r,o){if(o>8)return;let s=await Hg(r).catch(()=>[]);for(let i of s){if(i==="node_modules"||i===".git")continue;let a=ko(r,i);if((await Bg(a).catch(()=>null))?.isDirectory())if(i==="projects"){let l=await Hg(a).catch(()=>[]);for(let p of l){let f=ko(a,p);(await Bg(f).catch(()=>null))?.isDirectory()&&t.push(f)}}else await n(a,o+1)}}return c(n,"walk"),await n(e,0),t}var iP,LI,MI=G(()=>{"use strict";iP={"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(aP,"getClaudeDir");c(cP,"getProjectsDir");c(dP,"getDesktopSessionsDir");c(uP,"findDesktopProjectDirs");LI={name:"claude",displayName:"Claude Code",modelDisplayName(e){let t=e.replace(/@.*$/,"").replace(/-\d{8}$/,"");for(let[n,r]of Object.entries(iP))if(t.startsWith(n))return r;return t},toolDisplayName(e){return e},async discoverSessions(){let e=[],t=cP();try{let r=await Hg(t);for(let o of r){let s=ko(t,o);(await Bg(s).catch(()=>null))?.isDirectory()&&e.push({path:s,project:o,provider:"claude"})}}catch{}let n=await uP(dP());for(let r of n)e.push({path:r,project:sP(r),provider:"claude"});return e},createSessionParser(){return{async*parse(){}}}}});import{readdir as Ml,readFile as $I,stat as lP}from"fs/promises";import{basename as pP,join as Yi}from"path";import{homedir as mP}from"os";function gP(){return process.env.CODEX_HOME??Yi(mP(),".codex")}function hP(e){return e.replace(/^\//,"").replace(/\//g,"-")}async function _P(e){try{let n=(await $I(e,"utf-8")).split(`
|
|
27
|
+
`)[0];return n?.trim()?JSON.parse(n):null}catch{return null}}async function yP(e){let t=await _P(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 wP(e){let t=Yi(e,"sessions"),n=[],r;try{r=await Ml(t)}catch{return n}for(let o of r){if(!/^\d{4}$/.test(o))continue;let s=Yi(t,o),i=await Ml(s).catch(()=>[]);for(let a of i){if(!/^\d{2}$/.test(a))continue;let d=Yi(s,a),l=await Ml(d).catch(()=>[]);for(let p of l){if(!/^\d{2}$/.test(p))continue;let f=Yi(d,p),_=await Ml(f).catch(()=>[]);for(let v of _){if(!v.startsWith("rollout-")||!v.endsWith(".jsonl"))continue;let g=Yi(f,v);if(!(await lP(g).catch(()=>null))?.isFile())continue;let{valid:w,meta:I}=await yP(g);if(!w||!I)continue;let b=I.payload?.cwd??"unknown";n.push({path:g,project:hP(b),provider:"codex"})}}}}return n}function vP(e,t){return e?.info?.model??e?.info?.model_name??t??"gpt-5"}function IP(e,t){return{async*parse(){let n;try{n=await $I(e.path,"utf-8")}catch{return}let r=n.split(`
|
|
28
|
+
`).filter(v=>v.trim()),o,s="",i=0,a=0,d=0,l=0,p=0,f=[],_="";for(let v of r){let g;try{g=JSON.parse(v)}catch{continue}if(g.type==="session_meta"){s=g.payload?.session_id??pP(e.path,".jsonl"),o=g.payload?.model;continue}if(g.type==="response_item"&&g.payload?.type==="function_call"){let m=g.payload.name??"";f.push(qI[m]??m);continue}if(g.type==="response_item"&&g.payload?.type==="message"&&g.payload?.role==="user"){let m=(g.payload.content??[]).filter(w=>w.type==="input_text").map(w=>w.text??"").filter(Boolean);m.length>0&&(_=m.join(" "));continue}if(g.type==="event_msg"&&g.payload?.type==="token_count"){let m=g.payload.info;if(!m)continue;let w=m.total_token_usage?.total_tokens??0;if(w>0&&w===i)continue;i=w;let I=m.last_token_usage,b=0,A=0,E=0,S=0;if(I)b=I.input_tokens??0,A=I.cached_input_tokens??0,E=I.output_tokens??0,S=I.reasoning_output_tokens??0;else if(w>0){let q=m.total_token_usage;if(!q)continue;b=(q.input_tokens??0)-a,A=(q.cached_input_tokens??0)-d,E=(q.output_tokens??0)-l,S=(q.reasoning_output_tokens??0)-p}if(!I){let q=m.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+E+S===0)continue;let O=Math.max(0,b-A),W=vP(g.payload,o),N=g.timestamp??"",U=`codex:${e.path}:${N}:${w}`;if(t.has(U))continue;t.add(U),yield{provider:"codex",model:W,inputTokens:O,outputTokens:E,cacheCreationInputTokens:0,cacheReadInputTokens:A,cachedInputTokens:A,reasoningTokens:S,costUSD:0,tools:f,bashCommands:[],timestamp:N,speed:"standard",deduplicationKey:U,userMessage:_,sessionId:s},f=[],_=""}}}}}var fP,qI,UI,HI=G(()=>{"use strict";fP={"gpt-5.3-codex":"GPT-5.3 Codex","gpt-5.4-mini":"GPT-5.4 Mini","gpt-5.4":"GPT-5.4","gpt-5":"GPT-5","gpt-4o-mini":"GPT-4o Mini","gpt-4o":"GPT-4o"},qI={exec_command:"Bash",read_file:"Read",write_file:"Edit",apply_diff:"Edit",apply_patch:"Edit",spawn_agent:"Agent",close_agent:"Agent",wait_agent:"Agent",read_dir:"Glob"};c(gP,"getCodexDir");c(hP,"sanitizeProject");c(_P,"readFirstLine");c(yP,"isValidCodexSession");c(wP,"discoverSessionsInDir");c(vP,"resolveModel");c(IP,"createParser");UI={name:"codex",displayName:"Codex",modelDisplayName(e){for(let[t,n]of Object.entries(fP))if(e.startsWith(t))return n;return e},toolDisplayName(e){return qI[e]??e},async discoverSessions(){return wP(gP())},createSessionParser(e,t){return IP(e,t)}}});import{readdir as bP,readFile as BI,stat as EP}from"fs/promises";import{basename as FI,dirname as AP,join as Fg}from"path";import{homedir as SP}from"os";function RP(){return Fg(SP(),".copilot","session-state")}function kP(e){let t=e.match(/^cwd:\s*(.+)$/m);return t?.[1]&&t[1].replace(/\s*#.*$/,"").replace(/^['"]|['"]$/g,"").trim()||null}function NP(e,t){return{async*parse(){let n;try{n=await BI(e.path,"utf-8")}catch{return}let r=FI(AP(e.path)),o=n.split(`
|
|
29
|
+
`).filter(a=>a.trim()),s="",i="";for(let a of o){let d;try{d=JSON.parse(a)}catch{continue}if(d.type==="session.model_change"){s=d.data.newModel??s;continue}if(d.type==="user.message"){i=d.data.content??"";continue}if(d.type==="assistant.message"){let{messageId:l,outputTokens:p,toolRequests:f=[]}=d.data;if(p===0||!s)continue;let _=`copilot:${r}:${l}`;if(t.has(_))continue;t.add(_);let v=f.map(g=>g.name??"").filter(Boolean).map(g=>WI[g]??g);yield{provider:"copilot",model:s,inputTokens:0,outputTokens:p,cacheCreationInputTokens:0,cacheReadInputTokens:0,cachedInputTokens:0,reasoningTokens:0,costUSD:0,tools:v,bashCommands:[],timestamp:d.timestamp??"",speed:"standard",deduplicationKey:_,userMessage:i,sessionId:r},i=""}}}}}async function jP(e){let t=[],n;try{n=await bP(e)}catch{return t}for(let r of n){let o=Fg(e,r,"events.jsonl");if(!(await EP(o).catch(()=>null))?.isFile())continue;let i=r;try{let a=await BI(Fg(e,r,"workspace.yaml"),"utf-8"),d=kP(a);d&&(i=FI(d))}catch{}t.push({path:o,project:i,provider:"copilot"})}return t}var xP,WI,TP,zI,VI=G(()=>{"use strict";xP={"gpt-4.1-nano":"GPT-4.1 Nano","gpt-4.1-mini":"GPT-4.1 Mini","gpt-4.1":"GPT-4.1","gpt-4o-mini":"GPT-4o Mini","gpt-4o":"GPT-4o","gpt-5-mini":"GPT-5 Mini","gpt-5":"GPT-5","claude-sonnet-4-5":"Sonnet 4.5","claude-sonnet-4":"Sonnet 4","claude-3-7-sonnet":"Sonnet 3.7","claude-3-5-sonnet":"Sonnet 3.5","o4-mini":"o4-mini",o3:"o3"},WI={bash:"Bash",read_file:"Read",write_file:"Edit",edit_file:"Edit",create_file:"Write",delete_file:"Delete",search_files:"Grep",find_files:"Glob",list_directory:"LS",web_search:"WebSearch",fetch_webpage:"WebFetch",github_repo:"GitHub"},TP=Object.entries(xP).sort((e,t)=>t[0].length-e[0].length);c(RP,"getCopilotSessionStateDir");c(kP,"parseCwd");c(NP,"createParser");c(jP,"discoverSessionsInDir");zI={name:"copilot",displayName:"GitHub Copilot",modelDisplayName(e){for(let[t,n]of TP)if(e===t||e.startsWith(t+"-"))return n;return e},toolDisplayName(e){return WI[e]??e},async discoverSessions(){return jP(RP())},createSessionParser(e,t){return NP(e,t)}}});import{readdir as JI,readFile as GI,stat as KI}from"fs/promises";import{basename as YI,join as Wg}from"path";import{homedir as PP}from"os";function CP(){return Wg(PP(),".pi","agent","sessions")}async function LP(e){try{let n=(await GI(e,"utf-8")).split(`
|
|
30
|
+
`)[0];return n?.trim()?JSON.parse(n):null}catch{return null}}function MP(e){return e.split(/[;&|]+/).map(t=>t.trim().split(/\s+/)[0]).filter(Boolean)}async function $P(e){let t=[],n;try{n=await JI(e)}catch{return t}for(let r of n){let o=Wg(e,r);if(!(await KI(o).catch(()=>null))?.isDirectory())continue;let i;try{i=await JI(o)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let d=Wg(o,a);if(!(await KI(d).catch(()=>null))?.isFile())continue;let p=await LP(d);if(!p||p.type!=="session")continue;let f=p.cwd??r;t.push({path:d,project:YI(f),provider:"pi"})}}return t}function qP(e,t){return{async*parse(){let n;try{n=await GI(e.path,"utf-8")}catch{return}let r=n.split(`
|
|
31
|
+
`).filter(i=>i.trim()),o=YI(e.path,".jsonl"),s="";for(let[i,a]of r.entries()){let d;try{d=JSON.parse(a)}catch{continue}if(d.type==="session"){o=d.id??o;continue}if(d.type!=="message")continue;let l=d.message;if(!l)continue;if(l.role==="user"){let S=(l.content??[]).filter(R=>R.type==="text").map(R=>R.text??"").filter(Boolean);S.length>0&&(s=S.join(" "));continue}if(l.role!=="assistant"||!l.usage)continue;let{input:p,output:f,cacheRead:_,cacheWrite:v}=l.usage;if(p===0&&f===0)continue;let g=l.model??"gpt-5",m=l.responseId??"",w=`pi:${e.path}:${m||d.id||d.timestamp||String(i)}`;if(t.has(w))continue;t.add(w);let I=(l.content??[]).filter(S=>S.type==="toolCall"&&S.name),b=I.map(S=>XI[S.name]??S.name),A=I.filter(S=>S.name==="bash").flatMap(S=>{let R=S.arguments?.command;return typeof R=="string"?MP(R):[]}),E=d.timestamp??"";yield{provider:"pi",model:g,inputTokens:p,outputTokens:f,cacheCreationInputTokens:v,cacheReadInputTokens:_,cachedInputTokens:_,reasoningTokens:0,costUSD:0,tools:b,bashCommands:A,timestamp:E,speed:"standard",deduplicationKey:w,userMessage:s,sessionId:o},s=""}}}}var DP,XI,OP,QI,ZI=G(()=>{"use strict";DP={"gpt-5.4":"GPT-5.4","gpt-5.4-mini":"GPT-5.4 Mini","gpt-5":"GPT-5","gpt-4o":"GPT-4o","gpt-4o-mini":"GPT-4o Mini"},XI={bash:"Bash",read:"Read",edit:"Edit",write:"Write",glob:"Glob",grep:"Grep",task:"Agent",dispatch_agent:"Agent",fetch:"WebFetch",search:"WebSearch",todo:"TodoWrite",patch:"Patch"},OP=Object.entries(DP).sort((e,t)=>t[0].length-e[0].length);c(CP,"getPiSessionsDir");c(LP,"readFirstEntry");c(MP,"extractBashCommands");c($P,"discoverSessionsInDir");c(qP,"createParser");QI={name:"pi",displayName:"Pi",modelDisplayName(e){for(let[t,n]of OP)if(e.startsWith(t))return n;return e},toolDisplayName(e){return XI[e]??e},async discoverSessions(){return $P(CP())},createSessionParser(e,t){return qP(e,t)}}});var tb={};co(tb,{cursor:()=>JP});import{existsSync as UP}from"fs";import{join as zg}from"path";import{homedir as Vg}from"os";function eb(){if($l)return!0;try{return $l=pm("better-sqlite3"),!0}catch{return!1}}function FP(){return process.platform==="darwin"?zg(Vg(),"Library","Application Support","Cursor","User","globalStorage","state.vscdb"):process.platform==="win32"?zg(Vg(),"AppData","Roaming","Cursor","User","globalStorage","state.vscdb"):zg(Vg(),".config","Cursor","User","globalStorage","state.vscdb")}function WP(e){return!e||e==="default"?HP:e}function VP(e,t){return{async*parse(){if(!eb()||!$l)return;let n;try{n=new $l(e.path,{readonly:!0})}catch{return}try{let o=n.prepare(zP).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 f=WP(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 $l,HP,BP,zP,JP,nb=G(()=>{"use strict";$l=null;c(eb,"loadSqlite");HP="claude-sonnet-4-5",BP={"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(FP,"getCursorDbPath");c(WP,"resolveModel");zP=`
|
|
32
32
|
SELECT
|
|
33
33
|
json_extract(value, '$.tokenCount.inputTokens') as input_tokens,
|
|
34
34
|
json_extract(value, '$.tokenCount.outputTokens') as output_tokens,
|
|
@@ -40,24 +40,24 @@ var W_=Object.defineProperty;var c=(e,t)=>W_(e,"name",{value:t,configurable:!0})
|
|
|
40
40
|
WHERE key LIKE 'bubbleId:%'
|
|
41
41
|
AND json_extract(value, '$.tokenCount.inputTokens') > 0
|
|
42
42
|
ORDER BY json_extract(value, '$.createdAt') ASC
|
|
43
|
-
`;c(
|
|
43
|
+
`;c(VP,"createParser");JP={name:"cursor",displayName:"Cursor",modelDisplayName(e){return BP[e]??e},toolDisplayName(e){return e},async discoverSessions(){if(!eb())return[];let e=FP();return UP(e)?[{path:e,project:"cursor",provider:"cursor"}]:[]},createSessionParser(e,t){return VP(e,t)}}});var sb={};co(sb,{opencode:()=>nD});import{readdir as KP}from"fs/promises";import{join as Jg}from"path";import{homedir as GP}from"os";function Kg(){if(Xi)return!0;try{return Xi=pm("better-sqlite3"),!0}catch{return!1}}function rb(e){return e.replace(/^\//,"").replace(/\//g,"-")}function YP(){let e=process.env.XDG_DATA_HOME??Jg(GP(),".local","share");return Jg(e,"opencode")}async function XP(e){try{return(await KP(e)).filter(n=>n.startsWith("opencode")&&n.endsWith(".db")).map(n=>Jg(e,n))}catch{return[]}}function QP(e){let t=e<1e12?e*1e3:e;return new Date(t).toISOString()}function ZP(e){return e.split(/[;&|]+/).map(t=>t.trim().split(/\s+/)[0]).filter(Boolean)}function eD(e,t){return{async*parse(){if(!Kg()||!Xi)return;let n=e.path.split(":"),r=n[n.length-1],o=n.slice(0,-1).join(":"),s;try{s=new Xi(o,{readonly:!0})}catch{return}try{let i=s.prepare("SELECT id, time_created, data FROM message WHERE session_id = ? ORDER BY time_created ASC").all(r),a=s.prepare("SELECT message_id, data FROM part WHERE session_id = ? ORDER BY message_id, id").all(r),d=new Map;for(let p of a)try{let f=JSON.parse(p.data),_=d.get(p.message_id)??[];_.push(f),d.set(p.message_id,_)}catch{}let l="";for(let p of i){let f;try{f=JSON.parse(p.data)}catch{continue}if(f.role==="user"){let A=(d.get(p.id)??[]).filter(E=>E.type==="text").map(()=>"").filter(Boolean);A.length>0&&(l=A.join(" "));continue}if(f.role!=="assistant")continue;let _={input:f.tokens?.input??0,output:f.tokens?.output??0,reasoning:f.tokens?.reasoning??0,cacheRead:f.tokens?.cache?.read??0,cacheWrite:f.tokens?.cache?.write??0};if(_.input===0&&_.output===0&&_.reasoning===0&&_.cacheRead===0&&_.cacheWrite===0&&(f.cost??0)===0)continue;let m=(d.get(p.id)??[]).filter(A=>A.type==="tool"),w=m.map(A=>ob[A.tool??""]??A.tool??"").filter(Boolean),I=m.filter(A=>A.tool==="bash"&&typeof A.state?.input?.command=="string").flatMap(A=>ZP(A.state.input.command)),b=`opencode:${r}:${p.id}`;t.has(b)||(t.add(b),yield{provider:"opencode",model:f.modelID??"unknown",inputTokens:_.input,outputTokens:_.output,cacheCreationInputTokens:_.cacheWrite,cacheReadInputTokens:_.cacheRead,cachedInputTokens:_.cacheRead,reasoningTokens:_.reasoning,costUSD:f.cost??0,tools:w,bashCommands:I,timestamp:QP(p.time_created),speed:"standard",deduplicationKey:b,userMessage:l,sessionId:r})}}finally{s.close()}}}}async function tD(e){if(!Kg()||!Xi)return[];let t;try{t=new Xi(e,{readonly:!0})}catch{return[]}try{return t.prepare("SELECT id, directory, title FROM session WHERE time_archived IS NULL AND parent_id IS NULL ORDER BY time_created DESC").all().map(r=>({path:`${e}:${r.id}`,project:r.directory?rb(r.directory):rb(r.title),provider:"opencode"}))}catch{return[]}finally{t.close()}}var Xi,ob,nD,ib=G(()=>{"use strict";Xi=null;c(Kg,"loadSqlite");ob={bash:"Bash",read:"Read",edit:"Edit",write:"Write",glob:"Glob",grep:"Grep",task:"Agent",fetch:"WebFetch",search:"WebSearch",todo:"TodoWrite",skill:"Skill",patch:"Patch"};c(rb,"sanitize");c(YP,"getDataDir");c(XP,"findDbFiles");c(QP,"parseTimestamp");c(ZP,"extractBashCommands");c(eD,"createParser");c(tD,"discoverFromDb");nD={name:"opencode",displayName:"OpenCode",modelDisplayName(e){return e.replace(/^[^/]+\//,"")},toolDisplayName(e){return ob[e]??e},async discoverSessions(){if(!Kg())return[];let e=await XP(YP()),t=[];for(let n of e)t.push(...await tD(n));return t},createSessionParser(e,t){return eD(e,t)}}});async function pb(){if(cb)return ab;cb=!0;try{let{cursor:e}=await Promise.resolve().then(()=>(nb(),tb));return ab=e,e}catch{return null}}async function mb(){if(ub)return db;ub=!0;try{let{opencode:e}=await Promise.resolve().then(()=>(ib(),sb));return db=e,e}catch{return null}}async function Gg(){let[e,t]=await Promise.all([pb(),mb()]),n=[...lb];return e&&n.push(e),t&&n.push(t),n}async function fb(e){let t=await Gg(),n=e&&e!=="all"?t.filter(o=>o.name===e):t,r=[];for(let o of n){let s=await o.discoverSessions();r.push(...s)}return r}async function gb(e){return e==="cursor"?await pb()??void 0:e==="opencode"?await mb()??void 0:lb.find(t=>t.name===e)}var lb,ab,cb,db,ub,hb=G(()=>{"use strict";MI();HI();VI();ZI();lb=[LI,UI,zI,QI],ab=null,cb=!1;c(pb,"loadCursor");db=null,ub=!1;c(mb,"loadOpenCode");c(Gg,"getAllProviders");c(fb,"discoverAllSessions");c(gb,"getProvider")});import{spawn as rD}from"node:child_process";function ql(e){return`rm-${e.trim().replace(/[^A-Za-z0-9_.-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,80)||"session"}`}function Ul(e){let t=e.runId?["env",`RULEMETRIC_RUN_ID=${e.runId}`,"claude"]:["claude"];return e.resumeSessionId&&t.push("--resume",e.resumeSessionId),e.model&&t.push("--model",e.model),["new-session","-d","-s",e.sessionName,"-c",e.projectPath,"--",...t]}function rd(e,t,n={}){return n.literal===!1?["send-keys","-t",e,t]:["send-keys","-t",e,"-l","--",t]}function _b(e){return["has-session","-t",e]}function od(e){return`tmux attach -t ${e}`}function oD(){let e=["/opt/homebrew/bin","/usr/local/bin"],t=(process.env.PATH??"").split(":").filter(Boolean),n=e.filter(r=>!t.includes(r));return n.length===0?process.env:{...process.env,PATH:[...t,...n].join(":")}}function Yg(e){return new Promise(t=>{let n=rD("tmux",e,{stdio:["ignore","ignore","pipe"],env:oD()}),r="";n.stderr.on("data",o=>{r+=o.toString()}),n.on("close",o=>t({code:o,stderr:r})),n.on("error",o=>t({code:null,stderr:o.message}))})}async function yb(){return(await Yg(["-V"])).code===0}var Xg=G(()=>{"use strict";c(ql,"sanitizeTmuxName");c(Ul,"buildTmuxLaunchArgs");c(rd,"buildTmuxSendKeysArgs");c(_b,"buildTmuxHasSessionArgs");c(od,"buildTmuxAttachCommand");c(oD,"tmuxSpawnEnv");c(Yg,"runTmux");c(yb,"isTmuxAvailable")});import{spawn as Qg}from"node:child_process";import{randomUUID as sD}from"node:crypto";import{writeFile as wb}from"node:fs/promises";import{tmpdir as vb}from"node:os";import{join as Ib}from"node:path";function aD(e){if(e!==void 0){if(iD.test(e))return e;console.warn(`[claude-code-launcher] dropping non-uuid runId (RULEMETRIC_RUN_ID not injected): ${JSON.stringify(e)}`)}}function cD(e){return`'${e.replace(/'/g,"'\\''")}'`}var iD,Hl,bb=G(()=>{"use strict";Xg();iD=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;c(aD,"validateRunId");c(cD,"shellSingleQuote");Hl=class{static{c(this,"ClaudeCodeLauncher")}options;tool="claude_code";constructor(t={}){this.options=t}capabilities={headless:!0,interactive:!0,remoteSpawn:!0};async launch(t){let n=sD(),r={...t,runId:aD(t.runId)};return r.mode==="headless"?this.launchHeadless(r,n):this.launchInteractive(r,n)}async launchHeadless(t,n){let r=["-p",t.prompt??"","--output-format","json"];t.systemPrompt&&r.push("--system-prompt",t.systemPrompt),t.model&&r.push("--model",t.model);let o={...process.env};return delete o.CLAUDECODE,delete o.HTTPS_PROXY,t.runId&&(o.RULEMETRIC_RUN_ID=t.runId),new Promise(s=>{let i=Qg("claude",r,{cwd:t.projectPath,env:o,stdio:["ignore","pipe","pipe"]}),a="",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 f=a;try{let _=JSON.parse(a);f=_.result??_.content??a}catch{}s({sessionId:n,pid:i.pid,exitCode:p,output:f,error:p!==0?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??yb)().catch(()=>!1)?this.launchInteractiveTmux(t,n):this.launchInteractiveTerminal(t,n,"tmux_not_found")}async launchInteractiveTmux(t,n){let r=this.options.runTmux??Yg,o=ql(`claude-${t.resumeSessionId??n}`),s=await r(Ul({sessionName:o,projectPath:t.projectPath,resumeSessionId:t.resumeSessionId,model:t.model,runId:t.runId}));if(s.code!==0)return this.launchInteractiveTerminal(t,n,"tmux_launch_failed",`tmux new-session exited ${s.code}: ${s.stderr.trim()||"no stderr"}`);let i=await this.openTerminalAttach(o,n);if(t.prompt){let a=await r(rd(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(rd(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:od(o),live:!0}}}async openTerminalAttach(t,n){let r=Ib(vb(),`rulemetric-attach-${n}.command`),o=`#!/bin/zsh
|
|
44
44
|
rm -- "$0"
|
|
45
|
-
${
|
|
46
|
-
`;return await wb(r,o,{mode:493}),new Promise(s=>{let i=Qg("open",["-a","Terminal",r],{stdio:["ignore","pipe","pipe"]}),a="";i.stderr.on("data",
|
|
45
|
+
${od(t)}
|
|
46
|
+
`;return await wb(r,o,{mode:493}),new Promise(s=>{let i=Qg("open",["-a","Terminal",r],{stdio:["ignore","pipe","pipe"]}),a="";i.stderr.on("data",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=Ib(vb(),`rulemetric-launch-${n}.command`),d=t.runId?`export RULEMETRIC_RUN_ID=${cD(t.runId)}
|
|
47
47
|
`:"",l=`#!/bin/zsh
|
|
48
48
|
rm -- "$0"
|
|
49
49
|
cd ${JSON.stringify(t.projectPath)} || exit
|
|
50
|
-
`+
|
|
51
|
-
`;return await wb(a,l,{mode:493}),new Promise(
|
|
50
|
+
`+d+`${i}
|
|
51
|
+
`;return await wb(a,l,{mode:493}),new Promise(p=>{let f=Qg("open",["-a","Terminal",a],{stdio:["ignore","pipe","pipe"]}),_="";f.stderr.on("data",v=>{_+=v.toString()}),f.on("close",v=>{if(v===0)p({sessionId:n,pid:f.pid,liveSendAvailable:!1,fallbackReason:r,...o?{error:o}:{}});else{let g=_.trim()||"no stderr";p({sessionId:n,pid:f.pid,liveSendAvailable:!1,fallbackReason:r,error:o?`${o}; open exited ${v}: ${g}`:`open exited ${v}: ${g}`})}}),f.on("error",v=>{p({sessionId:n,liveSendAvailable:!1,fallbackReason:r,error:`Failed to spawn open: ${v.message}`})})})}}});import{spawn as Eb}from"node:child_process";import{randomUUID as dD}from"node:crypto";var Bl,Ab=G(()=>{"use strict";Bl=class{static{c(this,"CodexLauncher")}tool="codex";capabilities={headless:!0,interactive:!0,remoteSpawn:!0};async launch(t){let n=dD();return t.mode==="headless"?this.launchHeadless(t,n):this.launchInteractive(t,n)}launchHeadless(t,n){let r=["-q",t.prompt??""];return t.model&&r.push("--model",t.model),new Promise(o=>{let s=Eb("codex",r,{cwd:t.projectPath,stdio:["ignore","pipe","pipe"]}),i="",a="";s.stdout.on("data",l=>{i+=l.toString()}),s.stderr.on("data",l=>{a+=l.toString()});let 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=Eb("osascript",["-e",`tell application "Terminal" to do script ${JSON.stringify(o)}`],{stdio:"ignore",detached:!0});return s.unref(),Promise.resolve({sessionId:n,pid:s.pid})}}});import{spawn as Sb}from"node:child_process";import{randomUUID as uD}from"node:crypto";var Fl,xb=G(()=>{"use strict";Fl=class{static{c(this,"AiderLauncher")}tool="aider";capabilities={headless:!0,interactive:!0,remoteSpawn:!0};async launch(t){let n=uD();return t.mode==="headless"?this.launchHeadless(t,n):this.launchInteractive(t,n)}launchHeadless(t,n){let r=["--message",t.prompt??"","--yes"];return t.model&&r.push("--model",t.model),new Promise(o=>{let s=Sb("aider",r,{cwd:t.projectPath,stdio:["ignore","pipe","pipe"]}),i="",a="";s.stdout.on("data",l=>{i+=l.toString()}),s.stderr.on("data",l=>{a+=l.toString()});let 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=Sb("osascript",["-e",`tell application "Terminal" to do script ${JSON.stringify(o)}`],{stdio:"ignore",detached:!0});return s.unref(),Promise.resolve({sessionId:n,pid:s.pid})}}});import{spawn as lD}from"node:child_process";import{randomUUID as pD}from"node:crypto";var Wl,Tb=G(()=>{"use strict";Wl=class{static{c(this,"GenericLauncher")}tool;constructor(t){this.tool=t}capabilities={headless:!1,interactive:!0,remoteSpawn:!1};async launch(t){let n=pD();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=lD("osascript",["-e",`tell application "Terminal" to do script ${JSON.stringify(r)}`],{stdio:"ignore",detached:!0});return o.unref(),{sessionId:n,pid:o.pid}}}});function kb(e){let t=Rb[e];return t?t():new Wl(e)}function Nb(){return Object.entries(Rb).map(([e,t])=>({tool:e,capabilities:t().capabilities}))}var Rb,jb=G(()=>{"use strict";bb();Ab();xb();Tb();Rb={claude_code:c(()=>new Hl,"claude_code"),codex:c(()=>new Bl,"codex"),aider:c(()=>new Fl,"aider")};c(kb,"getLauncher");c(Nb,"getAvailableLaunchers")});import Pb from"node:path";function Zg(e){return e.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^[-.]+|[-.]+$/g,"")||"worktree"}function zl(e){return Pb.resolve(e.basePath??Pb.join(e.repoRoot,"..",".rulemetric-worktrees",Zg(e.branch)))}var Db=G(()=>{"use strict";c(Zg,"sanitizeBranch");c(zl,"worktreePathFor")});var Ob={};co(Ob,{ClaudeCodeAdapter:()=>Wi,CodexAdapter:()=>Gi,CopilotAgentAdapter:()=>Ji,CursorAdapter:()=>zi,RuleMetricMcpAdapter:()=>Ki,SESSION_EVENT_TYPES:()=>eP,SESSION_TOOLS:()=>Zj,VSCodeCopilotAdapter:()=>Vi,buildTmuxAttachCommand:()=>od,buildTmuxHasSessionArgs:()=>_b,buildTmuxLaunchArgs:()=>Ul,buildTmuxSendKeysArgs:()=>rd,detectTool:()=>nd,discoverAllSessions:()=>fb,freshCodexState:()=>qg,getAdapter:()=>td,getAllProviders:()=>Gg,getAvailableLaunchers:()=>Nb,getLauncher:()=>kb,getProvider:()=>gb,sanitizeBranch:()=>Zg,sanitizeTmuxName:()=>ql,worktreePathFor:()=>zl});var Vl=G(()=>{"use strict";DI();Og();Cg();Lg();Mg();$g();Ug();CI();hb();jb();Db();Xg()});var Bb={};co(Bb,{getSupabaseAdmin:()=>zn});import{createClient as RD}from"@supabase/supabase-js";function zn(){if(Xl)return Xl;let e=process.env.SUPABASE_URL,t=process.env.SUPABASE_SERVICE_ROLE_KEY;if(!e||!t)throw new Error("SUPABASE_URL and SUPABASE_SERVICE_ROLE_KEY are required for admin operations");return Xl=RD(e,t,{auth:{autoRefreshToken:!1,persistSession:!1}}),Xl}var Xl,sd=G(()=>{"use strict";Xl=null;c(zn,"getSupabaseAdmin")});var Vb={};co(Vb,{SNAPSHOT_DELTA_BUCKET:()=>th,decodeDeltaBlob:()=>Fb,encodeDeltaBlob:()=>nh,getDeltaBlob:()=>id,resolveDeltaPage:()=>ad,resolveFullRows:()=>oh,uploadEncodedDelta:()=>rh});import{gzipSync as kD,gunzipSync as ND}from"node:zlib";import{createHash as jD}from"node:crypto";function nh(e){let t=JSON.stringify(e??[]),n=kD(Buffer.from(t,"utf-8")),r=jD("sha256").update(n).digest("hex");return{body:n,ref:`sha256/${r}.json.gz`,bytes:n.byteLength}}function Fb(e){try{let t=ND(Buffer.from(e)).toString("utf-8"),n=JSON.parse(t);return Array.isArray(n)?n:[]}catch{return[]}}async function rh(e){let{body:t,ref:n,bytes:r}=e,{error:o}=await zn().storage.from(th).upload(n,t,{contentType:"application/gzip",upsert:!0});if(o)throw new Error(`uploadEncodedDelta failed for ${n}: ${o.message}`);return{ref:n,bytes:r}}async function id(e){let{data:t,error:n}=await zn().storage.from(th).download(e);if(n||!t)return console.warn(`[storage-blobs] delta.source=storage_miss ref=${e} err=${n?.message??"no data"}`),[];let r=Buffer.from(await t.arrayBuffer());return Fb(r)}function Ql(e){return typeof e.messagesDeltaRef=="string"&&e.messagesDeltaRef.length>0}async function zb(e,t,n){let r=new Array(e.length),o=0,s=c(async()=>{for(;;){let i=o++;if(i>=e.length)return;r[i]=await n(e[i])}},"worker");return await Promise.all(Array.from({length:Math.min(t,e.length)},s)),r}async function ad(e){return e.some(Ql)?zb(e,Wb,async t=>({sequence:t.sequence,messagesDelta:Ql(t)?await id(t.messagesDeltaRef):t.messagesDelta})):e.map(t=>({sequence:t.sequence,messagesDelta:t.messagesDelta}))}async function oh(e){return e.some(Ql)?zb(e,Wb,async t=>Ql(t)?{...t,messagesDelta:await id(t.messagesDeltaRef)}:t):e}var th,Wb,Zl=G(()=>{"use strict";sd();th="snapshot-deltas";c(nh,"encodeDeltaBlob");c(Fb,"decodeDeltaBlob");c(rh,"uploadEncodedDelta");c(id,"getDeltaBlob");Wb=8;c(Ql,"hasRef");c(zb,"mapCapped");c(ad,"resolveDeltaPage");c(oh,"resolveFullRows")});var YA={};co(YA,{resolveRuntimeWebConfig:()=>GA,stampRuntimeConfig:()=>eU});function GA(e=process.env){let t=e.SUPABASE_URL?.trim(),n=e.SUPABASE_ANON_KEY?.trim();return!t||!n?null:{supabaseUrl:t,supabaseAnonKey:n}}function eU(e,t=process.env){let n=GA(t);if(!n)return e;let o=`<script>window.__RM_CONFIG=${JSON.stringify(n).replace(/</g,"\\u003c")}</script>`;return e.includes("</head>")?e.replace("</head>",`${o}
|
|
52
52
|
</head>`):`${o}
|
|
53
|
-
${e}`}var XA=G(()=>{"use strict";c(GA,"resolveRuntimeWebConfig");c(Qq,"stampRuntimeConfig")});import*as sp from"node:fs";import*as ip from"node:path";import{fileURLToPath as jU}from"node:url";import{serve as PU}from"@hono/node-server";import{trace as V_,context as RS}from"@opentelemetry/api";import{NodeSDK as TS}from"@opentelemetry/sdk-node";import{OTLPTraceExporter as kS}from"@opentelemetry/exporter-trace-otlp-http";import{BatchSpanProcessor as NS,ConsoleSpanExporter as jS,SimpleSpanProcessor as PS}from"@opentelemetry/sdk-trace-node";import{Resource as DS}from"@opentelemetry/resources";import{ATTR_SERVICE_NAME as OS,ATTR_SERVICE_VERSION as CS}from"@opentelemetry/semantic-conventions";function z_(e){if(!e)return{};let t={};for(let n of e.split(",")){let r=n.indexOf("=");if(r===-1)continue;let o=n.slice(0,r).trim(),s=n.slice(r+1).trim();o&&(t[o]=s)}return t}c(z_,"parseOtlpHeaders");var Qs=null;function Zs(){return process.env.TELEMETRY_ENABLED!=="false"}c(Zs,"isTelemetryEnabled");function pp(e){if(!Zs()||Qs!==null)return"off";let t=new DS({[OS]:e.serviceName,[CS]:e.serviceVersion??"0.1.0"}),n=process.env.OTEL_EXPORTER_OTLP_ENDPOINT,r,o;if(n){let s=z_(process.env.OTEL_EXPORTER_OTLP_HEADERS),i=new kS({url:`${n}/v1/traces`,headers:s});o=new NS(i),r="otlp"}else if(process.env.OTEL_SPAN_EXPORT==="none")o=void 0,r="silent";else{let s=new jS;o=new PS(s),r="console"}return Qs=new TS({resource:t,spanProcessors:o?[o]:[]}),Qs.start(),r}c(pp,"initTelemetry");async function fp(){Qs&&(await Qs.shutdown(),Qs=null)}c(fp,"shutdownTelemetry");function gp(e){return V_.getTracer(e??"rulemetric")}c(gp,"getTracer");function hp(){return V_.getSpan(RS.active())?.spanContext().traceId}c(hp,"getTraceId");import{SpanKind as LS,SpanStatusCode as J_}from"@opentelemetry/api";function _p(){return async(e,t)=>{if(!Zs()){await t();return}let n=gp(),r=e.req.method,o=e.req.path;await n.startActiveSpan(`${r} ${o}`,{kind:LS.SERVER,attributes:{"http.method":r,"http.url":e.req.url,"http.route":o}},async s=>{try{await t(),s.setAttribute("http.status_code",e.res.status);let i=e.get("userId");i&&s.setAttribute("rulemetric.user_id",i),e.res.status>=400&&s.setStatus({code:J_.ERROR})}catch(i){throw s.setStatus({code:J_.ERROR}),s.recordException(i),i}finally{s.end()}})}}c(_p,"telemetryMiddleware");import{trace as MS,context as $S}from"@opentelemetry/api";function yp(e){let t=MS.getSpan($S.active());if(t)for(let[n,r]of Object.entries(e))t.setAttribute(n,r)}c(yp,"setSpanAttributes");import*as Hr from"@sentry/node";var Ba=!1;function wp(e){if(Ba)return!1;let t=process.env.SENTRY_DSN;return t?(Hr.init({dsn:t,serverName:e.serviceName,environment:process.env.NODE_ENV??"development",tracesSampleRate:0}),Ba=!0,!0):!1}c(wp,"initSentry");function hr(e,t){if(!Ba)return;let n=e instanceof Error?e:new Error(typeof e=="string"?e:JSON.stringify(e));Hr.captureException(n,t)}c(hr,"captureException");function Fa(e){if(Ba){if(e===null){Hr.setUser(null);return}Hr.setUser({id:e})}}c(Fa,"setSentryUser");async function Wa(e){Ba&&await Hr.flush(e)}c(Wa,"flushSentry");import*as Ju from"node:fs";import*as Ca from"node:path";import{fileURLToPath as Zq}from"node:url";import{Hono as eU}from"hono";import{cors as tU}from"hono/cors";import{bodyLimit as nU}from"hono/body-limit";import{serveStatic as rU}from"@hono/node-server/serve-static";D();import{createHash as YT}from"node:crypto";import{createClient as XT}from"@supabase/supabase-js";import{eq as rv,and as QT,isNull as ZT}from"drizzle-orm";import{createHmac as HT,createPublicKey as BT,timingSafeEqual as FT,verify as WT}from"node:crypto";var zT=6e4,Rc=null,Zw=0,xc=null,VT=null;async function JT(){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(JT,"defaultJwksFetcher");async function jf(){return xc||(xc=(async()=>{try{let e=await(VT??JT)(),t=new Map;for(let n of e.keys)if(n.kid)try{t.set(n.kid,BT({key:n,format:"jwk"}))}catch{}Rc=t,Zw=Date.now()}finally{xc=null}})(),xc)}c(jf,"refreshJwks");function Qw(e){try{return JSON.parse(Buffer.from(e,"base64url").toString("utf-8"))}catch{return null}}c(Qw,"decodeB64Json");function KT(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(KT,"checkPayload");function GT(e,t,n,r){let o=HT("sha256",r).update(`${e}.${t}`).digest(),s;try{s=Buffer.from(n,"base64url")}catch{return!1}return s.length!==o.length?!1:FT(s,o)}c(GT,"verifyHs256");async function ev(e){let t=e.split(".");if(t.length!==3)return{ok:!1,reason:"invalid"};let[n,r,o]=t,s=Qw(n);if(!s)return{ok:!1,reason:"invalid"};if(s.alg==="HS256"){let u=process.env.SUPABASE_JWT_SECRET;if(!u)return{ok:!1,reason:"unavailable"};if(!GT(n,r,o,u))return{ok:!1,reason:"invalid"}}else if(s.alg==="ES256"){if(typeof s.kid!="string")return{ok:!1,reason:"invalid"};if(Rc===null)try{await jf()}catch{return{ok:!1,reason:"unavailable"}}let u=Rc?.get(s.kid);if(!u&&Date.now()-Zw>=zT){try{await jf()}catch{return{ok:!1,reason:"unavailable"}}u=Rc?.get(s.kid)}if(!u)return{ok:!1,reason:"invalid"};let l;try{l=Buffer.from(o,"base64url")}catch{return{ok:!1,reason:"invalid"}}if(!WT("sha256",Buffer.from(`${n}.${r}`),{key:u,dsaEncoding:"ieee-p1363"},l))return{ok:!1,reason:"invalid"}}else return{ok:!1,reason:"invalid"};let i=Qw(r);if(!i)return{ok:!1,reason:"invalid"};let a=KT(i);return a?{ok:!0,userId:a.userId,payload:i}:{ok:!1,reason:"invalid"}}c(ev,"verifySupabaseJwt");async function tv(e=3){for(let t=0;t<e;t++)try{return await jf(),Rc!==null}catch{await new Promise(n=>setTimeout(n,500*2**t))}return!1}c(tv,"primeJwks");function ek(e){return YT("sha256").update(e).digest("hex")}c(ek,"hashApiKey");var nv=new Map,tk=300*1e3;function nk(e){let t=Date.now(),n=nv.get(e)??0;t-n<tk||(nv.set(e,t),d.update(Ae).set({lastUsedAt:new Date}).where(rv(Ae.id,e)).then(()=>{}).catch(()=>{}))}c(nk,"updateLastUsed");var rk=60*1e3,ok=5e3,hi=new Map;async function ov(e,t){let n=e.req.header("Authorization");if(!n?.startsWith("Bearer "))return e.json({error:"Missing authorization header"},401);let r=n.slice(7);if(r.startsWith("rm_")){let o=ek(r),s,i=hi.get(o);if(i&&Date.now()-i.cachedAt<rk)s=i;else{i&&hi.delete(o);let[a]=await d.select({id:Ae.id,userId:Ae.userId,expiresAt:Ae.expiresAt}).from(Ae).where(QT(rv(Ae.keyHash,o),ZT(Ae.revokedAt)));if(!a)return e.json({error:"Invalid API key"},401);s={id:a.id,userId:a.userId,expiresAt:a.expiresAt,cachedAt:Date.now()},hi.size>=ok&&hi.clear(),hi.set(o,s)}if(s.expiresAt&&new Date(s.expiresAt)<new Date)return hi.delete(o),e.json({error:"API key expired"},401);e.set("userId",s.userId),Fa(s.userId),nk(s.id),await t();return}try{let o=XT(process.env.SUPABASE_URL,process.env.SUPABASE_ANON_KEY,{global:{headers:{Authorization:`Bearer ${r}`}}}),s=await ev(r);if(s.ok){e.set("userId",s.userId),e.set("supabase",o),Fa(s.userId),await t();return}if(s.reason==="invalid")return console.log(`[auth] local JWT verify FAIL ${e.req.method} ${e.req.path}`),e.json({error:"Invalid token"},401);let i=Date.now(),{data:{user:a},error:u}=await o.auth.getUser();if(console.log(`[auth] getUser ${e.req.method} ${e.req.path} ms=${Date.now()-i} ${u?`err=${u.message}`:`userId=${a?.id??"?"}`}`),u||!a)return e.json({error:"Invalid token"},401);e.set("user",a),e.set("userId",a.id),e.set("supabase",o),Fa(a.id),await t()}catch{return e.json({error:"Authentication failed"},401)}}c(ov,"authMiddleware");D();import{HTTPException as sk}from"hono/http-exception";import{ZodError as ik}from"zod";function ct(e){return e.replace(/[%_\\]/g,"\\$&")}c(ct,"escapeLike");function _i(e){let t=e;return t?.code??t?.cause?.code??t?.errno}c(_i,"transientCode");var ak=new Set(["ECONNRESET","EPIPE","ECONNABORTED"]);function sv(e,t){return e instanceof ik?t.json({error:"Validation error",details:e.flatten().fieldErrors},400):e instanceof sk?e.getResponse():Ac(e)?t.json({error:"Server draining, retry shortly"},503):Sc(e)?(process.env.LOG_LEVEL==="debug"&&console.debug("[req] query deadline exceeded \u2014 DB pool saturated; shed 503"),t.json({error:"Database busy, retry shortly"},503,{"Retry-After":"2"})):e.message==="aborted"||ak.has(_i(e)??"")?(process.env.LOG_LEVEL==="debug"&&console.debug(`[req] client/transient disconnect code=${_i(e)??"aborted"}`),t.body(null,503)):(console.error("Unhandled error:",e),t.json({error:"Internal server error"},500))}c(sv,"errorHandler");function Tc(e,t){let n=new Map;return setInterval(()=>{let r=Date.now();for(let[o,s]of n)r>s.resetAt&&n.delete(o)},6e4).unref(),async(r,o)=>{let i=`${r.req.header("x-forwarded-for")?.split(",")[0]?.trim()??r.req.header("x-real-ip")??"unknown"}:${r.req.path}`,a=Date.now(),u=n.get(i);if((!u||a>u.resetAt)&&(u={count:0,resetAt:a+e},n.set(i,u)),u.count++,r.res.headers.set("X-RateLimit-Limit",String(t)),r.res.headers.set("X-RateLimit-Remaining",String(Math.max(0,t-u.count))),r.res.headers.set("X-RateLimit-Reset",String(Math.ceil(u.resetAt/1e3))),u.count>t)return r.json({error:"Too many requests, please try again later"},429);await o()}}c(Tc,"rateLimit");var Fd=!0,Pf="",iv=0;function Df(e,t="",n=-1){if(e===Fd){!e&&t&&(Pf=t);return}Fd=e,Pf=e?"":t,iv=n,console.log(`[db-readiness] -> ${e?"READY":"NOT READY"}${t?` (${t})`:""}`)}c(Df,"setDbReady");function kc(){return Fd}c(kc,"isDbReady");function Wd(){return{ready:Fd,reason:Pf,changedAt:iv}}c(Wd,"dbReadiness");async function av(e,t){return kc()?t():(e.header("Retry-After","5"),e.json({error:"Service temporarily unavailable: the database is recovering. Retry shortly.",reason:Wd().reason||void 0},503))}c(av,"dbShed");D();var ck=5e3,cv=0;async function uv(e,t){let n=_c(),r=mi();if(n>r){If();let o=Date.now();return o-cv>=ck&&(cv=o,console.warn(`[db_load_shed] shedding: inFlight=${n} > max=${r} path=${e.req.path}`)),e.header("Retry-After","1"),e.json({error:"Service busy: the database is under transient load. Retry shortly.",inFlight:n},503)}return t()}c(uv,"dbLoadShed");D();var uk=5e3,dv=0;async function Nc(e,t){if(e.req.method!=="POST")return t();let n=_c(),r=wc();if(n>=r){yc();let o=Date.now();return o-dv>=uk&&(dv=o,console.warn(`[ingest_load_shed] shedding write: inFlight=${n} >= ingestMax=${r} path=${e.req.path}`)),e.header("Retry-After","2"),e.json({error:"Ingest busy: the database is under transient write load. Retry shortly.",inFlight:n},429)}return t()}c(Nc,"ingestLoadShed");var lv=c(async(e,t)=>{await t(),e.res.headers.set("X-Content-Type-Options","nosniff"),e.res.headers.set("X-Frame-Options","DENY"),e.res.headers.set("X-XSS-Protection","0"),e.res.headers.set("Referrer-Policy","strict-origin-when-cross-origin"),e.res.headers.set("Permissions-Policy","camera=(), microphone=(), geolocation=()")},"securityHeaders");function mv(){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(mv,"slowRequestLog");import{Hono as lk}from"hono";import{z as yo}from"zod";import{createClient as pv}from"@supabase/supabase-js";import{createClient as dk}from"@supabase/supabase-js";async function zd(e){let t=process.env.SUPABASE_URL,n=process.env.SUPABASE_ANON_KEY;if(!t||!n)return{ok:!1,status:500,error:"Server authentication not configured"};let r=dk(t,n,{auth:{persistSession:!1,autoRefreshToken:!1}}),o=`${e.slice(0,6)}\u2026${e.slice(-4)}`,s=Date.now();console.log(`[auth] refreshSession start refresh_token=${o}`);let{data:i,error:a}=await r.auth.refreshSession({refresh_token:e});return a||!i.session?(console.log(`[auth] refreshSession FAIL refresh_token=${o} ms=${Date.now()-s} err=${a?.message??"no-session"}`),{ok:!1,status:401,error:a?.message??"refresh failed"}):(console.log(`[auth] refreshSession OK refresh_token=${o} ms=${Date.now()-s} userId=${i.user?.id??"?"}`),{ok:!0,session:{accessToken:i.session.access_token,refreshToken:i.session.refresh_token,expiresAt:i.session.expires_at?new Date(i.session.expires_at*1e3).toISOString():null,email:i.user?.email??null}})}c(zd,"refreshSupabaseSession");var yi=new lk,mk=yo.object({email:yo.string().email(),password:yo.string().min(1)}),pk=yo.object({refreshToken:yo.string().min(1)});yi.post("/auth/login",async e=>{let t=await e.req.json(),n=mk.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=pv(r,o),i=Date.now();console.log(`[auth] signInWithPassword start email=${n.email} ua="${e.req.header("user-agent")??""}"`);let{data:a,error:u}=await s.auth.signInWithPassword({email:n.email,password:n.password});return u||!a.session?(console.log(`[auth] signInWithPassword FAIL email=${n.email} ms=${Date.now()-i} err=${u?.message??"no-session"}`),e.json({error:"Invalid email or password"},401)):(console.log(`[auth] signInWithPassword OK email=${n.email} ms=${Date.now()-i} userId=${a.user?.id??"?"}`),e.json({accessToken:a.session.access_token,refreshToken:a.session.refresh_token,expiresAt:a.session.expires_at?new Date(a.session.expires_at*1e3).toISOString():null,email:a.user?.email??n.email}))});var fk=yo.object({email:yo.string().email(),password:yo.string().min(8,"Password must be at least 8 characters")});yi.post("/auth/signup",async e=>{let t=await e.req.json(),n=fk.parse(t),r=process.env.SUPABASE_URL,o=process.env.SUPABASE_ANON_KEY;if(!r||!o)return e.json({error:"Server authentication not configured"},500);let s=pv(r,o),i=process.env.WEB_URL??"http://localhost:5174",{data:a,error:u}=await s.auth.signUp({email:n.email,password:n.password,options:{emailRedirectTo:`${i}/auth/confirm`}});if(u){let l=/already registered|already exists|user already/i.test(u.message);return e.json({error:u.message},l?409:400)}return a.user&&(a.user.identities?.length??0)===0&&!a.session?e.json({error:"An account with this email already exists. Run `rulemetric auth login`."},409):a.session?e.json({confirmationRequired:!1,accessToken:a.session.access_token,refreshToken:a.session.refresh_token,expiresAt:a.session.expires_at?new Date(a.session.expires_at*1e3).toISOString():null,email:a.user?.email??n.email}):e.json({confirmationRequired:!0,email:a.user?.email??n.email})});yi.post("/auth/refresh",async e=>{let t=await e.req.json().catch(()=>null),n=pk.safeParse(t);if(!n.success)return e.json({error:"refreshToken is required"},400);let r=await zd(n.data.refreshToken);return r.ok?e.json(r.session):e.json({error:r.error},r.status)});import{readFileSync as gk}from"node:fs";import{dirname as hk,resolve as Of}from"node:path";import{fileURLToPath as _k}from"node:url";import{Hono as yk}from"hono";var wk="https://registry.npmjs.org/-/package/@rulemetric%2Fcli/dist-tags",vk=3600*1e3,Ik=3e3,jc=null;function bk(){if(process.env.RULEMETRIC_BUNDLED_CLI_VERSION)return process.env.RULEMETRIC_BUNDLED_CLI_VERSION;let e=hk(_k(import.meta.url)),t=[Of(e,"../../../cli/package.json"),Of(e,"../../../../apps/cli/package.json"),Of(process.cwd(),"apps/cli/package.json")];for(let n of t)try{let r=JSON.parse(gk(n,"utf-8"));if(r.version)return r.version}catch{}return"0.0.0"}c(bk,"readBundledCliVersion");async function Ek(){try{let e=await fetch(wk,{headers:{accept:"application/json"},signal:AbortSignal.timeout(Ik)});if(!e.ok)return null;let t=await e.json();return typeof t.latest=="string"&&t.latest?t.latest:null}catch{return null}}c(Ek,"fetchLatestFromNpm");async function Ak(){let e=Date.now();if(jc&&e-jc.at<vk)return jc.version;let n=await Ek()??jc?.version??bk();return jc={version:n,at:e},n}c(Ak,"getLatestCliVersion");var Vd=new yk;Vd.get("/cli/latest-version",async e=>e.json({latest:await Ak()}));import{Hono as Mk}from"hono";D();import{sql as Sk}from"drizzle-orm";var xk=12e3,Rk=3e4,fv=4,Tk=Number(process.env.PG_RECYCLE_DEADLINE_THRESHOLD)||3,kk="pipeline:api_db_pool_wedged",Nk="pipeline:api_db_pool_recycled",wi=0;async function Cf(){return Tf(xk)}c(Cf,"probeDb");function jk(e){let t=[],n=[],r=e;for(let o=0;r&&o<8;o++){let s=r;typeof s.code=="string"&&t.push(s.code),typeof s.message=="string"&&n.push(s.message),r=s.cause}return{codes:t,message:n.join(" ").toLowerCase()}}c(jk,"flattenCauseChain");function Pk(e){let{codes:t,message:n}=jk(e);return n.includes("max client")||n.includes("emaxconn")||n.includes("max_client_conn")||t.includes("XX000")&&n.includes("client")}c(Pk,"isPoolSaturation");function Dk(e){return Pk(e)?"Supavisor tenant saturated (client cap reached)":gi(e)?"transient connect failure":"DB unreachable / probe timed out"}c(Dk,"classifyProbeFailure");async function Ok(e=Cf,t={}){let n=t.consumeDeadlines??bf,r=t.recycle??Rf,o=t.onRecycle??Lk,s=await e();if(s.ok){let a=!kc();wi>0&&console.log(`[db-wedge] DB reachable again after ${wi} failed probe(s)`),wi=0,Df(!0,"",Date.now()),a&&Ck();let u=n();u>=Tk&&(console.error(`[db-wedge] recycling the MAIN pool: ${u} client-side query-deadline(s) while a fresh dedicated probe is healthy \u2014 the pool is holding black-holed sockets a restart is not needed to clear.`),Promise.resolve().then(()=>r()).catch(l=>console.error("[db-wedge] pool recycle failed:",l instanceof Error?l.message:l)),o(u));return}wi+=1;let i=Dk(s.err);console.error(`[db-wedge] dedicated DB probe failed (${wi}/${fv}) \u2014 ${i}`),wi>=fv&&kc()&&(Df(!1,`DB unreachable from a dedicated connection \u2014 ${i}`,Date.now()),console.error("[db-wedge] marking API NOT READY (shedding DB traffic). NOT restarting: a process restart cannot free a shared Supavisor pooler. Readiness restores automatically on the next OK probe."))}c(Ok,"watchdogTick");async function gv(e,t){try{await d.execute(Sk`
|
|
53
|
+
${e}`}var XA=G(()=>{"use strict";c(GA,"resolveRuntimeWebConfig");c(eU,"stampRuntimeConfig")});import*as sm from"node:fs";import*as im from"node:path";import{fileURLToPath as DU}from"node:url";import{serve as OU}from"@hono/node-server";import{trace as V_,context as TS}from"@opentelemetry/api";import{NodeSDK as RS}from"@opentelemetry/sdk-node";import{OTLPTraceExporter as kS}from"@opentelemetry/exporter-trace-otlp-http";import{BatchSpanProcessor as NS,ConsoleSpanExporter as jS,SimpleSpanProcessor as PS}from"@opentelemetry/sdk-trace-node";import{Resource as DS}from"@opentelemetry/resources";import{ATTR_SERVICE_NAME as OS,ATTR_SERVICE_VERSION as CS}from"@opentelemetry/semantic-conventions";function z_(e){if(!e)return{};let t={};for(let n of e.split(",")){let r=n.indexOf("=");if(r===-1)continue;let o=n.slice(0,r).trim(),s=n.slice(r+1).trim();o&&(t[o]=s)}return t}c(z_,"parseOtlpHeaders");var Qs=null;function Zs(){return process.env.TELEMETRY_ENABLED!=="false"}c(Zs,"isTelemetryEnabled");function mm(e){if(!Zs()||Qs!==null)return"off";let t=new DS({[OS]:e.serviceName,[CS]:e.serviceVersion??"0.1.0"}),n=process.env.OTEL_EXPORTER_OTLP_ENDPOINT,r,o;if(n){let s=z_(process.env.OTEL_EXPORTER_OTLP_HEADERS),i=new kS({url:`${n}/v1/traces`,headers:s});o=new NS(i),r="otlp"}else if(process.env.OTEL_SPAN_EXPORT==="none")o=void 0,r="silent";else{let s=new jS;o=new PS(s),r="console"}return Qs=new RS({resource:t,spanProcessors:o?[o]:[]}),Qs.start(),r}c(mm,"initTelemetry");async function fm(){Qs&&(await Qs.shutdown(),Qs=null)}c(fm,"shutdownTelemetry");function gm(e){return V_.getTracer(e??"rulemetric")}c(gm,"getTracer");function hm(){return V_.getSpan(TS.active())?.spanContext().traceId}c(hm,"getTraceId");import{SpanKind as LS,SpanStatusCode as J_}from"@opentelemetry/api";function _m(){return async(e,t)=>{if(!Zs()){await t();return}let n=gm(),r=e.req.method,o=e.req.path;await n.startActiveSpan(`${r} ${o}`,{kind:LS.SERVER,attributes:{"http.method":r,"http.url":e.req.url,"http.route":o}},async s=>{try{await t(),s.setAttribute("http.status_code",e.res.status);let i=e.get("userId");i&&s.setAttribute("rulemetric.user_id",i),e.res.status>=400&&s.setStatus({code:J_.ERROR})}catch(i){throw s.setStatus({code:J_.ERROR}),s.recordException(i),i}finally{s.end()}})}}c(_m,"telemetryMiddleware");import{trace as MS,context as $S}from"@opentelemetry/api";function ym(e){let t=MS.getSpan($S.active());if(t)for(let[n,r]of Object.entries(e))t.setAttribute(n,r)}c(ym,"setSpanAttributes");import*as Hr from"@sentry/node";var Ba=!1;function wm(e){if(Ba)return!1;let t=process.env.SENTRY_DSN;return t?(Hr.init({dsn:t,serverName:e.serviceName,environment:process.env.NODE_ENV??"development",tracesSampleRate:0}),Ba=!0,!0):!1}c(wm,"initSentry");function hr(e,t){if(!Ba)return;let n=e instanceof Error?e:new Error(typeof e=="string"?e:JSON.stringify(e));Hr.captureException(n,t)}c(hr,"captureException");function Fa(e){if(Ba){if(e===null){Hr.setUser(null);return}Hr.setUser({id:e})}}c(Fa,"setSentryUser");async function Wa(e){Ba&&await Hr.flush(e)}c(Wa,"flushSentry");import*as Kd from"node:fs";import*as Ca from"node:path";import{fileURLToPath as tU}from"node:url";import{Hono as nU}from"hono";import{cors as rU}from"hono/cors";import{bodyLimit as oU}from"hono/body-limit";import{serveStatic as sU}from"@hono/node-server/serve-static";D();import{createHash as YR}from"node:crypto";import{createClient as XR}from"@supabase/supabase-js";import{eq as rv,and as QR,isNull as ZR}from"drizzle-orm";import{createHmac as HR,createPublicKey as BR,timingSafeEqual as FR,verify as WR}from"node:crypto";var zR=6e4,Tc=null,Zw=0,xc=null,VR=null;async function JR(){let e=process.env.SUPABASE_URL;if(!e)throw new Error("SUPABASE_URL not set");let t=await fetch(`${e}/auth/v1/.well-known/jwks.json`,{signal:AbortSignal.timeout(5e3)});if(!t.ok)throw new Error(`JWKS fetch failed: ${t.status}`);return await t.json()}c(JR,"defaultJwksFetcher");async function jf(){return xc||(xc=(async()=>{try{let e=await(VR??JR)(),t=new Map;for(let n of e.keys)if(n.kid)try{t.set(n.kid,BR({key:n,format:"jwk"}))}catch{}Tc=t,Zw=Date.now()}finally{xc=null}})(),xc)}c(jf,"refreshJwks");function Qw(e){try{return JSON.parse(Buffer.from(e,"base64url").toString("utf-8"))}catch{return null}}c(Qw,"decodeB64Json");function KR(e){if(typeof e.exp=="number"&&e.exp*1e3<Date.now()||typeof e.sub!="string"||e.sub.length===0)return null;let t=e.aud;return t==="authenticated"||Array.isArray(t)&&t.includes("authenticated")?{userId:e.sub}:null}c(KR,"checkPayload");function GR(e,t,n,r){let o=HR("sha256",r).update(`${e}.${t}`).digest(),s;try{s=Buffer.from(n,"base64url")}catch{return!1}return s.length!==o.length?!1:FR(s,o)}c(GR,"verifyHs256");async function ev(e){let t=e.split(".");if(t.length!==3)return{ok:!1,reason:"invalid"};let[n,r,o]=t,s=Qw(n);if(!s)return{ok:!1,reason:"invalid"};if(s.alg==="HS256"){let d=process.env.SUPABASE_JWT_SECRET;if(!d)return{ok:!1,reason:"unavailable"};if(!GR(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(Tc===null)try{await jf()}catch{return{ok:!1,reason:"unavailable"}}let d=Tc?.get(s.kid);if(!d&&Date.now()-Zw>=zR){try{await jf()}catch{return{ok:!1,reason:"unavailable"}}d=Tc?.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(!WR("sha256",Buffer.from(`${n}.${r}`),{key:d,dsaEncoding:"ieee-p1363"},l))return{ok:!1,reason:"invalid"}}else return{ok:!1,reason:"invalid"};let i=Qw(r);if(!i)return{ok:!1,reason:"invalid"};let a=KR(i);return a?{ok:!0,userId:a.userId,payload:i}:{ok:!1,reason:"invalid"}}c(ev,"verifySupabaseJwt");async function tv(e=3){for(let t=0;t<e;t++)try{return await jf(),Tc!==null}catch{await new Promise(n=>setTimeout(n,500*2**t))}return!1}c(tv,"primeJwks");function ek(e){return YR("sha256").update(e).digest("hex")}c(ek,"hashApiKey");var nv=new Map,tk=300*1e3;function nk(e){let t=Date.now(),n=nv.get(e)??0;t-n<tk||(nv.set(e,t),u.update(Ae).set({lastUsedAt:new Date}).where(rv(Ae.id,e)).then(()=>{}).catch(()=>{}))}c(nk,"updateLastUsed");var rk=60*1e3,ok=5e3,hi=new Map;async function ov(e,t){let n=e.req.header("Authorization");if(!n?.startsWith("Bearer "))return e.json({error:"Missing authorization header"},401);let r=n.slice(7);if(r.startsWith("rm_")){let o=ek(r),s,i=hi.get(o);if(i&&Date.now()-i.cachedAt<rk)s=i;else{i&&hi.delete(o);let[a]=await u.select({id:Ae.id,userId:Ae.userId,expiresAt:Ae.expiresAt}).from(Ae).where(QR(rv(Ae.keyHash,o),ZR(Ae.revokedAt)));if(!a)return e.json({error:"Invalid API key"},401);s={id:a.id,userId:a.userId,expiresAt:a.expiresAt,cachedAt:Date.now()},hi.size>=ok&&hi.clear(),hi.set(o,s)}if(s.expiresAt&&new Date(s.expiresAt)<new Date)return hi.delete(o),e.json({error:"API key expired"},401);e.set("userId",s.userId),Fa(s.userId),nk(s.id),await t();return}try{let o=XR(process.env.SUPABASE_URL,process.env.SUPABASE_ANON_KEY,{global:{headers:{Authorization:`Bearer ${r}`}}}),s=await ev(r);if(s.ok){e.set("userId",s.userId),e.set("supabase",o),Fa(s.userId),await t();return}if(s.reason==="invalid")return console.log(`[auth] local JWT verify FAIL ${e.req.method} ${e.req.path}`),e.json({error:"Invalid token"},401);let i=Date.now(),{data:{user:a},error:d}=await o.auth.getUser();if(console.log(`[auth] getUser ${e.req.method} ${e.req.path} ms=${Date.now()-i} ${d?`err=${d.message}`:`userId=${a?.id??"?"}`}`),d||!a)return e.json({error:"Invalid token"},401);e.set("user",a),e.set("userId",a.id),e.set("supabase",o),Fa(a.id),await t()}catch{return e.json({error:"Authentication failed"},401)}}c(ov,"authMiddleware");D();import{HTTPException as sk}from"hono/http-exception";import{ZodError as ik}from"zod";function ct(e){return e.replace(/[%_\\]/g,"\\$&")}c(ct,"escapeLike");function _i(e){let t=e;return t?.code??t?.cause?.code??t?.errno}c(_i,"transientCode");var ak=new Set(["ECONNRESET","EPIPE","ECONNABORTED"]);function sv(e,t){return e instanceof ik?t.json({error:"Validation error",details:e.flatten().fieldErrors},400):e instanceof sk?e.getResponse():Ac(e)?t.json({error:"Server draining, retry shortly"},503):Sc(e)?(process.env.LOG_LEVEL==="debug"&&console.debug("[req] query deadline exceeded \u2014 DB pool saturated; shed 503"),t.json({error:"Database busy, retry shortly"},503,{"Retry-After":"2"})):e.message==="aborted"||ak.has(_i(e)??"")?(process.env.LOG_LEVEL==="debug"&&console.debug(`[req] client/transient disconnect code=${_i(e)??"aborted"}`),t.body(null,503)):(console.error("Unhandled error:",e),t.json({error:"Internal server error"},500))}c(sv,"errorHandler");function Rc(e,t){let n=new Map;return setInterval(()=>{let r=Date.now();for(let[o,s]of n)r>s.resetAt&&n.delete(o)},6e4).unref(),async(r,o)=>{let i=`${r.req.header("x-forwarded-for")?.split(",")[0]?.trim()??r.req.header("x-real-ip")??"unknown"}:${r.req.path}`,a=Date.now(),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(Rc,"rateLimit");var Wu=!0,Pf="",iv=0;function Df(e,t="",n=-1){if(e===Wu){!e&&t&&(Pf=t);return}Wu=e,Pf=e?"":t,iv=n,console.log(`[db-readiness] -> ${e?"READY":"NOT READY"}${t?` (${t})`:""}`)}c(Df,"setDbReady");function kc(){return Wu}c(kc,"isDbReady");function zu(){return{ready:Wu,reason:Pf,changedAt:iv}}c(zu,"dbReadiness");async function av(e,t){return kc()?t():(e.header("Retry-After","5"),e.json({error:"Service temporarily unavailable: the database is recovering. Retry shortly.",reason:zu().reason||void 0},503))}c(av,"dbShed");D();var ck=5e3,cv=0;async function dv(e,t){let n=_c(),r=pi();if(n>r){If();let o=Date.now();return o-cv>=ck&&(cv=o,console.warn(`[db_load_shed] shedding: inFlight=${n} > max=${r} path=${e.req.path}`)),e.header("Retry-After","1"),e.json({error:"Service busy: the database is under transient load. Retry shortly.",inFlight:n},503)}return t()}c(dv,"dbLoadShed");D();var dk=5e3,uv=0;async function Nc(e,t){if(e.req.method!=="POST")return t();let n=_c(),r=wc();if(n>=r){yc();let o=Date.now();return o-uv>=dk&&(uv=o,console.warn(`[ingest_load_shed] shedding write: inFlight=${n} >= ingestMax=${r} path=${e.req.path}`)),e.header("Retry-After","2"),e.json({error:"Ingest busy: the database is under transient write load. Retry shortly.",inFlight:n},429)}return t()}c(Nc,"ingestLoadShed");var lv=c(async(e,t)=>{await t(),e.res.headers.set("X-Content-Type-Options","nosniff"),e.res.headers.set("X-Frame-Options","DENY"),e.res.headers.set("X-XSS-Protection","0"),e.res.headers.set("Referrer-Policy","strict-origin-when-cross-origin"),e.res.headers.set("Permissions-Policy","camera=(), microphone=(), geolocation=()")},"securityHeaders");function pv(){return async(e,t)=>{let n=Date.now();try{await t()}finally{let r=Date.now()-n,o=Number(process.env.SLOW_REQUEST_LOG_MS)||2e3,s=Number(process.env.SLOW_REQUEST_MAX_MS)||12e4;if(r>s||r<o&&e.res.status<500)return;let i=new URL(e.req.url).pathname,a=e.get("userId");console.warn(`[http] slow_or_error method=${e.req.method} path=${i} status=${e.res.status} ms=${r}${a?` user=${a}`:""}`)}}}c(pv,"slowRequestLog");import{Hono as lk}from"hono";import{z as yo}from"zod";import{createClient as mv}from"@supabase/supabase-js";import{createClient as uk}from"@supabase/supabase-js";async function Vu(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=uk(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(Vu,"refreshSupabaseSession");var yi=new lk,pk=yo.object({email:yo.string().email(),password:yo.string().min(1)}),mk=yo.object({refreshToken:yo.string().min(1)});yi.post("/auth/login",async e=>{let t=await e.req.json(),n=pk.parse(t),r=process.env.SUPABASE_URL,o=process.env.SUPABASE_ANON_KEY;if(!r||!o)return e.json({error:"Server authentication not configured"},500);let s=mv(r,o),i=Date.now();console.log(`[auth] signInWithPassword start email=${n.email} ua="${e.req.header("user-agent")??""}"`);let{data:a,error: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 fk=yo.object({email:yo.string().email(),password:yo.string().min(8,"Password must be at least 8 characters")});yi.post("/auth/signup",async e=>{let t=await e.req.json(),n=fk.parse(t),r=process.env.SUPABASE_URL,o=process.env.SUPABASE_ANON_KEY;if(!r||!o)return e.json({error:"Server authentication not configured"},500);let s=mv(r,o),i=process.env.WEB_URL??"http://localhost:5174",{data:a,error: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})});yi.post("/auth/refresh",async e=>{let t=await e.req.json().catch(()=>null),n=mk.safeParse(t);if(!n.success)return e.json({error:"refreshToken is required"},400);let r=await Vu(n.data.refreshToken);return r.ok?e.json(r.session):e.json({error:r.error},r.status)});import{readFileSync as gk}from"node:fs";import{dirname as hk,resolve as Of}from"node:path";import{fileURLToPath as _k}from"node:url";import{Hono as yk}from"hono";var wk="https://registry.npmjs.org/-/package/@rulemetric%2Fcli/dist-tags",vk=3600*1e3,Ik=3e3,jc=null;function bk(){if(process.env.RULEMETRIC_BUNDLED_CLI_VERSION)return process.env.RULEMETRIC_BUNDLED_CLI_VERSION;let e=hk(_k(import.meta.url)),t=[Of(e,"../../../cli/package.json"),Of(e,"../../../../apps/cli/package.json"),Of(process.cwd(),"apps/cli/package.json")];for(let n of t)try{let r=JSON.parse(gk(n,"utf-8"));if(r.version)return r.version}catch{}return"0.0.0"}c(bk,"readBundledCliVersion");async function Ek(){try{let e=await fetch(wk,{headers:{accept:"application/json"},signal:AbortSignal.timeout(Ik)});if(!e.ok)return null;let t=await e.json();return typeof t.latest=="string"&&t.latest?t.latest:null}catch{return null}}c(Ek,"fetchLatestFromNpm");async function Ak(){let e=Date.now();if(jc&&e-jc.at<vk)return jc.version;let n=await Ek()??jc?.version??bk();return jc={version:n,at:e},n}c(Ak,"getLatestCliVersion");var Ju=new yk;Ju.get("/cli/latest-version",async e=>e.json({latest:await Ak()}));import{Hono as Mk}from"hono";D();import{sql as Sk}from"drizzle-orm";var xk=12e3,Tk=3e4,fv=4,Rk=Number(process.env.PG_RECYCLE_DEADLINE_THRESHOLD)||3,kk="pipeline:api_db_pool_wedged",Nk="pipeline:api_db_pool_recycled",wi=0;async function Cf(){return Rf(xk)}c(Cf,"probeDb");function jk(e){let t=[],n=[],r=e;for(let o=0;r&&o<8;o++){let s=r;typeof s.code=="string"&&t.push(s.code),typeof s.message=="string"&&n.push(s.message),r=s.cause}return{codes:t,message:n.join(" ").toLowerCase()}}c(jk,"flattenCauseChain");function Pk(e){let{codes:t,message:n}=jk(e);return n.includes("max client")||n.includes("emaxconn")||n.includes("max_client_conn")||t.includes("XX000")&&n.includes("client")}c(Pk,"isPoolSaturation");function Dk(e){return Pk(e)?"Supavisor tenant saturated (client cap reached)":gi(e)?"transient connect failure":"DB unreachable / probe timed out"}c(Dk,"classifyProbeFailure");async function Ok(e=Cf,t={}){let n=t.consumeDeadlines??bf,r=t.recycle??Tf,o=t.onRecycle??Lk,s=await e();if(s.ok){let a=!kc();wi>0&&console.log(`[db-wedge] DB reachable again after ${wi} failed probe(s)`),wi=0,Df(!0,"",Date.now()),a&&Ck();let d=n();d>=Rk&&(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}wi+=1;let i=Dk(s.err);console.error(`[db-wedge] dedicated DB probe failed (${wi}/${fv}) \u2014 ${i}`),wi>=fv&&kc()&&(Df(!1,`DB unreachable from a dedicated connection \u2014 ${i}`,Date.now()),console.error("[db-wedge] marking API NOT READY (shedding DB traffic). NOT restarting: a process restart cannot free a shared Supavisor pooler. Readiness restores automatically on the next OK probe."))}c(Ok,"watchdogTick");async function gv(e,t){try{await u.execute(Sk`
|
|
54
54
|
INSERT INTO alert_dispatches (user_id, alert_key, severity, channel, last_state)
|
|
55
55
|
SELECT DISTINCT user_id, ${e}, 'soft', 'in_app',
|
|
56
56
|
jsonb_build_object('message', ${t})
|
|
57
57
|
FROM sessions
|
|
58
58
|
WHERE created_at > now() - interval '7 days' AND user_id IS NOT NULL
|
|
59
|
-
`)}catch(n){console.error(`[db-wedge] failed to record ${e} alert:`,n instanceof Error?n.message:n)}}c(gv,"dispatchSoftAlert");async function Ck(){await gv(kk,'The API database pool was briefly unreachable and shed traffic; it has recovered. Sessions and other pages may have shown 503s during that window. If this recurs, run "bash scripts/dev/debug-loop.sh".')}c(Ck,"reportRecovery");async function Lk(e){try{hr(new Error(`[db-wedge] auto-recycled the main DB pool after ${e} client-side query-deadline(s) with a healthy probe \u2014 black-holed pooler sockets, no restart needed.`),{tags:{source:"db-wedge",action:"pool_recycle"},extra:{deadlines:e}})}catch{}await gv(Nk,'The API database pool held stale connections after a network interruption and was automatically recycled \u2014 no restart needed. A few requests may have shown 503s briefly. If this recurs often, run "bash scripts/dev/debug-loop.sh".')}c(Lk,"reportPoolRecycle");function hv(){let e=setInterval(()=>{Ok().catch(()=>{})},
|
|
60
|
-
`)){let o=r.match(/->([\d.]+|\[[^\]]+\]):(?:6543|5432)\b/);o&&n.push({remote:o[1].replace(/^\[|\]$/g,"")})}return n}catch{return[]}}c(Bk,"snapshotPoolerSockets");
|
|
59
|
+
`)}catch(n){console.error(`[db-wedge] failed to record ${e} alert:`,n instanceof Error?n.message:n)}}c(gv,"dispatchSoftAlert");async function Ck(){await gv(kk,'The API database pool was briefly unreachable and shed traffic; it has recovered. Sessions and other pages may have shown 503s during that window. If this recurs, run "bash scripts/dev/debug-loop.sh".')}c(Ck,"reportRecovery");async function Lk(e){try{hr(new Error(`[db-wedge] auto-recycled the main DB pool after ${e} client-side query-deadline(s) with a healthy probe \u2014 black-holed pooler sockets, no restart needed.`),{tags:{source:"db-wedge",action:"pool_recycle"},extra:{deadlines:e}})}catch{}await gv(Nk,'The API database pool held stale connections after a network interruption and was automatically recycled \u2014 no restart needed. A few requests may have shown 503s briefly. If this recurs often, run "bash scripts/dev/debug-loop.sh".')}c(Lk,"reportPoolRecycle");function hv(){let e=setInterval(()=>{Ok().catch(()=>{})},Tk);return{stop:c(()=>clearInterval(e),"stop")}}c(hv,"startDbWedgeWatchdog");var vi=new Mk;vi.get("/health",e=>e.json({status:"ok"}));vi.get("/ready",e=>{let t=zu();return e.json({ready:t.ready,reason:t.reason||void 0},t.ready?200:503)});vi.get("/health/deep",async e=>{let t=await Cf();return e.json({status:t.ok?"ok":"degraded",db:t.ok?"ok":"wedged",dbProbeMs:t.ms},t.ok?200:503)});D();import{Hono as $k}from"hono";import{sql as qk}from"drizzle-orm";import{execFileSync as Uk}from"node:child_process";import*as _v from"node:fs";var Ku=new $k,Hk=["/usr/sbin/lsof","/usr/bin/lsof","/bin/lsof"].find(e=>_v.existsSync(e))??"lsof";function Bk(e=process.pid){try{let t=Uk(Hk,["-a","-p",String(e),"-i","TCP","-P","-n"],{encoding:"utf8",timeout:3e3}),n=[];for(let r of t.split(`
|
|
60
|
+
`)){let o=r.match(/->([\d.]+|\[[^\]]+\]):(?:6543|5432)\b/);o&&n.push({remote:o[1].replace(/^\[|\]$/g,"")})}return n}catch{return[]}}c(Bk,"snapshotPoolerSockets");Ku.get("/diag/pg-health",async e=>{let t=await u.execute(qk`
|
|
61
61
|
SELECT
|
|
62
62
|
application_name,
|
|
63
63
|
client_addr::text AS client_addr,
|
|
@@ -69,12 +69,12 @@ ${e}`}var XA=G(()=>{"use strict";c(GA,"resolveRuntimeWebConfig");c(Qq,"stampRunt
|
|
|
69
69
|
WHERE datname = current_database()
|
|
70
70
|
GROUP BY application_name, client_addr, state
|
|
71
71
|
ORDER BY conns DESC
|
|
72
|
-
`),n=t.reduce((s,i)=>s+i.conns,0),r=Bk(),o={};for(let s of r)o[s.remote]=(o[s.remote]??0)+1;return e.json({sampled_at:new Date().toISOString(),self:{process:process.env.PG_APPLICATION_NAME??"rulemetric",pid:process.pid,pool_max:Number(process.env.PG_POOL_MAX)||3,pooler_sockets:r.length,pooler_sockets_by_node:o,...(()=>{let s=Ef();return{inflight_current:s.current,inflight_peak:s.peak,inflight_shed_count:s.shedCount,inflight_max:
|
|
73
|
-
`)[0]?.replace(/^#+\s*/,"").trim()||"Suggested instruction").slice(0,120)}c(Fk,"recommendationTitle");function Wk(e){if(!e||typeof e!="object")return e;let t=e;if(Array.isArray(t.recommendation_candidates))return e;let n=t.suggestions;if(!n||typeof n!="object")return e;let r=n.claude_md_additions;return Array.isArray(r)&&(t.recommendation_candidates=r.flatMap(o=>{if(!o||typeof o!="object")return[];let s=o;if(typeof s.addition!="string"||s.addition.trim()==="")return[];let i=s.addition.trim();return[{title:Fk(i),artifact:"instruction",canonicalBody:i,rationale:typeof s.why=="string"?s.why:"",evidence:[],outcomeMetric:"session_outcome",renderings:[{harness:"claude_code",target:"CLAUDE.md",body:i},{harness:"codex",target:"AGENTS.md",body:i}]}]})),e}c(Wk,"normalizeRecommendationCandidates");function $f(e){if(!e||typeof e!="object")return e;let t=e,n=t.project_areas;if(n!==void 0&&!Array.isArray(n)){let r=n&&typeof n=="object"?n.areas:void 0;t.project_areas=Array.isArray(r)?r:void 0}return Wk(e),e}c($f,"normalizeRecommendations");
|
|
72
|
+
`),n=t.reduce((s,i)=>s+i.conns,0),r=Bk(),o={};for(let s of r)o[s.remote]=(o[s.remote]??0)+1;return e.json({sampled_at:new Date().toISOString(),self:{process:process.env.PG_APPLICATION_NAME??"rulemetric",pid:process.pid,pool_max:Number(process.env.PG_POOL_MAX)||3,pooler_sockets:r.length,pooler_sockets_by_node:o,...(()=>{let s=Ef();return{inflight_current:s.current,inflight_peak:s.peak,inflight_shed_count:s.shedCount,inflight_max:pi(),ingest_inflight_max:wc(),ingest_shed_count:s.ingestShedCount}})()},total_backends:n,breakdown:t})});D();import{Hono as cN}from"hono";import{z as mt}from"zod";import{eq as qe,and as br,sql as bi,ilike as Yf,isNull as dN,or as Xf,desc as kv,inArray as Rv}from"drizzle-orm";import{z as tn}from"zod";var yv=["org","team","project","personal"],Lf=tn.object({name:tn.string().min(1),description:tn.string().min(1),type:tn.literal("instruction").default("instruction"),scope:tn.enum(yv),version:tn.string().min(1),tags:tn.array(tn.string()).optional(),compatibility:tn.array(tn.string()).optional(),slots:tn.record(tn.string(),tn.string()).optional(),metadata:tn.record(tn.string(),tn.unknown()).optional()});import{z as Un}from"zod";var wv=Un.object({name:Un.string().min(1),description:Un.string().min(1),type:Un.literal("prompt"),version:Un.string().min(1),tags:Un.array(Un.string()).optional(),variables:Un.array(Un.string()).optional(),metadata:Un.record(Un.string(),Un.unknown()).optional()});function Pc(e){return e<=3?"light":e<=8?"standard":"heavy"}c(Pc,"computePackTier");var Gu={claude_md:"claude_md",memory:"memory",skill_loaded:"skill"};function Mf(e,t){let n=Gu[e];return n?`${n}::${t}`:null}c(Mf,"deriveContextIdentity");function Fk(e){return(e.trim().split(`
|
|
73
|
+
`)[0]?.replace(/^#+\s*/,"").trim()||"Suggested instruction").slice(0,120)}c(Fk,"recommendationTitle");function Wk(e){if(!e||typeof e!="object")return e;let t=e;if(Array.isArray(t.recommendation_candidates))return e;let n=t.suggestions;if(!n||typeof n!="object")return e;let r=n.claude_md_additions;return Array.isArray(r)&&(t.recommendation_candidates=r.flatMap(o=>{if(!o||typeof o!="object")return[];let s=o;if(typeof s.addition!="string"||s.addition.trim()==="")return[];let i=s.addition.trim();return[{title:Fk(i),artifact:"instruction",canonicalBody:i,rationale:typeof s.why=="string"?s.why:"",evidence:[],outcomeMetric:"session_outcome",renderings:[{harness:"claude_code",target:"CLAUDE.md",body:i},{harness:"codex",target:"AGENTS.md",body:i}]}]})),e}c(Wk,"normalizeRecommendationCandidates");function $f(e){if(!e||typeof e!="object")return e;let t=e,n=t.project_areas;if(n!==void 0&&!Array.isArray(n)){let r=n&&typeof n=="object"?n.areas:void 0;t.project_areas=Array.isArray(r)?r:void 0}return zk(e),Wk(e),e}c($f,"normalizeRecommendations");function zk(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(zk,"liftNestedCandidates");import Vk from"gray-matter";import{z as vv}from"zod";var z2=vv.object({type:vv.enum(["instruction","prompt"])});function Yu(e){let{data:t,content:n}=Vk(e),r=Lf.parse(t),o=r.slots??null;return{frontmatter:r,content:n.trim(),slots:o}}c(Yu,"parseInstruction");function Ii(e){return e.replace(/[\r\n]+/g," ").trim()}c(Ii,"sanitizeHeading");function qf(e,t,n){let r=e.split(`
|
|
74
74
|
`),o=t.split(`
|
|
75
75
|
`),s=n.split(`
|
|
76
|
-
`),i=Iv(r,o),a=Iv(r,s),
|
|
77
|
-
`),hasConflicts:
|
|
76
|
+
`),i=Iv(r,o),a=Iv(r,s),d=[],l=[],p=0;for(;p<r.length||i.has(p)||a.has(p);){let f=i.get(p),_=a.get(p);if(f&&_)Kk(f.newLines,_.newLines)?l.push(...f.newLines):(d.push({localLines:_.newLines,upstreamLines:f.newLines,startLine:p}),l.push("<<<<<<< local"),l.push(..._.newLines),l.push("======="),l.push(...f.newLines),l.push(">>>>>>> upstream")),i.delete(p),a.delete(p),p=Math.max(f.endBase,_.endBase);else if(f)l.push(...f.newLines),i.delete(p),p=f.endBase;else if(_)l.push(..._.newLines),a.delete(p),p=_.endBase;else if(p<r.length)l.push(r[p]),p++;else break}return{merged:l.join(`
|
|
77
|
+
`),hasConflicts:d.length>0,conflicts:d}}c(qf,"threeWayMerge");function Iv(e,t){let n=new Map,r=Jk(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(Iv,"diffLines");function Jk(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(Jk,"computeLCS");function Kk(e,t){return e.length===t.length&&e.every((n,r)=>n===t[r])}c(Kk,"arraysEqual");var Xu=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 Qu=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 Gk={anthropic:c(e=>new Xu(e),"anthropic"),openai:c(e=>new Qu(e),"openai")};function Dc(e,t){let n=Gk[e];if(!n)throw new Error(`Unknown LLM provider: ${e}`);return n(t)}c(Dc,"createLLMProvider");function Oc(e,t){let n=t.map(r=>`- ID: ${r.id}
|
|
78
78
|
Name: ${r.name}
|
|
79
79
|
Description: ${r.description}
|
|
80
80
|
Tags: ${r.tags.join(", ")}
|
|
@@ -107,14 +107,14 @@ Return your response as JSON in this exact format:
|
|
|
107
107
|
]
|
|
108
108
|
}
|
|
109
109
|
|
|
110
|
-
Only include instructions with a relevance score >= 0.5. Order by score descending. Return valid JSON only, no markdown fences.`}c(Oc,"buildRecommendationPrompt");function Uf(e){try{let t=e.match(/\{[\s\S]*\}/);if(!t)return[];let n=JSON.parse(t[0]);return!n.recommendations||!Array.isArray(n.recommendations)?[]:n.recommendations.filter(r=>typeof r.instructionId=="string"&&typeof r.score=="number"&&typeof r.reason=="string")}catch{return[]}}c(Uf,"parseRecommendationResponse");var bv=32e3,
|
|
110
|
+
Only include instructions with a relevance score >= 0.5. Order by score descending. Return valid JSON only, no markdown fences.`}c(Oc,"buildRecommendationPrompt");function Uf(e){try{let t=e.match(/\{[\s\S]*\}/);if(!t)return[];let n=JSON.parse(t[0]);return!n.recommendations||!Array.isArray(n.recommendations)?[]:n.recommendations.filter(r=>typeof r.instructionId=="string"&&typeof r.score=="number"&&typeof r.reason=="string")}catch{return[]}}c(Uf,"parseRecommendationResponse");var bv=32e3,Yk={name:"x".repeat(64),description:"x".repeat(256),languages:["TypeScript","Python","Go"],topics:["x".repeat(32)],dependencies:["x".repeat(32)]};function Hf(e,t={}){if(e.length===0)return[];let n=t.charBudget??bv,r=Oc(Yk,[]).length,o=[],s=[],i=0;for(let a of e){let d=Xk(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(Hf,"batchCandidatesForPrompt");function Xk(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(
|
|
115
|
-
`);for(let i of eN){let a=o.match(i.pattern);a&&r.push({pattern:i.description,severity:i.severity,category:i.category,match:a[0].slice(0,100)})}let s=100;for(let i of r)s-=Zk[i.severity]??5;return{score:Math.max(0,Math.min(100,s)),findings:r}}c(Gf,"scanContent");D();import{and as tN,arrayOverlaps as nN,eq as Sv,inArray as rN,ne as oN}from"drizzle-orm";function sN(e){return fs(`skill:${e.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}`)}c(sN,"skillKeyFor");function iN(e){let t=Jf(e.frontmatter)?.provides??[],n=new Set(t.map(fs));return e.type==="skill"&&n.add(sN(e.name)),[...n].filter(r=>r.length>0)}c(iN,"providedKeysFor");async function xv(e,t){let n=iN(t);if(n.length===0)return[];let r=await d.select({id:Te.id,name:g.name,requires:Te.requires}).from(Te).innerJoin(g,Sv(g.id,Te.instructionId)).where(tN(Sv(Te.userId,e),oN(Te.instructionId,t.id),rN(Te.status,[...el]),nN(Te.requires,n)));return Kf({provides:n},r.map(o=>({id:o.id,name:o.name,requires:o.requires??[],provides:[]})),t.id)}c(xv,"findBlockedWithdrawals");function Rv(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(Rv,"withdrawalRefusal");var Nn=new aN,uN=pt.object({name:pt.string().min(1).max(255),description:pt.string().min(1),scope:pt.enum(["org","team","project","personal"]),scopeRef:pt.string().uuid().optional(),version:pt.string().default("1.0.0"),content:pt.string().min(1),tags:pt.array(pt.string()).optional(),compatibility:pt.array(pt.string()).optional()}),dN=pt.object({name:pt.string().min(1).max(255).optional(),description:pt.string().min(1).optional(),version:pt.string().optional(),content:pt.string().min(1).optional(),tags:pt.array(pt.string()).optional(),compatibility:pt.array(pt.string()).optional(),changeSummary:pt.string().optional()});Nn.get("/instructions",async e=>{let t=e.get("userId"),n=e.req.query("search"),r=e.req.query("scope"),o=e.req.query("tags"),s=e.req.query("type"),i=parseInt(e.req.query("limit")??"100",10),a=parseInt(e.req.query("offset")??"0",10),u=[qe(g.archived,!1),qe(g.createdBy,t)];if(r&&u.push(qe(g.scope,r)),s&&u.push(qe(g.type,s)),n){let h=ct(n);u.push(Xf(Yf(g.name,`%${h}%`),Yf(g.description,`%${h}%`),Yf(g.content,`%${h}%`)))}let l=await d.select().from(g).where(br(...u)).orderBy(kv(g.updatedAt)).limit(i).offset(a);if(o){let h=o.split(",").map(p=>p.trim().toLowerCase());l=l.filter(p=>h.some(w=>p.tags?.some(I=>I.toLowerCase().includes(w))))}let m=l.map(h=>h.id),f=m.length>0?await d.select({instructionId:lt.instructionId,projectName:C.name,projectId:C.id}).from(lt).innerJoin(C,qe(C.id,lt.projectId)).where(bi`${lt.instructionId} IN (${bi.join(m.map(h=>bi`${h}`),bi`, `)})`):[],_=new Map;for(let h of f){let p=_.get(h.instructionId)??[];p.push({projectId:h.projectId,projectName:h.projectName}),_.set(h.instructionId,p)}let v=l.map(h=>({...h,projects:_.get(h.id)??[]}));return nn({userId:t,surface:"api",action:"list"}),e.json(v)});Nn.get("/instructions/by-hash/:hash",async e=>{let t=e.get("userId"),n=e.req.param("hash"),[r]=await d.select({id:g.id,name:g.name,contextIdentity:g.contextIdentity,version:g.version,type:g.type}).from(g).where(br(qe(g.contentHash,n),qe(g.createdBy,t),qe(g.archived,!1))).limit(1);return r?e.json({instruction:r}):e.json({instruction:null})});Nn.post("/instructions/by-hashes",async e=>{let t=e.get("userId"),n=await e.req.json(),r=pt.array(pt.string()).max(200).parse(n.hashes??[]),o=pt.array(pt.string()).max(200).parse(n.identities??[]);if(r.length===0&&o.length===0)return e.json({instructions:{}});let s=[qe(g.createdBy,t),qe(g.archived,!1)],i=[];r.length>0&&i.push(Tv(g.contentHash,r)),o.length>0&&i.push(Tv(g.contextIdentity,o));let a=await d.select({id:g.id,name:g.name,contextIdentity:g.contextIdentity,version:g.version,type:g.type,contentHash:g.contentHash,source:bi`${g.frontmatter}->>'source'`}).from(g).where(br(...s,i.length===1?i[0]:Xf(...i))),u={};for(let l of a)l.contentHash&&(u[l.contentHash]=l),l.contextIdentity&&(u[l.contextIdentity]=l);return e.json({instructions:u})});Nn.get("/instructions/:id/sessions",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await d.select({sessionId:se.sessionId,linkMethod:se.linkMethod,tool:y.tool,projectPath:y.projectPath,startedAt:y.startedAt,endedAt:y.endedAt,analysis:y.analysis}).from(se).innerJoin(y,qe(y.id,se.sessionId)).where(br(qe(se.instructionId,n),qe(y.userId,t))).orderBy(kv(y.startedAt)).limit(50);return e.json({sessions:r})});Nn.get("/instructions/:id",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await d.select().from(g).where(br(qe(g.id,t),qe(g.archived,!1),Xf(qe(g.createdBy,n),qe(g.scope,"public"))));return r?(nn({instructionId:t,userId:n,surface:"api",action:"view"}),e.json(r)):e.json({error:"Instruction not found"},404)});var lN=/<\/?(?:system-reminder|system|available-deferred-tools|tool-result)>/i;function Nv(e){return lN.test(e)?"Content contains forbidden system tags":null}c(Nv,"validateNoForbiddenTags");Nn.post("/instructions",async e=>{let t=e.get("userId"),n=await e.req.json(),r=uN.parse(n),o=Nv(r.content);if(o)return e.json({error:o},422);r.name=Ii(r.name),r.description=Ii(r.description);let s={},i=null;try{let m=Gd(r.content);s=m.frontmatter,i=m.slots}catch{s={name:r.name,description:r.description,type:"instruction",scope:r.scope,version:r.version}}let a=r.scope==="personal"?t:r.scopeRef??null,u=Gf(r.content,r.name,r.description),[l]=await d.insert(g).values({name:r.name,description:r.description,type:"instruction",scope:r.scope,scopeRef:a,version:r.version,content:r.content,frontmatter:s,slots:i,tags:r.tags??[],compatibility:r.compatibility??[],createdBy:t,scanScore:u.score,scanFindings:u.findings.length>0?u.findings:null}).returning();return await d.insert(xe).values({instructionId:l.id,versionNumber:1,content:r.content,frontmatter:s,changeSummary:"Initial version",createdBy:t}),nn({instructionId:l.id,userId:t,surface:"api",action:"create"}),e.json(l,201)});Nn.put("/instructions/:id",async e=>{let t=e.req.param("id"),n=e.get("userId"),r=await e.req.json(),o=dN.parse(r);if(o.content){let f=Nv(o.content);if(f)return e.json({error:f},422)}o.name&&(o.name=Ii(o.name)),o.description&&(o.description=Ii(o.description));let[s]=await d.select().from(g).where(br(qe(g.id,t),qe(g.createdBy,n),qe(g.archived,!1)));if(!s)return e.json({error:"Instruction not found"},404);let i=s.frontmatter,a=s.slots;if(o.content)try{let f=Gd(o.content);i=f.frontmatter,a=f.slots}catch{}let u={};if(o.content||o.name||o.description){let f=Gf(o.content??s.content,o.name??s.name,o.description??s.description);u.scanScore=f.score,u.scanFindings=f.findings.length>0?f.findings:null}let l,m=4;for(let f=0;f<=m;f++)try{l=await d.transaction(async _=>{await _.select({id:g.id}).from(g).where(qe(g.id,t)).for("update");let[{maxVersion:v}]=await _.select({maxVersion:bi`COALESCE(MAX(${xe.versionNumber}), 0)`}).from(xe).where(qe(xe.instructionId,t)),h=v+1,[p]=await _.update(g).set({...o.name&&{name:o.name},...o.description&&{description:o.description},...o.version&&{version:o.version},...o.content&&{content:o.content},...o.tags&&{tags:o.tags},...o.compatibility&&{compatibility:o.compatibility},frontmatter:i,slots:a,...u,updatedAt:new Date}).where(qe(g.id,t)).returning();return await _.insert(xe).values({instructionId:t,versionNumber:h,content:o.content??s.content,frontmatter:i,changeSummary:o.changeSummary??null,createdBy:n}),p});break}catch(_){if(_.cause?.code==="23505"&&f<m)continue;throw _}return l?(nn({instructionId:t,userId:n,surface:"api",action:"update"}),e.json(l)):e.json({error:"Instruction update failed"},500)});Nn.delete("/instructions/:id",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await d.select().from(g).where(br(qe(g.id,t),qe(g.createdBy,n),qe(g.archived,!1)));if(!r)return e.json({error:"Instruction not found"},404);if(e.req.query("force")!=="true"){let i=await xv(n,r);if(i.length>0)return e.json({error:Rv(r.name,i),blockedBy:i},409)}let[o]=await d.update(g).set({archived:!0,archivedAt:new Date,archivedBy:n}).where(qe(g.id,t)).returning(),s=await d.update(x).set({dismissedAt:new Date,isStale:!0}).where(br(qe(x.userId,n),qe(x.instructionId,t),cN(x.dismissedAt))).returning({id:x.id});return nn({instructionId:t,userId:n,surface:"api",action:"delete"}),e.json({...o,dismissedSuggestions:s.length})});Nn.post("/instructions/:id/restore",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await d.select().from(g).where(br(qe(g.id,t),qe(g.createdBy,n),qe(g.archived,!0)));if(!r)return e.json({error:"Archived instruction not found"},404);let[o]=await d.update(g).set({archived:!1,archivedAt:null,archivedBy:null}).where(qe(g.id,t)).returning();return nn({instructionId:t,userId:n,surface:"api",action:"update"}),e.json(o)});Nn.get("/instructions/:id/versions",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await d.select({id:g.id}).from(g).where(br(qe(g.id,t),qe(g.createdBy,n)));if(!r)return e.json({error:"Instruction not found"},404);let o=await d.select().from(xe).where(qe(xe.instructionId,t)).orderBy(xe.versionNumber);return e.json(o)});D();import{Hono as mN}from"hono";import{eq as wo,and as Qf}from"drizzle-orm";var Mc=new mN;Mc.post("/instructions/:id/fork",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select().from(g).where(Qf(wo(g.id,n),wo(g.archived,!1)));if(!r)return e.json({error:"Instruction not found"},404);if(r.createdBy===t)return e.json({error:"Cannot fork your own instruction"},400);if(r.scope==="org"&&r.scopeRef){let[s]=await d.select({id:g.id}).from(g).where(Qf(wo(g.createdBy,t),wo(g.scope,"org"),wo(g.scopeRef,r.scopeRef))).limit(1);if(!s)return e.json({error:"Instruction not found"},404)}else if(r.scope!=="org")return e.json({error:"Instruction not found"},404);let[o]=await d.insert(g).values({name:`${r.name} (fork)`,description:r.description,type:r.type,scope:"personal",scopeRef:t,version:"1.0.0",content:r.content,frontmatter:r.frontmatter,slots:r.slots,tags:r.tags,compatibility:r.compatibility,createdBy:t,forkedFromId:r.id,upstreamVersion:r.version}).returning();return await d.insert(xe).values({instructionId:o.id,versionNumber:1,content:o.content,frontmatter:o.frontmatter,changeSummary:`Forked from ${r.name}`,createdBy:t}),await d.insert(Ut).values({instructionId:o.id,eventType:"fork",actorId:t,metadata:{sourceId:r.id,sourceName:r.name,sourceVersion:r.version}}),nn({instructionId:o.id,userId:t,surface:"api",action:"fork"}),e.json(o,201)});Mc.get("/instructions/:id/events",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await d.select({id:g.id}).from(g).where(Qf(wo(g.id,t),wo(g.createdBy,n)));if(!r)return e.json({error:"Instruction not found"},404);let o=await d.select().from(Ut).where(wo(Ut.instructionId,t)).orderBy(Ut.createdAt);return e.json(o)});D();import{Hono as pN}from"hono";import{eq as sr,and as jv,sql as fN}from"drizzle-orm";var $c=new pN;$c.get("/instructions/:id/upstream",async e=>{let t=e.req.param("id"),[n]=await d.select().from(g).where(jv(sr(g.id,t),sr(g.archived,!1)));if(!n)return e.json({error:"Instruction not found"},404);if(!n.forkedFromId)return e.json({error:"This instruction is not a fork"},400);let[r]=await d.select().from(g).where(sr(g.id,n.forkedFromId));return r?e.json({hasUpdate:r.version!==n.upstreamVersion,currentVersion:n.upstreamVersion,upstreamVersion:r.version,parentId:r.id,parentName:r.name}):e.json({hasUpdate:!1,currentVersion:n.upstreamVersion,upstreamVersion:null,parentId:n.forkedFromId})});$c.post("/instructions/:id/pull-upstream",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select().from(g).where(jv(sr(g.id,n),sr(g.createdBy,t),sr(g.archived,!1)));if(!r)return e.json({error:"Instruction not found"},404);if(!r.forkedFromId)return e.json({error:"This instruction is not a fork"},400);let[o]=await d.select().from(g).where(sr(g.id,r.forkedFromId));if(!o)return e.json({error:"Parent instruction no longer exists"},404);let[s]=await d.select().from(xe).where(sr(xe.instructionId,o.id)).orderBy(xe.versionNumber).limit(1),i=s?.content??o.content,a=qf(i,o.content,r.content);if(a.hasConflicts)return e.json({hasConflicts:!0,merged:a.merged,conflicts:a.conflicts});let u,l=4;for(let m=0;m<=l;m++)try{u=await d.transaction(async f=>{await f.select({id:g.id}).from(g).where(sr(g.id,n)).for("update");let[_]=await f.select({maxVersion:fN`COALESCE(MAX(${xe.versionNumber}), 0)`}).from(xe).where(sr(xe.instructionId,n)),v=(_?.maxVersion??0)+1,[h]=await f.update(g).set({content:a.merged,upstreamVersion:o.version,updatedAt:new Date}).where(sr(g.id,n)).returning();return await f.insert(xe).values({instructionId:n,versionNumber:v,content:a.merged,frontmatter:r.frontmatter,changeSummary:`Pulled upstream changes from ${o.name} (${o.version})`,createdBy:t}),await f.insert(Ut).values({instructionId:n,eventType:"pull_upstream",actorId:t,metadata:{parentId:o.id,parentVersion:o.version,previousUpstreamVersion:r.upstreamVersion}}),h});break}catch(f){if(f.cause?.code==="23505"&&m<l)continue;throw f}return u?(nn({instructionId:n,userId:t,surface:"api",action:"pull_upstream"}),e.json({hasConflicts:!1,instruction:u})):e.json({error:"Pull-upstream failed after version conflict"},500)});D();import{Hono as gN}from"hono";import{z as vo}from"zod";import{eq as Bt,and as gs,sql as hN}from"drizzle-orm";var _N=vo.object({scope:vo.enum(["team","org"]),scopeRef:vo.string().uuid()}),qc=new gN;qc.post("/instructions/:id/promote",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=_N.parse(await e.req.json()),[o]=await d.select().from(g).where(gs(Bt(g.id,n),Bt(g.createdBy,t),Bt(g.archived,!1)));if(!o)return e.json({error:"Instruction not found"},404);if(o.scope==="org")return e.json({error:"Instruction is already org-scoped"},400);if(r.scope==="team"){let[u]=await d.select().from(we).where(gs(Bt(we.userId,t),Bt(we.teamId,r.scopeRef)));if(!u)return e.json({error:"You are not a member of this team"},403)}else if(r.scope==="org"){let[u]=await d.select().from(ee).where(gs(Bt(ee.userId,t),Bt(ee.orgId,r.scopeRef)));if(!u||u.role!=="admin"&&u.role!=="owner")return e.json({error:"You must be an org admin to promote to org scope"},403)}let s=o.scope,i=o.scopeRef,[a]=await d.update(g).set({scope:r.scope,scopeRef:r.scopeRef,updatedAt:new Date}).where(Bt(g.id,n)).returning();return await d.insert(Ut).values({instructionId:n,eventType:"promote",actorId:t,metadata:{fromScope:s,fromScopeRef:i,toScope:r.scope,toScopeRef:r.scopeRef}}),nn({instructionId:n,userId:t,surface:"api",action:"promote"}),e.json(a)});var yN=vo.object({targetScope:vo.enum(["personal","team","org"]),targetScopeRef:vo.string().uuid().optional(),name:vo.string().optional(),seedEvalTarget:vo.boolean().optional()});async function wN(e){let[t]=await d.select({id:k.id}).from(k).where(hN`${k.metadata}->>'instructionId' = ${e}`).limit(1);return t??null}c(wN,"findExistingEvalTarget");qc.post("/instructions/:id/promote-from-public",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=yN.parse(await e.req.json()),[o]=await d.select().from(g).where(gs(Bt(g.id,n),Bt(g.scope,"public")));if(!o)return e.json({error:"Public instruction not found"},404);if(r.targetScope==="team"){if(!r.targetScopeRef)return e.json({error:"targetScopeRef is required for team scope"},400);let[f]=await d.select().from(we).where(gs(Bt(we.userId,t),Bt(we.teamId,r.targetScopeRef)));if(!f)return e.json({error:"You are not a member of this team"},403)}else if(r.targetScope==="org"){if(!r.targetScopeRef)return e.json({error:"targetScopeRef is required for org scope"},400);let[f]=await d.select().from(ee).where(gs(Bt(ee.userId,t),Bt(ee.orgId,r.targetScopeRef)));if(!f||f.role!=="admin"&&f.role!=="owner")return e.json({error:"You must be an org admin to promote into an org"},403)}let s=r.targetScope==="personal"?t:r.targetScopeRef,i=r.name??o.name,a=r.seedEvalTarget??(r.targetScope==="org"||r.targetScope==="team"),[u]=await d.select().from(g).where(gs(Bt(g.scope,r.targetScope),Bt(g.scopeRef,s),Bt(g.forkedFromId,n),Bt(g.archived,!1)));if(u){let f=null;return a&&(f=(await wN(u.id))?.id??null),e.json({instructionId:u.id,alreadyExisted:!0,evalTargetId:f})}let[l]=await d.insert(g).values({name:i,description:o.description,type:o.type,scope:r.targetScope,scopeRef:s,version:o.version,content:o.content,frontmatter:o.frontmatter,slots:o.slots,tags:o.tags,compatibility:o.compatibility,createdBy:t,forkedFromId:o.id,upstreamVersion:o.upstreamVersion??o.version,contentHash:o.contentHash,contextIdentity:o.contextIdentity}).returning();if(!l)return e.json({error:"Failed to clone instruction"},500);await d.insert(xe).values({instructionId:l.id,versionNumber:1,content:o.content,frontmatter:o.frontmatter,changeSummary:`Promoted from public skill ${o.name}`,createdBy:t}),await d.insert(Ut).values({instructionId:l.id,eventType:"promote_from_public",actorId:t,metadata:{sourceInstructionId:o.id,sourceName:o.name,targetScope:r.targetScope,targetScopeRef:s}}),nn({instructionId:l.id,userId:t,surface:"api",action:"promote_from_public"});let m=null;if(a){let[f]=await d.insert(k).values({userId:t,name:`${i} \u2014 baseline eval`,type:"instruction",content:o.content,description:`Auto-seeded from public skill \`${o.name}\` on promote.`,metadata:{instructionId:l.id,publicSourceId:o.id,publicContentHash:o.contentHash??null,publicVersion:o.version??null}}).returning({id:k.id});m=f?.id??null}return e.json({instructionId:l.id,alreadyExisted:!1,evalTargetId:m})});D();import{Hono as vN}from"hono";import{z as Pv}from"zod";import{eq as jn,and as Uc,or as Dv,inArray as Ov,sql as nl,desc as IN}from"drizzle-orm";var Hc=new vN,bN=Pv.object({badge:Pv.enum(["recommended","required"]).nullable()});Hc.get("/catalog",async e=>{let t=e.get("userId"),n=e.req.query("badge"),r=e.req.query("scope"),o=e.req.query("search"),s=parseInt(e.req.query("contentPreview")??"0",10),i=Number.isFinite(s)?Math.min(Math.max(s,0),400):0,a=parseInt(e.req.query("limit")??"50",10),u=parseInt(e.req.query("offset")??"0",10),l=Math.min(Math.max(a,1),200),m=Math.max(u,0),f=await d.select({orgId:ee.orgId}).from(ee).where(jn(ee.userId,t)),_=await d.select({teamId:we.teamId}).from(we).where(jn(we.userId,t)),v=f.map(S=>S.orgId).filter(S=>S!==null),h=_.map(S=>S.teamId).filter(S=>S!==null),p=[jn(g.archived,!1)],w=[jn(g.scope,"public")];if(v.length>0&&w.push(Uc(jn(g.scope,"org"),Ov(g.scopeRef,v))),h.length>0&&w.push(Uc(jn(g.scope,"team"),Ov(g.scopeRef,h))),p.push(Dv(...w)),n&&p.push(jn(g.badge,n)),r&&p.push(jn(g.scope,r)),o){let S=ct(o);p.push(Dv(nl`${g.name} ILIKE ${`%${S}%`}`,nl`${g.description} ILIKE ${`%${S}%`}`))}let I=[IN(nl`COALESCE(${g.sourceUpdatedAt}, ${g.updatedAt})`)],b={id:g.id,name:g.name,description:g.description,type:g.type,scope:g.scope,scopeRef:g.scopeRef,version:g.version,tags:g.tags,badge:g.badge,popularityScore:g.popularityScore,updatedAt:g.updatedAt,createdAt:g.createdAt,sourceUpdatedAt:g.sourceUpdatedAt},E=await(i>0?Fe:d).select(i>0?{...b,contentPreview:nl`left(${g.content}, ${i})`}:b).from(g).where(Uc(...p)).orderBy(...I).limit(l).offset(m);return nn({userId:t,surface:"api",action:"search",metadata:o?{query:o}:void 0}),e.header("Cache-Control","private, max-age=30"),e.json(E)});Hc.post("/instructions/:id/badge",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=bN.parse(await e.req.json()),[o]=await d.select().from(g).where(Uc(jn(g.id,n),jn(g.archived,!1)));if(!o)return e.json({error:"Instruction not found"},404);if(o.scope!=="org"&&o.scope!=="team")return e.json({error:"Badges can only be set on org or team-scoped instructions"},400);let s=o.scopeRef;if(!s)return e.json({error:"Instruction has no scope reference"},400);let[i]=await d.select().from(ee).where(Uc(jn(ee.userId,t),jn(ee.orgId,s)));if(!i||i.role!=="admin"&&i.role!=="owner")return e.json({error:"Only admins of the owning organization can set badges"},403);let[a]=await d.update(g).set({badge:r.badge,updatedAt:new Date}).where(jn(g.id,n)).returning(),u=r.badge?"badge_set":"badge_removed";return await d.insert(Ut).values({instructionId:n,eventType:u,actorId:t,metadata:{badge:r.badge}}),e.json(a)});D();import{Hono as EN}from"hono";import{eq as Io,and as rl,or as AN,inArray as Cv}from"drizzle-orm";var ol=new EN;ol.post("/projects/:id/recommendations",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select().from(C).where(rl(Io(C.id,n),Io(C.createdBy,t)));if(!r)return e.json({error:"Project not found"},404);let o=await d.select({orgId:ee.orgId}).from(ee).where(Io(ee.userId,t)),s=await d.select({teamId:we.teamId}).from(we).where(Io(we.userId,t)),i=o.map(p=>p.orgId).filter(p=>p!==null),a=s.map(p=>p.teamId).filter(p=>p!==null),u=[Io(g.scope,"public")];i.length>0&&u.push(rl(Io(g.scope,"org"),Cv(g.scopeRef,i))),a.length>0&&u.push(rl(Io(g.scope,"team"),Cv(g.scopeRef,a)));let l=await d.select().from(g).where(rl(Io(g.archived,!1),AN(...u))).limit(50);if(l.length===0)return e.json({recommendations:[],error:null});let m={name:r.name,description:r.description,languages:[],topics:[],dependencies:[]};if(r.githubRepo)try{let p=r.githubRepo.replace("https://github.com/",""),[w,I]=await Promise.all([fetch(`https://api.github.com/repos/${p}`,{headers:{Accept:"application/vnd.github.v3+json","User-Agent":"RuleMetric"}}),fetch(`https://api.github.com/repos/${p}/languages`,{headers:{Accept:"application/vnd.github.v3+json","User-Agent":"RuleMetric"}})]);if(w.ok){let b=await w.json();m.topics=b.topics??[]}if(I.ok){let b=await I.json();m.languages=Object.keys(b)}}catch{}let f=l.map(p=>({id:p.id,name:p.name,description:p.description??"",tags:p.tags??[],contentPreview:(p.content??"").slice(0,400)})),_=process.env.LLM_PROVIDER,v=process.env.LLM_API_KEY;if(!_||!v)return e.json({recommendations:[],error:"LLM not configured"});let h=await Bf(m,f,{llmProvider:_,llmApiKey:v});return e.json(h)});import{Hono as Aj}from"hono";D();import{Hono as ej}from"hono";import{z as bg}from"zod";import{eq as Et,and as Yc,desc as rI,sql as cr,inArray as tj}from"drizzle-orm";D();import{and as LN,eq as yg,sql as MN}from"drizzle-orm";function Zf(e,t){let n=e,r=t,o=n+r;if(o===0)return{pValue:1,nDiscordant:0};let s=Math.min(n,r),i=Math.pow(.5,o),a=i;for(let u=1;u<=s;u++)i*=(o-u+1)/u,a+=i;return{pValue:Math.min(1,2*a),nDiscordant:o}}c(Zf,"mcnemarExact");function sl(e,t,n=10){return{sufficient:e>=n&&t>=n,minN:n,nWith:e,nWithout:t,shortfall:{with:Math.max(0,n-e),without:Math.max(0,n-t)}}}c(sl,"assessSufficiency");var bo=1.959963984540054;function il(e,t,n=bo){if(t===0)return{lower:0,upper:1};let r=e/t,o=n*n,s=1+o/t,i=(r+o/(2*t))/s,a=n/s*Math.sqrt(r*(1-r)/t+o/(4*t*t));return{lower:Math.max(0,i-a),upper:Math.min(1,i+a)}}c(il,"wilsonInterval");function Ai(e){let t=e>>>0;return()=>{t=t+1831565813|0;let n=Math.imul(t^t>>>15,1|t);return n=n+Math.imul(n^n>>>7,61|n)^n,((n^n>>>14)>>>0)/4294967296}}c(Ai,"seededRandom");function Ei(e,t){let n=e.length;if(n===1)return e[0];let r=(n-1)*t,o=Math.floor(r),s=Math.ceil(r);return o===s?e[o]:e[o]+(r-o)*(e[s]-e[o])}c(Ei,"sortedQuantile");function eg(e,t={}){let n=e.length;if(n===0)return{estimate:0,lower:0,upper:0,iterations:0};let r=t.iterations??1e4,o=t.ciLevel??.95,s=Ai(t.seed??1),i=e.reduce((l,m)=>l+m,0)/n,a=new Array(r);for(let l=0;l<r;l++){let m=0;for(let f=0;f<n;f++)m+=e[s()*n|0];a[l]=m/n}a.sort((l,m)=>l-m);let u=(1-o)/2;return{estimate:i,lower:Ei(a,u),upper:Ei(a,1-u),iterations:r}}c(eg,"pairedBootstrapCI");function tg(e,t,n={}){if(e.length===0||t.length===0)return{estimate:0,lower:0,upper:0,pValue:1,iterations:0};let r=n.iterations??1e4,o=n.ciLevel??.95,s=Ai(n.seed??1),i=c(v=>v.reduce((h,p)=>h+p,0)/v.length,"mean"),a=i(e)-i(t),u=new Array(r),l=0,m=0;for(let v=0;v<r;v++){let h=0;for(let I=0;I<e.length;I++)h+=e[s()*e.length|0];let p=0;for(let I=0;I<t.length;I++)p+=t[s()*t.length|0];let w=h/e.length-p/t.length;u[v]=w,w<=0&&l++,w>=0&&m++}u.sort((v,h)=>v-h);let f=(1-o)/2,_=Math.min(1,2*Math.min(l,m)/r);return{estimate:a,lower:Ei(u,f),upper:Ei(u,1-f),pValue:_,iterations:r}}c(tg,"twoSampleBootstrapCI");function ng(e,t={}){let n=e.filter(p=>p.withScores.length>0&&p.withoutScores.length>0);if(n.length===0)return{estimate:0,lower:0,upper:0,pValue:1,iterations:0};let r=c(p=>p.reduce((w,I)=>w+I,0)/p.length,"mean"),o=n.map(p=>p.withScores.length*p.withoutScores.length/(p.withScores.length+p.withoutScores.length)),s=o.reduce((p,w)=>p+w,0),i=c(p=>p.reduce((w,I,b)=>w+o[b]*I,0)/s,"combine"),a=i(n.map(p=>r(p.withScores)-r(p.withoutScores))),u=t.iterations??1e4,l=t.ciLevel??.95,m=Ai(t.seed??1),f=new Array(u),_=0,v=0;for(let p=0;p<u;p++){let w=n.map(b=>{let A=0;for(let S=0;S<b.withScores.length;S++)A+=b.withScores[m()*b.withScores.length|0];let E=0;for(let S=0;S<b.withoutScores.length;S++)E+=b.withoutScores[m()*b.withoutScores.length|0];return A/b.withScores.length-E/b.withoutScores.length}),I=i(w);f[p]=I,I<=0&&_++,I>=0&&v++}f.sort((p,w)=>p-w);let h=(1-l)/2;return{estimate:a,lower:Ei(f,h),upper:Ei(f,1-h),pValue:Math.min(1,2*Math.min(_,v)/u),iterations:u}}c(ng,"stratifiedBootstrapCI");function rg(e,t){if(e.length!==t.length)throw new Error(`cupedAdjust: outcomes (${e.length}) and covariates (${t.length}) must be the same length`);let n=e.length;if(n===0)return{adjusted:[],theta:0,varianceReduction:0};let r=t.reduce((v,h)=>v+h,0)/n,o=e.reduce((v,h)=>v+h,0)/n,s=0,i=0,a=0;for(let v=0;v<n;v++){let h=t[v]-r,p=e[v]-o;s+=h*p,i+=h*h,a+=p*p}if(i===0)return{adjusted:[...e],theta:0,varianceReduction:0};let u=s/i,l=e.map((v,h)=>v-u*(t[h]-r)),m=0,f=l.reduce((v,h)=>v+h,0)/n;for(let v of l)m+=(v-f)*(v-f);let _=a===0?0:1-m/a;return{adjusted:l,theta:u,varianceReduction:_}}c(rg,"cupedAdjust");function og(e,t=.05){return e.map(n=>{let r=Math.abs(n.withPassRate-n.withoutPassRate),o=r>t,s;return o?s=`discriminates: ${(n.withPassRate*100).toFixed(0)}% with vs ${(n.withoutPassRate*100).toFixed(0)}% without`:n.withPassRate>=1-t&&n.withoutPassRate>=1-t?s="always passes in both cohorts \u2014 measures nothing about the treatment":n.withPassRate<=t&&n.withoutPassRate<=t?s="always fails in both cohorts \u2014 measures nothing about the treatment":s="similar pass rate in both cohorts \u2014 non-discriminating",{...n,discriminating:o,separation:r,note:s}})}c(og,"diagnoseAssertions");function sg(e,t={}){let n=t.unpaired??0,r=t.materialFraction??.5,o=e.filter(l=>l.discriminating).length,s=e.length-o,i=e.length+n,a=s+n,u=null;if(i>0&&a>0&&a/i>=r){let l=n>0?` (${n} with no baseline cohort)`:"";u=`${a}/${i} cases do not discriminate with vs without${l} \u2014 cull or replace them before adding runs; more runs of a non-discriminating case cannot lower the MDE`}return{total:i,discriminating:o,nonDiscriminating:s,unpaired:n,diagnoses:e,gateReason:u}}c(sg,"summarizeDiscrimination");function al(e,t){let n=e.length,r=t.length;if(n===0||r===0)return 0;let o=[...e.map(l=>({t:l,exposed:!0})),...t.map(l=>({t:l,exposed:!1}))].sort((l,m)=>l.t-m.t),s=0,i=0;for(;i<o.length;){let l=i;for(;l+1<o.length&&o[l+1].t===o[i].t;)l++;let m=(i+1+l+1)/2;for(let f=i;f<=l;f++)o[f].exposed&&(s+=m);i=l+1}let u=(s-n*(n+1)/2)/(n*r);return Math.abs(u-.5)}c(al,"cohortTimeSeparation");var hs=.35,cl=900*1e3;function ig(e,t,n=hs,r=cl){if(e.length===0||t.length===0)return!1;let o=[...e,...t];return Math.max(...o)-Math.min(...o)<r?!1:al(e,t)>n}c(ig,"isTimeSeparated");var Lv=c(e=>e===0||e===1,"isBinary");function Mv(e,t,n){return e.every(o=>o[t]!=null&&o[n]!=null)?e.reduce((o,s)=>o+(s[t]-s[n]),0)/e.length:null}c(Mv,"meanPairDelta");function ul(e,t={}){let n=t.baseline??"no-rule",r=t.minN??10,o=e.length,s=e.map(p=>p.withScore-p.withoutScore),i=o===0?0:s.reduce((p,w)=>p+w,0)/o,a=eg(s,{seed:t.seed,iterations:t.iterations}),u={lower:a.lower,upper:a.upper},l=e.every(p=>Lv(p.withScore)&&Lv(p.withoutScore)),m=null;if(l&&o>0){let p=0,w=0;for(let I of e)I.withScore===1&&I.withoutScore===0?p++:I.withScore===0&&I.withoutScore===1&&w++;m=Zf(p,w).pValue}let{sufficient:f}=sl(o,o,r),_=u.lower>0||u.upper<0,h={mode:"controlled",baseline:n,delta:i,ci:u,pValue:m,significant:f&&_,sufficient:f,nWith:o,nWithout:o,costDelta:Mv(e,"withCost","withoutCost"),latencyDelta:Mv(e,"withLatency","withoutLatency"),confounded:!1};return f||(h.insufficientReason=`insufficient data: need >= ${r} paired tasks per cohort, have ${o}`),h}c(ul,"buildControlledVerdict");var SN=2;function dl(e,t,n={}){let r=n.minN??10,o=e.length,s=t.length,i=e.map(b=>b.score),a=t.map(b=>b.score),u=[...e,...t],l=u.length>0&&u.every(b=>typeof b.covariate=="number");if(l){let{adjusted:b}=rg(u.map(A=>A.score),u.map(A=>A.covariate));i=b.slice(0,o),a=b.slice(o)}let m=tg(i,a,{seed:n.seed,iterations:n.iterations}),f={lower:m.lower,upper:m.upper},_=m.estimate,v=o>0&&s>0?m.pValue:null,{sufficient:h}=sl(o,s,r),p=h&&(f.lower>0||f.upper<0),w=c(b=>{if(o===0||s===0||!e.every(S=>b(S)!=null)||!t.every(S=>b(S)!=null))return null;let A=e.reduce((S,T)=>S+b(T),0)/o,E=t.reduce((S,T)=>S+b(T),0)/s;return A-E},"meanDiff"),I={mode:"observational",baseline:n.baseline??"no-rule",delta:_,ci:f,pValue:v,significant:p,sufficient:h,nWith:o,nWithout:s,costDelta:w(b=>b.cost),latencyDelta:w(b=>b.latency),confounded:!0,cupedApplied:l};return h||(I.insufficientReason=`insufficient data: need >= ${r} sessions per cohort, have ${o} exposed / ${s} unexposed`),I}c(dl,"buildObservationalVerdict");function Pn(e,t={}){let n=t.minN??10,r=t.minPerStratum??SN,o=t.maxTimeSeparation??hs,s=t.minStratumSpanMs??cl,i=e.filter(T=>T.withScores.length>=r&&T.withoutScores.length>=r),a=i.filter(T=>T.withTimes!=null&&T.withoutTimes!=null&&ig(T.withTimes,T.withoutTimes,o,s)),u=new Set(a.map(T=>T.key)),l=i.filter(T=>!u.has(T.key)),m=e.filter(T=>T.withScores.length>0&&T.withoutScores.length>0&&(T.withScores.length<r||T.withoutScores.length<r)).length,f=l.reduce((T,O)=>T+O.withScores.length,0),_=l.reduce((T,O)=>T+O.withoutScores.length,0),v=ng(l,{seed:t.seed,iterations:t.iterations}),h={lower:v.lower,upper:v.upper},p=v.estimate,w=l.length>0&&f>=n&&_>=n,I=l.length>0?v.pValue:null,b=w&&(h.lower>0||h.upper<0),A=e.reduce((T,O)=>T+O.withScores.length+O.withoutScores.length,0),E=A>0?(f+_)/A:0,S={mode:"observational",baseline:t.baseline??"no-rule",delta:p,ci:h,pValue:I,significant:b,sufficient:w,nWith:f,nWithout:_,costDelta:null,latencyDelta:null,confounded:!0,strata:l.length,strataDroppedForTimeSeparation:a.length,coverage:E};if(!w){let T=m>0?` (${m} project(s) had both cohorts but fewer than ${r} sessions in one of them)`:"",O=a.length>0?` ${a.length} project-month(s) held both cohorts but their sessions are separated in time (exposure predicts when a session ran), so the difference within them is a calendar difference, not a treatment effect`:"";S.insufficientReason=l.length===0?a.length>0?`insufficient data: no comparable cohort.${O}${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 ${f} exposed / ${_} unexposed${T}${O?`.${O}`:""}`}return S}c(Pn,"buildStratifiedVerdict");function ag(e,t,n={}){return{overall:Pn(e,n),segments:ll(t,n)}}c(ag,"buildSegmentedVerdict");function ll(e,t={}){return e.map(n=>({segment:n.segment,verdict:Pn(n.strata,t)}))}c(ll,"buildSegmentVerdicts");function _s(e){return e.sufficient?e.significant?e.delta<0?"harmful":"helpful":"neutral":"insufficient"}c(_s,"classifyEffect");var Si={achieved:1,fully_achieved:1,mostly_achieved:.75,partially_achieved:.5,unclear_from_transcript:.25,not_achieved:0,abandoned:0},ys=c(e=>{let t=e?Si[e]:void 0;return t===void 0?null:t},"scoreOutcome");var xi=10,ml=c(e=>e.length===0?0:e.reduce((t,n)=>t+n,0)/e.length,"mean"),cg=c(e=>{if(e.length<2)return 0;let t=ml(e);return e.reduce((n,r)=>n+(r-t)**2,0)/(e.length-1)},"sampleVar"),$v=c((e,t)=>{let n=t.reduce((l,m)=>l+m,0);if(n<=0||e.length===0)return{mean:0,varOfMean:0,nEff:0};let r=t.reduce((l,m)=>l+m*m,0),o=n*n/r,s=e.reduce((l,m,f)=>l+t[f]*m,0)/n,i=n-r/n,u=(i>0?e.reduce((l,m,f)=>l+t[f]*(m-s)**2,0)/i:0)*r/(n*n);return{mean:s,varOfMean:u,nEff:o}},"weightedStats");function ug(e,t,n={}){let r=n.minAnchors??xi,o=n.z??bo,s=e.length,i=t.length,a=[...e,...t.map(E=>E.judge)],u=ml(a),l=t.map(E=>E.weight??1),m=t.map(E=>E.human-E.judge),f=$v(m,l),_=f.mean,v=i>0?f.nEff:0,h=t.filter(E=>E.validated!==!1).length;if(n.pooledRectifier){let E=n.pooledRectifier,S=s>0?e:t.map(q=>q.judge);if(S.length===0)return{estimate:NaN,ci:{lower:NaN,upper:NaN},se:1/0,naive:u,rectifier:E.rectifier,nLabeled:i,nUnlabeled:s,nEffective:v,nValidated:h,sufficient:!1,insufficientReason:"no judge scores to correct with the pooled rectifier"};let T=ml(S)+E.rectifier,O=cg(S)/S.length+E.variance,W=Math.sqrt(O),N={estimate:T,ci:{lower:T-o*W,upper:T+o*W},se:W,naive:u,rectifier:E.rectifier,nLabeled:i,nUnlabeled:s,nEffective:v,nValidated:h,sufficient:E.sufficient};return E.sufficient||(N.insufficientReason="pooled rectifier not yet adequate"),N}let p,w;if(i===0)p=u,w=a.length>0?cg(a)/a.length:0;else if(s===0){let E=$v(t.map(S=>S.human),l);p=E.mean,w=E.varOfMean}else p=ml(e)+_,w=cg(e)/s+f.varOfMean;let I=Math.sqrt(w),b=h>=r,A={estimate:p,ci:{lower:p-o*I,upper:p+o*I},se:I,naive:u,rectifier:_,nLabeled:i,nUnlabeled:s,nEffective:v,nValidated:h,sufficient:b};if(!b){let E=i-h;A.insufficientReason=`insufficient anchors: need >= ${r} VALIDATED human-labeled items, have ${h}${E>0?` (+${E} passive, which don't count toward the floor)`:""}`}return A}c(ug,"ppiMeanEstimate");function Bc(e,t,n={}){let r=ug(e.unlabeledJudge,e.labeled,{...n,pooledRectifier:n.withPooledRectifier}),o=ug(t.unlabeledJudge,t.labeled,{...n,pooledRectifier:n.withoutPooledRectifier}),s=n.z??bo,i=r.estimate-o.estimate,a=Math.sqrt(r.se**2+o.se**2),u={lower:i-s*a,upper:i+s*a},l=r.sufficient&&o.sufficient,m=l&&(u.lower>0||u.upper<0),f={delta:i,ci:u,se:a,with:r,without:o,sufficient:l,significant:m};return l||(f.insufficientReason=r.insufficientReason??o.insufficientReason),f}c(Bc,"ppiDifference");var Ri=50,Hv=.2,Bv=.8416212335729143,xN=c(e=>e.length===0?0:e.reduce((t,n)=>t+n,0)/e.length,"mean"),Fc=c(e=>{if(e.length<2)return 0;let t=xN(e);return e.reduce((n,r)=>n+(r-t)**2,0)/(e.length-1)},"sampleVar");function qv(e,t){let n=e.labeled.length,r=e.unlabeledJudge.length;return n>0&&r>0?{fixed:Fc(e.unlabeledJudge)/r,scaling:Fc(e.labeled.map(o=>o.human-o.judge)),n}:n>0?{fixed:0,scaling:Fc(e.labeled.map(o=>o.human)),n}:{fixed:r>0?Fc(e.unlabeledJudge)/r:0,scaling:t.labeled.length>0?Fc(t.labeled.map(o=>o.human-o.judge)):null,n:0}}c(qv,"varianceComponents");var Uv=1e6;function RN(e,t){if(e.some(s=>s.scaling===null))return null;let n=c(s=>e.reduce((i,a)=>i+a.fixed+(a.scaling===0?0:a.scaling/(a.n+s)),0),"se2");if(n(Uv)>t)return null;let r=0,o=Uv;for(;r<o;){let s=Math.floor((r+o)/2);n(s)<=t?o=s:r=s+1}return r}c(RN,"solvePerCohortIncrement");function dg(e,t,n={}){let r=n.pilotTarget??Ri,o=n.targetEffect??Hv,s=n.minAnchors??xi,i=n.z??bo,a=n.zPower??Bv,u=i+a,l=c(K=>(K*100).toFixed(0),"pp"),m=e.labeled.length,f=t.labeled.length,_=n.humanLabeledRuns??m+f,v=e.unlabeledJudge.length+m+t.unlabeledJudge.length+f,h={nAnchors:_,nAnchorsWith:m,nAnchorsWithout:f,pilotTarget:r,pilotMet:_>=r,targetEffect:o};if(v===0)return{...h,seDelta:null,mde:null,powered:!1,adequate:!1,reasons:["no graded runs to calibrate against"],additionalAnchorsNeeded:r};let p=Bc(e,t,{minAnchors:s,z:i,withPooledRectifier:n.pool?.withPooledRectifier,withoutPooledRectifier:n.pool?.withoutPooledRectifier}).se,w=u*p,I=e.unlabeledJudge.length+m,b=t.unlabeledJudge.length+f,A=Math.min(I,b)<s,E=!Number.isFinite(p)||p<=0,S=A,T=!S&&w<=o,O=`(${I} with / ${b} without, minimum ${s} per cohort)`,W=E?`sample too thin to estimate a variance ${O} \u2014 no variance in it at all, so the estimate has no spread to be precise about; this is missing data, not power`:`sample too thin to claim precision ${O} \u2014 an MDE of \xB1${l(w)}pp estimated from this few runs is an artefact of the sample size, not power`;if(n.pool){let{totalAnchors:K,targets:pe}=n.pool,B=K>=r,he=pe>=3,P=B&&he&&T,re=[];return he||re.push(`pool spans ${pe}/3 same-judge targets \u2014 between-target variance is assumed, not measured`),B||re.push(`pool floor not met: ${K}/${r} human-labeled runs across the same-judge pool`),S?re.push(W):T||re.push(`MDE \xB1${l(w)}pp exceeds the \xB1${l(o)}pp target effect \u2014 pooling lowers the label cost, not this; more graded runs are needed (\xA76d(f))`),{...h,seDelta:p,mde:w,powered:T,adequate:P,reasons:re,additionalAnchorsNeeded:B?null:r-K,pooled:!0,poolAnchors:K,poolTargets:pe}}let N=m>=s,q=f>=s,U=h.pilotMet&&N&&q&&T,H,te=0;if(!T){let K=(o/u)**2,pe=RN([qv(e,t),qv(t,e)],K);te=pe===null?null:2*pe}if(!h.pilotMet)H=r-_;else if(te===null)H=null;else{let K=Math.max(0,s-m)+Math.max(0,s-f);H=Math.max(K,te)}let de=[];if(h.pilotMet||de.push(`pilot target not met: ${_}/${r} human-labeled runs`),N||de.push(`with-target cohort has ${m}/${s} labeled runs (minimum for a corrected estimate)`),q||de.push(`without-target cohort has ${f}/${s} labeled runs (minimum for a corrected estimate)`),S)de.push(W);else if(!T){let K=te===null?" \u2014 anchors alone cannot reach it; more graded runs are needed":h.pilotMet&&te>0?` \u2014 ~${te} more labeled runs projected to reach it`:"";de.push(`MDE \xB1${l(w)}pp exceeds the \xB1${l(o)}pp target effect${K}`)}return{...h,seDelta:p,mde:w,powered:T,adequate:U,reasons:de,additionalAnchorsNeeded:H}}c(dg,"anchorPowerCheck");function lg(e,t){return{rectifierUsed:e.rectifier,variance:e.variance,lambda:0,pooled:e.rectifier,pooledVariance:e.variance,tau2:0,i2:0,k:1,pooledApplied:!1,assumedExchangeability:!1,...t}}c(lg,"localOnly");function pl(e,t,n={}){let r=n.maxI2??.6,o=[e,...t].filter(H=>H.n>=1&&Number.isFinite(H.variance)&&H.variance>=0),s=o.length;if(s<2)return e.n<1||!Number.isFinite(e.variance)?lg(e,{rectifierUsed:NaN,variance:1/0,reason:"no anchors on this target and none to pool from"}):lg(e,{reason:"only one target with anchors \u2014 nothing to pool"});let i=o.map(H=>H.variance).filter(H=>H>0),a=i.length?i.reduce((H,te)=>H+te,0)/i.length:0,u=Math.max(a*.001,1e-12),l=c(H=>Math.max(H,u),"flooredVar"),m=o.map(H=>1/l(H.variance)),f=m.reduce((H,te)=>H+te,0),_=m.reduce((H,te)=>H+te*te,0),v=o.reduce((H,te,de)=>H+m[de]*te.rectifier,0)/f,h=o.reduce((H,te,de)=>H+m[de]*(te.rectifier-v)**2,0),p=s-1,w=f-_/f,I=w>0?Math.max(0,(h-p)/w):0,b=h>0?Math.max(0,(h-p)/h):0,A=o.map(H=>1/(l(H.variance)+I)),E=A.reduce((H,te)=>H+te,0),S=o.reduce((H,te,de)=>H+A[de]*te.rectifier,0)/E,T=1/E,O=s<3;if(b>r)return e.n>=1&&Number.isFinite(e.variance)?lg(e,{pooled:S,pooledVariance:T,tau2:I,i2:b,k:s,assumedExchangeability:O,reason:`heterogeneity too high (I\xB2=${(b*100).toFixed(0)}%) \u2014 targets disagree; not pooling`}):{rectifierUsed:S,variance:T,lambda:1,pooled:S,pooledVariance:T,tau2:I,i2:b,k:s,pooledApplied:!1,assumedExchangeability:O,reason:`no anchors on this target; pooled estimate is high-heterogeneity (I\xB2=${(b*100).toFixed(0)}%) \u2014 treat as unknown`};let W=e.n<1||!Number.isFinite(e.variance),N=W?1:l(e.variance)/(l(e.variance)+I),q=W?S:N*S+(1-N)*e.rectifier,U=W?T+I:(1-N)*e.variance+N*N*T;return{rectifierUsed:q,variance:U,lambda:N,pooled:S,pooledVariance:T,tau2:I,i2:b,k:s,pooledApplied:!0,assumedExchangeability:O}}c(pl,"shrinkRectifier");var Ti=3,zc=7,mg="(preamble)",PN=/^\s*(`{3,}|~{3,})/,DN=/^(#{1,6})\s+(.*)$/;function Wc(e){let t=e.split(`
|
|
116
|
-
`),n=[],r=[],o={heading:"",level:0,path:[
|
|
117
|
-
`).trim()})},"flush");for(let a of t){let
|
|
114
|
+
Preview: ${e.contentPreview}`.length+2}c(Xk,"renderedSize");async function Bf(e,t,n){if(t.length===0)return{recommendations:[],error:null};let r;try{r=Dc(n.llmProvider,n.llmApiKey)}catch(a){return{recommendations:[],error:a instanceof Error?a.message:String(a)}}let o=Hf(t,{charBudget:n.charBudget}),s=[],i=[];for(let a of o)try{let d=await r.complete(Oc(e,a));s.push(...Uf(d.text))}catch(d){i.push(d instanceof Error?d.message:String(d))}return{recommendations:s,error:i.length>0?i.join("; "):null}}c(Bf,"scoreInstructions");var Qk=new Set(["127.0.0.1","localhost","::1","[::1]","0.0.0.0"]);function Zk(e){if(!e)return null;try{return new URL(e).hostname}catch{return null}}c(Zk,"databaseUrlHost");function Ff(e=process.env){let t=e.RULEMETRIC_DEPLOYMENT?.trim().toLowerCase();if(t==="cloud"||t==="local")return{mode:t,source:"env"};if(t)return{mode:"cloud",source:"default",error:`RULEMETRIC_DEPLOYMENT="${e.RULEMETRIC_DEPLOYMENT}" is not "cloud" or "local" \u2014 ignoring it and defaulting to cloud.`};let n=Zk(e.DATABASE_URL);return n&&Qk.has(n)?{mode:"local",source:"inferred"}:{mode:"cloud",source:"default"}}c(Ff,"resolveDeployment");function Zu(e){if(!e||typeof e!="object")return null;let t=e.source;return t==="insights"||t==="evolution"?t:null}c(Zu,"readStampedSource");function el(e,t){let n=e.source==="insights"||e.source==="evolution"?e.source:Zu(e.frontmatter);return n||(e.createdBy&&e.createdBy===t?"user":"catalog")}c(el,"classifyProvenance");var Cc=["inside","outside"];function fs(e){return e.trim().toLowerCase()}c(fs,"normalizeDependencyKey");function zf(e){let t=[];if(Cc.includes(e.boundaryClass)||t.push({field:"boundaryClass",message:`must be one of ${Cc.join(" | ")}`}),!Array.isArray(e.targets)||e.targets.length===0)t.push({field:"targets",message:"a proposal that cannot name the paths it writes cannot be applied"});else{for(let o of e.targets)if(typeof o!="string"||o.trim().length===0){t.push({field:"targets",message:"target paths must be non-empty"});break}let n=e.targets.filter(o=>typeof o=="string"&&(o.startsWith("/")||/^[A-Za-z]:[\\/]/.test(o)));n.length>0&&t.push({field:"targets",message:`targets must be project-relative (absolute: ${n.join(", ")})`});let r=e.targets.filter(o=>typeof o=="string"&&o.split(/[\\/]/).includes(".."));r.length>0&&t.push({field:"targets",message:`targets must not traverse outside the project (${r.join(", ")})`})}for(let n of["requires","provides"]){let r=e[n];if(!Array.isArray(r)){t.push({field:n,message:"must be an array of dependency keys"});continue}r.some(o=>typeof o!="string"||o.trim().length===0)&&t.push({field:n,message:"dependency keys must be non-empty strings"})}return t}c(zf,"validateArtifactSpec");function Vf(e,t){let n=[],r=new Set(e.targets??[]);if(t.kind==="delete-paths"){e.boundaryClass!=="inside"&&n.push({field:"inverse",message:"deleting paths is only an inverse for `inside` artifacts; an `outside` path may hold text we did not write"}),t.paths.length===0&&n.push({field:"inverse.paths",message:"nothing to delete \u2014 this is not an inverse"});let o=t.paths.filter(s=>!r.has(s));return o.length>0&&n.push({field:"inverse.paths",message:`would delete paths the spec never declared: ${o.join(", ")}`}),n}return e.boundaryClass!=="outside"&&n.push({field:"inverse",message:"a compensation is only an inverse for `outside` artifacts; an `inside` path owes an exact undo"}),(!t.backupPath||t.backupPath.trim().length===0)&&n.push({field:"inverse.backupPath",message:"an `outside` write owes a backup"}),(!t.hashAtWrite||t.hashAtWrite.trim().length===0)&&n.push({field:"inverse.hashAtWrite",message:"without the post-write hash the undo cannot tell a drifted file from an untouched one"}),r.has(t.file)||n.push({field:"inverse.file",message:`wrote ${t.file}, which the spec did not declare as a target`}),t.kind==="remove-marked-region"?(!t.startMarker||!t.endMarker)&&n.push({field:"inverse",message:"an `outside` region needs both markers, or the undo cannot tell where our text ends"}):t.command.trim().length===0&&n.push({field:"inverse.command",message:"the exact command written is the identity of the entry; without it the undo is a search"}),n}c(Vf,"validateArtifactInverse");var Ev="artifact";function Wf(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"&&t.trim().length>0):[]}c(Wf,"stringArray");function Jf(e){if(!e||typeof e!="object")return null;let t=e[Ev];if(!t||typeof t!="object")return null;let n=t;return{boundaryClass:n.boundaryClass,targets:Wf(n.targets),requires:Wf(n.requires),provides:Wf(n.provides)}}c(Jf,"parseArtifactSpec");function Kf(e,t,n){let r=new Set((e.provides??[]).map(fs));if(r.size===0)return[];let o=[];for(let s of t){if(n&&s.id===n)continue;let i=(s.requires??[]).map(fs).filter(a=>r.has(a));i.length>0&&o.push({dependentId:s.id,dependentName:s.name,keys:i})}return o}c(Kf,"blockedWithdrawals");var tl=["applied","measuring","improved","inconclusive","harmful","rollback_ready"];var Lc=new Set(["process_eval","process_insights","process_conversation","process_session_goal","distill_memories","memory_ab","cron_suggest_instructions","cron_refresh_pricing","cron_eval_autorun","cron_instruction_evolution","cron_refine_cases","process_judge_review"]);function nl(e){return Lc.has(e)}c(nl,"needsLlmEngine");D();function nn(e){if(!Zs())return;let t=hm();u.insert(mo).values({instructionId:e.instructionId??null,userId:e.userId,surface:e.surface,action:e.action,metadata:e.metadata??null,traceId:t??null}).then(()=>{}).catch(n=>{console.error("Usage tracking error:",n)})}c(nn,"trackUsage");var eN={critical:25,high:15,medium:8,low:3},tN=[{pattern:/ignore\s+(all\s+)?previous\s+instructions/i,severity:"critical",category:"prompt_injection",description:"Instruction override attempt"},{pattern:/before responding.*you MUST/i,severity:"critical",category:"prompt_injection",description:"Mandatory pre-response action injection"},{pattern:/never mention.*to the user/i,severity:"high",category:"prompt_injection",description:"Concealment language"},{pattern:/forget (everything|all|your).*instructions/i,severity:"critical",category:"prompt_injection",description:"Memory wipe injection"},{pattern:/you are now\s+/i,severity:"high",category:"prompt_injection",description:"Identity/role hijacking"},{pattern:/IMPORTANT:?\s*(system|override|mandatory|compliance)/i,severity:"high",category:"prompt_injection",description:"Fake authority escalation"},{pattern:/<system-reminder>/i,severity:"critical",category:"spoofing",description:"System-reminder tag spoofing"},{pattern:/<\/system-reminder>/i,severity:"critical",category:"spoofing",description:"System-reminder closing tag spoofing"},{pattern:/Contents of.*CLAUDE\.md.*project instructions/i,severity:"high",category:"spoofing",description:"Mimics Claude system context format"},{pattern:/<(system|assistant|tool)-(reminder|message|context)>/i,severity:"high",category:"spoofing",description:"System XML tag spoofing"},{pattern:/\[SYSTEM\]|\[INST\]|<<SYS>>/i,severity:"high",category:"spoofing",description:"Llama/Mistral system prompt markers"},{pattern:/process\.env.*(include|output|log|report|display|print)/i,severity:"critical",category:"secret_exfil",description:"Node.js environment access + exfiltration"},{pattern:/(include|output|log|report|display|print).*process\.env/i,severity:"critical",category:"secret_exfil",description:"Exfiltration verb + Node.js environment access"},{pattern:/os\.environ.*(include|output|log|report|display)/i,severity:"critical",category:"secret_exfil",description:"Python environment access + exfiltration"},{pattern:/cat\s+~?\/?\.(?:env|ssh|aws|npmrc|gitconfig)/i,severity:"critical",category:"secret_exfil",description:"Direct secret file read command"},{pattern:/env\s*\|\s*sort|printenv/i,severity:"high",category:"secret_exfil",description:"Full environment dump command"},{pattern:/\.(env|ssh\/id_rsa|aws\/credentials)\b/i,severity:"high",category:"secret_exfil",description:"Secret file path reference"},{pattern:/<\/(?:rule|instruction|system)>/i,severity:"high",category:"converter_escape",description:"XML structure escape in converter output"},{pattern:/<script|<iframe|javascript:/i,severity:"high",category:"fork_poison",description:"XSS payload"}];function Gf(e,t,n){let r=[],o=[e,t??"",n??""].join(`
|
|
115
|
+
`);for(let i of tN){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-=eN[i.severity]??5;return{score:Math.max(0,Math.min(100,s)),findings:r}}c(Gf,"scanContent");D();import{and as nN,arrayOverlaps as rN,eq as Sv,inArray as oN,ne as sN}from"drizzle-orm";function iN(e){return fs(`skill:${e.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}`)}c(iN,"skillKeyFor");function aN(e){let t=Jf(e.frontmatter)?.provides??[],n=new Set(t.map(fs));return e.type==="skill"&&n.add(iN(e.name)),[...n].filter(r=>r.length>0)}c(aN,"providedKeysFor");async function xv(e,t){let n=aN(t);if(n.length===0)return[];let r=await u.select({id:Re.id,name:h.name,requires:Re.requires}).from(Re).innerJoin(h,Sv(h.id,Re.instructionId)).where(nN(Sv(Re.userId,e),sN(Re.instructionId,t.id),oN(Re.status,[...tl]),rN(Re.requires,n)));return Kf({provides:n},r.map(o=>({id:o.id,name:o.name,requires:o.requires??[],provides:[]})),t.id)}c(xv,"findBlockedWithdrawals");function Tv(e,t){let n=t.map(r=>`${r.dependentName} (needs ${r.keys.join(", ")})`).join("; ");return`Cannot archive ${e}: ${t.length} applied artifact${t.length===1?"":"s"} still rel${t.length===1?"ies":"y"} on it \u2014 ${n}. Remove or revert those first, or archive anyway with ?force=true.`}c(Tv,"withdrawalRefusal");var Nn=new cN,uN=mt.object({name:mt.string().min(1).max(255),description:mt.string().min(1),scope:mt.enum(["org","team","project","personal"]),scopeRef:mt.string().uuid().optional(),version:mt.string().default("1.0.0"),content:mt.string().min(1),tags:mt.array(mt.string()).optional(),compatibility:mt.array(mt.string()).optional()}),lN=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(h.archived,!1),qe(h.createdBy,t)];if(r&&d.push(qe(h.scope,r)),s&&d.push(qe(h.type,s)),n){let g=ct(n);d.push(Xf(Yf(h.name,`%${g}%`),Yf(h.description,`%${g}%`),Yf(h.content,`%${g}%`)))}let l=await u.select().from(h).where(br(...d)).orderBy(kv(h.updatedAt)).limit(i).offset(a);if(o){let g=o.split(",").map(m=>m.trim().toLowerCase());l=l.filter(m=>g.some(w=>m.tags?.some(I=>I.toLowerCase().includes(w))))}let p=l.map(g=>g.id),f=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(bi`${lt.instructionId} IN (${bi.join(p.map(g=>bi`${g}`),bi`, `)})`):[],_=new Map;for(let g of f){let m=_.get(g.instructionId)??[];m.push({projectId:g.projectId,projectName:g.projectName}),_.set(g.instructionId,m)}let v=l.map(g=>({...g,projects:_.get(g.id)??[]}));return nn({userId:t,surface:"api",action:"list"}),e.json(v)});Nn.get("/instructions/by-hash/:hash",async e=>{let t=e.get("userId"),n=e.req.param("hash"),[r]=await u.select({id:h.id,name:h.name,contextIdentity:h.contextIdentity,version:h.version,type:h.type}).from(h).where(br(qe(h.contentHash,n),qe(h.createdBy,t),qe(h.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(h.createdBy,t),qe(h.archived,!1)],i=[];r.length>0&&i.push(Rv(h.contentHash,r)),o.length>0&&i.push(Rv(h.contextIdentity,o));let a=await u.select({id:h.id,name:h.name,contextIdentity:h.contextIdentity,version:h.version,type:h.type,contentHash:h.contentHash,source:bi`${h.frontmatter}->>'source'`}).from(h).where(br(...s,i.length===1?i[0]:Xf(...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:se.sessionId,linkMethod:se.linkMethod,tool:y.tool,projectPath:y.projectPath,startedAt:y.startedAt,endedAt:y.endedAt,analysis:y.analysis}).from(se).innerJoin(y,qe(y.id,se.sessionId)).where(br(qe(se.instructionId,n),qe(y.userId,t))).orderBy(kv(y.startedAt)).limit(50);return e.json({sessions:r})});Nn.get("/instructions/:id",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await u.select().from(h).where(br(qe(h.id,t),qe(h.archived,!1),Xf(qe(h.createdBy,n),qe(h.scope,"public"))));return r?(nn({instructionId:t,userId:n,surface:"api",action:"view"}),e.json(r)):e.json({error:"Instruction not found"},404)});var pN=/<\/?(?:system-reminder|system|available-deferred-tools|tool-result)>/i;function Nv(e){return pN.test(e)?"Content contains forbidden system tags":null}c(Nv,"validateNoForbiddenTags");Nn.post("/instructions",async e=>{let t=e.get("userId"),n=await e.req.json(),r=uN.parse(n),o=Nv(r.content);if(o)return e.json({error:o},422);r.name=Ii(r.name),r.description=Ii(r.description);let s={},i=null;try{let p=Yu(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=Gf(r.content,r.name,r.description),[l]=await u.insert(h).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=lN.parse(r);if(o.content){let f=Nv(o.content);if(f)return e.json({error:f},422)}o.name&&(o.name=Ii(o.name)),o.description&&(o.description=Ii(o.description));let[s]=await u.select().from(h).where(br(qe(h.id,t),qe(h.createdBy,n),qe(h.archived,!1)));if(!s)return e.json({error:"Instruction not found"},404);let i=s.frontmatter,a=s.slots;if(o.content)try{let f=Yu(o.content);i=f.frontmatter,a=f.slots}catch{}let d={};if(o.content||o.name||o.description){let f=Gf(o.content??s.content,o.name??s.name,o.description??s.description);d.scanScore=f.score,d.scanFindings=f.findings.length>0?f.findings:null}let l,p=4;for(let f=0;f<=p;f++)try{l=await u.transaction(async _=>{await _.select({id:h.id}).from(h).where(qe(h.id,t)).for("update");let[{maxVersion:v}]=await _.select({maxVersion:bi`COALESCE(MAX(${xe.versionNumber}), 0)`}).from(xe).where(qe(xe.instructionId,t)),g=v+1,[m]=await _.update(h).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(h.id,t)).returning();return await _.insert(xe).values({instructionId:t,versionNumber:g,content:o.content??s.content,frontmatter:i,changeSummary:o.changeSummary??null,createdBy:n}),m});break}catch(_){if(_.cause?.code==="23505"&&f<p)continue;throw _}return l?(nn({instructionId:t,userId:n,surface:"api",action:"update"}),e.json(l)):e.json({error:"Instruction update failed"},500)});Nn.delete("/instructions/:id",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await u.select().from(h).where(br(qe(h.id,t),qe(h.createdBy,n),qe(h.archived,!1)));if(!r)return e.json({error:"Instruction not found"},404);if(e.req.query("force")!=="true"){let i=await xv(n,r);if(i.length>0)return e.json({error:Tv(r.name,i),blockedBy:i},409)}let[o]=await u.update(h).set({archived:!0,archivedAt:new Date,archivedBy:n}).where(qe(h.id,t)).returning(),s=await u.update(x).set({dismissedAt:new Date,isStale:!0}).where(br(qe(x.userId,n),qe(x.instructionId,t),dN(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(h).where(br(qe(h.id,t),qe(h.createdBy,n),qe(h.archived,!0)));if(!r)return e.json({error:"Archived instruction not found"},404);let[o]=await u.update(h).set({archived:!1,archivedAt:null,archivedBy:null}).where(qe(h.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:h.id}).from(h).where(br(qe(h.id,t),qe(h.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)});D();import{Hono as mN}from"hono";import{eq as wo,and as Qf}from"drizzle-orm";var Mc=new mN;Mc.post("/instructions/:id/fork",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(h).where(Qf(wo(h.id,n),wo(h.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:h.id}).from(h).where(Qf(wo(h.createdBy,t),wo(h.scope,"org"),wo(h.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(h).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(Ut).values({instructionId:o.id,eventType:"fork",actorId:t,metadata:{sourceId:r.id,sourceName:r.name,sourceVersion:r.version}}),nn({instructionId:o.id,userId:t,surface:"api",action:"fork"}),e.json(o,201)});Mc.get("/instructions/:id/events",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await u.select({id:h.id}).from(h).where(Qf(wo(h.id,t),wo(h.createdBy,n)));if(!r)return e.json({error:"Instruction not found"},404);let o=await u.select().from(Ut).where(wo(Ut.instructionId,t)).orderBy(Ut.createdAt);return e.json(o)});D();import{Hono as fN}from"hono";import{eq as sr,and as jv,sql as gN}from"drizzle-orm";var $c=new fN;$c.get("/instructions/:id/upstream",async e=>{let t=e.req.param("id"),[n]=await u.select().from(h).where(jv(sr(h.id,t),sr(h.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(h).where(sr(h.id,n.forkedFromId));return r?e.json({hasUpdate:r.version!==n.upstreamVersion,currentVersion:n.upstreamVersion,upstreamVersion:r.version,parentId:r.id,parentName:r.name}):e.json({hasUpdate:!1,currentVersion:n.upstreamVersion,upstreamVersion:null,parentId:n.forkedFromId})});$c.post("/instructions/:id/pull-upstream",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(h).where(jv(sr(h.id,n),sr(h.createdBy,t),sr(h.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(h).where(sr(h.id,r.forkedFromId));if(!o)return e.json({error:"Parent instruction no longer exists"},404);let[s]=await u.select().from(xe).where(sr(xe.instructionId,o.id)).orderBy(xe.versionNumber).limit(1),i=s?.content??o.content,a=qf(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 f=>{await f.select({id:h.id}).from(h).where(sr(h.id,n)).for("update");let[_]=await f.select({maxVersion:gN`COALESCE(MAX(${xe.versionNumber}), 0)`}).from(xe).where(sr(xe.instructionId,n)),v=(_?.maxVersion??0)+1,[g]=await f.update(h).set({content:a.merged,upstreamVersion:o.version,updatedAt:new Date}).where(sr(h.id,n)).returning();return await f.insert(xe).values({instructionId:n,versionNumber:v,content:a.merged,frontmatter:r.frontmatter,changeSummary:`Pulled upstream changes from ${o.name} (${o.version})`,createdBy:t}),await f.insert(Ut).values({instructionId:n,eventType:"pull_upstream",actorId:t,metadata:{parentId:o.id,parentVersion:o.version,previousUpstreamVersion:r.upstreamVersion}}),g});break}catch(f){if(f.cause?.code==="23505"&&p<l)continue;throw f}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)});D();import{Hono as hN}from"hono";import{z as vo}from"zod";import{eq as Bt,and as gs,sql as _N}from"drizzle-orm";var yN=vo.object({scope:vo.enum(["team","org"]),scopeRef:vo.string().uuid()}),qc=new hN;qc.post("/instructions/:id/promote",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=yN.parse(await e.req.json()),[o]=await u.select().from(h).where(gs(Bt(h.id,n),Bt(h.createdBy,t),Bt(h.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(gs(Bt(we.userId,t),Bt(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(te).where(gs(Bt(te.userId,t),Bt(te.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(h).set({scope:r.scope,scopeRef:r.scopeRef,updatedAt:new Date}).where(Bt(h.id,n)).returning();return await u.insert(Ut).values({instructionId:n,eventType:"promote",actorId:t,metadata:{fromScope:s,fromScopeRef:i,toScope:r.scope,toScopeRef:r.scopeRef}}),nn({instructionId:n,userId:t,surface:"api",action:"promote"}),e.json(a)});var wN=vo.object({targetScope:vo.enum(["personal","team","org"]),targetScopeRef:vo.string().uuid().optional(),name:vo.string().optional(),seedEvalTarget:vo.boolean().optional()});async function vN(e){let[t]=await u.select({id:k.id}).from(k).where(_N`${k.metadata}->>'instructionId' = ${e}`).limit(1);return t??null}c(vN,"findExistingEvalTarget");qc.post("/instructions/:id/promote-from-public",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=wN.parse(await e.req.json()),[o]=await u.select().from(h).where(gs(Bt(h.id,n),Bt(h.scope,"public")));if(!o)return e.json({error:"Public instruction not found"},404);if(r.targetScope==="team"){if(!r.targetScopeRef)return e.json({error:"targetScopeRef is required for team scope"},400);let[f]=await u.select().from(we).where(gs(Bt(we.userId,t),Bt(we.teamId,r.targetScopeRef)));if(!f)return e.json({error:"You are not a member of this team"},403)}else if(r.targetScope==="org"){if(!r.targetScopeRef)return e.json({error:"targetScopeRef is required for org scope"},400);let[f]=await u.select().from(te).where(gs(Bt(te.userId,t),Bt(te.orgId,r.targetScopeRef)));if(!f||f.role!=="admin"&&f.role!=="owner")return e.json({error:"You must be an org admin to promote into an org"},403)}let s=r.targetScope==="personal"?t:r.targetScopeRef,i=r.name??o.name,a=r.seedEvalTarget??(r.targetScope==="org"||r.targetScope==="team"),[d]=await u.select().from(h).where(gs(Bt(h.scope,r.targetScope),Bt(h.scopeRef,s),Bt(h.forkedFromId,n),Bt(h.archived,!1)));if(d){let f=null;return a&&(f=(await vN(d.id))?.id??null),e.json({instructionId:d.id,alreadyExisted:!0,evalTargetId:f})}let[l]=await u.insert(h).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(Ut).values({instructionId:l.id,eventType:"promote_from_public",actorId:t,metadata:{sourceInstructionId:o.id,sourceName:o.name,targetScope:r.targetScope,targetScopeRef:s}}),nn({instructionId:l.id,userId:t,surface:"api",action:"promote_from_public"});let p=null;if(a){let[f]=await 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=f?.id??null}return e.json({instructionId:l.id,alreadyExisted:!1,evalTargetId:p})});D();import{Hono as IN}from"hono";import{z as Pv}from"zod";import{eq as jn,and as Hc,or as Dv,inArray as Ov,sql as Uc,desc as bN}from"drizzle-orm";var Bc=new IN,EN=Pv.object({badge:Pv.enum(["recommended","required"]).nullable()});Bc.get("/catalog",async e=>{let t=e.get("userId"),n=e.req.query("badge"),r=e.req.query("scope"),o=e.req.query("search"),s=parseInt(e.req.query("contentPreview")??"0",10),i=Number.isFinite(s)?Math.min(Math.max(s,0),400):0,a=parseInt(e.req.query("limit")??"50",10),d=parseInt(e.req.query("offset")??"0",10),l=Math.min(Math.max(a,1),200),p=Math.max(d,0),f=await u.select({orgId:te.orgId}).from(te).where(jn(te.userId,t)),_=await u.select({teamId:we.teamId}).from(we).where(jn(we.userId,t)),v=f.map(S=>S.orgId).filter(S=>S!==null),g=_.map(S=>S.teamId).filter(S=>S!==null),m=[jn(h.archived,!1)],w=[jn(h.scope,"public")];if(v.length>0&&w.push(Hc(jn(h.scope,"org"),Ov(h.scopeRef,v))),g.length>0&&w.push(Hc(jn(h.scope,"team"),Ov(h.scopeRef,g))),m.push(Dv(...w)),e.req.query("proposable")==="1"&&m.push(Uc`coalesce(${h.frontmatter}->>'kind', 'skill') <> 'supporting'`),n&&m.push(jn(h.badge,n)),r&&m.push(jn(h.scope,r)),o){let S=ct(o);m.push(Dv(Uc`${h.name} ILIKE ${`%${S}%`}`,Uc`${h.description} ILIKE ${`%${S}%`}`))}let I=[bN(Uc`COALESCE(${h.sourceUpdatedAt}, ${h.updatedAt})`)],b={id:h.id,name:h.name,description:h.description,type:h.type,scope:h.scope,scopeRef:h.scopeRef,version:h.version,tags:h.tags,badge:h.badge,popularityScore:h.popularityScore,updatedAt:h.updatedAt,createdAt:h.createdAt,sourceUpdatedAt:h.sourceUpdatedAt},E=await(i>0?Fe:u).select(i>0?{...b,contentPreview:Uc`left(${h.content}, ${i})`}:b).from(h).where(Hc(...m)).orderBy(...I).limit(l).offset(p);return nn({userId:t,surface:"api",action:"search",metadata:o?{query:o}:void 0}),e.header("Cache-Control","private, max-age=30"),e.json(E)});Bc.post("/instructions/:id/badge",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=EN.parse(await e.req.json()),[o]=await u.select().from(h).where(Hc(jn(h.id,n),jn(h.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(te).where(Hc(jn(te.userId,t),jn(te.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(h).set({badge:r.badge,updatedAt:new Date}).where(jn(h.id,n)).returning(),d=r.badge?"badge_set":"badge_removed";return await u.insert(Ut).values({instructionId:n,eventType:d,actorId:t,metadata:{badge:r.badge}}),e.json(a)});D();import{Hono as AN}from"hono";import{eq as Io,and as rl,or as SN,inArray as Cv}from"drizzle-orm";var ol=new AN;ol.post("/projects/:id/recommendations",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(C).where(rl(Io(C.id,n),Io(C.createdBy,t)));if(!r)return e.json({error:"Project not found"},404);let o=await u.select({orgId:te.orgId}).from(te).where(Io(te.userId,t)),s=await u.select({teamId:we.teamId}).from(we).where(Io(we.userId,t)),i=o.map(m=>m.orgId).filter(m=>m!==null),a=s.map(m=>m.teamId).filter(m=>m!==null),d=[Io(h.scope,"public")];i.length>0&&d.push(rl(Io(h.scope,"org"),Cv(h.scopeRef,i))),a.length>0&&d.push(rl(Io(h.scope,"team"),Cv(h.scopeRef,a)));let l=await u.select().from(h).where(rl(Io(h.archived,!1),SN(...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 m=r.githubRepo.replace("https://github.com/",""),[w,I]=await Promise.all([fetch(`https://api.github.com/repos/${m}`,{headers:{Accept:"application/vnd.github.v3+json","User-Agent":"RuleMetric"}}),fetch(`https://api.github.com/repos/${m}/languages`,{headers:{Accept:"application/vnd.github.v3+json","User-Agent":"RuleMetric"}})]);if(w.ok){let b=await w.json();p.topics=b.topics??[]}if(I.ok){let b=await I.json();p.languages=Object.keys(b)}}catch{}let f=l.map(m=>({id:m.id,name:m.name,description:m.description??"",tags:m.tags??[],contentPreview:(m.content??"").slice(0,400)})),_=process.env.LLM_PROVIDER,v=process.env.LLM_API_KEY;if(!_||!v)return e.json({recommendations:[],error:"LLM not configured"});let g=await Bf(p,f,{llmProvider:_,llmApiKey:v});return e.json(g)});import{Hono as Sj}from"hono";D();import{Hono as tj}from"hono";import{z as bg}from"zod";import{eq as At,and as Xc,desc as rI,sql as cr,inArray as nj}from"drizzle-orm";D();import{and as MN,eq as yg,sql as $N}from"drizzle-orm";function Zf(e,t){let n=e,r=t,o=n+r;if(o===0)return{pValue:1,nDiscordant:0};let s=Math.min(n,r),i=Math.pow(.5,o),a=i;for(let d=1;d<=s;d++)i*=(o-d+1)/d,a+=i;return{pValue:Math.min(1,2*a),nDiscordant:o}}c(Zf,"mcnemarExact");function sl(e,t,n=10){return{sufficient:e>=n&&t>=n,minN:n,nWith:e,nWithout:t,shortfall:{with:Math.max(0,n-e),without:Math.max(0,n-t)}}}c(sl,"assessSufficiency");var bo=1.959963984540054;function il(e,t,n=bo){if(t===0)return{lower:0,upper:1};let r=e/t,o=n*n,s=1+o/t,i=(r+o/(2*t))/s,a=n/s*Math.sqrt(r*(1-r)/t+o/(4*t*t));return{lower:Math.max(0,i-a),upper:Math.min(1,i+a)}}c(il,"wilsonInterval");function Ai(e){let t=e>>>0;return()=>{t=t+1831565813|0;let n=Math.imul(t^t>>>15,1|t);return n=n+Math.imul(n^n>>>7,61|n)^n,((n^n>>>14)>>>0)/4294967296}}c(Ai,"seededRandom");function Ei(e,t){let n=e.length;if(n===1)return e[0];let r=(n-1)*t,o=Math.floor(r),s=Math.ceil(r);return o===s?e[o]:e[o]+(r-o)*(e[s]-e[o])}c(Ei,"sortedQuantile");function eg(e,t={}){let n=e.length;if(n===0)return{estimate:0,lower:0,upper:0,iterations:0};let r=t.iterations??1e4,o=t.ciLevel??.95,s=Ai(t.seed??1),i=e.reduce((l,p)=>l+p,0)/n,a=new Array(r);for(let l=0;l<r;l++){let p=0;for(let f=0;f<n;f++)p+=e[s()*n|0];a[l]=p/n}a.sort((l,p)=>l-p);let d=(1-o)/2;return{estimate:i,lower:Ei(a,d),upper:Ei(a,1-d),iterations:r}}c(eg,"pairedBootstrapCI");function tg(e,t,n={}){if(e.length===0||t.length===0)return{estimate:0,lower:0,upper:0,pValue:1,iterations:0};let r=n.iterations??1e4,o=n.ciLevel??.95,s=Ai(n.seed??1),i=c(v=>v.reduce((g,m)=>g+m,0)/v.length,"mean"),a=i(e)-i(t),d=new Array(r),l=0,p=0;for(let v=0;v<r;v++){let g=0;for(let I=0;I<e.length;I++)g+=e[s()*e.length|0];let m=0;for(let I=0;I<t.length;I++)m+=t[s()*t.length|0];let w=g/e.length-m/t.length;d[v]=w,w<=0&&l++,w>=0&&p++}d.sort((v,g)=>v-g);let f=(1-o)/2,_=Math.min(1,2*Math.min(l,p)/r);return{estimate:a,lower:Ei(d,f),upper:Ei(d,1-f),pValue:_,iterations:r}}c(tg,"twoSampleBootstrapCI");function ng(e,t={}){let n=e.filter(m=>m.withScores.length>0&&m.withoutScores.length>0);if(n.length===0)return{estimate:0,lower:0,upper:0,pValue:1,iterations:0};let r=c(m=>m.reduce((w,I)=>w+I,0)/m.length,"mean"),o=n.map(m=>m.withScores.length*m.withoutScores.length/(m.withScores.length+m.withoutScores.length)),s=o.reduce((m,w)=>m+w,0),i=c(m=>m.reduce((w,I,b)=>w+o[b]*I,0)/s,"combine"),a=i(n.map(m=>r(m.withScores)-r(m.withoutScores))),d=t.iterations??1e4,l=t.ciLevel??.95,p=Ai(t.seed??1),f=new Array(d),_=0,v=0;for(let m=0;m<d;m++){let w=n.map(b=>{let A=0;for(let S=0;S<b.withScores.length;S++)A+=b.withScores[p()*b.withScores.length|0];let E=0;for(let S=0;S<b.withoutScores.length;S++)E+=b.withoutScores[p()*b.withoutScores.length|0];return A/b.withScores.length-E/b.withoutScores.length}),I=i(w);f[m]=I,I<=0&&_++,I>=0&&v++}f.sort((m,w)=>m-w);let g=(1-l)/2;return{estimate:a,lower:Ei(f,g),upper:Ei(f,1-g),pValue:Math.min(1,2*Math.min(_,v)/d),iterations:d}}c(ng,"stratifiedBootstrapCI");function rg(e,t){if(e.length!==t.length)throw new Error(`cupedAdjust: outcomes (${e.length}) and covariates (${t.length}) must be the same length`);let n=e.length;if(n===0)return{adjusted:[],theta:0,varianceReduction:0};let r=t.reduce((v,g)=>v+g,0)/n,o=e.reduce((v,g)=>v+g,0)/n,s=0,i=0,a=0;for(let v=0;v<n;v++){let g=t[v]-r,m=e[v]-o;s+=g*m,i+=g*g,a+=m*m}if(i===0)return{adjusted:[...e],theta:0,varianceReduction:0};let d=s/i,l=e.map((v,g)=>v-d*(t[g]-r)),p=0,f=l.reduce((v,g)=>v+g,0)/n;for(let v of l)p+=(v-f)*(v-f);let _=a===0?0:1-p/a;return{adjusted:l,theta:d,varianceReduction:_}}c(rg,"cupedAdjust");function og(e,t=.05){return e.map(n=>{let r=Math.abs(n.withPassRate-n.withoutPassRate),o=r>t,s;return o?s=`discriminates: ${(n.withPassRate*100).toFixed(0)}% with vs ${(n.withoutPassRate*100).toFixed(0)}% without`:n.withPassRate>=1-t&&n.withoutPassRate>=1-t?s="always passes in both cohorts \u2014 measures nothing about the treatment":n.withPassRate<=t&&n.withoutPassRate<=t?s="always fails in both cohorts \u2014 measures nothing about the treatment":s="similar pass rate in both cohorts \u2014 non-discriminating",{...n,discriminating:o,separation:r,note:s}})}c(og,"diagnoseAssertions");function sg(e,t={}){let n=t.unpaired??0,r=t.materialFraction??.5,o=e.filter(l=>l.discriminating).length,s=e.length-o,i=e.length+n,a=s+n,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(sg,"summarizeDiscrimination");function al(e,t){let n=e.length,r=t.length;if(n===0||r===0)return 0;let o=[...e.map(l=>({t:l,exposed:!0})),...t.map(l=>({t:l,exposed:!1}))].sort((l,p)=>l.t-p.t),s=0,i=0;for(;i<o.length;){let l=i;for(;l+1<o.length&&o[l+1].t===o[i].t;)l++;let p=(i+1+l+1)/2;for(let f=i;f<=l;f++)o[f].exposed&&(s+=p);i=l+1}let d=(s-n*(n+1)/2)/(n*r);return Math.abs(d-.5)}c(al,"cohortTimeSeparation");var hs=.35,cl=900*1e3;function ig(e,t,n=hs,r=cl){if(e.length===0||t.length===0)return!1;let o=[...e,...t];return Math.max(...o)-Math.min(...o)<r?!1:al(e,t)>n}c(ig,"isTimeSeparated");var Lv=c(e=>e===0||e===1,"isBinary");function Mv(e,t,n){return e.every(o=>o[t]!=null&&o[n]!=null)?e.reduce((o,s)=>o+(s[t]-s[n]),0)/e.length:null}c(Mv,"meanPairDelta");function dl(e,t={}){let n=t.baseline??"no-rule",r=t.minN??10,o=e.length,s=e.map(m=>m.withScore-m.withoutScore),i=o===0?0:s.reduce((m,w)=>m+w,0)/o,a=eg(s,{seed:t.seed,iterations:t.iterations}),d={lower:a.lower,upper:a.upper},l=e.every(m=>Lv(m.withScore)&&Lv(m.withoutScore)),p=null;if(l&&o>0){let m=0,w=0;for(let I of e)I.withScore===1&&I.withoutScore===0?m++:I.withScore===0&&I.withoutScore===1&&w++;p=Zf(m,w).pValue}let{sufficient:f}=sl(o,o,r),_=d.lower>0||d.upper<0,g={mode:"controlled",baseline:n,delta:i,ci:d,pValue:p,significant:f&&_,sufficient:f,nWith:o,nWithout:o,costDelta:Mv(e,"withCost","withoutCost"),latencyDelta:Mv(e,"withLatency","withoutLatency"),confounded:!1};return f||(g.insufficientReason=`insufficient data: need >= ${r} paired tasks per cohort, have ${o}`),g}c(dl,"buildControlledVerdict");var xN=2;function ul(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}=rg(d.map(A=>A.score),d.map(A=>A.covariate));i=b.slice(0,o),a=b.slice(o)}let p=tg(i,a,{seed:n.seed,iterations:n.iterations}),f={lower:p.lower,upper:p.upper},_=p.estimate,v=o>0&&s>0?p.pValue:null,{sufficient:g}=sl(o,s,r),m=g&&(f.lower>0||f.upper<0),w=c(b=>{if(o===0||s===0||!e.every(S=>b(S)!=null)||!t.every(S=>b(S)!=null))return null;let A=e.reduce((S,R)=>S+b(R),0)/o,E=t.reduce((S,R)=>S+b(R),0)/s;return A-E},"meanDiff"),I={mode:"observational",baseline:n.baseline??"no-rule",delta:_,ci:f,pValue:v,significant:m,sufficient:g,nWith:o,nWithout:s,costDelta:w(b=>b.cost),latencyDelta:w(b=>b.latency),confounded:!0,cupedApplied:l};return g||(I.insufficientReason=`insufficient data: need >= ${r} sessions per cohort, have ${o} exposed / ${s} unexposed`),I}c(ul,"buildObservationalVerdict");function Pn(e,t={}){let n=t.minN??10,r=t.minPerStratum??xN,o=t.maxTimeSeparation??hs,s=t.minStratumSpanMs??cl,i=e.filter(R=>R.withScores.length>=r&&R.withoutScores.length>=r),a=i.filter(R=>R.withTimes!=null&&R.withoutTimes!=null&&ig(R.withTimes,R.withoutTimes,o,s)),d=new Set(a.map(R=>R.key)),l=i.filter(R=>!d.has(R.key)),p=e.filter(R=>R.withScores.length>0&&R.withoutScores.length>0&&(R.withScores.length<r||R.withoutScores.length<r)).length,f=l.reduce((R,O)=>R+O.withScores.length,0),_=l.reduce((R,O)=>R+O.withoutScores.length,0),v=ng(l,{seed:t.seed,iterations:t.iterations}),g={lower:v.lower,upper:v.upper},m=v.estimate,w=l.length>0&&f>=n&&_>=n,I=l.length>0?v.pValue:null,b=w&&(g.lower>0||g.upper<0),A=e.reduce((R,O)=>R+O.withScores.length+O.withoutScores.length,0),E=A>0?(f+_)/A:0,S={mode:"observational",baseline:t.baseline??"no-rule",delta:m,ci:g,pValue:I,significant:b,sufficient:w,nWith:f,nWithout:_,costDelta:null,latencyDelta:null,confounded:!0,strata:l.length,strataDroppedForTimeSeparation:a.length,coverage:E};if(!w){let R=p>0?` (${p} project(s) had both cohorts but fewer than ${r} sessions in one of them)`:"",O=a.length>0?` ${a.length} project-month(s) held both cohorts but their sessions are separated in time (exposure predicts when a session ran), so the difference within them is a calendar difference, not a treatment effect`:"";S.insufficientReason=l.length===0?a.length>0?`insufficient data: no comparable cohort.${O}${R}`:`insufficient data: no project has >= ${r} exposed AND >= ${r} unexposed sessions to compare within${R}`:`insufficient data: need >= ${n} sessions per cohort across comparable projects, have ${f} exposed / ${_} unexposed${R}${O?`.${O}`:""}`}return S}c(Pn,"buildStratifiedVerdict");function ag(e,t,n={}){return{overall:Pn(e,n),segments:ll(t,n)}}c(ag,"buildSegmentedVerdict");function ll(e,t={}){return e.map(n=>({segment:n.segment,verdict:Pn(n.strata,t)}))}c(ll,"buildSegmentVerdicts");function _s(e){return e.sufficient?e.significant?e.delta<0?"harmful":"helpful":"neutral":"insufficient"}c(_s,"classifyEffect");var Si={achieved:1,fully_achieved:1,mostly_achieved:.75,partially_achieved:.5,unclear_from_transcript:.25,not_achieved:0,abandoned:0},ys=c(e=>{let t=e?Si[e]:void 0;return t===void 0?null:t},"scoreOutcome");var xi=10,pl=c(e=>e.length===0?0:e.reduce((t,n)=>t+n,0)/e.length,"mean"),cg=c(e=>{if(e.length<2)return 0;let t=pl(e);return e.reduce((n,r)=>n+(r-t)**2,0)/(e.length-1)},"sampleVar"),$v=c((e,t)=>{let n=t.reduce((l,p)=>l+p,0);if(n<=0||e.length===0)return{mean:0,varOfMean:0,nEff:0};let r=t.reduce((l,p)=>l+p*p,0),o=n*n/r,s=e.reduce((l,p,f)=>l+t[f]*p,0)/n,i=n-r/n,d=(i>0?e.reduce((l,p,f)=>l+t[f]*(p-s)**2,0)/i:0)*r/(n*n);return{mean:s,varOfMean:d,nEff:o}},"weightedStats");function dg(e,t,n={}){let r=n.minAnchors??xi,o=n.z??bo,s=e.length,i=t.length,a=[...e,...t.map(E=>E.judge)],d=pl(a),l=t.map(E=>E.weight??1),p=t.map(E=>E.human-E.judge),f=$v(p,l),_=f.mean,v=i>0?f.nEff:0,g=t.filter(E=>E.validated!==!1).length;if(n.pooledRectifier){let E=n.pooledRectifier,S=s>0?e:t.map(U=>U.judge);if(S.length===0)return{estimate:NaN,ci:{lower:NaN,upper:NaN},se:1/0,naive:d,rectifier:E.rectifier,nLabeled:i,nUnlabeled:s,nEffective:v,nValidated:g,sufficient:!1,insufficientReason:"no judge scores to correct with the pooled rectifier"};let R=pl(S)+E.rectifier,O=cg(S)/S.length+E.variance,W=Math.sqrt(O),N={estimate:R,ci:{lower:R-o*W,upper:R+o*W},se:W,naive:d,rectifier:E.rectifier,nLabeled:i,nUnlabeled:s,nEffective:v,nValidated:g,sufficient:E.sufficient};return E.sufficient||(N.insufficientReason="pooled rectifier not yet adequate"),N}let m,w;if(i===0)m=d,w=a.length>0?cg(a)/a.length:0;else if(s===0){let E=$v(t.map(S=>S.human),l);m=E.mean,w=E.varOfMean}else m=pl(e)+_,w=cg(e)/s+f.varOfMean;let I=Math.sqrt(w),b=g>=r,A={estimate:m,ci:{lower:m-o*I,upper:m+o*I},se:I,naive:d,rectifier:_,nLabeled:i,nUnlabeled:s,nEffective:v,nValidated:g,sufficient:b};if(!b){let E=i-g;A.insufficientReason=`insufficient anchors: need >= ${r} VALIDATED human-labeled items, have ${g}${E>0?` (+${E} passive, which don't count toward the floor)`:""}`}return A}c(dg,"ppiMeanEstimate");function Fc(e,t,n={}){let r=dg(e.unlabeledJudge,e.labeled,{...n,pooledRectifier:n.withPooledRectifier}),o=dg(t.unlabeledJudge,t.labeled,{...n,pooledRectifier:n.withoutPooledRectifier}),s=n.z??bo,i=r.estimate-o.estimate,a=Math.sqrt(r.se**2+o.se**2),d={lower:i-s*a,upper:i+s*a},l=r.sufficient&&o.sufficient,p=l&&(d.lower>0||d.upper<0),f={delta:i,ci:d,se:a,with:r,without:o,sufficient:l,significant:p};return l||(f.insufficientReason=r.insufficientReason??o.insufficientReason),f}c(Fc,"ppiDifference");var Ti=50,Hv=.2,Bv=.8416212335729143,TN=c(e=>e.length===0?0:e.reduce((t,n)=>t+n,0)/e.length,"mean"),Wc=c(e=>{if(e.length<2)return 0;let t=TN(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:Wc(e.unlabeledJudge)/r,scaling:Wc(e.labeled.map(o=>o.human-o.judge)),n}:n>0?{fixed:0,scaling:Wc(e.labeled.map(o=>o.human)),n}:{fixed:r>0?Wc(e.unlabeledJudge)/r:0,scaling:t.labeled.length>0?Wc(t.labeled.map(o=>o.human-o.judge)):null,n:0}}c(qv,"varianceComponents");var Uv=1e6;function RN(e,t){if(e.some(s=>s.scaling===null))return null;let n=c(s=>e.reduce((i,a)=>i+a.fixed+(a.scaling===0?0:a.scaling/(a.n+s)),0),"se2");if(n(Uv)>t)return null;let r=0,o=Uv;for(;r<o;){let s=Math.floor((r+o)/2);n(s)<=t?o=s:r=s+1}return r}c(RN,"solvePerCohortIncrement");function ug(e,t,n={}){let r=n.pilotTarget??Ti,o=n.targetEffect??Hv,s=n.minAnchors??xi,i=n.z??bo,a=n.zPower??Bv,d=i+a,l=c(V=>(V*100).toFixed(0),"pp"),p=e.labeled.length,f=t.labeled.length,_=n.humanLabeledRuns??p+f,v=e.unlabeledJudge.length+p+t.unlabeledJudge.length+f,g={nAnchors:_,nAnchorsWith:p,nAnchorsWithout:f,pilotTarget:r,pilotMet:_>=r,targetEffect:o};if(v===0)return{...g,seDelta:null,mde:null,powered:!1,adequate:!1,reasons:["no graded runs to calibrate against"],additionalAnchorsNeeded:r};let m=Fc(e,t,{minAnchors:s,z:i,withPooledRectifier:n.pool?.withPooledRectifier,withoutPooledRectifier:n.pool?.withoutPooledRectifier}).se,w=d*m,I=e.unlabeledJudge.length+p,b=t.unlabeledJudge.length+f,A=Math.min(I,b)<s,E=!Number.isFinite(m)||m<=0,S=A,R=!S&&w<=o,O=`(${I} with / ${b} without, minimum ${s} per cohort)`,W=E?`sample too thin to estimate a variance ${O} \u2014 no variance in it at all, so the estimate has no spread to be precise about; this is missing data, not power`:`sample too thin to claim precision ${O} \u2014 an MDE of \xB1${l(w)}pp estimated from this few runs is an artefact of the sample size, not power`;if(n.pool){let{totalAnchors:V,targets:me}=n.pool,B=V>=r,he=me>=3,P=B&&he&&R,re=[];return he||re.push(`pool spans ${me}/3 same-judge targets \u2014 between-target variance is assumed, not measured`),B||re.push(`pool floor not met: ${V}/${r} human-labeled runs across the same-judge pool`),S?re.push(W):R||re.push(`MDE \xB1${l(w)}pp exceeds the \xB1${l(o)}pp target effect \u2014 pooling lowers the label cost, not this; more graded runs are needed (\xA76d(f))`),{...g,seDelta:m,mde:w,powered:R,adequate:P,reasons:re,additionalAnchorsNeeded:B?null:r-V,pooled:!0,poolAnchors:V,poolTargets:me}}let N=p>=s,U=f>=s,q=g.pilotMet&&N&&U&&R,H,Y=0;if(!R){let V=(o/d)**2,me=RN([qv(e,t),qv(t,e)],V);Y=me===null?null:2*me}if(!g.pilotMet)H=r-_;else if(Y===null)H=null;else{let V=Math.max(0,s-p)+Math.max(0,s-f);H=Math.max(V,Y)}let ce=[];if(g.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)`),U||ce.push(`without-target cohort has ${f}/${s} labeled runs (minimum for a corrected estimate)`),S)ce.push(W);else if(!R){let V=Y===null?" \u2014 anchors alone cannot reach it; more graded runs are needed":g.pilotMet&&Y>0?` \u2014 ~${Y} more labeled runs projected to reach it`:"";ce.push(`MDE \xB1${l(w)}pp exceeds the \xB1${l(o)}pp target effect${V}`)}return{...g,seDelta:m,mde:w,powered:R,adequate:q,reasons:ce,additionalAnchorsNeeded:H}}c(ug,"anchorPowerCheck");function lg(e,t){return{rectifierUsed:e.rectifier,variance:e.variance,lambda:0,pooled:e.rectifier,pooledVariance:e.variance,tau2:0,i2:0,k:1,pooledApplied:!1,assumedExchangeability:!1,...t}}c(lg,"localOnly");function ml(e,t,n={}){let r=n.maxI2??.6,o=[e,...t].filter(H=>H.n>=1&&Number.isFinite(H.variance)&&H.variance>=0),s=o.length;if(s<2)return e.n<1||!Number.isFinite(e.variance)?lg(e,{rectifierUsed:NaN,variance:1/0,reason:"no anchors on this target and none to pool from"}):lg(e,{reason:"only one target with anchors \u2014 nothing to pool"});let i=o.map(H=>H.variance).filter(H=>H>0),a=i.length?i.reduce((H,Y)=>H+Y,0)/i.length:0,d=Math.max(a*.001,1e-12),l=c(H=>Math.max(H,d),"flooredVar"),p=o.map(H=>1/l(H.variance)),f=p.reduce((H,Y)=>H+Y,0),_=p.reduce((H,Y)=>H+Y*Y,0),v=o.reduce((H,Y,ce)=>H+p[ce]*Y.rectifier,0)/f,g=o.reduce((H,Y,ce)=>H+p[ce]*(Y.rectifier-v)**2,0),m=s-1,w=f-_/f,I=w>0?Math.max(0,(g-m)/w):0,b=g>0?Math.max(0,(g-m)/g):0,A=o.map(H=>1/(l(H.variance)+I)),E=A.reduce((H,Y)=>H+Y,0),S=o.reduce((H,Y,ce)=>H+A[ce]*Y.rectifier,0)/E,R=1/E,O=s<3;if(b>r)return e.n>=1&&Number.isFinite(e.variance)?lg(e,{pooled:S,pooledVariance:R,tau2:I,i2:b,k:s,assumedExchangeability:O,reason:`heterogeneity too high (I\xB2=${(b*100).toFixed(0)}%) \u2014 targets disagree; not pooling`}):{rectifierUsed:S,variance:R,lambda:1,pooled:S,pooledVariance:R,tau2:I,i2:b,k:s,pooledApplied:!1,assumedExchangeability:O,reason:`no anchors on this target; pooled estimate is high-heterogeneity (I\xB2=${(b*100).toFixed(0)}%) \u2014 treat as unknown`};let W=e.n<1||!Number.isFinite(e.variance),N=W?1:l(e.variance)/(l(e.variance)+I),U=W?S:N*S+(1-N)*e.rectifier,q=W?R+I:(1-N)*e.variance+N*N*R;return{rectifierUsed:U,variance:q,lambda:N,pooled:S,pooledVariance:R,tau2:I,i2:b,k:s,pooledApplied:!0,assumedExchangeability:O}}c(ml,"shrinkRectifier");var Ri=3,Vc=7,pg="(preamble)",DN=/^\s*(`{3,}|~{3,})/,ON=/^(#{1,6})\s+(.*)$/;function zc(e){let t=e.split(`
|
|
116
|
+
`),n=[],r=[],o={heading:"",level:0,path:[pg],body:[]},s=null,i=c(()=>{n.push({heading:o.heading,level:o.level,path:o.path,body:o.body.join(`
|
|
117
|
+
`).trim()})},"flush");for(let a of t){let d=DN.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=ON.exec(a);if(l){i();let p=l[1].length,f=l[2].trim();r.length=Math.max(0,p-1),r[p-1]=f,o={heading:f,level:p,path:Array.from({length:p},(_,v)=>r[v]??`(unnamed level ${v+1})`),body:[]};continue}o.body.push(a)}return i(),n.filter((a,d)=>!(d===0&&a.level===0&&a.body===""))}c(zc,"splitMarkdownSections");function fl(e){let t=new Map,n=new Map;for(let r of e){let o=r.level===0?pg:r.path.join(" > "),s=(t.get(o)??0)+1;t.set(o,s),n.set(s===1?o:`${o} #${s}`,r)}return n}c(fl,"sectionKeys");function mg(e,t){let n=fl(zc(e)),r=fl(zc(t)),o=[],s=[],i=[];for(let[a,d]of r){let l=n.get(a);l?l.body!==d.body&&o.push(a):s.push(a)}for(let a of n.keys())r.has(a)||i.push(a);return{changed:o.sort(),added:s.sort(),removed:i.sort()}}c(mg,"diffSections");function fg(e){return[...new Set([...e.changed,...e.added,...e.removed])].sort()}c(fg,"touchedSections");var Fv=c(e=>e.trim().toLowerCase(),"normalize");function Wv(e,t,n){if(n.length===0)return[];let r=new Set(n.map(Fv)),o=mg(e,t),s=new Set(fg(o)),i=new Map([...fl(zc(e)),...fl(zc(t))]),a=[];for(let d of s){let l=i.get(d);(l?l.path:d.split(" > ")).some(f=>r.has(Fv(f)))&&a.push(d)}return a.sort()}c(Wv,"protectedViolations");function gg(e){let{verdict:t,canaryGreen:n,adequate:r,adequacyReasons:o=[],promotionsInWindow:s,maxPromotionsPerWindow:i=Ri,immutableSections:a=[],beforeContent:d,afterContent:l,measurementMatchesPredecessor:p}=e,f=fg(mg(d,l)),_=_s(t),v=[];if(d===l&&v.push("proposal is identical to the current version \u2014 nothing to promote"),t.mode!=="controlled"&&v.push(`verdict is ${t.mode}, not controlled \u2014 Phase 2 measured that an observational version-vs-version comparison is refused on 99.4% of real version pairs, because versions are disjoint in time by construction`),t.baseline!=="prior-version"&&v.push(`verdict baseline is '${t.baseline}', not 'prior-version' \u2014 a no-rule comparison says the instruction beats having no instruction, not that this edit beats the last one`),t.confounded&&v.push("verdict is flagged confounded"),p===!1&&v.push("pairs were measured against a different predecessor than the one now live \u2014 the target's content changed after the eval batch ran, so this verdict is about a comparison that no longer exists"),n||v.push("A/A canary is red \u2014 the verdict path can manufacture effects from noise, so no verdict it produces may be promoted"),!r){let I=o.length>0?`: ${o.join("; ")}`:"";v.push(`verdict is not adequately powered${I}`)}s>=i&&v.push(`change budget exhausted: ${s}/${i} promotions already made in the current window`);let g=Wv(d,l,a);if(g.length>0&&v.push(`proposal edits protected section(s): ${g.join(", ")}`),_==="insufficient"&&v.push(t.insufficientReason??"verdict did not clear min-n, so no effect was measured"),v.length>0)return{decision:"refuse",refusals:v,rationale:`refused: ${v.length} gate(s) blocked promotion`,effect:_,touched:f};let m=c(I=>`${I>=0?"+":""}${(I*100).toFixed(1)}pp`,"pp"),w=`[${m(t.ci.lower)}, ${m(t.ci.upper)}]`;return _==="helpful"?{decision:"promote",refusals:[],rationale:`promote: ${m(t.delta)} CI ${w} over the prior version, n=${t.nWith} paired cases`,effect:_,touched:f}:_==="harmful"?{decision:"revert",refusals:[],rationale:`revert: proposal measured WORSE than its predecessor, ${m(t.delta)} CI ${w}`,effect:_,touched:f}:{decision:"revert",refusals:[],rationale:`revert: no detectable improvement, ${m(t.delta)} CI ${w} spans zero`,effect:_,touched:f}}c(gg,"evaluatePromotion");async function Kc(e,t){let[n]=await u.select({id:$.id,instructionId:$.instructionId,projectPath:$.projectPath,status:$.status,contentHash:$.contentHash}).from($).where(MN(yg($.id,e),yg($.userId,t)));if(!n)return null;let r=!1;if(n.contentHash){let{instructionContentHash:g}=await Promise.resolve().then(()=>(ws(),Gv)),[m]=await u.select({content:h.content,name:h.name}).from(h).where(yg(h.id,n.instructionId));r=g(m?.content,m?.name)!==n.contentHash}let o=await u.execute($N`
|
|
118
118
|
SELECT a.arm,
|
|
119
119
|
s.analysis->>'outcome' AS outcome,
|
|
120
120
|
EXTRACT(EPOCH FROM s.started_at) * 1000 AS started_ms
|
|
@@ -123,12 +123,12 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
123
123
|
ON s.external_session_id = a.external_session_id
|
|
124
124
|
AND s.user_id = a.user_id
|
|
125
125
|
WHERE a.experiment_id = ${e}
|
|
126
|
-
`),s={treated:0,control:0},i=[],a=[],
|
|
126
|
+
`),s={treated:0,control:0},i=[],a=[],d=[],l=[];for(let g of o){let m=g.arm==="treated";m?s.treated++:s.control++;let w=ys(g.outcome);if(w===null)continue;let I=g.started_ms===null?null:Number(g.started_ms);m?(i.push(w),I!==null&&d.push(I)):(a.push(w),I!==null&&l.push(I))}let p={treated:i.length,control:a.length},f={experimentId:n.id,instructionId:n.instructionId,projectPath:n.projectPath,status:n.status,assigned:s,measured:p,contentChanged:r};if(r)return{...f,delta:null,ci:null,significant:!1,resolution:"inconclusive",timeSeparation:null,randomisationSuspect:!1,reason:"the instruction was edited mid-experiment \u2014 the arms measured different texts, so no verdict transfers. It re-enters testing as new content."};if(p.treated<10||p.control<10)return{...f,delta:null,ci:null,significant:!1,resolution:"insufficient",timeSeparation:null,randomisationSuspect:!1,reason:`needs ${10} measured sessions per arm; have ${p.treated} treated / ${p.control} control`};let _=al(d,l);if(_>hs)return{...f,delta:null,ci:null,significant:!1,resolution:"inconclusive",timeSeparation:_,randomisationSuspect:!0,reason:`arms are time-separated (${_.toFixed(2)} > ${hs}) \u2014 randomisation looks broken, not merely confounded`};let v=ul(i.map(g=>({score:g})),a.map(g=>({score:g})),{minN:10});return{...f,delta:v.delta,ci:v.ci,significant:v.significant,resolution:v.significant?"resolved":"inconclusive",timeSeparation:_,randomisationSuspect:!1,reason:v.significant?null:"the interval still spans zero \u2014 more sessions, or the effect is small"}}c(Kc,"buildArmVerdict");ws();var qN=new Set(["cmd","cmds","command","commands","host","hostname","url","uri","todo","tbd","xxx","placeholder","insert","fixme"]),UN=/(?<![A-Za-z0-9])<([A-Za-z][^<>\n]{0,78}[A-Za-z0-9._/-])>/g,HN=/\{\{\s*[^{}\n]{1,80}\s*\}\}/g,BN=/_{3,}/g,FN=/[\s:|/]|\.\.\./,WN=/^[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(UN)){let i=s[1];WN.test(i)||(FN.test(i)||qN.has(i.toLowerCase()))&&o(s[0],"bracketed")}for(let s of e.matchAll(HN))o(s[0],"mustache");for(let s of e.matchAll(BN))o(s[0],"blank");return n}c(Ni,"findPlaceholders");D();import{and as wg,eq as Er,gte as zN,sql as Eo}from"drizzle-orm";var hn={MIN_SCORE:.8,KIND:"add",MAX_PER_RUN:3,MAX_PER_WINDOW:15,WINDOW_DAYS:7},Hn={minScore:{min:0,max:1},maxPerRun:{min:0,max:25},maxPerWindow:{min:0,max:100},windowDays:{min:1,max:90}};function VN(e,t){let{min:n,max:r}=Hn[e];return Number.isFinite(t)?Math.min(r,Math.max(n,t)):hn[JN[e]]}c(VN,"clampLimit");var JN={minScore:"MIN_SCORE",maxPerRun:"MAX_PER_RUN",maxPerWindow:"MAX_PER_WINDOW",windowDays:"WINDOW_DAYS"};async function ji(e,t){if(t){let[r]=await u.select({override:Eo`${C.metadata}->>'autoAcceptSuggestions'`}).from(C).where(Er(C.id,t));if(r?.override!=null)return r.override==="true"?{allowed:!0,source:"project"}:{allowed:!1,source:"project",reason:"auto-accept is turned off for this project"}}let[n]=await u.select({enabled:T.autoAcceptSuggestions}).from(T).where(Er(T.id,e));return n?n.enabled?{allowed:!0,source:"user-default"}:{allowed:!1,source:"user-default",reason:"auto-accept is turned off for your account"}:{allowed:!1,source:"user-default",reason:"no profile row"}}c(ji,"resolveAutoAcceptConsent");async function Ao(e,t){let n={minScore:hn.MIN_SCORE,maxPerRun:hn.MAX_PER_RUN,maxPerWindow:hn.MAX_PER_WINDOW,windowDays:hn.WINDOW_DAYS,kind:hn.KIND,source:{minScore:"default",maxPerRun:"default",maxPerWindow:"default",windowDays:"default"}},[r]=await u.select({minScore:T.autoAcceptMinScore,maxPerRun:T.autoAcceptMaxPerRun,maxPerWindow:T.autoAcceptMaxPerWindow,windowDays:T.autoAcceptWindowDays}).from(T).where(Er(T.id,e));if(Yv(n,r??null,"account"),t){let[o]=await u.select({minScore:Eo`(${C.metadata}->'autoAcceptLimits'->>'minScore')::real`,maxPerRun:Eo`(${C.metadata}->'autoAcceptLimits'->>'maxPerRun')::int`,maxPerWindow:Eo`(${C.metadata}->'autoAcceptLimits'->>'maxPerWindow')::int`,windowDays:Eo`(${C.metadata}->'autoAcceptLimits'->>'windowDays')::int`}).from(C).where(Er(C.id,t));Yv(n,o??null,"project")}return n}c(Ao,"resolveAutoAcceptLimits");function Yv(e,t,n){if(t)for(let r of Object.keys(Hn)){let o=t[r];o!=null&&(e[r]=VN(r,Number(o)),e.source[r]=n)}}c(Yv,"applyOverrides");async function Pi(e,t,n,r=hn.WINDOW_DAYS,o){let s=new Date(Date.now()-r*864e5),i=wg(Er(Ge.userId,e),Er(Ge.eventType,"accepted"),Er(Ge.actor,"auto"),zN(Ge.createdAt,s)),a=o?Eo`exists (
|
|
127
127
|
select 1 from instruction_suggestions s2
|
|
128
128
|
join instructions i2 on i2.id = s2.instruction_id
|
|
129
129
|
where s2.id = ${Ge.suggestionId}
|
|
130
130
|
and i2.type = ${o}
|
|
131
|
-
)`:void 0;if(!n){let[l]=await
|
|
131
|
+
)`:void 0;if(!n){let[l]=await u.select({n:Eo`count(*)::int`}).from(Ge).where(wg(i,Er(Ge.projectPath,t),a));return l?.n??0}let[d]=await u.select({n:Eo`count(*)::int`}).from(Ge).innerJoin(x,Er(x.id,Ge.suggestionId)).where(wg(i,Er(x.projectId,n),a));return d?.n??0}c(Pi,"autoAcceptsInWindow");D();import{sql as yl,eq as KN}from"drizzle-orm";var Di=.7;async function wl(e){try{let[t]=await u.select({t:T.suggestionConfidenceThreshold}).from(T).where(KN(T.id,e)).limit(1);return typeof t?.t=="number"?t.t:Di}catch{return Di}}c(wl,"readConfidenceThreshold");var GN=5,YN=90,Xv="surface_budget",vg="declined_by_silence",XN=yl`(
|
|
132
132
|
SELECT count(*) FROM (
|
|
133
133
|
SELECT date_trunc('hour', min(e.created_at)) AS h
|
|
134
134
|
FROM instruction_suggestion_events e
|
|
@@ -143,7 +143,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
143
143
|
AND e.event_type IN ('surfaced', 'surfaced_with_content')
|
|
144
144
|
AND e.session_id IS NULL
|
|
145
145
|
) hours
|
|
146
|
-
)`,
|
|
146
|
+
)`,Gc=yl`(${x.declinedAt} IS NULL OR ${x.declinedAt} < now() - make_interval(days => ${YN}))`,Qv=yl`(${x.declinedAt} IS NULL OR ${x.declinedReason} = ${Xv})`;async function vl(e,t){await u.execute(yl`
|
|
147
147
|
WITH over_budget AS (
|
|
148
148
|
SELECT instruction_suggestions.id
|
|
149
149
|
FROM instruction_suggestions
|
|
@@ -159,7 +159,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
159
159
|
AND instruction_suggestions.accepted_at IS NULL
|
|
160
160
|
AND (instruction_suggestions.dismissed_at IS NULL
|
|
161
161
|
OR instruction_suggestions.dismissed_at < now() - interval '30 days')
|
|
162
|
-
AND ${
|
|
162
|
+
AND ${XN} >= ${GN}
|
|
163
163
|
),
|
|
164
164
|
stamped AS (
|
|
165
165
|
UPDATE instruction_suggestions t
|
|
@@ -175,7 +175,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
175
175
|
)
|
|
176
176
|
INSERT INTO instruction_suggestion_events (suggestion_id, user_id, event_type, project_path)
|
|
177
177
|
SELECT id, user_id, ${vg}, project_path FROM stamped
|
|
178
|
-
`)}c(vl,"sweepDeclinedBySilence");D();import{eq as Zv,sql as eI}from"drizzle-orm";var Oi={MAX_CONCURRENT:3,MAX_PER_RUN:3},
|
|
178
|
+
`)}c(vl,"sweepDeclinedBySilence");D();import{eq as Zv,sql as eI}from"drizzle-orm";var Oi={MAX_CONCURRENT:3,MAX_PER_RUN:3},Yc={maxConcurrent:{min:0,max:10},maxPerRun:{min:0,max:10}},QN={maxConcurrent:"MAX_CONCURRENT",maxPerRun:"MAX_PER_RUN"};function ZN(e){for(let t=e,n=0;t&&n<4;n++){if(t.code==="42703")return!0;t=t.cause}return!1}c(ZN,"isUndefinedColumn");function Ig(e,t){let{min:n,max:r}=Yc[e];return Number.isFinite(t)?Math.min(r,Math.max(n,Math.trunc(t))):Oi[QN[e]]}c(Ig,"clampTrialLimit");async function vs(e,t){let n={maxConcurrent:Oi.MAX_CONCURRENT,maxPerRun:Oi.MAX_PER_RUN,source:{maxConcurrent:"default",maxPerRun:"default"}};try{let[r]=await u.select({maxConcurrent:T.trialMaxConcurrent,maxPerRun:T.trialMaxPerRun}).from(T).where(Zv(T.id,e));tI(n,r??null,"account")}catch(r){if(!ZN(r))throw r}if(t){let[r]=await u.select({maxConcurrent:eI`(${C.metadata}->'trialLimits'->>'maxConcurrent')::int`,maxPerRun:eI`(${C.metadata}->'trialLimits'->>'maxPerRun')::int`}).from(C).where(Zv(C.id,t));tI(n,r??null,"project")}return n}c(vs,"resolveTrialLimits");function tI(e,t,n){if(t)for(let r of Object.keys(Yc)){let o=t[r];o!=null&&(e[r]=Ig(r,Number(o)),e.source[r]=n)}}c(tI,"applyOverrides");function Il(e,t,n){let r=Math.max(0,e.maxConcurrent-t);if(r===0)return{slots:0,blocked:"concurrency"};if(n===0)return{slots:0,blocked:"no-candidates"};let o=Math.min(r,e.maxPerRun,n);return{slots:o,blocked:o<Math.min(r,n)?"per-run":"none"}}c(Il,"trialSlots");D();import{desc as ej,eq as nI}from"drizzle-orm";async function Bn(e){if(!e)return null;try{let[t]=await u.select({projectId:ye.projectId}).from(ye).where(nI(ye.path,e)).orderBy(ej(ye.lastSeen)).limit(1);if(t)return t.projectId;let[n]=await u.select({id:C.id}).from(C).where(nI(C.gitRemoteUrl,e)).limit(1);return n?.id??null}catch{return null}}c(Bn,"resolveProjectIdForPath");var Ci=new tj;Ci.get("/instruction-suggestions/auto-acceptable",async e=>{let t=e.get("userId"),n=e.req.query("projectPath");if(!n)return e.json({error:"projectPath is required"},400);let r=await Bn(n),o=await Ao(t,r),s=await u.select({id:x.id,instructionId:x.instructionId,projectId:x.projectId,score:x.score,kind:x.kind,name:h.name,content:h.content,archived:h.archived,type:h.type}).from(x).innerJoin(h,At(h.id,x.instructionId)).where(Xc(At(x.userId,t),At(x.projectPath,n),At(x.kind,hn.KIND),cr`(${x.score} >= ${o.minScore} OR ${h.frontmatter}->>'source' = 'insights')`,cr`${x.acceptedAt} IS NULL`,cr`${x.dismissedAt} IS NULL`,Qv,At(x.isStale,!1),At(h.archived,!1),nj(h.type,["instruction","skill"]),cr`NOT EXISTS (
|
|
179
179
|
SELECT 1 FROM instruction_suggestion_events ev
|
|
180
180
|
WHERE ev.suggestion_id = ${x.id}
|
|
181
181
|
AND ev.event_type IN ('redundant', 'partial_overlap', 'unresolvable_reference')
|
|
@@ -185,17 +185,17 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
185
185
|
WHERE e.instruction_id = ${x.instructionId}
|
|
186
186
|
AND e.project_path = ${x.projectPath}
|
|
187
187
|
AND e.status = 'running'
|
|
188
|
-
)`)).orderBy(rI(x.score)),i=r??s[0]?.projectId??null,a=await ji(t,i);if(!a.allowed)return e.json({consent:a,eligible:[],refused:s.map(
|
|
188
|
+
)`)).orderBy(rI(x.score)),i=r??s[0]?.projectId??null,a=await ji(t,i);if(!a.allowed)return e.json({consent:a,eligible:[],refused:s.map(g=>({id:g.id,name:g.name,reason:a.reason})),budget:null});let[d,l]=await Promise.all([Pi(t,n,i,o.windowDays,"instruction"),Pi(t,n,i,o.windowDays,"skill")]),p=Math.max(0,o.maxPerWindow-d),f=[],_=[],v={instruction:0,skill:0};for(let g of s){let m=Ni(g.content??"");if(m.length>0){_.push({id:g.id,name:g.name,reason:`unfilled placeholder(s): ${m.map(E=>E.token).join(", ")}`});continue}let w=g.type??"instruction",I=w==="skill",b=v[w]??0,A=I?Number.POSITIVE_INFINITY:p;if(b>=Math.min(o.maxPerRun,A)){_.push({id:g.id,name:g.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}v[w]=b+1,f.push({id:g.id,instructionId:g.instructionId,name:g.name,score:g.score,type:w})}return e.json({consent:a,eligible:f,refused:_,budget:{used:d,max:o.maxPerWindow,skillsUsed:l,skillsMax:null,windowDays:o.windowDays,perRun:o.maxPerRun,source:o.source}})});Ci.post("/instruction-experiments/settle",async e=>{let t=e.get("userId"),n=await e.req.json().catch(()=>({})),r=typeof n?.projectPath=="string"?n.projectPath:null,o=await u.select({id:$.id,source:$.source,status:$.status,instructionId:$.instructionId,projectPath:$.projectPath}).from($).where(Xc(At($.userId,t),At($.status,"running"),...r?[At($.projectPath,r)]:[])),s=[],i=0;for(let a of o)try{let d=await Kc(a.id,t);if(!d){i+=1;continue}let l=await ki({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})});Ci.get("/instruction-suggestions/trialable",async e=>{let t=e.get("userId"),n=e.req.query("projectPath");if(!n)return e.json({error:"projectPath is required"},400);let r=await Bn(n),o=await vs(t,r),[{running:s}]=await u.select({running:cr`count(*)::int`}).from($).where(Xc(At($.userId,t),At($.projectPath,n),At($.status,"running"))),i=Math.max(0,o.maxConcurrent-s),a=await u.select({id:x.id,instructionId:x.instructionId,score:x.score,name:h.name,content:h.content}).from(x).innerJoin(h,At(h.id,x.instructionId)).where(Xc(At(x.userId,t),At(x.projectPath,n),At(x.kind,"add"),cr`${x.acceptedAt} IS NULL`,cr`${x.dismissedAt} IS NULL`,cr`${x.declinedAt} IS NULL`,At(x.isStale,!1),At(h.archived,!1),cr`${h.type} NOT IN ('hook','mcp','subagent')`,cr`NOT EXISTS (
|
|
189
189
|
SELECT 1 FROM instruction_experiments e
|
|
190
190
|
WHERE e.instruction_id = ${x.instructionId}
|
|
191
191
|
AND e.project_path = ${x.projectPath}
|
|
192
192
|
AND e.status = 'running'
|
|
193
|
-
)`)).orderBy(rI(x.score)).limit(50),u=[],l=[];for(let f of a){if(u.length>=Math.min(i,o.maxPerRun))break;let _=Ni(f.content??"");if(_.length>0){l.push({name:f.name,reason:`unfilled placeholder(s): ${_.map(v=>v.token).join(", ")}`});continue}u.push({id:f.id,instructionId:f.instructionId,name:f.name,score:f.score})}let{blocked:m}=Il(o,s,a.length);return e.json({candidates:u,refused:l,running:s,slots:i,limits:o,funnel:{eligible:a.length,refusedTemplates:l.length,starting:u.length,blocked:m}})});var nj=bg.object({projectPath:bg.string().min(1),instructionId:bg.string().uuid()});Ci.post("/instruction-suggestions/undo",async e=>{let t=e.get("userId"),n=nj.safeParse(await e.req.json().catch(()=>({})));if(!n.success)return e.json({error:n.error.flatten()},400);let{projectPath:r,instructionId:o}=n.data,[s]=await d.select({id:x.id,name:g.name,acceptedAt:x.acceptedAt}).from(x).innerJoin(g,Et(g.id,x.instructionId)).where(Yc(Et(x.userId,t),Et(x.projectPath,r),Et(x.instructionId,o))).limit(1);return s?(await d.update(x).set({acceptedAt:null,dismissedAt:new Date}).where(Et(x.id,s.id)),await d.insert(Ge).values({suggestionId:s.id,userId:t,eventType:"dismissed",projectPath:r,actor:"human"}),e.json({id:s.id,name:s.name,wasAccepted:s.acceptedAt!=null})):e.json({error:"No suggestion for that instruction on this project"},404)});D();import{Hono as ij}from"hono";import{eq as Xt,and as Is,asc as aI,desc as cI,inArray as El,sql as Ar}from"drizzle-orm";D();import{createHash as rj}from"node:crypto";import{and as oI,eq as bl,inArray as oj,sql as xG}from"drizzle-orm";function sj(e,t,n){return rj("sha256").update(`${e}:${t}`).digest().readUIntBE(0,6)/0xffffffffffff<n?"treated":"control"}c(sj,"assignArm");async function sI(e){let{userId:t,projectPath:n,externalSessionId:r}=e;if(!r)return[];let o=await d.select({id:$.id,instructionId:$.instructionId,treatedShare:$.treatedShare,salt:$.salt}).from($).where(oI(bl($.userId,t),bl($.projectPath,n),bl($.status,"running")));if(o.length===0)return[];await d.insert(Fr).values(o.map(a=>({experimentId:a.id,userId:t,externalSessionId:r,arm:sj(a.salt,r,Number(a.treatedShare))}))).onConflictDoNothing();let s=await d.select({experimentId:Fr.experimentId,arm:Fr.arm}).from(Fr).where(oI(bl(Fr.externalSessionId,r),oj(Fr.experimentId,o.map(a=>a.id)))),i=new Map(s.map(a=>[a.experimentId,a.arm]));return o.flatMap(a=>{let u=i.get(a.id);return u?[{experimentId:a.id,instructionId:a.instructionId,arm:u}]:[]})}c(sI,"resolveArmsForSession");function iI(e){return new Set(e.filter(t=>t.arm==="control").map(t=>t.instructionId))}c(iI,"withheldInstructionIds");ws();var Ag=new ij,uI=2e3,aj=4,cj={"session-start":{add:3,remove:2,trim:1}},uj=["add","remove","trim"];function Eg(e){return e.length<=uI?e:e.slice(0,uI)+"... [truncated]"}c(Eg,"truncateContent");Ag.get("/instruction-suggestions",async e=>{let t=e.get("userId"),n=e.req.query("projectId"),r=e.req.query("projectPath"),o=Number(e.req.query("limit")??"5"),s=Math.min(Math.max(o,1),10),i=e.req.query("includeContent")==="true",a=e.req.query("groupByKind")==="true",u=e.req.query("renderFor"),l=u?cj[u]:void 0;if(u&&!l)return e.json({error:`unknown renderFor: ${u}`},400);let m=a||l!==void 0;if(!n&&!r)return e.json({error:"projectId or projectPath is required"},400);let f=n?Xt(x.projectId,n):Xt(x.projectPath,r);try{await vl(t,Ar`${f}`)}catch{}let _=await d.select({id:x.id,instructionId:x.instructionId,score:x.score,reason:x.reason,generatedAt:x.generatedAt,isStale:x.isStale,kind:x.kind,name:g.name,description:g.description,tags:g.tags,instructionScope:g.scope,estimatedTokens:Ar`(length(${g.content}) / 4)::int`,_rawContent:g.content}).from(x).innerJoin(g,Xt(x.instructionId,g.id)).where(Is(Xt(x.userId,t),f,Xt(g.archived,!1),Ar`${x.acceptedAt} IS NULL`,Ar`(${x.dismissedAt} IS NULL OR ${x.dismissedAt} < now() - interval '30 days')`,Kc)).orderBy(aI(x.isStale),cI(x.score)).limit(s),v=[];if(m){let K=new Set(_.map(B=>B.id));v=(await d.select({id:x.id,instructionId:x.instructionId,score:x.score,reason:x.reason,generatedAt:x.generatedAt,isStale:x.isStale,kind:x.kind,name:g.name,description:g.description,tags:g.tags,instructionScope:g.scope,estimatedTokens:Ar`(length(${g.content}) / 4)::int`,_rawContent:g.content}).from(x).innerJoin(g,Xt(x.instructionId,g.id)).where(Is(Xt(x.userId,t),f,Ar`${x.kind} <> 'add'`,Xt(g.archived,!1),Ar`${x.acceptedAt} IS NULL`,Ar`(${x.dismissedAt} IS NULL OR ${x.dismissedAt} < now() - interval '30 days')`,Kc)).orderBy(aI(x.isStale),cI(x.score)).limit(aj)).filter(B=>!K.has(B.id))}let h=i?await wl(t):Di,p=[..._,...v].map(K=>{let{_rawContent:pe,...B}=K,he=i&&K.kind==="add"&&K.score>=h&&typeof pe=="string"?Eg(pe):null;return{...B,content:he}}),w=l?await sI({userId:t,projectPath:r??"",externalSessionId:e.req.query("sessionId")||void 0}):[],I=iI(w),b=l?await _g(t,r??""):[],A=new Set(b.filter(K=>K.decision==="never").map(K=>K.instructionId)),E=b.filter(K=>K.decision==="always"),S=new Set(b.map(K=>K.instructionId)),T=w.filter(K=>K.arm==="treated"),O=new Set(w.map(K=>K.instructionId)),W=I.size===0&&S.size===0&&O.size===0?p:p.filter(K=>!I.has(K.instructionId)&&!S.has(K.instructionId)&&!O.has(K.instructionId)),N=W,q;if(l){let K=new Map;for(let B of W){let he=B.kind??"add",P=l[he];if(P===void 0||P<=0)continue;let re=K.get(he)??[];re.length>=P||(re.push(B),K.set(he,re))}let pe=K.get("add")??[];if(T.length>0){let B=new Map(T.map(P=>[P.instructionId,P.experimentId])),he=await d.select({id:g.id,name:g.name,description:g.description,tags:g.tags,instructionScope:g.scope,content:g.content}).from(g).where(Is(El(g.id,T.map(P=>P.instructionId)),Xt(g.archived,!1)));for(let P of he.reverse())pe.unshift({id:`experiment:${B.get(P.id)}`,instructionId:P.id,score:1,reason:"under measurement on this project",generatedAt:new Date,isStale:!1,kind:"add",name:P.name,description:P.description,tags:P.tags,instructionScope:P.instructionScope,estimatedTokens:Math.ceil((P.content?.length??0)/4),content:i?Eg(P.content??""):null});K.set("add",pe)}if(E.length>0){let B=await d.select({id:g.id,name:g.name,description:g.description,tags:g.tags,instructionScope:g.scope,content:g.content}).from(g).where(Is(El(g.id,E.map(he=>he.instructionId)),Xt(g.archived,!1)));for(let he of B.reverse())pe.unshift({id:`graduated:${he.id}`,instructionId:he.id,score:1,reason:"graduated: measured to help on this project",generatedAt:new Date,isStale:!1,kind:"add",name:he.name,description:he.description,tags:he.tags,instructionScope:he.instructionScope,estimatedTokens:Math.ceil((he.content?.length??0)/4),content:i?Eg(he.content??""):null});K.set("add",pe)}N=uj.flatMap(B=>K.get(B)??[]),q={addCount:pe.length,costCount:(K.get("remove")??[]).length+(K.get("trim")??[]).length,highConfidenceCount:pe.filter(B=>B.content!==null).length,omitted:W.length-(N.length-pe.filter(B=>B.id.startsWith("graduated:")||B.id.startsWith("experiment:")).length),...I.size>0?{withheld:I.size}:{}}}let U=await d.select({eventType:Ge.eventType,count:Ar`count(*)::int`}).from(Ge).innerJoin(x,Xt(Ge.suggestionId,x.id)).where(Is(Xt(Ge.userId,t),f)).groupBy(Ge.eventType),H={};for(let K of U)H[K.eventType]=K.count;let te,de;if(!l&&r&&N.length>0){let K=[...new Set(N.map(P=>P.instructionId))],pe=await d.select({id:$.id,instructionId:$.instructionId,source:$.source}).from($).where(Is(Xt($.userId,t),Xt($.projectPath,r),Xt($.status,"running"),El($.instructionId,K)));pe.length>0&&(te=Object.fromEntries(pe.map(P=>[P.instructionId,{id:P.id,source:P.source}])));let B=await d.select({instructionId:Q.instructionId,contentHash:Q.contentHash,projectPath:Q.projectPath,decision:Q.decision,delta:Q.delta,ciLower:Q.ciLower,ciUpper:Q.ciUpper,nTreated:Q.nTreated,nControl:Q.nControl,segment:Q.segment,decidedAt:Q.decidedAt,liveContent:g.content,liveName:g.name}).from(Q).innerJoin(g,Xt(Q.instructionId,g.id)).where(Is(Xt(Q.userId,t),El(Q.instructionId,K),Ar`${Q.projectPath} <> ${r}`)),he={};for(let P of B){let re=Kr(P.liveContent,P.liveName);re===null||re!==P.contentHash||(he[P.instructionId]??=[]).push({projectPath:P.projectPath,decision:P.decision,delta:P.delta,ciLower:P.ciLower,ciUpper:P.ciUpper,nTreated:P.nTreated,nControl:P.nControl,segment:P.segment,decidedAt:P.decidedAt})}Object.keys(he).length>0&&(de=he)}return e.json({suggestions:N,stats:H,...q?{render:q}:{},...te?{experiments:te}:{},...de?{crossProject:de}:{}})});D();import{Hono as dj}from"hono";import{z as dI}from"zod";import{eq as bs,and as lI,desc as lj,sql as _n}from"drizzle-orm";var mj=dI.object({threshold:dI.number().min(0).max(1)}),Es=new dj;Es.get("/instruction-suggestions/pending-count",async e=>{let t=e.get("userId"),n=await d.select({projectPath:x.projectPath,count:_n`count(*)::int`}).from(x).where(lI(bs(x.userId,t),_n`${x.acceptedAt} IS NULL`,_n`(${x.dismissedAt} IS NULL OR ${x.dismissedAt} < now() - interval '30 days')`,Kc)).groupBy(x.projectPath).orderBy(lj(_n`count(*)`)),r=n.reduce((o,s)=>o+s.count,0);return e.json({total:r,byProject:n.slice(0,5)})});Es.get("/instruction-suggestions/stats",async e=>{let t=e.get("userId"),[n]=await d.select({total:_n`count(*)::int`,accepted:_n`count(*) filter (where ${x.acceptedAt} is not null)::int`,dismissed:_n`count(*) filter (where ${x.acceptedAt} is null and ${x.dismissedAt} is not null)::int`,declinedBySilence:_n`count(*) filter (where ${x.acceptedAt} is null and ${x.dismissedAt} is null and ${x.declinedAt} is not null)::int`,pending:_n`count(*) filter (where ${x.acceptedAt} is null and ${x.dismissedAt} is null and ${x.declinedAt} is null)::int`,stale:_n`count(*) filter (where ${x.isStale})::int`,promoted:_n`count(*) filter (where ${x.promotedToInstructionId} is not null)::int`}).from(x).where(bs(x.userId,t)),r=await d.select({eventType:Ge.eventType,count:_n`count(*)::int`}).from(Ge).where(bs(Ge.userId,t)).groupBy(Ge.eventType),o={surfaced:0,surfaced_with_content:0,accepted:0,dismissed:0,promoted:0,proxy_injected:0,[vg]:0};for(let u of r)o[u.eventType]=u.count;let[s]=await d.select({distinctUsersWithSuggestions:_n`count(distinct ${x.userId})::int`}).from(x),i=o.surfaced+o.surfaced_with_content,a=o.accepted+o.dismissed;return e.json({suggestions:n,events:o,funnel:{surfaced:i,acted:a,adoptionRate:i>0?a/i:0},denominator:{distinctUsersWithSuggestions:s?.distinctUsersWithSuggestions??0,scope:"global"}})});Es.get("/instruction-suggestions/confidence",async e=>{let t=e.get("userId");return e.json({threshold:await wl(t),default:Di,governs:"Minimum score at which an add-suggestion carries its instruction body into session context. Surfacing only \u2014 never a write."})});Es.put("/instruction-suggestions/confidence",async e=>{let t=e.get("userId"),n=mj.safeParse(await e.req.json().catch(()=>null));return n.success?(await d.update(R).set({suggestionConfidenceThreshold:n.data.threshold}).where(bs(R.id,t)),e.json({threshold:n.data.threshold})):e.json({error:"threshold must be a number between 0 and 1"},400)});Es.get("/instruction-suggestions/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select({id:x.id,instructionId:x.instructionId,projectPath:x.projectPath,score:x.score,reason:x.reason,generatedAt:x.generatedAt,isStale:x.isStale,kind:x.kind,estimatedTokens:_n`(length(${g.content}) / 4)::int`,dismissedAt:x.dismissedAt,acceptedAt:x.acceptedAt,name:g.name,description:g.description,tags:g.tags,instructionScope:g.scope}).from(x).innerJoin(g,bs(x.instructionId,g.id)).where(lI(bs(x.id,n),bs(x.userId,t)));return r?e.json(r):e.json({error:"Suggestion not found"},404)});D();import{Hono as pj}from"hono";import{z as Ft}from"zod";import{eq as ur,and as Sg,or as fj,desc as gj,sql as As}from"drizzle-orm";var Xc=new pj,hj=Ft.object({projectPath:Ft.string().min(1),projectId:Ft.string().uuid().optional(),suggestions:Ft.array(Ft.object({instructionId:Ft.string().uuid(),score:Ft.number().min(0).max(1),reason:Ft.string(),kind:Ft.enum(Dd).optional()})).max(50)});async function _j(e){try{let[t]=await d.select({projectId:ye.projectId}).from(ye).where(ur(ye.path,e)).orderBy(gj(ye.lastSeen)).limit(1);return t?.projectId??null}catch{return null}}c(_j,"resolveProjectId");var yj=Ft.object({stale:Ft.boolean().default(!0)});Xc.post("/instruction-suggestions/batch-upsert",async e=>{let t=e.get("userId"),n=hj.parse(await e.req.json());if(n.suggestions.length===0)return e.json({inserted:0});let r=n.projectId??await _j(n.projectPath),o=n.suggestions.map(s=>({userId:t,instructionId:s.instructionId,projectPath:n.projectPath,projectId:r,score:s.score,reason:s.reason,kind:s.kind??"add",generatedAt:new Date,isStale:!1}));return await d.insert(x).values(o).onConflictDoUpdate({target:[x.userId,x.projectPath,x.instructionId,x.kind],set:{score:As`excluded.score`,reason:As`excluded.reason`,generatedAt:As`excluded.generated_at`,isStale:As`false`,dismissedAt:As`CASE WHEN ${x.dismissedAt} IS NOT NULL AND ${x.dismissedAt} >= now() - interval '30 days' THEN ${x.dismissedAt} ELSE NULL END`}}),e.json({inserted:o.length})});Xc.post("/instruction-suggestions/mark-stale",async e=>{let t=e.get("userId"),n=await e.req.json().catch(()=>({})),r=yj.parse(n).stale,o=Sg(ur(x.userId,t),ur(x.isStale,!r),As`EXISTS (
|
|
193
|
+
)`)).orderBy(rI(x.score)).limit(50),d=[],l=[];for(let f of a){if(d.length>=Math.min(i,o.maxPerRun))break;let _=Ni(f.content??"");if(_.length>0){l.push({name:f.name,reason:`unfilled placeholder(s): ${_.map(v=>v.token).join(", ")}`});continue}d.push({id:f.id,instructionId:f.instructionId,name:f.name,score:f.score})}let{blocked:p}=Il(o,s,a.length);return e.json({candidates:d,refused:l,running:s,slots:i,limits:o,funnel:{eligible:a.length,refusedTemplates:l.length,starting:d.length,blocked:p}})});var rj=bg.object({projectPath:bg.string().min(1),instructionId:bg.string().uuid()});Ci.post("/instruction-suggestions/undo",async e=>{let t=e.get("userId"),n=rj.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:h.name,acceptedAt:x.acceptedAt}).from(x).innerJoin(h,At(h.id,x.instructionId)).where(Xc(At(x.userId,t),At(x.projectPath,r),At(x.instructionId,o))).limit(1);return s?(await u.update(x).set({acceptedAt:null,dismissedAt:new Date}).where(At(x.id,s.id)),await u.insert(Ge).values({suggestionId:s.id,userId:t,eventType:"dismissed",projectPath:r,actor:"human"}),e.json({id:s.id,name:s.name,wasAccepted:s.acceptedAt!=null})):e.json({error:"No suggestion for that instruction on this project"},404)});D();import{Hono as aj}from"hono";import{eq as Xt,and as Is,asc as aI,desc as cI,inArray as El,sql as Ar}from"drizzle-orm";D();import{createHash as oj}from"node:crypto";import{and as oI,eq as bl,inArray as sj,sql as kG}from"drizzle-orm";function ij(e,t,n){return oj("sha256").update(`${e}:${t}`).digest().readUIntBE(0,6)/0xffffffffffff<n?"treated":"control"}c(ij,"assignArm");async function sI(e){let{userId:t,projectPath:n,externalSessionId:r}=e;if(!r)return[];let o=await u.select({id:$.id,instructionId:$.instructionId,treatedShare:$.treatedShare,salt:$.salt}).from($).where(oI(bl($.userId,t),bl($.projectPath,n),bl($.status,"running")));if(o.length===0)return[];await u.insert(Fr).values(o.map(a=>({experimentId:a.id,userId:t,externalSessionId:r,arm:ij(a.salt,r,Number(a.treatedShare))}))).onConflictDoNothing();let s=await u.select({experimentId:Fr.experimentId,arm:Fr.arm}).from(Fr).where(oI(bl(Fr.externalSessionId,r),sj(Fr.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(sI,"resolveArmsForSession");function iI(e){return new Set(e.filter(t=>t.arm==="control").map(t=>t.instructionId))}c(iI,"withheldInstructionIds");ws();var Ag=new aj,dI=2e3,cj=4,dj={"session-start":{add:3,remove:2,trim:1}},uj=["add","remove","trim"];function Eg(e){return e.length<=dI?e:e.slice(0,dI)+"... [truncated]"}c(Eg,"truncateContent");Ag.get("/instruction-suggestions",async e=>{let t=e.get("userId"),n=e.req.query("projectId"),r=e.req.query("projectPath"),o=Number(e.req.query("limit")??"5"),s=Math.min(Math.max(o,1),10),i=e.req.query("includeContent")==="true",a=e.req.query("groupByKind")==="true",d=e.req.query("renderFor"),l=d?dj[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 f=n?Xt(x.projectId,n):Xt(x.projectPath,r);try{await vl(t,Ar`${f}`)}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:h.name,description:h.description,tags:h.tags,instructionScope:h.scope,estimatedTokens:Ar`(length(${h.content}) / 4)::int`,_rawContent:h.content}).from(x).innerJoin(h,Xt(x.instructionId,h.id)).where(Is(Xt(x.userId,t),f,Xt(h.archived,!1),Ar`${x.acceptedAt} IS NULL`,Ar`(${x.dismissedAt} IS NULL OR ${x.dismissedAt} < now() - interval '30 days')`,Gc)).orderBy(aI(x.isStale),cI(x.score)).limit(s),v=[];if(p){let V=new Set(_.map(B=>B.id));v=(await u.select({id:x.id,instructionId:x.instructionId,score:x.score,reason:x.reason,generatedAt:x.generatedAt,isStale:x.isStale,kind:x.kind,name:h.name,description:h.description,tags:h.tags,instructionScope:h.scope,estimatedTokens:Ar`(length(${h.content}) / 4)::int`,_rawContent:h.content}).from(x).innerJoin(h,Xt(x.instructionId,h.id)).where(Is(Xt(x.userId,t),f,Ar`${x.kind} <> 'add'`,Xt(h.archived,!1),Ar`${x.acceptedAt} IS NULL`,Ar`(${x.dismissedAt} IS NULL OR ${x.dismissedAt} < now() - interval '30 days')`,Gc)).orderBy(aI(x.isStale),cI(x.score)).limit(cj)).filter(B=>!V.has(B.id))}let g=i?await wl(t):Di,m=[..._,...v].map(V=>{let{_rawContent:me,...B}=V,he=i&&V.kind==="add"&&V.score>=g&&typeof me=="string"?Eg(me):null;return{...B,content:he}}),w=l?await sI({userId:t,projectPath:r??"",externalSessionId:e.req.query("sessionId")||void 0}):[],I=iI(w),b=l?await _g(t,r??""):[],A=new Set(b.filter(V=>V.decision==="never").map(V=>V.instructionId)),E=b.filter(V=>V.decision==="always"),S=new Set(b.map(V=>V.instructionId)),R=w.filter(V=>V.arm==="treated"),O=new Set(w.map(V=>V.instructionId)),W=I.size===0&&S.size===0&&O.size===0?m:m.filter(V=>!I.has(V.instructionId)&&!S.has(V.instructionId)&&!O.has(V.instructionId)),N=W,U;if(l){let V=new Map;for(let B of W){let he=B.kind??"add",P=l[he];if(P===void 0||P<=0)continue;let re=V.get(he)??[];re.length>=P||(re.push(B),V.set(he,re))}let me=V.get("add")??[];if(R.length>0){let B=new Map(R.map(P=>[P.instructionId,P.experimentId])),he=await u.select({id:h.id,name:h.name,description:h.description,tags:h.tags,instructionScope:h.scope,content:h.content}).from(h).where(Is(El(h.id,R.map(P=>P.instructionId)),Xt(h.archived,!1)));for(let P of he.reverse())me.unshift({id:`experiment:${B.get(P.id)}`,instructionId:P.id,score:1,reason:"under measurement on this project",generatedAt:new Date,isStale:!1,kind:"add",name:P.name,description:P.description,tags:P.tags,instructionScope:P.instructionScope,estimatedTokens:Math.ceil((P.content?.length??0)/4),content:i?Eg(P.content??""):null});V.set("add",me)}if(E.length>0){let B=await u.select({id:h.id,name:h.name,description:h.description,tags:h.tags,instructionScope:h.scope,content:h.content}).from(h).where(Is(El(h.id,E.map(he=>he.instructionId)),Xt(h.archived,!1)));for(let he of B.reverse())me.unshift({id:`graduated:${he.id}`,instructionId:he.id,score:1,reason:"graduated: measured to help on this project",generatedAt:new Date,isStale:!1,kind:"add",name:he.name,description:he.description,tags:he.tags,instructionScope:he.instructionScope,estimatedTokens:Math.ceil((he.content?.length??0)/4),content:i?Eg(he.content??""):null});V.set("add",me)}N=uj.flatMap(B=>V.get(B)??[]),U={addCount:me.length,costCount:(V.get("remove")??[]).length+(V.get("trim")??[]).length,highConfidenceCount:me.filter(B=>B.content!==null).length,omitted:W.length-(N.length-me.filter(B=>B.id.startsWith("graduated:")||B.id.startsWith("experiment:")).length),...I.size>0?{withheld:I.size}:{}}}let q=await u.select({eventType:Ge.eventType,count:Ar`count(*)::int`}).from(Ge).innerJoin(x,Xt(Ge.suggestionId,x.id)).where(Is(Xt(Ge.userId,t),f)).groupBy(Ge.eventType),H={};for(let V of q)H[V.eventType]=V.count;let Y,ce;if(!l&&r&&N.length>0){let V=[...new Set(N.map(P=>P.instructionId))],me=await u.select({id:$.id,instructionId:$.instructionId,source:$.source}).from($).where(Is(Xt($.userId,t),Xt($.projectPath,r),Xt($.status,"running"),El($.instructionId,V)));me.length>0&&(Y=Object.fromEntries(me.map(P=>[P.instructionId,{id:P.id,source:P.source}])));let B=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:h.content,liveName:h.name}).from(Z).innerJoin(h,Xt(Z.instructionId,h.id)).where(Is(Xt(Z.userId,t),El(Z.instructionId,V),Ar`${Z.projectPath} <> ${r}`)),he={};for(let P of B){let re=Kr(P.liveContent,P.liveName);re===null||re!==P.contentHash||(he[P.instructionId]??=[]).push({projectPath:P.projectPath,decision:P.decision,delta:P.delta,ciLower:P.ciLower,ciUpper:P.ciUpper,nTreated:P.nTreated,nControl:P.nControl,segment:P.segment,decidedAt:P.decidedAt})}Object.keys(he).length>0&&(ce=he)}return e.json({suggestions:N,stats:H,...U?{render:U}:{},...Y?{experiments:Y}:{},...ce?{crossProject:ce}:{}})});D();import{Hono as lj}from"hono";import{z as uI}from"zod";import{eq as bs,and as lI,desc as pj,sql as _n}from"drizzle-orm";var mj=uI.object({threshold:uI.number().min(0).max(1)}),Es=new lj;Es.get("/instruction-suggestions/pending-count",async e=>{let t=e.get("userId"),n=await u.select({projectPath:x.projectPath,count:_n`count(*)::int`}).from(x).where(lI(bs(x.userId,t),_n`${x.acceptedAt} IS NULL`,_n`(${x.dismissedAt} IS NULL OR ${x.dismissedAt} < now() - interval '30 days')`,Gc)).groupBy(x.projectPath).orderBy(pj(_n`count(*)`)),r=n.reduce((o,s)=>o+s.count,0);return e.json({total:r,byProject:n.slice(0,5)})});Es.get("/instruction-suggestions/stats",async e=>{let t=e.get("userId"),[n]=await u.select({total:_n`count(*)::int`,accepted:_n`count(*) filter (where ${x.acceptedAt} is not null)::int`,dismissed:_n`count(*) filter (where ${x.acceptedAt} is null and ${x.dismissedAt} is not null)::int`,declinedBySilence:_n`count(*) filter (where ${x.acceptedAt} is null and ${x.dismissedAt} is null and ${x.declinedAt} is not null)::int`,pending:_n`count(*) filter (where ${x.acceptedAt} is null and ${x.dismissedAt} is null and ${x.declinedAt} is null)::int`,stale:_n`count(*) filter (where ${x.isStale})::int`,promoted:_n`count(*) filter (where ${x.promotedToInstructionId} is not null)::int`}).from(x).where(bs(x.userId,t)),r=await u.select({eventType:Ge.eventType,count:_n`count(*)::int`}).from(Ge).where(bs(Ge.userId,t)).groupBy(Ge.eventType),o={surfaced:0,surfaced_with_content:0,accepted:0,dismissed:0,promoted:0,proxy_injected:0,[vg]:0};for(let d of r)o[d.eventType]=d.count;let[s]=await u.select({distinctUsersWithSuggestions:_n`count(distinct ${x.userId})::int`}).from(x),i=o.surfaced+o.surfaced_with_content,a=o.accepted+o.dismissed;return e.json({suggestions:n,events:o,funnel:{surfaced:i,acted:a,adoptionRate:i>0?a/i:0},denominator:{distinctUsersWithSuggestions:s?.distinctUsersWithSuggestions??0,scope:"global"}})});Es.get("/instruction-suggestions/confidence",async e=>{let t=e.get("userId");return e.json({threshold:await wl(t),default:Di,governs:"Minimum score at which an add-suggestion carries its instruction body into session context. Surfacing only \u2014 never a write."})});Es.put("/instruction-suggestions/confidence",async e=>{let t=e.get("userId"),n=mj.safeParse(await e.req.json().catch(()=>null));return n.success?(await u.update(T).set({suggestionConfidenceThreshold:n.data.threshold}).where(bs(T.id,t)),e.json({threshold:n.data.threshold})):e.json({error:"threshold must be a number between 0 and 1"},400)});Es.get("/instruction-suggestions/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await 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:_n`(length(${h.content}) / 4)::int`,dismissedAt:x.dismissedAt,acceptedAt:x.acceptedAt,name:h.name,description:h.description,tags:h.tags,instructionScope:h.scope}).from(x).innerJoin(h,bs(x.instructionId,h.id)).where(lI(bs(x.id,n),bs(x.userId,t)));return r?e.json(r):e.json({error:"Suggestion not found"},404)});D();import{Hono as fj}from"hono";import{z as Ft}from"zod";import{eq as dr,and as Sg,or as gj,desc as hj,sql as As}from"drizzle-orm";var Qc=new fj,_j=Ft.object({projectPath:Ft.string().min(1),projectId:Ft.string().uuid().optional(),suggestions:Ft.array(Ft.object({instructionId:Ft.string().uuid(),score:Ft.number().min(0).max(1),reason:Ft.string(),kind:Ft.enum(Ou).optional()})).max(50)});async function yj(e){try{let[t]=await u.select({projectId:ye.projectId}).from(ye).where(dr(ye.path,e)).orderBy(hj(ye.lastSeen)).limit(1);return t?.projectId??null}catch{return null}}c(yj,"resolveProjectId");var wj=Ft.object({stale:Ft.boolean().default(!0)});Qc.post("/instruction-suggestions/batch-upsert",async e=>{let t=e.get("userId"),n=_j.parse(await e.req.json());if(n.suggestions.length===0)return e.json({inserted:0});let r=n.projectId??await yj(n.projectPath),o=n.suggestions.map(s=>({userId:t,instructionId:s.instructionId,projectPath:n.projectPath,projectId:r,score:s.score,reason:s.reason,kind:s.kind??"add",generatedAt:new Date,isStale:!1}));return await u.insert(x).values(o).onConflictDoUpdate({target:[x.userId,x.projectPath,x.instructionId,x.kind],set:{score:As`excluded.score`,reason:As`excluded.reason`,generatedAt:As`excluded.generated_at`,isStale:As`false`,dismissedAt:As`CASE WHEN ${x.dismissedAt} IS NOT NULL AND ${x.dismissedAt} >= now() - interval '30 days' THEN ${x.dismissedAt} ELSE NULL END`}}),e.json({inserted:o.length})});Qc.post("/instruction-suggestions/mark-stale",async e=>{let t=e.get("userId"),n=await e.req.json().catch(()=>({})),r=wj.parse(n).stale,o=Sg(dr(x.userId,t),dr(x.isStale,!r),As`EXISTS (
|
|
194
194
|
SELECT 1 FROM instructions i
|
|
195
195
|
WHERE i.id = ${x.instructionId}
|
|
196
196
|
AND i.type = 'skill'
|
|
197
197
|
AND coalesce(i.frontmatter->>'source', '') <> 'insights'
|
|
198
|
-
)`),s=await d.update(x).set({isStale:r}).where(o).returning({id:x.id});return e.json({ok:!0,stale:r,marked:r?s.length:0,cleared:r?0:s.length})});var wj=Ft.object({eventType:Ft.enum(["surfaced","surfaced_with_content","accepted","dismissed","promoted","proxy_injected","redundant","partial_overlap","unresolvable_reference"]),tool:Ft.string().optional(),sessionId:Ft.string().uuid().optional(),projectPath:Ft.string().min(1),instructionId:Ft.string().uuid().optional(),actor:Ft.enum(["human","auto"]).default("human")});Xc.post("/instruction-suggestions/:id/events",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=wj.parse(await e.req.json()),[o]=await d.select().from(x).where(Sg(ur(x.id,n),ur(x.userId,t)));if(!o)return e.json({error:"Suggestion not found"},404);let s=r.eventType==="accepted"||r.eventType==="promoted",i=o.instructionId;if(s&&r.instructionId){let[a]=await d.select({id:g.id}).from(g).where(Sg(ur(g.id,r.instructionId),fj(ur(g.createdBy,t),ur(g.scope,"public")))).limit(1);if(!a)return e.json({error:"instructionId not found",code:"INVALID_INSTRUCTION"},400);i=a.id}if(await d.insert(Ge).values({suggestionId:n,userId:t,eventType:r.eventType,tool:r.tool??null,sessionId:r.sessionId??null,projectPath:r.projectPath,actor:r.actor}),s)await d.update(x).set({acceptedAt:new Date,promotedToInstructionId:i}).where(ur(x.id,n));else if(r.eventType==="dismissed")await d.update(x).set({dismissedAt:new Date}).where(ur(x.id,n));else if(r.eventType==="surfaced"||r.eventType==="surfaced_with_content")try{await vl(t,As`${ur(x.id,n)}`)}catch{}return e.json({ok:!0})});D();import{Hono as bj}from"hono";import{z as Qc}from"zod";import{eq as Li,and as pI,desc as fI,sql as Sl}from"drizzle-orm";ws();D();ws();import{randomUUID as vj}from"node:crypto";import{and as Al,eq as Dn,sql as xg}from"drizzle-orm";var Ij=.8;async function mI(e){let{userId:t,instructionId:n,projectPath:r,source:o}=e,s=e.treatedShare??.5,[i]=await d.select({id:g.id,name:g.name,content:g.content,archived:g.archived,scope:g.scope,createdBy:g.createdBy}).from(g).where(Dn(g.id,n));if(!i||i.createdBy!==t&&i.scope!=="public")return{ok:!1,code:"not_found",reason:"instruction not found"};if(i.archived)return{ok:!1,code:"archived",reason:"instruction is archived"};let a=Kr(i.content,i.name);if(!a)return{ok:!1,code:"no_body",reason:"instruction body could not be extracted from its content"};let[u]=await d.select({id:Q.id}).from(Q).where(Al(Dn(Q.instructionId,n),Dn(Q.contentHash,a),Dn(Q.projectPath,r)));if(u)return{ok:!1,code:"already_decided",reason:"this exact content already has a verdict on this project \u2014 edit the instruction to re-enter testing"};if(o==="groom"){let[m]=await d.select({id:x.id}).from(x).where(Al(Dn(x.userId,t),Dn(x.instructionId,n),Dn(x.projectPath,r),xg`${x.acceptedAt} IS NULL`,xg`${x.dismissedAt} IS NULL`,xg`${x.score} >= ${Ij}`));if(!m)return{ok:!1,code:"not_injectable",reason:"not delivered by injection on this project (accepted into a file, or no renderable proposal) \u2014 withholding would measure nothing"}}let[l]=await d.select({id:$.id}).from($).where(Al(Dn($.instructionId,n),Dn($.projectPath,r),Dn($.status,"running")));if(l)return{ok:!0,experimentId:l.id,existing:!0};try{let[m]=await d.insert($).values({userId:t,instructionId:n,projectPath:r,status:"running",treatedShare:String(s),salt:vj(),contentHash:a,source:o}).returning({id:$.id});return{ok:!0,experimentId:m.id,existing:!1}}catch(m){let[f]=await d.select({id:$.id}).from($).where(Al(Dn($.instructionId,n),Dn($.projectPath,r),Dn($.status,"running")));if(f)return{ok:!0,experimentId:f.id,existing:!0};throw m}}c(mI,"nominateExperiment");var Mi=new bj;Mi.get("/instruction-experiments",async e=>{let t=e.get("userId"),n=e.req.query("projectPath"),r=Math.min(Math.max(Number(e.req.query("limit"))||50,1),200),o=pI(Li($.userId,t),n?Li($.projectPath,n):Sl`true`),s=await d.select({id:$.id,instructionId:$.instructionId,instructionName:g.name,projectPath:$.projectPath,status:$.status,source:$.source,instructionSource:Sl`${g.frontmatter}->>'source'`,stoppedReason:$.stoppedReason,createdAt:$.createdAt}).from($).innerJoin(g,Li($.instructionId,g.id)).where(o).orderBy(fI($.createdAt)).limit(r),[{total:i}]=await d.select({total:Sl`count(*)::int`}).from($).where(o),a=await Promise.all(s.map(async l=>{let m=await Jc(l.id,t),f=l.status,_=l.stoppedReason;if(m&&l.status==="running")try{let v=await ki({experimentId:l.id,userId:t,verdict:m,source:l.source,status:l.status});v&&(f="stopped",_=v)}catch{}return{...l,status:f,stoppedReason:_,verdict:m}})),u=await _l(a.map(l=>l.id));return e.json({experiments:a.map(l=>({...l,graduation:u.get(l.id)??null})),total:i})});var Ej=Qc.object({instructionId:Qc.string().uuid(),projectPath:Qc.string().min(1),source:Qc.enum(["manual","groom","trial","borrow"]).default("manual"),treatedShare:Qc.number().gt(0).lt(1).optional()});Mi.post("/instruction-experiments",async e=>{let t=e.get("userId"),n=Ej.safeParse(await e.req.json().catch(()=>({})));if(!n.success)return e.json({error:n.error.flatten()},400);let r=await mI({userId:t,...n.data});if(!r.ok){let o={not_found:404,archived:400,no_body:400,already_decided:409,not_injectable:409};return e.json({error:r.reason,code:r.code},o[r.code])}return e.json({experimentId:r.experimentId,existing:r.existing},r.existing?200:201)});Mi.get("/instruction-experiments/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await Jc(n,t);if(!r)return e.json({error:"not found"},404);try{let[s]=await d.select({source:$.source,status:$.status}).from($).where(Li($.id,n));s&&await ki({experimentId:n,userId:t,verdict:r,source:s.source,status:s.status})}catch{}let o=await _l([n]);return e.json({verdict:r,graduation:o.get(n)??null})});Mi.get("/instruction-verdicts",async e=>{let t=e.get("userId"),n=e.req.query("instructionId"),r=await d.select({id:Q.id,instructionId:Q.instructionId,contentHash:Q.contentHash,projectPath:Q.projectPath,decision:Q.decision,delta:Q.delta,ciLower:Q.ciLower,ciUpper:Q.ciUpper,nTreated:Q.nTreated,nControl:Q.nControl,decidedAt:Q.decidedAt}).from(Q).where(pI(Li(Q.userId,t),n?Li(Q.instructionId,n):Sl`true`)).orderBy(fI(Q.decidedAt)).limit(50);return e.json({verdicts:r,total:r.length})});var So=new Aj;So.route("/",Ci);So.route("/",Ag);So.route("/",Es);So.route("/",Xc);So.route("/",Mi);import{Hono as zD}from"hono";import{Hono as hD}from"hono";D();import{Hono as Lj}from"hono";import{z as Fn}from"zod";import{eq as zt,and as Bi,desc as bI,sql as Sr,or as EI,gte as Mj,ne as $j}from"drizzle-orm";function gI(e){if(!e||typeof e!="string")return null;let t=e.trim();if(!t)return null;if(!t.includes("://")&&!/^([\w.-]+@)?[\w.-]+:[^/]/.test(t)&&/^[\w.-]+(\.[\w.-]+)+\//.test(t)){let a=t.replace(/\.git$/i,"").replace(/\/+$/,""),u=a.indexOf("/"),l=a.slice(0,u).toLowerCase(),m=a.slice(u+1);return m?`${l}/${m}`:null}let n=t,r=/^([\w.-]+@)?([\w.-]+):([^/].*)$/.exec(t);if(r&&!t.includes("://")){let[,,a,u]=r;n=`ssh://${a}/${u}`}let o;try{o=new URL(n)}catch{return null}let s=o.hostname.toLowerCase();if(!s)return null;let i=o.pathname.replace(/^\/+|\/+$/g,"");return!i||(i=i.replace(/\.git$/i,""),!i)?null:`${s}/${i}`}c(gI,"canonicalizeRemote");var Sj=new Set(["","unknown","<synthetic>"]);function Ss(e){if(typeof e!="string")return null;let t=e.trim();return Sj.has(t)?null:t}c(Ss,"resolveModelId");var xj=["claudeCodeVersion","codexCliVersion"];function $i(e){if(typeof e!="object"||e===null)return null;let t=e;for(let n of xj){let r=Ss(t[n]);if(r!==null)return r}return null}c($i,"resolveHarnessVersion");D();import{eq as Rg,and as Pj,sql as II}from"drizzle-orm";D();import{randomUUID as qi}from"node:crypto";import{eq as Wt,and as Zc,gt as Rj,sql as hI}from"drizzle-orm";var Tj=6e4;async function Ui(e){try{let t=new Date(Date.now()-Tj),[n]=await d.select({exists:hI`1`}).from(fe).where(Zc(Wt(fe.userId,e),Wt(fe.workerType,"cli-worker"),Rj(fe.lastHeartbeat,t))).limit(1);return n!==void 0}catch(t){return console.warn("[enqueueJob] hasLiveWorker check failed; skipping warning:",t instanceof Error?t.message:t),!0}}c(Ui,"hasLiveWorker");async function Ot(e){let t=!await Ui(e.userId),n=qi(),r={...e.payload,mirrorId:n};switch(e.taskName){case"process_eval":case"process_conversation":{await d.insert(je).values({...e.mirror,id:n,status:"pending",taskKind:e.taskName,payload:r});break}case"process_insights":{await d.insert(z).values({...e.mirror,id:n,status:"pending",taskKind:e.taskName,payload:r});break}case"process_launch":{await d.insert(ue).values({...e.mirror,id:n,status:"pending",taskKind:e.taskName,payload:r,...e.runId?{runId:e.runId}:{}});break}case"process_send_message":{await d.insert(yd).values({...e.mirror,id:n,status:"pending",taskKind:e.taskName,payload:r});break}}return{id:n,noLiveWorker:t}}c(Ot,"enqueueJob");async function xl(e){let t=`goal-${e.sessionId}-${e.milestone}`,[n]=await d.select({id:Pe.id}).from(Pe).where(Zc(Wt(Pe.userId,e.userId),Wt(Pe.taskKind,"process_session_goal"),Wt(Pe.dedupeKey,t),Wt(Pe.status,"pending"))).limit(1);if(n)return;let r=qi();await d.insert(Pe).values({id:r,userId:e.userId,taskKind:"process_session_goal",payload:{sessionId:e.sessionId,milestone:e.milestone,mirrorId:r},dedupeKey:t})}c(xl,"enqueueSessionGoalJob");async function _I(e){let t=`distill-${e.sessionId}`,[n]=await d.select({id:Pe.id}).from(Pe).where(Zc(Wt(Pe.userId,e.userId),Wt(Pe.taskKind,"distill_memories"),Wt(Pe.dedupeKey,t),Wt(Pe.status,"pending"))).limit(1);if(n)return;let r=qi();await d.insert(Pe).values({id:r,userId:e.userId,taskKind:"distill_memories",payload:{sessionId:e.sessionId,mirrorId:r},dedupeKey:t})}c(_I,"enqueueDistillMemoriesJob");async function yI(e){let t=!await Ui(e.userId),n=`run-cleanup:${e.runId}`,[r]=await d.select({id:Pe.id}).from(Pe).where(Zc(Wt(Pe.userId,e.userId),Wt(Pe.taskKind,"process_run_cleanup"),Wt(Pe.dedupeKey,n),Wt(Pe.status,"pending"))).limit(1);if(r)return{jobId:r.id,noLiveWorker:t};let o=qi();return await d.insert(Pe).values({id:o,userId:e.userId,taskKind:"process_run_cleanup",payload:{runId:e.runId,mirrorId:o},dedupeKey:n}),{jobId:o,noLiveWorker:t}}c(yI,"enqueueRunCleanupJob");async function wI(e){let t=`judge-review:${e.evalTargetId}`,n=qi();await d.execute(hI`
|
|
198
|
+
)`),s=await u.update(x).set({isStale:r}).where(o).returning({id:x.id});return e.json({ok:!0,stale:r,marked:r?s.length:0,cleared:r?0:s.length})});var vj=Ft.object({eventType:Ft.enum(["surfaced","surfaced_with_content","accepted","dismissed","promoted","proxy_injected","redundant","partial_overlap","unresolvable_reference"]),tool:Ft.string().optional(),sessionId:Ft.string().uuid().optional(),projectPath:Ft.string().min(1),instructionId:Ft.string().uuid().optional(),actor:Ft.enum(["human","auto"]).default("human")});Qc.post("/instruction-suggestions/:id/events",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=vj.parse(await e.req.json()),[o]=await u.select().from(x).where(Sg(dr(x.id,n),dr(x.userId,t)));if(!o)return e.json({error:"Suggestion not found"},404);let s=r.eventType==="accepted"||r.eventType==="promoted",i=o.instructionId;if(s&&r.instructionId){let[a]=await u.select({id:h.id}).from(h).where(Sg(dr(h.id,r.instructionId),gj(dr(h.createdBy,t),dr(h.scope,"public")))).limit(1);if(!a)return e.json({error:"instructionId not found",code:"INVALID_INSTRUCTION"},400);i=a.id}if(await u.insert(Ge).values({suggestionId:n,userId:t,eventType:r.eventType,tool:r.tool??null,sessionId:r.sessionId??null,projectPath:r.projectPath,actor:r.actor}),s)await u.update(x).set({acceptedAt:new Date,promotedToInstructionId:i}).where(dr(x.id,n));else if(r.eventType==="dismissed")await u.update(x).set({dismissedAt:new Date}).where(dr(x.id,n));else if(r.eventType==="surfaced"||r.eventType==="surfaced_with_content")try{await vl(t,As`${dr(x.id,n)}`)}catch{}return e.json({ok:!0})});D();import{Hono as Ej}from"hono";import{z as Zc}from"zod";import{eq as Li,and as mI,desc as fI,sql as Sl}from"drizzle-orm";ws();D();ws();import{randomUUID as Ij}from"node:crypto";import{and as Al,eq as Dn,sql as xg}from"drizzle-orm";var bj=.8;async function pI(e){let{userId:t,instructionId:n,projectPath:r,source:o}=e,s=e.treatedShare??.5,[i]=await u.select({id:h.id,name:h.name,content:h.content,archived:h.archived,scope:h.scope,createdBy:h.createdBy}).from(h).where(Dn(h.id,n));if(!i||i.createdBy!==t&&i.scope!=="public")return{ok:!1,code:"not_found",reason:"instruction not found"};if(i.archived)return{ok:!1,code:"archived",reason:"instruction is archived"};let a=Kr(i.content,i.name);if(!a)return{ok:!1,code:"no_body",reason:"instruction body could not be extracted from its content"};let[d]=await u.select({id:Z.id}).from(Z).where(Al(Dn(Z.instructionId,n),Dn(Z.contentHash,a),Dn(Z.projectPath,r)));if(d)return{ok:!1,code:"already_decided",reason:"this exact content already has a verdict on this project \u2014 edit the instruction to re-enter testing"};if(o==="groom"){let[p]=await u.select({id:x.id}).from(x).where(Al(Dn(x.userId,t),Dn(x.instructionId,n),Dn(x.projectPath,r),xg`${x.acceptedAt} IS NULL`,xg`${x.dismissedAt} IS NULL`,xg`${x.score} >= ${bj}`));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:$.id}).from($).where(Al(Dn($.instructionId,n),Dn($.projectPath,r),Dn($.status,"running")));if(l)return{ok:!0,experimentId:l.id,existing:!0};try{let[p]=await u.insert($).values({userId:t,instructionId:n,projectPath:r,status:"running",treatedShare:String(s),salt:Ij(),contentHash:a,source:o}).returning({id:$.id});return{ok:!0,experimentId:p.id,existing:!1}}catch(p){let[f]=await u.select({id:$.id}).from($).where(Al(Dn($.instructionId,n),Dn($.projectPath,r),Dn($.status,"running")));if(f)return{ok:!0,experimentId:f.id,existing:!0};throw p}}c(pI,"nominateExperiment");var Mi=new Ej;Mi.get("/instruction-experiments",async e=>{let t=e.get("userId"),n=e.req.query("projectPath"),r=Math.min(Math.max(Number(e.req.query("limit"))||50,1),200),o=mI(Li($.userId,t),n?Li($.projectPath,n):Sl`true`),s=await u.select({id:$.id,instructionId:$.instructionId,instructionName:h.name,projectPath:$.projectPath,status:$.status,source:$.source,instructionSource:Sl`${h.frontmatter}->>'source'`,stoppedReason:$.stoppedReason,createdAt:$.createdAt}).from($).innerJoin(h,Li($.instructionId,h.id)).where(o).orderBy(fI($.createdAt)).limit(r),[{total:i}]=await u.select({total:Sl`count(*)::int`}).from($).where(o),a=await Promise.all(s.map(async l=>{let p=await Kc(l.id,t),f=l.status,_=l.stoppedReason;if(p&&l.status==="running")try{let v=await ki({experimentId:l.id,userId:t,verdict:p,source:l.source,status:l.status});v&&(f="stopped",_=v)}catch{}return{...l,status:f,stoppedReason:_,verdict:p}})),d=await _l(a.map(l=>l.id));return e.json({experiments:a.map(l=>({...l,graduation:d.get(l.id)??null})),total:i})});var Aj=Zc.object({instructionId:Zc.string().uuid(),projectPath:Zc.string().min(1),source:Zc.enum(["manual","groom","trial","borrow"]).default("manual"),treatedShare:Zc.number().gt(0).lt(1).optional()});Mi.post("/instruction-experiments",async e=>{let t=e.get("userId"),n=Aj.safeParse(await e.req.json().catch(()=>({})));if(!n.success)return e.json({error:n.error.flatten()},400);let r=await pI({userId:t,...n.data});if(!r.ok){let o={not_found:404,archived:400,no_body:400,already_decided:409,not_injectable:409};return e.json({error:r.reason,code:r.code},o[r.code])}return e.json({experimentId:r.experimentId,existing:r.existing},r.existing?200:201)});Mi.get("/instruction-experiments/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await Kc(n,t);if(!r)return e.json({error:"not found"},404);try{let[s]=await u.select({source:$.source,status:$.status}).from($).where(Li($.id,n));s&&await ki({experimentId:n,userId:t,verdict:r,source:s.source,status:s.status})}catch{}let o=await _l([n]);return e.json({verdict:r,graduation:o.get(n)??null})});Mi.get("/instruction-verdicts",async e=>{let t=e.get("userId"),n=e.req.query("instructionId"),r=await 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(mI(Li(Z.userId,t),n?Li(Z.instructionId,n):Sl`true`)).orderBy(fI(Z.decidedAt)).limit(50);return e.json({verdicts:r,total:r.length})});var So=new Sj;So.route("/",Ci);So.route("/",Ag);So.route("/",Es);So.route("/",Qc);So.route("/",Mi);import{Hono as VD}from"hono";import{Hono as _D}from"hono";D();import{Hono as Mj}from"hono";import{z as Fn}from"zod";import{eq as zt,and as Bi,desc as bI,sql as Sr,or as EI,gte as $j,ne as qj}from"drizzle-orm";function gI(e){if(!e||typeof e!="string")return null;let t=e.trim();if(!t)return null;if(!t.includes("://")&&!/^([\w.-]+@)?[\w.-]+:[^/]/.test(t)&&/^[\w.-]+(\.[\w.-]+)+\//.test(t)){let a=t.replace(/\.git$/i,"").replace(/\/+$/,""),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(gI,"canonicalizeRemote");var xj=new Set(["","unknown","<synthetic>"]);function Ss(e){if(typeof e!="string")return null;let t=e.trim();return xj.has(t)?null:t}c(Ss,"resolveModelId");var Tj=["claudeCodeVersion","codexCliVersion"];function $i(e){if(typeof e!="object"||e===null)return null;let t=e;for(let n of Tj){let r=Ss(t[n]);if(r!==null)return r}return null}c($i,"resolveHarnessVersion");D();import{eq as Tg,and as Dj,sql as II}from"drizzle-orm";D();import{randomUUID as qi}from"node:crypto";import{eq as Wt,and as ed,gt as Rj,sql as hI}from"drizzle-orm";var kj=6e4;async function Ui(e){try{let t=new Date(Date.now()-kj),[n]=await u.select({exists:hI`1`}).from(fe).where(ed(Wt(fe.userId,e),Wt(fe.workerType,"cli-worker"),Rj(fe.lastHeartbeat,t))).limit(1);return n!==void 0}catch(t){return console.warn("[enqueueJob] hasLiveWorker check failed; skipping warning:",t instanceof Error?t.message:t),!0}}c(Ui,"hasLiveWorker");async function Ot(e){let t=!await Ui(e.userId),n=qi(),r={...e.payload,mirrorId:n};switch(e.taskName){case"process_eval":case"process_conversation":{await u.insert(je).values({...e.mirror,id:n,status:"pending",taskKind:e.taskName,payload:r});break}case"process_insights":{await u.insert(z).values({...e.mirror,id:n,status:"pending",taskKind:e.taskName,payload:r});break}case"process_launch":{await u.insert(ue).values({...e.mirror,id:n,status:"pending",taskKind:e.taskName,payload:r,...e.runId?{runId:e.runId}:{}});break}case"process_send_message":{await u.insert(wu).values({...e.mirror,id:n,status:"pending",taskKind:e.taskName,payload:r});break}}return{id:n,noLiveWorker:t}}c(Ot,"enqueueJob");async function xl(e){let t=`goal-${e.sessionId}-${e.milestone}`,[n]=await u.select({id:Pe.id}).from(Pe).where(ed(Wt(Pe.userId,e.userId),Wt(Pe.taskKind,"process_session_goal"),Wt(Pe.dedupeKey,t),Wt(Pe.status,"pending"))).limit(1);if(n)return;let r=qi();await 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(xl,"enqueueSessionGoalJob");async function _I(e){let t=`distill-${e.sessionId}`,[n]=await u.select({id:Pe.id}).from(Pe).where(ed(Wt(Pe.userId,e.userId),Wt(Pe.taskKind,"distill_memories"),Wt(Pe.dedupeKey,t),Wt(Pe.status,"pending"))).limit(1);if(n)return;let r=qi();await u.insert(Pe).values({id:r,userId:e.userId,taskKind:"distill_memories",payload:{sessionId:e.sessionId,mirrorId:r},dedupeKey:t})}c(_I,"enqueueDistillMemoriesJob");async function yI(e){let t=!await Ui(e.userId),n=`run-cleanup:${e.runId}`,[r]=await u.select({id:Pe.id}).from(Pe).where(ed(Wt(Pe.userId,e.userId),Wt(Pe.taskKind,"process_run_cleanup"),Wt(Pe.dedupeKey,n),Wt(Pe.status,"pending"))).limit(1);if(r)return{jobId:r.id,noLiveWorker:t};let o=qi();return await 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(yI,"enqueueRunCleanupJob");async function wI(e){let t=`judge-review:${e.evalTargetId}`,n=qi();await u.execute(hI`
|
|
199
199
|
INSERT INTO agent_jobs (id, user_id, task_kind, payload, dedupe_key)
|
|
200
200
|
SELECT ${n}, ${e.userId}, 'process_judge_review',
|
|
201
201
|
${JSON.stringify({evalTargetId:e.evalTargetId,mirrorId:n})}::jsonb,
|
|
@@ -207,9 +207,9 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
207
207
|
AND dedupe_key = ${t}
|
|
208
208
|
AND status = 'pending'
|
|
209
209
|
)
|
|
210
|
-
`)}c(wI,"enqueueJudgeReviewJob");async function vI(e){let t=!await Ui(e.userId),n=`memory-ab:${e.experimentId}`,[r]=await
|
|
210
|
+
`)}c(wI,"enqueueJudgeReviewJob");async function vI(e){let t=!await Ui(e.userId),n=`memory-ab:${e.experimentId}`,[r]=await u.select({id:Pe.id}).from(Pe).where(ed(Wt(Pe.userId,e.userId),Wt(Pe.taskKind,"memory_ab"),Wt(Pe.dedupeKey,n),Wt(Pe.status,"pending"))).limit(1);if(r)return{jobId:r.id,noLiveWorker:t};let o=qi();return await 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(vI,"enqueueMemoryAbJob");D();import{and as Nj,eq as Tl,sql as xo}from"drizzle-orm";var Rl=2,jj=200,Pj={ts:"TypeScript",tsx:"TypeScript",js:"JavaScript",jsx:"JavaScript",py:"Python",sh:"Shell",bash:"Shell",sql:"SQL",md:"Markdown",json:"JSON",yml:"YAML",yaml:"YAML",css:"CSS",html:"HTML",go:"Go",rs:"Rust",rb:"Ruby",java:"Java",toml:"TOML"},Hi=c(e=>xo.raw(`CASE WHEN ${e} IS NULL OR ${e} = '' THEN 0
|
|
211
211
|
ELSE length(${e}) - length(replace(${e}, chr(10), ''))
|
|
212
|
-
+ CASE WHEN right(${e}, 1) = chr(10) THEN 0 ELSE 1 END END`),"nl");async function kl(e,t={}){let{userId:n,force:r=!1}=t,[o]=await
|
|
212
|
+
+ CASE WHEN right(${e}, 1) = chr(10) THEN 0 ELSE 1 END END`),"nl");async function kl(e,t={}){let{userId:n,force:r=!1}=t,[o]=await u.select({id:y.id,metadata:y.metadata}).from(y).where(n?Nj(Tl(y.id,e),Tl(y.userId,n)):Tl(y.id,e));if(!o)return{status:"skipped",reason:"not_found"};let s=o.metadata?.local_session_meta;if(s&&!s.derived_from_events)return{status:"skipped",reason:"hook_enriched"};let[i]=await Fe.execute(xo`
|
|
213
213
|
WITH usage_rows AS (
|
|
214
214
|
SELECT DISTINCT ON (coalesce(metadata->>'requestId', id::text))
|
|
215
215
|
coalesce(
|
|
@@ -244,13 +244,13 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
244
244
|
(SELECT max(timestamp) FROM session_events WHERE session_id = ${e}) AS last_ts,
|
|
245
245
|
(SELECT coalesce(sum(input_tokens), 0)::bigint FROM usage_rows) AS input_tokens,
|
|
246
246
|
(SELECT coalesce(sum(output_tokens), 0)::bigint FROM usage_rows) AS output_tokens
|
|
247
|
-
`),a=Number(i?.total_events??0);if(!i||a===0)return{status:"skipped",reason:"no_events"};if(!r&&s?.derived_from_events&&s.derived_event_count===a&&s.derived_schema===
|
|
247
|
+
`),a=Number(i?.total_events??0);if(!i||a===0)return{status:"skipped",reason:"no_events"};if(!r&&s?.derived_from_events&&s.derived_event_count===a&&s.derived_schema===Rl)return{status:"skipped",reason:"already_enriched"};let d=Number(i.user_message_count),l=Number(i.assistant_message_count),p=Number(i.input_tokens),f=Number(i.output_tokens),_=await Fe.execute(xo`
|
|
248
248
|
SELECT coalesce(tool_name, 'unknown') AS tool, count(*)::int AS n
|
|
249
249
|
FROM session_events
|
|
250
250
|
WHERE session_id = ${e}
|
|
251
251
|
AND event_type IN ('tool_call', 'tool_use')
|
|
252
252
|
GROUP BY 1
|
|
253
|
-
`),v={};for(let N of _)v[N.tool]=Number(N.n);let[
|
|
253
|
+
`),v={};for(let N of _)v[N.tool]=Number(N.n);let[g]=await Fe.execute(xo`
|
|
254
254
|
WITH tool_events AS (
|
|
255
255
|
SELECT
|
|
256
256
|
tool_name,
|
|
@@ -307,7 +307,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
307
307
|
-- on the way to Postgres as well.
|
|
308
308
|
count(*) FILTER (WHERE left(tool_name, 5) = 'mcp__')::int AS mcp_calls
|
|
309
309
|
FROM tool_events
|
|
310
|
-
`),[
|
|
310
|
+
`),[m]=await Fe.execute(xo`
|
|
311
311
|
WITH ordered AS (
|
|
312
312
|
SELECT event_type, timestamp,
|
|
313
313
|
lag(timestamp) OVER (ORDER BY sequence) AS prev_ts
|
|
@@ -328,7 +328,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
328
328
|
COALESCE(jsonb_agg(EXTRACT(hour FROM timestamp AT TIME ZONE 'UTC')::int
|
|
329
329
|
ORDER BY timestamp), '[]'::jsonb) AS hours,
|
|
330
330
|
COALESCE(jsonb_agg(to_char(timestamp AT TIME ZONE 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS"Z"')
|
|
331
|
-
ORDER BY timestamp) FILTER (WHERE rn <= ${
|
|
331
|
+
ORDER BY timestamp) FILTER (WHERE rn <= ${jj}), '[]'::jsonb) AS timestamps,
|
|
332
332
|
COALESCE(jsonb_agg(gap ORDER BY timestamp)
|
|
333
333
|
FILTER (WHERE gap IS NOT NULL), '[]'::jsonb) AS response_times
|
|
334
334
|
FROM user_msgs
|
|
@@ -362,7 +362,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
362
362
|
AND tool_name IN ('Edit','MultiEdit','Write','NotebookEdit')
|
|
363
363
|
AND jsonb_typeof(tool_input) = 'object'
|
|
364
364
|
AND coalesce(tool_input->>'file_path', tool_input->>'notebook_path') IS NOT NULL
|
|
365
|
-
`),A={};for(let N of b){let
|
|
365
|
+
`),A={};for(let N of b){let U=N.path.split(".").pop()?.toLowerCase(),q=U?Pj[U]:void 0;q&&(A[q]=(A[q]??0)+1)}let E=i.first_ts,S=i.last_ts,O={duration_minutes:E&&S?Math.round((new Date(S).getTime()-new Date(E).getTime())/6e4):0,user_message_count:d,assistant_message_count:l,tool_counts:v,languages:A,git_commits:Number(g?.git_commits??0),git_pushes:Number(g?.git_pushes??0),user_interruptions:0,tool_errors:Number(g?.tool_errors??0),lines_added:Number(g?.lines_added??0),lines_removed:Number(g?.lines_removed??0),files_modified:Number(g?.files_modified??0),message_hours:m?.hours??[],user_message_timestamps:m?.timestamps??[],user_response_times:m?.response_times??[],tool_error_categories:I,uses_task_agent:Number(g?.task_agent_calls??0)>0,uses_mcp:Number(g?.mcp_calls??0)>0,derived_from_events:!0,derived_event_count:a,derived_schema:Rl},W={metadata:xo`COALESCE(${y.metadata}, '{}'::jsonb) || ${JSON.stringify({local_session_meta:O})}::jsonb`};return(p>0||f>0)&&(W.tokenUsage={input_tokens:p,output_tokens:f}),await u.update(y).set(W).where(Tl(y.id,e)),{status:"enriched",metrics:O}}c(kl,"deriveSessionEnrichment");async function Nl(e){try{await kl(e)}catch(t){console.warn("[derive-enrichment] failed for session",e,t instanceof Error?t.message:t)}}c(Nl,"deriveSessionEnrichmentBestEffort");async function To(e,t){let n=c((r,o)=>{let s={"org_attribution.source":r};if(o)for(let[i,a]of Object.entries(o))s[`org_attribution.${i}`]=a;ym(s)},"tag");if(t)try{let[r]=await u.select({orgId:te.orgId}).from(te).where(Dj(Tg(te.userId,e),Tg(te.orgId,t))).limit(1);if(r)return n("claim"),t;console.warn(`[sessions] User ${e} attempted to attribute session to org ${t} but is not a member; falling back to profile.active_org_id.`),n("profile_fallback",{claim_rejected:"not_member"})}catch(r){console.warn(`[sessions] Membership lookup failed for user=${e} org=${t}; falling back to profile.active_org_id:`,r instanceof Error?r.message:r),n("profile_fallback",{claim_rejected:"lookup_error"})}else n("profile_fallback",{claim_rejected:"no_claim"});try{let[r]=await u.select({activeOrgId:T.activeOrgId}).from(T).where(Tg(T.id,e)).limit(1);return r?.activeOrgId?r.activeOrgId:(n("unresolved"),null)}catch(r){return console.warn(`[sessions] active_org_id lookup failed for user=${e}; orgId silenced to null:`,r instanceof Error?r.message:r),n("unresolved",{profile_lookup_error:!0}),null}}c(To,"resolveCallerOrgId");async function Oj(e,t,n){if(n)try{await u.execute(II`
|
|
366
366
|
insert into treatment_exposures
|
|
367
367
|
(session_id, user_id, treatment_type, treatment_id, treatment_version, method, exposed_at)
|
|
368
368
|
select ${e}::uuid, ${t}::uuid, 'suggestion', s.instruction_id, 1, 'injected', min(ise.created_at)
|
|
@@ -372,7 +372,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
372
372
|
and ise.event_type in ('surfaced', 'surfaced_with_content', 'proxy_injected')
|
|
373
373
|
group by s.instruction_id
|
|
374
374
|
on conflict on constraint treatment_exposures_unique do nothing
|
|
375
|
-
`)}catch(r){console.warn("[reimport] suggestion exposure reconcile failed:",r instanceof Error?r.message:r)}}c(
|
|
375
|
+
`)}catch(r){console.warn("[reimport] suggestion exposure reconcile failed:",r instanceof Error?r.message:r)}}c(Oj,"reconcileSuggestionExposures");async function Cj(e,t,n){if(n)try{await u.execute(II`
|
|
376
376
|
with drained as (
|
|
377
377
|
insert into treatment_exposures
|
|
378
378
|
(session_id, user_id, treatment_type, treatment_id, treatment_version, method, exposed_at)
|
|
@@ -387,7 +387,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
387
387
|
delete from pending_treatment_exposures
|
|
388
388
|
where external_session_id = ${n}
|
|
389
389
|
and user_id = ${t}::uuid
|
|
390
|
-
`)}catch(r){console.warn("[reimport] memory exposure reconcile failed:",r instanceof Error?r.message:r)}}c(
|
|
390
|
+
`)}catch(r){console.warn("[reimport] memory exposure reconcile failed:",r instanceof Error?r.message:r)}}c(Cj,"reconcileMemoryExposures");var Lj=6;async function jl(e,t,n,r,o){await Nl(e),await Oj(e,t,n),await Cj(e,t,n),r&&o>=Lj&&await _I({sessionId:e,userId:t}).catch(s=>{console.warn("[reimport] distill enqueue failed:",s instanceof Error?s.message:s)})}c(jl,"finalizeSessionIntelligence");var Rg=new Mj;async function kg(e,t){if(!t)return null;try{let[n]=await u.select({id:ee.id}).from(ee).where(Bi(zt(ee.id,t),zt(ee.userId,e))).limit(1);return n?n.id:(console.warn(`[sessions] User ${e} attempted to attribute session to run ${t} but does not own it; run_id left null.`),null)}catch(n){return console.warn(`[sessions] run ownership lookup failed for user=${e} run=${t}; run_id silenced to null:`,n instanceof Error?n.message:n),null}}c(kg,"resolveCallerRunId");var Uj=Fn.object({tool:Fn.string(),externalSessionId:Fn.string().optional(),clientName:Fn.string().optional(),mcpServerVersion:Fn.string().optional(),projectPath:Fn.string().optional(),gitBranch:Fn.string().optional(),startedAt:Fn.string().optional(),metadata:Fn.record(Fn.unknown()).optional(),orgId:Fn.string().uuid().nullable().optional(),runId:Fn.string().uuid().nullable().optional()});Rg.post("/sessions",async e=>{let t=e.get("userId"),n=await e.req.json(),r=Uj.parse(n);if(r.projectPath){let m=await u.select({projectPath:y.projectPath}).from(y).where(Bi(zt(y.userId,t),Sr`${y.projectPath} IS NOT NULL`)).groupBy(y.projectPath);for(let w of m)if(w.projectPath&&r.projectPath!==w.projectPath&&r.projectPath.startsWith(w.projectPath+"/")){r.projectPath=w.projectPath;break}}let o=await To(t,r.orgId??null),s=await kg(t,r.runId??null);if(r.externalSessionId){let[m]=await u.select().from(y).where(Bi(zt(y.userId,t),zt(y.externalSessionId,r.externalSessionId))).limit(1);if(m){let w={};return!m.orgId&&o&&(w.orgId=o,m.orgId=o),!m.runId&&s&&(w.runId=s,m.runId=s),Object.keys(w).length>0&&await u.update(y).set(w).where(zt(y.id,m.id)),e.json(m,200)}}if(r.tool&&r.projectPath){let m=new Date(Date.now()-3e4),w=[zt(y.userId,t),zt(y.tool,r.tool),zt(y.projectPath,r.projectPath),$j(y.startedAt,m)],[I]=await u.select().from(y).where(Bi(...w)).orderBy(bI(y.startedAt)).limit(1);if(I){let b={};return!I.externalSessionId&&r.externalSessionId&&(b.externalSessionId=r.externalSessionId,I.externalSessionId=r.externalSessionId),!I.orgId&&o&&(b.orgId=o,I.orgId=o),!I.runId&&s&&(b.runId=s,I.runId=s),Object.keys(b).length>0&&await u.update(y).set(b).where(zt(y.id,I.id)),e.json(I,200)}}let i=[],a=null,d=gI(r.metadata?.gitRemote??null),l=typeof r.metadata?.gitRootCommit=="string"&&r.metadata.gitRootCommit?r.metadata.gitRootCommit:null,p=typeof r.metadata?.launchProjectPath=="string"&&r.metadata.launchProjectPath?r.metadata.launchProjectPath:null;try{if(p){let[m]=await u.select({projectId:ye.projectId}).from(ye).where(zt(ye.path,p)).orderBy(bI(ye.lastSeen)).limit(1);m&&(i=[{id:m.projectId}],a="launchPath")}if(i.length===0&&d){let[m]=await u.select({id:C.id}).from(C).where(EI(zt(C.gitRemoteUrl,d),Sr`${d} = ANY(${C.gitRemoteAliases})`)).limit(1);m&&(i=[m],a="remote")}if(i.length===0&&l){let[m]=await u.select({id:C.id,gitRemoteUrl:C.gitRemoteUrl,gitRemoteAliases:C.gitRemoteAliases}).from(C).where(zt(C.gitRootCommit,l)).limit(1);m&&(i=[{id:m.id}],a="rootCommit",d&&m.gitRemoteUrl&&m.gitRemoteUrl!==d&&!(m.gitRemoteAliases??[]).includes(d)&&await u.update(C).set({gitRemoteUrl:d,gitRemoteAliases:Sr`array_append(${C.gitRemoteAliases}, ${m.gitRemoteUrl})`}).where(zt(C.id,m.id)))}if(i.length===0&&d){let m=d.split("/").filter(Boolean).pop()??d,[w]=await u.insert(C).values({name:m,gitRemoteUrl:d,gitRootCommit:l,createdBy:t}).onConflictDoUpdate({target:C.gitRemoteUrl,targetWhere:Sr`${C.gitRemoteUrl} IS NOT NULL`,set:{gitRemoteUrl:d}}).returning({id:C.id});w&&(i=[{id:w.id}],a="remote")}}catch(m){console.warn("[sessions] Project match failed (non-fatal):",m)}let f=e.req.header("X-RuleMetric-Internal")==="true"||e.req.header("x-rulemetric-internal")==="true",_;f?_="internal_worker":r.clientName==="mcp"?_="mcp":r.externalSessionId?_="hook":_="proxy";let v;try{[v]=await 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:_,harnessVersion:$i(r.metadata)??void 0,metadata:{...r.metadata,clientName:r.clientName,mcpServerVersion:r.mcpServerVersion}}).returning()}catch(m){if(m.cause?.code==="23505"&&r.externalSessionId){let[I]=await u.select().from(y).where(Bi(zt(y.userId,t),zt(y.externalSessionId,r.externalSessionId))).limit(1);if(I){let b={};return!I.orgId&&o&&(b.orgId=o,I.orgId=o),!I.runId&&s&&(b.runId=s,I.runId=s),Object.keys(b).length>0&&await u.update(y).set(b).where(zt(y.id,I.id)),e.json(I,200)}}throw m}if(!v)return e.json({error:"Failed to create session"},500);let g=!!r.projectPath&&/^\/(Users|home)\/[^/]+\/?$/.test(r.projectPath);if(i.length>0&&r.projectPath&&!g){let m=r.metadata?.isWorktree===!0;try{await u.insert(ye).values({projectId:i[0].id,path:r.projectPath,isWorktree:m}).onConflictDoUpdate({target:[ye.projectId,ye.path],set:{lastSeen:new Date,isWorktree:m}})}catch(w){console.warn("[sessions] project_checkouts upsert failed (non-fatal):",w)}}try{if(i.length>0){let m=r.projectPath?r.projectPath.replace(/\/$/,"")+"/":null,w=m?Sr`${h.name} LIKE ${m+"%"}`:Sr`FALSE`,I=await u.select({instructionId:lt.instructionId}).from(lt).innerJoin(h,zt(h.id,lt.instructionId)).where(Bi(Sr`${lt.projectId} IN (${Sr.join(i.map(b=>Sr`${b.id}`),Sr`, `)})`,EI(qj(h.type,"context_file"),w)));for(let{instructionId:b}of I)await u.insert(se).values({sessionId:v.id,instructionId:b,linkMethod:"project_match"}).onConflictDoNothing()}}catch{}return e.json(v,201)});D();import{Hono as Jj}from"hono";import{z as ft}from"zod";import{eq as jI,and as Kj,sql as xr}from"drizzle-orm";D();import{sql as Wn}from"drizzle-orm";function Pl(){return process.env.EVENT_BATCHING!=="0"}c(Pl,"eventBatchingEnabled");function SI(){let e=Number(process.env.EVENT_BATCH_LINGER_MS);return Number.isFinite(e)&&e>=0?e:50}c(SI,"eventBatchLingerMs");function xI(){let e=Number(process.env.EVENT_BATCH_BUFFER_MAX);return Number.isFinite(e)&&e>0?Math.floor(e):5e3}c(xI,"eventBatchBufferMax");function TI(){let e=Number(process.env.EVENT_BATCH_FLUSH_SIZE);return Number.isFinite(e)&&e>0?Math.floor(e):Hj}c(TI,"eventBatchFlushSize");function RI(){let e=Number(process.env.PG_POOL_MAX)||3;return Math.max(1,e-1)}c(RI,"defaultDrainConcurrency");var Hj=500;function Bj(e){let t=e.lingerMs??SI(),n=e.maxBuffered??xI(),r=Math.max(1,e.flushSize??TI()),o=Math.max(1,e.concurrency??RI()),s=new Map,i=0,a=new Set,d=0,l=!1,p=null,f=[];function _(){let E=f;f=[];for(let S of E)S()}c(_,"notifyProgress");function v(){for(;d<o;){let E=null,S=null;for(let[R,O]of s)if(!(a.has(R)||O.length===0)){S=O.splice(0,r),O.length===0&&s.delete(R),E=R;break}if(E==null||S==null)return;i-=S.length,a.add(E),d++,g(E,S)}}c(v,"tick");async function g(E,S){try{await e.drainSession(E,S)}catch(R){console.warn(`[event-batcher] drain failed for session ${E}; dropping ${S.length} event(s):`,R instanceof Error?R.message:R)}finally{d--,a.delete(E),_(),v()}}c(g,"runDrain");function m(){p!=null||l||(p=setTimeout(()=>{p=null,v()},t),p.unref?.())}c(m,"scheduleLinger");function w(E){if(l||i>=n)return!1;let S=s.get(E.sessionId);return S?S.push(E):s.set(E.sessionId,[E]),i++,i>=r?v():m(),!0}c(w,"push");function I(E){return new Promise(S=>{let R=!1,O=c(()=>{R||(R=!0,clearTimeout(W),S())},"finish"),W=setTimeout(O,E);W.unref?.(),f.push(O)})}c(I,"waitForProgress");async function b(E){let S=E!=null?Date.now()+E:Number.POSITIVE_INFINITY;for(;;){if(v(),i===0&&d===0)return;let R=S-Date.now();if(R<=0)return;await I(Math.min(R,50))}}c(b,"flush");function A(){l=!0,p!=null&&(clearTimeout(p),p=null)}return c(A,"stop"),{push:w,flush:b,stop:A,size:c(()=>i,"size"),inFlight:c(()=>d,"inFlight")}}c(Bj,"createEventBatcher");var AI=5,Fj=[5,20,50];function Wj(e){let t=e.cause;return e instanceof Error&&(t?.code==="23505"||e.message.includes("unique")||e.message.includes("duplicate"))}c(Wj,"isDuplicateKeyError");function zj(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(zj,"toEventTimestamp");async function Vj(e,t){if(t.length===0)return;let n=null,r=!1;for(let o=0;o<=AI;o++)try{let s=t.map((a,d)=>{let l=a.input,p={...l.metadata??{}};l.durationMs!=null&&(p.durationMs=l.durationMs),l.success!=null&&(p.success=l.success);let f=l.toolInput==null?null:JSON.stringify(l.toolInput),_=l.toolOutput==null?null:JSON.stringify(l.toolOutput),v=l.tokenUsage==null?null:JSON.stringify(l.tokenUsage),g=!r&&l.sequence!=null?Wn`${l.sequence}::int`:Wn`NULL::int`;return Wn`(${d+1}::int, ${g}, ${l.eventType}::text, ${l.content??null}::text, ${l.toolName??null}::text, ${f==null?Wn`NULL::jsonb`:Wn`${f}::jsonb`}, ${_==null?Wn`NULL::jsonb`:Wn`${_}::jsonb`}, ${v==null?Wn`NULL::jsonb`:Wn`${v}::jsonb`}, ${l.model??null}::text, ${zj(l.timestamp)}::timestamptz, ${JSON.stringify(p)}::jsonb)`});n=(await u.execute(Wn`
|
|
391
391
|
WITH base AS (
|
|
392
392
|
SELECT COALESCE(MAX(sequence), 0) AS seq
|
|
393
393
|
FROM session_events WHERE session_id = ${e}
|
|
@@ -414,22 +414,22 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
414
414
|
)
|
|
415
415
|
SELECT (SELECT COUNT(*)::int FROM ins) AS inserted,
|
|
416
416
|
(SELECT event_count FROM upd) AS new_count
|
|
417
|
-
`))[0]?.new_count??null;break}catch(s){if(
|
|
417
|
+
`))[0]?.new_count??null;break}catch(s){if(Wj(s)&&o<AI){r=!0;continue}throw s}for(let o of t)if(!(!o.input.instructionIds||o.input.instructionIds.length===0))for(let s of o.input.instructionIds)try{await u.insert(se).values({sessionId:e,instructionId:s,linkMethod:"auto_capture"}).onConflictDoNothing()}catch(i){console.warn("[event-batcher] failed to auto-link instructionId:",i instanceof Error?i.message:i)}if(n!=null)try{let o=n-t.length,s=Fj.filter(i=>o<i&&n>=i);for(let i of s)await xl({sessionId:e,milestone:i,userId:t[0].userId})}catch(o){console.warn("[event-batcher] failed to enqueue process_session_goal:",o instanceof Error?o.message:o)}}c(Vj,"drainSessionEvents");var Ro=null;function Ng(){return Ro==null&&(Ro=Bj({drainSession:Vj})),Ro}c(Ng,"getEventBatcher");function kI(){Ng(),console.log(`[event-batcher] batched event ingest ON (lingerMs=${SI()} flushSize=${TI()} bufferMax=${xI()} drainConcurrency=${RI()}; EVENT_BATCHING=0 to disable)`)}c(kI,"initEventBatcher");async function NI(e=5e3){if(Ro==null)return;Ro.stop(),await Ro.flush(e);let t=Ro.size()+Ro.inFlight();t>0&&console.warn(`[event-batcher] shutdown flush deadline (${e}ms) hit; dropping ~${t} buffered event(s)`)}c(NI,"shutdownEventBatcher");var jg=new Jj,Gj=ft.object({sequence:ft.number().int().optional(),eventType:ft.string(),content:ft.string().nullable().optional(),toolName:ft.string().nullable().optional(),toolInput:ft.union([ft.record(ft.unknown()),ft.array(ft.unknown())]).nullable().optional(),toolOutput:ft.union([ft.record(ft.unknown()),ft.array(ft.unknown())]).nullable().optional(),durationMs:ft.number().optional(),success:ft.boolean().optional(),metadata:ft.record(ft.unknown()).optional(),timestamp:ft.string(),instructionIds:ft.array(ft.string().uuid()).optional(),model:ft.string().nullable().optional(),tokenUsage:ft.record(ft.unknown()).nullable().optional()});jg.post("/sessions/:id/events",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=Gj.parse(r),[s]=await u.select({id:y.id,eventCount:y.eventCount,userId:y.userId}).from(y).where(Kj(jI(y.id,n),jI(y.userId,t)));if(!s)return e.json({error:"Session not found"},404);let i=s.eventCount??0;if(Pl())return Ng().push({sessionId:n,userId:s.userId,input:o})?e.json({buffered:!0,count:1,durable:!1},202):(yc(),e.header("Retry-After","2"),e.json({error:"Ingest busy: the event buffer is full. Retry shortly."},503));let a={...o.metadata??{}};o.durationMs!=null&&(a.durationMs=o.durationMs),o.success!=null&&(a.success=o.success);let d=o.toolInput==null?null:JSON.stringify(o.toolInput),l=o.toolOutput==null?null:JSON.stringify(o.toolOutput),p=JSON.stringify(a),f=o.tokenUsage==null?null:JSON.stringify(o.tokenUsage),_=o.sequence,v=5;for(let g=0;g<=v;g++)try{let m=_!=null?xr`${_}::int`:xr`COALESCE((SELECT MAX(sequence) FROM session_events WHERE session_id = ${n}), 0) + 1`;_=(await u.execute(xr`
|
|
418
418
|
WITH ins AS (
|
|
419
419
|
INSERT INTO session_events (id, session_id, sequence, event_type, content, tool_name, tool_input, tool_output, token_usage, model, timestamp, metadata)
|
|
420
420
|
SELECT
|
|
421
421
|
gen_random_uuid(),
|
|
422
422
|
${n},
|
|
423
|
-
${
|
|
423
|
+
${m},
|
|
424
424
|
${o.eventType},
|
|
425
425
|
${o.content??null},
|
|
426
426
|
${o.toolName??null},
|
|
427
|
-
${
|
|
427
|
+
${d==null?xr`NULL`:xr`${d}::jsonb`},
|
|
428
428
|
${l==null?xr`NULL`:xr`${l}::jsonb`},
|
|
429
429
|
${f==null?xr`NULL`:xr`${f}::jsonb`},
|
|
430
430
|
${o.model??null},
|
|
431
431
|
${new Date(o.timestamp).toISOString()}::timestamptz,
|
|
432
|
-
${xr`${
|
|
432
|
+
${xr`${p}::jsonb`}
|
|
433
433
|
RETURNING sequence
|
|
434
434
|
),
|
|
435
435
|
upd AS (
|
|
@@ -439,19 +439,19 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
439
439
|
RETURNING id
|
|
440
440
|
)
|
|
441
441
|
SELECT ins.sequence FROM ins, upd
|
|
442
|
-
`))[0]?.sequence??_??1;break}catch(
|
|
442
|
+
`))[0]?.sequence??_??1;break}catch(m){let w=m.cause;if(m instanceof Error&&(w?.code==="23505"||m.message.includes("unique")||m.message.includes("duplicate"))&&g<v){_=void 0;continue}throw m}if(o.instructionIds&&o.instructionIds.length>0)for(let g of o.instructionIds)try{await u.insert(se).values({sessionId:n,instructionId:g,linkMethod:"auto_capture"}).onConflictDoNothing()}catch(m){console.warn("[events ingest] failed to auto-link instructionId:",m instanceof Error?m.message:m)}try{let g=i+1,w=[5,20,50].filter(I=>i<I&&g>=I);for(let I of w)await xl({sessionId:s.id,milestone:I,userId:s.userId})}catch(g){console.warn("[events ingest] failed to enqueue process_session_goal:",g instanceof Error?g.message:g)}return e.json({recorded:!0})});D();import{Hono as Yj}from"hono";import{eq as xs,and as Cl,desc as Xj,sql as Qj,ilike as Pg,gte as PI}from"drizzle-orm";D();import{sql as Dl}from"drizzle-orm";function Fi(e){return Dl`
|
|
443
443
|
SELECT project_id::text AS project_id, path, is_worktree, last_seen, is_stale, project_last_seen
|
|
444
444
|
FROM project_canonical_checkouts
|
|
445
|
-
WHERE project_id IN (${Dl.join(e.map(t=>Dl`${t}::uuid`),Dl`, `)})`}c(Fi,"canonicalCheckoutsFor");async function Ol(e,t){if(!e)return t;try{return(await
|
|
446
|
-
`)}c(No,"findPgMessage");import{createHash as mD}from"node:crypto";function Cb(e){if(!e||typeof e!="object")return null;let t=e,n=t._importContentHash,r=t._importContentLen,o=t._importEventCount;return typeof n!="string"||n.length===0||typeof r!="number"||!Number.isInteger(r)||r<0||typeof o!="number"||!Number.isInteger(o)||o<0?null:{contentHash:n,contentLen:r,eventCount:o}}c(Cb,"readImportMarker");function Lb(e,t){return e.length<=t.contentLen?!1:mD("sha256").update(e.slice(0,t.contentLen)).digest("hex")===t.contentHash}c(Lb,"isStrictContentExtension");var Mb=new Set(["claude_code","codex"]);var Kl=new
|
|
445
|
+
WHERE project_id IN (${Dl.join(e.map(t=>Dl`${t}::uuid`),Dl`, `)})`}c(Fi,"canonicalCheckoutsFor");async function Ol(e,t){if(!e)return t;try{return(await u.execute(Fi([e])))[0]?.path??t}catch{return t}}c(Ol,"canonicalPathForProject");var Dg=new Yj;Dg.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(Cl(xs(y.id,n),xs(y.userId,t)));if(!r)return e.json({error:"Session not found"},404);if(await u.update(y).set({endedAt:new Date}).where(xs(y.id,n)),await Nl(n),r.projectPath)try{let o=new Date;o.setHours(0,0,0,0);let s=await Ol(r.projectId,r.projectPath)??r.projectPath,[i]=await u.select({id:z.id}).from(z).where(Cl(xs(z.userId,t),PI(z.createdAt,o),Pg(z.projectPath,`%${ct(s)}%`))).limit(1);if(!i){let[a]=await u.select({completedAt:z.completedAt}).from(z).where(Cl(xs(z.userId,t),xs(z.status,"completed"),Pg(z.projectPath,`%${ct(s)}%`))).orderBy(Xj(z.completedAt)).limit(1),d=a?.completedAt??new Date(0),[{count:l}]=await u.select({count:Qj`COUNT(*)`}).from(y).where(Cl(xs(y.userId,t),Pg(y.projectPath,`%${ct(r.projectPath)}%`),PI(y.startedAt,d)));Number(l)>=5&&await Ot({taskName:"process_insights",payload:{projectPath:s,projectId:r.projectId},userId:t,mirror:{userId:t,projectPath:s,projectId:r.projectId}})}}catch{}return e.json({closed:!0})});D();Vl();import{createHash as fD}from"node:crypto";import{Hono as gD}from"hono";import{z as Jl}from"zod";import{eq as ur,and as $b,sql as Ts}from"drizzle-orm";function Qt(e){let t=e;for(;t&&typeof t=="object";){let n=t.code;if(typeof n=="string")return n;t=t.cause}}c(Qt,"findPgCode");function No(e){let t=[],n=e;for(;n&&typeof n=="object";){let r=n.message;typeof r=="string"&&t.push(r),n=n.cause}return t.join(`
|
|
446
|
+
`)}c(No,"findPgMessage");import{createHash as mD}from"node:crypto";function Cb(e){if(!e||typeof e!="object")return null;let t=e,n=t._importContentHash,r=t._importContentLen,o=t._importEventCount;return typeof n!="string"||n.length===0||typeof r!="number"||!Number.isInteger(r)||r<0||typeof o!="number"||!Number.isInteger(o)||o<0?null:{contentHash:n,contentLen:r,eventCount:o}}c(Cb,"readImportMarker");function Lb(e,t){return e.length<=t.contentLen?!1:mD("sha256").update(e.slice(0,t.contentLen)).digest("hex")===t.contentHash}c(Lb,"isStrictContentExtension");var Mb=new Set(["claude_code","codex"]);var Kl=new gD,qb=Jl.object({content:Jl.string().min(1),tool:Jl.string().optional(),orgId:Jl.string().uuid().nullable().optional()});function hD(e){for(let t of[e.metadata?.sessionId,e.metadata?.codexSessionId])if(typeof t=="string"&&t.length>0)return t;return null}c(hD,"importedExternalSessionId");Kl.post("/sessions/:id/reimport",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=qb.parse(r),[s]=await u.select({id:y.id,eventCount:y.eventCount,externalSessionId:y.externalSessionId,projectId:y.projectId}).from(y).where($b(ur(y.id,n),ur(y.userId,t)));if(!s)return e.json({error:"Session not found"},404);let i=o.tool??nd(o.content);if(!i)return e.json({error:"Could not detect session format. Specify tool parameter."},400);let d=td(i).parse(o.content);if(d.events.length===s.eventCount)return await jl(n,t,s.externalSessionId,s.projectId,s.eventCount??0),e.json({reimported:!1,skipped:"unchanged",eventCount:s.eventCount});if(d.events.length===0&&(s.eventCount??0)>0)return await u.update(y).set({endedAt:d.endedAt?new Date(d.endedAt):new Date}).where(ur(y.id,n)),await jl(n,t,s.externalSessionId,s.projectId,s.eventCount??0),e.json({reimported:!1,skipped:"empty_parse",eventCount:s.eventCount});let l=d.events.map(p=>({sessionId:n,sequence:p.sequence,eventType:p.eventType,content:p.content,toolName:p.toolName,toolInput:p.toolInput,toolOutput:p.toolOutput,tokenUsage:p.tokenUsage,timestamp:new Date(p.timestamp),metadata:p.metadata}));return await Fe.transaction(async p=>{await p.execute(Ts`SET LOCAL statement_timeout = '60s'`),await p.delete(ze).where(ur(ze.sessionId,n));for(let f=0;f<l.length;f+=500)await p.insert(ze).values(l.slice(f,f+500));await p.update(y).set({eventCount:d.events.length,endedAt:d.endedAt?new Date(d.endedAt):new Date,projectPath:d.projectPath??void 0,gitBranch:d.gitBranch??void 0,metadata:d.metadata?Ts`COALESCE(${y.metadata}, '{}'::jsonb) || ${JSON.stringify(d.metadata)}::jsonb`:void 0,model:Ss(d.metadata?.model)??void 0,harnessVersion:$i(d.metadata)??void 0}).where(ur(y.id,n))}),await jl(n,t,s.externalSessionId,s.projectId,d.events.length),e.json({reimported:!0,eventCount:d.events.length})});Kl.post("/sessions/import",async e=>{let t=e.get("userId"),n=await e.req.json(),r=qb.parse(n),o=r.tool??nd(r.content);if(!o)return e.json({error:"Could not detect session format. Specify tool parameter."},400);let i=td(o).parse(r.content),a=hD(i),d=fD("sha256").update(r.content).digest("hex"),l,p=c(async()=>(l===void 0&&(l=await To(t,r.orgId??null)),l),"resolveOrgId"),f=i.events.map(g=>({sequence:g.sequence,eventType:g.eventType,content:g.content,toolName:g.toolName,toolInput:g.toolInput,toolOutput:g.toolOutput,tokenUsage:g.tokenUsage,timestamp:new Date(g.timestamp),metadata:g.metadata})),_={...i.metadata??{},_importContentHash:d,_importContentLen:r.content.length,_importEventCount:i.events.length},v=3;for(let g=0;;g++){let m=a?(await u.select().from(y).where($b(ur(y.userId,t),ur(y.externalSessionId,a))).limit(1))[0]??null:null;if(m&&m.metadata?._importContentHash===d)return e.json({...m,deduped:!0},200);let w=await p(),I=m?{tool:i.tool,projectPath:i.projectPath??void 0,gitBranch:i.gitBranch??void 0,startedAt:new Date(i.startedAt),endedAt:i.endedAt?new Date(i.endedAt):void 0,eventCount:i.events.length,metadata:Ts`COALESCE(${y.metadata}, '{}'::jsonb) || ${JSON.stringify(_)}::jsonb`,model:Ss(i.metadata?.model)??void 0,harnessVersion:$i(i.metadata)??void 0,...w&&!m.orgId?{orgId:w}:{}}:null;try{if(m&&I&&Mb.has(i.tool)){let A=Cb(m.metadata);if(A&&f.length>A.eventCount&&f[A.eventCount]?.sequence===A.eventCount&&Lb(r.content,A)){let[E]=await u.select({count:Ts`COUNT(*)::int`,maxSeq:Ts`MAX(${ze.sequence})::int`}).from(ze).where(ur(ze.sessionId,m.id)),S=Number(E?.count??-1),R=E?.maxSeq==null?null:Number(E.maxSeq);if(S===A.eventCount&&(A.eventCount===0?R===null:R===A.eventCount-1)){let W=await Fe.transaction(async N=>{await N.execute(Ts`SET LOCAL statement_timeout = '60s'`);let U=f.slice(A.eventCount).map(H=>({sessionId:m.id,...H}));for(let H=0;H<U.length;H+=500)await N.insert(ze).values(U.slice(H,H+500));let[q]=await N.update(y).set(I).where(ur(y.id,m.id)).returning();return q});return e.json({...W,appended:!0},200)}}}let b=await Fe.transaction(async A=>{if(await A.execute(Ts`SET LOCAL statement_timeout = '60s'`),m&&I){if(await A.delete(ze).where(ur(ze.sessionId,m.id)),f.length>0){let R=f.map(O=>({sessionId:m.id,...O}));for(let O=0;O<R.length;O+=500)await A.insert(ze).values(R.slice(O,O+500))}let[S]=await A.update(y).set(I).where(ur(y.id,m.id)).returning();return S}let[E]=await A.insert(y).values({userId:t,externalSessionId:a,tool:i.tool,projectPath:i.projectPath,gitBranch:i.gitBranch,startedAt:new Date(i.startedAt),endedAt:i.endedAt?new Date(i.endedAt):null,eventCount:i.events.length,metadata:_,model:Ss(i.metadata?.model),harnessVersion:$i(i.metadata),orgId:w}).returning();if(f.length>0){let S=f.map(R=>({sessionId:E.id,...R}));for(let R=0;R<S.length;R+=500)await A.insert(ze).values(S.slice(R,R+500))}return E});return e.json(b,m?200:201)}catch(b){if(a&&Qt(b)==="23505"&&g<v)continue;throw b}}});var Qi=new _D;Qi.route("/",Rg);Qi.route("/",jg);Qi.route("/",Dg);Qi.route("/",Kl);D();import{Hono as yD}from"hono";import{eq as yn,and as Rs,asc as wD,desc as Hb,sql as Ve,or as Ub,ilike as vD,inArray as Gl}from"drizzle-orm";var Zi=new yD;Zi.get("/sessions",async e=>{let t=e.get("userId"),n=e.req.query("tool"),r=e.req.query("outcome"),o=e.req.query("friction"),s=e.req.query("instructionId"),i=e.req.query("hasAnalysis"),a=e.req.query("projectPath"),d=e.req.query("projectId"),l=e.req.query("gitRemote"),p=Number(e.req.query("limit")??"50"),f=Number(e.req.query("offset")??"0"),_=[yn(y.userId,t)];if(e.req.query("includeInternal")==="true"||_.push(Ve`${y.origin} <> 'internal_worker'`),n&&_.push(yn(y.tool,n)),d){let w=[yn(y.projectId,d)];l&&w.push(Ve`${y.metadata}->>'gitRemote' = ${l}`),_.push(w.length===1?w[0]:Ub(...w))}else if(a||l){let w=[];a&&w.push(vD(y.projectPath,`%${ct(a)}%`)),l&&w.push(Ve`${y.metadata}->>'gitRemote' = ${l}`),_.push(w.length===1?w[0]:Ub(...w))}if(e.req.query("hideEmpty")!=="false"&&_.push(Ve`${y.eventCount} > 0`),i==="true"?_.push(Ve`${y.analysis} IS NOT NULL`):i==="false"&&_.push(Ve`${y.analysis} IS NULL`),e.req.query("needsFacets")==="true"){let w=e.req.query("graderVersion"),I=w!=null&&/^\d+$/.test(w)?Number(w):null;I===null?_.push(Ve`${y.analysis}->>'outcome' IS NULL`):_.push(Ve`(
|
|
447
447
|
${y.analysis}->>'outcome' IS NULL
|
|
448
448
|
OR COALESCE((${y.analysis}->>'graderVersion')::int, 0) < ${I}
|
|
449
|
-
)`)}if(r&&_.push(Ve`${y.analysis}->>'outcome' = ${r}`),o&&_.push(Ve`(${y.analysis}->'friction')::text ILIKE ${"%"+ct(o)+"%"}`),s){let I=(await
|
|
449
|
+
)`)}if(r&&_.push(Ve`${y.analysis}->>'outcome' = ${r}`),o&&_.push(Ve`(${y.analysis}->'friction')::text ILIKE ${"%"+ct(o)+"%"}`),s){let I=(await u.select({sessionId:se.sessionId}).from(se).where(yn(se.instructionId,s))).map(b=>b.sessionId);if(I.length===0)return e.json([]);_.push(Ve`${y.id} IN (${Ve.join(I.map(b=>Ve`${b}`),Ve`, `)})`)}if(e.req.query("summary")==="exists"){let[w]=await u.select({id:y.id}).from(y).where(Rs(..._)).limit(1);return e.json({exists:!!w})}if(e.req.query("summary")==="count"){let[w]=await u.select({count:Ve`count(*)::int`}).from(y).where(Rs(..._));return e.json({count:Number(w?.count??0)})}let m=await u.select().from(y).where(Rs(..._)).orderBy(Hb(y.startedAt)).limit(p).offset(f);if(m.length>0){let w=m.map(B=>B.id),I=Array.from(new Set(m.map(B=>B.projectId).filter(B=>!!B))),[b,A,E,S,R,O,W]=await Promise.all([u.select({sessionId:se.sessionId,name:h.name,contextIdentity:h.contextIdentity,type:h.type,source:Ve`${h.frontmatter}->>'source'`}).from(se).innerJoin(h,yn(h.id,se.instructionId)).where(Gl(se.sessionId,w)),u.select({sessionId:M.sessionId}).from(M).where(Gl(M.sessionId,w)).groupBy(M.sessionId),u.execute(Ve`
|
|
450
450
|
SELECT session_id, MAX(timestamp) AS last_at
|
|
451
451
|
FROM session_events
|
|
452
452
|
WHERE session_id IN (${Ve.join(w.map(B=>Ve`${B}`),Ve`, `)})
|
|
453
453
|
GROUP BY session_id
|
|
454
|
-
`),
|
|
454
|
+
`),u.execute(Ve`
|
|
455
455
|
SELECT DISTINCT ON (e.session_id)
|
|
456
456
|
e.session_id,
|
|
457
457
|
-- Collapse whitespace runs into a single space for preview rendering.
|
|
@@ -466,7 +466,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
466
466
|
AND e.content IS NOT NULL
|
|
467
467
|
AND e.content <> ''
|
|
468
468
|
ORDER BY e.session_id, e.timestamp DESC
|
|
469
|
-
`),
|
|
469
|
+
`),u.execute(Ve`
|
|
470
470
|
SELECT DISTINCT ON (e.session_id)
|
|
471
471
|
e.session_id,
|
|
472
472
|
LEFT(REGEXP_REPLACE(COALESCE(e.content, ''), '[[:space:]]+', ' ', 'g'), 240) AS first_prompt
|
|
@@ -476,7 +476,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
476
476
|
AND e.content IS NOT NULL
|
|
477
477
|
AND e.content <> ''
|
|
478
478
|
ORDER BY e.session_id, e.timestamp ASC
|
|
479
|
-
`),I.length>0?
|
|
479
|
+
`),I.length>0?u.select({id:C.id,name:C.name}).from(C).where(Gl(C.id,I)):Promise.resolve([]),I.length>0?u.execute(Fi(I)):Promise.resolve([])]),N=new Map;for(let B of b){let he=N.get(B.sessionId)??[];he.push({name:B.name,contextIdentity:B.contextIdentity,type:B.type,source:B.source}),N.set(B.sessionId,he)}let U=new Set;for(let B of A)B.sessionId&&U.add(B.sessionId);let q=new Map;for(let B of E)q.set(B.session_id,B.last_at);let H=new Map;for(let B of S)H.set(B.session_id,B.preview);let Y=new Map;for(let B of R)Y.set(B.session_id,B.first_prompt);let ce=new Map,V=new Map;for(let B of O)ce.set(B.id,B.name);for(let B of W)V.set(B.project_id,B.path);let me=m.map(B=>({...B,linkedInstructions:N.get(B.id)??[],dataTier:U.has(B.id)?"full":(B.eventCount??0)>0?"events":"imported",lastMessagePreview:H.get(B.id)??B.analysis?.goalSummary??null,firstUserPrompt:Y.get(B.id)??null,projectName:B.projectId?ce.get(B.projectId)??null:null,primaryCheckoutPath:B.projectId?V.get(B.projectId)??null:null,lastActivityAt:q.get(B.id)??B.startedAt}));return e.json(me)}return e.json(m)});Zi.get("/sessions/project-paths",async e=>{let t=e.get("userId"),n=e.req.query("since"),r=Number(e.req.query("limit")??"20"),o=Math.min(Math.max(r,1),50),s=n?new Date(n):new Date(Date.now()-720*60*60*1e3);if(isNaN(s.getTime()))return e.json({error:"Invalid since timestamp"},400);let i=await u.execute(Ve`
|
|
480
480
|
WITH recent AS (
|
|
481
481
|
SELECT
|
|
482
482
|
s.project_id,
|
|
@@ -508,6 +508,53 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
508
508
|
max(r.started_at) AS last_activity
|
|
509
509
|
FROM recent r
|
|
510
510
|
WHERE r.project_id IS NULL
|
|
511
|
+
-- A CONTAINER is not a project.
|
|
512
|
+
--
|
|
513
|
+
-- This bucket exists because an unlinked path is all we have, and for a
|
|
514
|
+
-- repo with no git remote that is the right call. But "a directory a
|
|
515
|
+
-- session ran in" is not the same claim as "a project", and the
|
|
516
|
+
-- difference is not cosmetic: this list is what cron_suggest_instructions
|
|
517
|
+
-- scores, so every path here becomes a project_path on real
|
|
518
|
+
-- suggestions -- and until 00205 that was a write target for an
|
|
519
|
+
-- unattended actuator. Measured 2026-08-24, an external user's list held
|
|
520
|
+
-- /Users/kylechalmers (his HOME directory, 23 suggestions) and
|
|
521
|
+
-- /Users/kylechalmers/Development (a parent of two unrelated
|
|
522
|
+
-- workspaces, 11 suggestions, still generating that morning); the
|
|
523
|
+
-- operator's own list had held his home directory and a temp directory
|
|
524
|
+
-- the same way. acceptSkill writes <path>/.claude/skills/, so the
|
|
525
|
+
-- home entry meant ~/.claude/skills/ -- the GLOBAL directory, loaded
|
|
526
|
+
-- into every session of every project -- and 8 skills landed there.
|
|
527
|
+
--
|
|
528
|
+
-- The rule is 00201's ancestor test, inverted. There, a checkout inside
|
|
529
|
+
-- another checkout of the same project is a subdirectory rather than a
|
|
530
|
+
-- checkout. Here, an unlinked path that CONTAINS another path this user
|
|
531
|
+
-- has worked in is a container rather than a project.
|
|
532
|
+
--
|
|
533
|
+
-- The dot-directory exclusion is what makes it safe, and it is not a
|
|
534
|
+
-- detail. Claude Code creates worktrees INSIDE the project, at
|
|
535
|
+
-- .claude/worktrees/<name>, so without it every real project that has
|
|
536
|
+
-- ever had a worktree looks like a container and stops being scored --
|
|
537
|
+
-- verified against live data, where the naive rule dropped
|
|
538
|
+
-- kc-content-workspace, a project the user actively works in.
|
|
539
|
+
--
|
|
540
|
+
-- Registered checkouts are kept regardless: if a path is in
|
|
541
|
+
-- project_checkouts then something has already judged it a project,
|
|
542
|
+
-- and this heuristic does not get to overrule that.
|
|
543
|
+
AND (
|
|
544
|
+
EXISTS (
|
|
545
|
+
SELECT 1 FROM project_checkouts pc WHERE pc.path = r.project_path
|
|
546
|
+
)
|
|
547
|
+
OR NOT EXISTS (
|
|
548
|
+
SELECT 1
|
|
549
|
+
FROM sessions s2
|
|
550
|
+
WHERE s2.user_id = ${t}
|
|
551
|
+
AND s2.project_path IS NOT NULL
|
|
552
|
+
AND left(s2.project_path, length(r.project_path) + 1) = r.project_path || '/'
|
|
553
|
+
AND split_part(
|
|
554
|
+
substr(s2.project_path, length(r.project_path) + 2), '/', 1
|
|
555
|
+
) NOT LIKE '.%'
|
|
556
|
+
)
|
|
557
|
+
)
|
|
511
558
|
GROUP BY r.project_path
|
|
512
559
|
),
|
|
513
560
|
combined AS (
|
|
@@ -526,20 +573,20 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
526
573
|
) deduped
|
|
527
574
|
ORDER BY last_activity DESC
|
|
528
575
|
LIMIT ${o}
|
|
529
|
-
`),a=Array.from(i).map(
|
|
576
|
+
`),a=Array.from(i).map(d=>d.project_path).filter(d=>typeof d=="string"&&d!=="");return e.json({projectPaths:a})});Zi.get("/sessions/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(y).where(Rs(yn(y.id,n),yn(y.userId,t)));if(!r)return e.json({error:"Session not found"},404);let o=await u.select({instructionId:se.instructionId,linkMethod:se.linkMethod,name:h.name,contextIdentity:h.contextIdentity,content:h.content,scope:h.scope,type:h.type,frontmatter:h.frontmatter}).from(se).innerJoin(h,yn(h.id,se.instructionId)).where(Rs(yn(se.sessionId,n),Ve`${h.content} IS NOT NULL AND ${h.content} != ''`)),s=await u.select({eventType:ze.eventType,count:Ve`count(*)::int`}).from(ze).where(yn(ze.sessionId,n)).groupBy(ze.eventType),i={};for(let l of s)i[l.eventType]=Number(l.count);let a=null,d=null;if(r.projectId){let[l]=await u.select({name:C.name}).from(C).where(yn(C.id,r.projectId));a=l?.name??null;let[p]=await u.execute(Fi([r.projectId]));d=p?.path??null}return e.json({...r,linkedInstructions:o.map(l=>({...l,source:Zu(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}})});Zi.get("/sessions/:id/events",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=Number(e.req.query("limit")??"100"),o=Number(e.req.query("offset")??"0"),s=e.req.query("sort")==="desc"?"desc":"asc",i=(e.req.query("eventType")??"").split(",").map(f=>f.trim()).filter(Boolean),a=e.req.query("hasContent")==="true",[d]=await u.select({id:y.id}).from(y).where(Rs(yn(y.id,n),yn(y.userId,t)));if(!d)return e.json({error:"Session not found"},404);let l=[yn(ze.sessionId,n)];i.length>0&&l.push(Gl(ze.eventType,i)),a&&l.push(Ve`${ze.content} IS NOT NULL AND ${ze.content} != ''`);let p=await u.select().from(ze).where(Rs(...l)).orderBy(s==="desc"?Hb(ze.sequence):wD(ze.sequence)).limit(r).offset(o);return e.json(p)});D();import{Hono as ID}from"hono";import{z as rn}from"zod";import{eq as ea,and as eh,desc as bD,sql as ta}from"drizzle-orm";var ks=new ID;ks.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(eh(ea(y.id,n),ea(y.userId,t)));if(!r)return e.json({error:"Session not found"},404);let{id:o}=await Ot({taskName:"process_insights",payload:{config:{type:"analyze_session",sessionId:n}},userId:t,mirror:{userId:t,config:{type:"analyze_session",sessionId:n}}});return e.json({jobId:o,status:"pending",tool:r.tool},202)});ks.post("/sessions/repair-analyzed-at",async e=>{let t=e.get("userId"),n=await u.execute(ta`
|
|
530
577
|
UPDATE sessions
|
|
531
578
|
SET analyzed_at = started_at
|
|
532
579
|
WHERE user_id = ${t}
|
|
533
580
|
AND analysis IS NOT NULL
|
|
534
581
|
AND analyzed_at IS NULL
|
|
535
582
|
RETURNING id
|
|
536
|
-
`);return e.json({repaired:n.length})});var
|
|
583
|
+
`);return e.json({repaired:n.length})});var ED=rn.object({metadata:rn.record(rn.unknown()).optional(),analysis:rn.record(rn.unknown()).optional(),analyzedEventCount:rn.number().int().nonnegative().optional(),analyzedTurnCount:rn.number().int().nonnegative().optional(),tokenUsage:rn.object({inputTokens:rn.number().optional(),outputTokens:rn.number().optional(),cacheReadTokens:rn.number().optional(),cacheWriteTokens:rn.number().optional()}).optional(),externalSessionId:rn.string().uuid().optional()}).strict();ks.patch("/sessions/:id/enrich",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=ED.parse(await e.req.json()),[o]=await u.select({id:y.id}).from(y).where(eh(ea(y.id,n),ea(y.userId,t)));if(!o)return e.json({error:"Session not found"},404);let s={};return r.metadata&&(s.metadata=ta`COALESCE(${y.metadata}, '{}'::jsonb) || ${JSON.stringify(r.metadata)}::jsonb`),r.analysis&&(s.analysis=ta`COALESCE(${y.analysis}, '{}'::jsonb) || ${JSON.stringify(r.analysis)}::jsonb`,s.analyzedAt=new Date),r.analyzedEventCount!=null&&(s.analyzedEventCount=r.analyzedEventCount),r.analyzedTurnCount!=null&&(s.analyzedTurnCount=r.analyzedTurnCount),r.tokenUsage&&(s.tokenUsage=r.tokenUsage),r.externalSessionId&&(s.externalSessionId=r.externalSessionId),Object.keys(s).length===0?e.json({error:"No enrichment data provided"},400):(await u.update(y).set(s).where(ea(y.id,n)),e.json({enriched:!0,fields:Object.keys(s)}))});ks.post("/sessions/:id/derive-enrichment",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json().catch(()=>({})),o=await kl(n,{userId:t,force:r.force===!0});return o.status==="skipped"?o.reason==="not_found"?e.json({error:"Session not found"},404):e.json({skipped:!0,reason:o.reason}):e.json({enriched:!0,metrics:o.metrics})});var AD=rn.object({limit:rn.number().int().positive().max(500).default(100),force:rn.boolean().default(!1)});ks.post("/sessions/derive-enrichment-backfill",async e=>{let t=e.get("userId"),{limit:n,force:r}=AD.parse(await e.req.json().catch(()=>({}))),o=ta`(
|
|
537
584
|
${y.metadata}->'local_session_meta' IS NULL
|
|
538
585
|
OR (
|
|
539
586
|
(${y.metadata}->'local_session_meta'->>'derived_from_events')::boolean IS TRUE
|
|
540
|
-
AND COALESCE((${y.metadata}->'local_session_meta'->>'derived_schema')::int, 1) < ${
|
|
587
|
+
AND COALESCE((${y.metadata}->'local_session_meta'->>'derived_schema')::int, 1) < ${Rl}
|
|
541
588
|
)
|
|
542
|
-
)`,s=await
|
|
589
|
+
)`,s=await u.select({id:y.id}).from(y).where(eh(ea(y.userId,t),ta`COALESCE(${y.eventCount}, 0) > 0`,r?ta`COALESCE(${y.metadata}->'local_session_meta'->>'derived_from_events', 'true') = 'true'`:o)).orderBy(bD(y.startedAt)).limit(n),i={scanned:s.length,enriched:0,skipped:0,failed:0},a={};for(let d of s)try{let l=await kl(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})});D();import{Hono as LD}from"hono";import{z as dd}from"zod";import{eq as qt,and as ud,asc as MD,desc as $D,sql as cd}from"drizzle-orm";var SD=Number(process.env.PG_MESSAGE_RECONSTRUCT_BUDGET_BYTES)||16e6,xD=Number(process.env.PG_MESSAGE_RECONSTRUCT_PAGE_SIZE)||200;function TD(e){try{let t=JSON.stringify(e);return typeof t=="string"?t.length:0}catch{return 0}}c(TD,"estimateBytes");async function Yl(e){let t=e.budgetBytes??SD,n=e.pageSize??xD,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=TD(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(Yl,"reconstructMessagesBounded");Zl();D();import{inArray as PD}from"drizzle-orm";async function Kb(e){let t=[...new Set(e.filter(r=>typeof r=="string"&&r.length>0))];if(t.length===0)return new Map;let n=await u.select({hash:Rn.hash,content:Rn.content}).from(Rn).where(PD(Rn.hash,t));return new Map(n.map(r=>[r.hash,r.content]))}c(Kb,"fetchBlobMap");async function ep(e,t){return e?(await Kb([e])).get(e)??t:t}c(ep,"resolveBlob");async function Gb(e){if(e.length===0)return e;let t=await Kb(e.flatMap(n=>[n.systemHash,n.toolsHash,n.injectedHash]));return t.size===0?e:e.map(n=>({...n,systemPrompt:t.get(n.systemHash)??n.systemPrompt,tools:Jb(n.toolsHash!=null?t.get(n.toolsHash):void 0,n.tools),injectedInstructions:Jb(n.injectedHash!=null?t.get(n.injectedHash):void 0,n.injectedInstructions)}))}c(Gb,"resolveSnapshotBlobs");function Jb(e,t){return Array.isArray(e)?e:t}c(Jb,"preferArray");D();import{eq as OD,sql as CD}from"drizzle-orm";var DD=["x-anthropic-billing-header:","You are Claude Code, Anthropic","You are a Claude agent, built on Anthropic's Claude Agent SDK"];function Yb(e){if(!e)return!1;let t=e.slice(0,400);return DD.some(n=>t.includes(n))}c(Yb,"looksLikeHarnessSystemPrompt");hg();async function Xb(e){let{userId:t,hashToInstruction:n,seenHashes:r,linkedProjectPath:o}=e,s=0;for(let[i,a]of n){if(!r.has(i)||!a.name.includes("CLAUDE")&&!a.name.includes("rules"))continue;let[d]=await u.select({id:k.id}).from(k).where(CD`${k.metadata}->>'content_hash' = ${i}`).limit(1);if(d||a.contentLen===0)continue;let[l]=await u.select({content:h.content}).from(h).where(OD(h.id,a.id)).limit(1),p=gl(l?.content,a.name);if(p&&!Yb(p))try{let[f]=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,v=[...p.matchAll(_)].map(m=>m[1].trim()).slice(0,3),g=v.length>0?v.map(m=>({name:`rule-adherence: ${m.slice(0,60)}`,prompt:`Given the instruction "${a.name}", perform a task that would test whether this rule is followed: "${m}"`,expectations:[`The response should demonstrate adherence to: ${m}`]})):[{name:`general-adherence: ${a.name}`,prompt:`Perform a typical task guided by this instruction: "${a.name}"`,expectations:["The response should follow conventions described in the instruction"]}];for(let m of g)await u.insert(Ee).values({evalTargetId:f.id,name:m.name,prompt:m.prompt,expectations:m.expectations}),s++}catch{}}return s}c(Xb,"autoGenerateEvalTargets");function tp(){let e=new Map;return{run(t,n){let r=e.get(t);if(r)return r;let o=Promise.resolve().then(n).finally(()=>{e.delete(t)});return o.catch(()=>{}),e.set(t,o),o},get size(){return e.size}}}c(tp,"makeSingleFlight");var ld=new LD;ld.post("/sessions/:id/link",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),{instructionId:o}=dd.object({instructionId:dd.string().uuid()}).parse(r),[s]=await u.select({id:y.id}).from(y).where(ud(qt(y.id,n),qt(y.userId,t)));return s?(await u.insert(se).values({sessionId:n,instructionId:o,linkMethod:"manual"}).onConflictDoNothing(),e.json({linked:!0})):e.json({error:"Session not found"},404)});ld.get("/instructions/:id/insights",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await u.select({sessionId:se.sessionId,analysis:y.analysis,tool:y.tool,startedAt:y.startedAt}).from(se).innerJoin(y,qt(y.id,se.sessionId)).where(ud(qt(se.instructionId,n),qt(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 sh=new Set(["claude_md","memory","skill_loaded"]);function qD(e,t){return Mf(e,t)??`${e}::${t}`}c(qD,"deriveContextIdentityForAutoCreate");function Qb(e,t){return e==="claude_md"?`Auto-captured CLAUDE.md: ${t}`:e==="skill_loaded"?`Auto-captured skill: ${t}`:e==="memory"?`Auto-captured memory: ${t}`:`Auto-captured context: ${t}`}c(Qb,"mapContextTypeToDescription");var UD=dd.object({sessionId:dd.string().uuid().optional(),backfill:dd.boolean().optional()});async function HD(e,t,n,r){for(let s=0;s<=4;s++)try{await u.execute(cd`
|
|
543
590
|
insert into instruction_version_identities
|
|
544
591
|
(instruction_id, content_hash, version_ordinal, content, first_seen_at, last_seen_at)
|
|
545
592
|
select
|
|
@@ -561,8 +608,8 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
561
608
|
first_seen_at = least(
|
|
562
609
|
instruction_version_identities.first_seen_at, excluded.first_seen_at),
|
|
563
610
|
content = coalesce(instruction_version_identities.content, excluded.content)
|
|
564
|
-
`);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(
|
|
565
|
-
`):null;break}}}}if(
|
|
611
|
+
`);return}catch(i){if(i.cause?.code==="23505"&&s<4)continue;console.warn(`[link-instructions] version identity registration failed for ${e}:`,i instanceof Error?i.message:i);return}}c(HD,"registerVersionIdentity");async function BD(e,t){let n=await u.select({id:h.id,contentHash:h.contentHash,name:h.name,contextIdentity:h.contextIdentity,contentLen:cd`COALESCE(LENGTH(${h.content}), 0)::int`}).from(h).where(qt(h.createdBy,e)),r=new Map,o=new Map;for(let A of n){let E=Number(A.contentLen??0);A.contentHash&&r.set(A.contentHash,{id:A.id,name:A.name??"",contentLen:E}),A.contextIdentity&&o.set(A.contextIdentity,{id:A.id,name:A.name??"",contentHash:A.contentHash})}let s=await Fe.selectDistinctOn([M.sessionId],{id:M.id,sessionId:M.sessionId,metadata:M.metadata}).from(M).where(t?ud(qt(M.userId,e),qt(M.sessionId,t)):qt(M.userId,e)).orderBy(M.sessionId,$D(M.capturedAt)).limit(1e3),i=new Set,a=new Set,d=new Map,l=0,p=0,f=0,_=0,v=new Set,g=[],m=new Map;for(let A of s){if(!A.sessionId||i.has(A.sessionId))continue;i.add(A.sessionId);let S=A.metadata?.contextItems??[],R=null;async function O(){if(R)return R;let[N]=await Fe.select({injectedInstructions:M.injectedInstructions,injectedHash:M.injectedHash}).from(M).where(qt(M.id,A.id)).limit(1);return R=await ep(N?.injectedHash,N?.injectedInstructions??[]),R}c(O,"getInjected");async function W(){if(!A.sessionId)return[];let N=d.get(A.sessionId);if(N)return N;let U=A.sessionId,{messages:q}=await Yl({fetchPage:c(async(Y,ce)=>ad(await Fe.select({sequence:M.sequence,messagesDelta:M.messagesDelta,messagesDeltaRef:M.messagesDeltaRef}).from(M).where(ud(qt(M.sessionId,U),qt(M.userId,e),cd`${M.sequence} > ${Y}`)).orderBy(MD(M.sequence)).limit(ce)),"fetchPage")}),H=q;return d.set(A.sessionId,H),H}c(W,"getMessagesRaw");for(let N of S){let U=N.content_hash;if(!U)continue;a.add(U);let q=N.type??"",H=N.name??"";if(["user_input","core_system_prompt","available_tools","tool_definitions"].includes(H)||["system_reminder","system_prompt","hook_output","deferred_tools"].includes(q)||["date_change","current_date","task_reminder","git_status","unknown_reminder","available_skills"].includes(H)||q==="skill_catalog"||!sh.has(q)&&!q&&!H.includes(".md")&&!H.includes("rules"))continue;let Y,ce=!1,V=null,me=r.get(U);if(me&&(Y=me.id,sh.has(q)&&me.contentLen===0&&(ce=!0)),(!Y||ce)&&sh.has(q)){let P=qD(q,H),re=N.instruction_index,Ce=null,St=re!=null?await O():[];if(re!=null&&St[re])Ce=St[re];else if(q==="skill_loaded"&&N.message_index!=null){let de=await W(),Se=N.message_index,We=de[Se];if(We){let rt=We.content,Xe=(Array.isArray(rt)?rt.find(be=>be.type==="tool_use"&&(be.name==="Skill"||be.name==="execute_skill")):void 0)?.id;if(Xe)for(let be=Se+1;be<de.length&&be<Se+5;be++){let an=de[be];if(an?.role!=="user")continue;let L=an.content;if(!Array.isArray(L))continue;let j=!1,ht=[];for(let jt of L)jt.type==="tool_result"&&jt.tool_use_id===Xe?j=!0:jt.type==="text"&&j&&ht.push(jt.text??"");if(j){Ce=ht.length>0?ht.join(`
|
|
612
|
+
`):null;break}}}}if(V=Ce,ce&&Ce&&Y)try{await u.update(h).set({content:Ce,updatedAt:new Date}).where(qt(h.id,Y)),me.contentLen=Ce.length,f++}catch(de){console.warn(`[link-instructions] Content backfill failed for instruction ${Y}:`,de instanceof Error?de.message:de),_++}let le=o.get(P);if(le&&le.contentHash!==U){if(Ce){let de=Ce,Se=4,We=!1;for(let rt=0;rt<=Se;rt++)try{await u.transaction(async Le=>{await Le.select({id:h.id}).from(h).where(qt(h.id,le.id)).for("update");let[{maxVersion:Xe}]=await Le.select({maxVersion:cd`COALESCE(MAX(${xe.versionNumber}), 0)`}).from(xe).where(qt(xe.instructionId,le.id)),be=Xe+1;await Le.insert(xe).values({instructionId:le.id,versionNumber:be,content:de,frontmatter:{name:H,description:Qb(q,H),type:"context_file",scope:"personal",version:`1.${be}.0`},changeSummary:"Auto-detected content change from context snapshot",createdBy:e}),await Le.update(h).set({content:de,contentHash:U,version:`1.${be}.0`,updatedAt:new Date}).where(qt(h.id,le.id))}),We=!0;break}catch(Le){if(Le.cause?.code==="23505"&&rt<Se)continue;console.warn(`[link-instructions] Version update failed for instruction ${le.id} (identity: ${P}):`,Le instanceof Error?Le.message:Le),_++;break}We&&(r.set(U,{id:le.id,name:le.name,contentLen:de.length}),le.contentHash=U,f++)}Y=le.id}else if(!le)try{let de=H,Se=Qb(q,H),We=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(h).values({name:de,description:Se,type:"context_file",scope:"personal",scopeRef:e,version:"1.0.0",content:We,frontmatter:rt,contentHash:U,contextIdentity:P,createdBy:e}).onConflictDoNothing().returning({id:h.id});be&&(await Xe.insert(xe).values({instructionId:be.id,versionNumber:1,content:We,frontmatter:rt,changeSummary:"Auto-created from context snapshot",createdBy:e}),Le=be.id)}),Le&&(r.set(U,{id:Le,name:de,contentLen:We.length}),o.set(P,{id:Le,name:de,contentHash:U}),Y=Le,p++)}catch(de){console.warn(`[link-instructions] Auto-create failed for ${P}:`,de instanceof Error?de.message:de),_++;try{let[Se]=await u.select({id:h.id}).from(h).where(ud(qt(h.createdBy,e),qt(h.contextIdentity,P))).limit(1);Se&&(Y=Se.id)}catch(Se){console.warn(`[link-instructions] Fallback identity lookup also failed for ${P}:`,Se instanceof Error?Se.message:Se)}}}if(!Y||!A.sessionId)continue;let B=`${Y}:${U}`,he=m.get(B);he?!he.content&&V&&(he.content=V):m.set(B,{instructionId:Y,contentHash:U,content:V}),g.push({sessionId:A.sessionId,instructionId:Y,linkMethod:"context_file",contentHash:U}),l++,v.add(A.sessionId)}}for(let A of m.values())await HD(A.instructionId,A.contentHash,A.content,new Date);for(let A=0;A<g.length;A+=500)try{await u.insert(se).values(g.slice(A,A+500)).onConflictDoUpdate({target:[se.sessionId,se.instructionId],set:{contentHash:cd`coalesce(${se.contentHash}, excluded.content_hash)`}})}catch(E){console.warn("[link-instructions] batched link insert failed:",E instanceof Error?E.message:E)}let w=0,I=null;for(let A of s){if(!A.sessionId)continue;let[E]=await u.select({projectId:y.projectId,projectPath:y.projectPath}).from(y).where(qt(y.id,A.sessionId)).limit(1);if(!E?.projectId||!E.projectPath)continue;let S=E.projectPath.replace(/\/$/,"");I=S;let O=A.metadata?.contextItems??[];for(let W of O){let N=r.get(W.content_hash);if(!N)continue;let U=W.name??"";if(!(U.startsWith("/")&&!U.startsWith(S+"/")))try{await u.insert(lt).values({projectId:E.projectId,instructionId:N.id,addedBy:e}).onConflictDoNothing(),w++}catch{}}break}let b=await Xb({userId:e,hashToInstruction:r,seenHashes:a,linkedProjectPath:I});return{linked:l,created:p,updated:f,failed:_,sessionsLinked:v.size,instructionsMatched:r.size,snapshotsScanned:i.size,projectsLinked:w,evalsGenerated:b,scope:t?"session":"backfill"}}c(BD,"runLinkInstructions");var FD=tp();ld.post("/sessions/link-instructions",async e=>{let t=e.get("userId"),n=await e.req.json().catch(()=>({})),r=UD.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 FD.run(`${t}:${o??"*backfill*"}`,()=>BD(t,o));return e.json(i)});D();import{Hono as WD}from"hono";import{eq as Ns,and as Zb,sql as np,inArray as zD}from"drizzle-orm";var ih=new WD;ih.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(Zb(Ns(y.id,n),Ns(y.userId,t))).limit(1);if(!r)return e.json({error:"Session not found"},404);let[[{eventCount:o}],[{snapshotCount:s}],i]=await Promise.all([u.select({eventCount:np`count(*)::int`}).from(ze).where(Ns(ze.sessionId,n)),u.select({snapshotCount:np`count(*)::int`}).from(M).where(Ns(M.sessionId,n)),u.selectDistinct({ref:M.messagesDeltaRef}).from(M).where(Zb(Ns(M.sessionId,n),np`${M.messagesDeltaRef} IS NOT NULL`))]),a=i.map(f=>f.ref).filter(f=>!!f);await u.transaction(async f=>{await f.update(Ge).set({sessionId:null}).where(Ns(Ge.sessionId,n)),await f.execute(np`UPDATE scaffolding_fingerprints SET first_session_id = NULL WHERE first_session_id = ${n}`),await f.delete(y).where(Ns(y.id,n))});let d=0,l=0,p=0;if(a.length>0){let f=await u.selectDistinct({ref:M.messagesDeltaRef}).from(M).where(zD(M.messagesDeltaRef,a)),_=new Set(f.map(g=>g.ref)),v=a.filter(g=>!_.has(g));if(l=a.length-v.length,v.length>0)try{let{getSupabaseAdmin:g}=await Promise.resolve().then(()=>(sd(),Bb)),{SNAPSHOT_DELTA_BUCKET:m}=await Promise.resolve().then(()=>(Zl(),Vb)),{error:w}=await g().storage.from(m).remove(v);w?(p=v.length,console.warn(`[sessions:delete] blob GC failed for ${v.length} ref(s): ${w.message}`)):d=v.length}catch(g){p=v.length,console.warn(`[sessions:delete] blob GC unavailable: ${g.message}`)}}return e.json({deleted:!0,eventsDeleted:o,snapshotsDeleted:s,blobsDeleted:d,blobsRetained:l,blobsFailed:p})});var jo=new VD;jo.route("/",Qi);jo.route("/",Zi);jo.route("/",ks);jo.route("/",ld);jo.route("/",ih);D();import{Hono as JD}from"hono";import{eq as ah}from"drizzle-orm";import{sql as na}from"drizzle-orm";var pd=new JD;async function e0(e){let[t]=await u.select({activeOrgId:T.activeOrgId}).from(T).where(ah(T.id,e));return t?.activeOrgId??null}c(e0,"getActiveOrgId");var t0="interval '30 minutes'";pd.get("/projects",async e=>{let t=e.get("userId"),n=Math.min(200,Math.max(1,Number(e.req.query("limit")??"50"))),r=Math.max(0,Number(e.req.query("offset")??"0")),o=await e0(t);if(!o)return e.json({projects:[],total:0});let s=await u.execute(na`
|
|
566
613
|
WITH session_activity AS (
|
|
567
614
|
SELECT
|
|
568
615
|
s.id,
|
|
@@ -608,18 +655,18 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
608
655
|
JOIN projects p ON p.id = pa.project_id
|
|
609
656
|
ORDER BY pa.last_activity_at DESC NULLS LAST, p.created_at DESC
|
|
610
657
|
LIMIT ${n} OFFSET ${r}
|
|
611
|
-
`),[{count:i}={count:0}]=await
|
|
658
|
+
`),[{count:i}={count:0}]=await u.execute(na`
|
|
612
659
|
SELECT COUNT(DISTINCT s.project_id)::int AS count
|
|
613
660
|
FROM sessions s
|
|
614
661
|
WHERE s.org_id = ${o}
|
|
615
662
|
AND s.origin <> 'internal_worker'
|
|
616
663
|
AND s.project_id IS NOT NULL
|
|
617
|
-
`);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})});
|
|
664
|
+
`);return e.json({projects:s.map(a=>({id:a.id,name:a.name,description:a.description,gitRemoteUrl:a.git_remote_url,githubRepo:a.github_repo,createdAt:a.created_at,sessionCount:a.session_count,activeSessionCount:a.active_session_count,lastActivityAt:a.last_activity_at,primaryCheckoutPath:a.primary_checkout_path})),total:i})});pd.get("/projects/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e0(t);if(!r)return e.json({error:"No active org"},404);let[o]=await u.select().from(C).where(ah(C.id,n));if(!o)return e.json({error:"Project not found"},404);let[{has_session:s}={has_session:!1}]=await u.execute(na`
|
|
618
665
|
SELECT EXISTS(
|
|
619
666
|
SELECT 1 FROM sessions
|
|
620
667
|
WHERE project_id = ${n} AND org_id = ${r} AND origin <> 'internal_worker'
|
|
621
668
|
) AS has_session
|
|
622
|
-
`);if(o.orgId!==r&&!s)return e.json({error:"Project not found"},404);let[i]=await
|
|
669
|
+
`);if(o.orgId!==r&&!s)return e.json({error:"Project not found"},404);let[i]=await u.execute(na`
|
|
623
670
|
WITH session_activity AS (
|
|
624
671
|
SELECT
|
|
625
672
|
s.id,
|
|
@@ -638,7 +685,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
638
685
|
)::int AS active_session_count,
|
|
639
686
|
MAX(last_at) AS last_activity_at
|
|
640
687
|
FROM session_activity
|
|
641
|
-
`),a=await
|
|
688
|
+
`),a=await u.select({path:ye.path,isWorktree:ye.isWorktree,firstSeen:ye.firstSeen,lastSeen:ye.lastSeen}).from(ye).where(ah(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})});D();import{Hono as KD}from"hono";import{z as Vn}from"zod";import{eq as gt,and as Po,sql as n0,desc as GD,inArray as YD}from"drizzle-orm";var Tr=new KD,XD=Vn.object({name:Vn.string().min(1).max(255),description:Vn.string().min(1),scope:Vn.enum(["org","team","personal"]),scopeRef:Vn.string().uuid().optional(),version:Vn.string().default("1.0.0"),tags:Vn.array(Vn.string()).optional()});Tr.get("/packs",async e=>{let t=e.get("userId"),n=e.req.query("scope"),r=parseInt(e.req.query("limit")??"100",10),o=[gt(Ue.archived,!1),gt(Ue.createdBy,t)];n&&o.push(gt(Ue.scope,n));let s=await u.select().from(Ue).where(Po(...o)).orderBy(GD(Ue.updatedAt)).limit(r),i=s.map(d=>d.id),a={};if(i.length>0){let d=await u.select({packId:Me.packId,count:n0`COUNT(*)::int`}).from(Me).where(YD(Me.packId,i)).groupBy(Me.packId);for(let l of d)a[l.packId]=l.count}return e.json(s.map(d=>{let l=a[d.id]??0;return{...d,instructionCount:l,tier:Pc(l)}}))});Tr.get("/packs/:id",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await u.select().from(Ue).where(Po(gt(Ue.id,t),gt(Ue.createdBy,n),gt(Ue.archived,!1)));if(!r)return e.json({error:"Pack not found"},404);let o=await u.select({instruction:h,position:Me.position,slotOverrides:Me.slotOverrides,addedAt:Me.addedAt}).from(Me).innerJoin(h,gt(Me.instructionId,h.id)).where(gt(Me.packId,t)).orderBy(Me.position),s=o.length;return e.json({...r,instructionCount:s,tier:Pc(s),instructions:o.map(i=>({...i.instruction,position:i.position,slotOverrides:i.slotOverrides,addedAt:i.addedAt}))})});Tr.post("/packs",async e=>{let t=e.get("userId"),n=await e.req.json(),r=XD.parse(n),o=r.scope==="personal"?t:r.scopeRef??null,[s]=await u.insert(Ue).values({name:r.name,description:r.description,scope:r.scope,scopeRef:o,version:r.version,tags:r.tags??[],createdBy:t}).returning();return e.json({...s,instructionCount:0,tier:Pc(0)},201)});Tr.post("/packs/:id/instructions",async e=>{let t=e.req.param("id"),n=e.get("userId"),r=await e.req.json(),{instructionId:o}=Vn.object({instructionId:Vn.string().uuid()}).parse(r),[s]=await u.select().from(Ue).where(Po(gt(Ue.id,t),gt(Ue.createdBy,n),gt(Ue.archived,!1)));if(!s)return e.json({error:"Pack not found"},404);let[i]=await u.select().from(Me).where(Po(gt(Me.packId,t),gt(Me.instructionId,o)));if(i)return e.json({error:"Instruction already in this pack"},409);let[a]=await u.select({max:n0`COALESCE(MAX(${Me.position}), -1)`}).from(Me).where(gt(Me.packId,t)),[d]=await u.insert(Me).values({packId:t,instructionId:o,position:(a?.max??-1)+1,addedBy:n}).returning();return e.json(d,201)});Tr.delete("/packs/:id/instructions/:instructionId",async e=>{let t=e.req.param("id"),n=e.get("userId"),r=e.req.param("instructionId"),[o]=await u.select({id:Ue.id}).from(Ue).where(Po(gt(Ue.id,t),gt(Ue.createdBy,n),gt(Ue.archived,!1)));return o?(await u.delete(Me).where(Po(gt(Me.packId,t),gt(Me.instructionId,r))).returning()).length===0?e.json({error:"Instruction not in this pack"},404):e.json({success:!0}):e.json({error:"Pack not found"},404)});Tr.post("/packs/:id/apply",async e=>{let t=e.req.param("id"),n=e.get("userId"),r=await e.req.json(),{projectId:o}=Vn.object({projectId:Vn.string().uuid()}).parse(r),s=await 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(Po(gt(lt.projectId,o),gt(lt.instructionId,a.instructionId)));d||(await u.insert(lt).values({projectId:o,instructionId:a.instructionId,addedBy:n}),i++)}return e.json({success:!0,linked:i,total:s.length})});Tr.post("/packs/:id/fork",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(Ue).where(Po(gt(Ue.id,n),gt(Ue.archived,!1)));if(!r)return e.json({error:"Pack not found"},404);if(r.createdBy===t)return e.json({error:"Cannot fork your own pack"},400);let[o]=await 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)});D();import{Hono as QD}from"hono";import{eq as ch,and as ZD,sql as r0}from"drizzle-orm";var rp=new QD;function o0(e){return{id:e.id,name:e.name,forkedFromId:e.forked_from_id,version:e.version,scope:e.scope,createdBy:e.created_by,createdAt:e.created_at,depth:e.depth}}c(o0,"mapRow");rp.get("/instructions/:id/lineage",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:h.id,name:h.name,forkedFromId:h.forkedFromId,version:h.version,scope:h.scope,createdBy:h.createdBy,createdAt:h.createdAt}).from(h).where(ZD(ch(h.id,n),ch(h.archived,!1),ch(h.createdBy,t)));if(!r)return e.json({error:"Instruction not found"},404);let o=r.forkedFromId?await u.execute(r0`
|
|
642
689
|
WITH RECURSIVE ancestors AS (
|
|
643
690
|
SELECT id, name, forked_from_id, version, scope, created_by, created_at::text, 1 as depth
|
|
644
691
|
FROM instructions
|
|
@@ -651,7 +698,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
651
698
|
WHERE i.archived = false AND a.depth < 20
|
|
652
699
|
)
|
|
653
700
|
SELECT * FROM ancestors ORDER BY depth DESC
|
|
654
|
-
`):[],s=await
|
|
701
|
+
`):[],s=await u.execute(r0`
|
|
655
702
|
WITH RECURSIVE descendants AS (
|
|
656
703
|
SELECT id, name, forked_from_id, version, scope, created_by, created_at::text, 1 as depth
|
|
657
704
|
FROM instructions
|
|
@@ -664,32 +711,32 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
664
711
|
WHERE i.archived = false AND d.depth < 20
|
|
665
712
|
)
|
|
666
713
|
SELECT * FROM descendants ORDER BY depth ASC
|
|
667
|
-
`),i=Array.isArray(o)?o.map(o0):[],a=s.map(o0);return e.json({current:{id:r.id,name:r.name,forkedFromId:r.forkedFromId,version:r.version,scope:r.scope,createdBy:r.createdBy,createdAt:r.createdAt},ancestors:i,descendants:a})});D();import{Hono as
|
|
714
|
+
`),i=Array.isArray(o)?o.map(o0):[],a=s.map(o0);return e.json({current:{id:r.id,name:r.name,forkedFromId:r.forkedFromId,version:r.version,scope:r.scope,createdBy:r.createdBy,createdAt:r.createdAt},ancestors:i,descendants:a})});D();import{Hono as nO}from"hono";import{z as js}from"zod";import{eq as Do,and as gd,desc as uh,gt as lh,lt as rO,sql as un}from"drizzle-orm";function fd(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(fd,"reportedEngines");var eO=10;function sp(e,t){let n=c(f=>e.capabilities===null||e.capabilities.includes(f),"claims"),r=e.engines!=null&&!e.engines.claude&&!e.engines.codex,o=t.filter(f=>n(f.kind)),s=t.filter(f=>!n(f.kind)),i=r?o.filter(f=>nl(f.kind)):[],a=r?o.filter(f=>!nl(f.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 ${md(i)} job(s) cannot produce real output (${op(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 ${md(a)} more queued behind it.`:"Worker is online and running a job."):a.some(f=>f.oldestMinutes>=eO)?(l="warn",p=`Worker is online but its queue is not draining \u2014 ${md(a)} job(s) pending (${op(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 ${tO(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(`${md(a)} job(s) are waiting on it (${op(a)}) \u2014 they will drain once it is back.`)):(l="fail",p="No worker has ever connected \u2014 nothing is analyzing your sessions.",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(`${md(s)} job(s) cannot be claimed by this worker (${op(s)}). These handlers need direct database credentials, which a worker-only install does not have \u2014 they will stay pending until a worker with DATABASE_URL runs.`)),{severity:l,headline:p,hints:d,stuck:a,unclaimable:s,engineBlocked:i}}c(sp,"assessWorkerHealth");function md(e){return e.reduce((t,n)=>t+n.count,0)}c(md,"totalOf");function op(e){return e.map(t=>`${t.kind}\xD7${t.count}`).join(", ")}c(op,"describe");function tO(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(tO,"formatAge");var dh=[{table:"session_send_jobs",defaultKind:"process_send_message",labelIdSql:"NULL::uuid",labelTextSql:"session_id::text"},{table:"launch_jobs",defaultKind:"process_launch",labelIdSql:"NULL::uuid",labelTextSql:"tool"},{table:"eval_jobs",defaultKind:"process_eval",labelIdSql:"eval_target_id",labelTextSql:"NULL::text"},{table:"insights_jobs",defaultKind:"process_insights",labelIdSql:"NULL::uuid",labelTextSql:"project_path"},{table:"agent_jobs",defaultKind:"agent_job",labelIdSql:"(payload->>'evalTargetId')::uuid",labelTextSql:"payload->>'projectPath'"}],s0=dh.map(({table:e,defaultKind:t})=>({table:e,defaultKind:t}));var ra=new nO,ph=6e4,i0=600*1e3,mh=3600*1e3,oO=10080*60*1e3,sO={"cli-worker":["process_eval","process_insights","process_launch","process_send_message","process_conversation","process_session_goal","distill_memories","memory_ab","process_run_cleanup","cron_suggest_instructions","cron_refine_cases","cron_retire_unused_skills","cron_refresh_skills","cron_refresh_pricing","cron_eval_autorun","cron_auto_accept_suggestions","cron_instruction_training","cron_instruction_evolution","process_judge_review"]},iO=new Set([]),aO=js.object({workerType:js.enum(["mcp","cli-worker","gateway","proxy"]),clientName:js.string().min(1),clientVersion:js.string().optional(),workerVersion:js.string().optional(),metadata:js.record(js.unknown()).optional()}),fh=s0;async function cO(e,t=0){let n=new Date(Date.now()-t).toISOString(),r=fh.map(({table:i,defaultKind:a})=>un`
|
|
668
715
|
SELECT coalesce(task_kind, ${a}) AS kind,
|
|
669
716
|
count(*)::int AS n,
|
|
670
717
|
min(created_at) AS oldest
|
|
671
|
-
FROM ${
|
|
718
|
+
FROM ${un.raw(i)}
|
|
672
719
|
WHERE user_id = ${e}
|
|
673
720
|
AND status = 'pending'
|
|
674
721
|
AND created_at < ${n}::timestamptz
|
|
675
722
|
GROUP BY 1
|
|
676
|
-
`),o=await
|
|
723
|
+
`),o=await u.execute(un`${un.join(r,un` UNION ALL `)} ORDER BY oldest ASC`),s=Date.now();return o.map(i=>({kind:i.kind,count:Number(i.n),oldestMinutes:Math.round((s-new Date(i.oldest).getTime())/6e4)}))}c(cO,"queryPendingKinds");async function a0(e){return(await u.execute(un`${un.join(fh.map(({table:n})=>un`
|
|
677
724
|
SELECT count(*)::int AS n
|
|
678
|
-
FROM ${
|
|
725
|
+
FROM ${un.raw(n)}
|
|
679
726
|
WHERE user_id = ${e}
|
|
680
727
|
AND status IN ('claimed', 'running')
|
|
681
728
|
AND lease_expires_at IS NOT NULL
|
|
682
729
|
AND lease_expires_at > now()
|
|
683
|
-
`),
|
|
730
|
+
`),un` UNION ALL `)}`)).reduce((n,r)=>n+Number(r.n),0)>0}c(a0,"hasLiveInFlightJob");async function dO(e,t){let n=new Date(Date.now()-i0).toISOString(),r=fh.map(({table:p,defaultKind:f})=>un`
|
|
684
731
|
SELECT coalesce(task_kind, ${f}) AS kind,
|
|
685
732
|
count(*)::int AS n,
|
|
686
733
|
min(created_at) AS oldest
|
|
687
|
-
FROM ${
|
|
734
|
+
FROM ${un.raw(p)}
|
|
688
735
|
WHERE user_id = ${e}
|
|
689
736
|
AND status = 'pending'
|
|
690
737
|
AND created_at < ${n}::timestamptz
|
|
691
738
|
GROUP BY 1
|
|
692
|
-
`),o=await
|
|
739
|
+
`),o=await u.execute(un`${un.join(r,un` UNION ALL `)} ORDER BY oldest ASC`),s=t===null?o:o.filter(p=>t.includes(p.kind));if(s.length===0||await a0(e))return null;let i=s.reduce((p,f)=>p+Number(f.n),0),a=Date.now()-new Date(s[0].oldest).getTime(),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(i0/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(dO,"checkStalePendingAdvisory");function gh(e){return!e||!Array.isArray(e.capabilities)?null:e.capabilities.filter(t=>typeof t=="string")}c(gh,"reportedCapabilities");function uO(e,t){if(e!=="cli-worker")return null;let n=fd(t);if(n===null||n.claude||n.codex)return null;let r=gh(t),o=r===null?[...Lc]:r.filter(s=>Lc.has(s));return o.length===0?null:{code:"NO_LLM_ENGINE",message:`No local LLM engine found (neither \`claude\` nor \`codex\`), but this worker advertises ${o.length} kind(s) that spawn one: ${o.join(", ")}. Those jobs COMPLETE WITH EMPTY OUTPUT rather than failing \u2014 a missing binary resolves to a null result. Install an engine and restart the worker. If one IS installed, the worker cannot see it on its PATH (launchd starts minimal).`,meta:{affected:o}}}c(uO,"checkEngineAdvisory");function lO(e,t){let n=sO[e];if(!n||n.length===0)return null;let r=t&&Array.isArray(t.capabilities)?t.capabilities.filter(s=>typeof s=="string"):null;if(r===null)return{code:"NO_CAPABILITIES_REPORTED",message:`Worker did not report any capabilities. Expected ${n.join(", ")} \u2014 likely an outdated worker process. Restart it.`};let o=n.filter(s=>!r.includes(s)&&!iO.has(s));return o.length>0?{code:"MISSING_CAPABILITIES",message:`Worker is missing capabilities: ${o.join(", ")}. Jobs of those kinds will sit pending. Restart the worker after deploying API updates.`}:null}c(lO,"checkWorkerAdvisory");ra.post("/workers/heartbeat",async e=>{let t=e.get("userId"),n=await e.req.json(),r=aO.parse(n);await u.insert(fe).values({userId:t,workerType:r.workerType,clientName:r.clientName,clientVersion:r.clientVersion??null,workerVersion:r.workerVersion??null,metadata:r.metadata??null}).onConflictDoUpdate({target:[fe.userId,fe.workerType,fe.clientName],set:{lastHeartbeat:new Date,clientVersion:r.clientVersion??null,workerVersion:r.workerVersion??null,metadata:r.metadata??null}}),u.delete(fe).where(gd(Do(fe.userId,t),rO(fe.lastHeartbeat,new Date(Date.now()-oO)))).catch(()=>{});let o=lO(r.workerType,r.metadata);return o??=uO(r.workerType,r.metadata),!o&&r.workerType==="cli-worker"&&(o=await dO(t,gh(r.metadata))),o&&console.warn(`[workers/heartbeat] ${r.workerType} ${r.clientName} (version=${r.workerVersion??"unknown"}): ${o.code} \u2014 ${o.message}`),e.json({status:"ok",...o?{advisory:o}:{}})});async function c0(e){let t=new Date(Date.now()-mh),n=await u.select({lastHeartbeat:fe.lastHeartbeat}).from(fe).where(gd(Do(fe.userId,e),Do(fe.workerType,"cli-worker"),lh(fe.lastHeartbeat,t))),r=Date.now();return{cliEverConnected:n.length>0,workerActive:n.some(o=>r-new Date(o.lastHeartbeat).getTime()<ph)}}c(c0,"computeCliWorkerSetupSignals");async function ip(e){let t=await u.select({lastHeartbeat:fe.lastHeartbeat,metadata:fe.metadata}).from(fe).where(gd(Do(fe.userId,e),Do(fe.workerType,"cli-worker"))).orderBy(uh(fe.lastHeartbeat)).limit(10);for(let n of t){let r=n.metadata?.llmEngines;if(r&&typeof r=="object"){let o=r;return{claude:o.claude===!0,codex:o.codex===!0,codexModel:typeof o.codexModel=="string"?o.codexModel:null,observedAt:new Date(n.lastHeartbeat).toISOString()}}}return null}c(ip,"getLatestLlmEngines");ra.get("/workers/status",async e=>{let t=e.get("userId"),n=new Date(Date.now()-mh),r=await u.select().from(fe).where(gd(Do(fe.userId,t),lh(fe.lastHeartbeat,n))).orderBy(uh(fe.lastHeartbeat)),o=Date.now(),s=r.map(i=>{let a=o-new Date(i.lastHeartbeat).getTime();return{id:i.id,workerType:i.workerType,clientName:i.clientName,clientVersion:i.clientVersion,workerVersion:i.workerVersion,lastHeartbeat:i.lastHeartbeat,connectedAt:i.connectedAt,status:a<ph?"active":"inactive"}});return e.json(s)});ra.get("/workers/health",async e=>{let t=e.get("userId"),n=new Date(Date.now()-mh),[r,o,s]=await Promise.all([u.select({lastHeartbeat:fe.lastHeartbeat,clientName:fe.clientName,clientVersion:fe.clientVersion,metadata:fe.metadata}).from(fe).where(gd(Do(fe.userId,t),Do(fe.workerType,"cli-worker"),lh(fe.lastHeartbeat,n))).orderBy(uh(fe.lastHeartbeat)).limit(1),cO(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<ph,ageSeconds:a==null?null:Math.round(a/1e3),capabilities:i?gh(d):null,busy:s,engines:i?fd(d):null},p=sp(l,o);return e.json({worker:{present:l.present,active:l.active,ageSeconds:l.ageSeconds,clientName:i?.clientName??null,clientVersion:i?.clientVersion??null,lastHeartbeat:i?.lastHeartbeat??null,capabilities:l.capabilities,engines:l.engines},pending:o,verdict:p})});D();import{Hono as yO}from"hono";import{z as dp}from"zod";import{and as hh,desc as w0,eq as Rr,inArray as wO,isNull as vO,sql as Be}from"drizzle-orm";D();import{sql as d0}from"drizzle-orm";async function u0(e,t){return Promise.all(t.filter(n=>n.canonicalPath!=null).map(async n=>{let[r,o,s]=await Promise.all([vs(e,n.projectId),Ao(e,n.projectId),ji(e,n.projectId)]),[i,a,d,l]=await Promise.all([u.execute(d0`
|
|
693
740
|
SELECT (SELECT count(*)::int FROM instruction_experiments e
|
|
694
741
|
WHERE e.user_id = ${e}::uuid AND e.status = 'running'
|
|
695
742
|
AND e.project_path = ${n.canonicalPath}) AS running,
|
|
@@ -711,7 +758,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
711
758
|
AND e.project_path = s.project_path
|
|
712
759
|
AND e.status = 'running'
|
|
713
760
|
)) AS eligible
|
|
714
|
-
`),Pi(e,n.canonicalPath,n.projectId,o.windowDays),
|
|
761
|
+
`),Pi(e,n.canonicalPath,n.projectId,o.windowDays),u.execute(d0`
|
|
715
762
|
SELECT (SELECT count(*)::int FROM instruction_suggestions s
|
|
716
763
|
JOIN instructions i ON i.id = s.instruction_id
|
|
717
764
|
WHERE s.user_id = ${e}::uuid
|
|
@@ -769,7 +816,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
769
816
|
AND s.project_id = ${n.projectId}::uuid
|
|
770
817
|
AND ev.created_at > now() - make_interval(days => ${o.windowDays})
|
|
771
818
|
) AS window_resets_at
|
|
772
|
-
`),Pi(e,n.canonicalPath,n.projectId,o.windowDays,"skill")]),
|
|
819
|
+
`),Pi(e,n.canonicalPath,n.projectId,o.windowDays,"skill")]),p=i[0],f=p?.running??0,_=p?.eligible??0;return{projectId:n.projectId,trials:{running:f,orphaned:p?.orphaned??0,eligible:_,maxConcurrent:r.maxConcurrent,maxPerRun:r.maxPerRun,blocked:Il(r,f,_).blocked},autoAccept:{enabled:s.allowed,usedInWindow:a,skillsUsedInWindow:l,maxSkillsPerWindow:null,maxPerWindow:o.maxPerWindow,maxPerRun:o.maxPerRun,windowDays:o.windowDays,eligible:d[0]?.eligible??0,windowResetsAt:d[0]?.window_resets_at??null}}}))}c(u0,"loadPromotionPaths");D();import{sql as l0}from"drizzle-orm";function m0(e){for(let t=e,n=0;t&&n<4;n++){if(t.code==="42P01")return!0;t=t.cause}return!1}c(m0,"isMissingRelation");var p0=["proposed","ready","applied","measuring","improved","inconclusive","harmful","rollback_ready","reverted","failed"];async function f0(e,t){try{let[n,r]=await Promise.all([u.execute(l0`
|
|
773
820
|
SELECT a.id::text, a.instruction_id::text, i.name AS title, i.type AS artifact,
|
|
774
821
|
a.harness, a.target_path, a.project_path, a.status, a.apply_mode,
|
|
775
822
|
a.verdict_detail, a.updated_at::text
|
|
@@ -778,7 +825,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
778
825
|
WHERE a.user_id = ${e}::uuid
|
|
779
826
|
ORDER BY a.updated_at DESC
|
|
780
827
|
LIMIT 50
|
|
781
|
-
`),
|
|
828
|
+
`),u.execute(l0`
|
|
782
829
|
SELECT status, count(*)::int AS n,
|
|
783
830
|
count(*) FILTER (
|
|
784
831
|
WHERE a.applied_at > now() - make_interval(hours => ${t})
|
|
@@ -787,7 +834,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
787
834
|
FROM recommendation_applications a
|
|
788
835
|
WHERE user_id = ${e}::uuid
|
|
789
836
|
GROUP BY ROLLUP (status)
|
|
790
|
-
`)]),o=Object.fromEntries(
|
|
837
|
+
`)]),o=Object.fromEntries(p0.map(a=>[a,0])),s=0,i=0;for(let a of r)a.status===null?(s=a.applied_in_window,i=a.applied_ever):o[a.status]=a.n;return{available:!0,counts:o,appliedInWindow:s,appliedEver:i,applications:n.map(a=>({id:a.id,instructionId:a.instruction_id,title:a.title,artifact:a.artifact,harness:a.harness,targetPath:a.target_path,projectPath:a.project_path,status:a.status,applyMode:a.apply_mode,verdictDetail:a.verdict_detail,updatedAt:a.updated_at}))}}catch(n){if(!m0(n))throw n;return{available:!1,counts:Object.fromEntries(p0.map(r=>[r,0])),appliedInWindow:0,appliedEver:0,applications:[]}}}c(f0,"loadRecommendationAdoption");D();import{sql as pO}from"drizzle-orm";var mO={blocking:!1,totalAwaitingReview:0,targets:[]};async function ap(e){let t=await u.execute(pO`
|
|
791
838
|
WITH enrolled AS (
|
|
792
839
|
-- Segment resolved ONCE per enrolled target. Leaving the function call in
|
|
793
840
|
-- the join predicate below made Postgres re-evaluate it per row.
|
|
@@ -839,7 +886,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
839
886
|
GROUP BY id, name
|
|
840
887
|
)
|
|
841
888
|
SELECT * FROM per_target
|
|
842
|
-
`);return
|
|
889
|
+
`);return fO(t)}c(ap,"loadReviewGate");function fO(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?mO:{blocking:!0,totalAwaitingReview:t.reduce((n,r)=>n+r.awaitingReview,0),targets:t}}c(fO,"summarizeReviewGate");function cp(e){return{blocking:e.blocking,totalAwaitingReview:e.totalAwaitingReview,targets:e.targets.map(t=>({id:t.id,name:t.name,awaitingReview:t.awaitingReview,humanLabeled:t.humanLabeled,humanLabeledWith:t.humanLabeledWith,humanLabeledWithout:t.humanLabeledWithout,pilotTarget:t.pilotTarget}))}}c(cp,"toReviewGateResponse");import{sql as Ps}from"drizzle-orm";var g0=["all","evolution","decided","skipped","failed"],gO=["cron_instruction_evolution","cron_instruction_training","cron_auto_accept_suggestions","cron_suggest_instructions","cron_refine_cases","cron_retire_unused_skills","process_insights"];function oa(e){switch(e){case"evolution":return Ps`kind IN (${Ps.join(gO.map(t=>Ps`${t}`),Ps`, `)})`;case"decided":return Ps`decision IS NOT NULL`;case"skipped":return Ps`skipped IS NOT NULL`;case"failed":return Ps`status = 'failed'`}}c(oa,"clauseFor");function h0(e){return e==="all"?null:oa(e)}c(h0,"filterClause");D();import{sql as _0}from"drizzle-orm";var hO={insights:"regenerate_insights_jobs",training:"enqueue_instruction_training",autoAccept:"enqueue_auto_accept_suggestions",evolution:"enqueue_instruction_evolution",autorun:"enqueue_eval_autorun"};async function _O(e){try{let t=await Fe.execute(_0`SELECT ${_0.raw(e)}() AS r`);return String(t[0]?.r??"0")}catch(t){return`error: ${t instanceof Error?t.message:String(t)}`}}c(_O,"runProducer");async function y0(){let e={};for(let[t,n]of Object.entries(hO))e[t]=await _O(n);return e}c(y0,"runAllProducers");var hd=new yO;var IO=dp.object({limit:dp.coerce.number().int().min(1).max(100).default(20),hours:dp.coerce.number().int().min(1).max(720).default(24),filter:dp.enum(g0).default("all")}),bO=6e4,EO=3600*1e3,AO=8;function v0(e,t){return Be.join(dh.map(({table:n,defaultKind:r,labelIdSql:o,labelTextSql:s})=>Be`
|
|
843
890
|
SELECT id::text AS id,
|
|
844
891
|
${n} AS source_table,
|
|
845
892
|
coalesce(task_kind, ${r}) AS kind,
|
|
@@ -856,8 +903,8 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
856
903
|
result->>'decision' AS decision,
|
|
857
904
|
error
|
|
858
905
|
FROM ${Be.raw(n)}
|
|
859
|
-
WHERE user_id = ${e}::uuid AND ${t}`),Be` UNION ALL `)}c(v0,"jobSelect");
|
|
860
|
-
AND completed_at > now() - make_interval(hours => ${o})`),f=h0(s),_=f?Be`SELECT * FROM (${
|
|
906
|
+
WHERE user_id = ${e}::uuid AND ${t}`),Be` UNION ALL `)}c(v0,"jobSelect");hd.post("/loop/run-now",async e=>e.json(await y0()));hd.get("/loop/status",async e=>{let t=e.get("userId"),n=IO.safeParse({limit:e.req.query("limit"),hours:e.req.query("hours"),filter:e.req.query("filter")??void 0});if(!n.success)return e.json({error:"Invalid query",details:n.error.flatten()},400);let{limit:r,hours:o,filter:s}=n.data,i=Be`now() - make_interval(hours => ${o})`,a=f0(t,o),d=ap(t),l=v0(t,Be`status IN ('pending', 'claimed', 'running')`),p=v0(t,Be`status IN ('completed', 'failed')
|
|
907
|
+
AND completed_at > now() - make_interval(hours => ${o})`),f=h0(s),_=f?Be`SELECT * FROM (${p}) w WHERE ${f}`:Be`SELECT * FROM (${p}) w`,v=u.execute(Be`
|
|
861
908
|
WITH proj AS (
|
|
862
909
|
SELECT s.project_id,
|
|
863
910
|
max(greatest(s.started_at, coalesce(s.ended_at, s.started_at))) AS last_activity
|
|
@@ -865,7 +912,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
865
912
|
WHERE s.user_id = ${t}::uuid AND s.project_id IS NOT NULL
|
|
866
913
|
GROUP BY s.project_id
|
|
867
914
|
ORDER BY last_activity DESC
|
|
868
|
-
LIMIT ${
|
|
915
|
+
LIMIT ${AO}
|
|
869
916
|
)
|
|
870
917
|
SELECT p.project_id::text AS project_id,
|
|
871
918
|
pr.name AS name,
|
|
@@ -889,19 +936,19 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
889
936
|
LEFT JOIN projects pr ON pr.id = p.project_id
|
|
890
937
|
LEFT JOIN project_canonical_checkouts c ON c.project_id = p.project_id
|
|
891
938
|
ORDER BY p.last_activity DESC
|
|
892
|
-
`),
|
|
939
|
+
`),g=u.execute(Be`
|
|
893
940
|
SELECT count(*)::int AS total,
|
|
894
941
|
count(*) FILTER (WHERE coalesce(c.is_stale, false))::int AS stale
|
|
895
942
|
FROM (SELECT DISTINCT s.project_id FROM sessions s
|
|
896
943
|
WHERE s.user_id = ${t}::uuid AND s.project_id IS NOT NULL) p
|
|
897
944
|
LEFT JOIN project_canonical_checkouts c ON c.project_id = p.project_id
|
|
898
|
-
`),[
|
|
945
|
+
`),[m,w,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`
|
|
899
946
|
SELECT count(*)::int AS total,
|
|
900
947
|
count(*) FILTER (WHERE ${oa("evolution")})::int AS evolution,
|
|
901
948
|
count(*) FILTER (WHERE ${oa("decided")})::int AS decided,
|
|
902
949
|
count(*) FILTER (WHERE ${oa("skipped")})::int AS skipped,
|
|
903
950
|
count(*) FILTER (WHERE ${oa("failed")})::int AS failed
|
|
904
|
-
FROM (${
|
|
951
|
+
FROM (${p}) q`)]),A=[...new Set([...m,...w].map(j=>j.label_id).filter(j=>!!j))],E=new Map;if(A.length>0){let j=await u.select({id:k.id,name:k.name}).from(k).where(wO(k.id,A));for(let ht of j)E.set(ht.id,ht.name)}let S=Date.now(),R=c(j=>(j.label_id?E.get(j.label_id)??null:null)??j.label_text,"label"),O=m.filter(j=>j.status==="claimed"||j.status==="running").map(j=>({id:j.id,kind:j.kind,label:R(j),claimedAt:j.claimed_at,elapsedSeconds:j.claimed_at?Math.round((S-new Date(j.claimed_at).getTime())/1e3):null,leaseHealthy:j.lease_expires_at?new Date(j.lease_expires_at).getTime()>S:!1})),W=m.filter(j=>j.status==="pending").map(j=>({id:j.id,kind:j.kind,label:R(j),createdAt:j.created_at,waitedSeconds:Math.round((S-new Date(j.created_at).getTime())/1e3),attempts:j.attempts})),N=w.map(j=>({id:j.id,kind:j.kind,label:R(j),finishedAt:j.completed_at,durationSeconds:j.claimed_at&&j.completed_at?Math.round((new Date(j.completed_at).getTime()-new Date(j.claimed_at).getTime())/1e3):null,outcome:j.status==="failed"?"failed":j.skipped?"skipped":j.decision?"decided":"ok",reason:j.skipped??j.decision??(j.status==="failed"?"failed":null),detail:j.reason??j.error??null})),U=await u.select({id:ie.id,evalTargetId:ie.evalTargetId,targetName:k.name,createdAt:ie.createdAt,decision:ie.decision,applied:ie.applied,effectClass:ie.effectClass,proposalSource:ie.proposalSource}).from(ie).leftJoin(k,Rr(ie.evalTargetId,k.id)).where(Rr(ie.userId,t)).orderBy(w0(ie.createdAt)).limit(r),q=u.execute(Be`
|
|
905
952
|
SELECT count(*)::int AS decisions,
|
|
906
953
|
count(*) FILTER (WHERE p.applied)::int AS applied,
|
|
907
954
|
count(*) FILTER (WHERE p.created_at > ${i})::int AS window_decisions,
|
|
@@ -938,12 +985,12 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
938
985
|
FROM instruction_promotions p
|
|
939
986
|
LEFT JOIN eval_targets t ON t.id = p.eval_target_id
|
|
940
987
|
WHERE p.user_id = ${t}::uuid
|
|
941
|
-
`),H=
|
|
988
|
+
`),H=u.select({proposed:Be`count(*)::int`,accepted:Be`count(*) filter (where ${x.acceptedAt} is not null)::int`,lastAcceptedAt:Be`max(${x.acceptedAt})::text`,windowSurfaced:Be`count(*) filter (where ${x.generatedAt} > ${i})::int`,windowAccepted:Be`count(*) filter (where ${x.acceptedAt} > ${i})::int`,windowDeclined:Be`count(*) filter (where ${x.declinedAt} > ${i})::int`,pending:Be`count(*) filter (
|
|
942
989
|
where ${x.acceptedAt} is null
|
|
943
990
|
and ${x.declinedAt} is null
|
|
944
991
|
and ${x.dismissedAt} is null
|
|
945
992
|
and not ${x.isStale}
|
|
946
|
-
)::int`}).from(x).where(Tr(x.userId,t)),[te,de,K,pe]=await Promise.all([d.select({n:Be`count(*)::int`}).from(ie).where(Tr(ie.userId,t)),d.select({n:Be`count(*)::int`}).from($).where(hh(Tr($.userId,t),Tr($.status,"running"))),d.select({kind:x.kind,n:Be`count(*)::int`}).from(x).where(hh(Tr(x.userId,t),wO(x.dismissedAt))).groupBy(x.kind),d.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(Tr(Re.userId,t))]),[B,he]=await Promise.all([U,H]),P=B[0],re=he[0],[Ce,St]=await Promise.all([v,h]),le=d0(t,Ce.map(j=>({projectId:j.project_id,canonicalPath:j.canonical_path}))),ce=Ce.map(j=>({projectId:j.project_id,name:j.name,canonicalPath:j.canonical_path,canonicalLastSeenAt:j.canonical_last_seen_at,stale:j.stale,lastActivityAt:j.last_activity_at,lastAnalysedAt:j.last_analysed_at,suggestionsPending:j.suggestions_pending,suggestionsAccepted:j.suggestions_accepted,lastAcceptedAt:j.last_accepted_at})),We=(await d.select({lastHeartbeat:fe.lastHeartbeat,clientName:fe.clientName,clientVersion:fe.clientVersion,metadata:fe.metadata}).from(fe).where(hh(Tr(fe.userId,t),Tr(fe.workerType,"cli-worker"),Be`${fe.lastHeartbeat} > ${new Date(S-bO).toISOString()}::timestamptz`)).orderBy(w0(fe.lastHeartbeat)).limit(1))[0],rt=We?S-new Date(We.lastHeartbeat).getTime():null,Le=W.map(j=>({kind:j.kind,count:1,oldestMinutes:Math.round(j.waitedSeconds/60)})),Xe={present:We!=null,active:rt!=null&&rt<IO,ageSeconds:rt==null?null:Math.round(rt/1e3),capabilities:null,busy:O.length>0,engines:We?pu(We.metadata):null},be=await a,an=await le,L=await u;return e.json({worker:{present:Xe.present,active:Xe.active,ageSeconds:Xe.ageSeconds,clientName:We?.clientName??null,clientVersion:We?.clientVersion??null,lastHeartbeat:We?.lastHeartbeat??null},verdict:sm(Xe,Le),reviewGate:cm(L),running:O,queued:W,recent:N,recentTotal:I[0]?.n??0,filterCounts:{all:b[0]?.total??0,evolution:b[0]?.evolution??0,decided:b[0]?.decided??0,skipped:b[0]?.skipped??0,failed:b[0]?.failed??0},proposals:q,proposalTotal:te[0]?.n??0,changes:{decisions:P?.decisions??0,applied:P?.applied??0,byDecision:{promote:P?.promote??0,revert:P?.revert??0,refuse:P?.refuse??0},readyToApply:P?.ready_to_apply??0,readyToApplyTargetId:P?.ready_to_apply_target_id??null,readyToApplyPromotionId:P?.ready_to_apply_promotion_id??null,lastAppliedAt:P?.last_applied_at??null,lastDecidedAt:P?.last_decided_at??null,suggestionsProposed:re?.proposed??0,suggestionsAccepted:re?.accepted??0,suggestionsPending:re?.pending??0,lastAcceptedAt:re?.lastAcceptedAt??null,landedTotal:(P?.applied??0)+(re?.accepted??0)+be.appliedEver,window:{hours:o,landed:(P?.window_applied??0)+(re?.windowAccepted??0)+be.appliedInWindow,decisions:P?.window_decisions??0,promotionsApplied:P?.window_applied??0,adoptionApplied:be.appliedInWindow,suggestionsSurfaced:re?.windowSurfaced??0,suggestionsAccepted:re?.windowAccepted??0,suggestionsDeclined:re?.windowDeclined??0}},counts:{experimentsRunning:de[0]?.n??0,suggestions:Object.fromEntries(K.map(j=>[j.kind,j.n]))},insights:{entries:pe[0]?.entries??0,distinct:pe[0]?.distinct??0,repeated:pe[0]?.repeated??0,dismissed:pe[0]?.dismissed??0,maxTimesGenerated:pe[0]?.maxTimesGenerated??0,lastSeenAt:pe[0]?.lastSeenAt??null},delivery:{projects:ce,total:St[0]?.total??0,staleCount:St[0]?.stale??0},promotionPaths:{projects:an.map(j=>({projectId:j.projectId,trials:{running:j.trials.running,orphaned:j.trials.orphaned,eligible:j.trials.eligible,maxConcurrent:j.trials.maxConcurrent,maxPerRun:j.trials.maxPerRun,blocked:j.trials.blocked},autoAccept:{enabled:j.autoAccept.enabled,usedInWindow:j.autoAccept.usedInWindow,maxPerWindow:j.autoAccept.maxPerWindow,maxPerRun:j.autoAccept.maxPerRun,windowDays:j.autoAccept.windowDays,eligible:j.autoAccept.eligible,windowResetsAt:j.autoAccept.windowResetsAt}}))},adoption:{available:be.available,counts:be.counts,applications:be.applications.map(j=>({id:j.id,instructionId:j.instructionId,title:j.title,artifact:j.artifact,harness:j.harness,targetPath:j.targetPath,projectPath:j.projectPath,status:j.status,applyMode:j.applyMode,verdictDetail:j.verdictDetail,updatedAt:j.updatedAt}))},windowHours:o,limit:r,filter:s})});import{Hono as AO}from"hono";var dm=new AO;dm.get("/loop/review-gate",async e=>{let t=e.get("userId");return e.json(cm(await am(t)))});D();import{Hono as xO}from"hono";import{z as Ct}from"zod";import{and as RO,eq as On,sql as Ds}from"drizzle-orm";D();import{and as SO,eq as I0}from"drizzle-orm";async function nt(e,t){let[n]=await d.select({id:k.id}).from(k).where(SO(I0(k.id,e),I0(k.userId,t)));return n}c(nt,"verifyTargetOwnership");function hu(e){return e===!0||e==="true"}c(hu,"flagOn");function lm(e,t=!1){let n=e??{},r=n.autoEvolvePairs,o=typeof r=="number"?r:typeof r=="string"?Number(r):NaN,s=Number.isFinite(o)&&o>=1,i=hu(n.autoEvolvePaused);return{enabled:hu(n.autoEvolveEnabled),optOut:hu(n.autoEvolveOptOut),apply:hu(n.autoEvolveApply),paused:t||i,pausedBy:t?"account":i?"target":null,pairs:s?Math.min(128,Math.max(10,Math.floor(o))):10,pairsConfigured:s,accumulate:hu(n.autoEvolveAccumulate)}}c(lm,"resolveEvolutionSettings");function b0(e,t){let n={...e??{}};return t.enabled!==void 0&&(n.autoEvolveEnabled=t.enabled),t.optOut!==void 0&&(n.autoEvolveOptOut=t.optOut),t.apply!==void 0&&(n.autoEvolveApply=t.apply),t.paused!==void 0&&(n.autoEvolvePaused=t.paused),t.accumulate!==void 0&&(n.autoEvolveAccumulate=t.accumulate),t.pairs!==void 0&&(n.autoEvolvePairs=Math.min(128,Math.max(10,Math.floor(t.pairs)))),n}c(b0,"applyEvolutionPatch");function mm(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(mm,"describeEvolutionState");var Jn=new xO,TO=Ct.object({enabled:Ct.boolean().optional(),projectId:Ct.string().uuid().optional(),limits:Ct.object({minScore:Ct.number().min(Hn.minScore.min).max(Hn.minScore.max).nullable(),maxPerRun:Ct.number().int().min(Hn.maxPerRun.min).max(Hn.maxPerRun.max).nullable(),maxPerWindow:Ct.number().int().min(Hn.maxPerWindow.min).max(Hn.maxPerWindow.max).nullable(),windowDays:Ct.number().int().min(Hn.windowDays.min).max(Hn.windowDays.max).nullable()}).partial().optional()}).refine(e=>e.enabled!==void 0||e.limits!==void 0,{message:"nothing to change: pass `enabled`, `limits`, or both"});Jn.get("/settings/auto-accept",async e=>{let t=e.get("userId"),n=e.req.query("projectId")??null,[r]=await d.select({enabled:R.autoAcceptSuggestions}).from(R).where(On(R.id,t)),o=null;if(n){let[i]=await d.select({raw:Ds`${C.metadata}->>'autoAcceptSuggestions'`}).from(C).where(On(C.id,n));i?.raw!=null&&(o=i.raw==="true")}let s=await ji(t,n);return e.json({effective:s.allowed,source:s.source,accountDefault:r?.enabled??!0,projectOverride:o,limits:{...await Ao(t,n),bounds:Hn},defaults:{minScore:hn.MIN_SCORE,maxPerRun:hn.MAX_PER_RUN,maxPerWindow:hn.MAX_PER_WINDOW,windowDays:hn.WINDOW_DAYS}})});var kO={minScore:"autoAcceptMinScore",maxPerRun:"autoAcceptMaxPerRun",maxPerWindow:"autoAcceptMaxPerWindow",windowDays:"autoAcceptWindowDays"};function NO(e,t){let n={...e??{}};for(let[r,o]of Object.entries(t))o!==void 0&&(o===null?delete n[r]:n[r]=o);return n}c(NO,"mergeLimitOverrides");Jn.patch("/settings/auto-accept",async e=>{let t=e.get("userId"),n=TO.safeParse(await e.req.json().catch(()=>({})));if(!n.success)return e.json({error:n.error.flatten()},400);let{enabled:r,projectId:o,limits:s}=n.data;if(o){let[a]=await d.select({metadata:C.metadata}).from(C).where(On(C.id,o));if(!a)return e.json({error:"Project not found"},404);let u=a.metadata??{},l={...u};if(r!==void 0&&(l.autoAcceptSuggestions=r),s){let m=NO(u.autoAcceptLimits,s);Object.keys(m).length>0?l.autoAcceptLimits=m:delete l.autoAcceptLimits}return await d.update(C).set({metadata:l}).where(On(C.id,o)),e.json({scope:"project",projectId:o,enabled:r,limits:await Ao(t,o)})}let i={};r!==void 0&&(i.autoAcceptSuggestions=r);for(let[a,u]of Object.entries(kO)){let l=s?.[a];l!==void 0&&(i[u]=l)}return Object.keys(i).length>0&&await d.update(R).set(i).where(On(R.id,t)),e.json({scope:"account",enabled:r,limits:await Ao(t,null)})});var jO=Ct.object({enabled:Ct.boolean().optional(),optOut:Ct.boolean().optional(),apply:Ct.boolean().optional(),paused:Ct.boolean().optional(),accumulate:Ct.boolean().optional(),pairs:Ct.number().int().min(1).max(1e3).optional()}).refine(e=>Object.keys(e).length>0,{message:"no settings supplied"});async function pm(e){let[t]=await d.select({paused:R.evolutionPaused}).from(R).where(On(R.id,e));return t?.paused??!1}c(pm,"readAccountPaused");var PO=Ct.object({paused:Ct.boolean()});Jn.get("/settings/evolution-account",async e=>{let t=e.get("userId");return e.json({paused:await pm(t)})});Jn.patch("/settings/evolution-account",async e=>{let t=e.get("userId"),n=PO.safeParse(await e.req.json().catch(()=>({})));return n.success?(await d.update(R).set({evolutionPaused:n.data.paused}).where(On(R.id,t)),e.json({paused:n.data.paused})):e.json({error:n.error.flatten()},400)});Jn.get("/settings/evolution/targets",async e=>{let t=e.get("userId"),n=await pm(t),o=(await d.select({id:k.id,name:k.name,autoEvolveEnabled:Ds`${k.metadata}->>'autoEvolveEnabled'`,autoEvolveOptOut:Ds`${k.metadata}->>'autoEvolveOptOut'`,autoEvolveApply:Ds`${k.metadata}->>'autoEvolveApply'`,autoEvolvePaused:Ds`${k.metadata}->>'autoEvolvePaused'`,autoEvolveAccumulate:Ds`${k.metadata}->>'autoEvolveAccumulate'`,autoEvolvePairs:Ds`${k.metadata}->>'autoEvolvePairs'`}).from(k).where(RO(On(k.userId,t),On(k.type,"instruction"))).orderBy(k.name)).map(i=>{let a=lm(i,n);return{evalTargetId:i.id,name:i.name,settings:a,summary:mm(a)}}),s=o.filter(i=>i.settings.enabled||i.settings.apply||i.settings.paused||i.settings.optOut||i.settings.accumulate||i.settings.pairsConfigured);return e.json({targets:s,accountPaused:n,limits:{minPairs:10,maxPairs:128},totalInstructionTargets:o.length,unconfigured:o.length-s.length,writable:s.filter(i=>i.settings.apply&&!i.settings.paused).length})});Jn.get("/settings/evolution",async e=>{let t=e.get("userId"),n=e.req.query("evalTargetId");if(!n)return e.json({error:"evalTargetId is required"},400);if(!await nt(n,t))return e.json({error:"Eval target not found"},404);let[o]=await d.select({name:k.name,metadata:k.metadata}).from(k).where(On(k.id,n));if(!o)return e.json({error:"Eval target not found"},404);let s=lm(o.metadata,await pm(t));return e.json({evalTargetId:n,name:o.name,settings:s,summary:mm(s),limits:{minPairs:10,maxPairs:128}})});Jn.patch("/settings/evolution",async e=>{let t=e.get("userId"),n=e.req.query("evalTargetId");if(!n)return e.json({error:"evalTargetId is required"},400);let r=jO.safeParse(await e.req.json().catch(()=>({})));if(!r.success)return e.json({error:r.error.flatten()},400);if(!await nt(n,t))return e.json({error:"Eval target not found"},404);let[s]=await d.select({metadata:k.metadata}).from(k).where(On(k.id,n));if(!s)return e.json({error:"Eval target not found"},404);let i=b0(s.metadata,r.data);await d.update(k).set({metadata:i}).where(On(k.id,n));let a=lm(i,await pm(t));return e.json({evalTargetId:n,settings:a,summary:mm(a)})});var DO=Ct.object({maxConcurrent:Ct.number().int().nullable().optional(),maxPerRun:Ct.number().int().nullable().optional()});Jn.get("/settings/trial-limits",async e=>{let t=e.get("userId"),n=e.req.query("projectPath"),r=n?await Bn(n):null,o=await vs(t,r);return e.json({...o,defaults:{maxConcurrent:Oi.MAX_CONCURRENT,maxPerRun:Oi.MAX_PER_RUN},bounds:Gc})});Jn.patch("/settings/trial-limits",async e=>{let t=e.get("userId"),n=DO.safeParse(await e.req.json().catch(()=>({})));if(!n.success)return e.json({error:n.error.flatten()},400);let r={};for(let o of Object.keys(Gc)){let s=n.data[o];s!==void 0&&(r[o==="maxConcurrent"?"trialMaxConcurrent":"trialMaxPerRun"]=s===null?null:Ig(o,s))}return Object.keys(r).length>0&&await d.update(R).set(r).where(On(R.id,t)),e.json(await vs(t,null))});D();import{Hono as OO}from"hono";import{and as CO,eq as LO,sql as MO}from"drizzle-orm";var fm=new OO;fm.get("/setup/status",async e=>{let t=e.get("userId"),[n,r,o]=await Promise.all([c0(t),d.select({id:y.id}).from(y).where(CO(LO(y.userId,t),MO`${y.origin} <> 'internal_worker'`)).limit(1),im(t)]);return e.json({cliEverConnected:n.cliEverConnected,anyCapturedSession:r.length>0,workerActive:n.workerActive,llmEngines:o})});D();import{createHash as $O}from"node:crypto";import{Hono as qO}from"hono";import{z as Cn}from"zod";import{eq as kr,and as gm,desc as UO,sql as HO}from"drizzle-orm";var Oo=new qO,BO=Cn.object({name:Cn.string().min(1).max(255),type:Cn.enum(["instruction","skill","prompt","plan"]),content:Cn.string().min(1),description:Cn.string().default(""),metadata:Cn.record(Cn.unknown()).default({})}),FO=Cn.object({name:Cn.string().min(1).max(255).optional(),content:Cn.string().min(1).optional(),description:Cn.string().optional(),metadata:Cn.record(Cn.unknown()).optional()});Oo.post("/eval-targets",async e=>{let t=e.get("userId"),n=await e.req.json(),r=BO.parse(n),[o]=await d.insert(k).values({userId:t,name:r.name,type:r.type,content:r.content,description:r.description,metadata:r.metadata}).returning();return e.json(o,201)});Oo.get("/eval-targets",async e=>{let t=e.get("userId"),n=e.req.query("type"),r=e.req.query("content_hash"),o=[kr(k.userId,t)];n&&o.push(kr(k.type,n)),r&&o.push(HO`${k.metadata}->>'content_hash' = ${r}`);let s=e.req.query("limit"),i=e.req.query("offset"),a=s?parseInt(s,10):NaN,u=Number.isFinite(a)?Math.min(Math.max(1,a),200):100,l=i?parseInt(i,10):NaN,m=Number.isFinite(l)?Math.max(0,l):0,f=await d.select({id:k.id,userId:k.userId,name:k.name,type:k.type,description:k.description,metadata:k.metadata,version:k.version,parentId:k.parentId,createdAt:k.createdAt,updatedAt:k.updatedAt}).from(k).where(gm(...o)).orderBy(UO(k.updatedAt)).limit(u).offset(m);return e.json(f)});Oo.get("/eval-targets/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select().from(k).where(gm(kr(k.id,n),kr(k.userId,t)));return r?e.json(r):e.json({error:"Eval target not found"},404)});Oo.post("/eval-targets/:id/sync-content",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json().catch(()=>({})),o=typeof r?.content=="string"?r.content:null;if(!o||o.trim().length===0)return e.json({error:"content is required"},400);let[s]=await d.select().from(k).where(gm(kr(k.id,n),kr(k.userId,t)));if(!s)return e.json({error:"Eval target not found"},404);if(s.content===o)return e.json({id:n,synced:!1,version:s.version,reason:"already current"});let i=s.metadata&&typeof s.metadata=="object"&&!Array.isArray(s.metadata)?s.metadata:{},[a]=await d.update(k).set({content:o,version:(s.version??1)+1,metadata:{...i,content_hash:$O("sha256").update(o).digest("hex")},updatedAt:new Date}).where(kr(k.id,n)).returning({version:k.version});return e.json({id:n,synced:!0,version:a.version})});Oo.put("/eval-targets/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=FO.parse(r),[s]=await d.select().from(k).where(gm(kr(k.id,n),kr(k.userId,t)));if(!s)return e.json({error:"Eval target not found"},404);if(o.content&&o.content!==s.content){let[a]=await d.insert(k).values({userId:t,name:o.name??s.name,type:s.type,content:o.content,description:o.description??s.description,metadata:o.metadata??s.metadata,version:s.version+1,parentId:s.id}).returning();return e.json(a)}let[i]=await d.update(k).set({name:o.name??s.name,description:o.description??s.description,metadata:o.metadata??s.metadata,updatedAt:new Date}).where(kr(k.id,n)).returning();return e.json(i)});D();import{Hono as WO}from"hono";import{z as Vt}from"zod";import{eq as hm,and as S0,isNull as zO,desc as VO}from"drizzle-orm";var sa=new WO,JO=Vt.object({name:Vt.string().min(1).max(255),prompt:Vt.string().min(1),expectedOutput:Vt.string().default(""),files:Vt.array(Vt.unknown()).default([]),expectations:Vt.array(Vt.string()).default([])});sa.post("/eval-targets/:id/evals",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=JO.parse(r);if(!await nt(n,t))return e.json({error:"Eval target not found"},404);let[i]=await d.insert(Ee).values({evalTargetId:n,name:o.name,prompt:o.prompt,expectedOutput:o.expectedOutput,files:o.files,expectations:o.expectations}).returning();return e.json(i,201)});sa.get("/eval-targets/:id/evals",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=e.req.query("includeRetired")==="1";if(!await nt(n,t))return e.json({error:"Eval target not found"},404);let s=await d.select().from(Ee).where(r?hm(Ee.evalTargetId,n):S0(hm(Ee.evalTargetId,n),zO(Ee.retiredAt))).orderBy(VO(Ee.createdAt));return e.json(s)});var KO=Vt.object({retire:Vt.boolean().optional(),retiredReason:Vt.string().max(500).optional(),name:Vt.string().min(1).max(255).optional(),prompt:Vt.string().min(1).optional(),expectedOutput:Vt.string().optional(),files:Vt.array(Vt.unknown()).optional(),expectations:Vt.array(Vt.string()).optional()}).refine(e=>e.retire!==void 0||e.name!==void 0||e.prompt!==void 0||e.expectedOutput!==void 0||e.files!==void 0||e.expectations!==void 0,{message:"nothing to update"});sa.patch("/eval-targets/:id/evals/:evalId",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=e.req.param("evalId"),o=KO.parse(await e.req.json());if(!await nt(n,t))return e.json({error:"Eval target not found"},404);let i={updatedAt:new Date};o.retire!==void 0&&(i.retiredAt=o.retire?new Date:null,i.retiredReason=o.retire?o.retiredReason??null:null),o.name!==void 0&&(i.name=o.name),o.prompt!==void 0&&(i.prompt=o.prompt),o.expectedOutput!==void 0&&(i.expectedOutput=o.expectedOutput),o.files!==void 0&&(i.files=o.files),o.expectations!==void 0&&(i.expectations=o.expectations),(o.prompt!==void 0||o.expectations!==void 0||o.files!==void 0||o.expectedOutput!==void 0)&&(i.contentUpdatedAt=new Date);let[a]=await d.update(Ee).set(i).where(S0(hm(Ee.id,r),hm(Ee.evalTargetId,n))).returning();return a?e.json(a):e.json({error:"Eval case not found"},404)});D();import{Hono as YO}from"hono";import{z as De}from"zod";import{createHash as XO}from"node:crypto";import{and as ym,eq as ln,gte as T0,desc as QO,sql as yh}from"drizzle-orm";import{eq as GO,sql as Gr}from"drizzle-orm";function _h(e,t={}){let n=c(_=>_.judge_model_requested!=null&&_.judge_model!==_.judge_model_requested,"fellBack"),r=c(_=>{let v=null,h=-1;for(let p of _){if(!p.judge_model)continue;let w=new Date(p.created_at).getTime();(w>h||w===h&&p.judge_model>(v??""))&&(h=w,v=p.judge_model)}return v},"byRecency"),o=c(_=>{let v=new Map;for(let w of _){if(!w.judge_model)continue;let I=v.get(w.judge_model)??{labeled:0,latest:-1};w.labeled&&(I.labeled+=1),I.latest=Math.max(I.latest,new Date(w.created_at).getTime()),v.set(w.judge_model,I)}let h=null,p={labeled:0,latest:-1};for(let[w,I]of v){if(I.labeled===0)continue;(I.labeled>p.labeled||I.labeled===p.labeled&&(I.latest>p.latest||I.latest===p.latest&&w>(h??"")))&&(h=w,p=I)}return h},"byAnchors"),s=e.filter(_=>_.judge_model),i=s.filter(_=>!n(_)),a=s.length-i.length,u=t.pin?.trim()?t.pin.trim():null;if(u)return{currentJudgeModel:u,quarantinedElectors:a,electedBy:"pin"};let l=i.length>0?i:s,m=o(l);if(m)return{currentJudgeModel:m,quarantinedElectors:a,electedBy:"anchors"};let f=r(l);return{currentJudgeModel:f,quarantinedElectors:a,electedBy:f?"recency":"none"}}c(_h,"electJudgeSegment");var x0={pin:"pinned on the target (metadata.graderModel)",anchors:"elected because it holds the most human-labeled runs",recency:"elected because it graded most recently, no segment having any labels",none:"unstamped"};D();async function ia(e,t){let r=await d.execute(Gr`
|
|
993
|
+
)::int`}).from(x).where(Rr(x.userId,t)),[Y,ce,V,me]=await Promise.all([u.select({n:Be`count(*)::int`}).from(ie).where(Rr(ie.userId,t)),u.select({n:Be`count(*)::int`}).from($).where(hh(Rr($.userId,t),Rr($.status,"running"))),u.select({kind:x.kind,n:Be`count(*)::int`}).from(x).where(hh(Rr(x.userId,t),vO(x.dismissedAt))).groupBy(x.kind),u.select({entries:Be`count(*)::int`,distinct:Be`count(distinct ${Te.contentHash})::int`,repeated:Be`count(*) filter (where ${Te.timesGenerated} > 1)::int`,dismissed:Be`count(*) filter (where ${Te.dismissedAt} is not null)::int`,maxTimesGenerated:Be`coalesce(max(${Te.timesGenerated}), 0)::int`,lastSeenAt:Be`max(${Te.lastSeenAt})`}).from(Te).where(Rr(Te.userId,t))]),[B,he]=await Promise.all([q,H]),P=B[0],re=he[0],[Ce,St]=await Promise.all([v,g]),le=u0(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})),We=(await u.select({lastHeartbeat:fe.lastHeartbeat,clientName:fe.clientName,clientVersion:fe.clientVersion,metadata:fe.metadata}).from(fe).where(hh(Rr(fe.userId,t),Rr(fe.workerType,"cli-worker"),Be`${fe.lastHeartbeat} > ${new Date(S-EO).toISOString()}::timestamptz`)).orderBy(w0(fe.lastHeartbeat)).limit(1))[0],rt=We?S-new Date(We.lastHeartbeat).getTime():null,Le=W.map(j=>({kind:j.kind,count:1,oldestMinutes:Math.round(j.waitedSeconds/60)})),Xe={present:We!=null,active:rt!=null&&rt<bO,ageSeconds:rt==null?null:Math.round(rt/1e3),capabilities:null,busy:O.length>0,engines:We?fd(We.metadata):null},be=await a,an=await le,L=await d;return e.json({worker:{present:Xe.present,active:Xe.active,ageSeconds:Xe.ageSeconds,clientName:We?.clientName??null,clientVersion:We?.clientVersion??null,lastHeartbeat:We?.lastHeartbeat??null},verdict:sp(Xe,Le),reviewGate:cp(L),running:O,queued:W,recent:N,recentTotal:I[0]?.n??0,filterCounts:{all:b[0]?.total??0,evolution:b[0]?.evolution??0,decided:b[0]?.decided??0,skipped:b[0]?.skipped??0,failed:b[0]?.failed??0},proposals:U,proposalTotal:Y[0]?.n??0,changes:{decisions:P?.decisions??0,applied:P?.applied??0,byDecision:{promote:P?.promote??0,revert:P?.revert??0,refuse:P?.refuse??0},readyToApply:P?.ready_to_apply??0,readyToApplyTargetId:P?.ready_to_apply_target_id??null,readyToApplyPromotionId:P?.ready_to_apply_promotion_id??null,lastAppliedAt:P?.last_applied_at??null,lastDecidedAt:P?.last_decided_at??null,suggestionsProposed:re?.proposed??0,suggestionsAccepted:re?.accepted??0,suggestionsPending:re?.pending??0,lastAcceptedAt:re?.lastAcceptedAt??null,landedTotal:(P?.applied??0)+(re?.accepted??0)+be.appliedEver,window:{hours:o,landed:(P?.window_applied??0)+(re?.windowAccepted??0)+be.appliedInWindow,decisions:P?.window_decisions??0,promotionsApplied:P?.window_applied??0,adoptionApplied:be.appliedInWindow,suggestionsSurfaced:re?.windowSurfaced??0,suggestionsAccepted:re?.windowAccepted??0,suggestionsDeclined:re?.windowDeclined??0}},counts:{experimentsRunning: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:an.map(j=>({projectId:j.projectId,trials:{running:j.trials.running,orphaned:j.trials.orphaned,eligible:j.trials.eligible,maxConcurrent:j.trials.maxConcurrent,maxPerRun:j.trials.maxPerRun,blocked:j.trials.blocked},autoAccept:{enabled:j.autoAccept.enabled,usedInWindow:j.autoAccept.usedInWindow,maxPerWindow:j.autoAccept.maxPerWindow,maxPerRun:j.autoAccept.maxPerRun,windowDays:j.autoAccept.windowDays,eligible:j.autoAccept.eligible,windowResetsAt:j.autoAccept.windowResetsAt}}))},adoption:{available:be.available,counts:be.counts,applications:be.applications.map(j=>({id:j.id,instructionId:j.instructionId,title:j.title,artifact:j.artifact,harness:j.harness,targetPath:j.targetPath,projectPath:j.projectPath,status:j.status,applyMode:j.applyMode,verdictDetail:j.verdictDetail,updatedAt:j.updatedAt}))},windowHours:o,limit:r,filter:s})});import{Hono as SO}from"hono";var up=new SO;up.get("/loop/review-gate",async e=>{let t=e.get("userId");return e.json(cp(await ap(t)))});D();import{Hono as TO}from"hono";import{z as Ct}from"zod";import{and as RO,eq as On,sql as Ds}from"drizzle-orm";D();import{and as xO,eq as I0}from"drizzle-orm";async function nt(e,t){let[n]=await u.select({id:k.id}).from(k).where(xO(I0(k.id,e),I0(k.userId,t)));return n}c(nt,"verifyTargetOwnership");function _d(e){return e===!0||e==="true"}c(_d,"flagOn");function lp(e,t=!1){let n=e??{},r=n.autoEvolvePairs,o=typeof r=="number"?r:typeof r=="string"?Number(r):NaN,s=Number.isFinite(o)&&o>=1,i=_d(n.autoEvolvePaused);return{enabled:_d(n.autoEvolveEnabled),optOut:_d(n.autoEvolveOptOut),apply:_d(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:_d(n.autoEvolveAccumulate)}}c(lp,"resolveEvolutionSettings");function b0(e,t){let n={...e??{}};return t.enabled!==void 0&&(n.autoEvolveEnabled=t.enabled),t.optOut!==void 0&&(n.autoEvolveOptOut=t.optOut),t.apply!==void 0&&(n.autoEvolveApply=t.apply),t.paused!==void 0&&(n.autoEvolvePaused=t.paused),t.accumulate!==void 0&&(n.autoEvolveAccumulate=t.accumulate),t.pairs!==void 0&&(n.autoEvolvePairs=Math.min(128,Math.max(10,Math.floor(t.pairs)))),n}c(b0,"applyEvolutionPatch");function pp(e){if(e.paused)return e.pausedBy==="account"?"Paused for the whole account \u2014 no instruction is measured or rewritten.":"Paused \u2014 no model budget is spent, and the opt-in is kept.";if(e.optOut&&!e.enabled)return"Opted out \u2014 this instruction is never enrolled automatically.";let t=e.enabled?"Enrolled manually":"Eligible for automatic enrolment",n=e.apply?"a promote MAY rewrite the file":"decisions are recorded only, nothing is written";return`${t}; ${n}. Needs ${e.pairs} paired tasks before it can act.`}c(pp,"describeEvolutionState");var Jn=new TO,kO=Ct.object({enabled:Ct.boolean().optional(),projectId:Ct.string().uuid().optional(),limits:Ct.object({minScore:Ct.number().min(Hn.minScore.min).max(Hn.minScore.max).nullable(),maxPerRun:Ct.number().int().min(Hn.maxPerRun.min).max(Hn.maxPerRun.max).nullable(),maxPerWindow:Ct.number().int().min(Hn.maxPerWindow.min).max(Hn.maxPerWindow.max).nullable(),windowDays:Ct.number().int().min(Hn.windowDays.min).max(Hn.windowDays.max).nullable()}).partial().optional()}).refine(e=>e.enabled!==void 0||e.limits!==void 0,{message:"nothing to change: pass `enabled`, `limits`, or both"});Jn.get("/settings/auto-accept",async e=>{let t=e.get("userId"),n=e.req.query("projectId")??null,[r]=await u.select({enabled:T.autoAcceptSuggestions}).from(T).where(On(T.id,t)),o=null;if(n){let[i]=await u.select({raw:Ds`${C.metadata}->>'autoAcceptSuggestions'`}).from(C).where(On(C.id,n));i?.raw!=null&&(o=i.raw==="true")}let s=await ji(t,n);return e.json({effective:s.allowed,source:s.source,accountDefault:r?.enabled??!0,projectOverride:o,limits:{...await Ao(t,n),bounds:Hn},defaults:{minScore:hn.MIN_SCORE,maxPerRun:hn.MAX_PER_RUN,maxPerWindow:hn.MAX_PER_WINDOW,windowDays:hn.WINDOW_DAYS}})});var NO={minScore:"autoAcceptMinScore",maxPerRun:"autoAcceptMaxPerRun",maxPerWindow:"autoAcceptMaxPerWindow",windowDays:"autoAcceptWindowDays"};function jO(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(jO,"mergeLimitOverrides");Jn.patch("/settings/auto-accept",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{enabled:r,projectId:o,limits:s}=n.data;if(o){let[a]=await u.select({metadata:C.metadata}).from(C).where(On(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=jO(d.autoAcceptLimits,s);Object.keys(p).length>0?l.autoAcceptLimits=p:delete l.autoAcceptLimits}return await u.update(C).set({metadata:l}).where(On(C.id,o)),e.json({scope:"project",projectId:o,enabled:r,limits:await Ao(t,o)})}let i={};r!==void 0&&(i.autoAcceptSuggestions=r);for(let[a,d]of Object.entries(NO)){let l=s?.[a];l!==void 0&&(i[d]=l)}return Object.keys(i).length>0&&await u.update(T).set(i).where(On(T.id,t)),e.json({scope:"account",enabled:r,limits:await Ao(t,null)})});var PO=Ct.object({enabled:Ct.boolean().optional(),optOut:Ct.boolean().optional(),apply:Ct.boolean().optional(),paused:Ct.boolean().optional(),accumulate:Ct.boolean().optional(),pairs:Ct.number().int().min(1).max(1e3).optional()}).refine(e=>Object.keys(e).length>0,{message:"no settings supplied"});async function mp(e){let[t]=await u.select({paused:T.evolutionPaused}).from(T).where(On(T.id,e));return t?.paused??!1}c(mp,"readAccountPaused");var DO=Ct.object({paused:Ct.boolean()});Jn.get("/settings/evolution-account",async e=>{let t=e.get("userId");return e.json({paused:await mp(t)})});Jn.patch("/settings/evolution-account",async e=>{let t=e.get("userId"),n=DO.safeParse(await e.req.json().catch(()=>({})));return n.success?(await u.update(T).set({evolutionPaused:n.data.paused}).where(On(T.id,t)),e.json({paused:n.data.paused})):e.json({error:n.error.flatten()},400)});Jn.get("/settings/evolution/targets",async e=>{let t=e.get("userId"),n=await mp(t),o=(await u.select({id:k.id,name:k.name,autoEvolveEnabled:Ds`${k.metadata}->>'autoEvolveEnabled'`,autoEvolveOptOut:Ds`${k.metadata}->>'autoEvolveOptOut'`,autoEvolveApply:Ds`${k.metadata}->>'autoEvolveApply'`,autoEvolvePaused:Ds`${k.metadata}->>'autoEvolvePaused'`,autoEvolveAccumulate:Ds`${k.metadata}->>'autoEvolveAccumulate'`,autoEvolvePairs:Ds`${k.metadata}->>'autoEvolvePairs'`}).from(k).where(RO(On(k.userId,t),On(k.type,"instruction"))).orderBy(k.name)).map(i=>{let a=lp(i,n);return{evalTargetId:i.id,name:i.name,settings:a,summary:pp(a)}}),s=o.filter(i=>i.settings.enabled||i.settings.apply||i.settings.paused||i.settings.optOut||i.settings.accumulate||i.settings.pairsConfigured);return e.json({targets:s,accountPaused:n,limits:{minPairs:10,maxPairs:128},totalInstructionTargets:o.length,unconfigured:o.length-s.length,writable:s.filter(i=>i.settings.apply&&!i.settings.paused).length})});Jn.get("/settings/evolution",async e=>{let t=e.get("userId"),n=e.req.query("evalTargetId");if(!n)return e.json({error:"evalTargetId is required"},400);if(!await nt(n,t))return e.json({error:"Eval target not found"},404);let[o]=await u.select({name:k.name,metadata:k.metadata}).from(k).where(On(k.id,n));if(!o)return e.json({error:"Eval target not found"},404);let s=lp(o.metadata,await mp(t));return e.json({evalTargetId:n,name:o.name,settings:s,summary:pp(s),limits:{minPairs:10,maxPairs:128}})});Jn.patch("/settings/evolution",async e=>{let t=e.get("userId"),n=e.req.query("evalTargetId");if(!n)return e.json({error:"evalTargetId is required"},400);let r=PO.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(On(k.id,n));if(!s)return e.json({error:"Eval target not found"},404);let i=b0(s.metadata,r.data);await u.update(k).set({metadata:i}).where(On(k.id,n));let a=lp(i,await mp(t));return e.json({evalTargetId:n,settings:a,summary:pp(a)})});var OO=Ct.object({maxConcurrent:Ct.number().int().nullable().optional(),maxPerRun:Ct.number().int().nullable().optional()});Jn.get("/settings/trial-limits",async e=>{let t=e.get("userId"),n=e.req.query("projectPath"),r=n?await Bn(n):null,o=await vs(t,r);return e.json({...o,defaults:{maxConcurrent:Oi.MAX_CONCURRENT,maxPerRun:Oi.MAX_PER_RUN},bounds:Yc})});Jn.patch("/settings/trial-limits",async e=>{let t=e.get("userId"),n=OO.safeParse(await e.req.json().catch(()=>({})));if(!n.success)return e.json({error:n.error.flatten()},400);let r={};for(let o of Object.keys(Yc)){let s=n.data[o];s!==void 0&&(r[o==="maxConcurrent"?"trialMaxConcurrent":"trialMaxPerRun"]=s===null?null:Ig(o,s))}return Object.keys(r).length>0&&await u.update(T).set(r).where(On(T.id,t)),e.json(await vs(t,null))});D();import{Hono as CO}from"hono";import{and as LO,eq as MO,sql as $O}from"drizzle-orm";var fp=new CO;fp.get("/setup/status",async e=>{let t=e.get("userId"),[n,r,o]=await Promise.all([c0(t),u.select({id:y.id}).from(y).where(LO(MO(y.userId,t),$O`${y.origin} <> 'internal_worker'`)).limit(1),ip(t)]);return e.json({cliEverConnected:n.cliEverConnected,anyCapturedSession:r.length>0,workerActive:n.workerActive,llmEngines:o})});D();import{createHash as qO}from"node:crypto";import{Hono as UO}from"hono";import{z as Cn}from"zod";import{eq as kr,and as gp,desc as HO,sql as BO}from"drizzle-orm";var Oo=new UO,FO=Cn.object({name:Cn.string().min(1).max(255),type:Cn.enum(["instruction","skill","prompt","plan"]),content:Cn.string().min(1),description:Cn.string().default(""),metadata:Cn.record(Cn.unknown()).default({})}),WO=Cn.object({name:Cn.string().min(1).max(255).optional(),content:Cn.string().min(1).optional(),description:Cn.string().optional(),metadata:Cn.record(Cn.unknown()).optional()});Oo.post("/eval-targets",async e=>{let t=e.get("userId"),n=await e.req.json(),r=FO.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)});Oo.get("/eval-targets",async e=>{let t=e.get("userId"),n=e.req.query("type"),r=e.req.query("content_hash"),o=[kr(k.userId,t)];n&&o.push(kr(k.type,n)),r&&o.push(BO`${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,f=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(gp(...o)).orderBy(HO(k.updatedAt)).limit(d).offset(p);return e.json(f)});Oo.get("/eval-targets/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(k).where(gp(kr(k.id,n),kr(k.userId,t)));return r?e.json(r):e.json({error:"Eval target not found"},404)});Oo.post("/eval-targets/:id/sync-content",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json().catch(()=>({})),o=typeof r?.content=="string"?r.content:null;if(!o||o.trim().length===0)return e.json({error:"content is required"},400);let[s]=await u.select().from(k).where(gp(kr(k.id,n),kr(k.userId,t)));if(!s)return e.json({error:"Eval target not found"},404);if(s.content===o)return e.json({id:n,synced:!1,version:s.version,reason:"already current"});let i=s.metadata&&typeof s.metadata=="object"&&!Array.isArray(s.metadata)?s.metadata:{},[a]=await 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(kr(k.id,n)).returning({version:k.version});return e.json({id:n,synced:!0,version:a.version})});Oo.put("/eval-targets/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=WO.parse(r),[s]=await u.select().from(k).where(gp(kr(k.id,n),kr(k.userId,t)));if(!s)return e.json({error:"Eval target not found"},404);if(o.content&&o.content!==s.content){let[a]=await 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(kr(k.id,n)).returning();return e.json(i)});D();import{Hono as zO}from"hono";import{z as Vt}from"zod";import{eq as hp,and as S0,isNull as VO,desc as JO}from"drizzle-orm";var sa=new zO,KO=Vt.object({name:Vt.string().min(1).max(255),prompt:Vt.string().min(1),expectedOutput:Vt.string().default(""),files:Vt.array(Vt.unknown()).default([]),expectations:Vt.array(Vt.string()).default([])});sa.post("/eval-targets/:id/evals",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=KO.parse(r);if(!await nt(n,t))return e.json({error:"Eval target not found"},404);let[i]=await u.insert(Ee).values({evalTargetId:n,name:o.name,prompt:o.prompt,expectedOutput:o.expectedOutput,files:o.files,expectations:o.expectations}).returning();return e.json(i,201)});sa.get("/eval-targets/:id/evals",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=e.req.query("includeRetired")==="1";if(!await nt(n,t))return e.json({error:"Eval target not found"},404);let s=await u.select().from(Ee).where(r?hp(Ee.evalTargetId,n):S0(hp(Ee.evalTargetId,n),VO(Ee.retiredAt))).orderBy(JO(Ee.createdAt));return e.json(s)});var GO=Vt.object({retire:Vt.boolean().optional(),retiredReason:Vt.string().max(500).optional(),name:Vt.string().min(1).max(255).optional(),prompt:Vt.string().min(1).optional(),expectedOutput:Vt.string().optional(),files:Vt.array(Vt.unknown()).optional(),expectations:Vt.array(Vt.string()).optional()}).refine(e=>e.retire!==void 0||e.name!==void 0||e.prompt!==void 0||e.expectedOutput!==void 0||e.files!==void 0||e.expectations!==void 0,{message:"nothing to update"});sa.patch("/eval-targets/:id/evals/:evalId",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=e.req.param("evalId"),o=GO.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(S0(hp(Ee.id,r),hp(Ee.evalTargetId,n))).returning();return a?e.json(a):e.json({error:"Eval case not found"},404)});D();import{Hono as XO}from"hono";import{z as De}from"zod";import{createHash as QO}from"node:crypto";import{and as yp,eq as ln,gte as R0,desc as ZO,sql as yh}from"drizzle-orm";import{eq as YO,sql as Gr}from"drizzle-orm";function _h(e,t={}){let n=c(_=>_.judge_model_requested!=null&&_.judge_model!==_.judge_model_requested,"fellBack"),r=c(_=>{let v=null,g=-1;for(let m of _){if(!m.judge_model)continue;let w=new Date(m.created_at).getTime();(w>g||w===g&&m.judge_model>(v??""))&&(g=w,v=m.judge_model)}return v},"byRecency"),o=c(_=>{let v=new Map;for(let w of _){if(!w.judge_model)continue;let I=v.get(w.judge_model)??{labeled:0,latest:-1};w.labeled&&(I.labeled+=1),I.latest=Math.max(I.latest,new Date(w.created_at).getTime()),v.set(w.judge_model,I)}let g=null,m={labeled:0,latest:-1};for(let[w,I]of v){if(I.labeled===0)continue;(I.labeled>m.labeled||I.labeled===m.labeled&&(I.latest>m.latest||I.latest===m.latest&&w>(g??"")))&&(g=w,m=I)}return g},"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 f=r(l);return{currentJudgeModel:f,quarantinedElectors:a,electedBy:f?"recency":"none"}}c(_h,"electJudgeSegment");var x0={pin:"pinned on the target (metadata.graderModel)",anchors:"elected because it holds the most human-labeled runs",recency:"elected because it graded most recently, no segment having any labels",none:"unstamped"};D();async function ia(e,t){let r=await u.execute(Gr`
|
|
947
994
|
SELECT
|
|
948
995
|
r.configuration,
|
|
949
996
|
r.created_at,
|
|
@@ -987,9 +1034,9 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
987
1034
|
AND ev.retired_at IS NULL
|
|
988
1035
|
AND r.grading->'summary'->>'pass_rate' IS NOT NULL
|
|
989
1036
|
AND r.configuration IN ('with_target', 'without_target')
|
|
990
|
-
`),s=(await
|
|
1037
|
+
`),s=(await u.execute(Gr`
|
|
991
1038
|
SELECT metadata->>'graderModel' AS pin FROM eval_targets WHERE id = ${t}
|
|
992
|
-
`))[0]?.pin??null,{currentJudgeModel:i,quarantinedElectors:a,electedBy:
|
|
1039
|
+
`))[0]?.pin??null,{currentJudgeModel:i,quarantinedElectors:a,electedBy:d}=_h(r.map(L=>({...L,labeled:L.llm_total>0&&L.llm_annotated>=L.llm_total})),{pin:s}),l=null,p=-1;for(let L of r){let j=new Date(L.created_at).getTime();j>p&&(p=j,l=L.methodology)}let f={with_target:{unlabeledJudge:[],labeled:[]},without_target:{unlabeledJudge:[],labeled:[]}},_={with_target:[],without_target:[]},v=0,g=new Map,m=0,w=0,I=0,b=0;for(let L of r){let j=f[L.configuration];if(!j)continue;let ht=L.methodology!==l||L.pre_edit;L.methodology!==l&&(I+=1),L.pre_edit&&(b+=1);let jt=L.judge_pass?1:0,tr=L.llm_annotated>=L.llm_total;if(L.llm_total>0){let mn=L.judge_model,io=g.get(mn)??{runs:0,labeledRuns:0,latestRunAt:L.created_at};if(io.runs+=1,tr&&(io.labeledRuns+=1),new Date(L.created_at).getTime()>new Date(io.latestRunAt).getTime()&&(io.latestRunAt=L.created_at),g.set(mn,io),mn!==i){m+=1,tr&&(w+=1);continue}}if(tr){let mn=L.det_all_passed&&L.llm_truly_passed===L.llm_total?1:0;_[L.configuration]?.push({human:mn,judge:jt}),L.llm_total>0&&(v+=1)}if(!ht)if(tr){let mn=L.det_all_passed&&L.llm_truly_passed===L.llm_total?1:0;j.labeled.push({human:mn,judge:jt})}else j.unlabeledJudge.push(jt)}let[A]=await u.select({total:Gr`count(*)::int`,llmAnchors:Gr`count(*) FILTER (WHERE ${et.judgeMethod} = 'llm' AND ${et.judgeModel} IS NOT DISTINCT FROM ${i})::int`,llmApproved:Gr`count(*) FILTER (WHERE ${et.judgeMethod} = 'llm' AND ${et.judgeModel} IS NOT DISTINCT FROM ${i} AND ${et.verdict} = 'approve')::int`,staleLlmAnchors:Gr`count(*) FILTER (WHERE ${et.judgeMethod} = 'llm' AND ${et.judgeModel} IS DISTINCT FROM ${i})::int`,flagged:Gr`count(*) FILTER (WHERE ${et.flag} IS NOT NULL)::int`}).from(et).where(YO(et.evalTargetId,t)),E=f.with_target.unlabeledJudge.length+f.with_target.labeled.length+f.without_target.unlabeledJudge.length+f.without_target.labeled.length,S=await u.execute(Gr`
|
|
993
1040
|
SELECT
|
|
994
1041
|
r.eval_target_id::text AS target_id,
|
|
995
1042
|
r.configuration,
|
|
@@ -1031,7 +1078,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
1031
1078
|
AND r.grading->'summary'->>'pass_rate' IS NOT NULL
|
|
1032
1079
|
AND r.configuration IN ('with_target', 'without_target')
|
|
1033
1080
|
AND r.grading->>'judge_model' IS NOT DISTINCT FROM ${i}
|
|
1034
|
-
`),
|
|
1081
|
+
`),R=new Map;for(let L of S){if(L.llm_total<=0||L.llm_annotated<L.llm_total)continue;let j=R.get(L.target_id)??{with_target:[],without_target:[]},ht=L.det_all_passed&&L.llm_truly_passed===L.llm_total?1:0,jt=L.judge_pass?1:0;L.configuration==="with_target"?j.with_target.push(ht-jt):j.without_target.push(ht-jt),R.set(L.target_id,j)}let O=c(L=>{let j=L.length;if(j===0)return{rectifier:0,variance:1/0,n:0};let ht=L.reduce((tr,mn)=>tr+mn,0)/j,jt=j<2?0:L.reduce((tr,mn)=>tr+(mn-ht)**2,0)/(j-1);return{rectifier:ht,variance:jt/j,n:j}},"toRectifier"),W=c(L=>L.map(j=>j.human-j.judge),"selfDeltas"),N=[...R.values()].map(L=>O(L.with_target)),U=[...R.values()].map(L=>O(L.without_target)),q=ml(O(W(_.with_target)),N),H=ml(O(W(_.without_target)),U),Y=[...R.values()].reduce((L,j)=>L+j.with_target.length+j.without_target.length,0),ce=v+Y,V=(v>0?1:0)+[...R.values()].filter(L=>L.with_target.length+L.without_target.length>0).length,me=q.pooledApplied||H.pooledApplied,B=V>=3&&ce>=Ti,he=c(L=>({rectifier:L.rectifierUsed,variance:L.variance,sufficient:B}),"asInput"),P=E>0?Fc(f.with_target,f.without_target,me?{withPooledRectifier:he(q),withoutPooledRectifier:he(H)}:{}):null,re=ug(f.with_target,f.without_target,{humanLabeledRuns:v,...me?{pool:{withPooledRectifier:he(q),withoutPooledRectifier:he(H),totalAnchors:ce,targets:V}}:{}}),Ce=new Map;for(let L of r){if(L.judge_model!==i||L.methodology!==l||L.pre_edit||L.pass_rate==null)continue;let j=Ce.get(L.eval_id)??{name:L.eval_name,withRates:[],withoutRates:[]};L.configuration==="with_target"?j.withRates.push(L.pass_rate):L.configuration==="without_target"&&j.withoutRates.push(L.pass_rate),Ce.set(L.eval_id,j)}let St=[],le=[],de=c(L=>L.length?L.reduce((j,ht)=>j+ht,0)/L.length:null,"mean_"),Se=[];for(let[L,{name:j,withRates:ht,withoutRates:jt}]of Ce.entries())ht.length>0&&jt.length>0?(St.push({name:j,withPassRate:de(ht),withoutPassRate:de(jt)}),le.push(L)):Se.push({evalId:L,name:j,withPassRate:de(ht),withoutPassRate:de(jt)});let We=sg(og(St),{unpaired:Se.length}),rt=[...g.entries()].filter(([L,j])=>L!==i&&j.labeledRuns>0).sort((L,j)=>j[1].labeledRuns-L[1].labeledRuns),Le=rt.reduce((L,[,j])=>L+j.labeledRuns,0),Xe=i?g.get(i):void 0,be=Le>0?`${Le} human-labeled run(s) are stranded on `+rt.map(([L,j])=>`${L} (${j.labeledRuns} labeled / ${j.runs} runs)`).join(", ")+`; the current segment is ${i??"unstamped"} (${Xe?.runs??0} runs, ${Xe?.labeledRuns??0} labeled), `+x0[d]+". Re-point the judge segment rather than labeling more runs \u2014 the segment is the binding problem, not the label count.":null,an=[...We.gateReason?[We.gateReason]:[],...be?[be]:[],...re.reasons];return{judge:{currentModel:i,electedBy:d,pin:s,models:[...g.entries()].map(([L,j])=>({model:L,...j})).sort((L,j)=>new Date(j.latestRunAt).getTime()-new Date(L.latestRunAt).getTime()),staleRuns:m,staleLabeledRuns:w,staleAnchors:A?.staleLlmAnchors??0,quarantinedElectors:a},anchors:{total:A?.total??0,llmAnchors:A?.llmAnchors??0,agreementRate:A&&A.llmAnchors>0?A.llmApproved/A.llmAnchors:null,agreementCi:A&&A.llmAnchors>0?il(A.llmApproved,A.llmAnchors):null,flagged:A?.flagged??0,minAnchors:xi,labeledRuns:{with:_.with_target.length,without:_.without_target.length}},methodology:{current:l,supersededRuns:I,preEditRuns:b,runsInSegment:E},calibration:P,powerCheck:{...re,reasons:an},pooling:{engaged:me,judgeModel:i,poolTargets:V,poolAnchors:ce,assumedExchangeability:q.assumedExchangeability||H.assumedExchangeability,sufficient:B,withLambda:q.lambda,withoutLambda:H.lambda,tau2:q.tau2,i2:q.i2,withReason:q.reason??null,withoutReason:H.reason??null},caseDiscrimination:{total:We.total,discriminating:We.discriminating,nonDiscriminating:We.nonDiscriminating,unpaired:We.unpaired,cases:We.diagnoses.map((L,j)=>({evalId:le[j],name:L.name,withPassRate:L.withPassRate,withoutPassRate:L.withoutPassRate,separation:L.separation,discriminating:L.discriminating,note:L.note})).sort((L,j)=>L.separation-j.separation),unpairedCases:Se}}}c(ia,"computeJudgeCalibration");async function T0(e){return(await u.execute(Gr`
|
|
1035
1082
|
WITH current_judge AS (
|
|
1036
1083
|
-- Canonical segment (00193), not a fourth hand-copy of the recency rule.
|
|
1037
1084
|
-- The review queue and the adequacy gate MUST scope to the same judge, or
|
|
@@ -1056,7 +1103,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
1056
1103
|
AND (SELECT count(*) FROM jsonb_array_elements(r.grading->'expectations') e
|
|
1057
1104
|
WHERE COALESCE(e->>'method', 'llm') = 'llm'
|
|
1058
1105
|
AND COALESCE(e->>'errored', 'false') <> 'true') > COALESCE(a.llm_annotated, 0)
|
|
1059
|
-
`))[0]?.remaining??0}c(R0,"countRunsAwaitingReview");var Os=new YO,_m=c(e=>XO("sha256").update(e).digest("hex"),"sha256"),ZO=De.object({withScore:De.number().min(0).max(1),withoutScore:De.number().min(0).max(1),withCost:De.number().nonnegative().optional(),withoutCost:De.number().nonnegative().optional(),withLatency:De.number().nonnegative().optional(),withoutLatency:De.number().nonnegative().optional()}),eC=De.object({candidateContent:De.string().min(1),proposalSource:De.enum(["llm","groom","human"]),proposalRationale:De.string().default(""),pairs:De.array(ZO).default([]),canaryGreen:De.boolean(),measuredAgainstContentHash:De.string().optional(),accumulation:De.object({candidateContentHash:De.string(),priorContentHash:De.string(),targetPairs:De.number().int().positive(),carriedPairs:De.number().int().nonnegative(),runs:De.number().int().positive()}).optional(),immutableSections:De.array(De.string()).default([]),maxPromotionsPerWindow:De.number().int().positive().optional(),windowDays:De.number().int().positive().optional(),measurementCost:De.object({modelCalls:De.number().int().nonnegative(),proposalCalls:De.number().int().nonnegative(),executorCalls:De.number().int().nonnegative(),graderCalls:De.number().int().nonnegative(),plannedPairs:De.number().int().nonnegative(),usablePairs:De.number().int().nonnegative(),verdictPairs:De.number().int().nonnegative().optional(),passes:De.number().int().nonnegative(),liveCases:De.number().int().nonnegative(),mde:De.number().nonnegative().nullable(),wallMs:De.number().nonnegative()}).optional(),apply:De.boolean().default(!0)});Os.post("/eval-targets/:id/promotions",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=eC.parse(await e.req.json());if(!await nt(n,t))return e.json({error:"Eval target not found"},404);let[s]=await d.select({id:k.id,content:k.content,version:k.version,metadata:k.metadata}).from(k).where(ln(k.id,n));if(!s)return e.json({error:"Eval target not found"},404);let i=s.content,a=r.candidateContent,u=r.pairs,l=ul(u,{baseline:"prior-version"}),m=!1,f=["adequacy could not be computed for this target"];try{let O=await ia(t,n);m=O.powerCheck.adequate,f=O.powerCheck.reasons??[]}catch(O){f=[`adequacy check failed: ${O instanceof Error?O.message:String(O)}`]}let _=r.windowDays??zc,v=r.maxPromotionsPerWindow??Ti,h=new Date(Date.now()-_*24*60*60*1e3),[p]=await d.select({n:yh`count(*)::int`}).from(ie).where(ym(ln(ie.evalTargetId,n),ln(ie.applied,!0),T0(ie.createdAt,h))),w=p?.n??0,I=_m(i),b=r.measuredAgainstContentHash===void 0?void 0:r.measuredAgainstContentHash===I,A=gg({verdict:l,canaryGreen:r.canaryGreen,adequate:m,adequacyReasons:f,promotionsInWindow:w,maxPromotionsPerWindow:v,immutableSections:r.immutableSections,beforeContent:i,afterContent:a,measurementMatchesPredecessor:b}),E={canaryGreen:r.canaryGreen,adequate:m,adequacyReasons:f,promotionsInWindow:w,maxPromotionsPerWindow:v,windowDays:_,immutableSections:r.immutableSections,nPairs:u.length,measurementMatchesPredecessor:b??null,measuredAgainstContentHash:r.measuredAgainstContentHash??null,cost:r.measurementCost??null,accumulation:r.accumulation?{...r.accumulation,pairs:u}:null,applied:!1},S=A.decision==="promote"&&r.apply;E.applied=S;let T;try{T=await d.transaction(async O=>{if(S){let N=s.metadata&&typeof s.metadata=="object"&&!Array.isArray(s.metadata)?s.metadata:{};await O.update(k).set({content:a,version:(s.version??1)+1,metadata:{...N,content_hash:_m(a)},updatedAt:new Date}).where(ln(k.id,n))}let[W]=await O.insert(ie).values({userId:t,evalTargetId:n,fromContentHash:I,toContentHash:_m(a),fromContent:i,toContent:a,proposalSource:r.proposalSource,proposalRationale:r.proposalRationale,decision:A.decision,applied:S,refusals:A.refusals,rationale:A.rationale,effectClass:A.effect,verdict:l,gates:E,touchedSections:A.touched}).returning({id:ie.id,createdAt:ie.createdAt});return W})}catch(O){if(O?.code==="23505")return e.json({error:"This edit has already been applied to this target",code:"PROMOTION_ALREADY_APPLIED"},409);throw O}return e.json({id:T.id,createdAt:T.createdAt,decision:A.decision,applied:S,rationale:A.rationale,refusals:A.refusals,effectClass:A.effect,touchedSections:A.touched,verdict:l,gates:E},201)});Os.get("/eval-targets/:id/promotions",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=Math.min(Number(e.req.query("limit")??50)||50,200),o=Math.max(Number(e.req.query("offset")??0)||0,0);if(!await nt(n,t))return e.json({error:"Eval target not found"},404);let i=await d.select({id:ie.id,createdAt:ie.createdAt,decision:ie.decision,applied:ie.applied,effectClass:ie.effectClass,rationale:ie.rationale,refusals:ie.refusals,proposalSource:ie.proposalSource,proposalRationale:ie.proposalRationale,fromContentHash:ie.fromContentHash,toContentHash:ie.toContentHash,touchedSections:ie.touchedSections,verdict:ie.verdict,gates:ie.gates}).from(ie).where(ln(ie.evalTargetId,n)).orderBy(QO(ie.createdAt)).limit(r).offset(o),a=await d.select({decision:ie.decision,n:yh`count(*)::int`}).from(ie).where(ln(ie.evalTargetId,n)).groupBy(ie.decision),u={promote:0,revert:0,refuse:0};for(let l of a)u[l.decision]=l.n;return e.json({promotions:i,counts:u,total:Object.values(u).reduce((l,m)=>l+m,0),limit:r,offset:o})});Os.post("/promotions/:promotionId/apply",async e=>{let t=e.get("userId"),n=e.req.param("promotionId");try{let r=await d.transaction(async o=>{let[s]=await o.select().from(ie).where(ym(ln(ie.id,n),ln(ie.userId,t))).for("update");if(!s)return{status:404,body:{error:"Promotion not found"}};if(s.applied)return{status:409,body:{error:"Already applied",code:"ALREADY_APPLIED"}};if(s.decision!=="promote")return{status:409,body:{error:`Only a "promote" can be applied; this decision was "${s.decision}"`,code:"NOT_A_PROMOTE"}};let[i]=await o.select().from(k).where(ln(k.id,s.evalTargetId));if(!i)return{status:404,body:{error:"Eval target not found"}};if(i.content!==s.fromContent)return{status:409,body:{error:"The target has changed since this was measured \u2014 the verdict no longer describes this edit. Re-measure rather than applying a stale decision.",code:"STALE_MEASUREMENT"}};let a=new Date(Date.now()-zc*864e5),[u]=await o.select({n:yh`count(*)::int`}).from(ie).where(ym(ln(ie.evalTargetId,s.evalTargetId),ln(ie.applied,!0),T0(ie.createdAt,a)));if((u?.n??0)>=Ti)return{status:409,body:{error:`Change budget exhausted (${u?.n}/${Ti} applied in ${zc}d)`,code:"BUDGET_EXHAUSTED"}};let l=i.metadata&&typeof i.metadata=="object"&&!Array.isArray(i.metadata)?i.metadata:{};await o.update(k).set({content:s.toContent,version:(i.version??1)+1,metadata:{...l,content_hash:_m(s.toContent)},updatedAt:new Date}).where(ln(k.id,s.evalTargetId));let m=s.gates&&typeof s.gates=="object"&&!Array.isArray(s.gates)?s.gates:{};return await o.update(ie).set({applied:!0,gates:{...m,applied:!0,appliedAt:new Date().toISOString(),appliedVia:"deferred-human-apply"}}).where(ln(ie.id,s.id)),{status:200,body:{id:s.id,applied:!0,evalTargetId:s.evalTargetId,newVersion:(i.version??1)+1}}});return e.json(r.body,r.status)}catch(r){if(r?.code==="23505")return e.json({error:"This edit is already applied to this target",code:"PROMOTION_ALREADY_APPLIED"},409);throw r}});Os.get("/promotions/:promotionId",async e=>{let t=e.get("userId"),n=e.req.param("promotionId"),[r]=await d.select().from(ie).where(ym(ln(ie.id,n),ln(ie.userId,t)));return r?e.json(r):e.json({error:"Promotion not found"},404)});D();import{Hono as nC}from"hono";import{z as ge}from"zod";import{and as aa,desc as rC,eq as Nt}from"drizzle-orm";var k0=["proposed","ready","applied","measuring","improved","inconclusive","harmful","rollback_ready","reverted","failed"],tC={proposed:["ready","failed"],ready:["applied","failed"],applied:["measuring","reverted","failed"],measuring:["improved","inconclusive","harmful","reverted","failed"],inconclusive:["measuring","improved","harmful","failed"],harmful:["rollback_ready"],rollback_ready:["reverted","failed"],improved:[],reverted:[],failed:[]};function N0(e,t){return tC[e].includes(t)}c(N0,"canTransitionRecommendationApplication");var ca=new nC,j0=ge.enum(["claude_code","codex","shared"]),P0=ge.enum(k0),oC=ge.discriminatedUnion("kind",[ge.object({kind:ge.literal("delete-paths"),paths:ge.array(ge.string().min(1)).min(1)}),ge.object({kind:ge.literal("remove-marked-region"),file:ge.string().min(1),startMarker:ge.string().min(1),endMarker:ge.string().min(1),backupPath:ge.string().min(1),hashAtWrite:ge.string().min(1)}),ge.object({kind:ge.literal("remove-hook-entry"),file:ge.string().min(1),event:ge.string().min(1),command:ge.string().min(1),backupPath:ge.string().min(1),hashAtWrite:ge.string().min(1)})]),sC=ge.object({instructionId:ge.string().uuid(),projectId:ge.string().uuid().optional(),projectPath:ge.string().min(1),harness:j0,targetPath:ge.string().min(1),applyMode:ge.enum(["auto","human"]),status:ge.enum(["proposed","applied"]).default("proposed"),beforeHash:ge.string().optional(),appliedHash:ge.string().optional(),boundaryClass:ge.enum(Cc).optional(),targets:ge.array(ge.string().min(1)).optional(),inverse:oC.optional(),requires:ge.array(ge.string().min(1)).optional(),provides:ge.array(ge.string().min(1)).optional(),applyBatchId:ge.string().uuid().optional(),applySeq:ge.number().int().min(0).optional()});ca.get("/recommendation-applications",async e=>{let t=e.get("userId"),n=ge.object({harness:j0.optional(),artifact:ge.string().min(1).optional(),status:P0.optional(),projectPath:ge.string().min(1).optional(),instructionId:ge.string().uuid().optional(),limit:ge.coerce.number().int().min(1).max(200).default(50)}).parse(e.req.query()),r=[Nt(Te.userId,t)];n.instructionId&&r.push(Nt(Te.instructionId,n.instructionId)),n.harness&&r.push(Nt(Te.harness,n.harness)),n.status&&r.push(Nt(Te.status,n.status)),n.projectPath&&r.push(Nt(Te.projectPath,n.projectPath)),n.artifact&&r.push(Nt(g.type,n.artifact));let o=await d.select({application:Te,artifact:g.type,title:g.name}).from(Te).innerJoin(g,Nt(g.id,Te.instructionId)).where(aa(...r)).orderBy(rC(Te.updatedAt)).limit(n.limit);return e.json({applications:o.map(({application:s,...i})=>({...s,...i}))})});ca.post("/recommendation-applications",async e=>{let t=e.get("userId"),n=sC.parse(await e.req.json()),[r]=await d.select({id:g.id}).from(g).where(aa(Nt(g.id,n.instructionId),Nt(g.createdBy,t))).limit(1);if(!r)return e.json({error:"Recommendation not found"},404);if(n.status==="applied"){let l={boundaryClass:n.boundaryClass,targets:n.targets??[],requires:n.requires??[],provides:n.provides??[]},m=[...n.boundaryClass?[]:[{field:"boundaryClass",message:"required when recording an applied effect"}],...n.inverse?[]:[{field:"inverse",message:"an applied effect must record how to undo it"}],...zf(l),...n.inverse?Vf(l,n.inverse):[]];if(m.length>0)return e.json({error:"Applied effect is not recordable",problems:m},422)}let o=new Date,s={status:n.status,beforeHash:n.beforeHash,appliedHash:n.appliedHash,boundaryClass:n.boundaryClass,targets:n.targets??[],inverse:n.inverse,requires:n.requires??[],provides:n.provides??[],applyBatchId:n.applyBatchId,applySeq:n.applySeq,...n.status==="applied"?{appliedAt:o}:{}},[i]=await d.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 d.select().from(Te).where(aa(Nt(Te.userId,t),Nt(Te.instructionId,n.instructionId),Nt(Te.projectPath,n.projectPath),Nt(Te.harness,n.harness),Nt(Te.targetPath,n.targetPath))).limit(1),u=new Set(["proposed","ready","reverted","failed"]);if(a&&n.status==="applied"&&u.has(a.status)){let[l]=await d.update(Te).set({...s,updatedAt:o,revertedAt:null,verdict:null,verdictDetail:null}).where(aa(Nt(Te.id,a.id),Nt(Te.userId,t),Nt(Te.status,a.status))).returning();if(l)return e.json({application:l},200)}return e.json({application:a},200)});var iC=ge.object({status:P0,beforeHash:ge.string().optional(),appliedHash:ge.string().optional(),verdictDetail:ge.string().optional()});ca.post("/recommendation-applications/:id/transition",async e=>{let t=e.get("userId"),n=iC.parse(await e.req.json()),[r]=await d.select().from(Te).where(aa(Nt(Te.id,e.req.param("id")),Nt(Te.userId,t))).limit(1);if(!r)return e.json({error:"Recommendation application not found"},404);if(!N0(r.status,n.status))return e.json({error:`Invalid transition: ${r.status} -> ${n.status}`},409);let o=new Date,s={...n.status==="applied"?{appliedAt:o}:{},...n.status==="measuring"&&!r.measurementStartedAt?{measurementStartedAt:o}:{},...["improved","inconclusive","harmful"].includes(n.status)?{measurementEndedAt:o,verdict:n.status}:{},...n.status==="reverted"?{revertedAt:o}:{}},[i]=await d.update(Te).set({status:n.status,beforeHash:n.beforeHash??r.beforeHash,appliedHash:n.appliedHash??r.appliedHash,verdictDetail:n.verdictDetail??r.verdictDetail,updatedAt:o,...s}).where(aa(Nt(Te.id,r.id),Nt(Te.userId,t),Nt(Te.status,r.status))).returning();return i?e.json({application:i}):e.json({error:"Application changed concurrently; retry"},409)});D();import{Hono as aC}from"hono";import{z as yt}from"zod";import{eq as lr,and as wh,asc as cC,desc as D0,isNull as uC,inArray as dC,sql as lC}from"drizzle-orm";var Cs=new aC,mC=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()}),pC=yt.object({iteration:yt.number().int().default(1),runSummary:yt.record(yt.unknown()).default({}),notes:yt.array(yt.string()).default([])});Cs.post("/eval-runs",async e=>{let t=e.get("userId"),n=await e.req.json(),r=mC.parse(n);if(!await nt(r.evalTargetId,t))return e.json({error:"Eval target not found"},404);let[s]=await d.insert(Ie).values({jobId:r.jobId??null,evalId:r.evalId,evalTargetId:r.evalTargetId,evalTargetVersion:r.evalTargetVersion,configuration:r.configuration,runNumber:r.runNumber,iteration:r.iteration,status:r.status,outputs:r.outputs,timing:r.timing,grading:r.grading,comparison:r.comparison??null}).onConflictDoNothing().returning();if(s)return e.json(s,201);if(!r.jobId)return e.json({error:"Insert conflicted without a jobId"},409);let[i]=await d.select().from(Ie).where(wh(lr(Ie.jobId,r.jobId),lr(Ie.evalId,r.evalId),lr(Ie.configuration,r.configuration),lr(Ie.runNumber,r.runNumber),lr(Ie.iteration,r.iteration))).limit(1);return i?e.json({...i,deduped:!0},200):e.json({error:"Run conflicted but existing row not found"},409)});Cs.get("/eval-targets/:id/runs",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=e.req.query("iteration"),o=e.req.query("configuration");if(!await nt(n,t))return e.json({error:"Eval target not found"},404);let i=e.req.query("limit"),a=e.req.query("offset"),u=i?parseInt(i,10):NaN,l=Number.isFinite(u)?Math.min(Math.max(1,u),100):50,m=a?parseInt(a,10):NaN,f=Number.isFinite(m)?Math.max(0,m):0,_=[lr(Ie.evalTargetId,n)];r&&_.push(lr(Ie.iteration,parseInt(r,10))),o&&_.push(lr(Ie.configuration,o)),e.req.query("activeCasesOnly")==="1"&&_.push(dC(Ie.evalId,d.select({id:Ee.id}).from(Ee).where(wh(lr(Ee.evalTargetId,n),uC(Ee.retiredAt)))));let v=e.req.query("candidateContentHash");v&&_.push(lC`${Ie.outputs}->>'candidateContentHash' = ${v}`);let h=e.req.query("jobId");if(h){let I=yt.string().uuid().safeParse(h);if(!I.success)return e.json({error:"Invalid jobId"},400);_.push(lr(Ie.jobId,I.data))}let w=(await d.select().from(Ie).where(wh(..._)).orderBy(D0(Ie.createdAt),cC(Ie.id)).limit(l).offset(f)).map(I=>{let b=I.outputs??{},{diff:A,transcript:E,...S}=b,T=v?S:{...S,transcript:E};return{...I,outputs:T,comparison:null}});return e.json(w)});Cs.post("/eval-targets/:id/benchmarks",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=pC.parse(r);if(!await nt(n,t))return e.json({error:"Eval target not found"},404);let[i]=await d.insert(rr).values({evalTargetId:n,iteration:o.iteration,runSummary:o.runSummary,notes:o.notes}).returning();return e.json(i,201)});Cs.get("/eval-targets/:id/benchmarks",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await nt(n,t))return e.json({error:"Eval target not found"},404);let o=await d.select().from(rr).where(lr(rr.evalTargetId,n)).orderBy(D0(rr.createdAt));return e.json(o)});D();import{Hono as fC}from"hono";import{z as Jt}from"zod";import{eq as Ls,and as C0,or as gC,desc as hC,asc as _C}from"drizzle-orm";import{alias as O0}from"drizzle-orm/pg-core";var ua=new fC,yC=Jt.object({targetAId:Jt.string().uuid(),targetBId:Jt.string().uuid(),targetAVersion:Jt.number().int(),targetBVersion:Jt.number().int(),isSwapped:Jt.boolean(),winnerTargetId:Jt.string().uuid().nullable(),perEval:Jt.array(Jt.object({evalName:Jt.string(),winnerTargetId:Jt.string().uuid().nullable(),reasoning:Jt.string().default("")})).default([]),overall:Jt.record(Jt.unknown()).default({}),rawOutput:Jt.string().nullable().optional(),model:Jt.string().nullable().optional(),status:Jt.enum(["completed","parse_failed"]).default("completed")});ua.post("/eval-comparisons",async e=>{let t=e.get("userId"),n=await e.req.json(),r=yC.parse(n),[o,s]=await Promise.all([nt(r.targetAId,t),nt(r.targetBId,t)]);if(!o||!s)return e.json({error:"Eval target not found"},404);let i=c(u=>u===null||u===r.targetAId||u===r.targetBId,"validWinner");if(!i(r.winnerTargetId)||!r.perEval.every(u=>i(u.winnerTargetId)))return e.json({error:"winnerTargetId must be one of the compared targets or null"},400);let[a]=await d.insert(ot).values({userId:t,targetAId:r.targetAId,targetBId:r.targetBId,targetAVersion:r.targetAVersion,targetBVersion:r.targetBVersion,isSwapped:r.isSwapped,winnerTargetId:r.winnerTargetId,perEval:r.perEval,overall:r.overall,rawOutput:r.rawOutput??null,model:r.model??null,status:r.status}).returning();return e.json(a,201)});ua.get("/eval-targets/:id/comparisons",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await nt(n,t))return e.json({error:"Eval target not found"},404);let o=e.req.query("limit"),s=e.req.query("offset"),i=o?parseInt(o,10):NaN,a=Number.isFinite(i)?Math.min(Math.max(1,i),100):50,u=s?parseInt(s,10):NaN,l=Number.isFinite(u)?Math.max(0,u):0,m=O0(k,"targets_a"),f=O0(k,"targets_b"),_=await d.select({id:ot.id,userId:ot.userId,targetAId:ot.targetAId,targetBId:ot.targetBId,targetAName:m.name,targetBName:f.name,targetAVersion:ot.targetAVersion,targetBVersion:ot.targetBVersion,isSwapped:ot.isSwapped,winnerTargetId:ot.winnerTargetId,perEval:ot.perEval,overall:ot.overall,model:ot.model,status:ot.status,createdAt:ot.createdAt}).from(ot).innerJoin(m,Ls(ot.targetAId,m.id)).innerJoin(f,Ls(ot.targetBId,f.id)).where(C0(Ls(ot.userId,t),gC(Ls(ot.targetAId,n),Ls(ot.targetBId,n)))).orderBy(hC(ot.createdAt),_C(ot.id)).limit(a).offset(l);return e.json(_.map(v=>({...v,rawOutput:null})))});ua.get("/eval-comparisons/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=Jt.string().uuid().safeParse(n);if(!r.success)return e.json({error:"Invalid comparison id"},400);let[o]=await d.select().from(ot).where(C0(Ls(ot.id,r.data),Ls(ot.userId,t)));return o?e.json(o):e.json({error:"Comparison not found"},404)});D();import{Hono as bC}from"hono";import{z as da}from"zod";import{eq as la,and as vh,desc as EC,asc as AC,inArray as SC,sql as xC}from"drizzle-orm";D();import{sql as wC}from"drizzle-orm";function L0(e){if(e.n===0)return null;let t=e.agree/e.n,n=e.aYes/e.n,r=e.bYes/e.n,o=n*r+(1-n)*(1-r);return o>=1?null:(t-o)/(1-o)}c(L0,"kappaFromCounts");var M0=c((e,t)=>({agree:e,total:t,rate:t>0?e/t:null}),"slice");function vC(e){let t=e.pairs>0?e.agreeHuman/e.pairs:null;return{engine:e.reviewerEngine,models:e.models,pairs:e.pairs,orphaned:e.orphaned,agreementRate:t,kappa:L0({n:e.pairs,agree:e.agreeHuman,aYes:e.humanYes,bYes:e.reviewerYes}),snapshotAgreementRate:e.pairs>0?e.snapshotAgree/e.pairs:null,snapshotKappa:L0({n:e.pairs,agree:e.snapshotAgree,aYes:e.snapshotHumanYes,bYes:e.reviewerYes}),judgeAgreementRate:e.pairs>0?e.judgeAgreeHuman/e.pairs:null,onJudgePass:M0(e.judgePassAgree,e.judgePassPairs),onJudgeFail:M0(e.agreeHuman-e.judgePassAgree,e.pairs-e.judgePassPairs),suggestedAnchorWeight:t==null?null:Math.max(0,2*t-1)**2,unresolvedFlags:e.unresolvedFlags,kept:e.kept,relabeled:e.relabeled,lastReviewedAt:e.lastReviewedAt}}c(vC,"reviewerAgreementReport");async function $0(e){return(await d.execute(wC`
|
|
1106
|
+
`))[0]?.remaining??0}c(T0,"countRunsAwaitingReview");var Os=new XO,_p=c(e=>QO("sha256").update(e).digest("hex"),"sha256"),eC=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()}),tC=De.object({candidateContent:De.string().min(1),proposalSource:De.enum(["llm","groom","human"]),proposalRationale:De.string().default(""),pairs:De.array(eC).default([]),canaryGreen:De.boolean(),measuredAgainstContentHash:De.string().optional(),accumulation:De.object({candidateContentHash:De.string(),priorContentHash:De.string(),targetPairs:De.number().int().positive(),carriedPairs:De.number().int().nonnegative(),runs:De.number().int().positive()}).optional(),immutableSections:De.array(De.string()).default([]),maxPromotionsPerWindow:De.number().int().positive().optional(),windowDays:De.number().int().positive().optional(),measurementCost:De.object({modelCalls:De.number().int().nonnegative(),proposalCalls:De.number().int().nonnegative(),executorCalls:De.number().int().nonnegative(),graderCalls:De.number().int().nonnegative(),plannedPairs:De.number().int().nonnegative(),usablePairs:De.number().int().nonnegative(),verdictPairs:De.number().int().nonnegative().optional(),passes:De.number().int().nonnegative(),liveCases:De.number().int().nonnegative(),mde:De.number().nonnegative().nullable(),wallMs:De.number().nonnegative()}).optional(),apply:De.boolean().default(!0)});Os.post("/eval-targets/:id/promotions",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=tC.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(ln(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=dl(d,{baseline:"prior-version"}),p=!1,f=["adequacy could not be computed for this target"];try{let O=await ia(t,n);p=O.powerCheck.adequate,f=O.powerCheck.reasons??[]}catch(O){f=[`adequacy check failed: ${O instanceof Error?O.message:String(O)}`]}let _=r.windowDays??Vc,v=r.maxPromotionsPerWindow??Ri,g=new Date(Date.now()-_*24*60*60*1e3),[m]=await u.select({n:yh`count(*)::int`}).from(ie).where(yp(ln(ie.evalTargetId,n),ln(ie.applied,!0),R0(ie.createdAt,g))),w=m?.n??0,I=_p(i),b=r.measuredAgainstContentHash===void 0?void 0:r.measuredAgainstContentHash===I,A=gg({verdict:l,canaryGreen:r.canaryGreen,adequate:p,adequacyReasons:f,promotionsInWindow:w,maxPromotionsPerWindow:v,immutableSections:r.immutableSections,beforeContent:i,afterContent:a,measurementMatchesPredecessor:b}),E={canaryGreen:r.canaryGreen,adequate:p,adequacyReasons:f,promotionsInWindow:w,maxPromotionsPerWindow:v,windowDays:_,immutableSections:r.immutableSections,nPairs:d.length,measurementMatchesPredecessor:b??null,measuredAgainstContentHash:r.measuredAgainstContentHash??null,cost:r.measurementCost??null,accumulation:r.accumulation?{...r.accumulation,pairs:d}:null,applied:!1},S=A.decision==="promote"&&r.apply;E.applied=S;let R;try{R=await u.transaction(async O=>{if(S){let N=s.metadata&&typeof s.metadata=="object"&&!Array.isArray(s.metadata)?s.metadata:{};await O.update(k).set({content:a,version:(s.version??1)+1,metadata:{...N,content_hash:_p(a)},updatedAt:new Date}).where(ln(k.id,n))}let[W]=await O.insert(ie).values({userId:t,evalTargetId:n,fromContentHash:I,toContentHash:_p(a),fromContent:i,toContent:a,proposalSource:r.proposalSource,proposalRationale:r.proposalRationale,decision:A.decision,applied:S,refusals:A.refusals,rationale:A.rationale,effectClass:A.effect,verdict:l,gates:E,touchedSections:A.touched}).returning({id:ie.id,createdAt:ie.createdAt});return W})}catch(O){if(O?.code==="23505")return e.json({error:"This edit has already been applied to this target",code:"PROMOTION_ALREADY_APPLIED"},409);throw O}return e.json({id:R.id,createdAt:R.createdAt,decision:A.decision,applied:S,rationale:A.rationale,refusals:A.refusals,effectClass:A.effect,touchedSections:A.touched,verdict:l,gates:E},201)});Os.get("/eval-targets/:id/promotions",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=Math.min(Number(e.req.query("limit")??50)||50,200),o=Math.max(Number(e.req.query("offset")??0)||0,0);if(!await nt(n,t))return e.json({error:"Eval target not found"},404);let i=await u.select({id:ie.id,createdAt:ie.createdAt,decision:ie.decision,applied:ie.applied,effectClass:ie.effectClass,rationale:ie.rationale,refusals:ie.refusals,proposalSource:ie.proposalSource,proposalRationale:ie.proposalRationale,fromContentHash:ie.fromContentHash,toContentHash:ie.toContentHash,touchedSections:ie.touchedSections,verdict:ie.verdict,gates:ie.gates}).from(ie).where(ln(ie.evalTargetId,n)).orderBy(ZO(ie.createdAt)).limit(r).offset(o),a=await u.select({decision:ie.decision,n:yh`count(*)::int`}).from(ie).where(ln(ie.evalTargetId,n)).groupBy(ie.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})});Os.post("/promotions/:promotionId/apply",async e=>{let t=e.get("userId"),n=e.req.param("promotionId");try{let r=await u.transaction(async o=>{let[s]=await o.select().from(ie).where(yp(ln(ie.id,n),ln(ie.userId,t))).for("update");if(!s)return{status:404,body:{error:"Promotion not found"}};if(s.applied)return{status:409,body:{error:"Already applied",code:"ALREADY_APPLIED"}};if(s.decision!=="promote")return{status:409,body:{error:`Only a "promote" can be applied; this decision was "${s.decision}"`,code:"NOT_A_PROMOTE"}};let[i]=await o.select().from(k).where(ln(k.id,s.evalTargetId));if(!i)return{status:404,body:{error:"Eval target not found"}};if(i.content!==s.fromContent)return{status:409,body:{error:"The target has changed since this was measured \u2014 the verdict no longer describes this edit. Re-measure rather than applying a stale decision.",code:"STALE_MEASUREMENT"}};let a=new Date(Date.now()-Vc*864e5),[d]=await o.select({n:yh`count(*)::int`}).from(ie).where(yp(ln(ie.evalTargetId,s.evalTargetId),ln(ie.applied,!0),R0(ie.createdAt,a)));if((d?.n??0)>=Ri)return{status:409,body:{error:`Change budget exhausted (${d?.n}/${Ri} applied in ${Vc}d)`,code:"BUDGET_EXHAUSTED"}};let l=i.metadata&&typeof i.metadata=="object"&&!Array.isArray(i.metadata)?i.metadata:{};await o.update(k).set({content:s.toContent,version:(i.version??1)+1,metadata:{...l,content_hash:_p(s.toContent)},updatedAt:new Date}).where(ln(k.id,s.evalTargetId));let p=s.gates&&typeof s.gates=="object"&&!Array.isArray(s.gates)?s.gates:{};return await o.update(ie).set({applied:!0,gates:{...p,applied:!0,appliedAt:new Date().toISOString(),appliedVia:"deferred-human-apply"}}).where(ln(ie.id,s.id)),{status:200,body:{id:s.id,applied:!0,evalTargetId:s.evalTargetId,newVersion:(i.version??1)+1}}});return e.json(r.body,r.status)}catch(r){if(r?.code==="23505")return e.json({error:"This edit is already applied to this target",code:"PROMOTION_ALREADY_APPLIED"},409);throw r}});Os.get("/promotions/:promotionId",async e=>{let t=e.get("userId"),n=e.req.param("promotionId"),[r]=await u.select().from(ie).where(yp(ln(ie.id,n),ln(ie.userId,t)));return r?e.json(r):e.json({error:"Promotion not found"},404)});D();import{Hono as rC}from"hono";import{z as ge}from"zod";import{and as aa,desc as oC,eq as Nt}from"drizzle-orm";var k0=["proposed","ready","applied","measuring","improved","inconclusive","harmful","rollback_ready","reverted","failed"],nC={proposed:["ready","failed"],ready:["applied","failed"],applied:["measuring","reverted","failed"],measuring:["improved","inconclusive","harmful","reverted","failed"],inconclusive:["measuring","improved","harmful","failed"],harmful:["rollback_ready"],rollback_ready:["reverted","failed"],improved:[],reverted:[],failed:[]};function N0(e,t){return nC[e].includes(t)}c(N0,"canTransitionRecommendationApplication");var ca=new rC,j0=ge.enum(["claude_code","codex","shared"]),P0=ge.enum(k0),sC=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)})]),iC=ge.object({instructionId:ge.string().uuid(),projectId:ge.string().uuid().optional(),projectPath:ge.string().min(1),harness:j0,targetPath:ge.string().min(1),applyMode:ge.enum(["auto","human"]),status:ge.enum(["proposed","applied"]).default("proposed"),beforeHash:ge.string().optional(),appliedHash:ge.string().optional(),boundaryClass:ge.enum(Cc).optional(),targets:ge.array(ge.string().min(1)).optional(),inverse:sC.optional(),requires:ge.array(ge.string().min(1)).optional(),provides:ge.array(ge.string().min(1)).optional(),applyBatchId:ge.string().uuid().optional(),applySeq:ge.number().int().min(0).optional()});ca.get("/recommendation-applications",async e=>{let t=e.get("userId"),n=ge.object({harness:j0.optional(),artifact:ge.string().min(1).optional(),status:P0.optional(),projectPath:ge.string().min(1).optional(),instructionId:ge.string().uuid().optional(),limit:ge.coerce.number().int().min(1).max(200).default(50)}).parse(e.req.query()),r=[Nt(Re.userId,t)];n.instructionId&&r.push(Nt(Re.instructionId,n.instructionId)),n.harness&&r.push(Nt(Re.harness,n.harness)),n.status&&r.push(Nt(Re.status,n.status)),n.projectPath&&r.push(Nt(Re.projectPath,n.projectPath)),n.artifact&&r.push(Nt(h.type,n.artifact));let o=await u.select({application:Re,artifact:h.type,title:h.name}).from(Re).innerJoin(h,Nt(h.id,Re.instructionId)).where(aa(...r)).orderBy(oC(Re.updatedAt)).limit(n.limit);return e.json({applications:o.map(({application:s,...i})=>({...s,...i}))})});ca.post("/recommendation-applications",async e=>{let t=e.get("userId"),n=iC.parse(await e.req.json()),[r]=await u.select({id:h.id}).from(h).where(aa(Nt(h.id,n.instructionId),Nt(h.createdBy,t))).limit(1);if(!r)return e.json({error:"Recommendation not found"},404);if(n.status==="applied"){let l={boundaryClass:n.boundaryClass,targets:n.targets??[],requires:n.requires??[],provides:n.provides??[]},p=[...n.boundaryClass?[]:[{field:"boundaryClass",message:"required when recording an applied effect"}],...n.inverse?[]:[{field:"inverse",message:"an applied effect must record how to undo it"}],...zf(l),...n.inverse?Vf(l,n.inverse):[]];if(p.length>0)return e.json({error:"Applied effect is not recordable",problems:p},422)}let o=new Date,s={status:n.status,beforeHash:n.beforeHash,appliedHash:n.appliedHash,boundaryClass:n.boundaryClass,targets:n.targets??[],inverse:n.inverse,requires:n.requires??[],provides:n.provides??[],applyBatchId:n.applyBatchId,applySeq:n.applySeq,...n.status==="applied"?{appliedAt:o}:{}},[i]=await u.insert(Re).values({userId:t,instructionId:n.instructionId,projectId:n.projectId,projectPath:n.projectPath,harness:n.harness,targetPath:n.targetPath,applyMode:n.applyMode,...s}).onConflictDoNothing().returning();if(i)return e.json({application:i},201);let[a]=await u.select().from(Re).where(aa(Nt(Re.userId,t),Nt(Re.instructionId,n.instructionId),Nt(Re.projectPath,n.projectPath),Nt(Re.harness,n.harness),Nt(Re.targetPath,n.targetPath))).limit(1),d=new Set(["proposed","ready","reverted","failed"]);if(a&&n.status==="applied"&&d.has(a.status)){let[l]=await u.update(Re).set({...s,updatedAt:o,revertedAt:null,verdict:null,verdictDetail:null}).where(aa(Nt(Re.id,a.id),Nt(Re.userId,t),Nt(Re.status,a.status))).returning();if(l)return e.json({application:l},200)}return e.json({application:a},200)});var aC=ge.object({status:P0,beforeHash:ge.string().optional(),appliedHash:ge.string().optional(),verdictDetail:ge.string().optional()});ca.post("/recommendation-applications/:id/transition",async e=>{let t=e.get("userId"),n=aC.parse(await e.req.json()),[r]=await u.select().from(Re).where(aa(Nt(Re.id,e.req.param("id")),Nt(Re.userId,t))).limit(1);if(!r)return e.json({error:"Recommendation application not found"},404);if(!N0(r.status,n.status))return e.json({error:`Invalid transition: ${r.status} -> ${n.status}`},409);let o=new Date,s={...n.status==="applied"?{appliedAt:o}:{},...n.status==="measuring"&&!r.measurementStartedAt?{measurementStartedAt:o}:{},...["improved","inconclusive","harmful"].includes(n.status)?{measurementEndedAt:o,verdict:n.status}:{},...n.status==="reverted"?{revertedAt:o}:{}},[i]=await u.update(Re).set({status:n.status,beforeHash:n.beforeHash??r.beforeHash,appliedHash:n.appliedHash??r.appliedHash,verdictDetail:n.verdictDetail??r.verdictDetail,updatedAt:o,...s}).where(aa(Nt(Re.id,r.id),Nt(Re.userId,t),Nt(Re.status,r.status))).returning();return i?e.json({application:i}):e.json({error:"Application changed concurrently; retry"},409)});D();import{Hono as cC}from"hono";import{z as yt}from"zod";import{eq as lr,and as wh,asc as dC,desc as D0,isNull as uC,inArray as lC,sql as pC}from"drizzle-orm";var Cs=new cC,mC=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()}),fC=yt.object({iteration:yt.number().int().default(1),runSummary:yt.record(yt.unknown()).default({}),notes:yt.array(yt.string()).default([])});Cs.post("/eval-runs",async e=>{let t=e.get("userId"),n=await e.req.json(),r=mC.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(wh(lr(Ie.jobId,r.jobId),lr(Ie.evalId,r.evalId),lr(Ie.configuration,r.configuration),lr(Ie.runNumber,r.runNumber),lr(Ie.iteration,r.iteration))).limit(1);return i?e.json({...i,deduped:!0},200):e.json({error:"Run conflicted but existing row not found"},409)});Cs.get("/eval-targets/:id/runs",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=e.req.query("iteration"),o=e.req.query("configuration");if(!await nt(n,t))return e.json({error:"Eval target not found"},404);let i=e.req.query("limit"),a=e.req.query("offset"),d=i?parseInt(i,10):NaN,l=Number.isFinite(d)?Math.min(Math.max(1,d),100):50,p=a?parseInt(a,10):NaN,f=Number.isFinite(p)?Math.max(0,p):0,_=[lr(Ie.evalTargetId,n)];r&&_.push(lr(Ie.iteration,parseInt(r,10))),o&&_.push(lr(Ie.configuration,o)),e.req.query("activeCasesOnly")==="1"&&_.push(lC(Ie.evalId,u.select({id:Ee.id}).from(Ee).where(wh(lr(Ee.evalTargetId,n),uC(Ee.retiredAt)))));let v=e.req.query("candidateContentHash");v&&_.push(pC`${Ie.outputs}->>'candidateContentHash' = ${v}`);let g=e.req.query("jobId");if(g){let I=yt.string().uuid().safeParse(g);if(!I.success)return e.json({error:"Invalid jobId"},400);_.push(lr(Ie.jobId,I.data))}let w=(await u.select().from(Ie).where(wh(..._)).orderBy(D0(Ie.createdAt),dC(Ie.id)).limit(l).offset(f)).map(I=>{let b=I.outputs??{},{diff:A,transcript:E,...S}=b,R=v?S:{...S,transcript:E};return{...I,outputs:R,comparison:null}});return e.json(w)});Cs.post("/eval-targets/:id/benchmarks",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=fC.parse(r);if(!await nt(n,t))return e.json({error:"Eval target not found"},404);let[i]=await u.insert(rr).values({evalTargetId:n,iteration:o.iteration,runSummary:o.runSummary,notes:o.notes}).returning();return e.json(i,201)});Cs.get("/eval-targets/:id/benchmarks",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await nt(n,t))return e.json({error:"Eval target not found"},404);let o=await u.select().from(rr).where(lr(rr.evalTargetId,n)).orderBy(D0(rr.createdAt));return e.json(o)});D();import{Hono as gC}from"hono";import{z as Jt}from"zod";import{eq as Ls,and as C0,or as hC,desc as _C,asc as yC}from"drizzle-orm";import{alias as O0}from"drizzle-orm/pg-core";var da=new gC,wC=Jt.object({targetAId:Jt.string().uuid(),targetBId:Jt.string().uuid(),targetAVersion:Jt.number().int(),targetBVersion:Jt.number().int(),isSwapped:Jt.boolean(),winnerTargetId:Jt.string().uuid().nullable(),perEval:Jt.array(Jt.object({evalName:Jt.string(),winnerTargetId:Jt.string().uuid().nullable(),reasoning:Jt.string().default("")})).default([]),overall:Jt.record(Jt.unknown()).default({}),rawOutput:Jt.string().nullable().optional(),model:Jt.string().nullable().optional(),status:Jt.enum(["completed","parse_failed"]).default("completed")});da.post("/eval-comparisons",async e=>{let t=e.get("userId"),n=await e.req.json(),r=wC.parse(n),[o,s]=await Promise.all([nt(r.targetAId,t),nt(r.targetBId,t)]);if(!o||!s)return e.json({error:"Eval target not found"},404);let i=c(d=>d===null||d===r.targetAId||d===r.targetBId,"validWinner");if(!i(r.winnerTargetId)||!r.perEval.every(d=>i(d.winnerTargetId)))return e.json({error:"winnerTargetId must be one of the compared targets or null"},400);let[a]=await u.insert(ot).values({userId:t,targetAId:r.targetAId,targetBId:r.targetBId,targetAVersion:r.targetAVersion,targetBVersion:r.targetBVersion,isSwapped:r.isSwapped,winnerTargetId:r.winnerTargetId,perEval:r.perEval,overall:r.overall,rawOutput:r.rawOutput??null,model:r.model??null,status:r.status}).returning();return e.json(a,201)});da.get("/eval-targets/:id/comparisons",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await nt(n,t))return e.json({error:"Eval target not found"},404);let o=e.req.query("limit"),s=e.req.query("offset"),i=o?parseInt(o,10):NaN,a=Number.isFinite(i)?Math.min(Math.max(1,i),100):50,d=s?parseInt(s,10):NaN,l=Number.isFinite(d)?Math.max(0,d):0,p=O0(k,"targets_a"),f=O0(k,"targets_b"),_=await u.select({id:ot.id,userId:ot.userId,targetAId:ot.targetAId,targetBId:ot.targetBId,targetAName:p.name,targetBName:f.name,targetAVersion:ot.targetAVersion,targetBVersion:ot.targetBVersion,isSwapped:ot.isSwapped,winnerTargetId:ot.winnerTargetId,perEval:ot.perEval,overall:ot.overall,model:ot.model,status:ot.status,createdAt:ot.createdAt}).from(ot).innerJoin(p,Ls(ot.targetAId,p.id)).innerJoin(f,Ls(ot.targetBId,f.id)).where(C0(Ls(ot.userId,t),hC(Ls(ot.targetAId,n),Ls(ot.targetBId,n)))).orderBy(_C(ot.createdAt),yC(ot.id)).limit(a).offset(l);return e.json(_.map(v=>({...v,rawOutput:null})))});da.get("/eval-comparisons/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=Jt.string().uuid().safeParse(n);if(!r.success)return e.json({error:"Invalid comparison id"},400);let[o]=await u.select().from(ot).where(C0(Ls(ot.id,r.data),Ls(ot.userId,t)));return o?e.json(o):e.json({error:"Comparison not found"},404)});D();import{Hono as EC}from"hono";import{z as ua}from"zod";import{eq as la,and as vh,desc as AC,asc as SC,inArray as xC,sql as TC}from"drizzle-orm";D();import{sql as vC}from"drizzle-orm";function L0(e){if(e.n===0)return null;let t=e.agree/e.n,n=e.aYes/e.n,r=e.bYes/e.n,o=n*r+(1-n)*(1-r);return o>=1?null:(t-o)/(1-o)}c(L0,"kappaFromCounts");var M0=c((e,t)=>({agree:e,total:t,rate:t>0?e/t:null}),"slice");function IC(e){let t=e.pairs>0?e.agreeHuman/e.pairs:null;return{engine:e.reviewerEngine,models:e.models,pairs:e.pairs,orphaned:e.orphaned,agreementRate:t,kappa:L0({n:e.pairs,agree:e.agreeHuman,aYes:e.humanYes,bYes:e.reviewerYes}),snapshotAgreementRate:e.pairs>0?e.snapshotAgree/e.pairs:null,snapshotKappa:L0({n:e.pairs,agree:e.snapshotAgree,aYes:e.snapshotHumanYes,bYes:e.reviewerYes}),judgeAgreementRate:e.pairs>0?e.judgeAgreeHuman/e.pairs:null,onJudgePass:M0(e.judgePassAgree,e.judgePassPairs),onJudgeFail:M0(e.agreeHuman-e.judgePassAgree,e.pairs-e.judgePassPairs),suggestedAnchorWeight:t==null?null:Math.max(0,2*t-1)**2,unresolvedFlags:e.unresolvedFlags,kept:e.kept,relabeled:e.relabeled,lastReviewedAt:e.lastReviewedAt}}c(IC,"reviewerAgreementReport");async function $0(e){return(await u.execute(vC`
|
|
1060
1107
|
SELECT
|
|
1061
1108
|
j.reviewer_engine,
|
|
1062
1109
|
array_agg(DISTINCT j.reviewer_model) AS models,
|
|
@@ -1088,7 +1135,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
1088
1135
|
) j
|
|
1089
1136
|
GROUP BY j.reviewer_engine
|
|
1090
1137
|
ORDER BY j.reviewer_engine
|
|
1091
|
-
`)).map(n=>
|
|
1138
|
+
`)).map(n=>IC({reviewerEngine:n.reviewer_engine,models:n.models,pairs:n.pairs,orphaned:n.orphaned,agreeHuman:n.agree_human,humanYes:n.human_yes,reviewerYes:n.reviewer_yes,judgeAgreeHuman:n.judge_agree_human,judgePassPairs:n.judge_pass_pairs,judgePassAgree:n.judge_pass_agree,snapshotAgree:n.snapshot_agree,snapshotHumanYes:n.snapshot_human_yes,unresolvedFlags:n.unresolved_flags,kept:n.kept,relabeled:n.relabeled,lastReviewedAt:n.last_reviewed_at}))}c($0,"computeReviewerAgreement");D();import{eq as bC}from"drizzle-orm";async function yd(e,t,n={}){let{nudge:r=!0}=n;try{let[o]=await u.select({name:k.name,userId:k.userId}).from(k).where(bC(k.id,t));if(!o||o.userId!==e)return;let s=await ia(e,t);if(s.powerCheck.adequate){await dn({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 ip(e);d&&!(d.claude&&d.codex)&&await dn({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 T0(t);if(i<=0)return;let a=s.powerCheck.reasons[0];await dn({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(yd,"notifyLabelState");var Yr=new EC,RC=ua.object({verdict:ua.enum(["approve","reject"]),flag:ua.enum(["bad_grade","bad_assertion"]).nullable().optional(),note:ua.string().max(2e3).nullable().optional()});async function q0(e,t){let n=ua.string().uuid().safeParse(e);if(!n.success)return null;let[r]=await u.select().from(Ie).where(la(Ie.id,n.data));return r&&await nt(r.evalTargetId,t)?r:null}c(q0,"loadOwnedRun");Yr.put("/eval-runs/:runId/annotations/:index",async e=>{let t=e.get("userId"),n=e.req.param("runId"),r=e.req.param("index"),o=RC.parse(await e.req.json()),s=parseInt(r,10);if(!Number.isInteger(s)||s<0||String(s)!==r)return e.json({error:"Invalid expectation index"},400);let i=await q0(n,t);if(!i)return e.json({error:"Eval run not found"},404);let a=i.grading.expectations;if(!Array.isArray(a)||s>=a.length)return e.json({error:"Expectation index out of range for this run"},400);let 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,[f]=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 yd(t,i.evalTargetId,{nudge:!1});try{await wI({evalTargetId:i.evalTargetId,userId:t})}catch(_){console.error("[eval-annotations] judge-review enqueue failed:",_ instanceof Error?_.message:_)}return e.json(f)});Yr.delete("/eval-runs/:runId/annotations/:index",async e=>{let t=e.get("userId"),n=e.req.param("runId"),r=parseInt(e.req.param("index"),10);if(!Number.isInteger(r)||r<0)return e.json({error:"Invalid expectation index"},400);let o=await q0(n,t);return o?(await u.delete(et).where(vh(la(et.evalRunId,o.id),la(et.expectationIndex,r))).returning({id:et.id})).length===0?e.json({error:"Annotation not found"},404):e.json({deleted:!0}):e.json({error:"Eval run not found"},404)});Yr.post("/eval-targets/:id/label-state",async e=>{let t=e.get("userId"),n=e.req.param("id");return await nt(n,t)?(await yd(t,n),e.json({ok:!0})):e.json({error:"Eval target not found"},404)});Yr.get("/eval-targets/:id/annotations",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await nt(n,t))return e.json({error:"Eval target not found"},404);let o=e.req.query("limit"),s=e.req.query("offset"),i=o?parseInt(o,10):NaN,a=Number.isFinite(i)?Math.min(Math.max(1,i),500):200,d=s?parseInt(s,10):NaN,l=Number.isFinite(d)?Math.max(0,d):0,p=[la(et.evalTargetId,n)],f=e.req.query("runId");if(f){let v=ua.string().uuid().safeParse(f);if(!v.success)return e.json({error:"Invalid runId"},400);p.push(la(et.evalRunId,v.data))}let _=await u.select().from(et).where(vh(...p)).orderBy(AC(et.createdAt),SC(et.id)).limit(a).offset(l);return e.json(_)});Yr.get("/eval-targets/:id/judge-calibration",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await nt(n,t))return e.json({error:"Eval target not found"},404);let[o,s]=await Promise.all([ia(t,n),$0(n)]);return e.json({...o,reviewers:s})});Yr.get("/eval-targets/:id/annotation-queue",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await nt(n,t))return e.json({error:"Eval target not found"},404);let o=e.req.query("limit"),s=o?parseInt(o,10):NaN,i=Number.isFinite(s)?Math.min(Math.max(1,s),20):5,a=await u.execute(TC`
|
|
1092
1139
|
WITH current_judge AS (
|
|
1093
1140
|
-- Canonical segment (00193) — NOT a fifth hand-copy of the recency rule.
|
|
1094
1141
|
-- Labeling a stale-judge run produces an anchor the calibration ignores,
|
|
@@ -1142,11 +1189,11 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
1142
1189
|
SELECT * FROM queue
|
|
1143
1190
|
ORDER BY cohort_rank, (llm_annotated > 0) DESC, random()
|
|
1144
1191
|
LIMIT ${i}
|
|
1145
|
-
`),
|
|
1192
|
+
`),d=a.map(_=>_.id),l=d.length?await u.select().from(et).where(vh(la(et.evalTargetId,n),xC(et.evalRunId,d))):[],p=new Map(l.map(_=>[`${_.evalRunId}:${_.expectationIndex}`,_])),f={};for(let _ of a)f[_.configuration]=_.remaining_in_cohort;return e.json({remaining:a[0]?.remaining??0,remainingByCohort:f,runs:a.map(_=>({id:_.id,configuration:_.configuration,runNumber:_.run_number,iteration:_.iteration,createdAt:_.created_at,evalName:_.eval_name,prompt:_.prompt,output:_.output,outputTruncated:_.output_truncated,expectations:(_.expectations??[]).map((v,g)=>{let m=p.get(`${_.id}:${g}`);return{index:g,text:v.text??"",passed:v.passed??!1,evidence:v.evidence??"",method:v.method==="deterministic"?"deterministic":"llm",errored:v.errored===!0,annotation:m?{verdict:m.verdict,flag:m.flag}:null}})}))})});D();import{Hono as kC}from"hono";import{z as wn}from"zod";import{eq as Kn,and as wd,isNull as Ih,sql as pa,inArray as NC}from"drizzle-orm";var Ms=new kC,jC=wn.object({evalRunId:wn.string().uuid(),expectationIndex:wn.number().int().min(0),expectationText:wn.string(),judgePassed:wn.boolean(),humanPassed:wn.boolean(),reviewerPassed:wn.boolean()}),PC=wn.object({reviewerEngine:wn.enum(["claude","codex"]),reviewerModel:wn.string().min(1).max(200),verdicts:wn.array(jC).min(1).max(500)});Ms.put("/eval-targets/:id/judge-reviews",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await nt(n,t))return e.json({error:"Eval target not found"},404);let o=PC.parse(await e.req.json()),s=[...new Set(o.verdicts.map(d=>d.evalRunId))];if((await u.select({id:Ie.id}).from(Ie).where(wd(NC(Ie.id,s),Kn(Ie.evalTargetId,n)))).length!==s.length)return e.json({error:"One or more runs do not belong to this target"},400);let a=0;for(let d of o.verdicts)await u.insert(pe).values({userId:t,evalTargetId:n,evalRunId:d.evalRunId,expectationIndex:d.expectationIndex,expectationText:d.expectationText,judgePassed:d.judgePassed,humanPassed:d.humanPassed,reviewerEngine:o.reviewerEngine,reviewerModel:o.reviewerModel,reviewerPassed:d.reviewerPassed}).onConflictDoUpdate({target:[pe.evalRunId,pe.expectationIndex,pe.reviewerModel],set:{expectationText:d.expectationText,judgePassed:d.judgePassed,humanPassed:d.humanPassed,reviewerEngine:o.reviewerEngine,reviewerPassed:d.reviewerPassed,resolvedAt:pa`CASE WHEN ${pe.reviewerPassed} <> ${d.reviewerPassed} THEN NULL ELSE ${pe.resolvedAt} END`,resolution:pa`CASE WHEN ${pe.reviewerPassed} <> ${d.reviewerPassed} THEN NULL ELSE ${pe.resolution} END`,updatedAt:new Date}}),a+=1;if(o.verdicts.some(d=>d.reviewerPassed!==d.humanPassed))try{let[{count:d}]=await u.select({count:pa`count(*)::int`}).from(pe).where(wd(Kn(pe.evalTargetId,n),Ih(pe.resolvedAt),pa`${pe.reviewerPassed} <> ${pe.humanPassed}`));if(d>0){let[l]=await u.select({name:k.name}).from(k).where(Kn(k.id,n));await dn({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})});Ms.get("/eval-targets/:id/judge-reviews",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await nt(n,t))return e.json({error:"Eval target not found"},404);let o=await u.select({evalRunId:pe.evalRunId,expectationIndex:pe.expectationIndex,reviewerEngine:pe.reviewerEngine,reviewerModel:pe.reviewerModel,reviewerPassed:pe.reviewerPassed,humanPassed:pe.humanPassed,resolvedAt:pe.resolvedAt}).from(pe).where(Kn(pe.evalTargetId,n));return e.json(o)});Ms.get("/eval-targets/:id/judge-reviews/disagreements",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await nt(n,t))return e.json({error:"Eval target not found"},404);let o=await u.select({id:pe.id,evalRunId:pe.evalRunId,expectationIndex:pe.expectationIndex,expectationText:pe.expectationText,judgePassed:pe.judgePassed,humanPassed:pe.humanPassed,reviewerEngine:pe.reviewerEngine,reviewerModel:pe.reviewerModel,reviewerPassed:pe.reviewerPassed,evalName:Ee.name,configuration:Ie.configuration,runNumber:Ie.runNumber,outputExcerpt:pa`LEFT(${Ie.outputs}->>'transcript', 1200)`}).from(pe).innerJoin(Ie,Kn(Ie.id,pe.evalRunId)).leftJoin(Ee,Kn(Ee.id,Ie.evalId)).where(wd(Kn(pe.evalTargetId,n),Ih(pe.resolvedAt),pa`${pe.reviewerPassed} <> ${pe.humanPassed}`)).orderBy(pe.evalRunId,pe.expectationIndex);return e.json(o)});var DC=wn.object({resolution:wn.enum(["kept","relabeled"])});Ms.patch("/judge-reviews/:id/resolve",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=wn.string().uuid().safeParse(n);if(!r.success)return e.json({error:"Invalid id"},400);let o=DC.parse(await e.req.json()),[s]=await u.select().from(pe).where(wd(Kn(pe.id,r.data),Kn(pe.userId,t)));if(!s)return e.json({error:"Not found"},404);let i=await u.update(pe).set({resolvedAt:new Date,resolution:o.resolution,updatedAt:new Date}).where(wd(Kn(pe.evalRunId,s.evalRunId),Kn(pe.expectationIndex,s.expectationIndex),Kn(pe.userId,t),Ih(pe.resolvedAt))).returning({id:pe.id});return e.json({resolved:i.length})});D();import{createHash as CC}from"node:crypto";import{Hono as LC}from"hono";import{z as oe}from"zod";import{eq as on,and as ma,desc as Eh,asc as MC,sql as Nr,isNull as $C}from"drizzle-orm";import{alias as U0}from"drizzle-orm/pg-core";function OC(e){if(e===null||typeof e!="object")return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}c(OC,"isPlainObject");function wp(e){if(typeof e=="string")return e.indexOf("\0")===-1?e:e.split("\0").join("");if(Array.isArray(e)){let t=null;for(let n=0;n<e.length;n++){let r=wp(e[n]);t===null&&r!==e[n]&&(t=e.slice(0,n)),t!==null&&t.push(r)}return t??e}if(OC(e)){let t=Object.entries(e),n=null;for(let r=0;r<t.length;r++){let[o,s]=t[r],i=o.indexOf("\0")===-1?o:o.split("\0").join(""),a=wp(s);if(n===null&&(i!==o||a!==s)){n={};for(let d=0;d<r;d++)n[t[d][0]]=t[d][1]}n!==null&&(n[i]=a)}return n??e}return e}c(wp,"stripNullBytes");Zl();function qC(){return{enabled:process.env.RULEMETRIC_OFFLOAD_DELTAS==="1"||process.env.RULEMETRIC_OFFLOAD_DELTAS==="true",thresholdBytes:Number(process.env.OFFLOAD_GZIP_THRESHOLD_BYTES)||49152}}c(qC,"offloadConfig");function H0(e){return CC("sha256").update(JSON.stringify(e)).digest("hex")}c(H0,"hashJson");function B0(e,t){return Array.isArray(e)?e:Array.isArray(t)?t:[]}c(B0,"arrayOr");function F0(e,t){return Nr`COALESCE(
|
|
1146
1193
|
CASE WHEN jsonb_typeof(${e}) = 'array' THEN ${e} END,
|
|
1147
1194
|
CASE WHEN jsonb_typeof(${t}) = 'array' THEN ${t} END,
|
|
1148
1195
|
'[]'::jsonb
|
|
1149
|
-
)`}c(F0,"resolvedJsonArray");async function
|
|
1196
|
+
)`}c(F0,"resolvedJsonArray");async function UC(e){let{enabled:t,thresholdBytes:n}=qC();if(!t||e.length===0)return{messagesDelta:e,messagesDeltaRef:null};let r=nh(e);if(r.bytes<=n)return{messagesDelta:e,messagesDeltaRef:null};try{let{ref:o}=await rh(r);return{messagesDelta:null,messagesDeltaRef:o}}catch(o){return console.error("[context-snapshots] delta offload failed, writing inline:",o instanceof Error?o.message:o),{messagesDelta:e,messagesDeltaRef:null}}}c(UC,"resolveDeltaStorage");async function bh(e,t,n){let r=JSON.stringify(n);await u.insert(Rn).values({hash:e,contentType:t,content:n,sizeBytes:Buffer.byteLength(r,"utf-8")}).onConflictDoNothing()}c(bh,"upsertBlob");var fa=new LC,HC=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()}),BC=100,FC=500;async function W0(e,t){let[n]=await u.select({id:M.id,sequence:M.sequence}).from(M).where(ma(on(M.sessionId,e),on(M.requestHash,t))).limit(1);return n??null}c(W0,"findSnapshotByHash");fa.post("/sessions/:id/context-snapshots",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=wp(HC.parse(r)),[s]=await u.select({id:y.id,projectPath:y.projectPath,projectId:y.projectId}).from(y).where(ma(on(y.id,n),on(y.userId,t)));if(!s)return e.json({error:"Session not found"},404);if(!s.projectPath&&o.context_items?.length){let g=o.context_items.find(m=>m.type==="claude_md"&&typeof m.name=="string"&&m.name.startsWith("/")&&m.name.endsWith("/CLAUDE.md"));if(g){let m=g.name.slice(0,-10),w=null;if(!s.projectId){let[I]=await u.select({projectId:ye.projectId}).from(ye).where(on(ye.path,m)).limit(1);w=I?.projectId??null}await u.update(y).set({projectPath:m,...w?{projectId:w}:{}}).where(ma(on(y.id,n),$C(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 g=await W0(n,d);if(g)return e.json({id:g.id,sequence:g.sequence,deduplicated:!0})}let p=H0(o.tools),f=H0(l);await Promise.all([bh(o.system_hash,"system_prompt",o.system_prompt),bh(p,"tools",o.tools),bh(f,"injected_instructions",l)]);let _={sessionId:n,userId:t,provider:o.provider,model:o.model,systemPrompt:"",injectedInstructions:[],messagesSummary:i,tools:[],systemHash:o.system_hash,toolsHash:p,injectedHash:f,requestHash: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}}},v=5;for(let g=0;g<=v;g++){let[m]=await u.select({sequence:M.sequence,messagesSummary:M.messagesSummary}).from(M).where(on(M.sessionId,n)).orderBy(Eh(M.sequence)).limit(1),w=(m?.sequence??-1)+1,I=Array.isArray(m?.messagesSummary)?m.messagesSummary:[],b=a,A=0,E=Math.min(I.length,b.length);for(;A<E&&JSON.stringify(I[A])===JSON.stringify(b[A]);)A++;let S=b.slice(A),R=await UC(S);try{let[O]=await u.insert(M).values({..._,sequence:w,...R}).returning({id:M.id,sequence:M.sequence});return e.json({id:O.id,sequence:O.sequence},201)}catch(O){let W=O.cause,N=W?.constraint_name??"",U=`${O instanceof Error?O.message:""} ${W?.message??""}`.toLowerCase();if(W?.code==="23505"){if((N==="idx_snapshots_session_request"||U.includes("request"))&&d){let q=await W0(n,d);if(q)return e.json({id:q.id,sequence:q.sequence,deduplicated:!0})}if(g<v)continue;return e.json({error:"snapshot sequence assignment failed after retries"},503)}if(U.includes("foreign key"))return e.json({error:"Session no longer exists"},404);throw O}}return e.json({error:"snapshot sequence assignment failed after retries"},503)});fa.get("/sessions/:id/context-snapshots",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=Number(e.req.query("limit")||BC),o=Math.min(Math.max(1,r),FC),s=Math.max(0,Number(e.req.query("offset")||0)),[i]=await u.select({id:y.id}).from(y).where(ma(on(y.id,n),on(y.userId,t)));if(!i)return e.json({error:"Session not found"},404);if(!(e.req.query("full")==="true")){let l=U0(Rn,"cb_tools"),p=U0(Rn,"cb_injected"),_=(await u.select({id:M.id,sessionId:M.sessionId,userId:M.userId,sequence:M.sequence,provider:M.provider,model:M.model,systemHash:M.systemHash,requestHash:M.requestHash,maxTokens:M.maxTokens,temperature:M.temperature,estimatedTokens:M.estimatedTokens,capturedAt:M.capturedAt,injectedCount:Nr`jsonb_array_length(${F0(p.content,M.injectedInstructions)})`,toolsLight:Nr`COALESCE((
|
|
1150
1197
|
SELECT jsonb_agg(jsonb_build_object('name', t->'name', 'description', left(COALESCE(t->>'description', ''), 80)))
|
|
1151
1198
|
FROM jsonb_array_elements(${F0(l.content,M.tools)}) AS t
|
|
1152
1199
|
), '[]'::jsonb)`,metadataLight:Nr`jsonb_strip_nulls(jsonb_build_object(
|
|
@@ -1164,15 +1211,15 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
1164
1211
|
)
|
|
1165
1212
|
ELSE NULL
|
|
1166
1213
|
END
|
|
1167
|
-
))`}).from(M).leftJoin(l,on(l.hash,M.toolsHash)).leftJoin(
|
|
1214
|
+
))`}).from(M).leftJoin(l,on(l.hash,M.toolsHash)).leftJoin(p,on(p.hash,M.injectedHash)).where(on(M.sessionId,n)).orderBy(Eh(M.capturedAt)).limit(o).offset(s)).map(v=>({id:v.id,sessionId:v.sessionId,userId:v.userId,sequence:v.sequence,provider:v.provider,model:v.model,systemHash:v.systemHash,requestHash:v.requestHash,maxTokens:v.maxTokens,temperature:v.temperature,estimatedTokens:v.estimatedTokens,capturedAt:v.capturedAt,metadata:v.metadataLight??{},systemPrompt:"",messagesSummary:[],tools:v.toolsLight??[],injectedInstructions:new Array(Number(v.injectedCount??0)).fill("[omitted]")}));return e.json(_)}let d=await Fe.select().from(M).where(on(M.sessionId,n)).orderBy(Eh(M.capturedAt)).limit(o).offset(s);return e.json(await Gb(await oh(d)))});fa.get("/context-snapshots/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await Fe.select().from(M).where(ma(on(M.id,n),on(M.userId,t)));if(!r)return e.json({error:"Snapshot not found"},404);let o=r.messagesDeltaRef?await id(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(Rn).where(Nr`${Rn.hash} IN (${Nr.join(s.map(p=>Nr`${p}`),Nr`, `)})`):[],a=new Map(i.map(p=>[p.hash,p.content])),d=[],l=!1;if(o){let{messages:p,truncated:f}=await Yl({fetchPage:c(async(_,v)=>ad(await Fe.select({sequence:M.sequence,messagesDelta:M.messagesDelta,messagesDeltaRef:M.messagesDeltaRef}).from(M).where(ma(on(M.sessionId,r.sessionId),Nr`${M.sequence} <= ${r.sequence}`,Nr`${M.sequence} > ${_}`)).orderBy(MC(M.sequence)).limit(v)),"fetchPage")});d=p,l=f}return e.json({...r,systemPrompt:a.get(r.systemHash)??r.systemPrompt??"",tools:B0(a.get(r.toolsHash??""),r.tools),injectedInstructions:B0(a.get(r.injectedHash??""),r.injectedInstructions),messagesDelta:o,messagesRaw:d,messagesTruncated:l})});D();import{Hono as WC}from"hono";import{z as Co}from"zod";import{eq as pr,and as vd,desc as zC,ne as VC}from"drizzle-orm";import{z as jr}from"zod";var vp=jr.object({parallel:jr.number().int().positive().default(1),runsPerEval:jr.number().int().positive().default(1),iteration:jr.number().int().positive().default(1),skipBaseline:jr.boolean().default(!1),skipGrading:jr.boolean().default(!1),generateIfEmpty:jr.boolean().default(!1),model:jr.string().optional(),graderModel:jr.string().optional(),timeout:jr.number().int().positive().default(12e4)}).default({});var Lo=new WC,JC=Co.object({evalTargetId:Co.string().uuid(),config:vp});Lo.post("/eval-jobs",async e=>{let t=e.get("userId"),n=await e.req.json(),r=JC.parse(n),{id:o,noLiveWorker:s}=await Ot({taskName:"process_eval",payload:{evalTargetId:r.evalTargetId,config:r.config},userId:t,mirror:{userId:t,evalTargetId:r.evalTargetId,config:r.config}}),[i]=await u.select().from(je).where(pr(je.id,o));return e.json({...i,noLiveWorker:s},201)});Lo.get("/eval-targets/:id/jobs",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await u.select().from(je).where(vd(pr(je.evalTargetId,n),pr(je.userId,t))).orderBy(zC(je.createdAt));return e.json(r)});Lo.patch("/eval-jobs/:id/progress",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),s=["running","paused"].includes(r.status)?r.status:"running",[i]=await u.update(je).set({status:s,progress:r.progress,updatedAt:new Date}).where(vd(pr(je.id,n),pr(je.userId,t))).returning();return i?e.json(i):e.json({error:"Job not found"},404)});var KC=Co.object({status:Co.enum(["running","completed","failed"]).optional(),attempts:Co.number().int().nonnegative().optional(),error:Co.string().optional(),result:Co.record(Co.unknown()).optional()});Lo.patch("/eval-jobs/:id/state",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=KC.parse(await e.req.json()),o={updatedAt:new Date};r.attempts!==void 0&&(o.attempts=r.attempts),r.status&&(o.status=r.status),r.error&&(o.error=r.error),r.result!==void 0&&(o.result=r.result),(r.status==="completed"||r.status==="failed")&&(o.completedAt=new Date);let[s]=await u.update(je).set(o).where(vd(pr(je.id,n),pr(je.userId,t),VC(je.status,"cancelled"))).returning();if(!s){let[i]=await u.select().from(je).where(vd(pr(je.id,n),pr(je.userId,t)));return i?e.json(i):e.json({error:"Job not found"},404)}return e.json(s)});Lo.post("/eval-jobs/:id/cancel",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.update(je).set({status:"cancelled",updatedAt:new Date}).where(vd(pr(je.id,n),pr(je.userId,t))).returning();return r?e.json(r):e.json({error:"Job not found"},404)});D();import{Hono as GC}from"hono";import{z as $s}from"zod";import{eq as ga,and as Ah,isNull as YC,desc as XC,sql as z0}from"drizzle-orm";var Ip=new GC,QC=$s.object({contentHash:$s.string().min(1).optional(),evalTargetId:$s.string().uuid().optional(),name:$s.string().min(1).max(255),type:$s.enum(["instruction","skill","prompt","plan"]).default("instruction"),content:$s.string().optional(),sessionId:$s.string().uuid().optional(),config:vp});async function ZC(e){let t=await u.select({systemPrompt:M.systemPrompt,systemHash:M.systemHash,metadata:M.metadata}).from(M).where(z0`${M.metadata}->'contextItems' @> ${JSON.stringify([{content_hash:e}])}::jsonb`).orderBy(XC(M.capturedAt)).limit(1);if(t.length===0)return null;let n=t[0],r=await ep(n.systemHash,n.systemPrompt),i=(n.metadata?.contextItems??[]).find(p=>p.content_hash===e);if(!i?.name)return r;let a=i.name.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),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(ZC,"resolveContentFromSnapshot");Ip.post("/eval-from-context",async e=>{let t=e.get("userId"),n=await e.req.json(),r=QC.parse(n),o=!1,s;if(r.evalTargetId){let[_]=await u.select({id:k.id}).from(k).where(Ah(ga(k.id,r.evalTargetId),ga(k.userId,t))).limit(1);if(!_)return e.json({error:"Eval target not found"},404);s=_.id}else if(r.contentHash){let[_]=await u.select({id:k.id}).from(k).where(Ah(ga(k.userId,t),z0`${k.metadata}->>'content_hash' = ${r.contentHash}`)).limit(1);if(_)s=_.id;else{let v=r.content;if(v||(v=await ZC(r.contentHash)??void 0),!v)return e.json({error:"Content not provided and could not be resolved from snapshots"},400);let g=null;if(r.sessionId){let[w]=await u.select({projectPath:y.projectPath}).from(y).where(ga(y.id,r.sessionId)).limit(1);g=w?.projectPath?.replace(/\/$/,"")??null}let[m]=await u.insert(k).values({userId:t,name:r.name,type:r.type,content:v,description:`Auto-created from session context item: ${r.name}`,projectPath:g,metadata:{content_hash:r.contentHash,source_session_id:r.sessionId}}).returning();s=m.id,o=!0}}else return e.json({error:"Provide contentHash or evalTargetId"},400);let a=(await u.select({id:Ee.id}).from(Ee).where(Ah(ga(Ee.evalTargetId,s),YC(Ee.retiredAt))).limit(1)).length===0,d=a?{...r.config,generateIfEmpty:!0}:r.config,{id:l,noLiveWorker:p}=await Ot({taskName:"process_eval",payload:{evalTargetId:s,config:d},userId:t,mirror:{userId:t,evalTargetId:s,config:d}}),[f]=await u.select().from(je).where(ga(je.id,l));return e.json({evalTargetId:s,evalJobId:f.id,evalCasesCreated:0,generationDeferred:a,isNewTarget:o,noLiveWorker:p},201)});import{Hono as sM}from"hono";D();import{Hono as eL}from"hono";import{and as V0,eq as Sh,sql as vn}from"drizzle-orm";var xh=new eL;xh.get("/insights/projects",async e=>{let t=e.get("userId"),n=await u.select({projectId:y.projectId,name:C.name,gitRemoteUrl:C.gitRemoteUrl,sessionCount:vn`COUNT(*)`,enrichedCount:vn`COUNT(CASE WHEN ${y.metadata}->'local_session_meta' IS NOT NULL THEN 1 END)`,analyzedCount:vn`COUNT(CASE WHEN ${y.analysis} IS NOT NULL THEN 1 END)`,firstSession:vn`MIN(${y.startedAt})`,lastSession:vn`MAX(${y.startedAt})`}).from(y).innerJoin(C,Sh(C.id,y.projectId)).where(V0(Sh(y.userId,t),vn`${y.projectId} IS NOT NULL`)).groupBy(y.projectId,C.name,C.gitRemoteUrl),r=await u.execute(vn`
|
|
1168
1215
|
select project_id, project_path, count(*)::int as n
|
|
1169
1216
|
from sessions
|
|
1170
1217
|
where user_id = ${t}
|
|
1171
1218
|
and project_id is not null
|
|
1172
1219
|
and project_path is not null
|
|
1173
1220
|
group by project_id, project_path
|
|
1174
|
-
`),o=new Map,s=new Map;for(let
|
|
1175
|
-
${r}`).digest("hex")}c(G0,"recommendationEntryHash");var
|
|
1221
|
+
`),o=new Map,s=new Map;for(let p of r){let f=s.get(p.project_id)??-1;p.n>f&&(s.set(p.project_id,p.n),o.set(p.project_id,p.project_path))}let i=n.map(p=>({projectId:p.projectId,name:p.name,projectPath:p.projectId?o.get(p.projectId)??"":"",gitRemoteUrl:p.gitRemoteUrl,sessionCount:Number(p.sessionCount),enrichedCount:Number(p.enrichedCount),analyzedCount:Number(p.analyzedCount),firstSession:p.firstSession,lastSession:p.lastSession})),d=(await u.select({projectPath:y.projectPath,sessionCount:vn`COUNT(*)`,enrichedCount:vn`COUNT(CASE WHEN ${y.metadata}->'local_session_meta' IS NOT NULL THEN 1 END)`,analyzedCount:vn`COUNT(CASE WHEN ${y.analysis} IS NOT NULL THEN 1 END)`,firstSession:vn`MIN(${y.startedAt})`,lastSession:vn`MAX(${y.startedAt})`}).from(y).where(V0(Sh(y.userId,t),vn`${y.projectId} IS NULL`,vn`${y.projectPath} IS NOT NULL`)).groupBy(y.projectPath)).map(p=>({projectId:null,name:(p.projectPath??"").split("/").pop()||"unknown",projectPath:p.projectPath??"",gitRemoteUrl:null,sessionCount:Number(p.sessionCount),enrichedCount:Number(p.enrichedCount),analyzedCount:Number(p.analyzedCount),firstSession:p.firstSession,lastSession:p.lastSession})),l=[...i,...d].sort((p,f)=>f.sessionCount-p.sessionCount);return e.json(l)});D();import wL from"node:fs";import vL from"node:path";import{Hono as IL}from"hono";import{and as Ph,desc as Dh,eq as qo,gte as bL,ilike as tE,lte as EL,sql as ha}from"drizzle-orm";D();import{createHash as tL}from"node:crypto";import{and as nL,eq as J0,inArray as rL,sql as Mo}from"drizzle-orm";var oL=90,sL=.5,K0=[{category:"claude_md_additions",get:c(e=>e.suggestions?.claude_md_additions,"get"),label:c(e=>String(e.addition??"").slice(0,120),"label")},{category:"features_to_try",get:c(e=>e.suggestions?.features_to_try,"get"),label:c(e=>String(e.feature??"").slice(0,120),"label")},{category:"usage_patterns",get:c(e=>e.suggestions?.usage_patterns,"get"),label:c(e=>String(e.title??"").slice(0,120),"label")},{category:"friction_categories",get:c(e=>e.friction_analysis?.categories,"get"),label:c(e=>String(e.category??"").slice(0,120),"label")},{category:"opportunities",get:c(e=>e.on_the_horizon?.opportunities,"get"),label:c(e=>String(e.title??"").slice(0,120),"label")},{category:"impressive_workflows",get:c(e=>e.what_works?.impressive_workflows,"get"),label:c(e=>String(e.title??"").slice(0,120),"label")},{category:"project_areas",get:c(e=>e.project_areas,"get"),label:c(e=>String(e.name??"").slice(0,120),"label")}];function G0(e,t){let n=Object.keys(t).filter(o=>o!=="id"&&o!=="timesGenerated").sort(),r=JSON.stringify(n.map(o=>[o,t[o]]));return tL("sha256").update(`${e}
|
|
1222
|
+
${r}`).digest("hex")}c(G0,"recommendationEntryHash");var iL=new Set(["42883","42P01","42704"]),aL=2,bp=!1;function cL(e){let t=e?.code;return typeof t=="string"&&iL.has(t)?"capability-absent":Sc(e)||Ac(e)||gi(e)||Fu(e)?"load":"isolable"}c(cL,"classifyProbeFailure");function dL(e,t){return async n=>[...await u.execute(Mo`
|
|
1176
1223
|
SELECT p.probe_hash, m.content_hash, m.times_generated, m.last_job_id,
|
|
1177
1224
|
m.dismissed_at, m.sim
|
|
1178
1225
|
FROM (VALUES ${Mo.join(n.map(o=>Mo`(${o.hash}::text, ${o.category}::text, ${o.label}::text)`),Mo`, `)}) AS p(probe_hash, category, label)
|
|
@@ -1191,10 +1238,10 @@ ${r}`).digest("hex")}c(G0,"recommendationEntryHash");var sL=new Set(["42883","42
|
|
|
1191
1238
|
ORDER BY sim DESC
|
|
1192
1239
|
LIMIT 1
|
|
1193
1240
|
) m
|
|
1194
|
-
`)]}c(cL,"dbProbeExecutor");async function Rh(e,t,n,r=0){if(e.length===0)return[];if(bm||n.aborted)return n.degraded+=e.length,[];try{return n.statements+=1,await t(e)}catch(o){let s=aL(o);if(n.failure??={kind:s,code:typeof o?.code=="string"?String(o.code):void 0,message:o instanceof Error?o.message:String(o)},s==="capability-absent"&&(bm=!0),s==="load"&&(n.aborted=!0),!(s==="isolable"&&r<iL&&e.length>1))return n.degraded+=e.length,[];n.bisections+=1;let a=Math.ceil(e.length/2),u=await Rh(e.slice(0,a),t,n,r+1),l=await Rh(e.slice(a),t,n,r+1);return[...u,...l]}}c(Rh,"resolveProbes");async function Y0(e){let{userId:t,jobId:n}=e,r=e.projectPath??"",o=[];for(let p of K0)for(let w of p.get(e.recs)??[]){if(w===null||typeof w!="object")continue;let I=w;o.push({category:p.category,hash:G0(p.category,I),label:p.label(I)})}if(o.length===0)return e.recs;let s=[...new Set(o.map(p=>p.hash))],i=await d.select({contentHash:Re.contentHash,timesGenerated:Re.timesGenerated,lastJobId:Re.lastJobId,dismissedAt:Re.dismissedAt}).from(Re).where(tL(J0(Re.userId,t),J0(Re.projectPath,r),nL(Re.contentHash,s))),a=new Map(i.map(p=>[p.contentHash,p])),u=new Map,l=new Map;for(let p of o)a.has(p.hash)||p.label.trim().length===0||l.has(p.hash)||l.set(p.hash,p);if(l.size>0&&!bm){let p={probes:l.size,statements:0,bisections:0,degraded:0,aborted:!1},w=await Rh([...l.values()],cL(t,r),p);for(let I of w)Number(I.sim)<oL||(u.set(I.probe_hash,I.content_hash),a.has(I.content_hash)||a.set(I.content_hash,{contentHash:I.content_hash,timesGenerated:Number(I.times_generated),lastJobId:I.last_job_id,dismissedAt:I.dismissed_at?new Date(I.dismissed_at):null}));p.failure&&console.warn(`[insight-memory] semantic probe degraded to verbatim identity: ${p.degraded}/${p.probes} probes, ${p.statements} statement(s), ${p.bisections} bisection(s), class=${p.failure.kind}`+(p.failure.code?` code=${p.failure.code}`:"")+(bm?" \u2014 trigram probing disabled for this process":""),p.failure.message)}let m=c(p=>u.get(p)??p,"canonical");if(n){let p=o.filter(w=>{let I=a.get(m(w.hash));return!I||I.lastJobId!==n});if(p.length>0)try{let w=new Set,I=p.filter(b=>!w.has(m(b.hash))&&w.add(m(b.hash)));await d.insert(Re).values(I.map(b=>({userId:t,projectPath:r,category:b.category,contentHash:m(b.hash),label:b.label,lastJobId:n}))).onConflictDoUpdate({target:[Re.userId,Re.projectPath,Re.contentHash],set:{lastSeenAt:Mo`now()`,timesGenerated:Mo`${Re.timesGenerated} + 1`,lastJobId:n}});for(let b of I){let A=m(b.hash),E=a.get(A);a.set(A,{contentHash:A,timesGenerated:(E?.timesGenerated??0)+1,lastJobId:n,dismissedAt:E?.dismissedAt??null})}}catch{}}let f=Date.now()-rL*24*3600*1e3,_=c(p=>{let w=a.get(p)?.dismissedAt;return w!=null&&new Date(w).getTime()>f},"suppressed"),v={...e.recs},h=c((p,w)=>{switch(p){case"claude_md_additions":case"features_to_try":case"usage_patterns":{let I={...v.suggestions};I[p]=w,v.suggestions=I;break}case"friction_categories":{v.friction_analysis={...v.friction_analysis,categories:w};break}case"opportunities":{v.on_the_horizon={...v.on_the_horizon,opportunities:w};break}case"impressive_workflows":{v.what_works={...v.what_works,impressive_workflows:w};break}case"project_areas":{v.project_areas=w;break}}},"setPath");for(let p of K0){let w=p.get(e.recs)??[];if(w.length===0)continue;let I=w.map(b=>{if(b===null||typeof b!="object")return b;let A=b,E=m(G0(p.category,A));return{...A,id:E,timesGenerated:a.get(E)?.timesGenerated??1}}).filter(b=>b===null||typeof b!="object"?!0:!_(b.id??""));h(p.category,I)}return v}c(Y0,"applyRecommendationMemory");async function X0(e){let t=e.projectPath??"";await d.insert(Re).values({userId:e.userId,projectPath:t,category:"unknown",contentHash:e.contentHash,dismissedAt:Mo`now()`}).onConflictDoUpdate({target:[Re.userId,Re.projectPath,Re.contentHash],set:{dismissedAt:Mo`now()`}})}c(X0,"dismissRecommendation");D();var Th=[{provider:"anthropic",modelId:"claude-fable-5",inputPerMTok:10,outputPerMTok:50,cacheReadPerMTok:1,cacheWrite5mPerMTok:12.5,cacheWrite1hPerMTok:20,contextWindow:1e6},{provider:"anthropic",modelId:"claude-opus-4-8",inputPerMTok:5,outputPerMTok:25,cacheReadPerMTok:.5,cacheWrite5mPerMTok:6.25,cacheWrite1hPerMTok:10,contextWindow:1e6},{provider:"anthropic",modelId:"claude-opus-4-7",inputPerMTok:5,outputPerMTok:25,cacheReadPerMTok:.5,cacheWrite5mPerMTok:6.25,cacheWrite1hPerMTok:10,contextWindow:1e6},{provider:"anthropic",modelId:"claude-opus-4-6",inputPerMTok:5,outputPerMTok:25,cacheReadPerMTok:.5,cacheWrite5mPerMTok:6.25,cacheWrite1hPerMTok:10,contextWindow:1e6},{provider:"anthropic",modelId:"claude-sonnet-5",inputPerMTok:3,outputPerMTok:15,cacheReadPerMTok:.3,cacheWrite5mPerMTok:3.75,cacheWrite1hPerMTok:6,contextWindow:1e6},{provider:"anthropic",modelId:"claude-sonnet-4-6",inputPerMTok:3,outputPerMTok:15,cacheReadPerMTok:.3,cacheWrite5mPerMTok:3.75,cacheWrite1hPerMTok:6,contextWindow:2e5},{provider:"anthropic",modelId:"claude-haiku-4-5-20251001",inputPerMTok:1,outputPerMTok:5,cacheReadPerMTok:.1,cacheWrite5mPerMTok:1.25,cacheWrite1hPerMTok:2,contextWindow:2e5},{provider:"anthropic",modelId:"claude-haiku-4-5",inputPerMTok:1,outputPerMTok:5,cacheReadPerMTok:.1,cacheWrite5mPerMTok:1.25,cacheWrite1hPerMTok:2,contextWindow:2e5},{provider:"openai",modelId:"gpt-5.5",inputPerMTok:5,outputPerMTok:30,cacheReadPerMTok:.5,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:4e5},{provider:"openai",modelId:"gpt-4o",inputPerMTok:2.5,outputPerMTok:10,cacheReadPerMTok:1.25,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:128e3},{provider:"openai",modelId:"gpt-4o-mini",inputPerMTok:.15,outputPerMTok:.6,cacheReadPerMTok:.075,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:128e3},{provider:"openai",modelId:"gpt-4.1",inputPerMTok:2,outputPerMTok:8,cacheReadPerMTok:.5,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:1e6},{provider:"openai",modelId:"gpt-4.1-mini",inputPerMTok:.4,outputPerMTok:1.6,cacheReadPerMTok:.1,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:1e6},{provider:"openai",modelId:"o1",inputPerMTok:15,outputPerMTok:60,cacheReadPerMTok:7.5,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:2e5},{provider:"openai",modelId:"o3",inputPerMTok:2,outputPerMTok:8,cacheReadPerMTok:.5,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:2e5},{provider:"openai",modelId:"o4-mini",inputPerMTok:1.1,outputPerMTok:4.4,cacheReadPerMTok:.275,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:2e5},{provider:"google",modelId:"gemini-2.5-pro",inputPerMTok:1.25,outputPerMTok:10,cacheReadPerMTok:.31,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:1e6},{provider:"google",modelId:"gemini-2.5-flash",inputPerMTok:.3,outputPerMTok:2.5,cacheReadPerMTok:.075,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:1e6},{provider:"google",modelId:"gemini-2.0-flash",inputPerMTok:.1,outputPerMTok:.4,cacheReadPerMTok:.025,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:1e6},{provider:"google",modelId:"gemini-1.5-pro",inputPerMTok:1.25,outputPerMTok:5,cacheReadPerMTok:.3125,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:2e6},{provider:"google",modelId:"gemini-1.5-flash",inputPerMTok:.075,outputPerMTok:.3,cacheReadPerMTok:.01875,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:1e6},{provider:"xai",modelId:"grok-4",inputPerMTok:3,outputPerMTok:15,cacheReadPerMTok:.75,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:256e3},{provider:"xai",modelId:"grok-3",inputPerMTok:3,outputPerMTok:15,cacheReadPerMTok:.75,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:131072},{provider:"deepseek",modelId:"deepseek-chat",inputPerMTok:.27,outputPerMTok:1.1,cacheReadPerMTok:.07,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:128e3},{provider:"deepseek",modelId:"deepseek-reasoner",inputPerMTok:.55,outputPerMTok:2.19,cacheReadPerMTok:.14,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:128e3}];function $o(e){if(!e)return"anthropic";let t=Th.find(r=>r.modelId===e);if(t)return t.provider;let n=e.toLowerCase();return n.startsWith("claude")?"anthropic":n.startsWith("gpt")||n.startsWith("o1")||n.startsWith("o3")||n.startsWith("o4")||n.startsWith("chatgpt")?"openai":n.startsWith("gemini")?"google":n.startsWith("grok")?"xai":n.startsWith("deepseek")?"deepseek":n.startsWith("mistral")||n.startsWith("mixtral")||n.startsWith("magistral")||n.startsWith("codestral")?"mistral":n.startsWith("llama")||n.startsWith("meta-llama")?"meta":"anthropic"}c($o,"providerFromModelId");var kh={provider:"anthropic",modelId:"default-sonnet-equivalent",inputPerMTok:3,outputPerMTok:15,cacheReadPerMTok:.3,cacheWrite5mPerMTok:3.75,cacheWrite1hPerMTok:6,contextWindow:2e5};function Nh(e){return Th.find(t=>t.modelId===e)}c(Nh,"findModel");var vu=1e6;function uL(e){return Math.round(e*100)/100}c(uL,"roundCents");function Em(e,t,n){let r=e.input_tokens??0,o=e.output_tokens??0,s=e.cache_read_input_tokens??0,i=(e.cache_creation_5m??0)+(e.cache_creation_input_tokens??0),a=e.cache_creation_1h??0,u=r*t.inputPerMTok/vu,l=o*t.outputPerMTok/vu,m=s*t.cacheReadPerMTok/vu,f=i*t.cacheWrite5mPerMTok/vu,_=a*t.cacheWrite1hPerMTok/vu,v=f+_,h=u+l+m+v;return{inputUsd:u,outputUsd:l,cacheReadUsd:m,cacheWriteUsd:v,totalUsd:uL(h),estimated:n}}c(Em,"computePrice");function jh(e,t,n){let r=Nh(t);return Em(e,r??kh,!r)}c(jh,"priceUsage");D();import{and as dL,desc as lL,eq as Q0,isNull as mL,lte as pL,or as fL,gt as gL}from"drizzle-orm";function Iu(e){return e==null?0:typeof e=="number"?e:Number(e)}c(Iu,"toNumber");async function Xr(e,t,n,r,o="anthropic"){let s=await e.select().from(st).where(dL(Q0(st.provider,o),Q0(st.modelId,n),pL(st.effectiveFrom,r),fL(mL(st.effectiveUntil),gL(st.effectiveUntil,r)))).orderBy(lL(st.effectiveFrom)).limit(1);if(s.length===0)return jh(t,n,r);let i=s[0];return Em(t,{inputPerMTok:Iu(i.inputPerM),outputPerMTok:Iu(i.outputPerM),cacheReadPerMTok:Iu(i.cacheReadPerM),cacheWrite5mPerMTok:Iu(i.cacheWrite5mPerM),cacheWrite1hPerMTok:Iu(i.cacheWrite1hPerM)},!1)}c(Xr,"priceUsageFromDb");var bu=1e6,Z0=10*6e4,hL=500,qs=new Map;function _L(e,t,n){return`${e}:${t}:${n.toISOString().slice(0,7)}`}c(_L,"rateKey");function eE(e,t){let n=$o(e),r=_L(n,e,t),o=qs.get(r),s=o&&Date.now()-o.at<Z0?o.rates:void 0;if(!s){s=(async()=>{let a={input_tokens:bu},u={output_tokens:bu},l={cache_read_input_tokens:bu},m={cache_creation_5m:bu},f={cache_creation_1h:bu},[_,v,h,p,w]=await Promise.all([Xr(Fe,a,e,t,n),Xr(Fe,u,e,t,n),Xr(Fe,l,e,t,n),Xr(Fe,m,e,t,n),Xr(Fe,f,e,t,n)]);return{inputPerM:_.inputUsd,outputPerM:v.outputUsd,cacheReadPerM:h.cacheReadUsd,cacheWrite5mPerM:p.cacheWriteUsd,cacheWrite1hPerM:w.cacheWriteUsd,estimated:_.estimated}})();let i=s;if(i.catch(()=>{qs.get(r)?.rates===i&&qs.delete(r)}),qs.set(r,{at:Date.now(),rates:i}),qs.size>hL)for(let[a,u]of qs)Date.now()-u.at>=Z0&&qs.delete(a)}return s}c(eE,"getRates");var Eu=new vL;function EL(e){let t=[],n=[];if(e.sessionsUsingMcp===0&&e.totalSessions>=5&&t.push({feature:"MCP Servers",one_liner:"Extend Claude with external tools via MCP",why_for_you:`Across ${e.totalSessions} sessions, you haven't used any MCP servers. MCP lets Claude access databases, APIs, and custom tools directly. Set up the RuleMetric MCP server from the /connect page in the dashboard.`,example_code:"claude mcp add <server-name> -- <command>"}),e.sessionsUsingTaskAgent===0&&e.totalSessions>=5&&t.push({feature:"Task Agents",one_liner:"Parallelize work with subagents",why_for_you:"You haven't used task agents yet. They can parallelize independent tasks \u2014 like running tests while editing code \u2014 saving significant time.",example_code:"claude -p 'Use an explore agent to map the architecture of this project, then use parallel agents to implement each change independently.'"}),e.totalToolErrors>10){let _=Object.entries(e.toolErrorCategories).sort(([,v],[,h])=>h-v)[0];_&&t.push({feature:"Hooks",one_liner:"Auto-run checks after tool calls",why_for_you:`You had ${e.totalToolErrors} tool errors, with "${_[0]}" being the most common (${_[1]}). Hooks can auto-run type-checks or linters after every edit to catch errors immediately.`,example_code:'Add to .claude/settings.json: {"hooks": {"PostToolUse": [{"matcher": "Edit|Write", "hooks": [{"type": "command", "command": "pnpm type-check 2>&1 | head -5"}]}]}}'})}if(e.totalMessages>100&&e.totalSessions>=10&&t.push({feature:"Headless Mode",one_liner:"Run Claude non-interactively for batch tasks",why_for_you:`With ${e.totalMessages} messages across ${e.totalSessions} sessions, you could automate repetitive tasks using headless mode.`,example_code:"claude -p 'Run pnpm type-check and pnpm test. Report only failures with file paths and line numbers.' --allowedTools 'Bash,Read,Grep'"}),Object.values(e.friction).reduce((_,v)=>_+v,0)>5){let v=Object.entries(e.friction).sort(([,h],[,p])=>p-h).slice(0,2).map(([h,p])=>`${h.replace(/_/g," ")} (${p}x)`).join(", ");n.push({title:"Reduce Friction with Structured Prompts",suggestion:`Your top friction points are: ${v}. Giving Claude more context upfront reduces back-and-forth.`,detail:"Start each session with a clear goal statement and constraints.",copyable_prompt:"This session has ONE goal: [describe goal]. Before making any changes, read the relevant files and explain your plan. Do not modify code until I approve the approach."})}e.sessionsWithAnalysis<e.totalSessions*.3&&e.totalSessions>=5&&n.push({title:"Enrich Sessions for Better Insights",suggestion:`Only ${e.sessionsWithAnalysis} of ${e.totalSessions} sessions have quality analysis. Enriching them unlocks outcome tracking, friction detection, and deeper recommendations.`,detail:"Sessions are analyzed automatically by the background worker. Start it with `rulemetric evals agent` (or use the Regenerate button on the dashboard) and enrichment catches up on its own.",copyable_prompt:"rulemetric evals agent"});let o=(e.outcomes.not_achieved??0)+(e.outcomes.partially_achieved??0),s=Object.values(e.outcomes).reduce((_,v)=>_+v,0);s>5&&o/s>.3&&n.push({title:"Scope Sessions to One Goal",suggestion:`${Math.round(o/s*100)}% of analyzed sessions didn't fully achieve their goal. Breaking work into focused, single-goal sessions improves success rates.`,detail:"Start each session with a clear, narrow objective.",copyable_prompt:"This session has ONE goal: [describe specific goal]. Do not touch any other code. When this specific task is done and verified, stop."});let i=[];e.totalToolErrors>10&&i.push({skillId:"type-check-hook",reason:`You had ${e.totalToolErrors} tool errors. This hook auto-runs type-check after every edit to catch them immediately.`});let a=e.friction.wrong_approach??0,u=e.friction.buggy_code??0;a+u>3&&i.push({skillId:"structured-debugging",reason:`${a+u} sessions had wrong-approach or buggy-code friction. Structured debugging prevents spiraling.`}),((e.toolErrorCategories.test_failure??e.toolErrorCategories.assertion??0)>3||(e.friction.buggy_code??0)>2)&&i.push({skillId:"tdd-workflow",reason:"Frequent test failures or buggy code suggest adopting red-green-refactor discipline."});let m=e.friction.excessive_changes??0;return m>2&&i.push({skillId:"git-commit-conventions",reason:`${m} sessions had excessive changes. Conventional commits enforce focused, atomic changes.`}),Object.entries(e.toolErrorCategories).filter(([_])=>_.includes("auth")||_.includes("security")||_.includes("permission")).reduce((_,[,v])=>_+v,0)>0&&i.push({skillId:"security-review",reason:"Security-related errors detected. A security review checklist catches vulnerabilities before they ship."}),t.length===0&&n.length===0&&i.length===0?null:{suggestions:{features_to_try:t,usage_patterns:n,claude_md_additions:[]},recommended_skills:i.length>0?i:void 0,_auto_generated:!0}}c(EL,"generateAutoSuggestions");var AL=45e3,Am=new Map,SL=tm();Eu.get("/insights/compute",async e=>{let t=e.get("userId"),n=e.req.query("projectPath"),r=e.req.query("projectId"),o=e.req.query("since"),s=e.req.query("until"),i=e.req.query("tool"),a=`${t}:${r??n??""}:${o??""}:${s??""}:${i??""}`,u=Am.get(a),m=(u&&Date.now()-u.at<AL?u.data:null)??await SL.run(a,async()=>{let v=[qo(y.userId,t)];r?v.push(qo(y.projectId,r)):n&&v.push(tE(y.projectPath,`%${ct(n)}%`)),i&&v.push(qo(y.tool,i)),o&&v.push(IL(y.startedAt,new Date(o))),s&&v.push(bL(y.startedAt,new Date(s)));let h=500,p=await Fe.select({id:y.id,externalSessionId:y.externalSessionId,tool:y.tool,projectPath:y.projectPath,startedAt:y.startedAt,endedAt:y.endedAt,eventCount:y.eventCount,tokenUsage:y.tokenUsage,analysis:y.analysis,analyzedAt:y.analyzedAt,metadata:y.metadata}).from(y).where(Ph(...v)).orderBy(Dh(y.startedAt)).limit(h),w=1e6,I=c(async(J,_e,Qe)=>{let Ke=await eE(_e,Qe),at=J.input_tokens??0,Gt=J.output_tokens??0,An=J.cache_read_input_tokens??0,cn=(J.cache_creation_5m??0)+(J.cache_creation_input_tokens??0),nr=J.cache_creation_1h??0,dt=at*Ke.inputPerM/w,xt=Gt*Ke.outputPerM/w,bt=An*Ke.cacheReadPerM/w,fn=cn*Ke.cacheWrite5mPerM/w+nr*Ke.cacheWrite1hPerM/w,ns=Math.round((dt+xt+bt+fn)*100)/100;return{inputUsd:dt,outputUsd:xt,cacheReadUsd:bt,cacheWriteUsd:fn,totalUsd:ns,estimated:Ke.estimated}},"getPriced"),b={},A={},E={},S={},T={},O={},W={},N={},q={},U={},H=[],te=[],de=[],K=0,pe=0,B=0,he=0,P=0,re=0,Ce=0,St=0,le=0,ce=0,Se=0,We=0,rt=0,Le=0,Xe=0,be=0,an=0,L=0,j=0,ht=0,jt=0,tr=0,pn=0,io=0,$a=null,qa=null,yS=Date.now()-720*60*60*1e3,ap=[],Ku="claude-sonnet-4-6",Gu=c(()=>({input_tokens:0,output_tokens:0,cache_read_tokens:0,cache_write_tokens:0,cost_usd:0}),"newBucket"),Yu=c((J,_e,Qe,Ke,at,Gt)=>{J.input_tokens+=_e,J.output_tokens+=Qe,J.cache_read_tokens+=Ke,J.cache_write_tokens+=at,J.cost_usd+=Gt},"accumulateBucket"),Ua={},Ha={},wS=new Map(p.map(J=>[J.id,J.startedAt])),vS=new Map(p.map(J=>[J.id,J.tool??"unknown"])),M_=new Set,$_=p.length>0?await Fe.execute(ha`
|
|
1241
|
+
`)]}c(dL,"dbProbeExecutor");async function Th(e,t,n,r=0){if(e.length===0)return[];if(bp||n.aborted)return n.degraded+=e.length,[];try{return n.statements+=1,await t(e)}catch(o){let s=cL(o);if(n.failure??={kind:s,code:typeof o?.code=="string"?String(o.code):void 0,message:o instanceof Error?o.message:String(o)},s==="capability-absent"&&(bp=!0),s==="load"&&(n.aborted=!0),!(s==="isolable"&&r<aL&&e.length>1))return n.degraded+=e.length,[];n.bisections+=1;let a=Math.ceil(e.length/2),d=await Th(e.slice(0,a),t,n,r+1),l=await Th(e.slice(a),t,n,r+1);return[...d,...l]}}c(Th,"resolveProbes");async function Y0(e){let{userId:t,jobId:n}=e,r=e.projectPath??"",o=[];for(let m of K0)for(let w of m.get(e.recs)??[]){if(w===null||typeof w!="object")continue;let I=w;o.push({category:m.category,hash:G0(m.category,I),label:m.label(I)})}if(o.length===0)return e.recs;let s=[...new Set(o.map(m=>m.hash))],i=await u.select({contentHash:Te.contentHash,timesGenerated:Te.timesGenerated,lastJobId:Te.lastJobId,dismissedAt:Te.dismissedAt}).from(Te).where(nL(J0(Te.userId,t),J0(Te.projectPath,r),rL(Te.contentHash,s))),a=new Map(i.map(m=>[m.contentHash,m])),d=new Map,l=new Map;for(let m of o)a.has(m.hash)||m.label.trim().length===0||l.has(m.hash)||l.set(m.hash,m);if(l.size>0&&!bp){let m={probes:l.size,statements:0,bisections:0,degraded:0,aborted:!1},w=await Th([...l.values()],dL(t,r),m);for(let I of w)Number(I.sim)<sL||(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}));m.failure&&console.warn(`[insight-memory] semantic probe degraded to verbatim identity: ${m.degraded}/${m.probes} probes, ${m.statements} statement(s), ${m.bisections} bisection(s), class=${m.failure.kind}`+(m.failure.code?` code=${m.failure.code}`:"")+(bp?" \u2014 trigram probing disabled for this process":""),m.failure.message)}let p=c(m=>d.get(m)??m,"canonical");if(n){let m=o.filter(w=>{let I=a.get(p(w.hash));return!I||I.lastJobId!==n});if(m.length>0)try{let w=new Set,I=m.filter(b=>!w.has(p(b.hash))&&w.add(p(b.hash)));await u.insert(Te).values(I.map(b=>({userId:t,projectPath:r,category:b.category,contentHash:p(b.hash),label:b.label,lastJobId:n}))).onConflictDoUpdate({target:[Te.userId,Te.projectPath,Te.contentHash],set:{lastSeenAt:Mo`now()`,timesGenerated:Mo`${Te.timesGenerated} + 1`,lastJobId:n}});for(let b of I){let A=p(b.hash),E=a.get(A);a.set(A,{contentHash:A,timesGenerated:(E?.timesGenerated??0)+1,lastJobId:n,dismissedAt:E?.dismissedAt??null})}}catch{}}let f=Date.now()-oL*24*3600*1e3,_=c(m=>{let w=a.get(m)?.dismissedAt;return w!=null&&new Date(w).getTime()>f},"suppressed"),v={...e.recs},g=c((m,w)=>{switch(m){case"claude_md_additions":case"features_to_try":case"usage_patterns":{let I={...v.suggestions};I[m]=w,v.suggestions=I;break}case"friction_categories":{v.friction_analysis={...v.friction_analysis,categories:w};break}case"opportunities":{v.on_the_horizon={...v.on_the_horizon,opportunities:w};break}case"impressive_workflows":{v.what_works={...v.what_works,impressive_workflows:w};break}case"project_areas":{v.project_areas=w;break}}},"setPath");for(let m of K0){let w=m.get(e.recs)??[];if(w.length===0)continue;let I=w.map(b=>{if(b===null||typeof b!="object")return b;let A=b,E=p(G0(m.category,A));return{...A,id:E,timesGenerated:a.get(E)?.timesGenerated??1}}).filter(b=>b===null||typeof b!="object"?!0:!_(b.id??""));g(m.category,I)}return v}c(Y0,"applyRecommendationMemory");async function X0(e){let t=e.projectPath??"";await u.insert(Te).values({userId:e.userId,projectPath:t,category:"unknown",contentHash:e.contentHash,dismissedAt:Mo`now()`}).onConflictDoUpdate({target:[Te.userId,Te.projectPath,Te.contentHash],set:{dismissedAt:Mo`now()`}})}c(X0,"dismissRecommendation");D();var Rh=[{provider:"anthropic",modelId:"claude-fable-5",inputPerMTok:10,outputPerMTok:50,cacheReadPerMTok:1,cacheWrite5mPerMTok:12.5,cacheWrite1hPerMTok:20,contextWindow:1e6},{provider:"anthropic",modelId:"claude-opus-4-8",inputPerMTok:5,outputPerMTok:25,cacheReadPerMTok:.5,cacheWrite5mPerMTok:6.25,cacheWrite1hPerMTok:10,contextWindow:1e6},{provider:"anthropic",modelId:"claude-opus-4-7",inputPerMTok:5,outputPerMTok:25,cacheReadPerMTok:.5,cacheWrite5mPerMTok:6.25,cacheWrite1hPerMTok:10,contextWindow:1e6},{provider:"anthropic",modelId:"claude-opus-4-6",inputPerMTok:5,outputPerMTok:25,cacheReadPerMTok:.5,cacheWrite5mPerMTok:6.25,cacheWrite1hPerMTok:10,contextWindow:1e6},{provider:"anthropic",modelId:"claude-sonnet-5",inputPerMTok:3,outputPerMTok:15,cacheReadPerMTok:.3,cacheWrite5mPerMTok:3.75,cacheWrite1hPerMTok:6,contextWindow:1e6},{provider:"anthropic",modelId:"claude-sonnet-4-6",inputPerMTok:3,outputPerMTok:15,cacheReadPerMTok:.3,cacheWrite5mPerMTok:3.75,cacheWrite1hPerMTok:6,contextWindow:2e5},{provider:"anthropic",modelId:"claude-haiku-4-5-20251001",inputPerMTok:1,outputPerMTok:5,cacheReadPerMTok:.1,cacheWrite5mPerMTok:1.25,cacheWrite1hPerMTok:2,contextWindow:2e5},{provider:"anthropic",modelId:"claude-haiku-4-5",inputPerMTok:1,outputPerMTok:5,cacheReadPerMTok:.1,cacheWrite5mPerMTok:1.25,cacheWrite1hPerMTok:2,contextWindow:2e5},{provider:"openai",modelId:"gpt-5.5",inputPerMTok:5,outputPerMTok:30,cacheReadPerMTok:.5,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:4e5},{provider:"openai",modelId:"gpt-4o",inputPerMTok:2.5,outputPerMTok:10,cacheReadPerMTok:1.25,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:128e3},{provider:"openai",modelId:"gpt-4o-mini",inputPerMTok:.15,outputPerMTok:.6,cacheReadPerMTok:.075,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:128e3},{provider:"openai",modelId:"gpt-4.1",inputPerMTok:2,outputPerMTok:8,cacheReadPerMTok:.5,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:1e6},{provider:"openai",modelId:"gpt-4.1-mini",inputPerMTok:.4,outputPerMTok:1.6,cacheReadPerMTok:.1,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:1e6},{provider:"openai",modelId:"o1",inputPerMTok:15,outputPerMTok:60,cacheReadPerMTok:7.5,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:2e5},{provider:"openai",modelId:"o3",inputPerMTok:2,outputPerMTok:8,cacheReadPerMTok:.5,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:2e5},{provider:"openai",modelId:"o4-mini",inputPerMTok:1.1,outputPerMTok:4.4,cacheReadPerMTok:.275,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:2e5},{provider:"google",modelId:"gemini-2.5-pro",inputPerMTok:1.25,outputPerMTok:10,cacheReadPerMTok:.31,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:1e6},{provider:"google",modelId:"gemini-2.5-flash",inputPerMTok:.3,outputPerMTok:2.5,cacheReadPerMTok:.075,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:1e6},{provider:"google",modelId:"gemini-2.0-flash",inputPerMTok:.1,outputPerMTok:.4,cacheReadPerMTok:.025,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:1e6},{provider:"google",modelId:"gemini-1.5-pro",inputPerMTok:1.25,outputPerMTok:5,cacheReadPerMTok:.3125,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:2e6},{provider:"google",modelId:"gemini-1.5-flash",inputPerMTok:.075,outputPerMTok:.3,cacheReadPerMTok:.01875,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:1e6},{provider:"xai",modelId:"grok-4",inputPerMTok:3,outputPerMTok:15,cacheReadPerMTok:.75,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:256e3},{provider:"xai",modelId:"grok-3",inputPerMTok:3,outputPerMTok:15,cacheReadPerMTok:.75,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:131072},{provider:"deepseek",modelId:"deepseek-chat",inputPerMTok:.27,outputPerMTok:1.1,cacheReadPerMTok:.07,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:128e3},{provider:"deepseek",modelId:"deepseek-reasoner",inputPerMTok:.55,outputPerMTok:2.19,cacheReadPerMTok:.14,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:128e3}];function $o(e){if(!e)return"anthropic";let t=Rh.find(r=>r.modelId===e);if(t)return t.provider;let n=e.toLowerCase();return n.startsWith("claude")?"anthropic":n.startsWith("gpt")||n.startsWith("o1")||n.startsWith("o3")||n.startsWith("o4")||n.startsWith("chatgpt")?"openai":n.startsWith("gemini")?"google":n.startsWith("grok")?"xai":n.startsWith("deepseek")?"deepseek":n.startsWith("mistral")||n.startsWith("mixtral")||n.startsWith("magistral")||n.startsWith("codestral")?"mistral":n.startsWith("llama")||n.startsWith("meta-llama")?"meta":"anthropic"}c($o,"providerFromModelId");var kh={provider:"anthropic",modelId:"default-sonnet-equivalent",inputPerMTok:3,outputPerMTok:15,cacheReadPerMTok:.3,cacheWrite5mPerMTok:3.75,cacheWrite1hPerMTok:6,contextWindow:2e5};function Nh(e){return Rh.find(t=>t.modelId===e)}c(Nh,"findModel");var Id=1e6;function uL(e){return Math.round(e*100)/100}c(uL,"roundCents");function Ep(e,t,n){let r=e.input_tokens??0,o=e.output_tokens??0,s=e.cache_read_input_tokens??0,i=(e.cache_creation_5m??0)+(e.cache_creation_input_tokens??0),a=e.cache_creation_1h??0,d=r*t.inputPerMTok/Id,l=o*t.outputPerMTok/Id,p=s*t.cacheReadPerMTok/Id,f=i*t.cacheWrite5mPerMTok/Id,_=a*t.cacheWrite1hPerMTok/Id,v=f+_,g=d+l+p+v;return{inputUsd:d,outputUsd:l,cacheReadUsd:p,cacheWriteUsd:v,totalUsd:uL(g),estimated:n}}c(Ep,"computePrice");function jh(e,t,n){let r=Nh(t);return Ep(e,r??kh,!r)}c(jh,"priceUsage");D();import{and as lL,desc as pL,eq as Q0,isNull as mL,lte as fL,or as gL,gt as hL}from"drizzle-orm";function bd(e){return e==null?0:typeof e=="number"?e:Number(e)}c(bd,"toNumber");async function Xr(e,t,n,r,o="anthropic"){let s=await e.select().from(st).where(lL(Q0(st.provider,o),Q0(st.modelId,n),fL(st.effectiveFrom,r),gL(mL(st.effectiveUntil),hL(st.effectiveUntil,r)))).orderBy(pL(st.effectiveFrom)).limit(1);if(s.length===0)return jh(t,n,r);let i=s[0];return Ep(t,{inputPerMTok:bd(i.inputPerM),outputPerMTok:bd(i.outputPerM),cacheReadPerMTok:bd(i.cacheReadPerM),cacheWrite5mPerMTok:bd(i.cacheWrite5mPerM),cacheWrite1hPerMTok:bd(i.cacheWrite1hPerM)},!1)}c(Xr,"priceUsageFromDb");var Ed=1e6,Z0=10*6e4,_L=500,qs=new Map;function yL(e,t,n){return`${e}:${t}:${n.toISOString().slice(0,7)}`}c(yL,"rateKey");function eE(e,t){let n=$o(e),r=yL(n,e,t),o=qs.get(r),s=o&&Date.now()-o.at<Z0?o.rates:void 0;if(!s){s=(async()=>{let a={input_tokens:Ed},d={output_tokens:Ed},l={cache_read_input_tokens:Ed},p={cache_creation_5m:Ed},f={cache_creation_1h:Ed},[_,v,g,m,w]=await Promise.all([Xr(Fe,a,e,t,n),Xr(Fe,d,e,t,n),Xr(Fe,l,e,t,n),Xr(Fe,p,e,t,n),Xr(Fe,f,e,t,n)]);return{inputPerM:_.inputUsd,outputPerM:v.outputUsd,cacheReadPerM:g.cacheReadUsd,cacheWrite5mPerM:m.cacheWriteUsd,cacheWrite1hPerM:w.cacheWriteUsd,estimated:_.estimated}})();let i=s;if(i.catch(()=>{qs.get(r)?.rates===i&&qs.delete(r)}),qs.set(r,{at:Date.now(),rates:i}),qs.size>_L)for(let[a,d]of qs)Date.now()-d.at>=Z0&&qs.delete(a)}return s}c(eE,"getRates");var Ad=new IL;function AL(e){let t=[],n=[];if(e.sessionsUsingMcp===0&&e.totalSessions>=5&&t.push({feature:"MCP Servers",one_liner:"Extend Claude with external tools via MCP",why_for_you:`Across ${e.totalSessions} sessions, you haven't used any MCP servers. MCP lets Claude access databases, APIs, and custom tools directly. Set up the RuleMetric MCP server from the /connect page in the dashboard.`,example_code:"claude mcp add <server-name> -- <command>"}),e.sessionsUsingTaskAgent===0&&e.totalSessions>=5&&t.push({feature:"Task Agents",one_liner:"Parallelize work with subagents",why_for_you:"You haven't used task agents yet. They can parallelize independent tasks \u2014 like running tests while editing code \u2014 saving significant time.",example_code:"claude -p 'Use an explore agent to map the architecture of this project, then use parallel agents to implement each change independently.'"}),e.totalToolErrors>10){let _=Object.entries(e.toolErrorCategories).sort(([,v],[,g])=>g-v)[0];_&&t.push({feature:"Hooks",one_liner:"Auto-run checks after tool calls",why_for_you:`You had ${e.totalToolErrors} tool errors, with "${_[0]}" being the most common (${_[1]}). Hooks can auto-run type-checks or linters after every edit to catch errors immediately.`,example_code:'Add to .claude/settings.json: {"hooks": {"PostToolUse": [{"matcher": "Edit|Write", "hooks": [{"type": "command", "command": "pnpm type-check 2>&1 | head -5"}]}]}}'})}if(e.totalMessages>100&&e.totalSessions>=10&&t.push({feature:"Headless Mode",one_liner:"Run Claude non-interactively for batch tasks",why_for_you:`With ${e.totalMessages} messages across ${e.totalSessions} sessions, you could automate repetitive tasks using headless mode.`,example_code:"claude -p 'Run pnpm type-check and pnpm test. Report only failures with file paths and line numbers.' --allowedTools 'Bash,Read,Grep'"}),Object.values(e.friction).reduce((_,v)=>_+v,0)>5){let v=Object.entries(e.friction).sort(([,g],[,m])=>m-g).slice(0,2).map(([g,m])=>`${g.replace(/_/g," ")} (${m}x)`).join(", ");n.push({title:"Reduce Friction with Structured Prompts",suggestion:`Your top friction points are: ${v}. Giving Claude more context upfront reduces back-and-forth.`,detail:"Start each session with a clear goal statement and constraints.",copyable_prompt:"This session has ONE goal: [describe goal]. Before making any changes, read the relevant files and explain your plan. Do not modify code until I approve the approach."})}e.sessionsWithAnalysis<e.totalSessions*.3&&e.totalSessions>=5&&n.push({title:"Enrich Sessions for Better Insights",suggestion:`Only ${e.sessionsWithAnalysis} of ${e.totalSessions} sessions have quality analysis. Enriching them unlocks outcome tracking, friction detection, and deeper recommendations.`,detail:"Sessions are analyzed automatically by the background worker. Start it with `rulemetric evals agent` (or use the Regenerate button on the dashboard) and enrichment catches up on its own.",copyable_prompt:"rulemetric evals agent"});let o=(e.outcomes.not_achieved??0)+(e.outcomes.partially_achieved??0),s=Object.values(e.outcomes).reduce((_,v)=>_+v,0);s>5&&o/s>.3&&n.push({title:"Scope Sessions to One Goal",suggestion:`${Math.round(o/s*100)}% of analyzed sessions didn't fully achieve their goal. Breaking work into focused, single-goal sessions improves success rates.`,detail:"Start each session with a clear, narrow objective.",copyable_prompt:"This session has ONE goal: [describe specific goal]. Do not touch any other code. When this specific task is done and verified, stop."});let i=[];e.totalToolErrors>10&&i.push({skillId:"type-check-hook",reason:`You had ${e.totalToolErrors} tool errors. This hook auto-runs type-check after every edit to catch them immediately.`});let a=e.friction.wrong_approach??0,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((_,[,v])=>_+v,0)>0&&i.push({skillId:"security-review",reason:"Security-related errors detected. A security review checklist catches vulnerabilities before they ship."}),t.length===0&&n.length===0&&i.length===0?null:{suggestions:{features_to_try:t,usage_patterns:n,claude_md_additions:[]},recommended_skills:i.length>0?i:void 0,_auto_generated:!0}}c(AL,"generateAutoSuggestions");var SL=45e3,Ap=new Map,xL=tp();Ad.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=Ap.get(a),p=(d&&Date.now()-d.at<SL?d.data:null)??await xL.run(a,async()=>{let v=[qo(y.userId,t)];r?v.push(qo(y.projectId,r)):n&&v.push(tE(y.projectPath,`%${ct(n)}%`)),i&&v.push(qo(y.tool,i)),o&&v.push(bL(y.startedAt,new Date(o))),s&&v.push(EL(y.startedAt,new Date(s)));let g=500,m=await Fe.select({id:y.id,externalSessionId:y.externalSessionId,tool:y.tool,projectPath:y.projectPath,startedAt:y.startedAt,endedAt:y.endedAt,eventCount:y.eventCount,tokenUsage:y.tokenUsage,analysis:y.analysis,analyzedAt:y.analyzedAt,metadata:y.metadata}).from(y).where(Ph(...v)).orderBy(Dh(y.startedAt)).limit(g),w=1e6,I=c(async(K,_e,Qe)=>{let Ke=await eE(_e,Qe),at=K.input_tokens??0,Gt=K.output_tokens??0,An=K.cache_read_input_tokens??0,cn=(K.cache_creation_5m??0)+(K.cache_creation_input_tokens??0),nr=K.cache_creation_1h??0,ut=at*Ke.inputPerM/w,xt=Gt*Ke.outputPerM/w,Et=An*Ke.cacheReadPerM/w,fn=cn*Ke.cacheWrite5mPerM/w+nr*Ke.cacheWrite1hPerM/w,ns=Math.round((ut+xt+Et+fn)*100)/100;return{inputUsd:ut,outputUsd:xt,cacheReadUsd:Et,cacheWriteUsd:fn,totalUsd:ns,estimated:Ke.estimated}},"getPriced"),b={},A={},E={},S={},R={},O={},W={},N={},U={},q={},H=[],Y=[],ce=[],V=0,me=0,B=0,he=0,P=0,re=0,Ce=0,St=0,le=0,de=0,Se=0,We=0,rt=0,Le=0,Xe=0,be=0,an=0,L=0,j=0,ht=0,jt=0,tr=0,mn=0,io=0,$a=null,qa=null,yS=Date.now()-720*60*60*1e3,am=[],Gd="claude-sonnet-4-6",Yd=c(()=>({input_tokens:0,output_tokens:0,cache_read_tokens:0,cache_write_tokens:0,cost_usd:0}),"newBucket"),Xd=c((K,_e,Qe,Ke,at,Gt)=>{K.input_tokens+=_e,K.output_tokens+=Qe,K.cache_read_tokens+=Ke,K.cache_write_tokens+=at,K.cost_usd+=Gt},"accumulateBucket"),Ua={},Ha={},wS=new Map(m.map(K=>[K.id,K.startedAt])),vS=new Map(m.map(K=>[K.id,K.tool??"unknown"])),M_=new Set,$_=m.length>0?await Fe.execute(ha`
|
|
1195
1242
|
SELECT
|
|
1196
1243
|
deduped.session_id AS "sessionId",
|
|
1197
|
-
COALESCE(deduped.model, ${
|
|
1244
|
+
COALESCE(deduped.model, ${Gd}) AS "model",
|
|
1198
1245
|
COALESCE(SUM(COALESCE((deduped.token_usage->>'input_tokens')::bigint, (deduped.token_usage->>'input')::bigint)), 0)::bigint AS "inputTokens",
|
|
1199
1246
|
COALESCE(SUM(COALESCE((deduped.token_usage->>'output_tokens')::bigint, (deduped.token_usage->>'output')::bigint)), 0)::bigint AS "outputTokens",
|
|
1200
1247
|
COALESCE(SUM(COALESCE((deduped.token_usage->>'cache_read_input_tokens')::bigint, (deduped.token_usage->>'cacheRead')::bigint)), 0)::bigint AS "cacheReadTokens",
|
|
@@ -1205,17 +1252,17 @@ ${r}`).digest("hex")}c(G0,"recommendationEntryHash");var sL=new Set(["42883","42
|
|
|
1205
1252
|
SELECT DISTINCT ON (se.session_id, COALESCE(se.metadata->>'requestId', se.id::text))
|
|
1206
1253
|
se.session_id, se.model, se.token_usage
|
|
1207
1254
|
FROM session_events se
|
|
1208
|
-
WHERE se.session_id IN (${ha.join(
|
|
1255
|
+
WHERE se.session_id IN (${ha.join(m.map(K=>ha`${K.id}`),ha`, `)})
|
|
1209
1256
|
AND se.token_usage IS NOT NULL
|
|
1210
1257
|
ORDER BY se.session_id, COALESCE(se.metadata->>'requestId', se.id::text), se.sequence
|
|
1211
1258
|
) deduped
|
|
1212
1259
|
GROUP BY deduped.session_id, deduped.model
|
|
1213
|
-
`):[];for(let J of $_)M_.add(J.sessionId);for(let J of p){let _e=J.metadata?.local_session_meta,Qe=J.analysis,Ke=J.tokenUsage;if(J.tool&&(A[J.tool]=(A[J.tool]||0)+1),J.projectPath){let at=J.projectPath.split("/").pop()??J.projectPath;S[at]=(S[at]||0)+1}if(Ke&&!M_.has(J.id)){let at=Ke.input_tokens??0,Gt=Ke.output_tokens??0,An=Ke.cache_read_input_tokens??0,cn=Ke.cache_creation_5m??0,nr=Ke.cache_creation_1h??0,dt=Ke.cache_creation_input_tokens??0,xt=cn+nr||dt;B+=at,he+=Gt,P+=An,re+=xt;let bt=await I(Ke,Ku,J.startedAt);Ce+=bt.inputUsd,St+=bt.outputUsd,le+=bt.cacheReadUsd,ce+=bt.cacheWriteUsd;let fn=bt.inputUsd+bt.outputUsd+bt.cacheReadUsd+bt.cacheWriteUsd,ns=J.tool??"unknown",B_=Ua[Ku]??Gu();Yu(B_,at,Gt,An,xt,fn),Ua[Ku]=B_;let F_=Ha[ns]??Gu();Yu(F_,at,Gt,An,xt,fn),Ha[ns]=F_}if(_e){L++;let at=_e.user_message_count??0;K+=at,pe+=(_e.duration_minutes??0)/60,Se+=_e.git_commits??0,We+=_e.git_pushes??0,rt+=_e.lines_added??0,Le+=_e.lines_removed??0,Xe+=_e.files_modified??0,be+=_e.tool_errors??0;let Gt=_e.tool_counts;if(Gt)for(let[bt,fn]of Object.entries(Gt))b[bt]=(b[bt]||0)+fn;let An=_e.languages;if(An)for(let[bt,fn]of Object.entries(An))E[bt]=(E[bt]||0)+fn;let cn=_e.message_hours;cn&&H.push(...cn);let nr=_e.tool_error_categories;if(nr)for(let[bt,fn]of Object.entries(nr))U[bt]=(U[bt]||0)+fn;let dt=_e.user_response_times;dt&&te.push(...dt),an+=_e.user_interruptions??0,_e.uses_task_agent&&ht++,_e.uses_mcp&&jt++;let xt=_e.user_message_timestamps;xt&&xt.length>0&&de.push({id:J.id,start:J.startedAt.toISOString(),timestamps:xt})}if(Qe)if(J.analyzedAt){tr++;let at=new Date(J.analyzedAt).getTime();($a===null||at<$a)&&($a=at),(qa===null||at>qa)&&(qa=at),at<yS&&io++}else pn++;if(Qe){j++;let at=Qe.goal_categories;if(at)for(let[dt,xt]of Object.entries(at))xt>0&&(T[dt]=(T[dt]||0)+xt);let Gt=Qe.outcome;Gt&&(O[Gt]=(O[Gt]||0)+1);let An=Qe.user_satisfaction;if(An)for(let[dt,xt]of Object.entries(An))xt>0&&(W[dt]=(W[dt]||0)+xt);let cn=Qe.session_type;cn&&(N[cn]=(N[cn]||0)+1);let nr=Qe.friction??Qe.friction_counts;if(nr)for(let[dt,xt]of Object.entries(nr))xt>0&&(q[dt]=(q[dt]||0)+xt);ap.length<50&&ap.push({id:J.id,externalId:J.externalSessionId,date:J.startedAt.toISOString().split("T")[0]??"",summary:Qe.brief_summary??"",goal:Qe.underlying_goal,outcome:Gt})}}let Xu=p.map(J=>J.startedAt.toISOString()).sort(),cp=new Set(Xu.map(J=>J.split("T")[0]));for(let J of $_){let _e=Number(J.inputTokens)||0,Qe=Number(J.outputTokens)||0,Ke=Number(J.cacheReadTokens)||0,at=Number(J.cacheWrite5m)||0,Gt=Number(J.cacheWrite1h)||0,An=Number(J.cacheWriteLegacy)||0,cn=at+Gt||An,nr=wS.get(J.sessionId)??new Date,dt=await I({input_tokens:_e,output_tokens:Qe,cache_read_input_tokens:Ke,cache_creation_input_tokens:cn},J.model,nr);Ce+=dt.inputUsd,St+=dt.outputUsd,le+=dt.cacheReadUsd,ce+=dt.cacheWriteUsd,B+=_e,he+=Qe,P+=Ke,re+=cn;let xt=dt.inputUsd+dt.outputUsd+dt.cacheReadUsd+dt.cacheWriteUsd,bt=Ua[J.model]??Gu();Yu(bt,_e,Qe,Ke,cn,xt),Ua[J.model]=bt;let fn=vS.get(J.sessionId)??"unknown",ns=Ha[fn]??Gu();Yu(ns,_e,Qe,Ke,cn,xt),Ha[fn]=ns}let ts=c(J=>Math.round(J*100)/100,"round2"),IS=Ce+St+le+ce,bS=ts(IS),ES={inputUsd:ts(Ce),outputUsd:ts(St),cacheReadUsd:ts(le),cacheWriteUsd:ts(ce)},up={};for(let[J,_e]of Object.entries(Ua))up[J]={input_tokens:_e.input_tokens,output_tokens:_e.output_tokens,cache_read_tokens:_e.cache_read_tokens,cache_write_tokens:_e.cache_write_tokens,cost_usd:ts(_e.cost_usd)};let dp={};for(let[J,_e]of Object.entries(Ha))dp[J]={input_tokens:_e.input_tokens,output_tokens:_e.output_tokens,cache_read_tokens:_e.cache_read_tokens,cache_write_tokens:_e.cache_write_tokens,cost_usd:ts(_e.cost_usd)};let ao={"2-10s":0,"10-30s":0,"30s-1m":0,"1-2m":0,"2-5m":0,"5-15m":0,">15m":0};for(let J of te)J<10?ao["2-10s"]++:J<30?ao["10-30s"]++:J<60?ao["30s-1m"]++:J<120?ao["1-2m"]++:J<300?ao["2-5m"]++:J<900?ao["5-15m"]++:ao[">15m"]++;let Ys=[...te].sort((J,_e)=>J-_e),AS=Ys.length>0?Ys[Math.floor(Ys.length/2)]:0,SS=Ys.length>0?Ys.reduce((J,_e)=>J+_e,0)/Ys.length:0,q_=0,U_=0;if(de.length>1){let J=de.flatMap(Qe=>Qe.timestamps.map(Ke=>({sessionId:Qe.id,time:new Date(Ke).getTime()}))).sort((Qe,Ke)=>Qe.time-Ke.time),_e=new Set;for(let Qe=0;Qe<J.length-1;Qe++){let Ke=J[Qe],at=J[Qe+1];Ke.sessionId!==at.sessionId&&at.time-Ke.time<1800*1e3&&(_e.add(Ke.sessionId),_e.add(at.sessionId),q_++)}U_=_e.size}let Xs={computed:!0,total_sessions:p.length,window:{since:o??null,until:s??null},truncated:p.length>=h,sessions_with_meta:L,sessions_with_analysis:j,tools_used:A,date_range:{start:Xu[0]?.split("T")[0]??"",end:Xu[Xu.length-1]?.split("T")[0]??""},total_messages:K,total_duration_hours:Math.round(pe*10)/10,total_input_tokens:B,total_output_tokens:he,total_cache_read_tokens:P,total_cache_write_tokens:re,estimated_cost_usd:bS,estimated_cost_breakdown:ES,estimated_cost_by_model:Object.keys(up).length>0?up:void 0,estimated_cost_by_tool:Object.keys(dp).length>0?dp:void 0,tool_counts:b,languages:E,git_commits:Se,git_pushes:We,projects:S,goal_categories:T,outcomes:O,satisfaction:W,session_types:N,friction:q,tool_error_categories:U,session_summaries:ap,total_tool_errors:be,total_interruptions:an,total_lines_added:rt,total_lines_removed:Le,total_files_modified:Xe,days_active:cp.size,messages_per_day:cp.size>0?Math.round(K/cp.size*10)/10:0,message_hours:H,sessions_using_task_agent:ht,sessions_using_mcp:jt,response_time:{median_seconds:Math.round(AS*10)/10,avg_seconds:Math.round(SS*10)/10,histogram:ao,total_samples:te.length},parallel_sessions:{events:q_,sessions_involved:U_},analysis_freshness:{with_timestamp:tr,pre_instrumentation:pn,stale_30d:io,oldest_analyzed_at:$a?new Date($a).toISOString():null,newest_analyzed_at:qa?new Date(qa).toISOString():null}};Xs.autoAddAvailable=!!(n&&yL.existsSync(wL.join(n,"CLAUDE.md")));let Qu=[qo(z.userId,t),qo(z.status,"completed")];r?Qu.push(qo(z.projectId,r)):n?Qu.push(tE(z.projectPath,`%${ct(n)}%`)):Qu.push(ha`${z.projectPath} IS NULL`);let[H_]=await Fe.select({id:z.id,result:z.result}).from(z).where(Ph(...Qu)).orderBy(Dh(z.completedAt)).limit(1),xS=H_?.result,lp=$f(xS?.recommendations);if(lp&&Object.keys(lp).length>0)Xs.recommendations=lp,Xs._recsJobId=H_?.id??null;else if(p.length>=3){let J=EL({totalSessions:p.length,sessionsWithAnalysis:j,toolCounts:b,toolErrorCategories:U,friction:q,outcomes:O,sessionsUsingMcp:jt,sessionsUsingTaskAgent:ht,totalToolErrors:be,totalMessages:K,totalDurationHours:pe});J&&(Xs.recommendations=J)}return Am.size>1e3&&Am.clear(),Am.set(a,{at:Date.now(),data:Xs}),Xs}),{_recsJobId:f,..._}=m;if(_.recommendations)try{_.recommendations=await Y0({userId:t,projectPath:n,jobId:f??null,recs:_.recommendations})}catch{}return e.json(_)});Eu.get("/insights/recommendations/history",async e=>{let t=e.get("userId"),n=e.req.query("projectPath")??"",r=await d.select({category:Re.category,label:Re.label,timesGenerated:Re.timesGenerated,dismissedAt:Re.dismissedAt,lastSeenAt:Re.lastSeenAt}).from(Re).where(Ph(qo(Re.userId,t),qo(Re.projectPath,n))).orderBy(ha`${Re.dismissedAt} IS NULL`,Dh(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}))})});Eu.post("/insights/recommendations/dismiss",async e=>{let t=e.get("userId"),n=await e.req.json().catch(()=>({})),r=typeof n.contentHash=="string"?n.contentHash:"";if(!/^[0-9a-f]{64}$/.test(r))return e.json({error:"contentHash must be the 64-hex entry id from the compute response"},400);let o=typeof n.projectPath=="string"?n.projectPath:void 0;return await X0({userId:t,projectPath:o,contentHash:r}),e.json({ok:!0})});D();import{Hono as xL}from"hono";import{and as Ln,count as RL,eq as Oe,ilike as TL,inArray as kL,sql as In}from"drizzle-orm";ws();var Hs=new xL,Us=c(e=>ys(e?.outcome??null),"scoreOf");Hs.get("/insights/linked-instructions",async e=>{let t=e.get("userId"),n=e.req.query("projectPath"),r=Number(e.req.query("limit")??20),o=[Oe(y.userId,t)];n&&o.push(TL(y.projectPath,`%${ct(n)}%`));let s=await d.select({id:g.id,name:g.name,contentHash:g.contentHash,source:In`${g.frontmatter}->>'source'`,linkedSessions:In`COUNT(DISTINCT ${se.sessionId})`}).from(se).innerJoin(y,Oe(y.id,se.sessionId)).innerJoin(g,Oe(g.id,se.instructionId)).where(Ln(...o)).groupBy(g.id,g.name,g.contentHash,In`${g.frontmatter}->>'source'`).orderBy(In`COUNT(DISTINCT ${se.sessionId}) DESC`).limit(r);return e.json(s.map(i=>({id:i.id,name:i.name,contentHash:i.contentHash,source:i.source,linkedSessions:Number(i.linkedSessions)})))});Hs.get("/insights/instruction-impact",async e=>{let t=e.get("userId"),n=e.req.query("instructionId");if(!n)return e.json({error:"instructionId query param required"},400);let r=await d.select({id:y.id,projectId:y.projectId,model:y.model,tool:y.tool,tokenUsage:y.tokenUsage,analysis:y.analysis,metadata:y.metadata,eventCount:y.eventCount,startedAt:y.startedAt}).from(y).innerJoin(ne,Oe(ne.sessionId,y.id)).where(Ln(Oe(y.userId,t),Oe(ne.treatmentType,"instruction"),Oe(ne.treatmentId,n))),o=r.map(P=>P.id),s=await d.select({id:y.id,projectId:y.projectId,model:y.model,tool:y.tool,tokenUsage:y.tokenUsage,analysis:y.analysis,metadata:y.metadata,eventCount:y.eventCount,startedAt:y.startedAt}).from(y).where(Ln(Oe(y.userId,t),In`${y.analysis} IS NOT NULL`)),i=await d.selectDistinct({sessionId:ne.sessionId}).from(ne).where(Ln(Oe(ne.userId,t),Oe(ne.treatmentType,"instruction"))),a=new Set(i.map(P=>P.sessionId)),u=new Set(o),l=s.filter(P=>!u.has(P.id)&&a.has(P.id));function m(P){let re=0,Ce=0,St=0,le=0,ce=[],Se={},We={achieved:1,fully_achieved:1,mostly_achieved:.75,partially_achieved:.5,unclear_from_transcript:.25,not_achieved:0,abandoned:0};for(let rt of P){let Le=rt.analysis,Xe=rt.metadata?.local_session_meta;if(Le?.outcome){let an=We[Le.outcome];an!==void 0&&ce.push(an)}Xe&&(le++,re+=Xe.tool_errors??0,Ce+=Xe.duration_minutes??0,St+=(Xe.lines_added??0)+(Xe.lines_removed??0));let be=Le?.goal_categories??{};for(let[an,L]of Object.entries(be))L>0&&(Se[an]=(Se[an]||0)+L)}return{sessionCount:P.length,enrichedCount:le,outcomeScores:ce,avgOutcomeScore:ce.length>0?Math.round(ce.reduce((rt,Le)=>rt+Le,0)/ce.length*100)/100:null,avgToolErrors:le>0?Math.round(re/le*10)/10:null,avgDurationMinutes:le>0?Math.round(Ce/le*10)/10:null,avgLinesChanged:le>0?Math.round(St/le):null,topGoalCategories:Se}}c(m,"computeCohort");let f=m(r),_=m(l),v=c(P=>{if(!P)return"(no-date)";let re=typeof P=="string"?new Date(P):P;return Number.isNaN(re.getTime())?"(no-date)":`${re.getUTCFullYear()}-${String(re.getUTCMonth()+1).padStart(2,"0")}`},"monthKey"),h=c(P=>{if(!P)return 0;let re=typeof P=="string"?new Date(P):P;return Number.isNaN(re.getTime())?0:re.getTime()},"timeOf"),p=new Map,w=c((P,re,Ce,St)=>{let le=`${P??"(no-project)"}|${v(re)}`,ce=p.get(le);ce||(ce={key:le,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},p.set(le,ce)),(St?ce.withScores:ce.withoutScores).push(Ce),(St?ce.withTimes:ce.withoutTimes).push(h(re))},"addToStratum");for(let P of r){let re=Us(P.analysis);re!=null&&w(P.projectId,P.startedAt,re,!0)}for(let P of l){let re=Us(P.analysis);re!=null&&w(P.projectId,P.startedAt,re,!1)}let I=c(P=>{let re=new Map,Ce=new Set,St=c((le,ce,Se,We,rt)=>{let Le=re.get(le);Le||(Le=new Map,re.set(le,Le));let Xe=`${ce??"(no-project)"}|${v(Se)}`,be=Le.get(Xe);be||(be={key:Xe,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},Le.set(Xe,be)),(rt?be.withScores:be.withoutScores).push(We),(rt?be.withTimes:be.withoutTimes).push(h(Se))},"add");for(let le of r){let ce=Us(le.analysis),Se=P(le);ce==null||!Se||(Ce.add(Se),St(Se,le.projectId,le.startedAt,ce,!0))}for(let le of l){let ce=Us(le.analysis),Se=P(le);ce==null||!Se||!Ce.has(Se)||St(Se,le.projectId,le.startedAt,ce,!1)}return[...Ce].map(le=>({segment:le,strata:[...re.get(le)?.values()??[]]}))},"buildAxisSegments"),b=c(P=>[...P].sort((re,Ce)=>Number(Ce.verdict.sufficient)-Number(re.verdict.sufficient)||Ce.verdict.nWith-re.verdict.nWith),"sortSegs"),A=ag([...p.values()],I(P=>Ss(P.model))),E=A.overall,S=b(A.segments).map(P=>({model:P.segment,verdict:P.verdict})),T=b(ll(I(P=>P.tool??null))).map(P=>({harness:P.segment,verdict:P.verdict})),{outcomeScores:O,...W}=f,{outcomeScores:N,...q}=_,[U]=await d.select({name:g.name}).from(g).where(Oe(g.id,n)).limit(1),[H]=await d.select({n:RL(),lastAssignedAt:In`max(${Lt.assignedAt})`}).from(Lt).where(Ln(Oe(Lt.userId,t),Oe(Lt.treatmentType,"instruction"),Oe(Lt.treatmentId,n),Oe(Lt.method,"auto_added"))),te=H&&Number(H.n)>0?{count:Number(H.n),lastAssignedAt:H.lastAssignedAt}:null,[de]=await d.select({content:g.content,name:g.name}).from(g).where(Oe(g.id,n)),K=Kr(de?.content,de?.name),pe=K?(await d.select({projectPath:Q.projectPath,decision:Q.decision,delta:Q.delta,ciLower:Q.ciLower,ciUpper:Q.ciUpper,nTreated:Q.nTreated,nControl:Q.nControl,segment:Q.segment,decidedAt:Q.decidedAt}).from(Q).where(Ln(Oe(Q.userId,t),Oe(Q.instructionId,n),Oe(Q.contentHash,K)))).map(P=>({projectPath:P.projectPath,decision:P.decision,delta:Number(P.delta),ciLower:Number(P.ciLower),ciUpper:Number(P.ciUpper),nTreated:P.nTreated,nControl:P.nControl,segment:P.segment,decidedAt:P.decidedAt})):[],B=await d.select({id:$.id,projectPath:$.projectPath,source:$.source,status:$.status}).from($).where(Ln(Oe($.userId,t),Oe($.instructionId,n),Oe($.status,"running"))),he=pe.length>0||B.length>0?{verdicts:pe,experiments:B}:null;return e.json({instructionId:n,instructionName:U?.name??"Unknown",verdict:E,segments:S,harnessSegments:T,autoAdded:te,randomised:he,with:W,without:q,comparison:{outcomeScoreDelta:f.avgOutcomeScore!=null&&_.avgOutcomeScore!=null?Math.round((f.avgOutcomeScore-_.avgOutcomeScore)*100)/100:null,toolErrorsDelta:f.avgToolErrors!=null&&_.avgToolErrors!=null?Math.round((f.avgToolErrors-_.avgToolErrors)*10)/10:null,durationDelta:f.avgDurationMinutes!=null&&_.avgDurationMinutes!=null?Math.round((f.avgDurationMinutes-_.avgDurationMinutes)*10)/10:null}})});Hs.get("/insights/instruction-version-impact",async e=>{let t=e.get("userId"),n=e.req.query("instructionId");if(!n)return e.json({error:"instructionId query param required"},400);let r=await d.select({versionOrdinal:yr.versionOrdinal,contentHash:yr.contentHash,firstSeenAt:yr.firstSeenAt,contentLength:In`COALESCE(LENGTH(${yr.content}), 0)::int`}).from(yr).where(Oe(yr.instructionId,n)).orderBy(yr.versionOrdinal),o=await d.select({id:y.id,projectId:y.projectId,analysis:y.analysis,startedAt:y.startedAt,version:ne.treatmentVersion}).from(y).innerJoin(ne,Oe(ne.sessionId,y.id)).where(Ln(Oe(y.userId,t),Oe(ne.treatmentType,"instruction"),Oe(ne.treatmentId,n),In`${ne.treatmentVersion} > 0`)),s=new Map;for(let b of o){let A=s.get(b.version)??[];A.push(b),s.set(b.version,A)}let i=r.map(b=>({version:b.versionOrdinal,contentHash:b.contentHash,firstSeenAt:b.firstSeenAt,sessions:s.get(b.versionOrdinal)?.length??0,replayable:Number(b.contentLength)>0})),a=i.filter(b=>b.sessions>0).map(b=>b.version).sort((b,A)=>b-A),u=Number(e.req.query("version")),l=Number(e.req.query("baselineVersion")),m=Number.isFinite(u)&&u>0?u:a.at(-1),f=Number.isFinite(l)&&l>0?l:a.filter(b=>b!==m).at(-1);if(m==null||f==null)return e.json({instructionId:n,versions:i,version:m??null,baselineVersion:f??null,verdict:null,insufficientReason:"only one version of this instruction has attributed sessions; there is no prior version to compare against"});let _=c(b=>{if(!b)return"(no-date)";let A=typeof b=="string"?new Date(b):b;return Number.isNaN(A.getTime())?"(no-date)":`${A.getUTCFullYear()}-${String(A.getUTCMonth()+1).padStart(2,"0")}`},"monthKey"),v=c(b=>{if(!b)return 0;let A=typeof b=="string"?new Date(b):b;return Number.isNaN(A.getTime())?0:A.getTime()},"timeOf"),h=new Map,p=c((b,A)=>{let E=Us(b.analysis);if(E==null)return;let S=`${b.projectId??"(no-project)"}|${_(b.startedAt)}`,T=h.get(S);T||(T={key:S,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},h.set(S,T)),(A?T.withScores:T.withoutScores).push(E),(A?T.withTimes:T.withoutTimes).push(v(b.startedAt))},"add");for(let b of s.get(m)??[])p(b,!0);for(let b of s.get(f)??[])p(b,!1);let w=Pn([...h.values()],{baseline:"prior-version"}),[I]=await d.select({name:g.name}).from(g).where(Oe(g.id,n)).limit(1);return e.json({instructionId:n,instructionName:I?.name??"Unknown",version:m,baselineVersion:f,versions:i,verdict:w,replayableVersions:i.filter(b=>b.replayable).length})});Hs.get("/insights/memory-impact",async e=>{let t=e.get("userId"),n=e.req.query("memoryId");if(!n)return e.json({error:"memoryId query param required"},400);let[r]=await d.select({id:F.id,title:F.title,kind:F.kind,version:F.version,status:F.status}).from(F).where(Ln(Oe(F.id,n),Oe(F.userId,t))).limit(1);if(!r)return e.json({error:"memory not found"},404);let o=await d.select({sessionId:ne.sessionId,treatmentVersion:ne.treatmentVersion}).from(ne).where(Ln(Oe(ne.userId,t),Oe(ne.treatmentType,"memory"),Oe(ne.treatmentId,n))),s=new Map,i=new Set;for(let p of o){let w=s.get(p.treatmentVersion);w||(w=new Set,s.set(p.treatmentVersion,w)),w.add(p.sessionId),i.add(p.sessionId)}let a=await d.select({id:y.id,projectId:y.projectId,outcome:In`${y.analysis}->>'outcome'`,startedAt:y.startedAt,inputTokens:In`coalesce((${y.tokenUsage}->>'input_tokens')::numeric, 0)`,outputTokens:In`coalesce((${y.tokenUsage}->>'output_tokens')::numeric, 0)`}).from(y).where(Ln(Oe(y.userId,t),In`${y.analysis} is not null`)).orderBy(y.id),u=c((p,w)=>w>0?Math.round(p/w*100)/100:null,"avg"),l=c(()=>({n:0,scoreSum:0,scoreN:0,tokenSum:0}),"cohort"),m=c(p=>p.n>0?Math.round(p.tokenSum/p.n):null,"avgTokens"),f=c(p=>{let w=s.get(p)??new Set,I=new Map,b=l(),A=l();for(let W of a){let N=w.has(W.id);if(!N&&i.has(W.id))continue;let q=N?b:A;q.n++,q.tokenSum+=Number(W.inputTokens)+Number(W.outputTokens);let U=Us({outcome:W.outcome});if(U!=null){q.scoreSum+=U,q.scoreN++;let H=W.projectId??"(no-project)",te=I.get(H);te||(te={key:H,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},I.set(H,te)),(N?te.withScores:te.withoutScores).push(U),(N?te.withTimes:te.withoutTimes).push(W.startedAt?.getTime()??0)}}let E=Pn([...I.values()]),S={sessionCount:b.n,avgOutcomeScore:u(b.scoreSum,b.scoreN),avgTotalTokens:m(b)},T={sessionCount:A.n,avgOutcomeScore:u(A.scoreSum,A.scoreN),avgTotalTokens:m(A)},O={outcomeScoreDelta:S.avgOutcomeScore!=null&&T.avgOutcomeScore!=null?Math.round((S.avgOutcomeScore-T.avgOutcomeScore)*100)/100:null,totalTokensDelta:S.avgTotalTokens!=null&&T.avgTotalTokens!=null?S.avgTotalTokens-T.avgTotalTokens:null};return{verdict:E,with:S,without:T,comparison:O}},"computeVersion"),v=[...new Set([r.version,...s.keys()])].sort((p,w)=>w-p).map(p=>({version:p,isCurrent:p===r.version,...f(p)})),h=v.find(p=>p.isCurrent);return e.json({memoryId:n,memoryTitle:r.title,memoryKind:r.kind,memoryVersion:r.version,verdict:h.verdict,with:h.with,without:h.without,comparison:h.comparison,versions:v.map(({version:p,isCurrent:w,verdict:I,with:b,without:A})=>({version:p,isCurrent:w,verdict:I,with:b,without:A})),cost:{estimated:!0}})});var NL=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;Hs.get("/insights/suggestion-impact",async e=>{let t=e.get("userId"),n=e.req.query("instructionIds")??e.req.query("instructionId")??"",r=[...new Set(n.split(",").map(l=>l.trim()).filter(l=>NL.test(l)))].slice(0,200);if(r.length===0)return e.json({error:"instructionIds query param (comma-separated uuids) required"},400);let o=await d.select({sessionId:ne.sessionId,treatmentId:ne.treatmentId}).from(ne).where(Ln(Oe(ne.userId,t),Oe(ne.treatmentType,"suggestion"),kL(ne.treatmentId,r))),s=new Map;for(let l of o){let m=s.get(l.treatmentId);m||(m=new Set,s.set(l.treatmentId,m)),m.add(l.sessionId)}let a=(await d.select({id:y.id,projectId:y.projectId,outcome:In`${y.analysis}->>'outcome'`,startedAt:y.startedAt}).from(y).where(Ln(Oe(y.userId,t),In`${y.analysis} is not null`)).orderBy(y.id)).map(l=>({id:l.id,key:l.projectId??"(no-project)",score:Us({outcome:l.outcome}),time:l.startedAt?.getTime()??0})).filter(l=>l.score!=null),u={};for(let l of r){let m=s.get(l);if(!m||m.size===0){u[l]=Pn([]);continue}let f=new Map;for(let _ of a){let v=f.get(_.key);v||(v={key:_.key,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},f.set(_.key,v));let h=m.has(_.id);(h?v.withScores:v.withoutScores).push(_.score),(h?v.withTimes:v.withoutTimes).push(_.time)}u[l]=Pn([...f.values()],{iterations:2e3})}return e.json({impacts:u})});D();import{Hono as PL}from"hono";import{and as Bs,count as Ch,eq as Mn,inArray as sE,sql as Pr}from"drizzle-orm";D();import{sql as nE}from"drizzle-orm";var rE=30,Oh=14,jL=c(e=>({captureHealthy:!1,reason:e,candidates:[]}),"DARK");async function oE(e){let[t]=await d.execute(nE`
|
|
1260
|
+
`):[];for(let K of $_)M_.add(K.sessionId);for(let K of m){let _e=K.metadata?.local_session_meta,Qe=K.analysis,Ke=K.tokenUsage;if(K.tool&&(A[K.tool]=(A[K.tool]||0)+1),K.projectPath){let at=K.projectPath.split("/").pop()??K.projectPath;S[at]=(S[at]||0)+1}if(Ke&&!M_.has(K.id)){let at=Ke.input_tokens??0,Gt=Ke.output_tokens??0,An=Ke.cache_read_input_tokens??0,cn=Ke.cache_creation_5m??0,nr=Ke.cache_creation_1h??0,ut=Ke.cache_creation_input_tokens??0,xt=cn+nr||ut;B+=at,he+=Gt,P+=An,re+=xt;let Et=await I(Ke,Gd,K.startedAt);Ce+=Et.inputUsd,St+=Et.outputUsd,le+=Et.cacheReadUsd,de+=Et.cacheWriteUsd;let fn=Et.inputUsd+Et.outputUsd+Et.cacheReadUsd+Et.cacheWriteUsd,ns=K.tool??"unknown",B_=Ua[Gd]??Yd();Xd(B_,at,Gt,An,xt,fn),Ua[Gd]=B_;let F_=Ha[ns]??Yd();Xd(F_,at,Gt,An,xt,fn),Ha[ns]=F_}if(_e){L++;let at=_e.user_message_count??0;V+=at,me+=(_e.duration_minutes??0)/60,Se+=_e.git_commits??0,We+=_e.git_pushes??0,rt+=_e.lines_added??0,Le+=_e.lines_removed??0,Xe+=_e.files_modified??0,be+=_e.tool_errors??0;let Gt=_e.tool_counts;if(Gt)for(let[Et,fn]of Object.entries(Gt))b[Et]=(b[Et]||0)+fn;let An=_e.languages;if(An)for(let[Et,fn]of Object.entries(An))E[Et]=(E[Et]||0)+fn;let cn=_e.message_hours;cn&&H.push(...cn);let nr=_e.tool_error_categories;if(nr)for(let[Et,fn]of Object.entries(nr))q[Et]=(q[Et]||0)+fn;let ut=_e.user_response_times;ut&&Y.push(...ut),an+=_e.user_interruptions??0,_e.uses_task_agent&&ht++,_e.uses_mcp&&jt++;let xt=_e.user_message_timestamps;xt&&xt.length>0&&ce.push({id:K.id,start:K.startedAt.toISOString(),timestamps:xt})}if(Qe)if(K.analyzedAt){tr++;let at=new Date(K.analyzedAt).getTime();($a===null||at<$a)&&($a=at),(qa===null||at>qa)&&(qa=at),at<yS&&io++}else mn++;if(Qe){j++;let at=Qe.goal_categories;if(at)for(let[ut,xt]of Object.entries(at))xt>0&&(R[ut]=(R[ut]||0)+xt);let Gt=Qe.outcome;Gt&&(O[Gt]=(O[Gt]||0)+1);let An=Qe.user_satisfaction;if(An)for(let[ut,xt]of Object.entries(An))xt>0&&(W[ut]=(W[ut]||0)+xt);let cn=Qe.session_type;cn&&(N[cn]=(N[cn]||0)+1);let nr=Qe.friction??Qe.friction_counts;if(nr)for(let[ut,xt]of Object.entries(nr))xt>0&&(U[ut]=(U[ut]||0)+xt);am.length<50&&am.push({id:K.id,externalId:K.externalSessionId,date:K.startedAt.toISOString().split("T")[0]??"",summary:Qe.brief_summary??"",goal:Qe.underlying_goal,outcome:Gt})}}let Qd=m.map(K=>K.startedAt.toISOString()).sort(),cm=new Set(Qd.map(K=>K.split("T")[0]));for(let K of $_){let _e=Number(K.inputTokens)||0,Qe=Number(K.outputTokens)||0,Ke=Number(K.cacheReadTokens)||0,at=Number(K.cacheWrite5m)||0,Gt=Number(K.cacheWrite1h)||0,An=Number(K.cacheWriteLegacy)||0,cn=at+Gt||An,nr=wS.get(K.sessionId)??new Date,ut=await I({input_tokens:_e,output_tokens:Qe,cache_read_input_tokens:Ke,cache_creation_input_tokens:cn},K.model,nr);Ce+=ut.inputUsd,St+=ut.outputUsd,le+=ut.cacheReadUsd,de+=ut.cacheWriteUsd,B+=_e,he+=Qe,P+=Ke,re+=cn;let xt=ut.inputUsd+ut.outputUsd+ut.cacheReadUsd+ut.cacheWriteUsd,Et=Ua[K.model]??Yd();Xd(Et,_e,Qe,Ke,cn,xt),Ua[K.model]=Et;let fn=vS.get(K.sessionId)??"unknown",ns=Ha[fn]??Yd();Xd(ns,_e,Qe,Ke,cn,xt),Ha[fn]=ns}let ts=c(K=>Math.round(K*100)/100,"round2"),IS=Ce+St+le+de,bS=ts(IS),ES={inputUsd:ts(Ce),outputUsd:ts(St),cacheReadUsd:ts(le),cacheWriteUsd:ts(de)},dm={};for(let[K,_e]of Object.entries(Ua))dm[K]={input_tokens:_e.input_tokens,output_tokens:_e.output_tokens,cache_read_tokens:_e.cache_read_tokens,cache_write_tokens:_e.cache_write_tokens,cost_usd:ts(_e.cost_usd)};let um={};for(let[K,_e]of Object.entries(Ha))um[K]={input_tokens:_e.input_tokens,output_tokens:_e.output_tokens,cache_read_tokens:_e.cache_read_tokens,cache_write_tokens:_e.cache_write_tokens,cost_usd:ts(_e.cost_usd)};let ao={"2-10s":0,"10-30s":0,"30s-1m":0,"1-2m":0,"2-5m":0,"5-15m":0,">15m":0};for(let K of Y)K<10?ao["2-10s"]++:K<30?ao["10-30s"]++:K<60?ao["30s-1m"]++:K<120?ao["1-2m"]++:K<300?ao["2-5m"]++:K<900?ao["5-15m"]++:ao[">15m"]++;let Ys=[...Y].sort((K,_e)=>K-_e),AS=Ys.length>0?Ys[Math.floor(Ys.length/2)]:0,SS=Ys.length>0?Ys.reduce((K,_e)=>K+_e,0)/Ys.length:0,q_=0,U_=0;if(ce.length>1){let K=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<K.length-1;Qe++){let Ke=K[Qe],at=K[Qe+1];Ke.sessionId!==at.sessionId&&at.time-Ke.time<1800*1e3&&(_e.add(Ke.sessionId),_e.add(at.sessionId),q_++)}U_=_e.size}let Xs={computed:!0,total_sessions:m.length,window:{since:o??null,until:s??null},truncated:m.length>=g,sessions_with_meta:L,sessions_with_analysis:j,tools_used:A,date_range:{start:Qd[0]?.split("T")[0]??"",end:Qd[Qd.length-1]?.split("T")[0]??""},total_messages:V,total_duration_hours:Math.round(me*10)/10,total_input_tokens:B,total_output_tokens:he,total_cache_read_tokens:P,total_cache_write_tokens:re,estimated_cost_usd:bS,estimated_cost_breakdown:ES,estimated_cost_by_model:Object.keys(dm).length>0?dm:void 0,estimated_cost_by_tool:Object.keys(um).length>0?um:void 0,tool_counts:b,languages:E,git_commits:Se,git_pushes:We,projects:S,goal_categories:R,outcomes:O,satisfaction:W,session_types:N,friction:U,tool_error_categories:q,session_summaries:am,total_tool_errors:be,total_interruptions:an,total_lines_added:rt,total_lines_removed:Le,total_files_modified:Xe,days_active:cm.size,messages_per_day:cm.size>0?Math.round(V/cm.size*10)/10:0,message_hours:H,sessions_using_task_agent:ht,sessions_using_mcp:jt,response_time:{median_seconds:Math.round(AS*10)/10,avg_seconds:Math.round(SS*10)/10,histogram:ao,total_samples:Y.length},parallel_sessions:{events:q_,sessions_involved:U_},analysis_freshness:{with_timestamp:tr,pre_instrumentation:mn,stale_30d:io,oldest_analyzed_at:$a?new Date($a).toISOString():null,newest_analyzed_at:qa?new Date(qa).toISOString():null}};Xs.autoAddAvailable=!!(n&&wL.existsSync(vL.join(n,"CLAUDE.md")));let Zd=[qo(z.userId,t),qo(z.status,"completed")];r?Zd.push(qo(z.projectId,r)):n?Zd.push(tE(z.projectPath,`%${ct(n)}%`)):Zd.push(ha`${z.projectPath} IS NULL`);let[H_]=await Fe.select({id:z.id,result:z.result}).from(z).where(Ph(...Zd)).orderBy(Dh(z.completedAt)).limit(1),xS=H_?.result,lm=$f(xS?.recommendations);if(lm&&Object.keys(lm).length>0)Xs.recommendations=lm,Xs._recsJobId=H_?.id??null;else if(m.length>=3){let K=AL({totalSessions:m.length,sessionsWithAnalysis:j,toolCounts:b,toolErrorCategories:q,friction:U,outcomes:O,sessionsUsingMcp:jt,sessionsUsingTaskAgent:ht,totalToolErrors:be,totalMessages:V,totalDurationHours:me});K&&(Xs.recommendations=K)}return Ap.size>1e3&&Ap.clear(),Ap.set(a,{at:Date.now(),data:Xs}),Xs}),{_recsJobId:f,..._}=p;if(_.recommendations)try{_.recommendations=await Y0({userId:t,projectPath:n,jobId:f??null,recs:_.recommendations})}catch{}return e.json(_)});Ad.get("/insights/recommendations/history",async e=>{let t=e.get("userId"),n=e.req.query("projectPath")??"",r=await u.select({category:Te.category,label:Te.label,timesGenerated:Te.timesGenerated,dismissedAt:Te.dismissedAt,lastSeenAt:Te.lastSeenAt}).from(Te).where(Ph(qo(Te.userId,t),qo(Te.projectPath,n))).orderBy(ha`${Te.dismissedAt} IS NULL`,Dh(Te.timesGenerated)).limit(40);return e.json({dismissed:r.filter(o=>o.dismissedAt!==null&&o.label!=="").map(o=>({category:o.category,label:o.label,dismissedAt:o.dismissedAt})),repeated:r.filter(o=>o.dismissedAt===null&&o.timesGenerated>=2&&o.label!=="").map(o=>({category:o.category,label:o.label,timesGenerated:o.timesGenerated}))})});Ad.post("/insights/recommendations/dismiss",async e=>{let t=e.get("userId"),n=await e.req.json().catch(()=>({})),r=typeof n.contentHash=="string"?n.contentHash:"";if(!/^[0-9a-f]{64}$/.test(r))return e.json({error:"contentHash must be the 64-hex entry id from the compute response"},400);let o=typeof n.projectPath=="string"?n.projectPath:void 0;return await X0({userId:t,projectPath:o,contentHash:r}),e.json({ok:!0})});D();import{Hono as TL}from"hono";import{and as Ln,count as RL,eq as Oe,ilike as kL,inArray as NL,sql as In}from"drizzle-orm";ws();var Hs=new TL,Us=c(e=>ys(e?.outcome??null),"scoreOf");Hs.get("/insights/linked-instructions",async e=>{let t=e.get("userId"),n=e.req.query("projectPath"),r=Number(e.req.query("limit")??20),o=[Oe(y.userId,t)];n&&o.push(kL(y.projectPath,`%${ct(n)}%`));let s=await u.select({id:h.id,name:h.name,contentHash:h.contentHash,source:In`${h.frontmatter}->>'source'`,linkedSessions:In`COUNT(DISTINCT ${se.sessionId})`}).from(se).innerJoin(y,Oe(y.id,se.sessionId)).innerJoin(h,Oe(h.id,se.instructionId)).where(Ln(...o)).groupBy(h.id,h.name,h.contentHash,In`${h.frontmatter}->>'source'`).orderBy(In`COUNT(DISTINCT ${se.sessionId}) DESC`).limit(r);return e.json(s.map(i=>({id:i.id,name:i.name,contentHash:i.contentHash,source:i.source,linkedSessions:Number(i.linkedSessions)})))});Hs.get("/insights/instruction-impact",async e=>{let t=e.get("userId"),n=e.req.query("instructionId");if(!n)return e.json({error:"instructionId query param required"},400);let r=await 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(Ln(Oe(y.userId,t),Oe(ne.treatmentType,"instruction"),Oe(ne.treatmentId,n))),o=r.map(P=>P.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(Ln(Oe(y.userId,t),In`${y.analysis} IS NOT NULL`)),i=await u.selectDistinct({sessionId:ne.sessionId}).from(ne).where(Ln(Oe(ne.userId,t),Oe(ne.treatmentType,"instruction"))),a=new Set(i.map(P=>P.sessionId)),d=new Set(o),l=s.filter(P=>!d.has(P.id)&&a.has(P.id));function p(P){let re=0,Ce=0,St=0,le=0,de=[],Se={},We={achieved:1,fully_achieved:1,mostly_achieved:.75,partially_achieved:.5,unclear_from_transcript:.25,not_achieved:0,abandoned:0};for(let rt of P){let Le=rt.analysis,Xe=rt.metadata?.local_session_meta;if(Le?.outcome){let an=We[Le.outcome];an!==void 0&&de.push(an)}Xe&&(le++,re+=Xe.tool_errors??0,Ce+=Xe.duration_minutes??0,St+=(Xe.lines_added??0)+(Xe.lines_removed??0));let be=Le?.goal_categories??{};for(let[an,L]of Object.entries(be))L>0&&(Se[an]=(Se[an]||0)+L)}return{sessionCount:P.length,enrichedCount:le,outcomeScores: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 f=p(r),_=p(l),v=c(P=>{if(!P)return"(no-date)";let re=typeof P=="string"?new Date(P):P;return Number.isNaN(re.getTime())?"(no-date)":`${re.getUTCFullYear()}-${String(re.getUTCMonth()+1).padStart(2,"0")}`},"monthKey"),g=c(P=>{if(!P)return 0;let re=typeof P=="string"?new Date(P):P;return Number.isNaN(re.getTime())?0:re.getTime()},"timeOf"),m=new Map,w=c((P,re,Ce,St)=>{let le=`${P??"(no-project)"}|${v(re)}`,de=m.get(le);de||(de={key:le,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},m.set(le,de)),(St?de.withScores:de.withoutScores).push(Ce),(St?de.withTimes:de.withoutTimes).push(g(re))},"addToStratum");for(let P of r){let re=Us(P.analysis);re!=null&&w(P.projectId,P.startedAt,re,!0)}for(let P of l){let re=Us(P.analysis);re!=null&&w(P.projectId,P.startedAt,re,!1)}let I=c(P=>{let re=new Map,Ce=new Set,St=c((le,de,Se,We,rt)=>{let Le=re.get(le);Le||(Le=new Map,re.set(le,Le));let Xe=`${de??"(no-project)"}|${v(Se)}`,be=Le.get(Xe);be||(be={key:Xe,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},Le.set(Xe,be)),(rt?be.withScores:be.withoutScores).push(We),(rt?be.withTimes:be.withoutTimes).push(g(Se))},"add");for(let le of r){let de=Us(le.analysis),Se=P(le);de==null||!Se||(Ce.add(Se),St(Se,le.projectId,le.startedAt,de,!0))}for(let le of l){let de=Us(le.analysis),Se=P(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(P=>[...P].sort((re,Ce)=>Number(Ce.verdict.sufficient)-Number(re.verdict.sufficient)||Ce.verdict.nWith-re.verdict.nWith),"sortSegs"),A=ag([...m.values()],I(P=>Ss(P.model))),E=A.overall,S=b(A.segments).map(P=>({model:P.segment,verdict:P.verdict})),R=b(ll(I(P=>P.tool??null))).map(P=>({harness:P.segment,verdict:P.verdict})),{outcomeScores:O,...W}=f,{outcomeScores:N,...U}=_,[q]=await u.select({name:h.name}).from(h).where(Oe(h.id,n)).limit(1),[H]=await u.select({n:RL(),lastAssignedAt:In`max(${Lt.assignedAt})`}).from(Lt).where(Ln(Oe(Lt.userId,t),Oe(Lt.treatmentType,"instruction"),Oe(Lt.treatmentId,n),Oe(Lt.method,"auto_added"))),Y=H&&Number(H.n)>0?{count:Number(H.n),lastAssignedAt:H.lastAssignedAt}:null,[ce]=await u.select({content:h.content,name:h.name}).from(h).where(Oe(h.id,n)),V=Kr(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(Ln(Oe(Z.userId,t),Oe(Z.instructionId,n),Oe(Z.contentHash,V)))).map(P=>({projectPath:P.projectPath,decision:P.decision,delta:Number(P.delta),ciLower:Number(P.ciLower),ciUpper:Number(P.ciUpper),nTreated:P.nTreated,nControl:P.nControl,segment:P.segment,decidedAt:P.decidedAt})):[],B=await u.select({id:$.id,projectPath:$.projectPath,source:$.source,status:$.status}).from($).where(Ln(Oe($.userId,t),Oe($.instructionId,n),Oe($.status,"running"))),he=me.length>0||B.length>0?{verdicts:me,experiments:B}:null;return e.json({instructionId:n,instructionName:q?.name??"Unknown",verdict:E,segments:S,harnessSegments:R,autoAdded:Y,randomised:he,with:W,without:U,comparison:{outcomeScoreDelta:f.avgOutcomeScore!=null&&_.avgOutcomeScore!=null?Math.round((f.avgOutcomeScore-_.avgOutcomeScore)*100)/100:null,toolErrorsDelta:f.avgToolErrors!=null&&_.avgToolErrors!=null?Math.round((f.avgToolErrors-_.avgToolErrors)*10)/10:null,durationDelta:f.avgDurationMinutes!=null&&_.avgDurationMinutes!=null?Math.round((f.avgDurationMinutes-_.avgDurationMinutes)*10)/10:null}})});Hs.get("/insights/instruction-version-impact",async e=>{let t=e.get("userId"),n=e.req.query("instructionId");if(!n)return e.json({error:"instructionId query param required"},400);let r=await u.select({versionOrdinal:yr.versionOrdinal,contentHash:yr.contentHash,firstSeenAt:yr.firstSeenAt,contentLength:In`COALESCE(LENGTH(${yr.content}), 0)::int`}).from(yr).where(Oe(yr.instructionId,n)).orderBy(yr.versionOrdinal),o=await 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(Ln(Oe(y.userId,t),Oe(ne.treatmentType,"instruction"),Oe(ne.treatmentId,n),In`${ne.treatmentVersion} > 0`)),s=new Map;for(let b of o){let A=s.get(b.version)??[];A.push(b),s.set(b.version,A)}let i=r.map(b=>({version:b.versionOrdinal,contentHash:b.contentHash,firstSeenAt:b.firstSeenAt,sessions:s.get(b.versionOrdinal)?.length??0,replayable:Number(b.contentLength)>0})),a=i.filter(b=>b.sessions>0).map(b=>b.version).sort((b,A)=>b-A),d=Number(e.req.query("version")),l=Number(e.req.query("baselineVersion")),p=Number.isFinite(d)&&d>0?d:a.at(-1),f=Number.isFinite(l)&&l>0?l:a.filter(b=>b!==p).at(-1);if(p==null||f==null)return e.json({instructionId:n,versions:i,version:p??null,baselineVersion:f??null,verdict:null,insufficientReason:"only one version of this instruction has attributed sessions; there is no prior version to compare against"});let _=c(b=>{if(!b)return"(no-date)";let A=typeof b=="string"?new Date(b):b;return Number.isNaN(A.getTime())?"(no-date)":`${A.getUTCFullYear()}-${String(A.getUTCMonth()+1).padStart(2,"0")}`},"monthKey"),v=c(b=>{if(!b)return 0;let A=typeof b=="string"?new Date(b):b;return Number.isNaN(A.getTime())?0:A.getTime()},"timeOf"),g=new Map,m=c((b,A)=>{let E=Us(b.analysis);if(E==null)return;let S=`${b.projectId??"(no-project)"}|${_(b.startedAt)}`,R=g.get(S);R||(R={key:S,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},g.set(S,R)),(A?R.withScores:R.withoutScores).push(E),(A?R.withTimes:R.withoutTimes).push(v(b.startedAt))},"add");for(let b of s.get(p)??[])m(b,!0);for(let b of s.get(f)??[])m(b,!1);let w=Pn([...g.values()],{baseline:"prior-version"}),[I]=await u.select({name:h.name}).from(h).where(Oe(h.id,n)).limit(1);return e.json({instructionId:n,instructionName:I?.name??"Unknown",version:p,baselineVersion:f,versions:i,verdict:w,replayableVersions:i.filter(b=>b.replayable).length})});Hs.get("/insights/memory-impact",async e=>{let t=e.get("userId"),n=e.req.query("memoryId");if(!n)return e.json({error:"memoryId query param required"},400);let[r]=await u.select({id:F.id,title:F.title,kind:F.kind,version:F.version,status:F.status}).from(F).where(Ln(Oe(F.id,n),Oe(F.userId,t))).limit(1);if(!r)return e.json({error:"memory not found"},404);let o=await u.select({sessionId:ne.sessionId,treatmentVersion:ne.treatmentVersion}).from(ne).where(Ln(Oe(ne.userId,t),Oe(ne.treatmentType,"memory"),Oe(ne.treatmentId,n))),s=new Map,i=new Set;for(let m of o){let w=s.get(m.treatmentVersion);w||(w=new Set,s.set(m.treatmentVersion,w)),w.add(m.sessionId),i.add(m.sessionId)}let a=await u.select({id:y.id,projectId:y.projectId,outcome:In`${y.analysis}->>'outcome'`,startedAt:y.startedAt,inputTokens:In`coalesce((${y.tokenUsage}->>'input_tokens')::numeric, 0)`,outputTokens:In`coalesce((${y.tokenUsage}->>'output_tokens')::numeric, 0)`}).from(y).where(Ln(Oe(y.userId,t),In`${y.analysis} is not null`)).orderBy(y.id),d=c((m,w)=>w>0?Math.round(m/w*100)/100:null,"avg"),l=c(()=>({n:0,scoreSum:0,scoreN:0,tokenSum:0}),"cohort"),p=c(m=>m.n>0?Math.round(m.tokenSum/m.n):null,"avgTokens"),f=c(m=>{let w=s.get(m)??new Set,I=new Map,b=l(),A=l();for(let W of a){let N=w.has(W.id);if(!N&&i.has(W.id))continue;let U=N?b:A;U.n++,U.tokenSum+=Number(W.inputTokens)+Number(W.outputTokens);let q=Us({outcome:W.outcome});if(q!=null){U.scoreSum+=q,U.scoreN++;let H=W.projectId??"(no-project)",Y=I.get(H);Y||(Y={key:H,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},I.set(H,Y)),(N?Y.withScores:Y.withoutScores).push(q),(N?Y.withTimes:Y.withoutTimes).push(W.startedAt?.getTime()??0)}}let E=Pn([...I.values()]),S={sessionCount:b.n,avgOutcomeScore:d(b.scoreSum,b.scoreN),avgTotalTokens:p(b)},R={sessionCount:A.n,avgOutcomeScore:d(A.scoreSum,A.scoreN),avgTotalTokens:p(A)},O={outcomeScoreDelta:S.avgOutcomeScore!=null&&R.avgOutcomeScore!=null?Math.round((S.avgOutcomeScore-R.avgOutcomeScore)*100)/100:null,totalTokensDelta:S.avgTotalTokens!=null&&R.avgTotalTokens!=null?S.avgTotalTokens-R.avgTotalTokens:null};return{verdict:E,with:S,without:R,comparison:O}},"computeVersion"),v=[...new Set([r.version,...s.keys()])].sort((m,w)=>w-m).map(m=>({version:m,isCurrent:m===r.version,...f(m)})),g=v.find(m=>m.isCurrent);return e.json({memoryId:n,memoryTitle:r.title,memoryKind:r.kind,memoryVersion:r.version,verdict:g.verdict,with:g.with,without:g.without,comparison:g.comparison,versions:v.map(({version:m,isCurrent:w,verdict:I,with:b,without:A})=>({version:m,isCurrent:w,verdict:I,with:b,without:A})),cost:{estimated:!0}})});var jL=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;Hs.get("/insights/suggestion-impact",async e=>{let t=e.get("userId"),n=e.req.query("instructionIds")??e.req.query("instructionId")??"",r=[...new Set(n.split(",").map(l=>l.trim()).filter(l=>jL.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(Ln(Oe(ne.userId,t),Oe(ne.treatmentType,"suggestion"),NL(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:In`${y.analysis}->>'outcome'`,startedAt:y.startedAt}).from(y).where(Ln(Oe(y.userId,t),In`${y.analysis} is not null`)).orderBy(y.id)).map(l=>({id:l.id,key:l.projectId??"(no-project)",score:Us({outcome:l.outcome}),time:l.startedAt?.getTime()??0})).filter(l=>l.score!=null),d={};for(let l of r){let p=s.get(l);if(!p||p.size===0){d[l]=Pn([]);continue}let f=new Map;for(let _ of a){let v=f.get(_.key);v||(v={key:_.key,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},f.set(_.key,v));let g=p.has(_.id);(g?v.withScores:v.withoutScores).push(_.score),(g?v.withTimes:v.withoutTimes).push(_.time)}d[l]=Pn([...f.values()],{iterations:2e3})}return e.json({impacts:d})});D();import{Hono as DL}from"hono";import{and as Bs,count as Ch,eq as Mn,inArray as sE,sql as Pr}from"drizzle-orm";D();import{sql as nE}from"drizzle-orm";var rE=30,Oh=14,PL=c(e=>({captureHealthy:!1,reason:e,candidates:[]}),"DARK");async function oE(e){let[t]=await u.execute(nE`
|
|
1214
1261
|
SELECT count(*)::int AS n
|
|
1215
1262
|
FROM public.skill_usage
|
|
1216
1263
|
WHERE user_id = ${e}::uuid
|
|
1217
1264
|
AND invoked_at > now() - make_interval(days => ${Oh})
|
|
1218
|
-
`);return!t||t.n===0?
|
|
1265
|
+
`);return!t||t.n===0?PL(`No skill invocations captured in ${Oh} days \u2014 cannot tell "unused" from "uncaptured". Skill grooming paused (never trust a dark pipeline).`):{captureHealthy:!0,reason:null,candidates:(await u.execute(nE`
|
|
1219
1266
|
SELECT
|
|
1220
1267
|
i.id AS instruction_id,
|
|
1221
1268
|
i.name AS name,
|
|
@@ -1247,22 +1294,22 @@ ${r}`).digest("hex")}c(G0,"recommendationEntryHash");var sL=new Set(["42883","42
|
|
|
1247
1294
|
AND i.created_at < now() - make_interval(days => ${rE})
|
|
1248
1295
|
AND coalesce(u.invocations, 0) = 0
|
|
1249
1296
|
ORDER BY i.created_at
|
|
1250
|
-
`)).map(r=>({instructionId:r.instruction_id,name:r.name,installedAt:r.installed_at,lastInvokedAt:r.last_invoked_at,invocations:r.invocations,installedByLoop:r.installed_by_loop,reason:`installed ${rE}+ days ago and never invoked \u2014 skill capture is live (other skills were invoked in the last ${Oh} days), so this is an absence of use rather than an absence of data`}))}}c(oE,"loadUnusedSkillCandidates");var Mh=new PL,Lh=/force[- ]?push|rm\s+-rf|git\s+reset\s+--hard|drop\s+table|truncate\b|--no-verify|chmod\s+777|\bsudo\b|secret|credential|password|api[- ]?key|never\s+(delete|drop|force|push|commit|run|deploy)|do\s+not\s+(delete|drop|force|push|commit|run|deploy)/i;Mh.get("/insights/groom-candidates",async e=>{let t=e.get("userId"),[n]=await d.select({n:Ch()}).from(y).where(Bs(Mn(y.userId,t),Pr`${y.startedAt} > now() - interval '7 days'`));if(Number(n?.n??0)===0)return e.json({captureHealthy:!1,reason:'No sessions captured in the last 7 days \u2014 cannot tell "unused" from "uncaptured". Grooming paused (never trust a dark pipeline).',candidates:[],harmful:[],safetyGuarded:0,harmfulSafetyGuarded:0,bloated:[],trimSafetyFlagged:0});let[r,o,s,i]=await Promise.all([d.select({id:g.id,name:g.name,type:g.type,content:g.content,lastExposedAt:Pr`max(${ne.exposedAt})`,totalExposures:Ch(ne.id)}).from(g).leftJoin(ne,Bs(Mn(ne.treatmentId,g.id),Mn(ne.userId,t))).where(Bs(Mn(g.createdBy,t),Mn(g.archived,!1),Pr`${g.createdAt} < now() - interval '30 days'`,Pr`${g.type} is distinct from 'skill'`)).groupBy(g.id).having(Pr`max(${ne.exposedAt}) is null or max(${ne.exposedAt}) < now() - interval '30 days'`),d.select({id:g.id,name:g.name,type:g.type}).from(g).where(Bs(Mn(g.createdBy,t),Mn(g.archived,!1))),d.select({treatmentId:ne.treatmentId,sessionId:ne.sessionId}).from(ne).where(Bs(Mn(ne.userId,t),Mn(ne.treatmentType,"instruction"),Pr`${ne.sessionId} is not null`)),d.select({id:y.id,projectId:y.projectId,outcome:Pr`${y.analysis}->>'outcome'`,startedAt:y.startedAt}).from(y).where(Bs(Mn(y.userId,t),Pr`${y.analysis} is not null`))]),a=await d.select({treatmentId:ne.treatmentId,projectId:y.projectId,n:Ch()}).from(ne).innerJoin(y,Mn(y.id,ne.sessionId)).where(Bs(Mn(ne.userId,t),Mn(ne.treatmentType,"instruction"),Pr`${y.projectId} is not null`)).groupBy(ne.treatmentId,y.projectId),u=new Map;for(let N of a){if(!N.projectId)continue;let q=Number(N.n),U=u.get(N.treatmentId);(!U||q>U.n||q===U.n&&N.projectId<U.projectId)&&u.set(N.treatmentId,{projectId:N.projectId,n:q})}let l=c(N=>u.get(N)?.projectId??null,"topProjectId"),m=r.filter(N=>!(N.content&&Lh.test(N.content))),f=r.length-m.length,_=m.map(N=>({id:N.id,name:N.name,type:N.type,reason:Number(N.totalExposures)===0?"never used":"not used in 30+ days",lastExposedAt:N.lastExposedAt,totalExposures:Number(N.totalExposures),topProjectId:l(N.id)})).sort((N,q)=>N.totalExposures-q.totalExposures).slice(0,50),v=new Map;for(let N of i){let q=N.outcome!=null?Si[N.outcome]:void 0;q!==void 0&&v.set(N.id,{projectId:N.projectId,score:q,time:N.startedAt?.getTime()??0})}let h=new Map;for(let N of s){if(!N.sessionId)continue;let q=h.get(N.treatmentId);q||(q=new Set,h.set(N.treatmentId,q)),q.add(N.sessionId)}let p=[],w=[];for(let N of o){let q=h.get(N.id);if(!q)continue;let U=0;for(let K of q)v.has(K)&&U++;if(U<10)continue;let H=new Map;for(let[K,{projectId:pe,score:B,time:he}]of v){let P=pe??"(no-project)",re=H.get(P);re||(re={key:P,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},H.set(P,re));let Ce=q.has(K);(Ce?re.withScores:re.withoutScores).push(B),(Ce?re.withTimes:re.withoutTimes).push(he)}let te=Pn([...H.values()]),de=_s(te);de==="harmful"?p.push({id:N.id,name:N.name,type:N.type,verdict:te,exposures:te.nWith,topProjectId:l(N.id)}):de==="neutral"&&w.push({id:N.id,name:N.name,type:N.type,verdict:te,exposures:te.nWith,topProjectId:l(N.id)})}let I=0,b=p;if(p.length>0){let N=await d.select({id:g.id,content:g.content}).from(g).where(sE(g.id,p.map(U=>U.id))),q=new Map(N.map(U=>[U.id,U.content]));b=p.filter(U=>{let H=q.get(U.id);return H&&Lh.test(H)?(I++,!1):!0})}b.sort((N,q)=>N.verdict.delta-q.verdict.delta);let A=1500,E=[],S=0;if(w.length>0){let N=await d.select({id:g.id,estimatedTokens:Pr`(length(${g.content}) / 4)::int`,content:g.content}).from(g).where(sE(g.id,w.map(U=>U.id))),q=new Map(N.map(U=>[U.id,U]));for(let U of w){let H=q.get(U.id),te=Number(H?.estimatedTokens??0);if(te<A)continue;let de=!!(H?.content&&Lh.test(H.content));de&&S++,E.push({...U,estimatedTokens:te,containsSafetyLanguage:de})}E.sort((U,H)=>H.estimatedTokens-U.estimatedTokens),E=E.slice(0,20)}let T=new Set(b.map(N=>N.id)),O=_.filter(N=>!T.has(N.id)),W=await oE(t);return e.json({captureHealthy:!0,candidates:O,safetyGuarded:f,harmful:b,harmfulSafetyGuarded:I,bloated:E,trimSafetyFlagged:S,unusedSkills:W.candidates,skillCaptureHealthy:W.captureHealthy,skillCaptureReason:W.reason})});D();import{Hono as DL}from"hono";import{z as _a}from"zod";import{and as pr,desc as iE,eq as wt,getTableColumns as OL,gte as $h,ilike as Sm,isNull as CL,ne as LL,or as ML,sql as ya}from"drizzle-orm";var Uo=new DL;function $L(e,t){let n=t?Sm(z.projectPath,`%${ct(t)}%`):void 0;return e&&n?ML(wt(z.projectId,e),pr(CL(z.projectId),n)):e?wt(z.projectId,e):n}c($L,"insightsJobProjectScope");Uo.post("/insights-jobs",async e=>{let t=e.get("userId"),n=await e.req.json().catch(()=>({})),r=n.dedup,o=n.projectPath??null,s=await Bn(o);if(r==="daily"){let m=new Date;m.setHours(0,0,0,0);let f=o,_=[wt(z.userId,t),$h(z.createdAt,m)];s?_.push(wt(z.projectId,s)):f?_.push(Sm(z.projectPath,`%${ct(f)}%`)):_.push(ya`${z.projectPath} IS NULL`);let[v]=await d.select({id:z.id}).from(z).where(pr(..._)).limit(1);if(v)return e.json({skipped:!0,reason:"already_generated_today",existingJobId:v.id},200);let h=[wt(z.userId,t),wt(z.status,"completed")];s?h.push(wt(z.projectId,s)):f?h.push(Sm(z.projectPath,`%${ct(f)}%`)):h.push(ya`${z.projectPath} IS NULL`);let[p]=await d.select({completedAt:z.completedAt}).from(z).where(pr(...h)).orderBy(iE(z.completedAt)).limit(1),w=p?.completedAt??new Date(0),I=[wt(y.userId,t),$h(y.startedAt,w)];s?I.push(wt(y.projectId,s)):f&&I.push(Sm(y.projectPath,`%${ct(f)}%`));let[{count:b}]=await d.select({count:ya`COUNT(*)`}).from(y).where(pr(...I));if(Number(b)<5)return e.json({skipped:!0,reason:"insufficient_sessions",sessionsSinceLastRun:Number(b),threshold:5},200)}let i=await Ol(s,o),{id:a,noLiveWorker:u}=await Ot({taskName:"process_insights",payload:{projectPath:i,projectId:s},userId:t,mirror:{userId:t,projectPath:i,projectId:s}}),[l]=await d.select().from(z).where(wt(z.id,a));return e.json({...l,noLiveWorker:u},201)});Uo.get("/insights-jobs",async e=>{let t=e.get("userId"),n=Number(e.req.query("limit")??10),r=e.req.query("projectPath"),o=e.req.query("projectId")??await Bn(r??null),s=[wt(z.userId,t)],i=$L(o,r??null);i&&s.push(i);let{result:a,...u}=OL(z),l=await d.select(u).from(z).where(pr(...s)).orderBy(iE(z.createdAt)).limit(n);return e.json(l)});Uo.get("/insights-jobs/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select().from(z).where(pr(wt(z.id,n),wt(z.userId,t)));return r?e.json(r):e.json({error:"Job not found"},404)});Uo.patch("/insights-jobs/:id/progress",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),s=["running","paused"].includes(r.status)?r.status:"running",[i]=await d.update(z).set({status:s,progress:r.progress,updatedAt:new Date}).where(pr(wt(z.id,n),wt(z.userId,t))).returning();return i?e.json(i):e.json({error:"Job not found"},404)});var qL=_a.object({status:_a.enum(["running","completed","failed"]).optional(),attempts:_a.number().int().nonnegative().optional(),error:_a.string().optional(),result:_a.record(_a.unknown()).optional()});Uo.patch("/insights-jobs/:id/state",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=qL.parse(await e.req.json()),o={updatedAt:new Date};r.attempts!==void 0&&(o.attempts=r.attempts),r.status&&(o.status=r.status),r.error&&(o.error=r.error),r.result!==void 0&&(o.result=r.result),(r.status==="completed"||r.status==="failed")&&(o.completedAt=new Date);let[s]=await d.update(z).set(o).where(pr(wt(z.id,n),wt(z.userId,t),LL(z.status,"cancelled"))).returning();if(!s){let[i]=await d.select().from(z).where(pr(wt(z.id,n),wt(z.userId,t)));return i?e.json(i):e.json({error:"Job not found"},404)}return e.json(s)});var UL=14400*1e3;Uo.post("/insights-jobs/regenerate-all",async e=>{let t=e.get("userId"),n=await e.req.json().catch(()=>({})),r=Number(n.minSessions??3),o=n.force===!0,s=new Date(Date.now()-UL),i=await d.select({projectId:y.projectId,sessionCount:ya`COUNT(*)`}).from(y).where(pr(wt(y.userId,t),ya`${y.projectId} IS NOT NULL`)).groupBy(y.projectId).orderBy(ya`COUNT(*) DESC`),a=i.map(v=>v.projectId).filter(v=>!!v),u=new Map;if(a.length>0){let v=await d.execute(Fi(a));for(let h of v)u.set(h.project_id,h.path)}let l=[],m=[],f=[],_=!1;for(let v of i){if(Number(v.sessionCount)<r||!v.projectId)continue;let h=u.get(v.projectId);if(!h){m.push({projectPath:"<unknown>",reason:"no_checkout"});continue}try{if(!o){let[b]=await d.select({id:z.id}).from(z).where(pr(wt(z.userId,t),wt(z.status,"completed"),wt(z.projectPath,h),$h(z.completedAt,s))).limit(1);if(b){m.push({projectPath:h,reason:"fresh"});continue}}let{id:p,noLiveWorker:w}=await Ot({taskName:"process_insights",payload:{projectPath:h},userId:t,mirror:{userId:t,projectPath:h}});w&&(_=!0);let[I]=await d.select().from(z).where(wt(z.id,p));I&&l.push(I)}catch(p){let w=p instanceof Error?p.message:String(p);f.push({projectPath:h,error:w})}}return e.json({created:l.length,jobs:l,skipped:m,errors:f,noLiveWorker:_},201)});D();import xm from"node:fs";import HL from"node:path";import{createHash as BL}from"node:crypto";import{Hono as FL}from"hono";import{and as aE,desc as WL,eq as Au}from"drizzle-orm";var qh=new FL;async function zL(e,t,n){try{let r=`${Kd.claude_md}::${n}`,[o]=await d.select({id:g.id,version:g.version}).from(g).where(aE(Au(g.contextIdentity,r),Au(g.createdBy,e),Au(g.archived,!1))).orderBy(WL(g.createdAt)).limit(1);if(!o){let a=xm.readFileSync(n,"utf-8"),u=BL("sha256").update(a).digest("hex"),l={name:n,description:"Project CLAUDE.md",type:"context_file",scope:"personal",version:"1.0.0"},[m]=await d.insert(g).values({name:n,description:"Project CLAUDE.md",type:"context_file",scope:"personal",scopeRef:e,version:"1.0.0",content:a,frontmatter:l,contentHash:u,contextIdentity:r,createdBy:e}).onConflictDoNothing().returning({id:g.id,version:g.version});o=m}if(!o)return null;let s=await Bn(t),[i]=await d.insert(Lt).values({userId:e,treatmentType:"instruction",treatmentId:o.id,projectId:s??void 0,assignedBy:e,method:"auto_added"}).returning({id:Lt.id});return i?.id??null}catch(r){return console.warn("[auto-add] failed to record treatment_assignment:",r instanceof Error?r.message:r),null}}c(zL,"recordAutoAddAssignment");qh.post("/insights/auto-add",async e=>{let t=e.get("userId"),n=await e.req.json(),{projectPath:r,addition:o}=n;if(!r||!o)return e.json({error:"projectPath and addition are required"},400);let[s]=await d.select({id:y.id}).from(y).where(aE(Au(y.userId,t),Au(y.projectPath,r))).limit(1);if(!s)return e.json({error:"projectPath is not a known project for this user"},403);let i=HL.join(r,"CLAUDE.md");if(!xm.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=xm.readFileSync(i,"utf-8");if(a.includes(o.trim()))return e.json({success:!1,reason:"already_present"},200);let u=a.endsWith(`
|
|
1297
|
+
`)).map(r=>({instructionId:r.instruction_id,name:r.name,installedAt:r.installed_at,lastInvokedAt:r.last_invoked_at,invocations:r.invocations,installedByLoop:r.installed_by_loop,reason:`installed ${rE}+ days ago and never invoked \u2014 skill capture is live (other skills were invoked in the last ${Oh} days), so this is an absence of use rather than an absence of data`}))}}c(oE,"loadUnusedSkillCandidates");var Mh=new DL,Lh=/force[- ]?push|rm\s+-rf|git\s+reset\s+--hard|drop\s+table|truncate\b|--no-verify|chmod\s+777|\bsudo\b|secret|credential|password|api[- ]?key|never\s+(delete|drop|force|push|commit|run|deploy)|do\s+not\s+(delete|drop|force|push|commit|run|deploy)/i;Mh.get("/insights/groom-candidates",async e=>{let t=e.get("userId"),[n]=await u.select({n:Ch()}).from(y).where(Bs(Mn(y.userId,t),Pr`${y.startedAt} > now() - interval '7 days'`));if(Number(n?.n??0)===0)return e.json({captureHealthy:!1,reason:'No sessions captured in the last 7 days \u2014 cannot tell "unused" from "uncaptured". Grooming paused (never trust a dark pipeline).',candidates:[],harmful:[],safetyGuarded:0,harmfulSafetyGuarded:0,bloated:[],trimSafetyFlagged:0});let[r,o,s,i]=await Promise.all([u.select({id:h.id,name:h.name,type:h.type,content:h.content,lastExposedAt:Pr`max(${ne.exposedAt})`,totalExposures:Ch(ne.id)}).from(h).leftJoin(ne,Bs(Mn(ne.treatmentId,h.id),Mn(ne.userId,t))).where(Bs(Mn(h.createdBy,t),Mn(h.archived,!1),Pr`${h.createdAt} < now() - interval '30 days'`,Pr`${h.type} is distinct from 'skill'`)).groupBy(h.id).having(Pr`max(${ne.exposedAt}) is null or max(${ne.exposedAt}) < now() - interval '30 days'`),u.select({id:h.id,name:h.name,type:h.type}).from(h).where(Bs(Mn(h.createdBy,t),Mn(h.archived,!1))),u.select({treatmentId:ne.treatmentId,sessionId:ne.sessionId}).from(ne).where(Bs(Mn(ne.userId,t),Mn(ne.treatmentType,"instruction"),Pr`${ne.sessionId} is not null`)),u.select({id:y.id,projectId:y.projectId,outcome:Pr`${y.analysis}->>'outcome'`,startedAt:y.startedAt}).from(y).where(Bs(Mn(y.userId,t),Pr`${y.analysis} is not null`))]),a=await u.select({treatmentId:ne.treatmentId,projectId:y.projectId,n:Ch()}).from(ne).innerJoin(y,Mn(y.id,ne.sessionId)).where(Bs(Mn(ne.userId,t),Mn(ne.treatmentType,"instruction"),Pr`${y.projectId} is not null`)).groupBy(ne.treatmentId,y.projectId),d=new Map;for(let N of a){if(!N.projectId)continue;let U=Number(N.n),q=d.get(N.treatmentId);(!q||U>q.n||U===q.n&&N.projectId<q.projectId)&&d.set(N.treatmentId,{projectId:N.projectId,n:U})}let l=c(N=>d.get(N)?.projectId??null,"topProjectId"),p=r.filter(N=>!(N.content&&Lh.test(N.content))),f=r.length-p.length,_=p.map(N=>({id:N.id,name:N.name,type:N.type,reason:Number(N.totalExposures)===0?"never used":"not used in 30+ days",lastExposedAt:N.lastExposedAt,totalExposures:Number(N.totalExposures),topProjectId:l(N.id)})).sort((N,U)=>N.totalExposures-U.totalExposures).slice(0,50),v=new Map;for(let N of i){let U=N.outcome!=null?Si[N.outcome]:void 0;U!==void 0&&v.set(N.id,{projectId:N.projectId,score:U,time:N.startedAt?.getTime()??0})}let g=new Map;for(let N of s){if(!N.sessionId)continue;let U=g.get(N.treatmentId);U||(U=new Set,g.set(N.treatmentId,U)),U.add(N.sessionId)}let m=[],w=[];for(let N of o){let U=g.get(N.id);if(!U)continue;let q=0;for(let V of U)v.has(V)&&q++;if(q<10)continue;let H=new Map;for(let[V,{projectId:me,score:B,time:he}]of v){let P=me??"(no-project)",re=H.get(P);re||(re={key:P,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},H.set(P,re));let Ce=U.has(V);(Ce?re.withScores:re.withoutScores).push(B),(Ce?re.withTimes:re.withoutTimes).push(he)}let Y=Pn([...H.values()]),ce=_s(Y);ce==="harmful"?m.push({id:N.id,name:N.name,type:N.type,verdict:Y,exposures:Y.nWith,topProjectId:l(N.id)}):ce==="neutral"&&w.push({id:N.id,name:N.name,type:N.type,verdict:Y,exposures:Y.nWith,topProjectId:l(N.id)})}let I=0,b=m;if(m.length>0){let N=await u.select({id:h.id,content:h.content}).from(h).where(sE(h.id,m.map(q=>q.id))),U=new Map(N.map(q=>[q.id,q.content]));b=m.filter(q=>{let H=U.get(q.id);return H&&Lh.test(H)?(I++,!1):!0})}b.sort((N,U)=>N.verdict.delta-U.verdict.delta);let A=1500,E=[],S=0;if(w.length>0){let N=await u.select({id:h.id,estimatedTokens:Pr`(length(${h.content}) / 4)::int`,content:h.content}).from(h).where(sE(h.id,w.map(q=>q.id))),U=new Map(N.map(q=>[q.id,q]));for(let q of w){let H=U.get(q.id),Y=Number(H?.estimatedTokens??0);if(Y<A)continue;let ce=!!(H?.content&&Lh.test(H.content));ce&&S++,E.push({...q,estimatedTokens:Y,containsSafetyLanguage:ce})}E.sort((q,H)=>H.estimatedTokens-q.estimatedTokens),E=E.slice(0,20)}let R=new Set(b.map(N=>N.id)),O=_.filter(N=>!R.has(N.id)),W=await oE(t);return e.json({captureHealthy:!0,candidates:O,safetyGuarded:f,harmful:b,harmfulSafetyGuarded:I,bloated:E,trimSafetyFlagged:S,unusedSkills:W.candidates,skillCaptureHealthy:W.captureHealthy,skillCaptureReason:W.reason})});D();import{Hono as OL}from"hono";import{z as _a}from"zod";import{and as mr,desc as iE,eq as wt,getTableColumns as CL,gte as $h,ilike as Sp,isNull as LL,ne as ML,or as $L,sql as ya}from"drizzle-orm";var Uo=new OL;function qL(e,t){let n=t?Sp(z.projectPath,`%${ct(t)}%`):void 0;return e&&n?$L(wt(z.projectId,e),mr(LL(z.projectId),n)):e?wt(z.projectId,e):n}c(qL,"insightsJobProjectScope");Uo.post("/insights-jobs",async e=>{let t=e.get("userId"),n=await e.req.json().catch(()=>({})),r=n.dedup,o=n.projectPath??null,s=await Bn(o);if(r==="daily"){let p=new Date;p.setHours(0,0,0,0);let f=o,_=[wt(z.userId,t),$h(z.createdAt,p)];s?_.push(wt(z.projectId,s)):f?_.push(Sp(z.projectPath,`%${ct(f)}%`)):_.push(ya`${z.projectPath} IS NULL`);let[v]=await u.select({id:z.id}).from(z).where(mr(..._)).limit(1);if(v)return e.json({skipped:!0,reason:"already_generated_today",existingJobId:v.id},200);let g=[wt(z.userId,t),wt(z.status,"completed")];s?g.push(wt(z.projectId,s)):f?g.push(Sp(z.projectPath,`%${ct(f)}%`)):g.push(ya`${z.projectPath} IS NULL`);let[m]=await u.select({completedAt:z.completedAt}).from(z).where(mr(...g)).orderBy(iE(z.completedAt)).limit(1),w=m?.completedAt??new Date(0),I=[wt(y.userId,t),$h(y.startedAt,w)];s?I.push(wt(y.projectId,s)):f&&I.push(Sp(y.projectPath,`%${ct(f)}%`));let[{count:b}]=await u.select({count:ya`COUNT(*)`}).from(y).where(mr(...I));if(Number(b)<5)return e.json({skipped:!0,reason:"insufficient_sessions",sessionsSinceLastRun:Number(b),threshold:5},200)}let i=await Ol(s,o),{id:a,noLiveWorker:d}=await Ot({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)});Uo.get("/insights-jobs",async e=>{let t=e.get("userId"),n=Number(e.req.query("limit")??10),r=e.req.query("projectPath"),o=e.req.query("projectId")??await Bn(r??null),s=[wt(z.userId,t)],i=qL(o,r??null);i&&s.push(i);let{result:a,...d}=CL(z),l=await u.select(d).from(z).where(mr(...s)).orderBy(iE(z.createdAt)).limit(n);return e.json(l)});Uo.get("/insights-jobs/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await 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)});Uo.patch("/insights-jobs/:id/progress",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),s=["running","paused"].includes(r.status)?r.status:"running",[i]=await 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 UL=_a.object({status:_a.enum(["running","completed","failed"]).optional(),attempts:_a.number().int().nonnegative().optional(),error:_a.string().optional(),result:_a.record(_a.unknown()).optional()});Uo.patch("/insights-jobs/:id/state",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=UL.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),ML(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 HL=14400*1e3;Uo.post("/insights-jobs/regenerate-all",async e=>{let t=e.get("userId"),n=await e.req.json().catch(()=>({})),r=Number(n.minSessions??3),o=n.force===!0,s=new Date(Date.now()-HL),i=await u.select({projectId:y.projectId,sessionCount:ya`COUNT(*)`}).from(y).where(mr(wt(y.userId,t),ya`${y.projectId} IS NOT NULL`)).groupBy(y.projectId).orderBy(ya`COUNT(*) DESC`),a=i.map(v=>v.projectId).filter(v=>!!v),d=new Map;if(a.length>0){let v=await u.execute(Fi(a));for(let g of v)d.set(g.project_id,g.path)}let l=[],p=[],f=[],_=!1;for(let v of i){if(Number(v.sessionCount)<r||!v.projectId)continue;let g=d.get(v.projectId);if(!g){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,g),$h(z.completedAt,s))).limit(1);if(b){p.push({projectPath:g,reason:"fresh"});continue}}let{id:m,noLiveWorker:w}=await Ot({taskName:"process_insights",payload:{projectPath:g},userId:t,mirror:{userId:t,projectPath:g}});w&&(_=!0);let[I]=await u.select().from(z).where(wt(z.id,m));I&&l.push(I)}catch(m){let w=m instanceof Error?m.message:String(m);f.push({projectPath:g,error:w})}}return e.json({created:l.length,jobs:l,skipped:p,errors:f,noLiveWorker:_},201)});D();import xp from"node:fs";import BL from"node:path";import{createHash as FL}from"node:crypto";import{Hono as WL}from"hono";import{and as aE,desc as zL,eq as Sd}from"drizzle-orm";var qh=new WL;async function VL(e,t,n){try{let r=`${Gu.claude_md}::${n}`,[o]=await u.select({id:h.id,version:h.version}).from(h).where(aE(Sd(h.contextIdentity,r),Sd(h.createdBy,e),Sd(h.archived,!1))).orderBy(zL(h.createdAt)).limit(1);if(!o){let a=xp.readFileSync(n,"utf-8"),d=FL("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(h).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:h.id,version:h.version});o=p}if(!o)return null;let s=await Bn(t),[i]=await u.insert(Lt).values({userId:e,treatmentType:"instruction",treatmentId:o.id,projectId:s??void 0,assignedBy:e,method:"auto_added"}).returning({id:Lt.id});return i?.id??null}catch(r){return console.warn("[auto-add] failed to record treatment_assignment:",r instanceof Error?r.message:r),null}}c(VL,"recordAutoAddAssignment");qh.post("/insights/auto-add",async e=>{let t=e.get("userId"),n=await e.req.json(),{projectPath:r,addition:o}=n;if(!r||!o)return e.json({error:"projectPath and addition are required"},400);let[s]=await u.select({id:y.id}).from(y).where(aE(Sd(y.userId,t),Sd(y.projectPath,r))).limit(1);if(!s)return e.json({error:"projectPath is not a known project for this user"},403);let i=BL.join(r,"CLAUDE.md");if(!xp.existsSync(i))return e.json({error:`CLAUDE.md not found at ${i} on the API host \u2014 auto-add only works when the API runs on the same machine as the project (local mode)`,code:"not_local_mode"},501);try{let a=xp.readFileSync(i,"utf-8");if(a.includes(o.trim()))return e.json({success:!1,reason:"already_present"},200);let d=a.endsWith(`
|
|
1251
1298
|
`)?`
|
|
1252
1299
|
`:`
|
|
1253
1300
|
|
|
1254
|
-
`;
|
|
1255
|
-
`);let l=await
|
|
1301
|
+
`;xp.writeFileSync(i,a+d+o.trim()+`
|
|
1302
|
+
`);let l=await VL(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 YL}from"hono";import{z as ke}from"zod";D();import{createHash as JL}from"node:crypto";import{and as Uh,eq as Ho,inArray as KL,sql as xd}from"drizzle-orm";function cE(e){let t=e.toLowerCase();return t.includes("hook")?"hook":t.includes("mcp")?"mcp":t.includes("subagent")||t.includes("sub-agent")||t.includes("agent")?"subagent":t.includes("script")?"script":t.includes("routine")||t.includes("schedule")||t.includes("cron")?"routine":t.includes("skill")?"skill":"feature"}c(cE,"artifactTypeForFeature");function dE(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(`
|
|
1256
1303
|
|
|
1257
|
-
`)}c(
|
|
1304
|
+
`)}c(dE,"renderFeatureBody");function uE(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(`
|
|
1258
1305
|
|
|
1259
|
-
`)}c(
|
|
1260
|
-
`)
|
|
1261
|
-
`).find(q=>q.trim()&&!q.startsWith("#"))??"Suggested by insights").slice(0,500),type:E.type,scope:"personal",scopeRef:t,version:"1.0.0",content:E.body,frontmatter:{source:"insights",artifactType:E.type,origin:E.origin,projectPath:n,proposedAt:new Date().toISOString(),...E.provenance},createdBy:t,contentHash:T}),"values");try{let[N]=await d.insert(g).values(W(E.name.slice(0,80))).returning({id:g.id});return{id:N.id,created:!0}}catch(N){if(!pE(N))throw N;let[q]=await d.insert(g).values(W(mE(E.name,T))).returning({id:g.id});return{id:q.id,created:!0}}}c(w,"materialise");for(let E of r)await p(E.title,async()=>{let S=await w({name:E.title,body:E.canonicalBody,type:E.artifact,origin:"recommendation_candidates",provenance:{canonicalBody:E.canonicalBody,rationale:E.rationale,evidence:E.evidence,outcomeMetric:E.outcomeMetric,renderings:E.renderings}});S&&(S.created&&(E.artifact==="instruction"?m+=1:f+=1),u.push({instructionId:S.id,reason:E.rationale||"Suggested by cross-harness insights",score:E.artifact==="instruction"?Hh:Bh}))});if(s.length>0){let E=s.flatMap(O=>[O.skillId,`skills--${O.skillId}`]),S=await d.select({id:g.id,name:g.name}).from(g).where(Uh(Ho(g.type,"skill"),Ho(g.archived,!1),JL(g.name,E))),T=new Map(S.map(O=>[O.name,O.id]));for(let O of s){let W=T.get(`skills--${O.skillId}`)??T.get(O.skillId);if(!W){l+=1;continue}u.push({instructionId:W,reason:O.reason||"Recommended by insights",score:Hh})}}for(let E of o)await p(Rm(E.addition),async()=>{let S=Ni(E.addition);if(S.length>0){v.push({name:Rm(E.addition),placeholders:S.map(N=>N.token)});return}let T=lE(E.addition),[O]=await d.select({id:g.id}).from(g).where(Uh(Ho(g.createdBy,t),Ho(g.contentHash,T),Ho(g.archived,!1))).limit(1),W=O?.id;if(!W){let N=c(U=>({name:U,description:E.why.slice(0,500)||"Proposed by insights from your session history",type:"instruction",scope:"personal",scopeRef:t,version:"1.0.0",content:E.addition,frontmatter:{source:"insights",projectPath:n,proposedAt:new Date().toISOString()},createdBy:t,contentHash:T}),"addValues"),q;try{[q]=await d.insert(g).values(N(Rm(E.addition))).returning({id:g.id})}catch(U){if(!pE(U))throw U;[q]=await d.insert(g).values(N(mE(Rm(E.addition),T))).returning({id:g.id})}W=q.id,m+=1}u.push({instructionId:W,reason:E.why||"Proposed by insights from your session history",score:Hh})});for(let E of i)await p(E.feature,async()=>{let S=await w({name:E.feature,body:uE(E),type:cE(E.feature),origin:"features_to_try"});S&&(S.created&&(f+=1),u.push({instructionId:S.id,reason:E.why_for_you||E.one_liner||"Suggested by insights from your session history",score:Bh}))});for(let E of a)await p(E.title,async()=>{let S=await w({name:E.title,body:dE(E),type:"feature",origin:E.origin});S&&(S.created&&(_+=1),u.push({instructionId:S.id,reason:E.lead||E.detail||"Surfaced by insights from your session history",score:Bh}))});if(u.length===0)return{nominated:0,additionsCreated:0,featuresCreated:0,adviceCreated:0,skillsUnresolved:l,additionsRejected:v,itemsFailed:h};let I=new Set,b=u.filter(E=>I.has(E.instructionId)?!1:(I.add(E.instructionId),!0)).map(E=>({userId:t,instructionId:E.instructionId,projectPath:n,projectId:null,score:E.score,reason:E.reason,kind:"add",generatedAt:new Date,isStale:!1})),A=await Bn(n);for(let E of b)E.projectId=A;return await d.insert(x).values(b).onConflictDoUpdate({target:[x.userId,x.projectPath,x.instructionId,x.kind],set:{score:Su`excluded.score`,reason:Su`excluded.reason`,generatedAt:Su`excluded.generated_at`,isStale:Su`false`,dismissedAt:Su`CASE WHEN ${x.dismissedAt} IS NOT NULL AND ${x.dismissedAt} >= now() - interval '30 days' THEN ${x.dismissedAt} ELSE NULL END`}}),{nominated:b.length,additionsCreated:m,featuresCreated:f,adviceCreated:_,skillsUnresolved:l,additionsRejected:v,itemsFailed:h}}c(fE,"materialiseInsightRecommendations");var Fh=new KL,GL=ke.object({projectPath:ke.string().min(1),candidates:ke.array(ke.object({title:ke.string().min(2).max(200),artifact:ke.enum(["instruction","skill","hook","script","mcp","subagent","routine","feature"]),canonicalBody:ke.string().min(12).max(16e3),rationale:ke.string().max(4e3).default(""),evidence:ke.array(ke.object({sessionId:ke.string().max(200).optional(),finding:ke.string().min(1).max(4e3)})).max(50).default([]),outcomeMetric:ke.string().min(1).max(200).default("session_outcome"),renderings:ke.array(ke.object({harness:ke.enum(["claude_code","codex","shared"]),target:ke.enum(["CLAUDE.md","AGENTS.md","manual"]),body:ke.string().min(1).max(16e3)})).max(10).default([])})).max(40).default([]),additions:ke.array(ke.object({addition:ke.string().min(12).max(4e3),why:ke.string().max(2e3).default("")})).max(20).default([]),skills:ke.array(ke.object({skillId:ke.string().min(1).max(200),reason:ke.string().max(2e3).default("")})).max(20).default([]),features:ke.array(ke.object({feature:ke.string().min(2).max(200),one_liner:ke.string().max(1e3).default(""),why_for_you:ke.string().max(4e3).default(""),example_code:ke.string().max(8e3).default("")})).max(20).default([]),advice:ke.array(ke.object({title:ke.string().min(2).max(200),lead:ke.string().max(4e3).default(""),detail:ke.string().max(8e3).default(""),copyable_prompt:ke.string().max(8e3).default(""),origin:ke.enum(["usage_pattern","opportunity"])})).max(40).default([])});Fh.post("/insights/recommendations/nominate",async e=>{let t=GL.safeParse(await e.req.json());if(!t.success)return e.json({error:"Invalid body",details:t.error.flatten()},400);let n=await fE({userId:e.get("userId"),...t.data});return e.json(n)});D();import{Hono as YL}from"hono";import{and as XL,desc as QL,eq as Wh,isNotNull as ZL}from"drizzle-orm";var zh=new YL;zh.get("/insights/evidence",async e=>{let t=e.get("userId"),n=e.req.query("projectPath");if(!n)return e.json({error:"projectPath is required"},400);let[r]=await d.select({result:z.result,completedAt:z.completedAt}).from(z).where(XL(Wh(z.userId,t),Wh(z.projectPath,n),Wh(z.status,"completed"),ZL(z.result))).orderBy(QL(z.completedAt)).limit(1);if(!r)return e.json({analyzedAt:null,friction:[],whatWorks:[]});let o=c(m=>typeof m=="string"&&m.trim().length>0,"isStr"),s=c(m=>m!==null&&typeof m=="object"&&!Array.isArray(m),"isRecord"),i=r.result,a=s(i)&&s(i.recommendations)?i.recommendations:void 0,u=c(m=>Array.isArray(m)?m.flatMap(f=>{if(typeof f=="string")return f.trim()?[f.trim()]:[];if(s(f)){let _=f,v=[_.title,_.category,_.pattern].find(o),h=[_.detail,_.description,_.summary,Array.isArray(_.examples)?_.examples.find(o):void 0].find(o),p=[v,h].filter(o).join(" \u2014 ");return p?[p]:[]}return[]}):o(m)?[m.trim()]:[],"asLines"),l=c((m,f)=>{if(Array.isArray(m))return m;if(s(m)){let _=m[f];if(Array.isArray(_))return _}return[]},"listAt");return e.json({analyzedAt:r.completedAt,friction:u(l(a?.friction_analysis,"categories")).slice(0,8),whatWorks:u(l(a?.what_works,"impressive_workflows")).slice(0,8)})});D();import{Hono as eM}from"hono";import{and as Vh,eq as Fs,inArray as gE,isNotNull as tM,or as nM,sql as Jh}from"drizzle-orm";var Kh=new eM;Kh.get("/insights/provenance-impact",async e=>{let t=e.get("userId"),n=await d.select({treatmentId:ne.treatmentId,sessions:Jh`count(distinct ${ne.sessionId})::int`}).from(ne).where(Vh(Fs(ne.userId,t),Fs(ne.treatmentType,"instruction"))).groupBy(ne.treatmentId),r=n.map(h=>h.treatmentId),o=await d.select({id:g.id,name:g.name,source:Jh`${g.frontmatter}->>'source'`,createdBy:g.createdBy,scope:g.scope}).from(g).where(Vh(Fs(g.archived,!1),r.length>0?nM(Fs(g.createdBy,t),gE(g.id,r)):Fs(g.createdBy,t))).limit(5e3),s=new Map(o.map(h=>[h.id,Zd(h,t)])),i=o.map(h=>h.id),a=await d.select({instructionId:Q.instructionId,decision:Q.decision,delta:Q.delta}).from(Q).where(Fs(Q.userId,t)),u=i.length>0?await d.select({instructionId:x.instructionId,n:Jh`count(*)::int`}).from(x).where(Vh(Fs(x.userId,t),tM(x.acceptedAt),gE(x.instructionId,i))).groupBy(x.instructionId):[],l=new Map,m=c(h=>{let p=l.get(h);return p||(p={provenance:h,instructions:0,exposedInstructions:0,exposedSessions:0,accepted:0,randomisedVerdicts:0,meanDelta:null,evidenceClass:"none"},l.set(h,p)),p},"ensure"),f=new Map(n.map(h=>[h.treatmentId,Number(h.sessions)]));for(let h of o){let p=Zd(h,t),w=f.get(h.id)??0;if(p==="catalog"&&w===0)continue;let I=m(p);I.instructions+=1,w>0&&(I.exposedInstructions+=1,I.exposedSessions+=w)}for(let h of u){let p=s.get(h.instructionId);p&&(m(p).accepted+=Number(h.n))}let _=new Map;for(let h of a){let p=s.get(h.instructionId);if(!p)continue;m(p).randomisedVerdicts+=1;let w=_.get(p)??{sum:0,n:0};w.sum+=Number(h.delta),w.n+=1,_.set(p,w)}for(let[h,p]of _){let w=m(h);w.meanDelta=p.n>0?p.sum/p.n:null,w.evidenceClass=p.n>0?"randomised":"none"}let v=["insights","evolution","user","catalog"];return e.json({groups:v.filter(h=>l.has(h)).map(h=>l.get(h)),measurable:a.length>0,note:a.length===0?"No randomised verdicts exist yet, so no group is measurable. Exposure counts show reach, not effect.":null})});var Gn=new rM;Gn.route("/",xh);Gn.route("/",Eu);Gn.route("/",Hs);Gn.route("/",Mh);Gn.route("/",Uo);Gn.route("/",Fh);Gn.route("/",zh);Gn.route("/",Kh);Gn.route("/",qh);D();import{Hono as oM}from"hono";import{z as ut}from"zod";import{and as Yn,desc as Tm,eq as it,sql as mn}from"drizzle-orm";var bn=new oM,Gh=["fact","decision","correction","convention"],hE=4e3,sM=ut.object({kind:ut.enum(Gh),title:ut.string().min(1).max(300),body:ut.string().min(1).max(hE),projectId:ut.string().uuid().optional(),projectPath:ut.string().optional(),source:ut.enum(["manual","distilled"]).optional()}),iM=ut.object({kind:ut.enum(Gh).optional(),title:ut.string().min(1).max(300).optional(),body:ut.string().min(1).max(hE).optional(),status:ut.enum(["active","archived"]).optional()});async function Yh(e){if(!e)return null;try{let[t]=await d.select({projectId:ye.projectId}).from(ye).where(it(ye.path,e)).orderBy(Tm(ye.lastSeen)).limit(1);if(t)return t.projectId;let[n]=await d.select({id:C.id}).from(C).where(it(C.gitRemoteUrl,e)).limit(1);return n?.id??null}catch{return null}}c(Yh,"resolveProjectId");bn.get("/memories",async e=>{let t=e.get("userId"),n=e.req.query("projectId"),r=e.req.query("projectPath"),o=e.req.query("status")??"active",s=Number(e.req.query("limit")??"50"),i=Math.min(Math.max(Number.isFinite(s)?s:50,1),200),a=Number(e.req.query("offset")??"0"),u=Math.max(Number.isFinite(a)?a:0,0),l=e.req.query("rank"),m=n??await Yh(r??null),f=[it(F.userId,t)];o!=="all"&&f.push(it(F.status,o));let _=e.req.query("kind");_&&Gh.includes(_)&&f.push(it(F.kind,_));let v=e.req.query("search")?.trim();if(v){let I=`%${ct(v)}%`;f.push(mn`(${F.title} ilike ${I} or ${F.body} ilike ${I})`)}(n||r)&&f.push(m?mn`(${F.projectId} = ${m} or ${F.projectId} is null)`:mn`${F.projectId} is null`);let h=mn`${F.trustVersion} = ${F.version}`;l==="trust"&&f.push(mn`coalesce(${F.trustClass} = 'harmful' and ${h}, false) = false`);let p=mn`case
|
|
1262
|
-
when ${F.source} = 'manual' or (${F.trustClass} = 'helpful' and ${
|
|
1263
|
-
when ${F.trustClass} = 'neutral' and ${
|
|
1306
|
+
`)}c(uE,"renderAdviceBody");var Hh=.5,Bh=.4;function GL(e){let t=!1;for(let n of e.split(`
|
|
1307
|
+
`)){let r=n.trim();if(/^(`{3,}|~{3,})/.test(r)){t=!t;continue}if(!(t||!r)&&!r.startsWith("#"))return r}return""}c(GL,"firstProseLine");var lE=c(e=>JL("sha256").update(e.trim()).digest("hex"),"hashAddition");function Tp(e){let t=e.trim().split(`
|
|
1308
|
+
`)[0].replace(/^#+\s*/,"").trim();return(t.length>0?t:e.trim()).slice(0,80)}c(Tp,"deriveName");function pE(e,t){let n=` (${t.slice(0,6)})`;return`${e.slice(0,80-n.length)}${n}`}c(pE,"disambiguateName");function mE(e){return e?.cause?.code==="23505"||e?.code==="23505"}c(mE,"isUniqueViolation");async function fE(e){let{userId:t,projectPath:n,candidates:r=[],additions:o,skills:s,features:i,advice:a}=e,d=[],l=0,p=0,f=0,_=0,v=[],g=[];async function m(E,S){try{await S()}catch(R){g.push({name:E.slice(0,80),error:R instanceof Error?R.message:String(R)})}}c(m,"attempt");async function w(E){let S=Ni(E.body);if(S.length>0)return v.push({name:E.name.slice(0,80),placeholders:S.map(N=>N.token)}),null;let R=lE(E.body),[O]=await u.select({id:h.id}).from(h).where(Uh(Ho(h.createdBy,t),Ho(h.contentHash,R),Ho(h.archived,!1))).limit(1);if(O)return{id:O.id,created:!1};let W=c(N=>({name:N,description:GL(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:R}),"values");try{let[N]=await u.insert(h).values(W(E.name.slice(0,80))).returning({id:h.id});return{id:N.id,created:!0}}catch(N){if(!mE(N))throw N;let[U]=await u.insert(h).values(W(pE(E.name,R))).returning({id:h.id});return{id:U.id,created:!0}}}c(w,"materialise");for(let E of r)await m(E.title,async()=>{let S=await w({name:E.title,body:E.canonicalBody,type:E.artifact,origin:"recommendation_candidates",provenance:{canonicalBody:E.canonicalBody,rationale:E.rationale,evidence:E.evidence,outcomeMetric:E.outcomeMetric,renderings:E.renderings}});S&&(S.created&&(E.artifact==="instruction"?p+=1:f+=1),d.push({instructionId:S.id,reason:E.rationale||"Suggested by cross-harness insights",score:E.artifact==="instruction"?Hh:Bh}))});if(s.length>0){let E=s.flatMap(O=>[O.skillId,`skills--${O.skillId}`]),S=await u.select({id:h.id,name:h.name}).from(h).where(Uh(Ho(h.type,"skill"),Ho(h.archived,!1),KL(h.name,E))),R=new Map(S.map(O=>[O.name,O.id]));for(let O of s){let W=R.get(`skills--${O.skillId}`)??R.get(O.skillId);if(!W){l+=1;continue}d.push({instructionId:W,reason:O.reason||"Recommended by insights",score:Hh})}}for(let E of o)await m(Tp(E.addition),async()=>{let S=Ni(E.addition);if(S.length>0){v.push({name:Tp(E.addition),placeholders:S.map(N=>N.token)});return}let R=lE(E.addition),[O]=await u.select({id:h.id}).from(h).where(Uh(Ho(h.createdBy,t),Ho(h.contentHash,R),Ho(h.archived,!1))).limit(1),W=O?.id;if(!W){let N=c(q=>({name:q,description:E.why.slice(0,500)||"Proposed by insights from your session history",type:"instruction",scope:"personal",scopeRef:t,version:"1.0.0",content:E.addition,frontmatter:{source:"insights",projectPath:n,proposedAt:new Date().toISOString()},createdBy:t,contentHash:R}),"addValues"),U;try{[U]=await u.insert(h).values(N(Tp(E.addition))).returning({id:h.id})}catch(q){if(!mE(q))throw q;[U]=await u.insert(h).values(N(pE(Tp(E.addition),R))).returning({id:h.id})}W=U.id,p+=1}d.push({instructionId:W,reason:E.why||"Proposed by insights from your session history",score:Hh})});for(let E of i)await m(E.feature,async()=>{let S=await w({name:E.feature,body:dE(E),type:cE(E.feature),origin:"features_to_try"});S&&(S.created&&(f+=1),d.push({instructionId:S.id,reason:E.why_for_you||E.one_liner||"Suggested by insights from your session history",score:Bh}))});for(let E of a)await m(E.title,async()=>{let S=await w({name:E.title,body:uE(E),type:"feature",origin:E.origin});S&&(S.created&&(_+=1),d.push({instructionId:S.id,reason:E.lead||E.detail||"Surfaced by insights from your session history",score:Bh}))});if(d.length===0)return{nominated:0,additionsCreated:0,featuresCreated:0,adviceCreated:0,skillsUnresolved:l,additionsRejected:v,itemsFailed:g};let I=new Set,b=d.filter(E=>I.has(E.instructionId)?!1:(I.add(E.instructionId),!0)).map(E=>({userId:t,instructionId:E.instructionId,projectPath:n,projectId:null,score:E.score,reason:E.reason,kind:"add",generatedAt:new Date,isStale:!1})),A=await Bn(n);for(let E of b)E.projectId=A;return await u.insert(x).values(b).onConflictDoUpdate({target:[x.userId,x.projectPath,x.instructionId,x.kind],set:{score:xd`excluded.score`,reason:xd`excluded.reason`,generatedAt:xd`excluded.generated_at`,isStale:xd`false`,dismissedAt:xd`CASE WHEN ${x.dismissedAt} IS NOT NULL AND ${x.dismissedAt} >= now() - interval '30 days' THEN ${x.dismissedAt} ELSE NULL END`}}),{nominated:b.length,additionsCreated:p,featuresCreated:f,adviceCreated:_,skillsUnresolved:l,additionsRejected:v,itemsFailed:g}}c(fE,"materialiseInsightRecommendations");var Fh=new YL,XL=ke.object({projectPath:ke.string().min(1),candidates:ke.array(ke.object({title:ke.string().min(2).max(200),artifact:ke.enum(["instruction","skill","hook","script","mcp","subagent","routine","feature"]),canonicalBody:ke.string().min(12).max(16e3),rationale:ke.string().max(4e3).default(""),evidence:ke.array(ke.object({sessionId:ke.string().max(200).optional(),finding:ke.string().min(1).max(4e3)})).max(50).default([]),outcomeMetric:ke.string().min(1).max(200).default("session_outcome"),renderings:ke.array(ke.object({harness:ke.enum(["claude_code","codex","shared"]),target:ke.enum(["CLAUDE.md","AGENTS.md","manual"]),body:ke.string().min(1).max(16e3)})).max(10).default([])})).max(40).default([]),additions:ke.array(ke.object({addition:ke.string().min(12).max(4e3),why:ke.string().max(2e3).default("")})).max(20).default([]),skills:ke.array(ke.object({skillId:ke.string().min(1).max(200),reason:ke.string().max(2e3).default("")})).max(20).default([]),features:ke.array(ke.object({feature:ke.string().min(2).max(200),one_liner:ke.string().max(1e3).default(""),why_for_you:ke.string().max(4e3).default(""),example_code:ke.string().max(8e3).default("")})).max(20).default([]),advice:ke.array(ke.object({title:ke.string().min(2).max(200),lead:ke.string().max(4e3).default(""),detail:ke.string().max(8e3).default(""),copyable_prompt:ke.string().max(8e3).default(""),origin:ke.enum(["usage_pattern","opportunity"])})).max(40).default([])});Fh.post("/insights/recommendations/nominate",async e=>{let t=XL.safeParse(await e.req.json());if(!t.success)return e.json({error:"Invalid body",details:t.error.flatten()},400);let n=await fE({userId:e.get("userId"),...t.data});return e.json(n)});D();import{Hono as QL}from"hono";import{and as ZL,desc as eM,eq as Wh,isNotNull as tM}from"drizzle-orm";var zh=new QL;zh.get("/insights/evidence",async e=>{let t=e.get("userId"),n=e.req.query("projectPath");if(!n)return e.json({error:"projectPath is required"},400);let[r]=await u.select({result:z.result,completedAt:z.completedAt}).from(z).where(ZL(Wh(z.userId,t),Wh(z.projectPath,n),Wh(z.status,"completed"),tM(z.result))).orderBy(eM(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(f=>{if(typeof f=="string")return f.trim()?[f.trim()]:[];if(s(f)){let _=f,v=[_.title,_.category,_.pattern].find(o),g=[_.detail,_.description,_.summary,Array.isArray(_.examples)?_.examples.find(o):void 0].find(o),m=[v,g].filter(o).join(" \u2014 ");return m?[m]:[]}return[]}):o(p)?[p.trim()]:[],"asLines"),l=c((p,f)=>{if(Array.isArray(p))return p;if(s(p)){let _=p[f];if(Array.isArray(_))return _}return[]},"listAt");return e.json({analyzedAt:r.completedAt,friction:d(l(a?.friction_analysis,"categories")).slice(0,8),whatWorks:d(l(a?.what_works,"impressive_workflows")).slice(0,8)})});D();import{Hono as nM}from"hono";import{and as Vh,eq as Fs,inArray as gE,isNotNull as rM,or as oM,sql as Jh}from"drizzle-orm";var Kh=new nM;Kh.get("/insights/provenance-impact",async e=>{let t=e.get("userId"),n=await u.select({treatmentId:ne.treatmentId,sessions:Jh`count(distinct ${ne.sessionId})::int`}).from(ne).where(Vh(Fs(ne.userId,t),Fs(ne.treatmentType,"instruction"))).groupBy(ne.treatmentId),r=n.map(g=>g.treatmentId),o=await u.select({id:h.id,name:h.name,source:Jh`${h.frontmatter}->>'source'`,createdBy:h.createdBy,scope:h.scope}).from(h).where(Vh(Fs(h.archived,!1),r.length>0?oM(Fs(h.createdBy,t),gE(h.id,r)):Fs(h.createdBy,t))).limit(5e3),s=new Map(o.map(g=>[g.id,el(g,t)])),i=o.map(g=>g.id),a=await u.select({instructionId:Z.instructionId,decision:Z.decision,delta:Z.delta}).from(Z).where(Fs(Z.userId,t)),d=i.length>0?await u.select({instructionId:x.instructionId,n:Jh`count(*)::int`}).from(x).where(Vh(Fs(x.userId,t),rM(x.acceptedAt),gE(x.instructionId,i))).groupBy(x.instructionId):[],l=new Map,p=c(g=>{let m=l.get(g);return m||(m={provenance:g,instructions:0,exposedInstructions:0,exposedSessions:0,accepted:0,randomisedVerdicts:0,meanDelta:null,evidenceClass:"none"},l.set(g,m)),m},"ensure"),f=new Map(n.map(g=>[g.treatmentId,Number(g.sessions)]));for(let g of o){let m=el(g,t),w=f.get(g.id)??0;if(m==="catalog"&&w===0)continue;let I=p(m);I.instructions+=1,w>0&&(I.exposedInstructions+=1,I.exposedSessions+=w)}for(let g of d){let m=s.get(g.instructionId);m&&(p(m).accepted+=Number(g.n))}let _=new Map;for(let g of a){let m=s.get(g.instructionId);if(!m)continue;p(m).randomisedVerdicts+=1;let w=_.get(m)??{sum:0,n:0};w.sum+=Number(g.delta),w.n+=1,_.set(m,w)}for(let[g,m]of _){let w=p(g);w.meanDelta=m.n>0?m.sum/m.n:null,w.evidenceClass=m.n>0?"randomised":"none"}let v=["insights","evolution","user","catalog"];return e.json({groups:v.filter(g=>l.has(g)).map(g=>l.get(g)),measurable:a.length>0,note:a.length===0?"No randomised verdicts exist yet, so no group is measurable. Exposure counts show reach, not effect.":null})});var Gn=new sM;Gn.route("/",xh);Gn.route("/",Ad);Gn.route("/",Hs);Gn.route("/",Mh);Gn.route("/",Uo);Gn.route("/",Fh);Gn.route("/",zh);Gn.route("/",Kh);Gn.route("/",qh);D();import{Hono as iM}from"hono";import{z as dt}from"zod";import{and as Yn,desc as Rp,eq as it,sql as pn}from"drizzle-orm";var bn=new iM,Gh=["fact","decision","correction","convention"],hE=4e3,aM=dt.object({kind:dt.enum(Gh),title:dt.string().min(1).max(300),body:dt.string().min(1).max(hE),projectId:dt.string().uuid().optional(),projectPath:dt.string().optional(),source:dt.enum(["manual","distilled"]).optional()}),cM=dt.object({kind:dt.enum(Gh).optional(),title:dt.string().min(1).max(300).optional(),body:dt.string().min(1).max(hE).optional(),status:dt.enum(["active","archived"]).optional()});async function Yh(e){if(!e)return null;try{let[t]=await u.select({projectId:ye.projectId}).from(ye).where(it(ye.path,e)).orderBy(Rp(ye.lastSeen)).limit(1);if(t)return t.projectId;let[n]=await u.select({id:C.id}).from(C).where(it(C.gitRemoteUrl,e)).limit(1);return n?.id??null}catch{return null}}c(Yh,"resolveProjectId");bn.get("/memories",async e=>{let t=e.get("userId"),n=e.req.query("projectId"),r=e.req.query("projectPath"),o=e.req.query("status")??"active",s=Number(e.req.query("limit")??"50"),i=Math.min(Math.max(Number.isFinite(s)?s:50,1),200),a=Number(e.req.query("offset")??"0"),d=Math.max(Number.isFinite(a)?a:0,0),l=e.req.query("rank"),p=n??await Yh(r??null),f=[it(F.userId,t)];o!=="all"&&f.push(it(F.status,o));let _=e.req.query("kind");_&&Gh.includes(_)&&f.push(it(F.kind,_));let v=e.req.query("search")?.trim();if(v){let I=`%${ct(v)}%`;f.push(pn`(${F.title} ilike ${I} or ${F.body} ilike ${I})`)}(n||r)&&f.push(p?pn`(${F.projectId} = ${p} or ${F.projectId} is null)`:pn`${F.projectId} is null`);let g=pn`${F.trustVersion} = ${F.version}`;l==="trust"&&f.push(pn`coalesce(${F.trustClass} = 'harmful' and ${g}, false) = false`);let m=pn`case
|
|
1309
|
+
when ${F.source} = 'manual' or (${F.trustClass} = 'helpful' and ${g}) then 0
|
|
1310
|
+
when ${F.trustClass} = 'neutral' and ${g} then 1
|
|
1264
1311
|
else 2
|
|
1265
|
-
end`,w=await
|
|
1312
|
+
end`,w=await u.select({id:F.id,version:F.version,kind:F.kind,title:F.title,body:F.body,source:F.source,status:F.status,projectId:F.projectId,createdAt:F.createdAt,updatedAt:F.updatedAt}).from(F).where(Yn(...f)).orderBy(...l==="trust"?[m,Rp(F.updatedAt)]:[Rp(F.updatedAt)]).limit(i).offset(l==="trust"?0:d);return e.json({memories:w})});bn.post("/memories/relevant",async e=>{let t=e.get("userId"),n=await e.req.json().catch(()=>({})),r=typeof n.prompt=="string"?n.prompt.slice(0,2e3):"";if(!r.trim())return e.json({memories:[]});let o=Number(n.limit),s=Math.min(Math.max(Number.isFinite(o)?o:10,1),50),i=.035,a=Number(n.minRank),d=Number.isFinite(a)?Math.min(Math.max(a,0),1):i,l=Array.isArray(n.excludeIds)?n.excludeIds.filter(w=>typeof w=="string").slice(0,500):[],p=typeof n.projectId=="string"?n.projectId:void 0,f=typeof n.projectPath=="string"?n.projectPath:void 0,_=p??await Yh(f??null),v=p||f?_?pn`(m.project_id = ${_} or m.project_id is null)`:pn`m.project_id is null`:pn`true`,g=l.length?pn`and m.id not in (${pn.join(l.map(w=>pn`${w}::uuid`),pn`, `)})`:pn``,m=await u.execute(pn`
|
|
1266
1313
|
with raw as (
|
|
1267
1314
|
select websearch_to_tsquery('english', ${r})::text as t
|
|
1268
1315
|
), q as (
|
|
@@ -1276,7 +1323,7 @@ ${r}`).digest("hex")}c(G0,"recommendationEntryHash");var sL=new Set(["42883","42
|
|
|
1276
1323
|
and m.status = 'active'
|
|
1277
1324
|
and ${v}
|
|
1278
1325
|
and coalesce(m.trust_class = 'harmful' and m.trust_version = m.version, false) = false
|
|
1279
|
-
${
|
|
1326
|
+
${g}
|
|
1280
1327
|
and q.query is not null
|
|
1281
1328
|
and m.search_tsv @@ q.query
|
|
1282
1329
|
-- Require relevance above the min floor. websearch turns a -flag token into a
|
|
@@ -1286,14 +1333,14 @@ ${r}`).digest("hex")}c(G0,"recommendationEntryHash");var sL=new Set(["42883","42
|
|
|
1286
1333
|
-- memories into context AND stamp false exposures. The floor (default 0.035,
|
|
1287
1334
|
-- clamped to >= 0) subsumes the old rank-zero negation guard AND cuts the weak
|
|
1288
1335
|
-- single-word overlap band, keeping only memories with real topical overlap.
|
|
1289
|
-
and ts_rank(m.search_tsv, q.query) > ${
|
|
1336
|
+
and ts_rank(m.search_tsv, q.query) > ${d}
|
|
1290
1337
|
order by ts_rank(m.search_tsv, q.query) desc,
|
|
1291
1338
|
case when m.source = 'manual' or (m.trust_class = 'helpful' and m.trust_version = m.version) then 0
|
|
1292
1339
|
when m.trust_class = 'neutral' and m.trust_version = m.version then 1
|
|
1293
1340
|
else 2 end,
|
|
1294
1341
|
m.updated_at desc
|
|
1295
1342
|
limit ${s}
|
|
1296
|
-
`);return e.json({memories:[...p]})});bn.get("/memories/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select().from(F).where(Yn(it(F.id,n),it(F.userId,t))).limit(1);return r?e.json(r):e.json({error:"not found"},404)});bn.post("/memories",async e=>{let t=e.get("userId"),n=sM.safeParse(await e.req.json().catch(()=>({})));if(!n.success)return e.json({error:"invalid body",details:n.error.flatten()},400);let{kind:r,title:o,body:s,projectId:i,projectPath:a,source:u}=n.data,l=i??await Yh(a??null),[m]=await d.select({orgId:R.activeOrgId}).from(R).where(it(R.id,t)).limit(1),[f]=await d.insert(F).values({userId:t,orgId:m?.orgId??null,projectId:l,kind:r,title:o,body:s,source:u??"manual",status:"active"}).returning();return e.json(f,201)});bn.patch("/memories/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=iM.safeParse(await e.req.json().catch(()=>({})));if(!r.success)return e.json({error:"invalid body",details:r.error.flatten()},400);let[o]=await d.select().from(F).where(Yn(it(F.id,n),it(F.userId,t))).limit(1);if(!o)return e.json({error:"not found"},404);let{kind:s,title:i,body:a,status:u}=r.data,l=s!==void 0&&s!==o.kind||i!==void 0&&i!==o.title||a!==void 0&&a!==o.body,[m]=await d.update(F).set({kind:s??o.kind,title:i??o.title,body:a??o.body,status:u??o.status,version:l?o.version+1:o.version,updatedAt:new Date}).where(Yn(it(F.id,n),it(F.userId,t))).returning();return e.json(m)});bn.delete("/memories/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.update(F).set({status:"archived",updatedAt:new Date}).where(Yn(it(F.id,n),it(F.userId,t))).returning({id:F.id,status:F.status});return r?e.json({ok:!0,id:r.id,status:r.status}):e.json({error:"not found"},404)});var aM=ut.object({externalSessionId:ut.string().min(1),projectPath:ut.string().optional()});bn.post("/memories/:id/exposures",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=aM.safeParse(await e.req.json().catch(()=>({})));if(!r.success)return e.json({error:"invalid body",details:r.error.flatten()},400);let[o]=await d.select({id:F.id,version:F.version,projectId:F.projectId}).from(F).where(Yn(it(F.id,n),it(F.userId,t))).limit(1);return o?(await d.insert(md).values({userId:t,externalSessionId:r.data.externalSessionId,treatmentType:"memory",treatmentId:o.id,treatmentVersion:o.version,method:"injected",projectId:o.projectId}).onConflictDoNothing(),e.json({ok:!0})):e.json({error:"not found"},404)});var cM=ut.object({taskPrompt:ut.string().min(1).max(8e3),expectations:ut.array(ut.string().min(1)).min(1).max(20),trials:ut.number().int().min(1).max(50).default(10),model:ut.string().min(1).max(100).optional()});bn.post("/memories/:id/experiments",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=cM.safeParse(await e.req.json().catch(()=>({})));if(!r.success)return e.json({error:"invalid body",details:r.error.flatten()},400);let[o]=await d.select({id:F.id,version:F.version}).from(F).where(Yn(it(F.id,n),it(F.userId,t))).limit(1);if(!o)return e.json({error:"not found"},404);let[s]=await d.insert(Mt).values({memoryId:o.id,userId:t,memoryVersion:o.version,taskPrompt:r.data.taskPrompt,expectations:r.data.expectations,trials:r.data.trials,model:r.data.model??null,status:"pending"}).returning(),{noLiveWorker:i}=await vI({experimentId:s.id,userId:t});return e.json({experiment:s,noLiveWorker:i},201)});bn.get("/memories/:id/experiments",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select({id:F.id}).from(F).where(Yn(it(F.id,n),it(F.userId,t))).limit(1);if(!r)return e.json({error:"not found"},404);let o=await d.select().from(Mt).where(Yn(it(Mt.memoryId,n),it(Mt.userId,t))).orderBy(Tm(Mt.createdAt)).limit(20);return e.json({experiments:o})});bn.get("/memory-experiments/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select().from(Mt).where(Yn(it(Mt.id,n),it(Mt.userId,t))).limit(1);return r?e.json(r):e.json({error:"not found"},404)});var uM=ut.object({status:ut.enum(["running","completed","failed"]),error:ut.string().max(1e3).nullable().optional(),result:ut.record(ut.unknown()).optional()});bn.patch("/memory-experiments/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=uM.safeParse(await e.req.json().catch(()=>({})));if(!r.success)return e.json({error:"invalid body",details:r.error.flatten()},400);let{status:o,error:s,result:i}=r.data,[a]=await d.select({id:Mt.id,status:Mt.status}).from(Mt).where(Yn(it(Mt.id,n),it(Mt.userId,t))).limit(1);if(!a)return e.json({error:"not found"},404);if(a.status==="completed"||a.status==="failed")return e.json({error:`experiment is already terminal (status='${a.status}')`,code:"INVALID_STATE"},409);let u=o==="completed"||o==="failed",[l]=await d.update(Mt).set({status:o,...s!==void 0?{error:s}:{},...i!==void 0?{result:i}:{},...o==="running"?{startedAt:new Date}:{},...u?{completedAt:new Date}:{}}).where(Yn(it(Mt.id,n),it(Mt.userId,t))).returning();return e.json(l)});D();import{randomBytes as dM,createHash as lM}from"node:crypto";import{Hono as mM}from"hono";import{z as _E}from"zod";import{eq as km,and as pM,isNull as fM}from"drizzle-orm";var wa=new mM;function gM(){let n=`rm_${dM(32).toString("base64url")}`,r=lM("sha256").update(n).digest("hex"),o=n.slice(0,11);return{plaintext:n,hash:r,prefix:o}}c(gM,"generateApiKey");var hM=_E.object({name:_E.string().min(1).max(100)});wa.post("/auth/api-keys",async e=>{let t=e.get("userId"),n=await e.req.json(),r=hM.parse(n),{plaintext:o,hash:s,prefix:i}=gM(),[a]=await d.insert(Ae).values({userId:t,name:r.name,keyHash:s,keyPrefix:i}).returning();return e.json({id:a.id,name:a.name,key:o,keyPrefix:i,createdAt:a.createdAt},201)});wa.get("/auth/api-keys",async e=>{let t=e.get("userId"),n=await d.select({id:Ae.id,name:Ae.name,keyPrefix:Ae.keyPrefix,lastUsedAt:Ae.lastUsedAt,expiresAt:Ae.expiresAt,revokedAt:Ae.revokedAt,createdAt:Ae.createdAt}).from(Ae).where(km(Ae.userId,t)).orderBy(Ae.createdAt);return e.json(n)});wa.delete("/auth/api-keys/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select({id:Ae.id}).from(Ae).where(pM(km(Ae.id,n),km(Ae.userId,t),fM(Ae.revokedAt)));return r?(await d.update(Ae).set({revokedAt:new Date}).where(km(Ae.id,n)),e.json({revoked:!0})):e.json({error:"API key not found"},404)});D();import{Hono as _M}from"hono";import{z as Qr}from"zod";import{eq as Pt,and as Zr,isNull as yM,sql as Xh}from"drizzle-orm";import{randomUUID as Qh}from"node:crypto";var eo=new _M;eo.post("/eval-targets/:id/conversations",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select({id:k.id}).from(k).where(Zr(Pt(k.id,n),Pt(k.userId,t)));if(!r)return e.json({error:"Target not found"},404);let[o]=await d.select().from(He).where(Zr(Pt(He.evalTargetId,n),Pt(He.userId,t),Pt(He.status,"active")));if(o)return e.json(o);let[s]=await d.insert(He).values({evalTargetId:n,userId:t}).returning();return e.json(s,201)});eo.get("/eval-targets/:id/conversations",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select().from(He).where(Zr(Pt(He.evalTargetId,n),Pt(He.userId,t),Pt(He.status,"active")));return r?e.json(r):e.json(null)});var wM=Qr.object({content:Qr.string().min(1).max(5e3)});eo.post("/eval-conversations/:id/messages",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=wM.parse(await e.req.json()),[o]=await d.select().from(He).where(Zr(Pt(He.id,n),Pt(He.userId,t)));if(!o)return e.json({error:"Conversation not found"},404);let s=Qh(),i={id:s,role:"user",content:r.content,createdAt:new Date().toISOString()};await d.update(He).set({messages:Xh`${He.messages} || ${JSON.stringify([i])}::jsonb`,updatedAt:new Date}).where(Pt(He.id,n));let a={type:"conversation",conversationId:n,messageId:s,messageContent:r.content},{id:u,noLiveWorker:l}=await Ot({taskName:"process_conversation",payload:{evalTargetId:o.evalTargetId,config:a},userId:t,mirror:{userId:t,evalTargetId:o.evalTargetId,config:a}});return e.json({message:i,jobId:u,noLiveWorker:l},201)});var vM=Qr.object({content:Qr.string(),type:Qr.enum(["text","status","results","proposal","applied","generated","comparison"]).default("text"),data:Qr.record(Qr.unknown()).optional()});eo.post("/eval-conversations/:id/messages/assistant",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=vM.parse(await e.req.json()),o={id:Qh(),role:"assistant",content:r.content,type:r.type,data:r.data,createdAt:new Date().toISOString()};return await d.update(He).set({messages:Xh`${He.messages} || ${JSON.stringify([o])}::jsonb`,updatedAt:new Date}).where(Zr(Pt(He.id,n),Pt(He.userId,t))),e.json(o,201)});eo.get("/eval-conversations/:id/messages",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=e.req.query("after"),[o]=await d.select().from(He).where(Zr(Pt(He.id,n),Pt(He.userId,t)));if(!o)return e.json({error:"Conversation not found"},404);let s=o.messages;if(r){let i=s.filter(a=>a.createdAt>r);return e.json(i)}return e.json(s)});var IM=Qr.object({messageId:Qr.string().uuid()});eo.post("/eval-conversations/:id/apply-proposal",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=IM.parse(await e.req.json()),[o]=await d.select().from(He).where(Zr(Pt(He.id,n),Pt(He.userId,t)));if(!o)return e.json({error:"Conversation not found"},404);let i=o.messages.find(f=>f.id===r.messageId&&f.type==="proposal");if(!i?.data?.proposedContent)return e.json({error:"Proposal message not found or has no content"},400);let[a]=await d.select().from(k).where(Zr(Pt(k.id,o.evalTargetId),Pt(k.userId,t)));if(!a)return e.json({error:"Target not found"},404);let[u]=await d.insert(k).values({userId:t,name:a.name,type:a.type,content:i.data.proposedContent,description:a.description,metadata:a.metadata,version:a.version+1,parentId:a.id}).returning(),l=await d.select().from(Ee).where(Zr(Pt(Ee.evalTargetId,a.id),yM(Ee.retiredAt)));l.length>0&&await d.insert(Ee).values(l.map(f=>({evalTargetId:u.id,name:f.name,prompt:f.prompt,expectedOutput:f.expectedOutput,files:f.files,expectations:f.expectations})));let m={id:Qh(),role:"assistant",content:`Applied changes \u2014 created v${u.version}`,type:"applied",data:{newVersion:u.version,evalTargetId:u.id},createdAt:new Date().toISOString()};return await d.update(He).set({evalTargetId:u.id,messages:Xh`${He.messages} || ${JSON.stringify([m])}::jsonb`,updatedAt:new Date}).where(Pt(He.id,n)),e.json({newTarget:u,message:m})});D();import*as va from"node:fs";import*as zs from"node:path";import{createHash as bM}from"node:crypto";import{fileURLToPath as EM}from"node:url";import{createRequire as AM}from"node:module";import{Hono as SM}from"hono";import{z as At}from"zod";import{eq as Ws,desc as xM,and as RM,sql as TM}from"drizzle-orm";var kM=zs.dirname(EM(import.meta.url)),Bo=new SM,Nm=null,jm=null;function NM(){let e=process.env.RULEMETRIC_SKILLS_REGISTRY_PATH;if(e&&va.existsSync(e))return e;try{let n=AM(import.meta.url),r=zs.dirname(n.resolve("@rulemetric/skills-registry/package.json")),o=zs.join(r,"registry.json");if(va.existsSync(o))return o}catch{}let t=zs.resolve(kM,"../../../../packages/skills-registry/registry.json");return va.existsSync(t)?t:null}c(NM,"resolveRegistryPath");function yE(){if(Nm)return Nm;let e=NM();return e?(Nm=JSON.parse(va.readFileSync(e,"utf-8")),Nm):null}c(yE,"loadRegistry");function jM(){if(jm)return jm;let e=yE();return e?(jm={version:e.version,generatedAt:e.generatedAt,skills:e.skills.map(({content:t,...n})=>n)},jm):null}c(jM,"loadRegistryIndex");Bo.get("/skills",e=>{let t=jM();return t?e.json(t):e.json({error:"Skills registry not found"},404)});Bo.post("/skills/publish",async e=>{let t=e.get("userId"),n=await e.req.json();if(!n.id||!n.name||!n.content)return e.json({error:"Missing required fields: id, name, content"},400);if(n.content.trim().length<20)return e.json({error:"Content too short (minimum 20 characters)"},400);let[r]=await d.insert(go).values({skillId:n.id,name:n.name,description:n.description,category:n.category,tools:n.tools,tags:n.tags,content:n.content,submittedBy:t}).returning({id:go.id});return e.json({id:r.id,skillId:n.id,message:`Skill "${n.name}" submitted for review. It will appear in the registry after approval.`},201)});Bo.get("/skills/submissions/approved",async e=>{let n=(await d.select().from(go).where(Ws(go.status,"approved")).orderBy(xM(go.createdAt))).map(r=>({id:r.skillId,name:r.name,description:r.description,category:r.category,tags:r.tags??[],tools:r.tools,source:{repo:"community",path:`published/${r.skillId}.md`,url:"",license:"MIT"},content:r.content,popularity:{installs:0},updatedAt:r.updatedAt?.toISOString()??new Date().toISOString()}));return e.json(n)});var wE=At.object({id:At.string().min(1),name:At.string().min(1),description:At.string(),content:At.string().min(1),source:At.object({repo:At.string(),path:At.string(),url:At.string(),license:At.string().optional()}),tags:At.array(At.string()).optional(),category:At.string().optional(),updatedAt:At.string().optional(),sourceUpdatedAt:At.string().optional(),popularity:At.object({stars:At.number().int().nonnegative().optional(),installs:At.number().int().nonnegative().optional()}).optional()}),$se=At.object({skills:At.array(wE).max(5e3)});Bo.post("/skills/sync-public",async e=>{let t=process.env.RULEMETRIC_REGISTRY_BOT_TOKEN;if(!t)return e.json({error:"Registry bot token not configured"},503);let n=e.req.header("authorization")??"";if((n.startsWith("Bearer ")?n.slice(7):"")!==t)return e.json({error:"Invalid bot token"},401);let o=await e.req.json(),s=At.object({skills:At.array(At.unknown()).max(5e3)}).safeParse(o);if(!s.success)return e.json({error:"Invalid request body",issues:s.error.issues},400);let i=s.data.skills,a=0,u=0,l=0,m=0,f=0;for(let _ of i){let v=wE.safeParse(_);if(!v.success){console.warn("[sync-public] Skipping invalid skill entry:",JSON.stringify(v.error.issues)),f++;continue}let h=v.data,p=bM("sha256").update(h.content).digest("hex"),w=`public_skill::${h.source.repo}::${h.id}`,I=h.updatedAt??"1.0.0",[b]=await d.select({id:g.id,contentHash:g.contentHash,popularityScore:g.popularityScore,sourceUpdatedAt:g.sourceUpdatedAt}).from(g).where(RM(Ws(g.name,h.id),Ws(g.scope,"public"))),A=h.popularity&&Math.max(h.popularity.stars??0,h.popularity.installs??0)||null,E=h.sourceUpdatedAt?new Date(h.sourceUpdatedAt):null,S=E&&!Number.isNaN(E.getTime())?E:null;if(b)if(b.contentHash!==p){let O=!1;for(let W=0;W<=4;W++)try{await d.transaction(async N=>{await N.select({id:g.id}).from(g).where(Ws(g.id,b.id)).for("update"),await N.update(g).set({description:h.description||h.name,content:h.content,contentHash:p,version:I,upstreamVersion:I,popularityScore:A,sourceUpdatedAt:S,frontmatter:{name:h.name,source:h.source,category:h.category??null,popularity:h.popularity??null},updatedAt:new Date}).where(Ws(g.id,b.id));let[q]=await N.select({max:TM`coalesce(max(${xe.versionNumber}), 0)`}).from(xe).where(Ws(xe.instructionId,b.id));await N.insert(xe).values({instructionId:b.id,versionNumber:(q?.max??0)+1,content:h.content,frontmatter:{name:h.name,source:h.source,category:h.category??null},changeSummary:`Synced from registry (${I})`})}),O=!0;break}catch(N){if(N.cause?.code==="23505"){if(W<4)continue;break}throw N}if(!O)continue;u++,m++}else{let T=b.sourceUpdatedAt?.getTime()??null,O=S?.getTime()??null,W=b.popularityScore!==A,N=S!==null&&T!==O;(W||N)&&await d.update(g).set({...W?{popularityScore:A}:{},...N?{sourceUpdatedAt:S}:{}}).where(Ws(g.id,b.id)),l++}else{let[T]=await d.insert(g).values({name:h.id,description:h.description||h.name,type:"skill",scope:"public",scopeRef:null,version:I,content:h.content,frontmatter:{name:h.name,source:h.source,category:h.category??null,popularity:h.popularity??null},tags:h.tags??null,contentHash:p,contextIdentity:w,upstreamVersion:I,popularityScore:A,sourceUpdatedAt:S}).returning({id:g.id});T&&(a++,await d.insert(xe).values({instructionId:T.id,versionNumber:1,content:h.content,frontmatter:{name:h.name,source:h.source,category:h.category??null},changeSummary:"Initial sync from public registry"}),m++)}}return e.json({inserted:a,updated:u,unchanged:l,versionsCreated:m,skipped:f})});Bo.get("/skills/:id",e=>{let t=yE();if(!t?.skills)return e.json({error:"Skills registry not found"},404);let n=t.skills.find(r=>r.id===e.req.param("id"));return n?e.json(n):e.json({error:"Skill not found"},404)});D();import{Hono as WM}from"hono";import{desc as zM,eq as VM}from"drizzle-orm";D();import{eq as IE,and as HM}from"drizzle-orm";D();var PM=/pricing|rate.?limit|rate.?cap|messages.?per|tokens.?per|RPM|TPM|TPD|cache.?write|cache.?read|context.?window|5.?hour|five.?hour|7.?day|seven.?day|weekly.?limit/i,DM="claude-haiku-4-5-20251001",OM=1e3,CM=.7,LM=`You extract pricing and rate-limit changes from AI provider release notes.
|
|
1343
|
+
`);return e.json({memories:[...m]})});bn.get("/memories/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(F).where(Yn(it(F.id,n),it(F.userId,t))).limit(1);return r?e.json(r):e.json({error:"not found"},404)});bn.post("/memories",async e=>{let t=e.get("userId"),n=aM.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 Yh(a??null),[p]=await u.select({orgId:T.activeOrgId}).from(T).where(it(T.id,t)).limit(1),[f]=await u.insert(F).values({userId:t,orgId:p?.orgId??null,projectId:l,kind:r,title:o,body:s,source:d??"manual",status:"active"}).returning();return e.json(f,201)});bn.patch("/memories/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=cM.safeParse(await e.req.json().catch(()=>({})));if(!r.success)return e.json({error:"invalid body",details:r.error.flatten()},400);let[o]=await u.select().from(F).where(Yn(it(F.id,n),it(F.userId,t))).limit(1);if(!o)return e.json({error:"not found"},404);let{kind:s,title:i,body:a,status: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(F).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(Yn(it(F.id,n),it(F.userId,t))).returning();return e.json(p)});bn.delete("/memories/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.update(F).set({status:"archived",updatedAt:new Date}).where(Yn(it(F.id,n),it(F.userId,t))).returning({id:F.id,status:F.status});return r?e.json({ok:!0,id:r.id,status:r.status}):e.json({error:"not found"},404)});var dM=dt.object({externalSessionId:dt.string().min(1),projectPath:dt.string().optional()});bn.post("/memories/:id/exposures",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=dM.safeParse(await e.req.json().catch(()=>({})));if(!r.success)return e.json({error:"invalid body",details:r.error.flatten()},400);let[o]=await u.select({id:F.id,version:F.version,projectId:F.projectId}).from(F).where(Yn(it(F.id,n),it(F.userId,t))).limit(1);return o?(await u.insert(mu).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 uM=dt.object({taskPrompt:dt.string().min(1).max(8e3),expectations:dt.array(dt.string().min(1)).min(1).max(20),trials:dt.number().int().min(1).max(50).default(10),model:dt.string().min(1).max(100).optional()});bn.post("/memories/:id/experiments",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=uM.safeParse(await e.req.json().catch(()=>({})));if(!r.success)return e.json({error:"invalid body",details:r.error.flatten()},400);let[o]=await u.select({id:F.id,version:F.version}).from(F).where(Yn(it(F.id,n),it(F.userId,t))).limit(1);if(!o)return e.json({error:"not found"},404);let[s]=await u.insert(Mt).values({memoryId:o.id,userId:t,memoryVersion:o.version,taskPrompt:r.data.taskPrompt,expectations:r.data.expectations,trials:r.data.trials,model:r.data.model??null,status:"pending"}).returning(),{noLiveWorker:i}=await vI({experimentId:s.id,userId:t});return e.json({experiment:s,noLiveWorker:i},201)});bn.get("/memories/:id/experiments",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:F.id}).from(F).where(Yn(it(F.id,n),it(F.userId,t))).limit(1);if(!r)return e.json({error:"not found"},404);let o=await u.select().from(Mt).where(Yn(it(Mt.memoryId,n),it(Mt.userId,t))).orderBy(Rp(Mt.createdAt)).limit(20);return e.json({experiments:o})});bn.get("/memory-experiments/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(Mt).where(Yn(it(Mt.id,n),it(Mt.userId,t))).limit(1);return r?e.json(r):e.json({error:"not found"},404)});var lM=dt.object({status:dt.enum(["running","completed","failed"]),error:dt.string().max(1e3).nullable().optional(),result:dt.record(dt.unknown()).optional()});bn.patch("/memory-experiments/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=lM.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:Mt.id,status:Mt.status}).from(Mt).where(Yn(it(Mt.id,n),it(Mt.userId,t))).limit(1);if(!a)return e.json({error:"not found"},404);if(a.status==="completed"||a.status==="failed")return e.json({error:`experiment is already terminal (status='${a.status}')`,code:"INVALID_STATE"},409);let d=o==="completed"||o==="failed",[l]=await u.update(Mt).set({status:o,...s!==void 0?{error:s}:{},...i!==void 0?{result:i}:{},...o==="running"?{startedAt:new Date}:{},...d?{completedAt:new Date}:{}}).where(Yn(it(Mt.id,n),it(Mt.userId,t))).returning();return e.json(l)});D();import{randomBytes as pM,createHash as mM}from"node:crypto";import{Hono as fM}from"hono";import{z as _E}from"zod";import{eq as kp,and as gM,isNull as hM}from"drizzle-orm";var wa=new fM;function _M(){let n=`rm_${pM(32).toString("base64url")}`,r=mM("sha256").update(n).digest("hex"),o=n.slice(0,11);return{plaintext:n,hash:r,prefix:o}}c(_M,"generateApiKey");var yM=_E.object({name:_E.string().min(1).max(100)});wa.post("/auth/api-keys",async e=>{let t=e.get("userId"),n=await e.req.json(),r=yM.parse(n),{plaintext:o,hash:s,prefix:i}=_M(),[a]=await u.insert(Ae).values({userId:t,name:r.name,keyHash:s,keyPrefix:i}).returning();return e.json({id:a.id,name:a.name,key:o,keyPrefix:i,createdAt:a.createdAt},201)});wa.get("/auth/api-keys",async e=>{let t=e.get("userId"),n=await u.select({id:Ae.id,name:Ae.name,keyPrefix:Ae.keyPrefix,lastUsedAt:Ae.lastUsedAt,expiresAt:Ae.expiresAt,revokedAt:Ae.revokedAt,createdAt:Ae.createdAt}).from(Ae).where(kp(Ae.userId,t)).orderBy(Ae.createdAt);return e.json(n)});wa.delete("/auth/api-keys/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:Ae.id}).from(Ae).where(gM(kp(Ae.id,n),kp(Ae.userId,t),hM(Ae.revokedAt)));return r?(await u.update(Ae).set({revokedAt:new Date}).where(kp(Ae.id,n)),e.json({revoked:!0})):e.json({error:"API key not found"},404)});D();import{Hono as wM}from"hono";import{z as Qr}from"zod";import{eq as Pt,and as Zr,isNull as vM,sql as Xh}from"drizzle-orm";import{randomUUID as Qh}from"node:crypto";var eo=new wM;eo.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(Zr(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(Zr(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)});eo.get("/eval-targets/:id/conversations",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(He).where(Zr(Pt(He.evalTargetId,n),Pt(He.userId,t),Pt(He.status,"active")));return r?e.json(r):e.json(null)});var IM=Qr.object({content:Qr.string().min(1).max(5e3)});eo.post("/eval-conversations/:id/messages",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=IM.parse(await e.req.json()),[o]=await u.select().from(He).where(Zr(Pt(He.id,n),Pt(He.userId,t)));if(!o)return e.json({error:"Conversation not found"},404);let s=Qh(),i={id:s,role:"user",content:r.content,createdAt:new Date().toISOString()};await u.update(He).set({messages:Xh`${He.messages} || ${JSON.stringify([i])}::jsonb`,updatedAt:new Date}).where(Pt(He.id,n));let a={type:"conversation",conversationId:n,messageId:s,messageContent:r.content},{id:d,noLiveWorker:l}=await Ot({taskName:"process_conversation",payload:{evalTargetId:o.evalTargetId,config:a},userId:t,mirror:{userId:t,evalTargetId:o.evalTargetId,config:a}});return e.json({message:i,jobId:d,noLiveWorker:l},201)});var bM=Qr.object({content:Qr.string(),type:Qr.enum(["text","status","results","proposal","applied","generated","comparison"]).default("text"),data:Qr.record(Qr.unknown()).optional()});eo.post("/eval-conversations/:id/messages/assistant",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=bM.parse(await e.req.json()),o={id:Qh(),role:"assistant",content:r.content,type:r.type,data:r.data,createdAt:new Date().toISOString()};return await u.update(He).set({messages:Xh`${He.messages} || ${JSON.stringify([o])}::jsonb`,updatedAt:new Date}).where(Zr(Pt(He.id,n),Pt(He.userId,t))),e.json(o,201)});eo.get("/eval-conversations/:id/messages",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=e.req.query("after"),[o]=await u.select().from(He).where(Zr(Pt(He.id,n),Pt(He.userId,t)));if(!o)return e.json({error:"Conversation not found"},404);let s=o.messages;if(r){let i=s.filter(a=>a.createdAt>r);return e.json(i)}return e.json(s)});var EM=Qr.object({messageId:Qr.string().uuid()});eo.post("/eval-conversations/:id/apply-proposal",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=EM.parse(await e.req.json()),[o]=await u.select().from(He).where(Zr(Pt(He.id,n),Pt(He.userId,t)));if(!o)return e.json({error:"Conversation not found"},404);let i=o.messages.find(f=>f.id===r.messageId&&f.type==="proposal");if(!i?.data?.proposedContent)return e.json({error:"Proposal message not found or has no content"},400);let[a]=await u.select().from(k).where(Zr(Pt(k.id,o.evalTargetId),Pt(k.userId,t)));if(!a)return e.json({error:"Target not found"},404);let[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(Zr(Pt(Ee.evalTargetId,a.id),vM(Ee.retiredAt)));l.length>0&&await u.insert(Ee).values(l.map(f=>({evalTargetId:d.id,name:f.name,prompt:f.prompt,expectedOutput:f.expectedOutput,files:f.files,expectations:f.expectations})));let p={id:Qh(),role:"assistant",content:`Applied changes \u2014 created v${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:Xh`${He.messages} || ${JSON.stringify([p])}::jsonb`,updatedAt:new Date}).where(Pt(He.id,n)),e.json({newTarget:d,message:p})});D();import*as va from"node:fs";import*as zs from"node:path";import{createHash as AM}from"node:crypto";import{fileURLToPath as SM}from"node:url";import{createRequire as xM}from"node:module";import{Hono as TM}from"hono";import{z as vt}from"zod";import{eq as Ws,desc as RM,and as kM,sql as NM}from"drizzle-orm";var jM=zs.dirname(SM(import.meta.url)),Bo=new TM,Np=null,jp=null;function PM(){let e=process.env.RULEMETRIC_SKILLS_REGISTRY_PATH;if(e&&va.existsSync(e))return e;try{let n=xM(import.meta.url),r=zs.dirname(n.resolve("@rulemetric/skills-registry/package.json")),o=zs.join(r,"registry.json");if(va.existsSync(o))return o}catch{}let t=zs.resolve(jM,"../../../../packages/skills-registry/registry.json");return va.existsSync(t)?t:null}c(PM,"resolveRegistryPath");function yE(){if(Np)return Np;let e=PM();return e?(Np=JSON.parse(va.readFileSync(e,"utf-8")),Np):null}c(yE,"loadRegistry");function DM(){if(jp)return jp;let e=yE();return e?(jp={version:e.version,generatedAt:e.generatedAt,skills:e.skills.map(({content:t,...n})=>n)},jp):null}c(DM,"loadRegistryIndex");Bo.get("/skills",e=>{let t=DM();return t?e.json(t):e.json({error:"Skills registry not found"},404)});Bo.post("/skills/publish",async e=>{let t=e.get("userId"),n=await e.req.json();if(!n.id||!n.name||!n.content)return e.json({error:"Missing required fields: id, name, content"},400);if(n.content.trim().length<20)return e.json({error:"Content too short (minimum 20 characters)"},400);let[r]=await u.insert(go).values({skillId:n.id,name:n.name,description:n.description,category:n.category,tools:n.tools,tags:n.tags,content:n.content,submittedBy:t}).returning({id:go.id});return e.json({id:r.id,skillId:n.id,message:`Skill "${n.name}" submitted for review. It will appear in the registry after approval.`},201)});Bo.get("/skills/submissions/approved",async e=>{let n=(await u.select().from(go).where(Ws(go.status,"approved")).orderBy(RM(go.createdAt))).map(r=>({id:r.skillId,name:r.name,description:r.description,category:r.category,tags:r.tags??[],tools:r.tools,source:{repo:"community",path:`published/${r.skillId}.md`,url:"",license:"MIT"},content:r.content,popularity:{installs:0},updatedAt:r.updatedAt?.toISOString()??new Date().toISOString()}));return e.json(n)});var wE=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()}),Hse=vt.object({skills:vt.array(wE).max(5e3)});Bo.post("/skills/sync-public",async e=>{let t=process.env.RULEMETRIC_REGISTRY_BOT_TOKEN;if(!t)return e.json({error:"Registry bot token not configured"},503);let n=e.req.header("authorization")??"";if((n.startsWith("Bearer ")?n.slice(7):"")!==t)return e.json({error:"Invalid bot token"},401);let o=await e.req.json(),s=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,f=0;for(let _ of i){let v=wE.safeParse(_);if(!v.success){console.warn("[sync-public] Skipping invalid skill entry:",JSON.stringify(v.error.issues)),f++;continue}let g=v.data,m=AM("sha256").update(g.content).digest("hex"),w=`public_skill::${g.source.repo}::${g.id}`,I=g.updatedAt??"1.0.0",[b]=await u.select({id:h.id,contentHash:h.contentHash,popularityScore:h.popularityScore,sourceUpdatedAt:h.sourceUpdatedAt,frontmatter:h.frontmatter,description:h.description}).from(h).where(kM(Ws(h.name,g.id),Ws(h.scope,"public"))),A=g.popularity&&Math.max(g.popularity.stars??0,g.popularity.installs??0)||null,E=g.sourceUpdatedAt?new Date(g.sourceUpdatedAt):null,S=E&&!Number.isNaN(E.getTime())?E:null;if(b)if(b.contentHash!==m){let O=!1;for(let W=0;W<=4;W++)try{await u.transaction(async N=>{await N.select({id:h.id}).from(h).where(Ws(h.id,b.id)).for("update"),await N.update(h).set({description:g.description||g.name,content:g.content,contentHash:m,version:I,upstreamVersion:I,popularityScore:A,sourceUpdatedAt:S,frontmatter:{name:g.name,source:g.source,category:g.category??null,popularity:g.popularity??null,kind:g.kind??"skill"},updatedAt:new Date}).where(Ws(h.id,b.id));let[U]=await N.select({max:NM`coalesce(max(${xe.versionNumber}), 0)`}).from(xe).where(Ws(xe.instructionId,b.id));await N.insert(xe).values({instructionId:b.id,versionNumber:(U?.max??0)+1,content:g.content,frontmatter:{name:g.name,source:g.source,category:g.category??null},changeSummary:`Synced from registry (${I})`})}),O=!0;break}catch(N){if(N.cause?.code==="23505"){if(W<4)continue;break}throw N}if(!O)continue;d++,p++}else{let R=b.sourceUpdatedAt?.getTime()??null,O=S?.getTime()??null,W=b.popularityScore!==A,N=S!==null&&R!==O,U=b.frontmatter??{},q=g.kind??"skill",H=U.kind!==q,Y=g.description||g.name,ce=b.description!==Y,V=U.name!==g.name;(W||N||H||ce||V)&&await u.update(h).set({...W?{popularityScore:A}:{},...N?{sourceUpdatedAt:S}:{},...ce?{description:Y}:{},...H||V?{frontmatter:{...U,kind:q,name:g.name}}:{}}).where(Ws(h.id,b.id)),l++}else{let[R]=await u.insert(h).values({name:g.id,description:g.description||g.name,type:"skill",scope:"public",scopeRef:null,version:I,content:g.content,frontmatter:{name:g.name,source:g.source,category:g.category??null,popularity:g.popularity??null,kind:g.kind??"skill"},tags:g.tags??null,contentHash:m,contextIdentity:w,upstreamVersion:I,popularityScore:A,sourceUpdatedAt:S}).returning({id:h.id});R&&(a++,await u.insert(xe).values({instructionId:R.id,versionNumber:1,content:g.content,frontmatter:{name:g.name,source:g.source,category:g.category??null},changeSummary:"Initial sync from public registry"}),p++)}}return e.json({inserted:a,updated:d,unchanged:l,versionsCreated:p,skipped:f})});Bo.get("/skills/:id",e=>{let t=yE();if(!t?.skills)return e.json({error:"Skills registry not found"},404);let n=t.skills.find(r=>r.id===e.req.param("id"));return n?e.json(n):e.json({error:"Skill not found"},404)});D();import{Hono as VM}from"hono";import{desc as JM,eq as KM}from"drizzle-orm";D();import{eq as IE,and as FM}from"drizzle-orm";D();var OM=/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,CM="claude-haiku-4-5-20251001",LM=1e3,MM=.7,$M=`You extract pricing and rate-limit changes from AI provider release notes.
|
|
1297
1344
|
Return a JSON object: {
|
|
1298
1345
|
"observations": [
|
|
1299
1346
|
{
|
|
@@ -1308,43 +1355,43 @@ Return a JSON object: {
|
|
|
1308
1355
|
}
|
|
1309
1356
|
Only emit observations if the release notes EXPLICITLY state a numeric value.
|
|
1310
1357
|
Do NOT speculate. Do NOT emit observations for "increased by X%" without an absolute number.
|
|
1311
|
-
Return { "observations": [] } if nothing concrete.`;function
|
|
1358
|
+
Return { "observations": [] } if nothing concrete.`;function qM(){let e=process.env.ANTHROPIC_API_KEY;if(!e)return null;let t=Dc("anthropic",e);return async n=>{let r=await t.complete(n,{model:CM,maxTokens:LM,temperature:0});return{text:r.text,usage:{inputTokens:r.usage?.inputTokens??0,outputTokens:r.usage?.outputTokens??0}}}}c(qM,"defaultLlm");async function UM(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(UM,"defaultObserve");function HM(e){return`${$M}
|
|
1312
1359
|
|
|
1313
1360
|
Release notes (harness=${e.harness}, version=${e.version}):
|
|
1314
1361
|
|
|
1315
|
-
${e.body??""}`}c(
|
|
1316
|
-
`);for(let s of o){let i=s.trim();if(!i.startsWith("- ")&&!i.startsWith("* "))continue;let a=i.replace(/^[-*]\s+/,"").trim();if(!a)continue;let u=a.toLowerCase();u.startsWith("security:")||u.includes("security fix")||u.includes("cve-")?r.push(a):u.startsWith("fixed ")||u.startsWith("fix ")||u.startsWith("fixed:")?n.push(a):t.push(a)}return{features:t,fixes:n,security:r}}c(FM,"parseReleaseBody");async function Pm(e){let t=e?bE.filter(o=>o.harness===e):bE,n=0,r=0;for(let o of t){let s=`https://api.github.com/repos/${o.repo}/releases?per_page=100`,i={Accept:"application/vnd.github+json"};process.env.GITHUB_TOKEN&&(i.Authorization=`Bearer ${process.env.GITHUB_TOKEN}`);let a=await fetch(s,{headers:i});if(!a.ok)continue;let u=await a.json();r+=u.length;for(let l of u){if(BM(l))continue;let m=FM(l.body??"");if((await d.select({id:$t.id}).from($t).where(HM(IE($t.harness,o.harness),IE($t.version,l.tag_name)))).length===0){await d.insert($t).values({harness:o.harness,version:l.tag_name,publishedAt:new Date(l.published_at),title:l.name,body:l.body,categories:m,url:l.html_url}),n++;try{await vE({harness:o.harness,version:l.tag_name,url:l.html_url,publishedAt:new Date(l.published_at),body:l.body})}catch(_){console.warn("release notes extraction failed:",_)}}}}return{synced:n,total:r}}c(Pm,"syncHarnessReleases");var xu=new WM;xu.get("/harness-releases",async e=>{let t=e.req.query("harness"),n=Math.min(Number(e.req.query("limit")??50),100),r=t?VM($t.harness,t):void 0,o=await d.select({id:$t.id,harness:$t.harness,version:$t.version,publishedAt:$t.publishedAt,title:$t.title,categories:$t.categories,url:$t.url}).from($t).where(r).orderBy(zM($t.publishedAt)).limit(n);return e.json(o)});xu.post("/harness-releases/sync",async e=>{let t=await e.req.json().catch(()=>({})),n=await Pm(t.harness);return e.json(n)});D();import{Hono as JM}from"hono";import{and as Dm,desc as KM,eq as Ia,isNull as Zh,sql as GM}from"drizzle-orm";var ba=new JM;ba.get("/notifications",async e=>{let t=e.get("userId"),n=Math.min(parseInt(e.req.query("limit")??"20",10),100),r=parseInt(e.req.query("offset")??"0",10),s=e.req.query("unread")==="true"?Dm(Ia(Rt.userId,t),Zh(Rt.readAt)):Ia(Rt.userId,t),i=await d.select().from(Rt).where(s).orderBy(KM(Rt.createdAt)).limit(n).offset(r),[{count:a}]=await d.select({count:GM`count(*)::int`}).from(Rt).where(Dm(Ia(Rt.userId,t),Zh(Rt.readAt)));return e.json({items:i,unreadCount:a})});ba.post("/notifications/:id/read",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await d.update(Rt).set({readAt:new Date}).where(Dm(Ia(Rt.id,t),Ia(Rt.userId,n))).returning();return r?e.json(r):e.json({error:"Not found"},404)});ba.post("/notifications/read-all",async e=>{let t=e.get("userId");return await d.update(Rt).set({readAt:new Date}).where(Dm(Ia(Rt.userId,t),Zh(Rt.readAt))),e.json({success:!0})});D();import{Hono as YM}from"hono";import{z as sn}from"zod";import{eq as Dr,and as Om,desc as XM,ne as QM}from"drizzle-orm";var Fo=new YM;function ZM(e){let t=e.terminalTarget;if(!t||typeof t!="object")return null;let n=t;return n.kind!=="tmux"||typeof n.target!="string"||typeof n.attachCommand!="string"?null:{sessionId:typeof e.sessionId=="string"?e.sessionId:void 0,terminalTarget:{kind:"tmux",target:n.target,attachCommand:n.attachCommand,live:typeof n.live=="boolean"?n.live:void 0}}}c(ZM,"parseTerminalTargetResult");async function e$(e){let t=ZM(e.result);if(!t?.terminalTarget)return;let n=e.config&&typeof e.config=="object"?e.config:{},r=typeof n.projectPath=="string"?n.projectPath:null,o=typeof n.resumeSessionId=="string"?n.resumeSessionId:null,[s]=o?await d.select({id:y.id}).from(y).where(Om(Dr(y.userId,e.userId),Dr(y.externalSessionId,o))).limit(1):[];await d.insert(Ze).values({userId:e.userId,sessionId:s?.id??null,externalSessionId:o,kind:"tmux",target:t.terminalTarget.target,status:t.terminalTarget.live===!1?"unknown":"active",attachCommand:t.terminalTarget.attachCommand,projectPath:r,metadata:{launchJobId:e.jobId,launcherSessionId:t.sessionId}}).onConflictDoUpdate({target:[Ze.userId,Ze.target],set:{sessionId:s?.id??null,externalSessionId:o,status:t.terminalTarget.live===!1?"unknown":"active",attachCommand:t.terminalTarget.attachCommand,projectPath:r,metadata:{launchJobId:e.jobId,launcherSessionId:t.sessionId},lastSeenAt:new Date,updatedAt:new Date}})}c(e$,"upsertTerminalTargetFromLaunchResult");var t$=sn.object({tool:sn.string().min(1),config:sn.object({projectPath:sn.string().min(1),prompt:sn.string().optional(),systemPrompt:sn.string().optional(),model:sn.string().optional(),mode:sn.enum(["headless","interactive"]).default("interactive"),timeout:sn.number().int().positive().optional(),resumeSessionId:sn.string().optional()})});Fo.post("/launch-jobs",async e=>{let t=e.get("userId"),n=await e.req.json(),r=t$.parse(n),{id:o,noLiveWorker:s}=await Ot({taskName:"process_launch",payload:{tool:r.tool,config:r.config},userId:t,mirror:{userId:t,tool:r.tool,config:r.config}}),[i]=await d.select().from(ue).where(Dr(ue.id,o));return e.json({...i,noLiveWorker:s},201)});Fo.get("/launch-jobs",async e=>{let t=e.get("userId"),n=Number(e.req.query("limit")??50),r=await d.select().from(ue).where(Dr(ue.userId,t)).orderBy(XM(ue.createdAt)).limit(n);return e.json(r)});var n$=sn.object({status:sn.enum(["running","completed","failed"]).optional(),attempts:sn.number().int().nonnegative().optional(),error:sn.string().optional(),result:sn.record(sn.unknown()).optional()});Fo.patch("/launch-jobs/:id/state",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=n$.parse(await e.req.json()),o={updatedAt:new Date};r.attempts!==void 0&&(o.attempts=r.attempts),r.status&&(o.status=r.status),r.error&&(o.error=r.error),r.result!==void 0&&(o.result=r.result),(r.status==="completed"||r.status==="failed")&&(o.completedAt=new Date);let[s]=await d.update(ue).set(o).where(Om(Dr(ue.id,n),Dr(ue.userId,t),QM(ue.status,"cancelled"))).returning();if(!s){let[i]=await d.select().from(ue).where(Om(Dr(ue.id,n),Dr(ue.userId,t)));return i?e.json(i):e.json({error:"Job not found"},404)}return r.result!==void 0&&await e$({userId:t,jobId:n,config:s.config,result:r.result}),e.json(s)});Fo.post("/launch-jobs/:id/cancel",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.update(ue).set({status:"cancelled",updatedAt:new Date}).where(Om(Dr(ue.id,n),Dr(ue.userId,t))).returning();return r?e.json(r):e.json({error:"Job not found"},404)});Fo.get("/launchers",async e=>{let{getAvailableLaunchers:t}=await Promise.resolve().then(()=>(Vl(),Ob));return e.json(t())});D();import{Hono as r$}from"hono";import{z as Xn}from"zod";import{eq as Ne,and as Kt,desc as Lm,inArray as Cm,isNull as o$,ne as s$}from"drizzle-orm";Vl();var Or=new r$,i$=Xn.object({tool:Xn.string().min(1),model:Xn.string().optional(),label:Xn.string().optional()}),a$=Xn.object({title:Xn.string().optional(),projectPath:Xn.string().min(1),gitRemote:Xn.string().optional(),baseBranch:Xn.string().optional(),prompt:Xn.string().optional(),autoWorktree:Xn.boolean().optional(),sessions:Xn.array(i$).min(1).max(8)});function c$(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/(^-|-$)/g,"")||"tool"}c(c$,"sanitizeTool");var u$=new Set(["pending","claimed","running"]);var d$=1800*1e3;function EE(e,t){if(e==="cancelled")return!0;if(e!=="completed"&&e!=="failed"||t==null)return!1;let n=t instanceof Date?t.getTime():Date.parse(t);return Number.isFinite(n)?Date.now()-n>d$:!1}c(EE,"canSkipRollup");function AE(e,t,n){if(e==="cancelled")return"cancelled";let r=t.length>0,o=t.some(a=>a.endedAt==null),s=n.some(a=>u$.has(a.status));return n.length>0&&n.every(a=>a.status==="failed")&&!r?"failed":o||s&&r?"running":r&&!o&&!s?"completed":"pending"}c(AE,"rollupRunStatus");async function SE(e){if(e.rolled===e.stored)return;let t=e.rolled==="completed"||e.rolled==="failed"||e.rolled==="cancelled",n={status:e.rolled,updatedAt:new Date};t&&!e.hadCompletedAt&&(n.completedAt=new Date);try{await d.update(Z).set(n).where(Kt(Ne(Z.id,e.runId),Ne(Z.userId,e.userId),s$(Z.status,"cancelled")))}catch{}}c(SE,"persistRolledUpStatus");function l$(e){return Array.isArray(e)?e.length:e&&typeof e=="object"?Object.values(e).reduce((t,n)=>t+(typeof n=="number"&&n>0?n:0),0):0}c(l$,"frictionCount");async function m$(e,t){if(!e||typeof e!="object")return null;let n=e,r="claude-sonnet-4-6",o=$o(r),s={input_tokens:n.input_tokens??0,output_tokens:n.output_tokens??0,cache_read_input_tokens:n.cache_read_input_tokens??0,cache_creation_5m:n.cache_creation_5m??0,cache_creation_1h:n.cache_creation_1h??0,cache_creation_input_tokens:n.cache_creation_input_tokens??0},i=await Xr(d,s,r,t,o);return i?{...i,estimated:!0}:null}c(m$,"deriveSessionCost");async function xE(e,t){let[n]=await d.select({id:Z.id,autoWorktree:Z.autoWorktree}).from(Z).where(Kt(Ne(Z.id,e),Ne(Z.userId,t))).limit(1);if(!n||!n.autoWorktree)return{linked:0};let r=await d.select({config:ue.config,result:ue.result}).from(ue).where(Kt(Ne(ue.runId,e),Ne(ue.userId,t))),o=new Set;for(let i of r){let a=i.result??{};typeof a.worktreePath=="string"&&a.worktreePath&&o.add(a.worktreePath);let u=i.config??{};u.worktree?.create&&typeof u.worktree.branch=="string"&&typeof u.projectPath=="string"&&o.add(zl({repoRoot:u.projectPath,branch:u.worktree.branch}))}return o.size===0?{linked:0}:{linked:(await d.update(y).set({runId:e}).where(Kt(Ne(y.userId,t),o$(y.runId),Cm(y.projectPath,[...o]))).returning({id:y.id})).length}}c(xE,"linkRunSessions");Or.post("/runs",async e=>{let t=e.get("userId"),n=await e.req.json(),r=a$.parse(n),o=await Ro(t,null),s=r.autoWorktree??!0,i=r.baseBranch??"HEAD",a=null;if(r.projectPath){let[f]=await d.select({projectId:ye.projectId}).from(ye).where(Ne(ye.path,r.projectPath)).orderBy(Lm(ye.lastSeen)).limit(1);a=f?.projectId??null}if(!a&&r.gitRemote){let[f]=await d.select({id:C.id}).from(C).where(Ne(C.gitRemoteUrl,r.gitRemote)).limit(1);a=f?.id??null}let[u]=await d.insert(Z).values({userId:t,orgId:o,projectPath:r.projectPath,projectId:a,gitRemote:r.gitRemote??null,baseBranch:r.baseBranch??null,title:r.title??null,prompt:r.prompt??null,toolSpec:r.sessions,autoWorktree:s,status:"pending",sessionCount:r.sessions.length}).returning(),l=u.id.slice(0,8),m=!1;try{for(let f=0;f<r.sessions.length;f++){let _=r.sessions[f],v=`rm/run-${l}/s${f}-${c$(_.tool)}`,h={projectPath:r.projectPath,prompt:r.prompt,systemPrompt:void 0,model:_.model,mode:"interactive",worktree:{create:s,branch:v,baseRef:i},runId:u.id},p=await Ot({taskName:"process_launch",userId:t,payload:{tool:_.tool,config:h},mirror:{userId:t,tool:_.tool,config:h},runId:u.id});m=m||p.noLiveWorker}}catch(f){return await d.update(Z).set({status:"failed",updatedAt:new Date}).where(Ne(Z.id,u.id)),await d.update(ue).set({status:"cancelled",updatedAt:new Date}).where(Kt(Ne(ue.runId,u.id),Ne(ue.status,"pending"))),e.json({error:"Failed to enqueue all launch jobs",detail:f instanceof Error?f.message:String(f),run:{...u,status:"failed"}},500)}return e.json({run:u,noLiveWorker:m},201)});Or.get("/runs",async e=>{let t=e.get("userId"),n=Number(e.req.query("limit")),r=Math.min(Math.max(Number.isFinite(n)?n:50,1),100),o=Number(e.req.query("offset")),s=Math.max(Number.isFinite(o)?o:0,0),i=e.req.query("projectId"),a=i?Kt(Ne(Z.userId,t),Ne(Z.projectId,i)):Ne(Z.userId,t),u=await d.select({id:Z.id,userId:Z.userId,orgId:Z.orgId,projectId:Z.projectId,projectPath:Z.projectPath,gitRemote:Z.gitRemote,baseBranch:Z.baseBranch,title:Z.title,toolSpec:Z.toolSpec,autoWorktree:Z.autoWorktree,status:Z.status,sessionCount:Z.sessionCount,createdAt:Z.createdAt,updatedAt:Z.updatedAt,completedAt:Z.completedAt}).from(Z).where(a).orderBy(Lm(Z.createdAt)).limit(r).offset(s),l=u.filter(f=>!EE(f.status,f.completedAt)),m=l.map(f=>f.id);if(m.length>0){let[f,_]=await Promise.all([d.select({runId:y.runId,endedAt:y.endedAt}).from(y).where(Kt(Ne(y.userId,t),Cm(y.runId,m))),d.select({runId:ue.runId,status:ue.status}).from(ue).where(Kt(Ne(ue.userId,t),Cm(ue.runId,m)))]),v=new Map;for(let p of f){if(!p.runId)continue;let w=v.get(p.runId)??[];w.push({endedAt:p.endedAt}),v.set(p.runId,w)}let h=new Map;for(let p of _){if(!p.runId)continue;let w=h.get(p.runId)??[];w.push({status:p.status}),h.set(p.runId,w)}await Promise.all(l.map(async p=>{let w=AE(p.status,v.get(p.id)??[],h.get(p.id)??[]);w!==p.status&&(await SE({runId:p.id,userId:t,stored:p.status,rolled:w,hadCompletedAt:p.completedAt!=null}),p.status=w,p.completedAt==null&&(w==="completed"||w==="failed"||w==="cancelled")&&(p.completedAt=new Date))}))}return e.json({runs:u})});Or.get("/runs/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select().from(Z).where(Kt(Ne(Z.id,n),Ne(Z.userId,t))).limit(1);if(!r)return e.json({error:"Run not found"},404);try{await xE(n,t)}catch{}let o=await d.select({id:y.id,tool:y.tool,gitBranch:y.gitBranch,projectPath:y.projectPath,startedAt:y.startedAt,endedAt:y.endedAt,eventCount:y.eventCount,tokenUsage:y.tokenUsage,analysis:y.analysis}).from(y).where(Kt(Ne(y.runId,n),Ne(y.userId,t))).orderBy(Lm(y.startedAt)),s=o.map(w=>w.id);if(!EE(r.status,r.completedAt)){let w=await d.select({status:ue.status}).from(ue).where(Kt(Ne(ue.runId,n),Ne(ue.userId,t))),I=AE(r.status,o.map(b=>({endedAt:b.endedAt})),w);I!==r.status&&(await SE({runId:n,userId:t,stored:r.status,rolled:I,hadCompletedAt:r.completedAt!=null}),r.status=I,r.completedAt==null&&(I==="completed"||I==="failed"||I==="cancelled")&&(r.completedAt=new Date))}let i=s.length>0?await d.select({sessionId:se.sessionId,instructionId:g.id,name:g.name}).from(se).innerJoin(g,Ne(g.id,se.instructionId)).where(Cm(se.sessionId,s)):[],a=new Map;for(let w of s)a.set(w,[]);for(let w of i)a.get(w.sessionId)?.push({id:w.instructionId,name:w.name});let u=await Promise.all(o.map(async w=>{let I=w.analysis??{},b=typeof I.goalSummary=="string"?I.goalSummary:null,A=typeof I.outcome=="string"?I.outcome:null,E=I.friction??null,S=await m$(w.tokenUsage,w.startedAt??new Date);return{id:w.id,tool:w.tool,gitBranch:w.gitBranch,projectPath:w.projectPath,startedAt:w.startedAt,endedAt:w.endedAt,eventCount:w.eventCount,tokenUsage:w.tokenUsage,goalSummary:b,outcome:A,friction:E,cost:S,instructions:a.get(w.id)??[]}})),l=u.map(w=>({sessionId:w.id,score:w.outcome!=null?Si[w.outcome]??-1:-1,costUsd:w.cost?.totalUsd??Number.POSITIVE_INFINITY,frictionCount:l$(w.friction)})).sort((w,I)=>I.score!==w.score?I.score-w.score:w.costUsd!==I.costUsd?w.costUsd-I.costUsd:w.frictionCount-I.frictionCount).map((w,I)=>({sessionId:w.sessionId,rank:I+1,isWinner:I===0&&w.score>=0,score:w.score,costUsd:Number.isFinite(w.costUsd)?w.costUsd:null,frictionCount:w.frictionCount})),m=new Map,f=new Map;for(let w of i)m.set(w.instructionId,w.name),f.has(w.instructionId)||f.set(w.instructionId,new Set),f.get(w.instructionId).add(w.sessionId);let _=s.length,v=[],h=[];for(let[w,I]of f){let b=m.get(w)??"Unknown";_>0&&I.size===_?v.push({id:w,name:b}):h.push({id:w,name:b,sessionIds:[...I]})}let p=null;return r.autoWorktree?r.sessionCount>0&&u.length<r.sessionCount&&(p=`Only ${u.length} of ${r.sessionCount} expected sessions are attributed to this run so far \u2014 the comparison may be incomplete while sessions are still launching or being linked.`):p="This run did not auto-create per-session worktrees, so sessions are attributed only via the launch hook. Sessions from tools that do not run RuleMetric hooks may be missing from this comparison.",e.json({run:r,sessions:u,comparison:{ranking:l,instructionDiff:{shared:v,differing:h}},attributionCaveat:p})});Or.post("/runs/:id/link-sessions",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select({id:Z.id}).from(Z).where(Kt(Ne(Z.id,n),Ne(Z.userId,t))).limit(1);if(!r)return e.json({error:"Run not found"},404);let{linked:o}=await xE(n,t);return e.json({linked:o})});Or.get("/runs/:id/jobs",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select({id:Z.id}).from(Z).where(Kt(Ne(Z.id,n),Ne(Z.userId,t))).limit(1);if(!r)return e.json({error:"Run not found"},404);let o=await d.select({id:ue.id,runId:ue.runId,status:ue.status,tool:ue.tool}).from(ue).where(Kt(Ne(ue.runId,n),Ne(ue.userId,t))).orderBy(Lm(ue.createdAt));return e.json(o)});Or.post("/runs/:id/cancel",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select({id:Z.id}).from(Z).where(Kt(Ne(Z.id,n),Ne(Z.userId,t))).limit(1);if(!r)return e.json({error:"Run not found"},404);await d.update(ue).set({status:"cancelled",updatedAt:new Date}).where(Kt(Ne(ue.runId,n),Ne(ue.userId,t),Ne(ue.status,"pending")));let[o]=await d.update(Z).set({status:"cancelled",updatedAt:new Date}).where(Kt(Ne(Z.id,n),Ne(Z.userId,t))).returning();return e.json({run:o})});Or.post("/runs/:id/cleanup",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select({id:Z.id}).from(Z).where(Kt(Ne(Z.id,n),Ne(Z.userId,t))).limit(1);if(!r)return e.json({error:"Run not found"},404);let{noLiveWorker:o}=await yI({runId:n,userId:t});return e.json({enqueued:!0,noLiveWorker:o})});D();import{Hono as p$}from"hono";import{z as Vs}from"zod";import{and as Ea,desc as e_,eq as Zt,or as RE}from"drizzle-orm";var Js=new p$;function f$(e,t){return{liveSend:e?.kind==="tmux"&&e.status==="active"&&t,fallbackResume:!0,tmuxAvailable:e?.kind==="tmux"&&e.status!=="fallback_only",workerOnline:t}}c(f$,"capabilitiesFor");Js.get("/sessions/:id/terminal-target",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select({id:y.id,externalSessionId:y.externalSessionId}).from(y).where(Ea(Zt(y.id,n),Zt(y.userId,t))).limit(1);if(!r)return e.json({error:"Session not found"},404);let o=r.externalSessionId?RE(Zt(Ze.sessionId,r.id),Zt(Ze.externalSessionId,r.externalSessionId)):Zt(Ze.sessionId,r.id),[s]=await d.select().from(Ze).where(Ea(Zt(Ze.userId,t),o)).orderBy(e_(Ze.lastSeenAt)).limit(1),i=await Ui(t);return e.json({target:s??null,capabilities:f$(s??null,i),...s?{}:{reason:"no_target"}})});var TE=Vs.enum(["active","missing","unknown","fallback_only"]),g$=Vs.object({message:Vs.string().min(1).max(16*1024),delivery:Vs.enum(["live","fallback"]).default("live"),submit:Vs.boolean().optional().default(!0)});Js.post("/sessions/:id/send",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=g$.parse(await e.req.json()),[o]=await d.select({id:y.id,externalSessionId:y.externalSessionId,projectPath:y.projectPath}).from(y).where(Ea(Zt(y.id,n),Zt(y.userId,t))).limit(1);if(!o)return e.json({error:"Session not found"},404);let s=o.externalSessionId?RE(Zt(Ze.sessionId,o.id),Zt(Ze.externalSessionId,o.externalSessionId)):Zt(Ze.sessionId,o.id),[i]=await d.select().from(Ze).where(Ea(Zt(Ze.userId,t),Zt(Ze.status,"active"),s)).orderBy(e_(Ze.lastSeenAt)).limit(1);if(!i){if(r.delivery==="fallback"){if(!o.externalSessionId||!o.projectPath)return e.json({error:"Live target unavailable",code:"LIVE_TARGET_UNAVAILABLE"},409);let m={projectPath:o.projectPath,mode:"interactive",resumeSessionId:o.externalSessionId,prompt:r.message},f={tool:"claude_code",config:m},{id:_,noLiveWorker:v}=await Ot({taskName:"process_launch",payload:f,userId:t,mirror:{userId:t,tool:"claude_code",config:m}});return e.json({delivery:"fallback",job:{id:_,kind:"process_launch"},noLiveWorker:v},202)}return e.json({error:"Live target unavailable",code:"LIVE_TARGET_UNAVAILABLE",fallback:{available:!!(o.externalSessionId&&o.projectPath),action:"resume_terminal"}},409)}if(!await Ui(t))return e.json({error:"Worker offline",code:"WORKER_OFFLINE"},409);let u={sessionId:o.id,terminalTargetId:i.id,target:i.target,message:r.message,submit:r.submit},{id:l}=await Ot({taskName:"process_send_message",payload:u,userId:t,mirror:{userId:t,sessionId:o.id,terminalTargetId:i.id,target:i.target,message:r.message,submit:r.submit,delivery:"live"}});return e.json({delivery:"live",job:{id:l,kind:"process_send_message"},target:i},202)});var h$=Vs.object({status:TE,lastSeenAt:Vs.string().datetime().optional()});Js.patch("/terminal-targets/:id/status",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=h$.parse(await e.req.json()),o=r.lastSeenAt?new Date(r.lastSeenAt):new Date,s=new Date,[i]=await d.update(Ze).set({status:r.status,lastSeenAt:o,updatedAt:s}).where(Ea(Zt(Ze.id,n),Zt(Ze.userId,t))).returning();return i?e.json({target:i}):e.json({error:"Terminal target not found"},404)});Js.get("/terminal-targets",async e=>{let t=e.get("userId"),n=e.req.query("status"),r=n?TE.parse(n):null,o=await d.select().from(Ze).where(Ea(Zt(Ze.userId,t),...r?[Zt(Ze.status,r)]:[])).orderBy(e_(Ze.lastSeenAt)).limit(100);return e.json({targets:o})});import{Hono as n1}from"hono";D();import{Hono as v$}from"hono";import{z as Wo}from"zod";import{eq as no,asc as NE,sql as I$}from"drizzle-orm";D();import{eq as t_,and as _$}from"drizzle-orm";function vt(e){return async(t,n)=>{let r=t.get("userId");if(!r)return t.json({error:"Unauthenticated",code:"UNAUTHENTICATED"},401);let o=t.req.param("slug");if(!o)return t.json({error:"Missing org slug",code:"BAD_REQUEST"},400);let[s]=await d.select({id:Y.id,slug:Y.slug}).from(Y).where(t_(Y.slug,o));if(!s)return t.json({error:"Organization not found",code:"ORG_NOT_FOUND"},404);let[i]=await d.select({role:ee.role}).from(ee).where(_$(t_(ee.orgId,s.id),t_(ee.userId,r)));if(!i||!e.includes(i.role))return t.json({error:"Forbidden",code:"ORG_FORBIDDEN"},403);t.set("orgId",s.id),t.set("orgSlug",o),t.set("orgRole",i.role),await n()}}c(vt,"requireOrgRole");D();import{eq as kE,and as y$,sql as w$}from"drizzle-orm";var to=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Mm=w$`case ${ee.role}
|
|
1362
|
+
${e.body??""}`}c(HM,"buildPrompt");function BM(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(BM,"parseLlmJson");async function vE(e,t={}){let n=e.body??"";if(!OM.test(n))return{observations:[],llm_called:!1,reason:"no keywords matched"};let r=t.llm===void 0?qM():t.llm;if(!r)return console.warn("[harness-release-extractor] ANTHROPIC_API_KEY missing; skipping extraction"),{observations:[],llm_called:!1,reason:"no LLM available"};let o,s;try{let d=await r(HM(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=BM(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??UM;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:MM,provider:"anthropic"});return{observations:i,llm_called:!0,llm_tokens:{input:s.inputTokens,output:s.outputTokens}}}c(vE,"extractAndPostObservationsFromRelease");var bE=[{harness:"claude_code",repo:"anthropics/claude-code"},{harness:"codex",repo:"openai/codex"}];function WM(e){return e.prerelease===!0||/-(alpha|beta|rc)\b/i.test(e.tag_name)}c(WM,"isPrerelease");function zM(e){let t=[],n=[],r=[],o=e.split(`
|
|
1363
|
+
`);for(let s of o){let i=s.trim();if(!i.startsWith("- ")&&!i.startsWith("* "))continue;let a=i.replace(/^[-*]\s+/,"").trim();if(!a)continue;let 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(zM,"parseReleaseBody");async function Pp(e){let t=e?bE.filter(o=>o.harness===e):bE,n=0,r=0;for(let o of t){let s=`https://api.github.com/repos/${o.repo}/releases?per_page=100`,i={Accept:"application/vnd.github+json"};process.env.GITHUB_TOKEN&&(i.Authorization=`Bearer ${process.env.GITHUB_TOKEN}`);let a=await fetch(s,{headers:i});if(!a.ok)continue;let d=await a.json();r+=d.length;for(let l of d){if(WM(l))continue;let p=zM(l.body??"");if((await u.select({id:$t.id}).from($t).where(FM(IE($t.harness,o.harness),IE($t.version,l.tag_name)))).length===0){await u.insert($t).values({harness:o.harness,version:l.tag_name,publishedAt:new Date(l.published_at),title:l.name,body:l.body,categories:p,url:l.html_url}),n++;try{await vE({harness:o.harness,version:l.tag_name,url:l.html_url,publishedAt:new Date(l.published_at),body:l.body})}catch(_){console.warn("release notes extraction failed:",_)}}}}return{synced:n,total:r}}c(Pp,"syncHarnessReleases");var Td=new VM;Td.get("/harness-releases",async e=>{let t=e.req.query("harness"),n=Math.min(Number(e.req.query("limit")??50),100),r=t?KM($t.harness,t):void 0,o=await u.select({id:$t.id,harness:$t.harness,version:$t.version,publishedAt:$t.publishedAt,title:$t.title,categories:$t.categories,url:$t.url}).from($t).where(r).orderBy(JM($t.publishedAt)).limit(n);return e.json(o)});Td.post("/harness-releases/sync",async e=>{let t=await e.req.json().catch(()=>({})),n=await Pp(t.harness);return e.json(n)});D();import{Hono as GM}from"hono";import{and as Dp,desc as YM,eq as Ia,isNull as Zh,sql as XM}from"drizzle-orm";var ba=new GM;ba.get("/notifications",async e=>{let t=e.get("userId"),n=Math.min(parseInt(e.req.query("limit")??"20",10),100),r=parseInt(e.req.query("offset")??"0",10),s=e.req.query("unread")==="true"?Dp(Ia(Tt.userId,t),Zh(Tt.readAt)):Ia(Tt.userId,t),i=await u.select().from(Tt).where(s).orderBy(YM(Tt.createdAt)).limit(n).offset(r),[{count:a}]=await u.select({count:XM`count(*)::int`}).from(Tt).where(Dp(Ia(Tt.userId,t),Zh(Tt.readAt)));return e.json({items:i,unreadCount:a})});ba.post("/notifications/:id/read",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await u.update(Tt).set({readAt:new Date}).where(Dp(Ia(Tt.id,t),Ia(Tt.userId,n))).returning();return r?e.json(r):e.json({error:"Not found"},404)});ba.post("/notifications/read-all",async e=>{let t=e.get("userId");return await u.update(Tt).set({readAt:new Date}).where(Dp(Ia(Tt.userId,t),Zh(Tt.readAt))),e.json({success:!0})});D();import{Hono as QM}from"hono";import{z as sn}from"zod";import{eq as Dr,and as Op,desc as ZM,ne as e$}from"drizzle-orm";var Fo=new QM;function t$(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(t$,"parseTerminalTargetResult");async function n$(e){let t=t$(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(Op(Dr(y.userId,e.userId),Dr(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(n$,"upsertTerminalTargetFromLaunchResult");var r$=sn.object({tool:sn.string().min(1),config:sn.object({projectPath:sn.string().min(1),prompt:sn.string().optional(),systemPrompt:sn.string().optional(),model:sn.string().optional(),mode:sn.enum(["headless","interactive"]).default("interactive"),timeout:sn.number().int().positive().optional(),resumeSessionId:sn.string().optional()})});Fo.post("/launch-jobs",async e=>{let t=e.get("userId"),n=await e.req.json(),r=r$.parse(n),{id:o,noLiveWorker:s}=await Ot({taskName:"process_launch",payload:{tool:r.tool,config:r.config},userId:t,mirror:{userId:t,tool:r.tool,config:r.config}}),[i]=await u.select().from(ue).where(Dr(ue.id,o));return e.json({...i,noLiveWorker:s},201)});Fo.get("/launch-jobs",async e=>{let t=e.get("userId"),n=Number(e.req.query("limit")??50),r=await u.select().from(ue).where(Dr(ue.userId,t)).orderBy(ZM(ue.createdAt)).limit(n);return e.json(r)});var o$=sn.object({status:sn.enum(["running","completed","failed"]).optional(),attempts:sn.number().int().nonnegative().optional(),error:sn.string().optional(),result:sn.record(sn.unknown()).optional()});Fo.patch("/launch-jobs/:id/state",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=o$.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(Op(Dr(ue.id,n),Dr(ue.userId,t),e$(ue.status,"cancelled"))).returning();if(!s){let[i]=await u.select().from(ue).where(Op(Dr(ue.id,n),Dr(ue.userId,t)));return i?e.json(i):e.json({error:"Job not found"},404)}return r.result!==void 0&&await n$({userId:t,jobId:n,config:s.config,result:r.result}),e.json(s)});Fo.post("/launch-jobs/:id/cancel",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.update(ue).set({status:"cancelled",updatedAt:new Date}).where(Op(Dr(ue.id,n),Dr(ue.userId,t))).returning();return r?e.json(r):e.json({error:"Job not found"},404)});Fo.get("/launchers",async e=>{let{getAvailableLaunchers:t}=await Promise.resolve().then(()=>(Vl(),Ob));return e.json(t())});D();import{Hono as s$}from"hono";import{z as Xn}from"zod";import{eq as Ne,and as Kt,desc as Lp,inArray as Cp,isNull as i$,ne as a$}from"drizzle-orm";Vl();var Or=new s$,c$=Xn.object({tool:Xn.string().min(1),model:Xn.string().optional(),label:Xn.string().optional()}),d$=Xn.object({title:Xn.string().optional(),projectPath:Xn.string().min(1),gitRemote:Xn.string().optional(),baseBranch:Xn.string().optional(),prompt:Xn.string().optional(),autoWorktree:Xn.boolean().optional(),sessions:Xn.array(c$).min(1).max(8)});function u$(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/(^-|-$)/g,"")||"tool"}c(u$,"sanitizeTool");var l$=new Set(["pending","claimed","running"]);var p$=1800*1e3;function EE(e,t){if(e==="cancelled")return!0;if(e!=="completed"&&e!=="failed"||t==null)return!1;let n=t instanceof Date?t.getTime():Date.parse(t);return Number.isFinite(n)?Date.now()-n>p$:!1}c(EE,"canSkipRollup");function AE(e,t,n){if(e==="cancelled")return"cancelled";let r=t.length>0,o=t.some(a=>a.endedAt==null),s=n.some(a=>l$.has(a.status));return n.length>0&&n.every(a=>a.status==="failed")&&!r?"failed":o||s&&r?"running":r&&!o&&!s?"completed":"pending"}c(AE,"rollupRunStatus");async function SE(e){if(e.rolled===e.stored)return;let t=e.rolled==="completed"||e.rolled==="failed"||e.rolled==="cancelled",n={status:e.rolled,updatedAt:new Date};t&&!e.hadCompletedAt&&(n.completedAt=new Date);try{await u.update(ee).set(n).where(Kt(Ne(ee.id,e.runId),Ne(ee.userId,e.userId),a$(ee.status,"cancelled")))}catch{}}c(SE,"persistRolledUpStatus");function m$(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(m$,"frictionCount");async function f$(e,t){if(!e||typeof e!="object")return null;let n=e,r="claude-sonnet-4-6",o=$o(r),s={input_tokens:n.input_tokens??0,output_tokens:n.output_tokens??0,cache_read_input_tokens:n.cache_read_input_tokens??0,cache_creation_5m:n.cache_creation_5m??0,cache_creation_1h:n.cache_creation_1h??0,cache_creation_input_tokens:n.cache_creation_input_tokens??0},i=await Xr(u,s,r,t,o);return i?{...i,estimated:!0}:null}c(f$,"deriveSessionCost");async function xE(e,t){let[n]=await u.select({id:ee.id,autoWorktree:ee.autoWorktree}).from(ee).where(Kt(Ne(ee.id,e),Ne(ee.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(Kt(Ne(ue.runId,e),Ne(ue.userId,t))),o=new Set;for(let i of r){let a=i.result??{};typeof a.worktreePath=="string"&&a.worktreePath&&o.add(a.worktreePath);let d=i.config??{};d.worktree?.create&&typeof d.worktree.branch=="string"&&typeof d.projectPath=="string"&&o.add(zl({repoRoot:d.projectPath,branch:d.worktree.branch}))}return o.size===0?{linked:0}:{linked:(await u.update(y).set({runId:e}).where(Kt(Ne(y.userId,t),i$(y.runId),Cp(y.projectPath,[...o]))).returning({id:y.id})).length}}c(xE,"linkRunSessions");Or.post("/runs",async e=>{let t=e.get("userId"),n=await e.req.json(),r=d$.parse(n),o=await To(t,null),s=r.autoWorktree??!0,i=r.baseBranch??"HEAD",a=null;if(r.projectPath){let[f]=await u.select({projectId:ye.projectId}).from(ye).where(Ne(ye.path,r.projectPath)).orderBy(Lp(ye.lastSeen)).limit(1);a=f?.projectId??null}if(!a&&r.gitRemote){let[f]=await u.select({id:C.id}).from(C).where(Ne(C.gitRemoteUrl,r.gitRemote)).limit(1);a=f?.id??null}let[d]=await u.insert(ee).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 f=0;f<r.sessions.length;f++){let _=r.sessions[f],v=`rm/run-${l}/s${f}-${u$(_.tool)}`,g={projectPath:r.projectPath,prompt:r.prompt,systemPrompt:void 0,model:_.model,mode:"interactive",worktree:{create:s,branch:v,baseRef:i},runId:d.id},m=await Ot({taskName:"process_launch",userId:t,payload:{tool:_.tool,config:g},mirror:{userId:t,tool:_.tool,config:g},runId:d.id});p=p||m.noLiveWorker}}catch(f){return await u.update(ee).set({status:"failed",updatedAt:new Date}).where(Ne(ee.id,d.id)),await u.update(ue).set({status:"cancelled",updatedAt:new Date}).where(Kt(Ne(ue.runId,d.id),Ne(ue.status,"pending"))),e.json({error:"Failed to enqueue all launch jobs",detail:f instanceof Error?f.message:String(f),run:{...d,status:"failed"}},500)}return e.json({run:d,noLiveWorker:p},201)});Or.get("/runs",async e=>{let t=e.get("userId"),n=Number(e.req.query("limit")),r=Math.min(Math.max(Number.isFinite(n)?n:50,1),100),o=Number(e.req.query("offset")),s=Math.max(Number.isFinite(o)?o:0,0),i=e.req.query("projectId"),a=i?Kt(Ne(ee.userId,t),Ne(ee.projectId,i)):Ne(ee.userId,t),d=await u.select({id:ee.id,userId:ee.userId,orgId:ee.orgId,projectId:ee.projectId,projectPath:ee.projectPath,gitRemote:ee.gitRemote,baseBranch:ee.baseBranch,title:ee.title,toolSpec:ee.toolSpec,autoWorktree:ee.autoWorktree,status:ee.status,sessionCount:ee.sessionCount,createdAt:ee.createdAt,updatedAt:ee.updatedAt,completedAt:ee.completedAt}).from(ee).where(a).orderBy(Lp(ee.createdAt)).limit(r).offset(s),l=d.filter(f=>!EE(f.status,f.completedAt)),p=l.map(f=>f.id);if(p.length>0){let[f,_]=await Promise.all([u.select({runId:y.runId,endedAt:y.endedAt}).from(y).where(Kt(Ne(y.userId,t),Cp(y.runId,p))),u.select({runId:ue.runId,status:ue.status}).from(ue).where(Kt(Ne(ue.userId,t),Cp(ue.runId,p)))]),v=new Map;for(let m of f){if(!m.runId)continue;let w=v.get(m.runId)??[];w.push({endedAt:m.endedAt}),v.set(m.runId,w)}let g=new Map;for(let m of _){if(!m.runId)continue;let w=g.get(m.runId)??[];w.push({status:m.status}),g.set(m.runId,w)}await Promise.all(l.map(async m=>{let w=AE(m.status,v.get(m.id)??[],g.get(m.id)??[]);w!==m.status&&(await SE({runId:m.id,userId:t,stored:m.status,rolled:w,hadCompletedAt:m.completedAt!=null}),m.status=w,m.completedAt==null&&(w==="completed"||w==="failed"||w==="cancelled")&&(m.completedAt=new Date))}))}return e.json({runs:d})});Or.get("/runs/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(ee).where(Kt(Ne(ee.id,n),Ne(ee.userId,t))).limit(1);if(!r)return e.json({error:"Run not found"},404);try{await xE(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(Kt(Ne(y.runId,n),Ne(y.userId,t))).orderBy(Lp(y.startedAt)),s=o.map(w=>w.id);if(!EE(r.status,r.completedAt)){let w=await u.select({status:ue.status}).from(ue).where(Kt(Ne(ue.runId,n),Ne(ue.userId,t))),I=AE(r.status,o.map(b=>({endedAt:b.endedAt})),w);I!==r.status&&(await SE({runId:n,userId:t,stored:r.status,rolled:I,hadCompletedAt:r.completedAt!=null}),r.status=I,r.completedAt==null&&(I==="completed"||I==="failed"||I==="cancelled")&&(r.completedAt=new Date))}let i=s.length>0?await u.select({sessionId:se.sessionId,instructionId:h.id,name:h.name}).from(se).innerJoin(h,Ne(h.id,se.instructionId)).where(Cp(se.sessionId,s)):[],a=new Map;for(let w of s)a.set(w,[]);for(let w of i)a.get(w.sessionId)?.push({id:w.instructionId,name:w.name});let d=await Promise.all(o.map(async w=>{let I=w.analysis??{},b=typeof I.goalSummary=="string"?I.goalSummary:null,A=typeof I.outcome=="string"?I.outcome:null,E=I.friction??null,S=await f$(w.tokenUsage,w.startedAt??new Date);return{id:w.id,tool:w.tool,gitBranch:w.gitBranch,projectPath:w.projectPath,startedAt:w.startedAt,endedAt:w.endedAt,eventCount:w.eventCount,tokenUsage:w.tokenUsage,goalSummary:b,outcome:A,friction:E,cost:S,instructions:a.get(w.id)??[]}})),l=d.map(w=>({sessionId:w.id,score:w.outcome!=null?Si[w.outcome]??-1:-1,costUsd:w.cost?.totalUsd??Number.POSITIVE_INFINITY,frictionCount:m$(w.friction)})).sort((w,I)=>I.score!==w.score?I.score-w.score:w.costUsd!==I.costUsd?w.costUsd-I.costUsd:w.frictionCount-I.frictionCount).map((w,I)=>({sessionId:w.sessionId,rank:I+1,isWinner:I===0&&w.score>=0,score:w.score,costUsd:Number.isFinite(w.costUsd)?w.costUsd:null,frictionCount:w.frictionCount})),p=new Map,f=new Map;for(let w of i)p.set(w.instructionId,w.name),f.has(w.instructionId)||f.set(w.instructionId,new Set),f.get(w.instructionId).add(w.sessionId);let _=s.length,v=[],g=[];for(let[w,I]of f){let b=p.get(w)??"Unknown";_>0&&I.size===_?v.push({id:w,name:b}):g.push({id:w,name:b,sessionIds:[...I]})}let m=null;return r.autoWorktree?r.sessionCount>0&&d.length<r.sessionCount&&(m=`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.`):m="This run did not auto-create per-session worktrees, so sessions are attributed only via the launch hook. Sessions from tools that do not run RuleMetric hooks may be missing from this comparison.",e.json({run:r,sessions:d,comparison:{ranking:l,instructionDiff:{shared:v,differing:g}},attributionCaveat:m})});Or.post("/runs/:id/link-sessions",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:ee.id}).from(ee).where(Kt(Ne(ee.id,n),Ne(ee.userId,t))).limit(1);if(!r)return e.json({error:"Run not found"},404);let{linked:o}=await xE(n,t);return e.json({linked:o})});Or.get("/runs/:id/jobs",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:ee.id}).from(ee).where(Kt(Ne(ee.id,n),Ne(ee.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(Kt(Ne(ue.runId,n),Ne(ue.userId,t))).orderBy(Lp(ue.createdAt));return e.json(o)});Or.post("/runs/:id/cancel",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:ee.id}).from(ee).where(Kt(Ne(ee.id,n),Ne(ee.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(Kt(Ne(ue.runId,n),Ne(ue.userId,t),Ne(ue.status,"pending")));let[o]=await u.update(ee).set({status:"cancelled",updatedAt:new Date}).where(Kt(Ne(ee.id,n),Ne(ee.userId,t))).returning();return e.json({run:o})});Or.post("/runs/:id/cleanup",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:ee.id}).from(ee).where(Kt(Ne(ee.id,n),Ne(ee.userId,t))).limit(1);if(!r)return e.json({error:"Run not found"},404);let{noLiveWorker:o}=await yI({runId:n,userId:t});return e.json({enqueued:!0,noLiveWorker:o})});D();import{Hono as g$}from"hono";import{z as Vs}from"zod";import{and as Ea,desc as e_,eq as Zt,or as TE}from"drizzle-orm";var Js=new g$;function h$(e,t){return{liveSend:e?.kind==="tmux"&&e.status==="active"&&t,fallbackResume:!0,tmuxAvailable:e?.kind==="tmux"&&e.status!=="fallback_only",workerOnline:t}}c(h$,"capabilitiesFor");Js.get("/sessions/:id/terminal-target",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:y.id,externalSessionId:y.externalSessionId}).from(y).where(Ea(Zt(y.id,n),Zt(y.userId,t))).limit(1);if(!r)return e.json({error:"Session not found"},404);let o=r.externalSessionId?TE(Zt(Ze.sessionId,r.id),Zt(Ze.externalSessionId,r.externalSessionId)):Zt(Ze.sessionId,r.id),[s]=await u.select().from(Ze).where(Ea(Zt(Ze.userId,t),o)).orderBy(e_(Ze.lastSeenAt)).limit(1),i=await Ui(t);return e.json({target:s??null,capabilities:h$(s??null,i),...s?{}:{reason:"no_target"}})});var RE=Vs.enum(["active","missing","unknown","fallback_only"]),_$=Vs.object({message:Vs.string().min(1).max(16*1024),delivery:Vs.enum(["live","fallback"]).default("live"),submit:Vs.boolean().optional().default(!0)});Js.post("/sessions/:id/send",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=_$.parse(await e.req.json()),[o]=await u.select({id:y.id,externalSessionId:y.externalSessionId,projectPath:y.projectPath}).from(y).where(Ea(Zt(y.id,n),Zt(y.userId,t))).limit(1);if(!o)return e.json({error:"Session not found"},404);let s=o.externalSessionId?TE(Zt(Ze.sessionId,o.id),Zt(Ze.externalSessionId,o.externalSessionId)):Zt(Ze.sessionId,o.id),[i]=await u.select().from(Ze).where(Ea(Zt(Ze.userId,t),Zt(Ze.status,"active"),s)).orderBy(e_(Ze.lastSeenAt)).limit(1);if(!i){if(r.delivery==="fallback"){if(!o.externalSessionId||!o.projectPath)return e.json({error:"Live target unavailable",code:"LIVE_TARGET_UNAVAILABLE"},409);let p={projectPath:o.projectPath,mode:"interactive",resumeSessionId:o.externalSessionId,prompt:r.message},f={tool:"claude_code",config:p},{id:_,noLiveWorker:v}=await Ot({taskName:"process_launch",payload:f,userId:t,mirror:{userId:t,tool:"claude_code",config:p}});return e.json({delivery:"fallback",job:{id:_,kind:"process_launch"},noLiveWorker:v},202)}return e.json({error:"Live target unavailable",code:"LIVE_TARGET_UNAVAILABLE",fallback:{available:!!(o.externalSessionId&&o.projectPath),action:"resume_terminal"}},409)}if(!await Ui(t))return e.json({error:"Worker offline",code:"WORKER_OFFLINE"},409);let d={sessionId:o.id,terminalTargetId:i.id,target:i.target,message:r.message,submit:r.submit},{id:l}=await Ot({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 y$=Vs.object({status:RE,lastSeenAt:Vs.string().datetime().optional()});Js.patch("/terminal-targets/:id/status",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=y$.parse(await e.req.json()),o=r.lastSeenAt?new Date(r.lastSeenAt):new Date,s=new Date,[i]=await u.update(Ze).set({status:r.status,lastSeenAt:o,updatedAt:s}).where(Ea(Zt(Ze.id,n),Zt(Ze.userId,t))).returning();return i?e.json({target:i}):e.json({error:"Terminal target not found"},404)});Js.get("/terminal-targets",async e=>{let t=e.get("userId"),n=e.req.query("status"),r=n?RE.parse(n):null,o=await u.select().from(Ze).where(Ea(Zt(Ze.userId,t),...r?[Zt(Ze.status,r)]:[])).orderBy(e_(Ze.lastSeenAt)).limit(100);return e.json({targets:o})});import{Hono as o1}from"hono";D();import{Hono as b$}from"hono";import{z as Wo}from"zod";import{eq as no,asc as NE,sql as E$}from"drizzle-orm";D();import{eq as t_,and as w$}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(t_(X.slug,o));if(!s)return t.json({error:"Organization not found",code:"ORG_NOT_FOUND"},404);let[i]=await u.select({role:te.role}).from(te).where(w$(t_(te.orgId,s.id),t_(te.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");D();import{eq as kE,and as v$,sql as I$}from"drizzle-orm";var to=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Mp=I$`case ${te.role}
|
|
1317
1364
|
when 'owner' then 0
|
|
1318
1365
|
when 'admin' then 1
|
|
1319
1366
|
when 'member' then 2
|
|
1320
1367
|
else 3
|
|
1321
|
-
end`;async function Ks(e){let t=e.req.param("teamId");if(!t||!to.test(t))return{ok:!1,response:e.json({error:"Invalid teamId path param",code:"BAD_REQUEST"},400)};let n=e.get("orgId"),[r]=await d.select({id:X.id,orgId:X.orgId,name:X.name,slug:X.slug,createdAt:X.createdAt}).from(X).where(y$(kE(X.id,t),kE(X.orgId,n)));return r?{ok:!0,team:{id:r.id,orgId:r.orgId,name:r.name,slug:r.slug,createdAt:r.createdAt}}:{ok:!1,response:e.json({error:"Team not found",code:"TEAM_NOT_FOUND"},404)}}c(Ks,"loadTeamInOrg");var Aa=/^(?=.{3,40}$)[a-z0-9]+(?:-[a-z0-9]+)*$/,Sa="Slug must be 3-40 chars, lowercase alphanumerics with single dashes only \u2014 no leading, trailing, or consecutive dashes";var zo=new v$,b$=Wo.object({name:Wo.string().min(1).max(100),slug:Wo.string().regex(Aa,{message:Sa})}),E$=Wo.object({name:Wo.string().min(1).max(100).optional(),slug:Wo.string().regex(Aa,{message:Sa}).optional()});zo.post("/orgs",async e=>{let t=e.get("supabase");if(!t)return e.json({error:"JWT authentication required for this endpoint",code:"JWT_REQUIRED"},401);let n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let r=b$.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let{name:o,slug:s}=r.data,{data:i,error:a}=await t.rpc("create_organization",{p_name:o,p_slug:s});if(a){let l=Qt(a),m=No(a);if(l==="23505")return e.json({error:"Slug already taken",code:"ORG_SLUG_TAKEN"},409);if(l==="P0001"&&/unauthenticated/i.test(m))return e.json({error:"Unauthenticated",code:"UNAUTHENTICATED"},401);throw a}let u=i;return e.json({id:u.id,name:u.name,slug:u.slug,role:"owner"},201)});zo.get("/orgs",async e=>{let t=e.get("userId"),n=await d.select({id:Y.id,name:Y.name,slug:Y.slug,role:ee.role,createdAt:Y.createdAt}).from(ee).innerJoin(Y,no(ee.orgId,Y.id)).where(no(ee.userId,t)).orderBy(Y.createdAt);return e.json(n.map(r=>({id:r.id,name:r.name,slug:r.slug,role:r.role})))});zo.get("/orgs/:slug",vt(["owner","admin","member"]),async e=>{let t=e.get("orgId"),[n]=await d.select({id:Y.id,name:Y.name,slug:Y.slug,createdAt:Y.createdAt}).from(Y).where(no(Y.id,t)),r=await d.select({userId:ee.userId,role:ee.role,joinedAt:ee.createdAt,email:R.email,displayName:R.displayName}).from(ee).leftJoin(R,no(ee.userId,R.id)).where(no(ee.orgId,t)).orderBy(Mm,NE(ee.createdAt)),o=await d.select({id:X.id,name:X.name,slug:X.slug,memberCount:I$`count(${we.userId})::int`}).from(X).leftJoin(we,no(we.teamId,X.id)).where(no(X.orgId,t)).groupBy(X.id,X.name,X.slug).orderBy(NE(X.name));return e.json({id:n.id,name:n.name,slug:n.slug,createdAt:n.createdAt,members:r.map(s=>({userId:s.userId,email:s.email,displayName:s.displayName,role:s.role,joinedAt:s.joinedAt})),teams:o.map(s=>({id:s.id,name:s.name,slug:s.slug,memberCount:Number(s.memberCount)}))})});zo.patch("/orgs/:slug",vt(["owner","admin"]),async e=>{let t=e.get("orgId"),n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let r=E$.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let{name:o,slug:s}=r.data;if(o===void 0&&s===void 0)return e.json({error:"At least one of `name` or `slug` is required",code:"BAD_REQUEST"},400);let i={};o!==void 0&&(i.name=o),s!==void 0&&(i.slug=s);try{let[a]=await d.update(Y).set(i).where(no(Y.id,t)).returning({id:Y.id,name:Y.name,slug:Y.slug});return e.json({id:a.id,name:a.name,slug:a.slug})}catch(a){if(Qt(a)==="23505")return e.json({error:"Slug already taken",code:"ORG_SLUG_TAKEN"},409);throw a}});zo.delete("/orgs/:slug",vt(["owner"]),async e=>{let t=e.get("orgId");return await d.delete(Y).where(no(Y.id,t)),e.body(null,204)});var A$=Wo.object({newOwnerId:Wo.string().uuid()});zo.post("/orgs/:slug/transfer",vt(["owner"]),async e=>{let t=e.get("supabase");if(!t)return e.json({error:"JWT authentication required for this endpoint",code:"JWT_REQUIRED"},401);let n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let r=A$.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let{newOwnerId:o}=r.data,s=e.get("orgId"),{data:i,error:a}=await t.rpc("transfer_ownership",{p_org:s,p_new_owner_id:o});if(a){let l=Qt(a),m=No(a);if(l==="P0001"){if(/same_user/i.test(m))return e.json({error:"Cannot transfer ownership to yourself",code:"SAME_USER"},400);if(/not_a_member/i.test(m))return e.json({error:"Target user is not a member of this organization",code:"NOT_A_MEMBER"},404);if(/forbidden/i.test(m))return e.json({error:"Forbidden",code:"ORG_FORBIDDEN"},403)}throw a}let u=i;return e.json({orgId:u.orgId,newOwnerId:u.newOwnerId,oldOwnerId:u.oldOwnerId})});D();import{Hono as S$}from"hono";import{z as jE}from"zod";import{eq as Ru,and as PE,asc as x$,max as R$,inArray as DE}from"drizzle-orm";var Tu=new S$;Tu.get("/orgs/:slug/members",vt(["owner","admin"]),async e=>{let t=e.get("orgId"),n=await d.select({userId:ee.userId,role:ee.role,joinedAt:ee.createdAt,email:R.email,displayName:R.displayName}).from(ee).leftJoin(R,Ru(ee.userId,R.id)).where(Ru(ee.orgId,t)).orderBy(Mm,x$(ee.createdAt)),r=n.map(u=>u.userId),o=r.length?await d.select({userId:we.userId,teamId:X.id,teamName:X.name,teamSlug:X.slug}).from(we).innerJoin(X,Ru(we.teamId,X.id)).where(PE(Ru(X.orgId,t),DE(we.userId,r))):[],s=new Map;for(let u of o){let l=s.get(u.userId)??[];l.push({id:u.teamId,name:u.teamName,slug:u.teamSlug}),s.set(u.userId,l)}let i=r.length?await d.select({userId:y.userId,lastActiveAt:R$(y.startedAt)}).from(y).where(PE(Ru(y.orgId,t),DE(y.userId,r))).groupBy(y.userId):[],a=new Map;for(let u of i)a.set(u.userId,u.lastActiveAt);return e.json(n.map(u=>{let l=a.get(u.userId)??null;return{userId:u.userId,email:u.email,displayName:u.displayName,role:u.role,joinedAt:u.joinedAt,teams:s.get(u.userId)??[],lastActiveAt:l?new Date(l).toISOString():null}}))});var T$=jE.object({role:jE.enum(["owner","admin","member"])});Tu.patch("/orgs/:slug/members/:userId",vt(["owner","admin"]),async e=>{let t=e.get("supabase");if(!t)return e.json({error:"JWT authentication required for this endpoint",code:"JWT_REQUIRED"},401);let n=e.req.param("userId");if(!n||!to.test(n))return e.json({error:"Invalid userId path param",code:"BAD_REQUEST"},400);let r;try{r=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let o=T$.safeParse(r);if(!o.success)return e.json({error:o.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let s=e.get("orgId"),{data:i,error:a}=await t.rpc("change_member_role",{p_org:s,p_user:n,p_new_role:o.data.role});if(a){let l=Qt(a),m=No(a);if(l==="P0001"){if(/invalid_role/i.test(m))return e.json({error:"Invalid role",code:"INVALID_ROLE"},400);if(/not_a_member/i.test(m))return e.json({error:"Target user is not a member of this organization",code:"NOT_A_MEMBER"},404);if(/last_owner_violation/i.test(m))return e.json({error:"Cannot demote the last owner of this organization",code:"LAST_OWNER"},409);if(/forbidden/i.test(m))return e.json({error:"Forbidden",code:"ORG_FORBIDDEN"},403)}throw a}let u=i;return e.json({userId:u.userId,orgId:u.orgId,role:u.role})});Tu.delete("/orgs/:slug/members/:userId",vt(["owner","admin","member"]),async e=>{let t=e.get("supabase");if(!t)return e.json({error:"JWT authentication required for this endpoint",code:"JWT_REQUIRED"},401);let n=e.req.param("userId");if(!n||!to.test(n))return e.json({error:"Invalid userId path param",code:"BAD_REQUEST"},400);let r=e.get("orgRole"),o=e.get("userId");if(!(n===o)&&!(r==="owner"||r==="admin"))return e.json({error:"Forbidden",code:"ORG_FORBIDDEN"},403);let a=e.get("orgId"),{error:u}=await t.rpc("remove_member",{p_org:a,p_user:n});if(u){let l=Qt(u),m=No(u);if(l==="P0001"){if(/not_a_member/i.test(m))return e.json({error:"Target user is not a member of this organization",code:"NOT_A_MEMBER"},404);if(/last_owner_violation/i.test(m))return e.json({error:"Cannot remove the last owner of this organization",code:"LAST_OWNER"},409);if(/forbidden/i.test(m))return e.json({error:"Forbidden",code:"ORG_FORBIDDEN"},403)}throw u}return e.body(null,204)});D();import{Hono as k$}from"hono";import{z as Vo}from"zod";import{eq as Jo,and as OE,asc as N$,sql as j$}from"drizzle-orm";var Ko=new k$,P$=Vo.object({name:Vo.string().min(1).max(100),slug:Vo.string().regex(Aa,{message:Sa})}),D$=Vo.object({name:Vo.string().min(1).max(100).optional(),slug:Vo.string().regex(Aa,{message:Sa}).optional()}),O$=Vo.object({userId:Vo.string().uuid()});Ko.get("/orgs/:slug/teams",vt(["owner","admin","member"]),async e=>{let t=e.get("orgId"),n=await d.select({id:X.id,name:X.name,slug:X.slug,createdAt:X.createdAt,memberCount:j$`count(${we.userId})::int`}).from(X).leftJoin(we,Jo(we.teamId,X.id)).where(Jo(X.orgId,t)).groupBy(X.id,X.name,X.slug,X.createdAt).orderBy(N$(X.name));return e.json(n.map(r=>({id:r.id,name:r.name,slug:r.slug,memberCount:Number(r.memberCount),createdAt:r.createdAt})))});Ko.post("/orgs/:slug/teams",vt(["owner","admin"]),async e=>{let t;try{t=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let n=P$.safeParse(t);if(!n.success)return e.json({error:n.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let r=e.get("orgId"),{name:o,slug:s}=n.data;try{let[i]=await d.insert(X).values({orgId:r,name:o,slug:s}).returning({id:X.id,orgId:X.orgId,name:X.name,slug:X.slug,createdAt:X.createdAt});return e.json({id:i.id,orgId:i.orgId,name:i.name,slug:i.slug,createdAt:i.createdAt,memberCount:0},201)}catch(i){if(Qt(i)==="23505")return e.json({error:"Slug already taken",code:"TEAM_SLUG_TAKEN"},409);throw i}});Ko.patch("/orgs/:slug/teams/:teamId",vt(["owner","admin"]),async e=>{let t=await Ks(e);if(!t.ok)return t.response;let n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let r=D$.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let{name:o,slug:s}=r.data;if(o===void 0&&s===void 0)return e.json({error:"At least one of `name` or `slug` is required",code:"BAD_REQUEST"},400);let i={};o!==void 0&&(i.name=o),s!==void 0&&(i.slug=s);try{let[a]=await d.update(X).set(i).where(Jo(X.id,t.team.id)).returning({id:X.id,orgId:X.orgId,name:X.name,slug:X.slug,createdAt:X.createdAt});return e.json({id:a.id,orgId:a.orgId,name:a.name,slug:a.slug,createdAt:a.createdAt})}catch(a){if(Qt(a)==="23505")return e.json({error:"Slug already taken",code:"TEAM_SLUG_TAKEN"},409);throw a}});Ko.delete("/orgs/:slug/teams/:teamId",vt(["owner","admin"]),async e=>{let t=await Ks(e);return t.ok?(await d.delete(X).where(Jo(X.id,t.team.id)),e.body(null,204)):t.response});Ko.post("/orgs/:slug/teams/:teamId/members",vt(["owner","admin"]),async e=>{let t=await Ks(e);if(!t.ok)return t.response;let n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let r=O$.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let{userId:o}=r.data,s=e.get("orgId"),[i]=await d.select({userId:ee.userId}).from(ee).where(OE(Jo(ee.userId,o),Jo(ee.orgId,s)));if(!i)return e.json({error:"Target user is not a member of this organization",code:"NOT_ORG_MEMBER"},400);try{await d.insert(we).values({userId:o,teamId:t.team.id})}catch(a){if(Qt(a)==="23505")return e.json({error:"User is already a member of this team",code:"ALREADY_TEAM_MEMBER"},409);throw a}return e.json({userId:o,teamId:t.team.id},201)});Ko.delete("/orgs/:slug/teams/:teamId/members/:userId",vt(["owner","admin"]),async e=>{let t=await Ks(e);if(!t.ok)return t.response;let n=e.req.param("userId");return!n||!to.test(n)?e.json({error:"Invalid userId path param",code:"BAD_REQUEST"},400):(await d.delete(we).where(OE(Jo(we.teamId,t.team.id),Jo(we.userId,n))).returning({userId:we.userId})).length===0?e.json({error:"User is not a member of this team",code:"NOT_TEAM_MEMBER"},404):e.body(null,204)});D();import{Hono as K$}from"hono";import{z as Bm}from"zod";import{randomBytes as G$}from"node:crypto";import{eq as Qn,and as Fm,desc as Y$,sql as X$,isNull as Ra,gt as Q$}from"drizzle-orm";import{randomBytes as C$}from"node:crypto";async function n_(e){let t=e.idempotencyKey?` idempotencyKey=${e.idempotencyKey}`:"";return process.stderr.write(`[email:noop] would send to=${e.to} subject=${JSON.stringify(e.subject)}${t}
|
|
1322
|
-
`),{id:`noop-${
|
|
1323
|
-
`)}return"onboarding@resend.dev"}c(
|
|
1368
|
+
end`;async function Ks(e){let t=e.req.param("teamId");if(!t||!to.test(t))return{ok:!1,response:e.json({error:"Invalid teamId path param",code:"BAD_REQUEST"},400)};let n=e.get("orgId"),[r]=await u.select({id:Q.id,orgId:Q.orgId,name:Q.name,slug:Q.slug,createdAt:Q.createdAt}).from(Q).where(v$(kE(Q.id,t),kE(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(Ks,"loadTeamInOrg");var Aa=/^(?=.{3,40}$)[a-z0-9]+(?:-[a-z0-9]+)*$/,Sa="Slug must be 3-40 chars, lowercase alphanumerics with single dashes only \u2014 no leading, trailing, or consecutive dashes";var zo=new b$,A$=Wo.object({name:Wo.string().min(1).max(100),slug:Wo.string().regex(Aa,{message:Sa})}),S$=Wo.object({name:Wo.string().min(1).max(100).optional(),slug:Wo.string().regex(Aa,{message:Sa}).optional()});zo.post("/orgs",async e=>{let t=e.get("supabase");if(!t)return e.json({error:"JWT authentication required for this endpoint",code:"JWT_REQUIRED"},401);let n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let r=A$.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let{name:o,slug:s}=r.data,{data:i,error:a}=await t.rpc("create_organization",{p_name:o,p_slug:s});if(a){let l=Qt(a),p=No(a);if(l==="23505")return e.json({error:"Slug already taken",code:"ORG_SLUG_TAKEN"},409);if(l==="P0001"&&/unauthenticated/i.test(p))return e.json({error:"Unauthenticated",code:"UNAUTHENTICATED"},401);throw a}let d=i;return e.json({id:d.id,name:d.name,slug:d.slug,role:"owner"},201)});zo.get("/orgs",async e=>{let t=e.get("userId"),n=await u.select({id:X.id,name:X.name,slug:X.slug,role:te.role,createdAt:X.createdAt}).from(te).innerJoin(X,no(te.orgId,X.id)).where(no(te.userId,t)).orderBy(X.createdAt);return e.json(n.map(r=>({id:r.id,name:r.name,slug:r.slug,role:r.role})))});zo.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(no(X.id,t)),r=await u.select({userId:te.userId,role:te.role,joinedAt:te.createdAt,email:T.email,displayName:T.displayName}).from(te).leftJoin(T,no(te.userId,T.id)).where(no(te.orgId,t)).orderBy(Mp,NE(te.createdAt)),o=await u.select({id:Q.id,name:Q.name,slug:Q.slug,memberCount:E$`count(${we.userId})::int`}).from(Q).leftJoin(we,no(we.teamId,Q.id)).where(no(Q.orgId,t)).groupBy(Q.id,Q.name,Q.slug).orderBy(NE(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)}))})});zo.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=S$.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(no(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(Qt(a)==="23505")return e.json({error:"Slug already taken",code:"ORG_SLUG_TAKEN"},409);throw a}});zo.delete("/orgs/:slug",It(["owner"]),async e=>{let t=e.get("orgId");return await u.delete(X).where(no(X.id,t)),e.body(null,204)});var x$=Wo.object({newOwnerId:Wo.string().uuid()});zo.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=x$.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let{newOwnerId:o}=r.data,s=e.get("orgId"),{data:i,error:a}=await t.rpc("transfer_ownership",{p_org:s,p_new_owner_id:o});if(a){let l=Qt(a),p=No(a);if(l==="P0001"){if(/same_user/i.test(p))return e.json({error:"Cannot transfer ownership to yourself",code:"SAME_USER"},400);if(/not_a_member/i.test(p))return e.json({error:"Target user is not a member of this organization",code:"NOT_A_MEMBER"},404);if(/forbidden/i.test(p))return e.json({error:"Forbidden",code:"ORG_FORBIDDEN"},403)}throw a}let d=i;return e.json({orgId:d.orgId,newOwnerId:d.newOwnerId,oldOwnerId:d.oldOwnerId})});D();import{Hono as T$}from"hono";import{z as jE}from"zod";import{eq as Rd,and as PE,asc as R$,max as k$,inArray as DE}from"drizzle-orm";var kd=new T$;kd.get("/orgs/:slug/members",It(["owner","admin"]),async e=>{let t=e.get("orgId"),n=await u.select({userId:te.userId,role:te.role,joinedAt:te.createdAt,email:T.email,displayName:T.displayName}).from(te).leftJoin(T,Rd(te.userId,T.id)).where(Rd(te.orgId,t)).orderBy(Mp,R$(te.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,Rd(we.teamId,Q.id)).where(PE(Rd(Q.orgId,t),DE(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:k$(y.startedAt)}).from(y).where(PE(Rd(y.orgId,t),DE(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 N$=jE.object({role:jE.enum(["owner","admin","member"])});kd.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||!to.test(n))return e.json({error:"Invalid userId path param",code:"BAD_REQUEST"},400);let r;try{r=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let o=N$.safeParse(r);if(!o.success)return e.json({error:o.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let s=e.get("orgId"),{data:i,error:a}=await t.rpc("change_member_role",{p_org:s,p_user:n,p_new_role:o.data.role});if(a){let l=Qt(a),p=No(a);if(l==="P0001"){if(/invalid_role/i.test(p))return e.json({error:"Invalid role",code:"INVALID_ROLE"},400);if(/not_a_member/i.test(p))return e.json({error:"Target user is not a member of this organization",code:"NOT_A_MEMBER"},404);if(/last_owner_violation/i.test(p))return e.json({error:"Cannot demote the last owner of this organization",code:"LAST_OWNER"},409);if(/forbidden/i.test(p))return e.json({error:"Forbidden",code:"ORG_FORBIDDEN"},403)}throw a}let d=i;return e.json({userId:d.userId,orgId:d.orgId,role:d.role})});kd.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||!to.test(n))return e.json({error:"Invalid userId path param",code:"BAD_REQUEST"},400);let r=e.get("orgRole"),o=e.get("userId");if(!(n===o)&&!(r==="owner"||r==="admin"))return e.json({error:"Forbidden",code:"ORG_FORBIDDEN"},403);let a=e.get("orgId"),{error:d}=await t.rpc("remove_member",{p_org:a,p_user:n});if(d){let l=Qt(d),p=No(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)});D();import{Hono as j$}from"hono";import{z as Vo}from"zod";import{eq as Jo,and as OE,asc as P$,sql as D$}from"drizzle-orm";var Ko=new j$,O$=Vo.object({name:Vo.string().min(1).max(100),slug:Vo.string().regex(Aa,{message:Sa})}),C$=Vo.object({name:Vo.string().min(1).max(100).optional(),slug:Vo.string().regex(Aa,{message:Sa}).optional()}),L$=Vo.object({userId:Vo.string().uuid()});Ko.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:D$`count(${we.userId})::int`}).from(Q).leftJoin(we,Jo(we.teamId,Q.id)).where(Jo(Q.orgId,t)).groupBy(Q.id,Q.name,Q.slug,Q.createdAt).orderBy(P$(Q.name));return e.json(n.map(r=>({id:r.id,name:r.name,slug:r.slug,memberCount:Number(r.memberCount),createdAt:r.createdAt})))});Ko.post("/orgs/:slug/teams",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=O$.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(Qt(i)==="23505")return e.json({error:"Slug already taken",code:"TEAM_SLUG_TAKEN"},409);throw i}});Ko.patch("/orgs/:slug/teams/:teamId",It(["owner","admin"]),async e=>{let t=await Ks(e);if(!t.ok)return t.response;let n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let r=C$.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(Jo(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(Qt(a)==="23505")return e.json({error:"Slug already taken",code:"TEAM_SLUG_TAKEN"},409);throw a}});Ko.delete("/orgs/:slug/teams/:teamId",It(["owner","admin"]),async e=>{let t=await Ks(e);return t.ok?(await u.delete(Q).where(Jo(Q.id,t.team.id)),e.body(null,204)):t.response});Ko.post("/orgs/:slug/teams/:teamId/members",It(["owner","admin"]),async e=>{let t=await Ks(e);if(!t.ok)return t.response;let n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let r=L$.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:te.userId}).from(te).where(OE(Jo(te.userId,o),Jo(te.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(Qt(a)==="23505")return e.json({error:"User is already a member of this team",code:"ALREADY_TEAM_MEMBER"},409);throw a}return e.json({userId:o,teamId:t.team.id},201)});Ko.delete("/orgs/:slug/teams/:teamId/members/:userId",It(["owner","admin"]),async e=>{let t=await Ks(e);if(!t.ok)return t.response;let n=e.req.param("userId");return!n||!to.test(n)?e.json({error:"Invalid userId path param",code:"BAD_REQUEST"},400):(await u.delete(we).where(OE(Jo(we.teamId,t.team.id),Jo(we.userId,n))).returning({userId:we.userId})).length===0?e.json({error:"User is not a member of this team",code:"NOT_TEAM_MEMBER"},404):e.body(null,204)});D();import{Hono as Y$}from"hono";import{z as Bp}from"zod";import{randomBytes as X$}from"node:crypto";import{eq as Qn,and as Fp,desc as Q$,sql as Z$,isNull as Ta,gt as e1}from"drizzle-orm";import{randomBytes as M$}from"node:crypto";async function n_(e){let t=e.idempotencyKey?` idempotencyKey=${e.idempotencyKey}`:"";return process.stderr.write(`[email:noop] would send to=${e.to} subject=${JSON.stringify(e.subject)}${t}
|
|
1369
|
+
`),{id:`noop-${M$(8).toString("hex")}`,provider:"noop"}}c(n_,"sendNoopEmail");var $p=null;async function $$(){if($p)return $p;let e=process.env.RESEND_API_KEY;if(!e)throw new Error("RESEND_API_KEY is not set");let{Resend:t}=await import("resend");return $p=new t(e),$p}c($$,"getClient");var CE=!1;function q$(){let e=process.env.RESEND_FROM_EMAIL;if(e)return e;if(!CE){CE=!0;let t=process.env.NODE_ENV==="production"?"PRODUCTION":"dev";process.stderr.write(`[email:resend] ${t}: RESEND_FROM_EMAIL not set \u2014 sending from the shared sandbox sender onboarding@resend.dev, which Gmail spam-filters. Set RESEND_FROM_EMAIL to an address on a verified domain.
|
|
1370
|
+
`)}return"onboarding@resend.dev"}c(q$,"resolveFromEmail");async function LE(e){let t=e.fromName??"RuleMetric",n=q$(),r=`${t} <${n}>`,o=await $$(),s=e.idempotencyKey?{idempotencyKey:e.idempotencyKey}:void 0,i=await o.emails.send({from:r,to:e.to,subject:e.subject,html:e.html,text:e.text,...e.headers?{headers:e.headers}:{}},s);if(i.error)throw new Error(`Resend send failed: ${i.error.message}`);if(!i.data)throw new Error("Resend send returned no data and no error");return{id:i.data.id,provider:"resend"}}c(LE,"sendResendEmail");async function ME(e){throw new Error("SMTP provider not implemented. Set RESEND_API_KEY to use Resend, or unset RULEMETRIC_EMAIL_PROVIDER to fall back to noop.")}c(ME,"sendSmtpEmail");var U$="#2DD4BF",H$="#0d9488",B$="#0A0C12",qp="#1a1a1a",Up="#666666",$E="#f5f5f7",F$="#ffffff",qE="#e5e5e9";function W$(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(W$,"formatExpiresAt");function xa(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}c(xa,"escapeHtml");function z$(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(z$,"roleCopy");function r_(e){let{orgName:t,inviterName:n,role:r,acceptUrl:o,expiresAt:s}=e,i=`${n} invited you to ${t} on RuleMetric`,a=W$(s),{article:d,description:l}=z$(r),p=`<!doctype html>
|
|
1324
1371
|
<html lang="en">
|
|
1325
1372
|
<head>
|
|
1326
1373
|
<meta charset="utf-8" />
|
|
1327
1374
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
1328
1375
|
<title>${xa(i)}</title>
|
|
1329
1376
|
</head>
|
|
1330
|
-
<body style="margin:0;padding:0;background:${$E};font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;color:${
|
|
1377
|
+
<body style="margin:0;padding:0;background:${$E};font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;color:${qp};">
|
|
1331
1378
|
<table role="presentation" width="100%" cellspacing="0" cellpadding="0" border="0" style="background:${$E};padding:32px 16px;">
|
|
1332
1379
|
<tr>
|
|
1333
1380
|
<td align="center">
|
|
1334
|
-
<table role="presentation" width="560" cellspacing="0" cellpadding="0" border="0" style="max-width:560px;background:${
|
|
1381
|
+
<table role="presentation" width="560" cellspacing="0" cellpadding="0" border="0" style="max-width:560px;background:${F$};border:1px solid ${qE};border-radius:8px;overflow:hidden;">
|
|
1335
1382
|
<tr>
|
|
1336
1383
|
<td style="padding:32px 32px 8px 32px;">
|
|
1337
|
-
<h1 style="margin:0 0 16px 0;font-size:22px;line-height:1.3;font-weight:600;color:${
|
|
1384
|
+
<h1 style="margin:0 0 16px 0;font-size:22px;line-height:1.3;font-weight:600;color:${qp};">
|
|
1338
1385
|
You've been invited to ${xa(t)}
|
|
1339
1386
|
</h1>
|
|
1340
|
-
<p style="margin:0 0 16px 0;font-size:15px;line-height:1.5;color:${
|
|
1387
|
+
<p style="margin:0 0 16px 0;font-size:15px;line-height:1.5;color:${qp};">
|
|
1341
1388
|
Hi there,
|
|
1342
1389
|
</p>
|
|
1343
|
-
<p style="margin:0 0 16px 0;font-size:15px;line-height:1.5;color:${
|
|
1390
|
+
<p style="margin:0 0 16px 0;font-size:15px;line-height:1.5;color:${qp};">
|
|
1344
1391
|
<strong>${xa(n)}</strong> invited you to join
|
|
1345
|
-
<strong>${xa(t)}</strong> on RuleMetric as ${
|
|
1392
|
+
<strong>${xa(t)}</strong> on RuleMetric as ${d}.
|
|
1346
1393
|
</p>
|
|
1347
|
-
<p style="margin:0 0 24px 0;font-size:15px;line-height:1.5;color:${
|
|
1394
|
+
<p style="margin:0 0 24px 0;font-size:15px;line-height:1.5;color:${Up};">
|
|
1348
1395
|
${l}
|
|
1349
1396
|
</p>
|
|
1350
1397
|
</td>
|
|
@@ -1352,27 +1399,27 @@ end`;async function Ks(e){let t=e.req.param("teamId");if(!t||!to.test(t))return{
|
|
|
1352
1399
|
<tr>
|
|
1353
1400
|
<td align="center" style="padding:0 32px 8px 32px;">
|
|
1354
1401
|
<a href="${xa(o)}"
|
|
1355
|
-
style="display:inline-block;padding:12px 24px;background:${
|
|
1402
|
+
style="display:inline-block;padding:12px 24px;background:${U$};color:${B$};text-decoration:none;border-radius:6px;font-size:15px;font-weight:600;">
|
|
1356
1403
|
Accept invitation
|
|
1357
1404
|
</a>
|
|
1358
1405
|
</td>
|
|
1359
1406
|
</tr>
|
|
1360
1407
|
<tr>
|
|
1361
1408
|
<td style="padding:16px 32px 8px 32px;">
|
|
1362
|
-
<p style="margin:0 0 8px 0;font-size:13px;line-height:1.5;color:${
|
|
1409
|
+
<p style="margin:0 0 8px 0;font-size:13px;line-height:1.5;color:${Up};">
|
|
1363
1410
|
Or copy and paste this link into your browser:
|
|
1364
1411
|
</p>
|
|
1365
|
-
<p style="margin:0 0 24px 0;font-size:13px;line-height:1.5;color:${
|
|
1412
|
+
<p style="margin:0 0 24px 0;font-size:13px;line-height:1.5;color:${H$};word-break:break-all;">
|
|
1366
1413
|
${xa(o)}
|
|
1367
1414
|
</p>
|
|
1368
|
-
<p style="margin:0 0 24px 0;font-size:13px;line-height:1.5;color:${
|
|
1415
|
+
<p style="margin:0 0 24px 0;font-size:13px;line-height:1.5;color:${Up};">
|
|
1369
1416
|
This invitation expires on <strong>${a}</strong>.
|
|
1370
1417
|
</p>
|
|
1371
1418
|
</td>
|
|
1372
1419
|
</tr>
|
|
1373
1420
|
<tr>
|
|
1374
1421
|
<td style="padding:16px 32px 32px 32px;border-top:1px solid ${qE};">
|
|
1375
|
-
<p style="margin:0;font-size:12px;line-height:1.5;color:${
|
|
1422
|
+
<p style="margin:0;font-size:12px;line-height:1.5;color:${Up};">
|
|
1376
1423
|
If you didn't expect this email, you can safely ignore it. The link will expire on its own.
|
|
1377
1424
|
</p>
|
|
1378
1425
|
</td>
|
|
@@ -1382,12 +1429,12 @@ end`;async function Ks(e){let t=e.req.param("teamId");if(!t||!to.test(t))return{
|
|
|
1382
1429
|
</tr>
|
|
1383
1430
|
</table>
|
|
1384
1431
|
</body>
|
|
1385
|
-
</html>`,f=[`You've been invited to ${t}`,"","Hi there,","",`${n} invited you to join ${t} on RuleMetric as ${
|
|
1386
|
-
`);return{subject:i,html:
|
|
1387
|
-
`)),t){case"resend":return
|
|
1388
|
-
`),n_(e)):LE(e);case"smtp":return ME(e);case"noop":if(process.env.NODE_ENV==="production"&&process.env.RULEMETRIC_EMAIL_PROVIDER!=="noop")throw new Error("email provider unconfigured in production: RESEND_API_KEY is not set (set it, or force RULEMETRIC_EMAIL_PROVIDER=noop to intentionally disable email)");return n_(e)}}c(
|
|
1389
|
-
`)),t="https://rulemetric.com"):t="http://localhost:5174"),`${t.replace(/\/$/,"")}/invite/${e}`}c(FE,"buildAcceptUrl");async function WE(e){let[t]=await
|
|
1390
|
-
`),hr(t,{tags:{source:"invite-email"},extra:{to:e.to,orgName:e.orgName}}),{sent:!1,reason:n}}}c(zE,"sendInvitationEmail");var Z$=Bm.enum(["admin","member"]),e1=Bm.object({email:Bm.string().email().max(254),role:Z$.optional(),teamId:Bm.string().uuid().optional()});Ta.post("/orgs/:slug/invitations",vt(["owner","admin"]),async e=>{let t;try{t=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let n=e1.safeParse(t);if(!n.success)return e.json({error:n.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let r=e.get("orgId"),o=e.get("userId"),s=n.data.email.toLowerCase(),i=n.data.role??"member",a=n.data.teamId;if(a){let[p]=await d.select({id:X.id}).from(X).where(Fm(Qn(X.id,a),Qn(X.orgId,r)));if(!p)return e.json({error:"Team not found in this organization",code:"INVALID_TEAM"},400)}let u=BE(),l;try{let[p]=await d.insert(ae).values({orgId:r,email:s,role:i,teamId:a??null,invitedBy:o,token:u,expiresAt:new Date(Date.now()+6048e5)}).returning({id:ae.id,email:ae.email,role:ae.role,teamId:ae.teamId,expiresAt:ae.expiresAt});l=p}catch(p){if(Qt(p)==="23505")return e.json({error:"A pending invitation for this email already exists",code:"INVITE_ALREADY_PENDING"},409);throw p}let m=FE(u),[f]=await d.select({name:Y.name}).from(Y).where(Qn(Y.id,r)),_=await WE(o),v=await zE({to:s,orgName:f?.name??"your organization",inviterName:_,role:l.role,acceptUrl:m,expiresAt:l.expiresAt}),h=process.env.NODE_ENV==="test";return e.json({id:l.id,email:l.email,role:l.role,teamId:l.teamId,expiresAt:l.expiresAt,acceptUrl:m,emailSent:v.sent,...v.sent?{}:{emailError:v.reason},...h?{token:u}:{}},201)});Ta.get("/orgs/:slug/invitations",vt(["owner","admin"]),async e=>{let t=e.get("orgId"),n=await d.select({id:ae.id,email:ae.email,role:ae.role,teamId:ae.teamId,teamName:X.name,invitedById:ae.invitedBy,invitedByDisplayName:R.displayName,invitedByEmail:R.email,createdAt:ae.createdAt,expiresAt:ae.expiresAt}).from(ae).leftJoin(X,Qn(ae.teamId,X.id)).leftJoin(R,Qn(ae.invitedBy,R.id)).where(Fm(Qn(ae.orgId,t),Ra(ae.acceptedAt),Ra(ae.revokedAt),Q$(ae.expiresAt,X$`now()`))).orderBy(Y$(ae.createdAt));return e.json(n.map(r=>({id:r.id,email:r.email,role:r.role,teamId:r.teamId,teamName:r.teamName,invitedById:r.invitedById,invitedByName:r.invitedByDisplayName??r.invitedByEmail??null,createdAt:r.createdAt,expiresAt:r.expiresAt})))});Ta.post("/orgs/:slug/invitations/:id/revoke",vt(["owner","admin"]),async e=>{let t=e.req.param("id");if(!t||!to.test(t))return e.json({error:"Invalid invitation id",code:"BAD_REQUEST"},400);let n=e.get("orgId");return(await d.update(ae).set({revokedAt:new Date}).where(Fm(Qn(ae.id,t),Qn(ae.orgId,n),Ra(ae.acceptedAt),Ra(ae.revokedAt))).returning({id:ae.id})).length===0?e.json({error:"Invitation not found",code:"INVITE_NOT_FOUND"},404):e.body(null,204)});Ta.post("/orgs/:slug/invitations/:id/resend",vt(["owner","admin"]),async e=>{let t=e.req.param("id");if(!t||!to.test(t))return e.json({error:"Invalid invitation id",code:"BAD_REQUEST"},400);let n=e.get("orgId"),r=BE(),o=new Date(Date.now()+10080*60*1e3),s=await d.update(ae).set({token:r,expiresAt:o}).where(Fm(Qn(ae.id,t),Qn(ae.orgId,n),Ra(ae.acceptedAt),Ra(ae.revokedAt))).returning({id:ae.id,email:ae.email,role:ae.role,expiresAt:ae.expiresAt});if(s.length===0)return e.json({error:"Invitation not found",code:"INVITE_NOT_FOUND"},404);let i=s[0],a=FE(r),u=e.get("userId"),[l]=await d.select({name:Y.name}).from(Y).where(Qn(Y.id,n)),m=await WE(u),f=await zE({to:i.email,orgName:l?.name??"your organization",inviterName:m,role:i.role,acceptUrl:a,expiresAt:i.expiresAt}),_=process.env.NODE_ENV==="test";return e.json({id:i.id,email:i.email,expiresAt:i.expiresAt,acceptUrl:a,emailSent:f.sent,...f.sent?{}:{emailError:f.reason},..._?{token:r}:{}})});D();import{Hono as t1}from"hono";import{eq as ku,and as JE,sql as KE,inArray as o_,gte as GE}from"drizzle-orm";var zm=new t1,Wm={"7d":7,"30d":30},VE={fully_achieved:1,mostly_achieved:.75,partially_achieved:.5,unclear_from_transcript:.25,not_achieved:0};async function s_(e,t,n,r,o,s){let i=new Map;for(let E of e)i.set(E.tool,(i.get(E.tool)??0)+1);let a=[...i.entries()].sort((E,S)=>S[1]-E[1]).slice(0,5).map(([E,S])=>({tool:E,count:S})),u=new Map;for(let E of e)u.set(E.userId,(u.get(E.userId)??0)+1);let l=[...u.entries()].sort((E,S)=>S[1]-E[1]).slice(0,5).map(([E])=>E),m=l.length?await d.select({id:R.id,displayName:R.displayName,email:R.email}).from(R).where(o_(R.id,l)):[],f=new Map(m.map(E=>[E.id,E])),_=l.map(E=>{let S=f.get(E);return{userId:E,displayName:S?.displayName??null,email:S?.email??null,count:u.get(E)??0}}),v=new Map;for(let E of e){let S=E.analysis;if(!S)continue;let T=S.friction;if(!T)continue;let O=Object.values(T).reduce((q,U)=>q+(typeof U=="number"?U:0),0),W=E.startedAt.toISOString().split("T")[0]??"",N=v.get(W)??{sum:0,count:0};N.sum+=O,N.count+=1,v.set(W,N)}let h=[...v.entries()].sort(([E],[S])=>E<S?-1:1).map(([E,{sum:S,count:T}])=>({day:E,avgFriction:Math.round(S/T*100)/100})),p=e.map(E=>E.id),w=p.length?await d.select({sessionId:se.sessionId,instructionId:se.instructionId,name:g.name,source:KE`${g.frontmatter}->>'source'`}).from(se).innerJoin(g,ku(g.id,se.instructionId)).where(o_(se.sessionId,p)):[],I=new Map;for(let E of w){let S=I.get(E.instructionId);S?S.sessions.add(E.sessionId):I.set(E.instructionId,{name:E.name,source:E.source,sessions:new Set([E.sessionId])})}let b=new Map;for(let E of e){let S=E.analysis;if(!S)continue;let T=S.outcome;T&&T in VE&&b.set(E.id,VE[T])}let A=[];for(let[E,{name:S,source:T,sessions:O}]of I){let W=[],N=[];for(let de of e){let K=b.get(de.id);K!==void 0&&(O.has(de.id)?W.push(K):N.push(K))}let q=c(de=>de.length===0?null:de.reduce((K,pe)=>K+pe,0)/de.length,"avg"),U=q(W),H=q(N),te=U!==null&&H!==null?Math.round((U-H)*1e3)/10:null;A.push({instructionId:E,name:S,source:T,withSessions:O.size,withoutSessions:e.length-O.size,deltaPct:te})}return{range:t,sessionCount:e.length,memberCount:n,topTools:a,topMembers:_,frictionTrend:h,instructionEffectiveness:A}}c(s_,"buildActivityResponse");zm.get("/orgs/:slug/activity",vt(["owner","admin","member"]),async e=>{let t=e.get("orgId"),n=e.req.query("range")??"7d";if(!(n in Wm))return e.json({error:"Invalid range. Allowed: 7d, 30d",code:"BAD_REQUEST"},400);let r=new Date(Date.now()-Wm[n]*24*60*60*1e3),o=await d.select({id:y.id,userId:y.userId,tool:y.tool,startedAt:y.startedAt,analysis:y.analysis}).from(y).where(JE(ku(y.orgId,t),GE(y.startedAt,r))),[{count:s}]=await d.select({count:KE`count(*)::int`}).from(ee).where(ku(ee.orgId,t)),i=await s_(o,n,Number(s),t,r,null);return e.json(i)});zm.get("/orgs/:slug/teams/:teamId/activity",vt(["owner","admin","member"]),async e=>{let t=await Ks(e);if(!t.ok)return t.response;let n=t.team,r=e.req.query("range")??"7d";if(!(r in Wm))return e.json({error:"Invalid range. Allowed: 7d, 30d",code:"BAD_REQUEST"},400);let o=new Date(Date.now()-Wm[r]*24*60*60*1e3),s=e.get("orgId"),a=(await d.select({userId:we.userId}).from(we).where(ku(we.teamId,n.id))).map(m=>m.userId);if(a.length===0){let m=await s_([],r,0,s,o,[]);return e.json(m)}let u=await d.select({id:y.id,userId:y.userId,tool:y.tool,startedAt:y.startedAt,analysis:y.analysis}).from(y).where(JE(ku(y.orgId,s),GE(y.startedAt,o),o_(y.userId,a))),l=await s_(u,r,a.length,s,o,a);return e.json(l)});var Go=new n1;Go.route("/",zo);Go.route("/",Tu);Go.route("/",Ko);Go.route("/",Ta);Go.route("/",zm);D();import{Hono as r1}from"hono";import{z as i_}from"zod";import{createClient as o1}from"@supabase/supabase-js";import{eq as Nu,and as YE,isNull as XE,sql as QE}from"drizzle-orm";var ju=new r1;ju.get("/:token",async e=>{let t=e.req.param("token");if(!t||t.length<8)return e.json({error:"Invitation no longer valid",code:"INVITE_GONE"},410);let[n]=await d.select({orgName:Y.name,role:ae.role,email:ae.email,acceptedAt:ae.acceptedAt,revokedAt:ae.revokedAt,expiresAt:ae.expiresAt,inviterDisplayName:R.displayName,inviterEmail:R.email}).from(ae).innerJoin(Y,Nu(ae.orgId,Y.id)).leftJoin(R,Nu(ae.invitedBy,R.id)).where(Nu(ae.token,t));if(!n)return e.json({error:"Invitation no longer valid",code:"INVITE_GONE"},410);let r=Date.now(),o=new Date(n.expiresAt).getTime()<r;if(n.acceptedAt||n.revokedAt||o)return e.json({error:"Invitation no longer valid",code:"INVITE_GONE"},410);let s=null,i,a=e.req.header("Authorization");if(a?.startsWith("Bearer ")){let l=a.slice(7);if(l&&!l.startsWith("rm_"))try{let m=o1(process.env.SUPABASE_URL,process.env.SUPABASE_ANON_KEY,{global:{headers:{Authorization:`Bearer ${l}`}}}),{data:f,error:_}=await m.auth.getUser();!_&&f.user&&(s=f.user.id,i=f.user.email)}catch{}}let u=null;if(s&&i&&i.toLowerCase()===n.email.toLowerCase()){let[{cnt:l}]=await d.select({cnt:QE`count(*)::int`}).from(y).where(YE(Nu(y.userId,s),XE(y.orgId)));u=Number(l)}return e.json({orgName:n.orgName,inviterName:n.inviterDisplayName??n.inviterEmail??null,role:n.role,sessionCount:u})});var s1=i_.object({token:i_.string().min(1),acknowledgedSessionCount:i_.number().int().nonnegative()});ju.post("/accept",async e=>{let t=e.get("supabase");if(!t)return e.json({error:"JWT authentication required for this endpoint",code:"JWT_REQUIRED"},401);let n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let r=s1.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let o=e.get("userId");if(o){let[{cnt:u}]=await d.select({cnt:QE`count(*)::int`}).from(y).where(YE(Nu(y.userId,o),XE(y.orgId))),l=Number(u);if(l>r.data.acknowledgedSessionCount)return e.json({error:"Session count changed since you reviewed the consent notice \u2014 please re-confirm",code:"SESSION_COUNT_CHANGED",currentSessionCount:l},409)}let{data:s,error:i}=await t.rpc("accept_invitation",{p_token:r.data.token});if(i){let u=Qt(i),l=No(i);if(u==="P0001"){if(/invitation_not_found/i.test(l))return e.json({error:"Invitation not found",code:"INVITE_NOT_FOUND"},404);if(/invitation_revoked/i.test(l))return e.json({error:"Invitation no longer valid",code:"INVITE_GONE"},410);if(/invitation_already_accepted/i.test(l))return e.json({error:"Invitation no longer valid",code:"INVITE_GONE"},410);if(/invitation_expired/i.test(l))return e.json({error:"Invitation no longer valid",code:"INVITE_GONE"},410);if(/invitation_email_mismatch/i.test(l))return e.json({error:"This invitation is for a different email address",code:"INVITE_EMAIL_MISMATCH"},403);if(/already_member/i.test(l))return e.json({error:"You are already a member of this organization",code:"ALREADY_MEMBER"},409);if(/already_team_member/i.test(l))return e.json({error:"You are already a member of this team",code:"ALREADY_TEAM_MEMBER"},409);if(/unauthenticated/i.test(l))return e.json({error:"Unauthenticated",code:"UNAUTHENTICATED"},401)}throw i}let a=s;return e.json({orgId:a.orgId,role:a.role})});D();import{Hono as i1}from"hono";import{z as Pu}from"zod";import{eq as Du,and as a1}from"drizzle-orm";var Ou=new i1;Ou.get("/profile",async e=>{let t=e.get("userId"),[n]=await d.select({id: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(Du(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 c1=["free","pro","max_5x","max_20x"],u1=Pu.object({activeOrgId:Pu.string().uuid().nullable().optional(),claudeCodePlan:Pu.enum(c1).nullable().optional(),setupCompletedAt:Pu.string().datetime().nullable().optional(),liveSendSkipped:Pu.boolean().optional()});Ou.patch("/profile",async e=>{let t=e.get("userId"),n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let r=u1.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let o=r.data;if("activeOrgId"in o&&o.activeOrgId!=null){let[a]=await d.select({orgId:ee.orgId}).from(ee).where(a1(Du(ee.userId,t),Du(ee.orgId,o.activeOrgId)));if(!a)return e.json({error:"You are not a member of the requested organization",code:"NOT_A_MEMBER"},403)}let s={};"activeOrgId"in o&&(s.activeOrgId=o.activeOrgId??null),"claudeCodePlan"in o&&(s.claudeCodePlan=o.claudeCodePlan??null,s.planSource=o.claudeCodePlan==null?"detected":"manual"),"setupCompletedAt"in o&&(s.setupCompletedAt=o.setupCompletedAt?new Date(o.setupCompletedAt):null),"liveSendSkipped"in o&&(s.liveSendSkipped=o.liveSendSkipped),Object.keys(s).length>0&&await d.update(R).set(s).where(Du(R.id,t));let[i]=await d.select({activeOrgId:R.activeOrgId,claudeCodePlan:R.claudeCodePlan,planSource:R.planSource,setupCompletedAt:R.setupCompletedAt,liveSendSkipped:R.liveSendSkipped}).from(R).where(Du(R.id,t));return e.json({activeOrgId:i.activeOrgId,claudeCodePlan:i.claudeCodePlan,planSource:i.planSource,setupCompletedAt:i.setupCompletedAt,liveSendSkipped:i.liveSendSkipped})});D();import{Hono as l1}from"hono";import{z as It}from"zod";import{asc as ZE,eq as Gs,sql as Zn}from"drizzle-orm";D();import{eq as d1}from"drizzle-orm";function Cu(){return async(e,t)=>{let n=e.get("userId");if(!n)return e.json({error:"Unauthenticated",code:"UNAUTHENTICATED"},401);let[r]=await d.select({isSuperadmin:R.isSuperadmin}).from(R).where(d1(R.id,n));if(!r?.isSuperadmin)return e.json({error:"Forbidden",code:"NOT_SUPERADMIN"},403);await t()}}c(Cu,"requireSuperadmin");ou();var En=new l1;En.use("/superadmin/*",Cu());var m1=It.object({search:It.string().trim().min(1).max(120).optional(),limit:It.coerce.number().int().min(1).max(200).default(50),offset:It.coerce.number().int().min(0).default(0)});En.get("/superadmin/users",async e=>{let t=m1.safeParse({search:e.req.query("search"),limit:e.req.query("limit"),offset:e.req.query("offset")});if(!t.success)return e.json({error:t.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let{search:n,limit:r,offset:o}=t.data,s=await d.execute(Zn`
|
|
1432
|
+
</html>`,f=[`You've been invited to ${t}`,"","Hi there,","",`${n} invited you to join ${t} on RuleMetric as ${d}.`,"",l,"","Accept the invitation:",o,"",`This invitation expires on ${a}.`,"","--","If you didn't expect this email, you can safely ignore it. The link will expire on its own."].join(`
|
|
1433
|
+
`);return{subject:i,html:p,text:f}}c(r_,"renderInvitation");function V$(){let e=process.env.RULEMETRIC_EMAIL_PROVIDER;return e==="resend"||e==="smtp"||e==="noop"?e:process.env.RESEND_API_KEY?"resend":"noop"}c(V$,"selectEmailProvider");var J$=new Set(["test","example","invalid","localhost"]),K$=/^example\.(com|net|org)$/;function G$(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!!(J$.has(o)||K$.test(r))}c(G$,"isUndeliverableRecipient");var UE=!1;async function Hp(e){let t=V$();switch(UE||(UE=!0,process.stderr.write(`[email] active provider: ${t}
|
|
1434
|
+
`)),t){case"resend":return G$(e.to)?(process.stderr.write(`[email] skipping real send to reserved/undeliverable address ${e.to} (RFC 2606/6761) \u2014 routed to noop to protect sender reputation
|
|
1435
|
+
`),n_(e)):LE(e);case"smtp":return ME(e);case"noop":if(process.env.NODE_ENV==="production"&&process.env.RULEMETRIC_EMAIL_PROVIDER!=="noop")throw new Error("email provider unconfigured in production: RESEND_API_KEY is not set (set it, or force RULEMETRIC_EMAIL_PROVIDER=noop to intentionally disable email)");return n_(e)}}c(Hp,"sendEmail");var Ra=new Y$;function BE(){return X$(32).toString("base64url")}c(BE,"generateInviteToken");var HE=!1;function FE(e){let t=process.env.WEB_URL??process.env.RULEMETRIC_WEB_URL;return t||(process.env.NODE_ENV==="production"?(HE||(HE=!0,process.stderr.write(`[invite] WEB_URL / RULEMETRIC_WEB_URL is not set in production \u2014 falling back to https://rulemetric.com for invite accept links
|
|
1436
|
+
`)),t="https://rulemetric.com"):t="http://localhost:5174"),`${t.replace(/\/$/,"")}/invite/${e}`}c(FE,"buildAcceptUrl");async function WE(e){let[t]=await u.select({displayName:T.displayName,email:T.email}).from(T).where(Qn(T.id,e));return t?.displayName?.trim()||t?.email||"A teammate"}c(WE,"getInviterDisplayName");async function zE(e){try{let{subject:t,html:n,text:r}=r_({orgName:e.orgName,inviterName:e.inviterName,role:e.role,acceptUrl:e.acceptUrl,expiresAt:e.expiresAt});return(await Hp({to:e.to,subject:t,html:n,text:r})).provider==="noop"?{sent:!1,reason:"email provider is noop \u2014 no email was delivered; share the accept link directly"}:{sent:!0}}catch(t){let n=t instanceof Error?t.message:String(t);return process.stderr.write(`[invite] email send failed for ${e.to}: ${n}
|
|
1437
|
+
`),hr(t,{tags:{source:"invite-email"},extra:{to:e.to,orgName:e.orgName}}),{sent:!1,reason:n}}}c(zE,"sendInvitationEmail");var t1=Bp.enum(["admin","member"]),n1=Bp.object({email:Bp.string().email().max(254),role:t1.optional(),teamId:Bp.string().uuid().optional()});Ra.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=n1.safeParse(t);if(!n.success)return e.json({error:n.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let r=e.get("orgId"),o=e.get("userId"),s=n.data.email.toLowerCase(),i=n.data.role??"member",a=n.data.teamId;if(a){let[m]=await u.select({id:Q.id}).from(Q).where(Fp(Qn(Q.id,a),Qn(Q.orgId,r)));if(!m)return e.json({error:"Team not found in this organization",code:"INVALID_TEAM"},400)}let d=BE(),l;try{let[m]=await u.insert(ae).values({orgId:r,email:s,role:i,teamId:a??null,invitedBy:o,token:d,expiresAt:new Date(Date.now()+6048e5)}).returning({id:ae.id,email:ae.email,role:ae.role,teamId:ae.teamId,expiresAt:ae.expiresAt});l=m}catch(m){if(Qt(m)==="23505")return e.json({error:"A pending invitation for this email already exists",code:"INVITE_ALREADY_PENDING"},409);throw m}let p=FE(d),[f]=await u.select({name:X.name}).from(X).where(Qn(X.id,r)),_=await WE(o),v=await zE({to:s,orgName:f?.name??"your organization",inviterName:_,role:l.role,acceptUrl:p,expiresAt:l.expiresAt}),g=process.env.NODE_ENV==="test";return e.json({id:l.id,email:l.email,role:l.role,teamId:l.teamId,expiresAt:l.expiresAt,acceptUrl:p,emailSent:v.sent,...v.sent?{}:{emailError:v.reason},...g?{token:d}:{}},201)});Ra.get("/orgs/:slug/invitations",It(["owner","admin"]),async e=>{let t=e.get("orgId"),n=await u.select({id:ae.id,email:ae.email,role:ae.role,teamId:ae.teamId,teamName:Q.name,invitedById:ae.invitedBy,invitedByDisplayName:T.displayName,invitedByEmail:T.email,createdAt:ae.createdAt,expiresAt:ae.expiresAt}).from(ae).leftJoin(Q,Qn(ae.teamId,Q.id)).leftJoin(T,Qn(ae.invitedBy,T.id)).where(Fp(Qn(ae.orgId,t),Ta(ae.acceptedAt),Ta(ae.revokedAt),e1(ae.expiresAt,Z$`now()`))).orderBy(Q$(ae.createdAt));return e.json(n.map(r=>({id:r.id,email:r.email,role:r.role,teamId:r.teamId,teamName:r.teamName,invitedById:r.invitedById,invitedByName:r.invitedByDisplayName??r.invitedByEmail??null,createdAt:r.createdAt,expiresAt:r.expiresAt})))});Ra.post("/orgs/:slug/invitations/:id/revoke",It(["owner","admin"]),async e=>{let t=e.req.param("id");if(!t||!to.test(t))return e.json({error:"Invalid invitation id",code:"BAD_REQUEST"},400);let n=e.get("orgId");return(await u.update(ae).set({revokedAt:new Date}).where(Fp(Qn(ae.id,t),Qn(ae.orgId,n),Ta(ae.acceptedAt),Ta(ae.revokedAt))).returning({id:ae.id})).length===0?e.json({error:"Invitation not found",code:"INVITE_NOT_FOUND"},404):e.body(null,204)});Ra.post("/orgs/:slug/invitations/:id/resend",It(["owner","admin"]),async e=>{let t=e.req.param("id");if(!t||!to.test(t))return e.json({error:"Invalid invitation id",code:"BAD_REQUEST"},400);let n=e.get("orgId"),r=BE(),o=new Date(Date.now()+10080*60*1e3),s=await u.update(ae).set({token:r,expiresAt:o}).where(Fp(Qn(ae.id,t),Qn(ae.orgId,n),Ta(ae.acceptedAt),Ta(ae.revokedAt))).returning({id:ae.id,email:ae.email,role:ae.role,expiresAt:ae.expiresAt});if(s.length===0)return e.json({error:"Invitation not found",code:"INVITE_NOT_FOUND"},404);let i=s[0],a=FE(r),d=e.get("userId"),[l]=await u.select({name:X.name}).from(X).where(Qn(X.id,n)),p=await WE(d),f=await zE({to:i.email,orgName:l?.name??"your organization",inviterName:p,role:i.role,acceptUrl:a,expiresAt:i.expiresAt}),_=process.env.NODE_ENV==="test";return e.json({id:i.id,email:i.email,expiresAt:i.expiresAt,acceptUrl:a,emailSent:f.sent,...f.sent?{}:{emailError:f.reason},..._?{token:r}:{}})});D();import{Hono as r1}from"hono";import{eq as Nd,and as JE,sql as KE,inArray as o_,gte as GE}from"drizzle-orm";var zp=new r1,Wp={"7d":7,"30d":30},VE={fully_achieved:1,mostly_achieved:.75,partially_achieved:.5,unclear_from_transcript:.25,not_achieved:0};async function s_(e,t,n,r,o,s){let i=new Map;for(let E of e)i.set(E.tool,(i.get(E.tool)??0)+1);let a=[...i.entries()].sort((E,S)=>S[1]-E[1]).slice(0,5).map(([E,S])=>({tool:E,count:S})),d=new Map;for(let E of e)d.set(E.userId,(d.get(E.userId)??0)+1);let l=[...d.entries()].sort((E,S)=>S[1]-E[1]).slice(0,5).map(([E])=>E),p=l.length?await u.select({id:T.id,displayName:T.displayName,email:T.email}).from(T).where(o_(T.id,l)):[],f=new Map(p.map(E=>[E.id,E])),_=l.map(E=>{let S=f.get(E);return{userId:E,displayName:S?.displayName??null,email:S?.email??null,count:d.get(E)??0}}),v=new Map;for(let E of e){let S=E.analysis;if(!S)continue;let R=S.friction;if(!R)continue;let O=Object.values(R).reduce((U,q)=>U+(typeof q=="number"?q:0),0),W=E.startedAt.toISOString().split("T")[0]??"",N=v.get(W)??{sum:0,count:0};N.sum+=O,N.count+=1,v.set(W,N)}let g=[...v.entries()].sort(([E],[S])=>E<S?-1:1).map(([E,{sum:S,count:R}])=>({day:E,avgFriction:Math.round(S/R*100)/100})),m=e.map(E=>E.id),w=m.length?await u.select({sessionId:se.sessionId,instructionId:se.instructionId,name:h.name,source:KE`${h.frontmatter}->>'source'`}).from(se).innerJoin(h,Nd(h.id,se.instructionId)).where(o_(se.sessionId,m)):[],I=new Map;for(let E of w){let S=I.get(E.instructionId);S?S.sessions.add(E.sessionId):I.set(E.instructionId,{name:E.name,source:E.source,sessions:new Set([E.sessionId])})}let b=new Map;for(let E of e){let S=E.analysis;if(!S)continue;let R=S.outcome;R&&R in VE&&b.set(E.id,VE[R])}let A=[];for(let[E,{name:S,source:R,sessions:O}]of I){let W=[],N=[];for(let ce of e){let V=b.get(ce.id);V!==void 0&&(O.has(ce.id)?W.push(V):N.push(V))}let U=c(ce=>ce.length===0?null:ce.reduce((V,me)=>V+me,0)/ce.length,"avg"),q=U(W),H=U(N),Y=q!==null&&H!==null?Math.round((q-H)*1e3)/10:null;A.push({instructionId:E,name:S,source:R,withSessions:O.size,withoutSessions:e.length-O.size,deltaPct:Y})}return{range:t,sessionCount:e.length,memberCount:n,topTools:a,topMembers:_,frictionTrend:g,instructionEffectiveness:A}}c(s_,"buildActivityResponse");zp.get("/orgs/:slug/activity",It(["owner","admin","member"]),async e=>{let t=e.get("orgId"),n=e.req.query("range")??"7d";if(!(n in Wp))return e.json({error:"Invalid range. Allowed: 7d, 30d",code:"BAD_REQUEST"},400);let r=new Date(Date.now()-Wp[n]*24*60*60*1e3),o=await u.select({id:y.id,userId:y.userId,tool:y.tool,startedAt:y.startedAt,analysis:y.analysis}).from(y).where(JE(Nd(y.orgId,t),GE(y.startedAt,r))),[{count:s}]=await u.select({count:KE`count(*)::int`}).from(te).where(Nd(te.orgId,t)),i=await s_(o,n,Number(s),t,r,null);return e.json(i)});zp.get("/orgs/:slug/teams/:teamId/activity",It(["owner","admin","member"]),async e=>{let t=await Ks(e);if(!t.ok)return t.response;let n=t.team,r=e.req.query("range")??"7d";if(!(r in Wp))return e.json({error:"Invalid range. Allowed: 7d, 30d",code:"BAD_REQUEST"},400);let o=new Date(Date.now()-Wp[r]*24*60*60*1e3),s=e.get("orgId"),a=(await u.select({userId:we.userId}).from(we).where(Nd(we.teamId,n.id))).map(p=>p.userId);if(a.length===0){let p=await s_([],r,0,s,o,[]);return e.json(p)}let d=await u.select({id:y.id,userId:y.userId,tool:y.tool,startedAt:y.startedAt,analysis:y.analysis}).from(y).where(JE(Nd(y.orgId,s),GE(y.startedAt,o),o_(y.userId,a))),l=await s_(d,r,a.length,s,o,a);return e.json(l)});var Go=new o1;Go.route("/",zo);Go.route("/",kd);Go.route("/",Ko);Go.route("/",Ra);Go.route("/",zp);D();import{Hono as s1}from"hono";import{z as i_}from"zod";import{createClient as i1}from"@supabase/supabase-js";import{eq as jd,and as YE,isNull as XE,sql as QE}from"drizzle-orm";var Pd=new s1;Pd.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:ae.role,email:ae.email,acceptedAt:ae.acceptedAt,revokedAt:ae.revokedAt,expiresAt:ae.expiresAt,inviterDisplayName:T.displayName,inviterEmail:T.email}).from(ae).innerJoin(X,jd(ae.orgId,X.id)).leftJoin(T,jd(ae.invitedBy,T.id)).where(jd(ae.token,t));if(!n)return e.json({error:"Invitation no longer valid",code:"INVITE_GONE"},410);let r=Date.now(),o=new Date(n.expiresAt).getTime()<r;if(n.acceptedAt||n.revokedAt||o)return e.json({error:"Invitation no longer valid",code:"INVITE_GONE"},410);let s=null,i,a=e.req.header("Authorization");if(a?.startsWith("Bearer ")){let l=a.slice(7);if(l&&!l.startsWith("rm_"))try{let p=i1(process.env.SUPABASE_URL,process.env.SUPABASE_ANON_KEY,{global:{headers:{Authorization:`Bearer ${l}`}}}),{data:f,error:_}=await p.auth.getUser();!_&&f.user&&(s=f.user.id,i=f.user.email)}catch{}}let d=null;if(s&&i&&i.toLowerCase()===n.email.toLowerCase()){let[{cnt:l}]=await u.select({cnt:QE`count(*)::int`}).from(y).where(YE(jd(y.userId,s),XE(y.orgId)));d=Number(l)}return e.json({orgName:n.orgName,inviterName:n.inviterDisplayName??n.inviterEmail??null,role:n.role,sessionCount:d})});var a1=i_.object({token:i_.string().min(1),acknowledgedSessionCount:i_.number().int().nonnegative()});Pd.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=a1.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:QE`count(*)::int`}).from(y).where(YE(jd(y.userId,o),XE(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=Qt(i),l=No(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})});D();import{Hono as c1}from"hono";import{z as Dd}from"zod";import{eq as Od,and as d1}from"drizzle-orm";var Cd=new c1;Cd.get("/profile",async e=>{let t=e.get("userId"),[n]=await u.select({id:T.id,email:T.email,displayName:T.displayName,activeOrgId:T.activeOrgId,isSuperadmin:T.isSuperadmin,claudeCodePlan:T.claudeCodePlan,planSource:T.planSource,setupCompletedAt:T.setupCompletedAt,liveSendSkipped:T.liveSendSkipped}).from(T).where(Od(T.id,t));return n?(e.header("Cache-Control","private, max-age=15"),e.json({id:n.id,email:n.email,displayName:n.displayName,activeOrgId:n.activeOrgId,isSuperadmin:n.isSuperadmin,claudeCodePlan:n.claudeCodePlan,planSource:n.planSource,setupCompletedAt:n.setupCompletedAt,liveSendSkipped:n.liveSendSkipped})):e.json({error:"Profile not found",code:"PROFILE_NOT_FOUND"},404)});var u1=["free","pro","max_5x","max_20x"],l1=Dd.object({activeOrgId:Dd.string().uuid().nullable().optional(),claudeCodePlan:Dd.enum(u1).nullable().optional(),setupCompletedAt:Dd.string().datetime().nullable().optional(),liveSendSkipped:Dd.boolean().optional()});Cd.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=l1.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:te.orgId}).from(te).where(d1(Od(te.userId,t),Od(te.orgId,o.activeOrgId)));if(!a)return e.json({error:"You are not a member of the requested organization",code:"NOT_A_MEMBER"},403)}let s={};"activeOrgId"in o&&(s.activeOrgId=o.activeOrgId??null),"claudeCodePlan"in o&&(s.claudeCodePlan=o.claudeCodePlan??null,s.planSource=o.claudeCodePlan==null?"detected":"manual"),"setupCompletedAt"in o&&(s.setupCompletedAt=o.setupCompletedAt?new Date(o.setupCompletedAt):null),"liveSendSkipped"in o&&(s.liveSendSkipped=o.liveSendSkipped),Object.keys(s).length>0&&await u.update(T).set(s).where(Od(T.id,t));let[i]=await u.select({activeOrgId:T.activeOrgId,claudeCodePlan:T.claudeCodePlan,planSource:T.planSource,setupCompletedAt:T.setupCompletedAt,liveSendSkipped:T.liveSendSkipped}).from(T).where(Od(T.id,t));return e.json({activeOrgId:i.activeOrgId,claudeCodePlan:i.claudeCodePlan,planSource:i.planSource,setupCompletedAt:i.setupCompletedAt,liveSendSkipped:i.liveSendSkipped})});D();import{Hono as m1}from"hono";import{z as bt}from"zod";import{asc as ZE,eq as Gs,sql as Zn}from"drizzle-orm";D();import{eq as p1}from"drizzle-orm";function Ld(){return async(e,t)=>{let n=e.get("userId");if(!n)return e.json({error:"Unauthenticated",code:"UNAUTHENTICATED"},401);let[r]=await u.select({isSuperadmin:T.isSuperadmin}).from(T).where(p1(T.id,n));if(!r?.isSuperadmin)return e.json({error:"Forbidden",code:"NOT_SUPERADMIN"},403);await t()}}c(Ld,"requireSuperadmin");sd();var En=new m1;En.use("/superadmin/*",Ld());var f1=bt.object({search:bt.string().trim().min(1).max(120).optional(),limit:bt.coerce.number().int().min(1).max(200).default(50),offset:bt.coerce.number().int().min(0).default(0)});En.get("/superadmin/users",async e=>{let t=f1.safeParse({search:e.req.query("search"),limit:e.req.query("limit"),offset:e.req.query("offset")});if(!t.success)return e.json({error:t.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let{search:n,limit:r,offset:o}=t.data,s=await u.execute(Zn`
|
|
1391
1438
|
select
|
|
1392
1439
|
p.id,
|
|
1393
1440
|
p.email,
|
|
@@ -1412,13 +1459,13 @@ end`;async function Ks(e){let t=e.req.param("teamId");if(!t||!to.test(t))return{
|
|
|
1412
1459
|
${n?Zn`where p.email ilike ${"%"+ct(n)+"%"}`:Zn``}
|
|
1413
1460
|
order by p.created_at desc
|
|
1414
1461
|
limit ${r} offset ${o}
|
|
1415
|
-
`),[{total:i}]=await
|
|
1462
|
+
`),[{total:i}]=await u.execute(Zn`
|
|
1416
1463
|
select count(*)::int as total from profiles p
|
|
1417
1464
|
${n?Zn`where p.email ilike ${"%"+ct(n)+"%"}`:Zn``}
|
|
1418
|
-
`);return e.json({users:s,total:i,limit:r,offset:o})});En.get("/superadmin/users/:id",async e=>{let t=e.req.param("id");if(!
|
|
1465
|
+
`);return e.json({users:s,total:i,limit:r,offset:o})});En.get("/superadmin/users/:id",async e=>{let t=e.req.param("id");if(!bt.string().uuid().safeParse(t).success)return e.json({error:"Invalid user id",code:"VALIDATION_ERROR"},400);let[n]=await u.select({id:T.id,email:T.email,displayName:T.displayName,isSuperadmin:T.isSuperadmin,activeOrgId:T.activeOrgId,createdAt:T.createdAt}).from(T).where(Gs(T.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:te.role}).from(te).innerJoin(X,Gs(X.id,te.orgId)).where(Gs(te.userId,t)).orderBy(ZE(X.name)),[o]=await u.select({total:Zn`count(*)::int`,orphan:Zn`count(*) filter (where org_id is null)::int`}).from(y).where(Gs(y.userId,t)),s={banned:!1,bannedUntil:null,lastSignInAt:null};try{let{data:i,error:a}=await zn().auth.admin.getUserById(t);!a&&i?.user&&(s={banned:i.user.banned_until?new Date(i.user.banned_until)>new Date:!1,bannedUntil:i.user.banned_until??null,lastSignInAt:i.user.last_sign_in_at??null})}catch{}return e.json({user:{...n,...s},memberships:r,sessionCounts:o??{total:0,orphan:0}})});async function eA(e){let[t]=await u.execute(Zn`
|
|
1419
1466
|
select count(*)::int as n from profiles
|
|
1420
1467
|
where is_superadmin = true and id <> ${e}
|
|
1421
|
-
`);return t?.n??0}c(eA,"countOtherSuperadmins");En.post("/superadmin/users/:id/force-logout",async e=>{let t=e.req.param("id");if(!
|
|
1468
|
+
`);return t?.n??0}c(eA,"countOtherSuperadmins");En.post("/superadmin/users/:id/force-logout",async e=>{let t=e.req.param("id");if(!bt.string().uuid().safeParse(t).success)return e.json({error:"Invalid user id",code:"VALIDATION_ERROR"},400);if(t===e.get("userId"))return e.json({error:"Cannot force-logout yourself",code:"SELF_ACTION_FORBIDDEN"},400);try{await u.execute(Zn`update auth.refresh_tokens set revoked = true where user_id = ${t}`),await u.execute(Zn`delete from auth.sessions where user_id = ${t}`)}catch(n){return e.json({error:n.message,code:"AUTH_ADMIN_ERROR"},400)}return e.json({ok:!0})});En.post("/superadmin/users/:id/reset-password",async e=>{let t=e.req.param("id");if(!bt.string().uuid().safeParse(t).success)return e.json({error:"Invalid user id",code:"VALIDATION_ERROR"},400);let[n]=await u.select({email:T.email}).from(T).where(Gs(T.id,t));if(!n?.email)return e.json({error:"User not found",code:"USER_NOT_FOUND"},404);let{data:r,error:o}=await zn().auth.admin.generateLink({type:"recovery",email:n.email});return o?e.json({error:o.message,code:"AUTH_ADMIN_ERROR"},400):e.json({actionLink:r.properties?.action_link??null,email:n.email})});var g1=bt.object({suspended:bt.boolean()});En.patch("/superadmin/users/:id/suspend",async e=>{let t=e.req.param("id");if(!bt.string().uuid().safeParse(t).success)return e.json({error:"Invalid user id",code:"VALIDATION_ERROR"},400);if(t===e.get("userId"))return e.json({error:"Cannot suspend yourself",code:"SELF_ACTION_FORBIDDEN"},400);let n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON",code:"VALIDATION_ERROR"},400)}let r=g1.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);if(r.data.suspended){let[a]=await u.select({isSuperadmin:T.isSuperadmin}).from(T).where(Gs(T.id,t));if(a?.isSuperadmin&&await eA(t)===0)return e.json({error:"Cannot suspend the last superadmin",code:"LAST_SUPERADMIN"},409)}let o=r.data.suspended?"876000h":"none",{data:s,error:i}=await zn().auth.admin.updateUserById(t,{ban_duration:o});return i?e.json({error:i.message,code:"AUTH_ADMIN_ERROR"},400):e.json({ok:!0,suspended:r.data.suspended,bannedUntil:s.user?.banned_until??null})});var h1=bt.object({confirmEmail:bt.string().email()});En.delete("/superadmin/users/:id",async e=>{let t=e.req.param("id");if(!bt.string().uuid().safeParse(t).success)return e.json({error:"Invalid user id",code:"VALIDATION_ERROR"},400);if(t===e.get("userId"))return e.json({error:"Cannot delete yourself",code:"SELF_ACTION_FORBIDDEN"},400);let n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON",code:"VALIDATION_ERROR"},400)}let r=h1.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let[o]=await u.select({email:T.email,isSuperadmin:T.isSuperadmin}).from(T).where(Gs(T.id,t));if(!o)return e.json({error:"User not found",code:"USER_NOT_FOUND"},404);if(o.email?.toLowerCase()!==r.data.confirmEmail.toLowerCase())return e.json({error:"confirmEmail does not match",code:"CONFIRMATION_MISMATCH"},400);if(o.isSuperadmin&&await eA(t)===0)return e.json({error:"Cannot delete the last superadmin",code:"LAST_SUPERADMIN"},409);let{error:s}=await zn().auth.admin.deleteUser(t);return s?e.json({error:s.message,code:"AUTH_ADMIN_ERROR"},400):e.json({ok:!0})});var _1=bt.object({email:bt.string().email(),orgId:bt.string().uuid().optional(),role:bt.enum(["owner","admin","member"]).optional()});En.post("/superadmin/users/invite",async e=>{let t;try{t=await e.req.json()}catch{return e.json({error:"Invalid JSON",code:"VALIDATION_ERROR"},400)}let n=_1.safeParse(t);if(!n.success)return e.json({error:n.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let{email:r,orgId:o,role:s}=n.data;if(o&&!s)return e.json({error:"role is required when orgId is set",code:"VALIDATION_ERROR"},400);let i=zn(),a=process.env.WEB_URL??"http://localhost:5174",{data: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,f=null;if(p&&o&&s){let _=e.get("supabase");if(_){let{error:v}=await _.rpc("superadmin_assign_user_to_org",{p_user_id:p,p_org_id:o,p_role:s,p_claim_sessions:!1});v||(f={orgId:o,role:s})}}return e.json({ok:!0,userId:p??null,email:r,assigned:f})});var y1=bt.object({orgId:bt.string().uuid(),role:bt.enum(["owner","admin","member"]),claimSessions:bt.boolean().default(!0)});En.post("/superadmin/users/:id/assign",async e=>{let t=e.req.param("id");if(!bt.string().uuid().safeParse(t).success)return e.json({error:"Invalid user id",code:"VALIDATION_ERROR"},400);let n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON",code:"VALIDATION_ERROR"},400)}let r=y1.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)});En.delete("/superadmin/users/:id/orgs/:orgId",async e=>{let t=e.req.param("id"),n=e.req.param("orgId");if(!bt.string().uuid().safeParse(t).success||!bt.string().uuid().safeParse(n).success)return e.json({error:"Invalid id",code:"VALIDATION_ERROR"},400);let r=e.get("supabase");if(!r)return e.json({error:"Internal: no auth client",code:"INTERNAL"},500);let{error:o}=await r.rpc("superadmin_remove_member",{p_user_id:t,p_org_id:n});if(o){let s=o.message.includes("last_owner_violation")?409:o.message.includes("not_authorized")?403:400;return e.json({error:o.message,code:"RPC_ERROR"},s)}return e.json({ok:!0})});En.get("/superadmin/orgs",async e=>{let t=await u.select({id:X.id,name:X.name,slug:X.slug,memberCount:Zn`(select count(*)::int from user_organizations where org_id = organizations.id)`,createdAt:X.createdAt}).from(X).orderBy(ZE(X.name));return e.json({orgs:t})});import{Hono as w1}from"hono";import{z as Yo}from"zod";var Vp=new w1,tA=Yo.object({type:Yo.string().min(1).max(64),payload:Yo.record(Yo.unknown()).optional(),timestamp:Yo.string().datetime().optional()}),v1=Yo.union([tA,Yo.object({events:Yo.array(tA).max(50)})]);Vp.post("/telemetry/extension-events",async e=>{let t=e.get("userId"),n=await e.req.json().catch(()=>null),r=v1.safeParse(n);if(!r.success)return e.json({error:"invalid payload",details:r.error.flatten()},400);let o="events"in r.data?r.data.events:[r.data];for(let s of o)console.log(`[ext-telemetry] user=${t} type=${s.type} payload=${JSON.stringify(s.payload??{})}`);return e.body(null,204)});D();import{Hono as I1}from"hono";import{z as Cr}from"zod";import{sql as b1}from"drizzle-orm";var Md=new I1,nA=Cr.object({event:Cr.string().min(1).max(64),deviceId:Cr.string().min(1).max(128),cliVersion:Cr.string().max(64).optional(),os:Cr.string().max(32).optional(),props:Cr.record(Cr.unknown()).optional()}),E1=Cr.union([nA,Cr.object({events:Cr.array(nA).max(50)})]);Md.post("/telemetry/cli-events",async e=>{let t=e.get("userId"),n=E1.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(Eu).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)});Md.get("/telemetry/deployments",async e=>{let t=e.get("userId"),n=await u.execute(b1`
|
|
1422
1469
|
select
|
|
1423
1470
|
device_id,
|
|
1424
1471
|
count(*)::int as event_count,
|
|
@@ -1435,7 +1482,7 @@ end`;async function Ks(e){let t=e.req.param("teamId");if(!t||!to.test(t))return{
|
|
|
1435
1482
|
group by device_id
|
|
1436
1483
|
order by max(created_at) desc
|
|
1437
1484
|
limit 200
|
|
1438
|
-
`);return e.json({deployments:n})});D();import{Hono as b1}from"hono";import{z as er}from"zod";var Jm=new b1,E1=er.object({event:er.string().min(1).max(64),deviceId:er.string().max(128).optional(),command:er.string().max(128).optional(),statusCode:er.number().int().optional(),message:er.string().max(1e3).optional(),cliVersion:er.string().max(64).optional(),os:er.string().max(32).optional(),nodeVersion:er.string().max(32).optional(),proxied:er.boolean().optional(),props:er.record(er.unknown()).optional()});Jm.post("/telemetry/cli-error",async e=>{let t=E1.safeParse(await e.req.json().catch(()=>null));if(!t.success)return e.json({error:"invalid payload",details:t.error.flatten()},400);let n=t.data;console.warn(`[cli-error-beacon] event=${n.event} command=${n.command??""} status=${n.statusCode??""} proxied=${n.proxied??""} cli=${n.cliVersion??""} os=${n.os??""} node=${n.nodeVersion??""} device=${n.deviceId??""} msg=${JSON.stringify(n.message??"")}`);try{await d.insert(Ed).values({deviceId:n.deviceId??null,event:n.event,command:n.command??null,statusCode:n.statusCode??null,message:n.message??null,cliVersion:n.cliVersion??null,os:n.os??null,nodeVersion:n.nodeVersion??null,proxied:n.proxied??null,props:n.props??{}})}catch{}return e.body(null,204)});D();import{Hono as iA}from"hono";import{z as ro}from"zod";import{createHash as A1,randomBytes as aA}from"node:crypto";import{and as rA,eq as a_,gt as S1,isNull as x1,lt as R1}from"drizzle-orm";var T1={vscode:"VS Code extension","vscode-insiders":"VS Code Insiders extension",cursor:"Cursor extension",windsurf:"Windsurf extension"},oA="VS Code extension";function k1(e){return e?T1[e]??oA:oA}c(k1,"editorKeyName");var sA=6e4;async function N1(){try{await d.delete(qn).where(R1(qn.expiresAt,new Date))}catch{}}c(N1,"sweepExpiredCodes");setInterval(()=>void N1(),5*6e4).unref?.();var Mu=new iA,j1=ro.object({code:ro.string().min(1).max(256)}),P1=ro.object({refreshToken:ro.string().min(1).max(2048)});Mu.post("/auth/extension/refresh",async e=>{let t=await e.req.json().catch(()=>null),n=P1.safeParse(t);if(!n.success)return e.json({error:"invalid request"},400);let r=await zd(n.data.refreshToken);return r.ok?e.json(r.session):e.json({error:r.error},r.status)});Mu.post("/auth/extension/exchange",async e=>{let t=await e.req.json().catch(()=>null),n=j1.safeParse(t);if(!n.success)return e.json({error:"invalid request"},400);let[r]=await d.delete(qn).where(rA(a_(qn.code,n.data.code),S1(qn.expiresAt,new Date))).returning({userId:qn.userId,editor:qn.editor,email:qn.email});if(!r)return e.json({error:"code not found or expired"},404);let o=k1(r.editor),{plaintext:s,hash:i,prefix:a}=O1();try{await d.transaction(async u=>{await u.update(Ae).set({revokedAt:new Date}).where(rA(a_(Ae.userId,r.userId),a_(Ae.name,o),x1(Ae.revokedAt))),await u.insert(Ae).values({userId:r.userId,name:o,keyHash:i,keyPrefix:a})})}catch(u){return console.log(`[auth] extension/exchange mint failed userId=${r.userId} err=${u.message}`),e.json({error:"could not mint session"},500)}return e.json({accessToken:s,expiresAt:null,email:r.email})});var Km=new iA,D1=ro.object({refreshToken:ro.string().min(1).nullish(),expiresAt:ro.string().nullish(),email:ro.string().email().nullish(),editor:ro.enum(["vscode","vscode-insiders","cursor","windsurf"]).nullish()});function O1(){let e=`rm_${aA(32).toString("base64url")}`;return{plaintext:e,hash:A1("sha256").update(e).digest("hex"),prefix:e.slice(0,11)}}c(O1,"generateApiKey");Km.post("/auth/extension/code",async e=>{let t=e.get("userId");if(!t)return e.json({error:"unauthenticated"},401);let n=await e.req.json().catch(()=>null),r=D1.safeParse(n);if(!r.success)return e.json({error:"invalid request"},400);let o=aA(32).toString("base64url");try{await d.insert(qn).values({code:o,userId:t,editor:r.data.editor??null,email:r.data.email??null,expiresAt:new Date(Date.now()+sA)})}catch(s){return console.log(`[auth] extension/code intent insert failed userId=${t} err=${s.message}`),e.json({error:"could not start sign-in"},500)}return e.json({code:o,expiresInSeconds:Math.floor(sA/1e3),sessionStrategy:"api_key"})});ou();import{Hono as C1}from"hono";var Gm=new C1;function L1(e,t){let n=e.record??{};return e.schema==="auth"&&e.table==="users"&&e.type==="INSERT"?{title:"\u{1F389} New signup",color:2278750,fields:[{name:"Email",value:n.email??t??"unknown",inline:!0},{name:"User ID",value:String(n.id??"unknown"),inline:!0}],timestamp:new Date().toISOString()}:e.schema==="auth"&&e.table==="sessions"&&e.type==="INSERT"?{title:"\u{1F44B} Login",color:3900150,fields:[{name:"Email",value:t??"unknown",inline:!0},{name:"User ID",value:String(n.user_id??"unknown"),inline:!0}],timestamp:new Date().toISOString()}:null}c(L1,"formatEmbed");async function M1(e){if(!e)return null;try{let t=zn(),{data:n}=await t.auth.admin.getUserById(e);return n.user?.email??null}catch{return null}}c(M1,"lookupEmail");async function $1(e,t){let n=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({embeds:[t]})});n.ok||console.error("[webhooks] Discord post failed",n.status,await n.text().catch(()=>""))}c($1,"postToDiscord");Gm.post("/webhooks/supabase-auth",async e=>{let t=process.env.SUPABASE_WEBHOOK_SECRET,n=process.env.DISCORD_WEBHOOK_URL;if(!t||!n)return e.json({error:"webhook not configured"},503);if(e.req.header("x-webhook-secret")!==t)return e.json({error:"unauthorized"},401);let o;try{o=await e.req.json()}catch{return e.json({error:"invalid json"},400)}let i=o.schema==="auth"&&o.table==="sessions"&&o.type==="INSERT"?await M1(o.record?.user_id):null,a=L1(o,i);return a?(await $1(n,a),e.json({ok:!0})):e.json({ok:!0,skipped:!0})});D();import{Hono as X1}from"hono";import{z as Je}from"zod";import{and as Uu,desc as Zm,eq as Lr,gte as b_,isNull as Q1,sql as Z1}from"drizzle-orm";var u_="anthropic",q1=[{limitType:"five_hour_percent",unit:"percentage",displayName:"5-hour window"}],c_=[{limitType:"five_hour_percent",unit:"percentage",displayName:"5-hour window"},{limitType:"seven_day_percent",unit:"percentage",displayName:"Weekly window"}];function U1(e){return typeof e=="object"&&e!==null}c(U1,"isOAuthUsageResponse");function cA(e,t,n,r,o,s){if(!e||typeof e.used_percentage!="number")return null;let i=typeof e.resets_at=="number"?new Date(e.resets_at*1e3):null;return{provider:u_,plan:n,limitType:t,value:e.used_percentage,unit:"percentage",comparator:"=",resetsAt:i,sourceType:"oauth_usage",sourceUrl:r,sourceEvidence:o,confidence:1,observedAt:s}}c(cA,"parseWindow");function H1(e,t){let n=e.match(/reset(?:s|\s+at)?\s+(?:at\s+)?(\d{1,2}):(\d{2})\s*(am|pm)?\s*(?:\(([^)]+)\))?/i);if(!n)return null;let r=parseInt(n[1],10),o=parseInt(n[2],10),s=n[3]?.toLowerCase();if(s==="pm"&&r<12&&(r+=12),s==="am"&&r===12&&(r=0),isNaN(r)||isNaN(o)||r>23||o>59)return null;let i=new Date(t);return i.setHours(r,o,0,0),i.getTime()<=t.getTime()&&i.setDate(i.getDate()+1),i}c(H1,"parseResetTime");var d_={id:u_,displayName:"Anthropic (Claude Code)",plans:["unknown","pro","max_5x","max_20x"],limits:{unknown:c_,pro:q1,max_5x:c_,max_20x:c_},docs:[{url:"https://docs.claude.com/en/docs/claude-code/setup#usage-limits",parse(e){let t=[],n=e.replace(/<script[\s\S]*?<\/script>/gi," ").replace(/<style[\s\S]*?<\/style>/gi," ").replace(/<[^>]+>/g," ").replace(/\s+/g," ").trim(),r=n.match(/(\d{1,4})\s+messages?\s+(?:every|per)\s+5[-\s]?hours?/i);r&&t.push({plan:"unknown",limitType:"five_hour_messages",value:parseInt(r[1],10),unit:"messages",comparator:"="});let o=n.match(/(\d{1,5})\s+messages?\s+(?:per|every)\s+(?:week|7[-\s]?days?)/i);return o&&t.push({plan:"unknown",limitType:"seven_day_messages",value:parseInt(o[1],10),unit:"messages",comparator:"="}),t}}],liveSource:{matches(e,t){return e==="api.anthropic.com"&&t==="/api/oauth/usage"},parse(e,t){if(!U1(e))return null;let n=e.rate_limits;if(!n||typeof n!="object")return[];let r=t.observedAt??new Date,o=t.plan??"unknown",s=`https://${t.host}${t.path}`,i={rawResponse:e},a=[],u=cA(n.five_hour,"five_hour_percent",o,s,i,r);u&&a.push(u);let l=cA(n.seven_day,"seven_day_percent",o,s,i,r);return l&&a.push(l),a}},observe429(e){if(e.statusCode!==429||e.host!=="api.anthropic.com")return null;let t="",n=e.responseBody;if(typeof n=="string")t=n;else if(n&&typeof n=="object"){let o=n,s=o.error;if(s&&typeof s.message=="string")t=s.message;else if(typeof o.message=="string")t=o.message;else try{t=JSON.stringify(n)}catch{return null}}if(!t)return null;let r=H1(t,e.observedAt);return[{provider:u_,plan:e.plan??"unknown",limitType:"five_hour_percent",value:100,unit:"percentage",comparator:">=",resetsAt:r,sourceType:"self_observed_429",sourceUrl:`https://${e.host}${e.path}`,sourceEvidence:{responseBody:n,parsedText:t},confidence:.9,userId:e.userId??null,observedAt:e.observedAt}]}};var l_="codex",m_="chatgpt.com",uA="/backend-api/codex/responses",B1="codex.rate_limits",dA=["primary","secondary"];function F1(e,t){return t!=null?t>=1440?"seven_day_percent":"five_hour_percent":e==="secondary"?"seven_day_percent":"five_hour_percent"}c(F1,"limitTypeForWindow");var ka=[{limitType:"five_hour_percent",unit:"percentage",displayName:"5-hour usage"},{limitType:"seven_day_percent",unit:"percentage",displayName:"7-day usage"}],p_={id:l_,displayName:"Codex CLI (OpenAI)",plans:["unknown","free","plus","pro","team","enterprise"],limits:{unknown:ka,free:ka,plus:ka,pro:ka,team:ka,enterprise:ka},docs:[{url:"https://platform.openai.com/docs/guides/rate-limits",parse(e){return[]}}],liveSource:{matches(e,t){return!1},parse(e,t){return null},streamFrame:{matches(e,t){return e===m_&&t.startsWith(uA)},parse(e,t){let n;try{n=JSON.parse(e)}catch{return null}if(typeof n!="object"||n===null||n.type!==B1)return null;let r=n.rate_limits;if(typeof r!="object"||r===null)return null;let o=t.observedAt??new Date,s=t.plan??"unknown",i=[];for(let a of dA){let u=r[a];if(typeof u!="object"||u===null)continue;let l=u,m=l.used_percent??l.used_percentage;if(typeof m!="number"||!isFinite(m))continue;let f=m,_=l.window_minutes,v=typeof _=="number"&&isFinite(_)?_:null,h=F1(a,v),p=null,w=l.reset_at??l.resets_at;if(typeof w=="string"){let I=new Date(w);isNaN(I.getTime())||(p=I)}else typeof w=="number"&&isFinite(w)&&(p=new Date(w*1e3));i.push({provider:l_,plan:s,limitType:h,value:f,unit:"percentage",comparator:"=",resetsAt:p,sourceType:"live_stream",sourceUrl:`wss://${m_}${uA}`,sourceEvidence:{wireKey:a,frame:n},confidence:1,observedAt:o})}return i.length===0&&dA.some(u=>{let l=r[u];return typeof l=="object"&&l!==null})&&console.warn(`[codex] rate_limits windows present but none parsed \u2014 field drift? sample=${JSON.stringify(r).slice(0,300)}`),i.length>0?i:null}}},observe429(e){return e.statusCode!==429||e.host!==m_?null:[{provider:l_,plan:e.plan??"unknown",limitType:"five_hour_percent",value:100,unit:"percentage",comparator:">=",resetsAt:null,sourceType:"self_observed_429",sourceUrl:`https://${e.host}${e.path}`,sourceEvidence:{responseBody:e.responseBody},confidence:.9,userId:e.userId??null,observedAt:e.observedAt}]}};var $u={anthropic:d_,codex:p_};function f_(e){for(let t of Object.values($u))if(t.liveSource?.headers?.matchesHost(e))return t}c(f_,"matchLiveHeaders");function g_(e,t){for(let n of Object.values($u))if(n.liveSource?.streamFrame?.matches(e,t))return n}c(g_,"matchStreamFrame");var pde=1440*60*1e3;D();import{and as mA,desc as pA,eq as qu,gte as J1,sql as K1}from"drizzle-orm";function h_(e){let{used_percentage:t,burnRateEtaSeconds:n,secondsUntilReset:r,hadObserved429:o}=e;return t>=100||o?"hit":t>=95||t>=80&&n!==null&&n<900?"imminent":t>=80&&n!==null&&n<r?"approaching":t>=80?"soft":"none"}c(h_,"classifySeverity");function Na(e){switch(e){case"none":return 0;case"soft":return 1;case"approaching":return 2;case"imminent":return 3;case"hit":return 4}}c(Na,"severityRank");var Ym={soft:"soft warning",approaching:"approaching limit",imminent:"imminent limit",hit:"limit reached"};function W1(e,t){if(!e)return"soon";let n=new Date(e).getTime()-t;if(n<=0)return"now";let r=Math.round(n/6e4);if(r<60)return`in ${r} min`;let o=Math.floor(r/60),s=r%60;return s>0?`in ${o}h ${s}m`:`in ${o}h`}c(W1,"formatTimeLeft");function __(e,t,n,r,o=Date.now()){let s=W1(r,o);if(e==="hit")return`Claude ${t} reached 100% \u2014 requests will fail. Resets ${s}.`;let i=n!=null?`${n.toFixed(0)}%`:"limit";return`Claude ${t} at ${i} \u2014 ${Ym[e]}. Resets ${s}.`}c(__,"formatAlertMessage");function y_(e,t=new Date){if(e.length<2)return null;let n=300*1e3,r=t.getTime()-n,o=e.filter(b=>b.observedAt.getTime()>=r).sort((b,A)=>b.observedAt.getTime()-A.observedAt.getTime());if(o.length<2)return null;let s=o[o.length-1];if(s.value>=100)return null;let i=o[0].observedAt.getTime(),a=o.map(b=>(b.observedAt.getTime()-i)/1e3),u=o.map(b=>b.value),l=a.length,m=a.reduce((b,A)=>b+A,0),f=u.reduce((b,A)=>b+A,0),_=a.reduce((b,A,E)=>b+A*u[E],0),v=a.reduce((b,A)=>b+A*A,0),h=l*v-m*m;if(h===0)return null;let p=(l*_-m*f)/h;return p<=0?null:(100-s.value)/p}c(y_,"projectExhaustion");var z1=300*1e3,V1=70;function w_(e){let{proposedSeverity:t,lastDispatch:n,currentUsedPercentage:r,now:o,isFirstTime429:s}=e;if(s)return!0;if(!n)return Na(t)>0;let i=Na(t),a=Na(n.severity);return i>a?!0:o.getTime()-n.lastDispatchedAt.getTime()>=z1?a>=Na("approaching")&&i===a?!(r>=V1):i>0:!1}c(w_,"shouldDispatch");function v_(e){let t=y_(e.observations,e.now),n=Math.max(0,Math.floor((e.currentResetsAt.getTime()-e.now.getTime())/1e3)),r=h_({used_percentage:e.currentUsedPercentage,burnRateEtaSeconds:t,secondsUntilReset:n,hadObserved429:e.hadObserved429}),o={alertKey:e.alertKey,severity:r,usedPercentage:e.currentUsedPercentage,resetsAt:e.currentResetsAt.toISOString(),burnRateEtaSeconds:t};if(r==="none")return{shouldDispatch:!1,severity:"none",reason:"below threshold",payload:o};let s=e.hadObserved429&&(e.lastDispatch===null||e.lastDispatch.severity!=="hit"),i=w_({proposedSeverity:r,lastDispatch:e.lastDispatch,currentResetsAt:e.currentResetsAt,currentUsedPercentage:e.currentUsedPercentage,now:e.now,isFirstTime429:s});return{shouldDispatch:i,severity:r,reason:i?"dispatch":"suppressed by cooldown/hysteresis",payload:o}}c(v_,"evaluate");function lA(e,t,n){return`${e}:${t}:${n}`}c(lA,"deriveAlertKey");D();async function ja(e){await un({userId:e.userId,type:`usage_${e.severity}`,title:e.title??`Usage limit \u2014 ${Ym[e.severity]}`,body:e.message,url:"/usage",sourceTable:"alert_dispatches",sourceId:e.dispatchId})}c(ja,"notifyFromDispatch");var G1=30*6e4;async function Xm(e,t){let n=new Date((t.observedAt??new Date).getTime()-G1);try{let o=await d.execute(K1`
|
|
1485
|
+
`);return e.json({deployments:n})});D();import{Hono as A1}from"hono";import{z as er}from"zod";var Jp=new A1,S1=er.object({event:er.string().min(1).max(64),deviceId:er.string().max(128).optional(),command:er.string().max(128).optional(),statusCode:er.number().int().optional(),message:er.string().max(1e3).optional(),cliVersion:er.string().max(64).optional(),os:er.string().max(32).optional(),nodeVersion:er.string().max(32).optional(),proxied:er.boolean().optional(),props:er.record(er.unknown()).optional()});Jp.post("/telemetry/cli-error",async e=>{let t=S1.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(Au).values({deviceId:n.deviceId??null,event:n.event,command:n.command??null,statusCode:n.statusCode??null,message:n.message??null,cliVersion:n.cliVersion??null,os:n.os??null,nodeVersion:n.nodeVersion??null,proxied:n.proxied??null,props:n.props??{}})}catch{}return e.body(null,204)});D();import{Hono as iA}from"hono";import{z as ro}from"zod";import{createHash as x1,randomBytes as aA}from"node:crypto";import{and as rA,eq as a_,gt as T1,isNull as R1,lt as k1}from"drizzle-orm";var N1={vscode:"VS Code extension","vscode-insiders":"VS Code Insiders extension",cursor:"Cursor extension",windsurf:"Windsurf extension"},oA="VS Code extension";function j1(e){return e?N1[e]??oA:oA}c(j1,"editorKeyName");var sA=6e4;async function P1(){try{await u.delete(qn).where(k1(qn.expiresAt,new Date))}catch{}}c(P1,"sweepExpiredCodes");setInterval(()=>void P1(),5*6e4).unref?.();var $d=new iA,D1=ro.object({code:ro.string().min(1).max(256)}),O1=ro.object({refreshToken:ro.string().min(1).max(2048)});$d.post("/auth/extension/refresh",async e=>{let t=await e.req.json().catch(()=>null),n=O1.safeParse(t);if(!n.success)return e.json({error:"invalid request"},400);let r=await Vu(n.data.refreshToken);return r.ok?e.json(r.session):e.json({error:r.error},r.status)});$d.post("/auth/extension/exchange",async e=>{let t=await e.req.json().catch(()=>null),n=D1.safeParse(t);if(!n.success)return e.json({error:"invalid request"},400);let[r]=await u.delete(qn).where(rA(a_(qn.code,n.data.code),T1(qn.expiresAt,new Date))).returning({userId:qn.userId,editor:qn.editor,email:qn.email});if(!r)return e.json({error:"code not found or expired"},404);let o=j1(r.editor),{plaintext:s,hash:i,prefix:a}=L1();try{await u.transaction(async d=>{await d.update(Ae).set({revokedAt:new Date}).where(rA(a_(Ae.userId,r.userId),a_(Ae.name,o),R1(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 Kp=new iA,C1=ro.object({refreshToken:ro.string().min(1).nullish(),expiresAt:ro.string().nullish(),email:ro.string().email().nullish(),editor:ro.enum(["vscode","vscode-insiders","cursor","windsurf"]).nullish()});function L1(){let e=`rm_${aA(32).toString("base64url")}`;return{plaintext:e,hash:x1("sha256").update(e).digest("hex"),prefix:e.slice(0,11)}}c(L1,"generateApiKey");Kp.post("/auth/extension/code",async e=>{let t=e.get("userId");if(!t)return e.json({error:"unauthenticated"},401);let n=await e.req.json().catch(()=>null),r=C1.safeParse(n);if(!r.success)return e.json({error:"invalid request"},400);let o=aA(32).toString("base64url");try{await u.insert(qn).values({code:o,userId:t,editor:r.data.editor??null,email:r.data.email??null,expiresAt:new Date(Date.now()+sA)})}catch(s){return console.log(`[auth] extension/code intent insert failed userId=${t} err=${s.message}`),e.json({error:"could not start sign-in"},500)}return e.json({code:o,expiresInSeconds:Math.floor(sA/1e3),sessionStrategy:"api_key"})});sd();import{Hono as M1}from"hono";var Gp=new M1;function $1(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($1,"formatEmbed");async function q1(e){if(!e)return null;try{let t=zn(),{data:n}=await t.auth.admin.getUserById(e);return n.user?.email??null}catch{return null}}c(q1,"lookupEmail");async function U1(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(U1,"postToDiscord");Gp.post("/webhooks/supabase-auth",async e=>{let t=process.env.SUPABASE_WEBHOOK_SECRET,n=process.env.DISCORD_WEBHOOK_URL;if(!t||!n)return e.json({error:"webhook not configured"},503);if(e.req.header("x-webhook-secret")!==t)return e.json({error:"unauthorized"},401);let o;try{o=await e.req.json()}catch{return e.json({error:"invalid json"},400)}let i=o.schema==="auth"&&o.table==="sessions"&&o.type==="INSERT"?await q1(o.record?.user_id):null,a=$1(o,i);return a?(await U1(n,a),e.json({ok:!0})):e.json({ok:!0,skipped:!0})});D();import{Hono as Z1}from"hono";import{z as Je}from"zod";import{and as Hd,desc as Zp,eq as Lr,gte as b_,isNull as eq,sql as tq}from"drizzle-orm";var d_="anthropic",H1=[{limitType:"five_hour_percent",unit:"percentage",displayName:"5-hour window"}],c_=[{limitType:"five_hour_percent",unit:"percentage",displayName:"5-hour window"},{limitType:"seven_day_percent",unit:"percentage",displayName:"Weekly window"}];function B1(e){return typeof e=="object"&&e!==null}c(B1,"isOAuthUsageResponse");function cA(e,t,n,r,o,s){if(!e||typeof e.used_percentage!="number")return null;let i=typeof e.resets_at=="number"?new Date(e.resets_at*1e3):null;return{provider:d_,plan:n,limitType:t,value:e.used_percentage,unit:"percentage",comparator:"=",resetsAt:i,sourceType:"oauth_usage",sourceUrl:r,sourceEvidence:o,confidence:1,observedAt:s}}c(cA,"parseWindow");function F1(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(F1,"parseResetTime");var u_={id:d_,displayName:"Anthropic (Claude Code)",plans:["unknown","pro","max_5x","max_20x"],limits:{unknown:c_,pro:H1,max_5x:c_,max_20x:c_},docs:[{url:"https://docs.claude.com/en/docs/claude-code/setup#usage-limits",parse(e){let t=[],n=e.replace(/<script[\s\S]*?<\/script>/gi," ").replace(/<style[\s\S]*?<\/style>/gi," ").replace(/<[^>]+>/g," ").replace(/\s+/g," ").trim(),r=n.match(/(\d{1,4})\s+messages?\s+(?:every|per)\s+5[-\s]?hours?/i);r&&t.push({plan:"unknown",limitType:"five_hour_messages",value:parseInt(r[1],10),unit:"messages",comparator:"="});let o=n.match(/(\d{1,5})\s+messages?\s+(?:per|every)\s+(?:week|7[-\s]?days?)/i);return o&&t.push({plan:"unknown",limitType:"seven_day_messages",value:parseInt(o[1],10),unit:"messages",comparator:"="}),t}}],liveSource:{matches(e,t){return e==="api.anthropic.com"&&t==="/api/oauth/usage"},parse(e,t){if(!B1(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=cA(n.five_hour,"five_hour_percent",o,s,i,r);d&&a.push(d);let l=cA(n.seven_day,"seven_day_percent",o,s,i,r);return l&&a.push(l),a}},observe429(e){if(e.statusCode!==429||e.host!=="api.anthropic.com")return null;let t="",n=e.responseBody;if(typeof n=="string")t=n;else if(n&&typeof n=="object"){let o=n,s=o.error;if(s&&typeof s.message=="string")t=s.message;else if(typeof o.message=="string")t=o.message;else try{t=JSON.stringify(n)}catch{return null}}if(!t)return null;let r=F1(t,e.observedAt);return[{provider:d_,plan:e.plan??"unknown",limitType:"five_hour_percent",value:100,unit:"percentage",comparator:">=",resetsAt:r,sourceType:"self_observed_429",sourceUrl:`https://${e.host}${e.path}`,sourceEvidence:{responseBody:n,parsedText:t},confidence:.9,userId:e.userId??null,observedAt:e.observedAt}]}};var l_="codex",p_="chatgpt.com",dA="/backend-api/codex/responses",W1="codex.rate_limits",uA=["primary","secondary"];function z1(e,t){return t!=null?t>=1440?"seven_day_percent":"five_hour_percent":e==="secondary"?"seven_day_percent":"five_hour_percent"}c(z1,"limitTypeForWindow");var ka=[{limitType:"five_hour_percent",unit:"percentage",displayName:"5-hour usage"},{limitType:"seven_day_percent",unit:"percentage",displayName:"7-day usage"}],m_={id:l_,displayName:"Codex CLI (OpenAI)",plans:["unknown","free","plus","pro","team","enterprise"],limits:{unknown:ka,free:ka,plus:ka,pro:ka,team:ka,enterprise:ka},docs:[{url:"https://platform.openai.com/docs/guides/rate-limits",parse(e){return[]}}],liveSource:{matches(e,t){return!1},parse(e,t){return null},streamFrame:{matches(e,t){return e===p_&&t.startsWith(dA)},parse(e,t){let n;try{n=JSON.parse(e)}catch{return null}if(typeof n!="object"||n===null||n.type!==W1)return null;let r=n.rate_limits;if(typeof r!="object"||r===null)return null;let o=t.observedAt??new Date,s=t.plan??"unknown",i=[];for(let a of uA){let 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 f=p,_=l.window_minutes,v=typeof _=="number"&&isFinite(_)?_:null,g=z1(a,v),m=null,w=l.reset_at??l.resets_at;if(typeof w=="string"){let I=new Date(w);isNaN(I.getTime())||(m=I)}else typeof w=="number"&&isFinite(w)&&(m=new Date(w*1e3));i.push({provider:l_,plan:s,limitType:g,value:f,unit:"percentage",comparator:"=",resetsAt:m,sourceType:"live_stream",sourceUrl:`wss://${p_}${dA}`,sourceEvidence:{wireKey:a,frame:n},confidence:1,observedAt:o})}return i.length===0&&uA.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!==p_?null:[{provider:l_,plan:e.plan??"unknown",limitType:"five_hour_percent",value:100,unit:"percentage",comparator:">=",resetsAt:null,sourceType:"self_observed_429",sourceUrl:`https://${e.host}${e.path}`,sourceEvidence:{responseBody:e.responseBody},confidence:.9,userId:e.userId??null,observedAt:e.observedAt}]}};var qd={anthropic:u_,codex:m_};function f_(e){for(let t of Object.values(qd))if(t.liveSource?.headers?.matchesHost(e))return t}c(f_,"matchLiveHeaders");function g_(e,t){for(let n of Object.values(qd))if(n.liveSource?.streamFrame?.matches(e,t))return n}c(g_,"matchStreamFrame");var hue=1440*60*1e3;D();import{and as pA,desc as mA,eq as Ud,gte as G1,sql as Y1}from"drizzle-orm";function h_(e){let{used_percentage:t,burnRateEtaSeconds:n,secondsUntilReset:r,hadObserved429:o}=e;return t>=100||o?"hit":t>=95||t>=80&&n!==null&&n<900?"imminent":t>=80&&n!==null&&n<r?"approaching":t>=80?"soft":"none"}c(h_,"classifySeverity");function Na(e){switch(e){case"none":return 0;case"soft":return 1;case"approaching":return 2;case"imminent":return 3;case"hit":return 4}}c(Na,"severityRank");var Yp={soft:"soft warning",approaching:"approaching limit",imminent:"imminent limit",hit:"limit reached"};function V1(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(V1,"formatTimeLeft");function __(e,t,n,r,o=Date.now()){let s=V1(r,o);if(e==="hit")return`Claude ${t} reached 100% \u2014 requests will fail. Resets ${s}.`;let i=n!=null?`${n.toFixed(0)}%`:"limit";return`Claude ${t} at ${i} \u2014 ${Yp[e]}. Resets ${s}.`}c(__,"formatAlertMessage");function y_(e,t=new Date){if(e.length<2)return null;let n=300*1e3,r=t.getTime()-n,o=e.filter(b=>b.observedAt.getTime()>=r).sort((b,A)=>b.observedAt.getTime()-A.observedAt.getTime());if(o.length<2)return null;let s=o[o.length-1];if(s.value>=100)return null;let i=o[0].observedAt.getTime(),a=o.map(b=>(b.observedAt.getTime()-i)/1e3),d=o.map(b=>b.value),l=a.length,p=a.reduce((b,A)=>b+A,0),f=d.reduce((b,A)=>b+A,0),_=a.reduce((b,A,E)=>b+A*d[E],0),v=a.reduce((b,A)=>b+A*A,0),g=l*v-p*p;if(g===0)return null;let m=(l*_-p*f)/g;return m<=0?null:(100-s.value)/m}c(y_,"projectExhaustion");var J1=300*1e3,K1=70;function w_(e){let{proposedSeverity:t,lastDispatch:n,currentUsedPercentage:r,now:o,isFirstTime429:s}=e;if(s)return!0;if(!n)return Na(t)>0;let i=Na(t),a=Na(n.severity);return i>a?!0:o.getTime()-n.lastDispatchedAt.getTime()>=J1?a>=Na("approaching")&&i===a?!(r>=K1):i>0:!1}c(w_,"shouldDispatch");function v_(e){let t=y_(e.observations,e.now),n=Math.max(0,Math.floor((e.currentResetsAt.getTime()-e.now.getTime())/1e3)),r=h_({used_percentage:e.currentUsedPercentage,burnRateEtaSeconds:t,secondsUntilReset:n,hadObserved429:e.hadObserved429}),o={alertKey:e.alertKey,severity:r,usedPercentage:e.currentUsedPercentage,resetsAt:e.currentResetsAt.toISOString(),burnRateEtaSeconds:t};if(r==="none")return{shouldDispatch:!1,severity:"none",reason:"below threshold",payload:o};let s=e.hadObserved429&&(e.lastDispatch===null||e.lastDispatch.severity!=="hit"),i=w_({proposedSeverity:r,lastDispatch:e.lastDispatch,currentResetsAt:e.currentResetsAt,currentUsedPercentage:e.currentUsedPercentage,now:e.now,isFirstTime429:s});return{shouldDispatch:i,severity:r,reason:i?"dispatch":"suppressed by cooldown/hysteresis",payload:o}}c(v_,"evaluate");function lA(e,t,n){return`${e}:${t}:${n}`}c(lA,"deriveAlertKey");D();async function ja(e){await dn({userId:e.userId,type:`usage_${e.severity}`,title:e.title??`Usage limit \u2014 ${Yp[e.severity]}`,body:e.message,url:"/usage",sourceTable:"alert_dispatches",sourceId:e.dispatchId})}c(ja,"notifyFromDispatch");var X1=30*6e4;async function Xp(e,t){let n=new Date((t.observedAt??new Date).getTime()-X1);try{let o=await u.execute(Y1`
|
|
1439
1486
|
SELECT id, observed_at
|
|
1440
1487
|
FROM limit_observations
|
|
1441
1488
|
WHERE user_id = ${e}
|
|
@@ -1448,10 +1495,10 @@ end`;async function Ks(e){let t=e.req.param("teamId");if(!t||!to.test(t))return{
|
|
|
1448
1495
|
AND observed_at >= ${n.toISOString()}::timestamptz
|
|
1449
1496
|
ORDER BY observed_at DESC
|
|
1450
1497
|
LIMIT 1
|
|
1451
|
-
`);if(o.length>0){let s=o[0];return{id:s.id,observedAt:new Date(s.observed_at).toISOString(),deduped:!0}}}catch(o){console.warn("[observe] dedup probe failed; proceeding to insert",o)}let[r]=await d.insert(ve).values({provider:t.provider,plan:t.plan,limitType:t.limitType,value:String(t.value),unit:t.unit,comparator:t.comparator,resetsAt:t.resetsAt??null,sourceType:t.sourceType,sourceUrl:t.sourceUrl??null,sourceEvidence:t.sourceEvidence??null,confidence:String(t.confidence),userId:e,...t.observedAt?{observedAt:t.observedAt}:{}}).returning({id:ve.id,observedAt:ve.observedAt});if(t.sourceType==="oauth_usage"||t.sourceType==="self_observed_429")try{let o=lA(t.provider,t.plan,t.limitType),s=new Date,i=new Date(s.getTime()-600*1e3),a=await d.select({observedAt:ve.observedAt,value:ve.value}).from(ve).where(mA(qu(ve.userId,e),qu(ve.provider,t.provider),qu(ve.limitType,t.limitType),J1(ve.observedAt,i))).orderBy(pA(ve.observedAt)).limit(50),u=await d.select().from(kn).where(mA(qu(kn.userId,e),qu(kn.alertKey,o))).orderBy(pA(kn.lastDispatchedAt)).limit(1),l=v_({alertKey:o,observations:a.map(m=>({observedAt:m.observedAt,value:Number(m.value)})),currentUsedPercentage:t.value,currentResetsAt:t.resetsAt??new Date(s.getTime()+300*60*1e3),hadObserved429:t.sourceType==="self_observed_429",lastDispatch:u[0]?{severity:u[0].severity,lastDispatchedAt:u[0].lastDispatchedAt,lastState:u[0].lastState}:null,now:s});if(l.shouldDispatch&&l.severity!=="none"){let m=l.severity,[f]=await d.insert(kn).values({userId:e,alertKey:o,severity:m,lastState:l.payload,channel:"banner"}).returning({id:kn.id});f&&await ja({userId:e,dispatchId:f.id,severity:m,message:__(m,t.limitType,l.payload.usedPercentage,l.payload.resetsAt)})}}catch(o){console.error("alert evaluation failed",o)}return{id:r.id,observedAt:new Date(r.observedAt).toISOString(),deduped:!1}}c(Xm,"processObservation");function fA(e,t){return`${e}::${t.provider}::${t.sourceType}::${t.limitType}`}c(fA,"observationKey");function Qm(){return process.env.OBSERVE_BATCHING!=="0"}c(Qm,"observeBatchingEnabled");function gA(){let e=Number(process.env.OBSERVE_BATCH_BUFFER_MAX);return Number.isFinite(e)&&e>0?Math.floor(e):5e3}c(gA,"observeBufferMax");function hA(){let e=Number(process.env.PG_POOL_MAX)||3;return Math.max(1,e-1)}c(hA,"defaultConcurrency");function Y1(e={}){let t=e.process??((I,b)=>Xm(I,b)),n=e.maxBuffered??gA(),r=Math.max(1,e.concurrency??hA()),o=new Map,s=0,i=new Set,a=0,u=!1,l=[];function m(){let I=l;l=[];for(let b of I)b()}c(m,"notifyProgress");function f(){for(;a<r;){let I=null,b=null;for(let[A,E]of o)if(!(i.has(A)||E.length===0)){b=E,o.delete(A),I=A;break}if(I==null||b==null)return;s-=b.length,i.add(I),a++,_(I,b)}}c(f,"tick");async function _(I,b){try{for(let A of b)try{await t(A.userId,A.obs)}catch(E){console.warn("[observe-batcher] drain failed for one observation; dropping it:",E instanceof Error?E.message:E)}}finally{a--,i.delete(I),m(),f()}}c(_,"runDrain");function v(I){if(u||s>=n)return!1;let b=fA(I.userId,I.obs),A=o.get(b);return A?A.push(I):o.set(b,[I]),s++,f(),!0}c(v,"push");function h(I){return new Promise(b=>{let A=!1,E=c(()=>{A||(A=!0,clearTimeout(S),b())},"finish"),S=setTimeout(E,I);S.unref?.(),l.push(E)})}c(h,"waitForProgress");async function p(I){let b=I!=null?Date.now()+I:Number.POSITIVE_INFINITY;for(;;){if(f(),s===0&&a===0)return;let A=b-Date.now();if(A<=0)return;await h(Math.min(A,50))}}c(p,"flush");function w(){u=!0}return c(w,"stop"),{push:v,flush:p,stop:w,size:c(()=>s,"size"),inFlight:c(()=>a,"inFlight")}}c(Y1,"createObserveBatcher");var Xo=null;function I_(){return Xo==null&&(Xo=Y1()),Xo}c(I_,"getObserveBatcher");function _A(){I_(),console.log(`[observe-batcher] batched observe ingest ON (bufferMax=${gA()} drainConcurrency=${hA()}; OBSERVE_BATCHING=0 to disable)`)}c(_A,"initObserveBatcher");async function yA(e=5e3){if(Xo==null)return;Xo.stop(),await Xo.flush(e);let t=Xo.size()+Xo.inFlight();t>0&&console.warn(`[observe-batcher] shutdown flush deadline (${e}ms) hit; dropping ~${t} buffered observation(s)`)}c(yA,"shutdownObserveBatcher");var fr=new X1,eq=Je.object({provider:Je.string().min(1).max(64),plan:Je.string().min(1).max(64),limitType:Je.string().min(1).max(128),value:Je.number().finite(),unit:Je.string().min(1).max(32),comparator:Je.enum(["=",">=","<="]).default("="),resetsAt:Je.union([Je.string(),Je.date(),Je.null()]).optional().transform(e=>{if(e==null)return null;if(e instanceof Date)return e;let t=new Date(e);return isNaN(t.getTime())?null:t}),sourceType:Je.enum(["oauth_usage","self_observed_429","official_docs","self_observed_lower_bound","community","llm_research","release_notes","live_headers","live_stream"]),sourceUrl:Je.string().url().optional().nullable(),sourceEvidence:Je.unknown().optional(),confidence:Je.number().min(0).max(1),observedAt:Je.union([Je.string(),Je.date()]).optional().transform(e=>{if(e==null)return;if(e instanceof Date)return e;let t=new Date(e);return isNaN(t.getTime())?void 0:t})});fr.post("/internal/research/match-headers",async e=>{let t=e.get("userId"),n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON"},400)}let o=Je.object({host:Je.string(),path:Je.string().default("/"),responseHeaders:Je.record(Je.string()),observedAt:Je.string().optional(),plan:Je.string().optional()}).safeParse(n);if(!o.success)return e.json({error:"Invalid request body",issues:o.error.issues},400);let{host:s,path:i,responseHeaders:a,observedAt:u,plan:l}=o.data,m=f_(s);if(!m?.liveSource?.headers)return e.json({observations:[]});let f={host:s,path:i,plan:l??null,observedAt:u?new Date(u):new Date,userId:t},_=m.liveSource.headers.parse(a,f);if(!_||_.length===0)return e.json({observations:[]});let v=[];for(let h of _)try{let p=h.observedAt instanceof Date?h.observedAt:typeof h.observedAt=="string"?new Date(h.observedAt):void 0,[w]=await d.insert(ve).values({provider:h.provider,plan:h.plan,limitType:h.limitType,value:String(h.value),unit:h.unit,comparator:h.comparator??"=",resetsAt:h.resetsAt instanceof Date?h.resetsAt:null,sourceType:h.sourceType,sourceUrl:h.sourceUrl??null,sourceEvidence:h.sourceEvidence??null,confidence:String(h.confidence),userId:t,...p?{observedAt:p}:{}}).returning({id:ve.id});v.push({...h,id:w.id})}catch{}return e.json({observations:v})});fr.post("/internal/research/match-stream-frame",async e=>{let t=e.get("userId"),n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON"},400)}let o=Je.object({host:Je.string(),path:Je.string().default("/"),frameText:Je.string(),observedAt:Je.string().optional(),plan:Je.string().optional()}).safeParse(n);if(!o.success)return e.json({error:"Invalid request body",issues:o.error.issues},400);let{host:s,path:i,frameText:a,observedAt:u,plan:l}=o.data,m=g_(s,i);if(!m?.liveSource?.streamFrame)return e.json({observations:[]});let f={host:s,path:i,plan:l??null,observedAt:u?new Date(u):new Date,userId:t},_=m.liveSource.streamFrame.parse(a,f);if(!_||_.length===0)return e.json({observations:[]});let v=[];for(let h of _)try{let p=h.observedAt instanceof Date?h.observedAt:typeof h.observedAt=="string"?new Date(h.observedAt):void 0,[w]=await d.insert(ve).values({provider:h.provider,plan:h.plan,limitType:h.limitType,value:String(h.value),unit:h.unit,comparator:h.comparator??"=",resetsAt:h.resetsAt instanceof Date?h.resetsAt:null,sourceType:h.sourceType,sourceUrl:h.sourceUrl??null,sourceEvidence:h.sourceEvidence??null,confidence:String(h.confidence),userId:t,...p?{observedAt:p}:{}}).returning({id:ve.id});v.push({...h,id:w.id})}catch{}return e.json({observations:v})});fr.post("/internal/research/observe",async e=>{let t=e.get("userId"),n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON"},400)}let r=eq.safeParse(n);if(!r.success)return e.json({error:"Invalid observation",issues:r.error.issues},400);let o=r.data;if(Qm())return I_().push({userId:t,obs:o})?e.json({buffered:!0,durable:!1},202):(e.header("Retry-After","2"),e.json({error:"Observe buffer full; retry shortly.",durable:!1},429));let s=await Xm(t,o);return e.json({id:s.id,observedAt:s.observedAt,...s.deduped?{deduped:!0}:{}},s.deduped?200:201)});fr.get("/research/active-limits",async e=>{let t=e.req.query("provider"),n=e.req.query("plan"),r=[Q1(tt.effectiveUntil)];t&&r.push(Lr(tt.provider,t)),n&&r.push(Lr(tt.plan,n));let o=await d.select().from(tt).where(Uu(...r)).orderBy(tt.provider,tt.plan,tt.limitType,Zm(tt.effectiveFrom));return e.json({items:o})});fr.get("/research/doc-changes",async e=>{let t=e.req.query("since"),n=t?new Date(t):new Date(Date.now()-7*864e5);if(isNaN(n.getTime()))return e.json({error:"Invalid since parameter"},400);let r=await d.select({id:Dt.id,fetchedAt:Dt.fetchedAt,provider:Dt.provider,docUrl:Dt.docUrl,contentHash:Dt.contentHash,parseSuccess:Dt.parseSuccess}).from(Dt).where(b_(Dt.fetchedAt,n)).orderBy(Dt.provider,Dt.docUrl,Zm(Dt.fetchedAt)),o=new Map;for(let s of r){let i=`${s.provider}::${s.docUrl}`,a=o.get(i);a?(a.previousHash===null&&s.contentHash!==a.latestHash&&(a.previousHash=s.contentHash,a.changed=!0),a.snapshots.push(s)):o.set(i,{provider:s.provider,docUrl:s.docUrl,latestFetchedAt:s.fetchedAt,latestHash:s.contentHash,previousHash:null,parseSuccess:s.parseSuccess,changed:!1,snapshots:[s]})}return e.json({items:Array.from(o.values())})});fr.get("/research/disagreements",async e=>{let t=e.get("userId"),n=Math.min(parseInt(e.req.query("since_days")??"14",10)||14,90),r=new Date(Date.now()-n*864e5),o=await d.select().from(ve).where(Uu(Lr(ve.userId,t),b_(ve.observedAt,r))).orderBy(Zm(ve.observedAt)),s=new Map;for(let a of o){let u=`${a.provider}::${a.plan}::${a.limitType}`,l=s.get(u);l||(l={provider:a.provider,plan:a.plan,limitType:a.limitType,observations:[]},s.set(u,l)),l.observations.push({id:a.id,value:Number(a.value),unit:a.unit,sourceType:a.sourceType,confidence:Number(a.confidence),observedAt:a.observedAt})}let i=[];for(let a of s.values()){if(a.observations.length<2)continue;let u=a.observations.map(_=>_.value).filter(_=>_>0);if(u.length<2)continue;let l=Math.min(...u),m=Math.max(...u);if(l===0)continue;let f=(m-l)/l*100;f>20&&i.push({provider:a.provider,plan:a.plan,limitType:a.limitType,minValue:l,maxValue:m,spreadPct:f,observations:a.observations})}return i.sort((a,u)=>u.spreadPct-a.spreadPct),e.json({items:i.slice(0,100)})});fr.get("/research/confidence-history",async e=>{let t=e.req.query("provider"),n=e.req.query("plan"),r=e.req.query("limit_type"),o=Math.min(parseInt(e.req.query("days")??"90",10)||90,365);if(!t||!n||!r)return e.json({error:"provider, plan, limit_type required"},400);let s=new Date(Date.now()-o*864e5),i=await d.select({effectiveFrom:tt.effectiveFrom,effectiveUntil:tt.effectiveUntil,confidence:tt.confidence,value:tt.value}).from(tt).where(Uu(Lr(tt.provider,t),Lr(tt.plan,n),Lr(tt.limitType,r),b_(tt.effectiveFrom,s))).orderBy(tt.effectiveFrom);return e.json({items:i.map(a=>({effectiveFrom:a.effectiveFrom,effectiveUntil:a.effectiveUntil,confidence:Number(a.confidence),value:Number(a.value)}))})});fr.get("/research/observations",async e=>{let t=e.get("userId"),n=e.req.query("provider"),r=e.req.query("plan"),o=e.req.query("limit_type"),s=Math.min(parseInt(e.req.query("limit")??"50",10)||50,200),i=Math.max(parseInt(e.req.query("offset")??"0",10)||0,0),a=[Lr(ve.userId,t)];n&&a.push(Lr(ve.provider,n)),r&&a.push(Lr(ve.plan,r)),o&&a.push(Lr(ve.limitType,o));let u=await d.select().from(ve).where(Uu(...a)).orderBy(Zm(ve.observedAt)).limit(s).offset(i),[{total:l}]=await d.select({total:Z1`count(*)::int`}).from(ve).where(Uu(...a));return e.json({items:u,total:l,limit:s,offset:i})});D();import{Hono as tq}from"hono";import{and as bA,desc as nq,eq as Pa,isNull as rq,ne as oq,sql as Qo}from"drizzle-orm";var wA={free:.2,pro:1,max_5x:5,max_20x:20},A_=new Set(["free","pro","max_5x","max_20x"]),E_={fiveHourMessages:20,sevenDaySonnetHours:14,sevenDayOpusHours:1.65};function vA(e){let t=wA[e]??wA.max_20x;return{fiveHourMessages:Math.round(E_.fiveHourMessages*t),sevenDaySonnetHours:Math.round(E_.sevenDaySonnetHours*t),sevenDayOpusHours:Math.round(E_.sevenDayOpusHours*t)}}c(vA,"planDefaultCaps");var Hu=new tq,sq=60*1e3,S_=new Map;function iq(e,t){let n=`${e}::${t}`,r=S_.get(n);if(r&&Date.now()-r.at<sq)return r.rows;let o=d.select({limitType:tt.limitType,value:tt.value,unit:tt.unit}).from(tt).where(bA(Pa(tt.provider,e),Pa(tt.plan,t),rq(tt.effectiveUntil)));return o.catch(()=>S_.delete(n)),S_.set(n,{at:Date.now(),rows:o}),o}c(iq,"getActivePlanLimits");var IA=["five_hour_percent","seven_day_percent","seven_day_opus_percent"],aq={anthropic:["oauth_usage"],codex:["live_stream","self_observed_429"]};function cq(e){return aq[e]??["oauth_usage"]}c(cq,"sourceTypesFor");Hu.get("/usage/current-limits",async e=>{let t=e.get("userId"),n=e.req.query("provider")??"anthropic",r=cq(n),o=Qo`user_id = ${t}
|
|
1498
|
+
`);if(o.length>0){let s=o[0];return{id:s.id,observedAt:new Date(s.observed_at).toISOString(),deduped:!0}}}catch(o){console.warn("[observe] dedup probe failed; proceeding to insert",o)}let[r]=await 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=lA(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(pA(Ud(ve.userId,e),Ud(ve.provider,t.provider),Ud(ve.limitType,t.limitType),G1(ve.observedAt,i))).orderBy(mA(ve.observedAt)).limit(50),d=await u.select().from(kn).where(pA(Ud(kn.userId,e),Ud(kn.alertKey,o))).orderBy(mA(kn.lastDispatchedAt)).limit(1),l=v_({alertKey:o,observations:a.map(p=>({observedAt:p.observedAt,value:Number(p.value)})),currentUsedPercentage:t.value,currentResetsAt:t.resetsAt??new Date(s.getTime()+300*60*1e3),hadObserved429:t.sourceType==="self_observed_429",lastDispatch: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,[f]=await u.insert(kn).values({userId:e,alertKey:o,severity:p,lastState:l.payload,channel:"banner"}).returning({id:kn.id});f&&await ja({userId:e,dispatchId:f.id,severity:p,message:__(p,t.limitType,l.payload.usedPercentage,l.payload.resetsAt)})}}catch(o){console.error("alert evaluation failed",o)}return{id:r.id,observedAt:new Date(r.observedAt).toISOString(),deduped:!1}}c(Xp,"processObservation");function fA(e,t){return`${e}::${t.provider}::${t.sourceType}::${t.limitType}`}c(fA,"observationKey");function Qp(){return process.env.OBSERVE_BATCHING!=="0"}c(Qp,"observeBatchingEnabled");function gA(){let e=Number(process.env.OBSERVE_BATCH_BUFFER_MAX);return Number.isFinite(e)&&e>0?Math.floor(e):5e3}c(gA,"observeBufferMax");function hA(){let e=Number(process.env.PG_POOL_MAX)||3;return Math.max(1,e-1)}c(hA,"defaultConcurrency");function Q1(e={}){let t=e.process??((I,b)=>Xp(I,b)),n=e.maxBuffered??gA(),r=Math.max(1,e.concurrency??hA()),o=new Map,s=0,i=new Set,a=0,d=!1,l=[];function p(){let I=l;l=[];for(let b of I)b()}c(p,"notifyProgress");function f(){for(;a<r;){let I=null,b=null;for(let[A,E]of o)if(!(i.has(A)||E.length===0)){b=E,o.delete(A),I=A;break}if(I==null||b==null)return;s-=b.length,i.add(I),a++,_(I,b)}}c(f,"tick");async function _(I,b){try{for(let A of b)try{await t(A.userId,A.obs)}catch(E){console.warn("[observe-batcher] drain failed for one observation; dropping it:",E instanceof Error?E.message:E)}}finally{a--,i.delete(I),p(),f()}}c(_,"runDrain");function v(I){if(d||s>=n)return!1;let b=fA(I.userId,I.obs),A=o.get(b);return A?A.push(I):o.set(b,[I]),s++,f(),!0}c(v,"push");function g(I){return new Promise(b=>{let A=!1,E=c(()=>{A||(A=!0,clearTimeout(S),b())},"finish"),S=setTimeout(E,I);S.unref?.(),l.push(E)})}c(g,"waitForProgress");async function m(I){let b=I!=null?Date.now()+I:Number.POSITIVE_INFINITY;for(;;){if(f(),s===0&&a===0)return;let A=b-Date.now();if(A<=0)return;await g(Math.min(A,50))}}c(m,"flush");function w(){d=!0}return c(w,"stop"),{push:v,flush:m,stop:w,size:c(()=>s,"size"),inFlight:c(()=>a,"inFlight")}}c(Q1,"createObserveBatcher");var Xo=null;function I_(){return Xo==null&&(Xo=Q1()),Xo}c(I_,"getObserveBatcher");function _A(){I_(),console.log(`[observe-batcher] batched observe ingest ON (bufferMax=${gA()} drainConcurrency=${hA()}; OBSERVE_BATCHING=0 to disable)`)}c(_A,"initObserveBatcher");async function yA(e=5e3){if(Xo==null)return;Xo.stop(),await Xo.flush(e);let t=Xo.size()+Xo.inFlight();t>0&&console.warn(`[observe-batcher] shutdown flush deadline (${e}ms) hit; dropping ~${t} buffered observation(s)`)}c(yA,"shutdownObserveBatcher");var fr=new Z1,nq=Je.object({provider:Je.string().min(1).max(64),plan:Je.string().min(1).max(64),limitType:Je.string().min(1).max(128),value:Je.number().finite(),unit:Je.string().min(1).max(32),comparator:Je.enum(["=",">=","<="]).default("="),resetsAt:Je.union([Je.string(),Je.date(),Je.null()]).optional().transform(e=>{if(e==null)return null;if(e instanceof Date)return e;let t=new Date(e);return isNaN(t.getTime())?null:t}),sourceType:Je.enum(["oauth_usage","self_observed_429","official_docs","self_observed_lower_bound","community","llm_research","release_notes","live_headers","live_stream"]),sourceUrl:Je.string().url().optional().nullable(),sourceEvidence:Je.unknown().optional(),confidence:Je.number().min(0).max(1),observedAt:Je.union([Je.string(),Je.date()]).optional().transform(e=>{if(e==null)return;if(e instanceof Date)return e;let t=new Date(e);return isNaN(t.getTime())?void 0:t})});fr.post("/internal/research/match-headers",async e=>{let t=e.get("userId"),n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON"},400)}let o=Je.object({host:Je.string(),path:Je.string().default("/"),responseHeaders:Je.record(Je.string()),observedAt:Je.string().optional(),plan:Je.string().optional()}).safeParse(n);if(!o.success)return e.json({error:"Invalid request body",issues:o.error.issues},400);let{host:s,path:i,responseHeaders:a,observedAt:d,plan:l}=o.data,p=f_(s);if(!p?.liveSource?.headers)return e.json({observations:[]});let f={host:s,path:i,plan:l??null,observedAt:d?new Date(d):new Date,userId:t},_=p.liveSource.headers.parse(a,f);if(!_||_.length===0)return e.json({observations:[]});let v=[];for(let g of _)try{let m=g.observedAt instanceof Date?g.observedAt:typeof g.observedAt=="string"?new Date(g.observedAt):void 0,[w]=await u.insert(ve).values({provider:g.provider,plan:g.plan,limitType:g.limitType,value:String(g.value),unit:g.unit,comparator:g.comparator??"=",resetsAt:g.resetsAt instanceof Date?g.resetsAt:null,sourceType:g.sourceType,sourceUrl:g.sourceUrl??null,sourceEvidence:g.sourceEvidence??null,confidence:String(g.confidence),userId:t,...m?{observedAt:m}:{}}).returning({id:ve.id});v.push({...g,id:w.id})}catch{}return e.json({observations:v})});fr.post("/internal/research/match-stream-frame",async e=>{let t=e.get("userId"),n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON"},400)}let o=Je.object({host:Je.string(),path:Je.string().default("/"),frameText:Je.string(),observedAt:Je.string().optional(),plan:Je.string().optional()}).safeParse(n);if(!o.success)return e.json({error:"Invalid request body",issues:o.error.issues},400);let{host:s,path:i,frameText:a,observedAt:d,plan:l}=o.data,p=g_(s,i);if(!p?.liveSource?.streamFrame)return e.json({observations:[]});let f={host:s,path:i,plan:l??null,observedAt:d?new Date(d):new Date,userId:t},_=p.liveSource.streamFrame.parse(a,f);if(!_||_.length===0)return e.json({observations:[]});let v=[];for(let g of _)try{let m=g.observedAt instanceof Date?g.observedAt:typeof g.observedAt=="string"?new Date(g.observedAt):void 0,[w]=await u.insert(ve).values({provider:g.provider,plan:g.plan,limitType:g.limitType,value:String(g.value),unit:g.unit,comparator:g.comparator??"=",resetsAt:g.resetsAt instanceof Date?g.resetsAt:null,sourceType:g.sourceType,sourceUrl:g.sourceUrl??null,sourceEvidence:g.sourceEvidence??null,confidence:String(g.confidence),userId:t,...m?{observedAt:m}:{}}).returning({id:ve.id});v.push({...g,id:w.id})}catch{}return e.json({observations:v})});fr.post("/internal/research/observe",async e=>{let t=e.get("userId"),n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON"},400)}let r=nq.safeParse(n);if(!r.success)return e.json({error:"Invalid observation",issues:r.error.issues},400);let o=r.data;if(Qp())return I_().push({userId:t,obs:o})?e.json({buffered:!0,durable:!1},202):(e.header("Retry-After","2"),e.json({error:"Observe buffer full; retry shortly.",durable:!1},429));let s=await Xp(t,o);return e.json({id:s.id,observedAt:s.observedAt,...s.deduped?{deduped:!0}:{}},s.deduped?200:201)});fr.get("/research/active-limits",async e=>{let t=e.req.query("provider"),n=e.req.query("plan"),r=[eq(tt.effectiveUntil)];t&&r.push(Lr(tt.provider,t)),n&&r.push(Lr(tt.plan,n));let o=await u.select().from(tt).where(Hd(...r)).orderBy(tt.provider,tt.plan,tt.limitType,Zp(tt.effectiveFrom));return e.json({items:o})});fr.get("/research/doc-changes",async e=>{let t=e.req.query("since"),n=t?new Date(t):new Date(Date.now()-7*864e5);if(isNaN(n.getTime()))return e.json({error:"Invalid since parameter"},400);let r=await u.select({id:Dt.id,fetchedAt:Dt.fetchedAt,provider:Dt.provider,docUrl:Dt.docUrl,contentHash:Dt.contentHash,parseSuccess:Dt.parseSuccess}).from(Dt).where(b_(Dt.fetchedAt,n)).orderBy(Dt.provider,Dt.docUrl,Zp(Dt.fetchedAt)),o=new Map;for(let s of r){let i=`${s.provider}::${s.docUrl}`,a=o.get(i);a?(a.previousHash===null&&s.contentHash!==a.latestHash&&(a.previousHash=s.contentHash,a.changed=!0),a.snapshots.push(s)):o.set(i,{provider:s.provider,docUrl:s.docUrl,latestFetchedAt:s.fetchedAt,latestHash:s.contentHash,previousHash:null,parseSuccess:s.parseSuccess,changed:!1,snapshots:[s]})}return e.json({items:Array.from(o.values())})});fr.get("/research/disagreements",async e=>{let t=e.get("userId"),n=Math.min(parseInt(e.req.query("since_days")??"14",10)||14,90),r=new Date(Date.now()-n*864e5),o=await u.select().from(ve).where(Hd(Lr(ve.userId,t),b_(ve.observedAt,r))).orderBy(Zp(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 f=(p-l)/l*100;f>20&&i.push({provider:a.provider,plan:a.plan,limitType:a.limitType,minValue:l,maxValue:p,spreadPct:f,observations:a.observations})}return i.sort((a,d)=>d.spreadPct-a.spreadPct),e.json({items:i.slice(0,100)})});fr.get("/research/confidence-history",async e=>{let t=e.req.query("provider"),n=e.req.query("plan"),r=e.req.query("limit_type"),o=Math.min(parseInt(e.req.query("days")??"90",10)||90,365);if(!t||!n||!r)return e.json({error:"provider, plan, limit_type required"},400);let s=new Date(Date.now()-o*864e5),i=await u.select({effectiveFrom:tt.effectiveFrom,effectiveUntil:tt.effectiveUntil,confidence:tt.confidence,value:tt.value}).from(tt).where(Hd(Lr(tt.provider,t),Lr(tt.plan,n),Lr(tt.limitType,r),b_(tt.effectiveFrom,s))).orderBy(tt.effectiveFrom);return e.json({items:i.map(a=>({effectiveFrom:a.effectiveFrom,effectiveUntil:a.effectiveUntil,confidence:Number(a.confidence),value:Number(a.value)}))})});fr.get("/research/observations",async e=>{let t=e.get("userId"),n=e.req.query("provider"),r=e.req.query("plan"),o=e.req.query("limit_type"),s=Math.min(parseInt(e.req.query("limit")??"50",10)||50,200),i=Math.max(parseInt(e.req.query("offset")??"0",10)||0,0),a=[Lr(ve.userId,t)];n&&a.push(Lr(ve.provider,n)),r&&a.push(Lr(ve.plan,r)),o&&a.push(Lr(ve.limitType,o));let d=await u.select().from(ve).where(Hd(...a)).orderBy(Zp(ve.observedAt)).limit(s).offset(i),[{total:l}]=await u.select({total:tq`count(*)::int`}).from(ve).where(Hd(...a));return e.json({items:d,total:l,limit:s,offset:i})});D();import{Hono as rq}from"hono";import{and as bA,desc as oq,eq as Pa,isNull as sq,ne as iq,sql as Qo}from"drizzle-orm";var wA={free:.2,pro:1,max_5x:5,max_20x:20},A_=new Set(["free","pro","max_5x","max_20x"]),E_={fiveHourMessages:20,sevenDaySonnetHours:14,sevenDayOpusHours:1.65};function vA(e){let t=wA[e]??wA.max_20x;return{fiveHourMessages:Math.round(E_.fiveHourMessages*t),sevenDaySonnetHours:Math.round(E_.sevenDaySonnetHours*t),sevenDayOpusHours:Math.round(E_.sevenDayOpusHours*t)}}c(vA,"planDefaultCaps");var Bd=new rq,aq=60*1e3,S_=new Map;function cq(e,t){let n=`${e}::${t}`,r=S_.get(n);if(r&&Date.now()-r.at<aq)return r.rows;let o=u.select({limitType:tt.limitType,value:tt.value,unit:tt.unit}).from(tt).where(bA(Pa(tt.provider,e),Pa(tt.plan,t),sq(tt.effectiveUntil)));return o.catch(()=>S_.delete(n)),S_.set(n,{at:Date.now(),rows:o}),o}c(cq,"getActivePlanLimits");var IA=["five_hour_percent","seven_day_percent","seven_day_opus_percent"],dq={anthropic:["oauth_usage"],codex:["live_stream","self_observed_429"]};function uq(e){return dq[e]??["oauth_usage"]}c(uq,"sourceTypesFor");Bd.get("/usage/current-limits",async e=>{let t=e.get("userId"),n=e.req.query("provider")??"anthropic",r=uq(n),o=Qo`user_id = ${t}
|
|
1452
1499
|
AND provider = ${n}
|
|
1453
1500
|
AND source_type IN (${Qo.join(r.map(a=>Qo`${a}`),Qo`, `)})
|
|
1454
|
-
AND limit_type = lt.limit_type`,s=await
|
|
1501
|
+
AND limit_type = lt.limit_type`,s=await u.execute(Qo`
|
|
1455
1502
|
SELECT lt.limit_type AS limit_type,
|
|
1456
1503
|
CASE WHEN w.resets_at IS NULL THEN recent.value ELSE win.value END AS value,
|
|
1457
1504
|
CASE WHEN w.resets_at IS NULL THEN recent.resets_at ELSE win.resets_at END AS resets_at,
|
|
@@ -1479,17 +1526,17 @@ end`;async function Ks(e){let t=e.req.param("teamId");if(!t||!to.test(t))return{
|
|
|
1479
1526
|
ORDER BY observed_at DESC
|
|
1480
1527
|
LIMIT 1
|
|
1481
1528
|
) recent ON true
|
|
1482
|
-
`),i=new Map;for(let a of s)a.value==null||a.observed_at==null||IA.includes(a.limit_type)&&i.set(a.limit_type,{used_percentage:Number(a.value),resets_at:a.resets_at?new Date(a.resets_at).toISOString():null,observed_at:new Date(a.observed_at).toISOString()});return e.header("Cache-Control","private, max-age=15"),e.json({provider:n,five_hour:i.get("five_hour_percent")??null,seven_day:i.get("seven_day_percent")??null,seven_day_opus:i.get("seven_day_opus_percent")??null})});
|
|
1529
|
+
`),i=new Map;for(let a of s)a.value==null||a.observed_at==null||IA.includes(a.limit_type)&&i.set(a.limit_type,{used_percentage:Number(a.value),resets_at:a.resets_at?new Date(a.resets_at).toISOString():null,observed_at:new Date(a.observed_at).toISOString()});return e.header("Cache-Control","private, max-age=15"),e.json({provider:n,five_hour:i.get("five_hour_percent")??null,seven_day:i.get("seven_day_percent")??null,seven_day_opus:i.get("seven_day_opus_percent")??null})});Bd.get("/usage/inferred-caps",async e=>{let t=e.get("userId"),n=e.req.query("provider")??"anthropic",[r]=await u.select({plan:T.claudeCodePlan,source:T.planSource}).from(T).where(Pa(T.id,t)),o=r?.source==="manual"&&r.plan&&A_.has(r.plan)?r.plan:null,s=await u.select({plan:ve.plan}).from(ve).where(bA(Pa(ve.userId,t),Pa(ve.provider,n),Pa(ve.sourceType,"oauth_usage"),iq(ve.plan,"unknown"))).orderBy(oq(ve.observedAt)).limit(1),i=s[0]?.plan&&A_.has(s[0].plan)?s[0].plan:null,a=o??i??"max_20x",d=o===null&&i===null,l=vA(a),p=await cq(n,a);function f(m,w,I){let b=p.filter(A=>A.limitType===m&&w.test(A.unit));return b.length===0?I:Math.max(...b.map(A=>Number(A.value)))}c(f,"bestCap");let _=f("five_hour_messages",/msg|message/i,l.fiveHourMessages),v=f("seven_day_sonnet_hours",/hour|hr/i,l.sevenDaySonnetHours),g=f("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:v,unit:"hours",confidence_band_pct:20},seven_day_opus_percent:{inferred_cap:g,unit:"hours",confidence_band_pct:20}})});D();import{Hono as lq}from"hono";import{z as gr}from"zod";import{and as EA,desc as xA,eq as Fd,sql as pq}from"drizzle-orm";var zd=new lq,AA=30,mq=30,fq=0,x_=1e3,SA=2e3,T_=2;function Wd(e){return e==null?0:typeof e=="number"?e:Number(e)}c(Wd,"toNum");function gq(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(gq,"ageDays");async function hq(){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(xA(st.effectiveFrom)),t=new Map;for(let n of e){let r=`${n.provider}::${n.modelId}`;t.has(r)||t.set(r,n)}return t}c(hq,"loadActiveRows");zd.get("/pricing/coverage",async e=>{if(!e.get("userId"))return e.json({error:"unauthorized"},401);let n=await u.execute(pq`
|
|
1483
1530
|
SELECT model,
|
|
1484
1531
|
COUNT(*)::int AS events,
|
|
1485
1532
|
MAX(timestamp) AS last_seen
|
|
1486
1533
|
FROM session_events
|
|
1487
1534
|
WHERE model IS NOT NULL
|
|
1488
1535
|
AND model NOT IN ('unknown', '(null)')
|
|
1489
|
-
AND timestamp > now() - (${
|
|
1536
|
+
AND timestamp > now() - (${mq} || ' days')::interval
|
|
1490
1537
|
GROUP BY model
|
|
1491
1538
|
ORDER BY events DESC
|
|
1492
|
-
`),r=await
|
|
1539
|
+
`),r=await hq(),o=[],s=[],i=0;for(let a of n){let d=a.model,l=$o(d),p=r.get(`${l}::${d}`);if(!p){o.push({provider:l,modelId:d,events:a.events,lastSeen:String(a.last_seen)});continue}let f=gq(p.verifiedAt??p.effectiveFrom);f===null||f>AA?s.push({provider:l,modelId:d,events:a.events,verifiedAt:p.verifiedAt?String(p.verifiedAt):null,ageDays:f===null?null:Math.round(f),currentInput:Wd(p.inputPerM),currentOutput:Wd(p.outputPerM)}):i+=1}return e.json({staleDays:AA,capturedModels:n.length,pricedFresh:i,unpriced:o,stale:s})});var _q=gr.object({provider:gr.string().min(1).optional(),modelId:gr.string().min(1),inputPerM:gr.number(),outputPerM:gr.number(),cacheReadPerM:gr.number().optional(),cacheWrite5mPerM:gr.number().optional(),cacheWrite1hPerM:gr.number().optional(),contextWindow:gr.number().int().positive().nullable().optional(),sourceUrl:gr.string().url(),effectiveFrom:gr.string().datetime().optional()});zd.post("/pricing/rates",async e=>{if(!e.get("userId"))return e.json({error:"unauthorized"},401);let n=_q.safeParse(await e.req.json().catch(()=>null));if(!n.success)return e.json({status:"rejected",reason:"invalid body",detail:n.error.flatten()},400);let r=n.data,o=r.provider??$o(r.modelId),s=c((g,m)=>g>fq&&g<=m,"inRange");if(!s(r.inputPerM,x_)||!s(r.outputPerM,x_))return e.json({status:"rejected",reason:`input/output out of range (0, ${x_}]`},422);let i=r.cacheReadPerM??0,a=r.cacheWrite5mPerM??0,d=r.cacheWrite1hPerM??0;for(let[g,m]of[["cacheReadPerM",i],["cacheWrite5mPerM",a],["cacheWrite1hPerM",d]])if(m<0||m>SA)return e.json({status:"rejected",reason:`${g} out of range [0, ${SA}]`},422);let p=(await u.select().from(st).where(EA(Fd(st.provider,o),Fd(st.modelId,r.modelId))).orderBy(xA(st.effectiveFrom)).limit(1))[0],f=1e-9;if(p){let g=Wd(p.inputPerM),m=Wd(p.outputPerM),w=c((E,S)=>S<=0?1/0:E/S,"ratio"),I=Math.max(w(r.inputPerM,g),w(g,r.inputPerM)),b=Math.max(w(r.outputPerM,m),w(m,r.outputPerM));if(I>T_||b>T_)return e.json({status:"flagged",reason:`new rate differs from current by more than ${T_}x \u2014 needs human review`,current:{inputPerM:g,outputPerM:m},proposed:{inputPerM:r.inputPerM,outputPerM:r.outputPerM},sourceUrl:r.sourceUrl});if(Math.abs(g-r.inputPerM)<f&&Math.abs(m-r.outputPerM)<f&&Math.abs(Wd(p.cacheReadPerM)-i)<f)return await u.update(st).set({verifiedAt:new Date}).where(EA(Fd(st.provider,o),Fd(st.modelId,r.modelId),Fd(st.effectiveFrom,p.effectiveFrom))),e.json({status:"unchanged",modelId:r.modelId})}let _=r.effectiveFrom?new Date(r.effectiveFrom):new Date,v=new Date().toISOString().slice(0,10);return await 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-${v}`}).onConflictDoNothing(),e.json({status:"written",modelId:r.modelId,provider:o,effectiveFrom:_.toISOString()})});D();import{Hono as yq}from"hono";import{desc as wq,eq as vq}from"drizzle-orm";var em=new yq;em.get("/alerts/recent",async e=>{let t=e.get("userId"),n=await u.select().from(kn).where(vq(kn.userId,t)).orderBy(wq(kn.lastDispatchedAt)).limit(20);return e.json({items:n})});D();import{Hono as Iq}from"hono";import{randomUUID as bq}from"node:crypto";import{sql as Da}from"drizzle-orm";var tm=new Iq,kA=300,TA=3e4,Eq=6e4,Aq=1e3,R_={process_send_message:"session_send_jobs",process_launch:"launch_jobs",process_eval:"eval_jobs",process_conversation:"eval_jobs",process_insights:"insights_jobs",process_session_goal:"agent_jobs",distill_memories:"agent_jobs",memory_ab:"agent_jobs",process_run_cleanup:"agent_jobs",cron_suggest_instructions:"agent_jobs",cron_refine_cases:"agent_jobs",cron_retire_unused_skills:"agent_jobs",cron_refresh_skills:"agent_jobs",cron_refresh_pricing:"agent_jobs",cron_eval_autorun:"agent_jobs",cron_auto_accept_suggestions:"agent_jobs",cron_instruction_training:"agent_jobs",cron_instruction_evolution:"agent_jobs",process_judge_review:"agent_jobs"},Sq=["session_send_jobs","launch_jobs","eval_jobs","insights_jobs","agent_jobs"];async function xq(e,t,n,r){if(n.length===0)return null;let o=Da.join(n.map(i=>Da`${i}`),Da`, `),s=await u.execute(Da`
|
|
1493
1540
|
UPDATE ${Da.raw(e)} AS m
|
|
1494
1541
|
SET status = 'claimed',
|
|
1495
1542
|
claimed_by = ${r},
|
|
@@ -1510,7 +1557,7 @@ end`;async function Ks(e){let t=e.req.param("teamId");if(!t||!to.test(t))return{
|
|
|
1510
1557
|
) AS picked
|
|
1511
1558
|
WHERE m.id = picked.id
|
|
1512
1559
|
RETURNING m.id, m.task_kind, m.payload, m.attempts
|
|
1513
|
-
`);return s.length>0?s[0]:null}c(
|
|
1560
|
+
`);return s.length>0?s[0]:null}c(xq,"claimOne");async function Tq(e,t,n){let r={};for(let o of t){let s=R_[o];s&&(r[s]??=[]).push(o)}for(let o of Sq){let s=r[o];if(!s)continue;let i=await xq(o,e,s,n);if(i)return{job:i,table:o}}return null}c(Tq,"tryClaimAcrossTables");var Rq={cron_suggest_instructions:[0,7,37]};function kq(e){let t=/rulemetric-cli\/(\d+)\.(\d+)\.(\d+)/.exec(e??"");return t?[Number(t[1]),Number(t[2]),Number(t[3])]:null}c(kq,"parseCliVersion");function Nq(e,t){return e[0]!==t[0]?e[0]>t[0]:e[1]!==t[1]?e[1]>t[1]:e[2]>=t[2]}c(Nq,"versionAtLeast");function jq(e,t){let n=kq(t),r=[],o=[];for(let s of e){let i=Rq[s];i&&(!n||!Nq(n,i))?o.push(s):r.push(s)}return{allowed:r,fenced:o}}c(jq,"fenceCapabilities");var RA=new Set;tm.get("/work/next",async e=>{let t=e.get("userId"),r=(e.req.query("capabilities")??"").split(",").map(p=>p.trim()).filter(p=>p.length>0&&p in R_),{allowed:o,fenced:s}=jq(r,e.req.header("user-agent"));if(s.length>0&&!RA.has(t)&&(RA.add(t),console.warn(`[work] version fence: user=${t} ua=${e.req.header("user-agent")??"none"} withheld kinds: ${s.join(", ")} \u2014 worker below minimum CLI version; jobs stay pending until upgrade`)),r.length===0)return e.json({error:"capabilities must list one or more of: "+Object.keys(R_).join(", ")},400);if(o.length===0)return e.body(null,204);let i=Number.parseInt(e.req.query("waitMs")??`${TA}`,10),a=Number.isFinite(i)?Math.max(0,Math.min(i,Eq)):TA,d=bq(),l=Date.now()+a;for(;;){let p=await Tq(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:kA,table:p.table});if(Date.now()>=l)break;await new Promise(f=>setTimeout(f,Aq))}return e.body(null,204)});D();import{Hono as Oq}from"hono";import{z as Vd}from"zod";import{sql as oo}from"drizzle-orm";D();import{eq as Mr,and as k_}from"drizzle-orm";var Pq=c(e=>`${(e*100).toFixed(1)}pp`,"pct"),Dq=c(e=>`${(e/6e4).toFixed(0)} min`,"mins");function NA(e){let{targetName:t,evalTargetId:n,status:r,result:o,error:s}=e,i=t.split("/").pop()||t,a=`/eval-targets/${n}`;if(r==="failed")return{type:"evolution_failed",title:`Evolution cycle crashed \u2014 ${i}`,body:s?.slice(0,400)||"The job failed without recording a reason.",url:a,metadata:{evalTargetId:n,outcome:"crashed"}};if(!o)return null;if(o.skipped==="infrastructure-incomplete"||o.skipped==="quota-exhausted"){let f=o.cost?.modelCalls;return{type:"evolution_blocked",title:`Evolution stopped by the environment \u2014 ${i}`,body:`${o.reason??o.skipped}`+(f?` (${f} model call(s) spent before stopping)`:"")+" This is not a verdict about the instruction.",url:a,metadata:{evalTargetId:n,outcome:o.skipped,reason:o.reason,cost:o.cost}}}if(o.skipped||!o.decision)return null;let d=o.nPairs??o.cost?.usablePairs,l=[];if(d!=null){let f=o.cost?.plannedPairs;l.push(`${d}${f?`/${f}`:""} paired task(s)`)}typeof o.cost?.mde=="number"&&l.push(`resolves \xB1${Pq(o.cost.mde)}`),o.cost?.modelCalls&&l.push(`${o.cost.modelCalls} model calls`),o.cost?.wallMs&&l.push(Dq(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(NA,"buildEvolutionNotification");async function jA(e,t,n,r){try{let[o]=await u.select({evalTargetId:je.evalTargetId,config:je.config}).from(je).where(k_(Mr(je.id,t),Mr(je.userId,e)));if(!o||o.config?.type==="conversation")return;let[s]=await u.select({name:k.name}).from(k).where(Mr(k.id,o.evalTargetId)),i=s?.name??"eval target";n==="failed"?await dn({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 dn({userId:e,type:"eval_completed",title:"Eval run complete",body:`${i} finished`,url:`/eval-targets/${o.evalTargetId}`,sourceTable:"eval_jobs",sourceId:t}),await yd(e,o.evalTargetId))}catch(o){console.error("[job-notifications] eval notify failed:",o instanceof Error?o.stack:o)}}c(jA,"notifyEvalTerminal");async function PA(e,t,n,r){try{let[o]=await u.select({projectPath:z.projectPath}).from(z).where(k_(Mr(z.id,t),Mr(z.userId,e)));if(!o)return;let s=null,i;if(o.projectPath){let[p]=await u.select({id:C.id,name:C.name}).from(ye).innerJoin(C,Mr(C.id,ye.projectId)).where(Mr(ye.path,o.projectPath)).limit(1);p?(s=p.id,i=p.name):i=`${o.projectPath.split("/").pop()||"Unknown"} (unregistered)`}else i="All Projects";let a=new Date().toISOString().slice(0,10),d=`${s??"unmatched"}-${a}`,l=o.projectPath?`/insights/computed?projectPath=${encodeURIComponent(o.projectPath)}&tab=recommendations`:"/insights";n==="failed"?await dn({userId:e,type:"insights_failed",title:"Insights generation failed",body:`${i}: ${String(r??"").slice(0,200)}`,url:l,sourceTable:"insights_jobs",sourceId:d}):await dn({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(PA,"notifyInsightsTerminal");async function DA(e,t,n,r){try{let[o]=await u.select({payload:Pe.payload,result:Pe.result}).from(Pe).where(k_(Mr(Pe.id,t),Mr(Pe.userId,e)));if(!o)return;let s=o.payload?.evalTargetId;if(!s)return;let[i]=await u.select({name:k.name}).from(k).where(Mr(k.id,s)),a=NA({targetName:i?.name??"instruction",evalTargetId:s,status:n,result:o.result,error:r});if(!a)return;await dn({userId:e,type:a.type,title:a.title,body:a.body,url:a.url,sourceTable:"agent_jobs",sourceId:t,metadata:a.metadata})}catch(o){console.error("[job-notifications] evolution notify failed:",o instanceof Error?o.stack:o)}}c(DA,"notifyEvolutionTerminal");async function CA(e,t,n,r,o){e==="process_eval"?await jA(t,n,r,o):e==="process_insights"?await PA(t,n,r,o):e==="cron_instruction_evolution"&&await DA(t,n,r,o)}c(CA,"notifyTerminal");var Oa=new Oq,OA=300,N_={process_eval:3,process_insights:3,process_launch:3,process_send_message:1,process_conversation:1,process_session_goal:1,distill_memories:1,memory_ab:1,process_run_cleanup:1,cron_suggest_instructions:1,cron_refine_cases:1,cron_retire_unused_skills:1,cron_refresh_skills:1,cron_refresh_pricing:1,cron_eval_autorun:1,cron_auto_accept_suggestions:1,cron_instruction_training:1,process_judge_review:1,cron_instruction_evolution:1},Cq=["session_send_jobs","launch_jobs","eval_jobs","insights_jobs","agent_jobs"];async function j_(e,t,n){for(let r of Cq){let o=await u.execute(oo`
|
|
1514
1561
|
SELECT status, attempts, task_kind
|
|
1515
1562
|
FROM ${oo.raw(r)}
|
|
1516
1563
|
WHERE id = ${e}
|
|
@@ -1518,14 +1565,14 @@ end`;async function Ks(e){let t=e.req.param("teamId");if(!t||!to.test(t))return{
|
|
|
1518
1565
|
AND claimed_by = ${n}
|
|
1519
1566
|
AND status IN ('claimed', 'running')
|
|
1520
1567
|
LIMIT 1
|
|
1521
|
-
`);if(o.length>0)return{table:r,status:o[0].status,attempts:o[0].attempts,taskKind:o[0].task_kind}}return null}c(j_,"locateRow");var
|
|
1568
|
+
`);if(o.length>0)return{table:r,status:o[0].status,attempts:o[0].attempts,taskKind:o[0].task_kind}}return null}c(j_,"locateRow");var Lq=Vd.object({result:Vd.unknown().optional()}),Mq=Vd.object({error:Vd.string().min(1).max(8192),terminal:Vd.boolean().optional().default(!1)});Oa.post("/work/:id/heartbeat",async e=>{let t=e.get("userId"),n=e.req.param("id"),o=(await e.req.json().catch(()=>({}))).leaseToken;if(!o)return e.json({error:"leaseToken required"},400);let s=await j_(n,t,o);return s?(await u.execute(oo`
|
|
1522
1569
|
UPDATE ${oo.raw(s.table)}
|
|
1523
1570
|
SET lease_expires_at = now() + (${OA}::int * interval '1 second'),
|
|
1524
1571
|
updated_at = now()
|
|
1525
1572
|
WHERE id = ${n}
|
|
1526
1573
|
AND claimed_by = ${o}
|
|
1527
1574
|
AND status IN ('claimed', 'running')
|
|
1528
|
-
`),e.json({ok:!0,leaseDurationSeconds:OA})):e.json({error:"job not found or lease lost"},404)});Oa.post("/work/:id/complete",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json().catch(()=>({})),o=r.leaseToken;if(!o)return e.json({error:"leaseToken required"},400);let s=
|
|
1575
|
+
`),e.json({ok:!0,leaseDurationSeconds:OA})):e.json({error:"job not found or lease lost"},404)});Oa.post("/work/:id/complete",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json().catch(()=>({})),o=r.leaseToken;if(!o)return e.json({error:"leaseToken required"},400);let s=Lq.safeParse(r);if(!s.success)return e.json({error:s.error.format()},400);let i=await j_(n,t,o);if(!i)return e.json({error:"job not found or lease lost"},404);let a=JSON.stringify(s.data.result??null);return await u.execute(oo`
|
|
1529
1576
|
UPDATE ${oo.raw(i.table)}
|
|
1530
1577
|
SET status = 'completed',
|
|
1531
1578
|
result = ${a}::jsonb,
|
|
@@ -1537,24 +1584,24 @@ end`;async function Ks(e){let t=e.req.param("teamId");if(!t||!to.test(t))return{
|
|
|
1537
1584
|
WHERE id = ${n}
|
|
1538
1585
|
AND claimed_by = ${o}
|
|
1539
1586
|
AND status IN ('claimed', 'running')
|
|
1540
|
-
`),await CA(i.taskKind,t,n,"completed"),e.json({ok:!0})});Oa.post("/work/:id/fail",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json().catch(()=>({})),o=r.leaseToken;if(!o)return e.json({error:"leaseToken required"},400);let s=
|
|
1587
|
+
`),await CA(i.taskKind,t,n,"completed"),e.json({ok:!0})});Oa.post("/work/:id/fail",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json().catch(()=>({})),o=r.leaseToken;if(!o)return e.json({error:"leaseToken required"},400);let s=Mq.safeParse(r);if(!s.success)return e.json({error:s.error.format()},400);let i=await j_(n,t,o);if(!i)return e.json({error:"job not found or lease lost"},404);let a=N_[i.taskKind]??3,d=s.data.terminal||i.attempts>=a,l=d?"failed":"pending";return await u.execute(oo`
|
|
1541
1588
|
UPDATE ${oo.raw(i.table)}
|
|
1542
1589
|
SET status = ${l},
|
|
1543
1590
|
error = ${s.data.error},
|
|
1544
1591
|
updated_at = now(),
|
|
1545
|
-
${oo.raw(
|
|
1592
|
+
${oo.raw(d?"completed_at = now(),":"")}
|
|
1546
1593
|
claimed_by = NULL,
|
|
1547
1594
|
claimed_at = NULL,
|
|
1548
1595
|
lease_expires_at = NULL
|
|
1549
1596
|
WHERE id = ${n}
|
|
1550
1597
|
AND claimed_by = ${o}
|
|
1551
1598
|
AND status IN ('claimed', 'running')
|
|
1552
|
-
`),
|
|
1553
|
-
`)),s=t.webBaseUrl??process.env.RULEMETRIC_WEB_URL??process.env.WEB_URL??"https://rulemetric.com";if(
|
|
1554
|
-
`)}),e.json({processing:!0,resumed:s,announcement:o},202)});D();import{Hono as
|
|
1599
|
+
`),d&&await CA(i.taskKind,t,n,"failed",s.data.error),e.json({ok:!0,requeued:!d,attempts:i.attempts})});D();import{Hono as Vq}from"hono";import{z as Zo}from"zod";import{and as HA,desc as Jq,eq as so,isNotNull as Kq,sql as BA}from"drizzle-orm";D();import{and as $q,asc as qq,eq as $r,gt as Uq,isNotNull as Hq,sql as Bq}from"drizzle-orm";var LA=100,MA=10,nm=new Set;function $A(e){return nm.has(e)}c($A,"isAnnouncementSendInFlight");async function qA(e,t={}){let n=t.db??u,r=t.sendEmail??Hp,o=t.log??(i=>process.stderr.write(`[announcement-sender] ${i}
|
|
1600
|
+
`)),s=t.webBaseUrl??process.env.RULEMETRIC_WEB_URL??process.env.WEB_URL??"https://rulemetric.com";if(nm.has(e))throw new Error(`Announcement ${e} send already in flight`);nm.add(e);try{return await Fq({announcementId:e,db:n,sendEmail:r,log:o,webBaseUrl:s})}finally{nm.delete(e)}}c(qA,"sendAnnouncement");async function Fq(e){let{announcementId:t,db:n,sendEmail:r,log:o,webBaseUrl:s}=e,[i]=await n.select().from($e).where($r($e.id,t)).limit(1);if(!i)throw new Error(`Announcement ${t} not found`);if(i.status!=="queued"&&i.status!=="sending")throw new Error(`Announcement ${t} is in status='${i.status}'; expected 'queued' or 'sending'.`);await n.update($e).set({status:"sending",updatedAt:new Date}).where($r($e.id,t)),o(`Sending announcement ${t} (${i.subject??""})`);let a=0,d=0,l=0,p=0,f=null;try{for(;;){let b=await n.select({userId:kt.userId,email:T.email,displayName:T.displayName,unsubscribeToken:kt.unsubscribeToken}).from(kt).innerJoin(T,$r(T.id,kt.userId)).where($q($r(kt.productAnnouncements,!0),Hq(T.email),f?Uq(kt.userId,f):void 0)).orderBy(qq(kt.userId)).limit(LA);if(b.length===0)break;f=b[b.length-1].userId;for(let A=0;A<b.length;A+=MA){let E=b.slice(A,A+MA),S=await Promise.allSettled(E.map(R=>zq({recipient:R,announcement:i,webBaseUrl:s,sendEmail:r,db:n})));for(let R=0;R<S.length;R++){let O=S[R];if(O.status==="fulfilled")O.value.ok==="sent"?a++:O.value.ok==="skipped"?l++:(d++,O.value.provider==="noop"&&p++,o(` recipient ${E[R].userId}: send failed \u2014 ${O.value.error}`));else{d++;let W=O.reason instanceof Error?O.reason.message:String(O.reason);o(` recipient ${E[R].userId}: send failed \u2014 ${W}`)}}}if(b.length<LA)break}p>0&&o(`WARNING: ${p} recipient(s) hit the noop email provider and were recorded as FAILED \u2014 no email provider is configured on this API instance (set RESEND_API_KEY)`);let _=await n.select({status:Rt.status,count:Bq`count(*)::int`}).from(Rt).where($r(Rt.announcementId,t)).groupBy(Rt.status),v={};for(let b of _)v[b.status]=b.count;let g=v.sent??0,m=v.failed??0,w=g===0&&m>0?"failed":"sent",I=m>0?`${m} of ${g+m} recipient(s) failed; see announcement_deliveries`:null;return await n.update($e).set({status:w,recipientCount:g,...w==="sent"?{sentAt:new Date}:{},error:I,updatedAt:new Date}).where($r($e.id,t)),o(`Done: status=${w} sent=${g} failed=${m} (this attempt: sent=${a} failed=${d} skipped=${l})`),{sent:a,failed:d,skipped:l}}catch(_){let v=_ instanceof Error?_.message:String(_);throw await n.update($e).set({status:"failed",error:v.slice(0,1e3),updatedAt:new Date}).where($r($e.id,t)).catch(()=>{}),_}}c(Fq,"runSend");function Wq(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}c(Wq,"escapeHtml");async function zq(e){let{recipient:t,announcement:n,webBaseUrl:r,sendEmail:o,db:s}=e;if(!t.email)return{ok:"skipped",reason:"no-email"};let i=await s.insert(Rt).values({announcementId:n.id,userId:t.userId,email:t.email,status:"pending"}).onConflictDoNothing({target:[Rt.announcementId,Rt.userId]}).returning({id:Rt.id});if(i.length===0)return{ok:"skipped",reason:"already-claimed"};let a=i[0].id,d=r.replace(/\/$/,""),l=encodeURIComponent(t.unsubscribeToken),p=`${d}/unsubscribe/${l}`,f=t.displayName?.trim().split(/\s+/)[0]||"there",_=n.htmlBody.replaceAll("{{unsubscribe_url}}",p).replaceAll("{{recipient_name}}",Wq(f)),v=n.textBody.replaceAll("{{unsubscribe_url}}",p).replaceAll("{{recipient_name}}",f);try{let g=await o({to:t.email,subject:n.subject,html:_,text:v,fromName:"RuleMetric",idempotencyKey:a,headers:{"List-Unsubscribe":`<${d}/api/unsubscribe/${l}>`,"List-Unsubscribe-Post":"List-Unsubscribe=One-Click"}});if(g.provider==="noop"){let m="no email provider configured (RESEND_API_KEY unset on the API)";return await s.update(Rt).set({status:"failed",error:m}).where($r(Rt.id,a)),{ok:"failed",error:m,provider:g.provider}}return await s.update(Rt).set({status:"sent",providerId:g.id,sentAt:new Date}).where($r(Rt.id,a)),{ok:"sent",providerId:g.id,provider:g.provider}}catch(g){let m=g instanceof Error?g.message:String(g);return await s.update(Rt).set({status:"failed",error:m.slice(0,1e3)}).where($r(Rt.id,a)).catch(()=>{}),{ok:"failed",error:m}}}c(zq,"sendOne");var qr=new Vq;qr.use("/announcements/*",Ld());qr.use("/announcements",Ld());qr.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(Jq($e.createdAt));return e.json({announcements:t})});qr.get("/announcements/:id",async e=>{let t=e.req.param("id");if(!Zo.string().uuid().safeParse(t).success)return e.json({error:"Invalid id",code:"VALIDATION_ERROR"},400);let[n]=await u.select().from($e).where(so($e.id,t));if(!n)return e.json({error:"Announcement not found",code:"NOT_FOUND"},404);let r=await u.select({status:Rt.status,count:BA`count(*)::int`}).from(Rt).where(so(Rt.announcementId,t)).groupBy(Rt.status),o={};for(let s of r)o[s.status]=s.count;return e.json({...n,deliveryCounts:o})});qr.get("/announcements/:id/recipients/count",async e=>{let t=e.req.param("id");if(!Zo.string().uuid().safeParse(t).success)return e.json({error:"Invalid id",code:"VALIDATION_ERROR"},400);let n=await Gq();return e.json({count:n})});async function Gq(){let[e]=await u.select({count:BA`count(*)::int`}).from(kt).innerJoin(T,so(T.id,kt.userId)).where(HA(so(kt.productAnnouncements,!0),Kq(T.email)));return e?.count??0}c(Gq,"countOptedInRecipients");var UA=c(e=>e.includes("{{unsubscribe_url}}"),"hasUnsubscribePlaceholder"),Yq=Zo.object({subject:Zo.string().min(1).max(500).optional(),htmlBody:Zo.string().min(1).refine(UA,{message:"htmlBody must contain the {{unsubscribe_url}} placeholder"}).optional(),textBody:Zo.string().min(1).refine(UA,{message:"textBody must contain the {{unsubscribe_url}} placeholder"}).optional()});qr.patch("/announcements/:id",async e=>{let t=e.req.param("id");if(!Zo.string().uuid().safeParse(t).success)return e.json({error:"Invalid id",code:"VALIDATION_ERROR"},400);let n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON",code:"VALIDATION_ERROR"},400)}let r=Yq.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(so($e.id,t));if(!s)return e.json({error:"Announcement not found",code:"NOT_FOUND"},404);if(s.status!=="draft")return e.json({error:"Can only edit draft announcements",code:"INVALID_STATE",status:s.status},409);let[i]=await 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(so($e.id,t)).returning();return e.json(i)});qr.post("/announcements/:id/send",async e=>{let t=e.get("userId");if(!t)return e.json({error:"Unauthenticated",code:"UNAUTHENTICATED"},401);let n=e.req.param("id");if(!Zo.string().uuid().safeParse(n).success)return e.json({error:"Invalid id",code:"VALIDATION_ERROR"},400);let r=await u.update($e).set({status:"queued",sentBy:t,updatedAt:new Date}).where(HA(so($e.id,n),so($e.status,"draft"))).returning(),o=r[0],s=!1;if(r.length===0){let[i]=await u.select().from($e).where(so($e.id,n));if(!i)return e.json({error:"Announcement not found",code:"NOT_FOUND"},404);if(!((i.status==="queued"||i.status==="sending")&&!$A(n)))return e.json({error:`Cannot send from status='${i.status}' (must be 'draft', or a stalled 'queued'/'sending' to resume)`,code:"INVALID_STATE",status:i.status},409);o=i,s=!0}return qA(n).catch(i=>{process.stderr.write(`[announcements] send loop for ${n} failed: ${i instanceof Error?i.message:String(i)}
|
|
1601
|
+
`)}),e.json({processing:!0,resumed:s,announcement:o},202)});D();import{Hono as Xq}from"hono";import{inArray as WA,sql as FA}from"drizzle-orm";var Jd=new Xq;function zA(e){let t;try{t=decodeURIComponent(e)}catch{return[]}let n=t.replace(/=+$/,"").replaceAll("+","-").replaceAll("/","_");return t===n?[t]:[t,n]}c(zA,"tokenCandidates");Jd.get("/:token",async e=>{let t=e.req.param("token");if(!t||t.length<8)return e.json({error:"invalid_token"},404);let n=zA(t);if(n.length===0)return e.json({error:"invalid_token"},404);let[r]=await u.select({productAnnouncements:kt.productAnnouncements,unsubscribedAt:kt.unsubscribedAt}).from(kt).where(WA(kt.unsubscribeToken,n)).limit(1);return r?e.json({valid:!0,alreadyUnsubscribed:r.productAnnouncements===!1}):e.json({error:"invalid_token"},404)});Jd.post("/:token",async e=>{let t=e.req.param("token");if(!t||t.length<8)return e.json({error:"invalid_token"},404);let n=zA(t);return n.length===0?e.json({error:"invalid_token"},404):(await u.update(kt).set({productAnnouncements:!1,unsubscribedAt:FA`now()`,updatedAt:FA`now()`}).where(WA(kt.unsubscribeToken,n)).returning({userId:kt.userId})).length===0?e.json({error:"invalid_token"},404):e.json({ok:!0})});D();import{createHash as Qq}from"node:crypto";async function VA(){let e=[],t=0,n=0,r=0;for(let[o,s]of Object.entries(qd)){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=Qq("sha256").update(d).digest("hex"),p=!0,f=[],_=null;try{f=i.parse(d)}catch(m){p=!1,_=m instanceof Error?m.message:String(m)}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 m of f)await u.insert(ve).values({provider:o,plan:m.plan,limitType:m.limitType,value:String(m.value),unit:m.unit,comparator:m.comparator??"=",resetsAt:null,sourceType:"official_docs",sourceUrl:i.url,sourceEvidence:{snapshotHash:l},confidence:"0.85",userId:null}),r++;n++}}catch(a){e.push({provider:o,url:i.url,message:a instanceof Error?a.message:String(a)})}}return{providers_scraped:t,snapshots_inserted:n,observations_inserted:r,errors:e}}c(VA,"scrapeProviderDocs");var Zq=360*60*1e3,JA=!1;function KA(){if(JA)return{stop:c(()=>{},"stop")};JA=!0;let e=setTimeout(()=>{VA().then(n=>{n.errors.length>0?console.warn("[research] scrape completed with errors:",n):console.log(`[research] scrape ok: providers=${n.providers_scraped}, snapshots+=${n.snapshots_inserted}, observations+=${n.observations_inserted}`)}).catch(n=>console.warn("[research] scrape failed:",n))},3e4),t=setInterval(()=>{VA().then(n=>{n.errors.length>0&&console.warn("[research] scrape completed with errors:",n)}).catch(n=>console.warn("[research] scrape failed:",n))},Zq);return{stop:c(()=>{clearTimeout(e),clearInterval(t)},"stop")}}c(KA,"startScrapeInterval");var J=new nU,iU=process.env.ALLOWED_ORIGINS?.split(",")??["http://localhost:5174","http://localhost:5175"];J.use("*",rU({origin:c(e=>e?iU.includes(e)?e:"":"*","origin"),allowMethods:["GET","POST","PUT","PATCH","DELETE","OPTIONS"],allowHeaders:["Authorization","Content-Type"],credentials:!0}));J.use("*",_m());J.use("*",pv());J.use("/api/*",oU({maxSize:10*1024*1024}));J.use("*",lv);J.use("/auth/login",Rc(900*1e3,10));var QA=Rc(60*1e3,10);J.use("/api/auth/api-keys",QA);J.use("/api/auth/api-keys/*",QA);J.use("/api/invitations/*",Rc(60*1e3,30));J.use("/api/telemetry/cli-error",Rc(60*1e3,60));J.route("/",vi);J.route("/api",Ku);J.route("/",yi);J.route("/",$d);J.route("/api",Ju);J.route("/api",Jp);J.route("/",Gp);J.use("/api/*",av);J.use("/api/*",dv);J.use("/api/sessions/:id/context-snapshots",Nc);J.use("/api/sessions/:id/events",Nc);J.use("/api/sessions/import",Nc);J.use("/api/internal/research/observe",Nc);J.use("/api/*",async(e,t)=>{let n=e.req.path,r=e.req.method,o=r==="GET"&&n.startsWith("/api/invitations/")&&n!=="/api/invitations/accept",s=r==="GET"&&n==="/api/cli/latest-version",i=r==="POST"&&n==="/api/skills/sync-public",a=(r==="GET"||r==="POST")&&n.startsWith("/api/unsubscribe/");return o||s||i||a?t():ov(e,t)});J.route("/api",Nn);J.route("/api",Mc);J.route("/api",$c);J.route("/api",qc);J.route("/api",Bc);J.route("/api",ol);J.route("/api",So);J.route("/api",jo);J.route("/api",pd);J.route("/api",Tr);J.route("/api",rp);J.route("/api",ra);J.route("/api",hd);J.route("/api",up);J.route("/api",Jn);J.route("/api",fp);J.route("/api",Oo);J.route("/api",sa);J.route("/api",Os);J.route("/api",ca);J.route("/api",Cs);J.route("/api",da);J.route("/api",Yr);J.route("/api",Ms);J.route("/api",fa);J.route("/api",Lo);J.route("/api",Ip);J.route("/api",Gn);J.route("/api",bn);J.route("/api",wa);J.route("/api",eo);J.route("/api",Bo);J.route("/api",Td);J.route("/api",ba);J.route("/api",Fo);J.route("/api",Or);J.route("/api",Js);J.route("/api",Go);J.route("/api/invitations",Pd);J.route("/api",Cd);J.route("/api",En);J.route("/api",Vp);J.route("/api",Md);J.route("/api",fr);J.route("/api",Bd);J.route("/api",zd);J.route("/api",em);J.route("/api",tm);J.route("/api",Oa);J.route("/api",qr);J.route("/api/unsubscribe",Jd);J.route("/api",Kp);var aU=setTimeout(()=>{Pp().catch(()=>{})},5e3),cU=KA(),ZA=[{stop:c(()=>clearTimeout(aU),"stop")},cU],dU=Ca.dirname(tU(import.meta.url)),P_=process.env.WEB_DIST_PATH??Ca.resolve(dU,"../../../apps/web/dist");if(Kd.existsSync(P_)){let e=c(async t=>{let n=Ca.join(P_,"index.html");if(!Kd.existsSync(n))return t.notFound();let{stampRuntimeConfig:r}=await Promise.resolve().then(()=>(XA(),YA));return t.html(r(Kd.readFileSync(n,"utf-8")))},"serveIndex");J.get("/",e),J.get("/index.html",e),J.use("/*",sU({root:P_,rewriteRequestPath:c(t=>t,"rewriteRequestPath")})),J.get("*",e)}J.onError(sv);D();import{sql as Ur}from"drizzle-orm";var uU=300*1e3,lU="reconciler: lease expired with attempts exhausted \u2014 agent likely crashed mid-run",pU="reconciler: in-flight row had no lease and attempts were exhausted \u2014 unclaimable and unswept until recovered",La=1,mU=["eval_jobs","insights_jobs","launch_jobs","session_send_jobs","agent_jobs"];function Ma(){return Ur.join(Object.entries(N_).map(([e,t])=>Ur`WHEN ${e} THEN ${t}::int`),Ur` `)}c(Ma,"maxAttemptsCase");async function fU(e){let t=await u.execute(Ur`
|
|
1555
1602
|
UPDATE ${Ur.raw(e)}
|
|
1556
1603
|
SET status = 'failed',
|
|
1557
|
-
error = ${
|
|
1604
|
+
error = ${lU},
|
|
1558
1605
|
completed_at = now(),
|
|
1559
1606
|
claimed_by = NULL,
|
|
1560
1607
|
claimed_at = NULL,
|
|
@@ -1566,7 +1613,7 @@ end`;async function Ks(e){let t=e.req.param("teamId");if(!t||!to.test(t))return{
|
|
|
1566
1613
|
AND attempts >= (CASE task_kind ${Ma()} ELSE 3 END)
|
|
1567
1614
|
AND lease_recoveries >= ${La}
|
|
1568
1615
|
RETURNING id
|
|
1569
|
-
`),n=await
|
|
1616
|
+
`),n=await u.execute(Ur`
|
|
1570
1617
|
UPDATE ${Ur.raw(e)}
|
|
1571
1618
|
SET status = 'pending',
|
|
1572
1619
|
attempts = GREATEST(attempts - 1, 0),
|
|
@@ -1579,7 +1626,7 @@ end`;async function Ks(e){let t=e.req.param("teamId");if(!t||!to.test(t))return{
|
|
|
1579
1626
|
AND claimed_by IS NOT NULL
|
|
1580
1627
|
AND lease_expires_at < now()
|
|
1581
1628
|
RETURNING id
|
|
1582
|
-
`),r=await
|
|
1629
|
+
`),r=await u.execute(Ur`
|
|
1583
1630
|
UPDATE ${Ur.raw(e)}
|
|
1584
1631
|
SET status = CASE
|
|
1585
1632
|
WHEN attempts >= (CASE task_kind ${Ma()} ELSE 3 END)
|
|
@@ -1598,7 +1645,7 @@ end`;async function Ks(e){let t=e.req.param("teamId");if(!t||!to.test(t))return{
|
|
|
1598
1645
|
END,
|
|
1599
1646
|
error = CASE
|
|
1600
1647
|
WHEN attempts >= (CASE task_kind ${Ma()} ELSE 3 END)
|
|
1601
|
-
AND lease_recoveries >= ${La} THEN ${
|
|
1648
|
+
AND lease_recoveries >= ${La} THEN ${pU}
|
|
1602
1649
|
ELSE error
|
|
1603
1650
|
END,
|
|
1604
1651
|
completed_at = CASE
|
|
@@ -1613,7 +1660,7 @@ end`;async function Ks(e){let t=e.req.param("teamId");if(!t||!to.test(t))return{
|
|
|
1613
1660
|
AND claimed_by IS NULL
|
|
1614
1661
|
AND updated_at < now() - interval '15 minutes'
|
|
1615
1662
|
RETURNING id
|
|
1616
|
-
`);return t.length+n.length+r.length}c(
|
|
1663
|
+
`);return t.length+n.length+r.length}c(fU,"reclaimExpiredLeases");async function gU(){return(await u.execute(Ur`
|
|
1617
1664
|
UPDATE memory_experiments me
|
|
1618
1665
|
SET status = 'failed',
|
|
1619
1666
|
error = 'reconciler: worker died mid-experiment (backing job terminal, row left running)',
|
|
@@ -1626,12 +1673,12 @@ end`;async function Ks(e){let t=e.req.param("teamId");if(!t||!to.test(t))return{
|
|
|
1626
1673
|
AND aj.status IN ('failed', 'completed')
|
|
1627
1674
|
)
|
|
1628
1675
|
RETURNING me.id
|
|
1629
|
-
`)).length}c(
|
|
1676
|
+
`)).length}c(gU,"failStrandedMemoryExperiments");function eS(){let e=setTimeout(()=>{n()},3e4),t=setInterval(()=>{n()},uU);async function n(){try{let r=[];for(let o of mU)try{let s=await fU(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 gU();o>0&&console.log(`[reconciler] failed ${o} stranded memory experiment(s)`)}catch(o){console.error("[reconciler] memory-experiment sweep failed:",o instanceof Error?o.stack:o)}}catch(r){console.error("[reconciler] unexpected error:",r instanceof Error?r.stack:r)}}return c(n,"runOnce"),{stop(){clearTimeout(e),clearInterval(t)}}}c(eS,"startReconciler");D();import{and as _U,eq as O_,sql as rm}from"drizzle-orm";D();import{and as tS,eq as D_,inArray as hU,sql as nS}from"drizzle-orm";async function rS(e,t){let n=new Map;if(t.length===0)return n;let r=t.map(f=>f.id),o=new Map(t.map(f=>[f.id,f.version])),i=(await u.select({id:y.id,projectId:y.projectId,outcome:nS`${y.analysis}->>'outcome'`}).from(y).where(tS(D_(y.userId,e),nS`${y.analysis} is not null`)).orderBy(y.id)).map(f=>({id:f.id,key:f.projectId??"(no-project)",score:ys(f.outcome)})).filter(f=>f.score!=null),a=await u.select({sessionId:ne.sessionId,treatmentId:ne.treatmentId,treatmentVersion:ne.treatmentVersion}).from(ne).where(tS(D_(ne.userId,e),D_(ne.treatmentType,"memory"),hU(ne.treatmentId,r))),d=new Map,l=new Map;for(let f of a){let _=f.treatmentVersion===o.get(f.treatmentId)?d:l,v=_.get(f.treatmentId);v||(v=new Set,_.set(f.treatmentId,v)),v.add(f.sessionId)}let p=c(f=>{let _=d.get(f);if(!_||_.size===0)return"insufficient";let v=l.get(f),g=new Map;for(let m of i){if(v?.has(m.id)&&!_.has(m.id))continue;let w=g.get(m.key);w||(w={key:m.key,withScores:[],withoutScores:[]},g.set(m.key,w)),(_.has(m.id)?w.withScores:w.withoutScores).push(m.score)}return _s(Pn([...g.values()],{iterations:1e3}))},"effectOf");for(let f of t)n.set(f.id,p(f.id));return n}c(rS,"computeTrustClasses");var yU=1800*1e3;async function wU(e,t){if(t.length===0)return;let n=rm.join(t.map(r=>rm`(${r.id}::uuid, ${r.trustClass}::text, ${r.version}::int)`),rm`, `);await u.execute(rm`
|
|
1630
1677
|
update memories m
|
|
1631
1678
|
set trust_class = v.cls, trust_version = v.ver, trust_computed_at = now()
|
|
1632
1679
|
from (values ${n}) as v(id, cls, ver)
|
|
1633
1680
|
where m.id = v.id and m.user_id = ${e}
|
|
1634
|
-
`)}c(
|
|
1681
|
+
`)}c(wU,"applyMaterializedTrust");async function vU(e){let t=await u.select({id:F.id,version:F.version}).from(F).where(_U(O_(F.userId,e),O_(F.status,"active")));if(t.length===0)return 0;let n=await rS(e,t),r=t.map(o=>({id:o.id,trustClass:n.get(o.id)??"insufficient",version:o.version}));return await wU(e,r),r.length}c(vU,"refreshMemoryTrustForUser");async function IU(){let e=await u.selectDistinct({userId:F.userId}).from(F).where(O_(F.status,"active")),t=0;for(let{userId:n}of e)try{t+=await vU(n)}catch(r){console.error(`[memory-trust-refresh] user ${n} failed:`,r instanceof Error?r.stack:r)}return{users:e.length,memories:t}}c(IU,"refreshAllMemoryTrust");function oS(){let e=setTimeout(()=>void n(),45e3),t=setInterval(()=>void n(),yU);async function n(){try{let{users:r,memories:o}=await IU();o>0&&console.log(`[memory-trust-refresh] materialized ${o} memory class(es) across ${r} user(s)`)}catch(r){console.error("[memory-trust-refresh] sweep failed:",r instanceof Error?r.stack:r)}}return c(n,"runOnce"),{stop(){clearTimeout(e),clearInterval(t)}}}c(oS,"startMemoryTrustRefresh");D();import{sql as bU}from"drizzle-orm";var EU=30*6e4,sS=24,AU=6,iS="pipeline:usage_observations_stale";async function SU(){let e=await u.execute(bU`
|
|
1635
1682
|
WITH active_users AS (
|
|
1636
1683
|
SELECT user_id, count(*) AS sessions_24h
|
|
1637
1684
|
FROM sessions
|
|
@@ -1686,10 +1733,10 @@ end`;async function Ks(e){let t=e.req.param("teamId");if(!t||!to.test(t))return{
|
|
|
1686
1733
|
SELECT 1 FROM alert_dispatches d
|
|
1687
1734
|
WHERE d.user_id = s.user_id
|
|
1688
1735
|
AND d.alert_key = ${iS}
|
|
1689
|
-
AND d.last_dispatched_at > now() - make_interval(hours => ${
|
|
1736
|
+
AND d.last_dispatched_at > now() - make_interval(hours => ${AU})
|
|
1690
1737
|
)
|
|
1691
1738
|
RETURNING user_id, id, last_state->>'message' AS message
|
|
1692
|
-
`);e.length>0&&console.log(`[usage-staleness] dispatched stale-pipeline alert for ${e.length} user(s)`);for(let t of e)try{await ja({userId:t.user_id,dispatchId:t.id,severity:"soft",message:t.message??"Usage tracking looks broken \u2014 open /usage.",title:"Usage tracking issue"})}catch(n){console.error("[usage-staleness] bell mirror failed:",n instanceof Error?n.message:n)}return e.length}c(
|
|
1739
|
+
`);e.length>0&&console.log(`[usage-staleness] dispatched stale-pipeline alert for ${e.length} user(s)`);for(let t of e)try{await ja({userId:t.user_id,dispatchId:t.id,severity:"soft",message:t.message??"Usage tracking looks broken \u2014 open /usage.",title:"Usage tracking issue"})}catch(n){console.error("[usage-staleness] bell mirror failed:",n instanceof Error?n.message:n)}return e.length}c(SU,"checkUsageStalenessOnce");function aS(){let e=setTimeout(()=>{n()},6e4),t=setInterval(()=>{n()},EU);async function n(){try{await SU()}catch(r){console.error("[usage-staleness] check failed:",r instanceof Error?r.stack:r)}}return c(n,"runOnce"),{stop:c(()=>{clearTimeout(e),clearInterval(t)},"stop")}}c(aS,"startUsageStalenessChecker");D();import{sql as xU}from"drizzle-orm";var TU=30*6e4,om=24,RU=6,cS="pipeline:session_capture_stale";async function kU(){let e=await u.execute(xU`
|
|
1693
1740
|
WITH active_users AS (
|
|
1694
1741
|
SELECT user_id, max(last_seen) AS last_observed,
|
|
1695
1742
|
array_agg(DISTINCT signal) AS signals
|
|
@@ -1699,13 +1746,13 @@ end`;async function Ks(e){let t=e.req.param("teamId");if(!t||!to.test(t))return{
|
|
|
1699
1746
|
FROM limit_observations
|
|
1700
1747
|
WHERE source_type = 'oauth_usage'
|
|
1701
1748
|
AND user_id IS NOT NULL
|
|
1702
|
-
AND observed_at > now() - make_interval(hours => ${
|
|
1749
|
+
AND observed_at > now() - make_interval(hours => ${om})
|
|
1703
1750
|
GROUP BY user_id
|
|
1704
1751
|
UNION ALL
|
|
1705
1752
|
SELECT user_id, max(last_heartbeat), 'worker heartbeat'
|
|
1706
1753
|
FROM worker_connections
|
|
1707
1754
|
WHERE worker_type = 'cli-worker'
|
|
1708
|
-
AND last_heartbeat > now() - make_interval(hours => ${
|
|
1755
|
+
AND last_heartbeat > now() - make_interval(hours => ${om})
|
|
1709
1756
|
GROUP BY user_id
|
|
1710
1757
|
UNION ALL
|
|
1711
1758
|
-- Beacons are unauthenticated (no user_id); attribute via the most
|
|
@@ -1721,7 +1768,7 @@ end`;async function Ks(e){let t=e.req.param("teamId");if(!t||!to.test(t))return{
|
|
|
1721
1768
|
) owner ON true
|
|
1722
1769
|
WHERE e.event = 'hook_capture_failed'
|
|
1723
1770
|
AND e.device_id IS NOT NULL
|
|
1724
|
-
AND e.created_at > now() - make_interval(hours => ${
|
|
1771
|
+
AND e.created_at > now() - make_interval(hours => ${om})
|
|
1725
1772
|
GROUP BY owner.user_id
|
|
1726
1773
|
) signal_union
|
|
1727
1774
|
GROUP BY user_id
|
|
@@ -1740,7 +1787,7 @@ end`;async function Ks(e){let t=e.req.param("teamId");if(!t||!to.test(t))return{
|
|
|
1740
1787
|
FROM active_users a
|
|
1741
1788
|
LEFT JOIN latest_session s ON s.user_id = a.user_id
|
|
1742
1789
|
WHERE s.last_session IS NULL
|
|
1743
|
-
OR s.last_session < now() - make_interval(hours => ${
|
|
1790
|
+
OR s.last_session < now() - make_interval(hours => ${om})
|
|
1744
1791
|
)
|
|
1745
1792
|
INSERT INTO alert_dispatches (user_id, alert_key, severity, channel, last_state)
|
|
1746
1793
|
SELECT
|
|
@@ -1765,10 +1812,10 @@ end`;async function Ks(e){let t=e.req.param("teamId");if(!t||!to.test(t))return{
|
|
|
1765
1812
|
SELECT 1 FROM alert_dispatches d
|
|
1766
1813
|
WHERE d.user_id = s.user_id
|
|
1767
1814
|
AND d.alert_key = ${cS}
|
|
1768
|
-
AND d.last_dispatched_at > now() - make_interval(hours => ${
|
|
1815
|
+
AND d.last_dispatched_at > now() - make_interval(hours => ${RU})
|
|
1769
1816
|
)
|
|
1770
1817
|
RETURNING user_id, id, last_state->>'message' AS message
|
|
1771
|
-
`);e.length>0&&console.log(`[capture-staleness] dispatched stale-capture alert for ${e.length} user(s)`);for(let t of e)try{await ja({userId:t.user_id,dispatchId:t.id,severity:"soft",message:t.message??"Session capture looks broken \u2014 check the proxy.",title:"Session capture issue"})}catch(n){console.error("[capture-staleness] bell mirror failed:",n instanceof Error?n.message:n)}return e.length}c(
|
|
1818
|
+
`);e.length>0&&console.log(`[capture-staleness] dispatched stale-capture alert for ${e.length} user(s)`);for(let t of e)try{await ja({userId:t.user_id,dispatchId:t.id,severity:"soft",message:t.message??"Session capture looks broken \u2014 check the proxy.",title:"Session capture issue"})}catch(n){console.error("[capture-staleness] bell mirror failed:",n instanceof Error?n.message:n)}return e.length}c(kU,"checkCaptureStalenessOnce");function dS(){let e=setTimeout(()=>{n()},9e4),t=setInterval(()=>{n()},TU);async function n(){try{await kU()}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(dS,"startCaptureStalenessChecker");D();import{sql as uS}from"drizzle-orm";var NU=900*1e3,lS=6,pS=60,jU=uS`array['user_message','tool_call','tool_result']`;async function PU(){return[...await u.execute(uS`
|
|
1772
1819
|
WITH session_stats AS (
|
|
1773
1820
|
SELECT s.id,
|
|
1774
1821
|
s.external_session_id,
|
|
@@ -1776,7 +1823,7 @@ end`;async function Ks(e){let t=e.req.param("teamId");if(!t||!to.test(t))return{
|
|
|
1776
1823
|
(
|
|
1777
1824
|
SELECT MAX(timestamp) FROM session_events e
|
|
1778
1825
|
WHERE e.session_id = s.id
|
|
1779
|
-
AND e.event_type = ANY(${
|
|
1826
|
+
AND e.event_type = ANY(${jU})
|
|
1780
1827
|
) AS last_hook_event
|
|
1781
1828
|
FROM sessions s
|
|
1782
1829
|
WHERE s.started_at > now() - (${lS}::int * interval '1 hour')
|
|
@@ -1790,8 +1837,8 @@ end`;async function Ks(e){let t=e.req.param("teamId");if(!t||!to.test(t))return{
|
|
|
1790
1837
|
FROM session_stats ss
|
|
1791
1838
|
JOIN context_snapshots cs ON cs.session_id = ss.id
|
|
1792
1839
|
WHERE ss.last_hook_event IS NOT NULL
|
|
1793
|
-
AND cs.captured_at > ss.last_hook_event + (${
|
|
1840
|
+
AND cs.captured_at > ss.last_hook_event + (${pS}::int * interval '1 second')
|
|
1794
1841
|
GROUP BY ss.id, ss.external_session_id, ss.tool
|
|
1795
1842
|
HAVING COUNT(cs.id) > 0
|
|
1796
|
-
`)]}c(
|
|
1797
|
-
`)){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
|
|
1843
|
+
`)]}c(PU,"auditPollutionOnce");function mS(){let e=setTimeout(()=>{n()},6e4),t=setInterval(()=>{n()},NU);async function n(){try{let r=await PU();if(r.length===0)return;for(let o of r)console.warn(`[pollution-auditor] suspected_pollution session_id=${o.sessionId} external_session_id=${o.externalSessionId??"(null)"} tool=${o.tool} polluted_snapshots=${o.pollutedSnapshots} first_polluted_at=${o.firstPollutedAt} last_polluted_at=${o.lastPollutedAt}`);console.warn(`[pollution-auditor] pass summary: ${r.length} sessions flagged (window=${lS}h, grace=${pS}s)`)}catch(r){console.error("[pollution-auditor] pass failed:",r instanceof Error?r.stack:r)}}return c(n,"runOnce"),{stop(){clearTimeout(e),clearInterval(t)}}}c(mS,"startPollutionAuditor");D();var CU=im.dirname(DU(import.meta.url)),fS=im.resolve(CU,"../../../.env.local");if(sm.existsSync(fS))for(let e of sm.readFileSync(fS,"utf-8").split(`
|
|
1844
|
+
`)){let t=e.trim();if(!t||t.startsWith("#"))continue;let n=t.indexOf("=");if(n===-1)continue;let r=t.slice(0,n),o=t.slice(n+1);process.env[r]||(process.env[r]=o)}process.env.PG_APPLICATION_NAME||="rulemetric-api";var LU=wm({serviceName:"rulemetric-api"});LU?console.log("[sentry] error capture enabled"):process.env.NODE_ENV==="production"&&console.log("[sentry] no SENTRY_DSN \u2014 error capture disabled");var C_=mm({serviceName:"rulemetric-api"});console.log(C_==="otlp"?`[otel] traces exporting to ${process.env.OTEL_EXPORTER_OTLP_ENDPOINT}`:C_==="console"?"[otel] traces printing to stdout (set OTEL_EXPORTER_OTLP_ENDPOINT to ship to a backend)":C_==="silent"?"[otel] traces enabled, span export OFF (OTEL_SPAN_EXPORT=none \u2014 no stdout span dump)":"[otel] disabled (TELEMETRY_ENABLED=false)");var MU=new Set(["CONNECT_TIMEOUT","ETIMEDOUT","ENOTFOUND","ECONNRESET","ECONNREFUSED","EAI_AGAIN","EPIPE"]);process.on("unhandledRejection",e=>{let t=_i(e);console.error(`[guard] unhandledRejection${t?` code=${t}`:""}: ${e instanceof Error?e.message:String(e)}`),hr(e,{tags:{source:"unhandledRejection",code:t??"unknown"}})});process.on("uncaughtException",e=>{let t=_i(e);if(t&&MU.has(t)){console.error(`[guard] uncaughtException (transient net code=${t}) \u2014 surviving: ${e.message}`),hr(e,{tags:{source:"uncaughtException",code:t}});return}console.error("[guard] uncaughtException (fatal):",e),hr(e,{tags:{source:"uncaughtException",code:t??"unknown"}}),Promise.allSettled([Wa(2e3),Ec()]).finally(()=>process.exit(1))});var L_=Number(process.env.API_PORT)||3e3;console.log(`RuleMetric API starting on port ${L_}`);console.log(`[auth] JWT verification: ${process.env.SUPABASE_JWT_SECRET?"local (fast path)":"remote getUser (set SUPABASE_JWT_SECRET to enable fast path)"}`);{let e=Ff();e.error&&console.warn(`[deployment] ${e.error}`);let t=process.env.DATABASE_URL?.match(/:(\d+)\/[^/]*$/)?.[1];e.mode==="local"?console.log(`[db] deployment=local (${e.source}) \u2014 direct postgres :${t??"?"}, pooler heuristics disabled`):console.log(`[db] deployment=cloud \u2014 pooler port ${t??"?"} \u2014 ${t==="6543"?"transaction mode (correct)":t==="5432"?"SESSION mode \u2014 WRONG for the always-on API (15-slot cap!)":"unknown"}`)}var hS,es=[],gS=!1;async function $U(){let e=OU({fetch:J.fetch,hostname:"0.0.0.0",port:L_});hS=e,e.keepAliveTimeout=65e3,e.headersTimeout=66e3,console.log(`RuleMetric API running at http://localhost:${L_} (keepAliveTimeout=65s)`),tv().then(t=>console.log(`[auth] JWKS prime ${t?"ok":"deferred (will fetch on first auth)"}`)),es.push(eS()),es.push(oS()),Pl()&&kI(),Qp()&&_A(),es.push(aS()),es.push(dS()),es.push(hv()),es.push(mS()),es.push(...ZA)}c($U,"start");$U().catch(e=>{console.error("Failed to start API:",e),hr(e,{tags:{phase:"boot",source:"start"}}),Promise.allSettled([Wa(2e3),Ec()]).finally(()=>process.exit(1))});async function _S(){if(!gS){gS=!0;for(let e of es)try{e.stop()}catch{}try{hS?.close?.()}catch{}try{await NI(5e3)}catch{}try{await yA(5e3)}catch{}await Promise.allSettled([fm(),Wa(2e3),Ec()]),process.exit(0)}}c(_S,"gracefulShutdown");process.on("SIGTERM",_S);process.on("SIGINT",_S);
|