@rulemetric/local 0.9.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/server.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var o_=Object.defineProperty;var d=(e,t)=>o_(e,"name",{value:t,configurable:!0}),kp=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var J=(e,t)=>()=>(e&&(t=e(e=0)),t);var to=(e,t)=>{for(var n in t)o_(e,n,{get:t[n],enumerable:!0})};import{pgTable as Ed,text as Hs,timestamp as Aa,jsonb as c_,uuid as Yo,primaryKey as d_}from"drizzle-orm/pg-core";var G,K,Q,ye,Xo=J(()=>{"use strict";G=Ed("organizations",{id:Yo("id").primaryKey().defaultRandom(),name:Hs("name").unique().notNull(),slug:Hs("slug").unique().notNull(),metadata:c_("metadata"),createdAt:Aa("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Aa("updated_at",{withTimezone:!0}).defaultNow()}),K=Ed("teams",{id:Yo("id").primaryKey().defaultRandom(),orgId:Yo("org_id").references(()=>G.id,{onDelete:"cascade"}),name:Hs("name").notNull(),slug:Hs("slug").notNull(),metadata:c_("metadata"),createdAt:Aa("created_at",{withTimezone:!0}).defaultNow()}),Q=Ed("user_organizations",{userId:Yo("user_id").notNull(),orgId:Yo("org_id").references(()=>G.id,{onDelete:"cascade"}).notNull(),role:Hs("role").notNull().default("member"),createdAt:Aa("created_at",{withTimezone:!0}).defaultNow()},e=>[d_({columns:[e.userId,e.orgId]})]),ye=Ed("user_teams",{userId:Yo("user_id").notNull(),teamId:Yo("team_id").references(()=>K.id,{onDelete:"cascade"}).notNull(),role:Hs("role").notNull().default("member"),createdAt:Aa("created_at",{withTimezone:!0}).defaultNow()},e=>[d_({columns:[e.userId,e.teamId]})])});import{boolean as xd,pgTable as qE,real as UE,text as Td,timestamp as Lp,uuid as u_}from"drizzle-orm/pg-core";var T,Ft=J(()=>{"use strict";Xo();T=qE("profiles",{id:u_("id").primaryKey(),email:Td("email"),displayName:Td("display_name"),activeOrgId:u_("active_org_id").references(()=>G.id,{onDelete:"set null"}),isSuperadmin:xd("is_superadmin").notNull().default(!1),claudeCodePlan:Td("claude_code_plan"),planSource:Td("plan_source").notNull().default("detected"),setupCompletedAt:Lp("setup_completed_at",{withTimezone:!0}),liveSendSkipped:xd("live_send_skipped").notNull().default(!1),autoAcceptSuggestions:xd("auto_accept_suggestions").notNull().default(!0),evolutionPaused:xd("evolution_paused").notNull().default(!1),suggestionConfidenceThreshold:UE("suggestion_confidence_threshold").notNull().default(.7),createdAt:Lp("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Lp("updated_at",{withTimezone:!0}).defaultNow()})});import{pgTable as HE,text as $p,timestamp as Rd,uuid as kd,index as l_}from"drizzle-orm/pg-core";var ae,p_=J(()=>{"use strict";Xo();Ft();ae=HE("org_invitations",{id:kd("id").primaryKey().defaultRandom(),orgId:kd("org_id").notNull().references(()=>G.id,{onDelete:"cascade"}),email:$p("email").notNull(),role:$p("role").notNull().default("member"),teamId:kd("team_id").references(()=>K.id,{onDelete:"set null"}),invitedBy:kd("invited_by").notNull().references(()=>T.id,{onDelete:"cascade"}),token:$p("token").notNull().unique(),expiresAt:Rd("expires_at",{withTimezone:!0}).notNull(),acceptedAt:Rd("accepted_at",{withTimezone:!0}),revokedAt:Rd("revoked_at",{withTimezone:!0}),createdAt:Rd("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[l_("idx_org_invitations_token").on(e.token),l_("idx_org_invitations_org").on(e.orgId)])});import{pgTable as qp,text as Jt,timestamp as no,jsonb as jd,uuid as or,integer as Nd,boolean as BE,uniqueIndex as Pd,index as Ea}from"drizzle-orm/pg-core";var g,sr,Ie,Fn=J(()=>{"use strict";g=qp("instructions",{id:or("id").primaryKey().defaultRandom(),name:Jt("name").notNull(),description:Jt("description").notNull(),type:Jt("type").notNull().default("instruction"),scope:Jt("scope").notNull(),scopeRef:or("scope_ref"),version:Jt("version").notNull(),content:Jt("content").notNull(),frontmatter:jd("frontmatter").notNull(),slots:jd("slots"),tags:Jt("tags").array(),compatibility:Jt("compatibility").array(),createdBy:or("created_by"),createdAt:no("created_at",{withTimezone:!0}).defaultNow(),updatedAt:no("updated_at",{withTimezone:!0}).defaultNow(),archived:BE("archived").default(!1),archivedAt:no("archived_at",{withTimezone:!0}),archivedBy:or("archived_by"),forkedFromId:or("forked_from_id").references(()=>g.id,{onDelete:"set null"}),upstreamVersion:Jt("upstream_version"),badge:Jt("badge"),contentHash:Jt("content_hash"),contextIdentity:Jt("context_identity"),scanScore:Nd("scan_score"),scanFindings:jd("scan_findings"),popularityScore:Nd("popularity_score"),sourceUpdatedAt:no("source_updated_at",{withTimezone:!0})},e=>[Pd("instructions_name_scope_ref_idx").on(e.name,e.scope,e.scopeRef),Ea("idx_instructions_scope").on(e.scope,e.scopeRef),Ea("idx_instructions_created_by").on(e.createdBy),Ea("idx_instructions_context_identity").on(e.createdBy,e.contextIdentity),Ea("idx_instructions_public_recency").on(e.scope,e.sourceUpdatedAt.desc())]),sr=qp("instruction_version_identities",{id:or("id").primaryKey().defaultRandom(),instructionId:or("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),contentHash:Jt("content_hash").notNull(),versionOrdinal:Nd("version_ordinal").notNull(),content:Jt("content"),firstSeenAt:no("first_seen_at",{withTimezone:!0}).notNull().defaultNow(),lastSeenAt:no("last_seen_at",{withTimezone:!0}).notNull().defaultNow(),createdAt:no("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Pd("instruction_version_identities_hash_unique").on(e.instructionId,e.contentHash),Pd("instruction_version_identities_ordinal_unique").on(e.instructionId,e.versionOrdinal),Ea("idx_ivi_instruction").on(e.instructionId)]),Ie=qp("instruction_versions",{id:or("id").primaryKey().defaultRandom(),instructionId:or("instruction_id").references(()=>g.id,{onDelete:"cascade"}),versionNumber:Nd("version_number").notNull(),content:Jt("content").notNull(),frontmatter:jd("frontmatter").notNull(),changeSummary:Jt("change_summary"),createdBy:or("created_by"),createdAt:no("created_at",{withTimezone:!0}).defaultNow()},e=>[Pd("instruction_versions_instruction_version_idx").on(e.instructionId,e.versionNumber)])});import{pgTable as FE,text as WE,timestamp as zE,jsonb as VE,uuid as Up,index as m_}from"drizzle-orm/pg-core";var Ct,f_=J(()=>{"use strict";Fn();Ct=FE("instruction_events",{id:Up("id").primaryKey().defaultRandom(),instructionId:Up("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),eventType:WE("event_type").notNull(),actorId:Up("actor_id").notNull(),metadata:VE("metadata"),createdAt:zE("created_at",{withTimezone:!0}).defaultNow()},e=>[m_("idx_instruction_events_instruction").on(e.instructionId),m_("idx_instruction_events_type").on(e.eventType)])});import{boolean as JE,jsonb as GE,pgTable as Bp,primaryKey as g_,text as Qo,timestamp as xa,uniqueIndex as Hp,uuid as Zo}from"drizzle-orm/pg-core";import{sql as KE}from"drizzle-orm";var U,at,le,Pr=J(()=>{"use strict";Xo();Fn();U=Bp("projects",{id:Zo("id").primaryKey().defaultRandom(),orgId:Zo("org_id").references(()=>G.id,{onDelete:"cascade"}),name:Qo("name").notNull(),description:Qo("description"),githubRepo:Qo("github_repo"),gitRemoteUrl:Qo("git_remote_url"),gitRootCommit:Qo("git_root_commit"),gitRemoteAliases:Qo("git_remote_aliases").array().notNull().default([]),metadata:GE("metadata"),createdBy:Zo("created_by"),createdAt:xa("created_at",{withTimezone:!0}).defaultNow(),updatedAt:xa("updated_at",{withTimezone:!0}).defaultNow()},e=>[Hp("projects_org_name_idx").on(e.orgId,e.name),Hp("projects_git_remote_url_unique").on(e.gitRemoteUrl).where(KE`${e.gitRemoteUrl} IS NOT NULL`)]),at=Bp("project_instructions",{projectId:Zo("project_id").references(()=>U.id,{onDelete:"cascade"}).notNull(),instructionId:Zo("instruction_id").references(()=>g.id,{onDelete:"cascade"}).notNull(),addedAt:xa("added_at",{withTimezone:!0}).defaultNow(),addedBy:Zo("added_by")},e=>[g_({columns:[e.projectId,e.instructionId]})]),le=Bp("project_checkouts",{projectId:Zo("project_id").references(()=>U.id,{onDelete:"cascade"}).notNull(),path:Qo("path").notNull(),isWorktree:JE("is_worktree").notNull().default(!1),firstSeen:xa("first_seen",{withTimezone:!0}).notNull().defaultNow(),lastSeen:xa("last_seen",{withTimezone:!0}).notNull().defaultNow()},e=>[g_({columns:[e.projectId,e.path]}),Hp("project_checkouts_path_unique").on(e.path)])});import{pgTable as YE,text as Bs,timestamp as Fp,jsonb as h_,uuid as Cd,integer as XE,boolean as QE,index as Wp}from"drizzle-orm/pg-core";var X,Od=J(()=>{"use strict";Ft();Xo();Pr();X=YE("agent_runs",{id:Cd("id").primaryKey().defaultRandom(),userId:Cd("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),orgId:Cd("org_id").references(()=>G.id,{onDelete:"set null"}),projectId:Cd("project_id").references(()=>U.id,{onDelete:"set null"}),projectPath:Bs("project_path"),gitRemote:Bs("git_remote"),baseBranch:Bs("base_branch"),title:Bs("title"),prompt:Bs("prompt"),toolSpec:h_("tool_spec").notNull().default([]),autoWorktree:QE("auto_worktree").notNull().default(!0),status:Bs("status").notNull().default("pending"),sessionCount:XE("session_count").notNull().default(0),metadata:h_("metadata").notNull().default({}),createdAt:Fp("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:Fp("updated_at",{withTimezone:!0}).notNull().defaultNow(),completedAt:Fp("completed_at",{withTimezone:!0})},e=>[Wp("idx_agent_runs_user").on(e.userId),Wp("idx_agent_runs_org_created").on(e.orgId,e.createdAt),Wp("idx_agent_runs_project").on(e.projectId)])});import{pgTable as zp,text as hn,timestamp as Ta,jsonb as es,uuid as Cr,integer as Dd,uniqueIndex as __,index as ir}from"drizzle-orm/pg-core";var _,qe,se,Fs=J(()=>{"use strict";Fn();Pr();Ft();Xo();Od();_=zp("sessions",{id:Cr("id").primaryKey().defaultRandom(),userId:Cr("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),externalSessionId:hn("external_session_id"),projectId:Cr("project_id").references(()=>U.id,{onDelete:"set null"}),orgId:Cr("org_id").references(()=>G.id,{onDelete:"set null"}),tool:hn("tool").notNull(),projectPath:hn("project_path"),gitBranch:hn("git_branch"),startedAt:Ta("started_at",{withTimezone:!0}).notNull(),endedAt:Ta("ended_at",{withTimezone:!0}),eventCount:Dd("event_count").default(0),tokenUsage:es("token_usage"),analysis:es("analysis"),analyzedAt:Ta("analyzed_at",{withTimezone:!0}),analyzedEventCount:Dd("analyzed_event_count"),analyzedTurnCount:Dd("analyzed_turn_count"),metadata:es("metadata").default({}),origin:hn("origin").notNull().default("unknown"),runId:Cr("run_id").references(()=>X.id,{onDelete:"set null"}),model:hn("model"),harnessVersion:hn("harness_version"),createdAt:Ta("created_at",{withTimezone:!0}).defaultNow()},e=>[ir("idx_sessions_user").on(e.userId),ir("idx_sessions_tool").on(e.tool),ir("idx_sessions_started_at").on(e.startedAt),ir("idx_sessions_project").on(e.projectId),ir("idx_sessions_org_started_at").on(e.orgId,e.startedAt),ir("idx_sessions_run").on(e.runId),__("idx_sessions_user_external").on(e.userId,e.externalSessionId)]),qe=zp("session_events",{id:Cr("id").primaryKey().defaultRandom(),sessionId:Cr("session_id").notNull().references(()=>_.id,{onDelete:"cascade"}),sequence:Dd("sequence").notNull(),eventType:hn("event_type").notNull(),content:hn("content"),toolName:hn("tool_name"),toolInput:es("tool_input"),toolOutput:es("tool_output"),tokenUsage:es("token_usage"),model:hn("model"),timestamp:Ta("timestamp",{withTimezone:!0}).notNull(),metadata:es("metadata").default({})},e=>[__("session_events_session_sequence_idx").on(e.sessionId,e.sequence),ir("idx_session_events_session_id").on(e.sessionId),ir("idx_session_events_event_type").on(e.eventType),ir("idx_session_events_model").on(e.model)]),se=zp("session_instructions",{sessionId:Cr("session_id").notNull().references(()=>_.id,{onDelete:"cascade"}),instructionId:Cr("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),linkMethod:hn("link_method").notNull(),contentHash:hn("content_hash")},e=>[ir("idx_session_instructions_instruction_id").on(e.instructionId)])});import{pgTable as y_,text as Md,timestamp as w_,uuid as ar,integer as v_,index as Ws,unique as ZE}from"drizzle-orm/pg-core";var jt,Z,I_=J(()=>{"use strict";Ft();Pr();Fs();jt=y_("treatment_assignments",{id:ar("id").primaryKey().defaultRandom(),userId:ar("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),treatmentType:Md("treatment_type").notNull(),treatmentId:ar("treatment_id").notNull(),treatmentVersion:v_("treatment_version").notNull().default(1),projectId:ar("project_id").references(()=>U.id,{onDelete:"set null"}),assignedBy:ar("assigned_by").references(()=>T.id,{onDelete:"set null"}),method:Md("method").notNull(),assignedAt:w_("assigned_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Ws("idx_treatment_assignments_user").on(e.userId),Ws("idx_treatment_assignments_treatment").on(e.treatmentType,e.treatmentId),Ws("idx_treatment_assignments_project").on(e.projectId)]),Z=y_("treatment_exposures",{id:ar("id").primaryKey().defaultRandom(),sessionId:ar("session_id").notNull().references(()=>_.id,{onDelete:"cascade"}),userId:ar("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),treatmentType:Md("treatment_type").notNull(),treatmentId:ar("treatment_id").notNull(),treatmentVersion:v_("treatment_version").notNull().default(1),assignmentId:ar("assignment_id").references(()=>jt.id,{onDelete:"set null"}),method:Md("method").notNull(),exposedAt:w_("exposed_at",{withTimezone:!0}).notNull().defaultNow()},e=>[ZE("treatment_exposures_unique").on(e.sessionId,e.treatmentType,e.treatmentId,e.treatmentVersion),Ws("idx_treatment_exposures_treatment").on(e.treatmentType,e.treatmentId),Ws("idx_treatment_exposures_user").on(e.userId),Ws("idx_treatment_exposures_session").on(e.sessionId)])});import{pgTable as ex,text as Vp,timestamp as tx,uuid as Ld,integer as nx,index as b_,uniqueIndex as rx}from"drizzle-orm/pg-core";var $d,S_=J(()=>{"use strict";Ft();Pr();$d=ex("pending_treatment_exposures",{id:Ld("id").primaryKey().defaultRandom(),userId:Ld("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),externalSessionId:Vp("external_session_id").notNull(),treatmentType:Vp("treatment_type").notNull(),treatmentId:Ld("treatment_id").notNull(),treatmentVersion:nx("treatment_version").notNull().default(1),method:Vp("method").notNull().default("injected"),projectId:Ld("project_id").references(()=>U.id,{onDelete:"set null"}),createdAt:tx("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[rx("pending_treatment_exposures_unique").on(e.externalSessionId,e.treatmentType,e.treatmentId,e.treatmentVersion),b_("idx_pending_treatment_exposures_ext").on(e.externalSessionId),b_("idx_pending_treatment_exposures_user").on(e.userId)])});import{pgTable as A_,text as ro,timestamp as E_,uuid as zs,numeric as ox,index as Jp,unique as sx}from"drizzle-orm/pg-core";var q,Or,Gp=J(()=>{"use strict";Ft();Fn();q=A_("instruction_experiments",{id:zs("id").primaryKey().defaultRandom(),userId:zs("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),instructionId:zs("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),projectPath:ro("project_path").notNull(),status:ro("status").notNull().default("running"),treatedShare:ox("treated_share").notNull().default("0.5"),salt:ro("salt").notNull(),contentHash:ro("content_hash"),source:ro("source").notNull().default("manual"),stoppedReason:ro("stopped_reason"),createdAt:E_("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Jp("idx_instruction_experiments_lookup").on(e.userId,e.projectPath)]),Or=A_("instruction_experiment_arms",{id:zs("id").primaryKey().defaultRandom(),experimentId:zs("experiment_id").notNull().references(()=>q.id,{onDelete:"cascade"}),userId:zs("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),externalSessionId:ro("external_session_id").notNull(),arm:ro("arm").notNull(),assignedAt:E_("assigned_at",{withTimezone:!0}).notNull().defaultNow()},e=>[sx("instruction_experiment_arms_unique").on(e.experimentId,e.externalSessionId),Jp("idx_instruction_experiment_arms_experiment").on(e.experimentId,e.arm),Jp("idx_instruction_experiment_arms_session").on(e.externalSessionId)])});import{pgTable as ix,text as Kp,timestamp as ax,uuid as qd,numeric as Yp,integer as x_,jsonb as cx,index as dx,unique as ux}from"drizzle-orm/pg-core";var Y,T_=J(()=>{"use strict";Ft();Fn();Gp();Y=ix("instruction_verdicts",{id:qd("id").primaryKey().defaultRandom(),userId:qd("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),instructionId:qd("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),contentHash:Kp("content_hash").notNull(),projectPath:Kp("project_path").notNull(),segment:cx("segment").notNull().default({}),decision:Kp("decision").notNull(),delta:Yp("delta").notNull(),ciLower:Yp("ci_lower").notNull(),ciUpper:Yp("ci_upper").notNull(),nTreated:x_("n_treated").notNull(),nControl:x_("n_control").notNull(),experimentId:qd("experiment_id").references(()=>q.id,{onDelete:"set null"}),decidedAt:ax("decided_at",{withTimezone:!0}).notNull().defaultNow()},e=>[ux("instruction_verdicts_unique").on(e.instructionId,e.contentHash,e.projectPath),dx("idx_instruction_verdicts_render").on(e.userId,e.projectPath)])});import{pgTable as lx,text as Ud,timestamp as Xp,uuid as Qp,integer as px,unique as mx,index as fx}from"drizzle-orm/pg-core";var Ee,R_=J(()=>{"use strict";Ft();Ee=lx("insight_recommendation_log",{id:Qp("id").primaryKey().defaultRandom(),userId:Qp("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),projectPath:Ud("project_path").notNull().default(""),category:Ud("category").notNull(),contentHash:Ud("content_hash").notNull(),label:Ud("label").notNull().default(""),firstSeenAt:Xp("first_seen_at",{withTimezone:!0}).notNull().defaultNow(),lastSeenAt:Xp("last_seen_at",{withTimezone:!0}).notNull().defaultNow(),timesGenerated:px("times_generated").notNull().default(1),lastJobId:Qp("last_job_id"),dismissedAt:Xp("dismissed_at",{withTimezone:!0})},e=>[mx("insight_recommendation_log_unique").on(e.userId,e.projectPath,e.contentHash),fx("idx_insight_recommendation_log_read").on(e.userId,e.projectPath)])});import{pgTable as gx,text as Vs,timestamp as Zp,uuid as Ra,integer as k_,index as Hd}from"drizzle-orm/pg-core";var F,em=J(()=>{"use strict";Ft();Pr();F=gx("memories",{id:Ra("id").primaryKey().defaultRandom(),userId:Ra("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),orgId:Ra("org_id"),projectId:Ra("project_id").references(()=>U.id,{onDelete:"set null"}),version:k_("version").notNull().default(1),parentId:Ra("parent_id").references(()=>F.id,{onDelete:"set null"}),kind:Vs("kind").notNull(),title:Vs("title").notNull(),body:Vs("body").notNull(),source:Vs("source").notNull(),status:Vs("status").notNull().default("active"),trustClass:Vs("trust_class"),trustVersion:k_("trust_version"),trustComputedAt:Zp("trust_computed_at",{withTimezone:!0}),createdAt:Zp("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:Zp("updated_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Hd("idx_memories_user").on(e.userId),Hd("idx_memories_project").on(e.projectId),Hd("idx_memories_parent").on(e.parentId),Hd("idx_memories_user_status").on(e.userId,e.status)])});import{pgTable as hx,text as ka,timestamp as tm,uuid as nm,integer as j_,jsonb as _x,index as N_}from"drizzle-orm/pg-core";var Nt,P_=J(()=>{"use strict";Ft();em();Nt=hx("memory_experiments",{id:nm("id").primaryKey().defaultRandom(),memoryId:nm("memory_id").notNull().references(()=>F.id,{onDelete:"cascade"}),userId:nm("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),memoryVersion:j_("memory_version").notNull().default(1),taskPrompt:ka("task_prompt").notNull(),expectations:ka("expectations").array().notNull().default([]),trials:j_("trials").notNull().default(10),model:ka("model"),status:ka("status").notNull().default("pending"),result:_x("result").$type(),error:ka("error"),createdAt:tm("created_at",{withTimezone:!0}).notNull().defaultNow(),startedAt:tm("started_at",{withTimezone:!0}),completedAt:tm("completed_at",{withTimezone:!0})},e=>[N_("idx_memory_experiments_memory").on(e.memoryId),N_("idx_memory_experiments_user").on(e.userId)])});import{pgTable as yx,text as Js,timestamp as rm,uuid as om,jsonb as wx,uniqueIndex as vx,index as C_}from"drizzle-orm/pg-core";var Ve,sm=J(()=>{"use strict";Ft();Fs();Ve=yx("session_terminal_targets",{id:om("id").primaryKey().defaultRandom(),userId:om("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),sessionId:om("session_id").references(()=>_.id,{onDelete:"set null"}),externalSessionId:Js("external_session_id"),kind:Js("kind").notNull(),target:Js("target").notNull(),status:Js("status").notNull().default("active"),attachCommand:Js("attach_command").notNull(),projectPath:Js("project_path"),metadata:wx("metadata").notNull().default({}),lastSeenAt:rm("last_seen_at",{withTimezone:!0}).defaultNow(),createdAt:rm("created_at",{withTimezone:!0}).defaultNow(),updatedAt:rm("updated_at",{withTimezone:!0}).defaultNow()},e=>[vx("idx_session_terminal_targets_user_target").on(e.userId,e.target),C_("idx_session_terminal_targets_session").on(e.sessionId),C_("idx_session_terminal_targets_user_status").on(e.userId,e.status)])});import{boolean as Ix,index as Bd,jsonb as O_,pgTable as bx,text as ts,timestamp as ja,uuid as Fd,integer as D_}from"drizzle-orm/pg-core";var Wd,M_=J(()=>{"use strict";Fs();sm();Wd=bx("session_send_jobs",{id:Fd("id").primaryKey().defaultRandom(),userId:Fd("user_id").notNull(),sessionId:Fd("session_id").notNull().references(()=>_.id,{onDelete:"cascade"}),terminalTargetId:Fd("terminal_target_id").references(()=>Ve.id,{onDelete:"set null"}),target:ts("target").notNull(),message:ts("message").notNull(),submit:Ix("submit").notNull().default(!0),delivery:ts("delivery").notNull().default("live"),status:ts("status").notNull().default("pending"),result:O_("result"),error:ts("error"),attempts:D_("attempts").notNull().default(0),taskKind:ts("task_kind"),payload:O_("payload"),claimedBy:ts("claimed_by"),claimedAt:ja("claimed_at",{withTimezone:!0}),leaseExpiresAt:ja("lease_expires_at",{withTimezone:!0}),leaseRecoveries:D_("lease_recoveries").notNull().default(0),createdAt:ja("created_at",{withTimezone:!0}).defaultNow(),updatedAt:ja("updated_at",{withTimezone:!0}).defaultNow(),completedAt:ja("completed_at",{withTimezone:!0})},e=>[Bd("idx_session_send_jobs_user").on(e.userId),Bd("idx_session_send_jobs_session").on(e.sessionId),Bd("idx_session_send_jobs_status").on(e.status),Bd("idx_session_send_jobs_pending").on(e.userId,e.status)])});import{pgTable as $_,text as ns,timestamp as zd,jsonb as q_,uuid as oo,integer as Sx,boolean as Ax,uniqueIndex as Ex,index as L_,primaryKey as xx}from"drizzle-orm/pg-core";var Le,Oe,U_=J(()=>{"use strict";Fn();Le=$_("packs",{id:oo("id").primaryKey().defaultRandom(),name:ns("name").notNull(),description:ns("description").notNull(),scope:ns("scope").notNull(),scopeRef:oo("scope_ref"),version:ns("version").notNull().default("1.0.0"),tags:ns("tags").array(),badge:ns("badge"),metadata:q_("metadata"),createdBy:oo("created_by"),createdAt:zd("created_at",{withTimezone:!0}).defaultNow(),updatedAt:zd("updated_at",{withTimezone:!0}).defaultNow(),archived:Ax("archived").default(!1),archivedAt:zd("archived_at",{withTimezone:!0}),archivedBy:oo("archived_by"),forkedFromId:oo("forked_from_id").references(()=>Le.id,{onDelete:"set null"}),upstreamVersion:ns("upstream_version")},e=>[Ex("packs_name_scope_ref_idx").on(e.name,e.scope,e.scopeRef),L_("idx_packs_scope").on(e.scope,e.scopeRef),L_("idx_packs_created_by").on(e.createdBy)]),Oe=$_("pack_instructions",{packId:oo("pack_id").references(()=>Le.id,{onDelete:"cascade"}).notNull(),instructionId:oo("instruction_id").references(()=>g.id,{onDelete:"cascade"}).notNull(),position:Sx("position").notNull().default(0),slotOverrides:q_("slot_overrides"),addedAt:zd("added_at",{withTimezone:!0}).defaultNow(),addedBy:oo("added_by")},e=>[xx({columns:[e.packId,e.instructionId]})])});import{pgTable as Tx,text as im,timestamp as Rx,jsonb as kx,uuid as am,index as Gs}from"drizzle-orm/pg-core";var so,H_=J(()=>{"use strict";Fn();so=Tx("instruction_usage_events",{id:am("id").primaryKey().defaultRandom(),instructionId:am("instruction_id").references(()=>g.id,{onDelete:"set null"}),userId:am("user_id").notNull(),surface:im("surface").notNull(),action:im("action").notNull(),metadata:kx("metadata"),traceId:im("trace_id"),createdAt:Rx("created_at",{withTimezone:!0}).defaultNow()},e=>[Gs("idx_usage_events_instruction").on(e.instructionId),Gs("idx_usage_events_user").on(e.userId),Gs("idx_usage_events_surface").on(e.surface),Gs("idx_usage_events_action").on(e.action),Gs("idx_usage_events_created_at").on(e.createdAt),Gs("idx_usage_events_user_created").on(e.userId,e.createdAt)])});import{pgTable as jx,text as Vd,timestamp as B_,jsonb as Nx,uuid as F_,index as cm}from"drizzle-orm/pg-core";var fe,W_=J(()=>{"use strict";fe=jx("worker_connections",{id:F_("id").primaryKey().defaultRandom(),userId:F_("user_id").notNull(),workerType:Vd("worker_type").notNull().default("mcp"),clientName:Vd("client_name").notNull(),clientVersion:Vd("client_version"),workerVersion:Vd("worker_version"),lastHeartbeat:B_("last_heartbeat",{withTimezone:!0}).notNull().defaultNow(),connectedAt:B_("connected_at",{withTimezone:!0}).notNull().defaultNow(),metadata:Nx("metadata")},e=>[cm("idx_worker_connections_user").on(e.userId),cm("idx_worker_connections_heartbeat").on(e.userId,e.lastHeartbeat),cm("idx_worker_connections_type").on(e.userId,e.workerType)])});import{pgTable as Px,text as Jd,timestamp as Cx,jsonb as Ox,uuid as z_,index as V_}from"drizzle-orm/pg-core";var Gd,J_=J(()=>{"use strict";Gd=Px("cli_setup_events",{id:z_("id").primaryKey().defaultRandom(),userId:z_("user_id").notNull(),deviceId:Jd("device_id").notNull(),event:Jd("event").notNull(),cliVersion:Jd("cli_version"),os:Jd("os"),props:Ox("props").notNull().default({}),createdAt:Cx("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[V_("idx_cli_setup_events_user").on(e.userId,e.createdAt),V_("idx_cli_setup_events_device").on(e.deviceId,e.createdAt)])});import{pgTable as Dx,text as rs,integer as Mx,boolean as Lx,timestamp as $x,jsonb as qx,uuid as Ux,index as G_}from"drizzle-orm/pg-core";var Kd,K_=J(()=>{"use strict";Kd=Dx("cli_error_events",{id:Ux("id").primaryKey().defaultRandom(),deviceId:rs("device_id"),event:rs("event").notNull(),command:rs("command"),statusCode:Mx("status_code"),message:rs("message"),cliVersion:rs("cli_version"),os:rs("os"),nodeVersion:rs("node_version"),proxied:Lx("proxied"),props:qx("props").notNull().default({}),createdAt:$x("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[G_("idx_cli_error_events_created").on(e.createdAt),G_("idx_cli_error_events_device").on(e.deviceId,e.createdAt)])});import{sql as Hx}from"drizzle-orm";import{pgTable as os,text as wt,timestamp as cn,jsonb as Tn,uuid as pt,integer as Dr,boolean as Na,index as Gt,unique as Y_}from"drizzle-orm/pg-core";var k,Se,be,Xe,Je,pe,Wn,Pa=J(()=>{"use strict";k=os("eval_targets",{id:pt("id").primaryKey().defaultRandom(),userId:pt("user_id").notNull(),name:wt("name").notNull(),type:wt("type").notNull(),content:wt("content").notNull(),description:wt("description").notNull().default(""),metadata:Tn("metadata").notNull().default({}),version:Dr("version").notNull().default(1),parentId:pt("parent_id").references(()=>k.id,{onDelete:"set null"}),createdAt:cn("created_at",{withTimezone:!0}).defaultNow(),updatedAt:cn("updated_at",{withTimezone:!0}).defaultNow()},e=>[Gt("eval_targets_name_user_idx").on(e.name,e.userId),Gt("idx_eval_targets_user").on(e.userId),Gt("idx_eval_targets_type").on(e.type),Gt("idx_eval_targets_parent").on(e.parentId)]),Se=os("evals",{id:pt("id").primaryKey().defaultRandom(),evalTargetId:pt("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),name:wt("name").notNull(),prompt:wt("prompt").notNull(),expectedOutput:wt("expected_output").notNull().default(""),files:Tn("files").notNull().default([]),expectations:Tn("expectations").notNull().default([]),retiredAt:cn("retired_at",{withTimezone:!0}),retiredReason:wt("retired_reason"),createdAt:cn("created_at",{withTimezone:!0}).defaultNow(),updatedAt:cn("updated_at",{withTimezone:!0}).defaultNow(),contentUpdatedAt:cn("content_updated_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Gt("idx_evals_target").on(e.evalTargetId),Gt("idx_evals_target_active").on(e.evalTargetId).where(Hx`${e.retiredAt} IS NULL`)]),be=os("eval_runs",{id:pt("id").primaryKey().defaultRandom(),jobId:pt("job_id"),evalId:pt("eval_id").notNull().references(()=>Se.id,{onDelete:"cascade"}),evalTargetId:pt("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),evalTargetVersion:Dr("eval_target_version").notNull(),configuration:wt("configuration").notNull(),runNumber:Dr("run_number").notNull().default(1),iteration:Dr("iteration").notNull().default(1),status:wt("status").notNull().default("completed"),outputs:Tn("outputs").notNull().default({}),timing:Tn("timing").notNull().default({}),grading:Tn("grading").notNull().default({}),comparison:Tn("comparison"),createdAt:cn("created_at",{withTimezone:!0}).defaultNow()},e=>[Gt("idx_eval_runs_eval").on(e.evalId),Gt("idx_eval_runs_target").on(e.evalTargetId),Gt("idx_eval_runs_iteration").on(e.evalTargetId,e.iteration)]),Xe=os("eval_comparisons",{id:pt("id").primaryKey().defaultRandom(),userId:pt("user_id").notNull(),targetAId:pt("target_a_id").notNull().references(()=>k.id,{onDelete:"cascade"}),targetBId:pt("target_b_id").notNull().references(()=>k.id,{onDelete:"cascade"}),targetAVersion:Dr("target_a_version").notNull(),targetBVersion:Dr("target_b_version").notNull(),isSwapped:Na("is_swapped").notNull().default(!1),winnerTargetId:pt("winner_target_id").references(()=>k.id,{onDelete:"set null"}),perEval:Tn("per_eval").notNull().default([]),overall:Tn("overall").notNull().default({}),rawOutput:wt("raw_output"),model:wt("model"),status:wt("status").notNull().default("completed"),createdAt:cn("created_at",{withTimezone:!0}).defaultNow()},e=>[Gt("idx_eval_comparisons_target_a").on(e.targetAId),Gt("idx_eval_comparisons_target_b").on(e.targetBId),Gt("idx_eval_comparisons_user").on(e.userId)]),Je=os("eval_grade_annotations",{id:pt("id").primaryKey().defaultRandom(),userId:pt("user_id").notNull(),evalRunId:pt("eval_run_id").notNull().references(()=>be.id,{onDelete:"cascade"}),evalTargetId:pt("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),expectationIndex:Dr("expectation_index").notNull(),expectationText:wt("expectation_text").notNull(),judgePassed:Na("judge_passed").notNull(),judgeMethod:wt("judge_method").notNull(),judgeModel:wt("judge_model"),verdict:wt("verdict").notNull(),flag:wt("flag"),note:wt("note"),createdAt:cn("created_at",{withTimezone:!0}).defaultNow(),updatedAt:cn("updated_at",{withTimezone:!0}).defaultNow()},e=>[Gt("idx_eval_grade_annotations_target").on(e.evalTargetId),Gt("idx_eval_grade_annotations_run").on(e.evalRunId),Y_("eval_grade_annotations_eval_run_id_expectation_index_key").on(e.evalRunId,e.expectationIndex)]),pe=os("judge_reviewer_verdicts",{id:pt("id").primaryKey().defaultRandom(),userId:pt("user_id").notNull(),evalTargetId:pt("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),evalRunId:pt("eval_run_id").notNull().references(()=>be.id,{onDelete:"cascade"}),expectationIndex:Dr("expectation_index").notNull(),expectationText:wt("expectation_text").notNull(),judgePassed:Na("judge_passed").notNull(),humanPassed:Na("human_passed").notNull(),reviewerEngine:wt("reviewer_engine").notNull(),reviewerModel:wt("reviewer_model").notNull(),reviewerPassed:Na("reviewer_passed").notNull(),resolvedAt:cn("resolved_at",{withTimezone:!0}),resolution:wt("resolution"),createdAt:cn("created_at",{withTimezone:!0}).defaultNow(),updatedAt:cn("updated_at",{withTimezone:!0}).defaultNow()},e=>[Gt("idx_jrv_target").on(e.evalTargetId),Y_("judge_reviewer_verdicts_eval_run_id_expectation_index_review_key").on(e.evalRunId,e.expectationIndex,e.reviewerModel)]),Wn=os("benchmarks",{id:pt("id").primaryKey().defaultRandom(),evalTargetId:pt("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),iteration:Dr("iteration").notNull().default(1),runSummary:Tn("run_summary").notNull().default({}),notes:Tn("notes").notNull().default([]),feedback:Tn("feedback"),createdAt:cn("created_at",{withTimezone:!0}).defaultNow()},e=>[Gt("idx_benchmarks_target").on(e.evalTargetId)])});import{sql as dm}from"drizzle-orm";import{pgTable as Bx,text as Mr,timestamp as Fx,jsonb as Yd,uuid as Xd,boolean as Wx,index as Ca,uniqueIndex as zx}from"drizzle-orm/pg-core";var ie,X_=J(()=>{"use strict";Pa();Fn();ie=Bx("instruction_promotions",{id:Xd("id").primaryKey().defaultRandom(),userId:Xd("user_id").notNull(),evalTargetId:Xd("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),instructionId:Xd("instruction_id").references(()=>g.id,{onDelete:"set null"}),fromContentHash:Mr("from_content_hash").notNull(),toContentHash:Mr("to_content_hash").notNull(),fromContent:Mr("from_content").notNull(),toContent:Mr("to_content").notNull(),proposalSource:Mr("proposal_source").notNull(),proposalRationale:Mr("proposal_rationale").notNull().default(""),decision:Mr("decision").notNull(),applied:Wx("applied").notNull().default(!1),refusals:Yd("refusals").notNull().default([]),rationale:Mr("rationale").notNull().default(""),effectClass:Mr("effect_class").notNull(),verdict:Yd("verdict").notNull().default({}),gates:Yd("gates").notNull().default({}),touchedSections:Yd("touched_sections").notNull().default([]),createdAt:Fx("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Ca("idx_instruction_promotions_budget").on(e.evalTargetId,e.createdAt.desc()).where(dm`${e.applied}`),Ca("idx_instruction_promotions_target").on(e.evalTargetId,e.createdAt.desc()),Ca("idx_instruction_promotions_user").on(e.userId,e.createdAt.desc()),Ca("idx_instruction_promotions_to_hash").on(e.toContentHash),zx("uq_instruction_promotions_applied").on(e.evalTargetId,e.fromContentHash,e.toContentHash).where(dm`${e.applied}`),Ca("idx_instruction_promotions_applied_hash").on(e.toContentHash,e.createdAt.desc()).where(dm`${e.applied}`)])});import{pgTable as Vx,text as io,timestamp as Jx,jsonb as Oa,uuid as um,integer as lm,real as Gx,index as Da,uniqueIndex as Q_}from"drizzle-orm/pg-core";var L,Z_=J(()=>{"use strict";Fs();Ft();L=Vx("context_snapshots",{id:um("id").primaryKey().defaultRandom(),sessionId:um("session_id").references(()=>_.id,{onDelete:"cascade"}),userId:um("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),sequence:lm("sequence").notNull().default(0),provider:io("provider").notNull(),model:io("model").notNull(),systemPrompt:io("system_prompt").notNull(),injectedInstructions:Oa("injected_instructions").notNull().default([]),messagesSummary:Oa("messages_summary").notNull(),tools:Oa("tools").notNull().default([]),systemHash:io("system_hash").notNull(),requestHash:io("request_hash").notNull().default(""),toolsHash:io("tools_hash"),injectedHash:io("injected_hash"),messagesDelta:Oa("messages_delta").default([]),messagesDeltaRef:io("messages_delta_ref"),maxTokens:lm("max_tokens"),temperature:Gx("temperature"),estimatedTokens:lm("estimated_tokens"),capturedAt:Jx("captured_at",{withTimezone:!0}).notNull().defaultNow(),metadata:Oa("metadata").default({})},e=>[Da("idx_context_snapshots_session").on(e.sessionId),Da("idx_context_snapshots_user").on(e.userId),Da("idx_context_snapshots_hash").on(e.systemHash),Da("idx_context_snapshots_request_hash").on(e.requestHash),Q_("idx_snapshots_session_request").on(e.sessionId,e.requestHash),Q_("idx_snapshots_session_sequence").on(e.sessionId,e.sequence),Da("idx_context_snapshots_user_session_captured").on(e.userId,e.sessionId,e.capturedAt.desc())])});import{pgTable as Kx,text as ey,timestamp as Yx,jsonb as Xx,integer as Qx,index as Zx}from"drizzle-orm/pg-core";var _n,ty=J(()=>{"use strict";_n=Kx("content_blobs",{hash:ey("hash").primaryKey(),contentType:ey("content_type").notNull(),content:Xx("content").notNull(),sizeBytes:Qx("size_bytes").notNull().default(0),createdAt:Yx("created_at",{withTimezone:!0}).defaultNow()},e=>[Zx("idx_content_blobs_type").on(e.contentType)])});import{pgTable as eT,text as Qd,timestamp as Ma,jsonb as Zd,uuid as pm,index as eu,integer as ny}from"drizzle-orm/pg-core";var ke,ry=J(()=>{"use strict";Pa();ke=eT("eval_jobs",{id:pm("id").primaryKey().defaultRandom(),userId:pm("user_id").notNull(),evalTargetId:pm("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),status:Qd("status").notNull().default("pending"),config:Zd("config").notNull().default({}),progress:Zd("progress").notNull().default({}),result:Zd("result"),error:Qd("error"),attempts:ny("attempts").notNull().default(0),taskKind:Qd("task_kind"),payload:Zd("payload"),claimedBy:Qd("claimed_by"),claimedAt:Ma("claimed_at",{withTimezone:!0}),leaseExpiresAt:Ma("lease_expires_at",{withTimezone:!0}),leaseRecoveries:ny("lease_recoveries").notNull().default(0),createdAt:Ma("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Ma("updated_at",{withTimezone:!0}).defaultNow(),completedAt:Ma("completed_at",{withTimezone:!0})},e=>[eu("idx_eval_jobs_user").on(e.userId),eu("idx_eval_jobs_target").on(e.evalTargetId),eu("idx_eval_jobs_status").on(e.status),eu("idx_eval_jobs_pending").on(e.userId,e.status)])});import{pgTable as tT,text as La,timestamp as $a,jsonb as oy,uuid as sy,integer as iy,index as ay}from"drizzle-orm/pg-core";var je,cy=J(()=>{"use strict";je=tT("agent_jobs",{id:sy("id").primaryKey().defaultRandom(),userId:sy("user_id").notNull(),taskKind:La("task_kind").notNull(),status:La("status").notNull().default("pending"),payload:oy("payload").notNull(),dedupeKey:La("dedupe_key"),result:oy("result"),error:La("error"),attempts:iy("attempts").notNull().default(0),claimedBy:La("claimed_by"),claimedAt:$a("claimed_at",{withTimezone:!0}),leaseExpiresAt:$a("lease_expires_at",{withTimezone:!0}),leaseRecoveries:iy("lease_recoveries").notNull().default(0),createdAt:$a("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:$a("updated_at",{withTimezone:!0}).notNull().defaultNow(),completedAt:$a("completed_at",{withTimezone:!0})},e=>[ay("idx_agent_jobs_claim").on(e.userId,e.status,e.taskKind,e.createdAt),ay("idx_agent_jobs_dedupe").on(e.userId,e.taskKind,e.dedupeKey)])});import{pgTable as nT,text as qa,timestamp as Ua,jsonb as tu,uuid as mm,index as nu,integer as dy}from"drizzle-orm/pg-core";var W,uy=J(()=>{"use strict";Pr();W=nT("insights_jobs",{id:mm("id").primaryKey().defaultRandom(),userId:mm("user_id").notNull(),status:qa("status").notNull().default("pending"),projectPath:qa("project_path"),projectId:mm("project_id").references(()=>U.id,{onDelete:"set null"}),config:tu("config").notNull().default({}),progress:tu("progress").notNull().default({}),result:tu("result"),error:qa("error"),attempts:dy("attempts").notNull().default(0),taskKind:qa("task_kind"),payload:tu("payload"),claimedBy:qa("claimed_by"),claimedAt:Ua("claimed_at",{withTimezone:!0}),leaseExpiresAt:Ua("lease_expires_at",{withTimezone:!0}),leaseRecoveries:dy("lease_recoveries").notNull().default(0),createdAt:Ua("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Ua("updated_at",{withTimezone:!0}).defaultNow(),completedAt:Ua("completed_at",{withTimezone:!0})},e=>[nu("idx_insights_jobs_user").on(e.userId),nu("idx_insights_jobs_status").on(e.status),nu("idx_insights_jobs_pending").on(e.userId,e.status),nu("idx_insights_jobs_project").on(e.projectId)])});import{pgTable as rT,text as fm,timestamp as ru,uuid as ly,index as oT,uniqueIndex as sT}from"drizzle-orm/pg-core";var Ae,py=J(()=>{"use strict";Ft();Ae=rT("api_keys",{id:ly("id").primaryKey().defaultRandom(),userId:ly("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),name:fm("name").notNull(),keyHash:fm("key_hash").notNull(),keyPrefix:fm("key_prefix").notNull(),lastUsedAt:ru("last_used_at",{withTimezone:!0}),expiresAt:ru("expires_at",{withTimezone:!0}),revokedAt:ru("revoked_at",{withTimezone:!0}),createdAt:ru("created_at",{withTimezone:!0}).defaultNow()},e=>[oT("idx_api_keys_user").on(e.userId),sT("idx_api_keys_hash").on(e.keyHash)])});import{pgTable as iT,text as gm,timestamp as my,uuid as aT,index as cT}from"drizzle-orm/pg-core";var Rn,fy=J(()=>{"use strict";Ft();Rn=iT("extension_auth_codes",{code:gm("code").primaryKey(),userId:aT("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),editor:gm("editor"),email:gm("email"),expiresAt:my("expires_at",{withTimezone:!0}).notNull(),createdAt:my("created_at",{withTimezone:!0}).defaultNow()},e=>[cT("idx_ext_auth_codes_expiry").on(e.expiresAt)])});import{pgTable as dT,text as uT,timestamp as gy,jsonb as lT,uuid as hm,index as hy}from"drizzle-orm/pg-core";var $e,_y=J(()=>{"use strict";Pa();$e=dT("eval_conversations",{id:hm("id").primaryKey().defaultRandom(),evalTargetId:hm("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),userId:hm("user_id").notNull(),messages:lT("messages").notNull().default([]),status:uT("status").notNull().default("active"),createdAt:gy("created_at",{withTimezone:!0}).defaultNow(),updatedAt:gy("updated_at",{withTimezone:!0}).defaultNow()},e=>[hy("idx_eval_conversations_target").on(e.evalTargetId),hy("idx_eval_conversations_user").on(e.userId)])});import{pgTable as pT,text as Lr,timestamp as yy,jsonb as mT,uuid as _m}from"drizzle-orm/pg-core";var ao,wy=J(()=>{"use strict";ao=pT("skill_submissions",{id:_m("id").primaryKey().defaultRandom(),skillId:Lr("skill_id").notNull(),name:Lr("name").notNull(),description:Lr("description").notNull(),category:Lr("category").notNull(),tools:Lr("tools").array().notNull(),tags:Lr("tags").array().default([]),content:Lr("content").notNull(),status:Lr("status").notNull().default("pending"),submittedBy:_m("submitted_by").notNull(),reviewedBy:_m("reviewed_by"),reviewNote:Lr("review_note"),metadata:mT("metadata"),createdAt:yy("created_at",{withTimezone:!0}).defaultNow(),updatedAt:yy("updated_at",{withTimezone:!0}).defaultNow()})});import{pgTable as fT,text as Ha,timestamp as vy,jsonb as gT,uuid as hT,uniqueIndex as _T,index as Iy}from"drizzle-orm/pg-core";var Pt,by=J(()=>{"use strict";Pt=fT("harness_releases",{id:hT("id").primaryKey().defaultRandom(),harness:Ha("harness").notNull(),version:Ha("version").notNull(),publishedAt:vy("published_at",{withTimezone:!0}).notNull(),title:Ha("title"),body:Ha("body"),categories:gT("categories").default({}),url:Ha("url"),createdAt:vy("created_at",{withTimezone:!0}).defaultNow()},e=>[_T("idx_harness_releases_unique").on(e.harness,e.version),Iy("idx_harness_releases_harness").on(e.harness),Iy("idx_harness_releases_published").on(e.publishedAt)])});import{pgTable as yT,text as Ks,timestamp as Sy,jsonb as wT,uuid as Ay,index as Ey,uniqueIndex as vT}from"drizzle-orm/pg-core";var bt,xy=J(()=>{"use strict";bt=yT("notifications",{id:Ay("id").primaryKey().defaultRandom(),userId:Ay("user_id").notNull(),type:Ks("type").notNull(),title:Ks("title").notNull(),body:Ks("body"),url:Ks("url"),sourceTable:Ks("source_table"),sourceId:Ks("source_id"),metadata:wT("metadata").notNull().default({}),readAt:Sy("read_at",{withTimezone:!0}),createdAt:Sy("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Ey("idx_notifications_user_created").on(e.userId,e.createdAt),Ey("idx_notifications_user_unread").on(e.userId),vT("idx_notifications_source_dedup").on(e.userId,e.sourceTable,e.sourceId)])});import{pgTable as IT,text as Ba,timestamp as Fa,jsonb as ym,uuid as wm,index as ou,integer as Ty}from"drizzle-orm/pg-core";var ce,Ry=J(()=>{"use strict";Od();ce=IT("launch_jobs",{id:wm("id").primaryKey().defaultRandom(),userId:wm("user_id").notNull(),tool:Ba("tool").notNull(),status:Ba("status").notNull().default("pending"),config:ym("config").notNull().default({}),result:ym("result"),error:Ba("error"),attempts:Ty("attempts").notNull().default(0),taskKind:Ba("task_kind"),payload:ym("payload"),claimedBy:Ba("claimed_by"),claimedAt:Fa("claimed_at",{withTimezone:!0}),leaseExpiresAt:Fa("lease_expires_at",{withTimezone:!0}),leaseRecoveries:Ty("lease_recoveries").notNull().default(0),createdAt:Fa("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Fa("updated_at",{withTimezone:!0}).defaultNow(),completedAt:Fa("completed_at",{withTimezone:!0}),runId:wm("run_id").references(()=>X.id,{onDelete:"set null"})},e=>[ou("idx_launch_jobs_user").on(e.userId),ou("idx_launch_jobs_status").on(e.status),ou("idx_launch_jobs_pending").on(e.userId,e.status),ou("idx_launch_jobs_run").on(e.runId)])});import{pgTable as ky,uuid as $r,text as co,real as bT,timestamp as Wa,boolean as ST,uniqueIndex as AT,index as za}from"drizzle-orm/pg-core";var su,x,tt,jy=J(()=>{"use strict";Ft();Fn();Pr();su=["add","remove","trim"],x=ky("instruction_suggestions",{id:$r("id").primaryKey().defaultRandom(),userId:$r("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),instructionId:$r("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),projectPath:co("project_path").notNull(),projectId:$r("project_id").references(()=>U.id,{onDelete:"set null"}),score:bT("score").notNull(),reason:co("reason").notNull(),kind:co("kind").$type().notNull().default("add"),generatedAt:Wa("generated_at",{withTimezone:!0}).notNull().defaultNow(),isStale:ST("is_stale").notNull().default(!1),dismissedAt:Wa("dismissed_at",{withTimezone:!0}),acceptedAt:Wa("accepted_at",{withTimezone:!0}),declinedAt:Wa("declined_at",{withTimezone:!0}),declinedReason:co("declined_reason"),promotedToInstructionId:$r("promoted_to_instruction_id").references(()=>g.id,{onDelete:"set null"})},e=>[AT("idx_instruction_suggestions_user_project_instruction_kind").on(e.userId,e.projectPath,e.instructionId,e.kind),za("idx_instruction_suggestions_user_project").on(e.userId,e.projectPath),za("idx_instruction_suggestions_user_proj_id").on(e.userId,e.projectId),za("idx_instruction_suggestions_generated_at").on(e.generatedAt)]),tt=ky("instruction_suggestion_events",{id:$r("id").primaryKey().defaultRandom(),suggestionId:$r("suggestion_id").notNull().references(()=>x.id,{onDelete:"cascade"}),userId:$r("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),eventType:co("event_type").notNull(),tool:co("tool"),sessionId:$r("session_id"),projectPath:co("project_path").notNull(),actor:co("actor"),createdAt:Wa("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[za("idx_instruction_suggestion_events_suggestion_id").on(e.suggestionId),za("idx_instruction_suggestion_events_user_id").on(e.userId)])});import{pgTable as ET,text as vm,integer as xT,numeric as Va,timestamp as Im,index as TT,primaryKey as RT}from"drizzle-orm/pg-core";var Qe,Ny=J(()=>{"use strict";Qe=ET("model_pricing",{provider:vm("provider").notNull(),modelId:vm("model_id").notNull(),inputPerM:Va("input_per_m").notNull(),outputPerM:Va("output_per_m").notNull(),cacheReadPerM:Va("cache_read_per_m").notNull(),cacheWrite5mPerM:Va("cache_write_5m_per_m").notNull(),cacheWrite1hPerM:Va("cache_write_1h_per_m").notNull(),contextWindow:xT("context_window"),effectiveFrom:Im("effective_from",{withTimezone:!0}).notNull(),effectiveUntil:Im("effective_until",{withTimezone:!0}),source:vm("source").notNull(),verifiedAt:Im("verified_at",{withTimezone:!0})},e=>[RT({columns:[e.provider,e.modelId,e.effectiveFrom]}),TT("idx_model_pricing_active").on(e.provider,e.modelId,e.effectiveFrom.desc())])});import{pgTable as kT,text as ss,numeric as Py,timestamp as Cy,uuid as Oy,jsonb as jT,index as Dy}from"drizzle-orm/pg-core";var we,My=J(()=>{"use strict";we=kT("limit_observations",{id:Oy("id").primaryKey().defaultRandom(),observedAt:Cy("observed_at",{withTimezone:!0}).notNull().defaultNow(),provider:ss("provider").notNull(),plan:ss("plan").notNull(),limitType:ss("limit_type").notNull(),value:Py("value").notNull(),unit:ss("unit").notNull(),comparator:ss("comparator").notNull().default("="),resetsAt:Cy("resets_at",{withTimezone:!0}),sourceType:ss("source_type").notNull(),sourceUrl:ss("source_url"),sourceEvidence:jT("source_evidence"),confidence:Py("confidence").notNull(),userId:Oy("user_id")},e=>[Dy("idx_limit_obs_lookup").on(e.provider,e.plan,e.limitType,e.observedAt.desc()),Dy("idx_limit_obs_user").on(e.userId,e.observedAt.desc())])});import{pgTable as NT,text as iu,timestamp as PT,uuid as CT,jsonb as OT,boolean as DT,uniqueIndex as MT}from"drizzle-orm/pg-core";var xt,Ly=J(()=>{"use strict";xt=NT("provider_docs_snapshots",{id:CT("id").primaryKey().defaultRandom(),fetchedAt:PT("fetched_at",{withTimezone:!0}).notNull().defaultNow(),provider:iu("provider").notNull(),docUrl:iu("doc_url").notNull(),contentHash:iu("content_hash").notNull(),content:iu("content").notNull(),parseSuccess:DT("parse_success").notNull(),parseErrors:OT("parse_errors")},e=>[MT("idx_docs_dedup").on(e.provider,e.docUrl,e.contentHash)])});import{pgTable as LT,text as au,numeric as $y,timestamp as qy,uuid as $T,primaryKey as qT,index as UT}from"drizzle-orm/pg-core";var Ge,Uy=J(()=>{"use strict";Ge=LT("plan_limits_active",{provider:au("provider").notNull(),plan:au("plan").notNull(),limitType:au("limit_type").notNull(),value:$y("value").notNull(),unit:au("unit").notNull(),effectiveFrom:qy("effective_from",{withTimezone:!0}).notNull(),effectiveUntil:qy("effective_until",{withTimezone:!0}),confidence:$y("confidence").notNull(),sourceObservationIds:$T("source_observation_ids").array().notNull()},e=>[qT({columns:[e.provider,e.plan,e.limitType,e.effectiveFrom]}),UT("idx_plan_limits_lookup").on(e.provider,e.plan,e.limitType,e.effectiveFrom.desc())])});import{pgTable as HT,text as bm,timestamp as BT,uuid as Hy,jsonb as FT,index as WT}from"drizzle-orm/pg-core";var yn,By=J(()=>{"use strict";yn=HT("alert_dispatches",{id:Hy("id").primaryKey().defaultRandom(),userId:Hy("user_id").notNull(),alertKey:bm("alert_key").notNull(),severity:bm("severity").notNull(),lastDispatchedAt:BT("last_dispatched_at",{withTimezone:!0}).notNull().defaultNow(),lastState:FT("last_state").notNull(),channel:bm("channel").notNull()},e=>[WT("idx_alert_user_key").on(e.userId,e.alertKey,e.lastDispatchedAt.desc())])});import{boolean as zT,date as VT,index as Sm,integer as JT,jsonb as GT,pgTable as Am,text as zn,timestamp as uo,uniqueIndex as KT,uuid as Ys}from"drizzle-orm/pg-core";var De,St,At,Fy=J(()=>{"use strict";De=Am("announcements",{id:Ys("id").primaryKey().defaultRandom(),version:zn("version").notNull().unique(),releaseDate:VT("release_date").notNull(),subject:zn("subject").notNull(),htmlBody:zn("html_body").notNull(),textBody:zn("text_body").notNull(),sections:GT("sections").notNull().default({}),status:zn("status").notNull().default("draft"),recipientCount:JT("recipient_count"),sentAt:uo("sent_at",{withTimezone:!0}),sentBy:Ys("sent_by"),error:zn("error"),createdAt:uo("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:uo("updated_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Sm("idx_announcements_status").on(e.status),Sm("idx_announcements_created").on(e.createdAt)]),St=Am("announcement_deliveries",{id:Ys("id").primaryKey().defaultRandom(),announcementId:Ys("announcement_id").notNull(),userId:Ys("user_id").notNull(),email:zn("email").notNull(),status:zn("status").notNull().default("pending"),providerId:zn("provider_id"),error:zn("error"),sentAt:uo("sent_at",{withTimezone:!0}),createdAt:uo("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[KT("uniq_announcement_deliveries_announcement_user").on(e.announcementId,e.userId),Sm("idx_announcement_deliveries_user").on(e.userId,e.createdAt)]),At=Am("notification_preferences",{userId:Ys("user_id").primaryKey(),productAnnouncements:zT("product_announcements").notNull().default(!0),unsubscribeToken:zn("unsubscribe_token").notNull().unique(),unsubscribedAt:uo("unsubscribed_at",{withTimezone:!0}),createdAt:uo("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:uo("updated_at",{withTimezone:!0}).notNull().defaultNow()})});import{pgTable as YT,text as Em,timestamp as Wy,uuid as xm,integer as XT,index as QT,unique as ZT}from"drizzle-orm/pg-core";var zy,Vy=J(()=>{"use strict";zy=YT("scaffolding_fingerprints",{id:xm("id").primaryKey().defaultRandom(),userId:xm("user_id").notNull(),harness:Em("harness").notNull(),model:Em("model").notNull(),toolsHash:Em("tools_hash").notNull(),firstSeenAt:Wy("first_seen_at",{withTimezone:!0}).notNull().defaultNow(),lastSeenAt:Wy("last_seen_at",{withTimezone:!0}).notNull().defaultNow(),snapshotCount:XT("snapshot_count").notNull().default(1),firstSessionId:xm("first_session_id")},e=>[ZT("scaffolding_fingerprints_user_id_harness_model_tools_hash_key").on(e.userId,e.harness,e.model,e.toolsHash),QT("idx_scaffolding_fp_segment").on(e.userId,e.harness,e.model)])});import{pgTable as eR,text as Tm,timestamp as tR,jsonb as nR,uuid as Jy,integer as rR,unique as oR}from"drizzle-orm/pg-core";var Gy,Ky=J(()=>{"use strict";Gy=eR("scaffolding_segments",{id:Jy("id").primaryKey().defaultRandom(),userId:Jy("user_id").notNull(),harness:Tm("harness").notNull(),model:Tm("model").notNull(),coreNames:nR("core_names").notNull(),coreHash:Tm("core_hash").notNull(),activeFingerprints:rR("active_fingerprints").notNull(),computedAt:tR("computed_at",{withTimezone:!0}).notNull().defaultNow()},e=>[oR("scaffolding_segments_user_id_harness_model_key").on(e.userId,e.harness,e.model)])});var Rm=J(()=>{"use strict";Ft();Xo();p_();Fn();f_();Pr();Fs();I_();S_();Gp();T_();R_();em();P_();Od();sm();M_();U_();H_();W_();J_();K_();Pa();X_();Z_();ty();ry();cy();uy();py();fy();_y();wy();by();xy();Ry();jy();Ny();My();Ly();Uy();By();Fy();Vy();Ky()});import{relations as We}from"drizzle-orm";var sR,iR,aR,cR,dR,uR,lR,pR,mR,fR,gR,hR,_R,yR,wR,vR,IR,bR,SR,AR,ER,xR,TR,RR,kR,jR,NR,PR,CR,OR,Yy=J(()=>{"use strict";Rm();sR=We(T,({many:e})=>({sessions:e(_),contextSnapshots:e(L),apiKeys:e(Ae)})),iR=We(Ae,({one:e})=>({profile:e(T,{fields:[Ae.userId],references:[T.id]})})),aR=We(G,({many:e})=>({teams:e(K),userOrganizations:e(Q),projects:e(U),invitations:e(ae)})),cR=We(K,({one:e,many:t})=>({organization:e(G,{fields:[K.orgId],references:[G.id]}),userTeams:t(ye),invitations:t(ae)})),dR=We(ae,({one:e})=>({organization:e(G,{fields:[ae.orgId],references:[G.id]}),team:e(K,{fields:[ae.teamId],references:[K.id]}),inviter:e(T,{fields:[ae.invitedBy],references:[T.id]})})),uR=We(Q,({one:e})=>({organization:e(G,{fields:[Q.orgId],references:[G.id]})})),lR=We(ye,({one:e})=>({team:e(K,{fields:[ye.teamId],references:[K.id]})})),pR=We(g,({one:e,many:t})=>({versions:t(Ie),projectInstructions:t(at),events:t(Ct),usageEvents:t(so),sessionInstructions:t(se),packInstructions:t(Oe),forkedFrom:e(g,{fields:[g.forkedFromId],references:[g.id]})})),mR=We(Ct,({one:e})=>({instruction:e(g,{fields:[Ct.instructionId],references:[g.id]})})),fR=We(F,({one:e,many:t})=>({project:e(U,{fields:[F.projectId],references:[U.id]}),parent:e(F,{fields:[F.parentId],references:[F.id]}),versions:t(F)})),gR=We(Ie,({one:e})=>({instruction:e(g,{fields:[Ie.instructionId],references:[g.id]})})),hR=We(U,({one:e,many:t})=>({organization:e(G,{fields:[U.orgId],references:[G.id]}),projectInstructions:t(at),sessions:t(_)})),_R=We(at,({one:e})=>({project:e(U,{fields:[at.projectId],references:[U.id]}),instruction:e(g,{fields:[at.instructionId],references:[g.id]})})),yR=We(_,({one:e,many:t})=>({profile:e(T,{fields:[_.userId],references:[T.id]}),project:e(U,{fields:[_.projectId],references:[U.id]}),run:e(X,{fields:[_.runId],references:[X.id]}),events:t(qe),sessionInstructions:t(se),treatmentExposures:t(Z),contextSnapshots:t(L)})),wR=We(X,({one:e,many:t})=>({profile:e(T,{fields:[X.userId],references:[T.id]}),organization:e(G,{fields:[X.orgId],references:[G.id]}),project:e(U,{fields:[X.projectId],references:[U.id]}),sessions:t(_),launchJobs:t(ce)})),vR=We(ce,({one:e})=>({run:e(X,{fields:[ce.runId],references:[X.id]})})),IR=We(qe,({one:e})=>({session:e(_,{fields:[qe.sessionId],references:[_.id]})})),bR=We(se,({one:e})=>({session:e(_,{fields:[se.sessionId],references:[_.id]}),instruction:e(g,{fields:[se.instructionId],references:[g.id]})})),SR=We(jt,({one:e,many:t})=>({owner:e(T,{fields:[jt.userId],references:[T.id]}),project:e(U,{fields:[jt.projectId],references:[U.id]}),exposures:t(Z)})),AR=We(Z,({one:e})=>({session:e(_,{fields:[Z.sessionId],references:[_.id]}),owner:e(T,{fields:[Z.userId],references:[T.id]}),assignment:e(jt,{fields:[Z.assignmentId],references:[jt.id]})})),ER=We(Le,({one:e,many:t})=>({packInstructions:t(Oe),forkedFrom:e(Le,{fields:[Le.forkedFromId],references:[Le.id]})})),xR=We(Oe,({one:e})=>({pack:e(Le,{fields:[Oe.packId],references:[Le.id]}),instruction:e(g,{fields:[Oe.instructionId],references:[g.id]})})),TR=We(so,({one:e})=>({instruction:e(g,{fields:[so.instructionId],references:[g.id]})})),RR=We(k,({one:e,many:t})=>({parent:e(k,{fields:[k.parentId],references:[k.id]}),evals:t(Se),evalRuns:t(be),benchmarks:t(Wn),evalJobs:t(ke),evalConversations:t($e)})),kR=We(Se,({one:e,many:t})=>({evalTarget:e(k,{fields:[Se.evalTargetId],references:[k.id]}),runs:t(be)})),jR=We(be,({one:e})=>({eval:e(Se,{fields:[be.evalId],references:[Se.id]}),evalTarget:e(k,{fields:[be.evalTargetId],references:[k.id]})})),NR=We(Wn,({one:e})=>({evalTarget:e(k,{fields:[Wn.evalTargetId],references:[k.id]})})),PR=We(ke,({one:e})=>({evalTarget:e(k,{fields:[ke.evalTargetId],references:[k.id]})})),CR=We($e,({one:e})=>({evalTarget:e(k,{fields:[$e.evalTargetId],references:[k.id]})})),OR=We(L,({one:e})=>({session:e(_,{fields:[L.sessionId],references:[_.id]}),profile:e(T,{fields:[L.userId],references:[T.id]})}))});var cu={};to(cu,{SUGGESTION_KINDS:()=>su,agentJobs:()=>je,agentRuns:()=>X,agentRunsRelations:()=>wR,alertDispatches:()=>yn,announcementDeliveries:()=>St,announcements:()=>De,apiKeys:()=>Ae,apiKeysRelations:()=>iR,benchmarks:()=>Wn,benchmarksRelations:()=>NR,cliErrorEvents:()=>Kd,cliSetupEvents:()=>Gd,contentBlobs:()=>_n,contextSnapshots:()=>L,contextSnapshotsRelations:()=>OR,evalComparisons:()=>Xe,evalConversations:()=>$e,evalConversationsRelations:()=>CR,evalGradeAnnotations:()=>Je,evalJobs:()=>ke,evalJobsRelations:()=>PR,evalRuns:()=>be,evalRunsRelations:()=>jR,evalTargets:()=>k,evalTargetsRelations:()=>RR,evals:()=>Se,evalsRelations:()=>kR,extensionAuthCodes:()=>Rn,harnessReleases:()=>Pt,insightRecommendationLog:()=>Ee,insightsJobs:()=>W,instructionEvents:()=>Ct,instructionEventsRelations:()=>mR,instructionExperimentArms:()=>Or,instructionExperiments:()=>q,instructionPromotions:()=>ie,instructionSuggestionEvents:()=>tt,instructionSuggestions:()=>x,instructionUsageEvents:()=>so,instructionUsageEventsRelations:()=>TR,instructionVerdicts:()=>Y,instructionVersionIdentities:()=>sr,instructionVersions:()=>Ie,instructionVersionsRelations:()=>gR,instructions:()=>g,instructionsRelations:()=>pR,judgeReviewerVerdicts:()=>pe,launchJobs:()=>ce,launchJobsRelations:()=>vR,limitObservations:()=>we,memories:()=>F,memoriesRelations:()=>fR,memoryExperiments:()=>Nt,modelPricing:()=>Qe,notificationPreferences:()=>At,notifications:()=>bt,orgInvitations:()=>ae,orgInvitationsRelations:()=>dR,organizations:()=>G,organizationsRelations:()=>aR,packInstructions:()=>Oe,packInstructionsRelations:()=>xR,packs:()=>Le,packsRelations:()=>ER,pendingTreatmentExposures:()=>$d,planLimitsActive:()=>Ge,profiles:()=>T,profilesRelations:()=>sR,projectCheckouts:()=>le,projectInstructions:()=>at,projectInstructionsRelations:()=>_R,projects:()=>U,projectsRelations:()=>hR,providerDocsSnapshots:()=>xt,scaffoldingFingerprints:()=>zy,scaffoldingSegments:()=>Gy,sessionEvents:()=>qe,sessionEventsRelations:()=>IR,sessionInstructions:()=>se,sessionInstructionsRelations:()=>bR,sessionSendJobs:()=>Wd,sessionTerminalTargets:()=>Ve,sessions:()=>_,sessionsRelations:()=>yR,skillSubmissions:()=>ao,teams:()=>K,teamsRelations:()=>cR,treatmentAssignments:()=>jt,treatmentAssignmentsRelations:()=>SR,treatmentExposures:()=>Z,treatmentExposuresRelations:()=>AR,userOrganizations:()=>Q,userOrganizationsRelations:()=>uR,userTeams:()=>ye,userTeamsRelations:()=>lR,workerConnections:()=>fe});var du=J(()=>{"use strict";Rm();Yy()});function Pm(){is++,is>km&&(km=is)}function Cm(){is>0&&is--}function Om(){Xs++,Xs>jm&&(jm=Xs)}function Dm(){Xs>0&&Xs--}function Ja(){return is}function Mm(){Xy++}function Ga(){Qy++}function Zy(){Nm++}function Lm(){let e=Nm;return Nm=0,e}function $m(){return{current:is,peak:km,heavyCurrent:Xs,heavyPeak:jm,shedCount:Xy,ingestShedCount:Qy}}function Qs(){let e=Number(process.env.PG_INFLIGHT_MAX);return Number.isFinite(e)&&e>0?e:(Number(process.env.PG_POOL_MAX)||3)*4}function Ka(){let e=Qs(),t=Number(process.env.PG_INGEST_INFLIGHT_MAX);if(Number.isFinite(t)&&t>0)return Math.min(t,e);let n=Number(process.env.PG_POOL_MAX)||3;return Math.min(e,Math.max(n,Math.floor(e/2)))}var is,km,Xs,jm,Xy,Qy,Nm,qm=J(()=>{"use strict";is=0,km=0,Xs=0,jm=0,Xy=0,Qy=0,Nm=0;d(Pm,"trackDbOpStart");d(Cm,"trackDbOpEnd");d(Om,"trackHeavyDbOpStart");d(Dm,"trackHeavyDbOpEnd");d(Ja,"getDbLoad");d(Mm,"recordDbShed");d(Ga,"recordIngestShed");d(Zy,"recordQueryDeadline");d(Lm,"consumeDeadlineCount");d($m,"getDbLoadStats");d(Qs,"dbInflightMax");d(Ka,"dbIngestInflightMax")});import{drizzle as ew}from"drizzle-orm/postgres-js";import Um from"postgres";function Hm(e){let t=process.env[e];if(!t)throw new Error(`Missing required env var: ${e}`);return t}function tw(){if(Qa)throw new Error("getDb() called after closeDb(): the connection pool is closed for shutdown. Stop issuing queries (timers/requests) before draining the pool.");if(!Xa){let e=process.env.PG_APPLICATION_NAME||"rulemetric",t=Number(process.env.PG_POOL_MAX)||3,n=Number(process.env.PG_CONNECT_TIMEOUT_S)||10,r=Number(process.env.PG_STATEMENT_TIMEOUT_MS)||0,o=Number(process.env.PG_IDLE_TIMEOUT)||5,s=Number(process.env.PG_KEEP_ALIVE_S)||60;ei=Um(Hm("DATABASE_URL"),{prepare:!1,max:t,connect_timeout:n,idle_timeout:o,keep_alive:s,max_lifetime:300,connection:{application_name:e,...r>0?{statement_timeout:r}:{}}}),Xa=ew(ei,{schema:cu})}return Xa}function nw(){if(Qa)throw new Error("getHeavyDb() called after closeDb(): the connection pool is closed for shutdown. Stop issuing queries (timers/requests) before draining the pool.");if(!lu){let e=(process.env.PG_APPLICATION_NAME||"rulemetric")+":heavy",t=Number(process.env.PG_HEAVY_POOL_MAX)||2;pu=Um(Hm("DATABASE_URL"),{prepare:!1,max:t,connect_timeout:Number(process.env.PG_CONNECT_TIMEOUT_S)||10,idle_timeout:Number(process.env.PG_IDLE_TIMEOUT)||5,keep_alive:Number(process.env.PG_KEEP_ALIVE_S)||60,max_lifetime:300,connection:{application_name:e}}),lu=ew(pu,{schema:cu})}return lu}async function Za(){if(uu)return uu;Qa=!0;let e=ei,t=Zs,n=pu;return ei=void 0,Xa=void 0,Zs=void 0,pu=void 0,lu=void 0,uu=Promise.allSettled([e?e.end({timeout:5}):Promise.resolve(),t?t.end({timeout:5}):Promise.resolve(),n?n.end({timeout:5}):Promise.resolve()]).then(()=>{}),uu}function Bm(){if(Qa)return Promise.resolve();if(Ya)return Ya;let e=ei;return ei=void 0,Xa=void 0,Ya=(async()=>{e&&await e.end({timeout:5}).catch(()=>{})})().finally(()=>{Ya=void 0}),Ya}async function Fm(e){let t=Date.now();if(Qa)return{ok:!1,ms:0,err:new Error("pool closed for shutdown")};let n=Zs;try{return n||(n=Um(Hm("DATABASE_URL"),{prepare:!1,max:1,connect_timeout:Number(process.env.PG_CONNECT_TIMEOUT_S)||10,idle_timeout:20,max_lifetime:300,connection:{application_name:(process.env.PG_APPLICATION_NAME||"rulemetric")+":probe",statement_timeout:Math.max(2e3,e-2e3)}}),Zs=n),await Promise.race([n`SELECT 1`,new Promise((r,o)=>setTimeout(()=>o(new Error("db probe timeout")),e))]),{ok:!0,ms:Date.now()-t}}catch(r){return Zs===n&&(Zs=void 0),n?.end({timeout:1}).catch(()=>{}),{ok:!1,ms:Date.now()-t,err:r}}}function ec(e){let t=e?.message;return typeof t=="string"&&t.includes(DR)}function ti(e){let t=e,n=t?.code??t?.cause?.code??t?.errno;return n!==void 0&&MR.has(n)}function fu(e){let t=e,n=t?.code??t?.cause?.code??t?.errno;return n!==void 0&&LR.has(n)}async function rw(e,t={}){let n=t.attempts??3,r=t.baseMs??100,o;for(let s=0;s<n;s++)try{return await e()}catch(i){o=i;let a=ti(i)||t.retryResets===!0&&fu(i);if(s===n-1||!a)throw i;await new Promise(c=>setTimeout(c,r*2**s))}throw o}function tc(e){return e?.code==="QUERY_DEADLINE"}function ow(){let e=Number(process.env.PG_QUERY_DEADLINE_MS);return Number.isFinite(e)&&e>=0?e:2e4}function sw(){let e=Number(process.env.PG_HEAVY_QUERY_DEADLINE_MS);return Number.isFinite(e)&&e>=0?e:6e4}function $R(e,t,n=!0){let r,o=new Promise((s,i)=>{r=setTimeout(()=>{n&&Zy(),i(new mu(t))},t);let a=r;typeof a.unref=="function"&&a.unref()});return Promise.race([e,o]).finally(()=>clearTimeout(r))}function Wm(e,t=!1,n=0,r=!1){return e===null||typeof e!="object"&&typeof e!="function"?e:new Proxy(e,{get(o,s,i){if(s==="then"){let c=Reflect.get(o,s,i);return typeof c!="function"?c:(l,p)=>{let m=r?Om:Pm,y=r?Dm:Cm;m();let v=rw(()=>new Promise((f,w)=>c.call(o,f,w)),{retryResets:t});return(n>0?$R(v,n,!r):v).finally(y).then(l,p)}}let a=Reflect.get(o,s,i);return typeof a=="function"?(...c)=>Wm(a.apply(o,c),t,n,r):a}})}function cw(e,t=!1){let n=t?Om:Pm,r=t?Dm:Cm;n();try{return Promise.resolve(e()).finally(r)}catch(o){throw r(),o}}var Xa,ei,Qa,uu,Ya,Zs,pu,lu,DR,MR,LR,mu,iw,aw,u,nt,zm=J(()=>{"use strict";du();qm();Qa=!1;d(Hm,"getEnv");d(tw,"getDb");d(nw,"getHeavyDb");d(Za,"closeDb");d(Bm,"recyclePool");d(Fm,"probeDbReachable");DR="called after closeDb()";d(ec,"isPoolClosedError");MR=new Set(["CONNECT_TIMEOUT","ETIMEDOUT","ENOTFOUND","ECONNREFUSED","EAI_AGAIN"]);d(ti,"isRetryableConnectError");LR=new Set(["CONNECTION_CLOSED","ECONNRESET","EPIPE"]);d(fu,"isRetryableResetError");d(rw,"withDbRetry");mu=class extends Error{static{d(this,"QueryDeadlineError")}code="QUERY_DEADLINE";constructor(t){super(`Query exceeded the client-side deadline of ${t}ms \u2014 the DB pool is likely saturated (acquire-wait) or holding a dead socket; failing fast to avoid pinning the caller. See client.ts.`),this.name="QueryDeadlineError"}};d(tc,"isQueryDeadlineError");d(ow,"queryDeadlineMs");d(sw,"heavyQueryDeadlineMs");d($R,"raceWithDeadline");iw=new Set(["select","selectDistinct","selectDistinctOn","insert","update","delete","execute","with","$count","refreshMaterializedView"]),aw=new Set(["select","selectDistinct","selectDistinctOn","$count"]);d(Wm,"wrapBuilder");d(cw,"gaugeTransaction");u=new Proxy({},{get(e,t){let n=tw(),r=n[t];if(typeof t=="string"&&iw.has(t)&&typeof r=="function"){let o=aw.has(t),s=ow();return(...i)=>Wm(r.apply(n,i),o,s)}return t==="transaction"&&typeof r=="function"?(...o)=>cw(()=>r.apply(n,o)):r}}),nt=new Proxy({},{get(e,t){let n=nw(),r=n[t];if(typeof t=="string"&&iw.has(t)&&typeof r=="function"){let o=aw.has(t);return(...s)=>Wm(r.apply(n,s),o,sw(),!0)}return t==="transaction"&&typeof r=="function"?(...o)=>cw(()=>r.apply(n,o),!0):r}})});async function tn(e){let[t]=await u.insert(bt).values({userId:e.userId,type:e.type,title:e.title,body:e.body??null,url:e.url??null,sourceTable:e.sourceTable??null,sourceId:e.sourceId??null,metadata:e.metadata??{}}).onConflictDoNothing({target:[bt.userId,bt.sourceTable,bt.sourceId]}).returning();return t??null}var dw=J(()=>{"use strict";zm();du();d(tn,"notifyUser")});var O=J(()=>{"use strict";du();zm();qm();dw()});function dI(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Fu(e,t){let n=(e??"").trim();if(!n)return null;if(!n.includes("Contents of "))return n;if(t){let o=n.match(new RegExp(`Contents of [^\\n]*${dI(t)}[^\\n]*\\n([\\s\\S]*?)(?=\\nContents of |$)`,"i"))?.[1]?.trim();if(o)return o;let s=t.split("/").pop();if(s&&s!==t){let a=n.match(new RegExp(`Contents of [^\\n]*${dI(s)}[^\\n]*\\n([\\s\\S]*?)(?=\\nContents of |$)`,"i"))?.[1]?.trim();if(a)return a}}return null}var Nf=J(()=>{"use strict";d(dI,"escapeRegExp");d(Fu,"extractInstructionSection")});var mI={};to(mI,{GRADUATION_MIN_N:()=>Ic,decideGraduation:()=>lI,graduatedRulesForRender:()=>Pf,instructionContentHash:()=>Ur,maybeGraduate:()=>pI,settleExperiment:()=>gi,verdictRowsForExperiments:()=>zu});import{createHash as cN}from"node:crypto";import{and as Wu,eq as Gn,inArray as dN,sql as uI}from"drizzle-orm";function lI(e){return e.resolution!=="resolved"||e.randomisationSuspect||e.contentChanged||e.delta===null||e.ci===null||e.measured.treated<Ic||e.measured.control<Ic?null:e.delta>0?"always":"never"}function Ur(e,t){let n=Fu(e,t);return n?cN("sha256").update(n).digest("hex"):null}async function pI(e){let{experimentId:t,userId:n,verdict:r}=e,o=lI(r);if(o===null)return null;let[s]=await u.select({id:q.id,instructionId:q.instructionId,projectPath:q.projectPath,status:q.status}).from(q).where(Wu(Gn(q.id,t),Gn(q.userId,n)));if(!s||s.status!=="running")return null;let[i]=await u.select({content:g.content,name:g.name}).from(g).where(Gn(g.id,s.instructionId)),a=Ur(i?.content,i?.name);if(!a)return null;let l=(await u.execute(uI`
|
|
1
|
+
var c_=Object.defineProperty;var d=(e,t)=>c_(e,"name",{value:t,configurable:!0}),Cp=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var J=(e,t)=>()=>(e&&(t=e(e=0)),t);var to=(e,t)=>{for(var n in t)c_(e,n,{get:t[n],enumerable:!0})};import{pgTable as Rd,text as Hs,timestamp as Aa,jsonb as p_,uuid as Yo,primaryKey as m_}from"drizzle-orm/pg-core";var G,K,Q,ye,Xo=J(()=>{"use strict";G=Rd("organizations",{id:Yo("id").primaryKey().defaultRandom(),name:Hs("name").unique().notNull(),slug:Hs("slug").unique().notNull(),metadata:p_("metadata"),createdAt:Aa("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Aa("updated_at",{withTimezone:!0}).defaultNow()}),K=Rd("teams",{id:Yo("id").primaryKey().defaultRandom(),orgId:Yo("org_id").references(()=>G.id,{onDelete:"cascade"}),name:Hs("name").notNull(),slug:Hs("slug").notNull(),metadata:p_("metadata"),createdAt:Aa("created_at",{withTimezone:!0}).defaultNow()}),Q=Rd("user_organizations",{userId:Yo("user_id").notNull(),orgId:Yo("org_id").references(()=>G.id,{onDelete:"cascade"}).notNull(),role:Hs("role").notNull().default("member"),createdAt:Aa("created_at",{withTimezone:!0}).defaultNow()},e=>[m_({columns:[e.userId,e.orgId]})]),ye=Rd("user_teams",{userId:Yo("user_id").notNull(),teamId:Yo("team_id").references(()=>K.id,{onDelete:"cascade"}).notNull(),role:Hs("role").notNull().default("member"),createdAt:Aa("created_at",{withTimezone:!0}).defaultNow()},e=>[m_({columns:[e.userId,e.teamId]})])});import{boolean as kd,pgTable as BE,real as FE,text as jd,timestamp as Hp,uuid as f_}from"drizzle-orm/pg-core";var T,Ft=J(()=>{"use strict";Xo();T=BE("profiles",{id:f_("id").primaryKey(),email:jd("email"),displayName:jd("display_name"),activeOrgId:f_("active_org_id").references(()=>G.id,{onDelete:"set null"}),isSuperadmin:kd("is_superadmin").notNull().default(!1),claudeCodePlan:jd("claude_code_plan"),planSource:jd("plan_source").notNull().default("detected"),setupCompletedAt:Hp("setup_completed_at",{withTimezone:!0}),liveSendSkipped:kd("live_send_skipped").notNull().default(!1),autoAcceptSuggestions:kd("auto_accept_suggestions").notNull().default(!0),evolutionPaused:kd("evolution_paused").notNull().default(!1),suggestionConfidenceThreshold:FE("suggestion_confidence_threshold").notNull().default(.7),createdAt:Hp("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Hp("updated_at",{withTimezone:!0}).defaultNow()})});import{pgTable as WE,text as Bp,timestamp as Nd,uuid as Pd,index as g_}from"drizzle-orm/pg-core";var ae,h_=J(()=>{"use strict";Xo();Ft();ae=WE("org_invitations",{id:Pd("id").primaryKey().defaultRandom(),orgId:Pd("org_id").notNull().references(()=>G.id,{onDelete:"cascade"}),email:Bp("email").notNull(),role:Bp("role").notNull().default("member"),teamId:Pd("team_id").references(()=>K.id,{onDelete:"set null"}),invitedBy:Pd("invited_by").notNull().references(()=>T.id,{onDelete:"cascade"}),token:Bp("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=>[g_("idx_org_invitations_token").on(e.token),g_("idx_org_invitations_org").on(e.orgId)])});import{pgTable as Fp,text as Jt,timestamp as no,jsonb as Cd,uuid as or,integer as Dd,boolean as zE,uniqueIndex as Od,index as Ea}from"drizzle-orm/pg-core";var g,sr,Ie,Wn=J(()=>{"use strict";g=Fp("instructions",{id:or("id").primaryKey().defaultRandom(),name:Jt("name").notNull(),description:Jt("description").notNull(),type:Jt("type").notNull().default("instruction"),scope:Jt("scope").notNull(),scopeRef:or("scope_ref"),version:Jt("version").notNull(),content:Jt("content").notNull(),frontmatter:Cd("frontmatter").notNull(),slots:Cd("slots"),tags:Jt("tags").array(),compatibility:Jt("compatibility").array(),createdBy:or("created_by"),createdAt:no("created_at",{withTimezone:!0}).defaultNow(),updatedAt:no("updated_at",{withTimezone:!0}).defaultNow(),archived:zE("archived").default(!1),archivedAt:no("archived_at",{withTimezone:!0}),archivedBy:or("archived_by"),forkedFromId:or("forked_from_id").references(()=>g.id,{onDelete:"set null"}),upstreamVersion:Jt("upstream_version"),badge:Jt("badge"),contentHash:Jt("content_hash"),contextIdentity:Jt("context_identity"),scanScore:Dd("scan_score"),scanFindings:Cd("scan_findings"),popularityScore:Dd("popularity_score"),sourceUpdatedAt:no("source_updated_at",{withTimezone:!0})},e=>[Od("instructions_name_scope_ref_idx").on(e.name,e.scope,e.scopeRef),Ea("idx_instructions_scope").on(e.scope,e.scopeRef),Ea("idx_instructions_created_by").on(e.createdBy),Ea("idx_instructions_context_identity").on(e.createdBy,e.contextIdentity),Ea("idx_instructions_public_recency").on(e.scope,e.sourceUpdatedAt.desc())]),sr=Fp("instruction_version_identities",{id:or("id").primaryKey().defaultRandom(),instructionId:or("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),contentHash:Jt("content_hash").notNull(),versionOrdinal:Dd("version_ordinal").notNull(),content:Jt("content"),firstSeenAt:no("first_seen_at",{withTimezone:!0}).notNull().defaultNow(),lastSeenAt:no("last_seen_at",{withTimezone:!0}).notNull().defaultNow(),createdAt:no("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Od("instruction_version_identities_hash_unique").on(e.instructionId,e.contentHash),Od("instruction_version_identities_ordinal_unique").on(e.instructionId,e.versionOrdinal),Ea("idx_ivi_instruction").on(e.instructionId)]),Ie=Fp("instruction_versions",{id:or("id").primaryKey().defaultRandom(),instructionId:or("instruction_id").references(()=>g.id,{onDelete:"cascade"}),versionNumber:Dd("version_number").notNull(),content:Jt("content").notNull(),frontmatter:Cd("frontmatter").notNull(),changeSummary:Jt("change_summary"),createdBy:or("created_by"),createdAt:no("created_at",{withTimezone:!0}).defaultNow()},e=>[Od("instruction_versions_instruction_version_idx").on(e.instructionId,e.versionNumber)])});import{pgTable as VE,text as JE,timestamp as GE,jsonb as KE,uuid as Wp,index as __}from"drizzle-orm/pg-core";var Ct,y_=J(()=>{"use strict";Wn();Ct=VE("instruction_events",{id:Wp("id").primaryKey().defaultRandom(),instructionId:Wp("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),eventType:JE("event_type").notNull(),actorId:Wp("actor_id").notNull(),metadata:KE("metadata"),createdAt:GE("created_at",{withTimezone:!0}).defaultNow()},e=>[__("idx_instruction_events_instruction").on(e.instructionId),__("idx_instruction_events_type").on(e.eventType)])});import{boolean as YE,jsonb as XE,pgTable as Vp,primaryKey as w_,text as Qo,timestamp as xa,uniqueIndex as zp,uuid as Zo}from"drizzle-orm/pg-core";import{sql as QE}from"drizzle-orm";var U,at,le,Pr=J(()=>{"use strict";Xo();Wn();U=Vp("projects",{id:Zo("id").primaryKey().defaultRandom(),orgId:Zo("org_id").references(()=>G.id,{onDelete:"cascade"}),name:Qo("name").notNull(),description:Qo("description"),githubRepo:Qo("github_repo"),gitRemoteUrl:Qo("git_remote_url"),gitRootCommit:Qo("git_root_commit"),gitRemoteAliases:Qo("git_remote_aliases").array().notNull().default([]),metadata:XE("metadata"),createdBy:Zo("created_by"),createdAt:xa("created_at",{withTimezone:!0}).defaultNow(),updatedAt:xa("updated_at",{withTimezone:!0}).defaultNow()},e=>[zp("projects_org_name_idx").on(e.orgId,e.name),zp("projects_git_remote_url_unique").on(e.gitRemoteUrl).where(QE`${e.gitRemoteUrl} IS NOT NULL`)]),at=Vp("project_instructions",{projectId:Zo("project_id").references(()=>U.id,{onDelete:"cascade"}).notNull(),instructionId:Zo("instruction_id").references(()=>g.id,{onDelete:"cascade"}).notNull(),addedAt:xa("added_at",{withTimezone:!0}).defaultNow(),addedBy:Zo("added_by")},e=>[w_({columns:[e.projectId,e.instructionId]})]),le=Vp("project_checkouts",{projectId:Zo("project_id").references(()=>U.id,{onDelete:"cascade"}).notNull(),path:Qo("path").notNull(),isWorktree:YE("is_worktree").notNull().default(!1),firstSeen:xa("first_seen",{withTimezone:!0}).notNull().defaultNow(),lastSeen:xa("last_seen",{withTimezone:!0}).notNull().defaultNow()},e=>[w_({columns:[e.projectId,e.path]}),zp("project_checkouts_path_unique").on(e.path)])});import{pgTable as ZE,text as Bs,timestamp as Jp,jsonb as v_,uuid as Md,integer as ex,boolean as tx,index as Gp}from"drizzle-orm/pg-core";var X,Ld=J(()=>{"use strict";Ft();Xo();Pr();X=ZE("agent_runs",{id:Md("id").primaryKey().defaultRandom(),userId:Md("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),orgId:Md("org_id").references(()=>G.id,{onDelete:"set null"}),projectId:Md("project_id").references(()=>U.id,{onDelete:"set null"}),projectPath:Bs("project_path"),gitRemote:Bs("git_remote"),baseBranch:Bs("base_branch"),title:Bs("title"),prompt:Bs("prompt"),toolSpec:v_("tool_spec").notNull().default([]),autoWorktree:tx("auto_worktree").notNull().default(!0),status:Bs("status").notNull().default("pending"),sessionCount:ex("session_count").notNull().default(0),metadata:v_("metadata").notNull().default({}),createdAt:Jp("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:Jp("updated_at",{withTimezone:!0}).notNull().defaultNow(),completedAt:Jp("completed_at",{withTimezone:!0})},e=>[Gp("idx_agent_runs_user").on(e.userId),Gp("idx_agent_runs_org_created").on(e.orgId,e.createdAt),Gp("idx_agent_runs_project").on(e.projectId)])});import{pgTable as Kp,text as hn,timestamp as Ta,jsonb as es,uuid as Cr,integer as $d,uniqueIndex as I_,index as ir}from"drizzle-orm/pg-core";var _,qe,se,Fs=J(()=>{"use strict";Wn();Pr();Ft();Xo();Ld();_=Kp("sessions",{id:Cr("id").primaryKey().defaultRandom(),userId:Cr("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),externalSessionId:hn("external_session_id"),projectId:Cr("project_id").references(()=>U.id,{onDelete:"set null"}),orgId:Cr("org_id").references(()=>G.id,{onDelete:"set null"}),tool:hn("tool").notNull(),projectPath:hn("project_path"),gitBranch:hn("git_branch"),startedAt:Ta("started_at",{withTimezone:!0}).notNull(),endedAt:Ta("ended_at",{withTimezone:!0}),eventCount:$d("event_count").default(0),tokenUsage:es("token_usage"),analysis:es("analysis"),analyzedAt:Ta("analyzed_at",{withTimezone:!0}),analyzedEventCount:$d("analyzed_event_count"),analyzedTurnCount:$d("analyzed_turn_count"),metadata:es("metadata").default({}),origin:hn("origin").notNull().default("unknown"),runId:Cr("run_id").references(()=>X.id,{onDelete:"set null"}),model:hn("model"),harnessVersion:hn("harness_version"),createdAt:Ta("created_at",{withTimezone:!0}).defaultNow()},e=>[ir("idx_sessions_user").on(e.userId),ir("idx_sessions_tool").on(e.tool),ir("idx_sessions_started_at").on(e.startedAt),ir("idx_sessions_project").on(e.projectId),ir("idx_sessions_org_started_at").on(e.orgId,e.startedAt),ir("idx_sessions_run").on(e.runId),I_("idx_sessions_user_external").on(e.userId,e.externalSessionId)]),qe=Kp("session_events",{id:Cr("id").primaryKey().defaultRandom(),sessionId:Cr("session_id").notNull().references(()=>_.id,{onDelete:"cascade"}),sequence:$d("sequence").notNull(),eventType:hn("event_type").notNull(),content:hn("content"),toolName:hn("tool_name"),toolInput:es("tool_input"),toolOutput:es("tool_output"),tokenUsage:es("token_usage"),model:hn("model"),timestamp:Ta("timestamp",{withTimezone:!0}).notNull(),metadata:es("metadata").default({})},e=>[I_("session_events_session_sequence_idx").on(e.sessionId,e.sequence),ir("idx_session_events_session_id").on(e.sessionId),ir("idx_session_events_event_type").on(e.eventType),ir("idx_session_events_model").on(e.model)]),se=Kp("session_instructions",{sessionId:Cr("session_id").notNull().references(()=>_.id,{onDelete:"cascade"}),instructionId:Cr("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),linkMethod:hn("link_method").notNull(),contentHash:hn("content_hash")},e=>[ir("idx_session_instructions_instruction_id").on(e.instructionId)])});import{pgTable as b_,text as qd,timestamp as S_,uuid as ar,integer as A_,index as Ws,unique as nx}from"drizzle-orm/pg-core";var jt,Z,E_=J(()=>{"use strict";Ft();Pr();Fs();jt=b_("treatment_assignments",{id:ar("id").primaryKey().defaultRandom(),userId:ar("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),treatmentType:qd("treatment_type").notNull(),treatmentId:ar("treatment_id").notNull(),treatmentVersion:A_("treatment_version").notNull().default(1),projectId:ar("project_id").references(()=>U.id,{onDelete:"set null"}),assignedBy:ar("assigned_by").references(()=>T.id,{onDelete:"set null"}),method:qd("method").notNull(),assignedAt:S_("assigned_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Ws("idx_treatment_assignments_user").on(e.userId),Ws("idx_treatment_assignments_treatment").on(e.treatmentType,e.treatmentId),Ws("idx_treatment_assignments_project").on(e.projectId)]),Z=b_("treatment_exposures",{id:ar("id").primaryKey().defaultRandom(),sessionId:ar("session_id").notNull().references(()=>_.id,{onDelete:"cascade"}),userId:ar("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),treatmentType:qd("treatment_type").notNull(),treatmentId:ar("treatment_id").notNull(),treatmentVersion:A_("treatment_version").notNull().default(1),assignmentId:ar("assignment_id").references(()=>jt.id,{onDelete:"set null"}),method:qd("method").notNull(),exposedAt:S_("exposed_at",{withTimezone:!0}).notNull().defaultNow()},e=>[nx("treatment_exposures_unique").on(e.sessionId,e.treatmentType,e.treatmentId,e.treatmentVersion),Ws("idx_treatment_exposures_treatment").on(e.treatmentType,e.treatmentId),Ws("idx_treatment_exposures_user").on(e.userId),Ws("idx_treatment_exposures_session").on(e.sessionId)])});import{pgTable as rx,text as Yp,timestamp as ox,uuid as Ud,integer as sx,index as x_,uniqueIndex as ix}from"drizzle-orm/pg-core";var Hd,T_=J(()=>{"use strict";Ft();Pr();Hd=rx("pending_treatment_exposures",{id:Ud("id").primaryKey().defaultRandom(),userId:Ud("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),externalSessionId:Yp("external_session_id").notNull(),treatmentType:Yp("treatment_type").notNull(),treatmentId:Ud("treatment_id").notNull(),treatmentVersion:sx("treatment_version").notNull().default(1),method:Yp("method").notNull().default("injected"),projectId:Ud("project_id").references(()=>U.id,{onDelete:"set null"}),createdAt:ox("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[ix("pending_treatment_exposures_unique").on(e.externalSessionId,e.treatmentType,e.treatmentId,e.treatmentVersion),x_("idx_pending_treatment_exposures_ext").on(e.externalSessionId),x_("idx_pending_treatment_exposures_user").on(e.userId)])});import{pgTable as R_,text as ro,timestamp as k_,uuid as zs,numeric as ax,index as Xp,unique as cx}from"drizzle-orm/pg-core";var q,Dr,Qp=J(()=>{"use strict";Ft();Wn();q=R_("instruction_experiments",{id:zs("id").primaryKey().defaultRandom(),userId:zs("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),instructionId:zs("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),projectPath:ro("project_path").notNull(),status:ro("status").notNull().default("running"),treatedShare:ax("treated_share").notNull().default("0.5"),salt:ro("salt").notNull(),contentHash:ro("content_hash"),source:ro("source").notNull().default("manual"),stoppedReason:ro("stopped_reason"),createdAt:k_("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Xp("idx_instruction_experiments_lookup").on(e.userId,e.projectPath)]),Dr=R_("instruction_experiment_arms",{id:zs("id").primaryKey().defaultRandom(),experimentId:zs("experiment_id").notNull().references(()=>q.id,{onDelete:"cascade"}),userId:zs("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),externalSessionId:ro("external_session_id").notNull(),arm:ro("arm").notNull(),assignedAt:k_("assigned_at",{withTimezone:!0}).notNull().defaultNow()},e=>[cx("instruction_experiment_arms_unique").on(e.experimentId,e.externalSessionId),Xp("idx_instruction_experiment_arms_experiment").on(e.experimentId,e.arm),Xp("idx_instruction_experiment_arms_session").on(e.externalSessionId)])});import{pgTable as dx,text as Zp,timestamp as ux,uuid as Bd,numeric as em,integer as j_,jsonb as lx,index as px,unique as mx}from"drizzle-orm/pg-core";var Y,N_=J(()=>{"use strict";Ft();Wn();Qp();Y=dx("instruction_verdicts",{id:Bd("id").primaryKey().defaultRandom(),userId:Bd("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),instructionId:Bd("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),contentHash:Zp("content_hash").notNull(),projectPath:Zp("project_path").notNull(),segment:lx("segment").notNull().default({}),decision:Zp("decision").notNull(),delta:em("delta").notNull(),ciLower:em("ci_lower").notNull(),ciUpper:em("ci_upper").notNull(),nTreated:j_("n_treated").notNull(),nControl:j_("n_control").notNull(),experimentId:Bd("experiment_id").references(()=>q.id,{onDelete:"set null"}),decidedAt:ux("decided_at",{withTimezone:!0}).notNull().defaultNow()},e=>[mx("instruction_verdicts_unique").on(e.instructionId,e.contentHash,e.projectPath),px("idx_instruction_verdicts_render").on(e.userId,e.projectPath)])});import{pgTable as fx,text as Fd,timestamp as tm,uuid as nm,integer as gx,unique as hx,index as _x}from"drizzle-orm/pg-core";var Ee,P_=J(()=>{"use strict";Ft();Ee=fx("insight_recommendation_log",{id:nm("id").primaryKey().defaultRandom(),userId:nm("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),projectPath:Fd("project_path").notNull().default(""),category:Fd("category").notNull(),contentHash:Fd("content_hash").notNull(),label:Fd("label").notNull().default(""),firstSeenAt:tm("first_seen_at",{withTimezone:!0}).notNull().defaultNow(),lastSeenAt:tm("last_seen_at",{withTimezone:!0}).notNull().defaultNow(),timesGenerated:gx("times_generated").notNull().default(1),lastJobId:nm("last_job_id"),dismissedAt:tm("dismissed_at",{withTimezone:!0})},e=>[hx("insight_recommendation_log_unique").on(e.userId,e.projectPath,e.contentHash),_x("idx_insight_recommendation_log_read").on(e.userId,e.projectPath)])});import{pgTable as yx,text as Vs,timestamp as rm,uuid as Ra,integer as C_,index as Wd}from"drizzle-orm/pg-core";var F,om=J(()=>{"use strict";Ft();Pr();F=yx("memories",{id:Ra("id").primaryKey().defaultRandom(),userId:Ra("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),orgId:Ra("org_id"),projectId:Ra("project_id").references(()=>U.id,{onDelete:"set null"}),version:C_("version").notNull().default(1),parentId:Ra("parent_id").references(()=>F.id,{onDelete:"set null"}),kind:Vs("kind").notNull(),title:Vs("title").notNull(),body:Vs("body").notNull(),source:Vs("source").notNull(),status:Vs("status").notNull().default("active"),trustClass:Vs("trust_class"),trustVersion:C_("trust_version"),trustComputedAt:rm("trust_computed_at",{withTimezone:!0}),createdAt:rm("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:rm("updated_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Wd("idx_memories_user").on(e.userId),Wd("idx_memories_project").on(e.projectId),Wd("idx_memories_parent").on(e.parentId),Wd("idx_memories_user_status").on(e.userId,e.status)])});import{pgTable as wx,text as ka,timestamp as sm,uuid as im,integer as D_,jsonb as vx,index as O_}from"drizzle-orm/pg-core";var Nt,M_=J(()=>{"use strict";Ft();om();Nt=wx("memory_experiments",{id:im("id").primaryKey().defaultRandom(),memoryId:im("memory_id").notNull().references(()=>F.id,{onDelete:"cascade"}),userId:im("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),memoryVersion:D_("memory_version").notNull().default(1),taskPrompt:ka("task_prompt").notNull(),expectations:ka("expectations").array().notNull().default([]),trials:D_("trials").notNull().default(10),model:ka("model"),status:ka("status").notNull().default("pending"),result:vx("result").$type(),error:ka("error"),createdAt:sm("created_at",{withTimezone:!0}).notNull().defaultNow(),startedAt:sm("started_at",{withTimezone:!0}),completedAt:sm("completed_at",{withTimezone:!0})},e=>[O_("idx_memory_experiments_memory").on(e.memoryId),O_("idx_memory_experiments_user").on(e.userId)])});import{pgTable as Ix,text as Js,timestamp as am,uuid as cm,jsonb as bx,uniqueIndex as Sx,index as L_}from"drizzle-orm/pg-core";var Ve,dm=J(()=>{"use strict";Ft();Fs();Ve=Ix("session_terminal_targets",{id:cm("id").primaryKey().defaultRandom(),userId:cm("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),sessionId:cm("session_id").references(()=>_.id,{onDelete:"set null"}),externalSessionId:Js("external_session_id"),kind:Js("kind").notNull(),target:Js("target").notNull(),status:Js("status").notNull().default("active"),attachCommand:Js("attach_command").notNull(),projectPath:Js("project_path"),metadata:bx("metadata").notNull().default({}),lastSeenAt:am("last_seen_at",{withTimezone:!0}).defaultNow(),createdAt:am("created_at",{withTimezone:!0}).defaultNow(),updatedAt:am("updated_at",{withTimezone:!0}).defaultNow()},e=>[Sx("idx_session_terminal_targets_user_target").on(e.userId,e.target),L_("idx_session_terminal_targets_session").on(e.sessionId),L_("idx_session_terminal_targets_user_status").on(e.userId,e.status)])});import{boolean as Ax,index as zd,jsonb as $_,pgTable as Ex,text as ts,timestamp as ja,uuid as Vd,integer as q_}from"drizzle-orm/pg-core";var Jd,U_=J(()=>{"use strict";Fs();dm();Jd=Ex("session_send_jobs",{id:Vd("id").primaryKey().defaultRandom(),userId:Vd("user_id").notNull(),sessionId:Vd("session_id").notNull().references(()=>_.id,{onDelete:"cascade"}),terminalTargetId:Vd("terminal_target_id").references(()=>Ve.id,{onDelete:"set null"}),target:ts("target").notNull(),message:ts("message").notNull(),submit:Ax("submit").notNull().default(!0),delivery:ts("delivery").notNull().default("live"),status:ts("status").notNull().default("pending"),result:$_("result"),error:ts("error"),attempts:q_("attempts").notNull().default(0),taskKind:ts("task_kind"),payload:$_("payload"),claimedBy:ts("claimed_by"),claimedAt:ja("claimed_at",{withTimezone:!0}),leaseExpiresAt:ja("lease_expires_at",{withTimezone:!0}),leaseRecoveries:q_("lease_recoveries").notNull().default(0),createdAt:ja("created_at",{withTimezone:!0}).defaultNow(),updatedAt:ja("updated_at",{withTimezone:!0}).defaultNow(),completedAt:ja("completed_at",{withTimezone:!0})},e=>[zd("idx_session_send_jobs_user").on(e.userId),zd("idx_session_send_jobs_session").on(e.sessionId),zd("idx_session_send_jobs_status").on(e.status),zd("idx_session_send_jobs_pending").on(e.userId,e.status)])});import{pgTable as B_,text as ns,timestamp as Gd,jsonb as F_,uuid as oo,integer as xx,boolean as Tx,uniqueIndex as Rx,index as H_,primaryKey as kx}from"drizzle-orm/pg-core";var Le,De,W_=J(()=>{"use strict";Wn();Le=B_("packs",{id:oo("id").primaryKey().defaultRandom(),name:ns("name").notNull(),description:ns("description").notNull(),scope:ns("scope").notNull(),scopeRef:oo("scope_ref"),version:ns("version").notNull().default("1.0.0"),tags:ns("tags").array(),badge:ns("badge"),metadata:F_("metadata"),createdBy:oo("created_by"),createdAt:Gd("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Gd("updated_at",{withTimezone:!0}).defaultNow(),archived:Tx("archived").default(!1),archivedAt:Gd("archived_at",{withTimezone:!0}),archivedBy:oo("archived_by"),forkedFromId:oo("forked_from_id").references(()=>Le.id,{onDelete:"set null"}),upstreamVersion:ns("upstream_version")},e=>[Rx("packs_name_scope_ref_idx").on(e.name,e.scope,e.scopeRef),H_("idx_packs_scope").on(e.scope,e.scopeRef),H_("idx_packs_created_by").on(e.createdBy)]),De=B_("pack_instructions",{packId:oo("pack_id").references(()=>Le.id,{onDelete:"cascade"}).notNull(),instructionId:oo("instruction_id").references(()=>g.id,{onDelete:"cascade"}).notNull(),position:xx("position").notNull().default(0),slotOverrides:F_("slot_overrides"),addedAt:Gd("added_at",{withTimezone:!0}).defaultNow(),addedBy:oo("added_by")},e=>[kx({columns:[e.packId,e.instructionId]})])});import{pgTable as jx,text as um,timestamp as Nx,jsonb as Px,uuid as lm,index as Gs}from"drizzle-orm/pg-core";var so,z_=J(()=>{"use strict";Wn();so=jx("instruction_usage_events",{id:lm("id").primaryKey().defaultRandom(),instructionId:lm("instruction_id").references(()=>g.id,{onDelete:"set null"}),userId:lm("user_id").notNull(),surface:um("surface").notNull(),action:um("action").notNull(),metadata:Px("metadata"),traceId:um("trace_id"),createdAt:Nx("created_at",{withTimezone:!0}).defaultNow()},e=>[Gs("idx_usage_events_instruction").on(e.instructionId),Gs("idx_usage_events_user").on(e.userId),Gs("idx_usage_events_surface").on(e.surface),Gs("idx_usage_events_action").on(e.action),Gs("idx_usage_events_created_at").on(e.createdAt),Gs("idx_usage_events_user_created").on(e.userId,e.createdAt)])});import{pgTable as Cx,text as Kd,timestamp as V_,jsonb as Dx,uuid as J_,index as pm}from"drizzle-orm/pg-core";var fe,G_=J(()=>{"use strict";fe=Cx("worker_connections",{id:J_("id").primaryKey().defaultRandom(),userId:J_("user_id").notNull(),workerType:Kd("worker_type").notNull().default("mcp"),clientName:Kd("client_name").notNull(),clientVersion:Kd("client_version"),workerVersion:Kd("worker_version"),lastHeartbeat:V_("last_heartbeat",{withTimezone:!0}).notNull().defaultNow(),connectedAt:V_("connected_at",{withTimezone:!0}).notNull().defaultNow(),metadata:Dx("metadata")},e=>[pm("idx_worker_connections_user").on(e.userId),pm("idx_worker_connections_heartbeat").on(e.userId,e.lastHeartbeat),pm("idx_worker_connections_type").on(e.userId,e.workerType)])});import{pgTable as Ox,text as Yd,timestamp as Mx,jsonb as Lx,uuid as K_,index as Y_}from"drizzle-orm/pg-core";var Xd,X_=J(()=>{"use strict";Xd=Ox("cli_setup_events",{id:K_("id").primaryKey().defaultRandom(),userId:K_("user_id").notNull(),deviceId:Yd("device_id").notNull(),event:Yd("event").notNull(),cliVersion:Yd("cli_version"),os:Yd("os"),props:Lx("props").notNull().default({}),createdAt:Mx("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Y_("idx_cli_setup_events_user").on(e.userId,e.createdAt),Y_("idx_cli_setup_events_device").on(e.deviceId,e.createdAt)])});import{pgTable as $x,text as rs,integer as qx,boolean as Ux,timestamp as Hx,jsonb as Bx,uuid as Fx,index as Q_}from"drizzle-orm/pg-core";var Qd,Z_=J(()=>{"use strict";Qd=$x("cli_error_events",{id:Fx("id").primaryKey().defaultRandom(),deviceId:rs("device_id"),event:rs("event").notNull(),command:rs("command"),statusCode:qx("status_code"),message:rs("message"),cliVersion:rs("cli_version"),os:rs("os"),nodeVersion:rs("node_version"),proxied:Ux("proxied"),props:Bx("props").notNull().default({}),createdAt:Hx("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Q_("idx_cli_error_events_created").on(e.createdAt),Q_("idx_cli_error_events_device").on(e.deviceId,e.createdAt)])});import{sql as Wx}from"drizzle-orm";import{pgTable as os,text as wt,timestamp as cn,jsonb as Tn,uuid as pt,integer as Or,boolean as Na,index as Gt,unique as ey}from"drizzle-orm/pg-core";var k,Se,be,Xe,Je,pe,zn,Pa=J(()=>{"use strict";k=os("eval_targets",{id:pt("id").primaryKey().defaultRandom(),userId:pt("user_id").notNull(),name:wt("name").notNull(),type:wt("type").notNull(),content:wt("content").notNull(),description:wt("description").notNull().default(""),metadata:Tn("metadata").notNull().default({}),version:Or("version").notNull().default(1),parentId:pt("parent_id").references(()=>k.id,{onDelete:"set null"}),createdAt:cn("created_at",{withTimezone:!0}).defaultNow(),updatedAt:cn("updated_at",{withTimezone:!0}).defaultNow()},e=>[Gt("eval_targets_name_user_idx").on(e.name,e.userId),Gt("idx_eval_targets_user").on(e.userId),Gt("idx_eval_targets_type").on(e.type),Gt("idx_eval_targets_parent").on(e.parentId)]),Se=os("evals",{id:pt("id").primaryKey().defaultRandom(),evalTargetId:pt("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),name:wt("name").notNull(),prompt:wt("prompt").notNull(),expectedOutput:wt("expected_output").notNull().default(""),files:Tn("files").notNull().default([]),expectations:Tn("expectations").notNull().default([]),retiredAt:cn("retired_at",{withTimezone:!0}),retiredReason:wt("retired_reason"),createdAt:cn("created_at",{withTimezone:!0}).defaultNow(),updatedAt:cn("updated_at",{withTimezone:!0}).defaultNow(),contentUpdatedAt:cn("content_updated_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Gt("idx_evals_target").on(e.evalTargetId),Gt("idx_evals_target_active").on(e.evalTargetId).where(Wx`${e.retiredAt} IS NULL`)]),be=os("eval_runs",{id:pt("id").primaryKey().defaultRandom(),jobId:pt("job_id"),evalId:pt("eval_id").notNull().references(()=>Se.id,{onDelete:"cascade"}),evalTargetId:pt("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),evalTargetVersion:Or("eval_target_version").notNull(),configuration:wt("configuration").notNull(),runNumber:Or("run_number").notNull().default(1),iteration:Or("iteration").notNull().default(1),status:wt("status").notNull().default("completed"),outputs:Tn("outputs").notNull().default({}),timing:Tn("timing").notNull().default({}),grading:Tn("grading").notNull().default({}),comparison:Tn("comparison"),createdAt:cn("created_at",{withTimezone:!0}).defaultNow()},e=>[Gt("idx_eval_runs_eval").on(e.evalId),Gt("idx_eval_runs_target").on(e.evalTargetId),Gt("idx_eval_runs_iteration").on(e.evalTargetId,e.iteration)]),Xe=os("eval_comparisons",{id:pt("id").primaryKey().defaultRandom(),userId:pt("user_id").notNull(),targetAId:pt("target_a_id").notNull().references(()=>k.id,{onDelete:"cascade"}),targetBId:pt("target_b_id").notNull().references(()=>k.id,{onDelete:"cascade"}),targetAVersion:Or("target_a_version").notNull(),targetBVersion:Or("target_b_version").notNull(),isSwapped:Na("is_swapped").notNull().default(!1),winnerTargetId:pt("winner_target_id").references(()=>k.id,{onDelete:"set null"}),perEval:Tn("per_eval").notNull().default([]),overall:Tn("overall").notNull().default({}),rawOutput:wt("raw_output"),model:wt("model"),status:wt("status").notNull().default("completed"),createdAt:cn("created_at",{withTimezone:!0}).defaultNow()},e=>[Gt("idx_eval_comparisons_target_a").on(e.targetAId),Gt("idx_eval_comparisons_target_b").on(e.targetBId),Gt("idx_eval_comparisons_user").on(e.userId)]),Je=os("eval_grade_annotations",{id:pt("id").primaryKey().defaultRandom(),userId:pt("user_id").notNull(),evalRunId:pt("eval_run_id").notNull().references(()=>be.id,{onDelete:"cascade"}),evalTargetId:pt("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),expectationIndex:Or("expectation_index").notNull(),expectationText:wt("expectation_text").notNull(),judgePassed:Na("judge_passed").notNull(),judgeMethod:wt("judge_method").notNull(),judgeModel:wt("judge_model"),verdict:wt("verdict").notNull(),flag:wt("flag"),note:wt("note"),createdAt:cn("created_at",{withTimezone:!0}).defaultNow(),updatedAt:cn("updated_at",{withTimezone:!0}).defaultNow()},e=>[Gt("idx_eval_grade_annotations_target").on(e.evalTargetId),Gt("idx_eval_grade_annotations_run").on(e.evalRunId),ey("eval_grade_annotations_eval_run_id_expectation_index_key").on(e.evalRunId,e.expectationIndex)]),pe=os("judge_reviewer_verdicts",{id:pt("id").primaryKey().defaultRandom(),userId:pt("user_id").notNull(),evalTargetId:pt("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),evalRunId:pt("eval_run_id").notNull().references(()=>be.id,{onDelete:"cascade"}),expectationIndex:Or("expectation_index").notNull(),expectationText:wt("expectation_text").notNull(),judgePassed:Na("judge_passed").notNull(),humanPassed:Na("human_passed").notNull(),reviewerEngine:wt("reviewer_engine").notNull(),reviewerModel:wt("reviewer_model").notNull(),reviewerPassed:Na("reviewer_passed").notNull(),resolvedAt:cn("resolved_at",{withTimezone:!0}),resolution:wt("resolution"),createdAt:cn("created_at",{withTimezone:!0}).defaultNow(),updatedAt:cn("updated_at",{withTimezone:!0}).defaultNow()},e=>[Gt("idx_jrv_target").on(e.evalTargetId),ey("judge_reviewer_verdicts_eval_run_id_expectation_index_review_key").on(e.evalRunId,e.expectationIndex,e.reviewerModel)]),zn=os("benchmarks",{id:pt("id").primaryKey().defaultRandom(),evalTargetId:pt("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),iteration:Or("iteration").notNull().default(1),runSummary:Tn("run_summary").notNull().default({}),notes:Tn("notes").notNull().default([]),feedback:Tn("feedback"),createdAt:cn("created_at",{withTimezone:!0}).defaultNow()},e=>[Gt("idx_benchmarks_target").on(e.evalTargetId)])});import{sql as mm}from"drizzle-orm";import{pgTable as zx,text as Mr,timestamp as Vx,jsonb as Zd,uuid as eu,boolean as Jx,index as Ca,uniqueIndex as Gx}from"drizzle-orm/pg-core";var ie,ty=J(()=>{"use strict";Pa();Wn();ie=zx("instruction_promotions",{id:eu("id").primaryKey().defaultRandom(),userId:eu("user_id").notNull(),evalTargetId:eu("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),instructionId:eu("instruction_id").references(()=>g.id,{onDelete:"set null"}),fromContentHash:Mr("from_content_hash").notNull(),toContentHash:Mr("to_content_hash").notNull(),fromContent:Mr("from_content").notNull(),toContent:Mr("to_content").notNull(),proposalSource:Mr("proposal_source").notNull(),proposalRationale:Mr("proposal_rationale").notNull().default(""),decision:Mr("decision").notNull(),applied:Jx("applied").notNull().default(!1),refusals:Zd("refusals").notNull().default([]),rationale:Mr("rationale").notNull().default(""),effectClass:Mr("effect_class").notNull(),verdict:Zd("verdict").notNull().default({}),gates:Zd("gates").notNull().default({}),touchedSections:Zd("touched_sections").notNull().default([]),createdAt:Vx("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Ca("idx_instruction_promotions_budget").on(e.evalTargetId,e.createdAt.desc()).where(mm`${e.applied}`),Ca("idx_instruction_promotions_target").on(e.evalTargetId,e.createdAt.desc()),Ca("idx_instruction_promotions_user").on(e.userId,e.createdAt.desc()),Ca("idx_instruction_promotions_to_hash").on(e.toContentHash),Gx("uq_instruction_promotions_applied").on(e.evalTargetId,e.fromContentHash,e.toContentHash).where(mm`${e.applied}`),Ca("idx_instruction_promotions_applied_hash").on(e.toContentHash,e.createdAt.desc()).where(mm`${e.applied}`)])});import{pgTable as Kx,text as io,timestamp as Yx,jsonb as Da,uuid as fm,integer as gm,real as Xx,index as Oa,uniqueIndex as ny}from"drizzle-orm/pg-core";var L,ry=J(()=>{"use strict";Fs();Ft();L=Kx("context_snapshots",{id:fm("id").primaryKey().defaultRandom(),sessionId:fm("session_id").references(()=>_.id,{onDelete:"cascade"}),userId:fm("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),sequence:gm("sequence").notNull().default(0),provider:io("provider").notNull(),model:io("model").notNull(),systemPrompt:io("system_prompt").notNull(),injectedInstructions:Da("injected_instructions").notNull().default([]),messagesSummary:Da("messages_summary").notNull(),tools:Da("tools").notNull().default([]),systemHash:io("system_hash").notNull(),requestHash:io("request_hash").notNull().default(""),toolsHash:io("tools_hash"),injectedHash:io("injected_hash"),messagesDelta:Da("messages_delta").default([]),messagesDeltaRef:io("messages_delta_ref"),maxTokens:gm("max_tokens"),temperature:Xx("temperature"),estimatedTokens:gm("estimated_tokens"),capturedAt:Yx("captured_at",{withTimezone:!0}).notNull().defaultNow(),metadata:Da("metadata").default({})},e=>[Oa("idx_context_snapshots_session").on(e.sessionId),Oa("idx_context_snapshots_user").on(e.userId),Oa("idx_context_snapshots_hash").on(e.systemHash),Oa("idx_context_snapshots_request_hash").on(e.requestHash),ny("idx_snapshots_session_request").on(e.sessionId,e.requestHash),ny("idx_snapshots_session_sequence").on(e.sessionId,e.sequence),Oa("idx_context_snapshots_user_session_captured").on(e.userId,e.sessionId,e.capturedAt.desc())])});import{pgTable as Qx,text as oy,timestamp as Zx,jsonb as eT,integer as tT,index as nT}from"drizzle-orm/pg-core";var _n,sy=J(()=>{"use strict";_n=Qx("content_blobs",{hash:oy("hash").primaryKey(),contentType:oy("content_type").notNull(),content:eT("content").notNull(),sizeBytes:tT("size_bytes").notNull().default(0),createdAt:Zx("created_at",{withTimezone:!0}).defaultNow()},e=>[nT("idx_content_blobs_type").on(e.contentType)])});import{pgTable as rT,text as tu,timestamp as Ma,jsonb as nu,uuid as hm,index as ru,integer as iy}from"drizzle-orm/pg-core";var ke,ay=J(()=>{"use strict";Pa();ke=rT("eval_jobs",{id:hm("id").primaryKey().defaultRandom(),userId:hm("user_id").notNull(),evalTargetId:hm("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),status:tu("status").notNull().default("pending"),config:nu("config").notNull().default({}),progress:nu("progress").notNull().default({}),result:nu("result"),error:tu("error"),attempts:iy("attempts").notNull().default(0),taskKind:tu("task_kind"),payload:nu("payload"),claimedBy:tu("claimed_by"),claimedAt:Ma("claimed_at",{withTimezone:!0}),leaseExpiresAt:Ma("lease_expires_at",{withTimezone:!0}),leaseRecoveries:iy("lease_recoveries").notNull().default(0),createdAt:Ma("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Ma("updated_at",{withTimezone:!0}).defaultNow(),completedAt:Ma("completed_at",{withTimezone:!0})},e=>[ru("idx_eval_jobs_user").on(e.userId),ru("idx_eval_jobs_target").on(e.evalTargetId),ru("idx_eval_jobs_status").on(e.status),ru("idx_eval_jobs_pending").on(e.userId,e.status)])});import{pgTable as oT,text as La,timestamp as $a,jsonb as cy,uuid as dy,integer as uy,index as ly}from"drizzle-orm/pg-core";var je,py=J(()=>{"use strict";je=oT("agent_jobs",{id:dy("id").primaryKey().defaultRandom(),userId:dy("user_id").notNull(),taskKind:La("task_kind").notNull(),status:La("status").notNull().default("pending"),payload:cy("payload").notNull(),dedupeKey:La("dedupe_key"),result:cy("result"),error:La("error"),attempts:uy("attempts").notNull().default(0),claimedBy:La("claimed_by"),claimedAt:$a("claimed_at",{withTimezone:!0}),leaseExpiresAt:$a("lease_expires_at",{withTimezone:!0}),leaseRecoveries:uy("lease_recoveries").notNull().default(0),createdAt:$a("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:$a("updated_at",{withTimezone:!0}).notNull().defaultNow(),completedAt:$a("completed_at",{withTimezone:!0})},e=>[ly("idx_agent_jobs_claim").on(e.userId,e.status,e.taskKind,e.createdAt),ly("idx_agent_jobs_dedupe").on(e.userId,e.taskKind,e.dedupeKey)])});import{pgTable as sT,text as qa,timestamp as Ua,jsonb as ou,uuid as _m,index as su,integer as my}from"drizzle-orm/pg-core";var W,fy=J(()=>{"use strict";Pr();W=sT("insights_jobs",{id:_m("id").primaryKey().defaultRandom(),userId:_m("user_id").notNull(),status:qa("status").notNull().default("pending"),projectPath:qa("project_path"),projectId:_m("project_id").references(()=>U.id,{onDelete:"set null"}),config:ou("config").notNull().default({}),progress:ou("progress").notNull().default({}),result:ou("result"),error:qa("error"),attempts:my("attempts").notNull().default(0),taskKind:qa("task_kind"),payload:ou("payload"),claimedBy:qa("claimed_by"),claimedAt:Ua("claimed_at",{withTimezone:!0}),leaseExpiresAt:Ua("lease_expires_at",{withTimezone:!0}),leaseRecoveries:my("lease_recoveries").notNull().default(0),createdAt:Ua("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Ua("updated_at",{withTimezone:!0}).defaultNow(),completedAt:Ua("completed_at",{withTimezone:!0})},e=>[su("idx_insights_jobs_user").on(e.userId),su("idx_insights_jobs_status").on(e.status),su("idx_insights_jobs_pending").on(e.userId,e.status),su("idx_insights_jobs_project").on(e.projectId)])});import{pgTable as iT,text as ym,timestamp as iu,uuid as gy,index as aT,uniqueIndex as cT}from"drizzle-orm/pg-core";var Ae,hy=J(()=>{"use strict";Ft();Ae=iT("api_keys",{id:gy("id").primaryKey().defaultRandom(),userId:gy("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),name:ym("name").notNull(),keyHash:ym("key_hash").notNull(),keyPrefix:ym("key_prefix").notNull(),lastUsedAt:iu("last_used_at",{withTimezone:!0}),expiresAt:iu("expires_at",{withTimezone:!0}),revokedAt:iu("revoked_at",{withTimezone:!0}),createdAt:iu("created_at",{withTimezone:!0}).defaultNow()},e=>[aT("idx_api_keys_user").on(e.userId),cT("idx_api_keys_hash").on(e.keyHash)])});import{pgTable as dT,text as wm,timestamp as _y,uuid as uT,index as lT}from"drizzle-orm/pg-core";var Rn,yy=J(()=>{"use strict";Ft();Rn=dT("extension_auth_codes",{code:wm("code").primaryKey(),userId:uT("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),editor:wm("editor"),email:wm("email"),expiresAt:_y("expires_at",{withTimezone:!0}).notNull(),createdAt:_y("created_at",{withTimezone:!0}).defaultNow()},e=>[lT("idx_ext_auth_codes_expiry").on(e.expiresAt)])});import{pgTable as pT,text as mT,timestamp as wy,jsonb as fT,uuid as vm,index as vy}from"drizzle-orm/pg-core";var $e,Iy=J(()=>{"use strict";Pa();$e=pT("eval_conversations",{id:vm("id").primaryKey().defaultRandom(),evalTargetId:vm("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),userId:vm("user_id").notNull(),messages:fT("messages").notNull().default([]),status:mT("status").notNull().default("active"),createdAt:wy("created_at",{withTimezone:!0}).defaultNow(),updatedAt:wy("updated_at",{withTimezone:!0}).defaultNow()},e=>[vy("idx_eval_conversations_target").on(e.evalTargetId),vy("idx_eval_conversations_user").on(e.userId)])});import{pgTable as gT,text as Lr,timestamp as by,jsonb as hT,uuid as Im}from"drizzle-orm/pg-core";var ao,Sy=J(()=>{"use strict";ao=gT("skill_submissions",{id:Im("id").primaryKey().defaultRandom(),skillId:Lr("skill_id").notNull(),name:Lr("name").notNull(),description:Lr("description").notNull(),category:Lr("category").notNull(),tools:Lr("tools").array().notNull(),tags:Lr("tags").array().default([]),content:Lr("content").notNull(),status:Lr("status").notNull().default("pending"),submittedBy:Im("submitted_by").notNull(),reviewedBy:Im("reviewed_by"),reviewNote:Lr("review_note"),metadata:hT("metadata"),createdAt:by("created_at",{withTimezone:!0}).defaultNow(),updatedAt:by("updated_at",{withTimezone:!0}).defaultNow()})});import{pgTable as _T,text as Ha,timestamp as Ay,jsonb as yT,uuid as wT,uniqueIndex as vT,index as Ey}from"drizzle-orm/pg-core";var Pt,xy=J(()=>{"use strict";Pt=_T("harness_releases",{id:wT("id").primaryKey().defaultRandom(),harness:Ha("harness").notNull(),version:Ha("version").notNull(),publishedAt:Ay("published_at",{withTimezone:!0}).notNull(),title:Ha("title"),body:Ha("body"),categories:yT("categories").default({}),url:Ha("url"),createdAt:Ay("created_at",{withTimezone:!0}).defaultNow()},e=>[vT("idx_harness_releases_unique").on(e.harness,e.version),Ey("idx_harness_releases_harness").on(e.harness),Ey("idx_harness_releases_published").on(e.publishedAt)])});import{pgTable as IT,text as Ks,timestamp as Ty,jsonb as bT,uuid as Ry,index as ky,uniqueIndex as ST}from"drizzle-orm/pg-core";var bt,jy=J(()=>{"use strict";bt=IT("notifications",{id:Ry("id").primaryKey().defaultRandom(),userId:Ry("user_id").notNull(),type:Ks("type").notNull(),title:Ks("title").notNull(),body:Ks("body"),url:Ks("url"),sourceTable:Ks("source_table"),sourceId:Ks("source_id"),metadata:bT("metadata").notNull().default({}),readAt:Ty("read_at",{withTimezone:!0}),createdAt:Ty("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[ky("idx_notifications_user_created").on(e.userId,e.createdAt),ky("idx_notifications_user_unread").on(e.userId),ST("idx_notifications_source_dedup").on(e.userId,e.sourceTable,e.sourceId)])});import{pgTable as AT,text as Ba,timestamp as Fa,jsonb as bm,uuid as Sm,index as au,integer as Ny}from"drizzle-orm/pg-core";var ce,Py=J(()=>{"use strict";Ld();ce=AT("launch_jobs",{id:Sm("id").primaryKey().defaultRandom(),userId:Sm("user_id").notNull(),tool:Ba("tool").notNull(),status:Ba("status").notNull().default("pending"),config:bm("config").notNull().default({}),result:bm("result"),error:Ba("error"),attempts:Ny("attempts").notNull().default(0),taskKind:Ba("task_kind"),payload:bm("payload"),claimedBy:Ba("claimed_by"),claimedAt:Fa("claimed_at",{withTimezone:!0}),leaseExpiresAt:Fa("lease_expires_at",{withTimezone:!0}),leaseRecoveries:Ny("lease_recoveries").notNull().default(0),createdAt:Fa("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Fa("updated_at",{withTimezone:!0}).defaultNow(),completedAt:Fa("completed_at",{withTimezone:!0}),runId:Sm("run_id").references(()=>X.id,{onDelete:"set null"})},e=>[au("idx_launch_jobs_user").on(e.userId),au("idx_launch_jobs_status").on(e.status),au("idx_launch_jobs_pending").on(e.userId,e.status),au("idx_launch_jobs_run").on(e.runId)])});import{pgTable as Cy,uuid as $r,text as co,real as ET,timestamp as Wa,boolean as xT,uniqueIndex as TT,index as za}from"drizzle-orm/pg-core";var cu,x,tt,Dy=J(()=>{"use strict";Ft();Wn();Pr();cu=["add","remove","trim"],x=Cy("instruction_suggestions",{id:$r("id").primaryKey().defaultRandom(),userId:$r("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),instructionId:$r("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),projectPath:co("project_path").notNull(),projectId:$r("project_id").references(()=>U.id,{onDelete:"set null"}),score:ET("score").notNull(),reason:co("reason").notNull(),kind:co("kind").$type().notNull().default("add"),generatedAt:Wa("generated_at",{withTimezone:!0}).notNull().defaultNow(),isStale:xT("is_stale").notNull().default(!1),dismissedAt:Wa("dismissed_at",{withTimezone:!0}),acceptedAt:Wa("accepted_at",{withTimezone:!0}),declinedAt:Wa("declined_at",{withTimezone:!0}),declinedReason:co("declined_reason"),promotedToInstructionId:$r("promoted_to_instruction_id").references(()=>g.id,{onDelete:"set null"})},e=>[TT("idx_instruction_suggestions_user_project_instruction_kind").on(e.userId,e.projectPath,e.instructionId,e.kind),za("idx_instruction_suggestions_user_project").on(e.userId,e.projectPath),za("idx_instruction_suggestions_user_proj_id").on(e.userId,e.projectId),za("idx_instruction_suggestions_generated_at").on(e.generatedAt)]),tt=Cy("instruction_suggestion_events",{id:$r("id").primaryKey().defaultRandom(),suggestionId:$r("suggestion_id").notNull().references(()=>x.id,{onDelete:"cascade"}),userId:$r("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),eventType:co("event_type").notNull(),tool:co("tool"),sessionId:$r("session_id"),projectPath:co("project_path").notNull(),actor:co("actor"),createdAt:Wa("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[za("idx_instruction_suggestion_events_suggestion_id").on(e.suggestionId),za("idx_instruction_suggestion_events_user_id").on(e.userId)])});import{pgTable as RT,text as Am,integer as kT,numeric as Va,timestamp as Em,index as jT,primaryKey as NT}from"drizzle-orm/pg-core";var Qe,Oy=J(()=>{"use strict";Qe=RT("model_pricing",{provider:Am("provider").notNull(),modelId:Am("model_id").notNull(),inputPerM:Va("input_per_m").notNull(),outputPerM:Va("output_per_m").notNull(),cacheReadPerM:Va("cache_read_per_m").notNull(),cacheWrite5mPerM:Va("cache_write_5m_per_m").notNull(),cacheWrite1hPerM:Va("cache_write_1h_per_m").notNull(),contextWindow:kT("context_window"),effectiveFrom:Em("effective_from",{withTimezone:!0}).notNull(),effectiveUntil:Em("effective_until",{withTimezone:!0}),source:Am("source").notNull(),verifiedAt:Em("verified_at",{withTimezone:!0})},e=>[NT({columns:[e.provider,e.modelId,e.effectiveFrom]}),jT("idx_model_pricing_active").on(e.provider,e.modelId,e.effectiveFrom.desc())])});import{pgTable as PT,text as ss,numeric as My,timestamp as Ly,uuid as $y,jsonb as CT,index as qy}from"drizzle-orm/pg-core";var we,Uy=J(()=>{"use strict";we=PT("limit_observations",{id:$y("id").primaryKey().defaultRandom(),observedAt:Ly("observed_at",{withTimezone:!0}).notNull().defaultNow(),provider:ss("provider").notNull(),plan:ss("plan").notNull(),limitType:ss("limit_type").notNull(),value:My("value").notNull(),unit:ss("unit").notNull(),comparator:ss("comparator").notNull().default("="),resetsAt:Ly("resets_at",{withTimezone:!0}),sourceType:ss("source_type").notNull(),sourceUrl:ss("source_url"),sourceEvidence:CT("source_evidence"),confidence:My("confidence").notNull(),userId:$y("user_id")},e=>[qy("idx_limit_obs_lookup").on(e.provider,e.plan,e.limitType,e.observedAt.desc()),qy("idx_limit_obs_user").on(e.userId,e.observedAt.desc())])});import{pgTable as DT,text as du,timestamp as OT,uuid as MT,jsonb as LT,boolean as $T,uniqueIndex as qT}from"drizzle-orm/pg-core";var xt,Hy=J(()=>{"use strict";xt=DT("provider_docs_snapshots",{id:MT("id").primaryKey().defaultRandom(),fetchedAt:OT("fetched_at",{withTimezone:!0}).notNull().defaultNow(),provider:du("provider").notNull(),docUrl:du("doc_url").notNull(),contentHash:du("content_hash").notNull(),content:du("content").notNull(),parseSuccess:$T("parse_success").notNull(),parseErrors:LT("parse_errors")},e=>[qT("idx_docs_dedup").on(e.provider,e.docUrl,e.contentHash)])});import{pgTable as UT,text as uu,numeric as By,timestamp as Fy,uuid as HT,primaryKey as BT,index as FT}from"drizzle-orm/pg-core";var Ge,Wy=J(()=>{"use strict";Ge=UT("plan_limits_active",{provider:uu("provider").notNull(),plan:uu("plan").notNull(),limitType:uu("limit_type").notNull(),value:By("value").notNull(),unit:uu("unit").notNull(),effectiveFrom:Fy("effective_from",{withTimezone:!0}).notNull(),effectiveUntil:Fy("effective_until",{withTimezone:!0}),confidence:By("confidence").notNull(),sourceObservationIds:HT("source_observation_ids").array().notNull()},e=>[BT({columns:[e.provider,e.plan,e.limitType,e.effectiveFrom]}),FT("idx_plan_limits_lookup").on(e.provider,e.plan,e.limitType,e.effectiveFrom.desc())])});import{pgTable as WT,text as xm,timestamp as zT,uuid as zy,jsonb as VT,index as JT}from"drizzle-orm/pg-core";var yn,Vy=J(()=>{"use strict";yn=WT("alert_dispatches",{id:zy("id").primaryKey().defaultRandom(),userId:zy("user_id").notNull(),alertKey:xm("alert_key").notNull(),severity:xm("severity").notNull(),lastDispatchedAt:zT("last_dispatched_at",{withTimezone:!0}).notNull().defaultNow(),lastState:VT("last_state").notNull(),channel:xm("channel").notNull()},e=>[JT("idx_alert_user_key").on(e.userId,e.alertKey,e.lastDispatchedAt.desc())])});import{boolean as GT,date as KT,index as Tm,integer as YT,jsonb as XT,pgTable as Rm,text as Vn,timestamp as uo,uniqueIndex as QT,uuid as Ys}from"drizzle-orm/pg-core";var Oe,St,At,Jy=J(()=>{"use strict";Oe=Rm("announcements",{id:Ys("id").primaryKey().defaultRandom(),version:Vn("version").notNull().unique(),releaseDate:KT("release_date").notNull(),subject:Vn("subject").notNull(),htmlBody:Vn("html_body").notNull(),textBody:Vn("text_body").notNull(),sections:XT("sections").notNull().default({}),status:Vn("status").notNull().default("draft"),recipientCount:YT("recipient_count"),sentAt:uo("sent_at",{withTimezone:!0}),sentBy:Ys("sent_by"),error:Vn("error"),createdAt:uo("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:uo("updated_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Tm("idx_announcements_status").on(e.status),Tm("idx_announcements_created").on(e.createdAt)]),St=Rm("announcement_deliveries",{id:Ys("id").primaryKey().defaultRandom(),announcementId:Ys("announcement_id").notNull(),userId:Ys("user_id").notNull(),email:Vn("email").notNull(),status:Vn("status").notNull().default("pending"),providerId:Vn("provider_id"),error:Vn("error"),sentAt:uo("sent_at",{withTimezone:!0}),createdAt:uo("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[QT("uniq_announcement_deliveries_announcement_user").on(e.announcementId,e.userId),Tm("idx_announcement_deliveries_user").on(e.userId,e.createdAt)]),At=Rm("notification_preferences",{userId:Ys("user_id").primaryKey(),productAnnouncements:GT("product_announcements").notNull().default(!0),unsubscribeToken:Vn("unsubscribe_token").notNull().unique(),unsubscribedAt:uo("unsubscribed_at",{withTimezone:!0}),createdAt:uo("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:uo("updated_at",{withTimezone:!0}).notNull().defaultNow()})});import{pgTable as ZT,text as km,timestamp as Gy,uuid as jm,integer as eR,index as tR,unique as nR}from"drizzle-orm/pg-core";var Ky,Yy=J(()=>{"use strict";Ky=ZT("scaffolding_fingerprints",{id:jm("id").primaryKey().defaultRandom(),userId:jm("user_id").notNull(),harness:km("harness").notNull(),model:km("model").notNull(),toolsHash:km("tools_hash").notNull(),firstSeenAt:Gy("first_seen_at",{withTimezone:!0}).notNull().defaultNow(),lastSeenAt:Gy("last_seen_at",{withTimezone:!0}).notNull().defaultNow(),snapshotCount:eR("snapshot_count").notNull().default(1),firstSessionId:jm("first_session_id")},e=>[nR("scaffolding_fingerprints_user_id_harness_model_tools_hash_key").on(e.userId,e.harness,e.model,e.toolsHash),tR("idx_scaffolding_fp_segment").on(e.userId,e.harness,e.model)])});import{pgTable as rR,text as Nm,timestamp as oR,jsonb as sR,uuid as Xy,integer as iR,unique as aR}from"drizzle-orm/pg-core";var Qy,Zy=J(()=>{"use strict";Qy=rR("scaffolding_segments",{id:Xy("id").primaryKey().defaultRandom(),userId:Xy("user_id").notNull(),harness:Nm("harness").notNull(),model:Nm("model").notNull(),coreNames:sR("core_names").notNull(),coreHash:Nm("core_hash").notNull(),activeFingerprints:iR("active_fingerprints").notNull(),computedAt:oR("computed_at",{withTimezone:!0}).notNull().defaultNow()},e=>[aR("scaffolding_segments_user_id_harness_model_key").on(e.userId,e.harness,e.model)])});var Pm=J(()=>{"use strict";Ft();Xo();h_();Wn();y_();Pr();Fs();E_();T_();Qp();N_();P_();om();M_();Ld();dm();U_();W_();z_();G_();X_();Z_();Pa();ty();ry();sy();ay();py();fy();hy();yy();Iy();Sy();xy();jy();Py();Dy();Oy();Uy();Hy();Wy();Vy();Jy();Yy();Zy()});import{relations as We}from"drizzle-orm";var cR,dR,uR,lR,pR,mR,fR,gR,hR,_R,yR,wR,vR,IR,bR,SR,AR,ER,xR,TR,RR,kR,jR,NR,PR,CR,DR,OR,MR,LR,ew=J(()=>{"use strict";Pm();cR=We(T,({many:e})=>({sessions:e(_),contextSnapshots:e(L),apiKeys:e(Ae)})),dR=We(Ae,({one:e})=>({profile:e(T,{fields:[Ae.userId],references:[T.id]})})),uR=We(G,({many:e})=>({teams:e(K),userOrganizations:e(Q),projects:e(U),invitations:e(ae)})),lR=We(K,({one:e,many:t})=>({organization:e(G,{fields:[K.orgId],references:[G.id]}),userTeams:t(ye),invitations:t(ae)})),pR=We(ae,({one:e})=>({organization:e(G,{fields:[ae.orgId],references:[G.id]}),team:e(K,{fields:[ae.teamId],references:[K.id]}),inviter:e(T,{fields:[ae.invitedBy],references:[T.id]})})),mR=We(Q,({one:e})=>({organization:e(G,{fields:[Q.orgId],references:[G.id]})})),fR=We(ye,({one:e})=>({team:e(K,{fields:[ye.teamId],references:[K.id]})})),gR=We(g,({one:e,many:t})=>({versions:t(Ie),projectInstructions:t(at),events:t(Ct),usageEvents:t(so),sessionInstructions:t(se),packInstructions:t(De),forkedFrom:e(g,{fields:[g.forkedFromId],references:[g.id]})})),hR=We(Ct,({one:e})=>({instruction:e(g,{fields:[Ct.instructionId],references:[g.id]})})),_R=We(F,({one:e,many:t})=>({project:e(U,{fields:[F.projectId],references:[U.id]}),parent:e(F,{fields:[F.parentId],references:[F.id]}),versions:t(F)})),yR=We(Ie,({one:e})=>({instruction:e(g,{fields:[Ie.instructionId],references:[g.id]})})),wR=We(U,({one:e,many:t})=>({organization:e(G,{fields:[U.orgId],references:[G.id]}),projectInstructions:t(at),sessions:t(_)})),vR=We(at,({one:e})=>({project:e(U,{fields:[at.projectId],references:[U.id]}),instruction:e(g,{fields:[at.instructionId],references:[g.id]})})),IR=We(_,({one:e,many:t})=>({profile:e(T,{fields:[_.userId],references:[T.id]}),project:e(U,{fields:[_.projectId],references:[U.id]}),run:e(X,{fields:[_.runId],references:[X.id]}),events:t(qe),sessionInstructions:t(se),treatmentExposures:t(Z),contextSnapshots:t(L)})),bR=We(X,({one:e,many:t})=>({profile:e(T,{fields:[X.userId],references:[T.id]}),organization:e(G,{fields:[X.orgId],references:[G.id]}),project:e(U,{fields:[X.projectId],references:[U.id]}),sessions:t(_),launchJobs:t(ce)})),SR=We(ce,({one:e})=>({run:e(X,{fields:[ce.runId],references:[X.id]})})),AR=We(qe,({one:e})=>({session:e(_,{fields:[qe.sessionId],references:[_.id]})})),ER=We(se,({one:e})=>({session:e(_,{fields:[se.sessionId],references:[_.id]}),instruction:e(g,{fields:[se.instructionId],references:[g.id]})})),xR=We(jt,({one:e,many:t})=>({owner:e(T,{fields:[jt.userId],references:[T.id]}),project:e(U,{fields:[jt.projectId],references:[U.id]}),exposures:t(Z)})),TR=We(Z,({one:e})=>({session:e(_,{fields:[Z.sessionId],references:[_.id]}),owner:e(T,{fields:[Z.userId],references:[T.id]}),assignment:e(jt,{fields:[Z.assignmentId],references:[jt.id]})})),RR=We(Le,({one:e,many:t})=>({packInstructions:t(De),forkedFrom:e(Le,{fields:[Le.forkedFromId],references:[Le.id]})})),kR=We(De,({one:e})=>({pack:e(Le,{fields:[De.packId],references:[Le.id]}),instruction:e(g,{fields:[De.instructionId],references:[g.id]})})),jR=We(so,({one:e})=>({instruction:e(g,{fields:[so.instructionId],references:[g.id]})})),NR=We(k,({one:e,many:t})=>({parent:e(k,{fields:[k.parentId],references:[k.id]}),evals:t(Se),evalRuns:t(be),benchmarks:t(zn),evalJobs:t(ke),evalConversations:t($e)})),PR=We(Se,({one:e,many:t})=>({evalTarget:e(k,{fields:[Se.evalTargetId],references:[k.id]}),runs:t(be)})),CR=We(be,({one:e})=>({eval:e(Se,{fields:[be.evalId],references:[Se.id]}),evalTarget:e(k,{fields:[be.evalTargetId],references:[k.id]})})),DR=We(zn,({one:e})=>({evalTarget:e(k,{fields:[zn.evalTargetId],references:[k.id]})})),OR=We(ke,({one:e})=>({evalTarget:e(k,{fields:[ke.evalTargetId],references:[k.id]})})),MR=We($e,({one:e})=>({evalTarget:e(k,{fields:[$e.evalTargetId],references:[k.id]})})),LR=We(L,({one:e})=>({session:e(_,{fields:[L.sessionId],references:[_.id]}),profile:e(T,{fields:[L.userId],references:[T.id]})}))});var lu={};to(lu,{SUGGESTION_KINDS:()=>cu,agentJobs:()=>je,agentRuns:()=>X,agentRunsRelations:()=>bR,alertDispatches:()=>yn,announcementDeliveries:()=>St,announcements:()=>Oe,apiKeys:()=>Ae,apiKeysRelations:()=>dR,benchmarks:()=>zn,benchmarksRelations:()=>DR,cliErrorEvents:()=>Qd,cliSetupEvents:()=>Xd,contentBlobs:()=>_n,contextSnapshots:()=>L,contextSnapshotsRelations:()=>LR,evalComparisons:()=>Xe,evalConversations:()=>$e,evalConversationsRelations:()=>MR,evalGradeAnnotations:()=>Je,evalJobs:()=>ke,evalJobsRelations:()=>OR,evalRuns:()=>be,evalRunsRelations:()=>CR,evalTargets:()=>k,evalTargetsRelations:()=>NR,evals:()=>Se,evalsRelations:()=>PR,extensionAuthCodes:()=>Rn,harnessReleases:()=>Pt,insightRecommendationLog:()=>Ee,insightsJobs:()=>W,instructionEvents:()=>Ct,instructionEventsRelations:()=>hR,instructionExperimentArms:()=>Dr,instructionExperiments:()=>q,instructionPromotions:()=>ie,instructionSuggestionEvents:()=>tt,instructionSuggestions:()=>x,instructionUsageEvents:()=>so,instructionUsageEventsRelations:()=>jR,instructionVerdicts:()=>Y,instructionVersionIdentities:()=>sr,instructionVersions:()=>Ie,instructionVersionsRelations:()=>yR,instructions:()=>g,instructionsRelations:()=>gR,judgeReviewerVerdicts:()=>pe,launchJobs:()=>ce,launchJobsRelations:()=>SR,limitObservations:()=>we,memories:()=>F,memoriesRelations:()=>_R,memoryExperiments:()=>Nt,modelPricing:()=>Qe,notificationPreferences:()=>At,notifications:()=>bt,orgInvitations:()=>ae,orgInvitationsRelations:()=>pR,organizations:()=>G,organizationsRelations:()=>uR,packInstructions:()=>De,packInstructionsRelations:()=>kR,packs:()=>Le,packsRelations:()=>RR,pendingTreatmentExposures:()=>Hd,planLimitsActive:()=>Ge,profiles:()=>T,profilesRelations:()=>cR,projectCheckouts:()=>le,projectInstructions:()=>at,projectInstructionsRelations:()=>vR,projects:()=>U,projectsRelations:()=>wR,providerDocsSnapshots:()=>xt,scaffoldingFingerprints:()=>Ky,scaffoldingSegments:()=>Qy,sessionEvents:()=>qe,sessionEventsRelations:()=>AR,sessionInstructions:()=>se,sessionInstructionsRelations:()=>ER,sessionSendJobs:()=>Jd,sessionTerminalTargets:()=>Ve,sessions:()=>_,sessionsRelations:()=>IR,skillSubmissions:()=>ao,teams:()=>K,teamsRelations:()=>lR,treatmentAssignments:()=>jt,treatmentAssignmentsRelations:()=>xR,treatmentExposures:()=>Z,treatmentExposuresRelations:()=>TR,userOrganizations:()=>Q,userOrganizationsRelations:()=>mR,userTeams:()=>ye,userTeamsRelations:()=>fR,workerConnections:()=>fe});var pu=J(()=>{"use strict";Pm();ew()});function Mm(){is++,is>Cm&&(Cm=is)}function Lm(){is>0&&is--}function $m(){Xs++,Xs>Dm&&(Dm=Xs)}function qm(){Xs>0&&Xs--}function Ja(){return is}function Um(){tw++}function Ga(){nw++}function rw(){Om++}function Hm(){let e=Om;return Om=0,e}function Bm(){return{current:is,peak:Cm,heavyCurrent:Xs,heavyPeak:Dm,shedCount:tw,ingestShedCount:nw}}function Qs(){let e=Number(process.env.PG_INFLIGHT_MAX);return Number.isFinite(e)&&e>0?e:(Number(process.env.PG_POOL_MAX)||3)*4}function Ka(){let e=Qs(),t=Number(process.env.PG_INGEST_INFLIGHT_MAX);if(Number.isFinite(t)&&t>0)return Math.min(t,e);let n=Number(process.env.PG_POOL_MAX)||3;return Math.min(e,Math.max(n,Math.floor(e/2)))}var is,Cm,Xs,Dm,tw,nw,Om,Fm=J(()=>{"use strict";is=0,Cm=0,Xs=0,Dm=0,tw=0,nw=0,Om=0;d(Mm,"trackDbOpStart");d(Lm,"trackDbOpEnd");d($m,"trackHeavyDbOpStart");d(qm,"trackHeavyDbOpEnd");d(Ja,"getDbLoad");d(Um,"recordDbShed");d(Ga,"recordIngestShed");d(rw,"recordQueryDeadline");d(Hm,"consumeDeadlineCount");d(Bm,"getDbLoadStats");d(Qs,"dbInflightMax");d(Ka,"dbIngestInflightMax")});import{drizzle as ow}from"drizzle-orm/postgres-js";import Wm from"postgres";function zm(e){let t=process.env[e];if(!t)throw new Error(`Missing required env var: ${e}`);return t}function sw(){if(Qa)throw new Error("getDb() called after closeDb(): the connection pool is closed for shutdown. Stop issuing queries (timers/requests) before draining the pool.");if(!Xa){let e=process.env.PG_APPLICATION_NAME||"rulemetric",t=Number(process.env.PG_POOL_MAX)||3,n=Number(process.env.PG_CONNECT_TIMEOUT_S)||10,r=Number(process.env.PG_STATEMENT_TIMEOUT_MS)||0,o=Number(process.env.PG_IDLE_TIMEOUT)||5,s=Number(process.env.PG_KEEP_ALIVE_S)||60;ei=Wm(zm("DATABASE_URL"),{prepare:!1,max:t,connect_timeout:n,idle_timeout:o,keep_alive:s,max_lifetime:300,connection:{application_name:e,...r>0?{statement_timeout:r}:{}}}),Xa=ow(ei,{schema:lu})}return Xa}function iw(){if(Qa)throw new Error("getHeavyDb() called after closeDb(): the connection pool is closed for shutdown. Stop issuing queries (timers/requests) before draining the pool.");if(!fu){let e=(process.env.PG_APPLICATION_NAME||"rulemetric")+":heavy",t=Number(process.env.PG_HEAVY_POOL_MAX)||2;gu=Wm(zm("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}}),fu=ow(gu,{schema:lu})}return fu}async function Za(){if(mu)return mu;Qa=!0;let e=ei,t=Zs,n=gu;return ei=void 0,Xa=void 0,Zs=void 0,gu=void 0,fu=void 0,mu=Promise.allSettled([e?e.end({timeout:5}):Promise.resolve(),t?t.end({timeout:5}):Promise.resolve(),n?n.end({timeout:5}):Promise.resolve()]).then(()=>{}),mu}function Vm(){if(Qa)return Promise.resolve();if(Ya)return Ya;let e=ei;return ei=void 0,Xa=void 0,Ya=(async()=>{e&&await e.end({timeout:5}).catch(()=>{})})().finally(()=>{Ya=void 0}),Ya}async function Jm(e){let t=Date.now();if(Qa)return{ok:!1,ms:0,err:new Error("pool closed for shutdown")};let n=Zs;try{return n||(n=Wm(zm("DATABASE_URL"),{prepare:!1,max:1,connect_timeout:Number(process.env.PG_CONNECT_TIMEOUT_S)||10,idle_timeout:20,max_lifetime:300,connection:{application_name:(process.env.PG_APPLICATION_NAME||"rulemetric")+":probe",statement_timeout:Math.max(2e3,e-2e3)}}),Zs=n),await Promise.race([n`SELECT 1`,new Promise((r,o)=>setTimeout(()=>o(new Error("db probe timeout")),e))]),{ok:!0,ms:Date.now()-t}}catch(r){return Zs===n&&(Zs=void 0),n?.end({timeout:1}).catch(()=>{}),{ok:!1,ms:Date.now()-t,err:r}}}function ec(e){let t=e?.message;return typeof t=="string"&&t.includes($R)}function ti(e){let t=e,n=t?.code??t?.cause?.code??t?.errno;return n!==void 0&&qR.has(n)}function _u(e){let t=e,n=t?.code??t?.cause?.code??t?.errno;return n!==void 0&&UR.has(n)}async function aw(e,t={}){let n=t.attempts??3,r=t.baseMs??100,o;for(let s=0;s<n;s++)try{return await e()}catch(i){o=i;let a=ti(i)||t.retryResets===!0&&_u(i);if(s===n-1||!a)throw i;await new Promise(c=>setTimeout(c,r*2**s))}throw o}function tc(e){return e?.code==="QUERY_DEADLINE"}function cw(){let e=Number(process.env.PG_QUERY_DEADLINE_MS);return Number.isFinite(e)&&e>=0?e:2e4}function dw(){let e=Number(process.env.PG_HEAVY_QUERY_DEADLINE_MS);return Number.isFinite(e)&&e>=0?e:6e4}function HR(e,t,n=!0){let r,o=new Promise((s,i)=>{r=setTimeout(()=>{n&&rw(),i(new hu(t))},t);let a=r;typeof a.unref=="function"&&a.unref()});return Promise.race([e,o]).finally(()=>clearTimeout(r))}function Gm(e,t=!1,n=0,r=!1){return e===null||typeof e!="object"&&typeof e!="function"?e:new Proxy(e,{get(o,s,i){if(s==="then"){let c=Reflect.get(o,s,i);return typeof c!="function"?c:(l,p)=>{let m=r?$m:Mm,y=r?qm:Lm;m();let v=aw(()=>new Promise((f,w)=>c.call(o,f,w)),{retryResets:t});return(n>0?HR(v,n,!r):v).finally(y).then(l,p)}}let a=Reflect.get(o,s,i);return typeof a=="function"?(...c)=>Gm(a.apply(o,c),t,n,r):a}})}function pw(e,t=!1){let n=t?$m:Mm,r=t?qm:Lm;n();try{return Promise.resolve(e()).finally(r)}catch(o){throw r(),o}}var Xa,ei,Qa,mu,Ya,Zs,gu,fu,$R,qR,UR,hu,uw,lw,u,nt,Km=J(()=>{"use strict";pu();Fm();Qa=!1;d(zm,"getEnv");d(sw,"getDb");d(iw,"getHeavyDb");d(Za,"closeDb");d(Vm,"recyclePool");d(Jm,"probeDbReachable");$R="called after closeDb()";d(ec,"isPoolClosedError");qR=new Set(["CONNECT_TIMEOUT","ETIMEDOUT","ENOTFOUND","ECONNREFUSED","EAI_AGAIN"]);d(ti,"isRetryableConnectError");UR=new Set(["CONNECTION_CLOSED","ECONNRESET","EPIPE"]);d(_u,"isRetryableResetError");d(aw,"withDbRetry");hu=class extends Error{static{d(this,"QueryDeadlineError")}code="QUERY_DEADLINE";constructor(t){super(`Query exceeded the client-side deadline of ${t}ms \u2014 the DB pool is likely saturated (acquire-wait) or holding a dead socket; failing fast to avoid pinning the caller. See client.ts.`),this.name="QueryDeadlineError"}};d(tc,"isQueryDeadlineError");d(cw,"queryDeadlineMs");d(dw,"heavyQueryDeadlineMs");d(HR,"raceWithDeadline");uw=new Set(["select","selectDistinct","selectDistinctOn","insert","update","delete","execute","with","$count","refreshMaterializedView"]),lw=new Set(["select","selectDistinct","selectDistinctOn","$count"]);d(Gm,"wrapBuilder");d(pw,"gaugeTransaction");u=new Proxy({},{get(e,t){let n=sw(),r=n[t];if(typeof t=="string"&&uw.has(t)&&typeof r=="function"){let o=lw.has(t),s=cw();return(...i)=>Gm(r.apply(n,i),o,s)}return t==="transaction"&&typeof r=="function"?(...o)=>pw(()=>r.apply(n,o)):r}}),nt=new Proxy({},{get(e,t){let n=iw(),r=n[t];if(typeof t=="string"&&uw.has(t)&&typeof r=="function"){let o=lw.has(t);return(...s)=>Gm(r.apply(n,s),o,dw(),!0)}return t==="transaction"&&typeof r=="function"?(...o)=>pw(()=>r.apply(n,o),!0):r}})});async function tn(e){let[t]=await u.insert(bt).values({userId:e.userId,type:e.type,title:e.title,body:e.body??null,url:e.url??null,sourceTable:e.sourceTable??null,sourceId:e.sourceId??null,metadata:e.metadata??{}}).onConflictDoNothing({target:[bt.userId,bt.sourceTable,bt.sourceId]}).returning();return t??null}var mw=J(()=>{"use strict";Km();pu();d(tn,"notifyUser")});var D=J(()=>{"use strict";pu();Km();Fm();mw()});function mI(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Ju(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]*${mI(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]*${mI(s)}[^\\n]*\\n([\\s\\S]*?)(?=\\nContents of |$)`,"i"))?.[1]?.trim();if(a)return a}}return null}var Of=J(()=>{"use strict";d(mI,"escapeRegExp");d(Ju,"extractInstructionSection")});var _I={};to(_I,{GRADUATION_MIN_N:()=>bc,decideGraduation:()=>gI,graduatedRulesForRender:()=>Mf,instructionContentHash:()=>Ur,maybeGraduate:()=>hI,settleExperiment:()=>gi,verdictRowsForExperiments:()=>Ku});import{createHash as pN}from"node:crypto";import{and as Gu,eq as Kn,inArray as mN,sql as fI}from"drizzle-orm";function gI(e){return e.resolution!=="resolved"||e.randomisationSuspect||e.contentChanged||e.delta===null||e.ci===null||e.measured.treated<bc||e.measured.control<bc?null:e.delta>0?"always":"never"}function Ur(e,t){let n=Ju(e,t);return n?pN("sha256").update(n).digest("hex"):null}async function hI(e){let{experimentId:t,userId:n,verdict:r}=e,o=gI(r);if(o===null)return null;let[s]=await u.select({id:q.id,instructionId:q.instructionId,projectPath:q.projectPath,status:q.status}).from(q).where(Gu(Kn(q.id,t),Kn(q.userId,n)));if(!s||s.status!=="running")return null;let[i]=await u.select({content:g.content,name:g.name}).from(g).where(Kn(g.id,s.instructionId)),a=Ur(i?.content,i?.name);if(!a)return null;let l=(await u.execute(fI`
|
|
2
2
|
SELECT array_agg(DISTINCT s.model) FILTER (WHERE s.model IS NOT NULL) AS models,
|
|
3
3
|
array_agg(DISTINCT s.harness_version) FILTER (WHERE s.harness_version IS NOT NULL) AS harness_versions,
|
|
4
4
|
min(s.started_at)::text AS from_at,
|
|
@@ -9,7 +9,7 @@ var o_=Object.defineProperty;var d=(e,t)=>o_(e,"name",{value:t,configurable:!0})
|
|
|
9
9
|
AND s.user_id = a.user_id
|
|
10
10
|
WHERE a.experiment_id = ${t}
|
|
11
11
|
AND s.analysis->>'outcome' IS NOT NULL
|
|
12
|
-
`))[0];return await u.insert(Y).values({userId:n,instructionId:s.instructionId,contentHash:a,projectPath:s.projectPath,segment:{models:l?.models??[],harnessVersions:l?.harness_versions??[],window:{from:l?.from_at??null,to:l?.to_at??null}},decision:o,delta:String(r.delta),ciLower:String(r.ci.lower),ciUpper:String(r.ci.upper),nTreated:r.measured.treated,nControl:r.measured.control,experimentId:t}).onConflictDoNothing(),await u.update(q).set({status:"stopped",stoppedReason:"graduated"}).where(
|
|
12
|
+
`))[0];return await u.insert(Y).values({userId:n,instructionId:s.instructionId,contentHash:a,projectPath:s.projectPath,segment:{models:l?.models??[],harnessVersions:l?.harness_versions??[],window:{from:l?.from_at??null,to:l?.to_at??null}},decision:o,delta:String(r.delta),ciLower:String(r.ci.lower),ciUpper:String(r.ci.upper),nTreated:r.measured.treated,nControl:r.measured.control,experimentId:t}).onConflictDoNothing(),await u.update(q).set({status:"stopped",stoppedReason:"graduated"}).where(Kn(q.id,t)),o}async function gi(e){let{experimentId:t,userId:n,verdict:r,source:o,status:s}=e;return s!=="running"?null:r.contentChanged?(await u.update(q).set({status:"stopped",stoppedReason:"content_changed"}).where(Gu(Kn(q.id,t),Kn(q.userId,n))),"content_changed"):await hI({experimentId:t,userId:n,verdict:r})?"graduated":o==="trial"&&r.resolution==="inconclusive"&&!r.randomisationSuspect&&r.measured.treated>=bc&&r.measured.control>=bc?(await u.update(q).set({status:"stopped",stoppedReason:"trial_neutral"}).where(Gu(Kn(q.id,t),Kn(q.userId,n))),await u.execute(fI`
|
|
13
13
|
UPDATE instruction_suggestions
|
|
14
14
|
SET declined_at = now(), declined_reason = 'trial_neutral'
|
|
15
15
|
WHERE user_id = ${n}
|
|
@@ -17,13 +17,13 @@ var o_=Object.defineProperty;var d=(e,t)=>o_(e,"name",{value:t,configurable:!0})
|
|
|
17
17
|
AND project_path = ${r.projectPath}
|
|
18
18
|
AND accepted_at IS NULL
|
|
19
19
|
AND declined_at IS NULL
|
|
20
|
-
`),"trial_neutral"):null}async function
|
|
21
|
-
`).filter(h=>h.trim()),r=[];for(let h of n)try{r.push(JSON.parse(h))}catch{}let o=r.filter(h=>h.type==="user"||h.type==="assistant"),s=null,i=null,a={},c=r.find(h=>h.type==="user");c&&(s=c.cwd??null,i=c.gitBranch??null,c.version&&(a.claudeCodeVersion=c.version),c.sessionId&&(a.sessionId=c.sessionId));let l=r.find(h=>h.type==="assistant");l?.message?.model&&(a.model=l.message.model);let p=[],m=0;for(let h of o){let f=h.timestamp??new Date().toISOString();if(h.type==="user"){let w=h.message?.content;if(typeof w=="string")p.push({sequence:m++,eventType:"user_message",content:w,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:f,metadata:{}});else if(Array.isArray(w))for(let b of w)b.type==="tool_result"&&p.push({sequence:m++,eventType:"tool_result",content:typeof b.content=="string"?b.content:JSON.stringify(b.content),toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:f,metadata:{toolUseId:b.tool_use_id}})}else if(h.type==="assistant"){let w=Array.isArray(h.message?.content)?h.message.content:[],b=h.message?.usage,I=b?{input:b.input_tokens??0,output:b.output_tokens??0,cacheRead:b.cache_read_input_tokens??0,cacheWrite:b.cache_creation_input_tokens??0}:null,S={};h.message?.model&&(S.model=h.message.model),h.message?.stop_reason&&(S.stopReason=h.message.stop_reason),h.requestId&&(S.requestId=h.requestId),b?.service_tier&&(S.serviceTier=b.service_tier),b?.speed&&(S.speed=b.speed),b?.cache_creation&&(S.cacheCreationDetail=b.cache_creation),b?.server_tool_use&&(S.serverToolUse=b.server_tool_use);for(let A of w)A.type==="text"?p.push({sequence:m++,eventType:"assistant_message",content:A.text??"",toolName:null,toolInput:null,toolOutput:null,tokenUsage:I,timestamp:f,metadata:S}):A.type==="thinking"?p.push({sequence:m++,eventType:"thinking",content:A.thinking??"",toolName:null,toolInput:null,toolOutput:null,tokenUsage:I,timestamp:f,metadata:S}):A.type==="tool_use"&&p.push({sequence:m++,eventType:"tool_call",content:null,toolName:A.name??"unknown",toolInput:A.input??null,toolOutput:null,tokenUsage:I,timestamp:f,metadata:{...S,toolUseId:A.id}})}}let y=p.map(h=>h.timestamp).sort(),v=new Date().toISOString();return{tool:"claude_code",projectPath:s,gitBranch:i,startedAt:y[0]??v,endedAt:y[y.length-1]??null,events:p,metadata:a}}}});var Ri,
|
|
20
|
+
`),"trial_neutral"):null}async function Mf(e,t){return(await u.select({instructionId:Y.instructionId,contentHash:Y.contentHash,decision:Y.decision,content:g.content,name:g.name}).from(Y).innerJoin(g,Kn(Y.instructionId,g.id)).where(Gu(Kn(Y.userId,e),Kn(Y.projectPath,t)))).flatMap(r=>{let o=Ur(r.content,r.name);return o===null||o!==r.contentHash?[]:[{instructionId:r.instructionId,decision:r.decision}]})}async function Ku(e){if(e.length===0)return new Map;let t=await u.select({experimentId:Y.experimentId,decision:Y.decision,decidedAt:Y.decidedAt,contentHash:Y.contentHash}).from(Y).where(mN(Y.experimentId,e));return new Map(t.filter(n=>n.experimentId!==null).map(n=>[n.experimentId,{decision:n.decision,decidedAt:n.decidedAt,contentHash:n.contentHash}]))}var bc,ls=J(()=>{"use strict";D();Of();bc=25;d(gI,"decideGraduation");d(Ur,"instructionContentHash");d(hI,"maybeGraduate");d(gi,"settleExperiment");d(Mf,"graduatedRulesForRender");d(Ku,"verdictRowsForExperiments")});var bP,SP,ZI=J(()=>{"use strict";bP=["claude_code","cursor","vscode_copilot","copilot_agent","rulemetric_mcp","codex","pi","opencode","antigravity"],SP=["user_message","assistant_message","tool_call","tool_result","thinking","error"]});var Ti,Xf=J(()=>{"use strict";Ti=class{static{d(this,"ClaudeCodeAdapter")}tool="claude_code";parse(t){let n=t.split(`
|
|
21
|
+
`).filter(h=>h.trim()),r=[];for(let h of n)try{r.push(JSON.parse(h))}catch{}let o=r.filter(h=>h.type==="user"||h.type==="assistant"),s=null,i=null,a={},c=r.find(h=>h.type==="user");c&&(s=c.cwd??null,i=c.gitBranch??null,c.version&&(a.claudeCodeVersion=c.version),c.sessionId&&(a.sessionId=c.sessionId));let l=r.find(h=>h.type==="assistant");l?.message?.model&&(a.model=l.message.model);let p=[],m=0;for(let h of o){let f=h.timestamp??new Date().toISOString();if(h.type==="user"){let w=h.message?.content;if(typeof w=="string")p.push({sequence:m++,eventType:"user_message",content:w,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:f,metadata:{}});else if(Array.isArray(w))for(let b of w)b.type==="tool_result"&&p.push({sequence:m++,eventType:"tool_result",content:typeof b.content=="string"?b.content:JSON.stringify(b.content),toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:f,metadata:{toolUseId:b.tool_use_id}})}else if(h.type==="assistant"){let w=Array.isArray(h.message?.content)?h.message.content:[],b=h.message?.usage,I=b?{input:b.input_tokens??0,output:b.output_tokens??0,cacheRead:b.cache_read_input_tokens??0,cacheWrite:b.cache_creation_input_tokens??0}:null,S={};h.message?.model&&(S.model=h.message.model),h.message?.stop_reason&&(S.stopReason=h.message.stop_reason),h.requestId&&(S.requestId=h.requestId),b?.service_tier&&(S.serviceTier=b.service_tier),b?.speed&&(S.speed=b.speed),b?.cache_creation&&(S.cacheCreationDetail=b.cache_creation),b?.server_tool_use&&(S.serverToolUse=b.server_tool_use);for(let A of w)A.type==="text"?p.push({sequence:m++,eventType:"assistant_message",content:A.text??"",toolName:null,toolInput:null,toolOutput:null,tokenUsage:I,timestamp:f,metadata:S}):A.type==="thinking"?p.push({sequence:m++,eventType:"thinking",content:A.thinking??"",toolName:null,toolInput:null,toolOutput:null,tokenUsage:I,timestamp:f,metadata:S}):A.type==="tool_use"&&p.push({sequence:m++,eventType:"tool_call",content:null,toolName:A.name??"unknown",toolInput:A.input??null,toolOutput:null,tokenUsage:I,timestamp:f,metadata:{...S,toolUseId:A.id}})}}let y=p.map(h=>h.timestamp).sort(),v=new Date().toISOString();return{tool:"claude_code",projectPath:s,gitBranch:i,startedAt:y[0]??v,endedAt:y[y.length-1]??null,events:p,metadata:a}}}});var Ri,Qf=J(()=>{"use strict";Ri=class{static{d(this,"CursorAdapter")}tool="cursor";parse(t){let n=Cp("better-sqlite3"),r=new n(t,{readonly:!0});try{let o=r.prepare("SELECT value FROM ItemTable WHERE key = 'composer.composerData'").get();return o?this.parseComposerJson(o.value):this.emptySession()}finally{r.close()}}parseComposerJson(t){let n;try{n=JSON.parse(t)}catch{return this.emptySession()}let r=Object.values(n.allComposers??{});if(r.length===0)return this.emptySession();let o=r.sort((l,p)=>{let m=l.createdAt?new Date(l.createdAt).getTime():0;return(p.createdAt?new Date(p.createdAt).getTime():0)-m})[0],s=o.conversation??[],i=[];for(let l=0;l<s.length;l++){let p=s[l],m=p.createdAt??new Date().toISOString();i.push({sequence:l,eventType:p.type===1?"user_message":"assistant_message",content:p.text,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:m,metadata:{}})}let a=i.map(l=>l.timestamp).sort(),c=new Date().toISOString();return{tool:"cursor",projectPath:null,gitBranch:null,startedAt:a[0]??c,endedAt:a[a.length-1]??null,events:i,metadata:{composerId:o.composerId}}}emptySession(){return{tool:"cursor",projectPath:null,gitBranch:null,startedAt:new Date().toISOString(),endedAt:null,events:[],metadata:{}}}}});var ki,Zf=J(()=>{"use strict";ki=class{static{d(this,"VSCodeCopilotAdapter")}tool="vscode_copilot";parse(t){let n;try{n=JSON.parse(t)}catch{return this.emptySession()}let r=n.requests??[],o=[],s=0;for(let c of r){let l=c.timestamp?new Date(c.timestamp).toISOString():new Date().toISOString();if(o.push({sequence:s++,eventType:"user_message",content:c.message,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:l,metadata:{}}),c.response){let p=c.response.timestamp?new Date(c.response.timestamp).toISOString():l;o.push({sequence:s++,eventType:"assistant_message",content:c.response.message,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:p,metadata:{}})}}let i=o.map(c=>c.timestamp).sort(),a=new Date().toISOString();return{tool:"vscode_copilot",projectPath:null,gitBranch:null,startedAt:i[0]??a,endedAt:i[i.length-1]??null,events:o,metadata:{...n.requesterUsername&&{username:n.requesterUsername},...n.customTitle&&{title:n.customTitle}}}}emptySession(){return{tool:"vscode_copilot",projectPath:null,gitBranch:null,startedAt:new Date().toISOString(),endedAt:null,events:[],metadata:{}}}}});var ji,eg=J(()=>{"use strict";ji=class{static{d(this,"CopilotAgentAdapter")}tool="copilot_agent";parse(t){let n;try{n=JSON.parse(t)}catch{return this.emptySession()}let r=n.requests??[],o=[],s=0;for(let c of r){let l=c.timestamp?new Date(c.timestamp).toISOString():new Date().toISOString();if(o.push({sequence:s++,eventType:"user_message",content:c.message,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:l,metadata:{}}),c.toolCalls)for(let p of c.toolCalls){let m=p.timestamp?new Date(p.timestamp).toISOString():l;o.push({sequence:s++,eventType:"tool_call",content:null,toolName:p.name??"unknown",toolInput:p.input??null,toolOutput:p.output??null,tokenUsage:null,timestamp:m,metadata:{}})}if(c.response){let p=c.response.timestamp?new Date(c.response.timestamp).toISOString():l;o.push({sequence:s++,eventType:"assistant_message",content:c.response.message,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:p,metadata:{}})}}let i=o.map(c=>c.timestamp).sort(),a=new Date().toISOString();return{tool:"copilot_agent",projectPath:null,gitBranch:null,startedAt:i[0]??a,endedAt:i[i.length-1]??null,events:o,metadata:{...n.requesterUsername&&{username:n.requesterUsername},...n.customTitle&&{title:n.customTitle},...n.agentMode!=null&&{agentMode:n.agentMode}}}}emptySession(){return{tool:"copilot_agent",projectPath:null,gitBranch:null,startedAt:new Date().toISOString(),endedAt:null,events:[],metadata:{}}}}});var Ni,tg=J(()=>{"use strict";Ni=class{static{d(this,"RuleMetricMcpAdapter")}tool="rulemetric_mcp";parse(t){let n;try{n=JSON.parse(t)}catch{return this.emptySession()}let o=(n.events??[]).map((i,a)=>({sequence:i.sequence??a,eventType:this.normalizeEventType(i.eventType),content:i.content??null,toolName:i.toolName??null,toolInput:i.toolInput??null,toolOutput:i.toolOutput??null,tokenUsage:i.tokenUsage??null,timestamp:i.timestamp??new Date().toISOString(),metadata:i.metadata??{}})),s=new Date().toISOString();return{tool:"rulemetric_mcp",projectPath:n.projectPath??null,gitBranch:n.gitBranch??null,startedAt:n.startedAt??o[0]?.timestamp??s,endedAt:n.endedAt??o[o.length-1]?.timestamp??null,events:o,metadata:n.metadata??{}}}normalizeEventType(t){return t&&["user_message","assistant_message","tool_call","tool_result","thinking","error"].includes(t)?t:"assistant_message"}emptySession(){return{tool:"rulemetric_mcp",projectPath:null,gitBranch:null,startedAt:new Date().toISOString(),endedAt:null,events:[],metadata:{}}}}});function AP(e){try{return JSON.parse(e)}catch{return e}}function eb(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(p=>p.trim()),o=[],s={},i=n.callNames,a=null,c=null,l=null;for(let p of r){let m;try{m=JSON.parse(p)}catch{continue}let y=m.payload;if(!y)continue;let v=
|
|
23
|
+
`):""}function EP(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 xP(e){if(!e)return new Date().toISOString();let t=new Date(e);return Number.isFinite(t.getTime())?t.toISOString():new Date().toISOString()}function ng(){return{sequence:0,model:null,prevCumulativeTotal:0,callNames:{}}}var Pi,rg=J(()=>{"use strict";d(AP,"safeJsonParse");d(eb,"textFromBlocks");d(EP,"tokenUsageFromCodex");d(xP,"normalizeTimestamp");d(ng,"freshCodexState");Pi=class{static{d(this,"CodexAdapter")}tool="codex";parse(t){let n=ng(),{events:r,projectPath:o,gitBranch:s,metadata:i}=this.parseLines(t,n),a=r.map(l=>l.timestamp).sort(),c=new Date().toISOString();return{tool:"codex",projectPath:o,gitBranch:s,startedAt:a[0]??c,endedAt:a[a.length-1]??null,events:r,metadata:i}}parseAppend(t,n){let r={...n,callNames:{...n.callNames}},{events:o}=this.parseLines(t,r);return{events:o,state:r}}parseLines(t,n){let r=t.split(`
|
|
24
|
+
`).filter(p=>p.trim()),o=[],s={},i=n.callNames,a=null,c=null,l=null;for(let p of r){let m;try{m=JSON.parse(p)}catch{continue}let y=m.payload;if(!y)continue;let v=xP(m.timestamp);if(m.type==="session_meta"){l=y.session_id??y.id??l,a=y.cwd??a,y.git_branch&&(c=y.git_branch),y.model&&(n.model=y.model),s.sessionId=l,s.codexSessionId=l,s.originator=y.originator,s.source=y.source,s.modelProvider=y.model_provider,s.codexCliVersion=y.cli_version;continue}if(m.type==="turn_context"){a=y.cwd??a,y.model&&(n.model=y.model,s.model=y.model);continue}if(m.type==="response_item"&&y.type==="message"){if(y.role==="user"){let h=eb(y.content,["input_text"]);if(!h)continue;o.push({sequence:n.sequence++,eventType:"user_message",content:h,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:v,metadata:{}})}else if(y.role==="assistant"){let h=eb(y.content,["output_text"]);if(!h)continue;o.push({sequence:n.sequence++,eventType:"assistant_message",content:h,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,model:n.model,timestamp:v,metadata:n.model?{model:n.model}:{}})}continue}if(m.type==="response_item"&&y.type==="function_call"){let h=y.name??"unknown";y.call_id&&(i[y.call_id]=h);let f=typeof y.arguments=="string"?AP(y.arguments):{};o.push({sequence:n.sequence++,eventType:"tool_call",content:null,toolName:h,toolInput:f&&typeof f=="object"&&!Array.isArray(f)?f:{arguments:f},toolOutput:null,tokenUsage:null,model:n.model,timestamp:v,metadata:{callId:y.call_id}});continue}if(m.type==="response_item"&&y.type==="function_call_output"){let h=y.call_id?i[y.call_id]??null:null;o.push({sequence:n.sequence++,eventType:"tool_result",content:y.output??null,toolName:h,toolInput:null,toolOutput:y.output==null?null:{output:y.output},tokenUsage:null,model:n.model,timestamp:v,metadata:{callId:y.call_id}});continue}if(m.type==="event_msg"&&y.type==="token_count"){let h=y.info,f=h?.total_token_usage?.total_tokens??0;if(f>0&&f===n.prevCumulativeTotal)continue;f>0&&(n.prevCumulativeTotal=f);let w=EP(h?.last_token_usage??h?.total_token_usage);if(!w)continue;let b=h?.model??h?.model_name??n.model;o.push({sequence:n.sequence++,eventType:"assistant_message",content:null,toolName:null,toolInput:null,toolOutput:null,tokenUsage:w,model:b??null,timestamp:v,metadata:{codexEventType:"token_count",...b?{model:b}:{},reasoningOutputTokens:h?.last_token_usage?.reasoning_output_tokens??0}})}}return{events:o,projectPath:a,gitBranch:c,sessionId:l,metadata:s}}}});function kc(e){let t=TP[e];if(!t)throw new Error(`Unknown session tool: ${e}`);return t()}function jc(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
|
|
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 TP,tb=J(()=>{"use strict";Xf();Qf();Zf();eg();tg();rg();TP={claude_code:d(()=>new Ti,"claude_code"),cursor:d(()=>new Ri,"cursor"),vscode_copilot:d(()=>new ki,"vscode_copilot"),copilot_agent:d(()=>new ji,"copilot_agent"),rulemetric_mcp:d(()=>new Ni,"rulemetric_mcp"),codex:d(()=>new Pi,"codex")};d(kc,"getAdapter");d(jc,"detectTool")});function nb(e,t){let n=t.length>0?t.map(o=>`### ${o.name} (ID: ${o.id})
|
|
27
27
|
|
|
28
28
|
${o.content}`).join(`
|
|
29
29
|
|
|
@@ -64,12 +64,12 @@ Return your response as JSON matching this schema:
|
|
|
64
64
|
"summary": "<string>"
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
-
Return valid JSON only.`}function
|
|
68
|
-
`)[0];return n?.trim()?JSON.parse(n):null}catch{return null}}async function
|
|
69
|
-
`).filter(v=>v.trim()),o,s="",i=0,a=0,c=0,l=0,p=0,m=[],y="";for(let v of r){let h;try{h=JSON.parse(v)}catch{continue}if(h.type==="session_meta"){s=h.payload?.session_id??
|
|
70
|
-
`).filter(a=>a.trim()),s="",i="";for(let a of o){let c;try{c=JSON.parse(a)}catch{continue}if(c.type==="session.model_change"){s=c.data.newModel??s;continue}if(c.type==="user.message"){i=c.data.content??"";continue}if(c.type==="assistant.message"){let{messageId:l,outputTokens:p,toolRequests:m=[]}=c.data;if(p===0||!s)continue;let y=`copilot:${r}:${l}`;if(t.has(y))continue;t.add(y);let v=m.map(h=>h.name??"").filter(Boolean).map(h=>
|
|
71
|
-
`)[0];return n?.trim()?JSON.parse(n):null}catch{return null}}function
|
|
72
|
-
`).filter(i=>i.trim()),o=
|
|
67
|
+
Return valid JSON only.`}function rb(e){try{let t=e.match(/\{[\s\S]*\}/);if(!t)return null;let n=JSON.parse(t[0]);return typeof n.adherenceScore!="number"||!Array.isArray(n.deviations)||!Array.isArray(n.suggestions)||typeof n.summary!="string"?null:{adherenceScore:n.adherenceScore,deviations:n.deviations,suggestions:n.suggestions,summary:n.summary,analyzedAt:new Date().toISOString()}}catch{return null}}var ob=J(()=>{"use strict";d(nb,"buildAnalysisPrompt");d(rb,"parseAnalysisResponse")});import{readdir as og,stat as sg}from"fs/promises";import{basename as RP,join as wo}from"path";import{homedir as al}from"os";function jP(){return process.env.CLAUDE_CONFIG_DIR||wo(al(),".claude")}function NP(){return wo(jP(),"projects")}function PP(){return process.platform==="darwin"?wo(al(),"Library","Application Support","Claude","local-agent-mode-sessions"):process.platform==="win32"?wo(al(),"AppData","Roaming","Claude","local-agent-mode-sessions"):wo(al(),".config","Claude","local-agent-mode-sessions")}async function CP(e){let t=[];async function n(r,o){if(o>8)return;let s=await og(r).catch(()=>[]);for(let i of s){if(i==="node_modules"||i===".git")continue;let a=wo(r,i);if((await sg(a).catch(()=>null))?.isDirectory())if(i==="projects"){let l=await og(a).catch(()=>[]);for(let p of l){let m=wo(a,p);(await sg(m).catch(()=>null))?.isDirectory()&&t.push(m)}}else await n(a,o+1)}}return d(n,"walk"),await n(e,0),t}var kP,sb,ib=J(()=>{"use strict";kP={"claude-opus-4-7":"Opus 4.7","claude-opus-4-6":"Opus 4.6","claude-opus-4-5":"Opus 4.5","claude-opus-4-1":"Opus 4.1","claude-opus-4":"Opus 4","claude-sonnet-4-6":"Sonnet 4.6","claude-sonnet-4-5":"Sonnet 4.5","claude-sonnet-4":"Sonnet 4","claude-3-7-sonnet":"Sonnet 3.7","claude-3-5-sonnet":"Sonnet 3.5","claude-haiku-4-5":"Haiku 4.5","claude-3-5-haiku":"Haiku 3.5"};d(jP,"getClaudeDir");d(NP,"getProjectsDir");d(PP,"getDesktopSessionsDir");d(CP,"findDesktopProjectDirs");sb={name:"claude",displayName:"Claude Code",modelDisplayName(e){let t=e.replace(/@.*$/,"").replace(/-\d{8}$/,"");for(let[n,r]of Object.entries(kP))if(t.startsWith(n))return r;return t},toolDisplayName(e){return e},async discoverSessions(){let e=[],t=NP();try{let r=await og(t);for(let o of r){let s=wo(t,o);(await sg(s).catch(()=>null))?.isDirectory()&&e.push({path:s,project:o,provider:"claude"})}}catch{}let n=await CP(PP());for(let r of n)e.push({path:r,project:RP(r),provider:"claude"});return e},createSessionParser(){return{async*parse(){}}}}});import{readdir as cl,readFile as ab,stat as DP}from"fs/promises";import{basename as OP,join as Ci}from"path";import{homedir as MP}from"os";function $P(){return process.env.CODEX_HOME??Ci(MP(),".codex")}function qP(e){return e.replace(/^\//,"").replace(/\//g,"-")}async function UP(e){try{let n=(await ab(e,"utf-8")).split(`
|
|
68
|
+
`)[0];return n?.trim()?JSON.parse(n):null}catch{return null}}async function HP(e){let t=await UP(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 BP(e){let t=Ci(e,"sessions"),n=[],r;try{r=await cl(t)}catch{return n}for(let o of r){if(!/^\d{4}$/.test(o))continue;let s=Ci(t,o),i=await cl(s).catch(()=>[]);for(let a of i){if(!/^\d{2}$/.test(a))continue;let c=Ci(s,a),l=await cl(c).catch(()=>[]);for(let p of l){if(!/^\d{2}$/.test(p))continue;let m=Ci(c,p),y=await cl(m).catch(()=>[]);for(let v of y){if(!v.startsWith("rollout-")||!v.endsWith(".jsonl"))continue;let h=Ci(m,v);if(!(await DP(h).catch(()=>null))?.isFile())continue;let{valid:w,meta:b}=await HP(h);if(!w||!b)continue;let I=b.payload?.cwd??"unknown";n.push({path:h,project:qP(I),provider:"codex"})}}}}return n}function FP(e,t){return e?.info?.model??e?.info?.model_name??t??"gpt-5"}function WP(e,t){return{async*parse(){let n;try{n=await ab(e.path,"utf-8")}catch{return}let r=n.split(`
|
|
69
|
+
`).filter(v=>v.trim()),o,s="",i=0,a=0,c=0,l=0,p=0,m=[],y="";for(let v of r){let h;try{h=JSON.parse(v)}catch{continue}if(h.type==="session_meta"){s=h.payload?.session_id??OP(e.path,".jsonl"),o=h.payload?.model;continue}if(h.type==="response_item"&&h.payload?.type==="function_call"){let f=h.payload.name??"";m.push(cb[f]??f);continue}if(h.type==="response_item"&&h.payload?.type==="message"&&h.payload?.role==="user"){let f=(h.payload.content??[]).filter(w=>w.type==="input_text").map(w=>w.text??"").filter(Boolean);f.length>0&&(y=f.join(" "));continue}if(h.type==="event_msg"&&h.payload?.type==="token_count"){let f=h.payload.info;if(!f)continue;let w=f.total_token_usage?.total_tokens??0;if(w>0&&w===i)continue;i=w;let b=f.last_token_usage,I=0,S=0,A=0,E=0;if(b)I=b.input_tokens??0,S=b.cached_input_tokens??0,A=b.output_tokens??0,E=b.reasoning_output_tokens??0;else if(w>0){let H=f.total_token_usage;if(!H)continue;I=(H.input_tokens??0)-a,S=(H.cached_input_tokens??0)-c,A=(H.output_tokens??0)-l,E=(H.reasoning_output_tokens??0)-p}if(!b){let H=f.total_token_usage;H&&(a=H.input_tokens??0,c=H.cached_input_tokens??0,l=H.output_tokens??0,p=H.reasoning_output_tokens??0)}if(I+S+A+E===0)continue;let O=Math.max(0,I-S),j=FP(h.payload,o),P=h.timestamp??"",$=`codex:${e.path}:${P}:${w}`;if(t.has($))continue;t.add($),yield{provider:"codex",model:j,inputTokens:O,outputTokens:A,cacheCreationInputTokens:0,cacheReadInputTokens:S,cachedInputTokens:S,reasoningTokens:E,costUSD:0,tools:m,bashCommands:[],timestamp:P,speed:"standard",deduplicationKey:$,userMessage:y,sessionId:s},m=[],y=""}}}}}var LP,cb,db,ub=J(()=>{"use strict";LP={"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"},cb={exec_command:"Bash",read_file:"Read",write_file:"Edit",apply_diff:"Edit",apply_patch:"Edit",spawn_agent:"Agent",close_agent:"Agent",wait_agent:"Agent",read_dir:"Glob"};d($P,"getCodexDir");d(qP,"sanitizeProject");d(UP,"readFirstLine");d(HP,"isValidCodexSession");d(BP,"discoverSessionsInDir");d(FP,"resolveModel");d(WP,"createParser");db={name:"codex",displayName:"Codex",modelDisplayName(e){for(let[t,n]of Object.entries(LP))if(e.startsWith(t))return n;return e},toolDisplayName(e){return cb[e]??e},async discoverSessions(){return BP($P())},createSessionParser(e,t){return WP(e,t)}}});import{readdir as zP,readFile as lb,stat as VP}from"fs/promises";import{basename as pb,dirname as JP,join as ig}from"path";import{homedir as GP}from"os";function XP(){return ig(GP(),".copilot","session-state")}function QP(e){let t=e.match(/^cwd:\s*(.+)$/m);return t?.[1]&&t[1].replace(/\s*#.*$/,"").replace(/^['"]|['"]$/g,"").trim()||null}function ZP(e,t){return{async*parse(){let n;try{n=await lb(e.path,"utf-8")}catch{return}let r=pb(JP(e.path)),o=n.split(`
|
|
70
|
+
`).filter(a=>a.trim()),s="",i="";for(let a of o){let c;try{c=JSON.parse(a)}catch{continue}if(c.type==="session.model_change"){s=c.data.newModel??s;continue}if(c.type==="user.message"){i=c.data.content??"";continue}if(c.type==="assistant.message"){let{messageId:l,outputTokens:p,toolRequests:m=[]}=c.data;if(p===0||!s)continue;let y=`copilot:${r}:${l}`;if(t.has(y))continue;t.add(y);let v=m.map(h=>h.name??"").filter(Boolean).map(h=>mb[h]??h);yield{provider:"copilot",model:s,inputTokens:0,outputTokens:p,cacheCreationInputTokens:0,cacheReadInputTokens:0,cachedInputTokens:0,reasoningTokens:0,costUSD:0,tools:v,bashCommands:[],timestamp:c.timestamp??"",speed:"standard",deduplicationKey:y,userMessage:i,sessionId:r},i=""}}}}}async function eC(e){let t=[],n;try{n=await zP(e)}catch{return t}for(let r of n){let o=ig(e,r,"events.jsonl");if(!(await VP(o).catch(()=>null))?.isFile())continue;let i=r;try{let a=await lb(ig(e,r,"workspace.yaml"),"utf-8"),c=QP(a);c&&(i=pb(c))}catch{}t.push({path:o,project:i,provider:"copilot"})}return t}var KP,mb,YP,fb,gb=J(()=>{"use strict";KP={"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"},mb={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"},YP=Object.entries(KP).sort((e,t)=>t[0].length-e[0].length);d(XP,"getCopilotSessionStateDir");d(QP,"parseCwd");d(ZP,"createParser");d(eC,"discoverSessionsInDir");fb={name:"copilot",displayName:"GitHub Copilot",modelDisplayName(e){for(let[t,n]of YP)if(e===t||e.startsWith(t+"-"))return n;return e},toolDisplayName(e){return mb[e]??e},async discoverSessions(){return eC(XP())},createSessionParser(e,t){return ZP(e,t)}}});import{readdir as hb,readFile as yb,stat as _b}from"fs/promises";import{basename as wb,join as ag}from"path";import{homedir as tC}from"os";function oC(){return ag(tC(),".pi","agent","sessions")}async function sC(e){try{let n=(await yb(e,"utf-8")).split(`
|
|
71
|
+
`)[0];return n?.trim()?JSON.parse(n):null}catch{return null}}function iC(e){return e.split(/[;&|]+/).map(t=>t.trim().split(/\s+/)[0]).filter(Boolean)}async function aC(e){let t=[],n;try{n=await hb(e)}catch{return t}for(let r of n){let o=ag(e,r);if(!(await _b(o).catch(()=>null))?.isDirectory())continue;let i;try{i=await hb(o)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let c=ag(o,a);if(!(await _b(c).catch(()=>null))?.isFile())continue;let p=await sC(c);if(!p||p.type!=="session")continue;let m=p.cwd??r;t.push({path:c,project:wb(m),provider:"pi"})}}return t}function cC(e,t){return{async*parse(){let n;try{n=await yb(e.path,"utf-8")}catch{return}let r=n.split(`
|
|
72
|
+
`).filter(i=>i.trim()),o=wb(e.path,".jsonl"),s="";for(let[i,a]of r.entries()){let c;try{c=JSON.parse(a)}catch{continue}if(c.type==="session"){o=c.id??o;continue}if(c.type!=="message")continue;let l=c.message;if(!l)continue;if(l.role==="user"){let E=(l.content??[]).filter(R=>R.type==="text").map(R=>R.text??"").filter(Boolean);E.length>0&&(s=E.join(" "));continue}if(l.role!=="assistant"||!l.usage)continue;let{input:p,output:m,cacheRead:y,cacheWrite:v}=l.usage;if(p===0&&m===0)continue;let h=l.model??"gpt-5",f=l.responseId??"",w=`pi:${e.path}:${f||c.id||c.timestamp||String(i)}`;if(t.has(w))continue;t.add(w);let b=(l.content??[]).filter(E=>E.type==="toolCall"&&E.name),I=b.map(E=>vb[E.name]??E.name),S=b.filter(E=>E.name==="bash").flatMap(E=>{let R=E.arguments?.command;return typeof R=="string"?iC(R):[]}),A=c.timestamp??"";yield{provider:"pi",model:h,inputTokens:p,outputTokens:m,cacheCreationInputTokens:v,cacheReadInputTokens:y,cachedInputTokens:y,reasoningTokens:0,costUSD:0,tools:I,bashCommands:S,timestamp:A,speed:"standard",deduplicationKey:w,userMessage:s,sessionId:o},s=""}}}}var nC,vb,rC,Ib,bb=J(()=>{"use strict";nC={"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"},vb={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"},rC=Object.entries(nC).sort((e,t)=>t[0].length-e[0].length);d(oC,"getPiSessionsDir");d(sC,"readFirstEntry");d(iC,"extractBashCommands");d(aC,"discoverSessionsInDir");d(cC,"createParser");Ib={name:"pi",displayName:"Pi",modelDisplayName(e){for(let[t,n]of rC)if(e.startsWith(t))return n;return e},toolDisplayName(e){return vb[e]??e},async discoverSessions(){return aC(oC())},createSessionParser(e,t){return cC(e,t)}}});var Ab={};to(Ab,{cursor:()=>hC});import{existsSync as dC}from"fs";import{join as cg}from"path";import{homedir as dg}from"os";function Sb(){if(dl)return!0;try{return dl=Cp("better-sqlite3"),!0}catch{return!1}}function pC(){return process.platform==="darwin"?cg(dg(),"Library","Application Support","Cursor","User","globalStorage","state.vscdb"):process.platform==="win32"?cg(dg(),"AppData","Roaming","Cursor","User","globalStorage","state.vscdb"):cg(dg(),".config","Cursor","User","globalStorage","state.vscdb")}function mC(e){return!e||e==="default"?uC:e}function gC(e,t){return{async*parse(){if(!Sb()||!dl)return;let n;try{n=new dl(e.path,{readonly:!0})}catch{return}try{let o=n.prepare(fC).all();for(let s of o){let i=s.input_tokens??0,a=s.output_tokens??0;if(i===0&&a===0)continue;let c=s.created_at??"",l=s.conversation_id??"unknown",p=`cursor:${l}:${c}:${i}:${a}`;if(t.has(p))continue;t.add(p);let m=mC(s.model);yield{provider:"cursor",model:s.model??"default",inputTokens:i,outputTokens:a,cacheCreationInputTokens:0,cacheReadInputTokens:0,cachedInputTokens:0,reasoningTokens:0,costUSD:0,tools:[],bashCommands:[],timestamp:c,speed:"standard",deduplicationKey:p,userMessage:s.user_text??"",sessionId:l}}}finally{n.close()}}}}var dl,uC,lC,fC,hC,Eb=J(()=>{"use strict";dl=null;d(Sb,"loadSqlite");uC="claude-sonnet-4-5",lC={"claude-4.5-opus-high-thinking":"Opus 4.5 (Thinking)","claude-4-opus":"Opus 4","claude-4-sonnet-thinking":"Sonnet 4 (Thinking)","claude-4.5-sonnet-thinking":"Sonnet 4.5 (Thinking)","claude-4.6-sonnet":"Sonnet 4.6","composer-1":"Composer 1","gpt-5":"GPT-5","gpt-4.1":"GPT-4.1",default:"Auto (Sonnet est.)"};d(pC,"getCursorDbPath");d(mC,"resolveModel");fC=`
|
|
73
73
|
SELECT
|
|
74
74
|
json_extract(value, '$.tokenCount.inputTokens') as input_tokens,
|
|
75
75
|
json_extract(value, '$.tokenCount.outputTokens') as output_tokens,
|
|
@@ -81,24 +81,24 @@ Return valid JSON only.`}function ZI(e){try{let t=e.match(/\{[\s\S]*\}/);if(!t)r
|
|
|
81
81
|
WHERE key LIKE 'bubbleId:%'
|
|
82
82
|
AND json_extract(value, '$.tokenCount.inputTokens') > 0
|
|
83
83
|
ORDER BY json_extract(value, '$.createdAt') ASC
|
|
84
|
-
`;d(
|
|
84
|
+
`;d(gC,"createParser");hC={name:"cursor",displayName:"Cursor",modelDisplayName(e){return lC[e]??e},toolDisplayName(e){return e},async discoverSessions(){if(!Sb())return[];let e=pC();return dC(e)?[{path:e,project:"cursor",provider:"cursor"}]:[]},createSessionParser(e,t){return gC(e,t)}}});var Rb={};to(Rb,{opencode:()=>EC});import{readdir as _C}from"fs/promises";import{join as ug}from"path";import{homedir as yC}from"os";function lg(){if(Di)return!0;try{return Di=Cp("better-sqlite3"),!0}catch{return!1}}function xb(e){return e.replace(/^\//,"").replace(/\//g,"-")}function wC(){let e=process.env.XDG_DATA_HOME??ug(yC(),".local","share");return ug(e,"opencode")}async function vC(e){try{return(await _C(e)).filter(n=>n.startsWith("opencode")&&n.endsWith(".db")).map(n=>ug(e,n))}catch{return[]}}function IC(e){let t=e<1e12?e*1e3:e;return new Date(t).toISOString()}function bC(e){return e.split(/[;&|]+/).map(t=>t.trim().split(/\s+/)[0]).filter(Boolean)}function SC(e,t){return{async*parse(){if(!lg()||!Di)return;let n=e.path.split(":"),r=n[n.length-1],o=n.slice(0,-1).join(":"),s;try{s=new Di(o,{readonly:!0})}catch{return}try{let i=s.prepare("SELECT id, time_created, data FROM message WHERE session_id = ? ORDER BY time_created ASC").all(r),a=s.prepare("SELECT message_id, data FROM part WHERE session_id = ? ORDER BY message_id, id").all(r),c=new Map;for(let p of a)try{let m=JSON.parse(p.data),y=c.get(p.message_id)??[];y.push(m),c.set(p.message_id,y)}catch{}let l="";for(let p of i){let m;try{m=JSON.parse(p.data)}catch{continue}if(m.role==="user"){let S=(c.get(p.id)??[]).filter(A=>A.type==="text").map(()=>"").filter(Boolean);S.length>0&&(l=S.join(" "));continue}if(m.role!=="assistant")continue;let y={input:m.tokens?.input??0,output:m.tokens?.output??0,reasoning:m.tokens?.reasoning??0,cacheRead:m.tokens?.cache?.read??0,cacheWrite:m.tokens?.cache?.write??0};if(y.input===0&&y.output===0&&y.reasoning===0&&y.cacheRead===0&&y.cacheWrite===0&&(m.cost??0)===0)continue;let f=(c.get(p.id)??[]).filter(S=>S.type==="tool"),w=f.map(S=>Tb[S.tool??""]??S.tool??"").filter(Boolean),b=f.filter(S=>S.tool==="bash"&&typeof S.state?.input?.command=="string").flatMap(S=>bC(S.state.input.command)),I=`opencode:${r}:${p.id}`;t.has(I)||(t.add(I),yield{provider:"opencode",model:m.modelID??"unknown",inputTokens:y.input,outputTokens:y.output,cacheCreationInputTokens:y.cacheWrite,cacheReadInputTokens:y.cacheRead,cachedInputTokens:y.cacheRead,reasoningTokens:y.reasoning,costUSD:m.cost??0,tools:w,bashCommands:b,timestamp:IC(p.time_created),speed:"standard",deduplicationKey:I,userMessage:l,sessionId:r})}}finally{s.close()}}}}async function AC(e){if(!lg()||!Di)return[];let t;try{t=new Di(e,{readonly:!0})}catch{return[]}try{return t.prepare("SELECT id, directory, title FROM session WHERE time_archived IS NULL AND parent_id IS NULL ORDER BY time_created DESC").all().map(r=>({path:`${e}:${r.id}`,project:r.directory?xb(r.directory):xb(r.title),provider:"opencode"}))}catch{return[]}finally{t.close()}}var Di,Tb,EC,kb=J(()=>{"use strict";Di=null;d(lg,"loadSqlite");Tb={bash:"Bash",read:"Read",edit:"Edit",write:"Write",glob:"Glob",grep:"Grep",task:"Agent",fetch:"WebFetch",search:"WebSearch",todo:"TodoWrite",skill:"Skill",patch:"Patch"};d(xb,"sanitize");d(wC,"getDataDir");d(vC,"findDbFiles");d(IC,"parseTimestamp");d(bC,"extractBashCommands");d(SC,"createParser");d(AC,"discoverFromDb");EC={name:"opencode",displayName:"OpenCode",modelDisplayName(e){return e.replace(/^[^/]+\//,"")},toolDisplayName(e){return Tb[e]??e},async discoverSessions(){if(!lg())return[];let e=await vC(wC()),t=[];for(let n of e)t.push(...await AC(n));return t},createSessionParser(e,t){return SC(e,t)}}});async function Ob(){if(Nb)return jb;Nb=!0;try{let{cursor:e}=await Promise.resolve().then(()=>(Eb(),Ab));return jb=e,e}catch{return null}}async function Mb(){if(Cb)return Pb;Cb=!0;try{let{opencode:e}=await Promise.resolve().then(()=>(kb(),Rb));return Pb=e,e}catch{return null}}async function pg(){let[e,t]=await Promise.all([Ob(),Mb()]),n=[...Db];return e&&n.push(e),t&&n.push(t),n}async function Lb(e){let t=await pg(),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 $b(e){return e==="cursor"?await Ob()??void 0:e==="opencode"?await Mb()??void 0:Db.find(t=>t.name===e)}var Db,jb,Nb,Pb,Cb,qb=J(()=>{"use strict";ib();ub();gb();bb();Db=[sb,db,fb,Ib],jb=null,Nb=!1;d(Ob,"loadCursor");Pb=null,Cb=!1;d(Mb,"loadOpenCode");d(pg,"getAllProviders");d(Lb,"discoverAllSessions");d($b,"getProvider")});import{spawn as xC}from"node:child_process";function ul(e){return`rm-${e.trim().replace(/[^A-Za-z0-9_.-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,80)||"session"}`}function ll(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 Nc(e,t,n={}){return n.literal===!1?["send-keys","-t",e,t]:["send-keys","-t",e,"-l","--",t]}function Ub(e){return["has-session","-t",e]}function Pc(e){return`tmux attach -t ${e}`}function TC(){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 mg(e){return new Promise(t=>{let n=xC("tmux",e,{stdio:["ignore","ignore","pipe"],env:TC()}),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 Hb(){return(await mg(["-V"])).code===0}var fg=J(()=>{"use strict";d(ul,"sanitizeTmuxName");d(ll,"buildTmuxLaunchArgs");d(Nc,"buildTmuxSendKeysArgs");d(Ub,"buildTmuxHasSessionArgs");d(Pc,"buildTmuxAttachCommand");d(TC,"tmuxSpawnEnv");d(mg,"runTmux");d(Hb,"isTmuxAvailable")});import{spawn as gg}from"node:child_process";import{randomUUID as RC}from"node:crypto";import{writeFile as Bb}from"node:fs/promises";import{tmpdir as Fb}from"node:os";import{join as Wb}from"node:path";function jC(e){if(e!==void 0){if(kC.test(e))return e;console.warn(`[claude-code-launcher] dropping non-uuid runId (RULEMETRIC_RUN_ID not injected): ${JSON.stringify(e)}`)}}function NC(e){return`'${e.replace(/'/g,"'\\''")}'`}var kC,pl,zb=J(()=>{"use strict";fg();kC=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;d(jC,"validateRunId");d(NC,"shellSingleQuote");pl=class{static{d(this,"ClaudeCodeLauncher")}options;tool="claude_code";constructor(t={}){this.options=t}capabilities={headless:!0,interactive:!0,remoteSpawn:!0};async launch(t){let n=RC(),r={...t,runId:jC(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=gg("claude",r,{cwd:t.projectPath,env:o,stdio:["ignore","pipe","pipe"]}),a="",c="";i.stdout.on("data",p=>{a+=p.toString()}),i.stderr.on("data",p=>{c+=p.toString()});let l=t.timeout?setTimeout(()=>{i.kill("SIGTERM")},t.timeout):null;i.on("close",p=>{l&&clearTimeout(l);let m=a;try{let y=JSON.parse(a);m=y.result??y.content??a}catch{}s({sessionId:n,pid:i.pid,exitCode:p,output:m,error:p!==0?c:void 0})}),i.on("error",p=>{l&&clearTimeout(l),s({sessionId:n,error:`Failed to spawn claude: ${p.message}`})})})}async launchInteractive(t,n){return await(this.options.tmuxAvailable??Hb)().catch(()=>!1)?this.launchInteractiveTmux(t,n):this.launchInteractiveTerminal(t,n,"tmux_not_found")}async launchInteractiveTmux(t,n){let r=this.options.runTmux??mg,o=ul(`claude-${t.resumeSessionId??n}`),s=await r(ll({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(Nc(o,t.prompt));if(a.code!==0)return{sessionId:n,liveSendAvailable:!1,fallbackReason:"tmux_launch_failed",error:`tmux send-keys exited ${a.code}: ${a.stderr.trim()||"no stderr"}`};let c=await r(Nc(o,"Enter",{literal:!1}));if(c.code!==0)return{sessionId:n,liveSendAvailable:!1,fallbackReason:"tmux_launch_failed",error:`tmux send Enter exited ${c.code}: ${c.stderr.trim()||"no stderr"}`}}return{sessionId:n,pid:i.pid,liveSendAvailable:!0,...i.error?{error:i.error}:{},terminalTarget:{kind:"tmux",target:o,attachCommand:Pc(o),live:!0}}}async openTerminalAttach(t,n){let r=Wb(Fb(),`rulemetric-attach-${n}.command`),o=`#!/bin/zsh
|
|
85
85
|
rm -- "$0"
|
|
86
|
-
${
|
|
87
|
-
`;return await
|
|
86
|
+
${Pc(t)}
|
|
87
|
+
`;return await Bb(r,o,{mode:493}),new Promise(s=>{let i=gg("open",["-a","Terminal",r],{stdio:["ignore","pipe","pipe"]}),a="";i.stderr.on("data",c=>{a+=c.toString()}),i.on("close",c=>{s(c===0?{pid:i.pid}:{pid:i.pid,error:`open attach exited ${c}: ${a.trim()||"no stderr"}`})}),i.on("error",c=>{s({error:`Failed to spawn open attach: ${c.message}`})})})}async launchInteractiveTerminal(t,n,r,o){let s=["claude"];t.resumeSessionId?s.push("--resume",t.resumeSessionId):t.prompt&&s.push("-p",JSON.stringify(t.prompt)),t.model&&s.push("--model",t.model);let i=s.join(" "),a=Wb(Fb(),`rulemetric-launch-${n}.command`),c=t.runId?`export RULEMETRIC_RUN_ID=${NC(t.runId)}
|
|
88
88
|
`:"",l=`#!/bin/zsh
|
|
89
89
|
rm -- "$0"
|
|
90
90
|
cd ${JSON.stringify(t.projectPath)} || exit
|
|
91
91
|
`+c+`${i}
|
|
92
|
-
`;return await
|
|
92
|
+
`;return await Bb(a,l,{mode:493}),new Promise(p=>{let m=gg("open",["-a","Terminal",a],{stdio:["ignore","pipe","pipe"]}),y="";m.stderr.on("data",v=>{y+=v.toString()}),m.on("close",v=>{if(v===0)p({sessionId:n,pid:m.pid,liveSendAvailable:!1,fallbackReason:r,...o?{error:o}:{}});else{let h=y.trim()||"no stderr";p({sessionId:n,pid:m.pid,liveSendAvailable:!1,fallbackReason:r,error:o?`${o}; open exited ${v}: ${h}`:`open exited ${v}: ${h}`})}}),m.on("error",v=>{p({sessionId:n,liveSendAvailable:!1,fallbackReason:r,error:`Failed to spawn open: ${v.message}`})})})}}});import{spawn as Vb}from"node:child_process";import{randomUUID as PC}from"node:crypto";var ml,Jb=J(()=>{"use strict";ml=class{static{d(this,"CodexLauncher")}tool="codex";capabilities={headless:!0,interactive:!0,remoteSpawn:!0};async launch(t){let n=PC();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=Vb("codex",r,{cwd:t.projectPath,stdio:["ignore","pipe","pipe"]}),i="",a="";s.stdout.on("data",l=>{i+=l.toString()}),s.stderr.on("data",l=>{a+=l.toString()});let c=t.timeout?setTimeout(()=>{s.kill("SIGTERM")},t.timeout):null;s.on("close",l=>{c&&clearTimeout(c),o({sessionId:n,pid:s.pid,exitCode:l,output:i,error:l!==0?a:void 0})}),s.on("error",l=>{c&&clearTimeout(c),o({sessionId:n,error:`Failed to spawn codex: ${l.message}`})})})}launchInteractive(t,n){let r=["codex"];t.prompt&&r.push(JSON.stringify(t.prompt));let o=`cd ${JSON.stringify(t.projectPath)} && ${r.join(" ")}`,s=Vb("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 Gb}from"node:child_process";import{randomUUID as CC}from"node:crypto";var fl,Kb=J(()=>{"use strict";fl=class{static{d(this,"AiderLauncher")}tool="aider";capabilities={headless:!0,interactive:!0,remoteSpawn:!0};async launch(t){let n=CC();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=Gb("aider",r,{cwd:t.projectPath,stdio:["ignore","pipe","pipe"]}),i="",a="";s.stdout.on("data",l=>{i+=l.toString()}),s.stderr.on("data",l=>{a+=l.toString()});let c=t.timeout?setTimeout(()=>{s.kill("SIGTERM")},t.timeout):null;s.on("close",l=>{c&&clearTimeout(c),o({sessionId:n,pid:s.pid,exitCode:l,output:i,error:l!==0?a:void 0})}),s.on("error",l=>{c&&clearTimeout(c),o({sessionId:n,error:`Failed to spawn aider: ${l.message}`})})})}launchInteractive(t,n){let r=["aider"];t.model&&r.push("--model",t.model);let o=`cd ${JSON.stringify(t.projectPath)} && ${r.join(" ")}`,s=Gb("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 DC}from"node:child_process";import{randomUUID as OC}from"node:crypto";var gl,Yb=J(()=>{"use strict";gl=class{static{d(this,"GenericLauncher")}tool;constructor(t){this.tool=t}capabilities={headless:!1,interactive:!0,remoteSpawn:!1};async launch(t){let n=OC();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=DC("osascript",["-e",`tell application "Terminal" to do script ${JSON.stringify(r)}`],{stdio:"ignore",detached:!0});return o.unref(),{sessionId:n,pid:o.pid}}}});function Qb(e){let t=Xb[e];return t?t():new gl(e)}function Zb(){return Object.entries(Xb).map(([e,t])=>({tool:e,capabilities:t().capabilities}))}var Xb,e0=J(()=>{"use strict";zb();Jb();Kb();Yb();Xb={claude_code:d(()=>new pl,"claude_code"),codex:d(()=>new ml,"codex"),aider:d(()=>new fl,"aider")};d(Qb,"getLauncher");d(Zb,"getAvailableLaunchers")});import t0 from"node:path";function hg(e){return e.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^[-.]+|[-.]+$/g,"")||"worktree"}function hl(e){return t0.resolve(e.basePath??t0.join(e.repoRoot,"..",".rulemetric-worktrees",hg(e.branch)))}var n0=J(()=>{"use strict";d(hg,"sanitizeBranch");d(hl,"worktreePathFor")});var r0={};to(r0,{ClaudeCodeAdapter:()=>Ti,CodexAdapter:()=>Pi,CopilotAgentAdapter:()=>ji,CursorAdapter:()=>Ri,RuleMetricMcpAdapter:()=>Ni,SESSION_EVENT_TYPES:()=>SP,SESSION_TOOLS:()=>bP,VSCodeCopilotAdapter:()=>ki,buildAnalysisPrompt:()=>nb,buildTmuxAttachCommand:()=>Pc,buildTmuxHasSessionArgs:()=>Ub,buildTmuxLaunchArgs:()=>ll,buildTmuxSendKeysArgs:()=>Nc,detectTool:()=>jc,discoverAllSessions:()=>Lb,freshCodexState:()=>ng,getAdapter:()=>kc,getAllProviders:()=>pg,getAvailableLaunchers:()=>Zb,getLauncher:()=>Qb,getProvider:()=>$b,parseAnalysisResponse:()=>rb,sanitizeBranch:()=>hg,sanitizeTmuxName:()=>ul,worktreePathFor:()=>hl});var _l=J(()=>{"use strict";ZI();Xf();Qf();Zf();eg();tg();rg();tb();ob();qb();e0();n0();fg()});var l0={};to(l0,{getSupabaseAdmin:()=>Cn});import{createClient as GC}from"@supabase/supabase-js";function Cn(){if(bl)return bl;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 bl=GC(e,t,{auth:{autoRefreshToken:!1,persistSession:!1}}),bl}var bl,Cc=J(()=>{"use strict";bl=null;d(Cn,"getSupabaseAdmin")});var g0={};to(g0,{SNAPSHOT_DELTA_BUCKET:()=>wg,decodeDeltaBlob:()=>p0,encodeDeltaBlob:()=>vg,getDeltaBlob:()=>Dc,resolveDeltaPage:()=>Oc,resolveFullRows:()=>bg,uploadEncodedDelta:()=>Ig});import{gzipSync as KC,gunzipSync as YC}from"node:zlib";import{createHash as XC}from"node:crypto";function vg(e){let t=JSON.stringify(e??[]),n=KC(Buffer.from(t,"utf-8")),r=XC("sha256").update(n).digest("hex");return{body:n,ref:`sha256/${r}.json.gz`,bytes:n.byteLength}}function p0(e){try{let t=YC(Buffer.from(e)).toString("utf-8"),n=JSON.parse(t);return Array.isArray(n)?n:[]}catch{return[]}}async function Ig(e){let{body:t,ref:n,bytes:r}=e,{error:o}=await Cn().storage.from(wg).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 Dc(e){let{data:t,error:n}=await Cn().storage.from(wg).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 p0(r)}function Sl(e){return typeof e.messagesDeltaRef=="string"&&e.messagesDeltaRef.length>0}async function f0(e,t,n){let r=new Array(e.length),o=0,s=d(async()=>{for(;;){let i=o++;if(i>=e.length)return;r[i]=await n(e[i])}},"worker");return await Promise.all(Array.from({length:Math.min(t,e.length)},s)),r}async function Oc(e){return e.some(Sl)?f0(e,m0,async t=>({sequence:t.sequence,messagesDelta:Sl(t)?await Dc(t.messagesDeltaRef):t.messagesDelta})):e.map(t=>({sequence:t.sequence,messagesDelta:t.messagesDelta}))}async function bg(e){return e.some(Sl)?f0(e,m0,async t=>Sl(t)?{...t,messagesDelta:await Dc(t.messagesDeltaRef)}:t):e}var wg,m0,Al=J(()=>{"use strict";Cc();wg="snapshot-deltas";d(vg,"encodeDeltaBlob");d(p0,"decodeDeltaBlob");d(Ig,"uploadEncodedDelta");d(Dc,"getDeltaBlob");m0=8;d(Sl,"hasRef");d(f0,"mapCapped");d(Oc,"resolveDeltaPage");d(bg,"resolveFullRows")});var ZA={};to(ZA,{resolveRuntimeWebConfig:()=>QA,stampRuntimeConfig:()=>eU});function QA(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=QA(t);if(!n)return e;let o=`<script>window.__RM_CONFIG=${JSON.stringify(n).replace(/</g,"\\u003c")}</script>`;return e.includes("</head>")?e.replace("</head>",`${o}
|
|
93
93
|
</head>`):`${o}
|
|
94
|
-
${e}`}var XA=J(()=>{"use strict";d(KA,"resolveRuntimeWebConfig");d(Gq,"stampRuntimeConfig")});import*as Ip from"node:fs";import*as bp from"node:path";import{fileURLToPath as TU}from"node:url";import{serve as RU}from"@hono/node-server";import{trace as i_,context as TE}from"@opentelemetry/api";import{NodeSDK as RE}from"@opentelemetry/sdk-node";import{OTLPTraceExporter as kE}from"@opentelemetry/exporter-trace-otlp-http";import{BatchSpanProcessor as jE,ConsoleSpanExporter as NE,SimpleSpanProcessor as PE}from"@opentelemetry/sdk-trace-node";import{Resource as CE}from"@opentelemetry/resources";import{ATTR_SERVICE_NAME as OE,ATTR_SERVICE_VERSION as DE}from"@opentelemetry/semantic-conventions";function s_(e){if(!e)return{};let t={};for(let n of e.split(",")){let r=n.indexOf("=");if(r===-1)continue;let o=n.slice(0,r).trim(),s=n.slice(r+1).trim();o&&(t[o]=s)}return t}d(s_,"parseOtlpHeaders");var qs=null;function Us(){return process.env.TELEMETRY_ENABLED!=="false"}d(Us,"isTelemetryEnabled");function jp(e){if(!Us()||qs!==null)return"off";let t=new CE({[OE]:e.serviceName,[DE]:e.serviceVersion??"0.1.0"}),n=process.env.OTEL_EXPORTER_OTLP_ENDPOINT,r,o;if(n){let s=s_(process.env.OTEL_EXPORTER_OTLP_HEADERS),i=new kE({url:`${n}/v1/traces`,headers:s});o=new jE(i),r="otlp"}else if(process.env.OTEL_SPAN_EXPORT==="none")o=void 0,r="silent";else{let s=new NE;o=new PE(s),r="console"}return qs=new RE({resource:t,spanProcessors:o?[o]:[]}),qs.start(),r}d(jp,"initTelemetry");async function Np(){qs&&(await qs.shutdown(),qs=null)}d(Np,"shutdownTelemetry");function Pp(e){return i_.getTracer(e??"rulemetric")}d(Pp,"getTracer");function Cp(){return i_.getSpan(TE.active())?.spanContext().traceId}d(Cp,"getTraceId");import{SpanKind as ME,SpanStatusCode as a_}from"@opentelemetry/api";function Op(){return async(e,t)=>{if(!Us()){await t();return}let n=Pp(),r=e.req.method,o=e.req.path;await n.startActiveSpan(`${r} ${o}`,{kind:ME.SERVER,attributes:{"http.method":r,"http.url":e.req.url,"http.route":o}},async s=>{try{await t(),s.setAttribute("http.status_code",e.res.status);let i=e.get("userId");i&&s.setAttribute("rulemetric.user_id",i),e.res.status>=400&&s.setStatus({code:a_.ERROR})}catch(i){throw s.setStatus({code:a_.ERROR}),s.recordException(i),i}finally{s.end()}})}}d(Op,"telemetryMiddleware");import{trace as LE,context as $E}from"@opentelemetry/api";function Dp(e){let t=LE.getSpan($E.active());if(t)for(let[n,r]of Object.entries(e))t.setAttribute(n,r)}d(Dp,"setSpanAttributes");import*as Nr from"@sentry/node";var Ia=!1;function Mp(e){if(Ia)return!1;let t=process.env.SENTRY_DSN;return t?(Nr.init({dsn:t,serverName:e.serviceName,environment:process.env.NODE_ENV??"development",tracesSampleRate:0}),Ia=!0,!0):!1}d(Mp,"initSentry");function rr(e,t){if(!Ia)return;let n=e instanceof Error?e:new Error(typeof e=="string"?e:JSON.stringify(e));Nr.captureException(n,t)}d(rr,"captureException");function ba(e){if(Ia){if(e===null){Nr.setUser(null);return}Nr.setUser({id:e})}}d(ba,"setSentryUser");async function Sa(e){Ia&&await Nr.flush(e)}d(Sa,"flushSentry");import*as wd from"node:fs";import*as fa from"node:path";import{fileURLToPath as Kq}from"node:url";import{Hono as Yq}from"hono";import{cors as Xq}from"hono/cors";import{bodyLimit as Qq}from"hono/body-limit";import{serveStatic as Zq}from"@hono/node-server/serve-static";O();import{createHash as GR}from"node:crypto";import{createClient as KR}from"@supabase/supabase-js";import{eq as gw,and as YR,isNull as XR}from"drizzle-orm";import{createHmac as qR,createPublicKey as UR,timingSafeEqual as HR,verify as BR}from"node:crypto";var FR=6e4,rc=null,lw=0,nc=null,WR=null;async function zR(){let e=process.env.SUPABASE_URL;if(!e)throw new Error("SUPABASE_URL not set");let t=await fetch(`${e}/auth/v1/.well-known/jwks.json`,{signal:AbortSignal.timeout(5e3)});if(!t.ok)throw new Error(`JWKS fetch failed: ${t.status}`);return await t.json()}d(zR,"defaultJwksFetcher");async function Vm(){return nc||(nc=(async()=>{try{let e=await(WR??zR)(),t=new Map;for(let n of e.keys)if(n.kid)try{t.set(n.kid,UR({key:n,format:"jwk"}))}catch{}rc=t,lw=Date.now()}finally{nc=null}})(),nc)}d(Vm,"refreshJwks");function uw(e){try{return JSON.parse(Buffer.from(e,"base64url").toString("utf-8"))}catch{return null}}d(uw,"decodeB64Json");function VR(e){if(typeof e.exp=="number"&&e.exp*1e3<Date.now()||typeof e.sub!="string"||e.sub.length===0)return null;let t=e.aud;return t==="authenticated"||Array.isArray(t)&&t.includes("authenticated")?{userId:e.sub}:null}d(VR,"checkPayload");function JR(e,t,n,r){let o=qR("sha256",r).update(`${e}.${t}`).digest(),s;try{s=Buffer.from(n,"base64url")}catch{return!1}return s.length!==o.length?!1:HR(s,o)}d(JR,"verifyHs256");async function pw(e){let t=e.split(".");if(t.length!==3)return{ok:!1,reason:"invalid"};let[n,r,o]=t,s=uw(n);if(!s)return{ok:!1,reason:"invalid"};if(s.alg==="HS256"){let c=process.env.SUPABASE_JWT_SECRET;if(!c)return{ok:!1,reason:"unavailable"};if(!JR(n,r,o,c))return{ok:!1,reason:"invalid"}}else if(s.alg==="ES256"){if(typeof s.kid!="string")return{ok:!1,reason:"invalid"};if(rc===null)try{await Vm()}catch{return{ok:!1,reason:"unavailable"}}let c=rc?.get(s.kid);if(!c&&Date.now()-lw>=FR){try{await Vm()}catch{return{ok:!1,reason:"unavailable"}}c=rc?.get(s.kid)}if(!c)return{ok:!1,reason:"invalid"};let l;try{l=Buffer.from(o,"base64url")}catch{return{ok:!1,reason:"invalid"}}if(!BR("sha256",Buffer.from(`${n}.${r}`),{key:c,dsaEncoding:"ieee-p1363"},l))return{ok:!1,reason:"invalid"}}else return{ok:!1,reason:"invalid"};let i=uw(r);if(!i)return{ok:!1,reason:"invalid"};let a=VR(i);return a?{ok:!0,userId:a.userId,payload:i}:{ok:!1,reason:"invalid"}}d(pw,"verifySupabaseJwt");async function mw(e=3){for(let t=0;t<e;t++)try{return await Vm(),rc!==null}catch{await new Promise(n=>setTimeout(n,500*2**t))}return!1}d(mw,"primeJwks");function QR(e){return GR("sha256").update(e).digest("hex")}d(QR,"hashApiKey");var fw=new Map,ZR=300*1e3;function ek(e){let t=Date.now(),n=fw.get(e)??0;t-n<ZR||(fw.set(e,t),u.update(Ae).set({lastUsedAt:new Date}).where(gw(Ae.id,e)).then(()=>{}).catch(()=>{}))}d(ek,"updateLastUsed");var tk=60*1e3,nk=5e3,ni=new Map;async function hw(e,t){let n=e.req.header("Authorization");if(!n?.startsWith("Bearer "))return e.json({error:"Missing authorization header"},401);let r=n.slice(7);if(r.startsWith("rm_")){let o=QR(r),s,i=ni.get(o);if(i&&Date.now()-i.cachedAt<tk)s=i;else{i&&ni.delete(o);let[a]=await u.select({id:Ae.id,userId:Ae.userId,expiresAt:Ae.expiresAt}).from(Ae).where(YR(gw(Ae.keyHash,o),XR(Ae.revokedAt)));if(!a)return e.json({error:"Invalid API key"},401);s={id:a.id,userId:a.userId,expiresAt:a.expiresAt,cachedAt:Date.now()},ni.size>=nk&&ni.clear(),ni.set(o,s)}if(s.expiresAt&&new Date(s.expiresAt)<new Date)return ni.delete(o),e.json({error:"API key expired"},401);e.set("userId",s.userId),ba(s.userId),ek(s.id),await t();return}try{let o=KR(process.env.SUPABASE_URL,process.env.SUPABASE_ANON_KEY,{global:{headers:{Authorization:`Bearer ${r}`}}}),s=await pw(r);if(s.ok){e.set("userId",s.userId),e.set("supabase",o),ba(s.userId),await t();return}if(s.reason==="invalid")return console.log(`[auth] local JWT verify FAIL ${e.req.method} ${e.req.path}`),e.json({error:"Invalid token"},401);let i=Date.now(),{data:{user:a},error:c}=await o.auth.getUser();if(console.log(`[auth] getUser ${e.req.method} ${e.req.path} ms=${Date.now()-i} ${c?`err=${c.message}`:`userId=${a?.id??"?"}`}`),c||!a)return e.json({error:"Invalid token"},401);e.set("user",a),e.set("userId",a.id),e.set("supabase",o),ba(a.id),await t()}catch{return e.json({error:"Authentication failed"},401)}}d(hw,"authMiddleware");O();import{HTTPException as rk}from"hono/http-exception";import{ZodError as ok}from"zod";function ot(e){return e.replace(/[%_\\]/g,"\\$&")}d(ot,"escapeLike");function ri(e){let t=e;return t?.code??t?.cause?.code??t?.errno}d(ri,"transientCode");var sk=new Set(["ECONNRESET","EPIPE","ECONNABORTED"]);function _w(e,t){return e instanceof ok?t.json({error:"Validation error",details:e.flatten().fieldErrors},400):e instanceof rk?e.getResponse():ec(e)?t.json({error:"Server draining, retry shortly"},503):tc(e)?(process.env.LOG_LEVEL==="debug"&&console.debug("[req] query deadline exceeded \u2014 DB pool saturated; shed 503"),t.json({error:"Database busy, retry shortly"},503,{"Retry-After":"2"})):e.message==="aborted"||sk.has(ri(e)??"")?(process.env.LOG_LEVEL==="debug"&&console.debug(`[req] client/transient disconnect code=${ri(e)??"aborted"}`),t.body(null,503)):(console.error("Unhandled error:",e),t.json({error:"Internal server error"},500))}d(_w,"errorHandler");function oc(e,t){let n=new Map;return setInterval(()=>{let r=Date.now();for(let[o,s]of n)r>s.resetAt&&n.delete(o)},6e4).unref(),async(r,o)=>{let i=`${r.req.header("x-forwarded-for")?.split(",")[0]?.trim()??r.req.header("x-real-ip")??"unknown"}:${r.req.path}`,a=Date.now(),c=n.get(i);if((!c||a>c.resetAt)&&(c={count:0,resetAt:a+e},n.set(i,c)),c.count++,r.res.headers.set("X-RateLimit-Limit",String(t)),r.res.headers.set("X-RateLimit-Remaining",String(Math.max(0,t-c.count))),r.res.headers.set("X-RateLimit-Reset",String(Math.ceil(c.resetAt/1e3))),c.count>t)return r.json({error:"Too many requests, please try again later"},429);await o()}}d(oc,"rateLimit");var gu=!0,Jm="",yw=0;function Gm(e,t="",n=-1){if(e===gu){!e&&t&&(Jm=t);return}gu=e,Jm=e?"":t,yw=n,console.log(`[db-readiness] -> ${e?"READY":"NOT READY"}${t?` (${t})`:""}`)}d(Gm,"setDbReady");function sc(){return gu}d(sc,"isDbReady");function hu(){return{ready:gu,reason:Jm,changedAt:yw}}d(hu,"dbReadiness");async function ww(e,t){return sc()?t():(e.header("Retry-After","5"),e.json({error:"Service temporarily unavailable: the database is recovering. Retry shortly.",reason:hu().reason||void 0},503))}d(ww,"dbShed");O();var ik=5e3,vw=0;async function Iw(e,t){let n=Ja(),r=Qs();if(n>r){Mm();let o=Date.now();return o-vw>=ik&&(vw=o,console.warn(`[db_load_shed] shedding: inFlight=${n} > max=${r} path=${e.req.path}`)),e.header("Retry-After","1"),e.json({error:"Service busy: the database is under transient load. Retry shortly.",inFlight:n},503)}return t()}d(Iw,"dbLoadShed");O();var ak=5e3,bw=0;async function ic(e,t){if(e.req.method!=="POST")return t();let n=Ja(),r=Ka();if(n>=r){Ga();let o=Date.now();return o-bw>=ak&&(bw=o,console.warn(`[ingest_load_shed] shedding write: inFlight=${n} >= ingestMax=${r} path=${e.req.path}`)),e.header("Retry-After","2"),e.json({error:"Ingest busy: the database is under transient write load. Retry shortly.",inFlight:n},429)}return t()}d(ic,"ingestLoadShed");var Sw=d(async(e,t)=>{await t(),e.res.headers.set("X-Content-Type-Options","nosniff"),e.res.headers.set("X-Frame-Options","DENY"),e.res.headers.set("X-XSS-Protection","0"),e.res.headers.set("Referrer-Policy","strict-origin-when-cross-origin"),e.res.headers.set("Permissions-Policy","camera=(), microphone=(), geolocation=()")},"securityHeaders");function Aw(){return async(e,t)=>{let n=Date.now();try{await t()}finally{let r=Date.now()-n,o=Number(process.env.SLOW_REQUEST_LOG_MS)||2e3,s=Number(process.env.SLOW_REQUEST_MAX_MS)||12e4;if(r>s||r<o&&e.res.status<500)return;let i=new URL(e.req.url).pathname,a=e.get("userId");console.warn(`[http] slow_or_error method=${e.req.method} path=${i} status=${e.res.status} ms=${r}${a?` user=${a}`:""}`)}}}d(Aw,"slowRequestLog");import{Hono as dk}from"hono";import{z as lo}from"zod";import{createClient as Ew}from"@supabase/supabase-js";import{createClient as ck}from"@supabase/supabase-js";async function _u(e){let t=process.env.SUPABASE_URL,n=process.env.SUPABASE_ANON_KEY;if(!t||!n)return{ok:!1,status:500,error:"Server authentication not configured"};let r=ck(t,n,{auth:{persistSession:!1,autoRefreshToken:!1}}),o=`${e.slice(0,6)}\u2026${e.slice(-4)}`,s=Date.now();console.log(`[auth] refreshSession start refresh_token=${o}`);let{data:i,error:a}=await r.auth.refreshSession({refresh_token:e});return a||!i.session?(console.log(`[auth] refreshSession FAIL refresh_token=${o} ms=${Date.now()-s} err=${a?.message??"no-session"}`),{ok:!1,status:401,error:a?.message??"refresh failed"}):(console.log(`[auth] refreshSession OK refresh_token=${o} ms=${Date.now()-s} userId=${i.user?.id??"?"}`),{ok:!0,session:{accessToken:i.session.access_token,refreshToken:i.session.refresh_token,expiresAt:i.session.expires_at?new Date(i.session.expires_at*1e3).toISOString():null,email:i.user?.email??null}})}d(_u,"refreshSupabaseSession");var oi=new dk,uk=lo.object({email:lo.string().email(),password:lo.string().min(1)}),lk=lo.object({refreshToken:lo.string().min(1)});oi.post("/auth/login",async e=>{let t=await e.req.json(),n=uk.parse(t),r=process.env.SUPABASE_URL,o=process.env.SUPABASE_ANON_KEY;if(!r||!o)return e.json({error:"Server authentication not configured"},500);let s=Ew(r,o),i=Date.now();console.log(`[auth] signInWithPassword start email=${n.email} ua="${e.req.header("user-agent")??""}"`);let{data:a,error:c}=await s.auth.signInWithPassword({email:n.email,password:n.password});return c||!a.session?(console.log(`[auth] signInWithPassword FAIL email=${n.email} ms=${Date.now()-i} err=${c?.message??"no-session"}`),e.json({error:"Invalid email or password"},401)):(console.log(`[auth] signInWithPassword OK email=${n.email} ms=${Date.now()-i} userId=${a.user?.id??"?"}`),e.json({accessToken:a.session.access_token,refreshToken:a.session.refresh_token,expiresAt:a.session.expires_at?new Date(a.session.expires_at*1e3).toISOString():null,email:a.user?.email??n.email}))});var pk=lo.object({email:lo.string().email(),password:lo.string().min(8,"Password must be at least 8 characters")});oi.post("/auth/signup",async e=>{let t=await e.req.json(),n=pk.parse(t),r=process.env.SUPABASE_URL,o=process.env.SUPABASE_ANON_KEY;if(!r||!o)return e.json({error:"Server authentication not configured"},500);let s=Ew(r,o),i=process.env.WEB_URL??"http://localhost:5174",{data:a,error:c}=await s.auth.signUp({email:n.email,password:n.password,options:{emailRedirectTo:`${i}/auth/confirm`}});if(c){let l=/already registered|already exists|user already/i.test(c.message);return e.json({error:c.message},l?409:400)}return a.user&&(a.user.identities?.length??0)===0&&!a.session?e.json({error:"An account with this email already exists. Run `rulemetric auth login`."},409):a.session?e.json({confirmationRequired:!1,accessToken:a.session.access_token,refreshToken:a.session.refresh_token,expiresAt:a.session.expires_at?new Date(a.session.expires_at*1e3).toISOString():null,email:a.user?.email??n.email}):e.json({confirmationRequired:!0,email:a.user?.email??n.email})});oi.post("/auth/refresh",async e=>{let t=await e.req.json().catch(()=>null),n=lk.safeParse(t);if(!n.success)return e.json({error:"refreshToken is required"},400);let r=await _u(n.data.refreshToken);return r.ok?e.json(r.session):e.json({error:r.error},r.status)});import{readFileSync as mk}from"node:fs";import{dirname as fk,resolve as Km}from"node:path";import{fileURLToPath as gk}from"node:url";import{Hono as hk}from"hono";var _k="https://registry.npmjs.org/-/package/@rulemetric%2Fcli/dist-tags",yk=3600*1e3,wk=3e3,ac=null;function vk(){if(process.env.RULEMETRIC_BUNDLED_CLI_VERSION)return process.env.RULEMETRIC_BUNDLED_CLI_VERSION;let e=fk(gk(import.meta.url)),t=[Km(e,"../../../cli/package.json"),Km(e,"../../../../apps/cli/package.json"),Km(process.cwd(),"apps/cli/package.json")];for(let n of t)try{let r=JSON.parse(mk(n,"utf-8"));if(r.version)return r.version}catch{}return"0.0.0"}d(vk,"readBundledCliVersion");async function Ik(){try{let e=await fetch(_k,{headers:{accept:"application/json"},signal:AbortSignal.timeout(wk)});if(!e.ok)return null;let t=await e.json();return typeof t.latest=="string"&&t.latest?t.latest:null}catch{return null}}d(Ik,"fetchLatestFromNpm");async function bk(){let e=Date.now();if(ac&&e-ac.at<yk)return ac.version;let n=await Ik()??ac?.version??vk();return ac={version:n,at:e},n}d(bk,"getLatestCliVersion");var yu=new hk;yu.get("/cli/latest-version",async e=>e.json({latest:await bk()}));import{Hono as Dk}from"hono";O();import{sql as Sk}from"drizzle-orm";var Ak=12e3,Ek=3e4,xw=4,xk=Number(process.env.PG_RECYCLE_DEADLINE_THRESHOLD)||3,Tk="pipeline:api_db_pool_wedged",Rk="pipeline:api_db_pool_recycled",si=0;async function Ym(){return Fm(Ak)}d(Ym,"probeDb");function kk(e){let t=[],n=[],r=e;for(let o=0;r&&o<8;o++){let s=r;typeof s.code=="string"&&t.push(s.code),typeof s.message=="string"&&n.push(s.message),r=s.cause}return{codes:t,message:n.join(" ").toLowerCase()}}d(kk,"flattenCauseChain");function jk(e){let{codes:t,message:n}=kk(e);return n.includes("max client")||n.includes("emaxconn")||n.includes("max_client_conn")||t.includes("XX000")&&n.includes("client")}d(jk,"isPoolSaturation");function Nk(e){return jk(e)?"Supavisor tenant saturated (client cap reached)":ti(e)?"transient connect failure":"DB unreachable / probe timed out"}d(Nk,"classifyProbeFailure");async function Pk(e=Ym,t={}){let n=t.consumeDeadlines??Lm,r=t.recycle??Bm,o=t.onRecycle??Ok,s=await e();if(s.ok){let a=!sc();si>0&&console.log(`[db-wedge] DB reachable again after ${si} failed probe(s)`),si=0,Gm(!0,"",Date.now()),a&&Ck();let c=n();c>=xk&&(console.error(`[db-wedge] recycling the MAIN pool: ${c} client-side query-deadline(s) while a fresh dedicated probe is healthy \u2014 the pool is holding black-holed sockets a restart is not needed to clear.`),Promise.resolve().then(()=>r()).catch(l=>console.error("[db-wedge] pool recycle failed:",l instanceof Error?l.message:l)),o(c));return}si+=1;let i=Nk(s.err);console.error(`[db-wedge] dedicated DB probe failed (${si}/${xw}) \u2014 ${i}`),si>=xw&&sc()&&(Gm(!1,`DB unreachable from a dedicated connection \u2014 ${i}`,Date.now()),console.error("[db-wedge] marking API NOT READY (shedding DB traffic). NOT restarting: a process restart cannot free a shared Supavisor pooler. Readiness restores automatically on the next OK probe."))}d(Pk,"watchdogTick");async function Tw(e,t){try{await u.execute(Sk`
|
|
94
|
+
${e}`}var eE=J(()=>{"use strict";d(QA,"resolveRuntimeWebConfig");d(eU,"stampRuntimeConfig")});import*as Ep from"node:fs";import*as xp from"node:path";import{fileURLToPath as CU}from"node:url";import{serve as DU}from"@hono/node-server";import{trace as u_,context as jE}from"@opentelemetry/api";import{NodeSDK as NE}from"@opentelemetry/sdk-node";import{OTLPTraceExporter as PE}from"@opentelemetry/exporter-trace-otlp-http";import{BatchSpanProcessor as CE,ConsoleSpanExporter as DE,SimpleSpanProcessor as OE}from"@opentelemetry/sdk-trace-node";import{Resource as ME}from"@opentelemetry/resources";import{ATTR_SERVICE_NAME as LE,ATTR_SERVICE_VERSION as $E}from"@opentelemetry/semantic-conventions";function d_(e){if(!e)return{};let t={};for(let n of e.split(",")){let r=n.indexOf("=");if(r===-1)continue;let o=n.slice(0,r).trim(),s=n.slice(r+1).trim();o&&(t[o]=s)}return t}d(d_,"parseOtlpHeaders");var qs=null;function Us(){return process.env.TELEMETRY_ENABLED!=="false"}d(Us,"isTelemetryEnabled");function Dp(e){if(!Us()||qs!==null)return"off";let t=new ME({[LE]:e.serviceName,[$E]:e.serviceVersion??"0.1.0"}),n=process.env.OTEL_EXPORTER_OTLP_ENDPOINT,r,o;if(n){let s=d_(process.env.OTEL_EXPORTER_OTLP_HEADERS),i=new PE({url:`${n}/v1/traces`,headers:s});o=new CE(i),r="otlp"}else if(process.env.OTEL_SPAN_EXPORT==="none")o=void 0,r="silent";else{let s=new DE;o=new OE(s),r="console"}return qs=new NE({resource:t,spanProcessors:o?[o]:[]}),qs.start(),r}d(Dp,"initTelemetry");async function Op(){qs&&(await qs.shutdown(),qs=null)}d(Op,"shutdownTelemetry");function Mp(e){return u_.getTracer(e??"rulemetric")}d(Mp,"getTracer");function Lp(){return u_.getSpan(jE.active())?.spanContext().traceId}d(Lp,"getTraceId");import{SpanKind as qE,SpanStatusCode as l_}from"@opentelemetry/api";function $p(){return async(e,t)=>{if(!Us()){await t();return}let n=Mp(),r=e.req.method,o=e.req.path;await n.startActiveSpan(`${r} ${o}`,{kind:qE.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:l_.ERROR})}catch(i){throw s.setStatus({code:l_.ERROR}),s.recordException(i),i}finally{s.end()}})}}d($p,"telemetryMiddleware");import{trace as UE,context as HE}from"@opentelemetry/api";function qp(e){let t=UE.getSpan(HE.active());if(t)for(let[n,r]of Object.entries(e))t.setAttribute(n,r)}d(qp,"setSpanAttributes");import*as Nr from"@sentry/node";var Ia=!1;function Up(e){if(Ia)return!1;let t=process.env.SENTRY_DSN;return t?(Nr.init({dsn:t,serverName:e.serviceName,environment:process.env.NODE_ENV??"development",tracesSampleRate:0}),Ia=!0,!0):!1}d(Up,"initSentry");function rr(e,t){if(!Ia)return;let n=e instanceof Error?e:new Error(typeof e=="string"?e:JSON.stringify(e));Nr.captureException(n,t)}d(rr,"captureException");function ba(e){if(Ia){if(e===null){Nr.setUser(null);return}Nr.setUser({id:e})}}d(ba,"setSentryUser");async function Sa(e){Ia&&await Nr.flush(e)}d(Sa,"flushSentry");import*as bd from"node:fs";import*as fa 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 XR}from"node:crypto";import{createClient as QR}from"@supabase/supabase-js";import{eq as ww,and as ZR,isNull as ek}from"drizzle-orm";import{createHmac as BR,createPublicKey as FR,timingSafeEqual as WR,verify as zR}from"node:crypto";var VR=6e4,rc=null,gw=0,nc=null,JR=null;async function GR(){let e=process.env.SUPABASE_URL;if(!e)throw new Error("SUPABASE_URL not set");let t=await fetch(`${e}/auth/v1/.well-known/jwks.json`,{signal:AbortSignal.timeout(5e3)});if(!t.ok)throw new Error(`JWKS fetch failed: ${t.status}`);return await t.json()}d(GR,"defaultJwksFetcher");async function Ym(){return nc||(nc=(async()=>{try{let e=await(JR??GR)(),t=new Map;for(let n of e.keys)if(n.kid)try{t.set(n.kid,FR({key:n,format:"jwk"}))}catch{}rc=t,gw=Date.now()}finally{nc=null}})(),nc)}d(Ym,"refreshJwks");function fw(e){try{return JSON.parse(Buffer.from(e,"base64url").toString("utf-8"))}catch{return null}}d(fw,"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}d(KR,"checkPayload");function YR(e,t,n,r){let o=BR("sha256",r).update(`${e}.${t}`).digest(),s;try{s=Buffer.from(n,"base64url")}catch{return!1}return s.length!==o.length?!1:WR(s,o)}d(YR,"verifyHs256");async function hw(e){let t=e.split(".");if(t.length!==3)return{ok:!1,reason:"invalid"};let[n,r,o]=t,s=fw(n);if(!s)return{ok:!1,reason:"invalid"};if(s.alg==="HS256"){let c=process.env.SUPABASE_JWT_SECRET;if(!c)return{ok:!1,reason:"unavailable"};if(!YR(n,r,o,c))return{ok:!1,reason:"invalid"}}else if(s.alg==="ES256"){if(typeof s.kid!="string")return{ok:!1,reason:"invalid"};if(rc===null)try{await Ym()}catch{return{ok:!1,reason:"unavailable"}}let c=rc?.get(s.kid);if(!c&&Date.now()-gw>=VR){try{await Ym()}catch{return{ok:!1,reason:"unavailable"}}c=rc?.get(s.kid)}if(!c)return{ok:!1,reason:"invalid"};let l;try{l=Buffer.from(o,"base64url")}catch{return{ok:!1,reason:"invalid"}}if(!zR("sha256",Buffer.from(`${n}.${r}`),{key:c,dsaEncoding:"ieee-p1363"},l))return{ok:!1,reason:"invalid"}}else return{ok:!1,reason:"invalid"};let i=fw(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"}}d(hw,"verifySupabaseJwt");async function _w(e=3){for(let t=0;t<e;t++)try{return await Ym(),rc!==null}catch{await new Promise(n=>setTimeout(n,500*2**t))}return!1}d(_w,"primeJwks");function tk(e){return XR("sha256").update(e).digest("hex")}d(tk,"hashApiKey");var yw=new Map,nk=300*1e3;function rk(e){let t=Date.now(),n=yw.get(e)??0;t-n<nk||(yw.set(e,t),u.update(Ae).set({lastUsedAt:new Date}).where(ww(Ae.id,e)).then(()=>{}).catch(()=>{}))}d(rk,"updateLastUsed");var ok=60*1e3,sk=5e3,ni=new Map;async function vw(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=tk(r),s,i=ni.get(o);if(i&&Date.now()-i.cachedAt<ok)s=i;else{i&&ni.delete(o);let[a]=await u.select({id:Ae.id,userId:Ae.userId,expiresAt:Ae.expiresAt}).from(Ae).where(ZR(ww(Ae.keyHash,o),ek(Ae.revokedAt)));if(!a)return e.json({error:"Invalid API key"},401);s={id:a.id,userId:a.userId,expiresAt:a.expiresAt,cachedAt:Date.now()},ni.size>=sk&&ni.clear(),ni.set(o,s)}if(s.expiresAt&&new Date(s.expiresAt)<new Date)return ni.delete(o),e.json({error:"API key expired"},401);e.set("userId",s.userId),ba(s.userId),rk(s.id),await t();return}try{let o=QR(process.env.SUPABASE_URL,process.env.SUPABASE_ANON_KEY,{global:{headers:{Authorization:`Bearer ${r}`}}}),s=await hw(r);if(s.ok){e.set("userId",s.userId),e.set("supabase",o),ba(s.userId),await t();return}if(s.reason==="invalid")return console.log(`[auth] local JWT verify FAIL ${e.req.method} ${e.req.path}`),e.json({error:"Invalid token"},401);let i=Date.now(),{data:{user:a},error:c}=await o.auth.getUser();if(console.log(`[auth] getUser ${e.req.method} ${e.req.path} ms=${Date.now()-i} ${c?`err=${c.message}`:`userId=${a?.id??"?"}`}`),c||!a)return e.json({error:"Invalid token"},401);e.set("user",a),e.set("userId",a.id),e.set("supabase",o),ba(a.id),await t()}catch{return e.json({error:"Authentication failed"},401)}}d(vw,"authMiddleware");D();import{HTTPException as ik}from"hono/http-exception";import{ZodError as ak}from"zod";function ot(e){return e.replace(/[%_\\]/g,"\\$&")}d(ot,"escapeLike");function ri(e){let t=e;return t?.code??t?.cause?.code??t?.errno}d(ri,"transientCode");var ck=new Set(["ECONNRESET","EPIPE","ECONNABORTED"]);function Iw(e,t){return e instanceof ak?t.json({error:"Validation error",details:e.flatten().fieldErrors},400):e instanceof ik?e.getResponse():ec(e)?t.json({error:"Server draining, retry shortly"},503):tc(e)?(process.env.LOG_LEVEL==="debug"&&console.debug("[req] query deadline exceeded \u2014 DB pool saturated; shed 503"),t.json({error:"Database busy, retry shortly"},503,{"Retry-After":"2"})):e.message==="aborted"||ck.has(ri(e)??"")?(process.env.LOG_LEVEL==="debug"&&console.debug(`[req] client/transient disconnect code=${ri(e)??"aborted"}`),t.body(null,503)):(console.error("Unhandled error:",e),t.json({error:"Internal server error"},500))}d(Iw,"errorHandler");function oc(e,t){let n=new Map;return setInterval(()=>{let r=Date.now();for(let[o,s]of n)r>s.resetAt&&n.delete(o)},6e4).unref(),async(r,o)=>{let i=`${r.req.header("x-forwarded-for")?.split(",")[0]?.trim()??r.req.header("x-real-ip")??"unknown"}:${r.req.path}`,a=Date.now(),c=n.get(i);if((!c||a>c.resetAt)&&(c={count:0,resetAt:a+e},n.set(i,c)),c.count++,r.res.headers.set("X-RateLimit-Limit",String(t)),r.res.headers.set("X-RateLimit-Remaining",String(Math.max(0,t-c.count))),r.res.headers.set("X-RateLimit-Reset",String(Math.ceil(c.resetAt/1e3))),c.count>t)return r.json({error:"Too many requests, please try again later"},429);await o()}}d(oc,"rateLimit");var yu=!0,Xm="",bw=0;function Qm(e,t="",n=-1){if(e===yu){!e&&t&&(Xm=t);return}yu=e,Xm=e?"":t,bw=n,console.log(`[db-readiness] -> ${e?"READY":"NOT READY"}${t?` (${t})`:""}`)}d(Qm,"setDbReady");function sc(){return yu}d(sc,"isDbReady");function wu(){return{ready:yu,reason:Xm,changedAt:bw}}d(wu,"dbReadiness");async function Sw(e,t){return sc()?t():(e.header("Retry-After","5"),e.json({error:"Service temporarily unavailable: the database is recovering. Retry shortly.",reason:wu().reason||void 0},503))}d(Sw,"dbShed");D();var dk=5e3,Aw=0;async function Ew(e,t){let n=Ja(),r=Qs();if(n>r){Um();let o=Date.now();return o-Aw>=dk&&(Aw=o,console.warn(`[db_load_shed] shedding: inFlight=${n} > max=${r} path=${e.req.path}`)),e.header("Retry-After","1"),e.json({error:"Service busy: the database is under transient load. Retry shortly.",inFlight:n},503)}return t()}d(Ew,"dbLoadShed");D();var uk=5e3,xw=0;async function ic(e,t){if(e.req.method!=="POST")return t();let n=Ja(),r=Ka();if(n>=r){Ga();let o=Date.now();return o-xw>=uk&&(xw=o,console.warn(`[ingest_load_shed] shedding write: inFlight=${n} >= ingestMax=${r} path=${e.req.path}`)),e.header("Retry-After","2"),e.json({error:"Ingest busy: the database is under transient write load. Retry shortly.",inFlight:n},429)}return t()}d(ic,"ingestLoadShed");var Tw=d(async(e,t)=>{await t(),e.res.headers.set("X-Content-Type-Options","nosniff"),e.res.headers.set("X-Frame-Options","DENY"),e.res.headers.set("X-XSS-Protection","0"),e.res.headers.set("Referrer-Policy","strict-origin-when-cross-origin"),e.res.headers.set("Permissions-Policy","camera=(), microphone=(), geolocation=()")},"securityHeaders");function Rw(){return async(e,t)=>{let n=Date.now();try{await t()}finally{let r=Date.now()-n,o=Number(process.env.SLOW_REQUEST_LOG_MS)||2e3,s=Number(process.env.SLOW_REQUEST_MAX_MS)||12e4;if(r>s||r<o&&e.res.status<500)return;let i=new URL(e.req.url).pathname,a=e.get("userId");console.warn(`[http] slow_or_error method=${e.req.method} path=${i} status=${e.res.status} ms=${r}${a?` user=${a}`:""}`)}}}d(Rw,"slowRequestLog");import{Hono as pk}from"hono";import{z as lo}from"zod";import{createClient as kw}from"@supabase/supabase-js";import{createClient as lk}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=lk(t,n,{auth:{persistSession:!1,autoRefreshToken:!1}}),o=`${e.slice(0,6)}\u2026${e.slice(-4)}`,s=Date.now();console.log(`[auth] refreshSession start refresh_token=${o}`);let{data:i,error:a}=await r.auth.refreshSession({refresh_token:e});return a||!i.session?(console.log(`[auth] refreshSession FAIL refresh_token=${o} ms=${Date.now()-s} err=${a?.message??"no-session"}`),{ok:!1,status:401,error:a?.message??"refresh failed"}):(console.log(`[auth] refreshSession OK refresh_token=${o} ms=${Date.now()-s} userId=${i.user?.id??"?"}`),{ok:!0,session:{accessToken:i.session.access_token,refreshToken:i.session.refresh_token,expiresAt:i.session.expires_at?new Date(i.session.expires_at*1e3).toISOString():null,email:i.user?.email??null}})}d(vu,"refreshSupabaseSession");var oi=new pk,mk=lo.object({email:lo.string().email(),password:lo.string().min(1)}),fk=lo.object({refreshToken:lo.string().min(1)});oi.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=kw(r,o),i=Date.now();console.log(`[auth] signInWithPassword start email=${n.email} ua="${e.req.header("user-agent")??""}"`);let{data:a,error:c}=await s.auth.signInWithPassword({email:n.email,password:n.password});return c||!a.session?(console.log(`[auth] signInWithPassword FAIL email=${n.email} ms=${Date.now()-i} err=${c?.message??"no-session"}`),e.json({error:"Invalid email or password"},401)):(console.log(`[auth] signInWithPassword OK email=${n.email} ms=${Date.now()-i} userId=${a.user?.id??"?"}`),e.json({accessToken:a.session.access_token,refreshToken:a.session.refresh_token,expiresAt:a.session.expires_at?new Date(a.session.expires_at*1e3).toISOString():null,email:a.user?.email??n.email}))});var gk=lo.object({email:lo.string().email(),password:lo.string().min(8,"Password must be at least 8 characters")});oi.post("/auth/signup",async e=>{let t=await e.req.json(),n=gk.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=kw(r,o),i=process.env.WEB_URL??"http://localhost:5174",{data:a,error:c}=await s.auth.signUp({email:n.email,password:n.password,options:{emailRedirectTo:`${i}/auth/confirm`}});if(c){let l=/already registered|already exists|user already/i.test(c.message);return e.json({error:c.message},l?409:400)}return a.user&&(a.user.identities?.length??0)===0&&!a.session?e.json({error:"An account with this email already exists. Run `rulemetric auth login`."},409):a.session?e.json({confirmationRequired:!1,accessToken:a.session.access_token,refreshToken:a.session.refresh_token,expiresAt:a.session.expires_at?new Date(a.session.expires_at*1e3).toISOString():null,email:a.user?.email??n.email}):e.json({confirmationRequired:!0,email:a.user?.email??n.email})});oi.post("/auth/refresh",async e=>{let t=await e.req.json().catch(()=>null),n=fk.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 hk}from"node:fs";import{dirname as _k,resolve as Zm}from"node:path";import{fileURLToPath as yk}from"node:url";import{Hono as wk}from"hono";var vk="https://registry.npmjs.org/-/package/@rulemetric%2Fcli/dist-tags",Ik=3600*1e3,bk=3e3,ac=null;function Sk(){if(process.env.RULEMETRIC_BUNDLED_CLI_VERSION)return process.env.RULEMETRIC_BUNDLED_CLI_VERSION;let e=_k(yk(import.meta.url)),t=[Zm(e,"../../../cli/package.json"),Zm(e,"../../../../apps/cli/package.json"),Zm(process.cwd(),"apps/cli/package.json")];for(let n of t)try{let r=JSON.parse(hk(n,"utf-8"));if(r.version)return r.version}catch{}return"0.0.0"}d(Sk,"readBundledCliVersion");async function Ak(){try{let e=await fetch(vk,{headers:{accept:"application/json"},signal:AbortSignal.timeout(bk)});if(!e.ok)return null;let t=await e.json();return typeof t.latest=="string"&&t.latest?t.latest:null}catch{return null}}d(Ak,"fetchLatestFromNpm");async function Ek(){let e=Date.now();if(ac&&e-ac.at<Ik)return ac.version;let n=await Ak()??ac?.version??Sk();return ac={version:n,at:e},n}d(Ek,"getLatestCliVersion");var Iu=new wk;Iu.get("/cli/latest-version",async e=>e.json({latest:await Ek()}));import{Hono as $k}from"hono";D();import{sql as xk}from"drizzle-orm";var Tk=12e3,Rk=3e4,jw=4,kk=Number(process.env.PG_RECYCLE_DEADLINE_THRESHOLD)||3,jk="pipeline:api_db_pool_wedged",Nk="pipeline:api_db_pool_recycled",si=0;async function ef(){return Jm(Tk)}d(ef,"probeDb");function Pk(e){let t=[],n=[],r=e;for(let o=0;r&&o<8;o++){let s=r;typeof s.code=="string"&&t.push(s.code),typeof s.message=="string"&&n.push(s.message),r=s.cause}return{codes:t,message:n.join(" ").toLowerCase()}}d(Pk,"flattenCauseChain");function Ck(e){let{codes:t,message:n}=Pk(e);return n.includes("max client")||n.includes("emaxconn")||n.includes("max_client_conn")||t.includes("XX000")&&n.includes("client")}d(Ck,"isPoolSaturation");function Dk(e){return Ck(e)?"Supavisor tenant saturated (client cap reached)":ti(e)?"transient connect failure":"DB unreachable / probe timed out"}d(Dk,"classifyProbeFailure");async function Ok(e=ef,t={}){let n=t.consumeDeadlines??Hm,r=t.recycle??Vm,o=t.onRecycle??Lk,s=await e();if(s.ok){let a=!sc();si>0&&console.log(`[db-wedge] DB reachable again after ${si} failed probe(s)`),si=0,Qm(!0,"",Date.now()),a&&Mk();let c=n();c>=kk&&(console.error(`[db-wedge] recycling the MAIN pool: ${c} client-side query-deadline(s) while a fresh dedicated probe is healthy \u2014 the pool is holding black-holed sockets a restart is not needed to clear.`),Promise.resolve().then(()=>r()).catch(l=>console.error("[db-wedge] pool recycle failed:",l instanceof Error?l.message:l)),o(c));return}si+=1;let i=Dk(s.err);console.error(`[db-wedge] dedicated DB probe failed (${si}/${jw}) \u2014 ${i}`),si>=jw&&sc()&&(Qm(!1,`DB unreachable from a dedicated connection \u2014 ${i}`,Date.now()),console.error("[db-wedge] marking API NOT READY (shedding DB traffic). NOT restarting: a process restart cannot free a shared Supavisor pooler. Readiness restores automatically on the next OK probe."))}d(Ok,"watchdogTick");async function Nw(e,t){try{await u.execute(xk`
|
|
95
95
|
INSERT INTO alert_dispatches (user_id, alert_key, severity, channel, last_state)
|
|
96
96
|
SELECT DISTINCT user_id, ${e}, 'soft', 'in_app',
|
|
97
97
|
jsonb_build_object('message', ${t})
|
|
98
98
|
FROM sessions
|
|
99
99
|
WHERE created_at > now() - interval '7 days' AND user_id IS NOT NULL
|
|
100
|
-
`)}catch(n){console.error(`[db-wedge] failed to record ${e} alert:`,n instanceof Error?n.message:n)}}d(
|
|
101
|
-
`)){let o=r.match(/->([\d.]+|\[[^\]]+\]):(?:6543|5432)\b/);o&&n.push({remote:o[1].replace(/^\[|\]$/g,"")})}return n}catch{return[]}}d(
|
|
100
|
+
`)}catch(n){console.error(`[db-wedge] failed to record ${e} alert:`,n instanceof Error?n.message:n)}}d(Nw,"dispatchSoftAlert");async function Mk(){await Nw(jk,'The API database pool was briefly unreachable and shed traffic; it has recovered. Sessions and other pages may have shown 503s during that window. If this recurs, run "bash scripts/debug-loop.sh".')}d(Mk,"reportRecovery");async function Lk(e){try{rr(new Error(`[db-wedge] auto-recycled the main DB pool after ${e} client-side query-deadline(s) with a healthy probe \u2014 black-holed pooler sockets, no restart needed.`),{tags:{source:"db-wedge",action:"pool_recycle"},extra:{deadlines:e}})}catch{}await Nw(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/debug-loop.sh".')}d(Lk,"reportPoolRecycle");function Pw(){let e=setInterval(()=>{Ok().catch(()=>{})},Rk);return{stop:d(()=>clearInterval(e),"stop")}}d(Pw,"startDbWedgeWatchdog");var ii=new $k;ii.get("/health",e=>e.json({status:"ok"}));ii.get("/ready",e=>{let t=wu();return e.json({ready:t.ready,reason:t.reason||void 0},t.ready?200:503)});ii.get("/health/deep",async e=>{let t=await ef();return e.json({status:t.ok?"ok":"degraded",db:t.ok?"ok":"wedged",dbProbeMs:t.ms},t.ok?200:503)});D();import{Hono as qk}from"hono";import{sql as Uk}from"drizzle-orm";import{execFileSync as Hk}from"node:child_process";import*as Cw from"node:fs";var bu=new qk,Bk=["/usr/sbin/lsof","/usr/bin/lsof","/bin/lsof"].find(e=>Cw.existsSync(e))??"lsof";function Fk(e=process.pid){try{let t=Hk(Bk,["-a","-p",String(e),"-i","TCP","-P","-n"],{encoding:"utf8",timeout:3e3}),n=[];for(let r of t.split(`
|
|
101
|
+
`)){let o=r.match(/->([\d.]+|\[[^\]]+\]):(?:6543|5432)\b/);o&&n.push({remote:o[1].replace(/^\[|\]$/g,"")})}return n}catch{return[]}}d(Fk,"snapshotPoolerSockets");bu.get("/diag/pg-health",async e=>{let t=await u.execute(Uk`
|
|
102
102
|
SELECT
|
|
103
103
|
application_name,
|
|
104
104
|
client_addr::text AS client_addr,
|
|
@@ -110,97 +110,97 @@ ${e}`}var XA=J(()=>{"use strict";d(KA,"resolveRuntimeWebConfig");d(Gq,"stampRunt
|
|
|
110
110
|
WHERE datname = current_database()
|
|
111
111
|
GROUP BY application_name, client_addr, state
|
|
112
112
|
ORDER BY conns DESC
|
|
113
|
-
`),n=t.reduce((s,i)=>s+i.conns,0),r=
|
|
113
|
+
`),n=t.reduce((s,i)=>s+i.conns,0),r=Fk(),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=Bm();return{inflight_current:s.current,inflight_peak:s.peak,inflight_shed_count:s.shedCount,inflight_max:Qs(),ingest_inflight_max:Ka(),ingest_shed_count:s.ingestShedCount}})()},total_backends:n,breakdown:t})});D();import{Hono as Cj}from"hono";import{z as ct}from"zod";import{eq as Me,and as dr,sql as di,ilike as ff,isNull as Dj,or as gf,desc as Yv,inArray as Kv}from"drizzle-orm";import{z as Kt}from"zod";var Dw=["org","team","project","personal"],tf=Kt.object({name:Kt.string().min(1),description:Kt.string().min(1),type:Kt.literal("instruction").default("instruction"),scope:Kt.enum(Dw),version:Kt.string().min(1),tags:Kt.array(Kt.string()).optional(),compatibility:Kt.array(Kt.string()).optional(),slots:Kt.record(Kt.string(),Kt.string()).optional(),metadata:Kt.record(Kt.string(),Kt.unknown()).optional()});import{z as kn}from"zod";var Ow=kn.object({name:kn.string().min(1),description:kn.string().min(1),type:kn.literal("prompt"),version:kn.string().min(1),tags:kn.array(kn.string()).optional(),variables:kn.array(kn.string()).optional(),metadata:kn.record(kn.string(),kn.unknown()).optional()});function cc(e){return e<=3?"light":e<=8?"standard":"heavy"}d(cc,"computePackTier");var Su={claude_md:"claude_md",memory:"memory",skill_loaded:"skill"};function nf(e,t){let n=Su[e];return n?`${n}::${t}`:null}d(nf,"deriveContextIdentity");function rf(e){if(!e||typeof e!="object")return e;let t=e,n=t.project_areas;if(n!==void 0&&!Array.isArray(n)){let r=n&&typeof n=="object"?n.areas:void 0;t.project_areas=Array.isArray(r)?r:void 0}return e}d(rf,"normalizeRecommendations");import Wk from"gray-matter";import{z as Mw}from"zod";var $2=Mw.object({type:Mw.enum(["instruction","prompt"])});function ai(e){let{data:t,content:n}=Wk(e),r=tf.parse(t),o=r.slots??null;return{frontmatter:r,content:n.trim(),slots:o}}d(ai,"parseInstruction");var Au=["agents-md","claude-md","cursorrules","copilot","windsurf","cline","roo","aider","gemini","continue","junie","jetbrains","codex","soul-md","amazon-q","goose","kilocode","augment","tabnine","opencode","warp","trae","vscode-copilot","qodo","genkit","amp"];var dc=class{static{d(this,"ConverterRegistry")}converters=new Map;reverseConverters=new Map;register(t,n,r){this.converters.set(t,{converter:n,metadata:r})}registerReverse(t,n){this.reverseConverters.set(t,n)}get(t){return this.converters.get(t)?.converter}getReverse(t){return this.reverseConverters.get(t)}getMetadata(t){return this.converters.get(t)?.metadata}listFormats(){return[...this.converters.keys()]}listAll(){return[...this.converters.values()]}listReverseFormats(){return[...this.reverseConverters.keys()]}};function Lw(e,t){let n=[];for(let[r,o]of Object.entries(t)){let s=e[r];if(!s)continue;let i=s.trim();switch(o.placement){case"prefix":case"suffix":n.push(i);break;case"section":o.header?n.push(`${o.header}
|
|
114
114
|
|
|
115
115
|
${i}`):n.push(i);break}}return n.join(`
|
|
116
116
|
|
|
117
|
-
`)}d(
|
|
117
|
+
`)}d(Lw,"assembleSlots");function de(e,t,n,r){if(!t||Object.keys(t).length===0)return e;let o=Lw(t,n);return r?.appendContent&&e.trim()?`${o}
|
|
118
118
|
|
|
119
|
-
${e.trim()}`:o}d(de,"buildOutput");function
|
|
119
|
+
${e.trim()}`:o}d(de,"buildOutput");function of(e){let{filename:t,content:n}=e;if(t){let r=t.toLowerCase();if(r==="agents.md")return{format:"agents-md",confidence:.95};if(r==="claude.md")return{format:"claude-md",confidence:.95};if(r===".cursorrules"||r.endsWith(".mdc"))return{format:"cursorrules",confidence:.95};if(r==="copilot-instructions.md"||r.includes("copilot-instructions"))return{format:"copilot",confidence:.95};if(r===".windsurfrules")return{format:"windsurf",confidence:.95};if(r===".clinerules")return{format:"cline",confidence:.9};if(r===".goosehints")return{format:"goose",confidence:.9};if(r==="gemini.md")return{format:"gemini",confidence:.9};if(r==="soul.md")return{format:"soul-md",confidence:.95};if(r==="conventions.md")return{format:"aider",confidence:.7}}if(n){if(n.includes("alwaysApply:")&&n.includes("---"))return{format:"cursorrules",confidence:.8};if(n.includes("## File Access")&&n.includes("## Code Rules"))return{format:"claude-md",confidence:.6};if(n.includes("## Identity")&&n.includes("## File Handling"))return{format:"agents-md",confidence:.6};if(n.includes("## Persona")&&n.includes("## Rules"))return{format:"soul-md",confidence:.6}}return null}d(of,"detectFormat");var zk={system_identity:{header:"## Identity",placement:"section"},file_access_rules:{header:"## File Handling",placement:"section"},code_generation_rules:{header:"## Code Generation",placement:"section"},review_checklist:{header:"## Review Process",placement:"section"}},$w={convert(e,t){let n=[],r={includeTitle:!0,includeDescription:!0,includeMetadata:!1,...t};r.includeTitle&&n.push(`# ${e.frontmatter.name}`),r.includeDescription&&n.push(e.frontmatter.description);let o=de(e.content,e.slots,zk);return o&&n.push(o),{output:n.join(`
|
|
120
120
|
|
|
121
|
-
`),format:"agents-md",outputPath:"AGENTS.md",warnings:[]}}},
|
|
121
|
+
`),format:"agents-md",outputPath:"AGENTS.md",warnings:[]}}},qw={id:"agents-md",name:"AGENTS.md",description:"Universal cross-tool standard (Linux Foundation). Used by Codex, Amp, Gemini CLI, Aider, Zed.",tier:1,outputPath:"AGENTS.md",toolUrl:"https://agents.md/",scoringMetadata:{expectedSections:["## Identity","## File Handling","## Code Generation","## Review Process"],idealLengthRange:{min:500,max:8e3},supportedFeatures:["markdown-sections","code-blocks","lists","hierarchy"]}};function sf(e){return e.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n")}d(sf,"escapeYamlString");function cr(e){return e.replace(/[\r\n]+/g," ").trim()}d(cr,"sanitizeHeading");var Vk={system_identity:{header:"",placement:"prefix"},file_access_rules:{header:"## File Access",placement:"section"},code_generation_rules:{header:"## Code Rules",placement:"section"},review_checklist:{header:"## Checklist",placement:"section"}},Uw={convert(e,t){let n=[],r={includeTitle:!0,includeDescription:!0,includeMetadata:!1,...t};r.includeTitle&&n.push(`# ${cr(e.frontmatter.name)}`),r.includeDescription&&n.push(e.frontmatter.description);let o=de(e.content,e.slots,Vk);return o&&n.push(o),{output:n.join(`
|
|
122
122
|
|
|
123
|
-
`),format:"claude-md",outputPath:"CLAUDE.md",warnings:[]}}},
|
|
124
|
-
`),o=[];({includeTitle:!0,includeDescription:!1,includeMetadata:!1,...t}).includeTitle&&o.push(`# ${cr(e.frontmatter.name)}`);let i=de(e.content,e.slots,
|
|
123
|
+
`),format:"claude-md",outputPath:"CLAUDE.md",warnings:[]}}},Hw={id:"claude-md",name:"Claude Code (CLAUDE.md)",description:"Claude Code configuration with hierarchical sections and @import support.",tier:1,outputPath:"CLAUDE.md",toolUrl:"https://docs.anthropic.com/en/docs/claude-code",scoringMetadata:{expectedSections:["## File Access","## Code Rules","## Checklist"],idealLengthRange:{min:300,max:5e3},supportedFeatures:["markdown-sections","code-blocks","import-syntax","hierarchy"]}};var Jk={system_identity:{header:"",placement:"prefix"},file_access_rules:{header:"## File Rules",placement:"section"},code_generation_rules:{header:"## Rules",placement:"section"},review_checklist:{header:"## Review",placement:"section"}},Bw={convert(e,t){let n=[],r=["---",`description: "${sf(e.frontmatter.description)}"`,"alwaysApply: true","---"].join(`
|
|
124
|
+
`),o=[];({includeTitle:!0,includeDescription:!1,includeMetadata:!1,...t}).includeTitle&&o.push(`# ${cr(e.frontmatter.name)}`);let i=de(e.content,e.slots,Jk);i&&o.push(i);let a=`${r}
|
|
125
125
|
|
|
126
126
|
${o.join(`
|
|
127
127
|
|
|
128
128
|
`)}`,c=a.split(`
|
|
129
|
-
`).length;return c>50&&n.push(`Output is ${c} lines. Cursor recommends 25-50 lines for .mdc files.`),{output:a,format:"cursorrules",outputPath:".cursor/rules/rulemetric.mdc",warnings:n}}},
|
|
129
|
+
`).length;return c>50&&n.push(`Output is ${c} lines. Cursor recommends 25-50 lines for .mdc files.`),{output:a,format:"cursorrules",outputPath:".cursor/rules/rulemetric.mdc",warnings:n}}},Fw={id:"cursorrules",name:"Cursor Rules (.mdc)",description:"Cursor IDE rules in MDC format with YAML frontmatter. Supports globs and alwaysApply.",tier:1,outputPath:".cursor/rules/rulemetric.mdc",toolUrl:"https://docs.cursor.com/context/rules-for-ai",scoringMetadata:{expectedSections:["## File Rules","## Rules","## Review"],idealLengthRange:{min:200,max:3e3},supportedFeatures:["mdc-frontmatter","globs","markdown-sections","code-blocks"]}};var Gk={system_identity:{header:"",placement:"prefix"},file_access_rules:{header:"## File Rules",placement:"section"},code_generation_rules:{header:"## Coding Rules",placement:"section"},review_checklist:{header:"## Review Steps",placement:"section"}},Ww={convert(e,t){let n=[],r={includeTitle:!0,includeDescription:!0,includeMetadata:!1,...t};r.includeTitle&&n.push(`# ${e.frontmatter.name}`),r.includeDescription&&n.push(e.frontmatter.description);let o=de(e.content,e.slots,Gk);return o&&n.push(o),{output:n.join(`
|
|
130
130
|
|
|
131
|
-
`),format:"copilot",outputPath:".github/copilot-instructions.md",warnings:[]}}},
|
|
131
|
+
`),format:"copilot",outputPath:".github/copilot-instructions.md",warnings:[]}}},zw={id:"copilot",name:"GitHub Copilot Instructions",description:"GitHub Copilot custom instructions in .github/copilot-instructions.md.",tier:1,outputPath:".github/copilot-instructions.md",toolUrl:"https://docs.github.com/en/copilot/customizing-copilot/adding-custom-instructions-for-github-copilot",scoringMetadata:{expectedSections:["## File Rules","## Coding Rules","## Review Steps"],idealLengthRange:{min:300,max:4e3},supportedFeatures:["markdown-sections","natural-language","code-blocks"]}};var Kk={system_identity:{header:"## Identity",placement:"section"},file_access_rules:{header:"## File Rules",placement:"section"},code_generation_rules:{header:"## Code Rules",placement:"section"},review_checklist:{header:"## Review",placement:"section"}},Vw={convert(e,t){let n=[],r=[],o={includeTitle:!0,includeDescription:!0,includeMetadata:!1,...t};o.includeTitle&&r.push(`# ${e.frontmatter.name}`),o.includeDescription&&r.push(e.frontmatter.description);let s=de(e.content,e.slots,Kk);s&&r.push(s);let i=r.join(`
|
|
132
132
|
|
|
133
|
-
`);return i.length>12e3&&n.push(`Output is ${i.length} characters. Windsurf recommends under 12000 characters.`),{output:i,format:"windsurf",outputPath:".windsurfrules",warnings:n}}},
|
|
133
|
+
`);return i.length>12e3&&n.push(`Output is ${i.length} characters. Windsurf recommends under 12000 characters.`),{output:i,format:"windsurf",outputPath:".windsurfrules",warnings:n}}},Jw={id:"windsurf",name:"Windsurf Rules (.windsurfrules)",description:"Windsurf IDE rules file with markdown sections. Warns if output exceeds 12000 characters.",tier:2,outputPath:".windsurfrules",toolUrl:"https://docs.windsurf.com/windsurf/cascade#memories-and-rules",scoringMetadata:{expectedSections:["## Identity","## File Rules","## Code Rules","## Review"],idealLengthRange:{min:200,max:12e3},supportedFeatures:["markdown-sections","code-blocks","lists"]}};var Yk={system_identity:{header:"## Identity",placement:"section"},file_access_rules:{header:"## File Handling",placement:"section"},code_generation_rules:{header:"## Code Standards",placement:"section"},review_checklist:{header:"## Review",placement:"section"}},Gw={convert(e,t){let n=[],r={includeTitle:!0,includeDescription:!0,includeMetadata:!1,...t};r.includeTitle&&n.push(`# ${e.frontmatter.name}`),r.includeDescription&&n.push(e.frontmatter.description);let o=de(e.content,e.slots,Yk);return o&&n.push(o),{output:n.join(`
|
|
134
134
|
|
|
135
|
-
`),format:"cline",outputPath:".clinerules",warnings:[]}}},
|
|
135
|
+
`),format:"cline",outputPath:".clinerules",warnings:[]}}},Kw={id:"cline",name:"Cline Rules (.clinerules)",description:"Cline AI assistant rules file with markdown sections for project-level instructions.",tier:2,outputPath:".clinerules",toolUrl:"https://docs.cline.bot/improving-your-workflow/custom-instructions",scoringMetadata:{expectedSections:["## Identity","## File Handling","## Code Standards","## Review"],idealLengthRange:{min:200,max:8e3},supportedFeatures:["markdown-sections","code-blocks","lists"]}};var Xk={system_identity:{header:"## Identity",placement:"section"},file_access_rules:{header:"## File Rules",placement:"section"},code_generation_rules:{header:"## Code Rules",placement:"section"},review_checklist:{header:"## Review",placement:"section"}},Yw={convert(e,t){let n=[],r={includeTitle:!0,includeDescription:!0,includeMetadata:!1,...t};r.includeTitle&&n.push(`# ${e.frontmatter.name}`),r.includeDescription&&n.push(e.frontmatter.description);let o=de(e.content,e.slots,Xk);return o&&n.push(o),{output:n.join(`
|
|
136
136
|
|
|
137
|
-
`),format:"roo",outputPath:".roo/rules/rulemetric.md",warnings:[]}}},
|
|
137
|
+
`),format:"roo",outputPath:".roo/rules/rulemetric.md",warnings:[]}}},Xw={id:"roo",name:"Roo Code Rules (.roo/rules)",description:"Roo Code rules in markdown format stored in .roo/rules/ directory.",tier:2,outputPath:".roo/rules/rulemetric.md",toolUrl:"https://docs.roocode.com/features/custom-rules",scoringMetadata:{expectedSections:["## Identity","## File Rules","## Code Rules","## Review"],idealLengthRange:{min:200,max:8e3},supportedFeatures:["markdown-sections","code-blocks","lists"]}};var Qk={system_identity:{header:"## Identity",placement:"section"},file_access_rules:{header:"## File Conventions",placement:"section"},code_generation_rules:{header:"## Code Conventions",placement:"section"},review_checklist:{header:"## Review Conventions",placement:"section"}},Qw={convert(e,t){let n=[],r={includeTitle:!0,includeDescription:!0,includeMetadata:!1,...t};r.includeTitle&&n.push(`# ${e.frontmatter.name}`),r.includeDescription&&n.push(e.frontmatter.description);let o=de(e.content,e.slots,Qk);return o&&n.push(o),{output:n.join(`
|
|
138
138
|
|
|
139
|
-
`),format:"aider",outputPath:"CONVENTIONS.md",warnings:[]}}},
|
|
139
|
+
`),format:"aider",outputPath:"CONVENTIONS.md",warnings:[]}}},Zw={id:"aider",name:"Aider Conventions (CONVENTIONS.md)",description:"Aider coding conventions file in markdown format, loaded automatically from CONVENTIONS.md.",tier:2,outputPath:"CONVENTIONS.md",toolUrl:"https://aider.chat/docs/usage/conventions.html",scoringMetadata:{expectedSections:["## Identity","## File Conventions","## Code Conventions","## Review Conventions"],idealLengthRange:{min:200,max:8e3},supportedFeatures:["markdown-sections","code-blocks","lists"]}};var Zk={system_identity:{header:"## Identity",placement:"section"},file_access_rules:{header:"## File Handling",placement:"section"},code_generation_rules:{header:"## Code Generation",placement:"section"},review_checklist:{header:"## Review",placement:"section"}},ev={convert(e,t){let n=[],r={includeTitle:!0,includeDescription:!0,includeMetadata:!1,...t};r.includeTitle&&n.push(`# ${e.frontmatter.name}`),r.includeDescription&&n.push(e.frontmatter.description);let o=de(e.content,e.slots,Zk);return o&&n.push(o),{output:n.join(`
|
|
140
140
|
|
|
141
|
-
`),format:"gemini",outputPath:"GEMINI.md",warnings:[]}}},
|
|
141
|
+
`),format:"gemini",outputPath:"GEMINI.md",warnings:[]}}},tv={id:"gemini",name:"Gemini Instructions (GEMINI.md)",description:"Gemini CLI and Google AI Studio instructions in markdown format.",tier:2,outputPath:"GEMINI.md",toolUrl:"https://googlegemini.wiki/gemini-cli/customization/",scoringMetadata:{expectedSections:["## Identity","## File Handling","## Code Generation","## Review"],idealLengthRange:{min:200,max:8e3},supportedFeatures:["markdown-sections","code-blocks","lists"]}};var ej={system_identity:{header:"## Identity",placement:"section"},file_access_rules:{header:"## File Rules",placement:"section"},code_generation_rules:{header:"## Code Rules",placement:"section"},review_checklist:{header:"## Review",placement:"section"}},nv={convert(e,t){let n=[],r={includeTitle:!0,includeDescription:!0,includeMetadata:!1,...t};r.includeTitle&&n.push(`# ${e.frontmatter.name}`),r.includeDescription&&n.push(e.frontmatter.description);let o=de(e.content,e.slots,ej);return o&&n.push(o),{output:n.join(`
|
|
142
142
|
|
|
143
|
-
`),format:"continue",outputPath:".continuerules",warnings:[]}}},
|
|
143
|
+
`),format:"continue",outputPath:".continuerules",warnings:[]}}},rv={id:"continue",name:"Continue Rules (.continuerules)",description:"Continue IDE extension rules file with markdown-based project instructions.",tier:2,outputPath:".continuerules",toolUrl:"https://docs.continue.dev/customize/deep-dives/rules",scoringMetadata:{expectedSections:["## Identity","## File Rules","## Code Rules","## Review"],idealLengthRange:{min:200,max:6e3},supportedFeatures:["markdown-sections","code-blocks","lists"]}};var tj={system_identity:{header:"## Identity",placement:"section"},file_access_rules:{header:"## File Guidelines",placement:"section"},code_generation_rules:{header:"## Code Guidelines",placement:"section"},review_checklist:{header:"## Review",placement:"section"}},ov={convert(e,t){let n=[],r={includeTitle:!0,includeDescription:!0,includeMetadata:!1,...t};r.includeTitle&&n.push(`# ${e.frontmatter.name}`),r.includeDescription&&n.push(e.frontmatter.description);let o=de(e.content,e.slots,tj);return o&&n.push(o),{output:n.join(`
|
|
144
144
|
|
|
145
|
-
`),format:"junie",outputPath:".junie/guidelines.md",warnings:[]}}},
|
|
145
|
+
`),format:"junie",outputPath:".junie/guidelines.md",warnings:[]}}},sv={id:"junie",name:"Junie Guidelines (.junie/guidelines.md)",description:"JetBrains Junie AI agent guidelines in markdown format.",tier:2,outputPath:".junie/guidelines.md",toolUrl:"https://www.jetbrains.com/help/junie/guidelines.html",scoringMetadata:{expectedSections:["## Identity","## File Guidelines","## Code Guidelines","## Review"],idealLengthRange:{min:200,max:6e3},supportedFeatures:["markdown-sections","code-blocks","lists"]}};var nj={system_identity:{header:"## Identity",placement:"section"},file_access_rules:{header:"## File Rules",placement:"section"},code_generation_rules:{header:"## Code Rules",placement:"section"},review_checklist:{header:"## Review",placement:"section"}},iv={convert(e,t){let n=[],r={includeTitle:!0,includeDescription:!0,includeMetadata:!1,...t};r.includeTitle&&n.push(`# ${e.frontmatter.name}`),r.includeDescription&&n.push(e.frontmatter.description);let o=de(e.content,e.slots,nj);return o&&n.push(o),{output:n.join(`
|
|
146
146
|
|
|
147
|
-
`),format:"jetbrains",outputPath:".aiassistant/rules/rulemetric.md",warnings:[]}}},
|
|
147
|
+
`),format:"jetbrains",outputPath:".aiassistant/rules/rulemetric.md",warnings:[]}}},av={id:"jetbrains",name:"JetBrains AI Assistant Rules",description:"JetBrains AI Assistant project-level rules in .aiassistant/rules/ directory.",tier:2,outputPath:".aiassistant/rules/rulemetric.md",toolUrl:"https://www.jetbrains.com/help/idea/ai-prompts.html",scoringMetadata:{expectedSections:["## Identity","## File Rules","## Code Rules","## Review"],idealLengthRange:{min:200,max:6e3},supportedFeatures:["markdown-sections","code-blocks","lists"]}};var rj={system_identity:{header:"## Identity",placement:"section"},file_access_rules:{header:"## File Handling",placement:"section"},code_generation_rules:{header:"## Code Generation",placement:"section"},review_checklist:{header:"## Review Process",placement:"section"}},cv={convert(e,t){let n=[],r={includeTitle:!0,includeDescription:!0,includeMetadata:!1,...t};r.includeTitle&&n.push(`# ${e.frontmatter.name}`),r.includeDescription&&n.push(e.frontmatter.description);let o=de(e.content,e.slots,rj);return o&&n.push(o),{output:n.join(`
|
|
148
148
|
|
|
149
|
-
`),format:"codex",outputPath:"AGENTS.md",warnings:[]}}},
|
|
149
|
+
`),format:"codex",outputPath:"AGENTS.md",warnings:[]}}},dv={id:"codex",name:"OpenAI Codex (AGENTS.md)",description:"OpenAI Codex CLI instructions using the AGENTS.md standard format.",tier:2,outputPath:"AGENTS.md",toolUrl:"https://github.com/openai/codex",scoringMetadata:{expectedSections:["## Identity","## File Handling","## Code Generation","## Review Process"],idealLengthRange:{min:200,max:8e3},supportedFeatures:["markdown-sections","code-blocks","lists","hierarchy"]}};var oj={system_identity:{header:"## Identity",placement:"section"},file_access_rules:{header:"## File Rules",placement:"section"},code_generation_rules:{header:"## Code Rules",placement:"section"},review_checklist:{header:"## Review",placement:"section"}},uv={convert(e,t){let n=[],r={includeTitle:!0,includeDescription:!0,includeMetadata:!1,...t};r.includeTitle&&n.push(`# ${e.frontmatter.name}`),r.includeDescription&&n.push(e.frontmatter.description);let o=de(e.content,e.slots,oj);return o&&n.push(o),{output:n.join(`
|
|
150
150
|
|
|
151
|
-
`),format:"amazon-q",outputPath:".amazonq/rules/rulemetric.md",warnings:[]}}},
|
|
151
|
+
`),format:"amazon-q",outputPath:".amazonq/rules/rulemetric.md",warnings:[]}}},lv={id:"amazon-q",name:"Amazon Q Developer (experimental)",description:"Amazon Q Developer rules format (experimental). Community-reported path.",tier:3,outputPath:".amazonq/rules/rulemetric.md",toolUrl:"https://aws.amazon.com/q/developer/",scoringMetadata:{expectedSections:["## Identity","## File Rules","## Code Rules","## Review"],idealLengthRange:{min:200,max:6e3},supportedFeatures:["markdown-sections","code-blocks","lists"]}};var sj={system_identity:{header:"## Identity",placement:"section"},file_access_rules:{header:"## File Rules",placement:"section"},code_generation_rules:{header:"## Code Rules",placement:"section"},review_checklist:{header:"## Review",placement:"section"}},pv={convert(e,t){let n=[],r={includeTitle:!0,includeDescription:!0,includeMetadata:!1,...t};r.includeTitle&&n.push(`# ${e.frontmatter.name}`),r.includeDescription&&n.push(e.frontmatter.description);let o=de(e.content,e.slots,sj);return o&&n.push(o),{output:n.join(`
|
|
152
152
|
|
|
153
|
-
`),format:"goose",outputPath:".goosehints",warnings:[]}}},
|
|
153
|
+
`),format:"goose",outputPath:".goosehints",warnings:[]}}},mv={id:"goose",name:"Goose Hints (experimental)",description:"Block Goose hints file format (experimental). Community-reported path.",tier:3,outputPath:".goosehints",toolUrl:"https://block.github.io/goose/",scoringMetadata:{expectedSections:["## Identity","## File Rules","## Code Rules","## Review"],idealLengthRange:{min:200,max:6e3},supportedFeatures:["markdown-sections","code-blocks","lists"]}};var ij={system_identity:{header:"## Identity",placement:"section"},file_access_rules:{header:"## File Rules",placement:"section"},code_generation_rules:{header:"## Code Rules",placement:"section"},review_checklist:{header:"## Review",placement:"section"}},fv={convert(e,t){let n=[],r={includeTitle:!0,includeDescription:!0,includeMetadata:!1,...t};r.includeTitle&&n.push(`# ${e.frontmatter.name}`),r.includeDescription&&n.push(e.frontmatter.description);let o=de(e.content,e.slots,ij);return o&&n.push(o),{output:n.join(`
|
|
154
154
|
|
|
155
|
-
`),format:"kilocode",outputPath:".kilocode/rules/rulemetric.md",warnings:[]}}},
|
|
155
|
+
`),format:"kilocode",outputPath:".kilocode/rules/rulemetric.md",warnings:[]}}},gv={id:"kilocode",name:"Kilocode Rules (experimental)",description:"Kilocode rules file format (experimental). Community-reported path.",tier:3,outputPath:".kilocode/rules/rulemetric.md",toolUrl:"https://kilocode.ai/",scoringMetadata:{expectedSections:["## Identity","## File Rules","## Code Rules","## Review"],idealLengthRange:{min:200,max:6e3},supportedFeatures:["markdown-sections","code-blocks","lists"]}};var aj={system_identity:{header:"## Identity",placement:"section"},file_access_rules:{header:"## File Rules",placement:"section"},code_generation_rules:{header:"## Code Rules",placement:"section"},review_checklist:{header:"## Review",placement:"section"}},hv={convert(e,t){let n=[],r={includeTitle:!0,includeDescription:!0,includeMetadata:!1,...t};r.includeTitle&&n.push(`# ${e.frontmatter.name}`),r.includeDescription&&n.push(e.frontmatter.description);let o=de(e.content,e.slots,aj);return o&&n.push(o),{output:n.join(`
|
|
156
156
|
|
|
157
|
-
`),format:"augment",outputPath:".augment-guidelines/rulemetric.md",warnings:[]}}},
|
|
157
|
+
`),format:"augment",outputPath:".augment-guidelines/rulemetric.md",warnings:[]}}},_v={id:"augment",name:"Augment Code Guidelines (experimental)",description:"Augment Code guidelines file format (experimental). Community-reported path.",tier:3,outputPath:".augment-guidelines/rulemetric.md",toolUrl:"https://www.augmentcode.com/",scoringMetadata:{expectedSections:["## Identity","## File Rules","## Code Rules","## Review"],idealLengthRange:{min:200,max:6e3},supportedFeatures:["markdown-sections","code-blocks","lists"]}};var cj={system_identity:{header:"## Identity",placement:"section"},file_access_rules:{header:"## File Rules",placement:"section"},code_generation_rules:{header:"## Code Rules",placement:"section"},review_checklist:{header:"## Review",placement:"section"}},yv={convert(e,t){let n=[],r={includeTitle:!0,includeDescription:!0,includeMetadata:!1,...t};r.includeTitle&&n.push(`# ${e.frontmatter.name}`),r.includeDescription&&n.push(e.frontmatter.description);let o=de(e.content,e.slots,cj);return o&&n.push(o),{output:n.join(`
|
|
158
158
|
|
|
159
|
-
`),format:"tabnine",outputPath:".tabnine/instructions.md",warnings:[]}}},
|
|
159
|
+
`),format:"tabnine",outputPath:".tabnine/instructions.md",warnings:[]}}},wv={id:"tabnine",name:"Tabnine Instructions (experimental)",description:"Tabnine instructions file format (experimental). Community-reported path.",tier:3,outputPath:".tabnine/instructions.md",toolUrl:"https://www.tabnine.com/",scoringMetadata:{expectedSections:["## Identity","## File Rules","## Code Rules","## Review"],idealLengthRange:{min:200,max:6e3},supportedFeatures:["markdown-sections","code-blocks","lists"]}};var dj={system_identity:{header:"## Identity",placement:"section"},file_access_rules:{header:"## File Rules",placement:"section"},code_generation_rules:{header:"## Code Rules",placement:"section"},review_checklist:{header:"## Review",placement:"section"}},vv={convert(e,t){let n=[],r={includeTitle:!0,includeDescription:!0,includeMetadata:!1,...t};r.includeTitle&&n.push(`# ${e.frontmatter.name}`),r.includeDescription&&n.push(e.frontmatter.description);let o=de(e.content,e.slots,dj);return o&&n.push(o),{output:n.join(`
|
|
160
160
|
|
|
161
|
-
`),format:"opencode",outputPath:"AGENTS.md",warnings:[]}}},
|
|
161
|
+
`),format:"opencode",outputPath:"AGENTS.md",warnings:[]}}},Iv={id:"opencode",name:"OpenCode (experimental)",description:"OpenCode AGENTS.md format (experimental). Uses AGENTS.md standard.",tier:3,outputPath:"AGENTS.md",toolUrl:"https://opencode.ai/",scoringMetadata:{expectedSections:["## Identity","## File Rules","## Code Rules","## Review"],idealLengthRange:{min:200,max:6e3},supportedFeatures:["markdown-sections","code-blocks","lists"]}};var uj={system_identity:{header:"## Identity",placement:"section"},file_access_rules:{header:"## File Rules",placement:"section"},code_generation_rules:{header:"## Code Rules",placement:"section"},review_checklist:{header:"## Review",placement:"section"}},bv={convert(e,t){let n=[],r={includeTitle:!0,includeDescription:!0,includeMetadata:!1,...t};r.includeTitle&&n.push(`# ${e.frontmatter.name}`),r.includeDescription&&n.push(e.frontmatter.description);let o=de(e.content,e.slots,uj);return o&&n.push(o),{output:n.join(`
|
|
162
162
|
|
|
163
|
-
`),format:"warp",outputPath:".warp/rules/rulemetric.md",warnings:[]}}},
|
|
163
|
+
`),format:"warp",outputPath:".warp/rules/rulemetric.md",warnings:[]}}},Sv={id:"warp",name:"Warp Rules (experimental)",description:"Warp terminal rules file format (experimental). Community-reported path.",tier:3,outputPath:".warp/rules/rulemetric.md",toolUrl:"https://www.warp.dev/",scoringMetadata:{expectedSections:["## Identity","## File Rules","## Code Rules","## Review"],idealLengthRange:{min:200,max:6e3},supportedFeatures:["markdown-sections","code-blocks","lists"]}};var lj={system_identity:{header:"## Identity",placement:"section"},file_access_rules:{header:"## File Rules",placement:"section"},code_generation_rules:{header:"## Code Rules",placement:"section"},review_checklist:{header:"## Review",placement:"section"}},Av={convert(e,t){let n=[],r={includeTitle:!0,includeDescription:!0,includeMetadata:!1,...t};r.includeTitle&&n.push(`# ${e.frontmatter.name}`),r.includeDescription&&n.push(e.frontmatter.description);let o=de(e.content,e.slots,lj);return o&&n.push(o),{output:n.join(`
|
|
164
164
|
|
|
165
|
-
`),format:"trae",outputPath:".trae/rules/rulemetric.md",warnings:[]}}},
|
|
165
|
+
`),format:"trae",outputPath:".trae/rules/rulemetric.md",warnings:[]}}},Ev={id:"trae",name:"Trae Rules (experimental)",description:"Trae rules file format (experimental). Community-reported path.",tier:3,outputPath:".trae/rules/rulemetric.md",toolUrl:"https://www.trae.ai/",scoringMetadata:{expectedSections:["## Identity","## File Rules","## Code Rules","## Review"],idealLengthRange:{min:200,max:6e3},supportedFeatures:["markdown-sections","code-blocks","lists"]}};var pj={system_identity:{header:"## Identity",placement:"section"},file_access_rules:{header:"## File Rules",placement:"section"},code_generation_rules:{header:"## Code Rules",placement:"section"},review_checklist:{header:"## Review",placement:"section"}},xv={convert(e,t){let n=[],r={includeTitle:!0,includeDescription:!0,includeMetadata:!1,...t};r.includeTitle&&n.push(`# ${e.frontmatter.name}`),r.includeDescription&&n.push(e.frontmatter.description);let o=de(e.content,e.slots,pj);return o&&n.push(o),{output:n.join(`
|
|
166
166
|
|
|
167
|
-
`),format:"vscode-copilot",outputPath:".vscode/copilot-instructions.md",warnings:[]}}},
|
|
167
|
+
`),format:"vscode-copilot",outputPath:".vscode/copilot-instructions.md",warnings:[]}}},Tv={id:"vscode-copilot",name:"VS Code Copilot Instructions (experimental)",description:"VS Code Copilot instructions file format (experimental). Community-reported path.",tier:3,outputPath:".vscode/copilot-instructions.md",toolUrl:"https://code.visualstudio.com/",scoringMetadata:{expectedSections:["## Identity","## File Rules","## Code Rules","## Review"],idealLengthRange:{min:200,max:6e3},supportedFeatures:["markdown-sections","code-blocks","lists"]}};var mj={system_identity:{header:"## Identity",placement:"section"},file_access_rules:{header:"## File Rules",placement:"section"},code_generation_rules:{header:"## Code Rules",placement:"section"},review_checklist:{header:"## Review",placement:"section"}},Rv={convert(e,t){let n=[],r={includeTitle:!0,includeDescription:!0,includeMetadata:!1,...t};r.includeTitle&&n.push(`# ${e.frontmatter.name}`),r.includeDescription&&n.push(e.frontmatter.description);let o=de(e.content,e.slots,mj);return o&&n.push(o),{output:n.join(`
|
|
168
168
|
|
|
169
|
-
`),format:"qodo",outputPath:".qodo/guidelines.md",warnings:[]}}},
|
|
169
|
+
`),format:"qodo",outputPath:".qodo/guidelines.md",warnings:[]}}},kv={id:"qodo",name:"Qodo Guidelines (experimental)",description:"Qodo guidelines file format (experimental). Community-reported path.",tier:3,outputPath:".qodo/guidelines.md",toolUrl:"https://www.qodo.ai/",scoringMetadata:{expectedSections:["## Identity","## File Rules","## Code Rules","## Review"],idealLengthRange:{min:200,max:6e3},supportedFeatures:["markdown-sections","code-blocks","lists"]}};var fj={system_identity:{header:"## Identity",placement:"section"},file_access_rules:{header:"## File Rules",placement:"section"},code_generation_rules:{header:"## Code Rules",placement:"section"},review_checklist:{header:"## Review",placement:"section"}},jv={convert(e,t){let n=[],r={includeTitle:!0,includeDescription:!0,includeMetadata:!1,...t};r.includeTitle&&n.push(`# ${e.frontmatter.name}`),r.includeDescription&&n.push(e.frontmatter.description);let o=de(e.content,e.slots,fj);return o&&n.push(o),{output:n.join(`
|
|
170
170
|
|
|
171
|
-
`),format:"genkit",outputPath:".genkit/rulemetric.md",warnings:[]}}},
|
|
171
|
+
`),format:"genkit",outputPath:".genkit/rulemetric.md",warnings:[]}}},Nv={id:"genkit",name:"Firebase Genkit (experimental)",description:"Firebase Genkit rules file format (experimental). Community-reported path.",tier:3,outputPath:".genkit/rulemetric.md",toolUrl:"https://firebase.google.com/docs/genkit",scoringMetadata:{expectedSections:["## Identity","## File Rules","## Code Rules","## Review"],idealLengthRange:{min:200,max:6e3},supportedFeatures:["markdown-sections","code-blocks","lists"]}};var gj={system_identity:{header:"## Identity",placement:"section"},file_access_rules:{header:"## File Rules",placement:"section"},code_generation_rules:{header:"## Code Rules",placement:"section"},review_checklist:{header:"## Review",placement:"section"}},Pv={convert(e,t){let n=[],r={includeTitle:!0,includeDescription:!0,includeMetadata:!1,...t};r.includeTitle&&n.push(`# ${e.frontmatter.name}`),r.includeDescription&&n.push(e.frontmatter.description);let o=de(e.content,e.slots,gj);return o&&n.push(o),{output:n.join(`
|
|
172
172
|
|
|
173
|
-
`),format:"amp",outputPath:"AGENTS.md",warnings:[]}}},
|
|
173
|
+
`),format:"amp",outputPath:"AGENTS.md",warnings:[]}}},Cv={id:"amp",name:"Amp Rules (experimental)",description:"Amp AGENTS.md format (experimental). Uses AGENTS.md standard.",tier:3,outputPath:"AGENTS.md",toolUrl:"https://amp.dev/",scoringMetadata:{expectedSections:["## Identity","## File Rules","## Code Rules","## Review"],idealLengthRange:{min:200,max:6e3},supportedFeatures:["markdown-sections","code-blocks","lists"]}};var hj={system_identity:{header:"## Persona",placement:"section"},file_access_rules:{header:"## Knowledge",placement:"section"},code_generation_rules:{header:"## Rules",placement:"section"},review_checklist:{header:"## Workflow",placement:"section"}},Dv={convert(e,t){let n=[],r={includeTitle:!0,includeDescription:!0,includeMetadata:!1,...t};r.includeTitle&&n.push(`# ${e.frontmatter.name}`),r.includeDescription&&n.push(e.frontmatter.description);let o=de(e.content,e.slots,hj);return o&&n.push(o),{output:n.join(`
|
|
174
174
|
|
|
175
|
-
`),format:"soul-md",outputPath:"SOUL.md",warnings:[]}}},
|
|
176
|
-
`),r=t?.replace(/\.md$/i,"")??"Untitled",o={},s=[],i=null,a=[];for(let l of n){let p=l.toLowerCase().trim();if(l.startsWith("# ")&&r===(t?.replace(/\.md$/i,"")??"Untitled")){r=l.slice(2).trim();continue}let m=
|
|
175
|
+
`),format:"soul-md",outputPath:"SOUL.md",warnings:[]}}},Ov={id:"soul-md",name:"SOUL.md",description:"OpenClaw agent personality format. Defines persona, rules, constraints, and knowledge for AI agents.",tier:2,outputPath:"SOUL.md",toolUrl:"https://openclaw.org/",scoringMetadata:{expectedSections:["## Persona","## Rules","## Knowledge","## Workflow"],idealLengthRange:{min:300,max:6e3},supportedFeatures:["markdown-sections","code-blocks","lists","hierarchy"]}};var _j={"## identity":"system_identity","## file handling":"file_access_rules","## code generation":"code_generation_rules","## review process":"review_checklist"},Mv={parse(e,t){let n=e.split(`
|
|
176
|
+
`),r=t?.replace(/\.md$/i,"")??"Untitled",o={},s=[],i=null,a=[];for(let l of n){let p=l.toLowerCase().trim();if(l.startsWith("# ")&&r===(t?.replace(/\.md$/i,"")??"Untitled")){r=l.slice(2).trim();continue}let m=_j[p];if(m!==void 0){i&&(o[i]=a.join(`
|
|
177
177
|
`).trim()),i=m,a=[];continue}i?a.push(l):s.push(l)}i&&(o[i]=a.join(`
|
|
178
178
|
`).trim());let c=Object.keys(o).length>0;return{frontmatter:{name:r,description:`Imported from ${t??"AGENTS.md"}`,type:"instruction",scope:"personal",version:"1.0.0",tags:["imported"],compatibility:["agents-md"],...c?{slots:o}:{}},content:s.join(`
|
|
179
|
-
`).trim(),slots:c?o:null}}};var
|
|
180
|
-
`),r=t?.replace(/\.md$/i,"")??"Untitled",o={},s=[],i=null,a=[];for(let l of n){let p=l.toLowerCase().trim();if(l.startsWith("# ")&&r===(t?.replace(/\.md$/i,"")??"Untitled")){r=l.slice(2).trim();continue}let m=
|
|
179
|
+
`).trim(),slots:c?o:null}}};var yj={"## file access":"file_access_rules","## code rules":"code_generation_rules","## checklist":"review_checklist"},Lv={parse(e,t){let n=e.split(`
|
|
180
|
+
`),r=t?.replace(/\.md$/i,"")??"Untitled",o={},s=[],i=null,a=[];for(let l of n){let p=l.toLowerCase().trim();if(l.startsWith("# ")&&r===(t?.replace(/\.md$/i,"")??"Untitled")){r=l.slice(2).trim();continue}let m=yj[p];if(m!==void 0){i&&(o[i]=a.join(`
|
|
181
181
|
`).trim()),i=m,a=[];continue}i?a.push(l):s.push(l)}i&&(o[i]=a.join(`
|
|
182
182
|
`).trim());let c=Object.keys(o).length>0;return{frontmatter:{name:r,description:`Imported from ${t??"CLAUDE.md"}`,type:"instruction",scope:"personal",version:"1.0.0",tags:["imported"],compatibility:["claude-code"],...c?{slots:o}:{}},content:s.join(`
|
|
183
|
-
`).trim(),slots:c?o:null}}};var
|
|
184
|
-
`),s=t?.replace(/\.(mdc|cursorrules)$/i,"").replace(/^\./,"")??"Untitled",i={},a=[],c=null,l=[];for(let m of o){let y=m.toLowerCase().trim();if(m.startsWith("# ")&&s===(t?.replace(/\.(mdc|cursorrules)$/i,"").replace(/^\./,"")??"Untitled")){s=m.slice(2).trim();continue}let v=
|
|
183
|
+
`).trim(),slots:c?o:null}}};var wj={"## file rules":"file_access_rules","## rules":"code_generation_rules","## review":"review_checklist"},$v={parse(e,t){let n=e,r=e.match(/^---\n[\s\S]*?\n---\n?/);r&&(n=e.slice(r[0].length));let o=n.split(`
|
|
184
|
+
`),s=t?.replace(/\.(mdc|cursorrules)$/i,"").replace(/^\./,"")??"Untitled",i={},a=[],c=null,l=[];for(let m of o){let y=m.toLowerCase().trim();if(m.startsWith("# ")&&s===(t?.replace(/\.(mdc|cursorrules)$/i,"").replace(/^\./,"")??"Untitled")){s=m.slice(2).trim();continue}let v=wj[y];if(v!==void 0){c&&(i[c]=l.join(`
|
|
185
185
|
`).trim()),c=v,l=[];continue}c?l.push(m):a.push(m)}c&&(i[c]=l.join(`
|
|
186
186
|
`).trim());let p=Object.keys(i).length>0;return{frontmatter:{name:s,description:`Imported from ${t??".cursorrules"}`,type:"instruction",scope:"personal",version:"1.0.0",tags:["imported"],compatibility:["cursor"],...p?{slots:i}:{}},content:a.join(`
|
|
187
|
-
`).trim(),slots:p?i:null}}};var
|
|
188
|
-
`),r=t?.replace(/\.md$/i,"")??"Untitled",o={},s=[],i=null,a=[];for(let l of n){let p=l.toLowerCase().trim();if(l.startsWith("# ")&&r===(t?.replace(/\.md$/i,"")??"Untitled")){r=l.slice(2).trim();continue}let m=
|
|
187
|
+
`).trim(),slots:p?i:null}}};var vj={"## file rules":"file_access_rules","## coding rules":"code_generation_rules","## review steps":"review_checklist"},qv={parse(e,t){let n=e.split(`
|
|
188
|
+
`),r=t?.replace(/\.md$/i,"")??"Untitled",o={},s=[],i=null,a=[];for(let l of n){let p=l.toLowerCase().trim();if(l.startsWith("# ")&&r===(t?.replace(/\.md$/i,"")??"Untitled")){r=l.slice(2).trim();continue}let m=vj[p];if(m!==void 0){i&&(o[i]=a.join(`
|
|
189
189
|
`).trim()),i=m,a=[];continue}i?a.push(l):s.push(l)}i&&(o[i]=a.join(`
|
|
190
190
|
`).trim());let c=Object.keys(o).length>0;return{frontmatter:{name:r,description:`Imported from ${t??"copilot-instructions.md"}`,type:"instruction",scope:"personal",version:"1.0.0",tags:["imported"],compatibility:["github-copilot"],...c?{slots:o}:{}},content:s.join(`
|
|
191
|
-
`).trim(),slots:c?o:null}}};var
|
|
192
|
-
`),r=t?.replace(/^\./,"")??"Untitled",o={},s=[],i=null,a=[];for(let l of n){let p=l.toLowerCase().trim();if(l.startsWith("# ")&&r===(t?.replace(/^\./,"")??"Untitled")){r=l.slice(2).trim();continue}let m=
|
|
191
|
+
`).trim(),slots:c?o:null}}};var Ij={"## identity":"system_identity","## file rules":"file_access_rules","## code rules":"code_generation_rules","## review":"review_checklist"},Uv={parse(e,t){let n=e.split(`
|
|
192
|
+
`),r=t?.replace(/^\./,"")??"Untitled",o={},s=[],i=null,a=[];for(let l of n){let p=l.toLowerCase().trim();if(l.startsWith("# ")&&r===(t?.replace(/^\./,"")??"Untitled")){r=l.slice(2).trim();continue}let m=Ij[p];if(m!==void 0){i&&(o[i]=a.join(`
|
|
193
193
|
`).trim()),i=m,a=[];continue}i?a.push(l):s.push(l)}i&&(o[i]=a.join(`
|
|
194
194
|
`).trim());let c=Object.keys(o).length>0;return{frontmatter:{name:r,description:`Imported from ${t??".windsurfrules"}`,type:"instruction",scope:"personal",version:"1.0.0",tags:["imported"],compatibility:["windsurf"],...c?{slots:o}:{}},content:s.join(`
|
|
195
|
-
`).trim(),slots:c?o:null}}};var
|
|
196
|
-
`),r=t?.replace(/\.md$/i,"")??"Untitled",o={},s=[],i=null,a=[];for(let l of n){let p=l.toLowerCase().trim();if(l.startsWith("# ")&&r===(t?.replace(/\.md$/i,"")??"Untitled")){r=l.slice(2).trim();continue}let m=
|
|
195
|
+
`).trim(),slots:c?o:null}}};var bj={"## persona":"system_identity","## identity":"system_identity","## rules":"code_generation_rules","## constraints":"code_generation_rules","## workflow":"review_checklist","## knowledge":"file_access_rules"},Hv={parse(e,t){let n=e.split(`
|
|
196
|
+
`),r=t?.replace(/\.md$/i,"")??"Untitled",o={},s=[],i=null,a=[];for(let l of n){let p=l.toLowerCase().trim();if(l.startsWith("# ")&&r===(t?.replace(/\.md$/i,"")??"Untitled")){r=l.slice(2).trim();continue}let m=bj[p];if(m!==void 0){i&&(o[i]=a.join(`
|
|
197
197
|
`).trim()),i=m,a=[];continue}i?a.push(l):s.push(l)}i&&(o[i]=a.join(`
|
|
198
198
|
`).trim());let c=Object.keys(o).length>0;return{frontmatter:{name:r,description:`Imported from ${t??"SOUL.md"}`,type:"instruction",scope:"personal",version:"1.0.0",tags:["imported"],compatibility:["soul-md"],...c?{slots:o}:{}},content:s.join(`
|
|
199
|
-
`).trim(),slots:c?o:null}}};function ci(){let e=new dc;return e.register("agents-md",
|
|
199
|
+
`).trim(),slots:c?o:null}}};function ci(){let e=new dc;return e.register("agents-md",$w,qw),e.register("claude-md",Uw,Hw),e.register("cursorrules",Bw,Fw),e.register("copilot",Ww,zw),e.register("windsurf",Vw,Jw),e.register("cline",Gw,Kw),e.register("roo",Yw,Xw),e.register("aider",Qw,Zw),e.register("gemini",ev,tv),e.register("continue",nv,rv),e.register("junie",ov,sv),e.register("jetbrains",iv,av),e.register("codex",cv,dv),e.register("soul-md",Dv,Ov),e.register("amazon-q",uv,lv),e.register("goose",pv,mv),e.register("kilocode",fv,gv),e.register("augment",hv,_v),e.register("tabnine",yv,wv),e.register("opencode",vv,Iv),e.register("warp",bv,Sv),e.register("trae",Av,Ev),e.register("vscode-copilot",xv,Tv),e.register("qodo",Rv,kv),e.register("genkit",jv,Nv),e.register("amp",Pv,Cv),e.registerReverse("agents-md",Mv),e.registerReverse("claude-md",Lv),e.registerReverse("cursorrules",$v),e.registerReverse("copilot",qv),e.registerReverse("windsurf",Uv),e.registerReverse("soul-md",Hv),e}d(ci,"defaultRegistry");function Bv(e,t){let{expectedSections:n}=t;if(n.length===0)return{name:"completeness",score:100,details:"No expected sections defined."};let r=e.toLowerCase(),o=n.filter(c=>r.includes(c.toLowerCase())),s=Math.round(o.length/n.length*100),i=n.filter(c=>!r.includes(c.toLowerCase())),a=`${o.length}/${n.length} expected sections found.`;return i.length>0&&(a+=` Missing: ${i.join(", ")}`),{name:"completeness",score:s,details:a}}d(Bv,"scoreCompleteness");function Fv(e){let t=50,r=["always","never","must","use","avoid","ensure","require","do not"].filter(l=>e.toLowerCase().includes(l)).length;t+=Math.min(r*5,25);let o=(e.match(/```/g)||[]).length/2;t+=Math.min(o*5,15);let s=(e.match(/\*\.\w+|\.\w+\.\*/g)||[]).length;t+=Math.min(s*3,10);let a=["write good code","be careful","try to","when possible","if appropriate"].filter(l=>e.toLowerCase().includes(l)).length;t-=a*10,t=Math.max(0,Math.min(100,t));let c=t>=70?"Good specificity with concrete rules and examples.":t>=40?"Moderate specificity. Consider adding more concrete rules, code examples, or file patterns.":"Low specificity. Add imperative rules (always/never), code examples, and file patterns.";return{name:"specificity",score:t,details:c}}d(Fv,"scoreSpecificity");function Wv(e){let t=100,n=[];/^#{1,6} /m.test(e)||(t-=20,n.push("No markdown headings found.")),(e.match(/```/g)||[]).length%2!==0&&(t-=30,n.push("Unmatched code fence found."));let s=(e.match(/^- /gm)||[]).length,i=(e.match(/^\* /gm)||[]).length;s>0&&i>0&&(t-=10,n.push("Inconsistent list markers (mixing - and *).")),e.trim().length===0&&(t=0,n.push("Output is empty.")),t=Math.max(0,t);let a=n.length>0?n.join(" "):"Well-formatted markdown.";return{name:"formatting",score:t,details:a}}d(Wv,"scoreFormatting");function zv(e,t){let{min:n,max:r}=t.idealLengthRange,o=e.length;if(o>=n&&o<=r)return{name:"length",score:100,details:`${o} chars is within ideal range (${n}-${r}).`};let s;if(o<n)s=Math.max(0,Math.round(o/n*100));else{let a=o-r,c=r*.5;s=Math.max(0,Math.round((1-a/c)*100))}let i=o<n?`${o} chars is below ideal minimum (${n}). Add more content.`:`${o} chars exceeds ideal maximum (${r}). Consider trimming.`;return{name:"length",score:s,details:i}}d(zv,"scoreLength");function Vv(e,t){let{supportedFeatures:n}=t,r=100,o=[];!n.includes("mdc-frontmatter")&&/^---\n/m.test(e)&&(r-=20,o.push("Contains YAML frontmatter but format may not support it.")),!n.includes("import-syntax")&&/@import\b/.test(e)&&(r-=15,o.push("Contains @import syntax but format does not support it.")),!n.includes("code-blocks")&&/```/.test(e)&&(r-=10,o.push("Contains code blocks but format may not render them.")),r=Math.max(0,r);let s=o.length>0?o.join(" "):"Output uses only supported features.";return{name:"compatibility",score:r,details:s}}d(Vv,"scoreCompatibility");function af(e,t){let n=[{...Bv(e,t),weight:.3},{...Fv(e),weight:.25},{...Wv(e),weight:.15},{...zv(e,t),weight:.15},{...Vv(e,t),weight:.15}],r=Math.round(n.reduce((s,i)=>s+i.score*i.weight,0)),o=[];for(let s of n)s.score<50?o.push({dimension:s.name,message:s.details,severity:s.score<30?"error":"warning"}):s.score<70&&o.push({dimension:s.name,message:s.details,severity:"info"});return{overall:r,dimensions:n,suggestions:o}}d(af,"scoreOutput");function cf(e,t,n){let r=e.split(`
|
|
200
200
|
`),o=t.split(`
|
|
201
201
|
`),s=n.split(`
|
|
202
|
-
`),i=
|
|
203
|
-
`),hasConflicts:c.length>0,conflicts:c}}d(
|
|
202
|
+
`),i=Jv(r,o),a=Jv(r,s),c=[],l=[],p=0;for(;p<r.length||i.has(p)||a.has(p);){let m=i.get(p),y=a.get(p);if(m&&y)Aj(m.newLines,y.newLines)?l.push(...m.newLines):(c.push({localLines:y.newLines,upstreamLines:m.newLines,startLine:p}),l.push("<<<<<<< local"),l.push(...y.newLines),l.push("======="),l.push(...m.newLines),l.push(">>>>>>> upstream")),i.delete(p),a.delete(p),p=Math.max(m.endBase,y.endBase);else if(m)l.push(...m.newLines),i.delete(p),p=m.endBase;else if(y)l.push(...y.newLines),a.delete(p),p=y.endBase;else if(p<r.length)l.push(r[p]),p++;else break}return{merged:l.join(`
|
|
203
|
+
`),hasConflicts:c.length>0,conflicts:c}}d(cf,"threeWayMerge");function Jv(e,t){let n=new Map,r=Sj(e,t),o=0,s=0,i=0;for(;o<e.length||s<t.length;)if(i<r.length&&o<e.length&&s<t.length&&e[o]===r[i]&&t[s]===r[i])o++,s++,i++;else{let a=o,c=[];for(;o<e.length&&(i>=r.length||e[o]!==r[i]);)o++;for(;s<t.length&&(i>=r.length||t[s]!==r[i]);)c.push(t[s]),s++;n.set(a,{newLines:c,endBase:o})}return n}d(Jv,"diffLines");function Sj(e,t){let n=e.length,r=t.length,o=Array.from({length:n+1},()=>Array(r+1).fill(0));for(let c=1;c<=n;c++)for(let l=1;l<=r;l++)o[c][l]=e[c-1]===t[l-1]?o[c-1][l-1]+1:Math.max(o[c-1][l],o[c][l-1]);let s=[],i=n,a=r;for(;i>0&&a>0;)e[i-1]===t[a-1]?(s.unshift(e[i-1]),i--,a--):o[i-1][a]>o[i][a-1]?i--:a--;return s}d(Sj,"computeLCS");function Aj(e,t){return e.length===t.length&&e.every((n,r)=>n===t[r])}d(Aj,"arraysEqual");var Eu=class{static{d(this,"AnthropicProvider")}name="anthropic";apiKey;constructor(t){this.apiKey=t}async complete(t,n){let r=n?.model??"claude-sonnet-4-5-20250929",o=n?.maxTokens??2048,s=n?.temperature??.3,i=await fetch("https://api.anthropic.com/v1/messages",{method:"POST",headers:{"Content-Type":"application/json","x-api-key":this.apiKey,"anthropic-version":"2023-06-01"},body:JSON.stringify({model:r,max_tokens:o,temperature:s,messages:[{role:"user",content:t}]})});if(!i.ok){let c=await i.text();throw new Error(`Anthropic API error (${i.status}): ${c}`)}let a=await i.json();return{text:a.content.filter(c=>c.type==="text").map(c=>c.text).join(""),usage:{inputTokens:a.usage.input_tokens,outputTokens:a.usage.output_tokens}}}};var xu=class{static{d(this,"OpenAIProvider")}name="openai";apiKey;constructor(t){this.apiKey=t}async complete(t,n){let r=n?.model??"gpt-4o",o=n?.maxTokens??2048,s=n?.temperature??.3,i=await fetch("https://api.openai.com/v1/chat/completions",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`},body:JSON.stringify({model:r,max_tokens:o,temperature:s,messages:[{role:"user",content:t}]})});if(!i.ok){let c=await i.text();throw new Error(`OpenAI API error (${i.status}): ${c}`)}let a=await i.json();return{text:a.choices[0]?.message.content??"",usage:{inputTokens:a.usage.prompt_tokens,outputTokens:a.usage.completion_tokens}}}};var Ej={anthropic:d(e=>new Eu(e),"anthropic"),openai:d(e=>new xu(e),"openai")};function uc(e,t){let n=Ej[e];if(!n)throw new Error(`Unknown LLM provider: ${e}`);return n(t)}d(uc,"createLLMProvider");function lc(e,t){let n=t.map(r=>`- ID: ${r.id}
|
|
204
204
|
Name: ${r.name}
|
|
205
205
|
Description: ${r.description}
|
|
206
206
|
Tags: ${r.tags.join(", ")}
|
|
@@ -233,14 +233,14 @@ Return your response as JSON in this exact format:
|
|
|
233
233
|
]
|
|
234
234
|
}
|
|
235
235
|
|
|
236
|
-
Only include instructions with a relevance score >= 0.5. Order by score descending. Return valid JSON only, no markdown fences.`}d(lc,"buildRecommendationPrompt");function
|
|
236
|
+
Only include instructions with a relevance score >= 0.5. Order by score descending. Return valid JSON only, no markdown fences.`}d(lc,"buildRecommendationPrompt");function df(e){try{let t=e.match(/\{[\s\S]*\}/);if(!t)return[];let n=JSON.parse(t[0]);return!n.recommendations||!Array.isArray(n.recommendations)?[]:n.recommendations.filter(r=>typeof r.instructionId=="string"&&typeof r.score=="number"&&typeof r.reason=="string")}catch{return[]}}d(df,"parseRecommendationResponse");var Gv=32e3,xj={name:"x".repeat(64),description:"x".repeat(256),languages:["TypeScript","Python","Go"],topics:["x".repeat(32)],dependencies:["x".repeat(32)]};function uf(e,t={}){if(e.length===0)return[];let n=t.charBudget??Gv,r=lc(xj,[]).length,o=[],s=[],i=0;for(let a of e){let c=Tj(a);s.length>0&&r+i+c>n&&(o.push(s),s=[],i=0),s.push(a),i+=c}return s.length>0&&o.push(s),o}d(uf,"batchCandidatesForPrompt");function Tj(e){return`- ID: ${e.id}
|
|
237
237
|
Name: ${e.name}
|
|
238
238
|
Description: ${e.description}
|
|
239
239
|
Tags: ${e.tags.join(", ")}
|
|
240
|
-
Preview: ${e.contentPreview}`.length+2}d(
|
|
241
|
-
`);for(let i of Rj){let a=o.match(i.pattern);a&&r.push({pattern:i.description,severity:i.severity,category:i.category,match:a[0].slice(0,100)})}let s=100;for(let i of r)s-=Tj[i.severity]??5;return{score:Math.max(0,Math.min(100,s)),findings:r}}d(df,"scanContent");var wn=new kj,Nj=ct.object({name:ct.string().min(1).max(255),description:ct.string().min(1),scope:ct.enum(["org","team","project","personal"]),scopeRef:ct.string().uuid().optional(),version:ct.string().default("1.0.0"),content:ct.string().min(1),tags:ct.array(ct.string()).optional(),compatibility:ct.array(ct.string()).optional()}),Pj=ct.object({name:ct.string().min(1).max(255).optional(),description:ct.string().min(1).optional(),version:ct.string().optional(),content:ct.string().min(1).optional(),tags:ct.array(ct.string()).optional(),compatibility:ct.array(ct.string()).optional(),changeSummary:ct.string().optional()});wn.get("/instructions",async e=>{let t=e.get("userId"),n=e.req.query("search"),r=e.req.query("scope"),o=e.req.query("tags"),s=e.req.query("type"),i=parseInt(e.req.query("limit")??"100",10),a=parseInt(e.req.query("offset")??"0",10),c=[Me(g.archived,!1),Me(g.createdBy,t)];if(r&&c.push(Me(g.scope,r)),s&&c.push(Me(g.type,s)),n){let h=ot(n);c.push(lf(uf(g.name,`%${h}%`),uf(g.description,`%${h}%`),uf(g.content,`%${h}%`)))}let l=await u.select().from(g).where(dr(...c)).orderBy(Vv(g.updatedAt)).limit(i).offset(a);if(o){let h=o.split(",").map(f=>f.trim().toLowerCase());l=l.filter(f=>h.some(w=>f.tags?.some(b=>b.toLowerCase().includes(w))))}let p=l.map(h=>h.id),m=p.length>0?await u.select({instructionId:at.instructionId,projectName:U.name,projectId:U.id}).from(at).innerJoin(U,Me(U.id,at.projectId)).where(di`${at.instructionId} IN (${di.join(p.map(h=>di`${h}`),di`, `)})`):[],y=new Map;for(let h of m){let f=y.get(h.instructionId)??[];f.push({projectId:h.projectId,projectName:h.projectName}),y.set(h.instructionId,f)}let v=l.map(h=>({...h,projects:y.get(h.id)??[]}));return Tt({userId:t,surface:"api",action:"list"}),e.json(v)});wn.get("/instructions/by-hash/:hash",async e=>{let t=e.get("userId"),n=e.req.param("hash"),[r]=await u.select({id:g.id,name:g.name,contextIdentity:g.contextIdentity,version:g.version,type:g.type}).from(g).where(dr(Me(g.contentHash,n),Me(g.createdBy,t),Me(g.archived,!1))).limit(1);return r?e.json({instruction:r}):e.json({instruction:null})});wn.post("/instructions/by-hashes",async e=>{let t=e.get("userId"),n=await e.req.json(),r=ct.array(ct.string()).max(200).parse(n.hashes??[]),o=ct.array(ct.string()).max(200).parse(n.identities??[]);if(r.length===0&&o.length===0)return e.json({instructions:{}});let s=[Me(g.createdBy,t),Me(g.archived,!1)],i=[];r.length>0&&i.push(zv(g.contentHash,r)),o.length>0&&i.push(zv(g.contextIdentity,o));let a=await u.select({id:g.id,name:g.name,contextIdentity:g.contextIdentity,version:g.version,type:g.type,contentHash:g.contentHash,source:di`${g.frontmatter}->>'source'`}).from(g).where(dr(...s,i.length===1?i[0]:lf(...i))),c={};for(let l of a)l.contentHash&&(c[l.contentHash]=l),l.contextIdentity&&(c[l.contextIdentity]=l);return e.json({instructions:c})});wn.get("/instructions/:id/sessions",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await u.select({sessionId:se.sessionId,linkMethod:se.linkMethod,tool:_.tool,projectPath:_.projectPath,startedAt:_.startedAt,endedAt:_.endedAt,analysis:_.analysis}).from(se).innerJoin(_,Me(_.id,se.sessionId)).where(dr(Me(se.instructionId,n),Me(_.userId,t))).orderBy(Vv(_.startedAt)).limit(50);return e.json({sessions:r})});wn.get("/instructions/:id",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await u.select().from(g).where(dr(Me(g.id,t),Me(g.archived,!1),lf(Me(g.createdBy,n),Me(g.scope,"public"))));return r?(Tt({instructionId:t,userId:n,surface:"api",action:"view"}),e.json(r)):e.json({error:"Instruction not found"},404)});var Cj=/<\/?(?:system-reminder|system|available-deferred-tools|tool-result)>/i;function Jv(e){return Cj.test(e)?"Content contains forbidden system tags":null}d(Jv,"validateNoForbiddenTags");wn.post("/instructions",async e=>{let t=e.get("userId"),n=await e.req.json(),r=Nj.parse(n),o=Jv(r.content);if(o)return e.json({error:o},422);r.name=cr(r.name),r.description=cr(r.description);let s={},i=null;try{let p=ai(r.content);s=p.frontmatter,i=p.slots}catch{s={name:r.name,description:r.description,type:"instruction",scope:r.scope,version:r.version}}let a=r.scope==="personal"?t:r.scopeRef??null,c=df(r.content,r.name,r.description),[l]=await u.insert(g).values({name:r.name,description:r.description,type:"instruction",scope:r.scope,scopeRef:a,version:r.version,content:r.content,frontmatter:s,slots:i,tags:r.tags??[],compatibility:r.compatibility??[],createdBy:t,scanScore:c.score,scanFindings:c.findings.length>0?c.findings:null}).returning();return await u.insert(Ie).values({instructionId:l.id,versionNumber:1,content:r.content,frontmatter:s,changeSummary:"Initial version",createdBy:t}),Tt({instructionId:l.id,userId:t,surface:"api",action:"create"}),e.json(l,201)});wn.put("/instructions/:id",async e=>{let t=e.req.param("id"),n=e.get("userId"),r=await e.req.json(),o=Pj.parse(r);if(o.content){let m=Jv(o.content);if(m)return e.json({error:m},422)}o.name&&(o.name=cr(o.name)),o.description&&(o.description=cr(o.description));let[s]=await u.select().from(g).where(dr(Me(g.id,t),Me(g.createdBy,n),Me(g.archived,!1)));if(!s)return e.json({error:"Instruction not found"},404);let i=s.frontmatter,a=s.slots;if(o.content)try{let m=ai(o.content);i=m.frontmatter,a=m.slots}catch{}let c={};if(o.content||o.name||o.description){let m=df(o.content??s.content,o.name??s.name,o.description??s.description);c.scanScore=m.score,c.scanFindings=m.findings.length>0?m.findings:null}let l,p=4;for(let m=0;m<=p;m++)try{l=await u.transaction(async y=>{await y.select({id:g.id}).from(g).where(Me(g.id,t)).for("update");let[{maxVersion:v}]=await y.select({maxVersion:di`COALESCE(MAX(${Ie.versionNumber}), 0)`}).from(Ie).where(Me(Ie.instructionId,t)),h=v+1,[f]=await y.update(g).set({...o.name&&{name:o.name},...o.description&&{description:o.description},...o.version&&{version:o.version},...o.content&&{content:o.content},...o.tags&&{tags:o.tags},...o.compatibility&&{compatibility:o.compatibility},frontmatter:i,slots:a,...c,updatedAt:new Date}).where(Me(g.id,t)).returning();return await y.insert(Ie).values({instructionId:t,versionNumber:h,content:o.content??s.content,frontmatter:i,changeSummary:o.changeSummary??null,createdBy:n}),f});break}catch(y){if(y.cause?.code==="23505"&&m<p)continue;throw y}return l?(Tt({instructionId:t,userId:n,surface:"api",action:"update"}),e.json(l)):e.json({error:"Instruction update failed"},500)});wn.delete("/instructions/:id",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await u.select().from(g).where(dr(Me(g.id,t),Me(g.createdBy,n),Me(g.archived,!1)));if(!r)return e.json({error:"Instruction not found"},404);let[o]=await u.update(g).set({archived:!0,archivedAt:new Date,archivedBy:n}).where(Me(g.id,t)).returning(),s=await u.update(x).set({dismissedAt:new Date,isStale:!0}).where(dr(Me(x.userId,n),Me(x.instructionId,t),jj(x.dismissedAt))).returning({id:x.id});return Tt({instructionId:t,userId:n,surface:"api",action:"delete"}),e.json({...o,dismissedSuggestions:s.length})});wn.post("/instructions/:id/restore",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await u.select().from(g).where(dr(Me(g.id,t),Me(g.createdBy,n),Me(g.archived,!0)));if(!r)return e.json({error:"Archived instruction not found"},404);let[o]=await u.update(g).set({archived:!1,archivedAt:null,archivedBy:null}).where(Me(g.id,t)).returning();return Tt({instructionId:t,userId:n,surface:"api",action:"update"}),e.json(o)});wn.get("/instructions/:id/versions",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await u.select({id:g.id}).from(g).where(dr(Me(g.id,t),Me(g.createdBy,n)));if(!r)return e.json({error:"Instruction not found"},404);let o=await u.select().from(Ie).where(Me(Ie.instructionId,t)).orderBy(Ie.versionNumber);return e.json(o)});O();import{Hono as Oj}from"hono";import{z as pf}from"zod";import{eq as Gv,and as Dj}from"drizzle-orm";var xu=new Oj,Mj=pf.object({format:pf.enum(Iu),score:pf.enum(["true","false"]).optional().default("false")});xu.post("/instructions/:id/convert",async e=>{let t=e.req.param("id"),n=Mj.parse(e.req.query()),r=n.format,o=n.score==="true",[s]=await u.select().from(g).where(Dj(Gv(g.id,t),Gv(g.archived,!1)));if(!s)return e.json({error:"Instruction not found"},404);let i;try{i=ai(s.content)}catch{i={frontmatter:{name:s.name,description:s.description??"",type:"instruction",scope:s.scope,version:s.version??"1.0.0",tags:s.tags??[],compatibility:s.compatibility??[]},content:s.content,slots:s.slots}}let a=ci(),c=a.get(r);if(!c)return e.json({error:`Unsupported format: ${r}`},400);let l=c.convert(i),p=e.get("userId");if(Tt({instructionId:t,userId:p,surface:"api",action:"convert",metadata:{format:r}}),o){let m=a.getMetadata(r);if(m){let y=nf(l.output,m.scoringMetadata);return e.json({...l,score:y})}}return e.json(l)});import{Hono as Lj}from"hono";var Tu=new Lj;Tu.get("/converters",async e=>{let n=ci().listAll().map(r=>({id:r.metadata.id,name:r.metadata.name,description:r.metadata.description,tier:r.metadata.tier,outputPath:r.metadata.outputPath,toolUrl:r.metadata.toolUrl}));return e.json(n)});O();import{Hono as $j}from"hono";import{z as qr}from"zod";var Ru=new $j,qj=qr.object({content:qr.string().min(1),sourceFormat:qr.enum(Iu).optional(),filename:qr.string().optional(),name:qr.string().optional(),scope:qr.enum(["org","team","project","personal"]).default("personal"),scopeRef:qr.string().uuid().optional(),tags:qr.array(qr.string()).optional()});Ru.post("/instructions/import",async e=>{let t=e.get("userId"),n=await e.req.json(),r=qj.parse(n),o=r.sourceFormat??null;if(!o){let m=ef({filename:r.filename,content:r.content});m&&(o=m.format)}if(!o)return e.json({error:"Could not detect format. Provide sourceFormat explicitly."},400);let s=ci(),i=s.getReverse(o);if(!i)return e.json({error:`No import parser for format: ${o}`,supportedFormats:s.listReverseFormats()},400);let a=i.parse(r.content,r.filename),c=r.name??a.frontmatter.name,l=r.scope==="personal"?t:r.scopeRef??null,[p]=await u.insert(g).values({name:c,description:a.frontmatter.description,type:"instruction",scope:r.scope,scopeRef:l,version:"1.0.0",content:a.content,frontmatter:a.frontmatter,slots:a.slots,tags:r.tags??a.frontmatter.tags??[],compatibility:a.frontmatter.compatibility??[],createdBy:t}).returning();return await u.insert(Ie).values({instructionId:p.id,versionNumber:1,content:a.content,frontmatter:a.frontmatter,changeSummary:`Imported from ${o}`,createdBy:t}),Tt({instructionId:p.id,userId:t,surface:"api",action:"import",metadata:{sourceFormat:o}}),e.json({instruction:p,sourceFormat:o,parseWarnings:[]},201)});O();import{Hono as Uj}from"hono";import{eq as po,and as mf}from"drizzle-orm";var pc=new Uj;pc.post("/instructions/:id/fork",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(g).where(mf(po(g.id,n),po(g.archived,!1)));if(!r)return e.json({error:"Instruction not found"},404);if(r.createdBy===t)return e.json({error:"Cannot fork your own instruction"},400);if(r.scope==="org"&&r.scopeRef){let[s]=await u.select({id:g.id}).from(g).where(mf(po(g.createdBy,t),po(g.scope,"org"),po(g.scopeRef,r.scopeRef))).limit(1);if(!s)return e.json({error:"Instruction not found"},404)}else if(r.scope!=="org")return e.json({error:"Instruction not found"},404);let[o]=await u.insert(g).values({name:`${r.name} (fork)`,description:r.description,type:r.type,scope:"personal",scopeRef:t,version:"1.0.0",content:r.content,frontmatter:r.frontmatter,slots:r.slots,tags:r.tags,compatibility:r.compatibility,createdBy:t,forkedFromId:r.id,upstreamVersion:r.version}).returning();return await u.insert(Ie).values({instructionId:o.id,versionNumber:1,content:o.content,frontmatter:o.frontmatter,changeSummary:`Forked from ${r.name}`,createdBy:t}),await u.insert(Ct).values({instructionId:o.id,eventType:"fork",actorId:t,metadata:{sourceId:r.id,sourceName:r.name,sourceVersion:r.version}}),Tt({instructionId:o.id,userId:t,surface:"api",action:"fork"}),e.json(o,201)});pc.get("/instructions/:id/events",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await u.select({id:g.id}).from(g).where(mf(po(g.id,t),po(g.createdBy,n)));if(!r)return e.json({error:"Instruction not found"},404);let o=await u.select().from(Ct).where(po(Ct.instructionId,t)).orderBy(Ct.createdAt);return e.json(o)});O();import{Hono as Hj}from"hono";import{eq as Vn,and as Kv,sql as Bj}from"drizzle-orm";var mc=new Hj;mc.get("/instructions/:id/upstream",async e=>{let t=e.req.param("id"),[n]=await u.select().from(g).where(Kv(Vn(g.id,t),Vn(g.archived,!1)));if(!n)return e.json({error:"Instruction not found"},404);if(!n.forkedFromId)return e.json({error:"This instruction is not a fork"},400);let[r]=await u.select().from(g).where(Vn(g.id,n.forkedFromId));return r?e.json({hasUpdate:r.version!==n.upstreamVersion,currentVersion:n.upstreamVersion,upstreamVersion:r.version,parentId:r.id,parentName:r.name}):e.json({hasUpdate:!1,currentVersion:n.upstreamVersion,upstreamVersion:null,parentId:n.forkedFromId})});mc.post("/instructions/:id/pull-upstream",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(g).where(Kv(Vn(g.id,n),Vn(g.createdBy,t),Vn(g.archived,!1)));if(!r)return e.json({error:"Instruction not found"},404);if(!r.forkedFromId)return e.json({error:"This instruction is not a fork"},400);let[o]=await u.select().from(g).where(Vn(g.id,r.forkedFromId));if(!o)return e.json({error:"Parent instruction no longer exists"},404);let[s]=await u.select().from(Ie).where(Vn(Ie.instructionId,o.id)).orderBy(Ie.versionNumber).limit(1),i=s?.content??o.content,a=rf(i,o.content,r.content);if(a.hasConflicts)return e.json({hasConflicts:!0,merged:a.merged,conflicts:a.conflicts});let c,l=4;for(let p=0;p<=l;p++)try{c=await u.transaction(async m=>{await m.select({id:g.id}).from(g).where(Vn(g.id,n)).for("update");let[y]=await m.select({maxVersion:Bj`COALESCE(MAX(${Ie.versionNumber}), 0)`}).from(Ie).where(Vn(Ie.instructionId,n)),v=(y?.maxVersion??0)+1,[h]=await m.update(g).set({content:a.merged,upstreamVersion:o.version,updatedAt:new Date}).where(Vn(g.id,n)).returning();return await m.insert(Ie).values({instructionId:n,versionNumber:v,content:a.merged,frontmatter:r.frontmatter,changeSummary:`Pulled upstream changes from ${o.name} (${o.version})`,createdBy:t}),await m.insert(Ct).values({instructionId:n,eventType:"pull_upstream",actorId:t,metadata:{parentId:o.id,parentVersion:o.version,previousUpstreamVersion:r.upstreamVersion}}),h});break}catch(m){if(m.cause?.code==="23505"&&p<l)continue;throw m}return c?(Tt({instructionId:n,userId:t,surface:"api",action:"pull_upstream"}),e.json({hasConflicts:!1,instruction:c})):e.json({error:"Pull-upstream failed after version conflict"},500)});O();import{Hono as Fj}from"hono";import{z as mo}from"zod";import{eq as Ot,and as as,sql as Wj}from"drizzle-orm";var zj=mo.object({scope:mo.enum(["team","org"]),scopeRef:mo.string().uuid()}),fc=new Fj;fc.post("/instructions/:id/promote",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=zj.parse(await e.req.json()),[o]=await u.select().from(g).where(as(Ot(g.id,n),Ot(g.createdBy,t),Ot(g.archived,!1)));if(!o)return e.json({error:"Instruction not found"},404);if(o.scope==="org")return e.json({error:"Instruction is already org-scoped"},400);if(r.scope==="team"){let[c]=await u.select().from(ye).where(as(Ot(ye.userId,t),Ot(ye.teamId,r.scopeRef)));if(!c)return e.json({error:"You are not a member of this team"},403)}else if(r.scope==="org"){let[c]=await u.select().from(Q).where(as(Ot(Q.userId,t),Ot(Q.orgId,r.scopeRef)));if(!c||c.role!=="admin"&&c.role!=="owner")return e.json({error:"You must be an org admin to promote to org scope"},403)}let s=o.scope,i=o.scopeRef,[a]=await u.update(g).set({scope:r.scope,scopeRef:r.scopeRef,updatedAt:new Date}).where(Ot(g.id,n)).returning();return await u.insert(Ct).values({instructionId:n,eventType:"promote",actorId:t,metadata:{fromScope:s,fromScopeRef:i,toScope:r.scope,toScopeRef:r.scopeRef}}),Tt({instructionId:n,userId:t,surface:"api",action:"promote"}),e.json(a)});var Vj=mo.object({targetScope:mo.enum(["personal","team","org"]),targetScopeRef:mo.string().uuid().optional(),name:mo.string().optional(),seedEvalTarget:mo.boolean().optional()});async function Jj(e){let[t]=await u.select({id:k.id}).from(k).where(Wj`${k.metadata}->>'instructionId' = ${e}`).limit(1);return t??null}d(Jj,"findExistingEvalTarget");fc.post("/instructions/:id/promote-from-public",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=Vj.parse(await e.req.json()),[o]=await u.select().from(g).where(as(Ot(g.id,n),Ot(g.scope,"public")));if(!o)return e.json({error:"Public instruction not found"},404);if(r.targetScope==="team"){if(!r.targetScopeRef)return e.json({error:"targetScopeRef is required for team scope"},400);let[m]=await u.select().from(ye).where(as(Ot(ye.userId,t),Ot(ye.teamId,r.targetScopeRef)));if(!m)return e.json({error:"You are not a member of this team"},403)}else if(r.targetScope==="org"){if(!r.targetScopeRef)return e.json({error:"targetScopeRef is required for org scope"},400);let[m]=await u.select().from(Q).where(as(Ot(Q.userId,t),Ot(Q.orgId,r.targetScopeRef)));if(!m||m.role!=="admin"&&m.role!=="owner")return e.json({error:"You must be an org admin to promote into an org"},403)}let s=r.targetScope==="personal"?t:r.targetScopeRef,i=r.name??o.name,a=r.seedEvalTarget??(r.targetScope==="org"||r.targetScope==="team"),[c]=await u.select().from(g).where(as(Ot(g.scope,r.targetScope),Ot(g.scopeRef,s),Ot(g.forkedFromId,n),Ot(g.archived,!1)));if(c){let m=null;return a&&(m=(await Jj(c.id))?.id??null),e.json({instructionId:c.id,alreadyExisted:!0,evalTargetId:m})}let[l]=await u.insert(g).values({name:i,description:o.description,type:o.type,scope:r.targetScope,scopeRef:s,version:o.version,content:o.content,frontmatter:o.frontmatter,slots:o.slots,tags:o.tags,compatibility:o.compatibility,createdBy:t,forkedFromId:o.id,upstreamVersion:o.upstreamVersion??o.version,contentHash:o.contentHash,contextIdentity:o.contextIdentity}).returning();if(!l)return e.json({error:"Failed to clone instruction"},500);await u.insert(Ie).values({instructionId:l.id,versionNumber:1,content:o.content,frontmatter:o.frontmatter,changeSummary:`Promoted from public skill ${o.name}`,createdBy:t}),await u.insert(Ct).values({instructionId:l.id,eventType:"promote_from_public",actorId:t,metadata:{sourceInstructionId:o.id,sourceName:o.name,targetScope:r.targetScope,targetScopeRef:s}}),Tt({instructionId:l.id,userId:t,surface:"api",action:"promote_from_public"});let p=null;if(a){let[m]=await u.insert(k).values({userId:t,name:`${i} \u2014 baseline eval`,type:"instruction",content:o.content,description:`Auto-seeded from public skill \`${o.name}\` on promote.`,metadata:{instructionId:l.id,publicSourceId:o.id,publicContentHash:o.contentHash??null,publicVersion:o.version??null}}).returning({id:k.id});p=m?.id??null}return e.json({instructionId:l.id,alreadyExisted:!1,evalTargetId:p})});O();import{Hono as Gj}from"hono";import{z as Yv}from"zod";import{eq as vn,and as gc,or as Xv,inArray as Qv,sql as ku,desc as Kj}from"drizzle-orm";var hc=new Gj,Yj=Yv.object({badge:Yv.enum(["recommended","required"]).nullable()});hc.get("/catalog",async e=>{let t=e.get("userId"),n=e.req.query("badge"),r=e.req.query("scope"),o=e.req.query("search"),s=parseInt(e.req.query("contentPreview")??"0",10),i=Number.isFinite(s)?Math.min(Math.max(s,0),400):0,a=parseInt(e.req.query("limit")??"50",10),c=parseInt(e.req.query("offset")??"0",10),l=Math.min(Math.max(a,1),200),p=Math.max(c,0),m=await u.select({orgId:Q.orgId}).from(Q).where(vn(Q.userId,t)),y=await u.select({teamId:ye.teamId}).from(ye).where(vn(ye.userId,t)),v=m.map(E=>E.orgId).filter(E=>E!==null),h=y.map(E=>E.teamId).filter(E=>E!==null),f=[vn(g.archived,!1)],w=[vn(g.scope,"public")];if(v.length>0&&w.push(gc(vn(g.scope,"org"),Qv(g.scopeRef,v))),h.length>0&&w.push(gc(vn(g.scope,"team"),Qv(g.scopeRef,h))),f.push(Xv(...w)),n&&f.push(vn(g.badge,n)),r&&f.push(vn(g.scope,r)),o){let E=ot(o);f.push(Xv(ku`${g.name} ILIKE ${`%${E}%`}`,ku`${g.description} ILIKE ${`%${E}%`}`))}let b=[Kj(ku`COALESCE(${g.sourceUpdatedAt}, ${g.updatedAt})`)],I={id:g.id,name:g.name,description:g.description,type:g.type,scope:g.scope,scopeRef:g.scopeRef,version:g.version,tags:g.tags,badge:g.badge,popularityScore:g.popularityScore,updatedAt:g.updatedAt,createdAt:g.createdAt,sourceUpdatedAt:g.sourceUpdatedAt},A=await(i>0?nt:u).select(i>0?{...I,contentPreview:ku`left(${g.content}, ${i})`}:I).from(g).where(gc(...f)).orderBy(...b).limit(l).offset(p);return Tt({userId:t,surface:"api",action:"search",metadata:o?{query:o}:void 0}),e.header("Cache-Control","private, max-age=30"),e.json(A)});hc.post("/instructions/:id/badge",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=Yj.parse(await e.req.json()),[o]=await u.select().from(g).where(gc(vn(g.id,n),vn(g.archived,!1)));if(!o)return e.json({error:"Instruction not found"},404);if(o.scope!=="org"&&o.scope!=="team")return e.json({error:"Badges can only be set on org or team-scoped instructions"},400);let s=o.scopeRef;if(!s)return e.json({error:"Instruction has no scope reference"},400);let[i]=await u.select().from(Q).where(gc(vn(Q.userId,t),vn(Q.orgId,s)));if(!i||i.role!=="admin"&&i.role!=="owner")return e.json({error:"Only admins of the owning organization can set badges"},403);let[a]=await u.update(g).set({badge:r.badge,updatedAt:new Date}).where(vn(g.id,n)).returning(),c=r.badge?"badge_set":"badge_removed";return await u.insert(Ct).values({instructionId:n,eventType:c,actorId:t,metadata:{badge:r.badge}}),e.json(a)});O();import{Hono as Xj}from"hono";import{eq as fo,and as ju,or as Qj,inArray as Zv}from"drizzle-orm";var Nu=new Xj;Nu.post("/projects/:id/recommendations",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(U).where(ju(fo(U.id,n),fo(U.createdBy,t)));if(!r)return e.json({error:"Project not found"},404);let o=await u.select({orgId:Q.orgId}).from(Q).where(fo(Q.userId,t)),s=await u.select({teamId:ye.teamId}).from(ye).where(fo(ye.userId,t)),i=o.map(f=>f.orgId).filter(f=>f!==null),a=s.map(f=>f.teamId).filter(f=>f!==null),c=[fo(g.scope,"public")];i.length>0&&c.push(ju(fo(g.scope,"org"),Zv(g.scopeRef,i))),a.length>0&&c.push(ju(fo(g.scope,"team"),Zv(g.scopeRef,a)));let l=await u.select().from(g).where(ju(fo(g.archived,!1),Qj(...c))).limit(50);if(l.length===0)return e.json({recommendations:[],error:null});let p={name:r.name,description:r.description,languages:[],topics:[],dependencies:[]};if(r.githubRepo)try{let f=r.githubRepo.replace("https://github.com/",""),[w,b]=await Promise.all([fetch(`https://api.github.com/repos/${f}`,{headers:{Accept:"application/vnd.github.v3+json","User-Agent":"RuleMetric"}}),fetch(`https://api.github.com/repos/${f}/languages`,{headers:{Accept:"application/vnd.github.v3+json","User-Agent":"RuleMetric"}})]);if(w.ok){let I=await w.json();p.topics=I.topics??[]}if(b.ok){let I=await b.json();p.languages=Object.keys(I)}}catch{}let m=l.map(f=>({id:f.id,name:f.name,description:f.description??"",tags:f.tags??[],contentPreview:(f.content??"").slice(0,400)})),y=process.env.LLM_PROVIDER,v=process.env.LLM_API_KEY;if(!y||!v)return e.json({recommendations:[],error:"LLM not configured"});let h=await af(p,m,{llmProvider:y,llmApiKey:v});return e.json(h)});import{Hono as JN}from"hono";O();import{Hono as vN}from"hono";import{z as Of}from"zod";import{eq as mt,and as Sc,desc as yI,sql as Kn}from"drizzle-orm";O();import{and as uN,eq as Cf,sql as lN}from"drizzle-orm";function ff(e,t){let n=e,r=t,o=n+r;if(o===0)return{pValue:1,nDiscordant:0};let s=Math.min(n,r),i=Math.pow(.5,o),a=i;for(let c=1;c<=s;c++)i*=(o-c+1)/c,a+=i;return{pValue:Math.min(1,2*a),nDiscordant:o}}d(ff,"mcnemarExact");function Pu(e,t,n=10){return{sufficient:e>=n&&t>=n,minN:n,nWith:e,nWithout:t,shortfall:{with:Math.max(0,n-e),without:Math.max(0,n-t)}}}d(Pu,"assessSufficiency");var go=1.959963984540054;function Cu(e,t,n=go){if(t===0)return{lower:0,upper:1};let r=e/t,o=n*n,s=1+o/t,i=(r+o/(2*t))/s,a=n/s*Math.sqrt(r*(1-r)/t+o/(4*t*t));return{lower:Math.max(0,i-a),upper:Math.min(1,i+a)}}d(Cu,"wilsonInterval");function li(e){let t=e>>>0;return()=>{t=t+1831565813|0;let n=Math.imul(t^t>>>15,1|t);return n=n+Math.imul(n^n>>>7,61|n)^n,((n^n>>>14)>>>0)/4294967296}}d(li,"seededRandom");function ui(e,t){let n=e.length;if(n===1)return e[0];let r=(n-1)*t,o=Math.floor(r),s=Math.ceil(r);return o===s?e[o]:e[o]+(r-o)*(e[s]-e[o])}d(ui,"sortedQuantile");function gf(e,t={}){let n=e.length;if(n===0)return{estimate:0,lower:0,upper:0,iterations:0};let r=t.iterations??1e4,o=t.ciLevel??.95,s=li(t.seed??1),i=e.reduce((l,p)=>l+p,0)/n,a=new Array(r);for(let l=0;l<r;l++){let p=0;for(let m=0;m<n;m++)p+=e[s()*n|0];a[l]=p/n}a.sort((l,p)=>l-p);let c=(1-o)/2;return{estimate:i,lower:ui(a,c),upper:ui(a,1-c),iterations:r}}d(gf,"pairedBootstrapCI");function hf(e,t,n={}){if(e.length===0||t.length===0)return{estimate:0,lower:0,upper:0,pValue:1,iterations:0};let r=n.iterations??1e4,o=n.ciLevel??.95,s=li(n.seed??1),i=d(v=>v.reduce((h,f)=>h+f,0)/v.length,"mean"),a=i(e)-i(t),c=new Array(r),l=0,p=0;for(let v=0;v<r;v++){let h=0;for(let b=0;b<e.length;b++)h+=e[s()*e.length|0];let f=0;for(let b=0;b<t.length;b++)f+=t[s()*t.length|0];let w=h/e.length-f/t.length;c[v]=w,w<=0&&l++,w>=0&&p++}c.sort((v,h)=>v-h);let m=(1-o)/2,y=Math.min(1,2*Math.min(l,p)/r);return{estimate:a,lower:ui(c,m),upper:ui(c,1-m),pValue:y,iterations:r}}d(hf,"twoSampleBootstrapCI");function _f(e,t={}){let n=e.filter(f=>f.withScores.length>0&&f.withoutScores.length>0);if(n.length===0)return{estimate:0,lower:0,upper:0,pValue:1,iterations:0};let r=d(f=>f.reduce((w,b)=>w+b,0)/f.length,"mean"),o=n.map(f=>f.withScores.length*f.withoutScores.length/(f.withScores.length+f.withoutScores.length)),s=o.reduce((f,w)=>f+w,0),i=d(f=>f.reduce((w,b,I)=>w+o[I]*b,0)/s,"combine"),a=i(n.map(f=>r(f.withScores)-r(f.withoutScores))),c=t.iterations??1e4,l=t.ciLevel??.95,p=li(t.seed??1),m=new Array(c),y=0,v=0;for(let f=0;f<c;f++){let w=n.map(I=>{let S=0;for(let E=0;E<I.withScores.length;E++)S+=I.withScores[p()*I.withScores.length|0];let A=0;for(let E=0;E<I.withoutScores.length;E++)A+=I.withoutScores[p()*I.withoutScores.length|0];return S/I.withScores.length-A/I.withoutScores.length}),b=i(w);m[f]=b,b<=0&&y++,b>=0&&v++}m.sort((f,w)=>f-w);let h=(1-l)/2;return{estimate:a,lower:ui(m,h),upper:ui(m,1-h),pValue:Math.min(1,2*Math.min(y,v)/c),iterations:c}}d(_f,"stratifiedBootstrapCI");function yf(e,t){if(e.length!==t.length)throw new Error(`cupedAdjust: outcomes (${e.length}) and covariates (${t.length}) must be the same length`);let n=e.length;if(n===0)return{adjusted:[],theta:0,varianceReduction:0};let r=t.reduce((v,h)=>v+h,0)/n,o=e.reduce((v,h)=>v+h,0)/n,s=0,i=0,a=0;for(let v=0;v<n;v++){let h=t[v]-r,f=e[v]-o;s+=h*f,i+=h*h,a+=f*f}if(i===0)return{adjusted:[...e],theta:0,varianceReduction:0};let c=s/i,l=e.map((v,h)=>v-c*(t[h]-r)),p=0,m=l.reduce((v,h)=>v+h,0)/n;for(let v of l)p+=(v-m)*(v-m);let y=a===0?0:1-p/a;return{adjusted:l,theta:c,varianceReduction:y}}d(yf,"cupedAdjust");function wf(e,t=.05){return e.map(n=>{let r=Math.abs(n.withPassRate-n.withoutPassRate),o=r>t,s;return o?s=`discriminates: ${(n.withPassRate*100).toFixed(0)}% with vs ${(n.withoutPassRate*100).toFixed(0)}% without`:n.withPassRate>=1-t&&n.withoutPassRate>=1-t?s="always passes in both cohorts \u2014 measures nothing about the treatment":n.withPassRate<=t&&n.withoutPassRate<=t?s="always fails in both cohorts \u2014 measures nothing about the treatment":s="similar pass rate in both cohorts \u2014 non-discriminating",{...n,discriminating:o,separation:r,note:s}})}d(wf,"diagnoseAssertions");function vf(e,t={}){let n=t.unpaired??0,r=t.materialFraction??.5,o=e.filter(l=>l.discriminating).length,s=e.length-o,i=e.length+n,a=s+n,c=null;if(i>0&&a>0&&a/i>=r){let l=n>0?` (${n} with no baseline cohort)`:"";c=`${a}/${i} cases do not discriminate with vs without${l} \u2014 cull or replace them before adding runs; more runs of a non-discriminating case cannot lower the MDE`}return{total:i,discriminating:o,nonDiscriminating:s,unpaired:n,diagnoses:e,gateReason:c}}d(vf,"summarizeDiscrimination");function Ou(e,t){let n=e.length,r=t.length;if(n===0||r===0)return 0;let o=[...e.map(l=>({t:l,exposed:!0})),...t.map(l=>({t:l,exposed:!1}))].sort((l,p)=>l.t-p.t),s=0,i=0;for(;i<o.length;){let l=i;for(;l+1<o.length&&o[l+1].t===o[i].t;)l++;let p=(i+1+l+1)/2;for(let m=i;m<=l;m++)o[m].exposed&&(s+=p);i=l+1}let c=(s-n*(n+1)/2)/(n*r);return Math.abs(c-.5)}d(Ou,"cohortTimeSeparation");var cs=.35,Du=900*1e3;function If(e,t,n=cs,r=Du){if(e.length===0||t.length===0)return!1;let o=[...e,...t];return Math.max(...o)-Math.min(...o)<r?!1:Ou(e,t)>n}d(If,"isTimeSeparated");var eI=d(e=>e===0||e===1,"isBinary");function tI(e,t,n){return e.every(o=>o[t]!=null&&o[n]!=null)?e.reduce((o,s)=>o+(s[t]-s[n]),0)/e.length:null}d(tI,"meanPairDelta");function Mu(e,t={}){let n=t.baseline??"no-rule",r=t.minN??10,o=e.length,s=e.map(f=>f.withScore-f.withoutScore),i=o===0?0:s.reduce((f,w)=>f+w,0)/o,a=gf(s,{seed:t.seed,iterations:t.iterations}),c={lower:a.lower,upper:a.upper},l=e.every(f=>eI(f.withScore)&&eI(f.withoutScore)),p=null;if(l&&o>0){let f=0,w=0;for(let b of e)b.withScore===1&&b.withoutScore===0?f++:b.withScore===0&&b.withoutScore===1&&w++;p=ff(f,w).pValue}let{sufficient:m}=Pu(o,o,r),y=c.lower>0||c.upper<0,h={mode:"controlled",baseline:n,delta:i,ci:c,pValue:p,significant:m&&y,sufficient:m,nWith:o,nWithout:o,costDelta:tI(e,"withCost","withoutCost"),latencyDelta:tI(e,"withLatency","withoutLatency"),confounded:!1};return m||(h.insufficientReason=`insufficient data: need >= ${r} paired tasks per cohort, have ${o}`),h}d(Mu,"buildControlledVerdict");var Zj=2;function Lu(e,t,n={}){let r=n.minN??10,o=e.length,s=t.length,i=e.map(I=>I.score),a=t.map(I=>I.score),c=[...e,...t],l=c.length>0&&c.every(I=>typeof I.covariate=="number");if(l){let{adjusted:I}=yf(c.map(S=>S.score),c.map(S=>S.covariate));i=I.slice(0,o),a=I.slice(o)}let p=hf(i,a,{seed:n.seed,iterations:n.iterations}),m={lower:p.lower,upper:p.upper},y=p.estimate,v=o>0&&s>0?p.pValue:null,{sufficient:h}=Pu(o,s,r),f=h&&(m.lower>0||m.upper<0),w=d(I=>{if(o===0||s===0||!e.every(E=>I(E)!=null)||!t.every(E=>I(E)!=null))return null;let S=e.reduce((E,R)=>E+I(R),0)/o,A=t.reduce((E,R)=>E+I(R),0)/s;return S-A},"meanDiff"),b={mode:"observational",baseline:n.baseline??"no-rule",delta:y,ci:m,pValue:v,significant:f,sufficient:h,nWith:o,nWithout:s,costDelta:w(I=>I.cost),latencyDelta:w(I=>I.latency),confounded:!0,cupedApplied:l};return h||(b.insufficientReason=`insufficient data: need >= ${r} sessions per cohort, have ${o} exposed / ${s} unexposed`),b}d(Lu,"buildObservationalVerdict");function In(e,t={}){let n=t.minN??10,r=t.minPerStratum??Zj,o=t.maxTimeSeparation??cs,s=t.minStratumSpanMs??Du,i=e.filter(R=>R.withScores.length>=r&&R.withoutScores.length>=r),a=i.filter(R=>R.withTimes!=null&&R.withoutTimes!=null&&If(R.withTimes,R.withoutTimes,o,s)),c=new Set(a.map(R=>R.key)),l=i.filter(R=>!c.has(R.key)),p=e.filter(R=>R.withScores.length>0&&R.withoutScores.length>0&&(R.withScores.length<r||R.withoutScores.length<r)).length,m=l.reduce((R,D)=>R+D.withScores.length,0),y=l.reduce((R,D)=>R+D.withoutScores.length,0),v=_f(l,{seed:t.seed,iterations:t.iterations}),h={lower:v.lower,upper:v.upper},f=v.estimate,w=l.length>0&&m>=n&&y>=n,b=l.length>0?v.pValue:null,I=w&&(h.lower>0||h.upper<0),S=e.reduce((R,D)=>R+D.withScores.length+D.withoutScores.length,0),A=S>0?(m+y)/S:0,E={mode:"observational",baseline:t.baseline??"no-rule",delta:f,ci:h,pValue:b,significant:I,sufficient:w,nWith:m,nWithout:y,costDelta:null,latencyDelta:null,confounded:!0,strata:l.length,strataDroppedForTimeSeparation:a.length,coverage:A};if(!w){let R=p>0?` (${p} project(s) had both cohorts but fewer than ${r} sessions in one of them)`:"",D=a.length>0?` ${a.length} project-month(s) held both cohorts but their sessions are separated in time (exposure predicts when a session ran), so the difference within them is a calendar difference, not a treatment effect`:"";E.insufficientReason=l.length===0?a.length>0?`insufficient data: no comparable cohort.${D}${R}`:`insufficient data: no project has >= ${r} exposed AND >= ${r} unexposed sessions to compare within${R}`:`insufficient data: need >= ${n} sessions per cohort across comparable projects, have ${m} exposed / ${y} unexposed${R}${D?`.${D}`:""}`}return E}d(In,"buildStratifiedVerdict");function bf(e,t,n={}){return{overall:In(e,n),segments:$u(t,n)}}d(bf,"buildSegmentedVerdict");function $u(e,t={}){return e.map(n=>({segment:n.segment,verdict:In(n.strata,t)}))}d($u,"buildSegmentVerdicts");function ds(e){return e.sufficient?e.significant?e.delta<0?"harmful":"helpful":"neutral":"insufficient"}d(ds,"classifyEffect");var pi={achieved:1,fully_achieved:1,mostly_achieved:.75,partially_achieved:.5,unclear_from_transcript:.25,not_achieved:0,abandoned:0},us=d(e=>{let t=e?pi[e]:void 0;return t===void 0?null:t},"scoreOutcome");var mi=10,qu=d(e=>e.length===0?0:e.reduce((t,n)=>t+n,0)/e.length,"mean"),Sf=d(e=>{if(e.length<2)return 0;let t=qu(e);return e.reduce((n,r)=>n+(r-t)**2,0)/(e.length-1)},"sampleVar"),nI=d((e,t)=>{let n=t.reduce((l,p)=>l+p,0);if(n<=0||e.length===0)return{mean:0,varOfMean:0,nEff:0};let r=t.reduce((l,p)=>l+p*p,0),o=n*n/r,s=e.reduce((l,p,m)=>l+t[m]*p,0)/n,i=n-r/n,c=(i>0?e.reduce((l,p,m)=>l+t[m]*(p-s)**2,0)/i:0)*r/(n*n);return{mean:s,varOfMean:c,nEff:o}},"weightedStats");function Af(e,t,n={}){let r=n.minAnchors??mi,o=n.z??go,s=e.length,i=t.length,a=[...e,...t.map(A=>A.judge)],c=qu(a),l=t.map(A=>A.weight??1),p=t.map(A=>A.human-A.judge),m=nI(p,l),y=m.mean,v=i>0?m.nEff:0,h=t.filter(A=>A.validated!==!1).length;if(n.pooledRectifier){let A=n.pooledRectifier,E=s>0?e:t.map($=>$.judge);if(E.length===0)return{estimate:NaN,ci:{lower:NaN,upper:NaN},se:1/0,naive:c,rectifier:A.rectifier,nLabeled:i,nUnlabeled:s,nEffective:v,nValidated:h,sufficient:!1,insufficientReason:"no judge scores to correct with the pooled rectifier"};let R=qu(E)+A.rectifier,D=Sf(E)/E.length+A.variance,j=Math.sqrt(D),P={estimate:R,ci:{lower:R-o*j,upper:R+o*j},se:j,naive:c,rectifier:A.rectifier,nLabeled:i,nUnlabeled:s,nEffective:v,nValidated:h,sufficient:A.sufficient};return A.sufficient||(P.insufficientReason="pooled rectifier not yet adequate"),P}let f,w;if(i===0)f=c,w=a.length>0?Sf(a)/a.length:0;else if(s===0){let A=nI(t.map(E=>E.human),l);f=A.mean,w=A.varOfMean}else f=qu(e)+y,w=Sf(e)/s+m.varOfMean;let b=Math.sqrt(w),I=h>=r,S={estimate:f,ci:{lower:f-o*b,upper:f+o*b},se:b,naive:c,rectifier:y,nLabeled:i,nUnlabeled:s,nEffective:v,nValidated:h,sufficient:I};if(!I){let A=i-h;S.insufficientReason=`insufficient anchors: need >= ${r} VALIDATED human-labeled items, have ${h}${A>0?` (+${A} passive, which don't count toward the floor)`:""}`}return S}d(Af,"ppiMeanEstimate");function _c(e,t,n={}){let r=Af(e.unlabeledJudge,e.labeled,{...n,pooledRectifier:n.withPooledRectifier}),o=Af(t.unlabeledJudge,t.labeled,{...n,pooledRectifier:n.withoutPooledRectifier}),s=n.z??go,i=r.estimate-o.estimate,a=Math.sqrt(r.se**2+o.se**2),c={lower:i-s*a,upper:i+s*a},l=r.sufficient&&o.sufficient,p=l&&(c.lower>0||c.upper<0),m={delta:i,ci:c,se:a,with:r,without:o,sufficient:l,significant:p};return l||(m.insufficientReason=r.insufficientReason??o.insufficientReason),m}d(_c,"ppiDifference");var Uu=50,sI=.2,iI=.8416212335729143,eN=d(e=>e.length===0?0:e.reduce((t,n)=>t+n,0)/e.length,"mean"),yc=d(e=>{if(e.length<2)return 0;let t=eN(e);return e.reduce((n,r)=>n+(r-t)**2,0)/(e.length-1)},"sampleVar");function rI(e,t){let n=e.labeled.length,r=e.unlabeledJudge.length;return n>0&&r>0?{fixed:yc(e.unlabeledJudge)/r,scaling:yc(e.labeled.map(o=>o.human-o.judge)),n}:n>0?{fixed:0,scaling:yc(e.labeled.map(o=>o.human)),n}:{fixed:r>0?yc(e.unlabeledJudge)/r:0,scaling:t.labeled.length>0?yc(t.labeled.map(o=>o.human-o.judge)):null,n:0}}d(rI,"varianceComponents");var oI=1e6;function tN(e,t){if(e.some(s=>s.scaling===null))return null;let n=d(s=>e.reduce((i,a)=>i+a.fixed+(a.scaling===0?0:a.scaling/(a.n+s)),0),"se2");if(n(oI)>t)return null;let r=0,o=oI;for(;r<o;){let s=Math.floor((r+o)/2);n(s)<=t?o=s:r=s+1}return r}d(tN,"solvePerCohortIncrement");function Ef(e,t,n={}){let r=n.pilotTarget??Uu,o=n.targetEffect??sI,s=n.minAnchors??mi,i=n.z??go,a=n.zPower??iI,c=i+a,l=d(j=>(j*100).toFixed(0),"pp"),p=e.labeled.length,m=t.labeled.length,y=n.humanLabeledRuns??p+m,v=e.unlabeledJudge.length+p+t.unlabeledJudge.length+m,h={nAnchors:y,nAnchorsWith:p,nAnchorsWithout:m,pilotTarget:r,pilotMet:y>=r,targetEffect:o};if(v===0)return{...h,seDelta:null,mde:null,powered:!1,adequate:!1,reasons:["no graded runs to calibrate against"],additionalAnchorsNeeded:r};let f=_c(e,t,{minAnchors:s,z:i,withPooledRectifier:n.pool?.withPooledRectifier,withoutPooledRectifier:n.pool?.withoutPooledRectifier}).se,w=c*f,b=w<=o;if(n.pool){let{totalAnchors:j,targets:P}=n.pool,$=j>=r,H=P>=3,B=$&&H&&b,te=[];return H||te.push(`pool spans ${P}/3 same-judge targets \u2014 between-target variance is assumed, not measured`),$||te.push(`pool floor not met: ${j}/${r} human-labeled runs across the same-judge pool`),b||te.push(`MDE \xB1${l(w)}pp exceeds the \xB1${l(o)}pp target effect \u2014 pooling lowers the label cost, not this; more graded runs are needed (\xA76d(f))`),{...h,seDelta:f,mde:w,powered:b,adequate:B,reasons:te,additionalAnchorsNeeded:$?null:r-j,pooled:!0,poolAnchors:j,poolTargets:P}}let I=p>=s,S=m>=s,A=h.pilotMet&&I&&S&&b,E,R=0;if(!b){let j=(o/c)**2,P=tN([rI(e,t),rI(t,e)],j);R=P===null?null:2*P}if(!h.pilotMet)E=r-y;else if(R===null)E=null;else{let j=Math.max(0,s-p)+Math.max(0,s-m);E=Math.max(j,R)}let D=[];if(h.pilotMet||D.push(`pilot target not met: ${y}/${r} human-labeled runs`),I||D.push(`with-target cohort has ${p}/${s} labeled runs (minimum for a corrected estimate)`),S||D.push(`without-target cohort has ${m}/${s} labeled runs (minimum for a corrected estimate)`),!b){let j=R===null?" \u2014 anchors alone cannot reach it; more graded runs are needed":h.pilotMet&&R>0?` \u2014 ~${R} more labeled runs projected to reach it`:"";D.push(`MDE \xB1${l(w)}pp exceeds the \xB1${l(o)}pp target effect${j}`)}return{...h,seDelta:f,mde:w,powered:b,adequate:A,reasons:D,additionalAnchorsNeeded:E}}d(Ef,"anchorPowerCheck");function xf(e,t){return{rectifierUsed:e.rectifier,variance:e.variance,lambda:0,pooled:e.rectifier,pooledVariance:e.variance,tau2:0,i2:0,k:1,pooledApplied:!1,assumedExchangeability:!1,...t}}d(xf,"localOnly");function Hu(e,t,n={}){let r=n.maxI2??.6,o=[e,...t].filter(B=>B.n>=1&&Number.isFinite(B.variance)&&B.variance>=0),s=o.length;if(s<2)return e.n<1||!Number.isFinite(e.variance)?xf(e,{rectifierUsed:NaN,variance:1/0,reason:"no anchors on this target and none to pool from"}):xf(e,{reason:"only one target with anchors \u2014 nothing to pool"});let i=o.map(B=>B.variance).filter(B=>B>0),a=i.length?i.reduce((B,te)=>B+te,0)/i.length:0,c=Math.max(a*.001,1e-12),l=d(B=>Math.max(B,c),"flooredVar"),p=o.map(B=>1/l(B.variance)),m=p.reduce((B,te)=>B+te,0),y=p.reduce((B,te)=>B+te*te,0),v=o.reduce((B,te,_e)=>B+p[_e]*te.rectifier,0)/m,h=o.reduce((B,te,_e)=>B+p[_e]*(te.rectifier-v)**2,0),f=s-1,w=m-y/m,b=w>0?Math.max(0,(h-f)/w):0,I=h>0?Math.max(0,(h-f)/h):0,S=o.map(B=>1/(l(B.variance)+b)),A=S.reduce((B,te)=>B+te,0),E=o.reduce((B,te,_e)=>B+S[_e]*te.rectifier,0)/A,R=1/A,D=s<3;if(I>r)return e.n>=1&&Number.isFinite(e.variance)?xf(e,{pooled:E,pooledVariance:R,tau2:b,i2:I,k:s,assumedExchangeability:D,reason:`heterogeneity too high (I\xB2=${(I*100).toFixed(0)}%) \u2014 targets disagree; not pooling`}):{rectifierUsed:E,variance:R,lambda:1,pooled:E,pooledVariance:R,tau2:b,i2:I,k:s,pooledApplied:!1,assumedExchangeability:D,reason:`no anchors on this target; pooled estimate is high-heterogeneity (I\xB2=${(I*100).toFixed(0)}%) \u2014 treat as unknown`};let j=e.n<1||!Number.isFinite(e.variance),P=j?1:l(e.variance)/(l(e.variance)+b),$=j?E:P*E+(1-P)*e.rectifier,H=j?R+b:(1-P)*e.variance+P*P*R;return{rectifierUsed:$,variance:H,lambda:P,pooled:E,pooledVariance:R,tau2:b,i2:I,k:s,pooledApplied:!0,assumedExchangeability:D}}d(Hu,"shrinkRectifier");var fi=3,vc=7,Tf="(preamble)",iN=/^\s*(`{3,}|~{3,})/,aN=/^(#{1,6})\s+(.*)$/;function wc(e){let t=e.split(`
|
|
242
|
-
`),n=[],r=[],o={heading:"",level:0,path:[
|
|
243
|
-
`).trim()})},"flush");for(let a of t){let c=
|
|
240
|
+
Preview: ${e.contentPreview}`.length+2}d(Tj,"renderedSize");async function lf(e,t,n){if(t.length===0)return{recommendations:[],error:null};let r;try{r=uc(n.llmProvider,n.llmApiKey)}catch(a){return{recommendations:[],error:a instanceof Error?a.message:String(a)}}let o=uf(t,{charBudget:n.charBudget}),s=[],i=[];for(let a of o)try{let c=await r.complete(lc(e,a));s.push(...df(c.text))}catch(c){i.push(c instanceof Error?c.message:String(c))}return{recommendations:s,error:i.length>0?i.join("; "):null}}d(lf,"scoreInstructions");var Rj=new Set(["127.0.0.1","localhost","::1","[::1]","0.0.0.0"]);function kj(e){if(!e)return null;try{return new URL(e).hostname}catch{return null}}d(kj,"databaseUrlHost");function pf(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=kj(e.DATABASE_URL);return n&&Rj.has(n)?{mode:"local",source:"inferred"}:{mode:"cloud",source:"default"}}d(pf,"resolveDeployment");function Tu(e){if(!e||typeof e!="object")return null;let t=e.source;return t==="insights"||t==="evolution"?t:null}d(Tu,"readStampedSource");function Ru(e,t){let n=e.source==="insights"||e.source==="evolution"?e.source:Tu(e.frontmatter);return n||(e.createdBy&&e.createdBy===t?"user":"catalog")}d(Ru,"classifyProvenance");var pc=new Set(["process_eval","process_insights","process_conversation","process_session_goal","distill_memories","memory_ab","cron_suggest_instructions","cron_refresh_pricing","cron_eval_autorun","cron_instruction_evolution","process_judge_review"]);function ku(e){return pc.has(e)}d(ku,"needsLlmEngine");D();function Tt(e){if(!Us())return;let t=Lp();u.insert(so).values({instructionId:e.instructionId??null,userId:e.userId,surface:e.surface,action:e.action,metadata:e.metadata??null,traceId:t??null}).then(()=>{}).catch(n=>{console.error("Usage tracking error:",n)})}d(Tt,"trackUsage");var Nj={critical:25,high:15,medium:8,low:3},Pj=[{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 mf(e,t,n){let r=[],o=[e,t??"",n??""].join(`
|
|
241
|
+
`);for(let i of Pj){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-=Nj[i.severity]??5;return{score:Math.max(0,Math.min(100,s)),findings:r}}d(mf,"scanContent");var wn=new Cj,Oj=ct.object({name:ct.string().min(1).max(255),description:ct.string().min(1),scope:ct.enum(["org","team","project","personal"]),scopeRef:ct.string().uuid().optional(),version:ct.string().default("1.0.0"),content:ct.string().min(1),tags:ct.array(ct.string()).optional(),compatibility:ct.array(ct.string()).optional()}),Mj=ct.object({name:ct.string().min(1).max(255).optional(),description:ct.string().min(1).optional(),version:ct.string().optional(),content:ct.string().min(1).optional(),tags:ct.array(ct.string()).optional(),compatibility:ct.array(ct.string()).optional(),changeSummary:ct.string().optional()});wn.get("/instructions",async e=>{let t=e.get("userId"),n=e.req.query("search"),r=e.req.query("scope"),o=e.req.query("tags"),s=e.req.query("type"),i=parseInt(e.req.query("limit")??"100",10),a=parseInt(e.req.query("offset")??"0",10),c=[Me(g.archived,!1),Me(g.createdBy,t)];if(r&&c.push(Me(g.scope,r)),s&&c.push(Me(g.type,s)),n){let h=ot(n);c.push(gf(ff(g.name,`%${h}%`),ff(g.description,`%${h}%`),ff(g.content,`%${h}%`)))}let l=await u.select().from(g).where(dr(...c)).orderBy(Yv(g.updatedAt)).limit(i).offset(a);if(o){let h=o.split(",").map(f=>f.trim().toLowerCase());l=l.filter(f=>h.some(w=>f.tags?.some(b=>b.toLowerCase().includes(w))))}let p=l.map(h=>h.id),m=p.length>0?await u.select({instructionId:at.instructionId,projectName:U.name,projectId:U.id}).from(at).innerJoin(U,Me(U.id,at.projectId)).where(di`${at.instructionId} IN (${di.join(p.map(h=>di`${h}`),di`, `)})`):[],y=new Map;for(let h of m){let f=y.get(h.instructionId)??[];f.push({projectId:h.projectId,projectName:h.projectName}),y.set(h.instructionId,f)}let v=l.map(h=>({...h,projects:y.get(h.id)??[]}));return Tt({userId:t,surface:"api",action:"list"}),e.json(v)});wn.get("/instructions/by-hash/:hash",async e=>{let t=e.get("userId"),n=e.req.param("hash"),[r]=await u.select({id:g.id,name:g.name,contextIdentity:g.contextIdentity,version:g.version,type:g.type}).from(g).where(dr(Me(g.contentHash,n),Me(g.createdBy,t),Me(g.archived,!1))).limit(1);return r?e.json({instruction:r}):e.json({instruction:null})});wn.post("/instructions/by-hashes",async e=>{let t=e.get("userId"),n=await e.req.json(),r=ct.array(ct.string()).max(200).parse(n.hashes??[]),o=ct.array(ct.string()).max(200).parse(n.identities??[]);if(r.length===0&&o.length===0)return e.json({instructions:{}});let s=[Me(g.createdBy,t),Me(g.archived,!1)],i=[];r.length>0&&i.push(Kv(g.contentHash,r)),o.length>0&&i.push(Kv(g.contextIdentity,o));let a=await u.select({id:g.id,name:g.name,contextIdentity:g.contextIdentity,version:g.version,type:g.type,contentHash:g.contentHash,source:di`${g.frontmatter}->>'source'`}).from(g).where(dr(...s,i.length===1?i[0]:gf(...i))),c={};for(let l of a)l.contentHash&&(c[l.contentHash]=l),l.contextIdentity&&(c[l.contextIdentity]=l);return e.json({instructions:c})});wn.get("/instructions/:id/sessions",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await u.select({sessionId:se.sessionId,linkMethod:se.linkMethod,tool:_.tool,projectPath:_.projectPath,startedAt:_.startedAt,endedAt:_.endedAt,analysis:_.analysis}).from(se).innerJoin(_,Me(_.id,se.sessionId)).where(dr(Me(se.instructionId,n),Me(_.userId,t))).orderBy(Yv(_.startedAt)).limit(50);return e.json({sessions:r})});wn.get("/instructions/:id",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await u.select().from(g).where(dr(Me(g.id,t),Me(g.archived,!1),gf(Me(g.createdBy,n),Me(g.scope,"public"))));return r?(Tt({instructionId:t,userId:n,surface:"api",action:"view"}),e.json(r)):e.json({error:"Instruction not found"},404)});var Lj=/<\/?(?:system-reminder|system|available-deferred-tools|tool-result)>/i;function Xv(e){return Lj.test(e)?"Content contains forbidden system tags":null}d(Xv,"validateNoForbiddenTags");wn.post("/instructions",async e=>{let t=e.get("userId"),n=await e.req.json(),r=Oj.parse(n),o=Xv(r.content);if(o)return e.json({error:o},422);r.name=cr(r.name),r.description=cr(r.description);let s={},i=null;try{let p=ai(r.content);s=p.frontmatter,i=p.slots}catch{s={name:r.name,description:r.description,type:"instruction",scope:r.scope,version:r.version}}let a=r.scope==="personal"?t:r.scopeRef??null,c=mf(r.content,r.name,r.description),[l]=await u.insert(g).values({name:r.name,description:r.description,type:"instruction",scope:r.scope,scopeRef:a,version:r.version,content:r.content,frontmatter:s,slots:i,tags:r.tags??[],compatibility:r.compatibility??[],createdBy:t,scanScore:c.score,scanFindings:c.findings.length>0?c.findings:null}).returning();return await u.insert(Ie).values({instructionId:l.id,versionNumber:1,content:r.content,frontmatter:s,changeSummary:"Initial version",createdBy:t}),Tt({instructionId:l.id,userId:t,surface:"api",action:"create"}),e.json(l,201)});wn.put("/instructions/:id",async e=>{let t=e.req.param("id"),n=e.get("userId"),r=await e.req.json(),o=Mj.parse(r);if(o.content){let m=Xv(o.content);if(m)return e.json({error:m},422)}o.name&&(o.name=cr(o.name)),o.description&&(o.description=cr(o.description));let[s]=await u.select().from(g).where(dr(Me(g.id,t),Me(g.createdBy,n),Me(g.archived,!1)));if(!s)return e.json({error:"Instruction not found"},404);let i=s.frontmatter,a=s.slots;if(o.content)try{let m=ai(o.content);i=m.frontmatter,a=m.slots}catch{}let c={};if(o.content||o.name||o.description){let m=mf(o.content??s.content,o.name??s.name,o.description??s.description);c.scanScore=m.score,c.scanFindings=m.findings.length>0?m.findings:null}let l,p=4;for(let m=0;m<=p;m++)try{l=await u.transaction(async y=>{await y.select({id:g.id}).from(g).where(Me(g.id,t)).for("update");let[{maxVersion:v}]=await y.select({maxVersion:di`COALESCE(MAX(${Ie.versionNumber}), 0)`}).from(Ie).where(Me(Ie.instructionId,t)),h=v+1,[f]=await y.update(g).set({...o.name&&{name:o.name},...o.description&&{description:o.description},...o.version&&{version:o.version},...o.content&&{content:o.content},...o.tags&&{tags:o.tags},...o.compatibility&&{compatibility:o.compatibility},frontmatter:i,slots:a,...c,updatedAt:new Date}).where(Me(g.id,t)).returning();return await y.insert(Ie).values({instructionId:t,versionNumber:h,content:o.content??s.content,frontmatter:i,changeSummary:o.changeSummary??null,createdBy:n}),f});break}catch(y){if(y.cause?.code==="23505"&&m<p)continue;throw y}return l?(Tt({instructionId:t,userId:n,surface:"api",action:"update"}),e.json(l)):e.json({error:"Instruction update failed"},500)});wn.delete("/instructions/:id",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await u.select().from(g).where(dr(Me(g.id,t),Me(g.createdBy,n),Me(g.archived,!1)));if(!r)return e.json({error:"Instruction not found"},404);let[o]=await u.update(g).set({archived:!0,archivedAt:new Date,archivedBy:n}).where(Me(g.id,t)).returning(),s=await u.update(x).set({dismissedAt:new Date,isStale:!0}).where(dr(Me(x.userId,n),Me(x.instructionId,t),Dj(x.dismissedAt))).returning({id:x.id});return Tt({instructionId:t,userId:n,surface:"api",action:"delete"}),e.json({...o,dismissedSuggestions:s.length})});wn.post("/instructions/:id/restore",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await u.select().from(g).where(dr(Me(g.id,t),Me(g.createdBy,n),Me(g.archived,!0)));if(!r)return e.json({error:"Archived instruction not found"},404);let[o]=await u.update(g).set({archived:!1,archivedAt:null,archivedBy:null}).where(Me(g.id,t)).returning();return Tt({instructionId:t,userId:n,surface:"api",action:"update"}),e.json(o)});wn.get("/instructions/:id/versions",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await u.select({id:g.id}).from(g).where(dr(Me(g.id,t),Me(g.createdBy,n)));if(!r)return e.json({error:"Instruction not found"},404);let o=await u.select().from(Ie).where(Me(Ie.instructionId,t)).orderBy(Ie.versionNumber);return e.json(o)});D();import{Hono as $j}from"hono";import{z as hf}from"zod";import{eq as Qv,and as qj}from"drizzle-orm";var ju=new $j,Uj=hf.object({format:hf.enum(Au),score:hf.enum(["true","false"]).optional().default("false")});ju.post("/instructions/:id/convert",async e=>{let t=e.req.param("id"),n=Uj.parse(e.req.query()),r=n.format,o=n.score==="true",[s]=await u.select().from(g).where(qj(Qv(g.id,t),Qv(g.archived,!1)));if(!s)return e.json({error:"Instruction not found"},404);let i;try{i=ai(s.content)}catch{i={frontmatter:{name:s.name,description:s.description??"",type:"instruction",scope:s.scope,version:s.version??"1.0.0",tags:s.tags??[],compatibility:s.compatibility??[]},content:s.content,slots:s.slots}}let a=ci(),c=a.get(r);if(!c)return e.json({error:`Unsupported format: ${r}`},400);let l=c.convert(i),p=e.get("userId");if(Tt({instructionId:t,userId:p,surface:"api",action:"convert",metadata:{format:r}}),o){let m=a.getMetadata(r);if(m){let y=af(l.output,m.scoringMetadata);return e.json({...l,score:y})}}return e.json(l)});import{Hono as Hj}from"hono";var Nu=new Hj;Nu.get("/converters",async e=>{let n=ci().listAll().map(r=>({id:r.metadata.id,name:r.metadata.name,description:r.metadata.description,tier:r.metadata.tier,outputPath:r.metadata.outputPath,toolUrl:r.metadata.toolUrl}));return e.json(n)});D();import{Hono as Bj}from"hono";import{z as qr}from"zod";var Pu=new Bj,Fj=qr.object({content:qr.string().min(1),sourceFormat:qr.enum(Au).optional(),filename:qr.string().optional(),name:qr.string().optional(),scope:qr.enum(["org","team","project","personal"]).default("personal"),scopeRef:qr.string().uuid().optional(),tags:qr.array(qr.string()).optional()});Pu.post("/instructions/import",async e=>{let t=e.get("userId"),n=await e.req.json(),r=Fj.parse(n),o=r.sourceFormat??null;if(!o){let m=of({filename:r.filename,content:r.content});m&&(o=m.format)}if(!o)return e.json({error:"Could not detect format. Provide sourceFormat explicitly."},400);let s=ci(),i=s.getReverse(o);if(!i)return e.json({error:`No import parser for format: ${o}`,supportedFormats:s.listReverseFormats()},400);let a=i.parse(r.content,r.filename),c=r.name??a.frontmatter.name,l=r.scope==="personal"?t:r.scopeRef??null,[p]=await u.insert(g).values({name:c,description:a.frontmatter.description,type:"instruction",scope:r.scope,scopeRef:l,version:"1.0.0",content:a.content,frontmatter:a.frontmatter,slots:a.slots,tags:r.tags??a.frontmatter.tags??[],compatibility:a.frontmatter.compatibility??[],createdBy:t}).returning();return await u.insert(Ie).values({instructionId:p.id,versionNumber:1,content:a.content,frontmatter:a.frontmatter,changeSummary:`Imported from ${o}`,createdBy:t}),Tt({instructionId:p.id,userId:t,surface:"api",action:"import",metadata:{sourceFormat:o}}),e.json({instruction:p,sourceFormat:o,parseWarnings:[]},201)});D();import{Hono as Wj}from"hono";import{eq as po,and as _f}from"drizzle-orm";var mc=new Wj;mc.post("/instructions/:id/fork",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(g).where(_f(po(g.id,n),po(g.archived,!1)));if(!r)return e.json({error:"Instruction not found"},404);if(r.createdBy===t)return e.json({error:"Cannot fork your own instruction"},400);if(r.scope==="org"&&r.scopeRef){let[s]=await u.select({id:g.id}).from(g).where(_f(po(g.createdBy,t),po(g.scope,"org"),po(g.scopeRef,r.scopeRef))).limit(1);if(!s)return e.json({error:"Instruction not found"},404)}else if(r.scope!=="org")return e.json({error:"Instruction not found"},404);let[o]=await u.insert(g).values({name:`${r.name} (fork)`,description:r.description,type:r.type,scope:"personal",scopeRef:t,version:"1.0.0",content:r.content,frontmatter:r.frontmatter,slots:r.slots,tags:r.tags,compatibility:r.compatibility,createdBy:t,forkedFromId:r.id,upstreamVersion:r.version}).returning();return await u.insert(Ie).values({instructionId:o.id,versionNumber:1,content:o.content,frontmatter:o.frontmatter,changeSummary:`Forked from ${r.name}`,createdBy:t}),await u.insert(Ct).values({instructionId:o.id,eventType:"fork",actorId:t,metadata:{sourceId:r.id,sourceName:r.name,sourceVersion:r.version}}),Tt({instructionId:o.id,userId:t,surface:"api",action:"fork"}),e.json(o,201)});mc.get("/instructions/:id/events",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await u.select({id:g.id}).from(g).where(_f(po(g.id,t),po(g.createdBy,n)));if(!r)return e.json({error:"Instruction not found"},404);let o=await u.select().from(Ct).where(po(Ct.instructionId,t)).orderBy(Ct.createdAt);return e.json(o)});D();import{Hono as zj}from"hono";import{eq as Jn,and as Zv,sql as Vj}from"drizzle-orm";var fc=new zj;fc.get("/instructions/:id/upstream",async e=>{let t=e.req.param("id"),[n]=await u.select().from(g).where(Zv(Jn(g.id,t),Jn(g.archived,!1)));if(!n)return e.json({error:"Instruction not found"},404);if(!n.forkedFromId)return e.json({error:"This instruction is not a fork"},400);let[r]=await u.select().from(g).where(Jn(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})});fc.post("/instructions/:id/pull-upstream",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(g).where(Zv(Jn(g.id,n),Jn(g.createdBy,t),Jn(g.archived,!1)));if(!r)return e.json({error:"Instruction not found"},404);if(!r.forkedFromId)return e.json({error:"This instruction is not a fork"},400);let[o]=await u.select().from(g).where(Jn(g.id,r.forkedFromId));if(!o)return e.json({error:"Parent instruction no longer exists"},404);let[s]=await u.select().from(Ie).where(Jn(Ie.instructionId,o.id)).orderBy(Ie.versionNumber).limit(1),i=s?.content??o.content,a=cf(i,o.content,r.content);if(a.hasConflicts)return e.json({hasConflicts:!0,merged:a.merged,conflicts:a.conflicts});let c,l=4;for(let p=0;p<=l;p++)try{c=await u.transaction(async m=>{await m.select({id:g.id}).from(g).where(Jn(g.id,n)).for("update");let[y]=await m.select({maxVersion:Vj`COALESCE(MAX(${Ie.versionNumber}), 0)`}).from(Ie).where(Jn(Ie.instructionId,n)),v=(y?.maxVersion??0)+1,[h]=await m.update(g).set({content:a.merged,upstreamVersion:o.version,updatedAt:new Date}).where(Jn(g.id,n)).returning();return await m.insert(Ie).values({instructionId:n,versionNumber:v,content:a.merged,frontmatter:r.frontmatter,changeSummary:`Pulled upstream changes from ${o.name} (${o.version})`,createdBy:t}),await m.insert(Ct).values({instructionId:n,eventType:"pull_upstream",actorId:t,metadata:{parentId:o.id,parentVersion:o.version,previousUpstreamVersion:r.upstreamVersion}}),h});break}catch(m){if(m.cause?.code==="23505"&&p<l)continue;throw m}return c?(Tt({instructionId:n,userId:t,surface:"api",action:"pull_upstream"}),e.json({hasConflicts:!1,instruction:c})):e.json({error:"Pull-upstream failed after version conflict"},500)});D();import{Hono as Jj}from"hono";import{z as mo}from"zod";import{eq as Dt,and as as,sql as Gj}from"drizzle-orm";var Kj=mo.object({scope:mo.enum(["team","org"]),scopeRef:mo.string().uuid()}),gc=new Jj;gc.post("/instructions/:id/promote",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=Kj.parse(await e.req.json()),[o]=await u.select().from(g).where(as(Dt(g.id,n),Dt(g.createdBy,t),Dt(g.archived,!1)));if(!o)return e.json({error:"Instruction not found"},404);if(o.scope==="org")return e.json({error:"Instruction is already org-scoped"},400);if(r.scope==="team"){let[c]=await u.select().from(ye).where(as(Dt(ye.userId,t),Dt(ye.teamId,r.scopeRef)));if(!c)return e.json({error:"You are not a member of this team"},403)}else if(r.scope==="org"){let[c]=await u.select().from(Q).where(as(Dt(Q.userId,t),Dt(Q.orgId,r.scopeRef)));if(!c||c.role!=="admin"&&c.role!=="owner")return e.json({error:"You must be an org admin to promote to org scope"},403)}let s=o.scope,i=o.scopeRef,[a]=await u.update(g).set({scope:r.scope,scopeRef:r.scopeRef,updatedAt:new Date}).where(Dt(g.id,n)).returning();return await u.insert(Ct).values({instructionId:n,eventType:"promote",actorId:t,metadata:{fromScope:s,fromScopeRef:i,toScope:r.scope,toScopeRef:r.scopeRef}}),Tt({instructionId:n,userId:t,surface:"api",action:"promote"}),e.json(a)});var Yj=mo.object({targetScope:mo.enum(["personal","team","org"]),targetScopeRef:mo.string().uuid().optional(),name:mo.string().optional(),seedEvalTarget:mo.boolean().optional()});async function Xj(e){let[t]=await u.select({id:k.id}).from(k).where(Gj`${k.metadata}->>'instructionId' = ${e}`).limit(1);return t??null}d(Xj,"findExistingEvalTarget");gc.post("/instructions/:id/promote-from-public",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=Yj.parse(await e.req.json()),[o]=await u.select().from(g).where(as(Dt(g.id,n),Dt(g.scope,"public")));if(!o)return e.json({error:"Public instruction not found"},404);if(r.targetScope==="team"){if(!r.targetScopeRef)return e.json({error:"targetScopeRef is required for team scope"},400);let[m]=await u.select().from(ye).where(as(Dt(ye.userId,t),Dt(ye.teamId,r.targetScopeRef)));if(!m)return e.json({error:"You are not a member of this team"},403)}else if(r.targetScope==="org"){if(!r.targetScopeRef)return e.json({error:"targetScopeRef is required for org scope"},400);let[m]=await u.select().from(Q).where(as(Dt(Q.userId,t),Dt(Q.orgId,r.targetScopeRef)));if(!m||m.role!=="admin"&&m.role!=="owner")return e.json({error:"You must be an org admin to promote into an org"},403)}let s=r.targetScope==="personal"?t:r.targetScopeRef,i=r.name??o.name,a=r.seedEvalTarget??(r.targetScope==="org"||r.targetScope==="team"),[c]=await u.select().from(g).where(as(Dt(g.scope,r.targetScope),Dt(g.scopeRef,s),Dt(g.forkedFromId,n),Dt(g.archived,!1)));if(c){let m=null;return a&&(m=(await Xj(c.id))?.id??null),e.json({instructionId:c.id,alreadyExisted:!0,evalTargetId:m})}let[l]=await u.insert(g).values({name:i,description:o.description,type:o.type,scope:r.targetScope,scopeRef:s,version:o.version,content:o.content,frontmatter:o.frontmatter,slots:o.slots,tags:o.tags,compatibility:o.compatibility,createdBy:t,forkedFromId:o.id,upstreamVersion:o.upstreamVersion??o.version,contentHash:o.contentHash,contextIdentity:o.contextIdentity}).returning();if(!l)return e.json({error:"Failed to clone instruction"},500);await u.insert(Ie).values({instructionId:l.id,versionNumber:1,content:o.content,frontmatter:o.frontmatter,changeSummary:`Promoted from public skill ${o.name}`,createdBy:t}),await u.insert(Ct).values({instructionId:l.id,eventType:"promote_from_public",actorId:t,metadata:{sourceInstructionId:o.id,sourceName:o.name,targetScope:r.targetScope,targetScopeRef:s}}),Tt({instructionId:l.id,userId:t,surface:"api",action:"promote_from_public"});let p=null;if(a){let[m]=await u.insert(k).values({userId:t,name:`${i} \u2014 baseline eval`,type:"instruction",content:o.content,description:`Auto-seeded from public skill \`${o.name}\` on promote.`,metadata:{instructionId:l.id,publicSourceId:o.id,publicContentHash:o.contentHash??null,publicVersion:o.version??null}}).returning({id:k.id});p=m?.id??null}return e.json({instructionId:l.id,alreadyExisted:!1,evalTargetId:p})});D();import{Hono as Qj}from"hono";import{z as eI}from"zod";import{eq as vn,and as hc,or as tI,inArray as nI,sql as Cu,desc as Zj}from"drizzle-orm";var _c=new Qj,eN=eI.object({badge:eI.enum(["recommended","required"]).nullable()});_c.get("/catalog",async e=>{let t=e.get("userId"),n=e.req.query("badge"),r=e.req.query("scope"),o=e.req.query("search"),s=parseInt(e.req.query("contentPreview")??"0",10),i=Number.isFinite(s)?Math.min(Math.max(s,0),400):0,a=parseInt(e.req.query("limit")??"50",10),c=parseInt(e.req.query("offset")??"0",10),l=Math.min(Math.max(a,1),200),p=Math.max(c,0),m=await u.select({orgId:Q.orgId}).from(Q).where(vn(Q.userId,t)),y=await u.select({teamId:ye.teamId}).from(ye).where(vn(ye.userId,t)),v=m.map(E=>E.orgId).filter(E=>E!==null),h=y.map(E=>E.teamId).filter(E=>E!==null),f=[vn(g.archived,!1)],w=[vn(g.scope,"public")];if(v.length>0&&w.push(hc(vn(g.scope,"org"),nI(g.scopeRef,v))),h.length>0&&w.push(hc(vn(g.scope,"team"),nI(g.scopeRef,h))),f.push(tI(...w)),n&&f.push(vn(g.badge,n)),r&&f.push(vn(g.scope,r)),o){let E=ot(o);f.push(tI(Cu`${g.name} ILIKE ${`%${E}%`}`,Cu`${g.description} ILIKE ${`%${E}%`}`))}let b=[Zj(Cu`COALESCE(${g.sourceUpdatedAt}, ${g.updatedAt})`)],I={id:g.id,name:g.name,description:g.description,type:g.type,scope:g.scope,scopeRef:g.scopeRef,version:g.version,tags:g.tags,badge:g.badge,popularityScore:g.popularityScore,updatedAt:g.updatedAt,createdAt:g.createdAt,sourceUpdatedAt:g.sourceUpdatedAt},A=await(i>0?nt:u).select(i>0?{...I,contentPreview:Cu`left(${g.content}, ${i})`}:I).from(g).where(hc(...f)).orderBy(...b).limit(l).offset(p);return Tt({userId:t,surface:"api",action:"search",metadata:o?{query:o}:void 0}),e.header("Cache-Control","private, max-age=30"),e.json(A)});_c.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(g).where(hc(vn(g.id,n),vn(g.archived,!1)));if(!o)return e.json({error:"Instruction not found"},404);if(o.scope!=="org"&&o.scope!=="team")return e.json({error:"Badges can only be set on org or team-scoped instructions"},400);let s=o.scopeRef;if(!s)return e.json({error:"Instruction has no scope reference"},400);let[i]=await u.select().from(Q).where(hc(vn(Q.userId,t),vn(Q.orgId,s)));if(!i||i.role!=="admin"&&i.role!=="owner")return e.json({error:"Only admins of the owning organization can set badges"},403);let[a]=await u.update(g).set({badge:r.badge,updatedAt:new Date}).where(vn(g.id,n)).returning(),c=r.badge?"badge_set":"badge_removed";return await u.insert(Ct).values({instructionId:n,eventType:c,actorId:t,metadata:{badge:r.badge}}),e.json(a)});D();import{Hono as tN}from"hono";import{eq as fo,and as Du,or as nN,inArray as rI}from"drizzle-orm";var Ou=new tN;Ou.post("/projects/:id/recommendations",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(U).where(Du(fo(U.id,n),fo(U.createdBy,t)));if(!r)return e.json({error:"Project not found"},404);let o=await u.select({orgId:Q.orgId}).from(Q).where(fo(Q.userId,t)),s=await u.select({teamId:ye.teamId}).from(ye).where(fo(ye.userId,t)),i=o.map(f=>f.orgId).filter(f=>f!==null),a=s.map(f=>f.teamId).filter(f=>f!==null),c=[fo(g.scope,"public")];i.length>0&&c.push(Du(fo(g.scope,"org"),rI(g.scopeRef,i))),a.length>0&&c.push(Du(fo(g.scope,"team"),rI(g.scopeRef,a)));let l=await u.select().from(g).where(Du(fo(g.archived,!1),nN(...c))).limit(50);if(l.length===0)return e.json({recommendations:[],error:null});let p={name:r.name,description:r.description,languages:[],topics:[],dependencies:[]};if(r.githubRepo)try{let f=r.githubRepo.replace("https://github.com/",""),[w,b]=await Promise.all([fetch(`https://api.github.com/repos/${f}`,{headers:{Accept:"application/vnd.github.v3+json","User-Agent":"RuleMetric"}}),fetch(`https://api.github.com/repos/${f}/languages`,{headers:{Accept:"application/vnd.github.v3+json","User-Agent":"RuleMetric"}})]);if(w.ok){let I=await w.json();p.topics=I.topics??[]}if(b.ok){let I=await b.json();p.languages=Object.keys(I)}}catch{}let m=l.map(f=>({id:f.id,name:f.name,description:f.description??"",tags:f.tags??[],contentPreview:(f.content??"").slice(0,400)})),y=process.env.LLM_PROVIDER,v=process.env.LLM_API_KEY;if(!y||!v)return e.json({recommendations:[],error:"LLM not configured"});let h=await lf(p,m,{llmProvider:y,llmApiKey:v});return e.json(h)});import{Hono as XN}from"hono";D();import{Hono as AN}from"hono";import{z as $f}from"zod";import{eq as mt,and as Ac,desc as bI,sql as jn}from"drizzle-orm";D();import{and as fN,eq as Lf,sql as gN}from"drizzle-orm";function yf(e,t){let n=e,r=t,o=n+r;if(o===0)return{pValue:1,nDiscordant:0};let s=Math.min(n,r),i=Math.pow(.5,o),a=i;for(let c=1;c<=s;c++)i*=(o-c+1)/c,a+=i;return{pValue:Math.min(1,2*a),nDiscordant:o}}d(yf,"mcnemarExact");function Mu(e,t,n=10){return{sufficient:e>=n&&t>=n,minN:n,nWith:e,nWithout:t,shortfall:{with:Math.max(0,n-e),without:Math.max(0,n-t)}}}d(Mu,"assessSufficiency");var go=1.959963984540054;function Lu(e,t,n=go){if(t===0)return{lower:0,upper:1};let r=e/t,o=n*n,s=1+o/t,i=(r+o/(2*t))/s,a=n/s*Math.sqrt(r*(1-r)/t+o/(4*t*t));return{lower:Math.max(0,i-a),upper:Math.min(1,i+a)}}d(Lu,"wilsonInterval");function li(e){let t=e>>>0;return()=>{t=t+1831565813|0;let n=Math.imul(t^t>>>15,1|t);return n=n+Math.imul(n^n>>>7,61|n)^n,((n^n>>>14)>>>0)/4294967296}}d(li,"seededRandom");function ui(e,t){let n=e.length;if(n===1)return e[0];let r=(n-1)*t,o=Math.floor(r),s=Math.ceil(r);return o===s?e[o]:e[o]+(r-o)*(e[s]-e[o])}d(ui,"sortedQuantile");function wf(e,t={}){let n=e.length;if(n===0)return{estimate:0,lower:0,upper:0,iterations:0};let r=t.iterations??1e4,o=t.ciLevel??.95,s=li(t.seed??1),i=e.reduce((l,p)=>l+p,0)/n,a=new Array(r);for(let l=0;l<r;l++){let p=0;for(let m=0;m<n;m++)p+=e[s()*n|0];a[l]=p/n}a.sort((l,p)=>l-p);let c=(1-o)/2;return{estimate:i,lower:ui(a,c),upper:ui(a,1-c),iterations:r}}d(wf,"pairedBootstrapCI");function vf(e,t,n={}){if(e.length===0||t.length===0)return{estimate:0,lower:0,upper:0,pValue:1,iterations:0};let r=n.iterations??1e4,o=n.ciLevel??.95,s=li(n.seed??1),i=d(v=>v.reduce((h,f)=>h+f,0)/v.length,"mean"),a=i(e)-i(t),c=new Array(r),l=0,p=0;for(let v=0;v<r;v++){let h=0;for(let b=0;b<e.length;b++)h+=e[s()*e.length|0];let f=0;for(let b=0;b<t.length;b++)f+=t[s()*t.length|0];let w=h/e.length-f/t.length;c[v]=w,w<=0&&l++,w>=0&&p++}c.sort((v,h)=>v-h);let m=(1-o)/2,y=Math.min(1,2*Math.min(l,p)/r);return{estimate:a,lower:ui(c,m),upper:ui(c,1-m),pValue:y,iterations:r}}d(vf,"twoSampleBootstrapCI");function If(e,t={}){let n=e.filter(f=>f.withScores.length>0&&f.withoutScores.length>0);if(n.length===0)return{estimate:0,lower:0,upper:0,pValue:1,iterations:0};let r=d(f=>f.reduce((w,b)=>w+b,0)/f.length,"mean"),o=n.map(f=>f.withScores.length*f.withoutScores.length/(f.withScores.length+f.withoutScores.length)),s=o.reduce((f,w)=>f+w,0),i=d(f=>f.reduce((w,b,I)=>w+o[I]*b,0)/s,"combine"),a=i(n.map(f=>r(f.withScores)-r(f.withoutScores))),c=t.iterations??1e4,l=t.ciLevel??.95,p=li(t.seed??1),m=new Array(c),y=0,v=0;for(let f=0;f<c;f++){let w=n.map(I=>{let S=0;for(let E=0;E<I.withScores.length;E++)S+=I.withScores[p()*I.withScores.length|0];let A=0;for(let E=0;E<I.withoutScores.length;E++)A+=I.withoutScores[p()*I.withoutScores.length|0];return S/I.withScores.length-A/I.withoutScores.length}),b=i(w);m[f]=b,b<=0&&y++,b>=0&&v++}m.sort((f,w)=>f-w);let h=(1-l)/2;return{estimate:a,lower:ui(m,h),upper:ui(m,1-h),pValue:Math.min(1,2*Math.min(y,v)/c),iterations:c}}d(If,"stratifiedBootstrapCI");function bf(e,t){if(e.length!==t.length)throw new Error(`cupedAdjust: outcomes (${e.length}) and covariates (${t.length}) must be the same length`);let n=e.length;if(n===0)return{adjusted:[],theta:0,varianceReduction:0};let r=t.reduce((v,h)=>v+h,0)/n,o=e.reduce((v,h)=>v+h,0)/n,s=0,i=0,a=0;for(let v=0;v<n;v++){let h=t[v]-r,f=e[v]-o;s+=h*f,i+=h*h,a+=f*f}if(i===0)return{adjusted:[...e],theta:0,varianceReduction:0};let c=s/i,l=e.map((v,h)=>v-c*(t[h]-r)),p=0,m=l.reduce((v,h)=>v+h,0)/n;for(let v of l)p+=(v-m)*(v-m);let y=a===0?0:1-p/a;return{adjusted:l,theta:c,varianceReduction:y}}d(bf,"cupedAdjust");function Sf(e,t=.05){return e.map(n=>{let r=Math.abs(n.withPassRate-n.withoutPassRate),o=r>t,s;return o?s=`discriminates: ${(n.withPassRate*100).toFixed(0)}% with vs ${(n.withoutPassRate*100).toFixed(0)}% without`:n.withPassRate>=1-t&&n.withoutPassRate>=1-t?s="always passes in both cohorts \u2014 measures nothing about the treatment":n.withPassRate<=t&&n.withoutPassRate<=t?s="always fails in both cohorts \u2014 measures nothing about the treatment":s="similar pass rate in both cohorts \u2014 non-discriminating",{...n,discriminating:o,separation:r,note:s}})}d(Sf,"diagnoseAssertions");function Af(e,t={}){let n=t.unpaired??0,r=t.materialFraction??.5,o=e.filter(l=>l.discriminating).length,s=e.length-o,i=e.length+n,a=s+n,c=null;if(i>0&&a>0&&a/i>=r){let l=n>0?` (${n} with no baseline cohort)`:"";c=`${a}/${i} cases do not discriminate with vs without${l} \u2014 cull or replace them before adding runs; more runs of a non-discriminating case cannot lower the MDE`}return{total:i,discriminating:o,nonDiscriminating:s,unpaired:n,diagnoses:e,gateReason:c}}d(Af,"summarizeDiscrimination");function $u(e,t){let n=e.length,r=t.length;if(n===0||r===0)return 0;let o=[...e.map(l=>({t:l,exposed:!0})),...t.map(l=>({t:l,exposed:!1}))].sort((l,p)=>l.t-p.t),s=0,i=0;for(;i<o.length;){let l=i;for(;l+1<o.length&&o[l+1].t===o[i].t;)l++;let p=(i+1+l+1)/2;for(let m=i;m<=l;m++)o[m].exposed&&(s+=p);i=l+1}let c=(s-n*(n+1)/2)/(n*r);return Math.abs(c-.5)}d($u,"cohortTimeSeparation");var cs=.35,qu=900*1e3;function Ef(e,t,n=cs,r=qu){if(e.length===0||t.length===0)return!1;let o=[...e,...t];return Math.max(...o)-Math.min(...o)<r?!1:$u(e,t)>n}d(Ef,"isTimeSeparated");var oI=d(e=>e===0||e===1,"isBinary");function sI(e,t,n){return e.every(o=>o[t]!=null&&o[n]!=null)?e.reduce((o,s)=>o+(s[t]-s[n]),0)/e.length:null}d(sI,"meanPairDelta");function Uu(e,t={}){let n=t.baseline??"no-rule",r=t.minN??10,o=e.length,s=e.map(f=>f.withScore-f.withoutScore),i=o===0?0:s.reduce((f,w)=>f+w,0)/o,a=wf(s,{seed:t.seed,iterations:t.iterations}),c={lower:a.lower,upper:a.upper},l=e.every(f=>oI(f.withScore)&&oI(f.withoutScore)),p=null;if(l&&o>0){let f=0,w=0;for(let b of e)b.withScore===1&&b.withoutScore===0?f++:b.withScore===0&&b.withoutScore===1&&w++;p=yf(f,w).pValue}let{sufficient:m}=Mu(o,o,r),y=c.lower>0||c.upper<0,h={mode:"controlled",baseline:n,delta:i,ci:c,pValue:p,significant:m&&y,sufficient:m,nWith:o,nWithout:o,costDelta:sI(e,"withCost","withoutCost"),latencyDelta:sI(e,"withLatency","withoutLatency"),confounded:!1};return m||(h.insufficientReason=`insufficient data: need >= ${r} paired tasks per cohort, have ${o}`),h}d(Uu,"buildControlledVerdict");var rN=2;function Hu(e,t,n={}){let r=n.minN??10,o=e.length,s=t.length,i=e.map(I=>I.score),a=t.map(I=>I.score),c=[...e,...t],l=c.length>0&&c.every(I=>typeof I.covariate=="number");if(l){let{adjusted:I}=bf(c.map(S=>S.score),c.map(S=>S.covariate));i=I.slice(0,o),a=I.slice(o)}let p=vf(i,a,{seed:n.seed,iterations:n.iterations}),m={lower:p.lower,upper:p.upper},y=p.estimate,v=o>0&&s>0?p.pValue:null,{sufficient:h}=Mu(o,s,r),f=h&&(m.lower>0||m.upper<0),w=d(I=>{if(o===0||s===0||!e.every(E=>I(E)!=null)||!t.every(E=>I(E)!=null))return null;let S=e.reduce((E,R)=>E+I(R),0)/o,A=t.reduce((E,R)=>E+I(R),0)/s;return S-A},"meanDiff"),b={mode:"observational",baseline:n.baseline??"no-rule",delta:y,ci:m,pValue:v,significant:f,sufficient:h,nWith:o,nWithout:s,costDelta:w(I=>I.cost),latencyDelta:w(I=>I.latency),confounded:!0,cupedApplied:l};return h||(b.insufficientReason=`insufficient data: need >= ${r} sessions per cohort, have ${o} exposed / ${s} unexposed`),b}d(Hu,"buildObservationalVerdict");function In(e,t={}){let n=t.minN??10,r=t.minPerStratum??rN,o=t.maxTimeSeparation??cs,s=t.minStratumSpanMs??qu,i=e.filter(R=>R.withScores.length>=r&&R.withoutScores.length>=r),a=i.filter(R=>R.withTimes!=null&&R.withoutTimes!=null&&Ef(R.withTimes,R.withoutTimes,o,s)),c=new Set(a.map(R=>R.key)),l=i.filter(R=>!c.has(R.key)),p=e.filter(R=>R.withScores.length>0&&R.withoutScores.length>0&&(R.withScores.length<r||R.withoutScores.length<r)).length,m=l.reduce((R,O)=>R+O.withScores.length,0),y=l.reduce((R,O)=>R+O.withoutScores.length,0),v=If(l,{seed:t.seed,iterations:t.iterations}),h={lower:v.lower,upper:v.upper},f=v.estimate,w=l.length>0&&m>=n&&y>=n,b=l.length>0?v.pValue:null,I=w&&(h.lower>0||h.upper<0),S=e.reduce((R,O)=>R+O.withScores.length+O.withoutScores.length,0),A=S>0?(m+y)/S:0,E={mode:"observational",baseline:t.baseline??"no-rule",delta:f,ci:h,pValue:b,significant:I,sufficient:w,nWith:m,nWithout:y,costDelta:null,latencyDelta:null,confounded:!0,strata:l.length,strataDroppedForTimeSeparation:a.length,coverage:A};if(!w){let R=p>0?` (${p} project(s) had both cohorts but fewer than ${r} sessions in one of them)`:"",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`:"";E.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 ${m} exposed / ${y} unexposed${R}${O?`.${O}`:""}`}return E}d(In,"buildStratifiedVerdict");function xf(e,t,n={}){return{overall:In(e,n),segments:Bu(t,n)}}d(xf,"buildSegmentedVerdict");function Bu(e,t={}){return e.map(n=>({segment:n.segment,verdict:In(n.strata,t)}))}d(Bu,"buildSegmentVerdicts");function ds(e){return e.sufficient?e.significant?e.delta<0?"harmful":"helpful":"neutral":"insufficient"}d(ds,"classifyEffect");var pi={achieved:1,fully_achieved:1,mostly_achieved:.75,partially_achieved:.5,unclear_from_transcript:.25,not_achieved:0,abandoned:0},us=d(e=>{let t=e?pi[e]:void 0;return t===void 0?null:t},"scoreOutcome");var mi=10,Fu=d(e=>e.length===0?0:e.reduce((t,n)=>t+n,0)/e.length,"mean"),Tf=d(e=>{if(e.length<2)return 0;let t=Fu(e);return e.reduce((n,r)=>n+(r-t)**2,0)/(e.length-1)},"sampleVar"),iI=d((e,t)=>{let n=t.reduce((l,p)=>l+p,0);if(n<=0||e.length===0)return{mean:0,varOfMean:0,nEff:0};let r=t.reduce((l,p)=>l+p*p,0),o=n*n/r,s=e.reduce((l,p,m)=>l+t[m]*p,0)/n,i=n-r/n,c=(i>0?e.reduce((l,p,m)=>l+t[m]*(p-s)**2,0)/i:0)*r/(n*n);return{mean:s,varOfMean:c,nEff:o}},"weightedStats");function Rf(e,t,n={}){let r=n.minAnchors??mi,o=n.z??go,s=e.length,i=t.length,a=[...e,...t.map(A=>A.judge)],c=Fu(a),l=t.map(A=>A.weight??1),p=t.map(A=>A.human-A.judge),m=iI(p,l),y=m.mean,v=i>0?m.nEff:0,h=t.filter(A=>A.validated!==!1).length;if(n.pooledRectifier){let A=n.pooledRectifier,E=s>0?e:t.map($=>$.judge);if(E.length===0)return{estimate:NaN,ci:{lower:NaN,upper:NaN},se:1/0,naive:c,rectifier:A.rectifier,nLabeled:i,nUnlabeled:s,nEffective:v,nValidated:h,sufficient:!1,insufficientReason:"no judge scores to correct with the pooled rectifier"};let R=Fu(E)+A.rectifier,O=Tf(E)/E.length+A.variance,j=Math.sqrt(O),P={estimate:R,ci:{lower:R-o*j,upper:R+o*j},se:j,naive:c,rectifier:A.rectifier,nLabeled:i,nUnlabeled:s,nEffective:v,nValidated:h,sufficient:A.sufficient};return A.sufficient||(P.insufficientReason="pooled rectifier not yet adequate"),P}let f,w;if(i===0)f=c,w=a.length>0?Tf(a)/a.length:0;else if(s===0){let A=iI(t.map(E=>E.human),l);f=A.mean,w=A.varOfMean}else f=Fu(e)+y,w=Tf(e)/s+m.varOfMean;let b=Math.sqrt(w),I=h>=r,S={estimate:f,ci:{lower:f-o*b,upper:f+o*b},se:b,naive:c,rectifier:y,nLabeled:i,nUnlabeled:s,nEffective:v,nValidated:h,sufficient:I};if(!I){let A=i-h;S.insufficientReason=`insufficient anchors: need >= ${r} VALIDATED human-labeled items, have ${h}${A>0?` (+${A} passive, which don't count toward the floor)`:""}`}return S}d(Rf,"ppiMeanEstimate");function yc(e,t,n={}){let r=Rf(e.unlabeledJudge,e.labeled,{...n,pooledRectifier:n.withPooledRectifier}),o=Rf(t.unlabeledJudge,t.labeled,{...n,pooledRectifier:n.withoutPooledRectifier}),s=n.z??go,i=r.estimate-o.estimate,a=Math.sqrt(r.se**2+o.se**2),c={lower:i-s*a,upper:i+s*a},l=r.sufficient&&o.sufficient,p=l&&(c.lower>0||c.upper<0),m={delta:i,ci:c,se:a,with:r,without:o,sufficient:l,significant:p};return l||(m.insufficientReason=r.insufficientReason??o.insufficientReason),m}d(yc,"ppiDifference");var Wu=50,dI=.2,uI=.8416212335729143,oN=d(e=>e.length===0?0:e.reduce((t,n)=>t+n,0)/e.length,"mean"),wc=d(e=>{if(e.length<2)return 0;let t=oN(e);return e.reduce((n,r)=>n+(r-t)**2,0)/(e.length-1)},"sampleVar");function aI(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}}d(aI,"varianceComponents");var cI=1e6;function sN(e,t){if(e.some(s=>s.scaling===null))return null;let n=d(s=>e.reduce((i,a)=>i+a.fixed+(a.scaling===0?0:a.scaling/(a.n+s)),0),"se2");if(n(cI)>t)return null;let r=0,o=cI;for(;r<o;){let s=Math.floor((r+o)/2);n(s)<=t?o=s:r=s+1}return r}d(sN,"solvePerCohortIncrement");function kf(e,t,n={}){let r=n.pilotTarget??Wu,o=n.targetEffect??dI,s=n.minAnchors??mi,i=n.z??go,a=n.zPower??uI,c=i+a,l=d(j=>(j*100).toFixed(0),"pp"),p=e.labeled.length,m=t.labeled.length,y=n.humanLabeledRuns??p+m,v=e.unlabeledJudge.length+p+t.unlabeledJudge.length+m,h={nAnchors:y,nAnchorsWith:p,nAnchorsWithout:m,pilotTarget:r,pilotMet:y>=r,targetEffect:o};if(v===0)return{...h,seDelta:null,mde:null,powered:!1,adequate:!1,reasons:["no graded runs to calibrate against"],additionalAnchorsNeeded:r};let f=yc(e,t,{minAnchors:s,z:i,withPooledRectifier:n.pool?.withPooledRectifier,withoutPooledRectifier:n.pool?.withoutPooledRectifier}).se,w=c*f,b=w<=o;if(n.pool){let{totalAnchors:j,targets:P}=n.pool,$=j>=r,H=P>=3,B=$&&H&&b,ee=[];return H||ee.push(`pool spans ${P}/3 same-judge targets \u2014 between-target variance is assumed, not measured`),$||ee.push(`pool floor not met: ${j}/${r} human-labeled runs across the same-judge pool`),b||ee.push(`MDE \xB1${l(w)}pp exceeds the \xB1${l(o)}pp target effect \u2014 pooling lowers the label cost, not this; more graded runs are needed (\xA76d(f))`),{...h,seDelta:f,mde:w,powered:b,adequate:B,reasons:ee,additionalAnchorsNeeded:$?null:r-j,pooled:!0,poolAnchors:j,poolTargets:P}}let I=p>=s,S=m>=s,A=h.pilotMet&&I&&S&&b,E,R=0;if(!b){let j=(o/c)**2,P=sN([aI(e,t),aI(t,e)],j);R=P===null?null:2*P}if(!h.pilotMet)E=r-y;else if(R===null)E=null;else{let j=Math.max(0,s-p)+Math.max(0,s-m);E=Math.max(j,R)}let O=[];if(h.pilotMet||O.push(`pilot target not met: ${y}/${r} human-labeled runs`),I||O.push(`with-target cohort has ${p}/${s} labeled runs (minimum for a corrected estimate)`),S||O.push(`without-target cohort has ${m}/${s} labeled runs (minimum for a corrected estimate)`),!b){let j=R===null?" \u2014 anchors alone cannot reach it; more graded runs are needed":h.pilotMet&&R>0?` \u2014 ~${R} more labeled runs projected to reach it`:"";O.push(`MDE \xB1${l(w)}pp exceeds the \xB1${l(o)}pp target effect${j}`)}return{...h,seDelta:f,mde:w,powered:b,adequate:A,reasons:O,additionalAnchorsNeeded:E}}d(kf,"anchorPowerCheck");function jf(e,t){return{rectifierUsed:e.rectifier,variance:e.variance,lambda:0,pooled:e.rectifier,pooledVariance:e.variance,tau2:0,i2:0,k:1,pooledApplied:!1,assumedExchangeability:!1,...t}}d(jf,"localOnly");function zu(e,t,n={}){let r=n.maxI2??.6,o=[e,...t].filter(B=>B.n>=1&&Number.isFinite(B.variance)&&B.variance>=0),s=o.length;if(s<2)return e.n<1||!Number.isFinite(e.variance)?jf(e,{rectifierUsed:NaN,variance:1/0,reason:"no anchors on this target and none to pool from"}):jf(e,{reason:"only one target with anchors \u2014 nothing to pool"});let i=o.map(B=>B.variance).filter(B=>B>0),a=i.length?i.reduce((B,ee)=>B+ee,0)/i.length:0,c=Math.max(a*.001,1e-12),l=d(B=>Math.max(B,c),"flooredVar"),p=o.map(B=>1/l(B.variance)),m=p.reduce((B,ee)=>B+ee,0),y=p.reduce((B,ee)=>B+ee*ee,0),v=o.reduce((B,ee,_e)=>B+p[_e]*ee.rectifier,0)/m,h=o.reduce((B,ee,_e)=>B+p[_e]*(ee.rectifier-v)**2,0),f=s-1,w=m-y/m,b=w>0?Math.max(0,(h-f)/w):0,I=h>0?Math.max(0,(h-f)/h):0,S=o.map(B=>1/(l(B.variance)+b)),A=S.reduce((B,ee)=>B+ee,0),E=o.reduce((B,ee,_e)=>B+S[_e]*ee.rectifier,0)/A,R=1/A,O=s<3;if(I>r)return e.n>=1&&Number.isFinite(e.variance)?jf(e,{pooled:E,pooledVariance:R,tau2:b,i2:I,k:s,assumedExchangeability:O,reason:`heterogeneity too high (I\xB2=${(I*100).toFixed(0)}%) \u2014 targets disagree; not pooling`}):{rectifierUsed:E,variance:R,lambda:1,pooled:E,pooledVariance:R,tau2:b,i2:I,k:s,pooledApplied:!1,assumedExchangeability:O,reason:`no anchors on this target; pooled estimate is high-heterogeneity (I\xB2=${(I*100).toFixed(0)}%) \u2014 treat as unknown`};let j=e.n<1||!Number.isFinite(e.variance),P=j?1:l(e.variance)/(l(e.variance)+b),$=j?E:P*E+(1-P)*e.rectifier,H=j?R+b:(1-P)*e.variance+P*P*R;return{rectifierUsed:$,variance:H,lambda:P,pooled:E,pooledVariance:R,tau2:b,i2:I,k:s,pooledApplied:!0,assumedExchangeability:O}}d(zu,"shrinkRectifier");var fi=3,Ic=7,Nf="(preamble)",uN=/^\s*(`{3,}|~{3,})/,lN=/^(#{1,6})\s+(.*)$/;function vc(e){let t=e.split(`
|
|
242
|
+
`),n=[],r=[],o={heading:"",level:0,path:[Nf],body:[]},s=null,i=d(()=>{n.push({heading:o.heading,level:o.level,path:o.path,body:o.body.join(`
|
|
243
|
+
`).trim()})},"flush");for(let a of t){let c=uN.exec(a);if(c){let p=c[1];s==null?s={marker:p}:p[0]===s.marker[0]&&p.length>=s.marker.length&&(s=null),o.body.push(a);continue}if(s!=null){o.body.push(a);continue}let l=lN.exec(a);if(l){i();let p=l[1].length,m=l[2].trim();r.length=Math.max(0,p-1),r[p-1]=m,o={heading:m,level:p,path:Array.from({length:p},(y,v)=>r[v]??`(unnamed level ${v+1})`),body:[]};continue}o.body.push(a)}return i(),n.filter((a,c)=>!(c===0&&a.level===0&&a.body===""))}d(vc,"splitMarkdownSections");function Vu(e){let t=new Map,n=new Map;for(let r of e){let o=r.level===0?Nf:r.path.join(" > "),s=(t.get(o)??0)+1;t.set(o,s),n.set(s===1?o:`${o} #${s}`,r)}return n}d(Vu,"sectionKeys");function Pf(e,t){let n=Vu(vc(e)),r=Vu(vc(t)),o=[],s=[],i=[];for(let[a,c]of r){let l=n.get(a);l?l.body!==c.body&&o.push(a):s.push(a)}for(let a of n.keys())r.has(a)||i.push(a);return{changed:o.sort(),added:s.sort(),removed:i.sort()}}d(Pf,"diffSections");function Cf(e){return[...new Set([...e.changed,...e.added,...e.removed])].sort()}d(Cf,"touchedSections");var lI=d(e=>e.trim().toLowerCase(),"normalize");function pI(e,t,n){if(n.length===0)return[];let r=new Set(n.map(lI)),o=Pf(e,t),s=new Set(Cf(o)),i=new Map([...Vu(vc(e)),...Vu(vc(t))]),a=[];for(let c of s){let l=i.get(c);(l?l.path:c.split(" > ")).some(m=>r.has(lI(m)))&&a.push(c)}return a.sort()}d(pI,"protectedViolations");function Df(e){let{verdict:t,canaryGreen:n,adequate:r,adequacyReasons:o=[],promotionsInWindow:s,maxPromotionsPerWindow:i=fi,immutableSections:a=[],beforeContent:c,afterContent:l,measurementMatchesPredecessor:p}=e,m=Cf(Pf(c,l)),y=ds(t),v=[];if(c===l&&v.push("proposal is identical to the current version \u2014 nothing to promote"),t.mode!=="controlled"&&v.push(`verdict is ${t.mode}, not controlled \u2014 Phase 2 measured that an observational version-vs-version comparison is refused on 99.4% of real version pairs, because versions are disjoint in time by construction`),t.baseline!=="prior-version"&&v.push(`verdict baseline is '${t.baseline}', not 'prior-version' \u2014 a no-rule comparison says the instruction beats having no instruction, not that this edit beats the last one`),t.confounded&&v.push("verdict is flagged confounded"),p===!1&&v.push("pairs were measured against a different predecessor than the one now live \u2014 the target's content changed after the eval batch ran, so this verdict is about a comparison that no longer exists"),n||v.push("A/A canary is red \u2014 the verdict path can manufacture effects from noise, so no verdict it produces may be promoted"),!r){let b=o.length>0?`: ${o.join("; ")}`:"";v.push(`verdict is not adequately powered${b}`)}s>=i&&v.push(`change budget exhausted: ${s}/${i} promotions already made in the current window`);let h=pI(c,l,a);if(h.length>0&&v.push(`proposal edits protected section(s): ${h.join(", ")}`),y==="insufficient"&&v.push(t.insufficientReason??"verdict did not clear min-n, so no effect was measured"),v.length>0)return{decision:"refuse",refusals:v,rationale:`refused: ${v.length} gate(s) blocked promotion`,effect:y,touched:m};let f=d(b=>`${b>=0?"+":""}${(b*100).toFixed(1)}pp`,"pp"),w=`[${f(t.ci.lower)}, ${f(t.ci.upper)}]`;return y==="helpful"?{decision:"promote",refusals:[],rationale:`promote: ${f(t.delta)} CI ${w} over the prior version, n=${t.nWith} paired cases`,effect:y,touched:m}:y==="harmful"?{decision:"revert",refusals:[],rationale:`revert: proposal measured WORSE than its predecessor, ${f(t.delta)} CI ${w}`,effect:y,touched:m}:{decision:"revert",refusals:[],rationale:`revert: no detectable improvement, ${f(t.delta)} CI ${w} spans zero`,effect:y,touched:m}}d(Df,"evaluatePromotion");async function Sc(e,t){let[n]=await u.select({id:q.id,instructionId:q.instructionId,projectPath:q.projectPath,status:q.status,contentHash:q.contentHash}).from(q).where(fN(Lf(q.id,e),Lf(q.userId,t)));if(!n)return null;let r=!1;if(n.contentHash){let{instructionContentHash:h}=await Promise.resolve().then(()=>(ls(),_I)),[f]=await u.select({content:g.content,name:g.name}).from(g).where(Lf(g.id,n.instructionId));r=h(f?.content,f?.name)!==n.contentHash}let o=await u.execute(gN`
|
|
244
244
|
SELECT a.arm,
|
|
245
245
|
s.analysis->>'outcome' AS outcome,
|
|
246
246
|
EXTRACT(EPOCH FROM s.started_at) * 1000 AS started_ms
|
|
@@ -249,17 +249,22 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
249
249
|
ON s.external_session_id = a.external_session_id
|
|
250
250
|
AND s.user_id = a.user_id
|
|
251
251
|
WHERE a.experiment_id = ${e}
|
|
252
|
-
`),s={treated:0,control:0},i=[],a=[],c=[],l=[];for(let h of o){let f=h.arm==="treated";f?s.treated++:s.control++;let w=us(h.outcome);if(w===null)continue;let b=h.started_ms===null?null:Number(h.started_ms);f?(i.push(w),b!==null&&c.push(b)):(a.push(w),b!==null&&l.push(b))}let p={treated:i.length,control:a.length},m={experimentId:n.id,instructionId:n.instructionId,projectPath:n.projectPath,status:n.status,assigned:s,measured:p,contentChanged:r};if(r)return{...m,delta:null,ci:null,significant:!1,resolution:"inconclusive",timeSeparation:null,randomisationSuspect:!1,reason:"the instruction was edited mid-experiment \u2014 the arms measured different texts, so no verdict transfers. It re-enters testing as new content."};if(p.treated<10||p.control<10)return{...m,delta:null,ci:null,significant:!1,resolution:"insufficient",timeSeparation:null,randomisationSuspect:!1,reason:`needs ${10} measured sessions per arm; have ${p.treated} treated / ${p.control} control`};let y
|
|
252
|
+
`),s={treated:0,control:0},i=[],a=[],c=[],l=[];for(let h of o){let f=h.arm==="treated";f?s.treated++:s.control++;let w=us(h.outcome);if(w===null)continue;let b=h.started_ms===null?null:Number(h.started_ms);f?(i.push(w),b!==null&&c.push(b)):(a.push(w),b!==null&&l.push(b))}let p={treated:i.length,control:a.length},m={experimentId:n.id,instructionId:n.instructionId,projectPath:n.projectPath,status:n.status,assigned:s,measured:p,contentChanged:r};if(r)return{...m,delta:null,ci:null,significant:!1,resolution:"inconclusive",timeSeparation:null,randomisationSuspect:!1,reason:"the instruction was edited mid-experiment \u2014 the arms measured different texts, so no verdict transfers. It re-enters testing as new content."};if(p.treated<10||p.control<10)return{...m,delta:null,ci:null,significant:!1,resolution:"insufficient",timeSeparation:null,randomisationSuspect:!1,reason:`needs ${10} measured sessions per arm; have ${p.treated} treated / ${p.control} control`};let y=$u(c,l);if(y>cs)return{...m,delta:null,ci:null,significant:!1,resolution:"inconclusive",timeSeparation:y,randomisationSuspect:!0,reason:`arms are time-separated (${y.toFixed(2)} > ${cs}) \u2014 randomisation looks broken, not merely confounded`};let v=Hu(i.map(h=>({score:h})),a.map(h=>({score:h})),{minN:10});return{...m,delta:v.delta,ci:v.ci,significant:v.significant,resolution:v.significant?"resolved":"inconclusive",timeSeparation:y,randomisationSuspect:!1,reason:v.significant?null:"the interval still spans zero \u2014 more sessions, or the effect is small"}}d(Sc,"buildArmVerdict");ls();var hN=new Set(["cmd","cmds","command","commands","host","hostname","url","uri","todo","tbd","xxx","placeholder","insert","fixme"]),_N=/(?<![A-Za-z0-9])<([A-Za-z][^<>\n]{0,78}[A-Za-z0-9._/-])>/g,yN=/\{\{\s*[^{}\n]{1,80}\s*\}\}/g,wN=/_{3,}/g,vN=/[\s:|/]|\.\.\./,IN=/^[a-z][a-z0-9+.-]*:\/\//i;function hi(e,t=10){let n=[],r=new Set,o=d((s,i)=>{r.has(s)||n.length>=t||(r.add(s),n.push({token:s,rule:i}))},"push");for(let s of e.matchAll(_N)){let i=s[1];IN.test(i)||(vN.test(i)||hN.has(i.toLowerCase()))&&o(s[0],"bracketed")}for(let s of e.matchAll(yN))o(s[0],"mustache");for(let s of e.matchAll(wN))o(s[0],"blank");return n}d(hi,"findPlaceholders");D();import{and as bN,eq as _i,gte as SN,sql as yI}from"drizzle-orm";var Ot={MIN_SCORE:.8,KIND:"add",MAX_PER_RUN:2,MAX_PER_WINDOW:5,WINDOW_DAYS:7};async function Yu(e,t){if(t){let[r]=await u.select({override:yI`${U.metadata}->>'autoAcceptSuggestions'`}).from(U).where(_i(U.id,t));if(r?.override!=null)return r.override==="true"?{allowed:!0,source:"project"}:{allowed:!1,source:"project",reason:"auto-accept is turned off for this project"}}let[n]=await u.select({enabled:T.autoAcceptSuggestions}).from(T).where(_i(T.id,e));return n?n.enabled?{allowed:!0,source:"user-default"}:{allowed:!1,source:"user-default",reason:"auto-accept is turned off for your account"}:{allowed:!1,source:"user-default",reason:"no profile row"}}d(Yu,"resolveAutoAcceptConsent");async function wI(e,t){let n=new Date(Date.now()-Ot.WINDOW_DAYS*864e5),[r]=await u.select({n:yI`count(*)::int`}).from(tt).where(bN(_i(tt.userId,e),_i(tt.projectPath,t),_i(tt.eventType,"accepted"),_i(tt.actor,"auto"),SN(tt.createdAt,n)));return r?.n??0}d(wI,"autoAcceptsInWindow");var yi=new AN,vI=3,II=1;yi.get("/instruction-suggestions/auto-acceptable",async e=>{let t=e.get("userId"),n=e.req.query("projectPath");if(!n)return e.json({error:"projectPath is required"},400);let r=await u.select({id:x.id,instructionId:x.instructionId,projectId:x.projectId,score:x.score,kind:x.kind,name:g.name,content:g.content,archived:g.archived}).from(x).innerJoin(g,mt(g.id,x.instructionId)).where(Ac(mt(x.userId,t),mt(x.projectPath,n),mt(x.kind,Ot.KIND),jn`(${x.score} >= ${Ot.MIN_SCORE} OR ${g.frontmatter}->>'source' = 'insights')`,jn`${x.acceptedAt} IS NULL`,jn`${x.dismissedAt} IS NULL`,jn`${x.declinedAt} IS NULL`,mt(x.isStale,!1),mt(g.archived,!1),mt(g.type,"instruction"),jn`NOT EXISTS (
|
|
253
|
+
SELECT 1 FROM instruction_suggestion_events ev
|
|
254
|
+
WHERE ev.suggestion_id = ${x.id}
|
|
255
|
+
AND ev.event_type = 'redundant'
|
|
256
|
+
AND ev.created_at > now() - interval '30 days'
|
|
257
|
+
)`,jn`NOT EXISTS (
|
|
253
258
|
SELECT 1 FROM instruction_experiments e
|
|
254
259
|
WHERE e.instruction_id = ${x.instructionId}
|
|
255
260
|
AND e.project_path = ${x.projectPath}
|
|
256
261
|
AND e.status = 'running'
|
|
257
|
-
)`)).orderBy(
|
|
262
|
+
)`)).orderBy(bI(x.score)),o=await Yu(t,r[0]?.projectId??null);if(!o.allowed)return e.json({consent:o,eligible:[],refused:r.map(l=>({id:l.id,name:l.name,reason:o.reason})),budget:null});let s=await wI(t,n),i=Math.max(0,Ot.MAX_PER_WINDOW-s),a=[],c=[];for(let l of r){let p=hi(l.content??"");if(p.length>0){c.push({id:l.id,name:l.name,reason:`unfilled placeholder(s): ${p.map(m=>m.token).join(", ")}`});continue}if(a.length>=Math.min(Ot.MAX_PER_RUN,i)){c.push({id:l.id,name:l.name,reason:i<=a.length?`budget: ${s}/${Ot.MAX_PER_WINDOW} auto-accepted in the last ${Ot.WINDOW_DAYS}d`:`over the per-run cap of ${Ot.MAX_PER_RUN}`});continue}a.push({id:l.id,instructionId:l.instructionId,name:l.name,score:l.score})}return e.json({consent:o,eligible:a,refused:c,budget:{used:s,max:Ot.MAX_PER_WINDOW,windowDays:Ot.WINDOW_DAYS,perRun:Ot.MAX_PER_RUN}})});yi.post("/instruction-experiments/settle",async e=>{let t=e.get("userId"),n=await e.req.json().catch(()=>({})),r=typeof n?.projectPath=="string"?n.projectPath:null,o=await u.select({id:q.id,source:q.source,status:q.status,instructionId:q.instructionId,projectPath:q.projectPath}).from(q).where(Ac(mt(q.userId,t),mt(q.status,"running"),...r?[mt(q.projectPath,r)]:[])),s=[],i=0;for(let a of o)try{let c=await Sc(a.id,t);if(!c){i+=1;continue}let l=await gi({experimentId:a.id,userId:t,verdict:c,source:a.source,status:a.status});l?s.push({experimentId:a.id,outcome:l}):i+=1}catch{i+=1}return e.json({examined:o.length,settled:s,stillRunning:i})});yi.get("/instruction-suggestions/trialable",async e=>{let t=e.get("userId"),n=e.req.query("projectPath");if(!n)return e.json({error:"projectPath is required"},400);let[{running:r}]=await u.select({running:jn`count(*)::int`}).from(q).where(Ac(mt(q.userId,t),mt(q.projectPath,n),mt(q.status,"running"))),o=Math.max(0,vI-r),s=await u.select({id:x.id,instructionId:x.instructionId,score:x.score,name:g.name,content:g.content}).from(x).innerJoin(g,mt(g.id,x.instructionId)).where(Ac(mt(x.userId,t),mt(x.projectPath,n),mt(x.kind,"add"),jn`${x.acceptedAt} IS NULL`,jn`${x.dismissedAt} IS NULL`,jn`${x.declinedAt} IS NULL`,mt(x.isStale,!1),mt(g.archived,!1),jn`${g.type} NOT IN ('hook','mcp','subagent')`,jn`NOT EXISTS (
|
|
258
263
|
SELECT 1 FROM instruction_experiments e
|
|
259
264
|
WHERE e.instruction_id = ${x.instructionId}
|
|
260
265
|
AND e.project_path = ${x.projectPath}
|
|
261
266
|
AND e.status = 'running'
|
|
262
|
-
)`)).orderBy(
|
|
267
|
+
)`)).orderBy(bI(x.score)).limit(50),i=[],a=[];for(let c of s){if(i.length>=Math.min(o,II))break;let l=hi(c.content??"");if(l.length>0){a.push({name:c.name,reason:`unfilled placeholder(s): ${l.map(p=>p.token).join(", ")}`});continue}i.push({id:c.id,instructionId:c.instructionId,name:c.name,score:c.score})}return e.json({candidates:i,refused:a,running:r,slots:o,limits:{maxConcurrent:vI,maxPerRun:II}})});var EN=$f.object({projectPath:$f.string().min(1),instructionId:$f.string().uuid()});yi.post("/instruction-suggestions/undo",async e=>{let t=e.get("userId"),n=EN.safeParse(await e.req.json().catch(()=>({})));if(!n.success)return e.json({error:n.error.flatten()},400);let{projectPath:r,instructionId:o}=n.data,[s]=await u.select({id:x.id,name:g.name,acceptedAt:x.acceptedAt}).from(x).innerJoin(g,mt(g.id,x.instructionId)).where(Ac(mt(x.userId,t),mt(x.projectPath,r),mt(x.instructionId,o))).limit(1);return s?(await u.update(x).set({acceptedAt:null,dismissedAt:new Date}).where(mt(x.id,s.id)),await u.insert(tt).values({suggestionId:s.id,userId:t,eventType:"dismissed",projectPath:r,actor:"human"}),e.json({id:s.id,name:s.name,wasAccepted:s.acceptedAt!=null})):e.json({error:"No suggestion for that instruction on this project"},404)});D();import{Hono as DN}from"hono";import{eq as Wt,and as ps,asc as xI,desc as TI,inArray as el,sql as ur}from"drizzle-orm";D();import{createHash as xN}from"node:crypto";import{and as SI,eq as Xu,inArray as TN,sql as r6}from"drizzle-orm";function RN(e,t,n){return xN("sha256").update(`${e}:${t}`).digest().readUIntBE(0,6)/0xffffffffffff<n?"treated":"control"}d(RN,"assignArm");async function AI(e){let{userId:t,projectPath:n,externalSessionId:r}=e;if(!r)return[];let o=await u.select({id:q.id,instructionId:q.instructionId,treatedShare:q.treatedShare,salt:q.salt}).from(q).where(SI(Xu(q.userId,t),Xu(q.projectPath,n),Xu(q.status,"running")));if(o.length===0)return[];await u.insert(Dr).values(o.map(a=>({experimentId:a.id,userId:t,externalSessionId:r,arm:RN(a.salt,r,Number(a.treatedShare))}))).onConflictDoNothing();let s=await u.select({experimentId:Dr.experimentId,arm:Dr.arm}).from(Dr).where(SI(Xu(Dr.externalSessionId,r),TN(Dr.experimentId,o.map(a=>a.id)))),i=new Map(s.map(a=>[a.experimentId,a.arm]));return o.flatMap(a=>{let c=i.get(a.id);return c?[{experimentId:a.id,instructionId:a.instructionId,arm:c}]:[]})}d(AI,"resolveArmsForSession");function EI(e){return new Set(e.filter(t=>t.arm==="control").map(t=>t.instructionId))}d(EI,"withheldInstructionIds");ls();D();import{sql as qf,eq as kN}from"drizzle-orm";var wi=.7;async function Qu(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:wi}catch{return wi}}d(Qu,"readConfidenceThreshold");var jN=5,NN=90,PN="surface_budget",Uf="declined_by_silence",CN=qf`(
|
|
263
268
|
SELECT count(*) FROM (
|
|
264
269
|
SELECT date_trunc('hour', min(e.created_at)) AS h
|
|
265
270
|
FROM instruction_suggestion_events e
|
|
@@ -274,7 +279,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
274
279
|
AND e.event_type IN ('surfaced', 'surfaced_with_content')
|
|
275
280
|
AND e.session_id IS NULL
|
|
276
281
|
) hours
|
|
277
|
-
)`,
|
|
282
|
+
)`,Ec=qf`(${x.declinedAt} IS NULL OR ${x.declinedAt} < now() - make_interval(days => ${NN}))`;async function Zu(e,t){await u.execute(qf`
|
|
278
283
|
WITH over_budget AS (
|
|
279
284
|
SELECT instruction_suggestions.id
|
|
280
285
|
FROM instruction_suggestions
|
|
@@ -290,12 +295,12 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
290
295
|
AND instruction_suggestions.accepted_at IS NULL
|
|
291
296
|
AND (instruction_suggestions.dismissed_at IS NULL
|
|
292
297
|
OR instruction_suggestions.dismissed_at < now() - interval '30 days')
|
|
293
|
-
AND ${
|
|
298
|
+
AND ${CN} >= ${jN}
|
|
294
299
|
),
|
|
295
300
|
stamped AS (
|
|
296
301
|
UPDATE instruction_suggestions t
|
|
297
302
|
SET declined_at = now(),
|
|
298
|
-
declined_reason = ${
|
|
303
|
+
declined_reason = ${PN}
|
|
299
304
|
FROM over_budget o
|
|
300
305
|
-- Re-checked here, not only in the CTE: under READ COMMITTED two
|
|
301
306
|
-- concurrent session starts both see declined_at IS NULL, and only
|
|
@@ -305,8 +310,8 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
305
310
|
RETURNING t.id, t.user_id, t.project_path
|
|
306
311
|
)
|
|
307
312
|
INSERT INTO instruction_suggestion_events (suggestion_id, user_id, event_type, project_path)
|
|
308
|
-
SELECT id, user_id, ${
|
|
309
|
-
`)}d(Ku,"sweepDeclinedBySilence");var $f=new jN,AI=2e3,NN=4,PN={"session-start":{add:3,remove:2,trim:1}},CN=["add","remove","trim"];function Lf(e){return e.length<=AI?e:e.slice(0,AI)+"... [truncated]"}d(Lf,"truncateContent");$f.get("/instruction-suggestions",async e=>{let t=e.get("userId"),n=e.req.query("projectId"),r=e.req.query("projectPath"),o=Number(e.req.query("limit")??"5"),s=Math.min(Math.max(o,1),10),i=e.req.query("includeContent")==="true",a=e.req.query("groupByKind")==="true",c=e.req.query("renderFor"),l=c?PN[c]:void 0;if(c&&!l)return e.json({error:`unknown renderFor: ${c}`},400);let p=a||l!==void 0;if(!n&&!r)return e.json({error:"projectId or projectPath is required"},400);let m=n?Wt(x.projectId,n):Wt(x.projectPath,r);try{await Ku(t,ur`${m}`)}catch{}let y=await u.select({id:x.id,instructionId:x.instructionId,score:x.score,reason:x.reason,generatedAt:x.generatedAt,isStale:x.isStale,kind:x.kind,name:g.name,description:g.description,tags:g.tags,instructionScope:g.scope,estimatedTokens:ur`(length(${g.content}) / 4)::int`,_rawContent:g.content}).from(x).innerJoin(g,Wt(x.instructionId,g.id)).where(ps(Wt(x.userId,t),m,Wt(g.archived,!1),ur`${x.acceptedAt} IS NULL`,ur`(${x.dismissedAt} IS NULL OR ${x.dismissedAt} < now() - interval '30 days')`,Ac)).orderBy(bI(x.isStale),SI(x.score)).limit(s),v=[];if(p){let ee=new Set(y.map(N=>N.id));v=(await u.select({id:x.id,instructionId:x.instructionId,score:x.score,reason:x.reason,generatedAt:x.generatedAt,isStale:x.isStale,kind:x.kind,name:g.name,description:g.description,tags:g.tags,instructionScope:g.scope,estimatedTokens:ur`(length(${g.content}) / 4)::int`,_rawContent:g.content}).from(x).innerJoin(g,Wt(x.instructionId,g.id)).where(ps(Wt(x.userId,t),m,ur`${x.kind} <> 'add'`,Wt(g.archived,!1),ur`${x.acceptedAt} IS NULL`,ur`(${x.dismissedAt} IS NULL OR ${x.dismissedAt} < now() - interval '30 days')`,Ac)).orderBy(bI(x.isStale),SI(x.score)).limit(NN)).filter(N=>!ee.has(N.id))}let h=i?await Gu(t):wi,f=[...y,...v].map(ee=>{let{_rawContent:Re,...N}=ee,me=i&&ee.kind==="add"&&ee.score>=h&&typeof Re=="string"?Lf(Re):null;return{...N,content:me}}),w=l?await vI({userId:t,projectPath:r??"",externalSessionId:e.req.query("sessionId")||void 0}):[],b=II(w),I=l?await Pf(t,r??""):[],S=new Set(I.filter(ee=>ee.decision==="never").map(ee=>ee.instructionId)),A=I.filter(ee=>ee.decision==="always"),E=new Set(I.map(ee=>ee.instructionId)),R=w.filter(ee=>ee.arm==="treated"),D=new Set(w.map(ee=>ee.instructionId)),j=b.size===0&&E.size===0&&D.size===0?f:f.filter(ee=>!b.has(ee.instructionId)&&!E.has(ee.instructionId)&&!D.has(ee.instructionId)),P=j,$;if(l){let ee=new Map;for(let N of j){let me=N.kind??"add",M=l[me];if(M===void 0||M<=0)continue;let ue=ee.get(me)??[];ue.length>=M||(ue.push(N),ee.set(me,ue))}let Re=ee.get("add")??[];if(R.length>0){let N=new Map(R.map(M=>[M.instructionId,M.experimentId])),me=await u.select({id:g.id,name:g.name,description:g.description,tags:g.tags,instructionScope:g.scope,content:g.content}).from(g).where(ps(Yu(g.id,R.map(M=>M.instructionId)),Wt(g.archived,!1)));for(let M of me.reverse())Re.unshift({id:`experiment:${N.get(M.id)}`,instructionId:M.id,score:1,reason:"under measurement on this project",generatedAt:new Date,isStale:!1,kind:"add",name:M.name,description:M.description,tags:M.tags,instructionScope:M.instructionScope,estimatedTokens:Math.ceil((M.content?.length??0)/4),content:i?Lf(M.content??""):null});ee.set("add",Re)}if(A.length>0){let N=await u.select({id:g.id,name:g.name,description:g.description,tags:g.tags,instructionScope:g.scope,content:g.content}).from(g).where(ps(Yu(g.id,A.map(me=>me.instructionId)),Wt(g.archived,!1)));for(let me of N.reverse())Re.unshift({id:`graduated:${me.id}`,instructionId:me.id,score:1,reason:"graduated: measured to help on this project",generatedAt:new Date,isStale:!1,kind:"add",name:me.name,description:me.description,tags:me.tags,instructionScope:me.instructionScope,estimatedTokens:Math.ceil((me.content?.length??0)/4),content:i?Lf(me.content??""):null});ee.set("add",Re)}P=CN.flatMap(N=>ee.get(N)??[]),$={addCount:Re.length,costCount:(ee.get("remove")??[]).length+(ee.get("trim")??[]).length,highConfidenceCount:Re.filter(N=>N.content!==null).length,omitted:j.length-(P.length-Re.filter(N=>N.id.startsWith("graduated:")||N.id.startsWith("experiment:")).length),...b.size>0?{withheld:b.size}:{}}}let H=await u.select({eventType:tt.eventType,count:ur`count(*)::int`}).from(tt).innerJoin(x,Wt(tt.suggestionId,x.id)).where(ps(Wt(tt.userId,t),m)).groupBy(tt.eventType),B={};for(let ee of H)B[ee.eventType]=ee.count;let te,_e;if(!l&&r&&P.length>0){let ee=[...new Set(P.map(M=>M.instructionId))],Re=await u.select({id:q.id,instructionId:q.instructionId,source:q.source}).from(q).where(ps(Wt(q.userId,t),Wt(q.projectPath,r),Wt(q.status,"running"),Yu(q.instructionId,ee)));Re.length>0&&(te=Object.fromEntries(Re.map(M=>[M.instructionId,{id:M.id,source:M.source}])));let N=await u.select({instructionId:Y.instructionId,contentHash:Y.contentHash,projectPath:Y.projectPath,decision:Y.decision,delta:Y.delta,ciLower:Y.ciLower,ciUpper:Y.ciUpper,nTreated:Y.nTreated,nControl:Y.nControl,segment:Y.segment,decidedAt:Y.decidedAt,liveContent:g.content,liveName:g.name}).from(Y).innerJoin(g,Wt(Y.instructionId,g.id)).where(ps(Wt(Y.userId,t),Yu(Y.instructionId,ee),ur`${Y.projectPath} <> ${r}`)),me={};for(let M of N){let ue=Ur(M.liveContent,M.liveName);ue===null||ue!==M.contentHash||(me[M.instructionId]??=[]).push({projectPath:M.projectPath,decision:M.decision,delta:M.delta,ciLower:M.ciLower,ciUpper:M.ciUpper,nTreated:M.nTreated,nControl:M.nControl,segment:M.segment,decidedAt:M.decidedAt})}Object.keys(me).length>0&&(_e=me)}return e.json({suggestions:P,stats:B,...$?{render:$}:{},...te?{experiments:te}:{},..._e?{crossProject:_e}:{}})});O();import{Hono as ON}from"hono";import{z as EI}from"zod";import{eq as ms,and as xI,desc as DN,sql as dn}from"drizzle-orm";var MN=EI.object({threshold:EI.number().min(0).max(1)}),fs=new ON;fs.get("/instruction-suggestions/pending-count",async e=>{let t=e.get("userId"),n=await u.select({projectPath:x.projectPath,count:dn`count(*)::int`}).from(x).where(xI(ms(x.userId,t),dn`${x.acceptedAt} IS NULL`,dn`(${x.dismissedAt} IS NULL OR ${x.dismissedAt} < now() - interval '30 days')`,Ac)).groupBy(x.projectPath).orderBy(DN(dn`count(*)`)),r=n.reduce((o,s)=>o+s.count,0);return e.json({total:r,byProject:n.slice(0,5)})});fs.get("/instruction-suggestions/stats",async e=>{let t=e.get("userId"),[n]=await u.select({total:dn`count(*)::int`,accepted:dn`count(*) filter (where ${x.acceptedAt} is not null)::int`,dismissed:dn`count(*) filter (where ${x.acceptedAt} is null and ${x.dismissedAt} is not null)::int`,declinedBySilence:dn`count(*) filter (where ${x.acceptedAt} is null and ${x.dismissedAt} is null and ${x.declinedAt} is not null)::int`,pending:dn`count(*) filter (where ${x.acceptedAt} is null and ${x.dismissedAt} is null and ${x.declinedAt} is null)::int`,stale:dn`count(*) filter (where ${x.isStale})::int`,promoted:dn`count(*) filter (where ${x.promotedToInstructionId} is not null)::int`}).from(x).where(ms(x.userId,t)),r=await u.select({eventType:tt.eventType,count:dn`count(*)::int`}).from(tt).where(ms(tt.userId,t)).groupBy(tt.eventType),o={surfaced:0,surfaced_with_content:0,accepted:0,dismissed:0,promoted:0,proxy_injected:0,[Mf]:0};for(let c of r)o[c.eventType]=c.count;let[s]=await u.select({distinctUsersWithSuggestions:dn`count(distinct ${x.userId})::int`}).from(x),i=o.surfaced+o.surfaced_with_content,a=o.accepted+o.dismissed;return e.json({suggestions:n,events:o,funnel:{surfaced:i,acted:a,adoptionRate:i>0?a/i:0},denominator:{distinctUsersWithSuggestions:s?.distinctUsersWithSuggestions??0,scope:"global"}})});fs.get("/instruction-suggestions/confidence",async e=>{let t=e.get("userId");return e.json({threshold:await Gu(t),default:wi,governs:"Minimum score at which an add-suggestion carries its instruction body into session context. Surfacing only \u2014 never a write."})});fs.put("/instruction-suggestions/confidence",async e=>{let t=e.get("userId"),n=MN.safeParse(await e.req.json().catch(()=>null));return n.success?(await u.update(T).set({suggestionConfidenceThreshold:n.data.threshold}).where(ms(T.id,t)),e.json({threshold:n.data.threshold})):e.json({error:"threshold must be a number between 0 and 1"},400)});fs.get("/instruction-suggestions/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:x.id,instructionId:x.instructionId,projectPath:x.projectPath,score:x.score,reason:x.reason,generatedAt:x.generatedAt,isStale:x.isStale,kind:x.kind,estimatedTokens:dn`(length(${g.content}) / 4)::int`,dismissedAt:x.dismissedAt,acceptedAt:x.acceptedAt,name:g.name,description:g.description,tags:g.tags,instructionScope:g.scope}).from(x).innerJoin(g,ms(x.instructionId,g.id)).where(xI(ms(x.id,n),ms(x.userId,t)));return r?e.json(r):e.json({error:"Suggestion not found"},404)});O();import{Hono as LN}from"hono";import{z as Yt}from"zod";import{eq as lr,and as TI,or as $N,desc as qN,sql as vi}from"drizzle-orm";var Ec=new LN,UN=Yt.object({projectPath:Yt.string().min(1),projectId:Yt.string().uuid().optional(),suggestions:Yt.array(Yt.object({instructionId:Yt.string().uuid(),score:Yt.number().min(0).max(1),reason:Yt.string(),kind:Yt.enum(su).optional()})).max(50)});async function HN(e){try{let[t]=await u.select({projectId:le.projectId}).from(le).where(lr(le.path,e)).orderBy(qN(le.lastSeen)).limit(1);return t?.projectId??null}catch{return null}}d(HN,"resolveProjectId");Ec.post("/instruction-suggestions/batch-upsert",async e=>{let t=e.get("userId"),n=UN.parse(await e.req.json());if(n.suggestions.length===0)return e.json({inserted:0});let r=n.projectId??await HN(n.projectPath),o=n.suggestions.map(s=>({userId:t,instructionId:s.instructionId,projectPath:n.projectPath,projectId:r,score:s.score,reason:s.reason,kind:s.kind??"add",generatedAt:new Date,isStale:!1}));return await u.insert(x).values(o).onConflictDoUpdate({target:[x.userId,x.projectPath,x.instructionId,x.kind],set:{score:vi`excluded.score`,reason:vi`excluded.reason`,generatedAt:vi`excluded.generated_at`,isStale:vi`false`,dismissedAt:vi`CASE WHEN ${x.dismissedAt} IS NOT NULL AND ${x.dismissedAt} >= now() - interval '30 days' THEN ${x.dismissedAt} ELSE NULL END`}}),e.json({inserted:o.length})});Ec.post("/instruction-suggestions/mark-stale",async e=>{let t=e.get("userId");return await u.update(x).set({isStale:!0}).where(lr(x.userId,t)),e.json({ok:!0})});var BN=Yt.object({eventType:Yt.enum(["surfaced","surfaced_with_content","accepted","dismissed","promoted","proxy_injected"]),tool:Yt.string().optional(),sessionId:Yt.string().uuid().optional(),projectPath:Yt.string().min(1),instructionId:Yt.string().uuid().optional(),actor:Yt.enum(["human","auto"]).default("human")});Ec.post("/instruction-suggestions/:id/events",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=BN.parse(await e.req.json()),[o]=await u.select().from(x).where(TI(lr(x.id,n),lr(x.userId,t)));if(!o)return e.json({error:"Suggestion not found"},404);let s=r.eventType==="accepted"||r.eventType==="promoted",i=o.instructionId;if(s&&r.instructionId){let[a]=await u.select({id:g.id}).from(g).where(TI(lr(g.id,r.instructionId),$N(lr(g.createdBy,t),lr(g.scope,"public")))).limit(1);if(!a)return e.json({error:"instructionId not found",code:"INVALID_INSTRUCTION"},400);i=a.id}if(await u.insert(tt).values({suggestionId:n,userId:t,eventType:r.eventType,tool:r.tool??null,sessionId:r.sessionId??null,projectPath:r.projectPath,actor:r.actor}),s)await u.update(x).set({acceptedAt:new Date,promotedToInstructionId:i}).where(lr(x.id,n));else if(r.eventType==="dismissed")await u.update(x).set({dismissedAt:new Date}).where(lr(x.id,n));else if(r.eventType==="surfaced"||r.eventType==="surfaced_with_content")try{await Ku(t,vi`${lr(x.id,n)}`)}catch{}return e.json({ok:!0})});O();import{Hono as zN}from"hono";import{z as xc}from"zod";import{eq as Ii,and as kI,desc as jI,sql as Qu}from"drizzle-orm";ls();O();ls();import{randomUUID as FN}from"node:crypto";import{and as Xu,eq as bn,sql as qf}from"drizzle-orm";var WN=.8;async function RI(e){let{userId:t,instructionId:n,projectPath:r,source:o}=e,s=e.treatedShare??.5,[i]=await u.select({id:g.id,name:g.name,content:g.content,archived:g.archived,scope:g.scope,createdBy:g.createdBy}).from(g).where(bn(g.id,n));if(!i||i.createdBy!==t&&i.scope!=="public")return{ok:!1,code:"not_found",reason:"instruction not found"};if(i.archived)return{ok:!1,code:"archived",reason:"instruction is archived"};let a=Ur(i.content,i.name);if(!a)return{ok:!1,code:"no_body",reason:"instruction body could not be extracted from its content"};let[c]=await u.select({id:Y.id}).from(Y).where(Xu(bn(Y.instructionId,n),bn(Y.contentHash,a),bn(Y.projectPath,r)));if(c)return{ok:!1,code:"already_decided",reason:"this exact content already has a verdict on this project \u2014 edit the instruction to re-enter testing"};if(o==="groom"){let[p]=await u.select({id:x.id}).from(x).where(Xu(bn(x.userId,t),bn(x.instructionId,n),bn(x.projectPath,r),qf`${x.acceptedAt} IS NULL`,qf`${x.dismissedAt} IS NULL`,qf`${x.score} >= ${WN}`));if(!p)return{ok:!1,code:"not_injectable",reason:"not delivered by injection on this project (accepted into a file, or no renderable proposal) \u2014 withholding would measure nothing"}}let[l]=await u.select({id:q.id}).from(q).where(Xu(bn(q.instructionId,n),bn(q.projectPath,r),bn(q.status,"running")));if(l)return{ok:!0,experimentId:l.id,existing:!0};try{let[p]=await u.insert(q).values({userId:t,instructionId:n,projectPath:r,status:"running",treatedShare:String(s),salt:FN(),contentHash:a,source:o}).returning({id:q.id});return{ok:!0,experimentId:p.id,existing:!1}}catch(p){let[m]=await u.select({id:q.id}).from(q).where(Xu(bn(q.instructionId,n),bn(q.projectPath,r),bn(q.status,"running")));if(m)return{ok:!0,experimentId:m.id,existing:!0};throw p}}d(RI,"nominateExperiment");var bi=new zN;bi.get("/instruction-experiments",async e=>{let t=e.get("userId"),n=e.req.query("projectPath"),r=Math.min(Math.max(Number(e.req.query("limit"))||50,1),200),o=kI(Ii(q.userId,t),n?Ii(q.projectPath,n):Qu`true`),s=await u.select({id:q.id,instructionId:q.instructionId,instructionName:g.name,projectPath:q.projectPath,status:q.status,source:q.source,instructionSource:Qu`${g.frontmatter}->>'source'`,stoppedReason:q.stoppedReason,createdAt:q.createdAt}).from(q).innerJoin(g,Ii(q.instructionId,g.id)).where(o).orderBy(jI(q.createdAt)).limit(r),[{total:i}]=await u.select({total:Qu`count(*)::int`}).from(q).where(o),a=await Promise.all(s.map(async l=>{let p=await bc(l.id,t),m=l.status,y=l.stoppedReason;if(p&&l.status==="running")try{let v=await gi({experimentId:l.id,userId:t,verdict:p,source:l.source,status:l.status});v&&(m="stopped",y=v)}catch{}return{...l,status:m,stoppedReason:y,verdict:p}})),c=await zu(a.map(l=>l.id));return e.json({experiments:a.map(l=>({...l,graduation:c.get(l.id)??null})),total:i})});var VN=xc.object({instructionId:xc.string().uuid(),projectPath:xc.string().min(1),source:xc.enum(["manual","groom","trial","borrow"]).default("manual"),treatedShare:xc.number().gt(0).lt(1).optional()});bi.post("/instruction-experiments",async e=>{let t=e.get("userId"),n=VN.safeParse(await e.req.json().catch(()=>({})));if(!n.success)return e.json({error:n.error.flatten()},400);let r=await RI({userId:t,...n.data});if(!r.ok){let o={not_found:404,archived:400,no_body:400,already_decided:409,not_injectable:409};return e.json({error:r.reason,code:r.code},o[r.code])}return e.json({experimentId:r.experimentId,existing:r.existing},r.existing?200:201)});bi.get("/instruction-experiments/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await bc(n,t);if(!r)return e.json({error:"not found"},404);try{let[s]=await u.select({source:q.source,status:q.status}).from(q).where(Ii(q.id,n));s&&await gi({experimentId:n,userId:t,verdict:r,source:s.source,status:s.status})}catch{}let o=await zu([n]);return e.json({verdict:r,graduation:o.get(n)??null})});bi.get("/instruction-verdicts",async e=>{let t=e.get("userId"),n=e.req.query("instructionId"),r=await u.select({id:Y.id,instructionId:Y.instructionId,contentHash:Y.contentHash,projectPath:Y.projectPath,decision:Y.decision,delta:Y.delta,ciLower:Y.ciLower,ciUpper:Y.ciUpper,nTreated:Y.nTreated,nControl:Y.nControl,decidedAt:Y.decidedAt}).from(Y).where(kI(Ii(Y.userId,t),n?Ii(Y.instructionId,n):Qu`true`)).orderBy(jI(Y.decidedAt)).limit(50);return e.json({verdicts:r,total:r.length})});var ho=new JN;ho.route("/",yi);ho.route("/",$f);ho.route("/",fs);ho.route("/",Ec);ho.route("/",bi);import{Hono as iO}from"hono";import{Hono as MC}from"hono";O();import{Hono as nP}from"hono";import{z as jn}from"zod";import{eq as Lt,and as xi,desc as $I,sql as pr,or as qI,gte as rP,ne as oP}from"drizzle-orm";function NI(e){if(!e||typeof e!="string")return null;let t=e.trim();if(!t)return null;if(!t.includes("://")&&!/^([\w.-]+@)?[\w.-]+:[^/]/.test(t)&&/^[\w.-]+(\.[\w.-]+)+\//.test(t)){let a=t.replace(/\.git$/i,"").replace(/\/+$/,""),c=a.indexOf("/"),l=a.slice(0,c).toLowerCase(),p=a.slice(c+1);return p?`${l}/${p}`:null}let n=t,r=/^([\w.-]+@)?([\w.-]+):([^/].*)$/.exec(t);if(r&&!t.includes("://")){let[,,a,c]=r;n=`ssh://${a}/${c}`}let o;try{o=new URL(n)}catch{return null}let s=o.hostname.toLowerCase();if(!s)return null;let i=o.pathname.replace(/^\/+|\/+$/g,"");return!i||(i=i.replace(/\.git$/i,""),!i)?null:`${s}/${i}`}d(NI,"canonicalizeRemote");var GN=new Set(["","unknown","<synthetic>"]);function gs(e){if(typeof e!="string")return null;let t=e.trim();return GN.has(t)?null:t}d(gs,"resolveModelId");var KN=["claudeCodeVersion","codexCliVersion"];function Si(e){if(typeof e!="object"||e===null)return null;let t=e;for(let n of KN){let r=gs(t[n]);if(r!==null)return r}return null}d(Si,"resolveHarnessVersion");O();import{eq as Uf,and as QN,sql as LI}from"drizzle-orm";O();import{randomUUID as Ai}from"node:crypto";import{eq as Mt,and as Tc,gt as YN,sql as PI}from"drizzle-orm";var XN=6e4;async function Ei(e){try{let t=new Date(Date.now()-XN),[n]=await u.select({exists:PI`1`}).from(fe).where(Tc(Mt(fe.userId,e),Mt(fe.workerType,"cli-worker"),YN(fe.lastHeartbeat,t))).limit(1);return n!==void 0}catch(t){return console.warn("[enqueueJob] hasLiveWorker check failed; skipping warning:",t instanceof Error?t.message:t),!0}}d(Ei,"hasLiveWorker");async function Rt(e){let t=!await Ei(e.userId),n=Ai(),r={...e.payload,mirrorId:n};switch(e.taskName){case"process_eval":case"process_conversation":{await u.insert(ke).values({...e.mirror,id:n,status:"pending",taskKind:e.taskName,payload:r});break}case"process_insights":{await u.insert(W).values({...e.mirror,id:n,status:"pending",taskKind:e.taskName,payload:r});break}case"process_launch":{await u.insert(ce).values({...e.mirror,id:n,status:"pending",taskKind:e.taskName,payload:r,...e.runId?{runId:e.runId}:{}});break}case"process_send_message":{await u.insert(Wd).values({...e.mirror,id:n,status:"pending",taskKind:e.taskName,payload:r});break}}return{id:n,noLiveWorker:t}}d(Rt,"enqueueJob");async function Zu(e){let t=`goal-${e.sessionId}-${e.milestone}`,[n]=await u.select({id:je.id}).from(je).where(Tc(Mt(je.userId,e.userId),Mt(je.taskKind,"process_session_goal"),Mt(je.dedupeKey,t),Mt(je.status,"pending"))).limit(1);if(n)return;let r=Ai();await u.insert(je).values({id:r,userId:e.userId,taskKind:"process_session_goal",payload:{sessionId:e.sessionId,milestone:e.milestone,mirrorId:r},dedupeKey:t})}d(Zu,"enqueueSessionGoalJob");async function CI(e){let t=`distill-${e.sessionId}`,[n]=await u.select({id:je.id}).from(je).where(Tc(Mt(je.userId,e.userId),Mt(je.taskKind,"distill_memories"),Mt(je.dedupeKey,t),Mt(je.status,"pending"))).limit(1);if(n)return;let r=Ai();await u.insert(je).values({id:r,userId:e.userId,taskKind:"distill_memories",payload:{sessionId:e.sessionId,mirrorId:r},dedupeKey:t})}d(CI,"enqueueDistillMemoriesJob");async function OI(e){let t=!await Ei(e.userId),n=`run-cleanup:${e.runId}`,[r]=await u.select({id:je.id}).from(je).where(Tc(Mt(je.userId,e.userId),Mt(je.taskKind,"process_run_cleanup"),Mt(je.dedupeKey,n),Mt(je.status,"pending"))).limit(1);if(r)return{jobId:r.id,noLiveWorker:t};let o=Ai();return await u.insert(je).values({id:o,userId:e.userId,taskKind:"process_run_cleanup",payload:{runId:e.runId,mirrorId:o},dedupeKey:n}),{jobId:o,noLiveWorker:t}}d(OI,"enqueueRunCleanupJob");async function DI(e){let t=`judge-review:${e.evalTargetId}`,n=Ai();await u.execute(PI`
|
|
313
|
+
SELECT id, user_id, ${Uf}, project_path FROM stamped
|
|
314
|
+
`)}d(Zu,"sweepDeclinedBySilence");var Bf=new DN,RI=2e3,ON=4,MN={"session-start":{add:3,remove:2,trim:1}},LN=["add","remove","trim"];function Hf(e){return e.length<=RI?e:e.slice(0,RI)+"... [truncated]"}d(Hf,"truncateContent");Bf.get("/instruction-suggestions",async e=>{let t=e.get("userId"),n=e.req.query("projectId"),r=e.req.query("projectPath"),o=Number(e.req.query("limit")??"5"),s=Math.min(Math.max(o,1),10),i=e.req.query("includeContent")==="true",a=e.req.query("groupByKind")==="true",c=e.req.query("renderFor"),l=c?MN[c]:void 0;if(c&&!l)return e.json({error:`unknown renderFor: ${c}`},400);let p=a||l!==void 0;if(!n&&!r)return e.json({error:"projectId or projectPath is required"},400);let m=n?Wt(x.projectId,n):Wt(x.projectPath,r);try{await Zu(t,ur`${m}`)}catch{}let y=await u.select({id:x.id,instructionId:x.instructionId,score:x.score,reason:x.reason,generatedAt:x.generatedAt,isStale:x.isStale,kind:x.kind,name:g.name,description:g.description,tags:g.tags,instructionScope:g.scope,estimatedTokens:ur`(length(${g.content}) / 4)::int`,_rawContent:g.content}).from(x).innerJoin(g,Wt(x.instructionId,g.id)).where(ps(Wt(x.userId,t),m,Wt(g.archived,!1),ur`${x.acceptedAt} IS NULL`,ur`(${x.dismissedAt} IS NULL OR ${x.dismissedAt} < now() - interval '30 days')`,Ec)).orderBy(xI(x.isStale),TI(x.score)).limit(s),v=[];if(p){let te=new Set(y.map(N=>N.id));v=(await u.select({id:x.id,instructionId:x.instructionId,score:x.score,reason:x.reason,generatedAt:x.generatedAt,isStale:x.isStale,kind:x.kind,name:g.name,description:g.description,tags:g.tags,instructionScope:g.scope,estimatedTokens:ur`(length(${g.content}) / 4)::int`,_rawContent:g.content}).from(x).innerJoin(g,Wt(x.instructionId,g.id)).where(ps(Wt(x.userId,t),m,ur`${x.kind} <> 'add'`,Wt(g.archived,!1),ur`${x.acceptedAt} IS NULL`,ur`(${x.dismissedAt} IS NULL OR ${x.dismissedAt} < now() - interval '30 days')`,Ec)).orderBy(xI(x.isStale),TI(x.score)).limit(ON)).filter(N=>!te.has(N.id))}let h=i?await Qu(t):wi,f=[...y,...v].map(te=>{let{_rawContent:Re,...N}=te,me=i&&te.kind==="add"&&te.score>=h&&typeof Re=="string"?Hf(Re):null;return{...N,content:me}}),w=l?await AI({userId:t,projectPath:r??"",externalSessionId:e.req.query("sessionId")||void 0}):[],b=EI(w),I=l?await Mf(t,r??""):[],S=new Set(I.filter(te=>te.decision==="never").map(te=>te.instructionId)),A=I.filter(te=>te.decision==="always"),E=new Set(I.map(te=>te.instructionId)),R=w.filter(te=>te.arm==="treated"),O=new Set(w.map(te=>te.instructionId)),j=b.size===0&&E.size===0&&O.size===0?f:f.filter(te=>!b.has(te.instructionId)&&!E.has(te.instructionId)&&!O.has(te.instructionId)),P=j,$;if(l){let te=new Map;for(let N of j){let me=N.kind??"add",M=l[me];if(M===void 0||M<=0)continue;let ue=te.get(me)??[];ue.length>=M||(ue.push(N),te.set(me,ue))}let Re=te.get("add")??[];if(R.length>0){let N=new Map(R.map(M=>[M.instructionId,M.experimentId])),me=await u.select({id:g.id,name:g.name,description:g.description,tags:g.tags,instructionScope:g.scope,content:g.content}).from(g).where(ps(el(g.id,R.map(M=>M.instructionId)),Wt(g.archived,!1)));for(let M of me.reverse())Re.unshift({id:`experiment:${N.get(M.id)}`,instructionId:M.id,score:1,reason:"under measurement on this project",generatedAt:new Date,isStale:!1,kind:"add",name:M.name,description:M.description,tags:M.tags,instructionScope:M.instructionScope,estimatedTokens:Math.ceil((M.content?.length??0)/4),content:i?Hf(M.content??""):null});te.set("add",Re)}if(A.length>0){let N=await u.select({id:g.id,name:g.name,description:g.description,tags:g.tags,instructionScope:g.scope,content:g.content}).from(g).where(ps(el(g.id,A.map(me=>me.instructionId)),Wt(g.archived,!1)));for(let me of N.reverse())Re.unshift({id:`graduated:${me.id}`,instructionId:me.id,score:1,reason:"graduated: measured to help on this project",generatedAt:new Date,isStale:!1,kind:"add",name:me.name,description:me.description,tags:me.tags,instructionScope:me.instructionScope,estimatedTokens:Math.ceil((me.content?.length??0)/4),content:i?Hf(me.content??""):null});te.set("add",Re)}P=LN.flatMap(N=>te.get(N)??[]),$={addCount:Re.length,costCount:(te.get("remove")??[]).length+(te.get("trim")??[]).length,highConfidenceCount:Re.filter(N=>N.content!==null).length,omitted:j.length-(P.length-Re.filter(N=>N.id.startsWith("graduated:")||N.id.startsWith("experiment:")).length),...b.size>0?{withheld:b.size}:{}}}let H=await u.select({eventType:tt.eventType,count:ur`count(*)::int`}).from(tt).innerJoin(x,Wt(tt.suggestionId,x.id)).where(ps(Wt(tt.userId,t),m)).groupBy(tt.eventType),B={};for(let te of H)B[te.eventType]=te.count;let ee,_e;if(!l&&r&&P.length>0){let te=[...new Set(P.map(M=>M.instructionId))],Re=await u.select({id:q.id,instructionId:q.instructionId,source:q.source}).from(q).where(ps(Wt(q.userId,t),Wt(q.projectPath,r),Wt(q.status,"running"),el(q.instructionId,te)));Re.length>0&&(ee=Object.fromEntries(Re.map(M=>[M.instructionId,{id:M.id,source:M.source}])));let N=await u.select({instructionId:Y.instructionId,contentHash:Y.contentHash,projectPath:Y.projectPath,decision:Y.decision,delta:Y.delta,ciLower:Y.ciLower,ciUpper:Y.ciUpper,nTreated:Y.nTreated,nControl:Y.nControl,segment:Y.segment,decidedAt:Y.decidedAt,liveContent:g.content,liveName:g.name}).from(Y).innerJoin(g,Wt(Y.instructionId,g.id)).where(ps(Wt(Y.userId,t),el(Y.instructionId,te),ur`${Y.projectPath} <> ${r}`)),me={};for(let M of N){let ue=Ur(M.liveContent,M.liveName);ue===null||ue!==M.contentHash||(me[M.instructionId]??=[]).push({projectPath:M.projectPath,decision:M.decision,delta:M.delta,ciLower:M.ciLower,ciUpper:M.ciUpper,nTreated:M.nTreated,nControl:M.nControl,segment:M.segment,decidedAt:M.decidedAt})}Object.keys(me).length>0&&(_e=me)}return e.json({suggestions:P,stats:B,...$?{render:$}:{},...ee?{experiments:ee}:{},..._e?{crossProject:_e}:{}})});D();import{Hono as $N}from"hono";import{z as kI}from"zod";import{eq as ms,and as jI,desc as qN,sql as dn}from"drizzle-orm";var UN=kI.object({threshold:kI.number().min(0).max(1)}),fs=new $N;fs.get("/instruction-suggestions/pending-count",async e=>{let t=e.get("userId"),n=await u.select({projectPath:x.projectPath,count:dn`count(*)::int`}).from(x).where(jI(ms(x.userId,t),dn`${x.acceptedAt} IS NULL`,dn`(${x.dismissedAt} IS NULL OR ${x.dismissedAt} < now() - interval '30 days')`,Ec)).groupBy(x.projectPath).orderBy(qN(dn`count(*)`)),r=n.reduce((o,s)=>o+s.count,0);return e.json({total:r,byProject:n.slice(0,5)})});fs.get("/instruction-suggestions/stats",async e=>{let t=e.get("userId"),[n]=await u.select({total:dn`count(*)::int`,accepted:dn`count(*) filter (where ${x.acceptedAt} is not null)::int`,dismissed:dn`count(*) filter (where ${x.acceptedAt} is null and ${x.dismissedAt} is not null)::int`,declinedBySilence:dn`count(*) filter (where ${x.acceptedAt} is null and ${x.dismissedAt} is null and ${x.declinedAt} is not null)::int`,pending:dn`count(*) filter (where ${x.acceptedAt} is null and ${x.dismissedAt} is null and ${x.declinedAt} is null)::int`,stale:dn`count(*) filter (where ${x.isStale})::int`,promoted:dn`count(*) filter (where ${x.promotedToInstructionId} is not null)::int`}).from(x).where(ms(x.userId,t)),r=await u.select({eventType:tt.eventType,count:dn`count(*)::int`}).from(tt).where(ms(tt.userId,t)).groupBy(tt.eventType),o={surfaced:0,surfaced_with_content:0,accepted:0,dismissed:0,promoted:0,proxy_injected:0,[Uf]:0};for(let c of r)o[c.eventType]=c.count;let[s]=await u.select({distinctUsersWithSuggestions:dn`count(distinct ${x.userId})::int`}).from(x),i=o.surfaced+o.surfaced_with_content,a=o.accepted+o.dismissed;return e.json({suggestions:n,events:o,funnel:{surfaced:i,acted:a,adoptionRate:i>0?a/i:0},denominator:{distinctUsersWithSuggestions:s?.distinctUsersWithSuggestions??0,scope:"global"}})});fs.get("/instruction-suggestions/confidence",async e=>{let t=e.get("userId");return e.json({threshold:await Qu(t),default:wi,governs:"Minimum score at which an add-suggestion carries its instruction body into session context. Surfacing only \u2014 never a write."})});fs.put("/instruction-suggestions/confidence",async e=>{let t=e.get("userId"),n=UN.safeParse(await e.req.json().catch(()=>null));return n.success?(await u.update(T).set({suggestionConfidenceThreshold:n.data.threshold}).where(ms(T.id,t)),e.json({threshold:n.data.threshold})):e.json({error:"threshold must be a number between 0 and 1"},400)});fs.get("/instruction-suggestions/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:x.id,instructionId:x.instructionId,projectPath:x.projectPath,score:x.score,reason:x.reason,generatedAt:x.generatedAt,isStale:x.isStale,kind:x.kind,estimatedTokens:dn`(length(${g.content}) / 4)::int`,dismissedAt:x.dismissedAt,acceptedAt:x.acceptedAt,name:g.name,description:g.description,tags:g.tags,instructionScope:g.scope}).from(x).innerJoin(g,ms(x.instructionId,g.id)).where(jI(ms(x.id,n),ms(x.userId,t)));return r?e.json(r):e.json({error:"Suggestion not found"},404)});D();import{Hono as HN}from"hono";import{z as Yt}from"zod";import{eq as lr,and as NI,or as BN,desc as FN,sql as vi}from"drizzle-orm";var xc=new HN,WN=Yt.object({projectPath:Yt.string().min(1),projectId:Yt.string().uuid().optional(),suggestions:Yt.array(Yt.object({instructionId:Yt.string().uuid(),score:Yt.number().min(0).max(1),reason:Yt.string(),kind:Yt.enum(cu).optional()})).max(50)});async function zN(e){try{let[t]=await u.select({projectId:le.projectId}).from(le).where(lr(le.path,e)).orderBy(FN(le.lastSeen)).limit(1);return t?.projectId??null}catch{return null}}d(zN,"resolveProjectId");xc.post("/instruction-suggestions/batch-upsert",async e=>{let t=e.get("userId"),n=WN.parse(await e.req.json());if(n.suggestions.length===0)return e.json({inserted:0});let r=n.projectId??await zN(n.projectPath),o=n.suggestions.map(s=>({userId:t,instructionId:s.instructionId,projectPath:n.projectPath,projectId:r,score:s.score,reason:s.reason,kind:s.kind??"add",generatedAt:new Date,isStale:!1}));return await u.insert(x).values(o).onConflictDoUpdate({target:[x.userId,x.projectPath,x.instructionId,x.kind],set:{score:vi`excluded.score`,reason:vi`excluded.reason`,generatedAt:vi`excluded.generated_at`,isStale:vi`false`,dismissedAt:vi`CASE WHEN ${x.dismissedAt} IS NOT NULL AND ${x.dismissedAt} >= now() - interval '30 days' THEN ${x.dismissedAt} ELSE NULL END`}}),e.json({inserted:o.length})});xc.post("/instruction-suggestions/mark-stale",async e=>{let t=e.get("userId");return await u.update(x).set({isStale:!0}).where(lr(x.userId,t)),e.json({ok:!0})});var VN=Yt.object({eventType:Yt.enum(["surfaced","surfaced_with_content","accepted","dismissed","promoted","proxy_injected","redundant"]),tool:Yt.string().optional(),sessionId:Yt.string().uuid().optional(),projectPath:Yt.string().min(1),instructionId:Yt.string().uuid().optional(),actor:Yt.enum(["human","auto"]).default("human")});xc.post("/instruction-suggestions/:id/events",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=VN.parse(await e.req.json()),[o]=await u.select().from(x).where(NI(lr(x.id,n),lr(x.userId,t)));if(!o)return e.json({error:"Suggestion not found"},404);let s=r.eventType==="accepted"||r.eventType==="promoted",i=o.instructionId;if(s&&r.instructionId){let[a]=await u.select({id:g.id}).from(g).where(NI(lr(g.id,r.instructionId),BN(lr(g.createdBy,t),lr(g.scope,"public")))).limit(1);if(!a)return e.json({error:"instructionId not found",code:"INVALID_INSTRUCTION"},400);i=a.id}if(await u.insert(tt).values({suggestionId:n,userId:t,eventType:r.eventType,tool:r.tool??null,sessionId:r.sessionId??null,projectPath:r.projectPath,actor:r.actor}),s)await u.update(x).set({acceptedAt:new Date,promotedToInstructionId:i}).where(lr(x.id,n));else if(r.eventType==="dismissed")await u.update(x).set({dismissedAt:new Date}).where(lr(x.id,n));else if(r.eventType==="surfaced"||r.eventType==="surfaced_with_content")try{await Zu(t,vi`${lr(x.id,n)}`)}catch{}return e.json({ok:!0})});D();import{Hono as KN}from"hono";import{z as Tc}from"zod";import{eq as Ii,and as CI,desc as DI,sql as nl}from"drizzle-orm";ls();D();ls();import{randomUUID as JN}from"node:crypto";import{and as tl,eq as bn,sql as Ff}from"drizzle-orm";var GN=.8;async function PI(e){let{userId:t,instructionId:n,projectPath:r,source:o}=e,s=e.treatedShare??.5,[i]=await u.select({id:g.id,name:g.name,content:g.content,archived:g.archived,scope:g.scope,createdBy:g.createdBy}).from(g).where(bn(g.id,n));if(!i||i.createdBy!==t&&i.scope!=="public")return{ok:!1,code:"not_found",reason:"instruction not found"};if(i.archived)return{ok:!1,code:"archived",reason:"instruction is archived"};let a=Ur(i.content,i.name);if(!a)return{ok:!1,code:"no_body",reason:"instruction body could not be extracted from its content"};let[c]=await u.select({id:Y.id}).from(Y).where(tl(bn(Y.instructionId,n),bn(Y.contentHash,a),bn(Y.projectPath,r)));if(c)return{ok:!1,code:"already_decided",reason:"this exact content already has a verdict on this project \u2014 edit the instruction to re-enter testing"};if(o==="groom"){let[p]=await u.select({id:x.id}).from(x).where(tl(bn(x.userId,t),bn(x.instructionId,n),bn(x.projectPath,r),Ff`${x.acceptedAt} IS NULL`,Ff`${x.dismissedAt} IS NULL`,Ff`${x.score} >= ${GN}`));if(!p)return{ok:!1,code:"not_injectable",reason:"not delivered by injection on this project (accepted into a file, or no renderable proposal) \u2014 withholding would measure nothing"}}let[l]=await u.select({id:q.id}).from(q).where(tl(bn(q.instructionId,n),bn(q.projectPath,r),bn(q.status,"running")));if(l)return{ok:!0,experimentId:l.id,existing:!0};try{let[p]=await u.insert(q).values({userId:t,instructionId:n,projectPath:r,status:"running",treatedShare:String(s),salt:JN(),contentHash:a,source:o}).returning({id:q.id});return{ok:!0,experimentId:p.id,existing:!1}}catch(p){let[m]=await u.select({id:q.id}).from(q).where(tl(bn(q.instructionId,n),bn(q.projectPath,r),bn(q.status,"running")));if(m)return{ok:!0,experimentId:m.id,existing:!0};throw p}}d(PI,"nominateExperiment");var bi=new KN;bi.get("/instruction-experiments",async e=>{let t=e.get("userId"),n=e.req.query("projectPath"),r=Math.min(Math.max(Number(e.req.query("limit"))||50,1),200),o=CI(Ii(q.userId,t),n?Ii(q.projectPath,n):nl`true`),s=await u.select({id:q.id,instructionId:q.instructionId,instructionName:g.name,projectPath:q.projectPath,status:q.status,source:q.source,instructionSource:nl`${g.frontmatter}->>'source'`,stoppedReason:q.stoppedReason,createdAt:q.createdAt}).from(q).innerJoin(g,Ii(q.instructionId,g.id)).where(o).orderBy(DI(q.createdAt)).limit(r),[{total:i}]=await u.select({total:nl`count(*)::int`}).from(q).where(o),a=await Promise.all(s.map(async l=>{let p=await Sc(l.id,t),m=l.status,y=l.stoppedReason;if(p&&l.status==="running")try{let v=await gi({experimentId:l.id,userId:t,verdict:p,source:l.source,status:l.status});v&&(m="stopped",y=v)}catch{}return{...l,status:m,stoppedReason:y,verdict:p}})),c=await Ku(a.map(l=>l.id));return e.json({experiments:a.map(l=>({...l,graduation:c.get(l.id)??null})),total:i})});var YN=Tc.object({instructionId:Tc.string().uuid(),projectPath:Tc.string().min(1),source:Tc.enum(["manual","groom","trial","borrow"]).default("manual"),treatedShare:Tc.number().gt(0).lt(1).optional()});bi.post("/instruction-experiments",async e=>{let t=e.get("userId"),n=YN.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)});bi.get("/instruction-experiments/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await Sc(n,t);if(!r)return e.json({error:"not found"},404);try{let[s]=await u.select({source:q.source,status:q.status}).from(q).where(Ii(q.id,n));s&&await gi({experimentId:n,userId:t,verdict:r,source:s.source,status:s.status})}catch{}let o=await Ku([n]);return e.json({verdict:r,graduation:o.get(n)??null})});bi.get("/instruction-verdicts",async e=>{let t=e.get("userId"),n=e.req.query("instructionId"),r=await u.select({id:Y.id,instructionId:Y.instructionId,contentHash:Y.contentHash,projectPath:Y.projectPath,decision:Y.decision,delta:Y.delta,ciLower:Y.ciLower,ciUpper:Y.ciUpper,nTreated:Y.nTreated,nControl:Y.nControl,decidedAt:Y.decidedAt}).from(Y).where(CI(Ii(Y.userId,t),n?Ii(Y.instructionId,n):nl`true`)).orderBy(DI(Y.decidedAt)).limit(50);return e.json({verdicts:r,total:r.length})});var ho=new XN;ho.route("/",yi);ho.route("/",Bf);ho.route("/",fs);ho.route("/",xc);ho.route("/",bi);import{Hono as uD}from"hono";import{Hono as UC}from"hono";D();import{Hono as iP}from"hono";import{z as Nn}from"zod";import{eq as Lt,and as xi,desc as BI,sql as pr,or as FI,gte as aP,ne as cP}from"drizzle-orm";function OI(e){if(!e||typeof e!="string")return null;let t=e.trim();if(!t)return null;if(!t.includes("://")&&!/^([\w.-]+@)?[\w.-]+:[^/]/.test(t)&&/^[\w.-]+(\.[\w.-]+)+\//.test(t)){let a=t.replace(/\.git$/i,"").replace(/\/+$/,""),c=a.indexOf("/"),l=a.slice(0,c).toLowerCase(),p=a.slice(c+1);return p?`${l}/${p}`:null}let n=t,r=/^([\w.-]+@)?([\w.-]+):([^/].*)$/.exec(t);if(r&&!t.includes("://")){let[,,a,c]=r;n=`ssh://${a}/${c}`}let o;try{o=new URL(n)}catch{return null}let s=o.hostname.toLowerCase();if(!s)return null;let i=o.pathname.replace(/^\/+|\/+$/g,"");return!i||(i=i.replace(/\.git$/i,""),!i)?null:`${s}/${i}`}d(OI,"canonicalizeRemote");var QN=new Set(["","unknown","<synthetic>"]);function gs(e){if(typeof e!="string")return null;let t=e.trim();return QN.has(t)?null:t}d(gs,"resolveModelId");var ZN=["claudeCodeVersion","codexCliVersion"];function Si(e){if(typeof e!="object"||e===null)return null;let t=e;for(let n of ZN){let r=gs(t[n]);if(r!==null)return r}return null}d(Si,"resolveHarnessVersion");D();import{eq as Wf,and as nP,sql as HI}from"drizzle-orm";D();import{randomUUID as Ai}from"node:crypto";import{eq as Mt,and as Rc,gt as eP,sql as MI}from"drizzle-orm";var tP=6e4;async function Ei(e){try{let t=new Date(Date.now()-tP),[n]=await u.select({exists:MI`1`}).from(fe).where(Rc(Mt(fe.userId,e),Mt(fe.workerType,"cli-worker"),eP(fe.lastHeartbeat,t))).limit(1);return n!==void 0}catch(t){return console.warn("[enqueueJob] hasLiveWorker check failed; skipping warning:",t instanceof Error?t.message:t),!0}}d(Ei,"hasLiveWorker");async function Rt(e){let t=!await Ei(e.userId),n=Ai(),r={...e.payload,mirrorId:n};switch(e.taskName){case"process_eval":case"process_conversation":{await u.insert(ke).values({...e.mirror,id:n,status:"pending",taskKind:e.taskName,payload:r});break}case"process_insights":{await u.insert(W).values({...e.mirror,id:n,status:"pending",taskKind:e.taskName,payload:r});break}case"process_launch":{await u.insert(ce).values({...e.mirror,id:n,status:"pending",taskKind:e.taskName,payload:r,...e.runId?{runId:e.runId}:{}});break}case"process_send_message":{await u.insert(Jd).values({...e.mirror,id:n,status:"pending",taskKind:e.taskName,payload:r});break}}return{id:n,noLiveWorker:t}}d(Rt,"enqueueJob");async function rl(e){let t=`goal-${e.sessionId}-${e.milestone}`,[n]=await u.select({id:je.id}).from(je).where(Rc(Mt(je.userId,e.userId),Mt(je.taskKind,"process_session_goal"),Mt(je.dedupeKey,t),Mt(je.status,"pending"))).limit(1);if(n)return;let r=Ai();await u.insert(je).values({id:r,userId:e.userId,taskKind:"process_session_goal",payload:{sessionId:e.sessionId,milestone:e.milestone,mirrorId:r},dedupeKey:t})}d(rl,"enqueueSessionGoalJob");async function LI(e){let t=`distill-${e.sessionId}`,[n]=await u.select({id:je.id}).from(je).where(Rc(Mt(je.userId,e.userId),Mt(je.taskKind,"distill_memories"),Mt(je.dedupeKey,t),Mt(je.status,"pending"))).limit(1);if(n)return;let r=Ai();await u.insert(je).values({id:r,userId:e.userId,taskKind:"distill_memories",payload:{sessionId:e.sessionId,mirrorId:r},dedupeKey:t})}d(LI,"enqueueDistillMemoriesJob");async function $I(e){let t=!await Ei(e.userId),n=`run-cleanup:${e.runId}`,[r]=await u.select({id:je.id}).from(je).where(Rc(Mt(je.userId,e.userId),Mt(je.taskKind,"process_run_cleanup"),Mt(je.dedupeKey,n),Mt(je.status,"pending"))).limit(1);if(r)return{jobId:r.id,noLiveWorker:t};let o=Ai();return await u.insert(je).values({id:o,userId:e.userId,taskKind:"process_run_cleanup",payload:{runId:e.runId,mirrorId:o},dedupeKey:n}),{jobId:o,noLiveWorker:t}}d($I,"enqueueRunCleanupJob");async function qI(e){let t=`judge-review:${e.evalTargetId}`,n=Ai();await u.execute(MI`
|
|
310
315
|
INSERT INTO agent_jobs (id, user_id, task_kind, payload, dedupe_key)
|
|
311
316
|
SELECT ${n}, ${e.userId}, 'process_judge_review',
|
|
312
317
|
${JSON.stringify({evalTargetId:e.evalTargetId,mirrorId:n})}::jsonb,
|
|
@@ -318,7 +323,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
318
323
|
AND dedupe_key = ${t}
|
|
319
324
|
AND status = 'pending'
|
|
320
325
|
)
|
|
321
|
-
`)}d(
|
|
326
|
+
`)}d(qI,"enqueueJudgeReviewJob");async function UI(e){let t=!await Ei(e.userId),n=`memory-ab:${e.experimentId}`,[r]=await u.select({id:je.id}).from(je).where(Rc(Mt(je.userId,e.userId),Mt(je.taskKind,"memory_ab"),Mt(je.dedupeKey,n),Mt(je.status,"pending"))).limit(1);if(r)return{jobId:r.id,noLiveWorker:t};let o=Ai();return await u.insert(je).values({id:o,userId:e.userId,taskKind:"memory_ab",payload:{experimentId:e.experimentId,mirrorId:o},dedupeKey:n}),{jobId:o,noLiveWorker:t}}d(UI,"enqueueMemoryAbJob");async function _o(e,t){let n=d((r,o)=>{let s={"org_attribution.source":r};if(o)for(let[i,a]of Object.entries(o))s[`org_attribution.${i}`]=a;qp(s)},"tag");if(t)try{let[r]=await u.select({orgId:Q.orgId}).from(Q).where(nP(Wf(Q.userId,e),Wf(Q.orgId,t))).limit(1);if(r)return n("claim"),t;console.warn(`[sessions] User ${e} attempted to attribute session to org ${t} but is not a member; falling back to profile.active_org_id.`),n("profile_fallback",{claim_rejected:"not_member"})}catch(r){console.warn(`[sessions] Membership lookup failed for user=${e} org=${t}; falling back to profile.active_org_id:`,r instanceof Error?r.message:r),n("profile_fallback",{claim_rejected:"lookup_error"})}else n("profile_fallback",{claim_rejected:"no_claim"});try{let[r]=await u.select({activeOrgId:T.activeOrgId}).from(T).where(Wf(T.id,e)).limit(1);return r?.activeOrgId?r.activeOrgId:(n("unresolved"),null)}catch(r){return console.warn(`[sessions] active_org_id lookup failed for user=${e}; orgId silenced to null:`,r instanceof Error?r.message:r),n("unresolved",{profile_lookup_error:!0}),null}}d(_o,"resolveCallerOrgId");async function rP(e,t,n){if(n)try{await u.execute(HI`
|
|
322
327
|
insert into treatment_exposures
|
|
323
328
|
(session_id, user_id, treatment_type, treatment_id, treatment_version, method, exposed_at)
|
|
324
329
|
select ${e}::uuid, ${t}::uuid, 'suggestion', s.instruction_id, 1, 'injected', min(ise.created_at)
|
|
@@ -328,7 +333,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
328
333
|
and ise.event_type in ('surfaced', 'surfaced_with_content', 'proxy_injected')
|
|
329
334
|
group by s.instruction_id
|
|
330
335
|
on conflict on constraint treatment_exposures_unique do nothing
|
|
331
|
-
`)}catch(r){console.warn("[reimport] suggestion exposure reconcile failed:",r instanceof Error?r.message:r)}}d(
|
|
336
|
+
`)}catch(r){console.warn("[reimport] suggestion exposure reconcile failed:",r instanceof Error?r.message:r)}}d(rP,"reconcileSuggestionExposures");async function oP(e,t,n){if(n)try{await u.execute(HI`
|
|
332
337
|
with drained as (
|
|
333
338
|
insert into treatment_exposures
|
|
334
339
|
(session_id, user_id, treatment_type, treatment_id, treatment_version, method, exposed_at)
|
|
@@ -343,13 +348,13 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
343
348
|
delete from pending_treatment_exposures
|
|
344
349
|
where external_session_id = ${n}
|
|
345
350
|
and user_id = ${t}::uuid
|
|
346
|
-
`)}catch(r){console.warn("[reimport] memory exposure reconcile failed:",r instanceof Error?r.message:r)}}d(
|
|
351
|
+
`)}catch(r){console.warn("[reimport] memory exposure reconcile failed:",r instanceof Error?r.message:r)}}d(oP,"reconcileMemoryExposures");var sP=6;async function ol(e,t,n,r,o){await rP(e,t,n),await oP(e,t,n),r&&o>=sP&&await LI({sessionId:e,userId:t}).catch(s=>{console.warn("[reimport] distill enqueue failed:",s instanceof Error?s.message:s)})}d(ol,"finalizeSessionIntelligence");var zf=new iP;async function Vf(e,t){if(!t)return null;try{let[n]=await u.select({id:X.id}).from(X).where(xi(Lt(X.id,t),Lt(X.userId,e))).limit(1);return n?n.id:(console.warn(`[sessions] User ${e} attempted to attribute session to run ${t} but does not own it; run_id left null.`),null)}catch(n){return console.warn(`[sessions] run ownership lookup failed for user=${e} run=${t}; run_id silenced to null:`,n instanceof Error?n.message:n),null}}d(Vf,"resolveCallerRunId");var dP=Nn.object({tool:Nn.string(),externalSessionId:Nn.string().optional(),clientName:Nn.string().optional(),mcpServerVersion:Nn.string().optional(),projectPath:Nn.string().optional(),gitBranch:Nn.string().optional(),startedAt:Nn.string().optional(),metadata:Nn.record(Nn.unknown()).optional(),orgId:Nn.string().uuid().nullable().optional(),runId:Nn.string().uuid().nullable().optional()});zf.post("/sessions",async e=>{let t=e.get("userId"),n=await e.req.json(),r=dP.parse(n);if(r.projectPath){let f=await u.select({projectPath:_.projectPath}).from(_).where(xi(Lt(_.userId,t),pr`${_.projectPath} IS NOT NULL`)).groupBy(_.projectPath);for(let w of f)if(w.projectPath&&r.projectPath!==w.projectPath&&r.projectPath.startsWith(w.projectPath+"/")){r.projectPath=w.projectPath;break}}let o=await _o(t,r.orgId??null),s=await Vf(t,r.runId??null);if(r.externalSessionId){let[f]=await u.select().from(_).where(xi(Lt(_.userId,t),Lt(_.externalSessionId,r.externalSessionId))).limit(1);if(f){let w={};return!f.orgId&&o&&(w.orgId=o,f.orgId=o),!f.runId&&s&&(w.runId=s,f.runId=s),Object.keys(w).length>0&&await u.update(_).set(w).where(Lt(_.id,f.id)),e.json(f,200)}}if(r.tool&&r.projectPath){let f=new Date(Date.now()-3e4),w=[Lt(_.userId,t),Lt(_.tool,r.tool),Lt(_.projectPath,r.projectPath),aP(_.startedAt,f)],[b]=await u.select().from(_).where(xi(...w)).orderBy(BI(_.startedAt)).limit(1);if(b){let I={};return!b.externalSessionId&&r.externalSessionId&&(I.externalSessionId=r.externalSessionId,b.externalSessionId=r.externalSessionId),!b.orgId&&o&&(I.orgId=o,b.orgId=o),!b.runId&&s&&(I.runId=s,b.runId=s),Object.keys(I).length>0&&await u.update(_).set(I).where(Lt(_.id,b.id)),e.json(b,200)}}let i=[],a=null,c=OI(r.metadata?.gitRemote??null),l=typeof r.metadata?.gitRootCommit=="string"&&r.metadata.gitRootCommit?r.metadata.gitRootCommit:null,p=typeof r.metadata?.launchProjectPath=="string"&&r.metadata.launchProjectPath?r.metadata.launchProjectPath:null;try{if(p){let[f]=await u.select({projectId:le.projectId}).from(le).where(Lt(le.path,p)).orderBy(BI(le.lastSeen)).limit(1);f&&(i=[{id:f.projectId}],a="launchPath")}if(i.length===0&&c){let[f]=await u.select({id:U.id}).from(U).where(FI(Lt(U.gitRemoteUrl,c),pr`${c} = ANY(${U.gitRemoteAliases})`)).limit(1);f&&(i=[f],a="remote")}if(i.length===0&&l){let[f]=await u.select({id:U.id,gitRemoteUrl:U.gitRemoteUrl,gitRemoteAliases:U.gitRemoteAliases}).from(U).where(Lt(U.gitRootCommit,l)).limit(1);f&&(i=[{id:f.id}],a="rootCommit",c&&f.gitRemoteUrl&&f.gitRemoteUrl!==c&&!(f.gitRemoteAliases??[]).includes(c)&&await u.update(U).set({gitRemoteUrl:c,gitRemoteAliases:pr`array_append(${U.gitRemoteAliases}, ${f.gitRemoteUrl})`}).where(Lt(U.id,f.id)))}if(i.length===0&&c){let f=c.split("/").filter(Boolean).pop()??c,[w]=await u.insert(U).values({name:f,gitRemoteUrl:c,gitRootCommit:l,createdBy:t}).onConflictDoUpdate({target:U.gitRemoteUrl,targetWhere:pr`${U.gitRemoteUrl} IS NOT NULL`,set:{gitRemoteUrl:c}}).returning({id:U.id});w&&(i=[{id:w.id}],a="remote")}}catch(f){console.warn("[sessions] Project match failed (non-fatal):",f)}let m=e.req.header("X-RuleMetric-Internal")==="true"||e.req.header("x-rulemetric-internal")==="true",y;m?y="internal_worker":r.clientName==="mcp"?y="mcp":r.externalSessionId?y="hook":y="proxy";let v;try{[v]=await u.insert(_).values({userId:t,externalSessionId:r.externalSessionId??null,projectId:i[0]?.id??null,orgId:o,runId:s,tool:r.tool,projectPath:r.projectPath??null,gitBranch:r.gitBranch??null,startedAt:r.startedAt?new Date(r.startedAt):new Date,origin:y,harnessVersion:Si(r.metadata)??void 0,metadata:{...r.metadata,clientName:r.clientName,mcpServerVersion:r.mcpServerVersion}}).returning()}catch(f){if(f.cause?.code==="23505"&&r.externalSessionId){let[b]=await u.select().from(_).where(xi(Lt(_.userId,t),Lt(_.externalSessionId,r.externalSessionId))).limit(1);if(b){let I={};return!b.orgId&&o&&(I.orgId=o,b.orgId=o),!b.runId&&s&&(I.runId=s,b.runId=s),Object.keys(I).length>0&&await u.update(_).set(I).where(Lt(_.id,b.id)),e.json(b,200)}}throw f}if(!v)return e.json({error:"Failed to create session"},500);let h=!!r.projectPath&&/^\/(Users|home)\/[^/]+\/?$/.test(r.projectPath);if(i.length>0&&r.projectPath&&!h){let f=r.metadata?.isWorktree===!0;try{await u.insert(le).values({projectId:i[0].id,path:r.projectPath,isWorktree:f}).onConflictDoUpdate({target:[le.projectId,le.path],set:{lastSeen:new Date,isWorktree:f}})}catch(w){console.warn("[sessions] project_checkouts upsert failed (non-fatal):",w)}}try{if(i.length>0){let f=r.projectPath?r.projectPath.replace(/\/$/,"")+"/":null,w=f?pr`${g.name} LIKE ${f+"%"}`:pr`FALSE`,b=await u.select({instructionId:at.instructionId}).from(at).innerJoin(g,Lt(g.id,at.instructionId)).where(xi(pr`${at.projectId} IN (${pr.join(i.map(I=>pr`${I.id}`),pr`, `)})`,FI(cP(g.type,"context_file"),w)));for(let{instructionId:I}of b)await u.insert(se).values({sessionId:v.id,instructionId:I,linkMethod:"project_match"}).onConflictDoNothing()}}catch{}return e.json(v,201)});D();import{Hono as hP}from"hono";import{z as dt}from"zod";import{eq as XI,and as _P,sql as mr}from"drizzle-orm";D();import{sql as Pn}from"drizzle-orm";function sl(){return process.env.EVENT_BATCHING!=="0"}d(sl,"eventBatchingEnabled");function zI(){let e=Number(process.env.EVENT_BATCH_LINGER_MS);return Number.isFinite(e)&&e>=0?e:50}d(zI,"eventBatchLingerMs");function VI(){let e=Number(process.env.EVENT_BATCH_BUFFER_MAX);return Number.isFinite(e)&&e>0?Math.floor(e):5e3}d(VI,"eventBatchBufferMax");function JI(){let e=Number(process.env.EVENT_BATCH_FLUSH_SIZE);return Number.isFinite(e)&&e>0?Math.floor(e):uP}d(JI,"eventBatchFlushSize");function GI(){let e=Number(process.env.PG_POOL_MAX)||3;return Math.max(1,e-1)}d(GI,"defaultDrainConcurrency");var uP=500;function lP(e){let t=e.lingerMs??zI(),n=e.maxBuffered??VI(),r=Math.max(1,e.flushSize??JI()),o=Math.max(1,e.concurrency??GI()),s=new Map,i=0,a=new Set,c=0,l=!1,p=null,m=[];function y(){let A=m;m=[];for(let E of A)E()}d(y,"notifyProgress");function v(){for(;c<o;){let A=null,E=null;for(let[R,O]of s)if(!(a.has(R)||O.length===0)){E=O.splice(0,r),O.length===0&&s.delete(R),A=R;break}if(A==null||E==null)return;i-=E.length,a.add(A),c++,h(A,E)}}d(v,"tick");async function h(A,E){try{await e.drainSession(A,E)}catch(R){console.warn(`[event-batcher] drain failed for session ${A}; dropping ${E.length} event(s):`,R instanceof Error?R.message:R)}finally{c--,a.delete(A),y(),v()}}d(h,"runDrain");function f(){p!=null||l||(p=setTimeout(()=>{p=null,v()},t),p.unref?.())}d(f,"scheduleLinger");function w(A){if(l||i>=n)return!1;let E=s.get(A.sessionId);return E?E.push(A):s.set(A.sessionId,[A]),i++,i>=r?v():f(),!0}d(w,"push");function b(A){return new Promise(E=>{let R=!1,O=d(()=>{R||(R=!0,clearTimeout(j),E())},"finish"),j=setTimeout(O,A);j.unref?.(),m.push(O)})}d(b,"waitForProgress");async function I(A){let E=A!=null?Date.now()+A:Number.POSITIVE_INFINITY;for(;;){if(v(),i===0&&c===0)return;let R=E-Date.now();if(R<=0)return;await b(Math.min(R,50))}}d(I,"flush");function S(){l=!0,p!=null&&(clearTimeout(p),p=null)}return d(S,"stop"),{push:w,flush:I,stop:S,size:d(()=>i,"size"),inFlight:d(()=>c,"inFlight")}}d(lP,"createEventBatcher");var WI=5,pP=[5,20,50];function mP(e){let t=e.cause;return e instanceof Error&&(t?.code==="23505"||e.message.includes("unique")||e.message.includes("duplicate"))}d(mP,"isDuplicateKeyError");function fP(e){let t=Date.parse(e);return Number.isNaN(t)?(console.warn(`[event-batcher] invalid event timestamp ${JSON.stringify(e)}; using drain wall-clock`),new Date().toISOString()):new Date(t).toISOString()}d(fP,"toEventTimestamp");async function gP(e,t){if(t.length===0)return;let n=null,r=!1;for(let o=0;o<=WI;o++)try{let s=t.map((a,c)=>{let l=a.input,p={...l.metadata??{}};l.durationMs!=null&&(p.durationMs=l.durationMs),l.success!=null&&(p.success=l.success);let m=l.toolInput==null?null:JSON.stringify(l.toolInput),y=l.toolOutput==null?null:JSON.stringify(l.toolOutput),v=l.tokenUsage==null?null:JSON.stringify(l.tokenUsage),h=!r&&l.sequence!=null?Pn`${l.sequence}::int`:Pn`NULL::int`;return Pn`(${c+1}::int, ${h}, ${l.eventType}::text, ${l.content??null}::text, ${l.toolName??null}::text, ${m==null?Pn`NULL::jsonb`:Pn`${m}::jsonb`}, ${y==null?Pn`NULL::jsonb`:Pn`${y}::jsonb`}, ${v==null?Pn`NULL::jsonb`:Pn`${v}::jsonb`}, ${l.model??null}::text, ${fP(l.timestamp)}::timestamptz, ${JSON.stringify(p)}::jsonb)`});n=(await u.execute(Pn`
|
|
347
352
|
WITH base AS (
|
|
348
353
|
SELECT COALESCE(MAX(sequence), 0) AS seq
|
|
349
354
|
FROM session_events WHERE session_id = ${e}
|
|
350
355
|
),
|
|
351
356
|
vals (rn, explicit_seq, event_type, content, tool_name, tool_input, tool_output, token_usage, model, ts, metadata) AS (
|
|
352
|
-
VALUES ${
|
|
357
|
+
VALUES ${Pn.join(s,Pn`, `)}
|
|
353
358
|
),
|
|
354
359
|
ins AS (
|
|
355
360
|
INSERT INTO session_events (id, session_id, sequence, event_type, content, tool_name, tool_input, tool_output, token_usage, model, timestamp, metadata)
|
|
@@ -370,7 +375,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
370
375
|
)
|
|
371
376
|
SELECT (SELECT COUNT(*)::int FROM ins) AS inserted,
|
|
372
377
|
(SELECT event_count FROM upd) AS new_count
|
|
373
|
-
`))[0]?.new_count??null;break}catch(s){if(
|
|
378
|
+
`))[0]?.new_count??null;break}catch(s){if(mP(s)&&o<WI){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=pP.filter(i=>o<i&&n>=i);for(let i of s)await rl({sessionId:e,milestone:i,userId:t[0].userId})}catch(o){console.warn("[event-batcher] failed to enqueue process_session_goal:",o instanceof Error?o.message:o)}}d(gP,"drainSessionEvents");var yo=null;function Jf(){return yo==null&&(yo=lP({drainSession:gP})),yo}d(Jf,"getEventBatcher");function KI(){Jf(),console.log(`[event-batcher] batched event ingest ON (lingerMs=${zI()} flushSize=${JI()} bufferMax=${VI()} drainConcurrency=${GI()}; EVENT_BATCHING=0 to disable)`)}d(KI,"initEventBatcher");async function YI(e=5e3){if(yo==null)return;yo.stop(),await yo.flush(e);let t=yo.size()+yo.inFlight();t>0&&console.warn(`[event-batcher] shutdown flush deadline (${e}ms) hit; dropping ~${t} buffered event(s)`)}d(YI,"shutdownEventBatcher");var Gf=new hP,yP=dt.object({sequence:dt.number().int().optional(),eventType:dt.string(),content:dt.string().nullable().optional(),toolName:dt.string().nullable().optional(),toolInput:dt.union([dt.record(dt.unknown()),dt.array(dt.unknown())]).nullable().optional(),toolOutput:dt.union([dt.record(dt.unknown()),dt.array(dt.unknown())]).nullable().optional(),durationMs:dt.number().optional(),success:dt.boolean().optional(),metadata:dt.record(dt.unknown()).optional(),timestamp:dt.string(),instructionIds:dt.array(dt.string().uuid()).optional(),model:dt.string().nullable().optional(),tokenUsage:dt.record(dt.unknown()).nullable().optional()});Gf.post("/sessions/:id/events",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=yP.parse(r),[s]=await u.select({id:_.id,eventCount:_.eventCount,userId:_.userId}).from(_).where(_P(XI(_.id,n),XI(_.userId,t)));if(!s)return e.json({error:"Session not found"},404);let i=s.eventCount??0;if(sl())return Jf().push({sessionId:n,userId:s.userId,input:o})?e.json({buffered:!0,count:1,durable:!1},202):(Ga(),e.header("Retry-After","2"),e.json({error:"Ingest busy: the event buffer is full. Retry shortly."},503));let a={...o.metadata??{}};o.durationMs!=null&&(a.durationMs=o.durationMs),o.success!=null&&(a.success=o.success);let c=o.toolInput==null?null:JSON.stringify(o.toolInput),l=o.toolOutput==null?null:JSON.stringify(o.toolOutput),p=JSON.stringify(a),m=o.tokenUsage==null?null:JSON.stringify(o.tokenUsage),y=o.sequence,v=5;for(let h=0;h<=v;h++)try{let f=y!=null?mr`${y}::int`:mr`COALESCE((SELECT MAX(sequence) FROM session_events WHERE session_id = ${n}), 0) + 1`;y=(await u.execute(mr`
|
|
374
379
|
WITH ins AS (
|
|
375
380
|
INSERT INTO session_events (id, session_id, sequence, event_type, content, tool_name, tool_input, tool_output, token_usage, model, timestamp, metadata)
|
|
376
381
|
SELECT
|
|
@@ -395,8 +400,8 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
395
400
|
RETURNING id
|
|
396
401
|
)
|
|
397
402
|
SELECT ins.sequence FROM ins, upd
|
|
398
|
-
`))[0]?.sequence??y??1;break}catch(f){let w=f.cause;if(f instanceof Error&&(w?.code==="23505"||f.message.includes("unique")||f.message.includes("duplicate"))&&h<v){y=void 0;continue}throw f}if(o.instructionIds&&o.instructionIds.length>0)for(let h of o.instructionIds)try{await u.insert(se).values({sessionId:n,instructionId:h,linkMethod:"auto_capture"}).onConflictDoNothing()}catch(f){console.warn("[events ingest] failed to auto-link instructionId:",f instanceof Error?f.message:f)}try{let h=i+1,w=[5,20,50].filter(b=>i<b&&h>=b);for(let b of w)await
|
|
399
|
-
`)}d(vo,"findPgMessage");import{createHash as
|
|
403
|
+
`))[0]?.sequence??y??1;break}catch(f){let w=f.cause;if(f instanceof Error&&(w?.code==="23505"||f.message.includes("unique")||f.message.includes("duplicate"))&&h<v){y=void 0;continue}throw f}if(o.instructionIds&&o.instructionIds.length>0)for(let h of o.instructionIds)try{await u.insert(se).values({sessionId:n,instructionId:h,linkMethod:"auto_capture"}).onConflictDoNothing()}catch(f){console.warn("[events ingest] failed to auto-link instructionId:",f instanceof Error?f.message:f)}try{let h=i+1,w=[5,20,50].filter(b=>i<b&&h>=b);for(let b of w)await rl({sessionId:s.id,milestone:b,userId:s.userId})}catch(h){console.warn("[events ingest] failed to enqueue process_session_goal:",h instanceof Error?h.message:h)}return e.json({recorded:!0})});D();import{Hono as wP}from"hono";import{eq as hs,and as il,desc as vP,sql as IP,ilike as Kf,gte as QI}from"drizzle-orm";var Yf=new wP;Yf.post("/sessions/:id/close",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:_.id,projectPath:_.projectPath}).from(_).where(il(hs(_.id,n),hs(_.userId,t)));if(!r)return e.json({error:"Session not found"},404);if(await u.update(_).set({endedAt:new Date}).where(hs(_.id,n)),r.projectPath)try{let o=new Date;o.setHours(0,0,0,0);let[s]=await u.select({id:W.id}).from(W).where(il(hs(W.userId,t),QI(W.createdAt,o),Kf(W.projectPath,`%${ot(r.projectPath)}%`))).limit(1);if(!s){let[i]=await u.select({completedAt:W.completedAt}).from(W).where(il(hs(W.userId,t),hs(W.status,"completed"),Kf(W.projectPath,`%${ot(r.projectPath)}%`))).orderBy(vP(W.completedAt)).limit(1),a=i?.completedAt??new Date(0),[{count:c}]=await u.select({count:IP`COUNT(*)`}).from(_).where(il(hs(_.userId,t),Kf(_.projectPath,`%${ot(r.projectPath)}%`),QI(_.startedAt,a)));Number(c)>=5&&await Rt({taskName:"process_insights",payload:{projectPath:r.projectPath},userId:t,mirror:{userId:t,projectPath:r.projectPath}})}}catch{}return e.json({closed:!0})});D();_l();import{createHash as LC}from"node:crypto";import{Hono as $C}from"hono";import{z as yl}from"zod";import{eq as Yn,and as a0,sql as _s}from"drizzle-orm";function zt(e){let t=e;for(;t&&typeof t=="object";){let n=t.code;if(typeof n=="string")return n;t=t.cause}}d(zt,"findPgCode");function vo(e){let t=[],n=e;for(;n&&typeof n=="object";){let r=n.message;typeof r=="string"&&t.push(r),n=n.cause}return t.join(`
|
|
404
|
+
`)}d(vo,"findPgMessage");import{createHash as MC}from"node:crypto";function o0(e){if(!e||typeof e!="object")return null;let t=e,n=t._importContentHash,r=t._importContentLen,o=t._importEventCount;return typeof n!="string"||n.length===0||typeof r!="number"||!Number.isInteger(r)||r<0||typeof o!="number"||!Number.isInteger(o)||o<0?null:{contentHash:n,contentLen:r,eventCount:o}}d(o0,"readImportMarker");function s0(e,t){return e.length<=t.contentLen?!1:MC("sha256").update(e.slice(0,t.contentLen)).digest("hex")===t.contentHash}d(s0,"isStrictContentExtension");var i0=new Set(["claude_code","codex"]);var wl=new $C,c0=yl.object({content:yl.string().min(1),tool:yl.string().optional(),orgId:yl.string().uuid().nullable().optional()});function qC(e){for(let t of[e.metadata?.sessionId,e.metadata?.codexSessionId])if(typeof t=="string"&&t.length>0)return t;return null}d(qC,"importedExternalSessionId");wl.post("/sessions/:id/reimport",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=c0.parse(r),[s]=await u.select({id:_.id,eventCount:_.eventCount,externalSessionId:_.externalSessionId,projectId:_.projectId}).from(_).where(a0(Yn(_.id,n),Yn(_.userId,t)));if(!s)return e.json({error:"Session not found"},404);let i=o.tool??jc(o.content);if(!i)return e.json({error:"Could not detect session format. Specify tool parameter."},400);let c=kc(i).parse(o.content);if(c.events.length===s.eventCount)return await ol(n,t,s.externalSessionId,s.projectId,s.eventCount??0),e.json({reimported:!1,skipped:"unchanged",eventCount:s.eventCount});if(c.events.length===0&&(s.eventCount??0)>0)return await u.update(_).set({endedAt:c.endedAt?new Date(c.endedAt):new Date}).where(Yn(_.id,n)),await ol(n,t,s.externalSessionId,s.projectId,s.eventCount??0),e.json({reimported:!1,skipped:"empty_parse",eventCount:s.eventCount});let l=c.events.map(p=>({sessionId:n,sequence:p.sequence,eventType:p.eventType,content:p.content,toolName:p.toolName,toolInput:p.toolInput,toolOutput:p.toolOutput,tokenUsage:p.tokenUsage,timestamp:new Date(p.timestamp),metadata:p.metadata}));return await nt.transaction(async p=>{await p.execute(_s`SET LOCAL statement_timeout = '60s'`),await p.delete(qe).where(Yn(qe.sessionId,n));for(let m=0;m<l.length;m+=500)await p.insert(qe).values(l.slice(m,m+500));await p.update(_).set({eventCount:c.events.length,endedAt:c.endedAt?new Date(c.endedAt):new Date,projectPath:c.projectPath??void 0,gitBranch:c.gitBranch??void 0,metadata:c.metadata?_s`COALESCE(${_.metadata}, '{}'::jsonb) || ${JSON.stringify(c.metadata)}::jsonb`:void 0,model:gs(c.metadata?.model)??void 0,harnessVersion:Si(c.metadata)??void 0}).where(Yn(_.id,n))}),await ol(n,t,s.externalSessionId,s.projectId,c.events.length),e.json({reimported:!0,eventCount:c.events.length})});wl.post("/sessions/import",async e=>{let t=e.get("userId"),n=await e.req.json(),r=c0.parse(n),o=r.tool??jc(r.content);if(!o)return e.json({error:"Could not detect session format. Specify tool parameter."},400);let i=kc(o).parse(r.content),a=qC(i),c=LC("sha256").update(r.content).digest("hex"),l,p=d(async()=>(l===void 0&&(l=await _o(t,r.orgId??null)),l),"resolveOrgId"),m=i.events.map(h=>({sequence:h.sequence,eventType:h.eventType,content:h.content,toolName:h.toolName,toolInput:h.toolInput,toolOutput:h.toolOutput,tokenUsage:h.tokenUsage,timestamp:new Date(h.timestamp),metadata:h.metadata})),y={...i.metadata??{},_importContentHash:c,_importContentLen:r.content.length,_importEventCount:i.events.length},v=3;for(let h=0;;h++){let f=a?(await u.select().from(_).where(a0(Yn(_.userId,t),Yn(_.externalSessionId,a))).limit(1))[0]??null:null;if(f&&f.metadata?._importContentHash===c)return e.json({...f,deduped:!0},200);let w=await p(),b=f?{tool:i.tool,projectPath:i.projectPath??void 0,gitBranch:i.gitBranch??void 0,startedAt:new Date(i.startedAt),endedAt:i.endedAt?new Date(i.endedAt):void 0,eventCount:i.events.length,metadata:_s`COALESCE(${_.metadata}, '{}'::jsonb) || ${JSON.stringify(y)}::jsonb`,model:gs(i.metadata?.model)??void 0,harnessVersion:Si(i.metadata)??void 0,...w&&!f.orgId?{orgId:w}:{}}:null;try{if(f&&b&&i0.has(i.tool)){let S=o0(f.metadata);if(S&&m.length>S.eventCount&&m[S.eventCount]?.sequence===S.eventCount&&s0(r.content,S)){let[A]=await u.select({count:_s`COUNT(*)::int`,maxSeq:_s`MAX(${qe.sequence})::int`}).from(qe).where(Yn(qe.sessionId,f.id)),E=Number(A?.count??-1),R=A?.maxSeq==null?null:Number(A.maxSeq);if(E===S.eventCount&&(S.eventCount===0?R===null:R===S.eventCount-1)){let j=await nt.transaction(async P=>{await P.execute(_s`SET LOCAL statement_timeout = '60s'`);let $=m.slice(S.eventCount).map(B=>({sessionId:f.id,...B}));for(let B=0;B<$.length;B+=500)await P.insert(qe).values($.slice(B,B+500));let[H]=await P.update(_).set(b).where(Yn(_.id,f.id)).returning();return H});return e.json({...j,appended:!0},200)}}}let I=await nt.transaction(async S=>{if(await S.execute(_s`SET LOCAL statement_timeout = '60s'`),f&&b){if(await S.delete(qe).where(Yn(qe.sessionId,f.id)),m.length>0){let R=m.map(O=>({sessionId:f.id,...O}));for(let O=0;O<R.length;O+=500)await S.insert(qe).values(R.slice(O,O+500))}let[E]=await S.update(_).set(b).where(Yn(_.id,f.id)).returning();return E}let[A]=await S.insert(_).values({userId:t,externalSessionId:a,tool:i.tool,projectPath:i.projectPath,gitBranch:i.gitBranch,startedAt:new Date(i.startedAt),endedAt:i.endedAt?new Date(i.endedAt):null,eventCount:i.events.length,metadata:y,model:gs(i.metadata?.model),harnessVersion:Si(i.metadata),orgId:w}).returning();if(m.length>0){let E=m.map(R=>({sessionId:A.id,...R}));for(let R=0;R<E.length;R+=500)await S.insert(qe).values(E.slice(R,R+500))}return A});return e.json(I,f?200:201)}catch(I){if(a&&zt(I)==="23505"&&h<v)continue;throw I}}});var Oi=new UC;Oi.route("/",zf);Oi.route("/",Gf);Oi.route("/",Yf);Oi.route("/",wl);D();import{Hono as HC}from"hono";import{eq as nn,and as Mi,asc as u0,desc as _g,sql as Ue,or as d0,ilike as BC,inArray as vl}from"drizzle-orm";var Li=new HC;Li.get("/sessions",async e=>{let t=e.get("userId"),n=e.req.query("tool"),r=e.req.query("outcome"),o=e.req.query("friction"),s=e.req.query("instructionId"),i=e.req.query("hasAnalysis"),a=e.req.query("projectPath"),c=e.req.query("projectId"),l=e.req.query("gitRemote"),p=Number(e.req.query("limit")??"50"),m=Number(e.req.query("offset")??"0"),y=[nn(_.userId,t)];if(e.req.query("includeInternal")==="true"||y.push(Ue`${_.origin} <> 'internal_worker'`),n&&y.push(nn(_.tool,n)),c){let w=[nn(_.projectId,c)];l&&w.push(Ue`${_.metadata}->>'gitRemote' = ${l}`),y.push(w.length===1?w[0]:d0(...w))}else if(a||l){let w=[];a&&w.push(BC(_.projectPath,`%${ot(a)}%`)),l&&w.push(Ue`${_.metadata}->>'gitRemote' = ${l}`),y.push(w.length===1?w[0]:d0(...w))}if(e.req.query("hideEmpty")!=="false"&&y.push(Ue`${_.eventCount} > 0`),i==="true"?y.push(Ue`${_.analysis} IS NOT NULL`):i==="false"&&y.push(Ue`${_.analysis} IS NULL`),r&&y.push(Ue`${_.analysis}->>'outcome' = ${r}`),o&&y.push(Ue`(${_.analysis}->'friction')::text ILIKE ${"%"+ot(o)+"%"}`),s){let b=(await u.select({sessionId:se.sessionId}).from(se).where(nn(se.instructionId,s))).map(I=>I.sessionId);if(b.length===0)return e.json([]);y.push(Ue`${_.id} IN (${Ue.join(b.map(I=>Ue`${I}`),Ue`, `)})`)}if(e.req.query("summary")==="exists"){let[w]=await u.select({id:_.id}).from(_).where(Mi(...y)).limit(1);return e.json({exists:!!w})}let f=await u.select().from(_).where(Mi(...y)).orderBy(_g(_.startedAt)).limit(p).offset(m);if(f.length>0){let w=f.map(N=>N.id),b=Array.from(new Set(f.map(N=>N.projectId).filter(N=>!!N))),[I,S,A,E,R,O,j]=await Promise.all([u.select({sessionId:se.sessionId,name:g.name,contextIdentity:g.contextIdentity,type:g.type,source:Ue`${g.frontmatter}->>'source'`}).from(se).innerJoin(g,nn(g.id,se.instructionId)).where(vl(se.sessionId,w)),u.select({sessionId:L.sessionId}).from(L).where(vl(L.sessionId,w)).groupBy(L.sessionId),u.execute(Ue`
|
|
400
405
|
SELECT session_id, MAX(timestamp) AS last_at
|
|
401
406
|
FROM session_events
|
|
402
407
|
WHERE session_id IN (${Ue.join(w.map(N=>Ue`${N}`),Ue`, `)})
|
|
@@ -426,12 +431,12 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
426
431
|
AND e.content IS NOT NULL
|
|
427
432
|
AND e.content <> ''
|
|
428
433
|
ORDER BY e.session_id, e.timestamp ASC
|
|
429
|
-
`),b.length>0?u.select({id:U.id,name:U.name}).from(U).where(
|
|
434
|
+
`),b.length>0?u.select({id:U.id,name:U.name}).from(U).where(vl(U.id,b)):Promise.resolve([]),b.length>0?u.execute(Ue`
|
|
430
435
|
SELECT DISTINCT ON (project_id) project_id, path
|
|
431
436
|
FROM project_checkouts
|
|
432
437
|
WHERE project_id IN (${Ue.join(b.map(N=>Ue`${N}`),Ue`, `)})
|
|
433
438
|
ORDER BY project_id, is_worktree ASC, last_seen DESC
|
|
434
|
-
`):Promise.resolve([])]),P=new Map;for(let N of I){let me=P.get(N.sessionId)??[];me.push({name:N.name,contextIdentity:N.contextIdentity,type:N.type,source:N.source}),P.set(N.sessionId,me)}let $=new Set;for(let N of S)N.sessionId&&$.add(N.sessionId);let H=new Map;for(let N of A)H.set(N.session_id,N.last_at);let B=new Map;for(let N of E)B.set(N.session_id,N.preview);let
|
|
439
|
+
`):Promise.resolve([])]),P=new Map;for(let N of I){let me=P.get(N.sessionId)??[];me.push({name:N.name,contextIdentity:N.contextIdentity,type:N.type,source:N.source}),P.set(N.sessionId,me)}let $=new Set;for(let N of S)N.sessionId&&$.add(N.sessionId);let H=new Map;for(let N of A)H.set(N.session_id,N.last_at);let B=new Map;for(let N of E)B.set(N.session_id,N.preview);let ee=new Map;for(let N of R)ee.set(N.session_id,N.first_prompt);let _e=new Map,te=new Map;for(let N of O)_e.set(N.id,N.name);for(let N of j)te.set(N.project_id,N.path);let Re=f.map(N=>({...N,linkedInstructions:P.get(N.id)??[],dataTier:$.has(N.id)?"full":(N.eventCount??0)>0?"events":"imported",lastMessagePreview:B.get(N.id)??N.analysis?.goalSummary??null,firstUserPrompt:ee.get(N.id)??null,projectName:N.projectId?_e.get(N.projectId)??null:null,primaryCheckoutPath:N.projectId?te.get(N.projectId)??null:null,lastActivityAt:H.get(N.id)??N.startedAt}));return e.json(Re)}return e.json(f)});Li.get("/sessions/project-paths",async e=>{let t=e.get("userId"),n=e.req.query("since"),r=Number(e.req.query("limit")??"20"),o=Math.min(Math.max(r,1),50),s=n?new Date(n):new Date(Date.now()-720*60*60*1e3);if(isNaN(s.getTime()))return e.json({error:"Invalid since timestamp"},400);let i=await u.execute(Ue`
|
|
435
440
|
WITH recent AS (
|
|
436
441
|
SELECT
|
|
437
442
|
s.project_id,
|
|
@@ -487,14 +492,14 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
487
492
|
) deduped
|
|
488
493
|
ORDER BY last_activity DESC
|
|
489
494
|
LIMIT ${o}
|
|
490
|
-
`),a=Array.from(i).map(c=>c.project_path).filter(c=>typeof c=="string"&&c!=="");return e.json({projectPaths:a})});Li.get("/sessions/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(_).where(Mi(nn(_.id,n),nn(_.userId,t)));if(!r)return e.json({error:"Session not found"},404);let o=await u.select({instructionId:se.instructionId,linkMethod:se.linkMethod,name:g.name,contextIdentity:g.contextIdentity,content:g.content,scope:g.scope,type:g.type,frontmatter:g.frontmatter}).from(se).innerJoin(g,nn(g.id,se.instructionId)).where(Mi(nn(se.sessionId,n),Ue`${g.content} IS NOT NULL AND ${g.content} != ''`)),s=await u.select({eventType:qe.eventType,count:Ue`count(*)::int`}).from(qe).where(nn(qe.sessionId,n)).groupBy(qe.eventType),i={};for(let l of s)i[l.eventType]=Number(l.count);let a=null,c=null;if(r.projectId){let[l]=await u.select({name:U.name}).from(U).where(nn(U.id,r.projectId));a=l?.name??null;let[p]=await u.select({path:le.path}).from(le).where(nn(le.projectId,r.projectId)).orderBy(
|
|
495
|
+
`),a=Array.from(i).map(c=>c.project_path).filter(c=>typeof c=="string"&&c!=="");return e.json({projectPaths:a})});Li.get("/sessions/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(_).where(Mi(nn(_.id,n),nn(_.userId,t)));if(!r)return e.json({error:"Session not found"},404);let o=await u.select({instructionId:se.instructionId,linkMethod:se.linkMethod,name:g.name,contextIdentity:g.contextIdentity,content:g.content,scope:g.scope,type:g.type,frontmatter:g.frontmatter}).from(se).innerJoin(g,nn(g.id,se.instructionId)).where(Mi(nn(se.sessionId,n),Ue`${g.content} IS NOT NULL AND ${g.content} != ''`)),s=await u.select({eventType:qe.eventType,count:Ue`count(*)::int`}).from(qe).where(nn(qe.sessionId,n)).groupBy(qe.eventType),i={};for(let l of s)i[l.eventType]=Number(l.count);let a=null,c=null;if(r.projectId){let[l]=await u.select({name:U.name}).from(U).where(nn(U.id,r.projectId));a=l?.name??null;let[p]=await u.select({path:le.path}).from(le).where(nn(le.projectId,r.projectId)).orderBy(u0(le.isWorktree),_g(le.lastSeen)).limit(1);c=p?.path??null}return e.json({...r,linkedInstructions:o.map(l=>({...l,source:Tu(l.frontmatter)})),projectName:a,primaryCheckoutPath:c,eventCounts:{total:Object.values(i).reduce((l,p)=>l+p,0),messages:(i.user_message??0)+(i.assistant_message??0),toolCalls:i.tool_call??0,assistantResponses:i.assistant_response??0,byType:i}})});Li.get("/sessions/:id/events",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=Number(e.req.query("limit")??"100"),o=Number(e.req.query("offset")??"0"),s=e.req.query("sort")==="desc"?"desc":"asc",i=(e.req.query("eventType")??"").split(",").map(m=>m.trim()).filter(Boolean),a=e.req.query("hasContent")==="true",[c]=await u.select({id:_.id}).from(_).where(Mi(nn(_.id,n),nn(_.userId,t)));if(!c)return e.json({error:"Session not found"},404);let l=[nn(qe.sessionId,n)];i.length>0&&l.push(vl(qe.eventType,i)),a&&l.push(Ue`${qe.content} IS NOT NULL AND ${qe.content} != ''`);let p=await u.select().from(qe).where(Mi(...l)).orderBy(s==="desc"?_g(qe.sequence):u0(qe.sequence)).limit(r).offset(o);return e.json(p)});D();import{Hono as FC}from"hono";import{z as Sn}from"zod";import{eq as Io,and as yg,sql as Hr}from"drizzle-orm";var $i=new FC;$i.post("/sessions/:id/analyze",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:_.id,tool:_.tool}).from(_).where(yg(Io(_.id,n),Io(_.userId,t)));if(!r)return e.json({error:"Session not found"},404);let{id:o}=await Rt({taskName:"process_insights",payload:{config:{type:"analyze_session",sessionId:n}},userId:t,mirror:{userId:t,config:{type:"analyze_session",sessionId:n}}});return e.json({jobId:o,status:"pending",tool:r.tool},202)});$i.post("/sessions/repair-analyzed-at",async e=>{let t=e.get("userId"),n=await u.execute(Hr`
|
|
491
496
|
UPDATE sessions
|
|
492
497
|
SET analyzed_at = started_at
|
|
493
498
|
WHERE user_id = ${t}
|
|
494
499
|
AND analysis IS NOT NULL
|
|
495
500
|
AND analyzed_at IS NULL
|
|
496
501
|
RETURNING id
|
|
497
|
-
`);return e.json({repaired:n.length})});var
|
|
502
|
+
`);return e.json({repaired:n.length})});var WC=Sn.object({metadata:Sn.record(Sn.unknown()).optional(),analysis:Sn.record(Sn.unknown()).optional(),analyzedEventCount:Sn.number().int().nonnegative().optional(),analyzedTurnCount:Sn.number().int().nonnegative().optional(),tokenUsage:Sn.object({inputTokens:Sn.number().optional(),outputTokens:Sn.number().optional(),cacheReadTokens:Sn.number().optional(),cacheWriteTokens:Sn.number().optional()}).optional(),externalSessionId:Sn.string().uuid().optional()}).strict();$i.patch("/sessions/:id/enrich",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=WC.parse(await e.req.json()),[o]=await u.select({id:_.id}).from(_).where(yg(Io(_.id,n),Io(_.userId,t)));if(!o)return e.json({error:"Session not found"},404);let s={};return r.metadata&&(s.metadata=Hr`COALESCE(${_.metadata}, '{}'::jsonb) || ${JSON.stringify(r.metadata)}::jsonb`),r.analysis&&(s.analysis=Hr`COALESCE(${_.analysis}, '{}'::jsonb) || ${JSON.stringify(r.analysis)}::jsonb`,s.analyzedAt=new Date),r.analyzedEventCount!=null&&(s.analyzedEventCount=r.analyzedEventCount),r.analyzedTurnCount!=null&&(s.analyzedTurnCount=r.analyzedTurnCount),r.tokenUsage&&(s.tokenUsage=r.tokenUsage),r.externalSessionId&&(s.externalSessionId=r.externalSessionId),Object.keys(s).length===0?e.json({error:"No enrichment data provided"},400):(await u.update(_).set(s).where(Io(_.id,n)),e.json({enriched:!0,fields:Object.keys(s)}))});$i.post("/sessions/:id/derive-enrichment",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:_.id,startedAt:_.startedAt,endedAt:_.endedAt,metadata:_.metadata}).from(_).where(yg(Io(_.id,n),Io(_.userId,t)));if(!r)return e.json({error:"Session not found"},404);let s=(await e.req.json().catch(()=>({}))).force===!0,a=r.metadata?.local_session_meta;if(a){if(!s)return e.json({skipped:!0,reason:"already_enriched"});if(!a.derived_from_events)return e.json({skipped:!0,reason:"hook_enriched"})}let[c]=await u.execute(Hr`
|
|
498
503
|
WITH usage_rows AS (
|
|
499
504
|
SELECT DISTINCT ON (coalesce(metadata->>'requestId', id::text))
|
|
500
505
|
coalesce(
|
|
@@ -593,7 +598,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
593
598
|
AND tool_name IN ('Edit','MultiEdit','Write','NotebookEdit')
|
|
594
599
|
AND jsonb_typeof(tool_input) = 'object'
|
|
595
600
|
AND coalesce(tool_input->>'file_path', tool_input->>'notebook_path') IS NOT NULL
|
|
596
|
-
`),S={};for(let $ of I){let H=$.path.split(".").pop()?.toLowerCase(),B=H?b[H]:void 0;B&&(S[B]=(S[B]??0)+1)}let A=c.first_ts,E=c.last_ts,
|
|
601
|
+
`),S={};for(let $ of I){let H=$.path.split(".").pop()?.toLowerCase(),B=H?b[H]:void 0;B&&(S[B]=(S[B]??0)+1)}let A=c.first_ts,E=c.last_ts,O={duration_minutes:A&&E?Math.round((new Date(E).getTime()-new Date(A).getTime())/6e4):0,user_message_count:l,assistant_message_count:p,tool_counts:h,languages:S,git_commits:Number(w?.git_commits??0),git_pushes:Number(w?.git_pushes??0),user_interruptions:0,tool_errors:Number(w?.tool_errors??0),lines_added:Number(w?.lines_added??0),lines_removed:Number(w?.lines_removed??0),files_modified:Number(w?.files_modified??0),derived_from_events:!0},j=m>0||y>0?{input_tokens:m,output_tokens:y}:void 0,P={metadata:Hr`COALESCE(${_.metadata}, '{}'::jsonb) || ${JSON.stringify({local_session_meta:O})}::jsonb`};return j&&(P.tokenUsage=j),await u.update(_).set(P).where(Io(_.id,n)),e.json({enriched:!0,metrics:O})});D();import{Hono as eD}from"hono";import{z as Mc}from"zod";import{eq as kt,and as Lc,asc as tD,desc as nD,sql as qi}from"drizzle-orm";var zC=Number(process.env.PG_MESSAGE_RECONSTRUCT_BUDGET_BYTES)||16e6,VC=Number(process.env.PG_MESSAGE_RECONSTRUCT_PAGE_SIZE)||200;function JC(e){try{let t=JSON.stringify(e);return typeof t=="string"?t.length:0}catch{return 0}}d(JC,"estimateBytes");async function Il(e){let t=e.budgetBytes??zC,n=e.pageSize??VC,r=[],o=0,s=0,i=-1;for(;;){let a=await e.fetchPage(i,n);if(s++,a.length===0)break;for(let c of a){if(Array.isArray(c.messagesDelta))for(let l of c.messagesDelta){let p=JC(l);if(o+p>t)return{messages:r,truncated:!0,bytes:o,pages:s};r.push(l),o+=p}i=c.sequence}if(a.length<n)break}return{messages:r,truncated:!1,bytes:o,pages:s}}d(Il,"reconstructMessagesBounded");Al();D();import{inArray as QC}from"drizzle-orm";async function _0(e){let t=[...new Set(e.filter(r=>typeof r=="string"&&r.length>0))];if(t.length===0)return new Map;let n=await u.select({hash:_n.hash,content:_n.content}).from(_n).where(QC(_n.hash,t));return new Map(n.map(r=>[r.hash,r.content]))}d(_0,"fetchBlobMap");async function El(e,t){return e?(await _0([e])).get(e)??t:t}d(El,"resolveBlob");async function y0(e){if(e.length===0)return e;let t=await _0(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:h0(n.toolsHash!=null?t.get(n.toolsHash):void 0,n.tools),injectedInstructions:h0(n.injectedHash!=null?t.get(n.injectedHash):void 0,n.injectedInstructions)}))}d(y0,"resolveSnapshotBlobs");function h0(e,t){return Array.isArray(e)?e:t}d(h0,"preferArray");var ZC=["x-anthropic-billing-header:","You are Claude Code, Anthropic","You are a Claude agent, built on Anthropic's Claude Agent SDK"];function w0(e){if(!e)return!1;let t=e.slice(0,400);return ZC.some(n=>t.includes(n))}d(w0,"looksLikeHarnessSystemPrompt");Of();function xl(){let e=new Map;return{run(t,n){let r=e.get(t);if(r)return r;let o=Promise.resolve().then(n).finally(()=>{e.delete(t)});return o.catch(()=>{}),e.set(t,o),o},get size(){return e.size}}}d(xl,"makeSingleFlight");var $c=new eD;$c.post("/sessions/:id/link",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),{instructionId:o}=Mc.object({instructionId:Mc.string().uuid()}).parse(r),[s]=await u.select({id:_.id}).from(_).where(Lc(kt(_.id,n),kt(_.userId,t)));return s?(await u.insert(se).values({sessionId:n,instructionId:o,linkMethod:"manual"}).onConflictDoNothing(),e.json({linked:!0})):e.json({error:"Session not found"},404)});$c.get("/instructions/:id/insights",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await u.select({sessionId:se.sessionId,analysis:_.analysis,tool:_.tool,startedAt:_.startedAt}).from(se).innerJoin(_,kt(_.id,se.sessionId)).where(Lc(kt(se.instructionId,n),kt(_.userId,t))),o=r.filter(c=>c.analysis),s=o.map(c=>c.analysis),i=s.length>0?Math.round(s.reduce((c,l)=>c+(l.adherenceScore??0),0)/s.length):null,a=s.flatMap(c=>c.suggestions??[]).filter(c=>c.instructionId===n);return e.json({instructionId:n,totalSessions:r.length,analyzedSessions:o.length,averageAdherence:i,suggestions:a})});var Sg=new Set(["claude_md","memory","skill_loaded"]);function rD(e,t){return nf(e,t)??`${e}::${t}`}d(rD,"deriveContextIdentityForAutoCreate");function v0(e,t){return e==="claude_md"?`Auto-captured CLAUDE.md: ${t}`:e==="skill_loaded"?`Auto-captured skill: ${t}`:e==="memory"?`Auto-captured memory: ${t}`:`Auto-captured context: ${t}`}d(v0,"mapContextTypeToDescription");var oD=Mc.object({sessionId:Mc.string().uuid().optional(),backfill:Mc.boolean().optional()});async function sD(e,t,n,r){for(let s=0;s<=4;s++)try{await u.execute(qi`
|
|
597
602
|
insert into instruction_version_identities
|
|
598
603
|
(instruction_id, content_hash, version_ordinal, content, first_seen_at, last_seen_at)
|
|
599
604
|
select
|
|
@@ -615,8 +620,8 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
615
620
|
first_seen_at = least(
|
|
616
621
|
instruction_version_identities.first_seen_at, excluded.first_seen_at),
|
|
617
622
|
content = coalesce(instruction_version_identities.content, excluded.content)
|
|
618
|
-
`);return}catch(i){if(i.cause?.code==="23505"&&s<4)continue;console.warn(`[link-instructions] version identity registration failed for ${e}:`,i instanceof Error?i.message:i);return}}d(
|
|
619
|
-
`):null;break}}}}if(_e=ue,
|
|
623
|
+
`);return}catch(i){if(i.cause?.code==="23505"&&s<4)continue;console.warn(`[link-instructions] version identity registration failed for ${e}:`,i instanceof Error?i.message:i);return}}d(sD,"registerVersionIdentity");async function iD(e,t){let n=await u.select({id:g.id,contentHash:g.contentHash,name:g.name,contextIdentity:g.contextIdentity,contentLen:qi`COALESCE(LENGTH(${g.content}), 0)::int`}).from(g).where(kt(g.createdBy,e)),r=new Map,o=new Map;for(let I of n){let S=Number(I.contentLen??0);I.contentHash&&r.set(I.contentHash,{id:I.id,name:I.name??"",contentLen:S}),I.contextIdentity&&o.set(I.contextIdentity,{id:I.id,name:I.name??"",contentHash:I.contentHash})}let s=await nt.selectDistinctOn([L.sessionId],{id:L.id,sessionId:L.sessionId,metadata:L.metadata}).from(L).where(t?Lc(kt(L.userId,e),kt(L.sessionId,t)):kt(L.userId,e)).orderBy(L.sessionId,nD(L.capturedAt)).limit(1e3),i=new Set,a=new Set,c=new Map,l=0,p=0,m=0,y=0,v=new Set,h=[],f=new Map;for(let I of s){if(!I.sessionId||i.has(I.sessionId))continue;i.add(I.sessionId);let A=I.metadata?.contextItems??[],E=null;async function R(){if(E)return E;let[j]=await nt.select({injectedInstructions:L.injectedInstructions,injectedHash:L.injectedHash}).from(L).where(kt(L.id,I.id)).limit(1);return E=await El(j?.injectedHash,j?.injectedInstructions??[]),E}d(R,"getInjected");async function O(){if(!I.sessionId)return[];let j=c.get(I.sessionId);if(j)return j;let P=I.sessionId,{messages:$}=await Il({fetchPage:d(async(B,ee)=>Oc(await nt.select({sequence:L.sequence,messagesDelta:L.messagesDelta,messagesDeltaRef:L.messagesDeltaRef}).from(L).where(Lc(kt(L.sessionId,P),kt(L.userId,e),qi`${L.sequence} > ${B}`)).orderBy(tD(L.sequence)).limit(ee)),"fetchPage")}),H=$;return c.set(I.sessionId,H),H}d(O,"getMessagesRaw");for(let j of A){let P=j.content_hash;if(!P)continue;a.add(P);let $=j.type??"",H=j.name??"";if(["user_input","core_system_prompt","available_tools","tool_definitions"].includes(H)||["system_reminder","system_prompt","hook_output","deferred_tools"].includes($)||["date_change","current_date","task_reminder","git_status","unknown_reminder","available_skills"].includes(H)||$==="skill_catalog"||!Sg.has($)&&!$&&!H.includes(".md")&&!H.includes("rules"))continue;let B,ee=!1,_e=null,te=r.get(P);if(te&&(B=te.id,Sg.has($)&&te.contentLen===0&&(ee=!0)),(!B||ee)&&Sg.has($)){let me=rD($,H),M=j.instruction_index,ue=null,lt=M!=null?await R():[];if(M!=null&<[M])ue=lt[M];else if($==="skill_loaded"&&j.message_index!=null){let re=await O(),he=j.message_index,C=re[he];if(C){let oe=C.content,Ce=(Array.isArray(oe)?oe.find(Te=>Te.type==="tool_use"&&(Te.name==="Skill"||Te.name==="execute_skill")):void 0)?.id;if(Ce)for(let Te=he+1;Te<re.length&&Te<he+5;Te++){let Ye=re[Te];if(Ye?.role!=="user")continue;let Ht=Ye.content;if(!Array.isArray(Ht))continue;let jr=!1,Jo=[];for(let Zr of Ht)Zr.type==="tool_result"&&Zr.tool_use_id===Ce?jr=!0:Zr.type==="text"&&jr&&Jo.push(Zr.text??"");if(jr){ue=Jo.length>0?Jo.join(`
|
|
624
|
+
`):null;break}}}}if(_e=ue,ee&&ue&&B)try{await u.update(g).set({content:ue,updatedAt:new Date}).where(kt(g.id,B)),te.contentLen=ue.length,m++}catch(re){console.warn(`[link-instructions] Content backfill failed for instruction ${B}:`,re instanceof Error?re.message:re),y++}let Be=o.get(me);if(Be&&Be.contentHash!==P){if(ue){let re=ue,he=4,C=!1;for(let oe=0;oe<=he;oe++)try{await u.transaction(async ve=>{await ve.select({id:g.id}).from(g).where(kt(g.id,Be.id)).for("update");let[{maxVersion:Ce}]=await ve.select({maxVersion:qi`COALESCE(MAX(${Ie.versionNumber}), 0)`}).from(Ie).where(kt(Ie.instructionId,Be.id)),Te=Ce+1;await ve.insert(Ie).values({instructionId:Be.id,versionNumber:Te,content:re,frontmatter:{name:H,description:v0($,H),type:"context_file",scope:"personal",version:`1.${Te}.0`},changeSummary:"Auto-detected content change from context snapshot",createdBy:e}),await ve.update(g).set({content:re,contentHash:P,version:`1.${Te}.0`,updatedAt:new Date}).where(kt(g.id,Be.id))}),C=!0;break}catch(ve){if(ve.cause?.code==="23505"&&oe<he)continue;console.warn(`[link-instructions] Version update failed for instruction ${Be.id} (identity: ${me}):`,ve instanceof Error?ve.message:ve),y++;break}C&&(r.set(P,{id:Be.id,name:Be.name,contentLen:re.length}),Be.contentHash=P,m++)}B=Be.id}else if(!Be)try{let re=H,he=v0($,H),C=ue??"",oe={name:re,description:he,type:"context_file",scope:"personal",version:"1.0.0"},ve;await u.transaction(async Ce=>{let[Te]=await Ce.insert(g).values({name:re,description:he,type:"context_file",scope:"personal",scopeRef:e,version:"1.0.0",content:C,frontmatter:oe,contentHash:P,contextIdentity:me,createdBy:e}).onConflictDoNothing().returning({id:g.id});Te&&(await Ce.insert(Ie).values({instructionId:Te.id,versionNumber:1,content:C,frontmatter:oe,changeSummary:"Auto-created from context snapshot",createdBy:e}),ve=Te.id)}),ve&&(r.set(P,{id:ve,name:re,contentLen:C.length}),o.set(me,{id:ve,name:re,contentHash:P}),B=ve,p++)}catch(re){console.warn(`[link-instructions] Auto-create failed for ${me}:`,re instanceof Error?re.message:re),y++;try{let[he]=await u.select({id:g.id}).from(g).where(Lc(kt(g.createdBy,e),kt(g.contextIdentity,me))).limit(1);he&&(B=he.id)}catch(he){console.warn(`[link-instructions] Fallback identity lookup also failed for ${me}:`,he instanceof Error?he.message:he)}}}if(!B||!I.sessionId)continue;let Re=`${B}:${P}`,N=f.get(Re);N?!N.content&&_e&&(N.content=_e):f.set(Re,{instructionId:B,contentHash:P,content:_e}),h.push({sessionId:I.sessionId,instructionId:B,linkMethod:"context_file",contentHash:P}),l++,v.add(I.sessionId)}}for(let I of f.values())await sD(I.instructionId,I.contentHash,I.content,new Date);for(let I=0;I<h.length;I+=500)try{await u.insert(se).values(h.slice(I,I+500)).onConflictDoUpdate({target:[se.sessionId,se.instructionId],set:{contentHash:qi`coalesce(${se.contentHash}, excluded.content_hash)`}})}catch(S){console.warn("[link-instructions] batched link insert failed:",S instanceof Error?S.message:S)}let w=0;for(let I of s){if(!I.sessionId)continue;let[S]=await u.select({projectId:_.projectId,projectPath:_.projectPath}).from(_).where(kt(_.id,I.sessionId)).limit(1);if(!S?.projectId||!S.projectPath)continue;let A=S.projectPath.replace(/\/$/,""),R=I.metadata?.contextItems??[];for(let O of R){let j=r.get(O.content_hash);if(!j)continue;let P=O.name??"";if(!(P.startsWith("/")&&!P.startsWith(A+"/")))try{await u.insert(at).values({projectId:S.projectId,instructionId:j.id,addedBy:e}).onConflictDoNothing(),w++}catch{}}break}let b=0;for(let[I,S]of r){if(!a.has(I)||!S.name.includes("CLAUDE")&&!S.name.includes("rules"))continue;let[A]=await u.select({id:k.id}).from(k).where(qi`${k.metadata}->>'content_hash' = ${I}`).limit(1);if(A||S.contentLen===0)continue;let[E]=await u.select({content:g.content}).from(g).where(kt(g.id,S.id)).limit(1),R=Ju(E?.content,S.name);if(R&&!w0(R))try{let[O]=await u.insert(k).values({userId:e,name:S.name,type:"instruction",content:R,description:`Auto-generated from captured context: ${S.name}`,metadata:{content_hash:I,auto_generated:!0}}).returning({id:k.id}),j=/(?:^|\n)\s*[-*]?\s*((?:NEVER|ALWAYS|MUST|DO NOT|IMPORTANT)[^\n.]+[.\n])/gi,P=[...R.matchAll(j)].map(H=>H[1].trim()).slice(0,3),$=P.length>0?P.map(H=>({name:`rule-adherence: ${H.slice(0,60)}`,prompt:`Given the instruction "${S.name}", perform a task that would test whether this rule is followed: "${H}"`,expectations:[`The response should demonstrate adherence to: ${H}`]})):[{name:`general-adherence: ${S.name}`,prompt:`Perform a typical task guided by this instruction: "${S.name}"`,expectations:["The response should follow conventions described in the instruction"]}];for(let H of $)await u.insert(Se).values({evalTargetId:O.id,name:H.name,prompt:H.prompt,expectations:H.expectations}),b++}catch{}}return{linked:l,created:p,updated:m,failed:y,sessionsLinked:v.size,instructionsMatched:r.size,snapshotsScanned:i.size,projectsLinked:w,evalsGenerated:b,scope:t?"session":"backfill"}}d(iD,"runLinkInstructions");var aD=xl();$c.post("/sessions/link-instructions",async e=>{let t=e.get("userId"),n=await e.req.json().catch(()=>({})),r=oD.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 aD.run(`${t}:${o??"*backfill*"}`,()=>iD(t,o));return e.json(i)});D();import{Hono as cD}from"hono";import{eq as ys,and as I0,sql as Tl,inArray as dD}from"drizzle-orm";var Ag=new cD;Ag.delete("/sessions/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:_.id}).from(_).where(I0(ys(_.id,n),ys(_.userId,t))).limit(1);if(!r)return e.json({error:"Session not found"},404);let[[{eventCount:o}],[{snapshotCount:s}],i]=await Promise.all([u.select({eventCount:Tl`count(*)::int`}).from(qe).where(ys(qe.sessionId,n)),u.select({snapshotCount:Tl`count(*)::int`}).from(L).where(ys(L.sessionId,n)),u.selectDistinct({ref:L.messagesDeltaRef}).from(L).where(I0(ys(L.sessionId,n),Tl`${L.messagesDeltaRef} IS NOT NULL`))]),a=i.map(m=>m.ref).filter(m=>!!m);await u.transaction(async m=>{await m.update(tt).set({sessionId:null}).where(ys(tt.sessionId,n)),await m.execute(Tl`UPDATE scaffolding_fingerprints SET first_session_id = NULL WHERE first_session_id = ${n}`),await m.delete(_).where(ys(_.id,n))});let c=0,l=0,p=0;if(a.length>0){let m=await u.selectDistinct({ref:L.messagesDeltaRef}).from(L).where(dD(L.messagesDeltaRef,a)),y=new Set(m.map(h=>h.ref)),v=a.filter(h=>!y.has(h));if(l=a.length-v.length,v.length>0)try{let{getSupabaseAdmin:h}=await Promise.resolve().then(()=>(Cc(),l0)),{SNAPSHOT_DELTA_BUCKET:f}=await Promise.resolve().then(()=>(Al(),g0)),{error:w}=await h().storage.from(f).remove(v);w?(p=v.length,console.warn(`[sessions:delete] blob GC failed for ${v.length} ref(s): ${w.message}`)):c=v.length}catch(h){p=v.length,console.warn(`[sessions:delete] blob GC unavailable: ${h.message}`)}}return e.json({deleted:!0,eventsDeleted:o,snapshotsDeleted:s,blobsDeleted:c,blobsRetained:l,blobsFailed:p})});var bo=new uD;bo.route("/",Oi);bo.route("/",Li);bo.route("/",$i);bo.route("/",$c);bo.route("/",Ag);D();import{Hono as lD}from"hono";import{eq as Eg}from"drizzle-orm";import{sql as Ui}from"drizzle-orm";var qc=new lD;async function b0(e){let[t]=await u.select({activeOrgId:T.activeOrgId}).from(T).where(Eg(T.id,e));return t?.activeOrgId??null}d(b0,"getActiveOrgId");var S0="interval '30 minutes'";qc.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 b0(t);if(!o)return e.json({projects:[],total:0});let s=await u.execute(Ui`
|
|
620
625
|
WITH session_activity AS (
|
|
621
626
|
SELECT
|
|
622
627
|
s.id,
|
|
@@ -636,7 +641,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
636
641
|
project_id,
|
|
637
642
|
COUNT(*)::int AS session_count,
|
|
638
643
|
COUNT(*) FILTER (
|
|
639
|
-
WHERE ended_at IS NULL AND last_at >= now() - ${Ui.raw(
|
|
644
|
+
WHERE ended_at IS NULL AND last_at >= now() - ${Ui.raw(S0)}
|
|
640
645
|
)::int AS active_session_count,
|
|
641
646
|
MAX(last_at) AS last_activity_at
|
|
642
647
|
FROM session_activity
|
|
@@ -668,7 +673,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
668
673
|
WHERE s.org_id = ${o}
|
|
669
674
|
AND s.origin <> 'internal_worker'
|
|
670
675
|
AND s.project_id IS NOT NULL
|
|
671
|
-
`);return e.json({projects:s.map(a=>({id:a.id,name:a.name,description:a.description,gitRemoteUrl:a.git_remote_url,githubRepo:a.github_repo,createdAt:a.created_at,sessionCount:a.session_count,activeSessionCount:a.active_session_count,lastActivityAt:a.last_activity_at,primaryCheckoutPath:a.primary_checkout_path})),total:i})})
|
|
676
|
+
`);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})});qc.get("/projects/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await b0(t);if(!r)return e.json({error:"No active org"},404);let[o]=await u.select().from(U).where(Eg(U.id,n));if(!o)return e.json({error:"Project not found"},404);let[{has_session:s}={has_session:!1}]=await u.execute(Ui`
|
|
672
677
|
SELECT EXISTS(
|
|
673
678
|
SELECT 1 FROM sessions
|
|
674
679
|
WHERE project_id = ${n} AND org_id = ${r} AND origin <> 'internal_worker'
|
|
@@ -688,11 +693,11 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
688
693
|
SELECT
|
|
689
694
|
COUNT(*)::int AS session_count,
|
|
690
695
|
COUNT(*) FILTER (
|
|
691
|
-
WHERE ended_at IS NULL AND last_at >= now() - ${Ui.raw(
|
|
696
|
+
WHERE ended_at IS NULL AND last_at >= now() - ${Ui.raw(S0)}
|
|
692
697
|
)::int AS active_session_count,
|
|
693
698
|
MAX(last_at) AS last_activity_at
|
|
694
699
|
FROM session_activity
|
|
695
|
-
`),a=await u.select({path:le.path,isWorktree:le.isWorktree,firstSeen:le.firstSeen,lastSeen:le.lastSeen}).from(le).where(
|
|
700
|
+
`),a=await u.select({path:le.path,isWorktree:le.isWorktree,firstSeen:le.firstSeen,lastSeen:le.lastSeen}).from(le).where(Eg(le.projectId,n));return a.sort((c,l)=>{let p=c.lastSeen?.getTime()??0;return(l.lastSeen?.getTime()??0)-p}),e.json({id:o.id,name:o.name,description:o.description,gitRemoteUrl:o.gitRemoteUrl,githubRepo:o.githubRepo,createdAt:o.createdAt,sessionCount:i?.session_count??0,activeSessionCount:i?.active_session_count??0,lastActivityAt:i?.last_activity_at??null,primaryCheckoutPath:a[0]?.path??null,checkouts:a})});D();import{Hono as pD}from"hono";import{z as Dn}from"zod";import{eq as ut,and as So,sql as A0,desc as mD,inArray as fD}from"drizzle-orm";var fr=new pD,gD=Dn.object({name:Dn.string().min(1).max(255),description:Dn.string().min(1),scope:Dn.enum(["org","team","personal"]),scopeRef:Dn.string().uuid().optional(),version:Dn.string().default("1.0.0"),tags:Dn.array(Dn.string()).optional()});fr.get("/packs",async e=>{let t=e.get("userId"),n=e.req.query("scope"),r=parseInt(e.req.query("limit")??"100",10),o=[ut(Le.archived,!1),ut(Le.createdBy,t)];n&&o.push(ut(Le.scope,n));let s=await u.select().from(Le).where(So(...o)).orderBy(mD(Le.updatedAt)).limit(r),i=s.map(c=>c.id),a={};if(i.length>0){let c=await u.select({packId:De.packId,count:A0`COUNT(*)::int`}).from(De).where(fD(De.packId,i)).groupBy(De.packId);for(let l of c)a[l.packId]=l.count}return e.json(s.map(c=>{let l=a[c.id]??0;return{...c,instructionCount:l,tier:cc(l)}}))});fr.get("/packs/:id",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await u.select().from(Le).where(So(ut(Le.id,t),ut(Le.createdBy,n),ut(Le.archived,!1)));if(!r)return e.json({error:"Pack not found"},404);let o=await u.select({instruction:g,position:De.position,slotOverrides:De.slotOverrides,addedAt:De.addedAt}).from(De).innerJoin(g,ut(De.instructionId,g.id)).where(ut(De.packId,t)).orderBy(De.position),s=o.length;return e.json({...r,instructionCount:s,tier:cc(s),instructions:o.map(i=>({...i.instruction,position:i.position,slotOverrides:i.slotOverrides,addedAt:i.addedAt}))})});fr.post("/packs",async e=>{let t=e.get("userId"),n=await e.req.json(),r=gD.parse(n),o=r.scope==="personal"?t:r.scopeRef??null,[s]=await u.insert(Le).values({name:r.name,description:r.description,scope:r.scope,scopeRef:o,version:r.version,tags:r.tags??[],createdBy:t}).returning();return e.json({...s,instructionCount:0,tier:cc(0)},201)});fr.post("/packs/:id/instructions",async e=>{let t=e.req.param("id"),n=e.get("userId"),r=await e.req.json(),{instructionId:o}=Dn.object({instructionId:Dn.string().uuid()}).parse(r),[s]=await u.select().from(Le).where(So(ut(Le.id,t),ut(Le.createdBy,n),ut(Le.archived,!1)));if(!s)return e.json({error:"Pack not found"},404);let[i]=await u.select().from(De).where(So(ut(De.packId,t),ut(De.instructionId,o)));if(i)return e.json({error:"Instruction already in this pack"},409);let[a]=await u.select({max:A0`COALESCE(MAX(${De.position}), -1)`}).from(De).where(ut(De.packId,t)),[c]=await u.insert(De).values({packId:t,instructionId:o,position:(a?.max??-1)+1,addedBy:n}).returning();return e.json(c,201)});fr.delete("/packs/:id/instructions/:instructionId",async e=>{let t=e.req.param("id"),n=e.get("userId"),r=e.req.param("instructionId"),[o]=await u.select({id:Le.id}).from(Le).where(So(ut(Le.id,t),ut(Le.createdBy,n),ut(Le.archived,!1)));return o?(await u.delete(De).where(So(ut(De.packId,t),ut(De.instructionId,r))).returning()).length===0?e.json({error:"Instruction not in this pack"},404):e.json({success:!0}):e.json({error:"Pack not found"},404)});fr.post("/packs/:id/apply",async e=>{let t=e.req.param("id"),n=e.get("userId"),r=await e.req.json(),{projectId:o}=Dn.object({projectId:Dn.string().uuid()}).parse(r),s=await u.select({instructionId:De.instructionId}).from(De).where(ut(De.packId,t));if(s.length===0)return e.json({error:"Pack has no instructions"},400);let i=0;for(let a of s){let[c]=await u.select().from(at).where(So(ut(at.projectId,o),ut(at.instructionId,a.instructionId)));c||(await u.insert(at).values({projectId:o,instructionId:a.instructionId,addedBy:n}),i++)}return e.json({success:!0,linked:i,total:s.length})});fr.post("/packs/:id/fork",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(Le).where(So(ut(Le.id,n),ut(Le.archived,!1)));if(!r)return e.json({error:"Pack not found"},404);if(r.createdBy===t)return e.json({error:"Cannot fork your own pack"},400);let[o]=await u.insert(Le).values({name:`${r.name} (fork)`,description:r.description,scope:"personal",scopeRef:t,version:"1.0.0",tags:r.tags,createdBy:t,forkedFromId:r.id,upstreamVersion:r.version}).returning(),s=await u.select().from(De).where(ut(De.packId,n));return s.length>0&&await u.insert(De).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 hD}from"hono";import{eq as xg,and as _D,sql as E0}from"drizzle-orm";var Rl=new hD;function x0(e){return{id:e.id,name:e.name,forkedFromId:e.forked_from_id,version:e.version,scope:e.scope,createdBy:e.created_by,createdAt:e.created_at,depth:e.depth}}d(x0,"mapRow");Rl.get("/instructions/:id/lineage",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:g.id,name:g.name,forkedFromId:g.forkedFromId,version:g.version,scope:g.scope,createdBy:g.createdBy,createdAt:g.createdAt}).from(g).where(_D(xg(g.id,n),xg(g.archived,!1),xg(g.createdBy,t)));if(!r)return e.json({error:"Instruction not found"},404);let o=r.forkedFromId?await u.execute(E0`
|
|
696
701
|
WITH RECURSIVE ancestors AS (
|
|
697
702
|
SELECT id, name, forked_from_id, version, scope, created_by, created_at::text, 1 as depth
|
|
698
703
|
FROM instructions
|
|
@@ -705,7 +710,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
705
710
|
WHERE i.archived = false AND a.depth < 20
|
|
706
711
|
)
|
|
707
712
|
SELECT * FROM ancestors ORDER BY depth DESC
|
|
708
|
-
`):[],s=await u.execute(
|
|
713
|
+
`):[],s=await u.execute(E0`
|
|
709
714
|
WITH RECURSIVE descendants AS (
|
|
710
715
|
SELECT id, name, forked_from_id, version, scope, created_by, created_at::text, 1 as depth
|
|
711
716
|
FROM instructions
|
|
@@ -718,7 +723,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
718
723
|
WHERE i.archived = false AND d.depth < 20
|
|
719
724
|
)
|
|
720
725
|
SELECT * FROM descendants ORDER BY depth ASC
|
|
721
|
-
`),i=Array.isArray(o)?o.map(
|
|
726
|
+
`),i=Array.isArray(o)?o.map(x0):[],a=s.map(x0);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 vD}from"hono";import{z as ws}from"zod";import{eq as Ao,and as Bc,desc as Rg,gt as kg,lt as ID,sql as rn}from"drizzle-orm";function Hc(e){let t=e?.llmEngines;if(!t||typeof t!="object")return null;let n=t;return{claude:n.claude===!0,codex:n.codex===!0}}d(Hc,"reportedEngines");var yD=10;function jl(e,t){let n=d(m=>e.capabilities===null||e.capabilities.includes(m),"claims"),r=e.engines!=null&&!e.engines.claude&&!e.engines.codex,o=t.filter(m=>n(m.kind)),s=t.filter(m=>!n(m.kind)),i=r?o.filter(m=>ku(m.kind)):[],a=r?o.filter(m=>!ku(m.kind)):o,c=[],l,p;return e.present?e.active?i.length>0?(l="fail",p=`Worker is online but no LLM engine is installed \u2014 ${Uc(i)} job(s) cannot produce real output (${kl(i)}).`,c.push("Install one on the machine running the worker: `claude` (npm i -g @anthropic-ai/claude-code) or `codex`, then `rulemetric worker:restart`."),c.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."),c.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 ${Uc(a)} more queued behind it.`:"Worker is online and running a job."):a.some(m=>m.oldestMinutes>=yD)?(l="warn",p=`Worker is online but its queue is not draining \u2014 ${Uc(a)} job(s) pending (${kl(a)}).`,c.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 ${wD(e.ageSeconds)} ago.`,c.push("Restart it: `rulemetric service install --worker-only`"),c.push("If it keeps dying, `launchctl list | grep rulemetric` shows the exit status."),a.length>0&&c.push(`${Uc(a)} job(s) are waiting on it (${kl(a)}) \u2014 they will drain once it is back.`)):(l="fail",p="No worker has ever connected \u2014 nothing is analyzing your sessions.",c.push("Start one: `rulemetric service install --worker-only`"),c.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"),c.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"),c.push(`${Uc(s)} job(s) cannot be claimed by this worker (${kl(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:c,stuck:a,unclaimable:s,engineBlocked:i}}d(jl,"assessWorkerHealth");function Uc(e){return e.reduce((t,n)=>t+n.count,0)}d(Uc,"totalOf");function kl(e){return e.map(t=>`${t.kind}\xD7${t.count}`).join(", ")}d(kl,"describe");function wD(e){if(e===null)return"never";if(e<90)return`${Math.round(e)}s`;let t=Math.round(e/60);return t<90?`${t}m`:`${Math.round(t/60)}h`}d(wD,"formatAge");var Tg=[{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'"}],T0=Tg.map(({table:e,defaultKind:t})=>({table:e,defaultKind:t}));var Hi=new vD,jg=6e4,R0=600*1e3,Ng=3600*1e3,bD=10080*60*1e3,SD={"cli-worker":["process_eval","process_insights","process_launch","process_send_message","process_conversation","process_session_goal","distill_memories","memory_ab","process_run_cleanup","cron_suggest_instructions","cron_refresh_skills","cron_refresh_pricing","cron_eval_autorun","cron_auto_accept_suggestions","cron_instruction_training","cron_instruction_evolution","process_judge_review"]},AD=new Set([]),ED=ws.object({workerType:ws.enum(["mcp","cli-worker","gateway","proxy"]),clientName:ws.string().min(1),clientVersion:ws.string().optional(),workerVersion:ws.string().optional(),metadata:ws.record(ws.unknown()).optional()}),Pg=T0;async function xD(e,t=0){let n=new Date(Date.now()-t).toISOString(),r=Pg.map(({table:i,defaultKind:a})=>rn`
|
|
722
727
|
SELECT coalesce(task_kind, ${a}) AS kind,
|
|
723
728
|
count(*)::int AS n,
|
|
724
729
|
min(created_at) AS oldest
|
|
@@ -727,14 +732,14 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
727
732
|
AND status = 'pending'
|
|
728
733
|
AND created_at < ${n}::timestamptz
|
|
729
734
|
GROUP BY 1
|
|
730
|
-
`),o=await u.execute(rn`${rn.join(r,rn` UNION ALL `)} ORDER BY oldest ASC`),s=Date.now();return o.map(i=>({kind:i.kind,count:Number(i.n),oldestMinutes:Math.round((s-new Date(i.oldest).getTime())/6e4)}))}d(
|
|
735
|
+
`),o=await u.execute(rn`${rn.join(r,rn` UNION ALL `)} ORDER BY oldest ASC`),s=Date.now();return o.map(i=>({kind:i.kind,count:Number(i.n),oldestMinutes:Math.round((s-new Date(i.oldest).getTime())/6e4)}))}d(xD,"queryPendingKinds");async function k0(e){return(await u.execute(rn`${rn.join(Pg.map(({table:n})=>rn`
|
|
731
736
|
SELECT count(*)::int AS n
|
|
732
737
|
FROM ${rn.raw(n)}
|
|
733
738
|
WHERE user_id = ${e}
|
|
734
739
|
AND status IN ('claimed', 'running')
|
|
735
740
|
AND lease_expires_at IS NOT NULL
|
|
736
741
|
AND lease_expires_at > now()
|
|
737
|
-
`),rn` UNION ALL `)}`)).reduce((n,r)=>n+Number(r.n),0)>0}d(
|
|
742
|
+
`),rn` UNION ALL `)}`)).reduce((n,r)=>n+Number(r.n),0)>0}d(k0,"hasLiveInFlightJob");async function TD(e,t){let n=new Date(Date.now()-R0).toISOString(),r=Pg.map(({table:p,defaultKind:m})=>rn`
|
|
738
743
|
SELECT coalesce(task_kind, ${m}) AS kind,
|
|
739
744
|
count(*)::int AS n,
|
|
740
745
|
min(created_at) AS oldest
|
|
@@ -743,7 +748,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
743
748
|
AND status = 'pending'
|
|
744
749
|
AND created_at < ${n}::timestamptz
|
|
745
750
|
GROUP BY 1
|
|
746
|
-
`),o=await u.execute(rn`${rn.join(r,rn` UNION ALL `)} ORDER BY oldest ASC`),s=t===null?o:o.filter(p=>t.includes(p.kind));if(s.length===0||await
|
|
751
|
+
`),o=await u.execute(rn`${rn.join(r,rn` UNION ALL `)} ORDER BY oldest ASC`),s=t===null?o:o.filter(p=>t.includes(p.kind));if(s.length===0||await k0(e))return null;let i=s.reduce((p,m)=>p+Number(m.n),0),a=Date.now()-new Date(s[0].oldest).getTime(),c=Math.round(a/6e4),l=s.map(p=>`${p.kind}\xD7${p.n}`).join(", ");return{code:"STALE_PENDING",message:`${i} job(s) pending >${Math.round(R0/6e4)}m (oldest ${c}m: ${l}). The worker is heartbeating but its queue isn't draining \u2014 check for a wedged handler or restart it.`,meta:{total:i,oldestMinutes:c,byKind:s.map(p=>({kind:p.kind,count:Number(p.n)}))}}}d(TD,"checkStalePendingAdvisory");function Cg(e){return!e||!Array.isArray(e.capabilities)?null:e.capabilities.filter(t=>typeof t=="string")}d(Cg,"reportedCapabilities");function RD(e,t){if(e!=="cli-worker")return null;let n=Hc(t);if(n===null||n.claude||n.codex)return null;let r=Cg(t),o=r===null?[...pc]:r.filter(s=>pc.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}}}d(RD,"checkEngineAdvisory");function kD(e,t){let n=SD[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)&&!AD.has(s));return o.length>0?{code:"MISSING_CAPABILITIES",message:`Worker is missing capabilities: ${o.join(", ")}. Jobs of those kinds will sit pending. Restart the worker after deploying API updates.`}:null}d(kD,"checkWorkerAdvisory");Hi.post("/workers/heartbeat",async e=>{let t=e.get("userId"),n=await e.req.json(),r=ED.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(Bc(Ao(fe.userId,t),ID(fe.lastHeartbeat,new Date(Date.now()-bD)))).catch(()=>{});let o=kD(r.workerType,r.metadata);return o??=RD(r.workerType,r.metadata),!o&&r.workerType==="cli-worker"&&(o=await TD(t,Cg(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 j0(e){let t=new Date(Date.now()-Ng),n=await u.select({lastHeartbeat:fe.lastHeartbeat}).from(fe).where(Bc(Ao(fe.userId,e),Ao(fe.workerType,"cli-worker"),kg(fe.lastHeartbeat,t))),r=Date.now();return{cliEverConnected:n.length>0,workerActive:n.some(o=>r-new Date(o.lastHeartbeat).getTime()<jg)}}d(j0,"computeCliWorkerSetupSignals");async function Nl(e){let t=await u.select({lastHeartbeat:fe.lastHeartbeat,metadata:fe.metadata}).from(fe).where(Bc(Ao(fe.userId,e),Ao(fe.workerType,"cli-worker"))).orderBy(Rg(fe.lastHeartbeat)).limit(10);for(let n of t){let r=n.metadata?.llmEngines;if(r&&typeof r=="object"){let o=r;return{claude:o.claude===!0,codex:o.codex===!0,codexModel:typeof o.codexModel=="string"?o.codexModel:null,observedAt:new Date(n.lastHeartbeat).toISOString()}}}return null}d(Nl,"getLatestLlmEngines");Hi.get("/workers/status",async e=>{let t=e.get("userId"),n=new Date(Date.now()-Ng),r=await u.select().from(fe).where(Bc(Ao(fe.userId,t),kg(fe.lastHeartbeat,n))).orderBy(Rg(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<jg?"active":"inactive"}});return e.json(s)});Hi.get("/workers/health",async e=>{let t=e.get("userId"),n=new Date(Date.now()-Ng),[r,o,s]=await Promise.all([u.select({lastHeartbeat:fe.lastHeartbeat,clientName:fe.clientName,clientVersion:fe.clientVersion,metadata:fe.metadata}).from(fe).where(Bc(Ao(fe.userId,t),Ao(fe.workerType,"cli-worker"),kg(fe.lastHeartbeat,n))).orderBy(Rg(fe.lastHeartbeat)).limit(1),xD(t),k0(t)]),i=r[0],a=i?Date.now()-new Date(i.lastHeartbeat).getTime():null,c=i?i.metadata??void 0:void 0,l={present:i!=null,active:a!=null&&a<jg,ageSeconds:a==null?null:Math.round(a/1e3),capabilities:i?Cg(c):null,busy:s,engines:i?Hc(c):null},p=jl(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 jD}from"hono";import{z as Dg}from"zod";import{and as Og,desc as N0,eq as gr,inArray as ND,isNull as PD,sql as rt}from"drizzle-orm";var Fc=new jD,CD=Dg.object({limit:Dg.coerce.number().int().min(1).max(100).default(20),hours:Dg.coerce.number().int().min(1).max(168).default(24)}),DD=6e4,OD=3600*1e3;function P0(e,t){return rt.join(Tg.map(({table:n,defaultKind:r,labelIdSql:o,labelTextSql:s})=>rt`
|
|
747
752
|
SELECT id::text AS id,
|
|
748
753
|
${n} AS source_table,
|
|
749
754
|
coalesce(task_kind, ${r}) AS kind,
|
|
@@ -760,8 +765,8 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
760
765
|
result->>'decision' AS decision,
|
|
761
766
|
error
|
|
762
767
|
FROM ${rt.raw(n)}
|
|
763
|
-
WHERE user_id = ${e}::uuid AND ${t}`),rt` UNION ALL `)}d(
|
|
764
|
-
AND completed_at > now() - make_interval(hours => ${o})`),[a,c,l]=await Promise.all([u.execute(rt`${s} ORDER BY created_at ASC`),u.execute(rt`${i} ORDER BY completed_at DESC LIMIT ${r}`),u.execute(rt`SELECT count(*)::int AS n FROM (${i}) q`)]),p=[...new Set([...a,...c].map(N=>N.label_id).filter(N=>!!N))],m=new Map;if(p.length>0){let N=await u.select({id:k.id,name:k.name}).from(k).where(
|
|
768
|
+
WHERE user_id = ${e}::uuid AND ${t}`),rt` UNION ALL `)}d(P0,"jobSelect");Fc.post("/loop/run-now",async e=>{let t=d(async n=>{try{let r=await nt.execute(rt`SELECT ${rt.raw(n)}() AS r`);return String(r[0]?.r??"0")}catch(r){return`error: ${r instanceof Error?r.message:String(r)}`}},"run");return e.json({insights:await t("regenerate_insights_jobs"),training:await t("enqueue_instruction_training"),autoAccept:await t("enqueue_auto_accept_suggestions"),evolution:await t("enqueue_instruction_evolution"),autorun:await t("enqueue_eval_autorun")})});Fc.get("/loop/status",async e=>{let t=e.get("userId"),n=CD.safeParse({limit:e.req.query("limit"),hours:e.req.query("hours")});if(!n.success)return e.json({error:"Invalid query",details:n.error.flatten()},400);let{limit:r,hours:o}=n.data,s=P0(t,rt`status IN ('pending', 'claimed', 'running')`),i=P0(t,rt`status IN ('completed', 'failed')
|
|
769
|
+
AND completed_at > now() - make_interval(hours => ${o})`),[a,c,l]=await Promise.all([u.execute(rt`${s} ORDER BY created_at ASC`),u.execute(rt`${i} ORDER BY completed_at DESC LIMIT ${r}`),u.execute(rt`SELECT count(*)::int AS n FROM (${i}) q`)]),p=[...new Set([...a,...c].map(N=>N.label_id).filter(N=>!!N))],m=new Map;if(p.length>0){let N=await u.select({id:k.id,name:k.name}).from(k).where(ND(k.id,p));for(let me of N)m.set(me.id,me.name)}let y=Date.now(),v=d(N=>(N.label_id?m.get(N.label_id)??null:null)??N.label_text,"label"),h=a.filter(N=>N.status==="claimed"||N.status==="running").map(N=>({id:N.id,kind:N.kind,label:v(N),claimedAt:N.claimed_at,elapsedSeconds:N.claimed_at?Math.round((y-new Date(N.claimed_at).getTime())/1e3):null,leaseHealthy:N.lease_expires_at?new Date(N.lease_expires_at).getTime()>y:!1})),f=a.filter(N=>N.status==="pending").map(N=>({id:N.id,kind:N.kind,label:v(N),createdAt:N.created_at,waitedSeconds:Math.round((y-new Date(N.created_at).getTime())/1e3),attempts:N.attempts})),w=c.map(N=>({id:N.id,kind:N.kind,label:v(N),finishedAt:N.completed_at,durationSeconds:N.claimed_at&&N.completed_at?Math.round((new Date(N.completed_at).getTime()-new Date(N.claimed_at).getTime())/1e3):null,outcome:N.status==="failed"?"failed":N.skipped?"skipped":N.decision?"decided":"ok",reason:N.skipped??N.decision??(N.status==="failed"?"failed":null),detail:N.reason??N.error??null})),b=await u.select({id:ie.id,evalTargetId:ie.evalTargetId,targetName:k.name,createdAt:ie.createdAt,decision:ie.decision,applied:ie.applied,effectClass:ie.effectClass,proposalSource:ie.proposalSource}).from(ie).leftJoin(k,gr(ie.evalTargetId,k.id)).where(gr(ie.userId,t)).orderBy(N0(ie.createdAt)).limit(r),I=u.execute(rt`
|
|
765
770
|
SELECT count(*)::int AS decisions,
|
|
766
771
|
count(*) FILTER (WHERE p.applied)::int AS applied,
|
|
767
772
|
count(*) FILTER (WHERE p.decision = 'promote')::int AS promote,
|
|
@@ -796,7 +801,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
796
801
|
FROM instruction_promotions p
|
|
797
802
|
LEFT JOIN eval_targets t ON t.id = p.eval_target_id
|
|
798
803
|
WHERE p.user_id = ${t}::uuid
|
|
799
|
-
`),S=u.select({proposed:rt`count(*)::int`,accepted:rt`count(*) filter (where ${x.acceptedAt} is not null)::int`,lastAcceptedAt:rt`max(${x.acceptedAt})::text`}).from(x).where(gr(x.userId,t)),[A,E,R,D]=await Promise.all([u.select({n:rt`count(*)::int`}).from(ie).where(gr(ie.userId,t)),u.select({n:rt`count(*)::int`}).from(q).where(Ng(gr(q.userId,t),gr(q.status,"running"))),u.select({kind:x.kind,n:rt`count(*)::int`}).from(x).where(Ng(gr(x.userId,t),xO(x.dismissedAt))).groupBy(x.kind),u.select({entries:rt`count(*)::int`,distinct:rt`count(distinct ${Ee.contentHash})::int`,repeated:rt`count(*) filter (where ${Ee.timesGenerated} > 1)::int`,dismissed:rt`count(*) filter (where ${Ee.dismissedAt} is not null)::int`,maxTimesGenerated:rt`coalesce(max(${Ee.timesGenerated}), 0)::int`,lastSeenAt:rt`max(${Ee.lastSeenAt})`}).from(Ee).where(gr(Ee.userId,t))]),[j,P]=await Promise.all([I,S]),$=j[0],H=P[0],te=(await u.select({lastHeartbeat:fe.lastHeartbeat,clientName:fe.clientName,clientVersion:fe.clientVersion,metadata:fe.metadata}).from(fe).where(Ng(gr(fe.userId,t),gr(fe.workerType,"cli-worker"),rt`${fe.lastHeartbeat} > ${new Date(y-kO).toISOString()}::timestamptz`)).orderBy(R0(fe.lastHeartbeat)).limit(1))[0],_e=te?y-new Date(te.lastHeartbeat).getTime():null,ee=f.map(N=>({kind:N.kind,count:1,oldestMinutes:Math.round(N.waitedSeconds/60)})),Re={present:te!=null,active:_e!=null&&_e<RO,ageSeconds:_e==null?null:Math.round(_e/1e3),capabilities:null,busy:h.length>0};return e.json({worker:{present:Re.present,active:Re.active,ageSeconds:Re.ageSeconds,clientName:te?.clientName??null,clientVersion:te?.clientVersion??null,lastHeartbeat:te?.lastHeartbeat??null},verdict:xl(Re,ee),running:h,queued:f,recent:w,recentTotal:l[0]?.n??0,proposals:b,proposalTotal:A[0]?.n??0,changes:{decisions:$?.decisions??0,applied:$?.applied??0,byDecision:{promote:$?.promote??0,revert:$?.revert??0,refuse:$?.refuse??0},readyToApply:$?.ready_to_apply??0,readyToApplyTargetId:$?.ready_to_apply_target_id??null,readyToApplyPromotionId:$?.ready_to_apply_promotion_id??null,lastAppliedAt:$?.last_applied_at??null,lastDecidedAt:$?.last_decided_at??null,suggestionsProposed:H?.proposed??0,suggestionsAccepted:H?.accepted??0,lastAcceptedAt:H?.lastAcceptedAt??null},counts:{experimentsRunning:E[0]?.n??0,suggestions:Object.fromEntries(R.map(N=>[N.kind,N.n]))},insights:{entries:D[0]?.entries??0,distinct:D[0]?.distinct??0,repeated:D[0]?.repeated??0,dismissed:D[0]?.dismissed??0,maxTimesGenerated:D[0]?.maxTimesGenerated??0,lastSeenAt:D[0]?.lastSeenAt??null},windowHours:o})});O();import{Hono as NO}from"hono";import{z as On}from"zod";import{and as PO,eq as Xn,sql as Eo}from"drizzle-orm";O();import{and as jO,eq as j0}from"drizzle-orm";async function Ke(e,t){let[n]=await u.select({id:k.id}).from(k).where(jO(j0(k.id,e),j0(k.userId,t)));return n}d(Ke,"verifyTargetOwnership");function Hc(e){return e===!0||e==="true"}d(Hc,"flagOn");function Rl(e,t=!1){let n=e??{},r=n.autoEvolvePairs,o=typeof r=="number"?r:typeof r=="string"?Number(r):NaN,s=Number.isFinite(o)&&o>=1,i=Hc(n.autoEvolvePaused);return{enabled:Hc(n.autoEvolveEnabled),optOut:Hc(n.autoEvolveOptOut),apply:Hc(n.autoEvolveApply),paused:t||i,pausedBy:t?"account":i?"target":null,pairs:s?Math.min(128,Math.max(10,Math.floor(o))):10,pairsConfigured:s,accumulate:Hc(n.autoEvolveAccumulate)}}d(Rl,"resolveEvolutionSettings");function N0(e,t){let n={...e??{}};return t.enabled!==void 0&&(n.autoEvolveEnabled=t.enabled),t.optOut!==void 0&&(n.autoEvolveOptOut=t.optOut),t.apply!==void 0&&(n.autoEvolveApply=t.apply),t.paused!==void 0&&(n.autoEvolvePaused=t.paused),t.accumulate!==void 0&&(n.autoEvolveAccumulate=t.accumulate),t.pairs!==void 0&&(n.autoEvolvePairs=Math.min(128,Math.max(10,Math.floor(t.pairs)))),n}d(N0,"applyEvolutionPatch");function kl(e){if(e.paused)return e.pausedBy==="account"?"Paused for the whole account \u2014 no instruction is measured or rewritten.":"Paused \u2014 no model budget is spent, and the opt-in is kept.";if(e.optOut&&!e.enabled)return"Opted out \u2014 this instruction is never enrolled automatically.";let t=e.enabled?"Enrolled manually":"Eligible for automatic enrolment",n=e.apply?"a promote MAY rewrite the file":"decisions are recorded only, nothing is written";return`${t}; ${n}. Needs ${e.pairs} paired tasks before it can act.`}d(kl,"describeEvolutionState");var hr=new NO,CO=On.object({enabled:On.boolean(),projectId:On.string().uuid().optional()});hr.get("/settings/auto-accept",async e=>{let t=e.get("userId"),n=e.req.query("projectId")??null,[r]=await u.select({enabled:T.autoAcceptSuggestions}).from(T).where(Xn(T.id,t)),o=null;if(n){let[i]=await u.select({raw:Eo`${U.metadata}->>'autoAcceptSuggestions'`}).from(U).where(Xn(U.id,n));i?.raw!=null&&(o=i.raw==="true")}let s=await Vu(t,n);return e.json({effective:s.allowed,source:s.source,accountDefault:r?.enabled??!0,projectOverride:o,limits:{minScore:Dt.MIN_SCORE,maxPerRun:Dt.MAX_PER_RUN,maxPerWindow:Dt.MAX_PER_WINDOW,windowDays:Dt.WINDOW_DAYS,kind:Dt.KIND}})});hr.patch("/settings/auto-accept",async e=>{let t=e.get("userId"),n=CO.safeParse(await e.req.json().catch(()=>({})));if(!n.success)return e.json({error:n.error.flatten()},400);let{enabled:r,projectId:o}=n.data;return o?(await u.update(U).set({metadata:Eo`coalesce(${U.metadata}, '{}'::jsonb) || jsonb_build_object('autoAcceptSuggestions', ${r}::boolean)`}).where(Xn(U.id,o)).returning({id:U.id})).length===0?e.json({error:"Project not found"},404):e.json({scope:"project",projectId:o,enabled:r}):(await u.update(T).set({autoAcceptSuggestions:r}).where(Xn(T.id,t)),e.json({scope:"account",enabled:r}))});var OO=On.object({enabled:On.boolean().optional(),optOut:On.boolean().optional(),apply:On.boolean().optional(),paused:On.boolean().optional(),accumulate:On.boolean().optional(),pairs:On.number().int().min(1).max(1e3).optional()}).refine(e=>Object.keys(e).length>0,{message:"no settings supplied"});async function jl(e){let[t]=await u.select({paused:T.evolutionPaused}).from(T).where(Xn(T.id,e));return t?.paused??!1}d(jl,"readAccountPaused");var DO=On.object({paused:On.boolean()});hr.get("/settings/evolution-account",async e=>{let t=e.get("userId");return e.json({paused:await jl(t)})});hr.patch("/settings/evolution-account",async e=>{let t=e.get("userId"),n=DO.safeParse(await e.req.json().catch(()=>({})));return n.success?(await u.update(T).set({evolutionPaused:n.data.paused}).where(Xn(T.id,t)),e.json({paused:n.data.paused})):e.json({error:n.error.flatten()},400)});hr.get("/settings/evolution/targets",async e=>{let t=e.get("userId"),n=await jl(t),o=(await u.select({id:k.id,name:k.name,autoEvolveEnabled:Eo`${k.metadata}->>'autoEvolveEnabled'`,autoEvolveOptOut:Eo`${k.metadata}->>'autoEvolveOptOut'`,autoEvolveApply:Eo`${k.metadata}->>'autoEvolveApply'`,autoEvolvePaused:Eo`${k.metadata}->>'autoEvolvePaused'`,autoEvolveAccumulate:Eo`${k.metadata}->>'autoEvolveAccumulate'`,autoEvolvePairs:Eo`${k.metadata}->>'autoEvolvePairs'`}).from(k).where(PO(Xn(k.userId,t),Xn(k.type,"instruction"))).orderBy(k.name)).map(i=>{let a=Rl(i,n);return{evalTargetId:i.id,name:i.name,settings:a,summary:kl(a)}}),s=o.filter(i=>i.settings.enabled||i.settings.apply||i.settings.paused||i.settings.optOut||i.settings.accumulate||i.settings.pairsConfigured);return e.json({targets:s,accountPaused:n,limits:{minPairs:10,maxPairs:128},totalInstructionTargets:o.length,unconfigured:o.length-s.length,writable:s.filter(i=>i.settings.apply&&!i.settings.paused).length})});hr.get("/settings/evolution",async e=>{let t=e.get("userId"),n=e.req.query("evalTargetId");if(!n)return e.json({error:"evalTargetId is required"},400);if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let[o]=await u.select({name:k.name,metadata:k.metadata}).from(k).where(Xn(k.id,n));if(!o)return e.json({error:"Eval target not found"},404);let s=Rl(o.metadata,await jl(t));return e.json({evalTargetId:n,name:o.name,settings:s,summary:kl(s),limits:{minPairs:10,maxPairs:128}})});hr.patch("/settings/evolution",async e=>{let t=e.get("userId"),n=e.req.query("evalTargetId");if(!n)return e.json({error:"evalTargetId is required"},400);let r=OO.safeParse(await e.req.json().catch(()=>({})));if(!r.success)return e.json({error:r.error.flatten()},400);if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let[s]=await u.select({metadata:k.metadata}).from(k).where(Xn(k.id,n));if(!s)return e.json({error:"Eval target not found"},404);let i=N0(s.metadata,r.data);await u.update(k).set({metadata:i}).where(Xn(k.id,n));let a=Rl(i,await jl(t));return e.json({evalTargetId:n,settings:a,summary:kl(a)})});O();import{Hono as MO}from"hono";import{and as LO,eq as $O,sql as qO}from"drizzle-orm";var Nl=new MO;Nl.get("/setup/status",async e=>{let t=e.get("userId"),[n,r,o]=await Promise.all([T0(t),u.select({id:_.id}).from(_).where(LO($O(_.userId,t),qO`${_.origin} <> 'internal_worker'`)).limit(1),Tl(t)]);return e.json({cliEverConnected:n.cliEverConnected,anyCapturedSession:r.length>0,workerActive:n.workerActive,llmEngines:o})});O();import{createHash as UO}from"node:crypto";import{Hono as HO}from"hono";import{z as An}from"zod";import{eq as _r,and as Pl,desc as BO,sql as FO}from"drizzle-orm";var xo=new HO,WO=An.object({name:An.string().min(1).max(255),type:An.enum(["instruction","skill","prompt","plan"]),content:An.string().min(1),description:An.string().default(""),metadata:An.record(An.unknown()).default({})}),zO=An.object({name:An.string().min(1).max(255).optional(),content:An.string().min(1).optional(),description:An.string().optional(),metadata:An.record(An.unknown()).optional()});xo.post("/eval-targets",async e=>{let t=e.get("userId"),n=await e.req.json(),r=WO.parse(n),[o]=await u.insert(k).values({userId:t,name:r.name,type:r.type,content:r.content,description:r.description,metadata:r.metadata}).returning();return e.json(o,201)});xo.get("/eval-targets",async e=>{let t=e.get("userId"),n=e.req.query("type"),r=e.req.query("content_hash"),o=[_r(k.userId,t)];n&&o.push(_r(k.type,n)),r&&o.push(FO`${k.metadata}->>'content_hash' = ${r}`);let s=e.req.query("limit"),i=e.req.query("offset"),a=s?parseInt(s,10):NaN,c=Number.isFinite(a)?Math.min(Math.max(1,a),200):100,l=i?parseInt(i,10):NaN,p=Number.isFinite(l)?Math.max(0,l):0,m=await u.select({id:k.id,userId:k.userId,name:k.name,type:k.type,description:k.description,metadata:k.metadata,version:k.version,parentId:k.parentId,createdAt:k.createdAt,updatedAt:k.updatedAt}).from(k).where(Pl(...o)).orderBy(BO(k.updatedAt)).limit(c).offset(p);return e.json(m)});xo.get("/eval-targets/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(k).where(Pl(_r(k.id,n),_r(k.userId,t)));return r?e.json(r):e.json({error:"Eval target not found"},404)});xo.post("/eval-targets/:id/sync-content",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json().catch(()=>({})),o=typeof r?.content=="string"?r.content:null;if(!o||o.trim().length===0)return e.json({error:"content is required"},400);let[s]=await u.select().from(k).where(Pl(_r(k.id,n),_r(k.userId,t)));if(!s)return e.json({error:"Eval target not found"},404);if(s.content===o)return e.json({id:n,synced:!1,version:s.version,reason:"already current"});let i=s.metadata&&typeof s.metadata=="object"&&!Array.isArray(s.metadata)?s.metadata:{},[a]=await u.update(k).set({content:o,version:(s.version??1)+1,metadata:{...i,content_hash:UO("sha256").update(o).digest("hex")},updatedAt:new Date}).where(_r(k.id,n)).returning({version:k.version});return e.json({id:n,synced:!0,version:a.version})});xo.put("/eval-targets/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=zO.parse(r),[s]=await u.select().from(k).where(Pl(_r(k.id,n),_r(k.userId,t)));if(!s)return e.json({error:"Eval target not found"},404);if(o.content&&o.content!==s.content){let[a]=await u.insert(k).values({userId:t,name:o.name??s.name,type:s.type,content:o.content,description:o.description??s.description,metadata:o.metadata??s.metadata,version:s.version+1,parentId:s.id}).returning();return e.json(a)}let[i]=await u.update(k).set({name:o.name??s.name,description:o.description??s.description,metadata:o.metadata??s.metadata,updatedAt:new Date}).where(_r(k.id,n)).returning();return e.json(i)});O();import{Hono as VO}from"hono";import{z as $t}from"zod";import{eq as Cl,and as O0,isNull as JO,desc as GO}from"drizzle-orm";var Bi=new VO,KO=$t.object({name:$t.string().min(1).max(255),prompt:$t.string().min(1),expectedOutput:$t.string().default(""),files:$t.array($t.unknown()).default([]),expectations:$t.array($t.string()).default([])});Bi.post("/eval-targets/:id/evals",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=KO.parse(r);if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let[i]=await u.insert(Se).values({evalTargetId:n,name:o.name,prompt:o.prompt,expectedOutput:o.expectedOutput,files:o.files,expectations:o.expectations}).returning();return e.json(i,201)});Bi.get("/eval-targets/:id/evals",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=e.req.query("includeRetired")==="1";if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let s=await u.select().from(Se).where(r?Cl(Se.evalTargetId,n):O0(Cl(Se.evalTargetId,n),JO(Se.retiredAt))).orderBy(GO(Se.createdAt));return e.json(s)});var YO=$t.object({retire:$t.boolean().optional(),retiredReason:$t.string().max(500).optional(),name:$t.string().min(1).max(255).optional(),prompt:$t.string().min(1).optional(),expectedOutput:$t.string().optional(),files:$t.array($t.unknown()).optional(),expectations:$t.array($t.string()).optional()}).refine(e=>e.retire!==void 0||e.name!==void 0||e.prompt!==void 0||e.expectedOutput!==void 0||e.files!==void 0||e.expectations!==void 0,{message:"nothing to update"});Bi.patch("/eval-targets/:id/evals/:evalId",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=e.req.param("evalId"),o=YO.parse(await e.req.json());if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let i={updatedAt:new Date};o.retire!==void 0&&(i.retiredAt=o.retire?new Date:null,i.retiredReason=o.retire?o.retiredReason??null:null),o.name!==void 0&&(i.name=o.name),o.prompt!==void 0&&(i.prompt=o.prompt),o.expectedOutput!==void 0&&(i.expectedOutput=o.expectedOutput),o.files!==void 0&&(i.files=o.files),o.expectations!==void 0&&(i.expectations=o.expectations),(o.prompt!==void 0||o.expectations!==void 0||o.files!==void 0||o.expectedOutput!==void 0)&&(i.contentUpdatedAt=new Date);let[a]=await u.update(Se).set(i).where(O0(Cl(Se.id,r),Cl(Se.evalTargetId,n))).returning();return a?e.json(a):e.json({error:"Eval case not found"},404)});O();import{Hono as QO}from"hono";import{z as Ne}from"zod";import{createHash as ZO}from"node:crypto";import{and as Dl,eq as on,gte as M0,desc as eD,sql as Pg}from"drizzle-orm";O();import{eq as XO,sql as To}from"drizzle-orm";async function Fi(e,t){let r=await u.execute(To`
|
|
804
|
+
`),S=u.select({proposed:rt`count(*)::int`,accepted:rt`count(*) filter (where ${x.acceptedAt} is not null)::int`,lastAcceptedAt:rt`max(${x.acceptedAt})::text`}).from(x).where(gr(x.userId,t)),[A,E,R,O]=await Promise.all([u.select({n:rt`count(*)::int`}).from(ie).where(gr(ie.userId,t)),u.select({n:rt`count(*)::int`}).from(q).where(Og(gr(q.userId,t),gr(q.status,"running"))),u.select({kind:x.kind,n:rt`count(*)::int`}).from(x).where(Og(gr(x.userId,t),PD(x.dismissedAt))).groupBy(x.kind),u.select({entries:rt`count(*)::int`,distinct:rt`count(distinct ${Ee.contentHash})::int`,repeated:rt`count(*) filter (where ${Ee.timesGenerated} > 1)::int`,dismissed:rt`count(*) filter (where ${Ee.dismissedAt} is not null)::int`,maxTimesGenerated:rt`coalesce(max(${Ee.timesGenerated}), 0)::int`,lastSeenAt:rt`max(${Ee.lastSeenAt})`}).from(Ee).where(gr(Ee.userId,t))]),[j,P]=await Promise.all([I,S]),$=j[0],H=P[0],ee=(await u.select({lastHeartbeat:fe.lastHeartbeat,clientName:fe.clientName,clientVersion:fe.clientVersion,metadata:fe.metadata}).from(fe).where(Og(gr(fe.userId,t),gr(fe.workerType,"cli-worker"),rt`${fe.lastHeartbeat} > ${new Date(y-OD).toISOString()}::timestamptz`)).orderBy(N0(fe.lastHeartbeat)).limit(1))[0],_e=ee?y-new Date(ee.lastHeartbeat).getTime():null,te=f.map(N=>({kind:N.kind,count:1,oldestMinutes:Math.round(N.waitedSeconds/60)})),Re={present:ee!=null,active:_e!=null&&_e<DD,ageSeconds:_e==null?null:Math.round(_e/1e3),capabilities:null,busy:h.length>0,engines:ee?Hc(ee.metadata):null};return e.json({worker:{present:Re.present,active:Re.active,ageSeconds:Re.ageSeconds,clientName:ee?.clientName??null,clientVersion:ee?.clientVersion??null,lastHeartbeat:ee?.lastHeartbeat??null},verdict:jl(Re,te),running:h,queued:f,recent:w,recentTotal:l[0]?.n??0,proposals:b,proposalTotal:A[0]?.n??0,changes:{decisions:$?.decisions??0,applied:$?.applied??0,byDecision:{promote:$?.promote??0,revert:$?.revert??0,refuse:$?.refuse??0},readyToApply:$?.ready_to_apply??0,readyToApplyTargetId:$?.ready_to_apply_target_id??null,readyToApplyPromotionId:$?.ready_to_apply_promotion_id??null,lastAppliedAt:$?.last_applied_at??null,lastDecidedAt:$?.last_decided_at??null,suggestionsProposed:H?.proposed??0,suggestionsAccepted:H?.accepted??0,lastAcceptedAt:H?.lastAcceptedAt??null},counts:{experimentsRunning:E[0]?.n??0,suggestions:Object.fromEntries(R.map(N=>[N.kind,N.n]))},insights:{entries:O[0]?.entries??0,distinct:O[0]?.distinct??0,repeated:O[0]?.repeated??0,dismissed:O[0]?.dismissed??0,maxTimesGenerated:O[0]?.maxTimesGenerated??0,lastSeenAt:O[0]?.lastSeenAt??null},windowHours:o})});D();import{Hono as LD}from"hono";import{z as On}from"zod";import{and as $D,eq as Xn,sql as Eo}from"drizzle-orm";D();import{and as MD,eq as C0}from"drizzle-orm";async function Ke(e,t){let[n]=await u.select({id:k.id}).from(k).where(MD(C0(k.id,e),C0(k.userId,t)));return n}d(Ke,"verifyTargetOwnership");function Wc(e){return e===!0||e==="true"}d(Wc,"flagOn");function Pl(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=Wc(n.autoEvolvePaused);return{enabled:Wc(n.autoEvolveEnabled),optOut:Wc(n.autoEvolveOptOut),apply:Wc(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:Wc(n.autoEvolveAccumulate)}}d(Pl,"resolveEvolutionSettings");function D0(e,t){let n={...e??{}};return t.enabled!==void 0&&(n.autoEvolveEnabled=t.enabled),t.optOut!==void 0&&(n.autoEvolveOptOut=t.optOut),t.apply!==void 0&&(n.autoEvolveApply=t.apply),t.paused!==void 0&&(n.autoEvolvePaused=t.paused),t.accumulate!==void 0&&(n.autoEvolveAccumulate=t.accumulate),t.pairs!==void 0&&(n.autoEvolvePairs=Math.min(128,Math.max(10,Math.floor(t.pairs)))),n}d(D0,"applyEvolutionPatch");function Cl(e){if(e.paused)return e.pausedBy==="account"?"Paused for the whole account \u2014 no instruction is measured or rewritten.":"Paused \u2014 no model budget is spent, and the opt-in is kept.";if(e.optOut&&!e.enabled)return"Opted out \u2014 this instruction is never enrolled automatically.";let t=e.enabled?"Enrolled manually":"Eligible for automatic enrolment",n=e.apply?"a promote MAY rewrite the file":"decisions are recorded only, nothing is written";return`${t}; ${n}. Needs ${e.pairs} paired tasks before it can act.`}d(Cl,"describeEvolutionState");var hr=new LD,qD=On.object({enabled:On.boolean(),projectId:On.string().uuid().optional()});hr.get("/settings/auto-accept",async e=>{let t=e.get("userId"),n=e.req.query("projectId")??null,[r]=await u.select({enabled:T.autoAcceptSuggestions}).from(T).where(Xn(T.id,t)),o=null;if(n){let[i]=await u.select({raw:Eo`${U.metadata}->>'autoAcceptSuggestions'`}).from(U).where(Xn(U.id,n));i?.raw!=null&&(o=i.raw==="true")}let s=await Yu(t,n);return e.json({effective:s.allowed,source:s.source,accountDefault:r?.enabled??!0,projectOverride:o,limits:{minScore:Ot.MIN_SCORE,maxPerRun:Ot.MAX_PER_RUN,maxPerWindow:Ot.MAX_PER_WINDOW,windowDays:Ot.WINDOW_DAYS,kind:Ot.KIND}})});hr.patch("/settings/auto-accept",async e=>{let t=e.get("userId"),n=qD.safeParse(await e.req.json().catch(()=>({})));if(!n.success)return e.json({error:n.error.flatten()},400);let{enabled:r,projectId:o}=n.data;return o?(await u.update(U).set({metadata:Eo`coalesce(${U.metadata}, '{}'::jsonb) || jsonb_build_object('autoAcceptSuggestions', ${r}::boolean)`}).where(Xn(U.id,o)).returning({id:U.id})).length===0?e.json({error:"Project not found"},404):e.json({scope:"project",projectId:o,enabled:r}):(await u.update(T).set({autoAcceptSuggestions:r}).where(Xn(T.id,t)),e.json({scope:"account",enabled:r}))});var UD=On.object({enabled:On.boolean().optional(),optOut:On.boolean().optional(),apply:On.boolean().optional(),paused:On.boolean().optional(),accumulate:On.boolean().optional(),pairs:On.number().int().min(1).max(1e3).optional()}).refine(e=>Object.keys(e).length>0,{message:"no settings supplied"});async function Dl(e){let[t]=await u.select({paused:T.evolutionPaused}).from(T).where(Xn(T.id,e));return t?.paused??!1}d(Dl,"readAccountPaused");var HD=On.object({paused:On.boolean()});hr.get("/settings/evolution-account",async e=>{let t=e.get("userId");return e.json({paused:await Dl(t)})});hr.patch("/settings/evolution-account",async e=>{let t=e.get("userId"),n=HD.safeParse(await e.req.json().catch(()=>({})));return n.success?(await u.update(T).set({evolutionPaused:n.data.paused}).where(Xn(T.id,t)),e.json({paused:n.data.paused})):e.json({error:n.error.flatten()},400)});hr.get("/settings/evolution/targets",async e=>{let t=e.get("userId"),n=await Dl(t),o=(await u.select({id:k.id,name:k.name,autoEvolveEnabled:Eo`${k.metadata}->>'autoEvolveEnabled'`,autoEvolveOptOut:Eo`${k.metadata}->>'autoEvolveOptOut'`,autoEvolveApply:Eo`${k.metadata}->>'autoEvolveApply'`,autoEvolvePaused:Eo`${k.metadata}->>'autoEvolvePaused'`,autoEvolveAccumulate:Eo`${k.metadata}->>'autoEvolveAccumulate'`,autoEvolvePairs:Eo`${k.metadata}->>'autoEvolvePairs'`}).from(k).where($D(Xn(k.userId,t),Xn(k.type,"instruction"))).orderBy(k.name)).map(i=>{let a=Pl(i,n);return{evalTargetId:i.id,name:i.name,settings:a,summary:Cl(a)}}),s=o.filter(i=>i.settings.enabled||i.settings.apply||i.settings.paused||i.settings.optOut||i.settings.accumulate||i.settings.pairsConfigured);return e.json({targets:s,accountPaused:n,limits:{minPairs:10,maxPairs:128},totalInstructionTargets:o.length,unconfigured:o.length-s.length,writable:s.filter(i=>i.settings.apply&&!i.settings.paused).length})});hr.get("/settings/evolution",async e=>{let t=e.get("userId"),n=e.req.query("evalTargetId");if(!n)return e.json({error:"evalTargetId is required"},400);if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let[o]=await u.select({name:k.name,metadata:k.metadata}).from(k).where(Xn(k.id,n));if(!o)return e.json({error:"Eval target not found"},404);let s=Pl(o.metadata,await Dl(t));return e.json({evalTargetId:n,name:o.name,settings:s,summary:Cl(s),limits:{minPairs:10,maxPairs:128}})});hr.patch("/settings/evolution",async e=>{let t=e.get("userId"),n=e.req.query("evalTargetId");if(!n)return e.json({error:"evalTargetId is required"},400);let r=UD.safeParse(await e.req.json().catch(()=>({})));if(!r.success)return e.json({error:r.error.flatten()},400);if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let[s]=await u.select({metadata:k.metadata}).from(k).where(Xn(k.id,n));if(!s)return e.json({error:"Eval target not found"},404);let i=D0(s.metadata,r.data);await u.update(k).set({metadata:i}).where(Xn(k.id,n));let a=Pl(i,await Dl(t));return e.json({evalTargetId:n,settings:a,summary:Cl(a)})});D();import{Hono as BD}from"hono";import{and as FD,eq as WD,sql as zD}from"drizzle-orm";var Ol=new BD;Ol.get("/setup/status",async e=>{let t=e.get("userId"),[n,r,o]=await Promise.all([j0(t),u.select({id:_.id}).from(_).where(FD(WD(_.userId,t),zD`${_.origin} <> 'internal_worker'`)).limit(1),Nl(t)]);return e.json({cliEverConnected:n.cliEverConnected,anyCapturedSession:r.length>0,workerActive:n.workerActive,llmEngines:o})});D();import{createHash as VD}from"node:crypto";import{Hono as JD}from"hono";import{z as An}from"zod";import{eq as _r,and as Ml,desc as GD,sql as KD}from"drizzle-orm";var xo=new JD,YD=An.object({name:An.string().min(1).max(255),type:An.enum(["instruction","skill","prompt","plan"]),content:An.string().min(1),description:An.string().default(""),metadata:An.record(An.unknown()).default({})}),XD=An.object({name:An.string().min(1).max(255).optional(),content:An.string().min(1).optional(),description:An.string().optional(),metadata:An.record(An.unknown()).optional()});xo.post("/eval-targets",async e=>{let t=e.get("userId"),n=await e.req.json(),r=YD.parse(n),[o]=await u.insert(k).values({userId:t,name:r.name,type:r.type,content:r.content,description:r.description,metadata:r.metadata}).returning();return e.json(o,201)});xo.get("/eval-targets",async e=>{let t=e.get("userId"),n=e.req.query("type"),r=e.req.query("content_hash"),o=[_r(k.userId,t)];n&&o.push(_r(k.type,n)),r&&o.push(KD`${k.metadata}->>'content_hash' = ${r}`);let s=e.req.query("limit"),i=e.req.query("offset"),a=s?parseInt(s,10):NaN,c=Number.isFinite(a)?Math.min(Math.max(1,a),200):100,l=i?parseInt(i,10):NaN,p=Number.isFinite(l)?Math.max(0,l):0,m=await u.select({id:k.id,userId:k.userId,name:k.name,type:k.type,description:k.description,metadata:k.metadata,version:k.version,parentId:k.parentId,createdAt:k.createdAt,updatedAt:k.updatedAt}).from(k).where(Ml(...o)).orderBy(GD(k.updatedAt)).limit(c).offset(p);return e.json(m)});xo.get("/eval-targets/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(k).where(Ml(_r(k.id,n),_r(k.userId,t)));return r?e.json(r):e.json({error:"Eval target not found"},404)});xo.post("/eval-targets/:id/sync-content",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json().catch(()=>({})),o=typeof r?.content=="string"?r.content:null;if(!o||o.trim().length===0)return e.json({error:"content is required"},400);let[s]=await u.select().from(k).where(Ml(_r(k.id,n),_r(k.userId,t)));if(!s)return e.json({error:"Eval target not found"},404);if(s.content===o)return e.json({id:n,synced:!1,version:s.version,reason:"already current"});let i=s.metadata&&typeof s.metadata=="object"&&!Array.isArray(s.metadata)?s.metadata:{},[a]=await u.update(k).set({content:o,version:(s.version??1)+1,metadata:{...i,content_hash:VD("sha256").update(o).digest("hex")},updatedAt:new Date}).where(_r(k.id,n)).returning({version:k.version});return e.json({id:n,synced:!0,version:a.version})});xo.put("/eval-targets/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=XD.parse(r),[s]=await u.select().from(k).where(Ml(_r(k.id,n),_r(k.userId,t)));if(!s)return e.json({error:"Eval target not found"},404);if(o.content&&o.content!==s.content){let[a]=await u.insert(k).values({userId:t,name:o.name??s.name,type:s.type,content:o.content,description:o.description??s.description,metadata:o.metadata??s.metadata,version:s.version+1,parentId:s.id}).returning();return e.json(a)}let[i]=await u.update(k).set({name:o.name??s.name,description:o.description??s.description,metadata:o.metadata??s.metadata,updatedAt:new Date}).where(_r(k.id,n)).returning();return e.json(i)});D();import{Hono as QD}from"hono";import{z as $t}from"zod";import{eq as Ll,and as L0,isNull as ZD,desc as eO}from"drizzle-orm";var Bi=new QD,tO=$t.object({name:$t.string().min(1).max(255),prompt:$t.string().min(1),expectedOutput:$t.string().default(""),files:$t.array($t.unknown()).default([]),expectations:$t.array($t.string()).default([])});Bi.post("/eval-targets/:id/evals",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=tO.parse(r);if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let[i]=await u.insert(Se).values({evalTargetId:n,name:o.name,prompt:o.prompt,expectedOutput:o.expectedOutput,files:o.files,expectations:o.expectations}).returning();return e.json(i,201)});Bi.get("/eval-targets/:id/evals",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=e.req.query("includeRetired")==="1";if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let s=await u.select().from(Se).where(r?Ll(Se.evalTargetId,n):L0(Ll(Se.evalTargetId,n),ZD(Se.retiredAt))).orderBy(eO(Se.createdAt));return e.json(s)});var nO=$t.object({retire:$t.boolean().optional(),retiredReason:$t.string().max(500).optional(),name:$t.string().min(1).max(255).optional(),prompt:$t.string().min(1).optional(),expectedOutput:$t.string().optional(),files:$t.array($t.unknown()).optional(),expectations:$t.array($t.string()).optional()}).refine(e=>e.retire!==void 0||e.name!==void 0||e.prompt!==void 0||e.expectedOutput!==void 0||e.files!==void 0||e.expectations!==void 0,{message:"nothing to update"});Bi.patch("/eval-targets/:id/evals/:evalId",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=e.req.param("evalId"),o=nO.parse(await e.req.json());if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let i={updatedAt:new Date};o.retire!==void 0&&(i.retiredAt=o.retire?new Date:null,i.retiredReason=o.retire?o.retiredReason??null:null),o.name!==void 0&&(i.name=o.name),o.prompt!==void 0&&(i.prompt=o.prompt),o.expectedOutput!==void 0&&(i.expectedOutput=o.expectedOutput),o.files!==void 0&&(i.files=o.files),o.expectations!==void 0&&(i.expectations=o.expectations),(o.prompt!==void 0||o.expectations!==void 0||o.files!==void 0||o.expectedOutput!==void 0)&&(i.contentUpdatedAt=new Date);let[a]=await u.update(Se).set(i).where(L0(Ll(Se.id,r),Ll(Se.evalTargetId,n))).returning();return a?e.json(a):e.json({error:"Eval case not found"},404)});D();import{Hono as oO}from"hono";import{z as Ne}from"zod";import{createHash as sO}from"node:crypto";import{and as ql,eq as on,gte as q0,desc as iO,sql as Mg}from"drizzle-orm";D();import{eq as rO,sql as To}from"drizzle-orm";async function Fi(e,t){let r=await u.execute(To`
|
|
800
805
|
SELECT
|
|
801
806
|
r.configuration,
|
|
802
807
|
r.created_at,
|
|
@@ -839,7 +844,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
839
844
|
AND ev.retired_at IS NULL
|
|
840
845
|
AND r.grading->'summary'->>'pass_rate' IS NOT NULL
|
|
841
846
|
AND r.configuration IN ('with_target', 'without_target')
|
|
842
|
-
`),o=null,s=-1;for(let C of r){if(!C.judge_model)continue;let oe=new Date(C.created_at).getTime();(oe>s||oe===s&&C.judge_model>(o??""))&&(s=oe,o=C.judge_model)}let i=null,a=-1;for(let C of r){let oe=new Date(C.created_at).getTime();oe>a&&(a=oe,i=C.methodology)}let c={with_target:{unlabeledJudge:[],labeled:[]},without_target:{unlabeledJudge:[],labeled:[]}},l={with_target:[],without_target:[]},p=0,m=new Map,y=0,v=0,h=0,f=0;for(let C of r){let oe=c[C.configuration];if(!oe)continue;let ve=C.methodology!==i||C.pre_edit;C.methodology!==i&&(h+=1),C.pre_edit&&(f+=1);let Ce=C.judge_pass?1:0,Te=C.llm_annotated>=C.llm_total;if(C.llm_total>0){let Ye=C.judge_model,Ht=m.get(Ye)??{runs:0,labeledRuns:0,latestRunAt:C.created_at};if(Ht.runs+=1,Te&&(Ht.labeledRuns+=1),new Date(C.created_at).getTime()>new Date(Ht.latestRunAt).getTime()&&(Ht.latestRunAt=C.created_at),m.set(Ye,Ht),Ye!==o){y+=1,Te&&(v+=1);continue}}if(Te){let Ye=C.det_all_passed&&C.llm_truly_passed===C.llm_total?1:0;l[C.configuration]?.push({human:Ye,judge:Ce}),C.llm_total>0&&(p+=1)}if(!ve)if(Te){let Ye=C.det_all_passed&&C.llm_truly_passed===C.llm_total?1:0;oe.labeled.push({human:Ye,judge:Ce})}else oe.unlabeledJudge.push(Ce)}let[w]=await u.select({total:To`count(*)::int`,llmAnchors:To`count(*) FILTER (WHERE ${Je.judgeMethod} = 'llm' AND ${Je.judgeModel} IS NOT DISTINCT FROM ${o})::int`,llmApproved:To`count(*) FILTER (WHERE ${Je.judgeMethod} = 'llm' AND ${Je.judgeModel} IS NOT DISTINCT FROM ${o} AND ${Je.verdict} = 'approve')::int`,staleLlmAnchors:To`count(*) FILTER (WHERE ${Je.judgeMethod} = 'llm' AND ${Je.judgeModel} IS DISTINCT FROM ${o})::int`,flagged:To`count(*) FILTER (WHERE ${Je.flag} IS NOT NULL)::int`}).from(Je).where(
|
|
847
|
+
`),o=null,s=-1;for(let C of r){if(!C.judge_model)continue;let oe=new Date(C.created_at).getTime();(oe>s||oe===s&&C.judge_model>(o??""))&&(s=oe,o=C.judge_model)}let i=null,a=-1;for(let C of r){let oe=new Date(C.created_at).getTime();oe>a&&(a=oe,i=C.methodology)}let c={with_target:{unlabeledJudge:[],labeled:[]},without_target:{unlabeledJudge:[],labeled:[]}},l={with_target:[],without_target:[]},p=0,m=new Map,y=0,v=0,h=0,f=0;for(let C of r){let oe=c[C.configuration];if(!oe)continue;let ve=C.methodology!==i||C.pre_edit;C.methodology!==i&&(h+=1),C.pre_edit&&(f+=1);let Ce=C.judge_pass?1:0,Te=C.llm_annotated>=C.llm_total;if(C.llm_total>0){let Ye=C.judge_model,Ht=m.get(Ye)??{runs:0,labeledRuns:0,latestRunAt:C.created_at};if(Ht.runs+=1,Te&&(Ht.labeledRuns+=1),new Date(C.created_at).getTime()>new Date(Ht.latestRunAt).getTime()&&(Ht.latestRunAt=C.created_at),m.set(Ye,Ht),Ye!==o){y+=1,Te&&(v+=1);continue}}if(Te){let Ye=C.det_all_passed&&C.llm_truly_passed===C.llm_total?1:0;l[C.configuration]?.push({human:Ye,judge:Ce}),C.llm_total>0&&(p+=1)}if(!ve)if(Te){let Ye=C.det_all_passed&&C.llm_truly_passed===C.llm_total?1:0;oe.labeled.push({human:Ye,judge:Ce})}else oe.unlabeledJudge.push(Ce)}let[w]=await u.select({total:To`count(*)::int`,llmAnchors:To`count(*) FILTER (WHERE ${Je.judgeMethod} = 'llm' AND ${Je.judgeModel} IS NOT DISTINCT FROM ${o})::int`,llmApproved:To`count(*) FILTER (WHERE ${Je.judgeMethod} = 'llm' AND ${Je.judgeModel} IS NOT DISTINCT FROM ${o} AND ${Je.verdict} = 'approve')::int`,staleLlmAnchors:To`count(*) FILTER (WHERE ${Je.judgeMethod} = 'llm' AND ${Je.judgeModel} IS DISTINCT FROM ${o})::int`,flagged:To`count(*) FILTER (WHERE ${Je.flag} IS NOT NULL)::int`}).from(Je).where(rO(Je.evalTargetId,t)),b=c.with_target.unlabeledJudge.length+c.with_target.labeled.length+c.without_target.unlabeledJudge.length+c.without_target.labeled.length,I=await u.execute(To`
|
|
843
848
|
SELECT
|
|
844
849
|
r.eval_target_id::text AS target_id,
|
|
845
850
|
r.configuration,
|
|
@@ -881,7 +886,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
881
886
|
AND r.grading->'summary'->>'pass_rate' IS NOT NULL
|
|
882
887
|
AND r.configuration IN ('with_target', 'without_target')
|
|
883
888
|
AND r.grading->>'judge_model' IS NOT DISTINCT FROM ${o}
|
|
884
|
-
`),S=new Map;for(let C of I){if(C.llm_total<=0||C.llm_annotated<C.llm_total)continue;let oe=S.get(C.target_id)??{with_target:[],without_target:[]},ve=C.det_all_passed&&C.llm_truly_passed===C.llm_total?1:0,Ce=C.judge_pass?1:0;C.configuration==="with_target"?oe.with_target.push(ve-Ce):oe.without_target.push(ve-Ce),S.set(C.target_id,oe)}let A=d(C=>{let oe=C.length;if(oe===0)return{rectifier:0,variance:1/0,n:0};let ve=C.reduce((Te,Ye)=>Te+Ye,0)/oe,Ce=oe<2?0:C.reduce((Te,Ye)=>Te+(Ye-ve)**2,0)/(oe-1);return{rectifier:ve,variance:Ce/oe,n:oe}},"toRectifier"),E=d(C=>C.map(oe=>oe.human-oe.judge),"selfDeltas"),R=[...S.values()].map(C=>A(C.with_target)),
|
|
889
|
+
`),S=new Map;for(let C of I){if(C.llm_total<=0||C.llm_annotated<C.llm_total)continue;let oe=S.get(C.target_id)??{with_target:[],without_target:[]},ve=C.det_all_passed&&C.llm_truly_passed===C.llm_total?1:0,Ce=C.judge_pass?1:0;C.configuration==="with_target"?oe.with_target.push(ve-Ce):oe.without_target.push(ve-Ce),S.set(C.target_id,oe)}let A=d(C=>{let oe=C.length;if(oe===0)return{rectifier:0,variance:1/0,n:0};let ve=C.reduce((Te,Ye)=>Te+Ye,0)/oe,Ce=oe<2?0:C.reduce((Te,Ye)=>Te+(Ye-ve)**2,0)/(oe-1);return{rectifier:ve,variance:Ce/oe,n:oe}},"toRectifier"),E=d(C=>C.map(oe=>oe.human-oe.judge),"selfDeltas"),R=[...S.values()].map(C=>A(C.with_target)),O=[...S.values()].map(C=>A(C.without_target)),j=zu(A(E(l.with_target)),R),P=zu(A(E(l.without_target)),O),$=[...S.values()].reduce((C,oe)=>C+oe.with_target.length+oe.without_target.length,0),H=p+$,B=(p>0?1:0)+[...S.values()].filter(C=>C.with_target.length+C.without_target.length>0).length,ee=j.pooledApplied||P.pooledApplied,_e=B>=3&&H>=Wu,te=d(C=>({rectifier:C.rectifierUsed,variance:C.variance,sufficient:_e}),"asInput"),Re=b>0?yc(c.with_target,c.without_target,ee?{withPooledRectifier:te(j),withoutPooledRectifier:te(P)}:{}):null,N=kf(c.with_target,c.without_target,{humanLabeledRuns:p,...ee?{pool:{withPooledRectifier:te(j),withoutPooledRectifier:te(P),totalAnchors:H,targets:B}}:{}}),me=new Map;for(let C of r){if(C.judge_model!==o||C.methodology!==i||C.pre_edit||C.pass_rate==null)continue;let oe=me.get(C.eval_id)??{name:C.eval_name,withRates:[],withoutRates:[]};C.configuration==="with_target"?oe.withRates.push(C.pass_rate):C.configuration==="without_target"&&oe.withoutRates.push(C.pass_rate),me.set(C.eval_id,oe)}let M=[],ue=[],lt=d(C=>C.length?C.reduce((oe,ve)=>oe+ve,0)/C.length:null,"mean_"),Be=[];for(let[C,{name:oe,withRates:ve,withoutRates:Ce}]of me.entries())ve.length>0&&Ce.length>0?(M.push({name:oe,withPassRate:lt(ve),withoutPassRate:lt(Ce)}),ue.push(C)):Be.push({evalId:C,name:oe,withPassRate:lt(ve),withoutPassRate:lt(Ce)});let re=Af(Sf(M),{unpaired:Be.length}),he=re.gateReason?[re.gateReason,...N.reasons]:N.reasons;return{judge:{currentModel:o,models:[...m.entries()].map(([C,oe])=>({model:C,...oe})).sort((C,oe)=>new Date(oe.latestRunAt).getTime()-new Date(C.latestRunAt).getTime()),staleRuns:y,staleLabeledRuns:v,staleAnchors:w?.staleLlmAnchors??0},anchors:{total:w?.total??0,llmAnchors:w?.llmAnchors??0,agreementRate:w&&w.llmAnchors>0?w.llmApproved/w.llmAnchors:null,agreementCi:w&&w.llmAnchors>0?Lu(w.llmApproved,w.llmAnchors):null,flagged:w?.flagged??0,minAnchors:mi,labeledRuns:{with:l.with_target.length,without:l.without_target.length}},methodology:{current:i,supersededRuns:h,preEditRuns:f,runsInSegment:b},calibration:Re,powerCheck:{...N,reasons:he},pooling:{engaged:ee,judgeModel:o,poolTargets:B,poolAnchors:H,assumedExchangeability:j.assumedExchangeability||P.assumedExchangeability,sufficient:_e,withLambda:j.lambda,withoutLambda:P.lambda,tau2:j.tau2,i2:j.i2,withReason:j.reason??null,withoutReason:P.reason??null},caseDiscrimination:{total:re.total,discriminating:re.discriminating,nonDiscriminating:re.nonDiscriminating,unpaired:re.unpaired,cases:re.diagnoses.map((C,oe)=>({evalId:ue[oe],name:C.name,withPassRate:C.withPassRate,withoutPassRate:C.withoutPassRate,separation:C.separation,discriminating:C.discriminating,note:C.note})).sort((C,oe)=>C.separation-oe.separation),unpairedCases:Be}}}d(Fi,"computeJudgeCalibration");async function $0(e){return(await u.execute(To`
|
|
885
890
|
WITH current_judge AS (
|
|
886
891
|
SELECT r.grading->>'judge_model' AS model
|
|
887
892
|
FROM eval_runs r
|
|
@@ -910,7 +915,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
910
915
|
AND (SELECT count(*) FROM jsonb_array_elements(r.grading->'expectations') e
|
|
911
916
|
WHERE COALESCE(e->>'method', 'llm') = 'llm'
|
|
912
917
|
AND COALESCE(e->>'errored', 'false') <> 'true') > COALESCE(a.llm_annotated, 0)
|
|
913
|
-
`))[0]?.remaining??0}d(D0,"countRunsAwaitingReview");var vs=new QO,Ol=d(e=>ZO("sha256").update(e).digest("hex"),"sha256"),tD=Ne.object({withScore:Ne.number().min(0).max(1),withoutScore:Ne.number().min(0).max(1),withCost:Ne.number().nonnegative().optional(),withoutCost:Ne.number().nonnegative().optional(),withLatency:Ne.number().nonnegative().optional(),withoutLatency:Ne.number().nonnegative().optional()}),nD=Ne.object({candidateContent:Ne.string().min(1),proposalSource:Ne.enum(["llm","groom","human"]),proposalRationale:Ne.string().default(""),pairs:Ne.array(tD).default([]),canaryGreen:Ne.boolean(),measuredAgainstContentHash:Ne.string().optional(),accumulation:Ne.object({candidateContentHash:Ne.string(),priorContentHash:Ne.string(),targetPairs:Ne.number().int().positive(),carriedPairs:Ne.number().int().nonnegative(),runs:Ne.number().int().positive()}).optional(),immutableSections:Ne.array(Ne.string()).default([]),maxPromotionsPerWindow:Ne.number().int().positive().optional(),windowDays:Ne.number().int().positive().optional(),measurementCost:Ne.object({modelCalls:Ne.number().int().nonnegative(),proposalCalls:Ne.number().int().nonnegative(),executorCalls:Ne.number().int().nonnegative(),graderCalls:Ne.number().int().nonnegative(),plannedPairs:Ne.number().int().nonnegative(),usablePairs:Ne.number().int().nonnegative(),verdictPairs:Ne.number().int().nonnegative().optional(),passes:Ne.number().int().nonnegative(),liveCases:Ne.number().int().nonnegative(),mde:Ne.number().nonnegative().nullable(),wallMs:Ne.number().nonnegative()}).optional(),apply:Ne.boolean().default(!0)});vs.post("/eval-targets/:id/promotions",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=nD.parse(await e.req.json());if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let[s]=await u.select({id:k.id,content:k.content,version:k.version,metadata:k.metadata}).from(k).where(on(k.id,n));if(!s)return e.json({error:"Eval target not found"},404);let i=s.content,a=r.candidateContent,c=r.pairs,l=Mu(c,{baseline:"prior-version"}),p=!1,m=["adequacy could not be computed for this target"];try{let D=await Fi(t,n);p=D.powerCheck.adequate,m=D.powerCheck.reasons??[]}catch(D){m=[`adequacy check failed: ${D instanceof Error?D.message:String(D)}`]}let y=r.windowDays??vc,v=r.maxPromotionsPerWindow??fi,h=new Date(Date.now()-y*24*60*60*1e3),[f]=await u.select({n:Pg`count(*)::int`}).from(ie).where(Dl(on(ie.evalTargetId,n),on(ie.applied,!0),M0(ie.createdAt,h))),w=f?.n??0,b=Ol(i),I=r.measuredAgainstContentHash===void 0?void 0:r.measuredAgainstContentHash===b,S=jf({verdict:l,canaryGreen:r.canaryGreen,adequate:p,adequacyReasons:m,promotionsInWindow:w,maxPromotionsPerWindow:v,immutableSections:r.immutableSections,beforeContent:i,afterContent:a,measurementMatchesPredecessor:I}),A={canaryGreen:r.canaryGreen,adequate:p,adequacyReasons:m,promotionsInWindow:w,maxPromotionsPerWindow:v,windowDays:y,immutableSections:r.immutableSections,nPairs:c.length,measurementMatchesPredecessor:I??null,measuredAgainstContentHash:r.measuredAgainstContentHash??null,cost:r.measurementCost??null,accumulation:r.accumulation?{...r.accumulation,pairs:c}:null,applied:!1},E=S.decision==="promote"&&r.apply;A.applied=E;let R;try{R=await u.transaction(async D=>{if(E){let P=s.metadata&&typeof s.metadata=="object"&&!Array.isArray(s.metadata)?s.metadata:{};await D.update(k).set({content:a,version:(s.version??1)+1,metadata:{...P,content_hash:Ol(a)},updatedAt:new Date}).where(on(k.id,n))}let[j]=await D.insert(ie).values({userId:t,evalTargetId:n,fromContentHash:b,toContentHash:Ol(a),fromContent:i,toContent:a,proposalSource:r.proposalSource,proposalRationale:r.proposalRationale,decision:S.decision,applied:E,refusals:S.refusals,rationale:S.rationale,effectClass:S.effect,verdict:l,gates:A,touchedSections:S.touched}).returning({id:ie.id,createdAt:ie.createdAt});return j})}catch(D){if(D?.code==="23505")return e.json({error:"This edit has already been applied to this target",code:"PROMOTION_ALREADY_APPLIED"},409);throw D}return e.json({id:R.id,createdAt:R.createdAt,decision:S.decision,applied:E,rationale:S.rationale,refusals:S.refusals,effectClass:S.effect,touchedSections:S.touched,verdict:l,gates:A},201)});vs.get("/eval-targets/:id/promotions",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=Math.min(Number(e.req.query("limit")??50)||50,200),o=Math.max(Number(e.req.query("offset")??0)||0,0);if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let i=await u.select({id:ie.id,createdAt:ie.createdAt,decision:ie.decision,applied:ie.applied,effectClass:ie.effectClass,rationale:ie.rationale,refusals:ie.refusals,proposalSource:ie.proposalSource,proposalRationale:ie.proposalRationale,fromContentHash:ie.fromContentHash,toContentHash:ie.toContentHash,touchedSections:ie.touchedSections,verdict:ie.verdict,gates:ie.gates}).from(ie).where(on(ie.evalTargetId,n)).orderBy(eD(ie.createdAt)).limit(r).offset(o),a=await u.select({decision:ie.decision,n:Pg`count(*)::int`}).from(ie).where(on(ie.evalTargetId,n)).groupBy(ie.decision),c={promote:0,revert:0,refuse:0};for(let l of a)c[l.decision]=l.n;return e.json({promotions:i,counts:c,total:Object.values(c).reduce((l,p)=>l+p,0),limit:r,offset:o})});vs.post("/promotions/:promotionId/apply",async e=>{let t=e.get("userId"),n=e.req.param("promotionId");try{let r=await u.transaction(async o=>{let[s]=await o.select().from(ie).where(Dl(on(ie.id,n),on(ie.userId,t))).for("update");if(!s)return{status:404,body:{error:"Promotion not found"}};if(s.applied)return{status:409,body:{error:"Already applied",code:"ALREADY_APPLIED"}};if(s.decision!=="promote")return{status:409,body:{error:`Only a "promote" can be applied; this decision was "${s.decision}"`,code:"NOT_A_PROMOTE"}};let[i]=await o.select().from(k).where(on(k.id,s.evalTargetId));if(!i)return{status:404,body:{error:"Eval target not found"}};if(i.content!==s.fromContent)return{status:409,body:{error:"The target has changed since this was measured \u2014 the verdict no longer describes this edit. Re-measure rather than applying a stale decision.",code:"STALE_MEASUREMENT"}};let a=new Date(Date.now()-vc*864e5),[c]=await o.select({n:Pg`count(*)::int`}).from(ie).where(Dl(on(ie.evalTargetId,s.evalTargetId),on(ie.applied,!0),M0(ie.createdAt,a)));if((c?.n??0)>=fi)return{status:409,body:{error:`Change budget exhausted (${c?.n}/${fi} applied in ${vc}d)`,code:"BUDGET_EXHAUSTED"}};let l=i.metadata&&typeof i.metadata=="object"&&!Array.isArray(i.metadata)?i.metadata:{};await o.update(k).set({content:s.toContent,version:(i.version??1)+1,metadata:{...l,content_hash:Ol(s.toContent)},updatedAt:new Date}).where(on(k.id,s.evalTargetId));let p=s.gates&&typeof s.gates=="object"&&!Array.isArray(s.gates)?s.gates:{};return await o.update(ie).set({applied:!0,gates:{...p,applied:!0,appliedAt:new Date().toISOString(),appliedVia:"deferred-human-apply"}}).where(on(ie.id,s.id)),{status:200,body:{id:s.id,applied:!0,evalTargetId:s.evalTargetId,newVersion:(i.version??1)+1}}});return e.json(r.body,r.status)}catch(r){if(r?.code==="23505")return e.json({error:"This edit is already applied to this target",code:"PROMOTION_ALREADY_APPLIED"},409);throw r}});vs.get("/promotions/:promotionId",async e=>{let t=e.get("userId"),n=e.req.param("promotionId"),[r]=await u.select().from(ie).where(Dl(on(ie.id,n),on(ie.userId,t)));return r?e.json(r):e.json({error:"Promotion not found"},404)});O();import{Hono as rD}from"hono";import{z as ft}from"zod";import{eq as Qn,and as Cg,asc as oD,desc as L0,isNull as sD,inArray as iD,sql as aD}from"drizzle-orm";var Is=new rD,cD=ft.object({jobId:ft.string().uuid().optional(),evalId:ft.string().uuid(),evalTargetId:ft.string().uuid(),evalTargetVersion:ft.number().int(),configuration:ft.enum(["with_target","without_target","baseline","with_candidate","with_prior_version"]),runNumber:ft.number().int().default(1),iteration:ft.number().int().default(1),status:ft.enum(["pending","running","completed","failed"]).default("completed"),outputs:ft.record(ft.unknown()).default({}),timing:ft.record(ft.unknown()).default({}),grading:ft.record(ft.unknown()).default({}),comparison:ft.record(ft.unknown()).nullable().optional()}),dD=ft.object({iteration:ft.number().int().default(1),runSummary:ft.record(ft.unknown()).default({}),notes:ft.array(ft.string()).default([])});Is.post("/eval-runs",async e=>{let t=e.get("userId"),n=await e.req.json(),r=cD.parse(n);if(!await Ke(r.evalTargetId,t))return e.json({error:"Eval target not found"},404);let[s]=await u.insert(be).values({jobId:r.jobId??null,evalId:r.evalId,evalTargetId:r.evalTargetId,evalTargetVersion:r.evalTargetVersion,configuration:r.configuration,runNumber:r.runNumber,iteration:r.iteration,status:r.status,outputs:r.outputs,timing:r.timing,grading:r.grading,comparison:r.comparison??null}).onConflictDoNothing().returning();if(s)return e.json(s,201);if(!r.jobId)return e.json({error:"Insert conflicted without a jobId"},409);let[i]=await u.select().from(be).where(Cg(Qn(be.jobId,r.jobId),Qn(be.evalId,r.evalId),Qn(be.configuration,r.configuration),Qn(be.runNumber,r.runNumber),Qn(be.iteration,r.iteration))).limit(1);return i?e.json({...i,deduped:!0},200):e.json({error:"Run conflicted but existing row not found"},409)});Is.get("/eval-targets/:id/runs",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=e.req.query("iteration"),o=e.req.query("configuration");if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let i=e.req.query("limit"),a=e.req.query("offset"),c=i?parseInt(i,10):NaN,l=Number.isFinite(c)?Math.min(Math.max(1,c),100):50,p=a?parseInt(a,10):NaN,m=Number.isFinite(p)?Math.max(0,p):0,y=[Qn(be.evalTargetId,n)];r&&y.push(Qn(be.iteration,parseInt(r,10))),o&&y.push(Qn(be.configuration,o)),e.req.query("activeCasesOnly")==="1"&&y.push(iD(be.evalId,u.select({id:Se.id}).from(Se).where(Cg(Qn(Se.evalTargetId,n),sD(Se.retiredAt)))));let v=e.req.query("candidateContentHash");v&&y.push(aD`${be.outputs}->>'candidateContentHash' = ${v}`);let h=e.req.query("jobId");if(h){let b=ft.string().uuid().safeParse(h);if(!b.success)return e.json({error:"Invalid jobId"},400);y.push(Qn(be.jobId,b.data))}let w=(await u.select().from(be).where(Cg(...y)).orderBy(L0(be.createdAt),oD(be.id)).limit(l).offset(m)).map(b=>{let I=b.outputs??{},{diff:S,transcript:A,...E}=I,R=v?E:{...E,transcript:A};return{...b,outputs:R,comparison:null}});return e.json(w)});Is.post("/eval-targets/:id/benchmarks",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=dD.parse(r);if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let[i]=await u.insert(Wn).values({evalTargetId:n,iteration:o.iteration,runSummary:o.runSummary,notes:o.notes}).returning();return e.json(i,201)});Is.get("/eval-targets/:id/benchmarks",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let o=await u.select().from(Wn).where(Qn(Wn.evalTargetId,n)).orderBy(L0(Wn.createdAt));return e.json(o)});O();import{Hono as uD}from"hono";import{z as qt}from"zod";import{eq as bs,and as q0,or as lD,desc as pD,asc as mD}from"drizzle-orm";import{alias as $0}from"drizzle-orm/pg-core";var Wi=new uD,fD=qt.object({targetAId:qt.string().uuid(),targetBId:qt.string().uuid(),targetAVersion:qt.number().int(),targetBVersion:qt.number().int(),isSwapped:qt.boolean(),winnerTargetId:qt.string().uuid().nullable(),perEval:qt.array(qt.object({evalName:qt.string(),winnerTargetId:qt.string().uuid().nullable(),reasoning:qt.string().default("")})).default([]),overall:qt.record(qt.unknown()).default({}),rawOutput:qt.string().nullable().optional(),model:qt.string().nullable().optional(),status:qt.enum(["completed","parse_failed"]).default("completed")});Wi.post("/eval-comparisons",async e=>{let t=e.get("userId"),n=await e.req.json(),r=fD.parse(n),[o,s]=await Promise.all([Ke(r.targetAId,t),Ke(r.targetBId,t)]);if(!o||!s)return e.json({error:"Eval target not found"},404);let i=d(c=>c===null||c===r.targetAId||c===r.targetBId,"validWinner");if(!i(r.winnerTargetId)||!r.perEval.every(c=>i(c.winnerTargetId)))return e.json({error:"winnerTargetId must be one of the compared targets or null"},400);let[a]=await u.insert(Xe).values({userId:t,targetAId:r.targetAId,targetBId:r.targetBId,targetAVersion:r.targetAVersion,targetBVersion:r.targetBVersion,isSwapped:r.isSwapped,winnerTargetId:r.winnerTargetId,perEval:r.perEval,overall:r.overall,rawOutput:r.rawOutput??null,model:r.model??null,status:r.status}).returning();return e.json(a,201)});Wi.get("/eval-targets/:id/comparisons",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let o=e.req.query("limit"),s=e.req.query("offset"),i=o?parseInt(o,10):NaN,a=Number.isFinite(i)?Math.min(Math.max(1,i),100):50,c=s?parseInt(s,10):NaN,l=Number.isFinite(c)?Math.max(0,c):0,p=$0(k,"targets_a"),m=$0(k,"targets_b"),y=await u.select({id:Xe.id,userId:Xe.userId,targetAId:Xe.targetAId,targetBId:Xe.targetBId,targetAName:p.name,targetBName:m.name,targetAVersion:Xe.targetAVersion,targetBVersion:Xe.targetBVersion,isSwapped:Xe.isSwapped,winnerTargetId:Xe.winnerTargetId,perEval:Xe.perEval,overall:Xe.overall,model:Xe.model,status:Xe.status,createdAt:Xe.createdAt}).from(Xe).innerJoin(p,bs(Xe.targetAId,p.id)).innerJoin(m,bs(Xe.targetBId,m.id)).where(q0(bs(Xe.userId,t),lD(bs(Xe.targetAId,n),bs(Xe.targetBId,n)))).orderBy(pD(Xe.createdAt),mD(Xe.id)).limit(a).offset(l);return e.json(y.map(v=>({...v,rawOutput:null})))});Wi.get("/eval-comparisons/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=qt.string().uuid().safeParse(n);if(!r.success)return e.json({error:"Invalid comparison id"},400);let[o]=await u.select().from(Xe).where(q0(bs(Xe.id,r.data),bs(Xe.userId,t)));return o?e.json(o):e.json({error:"Comparison not found"},404)});O();import{Hono as yD}from"hono";import{z as zi}from"zod";import{eq as Vi,and as Og,desc as wD,asc as vD,inArray as ID,sql as bD}from"drizzle-orm";O();import{sql as gD}from"drizzle-orm";function U0(e){if(e.n===0)return null;let t=e.agree/e.n,n=e.aYes/e.n,r=e.bYes/e.n,o=n*r+(1-n)*(1-r);return o>=1?null:(t-o)/(1-o)}d(U0,"kappaFromCounts");var H0=d((e,t)=>({agree:e,total:t,rate:t>0?e/t:null}),"slice");function hD(e){let t=e.pairs>0?e.agreeHuman/e.pairs:null;return{engine:e.reviewerEngine,models:e.models,pairs:e.pairs,orphaned:e.orphaned,agreementRate:t,kappa:U0({n:e.pairs,agree:e.agreeHuman,aYes:e.humanYes,bYes:e.reviewerYes}),snapshotAgreementRate:e.pairs>0?e.snapshotAgree/e.pairs:null,snapshotKappa:U0({n:e.pairs,agree:e.snapshotAgree,aYes:e.snapshotHumanYes,bYes:e.reviewerYes}),judgeAgreementRate:e.pairs>0?e.judgeAgreeHuman/e.pairs:null,onJudgePass:H0(e.judgePassAgree,e.judgePassPairs),onJudgeFail:H0(e.agreeHuman-e.judgePassAgree,e.pairs-e.judgePassPairs),suggestedAnchorWeight:t==null?null:Math.max(0,2*t-1)**2,unresolvedFlags:e.unresolvedFlags,kept:e.kept,relabeled:e.relabeled,lastReviewedAt:e.lastReviewedAt}}d(hD,"reviewerAgreementReport");async function B0(e){return(await u.execute(gD`
|
|
918
|
+
`))[0]?.remaining??0}d($0,"countRunsAwaitingReview");var vs=new oO,$l=d(e=>sO("sha256").update(e).digest("hex"),"sha256"),aO=Ne.object({withScore:Ne.number().min(0).max(1),withoutScore:Ne.number().min(0).max(1),withCost:Ne.number().nonnegative().optional(),withoutCost:Ne.number().nonnegative().optional(),withLatency:Ne.number().nonnegative().optional(),withoutLatency:Ne.number().nonnegative().optional()}),cO=Ne.object({candidateContent:Ne.string().min(1),proposalSource:Ne.enum(["llm","groom","human"]),proposalRationale:Ne.string().default(""),pairs:Ne.array(aO).default([]),canaryGreen:Ne.boolean(),measuredAgainstContentHash:Ne.string().optional(),accumulation:Ne.object({candidateContentHash:Ne.string(),priorContentHash:Ne.string(),targetPairs:Ne.number().int().positive(),carriedPairs:Ne.number().int().nonnegative(),runs:Ne.number().int().positive()}).optional(),immutableSections:Ne.array(Ne.string()).default([]),maxPromotionsPerWindow:Ne.number().int().positive().optional(),windowDays:Ne.number().int().positive().optional(),measurementCost:Ne.object({modelCalls:Ne.number().int().nonnegative(),proposalCalls:Ne.number().int().nonnegative(),executorCalls:Ne.number().int().nonnegative(),graderCalls:Ne.number().int().nonnegative(),plannedPairs:Ne.number().int().nonnegative(),usablePairs:Ne.number().int().nonnegative(),verdictPairs:Ne.number().int().nonnegative().optional(),passes:Ne.number().int().nonnegative(),liveCases:Ne.number().int().nonnegative(),mde:Ne.number().nonnegative().nullable(),wallMs:Ne.number().nonnegative()}).optional(),apply:Ne.boolean().default(!0)});vs.post("/eval-targets/:id/promotions",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=cO.parse(await e.req.json());if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let[s]=await u.select({id:k.id,content:k.content,version:k.version,metadata:k.metadata}).from(k).where(on(k.id,n));if(!s)return e.json({error:"Eval target not found"},404);let i=s.content,a=r.candidateContent,c=r.pairs,l=Uu(c,{baseline:"prior-version"}),p=!1,m=["adequacy could not be computed for this target"];try{let O=await Fi(t,n);p=O.powerCheck.adequate,m=O.powerCheck.reasons??[]}catch(O){m=[`adequacy check failed: ${O instanceof Error?O.message:String(O)}`]}let y=r.windowDays??Ic,v=r.maxPromotionsPerWindow??fi,h=new Date(Date.now()-y*24*60*60*1e3),[f]=await u.select({n:Mg`count(*)::int`}).from(ie).where(ql(on(ie.evalTargetId,n),on(ie.applied,!0),q0(ie.createdAt,h))),w=f?.n??0,b=$l(i),I=r.measuredAgainstContentHash===void 0?void 0:r.measuredAgainstContentHash===b,S=Df({verdict:l,canaryGreen:r.canaryGreen,adequate:p,adequacyReasons:m,promotionsInWindow:w,maxPromotionsPerWindow:v,immutableSections:r.immutableSections,beforeContent:i,afterContent:a,measurementMatchesPredecessor:I}),A={canaryGreen:r.canaryGreen,adequate:p,adequacyReasons:m,promotionsInWindow:w,maxPromotionsPerWindow:v,windowDays:y,immutableSections:r.immutableSections,nPairs:c.length,measurementMatchesPredecessor:I??null,measuredAgainstContentHash:r.measuredAgainstContentHash??null,cost:r.measurementCost??null,accumulation:r.accumulation?{...r.accumulation,pairs:c}:null,applied:!1},E=S.decision==="promote"&&r.apply;A.applied=E;let R;try{R=await u.transaction(async O=>{if(E){let P=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:{...P,content_hash:$l(a)},updatedAt:new Date}).where(on(k.id,n))}let[j]=await O.insert(ie).values({userId:t,evalTargetId:n,fromContentHash:b,toContentHash:$l(a),fromContent:i,toContent:a,proposalSource:r.proposalSource,proposalRationale:r.proposalRationale,decision:S.decision,applied:E,refusals:S.refusals,rationale:S.rationale,effectClass:S.effect,verdict:l,gates:A,touchedSections:S.touched}).returning({id:ie.id,createdAt:ie.createdAt});return j})}catch(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:S.decision,applied:E,rationale:S.rationale,refusals:S.refusals,effectClass:S.effect,touchedSections:S.touched,verdict:l,gates:A},201)});vs.get("/eval-targets/:id/promotions",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=Math.min(Number(e.req.query("limit")??50)||50,200),o=Math.max(Number(e.req.query("offset")??0)||0,0);if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let i=await u.select({id:ie.id,createdAt:ie.createdAt,decision:ie.decision,applied:ie.applied,effectClass:ie.effectClass,rationale:ie.rationale,refusals:ie.refusals,proposalSource:ie.proposalSource,proposalRationale:ie.proposalRationale,fromContentHash:ie.fromContentHash,toContentHash:ie.toContentHash,touchedSections:ie.touchedSections,verdict:ie.verdict,gates:ie.gates}).from(ie).where(on(ie.evalTargetId,n)).orderBy(iO(ie.createdAt)).limit(r).offset(o),a=await u.select({decision:ie.decision,n:Mg`count(*)::int`}).from(ie).where(on(ie.evalTargetId,n)).groupBy(ie.decision),c={promote:0,revert:0,refuse:0};for(let l of a)c[l.decision]=l.n;return e.json({promotions:i,counts:c,total:Object.values(c).reduce((l,p)=>l+p,0),limit:r,offset:o})});vs.post("/promotions/:promotionId/apply",async e=>{let t=e.get("userId"),n=e.req.param("promotionId");try{let r=await u.transaction(async o=>{let[s]=await o.select().from(ie).where(ql(on(ie.id,n),on(ie.userId,t))).for("update");if(!s)return{status:404,body:{error:"Promotion not found"}};if(s.applied)return{status:409,body:{error:"Already applied",code:"ALREADY_APPLIED"}};if(s.decision!=="promote")return{status:409,body:{error:`Only a "promote" can be applied; this decision was "${s.decision}"`,code:"NOT_A_PROMOTE"}};let[i]=await o.select().from(k).where(on(k.id,s.evalTargetId));if(!i)return{status:404,body:{error:"Eval target not found"}};if(i.content!==s.fromContent)return{status:409,body:{error:"The target has changed since this was measured \u2014 the verdict no longer describes this edit. Re-measure rather than applying a stale decision.",code:"STALE_MEASUREMENT"}};let a=new Date(Date.now()-Ic*864e5),[c]=await o.select({n:Mg`count(*)::int`}).from(ie).where(ql(on(ie.evalTargetId,s.evalTargetId),on(ie.applied,!0),q0(ie.createdAt,a)));if((c?.n??0)>=fi)return{status:409,body:{error:`Change budget exhausted (${c?.n}/${fi} applied in ${Ic}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:$l(s.toContent)},updatedAt:new Date}).where(on(k.id,s.evalTargetId));let p=s.gates&&typeof s.gates=="object"&&!Array.isArray(s.gates)?s.gates:{};return await o.update(ie).set({applied:!0,gates:{...p,applied:!0,appliedAt:new Date().toISOString(),appliedVia:"deferred-human-apply"}}).where(on(ie.id,s.id)),{status:200,body:{id:s.id,applied:!0,evalTargetId:s.evalTargetId,newVersion:(i.version??1)+1}}});return e.json(r.body,r.status)}catch(r){if(r?.code==="23505")return e.json({error:"This edit is already applied to this target",code:"PROMOTION_ALREADY_APPLIED"},409);throw r}});vs.get("/promotions/:promotionId",async e=>{let t=e.get("userId"),n=e.req.param("promotionId"),[r]=await u.select().from(ie).where(ql(on(ie.id,n),on(ie.userId,t)));return r?e.json(r):e.json({error:"Promotion not found"},404)});D();import{Hono as dO}from"hono";import{z as ft}from"zod";import{eq as Qn,and as Lg,asc as uO,desc as U0,isNull as lO,inArray as pO,sql as mO}from"drizzle-orm";var Is=new dO,fO=ft.object({jobId:ft.string().uuid().optional(),evalId:ft.string().uuid(),evalTargetId:ft.string().uuid(),evalTargetVersion:ft.number().int(),configuration:ft.enum(["with_target","without_target","baseline","with_candidate","with_prior_version"]),runNumber:ft.number().int().default(1),iteration:ft.number().int().default(1),status:ft.enum(["pending","running","completed","failed"]).default("completed"),outputs:ft.record(ft.unknown()).default({}),timing:ft.record(ft.unknown()).default({}),grading:ft.record(ft.unknown()).default({}),comparison:ft.record(ft.unknown()).nullable().optional()}),gO=ft.object({iteration:ft.number().int().default(1),runSummary:ft.record(ft.unknown()).default({}),notes:ft.array(ft.string()).default([])});Is.post("/eval-runs",async e=>{let t=e.get("userId"),n=await e.req.json(),r=fO.parse(n);if(!await Ke(r.evalTargetId,t))return e.json({error:"Eval target not found"},404);let[s]=await u.insert(be).values({jobId:r.jobId??null,evalId:r.evalId,evalTargetId:r.evalTargetId,evalTargetVersion:r.evalTargetVersion,configuration:r.configuration,runNumber:r.runNumber,iteration:r.iteration,status:r.status,outputs:r.outputs,timing:r.timing,grading:r.grading,comparison:r.comparison??null}).onConflictDoNothing().returning();if(s)return e.json(s,201);if(!r.jobId)return e.json({error:"Insert conflicted without a jobId"},409);let[i]=await u.select().from(be).where(Lg(Qn(be.jobId,r.jobId),Qn(be.evalId,r.evalId),Qn(be.configuration,r.configuration),Qn(be.runNumber,r.runNumber),Qn(be.iteration,r.iteration))).limit(1);return i?e.json({...i,deduped:!0},200):e.json({error:"Run conflicted but existing row not found"},409)});Is.get("/eval-targets/:id/runs",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=e.req.query("iteration"),o=e.req.query("configuration");if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let i=e.req.query("limit"),a=e.req.query("offset"),c=i?parseInt(i,10):NaN,l=Number.isFinite(c)?Math.min(Math.max(1,c),100):50,p=a?parseInt(a,10):NaN,m=Number.isFinite(p)?Math.max(0,p):0,y=[Qn(be.evalTargetId,n)];r&&y.push(Qn(be.iteration,parseInt(r,10))),o&&y.push(Qn(be.configuration,o)),e.req.query("activeCasesOnly")==="1"&&y.push(pO(be.evalId,u.select({id:Se.id}).from(Se).where(Lg(Qn(Se.evalTargetId,n),lO(Se.retiredAt)))));let v=e.req.query("candidateContentHash");v&&y.push(mO`${be.outputs}->>'candidateContentHash' = ${v}`);let h=e.req.query("jobId");if(h){let b=ft.string().uuid().safeParse(h);if(!b.success)return e.json({error:"Invalid jobId"},400);y.push(Qn(be.jobId,b.data))}let w=(await u.select().from(be).where(Lg(...y)).orderBy(U0(be.createdAt),uO(be.id)).limit(l).offset(m)).map(b=>{let I=b.outputs??{},{diff:S,transcript:A,...E}=I,R=v?E:{...E,transcript:A};return{...b,outputs:R,comparison:null}});return e.json(w)});Is.post("/eval-targets/:id/benchmarks",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=gO.parse(r);if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let[i]=await u.insert(zn).values({evalTargetId:n,iteration:o.iteration,runSummary:o.runSummary,notes:o.notes}).returning();return e.json(i,201)});Is.get("/eval-targets/:id/benchmarks",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let o=await u.select().from(zn).where(Qn(zn.evalTargetId,n)).orderBy(U0(zn.createdAt));return e.json(o)});D();import{Hono as hO}from"hono";import{z as qt}from"zod";import{eq as bs,and as B0,or as _O,desc as yO,asc as wO}from"drizzle-orm";import{alias as H0}from"drizzle-orm/pg-core";var Wi=new hO,vO=qt.object({targetAId:qt.string().uuid(),targetBId:qt.string().uuid(),targetAVersion:qt.number().int(),targetBVersion:qt.number().int(),isSwapped:qt.boolean(),winnerTargetId:qt.string().uuid().nullable(),perEval:qt.array(qt.object({evalName:qt.string(),winnerTargetId:qt.string().uuid().nullable(),reasoning:qt.string().default("")})).default([]),overall:qt.record(qt.unknown()).default({}),rawOutput:qt.string().nullable().optional(),model:qt.string().nullable().optional(),status:qt.enum(["completed","parse_failed"]).default("completed")});Wi.post("/eval-comparisons",async e=>{let t=e.get("userId"),n=await e.req.json(),r=vO.parse(n),[o,s]=await Promise.all([Ke(r.targetAId,t),Ke(r.targetBId,t)]);if(!o||!s)return e.json({error:"Eval target not found"},404);let i=d(c=>c===null||c===r.targetAId||c===r.targetBId,"validWinner");if(!i(r.winnerTargetId)||!r.perEval.every(c=>i(c.winnerTargetId)))return e.json({error:"winnerTargetId must be one of the compared targets or null"},400);let[a]=await u.insert(Xe).values({userId:t,targetAId:r.targetAId,targetBId:r.targetBId,targetAVersion:r.targetAVersion,targetBVersion:r.targetBVersion,isSwapped:r.isSwapped,winnerTargetId:r.winnerTargetId,perEval:r.perEval,overall:r.overall,rawOutput:r.rawOutput??null,model:r.model??null,status:r.status}).returning();return e.json(a,201)});Wi.get("/eval-targets/:id/comparisons",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let o=e.req.query("limit"),s=e.req.query("offset"),i=o?parseInt(o,10):NaN,a=Number.isFinite(i)?Math.min(Math.max(1,i),100):50,c=s?parseInt(s,10):NaN,l=Number.isFinite(c)?Math.max(0,c):0,p=H0(k,"targets_a"),m=H0(k,"targets_b"),y=await u.select({id:Xe.id,userId:Xe.userId,targetAId:Xe.targetAId,targetBId:Xe.targetBId,targetAName:p.name,targetBName:m.name,targetAVersion:Xe.targetAVersion,targetBVersion:Xe.targetBVersion,isSwapped:Xe.isSwapped,winnerTargetId:Xe.winnerTargetId,perEval:Xe.perEval,overall:Xe.overall,model:Xe.model,status:Xe.status,createdAt:Xe.createdAt}).from(Xe).innerJoin(p,bs(Xe.targetAId,p.id)).innerJoin(m,bs(Xe.targetBId,m.id)).where(B0(bs(Xe.userId,t),_O(bs(Xe.targetAId,n),bs(Xe.targetBId,n)))).orderBy(yO(Xe.createdAt),wO(Xe.id)).limit(a).offset(l);return e.json(y.map(v=>({...v,rawOutput:null})))});Wi.get("/eval-comparisons/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=qt.string().uuid().safeParse(n);if(!r.success)return e.json({error:"Invalid comparison id"},400);let[o]=await u.select().from(Xe).where(B0(bs(Xe.id,r.data),bs(Xe.userId,t)));return o?e.json(o):e.json({error:"Comparison not found"},404)});D();import{Hono as AO}from"hono";import{z as zi}from"zod";import{eq as Vi,and as $g,desc as EO,asc as xO,inArray as TO,sql as RO}from"drizzle-orm";D();import{sql as IO}from"drizzle-orm";function F0(e){if(e.n===0)return null;let t=e.agree/e.n,n=e.aYes/e.n,r=e.bYes/e.n,o=n*r+(1-n)*(1-r);return o>=1?null:(t-o)/(1-o)}d(F0,"kappaFromCounts");var W0=d((e,t)=>({agree:e,total:t,rate:t>0?e/t:null}),"slice");function bO(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:F0({n:e.pairs,agree:e.agreeHuman,aYes:e.humanYes,bYes:e.reviewerYes}),snapshotAgreementRate:e.pairs>0?e.snapshotAgree/e.pairs:null,snapshotKappa:F0({n:e.pairs,agree:e.snapshotAgree,aYes:e.snapshotHumanYes,bYes:e.reviewerYes}),judgeAgreementRate:e.pairs>0?e.judgeAgreeHuman/e.pairs:null,onJudgePass:W0(e.judgePassAgree,e.judgePassPairs),onJudgeFail:W0(e.agreeHuman-e.judgePassAgree,e.pairs-e.judgePassPairs),suggestedAnchorWeight:t==null?null:Math.max(0,2*t-1)**2,unresolvedFlags:e.unresolvedFlags,kept:e.kept,relabeled:e.relabeled,lastReviewedAt:e.lastReviewedAt}}d(bO,"reviewerAgreementReport");async function z0(e){return(await u.execute(IO`
|
|
914
919
|
SELECT
|
|
915
920
|
j.reviewer_engine,
|
|
916
921
|
array_agg(DISTINCT j.reviewer_model) AS models,
|
|
@@ -942,7 +947,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
942
947
|
) j
|
|
943
948
|
GROUP BY j.reviewer_engine
|
|
944
949
|
ORDER BY j.reviewer_engine
|
|
945
|
-
`)).map(n=>
|
|
950
|
+
`)).map(n=>bO({reviewerEngine:n.reviewer_engine,models:n.models,pairs:n.pairs,orphaned:n.orphaned,agreeHuman:n.agree_human,humanYes:n.human_yes,reviewerYes:n.reviewer_yes,judgeAgreeHuman:n.judge_agree_human,judgePassPairs:n.judge_pass_pairs,judgePassAgree:n.judge_pass_agree,snapshotAgree:n.snapshot_agree,snapshotHumanYes:n.snapshot_human_yes,unresolvedFlags:n.unresolved_flags,kept:n.kept,relabeled:n.relabeled,lastReviewedAt:n.last_reviewed_at}))}d(z0,"computeReviewerAgreement");D();import{eq as SO}from"drizzle-orm";async function zc(e,t,n={}){let{nudge:r=!0}=n;try{let[o]=await u.select({name:k.name,userId:k.userId}).from(k).where(SO(k.id,t));if(!o||o.userId!==e)return;let s=await Fi(e,t);if(s.powerCheck.adequate){await tn({userId:e,type:"calibration_ready",title:"Anchor set adequate \u2014 calibrated verdicts unlocked",body:`${o.name}: enough human labels for a calibrated judge verdict. Automated updates (optimize / auto-run) can now be trusted on this target.`,url:`/eval-targets/${t}?tab=review`,sourceTable:"eval_targets",sourceId:`calibration:${t}:${s.pooling.judgeModel??"unstamped"}`,metadata:{evalTargetId:t,judgeModel:s.pooling.judgeModel,labeledRuns:s.anchors.labeledRuns,pooled:s.pooling.engaged}});let c=await Nl(e);c&&!(c.claude&&c.codex)&&await tn({userId:e,type:"second_engine_needed",title:"Add a second engine to validate your judge",body:`${o.name}: your judge is calibrated. Cross-vendor validation (rulemetric evals validate-judge) needs a second LLM engine \u2014 `+(c.codex?"the claude CLI was not detected on your worker machine.":"install the Codex CLI (npm install -g @openai/codex) on your worker machine."),url:"/connect",sourceTable:"profiles",sourceId:"second-engine",metadata:{evalTargetId:t,engines:c}});return}if(!r)return;let i=await $0(t);if(i<=0)return;let a=s.powerCheck.reasons[0];await tn({userId:e,type:"labels_needed",title:"Review needed to calibrate the judge",body:`${o.name}: ${i} graded output${i===1?"":"s"} awaiting your review.${a?` ${a}.`:""}`,url:`/eval-targets/${t}?tab=review`,sourceTable:"eval_targets",sourceId:`labels:${t}:${new Date().toISOString().slice(0,10)}`,metadata:{evalTargetId:t,remaining:i}})}catch(o){console.error("[label-notifications] notify failed:",o instanceof Error?o.stack:o)}}d(zc,"notifyLabelState");var Br=new AO,kO=zi.object({verdict:zi.enum(["approve","reject"]),flag:zi.enum(["bad_grade","bad_assertion"]).nullable().optional(),note:zi.string().max(2e3).nullable().optional()});async function V0(e,t){let n=zi.string().uuid().safeParse(e);if(!n.success)return null;let[r]=await u.select().from(be).where(Vi(be.id,n.data));return r&&await Ke(r.evalTargetId,t)?r:null}d(V0,"loadOwnedRun");Br.put("/eval-runs/:runId/annotations/:index",async e=>{let t=e.get("userId"),n=e.req.param("runId"),r=e.req.param("index"),o=kO.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 V0(n,t);if(!i)return e.json({error:"Eval run not found"},404);let a=i.grading.expectations;if(!Array.isArray(a)||s>=a.length)return e.json({error:"Expectation index out of range for this run"},400);let c=a[s];if(typeof c?.passed!="boolean")return e.json({error:"Expectation has no grade to annotate"},400);if(c.errored===!0)return e.json({error:"Expectation errored during grading \u2014 no judge verdict exists to annotate"},400);let l=c.method==="deterministic"?"deterministic":"llm",p=i.grading.judge_model??null,[m]=await u.insert(Je).values({userId:t,evalRunId:i.id,evalTargetId:i.evalTargetId,expectationIndex:s,expectationText:c.text??"",judgePassed:c.passed,judgeMethod:l,judgeModel:p,verdict:o.verdict,flag:o.flag??null,note:o.note??null}).onConflictDoUpdate({target:[Je.evalRunId,Je.expectationIndex],set:{verdict:o.verdict,...o.flag!==void 0?{flag:o.flag}:{},...o.note!==void 0?{note:o.note}:{},expectationText:c.text??"",judgePassed:c.passed,judgeMethod:l,judgeModel:p,updatedAt:new Date}}).returning();await zc(t,i.evalTargetId,{nudge:!1});try{await qI({evalTargetId:i.evalTargetId,userId:t})}catch(y){console.error("[eval-annotations] judge-review enqueue failed:",y instanceof Error?y.message:y)}return e.json(m)});Br.delete("/eval-runs/:runId/annotations/:index",async e=>{let t=e.get("userId"),n=e.req.param("runId"),r=parseInt(e.req.param("index"),10);if(!Number.isInteger(r)||r<0)return e.json({error:"Invalid expectation index"},400);let o=await V0(n,t);return o?(await u.delete(Je).where($g(Vi(Je.evalRunId,o.id),Vi(Je.expectationIndex,r))).returning({id:Je.id})).length===0?e.json({error:"Annotation not found"},404):e.json({deleted:!0}):e.json({error:"Eval run not found"},404)});Br.post("/eval-targets/:id/label-state",async e=>{let t=e.get("userId"),n=e.req.param("id");return await Ke(n,t)?(await zc(t,n),e.json({ok:!0})):e.json({error:"Eval target not found"},404)});Br.get("/eval-targets/:id/annotations",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let o=e.req.query("limit"),s=e.req.query("offset"),i=o?parseInt(o,10):NaN,a=Number.isFinite(i)?Math.min(Math.max(1,i),500):200,c=s?parseInt(s,10):NaN,l=Number.isFinite(c)?Math.max(0,c):0,p=[Vi(Je.evalTargetId,n)],m=e.req.query("runId");if(m){let v=zi.string().uuid().safeParse(m);if(!v.success)return e.json({error:"Invalid runId"},400);p.push(Vi(Je.evalRunId,v.data))}let y=await u.select().from(Je).where($g(...p)).orderBy(EO(Je.createdAt),xO(Je.id)).limit(a).offset(l);return e.json(y)});Br.get("/eval-targets/:id/judge-calibration",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let[o,s]=await Promise.all([Fi(t,n),z0(n)]);return e.json({...o,reviewers:s})});Br.get("/eval-targets/:id/annotation-queue",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let o=e.req.query("limit"),s=o?parseInt(o,10):NaN,i=Number.isFinite(s)?Math.min(Math.max(1,s),20):5,a=await u.execute(RO`
|
|
946
951
|
WITH current_judge AS (
|
|
947
952
|
-- Same definition as judge-calibration: most recently stamped run's
|
|
948
953
|
-- model; empty (NULL) until any grading carries judge_model. Labeling a
|
|
@@ -987,13 +992,13 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
987
992
|
WHERE llm_total > llm_annotated
|
|
988
993
|
ORDER BY (llm_annotated > 0) DESC, random()
|
|
989
994
|
LIMIT ${i}
|
|
990
|
-
`),c=a.map(m=>m.id),l=c.length?await u.select().from(Je).where(
|
|
995
|
+
`),c=a.map(m=>m.id),l=c.length?await u.select().from(Je).where($g(Vi(Je.evalTargetId,n),TO(Je.evalRunId,c))):[],p=new Map(l.map(m=>[`${m.evalRunId}:${m.expectationIndex}`,m]));return e.json({remaining:a[0]?.remaining??0,runs:a.map(m=>({id:m.id,configuration:m.configuration,runNumber:m.run_number,iteration:m.iteration,createdAt:m.created_at,evalName:m.eval_name,prompt:m.prompt,output:m.output,outputTruncated:m.output_truncated,expectations:(m.expectations??[]).map((y,v)=>{let h=p.get(`${m.id}:${v}`);return{index:v,text:y.text??"",passed:y.passed??!1,evidence:y.evidence??"",method:y.method==="deterministic"?"deterministic":"llm",errored:y.errored===!0,annotation:h?{verdict:h.verdict,flag:h.flag}:null}})}))})});D();import{Hono as jO}from"hono";import{z as un}from"zod";import{eq as Mn,and as Vc,isNull as qg,sql as Ji,inArray as NO}from"drizzle-orm";var Ss=new jO,PO=un.object({evalRunId:un.string().uuid(),expectationIndex:un.number().int().min(0),expectationText:un.string(),judgePassed:un.boolean(),humanPassed:un.boolean(),reviewerPassed:un.boolean()}),CO=un.object({reviewerEngine:un.enum(["claude","codex"]),reviewerModel:un.string().min(1).max(200),verdicts:un.array(PO).min(1).max(500)});Ss.put("/eval-targets/:id/judge-reviews",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let o=CO.parse(await e.req.json()),s=[...new Set(o.verdicts.map(c=>c.evalRunId))];if((await u.select({id:be.id}).from(be).where(Vc(NO(be.id,s),Mn(be.evalTargetId,n)))).length!==s.length)return e.json({error:"One or more runs do not belong to this target"},400);let a=0;for(let c of o.verdicts)await u.insert(pe).values({userId:t,evalTargetId:n,evalRunId:c.evalRunId,expectationIndex:c.expectationIndex,expectationText:c.expectationText,judgePassed:c.judgePassed,humanPassed:c.humanPassed,reviewerEngine:o.reviewerEngine,reviewerModel:o.reviewerModel,reviewerPassed:c.reviewerPassed}).onConflictDoUpdate({target:[pe.evalRunId,pe.expectationIndex,pe.reviewerModel],set:{expectationText:c.expectationText,judgePassed:c.judgePassed,humanPassed:c.humanPassed,reviewerEngine:o.reviewerEngine,reviewerPassed:c.reviewerPassed,resolvedAt:Ji`CASE WHEN ${pe.reviewerPassed} <> ${c.reviewerPassed} THEN NULL ELSE ${pe.resolvedAt} END`,resolution:Ji`CASE WHEN ${pe.reviewerPassed} <> ${c.reviewerPassed} THEN NULL ELSE ${pe.resolution} END`,updatedAt:new Date}}),a+=1;if(o.verdicts.some(c=>c.reviewerPassed!==c.humanPassed))try{let[{count:c}]=await u.select({count:Ji`count(*)::int`}).from(pe).where(Vc(Mn(pe.evalTargetId,n),qg(pe.resolvedAt),Ji`${pe.reviewerPassed} <> ${pe.humanPassed}`));if(c>0){let[l]=await u.select({name:k.name}).from(k).where(Mn(k.id,n));await tn({userId:t,type:"second_opinions_flagged",title:"Second opinions flag some of your labels",body:`${l?.name??"Eval target"}: a ${o.reviewerModel} review pass disagrees with ${c} of your label${c===1?"":"s"} \u2014 worth a second look; genuine judge errors become reject anchors.`,url:`/eval-targets/${n}?tab=review`,sourceTable:"eval_targets",sourceId:`second-opinions:${n}:${new Date().toISOString().slice(0,10)}`,metadata:{evalTargetId:n,unresolved:c,reviewerModel:o.reviewerModel}})}}catch(c){console.error("[judge-reviews] flag notification failed:",c instanceof Error?c.message:c)}return e.json({upserted:a})});Ss.get("/eval-targets/:id/judge-reviews",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let o=await u.select({evalRunId:pe.evalRunId,expectationIndex:pe.expectationIndex,reviewerEngine:pe.reviewerEngine,reviewerModel:pe.reviewerModel,reviewerPassed:pe.reviewerPassed,humanPassed:pe.humanPassed,resolvedAt:pe.resolvedAt}).from(pe).where(Mn(pe.evalTargetId,n));return e.json(o)});Ss.get("/eval-targets/:id/judge-reviews/disagreements",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let o=await u.select({id:pe.id,evalRunId:pe.evalRunId,expectationIndex:pe.expectationIndex,expectationText:pe.expectationText,judgePassed:pe.judgePassed,humanPassed:pe.humanPassed,reviewerEngine:pe.reviewerEngine,reviewerModel:pe.reviewerModel,reviewerPassed:pe.reviewerPassed,evalName:Se.name,configuration:be.configuration,runNumber:be.runNumber,outputExcerpt:Ji`LEFT(${be.outputs}->>'transcript', 1200)`}).from(pe).innerJoin(be,Mn(be.id,pe.evalRunId)).leftJoin(Se,Mn(Se.id,be.evalId)).where(Vc(Mn(pe.evalTargetId,n),qg(pe.resolvedAt),Ji`${pe.reviewerPassed} <> ${pe.humanPassed}`)).orderBy(pe.evalRunId,pe.expectationIndex);return e.json(o)});var DO=un.object({resolution:un.enum(["kept","relabeled"])});Ss.patch("/judge-reviews/:id/resolve",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=un.string().uuid().safeParse(n);if(!r.success)return e.json({error:"Invalid id"},400);let o=DO.parse(await e.req.json()),[s]=await u.select().from(pe).where(Vc(Mn(pe.id,r.data),Mn(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(Vc(Mn(pe.evalRunId,s.evalRunId),Mn(pe.expectationIndex,s.expectationIndex),Mn(pe.userId,t),qg(pe.resolvedAt))).returning({id:pe.id});return e.json({resolved:i.length})});D();import{createHash as MO}from"node:crypto";import{Hono as LO}from"hono";import{z as ne}from"zod";import{eq as Xt,and as Gi,desc as Hg,asc as $O,sql as yr,isNull as qO}from"drizzle-orm";import{alias as J0}from"drizzle-orm/pg-core";function OO(e){if(e===null||typeof e!="object")return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}d(OO,"isPlainObject");function Ul(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=Ul(e[n]);t===null&&r!==e[n]&&(t=e.slice(0,n)),t!==null&&t.push(r)}return t??e}if(OO(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=Ul(s);if(n===null&&(i!==o||a!==s)){n={};for(let c=0;c<r;c++)n[t[c][0]]=t[c][1]}n!==null&&(n[i]=a)}return n??e}return e}d(Ul,"stripNullBytes");Al();function UO(){return{enabled:process.env.RULEMETRIC_OFFLOAD_DELTAS==="1"||process.env.RULEMETRIC_OFFLOAD_DELTAS==="true",thresholdBytes:Number(process.env.OFFLOAD_GZIP_THRESHOLD_BYTES)||49152}}d(UO,"offloadConfig");function G0(e){return MO("sha256").update(JSON.stringify(e)).digest("hex")}d(G0,"hashJson");function K0(e,t){return Array.isArray(e)?e:Array.isArray(t)?t:[]}d(K0,"arrayOr");function Y0(e,t){return yr`COALESCE(
|
|
991
996
|
CASE WHEN jsonb_typeof(${e}) = 'array' THEN ${e} END,
|
|
992
997
|
CASE WHEN jsonb_typeof(${t}) = 'array' THEN ${t} END,
|
|
993
998
|
'[]'::jsonb
|
|
994
|
-
)`}d(
|
|
999
|
+
)`}d(Y0,"resolvedJsonArray");async function HO(e){let{enabled:t,thresholdBytes:n}=UO();if(!t||e.length===0)return{messagesDelta:e,messagesDeltaRef:null};let r=vg(e);if(r.bytes<=n)return{messagesDelta:e,messagesDeltaRef:null};try{let{ref:o}=await Ig(r);return{messagesDelta:null,messagesDeltaRef:o}}catch(o){return console.error("[context-snapshots] delta offload failed, writing inline:",o instanceof Error?o.message:o),{messagesDelta:e,messagesDeltaRef:null}}}d(HO,"resolveDeltaStorage");async function Ug(e,t,n){let r=JSON.stringify(n);await u.insert(_n).values({hash:e,contentType:t,content:n,sizeBytes:Buffer.byteLength(r,"utf-8")}).onConflictDoNothing()}d(Ug,"upsertBlob");var Ki=new LO,BO=ne.object({provider:ne.string(),model:ne.string(),system_prompt:ne.string(),system_blocks:ne.array(ne.unknown()).default([]),injected_instructions:ne.union([ne.array(ne.string()),ne.string()]).default([]),messages:ne.array(ne.unknown()).optional(),messages_raw:ne.array(ne.unknown()).optional(),messages_summary:ne.unknown().optional(),tools:ne.array(ne.unknown()).default([]),system_hash:ne.string(),request_hash:ne.string().optional(),sequence:ne.number().int().optional(),max_tokens:ne.number().nullable().optional(),temperature:ne.number().nullable().optional(),top_p:ne.number().nullable().optional(),top_k:ne.number().nullable().optional(),stop_sequences:ne.array(ne.string()).optional(),stream:ne.boolean().optional(),tool_choice:ne.unknown().optional(),thinking:ne.unknown().optional(),api_metadata:ne.unknown().optional(),request_headers:ne.record(ne.string()).optional(),response_headers:ne.record(ne.string()).optional(),response_status:ne.number().optional(),beta_features:ne.array(ne.string()).optional(),usage:ne.object({input_tokens:ne.number().nullable().optional(),output_tokens:ne.number().nullable().optional(),cache_creation_input_tokens:ne.number().nullable().optional(),cache_read_input_tokens:ne.number().nullable().optional(),total_tokens:ne.number().nullable().optional()}).optional(),response:ne.record(ne.unknown()).optional(),estimated_tokens:ne.number().nullable().optional(),captured_at:ne.string().optional(),metadata:ne.record(ne.unknown()).optional(),context_items:ne.array(ne.object({type:ne.string(),name:ne.string(),content_hash:ne.string().optional(),char_count:ne.number().optional(),estimated_tokens:ne.number().optional(),triggered_by:ne.string().optional(),message_index:ne.number().optional(),preview:ne.string().optional(),skill_names:ne.array(ne.string()).optional(),tool_names:ne.array(ne.string()).optional()}).passthrough()).optional()}),FO=100,WO=500;async function X0(e,t){let[n]=await u.select({id:L.id,sequence:L.sequence}).from(L).where(Gi(Xt(L.sessionId,e),Xt(L.requestHash,t))).limit(1);return n??null}d(X0,"findSnapshotByHash");Ki.post("/sessions/:id/context-snapshots",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=Ul(BO.parse(r)),[s]=await u.select({id:_.id,projectPath:_.projectPath,projectId:_.projectId}).from(_).where(Gi(Xt(_.id,n),Xt(_.userId,t)));if(!s)return e.json({error:"Session not found"},404);if(!s.projectPath&&o.context_items?.length){let h=o.context_items.find(f=>f.type==="claude_md"&&typeof f.name=="string"&&f.name.startsWith("/")&&f.name.endsWith("/CLAUDE.md"));if(h){let f=h.name.slice(0,-10),w=null;if(!s.projectId){let[b]=await u.select({projectId:le.projectId}).from(le).where(Xt(le.path,f)).limit(1);w=b?.projectId??null}await u.update(_).set({projectPath:f,...w?{projectId:w}:{}}).where(Gi(Xt(_.id,n),qO(_.projectPath)))}}let i=o.messages??o.messages_summary??[],a=o.messages_raw??[],c=o.request_hash??"",l=Array.isArray(o.injected_instructions)?o.injected_instructions:[o.injected_instructions];if(c){let h=await X0(n,c);if(h)return e.json({id:h.id,sequence:h.sequence,deduplicated:!0})}let p=G0(o.tools),m=G0(l);await Promise.all([Ug(o.system_hash,"system_prompt",o.system_prompt),Ug(p,"tools",o.tools),Ug(m,"injected_instructions",l)]);let y={sessionId:n,userId:t,provider:o.provider,model:o.model,systemPrompt:"",injectedInstructions:[],messagesSummary:i,tools:[],systemHash:o.system_hash,toolsHash:p,injectedHash:m,requestHash:c,maxTokens:o.max_tokens??null,temperature:o.temperature??null,estimatedTokens:o.estimated_tokens??null,capturedAt:o.captured_at?new Date(o.captured_at):new Date,metadata:{...o.metadata,...o.context_items?.length&&{contextItems:o.context_items},...o.top_p!=null&&{topP:o.top_p},...o.top_k!=null&&{topK:o.top_k},...o.stop_sequences?.length&&{stopSequences:o.stop_sequences},...o.stream!=null&&{stream:o.stream},...o.tool_choice!=null&&{toolChoice:o.tool_choice},...o.thinking!=null&&{thinking:o.thinking},...o.api_metadata!=null&&{apiMetadata:o.api_metadata},...o.request_headers!=null&&{requestHeaders:o.request_headers},...o.response_headers!=null&&{responseHeaders:o.response_headers},...o.response_status!=null&&{responseStatus:o.response_status},...o.beta_features?.length&&{betaFeatures:o.beta_features},...o.usage!=null&&{usage:o.usage},...o.response!=null&&{response:o.response}}},v=5;for(let h=0;h<=v;h++){let[f]=await u.select({sequence:L.sequence,messagesSummary:L.messagesSummary}).from(L).where(Xt(L.sessionId,n)).orderBy(Hg(L.sequence)).limit(1),w=(f?.sequence??-1)+1,b=Array.isArray(f?.messagesSummary)?f.messagesSummary:[],I=a,S=0,A=Math.min(b.length,I.length);for(;S<A&&JSON.stringify(b[S])===JSON.stringify(I[S]);)S++;let E=I.slice(S),R=await HO(E);try{let[O]=await u.insert(L).values({...y,sequence:w,...R}).returning({id:L.id,sequence:L.sequence});return e.json({id:O.id,sequence:O.sequence},201)}catch(O){let j=O.cause,P=j?.constraint_name??"",$=`${O instanceof Error?O.message:""} ${j?.message??""}`.toLowerCase();if(j?.code==="23505"){if((P==="idx_snapshots_session_request"||$.includes("request"))&&c){let H=await X0(n,c);if(H)return e.json({id:H.id,sequence:H.sequence,deduplicated:!0})}if(h<v)continue;return e.json({error:"snapshot sequence assignment failed after retries"},503)}if($.includes("foreign key"))return e.json({error:"Session no longer exists"},404);throw O}}return e.json({error:"snapshot sequence assignment failed after retries"},503)});Ki.get("/sessions/:id/context-snapshots",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=Number(e.req.query("limit")||FO),o=Math.min(Math.max(1,r),WO),s=Math.max(0,Number(e.req.query("offset")||0)),[i]=await u.select({id:_.id}).from(_).where(Gi(Xt(_.id,n),Xt(_.userId,t)));if(!i)return e.json({error:"Session not found"},404);if(!(e.req.query("full")==="true")){let l=J0(_n,"cb_tools"),p=J0(_n,"cb_injected"),y=(await u.select({id:L.id,sessionId:L.sessionId,userId:L.userId,sequence:L.sequence,provider:L.provider,model:L.model,systemHash:L.systemHash,requestHash:L.requestHash,maxTokens:L.maxTokens,temperature:L.temperature,estimatedTokens:L.estimatedTokens,capturedAt:L.capturedAt,injectedCount:yr`jsonb_array_length(${Y0(p.content,L.injectedInstructions)})`,toolsLight:yr`COALESCE((
|
|
995
1000
|
SELECT jsonb_agg(jsonb_build_object('name', t->'name', 'description', left(COALESCE(t->>'description', ''), 80)))
|
|
996
|
-
FROM jsonb_array_elements(${
|
|
1001
|
+
FROM jsonb_array_elements(${Y0(l.content,L.tools)}) AS t
|
|
997
1002
|
), '[]'::jsonb)`,metadataLight:yr`jsonb_strip_nulls(jsonb_build_object(
|
|
998
1003
|
'usage', ${L.metadata}->'usage',
|
|
999
1004
|
'response', ${L.metadata}->'response',
|
|
@@ -1009,15 +1014,15 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
1009
1014
|
)
|
|
1010
1015
|
ELSE NULL
|
|
1011
1016
|
END
|
|
1012
|
-
))`}).from(L).leftJoin(l,Xt(l.hash,L.toolsHash)).leftJoin(p,Xt(p.hash,L.injectedHash)).where(Xt(L.sessionId,n)).orderBy(
|
|
1017
|
+
))`}).from(L).leftJoin(l,Xt(l.hash,L.toolsHash)).leftJoin(p,Xt(p.hash,L.injectedHash)).where(Xt(L.sessionId,n)).orderBy(Hg(L.capturedAt)).limit(o).offset(s)).map(v=>({id:v.id,sessionId:v.sessionId,userId:v.userId,sequence:v.sequence,provider:v.provider,model:v.model,systemHash:v.systemHash,requestHash:v.requestHash,maxTokens:v.maxTokens,temperature:v.temperature,estimatedTokens:v.estimatedTokens,capturedAt:v.capturedAt,metadata:v.metadataLight??{},systemPrompt:"",messagesSummary:[],tools:v.toolsLight??[],injectedInstructions:new Array(Number(v.injectedCount??0)).fill("[omitted]")}));return e.json(y)}let c=await nt.select().from(L).where(Xt(L.sessionId,n)).orderBy(Hg(L.capturedAt)).limit(o).offset(s);return e.json(await y0(await bg(c)))});Ki.get("/context-snapshots/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await nt.select().from(L).where(Gi(Xt(L.id,n),Xt(L.userId,t)));if(!r)return e.json({error:"Snapshot not found"},404);let o=r.messagesDeltaRef?await Dc(r.messagesDeltaRef):r.messagesDelta;if(r.systemPrompt||r.tools?.length>0)return e.json(r.messagesDeltaRef?{...r,messagesDelta:o}:r);let s=[r.systemHash,r.toolsHash,r.injectedHash].filter(Boolean),i=s.length>0?await u.select().from(_n).where(yr`${_n.hash} IN (${yr.join(s.map(p=>yr`${p}`),yr`, `)})`):[],a=new Map(i.map(p=>[p.hash,p.content])),c=[],l=!1;if(o){let{messages:p,truncated:m}=await Il({fetchPage:d(async(y,v)=>Oc(await nt.select({sequence:L.sequence,messagesDelta:L.messagesDelta,messagesDeltaRef:L.messagesDeltaRef}).from(L).where(Gi(Xt(L.sessionId,r.sessionId),yr`${L.sequence} <= ${r.sequence}`,yr`${L.sequence} > ${y}`)).orderBy($O(L.sequence)).limit(v)),"fetchPage")});c=p,l=m}return e.json({...r,systemPrompt:a.get(r.systemHash)??r.systemPrompt??"",tools:K0(a.get(r.toolsHash??""),r.tools),injectedInstructions:K0(a.get(r.injectedHash??""),r.injectedInstructions),messagesDelta:o,messagesRaw:c,messagesTruncated:l})});D();import{Hono as zO}from"hono";import{z as Ro}from"zod";import{eq as Zn,and as Jc,desc as VO,ne as JO}from"drizzle-orm";import{z as wr}from"zod";var Hl=wr.object({parallel:wr.number().int().positive().default(1),runsPerEval:wr.number().int().positive().default(1),iteration:wr.number().int().positive().default(1),skipBaseline:wr.boolean().default(!1),skipGrading:wr.boolean().default(!1),generateIfEmpty:wr.boolean().default(!1),model:wr.string().optional(),graderModel:wr.string().optional(),timeout:wr.number().int().positive().default(12e4)}).default({});var ko=new zO,GO=Ro.object({evalTargetId:Ro.string().uuid(),config:Hl});ko.post("/eval-jobs",async e=>{let t=e.get("userId"),n=await e.req.json(),r=GO.parse(n),{id:o,noLiveWorker:s}=await Rt({taskName:"process_eval",payload:{evalTargetId:r.evalTargetId,config:r.config},userId:t,mirror:{userId:t,evalTargetId:r.evalTargetId,config:r.config}}),[i]=await u.select().from(ke).where(Zn(ke.id,o));return e.json({...i,noLiveWorker:s},201)});ko.get("/eval-targets/:id/jobs",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await u.select().from(ke).where(Jc(Zn(ke.evalTargetId,n),Zn(ke.userId,t))).orderBy(VO(ke.createdAt));return e.json(r)});ko.patch("/eval-jobs/:id/progress",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),s=["running","paused"].includes(r.status)?r.status:"running",[i]=await u.update(ke).set({status:s,progress:r.progress,updatedAt:new Date}).where(Jc(Zn(ke.id,n),Zn(ke.userId,t))).returning();return i?e.json(i):e.json({error:"Job not found"},404)});var KO=Ro.object({status:Ro.enum(["running","completed","failed"]).optional(),attempts:Ro.number().int().nonnegative().optional(),error:Ro.string().optional(),result:Ro.record(Ro.unknown()).optional()});ko.patch("/eval-jobs/:id/state",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=KO.parse(await e.req.json()),o={updatedAt:new Date};r.attempts!==void 0&&(o.attempts=r.attempts),r.status&&(o.status=r.status),r.error&&(o.error=r.error),r.result!==void 0&&(o.result=r.result),(r.status==="completed"||r.status==="failed")&&(o.completedAt=new Date);let[s]=await u.update(ke).set(o).where(Jc(Zn(ke.id,n),Zn(ke.userId,t),JO(ke.status,"cancelled"))).returning();if(!s){let[i]=await u.select().from(ke).where(Jc(Zn(ke.id,n),Zn(ke.userId,t)));return i?e.json(i):e.json({error:"Job not found"},404)}return e.json(s)});ko.post("/eval-jobs/:id/cancel",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.update(ke).set({status:"cancelled",updatedAt:new Date}).where(Jc(Zn(ke.id,n),Zn(ke.userId,t))).returning();return r?e.json(r):e.json({error:"Job not found"},404)});D();import{Hono as YO}from"hono";import{z as As}from"zod";import{eq as Gc,and as Bg,isNull as XO,desc as QO,sql as Q0}from"drizzle-orm";var Bl=new YO,ZO=As.object({contentHash:As.string().min(1).optional(),evalTargetId:As.string().uuid().optional(),name:As.string().min(1).max(255),type:As.enum(["instruction","skill","prompt","plan"]).default("instruction"),content:As.string().optional(),sessionId:As.string().uuid().optional(),config:Hl});async function eM(e){let t=await u.select({systemPrompt:L.systemPrompt,systemHash:L.systemHash,metadata:L.metadata}).from(L).where(Q0`${L.metadata}->'contextItems' @> ${JSON.stringify([{content_hash:e}])}::jsonb`).orderBy(QO(L.capturedAt)).limit(1);if(t.length===0)return null;let n=t[0],r=await El(n.systemHash,n.systemPrompt),i=(n.metadata?.contextItems??[]).find(p=>p.content_hash===e);if(!i?.name)return r;let a=i.name.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),c=new RegExp(`Contents of [^\\n]*${a}[^\\n]*\\n([\\s\\S]*?)(?=Contents of |$)`,"i"),l=r.match(c);return l?l[1].trim():r}d(eM,"resolveContentFromSnapshot");Bl.post("/eval-from-context",async e=>{let t=e.get("userId"),n=await e.req.json(),r=ZO.parse(n),o=!1,s;if(r.evalTargetId){let[y]=await u.select({id:k.id}).from(k).where(Bg(Gc(k.id,r.evalTargetId),Gc(k.userId,t))).limit(1);if(!y)return e.json({error:"Eval target not found"},404);s=y.id}else if(r.contentHash){let[y]=await u.select({id:k.id}).from(k).where(Bg(Gc(k.userId,t),Q0`${k.metadata}->>'content_hash' = ${r.contentHash}`)).limit(1);if(y)s=y.id;else{let v=r.content;if(v||(v=await eM(r.contentHash)??void 0),!v)return e.json({error:"Content not provided and could not be resolved from snapshots"},400);let[h]=await u.insert(k).values({userId:t,name:r.name,type:r.type,content:v,description:`Auto-created from session context item: ${r.name}`,metadata:{content_hash:r.contentHash,source_session_id:r.sessionId}}).returning();s=h.id,o=!0}}else return e.json({error:"Provide contentHash or evalTargetId"},400);let a=(await u.select({id:Se.id}).from(Se).where(Bg(Gc(Se.evalTargetId,s),XO(Se.retiredAt))).limit(1)).length===0,c=a?{...r.config,generateIfEmpty:!0}:r.config,{id:l,noLiveWorker:p}=await Rt({taskName:"process_eval",payload:{evalTargetId:s,config:c},userId:t,mirror:{userId:t,evalTargetId:s,config:c}}),[m]=await u.select().from(ke).where(Gc(ke.id,l));return e.json({evalTargetId:s,evalJobId:m.id,evalCasesCreated:0,generationDeferred:a,isNewTarget:o,noLiveWorker:p},201)});import{Hono as iL}from"hono";D();import{Hono as tM}from"hono";import{and as Z0,eq as Fg,sql as ln}from"drizzle-orm";var Wg=new tM;Wg.get("/insights/projects",async e=>{let t=e.get("userId"),n=await u.select({projectId:_.projectId,name:U.name,gitRemoteUrl:U.gitRemoteUrl,sessionCount:ln`COUNT(*)`,enrichedCount:ln`COUNT(CASE WHEN ${_.metadata}->'local_session_meta' IS NOT NULL THEN 1 END)`,analyzedCount:ln`COUNT(CASE WHEN ${_.analysis} IS NOT NULL THEN 1 END)`,firstSession:ln`MIN(${_.startedAt})`,lastSession:ln`MAX(${_.startedAt})`}).from(_).innerJoin(U,Fg(U.id,_.projectId)).where(Z0(Fg(_.userId,t),ln`${_.projectId} IS NOT NULL`)).groupBy(_.projectId,U.name,U.gitRemoteUrl),r=await u.execute(ln`
|
|
1013
1018
|
select project_id, project_path, count(*)::int as n
|
|
1014
1019
|
from sessions
|
|
1015
1020
|
where user_id = ${t}
|
|
1016
1021
|
and project_id is not null
|
|
1017
1022
|
and project_path is not null
|
|
1018
1023
|
group by project_id, project_path
|
|
1019
|
-
`),o=new Map,s=new Map;for(let p of r){let m=s.get(p.project_id)??-1;p.n>m&&(s.set(p.project_id,p.n),o.set(p.project_id,p.project_path))}let i=n.map(p=>({projectId:p.projectId,name:p.name,projectPath:p.projectId?o.get(p.projectId)??"":"",gitRemoteUrl:p.gitRemoteUrl,sessionCount:Number(p.sessionCount),enrichedCount:Number(p.enrichedCount),analyzedCount:Number(p.analyzedCount),firstSession:p.firstSession,lastSession:p.lastSession})),c=(await u.select({projectPath:_.projectPath,sessionCount:ln`COUNT(*)`,enrichedCount:ln`COUNT(CASE WHEN ${_.metadata}->'local_session_meta' IS NOT NULL THEN 1 END)`,analyzedCount:ln`COUNT(CASE WHEN ${_.analysis} IS NOT NULL THEN 1 END)`,firstSession:ln`MIN(${_.startedAt})`,lastSession:ln`MAX(${_.startedAt})`}).from(_).where(
|
|
1020
|
-
${r}`).digest("hex")}d(
|
|
1024
|
+
`),o=new Map,s=new Map;for(let p of r){let m=s.get(p.project_id)??-1;p.n>m&&(s.set(p.project_id,p.n),o.set(p.project_id,p.project_path))}let i=n.map(p=>({projectId:p.projectId,name:p.name,projectPath:p.projectId?o.get(p.projectId)??"":"",gitRemoteUrl:p.gitRemoteUrl,sessionCount:Number(p.sessionCount),enrichedCount:Number(p.enrichedCount),analyzedCount:Number(p.analyzedCount),firstSession:p.firstSession,lastSession:p.lastSession})),c=(await u.select({projectPath:_.projectPath,sessionCount:ln`COUNT(*)`,enrichedCount:ln`COUNT(CASE WHEN ${_.metadata}->'local_session_meta' IS NOT NULL THEN 1 END)`,analyzedCount:ln`COUNT(CASE WHEN ${_.analysis} IS NOT NULL THEN 1 END)`,firstSession:ln`MIN(${_.startedAt})`,lastSession:ln`MAX(${_.startedAt})`}).from(_).where(Z0(Fg(_.userId,t),ln`${_.projectId} IS NULL`,ln`${_.projectPath} IS NOT NULL`)).groupBy(_.projectPath)).map(p=>({projectId:null,name:(p.projectPath??"").split("/").pop()||"unknown",projectPath:p.projectPath??"",gitRemoteUrl:null,sessionCount:Number(p.sessionCount),enrichedCount:Number(p.enrichedCount),analyzedCount:Number(p.analyzedCount),firstSession:p.firstSession,lastSession:p.lastSession})),l=[...i,...c].sort((p,m)=>m.sessionCount-p.sessionCount);return e.json(l)});D();import vM from"node:fs";import IM from"node:path";import{Hono as bM}from"hono";import{and as Yg,desc as Xg,eq as Po,gte as SM,ilike as cS,lte as AM,sql as Yi}from"drizzle-orm";D();import{createHash as nM}from"node:crypto";import{and as rM,eq as eS,inArray as oM,sql as jo}from"drizzle-orm";var sM=90,iM=.5,tS=[{category:"claude_md_additions",get:d(e=>e.suggestions?.claude_md_additions,"get"),label:d(e=>String(e.addition??"").slice(0,120),"label")},{category:"features_to_try",get:d(e=>e.suggestions?.features_to_try,"get"),label:d(e=>String(e.feature??"").slice(0,120),"label")},{category:"usage_patterns",get:d(e=>e.suggestions?.usage_patterns,"get"),label:d(e=>String(e.title??"").slice(0,120),"label")},{category:"friction_categories",get:d(e=>e.friction_analysis?.categories,"get"),label:d(e=>String(e.category??"").slice(0,120),"label")},{category:"opportunities",get:d(e=>e.on_the_horizon?.opportunities,"get"),label:d(e=>String(e.title??"").slice(0,120),"label")},{category:"impressive_workflows",get:d(e=>e.what_works?.impressive_workflows,"get"),label:d(e=>String(e.title??"").slice(0,120),"label")},{category:"project_areas",get:d(e=>e.project_areas,"get"),label:d(e=>String(e.name??"").slice(0,120),"label")}];function nS(e,t){let n=Object.keys(t).filter(o=>o!=="id"&&o!=="timesGenerated").sort(),r=JSON.stringify(n.map(o=>[o,t[o]]));return nM("sha256").update(`${e}
|
|
1025
|
+
${r}`).digest("hex")}d(nS,"recommendationEntryHash");var aM=new Set(["42883","42P01","42704"]),cM=2,Fl=!1;function dM(e){let t=e?.code;return typeof t=="string"&&aM.has(t)?"capability-absent":tc(e)||ec(e)||ti(e)||_u(e)?"load":"isolable"}d(dM,"classifyProbeFailure");function uM(e,t){return async n=>[...await u.execute(jo`
|
|
1021
1026
|
SELECT p.probe_hash, m.content_hash, m.times_generated, m.last_job_id,
|
|
1022
1027
|
m.dismissed_at, m.sim
|
|
1023
1028
|
FROM (VALUES ${jo.join(n.map(o=>jo`(${o.hash}::text, ${o.category}::text, ${o.label}::text)`),jo`, `)}) AS p(probe_hash, category, label)
|
|
@@ -1036,10 +1041,10 @@ ${r}`).digest("hex")}d(Z0,"recommendationEntryHash");var tM=new Set(["42883","42
|
|
|
1036
1041
|
ORDER BY sim DESC
|
|
1037
1042
|
LIMIT 1
|
|
1038
1043
|
) m
|
|
1039
|
-
`)]}d(oM,"dbProbeExecutor");async function Hg(e,t,n,r=0){if(e.length===0)return[];if(ql||n.aborted)return n.degraded+=e.length,[];try{return n.statements+=1,await t(e)}catch(o){let s=rM(o);if(n.failure??={kind:s,code:typeof o?.code=="string"?String(o.code):void 0,message:o instanceof Error?o.message:String(o)},s==="capability-absent"&&(ql=!0),s==="load"&&(n.aborted=!0),!(s==="isolable"&&r<nM&&e.length>1))return n.degraded+=e.length,[];n.bisections+=1;let a=Math.ceil(e.length/2),c=await Hg(e.slice(0,a),t,n,r+1),l=await Hg(e.slice(a),t,n,r+1);return[...c,...l]}}d(Hg,"resolveProbes");async function eS(e){let{userId:t,jobId:n}=e,r=e.projectPath??"",o=[];for(let f of Q0)for(let w of f.get(e.recs)??[]){if(w===null||typeof w!="object")continue;let b=w;o.push({category:f.category,hash:Z0(f.category,b),label:f.label(b)})}if(o.length===0)return e.recs;let s=[...new Set(o.map(f=>f.hash))],i=await u.select({contentHash:Ee.contentHash,timesGenerated:Ee.timesGenerated,lastJobId:Ee.lastJobId,dismissedAt:Ee.dismissedAt}).from(Ee).where(XD(X0(Ee.userId,t),X0(Ee.projectPath,r),QD(Ee.contentHash,s))),a=new Map(i.map(f=>[f.contentHash,f])),c=new Map,l=new Map;for(let f of o)a.has(f.hash)||f.label.trim().length===0||l.has(f.hash)||l.set(f.hash,f);if(l.size>0&&!ql){let f={probes:l.size,statements:0,bisections:0,degraded:0,aborted:!1},w=await Hg([...l.values()],oM(t,r),f);for(let b of w)Number(b.sim)<eM||(c.set(b.probe_hash,b.content_hash),a.has(b.content_hash)||a.set(b.content_hash,{contentHash:b.content_hash,timesGenerated:Number(b.times_generated),lastJobId:b.last_job_id,dismissedAt:b.dismissed_at?new Date(b.dismissed_at):null}));f.failure&&console.warn(`[insight-memory] semantic probe degraded to verbatim identity: ${f.degraded}/${f.probes} probes, ${f.statements} statement(s), ${f.bisections} bisection(s), class=${f.failure.kind}`+(f.failure.code?` code=${f.failure.code}`:"")+(ql?" \u2014 trigram probing disabled for this process":""),f.failure.message)}let p=d(f=>c.get(f)??f,"canonical");if(n){let f=o.filter(w=>{let b=a.get(p(w.hash));return!b||b.lastJobId!==n});if(f.length>0)try{let w=new Set,b=f.filter(I=>!w.has(p(I.hash))&&w.add(p(I.hash)));await u.insert(Ee).values(b.map(I=>({userId:t,projectPath:r,category:I.category,contentHash:p(I.hash),label:I.label,lastJobId:n}))).onConflictDoUpdate({target:[Ee.userId,Ee.projectPath,Ee.contentHash],set:{lastSeenAt:jo`now()`,timesGenerated:jo`${Ee.timesGenerated} + 1`,lastJobId:n}});for(let I of b){let S=p(I.hash),A=a.get(S);a.set(S,{contentHash:S,timesGenerated:(A?.timesGenerated??0)+1,lastJobId:n,dismissedAt:A?.dismissedAt??null})}}catch{}}let m=Date.now()-ZD*24*3600*1e3,y=d(f=>{let w=a.get(f)?.dismissedAt;return w!=null&&new Date(w).getTime()>m},"suppressed"),v={...e.recs},h=d((f,w)=>{switch(f){case"claude_md_additions":case"features_to_try":case"usage_patterns":{let b={...v.suggestions};b[f]=w,v.suggestions=b;break}case"friction_categories":{v.friction_analysis={...v.friction_analysis,categories:w};break}case"opportunities":{v.on_the_horizon={...v.on_the_horizon,opportunities:w};break}case"impressive_workflows":{v.what_works={...v.what_works,impressive_workflows:w};break}case"project_areas":{v.project_areas=w;break}}},"setPath");for(let f of Q0){let w=f.get(e.recs)??[];if(w.length===0)continue;let b=w.map(I=>{if(I===null||typeof I!="object")return I;let S=I,A=p(Z0(f.category,S));return{...S,id:A,timesGenerated:a.get(A)?.timesGenerated??1}}).filter(I=>I===null||typeof I!="object"?!0:!y(I.id??""));h(f.category,b)}return v}d(eS,"applyRecommendationMemory");async function tS(e){let t=e.projectPath??"";await u.insert(Ee).values({userId:e.userId,projectPath:t,category:"unknown",contentHash:e.contentHash,dismissedAt:jo`now()`}).onConflictDoUpdate({target:[Ee.userId,Ee.projectPath,Ee.contentHash],set:{dismissedAt:jo`now()`}})}d(tS,"dismissRecommendation");O();var Bg=[{provider:"anthropic",modelId:"claude-fable-5",inputPerMTok:10,outputPerMTok:50,cacheReadPerMTok:1,cacheWrite5mPerMTok:12.5,cacheWrite1hPerMTok:20,contextWindow:1e6},{provider:"anthropic",modelId:"claude-opus-4-8",inputPerMTok:5,outputPerMTok:25,cacheReadPerMTok:.5,cacheWrite5mPerMTok:6.25,cacheWrite1hPerMTok:10,contextWindow:1e6},{provider:"anthropic",modelId:"claude-opus-4-7",inputPerMTok:5,outputPerMTok:25,cacheReadPerMTok:.5,cacheWrite5mPerMTok:6.25,cacheWrite1hPerMTok:10,contextWindow:1e6},{provider:"anthropic",modelId:"claude-opus-4-6",inputPerMTok:5,outputPerMTok:25,cacheReadPerMTok:.5,cacheWrite5mPerMTok:6.25,cacheWrite1hPerMTok:10,contextWindow:1e6},{provider:"anthropic",modelId:"claude-sonnet-5",inputPerMTok:3,outputPerMTok:15,cacheReadPerMTok:.3,cacheWrite5mPerMTok:3.75,cacheWrite1hPerMTok:6,contextWindow:1e6},{provider:"anthropic",modelId:"claude-sonnet-4-6",inputPerMTok:3,outputPerMTok:15,cacheReadPerMTok:.3,cacheWrite5mPerMTok:3.75,cacheWrite1hPerMTok:6,contextWindow:2e5},{provider:"anthropic",modelId:"claude-haiku-4-5-20251001",inputPerMTok:1,outputPerMTok:5,cacheReadPerMTok:.1,cacheWrite5mPerMTok:1.25,cacheWrite1hPerMTok:2,contextWindow:2e5},{provider:"anthropic",modelId:"claude-haiku-4-5",inputPerMTok:1,outputPerMTok:5,cacheReadPerMTok:.1,cacheWrite5mPerMTok:1.25,cacheWrite1hPerMTok:2,contextWindow:2e5},{provider:"openai",modelId:"gpt-5.5",inputPerMTok:5,outputPerMTok:30,cacheReadPerMTok:.5,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:4e5},{provider:"openai",modelId:"gpt-4o",inputPerMTok:2.5,outputPerMTok:10,cacheReadPerMTok:1.25,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:128e3},{provider:"openai",modelId:"gpt-4o-mini",inputPerMTok:.15,outputPerMTok:.6,cacheReadPerMTok:.075,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:128e3},{provider:"openai",modelId:"gpt-4.1",inputPerMTok:2,outputPerMTok:8,cacheReadPerMTok:.5,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:1e6},{provider:"openai",modelId:"gpt-4.1-mini",inputPerMTok:.4,outputPerMTok:1.6,cacheReadPerMTok:.1,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:1e6},{provider:"openai",modelId:"o1",inputPerMTok:15,outputPerMTok:60,cacheReadPerMTok:7.5,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:2e5},{provider:"openai",modelId:"o3",inputPerMTok:2,outputPerMTok:8,cacheReadPerMTok:.5,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:2e5},{provider:"openai",modelId:"o4-mini",inputPerMTok:1.1,outputPerMTok:4.4,cacheReadPerMTok:.275,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:2e5},{provider:"google",modelId:"gemini-2.5-pro",inputPerMTok:1.25,outputPerMTok:10,cacheReadPerMTok:.31,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:1e6},{provider:"google",modelId:"gemini-2.5-flash",inputPerMTok:.3,outputPerMTok:2.5,cacheReadPerMTok:.075,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:1e6},{provider:"google",modelId:"gemini-2.0-flash",inputPerMTok:.1,outputPerMTok:.4,cacheReadPerMTok:.025,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:1e6},{provider:"google",modelId:"gemini-1.5-pro",inputPerMTok:1.25,outputPerMTok:5,cacheReadPerMTok:.3125,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:2e6},{provider:"google",modelId:"gemini-1.5-flash",inputPerMTok:.075,outputPerMTok:.3,cacheReadPerMTok:.01875,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:1e6},{provider:"xai",modelId:"grok-4",inputPerMTok:3,outputPerMTok:15,cacheReadPerMTok:.75,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:256e3},{provider:"xai",modelId:"grok-3",inputPerMTok:3,outputPerMTok:15,cacheReadPerMTok:.75,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:131072},{provider:"deepseek",modelId:"deepseek-chat",inputPerMTok:.27,outputPerMTok:1.1,cacheReadPerMTok:.07,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:128e3},{provider:"deepseek",modelId:"deepseek-reasoner",inputPerMTok:.55,outputPerMTok:2.19,cacheReadPerMTok:.14,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:128e3}];function No(e){if(!e)return"anthropic";let t=Bg.find(r=>r.modelId===e);if(t)return t.provider;let n=e.toLowerCase();return n.startsWith("claude")?"anthropic":n.startsWith("gpt")||n.startsWith("o1")||n.startsWith("o3")||n.startsWith("o4")||n.startsWith("chatgpt")?"openai":n.startsWith("gemini")?"google":n.startsWith("grok")?"xai":n.startsWith("deepseek")?"deepseek":n.startsWith("mistral")||n.startsWith("mixtral")||n.startsWith("magistral")||n.startsWith("codestral")?"mistral":n.startsWith("llama")||n.startsWith("meta-llama")?"meta":"anthropic"}d(No,"providerFromModelId");var Fg={provider:"anthropic",modelId:"default-sonnet-equivalent",inputPerMTok:3,outputPerMTok:15,cacheReadPerMTok:.3,cacheWrite5mPerMTok:3.75,cacheWrite1hPerMTok:6,contextWindow:2e5};function Wg(e){return Bg.find(t=>t.modelId===e)}d(Wg,"findModel");var Vc=1e6;function sM(e){return Math.round(e*100)/100}d(sM,"roundCents");function Ul(e,t,n){let r=e.input_tokens??0,o=e.output_tokens??0,s=e.cache_read_input_tokens??0,i=(e.cache_creation_5m??0)+(e.cache_creation_input_tokens??0),a=e.cache_creation_1h??0,c=r*t.inputPerMTok/Vc,l=o*t.outputPerMTok/Vc,p=s*t.cacheReadPerMTok/Vc,m=i*t.cacheWrite5mPerMTok/Vc,y=a*t.cacheWrite1hPerMTok/Vc,v=m+y,h=c+l+p+v;return{inputUsd:c,outputUsd:l,cacheReadUsd:p,cacheWriteUsd:v,totalUsd:sM(h),estimated:n}}d(Ul,"computePrice");function zg(e,t,n){let r=Wg(t);return Ul(e,r??Fg,!r)}d(zg,"priceUsage");O();import{and as iM,desc as aM,eq as nS,isNull as cM,lte as dM,or as uM,gt as lM}from"drizzle-orm";function Jc(e){return e==null?0:typeof e=="number"?e:Number(e)}d(Jc,"toNumber");async function Fr(e,t,n,r,o="anthropic"){let s=await e.select().from(Qe).where(iM(nS(Qe.provider,o),nS(Qe.modelId,n),dM(Qe.effectiveFrom,r),uM(cM(Qe.effectiveUntil),lM(Qe.effectiveUntil,r)))).orderBy(aM(Qe.effectiveFrom)).limit(1);if(s.length===0)return zg(t,n,r);let i=s[0];return Ul(t,{inputPerMTok:Jc(i.inputPerM),outputPerMTok:Jc(i.outputPerM),cacheReadPerMTok:Jc(i.cacheReadPerM),cacheWrite5mPerMTok:Jc(i.cacheWrite5mPerM),cacheWrite1hPerMTok:Jc(i.cacheWrite1hPerM)},!1)}d(Fr,"priceUsageFromDb");var Gc=1e6,rS=10*6e4,pM=500,Es=new Map;function mM(e,t,n){return`${e}:${t}:${n.toISOString().slice(0,7)}`}d(mM,"rateKey");function oS(e,t){let n=No(e),r=mM(n,e,t),o=Es.get(r),s=o&&Date.now()-o.at<rS?o.rates:void 0;if(!s){s=(async()=>{let a={input_tokens:Gc},c={output_tokens:Gc},l={cache_read_input_tokens:Gc},p={cache_creation_5m:Gc},m={cache_creation_1h:Gc},[y,v,h,f,w]=await Promise.all([Fr(nt,a,e,t,n),Fr(nt,c,e,t,n),Fr(nt,l,e,t,n),Fr(nt,p,e,t,n),Fr(nt,m,e,t,n)]);return{inputPerM:y.inputUsd,outputPerM:v.outputUsd,cacheReadPerM:h.cacheReadUsd,cacheWrite5mPerM:f.cacheWriteUsd,cacheWrite1hPerM:w.cacheWriteUsd,estimated:y.estimated}})();let i=s;if(i.catch(()=>{Es.get(r)?.rates===i&&Es.delete(r)}),Es.set(r,{at:Date.now(),rates:i}),Es.size>pM)for(let[a,c]of Es)Date.now()-c.at>=rS&&Es.delete(a)}return s}d(oS,"getRates");var Kc=new hM;function wM(e){let t=[],n=[];if(e.sessionsUsingMcp===0&&e.totalSessions>=5&&t.push({feature:"MCP Servers",one_liner:"Extend Claude with external tools via MCP",why_for_you:`Across ${e.totalSessions} sessions, you haven't used any MCP servers. MCP lets Claude access databases, APIs, and custom tools directly. Set up the RuleMetric MCP server from the /connect page in the dashboard.`,example_code:"claude mcp add <server-name> -- <command>"}),e.sessionsUsingTaskAgent===0&&e.totalSessions>=5&&t.push({feature:"Task Agents",one_liner:"Parallelize work with subagents",why_for_you:"You haven't used task agents yet. They can parallelize independent tasks \u2014 like running tests while editing code \u2014 saving significant time.",example_code:"claude -p 'Use an explore agent to map the architecture of this project, then use parallel agents to implement each change independently.'"}),e.totalToolErrors>10){let y=Object.entries(e.toolErrorCategories).sort(([,v],[,h])=>h-v)[0];y&&t.push({feature:"Hooks",one_liner:"Auto-run checks after tool calls",why_for_you:`You had ${e.totalToolErrors} tool errors, with "${y[0]}" being the most common (${y[1]}). Hooks can auto-run type-checks or linters after every edit to catch errors immediately.`,example_code:'Add to .claude/settings.json: {"hooks": {"PostToolUse": [{"matcher": "Edit|Write", "hooks": [{"type": "command", "command": "pnpm type-check 2>&1 | head -5"}]}]}}'})}if(e.totalMessages>100&&e.totalSessions>=10&&t.push({feature:"Headless Mode",one_liner:"Run Claude non-interactively for batch tasks",why_for_you:`With ${e.totalMessages} messages across ${e.totalSessions} sessions, you could automate repetitive tasks using headless mode.`,example_code:"claude -p 'Run pnpm type-check and pnpm test. Report only failures with file paths and line numbers.' --allowedTools 'Bash,Read,Grep'"}),Object.values(e.friction).reduce((y,v)=>y+v,0)>5){let v=Object.entries(e.friction).sort(([,h],[,f])=>f-h).slice(0,2).map(([h,f])=>`${h.replace(/_/g," ")} (${f}x)`).join(", ");n.push({title:"Reduce Friction with Structured Prompts",suggestion:`Your top friction points are: ${v}. Giving Claude more context upfront reduces back-and-forth.`,detail:"Start each session with a clear goal statement and constraints.",copyable_prompt:"This session has ONE goal: [describe goal]. Before making any changes, read the relevant files and explain your plan. Do not modify code until I approve the approach."})}e.sessionsWithAnalysis<e.totalSessions*.3&&e.totalSessions>=5&&n.push({title:"Enrich Sessions for Better Insights",suggestion:`Only ${e.sessionsWithAnalysis} of ${e.totalSessions} sessions have quality analysis. Enriching them unlocks outcome tracking, friction detection, and deeper recommendations.`,detail:"Sessions are analyzed automatically by the background worker. Start it with `rulemetric evals agent` (or use the Regenerate button on the dashboard) and enrichment catches up on its own.",copyable_prompt:"rulemetric evals agent"});let o=(e.outcomes.not_achieved??0)+(e.outcomes.partially_achieved??0),s=Object.values(e.outcomes).reduce((y,v)=>y+v,0);s>5&&o/s>.3&&n.push({title:"Scope Sessions to One Goal",suggestion:`${Math.round(o/s*100)}% of analyzed sessions didn't fully achieve their goal. Breaking work into focused, single-goal sessions improves success rates.`,detail:"Start each session with a clear, narrow objective.",copyable_prompt:"This session has ONE goal: [describe specific goal]. Do not touch any other code. When this specific task is done and verified, stop."});let i=[];e.totalToolErrors>10&&i.push({skillId:"type-check-hook",reason:`You had ${e.totalToolErrors} tool errors. This hook auto-runs type-check after every edit to catch them immediately.`});let a=e.friction.wrong_approach??0,c=e.friction.buggy_code??0;a+c>3&&i.push({skillId:"structured-debugging",reason:`${a+c} sessions had wrong-approach or buggy-code friction. Structured debugging prevents spiraling.`}),((e.toolErrorCategories.test_failure??e.toolErrorCategories.assertion??0)>3||(e.friction.buggy_code??0)>2)&&i.push({skillId:"tdd-workflow",reason:"Frequent test failures or buggy code suggest adopting red-green-refactor discipline."});let p=e.friction.excessive_changes??0;return p>2&&i.push({skillId:"git-commit-conventions",reason:`${p} sessions had excessive changes. Conventional commits enforce focused, atomic changes.`}),Object.entries(e.toolErrorCategories).filter(([y])=>y.includes("auth")||y.includes("security")||y.includes("permission")).reduce((y,[,v])=>y+v,0)>0&&i.push({skillId:"security-review",reason:"Security-related errors detected. A security review checklist catches vulnerabilities before they ship."}),t.length===0&&n.length===0&&i.length===0?null:{suggestions:{features_to_try:t,usage_patterns:n,claude_md_additions:[]},recommended_skills:i.length>0?i:void 0,_auto_generated:!0}}d(wM,"generateAutoSuggestions");var vM=45e3,Hl=new Map,IM=bl();Kc.get("/insights/compute",async e=>{let t=e.get("userId"),n=e.req.query("projectPath"),r=e.req.query("projectId"),o=e.req.query("since"),s=e.req.query("until"),i=e.req.query("tool"),a=`${t}:${r??n??""}:${o??""}:${s??""}:${i??""}`,c=Hl.get(a),p=(c&&Date.now()-c.at<vM?c.data:null)??await IM.run(a,async()=>{let v=[Po(_.userId,t)];r?v.push(Po(_.projectId,r)):n&&v.push(sS(_.projectPath,`%${ot(n)}%`)),i&&v.push(Po(_.tool,i)),o&&v.push(_M(_.startedAt,new Date(o))),s&&v.push(yM(_.startedAt,new Date(s)));let h=500,f=await nt.select({id:_.id,externalSessionId:_.externalSessionId,tool:_.tool,projectPath:_.projectPath,startedAt:_.startedAt,endedAt:_.endedAt,eventCount:_.eventCount,tokenUsage:_.tokenUsage,analysis:_.analysis,analyzedAt:_.analyzedAt,metadata:_.metadata}).from(_).where(Vg(...v)).orderBy(Jg(_.startedAt)).limit(h),w=1e6,b=d(async(V,ge,ze)=>{let Fe=await oS(ge,ze),et=V.input_tokens??0,Bt=V.output_tokens??0,gn=V.cache_read_input_tokens??0,en=(V.cache_creation_5m??0)+(V.cache_creation_input_tokens??0),Bn=V.cache_creation_1h??0,it=et*Fe.inputPerM/w,It=Bt*Fe.outputPerM/w,yt=gn*Fe.cacheReadPerM/w,an=en*Fe.cacheWrite5mPerM/w+Bn*Fe.cacheWrite1hPerM/w,Ko=Math.round((it+It+yt+an)*100)/100;return{inputUsd:it,outputUsd:It,cacheReadUsd:yt,cacheWriteUsd:an,totalUsd:Ko,estimated:Fe.estimated}},"getPriced"),I={},S={},A={},E={},R={},D={},j={},P={},$={},H={},B=[],te=[],_e=[],ee=0,Re=0,N=0,me=0,M=0,ue=0,lt=0,Be=0,re=0,he=0,C=0,oe=0,ve=0,Ce=0,Te=0,Ye=0,Ht=0,jr=0,Jo=0,Zr=0,Sp=0,Gh=0,Kh=0,Yh=0,_a=null,ya=null,yE=Date.now()-720*60*60*1e3,Ap=[],vd="claude-sonnet-4-6",Id=d(()=>({input_tokens:0,output_tokens:0,cache_read_tokens:0,cache_write_tokens:0,cost_usd:0}),"newBucket"),bd=d((V,ge,ze,Fe,et,Bt)=>{V.input_tokens+=ge,V.output_tokens+=ze,V.cache_read_tokens+=Fe,V.cache_write_tokens+=et,V.cost_usd+=Bt},"accumulateBucket"),wa={},va={},wE=new Map(f.map(V=>[V.id,V.startedAt])),vE=new Map(f.map(V=>[V.id,V.tool??"unknown"])),Xh=new Set,Qh=f.length>0?await nt.execute(Yi`
|
|
1044
|
+
`)]}d(uM,"dbProbeExecutor");async function zg(e,t,n,r=0){if(e.length===0)return[];if(Fl||n.aborted)return n.degraded+=e.length,[];try{return n.statements+=1,await t(e)}catch(o){let s=dM(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"&&(Fl=!0),s==="load"&&(n.aborted=!0),!(s==="isolable"&&r<cM&&e.length>1))return n.degraded+=e.length,[];n.bisections+=1;let a=Math.ceil(e.length/2),c=await zg(e.slice(0,a),t,n,r+1),l=await zg(e.slice(a),t,n,r+1);return[...c,...l]}}d(zg,"resolveProbes");async function rS(e){let{userId:t,jobId:n}=e,r=e.projectPath??"",o=[];for(let f of tS)for(let w of f.get(e.recs)??[]){if(w===null||typeof w!="object")continue;let b=w;o.push({category:f.category,hash:nS(f.category,b),label:f.label(b)})}if(o.length===0)return e.recs;let s=[...new Set(o.map(f=>f.hash))],i=await u.select({contentHash:Ee.contentHash,timesGenerated:Ee.timesGenerated,lastJobId:Ee.lastJobId,dismissedAt:Ee.dismissedAt}).from(Ee).where(rM(eS(Ee.userId,t),eS(Ee.projectPath,r),oM(Ee.contentHash,s))),a=new Map(i.map(f=>[f.contentHash,f])),c=new Map,l=new Map;for(let f of o)a.has(f.hash)||f.label.trim().length===0||l.has(f.hash)||l.set(f.hash,f);if(l.size>0&&!Fl){let f={probes:l.size,statements:0,bisections:0,degraded:0,aborted:!1},w=await zg([...l.values()],uM(t,r),f);for(let b of w)Number(b.sim)<iM||(c.set(b.probe_hash,b.content_hash),a.has(b.content_hash)||a.set(b.content_hash,{contentHash:b.content_hash,timesGenerated:Number(b.times_generated),lastJobId:b.last_job_id,dismissedAt:b.dismissed_at?new Date(b.dismissed_at):null}));f.failure&&console.warn(`[insight-memory] semantic probe degraded to verbatim identity: ${f.degraded}/${f.probes} probes, ${f.statements} statement(s), ${f.bisections} bisection(s), class=${f.failure.kind}`+(f.failure.code?` code=${f.failure.code}`:"")+(Fl?" \u2014 trigram probing disabled for this process":""),f.failure.message)}let p=d(f=>c.get(f)??f,"canonical");if(n){let f=o.filter(w=>{let b=a.get(p(w.hash));return!b||b.lastJobId!==n});if(f.length>0)try{let w=new Set,b=f.filter(I=>!w.has(p(I.hash))&&w.add(p(I.hash)));await u.insert(Ee).values(b.map(I=>({userId:t,projectPath:r,category:I.category,contentHash:p(I.hash),label:I.label,lastJobId:n}))).onConflictDoUpdate({target:[Ee.userId,Ee.projectPath,Ee.contentHash],set:{lastSeenAt:jo`now()`,timesGenerated:jo`${Ee.timesGenerated} + 1`,lastJobId:n}});for(let I of b){let S=p(I.hash),A=a.get(S);a.set(S,{contentHash:S,timesGenerated:(A?.timesGenerated??0)+1,lastJobId:n,dismissedAt:A?.dismissedAt??null})}}catch{}}let m=Date.now()-sM*24*3600*1e3,y=d(f=>{let w=a.get(f)?.dismissedAt;return w!=null&&new Date(w).getTime()>m},"suppressed"),v={...e.recs},h=d((f,w)=>{switch(f){case"claude_md_additions":case"features_to_try":case"usage_patterns":{let b={...v.suggestions};b[f]=w,v.suggestions=b;break}case"friction_categories":{v.friction_analysis={...v.friction_analysis,categories:w};break}case"opportunities":{v.on_the_horizon={...v.on_the_horizon,opportunities:w};break}case"impressive_workflows":{v.what_works={...v.what_works,impressive_workflows:w};break}case"project_areas":{v.project_areas=w;break}}},"setPath");for(let f of tS){let w=f.get(e.recs)??[];if(w.length===0)continue;let b=w.map(I=>{if(I===null||typeof I!="object")return I;let S=I,A=p(nS(f.category,S));return{...S,id:A,timesGenerated:a.get(A)?.timesGenerated??1}}).filter(I=>I===null||typeof I!="object"?!0:!y(I.id??""));h(f.category,b)}return v}d(rS,"applyRecommendationMemory");async function oS(e){let t=e.projectPath??"";await u.insert(Ee).values({userId:e.userId,projectPath:t,category:"unknown",contentHash:e.contentHash,dismissedAt:jo`now()`}).onConflictDoUpdate({target:[Ee.userId,Ee.projectPath,Ee.contentHash],set:{dismissedAt:jo`now()`}})}d(oS,"dismissRecommendation");D();var Vg=[{provider:"anthropic",modelId:"claude-fable-5",inputPerMTok:10,outputPerMTok:50,cacheReadPerMTok:1,cacheWrite5mPerMTok:12.5,cacheWrite1hPerMTok:20,contextWindow:1e6},{provider:"anthropic",modelId:"claude-opus-4-8",inputPerMTok:5,outputPerMTok:25,cacheReadPerMTok:.5,cacheWrite5mPerMTok:6.25,cacheWrite1hPerMTok:10,contextWindow:1e6},{provider:"anthropic",modelId:"claude-opus-4-7",inputPerMTok:5,outputPerMTok:25,cacheReadPerMTok:.5,cacheWrite5mPerMTok:6.25,cacheWrite1hPerMTok:10,contextWindow:1e6},{provider:"anthropic",modelId:"claude-opus-4-6",inputPerMTok:5,outputPerMTok:25,cacheReadPerMTok:.5,cacheWrite5mPerMTok:6.25,cacheWrite1hPerMTok:10,contextWindow:1e6},{provider:"anthropic",modelId:"claude-sonnet-5",inputPerMTok:3,outputPerMTok:15,cacheReadPerMTok:.3,cacheWrite5mPerMTok:3.75,cacheWrite1hPerMTok:6,contextWindow:1e6},{provider:"anthropic",modelId:"claude-sonnet-4-6",inputPerMTok:3,outputPerMTok:15,cacheReadPerMTok:.3,cacheWrite5mPerMTok:3.75,cacheWrite1hPerMTok:6,contextWindow:2e5},{provider:"anthropic",modelId:"claude-haiku-4-5-20251001",inputPerMTok:1,outputPerMTok:5,cacheReadPerMTok:.1,cacheWrite5mPerMTok:1.25,cacheWrite1hPerMTok:2,contextWindow:2e5},{provider:"anthropic",modelId:"claude-haiku-4-5",inputPerMTok:1,outputPerMTok:5,cacheReadPerMTok:.1,cacheWrite5mPerMTok:1.25,cacheWrite1hPerMTok:2,contextWindow:2e5},{provider:"openai",modelId:"gpt-5.5",inputPerMTok:5,outputPerMTok:30,cacheReadPerMTok:.5,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:4e5},{provider:"openai",modelId:"gpt-4o",inputPerMTok:2.5,outputPerMTok:10,cacheReadPerMTok:1.25,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:128e3},{provider:"openai",modelId:"gpt-4o-mini",inputPerMTok:.15,outputPerMTok:.6,cacheReadPerMTok:.075,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:128e3},{provider:"openai",modelId:"gpt-4.1",inputPerMTok:2,outputPerMTok:8,cacheReadPerMTok:.5,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:1e6},{provider:"openai",modelId:"gpt-4.1-mini",inputPerMTok:.4,outputPerMTok:1.6,cacheReadPerMTok:.1,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:1e6},{provider:"openai",modelId:"o1",inputPerMTok:15,outputPerMTok:60,cacheReadPerMTok:7.5,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:2e5},{provider:"openai",modelId:"o3",inputPerMTok:2,outputPerMTok:8,cacheReadPerMTok:.5,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:2e5},{provider:"openai",modelId:"o4-mini",inputPerMTok:1.1,outputPerMTok:4.4,cacheReadPerMTok:.275,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:2e5},{provider:"google",modelId:"gemini-2.5-pro",inputPerMTok:1.25,outputPerMTok:10,cacheReadPerMTok:.31,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:1e6},{provider:"google",modelId:"gemini-2.5-flash",inputPerMTok:.3,outputPerMTok:2.5,cacheReadPerMTok:.075,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:1e6},{provider:"google",modelId:"gemini-2.0-flash",inputPerMTok:.1,outputPerMTok:.4,cacheReadPerMTok:.025,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:1e6},{provider:"google",modelId:"gemini-1.5-pro",inputPerMTok:1.25,outputPerMTok:5,cacheReadPerMTok:.3125,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:2e6},{provider:"google",modelId:"gemini-1.5-flash",inputPerMTok:.075,outputPerMTok:.3,cacheReadPerMTok:.01875,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:1e6},{provider:"xai",modelId:"grok-4",inputPerMTok:3,outputPerMTok:15,cacheReadPerMTok:.75,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:256e3},{provider:"xai",modelId:"grok-3",inputPerMTok:3,outputPerMTok:15,cacheReadPerMTok:.75,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:131072},{provider:"deepseek",modelId:"deepseek-chat",inputPerMTok:.27,outputPerMTok:1.1,cacheReadPerMTok:.07,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:128e3},{provider:"deepseek",modelId:"deepseek-reasoner",inputPerMTok:.55,outputPerMTok:2.19,cacheReadPerMTok:.14,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:128e3}];function No(e){if(!e)return"anthropic";let t=Vg.find(r=>r.modelId===e);if(t)return t.provider;let n=e.toLowerCase();return n.startsWith("claude")?"anthropic":n.startsWith("gpt")||n.startsWith("o1")||n.startsWith("o3")||n.startsWith("o4")||n.startsWith("chatgpt")?"openai":n.startsWith("gemini")?"google":n.startsWith("grok")?"xai":n.startsWith("deepseek")?"deepseek":n.startsWith("mistral")||n.startsWith("mixtral")||n.startsWith("magistral")||n.startsWith("codestral")?"mistral":n.startsWith("llama")||n.startsWith("meta-llama")?"meta":"anthropic"}d(No,"providerFromModelId");var Jg={provider:"anthropic",modelId:"default-sonnet-equivalent",inputPerMTok:3,outputPerMTok:15,cacheReadPerMTok:.3,cacheWrite5mPerMTok:3.75,cacheWrite1hPerMTok:6,contextWindow:2e5};function Gg(e){return Vg.find(t=>t.modelId===e)}d(Gg,"findModel");var Kc=1e6;function lM(e){return Math.round(e*100)/100}d(lM,"roundCents");function Wl(e,t,n){let r=e.input_tokens??0,o=e.output_tokens??0,s=e.cache_read_input_tokens??0,i=(e.cache_creation_5m??0)+(e.cache_creation_input_tokens??0),a=e.cache_creation_1h??0,c=r*t.inputPerMTok/Kc,l=o*t.outputPerMTok/Kc,p=s*t.cacheReadPerMTok/Kc,m=i*t.cacheWrite5mPerMTok/Kc,y=a*t.cacheWrite1hPerMTok/Kc,v=m+y,h=c+l+p+v;return{inputUsd:c,outputUsd:l,cacheReadUsd:p,cacheWriteUsd:v,totalUsd:lM(h),estimated:n}}d(Wl,"computePrice");function Kg(e,t,n){let r=Gg(t);return Wl(e,r??Jg,!r)}d(Kg,"priceUsage");D();import{and as pM,desc as mM,eq as sS,isNull as fM,lte as gM,or as hM,gt as _M}from"drizzle-orm";function Yc(e){return e==null?0:typeof e=="number"?e:Number(e)}d(Yc,"toNumber");async function Fr(e,t,n,r,o="anthropic"){let s=await e.select().from(Qe).where(pM(sS(Qe.provider,o),sS(Qe.modelId,n),gM(Qe.effectiveFrom,r),hM(fM(Qe.effectiveUntil),_M(Qe.effectiveUntil,r)))).orderBy(mM(Qe.effectiveFrom)).limit(1);if(s.length===0)return Kg(t,n,r);let i=s[0];return Wl(t,{inputPerMTok:Yc(i.inputPerM),outputPerMTok:Yc(i.outputPerM),cacheReadPerMTok:Yc(i.cacheReadPerM),cacheWrite5mPerMTok:Yc(i.cacheWrite5mPerM),cacheWrite1hPerMTok:Yc(i.cacheWrite1hPerM)},!1)}d(Fr,"priceUsageFromDb");var Xc=1e6,iS=10*6e4,yM=500,Es=new Map;function wM(e,t,n){return`${e}:${t}:${n.toISOString().slice(0,7)}`}d(wM,"rateKey");function aS(e,t){let n=No(e),r=wM(n,e,t),o=Es.get(r),s=o&&Date.now()-o.at<iS?o.rates:void 0;if(!s){s=(async()=>{let a={input_tokens:Xc},c={output_tokens:Xc},l={cache_read_input_tokens:Xc},p={cache_creation_5m:Xc},m={cache_creation_1h:Xc},[y,v,h,f,w]=await Promise.all([Fr(nt,a,e,t,n),Fr(nt,c,e,t,n),Fr(nt,l,e,t,n),Fr(nt,p,e,t,n),Fr(nt,m,e,t,n)]);return{inputPerM:y.inputUsd,outputPerM:v.outputUsd,cacheReadPerM:h.cacheReadUsd,cacheWrite5mPerM:f.cacheWriteUsd,cacheWrite1hPerM:w.cacheWriteUsd,estimated:y.estimated}})();let i=s;if(i.catch(()=>{Es.get(r)?.rates===i&&Es.delete(r)}),Es.set(r,{at:Date.now(),rates:i}),Es.size>yM)for(let[a,c]of Es)Date.now()-c.at>=iS&&Es.delete(a)}return s}d(aS,"getRates");var Qc=new bM;function EM(e){let t=[],n=[];if(e.sessionsUsingMcp===0&&e.totalSessions>=5&&t.push({feature:"MCP Servers",one_liner:"Extend Claude with external tools via MCP",why_for_you:`Across ${e.totalSessions} sessions, you haven't used any MCP servers. MCP lets Claude access databases, APIs, and custom tools directly. Set up the RuleMetric MCP server from the /connect page in the dashboard.`,example_code:"claude mcp add <server-name> -- <command>"}),e.sessionsUsingTaskAgent===0&&e.totalSessions>=5&&t.push({feature:"Task Agents",one_liner:"Parallelize work with subagents",why_for_you:"You haven't used task agents yet. They can parallelize independent tasks \u2014 like running tests while editing code \u2014 saving significant time.",example_code:"claude -p 'Use an explore agent to map the architecture of this project, then use parallel agents to implement each change independently.'"}),e.totalToolErrors>10){let y=Object.entries(e.toolErrorCategories).sort(([,v],[,h])=>h-v)[0];y&&t.push({feature:"Hooks",one_liner:"Auto-run checks after tool calls",why_for_you:`You had ${e.totalToolErrors} tool errors, with "${y[0]}" being the most common (${y[1]}). Hooks can auto-run type-checks or linters after every edit to catch errors immediately.`,example_code:'Add to .claude/settings.json: {"hooks": {"PostToolUse": [{"matcher": "Edit|Write", "hooks": [{"type": "command", "command": "pnpm type-check 2>&1 | head -5"}]}]}}'})}if(e.totalMessages>100&&e.totalSessions>=10&&t.push({feature:"Headless Mode",one_liner:"Run Claude non-interactively for batch tasks",why_for_you:`With ${e.totalMessages} messages across ${e.totalSessions} sessions, you could automate repetitive tasks using headless mode.`,example_code:"claude -p 'Run pnpm type-check and pnpm test. Report only failures with file paths and line numbers.' --allowedTools 'Bash,Read,Grep'"}),Object.values(e.friction).reduce((y,v)=>y+v,0)>5){let v=Object.entries(e.friction).sort(([,h],[,f])=>f-h).slice(0,2).map(([h,f])=>`${h.replace(/_/g," ")} (${f}x)`).join(", ");n.push({title:"Reduce Friction with Structured Prompts",suggestion:`Your top friction points are: ${v}. Giving Claude more context upfront reduces back-and-forth.`,detail:"Start each session with a clear goal statement and constraints.",copyable_prompt:"This session has ONE goal: [describe goal]. Before making any changes, read the relevant files and explain your plan. Do not modify code until I approve the approach."})}e.sessionsWithAnalysis<e.totalSessions*.3&&e.totalSessions>=5&&n.push({title:"Enrich Sessions for Better Insights",suggestion:`Only ${e.sessionsWithAnalysis} of ${e.totalSessions} sessions have quality analysis. Enriching them unlocks outcome tracking, friction detection, and deeper recommendations.`,detail:"Sessions are analyzed automatically by the background worker. Start it with `rulemetric evals agent` (or use the Regenerate button on the dashboard) and enrichment catches up on its own.",copyable_prompt:"rulemetric evals agent"});let o=(e.outcomes.not_achieved??0)+(e.outcomes.partially_achieved??0),s=Object.values(e.outcomes).reduce((y,v)=>y+v,0);s>5&&o/s>.3&&n.push({title:"Scope Sessions to One Goal",suggestion:`${Math.round(o/s*100)}% of analyzed sessions didn't fully achieve their goal. Breaking work into focused, single-goal sessions improves success rates.`,detail:"Start each session with a clear, narrow objective.",copyable_prompt:"This session has ONE goal: [describe specific goal]. Do not touch any other code. When this specific task is done and verified, stop."});let i=[];e.totalToolErrors>10&&i.push({skillId:"type-check-hook",reason:`You had ${e.totalToolErrors} tool errors. This hook auto-runs type-check after every edit to catch them immediately.`});let a=e.friction.wrong_approach??0,c=e.friction.buggy_code??0;a+c>3&&i.push({skillId:"structured-debugging",reason:`${a+c} sessions had wrong-approach or buggy-code friction. Structured debugging prevents spiraling.`}),((e.toolErrorCategories.test_failure??e.toolErrorCategories.assertion??0)>3||(e.friction.buggy_code??0)>2)&&i.push({skillId:"tdd-workflow",reason:"Frequent test failures or buggy code suggest adopting red-green-refactor discipline."});let p=e.friction.excessive_changes??0;return p>2&&i.push({skillId:"git-commit-conventions",reason:`${p} sessions had excessive changes. Conventional commits enforce focused, atomic changes.`}),Object.entries(e.toolErrorCategories).filter(([y])=>y.includes("auth")||y.includes("security")||y.includes("permission")).reduce((y,[,v])=>y+v,0)>0&&i.push({skillId:"security-review",reason:"Security-related errors detected. A security review checklist catches vulnerabilities before they ship."}),t.length===0&&n.length===0&&i.length===0?null:{suggestions:{features_to_try:t,usage_patterns:n,claude_md_additions:[]},recommended_skills:i.length>0?i:void 0,_auto_generated:!0}}d(EM,"generateAutoSuggestions");var xM=45e3,zl=new Map,TM=xl();Qc.get("/insights/compute",async e=>{let t=e.get("userId"),n=e.req.query("projectPath"),r=e.req.query("projectId"),o=e.req.query("since"),s=e.req.query("until"),i=e.req.query("tool"),a=`${t}:${r??n??""}:${o??""}:${s??""}:${i??""}`,c=zl.get(a),p=(c&&Date.now()-c.at<xM?c.data:null)??await TM.run(a,async()=>{let v=[Po(_.userId,t)];r?v.push(Po(_.projectId,r)):n&&v.push(cS(_.projectPath,`%${ot(n)}%`)),i&&v.push(Po(_.tool,i)),o&&v.push(SM(_.startedAt,new Date(o))),s&&v.push(AM(_.startedAt,new Date(s)));let h=500,f=await nt.select({id:_.id,externalSessionId:_.externalSessionId,tool:_.tool,projectPath:_.projectPath,startedAt:_.startedAt,endedAt:_.endedAt,eventCount:_.eventCount,tokenUsage:_.tokenUsage,analysis:_.analysis,analyzedAt:_.analyzedAt,metadata:_.metadata}).from(_).where(Yg(...v)).orderBy(Xg(_.startedAt)).limit(h),w=1e6,b=d(async(V,ge,ze)=>{let Fe=await aS(ge,ze),et=V.input_tokens??0,Bt=V.output_tokens??0,gn=V.cache_read_input_tokens??0,en=(V.cache_creation_5m??0)+(V.cache_creation_input_tokens??0),Fn=V.cache_creation_1h??0,it=et*Fe.inputPerM/w,It=Bt*Fe.outputPerM/w,yt=gn*Fe.cacheReadPerM/w,an=en*Fe.cacheWrite5mPerM/w+Fn*Fe.cacheWrite1hPerM/w,Ko=Math.round((it+It+yt+an)*100)/100;return{inputUsd:it,outputUsd:It,cacheReadUsd:yt,cacheWriteUsd:an,totalUsd:Ko,estimated:Fe.estimated}},"getPriced"),I={},S={},A={},E={},R={},O={},j={},P={},$={},H={},B=[],ee=[],_e=[],te=0,Re=0,N=0,me=0,M=0,ue=0,lt=0,Be=0,re=0,he=0,C=0,oe=0,ve=0,Ce=0,Te=0,Ye=0,Ht=0,jr=0,Jo=0,Zr=0,Tp=0,Qh=0,Zh=0,e_=0,_a=null,ya=null,IE=Date.now()-720*60*60*1e3,Rp=[],Sd="claude-sonnet-4-6",Ad=d(()=>({input_tokens:0,output_tokens:0,cache_read_tokens:0,cache_write_tokens:0,cost_usd:0}),"newBucket"),Ed=d((V,ge,ze,Fe,et,Bt)=>{V.input_tokens+=ge,V.output_tokens+=ze,V.cache_read_tokens+=Fe,V.cache_write_tokens+=et,V.cost_usd+=Bt},"accumulateBucket"),wa={},va={},bE=new Map(f.map(V=>[V.id,V.startedAt])),SE=new Map(f.map(V=>[V.id,V.tool??"unknown"])),t_=new Set,n_=f.length>0?await nt.execute(Yi`
|
|
1040
1045
|
SELECT
|
|
1041
1046
|
deduped.session_id AS "sessionId",
|
|
1042
|
-
COALESCE(deduped.model, ${
|
|
1047
|
+
COALESCE(deduped.model, ${Sd}) AS "model",
|
|
1043
1048
|
COALESCE(SUM(COALESCE((deduped.token_usage->>'input_tokens')::bigint, (deduped.token_usage->>'input')::bigint)), 0)::bigint AS "inputTokens",
|
|
1044
1049
|
COALESCE(SUM(COALESCE((deduped.token_usage->>'output_tokens')::bigint, (deduped.token_usage->>'output')::bigint)), 0)::bigint AS "outputTokens",
|
|
1045
1050
|
COALESCE(SUM(COALESCE((deduped.token_usage->>'cache_read_input_tokens')::bigint, (deduped.token_usage->>'cacheRead')::bigint)), 0)::bigint AS "cacheReadTokens",
|
|
@@ -1055,24 +1060,24 @@ ${r}`).digest("hex")}d(Z0,"recommendationEntryHash");var tM=new Set(["42883","42
|
|
|
1055
1060
|
ORDER BY se.session_id, COALESCE(se.metadata->>'requestId', se.id::text), se.sequence
|
|
1056
1061
|
) deduped
|
|
1057
1062
|
GROUP BY deduped.session_id, deduped.model
|
|
1058
|
-
`):[];for(let V of Qh)Xh.add(V.sessionId);for(let V of f){let ge=V.metadata?.local_session_meta,ze=V.analysis,Fe=V.tokenUsage;if(V.tool&&(S[V.tool]=(S[V.tool]||0)+1),V.projectPath){let et=V.projectPath.split("/").pop()??V.projectPath;E[et]=(E[et]||0)+1}if(Fe&&!Xh.has(V.id)){let et=Fe.input_tokens??0,Bt=Fe.output_tokens??0,gn=Fe.cache_read_input_tokens??0,en=Fe.cache_creation_5m??0,Bn=Fe.cache_creation_1h??0,it=Fe.cache_creation_input_tokens??0,It=en+Bn||it;N+=et,me+=Bt,M+=gn,ue+=It;let yt=await b(Fe,vd,V.startedAt);lt+=yt.inputUsd,Be+=yt.outputUsd,re+=yt.cacheReadUsd,he+=yt.cacheWriteUsd;let an=yt.inputUsd+yt.outputUsd+yt.cacheReadUsd+yt.cacheWriteUsd,Ko=V.tool??"unknown",n_=wa[vd]??Id();bd(n_,et,Bt,gn,It,an),wa[vd]=n_;let r_=va[Ko]??Id();bd(r_,et,Bt,gn,It,an),va[Ko]=r_}if(ge){jr++;let et=ge.user_message_count??0;ee+=et,Re+=(ge.duration_minutes??0)/60,C+=ge.git_commits??0,oe+=ge.git_pushes??0,ve+=ge.lines_added??0,Ce+=ge.lines_removed??0,Te+=ge.files_modified??0,Ye+=ge.tool_errors??0;let Bt=ge.tool_counts;if(Bt)for(let[yt,an]of Object.entries(Bt))I[yt]=(I[yt]||0)+an;let gn=ge.languages;if(gn)for(let[yt,an]of Object.entries(gn))A[yt]=(A[yt]||0)+an;let en=ge.message_hours;en&&B.push(...en);let Bn=ge.tool_error_categories;if(Bn)for(let[yt,an]of Object.entries(Bn))H[yt]=(H[yt]||0)+an;let it=ge.user_response_times;it&&te.push(...it),Ht+=ge.user_interruptions??0,ge.uses_task_agent&&Zr++,ge.uses_mcp&&Sp++;let It=ge.user_message_timestamps;It&&It.length>0&&_e.push({id:V.id,start:V.startedAt.toISOString(),timestamps:It})}if(ze)if(V.analyzedAt){Gh++;let et=new Date(V.analyzedAt).getTime();(_a===null||et<_a)&&(_a=et),(ya===null||et>ya)&&(ya=et),et<yE&&Yh++}else Kh++;if(ze){Jo++;let et=ze.goal_categories;if(et)for(let[it,It]of Object.entries(et))It>0&&(R[it]=(R[it]||0)+It);let Bt=ze.outcome;Bt&&(D[Bt]=(D[Bt]||0)+1);let gn=ze.user_satisfaction;if(gn)for(let[it,It]of Object.entries(gn))It>0&&(j[it]=(j[it]||0)+It);let en=ze.session_type;en&&(P[en]=(P[en]||0)+1);let Bn=ze.friction??ze.friction_counts;if(Bn)for(let[it,It]of Object.entries(Bn))It>0&&($[it]=($[it]||0)+It);Ap.length<50&&Ap.push({id:V.id,externalId:V.externalSessionId,date:V.startedAt.toISOString().split("T")[0]??"",summary:ze.brief_summary??"",goal:ze.underlying_goal,outcome:Bt})}}let Sd=f.map(V=>V.startedAt.toISOString()).sort(),Ep=new Set(Sd.map(V=>V.split("T")[0]));for(let V of Qh){let ge=Number(V.inputTokens)||0,ze=Number(V.outputTokens)||0,Fe=Number(V.cacheReadTokens)||0,et=Number(V.cacheWrite5m)||0,Bt=Number(V.cacheWrite1h)||0,gn=Number(V.cacheWriteLegacy)||0,en=et+Bt||gn,Bn=wE.get(V.sessionId)??new Date,it=await b({input_tokens:ge,output_tokens:ze,cache_read_input_tokens:Fe,cache_creation_input_tokens:en},V.model,Bn);lt+=it.inputUsd,Be+=it.outputUsd,re+=it.cacheReadUsd,he+=it.cacheWriteUsd,N+=ge,me+=ze,M+=Fe,ue+=en;let It=it.inputUsd+it.outputUsd+it.cacheReadUsd+it.cacheWriteUsd,yt=wa[V.model]??Id();bd(yt,ge,ze,Fe,en,It),wa[V.model]=yt;let an=vE.get(V.sessionId)??"unknown",Ko=va[an]??Id();bd(Ko,ge,ze,Fe,en,It),va[an]=Ko}let Go=d(V=>Math.round(V*100)/100,"round2"),IE=lt+Be+re+he,bE=Go(IE),SE={inputUsd:Go(lt),outputUsd:Go(Be),cacheReadUsd:Go(re),cacheWriteUsd:Go(he)},xp={};for(let[V,ge]of Object.entries(wa))xp[V]={input_tokens:ge.input_tokens,output_tokens:ge.output_tokens,cache_read_tokens:ge.cache_read_tokens,cache_write_tokens:ge.cache_write_tokens,cost_usd:Go(ge.cost_usd)};let Tp={};for(let[V,ge]of Object.entries(va))Tp[V]={input_tokens:ge.input_tokens,output_tokens:ge.output_tokens,cache_read_tokens:ge.cache_read_tokens,cache_write_tokens:ge.cache_write_tokens,cost_usd:Go(ge.cost_usd)};let eo={"2-10s":0,"10-30s":0,"30s-1m":0,"1-2m":0,"2-5m":0,"5-15m":0,">15m":0};for(let V of te)V<10?eo["2-10s"]++:V<30?eo["10-30s"]++:V<60?eo["30s-1m"]++:V<120?eo["1-2m"]++:V<300?eo["2-5m"]++:V<900?eo["5-15m"]++:eo[">15m"]++;let Ls=[...te].sort((V,ge)=>V-ge),AE=Ls.length>0?Ls[Math.floor(Ls.length/2)]:0,EE=Ls.length>0?Ls.reduce((V,ge)=>V+ge,0)/Ls.length:0,Zh=0,e_=0;if(_e.length>1){let V=_e.flatMap(ze=>ze.timestamps.map(Fe=>({sessionId:ze.id,time:new Date(Fe).getTime()}))).sort((ze,Fe)=>ze.time-Fe.time),ge=new Set;for(let ze=0;ze<V.length-1;ze++){let Fe=V[ze],et=V[ze+1];Fe.sessionId!==et.sessionId&&et.time-Fe.time<1800*1e3&&(ge.add(Fe.sessionId),ge.add(et.sessionId),Zh++)}e_=ge.size}let $s={computed:!0,total_sessions:f.length,window:{since:o??null,until:s??null},truncated:f.length>=h,sessions_with_meta:jr,sessions_with_analysis:Jo,tools_used:S,date_range:{start:Sd[0]?.split("T")[0]??"",end:Sd[Sd.length-1]?.split("T")[0]??""},total_messages:ee,total_duration_hours:Math.round(Re*10)/10,total_input_tokens:N,total_output_tokens:me,total_cache_read_tokens:M,total_cache_write_tokens:ue,estimated_cost_usd:bE,estimated_cost_breakdown:SE,estimated_cost_by_model:Object.keys(xp).length>0?xp:void 0,estimated_cost_by_tool:Object.keys(Tp).length>0?Tp:void 0,tool_counts:I,languages:A,git_commits:C,git_pushes:oe,projects:E,goal_categories:R,outcomes:D,satisfaction:j,session_types:P,friction:$,tool_error_categories:H,session_summaries:Ap,total_tool_errors:Ye,total_interruptions:Ht,total_lines_added:ve,total_lines_removed:Ce,total_files_modified:Te,days_active:Ep.size,messages_per_day:Ep.size>0?Math.round(ee/Ep.size*10)/10:0,message_hours:B,sessions_using_task_agent:Zr,sessions_using_mcp:Sp,response_time:{median_seconds:Math.round(AE*10)/10,avg_seconds:Math.round(EE*10)/10,histogram:eo,total_samples:te.length},parallel_sessions:{events:Zh,sessions_involved:e_},analysis_freshness:{with_timestamp:Gh,pre_instrumentation:Kh,stale_30d:Yh,oldest_analyzed_at:_a?new Date(_a).toISOString():null,newest_analyzed_at:ya?new Date(ya).toISOString():null}};$s.autoAddAvailable=!!(n&&fM.existsSync(gM.join(n,"CLAUDE.md")));let Ad=[Po(W.userId,t),Po(W.status,"completed")];r?Ad.push(Po(W.projectId,r)):n?Ad.push(sS(W.projectPath,`%${ot(n)}%`)):Ad.push(Yi`${W.projectPath} IS NULL`);let[t_]=await nt.select({id:W.id,result:W.result}).from(W).where(Vg(...Ad)).orderBy(Jg(W.completedAt)).limit(1),xE=t_?.result,Rp=Zm(xE?.recommendations);if(Rp&&Object.keys(Rp).length>0)$s.recommendations=Rp,$s._recsJobId=t_?.id??null;else if(f.length>=3){let V=wM({totalSessions:f.length,sessionsWithAnalysis:Jo,toolCounts:I,toolErrorCategories:H,friction:$,outcomes:D,sessionsUsingMcp:Sp,sessionsUsingTaskAgent:Zr,totalToolErrors:Ye,totalMessages:ee,totalDurationHours:Re});V&&($s.recommendations=V)}return Hl.size>1e3&&Hl.clear(),Hl.set(a,{at:Date.now(),data:$s}),$s}),{_recsJobId:m,...y}=p;if(y.recommendations)try{y.recommendations=await eS({userId:t,projectPath:n,jobId:m??null,recs:y.recommendations})}catch{}return e.json(y)});Kc.get("/insights/recommendations/history",async e=>{let t=e.get("userId"),n=e.req.query("projectPath")??"",r=await u.select({category:Ee.category,label:Ee.label,timesGenerated:Ee.timesGenerated,dismissedAt:Ee.dismissedAt,lastSeenAt:Ee.lastSeenAt}).from(Ee).where(Vg(Po(Ee.userId,t),Po(Ee.projectPath,n))).orderBy(Yi`${Ee.dismissedAt} IS NULL`,Jg(Ee.timesGenerated)).limit(40);return e.json({dismissed:r.filter(o=>o.dismissedAt!==null&&o.label!=="").map(o=>({category:o.category,label:o.label,dismissedAt:o.dismissedAt})),repeated:r.filter(o=>o.dismissedAt===null&&o.timesGenerated>=2&&o.label!=="").map(o=>({category:o.category,label:o.label,timesGenerated:o.timesGenerated}))})});Kc.post("/insights/recommendations/dismiss",async e=>{let t=e.get("userId"),n=await e.req.json().catch(()=>({})),r=typeof n.contentHash=="string"?n.contentHash:"";if(!/^[0-9a-f]{64}$/.test(r))return e.json({error:"contentHash must be the 64-hex entry id from the compute response"},400);let o=typeof n.projectPath=="string"?n.projectPath:void 0;return await tS({userId:t,projectPath:o,contentHash:r}),e.json({ok:!0})});O();import{Hono as bM}from"hono";import{and as En,count as SM,eq as Pe,ilike as AM,inArray as EM,sql as pn}from"drizzle-orm";ls();var Ts=new bM,xs=d(e=>us(e?.outcome??null),"scoreOf");Ts.get("/insights/linked-instructions",async e=>{let t=e.get("userId"),n=e.req.query("projectPath"),r=Number(e.req.query("limit")??20),o=[Pe(_.userId,t)];n&&o.push(AM(_.projectPath,`%${ot(n)}%`));let s=await u.select({id:g.id,name:g.name,contentHash:g.contentHash,source:pn`${g.frontmatter}->>'source'`,linkedSessions:pn`COUNT(DISTINCT ${se.sessionId})`}).from(se).innerJoin(_,Pe(_.id,se.sessionId)).innerJoin(g,Pe(g.id,se.instructionId)).where(En(...o)).groupBy(g.id,g.name,g.contentHash,pn`${g.frontmatter}->>'source'`).orderBy(pn`COUNT(DISTINCT ${se.sessionId}) DESC`).limit(r);return e.json(s.map(i=>({id:i.id,name:i.name,contentHash:i.contentHash,source:i.source,linkedSessions:Number(i.linkedSessions)})))});Ts.get("/insights/instruction-impact",async e=>{let t=e.get("userId"),n=e.req.query("instructionId");if(!n)return e.json({error:"instructionId query param required"},400);let r=await u.select({id:_.id,projectId:_.projectId,model:_.model,tool:_.tool,tokenUsage:_.tokenUsage,analysis:_.analysis,metadata:_.metadata,eventCount:_.eventCount,startedAt:_.startedAt}).from(_).innerJoin(Z,Pe(Z.sessionId,_.id)).where(En(Pe(_.userId,t),Pe(Z.treatmentType,"instruction"),Pe(Z.treatmentId,n))),o=r.map(M=>M.id),s=await u.select({id:_.id,projectId:_.projectId,model:_.model,tool:_.tool,tokenUsage:_.tokenUsage,analysis:_.analysis,metadata:_.metadata,eventCount:_.eventCount,startedAt:_.startedAt}).from(_).where(En(Pe(_.userId,t),pn`${_.analysis} IS NOT NULL`)),i=await u.selectDistinct({sessionId:Z.sessionId}).from(Z).where(En(Pe(Z.userId,t),Pe(Z.treatmentType,"instruction"))),a=new Set(i.map(M=>M.sessionId)),c=new Set(o),l=s.filter(M=>!c.has(M.id)&&a.has(M.id));function p(M){let ue=0,lt=0,Be=0,re=0,he=[],C={},oe={achieved:1,fully_achieved:1,mostly_achieved:.75,partially_achieved:.5,unclear_from_transcript:.25,not_achieved:0,abandoned:0};for(let ve of M){let Ce=ve.analysis,Te=ve.metadata?.local_session_meta;if(Ce?.outcome){let Ht=oe[Ce.outcome];Ht!==void 0&&he.push(Ht)}Te&&(re++,ue+=Te.tool_errors??0,lt+=Te.duration_minutes??0,Be+=(Te.lines_added??0)+(Te.lines_removed??0));let Ye=Ce?.goal_categories??{};for(let[Ht,jr]of Object.entries(Ye))jr>0&&(C[Ht]=(C[Ht]||0)+jr)}return{sessionCount:M.length,enrichedCount:re,outcomeScores:he,avgOutcomeScore:he.length>0?Math.round(he.reduce((ve,Ce)=>ve+Ce,0)/he.length*100)/100:null,avgToolErrors:re>0?Math.round(ue/re*10)/10:null,avgDurationMinutes:re>0?Math.round(lt/re*10)/10:null,avgLinesChanged:re>0?Math.round(Be/re):null,topGoalCategories:C}}d(p,"computeCohort");let m=p(r),y=p(l),v=d(M=>{if(!M)return"(no-date)";let ue=typeof M=="string"?new Date(M):M;return Number.isNaN(ue.getTime())?"(no-date)":`${ue.getUTCFullYear()}-${String(ue.getUTCMonth()+1).padStart(2,"0")}`},"monthKey"),h=d(M=>{if(!M)return 0;let ue=typeof M=="string"?new Date(M):M;return Number.isNaN(ue.getTime())?0:ue.getTime()},"timeOf"),f=new Map,w=d((M,ue,lt,Be)=>{let re=`${M??"(no-project)"}|${v(ue)}`,he=f.get(re);he||(he={key:re,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},f.set(re,he)),(Be?he.withScores:he.withoutScores).push(lt),(Be?he.withTimes:he.withoutTimes).push(h(ue))},"addToStratum");for(let M of r){let ue=xs(M.analysis);ue!=null&&w(M.projectId,M.startedAt,ue,!0)}for(let M of l){let ue=xs(M.analysis);ue!=null&&w(M.projectId,M.startedAt,ue,!1)}let b=d(M=>{let ue=new Map,lt=new Set,Be=d((re,he,C,oe,ve)=>{let Ce=ue.get(re);Ce||(Ce=new Map,ue.set(re,Ce));let Te=`${he??"(no-project)"}|${v(C)}`,Ye=Ce.get(Te);Ye||(Ye={key:Te,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},Ce.set(Te,Ye)),(ve?Ye.withScores:Ye.withoutScores).push(oe),(ve?Ye.withTimes:Ye.withoutTimes).push(h(C))},"add");for(let re of r){let he=xs(re.analysis),C=M(re);he==null||!C||(lt.add(C),Be(C,re.projectId,re.startedAt,he,!0))}for(let re of l){let he=xs(re.analysis),C=M(re);he==null||!C||!lt.has(C)||Be(C,re.projectId,re.startedAt,he,!1)}return[...lt].map(re=>({segment:re,strata:[...ue.get(re)?.values()??[]]}))},"buildAxisSegments"),I=d(M=>[...M].sort((ue,lt)=>Number(lt.verdict.sufficient)-Number(ue.verdict.sufficient)||lt.verdict.nWith-ue.verdict.nWith),"sortSegs"),S=bf([...f.values()],b(M=>gs(M.model))),A=S.overall,E=I(S.segments).map(M=>({model:M.segment,verdict:M.verdict})),R=I($u(b(M=>M.tool??null))).map(M=>({harness:M.segment,verdict:M.verdict})),{outcomeScores:D,...j}=m,{outcomeScores:P,...$}=y,[H]=await u.select({name:g.name}).from(g).where(Pe(g.id,n)).limit(1),[B]=await u.select({n:SM(),lastAssignedAt:pn`max(${jt.assignedAt})`}).from(jt).where(En(Pe(jt.userId,t),Pe(jt.treatmentType,"instruction"),Pe(jt.treatmentId,n),Pe(jt.method,"auto_added"))),te=B&&Number(B.n)>0?{count:Number(B.n),lastAssignedAt:B.lastAssignedAt}:null,[_e]=await u.select({content:g.content,name:g.name}).from(g).where(Pe(g.id,n)),ee=Ur(_e?.content,_e?.name),Re=ee?(await u.select({projectPath:Y.projectPath,decision:Y.decision,delta:Y.delta,ciLower:Y.ciLower,ciUpper:Y.ciUpper,nTreated:Y.nTreated,nControl:Y.nControl,segment:Y.segment,decidedAt:Y.decidedAt}).from(Y).where(En(Pe(Y.userId,t),Pe(Y.instructionId,n),Pe(Y.contentHash,ee)))).map(M=>({projectPath:M.projectPath,decision:M.decision,delta:Number(M.delta),ciLower:Number(M.ciLower),ciUpper:Number(M.ciUpper),nTreated:M.nTreated,nControl:M.nControl,segment:M.segment,decidedAt:M.decidedAt})):[],N=await u.select({id:q.id,projectPath:q.projectPath,source:q.source,status:q.status}).from(q).where(En(Pe(q.userId,t),Pe(q.instructionId,n),Pe(q.status,"running"))),me=Re.length>0||N.length>0?{verdicts:Re,experiments:N}:null;return e.json({instructionId:n,instructionName:H?.name??"Unknown",verdict:A,segments:E,harnessSegments:R,autoAdded:te,randomised:me,with:j,without:$,comparison:{outcomeScoreDelta:m.avgOutcomeScore!=null&&y.avgOutcomeScore!=null?Math.round((m.avgOutcomeScore-y.avgOutcomeScore)*100)/100:null,toolErrorsDelta:m.avgToolErrors!=null&&y.avgToolErrors!=null?Math.round((m.avgToolErrors-y.avgToolErrors)*10)/10:null,durationDelta:m.avgDurationMinutes!=null&&y.avgDurationMinutes!=null?Math.round((m.avgDurationMinutes-y.avgDurationMinutes)*10)/10:null}})});Ts.get("/insights/instruction-version-impact",async e=>{let t=e.get("userId"),n=e.req.query("instructionId");if(!n)return e.json({error:"instructionId query param required"},400);let r=await u.select({versionOrdinal:sr.versionOrdinal,contentHash:sr.contentHash,firstSeenAt:sr.firstSeenAt,contentLength:pn`COALESCE(LENGTH(${sr.content}), 0)::int`}).from(sr).where(Pe(sr.instructionId,n)).orderBy(sr.versionOrdinal),o=await u.select({id:_.id,projectId:_.projectId,analysis:_.analysis,startedAt:_.startedAt,version:Z.treatmentVersion}).from(_).innerJoin(Z,Pe(Z.sessionId,_.id)).where(En(Pe(_.userId,t),Pe(Z.treatmentType,"instruction"),Pe(Z.treatmentId,n),pn`${Z.treatmentVersion} > 0`)),s=new Map;for(let I of o){let S=s.get(I.version)??[];S.push(I),s.set(I.version,S)}let i=r.map(I=>({version:I.versionOrdinal,contentHash:I.contentHash,firstSeenAt:I.firstSeenAt,sessions:s.get(I.versionOrdinal)?.length??0,replayable:Number(I.contentLength)>0})),a=i.filter(I=>I.sessions>0).map(I=>I.version).sort((I,S)=>I-S),c=Number(e.req.query("version")),l=Number(e.req.query("baselineVersion")),p=Number.isFinite(c)&&c>0?c:a.at(-1),m=Number.isFinite(l)&&l>0?l:a.filter(I=>I!==p).at(-1);if(p==null||m==null)return e.json({instructionId:n,versions:i,version:p??null,baselineVersion:m??null,verdict:null,insufficientReason:"only one version of this instruction has attributed sessions; there is no prior version to compare against"});let y=d(I=>{if(!I)return"(no-date)";let S=typeof I=="string"?new Date(I):I;return Number.isNaN(S.getTime())?"(no-date)":`${S.getUTCFullYear()}-${String(S.getUTCMonth()+1).padStart(2,"0")}`},"monthKey"),v=d(I=>{if(!I)return 0;let S=typeof I=="string"?new Date(I):I;return Number.isNaN(S.getTime())?0:S.getTime()},"timeOf"),h=new Map,f=d((I,S)=>{let A=xs(I.analysis);if(A==null)return;let E=`${I.projectId??"(no-project)"}|${y(I.startedAt)}`,R=h.get(E);R||(R={key:E,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},h.set(E,R)),(S?R.withScores:R.withoutScores).push(A),(S?R.withTimes:R.withoutTimes).push(v(I.startedAt))},"add");for(let I of s.get(p)??[])f(I,!0);for(let I of s.get(m)??[])f(I,!1);let w=In([...h.values()],{baseline:"prior-version"}),[b]=await u.select({name:g.name}).from(g).where(Pe(g.id,n)).limit(1);return e.json({instructionId:n,instructionName:b?.name??"Unknown",version:p,baselineVersion:m,versions:i,verdict:w,replayableVersions:i.filter(I=>I.replayable).length})});Ts.get("/insights/memory-impact",async e=>{let t=e.get("userId"),n=e.req.query("memoryId");if(!n)return e.json({error:"memoryId query param required"},400);let[r]=await u.select({id:F.id,title:F.title,kind:F.kind,version:F.version,status:F.status}).from(F).where(En(Pe(F.id,n),Pe(F.userId,t))).limit(1);if(!r)return e.json({error:"memory not found"},404);let o=await u.select({sessionId:Z.sessionId,treatmentVersion:Z.treatmentVersion}).from(Z).where(En(Pe(Z.userId,t),Pe(Z.treatmentType,"memory"),Pe(Z.treatmentId,n))),s=new Map,i=new Set;for(let f of o){let w=s.get(f.treatmentVersion);w||(w=new Set,s.set(f.treatmentVersion,w)),w.add(f.sessionId),i.add(f.sessionId)}let a=await u.select({id:_.id,projectId:_.projectId,outcome:pn`${_.analysis}->>'outcome'`,startedAt:_.startedAt,inputTokens:pn`coalesce((${_.tokenUsage}->>'input_tokens')::numeric, 0)`,outputTokens:pn`coalesce((${_.tokenUsage}->>'output_tokens')::numeric, 0)`}).from(_).where(En(Pe(_.userId,t),pn`${_.analysis} is not null`)).orderBy(_.id),c=d((f,w)=>w>0?Math.round(f/w*100)/100:null,"avg"),l=d(()=>({n:0,scoreSum:0,scoreN:0,tokenSum:0}),"cohort"),p=d(f=>f.n>0?Math.round(f.tokenSum/f.n):null,"avgTokens"),m=d(f=>{let w=s.get(f)??new Set,b=new Map,I=l(),S=l();for(let j of a){let P=w.has(j.id);if(!P&&i.has(j.id))continue;let $=P?I:S;$.n++,$.tokenSum+=Number(j.inputTokens)+Number(j.outputTokens);let H=xs({outcome:j.outcome});if(H!=null){$.scoreSum+=H,$.scoreN++;let B=j.projectId??"(no-project)",te=b.get(B);te||(te={key:B,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},b.set(B,te)),(P?te.withScores:te.withoutScores).push(H),(P?te.withTimes:te.withoutTimes).push(j.startedAt?.getTime()??0)}}let A=In([...b.values()]),E={sessionCount:I.n,avgOutcomeScore:c(I.scoreSum,I.scoreN),avgTotalTokens:p(I)},R={sessionCount:S.n,avgOutcomeScore:c(S.scoreSum,S.scoreN),avgTotalTokens:p(S)},D={outcomeScoreDelta:E.avgOutcomeScore!=null&&R.avgOutcomeScore!=null?Math.round((E.avgOutcomeScore-R.avgOutcomeScore)*100)/100:null,totalTokensDelta:E.avgTotalTokens!=null&&R.avgTotalTokens!=null?E.avgTotalTokens-R.avgTotalTokens:null};return{verdict:A,with:E,without:R,comparison:D}},"computeVersion"),v=[...new Set([r.version,...s.keys()])].sort((f,w)=>w-f).map(f=>({version:f,isCurrent:f===r.version,...m(f)})),h=v.find(f=>f.isCurrent);return e.json({memoryId:n,memoryTitle:r.title,memoryKind:r.kind,memoryVersion:r.version,verdict:h.verdict,with:h.with,without:h.without,comparison:h.comparison,versions:v.map(({version:f,isCurrent:w,verdict:b,with:I,without:S})=>({version:f,isCurrent:w,verdict:b,with:I,without:S})),cost:{estimated:!0}})});var xM=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;Ts.get("/insights/suggestion-impact",async e=>{let t=e.get("userId"),n=e.req.query("instructionIds")??e.req.query("instructionId")??"",r=[...new Set(n.split(",").map(l=>l.trim()).filter(l=>xM.test(l)))].slice(0,200);if(r.length===0)return e.json({error:"instructionIds query param (comma-separated uuids) required"},400);let o=await u.select({sessionId:Z.sessionId,treatmentId:Z.treatmentId}).from(Z).where(En(Pe(Z.userId,t),Pe(Z.treatmentType,"suggestion"),EM(Z.treatmentId,r))),s=new Map;for(let l of o){let p=s.get(l.treatmentId);p||(p=new Set,s.set(l.treatmentId,p)),p.add(l.sessionId)}let a=(await u.select({id:_.id,projectId:_.projectId,outcome:pn`${_.analysis}->>'outcome'`,startedAt:_.startedAt}).from(_).where(En(Pe(_.userId,t),pn`${_.analysis} is not null`)).orderBy(_.id)).map(l=>({id:l.id,key:l.projectId??"(no-project)",score:xs({outcome:l.outcome}),time:l.startedAt?.getTime()??0})).filter(l=>l.score!=null),c={};for(let l of r){let p=s.get(l);if(!p||p.size===0){c[l]=In([]);continue}let m=new Map;for(let y of a){let v=m.get(y.key);v||(v={key:y.key,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},m.set(y.key,v));let h=p.has(y.id);(h?v.withScores:v.withoutScores).push(y.score),(h?v.withTimes:v.withoutTimes).push(y.time)}c[l]=In([...m.values()],{iterations:2e3})}return e.json({impacts:c})});O();import{Hono as TM}from"hono";import{and as Rs,count as Gg,eq as xn,inArray as iS,sql as Wr}from"drizzle-orm";var Yg=new TM,Kg=/force[- ]?push|rm\s+-rf|git\s+reset\s+--hard|drop\s+table|truncate\b|--no-verify|chmod\s+777|\bsudo\b|secret|credential|password|api[- ]?key|never\s+(delete|drop|force|push|commit|run|deploy)|do\s+not\s+(delete|drop|force|push|commit|run|deploy)/i;Yg.get("/insights/groom-candidates",async e=>{let t=e.get("userId"),[n]=await u.select({n:Gg()}).from(_).where(Rs(xn(_.userId,t),Wr`${_.startedAt} > now() - interval '7 days'`));if(Number(n?.n??0)===0)return e.json({captureHealthy:!1,reason:'No sessions captured in the last 7 days \u2014 cannot tell "unused" from "uncaptured". Grooming paused (never trust a dark pipeline).',candidates:[],harmful:[],safetyGuarded:0,harmfulSafetyGuarded:0,bloated:[],trimSafetyFlagged:0});let[r,o,s,i]=await Promise.all([u.select({id:g.id,name:g.name,type:g.type,content:g.content,lastExposedAt:Wr`max(${Z.exposedAt})`,totalExposures:Gg(Z.id)}).from(g).leftJoin(Z,Rs(xn(Z.treatmentId,g.id),xn(Z.userId,t))).where(Rs(xn(g.createdBy,t),xn(g.archived,!1),Wr`${g.createdAt} < now() - interval '30 days'`)).groupBy(g.id).having(Wr`max(${Z.exposedAt}) is null or max(${Z.exposedAt}) < now() - interval '30 days'`),u.select({id:g.id,name:g.name,type:g.type}).from(g).where(Rs(xn(g.createdBy,t),xn(g.archived,!1))),u.select({treatmentId:Z.treatmentId,sessionId:Z.sessionId}).from(Z).where(Rs(xn(Z.userId,t),xn(Z.treatmentType,"instruction"),Wr`${Z.sessionId} is not null`)),u.select({id:_.id,projectId:_.projectId,outcome:Wr`${_.analysis}->>'outcome'`,startedAt:_.startedAt}).from(_).where(Rs(xn(_.userId,t),Wr`${_.analysis} is not null`))]),a=await u.select({treatmentId:Z.treatmentId,projectId:_.projectId,n:Gg()}).from(Z).innerJoin(_,xn(_.id,Z.sessionId)).where(Rs(xn(Z.userId,t),xn(Z.treatmentType,"instruction"),Wr`${_.projectId} is not null`)).groupBy(Z.treatmentId,_.projectId),c=new Map;for(let j of a){if(!j.projectId)continue;let P=Number(j.n),$=c.get(j.treatmentId);(!$||P>$.n||P===$.n&&j.projectId<$.projectId)&&c.set(j.treatmentId,{projectId:j.projectId,n:P})}let l=d(j=>c.get(j)?.projectId??null,"topProjectId"),p=r.filter(j=>!(j.content&&Kg.test(j.content))),m=r.length-p.length,y=p.map(j=>({id:j.id,name:j.name,type:j.type,reason:Number(j.totalExposures)===0?"never used":"not used in 30+ days",lastExposedAt:j.lastExposedAt,totalExposures:Number(j.totalExposures),topProjectId:l(j.id)})).sort((j,P)=>j.totalExposures-P.totalExposures).slice(0,50),v=new Map;for(let j of i){let P=j.outcome!=null?pi[j.outcome]:void 0;P!==void 0&&v.set(j.id,{projectId:j.projectId,score:P,time:j.startedAt?.getTime()??0})}let h=new Map;for(let j of s){if(!j.sessionId)continue;let P=h.get(j.treatmentId);P||(P=new Set,h.set(j.treatmentId,P)),P.add(j.sessionId)}let f=[],w=[];for(let j of o){let P=h.get(j.id);if(!P)continue;let $=0;for(let _e of P)v.has(_e)&&$++;if($<10)continue;let H=new Map;for(let[_e,{projectId:ee,score:Re,time:N}]of v){let me=ee??"(no-project)",M=H.get(me);M||(M={key:me,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},H.set(me,M));let ue=P.has(_e);(ue?M.withScores:M.withoutScores).push(Re),(ue?M.withTimes:M.withoutTimes).push(N)}let B=In([...H.values()]),te=ds(B);te==="harmful"?f.push({id:j.id,name:j.name,type:j.type,verdict:B,exposures:B.nWith,topProjectId:l(j.id)}):te==="neutral"&&w.push({id:j.id,name:j.name,type:j.type,verdict:B,exposures:B.nWith,topProjectId:l(j.id)})}let b=0,I=f;if(f.length>0){let j=await u.select({id:g.id,content:g.content}).from(g).where(iS(g.id,f.map($=>$.id))),P=new Map(j.map($=>[$.id,$.content]));I=f.filter($=>{let H=P.get($.id);return H&&Kg.test(H)?(b++,!1):!0})}I.sort((j,P)=>j.verdict.delta-P.verdict.delta);let S=1500,A=[],E=0;if(w.length>0){let j=await u.select({id:g.id,estimatedTokens:Wr`(length(${g.content}) / 4)::int`,content:g.content}).from(g).where(iS(g.id,w.map($=>$.id))),P=new Map(j.map($=>[$.id,$]));for(let $ of w){let H=P.get($.id),B=Number(H?.estimatedTokens??0);if(B<S)continue;let te=!!(H?.content&&Kg.test(H.content));te&&E++,A.push({...$,estimatedTokens:B,containsSafetyLanguage:te})}A.sort(($,H)=>H.estimatedTokens-$.estimatedTokens),A=A.slice(0,20)}let R=new Set(I.map(j=>j.id)),D=y.filter(j=>!R.has(j.id));return e.json({captureHealthy:!0,candidates:D,safetyGuarded:m,harmful:I,harmfulSafetyGuarded:b,bloated:A,trimSafetyFlagged:E})});O();import{Hono as kM}from"hono";import{z as Xi}from"zod";import{and as er,desc as cS,eq as gt,getTableColumns as jM,gte as Xg,ilike as Bl,isNull as NM,ne as PM,or as CM,sql as vr}from"drizzle-orm";O();import{desc as RM,eq as aS}from"drizzle-orm";async function ks(e){if(!e)return null;try{let[t]=await u.select({projectId:le.projectId}).from(le).where(aS(le.path,e)).orderBy(RM(le.lastSeen)).limit(1);if(t)return t.projectId;let[n]=await u.select({id:U.id}).from(U).where(aS(U.gitRemoteUrl,e)).limit(1);return n?.id??null}catch{return null}}d(ks,"resolveProjectIdForPath");var Co=new kM;function OM(e,t){let n=t?Bl(W.projectPath,`%${ot(t)}%`):void 0;return e&&n?CM(gt(W.projectId,e),er(NM(W.projectId),n)):e?gt(W.projectId,e):n}d(OM,"insightsJobProjectScope");Co.post("/insights-jobs",async e=>{let t=e.get("userId"),n=await e.req.json().catch(()=>({})),r=n.dedup,o=n.projectPath??null,s=await ks(o);if(r==="daily"){let p=new Date;p.setHours(0,0,0,0);let m=o,y=[gt(W.userId,t),Xg(W.createdAt,p)];s?y.push(gt(W.projectId,s)):m?y.push(Bl(W.projectPath,`%${ot(m)}%`)):y.push(vr`${W.projectPath} IS NULL`);let[v]=await u.select({id:W.id}).from(W).where(er(...y)).limit(1);if(v)return e.json({skipped:!0,reason:"already_generated_today",existingJobId:v.id},200);let h=[gt(W.userId,t),gt(W.status,"completed")];s?h.push(gt(W.projectId,s)):m?h.push(Bl(W.projectPath,`%${ot(m)}%`)):h.push(vr`${W.projectPath} IS NULL`);let[f]=await u.select({completedAt:W.completedAt}).from(W).where(er(...h)).orderBy(cS(W.completedAt)).limit(1),w=f?.completedAt??new Date(0),b=[gt(_.userId,t),Xg(_.startedAt,w)];s?b.push(gt(_.projectId,s)):m&&b.push(Bl(_.projectPath,`%${ot(m)}%`));let[{count:I}]=await u.select({count:vr`COUNT(*)`}).from(_).where(er(...b));if(Number(I)<5)return e.json({skipped:!0,reason:"insufficient_sessions",sessionsSinceLastRun:Number(I),threshold:5},200)}let i=o,{id:a,noLiveWorker:c}=await Rt({taskName:"process_insights",payload:{projectPath:i,projectId:s},userId:t,mirror:{userId:t,projectPath:i,projectId:s}}),[l]=await u.select().from(W).where(gt(W.id,a));return e.json({...l,noLiveWorker:c},201)});Co.get("/insights-jobs",async e=>{let t=e.get("userId"),n=Number(e.req.query("limit")??10),r=e.req.query("projectPath"),o=e.req.query("projectId")??await ks(r??null),s=[gt(W.userId,t)],i=OM(o,r??null);i&&s.push(i);let{result:a,...c}=jM(W),l=await u.select(c).from(W).where(er(...s)).orderBy(cS(W.createdAt)).limit(n);return e.json(l)});Co.get("/insights-jobs/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(W).where(er(gt(W.id,n),gt(W.userId,t)));return r?e.json(r):e.json({error:"Job not found"},404)});Co.patch("/insights-jobs/:id/progress",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),s=["running","paused"].includes(r.status)?r.status:"running",[i]=await u.update(W).set({status:s,progress:r.progress,updatedAt:new Date}).where(er(gt(W.id,n),gt(W.userId,t))).returning();return i?e.json(i):e.json({error:"Job not found"},404)});var DM=Xi.object({status:Xi.enum(["running","completed","failed"]).optional(),attempts:Xi.number().int().nonnegative().optional(),error:Xi.string().optional(),result:Xi.record(Xi.unknown()).optional()});Co.patch("/insights-jobs/:id/state",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=DM.parse(await e.req.json()),o={updatedAt:new Date};r.attempts!==void 0&&(o.attempts=r.attempts),r.status&&(o.status=r.status),r.error&&(o.error=r.error),r.result!==void 0&&(o.result=r.result),(r.status==="completed"||r.status==="failed")&&(o.completedAt=new Date);let[s]=await u.update(W).set(o).where(er(gt(W.id,n),gt(W.userId,t),PM(W.status,"cancelled"))).returning();if(!s){let[i]=await u.select().from(W).where(er(gt(W.id,n),gt(W.userId,t)));return i?e.json(i):e.json({error:"Job not found"},404)}return e.json(s)});var MM=14400*1e3;Co.post("/insights-jobs/regenerate-all",async e=>{let t=e.get("userId"),n=await e.req.json().catch(()=>({})),r=Number(n.minSessions??3),o=n.force===!0,s=new Date(Date.now()-MM),i=await u.select({projectId:_.projectId,sessionCount:vr`COUNT(*)`}).from(_).where(er(gt(_.userId,t),vr`${_.projectId} IS NOT NULL`)).groupBy(_.projectId).orderBy(vr`COUNT(*) DESC`),a=i.map(v=>v.projectId).filter(v=>!!v),c=new Map;if(a.length>0){let v=await u.execute(vr`
|
|
1063
|
+
`):[];for(let V of n_)t_.add(V.sessionId);for(let V of f){let ge=V.metadata?.local_session_meta,ze=V.analysis,Fe=V.tokenUsage;if(V.tool&&(S[V.tool]=(S[V.tool]||0)+1),V.projectPath){let et=V.projectPath.split("/").pop()??V.projectPath;E[et]=(E[et]||0)+1}if(Fe&&!t_.has(V.id)){let et=Fe.input_tokens??0,Bt=Fe.output_tokens??0,gn=Fe.cache_read_input_tokens??0,en=Fe.cache_creation_5m??0,Fn=Fe.cache_creation_1h??0,it=Fe.cache_creation_input_tokens??0,It=en+Fn||it;N+=et,me+=Bt,M+=gn,ue+=It;let yt=await b(Fe,Sd,V.startedAt);lt+=yt.inputUsd,Be+=yt.outputUsd,re+=yt.cacheReadUsd,he+=yt.cacheWriteUsd;let an=yt.inputUsd+yt.outputUsd+yt.cacheReadUsd+yt.cacheWriteUsd,Ko=V.tool??"unknown",i_=wa[Sd]??Ad();Ed(i_,et,Bt,gn,It,an),wa[Sd]=i_;let a_=va[Ko]??Ad();Ed(a_,et,Bt,gn,It,an),va[Ko]=a_}if(ge){jr++;let et=ge.user_message_count??0;te+=et,Re+=(ge.duration_minutes??0)/60,C+=ge.git_commits??0,oe+=ge.git_pushes??0,ve+=ge.lines_added??0,Ce+=ge.lines_removed??0,Te+=ge.files_modified??0,Ye+=ge.tool_errors??0;let Bt=ge.tool_counts;if(Bt)for(let[yt,an]of Object.entries(Bt))I[yt]=(I[yt]||0)+an;let gn=ge.languages;if(gn)for(let[yt,an]of Object.entries(gn))A[yt]=(A[yt]||0)+an;let en=ge.message_hours;en&&B.push(...en);let Fn=ge.tool_error_categories;if(Fn)for(let[yt,an]of Object.entries(Fn))H[yt]=(H[yt]||0)+an;let it=ge.user_response_times;it&&ee.push(...it),Ht+=ge.user_interruptions??0,ge.uses_task_agent&&Zr++,ge.uses_mcp&&Tp++;let It=ge.user_message_timestamps;It&&It.length>0&&_e.push({id:V.id,start:V.startedAt.toISOString(),timestamps:It})}if(ze)if(V.analyzedAt){Qh++;let et=new Date(V.analyzedAt).getTime();(_a===null||et<_a)&&(_a=et),(ya===null||et>ya)&&(ya=et),et<IE&&e_++}else Zh++;if(ze){Jo++;let et=ze.goal_categories;if(et)for(let[it,It]of Object.entries(et))It>0&&(R[it]=(R[it]||0)+It);let Bt=ze.outcome;Bt&&(O[Bt]=(O[Bt]||0)+1);let gn=ze.user_satisfaction;if(gn)for(let[it,It]of Object.entries(gn))It>0&&(j[it]=(j[it]||0)+It);let en=ze.session_type;en&&(P[en]=(P[en]||0)+1);let Fn=ze.friction??ze.friction_counts;if(Fn)for(let[it,It]of Object.entries(Fn))It>0&&($[it]=($[it]||0)+It);Rp.length<50&&Rp.push({id:V.id,externalId:V.externalSessionId,date:V.startedAt.toISOString().split("T")[0]??"",summary:ze.brief_summary??"",goal:ze.underlying_goal,outcome:Bt})}}let xd=f.map(V=>V.startedAt.toISOString()).sort(),kp=new Set(xd.map(V=>V.split("T")[0]));for(let V of n_){let ge=Number(V.inputTokens)||0,ze=Number(V.outputTokens)||0,Fe=Number(V.cacheReadTokens)||0,et=Number(V.cacheWrite5m)||0,Bt=Number(V.cacheWrite1h)||0,gn=Number(V.cacheWriteLegacy)||0,en=et+Bt||gn,Fn=bE.get(V.sessionId)??new Date,it=await b({input_tokens:ge,output_tokens:ze,cache_read_input_tokens:Fe,cache_creation_input_tokens:en},V.model,Fn);lt+=it.inputUsd,Be+=it.outputUsd,re+=it.cacheReadUsd,he+=it.cacheWriteUsd,N+=ge,me+=ze,M+=Fe,ue+=en;let It=it.inputUsd+it.outputUsd+it.cacheReadUsd+it.cacheWriteUsd,yt=wa[V.model]??Ad();Ed(yt,ge,ze,Fe,en,It),wa[V.model]=yt;let an=SE.get(V.sessionId)??"unknown",Ko=va[an]??Ad();Ed(Ko,ge,ze,Fe,en,It),va[an]=Ko}let Go=d(V=>Math.round(V*100)/100,"round2"),AE=lt+Be+re+he,EE=Go(AE),xE={inputUsd:Go(lt),outputUsd:Go(Be),cacheReadUsd:Go(re),cacheWriteUsd:Go(he)},jp={};for(let[V,ge]of Object.entries(wa))jp[V]={input_tokens:ge.input_tokens,output_tokens:ge.output_tokens,cache_read_tokens:ge.cache_read_tokens,cache_write_tokens:ge.cache_write_tokens,cost_usd:Go(ge.cost_usd)};let Np={};for(let[V,ge]of Object.entries(va))Np[V]={input_tokens:ge.input_tokens,output_tokens:ge.output_tokens,cache_read_tokens:ge.cache_read_tokens,cache_write_tokens:ge.cache_write_tokens,cost_usd:Go(ge.cost_usd)};let eo={"2-10s":0,"10-30s":0,"30s-1m":0,"1-2m":0,"2-5m":0,"5-15m":0,">15m":0};for(let V of ee)V<10?eo["2-10s"]++:V<30?eo["10-30s"]++:V<60?eo["30s-1m"]++:V<120?eo["1-2m"]++:V<300?eo["2-5m"]++:V<900?eo["5-15m"]++:eo[">15m"]++;let Ls=[...ee].sort((V,ge)=>V-ge),TE=Ls.length>0?Ls[Math.floor(Ls.length/2)]:0,RE=Ls.length>0?Ls.reduce((V,ge)=>V+ge,0)/Ls.length:0,r_=0,o_=0;if(_e.length>1){let V=_e.flatMap(ze=>ze.timestamps.map(Fe=>({sessionId:ze.id,time:new Date(Fe).getTime()}))).sort((ze,Fe)=>ze.time-Fe.time),ge=new Set;for(let ze=0;ze<V.length-1;ze++){let Fe=V[ze],et=V[ze+1];Fe.sessionId!==et.sessionId&&et.time-Fe.time<1800*1e3&&(ge.add(Fe.sessionId),ge.add(et.sessionId),r_++)}o_=ge.size}let $s={computed:!0,total_sessions:f.length,window:{since:o??null,until:s??null},truncated:f.length>=h,sessions_with_meta:jr,sessions_with_analysis:Jo,tools_used:S,date_range:{start:xd[0]?.split("T")[0]??"",end:xd[xd.length-1]?.split("T")[0]??""},total_messages:te,total_duration_hours:Math.round(Re*10)/10,total_input_tokens:N,total_output_tokens:me,total_cache_read_tokens:M,total_cache_write_tokens:ue,estimated_cost_usd:EE,estimated_cost_breakdown:xE,estimated_cost_by_model:Object.keys(jp).length>0?jp:void 0,estimated_cost_by_tool:Object.keys(Np).length>0?Np:void 0,tool_counts:I,languages:A,git_commits:C,git_pushes:oe,projects:E,goal_categories:R,outcomes:O,satisfaction:j,session_types:P,friction:$,tool_error_categories:H,session_summaries:Rp,total_tool_errors:Ye,total_interruptions:Ht,total_lines_added:ve,total_lines_removed:Ce,total_files_modified:Te,days_active:kp.size,messages_per_day:kp.size>0?Math.round(te/kp.size*10)/10:0,message_hours:B,sessions_using_task_agent:Zr,sessions_using_mcp:Tp,response_time:{median_seconds:Math.round(TE*10)/10,avg_seconds:Math.round(RE*10)/10,histogram:eo,total_samples:ee.length},parallel_sessions:{events:r_,sessions_involved:o_},analysis_freshness:{with_timestamp:Qh,pre_instrumentation:Zh,stale_30d:e_,oldest_analyzed_at:_a?new Date(_a).toISOString():null,newest_analyzed_at:ya?new Date(ya).toISOString():null}};$s.autoAddAvailable=!!(n&&vM.existsSync(IM.join(n,"CLAUDE.md")));let Td=[Po(W.userId,t),Po(W.status,"completed")];r?Td.push(Po(W.projectId,r)):n?Td.push(cS(W.projectPath,`%${ot(n)}%`)):Td.push(Yi`${W.projectPath} IS NULL`);let[s_]=await nt.select({id:W.id,result:W.result}).from(W).where(Yg(...Td)).orderBy(Xg(W.completedAt)).limit(1),kE=s_?.result,Pp=rf(kE?.recommendations);if(Pp&&Object.keys(Pp).length>0)$s.recommendations=Pp,$s._recsJobId=s_?.id??null;else if(f.length>=3){let V=EM({totalSessions:f.length,sessionsWithAnalysis:Jo,toolCounts:I,toolErrorCategories:H,friction:$,outcomes:O,sessionsUsingMcp:Tp,sessionsUsingTaskAgent:Zr,totalToolErrors:Ye,totalMessages:te,totalDurationHours:Re});V&&($s.recommendations=V)}return zl.size>1e3&&zl.clear(),zl.set(a,{at:Date.now(),data:$s}),$s}),{_recsJobId:m,...y}=p;if(y.recommendations)try{y.recommendations=await rS({userId:t,projectPath:n,jobId:m??null,recs:y.recommendations})}catch{}return e.json(y)});Qc.get("/insights/recommendations/history",async e=>{let t=e.get("userId"),n=e.req.query("projectPath")??"",r=await u.select({category:Ee.category,label:Ee.label,timesGenerated:Ee.timesGenerated,dismissedAt:Ee.dismissedAt,lastSeenAt:Ee.lastSeenAt}).from(Ee).where(Yg(Po(Ee.userId,t),Po(Ee.projectPath,n))).orderBy(Yi`${Ee.dismissedAt} IS NULL`,Xg(Ee.timesGenerated)).limit(40);return e.json({dismissed:r.filter(o=>o.dismissedAt!==null&&o.label!=="").map(o=>({category:o.category,label:o.label,dismissedAt:o.dismissedAt})),repeated:r.filter(o=>o.dismissedAt===null&&o.timesGenerated>=2&&o.label!=="").map(o=>({category:o.category,label:o.label,timesGenerated:o.timesGenerated}))})});Qc.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 oS({userId:t,projectPath:o,contentHash:r}),e.json({ok:!0})});D();import{Hono as RM}from"hono";import{and as En,count as kM,eq as Pe,ilike as jM,inArray as NM,sql as pn}from"drizzle-orm";ls();var Ts=new RM,xs=d(e=>us(e?.outcome??null),"scoreOf");Ts.get("/insights/linked-instructions",async e=>{let t=e.get("userId"),n=e.req.query("projectPath"),r=Number(e.req.query("limit")??20),o=[Pe(_.userId,t)];n&&o.push(jM(_.projectPath,`%${ot(n)}%`));let s=await u.select({id:g.id,name:g.name,contentHash:g.contentHash,source:pn`${g.frontmatter}->>'source'`,linkedSessions:pn`COUNT(DISTINCT ${se.sessionId})`}).from(se).innerJoin(_,Pe(_.id,se.sessionId)).innerJoin(g,Pe(g.id,se.instructionId)).where(En(...o)).groupBy(g.id,g.name,g.contentHash,pn`${g.frontmatter}->>'source'`).orderBy(pn`COUNT(DISTINCT ${se.sessionId}) DESC`).limit(r);return e.json(s.map(i=>({id:i.id,name:i.name,contentHash:i.contentHash,source:i.source,linkedSessions:Number(i.linkedSessions)})))});Ts.get("/insights/instruction-impact",async e=>{let t=e.get("userId"),n=e.req.query("instructionId");if(!n)return e.json({error:"instructionId query param required"},400);let r=await u.select({id:_.id,projectId:_.projectId,model:_.model,tool:_.tool,tokenUsage:_.tokenUsage,analysis:_.analysis,metadata:_.metadata,eventCount:_.eventCount,startedAt:_.startedAt}).from(_).innerJoin(Z,Pe(Z.sessionId,_.id)).where(En(Pe(_.userId,t),Pe(Z.treatmentType,"instruction"),Pe(Z.treatmentId,n))),o=r.map(M=>M.id),s=await u.select({id:_.id,projectId:_.projectId,model:_.model,tool:_.tool,tokenUsage:_.tokenUsage,analysis:_.analysis,metadata:_.metadata,eventCount:_.eventCount,startedAt:_.startedAt}).from(_).where(En(Pe(_.userId,t),pn`${_.analysis} IS NOT NULL`)),i=await u.selectDistinct({sessionId:Z.sessionId}).from(Z).where(En(Pe(Z.userId,t),Pe(Z.treatmentType,"instruction"))),a=new Set(i.map(M=>M.sessionId)),c=new Set(o),l=s.filter(M=>!c.has(M.id)&&a.has(M.id));function p(M){let ue=0,lt=0,Be=0,re=0,he=[],C={},oe={achieved:1,fully_achieved:1,mostly_achieved:.75,partially_achieved:.5,unclear_from_transcript:.25,not_achieved:0,abandoned:0};for(let ve of M){let Ce=ve.analysis,Te=ve.metadata?.local_session_meta;if(Ce?.outcome){let Ht=oe[Ce.outcome];Ht!==void 0&&he.push(Ht)}Te&&(re++,ue+=Te.tool_errors??0,lt+=Te.duration_minutes??0,Be+=(Te.lines_added??0)+(Te.lines_removed??0));let Ye=Ce?.goal_categories??{};for(let[Ht,jr]of Object.entries(Ye))jr>0&&(C[Ht]=(C[Ht]||0)+jr)}return{sessionCount:M.length,enrichedCount:re,outcomeScores:he,avgOutcomeScore:he.length>0?Math.round(he.reduce((ve,Ce)=>ve+Ce,0)/he.length*100)/100:null,avgToolErrors:re>0?Math.round(ue/re*10)/10:null,avgDurationMinutes:re>0?Math.round(lt/re*10)/10:null,avgLinesChanged:re>0?Math.round(Be/re):null,topGoalCategories:C}}d(p,"computeCohort");let m=p(r),y=p(l),v=d(M=>{if(!M)return"(no-date)";let ue=typeof M=="string"?new Date(M):M;return Number.isNaN(ue.getTime())?"(no-date)":`${ue.getUTCFullYear()}-${String(ue.getUTCMonth()+1).padStart(2,"0")}`},"monthKey"),h=d(M=>{if(!M)return 0;let ue=typeof M=="string"?new Date(M):M;return Number.isNaN(ue.getTime())?0:ue.getTime()},"timeOf"),f=new Map,w=d((M,ue,lt,Be)=>{let re=`${M??"(no-project)"}|${v(ue)}`,he=f.get(re);he||(he={key:re,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},f.set(re,he)),(Be?he.withScores:he.withoutScores).push(lt),(Be?he.withTimes:he.withoutTimes).push(h(ue))},"addToStratum");for(let M of r){let ue=xs(M.analysis);ue!=null&&w(M.projectId,M.startedAt,ue,!0)}for(let M of l){let ue=xs(M.analysis);ue!=null&&w(M.projectId,M.startedAt,ue,!1)}let b=d(M=>{let ue=new Map,lt=new Set,Be=d((re,he,C,oe,ve)=>{let Ce=ue.get(re);Ce||(Ce=new Map,ue.set(re,Ce));let Te=`${he??"(no-project)"}|${v(C)}`,Ye=Ce.get(Te);Ye||(Ye={key:Te,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},Ce.set(Te,Ye)),(ve?Ye.withScores:Ye.withoutScores).push(oe),(ve?Ye.withTimes:Ye.withoutTimes).push(h(C))},"add");for(let re of r){let he=xs(re.analysis),C=M(re);he==null||!C||(lt.add(C),Be(C,re.projectId,re.startedAt,he,!0))}for(let re of l){let he=xs(re.analysis),C=M(re);he==null||!C||!lt.has(C)||Be(C,re.projectId,re.startedAt,he,!1)}return[...lt].map(re=>({segment:re,strata:[...ue.get(re)?.values()??[]]}))},"buildAxisSegments"),I=d(M=>[...M].sort((ue,lt)=>Number(lt.verdict.sufficient)-Number(ue.verdict.sufficient)||lt.verdict.nWith-ue.verdict.nWith),"sortSegs"),S=xf([...f.values()],b(M=>gs(M.model))),A=S.overall,E=I(S.segments).map(M=>({model:M.segment,verdict:M.verdict})),R=I(Bu(b(M=>M.tool??null))).map(M=>({harness:M.segment,verdict:M.verdict})),{outcomeScores:O,...j}=m,{outcomeScores:P,...$}=y,[H]=await u.select({name:g.name}).from(g).where(Pe(g.id,n)).limit(1),[B]=await u.select({n:kM(),lastAssignedAt:pn`max(${jt.assignedAt})`}).from(jt).where(En(Pe(jt.userId,t),Pe(jt.treatmentType,"instruction"),Pe(jt.treatmentId,n),Pe(jt.method,"auto_added"))),ee=B&&Number(B.n)>0?{count:Number(B.n),lastAssignedAt:B.lastAssignedAt}:null,[_e]=await u.select({content:g.content,name:g.name}).from(g).where(Pe(g.id,n)),te=Ur(_e?.content,_e?.name),Re=te?(await u.select({projectPath:Y.projectPath,decision:Y.decision,delta:Y.delta,ciLower:Y.ciLower,ciUpper:Y.ciUpper,nTreated:Y.nTreated,nControl:Y.nControl,segment:Y.segment,decidedAt:Y.decidedAt}).from(Y).where(En(Pe(Y.userId,t),Pe(Y.instructionId,n),Pe(Y.contentHash,te)))).map(M=>({projectPath:M.projectPath,decision:M.decision,delta:Number(M.delta),ciLower:Number(M.ciLower),ciUpper:Number(M.ciUpper),nTreated:M.nTreated,nControl:M.nControl,segment:M.segment,decidedAt:M.decidedAt})):[],N=await u.select({id:q.id,projectPath:q.projectPath,source:q.source,status:q.status}).from(q).where(En(Pe(q.userId,t),Pe(q.instructionId,n),Pe(q.status,"running"))),me=Re.length>0||N.length>0?{verdicts:Re,experiments:N}:null;return e.json({instructionId:n,instructionName:H?.name??"Unknown",verdict:A,segments:E,harnessSegments:R,autoAdded:ee,randomised:me,with:j,without:$,comparison:{outcomeScoreDelta:m.avgOutcomeScore!=null&&y.avgOutcomeScore!=null?Math.round((m.avgOutcomeScore-y.avgOutcomeScore)*100)/100:null,toolErrorsDelta:m.avgToolErrors!=null&&y.avgToolErrors!=null?Math.round((m.avgToolErrors-y.avgToolErrors)*10)/10:null,durationDelta:m.avgDurationMinutes!=null&&y.avgDurationMinutes!=null?Math.round((m.avgDurationMinutes-y.avgDurationMinutes)*10)/10:null}})});Ts.get("/insights/instruction-version-impact",async e=>{let t=e.get("userId"),n=e.req.query("instructionId");if(!n)return e.json({error:"instructionId query param required"},400);let r=await u.select({versionOrdinal:sr.versionOrdinal,contentHash:sr.contentHash,firstSeenAt:sr.firstSeenAt,contentLength:pn`COALESCE(LENGTH(${sr.content}), 0)::int`}).from(sr).where(Pe(sr.instructionId,n)).orderBy(sr.versionOrdinal),o=await u.select({id:_.id,projectId:_.projectId,analysis:_.analysis,startedAt:_.startedAt,version:Z.treatmentVersion}).from(_).innerJoin(Z,Pe(Z.sessionId,_.id)).where(En(Pe(_.userId,t),Pe(Z.treatmentType,"instruction"),Pe(Z.treatmentId,n),pn`${Z.treatmentVersion} > 0`)),s=new Map;for(let I of o){let S=s.get(I.version)??[];S.push(I),s.set(I.version,S)}let i=r.map(I=>({version:I.versionOrdinal,contentHash:I.contentHash,firstSeenAt:I.firstSeenAt,sessions:s.get(I.versionOrdinal)?.length??0,replayable:Number(I.contentLength)>0})),a=i.filter(I=>I.sessions>0).map(I=>I.version).sort((I,S)=>I-S),c=Number(e.req.query("version")),l=Number(e.req.query("baselineVersion")),p=Number.isFinite(c)&&c>0?c:a.at(-1),m=Number.isFinite(l)&&l>0?l:a.filter(I=>I!==p).at(-1);if(p==null||m==null)return e.json({instructionId:n,versions:i,version:p??null,baselineVersion:m??null,verdict:null,insufficientReason:"only one version of this instruction has attributed sessions; there is no prior version to compare against"});let y=d(I=>{if(!I)return"(no-date)";let S=typeof I=="string"?new Date(I):I;return Number.isNaN(S.getTime())?"(no-date)":`${S.getUTCFullYear()}-${String(S.getUTCMonth()+1).padStart(2,"0")}`},"monthKey"),v=d(I=>{if(!I)return 0;let S=typeof I=="string"?new Date(I):I;return Number.isNaN(S.getTime())?0:S.getTime()},"timeOf"),h=new Map,f=d((I,S)=>{let A=xs(I.analysis);if(A==null)return;let E=`${I.projectId??"(no-project)"}|${y(I.startedAt)}`,R=h.get(E);R||(R={key:E,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},h.set(E,R)),(S?R.withScores:R.withoutScores).push(A),(S?R.withTimes:R.withoutTimes).push(v(I.startedAt))},"add");for(let I of s.get(p)??[])f(I,!0);for(let I of s.get(m)??[])f(I,!1);let w=In([...h.values()],{baseline:"prior-version"}),[b]=await u.select({name:g.name}).from(g).where(Pe(g.id,n)).limit(1);return e.json({instructionId:n,instructionName:b?.name??"Unknown",version:p,baselineVersion:m,versions:i,verdict:w,replayableVersions:i.filter(I=>I.replayable).length})});Ts.get("/insights/memory-impact",async e=>{let t=e.get("userId"),n=e.req.query("memoryId");if(!n)return e.json({error:"memoryId query param required"},400);let[r]=await u.select({id:F.id,title:F.title,kind:F.kind,version:F.version,status:F.status}).from(F).where(En(Pe(F.id,n),Pe(F.userId,t))).limit(1);if(!r)return e.json({error:"memory not found"},404);let o=await u.select({sessionId:Z.sessionId,treatmentVersion:Z.treatmentVersion}).from(Z).where(En(Pe(Z.userId,t),Pe(Z.treatmentType,"memory"),Pe(Z.treatmentId,n))),s=new Map,i=new Set;for(let f of o){let w=s.get(f.treatmentVersion);w||(w=new Set,s.set(f.treatmentVersion,w)),w.add(f.sessionId),i.add(f.sessionId)}let a=await u.select({id:_.id,projectId:_.projectId,outcome:pn`${_.analysis}->>'outcome'`,startedAt:_.startedAt,inputTokens:pn`coalesce((${_.tokenUsage}->>'input_tokens')::numeric, 0)`,outputTokens:pn`coalesce((${_.tokenUsage}->>'output_tokens')::numeric, 0)`}).from(_).where(En(Pe(_.userId,t),pn`${_.analysis} is not null`)).orderBy(_.id),c=d((f,w)=>w>0?Math.round(f/w*100)/100:null,"avg"),l=d(()=>({n:0,scoreSum:0,scoreN:0,tokenSum:0}),"cohort"),p=d(f=>f.n>0?Math.round(f.tokenSum/f.n):null,"avgTokens"),m=d(f=>{let w=s.get(f)??new Set,b=new Map,I=l(),S=l();for(let j of a){let P=w.has(j.id);if(!P&&i.has(j.id))continue;let $=P?I:S;$.n++,$.tokenSum+=Number(j.inputTokens)+Number(j.outputTokens);let H=xs({outcome:j.outcome});if(H!=null){$.scoreSum+=H,$.scoreN++;let B=j.projectId??"(no-project)",ee=b.get(B);ee||(ee={key:B,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},b.set(B,ee)),(P?ee.withScores:ee.withoutScores).push(H),(P?ee.withTimes:ee.withoutTimes).push(j.startedAt?.getTime()??0)}}let A=In([...b.values()]),E={sessionCount:I.n,avgOutcomeScore:c(I.scoreSum,I.scoreN),avgTotalTokens:p(I)},R={sessionCount:S.n,avgOutcomeScore:c(S.scoreSum,S.scoreN),avgTotalTokens:p(S)},O={outcomeScoreDelta:E.avgOutcomeScore!=null&&R.avgOutcomeScore!=null?Math.round((E.avgOutcomeScore-R.avgOutcomeScore)*100)/100:null,totalTokensDelta:E.avgTotalTokens!=null&&R.avgTotalTokens!=null?E.avgTotalTokens-R.avgTotalTokens:null};return{verdict:A,with:E,without:R,comparison:O}},"computeVersion"),v=[...new Set([r.version,...s.keys()])].sort((f,w)=>w-f).map(f=>({version:f,isCurrent:f===r.version,...m(f)})),h=v.find(f=>f.isCurrent);return e.json({memoryId:n,memoryTitle:r.title,memoryKind:r.kind,memoryVersion:r.version,verdict:h.verdict,with:h.with,without:h.without,comparison:h.comparison,versions:v.map(({version:f,isCurrent:w,verdict:b,with:I,without:S})=>({version:f,isCurrent:w,verdict:b,with:I,without:S})),cost:{estimated:!0}})});var PM=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;Ts.get("/insights/suggestion-impact",async e=>{let t=e.get("userId"),n=e.req.query("instructionIds")??e.req.query("instructionId")??"",r=[...new Set(n.split(",").map(l=>l.trim()).filter(l=>PM.test(l)))].slice(0,200);if(r.length===0)return e.json({error:"instructionIds query param (comma-separated uuids) required"},400);let o=await u.select({sessionId:Z.sessionId,treatmentId:Z.treatmentId}).from(Z).where(En(Pe(Z.userId,t),Pe(Z.treatmentType,"suggestion"),NM(Z.treatmentId,r))),s=new Map;for(let l of o){let p=s.get(l.treatmentId);p||(p=new Set,s.set(l.treatmentId,p)),p.add(l.sessionId)}let a=(await u.select({id:_.id,projectId:_.projectId,outcome:pn`${_.analysis}->>'outcome'`,startedAt:_.startedAt}).from(_).where(En(Pe(_.userId,t),pn`${_.analysis} is not null`)).orderBy(_.id)).map(l=>({id:l.id,key:l.projectId??"(no-project)",score:xs({outcome:l.outcome}),time:l.startedAt?.getTime()??0})).filter(l=>l.score!=null),c={};for(let l of r){let p=s.get(l);if(!p||p.size===0){c[l]=In([]);continue}let m=new Map;for(let y of a){let v=m.get(y.key);v||(v={key:y.key,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},m.set(y.key,v));let h=p.has(y.id);(h?v.withScores:v.withoutScores).push(y.score),(h?v.withTimes:v.withoutTimes).push(y.time)}c[l]=In([...m.values()],{iterations:2e3})}return e.json({impacts:c})});D();import{Hono as CM}from"hono";import{and as Rs,count as Qg,eq as xn,inArray as dS,sql as Wr}from"drizzle-orm";var eh=new CM,Zg=/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;eh.get("/insights/groom-candidates",async e=>{let t=e.get("userId"),[n]=await u.select({n:Qg()}).from(_).where(Rs(xn(_.userId,t),Wr`${_.startedAt} > now() - interval '7 days'`));if(Number(n?.n??0)===0)return e.json({captureHealthy:!1,reason:'No sessions captured in the last 7 days \u2014 cannot tell "unused" from "uncaptured". Grooming paused (never trust a dark pipeline).',candidates:[],harmful:[],safetyGuarded:0,harmfulSafetyGuarded:0,bloated:[],trimSafetyFlagged:0});let[r,o,s,i]=await Promise.all([u.select({id:g.id,name:g.name,type:g.type,content:g.content,lastExposedAt:Wr`max(${Z.exposedAt})`,totalExposures:Qg(Z.id)}).from(g).leftJoin(Z,Rs(xn(Z.treatmentId,g.id),xn(Z.userId,t))).where(Rs(xn(g.createdBy,t),xn(g.archived,!1),Wr`${g.createdAt} < now() - interval '30 days'`)).groupBy(g.id).having(Wr`max(${Z.exposedAt}) is null or max(${Z.exposedAt}) < now() - interval '30 days'`),u.select({id:g.id,name:g.name,type:g.type}).from(g).where(Rs(xn(g.createdBy,t),xn(g.archived,!1))),u.select({treatmentId:Z.treatmentId,sessionId:Z.sessionId}).from(Z).where(Rs(xn(Z.userId,t),xn(Z.treatmentType,"instruction"),Wr`${Z.sessionId} is not null`)),u.select({id:_.id,projectId:_.projectId,outcome:Wr`${_.analysis}->>'outcome'`,startedAt:_.startedAt}).from(_).where(Rs(xn(_.userId,t),Wr`${_.analysis} is not null`))]),a=await u.select({treatmentId:Z.treatmentId,projectId:_.projectId,n:Qg()}).from(Z).innerJoin(_,xn(_.id,Z.sessionId)).where(Rs(xn(Z.userId,t),xn(Z.treatmentType,"instruction"),Wr`${_.projectId} is not null`)).groupBy(Z.treatmentId,_.projectId),c=new Map;for(let j of a){if(!j.projectId)continue;let P=Number(j.n),$=c.get(j.treatmentId);(!$||P>$.n||P===$.n&&j.projectId<$.projectId)&&c.set(j.treatmentId,{projectId:j.projectId,n:P})}let l=d(j=>c.get(j)?.projectId??null,"topProjectId"),p=r.filter(j=>!(j.content&&Zg.test(j.content))),m=r.length-p.length,y=p.map(j=>({id:j.id,name:j.name,type:j.type,reason:Number(j.totalExposures)===0?"never used":"not used in 30+ days",lastExposedAt:j.lastExposedAt,totalExposures:Number(j.totalExposures),topProjectId:l(j.id)})).sort((j,P)=>j.totalExposures-P.totalExposures).slice(0,50),v=new Map;for(let j of i){let P=j.outcome!=null?pi[j.outcome]:void 0;P!==void 0&&v.set(j.id,{projectId:j.projectId,score:P,time:j.startedAt?.getTime()??0})}let h=new Map;for(let j of s){if(!j.sessionId)continue;let P=h.get(j.treatmentId);P||(P=new Set,h.set(j.treatmentId,P)),P.add(j.sessionId)}let f=[],w=[];for(let j of o){let P=h.get(j.id);if(!P)continue;let $=0;for(let _e of P)v.has(_e)&&$++;if($<10)continue;let H=new Map;for(let[_e,{projectId:te,score:Re,time:N}]of v){let me=te??"(no-project)",M=H.get(me);M||(M={key:me,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},H.set(me,M));let ue=P.has(_e);(ue?M.withScores:M.withoutScores).push(Re),(ue?M.withTimes:M.withoutTimes).push(N)}let B=In([...H.values()]),ee=ds(B);ee==="harmful"?f.push({id:j.id,name:j.name,type:j.type,verdict:B,exposures:B.nWith,topProjectId:l(j.id)}):ee==="neutral"&&w.push({id:j.id,name:j.name,type:j.type,verdict:B,exposures:B.nWith,topProjectId:l(j.id)})}let b=0,I=f;if(f.length>0){let j=await u.select({id:g.id,content:g.content}).from(g).where(dS(g.id,f.map($=>$.id))),P=new Map(j.map($=>[$.id,$.content]));I=f.filter($=>{let H=P.get($.id);return H&&Zg.test(H)?(b++,!1):!0})}I.sort((j,P)=>j.verdict.delta-P.verdict.delta);let S=1500,A=[],E=0;if(w.length>0){let j=await u.select({id:g.id,estimatedTokens:Wr`(length(${g.content}) / 4)::int`,content:g.content}).from(g).where(dS(g.id,w.map($=>$.id))),P=new Map(j.map($=>[$.id,$]));for(let $ of w){let H=P.get($.id),B=Number(H?.estimatedTokens??0);if(B<S)continue;let ee=!!(H?.content&&Zg.test(H.content));ee&&E++,A.push({...$,estimatedTokens:B,containsSafetyLanguage:ee})}A.sort(($,H)=>H.estimatedTokens-$.estimatedTokens),A=A.slice(0,20)}let R=new Set(I.map(j=>j.id)),O=y.filter(j=>!R.has(j.id));return e.json({captureHealthy:!0,candidates:O,safetyGuarded:m,harmful:I,harmfulSafetyGuarded:b,bloated:A,trimSafetyFlagged:E})});D();import{Hono as OM}from"hono";import{z as Xi}from"zod";import{and as er,desc as lS,eq as gt,getTableColumns as MM,gte as th,ilike as Vl,isNull as LM,ne as $M,or as qM,sql as vr}from"drizzle-orm";D();import{desc as DM,eq as uS}from"drizzle-orm";async function ks(e){if(!e)return null;try{let[t]=await u.select({projectId:le.projectId}).from(le).where(uS(le.path,e)).orderBy(DM(le.lastSeen)).limit(1);if(t)return t.projectId;let[n]=await u.select({id:U.id}).from(U).where(uS(U.gitRemoteUrl,e)).limit(1);return n?.id??null}catch{return null}}d(ks,"resolveProjectIdForPath");var Co=new OM;function UM(e,t){let n=t?Vl(W.projectPath,`%${ot(t)}%`):void 0;return e&&n?qM(gt(W.projectId,e),er(LM(W.projectId),n)):e?gt(W.projectId,e):n}d(UM,"insightsJobProjectScope");Co.post("/insights-jobs",async e=>{let t=e.get("userId"),n=await e.req.json().catch(()=>({})),r=n.dedup,o=n.projectPath??null,s=await ks(o);if(r==="daily"){let p=new Date;p.setHours(0,0,0,0);let m=o,y=[gt(W.userId,t),th(W.createdAt,p)];s?y.push(gt(W.projectId,s)):m?y.push(Vl(W.projectPath,`%${ot(m)}%`)):y.push(vr`${W.projectPath} IS NULL`);let[v]=await u.select({id:W.id}).from(W).where(er(...y)).limit(1);if(v)return e.json({skipped:!0,reason:"already_generated_today",existingJobId:v.id},200);let h=[gt(W.userId,t),gt(W.status,"completed")];s?h.push(gt(W.projectId,s)):m?h.push(Vl(W.projectPath,`%${ot(m)}%`)):h.push(vr`${W.projectPath} IS NULL`);let[f]=await u.select({completedAt:W.completedAt}).from(W).where(er(...h)).orderBy(lS(W.completedAt)).limit(1),w=f?.completedAt??new Date(0),b=[gt(_.userId,t),th(_.startedAt,w)];s?b.push(gt(_.projectId,s)):m&&b.push(Vl(_.projectPath,`%${ot(m)}%`));let[{count:I}]=await u.select({count:vr`COUNT(*)`}).from(_).where(er(...b));if(Number(I)<5)return e.json({skipped:!0,reason:"insufficient_sessions",sessionsSinceLastRun:Number(I),threshold:5},200)}let i=o,{id:a,noLiveWorker:c}=await Rt({taskName:"process_insights",payload:{projectPath:i,projectId:s},userId:t,mirror:{userId:t,projectPath:i,projectId:s}}),[l]=await u.select().from(W).where(gt(W.id,a));return e.json({...l,noLiveWorker:c},201)});Co.get("/insights-jobs",async e=>{let t=e.get("userId"),n=Number(e.req.query("limit")??10),r=e.req.query("projectPath"),o=e.req.query("projectId")??await ks(r??null),s=[gt(W.userId,t)],i=UM(o,r??null);i&&s.push(i);let{result:a,...c}=MM(W),l=await u.select(c).from(W).where(er(...s)).orderBy(lS(W.createdAt)).limit(n);return e.json(l)});Co.get("/insights-jobs/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(W).where(er(gt(W.id,n),gt(W.userId,t)));return r?e.json(r):e.json({error:"Job not found"},404)});Co.patch("/insights-jobs/:id/progress",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),s=["running","paused"].includes(r.status)?r.status:"running",[i]=await u.update(W).set({status:s,progress:r.progress,updatedAt:new Date}).where(er(gt(W.id,n),gt(W.userId,t))).returning();return i?e.json(i):e.json({error:"Job not found"},404)});var HM=Xi.object({status:Xi.enum(["running","completed","failed"]).optional(),attempts:Xi.number().int().nonnegative().optional(),error:Xi.string().optional(),result:Xi.record(Xi.unknown()).optional()});Co.patch("/insights-jobs/:id/state",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=HM.parse(await e.req.json()),o={updatedAt:new Date};r.attempts!==void 0&&(o.attempts=r.attempts),r.status&&(o.status=r.status),r.error&&(o.error=r.error),r.result!==void 0&&(o.result=r.result),(r.status==="completed"||r.status==="failed")&&(o.completedAt=new Date);let[s]=await u.update(W).set(o).where(er(gt(W.id,n),gt(W.userId,t),$M(W.status,"cancelled"))).returning();if(!s){let[i]=await u.select().from(W).where(er(gt(W.id,n),gt(W.userId,t)));return i?e.json(i):e.json({error:"Job not found"},404)}return e.json(s)});var BM=14400*1e3;Co.post("/insights-jobs/regenerate-all",async e=>{let t=e.get("userId"),n=await e.req.json().catch(()=>({})),r=Number(n.minSessions??3),o=n.force===!0,s=new Date(Date.now()-BM),i=await u.select({projectId:_.projectId,sessionCount:vr`COUNT(*)`}).from(_).where(er(gt(_.userId,t),vr`${_.projectId} IS NOT NULL`)).groupBy(_.projectId).orderBy(vr`COUNT(*) DESC`),a=i.map(v=>v.projectId).filter(v=>!!v),c=new Map;if(a.length>0){let v=await u.execute(vr`
|
|
1059
1064
|
SELECT DISTINCT ON (project_id) project_id, path
|
|
1060
1065
|
FROM project_checkouts
|
|
1061
1066
|
WHERE project_id IN (${vr.join(a.map(h=>vr`${h}`),vr`, `)})
|
|
1062
1067
|
ORDER BY project_id, is_worktree ASC, last_seen DESC
|
|
1063
|
-
`);for(let h of v)c.set(h.project_id,h.path)}let l=[],p=[],m=[],y=!1;for(let v of i){if(Number(v.sessionCount)<r||!v.projectId)continue;let h=c.get(v.projectId);if(!h){p.push({projectPath:"<unknown>",reason:"no_checkout"});continue}try{if(!o){let[I]=await u.select({id:W.id}).from(W).where(er(gt(W.userId,t),gt(W.status,"completed"),gt(W.projectPath,h),
|
|
1068
|
+
`);for(let h of v)c.set(h.project_id,h.path)}let l=[],p=[],m=[],y=!1;for(let v of i){if(Number(v.sessionCount)<r||!v.projectId)continue;let h=c.get(v.projectId);if(!h){p.push({projectPath:"<unknown>",reason:"no_checkout"});continue}try{if(!o){let[I]=await u.select({id:W.id}).from(W).where(er(gt(W.userId,t),gt(W.status,"completed"),gt(W.projectPath,h),th(W.completedAt,s))).limit(1);if(I){p.push({projectPath:h,reason:"fresh"});continue}}let{id:f,noLiveWorker:w}=await Rt({taskName:"process_insights",payload:{projectPath:h},userId:t,mirror:{userId:t,projectPath:h}});w&&(y=!0);let[b]=await u.select().from(W).where(gt(W.id,f));b&&l.push(b)}catch(f){let w=f instanceof Error?f.message:String(f);m.push({projectPath:h,error:w})}}return e.json({created:l.length,jobs:l,skipped:p,errors:m,noLiveWorker:y},201)});D();import Jl from"node:fs";import FM from"node:path";import{createHash as WM}from"node:crypto";import{Hono as zM}from"hono";import{and as pS,desc as VM,eq as Zc}from"drizzle-orm";var nh=new zM;async function JM(e,t,n){try{let r=`${Su.claude_md}::${n}`,[o]=await u.select({id:g.id,version:g.version}).from(g).where(pS(Zc(g.contextIdentity,r),Zc(g.createdBy,e),Zc(g.archived,!1))).orderBy(VM(g.createdAt)).limit(1);if(!o){let a=Jl.readFileSync(n,"utf-8"),c=WM("sha256").update(a).digest("hex"),l={name:n,description:"Project CLAUDE.md",type:"context_file",scope:"personal",version:"1.0.0"},[p]=await u.insert(g).values({name:n,description:"Project CLAUDE.md",type:"context_file",scope:"personal",scopeRef:e,version:"1.0.0",content:a,frontmatter:l,contentHash:c,contextIdentity:r,createdBy:e}).onConflictDoNothing().returning({id:g.id,version:g.version});o=p}if(!o)return null;let s=await ks(t),[i]=await u.insert(jt).values({userId:e,treatmentType:"instruction",treatmentId:o.id,projectId:s??void 0,assignedBy:e,method:"auto_added"}).returning({id:jt.id});return i?.id??null}catch(r){return console.warn("[auto-add] failed to record treatment_assignment:",r instanceof Error?r.message:r),null}}d(JM,"recordAutoAddAssignment");nh.post("/insights/auto-add",async e=>{let t=e.get("userId"),n=await e.req.json(),{projectPath:r,addition:o}=n;if(!r||!o)return e.json({error:"projectPath and addition are required"},400);let[s]=await u.select({id:_.id}).from(_).where(pS(Zc(_.userId,t),Zc(_.projectPath,r))).limit(1);if(!s)return e.json({error:"projectPath is not a known project for this user"},403);let i=FM.join(r,"CLAUDE.md");if(!Jl.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=Jl.readFileSync(i,"utf-8");if(a.includes(o.trim()))return e.json({success:!1,reason:"already_present"},200);let c=a.endsWith(`
|
|
1064
1069
|
`)?`
|
|
1065
1070
|
`:`
|
|
1066
1071
|
|
|
1067
|
-
`;
|
|
1068
|
-
`);let l=await
|
|
1072
|
+
`;Jl.writeFileSync(i,a+c+o.trim()+`
|
|
1073
|
+
`);let l=await JM(t,r,i);return e.json({success:!0,path:i,addedAt:new Date().toISOString(),assignmentId:l,tracked:l!=null})}catch(a){let c=a instanceof Error?a.message:String(a);return e.json({error:`Failed to write: ${c}`},500)}});D();import{createHash as GM}from"node:crypto";import{Hono as KM}from"hono";import{z as Qt}from"zod";import{and as rh,eq as Do,inArray as YM,sql as ed}from"drizzle-orm";function mS(e){let t=e.toLowerCase();return t.includes("hook")?"hook":t.includes("mcp")?"mcp":t.includes("subagent")||t.includes("sub-agent")||t.includes("agent")?"subagent":t.includes("skill")?"skill":"feature"}d(mS,"artifactTypeForFeature");function fS(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(`
|
|
1069
1074
|
|
|
1070
|
-
`)}d(
|
|
1071
|
-
`)[0].replace(/^#+\s*/,"").trim();return(t.length>0?t:e.trim()).slice(0,80)}d(
|
|
1075
|
+
`)}d(fS,"renderFeatureBody");var oh=new KM,XM=Qt.object({projectPath:Qt.string().min(1),additions:Qt.array(Qt.object({addition:Qt.string().min(12).max(4e3),why:Qt.string().max(2e3).default("")})).max(20).default([]),skills:Qt.array(Qt.object({skillId:Qt.string().min(1).max(200),reason:Qt.string().max(2e3).default("")})).max(20).default([]),features:Qt.array(Qt.object({feature:Qt.string().min(2).max(200),one_liner:Qt.string().max(1e3).default(""),why_for_you:Qt.string().max(4e3).default(""),example_code:Qt.string().max(8e3).default("")})).max(20).default([])}),gS=.5,QM=.4,hS=d(e=>GM("sha256").update(e.trim()).digest("hex"),"hashAddition");function _S(e){let t=e.trim().split(`
|
|
1076
|
+
`)[0].replace(/^#+\s*/,"").trim();return(t.length>0?t:e.trim()).slice(0,80)}d(_S,"deriveName");oh.post("/insights/recommendations/nominate",async e=>{let t=e.get("userId"),n=XM.safeParse(await e.req.json());if(!n.success)return e.json({error:"Invalid body",details:n.error.flatten()},400);let{projectPath:r,additions:o,skills:s,features:i}=n.data,a=[],c=0,l=0,p=0,m=[];if(s.length>0){let f=s.flatMap(I=>[I.skillId,`skills--${I.skillId}`]),w=await u.select({id:g.id,name:g.name}).from(g).where(rh(Do(g.type,"skill"),Do(g.archived,!1),YM(g.name,f))),b=new Map(w.map(I=>[I.name,I.id]));for(let I of s){let S=b.get(`skills--${I.skillId}`)??b.get(I.skillId);if(!S){c+=1;continue}a.push({instructionId:S,reason:I.reason||"Recommended by insights",score:gS})}}for(let f of o){let w=hi(f.addition);if(w.length>0){m.push({name:_S(f.addition),placeholders:w.map(A=>A.token)});continue}let b=hS(f.addition),[I]=await u.select({id:g.id}).from(g).where(rh(Do(g.createdBy,t),Do(g.contentHash,b),Do(g.archived,!1))).limit(1),S=I?.id;if(!S){let[A]=await u.insert(g).values({name:_S(f.addition),description:f.why.slice(0,500)||"Proposed by insights from your session history",type:"instruction",scope:"personal",scopeRef:t,version:"1.0.0",content:f.addition,frontmatter:{source:"insights",projectPath:r,proposedAt:new Date().toISOString()},createdBy:t,contentHash:b}).returning({id:g.id});S=A.id,l+=1}a.push({instructionId:S,reason:f.why||"Proposed by insights from your session history",score:gS})}for(let f of i){let w=mS(f.feature),b=fS(f),I=hi(b);if(I.length>0){m.push({name:f.feature.slice(0,80),placeholders:I.map(R=>R.token)});continue}let S=hS(b),[A]=await u.select({id:g.id}).from(g).where(rh(Do(g.createdBy,t),Do(g.contentHash,S),Do(g.archived,!1))).limit(1),E=A?.id;if(!E){let[R]=await u.insert(g).values({name:f.feature.slice(0,80),description:(f.one_liner||"Suggested by insights").slice(0,500),type:w,scope:"personal",scopeRef:t,version:"1.0.0",content:b,frontmatter:{source:"insights",artifactType:w,projectPath:r,proposedAt:new Date().toISOString()},createdBy:t,contentHash:S}).returning({id:g.id});E=R.id,p+=1}a.push({instructionId:E,reason:f.why_for_you||f.one_liner||"Suggested by insights from your session history",score:QM})}if(a.length===0)return e.json({nominated:0,additionsCreated:0,featuresCreated:0,skillsUnresolved:c,additionsRejected:m});let y=new Set,v=a.filter(f=>y.has(f.instructionId)?!1:(y.add(f.instructionId),!0)).map(f=>({userId:t,instructionId:f.instructionId,projectPath:r,projectId:null,score:f.score,reason:f.reason,kind:"add",generatedAt:new Date,isStale:!1})),h=await ks(r);for(let f of v)f.projectId=h;return await u.insert(x).values(v).onConflictDoUpdate({target:[x.userId,x.projectPath,x.instructionId,x.kind],set:{score:ed`excluded.score`,reason:ed`excluded.reason`,generatedAt:ed`excluded.generated_at`,isStale:ed`false`,dismissedAt:ed`CASE WHEN ${x.dismissedAt} IS NOT NULL AND ${x.dismissedAt} >= now() - interval '30 days' THEN ${x.dismissedAt} ELSE NULL END`}}),e.json({nominated:v.length,additionsCreated:l,featuresCreated:p,skillsUnresolved:c,additionsRejected:m})});D();import{Hono as ZM}from"hono";import{and as eL,desc as tL,eq as sh,isNotNull as nL}from"drizzle-orm";var ih=new ZM;ih.get("/insights/evidence",async e=>{let t=e.get("userId"),n=e.req.query("projectPath");if(!n)return e.json({error:"projectPath is required"},400);let[r]=await u.select({result:W.result,completedAt:W.completedAt}).from(W).where(eL(sh(W.userId,t),sh(W.projectPath,n),sh(W.status,"completed"),nL(W.result))).orderBy(tL(W.completedAt)).limit(1);if(!r)return e.json({analyzedAt:null,friction:[],whatWorks:[]});let o=d(p=>typeof p=="string"&&p.trim().length>0,"isStr"),s=d(p=>p!==null&&typeof p=="object"&&!Array.isArray(p),"isRecord"),i=r.result,a=s(i)&&s(i.recommendations)?i.recommendations:void 0,c=d(p=>Array.isArray(p)?p.flatMap(m=>{if(typeof m=="string")return m.trim()?[m.trim()]:[];if(s(m)){let y=m,v=[y.title,y.category,y.pattern].find(o),h=[y.detail,y.description,y.summary,Array.isArray(y.examples)?y.examples.find(o):void 0].find(o),f=[v,h].filter(o).join(" \u2014 ");return f?[f]:[]}return[]}):o(p)?[p.trim()]:[],"asLines"),l=d((p,m)=>{if(Array.isArray(p))return p;if(s(p)){let y=p[m];if(Array.isArray(y))return y}return[]},"listAt");return e.json({analyzedAt:r.completedAt,friction:c(l(a?.friction_analysis,"categories")).slice(0,8),whatWorks:c(l(a?.what_works,"impressive_workflows")).slice(0,8)})});D();import{Hono as rL}from"hono";import{and as ah,eq as js,inArray as yS,isNotNull as oL,or as sL,sql as ch}from"drizzle-orm";var dh=new rL;dh.get("/insights/provenance-impact",async e=>{let t=e.get("userId"),n=await u.select({treatmentId:Z.treatmentId,sessions:ch`count(distinct ${Z.sessionId})::int`}).from(Z).where(ah(js(Z.userId,t),js(Z.treatmentType,"instruction"))).groupBy(Z.treatmentId),r=n.map(h=>h.treatmentId),o=await u.select({id:g.id,name:g.name,source:ch`${g.frontmatter}->>'source'`,createdBy:g.createdBy,scope:g.scope}).from(g).where(ah(js(g.archived,!1),r.length>0?sL(js(g.createdBy,t),yS(g.id,r)):js(g.createdBy,t))).limit(5e3),s=new Map(o.map(h=>[h.id,Ru(h,t)])),i=o.map(h=>h.id),a=await u.select({instructionId:Y.instructionId,decision:Y.decision,delta:Y.delta}).from(Y).where(js(Y.userId,t)),c=i.length>0?await u.select({instructionId:x.instructionId,n:ch`count(*)::int`}).from(x).where(ah(js(x.userId,t),oL(x.acceptedAt),yS(x.instructionId,i))).groupBy(x.instructionId):[],l=new Map,p=d(h=>{let f=l.get(h);return f||(f={provenance:h,instructions:0,exposedInstructions:0,exposedSessions:0,accepted:0,randomisedVerdicts:0,meanDelta:null,evidenceClass:"none"},l.set(h,f)),f},"ensure"),m=new Map(n.map(h=>[h.treatmentId,Number(h.sessions)]));for(let h of o){let f=Ru(h,t),w=m.get(h.id)??0;if(f==="catalog"&&w===0)continue;let b=p(f);b.instructions+=1,w>0&&(b.exposedInstructions+=1,b.exposedSessions+=w)}for(let h of c){let f=s.get(h.instructionId);f&&(p(f).accepted+=Number(h.n))}let y=new Map;for(let h of a){let f=s.get(h.instructionId);if(!f)continue;p(f).randomisedVerdicts+=1;let w=y.get(f)??{sum:0,n:0};w.sum+=Number(h.delta),w.n+=1,y.set(f,w)}for(let[h,f]of y){let w=p(h);w.meanDelta=f.n>0?f.sum/f.n:null,w.evidenceClass=f.n>0?"randomised":"none"}let v=["insights","evolution","user","catalog"];return e.json({groups:v.filter(h=>l.has(h)).map(h=>l.get(h)),measurable:a.length>0,note:a.length===0?"No randomised verdicts exist yet, so no group is measurable. Exposure counts show reach, not effect.":null})});var Ln=new iL;Ln.route("/",Wg);Ln.route("/",Qc);Ln.route("/",Ts);Ln.route("/",eh);Ln.route("/",Co);Ln.route("/",oh);Ln.route("/",ih);Ln.route("/",dh);Ln.route("/",nh);D();import{Hono as aL}from"hono";import{z as st}from"zod";import{and as $n,desc as Gl,eq as Ze,sql as sn}from"drizzle-orm";var mn=new aL,uh=["fact","decision","correction","convention"],wS=4e3,cL=st.object({kind:st.enum(uh),title:st.string().min(1).max(300),body:st.string().min(1).max(wS),projectId:st.string().uuid().optional(),projectPath:st.string().optional(),source:st.enum(["manual","distilled"]).optional()}),dL=st.object({kind:st.enum(uh).optional(),title:st.string().min(1).max(300).optional(),body:st.string().min(1).max(wS).optional(),status:st.enum(["active","archived"]).optional()});async function lh(e){if(!e)return null;try{let[t]=await u.select({projectId:le.projectId}).from(le).where(Ze(le.path,e)).orderBy(Gl(le.lastSeen)).limit(1);if(t)return t.projectId;let[n]=await u.select({id:U.id}).from(U).where(Ze(U.gitRemoteUrl,e)).limit(1);return n?.id??null}catch{return null}}d(lh,"resolveProjectId");mn.get("/memories",async e=>{let t=e.get("userId"),n=e.req.query("projectId"),r=e.req.query("projectPath"),o=e.req.query("status")??"active",s=Number(e.req.query("limit")??"50"),i=Math.min(Math.max(Number.isFinite(s)?s:50,1),200),a=Number(e.req.query("offset")??"0"),c=Math.max(Number.isFinite(a)?a:0,0),l=e.req.query("rank"),p=n??await lh(r??null),m=[Ze(F.userId,t)];o!=="all"&&m.push(Ze(F.status,o));let y=e.req.query("kind");y&&uh.includes(y)&&m.push(Ze(F.kind,y));let v=e.req.query("search")?.trim();if(v){let b=`%${ot(v)}%`;m.push(sn`(${F.title} ilike ${b} or ${F.body} ilike ${b})`)}(n||r)&&m.push(p?sn`(${F.projectId} = ${p} or ${F.projectId} is null)`:sn`${F.projectId} is null`);let h=sn`${F.trustVersion} = ${F.version}`;l==="trust"&&m.push(sn`coalesce(${F.trustClass} = 'harmful' and ${h}, false) = false`);let f=sn`case
|
|
1072
1077
|
when ${F.source} = 'manual' or (${F.trustClass} = 'helpful' and ${h}) then 0
|
|
1073
1078
|
when ${F.trustClass} = 'neutral' and ${h} then 1
|
|
1074
1079
|
else 2
|
|
1075
|
-
end`,w=await u.select({id:F.id,version:F.version,kind:F.kind,title:F.title,body:F.body,source:F.source,status:F.status,projectId:F.projectId,createdAt:F.createdAt,updatedAt:F.updatedAt}).from(F).where(
|
|
1080
|
+
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($n(...m)).orderBy(...l==="trust"?[f,Gl(F.updatedAt)]:[Gl(F.updatedAt)]).limit(i).offset(l==="trust"?0:c);return e.json({memories:w})});mn.post("/memories/relevant",async e=>{let t=e.get("userId"),n=await e.req.json().catch(()=>({})),r=typeof n.prompt=="string"?n.prompt.slice(0,2e3):"";if(!r.trim())return e.json({memories:[]});let o=Number(n.limit),s=Math.min(Math.max(Number.isFinite(o)?o:10,1),50),i=.035,a=Number(n.minRank),c=Number.isFinite(a)?Math.min(Math.max(a,0),1):i,l=Array.isArray(n.excludeIds)?n.excludeIds.filter(w=>typeof w=="string").slice(0,500):[],p=typeof n.projectId=="string"?n.projectId:void 0,m=typeof n.projectPath=="string"?n.projectPath:void 0,y=p??await lh(m??null),v=p||m?y?sn`(m.project_id = ${y} or m.project_id is null)`:sn`m.project_id is null`:sn`true`,h=l.length?sn`and m.id not in (${sn.join(l.map(w=>sn`${w}::uuid`),sn`, `)})`:sn``,f=await u.execute(sn`
|
|
1076
1081
|
with raw as (
|
|
1077
1082
|
select websearch_to_tsquery('english', ${r})::text as t
|
|
1078
1083
|
), q as (
|
|
@@ -1103,7 +1108,7 @@ ${r}`).digest("hex")}d(Z0,"recommendationEntryHash");var tM=new Set(["42883","42
|
|
|
1103
1108
|
else 2 end,
|
|
1104
1109
|
m.updated_at desc
|
|
1105
1110
|
limit ${s}
|
|
1106
|
-
`);return e.json({memories:[...f]})});mn.get("/memories/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(F).where(Ln(Ze(F.id,n),Ze(F.userId,t))).limit(1);return r?e.json(r):e.json({error:"not found"},404)});mn.post("/memories",async e=>{let t=e.get("userId"),n=nL.safeParse(await e.req.json().catch(()=>({})));if(!n.success)return e.json({error:"invalid body",details:n.error.flatten()},400);let{kind:r,title:o,body:s,projectId:i,projectPath:a,source:c}=n.data,l=i??await ah(a??null),[p]=await u.select({orgId:T.activeOrgId}).from(T).where(Ze(T.id,t)).limit(1),[m]=await u.insert(F).values({userId:t,orgId:p?.orgId??null,projectId:l,kind:r,title:o,body:s,source:c??"manual",status:"active"}).returning();return e.json(m,201)});mn.patch("/memories/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=rL.safeParse(await e.req.json().catch(()=>({})));if(!r.success)return e.json({error:"invalid body",details:r.error.flatten()},400);let[o]=await u.select().from(F).where(Ln(Ze(F.id,n),Ze(F.userId,t))).limit(1);if(!o)return e.json({error:"not found"},404);let{kind:s,title:i,body:a,status:c}=r.data,l=s!==void 0&&s!==o.kind||i!==void 0&&i!==o.title||a!==void 0&&a!==o.body,[p]=await u.update(F).set({kind:s??o.kind,title:i??o.title,body:a??o.body,status:c??o.status,version:l?o.version+1:o.version,updatedAt:new Date}).where(Ln(Ze(F.id,n),Ze(F.userId,t))).returning();return e.json(p)});mn.delete("/memories/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.update(F).set({status:"archived",updatedAt:new Date}).where(Ln(Ze(F.id,n),Ze(F.userId,t))).returning({id:F.id,status:F.status});return r?e.json({ok:!0,id:r.id,status:r.status}):e.json({error:"not found"},404)});var oL=st.object({externalSessionId:st.string().min(1),projectPath:st.string().optional()});mn.post("/memories/:id/exposures",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=oL.safeParse(await e.req.json().catch(()=>({})));if(!r.success)return e.json({error:"invalid body",details:r.error.flatten()},400);let[o]=await u.select({id:F.id,version:F.version,projectId:F.projectId}).from(F).where(Ln(Ze(F.id,n),Ze(F.userId,t))).limit(1);return o?(await u.insert($d).values({userId:t,externalSessionId:r.data.externalSessionId,treatmentType:"memory",treatmentId:o.id,treatmentVersion:o.version,method:"injected",projectId:o.projectId}).onConflictDoNothing(),e.json({ok:!0})):e.json({error:"not found"},404)});var sL=st.object({taskPrompt:st.string().min(1).max(8e3),expectations:st.array(st.string().min(1)).min(1).max(20),trials:st.number().int().min(1).max(50).default(10),model:st.string().min(1).max(100).optional()});mn.post("/memories/:id/experiments",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=sL.safeParse(await e.req.json().catch(()=>({})));if(!r.success)return e.json({error:"invalid body",details:r.error.flatten()},400);let[o]=await u.select({id:F.id,version:F.version}).from(F).where(Ln(Ze(F.id,n),Ze(F.userId,t))).limit(1);if(!o)return e.json({error:"not found"},404);let[s]=await u.insert(Nt).values({memoryId:o.id,userId:t,memoryVersion:o.version,taskPrompt:r.data.taskPrompt,expectations:r.data.expectations,trials:r.data.trials,model:r.data.model??null,status:"pending"}).returning(),{noLiveWorker:i}=await MI({experimentId:s.id,userId:t});return e.json({experiment:s,noLiveWorker:i},201)});mn.get("/memories/:id/experiments",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:F.id}).from(F).where(Ln(Ze(F.id,n),Ze(F.userId,t))).limit(1);if(!r)return e.json({error:"not found"},404);let o=await u.select().from(Nt).where(Ln(Ze(Nt.memoryId,n),Ze(Nt.userId,t))).orderBy(Wl(Nt.createdAt)).limit(20);return e.json({experiments:o})});mn.get("/memory-experiments/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(Nt).where(Ln(Ze(Nt.id,n),Ze(Nt.userId,t))).limit(1);return r?e.json(r):e.json({error:"not found"},404)});var iL=st.object({status:st.enum(["running","completed","failed"]),error:st.string().max(1e3).nullable().optional(),result:st.record(st.unknown()).optional()});mn.patch("/memory-experiments/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=iL.safeParse(await e.req.json().catch(()=>({})));if(!r.success)return e.json({error:"invalid body",details:r.error.flatten()},400);let{status:o,error:s,result:i}=r.data,[a]=await u.select({id:Nt.id,status:Nt.status}).from(Nt).where(Ln(Ze(Nt.id,n),Ze(Nt.userId,t))).limit(1);if(!a)return e.json({error:"not found"},404);if(a.status==="completed"||a.status==="failed")return e.json({error:`experiment is already terminal (status='${a.status}')`,code:"INVALID_STATE"},409);let c=o==="completed"||o==="failed",[l]=await u.update(Nt).set({status:o,...s!==void 0?{error:s}:{},...i!==void 0?{result:i}:{},...o==="running"?{startedAt:new Date}:{},...c?{completedAt:new Date}:{}}).where(Ln(Ze(Nt.id,n),Ze(Nt.userId,t))).returning();return e.json(l)});O();import{randomBytes as aL,createHash as cL}from"node:crypto";import{Hono as dL}from"hono";import{z as _S}from"zod";import{eq as zl,and as uL,isNull as lL}from"drizzle-orm";var Qi=new dL;function pL(){let n=`rm_${aL(32).toString("base64url")}`,r=cL("sha256").update(n).digest("hex"),o=n.slice(0,11);return{plaintext:n,hash:r,prefix:o}}d(pL,"generateApiKey");var mL=_S.object({name:_S.string().min(1).max(100)});Qi.post("/auth/api-keys",async e=>{let t=e.get("userId"),n=await e.req.json(),r=mL.parse(n),{plaintext:o,hash:s,prefix:i}=pL(),[a]=await u.insert(Ae).values({userId:t,name:r.name,keyHash:s,keyPrefix:i}).returning();return e.json({id:a.id,name:a.name,key:o,keyPrefix:i,createdAt:a.createdAt},201)});Qi.get("/auth/api-keys",async e=>{let t=e.get("userId"),n=await u.select({id:Ae.id,name:Ae.name,keyPrefix:Ae.keyPrefix,lastUsedAt:Ae.lastUsedAt,expiresAt:Ae.expiresAt,revokedAt:Ae.revokedAt,createdAt:Ae.createdAt}).from(Ae).where(zl(Ae.userId,t)).orderBy(Ae.createdAt);return e.json(n)});Qi.delete("/auth/api-keys/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:Ae.id}).from(Ae).where(uL(zl(Ae.id,n),zl(Ae.userId,t),lL(Ae.revokedAt)));return r?(await u.update(Ae).set({revokedAt:new Date}).where(zl(Ae.id,n)),e.json({revoked:!0})):e.json({error:"API key not found"},404)});O();import{Hono as fL}from"hono";import{z as zr}from"zod";import{eq as Et,and as Vr,isNull as gL,sql as ch}from"drizzle-orm";import{randomUUID as dh}from"node:crypto";var Jr=new fL;Jr.post("/eval-targets/:id/conversations",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:k.id}).from(k).where(Vr(Et(k.id,n),Et(k.userId,t)));if(!r)return e.json({error:"Target not found"},404);let[o]=await u.select().from($e).where(Vr(Et($e.evalTargetId,n),Et($e.userId,t),Et($e.status,"active")));if(o)return e.json(o);let[s]=await u.insert($e).values({evalTargetId:n,userId:t}).returning();return e.json(s,201)});Jr.get("/eval-targets/:id/conversations",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from($e).where(Vr(Et($e.evalTargetId,n),Et($e.userId,t),Et($e.status,"active")));return r?e.json(r):e.json(null)});var hL=zr.object({content:zr.string().min(1).max(5e3)});Jr.post("/eval-conversations/:id/messages",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=hL.parse(await e.req.json()),[o]=await u.select().from($e).where(Vr(Et($e.id,n),Et($e.userId,t)));if(!o)return e.json({error:"Conversation not found"},404);let s=dh(),i={id:s,role:"user",content:r.content,createdAt:new Date().toISOString()};await u.update($e).set({messages:ch`${$e.messages} || ${JSON.stringify([i])}::jsonb`,updatedAt:new Date}).where(Et($e.id,n));let a={type:"conversation",conversationId:n,messageId:s,messageContent:r.content},{id:c,noLiveWorker:l}=await Rt({taskName:"process_conversation",payload:{evalTargetId:o.evalTargetId,config:a},userId:t,mirror:{userId:t,evalTargetId:o.evalTargetId,config:a}});return e.json({message:i,jobId:c,noLiveWorker:l},201)});var _L=zr.object({content:zr.string(),type:zr.enum(["text","status","results","proposal","applied","generated","comparison"]).default("text"),data:zr.record(zr.unknown()).optional()});Jr.post("/eval-conversations/:id/messages/assistant",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=_L.parse(await e.req.json()),o={id:dh(),role:"assistant",content:r.content,type:r.type,data:r.data,createdAt:new Date().toISOString()};return await u.update($e).set({messages:ch`${$e.messages} || ${JSON.stringify([o])}::jsonb`,updatedAt:new Date}).where(Vr(Et($e.id,n),Et($e.userId,t))),e.json(o,201)});Jr.get("/eval-conversations/:id/messages",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=e.req.query("after"),[o]=await u.select().from($e).where(Vr(Et($e.id,n),Et($e.userId,t)));if(!o)return e.json({error:"Conversation not found"},404);let s=o.messages;if(r){let i=s.filter(a=>a.createdAt>r);return e.json(i)}return e.json(s)});var yL=zr.object({messageId:zr.string().uuid()});Jr.post("/eval-conversations/:id/apply-proposal",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=yL.parse(await e.req.json()),[o]=await u.select().from($e).where(Vr(Et($e.id,n),Et($e.userId,t)));if(!o)return e.json({error:"Conversation not found"},404);let i=o.messages.find(m=>m.id===r.messageId&&m.type==="proposal");if(!i?.data?.proposedContent)return e.json({error:"Proposal message not found or has no content"},400);let[a]=await u.select().from(k).where(Vr(Et(k.id,o.evalTargetId),Et(k.userId,t)));if(!a)return e.json({error:"Target not found"},404);let[c]=await u.insert(k).values({userId:t,name:a.name,type:a.type,content:i.data.proposedContent,description:a.description,metadata:a.metadata,version:a.version+1,parentId:a.id}).returning(),l=await u.select().from(Se).where(Vr(Et(Se.evalTargetId,a.id),gL(Se.retiredAt)));l.length>0&&await u.insert(Se).values(l.map(m=>({evalTargetId:c.id,name:m.name,prompt:m.prompt,expectedOutput:m.expectedOutput,files:m.files,expectations:m.expectations})));let p={id:dh(),role:"assistant",content:`Applied changes \u2014 created v${c.version}`,type:"applied",data:{newVersion:c.version,evalTargetId:c.id},createdAt:new Date().toISOString()};return await u.update($e).set({evalTargetId:c.id,messages:ch`${$e.messages} || ${JSON.stringify([p])}::jsonb`,updatedAt:new Date}).where(Et($e.id,n)),e.json({newTarget:c,message:p})});O();import*as Zi from"node:fs";import*as Ps from"node:path";import{createHash as wL}from"node:crypto";import{fileURLToPath as vL}from"node:url";import{createRequire as IL}from"node:module";import{Hono as bL}from"hono";import{z as vt}from"zod";import{eq as Ns,desc as SL,and as AL,sql as EL}from"drizzle-orm";var xL=Ps.dirname(vL(import.meta.url)),Do=new bL,Vl=null,Jl=null;function TL(){let e=process.env.RULEMETRIC_SKILLS_REGISTRY_PATH;if(e&&Zi.existsSync(e))return e;try{let n=IL(import.meta.url),r=Ps.dirname(n.resolve("@rulemetric/skills-registry/package.json")),o=Ps.join(r,"registry.json");if(Zi.existsSync(o))return o}catch{}let t=Ps.resolve(xL,"../../../../packages/skills-registry/registry.json");return Zi.existsSync(t)?t:null}d(TL,"resolveRegistryPath");function yS(){if(Vl)return Vl;let e=TL();return e?(Vl=JSON.parse(Zi.readFileSync(e,"utf-8")),Vl):null}d(yS,"loadRegistry");function RL(){if(Jl)return Jl;let e=yS();return e?(Jl={version:e.version,generatedAt:e.generatedAt,skills:e.skills.map(({content:t,...n})=>n)},Jl):null}d(RL,"loadRegistryIndex");Do.get("/skills",e=>{let t=RL();return t?e.json(t):e.json({error:"Skills registry not found"},404)});Do.post("/skills/publish",async e=>{let t=e.get("userId"),n=await e.req.json();if(!n.id||!n.name||!n.content)return e.json({error:"Missing required fields: id, name, content"},400);if(n.content.trim().length<20)return e.json({error:"Content too short (minimum 20 characters)"},400);let[r]=await u.insert(ao).values({skillId:n.id,name:n.name,description:n.description,category:n.category,tools:n.tools,tags:n.tags,content:n.content,submittedBy:t}).returning({id:ao.id});return e.json({id:r.id,skillId:n.id,message:`Skill "${n.name}" submitted for review. It will appear in the registry after approval.`},201)});Do.get("/skills/submissions/approved",async e=>{let n=(await u.select().from(ao).where(Ns(ao.status,"approved")).orderBy(SL(ao.createdAt))).map(r=>({id:r.skillId,name:r.name,description:r.description,category:r.category,tags:r.tags??[],tools:r.tools,source:{repo:"community",path:`published/${r.skillId}.md`,url:"",license:"MIT"},content:r.content,popularity:{installs:0},updatedAt:r.updatedAt?.toISOString()??new Date().toISOString()}));return e.json(n)});var wS=vt.object({id:vt.string().min(1),name:vt.string().min(1),description:vt.string(),content:vt.string().min(1),source:vt.object({repo:vt.string(),path:vt.string(),url:vt.string(),license:vt.string().optional()}),tags:vt.array(vt.string()).optional(),category:vt.string().optional(),updatedAt:vt.string().optional(),sourceUpdatedAt:vt.string().optional(),popularity:vt.object({stars:vt.number().int().nonnegative().optional(),installs:vt.number().int().nonnegative().optional()}).optional()}),Use=vt.object({skills:vt.array(wS).max(5e3)});Do.post("/skills/sync-public",async e=>{let t=process.env.RULEMETRIC_REGISTRY_BOT_TOKEN;if(!t)return e.json({error:"Registry bot token not configured"},503);let n=e.req.header("authorization")??"";if((n.startsWith("Bearer ")?n.slice(7):"")!==t)return e.json({error:"Invalid bot token"},401);let o=await e.req.json(),s=vt.object({skills:vt.array(vt.unknown()).max(5e3)}).safeParse(o);if(!s.success)return e.json({error:"Invalid request body",issues:s.error.issues},400);let i=s.data.skills,a=0,c=0,l=0,p=0,m=0;for(let y of i){let v=wS.safeParse(y);if(!v.success){console.warn("[sync-public] Skipping invalid skill entry:",JSON.stringify(v.error.issues)),m++;continue}let h=v.data,f=wL("sha256").update(h.content).digest("hex"),w=`public_skill::${h.source.repo}::${h.id}`,b=h.updatedAt??"1.0.0",[I]=await u.select({id:g.id,contentHash:g.contentHash,popularityScore:g.popularityScore,sourceUpdatedAt:g.sourceUpdatedAt}).from(g).where(AL(Ns(g.name,h.id),Ns(g.scope,"public"))),S=h.popularity&&Math.max(h.popularity.stars??0,h.popularity.installs??0)||null,A=h.sourceUpdatedAt?new Date(h.sourceUpdatedAt):null,E=A&&!Number.isNaN(A.getTime())?A:null;if(I)if(I.contentHash!==f){let D=!1;for(let j=0;j<=4;j++)try{await u.transaction(async P=>{await P.select({id:g.id}).from(g).where(Ns(g.id,I.id)).for("update"),await P.update(g).set({description:h.description||h.name,content:h.content,contentHash:f,version:b,upstreamVersion:b,popularityScore:S,sourceUpdatedAt:E,frontmatter:{name:h.name,source:h.source,category:h.category??null,popularity:h.popularity??null},updatedAt:new Date}).where(Ns(g.id,I.id));let[$]=await P.select({max:EL`coalesce(max(${Ie.versionNumber}), 0)`}).from(Ie).where(Ns(Ie.instructionId,I.id));await P.insert(Ie).values({instructionId:I.id,versionNumber:($?.max??0)+1,content:h.content,frontmatter:{name:h.name,source:h.source,category:h.category??null},changeSummary:`Synced from registry (${b})`})}),D=!0;break}catch(P){if(P.cause?.code==="23505"){if(j<4)continue;break}throw P}if(!D)continue;c++,p++}else{let R=I.sourceUpdatedAt?.getTime()??null,D=E?.getTime()??null,j=I.popularityScore!==S,P=E!==null&&R!==D;(j||P)&&await u.update(g).set({...j?{popularityScore:S}:{},...P?{sourceUpdatedAt:E}:{}}).where(Ns(g.id,I.id)),l++}else{let[R]=await u.insert(g).values({name:h.id,description:h.description||h.name,type:"skill",scope:"public",scopeRef:null,version:b,content:h.content,frontmatter:{name:h.name,source:h.source,category:h.category??null,popularity:h.popularity??null},tags:h.tags??null,contentHash:f,contextIdentity:w,upstreamVersion:b,popularityScore:S,sourceUpdatedAt:E}).returning({id:g.id});R&&(a++,await u.insert(Ie).values({instructionId:R.id,versionNumber:1,content:h.content,frontmatter:{name:h.name,source:h.source,category:h.category??null},changeSummary:"Initial sync from public registry"}),p++)}}return e.json({inserted:a,updated:c,unchanged:l,versionsCreated:p,skipped:m})});Do.get("/skills/:id",e=>{let t=yS();if(!t?.skills)return e.json({error:"Skills registry not found"},404);let n=t.skills.find(r=>r.id===e.req.param("id"));return n?e.json(n):e.json({error:"Skill not found"},404)});O();import{Hono as UL}from"hono";import{desc as HL,eq as BL}from"drizzle-orm";O();import{eq as IS,and as $L}from"drizzle-orm";O();var kL=/pricing|rate.?limit|rate.?cap|messages.?per|tokens.?per|RPM|TPM|TPD|cache.?write|cache.?read|context.?window|5.?hour|five.?hour|7.?day|seven.?day|weekly.?limit/i,jL="claude-haiku-4-5-20251001",NL=1e3,PL=.7,CL=`You extract pricing and rate-limit changes from AI provider release notes.
|
|
1111
|
+
`);return e.json({memories:[...f]})});mn.get("/memories/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(F).where($n(Ze(F.id,n),Ze(F.userId,t))).limit(1);return r?e.json(r):e.json({error:"not found"},404)});mn.post("/memories",async e=>{let t=e.get("userId"),n=cL.safeParse(await e.req.json().catch(()=>({})));if(!n.success)return e.json({error:"invalid body",details:n.error.flatten()},400);let{kind:r,title:o,body:s,projectId:i,projectPath:a,source:c}=n.data,l=i??await lh(a??null),[p]=await u.select({orgId:T.activeOrgId}).from(T).where(Ze(T.id,t)).limit(1),[m]=await u.insert(F).values({userId:t,orgId:p?.orgId??null,projectId:l,kind:r,title:o,body:s,source:c??"manual",status:"active"}).returning();return e.json(m,201)});mn.patch("/memories/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=dL.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($n(Ze(F.id,n),Ze(F.userId,t))).limit(1);if(!o)return e.json({error:"not found"},404);let{kind:s,title:i,body:a,status:c}=r.data,l=s!==void 0&&s!==o.kind||i!==void 0&&i!==o.title||a!==void 0&&a!==o.body,[p]=await u.update(F).set({kind:s??o.kind,title:i??o.title,body:a??o.body,status:c??o.status,version:l?o.version+1:o.version,updatedAt:new Date}).where($n(Ze(F.id,n),Ze(F.userId,t))).returning();return e.json(p)});mn.delete("/memories/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.update(F).set({status:"archived",updatedAt:new Date}).where($n(Ze(F.id,n),Ze(F.userId,t))).returning({id:F.id,status:F.status});return r?e.json({ok:!0,id:r.id,status:r.status}):e.json({error:"not found"},404)});var uL=st.object({externalSessionId:st.string().min(1),projectPath:st.string().optional()});mn.post("/memories/:id/exposures",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=uL.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($n(Ze(F.id,n),Ze(F.userId,t))).limit(1);return o?(await u.insert(Hd).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 lL=st.object({taskPrompt:st.string().min(1).max(8e3),expectations:st.array(st.string().min(1)).min(1).max(20),trials:st.number().int().min(1).max(50).default(10),model:st.string().min(1).max(100).optional()});mn.post("/memories/:id/experiments",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=lL.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($n(Ze(F.id,n),Ze(F.userId,t))).limit(1);if(!o)return e.json({error:"not found"},404);let[s]=await u.insert(Nt).values({memoryId:o.id,userId:t,memoryVersion:o.version,taskPrompt:r.data.taskPrompt,expectations:r.data.expectations,trials:r.data.trials,model:r.data.model??null,status:"pending"}).returning(),{noLiveWorker:i}=await UI({experimentId:s.id,userId:t});return e.json({experiment:s,noLiveWorker:i},201)});mn.get("/memories/:id/experiments",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:F.id}).from(F).where($n(Ze(F.id,n),Ze(F.userId,t))).limit(1);if(!r)return e.json({error:"not found"},404);let o=await u.select().from(Nt).where($n(Ze(Nt.memoryId,n),Ze(Nt.userId,t))).orderBy(Gl(Nt.createdAt)).limit(20);return e.json({experiments:o})});mn.get("/memory-experiments/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(Nt).where($n(Ze(Nt.id,n),Ze(Nt.userId,t))).limit(1);return r?e.json(r):e.json({error:"not found"},404)});var pL=st.object({status:st.enum(["running","completed","failed"]),error:st.string().max(1e3).nullable().optional(),result:st.record(st.unknown()).optional()});mn.patch("/memory-experiments/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=pL.safeParse(await e.req.json().catch(()=>({})));if(!r.success)return e.json({error:"invalid body",details:r.error.flatten()},400);let{status:o,error:s,result:i}=r.data,[a]=await u.select({id:Nt.id,status:Nt.status}).from(Nt).where($n(Ze(Nt.id,n),Ze(Nt.userId,t))).limit(1);if(!a)return e.json({error:"not found"},404);if(a.status==="completed"||a.status==="failed")return e.json({error:`experiment is already terminal (status='${a.status}')`,code:"INVALID_STATE"},409);let c=o==="completed"||o==="failed",[l]=await u.update(Nt).set({status:o,...s!==void 0?{error:s}:{},...i!==void 0?{result:i}:{},...o==="running"?{startedAt:new Date}:{},...c?{completedAt:new Date}:{}}).where($n(Ze(Nt.id,n),Ze(Nt.userId,t))).returning();return e.json(l)});D();import{randomBytes as mL,createHash as fL}from"node:crypto";import{Hono as gL}from"hono";import{z as vS}from"zod";import{eq as Kl,and as hL,isNull as _L}from"drizzle-orm";var Qi=new gL;function yL(){let n=`rm_${mL(32).toString("base64url")}`,r=fL("sha256").update(n).digest("hex"),o=n.slice(0,11);return{plaintext:n,hash:r,prefix:o}}d(yL,"generateApiKey");var wL=vS.object({name:vS.string().min(1).max(100)});Qi.post("/auth/api-keys",async e=>{let t=e.get("userId"),n=await e.req.json(),r=wL.parse(n),{plaintext:o,hash:s,prefix:i}=yL(),[a]=await u.insert(Ae).values({userId:t,name:r.name,keyHash:s,keyPrefix:i}).returning();return e.json({id:a.id,name:a.name,key:o,keyPrefix:i,createdAt:a.createdAt},201)});Qi.get("/auth/api-keys",async e=>{let t=e.get("userId"),n=await u.select({id:Ae.id,name:Ae.name,keyPrefix:Ae.keyPrefix,lastUsedAt:Ae.lastUsedAt,expiresAt:Ae.expiresAt,revokedAt:Ae.revokedAt,createdAt:Ae.createdAt}).from(Ae).where(Kl(Ae.userId,t)).orderBy(Ae.createdAt);return e.json(n)});Qi.delete("/auth/api-keys/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:Ae.id}).from(Ae).where(hL(Kl(Ae.id,n),Kl(Ae.userId,t),_L(Ae.revokedAt)));return r?(await u.update(Ae).set({revokedAt:new Date}).where(Kl(Ae.id,n)),e.json({revoked:!0})):e.json({error:"API key not found"},404)});D();import{Hono as vL}from"hono";import{z as zr}from"zod";import{eq as Et,and as Vr,isNull as IL,sql as ph}from"drizzle-orm";import{randomUUID as mh}from"node:crypto";var Jr=new vL;Jr.post("/eval-targets/:id/conversations",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:k.id}).from(k).where(Vr(Et(k.id,n),Et(k.userId,t)));if(!r)return e.json({error:"Target not found"},404);let[o]=await u.select().from($e).where(Vr(Et($e.evalTargetId,n),Et($e.userId,t),Et($e.status,"active")));if(o)return e.json(o);let[s]=await u.insert($e).values({evalTargetId:n,userId:t}).returning();return e.json(s,201)});Jr.get("/eval-targets/:id/conversations",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from($e).where(Vr(Et($e.evalTargetId,n),Et($e.userId,t),Et($e.status,"active")));return r?e.json(r):e.json(null)});var bL=zr.object({content:zr.string().min(1).max(5e3)});Jr.post("/eval-conversations/:id/messages",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=bL.parse(await e.req.json()),[o]=await u.select().from($e).where(Vr(Et($e.id,n),Et($e.userId,t)));if(!o)return e.json({error:"Conversation not found"},404);let s=mh(),i={id:s,role:"user",content:r.content,createdAt:new Date().toISOString()};await u.update($e).set({messages:ph`${$e.messages} || ${JSON.stringify([i])}::jsonb`,updatedAt:new Date}).where(Et($e.id,n));let a={type:"conversation",conversationId:n,messageId:s,messageContent:r.content},{id:c,noLiveWorker:l}=await Rt({taskName:"process_conversation",payload:{evalTargetId:o.evalTargetId,config:a},userId:t,mirror:{userId:t,evalTargetId:o.evalTargetId,config:a}});return e.json({message:i,jobId:c,noLiveWorker:l},201)});var SL=zr.object({content:zr.string(),type:zr.enum(["text","status","results","proposal","applied","generated","comparison"]).default("text"),data:zr.record(zr.unknown()).optional()});Jr.post("/eval-conversations/:id/messages/assistant",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=SL.parse(await e.req.json()),o={id:mh(),role:"assistant",content:r.content,type:r.type,data:r.data,createdAt:new Date().toISOString()};return await u.update($e).set({messages:ph`${$e.messages} || ${JSON.stringify([o])}::jsonb`,updatedAt:new Date}).where(Vr(Et($e.id,n),Et($e.userId,t))),e.json(o,201)});Jr.get("/eval-conversations/:id/messages",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=e.req.query("after"),[o]=await u.select().from($e).where(Vr(Et($e.id,n),Et($e.userId,t)));if(!o)return e.json({error:"Conversation not found"},404);let s=o.messages;if(r){let i=s.filter(a=>a.createdAt>r);return e.json(i)}return e.json(s)});var AL=zr.object({messageId:zr.string().uuid()});Jr.post("/eval-conversations/:id/apply-proposal",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=AL.parse(await e.req.json()),[o]=await u.select().from($e).where(Vr(Et($e.id,n),Et($e.userId,t)));if(!o)return e.json({error:"Conversation not found"},404);let i=o.messages.find(m=>m.id===r.messageId&&m.type==="proposal");if(!i?.data?.proposedContent)return e.json({error:"Proposal message not found or has no content"},400);let[a]=await u.select().from(k).where(Vr(Et(k.id,o.evalTargetId),Et(k.userId,t)));if(!a)return e.json({error:"Target not found"},404);let[c]=await u.insert(k).values({userId:t,name:a.name,type:a.type,content:i.data.proposedContent,description:a.description,metadata:a.metadata,version:a.version+1,parentId:a.id}).returning(),l=await u.select().from(Se).where(Vr(Et(Se.evalTargetId,a.id),IL(Se.retiredAt)));l.length>0&&await u.insert(Se).values(l.map(m=>({evalTargetId:c.id,name:m.name,prompt:m.prompt,expectedOutput:m.expectedOutput,files:m.files,expectations:m.expectations})));let p={id:mh(),role:"assistant",content:`Applied changes \u2014 created v${c.version}`,type:"applied",data:{newVersion:c.version,evalTargetId:c.id},createdAt:new Date().toISOString()};return await u.update($e).set({evalTargetId:c.id,messages:ph`${$e.messages} || ${JSON.stringify([p])}::jsonb`,updatedAt:new Date}).where(Et($e.id,n)),e.json({newTarget:c,message:p})});D();import*as Zi from"node:fs";import*as Ps from"node:path";import{createHash as EL}from"node:crypto";import{fileURLToPath as xL}from"node:url";import{createRequire as TL}from"node:module";import{Hono as RL}from"hono";import{z as vt}from"zod";import{eq as Ns,desc as kL,and as jL,sql as NL}from"drizzle-orm";var PL=Ps.dirname(xL(import.meta.url)),Oo=new RL,Yl=null,Xl=null;function CL(){let e=process.env.RULEMETRIC_SKILLS_REGISTRY_PATH;if(e&&Zi.existsSync(e))return e;try{let n=TL(import.meta.url),r=Ps.dirname(n.resolve("@rulemetric/skills-registry/package.json")),o=Ps.join(r,"registry.json");if(Zi.existsSync(o))return o}catch{}let t=Ps.resolve(PL,"../../../../packages/skills-registry/registry.json");return Zi.existsSync(t)?t:null}d(CL,"resolveRegistryPath");function IS(){if(Yl)return Yl;let e=CL();return e?(Yl=JSON.parse(Zi.readFileSync(e,"utf-8")),Yl):null}d(IS,"loadRegistry");function DL(){if(Xl)return Xl;let e=IS();return e?(Xl={version:e.version,generatedAt:e.generatedAt,skills:e.skills.map(({content:t,...n})=>n)},Xl):null}d(DL,"loadRegistryIndex");Oo.get("/skills",e=>{let t=DL();return t?e.json(t):e.json({error:"Skills registry not found"},404)});Oo.post("/skills/publish",async e=>{let t=e.get("userId"),n=await e.req.json();if(!n.id||!n.name||!n.content)return e.json({error:"Missing required fields: id, name, content"},400);if(n.content.trim().length<20)return e.json({error:"Content too short (minimum 20 characters)"},400);let[r]=await u.insert(ao).values({skillId:n.id,name:n.name,description:n.description,category:n.category,tools:n.tools,tags:n.tags,content:n.content,submittedBy:t}).returning({id:ao.id});return e.json({id:r.id,skillId:n.id,message:`Skill "${n.name}" submitted for review. It will appear in the registry after approval.`},201)});Oo.get("/skills/submissions/approved",async e=>{let n=(await u.select().from(ao).where(Ns(ao.status,"approved")).orderBy(kL(ao.createdAt))).map(r=>({id:r.skillId,name:r.name,description:r.description,category:r.category,tags:r.tags??[],tools:r.tools,source:{repo:"community",path:`published/${r.skillId}.md`,url:"",license:"MIT"},content:r.content,popularity:{installs:0},updatedAt:r.updatedAt?.toISOString()??new Date().toISOString()}));return e.json(n)});var bS=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()}),die=vt.object({skills:vt.array(bS).max(5e3)});Oo.post("/skills/sync-public",async e=>{let t=process.env.RULEMETRIC_REGISTRY_BOT_TOKEN;if(!t)return e.json({error:"Registry bot token not configured"},503);let n=e.req.header("authorization")??"";if((n.startsWith("Bearer ")?n.slice(7):"")!==t)return e.json({error:"Invalid bot token"},401);let o=await e.req.json(),s=vt.object({skills:vt.array(vt.unknown()).max(5e3)}).safeParse(o);if(!s.success)return e.json({error:"Invalid request body",issues:s.error.issues},400);let i=s.data.skills,a=0,c=0,l=0,p=0,m=0;for(let y of i){let v=bS.safeParse(y);if(!v.success){console.warn("[sync-public] Skipping invalid skill entry:",JSON.stringify(v.error.issues)),m++;continue}let h=v.data,f=EL("sha256").update(h.content).digest("hex"),w=`public_skill::${h.source.repo}::${h.id}`,b=h.updatedAt??"1.0.0",[I]=await u.select({id:g.id,contentHash:g.contentHash,popularityScore:g.popularityScore,sourceUpdatedAt:g.sourceUpdatedAt}).from(g).where(jL(Ns(g.name,h.id),Ns(g.scope,"public"))),S=h.popularity&&Math.max(h.popularity.stars??0,h.popularity.installs??0)||null,A=h.sourceUpdatedAt?new Date(h.sourceUpdatedAt):null,E=A&&!Number.isNaN(A.getTime())?A:null;if(I)if(I.contentHash!==f){let O=!1;for(let j=0;j<=4;j++)try{await u.transaction(async P=>{await P.select({id:g.id}).from(g).where(Ns(g.id,I.id)).for("update"),await P.update(g).set({description:h.description||h.name,content:h.content,contentHash:f,version:b,upstreamVersion:b,popularityScore:S,sourceUpdatedAt:E,frontmatter:{name:h.name,source:h.source,category:h.category??null,popularity:h.popularity??null},updatedAt:new Date}).where(Ns(g.id,I.id));let[$]=await P.select({max:NL`coalesce(max(${Ie.versionNumber}), 0)`}).from(Ie).where(Ns(Ie.instructionId,I.id));await P.insert(Ie).values({instructionId:I.id,versionNumber:($?.max??0)+1,content:h.content,frontmatter:{name:h.name,source:h.source,category:h.category??null},changeSummary:`Synced from registry (${b})`})}),O=!0;break}catch(P){if(P.cause?.code==="23505"){if(j<4)continue;break}throw P}if(!O)continue;c++,p++}else{let R=I.sourceUpdatedAt?.getTime()??null,O=E?.getTime()??null,j=I.popularityScore!==S,P=E!==null&&R!==O;(j||P)&&await u.update(g).set({...j?{popularityScore:S}:{},...P?{sourceUpdatedAt:E}:{}}).where(Ns(g.id,I.id)),l++}else{let[R]=await u.insert(g).values({name:h.id,description:h.description||h.name,type:"skill",scope:"public",scopeRef:null,version:b,content:h.content,frontmatter:{name:h.name,source:h.source,category:h.category??null,popularity:h.popularity??null},tags:h.tags??null,contentHash:f,contextIdentity:w,upstreamVersion:b,popularityScore:S,sourceUpdatedAt:E}).returning({id:g.id});R&&(a++,await u.insert(Ie).values({instructionId:R.id,versionNumber:1,content:h.content,frontmatter:{name:h.name,source:h.source,category:h.category??null},changeSummary:"Initial sync from public registry"}),p++)}}return e.json({inserted:a,updated:c,unchanged:l,versionsCreated:p,skipped:m})});Oo.get("/skills/:id",e=>{let t=IS();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 VL}from"hono";import{desc as JL,eq as GL}from"drizzle-orm";D();import{eq as AS,and as WL}from"drizzle-orm";D();var OL=/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,ML="claude-haiku-4-5-20251001",LL=1e3,$L=.7,qL=`You extract pricing and rate-limit changes from AI provider release notes.
|
|
1107
1112
|
Return a JSON object: {
|
|
1108
1113
|
"observations": [
|
|
1109
1114
|
{
|
|
@@ -1118,43 +1123,43 @@ Return a JSON object: {
|
|
|
1118
1123
|
}
|
|
1119
1124
|
Only emit observations if the release notes EXPLICITLY state a numeric value.
|
|
1120
1125
|
Do NOT speculate. Do NOT emit observations for "increased by X%" without an absolute number.
|
|
1121
|
-
Return { "observations": [] } if nothing concrete.`;function
|
|
1126
|
+
Return { "observations": [] } if nothing concrete.`;function UL(){let e=process.env.ANTHROPIC_API_KEY;if(!e)return null;let t=uc("anthropic",e);return async n=>{let r=await t.complete(n,{model:ML,maxTokens:LL,temperature:0});return{text:r.text,usage:{inputTokens:r.usage?.inputTokens??0,outputTokens:r.usage?.outputTokens??0}}}}d(UL,"defaultLlm");async function HL(e){await u.insert(we).values({provider:"anthropic",plan:e.plan,limitType:e.limitType,value:String(e.value),unit:e.unit,comparator:e.comparator,sourceType:e.sourceType,sourceUrl:e.sourceUrl,sourceEvidence:e.sourceEvidence,confidence:String(e.confidence)})}d(HL,"defaultObserve");function BL(e){return`${qL}
|
|
1122
1127
|
|
|
1123
1128
|
Release notes (harness=${e.harness}, version=${e.version}):
|
|
1124
1129
|
|
|
1125
|
-
${e.body??""}`}d(
|
|
1126
|
-
`);for(let s of o){let i=s.trim();if(!i.startsWith("- ")&&!i.startsWith("* "))continue;let a=i.replace(/^[-*]\s+/,"").trim();if(!a)continue;let c=a.toLowerCase();c.startsWith("security:")||c.includes("security fix")||c.includes("cve-")?r.push(a):c.startsWith("fixed ")||c.startsWith("fix ")||c.startsWith("fixed:")?n.push(a):t.push(a)}return{features:t,fixes:n,security:r}}d(qL,"parseReleaseBody");async function Gl(e){let t=e?bS.filter(o=>o.harness===e):bS,n=0,r=0;for(let o of t){let s=`https://api.github.com/repos/${o.repo}/releases?per_page=100`,i={Accept:"application/vnd.github+json"};process.env.GITHUB_TOKEN&&(i.Authorization=`Bearer ${process.env.GITHUB_TOKEN}`);let a=await fetch(s,{headers:i});if(!a.ok)continue;let c=await a.json();r+=c.length;for(let l of c){let p=qL(l.body??"");if((await u.select({id:Pt.id}).from(Pt).where($L(IS(Pt.harness,o.harness),IS(Pt.version,l.tag_name)))).length===0){await u.insert(Pt).values({harness:o.harness,version:l.tag_name,publishedAt:new Date(l.published_at),title:l.name,body:l.body,categories:p,url:l.html_url}),n++;try{await vS({harness:o.harness,version:l.tag_name,url:l.html_url,publishedAt:new Date(l.published_at),body:l.body})}catch(y){console.warn("release notes extraction failed:",y)}}}}return{synced:n,total:r}}d(Gl,"syncHarnessReleases");var Qc=new UL;Qc.get("/harness-releases",async e=>{let t=e.req.query("harness"),n=Math.min(Number(e.req.query("limit")??50),100),r=t?BL(Pt.harness,t):void 0,o=await u.select({id:Pt.id,harness:Pt.harness,version:Pt.version,publishedAt:Pt.publishedAt,title:Pt.title,categories:Pt.categories,url:Pt.url}).from(Pt).where(r).orderBy(HL(Pt.publishedAt)).limit(n);return e.json(o)});Qc.post("/harness-releases/sync",async e=>{let t=await e.req.json().catch(()=>({})),n=await Gl(t.harness);return e.json(n)});O();import{Hono as FL}from"hono";import{and as Kl,desc as WL,eq as ea,isNull as uh,sql as zL}from"drizzle-orm";var ta=new FL;ta.get("/notifications",async e=>{let t=e.get("userId"),n=Math.min(parseInt(e.req.query("limit")??"20",10),100),r=parseInt(e.req.query("offset")??"0",10),s=e.req.query("unread")==="true"?Kl(ea(bt.userId,t),uh(bt.readAt)):ea(bt.userId,t),i=await u.select().from(bt).where(s).orderBy(WL(bt.createdAt)).limit(n).offset(r),[{count:a}]=await u.select({count:zL`count(*)::int`}).from(bt).where(Kl(ea(bt.userId,t),uh(bt.readAt)));return e.json({items:i,unreadCount:a})});ta.post("/notifications/:id/read",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await u.update(bt).set({readAt:new Date}).where(Kl(ea(bt.id,t),ea(bt.userId,n))).returning();return r?e.json(r):e.json({error:"Not found"},404)});ta.post("/notifications/read-all",async e=>{let t=e.get("userId");return await u.update(bt).set({readAt:new Date}).where(Kl(ea(bt.userId,t),uh(bt.readAt))),e.json({success:!0})});O();import{Hono as VL}from"hono";import{z as Zt}from"zod";import{eq as Ir,and as Yl,desc as JL,ne as GL}from"drizzle-orm";var Mo=new VL;function KL(e){let t=e.terminalTarget;if(!t||typeof t!="object")return null;let n=t;return n.kind!=="tmux"||typeof n.target!="string"||typeof n.attachCommand!="string"?null:{sessionId:typeof e.sessionId=="string"?e.sessionId:void 0,terminalTarget:{kind:"tmux",target:n.target,attachCommand:n.attachCommand,live:typeof n.live=="boolean"?n.live:void 0}}}d(KL,"parseTerminalTargetResult");async function YL(e){let t=KL(e.result);if(!t?.terminalTarget)return;let n=e.config&&typeof e.config=="object"?e.config:{},r=typeof n.projectPath=="string"?n.projectPath:null,o=typeof n.resumeSessionId=="string"?n.resumeSessionId:null,[s]=o?await u.select({id:_.id}).from(_).where(Yl(Ir(_.userId,e.userId),Ir(_.externalSessionId,o))).limit(1):[];await u.insert(Ve).values({userId:e.userId,sessionId:s?.id??null,externalSessionId:o,kind:"tmux",target:t.terminalTarget.target,status:t.terminalTarget.live===!1?"unknown":"active",attachCommand:t.terminalTarget.attachCommand,projectPath:r,metadata:{launchJobId:e.jobId,launcherSessionId:t.sessionId}}).onConflictDoUpdate({target:[Ve.userId,Ve.target],set:{sessionId:s?.id??null,externalSessionId:o,status:t.terminalTarget.live===!1?"unknown":"active",attachCommand:t.terminalTarget.attachCommand,projectPath:r,metadata:{launchJobId:e.jobId,launcherSessionId:t.sessionId},lastSeenAt:new Date,updatedAt:new Date}})}d(YL,"upsertTerminalTargetFromLaunchResult");var XL=Zt.object({tool:Zt.string().min(1),config:Zt.object({projectPath:Zt.string().min(1),prompt:Zt.string().optional(),systemPrompt:Zt.string().optional(),model:Zt.string().optional(),mode:Zt.enum(["headless","interactive"]).default("interactive"),timeout:Zt.number().int().positive().optional(),resumeSessionId:Zt.string().optional()})});Mo.post("/launch-jobs",async e=>{let t=e.get("userId"),n=await e.req.json(),r=XL.parse(n),{id:o,noLiveWorker:s}=await Rt({taskName:"process_launch",payload:{tool:r.tool,config:r.config},userId:t,mirror:{userId:t,tool:r.tool,config:r.config}}),[i]=await u.select().from(ce).where(Ir(ce.id,o));return e.json({...i,noLiveWorker:s},201)});Mo.get("/launch-jobs",async e=>{let t=e.get("userId"),n=Number(e.req.query("limit")??50),r=await u.select().from(ce).where(Ir(ce.userId,t)).orderBy(JL(ce.createdAt)).limit(n);return e.json(r)});var QL=Zt.object({status:Zt.enum(["running","completed","failed"]).optional(),attempts:Zt.number().int().nonnegative().optional(),error:Zt.string().optional(),result:Zt.record(Zt.unknown()).optional()});Mo.patch("/launch-jobs/:id/state",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=QL.parse(await e.req.json()),o={updatedAt:new Date};r.attempts!==void 0&&(o.attempts=r.attempts),r.status&&(o.status=r.status),r.error&&(o.error=r.error),r.result!==void 0&&(o.result=r.result),(r.status==="completed"||r.status==="failed")&&(o.completedAt=new Date);let[s]=await u.update(ce).set(o).where(Yl(Ir(ce.id,n),Ir(ce.userId,t),GL(ce.status,"cancelled"))).returning();if(!s){let[i]=await u.select().from(ce).where(Yl(Ir(ce.id,n),Ir(ce.userId,t)));return i?e.json(i):e.json({error:"Job not found"},404)}return r.result!==void 0&&await YL({userId:t,jobId:n,config:s.config,result:r.result}),e.json(s)});Mo.post("/launch-jobs/:id/cancel",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.update(ce).set({status:"cancelled",updatedAt:new Date}).where(Yl(Ir(ce.id,n),Ir(ce.userId,t))).returning();return r?e.json(r):e.json({error:"Job not found"},404)});Mo.get("/launchers",async e=>{let{getAvailableLaunchers:t}=await Promise.resolve().then(()=>(ml(),Zb));return e.json(t())});O();import{Hono as ZL}from"hono";import{z as $n}from"zod";import{eq as xe,and as Ut,desc as Ql,inArray as Xl,isNull as e$,ne as t$}from"drizzle-orm";ml();var br=new ZL,n$=$n.object({tool:$n.string().min(1),model:$n.string().optional(),label:$n.string().optional()}),r$=$n.object({title:$n.string().optional(),projectPath:$n.string().min(1),gitRemote:$n.string().optional(),baseBranch:$n.string().optional(),prompt:$n.string().optional(),autoWorktree:$n.boolean().optional(),sessions:$n.array(n$).min(1).max(8)});function o$(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/(^-|-$)/g,"")||"tool"}d(o$,"sanitizeTool");var s$=new Set(["pending","claimed","running"]);var i$=1800*1e3;function SS(e,t){if(e==="cancelled")return!0;if(e!=="completed"&&e!=="failed"||t==null)return!1;let n=t instanceof Date?t.getTime():Date.parse(t);return Number.isFinite(n)?Date.now()-n>i$:!1}d(SS,"canSkipRollup");function AS(e,t,n){if(e==="cancelled")return"cancelled";let r=t.length>0,o=t.some(a=>a.endedAt==null),s=n.some(a=>s$.has(a.status));return n.length>0&&n.every(a=>a.status==="failed")&&!r?"failed":o||s&&r?"running":r&&!o&&!s?"completed":"pending"}d(AS,"rollupRunStatus");async function ES(e){if(e.rolled===e.stored)return;let t=e.rolled==="completed"||e.rolled==="failed"||e.rolled==="cancelled",n={status:e.rolled,updatedAt:new Date};t&&!e.hadCompletedAt&&(n.completedAt=new Date);try{await u.update(X).set(n).where(Ut(xe(X.id,e.runId),xe(X.userId,e.userId),t$(X.status,"cancelled")))}catch{}}d(ES,"persistRolledUpStatus");function a$(e){return Array.isArray(e)?e.length:e&&typeof e=="object"?Object.values(e).reduce((t,n)=>t+(typeof n=="number"&&n>0?n:0),0):0}d(a$,"frictionCount");async function c$(e,t){if(!e||typeof e!="object")return null;let n=e,r="claude-sonnet-4-6",o=No(r),s={input_tokens:n.input_tokens??0,output_tokens:n.output_tokens??0,cache_read_input_tokens:n.cache_read_input_tokens??0,cache_creation_5m:n.cache_creation_5m??0,cache_creation_1h:n.cache_creation_1h??0,cache_creation_input_tokens:n.cache_creation_input_tokens??0},i=await Fr(u,s,r,t,o);return i?{...i,estimated:!0}:null}d(c$,"deriveSessionCost");async function xS(e,t){let[n]=await u.select({id:X.id,autoWorktree:X.autoWorktree}).from(X).where(Ut(xe(X.id,e),xe(X.userId,t))).limit(1);if(!n||!n.autoWorktree)return{linked:0};let r=await u.select({config:ce.config,result:ce.result}).from(ce).where(Ut(xe(ce.runId,e),xe(ce.userId,t))),o=new Set;for(let i of r){let a=i.result??{};typeof a.worktreePath=="string"&&a.worktreePath&&o.add(a.worktreePath);let c=i.config??{};c.worktree?.create&&typeof c.worktree.branch=="string"&&typeof c.projectPath=="string"&&o.add(pl({repoRoot:c.projectPath,branch:c.worktree.branch}))}return o.size===0?{linked:0}:{linked:(await u.update(_).set({runId:e}).where(Ut(xe(_.userId,t),e$(_.runId),Xl(_.projectPath,[...o]))).returning({id:_.id})).length}}d(xS,"linkRunSessions");br.post("/runs",async e=>{let t=e.get("userId"),n=await e.req.json(),r=r$.parse(n),o=await _o(t,null),s=r.autoWorktree??!0,i=r.baseBranch??"HEAD",a=null;if(r.projectPath){let[m]=await u.select({projectId:le.projectId}).from(le).where(xe(le.path,r.projectPath)).orderBy(Ql(le.lastSeen)).limit(1);a=m?.projectId??null}if(!a&&r.gitRemote){let[m]=await u.select({id:U.id}).from(U).where(xe(U.gitRemoteUrl,r.gitRemote)).limit(1);a=m?.id??null}let[c]=await u.insert(X).values({userId:t,orgId:o,projectPath:r.projectPath,projectId:a,gitRemote:r.gitRemote??null,baseBranch:r.baseBranch??null,title:r.title??null,prompt:r.prompt??null,toolSpec:r.sessions,autoWorktree:s,status:"pending",sessionCount:r.sessions.length}).returning(),l=c.id.slice(0,8),p=!1;try{for(let m=0;m<r.sessions.length;m++){let y=r.sessions[m],v=`rm/run-${l}/s${m}-${o$(y.tool)}`,h={projectPath:r.projectPath,prompt:r.prompt,systemPrompt:void 0,model:y.model,mode:"interactive",worktree:{create:s,branch:v,baseRef:i},runId:c.id},f=await Rt({taskName:"process_launch",userId:t,payload:{tool:y.tool,config:h},mirror:{userId:t,tool:y.tool,config:h},runId:c.id});p=p||f.noLiveWorker}}catch(m){return await u.update(X).set({status:"failed",updatedAt:new Date}).where(xe(X.id,c.id)),await u.update(ce).set({status:"cancelled",updatedAt:new Date}).where(Ut(xe(ce.runId,c.id),xe(ce.status,"pending"))),e.json({error:"Failed to enqueue all launch jobs",detail:m instanceof Error?m.message:String(m),run:{...c,status:"failed"}},500)}return e.json({run:c,noLiveWorker:p},201)});br.get("/runs",async e=>{let t=e.get("userId"),n=Number(e.req.query("limit")),r=Math.min(Math.max(Number.isFinite(n)?n:50,1),100),o=Number(e.req.query("offset")),s=Math.max(Number.isFinite(o)?o:0,0),i=e.req.query("projectId"),a=i?Ut(xe(X.userId,t),xe(X.projectId,i)):xe(X.userId,t),c=await u.select({id:X.id,userId:X.userId,orgId:X.orgId,projectId:X.projectId,projectPath:X.projectPath,gitRemote:X.gitRemote,baseBranch:X.baseBranch,title:X.title,toolSpec:X.toolSpec,autoWorktree:X.autoWorktree,status:X.status,sessionCount:X.sessionCount,createdAt:X.createdAt,updatedAt:X.updatedAt,completedAt:X.completedAt}).from(X).where(a).orderBy(Ql(X.createdAt)).limit(r).offset(s),l=c.filter(m=>!SS(m.status,m.completedAt)),p=l.map(m=>m.id);if(p.length>0){let[m,y]=await Promise.all([u.select({runId:_.runId,endedAt:_.endedAt}).from(_).where(Ut(xe(_.userId,t),Xl(_.runId,p))),u.select({runId:ce.runId,status:ce.status}).from(ce).where(Ut(xe(ce.userId,t),Xl(ce.runId,p)))]),v=new Map;for(let f of m){if(!f.runId)continue;let w=v.get(f.runId)??[];w.push({endedAt:f.endedAt}),v.set(f.runId,w)}let h=new Map;for(let f of y){if(!f.runId)continue;let w=h.get(f.runId)??[];w.push({status:f.status}),h.set(f.runId,w)}await Promise.all(l.map(async f=>{let w=AS(f.status,v.get(f.id)??[],h.get(f.id)??[]);w!==f.status&&(await ES({runId:f.id,userId:t,stored:f.status,rolled:w,hadCompletedAt:f.completedAt!=null}),f.status=w,f.completedAt==null&&(w==="completed"||w==="failed"||w==="cancelled")&&(f.completedAt=new Date))}))}return e.json({runs:c})});br.get("/runs/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(X).where(Ut(xe(X.id,n),xe(X.userId,t))).limit(1);if(!r)return e.json({error:"Run not found"},404);try{await xS(n,t)}catch{}let o=await u.select({id:_.id,tool:_.tool,gitBranch:_.gitBranch,projectPath:_.projectPath,startedAt:_.startedAt,endedAt:_.endedAt,eventCount:_.eventCount,tokenUsage:_.tokenUsage,analysis:_.analysis}).from(_).where(Ut(xe(_.runId,n),xe(_.userId,t))).orderBy(Ql(_.startedAt)),s=o.map(w=>w.id);if(!SS(r.status,r.completedAt)){let w=await u.select({status:ce.status}).from(ce).where(Ut(xe(ce.runId,n),xe(ce.userId,t))),b=AS(r.status,o.map(I=>({endedAt:I.endedAt})),w);b!==r.status&&(await ES({runId:n,userId:t,stored:r.status,rolled:b,hadCompletedAt:r.completedAt!=null}),r.status=b,r.completedAt==null&&(b==="completed"||b==="failed"||b==="cancelled")&&(r.completedAt=new Date))}let i=s.length>0?await u.select({sessionId:se.sessionId,instructionId:g.id,name:g.name}).from(se).innerJoin(g,xe(g.id,se.instructionId)).where(Xl(se.sessionId,s)):[],a=new Map;for(let w of s)a.set(w,[]);for(let w of i)a.get(w.sessionId)?.push({id:w.instructionId,name:w.name});let c=await Promise.all(o.map(async w=>{let b=w.analysis??{},I=typeof b.goalSummary=="string"?b.goalSummary:null,S=typeof b.outcome=="string"?b.outcome:null,A=b.friction??null,E=await c$(w.tokenUsage,w.startedAt??new Date);return{id:w.id,tool:w.tool,gitBranch:w.gitBranch,projectPath:w.projectPath,startedAt:w.startedAt,endedAt:w.endedAt,eventCount:w.eventCount,tokenUsage:w.tokenUsage,goalSummary:I,outcome:S,friction:A,cost:E,instructions:a.get(w.id)??[]}})),l=c.map(w=>({sessionId:w.id,score:w.outcome!=null?pi[w.outcome]??-1:-1,costUsd:w.cost?.totalUsd??Number.POSITIVE_INFINITY,frictionCount:a$(w.friction)})).sort((w,b)=>b.score!==w.score?b.score-w.score:w.costUsd!==b.costUsd?w.costUsd-b.costUsd:w.frictionCount-b.frictionCount).map((w,b)=>({sessionId:w.sessionId,rank:b+1,isWinner:b===0&&w.score>=0,score:w.score,costUsd:Number.isFinite(w.costUsd)?w.costUsd:null,frictionCount:w.frictionCount})),p=new Map,m=new Map;for(let w of i)p.set(w.instructionId,w.name),m.has(w.instructionId)||m.set(w.instructionId,new Set),m.get(w.instructionId).add(w.sessionId);let y=s.length,v=[],h=[];for(let[w,b]of m){let I=p.get(w)??"Unknown";y>0&&b.size===y?v.push({id:w,name:I}):h.push({id:w,name:I,sessionIds:[...b]})}let f=null;return r.autoWorktree?r.sessionCount>0&&c.length<r.sessionCount&&(f=`Only ${c.length} of ${r.sessionCount} expected sessions are attributed to this run so far \u2014 the comparison may be incomplete while sessions are still launching or being linked.`):f="This run did not auto-create per-session worktrees, so sessions are attributed only via the launch hook. Sessions from tools that do not run RuleMetric hooks may be missing from this comparison.",e.json({run:r,sessions:c,comparison:{ranking:l,instructionDiff:{shared:v,differing:h}},attributionCaveat:f})});br.post("/runs/:id/link-sessions",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:X.id}).from(X).where(Ut(xe(X.id,n),xe(X.userId,t))).limit(1);if(!r)return e.json({error:"Run not found"},404);let{linked:o}=await xS(n,t);return e.json({linked:o})});br.get("/runs/:id/jobs",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:X.id}).from(X).where(Ut(xe(X.id,n),xe(X.userId,t))).limit(1);if(!r)return e.json({error:"Run not found"},404);let o=await u.select({id:ce.id,runId:ce.runId,status:ce.status,tool:ce.tool}).from(ce).where(Ut(xe(ce.runId,n),xe(ce.userId,t))).orderBy(Ql(ce.createdAt));return e.json(o)});br.post("/runs/:id/cancel",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:X.id}).from(X).where(Ut(xe(X.id,n),xe(X.userId,t))).limit(1);if(!r)return e.json({error:"Run not found"},404);await u.update(ce).set({status:"cancelled",updatedAt:new Date}).where(Ut(xe(ce.runId,n),xe(ce.userId,t),xe(ce.status,"pending")));let[o]=await u.update(X).set({status:"cancelled",updatedAt:new Date}).where(Ut(xe(X.id,n),xe(X.userId,t))).returning();return e.json({run:o})});br.post("/runs/:id/cleanup",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:X.id}).from(X).where(Ut(xe(X.id,n),xe(X.userId,t))).limit(1);if(!r)return e.json({error:"Run not found"},404);let{noLiveWorker:o}=await OI({runId:n,userId:t});return e.json({enqueued:!0,noLiveWorker:o})});O();import{Hono as d$}from"hono";import{z as Cs}from"zod";import{and as na,desc as lh,eq as Vt,or as TS}from"drizzle-orm";var Os=new d$;function u$(e,t){return{liveSend:e?.kind==="tmux"&&e.status==="active"&&t,fallbackResume:!0,tmuxAvailable:e?.kind==="tmux"&&e.status!=="fallback_only",workerOnline:t}}d(u$,"capabilitiesFor");Os.get("/sessions/:id/terminal-target",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:_.id,externalSessionId:_.externalSessionId}).from(_).where(na(Vt(_.id,n),Vt(_.userId,t))).limit(1);if(!r)return e.json({error:"Session not found"},404);let o=r.externalSessionId?TS(Vt(Ve.sessionId,r.id),Vt(Ve.externalSessionId,r.externalSessionId)):Vt(Ve.sessionId,r.id),[s]=await u.select().from(Ve).where(na(Vt(Ve.userId,t),o)).orderBy(lh(Ve.lastSeenAt)).limit(1),i=await Ei(t);return e.json({target:s??null,capabilities:u$(s??null,i),...s?{}:{reason:"no_target"}})});var RS=Cs.enum(["active","missing","unknown","fallback_only"]),l$=Cs.object({message:Cs.string().min(1).max(16*1024),delivery:Cs.enum(["live","fallback"]).default("live"),submit:Cs.boolean().optional().default(!0)});Os.post("/sessions/:id/send",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=l$.parse(await e.req.json()),[o]=await u.select({id:_.id,externalSessionId:_.externalSessionId,projectPath:_.projectPath}).from(_).where(na(Vt(_.id,n),Vt(_.userId,t))).limit(1);if(!o)return e.json({error:"Session not found"},404);let s=o.externalSessionId?TS(Vt(Ve.sessionId,o.id),Vt(Ve.externalSessionId,o.externalSessionId)):Vt(Ve.sessionId,o.id),[i]=await u.select().from(Ve).where(na(Vt(Ve.userId,t),Vt(Ve.status,"active"),s)).orderBy(lh(Ve.lastSeenAt)).limit(1);if(!i){if(r.delivery==="fallback"){if(!o.externalSessionId||!o.projectPath)return e.json({error:"Live target unavailable",code:"LIVE_TARGET_UNAVAILABLE"},409);let p={projectPath:o.projectPath,mode:"interactive",resumeSessionId:o.externalSessionId,prompt:r.message},m={tool:"claude_code",config:p},{id:y,noLiveWorker:v}=await Rt({taskName:"process_launch",payload:m,userId:t,mirror:{userId:t,tool:"claude_code",config:p}});return e.json({delivery:"fallback",job:{id:y,kind:"process_launch"},noLiveWorker:v},202)}return e.json({error:"Live target unavailable",code:"LIVE_TARGET_UNAVAILABLE",fallback:{available:!!(o.externalSessionId&&o.projectPath),action:"resume_terminal"}},409)}if(!await Ei(t))return e.json({error:"Worker offline",code:"WORKER_OFFLINE"},409);let c={sessionId:o.id,terminalTargetId:i.id,target:i.target,message:r.message,submit:r.submit},{id:l}=await Rt({taskName:"process_send_message",payload:c,userId:t,mirror:{userId:t,sessionId:o.id,terminalTargetId:i.id,target:i.target,message:r.message,submit:r.submit,delivery:"live"}});return e.json({delivery:"live",job:{id:l,kind:"process_send_message"},target:i},202)});var p$=Cs.object({status:RS,lastSeenAt:Cs.string().datetime().optional()});Os.patch("/terminal-targets/:id/status",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=p$.parse(await e.req.json()),o=r.lastSeenAt?new Date(r.lastSeenAt):new Date,s=new Date,[i]=await u.update(Ve).set({status:r.status,lastSeenAt:o,updatedAt:s}).where(na(Vt(Ve.id,n),Vt(Ve.userId,t))).returning();return i?e.json({target:i}):e.json({error:"Terminal target not found"},404)});Os.get("/terminal-targets",async e=>{let t=e.get("userId"),n=e.req.query("status"),r=n?RS.parse(n):null,o=await u.select().from(Ve).where(na(Vt(Ve.userId,t),...r?[Vt(Ve.status,r)]:[])).orderBy(lh(Ve.lastSeenAt)).limit(100);return e.json({targets:o})});import{Hono as Q$}from"hono";O();import{Hono as h$}from"hono";import{z as Lo}from"zod";import{eq as Kr,asc as jS,sql as _$}from"drizzle-orm";O();import{eq as ph,and as m$}from"drizzle-orm";function ht(e){return async(t,n)=>{let r=t.get("userId");if(!r)return t.json({error:"Unauthenticated",code:"UNAUTHENTICATED"},401);let o=t.req.param("slug");if(!o)return t.json({error:"Missing org slug",code:"BAD_REQUEST"},400);let[s]=await u.select({id:G.id,slug:G.slug}).from(G).where(ph(G.slug,o));if(!s)return t.json({error:"Organization not found",code:"ORG_NOT_FOUND"},404);let[i]=await u.select({role:Q.role}).from(Q).where(m$(ph(Q.orgId,s.id),ph(Q.userId,r)));if(!i||!e.includes(i.role))return t.json({error:"Forbidden",code:"ORG_FORBIDDEN"},403);t.set("orgId",s.id),t.set("orgSlug",o),t.set("orgRole",i.role),await n()}}d(ht,"requireOrgRole");O();import{eq as kS,and as f$,sql as g$}from"drizzle-orm";var Gr=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Zl=g$`case ${Q.role}
|
|
1130
|
+
${e.body??""}`}d(BL,"buildPrompt");function FL(e){let t=e.trim().replace(/^```(?:json)?\s*/i,"").replace(/\s*```$/i,"").trim(),n=t.indexOf("{"),r=t.lastIndexOf("}"),o=n>=0&&r>n?t.slice(n,r+1):t,s=JSON.parse(o);if(!s.observations||!Array.isArray(s.observations))return{observations:[]};let i=[];for(let a of s.observations){if(!a||typeof a!="object")continue;let c=a;if(typeof c.limitType!="string"||typeof c.plan!="string"||typeof c.value!="number"||!Number.isFinite(c.value)||typeof c.unit!="string")continue;let l=c.comparator===">="||c.comparator==="<="?c.comparator:"=";i.push({limitType:c.limitType,plan:c.plan,value:c.value,unit:c.unit,comparator:l,evidence_quote:typeof c.evidence_quote=="string"?c.evidence_quote:""})}return{observations:i}}d(FL,"parseLlmJson");async function SS(e,t={}){let n=e.body??"";if(!OL.test(n))return{observations:[],llm_called:!1,reason:"no keywords matched"};let r=t.llm===void 0?UL():t.llm;if(!r)return console.warn("[harness-release-extractor] ANTHROPIC_API_KEY missing; skipping extraction"),{observations:[],llm_called:!1,reason:"no LLM available"};let o,s;try{let c=await r(BL(e));o=c.text,s=c.usage}catch(c){return{observations:[],llm_called:!0,error:`LLM call failed: ${c instanceof Error?c.message:String(c)}`}}let i;try{i=FL(o).observations}catch(c){return{observations:[],llm_called:!0,llm_tokens:{input:s.inputTokens,output:s.outputTokens},error:`failed to parse LLM JSON: ${c instanceof Error?c.message:String(c)}`}}if(i.length===0)return{observations:[],llm_called:!0,llm_tokens:{input:s.inputTokens,output:s.outputTokens},reason:"LLM returned no observations"};let a=t.observe??HL;for(let c of i)await a({plan:c.plan,limitType:c.limitType,value:c.value,unit:c.unit,comparator:c.comparator,sourceType:"release_notes",sourceUrl:e.url,sourceEvidence:{harness:e.harness,version:e.version,publishedAt:e.publishedAt.toISOString(),quote:c.evidence_quote,fullBody:n},confidence:$L,provider:"anthropic"});return{observations:i,llm_called:!0,llm_tokens:{input:s.inputTokens,output:s.outputTokens}}}d(SS,"extractAndPostObservationsFromRelease");var ES=[{harness:"claude_code",repo:"anthropics/claude-code"}];function zL(e){let t=[],n=[],r=[],o=e.split(`
|
|
1131
|
+
`);for(let s of o){let i=s.trim();if(!i.startsWith("- ")&&!i.startsWith("* "))continue;let a=i.replace(/^[-*]\s+/,"").trim();if(!a)continue;let c=a.toLowerCase();c.startsWith("security:")||c.includes("security fix")||c.includes("cve-")?r.push(a):c.startsWith("fixed ")||c.startsWith("fix ")||c.startsWith("fixed:")?n.push(a):t.push(a)}return{features:t,fixes:n,security:r}}d(zL,"parseReleaseBody");async function Ql(e){let t=e?ES.filter(o=>o.harness===e):ES,n=0,r=0;for(let o of t){let s=`https://api.github.com/repos/${o.repo}/releases?per_page=100`,i={Accept:"application/vnd.github+json"};process.env.GITHUB_TOKEN&&(i.Authorization=`Bearer ${process.env.GITHUB_TOKEN}`);let a=await fetch(s,{headers:i});if(!a.ok)continue;let c=await a.json();r+=c.length;for(let l of c){let p=zL(l.body??"");if((await u.select({id:Pt.id}).from(Pt).where(WL(AS(Pt.harness,o.harness),AS(Pt.version,l.tag_name)))).length===0){await u.insert(Pt).values({harness:o.harness,version:l.tag_name,publishedAt:new Date(l.published_at),title:l.name,body:l.body,categories:p,url:l.html_url}),n++;try{await SS({harness:o.harness,version:l.tag_name,url:l.html_url,publishedAt:new Date(l.published_at),body:l.body})}catch(y){console.warn("release notes extraction failed:",y)}}}}return{synced:n,total:r}}d(Ql,"syncHarnessReleases");var td=new VL;td.get("/harness-releases",async e=>{let t=e.req.query("harness"),n=Math.min(Number(e.req.query("limit")??50),100),r=t?GL(Pt.harness,t):void 0,o=await u.select({id:Pt.id,harness:Pt.harness,version:Pt.version,publishedAt:Pt.publishedAt,title:Pt.title,categories:Pt.categories,url:Pt.url}).from(Pt).where(r).orderBy(JL(Pt.publishedAt)).limit(n);return e.json(o)});td.post("/harness-releases/sync",async e=>{let t=await e.req.json().catch(()=>({})),n=await Ql(t.harness);return e.json(n)});D();import{Hono as KL}from"hono";import{and as Zl,desc as YL,eq as ea,isNull as fh,sql as XL}from"drizzle-orm";var ta=new KL;ta.get("/notifications",async e=>{let t=e.get("userId"),n=Math.min(parseInt(e.req.query("limit")??"20",10),100),r=parseInt(e.req.query("offset")??"0",10),s=e.req.query("unread")==="true"?Zl(ea(bt.userId,t),fh(bt.readAt)):ea(bt.userId,t),i=await u.select().from(bt).where(s).orderBy(YL(bt.createdAt)).limit(n).offset(r),[{count:a}]=await u.select({count:XL`count(*)::int`}).from(bt).where(Zl(ea(bt.userId,t),fh(bt.readAt)));return e.json({items:i,unreadCount:a})});ta.post("/notifications/:id/read",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await u.update(bt).set({readAt:new Date}).where(Zl(ea(bt.id,t),ea(bt.userId,n))).returning();return r?e.json(r):e.json({error:"Not found"},404)});ta.post("/notifications/read-all",async e=>{let t=e.get("userId");return await u.update(bt).set({readAt:new Date}).where(Zl(ea(bt.userId,t),fh(bt.readAt))),e.json({success:!0})});D();import{Hono as QL}from"hono";import{z as Zt}from"zod";import{eq as Ir,and as ep,desc as ZL,ne as e$}from"drizzle-orm";var Mo=new QL;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}}}d(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:_.id}).from(_).where(ep(Ir(_.userId,e.userId),Ir(_.externalSessionId,o))).limit(1):[];await u.insert(Ve).values({userId:e.userId,sessionId:s?.id??null,externalSessionId:o,kind:"tmux",target:t.terminalTarget.target,status:t.terminalTarget.live===!1?"unknown":"active",attachCommand:t.terminalTarget.attachCommand,projectPath:r,metadata:{launchJobId:e.jobId,launcherSessionId:t.sessionId}}).onConflictDoUpdate({target:[Ve.userId,Ve.target],set:{sessionId:s?.id??null,externalSessionId:o,status:t.terminalTarget.live===!1?"unknown":"active",attachCommand:t.terminalTarget.attachCommand,projectPath:r,metadata:{launchJobId:e.jobId,launcherSessionId:t.sessionId},lastSeenAt:new Date,updatedAt:new Date}})}d(n$,"upsertTerminalTargetFromLaunchResult");var r$=Zt.object({tool:Zt.string().min(1),config:Zt.object({projectPath:Zt.string().min(1),prompt:Zt.string().optional(),systemPrompt:Zt.string().optional(),model:Zt.string().optional(),mode:Zt.enum(["headless","interactive"]).default("interactive"),timeout:Zt.number().int().positive().optional(),resumeSessionId:Zt.string().optional()})});Mo.post("/launch-jobs",async e=>{let t=e.get("userId"),n=await e.req.json(),r=r$.parse(n),{id:o,noLiveWorker:s}=await Rt({taskName:"process_launch",payload:{tool:r.tool,config:r.config},userId:t,mirror:{userId:t,tool:r.tool,config:r.config}}),[i]=await u.select().from(ce).where(Ir(ce.id,o));return e.json({...i,noLiveWorker:s},201)});Mo.get("/launch-jobs",async e=>{let t=e.get("userId"),n=Number(e.req.query("limit")??50),r=await u.select().from(ce).where(Ir(ce.userId,t)).orderBy(ZL(ce.createdAt)).limit(n);return e.json(r)});var o$=Zt.object({status:Zt.enum(["running","completed","failed"]).optional(),attempts:Zt.number().int().nonnegative().optional(),error:Zt.string().optional(),result:Zt.record(Zt.unknown()).optional()});Mo.patch("/launch-jobs/:id/state",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=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(ce).set(o).where(ep(Ir(ce.id,n),Ir(ce.userId,t),e$(ce.status,"cancelled"))).returning();if(!s){let[i]=await u.select().from(ce).where(ep(Ir(ce.id,n),Ir(ce.userId,t)));return i?e.json(i):e.json({error:"Job not found"},404)}return r.result!==void 0&&await n$({userId:t,jobId:n,config:s.config,result:r.result}),e.json(s)});Mo.post("/launch-jobs/:id/cancel",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.update(ce).set({status:"cancelled",updatedAt:new Date}).where(ep(Ir(ce.id,n),Ir(ce.userId,t))).returning();return r?e.json(r):e.json({error:"Job not found"},404)});Mo.get("/launchers",async e=>{let{getAvailableLaunchers:t}=await Promise.resolve().then(()=>(_l(),r0));return e.json(t())});D();import{Hono as s$}from"hono";import{z as qn}from"zod";import{eq as xe,and as Ut,desc as np,inArray as tp,isNull as i$,ne as a$}from"drizzle-orm";_l();var br=new s$,c$=qn.object({tool:qn.string().min(1),model:qn.string().optional(),label:qn.string().optional()}),d$=qn.object({title:qn.string().optional(),projectPath:qn.string().min(1),gitRemote:qn.string().optional(),baseBranch:qn.string().optional(),prompt:qn.string().optional(),autoWorktree:qn.boolean().optional(),sessions:qn.array(c$).min(1).max(8)});function u$(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/(^-|-$)/g,"")||"tool"}d(u$,"sanitizeTool");var l$=new Set(["pending","claimed","running"]);var p$=1800*1e3;function xS(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}d(xS,"canSkipRollup");function TS(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"}d(TS,"rollupRunStatus");async function RS(e){if(e.rolled===e.stored)return;let t=e.rolled==="completed"||e.rolled==="failed"||e.rolled==="cancelled",n={status:e.rolled,updatedAt:new Date};t&&!e.hadCompletedAt&&(n.completedAt=new Date);try{await u.update(X).set(n).where(Ut(xe(X.id,e.runId),xe(X.userId,e.userId),a$(X.status,"cancelled")))}catch{}}d(RS,"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}d(m$,"frictionCount");async function f$(e,t){if(!e||typeof e!="object")return null;let n=e,r="claude-sonnet-4-6",o=No(r),s={input_tokens:n.input_tokens??0,output_tokens:n.output_tokens??0,cache_read_input_tokens:n.cache_read_input_tokens??0,cache_creation_5m:n.cache_creation_5m??0,cache_creation_1h:n.cache_creation_1h??0,cache_creation_input_tokens:n.cache_creation_input_tokens??0},i=await Fr(u,s,r,t,o);return i?{...i,estimated:!0}:null}d(f$,"deriveSessionCost");async function kS(e,t){let[n]=await u.select({id:X.id,autoWorktree:X.autoWorktree}).from(X).where(Ut(xe(X.id,e),xe(X.userId,t))).limit(1);if(!n||!n.autoWorktree)return{linked:0};let r=await u.select({config:ce.config,result:ce.result}).from(ce).where(Ut(xe(ce.runId,e),xe(ce.userId,t))),o=new Set;for(let i of r){let a=i.result??{};typeof a.worktreePath=="string"&&a.worktreePath&&o.add(a.worktreePath);let c=i.config??{};c.worktree?.create&&typeof c.worktree.branch=="string"&&typeof c.projectPath=="string"&&o.add(hl({repoRoot:c.projectPath,branch:c.worktree.branch}))}return o.size===0?{linked:0}:{linked:(await u.update(_).set({runId:e}).where(Ut(xe(_.userId,t),i$(_.runId),tp(_.projectPath,[...o]))).returning({id:_.id})).length}}d(kS,"linkRunSessions");br.post("/runs",async e=>{let t=e.get("userId"),n=await e.req.json(),r=d$.parse(n),o=await _o(t,null),s=r.autoWorktree??!0,i=r.baseBranch??"HEAD",a=null;if(r.projectPath){let[m]=await u.select({projectId:le.projectId}).from(le).where(xe(le.path,r.projectPath)).orderBy(np(le.lastSeen)).limit(1);a=m?.projectId??null}if(!a&&r.gitRemote){let[m]=await u.select({id:U.id}).from(U).where(xe(U.gitRemoteUrl,r.gitRemote)).limit(1);a=m?.id??null}let[c]=await u.insert(X).values({userId:t,orgId:o,projectPath:r.projectPath,projectId:a,gitRemote:r.gitRemote??null,baseBranch:r.baseBranch??null,title:r.title??null,prompt:r.prompt??null,toolSpec:r.sessions,autoWorktree:s,status:"pending",sessionCount:r.sessions.length}).returning(),l=c.id.slice(0,8),p=!1;try{for(let m=0;m<r.sessions.length;m++){let y=r.sessions[m],v=`rm/run-${l}/s${m}-${u$(y.tool)}`,h={projectPath:r.projectPath,prompt:r.prompt,systemPrompt:void 0,model:y.model,mode:"interactive",worktree:{create:s,branch:v,baseRef:i},runId:c.id},f=await Rt({taskName:"process_launch",userId:t,payload:{tool:y.tool,config:h},mirror:{userId:t,tool:y.tool,config:h},runId:c.id});p=p||f.noLiveWorker}}catch(m){return await u.update(X).set({status:"failed",updatedAt:new Date}).where(xe(X.id,c.id)),await u.update(ce).set({status:"cancelled",updatedAt:new Date}).where(Ut(xe(ce.runId,c.id),xe(ce.status,"pending"))),e.json({error:"Failed to enqueue all launch jobs",detail:m instanceof Error?m.message:String(m),run:{...c,status:"failed"}},500)}return e.json({run:c,noLiveWorker:p},201)});br.get("/runs",async e=>{let t=e.get("userId"),n=Number(e.req.query("limit")),r=Math.min(Math.max(Number.isFinite(n)?n:50,1),100),o=Number(e.req.query("offset")),s=Math.max(Number.isFinite(o)?o:0,0),i=e.req.query("projectId"),a=i?Ut(xe(X.userId,t),xe(X.projectId,i)):xe(X.userId,t),c=await u.select({id:X.id,userId:X.userId,orgId:X.orgId,projectId:X.projectId,projectPath:X.projectPath,gitRemote:X.gitRemote,baseBranch:X.baseBranch,title:X.title,toolSpec:X.toolSpec,autoWorktree:X.autoWorktree,status:X.status,sessionCount:X.sessionCount,createdAt:X.createdAt,updatedAt:X.updatedAt,completedAt:X.completedAt}).from(X).where(a).orderBy(np(X.createdAt)).limit(r).offset(s),l=c.filter(m=>!xS(m.status,m.completedAt)),p=l.map(m=>m.id);if(p.length>0){let[m,y]=await Promise.all([u.select({runId:_.runId,endedAt:_.endedAt}).from(_).where(Ut(xe(_.userId,t),tp(_.runId,p))),u.select({runId:ce.runId,status:ce.status}).from(ce).where(Ut(xe(ce.userId,t),tp(ce.runId,p)))]),v=new Map;for(let f of m){if(!f.runId)continue;let w=v.get(f.runId)??[];w.push({endedAt:f.endedAt}),v.set(f.runId,w)}let h=new Map;for(let f of y){if(!f.runId)continue;let w=h.get(f.runId)??[];w.push({status:f.status}),h.set(f.runId,w)}await Promise.all(l.map(async f=>{let w=TS(f.status,v.get(f.id)??[],h.get(f.id)??[]);w!==f.status&&(await RS({runId:f.id,userId:t,stored:f.status,rolled:w,hadCompletedAt:f.completedAt!=null}),f.status=w,f.completedAt==null&&(w==="completed"||w==="failed"||w==="cancelled")&&(f.completedAt=new Date))}))}return e.json({runs:c})});br.get("/runs/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(X).where(Ut(xe(X.id,n),xe(X.userId,t))).limit(1);if(!r)return e.json({error:"Run not found"},404);try{await kS(n,t)}catch{}let o=await u.select({id:_.id,tool:_.tool,gitBranch:_.gitBranch,projectPath:_.projectPath,startedAt:_.startedAt,endedAt:_.endedAt,eventCount:_.eventCount,tokenUsage:_.tokenUsage,analysis:_.analysis}).from(_).where(Ut(xe(_.runId,n),xe(_.userId,t))).orderBy(np(_.startedAt)),s=o.map(w=>w.id);if(!xS(r.status,r.completedAt)){let w=await u.select({status:ce.status}).from(ce).where(Ut(xe(ce.runId,n),xe(ce.userId,t))),b=TS(r.status,o.map(I=>({endedAt:I.endedAt})),w);b!==r.status&&(await RS({runId:n,userId:t,stored:r.status,rolled:b,hadCompletedAt:r.completedAt!=null}),r.status=b,r.completedAt==null&&(b==="completed"||b==="failed"||b==="cancelled")&&(r.completedAt=new Date))}let i=s.length>0?await u.select({sessionId:se.sessionId,instructionId:g.id,name:g.name}).from(se).innerJoin(g,xe(g.id,se.instructionId)).where(tp(se.sessionId,s)):[],a=new Map;for(let w of s)a.set(w,[]);for(let w of i)a.get(w.sessionId)?.push({id:w.instructionId,name:w.name});let c=await Promise.all(o.map(async w=>{let b=w.analysis??{},I=typeof b.goalSummary=="string"?b.goalSummary:null,S=typeof b.outcome=="string"?b.outcome:null,A=b.friction??null,E=await 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:I,outcome:S,friction:A,cost:E,instructions:a.get(w.id)??[]}})),l=c.map(w=>({sessionId:w.id,score:w.outcome!=null?pi[w.outcome]??-1:-1,costUsd:w.cost?.totalUsd??Number.POSITIVE_INFINITY,frictionCount:m$(w.friction)})).sort((w,b)=>b.score!==w.score?b.score-w.score:w.costUsd!==b.costUsd?w.costUsd-b.costUsd:w.frictionCount-b.frictionCount).map((w,b)=>({sessionId:w.sessionId,rank:b+1,isWinner:b===0&&w.score>=0,score:w.score,costUsd:Number.isFinite(w.costUsd)?w.costUsd:null,frictionCount:w.frictionCount})),p=new Map,m=new Map;for(let w of i)p.set(w.instructionId,w.name),m.has(w.instructionId)||m.set(w.instructionId,new Set),m.get(w.instructionId).add(w.sessionId);let y=s.length,v=[],h=[];for(let[w,b]of m){let I=p.get(w)??"Unknown";y>0&&b.size===y?v.push({id:w,name:I}):h.push({id:w,name:I,sessionIds:[...b]})}let f=null;return r.autoWorktree?r.sessionCount>0&&c.length<r.sessionCount&&(f=`Only ${c.length} of ${r.sessionCount} expected sessions are attributed to this run so far \u2014 the comparison may be incomplete while sessions are still launching or being linked.`):f="This run did not auto-create per-session worktrees, so sessions are attributed only via the launch hook. Sessions from tools that do not run RuleMetric hooks may be missing from this comparison.",e.json({run:r,sessions:c,comparison:{ranking:l,instructionDiff:{shared:v,differing:h}},attributionCaveat:f})});br.post("/runs/:id/link-sessions",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:X.id}).from(X).where(Ut(xe(X.id,n),xe(X.userId,t))).limit(1);if(!r)return e.json({error:"Run not found"},404);let{linked:o}=await kS(n,t);return e.json({linked:o})});br.get("/runs/:id/jobs",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:X.id}).from(X).where(Ut(xe(X.id,n),xe(X.userId,t))).limit(1);if(!r)return e.json({error:"Run not found"},404);let o=await u.select({id:ce.id,runId:ce.runId,status:ce.status,tool:ce.tool}).from(ce).where(Ut(xe(ce.runId,n),xe(ce.userId,t))).orderBy(np(ce.createdAt));return e.json(o)});br.post("/runs/:id/cancel",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:X.id}).from(X).where(Ut(xe(X.id,n),xe(X.userId,t))).limit(1);if(!r)return e.json({error:"Run not found"},404);await u.update(ce).set({status:"cancelled",updatedAt:new Date}).where(Ut(xe(ce.runId,n),xe(ce.userId,t),xe(ce.status,"pending")));let[o]=await u.update(X).set({status:"cancelled",updatedAt:new Date}).where(Ut(xe(X.id,n),xe(X.userId,t))).returning();return e.json({run:o})});br.post("/runs/:id/cleanup",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:X.id}).from(X).where(Ut(xe(X.id,n),xe(X.userId,t))).limit(1);if(!r)return e.json({error:"Run not found"},404);let{noLiveWorker:o}=await $I({runId:n,userId:t});return e.json({enqueued:!0,noLiveWorker:o})});D();import{Hono as g$}from"hono";import{z as Cs}from"zod";import{and as na,desc as gh,eq as Vt,or as jS}from"drizzle-orm";var Ds=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}}d(h$,"capabilitiesFor");Ds.get("/sessions/:id/terminal-target",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:_.id,externalSessionId:_.externalSessionId}).from(_).where(na(Vt(_.id,n),Vt(_.userId,t))).limit(1);if(!r)return e.json({error:"Session not found"},404);let o=r.externalSessionId?jS(Vt(Ve.sessionId,r.id),Vt(Ve.externalSessionId,r.externalSessionId)):Vt(Ve.sessionId,r.id),[s]=await u.select().from(Ve).where(na(Vt(Ve.userId,t),o)).orderBy(gh(Ve.lastSeenAt)).limit(1),i=await Ei(t);return e.json({target:s??null,capabilities:h$(s??null,i),...s?{}:{reason:"no_target"}})});var NS=Cs.enum(["active","missing","unknown","fallback_only"]),_$=Cs.object({message:Cs.string().min(1).max(16*1024),delivery:Cs.enum(["live","fallback"]).default("live"),submit:Cs.boolean().optional().default(!0)});Ds.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:_.id,externalSessionId:_.externalSessionId,projectPath:_.projectPath}).from(_).where(na(Vt(_.id,n),Vt(_.userId,t))).limit(1);if(!o)return e.json({error:"Session not found"},404);let s=o.externalSessionId?jS(Vt(Ve.sessionId,o.id),Vt(Ve.externalSessionId,o.externalSessionId)):Vt(Ve.sessionId,o.id),[i]=await u.select().from(Ve).where(na(Vt(Ve.userId,t),Vt(Ve.status,"active"),s)).orderBy(gh(Ve.lastSeenAt)).limit(1);if(!i){if(r.delivery==="fallback"){if(!o.externalSessionId||!o.projectPath)return e.json({error:"Live target unavailable",code:"LIVE_TARGET_UNAVAILABLE"},409);let p={projectPath:o.projectPath,mode:"interactive",resumeSessionId:o.externalSessionId,prompt:r.message},m={tool:"claude_code",config:p},{id:y,noLiveWorker:v}=await Rt({taskName:"process_launch",payload:m,userId:t,mirror:{userId:t,tool:"claude_code",config:p}});return e.json({delivery:"fallback",job:{id:y,kind:"process_launch"},noLiveWorker:v},202)}return e.json({error:"Live target unavailable",code:"LIVE_TARGET_UNAVAILABLE",fallback:{available:!!(o.externalSessionId&&o.projectPath),action:"resume_terminal"}},409)}if(!await Ei(t))return e.json({error:"Worker offline",code:"WORKER_OFFLINE"},409);let c={sessionId:o.id,terminalTargetId:i.id,target:i.target,message:r.message,submit:r.submit},{id:l}=await Rt({taskName:"process_send_message",payload:c,userId:t,mirror:{userId:t,sessionId:o.id,terminalTargetId:i.id,target:i.target,message:r.message,submit:r.submit,delivery:"live"}});return e.json({delivery:"live",job:{id:l,kind:"process_send_message"},target:i},202)});var y$=Cs.object({status:NS,lastSeenAt:Cs.string().datetime().optional()});Ds.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(Ve).set({status:r.status,lastSeenAt:o,updatedAt:s}).where(na(Vt(Ve.id,n),Vt(Ve.userId,t))).returning();return i?e.json({target:i}):e.json({error:"Terminal target not found"},404)});Ds.get("/terminal-targets",async e=>{let t=e.get("userId"),n=e.req.query("status"),r=n?NS.parse(n):null,o=await u.select().from(Ve).where(na(Vt(Ve.userId,t),...r?[Vt(Ve.status,r)]:[])).orderBy(gh(Ve.lastSeenAt)).limit(100);return e.json({targets:o})});import{Hono as o1}from"hono";D();import{Hono as b$}from"hono";import{z as Lo}from"zod";import{eq as Kr,asc as CS,sql as S$}from"drizzle-orm";D();import{eq as hh,and as w$}from"drizzle-orm";function ht(e){return async(t,n)=>{let r=t.get("userId");if(!r)return t.json({error:"Unauthenticated",code:"UNAUTHENTICATED"},401);let o=t.req.param("slug");if(!o)return t.json({error:"Missing org slug",code:"BAD_REQUEST"},400);let[s]=await u.select({id:G.id,slug:G.slug}).from(G).where(hh(G.slug,o));if(!s)return t.json({error:"Organization not found",code:"ORG_NOT_FOUND"},404);let[i]=await u.select({role:Q.role}).from(Q).where(w$(hh(Q.orgId,s.id),hh(Q.userId,r)));if(!i||!e.includes(i.role))return t.json({error:"Forbidden",code:"ORG_FORBIDDEN"},403);t.set("orgId",s.id),t.set("orgSlug",o),t.set("orgRole",i.role),await n()}}d(ht,"requireOrgRole");D();import{eq as PS,and as v$,sql as I$}from"drizzle-orm";var Gr=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,rp=I$`case ${Q.role}
|
|
1127
1132
|
when 'owner' then 0
|
|
1128
1133
|
when 'admin' then 1
|
|
1129
1134
|
when 'member' then 2
|
|
1130
1135
|
else 3
|
|
1131
|
-
end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{ok:!1,response:e.json({error:"Invalid teamId path param",code:"BAD_REQUEST"},400)};let n=e.get("orgId"),[r]=await u.select({id:K.id,orgId:K.orgId,name:K.name,slug:K.slug,createdAt:K.createdAt}).from(K).where(f$(kS(K.id,t),kS(K.orgId,n)));return r?{ok:!0,team:{id:r.id,orgId:r.orgId,name:r.name,slug:r.slug,createdAt:r.createdAt}}:{ok:!1,response:e.json({error:"Team not found",code:"TEAM_NOT_FOUND"},404)}}d(Ds,"loadTeamInOrg");var ra=/^(?=.{3,40}$)[a-z0-9]+(?:-[a-z0-9]+)*$/,oa="Slug must be 3-40 chars, lowercase alphanumerics with single dashes only \u2014 no leading, trailing, or consecutive dashes";var $o=new h$,y$=Lo.object({name:Lo.string().min(1).max(100),slug:Lo.string().regex(ra,{message:oa})}),w$=Lo.object({name:Lo.string().min(1).max(100).optional(),slug:Lo.string().regex(ra,{message:oa}).optional()});$o.post("/orgs",async e=>{let t=e.get("supabase");if(!t)return e.json({error:"JWT authentication required for this endpoint",code:"JWT_REQUIRED"},401);let n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let r=y$.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let{name:o,slug:s}=r.data,{data:i,error:a}=await t.rpc("create_organization",{p_name:o,p_slug:s});if(a){let l=zt(a),p=vo(a);if(l==="23505")return e.json({error:"Slug already taken",code:"ORG_SLUG_TAKEN"},409);if(l==="P0001"&&/unauthenticated/i.test(p))return e.json({error:"Unauthenticated",code:"UNAUTHENTICATED"},401);throw a}let c=i;return e.json({id:c.id,name:c.name,slug:c.slug,role:"owner"},201)});$o.get("/orgs",async e=>{let t=e.get("userId"),n=await u.select({id:G.id,name:G.name,slug:G.slug,role:Q.role,createdAt:G.createdAt}).from(Q).innerJoin(G,Kr(Q.orgId,G.id)).where(Kr(Q.userId,t)).orderBy(G.createdAt);return e.json(n.map(r=>({id:r.id,name:r.name,slug:r.slug,role:r.role})))});$o.get("/orgs/:slug",ht(["owner","admin","member"]),async e=>{let t=e.get("orgId"),[n]=await u.select({id:G.id,name:G.name,slug:G.slug,createdAt:G.createdAt}).from(G).where(Kr(G.id,t)),r=await u.select({userId:Q.userId,role:Q.role,joinedAt:Q.createdAt,email:T.email,displayName:T.displayName}).from(Q).leftJoin(T,Kr(Q.userId,T.id)).where(Kr(Q.orgId,t)).orderBy(Zl,jS(Q.createdAt)),o=await u.select({id:K.id,name:K.name,slug:K.slug,memberCount:_$`count(${ye.userId})::int`}).from(K).leftJoin(ye,Kr(ye.teamId,K.id)).where(Kr(K.orgId,t)).groupBy(K.id,K.name,K.slug).orderBy(jS(K.name));return e.json({id:n.id,name:n.name,slug:n.slug,createdAt:n.createdAt,members:r.map(s=>({userId:s.userId,email:s.email,displayName:s.displayName,role:s.role,joinedAt:s.joinedAt})),teams:o.map(s=>({id:s.id,name:s.name,slug:s.slug,memberCount:Number(s.memberCount)}))})});$o.patch("/orgs/:slug",ht(["owner","admin"]),async e=>{let t=e.get("orgId"),n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let r=w$.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let{name:o,slug:s}=r.data;if(o===void 0&&s===void 0)return e.json({error:"At least one of `name` or `slug` is required",code:"BAD_REQUEST"},400);let i={};o!==void 0&&(i.name=o),s!==void 0&&(i.slug=s);try{let[a]=await u.update(G).set(i).where(Kr(G.id,t)).returning({id:G.id,name:G.name,slug:G.slug});return e.json({id:a.id,name:a.name,slug:a.slug})}catch(a){if(zt(a)==="23505")return e.json({error:"Slug already taken",code:"ORG_SLUG_TAKEN"},409);throw a}});$o.delete("/orgs/:slug",ht(["owner"]),async e=>{let t=e.get("orgId");return await u.delete(G).where(Kr(G.id,t)),e.body(null,204)});var v$=Lo.object({newOwnerId:Lo.string().uuid()});$o.post("/orgs/:slug/transfer",ht(["owner"]),async e=>{let t=e.get("supabase");if(!t)return e.json({error:"JWT authentication required for this endpoint",code:"JWT_REQUIRED"},401);let n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let r=v$.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let{newOwnerId:o}=r.data,s=e.get("orgId"),{data:i,error:a}=await t.rpc("transfer_ownership",{p_org:s,p_new_owner_id:o});if(a){let l=zt(a),p=vo(a);if(l==="P0001"){if(/same_user/i.test(p))return e.json({error:"Cannot transfer ownership to yourself",code:"SAME_USER"},400);if(/not_a_member/i.test(p))return e.json({error:"Target user is not a member of this organization",code:"NOT_A_MEMBER"},404);if(/forbidden/i.test(p))return e.json({error:"Forbidden",code:"ORG_FORBIDDEN"},403)}throw a}let c=i;return e.json({orgId:c.orgId,newOwnerId:c.newOwnerId,oldOwnerId:c.oldOwnerId})});O();import{Hono as I$}from"hono";import{z as NS}from"zod";import{eq as Zc,and as PS,asc as b$,max as S$,inArray as CS}from"drizzle-orm";var ed=new I$;ed.get("/orgs/:slug/members",ht(["owner","admin"]),async e=>{let t=e.get("orgId"),n=await u.select({userId:Q.userId,role:Q.role,joinedAt:Q.createdAt,email:T.email,displayName:T.displayName}).from(Q).leftJoin(T,Zc(Q.userId,T.id)).where(Zc(Q.orgId,t)).orderBy(Zl,b$(Q.createdAt)),r=n.map(c=>c.userId),o=r.length?await u.select({userId:ye.userId,teamId:K.id,teamName:K.name,teamSlug:K.slug}).from(ye).innerJoin(K,Zc(ye.teamId,K.id)).where(PS(Zc(K.orgId,t),CS(ye.userId,r))):[],s=new Map;for(let c of o){let l=s.get(c.userId)??[];l.push({id:c.teamId,name:c.teamName,slug:c.teamSlug}),s.set(c.userId,l)}let i=r.length?await u.select({userId:_.userId,lastActiveAt:S$(_.startedAt)}).from(_).where(PS(Zc(_.orgId,t),CS(_.userId,r))).groupBy(_.userId):[],a=new Map;for(let c of i)a.set(c.userId,c.lastActiveAt);return e.json(n.map(c=>{let l=a.get(c.userId)??null;return{userId:c.userId,email:c.email,displayName:c.displayName,role:c.role,joinedAt:c.joinedAt,teams:s.get(c.userId)??[],lastActiveAt:l?new Date(l).toISOString():null}}))});var A$=NS.object({role:NS.enum(["owner","admin","member"])});ed.patch("/orgs/:slug/members/:userId",ht(["owner","admin"]),async e=>{let t=e.get("supabase");if(!t)return e.json({error:"JWT authentication required for this endpoint",code:"JWT_REQUIRED"},401);let n=e.req.param("userId");if(!n||!Gr.test(n))return e.json({error:"Invalid userId path param",code:"BAD_REQUEST"},400);let r;try{r=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let o=A$.safeParse(r);if(!o.success)return e.json({error:o.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let s=e.get("orgId"),{data:i,error:a}=await t.rpc("change_member_role",{p_org:s,p_user:n,p_new_role:o.data.role});if(a){let l=zt(a),p=vo(a);if(l==="P0001"){if(/invalid_role/i.test(p))return e.json({error:"Invalid role",code:"INVALID_ROLE"},400);if(/not_a_member/i.test(p))return e.json({error:"Target user is not a member of this organization",code:"NOT_A_MEMBER"},404);if(/last_owner_violation/i.test(p))return e.json({error:"Cannot demote the last owner of this organization",code:"LAST_OWNER"},409);if(/forbidden/i.test(p))return e.json({error:"Forbidden",code:"ORG_FORBIDDEN"},403)}throw a}let c=i;return e.json({userId:c.userId,orgId:c.orgId,role:c.role})});ed.delete("/orgs/:slug/members/:userId",ht(["owner","admin","member"]),async e=>{let t=e.get("supabase");if(!t)return e.json({error:"JWT authentication required for this endpoint",code:"JWT_REQUIRED"},401);let n=e.req.param("userId");if(!n||!Gr.test(n))return e.json({error:"Invalid userId path param",code:"BAD_REQUEST"},400);let r=e.get("orgRole"),o=e.get("userId");if(!(n===o)&&!(r==="owner"||r==="admin"))return e.json({error:"Forbidden",code:"ORG_FORBIDDEN"},403);let a=e.get("orgId"),{error:c}=await t.rpc("remove_member",{p_org:a,p_user:n});if(c){let l=zt(c),p=vo(c);if(l==="P0001"){if(/not_a_member/i.test(p))return e.json({error:"Target user is not a member of this organization",code:"NOT_A_MEMBER"},404);if(/last_owner_violation/i.test(p))return e.json({error:"Cannot remove the last owner of this organization",code:"LAST_OWNER"},409);if(/forbidden/i.test(p))return e.json({error:"Forbidden",code:"ORG_FORBIDDEN"},403)}throw c}return e.body(null,204)});O();import{Hono as E$}from"hono";import{z as qo}from"zod";import{eq as Uo,and as OS,asc as x$,sql as T$}from"drizzle-orm";var Ho=new E$,R$=qo.object({name:qo.string().min(1).max(100),slug:qo.string().regex(ra,{message:oa})}),k$=qo.object({name:qo.string().min(1).max(100).optional(),slug:qo.string().regex(ra,{message:oa}).optional()}),j$=qo.object({userId:qo.string().uuid()});Ho.get("/orgs/:slug/teams",ht(["owner","admin","member"]),async e=>{let t=e.get("orgId"),n=await u.select({id:K.id,name:K.name,slug:K.slug,createdAt:K.createdAt,memberCount:T$`count(${ye.userId})::int`}).from(K).leftJoin(ye,Uo(ye.teamId,K.id)).where(Uo(K.orgId,t)).groupBy(K.id,K.name,K.slug,K.createdAt).orderBy(x$(K.name));return e.json(n.map(r=>({id:r.id,name:r.name,slug:r.slug,memberCount:Number(r.memberCount),createdAt:r.createdAt})))});Ho.post("/orgs/:slug/teams",ht(["owner","admin"]),async e=>{let t;try{t=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let n=R$.safeParse(t);if(!n.success)return e.json({error:n.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let r=e.get("orgId"),{name:o,slug:s}=n.data;try{let[i]=await u.insert(K).values({orgId:r,name:o,slug:s}).returning({id:K.id,orgId:K.orgId,name:K.name,slug:K.slug,createdAt:K.createdAt});return e.json({id:i.id,orgId:i.orgId,name:i.name,slug:i.slug,createdAt:i.createdAt,memberCount:0},201)}catch(i){if(zt(i)==="23505")return e.json({error:"Slug already taken",code:"TEAM_SLUG_TAKEN"},409);throw i}});Ho.patch("/orgs/:slug/teams/:teamId",ht(["owner","admin"]),async e=>{let t=await Ds(e);if(!t.ok)return t.response;let n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let r=k$.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let{name:o,slug:s}=r.data;if(o===void 0&&s===void 0)return e.json({error:"At least one of `name` or `slug` is required",code:"BAD_REQUEST"},400);let i={};o!==void 0&&(i.name=o),s!==void 0&&(i.slug=s);try{let[a]=await u.update(K).set(i).where(Uo(K.id,t.team.id)).returning({id:K.id,orgId:K.orgId,name:K.name,slug:K.slug,createdAt:K.createdAt});return e.json({id:a.id,orgId:a.orgId,name:a.name,slug:a.slug,createdAt:a.createdAt})}catch(a){if(zt(a)==="23505")return e.json({error:"Slug already taken",code:"TEAM_SLUG_TAKEN"},409);throw a}});Ho.delete("/orgs/:slug/teams/:teamId",ht(["owner","admin"]),async e=>{let t=await Ds(e);return t.ok?(await u.delete(K).where(Uo(K.id,t.team.id)),e.body(null,204)):t.response});Ho.post("/orgs/:slug/teams/:teamId/members",ht(["owner","admin"]),async e=>{let t=await Ds(e);if(!t.ok)return t.response;let n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let r=j$.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let{userId:o}=r.data,s=e.get("orgId"),[i]=await u.select({userId:Q.userId}).from(Q).where(OS(Uo(Q.userId,o),Uo(Q.orgId,s)));if(!i)return e.json({error:"Target user is not a member of this organization",code:"NOT_ORG_MEMBER"},400);try{await u.insert(ye).values({userId:o,teamId:t.team.id})}catch(a){if(zt(a)==="23505")return e.json({error:"User is already a member of this team",code:"ALREADY_TEAM_MEMBER"},409);throw a}return e.json({userId:o,teamId:t.team.id},201)});Ho.delete("/orgs/:slug/teams/:teamId/members/:userId",ht(["owner","admin"]),async e=>{let t=await Ds(e);if(!t.ok)return t.response;let n=e.req.param("userId");return!n||!Gr.test(n)?e.json({error:"Invalid userId path param",code:"BAD_REQUEST"},400):(await u.delete(ye).where(OS(Uo(ye.teamId,t.team.id),Uo(ye.userId,n))).returning({userId:ye.userId})).length===0?e.json({error:"User is not a member of this team",code:"NOT_TEAM_MEMBER"},404):e.body(null,204)});O();import{Hono as W$}from"hono";import{z as op}from"zod";import{randomBytes as z$}from"node:crypto";import{eq as qn,and as sp,desc as V$,sql as J$,isNull as ia,gt as G$}from"drizzle-orm";import{randomBytes as N$}from"node:crypto";async function mh(e){let t=e.idempotencyKey?` idempotencyKey=${e.idempotencyKey}`:"";return process.stderr.write(`[email:noop] would send to=${e.to} subject=${JSON.stringify(e.subject)}${t}
|
|
1132
|
-
`),{id:`noop-${
|
|
1133
|
-
`)}return"onboarding@resend.dev"}d(
|
|
1136
|
+
end`;async function Os(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{ok:!1,response:e.json({error:"Invalid teamId path param",code:"BAD_REQUEST"},400)};let n=e.get("orgId"),[r]=await u.select({id:K.id,orgId:K.orgId,name:K.name,slug:K.slug,createdAt:K.createdAt}).from(K).where(v$(PS(K.id,t),PS(K.orgId,n)));return r?{ok:!0,team:{id:r.id,orgId:r.orgId,name:r.name,slug:r.slug,createdAt:r.createdAt}}:{ok:!1,response:e.json({error:"Team not found",code:"TEAM_NOT_FOUND"},404)}}d(Os,"loadTeamInOrg");var ra=/^(?=.{3,40}$)[a-z0-9]+(?:-[a-z0-9]+)*$/,oa="Slug must be 3-40 chars, lowercase alphanumerics with single dashes only \u2014 no leading, trailing, or consecutive dashes";var $o=new b$,A$=Lo.object({name:Lo.string().min(1).max(100),slug:Lo.string().regex(ra,{message:oa})}),E$=Lo.object({name:Lo.string().min(1).max(100).optional(),slug:Lo.string().regex(ra,{message:oa}).optional()});$o.post("/orgs",async e=>{let t=e.get("supabase");if(!t)return e.json({error:"JWT authentication required for this endpoint",code:"JWT_REQUIRED"},401);let n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let r=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=zt(a),p=vo(a);if(l==="23505")return e.json({error:"Slug already taken",code:"ORG_SLUG_TAKEN"},409);if(l==="P0001"&&/unauthenticated/i.test(p))return e.json({error:"Unauthenticated",code:"UNAUTHENTICATED"},401);throw a}let c=i;return e.json({id:c.id,name:c.name,slug:c.slug,role:"owner"},201)});$o.get("/orgs",async e=>{let t=e.get("userId"),n=await u.select({id:G.id,name:G.name,slug:G.slug,role:Q.role,createdAt:G.createdAt}).from(Q).innerJoin(G,Kr(Q.orgId,G.id)).where(Kr(Q.userId,t)).orderBy(G.createdAt);return e.json(n.map(r=>({id:r.id,name:r.name,slug:r.slug,role:r.role})))});$o.get("/orgs/:slug",ht(["owner","admin","member"]),async e=>{let t=e.get("orgId"),[n]=await u.select({id:G.id,name:G.name,slug:G.slug,createdAt:G.createdAt}).from(G).where(Kr(G.id,t)),r=await u.select({userId:Q.userId,role:Q.role,joinedAt:Q.createdAt,email:T.email,displayName:T.displayName}).from(Q).leftJoin(T,Kr(Q.userId,T.id)).where(Kr(Q.orgId,t)).orderBy(rp,CS(Q.createdAt)),o=await u.select({id:K.id,name:K.name,slug:K.slug,memberCount:S$`count(${ye.userId})::int`}).from(K).leftJoin(ye,Kr(ye.teamId,K.id)).where(Kr(K.orgId,t)).groupBy(K.id,K.name,K.slug).orderBy(CS(K.name));return e.json({id:n.id,name:n.name,slug:n.slug,createdAt:n.createdAt,members:r.map(s=>({userId:s.userId,email:s.email,displayName:s.displayName,role:s.role,joinedAt:s.joinedAt})),teams:o.map(s=>({id:s.id,name:s.name,slug:s.slug,memberCount:Number(s.memberCount)}))})});$o.patch("/orgs/:slug",ht(["owner","admin"]),async e=>{let t=e.get("orgId"),n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let r=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 u.update(G).set(i).where(Kr(G.id,t)).returning({id:G.id,name:G.name,slug:G.slug});return e.json({id:a.id,name:a.name,slug:a.slug})}catch(a){if(zt(a)==="23505")return e.json({error:"Slug already taken",code:"ORG_SLUG_TAKEN"},409);throw a}});$o.delete("/orgs/:slug",ht(["owner"]),async e=>{let t=e.get("orgId");return await u.delete(G).where(Kr(G.id,t)),e.body(null,204)});var x$=Lo.object({newOwnerId:Lo.string().uuid()});$o.post("/orgs/:slug/transfer",ht(["owner"]),async e=>{let t=e.get("supabase");if(!t)return e.json({error:"JWT authentication required for this endpoint",code:"JWT_REQUIRED"},401);let n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let r=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=zt(a),p=vo(a);if(l==="P0001"){if(/same_user/i.test(p))return e.json({error:"Cannot transfer ownership to yourself",code:"SAME_USER"},400);if(/not_a_member/i.test(p))return e.json({error:"Target user is not a member of this organization",code:"NOT_A_MEMBER"},404);if(/forbidden/i.test(p))return e.json({error:"Forbidden",code:"ORG_FORBIDDEN"},403)}throw a}let c=i;return e.json({orgId:c.orgId,newOwnerId:c.newOwnerId,oldOwnerId:c.oldOwnerId})});D();import{Hono as T$}from"hono";import{z as DS}from"zod";import{eq as nd,and as OS,asc as R$,max as k$,inArray as MS}from"drizzle-orm";var rd=new T$;rd.get("/orgs/:slug/members",ht(["owner","admin"]),async e=>{let t=e.get("orgId"),n=await u.select({userId:Q.userId,role:Q.role,joinedAt:Q.createdAt,email:T.email,displayName:T.displayName}).from(Q).leftJoin(T,nd(Q.userId,T.id)).where(nd(Q.orgId,t)).orderBy(rp,R$(Q.createdAt)),r=n.map(c=>c.userId),o=r.length?await u.select({userId:ye.userId,teamId:K.id,teamName:K.name,teamSlug:K.slug}).from(ye).innerJoin(K,nd(ye.teamId,K.id)).where(OS(nd(K.orgId,t),MS(ye.userId,r))):[],s=new Map;for(let c of o){let l=s.get(c.userId)??[];l.push({id:c.teamId,name:c.teamName,slug:c.teamSlug}),s.set(c.userId,l)}let i=r.length?await u.select({userId:_.userId,lastActiveAt:k$(_.startedAt)}).from(_).where(OS(nd(_.orgId,t),MS(_.userId,r))).groupBy(_.userId):[],a=new Map;for(let c of i)a.set(c.userId,c.lastActiveAt);return e.json(n.map(c=>{let l=a.get(c.userId)??null;return{userId:c.userId,email:c.email,displayName:c.displayName,role:c.role,joinedAt:c.joinedAt,teams:s.get(c.userId)??[],lastActiveAt:l?new Date(l).toISOString():null}}))});var j$=DS.object({role:DS.enum(["owner","admin","member"])});rd.patch("/orgs/:slug/members/:userId",ht(["owner","admin"]),async e=>{let t=e.get("supabase");if(!t)return e.json({error:"JWT authentication required for this endpoint",code:"JWT_REQUIRED"},401);let n=e.req.param("userId");if(!n||!Gr.test(n))return e.json({error:"Invalid userId path param",code:"BAD_REQUEST"},400);let r;try{r=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let o=j$.safeParse(r);if(!o.success)return e.json({error:o.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let s=e.get("orgId"),{data:i,error:a}=await t.rpc("change_member_role",{p_org:s,p_user:n,p_new_role:o.data.role});if(a){let l=zt(a),p=vo(a);if(l==="P0001"){if(/invalid_role/i.test(p))return e.json({error:"Invalid role",code:"INVALID_ROLE"},400);if(/not_a_member/i.test(p))return e.json({error:"Target user is not a member of this organization",code:"NOT_A_MEMBER"},404);if(/last_owner_violation/i.test(p))return e.json({error:"Cannot demote the last owner of this organization",code:"LAST_OWNER"},409);if(/forbidden/i.test(p))return e.json({error:"Forbidden",code:"ORG_FORBIDDEN"},403)}throw a}let c=i;return e.json({userId:c.userId,orgId:c.orgId,role:c.role})});rd.delete("/orgs/:slug/members/:userId",ht(["owner","admin","member"]),async e=>{let t=e.get("supabase");if(!t)return e.json({error:"JWT authentication required for this endpoint",code:"JWT_REQUIRED"},401);let n=e.req.param("userId");if(!n||!Gr.test(n))return e.json({error:"Invalid userId path param",code:"BAD_REQUEST"},400);let r=e.get("orgRole"),o=e.get("userId");if(!(n===o)&&!(r==="owner"||r==="admin"))return e.json({error:"Forbidden",code:"ORG_FORBIDDEN"},403);let a=e.get("orgId"),{error:c}=await t.rpc("remove_member",{p_org:a,p_user:n});if(c){let l=zt(c),p=vo(c);if(l==="P0001"){if(/not_a_member/i.test(p))return e.json({error:"Target user is not a member of this organization",code:"NOT_A_MEMBER"},404);if(/last_owner_violation/i.test(p))return e.json({error:"Cannot remove the last owner of this organization",code:"LAST_OWNER"},409);if(/forbidden/i.test(p))return e.json({error:"Forbidden",code:"ORG_FORBIDDEN"},403)}throw c}return e.body(null,204)});D();import{Hono as N$}from"hono";import{z as qo}from"zod";import{eq as Uo,and as LS,asc as P$,sql as C$}from"drizzle-orm";var Ho=new N$,D$=qo.object({name:qo.string().min(1).max(100),slug:qo.string().regex(ra,{message:oa})}),O$=qo.object({name:qo.string().min(1).max(100).optional(),slug:qo.string().regex(ra,{message:oa}).optional()}),M$=qo.object({userId:qo.string().uuid()});Ho.get("/orgs/:slug/teams",ht(["owner","admin","member"]),async e=>{let t=e.get("orgId"),n=await u.select({id:K.id,name:K.name,slug:K.slug,createdAt:K.createdAt,memberCount:C$`count(${ye.userId})::int`}).from(K).leftJoin(ye,Uo(ye.teamId,K.id)).where(Uo(K.orgId,t)).groupBy(K.id,K.name,K.slug,K.createdAt).orderBy(P$(K.name));return e.json(n.map(r=>({id:r.id,name:r.name,slug:r.slug,memberCount:Number(r.memberCount),createdAt:r.createdAt})))});Ho.post("/orgs/:slug/teams",ht(["owner","admin"]),async e=>{let t;try{t=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let n=D$.safeParse(t);if(!n.success)return e.json({error:n.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let r=e.get("orgId"),{name:o,slug:s}=n.data;try{let[i]=await u.insert(K).values({orgId:r,name:o,slug:s}).returning({id:K.id,orgId:K.orgId,name:K.name,slug:K.slug,createdAt:K.createdAt});return e.json({id:i.id,orgId:i.orgId,name:i.name,slug:i.slug,createdAt:i.createdAt,memberCount:0},201)}catch(i){if(zt(i)==="23505")return e.json({error:"Slug already taken",code:"TEAM_SLUG_TAKEN"},409);throw i}});Ho.patch("/orgs/:slug/teams/:teamId",ht(["owner","admin"]),async e=>{let t=await Os(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{name:o,slug:s}=r.data;if(o===void 0&&s===void 0)return e.json({error:"At least one of `name` or `slug` is required",code:"BAD_REQUEST"},400);let i={};o!==void 0&&(i.name=o),s!==void 0&&(i.slug=s);try{let[a]=await u.update(K).set(i).where(Uo(K.id,t.team.id)).returning({id:K.id,orgId:K.orgId,name:K.name,slug:K.slug,createdAt:K.createdAt});return e.json({id:a.id,orgId:a.orgId,name:a.name,slug:a.slug,createdAt:a.createdAt})}catch(a){if(zt(a)==="23505")return e.json({error:"Slug already taken",code:"TEAM_SLUG_TAKEN"},409);throw a}});Ho.delete("/orgs/:slug/teams/:teamId",ht(["owner","admin"]),async e=>{let t=await Os(e);return t.ok?(await u.delete(K).where(Uo(K.id,t.team.id)),e.body(null,204)):t.response});Ho.post("/orgs/:slug/teams/:teamId/members",ht(["owner","admin"]),async e=>{let t=await Os(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=M$.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let{userId:o}=r.data,s=e.get("orgId"),[i]=await u.select({userId:Q.userId}).from(Q).where(LS(Uo(Q.userId,o),Uo(Q.orgId,s)));if(!i)return e.json({error:"Target user is not a member of this organization",code:"NOT_ORG_MEMBER"},400);try{await u.insert(ye).values({userId:o,teamId:t.team.id})}catch(a){if(zt(a)==="23505")return e.json({error:"User is already a member of this team",code:"ALREADY_TEAM_MEMBER"},409);throw a}return e.json({userId:o,teamId:t.team.id},201)});Ho.delete("/orgs/:slug/teams/:teamId/members/:userId",ht(["owner","admin"]),async e=>{let t=await Os(e);if(!t.ok)return t.response;let n=e.req.param("userId");return!n||!Gr.test(n)?e.json({error:"Invalid userId path param",code:"BAD_REQUEST"},400):(await u.delete(ye).where(LS(Uo(ye.teamId,t.team.id),Uo(ye.userId,n))).returning({userId:ye.userId})).length===0?e.json({error:"User is not a member of this team",code:"NOT_TEAM_MEMBER"},404):e.body(null,204)});D();import{Hono as Y$}from"hono";import{z as cp}from"zod";import{randomBytes as X$}from"node:crypto";import{eq as Un,and as dp,desc as Q$,sql as Z$,isNull as ia,gt as e1}from"drizzle-orm";import{randomBytes as L$}from"node:crypto";async function _h(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}
|
|
1137
|
+
`),{id:`noop-${L$(8).toString("hex")}`,provider:"noop"}}d(_h,"sendNoopEmail");var op=null;async function $$(){if(op)return op;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 op=new t(e),op}d($$,"getClient");var $S=!1;function q$(){let e=process.env.RESEND_FROM_EMAIL;if(e)return e;if(!$S){$S=!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.
|
|
1138
|
+
`)}return"onboarding@resend.dev"}d(q$,"resolveFromEmail");async function qS(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"}}d(qS,"sendResendEmail");async function US(e){throw new Error("SMTP provider not implemented. Set RESEND_API_KEY to use Resend, or unset RULEMETRIC_EMAIL_PROVIDER to fall back to noop.")}d(US,"sendSmtpEmail");var U$="#2DD4BF",H$="#0d9488",B$="#0A0C12",sp="#1a1a1a",ip="#666666",HS="#f5f5f7",F$="#ffffff",BS="#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}`}d(W$,"formatExpiresAt");function sa(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}d(sa,"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."}}d(z$,"roleCopy");function yh(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:c,description:l}=z$(r),p=`<!doctype html>
|
|
1134
1139
|
<html lang="en">
|
|
1135
1140
|
<head>
|
|
1136
1141
|
<meta charset="utf-8" />
|
|
1137
1142
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
1138
1143
|
<title>${sa(i)}</title>
|
|
1139
1144
|
</head>
|
|
1140
|
-
<body style="margin:0;padding:0;background:${
|
|
1141
|
-
<table role="presentation" width="100%" cellspacing="0" cellpadding="0" border="0" style="background:${
|
|
1145
|
+
<body style="margin:0;padding:0;background:${HS};font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;color:${sp};">
|
|
1146
|
+
<table role="presentation" width="100%" cellspacing="0" cellpadding="0" border="0" style="background:${HS};padding:32px 16px;">
|
|
1142
1147
|
<tr>
|
|
1143
1148
|
<td align="center">
|
|
1144
|
-
<table role="presentation" width="560" cellspacing="0" cellpadding="0" border="0" style="max-width:560px;background:${
|
|
1149
|
+
<table role="presentation" width="560" cellspacing="0" cellpadding="0" border="0" style="max-width:560px;background:${F$};border:1px solid ${BS};border-radius:8px;overflow:hidden;">
|
|
1145
1150
|
<tr>
|
|
1146
1151
|
<td style="padding:32px 32px 8px 32px;">
|
|
1147
|
-
<h1 style="margin:0 0 16px 0;font-size:22px;line-height:1.3;font-weight:600;color:${
|
|
1152
|
+
<h1 style="margin:0 0 16px 0;font-size:22px;line-height:1.3;font-weight:600;color:${sp};">
|
|
1148
1153
|
You've been invited to ${sa(t)}
|
|
1149
1154
|
</h1>
|
|
1150
|
-
<p style="margin:0 0 16px 0;font-size:15px;line-height:1.5;color:${
|
|
1155
|
+
<p style="margin:0 0 16px 0;font-size:15px;line-height:1.5;color:${sp};">
|
|
1151
1156
|
Hi there,
|
|
1152
1157
|
</p>
|
|
1153
|
-
<p style="margin:0 0 16px 0;font-size:15px;line-height:1.5;color:${
|
|
1158
|
+
<p style="margin:0 0 16px 0;font-size:15px;line-height:1.5;color:${sp};">
|
|
1154
1159
|
<strong>${sa(n)}</strong> invited you to join
|
|
1155
1160
|
<strong>${sa(t)}</strong> on RuleMetric as ${c}.
|
|
1156
1161
|
</p>
|
|
1157
|
-
<p style="margin:0 0 24px 0;font-size:15px;line-height:1.5;color:${
|
|
1162
|
+
<p style="margin:0 0 24px 0;font-size:15px;line-height:1.5;color:${ip};">
|
|
1158
1163
|
${l}
|
|
1159
1164
|
</p>
|
|
1160
1165
|
</td>
|
|
@@ -1162,27 +1167,27 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1162
1167
|
<tr>
|
|
1163
1168
|
<td align="center" style="padding:0 32px 8px 32px;">
|
|
1164
1169
|
<a href="${sa(o)}"
|
|
1165
|
-
style="display:inline-block;padding:12px 24px;background:${
|
|
1170
|
+
style="display:inline-block;padding:12px 24px;background:${U$};color:${B$};text-decoration:none;border-radius:6px;font-size:15px;font-weight:600;">
|
|
1166
1171
|
Accept invitation
|
|
1167
1172
|
</a>
|
|
1168
1173
|
</td>
|
|
1169
1174
|
</tr>
|
|
1170
1175
|
<tr>
|
|
1171
1176
|
<td style="padding:16px 32px 8px 32px;">
|
|
1172
|
-
<p style="margin:0 0 8px 0;font-size:13px;line-height:1.5;color:${
|
|
1177
|
+
<p style="margin:0 0 8px 0;font-size:13px;line-height:1.5;color:${ip};">
|
|
1173
1178
|
Or copy and paste this link into your browser:
|
|
1174
1179
|
</p>
|
|
1175
|
-
<p style="margin:0 0 24px 0;font-size:13px;line-height:1.5;color:${
|
|
1180
|
+
<p style="margin:0 0 24px 0;font-size:13px;line-height:1.5;color:${H$};word-break:break-all;">
|
|
1176
1181
|
${sa(o)}
|
|
1177
1182
|
</p>
|
|
1178
|
-
<p style="margin:0 0 24px 0;font-size:13px;line-height:1.5;color:${
|
|
1183
|
+
<p style="margin:0 0 24px 0;font-size:13px;line-height:1.5;color:${ip};">
|
|
1179
1184
|
This invitation expires on <strong>${a}</strong>.
|
|
1180
1185
|
</p>
|
|
1181
1186
|
</td>
|
|
1182
1187
|
</tr>
|
|
1183
1188
|
<tr>
|
|
1184
|
-
<td style="padding:16px 32px 32px 32px;border-top:1px solid ${
|
|
1185
|
-
<p style="margin:0;font-size:12px;line-height:1.5;color:${
|
|
1189
|
+
<td style="padding:16px 32px 32px 32px;border-top:1px solid ${BS};">
|
|
1190
|
+
<p style="margin:0;font-size:12px;line-height:1.5;color:${ip};">
|
|
1186
1191
|
If you didn't expect this email, you can safely ignore it. The link will expire on its own.
|
|
1187
1192
|
</p>
|
|
1188
1193
|
</td>
|
|
@@ -1193,11 +1198,11 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1193
1198
|
</table>
|
|
1194
1199
|
</body>
|
|
1195
1200
|
</html>`,m=[`You've been invited to ${t}`,"","Hi there,","",`${n} invited you to join ${t} on RuleMetric as ${c}.`,"",l,"","Accept the invitation:",o,"",`This invitation expires on ${a}.`,"","--","If you didn't expect this email, you can safely ignore it. The link will expire on its own."].join(`
|
|
1196
|
-
`);return{subject:i,html:p,text:m}}d(
|
|
1197
|
-
`)),t){case"resend":return
|
|
1198
|
-
`),
|
|
1199
|
-
`)),t="https://rulemetric.com"):t="http://localhost:5174"),`${t.replace(/\/$/,"")}/invite/${e}`}d(
|
|
1200
|
-
`),rr(t,{tags:{source:"invite-email"},extra:{to:e.to,orgName:e.orgName}}),{sent:!1,reason:n}}}d(zS,"sendInvitationEmail");var K$=op.enum(["admin","member"]),Y$=op.object({email:op.string().email().max(254),role:K$.optional(),teamId:op.string().uuid().optional()});aa.post("/orgs/:slug/invitations",ht(["owner","admin"]),async e=>{let t;try{t=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let n=Y$.safeParse(t);if(!n.success)return e.json({error:n.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let r=e.get("orgId"),o=e.get("userId"),s=n.data.email.toLowerCase(),i=n.data.role??"member",a=n.data.teamId;if(a){let[f]=await u.select({id:K.id}).from(K).where(sp(qn(K.id,a),qn(K.orgId,r)));if(!f)return e.json({error:"Team not found in this organization",code:"INVALID_TEAM"},400)}let c=BS(),l;try{let[f]=await u.insert(ae).values({orgId:r,email:s,role:i,teamId:a??null,invitedBy:o,token:c,expiresAt:new Date(Date.now()+6048e5)}).returning({id:ae.id,email:ae.email,role:ae.role,teamId:ae.teamId,expiresAt:ae.expiresAt});l=f}catch(f){if(zt(f)==="23505")return e.json({error:"A pending invitation for this email already exists",code:"INVITE_ALREADY_PENDING"},409);throw f}let p=FS(c),[m]=await u.select({name:G.name}).from(G).where(qn(G.id,r)),y=await WS(o),v=await zS({to:s,orgName:m?.name??"your organization",inviterName:y,role:l.role,acceptUrl:p,expiresAt:l.expiresAt}),h=process.env.NODE_ENV==="test";return e.json({id:l.id,email:l.email,role:l.role,teamId:l.teamId,expiresAt:l.expiresAt,acceptUrl:p,emailSent:v.sent,...v.sent?{}:{emailError:v.reason},...h?{token:c}:{}},201)});aa.get("/orgs/:slug/invitations",ht(["owner","admin"]),async e=>{let t=e.get("orgId"),n=await u.select({id:ae.id,email:ae.email,role:ae.role,teamId:ae.teamId,teamName:K.name,invitedById:ae.invitedBy,invitedByDisplayName:T.displayName,invitedByEmail:T.email,createdAt:ae.createdAt,expiresAt:ae.expiresAt}).from(ae).leftJoin(K,qn(ae.teamId,K.id)).leftJoin(T,qn(ae.invitedBy,T.id)).where(sp(qn(ae.orgId,t),ia(ae.acceptedAt),ia(ae.revokedAt),G$(ae.expiresAt,J$`now()`))).orderBy(V$(ae.createdAt));return e.json(n.map(r=>({id:r.id,email:r.email,role:r.role,teamId:r.teamId,teamName:r.teamName,invitedById:r.invitedById,invitedByName:r.invitedByDisplayName??r.invitedByEmail??null,createdAt:r.createdAt,expiresAt:r.expiresAt})))});aa.post("/orgs/:slug/invitations/:id/revoke",ht(["owner","admin"]),async e=>{let t=e.req.param("id");if(!t||!Gr.test(t))return e.json({error:"Invalid invitation id",code:"BAD_REQUEST"},400);let n=e.get("orgId");return(await u.update(ae).set({revokedAt:new Date}).where(sp(qn(ae.id,t),qn(ae.orgId,n),ia(ae.acceptedAt),ia(ae.revokedAt))).returning({id:ae.id})).length===0?e.json({error:"Invitation not found",code:"INVITE_NOT_FOUND"},404):e.body(null,204)});aa.post("/orgs/:slug/invitations/:id/resend",ht(["owner","admin"]),async e=>{let t=e.req.param("id");if(!t||!Gr.test(t))return e.json({error:"Invalid invitation id",code:"BAD_REQUEST"},400);let n=e.get("orgId"),r=BS(),o=new Date(Date.now()+10080*60*1e3),s=await u.update(ae).set({token:r,expiresAt:o}).where(sp(qn(ae.id,t),qn(ae.orgId,n),ia(ae.acceptedAt),ia(ae.revokedAt))).returning({id:ae.id,email:ae.email,role:ae.role,expiresAt:ae.expiresAt});if(s.length===0)return e.json({error:"Invitation not found",code:"INVITE_NOT_FOUND"},404);let i=s[0],a=FS(r),c=e.get("userId"),[l]=await u.select({name:G.name}).from(G).where(qn(G.id,n)),p=await WS(c),m=await zS({to:i.email,orgName:l?.name??"your organization",inviterName:p,role:i.role,acceptUrl:a,expiresAt:i.expiresAt}),y=process.env.NODE_ENV==="test";return e.json({id:i.id,email:i.email,expiresAt:i.expiresAt,acceptUrl:a,emailSent:m.sent,...m.sent?{}:{emailError:m.reason},...y?{token:r}:{}})});O();import{Hono as X$}from"hono";import{eq as td,and as JS,sql as GS,inArray as gh,gte as KS}from"drizzle-orm";var ap=new X$,ip={"7d":7,"30d":30},VS={fully_achieved:1,mostly_achieved:.75,partially_achieved:.5,unclear_from_transcript:.25,not_achieved:0};async function hh(e,t,n,r,o,s){let i=new Map;for(let A of e)i.set(A.tool,(i.get(A.tool)??0)+1);let a=[...i.entries()].sort((A,E)=>E[1]-A[1]).slice(0,5).map(([A,E])=>({tool:A,count:E})),c=new Map;for(let A of e)c.set(A.userId,(c.get(A.userId)??0)+1);let l=[...c.entries()].sort((A,E)=>E[1]-A[1]).slice(0,5).map(([A])=>A),p=l.length?await u.select({id:T.id,displayName:T.displayName,email:T.email}).from(T).where(gh(T.id,l)):[],m=new Map(p.map(A=>[A.id,A])),y=l.map(A=>{let E=m.get(A);return{userId:A,displayName:E?.displayName??null,email:E?.email??null,count:c.get(A)??0}}),v=new Map;for(let A of e){let E=A.analysis;if(!E)continue;let R=E.friction;if(!R)continue;let D=Object.values(R).reduce(($,H)=>$+(typeof H=="number"?H:0),0),j=A.startedAt.toISOString().split("T")[0]??"",P=v.get(j)??{sum:0,count:0};P.sum+=D,P.count+=1,v.set(j,P)}let h=[...v.entries()].sort(([A],[E])=>A<E?-1:1).map(([A,{sum:E,count:R}])=>({day:A,avgFriction:Math.round(E/R*100)/100})),f=e.map(A=>A.id),w=f.length?await u.select({sessionId:se.sessionId,instructionId:se.instructionId,name:g.name,source:GS`${g.frontmatter}->>'source'`}).from(se).innerJoin(g,td(g.id,se.instructionId)).where(gh(se.sessionId,f)):[],b=new Map;for(let A of w){let E=b.get(A.instructionId);E?E.sessions.add(A.sessionId):b.set(A.instructionId,{name:A.name,source:A.source,sessions:new Set([A.sessionId])})}let I=new Map;for(let A of e){let E=A.analysis;if(!E)continue;let R=E.outcome;R&&R in VS&&I.set(A.id,VS[R])}let S=[];for(let[A,{name:E,source:R,sessions:D}]of b){let j=[],P=[];for(let _e of e){let ee=I.get(_e.id);ee!==void 0&&(D.has(_e.id)?j.push(ee):P.push(ee))}let $=d(_e=>_e.length===0?null:_e.reduce((ee,Re)=>ee+Re,0)/_e.length,"avg"),H=$(j),B=$(P),te=H!==null&&B!==null?Math.round((H-B)*1e3)/10:null;S.push({instructionId:A,name:E,source:R,withSessions:D.size,withoutSessions:e.length-D.size,deltaPct:te})}return{range:t,sessionCount:e.length,memberCount:n,topTools:a,topMembers:y,frictionTrend:h,instructionEffectiveness:S}}d(hh,"buildActivityResponse");ap.get("/orgs/:slug/activity",ht(["owner","admin","member"]),async e=>{let t=e.get("orgId"),n=e.req.query("range")??"7d";if(!(n in ip))return e.json({error:"Invalid range. Allowed: 7d, 30d",code:"BAD_REQUEST"},400);let r=new Date(Date.now()-ip[n]*24*60*60*1e3),o=await u.select({id:_.id,userId:_.userId,tool:_.tool,startedAt:_.startedAt,analysis:_.analysis}).from(_).where(JS(td(_.orgId,t),KS(_.startedAt,r))),[{count:s}]=await u.select({count:GS`count(*)::int`}).from(Q).where(td(Q.orgId,t)),i=await hh(o,n,Number(s),t,r,null);return e.json(i)});ap.get("/orgs/:slug/teams/:teamId/activity",ht(["owner","admin","member"]),async e=>{let t=await Ds(e);if(!t.ok)return t.response;let n=t.team,r=e.req.query("range")??"7d";if(!(r in ip))return e.json({error:"Invalid range. Allowed: 7d, 30d",code:"BAD_REQUEST"},400);let o=new Date(Date.now()-ip[r]*24*60*60*1e3),s=e.get("orgId"),a=(await u.select({userId:ye.userId}).from(ye).where(td(ye.teamId,n.id))).map(p=>p.userId);if(a.length===0){let p=await hh([],r,0,s,o,[]);return e.json(p)}let c=await u.select({id:_.id,userId:_.userId,tool:_.tool,startedAt:_.startedAt,analysis:_.analysis}).from(_).where(JS(td(_.orgId,s),KS(_.startedAt,o),gh(_.userId,a))),l=await hh(c,r,a.length,s,o,a);return e.json(l)});var Bo=new Q$;Bo.route("/",$o);Bo.route("/",ed);Bo.route("/",Ho);Bo.route("/",aa);Bo.route("/",ap);O();import{Hono as Z$}from"hono";import{z as _h}from"zod";import{createClient as e1}from"@supabase/supabase-js";import{eq as nd,and as YS,isNull as XS,sql as QS}from"drizzle-orm";var rd=new Z$;rd.get("/:token",async e=>{let t=e.req.param("token");if(!t||t.length<8)return e.json({error:"Invitation no longer valid",code:"INVITE_GONE"},410);let[n]=await u.select({orgName:G.name,role:ae.role,email:ae.email,acceptedAt:ae.acceptedAt,revokedAt:ae.revokedAt,expiresAt:ae.expiresAt,inviterDisplayName:T.displayName,inviterEmail:T.email}).from(ae).innerJoin(G,nd(ae.orgId,G.id)).leftJoin(T,nd(ae.invitedBy,T.id)).where(nd(ae.token,t));if(!n)return e.json({error:"Invitation no longer valid",code:"INVITE_GONE"},410);let r=Date.now(),o=new Date(n.expiresAt).getTime()<r;if(n.acceptedAt||n.revokedAt||o)return e.json({error:"Invitation no longer valid",code:"INVITE_GONE"},410);let s=null,i,a=e.req.header("Authorization");if(a?.startsWith("Bearer ")){let l=a.slice(7);if(l&&!l.startsWith("rm_"))try{let p=e1(process.env.SUPABASE_URL,process.env.SUPABASE_ANON_KEY,{global:{headers:{Authorization:`Bearer ${l}`}}}),{data:m,error:y}=await p.auth.getUser();!y&&m.user&&(s=m.user.id,i=m.user.email)}catch{}}let c=null;if(s&&i&&i.toLowerCase()===n.email.toLowerCase()){let[{cnt:l}]=await u.select({cnt:QS`count(*)::int`}).from(_).where(YS(nd(_.userId,s),XS(_.orgId)));c=Number(l)}return e.json({orgName:n.orgName,inviterName:n.inviterDisplayName??n.inviterEmail??null,role:n.role,sessionCount:c})});var t1=_h.object({token:_h.string().min(1),acknowledgedSessionCount:_h.number().int().nonnegative()});rd.post("/accept",async e=>{let t=e.get("supabase");if(!t)return e.json({error:"JWT authentication required for this endpoint",code:"JWT_REQUIRED"},401);let n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let r=t1.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let o=e.get("userId");if(o){let[{cnt:c}]=await u.select({cnt:QS`count(*)::int`}).from(_).where(YS(nd(_.userId,o),XS(_.orgId))),l=Number(c);if(l>r.data.acknowledgedSessionCount)return e.json({error:"Session count changed since you reviewed the consent notice \u2014 please re-confirm",code:"SESSION_COUNT_CHANGED",currentSessionCount:l},409)}let{data:s,error:i}=await t.rpc("accept_invitation",{p_token:r.data.token});if(i){let c=zt(i),l=vo(i);if(c==="P0001"){if(/invitation_not_found/i.test(l))return e.json({error:"Invitation not found",code:"INVITE_NOT_FOUND"},404);if(/invitation_revoked/i.test(l))return e.json({error:"Invitation no longer valid",code:"INVITE_GONE"},410);if(/invitation_already_accepted/i.test(l))return e.json({error:"Invitation no longer valid",code:"INVITE_GONE"},410);if(/invitation_expired/i.test(l))return e.json({error:"Invitation no longer valid",code:"INVITE_GONE"},410);if(/invitation_email_mismatch/i.test(l))return e.json({error:"This invitation is for a different email address",code:"INVITE_EMAIL_MISMATCH"},403);if(/already_member/i.test(l))return e.json({error:"You are already a member of this organization",code:"ALREADY_MEMBER"},409);if(/already_team_member/i.test(l))return e.json({error:"You are already a member of this team",code:"ALREADY_TEAM_MEMBER"},409);if(/unauthenticated/i.test(l))return e.json({error:"Unauthenticated",code:"UNAUTHENTICATED"},401)}throw i}let a=s;return e.json({orgId:a.orgId,role:a.role})});O();import{Hono as n1}from"hono";import{z as od}from"zod";import{eq as sd,and as r1}from"drizzle-orm";var id=new n1;id.get("/profile",async e=>{let t=e.get("userId"),[n]=await u.select({id:T.id,email:T.email,displayName:T.displayName,activeOrgId:T.activeOrgId,isSuperadmin:T.isSuperadmin,claudeCodePlan:T.claudeCodePlan,planSource:T.planSource,setupCompletedAt:T.setupCompletedAt,liveSendSkipped:T.liveSendSkipped}).from(T).where(sd(T.id,t));return n?(e.header("Cache-Control","private, max-age=15"),e.json({id:n.id,email:n.email,displayName:n.displayName,activeOrgId:n.activeOrgId,isSuperadmin:n.isSuperadmin,claudeCodePlan:n.claudeCodePlan,planSource:n.planSource,setupCompletedAt:n.setupCompletedAt,liveSendSkipped:n.liveSendSkipped})):e.json({error:"Profile not found",code:"PROFILE_NOT_FOUND"},404)});var o1=["free","pro","max_5x","max_20x"],s1=od.object({activeOrgId:od.string().uuid().nullable().optional(),claudeCodePlan:od.enum(o1).nullable().optional(),setupCompletedAt:od.string().datetime().nullable().optional(),liveSendSkipped:od.boolean().optional()});id.patch("/profile",async e=>{let t=e.get("userId"),n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let r=s1.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let o=r.data;if("activeOrgId"in o&&o.activeOrgId!=null){let[a]=await u.select({orgId:Q.orgId}).from(Q).where(r1(sd(Q.userId,t),sd(Q.orgId,o.activeOrgId)));if(!a)return e.json({error:"You are not a member of the requested organization",code:"NOT_A_MEMBER"},403)}let s={};"activeOrgId"in o&&(s.activeOrgId=o.activeOrgId??null),"claudeCodePlan"in o&&(s.claudeCodePlan=o.claudeCodePlan??null,s.planSource=o.claudeCodePlan==null?"detected":"manual"),"setupCompletedAt"in o&&(s.setupCompletedAt=o.setupCompletedAt?new Date(o.setupCompletedAt):null),"liveSendSkipped"in o&&(s.liveSendSkipped=o.liveSendSkipped),Object.keys(s).length>0&&await u.update(T).set(s).where(sd(T.id,t));let[i]=await u.select({activeOrgId:T.activeOrgId,claudeCodePlan:T.claudeCodePlan,planSource:T.planSource,setupCompletedAt:T.setupCompletedAt,liveSendSkipped:T.liveSendSkipped}).from(T).where(sd(T.id,t));return e.json({activeOrgId:i.activeOrgId,claudeCodePlan:i.claudeCodePlan,planSource:i.planSource,setupCompletedAt:i.setupCompletedAt,liveSendSkipped:i.liveSendSkipped})});O();import{Hono as a1}from"hono";import{z as _t}from"zod";import{asc as ZS,eq as Ms,sql as Un}from"drizzle-orm";O();import{eq as i1}from"drizzle-orm";function ad(){return async(e,t)=>{let n=e.get("userId");if(!n)return e.json({error:"Unauthenticated",code:"UNAUTHENTICATED"},401);let[r]=await u.select({isSuperadmin:T.isSuperadmin}).from(T).where(i1(T.id,n));if(!r?.isSuperadmin)return e.json({error:"Forbidden",code:"NOT_SUPERADMIN"},403);await t()}}d(ad,"requireSuperadmin");Pc();var fn=new a1;fn.use("/superadmin/*",ad());var c1=_t.object({search:_t.string().trim().min(1).max(120).optional(),limit:_t.coerce.number().int().min(1).max(200).default(50),offset:_t.coerce.number().int().min(0).default(0)});fn.get("/superadmin/users",async e=>{let t=c1.safeParse({search:e.req.query("search"),limit:e.req.query("limit"),offset:e.req.query("offset")});if(!t.success)return e.json({error:t.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let{search:n,limit:r,offset:o}=t.data,s=await u.execute(Un`
|
|
1201
|
+
`);return{subject:i,html:p,text:m}}d(yh,"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"}d(V$,"selectEmailProvider");var J$=new Set(["test","example","invalid","localhost"]),G$=/^example\.(com|net|org)$/;function K$(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)||G$.test(r))}d(K$,"isUndeliverableRecipient");var FS=!1;async function ap(e){let t=V$();switch(FS||(FS=!0,process.stderr.write(`[email] active provider: ${t}
|
|
1202
|
+
`)),t){case"resend":return K$(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
|
|
1203
|
+
`),_h(e)):qS(e);case"smtp":return US(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 _h(e)}}d(ap,"sendEmail");var aa=new Y$;function zS(){return X$(32).toString("base64url")}d(zS,"generateInviteToken");var WS=!1;function VS(e){let t=process.env.WEB_URL??process.env.RULEMETRIC_WEB_URL;return t||(process.env.NODE_ENV==="production"?(WS||(WS=!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
|
|
1204
|
+
`)),t="https://rulemetric.com"):t="http://localhost:5174"),`${t.replace(/\/$/,"")}/invite/${e}`}d(VS,"buildAcceptUrl");async function JS(e){let[t]=await u.select({displayName:T.displayName,email:T.email}).from(T).where(Un(T.id,e));return t?.displayName?.trim()||t?.email||"A teammate"}d(JS,"getInviterDisplayName");async function GS(e){try{let{subject:t,html:n,text:r}=yh({orgName:e.orgName,inviterName:e.inviterName,role:e.role,acceptUrl:e.acceptUrl,expiresAt:e.expiresAt});return(await ap({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}
|
|
1205
|
+
`),rr(t,{tags:{source:"invite-email"},extra:{to:e.to,orgName:e.orgName}}),{sent:!1,reason:n}}}d(GS,"sendInvitationEmail");var t1=cp.enum(["admin","member"]),n1=cp.object({email:cp.string().email().max(254),role:t1.optional(),teamId:cp.string().uuid().optional()});aa.post("/orgs/:slug/invitations",ht(["owner","admin"]),async e=>{let t;try{t=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let n=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[f]=await u.select({id:K.id}).from(K).where(dp(Un(K.id,a),Un(K.orgId,r)));if(!f)return e.json({error:"Team not found in this organization",code:"INVALID_TEAM"},400)}let c=zS(),l;try{let[f]=await u.insert(ae).values({orgId:r,email:s,role:i,teamId:a??null,invitedBy:o,token:c,expiresAt:new Date(Date.now()+6048e5)}).returning({id:ae.id,email:ae.email,role:ae.role,teamId:ae.teamId,expiresAt:ae.expiresAt});l=f}catch(f){if(zt(f)==="23505")return e.json({error:"A pending invitation for this email already exists",code:"INVITE_ALREADY_PENDING"},409);throw f}let p=VS(c),[m]=await u.select({name:G.name}).from(G).where(Un(G.id,r)),y=await JS(o),v=await GS({to:s,orgName:m?.name??"your organization",inviterName:y,role:l.role,acceptUrl:p,expiresAt:l.expiresAt}),h=process.env.NODE_ENV==="test";return e.json({id:l.id,email:l.email,role:l.role,teamId:l.teamId,expiresAt:l.expiresAt,acceptUrl:p,emailSent:v.sent,...v.sent?{}:{emailError:v.reason},...h?{token:c}:{}},201)});aa.get("/orgs/:slug/invitations",ht(["owner","admin"]),async e=>{let t=e.get("orgId"),n=await u.select({id:ae.id,email:ae.email,role:ae.role,teamId:ae.teamId,teamName:K.name,invitedById:ae.invitedBy,invitedByDisplayName:T.displayName,invitedByEmail:T.email,createdAt:ae.createdAt,expiresAt:ae.expiresAt}).from(ae).leftJoin(K,Un(ae.teamId,K.id)).leftJoin(T,Un(ae.invitedBy,T.id)).where(dp(Un(ae.orgId,t),ia(ae.acceptedAt),ia(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})))});aa.post("/orgs/:slug/invitations/:id/revoke",ht(["owner","admin"]),async e=>{let t=e.req.param("id");if(!t||!Gr.test(t))return e.json({error:"Invalid invitation id",code:"BAD_REQUEST"},400);let n=e.get("orgId");return(await u.update(ae).set({revokedAt:new Date}).where(dp(Un(ae.id,t),Un(ae.orgId,n),ia(ae.acceptedAt),ia(ae.revokedAt))).returning({id:ae.id})).length===0?e.json({error:"Invitation not found",code:"INVITE_NOT_FOUND"},404):e.body(null,204)});aa.post("/orgs/:slug/invitations/:id/resend",ht(["owner","admin"]),async e=>{let t=e.req.param("id");if(!t||!Gr.test(t))return e.json({error:"Invalid invitation id",code:"BAD_REQUEST"},400);let n=e.get("orgId"),r=zS(),o=new Date(Date.now()+10080*60*1e3),s=await u.update(ae).set({token:r,expiresAt:o}).where(dp(Un(ae.id,t),Un(ae.orgId,n),ia(ae.acceptedAt),ia(ae.revokedAt))).returning({id:ae.id,email:ae.email,role:ae.role,expiresAt:ae.expiresAt});if(s.length===0)return e.json({error:"Invitation not found",code:"INVITE_NOT_FOUND"},404);let i=s[0],a=VS(r),c=e.get("userId"),[l]=await u.select({name:G.name}).from(G).where(Un(G.id,n)),p=await JS(c),m=await GS({to:i.email,orgName:l?.name??"your organization",inviterName:p,role:i.role,acceptUrl:a,expiresAt:i.expiresAt}),y=process.env.NODE_ENV==="test";return e.json({id:i.id,email:i.email,expiresAt:i.expiresAt,acceptUrl:a,emailSent:m.sent,...m.sent?{}:{emailError:m.reason},...y?{token:r}:{}})});D();import{Hono as r1}from"hono";import{eq as od,and as YS,sql as XS,inArray as wh,gte as QS}from"drizzle-orm";var lp=new r1,up={"7d":7,"30d":30},KS={fully_achieved:1,mostly_achieved:.75,partially_achieved:.5,unclear_from_transcript:.25,not_achieved:0};async function vh(e,t,n,r,o,s){let i=new Map;for(let A of e)i.set(A.tool,(i.get(A.tool)??0)+1);let a=[...i.entries()].sort((A,E)=>E[1]-A[1]).slice(0,5).map(([A,E])=>({tool:A,count:E})),c=new Map;for(let A of e)c.set(A.userId,(c.get(A.userId)??0)+1);let l=[...c.entries()].sort((A,E)=>E[1]-A[1]).slice(0,5).map(([A])=>A),p=l.length?await u.select({id:T.id,displayName:T.displayName,email:T.email}).from(T).where(wh(T.id,l)):[],m=new Map(p.map(A=>[A.id,A])),y=l.map(A=>{let E=m.get(A);return{userId:A,displayName:E?.displayName??null,email:E?.email??null,count:c.get(A)??0}}),v=new Map;for(let A of e){let E=A.analysis;if(!E)continue;let R=E.friction;if(!R)continue;let O=Object.values(R).reduce(($,H)=>$+(typeof H=="number"?H:0),0),j=A.startedAt.toISOString().split("T")[0]??"",P=v.get(j)??{sum:0,count:0};P.sum+=O,P.count+=1,v.set(j,P)}let h=[...v.entries()].sort(([A],[E])=>A<E?-1:1).map(([A,{sum:E,count:R}])=>({day:A,avgFriction:Math.round(E/R*100)/100})),f=e.map(A=>A.id),w=f.length?await u.select({sessionId:se.sessionId,instructionId:se.instructionId,name:g.name,source:XS`${g.frontmatter}->>'source'`}).from(se).innerJoin(g,od(g.id,se.instructionId)).where(wh(se.sessionId,f)):[],b=new Map;for(let A of w){let E=b.get(A.instructionId);E?E.sessions.add(A.sessionId):b.set(A.instructionId,{name:A.name,source:A.source,sessions:new Set([A.sessionId])})}let I=new Map;for(let A of e){let E=A.analysis;if(!E)continue;let R=E.outcome;R&&R in KS&&I.set(A.id,KS[R])}let S=[];for(let[A,{name:E,source:R,sessions:O}]of b){let j=[],P=[];for(let _e of e){let te=I.get(_e.id);te!==void 0&&(O.has(_e.id)?j.push(te):P.push(te))}let $=d(_e=>_e.length===0?null:_e.reduce((te,Re)=>te+Re,0)/_e.length,"avg"),H=$(j),B=$(P),ee=H!==null&&B!==null?Math.round((H-B)*1e3)/10:null;S.push({instructionId:A,name:E,source:R,withSessions:O.size,withoutSessions:e.length-O.size,deltaPct:ee})}return{range:t,sessionCount:e.length,memberCount:n,topTools:a,topMembers:y,frictionTrend:h,instructionEffectiveness:S}}d(vh,"buildActivityResponse");lp.get("/orgs/:slug/activity",ht(["owner","admin","member"]),async e=>{let t=e.get("orgId"),n=e.req.query("range")??"7d";if(!(n in up))return e.json({error:"Invalid range. Allowed: 7d, 30d",code:"BAD_REQUEST"},400);let r=new Date(Date.now()-up[n]*24*60*60*1e3),o=await u.select({id:_.id,userId:_.userId,tool:_.tool,startedAt:_.startedAt,analysis:_.analysis}).from(_).where(YS(od(_.orgId,t),QS(_.startedAt,r))),[{count:s}]=await u.select({count:XS`count(*)::int`}).from(Q).where(od(Q.orgId,t)),i=await vh(o,n,Number(s),t,r,null);return e.json(i)});lp.get("/orgs/:slug/teams/:teamId/activity",ht(["owner","admin","member"]),async e=>{let t=await Os(e);if(!t.ok)return t.response;let n=t.team,r=e.req.query("range")??"7d";if(!(r in up))return e.json({error:"Invalid range. Allowed: 7d, 30d",code:"BAD_REQUEST"},400);let o=new Date(Date.now()-up[r]*24*60*60*1e3),s=e.get("orgId"),a=(await u.select({userId:ye.userId}).from(ye).where(od(ye.teamId,n.id))).map(p=>p.userId);if(a.length===0){let p=await vh([],r,0,s,o,[]);return e.json(p)}let c=await u.select({id:_.id,userId:_.userId,tool:_.tool,startedAt:_.startedAt,analysis:_.analysis}).from(_).where(YS(od(_.orgId,s),QS(_.startedAt,o),wh(_.userId,a))),l=await vh(c,r,a.length,s,o,a);return e.json(l)});var Bo=new o1;Bo.route("/",$o);Bo.route("/",rd);Bo.route("/",Ho);Bo.route("/",aa);Bo.route("/",lp);D();import{Hono as s1}from"hono";import{z as Ih}from"zod";import{createClient as i1}from"@supabase/supabase-js";import{eq as sd,and as ZS,isNull as eA,sql as tA}from"drizzle-orm";var id=new s1;id.get("/:token",async e=>{let t=e.req.param("token");if(!t||t.length<8)return e.json({error:"Invitation no longer valid",code:"INVITE_GONE"},410);let[n]=await u.select({orgName:G.name,role:ae.role,email:ae.email,acceptedAt:ae.acceptedAt,revokedAt:ae.revokedAt,expiresAt:ae.expiresAt,inviterDisplayName:T.displayName,inviterEmail:T.email}).from(ae).innerJoin(G,sd(ae.orgId,G.id)).leftJoin(T,sd(ae.invitedBy,T.id)).where(sd(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:m,error:y}=await p.auth.getUser();!y&&m.user&&(s=m.user.id,i=m.user.email)}catch{}}let c=null;if(s&&i&&i.toLowerCase()===n.email.toLowerCase()){let[{cnt:l}]=await u.select({cnt:tA`count(*)::int`}).from(_).where(ZS(sd(_.userId,s),eA(_.orgId)));c=Number(l)}return e.json({orgName:n.orgName,inviterName:n.inviterDisplayName??n.inviterEmail??null,role:n.role,sessionCount:c})});var a1=Ih.object({token:Ih.string().min(1),acknowledgedSessionCount:Ih.number().int().nonnegative()});id.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:c}]=await u.select({cnt:tA`count(*)::int`}).from(_).where(ZS(sd(_.userId,o),eA(_.orgId))),l=Number(c);if(l>r.data.acknowledgedSessionCount)return e.json({error:"Session count changed since you reviewed the consent notice \u2014 please re-confirm",code:"SESSION_COUNT_CHANGED",currentSessionCount:l},409)}let{data:s,error:i}=await t.rpc("accept_invitation",{p_token:r.data.token});if(i){let c=zt(i),l=vo(i);if(c==="P0001"){if(/invitation_not_found/i.test(l))return e.json({error:"Invitation not found",code:"INVITE_NOT_FOUND"},404);if(/invitation_revoked/i.test(l))return e.json({error:"Invitation no longer valid",code:"INVITE_GONE"},410);if(/invitation_already_accepted/i.test(l))return e.json({error:"Invitation no longer valid",code:"INVITE_GONE"},410);if(/invitation_expired/i.test(l))return e.json({error:"Invitation no longer valid",code:"INVITE_GONE"},410);if(/invitation_email_mismatch/i.test(l))return e.json({error:"This invitation is for a different email address",code:"INVITE_EMAIL_MISMATCH"},403);if(/already_member/i.test(l))return e.json({error:"You are already a member of this organization",code:"ALREADY_MEMBER"},409);if(/already_team_member/i.test(l))return e.json({error:"You are already a member of this team",code:"ALREADY_TEAM_MEMBER"},409);if(/unauthenticated/i.test(l))return e.json({error:"Unauthenticated",code:"UNAUTHENTICATED"},401)}throw i}let a=s;return e.json({orgId:a.orgId,role:a.role})});D();import{Hono as c1}from"hono";import{z as ad}from"zod";import{eq as cd,and as d1}from"drizzle-orm";var dd=new c1;dd.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(cd(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=ad.object({activeOrgId:ad.string().uuid().nullable().optional(),claudeCodePlan:ad.enum(u1).nullable().optional(),setupCompletedAt:ad.string().datetime().nullable().optional(),liveSendSkipped:ad.boolean().optional()});dd.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:Q.orgId}).from(Q).where(d1(cd(Q.userId,t),cd(Q.orgId,o.activeOrgId)));if(!a)return e.json({error:"You are not a member of the requested organization",code:"NOT_A_MEMBER"},403)}let s={};"activeOrgId"in o&&(s.activeOrgId=o.activeOrgId??null),"claudeCodePlan"in o&&(s.claudeCodePlan=o.claudeCodePlan??null,s.planSource=o.claudeCodePlan==null?"detected":"manual"),"setupCompletedAt"in o&&(s.setupCompletedAt=o.setupCompletedAt?new Date(o.setupCompletedAt):null),"liveSendSkipped"in o&&(s.liveSendSkipped=o.liveSendSkipped),Object.keys(s).length>0&&await u.update(T).set(s).where(cd(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(cd(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 _t}from"zod";import{asc as nA,eq as Ms,sql as Hn}from"drizzle-orm";D();import{eq as p1}from"drizzle-orm";function ud(){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()}}d(ud,"requireSuperadmin");Cc();var fn=new m1;fn.use("/superadmin/*",ud());var f1=_t.object({search:_t.string().trim().min(1).max(120).optional(),limit:_t.coerce.number().int().min(1).max(200).default(50),offset:_t.coerce.number().int().min(0).default(0)});fn.get("/superadmin/users",async e=>{let t=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(Hn`
|
|
1201
1206
|
select
|
|
1202
1207
|
p.id,
|
|
1203
1208
|
p.email,
|
|
@@ -1219,16 +1224,16 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1219
1224
|
count(*) filter (where org_id is null)::int as orphan
|
|
1220
1225
|
from sessions group by user_id
|
|
1221
1226
|
) s on s.user_id = p.id
|
|
1222
|
-
${n?
|
|
1227
|
+
${n?Hn`where p.email ilike ${"%"+ot(n)+"%"}`:Hn``}
|
|
1223
1228
|
order by p.created_at desc
|
|
1224
1229
|
limit ${r} offset ${o}
|
|
1225
|
-
`),[{total:i}]=await u.execute(
|
|
1230
|
+
`),[{total:i}]=await u.execute(Hn`
|
|
1226
1231
|
select count(*)::int as total from profiles p
|
|
1227
|
-
${n?
|
|
1228
|
-
`);return e.json({users:s,total:i,limit:r,offset:o})});fn.get("/superadmin/users/:id",async e=>{let t=e.req.param("id");if(!_t.string().uuid().safeParse(t).success)return e.json({error:"Invalid user id",code:"VALIDATION_ERROR"},400);let[n]=await u.select({id:T.id,email:T.email,displayName:T.displayName,isSuperadmin:T.isSuperadmin,activeOrgId:T.activeOrgId,createdAt:T.createdAt}).from(T).where(Ms(T.id,t));if(!n)return e.json({error:"User not found",code:"USER_NOT_FOUND"},404);let r=await u.select({orgId:G.id,orgName:G.name,orgSlug:G.slug,role:Q.role}).from(Q).innerJoin(G,Ms(G.id,Q.orgId)).where(Ms(Q.userId,t)).orderBy(
|
|
1232
|
+
${n?Hn`where p.email ilike ${"%"+ot(n)+"%"}`:Hn``}
|
|
1233
|
+
`);return e.json({users:s,total:i,limit:r,offset:o})});fn.get("/superadmin/users/:id",async e=>{let t=e.req.param("id");if(!_t.string().uuid().safeParse(t).success)return e.json({error:"Invalid user id",code:"VALIDATION_ERROR"},400);let[n]=await u.select({id:T.id,email:T.email,displayName:T.displayName,isSuperadmin:T.isSuperadmin,activeOrgId:T.activeOrgId,createdAt:T.createdAt}).from(T).where(Ms(T.id,t));if(!n)return e.json({error:"User not found",code:"USER_NOT_FOUND"},404);let r=await u.select({orgId:G.id,orgName:G.name,orgSlug:G.slug,role:Q.role}).from(Q).innerJoin(G,Ms(G.id,Q.orgId)).where(Ms(Q.userId,t)).orderBy(nA(G.name)),[o]=await u.select({total:Hn`count(*)::int`,orphan:Hn`count(*) filter (where org_id is null)::int`}).from(_).where(Ms(_.userId,t)),s={banned:!1,bannedUntil:null,lastSignInAt:null};try{let{data:i,error:a}=await Cn().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 rA(e){let[t]=await u.execute(Hn`
|
|
1229
1234
|
select count(*)::int as n from profiles
|
|
1230
1235
|
where is_superadmin = true and id <> ${e}
|
|
1231
|
-
`);return t?.n??0}d(
|
|
1236
|
+
`);return t?.n??0}d(rA,"countOtherSuperadmins");fn.post("/superadmin/users/:id/force-logout",async e=>{let t=e.req.param("id");if(!_t.string().uuid().safeParse(t).success)return e.json({error:"Invalid user id",code:"VALIDATION_ERROR"},400);if(t===e.get("userId"))return e.json({error:"Cannot force-logout yourself",code:"SELF_ACTION_FORBIDDEN"},400);try{await u.execute(Hn`update auth.refresh_tokens set revoked = true where user_id = ${t}`),await u.execute(Hn`delete from auth.sessions where user_id = ${t}`)}catch(n){return e.json({error:n.message,code:"AUTH_ADMIN_ERROR"},400)}return e.json({ok:!0})});fn.post("/superadmin/users/:id/reset-password",async e=>{let t=e.req.param("id");if(!_t.string().uuid().safeParse(t).success)return e.json({error:"Invalid user id",code:"VALIDATION_ERROR"},400);let[n]=await u.select({email:T.email}).from(T).where(Ms(T.id,t));if(!n?.email)return e.json({error:"User not found",code:"USER_NOT_FOUND"},404);let{data:r,error:o}=await Cn().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=_t.object({suspended:_t.boolean()});fn.patch("/superadmin/users/:id/suspend",async e=>{let t=e.req.param("id");if(!_t.string().uuid().safeParse(t).success)return e.json({error:"Invalid user id",code:"VALIDATION_ERROR"},400);if(t===e.get("userId"))return e.json({error:"Cannot suspend yourself",code:"SELF_ACTION_FORBIDDEN"},400);let n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON",code:"VALIDATION_ERROR"},400)}let r=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(Ms(T.id,t));if(a?.isSuperadmin&&await rA(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 Cn().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=_t.object({confirmEmail:_t.string().email()});fn.delete("/superadmin/users/:id",async e=>{let t=e.req.param("id");if(!_t.string().uuid().safeParse(t).success)return e.json({error:"Invalid user id",code:"VALIDATION_ERROR"},400);if(t===e.get("userId"))return e.json({error:"Cannot delete yourself",code:"SELF_ACTION_FORBIDDEN"},400);let n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON",code:"VALIDATION_ERROR"},400)}let r=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(Ms(T.id,t));if(!o)return e.json({error:"User not found",code:"USER_NOT_FOUND"},404);if(o.email?.toLowerCase()!==r.data.confirmEmail.toLowerCase())return e.json({error:"confirmEmail does not match",code:"CONFIRMATION_MISMATCH"},400);if(o.isSuperadmin&&await rA(t)===0)return e.json({error:"Cannot delete the last superadmin",code:"LAST_SUPERADMIN"},409);let{error:s}=await Cn().auth.admin.deleteUser(t);return s?e.json({error:s.message,code:"AUTH_ADMIN_ERROR"},400):e.json({ok:!0})});var _1=_t.object({email:_t.string().email(),orgId:_t.string().uuid().optional(),role:_t.enum(["owner","admin","member"]).optional()});fn.post("/superadmin/users/invite",async e=>{let t;try{t=await e.req.json()}catch{return e.json({error:"Invalid JSON",code:"VALIDATION_ERROR"},400)}let n=_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=Cn(),a=process.env.WEB_URL??"http://localhost:5174",{data:c,error:l}=await i.auth.admin.inviteUserByEmail(r,{redirectTo:`${a}/auth/confirm`});if(l)return e.json({error:l.message,code:"AUTH_ADMIN_ERROR"},400);let p=c.user?.id,m=null;if(p&&o&&s){let y=e.get("supabase");if(y){let{error:v}=await y.rpc("superadmin_assign_user_to_org",{p_user_id:p,p_org_id:o,p_role:s,p_claim_sessions:!1});v||(m={orgId:o,role:s})}}return e.json({ok:!0,userId:p??null,email:r,assigned:m})});var y1=_t.object({orgId:_t.string().uuid(),role:_t.enum(["owner","admin","member"]),claimSessions:_t.boolean().default(!0)});fn.post("/superadmin/users/:id/assign",async e=>{let t=e.req.param("id");if(!_t.string().uuid().safeParse(t).success)return e.json({error:"Invalid user id",code:"VALIDATION_ERROR"},400);let n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON",code:"VALIDATION_ERROR"},400)}let r=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:c,error:l}=await a.rpc("superadmin_assign_user_to_org",{p_user_id:t,p_org_id:o,p_role:s,p_claim_sessions:i});if(l){let p=l.message.includes("not_authorized")?403:l.message.includes("org_not_found")||l.message.includes("user_not_found")?404:400;return e.json({error:l.message,code:"RPC_ERROR"},p)}return e.json(c)});fn.delete("/superadmin/users/:id/orgs/:orgId",async e=>{let t=e.req.param("id"),n=e.req.param("orgId");if(!_t.string().uuid().safeParse(t).success||!_t.string().uuid().safeParse(n).success)return e.json({error:"Invalid id",code:"VALIDATION_ERROR"},400);let r=e.get("supabase");if(!r)return e.json({error:"Internal: no auth client",code:"INTERNAL"},500);let{error:o}=await r.rpc("superadmin_remove_member",{p_user_id:t,p_org_id:n});if(o){let s=o.message.includes("last_owner_violation")?409:o.message.includes("not_authorized")?403:400;return e.json({error:o.message,code:"RPC_ERROR"},s)}return e.json({ok:!0})});fn.get("/superadmin/orgs",async e=>{let t=await u.select({id:G.id,name:G.name,slug:G.slug,memberCount:Hn`(select count(*)::int from user_organizations where org_id = organizations.id)`,createdAt:G.createdAt}).from(G).orderBy(nA(G.name));return e.json({orgs:t})});import{Hono as w1}from"hono";import{z as Fo}from"zod";var pp=new w1,oA=Fo.object({type:Fo.string().min(1).max(64),payload:Fo.record(Fo.unknown()).optional(),timestamp:Fo.string().datetime().optional()}),v1=Fo.union([oA,Fo.object({events:Fo.array(oA).max(50)})]);pp.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 Sr}from"zod";import{sql as b1}from"drizzle-orm";var ld=new I1,sA=Sr.object({event:Sr.string().min(1).max(64),deviceId:Sr.string().min(1).max(128),cliVersion:Sr.string().max(64).optional(),os:Sr.string().max(32).optional(),props:Sr.record(Sr.unknown()).optional()}),S1=Sr.union([sA,Sr.object({events:Sr.array(sA).max(50)})]);ld.post("/telemetry/cli-events",async e=>{let t=e.get("userId"),n=S1.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(Xd).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)});ld.get("/telemetry/deployments",async e=>{let t=e.get("userId"),n=await u.execute(b1`
|
|
1232
1237
|
select
|
|
1233
1238
|
device_id,
|
|
1234
1239
|
count(*)::int as event_count,
|
|
@@ -1245,7 +1250,7 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1245
1250
|
group by device_id
|
|
1246
1251
|
order by max(created_at) desc
|
|
1247
1252
|
limit 200
|
|
1248
|
-
`);return e.json({deployments:n})});O();import{Hono as y1}from"hono";import{z as Hn}from"zod";var dp=new y1,w1=Hn.object({event:Hn.string().min(1).max(64),deviceId:Hn.string().max(128).optional(),command:Hn.string().max(128).optional(),statusCode:Hn.number().int().optional(),message:Hn.string().max(1e3).optional(),cliVersion:Hn.string().max(64).optional(),os:Hn.string().max(32).optional(),nodeVersion:Hn.string().max(32).optional(),proxied:Hn.boolean().optional(),props:Hn.record(Hn.unknown()).optional()});dp.post("/telemetry/cli-error",async e=>{let t=w1.safeParse(await e.req.json().catch(()=>null));if(!t.success)return e.json({error:"invalid payload",details:t.error.flatten()},400);let n=t.data;console.warn(`[cli-error-beacon] event=${n.event} command=${n.command??""} status=${n.statusCode??""} proxied=${n.proxied??""} cli=${n.cliVersion??""} os=${n.os??""} node=${n.nodeVersion??""} device=${n.deviceId??""} msg=${JSON.stringify(n.message??"")}`);try{await u.insert(Kd).values({deviceId:n.deviceId??null,event:n.event,command:n.command??null,statusCode:n.statusCode??null,message:n.message??null,cliVersion:n.cliVersion??null,os:n.os??null,nodeVersion:n.nodeVersion??null,proxied:n.proxied??null,props:n.props??{}})}catch{}return e.body(null,204)});O();import{Hono as iA}from"hono";import{z as Yr}from"zod";import{createHash as v1,randomBytes as aA}from"node:crypto";import{and as rA,eq as yh,gt as I1,isNull as b1,lt as S1}from"drizzle-orm";var A1={vscode:"VS Code extension","vscode-insiders":"VS Code Insiders extension",cursor:"Cursor extension",windsurf:"Windsurf extension"},oA="VS Code extension";function E1(e){return e?A1[e]??oA:oA}d(E1,"editorKeyName");var sA=6e4;async function x1(){try{await u.delete(Rn).where(S1(Rn.expiresAt,new Date))}catch{}}d(x1,"sweepExpiredCodes");setInterval(()=>void x1(),5*6e4).unref?.();var dd=new iA,T1=Yr.object({code:Yr.string().min(1).max(256)}),R1=Yr.object({refreshToken:Yr.string().min(1).max(2048)});dd.post("/auth/extension/refresh",async e=>{let t=await e.req.json().catch(()=>null),n=R1.safeParse(t);if(!n.success)return e.json({error:"invalid request"},400);let r=await _u(n.data.refreshToken);return r.ok?e.json(r.session):e.json({error:r.error},r.status)});dd.post("/auth/extension/exchange",async e=>{let t=await e.req.json().catch(()=>null),n=T1.safeParse(t);if(!n.success)return e.json({error:"invalid request"},400);let[r]=await u.delete(Rn).where(rA(yh(Rn.code,n.data.code),I1(Rn.expiresAt,new Date))).returning({userId:Rn.userId,editor:Rn.editor,email:Rn.email});if(!r)return e.json({error:"code not found or expired"},404);let o=E1(r.editor),{plaintext:s,hash:i,prefix:a}=j1();try{await u.transaction(async c=>{await c.update(Ae).set({revokedAt:new Date}).where(rA(yh(Ae.userId,r.userId),yh(Ae.name,o),b1(Ae.revokedAt))),await c.insert(Ae).values({userId:r.userId,name:o,keyHash:i,keyPrefix:a})})}catch(c){return console.log(`[auth] extension/exchange mint failed userId=${r.userId} err=${c.message}`),e.json({error:"could not mint session"},500)}return e.json({accessToken:s,expiresAt:null,email:r.email})});var up=new iA,k1=Yr.object({refreshToken:Yr.string().min(1).nullish(),expiresAt:Yr.string().nullish(),email:Yr.string().email().nullish(),editor:Yr.enum(["vscode","vscode-insiders","cursor","windsurf"]).nullish()});function j1(){let e=`rm_${aA(32).toString("base64url")}`;return{plaintext:e,hash:v1("sha256").update(e).digest("hex"),prefix:e.slice(0,11)}}d(j1,"generateApiKey");up.post("/auth/extension/code",async e=>{let t=e.get("userId");if(!t)return e.json({error:"unauthenticated"},401);let n=await e.req.json().catch(()=>null),r=k1.safeParse(n);if(!r.success)return e.json({error:"invalid request"},400);let o=aA(32).toString("base64url");try{await u.insert(Rn).values({code:o,userId:t,editor:r.data.editor??null,email:r.data.email??null,expiresAt:new Date(Date.now()+sA)})}catch(s){return console.log(`[auth] extension/code intent insert failed userId=${t} err=${s.message}`),e.json({error:"could not start sign-in"},500)}return e.json({code:o,expiresInSeconds:Math.floor(sA/1e3),sessionStrategy:"api_key"})});Pc();import{Hono as N1}from"hono";var lp=new N1;function P1(e,t){let n=e.record??{};return e.schema==="auth"&&e.table==="users"&&e.type==="INSERT"?{title:"\u{1F389} New signup",color:2278750,fields:[{name:"Email",value:n.email??t??"unknown",inline:!0},{name:"User ID",value:String(n.id??"unknown"),inline:!0}],timestamp:new Date().toISOString()}:e.schema==="auth"&&e.table==="sessions"&&e.type==="INSERT"?{title:"\u{1F44B} Login",color:3900150,fields:[{name:"Email",value:t??"unknown",inline:!0},{name:"User ID",value:String(n.user_id??"unknown"),inline:!0}],timestamp:new Date().toISOString()}:null}d(P1,"formatEmbed");async function C1(e){if(!e)return null;try{let t=Pn(),{data:n}=await t.auth.admin.getUserById(e);return n.user?.email??null}catch{return null}}d(C1,"lookupEmail");async function O1(e,t){let n=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({embeds:[t]})});n.ok||console.error("[webhooks] Discord post failed",n.status,await n.text().catch(()=>""))}d(O1,"postToDiscord");lp.post("/webhooks/supabase-auth",async e=>{let t=process.env.SUPABASE_WEBHOOK_SECRET,n=process.env.DISCORD_WEBHOOK_URL;if(!t||!n)return e.json({error:"webhook not configured"},503);if(e.req.header("x-webhook-secret")!==t)return e.json({error:"unauthorized"},401);let o;try{o=await e.req.json()}catch{return e.json({error:"invalid json"},400)}let i=o.schema==="auth"&&o.table==="sessions"&&o.type==="INSERT"?await C1(o.record?.user_id):null,a=P1(o,i);return a?(await O1(n,a),e.json({ok:!0})):e.json({ok:!0,skipped:!0})});O();import{Hono as J1}from"hono";import{z as He}from"zod";import{and as pd,desc as gp,eq as Ar,gte as Ch,isNull as G1,sql as K1}from"drizzle-orm";var vh="anthropic",D1=[{limitType:"five_hour_percent",unit:"percentage",displayName:"5-hour window"}],wh=[{limitType:"five_hour_percent",unit:"percentage",displayName:"5-hour window"},{limitType:"seven_day_percent",unit:"percentage",displayName:"Weekly window"}];function M1(e){return typeof e=="object"&&e!==null}d(M1,"isOAuthUsageResponse");function cA(e,t,n,r,o,s){if(!e||typeof e.used_percentage!="number")return null;let i=typeof e.resets_at=="number"?new Date(e.resets_at*1e3):null;return{provider:vh,plan:n,limitType:t,value:e.used_percentage,unit:"percentage",comparator:"=",resetsAt:i,sourceType:"oauth_usage",sourceUrl:r,sourceEvidence:o,confidence:1,observedAt:s}}d(cA,"parseWindow");function L1(e,t){let n=e.match(/reset(?:s|\s+at)?\s+(?:at\s+)?(\d{1,2}):(\d{2})\s*(am|pm)?\s*(?:\(([^)]+)\))?/i);if(!n)return null;let r=parseInt(n[1],10),o=parseInt(n[2],10),s=n[3]?.toLowerCase();if(s==="pm"&&r<12&&(r+=12),s==="am"&&r===12&&(r=0),isNaN(r)||isNaN(o)||r>23||o>59)return null;let i=new Date(t);return i.setHours(r,o,0,0),i.getTime()<=t.getTime()&&i.setDate(i.getDate()+1),i}d(L1,"parseResetTime");var Ih={id:vh,displayName:"Anthropic (Claude Code)",plans:["unknown","pro","max_5x","max_20x"],limits:{unknown:wh,pro:D1,max_5x:wh,max_20x:wh},docs:[{url:"https://docs.claude.com/en/docs/claude-code/setup#usage-limits",parse(e){let t=[],n=e.replace(/<script[\s\S]*?<\/script>/gi," ").replace(/<style[\s\S]*?<\/style>/gi," ").replace(/<[^>]+>/g," ").replace(/\s+/g," ").trim(),r=n.match(/(\d{1,4})\s+messages?\s+(?:every|per)\s+5[-\s]?hours?/i);r&&t.push({plan:"unknown",limitType:"five_hour_messages",value:parseInt(r[1],10),unit:"messages",comparator:"="});let o=n.match(/(\d{1,5})\s+messages?\s+(?:per|every)\s+(?:week|7[-\s]?days?)/i);return o&&t.push({plan:"unknown",limitType:"seven_day_messages",value:parseInt(o[1],10),unit:"messages",comparator:"="}),t}}],liveSource:{matches(e,t){return e==="api.anthropic.com"&&t==="/api/oauth/usage"},parse(e,t){if(!M1(e))return null;let n=e.rate_limits;if(!n||typeof n!="object")return[];let r=t.observedAt??new Date,o=t.plan??"unknown",s=`https://${t.host}${t.path}`,i={rawResponse:e},a=[],c=cA(n.five_hour,"five_hour_percent",o,s,i,r);c&&a.push(c);let l=cA(n.seven_day,"seven_day_percent",o,s,i,r);return l&&a.push(l),a}},observe429(e){if(e.statusCode!==429||e.host!=="api.anthropic.com")return null;let t="",n=e.responseBody;if(typeof n=="string")t=n;else if(n&&typeof n=="object"){let o=n,s=o.error;if(s&&typeof s.message=="string")t=s.message;else if(typeof o.message=="string")t=o.message;else try{t=JSON.stringify(n)}catch{return null}}if(!t)return null;let r=L1(t,e.observedAt);return[{provider:vh,plan:e.plan??"unknown",limitType:"five_hour_percent",value:100,unit:"percentage",comparator:">=",resetsAt:r,sourceType:"self_observed_429",sourceUrl:`https://${e.host}${e.path}`,sourceEvidence:{responseBody:n,parsedText:t},confidence:.9,userId:e.userId??null,observedAt:e.observedAt}]}};var bh="codex",Sh="chatgpt.com",dA="/backend-api/codex/responses",$1="codex.rate_limits",uA=["primary","secondary"];function q1(e,t){return t!=null?t>=1440?"seven_day_percent":"five_hour_percent":e==="secondary"?"seven_day_percent":"five_hour_percent"}d(q1,"limitTypeForWindow");var ca=[{limitType:"five_hour_percent",unit:"percentage",displayName:"5-hour usage"},{limitType:"seven_day_percent",unit:"percentage",displayName:"7-day usage"}],Ah={id:bh,displayName:"Codex CLI (OpenAI)",plans:["unknown","free","plus","pro","team","enterprise"],limits:{unknown:ca,free:ca,plus:ca,pro:ca,team:ca,enterprise:ca},docs:[{url:"https://platform.openai.com/docs/guides/rate-limits",parse(e){return[]}}],liveSource:{matches(e,t){return!1},parse(e,t){return null},streamFrame:{matches(e,t){return e===Sh&&t.startsWith(dA)},parse(e,t){let n;try{n=JSON.parse(e)}catch{return null}if(typeof n!="object"||n===null||n.type!==$1)return null;let r=n.rate_limits;if(typeof r!="object"||r===null)return null;let o=t.observedAt??new Date,s=t.plan??"unknown",i=[];for(let a of uA){let c=r[a];if(typeof c!="object"||c===null)continue;let l=c,p=l.used_percent??l.used_percentage;if(typeof p!="number"||!isFinite(p))continue;let m=p,y=l.window_minutes,v=typeof y=="number"&&isFinite(y)?y:null,h=q1(a,v),f=null,w=l.reset_at??l.resets_at;if(typeof w=="string"){let b=new Date(w);isNaN(b.getTime())||(f=b)}else typeof w=="number"&&isFinite(w)&&(f=new Date(w*1e3));i.push({provider:bh,plan:s,limitType:h,value:m,unit:"percentage",comparator:"=",resetsAt:f,sourceType:"live_stream",sourceUrl:`wss://${Sh}${dA}`,sourceEvidence:{wireKey:a,frame:n},confidence:1,observedAt:o})}return i.length===0&&uA.some(c=>{let l=r[c];return typeof l=="object"&&l!==null})&&console.warn(`[codex] rate_limits windows present but none parsed \u2014 field drift? sample=${JSON.stringify(r).slice(0,300)}`),i.length>0?i:null}}},observe429(e){return e.statusCode!==429||e.host!==Sh?null:[{provider:bh,plan:e.plan??"unknown",limitType:"five_hour_percent",value:100,unit:"percentage",comparator:">=",resetsAt:null,sourceType:"self_observed_429",sourceUrl:`https://${e.host}${e.path}`,sourceEvidence:{responseBody:e.responseBody},confidence:.9,userId:e.userId??null,observedAt:e.observedAt}]}};var ud={anthropic:Ih,codex:Ah};function Eh(e){for(let t of Object.values(ud))if(t.liveSource?.headers?.matchesHost(e))return t}d(Eh,"matchLiveHeaders");function xh(e,t){for(let n of Object.values(ud))if(n.liveSource?.streamFrame?.matches(e,t))return n}d(xh,"matchStreamFrame");var gue=1440*60*1e3;O();import{and as pA,desc as mA,eq as ld,gte as F1,sql as W1}from"drizzle-orm";function Th(e){let{used_percentage:t,burnRateEtaSeconds:n,secondsUntilReset:r,hadObserved429:o}=e;return t>=100||o?"hit":t>=95||t>=80&&n!==null&&n<900?"imminent":t>=80&&n!==null&&n<r?"approaching":t>=80?"soft":"none"}d(Th,"classifySeverity");function da(e){switch(e){case"none":return 0;case"soft":return 1;case"approaching":return 2;case"imminent":return 3;case"hit":return 4}}d(da,"severityRank");var pp={soft:"soft warning",approaching:"approaching limit",imminent:"imminent limit",hit:"limit reached"};function U1(e,t){if(!e)return"soon";let n=new Date(e).getTime()-t;if(n<=0)return"now";let r=Math.round(n/6e4);if(r<60)return`in ${r} min`;let o=Math.floor(r/60),s=r%60;return s>0?`in ${o}h ${s}m`:`in ${o}h`}d(U1,"formatTimeLeft");function Rh(e,t,n,r,o=Date.now()){let s=U1(r,o);if(e==="hit")return`Claude ${t} reached 100% \u2014 requests will fail. Resets ${s}.`;let i=n!=null?`${n.toFixed(0)}%`:"limit";return`Claude ${t} at ${i} \u2014 ${pp[e]}. Resets ${s}.`}d(Rh,"formatAlertMessage");function kh(e,t=new Date){if(e.length<2)return null;let n=300*1e3,r=t.getTime()-n,o=e.filter(I=>I.observedAt.getTime()>=r).sort((I,S)=>I.observedAt.getTime()-S.observedAt.getTime());if(o.length<2)return null;let s=o[o.length-1];if(s.value>=100)return null;let i=o[0].observedAt.getTime(),a=o.map(I=>(I.observedAt.getTime()-i)/1e3),c=o.map(I=>I.value),l=a.length,p=a.reduce((I,S)=>I+S,0),m=c.reduce((I,S)=>I+S,0),y=a.reduce((I,S,A)=>I+S*c[A],0),v=a.reduce((I,S)=>I+S*S,0),h=l*v-p*p;if(h===0)return null;let f=(l*y-p*m)/h;return f<=0?null:(100-s.value)/f}d(kh,"projectExhaustion");var H1=300*1e3,B1=70;function jh(e){let{proposedSeverity:t,lastDispatch:n,currentUsedPercentage:r,now:o,isFirstTime429:s}=e;if(s)return!0;if(!n)return da(t)>0;let i=da(t),a=da(n.severity);return i>a?!0:o.getTime()-n.lastDispatchedAt.getTime()>=H1?a>=da("approaching")&&i===a?!(r>=B1):i>0:!1}d(jh,"shouldDispatch");function Nh(e){let t=kh(e.observations,e.now),n=Math.max(0,Math.floor((e.currentResetsAt.getTime()-e.now.getTime())/1e3)),r=Th({used_percentage:e.currentUsedPercentage,burnRateEtaSeconds:t,secondsUntilReset:n,hadObserved429:e.hadObserved429}),o={alertKey:e.alertKey,severity:r,usedPercentage:e.currentUsedPercentage,resetsAt:e.currentResetsAt.toISOString(),burnRateEtaSeconds:t};if(r==="none")return{shouldDispatch:!1,severity:"none",reason:"below threshold",payload:o};let s=e.hadObserved429&&(e.lastDispatch===null||e.lastDispatch.severity!=="hit"),i=jh({proposedSeverity:r,lastDispatch:e.lastDispatch,currentResetsAt:e.currentResetsAt,currentUsedPercentage:e.currentUsedPercentage,now:e.now,isFirstTime429:s});return{shouldDispatch:i,severity:r,reason:i?"dispatch":"suppressed by cooldown/hysteresis",payload:o}}d(Nh,"evaluate");function lA(e,t,n){return`${e}:${t}:${n}`}d(lA,"deriveAlertKey");O();async function ua(e){await tn({userId:e.userId,type:`usage_${e.severity}`,title:e.title??`Usage limit \u2014 ${pp[e.severity]}`,body:e.message,url:"/usage",sourceTable:"alert_dispatches",sourceId:e.dispatchId})}d(ua,"notifyFromDispatch");var z1=30*6e4;async function mp(e,t){let n=new Date((t.observedAt??new Date).getTime()-z1);try{let o=await u.execute(W1`
|
|
1253
|
+
`);return e.json({deployments:n})});D();import{Hono as A1}from"hono";import{z as Bn}from"zod";var mp=new A1,E1=Bn.object({event:Bn.string().min(1).max(64),deviceId:Bn.string().max(128).optional(),command:Bn.string().max(128).optional(),statusCode:Bn.number().int().optional(),message:Bn.string().max(1e3).optional(),cliVersion:Bn.string().max(64).optional(),os:Bn.string().max(32).optional(),nodeVersion:Bn.string().max(32).optional(),proxied:Bn.boolean().optional(),props:Bn.record(Bn.unknown()).optional()});mp.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 u.insert(Qd).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 dA}from"hono";import{z as Yr}from"zod";import{createHash as x1,randomBytes as uA}from"node:crypto";import{and as iA,eq as bh,gt as T1,isNull as R1,lt as k1}from"drizzle-orm";var j1={vscode:"VS Code extension","vscode-insiders":"VS Code Insiders extension",cursor:"Cursor extension",windsurf:"Windsurf extension"},aA="VS Code extension";function N1(e){return e?j1[e]??aA:aA}d(N1,"editorKeyName");var cA=6e4;async function P1(){try{await u.delete(Rn).where(k1(Rn.expiresAt,new Date))}catch{}}d(P1,"sweepExpiredCodes");setInterval(()=>void P1(),5*6e4).unref?.();var pd=new dA,C1=Yr.object({code:Yr.string().min(1).max(256)}),D1=Yr.object({refreshToken:Yr.string().min(1).max(2048)});pd.post("/auth/extension/refresh",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 vu(n.data.refreshToken);return r.ok?e.json(r.session):e.json({error:r.error},r.status)});pd.post("/auth/extension/exchange",async e=>{let t=await e.req.json().catch(()=>null),n=C1.safeParse(t);if(!n.success)return e.json({error:"invalid request"},400);let[r]=await u.delete(Rn).where(iA(bh(Rn.code,n.data.code),T1(Rn.expiresAt,new Date))).returning({userId:Rn.userId,editor:Rn.editor,email:Rn.email});if(!r)return e.json({error:"code not found or expired"},404);let o=N1(r.editor),{plaintext:s,hash:i,prefix:a}=M1();try{await u.transaction(async c=>{await c.update(Ae).set({revokedAt:new Date}).where(iA(bh(Ae.userId,r.userId),bh(Ae.name,o),R1(Ae.revokedAt))),await c.insert(Ae).values({userId:r.userId,name:o,keyHash:i,keyPrefix:a})})}catch(c){return console.log(`[auth] extension/exchange mint failed userId=${r.userId} err=${c.message}`),e.json({error:"could not mint session"},500)}return e.json({accessToken:s,expiresAt:null,email:r.email})});var fp=new dA,O1=Yr.object({refreshToken:Yr.string().min(1).nullish(),expiresAt:Yr.string().nullish(),email:Yr.string().email().nullish(),editor:Yr.enum(["vscode","vscode-insiders","cursor","windsurf"]).nullish()});function M1(){let e=`rm_${uA(32).toString("base64url")}`;return{plaintext:e,hash:x1("sha256").update(e).digest("hex"),prefix:e.slice(0,11)}}d(M1,"generateApiKey");fp.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=O1.safeParse(n);if(!r.success)return e.json({error:"invalid request"},400);let o=uA(32).toString("base64url");try{await u.insert(Rn).values({code:o,userId:t,editor:r.data.editor??null,email:r.data.email??null,expiresAt:new Date(Date.now()+cA)})}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(cA/1e3),sessionStrategy:"api_key"})});Cc();import{Hono as L1}from"hono";var gp=new L1;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}d($1,"formatEmbed");async function q1(e){if(!e)return null;try{let t=Cn(),{data:n}=await t.auth.admin.getUserById(e);return n.user?.email??null}catch{return null}}d(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(()=>""))}d(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 He}from"zod";import{and as gd,desc as wp,eq as Ar,gte as Lh,isNull as eq,sql as tq}from"drizzle-orm";var Ah="anthropic",H1=[{limitType:"five_hour_percent",unit:"percentage",displayName:"5-hour window"}],Sh=[{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}d(B1,"isOAuthUsageResponse");function lA(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:Ah,plan:n,limitType:t,value:e.used_percentage,unit:"percentage",comparator:"=",resetsAt:i,sourceType:"oauth_usage",sourceUrl:r,sourceEvidence:o,confidence:1,observedAt:s}}d(lA,"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}d(F1,"parseResetTime");var Eh={id:Ah,displayName:"Anthropic (Claude Code)",plans:["unknown","pro","max_5x","max_20x"],limits:{unknown:Sh,pro:H1,max_5x:Sh,max_20x:Sh},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=[],c=lA(n.five_hour,"five_hour_percent",o,s,i,r);c&&a.push(c);let l=lA(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:Ah,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 xh="codex",Th="chatgpt.com",pA="/backend-api/codex/responses",W1="codex.rate_limits",mA=["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"}d(z1,"limitTypeForWindow");var ca=[{limitType:"five_hour_percent",unit:"percentage",displayName:"5-hour usage"},{limitType:"seven_day_percent",unit:"percentage",displayName:"7-day usage"}],Rh={id:xh,displayName:"Codex CLI (OpenAI)",plans:["unknown","free","plus","pro","team","enterprise"],limits:{unknown:ca,free:ca,plus:ca,pro:ca,team:ca,enterprise:ca},docs:[{url:"https://platform.openai.com/docs/guides/rate-limits",parse(e){return[]}}],liveSource:{matches(e,t){return!1},parse(e,t){return null},streamFrame:{matches(e,t){return e===Th&&t.startsWith(pA)},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 mA){let c=r[a];if(typeof c!="object"||c===null)continue;let l=c,p=l.used_percent??l.used_percentage;if(typeof p!="number"||!isFinite(p))continue;let m=p,y=l.window_minutes,v=typeof y=="number"&&isFinite(y)?y:null,h=z1(a,v),f=null,w=l.reset_at??l.resets_at;if(typeof w=="string"){let b=new Date(w);isNaN(b.getTime())||(f=b)}else typeof w=="number"&&isFinite(w)&&(f=new Date(w*1e3));i.push({provider:xh,plan:s,limitType:h,value:m,unit:"percentage",comparator:"=",resetsAt:f,sourceType:"live_stream",sourceUrl:`wss://${Th}${pA}`,sourceEvidence:{wireKey:a,frame:n},confidence:1,observedAt:o})}return i.length===0&&mA.some(c=>{let l=r[c];return typeof l=="object"&&l!==null})&&console.warn(`[codex] rate_limits windows present but none parsed \u2014 field drift? sample=${JSON.stringify(r).slice(0,300)}`),i.length>0?i:null}}},observe429(e){return e.statusCode!==429||e.host!==Th?null:[{provider:xh,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 md={anthropic:Eh,codex:Rh};function kh(e){for(let t of Object.values(md))if(t.liveSource?.headers?.matchesHost(e))return t}d(kh,"matchLiveHeaders");function jh(e,t){for(let n of Object.values(md))if(n.liveSource?.streamFrame?.matches(e,t))return n}d(jh,"matchStreamFrame");var $ue=1440*60*1e3;D();import{and as gA,desc as hA,eq as fd,gte as K1,sql as Y1}from"drizzle-orm";function Nh(e){let{used_percentage:t,burnRateEtaSeconds:n,secondsUntilReset:r,hadObserved429:o}=e;return t>=100||o?"hit":t>=95||t>=80&&n!==null&&n<900?"imminent":t>=80&&n!==null&&n<r?"approaching":t>=80?"soft":"none"}d(Nh,"classifySeverity");function da(e){switch(e){case"none":return 0;case"soft":return 1;case"approaching":return 2;case"imminent":return 3;case"hit":return 4}}d(da,"severityRank");var hp={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`}d(V1,"formatTimeLeft");function Ph(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 ${hp[e]}. Resets ${s}.`}d(Ph,"formatAlertMessage");function Ch(e,t=new Date){if(e.length<2)return null;let n=300*1e3,r=t.getTime()-n,o=e.filter(I=>I.observedAt.getTime()>=r).sort((I,S)=>I.observedAt.getTime()-S.observedAt.getTime());if(o.length<2)return null;let s=o[o.length-1];if(s.value>=100)return null;let i=o[0].observedAt.getTime(),a=o.map(I=>(I.observedAt.getTime()-i)/1e3),c=o.map(I=>I.value),l=a.length,p=a.reduce((I,S)=>I+S,0),m=c.reduce((I,S)=>I+S,0),y=a.reduce((I,S,A)=>I+S*c[A],0),v=a.reduce((I,S)=>I+S*S,0),h=l*v-p*p;if(h===0)return null;let f=(l*y-p*m)/h;return f<=0?null:(100-s.value)/f}d(Ch,"projectExhaustion");var J1=300*1e3,G1=70;function Dh(e){let{proposedSeverity:t,lastDispatch:n,currentUsedPercentage:r,now:o,isFirstTime429:s}=e;if(s)return!0;if(!n)return da(t)>0;let i=da(t),a=da(n.severity);return i>a?!0:o.getTime()-n.lastDispatchedAt.getTime()>=J1?a>=da("approaching")&&i===a?!(r>=G1):i>0:!1}d(Dh,"shouldDispatch");function Oh(e){let t=Ch(e.observations,e.now),n=Math.max(0,Math.floor((e.currentResetsAt.getTime()-e.now.getTime())/1e3)),r=Nh({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=Dh({proposedSeverity:r,lastDispatch:e.lastDispatch,currentResetsAt:e.currentResetsAt,currentUsedPercentage:e.currentUsedPercentage,now:e.now,isFirstTime429:s});return{shouldDispatch:i,severity:r,reason:i?"dispatch":"suppressed by cooldown/hysteresis",payload:o}}d(Oh,"evaluate");function fA(e,t,n){return`${e}:${t}:${n}`}d(fA,"deriveAlertKey");D();async function ua(e){await tn({userId:e.userId,type:`usage_${e.severity}`,title:e.title??`Usage limit \u2014 ${hp[e.severity]}`,body:e.message,url:"/usage",sourceTable:"alert_dispatches",sourceId:e.dispatchId})}d(ua,"notifyFromDispatch");var X1=30*6e4;async function _p(e,t){let n=new Date((t.observedAt??new Date).getTime()-X1);try{let o=await u.execute(Y1`
|
|
1249
1254
|
SELECT id, observed_at
|
|
1250
1255
|
FROM limit_observations
|
|
1251
1256
|
WHERE user_id = ${e}
|
|
@@ -1258,9 +1263,9 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1258
1263
|
AND observed_at >= ${n.toISOString()}::timestamptz
|
|
1259
1264
|
ORDER BY observed_at DESC
|
|
1260
1265
|
LIMIT 1
|
|
1261
|
-
`);if(o.length>0){let s=o[0];return{id:s.id,observedAt:new Date(s.observed_at).toISOString(),deduped:!0}}}catch(o){console.warn("[observe] dedup probe failed; proceeding to insert",o)}let[r]=await u.insert(we).values({provider:t.provider,plan:t.plan,limitType:t.limitType,value:String(t.value),unit:t.unit,comparator:t.comparator,resetsAt:t.resetsAt??null,sourceType:t.sourceType,sourceUrl:t.sourceUrl??null,sourceEvidence:t.sourceEvidence??null,confidence:String(t.confidence),userId:e,...t.observedAt?{observedAt:t.observedAt}:{}}).returning({id:we.id,observedAt:we.observedAt});if(t.sourceType==="oauth_usage"||t.sourceType==="self_observed_429")try{let o=lA(t.provider,t.plan,t.limitType),s=new Date,i=new Date(s.getTime()-600*1e3),a=await u.select({observedAt:we.observedAt,value:we.value}).from(we).where(pA(ld(we.userId,e),ld(we.provider,t.provider),ld(we.limitType,t.limitType),F1(we.observedAt,i))).orderBy(mA(we.observedAt)).limit(50),c=await u.select().from(yn).where(pA(ld(yn.userId,e),ld(yn.alertKey,o))).orderBy(mA(yn.lastDispatchedAt)).limit(1),l=Nh({alertKey:o,observations:a.map(p=>({observedAt:p.observedAt,value:Number(p.value)})),currentUsedPercentage:t.value,currentResetsAt:t.resetsAt??new Date(s.getTime()+300*60*1e3),hadObserved429:t.sourceType==="self_observed_429",lastDispatch:c[0]?{severity:c[0].severity,lastDispatchedAt:c[0].lastDispatchedAt,lastState:c[0].lastState}:null,now:s});if(l.shouldDispatch&&l.severity!=="none"){let p=l.severity,[m]=await u.insert(yn).values({userId:e,alertKey:o,severity:p,lastState:l.payload,channel:"banner"}).returning({id:yn.id});m&&await ua({userId:e,dispatchId:m.id,severity:p,message:Rh(p,t.limitType,l.payload.usedPercentage,l.payload.resetsAt)})}}catch(o){console.error("alert evaluation failed",o)}return{id:r.id,observedAt:new Date(r.observedAt).toISOString(),deduped:!1}}d(mp,"processObservation");function fA(e,t){return`${e}::${t.provider}::${t.sourceType}::${t.limitType}`}d(fA,"observationKey");function fp(){return process.env.OBSERVE_BATCHING!=="0"}d(fp,"observeBatchingEnabled");function gA(){let e=Number(process.env.OBSERVE_BATCH_BUFFER_MAX);return Number.isFinite(e)&&e>0?Math.floor(e):5e3}d(gA,"observeBufferMax");function hA(){let e=Number(process.env.PG_POOL_MAX)||3;return Math.max(1,e-1)}d(hA,"defaultConcurrency");function V1(e={}){let t=e.process??((b,I)=>mp(b,I)),n=e.maxBuffered??gA(),r=Math.max(1,e.concurrency??hA()),o=new Map,s=0,i=new Set,a=0,c=!1,l=[];function p(){let b=l;l=[];for(let I of b)I()}d(p,"notifyProgress");function m(){for(;a<r;){let b=null,I=null;for(let[S,A]of o)if(!(i.has(S)||A.length===0)){I=A,o.delete(S),b=S;break}if(b==null||I==null)return;s-=I.length,i.add(b),a++,y(b,I)}}d(m,"tick");async function y(b,I){try{for(let S of I)try{await t(S.userId,S.obs)}catch(A){console.warn("[observe-batcher] drain failed for one observation; dropping it:",A instanceof Error?A.message:A)}}finally{a--,i.delete(b),p(),m()}}d(y,"runDrain");function v(b){if(c||s>=n)return!1;let I=fA(b.userId,b.obs),S=o.get(I);return S?S.push(b):o.set(I,[b]),s++,m(),!0}d(v,"push");function h(b){return new Promise(I=>{let S=!1,A=d(()=>{S||(S=!0,clearTimeout(E),I())},"finish"),E=setTimeout(A,b);E.unref?.(),l.push(A)})}d(h,"waitForProgress");async function f(b){let I=b!=null?Date.now()+b:Number.POSITIVE_INFINITY;for(;;){if(m(),s===0&&a===0)return;let S=I-Date.now();if(S<=0)return;await h(Math.min(S,50))}}d(f,"flush");function w(){c=!0}return d(w,"stop"),{push:v,flush:f,stop:w,size:d(()=>s,"size"),inFlight:d(()=>a,"inFlight")}}d(V1,"createObserveBatcher");var Wo=null;function Ph(){return Wo==null&&(Wo=V1()),Wo}d(Ph,"getObserveBatcher");function _A(){Ph(),console.log(`[observe-batcher] batched observe ingest ON (bufferMax=${gA()} drainConcurrency=${hA()}; OBSERVE_BATCHING=0 to disable)`)}d(_A,"initObserveBatcher");async function yA(e=5e3){if(Wo==null)return;Wo.stop(),await Wo.flush(e);let t=Wo.size()+Wo.inFlight();t>0&&console.warn(`[observe-batcher] shutdown flush deadline (${e}ms) hit; dropping ~${t} buffered observation(s)`)}d(yA,"shutdownObserveBatcher");var tr=new J1,Y1=He.object({provider:He.string().min(1).max(64),plan:He.string().min(1).max(64),limitType:He.string().min(1).max(128),value:He.number().finite(),unit:He.string().min(1).max(32),comparator:He.enum(["=",">=","<="]).default("="),resetsAt:He.union([He.string(),He.date(),He.null()]).optional().transform(e=>{if(e==null)return null;if(e instanceof Date)return e;let t=new Date(e);return isNaN(t.getTime())?null:t}),sourceType:He.enum(["oauth_usage","self_observed_429","official_docs","self_observed_lower_bound","community","llm_research","release_notes","live_headers","live_stream"]),sourceUrl:He.string().url().optional().nullable(),sourceEvidence:He.unknown().optional(),confidence:He.number().min(0).max(1),observedAt:He.union([He.string(),He.date()]).optional().transform(e=>{if(e==null)return;if(e instanceof Date)return e;let t=new Date(e);return isNaN(t.getTime())?void 0:t})});tr.post("/internal/research/match-headers",async e=>{let t=e.get("userId"),n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON"},400)}let o=He.object({host:He.string(),path:He.string().default("/"),responseHeaders:He.record(He.string()),observedAt:He.string().optional(),plan:He.string().optional()}).safeParse(n);if(!o.success)return e.json({error:"Invalid request body",issues:o.error.issues},400);let{host:s,path:i,responseHeaders:a,observedAt:c,plan:l}=o.data,p=Eh(s);if(!p?.liveSource?.headers)return e.json({observations:[]});let m={host:s,path:i,plan:l??null,observedAt:c?new Date(c):new Date,userId:t},y=p.liveSource.headers.parse(a,m);if(!y||y.length===0)return e.json({observations:[]});let v=[];for(let h of y)try{let f=h.observedAt instanceof Date?h.observedAt:typeof h.observedAt=="string"?new Date(h.observedAt):void 0,[w]=await u.insert(we).values({provider:h.provider,plan:h.plan,limitType:h.limitType,value:String(h.value),unit:h.unit,comparator:h.comparator??"=",resetsAt:h.resetsAt instanceof Date?h.resetsAt:null,sourceType:h.sourceType,sourceUrl:h.sourceUrl??null,sourceEvidence:h.sourceEvidence??null,confidence:String(h.confidence),userId:t,...f?{observedAt:f}:{}}).returning({id:we.id});v.push({...h,id:w.id})}catch{}return e.json({observations:v})});tr.post("/internal/research/match-stream-frame",async e=>{let t=e.get("userId"),n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON"},400)}let o=He.object({host:He.string(),path:He.string().default("/"),frameText:He.string(),observedAt:He.string().optional(),plan:He.string().optional()}).safeParse(n);if(!o.success)return e.json({error:"Invalid request body",issues:o.error.issues},400);let{host:s,path:i,frameText:a,observedAt:c,plan:l}=o.data,p=xh(s,i);if(!p?.liveSource?.streamFrame)return e.json({observations:[]});let m={host:s,path:i,plan:l??null,observedAt:c?new Date(c):new Date,userId:t},y=p.liveSource.streamFrame.parse(a,m);if(!y||y.length===0)return e.json({observations:[]});let v=[];for(let h of y)try{let f=h.observedAt instanceof Date?h.observedAt:typeof h.observedAt=="string"?new Date(h.observedAt):void 0,[w]=await u.insert(we).values({provider:h.provider,plan:h.plan,limitType:h.limitType,value:String(h.value),unit:h.unit,comparator:h.comparator??"=",resetsAt:h.resetsAt instanceof Date?h.resetsAt:null,sourceType:h.sourceType,sourceUrl:h.sourceUrl??null,sourceEvidence:h.sourceEvidence??null,confidence:String(h.confidence),userId:t,...f?{observedAt:f}:{}}).returning({id:we.id});v.push({...h,id:w.id})}catch{}return e.json({observations:v})});tr.post("/internal/research/observe",async e=>{let t=e.get("userId"),n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON"},400)}let r=Y1.safeParse(n);if(!r.success)return e.json({error:"Invalid observation",issues:r.error.issues},400);let o=r.data;if(fp())return Ph().push({userId:t,obs:o})?e.json({buffered:!0,durable:!1},202):(e.header("Retry-After","2"),e.json({error:"Observe buffer full; retry shortly.",durable:!1},429));let s=await mp(t,o);return e.json({id:s.id,observedAt:s.observedAt,...s.deduped?{deduped:!0}:{}},s.deduped?200:201)});tr.get("/research/active-limits",async e=>{let t=e.req.query("provider"),n=e.req.query("plan"),r=[G1(Ge.effectiveUntil)];t&&r.push(Ar(Ge.provider,t)),n&&r.push(Ar(Ge.plan,n));let o=await u.select().from(Ge).where(pd(...r)).orderBy(Ge.provider,Ge.plan,Ge.limitType,gp(Ge.effectiveFrom));return e.json({items:o})});tr.get("/research/doc-changes",async e=>{let t=e.req.query("since"),n=t?new Date(t):new Date(Date.now()-7*864e5);if(isNaN(n.getTime()))return e.json({error:"Invalid since parameter"},400);let r=await u.select({id:xt.id,fetchedAt:xt.fetchedAt,provider:xt.provider,docUrl:xt.docUrl,contentHash:xt.contentHash,parseSuccess:xt.parseSuccess}).from(xt).where(Ch(xt.fetchedAt,n)).orderBy(xt.provider,xt.docUrl,gp(xt.fetchedAt)),o=new Map;for(let s of r){let i=`${s.provider}::${s.docUrl}`,a=o.get(i);a?(a.previousHash===null&&s.contentHash!==a.latestHash&&(a.previousHash=s.contentHash,a.changed=!0),a.snapshots.push(s)):o.set(i,{provider:s.provider,docUrl:s.docUrl,latestFetchedAt:s.fetchedAt,latestHash:s.contentHash,previousHash:null,parseSuccess:s.parseSuccess,changed:!1,snapshots:[s]})}return e.json({items:Array.from(o.values())})});tr.get("/research/disagreements",async e=>{let t=e.get("userId"),n=Math.min(parseInt(e.req.query("since_days")??"14",10)||14,90),r=new Date(Date.now()-n*864e5),o=await u.select().from(we).where(pd(Ar(we.userId,t),Ch(we.observedAt,r))).orderBy(gp(we.observedAt)),s=new Map;for(let a of o){let c=`${a.provider}::${a.plan}::${a.limitType}`,l=s.get(c);l||(l={provider:a.provider,plan:a.plan,limitType:a.limitType,observations:[]},s.set(c,l)),l.observations.push({id:a.id,value:Number(a.value),unit:a.unit,sourceType:a.sourceType,confidence:Number(a.confidence),observedAt:a.observedAt})}let i=[];for(let a of s.values()){if(a.observations.length<2)continue;let c=a.observations.map(y=>y.value).filter(y=>y>0);if(c.length<2)continue;let l=Math.min(...c),p=Math.max(...c);if(l===0)continue;let m=(p-l)/l*100;m>20&&i.push({provider:a.provider,plan:a.plan,limitType:a.limitType,minValue:l,maxValue:p,spreadPct:m,observations:a.observations})}return i.sort((a,c)=>c.spreadPct-a.spreadPct),e.json({items:i.slice(0,100)})});tr.get("/research/confidence-history",async e=>{let t=e.req.query("provider"),n=e.req.query("plan"),r=e.req.query("limit_type"),o=Math.min(parseInt(e.req.query("days")??"90",10)||90,365);if(!t||!n||!r)return e.json({error:"provider, plan, limit_type required"},400);let s=new Date(Date.now()-o*864e5),i=await u.select({effectiveFrom:Ge.effectiveFrom,effectiveUntil:Ge.effectiveUntil,confidence:Ge.confidence,value:Ge.value}).from(Ge).where(pd(Ar(Ge.provider,t),Ar(Ge.plan,n),Ar(Ge.limitType,r),Ch(Ge.effectiveFrom,s))).orderBy(Ge.effectiveFrom);return e.json({items:i.map(a=>({effectiveFrom:a.effectiveFrom,effectiveUntil:a.effectiveUntil,confidence:Number(a.confidence),value:Number(a.value)}))})});tr.get("/research/observations",async e=>{let t=e.get("userId"),n=e.req.query("provider"),r=e.req.query("plan"),o=e.req.query("limit_type"),s=Math.min(parseInt(e.req.query("limit")??"50",10)||50,200),i=Math.max(parseInt(e.req.query("offset")??"0",10)||0,0),a=[Ar(we.userId,t)];n&&a.push(Ar(we.provider,n)),r&&a.push(Ar(we.plan,r)),o&&a.push(Ar(we.limitType,o));let c=await u.select().from(we).where(pd(...a)).orderBy(gp(we.observedAt)).limit(s).offset(i),[{total:l}]=await u.select({total:K1`count(*)::int`}).from(we).where(pd(...a));return e.json({items:c,total:l,limit:s,offset:i})});O();import{Hono as X1}from"hono";import{and as bA,desc as Q1,eq as la,isNull as Z1,ne as eq,sql as Er}from"drizzle-orm";var wA={free:.2,pro:1,max_5x:5,max_20x:20},Dh=new Set(["free","pro","max_5x","max_20x"]),Oh={fiveHourMessages:20,sevenDaySonnetHours:14,sevenDayOpusHours:1.65};function vA(e){let t=wA[e]??wA.max_20x;return{fiveHourMessages:Math.round(Oh.fiveHourMessages*t),sevenDaySonnetHours:Math.round(Oh.sevenDaySonnetHours*t),sevenDayOpusHours:Math.round(Oh.sevenDayOpusHours*t)}}d(vA,"planDefaultCaps");var md=new X1,tq=60*1e3,Mh=new Map;function nq(e,t){let n=`${e}::${t}`,r=Mh.get(n);if(r&&Date.now()-r.at<tq)return r.rows;let o=u.select({limitType:Ge.limitType,value:Ge.value,unit:Ge.unit}).from(Ge).where(bA(la(Ge.provider,e),la(Ge.plan,t),Z1(Ge.effectiveUntil)));return o.catch(()=>Mh.delete(n)),Mh.set(n,{at:Date.now(),rows:o}),o}d(nq,"getActivePlanLimits");var IA=["five_hour_percent","seven_day_percent","seven_day_opus_percent"],rq={anthropic:["oauth_usage"],codex:["live_stream","self_observed_429"]};function oq(e){return rq[e]??["oauth_usage"]}d(oq,"sourceTypesFor");md.get("/usage/current-limits",async e=>{let t=e.get("userId"),n=e.req.query("provider")??"anthropic",r=oq(n),o=await u.execute(Er`
|
|
1266
|
+
`);if(o.length>0){let s=o[0];return{id:s.id,observedAt:new Date(s.observed_at).toISOString(),deduped:!0}}}catch(o){console.warn("[observe] dedup probe failed; proceeding to insert",o)}let[r]=await u.insert(we).values({provider:t.provider,plan:t.plan,limitType:t.limitType,value:String(t.value),unit:t.unit,comparator:t.comparator,resetsAt:t.resetsAt??null,sourceType:t.sourceType,sourceUrl:t.sourceUrl??null,sourceEvidence:t.sourceEvidence??null,confidence:String(t.confidence),userId:e,...t.observedAt?{observedAt:t.observedAt}:{}}).returning({id:we.id,observedAt:we.observedAt});if(t.sourceType==="oauth_usage"||t.sourceType==="self_observed_429")try{let o=fA(t.provider,t.plan,t.limitType),s=new Date,i=new Date(s.getTime()-600*1e3),a=await u.select({observedAt:we.observedAt,value:we.value}).from(we).where(gA(fd(we.userId,e),fd(we.provider,t.provider),fd(we.limitType,t.limitType),K1(we.observedAt,i))).orderBy(hA(we.observedAt)).limit(50),c=await u.select().from(yn).where(gA(fd(yn.userId,e),fd(yn.alertKey,o))).orderBy(hA(yn.lastDispatchedAt)).limit(1),l=Oh({alertKey:o,observations:a.map(p=>({observedAt:p.observedAt,value:Number(p.value)})),currentUsedPercentage:t.value,currentResetsAt:t.resetsAt??new Date(s.getTime()+300*60*1e3),hadObserved429:t.sourceType==="self_observed_429",lastDispatch:c[0]?{severity:c[0].severity,lastDispatchedAt:c[0].lastDispatchedAt,lastState:c[0].lastState}:null,now:s});if(l.shouldDispatch&&l.severity!=="none"){let p=l.severity,[m]=await u.insert(yn).values({userId:e,alertKey:o,severity:p,lastState:l.payload,channel:"banner"}).returning({id:yn.id});m&&await ua({userId:e,dispatchId:m.id,severity:p,message:Ph(p,t.limitType,l.payload.usedPercentage,l.payload.resetsAt)})}}catch(o){console.error("alert evaluation failed",o)}return{id:r.id,observedAt:new Date(r.observedAt).toISOString(),deduped:!1}}d(_p,"processObservation");function _A(e,t){return`${e}::${t.provider}::${t.sourceType}::${t.limitType}`}d(_A,"observationKey");function yp(){return process.env.OBSERVE_BATCHING!=="0"}d(yp,"observeBatchingEnabled");function yA(){let e=Number(process.env.OBSERVE_BATCH_BUFFER_MAX);return Number.isFinite(e)&&e>0?Math.floor(e):5e3}d(yA,"observeBufferMax");function wA(){let e=Number(process.env.PG_POOL_MAX)||3;return Math.max(1,e-1)}d(wA,"defaultConcurrency");function Q1(e={}){let t=e.process??((b,I)=>_p(b,I)),n=e.maxBuffered??yA(),r=Math.max(1,e.concurrency??wA()),o=new Map,s=0,i=new Set,a=0,c=!1,l=[];function p(){let b=l;l=[];for(let I of b)I()}d(p,"notifyProgress");function m(){for(;a<r;){let b=null,I=null;for(let[S,A]of o)if(!(i.has(S)||A.length===0)){I=A,o.delete(S),b=S;break}if(b==null||I==null)return;s-=I.length,i.add(b),a++,y(b,I)}}d(m,"tick");async function y(b,I){try{for(let S of I)try{await t(S.userId,S.obs)}catch(A){console.warn("[observe-batcher] drain failed for one observation; dropping it:",A instanceof Error?A.message:A)}}finally{a--,i.delete(b),p(),m()}}d(y,"runDrain");function v(b){if(c||s>=n)return!1;let I=_A(b.userId,b.obs),S=o.get(I);return S?S.push(b):o.set(I,[b]),s++,m(),!0}d(v,"push");function h(b){return new Promise(I=>{let S=!1,A=d(()=>{S||(S=!0,clearTimeout(E),I())},"finish"),E=setTimeout(A,b);E.unref?.(),l.push(A)})}d(h,"waitForProgress");async function f(b){let I=b!=null?Date.now()+b:Number.POSITIVE_INFINITY;for(;;){if(m(),s===0&&a===0)return;let S=I-Date.now();if(S<=0)return;await h(Math.min(S,50))}}d(f,"flush");function w(){c=!0}return d(w,"stop"),{push:v,flush:f,stop:w,size:d(()=>s,"size"),inFlight:d(()=>a,"inFlight")}}d(Q1,"createObserveBatcher");var Wo=null;function Mh(){return Wo==null&&(Wo=Q1()),Wo}d(Mh,"getObserveBatcher");function vA(){Mh(),console.log(`[observe-batcher] batched observe ingest ON (bufferMax=${yA()} drainConcurrency=${wA()}; OBSERVE_BATCHING=0 to disable)`)}d(vA,"initObserveBatcher");async function IA(e=5e3){if(Wo==null)return;Wo.stop(),await Wo.flush(e);let t=Wo.size()+Wo.inFlight();t>0&&console.warn(`[observe-batcher] shutdown flush deadline (${e}ms) hit; dropping ~${t} buffered observation(s)`)}d(IA,"shutdownObserveBatcher");var tr=new Z1,nq=He.object({provider:He.string().min(1).max(64),plan:He.string().min(1).max(64),limitType:He.string().min(1).max(128),value:He.number().finite(),unit:He.string().min(1).max(32),comparator:He.enum(["=",">=","<="]).default("="),resetsAt:He.union([He.string(),He.date(),He.null()]).optional().transform(e=>{if(e==null)return null;if(e instanceof Date)return e;let t=new Date(e);return isNaN(t.getTime())?null:t}),sourceType:He.enum(["oauth_usage","self_observed_429","official_docs","self_observed_lower_bound","community","llm_research","release_notes","live_headers","live_stream"]),sourceUrl:He.string().url().optional().nullable(),sourceEvidence:He.unknown().optional(),confidence:He.number().min(0).max(1),observedAt:He.union([He.string(),He.date()]).optional().transform(e=>{if(e==null)return;if(e instanceof Date)return e;let t=new Date(e);return isNaN(t.getTime())?void 0:t})});tr.post("/internal/research/match-headers",async e=>{let t=e.get("userId"),n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON"},400)}let o=He.object({host:He.string(),path:He.string().default("/"),responseHeaders:He.record(He.string()),observedAt:He.string().optional(),plan:He.string().optional()}).safeParse(n);if(!o.success)return e.json({error:"Invalid request body",issues:o.error.issues},400);let{host:s,path:i,responseHeaders:a,observedAt:c,plan:l}=o.data,p=kh(s);if(!p?.liveSource?.headers)return e.json({observations:[]});let m={host:s,path:i,plan:l??null,observedAt:c?new Date(c):new Date,userId:t},y=p.liveSource.headers.parse(a,m);if(!y||y.length===0)return e.json({observations:[]});let v=[];for(let h of y)try{let f=h.observedAt instanceof Date?h.observedAt:typeof h.observedAt=="string"?new Date(h.observedAt):void 0,[w]=await u.insert(we).values({provider:h.provider,plan:h.plan,limitType:h.limitType,value:String(h.value),unit:h.unit,comparator:h.comparator??"=",resetsAt:h.resetsAt instanceof Date?h.resetsAt:null,sourceType:h.sourceType,sourceUrl:h.sourceUrl??null,sourceEvidence:h.sourceEvidence??null,confidence:String(h.confidence),userId:t,...f?{observedAt:f}:{}}).returning({id:we.id});v.push({...h,id:w.id})}catch{}return e.json({observations:v})});tr.post("/internal/research/match-stream-frame",async e=>{let t=e.get("userId"),n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON"},400)}let o=He.object({host:He.string(),path:He.string().default("/"),frameText:He.string(),observedAt:He.string().optional(),plan:He.string().optional()}).safeParse(n);if(!o.success)return e.json({error:"Invalid request body",issues:o.error.issues},400);let{host:s,path:i,frameText:a,observedAt:c,plan:l}=o.data,p=jh(s,i);if(!p?.liveSource?.streamFrame)return e.json({observations:[]});let m={host:s,path:i,plan:l??null,observedAt:c?new Date(c):new Date,userId:t},y=p.liveSource.streamFrame.parse(a,m);if(!y||y.length===0)return e.json({observations:[]});let v=[];for(let h of y)try{let f=h.observedAt instanceof Date?h.observedAt:typeof h.observedAt=="string"?new Date(h.observedAt):void 0,[w]=await u.insert(we).values({provider:h.provider,plan:h.plan,limitType:h.limitType,value:String(h.value),unit:h.unit,comparator:h.comparator??"=",resetsAt:h.resetsAt instanceof Date?h.resetsAt:null,sourceType:h.sourceType,sourceUrl:h.sourceUrl??null,sourceEvidence:h.sourceEvidence??null,confidence:String(h.confidence),userId:t,...f?{observedAt:f}:{}}).returning({id:we.id});v.push({...h,id:w.id})}catch{}return e.json({observations:v})});tr.post("/internal/research/observe",async e=>{let t=e.get("userId"),n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON"},400)}let r=nq.safeParse(n);if(!r.success)return e.json({error:"Invalid observation",issues:r.error.issues},400);let o=r.data;if(yp())return Mh().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 _p(t,o);return e.json({id:s.id,observedAt:s.observedAt,...s.deduped?{deduped:!0}:{}},s.deduped?200:201)});tr.get("/research/active-limits",async e=>{let t=e.req.query("provider"),n=e.req.query("plan"),r=[eq(Ge.effectiveUntil)];t&&r.push(Ar(Ge.provider,t)),n&&r.push(Ar(Ge.plan,n));let o=await u.select().from(Ge).where(gd(...r)).orderBy(Ge.provider,Ge.plan,Ge.limitType,wp(Ge.effectiveFrom));return e.json({items:o})});tr.get("/research/doc-changes",async e=>{let t=e.req.query("since"),n=t?new Date(t):new Date(Date.now()-7*864e5);if(isNaN(n.getTime()))return e.json({error:"Invalid since parameter"},400);let r=await u.select({id:xt.id,fetchedAt:xt.fetchedAt,provider:xt.provider,docUrl:xt.docUrl,contentHash:xt.contentHash,parseSuccess:xt.parseSuccess}).from(xt).where(Lh(xt.fetchedAt,n)).orderBy(xt.provider,xt.docUrl,wp(xt.fetchedAt)),o=new Map;for(let s of r){let i=`${s.provider}::${s.docUrl}`,a=o.get(i);a?(a.previousHash===null&&s.contentHash!==a.latestHash&&(a.previousHash=s.contentHash,a.changed=!0),a.snapshots.push(s)):o.set(i,{provider:s.provider,docUrl:s.docUrl,latestFetchedAt:s.fetchedAt,latestHash:s.contentHash,previousHash:null,parseSuccess:s.parseSuccess,changed:!1,snapshots:[s]})}return e.json({items:Array.from(o.values())})});tr.get("/research/disagreements",async e=>{let t=e.get("userId"),n=Math.min(parseInt(e.req.query("since_days")??"14",10)||14,90),r=new Date(Date.now()-n*864e5),o=await u.select().from(we).where(gd(Ar(we.userId,t),Lh(we.observedAt,r))).orderBy(wp(we.observedAt)),s=new Map;for(let a of o){let c=`${a.provider}::${a.plan}::${a.limitType}`,l=s.get(c);l||(l={provider:a.provider,plan:a.plan,limitType:a.limitType,observations:[]},s.set(c,l)),l.observations.push({id:a.id,value:Number(a.value),unit:a.unit,sourceType:a.sourceType,confidence:Number(a.confidence),observedAt:a.observedAt})}let i=[];for(let a of s.values()){if(a.observations.length<2)continue;let c=a.observations.map(y=>y.value).filter(y=>y>0);if(c.length<2)continue;let l=Math.min(...c),p=Math.max(...c);if(l===0)continue;let m=(p-l)/l*100;m>20&&i.push({provider:a.provider,plan:a.plan,limitType:a.limitType,minValue:l,maxValue:p,spreadPct:m,observations:a.observations})}return i.sort((a,c)=>c.spreadPct-a.spreadPct),e.json({items:i.slice(0,100)})});tr.get("/research/confidence-history",async e=>{let t=e.req.query("provider"),n=e.req.query("plan"),r=e.req.query("limit_type"),o=Math.min(parseInt(e.req.query("days")??"90",10)||90,365);if(!t||!n||!r)return e.json({error:"provider, plan, limit_type required"},400);let s=new Date(Date.now()-o*864e5),i=await u.select({effectiveFrom:Ge.effectiveFrom,effectiveUntil:Ge.effectiveUntil,confidence:Ge.confidence,value:Ge.value}).from(Ge).where(gd(Ar(Ge.provider,t),Ar(Ge.plan,n),Ar(Ge.limitType,r),Lh(Ge.effectiveFrom,s))).orderBy(Ge.effectiveFrom);return e.json({items:i.map(a=>({effectiveFrom:a.effectiveFrom,effectiveUntil:a.effectiveUntil,confidence:Number(a.confidence),value:Number(a.value)}))})});tr.get("/research/observations",async e=>{let t=e.get("userId"),n=e.req.query("provider"),r=e.req.query("plan"),o=e.req.query("limit_type"),s=Math.min(parseInt(e.req.query("limit")??"50",10)||50,200),i=Math.max(parseInt(e.req.query("offset")??"0",10)||0,0),a=[Ar(we.userId,t)];n&&a.push(Ar(we.provider,n)),r&&a.push(Ar(we.plan,r)),o&&a.push(Ar(we.limitType,o));let c=await u.select().from(we).where(gd(...a)).orderBy(wp(we.observedAt)).limit(s).offset(i),[{total:l}]=await u.select({total:tq`count(*)::int`}).from(we).where(gd(...a));return e.json({items:c,total:l,limit:s,offset:i})});D();import{Hono as rq}from"hono";import{and as EA,desc as oq,eq as la,isNull as sq,ne as iq,sql as Er}from"drizzle-orm";var bA={free:.2,pro:1,max_5x:5,max_20x:20},qh=new Set(["free","pro","max_5x","max_20x"]),$h={fiveHourMessages:20,sevenDaySonnetHours:14,sevenDayOpusHours:1.65};function SA(e){let t=bA[e]??bA.max_20x;return{fiveHourMessages:Math.round($h.fiveHourMessages*t),sevenDaySonnetHours:Math.round($h.sevenDaySonnetHours*t),sevenDayOpusHours:Math.round($h.sevenDayOpusHours*t)}}d(SA,"planDefaultCaps");var hd=new rq,aq=60*1e3,Uh=new Map;function cq(e,t){let n=`${e}::${t}`,r=Uh.get(n);if(r&&Date.now()-r.at<aq)return r.rows;let o=u.select({limitType:Ge.limitType,value:Ge.value,unit:Ge.unit}).from(Ge).where(EA(la(Ge.provider,e),la(Ge.plan,t),sq(Ge.effectiveUntil)));return o.catch(()=>Uh.delete(n)),Uh.set(n,{at:Date.now(),rows:o}),o}d(cq,"getActivePlanLimits");var AA=["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"]}d(uq,"sourceTypesFor");hd.get("/usage/current-limits",async e=>{let t=e.get("userId"),n=e.req.query("provider")??"anthropic",r=uq(n),o=await u.execute(Er`
|
|
1262
1267
|
SELECT lt.limit_type AS limit_type, o.value AS value, o.resets_at AS resets_at, o.observed_at AS observed_at
|
|
1263
|
-
FROM (VALUES ${Er.join(
|
|
1268
|
+
FROM (VALUES ${Er.join(AA.map(i=>Er`(${i})`),Er`, `)}) AS lt(limit_type)
|
|
1264
1269
|
LEFT JOIN LATERAL (
|
|
1265
1270
|
SELECT max(resets_at) AS resets_at
|
|
1266
1271
|
FROM limit_observations
|
|
@@ -1281,22 +1286,22 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1281
1286
|
ORDER BY (CASE WHEN w.resets_at IS NULL THEN 0 ELSE value END) DESC, observed_at DESC
|
|
1282
1287
|
LIMIT 1
|
|
1283
1288
|
) o ON true
|
|
1284
|
-
`),s=new Map;for(let i of o)i.value==null||i.observed_at==null||
|
|
1289
|
+
`),s=new Map;for(let i of o)i.value==null||i.observed_at==null||AA.includes(i.limit_type)&&s.set(i.limit_type,{used_percentage:Number(i.value),resets_at:i.resets_at?new Date(i.resets_at).toISOString():null,observed_at:new Date(i.observed_at).toISOString()});return e.header("Cache-Control","private, max-age=15"),e.json({provider:n,five_hour:s.get("five_hour_percent")??null,seven_day:s.get("seven_day_percent")??null,seven_day_opus:s.get("seven_day_opus_percent")??null})});hd.get("/usage/inferred-caps",async e=>{let t=e.get("userId"),n=e.req.query("provider")??"anthropic",[r]=await u.select({plan:T.claudeCodePlan,source:T.planSource}).from(T).where(la(T.id,t)),o=r?.source==="manual"&&r.plan&&qh.has(r.plan)?r.plan:null,s=await u.select({plan:we.plan}).from(we).where(EA(la(we.userId,t),la(we.provider,n),la(we.sourceType,"oauth_usage"),iq(we.plan,"unknown"))).orderBy(oq(we.observedAt)).limit(1),i=s[0]?.plan&&qh.has(s[0].plan)?s[0].plan:null,a=o??i??"max_20x",c=o===null&&i===null,l=SA(a),p=await cq(n,a);function m(f,w,b){let I=p.filter(S=>S.limitType===f&&w.test(S.unit));return I.length===0?b:Math.max(...I.map(S=>Number(S.value)))}d(m,"bestCap");let y=m("five_hour_messages",/msg|message/i,l.fiveHourMessages),v=m("seven_day_sonnet_hours",/hour|hr/i,l.sevenDaySonnetHours),h=m("seven_day_opus_hours",/hour|hr/i,l.sevenDayOpusHours);return e.header("Cache-Control","private, max-age=15"),e.json({plan:a,assumed:c,five_hour_percent:{inferred_cap:y,unit:"messages",confidence_band_pct:20},seven_day_percent:{inferred_cap:v,unit:"hours",confidence_band_pct:20},seven_day_opus_percent:{inferred_cap:h,unit:"hours",confidence_band_pct:20}})});D();import{Hono as lq}from"hono";import{z as nr}from"zod";import{and as xA,desc as kA,eq as _d,sql as pq}from"drizzle-orm";var wd=new lq,TA=30,mq=30,fq=0,Hh=1e3,RA=2e3,Bh=2;function yd(e){return e==null?0:typeof e=="number"?e:Number(e)}d(yd,"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}d(gq,"ageDays");async function hq(){let e=await u.select({provider:Qe.provider,modelId:Qe.modelId,inputPerM:Qe.inputPerM,outputPerM:Qe.outputPerM,effectiveFrom:Qe.effectiveFrom,verifiedAt:Qe.verifiedAt}).from(Qe).orderBy(kA(Qe.effectiveFrom)),t=new Map;for(let n of e){let r=`${n.provider}::${n.modelId}`;t.has(r)||t.set(r,n)}return t}d(hq,"loadActiveRows");wd.get("/pricing/coverage",async e=>{if(!e.get("userId"))return e.json({error:"unauthorized"},401);let n=await u.execute(pq`
|
|
1285
1290
|
SELECT model,
|
|
1286
1291
|
COUNT(*)::int AS events,
|
|
1287
1292
|
MAX(timestamp) AS last_seen
|
|
1288
1293
|
FROM session_events
|
|
1289
1294
|
WHERE model IS NOT NULL
|
|
1290
1295
|
AND model NOT IN ('unknown', '(null)')
|
|
1291
|
-
AND timestamp > now() - (${
|
|
1296
|
+
AND timestamp > now() - (${mq} || ' days')::interval
|
|
1292
1297
|
GROUP BY model
|
|
1293
1298
|
ORDER BY events DESC
|
|
1294
|
-
`),r=await
|
|
1299
|
+
`),r=await hq(),o=[],s=[],i=0;for(let a of n){let c=a.model,l=No(c),p=r.get(`${l}::${c}`);if(!p){o.push({provider:l,modelId:c,events:a.events,lastSeen:String(a.last_seen)});continue}let m=gq(p.verifiedAt??p.effectiveFrom);m===null||m>TA?s.push({provider:l,modelId:c,events:a.events,verifiedAt:p.verifiedAt?String(p.verifiedAt):null,ageDays:m===null?null:Math.round(m),currentInput:yd(p.inputPerM),currentOutput:yd(p.outputPerM)}):i+=1}return e.json({staleDays:TA,capturedModels:n.length,pricedFresh:i,unpriced:o,stale:s})});var _q=nr.object({provider:nr.string().min(1).optional(),modelId:nr.string().min(1),inputPerM:nr.number(),outputPerM:nr.number(),cacheReadPerM:nr.number().optional(),cacheWrite5mPerM:nr.number().optional(),cacheWrite1hPerM:nr.number().optional(),contextWindow:nr.number().int().positive().nullable().optional(),sourceUrl:nr.string().url(),effectiveFrom:nr.string().datetime().optional()});wd.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??No(r.modelId),s=d((h,f)=>h>fq&&h<=f,"inRange");if(!s(r.inputPerM,Hh)||!s(r.outputPerM,Hh))return e.json({status:"rejected",reason:`input/output out of range (0, ${Hh}]`},422);let i=r.cacheReadPerM??0,a=r.cacheWrite5mPerM??0,c=r.cacheWrite1hPerM??0;for(let[h,f]of[["cacheReadPerM",i],["cacheWrite5mPerM",a],["cacheWrite1hPerM",c]])if(f<0||f>RA)return e.json({status:"rejected",reason:`${h} out of range [0, ${RA}]`},422);let p=(await u.select().from(Qe).where(xA(_d(Qe.provider,o),_d(Qe.modelId,r.modelId))).orderBy(kA(Qe.effectiveFrom)).limit(1))[0],m=1e-9;if(p){let h=yd(p.inputPerM),f=yd(p.outputPerM),w=d((A,E)=>E<=0?1/0:A/E,"ratio"),b=Math.max(w(r.inputPerM,h),w(h,r.inputPerM)),I=Math.max(w(r.outputPerM,f),w(f,r.outputPerM));if(b>Bh||I>Bh)return e.json({status:"flagged",reason:`new rate differs from current by more than ${Bh}x \u2014 needs human review`,current:{inputPerM:h,outputPerM:f},proposed:{inputPerM:r.inputPerM,outputPerM:r.outputPerM},sourceUrl:r.sourceUrl});if(Math.abs(h-r.inputPerM)<m&&Math.abs(f-r.outputPerM)<m&&Math.abs(yd(p.cacheReadPerM)-i)<m)return await u.update(Qe).set({verifiedAt:new Date}).where(xA(_d(Qe.provider,o),_d(Qe.modelId,r.modelId),_d(Qe.effectiveFrom,p.effectiveFrom))),e.json({status:"unchanged",modelId:r.modelId})}let y=r.effectiveFrom?new Date(r.effectiveFrom):new Date,v=new Date().toISOString().slice(0,10);return await u.insert(Qe).values({provider:o,modelId:r.modelId,inputPerM:String(r.inputPerM),outputPerM:String(r.outputPerM),cacheReadPerM:String(i),cacheWrite5mPerM:String(a),cacheWrite1hPerM:String(c),contextWindow:r.contextWindow??null,effectiveFrom:y,verifiedAt:new Date,source:`auto-refresh-${v}`}).onConflictDoNothing(),e.json({status:"written",modelId:r.modelId,provider:o,effectiveFrom:y.toISOString()})});D();import{Hono as yq}from"hono";import{desc as wq,eq as vq}from"drizzle-orm";var vp=new yq;vp.get("/alerts/recent",async e=>{let t=e.get("userId"),n=await u.select().from(yn).where(vq(yn.userId,t)).orderBy(wq(yn.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 pa}from"drizzle-orm";var Ip=new Iq,PA=300,jA=3e4,Sq=6e4,Aq=1e3,Fh={process_send_message:"session_send_jobs",process_launch:"launch_jobs",process_eval:"eval_jobs",process_conversation:"eval_jobs",process_insights:"insights_jobs",process_session_goal:"agent_jobs",distill_memories:"agent_jobs",memory_ab:"agent_jobs",process_run_cleanup:"agent_jobs",cron_suggest_instructions:"agent_jobs",cron_refresh_skills:"agent_jobs",cron_refresh_pricing:"agent_jobs",cron_eval_autorun:"agent_jobs",cron_auto_accept_suggestions:"agent_jobs",cron_instruction_training:"agent_jobs",cron_instruction_evolution:"agent_jobs",process_judge_review:"agent_jobs"},Eq=["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=pa.join(n.map(i=>pa`${i}`),pa`, `),s=await u.execute(pa`
|
|
1295
1300
|
UPDATE ${pa.raw(e)} AS m
|
|
1296
1301
|
SET status = 'claimed',
|
|
1297
1302
|
claimed_by = ${r},
|
|
1298
1303
|
claimed_at = now(),
|
|
1299
|
-
lease_expires_at = now() + (${
|
|
1304
|
+
lease_expires_at = now() + (${PA}::int * interval '1 second'),
|
|
1300
1305
|
attempts = m.attempts + 1,
|
|
1301
1306
|
updated_at = now()
|
|
1302
1307
|
FROM (
|
|
@@ -1312,7 +1317,7 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1312
1317
|
) AS picked
|
|
1313
1318
|
WHERE m.id = picked.id
|
|
1314
1319
|
RETURNING m.id, m.task_kind, m.payload, m.attempts
|
|
1315
|
-
`);return s.length>0?s[0]:null}d(
|
|
1320
|
+
`);return s.length>0?s[0]:null}d(xq,"claimOne");async function Tq(e,t,n){let r={};for(let o of t){let s=Fh[o];s&&(r[s]??=[]).push(o)}for(let o of Eq){let s=r[o];if(!s)continue;let i=await xq(o,e,s,n);if(i)return{job:i,table:o}}return null}d(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}d(kq,"parseCliVersion");function jq(e,t){return e[0]!==t[0]?e[0]>t[0]:e[1]!==t[1]?e[1]>t[1]:e[2]>=t[2]}d(jq,"versionAtLeast");function Nq(e,t){let n=kq(t),r=[],o=[];for(let s of e){let i=Rq[s];i&&(!n||!jq(n,i))?o.push(s):r.push(s)}return{allowed:r,fenced:o}}d(Nq,"fenceCapabilities");var NA=new Set;Ip.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 Fh),{allowed:o,fenced:s}=Nq(r,e.req.header("user-agent"));if(s.length>0&&!NA.has(t)&&(NA.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(Fh).join(", ")},400);if(o.length===0)return e.body(null,204);let i=Number.parseInt(e.req.query("waitMs")??`${jA}`,10),a=Number.isFinite(i)?Math.max(0,Math.min(i,Sq)):jA,c=bq(),l=Date.now()+a;for(;;){let p=await Tq(t,o,c);if(p)return e.json({id:p.job.id,kind:p.job.task_kind,payload:p.job.payload,attempts:p.job.attempts,leaseToken:c,leaseDurationSeconds:PA,table:p.table});if(Date.now()>=l)break;await new Promise(m=>setTimeout(m,Aq))}return e.body(null,204)});D();import{Hono as Dq}from"hono";import{z as vd}from"zod";import{sql as Xr}from"drizzle-orm";D();import{eq as xr,and as Wh}from"drizzle-orm";var Pq=d(e=>`${(e*100).toFixed(1)}pp`,"pct"),Cq=d(e=>`${(e/6e4).toFixed(0)} min`,"mins");function CA(e){let{targetName:t,evalTargetId:n,status:r,result:o,error:s}=e,i=t.split("/").pop()||t,a=`/eval-targets/${n}`;if(r==="failed")return{type:"evolution_failed",title:`Evolution cycle crashed \u2014 ${i}`,body:s?.slice(0,400)||"The job failed without recording a reason.",url:a,metadata:{evalTargetId:n,outcome:"crashed"}};if(!o)return null;if(o.skipped==="infrastructure-incomplete"||o.skipped==="quota-exhausted"){let m=o.cost?.modelCalls;return{type:"evolution_blocked",title:`Evolution stopped by the environment \u2014 ${i}`,body:`${o.reason??o.skipped}`+(m?` (${m} model call(s) spent before stopping)`:"")+" This is not a verdict about the instruction.",url:a,metadata:{evalTargetId:n,outcome:o.skipped,reason:o.reason,cost:o.cost}}}if(o.skipped||!o.decision)return null;let c=o.nPairs??o.cost?.usablePairs,l=[];if(c!=null){let m=o.cost?.plannedPairs;l.push(`${c}${m?`/${m}`:""} paired task(s)`)}typeof o.cost?.mde=="number"&&l.push(`resolves \xB1${Pq(o.cost.mde)}`),o.cost?.modelCalls&&l.push(`${o.cost.modelCalls} model calls`),o.cost?.wallMs&&l.push(Cq(o.cost.wallMs));let p=o.applied?"APPLIED \u2014 the instruction was rewritten":"recorded only \u2014 nothing was changed";return{type:"evolution_decided",title:`Evolution: ${o.decision} \u2014 ${i}`,body:`${p}. ${l.join(", ")}.`,url:a,metadata:{evalTargetId:n,outcome:o.decision,applied:o.applied===!0,nPairs:c??null,promotionId:o.promotionId??null,cost:o.cost??null}}}d(CA,"buildEvolutionNotification");async function DA(e,t,n,r){try{let[o]=await u.select({evalTargetId:ke.evalTargetId,config:ke.config}).from(ke).where(Wh(xr(ke.id,t),xr(ke.userId,e)));if(!o||o.config?.type==="conversation")return;let[s]=await u.select({name:k.name}).from(k).where(xr(k.id,o.evalTargetId)),i=s?.name??"eval target";n==="failed"?await tn({userId:e,type:"eval_failed",title:"Eval run failed",body:`${i}: ${String(r??"").slice(0,200)}`,url:`/eval-targets/${o.evalTargetId}`,sourceTable:"eval_jobs",sourceId:t}):(await tn({userId:e,type:"eval_completed",title:"Eval run complete",body:`${i} finished`,url:`/eval-targets/${o.evalTargetId}`,sourceTable:"eval_jobs",sourceId:t}),await zc(e,o.evalTargetId))}catch(o){console.error("[job-notifications] eval notify failed:",o instanceof Error?o.stack:o)}}d(DA,"notifyEvalTerminal");async function OA(e,t,n,r){try{let[o]=await u.select({projectPath:W.projectPath}).from(W).where(Wh(xr(W.id,t),xr(W.userId,e)));if(!o)return;let s=null,i;if(o.projectPath){let[p]=await u.select({id:U.id,name:U.name}).from(le).innerJoin(U,xr(U.id,le.projectId)).where(xr(le.path,o.projectPath)).limit(1);p?(s=p.id,i=p.name):i=`${o.projectPath.split("/").pop()||"Unknown"} (unregistered)`}else i="All Projects";let a=new Date().toISOString().slice(0,10),c=`${s??"unmatched"}-${a}`,l=o.projectPath?`/insights/computed?projectPath=${encodeURIComponent(o.projectPath)}&tab=recommendations`:"/insights";n==="failed"?await tn({userId:e,type:"insights_failed",title:"Insights generation failed",body:`${i}: ${String(r??"").slice(0,200)}`,url:l,sourceTable:"insights_jobs",sourceId:c}):await tn({userId:e,type:"insights_ready",title:`Insights ready: ${i}`,body:"New recommendations are available",url:l,sourceTable:"insights_jobs",sourceId:c})}catch(o){console.error("[job-notifications] insights notify failed:",o instanceof Error?o.stack:o)}}d(OA,"notifyInsightsTerminal");async function MA(e,t,n,r){try{let[o]=await u.select({payload:je.payload,result:je.result}).from(je).where(Wh(xr(je.id,t),xr(je.userId,e)));if(!o)return;let s=o.payload?.evalTargetId;if(!s)return;let[i]=await u.select({name:k.name}).from(k).where(xr(k.id,s)),a=CA({targetName:i?.name??"instruction",evalTargetId:s,status:n,result:o.result,error:r});if(!a)return;await tn({userId:e,type:a.type,title:a.title,body:a.body,url:a.url,sourceTable:"agent_jobs",sourceId:t,metadata:a.metadata})}catch(o){console.error("[job-notifications] evolution notify failed:",o instanceof Error?o.stack:o)}}d(MA,"notifyEvolutionTerminal");async function $A(e,t,n,r,o){e==="process_eval"?await DA(t,n,r,o):e==="process_insights"?await OA(t,n,r,o):e==="cron_instruction_evolution"&&await MA(t,n,r,o)}d($A,"notifyTerminal");var ma=new Dq,LA=300,zh={process_eval:3,process_insights:3,process_launch:3,process_send_message:1,process_conversation:1,process_session_goal:1,distill_memories:1,memory_ab:1,process_run_cleanup:1,cron_suggest_instructions:1,cron_refresh_skills:1,cron_refresh_pricing:1,cron_eval_autorun:1,cron_auto_accept_suggestions:1,cron_instruction_training:1,process_judge_review:1,cron_instruction_evolution:1},Oq=["session_send_jobs","launch_jobs","eval_jobs","insights_jobs","agent_jobs"];async function Vh(e,t,n){for(let r of Oq){let o=await u.execute(Xr`
|
|
1316
1321
|
SELECT status, attempts, task_kind
|
|
1317
1322
|
FROM ${Xr.raw(r)}
|
|
1318
1323
|
WHERE id = ${e}
|
|
@@ -1320,14 +1325,14 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1320
1325
|
AND claimed_by = ${n}
|
|
1321
1326
|
AND status IN ('claimed', 'running')
|
|
1322
1327
|
LIMIT 1
|
|
1323
|
-
`);if(o.length>0)return{table:r,status:o[0].status,attempts:o[0].attempts,taskKind:o[0].task_kind}}return null}d(
|
|
1328
|
+
`);if(o.length>0)return{table:r,status:o[0].status,attempts:o[0].attempts,taskKind:o[0].task_kind}}return null}d(Vh,"locateRow");var Mq=vd.object({result:vd.unknown().optional()}),Lq=vd.object({error:vd.string().min(1).max(8192),terminal:vd.boolean().optional().default(!1)});ma.post("/work/:id/heartbeat",async e=>{let t=e.get("userId"),n=e.req.param("id"),o=(await e.req.json().catch(()=>({}))).leaseToken;if(!o)return e.json({error:"leaseToken required"},400);let s=await Vh(n,t,o);return s?(await u.execute(Xr`
|
|
1324
1329
|
UPDATE ${Xr.raw(s.table)}
|
|
1325
|
-
SET lease_expires_at = now() + (${
|
|
1330
|
+
SET lease_expires_at = now() + (${LA}::int * interval '1 second'),
|
|
1326
1331
|
updated_at = now()
|
|
1327
1332
|
WHERE id = ${n}
|
|
1328
1333
|
AND claimed_by = ${o}
|
|
1329
1334
|
AND status IN ('claimed', 'running')
|
|
1330
|
-
`),e.json({ok:!0,leaseDurationSeconds:
|
|
1335
|
+
`),e.json({ok:!0,leaseDurationSeconds:LA})):e.json({error:"job not found or lease lost"},404)});ma.post("/work/:id/complete",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json().catch(()=>({})),o=r.leaseToken;if(!o)return e.json({error:"leaseToken required"},400);let s=Mq.safeParse(r);if(!s.success)return e.json({error:s.error.format()},400);let i=await Vh(n,t,o);if(!i)return e.json({error:"job not found or lease lost"},404);let a=JSON.stringify(s.data.result??null);return await u.execute(Xr`
|
|
1331
1336
|
UPDATE ${Xr.raw(i.table)}
|
|
1332
1337
|
SET status = 'completed',
|
|
1333
1338
|
result = ${a}::jsonb,
|
|
@@ -1339,7 +1344,7 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1339
1344
|
WHERE id = ${n}
|
|
1340
1345
|
AND claimed_by = ${o}
|
|
1341
1346
|
AND status IN ('claimed', 'running')
|
|
1342
|
-
`),await
|
|
1347
|
+
`),await $A(i.taskKind,t,n,"completed"),e.json({ok:!0})});ma.post("/work/:id/fail",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json().catch(()=>({})),o=r.leaseToken;if(!o)return e.json({error:"leaseToken required"},400);let s=Lq.safeParse(r);if(!s.success)return e.json({error:s.error.format()},400);let i=await Vh(n,t,o);if(!i)return e.json({error:"job not found or lease lost"},404);let a=zh[i.taskKind]??3,c=s.data.terminal||i.attempts>=a,l=c?"failed":"pending";return await u.execute(Xr`
|
|
1343
1348
|
UPDATE ${Xr.raw(i.table)}
|
|
1344
1349
|
SET status = ${l},
|
|
1345
1350
|
error = ${s.data.error},
|
|
@@ -1351,12 +1356,12 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1351
1356
|
WHERE id = ${n}
|
|
1352
1357
|
AND claimed_by = ${o}
|
|
1353
1358
|
AND status IN ('claimed', 'running')
|
|
1354
|
-
`),c&&await
|
|
1355
|
-
`)),s=t.webBaseUrl??process.env.RULEMETRIC_WEB_URL??process.env.WEB_URL??"https://rulemetric.com";if(
|
|
1356
|
-
`)}),e.json({processing:!0,resumed:s,announcement:o},202)});
|
|
1359
|
+
`),c&&await $A(i.taskKind,t,n,"failed",s.data.error),e.json({ok:!0,requeued:!c,attempts:i.attempts})});D();import{Hono as Vq}from"hono";import{z as zo}from"zod";import{and as WA,desc as Jq,eq as Qr,isNotNull as Gq,sql as zA}from"drizzle-orm";D();import{and as $q,asc as qq,eq as Tr,gt as Uq,isNotNull as Hq,sql as Bq}from"drizzle-orm";var qA=100,UA=10,bp=new Set;function HA(e){return bp.has(e)}d(HA,"isAnnouncementSendInFlight");async function BA(e,t={}){let n=t.db??u,r=t.sendEmail??ap,o=t.log??(i=>process.stderr.write(`[announcement-sender] ${i}
|
|
1360
|
+
`)),s=t.webBaseUrl??process.env.RULEMETRIC_WEB_URL??process.env.WEB_URL??"https://rulemetric.com";if(bp.has(e))throw new Error(`Announcement ${e} send already in flight`);bp.add(e);try{return await Fq({announcementId:e,db:n,sendEmail:r,log:o,webBaseUrl:s})}finally{bp.delete(e)}}d(BA,"sendAnnouncement");async function Fq(e){let{announcementId:t,db:n,sendEmail:r,log:o,webBaseUrl:s}=e,[i]=await n.select().from(Oe).where(Tr(Oe.id,t)).limit(1);if(!i)throw new Error(`Announcement ${t} not found`);if(i.status!=="queued"&&i.status!=="sending")throw new Error(`Announcement ${t} is in status='${i.status}'; expected 'queued' or 'sending'.`);await n.update(Oe).set({status:"sending",updatedAt:new Date}).where(Tr(Oe.id,t)),o(`Sending announcement ${t} (${i.subject??""})`);let a=0,c=0,l=0,p=0,m=null;try{for(;;){let I=await n.select({userId:At.userId,email:T.email,displayName:T.displayName,unsubscribeToken:At.unsubscribeToken}).from(At).innerJoin(T,Tr(T.id,At.userId)).where($q(Tr(At.productAnnouncements,!0),Hq(T.email),m?Uq(At.userId,m):void 0)).orderBy(qq(At.userId)).limit(qA);if(I.length===0)break;m=I[I.length-1].userId;for(let S=0;S<I.length;S+=UA){let A=I.slice(S,S+UA),E=await Promise.allSettled(A.map(R=>zq({recipient:R,announcement:i,webBaseUrl:s,sendEmail:r,db:n})));for(let R=0;R<E.length;R++){let O=E[R];if(O.status==="fulfilled")O.value.ok==="sent"?a++:O.value.ok==="skipped"?l++:(c++,O.value.provider==="noop"&&p++,o(` recipient ${A[R].userId}: send failed \u2014 ${O.value.error}`));else{c++;let j=O.reason instanceof Error?O.reason.message:String(O.reason);o(` recipient ${A[R].userId}: send failed \u2014 ${j}`)}}}if(I.length<qA)break}p>0&&o(`WARNING: ${p} recipient(s) hit the noop email provider and were recorded as FAILED \u2014 no email provider is configured on this API instance (set RESEND_API_KEY)`);let y=await n.select({status:St.status,count:Bq`count(*)::int`}).from(St).where(Tr(St.announcementId,t)).groupBy(St.status),v={};for(let I of y)v[I.status]=I.count;let h=v.sent??0,f=v.failed??0,w=h===0&&f>0?"failed":"sent",b=f>0?`${f} of ${h+f} recipient(s) failed; see announcement_deliveries`:null;return await n.update(Oe).set({status:w,recipientCount:h,...w==="sent"?{sentAt:new Date}:{},error:b,updatedAt:new Date}).where(Tr(Oe.id,t)),o(`Done: status=${w} sent=${h} failed=${f} (this attempt: sent=${a} failed=${c} skipped=${l})`),{sent:a,failed:c,skipped:l}}catch(y){let v=y instanceof Error?y.message:String(y);throw await n.update(Oe).set({status:"failed",error:v.slice(0,1e3),updatedAt:new Date}).where(Tr(Oe.id,t)).catch(()=>{}),y}}d(Fq,"runSend");function Wq(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}d(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(St).values({announcementId:n.id,userId:t.userId,email:t.email,status:"pending"}).onConflictDoNothing({target:[St.announcementId,St.userId]}).returning({id:St.id});if(i.length===0)return{ok:"skipped",reason:"already-claimed"};let a=i[0].id,c=r.replace(/\/$/,""),l=encodeURIComponent(t.unsubscribeToken),p=`${c}/unsubscribe/${l}`,m=t.displayName?.trim().split(/\s+/)[0]||"there",y=n.htmlBody.replaceAll("{{unsubscribe_url}}",p).replaceAll("{{recipient_name}}",Wq(m)),v=n.textBody.replaceAll("{{unsubscribe_url}}",p).replaceAll("{{recipient_name}}",m);try{let h=await o({to:t.email,subject:n.subject,html:y,text:v,fromName:"RuleMetric",idempotencyKey:a,headers:{"List-Unsubscribe":`<${c}/api/unsubscribe/${l}>`,"List-Unsubscribe-Post":"List-Unsubscribe=One-Click"}});if(h.provider==="noop"){let f="no email provider configured (RESEND_API_KEY unset on the API)";return await s.update(St).set({status:"failed",error:f}).where(Tr(St.id,a)),{ok:"failed",error:f,provider:h.provider}}return await s.update(St).set({status:"sent",providerId:h.id,sentAt:new Date}).where(Tr(St.id,a)),{ok:"sent",providerId:h.id,provider:h.provider}}catch(h){let f=h instanceof Error?h.message:String(h);return await s.update(St).set({status:"failed",error:f.slice(0,1e3)}).where(Tr(St.id,a)).catch(()=>{}),{ok:"failed",error:f}}}d(zq,"sendOne");var Rr=new Vq;Rr.use("/announcements/*",ud());Rr.use("/announcements",ud());Rr.get("/announcements",async e=>{let t=await u.select({id:Oe.id,version:Oe.version,releaseDate:Oe.releaseDate,subject:Oe.subject,status:Oe.status,recipientCount:Oe.recipientCount,sentAt:Oe.sentAt,sentBy:Oe.sentBy,error:Oe.error,createdAt:Oe.createdAt,updatedAt:Oe.updatedAt}).from(Oe).orderBy(Jq(Oe.createdAt));return e.json({announcements:t})});Rr.get("/announcements/:id",async e=>{let t=e.req.param("id");if(!zo.string().uuid().safeParse(t).success)return e.json({error:"Invalid id",code:"VALIDATION_ERROR"},400);let[n]=await u.select().from(Oe).where(Qr(Oe.id,t));if(!n)return e.json({error:"Announcement not found",code:"NOT_FOUND"},404);let r=await u.select({status:St.status,count:zA`count(*)::int`}).from(St).where(Qr(St.announcementId,t)).groupBy(St.status),o={};for(let s of r)o[s.status]=s.count;return e.json({...n,deliveryCounts:o})});Rr.get("/announcements/:id/recipients/count",async e=>{let t=e.req.param("id");if(!zo.string().uuid().safeParse(t).success)return e.json({error:"Invalid id",code:"VALIDATION_ERROR"},400);let n=await Kq();return e.json({count:n})});async function Kq(){let[e]=await u.select({count:zA`count(*)::int`}).from(At).innerJoin(T,Qr(T.id,At.userId)).where(WA(Qr(At.productAnnouncements,!0),Gq(T.email)));return e?.count??0}d(Kq,"countOptedInRecipients");var FA=d(e=>e.includes("{{unsubscribe_url}}"),"hasUnsubscribePlaceholder"),Yq=zo.object({subject:zo.string().min(1).max(500).optional(),htmlBody:zo.string().min(1).refine(FA,{message:"htmlBody must contain the {{unsubscribe_url}} placeholder"}).optional(),textBody:zo.string().min(1).refine(FA,{message:"textBody must contain the {{unsubscribe_url}} placeholder"}).optional()});Rr.patch("/announcements/:id",async e=>{let t=e.req.param("id");if(!zo.string().uuid().safeParse(t).success)return e.json({error:"Invalid id",code:"VALIDATION_ERROR"},400);let n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON",code:"VALIDATION_ERROR"},400)}let r=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(Oe).where(Qr(Oe.id,t));if(!s)return e.json({error:"Announcement not found",code:"NOT_FOUND"},404);if(s.status!=="draft")return e.json({error:"Can only edit draft announcements",code:"INVALID_STATE",status:s.status},409);let[i]=await u.update(Oe).set({...o.subject!==void 0?{subject:o.subject}:{},...o.htmlBody!==void 0?{htmlBody:o.htmlBody}:{},...o.textBody!==void 0?{textBody:o.textBody}:{},updatedAt:new Date}).where(Qr(Oe.id,t)).returning();return e.json(i)});Rr.post("/announcements/:id/send",async e=>{let t=e.get("userId");if(!t)return e.json({error:"Unauthenticated",code:"UNAUTHENTICATED"},401);let n=e.req.param("id");if(!zo.string().uuid().safeParse(n).success)return e.json({error:"Invalid id",code:"VALIDATION_ERROR"},400);let r=await u.update(Oe).set({status:"queued",sentBy:t,updatedAt:new Date}).where(WA(Qr(Oe.id,n),Qr(Oe.status,"draft"))).returning(),o=r[0],s=!1;if(r.length===0){let[i]=await u.select().from(Oe).where(Qr(Oe.id,n));if(!i)return e.json({error:"Announcement not found",code:"NOT_FOUND"},404);if(!((i.status==="queued"||i.status==="sending")&&!HA(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 BA(n).catch(i=>{process.stderr.write(`[announcements] send loop for ${n} failed: ${i instanceof Error?i.message:String(i)}
|
|
1361
|
+
`)}),e.json({processing:!0,resumed:s,announcement:o},202)});D();import{Hono as Xq}from"hono";import{inArray as JA,sql as VA}from"drizzle-orm";var Id=new Xq;function GA(e){let t;try{t=decodeURIComponent(e)}catch{return[]}let n=t.replace(/=+$/,"").replaceAll("+","-").replaceAll("/","_");return t===n?[t]:[t,n]}d(GA,"tokenCandidates");Id.get("/:token",async e=>{let t=e.req.param("token");if(!t||t.length<8)return e.json({error:"invalid_token"},404);let n=GA(t);if(n.length===0)return e.json({error:"invalid_token"},404);let[r]=await u.select({productAnnouncements:At.productAnnouncements,unsubscribedAt:At.unsubscribedAt}).from(At).where(JA(At.unsubscribeToken,n)).limit(1);return r?e.json({valid:!0,alreadyUnsubscribed:r.productAnnouncements===!1}):e.json({error:"invalid_token"},404)});Id.post("/:token",async e=>{let t=e.req.param("token");if(!t||t.length<8)return e.json({error:"invalid_token"},404);let n=GA(t);return n.length===0?e.json({error:"invalid_token"},404):(await u.update(At).set({productAnnouncements:!1,unsubscribedAt:VA`now()`,updatedAt:VA`now()`}).where(JA(At.unsubscribeToken,n)).returning({userId:At.userId})).length===0?e.json({error:"invalid_token"},404):e.json({ok:!0})});D();import{createHash as Qq}from"node:crypto";async function KA(){let e=[],t=0,n=0,r=0;for(let[o,s]of Object.entries(md)){t++;for(let i of s.docs)try{let a=await fetch(i.url,{headers:{"User-Agent":"RuleMetric-Research/1.0"}});if(!a.ok){e.push({provider:o,url:i.url,message:`HTTP ${a.status}`});continue}let c=await a.text(),l=Qq("sha256").update(c).digest("hex"),p=!0,m=[],y=null;try{m=i.parse(c)}catch(f){p=!1,y=f instanceof Error?f.message:String(f)}if((await u.insert(xt).values({provider:o,docUrl:i.url,contentHash:l,content:c,parseSuccess:p,parseErrors:y?[y]:null}).onConflictDoNothing({target:[xt.provider,xt.docUrl,xt.contentHash]}).returning({id:xt.id})).length===1&&p){for(let f of m)await u.insert(we).values({provider:o,plan:f.plan,limitType:f.limitType,value:String(f.value),unit:f.unit,comparator:f.comparator??"=",resetsAt:null,sourceType:"official_docs",sourceUrl:i.url,sourceEvidence:{snapshotHash:l},confidence:"0.85",userId:null}),r++;n++}}catch(a){e.push({provider:o,url:i.url,message:a instanceof Error?a.message:String(a)})}}return{providers_scraped:t,snapshots_inserted:n,observations_inserted:r,errors:e}}d(KA,"scrapeProviderDocs");var Zq=360*60*1e3,YA=!1;function XA(){if(YA)return{stop:d(()=>{},"stop")};YA=!0;let e=setTimeout(()=>{KA().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(()=>{KA().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:d(()=>{clearTimeout(e),clearInterval(t)},"stop")}}d(XA,"startScrapeInterval");var z=new nU,iU=process.env.ALLOWED_ORIGINS?.split(",")??["http://localhost:5174","http://localhost:5175"];z.use("*",rU({origin:d(e=>e?iU.includes(e)?e:"":"*","origin"),allowMethods:["GET","POST","PUT","PATCH","DELETE","OPTIONS"],allowHeaders:["Authorization","Content-Type"],credentials:!0}));z.use("*",$p());z.use("*",Rw());z.use("/api/*",oU({maxSize:10*1024*1024}));z.use("*",Tw);z.use("/auth/login",oc(900*1e3,10));var tE=oc(60*1e3,10);z.use("/api/auth/api-keys",tE);z.use("/api/auth/api-keys/*",tE);z.use("/api/invitations/*",oc(60*1e3,30));z.use("/api/telemetry/cli-error",oc(60*1e3,60));z.route("/",ii);z.route("/api",bu);z.route("/",oi);z.route("/",pd);z.route("/api",Iu);z.route("/api",mp);z.route("/",gp);z.use("/api/*",Sw);z.use("/api/*",Ew);z.use("/api/sessions/:id/context-snapshots",ic);z.use("/api/sessions/:id/events",ic);z.use("/api/sessions/import",ic);z.use("/api/internal/research/observe",ic);z.use("/api/*",async(e,t)=>{let n=e.req.path,r=e.req.method,o=r==="GET"&&n.startsWith("/api/invitations/")&&n!=="/api/invitations/accept",s=r==="GET"&&n==="/api/cli/latest-version",i=r==="POST"&&n==="/api/skills/sync-public",a=(r==="GET"||r==="POST")&&n.startsWith("/api/unsubscribe/");return o||s||i||a?t():vw(e,t)});z.route("/api",wn);z.route("/api",ju);z.route("/api",Nu);z.route("/api",Pu);z.route("/api",mc);z.route("/api",fc);z.route("/api",gc);z.route("/api",_c);z.route("/api",Ou);z.route("/api",ho);z.route("/api",bo);z.route("/api",qc);z.route("/api",fr);z.route("/api",Rl);z.route("/api",Hi);z.route("/api",Fc);z.route("/api",hr);z.route("/api",Ol);z.route("/api",xo);z.route("/api",Bi);z.route("/api",vs);z.route("/api",Is);z.route("/api",Wi);z.route("/api",Br);z.route("/api",Ss);z.route("/api",Ki);z.route("/api",ko);z.route("/api",Bl);z.route("/api",Ln);z.route("/api",mn);z.route("/api",Qi);z.route("/api",Jr);z.route("/api",Oo);z.route("/api",td);z.route("/api",ta);z.route("/api",Mo);z.route("/api",br);z.route("/api",Ds);z.route("/api",Bo);z.route("/api/invitations",id);z.route("/api",dd);z.route("/api",fn);z.route("/api",pp);z.route("/api",ld);z.route("/api",tr);z.route("/api",hd);z.route("/api",wd);z.route("/api",vp);z.route("/api",Ip);z.route("/api",ma);z.route("/api",Rr);z.route("/api/unsubscribe",Id);z.route("/api",fp);var aU=setTimeout(()=>{Ql().catch(()=>{})},5e3),cU=XA(),nE=[{stop:d(()=>clearTimeout(aU),"stop")},cU],dU=fa.dirname(tU(import.meta.url)),Jh=process.env.WEB_DIST_PATH??fa.resolve(dU,"../../../apps/web/dist");if(bd.existsSync(Jh)){let e=d(async t=>{let n=fa.join(Jh,"index.html");if(!bd.existsSync(n))return t.notFound();let{stampRuntimeConfig:r}=await Promise.resolve().then(()=>(eE(),ZA));return t.html(r(bd.readFileSync(n,"utf-8")))},"serveIndex");z.get("/",e),z.get("/index.html",e),z.use("/*",sU({root:Jh,rewriteRequestPath:d(t=>t,"rewriteRequestPath")})),z.get("*",e)}z.onError(Iw);D();import{sql as kr}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",ga=1,mU=["eval_jobs","insights_jobs","launch_jobs","session_send_jobs","agent_jobs"];function ha(){return kr.join(Object.entries(zh).map(([e,t])=>kr`WHEN ${e} THEN ${t}::int`),kr` `)}d(ha,"maxAttemptsCase");async function fU(e){let t=await u.execute(kr`
|
|
1357
1362
|
UPDATE ${kr.raw(e)}
|
|
1358
1363
|
SET status = 'failed',
|
|
1359
|
-
error = ${
|
|
1364
|
+
error = ${lU},
|
|
1360
1365
|
completed_at = now(),
|
|
1361
1366
|
claimed_by = NULL,
|
|
1362
1367
|
claimed_at = NULL,
|
|
@@ -1400,7 +1405,7 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1400
1405
|
END,
|
|
1401
1406
|
error = CASE
|
|
1402
1407
|
WHEN attempts >= (CASE task_kind ${ha()} ELSE 3 END)
|
|
1403
|
-
AND lease_recoveries >= ${ga} THEN ${
|
|
1408
|
+
AND lease_recoveries >= ${ga} THEN ${pU}
|
|
1404
1409
|
ELSE error
|
|
1405
1410
|
END,
|
|
1406
1411
|
completed_at = CASE
|
|
@@ -1415,7 +1420,7 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1415
1420
|
AND claimed_by IS NULL
|
|
1416
1421
|
AND updated_at < now() - interval '15 minutes'
|
|
1417
1422
|
RETURNING id
|
|
1418
|
-
`);return t.length+n.length+r.length}d(
|
|
1423
|
+
`);return t.length+n.length+r.length}d(fU,"reclaimExpiredLeases");async function gU(){return(await u.execute(kr`
|
|
1419
1424
|
UPDATE memory_experiments me
|
|
1420
1425
|
SET status = 'failed',
|
|
1421
1426
|
error = 'reconciler: worker died mid-experiment (backing job terminal, row left running)',
|
|
@@ -1428,12 +1433,12 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1428
1433
|
AND aj.status IN ('failed', 'completed')
|
|
1429
1434
|
)
|
|
1430
1435
|
RETURNING me.id
|
|
1431
|
-
`)).length}d(
|
|
1436
|
+
`)).length}d(gU,"failStrandedMemoryExperiments");function rE(){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 d(n,"runOnce"),{stop(){clearTimeout(e),clearInterval(t)}}}d(rE,"startReconciler");D();import{and as _U,eq as Kh,sql as Sp}from"drizzle-orm";D();import{and as oE,eq as Gh,inArray as hU,sql as sE}from"drizzle-orm";async function iE(e,t){let n=new Map;if(t.length===0)return n;let r=t.map(m=>m.id),o=new Map(t.map(m=>[m.id,m.version])),i=(await u.select({id:_.id,projectId:_.projectId,outcome:sE`${_.analysis}->>'outcome'`}).from(_).where(oE(Gh(_.userId,e),sE`${_.analysis} is not null`)).orderBy(_.id)).map(m=>({id:m.id,key:m.projectId??"(no-project)",score:us(m.outcome)})).filter(m=>m.score!=null),a=await u.select({sessionId:Z.sessionId,treatmentId:Z.treatmentId,treatmentVersion:Z.treatmentVersion}).from(Z).where(oE(Gh(Z.userId,e),Gh(Z.treatmentType,"memory"),hU(Z.treatmentId,r))),c=new Map,l=new Map;for(let m of a){let y=m.treatmentVersion===o.get(m.treatmentId)?c:l,v=y.get(m.treatmentId);v||(v=new Set,y.set(m.treatmentId,v)),v.add(m.sessionId)}let p=d(m=>{let y=c.get(m);if(!y||y.size===0)return"insufficient";let v=l.get(m),h=new Map;for(let f of i){if(v?.has(f.id)&&!y.has(f.id))continue;let w=h.get(f.key);w||(w={key:f.key,withScores:[],withoutScores:[]},h.set(f.key,w)),(y.has(f.id)?w.withScores:w.withoutScores).push(f.score)}return ds(In([...h.values()],{iterations:1e3}))},"effectOf");for(let m of t)n.set(m.id,p(m.id));return n}d(iE,"computeTrustClasses");var yU=1800*1e3;async function wU(e,t){if(t.length===0)return;let n=Sp.join(t.map(r=>Sp`(${r.id}::uuid, ${r.trustClass}::text, ${r.version}::int)`),Sp`, `);await u.execute(Sp`
|
|
1432
1437
|
update memories m
|
|
1433
1438
|
set trust_class = v.cls, trust_version = v.ver, trust_computed_at = now()
|
|
1434
1439
|
from (values ${n}) as v(id, cls, ver)
|
|
1435
1440
|
where m.id = v.id and m.user_id = ${e}
|
|
1436
|
-
`)}d(
|
|
1441
|
+
`)}d(wU,"applyMaterializedTrust");async function vU(e){let t=await u.select({id:F.id,version:F.version}).from(F).where(_U(Kh(F.userId,e),Kh(F.status,"active")));if(t.length===0)return 0;let n=await iE(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}d(vU,"refreshMemoryTrustForUser");async function IU(){let e=await u.selectDistinct({userId:F.userId}).from(F).where(Kh(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}}d(IU,"refreshAllMemoryTrust");function aE(){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 d(n,"runOnce"),{stop(){clearTimeout(e),clearInterval(t)}}}d(aE,"startMemoryTrustRefresh");D();import{sql as bU}from"drizzle-orm";var SU=30*6e4,cE=24,AU=6,dE="pipeline:usage_observations_stale";async function EU(){let e=await u.execute(bU`
|
|
1437
1442
|
WITH active_users AS (
|
|
1438
1443
|
SELECT user_id, count(*) AS sessions_24h
|
|
1439
1444
|
FROM sessions
|
|
@@ -1464,13 +1469,13 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1464
1469
|
LEFT JOIN latest_obs o ON o.user_id = a.user_id
|
|
1465
1470
|
LEFT JOIN first_seen f ON f.user_id = a.user_id
|
|
1466
1471
|
WHERE (o.last_observed IS NULL
|
|
1467
|
-
AND f.first_session < now() - make_interval(hours => ${
|
|
1468
|
-
OR o.last_observed < now() - make_interval(hours => ${
|
|
1472
|
+
AND f.first_session < now() - make_interval(hours => ${cE}))
|
|
1473
|
+
OR o.last_observed < now() - make_interval(hours => ${cE})
|
|
1469
1474
|
)
|
|
1470
1475
|
INSERT INTO alert_dispatches (user_id, alert_key, severity, channel, last_state)
|
|
1471
1476
|
SELECT
|
|
1472
1477
|
s.user_id,
|
|
1473
|
-
${
|
|
1478
|
+
${dE},
|
|
1474
1479
|
'soft',
|
|
1475
1480
|
'in_app',
|
|
1476
1481
|
jsonb_build_object(
|
|
@@ -1487,11 +1492,11 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1487
1492
|
WHERE NOT EXISTS (
|
|
1488
1493
|
SELECT 1 FROM alert_dispatches d
|
|
1489
1494
|
WHERE d.user_id = s.user_id
|
|
1490
|
-
AND d.alert_key = ${
|
|
1491
|
-
AND d.last_dispatched_at > now() - make_interval(hours => ${
|
|
1495
|
+
AND d.alert_key = ${dE}
|
|
1496
|
+
AND d.last_dispatched_at > now() - make_interval(hours => ${AU})
|
|
1492
1497
|
)
|
|
1493
1498
|
RETURNING user_id, id, last_state->>'message' AS message
|
|
1494
|
-
`);e.length>0&&console.log(`[usage-staleness] dispatched stale-pipeline alert for ${e.length} user(s)`);for(let t of e)try{await ua({userId:t.user_id,dispatchId:t.id,severity:"soft",message:t.message??"Usage tracking looks broken \u2014 open /usage.",title:"Usage tracking issue"})}catch(n){console.error("[usage-staleness] bell mirror failed:",n instanceof Error?n.message:n)}return e.length}d(
|
|
1499
|
+
`);e.length>0&&console.log(`[usage-staleness] dispatched stale-pipeline alert for ${e.length} user(s)`);for(let t of e)try{await ua({userId:t.user_id,dispatchId:t.id,severity:"soft",message:t.message??"Usage tracking looks broken \u2014 open /usage.",title:"Usage tracking issue"})}catch(n){console.error("[usage-staleness] bell mirror failed:",n instanceof Error?n.message:n)}return e.length}d(EU,"checkUsageStalenessOnce");function uE(){let e=setTimeout(()=>{n()},6e4),t=setInterval(()=>{n()},SU);async function n(){try{await EU()}catch(r){console.error("[usage-staleness] check failed:",r instanceof Error?r.stack:r)}}return d(n,"runOnce"),{stop:d(()=>{clearTimeout(e),clearInterval(t)},"stop")}}d(uE,"startUsageStalenessChecker");D();import{sql as xU}from"drizzle-orm";var TU=30*6e4,Ap=24,RU=6,lE="pipeline:session_capture_stale";async function kU(){let e=await u.execute(xU`
|
|
1495
1500
|
WITH active_users AS (
|
|
1496
1501
|
SELECT user_id, max(last_seen) AS last_observed,
|
|
1497
1502
|
array_agg(DISTINCT signal) AS signals
|
|
@@ -1501,13 +1506,13 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1501
1506
|
FROM limit_observations
|
|
1502
1507
|
WHERE source_type = 'oauth_usage'
|
|
1503
1508
|
AND user_id IS NOT NULL
|
|
1504
|
-
AND observed_at > now() - make_interval(hours => ${
|
|
1509
|
+
AND observed_at > now() - make_interval(hours => ${Ap})
|
|
1505
1510
|
GROUP BY user_id
|
|
1506
1511
|
UNION ALL
|
|
1507
1512
|
SELECT user_id, max(last_heartbeat), 'worker heartbeat'
|
|
1508
1513
|
FROM worker_connections
|
|
1509
1514
|
WHERE worker_type = 'cli-worker'
|
|
1510
|
-
AND last_heartbeat > now() - make_interval(hours => ${
|
|
1515
|
+
AND last_heartbeat > now() - make_interval(hours => ${Ap})
|
|
1511
1516
|
GROUP BY user_id
|
|
1512
1517
|
UNION ALL
|
|
1513
1518
|
-- Beacons are unauthenticated (no user_id); attribute via the most
|
|
@@ -1523,7 +1528,7 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1523
1528
|
) owner ON true
|
|
1524
1529
|
WHERE e.event = 'hook_capture_failed'
|
|
1525
1530
|
AND e.device_id IS NOT NULL
|
|
1526
|
-
AND e.created_at > now() - make_interval(hours => ${
|
|
1531
|
+
AND e.created_at > now() - make_interval(hours => ${Ap})
|
|
1527
1532
|
GROUP BY owner.user_id
|
|
1528
1533
|
) signal_union
|
|
1529
1534
|
GROUP BY user_id
|
|
@@ -1542,12 +1547,12 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1542
1547
|
FROM active_users a
|
|
1543
1548
|
LEFT JOIN latest_session s ON s.user_id = a.user_id
|
|
1544
1549
|
WHERE s.last_session IS NULL
|
|
1545
|
-
OR s.last_session < now() - make_interval(hours => ${
|
|
1550
|
+
OR s.last_session < now() - make_interval(hours => ${Ap})
|
|
1546
1551
|
)
|
|
1547
1552
|
INSERT INTO alert_dispatches (user_id, alert_key, severity, channel, last_state)
|
|
1548
1553
|
SELECT
|
|
1549
1554
|
s.user_id,
|
|
1550
|
-
${
|
|
1555
|
+
${lE},
|
|
1551
1556
|
'soft',
|
|
1552
1557
|
'in_app',
|
|
1553
1558
|
jsonb_build_object(
|
|
@@ -1566,11 +1571,11 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1566
1571
|
WHERE NOT EXISTS (
|
|
1567
1572
|
SELECT 1 FROM alert_dispatches d
|
|
1568
1573
|
WHERE d.user_id = s.user_id
|
|
1569
|
-
AND d.alert_key = ${
|
|
1570
|
-
AND d.last_dispatched_at > now() - make_interval(hours => ${
|
|
1574
|
+
AND d.alert_key = ${lE}
|
|
1575
|
+
AND d.last_dispatched_at > now() - make_interval(hours => ${RU})
|
|
1571
1576
|
)
|
|
1572
1577
|
RETURNING user_id, id, last_state->>'message' AS message
|
|
1573
|
-
`);e.length>0&&console.log(`[capture-staleness] dispatched stale-capture alert for ${e.length} user(s)`);for(let t of e)try{await ua({userId:t.user_id,dispatchId:t.id,severity:"soft",message:t.message??"Session capture looks broken \u2014 check the proxy.",title:"Session capture issue"})}catch(n){console.error("[capture-staleness] bell mirror failed:",n instanceof Error?n.message:n)}return e.length}d(
|
|
1578
|
+
`);e.length>0&&console.log(`[capture-staleness] dispatched stale-capture alert for ${e.length} user(s)`);for(let t of e)try{await ua({userId:t.user_id,dispatchId:t.id,severity:"soft",message:t.message??"Session capture looks broken \u2014 check the proxy.",title:"Session capture issue"})}catch(n){console.error("[capture-staleness] bell mirror failed:",n instanceof Error?n.message:n)}return e.length}d(kU,"checkCaptureStalenessOnce");function pE(){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 d(n,"runOnce"),{stop:d(()=>{clearTimeout(e),clearInterval(t)},"stop")}}d(pE,"startCaptureStalenessChecker");D();import{sql as mE}from"drizzle-orm";var jU=900*1e3,fE=6,gE=60,NU=mE`array['user_message','tool_call','tool_result']`;async function PU(){return[...await u.execute(mE`
|
|
1574
1579
|
WITH session_stats AS (
|
|
1575
1580
|
SELECT s.id,
|
|
1576
1581
|
s.external_session_id,
|
|
@@ -1578,10 +1583,10 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1578
1583
|
(
|
|
1579
1584
|
SELECT MAX(timestamp) FROM session_events e
|
|
1580
1585
|
WHERE e.session_id = s.id
|
|
1581
|
-
AND e.event_type = ANY(${
|
|
1586
|
+
AND e.event_type = ANY(${NU})
|
|
1582
1587
|
) AS last_hook_event
|
|
1583
1588
|
FROM sessions s
|
|
1584
|
-
WHERE s.started_at > now() - (${
|
|
1589
|
+
WHERE s.started_at > now() - (${fE}::int * interval '1 hour')
|
|
1585
1590
|
)
|
|
1586
1591
|
SELECT ss.id AS "sessionId",
|
|
1587
1592
|
ss.external_session_id AS "externalSessionId",
|
|
@@ -1592,8 +1597,8 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1592
1597
|
FROM session_stats ss
|
|
1593
1598
|
JOIN context_snapshots cs ON cs.session_id = ss.id
|
|
1594
1599
|
WHERE ss.last_hook_event IS NOT NULL
|
|
1595
|
-
AND cs.captured_at > ss.last_hook_event + (${
|
|
1600
|
+
AND cs.captured_at > ss.last_hook_event + (${gE}::int * interval '1 second')
|
|
1596
1601
|
GROUP BY ss.id, ss.external_session_id, ss.tool
|
|
1597
1602
|
HAVING COUNT(cs.id) > 0
|
|
1598
|
-
`)]}d(
|
|
1599
|
-
`)){let t=e.trim();if(!t||t.startsWith("#"))continue;let n=t.indexOf("=");if(n===-1)continue;let r=t.slice(0,n),o=t.slice(n+1);process.env[r]||(process.env[r]=o)}process.env.PG_APPLICATION_NAME||="rulemetric-api";var
|
|
1603
|
+
`)]}d(PU,"auditPollutionOnce");function hE(){let e=setTimeout(()=>{n()},6e4),t=setInterval(()=>{n()},jU);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=${fE}h, grace=${gE}s)`)}catch(r){console.error("[pollution-auditor] pass failed:",r instanceof Error?r.stack:r)}}return d(n,"runOnce"),{stop(){clearTimeout(e),clearInterval(t)}}}d(hE,"startPollutionAuditor");D();var OU=xp.dirname(CU(import.meta.url)),_E=xp.resolve(OU,"../../../.env.local");if(Ep.existsSync(_E))for(let e of Ep.readFileSync(_E,"utf-8").split(`
|
|
1604
|
+
`)){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 MU=Up({serviceName:"rulemetric-api"});MU?console.log("[sentry] error capture enabled"):process.env.NODE_ENV==="production"&&console.log("[sentry] no SENTRY_DSN \u2014 error capture disabled");var Yh=Dp({serviceName:"rulemetric-api"});console.log(Yh==="otlp"?`[otel] traces exporting to ${process.env.OTEL_EXPORTER_OTLP_ENDPOINT}`:Yh==="console"?"[otel] traces printing to stdout (set OTEL_EXPORTER_OTLP_ENDPOINT to ship to a backend)":Yh==="silent"?"[otel] traces enabled, span export OFF (OTEL_SPAN_EXPORT=none \u2014 no stdout span dump)":"[otel] disabled (TELEMETRY_ENABLED=false)");var LU=new Set(["CONNECT_TIMEOUT","ETIMEDOUT","ENOTFOUND","ECONNRESET","ECONNREFUSED","EAI_AGAIN","EPIPE"]);process.on("unhandledRejection",e=>{let t=ri(e);console.error(`[guard] unhandledRejection${t?` code=${t}`:""}: ${e instanceof Error?e.message:String(e)}`),rr(e,{tags:{source:"unhandledRejection",code:t??"unknown"}})});process.on("uncaughtException",e=>{let t=ri(e);if(t&&LU.has(t)){console.error(`[guard] uncaughtException (transient net code=${t}) \u2014 surviving: ${e.message}`),rr(e,{tags:{source:"uncaughtException",code:t}});return}console.error("[guard] uncaughtException (fatal):",e),rr(e,{tags:{source:"uncaughtException",code:t??"unknown"}}),Promise.allSettled([Sa(2e3),Za()]).finally(()=>process.exit(1))});var Xh=Number(process.env.API_PORT)||3e3;console.log(`RuleMetric API starting on port ${Xh}`);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=pf();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 wE,Vo=[],yE=!1;async function $U(){let e=DU({fetch:z.fetch,hostname:"0.0.0.0",port:Xh});wE=e,e.keepAliveTimeout=65e3,e.headersTimeout=66e3,console.log(`RuleMetric API running at http://localhost:${Xh} (keepAliveTimeout=65s)`),_w().then(t=>console.log(`[auth] JWKS prime ${t?"ok":"deferred (will fetch on first auth)"}`)),Vo.push(rE()),Vo.push(aE()),sl()&&KI(),yp()&&vA(),Vo.push(uE()),Vo.push(pE()),Vo.push(Pw()),Vo.push(hE()),Vo.push(...nE)}d($U,"start");$U().catch(e=>{console.error("Failed to start API:",e),rr(e,{tags:{phase:"boot",source:"start"}}),Promise.allSettled([Sa(2e3),Za()]).finally(()=>process.exit(1))});async function vE(){if(!yE){yE=!0;for(let e of Vo)try{e.stop()}catch{}try{wE?.close?.()}catch{}try{await YI(5e3)}catch{}try{await IA(5e3)}catch{}await Promise.allSettled([Op(),Sa(2e3),Za()]),process.exit(0)}}d(vE,"gracefulShutdown");process.on("SIGTERM",vE);process.on("SIGINT",vE);
|