@rulemetric/local 0.10.0 → 0.11.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/meta.json +2 -2
- package/dist/server.mjs +219 -302
- package/dist/supabase/migrations/00184_auto_accept_budget_settings.sql +113 -0
- package/dist/web/assets/{docs-D_fJ3Svo.js → docs-B_21wyvj.js} +35 -48
- package/dist/web/assets/{index-D8PcENaI.js → index-OhhQFJmS.js} +48 -48
- package/dist/web/assets/index-_M9l6iMX.css +1 -0
- package/dist/web/index.html +3 -3
- package/package.json +2 -2
- package/dist/web/assets/index-B2QaicI_.css +0 -1
package/dist/server.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
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`
|
|
1
|
+
var t_=Object.defineProperty;var u=(e,t)=>t_(e,"name",{value:t,configurable:!0}),Rm=(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 V=(e,t)=>()=>(e&&(t=e(e=0)),t);var to=(e,t)=>{for(var n in t)t_(e,n,{get:t[n],enumerable:!0})};import{pgTable as xu,text as Hs,timestamp as Sa,jsonb as s_,uuid as Go,primaryKey as i_}from"drizzle-orm/pg-core";var K,G,Q,_e,Yo=V(()=>{"use strict";K=xu("organizations",{id:Go("id").primaryKey().defaultRandom(),name:Hs("name").unique().notNull(),slug:Hs("slug").unique().notNull(),metadata:s_("metadata"),createdAt:Sa("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Sa("updated_at",{withTimezone:!0}).defaultNow()}),G=xu("teams",{id:Go("id").primaryKey().defaultRandom(),orgId:Go("org_id").references(()=>K.id,{onDelete:"cascade"}),name:Hs("name").notNull(),slug:Hs("slug").notNull(),metadata:s_("metadata"),createdAt:Sa("created_at",{withTimezone:!0}).defaultNow()}),Q=xu("user_organizations",{userId:Go("user_id").notNull(),orgId:Go("org_id").references(()=>K.id,{onDelete:"cascade"}).notNull(),role:Hs("role").notNull().default("member"),createdAt:Sa("created_at",{withTimezone:!0}).defaultNow()},e=>[i_({columns:[e.userId,e.orgId]})]),_e=xu("user_teams",{userId:Go("user_id").notNull(),teamId:Go("team_id").references(()=>G.id,{onDelete:"cascade"}).notNull(),role:Hs("role").notNull().default("member"),createdAt:Sa("created_at",{withTimezone:!0}).defaultNow()},e=>[i_({columns:[e.userId,e.teamId]})])});import{boolean as Tu,integer as Lm,pgTable as TA,real as a_,text as Ru,timestamp as Mm,uuid as c_}from"drizzle-orm/pg-core";var T,Ht=V(()=>{"use strict";Yo();T=TA("profiles",{id:c_("id").primaryKey(),email:Ru("email"),displayName:Ru("display_name"),activeOrgId:c_("active_org_id").references(()=>K.id,{onDelete:"set null"}),isSuperadmin:Tu("is_superadmin").notNull().default(!1),claudeCodePlan:Ru("claude_code_plan"),planSource:Ru("plan_source").notNull().default("detected"),setupCompletedAt:Mm("setup_completed_at",{withTimezone:!0}),liveSendSkipped:Tu("live_send_skipped").notNull().default(!1),autoAcceptSuggestions:Tu("auto_accept_suggestions").notNull().default(!0),evolutionPaused:Tu("evolution_paused").notNull().default(!1),suggestionConfidenceThreshold:a_("suggestion_confidence_threshold").notNull().default(.7),autoAcceptMinScore:a_("auto_accept_min_score"),autoAcceptMaxPerRun:Lm("auto_accept_max_per_run"),autoAcceptMaxPerWindow:Lm("auto_accept_max_per_window"),autoAcceptWindowDays:Lm("auto_accept_window_days"),createdAt:Mm("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Mm("updated_at",{withTimezone:!0}).defaultNow()})});import{pgTable as RA,text as $m,timestamp as ku,uuid as Nu,index as u_}from"drizzle-orm/pg-core";var ae,d_=V(()=>{"use strict";Yo();Ht();ae=RA("org_invitations",{id:Nu("id").primaryKey().defaultRandom(),orgId:Nu("org_id").notNull().references(()=>K.id,{onDelete:"cascade"}),email:$m("email").notNull(),role:$m("role").notNull().default("member"),teamId:Nu("team_id").references(()=>G.id,{onDelete:"set null"}),invitedBy:Nu("invited_by").notNull().references(()=>T.id,{onDelete:"cascade"}),token:$m("token").notNull().unique(),expiresAt:ku("expires_at",{withTimezone:!0}).notNull(),acceptedAt:ku("accepted_at",{withTimezone:!0}),revokedAt:ku("revoked_at",{withTimezone:!0}),createdAt:ku("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[u_("idx_org_invitations_token").on(e.token),u_("idx_org_invitations_org").on(e.orgId)])});import{pgTable as qm,text as Vt,timestamp as no,jsonb as ju,uuid as or,integer as Pu,boolean as kA,uniqueIndex as Du,index as Aa}from"drizzle-orm/pg-core";var g,sr,Se,zn=V(()=>{"use strict";g=qm("instructions",{id:or("id").primaryKey().defaultRandom(),name:Vt("name").notNull(),description:Vt("description").notNull(),type:Vt("type").notNull().default("instruction"),scope:Vt("scope").notNull(),scopeRef:or("scope_ref"),version:Vt("version").notNull(),content:Vt("content").notNull(),frontmatter:ju("frontmatter").notNull(),slots:ju("slots"),tags:Vt("tags").array(),compatibility:Vt("compatibility").array(),createdBy:or("created_by"),createdAt:no("created_at",{withTimezone:!0}).defaultNow(),updatedAt:no("updated_at",{withTimezone:!0}).defaultNow(),archived:kA("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:Vt("upstream_version"),badge:Vt("badge"),contentHash:Vt("content_hash"),contextIdentity:Vt("context_identity"),scanScore:Pu("scan_score"),scanFindings:ju("scan_findings"),popularityScore:Pu("popularity_score"),sourceUpdatedAt:no("source_updated_at",{withTimezone:!0})},e=>[Du("instructions_name_scope_ref_idx").on(e.name,e.scope,e.scopeRef),Aa("idx_instructions_scope").on(e.scope,e.scopeRef),Aa("idx_instructions_created_by").on(e.createdBy),Aa("idx_instructions_context_identity").on(e.createdBy,e.contextIdentity),Aa("idx_instructions_public_recency").on(e.scope,e.sourceUpdatedAt.desc())]),sr=qm("instruction_version_identities",{id:or("id").primaryKey().defaultRandom(),instructionId:or("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),contentHash:Vt("content_hash").notNull(),versionOrdinal:Pu("version_ordinal").notNull(),content:Vt("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=>[Du("instruction_version_identities_hash_unique").on(e.instructionId,e.contentHash),Du("instruction_version_identities_ordinal_unique").on(e.instructionId,e.versionOrdinal),Aa("idx_ivi_instruction").on(e.instructionId)]),Se=qm("instruction_versions",{id:or("id").primaryKey().defaultRandom(),instructionId:or("instruction_id").references(()=>g.id,{onDelete:"cascade"}),versionNumber:Pu("version_number").notNull(),content:Vt("content").notNull(),frontmatter:ju("frontmatter").notNull(),changeSummary:Vt("change_summary"),createdBy:or("created_by"),createdAt:no("created_at",{withTimezone:!0}).defaultNow()},e=>[Du("instruction_versions_instruction_version_idx").on(e.instructionId,e.versionNumber)])});import{pgTable as NA,text as jA,timestamp as PA,jsonb as DA,uuid as Um,index as l_}from"drizzle-orm/pg-core";var Pt,m_=V(()=>{"use strict";zn();Pt=NA("instruction_events",{id:Um("id").primaryKey().defaultRandom(),instructionId:Um("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),eventType:jA("event_type").notNull(),actorId:Um("actor_id").notNull(),metadata:DA("metadata"),createdAt:PA("created_at",{withTimezone:!0}).defaultNow()},e=>[l_("idx_instruction_events_instruction").on(e.instructionId),l_("idx_instruction_events_type").on(e.eventType)])});import{boolean as OA,jsonb as CA,pgTable as Bm,primaryKey as p_,text as Xo,timestamp as Ea,uniqueIndex as Hm,uuid as Qo}from"drizzle-orm/pg-core";import{sql as LA}from"drizzle-orm";var M,it,de,Pr=V(()=>{"use strict";Yo();zn();M=Bm("projects",{id:Qo("id").primaryKey().defaultRandom(),orgId:Qo("org_id").references(()=>K.id,{onDelete:"cascade"}),name:Xo("name").notNull(),description:Xo("description"),githubRepo:Xo("github_repo"),gitRemoteUrl:Xo("git_remote_url"),gitRootCommit:Xo("git_root_commit"),gitRemoteAliases:Xo("git_remote_aliases").array().notNull().default([]),metadata:CA("metadata"),createdBy:Qo("created_by"),createdAt:Ea("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Ea("updated_at",{withTimezone:!0}).defaultNow()},e=>[Hm("projects_org_name_idx").on(e.orgId,e.name),Hm("projects_git_remote_url_unique").on(e.gitRemoteUrl).where(LA`${e.gitRemoteUrl} IS NOT NULL`)]),it=Bm("project_instructions",{projectId:Qo("project_id").references(()=>M.id,{onDelete:"cascade"}).notNull(),instructionId:Qo("instruction_id").references(()=>g.id,{onDelete:"cascade"}).notNull(),addedAt:Ea("added_at",{withTimezone:!0}).defaultNow(),addedBy:Qo("added_by")},e=>[p_({columns:[e.projectId,e.instructionId]})]),de=Bm("project_checkouts",{projectId:Qo("project_id").references(()=>M.id,{onDelete:"cascade"}).notNull(),path:Xo("path").notNull(),isWorktree:OA("is_worktree").notNull().default(!1),firstSeen:Ea("first_seen",{withTimezone:!0}).notNull().defaultNow(),lastSeen:Ea("last_seen",{withTimezone:!0}).notNull().defaultNow()},e=>[p_({columns:[e.projectId,e.path]}),Hm("project_checkouts_path_unique").on(e.path)])});import{pgTable as MA,text as Bs,timestamp as Fm,jsonb as f_,uuid as Ou,integer as $A,boolean as qA,index as Wm}from"drizzle-orm/pg-core";var X,Cu=V(()=>{"use strict";Ht();Yo();Pr();X=MA("agent_runs",{id:Ou("id").primaryKey().defaultRandom(),userId:Ou("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),orgId:Ou("org_id").references(()=>K.id,{onDelete:"set null"}),projectId:Ou("project_id").references(()=>M.id,{onDelete:"set null"}),projectPath:Bs("project_path"),gitRemote:Bs("git_remote"),baseBranch:Bs("base_branch"),title:Bs("title"),prompt:Bs("prompt"),toolSpec:f_("tool_spec").notNull().default([]),autoWorktree:qA("auto_worktree").notNull().default(!0),status:Bs("status").notNull().default("pending"),sessionCount:$A("session_count").notNull().default(0),metadata:f_("metadata").notNull().default({}),createdAt:Fm("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:Fm("updated_at",{withTimezone:!0}).notNull().defaultNow(),completedAt:Fm("completed_at",{withTimezone:!0})},e=>[Wm("idx_agent_runs_user").on(e.userId),Wm("idx_agent_runs_org_created").on(e.orgId,e.createdAt),Wm("idx_agent_runs_project").on(e.projectId)])});import{pgTable as zm,text as hn,timestamp as xa,jsonb as Zo,uuid as Dr,integer as Lu,uniqueIndex as g_,index as ir}from"drizzle-orm/pg-core";var y,$e,se,Fs=V(()=>{"use strict";zn();Pr();Ht();Yo();Cu();y=zm("sessions",{id:Dr("id").primaryKey().defaultRandom(),userId:Dr("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),externalSessionId:hn("external_session_id"),projectId:Dr("project_id").references(()=>M.id,{onDelete:"set null"}),orgId:Dr("org_id").references(()=>K.id,{onDelete:"set null"}),tool:hn("tool").notNull(),projectPath:hn("project_path"),gitBranch:hn("git_branch"),startedAt:xa("started_at",{withTimezone:!0}).notNull(),endedAt:xa("ended_at",{withTimezone:!0}),eventCount:Lu("event_count").default(0),tokenUsage:Zo("token_usage"),analysis:Zo("analysis"),analyzedAt:xa("analyzed_at",{withTimezone:!0}),analyzedEventCount:Lu("analyzed_event_count"),analyzedTurnCount:Lu("analyzed_turn_count"),metadata:Zo("metadata").default({}),origin:hn("origin").notNull().default("unknown"),runId:Dr("run_id").references(()=>X.id,{onDelete:"set null"}),model:hn("model"),harnessVersion:hn("harness_version"),createdAt:xa("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),g_("idx_sessions_user_external").on(e.userId,e.externalSessionId)]),$e=zm("session_events",{id:Dr("id").primaryKey().defaultRandom(),sessionId:Dr("session_id").notNull().references(()=>y.id,{onDelete:"cascade"}),sequence:Lu("sequence").notNull(),eventType:hn("event_type").notNull(),content:hn("content"),toolName:hn("tool_name"),toolInput:Zo("tool_input"),toolOutput:Zo("tool_output"),tokenUsage:Zo("token_usage"),model:hn("model"),timestamp:xa("timestamp",{withTimezone:!0}).notNull(),metadata:Zo("metadata").default({})},e=>[g_("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=zm("session_instructions",{sessionId:Dr("session_id").notNull().references(()=>y.id,{onDelete:"cascade"}),instructionId:Dr("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 h_,text as Mu,timestamp as __,uuid as ar,integer as y_,index as Ws,unique as UA}from"drizzle-orm/pg-core";var kt,Z,w_=V(()=>{"use strict";Ht();Pr();Fs();kt=h_("treatment_assignments",{id:ar("id").primaryKey().defaultRandom(),userId:ar("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),treatmentType:Mu("treatment_type").notNull(),treatmentId:ar("treatment_id").notNull(),treatmentVersion:y_("treatment_version").notNull().default(1),projectId:ar("project_id").references(()=>M.id,{onDelete:"set null"}),assignedBy:ar("assigned_by").references(()=>T.id,{onDelete:"set null"}),method:Mu("method").notNull(),assignedAt:__("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=h_("treatment_exposures",{id:ar("id").primaryKey().defaultRandom(),sessionId:ar("session_id").notNull().references(()=>y.id,{onDelete:"cascade"}),userId:ar("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),treatmentType:Mu("treatment_type").notNull(),treatmentId:ar("treatment_id").notNull(),treatmentVersion:y_("treatment_version").notNull().default(1),assignmentId:ar("assignment_id").references(()=>kt.id,{onDelete:"set null"}),method:Mu("method").notNull(),exposedAt:__("exposed_at",{withTimezone:!0}).notNull().defaultNow()},e=>[UA("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 HA,text as Vm,timestamp as BA,uuid as $u,integer as FA,index as v_,uniqueIndex as WA}from"drizzle-orm/pg-core";var qu,I_=V(()=>{"use strict";Ht();Pr();qu=HA("pending_treatment_exposures",{id:$u("id").primaryKey().defaultRandom(),userId:$u("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),externalSessionId:Vm("external_session_id").notNull(),treatmentType:Vm("treatment_type").notNull(),treatmentId:$u("treatment_id").notNull(),treatmentVersion:FA("treatment_version").notNull().default(1),method:Vm("method").notNull().default("injected"),projectId:$u("project_id").references(()=>M.id,{onDelete:"set null"}),createdAt:BA("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[WA("pending_treatment_exposures_unique").on(e.externalSessionId,e.treatmentType,e.treatmentId,e.treatmentVersion),v_("idx_pending_treatment_exposures_ext").on(e.externalSessionId),v_("idx_pending_treatment_exposures_user").on(e.userId)])});import{pgTable as b_,text as ro,timestamp as S_,uuid as zs,numeric as zA,index as Jm,unique as VA}from"drizzle-orm/pg-core";var U,Or,Km=V(()=>{"use strict";Ht();zn();U=b_("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:zA("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:S_("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Jm("idx_instruction_experiments_lookup").on(e.userId,e.projectPath)]),Or=b_("instruction_experiment_arms",{id:zs("id").primaryKey().defaultRandom(),experimentId:zs("experiment_id").notNull().references(()=>U.id,{onDelete:"cascade"}),userId:zs("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),externalSessionId:ro("external_session_id").notNull(),arm:ro("arm").notNull(),assignedAt:S_("assigned_at",{withTimezone:!0}).notNull().defaultNow()},e=>[VA("instruction_experiment_arms_unique").on(e.experimentId,e.externalSessionId),Jm("idx_instruction_experiment_arms_experiment").on(e.experimentId,e.arm),Jm("idx_instruction_experiment_arms_session").on(e.externalSessionId)])});import{pgTable as JA,text as Gm,timestamp as KA,uuid as Uu,numeric as Ym,integer as A_,jsonb as GA,index as YA,unique as XA}from"drizzle-orm/pg-core";var Y,E_=V(()=>{"use strict";Ht();zn();Km();Y=JA("instruction_verdicts",{id:Uu("id").primaryKey().defaultRandom(),userId:Uu("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),instructionId:Uu("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),contentHash:Gm("content_hash").notNull(),projectPath:Gm("project_path").notNull(),segment:GA("segment").notNull().default({}),decision:Gm("decision").notNull(),delta:Ym("delta").notNull(),ciLower:Ym("ci_lower").notNull(),ciUpper:Ym("ci_upper").notNull(),nTreated:A_("n_treated").notNull(),nControl:A_("n_control").notNull(),experimentId:Uu("experiment_id").references(()=>U.id,{onDelete:"set null"}),decidedAt:KA("decided_at",{withTimezone:!0}).notNull().defaultNow()},e=>[XA("instruction_verdicts_unique").on(e.instructionId,e.contentHash,e.projectPath),YA("idx_instruction_verdicts_render").on(e.userId,e.projectPath)])});import{pgTable as QA,text as Hu,timestamp as Xm,uuid as Qm,integer as ZA,unique as eE,index as tE}from"drizzle-orm/pg-core";var Ae,x_=V(()=>{"use strict";Ht();Ae=QA("insight_recommendation_log",{id:Qm("id").primaryKey().defaultRandom(),userId:Qm("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),projectPath:Hu("project_path").notNull().default(""),category:Hu("category").notNull(),contentHash:Hu("content_hash").notNull(),label:Hu("label").notNull().default(""),firstSeenAt:Xm("first_seen_at",{withTimezone:!0}).notNull().defaultNow(),lastSeenAt:Xm("last_seen_at",{withTimezone:!0}).notNull().defaultNow(),timesGenerated:ZA("times_generated").notNull().default(1),lastJobId:Qm("last_job_id"),dismissedAt:Xm("dismissed_at",{withTimezone:!0})},e=>[eE("insight_recommendation_log_unique").on(e.userId,e.projectPath,e.contentHash),tE("idx_insight_recommendation_log_read").on(e.userId,e.projectPath)])});import{pgTable as nE,text as Vs,timestamp as Zm,uuid as Ta,integer as T_,index as Bu}from"drizzle-orm/pg-core";var F,ep=V(()=>{"use strict";Ht();Pr();F=nE("memories",{id:Ta("id").primaryKey().defaultRandom(),userId:Ta("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),orgId:Ta("org_id"),projectId:Ta("project_id").references(()=>M.id,{onDelete:"set null"}),version:T_("version").notNull().default(1),parentId:Ta("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:T_("trust_version"),trustComputedAt:Zm("trust_computed_at",{withTimezone:!0}),createdAt:Zm("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:Zm("updated_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Bu("idx_memories_user").on(e.userId),Bu("idx_memories_project").on(e.projectId),Bu("idx_memories_parent").on(e.parentId),Bu("idx_memories_user_status").on(e.userId,e.status)])});import{pgTable as rE,text as Ra,timestamp as tp,uuid as np,integer as R_,jsonb as oE,index as k_}from"drizzle-orm/pg-core";var Nt,N_=V(()=>{"use strict";Ht();ep();Nt=rE("memory_experiments",{id:np("id").primaryKey().defaultRandom(),memoryId:np("memory_id").notNull().references(()=>F.id,{onDelete:"cascade"}),userId:np("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),memoryVersion:R_("memory_version").notNull().default(1),taskPrompt:Ra("task_prompt").notNull(),expectations:Ra("expectations").array().notNull().default([]),trials:R_("trials").notNull().default(10),model:Ra("model"),status:Ra("status").notNull().default("pending"),result:oE("result").$type(),error:Ra("error"),createdAt:tp("created_at",{withTimezone:!0}).notNull().defaultNow(),startedAt:tp("started_at",{withTimezone:!0}),completedAt:tp("completed_at",{withTimezone:!0})},e=>[k_("idx_memory_experiments_memory").on(e.memoryId),k_("idx_memory_experiments_user").on(e.userId)])});import{pgTable as sE,text as Js,timestamp as rp,uuid as op,jsonb as iE,uniqueIndex as aE,index as j_}from"drizzle-orm/pg-core";var ze,sp=V(()=>{"use strict";Ht();Fs();ze=sE("session_terminal_targets",{id:op("id").primaryKey().defaultRandom(),userId:op("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),sessionId:op("session_id").references(()=>y.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:iE("metadata").notNull().default({}),lastSeenAt:rp("last_seen_at",{withTimezone:!0}).defaultNow(),createdAt:rp("created_at",{withTimezone:!0}).defaultNow(),updatedAt:rp("updated_at",{withTimezone:!0}).defaultNow()},e=>[aE("idx_session_terminal_targets_user_target").on(e.userId,e.target),j_("idx_session_terminal_targets_session").on(e.sessionId),j_("idx_session_terminal_targets_user_status").on(e.userId,e.status)])});import{boolean as cE,index as Fu,jsonb as P_,pgTable as uE,text as es,timestamp as ka,uuid as Wu,integer as D_}from"drizzle-orm/pg-core";var zu,O_=V(()=>{"use strict";Fs();sp();zu=uE("session_send_jobs",{id:Wu("id").primaryKey().defaultRandom(),userId:Wu("user_id").notNull(),sessionId:Wu("session_id").notNull().references(()=>y.id,{onDelete:"cascade"}),terminalTargetId:Wu("terminal_target_id").references(()=>ze.id,{onDelete:"set null"}),target:es("target").notNull(),message:es("message").notNull(),submit:cE("submit").notNull().default(!0),delivery:es("delivery").notNull().default("live"),status:es("status").notNull().default("pending"),result:P_("result"),error:es("error"),attempts:D_("attempts").notNull().default(0),taskKind:es("task_kind"),payload:P_("payload"),claimedBy:es("claimed_by"),claimedAt:ka("claimed_at",{withTimezone:!0}),leaseExpiresAt:ka("lease_expires_at",{withTimezone:!0}),leaseRecoveries:D_("lease_recoveries").notNull().default(0),createdAt:ka("created_at",{withTimezone:!0}).defaultNow(),updatedAt:ka("updated_at",{withTimezone:!0}).defaultNow(),completedAt:ka("completed_at",{withTimezone:!0})},e=>[Fu("idx_session_send_jobs_user").on(e.userId),Fu("idx_session_send_jobs_session").on(e.sessionId),Fu("idx_session_send_jobs_status").on(e.status),Fu("idx_session_send_jobs_pending").on(e.userId,e.status)])});import{pgTable as L_,text as ts,timestamp as Vu,jsonb as M_,uuid as oo,integer as dE,boolean as lE,uniqueIndex as mE,index as C_,primaryKey as pE}from"drizzle-orm/pg-core";var Le,De,$_=V(()=>{"use strict";zn();Le=L_("packs",{id:oo("id").primaryKey().defaultRandom(),name:ts("name").notNull(),description:ts("description").notNull(),scope:ts("scope").notNull(),scopeRef:oo("scope_ref"),version:ts("version").notNull().default("1.0.0"),tags:ts("tags").array(),badge:ts("badge"),metadata:M_("metadata"),createdBy:oo("created_by"),createdAt:Vu("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Vu("updated_at",{withTimezone:!0}).defaultNow(),archived:lE("archived").default(!1),archivedAt:Vu("archived_at",{withTimezone:!0}),archivedBy:oo("archived_by"),forkedFromId:oo("forked_from_id").references(()=>Le.id,{onDelete:"set null"}),upstreamVersion:ts("upstream_version")},e=>[mE("packs_name_scope_ref_idx").on(e.name,e.scope,e.scopeRef),C_("idx_packs_scope").on(e.scope,e.scopeRef),C_("idx_packs_created_by").on(e.createdBy)]),De=L_("pack_instructions",{packId:oo("pack_id").references(()=>Le.id,{onDelete:"cascade"}).notNull(),instructionId:oo("instruction_id").references(()=>g.id,{onDelete:"cascade"}).notNull(),position:dE("position").notNull().default(0),slotOverrides:M_("slot_overrides"),addedAt:Vu("added_at",{withTimezone:!0}).defaultNow(),addedBy:oo("added_by")},e=>[pE({columns:[e.packId,e.instructionId]})])});import{pgTable as fE,text as ip,timestamp as gE,jsonb as hE,uuid as ap,index as Ks}from"drizzle-orm/pg-core";var so,q_=V(()=>{"use strict";zn();so=fE("instruction_usage_events",{id:ap("id").primaryKey().defaultRandom(),instructionId:ap("instruction_id").references(()=>g.id,{onDelete:"set null"}),userId:ap("user_id").notNull(),surface:ip("surface").notNull(),action:ip("action").notNull(),metadata:hE("metadata"),traceId:ip("trace_id"),createdAt:gE("created_at",{withTimezone:!0}).defaultNow()},e=>[Ks("idx_usage_events_instruction").on(e.instructionId),Ks("idx_usage_events_user").on(e.userId),Ks("idx_usage_events_surface").on(e.surface),Ks("idx_usage_events_action").on(e.action),Ks("idx_usage_events_created_at").on(e.createdAt),Ks("idx_usage_events_user_created").on(e.userId,e.createdAt)])});import{pgTable as _E,text as Ju,timestamp as U_,jsonb as yE,uuid as H_,index as cp}from"drizzle-orm/pg-core";var pe,B_=V(()=>{"use strict";pe=_E("worker_connections",{id:H_("id").primaryKey().defaultRandom(),userId:H_("user_id").notNull(),workerType:Ju("worker_type").notNull().default("mcp"),clientName:Ju("client_name").notNull(),clientVersion:Ju("client_version"),workerVersion:Ju("worker_version"),lastHeartbeat:U_("last_heartbeat",{withTimezone:!0}).notNull().defaultNow(),connectedAt:U_("connected_at",{withTimezone:!0}).notNull().defaultNow(),metadata:yE("metadata")},e=>[cp("idx_worker_connections_user").on(e.userId),cp("idx_worker_connections_heartbeat").on(e.userId,e.lastHeartbeat),cp("idx_worker_connections_type").on(e.userId,e.workerType)])});import{pgTable as wE,text as Ku,timestamp as vE,jsonb as IE,uuid as F_,index as W_}from"drizzle-orm/pg-core";var Gu,z_=V(()=>{"use strict";Gu=wE("cli_setup_events",{id:F_("id").primaryKey().defaultRandom(),userId:F_("user_id").notNull(),deviceId:Ku("device_id").notNull(),event:Ku("event").notNull(),cliVersion:Ku("cli_version"),os:Ku("os"),props:IE("props").notNull().default({}),createdAt:vE("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[W_("idx_cli_setup_events_user").on(e.userId,e.createdAt),W_("idx_cli_setup_events_device").on(e.deviceId,e.createdAt)])});import{pgTable as bE,text as ns,integer as SE,boolean as AE,timestamp as EE,jsonb as xE,uuid as TE,index as V_}from"drizzle-orm/pg-core";var Yu,J_=V(()=>{"use strict";Yu=bE("cli_error_events",{id:TE("id").primaryKey().defaultRandom(),deviceId:ns("device_id"),event:ns("event").notNull(),command:ns("command"),statusCode:SE("status_code"),message:ns("message"),cliVersion:ns("cli_version"),os:ns("os"),nodeVersion:ns("node_version"),proxied:AE("proxied"),props:xE("props").notNull().default({}),createdAt:EE("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[V_("idx_cli_error_events_created").on(e.createdAt),V_("idx_cli_error_events_device").on(e.deviceId,e.createdAt)])});import{sql as RE}from"drizzle-orm";import{pgTable as rs,text as yt,timestamp as an,jsonb as Tn,uuid as lt,integer as Cr,boolean as Na,index as Jt,unique as K_}from"drizzle-orm/pg-core";var k,Ie,ve,Xe,Ve,le,Vn,ja=V(()=>{"use strict";k=rs("eval_targets",{id:lt("id").primaryKey().defaultRandom(),userId:lt("user_id").notNull(),name:yt("name").notNull(),type:yt("type").notNull(),content:yt("content").notNull(),description:yt("description").notNull().default(""),metadata:Tn("metadata").notNull().default({}),version:Cr("version").notNull().default(1),parentId:lt("parent_id").references(()=>k.id,{onDelete:"set null"}),createdAt:an("created_at",{withTimezone:!0}).defaultNow(),updatedAt:an("updated_at",{withTimezone:!0}).defaultNow()},e=>[Jt("eval_targets_name_user_idx").on(e.name,e.userId),Jt("idx_eval_targets_user").on(e.userId),Jt("idx_eval_targets_type").on(e.type),Jt("idx_eval_targets_parent").on(e.parentId)]),Ie=rs("evals",{id:lt("id").primaryKey().defaultRandom(),evalTargetId:lt("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),name:yt("name").notNull(),prompt:yt("prompt").notNull(),expectedOutput:yt("expected_output").notNull().default(""),files:Tn("files").notNull().default([]),expectations:Tn("expectations").notNull().default([]),retiredAt:an("retired_at",{withTimezone:!0}),retiredReason:yt("retired_reason"),createdAt:an("created_at",{withTimezone:!0}).defaultNow(),updatedAt:an("updated_at",{withTimezone:!0}).defaultNow(),contentUpdatedAt:an("content_updated_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Jt("idx_evals_target").on(e.evalTargetId),Jt("idx_evals_target_active").on(e.evalTargetId).where(RE`${e.retiredAt} IS NULL`)]),ve=rs("eval_runs",{id:lt("id").primaryKey().defaultRandom(),jobId:lt("job_id"),evalId:lt("eval_id").notNull().references(()=>Ie.id,{onDelete:"cascade"}),evalTargetId:lt("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),evalTargetVersion:Cr("eval_target_version").notNull(),configuration:yt("configuration").notNull(),runNumber:Cr("run_number").notNull().default(1),iteration:Cr("iteration").notNull().default(1),status:yt("status").notNull().default("completed"),outputs:Tn("outputs").notNull().default({}),timing:Tn("timing").notNull().default({}),grading:Tn("grading").notNull().default({}),comparison:Tn("comparison"),createdAt:an("created_at",{withTimezone:!0}).defaultNow()},e=>[Jt("idx_eval_runs_eval").on(e.evalId),Jt("idx_eval_runs_target").on(e.evalTargetId),Jt("idx_eval_runs_iteration").on(e.evalTargetId,e.iteration)]),Xe=rs("eval_comparisons",{id:lt("id").primaryKey().defaultRandom(),userId:lt("user_id").notNull(),targetAId:lt("target_a_id").notNull().references(()=>k.id,{onDelete:"cascade"}),targetBId:lt("target_b_id").notNull().references(()=>k.id,{onDelete:"cascade"}),targetAVersion:Cr("target_a_version").notNull(),targetBVersion:Cr("target_b_version").notNull(),isSwapped:Na("is_swapped").notNull().default(!1),winnerTargetId:lt("winner_target_id").references(()=>k.id,{onDelete:"set null"}),perEval:Tn("per_eval").notNull().default([]),overall:Tn("overall").notNull().default({}),rawOutput:yt("raw_output"),model:yt("model"),status:yt("status").notNull().default("completed"),createdAt:an("created_at",{withTimezone:!0}).defaultNow()},e=>[Jt("idx_eval_comparisons_target_a").on(e.targetAId),Jt("idx_eval_comparisons_target_b").on(e.targetBId),Jt("idx_eval_comparisons_user").on(e.userId)]),Ve=rs("eval_grade_annotations",{id:lt("id").primaryKey().defaultRandom(),userId:lt("user_id").notNull(),evalRunId:lt("eval_run_id").notNull().references(()=>ve.id,{onDelete:"cascade"}),evalTargetId:lt("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),expectationIndex:Cr("expectation_index").notNull(),expectationText:yt("expectation_text").notNull(),judgePassed:Na("judge_passed").notNull(),judgeMethod:yt("judge_method").notNull(),judgeModel:yt("judge_model"),verdict:yt("verdict").notNull(),flag:yt("flag"),note:yt("note"),createdAt:an("created_at",{withTimezone:!0}).defaultNow(),updatedAt:an("updated_at",{withTimezone:!0}).defaultNow()},e=>[Jt("idx_eval_grade_annotations_target").on(e.evalTargetId),Jt("idx_eval_grade_annotations_run").on(e.evalRunId),K_("eval_grade_annotations_eval_run_id_expectation_index_key").on(e.evalRunId,e.expectationIndex)]),le=rs("judge_reviewer_verdicts",{id:lt("id").primaryKey().defaultRandom(),userId:lt("user_id").notNull(),evalTargetId:lt("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),evalRunId:lt("eval_run_id").notNull().references(()=>ve.id,{onDelete:"cascade"}),expectationIndex:Cr("expectation_index").notNull(),expectationText:yt("expectation_text").notNull(),judgePassed:Na("judge_passed").notNull(),humanPassed:Na("human_passed").notNull(),reviewerEngine:yt("reviewer_engine").notNull(),reviewerModel:yt("reviewer_model").notNull(),reviewerPassed:Na("reviewer_passed").notNull(),resolvedAt:an("resolved_at",{withTimezone:!0}),resolution:yt("resolution"),createdAt:an("created_at",{withTimezone:!0}).defaultNow(),updatedAt:an("updated_at",{withTimezone:!0}).defaultNow()},e=>[Jt("idx_jrv_target").on(e.evalTargetId),K_("judge_reviewer_verdicts_eval_run_id_expectation_index_review_key").on(e.evalRunId,e.expectationIndex,e.reviewerModel)]),Vn=rs("benchmarks",{id:lt("id").primaryKey().defaultRandom(),evalTargetId:lt("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),iteration:Cr("iteration").notNull().default(1),runSummary:Tn("run_summary").notNull().default({}),notes:Tn("notes").notNull().default([]),feedback:Tn("feedback"),createdAt:an("created_at",{withTimezone:!0}).defaultNow()},e=>[Jt("idx_benchmarks_target").on(e.evalTargetId)])});import{sql as up}from"drizzle-orm";import{pgTable as kE,text as Lr,timestamp as NE,jsonb as Xu,uuid as Qu,boolean as jE,index as Pa,uniqueIndex as PE}from"drizzle-orm/pg-core";var ie,G_=V(()=>{"use strict";ja();zn();ie=kE("instruction_promotions",{id:Qu("id").primaryKey().defaultRandom(),userId:Qu("user_id").notNull(),evalTargetId:Qu("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),instructionId:Qu("instruction_id").references(()=>g.id,{onDelete:"set null"}),fromContentHash:Lr("from_content_hash").notNull(),toContentHash:Lr("to_content_hash").notNull(),fromContent:Lr("from_content").notNull(),toContent:Lr("to_content").notNull(),proposalSource:Lr("proposal_source").notNull(),proposalRationale:Lr("proposal_rationale").notNull().default(""),decision:Lr("decision").notNull(),applied:jE("applied").notNull().default(!1),refusals:Xu("refusals").notNull().default([]),rationale:Lr("rationale").notNull().default(""),effectClass:Lr("effect_class").notNull(),verdict:Xu("verdict").notNull().default({}),gates:Xu("gates").notNull().default({}),touchedSections:Xu("touched_sections").notNull().default([]),createdAt:NE("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Pa("idx_instruction_promotions_budget").on(e.evalTargetId,e.createdAt.desc()).where(up`${e.applied}`),Pa("idx_instruction_promotions_target").on(e.evalTargetId,e.createdAt.desc()),Pa("idx_instruction_promotions_user").on(e.userId,e.createdAt.desc()),Pa("idx_instruction_promotions_to_hash").on(e.toContentHash),PE("uq_instruction_promotions_applied").on(e.evalTargetId,e.fromContentHash,e.toContentHash).where(up`${e.applied}`),Pa("idx_instruction_promotions_applied_hash").on(e.toContentHash,e.createdAt.desc()).where(up`${e.applied}`)])});import{pgTable as DE,text as io,timestamp as OE,jsonb as Da,uuid as dp,integer as lp,real as CE,index as Oa,uniqueIndex as Y_}from"drizzle-orm/pg-core";var $,X_=V(()=>{"use strict";Fs();Ht();$=DE("context_snapshots",{id:dp("id").primaryKey().defaultRandom(),sessionId:dp("session_id").references(()=>y.id,{onDelete:"cascade"}),userId:dp("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),sequence:lp("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:lp("max_tokens"),temperature:CE("temperature"),estimatedTokens:lp("estimated_tokens"),capturedAt:OE("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),Y_("idx_snapshots_session_request").on(e.sessionId,e.requestHash),Y_("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 LE,text as Q_,timestamp as ME,jsonb as $E,integer as qE,index as UE}from"drizzle-orm/pg-core";var _n,Z_=V(()=>{"use strict";_n=LE("content_blobs",{hash:Q_("hash").primaryKey(),contentType:Q_("content_type").notNull(),content:$E("content").notNull(),sizeBytes:qE("size_bytes").notNull().default(0),createdAt:ME("created_at",{withTimezone:!0}).defaultNow()},e=>[UE("idx_content_blobs_type").on(e.contentType)])});import{pgTable as HE,text as Zu,timestamp as Ca,jsonb as ed,uuid as mp,index as td,integer as ey}from"drizzle-orm/pg-core";var Re,ty=V(()=>{"use strict";ja();Re=HE("eval_jobs",{id:mp("id").primaryKey().defaultRandom(),userId:mp("user_id").notNull(),evalTargetId:mp("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),status:Zu("status").notNull().default("pending"),config:ed("config").notNull().default({}),progress:ed("progress").notNull().default({}),result:ed("result"),error:Zu("error"),attempts:ey("attempts").notNull().default(0),taskKind:Zu("task_kind"),payload:ed("payload"),claimedBy:Zu("claimed_by"),claimedAt:Ca("claimed_at",{withTimezone:!0}),leaseExpiresAt:Ca("lease_expires_at",{withTimezone:!0}),leaseRecoveries:ey("lease_recoveries").notNull().default(0),createdAt:Ca("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Ca("updated_at",{withTimezone:!0}).defaultNow(),completedAt:Ca("completed_at",{withTimezone:!0})},e=>[td("idx_eval_jobs_user").on(e.userId),td("idx_eval_jobs_target").on(e.evalTargetId),td("idx_eval_jobs_status").on(e.status),td("idx_eval_jobs_pending").on(e.userId,e.status)])});import{pgTable as BE,text as La,timestamp as Ma,jsonb as ny,uuid as ry,integer as oy,index as sy}from"drizzle-orm/pg-core";var ke,iy=V(()=>{"use strict";ke=BE("agent_jobs",{id:ry("id").primaryKey().defaultRandom(),userId:ry("user_id").notNull(),taskKind:La("task_kind").notNull(),status:La("status").notNull().default("pending"),payload:ny("payload").notNull(),dedupeKey:La("dedupe_key"),result:ny("result"),error:La("error"),attempts:oy("attempts").notNull().default(0),claimedBy:La("claimed_by"),claimedAt:Ma("claimed_at",{withTimezone:!0}),leaseExpiresAt:Ma("lease_expires_at",{withTimezone:!0}),leaseRecoveries:oy("lease_recoveries").notNull().default(0),createdAt:Ma("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:Ma("updated_at",{withTimezone:!0}).notNull().defaultNow(),completedAt:Ma("completed_at",{withTimezone:!0})},e=>[sy("idx_agent_jobs_claim").on(e.userId,e.status,e.taskKind,e.createdAt),sy("idx_agent_jobs_dedupe").on(e.userId,e.taskKind,e.dedupeKey)])});import{pgTable as FE,text as $a,timestamp as qa,jsonb as nd,uuid as pp,index as rd,integer as ay}from"drizzle-orm/pg-core";var W,cy=V(()=>{"use strict";Pr();W=FE("insights_jobs",{id:pp("id").primaryKey().defaultRandom(),userId:pp("user_id").notNull(),status:$a("status").notNull().default("pending"),projectPath:$a("project_path"),projectId:pp("project_id").references(()=>M.id,{onDelete:"set null"}),config:nd("config").notNull().default({}),progress:nd("progress").notNull().default({}),result:nd("result"),error:$a("error"),attempts:ay("attempts").notNull().default(0),taskKind:$a("task_kind"),payload:nd("payload"),claimedBy:$a("claimed_by"),claimedAt:qa("claimed_at",{withTimezone:!0}),leaseExpiresAt:qa("lease_expires_at",{withTimezone:!0}),leaseRecoveries:ay("lease_recoveries").notNull().default(0),createdAt:qa("created_at",{withTimezone:!0}).defaultNow(),updatedAt:qa("updated_at",{withTimezone:!0}).defaultNow(),completedAt:qa("completed_at",{withTimezone:!0})},e=>[rd("idx_insights_jobs_user").on(e.userId),rd("idx_insights_jobs_status").on(e.status),rd("idx_insights_jobs_pending").on(e.userId,e.status),rd("idx_insights_jobs_project").on(e.projectId)])});import{pgTable as WE,text as fp,timestamp as od,uuid as uy,index as zE,uniqueIndex as VE}from"drizzle-orm/pg-core";var be,dy=V(()=>{"use strict";Ht();be=WE("api_keys",{id:uy("id").primaryKey().defaultRandom(),userId:uy("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),name:fp("name").notNull(),keyHash:fp("key_hash").notNull(),keyPrefix:fp("key_prefix").notNull(),lastUsedAt:od("last_used_at",{withTimezone:!0}),expiresAt:od("expires_at",{withTimezone:!0}),revokedAt:od("revoked_at",{withTimezone:!0}),createdAt:od("created_at",{withTimezone:!0}).defaultNow()},e=>[zE("idx_api_keys_user").on(e.userId),VE("idx_api_keys_hash").on(e.keyHash)])});import{pgTable as JE,text as gp,timestamp as ly,uuid as KE,index as GE}from"drizzle-orm/pg-core";var Rn,my=V(()=>{"use strict";Ht();Rn=JE("extension_auth_codes",{code:gp("code").primaryKey(),userId:KE("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),editor:gp("editor"),email:gp("email"),expiresAt:ly("expires_at",{withTimezone:!0}).notNull(),createdAt:ly("created_at",{withTimezone:!0}).defaultNow()},e=>[GE("idx_ext_auth_codes_expiry").on(e.expiresAt)])});import{pgTable as YE,text as XE,timestamp as py,jsonb as QE,uuid as hp,index as fy}from"drizzle-orm/pg-core";var Me,gy=V(()=>{"use strict";ja();Me=YE("eval_conversations",{id:hp("id").primaryKey().defaultRandom(),evalTargetId:hp("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),userId:hp("user_id").notNull(),messages:QE("messages").notNull().default([]),status:XE("status").notNull().default("active"),createdAt:py("created_at",{withTimezone:!0}).defaultNow(),updatedAt:py("updated_at",{withTimezone:!0}).defaultNow()},e=>[fy("idx_eval_conversations_target").on(e.evalTargetId),fy("idx_eval_conversations_user").on(e.userId)])});import{pgTable as ZE,text as Mr,timestamp as hy,jsonb as ex,uuid as _p}from"drizzle-orm/pg-core";var ao,_y=V(()=>{"use strict";ao=ZE("skill_submissions",{id:_p("id").primaryKey().defaultRandom(),skillId:Mr("skill_id").notNull(),name:Mr("name").notNull(),description:Mr("description").notNull(),category:Mr("category").notNull(),tools:Mr("tools").array().notNull(),tags:Mr("tags").array().default([]),content:Mr("content").notNull(),status:Mr("status").notNull().default("pending"),submittedBy:_p("submitted_by").notNull(),reviewedBy:_p("reviewed_by"),reviewNote:Mr("review_note"),metadata:ex("metadata"),createdAt:hy("created_at",{withTimezone:!0}).defaultNow(),updatedAt:hy("updated_at",{withTimezone:!0}).defaultNow()})});import{pgTable as tx,text as Ua,timestamp as yy,jsonb as nx,uuid as rx,uniqueIndex as ox,index as wy}from"drizzle-orm/pg-core";var jt,vy=V(()=>{"use strict";jt=tx("harness_releases",{id:rx("id").primaryKey().defaultRandom(),harness:Ua("harness").notNull(),version:Ua("version").notNull(),publishedAt:yy("published_at",{withTimezone:!0}).notNull(),title:Ua("title"),body:Ua("body"),categories:nx("categories").default({}),url:Ua("url"),createdAt:yy("created_at",{withTimezone:!0}).defaultNow()},e=>[ox("idx_harness_releases_unique").on(e.harness,e.version),wy("idx_harness_releases_harness").on(e.harness),wy("idx_harness_releases_published").on(e.publishedAt)])});import{pgTable as sx,text as Gs,timestamp as Iy,jsonb as ix,uuid as by,index as Sy,uniqueIndex as ax}from"drizzle-orm/pg-core";var bt,Ay=V(()=>{"use strict";bt=sx("notifications",{id:by("id").primaryKey().defaultRandom(),userId:by("user_id").notNull(),type:Gs("type").notNull(),title:Gs("title").notNull(),body:Gs("body"),url:Gs("url"),sourceTable:Gs("source_table"),sourceId:Gs("source_id"),metadata:ix("metadata").notNull().default({}),readAt:Iy("read_at",{withTimezone:!0}),createdAt:Iy("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Sy("idx_notifications_user_created").on(e.userId,e.createdAt),Sy("idx_notifications_user_unread").on(e.userId),ax("idx_notifications_source_dedup").on(e.userId,e.sourceTable,e.sourceId)])});import{pgTable as cx,text as Ha,timestamp as Ba,jsonb as yp,uuid as wp,index as sd,integer as Ey}from"drizzle-orm/pg-core";var ce,xy=V(()=>{"use strict";Cu();ce=cx("launch_jobs",{id:wp("id").primaryKey().defaultRandom(),userId:wp("user_id").notNull(),tool:Ha("tool").notNull(),status:Ha("status").notNull().default("pending"),config:yp("config").notNull().default({}),result:yp("result"),error:Ha("error"),attempts:Ey("attempts").notNull().default(0),taskKind:Ha("task_kind"),payload:yp("payload"),claimedBy:Ha("claimed_by"),claimedAt:Ba("claimed_at",{withTimezone:!0}),leaseExpiresAt:Ba("lease_expires_at",{withTimezone:!0}),leaseRecoveries:Ey("lease_recoveries").notNull().default(0),createdAt:Ba("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Ba("updated_at",{withTimezone:!0}).defaultNow(),completedAt:Ba("completed_at",{withTimezone:!0}),runId:wp("run_id").references(()=>X.id,{onDelete:"set null"})},e=>[sd("idx_launch_jobs_user").on(e.userId),sd("idx_launch_jobs_status").on(e.status),sd("idx_launch_jobs_pending").on(e.userId,e.status),sd("idx_launch_jobs_run").on(e.runId)])});import{pgTable as Ty,uuid as $r,text as co,real as ux,timestamp as Fa,boolean as dx,uniqueIndex as lx,index as Wa}from"drizzle-orm/pg-core";var id,x,Je,Ry=V(()=>{"use strict";Ht();zn();Pr();id=["add","remove","trim"],x=Ty("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(()=>M.id,{onDelete:"set null"}),score:ux("score").notNull(),reason:co("reason").notNull(),kind:co("kind").$type().notNull().default("add"),generatedAt:Fa("generated_at",{withTimezone:!0}).notNull().defaultNow(),isStale:dx("is_stale").notNull().default(!1),dismissedAt:Fa("dismissed_at",{withTimezone:!0}),acceptedAt:Fa("accepted_at",{withTimezone:!0}),declinedAt:Fa("declined_at",{withTimezone:!0}),declinedReason:co("declined_reason"),promotedToInstructionId:$r("promoted_to_instruction_id").references(()=>g.id,{onDelete:"set null"})},e=>[lx("idx_instruction_suggestions_user_project_instruction_kind").on(e.userId,e.projectPath,e.instructionId,e.kind),Wa("idx_instruction_suggestions_user_project").on(e.userId,e.projectPath),Wa("idx_instruction_suggestions_user_proj_id").on(e.userId,e.projectId),Wa("idx_instruction_suggestions_generated_at").on(e.generatedAt)]),Je=Ty("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:Fa("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Wa("idx_instruction_suggestion_events_suggestion_id").on(e.suggestionId),Wa("idx_instruction_suggestion_events_user_id").on(e.userId)])});import{pgTable as mx,text as vp,integer as px,numeric as za,timestamp as Ip,index as fx,primaryKey as gx}from"drizzle-orm/pg-core";var Qe,ky=V(()=>{"use strict";Qe=mx("model_pricing",{provider:vp("provider").notNull(),modelId:vp("model_id").notNull(),inputPerM:za("input_per_m").notNull(),outputPerM:za("output_per_m").notNull(),cacheReadPerM:za("cache_read_per_m").notNull(),cacheWrite5mPerM:za("cache_write_5m_per_m").notNull(),cacheWrite1hPerM:za("cache_write_1h_per_m").notNull(),contextWindow:px("context_window"),effectiveFrom:Ip("effective_from",{withTimezone:!0}).notNull(),effectiveUntil:Ip("effective_until",{withTimezone:!0}),source:vp("source").notNull(),verifiedAt:Ip("verified_at",{withTimezone:!0})},e=>[gx({columns:[e.provider,e.modelId,e.effectiveFrom]}),fx("idx_model_pricing_active").on(e.provider,e.modelId,e.effectiveFrom.desc())])});import{pgTable as hx,text as os,numeric as Ny,timestamp as jy,uuid as Py,jsonb as _x,index as Dy}from"drizzle-orm/pg-core";var ye,Oy=V(()=>{"use strict";ye=hx("limit_observations",{id:Py("id").primaryKey().defaultRandom(),observedAt:jy("observed_at",{withTimezone:!0}).notNull().defaultNow(),provider:os("provider").notNull(),plan:os("plan").notNull(),limitType:os("limit_type").notNull(),value:Ny("value").notNull(),unit:os("unit").notNull(),comparator:os("comparator").notNull().default("="),resetsAt:jy("resets_at",{withTimezone:!0}),sourceType:os("source_type").notNull(),sourceUrl:os("source_url"),sourceEvidence:_x("source_evidence"),confidence:Ny("confidence").notNull(),userId:Py("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 yx,text as ad,timestamp as wx,uuid as vx,jsonb as Ix,boolean as bx,uniqueIndex as Sx}from"drizzle-orm/pg-core";var xt,Cy=V(()=>{"use strict";xt=yx("provider_docs_snapshots",{id:vx("id").primaryKey().defaultRandom(),fetchedAt:wx("fetched_at",{withTimezone:!0}).notNull().defaultNow(),provider:ad("provider").notNull(),docUrl:ad("doc_url").notNull(),contentHash:ad("content_hash").notNull(),content:ad("content").notNull(),parseSuccess:bx("parse_success").notNull(),parseErrors:Ix("parse_errors")},e=>[Sx("idx_docs_dedup").on(e.provider,e.docUrl,e.contentHash)])});import{pgTable as Ax,text as cd,numeric as Ly,timestamp as My,uuid as Ex,primaryKey as xx,index as Tx}from"drizzle-orm/pg-core";var Ke,$y=V(()=>{"use strict";Ke=Ax("plan_limits_active",{provider:cd("provider").notNull(),plan:cd("plan").notNull(),limitType:cd("limit_type").notNull(),value:Ly("value").notNull(),unit:cd("unit").notNull(),effectiveFrom:My("effective_from",{withTimezone:!0}).notNull(),effectiveUntil:My("effective_until",{withTimezone:!0}),confidence:Ly("confidence").notNull(),sourceObservationIds:Ex("source_observation_ids").array().notNull()},e=>[xx({columns:[e.provider,e.plan,e.limitType,e.effectiveFrom]}),Tx("idx_plan_limits_lookup").on(e.provider,e.plan,e.limitType,e.effectiveFrom.desc())])});import{pgTable as Rx,text as bp,timestamp as kx,uuid as qy,jsonb as Nx,index as jx}from"drizzle-orm/pg-core";var yn,Uy=V(()=>{"use strict";yn=Rx("alert_dispatches",{id:qy("id").primaryKey().defaultRandom(),userId:qy("user_id").notNull(),alertKey:bp("alert_key").notNull(),severity:bp("severity").notNull(),lastDispatchedAt:kx("last_dispatched_at",{withTimezone:!0}).notNull().defaultNow(),lastState:Nx("last_state").notNull(),channel:bp("channel").notNull()},e=>[jx("idx_alert_user_key").on(e.userId,e.alertKey,e.lastDispatchedAt.desc())])});import{boolean as Px,date as Dx,index as Sp,integer as Ox,jsonb as Cx,pgTable as Ap,text as Jn,timestamp as uo,uniqueIndex as Lx,uuid as Ys}from"drizzle-orm/pg-core";var Oe,St,At,Hy=V(()=>{"use strict";Oe=Ap("announcements",{id:Ys("id").primaryKey().defaultRandom(),version:Jn("version").notNull().unique(),releaseDate:Dx("release_date").notNull(),subject:Jn("subject").notNull(),htmlBody:Jn("html_body").notNull(),textBody:Jn("text_body").notNull(),sections:Cx("sections").notNull().default({}),status:Jn("status").notNull().default("draft"),recipientCount:Ox("recipient_count"),sentAt:uo("sent_at",{withTimezone:!0}),sentBy:Ys("sent_by"),error:Jn("error"),createdAt:uo("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:uo("updated_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Sp("idx_announcements_status").on(e.status),Sp("idx_announcements_created").on(e.createdAt)]),St=Ap("announcement_deliveries",{id:Ys("id").primaryKey().defaultRandom(),announcementId:Ys("announcement_id").notNull(),userId:Ys("user_id").notNull(),email:Jn("email").notNull(),status:Jn("status").notNull().default("pending"),providerId:Jn("provider_id"),error:Jn("error"),sentAt:uo("sent_at",{withTimezone:!0}),createdAt:uo("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Lx("uniq_announcement_deliveries_announcement_user").on(e.announcementId,e.userId),Sp("idx_announcement_deliveries_user").on(e.userId,e.createdAt)]),At=Ap("notification_preferences",{userId:Ys("user_id").primaryKey(),productAnnouncements:Px("product_announcements").notNull().default(!0),unsubscribeToken:Jn("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 Mx,text as Ep,timestamp as By,uuid as xp,integer as $x,index as qx,unique as Ux}from"drizzle-orm/pg-core";var Fy,Wy=V(()=>{"use strict";Fy=Mx("scaffolding_fingerprints",{id:xp("id").primaryKey().defaultRandom(),userId:xp("user_id").notNull(),harness:Ep("harness").notNull(),model:Ep("model").notNull(),toolsHash:Ep("tools_hash").notNull(),firstSeenAt:By("first_seen_at",{withTimezone:!0}).notNull().defaultNow(),lastSeenAt:By("last_seen_at",{withTimezone:!0}).notNull().defaultNow(),snapshotCount:$x("snapshot_count").notNull().default(1),firstSessionId:xp("first_session_id")},e=>[Ux("scaffolding_fingerprints_user_id_harness_model_tools_hash_key").on(e.userId,e.harness,e.model,e.toolsHash),qx("idx_scaffolding_fp_segment").on(e.userId,e.harness,e.model)])});import{pgTable as Hx,text as Tp,timestamp as Bx,jsonb as Fx,uuid as zy,integer as Wx,unique as zx}from"drizzle-orm/pg-core";var Vy,Jy=V(()=>{"use strict";Vy=Hx("scaffolding_segments",{id:zy("id").primaryKey().defaultRandom(),userId:zy("user_id").notNull(),harness:Tp("harness").notNull(),model:Tp("model").notNull(),coreNames:Fx("core_names").notNull(),coreHash:Tp("core_hash").notNull(),activeFingerprints:Wx("active_fingerprints").notNull(),computedAt:Bx("computed_at",{withTimezone:!0}).notNull().defaultNow()},e=>[zx("scaffolding_segments_user_id_harness_model_key").on(e.userId,e.harness,e.model)])});var Rp=V(()=>{"use strict";Ht();Yo();d_();zn();m_();Pr();Fs();w_();I_();Km();E_();x_();ep();N_();Cu();sp();O_();$_();q_();B_();z_();J_();ja();G_();X_();Z_();ty();iy();cy();dy();my();gy();_y();vy();Ay();xy();Ry();ky();Oy();Cy();$y();Uy();Hy();Wy();Jy()});import{relations as Fe}from"drizzle-orm";var Vx,Jx,Kx,Gx,Yx,Xx,Qx,Zx,eT,tT,nT,rT,oT,sT,iT,aT,cT,uT,dT,lT,mT,pT,fT,gT,hT,_T,yT,wT,vT,IT,Ky=V(()=>{"use strict";Rp();Vx=Fe(T,({many:e})=>({sessions:e(y),contextSnapshots:e($),apiKeys:e(be)})),Jx=Fe(be,({one:e})=>({profile:e(T,{fields:[be.userId],references:[T.id]})})),Kx=Fe(K,({many:e})=>({teams:e(G),userOrganizations:e(Q),projects:e(M),invitations:e(ae)})),Gx=Fe(G,({one:e,many:t})=>({organization:e(K,{fields:[G.orgId],references:[K.id]}),userTeams:t(_e),invitations:t(ae)})),Yx=Fe(ae,({one:e})=>({organization:e(K,{fields:[ae.orgId],references:[K.id]}),team:e(G,{fields:[ae.teamId],references:[G.id]}),inviter:e(T,{fields:[ae.invitedBy],references:[T.id]})})),Xx=Fe(Q,({one:e})=>({organization:e(K,{fields:[Q.orgId],references:[K.id]})})),Qx=Fe(_e,({one:e})=>({team:e(G,{fields:[_e.teamId],references:[G.id]})})),Zx=Fe(g,({one:e,many:t})=>({versions:t(Se),projectInstructions:t(it),events:t(Pt),usageEvents:t(so),sessionInstructions:t(se),packInstructions:t(De),forkedFrom:e(g,{fields:[g.forkedFromId],references:[g.id]})})),eT=Fe(Pt,({one:e})=>({instruction:e(g,{fields:[Pt.instructionId],references:[g.id]})})),tT=Fe(F,({one:e,many:t})=>({project:e(M,{fields:[F.projectId],references:[M.id]}),parent:e(F,{fields:[F.parentId],references:[F.id]}),versions:t(F)})),nT=Fe(Se,({one:e})=>({instruction:e(g,{fields:[Se.instructionId],references:[g.id]})})),rT=Fe(M,({one:e,many:t})=>({organization:e(K,{fields:[M.orgId],references:[K.id]}),projectInstructions:t(it),sessions:t(y)})),oT=Fe(it,({one:e})=>({project:e(M,{fields:[it.projectId],references:[M.id]}),instruction:e(g,{fields:[it.instructionId],references:[g.id]})})),sT=Fe(y,({one:e,many:t})=>({profile:e(T,{fields:[y.userId],references:[T.id]}),project:e(M,{fields:[y.projectId],references:[M.id]}),run:e(X,{fields:[y.runId],references:[X.id]}),events:t($e),sessionInstructions:t(se),treatmentExposures:t(Z),contextSnapshots:t($)})),iT=Fe(X,({one:e,many:t})=>({profile:e(T,{fields:[X.userId],references:[T.id]}),organization:e(K,{fields:[X.orgId],references:[K.id]}),project:e(M,{fields:[X.projectId],references:[M.id]}),sessions:t(y),launchJobs:t(ce)})),aT=Fe(ce,({one:e})=>({run:e(X,{fields:[ce.runId],references:[X.id]})})),cT=Fe($e,({one:e})=>({session:e(y,{fields:[$e.sessionId],references:[y.id]})})),uT=Fe(se,({one:e})=>({session:e(y,{fields:[se.sessionId],references:[y.id]}),instruction:e(g,{fields:[se.instructionId],references:[g.id]})})),dT=Fe(kt,({one:e,many:t})=>({owner:e(T,{fields:[kt.userId],references:[T.id]}),project:e(M,{fields:[kt.projectId],references:[M.id]}),exposures:t(Z)})),lT=Fe(Z,({one:e})=>({session:e(y,{fields:[Z.sessionId],references:[y.id]}),owner:e(T,{fields:[Z.userId],references:[T.id]}),assignment:e(kt,{fields:[Z.assignmentId],references:[kt.id]})})),mT=Fe(Le,({one:e,many:t})=>({packInstructions:t(De),forkedFrom:e(Le,{fields:[Le.forkedFromId],references:[Le.id]})})),pT=Fe(De,({one:e})=>({pack:e(Le,{fields:[De.packId],references:[Le.id]}),instruction:e(g,{fields:[De.instructionId],references:[g.id]})})),fT=Fe(so,({one:e})=>({instruction:e(g,{fields:[so.instructionId],references:[g.id]})})),gT=Fe(k,({one:e,many:t})=>({parent:e(k,{fields:[k.parentId],references:[k.id]}),evals:t(Ie),evalRuns:t(ve),benchmarks:t(Vn),evalJobs:t(Re),evalConversations:t(Me)})),hT=Fe(Ie,({one:e,many:t})=>({evalTarget:e(k,{fields:[Ie.evalTargetId],references:[k.id]}),runs:t(ve)})),_T=Fe(ve,({one:e})=>({eval:e(Ie,{fields:[ve.evalId],references:[Ie.id]}),evalTarget:e(k,{fields:[ve.evalTargetId],references:[k.id]})})),yT=Fe(Vn,({one:e})=>({evalTarget:e(k,{fields:[Vn.evalTargetId],references:[k.id]})})),wT=Fe(Re,({one:e})=>({evalTarget:e(k,{fields:[Re.evalTargetId],references:[k.id]})})),vT=Fe(Me,({one:e})=>({evalTarget:e(k,{fields:[Me.evalTargetId],references:[k.id]})})),IT=Fe($,({one:e})=>({session:e(y,{fields:[$.sessionId],references:[y.id]}),profile:e(T,{fields:[$.userId],references:[T.id]})}))});var ud={};to(ud,{SUGGESTION_KINDS:()=>id,agentJobs:()=>ke,agentRuns:()=>X,agentRunsRelations:()=>iT,alertDispatches:()=>yn,announcementDeliveries:()=>St,announcements:()=>Oe,apiKeys:()=>be,apiKeysRelations:()=>Jx,benchmarks:()=>Vn,benchmarksRelations:()=>yT,cliErrorEvents:()=>Yu,cliSetupEvents:()=>Gu,contentBlobs:()=>_n,contextSnapshots:()=>$,contextSnapshotsRelations:()=>IT,evalComparisons:()=>Xe,evalConversations:()=>Me,evalConversationsRelations:()=>vT,evalGradeAnnotations:()=>Ve,evalJobs:()=>Re,evalJobsRelations:()=>wT,evalRuns:()=>ve,evalRunsRelations:()=>_T,evalTargets:()=>k,evalTargetsRelations:()=>gT,evals:()=>Ie,evalsRelations:()=>hT,extensionAuthCodes:()=>Rn,harnessReleases:()=>jt,insightRecommendationLog:()=>Ae,insightsJobs:()=>W,instructionEvents:()=>Pt,instructionEventsRelations:()=>eT,instructionExperimentArms:()=>Or,instructionExperiments:()=>U,instructionPromotions:()=>ie,instructionSuggestionEvents:()=>Je,instructionSuggestions:()=>x,instructionUsageEvents:()=>so,instructionUsageEventsRelations:()=>fT,instructionVerdicts:()=>Y,instructionVersionIdentities:()=>sr,instructionVersions:()=>Se,instructionVersionsRelations:()=>nT,instructions:()=>g,instructionsRelations:()=>Zx,judgeReviewerVerdicts:()=>le,launchJobs:()=>ce,launchJobsRelations:()=>aT,limitObservations:()=>ye,memories:()=>F,memoriesRelations:()=>tT,memoryExperiments:()=>Nt,modelPricing:()=>Qe,notificationPreferences:()=>At,notifications:()=>bt,orgInvitations:()=>ae,orgInvitationsRelations:()=>Yx,organizations:()=>K,organizationsRelations:()=>Kx,packInstructions:()=>De,packInstructionsRelations:()=>pT,packs:()=>Le,packsRelations:()=>mT,pendingTreatmentExposures:()=>qu,planLimitsActive:()=>Ke,profiles:()=>T,profilesRelations:()=>Vx,projectCheckouts:()=>de,projectInstructions:()=>it,projectInstructionsRelations:()=>oT,projects:()=>M,projectsRelations:()=>rT,providerDocsSnapshots:()=>xt,scaffoldingFingerprints:()=>Fy,scaffoldingSegments:()=>Vy,sessionEvents:()=>$e,sessionEventsRelations:()=>cT,sessionInstructions:()=>se,sessionInstructionsRelations:()=>uT,sessionSendJobs:()=>zu,sessionTerminalTargets:()=>ze,sessions:()=>y,sessionsRelations:()=>sT,skillSubmissions:()=>ao,teams:()=>G,teamsRelations:()=>Gx,treatmentAssignments:()=>kt,treatmentAssignmentsRelations:()=>dT,treatmentExposures:()=>Z,treatmentExposuresRelations:()=>lT,userOrganizations:()=>Q,userOrganizationsRelations:()=>Xx,userTeams:()=>_e,userTeamsRelations:()=>Qx,workerConnections:()=>pe});var dd=V(()=>{"use strict";Rp();Ky()});function Pp(){ss++,ss>kp&&(kp=ss)}function Dp(){ss>0&&ss--}function Op(){Xs++,Xs>Np&&(Np=Xs)}function Cp(){Xs>0&&Xs--}function Va(){return ss}function Lp(){Gy++}function Ja(){Yy++}function Xy(){jp++}function Mp(){let e=jp;return jp=0,e}function $p(){return{current:ss,peak:kp,heavyCurrent:Xs,heavyPeak:Np,shedCount:Gy,ingestShedCount:Yy}}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 ss,kp,Xs,Np,Gy,Yy,jp,qp=V(()=>{"use strict";ss=0,kp=0,Xs=0,Np=0,Gy=0,Yy=0,jp=0;u(Pp,"trackDbOpStart");u(Dp,"trackDbOpEnd");u(Op,"trackHeavyDbOpStart");u(Cp,"trackHeavyDbOpEnd");u(Va,"getDbLoad");u(Lp,"recordDbShed");u(Ja,"recordIngestShed");u(Xy,"recordQueryDeadline");u(Mp,"consumeDeadlineCount");u($p,"getDbLoadStats");u(Qs,"dbInflightMax");u(Ka,"dbIngestInflightMax")});import{drizzle as Qy}from"drizzle-orm/postgres-js";import Up from"postgres";function Hp(e){let t=process.env[e];if(!t)throw new Error(`Missing required env var: ${e}`);return t}function Zy(){if(Xa)throw new Error("getDb() called after closeDb(): the connection pool is closed for shutdown. Stop issuing queries (timers/requests) before draining the pool.");if(!Ya){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=Up(Hp("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}:{}}}),Ya=Qy(ei,{schema:ud})}return Ya}function ew(){if(Xa)throw new Error("getHeavyDb() called after closeDb(): the connection pool is closed for shutdown. Stop issuing queries (timers/requests) before draining the pool.");if(!md){let e=(process.env.PG_APPLICATION_NAME||"rulemetric")+":heavy",t=Number(process.env.PG_HEAVY_POOL_MAX)||2;pd=Up(Hp("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}}),md=Qy(pd,{schema:ud})}return md}async function Qa(){if(ld)return ld;Xa=!0;let e=ei,t=Zs,n=pd;return ei=void 0,Ya=void 0,Zs=void 0,pd=void 0,md=void 0,ld=Promise.allSettled([e?e.end({timeout:5}):Promise.resolve(),t?t.end({timeout:5}):Promise.resolve(),n?n.end({timeout:5}):Promise.resolve()]).then(()=>{}),ld}function Bp(){if(Xa)return Promise.resolve();if(Ga)return Ga;let e=ei;return ei=void 0,Ya=void 0,Ga=(async()=>{e&&await e.end({timeout:5}).catch(()=>{})})().finally(()=>{Ga=void 0}),Ga}async function Fp(e){let t=Date.now();if(Xa)return{ok:!1,ms:0,err:new Error("pool closed for shutdown")};let n=Zs;try{return n||(n=Up(Hp("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 Za(e){let t=e?.message;return typeof t=="string"&&t.includes(bT)}function ti(e){let t=e,n=t?.code??t?.cause?.code??t?.errno;return n!==void 0&&ST.has(n)}function gd(e){let t=e,n=t?.code??t?.cause?.code??t?.errno;return n!==void 0&&AT.has(n)}async function tw(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 c=ti(i)||t.retryResets===!0&&gd(i);if(s===n-1||!c)throw i;await new Promise(a=>setTimeout(a,r*2**s))}throw o}function ec(e){return e?.code==="QUERY_DEADLINE"}function nw(){let e=Number(process.env.PG_QUERY_DEADLINE_MS);return Number.isFinite(e)&&e>=0?e:2e4}function rw(){let e=Number(process.env.PG_HEAVY_QUERY_DEADLINE_MS);return Number.isFinite(e)&&e>=0?e:6e4}function ET(e,t,n=!0){let r,o=new Promise((s,i)=>{r=setTimeout(()=>{n&&Xy(),i(new fd(t))},t);let c=r;typeof c.unref=="function"&&c.unref()});return Promise.race([e,o]).finally(()=>clearTimeout(r))}function Wp(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 a=Reflect.get(o,s,i);return typeof a!="function"?a:(l,m)=>{let p=r?Op:Pp,_=r?Cp:Dp;p();let I=tw(()=>new Promise((f,w)=>a.call(o,f,w)),{retryResets:t});return(n>0?ET(I,n,!r):I).finally(_).then(l,m)}}let c=Reflect.get(o,s,i);return typeof c=="function"?(...a)=>Wp(c.apply(o,a),t,n,r):c}})}function iw(e,t=!1){let n=t?Op:Pp,r=t?Cp:Dp;n();try{return Promise.resolve(e()).finally(r)}catch(o){throw r(),o}}var Ya,ei,Xa,ld,Ga,Zs,pd,md,bT,ST,AT,fd,ow,sw,d,tt,zp=V(()=>{"use strict";dd();qp();Xa=!1;u(Hp,"getEnv");u(Zy,"getDb");u(ew,"getHeavyDb");u(Qa,"closeDb");u(Bp,"recyclePool");u(Fp,"probeDbReachable");bT="called after closeDb()";u(Za,"isPoolClosedError");ST=new Set(["CONNECT_TIMEOUT","ETIMEDOUT","ENOTFOUND","ECONNREFUSED","EAI_AGAIN"]);u(ti,"isRetryableConnectError");AT=new Set(["CONNECTION_CLOSED","ECONNRESET","EPIPE"]);u(gd,"isRetryableResetError");u(tw,"withDbRetry");fd=class extends Error{static{u(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"}};u(ec,"isQueryDeadlineError");u(nw,"queryDeadlineMs");u(rw,"heavyQueryDeadlineMs");u(ET,"raceWithDeadline");ow=new Set(["select","selectDistinct","selectDistinctOn","insert","update","delete","execute","with","$count","refreshMaterializedView"]),sw=new Set(["select","selectDistinct","selectDistinctOn","$count"]);u(Wp,"wrapBuilder");u(iw,"gaugeTransaction");d=new Proxy({},{get(e,t){let n=Zy(),r=n[t];if(typeof t=="string"&&ow.has(t)&&typeof r=="function"){let o=sw.has(t),s=nw();return(...i)=>Wp(r.apply(n,i),o,s)}return t==="transaction"&&typeof r=="function"?(...o)=>iw(()=>r.apply(n,o)):r}}),tt=new Proxy({},{get(e,t){let n=ew(),r=n[t];if(typeof t=="string"&&ow.has(t)&&typeof r=="function"){let o=sw.has(t);return(...s)=>Wp(r.apply(n,s),o,rw(),!0)}return t==="transaction"&&typeof r=="function"?(...o)=>iw(()=>r.apply(n,o),!0):r}})});async function en(e){let[t]=await d.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 aw=V(()=>{"use strict";zp();dd();u(en,"notifyUser")});var C=V(()=>{"use strict";dd();zp();qp();aw()});function Yw(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Bd(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]*${Yw(t)}[^\\n]*\\n([\\s\\S]*?)(?=\\nContents of |$)`,"i"))?.[1]?.trim();if(o)return o;let s=t.split("/").pop();if(s&&s!==t){let c=n.match(new RegExp(`Contents of [^\\n]*${Yw(s)}[^\\n]*\\n([\\s\\S]*?)(?=\\nContents of |$)`,"i"))?.[1]?.trim();if(c)return c}}return null}var Tf=V(()=>{"use strict";u(Yw,"escapeRegExp");u(Bd,"extractInstructionSection")});var ev={};to(ev,{GRADUATION_MIN_N:()=>vc,decideGraduation:()=>Qw,graduatedRulesForRender:()=>Rf,instructionContentHash:()=>qr,maybeGraduate:()=>Zw,settleExperiment:()=>fi,verdictRowsForExperiments:()=>Wd});import{createHash as mk}from"node:crypto";import{and as Fd,eq as Yn,inArray as pk,sql as Xw}from"drizzle-orm";function Qw(e){return e.resolution!=="resolved"||e.randomisationSuspect||e.contentChanged||e.delta===null||e.ci===null||e.measured.treated<vc||e.measured.control<vc?null:e.delta>0?"always":"never"}function qr(e,t){let n=Bd(e,t);return n?mk("sha256").update(n).digest("hex"):null}async function Zw(e){let{experimentId:t,userId:n,verdict:r}=e,o=Qw(r);if(o===null)return null;let[s]=await d.select({id:U.id,instructionId:U.instructionId,projectPath:U.projectPath,status:U.status}).from(U).where(Fd(Yn(U.id,t),Yn(U.userId,n)));if(!s||s.status!=="running")return null;let[i]=await d.select({content:g.content,name:g.name}).from(g).where(Yn(g.id,s.instructionId)),c=qr(i?.content,i?.name);if(!c)return null;let l=(await d.execute(Xw`
|
|
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 c_=Object.defineProperty;var d=(e,t)=>c_(e,"name",{value:t,configurable:!0})
|
|
|
9
9
|
AND s.user_id = a.user_id
|
|
10
10
|
WHERE a.experiment_id = ${t}
|
|
11
11
|
AND s.analysis->>'outcome' IS NOT NULL
|
|
12
|
-
`))[0];return await
|
|
12
|
+
`))[0];return await d.insert(Y).values({userId:n,instructionId:s.instructionId,contentHash:c,projectPath:s.projectPath,segment:{models:l?.models??[],harnessVersions:l?.harness_versions??[],window:{from:l?.from_at??null,to:l?.to_at??null}},decision:o,delta:String(r.delta),ciLower:String(r.ci.lower),ciUpper:String(r.ci.upper),nTreated:r.measured.treated,nControl:r.measured.control,experimentId:t}).onConflictDoNothing(),await d.update(U).set({status:"stopped",stoppedReason:"graduated"}).where(Yn(U.id,t)),o}async function fi(e){let{experimentId:t,userId:n,verdict:r,source:o,status:s}=e;return s!=="running"?null:r.contentChanged?(await d.update(U).set({status:"stopped",stoppedReason:"content_changed"}).where(Fd(Yn(U.id,t),Yn(U.userId,n))),"content_changed"):await Zw({experimentId:t,userId:n,verdict:r})?"graduated":o==="trial"&&r.resolution==="inconclusive"&&!r.randomisationSuspect&&r.measured.treated>=vc&&r.measured.control>=vc?(await d.update(U).set({status:"stopped",stoppedReason:"trial_neutral"}).where(Fd(Yn(U.id,t),Yn(U.userId,n))),await d.execute(Xw`
|
|
13
13
|
UPDATE instruction_suggestions
|
|
14
14
|
SET declined_at = now(), declined_reason = 'trial_neutral'
|
|
15
15
|
WHERE user_id = ${n}
|
|
@@ -17,19 +17,19 @@ var c_=Object.defineProperty;var d=(e,t)=>c_(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,
|
|
20
|
+
`),"trial_neutral"):null}async function Rf(e,t){return(await d.select({instructionId:Y.instructionId,contentHash:Y.contentHash,decision:Y.decision,content:g.content,name:g.name}).from(Y).innerJoin(g,Yn(Y.instructionId,g.id)).where(Fd(Yn(Y.userId,e),Yn(Y.projectPath,t)))).flatMap(r=>{let o=qr(r.content,r.name);return o===null||o!==r.contentHash?[]:[{instructionId:r.instructionId,decision:r.decision}]})}async function Wd(e){if(e.length===0)return new Map;let t=await d.select({experimentId:Y.experimentId,decision:Y.decision,decidedAt:Y.decidedAt,contentHash:Y.contentHash}).from(Y).where(pk(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 vc,ds=V(()=>{"use strict";C();Tf();vc=25;u(Qw,"decideGraduation");u(qr,"instructionContentHash");u(Zw,"maybeGraduate");u(fi,"settleExperiment");u(Rf,"graduatedRulesForRender");u(Wd,"verdictRowsForExperiments")});var AN,EN,Mv=V(()=>{"use strict";AN=["claude_code","cursor","vscode_copilot","copilot_agent","rulemetric_mcp","codex","pi","opencode","antigravity"],EN=["user_message","assistant_message","tool_call","tool_result","thinking","error"]});var xi,Wf=V(()=>{"use strict";xi=class{static{u(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,c={},a=r.find(h=>h.type==="user");a&&(s=a.cwd??null,i=a.gitBranch??null,a.version&&(c.claudeCodeVersion=a.version),a.sessionId&&(c.sessionId=a.sessionId));let l=r.find(h=>h.type==="assistant");l?.message?.model&&(c.model=l.message.model);let m=[],p=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")m.push({sequence:p++,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"&&m.push({sequence:p++,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,v=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"?m.push({sequence:p++,eventType:"assistant_message",content:A.text??"",toolName:null,toolInput:null,toolOutput:null,tokenUsage:v,timestamp:f,metadata:S}):A.type==="thinking"?m.push({sequence:p++,eventType:"thinking",content:A.thinking??"",toolName:null,toolInput:null,toolOutput:null,tokenUsage:v,timestamp:f,metadata:S}):A.type==="tool_use"&&m.push({sequence:p++,eventType:"tool_call",content:null,toolName:A.name??"unknown",toolInput:A.input??null,toolOutput:null,tokenUsage:v,timestamp:f,metadata:{...S,toolUseId:A.id}})}}let _=m.map(h=>h.timestamp).sort(),I=new Date().toISOString();return{tool:"claude_code",projectPath:s,gitBranch:i,startedAt:_[0]??I,endedAt:_[_.length-1]??null,events:m,metadata:c}}}});var Ti,zf=V(()=>{"use strict";Ti=class{static{u(this,"CursorAdapter")}tool="cursor";parse(t){let n=Rm("better-sqlite3"),r=new n(t,{readonly:!0});try{let o=r.prepare("SELECT value FROM ItemTable WHERE key = 'composer.composerData'").get();return o?this.parseComposerJson(o.value):this.emptySession()}finally{r.close()}}parseComposerJson(t){let n;try{n=JSON.parse(t)}catch{return this.emptySession()}let r=Object.values(n.allComposers??{});if(r.length===0)return this.emptySession();let o=r.sort((l,m)=>{let p=l.createdAt?new Date(l.createdAt).getTime():0;return(m.createdAt?new Date(m.createdAt).getTime():0)-p})[0],s=o.conversation??[],i=[];for(let l=0;l<s.length;l++){let m=s[l],p=m.createdAt??new Date().toISOString();i.push({sequence:l,eventType:m.type===1?"user_message":"assistant_message",content:m.text,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:p,metadata:{}})}let c=i.map(l=>l.timestamp).sort(),a=new Date().toISOString();return{tool:"cursor",projectPath:null,gitBranch:null,startedAt:c[0]??a,endedAt:c[c.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 Ri,Vf=V(()=>{"use strict";Ri=class{static{u(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 a of r){let l=a.timestamp?new Date(a.timestamp).toISOString():new Date().toISOString();if(o.push({sequence:s++,eventType:"user_message",content:a.message,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:l,metadata:{}}),a.response){let m=a.response.timestamp?new Date(a.response.timestamp).toISOString():l;o.push({sequence:s++,eventType:"assistant_message",content:a.response.message,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:m,metadata:{}})}}let i=o.map(a=>a.timestamp).sort(),c=new Date().toISOString();return{tool:"vscode_copilot",projectPath:null,gitBranch:null,startedAt:i[0]??c,endedAt:i[i.length-1]??null,events:o,metadata:{...n.requesterUsername&&{username:n.requesterUsername},...n.customTitle&&{title:n.customTitle}}}}emptySession(){return{tool:"vscode_copilot",projectPath:null,gitBranch:null,startedAt:new Date().toISOString(),endedAt:null,events:[],metadata:{}}}}});var ki,Jf=V(()=>{"use strict";ki=class{static{u(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 a of r){let l=a.timestamp?new Date(a.timestamp).toISOString():new Date().toISOString();if(o.push({sequence:s++,eventType:"user_message",content:a.message,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:l,metadata:{}}),a.toolCalls)for(let m of a.toolCalls){let p=m.timestamp?new Date(m.timestamp).toISOString():l;o.push({sequence:s++,eventType:"tool_call",content:null,toolName:m.name??"unknown",toolInput:m.input??null,toolOutput:m.output??null,tokenUsage:null,timestamp:p,metadata:{}})}if(a.response){let m=a.response.timestamp?new Date(a.response.timestamp).toISOString():l;o.push({sequence:s++,eventType:"assistant_message",content:a.response.message,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:m,metadata:{}})}}let i=o.map(a=>a.timestamp).sort(),c=new Date().toISOString();return{tool:"copilot_agent",projectPath:null,gitBranch:null,startedAt:i[0]??c,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,Kf=V(()=>{"use strict";Ni=class{static{u(this,"RuleMetricMcpAdapter")}tool="rulemetric_mcp";parse(t){let n;try{n=JSON.parse(t)}catch{return this.emptySession()}let o=(n.events??[]).map((i,c)=>({sequence:i.sequence??c,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 xN(e){try{return JSON.parse(e)}catch{return e}}function $v(e,t){return Array.isArray(e)?e.filter(n=>n.type&&t.includes(n.type)).map(n=>n.text??"").filter(Boolean).join(`
|
|
22
22
|
|
|
23
|
-
`):""}function
|
|
24
|
-
`).filter(
|
|
23
|
+
`):""}function TN(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 RN(e){if(!e)return new Date().toISOString();let t=new Date(e);return Number.isFinite(t.getTime())?t.toISOString():new Date().toISOString()}function Gf(){return{sequence:0,model:null,prevCumulativeTotal:0,callNames:{}}}var ji,Yf=V(()=>{"use strict";u(xN,"safeJsonParse");u($v,"textFromBlocks");u(TN,"tokenUsageFromCodex");u(RN,"normalizeTimestamp");u(Gf,"freshCodexState");ji=class{static{u(this,"CodexAdapter")}tool="codex";parse(t){let n=Gf(),{events:r,projectPath:o,gitBranch:s,metadata:i}=this.parseLines(t,n),c=r.map(l=>l.timestamp).sort(),a=new Date().toISOString();return{tool:"codex",projectPath:o,gitBranch:s,startedAt:c[0]??a,endedAt:c[c.length-1]??null,events:r,metadata:i}}parseAppend(t,n){let r={...n,callNames:{...n.callNames}},{events:o}=this.parseLines(t,r);return{events:o,state:r}}parseLines(t,n){let r=t.split(`
|
|
24
|
+
`).filter(m=>m.trim()),o=[],s={},i=n.callNames,c=null,a=null,l=null;for(let m of r){let p;try{p=JSON.parse(m)}catch{continue}let _=p.payload;if(!_)continue;let I=RN(p.timestamp);if(p.type==="session_meta"){l=_.session_id??_.id??l,c=_.cwd??c,_.git_branch&&(a=_.git_branch),_.model&&(n.model=_.model),s.sessionId=l,s.codexSessionId=l,s.originator=_.originator,s.source=_.source,s.modelProvider=_.model_provider,s.codexCliVersion=_.cli_version;continue}if(p.type==="turn_context"){c=_.cwd??c,_.model&&(n.model=_.model,s.model=_.model);continue}if(p.type==="response_item"&&_.type==="message"){if(_.role==="user"){let h=$v(_.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:I,metadata:{}})}else if(_.role==="assistant"){let h=$v(_.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:I,metadata:n.model?{model:n.model}:{}})}continue}if(p.type==="response_item"&&_.type==="function_call"){let h=_.name??"unknown";_.call_id&&(i[_.call_id]=h);let f=typeof _.arguments=="string"?xN(_.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:I,metadata:{callId:_.call_id}});continue}if(p.type==="response_item"&&_.type==="function_call_output"){let h=_.call_id?i[_.call_id]??null:null;o.push({sequence:n.sequence++,eventType:"tool_result",content:_.output??null,toolName:h,toolInput:null,toolOutput:_.output==null?null:{output:_.output},tokenUsage:null,model:n.model,timestamp:I,metadata:{callId:_.call_id}});continue}if(p.type==="event_msg"&&_.type==="token_count"){let h=_.info,f=h?.total_token_usage?.total_tokens??0;if(f>0&&f===n.prevCumulativeTotal)continue;f>0&&(n.prevCumulativeTotal=f);let w=TN(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:I,metadata:{codexEventType:"token_count",...b?{model:b}:{},reasoningOutputTokens:h?.last_token_usage?.reasoning_output_tokens??0}})}}return{events:o,projectPath:c,gitBranch:a,sessionId:l,metadata:s}}}});function Tc(e){let t=kN[e];if(!t)throw new Error(`Unknown session tool: ${e}`);return t()}function Rc(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 kN,qv=V(()=>{"use strict";Wf();zf();Vf();Jf();Kf();Yf();kN={claude_code:u(()=>new xi,"claude_code"),cursor:u(()=>new Ti,"cursor"),vscode_copilot:u(()=>new Ri,"vscode_copilot"),copilot_agent:u(()=>new ki,"copilot_agent"),rulemetric_mcp:u(()=>new Ni,"rulemetric_mcp"),codex:u(()=>new ji,"codex")};u(Tc,"getAdapter");u(Rc,"detectTool")});function Uv(e,t){let n=t.length>0?t.map(o=>`### ${o.name} (ID: ${o.id})
|
|
27
27
|
|
|
28
28
|
${o.content}`).join(`
|
|
29
29
|
|
|
30
30
|
---
|
|
31
31
|
|
|
32
|
-
`):"No instructions were linked to this session.",r=e.map(o=>{let s=`[${o.sequence}] ${o.eventType}`;if(o.eventType==="tool_call")return`${s}: ${o.toolName}(${JSON.stringify(o.toolInput)})`;if(o.eventType==="tool_result"){let
|
|
32
|
+
`):"No instructions were linked to this session.",r=e.map(o=>{let s=`[${o.sequence}] ${o.eventType}`;if(o.eventType==="tool_call")return`${s}: ${o.toolName}(${JSON.stringify(o.toolInput)})`;if(o.eventType==="tool_result"){let c=o.content?.slice(0,200)??"";return`${s}: ${c}${o.content&&o.content.length>200?"...":""}`}let i=o.content?.slice(0,300)??"";return`${s}: ${i}${o.content&&o.content.length>300?"...":""}`}).join(`
|
|
33
33
|
`);return`You are analyzing an AI coding session to evaluate how well the agent followed its instructions and to suggest improvements.
|
|
34
34
|
|
|
35
35
|
## Active Instructions
|
|
@@ -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(
|
|
70
|
-
`).filter(
|
|
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 Hv(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 Bv=V(()=>{"use strict";u(Uv,"buildAnalysisPrompt");u(Hv,"parseAnalysisResponse")});import{readdir as Xf,stat as Qf}from"fs/promises";import{basename as NN,join as wo}from"path";import{homedir as nl}from"os";function PN(){return process.env.CLAUDE_CONFIG_DIR||wo(nl(),".claude")}function DN(){return wo(PN(),"projects")}function ON(){return process.platform==="darwin"?wo(nl(),"Library","Application Support","Claude","local-agent-mode-sessions"):process.platform==="win32"?wo(nl(),"AppData","Roaming","Claude","local-agent-mode-sessions"):wo(nl(),".config","Claude","local-agent-mode-sessions")}async function CN(e){let t=[];async function n(r,o){if(o>8)return;let s=await Xf(r).catch(()=>[]);for(let i of s){if(i==="node_modules"||i===".git")continue;let c=wo(r,i);if((await Qf(c).catch(()=>null))?.isDirectory())if(i==="projects"){let l=await Xf(c).catch(()=>[]);for(let m of l){let p=wo(c,m);(await Qf(p).catch(()=>null))?.isDirectory()&&t.push(p)}}else await n(c,o+1)}}return u(n,"walk"),await n(e,0),t}var jN,Fv,Wv=V(()=>{"use strict";jN={"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"};u(PN,"getClaudeDir");u(DN,"getProjectsDir");u(ON,"getDesktopSessionsDir");u(CN,"findDesktopProjectDirs");Fv={name:"claude",displayName:"Claude Code",modelDisplayName(e){let t=e.replace(/@.*$/,"").replace(/-\d{8}$/,"");for(let[n,r]of Object.entries(jN))if(t.startsWith(n))return r;return t},toolDisplayName(e){return e},async discoverSessions(){let e=[],t=DN();try{let r=await Xf(t);for(let o of r){let s=wo(t,o);(await Qf(s).catch(()=>null))?.isDirectory()&&e.push({path:s,project:o,provider:"claude"})}}catch{}let n=await CN(ON());for(let r of n)e.push({path:r,project:NN(r),provider:"claude"});return e},createSessionParser(){return{async*parse(){}}}}});import{readdir as rl,readFile as zv,stat as LN}from"fs/promises";import{basename as MN,join as Pi}from"path";import{homedir as $N}from"os";function UN(){return process.env.CODEX_HOME??Pi($N(),".codex")}function HN(e){return e.replace(/^\//,"").replace(/\//g,"-")}async function BN(e){try{let n=(await zv(e,"utf-8")).split(`
|
|
68
|
+
`)[0];return n?.trim()?JSON.parse(n):null}catch{return null}}async function FN(e){let t=await BN(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 WN(e){let t=Pi(e,"sessions"),n=[],r;try{r=await rl(t)}catch{return n}for(let o of r){if(!/^\d{4}$/.test(o))continue;let s=Pi(t,o),i=await rl(s).catch(()=>[]);for(let c of i){if(!/^\d{2}$/.test(c))continue;let a=Pi(s,c),l=await rl(a).catch(()=>[]);for(let m of l){if(!/^\d{2}$/.test(m))continue;let p=Pi(a,m),_=await rl(p).catch(()=>[]);for(let I of _){if(!I.startsWith("rollout-")||!I.endsWith(".jsonl"))continue;let h=Pi(p,I);if(!(await LN(h).catch(()=>null))?.isFile())continue;let{valid:w,meta:b}=await FN(h);if(!w||!b)continue;let v=b.payload?.cwd??"unknown";n.push({path:h,project:HN(v),provider:"codex"})}}}}return n}function zN(e,t){return e?.info?.model??e?.info?.model_name??t??"gpt-5"}function VN(e,t){return{async*parse(){let n;try{n=await zv(e.path,"utf-8")}catch{return}let r=n.split(`
|
|
69
|
+
`).filter(I=>I.trim()),o,s="",i=0,c=0,a=0,l=0,m=0,p=[],_="";for(let I of r){let h;try{h=JSON.parse(I)}catch{continue}if(h.type==="session_meta"){s=h.payload?.session_id??MN(e.path,".jsonl"),o=h.payload?.model;continue}if(h.type==="response_item"&&h.payload?.type==="function_call"){let f=h.payload.name??"";p.push(Vv[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&&(_=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,v=0,S=0,A=0,E=0;if(b)v=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;v=(H.input_tokens??0)-c,S=(H.cached_input_tokens??0)-a,A=(H.output_tokens??0)-l,E=(H.reasoning_output_tokens??0)-m}if(!b){let H=f.total_token_usage;H&&(c=H.input_tokens??0,a=H.cached_input_tokens??0,l=H.output_tokens??0,m=H.reasoning_output_tokens??0)}if(v+S+A+E===0)continue;let P=Math.max(0,v-S),N=zN(h.payload,o),D=h.timestamp??"",q=`codex:${e.path}:${D}:${w}`;if(t.has(q))continue;t.add(q),yield{provider:"codex",model:N,inputTokens:P,outputTokens:A,cacheCreationInputTokens:0,cacheReadInputTokens:S,cachedInputTokens:S,reasoningTokens:E,costUSD:0,tools:p,bashCommands:[],timestamp:D,speed:"standard",deduplicationKey:q,userMessage:_,sessionId:s},p=[],_=""}}}}}var qN,Vv,Jv,Kv=V(()=>{"use strict";qN={"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"},Vv={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"};u(UN,"getCodexDir");u(HN,"sanitizeProject");u(BN,"readFirstLine");u(FN,"isValidCodexSession");u(WN,"discoverSessionsInDir");u(zN,"resolveModel");u(VN,"createParser");Jv={name:"codex",displayName:"Codex",modelDisplayName(e){for(let[t,n]of Object.entries(qN))if(e.startsWith(t))return n;return e},toolDisplayName(e){return Vv[e]??e},async discoverSessions(){return WN(UN())},createSessionParser(e,t){return VN(e,t)}}});import{readdir as JN,readFile as Gv,stat as KN}from"fs/promises";import{basename as Yv,dirname as GN,join as Zf}from"path";import{homedir as YN}from"os";function ZN(){return Zf(YN(),".copilot","session-state")}function ej(e){let t=e.match(/^cwd:\s*(.+)$/m);return t?.[1]&&t[1].replace(/\s*#.*$/,"").replace(/^['"]|['"]$/g,"").trim()||null}function tj(e,t){return{async*parse(){let n;try{n=await Gv(e.path,"utf-8")}catch{return}let r=Yv(GN(e.path)),o=n.split(`
|
|
70
|
+
`).filter(c=>c.trim()),s="",i="";for(let c of o){let a;try{a=JSON.parse(c)}catch{continue}if(a.type==="session.model_change"){s=a.data.newModel??s;continue}if(a.type==="user.message"){i=a.data.content??"";continue}if(a.type==="assistant.message"){let{messageId:l,outputTokens:m,toolRequests:p=[]}=a.data;if(m===0||!s)continue;let _=`copilot:${r}:${l}`;if(t.has(_))continue;t.add(_);let I=p.map(h=>h.name??"").filter(Boolean).map(h=>Xv[h]??h);yield{provider:"copilot",model:s,inputTokens:0,outputTokens:m,cacheCreationInputTokens:0,cacheReadInputTokens:0,cachedInputTokens:0,reasoningTokens:0,costUSD:0,tools:I,bashCommands:[],timestamp:a.timestamp??"",speed:"standard",deduplicationKey:_,userMessage:i,sessionId:r},i=""}}}}}async function nj(e){let t=[],n;try{n=await JN(e)}catch{return t}for(let r of n){let o=Zf(e,r,"events.jsonl");if(!(await KN(o).catch(()=>null))?.isFile())continue;let i=r;try{let c=await Gv(Zf(e,r,"workspace.yaml"),"utf-8"),a=ej(c);a&&(i=Yv(a))}catch{}t.push({path:o,project:i,provider:"copilot"})}return t}var XN,Xv,QN,Qv,Zv=V(()=>{"use strict";XN={"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"},Xv={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"},QN=Object.entries(XN).sort((e,t)=>t[0].length-e[0].length);u(ZN,"getCopilotSessionStateDir");u(ej,"parseCwd");u(tj,"createParser");u(nj,"discoverSessionsInDir");Qv={name:"copilot",displayName:"GitHub Copilot",modelDisplayName(e){for(let[t,n]of QN)if(e===t||e.startsWith(t+"-"))return n;return e},toolDisplayName(e){return Xv[e]??e},async discoverSessions(){return nj(ZN())},createSessionParser(e,t){return tj(e,t)}}});import{readdir as eI,readFile as nI,stat as tI}from"fs/promises";import{basename as rI,join as eg}from"path";import{homedir as rj}from"os";function ij(){return eg(rj(),".pi","agent","sessions")}async function aj(e){try{let n=(await nI(e,"utf-8")).split(`
|
|
71
|
+
`)[0];return n?.trim()?JSON.parse(n):null}catch{return null}}function cj(e){return e.split(/[;&|]+/).map(t=>t.trim().split(/\s+/)[0]).filter(Boolean)}async function uj(e){let t=[],n;try{n=await eI(e)}catch{return t}for(let r of n){let o=eg(e,r);if(!(await tI(o).catch(()=>null))?.isDirectory())continue;let i;try{i=await eI(o)}catch{continue}for(let c of i){if(!c.endsWith(".jsonl"))continue;let a=eg(o,c);if(!(await tI(a).catch(()=>null))?.isFile())continue;let m=await aj(a);if(!m||m.type!=="session")continue;let p=m.cwd??r;t.push({path:a,project:rI(p),provider:"pi"})}}return t}function dj(e,t){return{async*parse(){let n;try{n=await nI(e.path,"utf-8")}catch{return}let r=n.split(`
|
|
72
|
+
`).filter(i=>i.trim()),o=rI(e.path,".jsonl"),s="";for(let[i,c]of r.entries()){let a;try{a=JSON.parse(c)}catch{continue}if(a.type==="session"){o=a.id??o;continue}if(a.type!=="message")continue;let l=a.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:m,output:p,cacheRead:_,cacheWrite:I}=l.usage;if(m===0&&p===0)continue;let h=l.model??"gpt-5",f=l.responseId??"",w=`pi:${e.path}:${f||a.id||a.timestamp||String(i)}`;if(t.has(w))continue;t.add(w);let b=(l.content??[]).filter(E=>E.type==="toolCall"&&E.name),v=b.map(E=>oI[E.name]??E.name),S=b.filter(E=>E.name==="bash").flatMap(E=>{let R=E.arguments?.command;return typeof R=="string"?cj(R):[]}),A=a.timestamp??"";yield{provider:"pi",model:h,inputTokens:m,outputTokens:p,cacheCreationInputTokens:I,cacheReadInputTokens:_,cachedInputTokens:_,reasoningTokens:0,costUSD:0,tools:v,bashCommands:S,timestamp:A,speed:"standard",deduplicationKey:w,userMessage:s,sessionId:o},s=""}}}}var oj,oI,sj,sI,iI=V(()=>{"use strict";oj={"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"},oI={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"},sj=Object.entries(oj).sort((e,t)=>t[0].length-e[0].length);u(ij,"getPiSessionsDir");u(aj,"readFirstEntry");u(cj,"extractBashCommands");u(uj,"discoverSessionsInDir");u(dj,"createParser");sI={name:"pi",displayName:"Pi",modelDisplayName(e){for(let[t,n]of sj)if(e.startsWith(t))return n;return e},toolDisplayName(e){return oI[e]??e},async discoverSessions(){return uj(ij())},createSessionParser(e,t){return dj(e,t)}}});var cI={};to(cI,{cursor:()=>yj});import{existsSync as lj}from"fs";import{join as tg}from"path";import{homedir as ng}from"os";function aI(){if(ol)return!0;try{return ol=Rm("better-sqlite3"),!0}catch{return!1}}function fj(){return process.platform==="darwin"?tg(ng(),"Library","Application Support","Cursor","User","globalStorage","state.vscdb"):process.platform==="win32"?tg(ng(),"AppData","Roaming","Cursor","User","globalStorage","state.vscdb"):tg(ng(),".config","Cursor","User","globalStorage","state.vscdb")}function gj(e){return!e||e==="default"?mj:e}function _j(e,t){return{async*parse(){if(!aI()||!ol)return;let n;try{n=new ol(e.path,{readonly:!0})}catch{return}try{let o=n.prepare(hj).all();for(let s of o){let i=s.input_tokens??0,c=s.output_tokens??0;if(i===0&&c===0)continue;let a=s.created_at??"",l=s.conversation_id??"unknown",m=`cursor:${l}:${a}:${i}:${c}`;if(t.has(m))continue;t.add(m);let p=gj(s.model);yield{provider:"cursor",model:s.model??"default",inputTokens:i,outputTokens:c,cacheCreationInputTokens:0,cacheReadInputTokens:0,cachedInputTokens:0,reasoningTokens:0,costUSD:0,tools:[],bashCommands:[],timestamp:a,speed:"standard",deduplicationKey:m,userMessage:s.user_text??"",sessionId:l}}}finally{n.close()}}}}var ol,mj,pj,hj,yj,uI=V(()=>{"use strict";ol=null;u(aI,"loadSqlite");mj="claude-sonnet-4-5",pj={"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.)"};u(fj,"getCursorDbPath");u(gj,"resolveModel");hj=`
|
|
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 rb(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
|
-
`;
|
|
84
|
+
`;u(_j,"createParser");yj={name:"cursor",displayName:"Cursor",modelDisplayName(e){return pj[e]??e},toolDisplayName(e){return e},async discoverSessions(){if(!aI())return[];let e=fj();return lj(e)?[{path:e,project:"cursor",provider:"cursor"}]:[]},createSessionParser(e,t){return _j(e,t)}}});var mI={};to(mI,{opencode:()=>Tj});import{readdir as wj}from"fs/promises";import{join as rg}from"path";import{homedir as vj}from"os";function og(){if(Di)return!0;try{return Di=Rm("better-sqlite3"),!0}catch{return!1}}function dI(e){return e.replace(/^\//,"").replace(/\//g,"-")}function Ij(){let e=process.env.XDG_DATA_HOME??rg(vj(),".local","share");return rg(e,"opencode")}async function bj(e){try{return(await wj(e)).filter(n=>n.startsWith("opencode")&&n.endsWith(".db")).map(n=>rg(e,n))}catch{return[]}}function Sj(e){let t=e<1e12?e*1e3:e;return new Date(t).toISOString()}function Aj(e){return e.split(/[;&|]+/).map(t=>t.trim().split(/\s+/)[0]).filter(Boolean)}function Ej(e,t){return{async*parse(){if(!og()||!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),c=s.prepare("SELECT message_id, data FROM part WHERE session_id = ? ORDER BY message_id, id").all(r),a=new Map;for(let m of c)try{let p=JSON.parse(m.data),_=a.get(m.message_id)??[];_.push(p),a.set(m.message_id,_)}catch{}let l="";for(let m of i){let p;try{p=JSON.parse(m.data)}catch{continue}if(p.role==="user"){let S=(a.get(m.id)??[]).filter(A=>A.type==="text").map(()=>"").filter(Boolean);S.length>0&&(l=S.join(" "));continue}if(p.role!=="assistant")continue;let _={input:p.tokens?.input??0,output:p.tokens?.output??0,reasoning:p.tokens?.reasoning??0,cacheRead:p.tokens?.cache?.read??0,cacheWrite:p.tokens?.cache?.write??0};if(_.input===0&&_.output===0&&_.reasoning===0&&_.cacheRead===0&&_.cacheWrite===0&&(p.cost??0)===0)continue;let f=(a.get(m.id)??[]).filter(S=>S.type==="tool"),w=f.map(S=>lI[S.tool??""]??S.tool??"").filter(Boolean),b=f.filter(S=>S.tool==="bash"&&typeof S.state?.input?.command=="string").flatMap(S=>Aj(S.state.input.command)),v=`opencode:${r}:${m.id}`;t.has(v)||(t.add(v),yield{provider:"opencode",model:p.modelID??"unknown",inputTokens:_.input,outputTokens:_.output,cacheCreationInputTokens:_.cacheWrite,cacheReadInputTokens:_.cacheRead,cachedInputTokens:_.cacheRead,reasoningTokens:_.reasoning,costUSD:p.cost??0,tools:w,bashCommands:b,timestamp:Sj(m.time_created),speed:"standard",deduplicationKey:v,userMessage:l,sessionId:r})}}finally{s.close()}}}}async function xj(e){if(!og()||!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?dI(r.directory):dI(r.title),provider:"opencode"}))}catch{return[]}finally{t.close()}}var Di,lI,Tj,pI=V(()=>{"use strict";Di=null;u(og,"loadSqlite");lI={bash:"Bash",read:"Read",edit:"Edit",write:"Write",glob:"Glob",grep:"Grep",task:"Agent",fetch:"WebFetch",search:"WebSearch",todo:"TodoWrite",skill:"Skill",patch:"Patch"};u(dI,"sanitize");u(Ij,"getDataDir");u(bj,"findDbFiles");u(Sj,"parseTimestamp");u(Aj,"extractBashCommands");u(Ej,"createParser");u(xj,"discoverFromDb");Tj={name:"opencode",displayName:"OpenCode",modelDisplayName(e){return e.replace(/^[^/]+\//,"")},toolDisplayName(e){return lI[e]??e},async discoverSessions(){if(!og())return[];let e=await bj(Ij()),t=[];for(let n of e)t.push(...await xj(n));return t},createSessionParser(e,t){return Ej(e,t)}}});async function wI(){if(gI)return fI;gI=!0;try{let{cursor:e}=await Promise.resolve().then(()=>(uI(),cI));return fI=e,e}catch{return null}}async function vI(){if(_I)return hI;_I=!0;try{let{opencode:e}=await Promise.resolve().then(()=>(pI(),mI));return hI=e,e}catch{return null}}async function sg(){let[e,t]=await Promise.all([wI(),vI()]),n=[...yI];return e&&n.push(e),t&&n.push(t),n}async function II(e){let t=await sg(),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 bI(e){return e==="cursor"?await wI()??void 0:e==="opencode"?await vI()??void 0:yI.find(t=>t.name===e)}var yI,fI,gI,hI,_I,SI=V(()=>{"use strict";Wv();Kv();Zv();iI();yI=[Fv,Jv,Qv,sI],fI=null,gI=!1;u(wI,"loadCursor");hI=null,_I=!1;u(vI,"loadOpenCode");u(sg,"getAllProviders");u(II,"discoverAllSessions");u(bI,"getProvider")});import{spawn as Rj}from"node:child_process";function sl(e){return`rm-${e.trim().replace(/[^A-Za-z0-9_.-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,80)||"session"}`}function il(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 kc(e,t,n={}){return n.literal===!1?["send-keys","-t",e,t]:["send-keys","-t",e,"-l","--",t]}function AI(e){return["has-session","-t",e]}function Nc(e){return`tmux attach -t ${e}`}function kj(){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 ig(e){return new Promise(t=>{let n=Rj("tmux",e,{stdio:["ignore","ignore","pipe"],env:kj()}),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 EI(){return(await ig(["-V"])).code===0}var ag=V(()=>{"use strict";u(sl,"sanitizeTmuxName");u(il,"buildTmuxLaunchArgs");u(kc,"buildTmuxSendKeysArgs");u(AI,"buildTmuxHasSessionArgs");u(Nc,"buildTmuxAttachCommand");u(kj,"tmuxSpawnEnv");u(ig,"runTmux");u(EI,"isTmuxAvailable")});import{spawn as cg}from"node:child_process";import{randomUUID as Nj}from"node:crypto";import{writeFile as xI}from"node:fs/promises";import{tmpdir as TI}from"node:os";import{join as RI}from"node:path";function Pj(e){if(e!==void 0){if(jj.test(e))return e;console.warn(`[claude-code-launcher] dropping non-uuid runId (RULEMETRIC_RUN_ID not injected): ${JSON.stringify(e)}`)}}function Dj(e){return`'${e.replace(/'/g,"'\\''")}'`}var jj,al,kI=V(()=>{"use strict";ag();jj=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;u(Pj,"validateRunId");u(Dj,"shellSingleQuote");al=class{static{u(this,"ClaudeCodeLauncher")}options;tool="claude_code";constructor(t={}){this.options=t}capabilities={headless:!0,interactive:!0,remoteSpawn:!0};async launch(t){let n=Nj(),r={...t,runId:Pj(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=cg("claude",r,{cwd:t.projectPath,env:o,stdio:["ignore","pipe","pipe"]}),c="",a="";i.stdout.on("data",m=>{c+=m.toString()}),i.stderr.on("data",m=>{a+=m.toString()});let l=t.timeout?setTimeout(()=>{i.kill("SIGTERM")},t.timeout):null;i.on("close",m=>{l&&clearTimeout(l);let p=c;try{let _=JSON.parse(c);p=_.result??_.content??c}catch{}s({sessionId:n,pid:i.pid,exitCode:m,output:p,error:m!==0?a:void 0})}),i.on("error",m=>{l&&clearTimeout(l),s({sessionId:n,error:`Failed to spawn claude: ${m.message}`})})})}async launchInteractive(t,n){return await(this.options.tmuxAvailable??EI)().catch(()=>!1)?this.launchInteractiveTmux(t,n):this.launchInteractiveTerminal(t,n,"tmux_not_found")}async launchInteractiveTmux(t,n){let r=this.options.runTmux??ig,o=sl(`claude-${t.resumeSessionId??n}`),s=await r(il({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 c=await r(kc(o,t.prompt));if(c.code!==0)return{sessionId:n,liveSendAvailable:!1,fallbackReason:"tmux_launch_failed",error:`tmux send-keys exited ${c.code}: ${c.stderr.trim()||"no stderr"}`};let a=await r(kc(o,"Enter",{literal:!1}));if(a.code!==0)return{sessionId:n,liveSendAvailable:!1,fallbackReason:"tmux_launch_failed",error:`tmux send Enter exited ${a.code}: ${a.stderr.trim()||"no stderr"}`}}return{sessionId:n,pid:i.pid,liveSendAvailable:!0,...i.error?{error:i.error}:{},terminalTarget:{kind:"tmux",target:o,attachCommand:Nc(o),live:!0}}}async openTerminalAttach(t,n){let r=RI(TI(),`rulemetric-attach-${n}.command`),o=`#!/bin/zsh
|
|
85
85
|
rm -- "$0"
|
|
86
|
-
${
|
|
87
|
-
`;return await
|
|
86
|
+
${Nc(t)}
|
|
87
|
+
`;return await xI(r,o,{mode:493}),new Promise(s=>{let i=cg("open",["-a","Terminal",r],{stdio:["ignore","pipe","pipe"]}),c="";i.stderr.on("data",a=>{c+=a.toString()}),i.on("close",a=>{s(a===0?{pid:i.pid}:{pid:i.pid,error:`open attach exited ${a}: ${c.trim()||"no stderr"}`})}),i.on("error",a=>{s({error:`Failed to spawn open attach: ${a.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(" "),c=RI(TI(),`rulemetric-launch-${n}.command`),a=t.runId?`export RULEMETRIC_RUN_ID=${Dj(t.runId)}
|
|
88
88
|
`:"",l=`#!/bin/zsh
|
|
89
89
|
rm -- "$0"
|
|
90
90
|
cd ${JSON.stringify(t.projectPath)} || exit
|
|
91
|
-
`+
|
|
92
|
-
`;return await
|
|
91
|
+
`+a+`${i}
|
|
92
|
+
`;return await xI(c,l,{mode:493}),new Promise(m=>{let p=cg("open",["-a","Terminal",c],{stdio:["ignore","pipe","pipe"]}),_="";p.stderr.on("data",I=>{_+=I.toString()}),p.on("close",I=>{if(I===0)m({sessionId:n,pid:p.pid,liveSendAvailable:!1,fallbackReason:r,...o?{error:o}:{}});else{let h=_.trim()||"no stderr";m({sessionId:n,pid:p.pid,liveSendAvailable:!1,fallbackReason:r,error:o?`${o}; open exited ${I}: ${h}`:`open exited ${I}: ${h}`})}}),p.on("error",I=>{m({sessionId:n,liveSendAvailable:!1,fallbackReason:r,error:`Failed to spawn open: ${I.message}`})})})}}});import{spawn as NI}from"node:child_process";import{randomUUID as Oj}from"node:crypto";var cl,jI=V(()=>{"use strict";cl=class{static{u(this,"CodexLauncher")}tool="codex";capabilities={headless:!0,interactive:!0,remoteSpawn:!0};async launch(t){let n=Oj();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=NI("codex",r,{cwd:t.projectPath,stdio:["ignore","pipe","pipe"]}),i="",c="";s.stdout.on("data",l=>{i+=l.toString()}),s.stderr.on("data",l=>{c+=l.toString()});let a=t.timeout?setTimeout(()=>{s.kill("SIGTERM")},t.timeout):null;s.on("close",l=>{a&&clearTimeout(a),o({sessionId:n,pid:s.pid,exitCode:l,output:i,error:l!==0?c:void 0})}),s.on("error",l=>{a&&clearTimeout(a),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=NI("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 PI}from"node:child_process";import{randomUUID as Cj}from"node:crypto";var ul,DI=V(()=>{"use strict";ul=class{static{u(this,"AiderLauncher")}tool="aider";capabilities={headless:!0,interactive:!0,remoteSpawn:!0};async launch(t){let n=Cj();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=PI("aider",r,{cwd:t.projectPath,stdio:["ignore","pipe","pipe"]}),i="",c="";s.stdout.on("data",l=>{i+=l.toString()}),s.stderr.on("data",l=>{c+=l.toString()});let a=t.timeout?setTimeout(()=>{s.kill("SIGTERM")},t.timeout):null;s.on("close",l=>{a&&clearTimeout(a),o({sessionId:n,pid:s.pid,exitCode:l,output:i,error:l!==0?c:void 0})}),s.on("error",l=>{a&&clearTimeout(a),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=PI("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 Lj}from"node:child_process";import{randomUUID as Mj}from"node:crypto";var dl,OI=V(()=>{"use strict";dl=class{static{u(this,"GenericLauncher")}tool;constructor(t){this.tool=t}capabilities={headless:!1,interactive:!0,remoteSpawn:!1};async launch(t){let n=Mj();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=Lj("osascript",["-e",`tell application "Terminal" to do script ${JSON.stringify(r)}`],{stdio:"ignore",detached:!0});return o.unref(),{sessionId:n,pid:o.pid}}}});function LI(e){let t=CI[e];return t?t():new dl(e)}function MI(){return Object.entries(CI).map(([e,t])=>({tool:e,capabilities:t().capabilities}))}var CI,$I=V(()=>{"use strict";kI();jI();DI();OI();CI={claude_code:u(()=>new al,"claude_code"),codex:u(()=>new cl,"codex"),aider:u(()=>new ul,"aider")};u(LI,"getLauncher");u(MI,"getAvailableLaunchers")});import qI from"node:path";function ug(e){return e.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^[-.]+|[-.]+$/g,"")||"worktree"}function ll(e){return qI.resolve(e.basePath??qI.join(e.repoRoot,"..",".rulemetric-worktrees",ug(e.branch)))}var UI=V(()=>{"use strict";u(ug,"sanitizeBranch");u(ll,"worktreePathFor")});var HI={};to(HI,{ClaudeCodeAdapter:()=>xi,CodexAdapter:()=>ji,CopilotAgentAdapter:()=>ki,CursorAdapter:()=>Ti,RuleMetricMcpAdapter:()=>Ni,SESSION_EVENT_TYPES:()=>EN,SESSION_TOOLS:()=>AN,VSCodeCopilotAdapter:()=>Ri,buildAnalysisPrompt:()=>Uv,buildTmuxAttachCommand:()=>Nc,buildTmuxHasSessionArgs:()=>AI,buildTmuxLaunchArgs:()=>il,buildTmuxSendKeysArgs:()=>kc,detectTool:()=>Rc,discoverAllSessions:()=>II,freshCodexState:()=>Gf,getAdapter:()=>Tc,getAllProviders:()=>sg,getAvailableLaunchers:()=>MI,getLauncher:()=>LI,getProvider:()=>bI,parseAnalysisResponse:()=>Hv,sanitizeBranch:()=>ug,sanitizeTmuxName:()=>sl,worktreePathFor:()=>ll});var ml=V(()=>{"use strict";Mv();Wf();zf();Vf();Jf();Kf();Yf();qv();Bv();SI();$I();UI();ag()});var GI={};to(GI,{getSupabaseAdmin:()=>On});import{createClient as Yj}from"@supabase/supabase-js";function On(){if(_l)return _l;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 _l=Yj(e,t,{auth:{autoRefreshToken:!1,persistSession:!1}}),_l}var _l,jc=V(()=>{"use strict";_l=null;u(On,"getSupabaseAdmin")});var ZI={};to(ZI,{SNAPSHOT_DELTA_BUCKET:()=>mg,decodeDeltaBlob:()=>YI,encodeDeltaBlob:()=>pg,getDeltaBlob:()=>Pc,resolveDeltaPage:()=>Dc,resolveFullRows:()=>gg,uploadEncodedDelta:()=>fg});import{gzipSync as Xj,gunzipSync as Qj}from"node:zlib";import{createHash as Zj}from"node:crypto";function pg(e){let t=JSON.stringify(e??[]),n=Xj(Buffer.from(t,"utf-8")),r=Zj("sha256").update(n).digest("hex");return{body:n,ref:`sha256/${r}.json.gz`,bytes:n.byteLength}}function YI(e){try{let t=Qj(Buffer.from(e)).toString("utf-8"),n=JSON.parse(t);return Array.isArray(n)?n:[]}catch{return[]}}async function fg(e){let{body:t,ref:n,bytes:r}=e,{error:o}=await On().storage.from(mg).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 Pc(e){let{data:t,error:n}=await On().storage.from(mg).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 YI(r)}function yl(e){return typeof e.messagesDeltaRef=="string"&&e.messagesDeltaRef.length>0}async function QI(e,t,n){let r=new Array(e.length),o=0,s=u(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 Dc(e){return e.some(yl)?QI(e,XI,async t=>({sequence:t.sequence,messagesDelta:yl(t)?await Pc(t.messagesDeltaRef):t.messagesDelta})):e.map(t=>({sequence:t.sequence,messagesDelta:t.messagesDelta}))}async function gg(e){return e.some(yl)?QI(e,XI,async t=>yl(t)?{...t,messagesDelta:await Pc(t.messagesDeltaRef)}:t):e}var mg,XI,wl=V(()=>{"use strict";jc();mg="snapshot-deltas";u(pg,"encodeDeltaBlob");u(YI,"decodeDeltaBlob");u(fg,"uploadEncodedDelta");u(Pc,"getDeltaBlob");XI=8;u(yl,"hasRef");u(QI,"mapCapped");u(Dc,"resolveDeltaPage");u(gg,"resolveFullRows")});var $S={};to($S,{resolveRuntimeWebConfig:()=>MS,stampRuntimeConfig:()=>r1});function MS(e=process.env){let t=e.SUPABASE_URL?.trim(),n=e.SUPABASE_ANON_KEY?.trim();return!t||!n?null:{supabaseUrl:t,supabaseAnonKey:n}}function r1(e,t=process.env){let n=MS(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 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`
|
|
94
|
+
${e}`}var qS=V(()=>{"use strict";u(MS,"resolveRuntimeWebConfig");u(r1,"stampRuntimeConfig")});import*as vm from"node:fs";import*as Im from"node:path";import{fileURLToPath as L1}from"node:url";import{serve as M1}from"@hono/node-server";import{trace as r_,context as gA}from"@opentelemetry/api";import{NodeSDK as hA}from"@opentelemetry/sdk-node";import{OTLPTraceExporter as _A}from"@opentelemetry/exporter-trace-otlp-http";import{BatchSpanProcessor as yA,ConsoleSpanExporter as wA,SimpleSpanProcessor as vA}from"@opentelemetry/sdk-trace-node";import{Resource as IA}from"@opentelemetry/resources";import{ATTR_SERVICE_NAME as bA,ATTR_SERVICE_VERSION as SA}from"@opentelemetry/semantic-conventions";function n_(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}u(n_,"parseOtlpHeaders");var qs=null;function Us(){return process.env.TELEMETRY_ENABLED!=="false"}u(Us,"isTelemetryEnabled");function km(e){if(!Us()||qs!==null)return"off";let t=new IA({[bA]:e.serviceName,[SA]:e.serviceVersion??"0.1.0"}),n=process.env.OTEL_EXPORTER_OTLP_ENDPOINT,r,o;if(n){let s=n_(process.env.OTEL_EXPORTER_OTLP_HEADERS),i=new _A({url:`${n}/v1/traces`,headers:s});o=new yA(i),r="otlp"}else if(process.env.OTEL_SPAN_EXPORT==="none")o=void 0,r="silent";else{let s=new wA;o=new vA(s),r="console"}return qs=new hA({resource:t,spanProcessors:o?[o]:[]}),qs.start(),r}u(km,"initTelemetry");async function Nm(){qs&&(await qs.shutdown(),qs=null)}u(Nm,"shutdownTelemetry");function jm(e){return r_.getTracer(e??"rulemetric")}u(jm,"getTracer");function Pm(){return r_.getSpan(gA.active())?.spanContext().traceId}u(Pm,"getTraceId");import{SpanKind as AA,SpanStatusCode as o_}from"@opentelemetry/api";function Dm(){return async(e,t)=>{if(!Us()){await t();return}let n=jm(),r=e.req.method,o=e.req.path;await n.startActiveSpan(`${r} ${o}`,{kind:AA.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:o_.ERROR})}catch(i){throw s.setStatus({code:o_.ERROR}),s.recordException(i),i}finally{s.end()}})}}u(Dm,"telemetryMiddleware");import{trace as EA,context as xA}from"@opentelemetry/api";function Om(e){let t=EA.getSpan(xA.active());if(t)for(let[n,r]of Object.entries(e))t.setAttribute(n,r)}u(Om,"setSpanAttributes");import*as jr from"@sentry/node";var va=!1;function Cm(e){if(va)return!1;let t=process.env.SENTRY_DSN;return t?(jr.init({dsn:t,serverName:e.serviceName,environment:process.env.NODE_ENV??"development",tracesSampleRate:0}),va=!0,!0):!1}u(Cm,"initSentry");function rr(e,t){if(!va)return;let n=e instanceof Error?e:new Error(typeof e=="string"?e:JSON.stringify(e));jr.captureException(n,t)}u(rr,"captureException");function Ia(e){if(va){if(e===null){jr.setUser(null);return}jr.setUser({id:e})}}u(Ia,"setSentryUser");async function ba(e){va&&await jr.flush(e)}u(ba,"flushSentry");import*as vu from"node:fs";import*as pa from"node:path";import{fileURLToPath as o1}from"node:url";import{Hono as s1}from"hono";import{cors as i1}from"hono/cors";import{bodyLimit as a1}from"hono/body-limit";import{serveStatic as c1}from"@hono/node-server/serve-static";C();import{createHash as CT}from"node:crypto";import{createClient as LT}from"@supabase/supabase-js";import{eq as pw,and as MT,isNull as $T}from"drizzle-orm";import{createHmac as xT,createPublicKey as TT,timingSafeEqual as RT,verify as kT}from"node:crypto";var NT=6e4,nc=null,uw=0,tc=null,jT=null;async function PT(){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()}u(PT,"defaultJwksFetcher");async function Vp(){return tc||(tc=(async()=>{try{let e=await(jT??PT)(),t=new Map;for(let n of e.keys)if(n.kid)try{t.set(n.kid,TT({key:n,format:"jwk"}))}catch{}nc=t,uw=Date.now()}finally{tc=null}})(),tc)}u(Vp,"refreshJwks");function cw(e){try{return JSON.parse(Buffer.from(e,"base64url").toString("utf-8"))}catch{return null}}u(cw,"decodeB64Json");function DT(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}u(DT,"checkPayload");function OT(e,t,n,r){let o=xT("sha256",r).update(`${e}.${t}`).digest(),s;try{s=Buffer.from(n,"base64url")}catch{return!1}return s.length!==o.length?!1:RT(s,o)}u(OT,"verifyHs256");async function dw(e){let t=e.split(".");if(t.length!==3)return{ok:!1,reason:"invalid"};let[n,r,o]=t,s=cw(n);if(!s)return{ok:!1,reason:"invalid"};if(s.alg==="HS256"){let a=process.env.SUPABASE_JWT_SECRET;if(!a)return{ok:!1,reason:"unavailable"};if(!OT(n,r,o,a))return{ok:!1,reason:"invalid"}}else if(s.alg==="ES256"){if(typeof s.kid!="string")return{ok:!1,reason:"invalid"};if(nc===null)try{await Vp()}catch{return{ok:!1,reason:"unavailable"}}let a=nc?.get(s.kid);if(!a&&Date.now()-uw>=NT){try{await Vp()}catch{return{ok:!1,reason:"unavailable"}}a=nc?.get(s.kid)}if(!a)return{ok:!1,reason:"invalid"};let l;try{l=Buffer.from(o,"base64url")}catch{return{ok:!1,reason:"invalid"}}if(!kT("sha256",Buffer.from(`${n}.${r}`),{key:a,dsaEncoding:"ieee-p1363"},l))return{ok:!1,reason:"invalid"}}else return{ok:!1,reason:"invalid"};let i=cw(r);if(!i)return{ok:!1,reason:"invalid"};let c=DT(i);return c?{ok:!0,userId:c.userId,payload:i}:{ok:!1,reason:"invalid"}}u(dw,"verifySupabaseJwt");async function lw(e=3){for(let t=0;t<e;t++)try{return await Vp(),nc!==null}catch{await new Promise(n=>setTimeout(n,500*2**t))}return!1}u(lw,"primeJwks");function qT(e){return CT("sha256").update(e).digest("hex")}u(qT,"hashApiKey");var mw=new Map,UT=300*1e3;function HT(e){let t=Date.now(),n=mw.get(e)??0;t-n<UT||(mw.set(e,t),d.update(be).set({lastUsedAt:new Date}).where(pw(be.id,e)).then(()=>{}).catch(()=>{}))}u(HT,"updateLastUsed");var BT=60*1e3,FT=5e3,ni=new Map;async function fw(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=qT(r),s,i=ni.get(o);if(i&&Date.now()-i.cachedAt<BT)s=i;else{i&&ni.delete(o);let[c]=await d.select({id:be.id,userId:be.userId,expiresAt:be.expiresAt}).from(be).where(MT(pw(be.keyHash,o),$T(be.revokedAt)));if(!c)return e.json({error:"Invalid API key"},401);s={id:c.id,userId:c.userId,expiresAt:c.expiresAt,cachedAt:Date.now()},ni.size>=FT&&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),Ia(s.userId),HT(s.id),await t();return}try{let o=LT(process.env.SUPABASE_URL,process.env.SUPABASE_ANON_KEY,{global:{headers:{Authorization:`Bearer ${r}`}}}),s=await dw(r);if(s.ok){e.set("userId",s.userId),e.set("supabase",o),Ia(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:c},error:a}=await o.auth.getUser();if(console.log(`[auth] getUser ${e.req.method} ${e.req.path} ms=${Date.now()-i} ${a?`err=${a.message}`:`userId=${c?.id??"?"}`}`),a||!c)return e.json({error:"Invalid token"},401);e.set("user",c),e.set("userId",c.id),e.set("supabase",o),Ia(c.id),await t()}catch{return e.json({error:"Authentication failed"},401)}}u(fw,"authMiddleware");C();import{HTTPException as WT}from"hono/http-exception";import{ZodError as zT}from"zod";function rt(e){return e.replace(/[%_\\]/g,"\\$&")}u(rt,"escapeLike");function ri(e){let t=e;return t?.code??t?.cause?.code??t?.errno}u(ri,"transientCode");var VT=new Set(["ECONNRESET","EPIPE","ECONNABORTED"]);function gw(e,t){return e instanceof zT?t.json({error:"Validation error",details:e.flatten().fieldErrors},400):e instanceof WT?e.getResponse():Za(e)?t.json({error:"Server draining, retry shortly"},503):ec(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"||VT.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))}u(gw,"errorHandler");function rc(e,t){let n=new Map;return setInterval(()=>{let r=Date.now();for(let[o,s]of n)r>s.resetAt&&n.delete(o)},6e4).unref(),async(r,o)=>{let i=`${r.req.header("x-forwarded-for")?.split(",")[0]?.trim()??r.req.header("x-real-ip")??"unknown"}:${r.req.path}`,c=Date.now(),a=n.get(i);if((!a||c>a.resetAt)&&(a={count:0,resetAt:c+e},n.set(i,a)),a.count++,r.res.headers.set("X-RateLimit-Limit",String(t)),r.res.headers.set("X-RateLimit-Remaining",String(Math.max(0,t-a.count))),r.res.headers.set("X-RateLimit-Reset",String(Math.ceil(a.resetAt/1e3))),a.count>t)return r.json({error:"Too many requests, please try again later"},429);await o()}}u(rc,"rateLimit");var hd=!0,Jp="",hw=0;function Kp(e,t="",n=-1){if(e===hd){!e&&t&&(Jp=t);return}hd=e,Jp=e?"":t,hw=n,console.log(`[db-readiness] -> ${e?"READY":"NOT READY"}${t?` (${t})`:""}`)}u(Kp,"setDbReady");function oc(){return hd}u(oc,"isDbReady");function _d(){return{ready:hd,reason:Jp,changedAt:hw}}u(_d,"dbReadiness");async function _w(e,t){return oc()?t():(e.header("Retry-After","5"),e.json({error:"Service temporarily unavailable: the database is recovering. Retry shortly.",reason:_d().reason||void 0},503))}u(_w,"dbShed");C();var JT=5e3,yw=0;async function ww(e,t){let n=Va(),r=Qs();if(n>r){Lp();let o=Date.now();return o-yw>=JT&&(yw=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()}u(ww,"dbLoadShed");C();var KT=5e3,vw=0;async function sc(e,t){if(e.req.method!=="POST")return t();let n=Va(),r=Ka();if(n>=r){Ja();let o=Date.now();return o-vw>=KT&&(vw=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()}u(sc,"ingestLoadShed");var Iw=u(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 bw(){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,c=e.get("userId");console.warn(`[http] slow_or_error method=${e.req.method} path=${i} status=${e.res.status} ms=${r}${c?` user=${c}`:""}`)}}}u(bw,"slowRequestLog");import{Hono as YT}from"hono";import{z as lo}from"zod";import{createClient as Sw}from"@supabase/supabase-js";import{createClient as GT}from"@supabase/supabase-js";async function yd(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=GT(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:c}=await r.auth.refreshSession({refresh_token:e});return c||!i.session?(console.log(`[auth] refreshSession FAIL refresh_token=${o} ms=${Date.now()-s} err=${c?.message??"no-session"}`),{ok:!1,status:401,error:c?.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}})}u(yd,"refreshSupabaseSession");var oi=new YT,XT=lo.object({email:lo.string().email(),password:lo.string().min(1)}),QT=lo.object({refreshToken:lo.string().min(1)});oi.post("/auth/login",async e=>{let t=await e.req.json(),n=XT.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=Sw(r,o),i=Date.now();console.log(`[auth] signInWithPassword start email=${n.email} ua="${e.req.header("user-agent")??""}"`);let{data:c,error:a}=await s.auth.signInWithPassword({email:n.email,password:n.password});return a||!c.session?(console.log(`[auth] signInWithPassword FAIL email=${n.email} ms=${Date.now()-i} err=${a?.message??"no-session"}`),e.json({error:"Invalid email or password"},401)):(console.log(`[auth] signInWithPassword OK email=${n.email} ms=${Date.now()-i} userId=${c.user?.id??"?"}`),e.json({accessToken:c.session.access_token,refreshToken:c.session.refresh_token,expiresAt:c.session.expires_at?new Date(c.session.expires_at*1e3).toISOString():null,email:c.user?.email??n.email}))});var ZT=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=ZT.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=Sw(r,o),i=process.env.WEB_URL??"http://localhost:5174",{data:c,error:a}=await s.auth.signUp({email:n.email,password:n.password,options:{emailRedirectTo:`${i}/auth/confirm`}});if(a){let l=/already registered|already exists|user already/i.test(a.message);return e.json({error:a.message},l?409:400)}return c.user&&(c.user.identities?.length??0)===0&&!c.session?e.json({error:"An account with this email already exists. Run `rulemetric auth login`."},409):c.session?e.json({confirmationRequired:!1,accessToken:c.session.access_token,refreshToken:c.session.refresh_token,expiresAt:c.session.expires_at?new Date(c.session.expires_at*1e3).toISOString():null,email:c.user?.email??n.email}):e.json({confirmationRequired:!0,email:c.user?.email??n.email})});oi.post("/auth/refresh",async e=>{let t=await e.req.json().catch(()=>null),n=QT.safeParse(t);if(!n.success)return e.json({error:"refreshToken is required"},400);let r=await yd(n.data.refreshToken);return r.ok?e.json(r.session):e.json({error:r.error},r.status)});import{readFileSync as eR}from"node:fs";import{dirname as tR,resolve as Gp}from"node:path";import{fileURLToPath as nR}from"node:url";import{Hono as rR}from"hono";var oR="https://registry.npmjs.org/-/package/@rulemetric%2Fcli/dist-tags",sR=3600*1e3,iR=3e3,ic=null;function aR(){if(process.env.RULEMETRIC_BUNDLED_CLI_VERSION)return process.env.RULEMETRIC_BUNDLED_CLI_VERSION;let e=tR(nR(import.meta.url)),t=[Gp(e,"../../../cli/package.json"),Gp(e,"../../../../apps/cli/package.json"),Gp(process.cwd(),"apps/cli/package.json")];for(let n of t)try{let r=JSON.parse(eR(n,"utf-8"));if(r.version)return r.version}catch{}return"0.0.0"}u(aR,"readBundledCliVersion");async function cR(){try{let e=await fetch(oR,{headers:{accept:"application/json"},signal:AbortSignal.timeout(iR)});if(!e.ok)return null;let t=await e.json();return typeof t.latest=="string"&&t.latest?t.latest:null}catch{return null}}u(cR,"fetchLatestFromNpm");async function uR(){let e=Date.now();if(ic&&e-ic.at<sR)return ic.version;let n=await cR()??ic?.version??aR();return ic={version:n,at:e},n}u(uR,"getLatestCliVersion");var wd=new rR;wd.get("/cli/latest-version",async e=>e.json({latest:await uR()}));import{Hono as bR}from"hono";C();import{sql as dR}from"drizzle-orm";var lR=12e3,mR=3e4,Aw=4,pR=Number(process.env.PG_RECYCLE_DEADLINE_THRESHOLD)||3,fR="pipeline:api_db_pool_wedged",gR="pipeline:api_db_pool_recycled",si=0;async function Yp(){return Fp(lR)}u(Yp,"probeDb");function hR(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()}}u(hR,"flattenCauseChain");function _R(e){let{codes:t,message:n}=hR(e);return n.includes("max client")||n.includes("emaxconn")||n.includes("max_client_conn")||t.includes("XX000")&&n.includes("client")}u(_R,"isPoolSaturation");function yR(e){return _R(e)?"Supavisor tenant saturated (client cap reached)":ti(e)?"transient connect failure":"DB unreachable / probe timed out"}u(yR,"classifyProbeFailure");async function wR(e=Yp,t={}){let n=t.consumeDeadlines??Mp,r=t.recycle??Bp,o=t.onRecycle??IR,s=await e();if(s.ok){let c=!oc();si>0&&console.log(`[db-wedge] DB reachable again after ${si} failed probe(s)`),si=0,Kp(!0,"",Date.now()),c&&vR();let a=n();a>=pR&&(console.error(`[db-wedge] recycling the MAIN pool: ${a} 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(a));return}si+=1;let i=yR(s.err);console.error(`[db-wedge] dedicated DB probe failed (${si}/${Aw}) \u2014 ${i}`),si>=Aw&&oc()&&(Kp(!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."))}u(wR,"watchdogTick");async function Ew(e,t){try{await d.execute(dR`
|
|
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)}}
|
|
101
|
-
`)){let o=r.match(/->([\d.]+|\[[^\]]+\]):(?:6543|5432)\b/);o&&n.push({remote:o[1].replace(/^\[|\]$/g,"")})}return n}catch{return[]}}
|
|
100
|
+
`)}catch(n){console.error(`[db-wedge] failed to record ${e} alert:`,n instanceof Error?n.message:n)}}u(Ew,"dispatchSoftAlert");async function vR(){await Ew(fR,'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".')}u(vR,"reportRecovery");async function IR(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 Ew(gR,'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".')}u(IR,"reportPoolRecycle");function xw(){let e=setInterval(()=>{wR().catch(()=>{})},mR);return{stop:u(()=>clearInterval(e),"stop")}}u(xw,"startDbWedgeWatchdog");var ii=new bR;ii.get("/health",e=>e.json({status:"ok"}));ii.get("/ready",e=>{let t=_d();return e.json({ready:t.ready,reason:t.reason||void 0},t.ready?200:503)});ii.get("/health/deep",async e=>{let t=await Yp();return e.json({status:t.ok?"ok":"degraded",db:t.ok?"ok":"wedged",dbProbeMs:t.ms},t.ok?200:503)});C();import{Hono as SR}from"hono";import{sql as AR}from"drizzle-orm";import{execFileSync as ER}from"node:child_process";import*as Tw from"node:fs";var vd=new SR,xR=["/usr/sbin/lsof","/usr/bin/lsof","/bin/lsof"].find(e=>Tw.existsSync(e))??"lsof";function TR(e=process.pid){try{let t=ER(xR,["-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[]}}u(TR,"snapshotPoolerSockets");vd.get("/diag/pg-health",async e=>{let t=await d.execute(AR`
|
|
102
102
|
SELECT
|
|
103
103
|
application_name,
|
|
104
104
|
client_addr::text AS client_addr,
|
|
@@ -110,97 +110,11 @@ ${e}`}var eE=J(()=>{"use strict";d(QA,"resolveRuntimeWebConfig");d(eU,"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=
|
|
114
|
-
|
|
115
|
-
${i}`):n.push(i);break}}return n.join(`
|
|
116
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
126
|
-
${o.join(`
|
|
127
|
-
|
|
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}}},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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
`).trim()),i=m,a=[];continue}i?a.push(l):s.push(l)}i&&(o[i]=a.join(`
|
|
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 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
|
-
`).trim()),i=m,a=[];continue}i?a.push(l):s.push(l)}i&&(o[i]=a.join(`
|
|
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 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
|
-
`).trim()),c=v,l=[];continue}c?l.push(m):a.push(m)}c&&(i[c]=l.join(`
|
|
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 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
|
-
`).trim()),i=m,a=[];continue}i?a.push(l):s.push(l)}i&&(o[i]=a.join(`
|
|
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 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
|
-
`).trim()),i=m,a=[];continue}i?a.push(l):s.push(l)}i&&(o[i]=a.join(`
|
|
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 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
|
-
`).trim()),i=m,a=[];continue}i?a.push(l):s.push(l)}i&&(o[i]=a.join(`
|
|
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",$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(`
|
|
113
|
+
`),n=t.reduce((s,i)=>s+i.conns,0),r=TR(),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=$p();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})});C();import{Hono as qR}from"hono";import{z as at}from"zod";import{eq as Ce,and as cr,sql as ci,ilike as af,isNull as UR,or as cf,desc as Ow,inArray as Dw}from"drizzle-orm";import{z as Kt}from"zod";var Rw=["org","team","project","personal"],Xp=Kt.object({name:Kt.string().min(1),description:Kt.string().min(1),type:Kt.literal("instruction").default("instruction"),scope:Kt.enum(Rw),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 kw=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 ac(e){return e<=3?"light":e<=8?"standard":"heavy"}u(ac,"computePackTier");var Id={claude_md:"claude_md",memory:"memory",skill_loaded:"skill"};function Qp(e,t){let n=Id[e];return n?`${n}::${t}`:null}u(Qp,"deriveContextIdentity");function Zp(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}u(Zp,"normalizeRecommendations");import RR from"gray-matter";import{z as Nw}from"zod";var HF=Nw.object({type:Nw.enum(["instruction","prompt"])});function bd(e){let{data:t,content:n}=RR(e),r=Xp.parse(t),o=r.slots??null;return{frontmatter:r,content:n.trim(),slots:o}}u(bd,"parseInstruction");function ai(e){return e.replace(/[\r\n]+/g," ").trim()}u(ai,"sanitizeHeading");function ef(e,t,n){let r=e.split(`
|
|
200
114
|
`),o=t.split(`
|
|
201
115
|
`),s=n.split(`
|
|
202
|
-
`),i=
|
|
203
|
-
`),hasConflicts:
|
|
116
|
+
`),i=jw(r,o),c=jw(r,s),a=[],l=[],m=0;for(;m<r.length||i.has(m)||c.has(m);){let p=i.get(m),_=c.get(m);if(p&&_)NR(p.newLines,_.newLines)?l.push(...p.newLines):(a.push({localLines:_.newLines,upstreamLines:p.newLines,startLine:m}),l.push("<<<<<<< local"),l.push(..._.newLines),l.push("======="),l.push(...p.newLines),l.push(">>>>>>> upstream")),i.delete(m),c.delete(m),m=Math.max(p.endBase,_.endBase);else if(p)l.push(...p.newLines),i.delete(m),m=p.endBase;else if(_)l.push(..._.newLines),c.delete(m),m=_.endBase;else if(m<r.length)l.push(r[m]),m++;else break}return{merged:l.join(`
|
|
117
|
+
`),hasConflicts:a.length>0,conflicts:a}}u(ef,"threeWayMerge");function jw(e,t){let n=new Map,r=kR(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 c=o,a=[];for(;o<e.length&&(i>=r.length||e[o]!==r[i]);)o++;for(;s<t.length&&(i>=r.length||t[s]!==r[i]);)a.push(t[s]),s++;n.set(c,{newLines:a,endBase:o})}return n}u(jw,"diffLines");function kR(e,t){let n=e.length,r=t.length,o=Array.from({length:n+1},()=>Array(r+1).fill(0));for(let a=1;a<=n;a++)for(let l=1;l<=r;l++)o[a][l]=e[a-1]===t[l-1]?o[a-1][l-1]+1:Math.max(o[a-1][l],o[a][l-1]);let s=[],i=n,c=r;for(;i>0&&c>0;)e[i-1]===t[c-1]?(s.unshift(e[i-1]),i--,c--):o[i-1][c]>o[i][c-1]?i--:c--;return s}u(kR,"computeLCS");function NR(e,t){return e.length===t.length&&e.every((n,r)=>n===t[r])}u(NR,"arraysEqual");var Sd=class{static{u(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 a=await i.text();throw new Error(`Anthropic API error (${i.status}): ${a}`)}let c=await i.json();return{text:c.content.filter(a=>a.type==="text").map(a=>a.text).join(""),usage:{inputTokens:c.usage.input_tokens,outputTokens:c.usage.output_tokens}}}};var Ad=class{static{u(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 a=await i.text();throw new Error(`OpenAI API error (${i.status}): ${a}`)}let c=await i.json();return{text:c.choices[0]?.message.content??"",usage:{inputTokens:c.usage.prompt_tokens,outputTokens:c.usage.completion_tokens}}}};var jR={anthropic:u(e=>new Sd(e),"anthropic"),openai:u(e=>new Ad(e),"openai")};function cc(e,t){let n=jR[e];if(!n)throw new Error(`Unknown LLM provider: ${e}`);return n(t)}u(cc,"createLLMProvider");function uc(e,t){let n=t.map(r=>`- ID: ${r.id}
|
|
204
118
|
Name: ${r.name}
|
|
205
119
|
Description: ${r.description}
|
|
206
120
|
Tags: ${r.tags.join(", ")}
|
|
@@ -233,14 +147,14 @@ Return your response as JSON in this exact format:
|
|
|
233
147
|
]
|
|
234
148
|
}
|
|
235
149
|
|
|
236
|
-
Only include instructions with a relevance score >= 0.5. Order by score descending. Return valid JSON only, no markdown fences.`}
|
|
150
|
+
Only include instructions with a relevance score >= 0.5. Order by score descending. Return valid JSON only, no markdown fences.`}u(uc,"buildRecommendationPrompt");function tf(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[]}}u(tf,"parseRecommendationResponse");var Pw=32e3,PR={name:"x".repeat(64),description:"x".repeat(256),languages:["TypeScript","Python","Go"],topics:["x".repeat(32)],dependencies:["x".repeat(32)]};function nf(e,t={}){if(e.length===0)return[];let n=t.charBudget??Pw,r=uc(PR,[]).length,o=[],s=[],i=0;for(let c of e){let a=DR(c);s.length>0&&r+i+a>n&&(o.push(s),s=[],i=0),s.push(c),i+=a}return s.length>0&&o.push(s),o}u(nf,"batchCandidatesForPrompt");function DR(e){return`- ID: ${e.id}
|
|
237
151
|
Name: ${e.name}
|
|
238
152
|
Description: ${e.description}
|
|
239
153
|
Tags: ${e.tags.join(", ")}
|
|
240
|
-
Preview: ${e.contentPreview}`.length+2}
|
|
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:[
|
|
243
|
-
`).trim()})},"flush");for(let
|
|
154
|
+
Preview: ${e.contentPreview}`.length+2}u(DR,"renderedSize");async function rf(e,t,n){if(t.length===0)return{recommendations:[],error:null};let r;try{r=cc(n.llmProvider,n.llmApiKey)}catch(c){return{recommendations:[],error:c instanceof Error?c.message:String(c)}}let o=nf(t,{charBudget:n.charBudget}),s=[],i=[];for(let c of o)try{let a=await r.complete(uc(e,c));s.push(...tf(a.text))}catch(a){i.push(a instanceof Error?a.message:String(a))}return{recommendations:s,error:i.length>0?i.join("; "):null}}u(rf,"scoreInstructions");var OR=new Set(["127.0.0.1","localhost","::1","[::1]","0.0.0.0"]);function CR(e){if(!e)return null;try{return new URL(e).hostname}catch{return null}}u(CR,"databaseUrlHost");function of(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=CR(e.DATABASE_URL);return n&&OR.has(n)?{mode:"local",source:"inferred"}:{mode:"cloud",source:"default"}}u(of,"resolveDeployment");function Ed(e){if(!e||typeof e!="object")return null;let t=e.source;return t==="insights"||t==="evolution"?t:null}u(Ed,"readStampedSource");function xd(e,t){let n=e.source==="insights"||e.source==="evolution"?e.source:Ed(e.frontmatter);return n||(e.createdBy&&e.createdBy===t?"user":"catalog")}u(xd,"classifyProvenance");var dc=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 Td(e){return dc.has(e)}u(Td,"needsLlmEngine");C();function Gt(e){if(!Us())return;let t=Pm();d.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)})}u(Gt,"trackUsage");var MR={critical:25,high:15,medium:8,low:3},$R=[{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 sf(e,t,n){let r=[],o=[e,t??"",n??""].join(`
|
|
155
|
+
`);for(let i of $R){let c=o.match(i.pattern);c&&r.push({pattern:i.description,severity:i.severity,category:i.category,match:c[0].slice(0,100)})}let s=100;for(let i of r)s-=MR[i.severity]??5;return{score:Math.max(0,Math.min(100,s)),findings:r}}u(sf,"scanContent");var wn=new qR,HR=at.object({name:at.string().min(1).max(255),description:at.string().min(1),scope:at.enum(["org","team","project","personal"]),scopeRef:at.string().uuid().optional(),version:at.string().default("1.0.0"),content:at.string().min(1),tags:at.array(at.string()).optional(),compatibility:at.array(at.string()).optional()}),BR=at.object({name:at.string().min(1).max(255).optional(),description:at.string().min(1).optional(),version:at.string().optional(),content:at.string().min(1).optional(),tags:at.array(at.string()).optional(),compatibility:at.array(at.string()).optional(),changeSummary:at.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),c=parseInt(e.req.query("offset")??"0",10),a=[Ce(g.archived,!1),Ce(g.createdBy,t)];if(r&&a.push(Ce(g.scope,r)),s&&a.push(Ce(g.type,s)),n){let h=rt(n);a.push(cf(af(g.name,`%${h}%`),af(g.description,`%${h}%`),af(g.content,`%${h}%`)))}let l=await d.select().from(g).where(cr(...a)).orderBy(Ow(g.updatedAt)).limit(i).offset(c);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 m=l.map(h=>h.id),p=m.length>0?await d.select({instructionId:it.instructionId,projectName:M.name,projectId:M.id}).from(it).innerJoin(M,Ce(M.id,it.projectId)).where(ci`${it.instructionId} IN (${ci.join(m.map(h=>ci`${h}`),ci`, `)})`):[],_=new Map;for(let h of p){let f=_.get(h.instructionId)??[];f.push({projectId:h.projectId,projectName:h.projectName}),_.set(h.instructionId,f)}let I=l.map(h=>({...h,projects:_.get(h.id)??[]}));return Gt({userId:t,surface:"api",action:"list"}),e.json(I)});wn.get("/instructions/by-hash/:hash",async e=>{let t=e.get("userId"),n=e.req.param("hash"),[r]=await d.select({id:g.id,name:g.name,contextIdentity:g.contextIdentity,version:g.version,type:g.type}).from(g).where(cr(Ce(g.contentHash,n),Ce(g.createdBy,t),Ce(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=at.array(at.string()).max(200).parse(n.hashes??[]),o=at.array(at.string()).max(200).parse(n.identities??[]);if(r.length===0&&o.length===0)return e.json({instructions:{}});let s=[Ce(g.createdBy,t),Ce(g.archived,!1)],i=[];r.length>0&&i.push(Dw(g.contentHash,r)),o.length>0&&i.push(Dw(g.contextIdentity,o));let c=await d.select({id:g.id,name:g.name,contextIdentity:g.contextIdentity,version:g.version,type:g.type,contentHash:g.contentHash,source:ci`${g.frontmatter}->>'source'`}).from(g).where(cr(...s,i.length===1?i[0]:cf(...i))),a={};for(let l of c)l.contentHash&&(a[l.contentHash]=l),l.contextIdentity&&(a[l.contextIdentity]=l);return e.json({instructions:a})});wn.get("/instructions/:id/sessions",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await d.select({sessionId:se.sessionId,linkMethod:se.linkMethod,tool:y.tool,projectPath:y.projectPath,startedAt:y.startedAt,endedAt:y.endedAt,analysis:y.analysis}).from(se).innerJoin(y,Ce(y.id,se.sessionId)).where(cr(Ce(se.instructionId,n),Ce(y.userId,t))).orderBy(Ow(y.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 d.select().from(g).where(cr(Ce(g.id,t),Ce(g.archived,!1),cf(Ce(g.createdBy,n),Ce(g.scope,"public"))));return r?(Gt({instructionId:t,userId:n,surface:"api",action:"view"}),e.json(r)):e.json({error:"Instruction not found"},404)});var FR=/<\/?(?:system-reminder|system|available-deferred-tools|tool-result)>/i;function Cw(e){return FR.test(e)?"Content contains forbidden system tags":null}u(Cw,"validateNoForbiddenTags");wn.post("/instructions",async e=>{let t=e.get("userId"),n=await e.req.json(),r=HR.parse(n),o=Cw(r.content);if(o)return e.json({error:o},422);r.name=ai(r.name),r.description=ai(r.description);let s={},i=null;try{let m=bd(r.content);s=m.frontmatter,i=m.slots}catch{s={name:r.name,description:r.description,type:"instruction",scope:r.scope,version:r.version}}let c=r.scope==="personal"?t:r.scopeRef??null,a=sf(r.content,r.name,r.description),[l]=await d.insert(g).values({name:r.name,description:r.description,type:"instruction",scope:r.scope,scopeRef:c,version:r.version,content:r.content,frontmatter:s,slots:i,tags:r.tags??[],compatibility:r.compatibility??[],createdBy:t,scanScore:a.score,scanFindings:a.findings.length>0?a.findings:null}).returning();return await d.insert(Se).values({instructionId:l.id,versionNumber:1,content:r.content,frontmatter:s,changeSummary:"Initial version",createdBy:t}),Gt({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=BR.parse(r);if(o.content){let p=Cw(o.content);if(p)return e.json({error:p},422)}o.name&&(o.name=ai(o.name)),o.description&&(o.description=ai(o.description));let[s]=await d.select().from(g).where(cr(Ce(g.id,t),Ce(g.createdBy,n),Ce(g.archived,!1)));if(!s)return e.json({error:"Instruction not found"},404);let i=s.frontmatter,c=s.slots;if(o.content)try{let p=bd(o.content);i=p.frontmatter,c=p.slots}catch{}let a={};if(o.content||o.name||o.description){let p=sf(o.content??s.content,o.name??s.name,o.description??s.description);a.scanScore=p.score,a.scanFindings=p.findings.length>0?p.findings:null}let l,m=4;for(let p=0;p<=m;p++)try{l=await d.transaction(async _=>{await _.select({id:g.id}).from(g).where(Ce(g.id,t)).for("update");let[{maxVersion:I}]=await _.select({maxVersion:ci`COALESCE(MAX(${Se.versionNumber}), 0)`}).from(Se).where(Ce(Se.instructionId,t)),h=I+1,[f]=await _.update(g).set({...o.name&&{name:o.name},...o.description&&{description:o.description},...o.version&&{version:o.version},...o.content&&{content:o.content},...o.tags&&{tags:o.tags},...o.compatibility&&{compatibility:o.compatibility},frontmatter:i,slots:c,...a,updatedAt:new Date}).where(Ce(g.id,t)).returning();return await _.insert(Se).values({instructionId:t,versionNumber:h,content:o.content??s.content,frontmatter:i,changeSummary:o.changeSummary??null,createdBy:n}),f});break}catch(_){if(_.cause?.code==="23505"&&p<m)continue;throw _}return l?(Gt({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 d.select().from(g).where(cr(Ce(g.id,t),Ce(g.createdBy,n),Ce(g.archived,!1)));if(!r)return e.json({error:"Instruction not found"},404);let[o]=await d.update(g).set({archived:!0,archivedAt:new Date,archivedBy:n}).where(Ce(g.id,t)).returning(),s=await d.update(x).set({dismissedAt:new Date,isStale:!0}).where(cr(Ce(x.userId,n),Ce(x.instructionId,t),UR(x.dismissedAt))).returning({id:x.id});return Gt({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 d.select().from(g).where(cr(Ce(g.id,t),Ce(g.createdBy,n),Ce(g.archived,!0)));if(!r)return e.json({error:"Archived instruction not found"},404);let[o]=await d.update(g).set({archived:!1,archivedAt:null,archivedBy:null}).where(Ce(g.id,t)).returning();return Gt({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 d.select({id:g.id}).from(g).where(cr(Ce(g.id,t),Ce(g.createdBy,n)));if(!r)return e.json({error:"Instruction not found"},404);let o=await d.select().from(Se).where(Ce(Se.instructionId,t)).orderBy(Se.versionNumber);return e.json(o)});C();import{Hono as WR}from"hono";import{eq as mo,and as uf}from"drizzle-orm";var lc=new WR;lc.post("/instructions/:id/fork",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select().from(g).where(uf(mo(g.id,n),mo(g.archived,!1)));if(!r)return e.json({error:"Instruction not found"},404);if(r.createdBy===t)return e.json({error:"Cannot fork your own instruction"},400);if(r.scope==="org"&&r.scopeRef){let[s]=await d.select({id:g.id}).from(g).where(uf(mo(g.createdBy,t),mo(g.scope,"org"),mo(g.scopeRef,r.scopeRef))).limit(1);if(!s)return e.json({error:"Instruction not found"},404)}else if(r.scope!=="org")return e.json({error:"Instruction not found"},404);let[o]=await d.insert(g).values({name:`${r.name} (fork)`,description:r.description,type:r.type,scope:"personal",scopeRef:t,version:"1.0.0",content:r.content,frontmatter:r.frontmatter,slots:r.slots,tags:r.tags,compatibility:r.compatibility,createdBy:t,forkedFromId:r.id,upstreamVersion:r.version}).returning();return await d.insert(Se).values({instructionId:o.id,versionNumber:1,content:o.content,frontmatter:o.frontmatter,changeSummary:`Forked from ${r.name}`,createdBy:t}),await d.insert(Pt).values({instructionId:o.id,eventType:"fork",actorId:t,metadata:{sourceId:r.id,sourceName:r.name,sourceVersion:r.version}}),Gt({instructionId:o.id,userId:t,surface:"api",action:"fork"}),e.json(o,201)});lc.get("/instructions/:id/events",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await d.select({id:g.id}).from(g).where(uf(mo(g.id,t),mo(g.createdBy,n)));if(!r)return e.json({error:"Instruction not found"},404);let o=await d.select().from(Pt).where(mo(Pt.instructionId,t)).orderBy(Pt.createdAt);return e.json(o)});C();import{Hono as zR}from"hono";import{eq as Kn,and as Lw,sql as VR}from"drizzle-orm";var mc=new zR;mc.get("/instructions/:id/upstream",async e=>{let t=e.req.param("id"),[n]=await d.select().from(g).where(Lw(Kn(g.id,t),Kn(g.archived,!1)));if(!n)return e.json({error:"Instruction not found"},404);if(!n.forkedFromId)return e.json({error:"This instruction is not a fork"},400);let[r]=await d.select().from(g).where(Kn(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 d.select().from(g).where(Lw(Kn(g.id,n),Kn(g.createdBy,t),Kn(g.archived,!1)));if(!r)return e.json({error:"Instruction not found"},404);if(!r.forkedFromId)return e.json({error:"This instruction is not a fork"},400);let[o]=await d.select().from(g).where(Kn(g.id,r.forkedFromId));if(!o)return e.json({error:"Parent instruction no longer exists"},404);let[s]=await d.select().from(Se).where(Kn(Se.instructionId,o.id)).orderBy(Se.versionNumber).limit(1),i=s?.content??o.content,c=ef(i,o.content,r.content);if(c.hasConflicts)return e.json({hasConflicts:!0,merged:c.merged,conflicts:c.conflicts});let a,l=4;for(let m=0;m<=l;m++)try{a=await d.transaction(async p=>{await p.select({id:g.id}).from(g).where(Kn(g.id,n)).for("update");let[_]=await p.select({maxVersion:VR`COALESCE(MAX(${Se.versionNumber}), 0)`}).from(Se).where(Kn(Se.instructionId,n)),I=(_?.maxVersion??0)+1,[h]=await p.update(g).set({content:c.merged,upstreamVersion:o.version,updatedAt:new Date}).where(Kn(g.id,n)).returning();return await p.insert(Se).values({instructionId:n,versionNumber:I,content:c.merged,frontmatter:r.frontmatter,changeSummary:`Pulled upstream changes from ${o.name} (${o.version})`,createdBy:t}),await p.insert(Pt).values({instructionId:n,eventType:"pull_upstream",actorId:t,metadata:{parentId:o.id,parentVersion:o.version,previousUpstreamVersion:r.upstreamVersion}}),h});break}catch(p){if(p.cause?.code==="23505"&&m<l)continue;throw p}return a?(Gt({instructionId:n,userId:t,surface:"api",action:"pull_upstream"}),e.json({hasConflicts:!1,instruction:a})):e.json({error:"Pull-upstream failed after version conflict"},500)});C();import{Hono as JR}from"hono";import{z as po}from"zod";import{eq as Dt,and as is,sql as KR}from"drizzle-orm";var GR=po.object({scope:po.enum(["team","org"]),scopeRef:po.string().uuid()}),pc=new JR;pc.post("/instructions/:id/promote",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=GR.parse(await e.req.json()),[o]=await d.select().from(g).where(is(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[a]=await d.select().from(_e).where(is(Dt(_e.userId,t),Dt(_e.teamId,r.scopeRef)));if(!a)return e.json({error:"You are not a member of this team"},403)}else if(r.scope==="org"){let[a]=await d.select().from(Q).where(is(Dt(Q.userId,t),Dt(Q.orgId,r.scopeRef)));if(!a||a.role!=="admin"&&a.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,[c]=await d.update(g).set({scope:r.scope,scopeRef:r.scopeRef,updatedAt:new Date}).where(Dt(g.id,n)).returning();return await d.insert(Pt).values({instructionId:n,eventType:"promote",actorId:t,metadata:{fromScope:s,fromScopeRef:i,toScope:r.scope,toScopeRef:r.scopeRef}}),Gt({instructionId:n,userId:t,surface:"api",action:"promote"}),e.json(c)});var YR=po.object({targetScope:po.enum(["personal","team","org"]),targetScopeRef:po.string().uuid().optional(),name:po.string().optional(),seedEvalTarget:po.boolean().optional()});async function XR(e){let[t]=await d.select({id:k.id}).from(k).where(KR`${k.metadata}->>'instructionId' = ${e}`).limit(1);return t??null}u(XR,"findExistingEvalTarget");pc.post("/instructions/:id/promote-from-public",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=YR.parse(await e.req.json()),[o]=await d.select().from(g).where(is(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[p]=await d.select().from(_e).where(is(Dt(_e.userId,t),Dt(_e.teamId,r.targetScopeRef)));if(!p)return e.json({error:"You are not a member of this team"},403)}else if(r.targetScope==="org"){if(!r.targetScopeRef)return e.json({error:"targetScopeRef is required for org scope"},400);let[p]=await d.select().from(Q).where(is(Dt(Q.userId,t),Dt(Q.orgId,r.targetScopeRef)));if(!p||p.role!=="admin"&&p.role!=="owner")return e.json({error:"You must be an org admin to promote into an org"},403)}let s=r.targetScope==="personal"?t:r.targetScopeRef,i=r.name??o.name,c=r.seedEvalTarget??(r.targetScope==="org"||r.targetScope==="team"),[a]=await d.select().from(g).where(is(Dt(g.scope,r.targetScope),Dt(g.scopeRef,s),Dt(g.forkedFromId,n),Dt(g.archived,!1)));if(a){let p=null;return c&&(p=(await XR(a.id))?.id??null),e.json({instructionId:a.id,alreadyExisted:!0,evalTargetId:p})}let[l]=await d.insert(g).values({name:i,description:o.description,type:o.type,scope:r.targetScope,scopeRef:s,version:o.version,content:o.content,frontmatter:o.frontmatter,slots:o.slots,tags:o.tags,compatibility:o.compatibility,createdBy:t,forkedFromId:o.id,upstreamVersion:o.upstreamVersion??o.version,contentHash:o.contentHash,contextIdentity:o.contextIdentity}).returning();if(!l)return e.json({error:"Failed to clone instruction"},500);await d.insert(Se).values({instructionId:l.id,versionNumber:1,content:o.content,frontmatter:o.frontmatter,changeSummary:`Promoted from public skill ${o.name}`,createdBy:t}),await d.insert(Pt).values({instructionId:l.id,eventType:"promote_from_public",actorId:t,metadata:{sourceInstructionId:o.id,sourceName:o.name,targetScope:r.targetScope,targetScopeRef:s}}),Gt({instructionId:l.id,userId:t,surface:"api",action:"promote_from_public"});let m=null;if(c){let[p]=await d.insert(k).values({userId:t,name:`${i} \u2014 baseline eval`,type:"instruction",content:o.content,description:`Auto-seeded from public skill \`${o.name}\` on promote.`,metadata:{instructionId:l.id,publicSourceId:o.id,publicContentHash:o.contentHash??null,publicVersion:o.version??null}}).returning({id:k.id});m=p?.id??null}return e.json({instructionId:l.id,alreadyExisted:!1,evalTargetId:m})});C();import{Hono as QR}from"hono";import{z as Mw}from"zod";import{eq as vn,and as fc,or as $w,inArray as qw,sql as Rd,desc as ZR}from"drizzle-orm";var gc=new QR,ek=Mw.object({badge:Mw.enum(["recommended","required"]).nullable()});gc.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,c=parseInt(e.req.query("limit")??"50",10),a=parseInt(e.req.query("offset")??"0",10),l=Math.min(Math.max(c,1),200),m=Math.max(a,0),p=await d.select({orgId:Q.orgId}).from(Q).where(vn(Q.userId,t)),_=await d.select({teamId:_e.teamId}).from(_e).where(vn(_e.userId,t)),I=p.map(E=>E.orgId).filter(E=>E!==null),h=_.map(E=>E.teamId).filter(E=>E!==null),f=[vn(g.archived,!1)],w=[vn(g.scope,"public")];if(I.length>0&&w.push(fc(vn(g.scope,"org"),qw(g.scopeRef,I))),h.length>0&&w.push(fc(vn(g.scope,"team"),qw(g.scopeRef,h))),f.push($w(...w)),n&&f.push(vn(g.badge,n)),r&&f.push(vn(g.scope,r)),o){let E=rt(o);f.push($w(Rd`${g.name} ILIKE ${`%${E}%`}`,Rd`${g.description} ILIKE ${`%${E}%`}`))}let b=[ZR(Rd`COALESCE(${g.sourceUpdatedAt}, ${g.updatedAt})`)],v={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?tt:d).select(i>0?{...v,contentPreview:Rd`left(${g.content}, ${i})`}:v).from(g).where(fc(...f)).orderBy(...b).limit(l).offset(m);return Gt({userId:t,surface:"api",action:"search",metadata:o?{query:o}:void 0}),e.header("Cache-Control","private, max-age=30"),e.json(A)});gc.post("/instructions/:id/badge",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=ek.parse(await e.req.json()),[o]=await d.select().from(g).where(fc(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 d.select().from(Q).where(fc(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[c]=await d.update(g).set({badge:r.badge,updatedAt:new Date}).where(vn(g.id,n)).returning(),a=r.badge?"badge_set":"badge_removed";return await d.insert(Pt).values({instructionId:n,eventType:a,actorId:t,metadata:{badge:r.badge}}),e.json(c)});C();import{Hono as tk}from"hono";import{eq as fo,and as kd,or as nk,inArray as Uw}from"drizzle-orm";var Nd=new tk;Nd.post("/projects/:id/recommendations",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select().from(M).where(kd(fo(M.id,n),fo(M.createdBy,t)));if(!r)return e.json({error:"Project not found"},404);let o=await d.select({orgId:Q.orgId}).from(Q).where(fo(Q.userId,t)),s=await d.select({teamId:_e.teamId}).from(_e).where(fo(_e.userId,t)),i=o.map(f=>f.orgId).filter(f=>f!==null),c=s.map(f=>f.teamId).filter(f=>f!==null),a=[fo(g.scope,"public")];i.length>0&&a.push(kd(fo(g.scope,"org"),Uw(g.scopeRef,i))),c.length>0&&a.push(kd(fo(g.scope,"team"),Uw(g.scopeRef,c)));let l=await d.select().from(g).where(kd(fo(g.archived,!1),nk(...a))).limit(50);if(l.length===0)return e.json({recommendations:[],error:null});let m={name:r.name,description:r.description,languages:[],topics:[],dependencies:[]};if(r.githubRepo)try{let 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 v=await w.json();m.topics=v.topics??[]}if(b.ok){let v=await b.json();m.languages=Object.keys(v)}}catch{}let p=l.map(f=>({id:f.id,name:f.name,description:f.description??"",tags:f.tags??[],contentPreview:(f.content??"").slice(0,400)})),_=process.env.LLM_PROVIDER,I=process.env.LLM_API_KEY;if(!_||!I)return e.json({recommendations:[],error:"LLM not configured"});let h=await rf(m,p,{llmProvider:_,llmApiKey:I});return e.json(h)});import{Hono as Zk}from"hono";C();import{Hono as xk}from"hono";import{z as jf}from"zod";import{eq as mt,and as bc,desc as iv,sql as jn}from"drizzle-orm";C();import{and as fk,eq as kf,sql as gk}from"drizzle-orm";function df(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),c=i;for(let a=1;a<=s;a++)i*=(o-a+1)/a,c+=i;return{pValue:Math.min(1,2*c),nDiscordant:o}}u(df,"mcnemarExact");function jd(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)}}}u(jd,"assessSufficiency");var go=1.959963984540054;function Pd(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,c=n/s*Math.sqrt(r*(1-r)/t+o/(4*t*t));return{lower:Math.max(0,i-c),upper:Math.min(1,i+c)}}u(Pd,"wilsonInterval");function di(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}}u(di,"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])}u(ui,"sortedQuantile");function lf(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=di(t.seed??1),i=e.reduce((l,m)=>l+m,0)/n,c=new Array(r);for(let l=0;l<r;l++){let m=0;for(let p=0;p<n;p++)m+=e[s()*n|0];c[l]=m/n}c.sort((l,m)=>l-m);let a=(1-o)/2;return{estimate:i,lower:ui(c,a),upper:ui(c,1-a),iterations:r}}u(lf,"pairedBootstrapCI");function mf(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=di(n.seed??1),i=u(I=>I.reduce((h,f)=>h+f,0)/I.length,"mean"),c=i(e)-i(t),a=new Array(r),l=0,m=0;for(let I=0;I<r;I++){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;a[I]=w,w<=0&&l++,w>=0&&m++}a.sort((I,h)=>I-h);let p=(1-o)/2,_=Math.min(1,2*Math.min(l,m)/r);return{estimate:c,lower:ui(a,p),upper:ui(a,1-p),pValue:_,iterations:r}}u(mf,"twoSampleBootstrapCI");function pf(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=u(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=u(f=>f.reduce((w,b,v)=>w+o[v]*b,0)/s,"combine"),c=i(n.map(f=>r(f.withScores)-r(f.withoutScores))),a=t.iterations??1e4,l=t.ciLevel??.95,m=di(t.seed??1),p=new Array(a),_=0,I=0;for(let f=0;f<a;f++){let w=n.map(v=>{let S=0;for(let E=0;E<v.withScores.length;E++)S+=v.withScores[m()*v.withScores.length|0];let A=0;for(let E=0;E<v.withoutScores.length;E++)A+=v.withoutScores[m()*v.withoutScores.length|0];return S/v.withScores.length-A/v.withoutScores.length}),b=i(w);p[f]=b,b<=0&&_++,b>=0&&I++}p.sort((f,w)=>f-w);let h=(1-l)/2;return{estimate:c,lower:ui(p,h),upper:ui(p,1-h),pValue:Math.min(1,2*Math.min(_,I)/a),iterations:a}}u(pf,"stratifiedBootstrapCI");function ff(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((I,h)=>I+h,0)/n,o=e.reduce((I,h)=>I+h,0)/n,s=0,i=0,c=0;for(let I=0;I<n;I++){let h=t[I]-r,f=e[I]-o;s+=h*f,i+=h*h,c+=f*f}if(i===0)return{adjusted:[...e],theta:0,varianceReduction:0};let a=s/i,l=e.map((I,h)=>I-a*(t[h]-r)),m=0,p=l.reduce((I,h)=>I+h,0)/n;for(let I of l)m+=(I-p)*(I-p);let _=c===0?0:1-m/c;return{adjusted:l,theta:a,varianceReduction:_}}u(ff,"cupedAdjust");function gf(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}})}u(gf,"diagnoseAssertions");function hf(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,c=s+n,a=null;if(i>0&&c>0&&c/i>=r){let l=n>0?` (${n} with no baseline cohort)`:"";a=`${c}/${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:a}}u(hf,"summarizeDiscrimination");function Dd(e,t){let n=e.length,r=t.length;if(n===0||r===0)return 0;let o=[...e.map(l=>({t:l,exposed:!0})),...t.map(l=>({t:l,exposed:!1}))].sort((l,m)=>l.t-m.t),s=0,i=0;for(;i<o.length;){let l=i;for(;l+1<o.length&&o[l+1].t===o[i].t;)l++;let m=(i+1+l+1)/2;for(let p=i;p<=l;p++)o[p].exposed&&(s+=m);i=l+1}let a=(s-n*(n+1)/2)/(n*r);return Math.abs(a-.5)}u(Dd,"cohortTimeSeparation");var as=.35,Od=900*1e3;function _f(e,t,n=as,r=Od){if(e.length===0||t.length===0)return!1;let o=[...e,...t];return Math.max(...o)-Math.min(...o)<r?!1:Dd(e,t)>n}u(_f,"isTimeSeparated");var Hw=u(e=>e===0||e===1,"isBinary");function Bw(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}u(Bw,"meanPairDelta");function Cd(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,c=lf(s,{seed:t.seed,iterations:t.iterations}),a={lower:c.lower,upper:c.upper},l=e.every(f=>Hw(f.withScore)&&Hw(f.withoutScore)),m=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++;m=df(f,w).pValue}let{sufficient:p}=jd(o,o,r),_=a.lower>0||a.upper<0,h={mode:"controlled",baseline:n,delta:i,ci:a,pValue:m,significant:p&&_,sufficient:p,nWith:o,nWithout:o,costDelta:Bw(e,"withCost","withoutCost"),latencyDelta:Bw(e,"withLatency","withoutLatency"),confounded:!1};return p||(h.insufficientReason=`insufficient data: need >= ${r} paired tasks per cohort, have ${o}`),h}u(Cd,"buildControlledVerdict");var rk=2;function Ld(e,t,n={}){let r=n.minN??10,o=e.length,s=t.length,i=e.map(v=>v.score),c=t.map(v=>v.score),a=[...e,...t],l=a.length>0&&a.every(v=>typeof v.covariate=="number");if(l){let{adjusted:v}=ff(a.map(S=>S.score),a.map(S=>S.covariate));i=v.slice(0,o),c=v.slice(o)}let m=mf(i,c,{seed:n.seed,iterations:n.iterations}),p={lower:m.lower,upper:m.upper},_=m.estimate,I=o>0&&s>0?m.pValue:null,{sufficient:h}=jd(o,s,r),f=h&&(p.lower>0||p.upper<0),w=u(v=>{if(o===0||s===0||!e.every(E=>v(E)!=null)||!t.every(E=>v(E)!=null))return null;let S=e.reduce((E,R)=>E+v(R),0)/o,A=t.reduce((E,R)=>E+v(R),0)/s;return S-A},"meanDiff"),b={mode:"observational",baseline:n.baseline??"no-rule",delta:_,ci:p,pValue:I,significant:f,sufficient:h,nWith:o,nWithout:s,costDelta:w(v=>v.cost),latencyDelta:w(v=>v.latency),confounded:!0,cupedApplied:l};return h||(b.insufficientReason=`insufficient data: need >= ${r} sessions per cohort, have ${o} exposed / ${s} unexposed`),b}u(Ld,"buildObservationalVerdict");function In(e,t={}){let n=t.minN??10,r=t.minPerStratum??rk,o=t.maxTimeSeparation??as,s=t.minStratumSpanMs??Od,i=e.filter(R=>R.withScores.length>=r&&R.withoutScores.length>=r),c=i.filter(R=>R.withTimes!=null&&R.withoutTimes!=null&&_f(R.withTimes,R.withoutTimes,o,s)),a=new Set(c.map(R=>R.key)),l=i.filter(R=>!a.has(R.key)),m=e.filter(R=>R.withScores.length>0&&R.withoutScores.length>0&&(R.withScores.length<r||R.withoutScores.length<r)).length,p=l.reduce((R,P)=>R+P.withScores.length,0),_=l.reduce((R,P)=>R+P.withoutScores.length,0),I=pf(l,{seed:t.seed,iterations:t.iterations}),h={lower:I.lower,upper:I.upper},f=I.estimate,w=l.length>0&&p>=n&&_>=n,b=l.length>0?I.pValue:null,v=w&&(h.lower>0||h.upper<0),S=e.reduce((R,P)=>R+P.withScores.length+P.withoutScores.length,0),A=S>0?(p+_)/S:0,E={mode:"observational",baseline:t.baseline??"no-rule",delta:f,ci:h,pValue:b,significant:v,sufficient:w,nWith:p,nWithout:_,costDelta:null,latencyDelta:null,confounded:!0,strata:l.length,strataDroppedForTimeSeparation:c.length,coverage:A};if(!w){let R=m>0?` (${m} project(s) had both cohorts but fewer than ${r} sessions in one of them)`:"",P=c.length>0?` ${c.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?c.length>0?`insufficient data: no comparable cohort.${P}${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 ${p} exposed / ${_} unexposed${R}${P?`.${P}`:""}`}return E}u(In,"buildStratifiedVerdict");function yf(e,t,n={}){return{overall:In(e,n),segments:Md(t,n)}}u(yf,"buildSegmentedVerdict");function Md(e,t={}){return e.map(n=>({segment:n.segment,verdict:In(n.strata,t)}))}u(Md,"buildSegmentVerdicts");function cs(e){return e.sufficient?e.significant?e.delta<0?"harmful":"helpful":"neutral":"insufficient"}u(cs,"classifyEffect");var li={achieved:1,fully_achieved:1,mostly_achieved:.75,partially_achieved:.5,unclear_from_transcript:.25,not_achieved:0,abandoned:0},us=u(e=>{let t=e?li[e]:void 0;return t===void 0?null:t},"scoreOutcome");var mi=10,$d=u(e=>e.length===0?0:e.reduce((t,n)=>t+n,0)/e.length,"mean"),wf=u(e=>{if(e.length<2)return 0;let t=$d(e);return e.reduce((n,r)=>n+(r-t)**2,0)/(e.length-1)},"sampleVar"),Fw=u((e,t)=>{let n=t.reduce((l,m)=>l+m,0);if(n<=0||e.length===0)return{mean:0,varOfMean:0,nEff:0};let r=t.reduce((l,m)=>l+m*m,0),o=n*n/r,s=e.reduce((l,m,p)=>l+t[p]*m,0)/n,i=n-r/n,a=(i>0?e.reduce((l,m,p)=>l+t[p]*(m-s)**2,0)/i:0)*r/(n*n);return{mean:s,varOfMean:a,nEff:o}},"weightedStats");function vf(e,t,n={}){let r=n.minAnchors??mi,o=n.z??go,s=e.length,i=t.length,c=[...e,...t.map(A=>A.judge)],a=$d(c),l=t.map(A=>A.weight??1),m=t.map(A=>A.human-A.judge),p=Fw(m,l),_=p.mean,I=i>0?p.nEff:0,h=t.filter(A=>A.validated!==!1).length;if(n.pooledRectifier){let A=n.pooledRectifier,E=s>0?e:t.map(q=>q.judge);if(E.length===0)return{estimate:NaN,ci:{lower:NaN,upper:NaN},se:1/0,naive:a,rectifier:A.rectifier,nLabeled:i,nUnlabeled:s,nEffective:I,nValidated:h,sufficient:!1,insufficientReason:"no judge scores to correct with the pooled rectifier"};let R=$d(E)+A.rectifier,P=wf(E)/E.length+A.variance,N=Math.sqrt(P),D={estimate:R,ci:{lower:R-o*N,upper:R+o*N},se:N,naive:a,rectifier:A.rectifier,nLabeled:i,nUnlabeled:s,nEffective:I,nValidated:h,sufficient:A.sufficient};return A.sufficient||(D.insufficientReason="pooled rectifier not yet adequate"),D}let f,w;if(i===0)f=a,w=c.length>0?wf(c)/c.length:0;else if(s===0){let A=Fw(t.map(E=>E.human),l);f=A.mean,w=A.varOfMean}else f=$d(e)+_,w=wf(e)/s+p.varOfMean;let b=Math.sqrt(w),v=h>=r,S={estimate:f,ci:{lower:f-o*b,upper:f+o*b},se:b,naive:a,rectifier:_,nLabeled:i,nUnlabeled:s,nEffective:I,nValidated:h,sufficient:v};if(!v){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}u(vf,"ppiMeanEstimate");function hc(e,t,n={}){let r=vf(e.unlabeledJudge,e.labeled,{...n,pooledRectifier:n.withPooledRectifier}),o=vf(t.unlabeledJudge,t.labeled,{...n,pooledRectifier:n.withoutPooledRectifier}),s=n.z??go,i=r.estimate-o.estimate,c=Math.sqrt(r.se**2+o.se**2),a={lower:i-s*c,upper:i+s*c},l=r.sufficient&&o.sufficient,m=l&&(a.lower>0||a.upper<0),p={delta:i,ci:a,se:c,with:r,without:o,sufficient:l,significant:m};return l||(p.insufficientReason=r.insufficientReason??o.insufficientReason),p}u(hc,"ppiDifference");var qd=50,Vw=.2,Jw=.8416212335729143,ok=u(e=>e.length===0?0:e.reduce((t,n)=>t+n,0)/e.length,"mean"),_c=u(e=>{if(e.length<2)return 0;let t=ok(e);return e.reduce((n,r)=>n+(r-t)**2,0)/(e.length-1)},"sampleVar");function Ww(e,t){let n=e.labeled.length,r=e.unlabeledJudge.length;return n>0&&r>0?{fixed:_c(e.unlabeledJudge)/r,scaling:_c(e.labeled.map(o=>o.human-o.judge)),n}:n>0?{fixed:0,scaling:_c(e.labeled.map(o=>o.human)),n}:{fixed:r>0?_c(e.unlabeledJudge)/r:0,scaling:t.labeled.length>0?_c(t.labeled.map(o=>o.human-o.judge)):null,n:0}}u(Ww,"varianceComponents");var zw=1e6;function sk(e,t){if(e.some(s=>s.scaling===null))return null;let n=u(s=>e.reduce((i,c)=>i+c.fixed+(c.scaling===0?0:c.scaling/(c.n+s)),0),"se2");if(n(zw)>t)return null;let r=0,o=zw;for(;r<o;){let s=Math.floor((r+o)/2);n(s)<=t?o=s:r=s+1}return r}u(sk,"solvePerCohortIncrement");function If(e,t,n={}){let r=n.pilotTarget??qd,o=n.targetEffect??Vw,s=n.minAnchors??mi,i=n.z??go,c=n.zPower??Jw,a=i+c,l=u(N=>(N*100).toFixed(0),"pp"),m=e.labeled.length,p=t.labeled.length,_=n.humanLabeledRuns??m+p,I=e.unlabeledJudge.length+m+t.unlabeledJudge.length+p,h={nAnchors:_,nAnchorsWith:m,nAnchorsWithout:p,pilotTarget:r,pilotMet:_>=r,targetEffect:o};if(I===0)return{...h,seDelta:null,mde:null,powered:!1,adequate:!1,reasons:["no graded runs to calibrate against"],additionalAnchorsNeeded:r};let f=hc(e,t,{minAnchors:s,z:i,withPooledRectifier:n.pool?.withPooledRectifier,withoutPooledRectifier:n.pool?.withoutPooledRectifier}).se,w=a*f,b=w<=o;if(n.pool){let{totalAnchors:N,targets:D}=n.pool,q=N>=r,H=D>=3,B=q&&H&&b,ee=[];return H||ee.push(`pool spans ${D}/3 same-judge targets \u2014 between-target variance is assumed, not measured`),q||ee.push(`pool floor not met: ${N}/${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:q?null:r-N,pooled:!0,poolAnchors:N,poolTargets:D}}let v=m>=s,S=p>=s,A=h.pilotMet&&v&&S&&b,E,R=0;if(!b){let N=(o/a)**2,D=sk([Ww(e,t),Ww(t,e)],N);R=D===null?null:2*D}if(!h.pilotMet)E=r-_;else if(R===null)E=null;else{let N=Math.max(0,s-m)+Math.max(0,s-p);E=Math.max(N,R)}let P=[];if(h.pilotMet||P.push(`pilot target not met: ${_}/${r} human-labeled runs`),v||P.push(`with-target cohort has ${m}/${s} labeled runs (minimum for a corrected estimate)`),S||P.push(`without-target cohort has ${p}/${s} labeled runs (minimum for a corrected estimate)`),!b){let N=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`:"";P.push(`MDE \xB1${l(w)}pp exceeds the \xB1${l(o)}pp target effect${N}`)}return{...h,seDelta:f,mde:w,powered:b,adequate:A,reasons:P,additionalAnchorsNeeded:E}}u(If,"anchorPowerCheck");function bf(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}}u(bf,"localOnly");function Ud(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)?bf(e,{rectifierUsed:NaN,variance:1/0,reason:"no anchors on this target and none to pool from"}):bf(e,{reason:"only one target with anchors \u2014 nothing to pool"});let i=o.map(B=>B.variance).filter(B=>B>0),c=i.length?i.reduce((B,ee)=>B+ee,0)/i.length:0,a=Math.max(c*.001,1e-12),l=u(B=>Math.max(B,a),"flooredVar"),m=o.map(B=>1/l(B.variance)),p=m.reduce((B,ee)=>B+ee,0),_=m.reduce((B,ee)=>B+ee*ee,0),I=o.reduce((B,ee,he)=>B+m[he]*ee.rectifier,0)/p,h=o.reduce((B,ee,he)=>B+m[he]*(ee.rectifier-I)**2,0),f=s-1,w=p-_/p,b=w>0?Math.max(0,(h-f)/w):0,v=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,he)=>B+S[he]*ee.rectifier,0)/A,R=1/A,P=s<3;if(v>r)return e.n>=1&&Number.isFinite(e.variance)?bf(e,{pooled:E,pooledVariance:R,tau2:b,i2:v,k:s,assumedExchangeability:P,reason:`heterogeneity too high (I\xB2=${(v*100).toFixed(0)}%) \u2014 targets disagree; not pooling`}):{rectifierUsed:E,variance:R,lambda:1,pooled:E,pooledVariance:R,tau2:b,i2:v,k:s,pooledApplied:!1,assumedExchangeability:P,reason:`no anchors on this target; pooled estimate is high-heterogeneity (I\xB2=${(v*100).toFixed(0)}%) \u2014 treat as unknown`};let N=e.n<1||!Number.isFinite(e.variance),D=N?1:l(e.variance)/(l(e.variance)+b),q=N?E:D*E+(1-D)*e.rectifier,H=N?R+b:(1-D)*e.variance+D*D*R;return{rectifierUsed:q,variance:H,lambda:D,pooled:E,pooledVariance:R,tau2:b,i2:v,k:s,pooledApplied:!0,assumedExchangeability:P}}u(Ud,"shrinkRectifier");var pi=3,wc=7,Sf="(preamble)",dk=/^\s*(`{3,}|~{3,})/,lk=/^(#{1,6})\s+(.*)$/;function yc(e){let t=e.split(`
|
|
156
|
+
`),n=[],r=[],o={heading:"",level:0,path:[Sf],body:[]},s=null,i=u(()=>{n.push({heading:o.heading,level:o.level,path:o.path,body:o.body.join(`
|
|
157
|
+
`).trim()})},"flush");for(let c of t){let a=dk.exec(c);if(a){let m=a[1];s==null?s={marker:m}:m[0]===s.marker[0]&&m.length>=s.marker.length&&(s=null),o.body.push(c);continue}if(s!=null){o.body.push(c);continue}let l=lk.exec(c);if(l){i();let m=l[1].length,p=l[2].trim();r.length=Math.max(0,m-1),r[m-1]=p,o={heading:p,level:m,path:Array.from({length:m},(_,I)=>r[I]??`(unnamed level ${I+1})`),body:[]};continue}o.body.push(c)}return i(),n.filter((c,a)=>!(a===0&&c.level===0&&c.body===""))}u(yc,"splitMarkdownSections");function Hd(e){let t=new Map,n=new Map;for(let r of e){let o=r.level===0?Sf:r.path.join(" > "),s=(t.get(o)??0)+1;t.set(o,s),n.set(s===1?o:`${o} #${s}`,r)}return n}u(Hd,"sectionKeys");function Af(e,t){let n=Hd(yc(e)),r=Hd(yc(t)),o=[],s=[],i=[];for(let[c,a]of r){let l=n.get(c);l?l.body!==a.body&&o.push(c):s.push(c)}for(let c of n.keys())r.has(c)||i.push(c);return{changed:o.sort(),added:s.sort(),removed:i.sort()}}u(Af,"diffSections");function Ef(e){return[...new Set([...e.changed,...e.added,...e.removed])].sort()}u(Ef,"touchedSections");var Kw=u(e=>e.trim().toLowerCase(),"normalize");function Gw(e,t,n){if(n.length===0)return[];let r=new Set(n.map(Kw)),o=Af(e,t),s=new Set(Ef(o)),i=new Map([...Hd(yc(e)),...Hd(yc(t))]),c=[];for(let a of s){let l=i.get(a);(l?l.path:a.split(" > ")).some(p=>r.has(Kw(p)))&&c.push(a)}return c.sort()}u(Gw,"protectedViolations");function xf(e){let{verdict:t,canaryGreen:n,adequate:r,adequacyReasons:o=[],promotionsInWindow:s,maxPromotionsPerWindow:i=pi,immutableSections:c=[],beforeContent:a,afterContent:l,measurementMatchesPredecessor:m}=e,p=Ef(Af(a,l)),_=cs(t),I=[];if(a===l&&I.push("proposal is identical to the current version \u2014 nothing to promote"),t.mode!=="controlled"&&I.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"&&I.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&&I.push("verdict is flagged confounded"),m===!1&&I.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||I.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("; ")}`:"";I.push(`verdict is not adequately powered${b}`)}s>=i&&I.push(`change budget exhausted: ${s}/${i} promotions already made in the current window`);let h=Gw(a,l,c);if(h.length>0&&I.push(`proposal edits protected section(s): ${h.join(", ")}`),_==="insufficient"&&I.push(t.insufficientReason??"verdict did not clear min-n, so no effect was measured"),I.length>0)return{decision:"refuse",refusals:I,rationale:`refused: ${I.length} gate(s) blocked promotion`,effect:_,touched:p};let f=u(b=>`${b>=0?"+":""}${(b*100).toFixed(1)}pp`,"pp"),w=`[${f(t.ci.lower)}, ${f(t.ci.upper)}]`;return _==="helpful"?{decision:"promote",refusals:[],rationale:`promote: ${f(t.delta)} CI ${w} over the prior version, n=${t.nWith} paired cases`,effect:_,touched:p}:_==="harmful"?{decision:"revert",refusals:[],rationale:`revert: proposal measured WORSE than its predecessor, ${f(t.delta)} CI ${w}`,effect:_,touched:p}:{decision:"revert",refusals:[],rationale:`revert: no detectable improvement, ${f(t.delta)} CI ${w} spans zero`,effect:_,touched:p}}u(xf,"evaluatePromotion");async function Ic(e,t){let[n]=await d.select({id:U.id,instructionId:U.instructionId,projectPath:U.projectPath,status:U.status,contentHash:U.contentHash}).from(U).where(fk(kf(U.id,e),kf(U.userId,t)));if(!n)return null;let r=!1;if(n.contentHash){let{instructionContentHash:h}=await Promise.resolve().then(()=>(ds(),ev)),[f]=await d.select({content:g.content,name:g.name}).from(g).where(kf(g.id,n.instructionId));r=h(f?.content,f?.name)!==n.contentHash}let o=await d.execute(gk`
|
|
244
158
|
SELECT a.arm,
|
|
245
159
|
s.analysis->>'outcome' AS outcome,
|
|
246
160
|
EXTRACT(EPOCH FROM s.started_at) * 1000 AS started_ms
|
|
@@ -249,7 +163,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
249
163
|
ON s.external_session_id = a.external_session_id
|
|
250
164
|
AND s.user_id = a.user_id
|
|
251
165
|
WHERE a.experiment_id = ${e}
|
|
252
|
-
`),s={treated:0,control:0},i=[],
|
|
166
|
+
`),s={treated:0,control:0},i=[],c=[],a=[],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&&a.push(b)):(c.push(w),b!==null&&l.push(b))}let m={treated:i.length,control:c.length},p={experimentId:n.id,instructionId:n.instructionId,projectPath:n.projectPath,status:n.status,assigned:s,measured:m,contentChanged:r};if(r)return{...p,delta:null,ci:null,significant:!1,resolution:"inconclusive",timeSeparation:null,randomisationSuspect:!1,reason:"the instruction was edited mid-experiment \u2014 the arms measured different texts, so no verdict transfers. It re-enters testing as new content."};if(m.treated<10||m.control<10)return{...p,delta:null,ci:null,significant:!1,resolution:"insufficient",timeSeparation:null,randomisationSuspect:!1,reason:`needs ${10} measured sessions per arm; have ${m.treated} treated / ${m.control} control`};let _=Dd(a,l);if(_>as)return{...p,delta:null,ci:null,significant:!1,resolution:"inconclusive",timeSeparation:_,randomisationSuspect:!0,reason:`arms are time-separated (${_.toFixed(2)} > ${as}) \u2014 randomisation looks broken, not merely confounded`};let I=Ld(i.map(h=>({score:h})),c.map(h=>({score:h})),{minN:10});return{...p,delta:I.delta,ci:I.ci,significant:I.significant,resolution:I.significant?"resolved":"inconclusive",timeSeparation:_,randomisationSuspect:!1,reason:I.significant?null:"the interval still spans zero \u2014 more sessions, or the effect is small"}}u(Ic,"buildArmVerdict");ds();var hk=new Set(["cmd","cmds","command","commands","host","hostname","url","uri","todo","tbd","xxx","placeholder","insert","fixme"]),_k=/(?<![A-Za-z0-9])<([A-Za-z][^<>\n]{0,78}[A-Za-z0-9._/-])>/g,yk=/\{\{\s*[^{}\n]{1,80}\s*\}\}/g,wk=/_{3,}/g,vk=/[\s:|/]|\.\.\./,Ik=/^[a-z][a-z0-9+.-]*:\/\//i;function gi(e,t=10){let n=[],r=new Set,o=u((s,i)=>{r.has(s)||n.length>=t||(r.add(s),n.push({token:s,rule:i}))},"push");for(let s of e.matchAll(_k)){let i=s[1];Ik.test(i)||(vk.test(i)||hk.has(i.toLowerCase()))&&o(s[0],"bracketed")}for(let s of e.matchAll(yk))o(s[0],"mustache");for(let s of e.matchAll(wk))o(s[0],"blank");return n}u(gi,"findPlaceholders");C();import{and as Nf,eq as ur,gte as bk,sql as ls}from"drizzle-orm";var cn={MIN_SCORE:.8,KIND:"add",MAX_PER_RUN:3,MAX_PER_WINDOW:15,WINDOW_DAYS:7},Nn={minScore:{min:0,max:1},maxPerRun:{min:0,max:25},maxPerWindow:{min:0,max:100},windowDays:{min:1,max:90}};function Sk(e,t){let{min:n,max:r}=Nn[e];return Number.isFinite(t)?Math.min(r,Math.max(n,t)):cn[Ak[e]]}u(Sk,"clampLimit");var Ak={minScore:"MIN_SCORE",maxPerRun:"MAX_PER_RUN",maxPerWindow:"MAX_PER_WINDOW",windowDays:"WINDOW_DAYS"};async function zd(e,t){if(t){let[r]=await d.select({override:ls`${M.metadata}->>'autoAcceptSuggestions'`}).from(M).where(ur(M.id,t));if(r?.override!=null)return r.override==="true"?{allowed:!0,source:"project"}:{allowed:!1,source:"project",reason:"auto-accept is turned off for this project"}}let[n]=await d.select({enabled:T.autoAcceptSuggestions}).from(T).where(ur(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"}}u(zd,"resolveAutoAcceptConsent");async function hi(e,t){let n={minScore:cn.MIN_SCORE,maxPerRun:cn.MAX_PER_RUN,maxPerWindow:cn.MAX_PER_WINDOW,windowDays:cn.WINDOW_DAYS,kind:cn.KIND,source:{minScore:"default",maxPerRun:"default",maxPerWindow:"default",windowDays:"default"}},[r]=await d.select({minScore:T.autoAcceptMinScore,maxPerRun:T.autoAcceptMaxPerRun,maxPerWindow:T.autoAcceptMaxPerWindow,windowDays:T.autoAcceptWindowDays}).from(T).where(ur(T.id,e));if(tv(n,r??null,"account"),t){let[o]=await d.select({minScore:ls`(${M.metadata}->'autoAcceptLimits'->>'minScore')::real`,maxPerRun:ls`(${M.metadata}->'autoAcceptLimits'->>'maxPerRun')::int`,maxPerWindow:ls`(${M.metadata}->'autoAcceptLimits'->>'maxPerWindow')::int`,windowDays:ls`(${M.metadata}->'autoAcceptLimits'->>'windowDays')::int`}).from(M).where(ur(M.id,t));tv(n,o??null,"project")}return n}u(hi,"resolveAutoAcceptLimits");function tv(e,t,n){if(t)for(let r of Object.keys(Nn)){let o=t[r];o!=null&&(e[r]=Sk(r,Number(o)),e.source[r]=n)}}u(tv,"applyOverrides");async function nv(e,t,n,r=cn.WINDOW_DAYS){let o=new Date(Date.now()-r*864e5),s=Nf(ur(Je.userId,e),ur(Je.eventType,"accepted"),ur(Je.actor,"auto"),bk(Je.createdAt,o));if(!n){let[c]=await d.select({n:ls`count(*)::int`}).from(Je).where(Nf(s,ur(Je.projectPath,t)));return c?.n??0}let[i]=await d.select({n:ls`count(*)::int`}).from(Je).innerJoin(x,ur(x.id,Je.suggestionId)).where(Nf(s,ur(x.projectId,n)));return i?.n??0}u(nv,"autoAcceptsInWindow");C();import{desc as Ek,eq as rv}from"drizzle-orm";async function Ur(e){if(!e)return null;try{let[t]=await d.select({projectId:de.projectId}).from(de).where(rv(de.path,e)).orderBy(Ek(de.lastSeen)).limit(1);if(t)return t.projectId;let[n]=await d.select({id:M.id}).from(M).where(rv(M.gitRemoteUrl,e)).limit(1);return n?.id??null}catch{return null}}u(Ur,"resolveProjectIdForPath");var _i=new xk,ov=3,sv=1;_i.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 Ur(n),o=await hi(t,r),s=await d.select({id:x.id,instructionId:x.instructionId,projectId:x.projectId,score:x.score,kind:x.kind,name:g.name,content:g.content,archived:g.archived}).from(x).innerJoin(g,mt(g.id,x.instructionId)).where(bc(mt(x.userId,t),mt(x.projectPath,n),mt(x.kind,cn.KIND),jn`(${x.score} >= ${o.minScore} 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
167
|
SELECT 1 FROM instruction_suggestion_events ev
|
|
254
168
|
WHERE ev.suggestion_id = ${x.id}
|
|
255
169
|
AND ev.event_type = 'redundant'
|
|
@@ -259,12 +173,12 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
259
173
|
WHERE e.instruction_id = ${x.instructionId}
|
|
260
174
|
AND e.project_path = ${x.projectPath}
|
|
261
175
|
AND e.status = 'running'
|
|
262
|
-
)`)).orderBy(
|
|
176
|
+
)`)).orderBy(iv(x.score)),i=r??s[0]?.projectId??null,c=await zd(t,i);if(!c.allowed)return e.json({consent:c,eligible:[],refused:s.map(_=>({id:_.id,name:_.name,reason:c.reason})),budget:null});let a=await nv(t,n,i,o.windowDays),l=Math.max(0,o.maxPerWindow-a),m=[],p=[];for(let _ of s){let I=gi(_.content??"");if(I.length>0){p.push({id:_.id,name:_.name,reason:`unfilled placeholder(s): ${I.map(h=>h.token).join(", ")}`});continue}if(m.length>=Math.min(o.maxPerRun,l)){p.push({id:_.id,name:_.name,reason:l<=m.length?`budget: ${a}/${o.maxPerWindow} auto-accepted for this project in the last ${o.windowDays}d (${o.source.maxPerWindow} setting)`:`over the per-run cap of ${o.maxPerRun}`});continue}m.push({id:_.id,instructionId:_.instructionId,name:_.name,score:_.score})}return e.json({consent:c,eligible:m,refused:p,budget:{used:a,max:o.maxPerWindow,windowDays:o.windowDays,perRun:o.maxPerRun,source:o.source}})});_i.post("/instruction-experiments/settle",async e=>{let t=e.get("userId"),n=await e.req.json().catch(()=>({})),r=typeof n?.projectPath=="string"?n.projectPath:null,o=await d.select({id:U.id,source:U.source,status:U.status,instructionId:U.instructionId,projectPath:U.projectPath}).from(U).where(bc(mt(U.userId,t),mt(U.status,"running"),...r?[mt(U.projectPath,r)]:[])),s=[],i=0;for(let c of o)try{let a=await Ic(c.id,t);if(!a){i+=1;continue}let l=await fi({experimentId:c.id,userId:t,verdict:a,source:c.source,status:c.status});l?s.push({experimentId:c.id,outcome:l}):i+=1}catch{i+=1}return e.json({examined:o.length,settled:s,stillRunning:i})});_i.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 d.select({running:jn`count(*)::int`}).from(U).where(bc(mt(U.userId,t),mt(U.projectPath,n),mt(U.status,"running"))),o=Math.max(0,ov-r),s=await d.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(bc(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 (
|
|
263
177
|
SELECT 1 FROM instruction_experiments e
|
|
264
178
|
WHERE e.instruction_id = ${x.instructionId}
|
|
265
179
|
AND e.project_path = ${x.projectPath}
|
|
266
180
|
AND e.status = 'running'
|
|
267
|
-
)`)).orderBy(
|
|
181
|
+
)`)).orderBy(iv(x.score)).limit(50),i=[],c=[];for(let a of s){if(i.length>=Math.min(o,sv))break;let l=gi(a.content??"");if(l.length>0){c.push({name:a.name,reason:`unfilled placeholder(s): ${l.map(m=>m.token).join(", ")}`});continue}i.push({id:a.id,instructionId:a.instructionId,name:a.name,score:a.score})}return e.json({candidates:i,refused:c,running:r,slots:o,limits:{maxConcurrent:ov,maxPerRun:sv}})});var Tk=jf.object({projectPath:jf.string().min(1),instructionId:jf.string().uuid()});_i.post("/instruction-suggestions/undo",async e=>{let t=e.get("userId"),n=Tk.safeParse(await e.req.json().catch(()=>({})));if(!n.success)return e.json({error:n.error.flatten()},400);let{projectPath:r,instructionId:o}=n.data,[s]=await d.select({id:x.id,name:g.name,acceptedAt:x.acceptedAt}).from(x).innerJoin(g,mt(g.id,x.instructionId)).where(bc(mt(x.userId,t),mt(x.projectPath,r),mt(x.instructionId,o))).limit(1);return s?(await d.update(x).set({acceptedAt:null,dismissedAt:new Date}).where(mt(x.id,s.id)),await d.insert(Je).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)});C();import{Hono as Lk}from"hono";import{eq as Bt,and as ms,asc as dv,desc as lv,inArray as Gd,sql as dr}from"drizzle-orm";C();import{createHash as Rk}from"node:crypto";import{and as av,eq as Vd,inArray as kk,sql as jV}from"drizzle-orm";function Nk(e,t,n){return Rk("sha256").update(`${e}:${t}`).digest().readUIntBE(0,6)/0xffffffffffff<n?"treated":"control"}u(Nk,"assignArm");async function cv(e){let{userId:t,projectPath:n,externalSessionId:r}=e;if(!r)return[];let o=await d.select({id:U.id,instructionId:U.instructionId,treatedShare:U.treatedShare,salt:U.salt}).from(U).where(av(Vd(U.userId,t),Vd(U.projectPath,n),Vd(U.status,"running")));if(o.length===0)return[];await d.insert(Or).values(o.map(c=>({experimentId:c.id,userId:t,externalSessionId:r,arm:Nk(c.salt,r,Number(c.treatedShare))}))).onConflictDoNothing();let s=await d.select({experimentId:Or.experimentId,arm:Or.arm}).from(Or).where(av(Vd(Or.externalSessionId,r),kk(Or.experimentId,o.map(c=>c.id)))),i=new Map(s.map(c=>[c.experimentId,c.arm]));return o.flatMap(c=>{let a=i.get(c.id);return a?[{experimentId:c.id,instructionId:c.instructionId,arm:a}]:[]})}u(cv,"resolveArmsForSession");function uv(e){return new Set(e.filter(t=>t.arm==="control").map(t=>t.instructionId))}u(uv,"withheldInstructionIds");ds();C();import{sql as Pf,eq as jk}from"drizzle-orm";var yi=.7;async function Jd(e){try{let[t]=await d.select({t:T.suggestionConfidenceThreshold}).from(T).where(jk(T.id,e)).limit(1);return typeof t?.t=="number"?t.t:yi}catch{return yi}}u(Jd,"readConfidenceThreshold");var Pk=5,Dk=90,Ok="surface_budget",Df="declined_by_silence",Ck=Pf`(
|
|
268
182
|
SELECT count(*) FROM (
|
|
269
183
|
SELECT date_trunc('hour', min(e.created_at)) AS h
|
|
270
184
|
FROM instruction_suggestion_events e
|
|
@@ -279,7 +193,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
279
193
|
AND e.event_type IN ('surfaced', 'surfaced_with_content')
|
|
280
194
|
AND e.session_id IS NULL
|
|
281
195
|
) hours
|
|
282
|
-
)`,
|
|
196
|
+
)`,Sc=Pf`(${x.declinedAt} IS NULL OR ${x.declinedAt} < now() - make_interval(days => ${Dk}))`;async function Kd(e,t){await d.execute(Pf`
|
|
283
197
|
WITH over_budget AS (
|
|
284
198
|
SELECT instruction_suggestions.id
|
|
285
199
|
FROM instruction_suggestions
|
|
@@ -295,12 +209,12 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
295
209
|
AND instruction_suggestions.accepted_at IS NULL
|
|
296
210
|
AND (instruction_suggestions.dismissed_at IS NULL
|
|
297
211
|
OR instruction_suggestions.dismissed_at < now() - interval '30 days')
|
|
298
|
-
AND ${
|
|
212
|
+
AND ${Ck} >= ${Pk}
|
|
299
213
|
),
|
|
300
214
|
stamped AS (
|
|
301
215
|
UPDATE instruction_suggestions t
|
|
302
216
|
SET declined_at = now(),
|
|
303
|
-
declined_reason = ${
|
|
217
|
+
declined_reason = ${Ok}
|
|
304
218
|
FROM over_budget o
|
|
305
219
|
-- Re-checked here, not only in the CTE: under READ COMMITTED two
|
|
306
220
|
-- concurrent session starts both see declined_at IS NULL, and only
|
|
@@ -310,8 +224,8 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
310
224
|
RETURNING t.id, t.user_id, t.project_path
|
|
311
225
|
)
|
|
312
226
|
INSERT INTO instruction_suggestion_events (suggestion_id, user_id, event_type, project_path)
|
|
313
|
-
SELECT id, user_id, ${
|
|
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`
|
|
227
|
+
SELECT id, user_id, ${Df}, project_path FROM stamped
|
|
228
|
+
`)}u(Kd,"sweepDeclinedBySilence");var Cf=new Lk,mv=2e3,Mk=4,$k={"session-start":{add:3,remove:2,trim:1}},qk=["add","remove","trim"];function Of(e){return e.length<=mv?e:e.slice(0,mv)+"... [truncated]"}u(Of,"truncateContent");Cf.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",c=e.req.query("groupByKind")==="true",a=e.req.query("renderFor"),l=a?$k[a]:void 0;if(a&&!l)return e.json({error:`unknown renderFor: ${a}`},400);let m=c||l!==void 0;if(!n&&!r)return e.json({error:"projectId or projectPath is required"},400);let p=n?Bt(x.projectId,n):Bt(x.projectPath,r);try{await Kd(t,dr`${p}`)}catch{}let _=await d.select({id:x.id,instructionId:x.instructionId,score:x.score,reason:x.reason,generatedAt:x.generatedAt,isStale:x.isStale,kind:x.kind,name:g.name,description:g.description,tags:g.tags,instructionScope:g.scope,estimatedTokens:dr`(length(${g.content}) / 4)::int`,_rawContent:g.content}).from(x).innerJoin(g,Bt(x.instructionId,g.id)).where(ms(Bt(x.userId,t),p,Bt(g.archived,!1),dr`${x.acceptedAt} IS NULL`,dr`(${x.dismissedAt} IS NULL OR ${x.dismissedAt} < now() - interval '30 days')`,Sc)).orderBy(dv(x.isStale),lv(x.score)).limit(s),I=[];if(m){let te=new Set(_.map(j=>j.id));I=(await d.select({id:x.id,instructionId:x.instructionId,score:x.score,reason:x.reason,generatedAt:x.generatedAt,isStale:x.isStale,kind:x.kind,name:g.name,description:g.description,tags:g.tags,instructionScope:g.scope,estimatedTokens:dr`(length(${g.content}) / 4)::int`,_rawContent:g.content}).from(x).innerJoin(g,Bt(x.instructionId,g.id)).where(ms(Bt(x.userId,t),p,dr`${x.kind} <> 'add'`,Bt(g.archived,!1),dr`${x.acceptedAt} IS NULL`,dr`(${x.dismissedAt} IS NULL OR ${x.dismissedAt} < now() - interval '30 days')`,Sc)).orderBy(dv(x.isStale),lv(x.score)).limit(Mk)).filter(j=>!te.has(j.id))}let h=i?await Jd(t):yi,f=[..._,...I].map(te=>{let{_rawContent:Te,...j}=te,me=i&&te.kind==="add"&&te.score>=h&&typeof Te=="string"?Of(Te):null;return{...j,content:me}}),w=l?await cv({userId:t,projectPath:r??"",externalSessionId:e.req.query("sessionId")||void 0}):[],b=uv(w),v=l?await Rf(t,r??""):[],S=new Set(v.filter(te=>te.decision==="never").map(te=>te.instructionId)),A=v.filter(te=>te.decision==="always"),E=new Set(v.map(te=>te.instructionId)),R=w.filter(te=>te.arm==="treated"),P=new Set(w.map(te=>te.instructionId)),N=b.size===0&&E.size===0&&P.size===0?f:f.filter(te=>!b.has(te.instructionId)&&!E.has(te.instructionId)&&!P.has(te.instructionId)),D=N,q;if(l){let te=new Map;for(let j of N){let me=j.kind??"add",L=l[me];if(L===void 0||L<=0)continue;let ue=te.get(me)??[];ue.length>=L||(ue.push(j),te.set(me,ue))}let Te=te.get("add")??[];if(R.length>0){let j=new Map(R.map(L=>[L.instructionId,L.experimentId])),me=await d.select({id:g.id,name:g.name,description:g.description,tags:g.tags,instructionScope:g.scope,content:g.content}).from(g).where(ms(Gd(g.id,R.map(L=>L.instructionId)),Bt(g.archived,!1)));for(let L of me.reverse())Te.unshift({id:`experiment:${j.get(L.id)}`,instructionId:L.id,score:1,reason:"under measurement on this project",generatedAt:new Date,isStale:!1,kind:"add",name:L.name,description:L.description,tags:L.tags,instructionScope:L.instructionScope,estimatedTokens:Math.ceil((L.content?.length??0)/4),content:i?Of(L.content??""):null});te.set("add",Te)}if(A.length>0){let j=await d.select({id:g.id,name:g.name,description:g.description,tags:g.tags,instructionScope:g.scope,content:g.content}).from(g).where(ms(Gd(g.id,A.map(me=>me.instructionId)),Bt(g.archived,!1)));for(let me of j.reverse())Te.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?Of(me.content??""):null});te.set("add",Te)}D=qk.flatMap(j=>te.get(j)??[]),q={addCount:Te.length,costCount:(te.get("remove")??[]).length+(te.get("trim")??[]).length,highConfidenceCount:Te.filter(j=>j.content!==null).length,omitted:N.length-(D.length-Te.filter(j=>j.id.startsWith("graduated:")||j.id.startsWith("experiment:")).length),...b.size>0?{withheld:b.size}:{}}}let H=await d.select({eventType:Je.eventType,count:dr`count(*)::int`}).from(Je).innerJoin(x,Bt(Je.suggestionId,x.id)).where(ms(Bt(Je.userId,t),p)).groupBy(Je.eventType),B={};for(let te of H)B[te.eventType]=te.count;let ee,he;if(!l&&r&&D.length>0){let te=[...new Set(D.map(L=>L.instructionId))],Te=await d.select({id:U.id,instructionId:U.instructionId,source:U.source}).from(U).where(ms(Bt(U.userId,t),Bt(U.projectPath,r),Bt(U.status,"running"),Gd(U.instructionId,te)));Te.length>0&&(ee=Object.fromEntries(Te.map(L=>[L.instructionId,{id:L.id,source:L.source}])));let j=await d.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,Bt(Y.instructionId,g.id)).where(ms(Bt(Y.userId,t),Gd(Y.instructionId,te),dr`${Y.projectPath} <> ${r}`)),me={};for(let L of j){let ue=qr(L.liveContent,L.liveName);ue===null||ue!==L.contentHash||(me[L.instructionId]??=[]).push({projectPath:L.projectPath,decision:L.decision,delta:L.delta,ciLower:L.ciLower,ciUpper:L.ciUpper,nTreated:L.nTreated,nControl:L.nControl,segment:L.segment,decidedAt:L.decidedAt})}Object.keys(me).length>0&&(he=me)}return e.json({suggestions:D,stats:B,...q?{render:q}:{},...ee?{experiments:ee}:{},...he?{crossProject:he}:{}})});C();import{Hono as Uk}from"hono";import{z as pv}from"zod";import{eq as ps,and as fv,desc as Hk,sql as un}from"drizzle-orm";var Bk=pv.object({threshold:pv.number().min(0).max(1)}),fs=new Uk;fs.get("/instruction-suggestions/pending-count",async e=>{let t=e.get("userId"),n=await d.select({projectPath:x.projectPath,count:un`count(*)::int`}).from(x).where(fv(ps(x.userId,t),un`${x.acceptedAt} IS NULL`,un`(${x.dismissedAt} IS NULL OR ${x.dismissedAt} < now() - interval '30 days')`,Sc)).groupBy(x.projectPath).orderBy(Hk(un`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 d.select({total:un`count(*)::int`,accepted:un`count(*) filter (where ${x.acceptedAt} is not null)::int`,dismissed:un`count(*) filter (where ${x.acceptedAt} is null and ${x.dismissedAt} is not null)::int`,declinedBySilence:un`count(*) filter (where ${x.acceptedAt} is null and ${x.dismissedAt} is null and ${x.declinedAt} is not null)::int`,pending:un`count(*) filter (where ${x.acceptedAt} is null and ${x.dismissedAt} is null and ${x.declinedAt} is null)::int`,stale:un`count(*) filter (where ${x.isStale})::int`,promoted:un`count(*) filter (where ${x.promotedToInstructionId} is not null)::int`}).from(x).where(ps(x.userId,t)),r=await d.select({eventType:Je.eventType,count:un`count(*)::int`}).from(Je).where(ps(Je.userId,t)).groupBy(Je.eventType),o={surfaced:0,surfaced_with_content:0,accepted:0,dismissed:0,promoted:0,proxy_injected:0,[Df]:0};for(let a of r)o[a.eventType]=a.count;let[s]=await d.select({distinctUsersWithSuggestions:un`count(distinct ${x.userId})::int`}).from(x),i=o.surfaced+o.surfaced_with_content,c=o.accepted+o.dismissed;return e.json({suggestions:n,events:o,funnel:{surfaced:i,acted:c,adoptionRate:i>0?c/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 Jd(t),default:yi,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=Bk.safeParse(await e.req.json().catch(()=>null));return n.success?(await d.update(T).set({suggestionConfidenceThreshold:n.data.threshold}).where(ps(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 d.select({id:x.id,instructionId:x.instructionId,projectPath:x.projectPath,score:x.score,reason:x.reason,generatedAt:x.generatedAt,isStale:x.isStale,kind:x.kind,estimatedTokens:un`(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,ps(x.instructionId,g.id)).where(fv(ps(x.id,n),ps(x.userId,t)));return r?e.json(r):e.json({error:"Suggestion not found"},404)});C();import{Hono as Fk}from"hono";import{z as Yt}from"zod";import{eq as lr,and as gv,or as Wk,desc as zk,sql as wi}from"drizzle-orm";var Ac=new Fk,Vk=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(id).optional()})).max(50)});async function Jk(e){try{let[t]=await d.select({projectId:de.projectId}).from(de).where(lr(de.path,e)).orderBy(zk(de.lastSeen)).limit(1);return t?.projectId??null}catch{return null}}u(Jk,"resolveProjectId");Ac.post("/instruction-suggestions/batch-upsert",async e=>{let t=e.get("userId"),n=Vk.parse(await e.req.json());if(n.suggestions.length===0)return e.json({inserted:0});let r=n.projectId??await Jk(n.projectPath),o=n.suggestions.map(s=>({userId:t,instructionId:s.instructionId,projectPath:n.projectPath,projectId:r,score:s.score,reason:s.reason,kind:s.kind??"add",generatedAt:new Date,isStale:!1}));return await d.insert(x).values(o).onConflictDoUpdate({target:[x.userId,x.projectPath,x.instructionId,x.kind],set:{score:wi`excluded.score`,reason:wi`excluded.reason`,generatedAt:wi`excluded.generated_at`,isStale:wi`false`,dismissedAt:wi`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})});Ac.post("/instruction-suggestions/mark-stale",async e=>{let t=e.get("userId");return await d.update(x).set({isStale:!0}).where(lr(x.userId,t)),e.json({ok:!0})});var Kk=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")});Ac.post("/instruction-suggestions/:id/events",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=Kk.parse(await e.req.json()),[o]=await d.select().from(x).where(gv(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[c]=await d.select({id:g.id}).from(g).where(gv(lr(g.id,r.instructionId),Wk(lr(g.createdBy,t),lr(g.scope,"public")))).limit(1);if(!c)return e.json({error:"instructionId not found",code:"INVALID_INSTRUCTION"},400);i=c.id}if(await d.insert(Je).values({suggestionId:n,userId:t,eventType:r.eventType,tool:r.tool??null,sessionId:r.sessionId??null,projectPath:r.projectPath,actor:r.actor}),s)await d.update(x).set({acceptedAt:new Date,promotedToInstructionId:i}).where(lr(x.id,n));else if(r.eventType==="dismissed")await d.update(x).set({dismissedAt:new Date}).where(lr(x.id,n));else if(r.eventType==="surfaced"||r.eventType==="surfaced_with_content")try{await Kd(t,wi`${lr(x.id,n)}`)}catch{}return e.json({ok:!0})});C();import{Hono as Xk}from"hono";import{z as Ec}from"zod";import{eq as vi,and as _v,desc as yv,sql as Xd}from"drizzle-orm";ds();C();ds();import{randomUUID as Gk}from"node:crypto";import{and as Yd,eq as bn,sql as Lf}from"drizzle-orm";var Yk=.8;async function hv(e){let{userId:t,instructionId:n,projectPath:r,source:o}=e,s=e.treatedShare??.5,[i]=await d.select({id:g.id,name:g.name,content:g.content,archived:g.archived,scope:g.scope,createdBy:g.createdBy}).from(g).where(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 c=qr(i.content,i.name);if(!c)return{ok:!1,code:"no_body",reason:"instruction body could not be extracted from its content"};let[a]=await d.select({id:Y.id}).from(Y).where(Yd(bn(Y.instructionId,n),bn(Y.contentHash,c),bn(Y.projectPath,r)));if(a)return{ok:!1,code:"already_decided",reason:"this exact content already has a verdict on this project \u2014 edit the instruction to re-enter testing"};if(o==="groom"){let[m]=await d.select({id:x.id}).from(x).where(Yd(bn(x.userId,t),bn(x.instructionId,n),bn(x.projectPath,r),Lf`${x.acceptedAt} IS NULL`,Lf`${x.dismissedAt} IS NULL`,Lf`${x.score} >= ${Yk}`));if(!m)return{ok:!1,code:"not_injectable",reason:"not delivered by injection on this project (accepted into a file, or no renderable proposal) \u2014 withholding would measure nothing"}}let[l]=await d.select({id:U.id}).from(U).where(Yd(bn(U.instructionId,n),bn(U.projectPath,r),bn(U.status,"running")));if(l)return{ok:!0,experimentId:l.id,existing:!0};try{let[m]=await d.insert(U).values({userId:t,instructionId:n,projectPath:r,status:"running",treatedShare:String(s),salt:Gk(),contentHash:c,source:o}).returning({id:U.id});return{ok:!0,experimentId:m.id,existing:!1}}catch(m){let[p]=await d.select({id:U.id}).from(U).where(Yd(bn(U.instructionId,n),bn(U.projectPath,r),bn(U.status,"running")));if(p)return{ok:!0,experimentId:p.id,existing:!0};throw m}}u(hv,"nominateExperiment");var Ii=new Xk;Ii.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=_v(vi(U.userId,t),n?vi(U.projectPath,n):Xd`true`),s=await d.select({id:U.id,instructionId:U.instructionId,instructionName:g.name,projectPath:U.projectPath,status:U.status,source:U.source,instructionSource:Xd`${g.frontmatter}->>'source'`,stoppedReason:U.stoppedReason,createdAt:U.createdAt}).from(U).innerJoin(g,vi(U.instructionId,g.id)).where(o).orderBy(yv(U.createdAt)).limit(r),[{total:i}]=await d.select({total:Xd`count(*)::int`}).from(U).where(o),c=await Promise.all(s.map(async l=>{let m=await Ic(l.id,t),p=l.status,_=l.stoppedReason;if(m&&l.status==="running")try{let I=await fi({experimentId:l.id,userId:t,verdict:m,source:l.source,status:l.status});I&&(p="stopped",_=I)}catch{}return{...l,status:p,stoppedReason:_,verdict:m}})),a=await Wd(c.map(l=>l.id));return e.json({experiments:c.map(l=>({...l,graduation:a.get(l.id)??null})),total:i})});var Qk=Ec.object({instructionId:Ec.string().uuid(),projectPath:Ec.string().min(1),source:Ec.enum(["manual","groom","trial","borrow"]).default("manual"),treatedShare:Ec.number().gt(0).lt(1).optional()});Ii.post("/instruction-experiments",async e=>{let t=e.get("userId"),n=Qk.safeParse(await e.req.json().catch(()=>({})));if(!n.success)return e.json({error:n.error.flatten()},400);let r=await hv({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)});Ii.get("/instruction-experiments/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await Ic(n,t);if(!r)return e.json({error:"not found"},404);try{let[s]=await d.select({source:U.source,status:U.status}).from(U).where(vi(U.id,n));s&&await fi({experimentId:n,userId:t,verdict:r,source:s.source,status:s.status})}catch{}let o=await Wd([n]);return e.json({verdict:r,graduation:o.get(n)??null})});Ii.get("/instruction-verdicts",async e=>{let t=e.get("userId"),n=e.req.query("instructionId"),r=await d.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(_v(vi(Y.userId,t),n?vi(Y.instructionId,n):Xd`true`)).orderBy(yv(Y.decidedAt)).limit(50);return e.json({verdicts:r,total:r.length})});var ho=new Zk;ho.route("/",_i);ho.route("/",Cf);ho.route("/",fs);ho.route("/",Ac);ho.route("/",Ii);import{Hono as mP}from"hono";import{Hono as Bj}from"hono";C();import{Hono as cN}from"hono";import{z as Pn}from"zod";import{eq as Ct,and as Ei,desc as xv,sql as mr,or as Tv,gte as uN,ne as dN}from"drizzle-orm";function wv(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 c=t.replace(/\.git$/i,"").replace(/\/+$/,""),a=c.indexOf("/"),l=c.slice(0,a).toLowerCase(),m=c.slice(a+1);return m?`${l}/${m}`:null}let n=t,r=/^([\w.-]+@)?([\w.-]+):([^/].*)$/.exec(t);if(r&&!t.includes("://")){let[,,c,a]=r;n=`ssh://${c}/${a}`}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}`}u(wv,"canonicalizeRemote");var eN=new Set(["","unknown","<synthetic>"]);function gs(e){if(typeof e!="string")return null;let t=e.trim();return eN.has(t)?null:t}u(gs,"resolveModelId");var tN=["claudeCodeVersion","codexCliVersion"];function bi(e){if(typeof e!="object"||e===null)return null;let t=e;for(let n of tN){let r=gs(t[n]);if(r!==null)return r}return null}u(bi,"resolveHarnessVersion");C();import{eq as Mf,and as oN,sql as Ev}from"drizzle-orm";C();import{randomUUID as Si}from"node:crypto";import{eq as Ot,and as xc,gt as nN,sql as vv}from"drizzle-orm";var rN=6e4;async function Ai(e){try{let t=new Date(Date.now()-rN),[n]=await d.select({exists:vv`1`}).from(pe).where(xc(Ot(pe.userId,e),Ot(pe.workerType,"cli-worker"),nN(pe.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}}u(Ai,"hasLiveWorker");async function Tt(e){let t=!await Ai(e.userId),n=Si(),r={...e.payload,mirrorId:n};switch(e.taskName){case"process_eval":case"process_conversation":{await d.insert(Re).values({...e.mirror,id:n,status:"pending",taskKind:e.taskName,payload:r});break}case"process_insights":{await d.insert(W).values({...e.mirror,id:n,status:"pending",taskKind:e.taskName,payload:r});break}case"process_launch":{await d.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 d.insert(zu).values({...e.mirror,id:n,status:"pending",taskKind:e.taskName,payload:r});break}}return{id:n,noLiveWorker:t}}u(Tt,"enqueueJob");async function Qd(e){let t=`goal-${e.sessionId}-${e.milestone}`,[n]=await d.select({id:ke.id}).from(ke).where(xc(Ot(ke.userId,e.userId),Ot(ke.taskKind,"process_session_goal"),Ot(ke.dedupeKey,t),Ot(ke.status,"pending"))).limit(1);if(n)return;let r=Si();await d.insert(ke).values({id:r,userId:e.userId,taskKind:"process_session_goal",payload:{sessionId:e.sessionId,milestone:e.milestone,mirrorId:r},dedupeKey:t})}u(Qd,"enqueueSessionGoalJob");async function Iv(e){let t=`distill-${e.sessionId}`,[n]=await d.select({id:ke.id}).from(ke).where(xc(Ot(ke.userId,e.userId),Ot(ke.taskKind,"distill_memories"),Ot(ke.dedupeKey,t),Ot(ke.status,"pending"))).limit(1);if(n)return;let r=Si();await d.insert(ke).values({id:r,userId:e.userId,taskKind:"distill_memories",payload:{sessionId:e.sessionId,mirrorId:r},dedupeKey:t})}u(Iv,"enqueueDistillMemoriesJob");async function bv(e){let t=!await Ai(e.userId),n=`run-cleanup:${e.runId}`,[r]=await d.select({id:ke.id}).from(ke).where(xc(Ot(ke.userId,e.userId),Ot(ke.taskKind,"process_run_cleanup"),Ot(ke.dedupeKey,n),Ot(ke.status,"pending"))).limit(1);if(r)return{jobId:r.id,noLiveWorker:t};let o=Si();return await d.insert(ke).values({id:o,userId:e.userId,taskKind:"process_run_cleanup",payload:{runId:e.runId,mirrorId:o},dedupeKey:n}),{jobId:o,noLiveWorker:t}}u(bv,"enqueueRunCleanupJob");async function Sv(e){let t=`judge-review:${e.evalTargetId}`,n=Si();await d.execute(vv`
|
|
315
229
|
INSERT INTO agent_jobs (id, user_id, task_kind, payload, dedupe_key)
|
|
316
230
|
SELECT ${n}, ${e.userId}, 'process_judge_review',
|
|
317
231
|
${JSON.stringify({evalTargetId:e.evalTargetId,mirrorId:n})}::jsonb,
|
|
@@ -323,7 +237,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
323
237
|
AND dedupe_key = ${t}
|
|
324
238
|
AND status = 'pending'
|
|
325
239
|
)
|
|
326
|
-
`)}
|
|
240
|
+
`)}u(Sv,"enqueueJudgeReviewJob");async function Av(e){let t=!await Ai(e.userId),n=`memory-ab:${e.experimentId}`,[r]=await d.select({id:ke.id}).from(ke).where(xc(Ot(ke.userId,e.userId),Ot(ke.taskKind,"memory_ab"),Ot(ke.dedupeKey,n),Ot(ke.status,"pending"))).limit(1);if(r)return{jobId:r.id,noLiveWorker:t};let o=Si();return await d.insert(ke).values({id:o,userId:e.userId,taskKind:"memory_ab",payload:{experimentId:e.experimentId,mirrorId:o},dedupeKey:n}),{jobId:o,noLiveWorker:t}}u(Av,"enqueueMemoryAbJob");async function _o(e,t){let n=u((r,o)=>{let s={"org_attribution.source":r};if(o)for(let[i,c]of Object.entries(o))s[`org_attribution.${i}`]=c;Om(s)},"tag");if(t)try{let[r]=await d.select({orgId:Q.orgId}).from(Q).where(oN(Mf(Q.userId,e),Mf(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 d.select({activeOrgId:T.activeOrgId}).from(T).where(Mf(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}}u(_o,"resolveCallerOrgId");async function sN(e,t,n){if(n)try{await d.execute(Ev`
|
|
327
241
|
insert into treatment_exposures
|
|
328
242
|
(session_id, user_id, treatment_type, treatment_id, treatment_version, method, exposed_at)
|
|
329
243
|
select ${e}::uuid, ${t}::uuid, 'suggestion', s.instruction_id, 1, 'injected', min(ise.created_at)
|
|
@@ -333,7 +247,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
333
247
|
and ise.event_type in ('surfaced', 'surfaced_with_content', 'proxy_injected')
|
|
334
248
|
group by s.instruction_id
|
|
335
249
|
on conflict on constraint treatment_exposures_unique do nothing
|
|
336
|
-
`)}catch(r){console.warn("[reimport] suggestion exposure reconcile failed:",r instanceof Error?r.message:r)}}
|
|
250
|
+
`)}catch(r){console.warn("[reimport] suggestion exposure reconcile failed:",r instanceof Error?r.message:r)}}u(sN,"reconcileSuggestionExposures");async function iN(e,t,n){if(n)try{await d.execute(Ev`
|
|
337
251
|
with drained as (
|
|
338
252
|
insert into treatment_exposures
|
|
339
253
|
(session_id, user_id, treatment_type, treatment_id, treatment_version, method, exposed_at)
|
|
@@ -348,13 +262,13 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
348
262
|
delete from pending_treatment_exposures
|
|
349
263
|
where external_session_id = ${n}
|
|
350
264
|
and user_id = ${t}::uuid
|
|
351
|
-
`)}catch(r){console.warn("[reimport] memory exposure reconcile failed:",r instanceof Error?r.message:r)}}
|
|
265
|
+
`)}catch(r){console.warn("[reimport] memory exposure reconcile failed:",r instanceof Error?r.message:r)}}u(iN,"reconcileMemoryExposures");var aN=6;async function Zd(e,t,n,r,o){await sN(e,t,n),await iN(e,t,n),r&&o>=aN&&await Iv({sessionId:e,userId:t}).catch(s=>{console.warn("[reimport] distill enqueue failed:",s instanceof Error?s.message:s)})}u(Zd,"finalizeSessionIntelligence");var $f=new cN;async function qf(e,t){if(!t)return null;try{let[n]=await d.select({id:X.id}).from(X).where(Ei(Ct(X.id,t),Ct(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}}u(qf,"resolveCallerRunId");var lN=Pn.object({tool:Pn.string(),externalSessionId:Pn.string().optional(),clientName:Pn.string().optional(),mcpServerVersion:Pn.string().optional(),projectPath:Pn.string().optional(),gitBranch:Pn.string().optional(),startedAt:Pn.string().optional(),metadata:Pn.record(Pn.unknown()).optional(),orgId:Pn.string().uuid().nullable().optional(),runId:Pn.string().uuid().nullable().optional()});$f.post("/sessions",async e=>{let t=e.get("userId"),n=await e.req.json(),r=lN.parse(n);if(r.projectPath){let f=await d.select({projectPath:y.projectPath}).from(y).where(Ei(Ct(y.userId,t),mr`${y.projectPath} IS NOT NULL`)).groupBy(y.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 qf(t,r.runId??null);if(r.externalSessionId){let[f]=await d.select().from(y).where(Ei(Ct(y.userId,t),Ct(y.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 d.update(y).set(w).where(Ct(y.id,f.id)),e.json(f,200)}}if(r.tool&&r.projectPath){let f=new Date(Date.now()-3e4),w=[Ct(y.userId,t),Ct(y.tool,r.tool),Ct(y.projectPath,r.projectPath),uN(y.startedAt,f)],[b]=await d.select().from(y).where(Ei(...w)).orderBy(xv(y.startedAt)).limit(1);if(b){let v={};return!b.externalSessionId&&r.externalSessionId&&(v.externalSessionId=r.externalSessionId,b.externalSessionId=r.externalSessionId),!b.orgId&&o&&(v.orgId=o,b.orgId=o),!b.runId&&s&&(v.runId=s,b.runId=s),Object.keys(v).length>0&&await d.update(y).set(v).where(Ct(y.id,b.id)),e.json(b,200)}}let i=[],c=null,a=wv(r.metadata?.gitRemote??null),l=typeof r.metadata?.gitRootCommit=="string"&&r.metadata.gitRootCommit?r.metadata.gitRootCommit:null,m=typeof r.metadata?.launchProjectPath=="string"&&r.metadata.launchProjectPath?r.metadata.launchProjectPath:null;try{if(m){let[f]=await d.select({projectId:de.projectId}).from(de).where(Ct(de.path,m)).orderBy(xv(de.lastSeen)).limit(1);f&&(i=[{id:f.projectId}],c="launchPath")}if(i.length===0&&a){let[f]=await d.select({id:M.id}).from(M).where(Tv(Ct(M.gitRemoteUrl,a),mr`${a} = ANY(${M.gitRemoteAliases})`)).limit(1);f&&(i=[f],c="remote")}if(i.length===0&&l){let[f]=await d.select({id:M.id,gitRemoteUrl:M.gitRemoteUrl,gitRemoteAliases:M.gitRemoteAliases}).from(M).where(Ct(M.gitRootCommit,l)).limit(1);f&&(i=[{id:f.id}],c="rootCommit",a&&f.gitRemoteUrl&&f.gitRemoteUrl!==a&&!(f.gitRemoteAliases??[]).includes(a)&&await d.update(M).set({gitRemoteUrl:a,gitRemoteAliases:mr`array_append(${M.gitRemoteAliases}, ${f.gitRemoteUrl})`}).where(Ct(M.id,f.id)))}if(i.length===0&&a){let f=a.split("/").filter(Boolean).pop()??a,[w]=await d.insert(M).values({name:f,gitRemoteUrl:a,gitRootCommit:l,createdBy:t}).onConflictDoUpdate({target:M.gitRemoteUrl,targetWhere:mr`${M.gitRemoteUrl} IS NOT NULL`,set:{gitRemoteUrl:a}}).returning({id:M.id});w&&(i=[{id:w.id}],c="remote")}}catch(f){console.warn("[sessions] Project match failed (non-fatal):",f)}let p=e.req.header("X-RuleMetric-Internal")==="true"||e.req.header("x-rulemetric-internal")==="true",_;p?_="internal_worker":r.clientName==="mcp"?_="mcp":r.externalSessionId?_="hook":_="proxy";let I;try{[I]=await d.insert(y).values({userId:t,externalSessionId:r.externalSessionId??null,projectId:i[0]?.id??null,orgId:o,runId:s,tool:r.tool,projectPath:r.projectPath??null,gitBranch:r.gitBranch??null,startedAt:r.startedAt?new Date(r.startedAt):new Date,origin:_,harnessVersion:bi(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 d.select().from(y).where(Ei(Ct(y.userId,t),Ct(y.externalSessionId,r.externalSessionId))).limit(1);if(b){let v={};return!b.orgId&&o&&(v.orgId=o,b.orgId=o),!b.runId&&s&&(v.runId=s,b.runId=s),Object.keys(v).length>0&&await d.update(y).set(v).where(Ct(y.id,b.id)),e.json(b,200)}}throw f}if(!I)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 d.insert(de).values({projectId:i[0].id,path:r.projectPath,isWorktree:f}).onConflictDoUpdate({target:[de.projectId,de.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?mr`${g.name} LIKE ${f+"%"}`:mr`FALSE`,b=await d.select({instructionId:it.instructionId}).from(it).innerJoin(g,Ct(g.id,it.instructionId)).where(Ei(mr`${it.projectId} IN (${mr.join(i.map(v=>mr`${v.id}`),mr`, `)})`,Tv(dN(g.type,"context_file"),w)));for(let{instructionId:v}of b)await d.insert(se).values({sessionId:I.id,instructionId:v,linkMethod:"project_match"}).onConflictDoNothing()}}catch{}return e.json(I,201)});C();import{Hono as yN}from"hono";import{z as ct}from"zod";import{eq as Cv,and as wN,sql as pr}from"drizzle-orm";C();import{sql as Dn}from"drizzle-orm";function el(){return process.env.EVENT_BATCHING!=="0"}u(el,"eventBatchingEnabled");function kv(){let e=Number(process.env.EVENT_BATCH_LINGER_MS);return Number.isFinite(e)&&e>=0?e:50}u(kv,"eventBatchLingerMs");function Nv(){let e=Number(process.env.EVENT_BATCH_BUFFER_MAX);return Number.isFinite(e)&&e>0?Math.floor(e):5e3}u(Nv,"eventBatchBufferMax");function jv(){let e=Number(process.env.EVENT_BATCH_FLUSH_SIZE);return Number.isFinite(e)&&e>0?Math.floor(e):mN}u(jv,"eventBatchFlushSize");function Pv(){let e=Number(process.env.PG_POOL_MAX)||3;return Math.max(1,e-1)}u(Pv,"defaultDrainConcurrency");var mN=500;function pN(e){let t=e.lingerMs??kv(),n=e.maxBuffered??Nv(),r=Math.max(1,e.flushSize??jv()),o=Math.max(1,e.concurrency??Pv()),s=new Map,i=0,c=new Set,a=0,l=!1,m=null,p=[];function _(){let A=p;p=[];for(let E of A)E()}u(_,"notifyProgress");function I(){for(;a<o;){let A=null,E=null;for(let[R,P]of s)if(!(c.has(R)||P.length===0)){E=P.splice(0,r),P.length===0&&s.delete(R),A=R;break}if(A==null||E==null)return;i-=E.length,c.add(A),a++,h(A,E)}}u(I,"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{a--,c.delete(A),_(),I()}}u(h,"runDrain");function f(){m!=null||l||(m=setTimeout(()=>{m=null,I()},t),m.unref?.())}u(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?I():f(),!0}u(w,"push");function b(A){return new Promise(E=>{let R=!1,P=u(()=>{R||(R=!0,clearTimeout(N),E())},"finish"),N=setTimeout(P,A);N.unref?.(),p.push(P)})}u(b,"waitForProgress");async function v(A){let E=A!=null?Date.now()+A:Number.POSITIVE_INFINITY;for(;;){if(I(),i===0&&a===0)return;let R=E-Date.now();if(R<=0)return;await b(Math.min(R,50))}}u(v,"flush");function S(){l=!0,m!=null&&(clearTimeout(m),m=null)}return u(S,"stop"),{push:w,flush:v,stop:S,size:u(()=>i,"size"),inFlight:u(()=>a,"inFlight")}}u(pN,"createEventBatcher");var Rv=5,fN=[5,20,50];function gN(e){let t=e.cause;return e instanceof Error&&(t?.code==="23505"||e.message.includes("unique")||e.message.includes("duplicate"))}u(gN,"isDuplicateKeyError");function hN(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()}u(hN,"toEventTimestamp");async function _N(e,t){if(t.length===0)return;let n=null,r=!1;for(let o=0;o<=Rv;o++)try{let s=t.map((c,a)=>{let l=c.input,m={...l.metadata??{}};l.durationMs!=null&&(m.durationMs=l.durationMs),l.success!=null&&(m.success=l.success);let p=l.toolInput==null?null:JSON.stringify(l.toolInput),_=l.toolOutput==null?null:JSON.stringify(l.toolOutput),I=l.tokenUsage==null?null:JSON.stringify(l.tokenUsage),h=!r&&l.sequence!=null?Dn`${l.sequence}::int`:Dn`NULL::int`;return Dn`(${a+1}::int, ${h}, ${l.eventType}::text, ${l.content??null}::text, ${l.toolName??null}::text, ${p==null?Dn`NULL::jsonb`:Dn`${p}::jsonb`}, ${_==null?Dn`NULL::jsonb`:Dn`${_}::jsonb`}, ${I==null?Dn`NULL::jsonb`:Dn`${I}::jsonb`}, ${l.model??null}::text, ${hN(l.timestamp)}::timestamptz, ${JSON.stringify(m)}::jsonb)`});n=(await d.execute(Dn`
|
|
352
266
|
WITH base AS (
|
|
353
267
|
SELECT COALESCE(MAX(sequence), 0) AS seq
|
|
354
268
|
FROM session_events WHERE session_id = ${e}
|
|
355
269
|
),
|
|
356
270
|
vals (rn, explicit_seq, event_type, content, tool_name, tool_input, tool_output, token_usage, model, ts, metadata) AS (
|
|
357
|
-
VALUES ${
|
|
271
|
+
VALUES ${Dn.join(s,Dn`, `)}
|
|
358
272
|
),
|
|
359
273
|
ins AS (
|
|
360
274
|
INSERT INTO session_events (id, session_id, sequence, event_type, content, tool_name, tool_input, tool_output, token_usage, model, timestamp, metadata)
|
|
@@ -375,7 +289,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
375
289
|
)
|
|
376
290
|
SELECT (SELECT COUNT(*)::int FROM ins) AS inserted,
|
|
377
291
|
(SELECT event_count FROM upd) AS new_count
|
|
378
|
-
`))[0]?.new_count??null;break}catch(s){if(
|
|
292
|
+
`))[0]?.new_count??null;break}catch(s){if(gN(s)&&o<Rv){r=!0;continue}throw s}for(let o of t)if(!(!o.input.instructionIds||o.input.instructionIds.length===0))for(let s of o.input.instructionIds)try{await d.insert(se).values({sessionId:e,instructionId:s,linkMethod:"auto_capture"}).onConflictDoNothing()}catch(i){console.warn("[event-batcher] failed to auto-link instructionId:",i instanceof Error?i.message:i)}if(n!=null)try{let o=n-t.length,s=fN.filter(i=>o<i&&n>=i);for(let i of s)await Qd({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)}}u(_N,"drainSessionEvents");var yo=null;function Uf(){return yo==null&&(yo=pN({drainSession:_N})),yo}u(Uf,"getEventBatcher");function Dv(){Uf(),console.log(`[event-batcher] batched event ingest ON (lingerMs=${kv()} flushSize=${jv()} bufferMax=${Nv()} drainConcurrency=${Pv()}; EVENT_BATCHING=0 to disable)`)}u(Dv,"initEventBatcher");async function Ov(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)`)}u(Ov,"shutdownEventBatcher");var Hf=new yN,vN=ct.object({sequence:ct.number().int().optional(),eventType:ct.string(),content:ct.string().nullable().optional(),toolName:ct.string().nullable().optional(),toolInput:ct.union([ct.record(ct.unknown()),ct.array(ct.unknown())]).nullable().optional(),toolOutput:ct.union([ct.record(ct.unknown()),ct.array(ct.unknown())]).nullable().optional(),durationMs:ct.number().optional(),success:ct.boolean().optional(),metadata:ct.record(ct.unknown()).optional(),timestamp:ct.string(),instructionIds:ct.array(ct.string().uuid()).optional(),model:ct.string().nullable().optional(),tokenUsage:ct.record(ct.unknown()).nullable().optional()});Hf.post("/sessions/:id/events",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=vN.parse(r),[s]=await d.select({id:y.id,eventCount:y.eventCount,userId:y.userId}).from(y).where(wN(Cv(y.id,n),Cv(y.userId,t)));if(!s)return e.json({error:"Session not found"},404);let i=s.eventCount??0;if(el())return Uf().push({sessionId:n,userId:s.userId,input:o})?e.json({buffered:!0,count:1,durable:!1},202):(Ja(),e.header("Retry-After","2"),e.json({error:"Ingest busy: the event buffer is full. Retry shortly."},503));let c={...o.metadata??{}};o.durationMs!=null&&(c.durationMs=o.durationMs),o.success!=null&&(c.success=o.success);let a=o.toolInput==null?null:JSON.stringify(o.toolInput),l=o.toolOutput==null?null:JSON.stringify(o.toolOutput),m=JSON.stringify(c),p=o.tokenUsage==null?null:JSON.stringify(o.tokenUsage),_=o.sequence,I=5;for(let h=0;h<=I;h++)try{let f=_!=null?pr`${_}::int`:pr`COALESCE((SELECT MAX(sequence) FROM session_events WHERE session_id = ${n}), 0) + 1`;_=(await d.execute(pr`
|
|
379
293
|
WITH ins AS (
|
|
380
294
|
INSERT INTO session_events (id, session_id, sequence, event_type, content, tool_name, tool_input, tool_output, token_usage, model, timestamp, metadata)
|
|
381
295
|
SELECT
|
|
@@ -385,12 +299,12 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
385
299
|
${o.eventType},
|
|
386
300
|
${o.content??null},
|
|
387
301
|
${o.toolName??null},
|
|
388
|
-
${
|
|
389
|
-
${l==null?
|
|
390
|
-
${
|
|
302
|
+
${a==null?pr`NULL`:pr`${a}::jsonb`},
|
|
303
|
+
${l==null?pr`NULL`:pr`${l}::jsonb`},
|
|
304
|
+
${p==null?pr`NULL`:pr`${p}::jsonb`},
|
|
391
305
|
${o.model??null},
|
|
392
306
|
${new Date(o.timestamp).toISOString()}::timestamptz,
|
|
393
|
-
${
|
|
307
|
+
${pr`${m}::jsonb`}
|
|
394
308
|
RETURNING sequence
|
|
395
309
|
),
|
|
396
310
|
upd AS (
|
|
@@ -400,13 +314,13 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
400
314
|
RETURNING id
|
|
401
315
|
)
|
|
402
316
|
SELECT ins.sequence FROM ins, upd
|
|
403
|
-
`))[0]?.sequence??
|
|
404
|
-
`)}
|
|
317
|
+
`))[0]?.sequence??_??1;break}catch(f){let w=f.cause;if(f instanceof Error&&(w?.code==="23505"||f.message.includes("unique")||f.message.includes("duplicate"))&&h<I){_=void 0;continue}throw f}if(o.instructionIds&&o.instructionIds.length>0)for(let h of o.instructionIds)try{await d.insert(se).values({sessionId:n,instructionId:h,linkMethod:"auto_capture"}).onConflictDoNothing()}catch(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 Qd({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})});C();import{Hono as IN}from"hono";import{eq as hs,and as tl,desc as bN,sql as SN,ilike as Bf,gte as Lv}from"drizzle-orm";var Ff=new IN;Ff.post("/sessions/:id/close",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select({id:y.id,projectPath:y.projectPath}).from(y).where(tl(hs(y.id,n),hs(y.userId,t)));if(!r)return e.json({error:"Session not found"},404);if(await d.update(y).set({endedAt:new Date}).where(hs(y.id,n)),r.projectPath)try{let o=new Date;o.setHours(0,0,0,0);let[s]=await d.select({id:W.id}).from(W).where(tl(hs(W.userId,t),Lv(W.createdAt,o),Bf(W.projectPath,`%${rt(r.projectPath)}%`))).limit(1);if(!s){let[i]=await d.select({completedAt:W.completedAt}).from(W).where(tl(hs(W.userId,t),hs(W.status,"completed"),Bf(W.projectPath,`%${rt(r.projectPath)}%`))).orderBy(bN(W.completedAt)).limit(1),c=i?.completedAt??new Date(0),[{count:a}]=await d.select({count:SN`COUNT(*)`}).from(y).where(tl(hs(y.userId,t),Bf(y.projectPath,`%${rt(r.projectPath)}%`),Lv(y.startedAt,c)));Number(a)>=5&&await Tt({taskName:"process_insights",payload:{projectPath:r.projectPath},userId:t,mirror:{userId:t,projectPath:r.projectPath}})}}catch{}return e.json({closed:!0})});C();ml();import{createHash as qj}from"node:crypto";import{Hono as Uj}from"hono";import{z as pl}from"zod";import{eq as Xn,and as zI,sql as _s}from"drizzle-orm";function Ft(e){let t=e;for(;t&&typeof t=="object";){let n=t.code;if(typeof n=="string")return n;t=t.cause}}u(Ft,"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(`
|
|
318
|
+
`)}u(vo,"findPgMessage");import{createHash as $j}from"node:crypto";function BI(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}}u(BI,"readImportMarker");function FI(e,t){return e.length<=t.contentLen?!1:$j("sha256").update(e.slice(0,t.contentLen)).digest("hex")===t.contentHash}u(FI,"isStrictContentExtension");var WI=new Set(["claude_code","codex"]);var fl=new Uj,VI=pl.object({content:pl.string().min(1),tool:pl.string().optional(),orgId:pl.string().uuid().nullable().optional()});function Hj(e){for(let t of[e.metadata?.sessionId,e.metadata?.codexSessionId])if(typeof t=="string"&&t.length>0)return t;return null}u(Hj,"importedExternalSessionId");fl.post("/sessions/:id/reimport",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=VI.parse(r),[s]=await d.select({id:y.id,eventCount:y.eventCount,externalSessionId:y.externalSessionId,projectId:y.projectId}).from(y).where(zI(Xn(y.id,n),Xn(y.userId,t)));if(!s)return e.json({error:"Session not found"},404);let i=o.tool??Rc(o.content);if(!i)return e.json({error:"Could not detect session format. Specify tool parameter."},400);let a=Tc(i).parse(o.content);if(a.events.length===s.eventCount)return await Zd(n,t,s.externalSessionId,s.projectId,s.eventCount??0),e.json({reimported:!1,skipped:"unchanged",eventCount:s.eventCount});if(a.events.length===0&&(s.eventCount??0)>0)return await d.update(y).set({endedAt:a.endedAt?new Date(a.endedAt):new Date}).where(Xn(y.id,n)),await Zd(n,t,s.externalSessionId,s.projectId,s.eventCount??0),e.json({reimported:!1,skipped:"empty_parse",eventCount:s.eventCount});let l=a.events.map(m=>({sessionId:n,sequence:m.sequence,eventType:m.eventType,content:m.content,toolName:m.toolName,toolInput:m.toolInput,toolOutput:m.toolOutput,tokenUsage:m.tokenUsage,timestamp:new Date(m.timestamp),metadata:m.metadata}));return await tt.transaction(async m=>{await m.execute(_s`SET LOCAL statement_timeout = '60s'`),await m.delete($e).where(Xn($e.sessionId,n));for(let p=0;p<l.length;p+=500)await m.insert($e).values(l.slice(p,p+500));await m.update(y).set({eventCount:a.events.length,endedAt:a.endedAt?new Date(a.endedAt):new Date,projectPath:a.projectPath??void 0,gitBranch:a.gitBranch??void 0,metadata:a.metadata?_s`COALESCE(${y.metadata}, '{}'::jsonb) || ${JSON.stringify(a.metadata)}::jsonb`:void 0,model:gs(a.metadata?.model)??void 0,harnessVersion:bi(a.metadata)??void 0}).where(Xn(y.id,n))}),await Zd(n,t,s.externalSessionId,s.projectId,a.events.length),e.json({reimported:!0,eventCount:a.events.length})});fl.post("/sessions/import",async e=>{let t=e.get("userId"),n=await e.req.json(),r=VI.parse(n),o=r.tool??Rc(r.content);if(!o)return e.json({error:"Could not detect session format. Specify tool parameter."},400);let i=Tc(o).parse(r.content),c=Hj(i),a=qj("sha256").update(r.content).digest("hex"),l,m=u(async()=>(l===void 0&&(l=await _o(t,r.orgId??null)),l),"resolveOrgId"),p=i.events.map(h=>({sequence:h.sequence,eventType:h.eventType,content:h.content,toolName:h.toolName,toolInput:h.toolInput,toolOutput:h.toolOutput,tokenUsage:h.tokenUsage,timestamp:new Date(h.timestamp),metadata:h.metadata})),_={...i.metadata??{},_importContentHash:a,_importContentLen:r.content.length,_importEventCount:i.events.length},I=3;for(let h=0;;h++){let f=c?(await d.select().from(y).where(zI(Xn(y.userId,t),Xn(y.externalSessionId,c))).limit(1))[0]??null:null;if(f&&f.metadata?._importContentHash===a)return e.json({...f,deduped:!0},200);let w=await m(),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(${y.metadata}, '{}'::jsonb) || ${JSON.stringify(_)}::jsonb`,model:gs(i.metadata?.model)??void 0,harnessVersion:bi(i.metadata)??void 0,...w&&!f.orgId?{orgId:w}:{}}:null;try{if(f&&b&&WI.has(i.tool)){let S=BI(f.metadata);if(S&&p.length>S.eventCount&&p[S.eventCount]?.sequence===S.eventCount&&FI(r.content,S)){let[A]=await d.select({count:_s`COUNT(*)::int`,maxSeq:_s`MAX(${$e.sequence})::int`}).from($e).where(Xn($e.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 N=await tt.transaction(async D=>{await D.execute(_s`SET LOCAL statement_timeout = '60s'`);let q=p.slice(S.eventCount).map(B=>({sessionId:f.id,...B}));for(let B=0;B<q.length;B+=500)await D.insert($e).values(q.slice(B,B+500));let[H]=await D.update(y).set(b).where(Xn(y.id,f.id)).returning();return H});return e.json({...N,appended:!0},200)}}}let v=await tt.transaction(async S=>{if(await S.execute(_s`SET LOCAL statement_timeout = '60s'`),f&&b){if(await S.delete($e).where(Xn($e.sessionId,f.id)),p.length>0){let R=p.map(P=>({sessionId:f.id,...P}));for(let P=0;P<R.length;P+=500)await S.insert($e).values(R.slice(P,P+500))}let[E]=await S.update(y).set(b).where(Xn(y.id,f.id)).returning();return E}let[A]=await S.insert(y).values({userId:t,externalSessionId:c,tool:i.tool,projectPath:i.projectPath,gitBranch:i.gitBranch,startedAt:new Date(i.startedAt),endedAt:i.endedAt?new Date(i.endedAt):null,eventCount:i.events.length,metadata:_,model:gs(i.metadata?.model),harnessVersion:bi(i.metadata),orgId:w}).returning();if(p.length>0){let E=p.map(R=>({sessionId:A.id,...R}));for(let R=0;R<E.length;R+=500)await S.insert($e).values(E.slice(R,R+500))}return A});return e.json(v,f?200:201)}catch(v){if(c&&Ft(v)==="23505"&&h<I)continue;throw v}}});var Oi=new Bj;Oi.route("/",$f);Oi.route("/",Hf);Oi.route("/",Ff);Oi.route("/",fl);C();import{Hono as Fj}from"hono";import{eq as tn,and as Ci,asc as KI,desc as dg,sql as qe,or as JI,ilike as Wj,inArray as gl}from"drizzle-orm";var Li=new Fj;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"),c=e.req.query("projectPath"),a=e.req.query("projectId"),l=e.req.query("gitRemote"),m=Number(e.req.query("limit")??"50"),p=Number(e.req.query("offset")??"0"),_=[tn(y.userId,t)];if(e.req.query("includeInternal")==="true"||_.push(qe`${y.origin} <> 'internal_worker'`),n&&_.push(tn(y.tool,n)),a){let w=[tn(y.projectId,a)];l&&w.push(qe`${y.metadata}->>'gitRemote' = ${l}`),_.push(w.length===1?w[0]:JI(...w))}else if(c||l){let w=[];c&&w.push(Wj(y.projectPath,`%${rt(c)}%`)),l&&w.push(qe`${y.metadata}->>'gitRemote' = ${l}`),_.push(w.length===1?w[0]:JI(...w))}if(e.req.query("hideEmpty")!=="false"&&_.push(qe`${y.eventCount} > 0`),i==="true"?_.push(qe`${y.analysis} IS NOT NULL`):i==="false"&&_.push(qe`${y.analysis} IS NULL`),r&&_.push(qe`${y.analysis}->>'outcome' = ${r}`),o&&_.push(qe`(${y.analysis}->'friction')::text ILIKE ${"%"+rt(o)+"%"}`),s){let b=(await d.select({sessionId:se.sessionId}).from(se).where(tn(se.instructionId,s))).map(v=>v.sessionId);if(b.length===0)return e.json([]);_.push(qe`${y.id} IN (${qe.join(b.map(v=>qe`${v}`),qe`, `)})`)}if(e.req.query("summary")==="exists"){let[w]=await d.select({id:y.id}).from(y).where(Ci(..._)).limit(1);return e.json({exists:!!w})}let f=await d.select().from(y).where(Ci(..._)).orderBy(dg(y.startedAt)).limit(m).offset(p);if(f.length>0){let w=f.map(j=>j.id),b=Array.from(new Set(f.map(j=>j.projectId).filter(j=>!!j))),[v,S,A,E,R,P,N]=await Promise.all([d.select({sessionId:se.sessionId,name:g.name,contextIdentity:g.contextIdentity,type:g.type,source:qe`${g.frontmatter}->>'source'`}).from(se).innerJoin(g,tn(g.id,se.instructionId)).where(gl(se.sessionId,w)),d.select({sessionId:$.sessionId}).from($).where(gl($.sessionId,w)).groupBy($.sessionId),d.execute(qe`
|
|
405
319
|
SELECT session_id, MAX(timestamp) AS last_at
|
|
406
320
|
FROM session_events
|
|
407
|
-
WHERE session_id IN (${
|
|
321
|
+
WHERE session_id IN (${qe.join(w.map(j=>qe`${j}`),qe`, `)})
|
|
408
322
|
GROUP BY session_id
|
|
409
|
-
`),
|
|
323
|
+
`),d.execute(qe`
|
|
410
324
|
SELECT DISTINCT ON (e.session_id)
|
|
411
325
|
e.session_id,
|
|
412
326
|
-- Collapse whitespace runs into a single space for preview rendering.
|
|
@@ -416,27 +330,27 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
416
330
|
-- lowercase s from every preview ever shown.
|
|
417
331
|
LEFT(REGEXP_REPLACE(COALESCE(e.content, ''), '[[:space:]]+', ' ', 'g'), 120) AS preview
|
|
418
332
|
FROM session_events e
|
|
419
|
-
WHERE e.session_id IN (${
|
|
333
|
+
WHERE e.session_id IN (${qe.join(w.map(j=>qe`${j}`),qe`, `)})
|
|
420
334
|
AND e.event_type IN ('user_message', 'human')
|
|
421
335
|
AND e.content IS NOT NULL
|
|
422
336
|
AND e.content <> ''
|
|
423
337
|
ORDER BY e.session_id, e.timestamp DESC
|
|
424
|
-
`),
|
|
338
|
+
`),d.execute(qe`
|
|
425
339
|
SELECT DISTINCT ON (e.session_id)
|
|
426
340
|
e.session_id,
|
|
427
341
|
LEFT(REGEXP_REPLACE(COALESCE(e.content, ''), '[[:space:]]+', ' ', 'g'), 240) AS first_prompt
|
|
428
342
|
FROM session_events e
|
|
429
|
-
WHERE e.session_id IN (${
|
|
343
|
+
WHERE e.session_id IN (${qe.join(w.map(j=>qe`${j}`),qe`, `)})
|
|
430
344
|
AND e.event_type IN ('user_message', 'human')
|
|
431
345
|
AND e.content IS NOT NULL
|
|
432
346
|
AND e.content <> ''
|
|
433
347
|
ORDER BY e.session_id, e.timestamp ASC
|
|
434
|
-
`),b.length>0?
|
|
348
|
+
`),b.length>0?d.select({id:M.id,name:M.name}).from(M).where(gl(M.id,b)):Promise.resolve([]),b.length>0?d.execute(qe`
|
|
435
349
|
SELECT DISTINCT ON (project_id) project_id, path
|
|
436
350
|
FROM project_checkouts
|
|
437
|
-
WHERE project_id IN (${
|
|
351
|
+
WHERE project_id IN (${qe.join(b.map(j=>qe`${j}`),qe`, `)})
|
|
438
352
|
ORDER BY project_id, is_worktree ASC, last_seen DESC
|
|
439
|
-
`):Promise.resolve([])]),
|
|
353
|
+
`):Promise.resolve([])]),D=new Map;for(let j of v){let me=D.get(j.sessionId)??[];me.push({name:j.name,contextIdentity:j.contextIdentity,type:j.type,source:j.source}),D.set(j.sessionId,me)}let q=new Set;for(let j of S)j.sessionId&&q.add(j.sessionId);let H=new Map;for(let j of A)H.set(j.session_id,j.last_at);let B=new Map;for(let j of E)B.set(j.session_id,j.preview);let ee=new Map;for(let j of R)ee.set(j.session_id,j.first_prompt);let he=new Map,te=new Map;for(let j of P)he.set(j.id,j.name);for(let j of N)te.set(j.project_id,j.path);let Te=f.map(j=>({...j,linkedInstructions:D.get(j.id)??[],dataTier:q.has(j.id)?"full":(j.eventCount??0)>0?"events":"imported",lastMessagePreview:B.get(j.id)??j.analysis?.goalSummary??null,firstUserPrompt:ee.get(j.id)??null,projectName:j.projectId?he.get(j.projectId)??null:null,primaryCheckoutPath:j.projectId?te.get(j.projectId)??null:null,lastActivityAt:H.get(j.id)??j.startedAt}));return e.json(Te)}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 d.execute(qe`
|
|
440
354
|
WITH recent AS (
|
|
441
355
|
SELECT
|
|
442
356
|
s.project_id,
|
|
@@ -492,14 +406,14 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
492
406
|
) deduped
|
|
493
407
|
ORDER BY last_activity DESC
|
|
494
408
|
LIMIT ${o}
|
|
495
|
-
`),
|
|
409
|
+
`),c=Array.from(i).map(a=>a.project_path).filter(a=>typeof a=="string"&&a!=="");return e.json({projectPaths:c})});Li.get("/sessions/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select().from(y).where(Ci(tn(y.id,n),tn(y.userId,t)));if(!r)return e.json({error:"Session not found"},404);let o=await d.select({instructionId:se.instructionId,linkMethod:se.linkMethod,name:g.name,contextIdentity:g.contextIdentity,content:g.content,scope:g.scope,type:g.type,frontmatter:g.frontmatter}).from(se).innerJoin(g,tn(g.id,se.instructionId)).where(Ci(tn(se.sessionId,n),qe`${g.content} IS NOT NULL AND ${g.content} != ''`)),s=await d.select({eventType:$e.eventType,count:qe`count(*)::int`}).from($e).where(tn($e.sessionId,n)).groupBy($e.eventType),i={};for(let l of s)i[l.eventType]=Number(l.count);let c=null,a=null;if(r.projectId){let[l]=await d.select({name:M.name}).from(M).where(tn(M.id,r.projectId));c=l?.name??null;let[m]=await d.select({path:de.path}).from(de).where(tn(de.projectId,r.projectId)).orderBy(KI(de.isWorktree),dg(de.lastSeen)).limit(1);a=m?.path??null}return e.json({...r,linkedInstructions:o.map(l=>({...l,source:Ed(l.frontmatter)})),projectName:c,primaryCheckoutPath:a,eventCounts:{total:Object.values(i).reduce((l,m)=>l+m,0),messages:(i.user_message??0)+(i.assistant_message??0),toolCalls:i.tool_call??0,assistantResponses:i.assistant_response??0,byType:i}})});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(p=>p.trim()).filter(Boolean),c=e.req.query("hasContent")==="true",[a]=await d.select({id:y.id}).from(y).where(Ci(tn(y.id,n),tn(y.userId,t)));if(!a)return e.json({error:"Session not found"},404);let l=[tn($e.sessionId,n)];i.length>0&&l.push(gl($e.eventType,i)),c&&l.push(qe`${$e.content} IS NOT NULL AND ${$e.content} != ''`);let m=await d.select().from($e).where(Ci(...l)).orderBy(s==="desc"?dg($e.sequence):KI($e.sequence)).limit(r).offset(o);return e.json(m)});C();import{Hono as zj}from"hono";import{z as Sn}from"zod";import{eq as Io,and as lg,sql as Hr}from"drizzle-orm";var Mi=new zj;Mi.post("/sessions/:id/analyze",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select({id:y.id,tool:y.tool}).from(y).where(lg(Io(y.id,n),Io(y.userId,t)));if(!r)return e.json({error:"Session not found"},404);let{id:o}=await Tt({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)});Mi.post("/sessions/repair-analyzed-at",async e=>{let t=e.get("userId"),n=await d.execute(Hr`
|
|
496
410
|
UPDATE sessions
|
|
497
411
|
SET analyzed_at = started_at
|
|
498
412
|
WHERE user_id = ${t}
|
|
499
413
|
AND analysis IS NOT NULL
|
|
500
414
|
AND analyzed_at IS NULL
|
|
501
415
|
RETURNING id
|
|
502
|
-
`);return e.json({repaired:n.length})});var
|
|
416
|
+
`);return e.json({repaired:n.length})});var Vj=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();Mi.patch("/sessions/:id/enrich",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=Vj.parse(await e.req.json()),[o]=await d.select({id:y.id}).from(y).where(lg(Io(y.id,n),Io(y.userId,t)));if(!o)return e.json({error:"Session not found"},404);let s={};return r.metadata&&(s.metadata=Hr`COALESCE(${y.metadata}, '{}'::jsonb) || ${JSON.stringify(r.metadata)}::jsonb`),r.analysis&&(s.analysis=Hr`COALESCE(${y.analysis}, '{}'::jsonb) || ${JSON.stringify(r.analysis)}::jsonb`,s.analyzedAt=new Date),r.analyzedEventCount!=null&&(s.analyzedEventCount=r.analyzedEventCount),r.analyzedTurnCount!=null&&(s.analyzedTurnCount=r.analyzedTurnCount),r.tokenUsage&&(s.tokenUsage=r.tokenUsage),r.externalSessionId&&(s.externalSessionId=r.externalSessionId),Object.keys(s).length===0?e.json({error:"No enrichment data provided"},400):(await d.update(y).set(s).where(Io(y.id,n)),e.json({enriched:!0,fields:Object.keys(s)}))});Mi.post("/sessions/:id/derive-enrichment",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select({id:y.id,startedAt:y.startedAt,endedAt:y.endedAt,metadata:y.metadata}).from(y).where(lg(Io(y.id,n),Io(y.userId,t)));if(!r)return e.json({error:"Session not found"},404);let s=(await e.req.json().catch(()=>({}))).force===!0,c=r.metadata?.local_session_meta;if(c){if(!s)return e.json({skipped:!0,reason:"already_enriched"});if(!c.derived_from_events)return e.json({skipped:!0,reason:"hook_enriched"})}let[a]=await d.execute(Hr`
|
|
503
417
|
WITH usage_rows AS (
|
|
504
418
|
SELECT DISTINCT ON (coalesce(metadata->>'requestId', id::text))
|
|
505
419
|
coalesce(
|
|
@@ -534,15 +448,15 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
534
448
|
(SELECT max(timestamp) FROM session_events WHERE session_id = ${n}) AS last_ts,
|
|
535
449
|
(SELECT coalesce(sum(input_tokens), 0)::bigint FROM usage_rows) AS input_tokens,
|
|
536
450
|
(SELECT coalesce(sum(output_tokens), 0)::bigint FROM usage_rows) AS output_tokens
|
|
537
|
-
`);if(!
|
|
451
|
+
`);if(!a||Number(a.total_events)===0)return e.json({skipped:!0,reason:"no_events"});let l=Number(a.user_message_count),m=Number(a.assistant_message_count),p=Number(a.input_tokens),_=Number(a.output_tokens),I=await d.execute(Hr`
|
|
538
452
|
SELECT coalesce(tool_name, 'unknown') AS tool, count(*)::int AS n
|
|
539
453
|
FROM session_events
|
|
540
454
|
WHERE session_id = ${n}
|
|
541
455
|
AND event_type IN ('tool_call', 'tool_use')
|
|
542
456
|
GROUP BY 1
|
|
543
|
-
`),h={};for(let
|
|
544
|
-
ELSE length(${
|
|
545
|
-
+ CASE WHEN right(${
|
|
457
|
+
`),h={};for(let q of I)h[q.tool]=Number(q.n);let f=u(q=>Hr.raw(`CASE WHEN ${q} IS NULL OR ${q} = '' THEN 0
|
|
458
|
+
ELSE length(${q}) - length(replace(${q}, chr(10), ''))
|
|
459
|
+
+ CASE WHEN right(${q}, 1) = chr(10) THEN 0 ELSE 1 END END`),"nl"),[w]=await d.execute(Hr`
|
|
546
460
|
WITH tool_events AS (
|
|
547
461
|
SELECT
|
|
548
462
|
tool_name,
|
|
@@ -590,7 +504,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
590
504
|
count(*) FILTER (
|
|
591
505
|
WHERE jsonb_typeof(tool_output) = 'object' AND tool_output ? 'error')::int AS tool_errors
|
|
592
506
|
FROM tool_events
|
|
593
|
-
`),b={ts:"TypeScript",tsx:"TypeScript",js:"JavaScript",jsx:"JavaScript",py:"Python",sh:"Shell",bash:"Shell",sql:"SQL",md:"Markdown",json:"JSON",yml:"YAML",yaml:"YAML",css:"CSS",html:"HTML",go:"Go",rs:"Rust",rb:"Ruby",java:"Java",toml:"TOML"},
|
|
507
|
+
`),b={ts:"TypeScript",tsx:"TypeScript",js:"JavaScript",jsx:"JavaScript",py:"Python",sh:"Shell",bash:"Shell",sql:"SQL",md:"Markdown",json:"JSON",yml:"YAML",yaml:"YAML",css:"CSS",html:"HTML",go:"Go",rs:"Rust",rb:"Ruby",java:"Java",toml:"TOML"},v=await d.execute(Hr`
|
|
594
508
|
SELECT DISTINCT coalesce(tool_input->>'file_path', tool_input->>'notebook_path') AS path
|
|
595
509
|
FROM session_events
|
|
596
510
|
WHERE session_id = ${n}
|
|
@@ -598,7 +512,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
598
512
|
AND tool_name IN ('Edit','MultiEdit','Write','NotebookEdit')
|
|
599
513
|
AND jsonb_typeof(tool_input) = 'object'
|
|
600
514
|
AND coalesce(tool_input->>'file_path', tool_input->>'notebook_path') IS NOT NULL
|
|
601
|
-
`),S={};for(let
|
|
515
|
+
`),S={};for(let q of v){let H=q.path.split(".").pop()?.toLowerCase(),B=H?b[H]:void 0;B&&(S[B]=(S[B]??0)+1)}let A=a.first_ts,E=a.last_ts,P={duration_minutes:A&&E?Math.round((new Date(E).getTime()-new Date(A).getTime())/6e4):0,user_message_count:l,assistant_message_count:m,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},N=p>0||_>0?{input_tokens:p,output_tokens:_}:void 0,D={metadata:Hr`COALESCE(${y.metadata}, '{}'::jsonb) || ${JSON.stringify({local_session_meta:P})}::jsonb`};return N&&(D.tokenUsage=N),await d.update(y).set(D).where(Io(y.id,n)),e.json({enriched:!0,metrics:P})});C();import{Hono as nP}from"hono";import{z as Oc}from"zod";import{eq as Rt,and as Cc,asc as rP,desc as oP,sql as $i}from"drizzle-orm";var Jj=Number(process.env.PG_MESSAGE_RECONSTRUCT_BUDGET_BYTES)||16e6,Kj=Number(process.env.PG_MESSAGE_RECONSTRUCT_PAGE_SIZE)||200;function Gj(e){try{let t=JSON.stringify(e);return typeof t=="string"?t.length:0}catch{return 0}}u(Gj,"estimateBytes");async function hl(e){let t=e.budgetBytes??Jj,n=e.pageSize??Kj,r=[],o=0,s=0,i=-1;for(;;){let c=await e.fetchPage(i,n);if(s++,c.length===0)break;for(let a of c){if(Array.isArray(a.messagesDelta))for(let l of a.messagesDelta){let m=Gj(l);if(o+m>t)return{messages:r,truncated:!0,bytes:o,pages:s};r.push(l),o+=m}i=a.sequence}if(c.length<n)break}return{messages:r,truncated:!1,bytes:o,pages:s}}u(hl,"reconstructMessagesBounded");wl();C();import{inArray as eP}from"drizzle-orm";async function tb(e){let t=[...new Set(e.filter(r=>typeof r=="string"&&r.length>0))];if(t.length===0)return new Map;let n=await d.select({hash:_n.hash,content:_n.content}).from(_n).where(eP(_n.hash,t));return new Map(n.map(r=>[r.hash,r.content]))}u(tb,"fetchBlobMap");async function vl(e,t){return e?(await tb([e])).get(e)??t:t}u(vl,"resolveBlob");async function nb(e){if(e.length===0)return e;let t=await tb(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:eb(n.toolsHash!=null?t.get(n.toolsHash):void 0,n.tools),injectedInstructions:eb(n.injectedHash!=null?t.get(n.injectedHash):void 0,n.injectedInstructions)}))}u(nb,"resolveSnapshotBlobs");function eb(e,t){return Array.isArray(e)?e:t}u(eb,"preferArray");var tP=["x-anthropic-billing-header:","You are Claude Code, Anthropic","You are a Claude agent, built on Anthropic's Claude Agent SDK"];function rb(e){if(!e)return!1;let t=e.slice(0,400);return tP.some(n=>t.includes(n))}u(rb,"looksLikeHarnessSystemPrompt");Tf();function Il(){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}}}u(Il,"makeSingleFlight");var Lc=new nP;Lc.post("/sessions/:id/link",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),{instructionId:o}=Oc.object({instructionId:Oc.string().uuid()}).parse(r),[s]=await d.select({id:y.id}).from(y).where(Cc(Rt(y.id,n),Rt(y.userId,t)));return s?(await d.insert(se).values({sessionId:n,instructionId:o,linkMethod:"manual"}).onConflictDoNothing(),e.json({linked:!0})):e.json({error:"Session not found"},404)});Lc.get("/instructions/:id/insights",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await d.select({sessionId:se.sessionId,analysis:y.analysis,tool:y.tool,startedAt:y.startedAt}).from(se).innerJoin(y,Rt(y.id,se.sessionId)).where(Cc(Rt(se.instructionId,n),Rt(y.userId,t))),o=r.filter(a=>a.analysis),s=o.map(a=>a.analysis),i=s.length>0?Math.round(s.reduce((a,l)=>a+(l.adherenceScore??0),0)/s.length):null,c=s.flatMap(a=>a.suggestions??[]).filter(a=>a.instructionId===n);return e.json({instructionId:n,totalSessions:r.length,analyzedSessions:o.length,averageAdherence:i,suggestions:c})});var hg=new Set(["claude_md","memory","skill_loaded"]);function sP(e,t){return Qp(e,t)??`${e}::${t}`}u(sP,"deriveContextIdentityForAutoCreate");function ob(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}`}u(ob,"mapContextTypeToDescription");var iP=Oc.object({sessionId:Oc.string().uuid().optional(),backfill:Oc.boolean().optional()});async function aP(e,t,n,r){for(let s=0;s<=4;s++)try{await d.execute($i`
|
|
602
516
|
insert into instruction_version_identities
|
|
603
517
|
(instruction_id, content_hash, version_ordinal, content, first_seen_at, last_seen_at)
|
|
604
518
|
select
|
|
@@ -620,8 +534,8 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
620
534
|
first_seen_at = least(
|
|
621
535
|
instruction_version_identities.first_seen_at, excluded.first_seen_at),
|
|
622
536
|
content = coalesce(instruction_version_identities.content, excluded.content)
|
|
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}}
|
|
624
|
-
`):null;break}}}}if(
|
|
537
|
+
`);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}}u(aP,"registerVersionIdentity");async function cP(e,t){let n=await d.select({id:g.id,contentHash:g.contentHash,name:g.name,contextIdentity:g.contextIdentity,contentLen:$i`COALESCE(LENGTH(${g.content}), 0)::int`}).from(g).where(Rt(g.createdBy,e)),r=new Map,o=new Map;for(let v of n){let S=Number(v.contentLen??0);v.contentHash&&r.set(v.contentHash,{id:v.id,name:v.name??"",contentLen:S}),v.contextIdentity&&o.set(v.contextIdentity,{id:v.id,name:v.name??"",contentHash:v.contentHash})}let s=await tt.selectDistinctOn([$.sessionId],{id:$.id,sessionId:$.sessionId,metadata:$.metadata}).from($).where(t?Cc(Rt($.userId,e),Rt($.sessionId,t)):Rt($.userId,e)).orderBy($.sessionId,oP($.capturedAt)).limit(1e3),i=new Set,c=new Set,a=new Map,l=0,m=0,p=0,_=0,I=new Set,h=[],f=new Map;for(let v of s){if(!v.sessionId||i.has(v.sessionId))continue;i.add(v.sessionId);let A=v.metadata?.contextItems??[],E=null;async function R(){if(E)return E;let[N]=await tt.select({injectedInstructions:$.injectedInstructions,injectedHash:$.injectedHash}).from($).where(Rt($.id,v.id)).limit(1);return E=await vl(N?.injectedHash,N?.injectedInstructions??[]),E}u(R,"getInjected");async function P(){if(!v.sessionId)return[];let N=a.get(v.sessionId);if(N)return N;let D=v.sessionId,{messages:q}=await hl({fetchPage:u(async(B,ee)=>Dc(await tt.select({sequence:$.sequence,messagesDelta:$.messagesDelta,messagesDeltaRef:$.messagesDeltaRef}).from($).where(Cc(Rt($.sessionId,D),Rt($.userId,e),$i`${$.sequence} > ${B}`)).orderBy(rP($.sequence)).limit(ee)),"fetchPage")}),H=q;return a.set(v.sessionId,H),H}u(P,"getMessagesRaw");for(let N of A){let D=N.content_hash;if(!D)continue;c.add(D);let q=N.type??"",H=N.name??"";if(["user_input","core_system_prompt","available_tools","tool_definitions"].includes(H)||["system_reminder","system_prompt","hook_output","deferred_tools"].includes(q)||["date_change","current_date","task_reminder","git_status","unknown_reminder","available_skills"].includes(H)||q==="skill_catalog"||!hg.has(q)&&!q&&!H.includes(".md")&&!H.includes("rules"))continue;let B,ee=!1,he=null,te=r.get(D);if(te&&(B=te.id,hg.has(q)&&te.contentLen===0&&(ee=!0)),(!B||ee)&&hg.has(q)){let me=sP(q,H),L=N.instruction_index,ue=null,dt=L!=null?await R():[];if(L!=null&&dt[L])ue=dt[L];else if(q==="skill_loaded"&&N.message_index!=null){let re=await P(),ge=N.message_index,O=re[ge];if(O){let oe=O.content,Pe=(Array.isArray(oe)?oe.find(xe=>xe.type==="tool_use"&&(xe.name==="Skill"||xe.name==="execute_skill")):void 0)?.id;if(Pe)for(let xe=ge+1;xe<re.length&&xe<ge+5;xe++){let Ye=re[xe];if(Ye?.role!=="user")continue;let qt=Ye.content;if(!Array.isArray(qt))continue;let Nr=!1,Vo=[];for(let Zr of qt)Zr.type==="tool_result"&&Zr.tool_use_id===Pe?Nr=!0:Zr.type==="text"&&Nr&&Vo.push(Zr.text??"");if(Nr){ue=Vo.length>0?Vo.join(`
|
|
538
|
+
`):null;break}}}}if(he=ue,ee&&ue&&B)try{await d.update(g).set({content:ue,updatedAt:new Date}).where(Rt(g.id,B)),te.contentLen=ue.length,p++}catch(re){console.warn(`[link-instructions] Content backfill failed for instruction ${B}:`,re instanceof Error?re.message:re),_++}let He=o.get(me);if(He&&He.contentHash!==D){if(ue){let re=ue,ge=4,O=!1;for(let oe=0;oe<=ge;oe++)try{await d.transaction(async we=>{await we.select({id:g.id}).from(g).where(Rt(g.id,He.id)).for("update");let[{maxVersion:Pe}]=await we.select({maxVersion:$i`COALESCE(MAX(${Se.versionNumber}), 0)`}).from(Se).where(Rt(Se.instructionId,He.id)),xe=Pe+1;await we.insert(Se).values({instructionId:He.id,versionNumber:xe,content:re,frontmatter:{name:H,description:ob(q,H),type:"context_file",scope:"personal",version:`1.${xe}.0`},changeSummary:"Auto-detected content change from context snapshot",createdBy:e}),await we.update(g).set({content:re,contentHash:D,version:`1.${xe}.0`,updatedAt:new Date}).where(Rt(g.id,He.id))}),O=!0;break}catch(we){if(we.cause?.code==="23505"&&oe<ge)continue;console.warn(`[link-instructions] Version update failed for instruction ${He.id} (identity: ${me}):`,we instanceof Error?we.message:we),_++;break}O&&(r.set(D,{id:He.id,name:He.name,contentLen:re.length}),He.contentHash=D,p++)}B=He.id}else if(!He)try{let re=H,ge=ob(q,H),O=ue??"",oe={name:re,description:ge,type:"context_file",scope:"personal",version:"1.0.0"},we;await d.transaction(async Pe=>{let[xe]=await Pe.insert(g).values({name:re,description:ge,type:"context_file",scope:"personal",scopeRef:e,version:"1.0.0",content:O,frontmatter:oe,contentHash:D,contextIdentity:me,createdBy:e}).onConflictDoNothing().returning({id:g.id});xe&&(await Pe.insert(Se).values({instructionId:xe.id,versionNumber:1,content:O,frontmatter:oe,changeSummary:"Auto-created from context snapshot",createdBy:e}),we=xe.id)}),we&&(r.set(D,{id:we,name:re,contentLen:O.length}),o.set(me,{id:we,name:re,contentHash:D}),B=we,m++)}catch(re){console.warn(`[link-instructions] Auto-create failed for ${me}:`,re instanceof Error?re.message:re),_++;try{let[ge]=await d.select({id:g.id}).from(g).where(Cc(Rt(g.createdBy,e),Rt(g.contextIdentity,me))).limit(1);ge&&(B=ge.id)}catch(ge){console.warn(`[link-instructions] Fallback identity lookup also failed for ${me}:`,ge instanceof Error?ge.message:ge)}}}if(!B||!v.sessionId)continue;let Te=`${B}:${D}`,j=f.get(Te);j?!j.content&&he&&(j.content=he):f.set(Te,{instructionId:B,contentHash:D,content:he}),h.push({sessionId:v.sessionId,instructionId:B,linkMethod:"context_file",contentHash:D}),l++,I.add(v.sessionId)}}for(let v of f.values())await aP(v.instructionId,v.contentHash,v.content,new Date);for(let v=0;v<h.length;v+=500)try{await d.insert(se).values(h.slice(v,v+500)).onConflictDoUpdate({target:[se.sessionId,se.instructionId],set:{contentHash:$i`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 v of s){if(!v.sessionId)continue;let[S]=await d.select({projectId:y.projectId,projectPath:y.projectPath}).from(y).where(Rt(y.id,v.sessionId)).limit(1);if(!S?.projectId||!S.projectPath)continue;let A=S.projectPath.replace(/\/$/,""),R=v.metadata?.contextItems??[];for(let P of R){let N=r.get(P.content_hash);if(!N)continue;let D=P.name??"";if(!(D.startsWith("/")&&!D.startsWith(A+"/")))try{await d.insert(it).values({projectId:S.projectId,instructionId:N.id,addedBy:e}).onConflictDoNothing(),w++}catch{}}break}let b=0;for(let[v,S]of r){if(!c.has(v)||!S.name.includes("CLAUDE")&&!S.name.includes("rules"))continue;let[A]=await d.select({id:k.id}).from(k).where($i`${k.metadata}->>'content_hash' = ${v}`).limit(1);if(A||S.contentLen===0)continue;let[E]=await d.select({content:g.content}).from(g).where(Rt(g.id,S.id)).limit(1),R=Bd(E?.content,S.name);if(R&&!rb(R))try{let[P]=await d.insert(k).values({userId:e,name:S.name,type:"instruction",content:R,description:`Auto-generated from captured context: ${S.name}`,metadata:{content_hash:v,auto_generated:!0}}).returning({id:k.id}),N=/(?:^|\n)\s*[-*]?\s*((?:NEVER|ALWAYS|MUST|DO NOT|IMPORTANT)[^\n.]+[.\n])/gi,D=[...R.matchAll(N)].map(H=>H[1].trim()).slice(0,3),q=D.length>0?D.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 q)await d.insert(Ie).values({evalTargetId:P.id,name:H.name,prompt:H.prompt,expectations:H.expectations}),b++}catch{}}return{linked:l,created:m,updated:p,failed:_,sessionsLinked:I.size,instructionsMatched:r.size,snapshotsScanned:i.size,projectsLinked:w,evalsGenerated:b,scope:t?"session":"backfill"}}u(cP,"runLinkInstructions");var uP=Il();Lc.post("/sessions/link-instructions",async e=>{let t=e.get("userId"),n=await e.req.json().catch(()=>({})),r=iP.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 uP.run(`${t}:${o??"*backfill*"}`,()=>cP(t,o));return e.json(i)});C();import{Hono as dP}from"hono";import{eq as ys,and as sb,sql as bl,inArray as lP}from"drizzle-orm";var _g=new dP;_g.delete("/sessions/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select({id:y.id}).from(y).where(sb(ys(y.id,n),ys(y.userId,t))).limit(1);if(!r)return e.json({error:"Session not found"},404);let[[{eventCount:o}],[{snapshotCount:s}],i]=await Promise.all([d.select({eventCount:bl`count(*)::int`}).from($e).where(ys($e.sessionId,n)),d.select({snapshotCount:bl`count(*)::int`}).from($).where(ys($.sessionId,n)),d.selectDistinct({ref:$.messagesDeltaRef}).from($).where(sb(ys($.sessionId,n),bl`${$.messagesDeltaRef} IS NOT NULL`))]),c=i.map(p=>p.ref).filter(p=>!!p);await d.transaction(async p=>{await p.update(Je).set({sessionId:null}).where(ys(Je.sessionId,n)),await p.execute(bl`UPDATE scaffolding_fingerprints SET first_session_id = NULL WHERE first_session_id = ${n}`),await p.delete(y).where(ys(y.id,n))});let a=0,l=0,m=0;if(c.length>0){let p=await d.selectDistinct({ref:$.messagesDeltaRef}).from($).where(lP($.messagesDeltaRef,c)),_=new Set(p.map(h=>h.ref)),I=c.filter(h=>!_.has(h));if(l=c.length-I.length,I.length>0)try{let{getSupabaseAdmin:h}=await Promise.resolve().then(()=>(jc(),GI)),{SNAPSHOT_DELTA_BUCKET:f}=await Promise.resolve().then(()=>(wl(),ZI)),{error:w}=await h().storage.from(f).remove(I);w?(m=I.length,console.warn(`[sessions:delete] blob GC failed for ${I.length} ref(s): ${w.message}`)):a=I.length}catch(h){m=I.length,console.warn(`[sessions:delete] blob GC unavailable: ${h.message}`)}}return e.json({deleted:!0,eventsDeleted:o,snapshotsDeleted:s,blobsDeleted:a,blobsRetained:l,blobsFailed:m})});var bo=new mP;bo.route("/",Oi);bo.route("/",Li);bo.route("/",Mi);bo.route("/",Lc);bo.route("/",_g);C();import{Hono as pP}from"hono";import{eq as yg}from"drizzle-orm";import{sql as qi}from"drizzle-orm";var Mc=new pP;async function ib(e){let[t]=await d.select({activeOrgId:T.activeOrgId}).from(T).where(yg(T.id,e));return t?.activeOrgId??null}u(ib,"getActiveOrgId");var ab="interval '30 minutes'";Mc.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 ib(t);if(!o)return e.json({projects:[],total:0});let s=await d.execute(qi`
|
|
625
539
|
WITH session_activity AS (
|
|
626
540
|
SELECT
|
|
627
541
|
s.id,
|
|
@@ -641,7 +555,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
641
555
|
project_id,
|
|
642
556
|
COUNT(*)::int AS session_count,
|
|
643
557
|
COUNT(*) FILTER (
|
|
644
|
-
WHERE ended_at IS NULL AND last_at >= now() - ${
|
|
558
|
+
WHERE ended_at IS NULL AND last_at >= now() - ${qi.raw(ab)}
|
|
645
559
|
)::int AS active_session_count,
|
|
646
560
|
MAX(last_at) AS last_activity_at
|
|
647
561
|
FROM session_activity
|
|
@@ -667,18 +581,18 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
667
581
|
JOIN projects p ON p.id = pa.project_id
|
|
668
582
|
ORDER BY pa.last_activity_at DESC NULLS LAST, p.created_at DESC
|
|
669
583
|
LIMIT ${n} OFFSET ${r}
|
|
670
|
-
`),[{count:i}={count:0}]=await
|
|
584
|
+
`),[{count:i}={count:0}]=await d.execute(qi`
|
|
671
585
|
SELECT COUNT(DISTINCT s.project_id)::int AS count
|
|
672
586
|
FROM sessions s
|
|
673
587
|
WHERE s.org_id = ${o}
|
|
674
588
|
AND s.origin <> 'internal_worker'
|
|
675
589
|
AND s.project_id IS NOT NULL
|
|
676
|
-
`);return e.json({projects:s.map(
|
|
590
|
+
`);return e.json({projects:s.map(c=>({id:c.id,name:c.name,description:c.description,gitRemoteUrl:c.git_remote_url,githubRepo:c.github_repo,createdAt:c.created_at,sessionCount:c.session_count,activeSessionCount:c.active_session_count,lastActivityAt:c.last_activity_at,primaryCheckoutPath:c.primary_checkout_path})),total:i})});Mc.get("/projects/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await ib(t);if(!r)return e.json({error:"No active org"},404);let[o]=await d.select().from(M).where(yg(M.id,n));if(!o)return e.json({error:"Project not found"},404);let[{has_session:s}={has_session:!1}]=await d.execute(qi`
|
|
677
591
|
SELECT EXISTS(
|
|
678
592
|
SELECT 1 FROM sessions
|
|
679
593
|
WHERE project_id = ${n} AND org_id = ${r} AND origin <> 'internal_worker'
|
|
680
594
|
) AS has_session
|
|
681
|
-
`);if(o.orgId!==r&&!s)return e.json({error:"Project not found"},404);let[i]=await
|
|
595
|
+
`);if(o.orgId!==r&&!s)return e.json({error:"Project not found"},404);let[i]=await d.execute(qi`
|
|
682
596
|
WITH session_activity AS (
|
|
683
597
|
SELECT
|
|
684
598
|
s.id,
|
|
@@ -693,11 +607,11 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
693
607
|
SELECT
|
|
694
608
|
COUNT(*)::int AS session_count,
|
|
695
609
|
COUNT(*) FILTER (
|
|
696
|
-
WHERE ended_at IS NULL AND last_at >= now() - ${
|
|
610
|
+
WHERE ended_at IS NULL AND last_at >= now() - ${qi.raw(ab)}
|
|
697
611
|
)::int AS active_session_count,
|
|
698
612
|
MAX(last_at) AS last_activity_at
|
|
699
613
|
FROM session_activity
|
|
700
|
-
`),
|
|
614
|
+
`),c=await d.select({path:de.path,isWorktree:de.isWorktree,firstSeen:de.firstSeen,lastSeen:de.lastSeen}).from(de).where(yg(de.projectId,n));return c.sort((a,l)=>{let m=a.lastSeen?.getTime()??0;return(l.lastSeen?.getTime()??0)-m}),e.json({id:o.id,name:o.name,description:o.description,gitRemoteUrl:o.gitRemoteUrl,githubRepo:o.githubRepo,createdAt:o.createdAt,sessionCount:i?.session_count??0,activeSessionCount:i?.active_session_count??0,lastActivityAt:i?.last_activity_at??null,primaryCheckoutPath:c[0]?.path??null,checkouts:c})});C();import{Hono as fP}from"hono";import{z as Cn}from"zod";import{eq as ut,and as So,sql as cb,desc as gP,inArray as hP}from"drizzle-orm";var fr=new fP,_P=Cn.object({name:Cn.string().min(1).max(255),description:Cn.string().min(1),scope:Cn.enum(["org","team","personal"]),scopeRef:Cn.string().uuid().optional(),version:Cn.string().default("1.0.0"),tags:Cn.array(Cn.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 d.select().from(Le).where(So(...o)).orderBy(gP(Le.updatedAt)).limit(r),i=s.map(a=>a.id),c={};if(i.length>0){let a=await d.select({packId:De.packId,count:cb`COUNT(*)::int`}).from(De).where(hP(De.packId,i)).groupBy(De.packId);for(let l of a)c[l.packId]=l.count}return e.json(s.map(a=>{let l=c[a.id]??0;return{...a,instructionCount:l,tier:ac(l)}}))});fr.get("/packs/:id",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await d.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 d.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:ac(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=_P.parse(n),o=r.scope==="personal"?t:r.scopeRef??null,[s]=await d.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:ac(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}=Cn.object({instructionId:Cn.string().uuid()}).parse(r),[s]=await d.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 d.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[c]=await d.select({max:cb`COALESCE(MAX(${De.position}), -1)`}).from(De).where(ut(De.packId,t)),[a]=await d.insert(De).values({packId:t,instructionId:o,position:(c?.max??-1)+1,addedBy:n}).returning();return e.json(a,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 d.select({id:Le.id}).from(Le).where(So(ut(Le.id,t),ut(Le.createdBy,n),ut(Le.archived,!1)));return o?(await d.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}=Cn.object({projectId:Cn.string().uuid()}).parse(r),s=await d.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 c of s){let[a]=await d.select().from(it).where(So(ut(it.projectId,o),ut(it.instructionId,c.instructionId)));a||(await d.insert(it).values({projectId:o,instructionId:c.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 d.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 d.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 d.select().from(De).where(ut(De.packId,n));return s.length>0&&await d.insert(De).values(s.map(i=>({packId:o.id,instructionId:i.instructionId,position:i.position,slotOverrides:i.slotOverrides,addedBy:t}))),e.json(o,201)});C();import{Hono as yP}from"hono";import{eq as wg,and as wP,sql as ub}from"drizzle-orm";var Sl=new yP;function db(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}}u(db,"mapRow");Sl.get("/instructions/:id/lineage",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select({id:g.id,name:g.name,forkedFromId:g.forkedFromId,version:g.version,scope:g.scope,createdBy:g.createdBy,createdAt:g.createdAt}).from(g).where(wP(wg(g.id,n),wg(g.archived,!1),wg(g.createdBy,t)));if(!r)return e.json({error:"Instruction not found"},404);let o=r.forkedFromId?await d.execute(ub`
|
|
701
615
|
WITH RECURSIVE ancestors AS (
|
|
702
616
|
SELECT id, name, forked_from_id, version, scope, created_by, created_at::text, 1 as depth
|
|
703
617
|
FROM instructions
|
|
@@ -710,7 +624,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
710
624
|
WHERE i.archived = false AND a.depth < 20
|
|
711
625
|
)
|
|
712
626
|
SELECT * FROM ancestors ORDER BY depth DESC
|
|
713
|
-
`):[],s=await
|
|
627
|
+
`):[],s=await d.execute(ub`
|
|
714
628
|
WITH RECURSIVE descendants AS (
|
|
715
629
|
SELECT id, name, forked_from_id, version, scope, created_by, created_at::text, 1 as depth
|
|
716
630
|
FROM instructions
|
|
@@ -723,32 +637,32 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
723
637
|
WHERE i.archived = false AND d.depth < 20
|
|
724
638
|
)
|
|
725
639
|
SELECT * FROM descendants ORDER BY depth ASC
|
|
726
|
-
`),i=Array.isArray(o)?o.map(
|
|
727
|
-
SELECT coalesce(task_kind, ${
|
|
640
|
+
`),i=Array.isArray(o)?o.map(db):[],c=s.map(db);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:c})});C();import{Hono as bP}from"hono";import{z as ws}from"zod";import{eq as Ao,and as Uc,desc as Ig,gt as bg,lt as SP,sql as nn}from"drizzle-orm";function qc(e){let t=e?.llmEngines;if(!t||typeof t!="object")return null;let n=t;return{claude:n.claude===!0,codex:n.codex===!0}}u(qc,"reportedEngines");var vP=10;function El(e,t){let n=u(p=>e.capabilities===null||e.capabilities.includes(p),"claims"),r=e.engines!=null&&!e.engines.claude&&!e.engines.codex,o=t.filter(p=>n(p.kind)),s=t.filter(p=>!n(p.kind)),i=r?o.filter(p=>Td(p.kind)):[],c=r?o.filter(p=>!Td(p.kind)):o,a=[],l,m;return e.present?e.active?i.length>0?(l="fail",m=`Worker is online but no LLM engine is installed \u2014 ${$c(i)} job(s) cannot produce real output (${Al(i)}).`,a.push("Install one on the machine running the worker: `claude` (npm i -g @anthropic-ai/claude-code) or `codex`, then `rulemetric worker:restart`."),a.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."),a.push("If an engine IS installed, the worker cannot see it on its PATH: launchd starts with a minimal PATH, so a Homebrew or nvm install needs an absolute path. `rulemetric doctor` prints what the worker resolved.")):e.busy?(l="ok",m=c.length>0?`Worker is running a job \u2014 ${$c(c)} more queued behind it.`:"Worker is online and running a job."):c.some(p=>p.oldestMinutes>=vP)?(l="warn",m=`Worker is online but its queue is not draining \u2014 ${$c(c)} job(s) pending (${Al(c)}).`,a.push("A handler may be wedged. Restart: `rulemetric worker:restart` (or reinstall the service).")):(l="ok",m="Worker is online and its queue is draining."):(l="fail",m=`Worker is not running \u2014 last heartbeat ${IP(e.ageSeconds)} ago.`,a.push("Restart it: `rulemetric service install --worker-only`"),a.push("If it keeps dying, `launchctl list | grep rulemetric` shows the exit status."),c.length>0&&a.push(`${$c(c)} job(s) are waiting on it (${Al(c)}) \u2014 they will drain once it is back.`)):(l="fail",m="No worker has ever connected \u2014 nothing is analyzing your sessions.",a.push("Start one: `rulemetric service install --worker-only`"),a.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"),a.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"),a.push(`${$c(s)} job(s) cannot be claimed by this worker (${Al(s)}). These handlers need direct database credentials, which a worker-only install does not have \u2014 they will stay pending until a worker with DATABASE_URL runs.`)),{severity:l,headline:m,hints:a,stuck:c,unclaimable:s,engineBlocked:i}}u(El,"assessWorkerHealth");function $c(e){return e.reduce((t,n)=>t+n.count,0)}u($c,"totalOf");function Al(e){return e.map(t=>`${t.kind}\xD7${t.count}`).join(", ")}u(Al,"describe");function IP(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`}u(IP,"formatAge");var vg=[{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'"}],lb=vg.map(({table:e,defaultKind:t})=>({table:e,defaultKind:t}));var Ui=new bP,Sg=6e4,mb=600*1e3,Ag=3600*1e3,AP=10080*60*1e3,EP={"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"]},xP=new Set([]),TP=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()}),Eg=lb;async function RP(e,t=0){let n=new Date(Date.now()-t).toISOString(),r=Eg.map(({table:i,defaultKind:c})=>nn`
|
|
641
|
+
SELECT coalesce(task_kind, ${c}) AS kind,
|
|
728
642
|
count(*)::int AS n,
|
|
729
643
|
min(created_at) AS oldest
|
|
730
|
-
FROM ${
|
|
644
|
+
FROM ${nn.raw(i)}
|
|
731
645
|
WHERE user_id = ${e}
|
|
732
646
|
AND status = 'pending'
|
|
733
647
|
AND created_at < ${n}::timestamptz
|
|
734
648
|
GROUP BY 1
|
|
735
|
-
`),o=await
|
|
649
|
+
`),o=await d.execute(nn`${nn.join(r,nn` 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)}))}u(RP,"queryPendingKinds");async function pb(e){return(await d.execute(nn`${nn.join(Eg.map(({table:n})=>nn`
|
|
736
650
|
SELECT count(*)::int AS n
|
|
737
|
-
FROM ${
|
|
651
|
+
FROM ${nn.raw(n)}
|
|
738
652
|
WHERE user_id = ${e}
|
|
739
653
|
AND status IN ('claimed', 'running')
|
|
740
654
|
AND lease_expires_at IS NOT NULL
|
|
741
655
|
AND lease_expires_at > now()
|
|
742
|
-
`),
|
|
743
|
-
SELECT coalesce(task_kind, ${
|
|
656
|
+
`),nn` UNION ALL `)}`)).reduce((n,r)=>n+Number(r.n),0)>0}u(pb,"hasLiveInFlightJob");async function kP(e,t){let n=new Date(Date.now()-mb).toISOString(),r=Eg.map(({table:m,defaultKind:p})=>nn`
|
|
657
|
+
SELECT coalesce(task_kind, ${p}) AS kind,
|
|
744
658
|
count(*)::int AS n,
|
|
745
659
|
min(created_at) AS oldest
|
|
746
|
-
FROM ${
|
|
660
|
+
FROM ${nn.raw(m)}
|
|
747
661
|
WHERE user_id = ${e}
|
|
748
662
|
AND status = 'pending'
|
|
749
663
|
AND created_at < ${n}::timestamptz
|
|
750
664
|
GROUP BY 1
|
|
751
|
-
`),o=await
|
|
665
|
+
`),o=await d.execute(nn`${nn.join(r,nn` UNION ALL `)} ORDER BY oldest ASC`),s=t===null?o:o.filter(m=>t.includes(m.kind));if(s.length===0||await pb(e))return null;let i=s.reduce((m,p)=>m+Number(p.n),0),c=Date.now()-new Date(s[0].oldest).getTime(),a=Math.round(c/6e4),l=s.map(m=>`${m.kind}\xD7${m.n}`).join(", ");return{code:"STALE_PENDING",message:`${i} job(s) pending >${Math.round(mb/6e4)}m (oldest ${a}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:a,byKind:s.map(m=>({kind:m.kind,count:Number(m.n)}))}}}u(kP,"checkStalePendingAdvisory");function xg(e){return!e||!Array.isArray(e.capabilities)?null:e.capabilities.filter(t=>typeof t=="string")}u(xg,"reportedCapabilities");function NP(e,t){if(e!=="cli-worker")return null;let n=qc(t);if(n===null||n.claude||n.codex)return null;let r=xg(t),o=r===null?[...dc]:r.filter(s=>dc.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}}}u(NP,"checkEngineAdvisory");function jP(e,t){let n=EP[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)&&!xP.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}u(jP,"checkWorkerAdvisory");Ui.post("/workers/heartbeat",async e=>{let t=e.get("userId"),n=await e.req.json(),r=TP.parse(n);await d.insert(pe).values({userId:t,workerType:r.workerType,clientName:r.clientName,clientVersion:r.clientVersion??null,workerVersion:r.workerVersion??null,metadata:r.metadata??null}).onConflictDoUpdate({target:[pe.userId,pe.workerType,pe.clientName],set:{lastHeartbeat:new Date,clientVersion:r.clientVersion??null,workerVersion:r.workerVersion??null,metadata:r.metadata??null}}),d.delete(pe).where(Uc(Ao(pe.userId,t),SP(pe.lastHeartbeat,new Date(Date.now()-AP)))).catch(()=>{});let o=jP(r.workerType,r.metadata);return o??=NP(r.workerType,r.metadata),!o&&r.workerType==="cli-worker"&&(o=await kP(t,xg(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 fb(e){let t=new Date(Date.now()-Ag),n=await d.select({lastHeartbeat:pe.lastHeartbeat}).from(pe).where(Uc(Ao(pe.userId,e),Ao(pe.workerType,"cli-worker"),bg(pe.lastHeartbeat,t))),r=Date.now();return{cliEverConnected:n.length>0,workerActive:n.some(o=>r-new Date(o.lastHeartbeat).getTime()<Sg)}}u(fb,"computeCliWorkerSetupSignals");async function xl(e){let t=await d.select({lastHeartbeat:pe.lastHeartbeat,metadata:pe.metadata}).from(pe).where(Uc(Ao(pe.userId,e),Ao(pe.workerType,"cli-worker"))).orderBy(Ig(pe.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}u(xl,"getLatestLlmEngines");Ui.get("/workers/status",async e=>{let t=e.get("userId"),n=new Date(Date.now()-Ag),r=await d.select().from(pe).where(Uc(Ao(pe.userId,t),bg(pe.lastHeartbeat,n))).orderBy(Ig(pe.lastHeartbeat)),o=Date.now(),s=r.map(i=>{let c=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:c<Sg?"active":"inactive"}});return e.json(s)});Ui.get("/workers/health",async e=>{let t=e.get("userId"),n=new Date(Date.now()-Ag),[r,o,s]=await Promise.all([d.select({lastHeartbeat:pe.lastHeartbeat,clientName:pe.clientName,clientVersion:pe.clientVersion,metadata:pe.metadata}).from(pe).where(Uc(Ao(pe.userId,t),Ao(pe.workerType,"cli-worker"),bg(pe.lastHeartbeat,n))).orderBy(Ig(pe.lastHeartbeat)).limit(1),RP(t),pb(t)]),i=r[0],c=i?Date.now()-new Date(i.lastHeartbeat).getTime():null,a=i?i.metadata??void 0:void 0,l={present:i!=null,active:c!=null&&c<Sg,ageSeconds:c==null?null:Math.round(c/1e3),capabilities:i?xg(a):null,busy:s,engines:i?qc(a):null},m=El(l,o);return e.json({worker:{present:l.present,active:l.active,ageSeconds:l.ageSeconds,clientName:i?.clientName??null,clientVersion:i?.clientVersion??null,lastHeartbeat:i?.lastHeartbeat??null,capabilities:l.capabilities,engines:l.engines},pending:o,verdict:m})});C();import{Hono as PP}from"hono";import{z as Tg}from"zod";import{and as Rg,desc as gb,eq as gr,inArray as DP,isNull as OP,sql as nt}from"drizzle-orm";var Hc=new PP,CP=Tg.object({limit:Tg.coerce.number().int().min(1).max(100).default(20),hours:Tg.coerce.number().int().min(1).max(168).default(24)}),LP=6e4,MP=3600*1e3;function hb(e,t){return nt.join(vg.map(({table:n,defaultKind:r,labelIdSql:o,labelTextSql:s})=>nt`
|
|
752
666
|
SELECT id::text AS id,
|
|
753
667
|
${n} AS source_table,
|
|
754
668
|
coalesce(task_kind, ${r}) AS kind,
|
|
@@ -758,15 +672,15 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
758
672
|
claimed_at,
|
|
759
673
|
lease_expires_at,
|
|
760
674
|
completed_at,
|
|
761
|
-
${
|
|
762
|
-
${
|
|
675
|
+
${nt.raw(o)} AS label_id,
|
|
676
|
+
${nt.raw(s)} AS label_text,
|
|
763
677
|
result->>'skipped' AS skipped,
|
|
764
678
|
result->>'reason' AS reason,
|
|
765
679
|
result->>'decision' AS decision,
|
|
766
680
|
error
|
|
767
|
-
FROM ${
|
|
768
|
-
WHERE user_id = ${e}::uuid AND ${t}`),
|
|
769
|
-
AND completed_at > now() - make_interval(hours => ${o})`),[a,
|
|
681
|
+
FROM ${nt.raw(n)}
|
|
682
|
+
WHERE user_id = ${e}::uuid AND ${t}`),nt` UNION ALL `)}u(hb,"jobSelect");Hc.post("/loop/run-now",async e=>{let t=u(async n=>{try{let r=await tt.execute(nt`SELECT ${nt.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")})});Hc.get("/loop/status",async e=>{let t=e.get("userId"),n=CP.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=hb(t,nt`status IN ('pending', 'claimed', 'running')`),i=hb(t,nt`status IN ('completed', 'failed')
|
|
683
|
+
AND completed_at > now() - make_interval(hours => ${o})`),[c,a,l]=await Promise.all([d.execute(nt`${s} ORDER BY created_at ASC`),d.execute(nt`${i} ORDER BY completed_at DESC LIMIT ${r}`),d.execute(nt`SELECT count(*)::int AS n FROM (${i}) q`)]),m=[...new Set([...c,...a].map(j=>j.label_id).filter(j=>!!j))],p=new Map;if(m.length>0){let j=await d.select({id:k.id,name:k.name}).from(k).where(DP(k.id,m));for(let me of j)p.set(me.id,me.name)}let _=Date.now(),I=u(j=>(j.label_id?p.get(j.label_id)??null:null)??j.label_text,"label"),h=c.filter(j=>j.status==="claimed"||j.status==="running").map(j=>({id:j.id,kind:j.kind,label:I(j),claimedAt:j.claimed_at,elapsedSeconds:j.claimed_at?Math.round((_-new Date(j.claimed_at).getTime())/1e3):null,leaseHealthy:j.lease_expires_at?new Date(j.lease_expires_at).getTime()>_:!1})),f=c.filter(j=>j.status==="pending").map(j=>({id:j.id,kind:j.kind,label:I(j),createdAt:j.created_at,waitedSeconds:Math.round((_-new Date(j.created_at).getTime())/1e3),attempts:j.attempts})),w=a.map(j=>({id:j.id,kind:j.kind,label:I(j),finishedAt:j.completed_at,durationSeconds:j.claimed_at&&j.completed_at?Math.round((new Date(j.completed_at).getTime()-new Date(j.claimed_at).getTime())/1e3):null,outcome:j.status==="failed"?"failed":j.skipped?"skipped":j.decision?"decided":"ok",reason:j.skipped??j.decision??(j.status==="failed"?"failed":null),detail:j.reason??j.error??null})),b=await d.select({id:ie.id,evalTargetId:ie.evalTargetId,targetName:k.name,createdAt:ie.createdAt,decision:ie.decision,applied:ie.applied,effectClass:ie.effectClass,proposalSource:ie.proposalSource}).from(ie).leftJoin(k,gr(ie.evalTargetId,k.id)).where(gr(ie.userId,t)).orderBy(gb(ie.createdAt)).limit(r),v=d.execute(nt`
|
|
770
684
|
SELECT count(*)::int AS decisions,
|
|
771
685
|
count(*) FILTER (WHERE p.applied)::int AS applied,
|
|
772
686
|
count(*) FILTER (WHERE p.decision = 'promote')::int AS promote,
|
|
@@ -801,7 +715,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
801
715
|
FROM instruction_promotions p
|
|
802
716
|
LEFT JOIN eval_targets t ON t.id = p.eval_target_id
|
|
803
717
|
WHERE p.user_id = ${t}::uuid
|
|
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`
|
|
718
|
+
`),S=d.select({proposed:nt`count(*)::int`,accepted:nt`count(*) filter (where ${x.acceptedAt} is not null)::int`,lastAcceptedAt:nt`max(${x.acceptedAt})::text`}).from(x).where(gr(x.userId,t)),[A,E,R,P]=await Promise.all([d.select({n:nt`count(*)::int`}).from(ie).where(gr(ie.userId,t)),d.select({n:nt`count(*)::int`}).from(U).where(Rg(gr(U.userId,t),gr(U.status,"running"))),d.select({kind:x.kind,n:nt`count(*)::int`}).from(x).where(Rg(gr(x.userId,t),OP(x.dismissedAt))).groupBy(x.kind),d.select({entries:nt`count(*)::int`,distinct:nt`count(distinct ${Ae.contentHash})::int`,repeated:nt`count(*) filter (where ${Ae.timesGenerated} > 1)::int`,dismissed:nt`count(*) filter (where ${Ae.dismissedAt} is not null)::int`,maxTimesGenerated:nt`coalesce(max(${Ae.timesGenerated}), 0)::int`,lastSeenAt:nt`max(${Ae.lastSeenAt})`}).from(Ae).where(gr(Ae.userId,t))]),[N,D]=await Promise.all([v,S]),q=N[0],H=D[0],ee=(await d.select({lastHeartbeat:pe.lastHeartbeat,clientName:pe.clientName,clientVersion:pe.clientVersion,metadata:pe.metadata}).from(pe).where(Rg(gr(pe.userId,t),gr(pe.workerType,"cli-worker"),nt`${pe.lastHeartbeat} > ${new Date(_-MP).toISOString()}::timestamptz`)).orderBy(gb(pe.lastHeartbeat)).limit(1))[0],he=ee?_-new Date(ee.lastHeartbeat).getTime():null,te=f.map(j=>({kind:j.kind,count:1,oldestMinutes:Math.round(j.waitedSeconds/60)})),Te={present:ee!=null,active:he!=null&&he<LP,ageSeconds:he==null?null:Math.round(he/1e3),capabilities:null,busy:h.length>0,engines:ee?qc(ee.metadata):null};return e.json({worker:{present:Te.present,active:Te.active,ageSeconds:Te.ageSeconds,clientName:ee?.clientName??null,clientVersion:ee?.clientVersion??null,lastHeartbeat:ee?.lastHeartbeat??null},verdict:El(Te,te),running:h,queued:f,recent:w,recentTotal:l[0]?.n??0,proposals:b,proposalTotal:A[0]?.n??0,changes:{decisions:q?.decisions??0,applied:q?.applied??0,byDecision:{promote:q?.promote??0,revert:q?.revert??0,refuse:q?.refuse??0},readyToApply:q?.ready_to_apply??0,readyToApplyTargetId:q?.ready_to_apply_target_id??null,readyToApplyPromotionId:q?.ready_to_apply_promotion_id??null,lastAppliedAt:q?.last_applied_at??null,lastDecidedAt:q?.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(j=>[j.kind,j.n]))},insights:{entries:P[0]?.entries??0,distinct:P[0]?.distinct??0,repeated:P[0]?.repeated??0,dismissed:P[0]?.dismissed??0,maxTimesGenerated:P[0]?.maxTimesGenerated??0,lastSeenAt:P[0]?.lastSeenAt??null},windowHours:o})});C();import{Hono as qP}from"hono";import{z as Wt}from"zod";import{and as UP,eq as Ln,sql as vs}from"drizzle-orm";C();import{and as $P,eq as _b}from"drizzle-orm";async function Ge(e,t){let[n]=await d.select({id:k.id}).from(k).where($P(_b(k.id,e),_b(k.userId,t)));return n}u(Ge,"verifyTargetOwnership");function Bc(e){return e===!0||e==="true"}u(Bc,"flagOn");function Tl(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=Bc(n.autoEvolvePaused);return{enabled:Bc(n.autoEvolveEnabled),optOut:Bc(n.autoEvolveOptOut),apply:Bc(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:Bc(n.autoEvolveAccumulate)}}u(Tl,"resolveEvolutionSettings");function yb(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}u(yb,"applyEvolutionPatch");function Rl(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.`}u(Rl,"describeEvolutionState");var hr=new qP,HP=Wt.object({enabled:Wt.boolean().optional(),projectId:Wt.string().uuid().optional(),limits:Wt.object({minScore:Wt.number().min(Nn.minScore.min).max(Nn.minScore.max).nullable(),maxPerRun:Wt.number().int().min(Nn.maxPerRun.min).max(Nn.maxPerRun.max).nullable(),maxPerWindow:Wt.number().int().min(Nn.maxPerWindow.min).max(Nn.maxPerWindow.max).nullable(),windowDays:Wt.number().int().min(Nn.windowDays.min).max(Nn.windowDays.max).nullable()}).partial().optional()}).refine(e=>e.enabled!==void 0||e.limits!==void 0,{message:"nothing to change: pass `enabled`, `limits`, or both"});hr.get("/settings/auto-accept",async e=>{let t=e.get("userId"),n=e.req.query("projectId")??null,[r]=await d.select({enabled:T.autoAcceptSuggestions}).from(T).where(Ln(T.id,t)),o=null;if(n){let[i]=await d.select({raw:vs`${M.metadata}->>'autoAcceptSuggestions'`}).from(M).where(Ln(M.id,n));i?.raw!=null&&(o=i.raw==="true")}let s=await zd(t,n);return e.json({effective:s.allowed,source:s.source,accountDefault:r?.enabled??!0,projectOverride:o,limits:{...await hi(t,n),bounds:Nn},defaults:{minScore:cn.MIN_SCORE,maxPerRun:cn.MAX_PER_RUN,maxPerWindow:cn.MAX_PER_WINDOW,windowDays:cn.WINDOW_DAYS}})});var BP={minScore:"autoAcceptMinScore",maxPerRun:"autoAcceptMaxPerRun",maxPerWindow:"autoAcceptMaxPerWindow",windowDays:"autoAcceptWindowDays"};function FP(e,t){let n={...e??{}};for(let[r,o]of Object.entries(t))o!==void 0&&(o===null?delete n[r]:n[r]=o);return n}u(FP,"mergeLimitOverrides");hr.patch("/settings/auto-accept",async e=>{let t=e.get("userId"),n=HP.safeParse(await e.req.json().catch(()=>({})));if(!n.success)return e.json({error:n.error.flatten()},400);let{enabled:r,projectId:o,limits:s}=n.data;if(o){let[c]=await d.select({metadata:M.metadata}).from(M).where(Ln(M.id,o));if(!c)return e.json({error:"Project not found"},404);let a=c.metadata??{},l={...a};if(r!==void 0&&(l.autoAcceptSuggestions=r),s){let m=FP(a.autoAcceptLimits,s);Object.keys(m).length>0?l.autoAcceptLimits=m:delete l.autoAcceptLimits}return await d.update(M).set({metadata:l}).where(Ln(M.id,o)),e.json({scope:"project",projectId:o,enabled:r,limits:await hi(t,o)})}let i={};r!==void 0&&(i.autoAcceptSuggestions=r);for(let[c,a]of Object.entries(BP)){let l=s?.[c];l!==void 0&&(i[a]=l)}return Object.keys(i).length>0&&await d.update(T).set(i).where(Ln(T.id,t)),e.json({scope:"account",enabled:r,limits:await hi(t,null)})});var WP=Wt.object({enabled:Wt.boolean().optional(),optOut:Wt.boolean().optional(),apply:Wt.boolean().optional(),paused:Wt.boolean().optional(),accumulate:Wt.boolean().optional(),pairs:Wt.number().int().min(1).max(1e3).optional()}).refine(e=>Object.keys(e).length>0,{message:"no settings supplied"});async function kl(e){let[t]=await d.select({paused:T.evolutionPaused}).from(T).where(Ln(T.id,e));return t?.paused??!1}u(kl,"readAccountPaused");var zP=Wt.object({paused:Wt.boolean()});hr.get("/settings/evolution-account",async e=>{let t=e.get("userId");return e.json({paused:await kl(t)})});hr.patch("/settings/evolution-account",async e=>{let t=e.get("userId"),n=zP.safeParse(await e.req.json().catch(()=>({})));return n.success?(await d.update(T).set({evolutionPaused:n.data.paused}).where(Ln(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 kl(t),o=(await d.select({id:k.id,name:k.name,autoEvolveEnabled:vs`${k.metadata}->>'autoEvolveEnabled'`,autoEvolveOptOut:vs`${k.metadata}->>'autoEvolveOptOut'`,autoEvolveApply:vs`${k.metadata}->>'autoEvolveApply'`,autoEvolvePaused:vs`${k.metadata}->>'autoEvolvePaused'`,autoEvolveAccumulate:vs`${k.metadata}->>'autoEvolveAccumulate'`,autoEvolvePairs:vs`${k.metadata}->>'autoEvolvePairs'`}).from(k).where(UP(Ln(k.userId,t),Ln(k.type,"instruction"))).orderBy(k.name)).map(i=>{let c=Tl(i,n);return{evalTargetId:i.id,name:i.name,settings:c,summary:Rl(c)}}),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 Ge(n,t))return e.json({error:"Eval target not found"},404);let[o]=await d.select({name:k.name,metadata:k.metadata}).from(k).where(Ln(k.id,n));if(!o)return e.json({error:"Eval target not found"},404);let s=Tl(o.metadata,await kl(t));return e.json({evalTargetId:n,name:o.name,settings:s,summary:Rl(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=WP.safeParse(await e.req.json().catch(()=>({})));if(!r.success)return e.json({error:r.error.flatten()},400);if(!await Ge(n,t))return e.json({error:"Eval target not found"},404);let[s]=await d.select({metadata:k.metadata}).from(k).where(Ln(k.id,n));if(!s)return e.json({error:"Eval target not found"},404);let i=yb(s.metadata,r.data);await d.update(k).set({metadata:i}).where(Ln(k.id,n));let c=Tl(i,await kl(t));return e.json({evalTargetId:n,settings:c,summary:Rl(c)})});C();import{Hono as VP}from"hono";import{and as JP,eq as KP,sql as GP}from"drizzle-orm";var Nl=new VP;Nl.get("/setup/status",async e=>{let t=e.get("userId"),[n,r,o]=await Promise.all([fb(t),d.select({id:y.id}).from(y).where(JP(KP(y.userId,t),GP`${y.origin} <> 'internal_worker'`)).limit(1),xl(t)]);return e.json({cliEverConnected:n.cliEverConnected,anyCapturedSession:r.length>0,workerActive:n.workerActive,llmEngines:o})});C();import{createHash as YP}from"node:crypto";import{Hono as XP}from"hono";import{z as An}from"zod";import{eq as _r,and as jl,desc as QP,sql as ZP}from"drizzle-orm";var Eo=new XP,eD=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({})}),tD=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()});Eo.post("/eval-targets",async e=>{let t=e.get("userId"),n=await e.req.json(),r=eD.parse(n),[o]=await d.insert(k).values({userId:t,name:r.name,type:r.type,content:r.content,description:r.description,metadata:r.metadata}).returning();return e.json(o,201)});Eo.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(ZP`${k.metadata}->>'content_hash' = ${r}`);let s=e.req.query("limit"),i=e.req.query("offset"),c=s?parseInt(s,10):NaN,a=Number.isFinite(c)?Math.min(Math.max(1,c),200):100,l=i?parseInt(i,10):NaN,m=Number.isFinite(l)?Math.max(0,l):0,p=await d.select({id:k.id,userId:k.userId,name:k.name,type:k.type,description:k.description,metadata:k.metadata,version:k.version,parentId:k.parentId,createdAt:k.createdAt,updatedAt:k.updatedAt}).from(k).where(jl(...o)).orderBy(QP(k.updatedAt)).limit(a).offset(m);return e.json(p)});Eo.get("/eval-targets/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select().from(k).where(jl(_r(k.id,n),_r(k.userId,t)));return r?e.json(r):e.json({error:"Eval target not found"},404)});Eo.post("/eval-targets/:id/sync-content",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json().catch(()=>({})),o=typeof r?.content=="string"?r.content:null;if(!o||o.trim().length===0)return e.json({error:"content is required"},400);let[s]=await d.select().from(k).where(jl(_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:{},[c]=await d.update(k).set({content:o,version:(s.version??1)+1,metadata:{...i,content_hash:YP("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:c.version})});Eo.put("/eval-targets/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=tD.parse(r),[s]=await d.select().from(k).where(jl(_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[c]=await d.insert(k).values({userId:t,name:o.name??s.name,type:s.type,content:o.content,description:o.description??s.description,metadata:o.metadata??s.metadata,version:s.version+1,parentId:s.id}).returning();return e.json(c)}let[i]=await d.update(k).set({name:o.name??s.name,description:o.description??s.description,metadata:o.metadata??s.metadata,updatedAt:new Date}).where(_r(k.id,n)).returning();return e.json(i)});C();import{Hono as nD}from"hono";import{z as Lt}from"zod";import{eq as Pl,and as Ib,isNull as rD,desc as oD}from"drizzle-orm";var Hi=new nD,sD=Lt.object({name:Lt.string().min(1).max(255),prompt:Lt.string().min(1),expectedOutput:Lt.string().default(""),files:Lt.array(Lt.unknown()).default([]),expectations:Lt.array(Lt.string()).default([])});Hi.post("/eval-targets/:id/evals",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=sD.parse(r);if(!await Ge(n,t))return e.json({error:"Eval target not found"},404);let[i]=await d.insert(Ie).values({evalTargetId:n,name:o.name,prompt:o.prompt,expectedOutput:o.expectedOutput,files:o.files,expectations:o.expectations}).returning();return e.json(i,201)});Hi.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 Ge(n,t))return e.json({error:"Eval target not found"},404);let s=await d.select().from(Ie).where(r?Pl(Ie.evalTargetId,n):Ib(Pl(Ie.evalTargetId,n),rD(Ie.retiredAt))).orderBy(oD(Ie.createdAt));return e.json(s)});var iD=Lt.object({retire:Lt.boolean().optional(),retiredReason:Lt.string().max(500).optional(),name:Lt.string().min(1).max(255).optional(),prompt:Lt.string().min(1).optional(),expectedOutput:Lt.string().optional(),files:Lt.array(Lt.unknown()).optional(),expectations:Lt.array(Lt.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"});Hi.patch("/eval-targets/:id/evals/:evalId",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=e.req.param("evalId"),o=iD.parse(await e.req.json());if(!await Ge(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[c]=await d.update(Ie).set(i).where(Ib(Pl(Ie.id,r),Pl(Ie.evalTargetId,n))).returning();return c?e.json(c):e.json({error:"Eval case not found"},404)});C();import{Hono as cD}from"hono";import{z as Ne}from"zod";import{createHash as uD}from"node:crypto";import{and as Ol,eq as rn,gte as Sb,desc as dD,sql as kg}from"drizzle-orm";C();import{eq as aD,sql as xo}from"drizzle-orm";async function Bi(e,t){let r=await d.execute(xo`
|
|
805
719
|
SELECT
|
|
806
720
|
r.configuration,
|
|
807
721
|
r.created_at,
|
|
@@ -844,7 +758,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
844
758
|
AND ev.retired_at IS NULL
|
|
845
759
|
AND r.grading->'summary'->>'pass_rate' IS NOT NULL
|
|
846
760
|
AND r.configuration IN ('with_target', 'without_target')
|
|
847
|
-
`),o=null,s=-1;for(let
|
|
761
|
+
`),o=null,s=-1;for(let O of r){if(!O.judge_model)continue;let oe=new Date(O.created_at).getTime();(oe>s||oe===s&&O.judge_model>(o??""))&&(s=oe,o=O.judge_model)}let i=null,c=-1;for(let O of r){let oe=new Date(O.created_at).getTime();oe>c&&(c=oe,i=O.methodology)}let a={with_target:{unlabeledJudge:[],labeled:[]},without_target:{unlabeledJudge:[],labeled:[]}},l={with_target:[],without_target:[]},m=0,p=new Map,_=0,I=0,h=0,f=0;for(let O of r){let oe=a[O.configuration];if(!oe)continue;let we=O.methodology!==i||O.pre_edit;O.methodology!==i&&(h+=1),O.pre_edit&&(f+=1);let Pe=O.judge_pass?1:0,xe=O.llm_annotated>=O.llm_total;if(O.llm_total>0){let Ye=O.judge_model,qt=p.get(Ye)??{runs:0,labeledRuns:0,latestRunAt:O.created_at};if(qt.runs+=1,xe&&(qt.labeledRuns+=1),new Date(O.created_at).getTime()>new Date(qt.latestRunAt).getTime()&&(qt.latestRunAt=O.created_at),p.set(Ye,qt),Ye!==o){_+=1,xe&&(I+=1);continue}}if(xe){let Ye=O.det_all_passed&&O.llm_truly_passed===O.llm_total?1:0;l[O.configuration]?.push({human:Ye,judge:Pe}),O.llm_total>0&&(m+=1)}if(!we)if(xe){let Ye=O.det_all_passed&&O.llm_truly_passed===O.llm_total?1:0;oe.labeled.push({human:Ye,judge:Pe})}else oe.unlabeledJudge.push(Pe)}let[w]=await d.select({total:xo`count(*)::int`,llmAnchors:xo`count(*) FILTER (WHERE ${Ve.judgeMethod} = 'llm' AND ${Ve.judgeModel} IS NOT DISTINCT FROM ${o})::int`,llmApproved:xo`count(*) FILTER (WHERE ${Ve.judgeMethod} = 'llm' AND ${Ve.judgeModel} IS NOT DISTINCT FROM ${o} AND ${Ve.verdict} = 'approve')::int`,staleLlmAnchors:xo`count(*) FILTER (WHERE ${Ve.judgeMethod} = 'llm' AND ${Ve.judgeModel} IS DISTINCT FROM ${o})::int`,flagged:xo`count(*) FILTER (WHERE ${Ve.flag} IS NOT NULL)::int`}).from(Ve).where(aD(Ve.evalTargetId,t)),b=a.with_target.unlabeledJudge.length+a.with_target.labeled.length+a.without_target.unlabeledJudge.length+a.without_target.labeled.length,v=await d.execute(xo`
|
|
848
762
|
SELECT
|
|
849
763
|
r.eval_target_id::text AS target_id,
|
|
850
764
|
r.configuration,
|
|
@@ -886,7 +800,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
886
800
|
AND r.grading->'summary'->>'pass_rate' IS NOT NULL
|
|
887
801
|
AND r.configuration IN ('with_target', 'without_target')
|
|
888
802
|
AND r.grading->>'judge_model' IS NOT DISTINCT FROM ${o}
|
|
889
|
-
`),S=new Map;for(let
|
|
803
|
+
`),S=new Map;for(let O of v){if(O.llm_total<=0||O.llm_annotated<O.llm_total)continue;let oe=S.get(O.target_id)??{with_target:[],without_target:[]},we=O.det_all_passed&&O.llm_truly_passed===O.llm_total?1:0,Pe=O.judge_pass?1:0;O.configuration==="with_target"?oe.with_target.push(we-Pe):oe.without_target.push(we-Pe),S.set(O.target_id,oe)}let A=u(O=>{let oe=O.length;if(oe===0)return{rectifier:0,variance:1/0,n:0};let we=O.reduce((xe,Ye)=>xe+Ye,0)/oe,Pe=oe<2?0:O.reduce((xe,Ye)=>xe+(Ye-we)**2,0)/(oe-1);return{rectifier:we,variance:Pe/oe,n:oe}},"toRectifier"),E=u(O=>O.map(oe=>oe.human-oe.judge),"selfDeltas"),R=[...S.values()].map(O=>A(O.with_target)),P=[...S.values()].map(O=>A(O.without_target)),N=Ud(A(E(l.with_target)),R),D=Ud(A(E(l.without_target)),P),q=[...S.values()].reduce((O,oe)=>O+oe.with_target.length+oe.without_target.length,0),H=m+q,B=(m>0?1:0)+[...S.values()].filter(O=>O.with_target.length+O.without_target.length>0).length,ee=N.pooledApplied||D.pooledApplied,he=B>=3&&H>=qd,te=u(O=>({rectifier:O.rectifierUsed,variance:O.variance,sufficient:he}),"asInput"),Te=b>0?hc(a.with_target,a.without_target,ee?{withPooledRectifier:te(N),withoutPooledRectifier:te(D)}:{}):null,j=If(a.with_target,a.without_target,{humanLabeledRuns:m,...ee?{pool:{withPooledRectifier:te(N),withoutPooledRectifier:te(D),totalAnchors:H,targets:B}}:{}}),me=new Map;for(let O of r){if(O.judge_model!==o||O.methodology!==i||O.pre_edit||O.pass_rate==null)continue;let oe=me.get(O.eval_id)??{name:O.eval_name,withRates:[],withoutRates:[]};O.configuration==="with_target"?oe.withRates.push(O.pass_rate):O.configuration==="without_target"&&oe.withoutRates.push(O.pass_rate),me.set(O.eval_id,oe)}let L=[],ue=[],dt=u(O=>O.length?O.reduce((oe,we)=>oe+we,0)/O.length:null,"mean_"),He=[];for(let[O,{name:oe,withRates:we,withoutRates:Pe}]of me.entries())we.length>0&&Pe.length>0?(L.push({name:oe,withPassRate:dt(we),withoutPassRate:dt(Pe)}),ue.push(O)):He.push({evalId:O,name:oe,withPassRate:dt(we),withoutPassRate:dt(Pe)});let re=hf(gf(L),{unpaired:He.length}),ge=re.gateReason?[re.gateReason,...j.reasons]:j.reasons;return{judge:{currentModel:o,models:[...p.entries()].map(([O,oe])=>({model:O,...oe})).sort((O,oe)=>new Date(oe.latestRunAt).getTime()-new Date(O.latestRunAt).getTime()),staleRuns:_,staleLabeledRuns:I,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?Pd(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:Te,powerCheck:{...j,reasons:ge},pooling:{engaged:ee,judgeModel:o,poolTargets:B,poolAnchors:H,assumedExchangeability:N.assumedExchangeability||D.assumedExchangeability,sufficient:he,withLambda:N.lambda,withoutLambda:D.lambda,tau2:N.tau2,i2:N.i2,withReason:N.reason??null,withoutReason:D.reason??null},caseDiscrimination:{total:re.total,discriminating:re.discriminating,nonDiscriminating:re.nonDiscriminating,unpaired:re.unpaired,cases:re.diagnoses.map((O,oe)=>({evalId:ue[oe],name:O.name,withPassRate:O.withPassRate,withoutPassRate:O.withoutPassRate,separation:O.separation,discriminating:O.discriminating,note:O.note})).sort((O,oe)=>O.separation-oe.separation),unpairedCases:He}}}u(Bi,"computeJudgeCalibration");async function bb(e){return(await d.execute(xo`
|
|
890
804
|
WITH current_judge AS (
|
|
891
805
|
SELECT r.grading->>'judge_model' AS model
|
|
892
806
|
FROM eval_runs r
|
|
@@ -915,7 +829,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
915
829
|
AND (SELECT count(*) FROM jsonb_array_elements(r.grading->'expectations') e
|
|
916
830
|
WHERE COALESCE(e->>'method', 'llm') = 'llm'
|
|
917
831
|
AND COALESCE(e->>'errored', 'false') <> 'true') > COALESCE(a.llm_annotated, 0)
|
|
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`
|
|
832
|
+
`))[0]?.remaining??0}u(bb,"countRunsAwaitingReview");var Is=new cD,Dl=u(e=>uD("sha256").update(e).digest("hex"),"sha256"),lD=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()}),mD=Ne.object({candidateContent:Ne.string().min(1),proposalSource:Ne.enum(["llm","groom","human"]),proposalRationale:Ne.string().default(""),pairs:Ne.array(lD).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)});Is.post("/eval-targets/:id/promotions",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=mD.parse(await e.req.json());if(!await Ge(n,t))return e.json({error:"Eval target not found"},404);let[s]=await d.select({id:k.id,content:k.content,version:k.version,metadata:k.metadata}).from(k).where(rn(k.id,n));if(!s)return e.json({error:"Eval target not found"},404);let i=s.content,c=r.candidateContent,a=r.pairs,l=Cd(a,{baseline:"prior-version"}),m=!1,p=["adequacy could not be computed for this target"];try{let P=await Bi(t,n);m=P.powerCheck.adequate,p=P.powerCheck.reasons??[]}catch(P){p=[`adequacy check failed: ${P instanceof Error?P.message:String(P)}`]}let _=r.windowDays??wc,I=r.maxPromotionsPerWindow??pi,h=new Date(Date.now()-_*24*60*60*1e3),[f]=await d.select({n:kg`count(*)::int`}).from(ie).where(Ol(rn(ie.evalTargetId,n),rn(ie.applied,!0),Sb(ie.createdAt,h))),w=f?.n??0,b=Dl(i),v=r.measuredAgainstContentHash===void 0?void 0:r.measuredAgainstContentHash===b,S=xf({verdict:l,canaryGreen:r.canaryGreen,adequate:m,adequacyReasons:p,promotionsInWindow:w,maxPromotionsPerWindow:I,immutableSections:r.immutableSections,beforeContent:i,afterContent:c,measurementMatchesPredecessor:v}),A={canaryGreen:r.canaryGreen,adequate:m,adequacyReasons:p,promotionsInWindow:w,maxPromotionsPerWindow:I,windowDays:_,immutableSections:r.immutableSections,nPairs:a.length,measurementMatchesPredecessor:v??null,measuredAgainstContentHash:r.measuredAgainstContentHash??null,cost:r.measurementCost??null,accumulation:r.accumulation?{...r.accumulation,pairs:a}:null,applied:!1},E=S.decision==="promote"&&r.apply;A.applied=E;let R;try{R=await d.transaction(async P=>{if(E){let D=s.metadata&&typeof s.metadata=="object"&&!Array.isArray(s.metadata)?s.metadata:{};await P.update(k).set({content:c,version:(s.version??1)+1,metadata:{...D,content_hash:Dl(c)},updatedAt:new Date}).where(rn(k.id,n))}let[N]=await P.insert(ie).values({userId:t,evalTargetId:n,fromContentHash:b,toContentHash:Dl(c),fromContent:i,toContent:c,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 N})}catch(P){if(P?.code==="23505")return e.json({error:"This edit has already been applied to this target",code:"PROMOTION_ALREADY_APPLIED"},409);throw P}return e.json({id: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)});Is.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 Ge(n,t))return e.json({error:"Eval target not found"},404);let i=await d.select({id:ie.id,createdAt:ie.createdAt,decision:ie.decision,applied:ie.applied,effectClass:ie.effectClass,rationale:ie.rationale,refusals:ie.refusals,proposalSource:ie.proposalSource,proposalRationale:ie.proposalRationale,fromContentHash:ie.fromContentHash,toContentHash:ie.toContentHash,touchedSections:ie.touchedSections,verdict:ie.verdict,gates:ie.gates}).from(ie).where(rn(ie.evalTargetId,n)).orderBy(dD(ie.createdAt)).limit(r).offset(o),c=await d.select({decision:ie.decision,n:kg`count(*)::int`}).from(ie).where(rn(ie.evalTargetId,n)).groupBy(ie.decision),a={promote:0,revert:0,refuse:0};for(let l of c)a[l.decision]=l.n;return e.json({promotions:i,counts:a,total:Object.values(a).reduce((l,m)=>l+m,0),limit:r,offset:o})});Is.post("/promotions/:promotionId/apply",async e=>{let t=e.get("userId"),n=e.req.param("promotionId");try{let r=await d.transaction(async o=>{let[s]=await o.select().from(ie).where(Ol(rn(ie.id,n),rn(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(rn(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 c=new Date(Date.now()-wc*864e5),[a]=await o.select({n:kg`count(*)::int`}).from(ie).where(Ol(rn(ie.evalTargetId,s.evalTargetId),rn(ie.applied,!0),Sb(ie.createdAt,c)));if((a?.n??0)>=pi)return{status:409,body:{error:`Change budget exhausted (${a?.n}/${pi} applied in ${wc}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:Dl(s.toContent)},updatedAt:new Date}).where(rn(k.id,s.evalTargetId));let m=s.gates&&typeof s.gates=="object"&&!Array.isArray(s.gates)?s.gates:{};return await o.update(ie).set({applied:!0,gates:{...m,applied:!0,appliedAt:new Date().toISOString(),appliedVia:"deferred-human-apply"}}).where(rn(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}});Is.get("/promotions/:promotionId",async e=>{let t=e.get("userId"),n=e.req.param("promotionId"),[r]=await d.select().from(ie).where(Ol(rn(ie.id,n),rn(ie.userId,t)));return r?e.json(r):e.json({error:"Promotion not found"},404)});C();import{Hono as pD}from"hono";import{z as pt}from"zod";import{eq as Qn,and as Ng,asc as fD,desc as Ab,isNull as gD,inArray as hD,sql as _D}from"drizzle-orm";var bs=new pD,yD=pt.object({jobId:pt.string().uuid().optional(),evalId:pt.string().uuid(),evalTargetId:pt.string().uuid(),evalTargetVersion:pt.number().int(),configuration:pt.enum(["with_target","without_target","baseline","with_candidate","with_prior_version"]),runNumber:pt.number().int().default(1),iteration:pt.number().int().default(1),status:pt.enum(["pending","running","completed","failed"]).default("completed"),outputs:pt.record(pt.unknown()).default({}),timing:pt.record(pt.unknown()).default({}),grading:pt.record(pt.unknown()).default({}),comparison:pt.record(pt.unknown()).nullable().optional()}),wD=pt.object({iteration:pt.number().int().default(1),runSummary:pt.record(pt.unknown()).default({}),notes:pt.array(pt.string()).default([])});bs.post("/eval-runs",async e=>{let t=e.get("userId"),n=await e.req.json(),r=yD.parse(n);if(!await Ge(r.evalTargetId,t))return e.json({error:"Eval target not found"},404);let[s]=await d.insert(ve).values({jobId:r.jobId??null,evalId:r.evalId,evalTargetId:r.evalTargetId,evalTargetVersion:r.evalTargetVersion,configuration:r.configuration,runNumber:r.runNumber,iteration:r.iteration,status:r.status,outputs:r.outputs,timing:r.timing,grading:r.grading,comparison:r.comparison??null}).onConflictDoNothing().returning();if(s)return e.json(s,201);if(!r.jobId)return e.json({error:"Insert conflicted without a jobId"},409);let[i]=await d.select().from(ve).where(Ng(Qn(ve.jobId,r.jobId),Qn(ve.evalId,r.evalId),Qn(ve.configuration,r.configuration),Qn(ve.runNumber,r.runNumber),Qn(ve.iteration,r.iteration))).limit(1);return i?e.json({...i,deduped:!0},200):e.json({error:"Run conflicted but existing row not found"},409)});bs.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 Ge(n,t))return e.json({error:"Eval target not found"},404);let i=e.req.query("limit"),c=e.req.query("offset"),a=i?parseInt(i,10):NaN,l=Number.isFinite(a)?Math.min(Math.max(1,a),100):50,m=c?parseInt(c,10):NaN,p=Number.isFinite(m)?Math.max(0,m):0,_=[Qn(ve.evalTargetId,n)];r&&_.push(Qn(ve.iteration,parseInt(r,10))),o&&_.push(Qn(ve.configuration,o)),e.req.query("activeCasesOnly")==="1"&&_.push(hD(ve.evalId,d.select({id:Ie.id}).from(Ie).where(Ng(Qn(Ie.evalTargetId,n),gD(Ie.retiredAt)))));let I=e.req.query("candidateContentHash");I&&_.push(_D`${ve.outputs}->>'candidateContentHash' = ${I}`);let h=e.req.query("jobId");if(h){let b=pt.string().uuid().safeParse(h);if(!b.success)return e.json({error:"Invalid jobId"},400);_.push(Qn(ve.jobId,b.data))}let w=(await d.select().from(ve).where(Ng(..._)).orderBy(Ab(ve.createdAt),fD(ve.id)).limit(l).offset(p)).map(b=>{let v=b.outputs??{},{diff:S,transcript:A,...E}=v,R=I?E:{...E,transcript:A};return{...b,outputs:R,comparison:null}});return e.json(w)});bs.post("/eval-targets/:id/benchmarks",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=wD.parse(r);if(!await Ge(n,t))return e.json({error:"Eval target not found"},404);let[i]=await d.insert(Vn).values({evalTargetId:n,iteration:o.iteration,runSummary:o.runSummary,notes:o.notes}).returning();return e.json(i,201)});bs.get("/eval-targets/:id/benchmarks",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await Ge(n,t))return e.json({error:"Eval target not found"},404);let o=await d.select().from(Vn).where(Qn(Vn.evalTargetId,n)).orderBy(Ab(Vn.createdAt));return e.json(o)});C();import{Hono as vD}from"hono";import{z as Mt}from"zod";import{eq as Ss,and as xb,or as ID,desc as bD,asc as SD}from"drizzle-orm";import{alias as Eb}from"drizzle-orm/pg-core";var Fi=new vD,AD=Mt.object({targetAId:Mt.string().uuid(),targetBId:Mt.string().uuid(),targetAVersion:Mt.number().int(),targetBVersion:Mt.number().int(),isSwapped:Mt.boolean(),winnerTargetId:Mt.string().uuid().nullable(),perEval:Mt.array(Mt.object({evalName:Mt.string(),winnerTargetId:Mt.string().uuid().nullable(),reasoning:Mt.string().default("")})).default([]),overall:Mt.record(Mt.unknown()).default({}),rawOutput:Mt.string().nullable().optional(),model:Mt.string().nullable().optional(),status:Mt.enum(["completed","parse_failed"]).default("completed")});Fi.post("/eval-comparisons",async e=>{let t=e.get("userId"),n=await e.req.json(),r=AD.parse(n),[o,s]=await Promise.all([Ge(r.targetAId,t),Ge(r.targetBId,t)]);if(!o||!s)return e.json({error:"Eval target not found"},404);let i=u(a=>a===null||a===r.targetAId||a===r.targetBId,"validWinner");if(!i(r.winnerTargetId)||!r.perEval.every(a=>i(a.winnerTargetId)))return e.json({error:"winnerTargetId must be one of the compared targets or null"},400);let[c]=await d.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(c,201)});Fi.get("/eval-targets/:id/comparisons",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await Ge(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,c=Number.isFinite(i)?Math.min(Math.max(1,i),100):50,a=s?parseInt(s,10):NaN,l=Number.isFinite(a)?Math.max(0,a):0,m=Eb(k,"targets_a"),p=Eb(k,"targets_b"),_=await d.select({id:Xe.id,userId:Xe.userId,targetAId:Xe.targetAId,targetBId:Xe.targetBId,targetAName:m.name,targetBName:p.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(m,Ss(Xe.targetAId,m.id)).innerJoin(p,Ss(Xe.targetBId,p.id)).where(xb(Ss(Xe.userId,t),ID(Ss(Xe.targetAId,n),Ss(Xe.targetBId,n)))).orderBy(bD(Xe.createdAt),SD(Xe.id)).limit(c).offset(l);return e.json(_.map(I=>({...I,rawOutput:null})))});Fi.get("/eval-comparisons/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=Mt.string().uuid().safeParse(n);if(!r.success)return e.json({error:"Invalid comparison id"},400);let[o]=await d.select().from(Xe).where(xb(Ss(Xe.id,r.data),Ss(Xe.userId,t)));return o?e.json(o):e.json({error:"Comparison not found"},404)});C();import{Hono as RD}from"hono";import{z as Wi}from"zod";import{eq as zi,and as jg,desc as kD,asc as ND,inArray as jD,sql as PD}from"drizzle-orm";C();import{sql as ED}from"drizzle-orm";function Tb(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)}u(Tb,"kappaFromCounts");var Rb=u((e,t)=>({agree:e,total:t,rate:t>0?e/t:null}),"slice");function xD(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:Tb({n:e.pairs,agree:e.agreeHuman,aYes:e.humanYes,bYes:e.reviewerYes}),snapshotAgreementRate:e.pairs>0?e.snapshotAgree/e.pairs:null,snapshotKappa:Tb({n:e.pairs,agree:e.snapshotAgree,aYes:e.snapshotHumanYes,bYes:e.reviewerYes}),judgeAgreementRate:e.pairs>0?e.judgeAgreeHuman/e.pairs:null,onJudgePass:Rb(e.judgePassAgree,e.judgePassPairs),onJudgeFail:Rb(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}}u(xD,"reviewerAgreementReport");async function kb(e){return(await d.execute(ED`
|
|
919
833
|
SELECT
|
|
920
834
|
j.reviewer_engine,
|
|
921
835
|
array_agg(DISTINCT j.reviewer_model) AS models,
|
|
@@ -947,7 +861,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
947
861
|
) j
|
|
948
862
|
GROUP BY j.reviewer_engine
|
|
949
863
|
ORDER BY j.reviewer_engine
|
|
950
|
-
`)).map(n=>
|
|
864
|
+
`)).map(n=>xD({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}))}u(kb,"computeReviewerAgreement");C();import{eq as TD}from"drizzle-orm";async function Fc(e,t,n={}){let{nudge:r=!0}=n;try{let[o]=await d.select({name:k.name,userId:k.userId}).from(k).where(TD(k.id,t));if(!o||o.userId!==e)return;let s=await Bi(e,t);if(s.powerCheck.adequate){await en({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 a=await xl(e);a&&!(a.claude&&a.codex)&&await en({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 `+(a.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:a}});return}if(!r)return;let i=await bb(t);if(i<=0)return;let c=s.powerCheck.reasons[0];await en({userId:e,type:"labels_needed",title:"Review needed to calibrate the judge",body:`${o.name}: ${i} graded output${i===1?"":"s"} awaiting your review.${c?` ${c}.`:""}`,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)}}u(Fc,"notifyLabelState");var Br=new RD,DD=Wi.object({verdict:Wi.enum(["approve","reject"]),flag:Wi.enum(["bad_grade","bad_assertion"]).nullable().optional(),note:Wi.string().max(2e3).nullable().optional()});async function Nb(e,t){let n=Wi.string().uuid().safeParse(e);if(!n.success)return null;let[r]=await d.select().from(ve).where(zi(ve.id,n.data));return r&&await Ge(r.evalTargetId,t)?r:null}u(Nb,"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=DD.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 Nb(n,t);if(!i)return e.json({error:"Eval run not found"},404);let c=i.grading.expectations;if(!Array.isArray(c)||s>=c.length)return e.json({error:"Expectation index out of range for this run"},400);let a=c[s];if(typeof a?.passed!="boolean")return e.json({error:"Expectation has no grade to annotate"},400);if(a.errored===!0)return e.json({error:"Expectation errored during grading \u2014 no judge verdict exists to annotate"},400);let l=a.method==="deterministic"?"deterministic":"llm",m=i.grading.judge_model??null,[p]=await d.insert(Ve).values({userId:t,evalRunId:i.id,evalTargetId:i.evalTargetId,expectationIndex:s,expectationText:a.text??"",judgePassed:a.passed,judgeMethod:l,judgeModel:m,verdict:o.verdict,flag:o.flag??null,note:o.note??null}).onConflictDoUpdate({target:[Ve.evalRunId,Ve.expectationIndex],set:{verdict:o.verdict,...o.flag!==void 0?{flag:o.flag}:{},...o.note!==void 0?{note:o.note}:{},expectationText:a.text??"",judgePassed:a.passed,judgeMethod:l,judgeModel:m,updatedAt:new Date}}).returning();await Fc(t,i.evalTargetId,{nudge:!1});try{await Sv({evalTargetId:i.evalTargetId,userId:t})}catch(_){console.error("[eval-annotations] judge-review enqueue failed:",_ instanceof Error?_.message:_)}return e.json(p)});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 Nb(n,t);return o?(await d.delete(Ve).where(jg(zi(Ve.evalRunId,o.id),zi(Ve.expectationIndex,r))).returning({id:Ve.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 Ge(n,t)?(await Fc(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 Ge(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,c=Number.isFinite(i)?Math.min(Math.max(1,i),500):200,a=s?parseInt(s,10):NaN,l=Number.isFinite(a)?Math.max(0,a):0,m=[zi(Ve.evalTargetId,n)],p=e.req.query("runId");if(p){let I=Wi.string().uuid().safeParse(p);if(!I.success)return e.json({error:"Invalid runId"},400);m.push(zi(Ve.evalRunId,I.data))}let _=await d.select().from(Ve).where(jg(...m)).orderBy(kD(Ve.createdAt),ND(Ve.id)).limit(c).offset(l);return e.json(_)});Br.get("/eval-targets/:id/judge-calibration",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await Ge(n,t))return e.json({error:"Eval target not found"},404);let[o,s]=await Promise.all([Bi(t,n),kb(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 Ge(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,c=await d.execute(PD`
|
|
951
865
|
WITH current_judge AS (
|
|
952
866
|
-- Same definition as judge-calibration: most recently stamped run's
|
|
953
867
|
-- model; empty (NULL) until any grading carries judge_model. Labeling a
|
|
@@ -992,40 +906,40 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
992
906
|
WHERE llm_total > llm_annotated
|
|
993
907
|
ORDER BY (llm_annotated > 0) DESC, random()
|
|
994
908
|
LIMIT ${i}
|
|
995
|
-
`),c
|
|
909
|
+
`),a=c.map(p=>p.id),l=a.length?await d.select().from(Ve).where(jg(zi(Ve.evalTargetId,n),jD(Ve.evalRunId,a))):[],m=new Map(l.map(p=>[`${p.evalRunId}:${p.expectationIndex}`,p]));return e.json({remaining:c[0]?.remaining??0,runs:c.map(p=>({id:p.id,configuration:p.configuration,runNumber:p.run_number,iteration:p.iteration,createdAt:p.created_at,evalName:p.eval_name,prompt:p.prompt,output:p.output,outputTruncated:p.output_truncated,expectations:(p.expectations??[]).map((_,I)=>{let h=m.get(`${p.id}:${I}`);return{index:I,text:_.text??"",passed:_.passed??!1,evidence:_.evidence??"",method:_.method==="deterministic"?"deterministic":"llm",errored:_.errored===!0,annotation:h?{verdict:h.verdict,flag:h.flag}:null}})}))})});C();import{Hono as OD}from"hono";import{z as dn}from"zod";import{eq as Mn,and as Wc,isNull as Pg,sql as Vi,inArray as CD}from"drizzle-orm";var As=new OD,LD=dn.object({evalRunId:dn.string().uuid(),expectationIndex:dn.number().int().min(0),expectationText:dn.string(),judgePassed:dn.boolean(),humanPassed:dn.boolean(),reviewerPassed:dn.boolean()}),MD=dn.object({reviewerEngine:dn.enum(["claude","codex"]),reviewerModel:dn.string().min(1).max(200),verdicts:dn.array(LD).min(1).max(500)});As.put("/eval-targets/:id/judge-reviews",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await Ge(n,t))return e.json({error:"Eval target not found"},404);let o=MD.parse(await e.req.json()),s=[...new Set(o.verdicts.map(a=>a.evalRunId))];if((await d.select({id:ve.id}).from(ve).where(Wc(CD(ve.id,s),Mn(ve.evalTargetId,n)))).length!==s.length)return e.json({error:"One or more runs do not belong to this target"},400);let c=0;for(let a of o.verdicts)await d.insert(le).values({userId:t,evalTargetId:n,evalRunId:a.evalRunId,expectationIndex:a.expectationIndex,expectationText:a.expectationText,judgePassed:a.judgePassed,humanPassed:a.humanPassed,reviewerEngine:o.reviewerEngine,reviewerModel:o.reviewerModel,reviewerPassed:a.reviewerPassed}).onConflictDoUpdate({target:[le.evalRunId,le.expectationIndex,le.reviewerModel],set:{expectationText:a.expectationText,judgePassed:a.judgePassed,humanPassed:a.humanPassed,reviewerEngine:o.reviewerEngine,reviewerPassed:a.reviewerPassed,resolvedAt:Vi`CASE WHEN ${le.reviewerPassed} <> ${a.reviewerPassed} THEN NULL ELSE ${le.resolvedAt} END`,resolution:Vi`CASE WHEN ${le.reviewerPassed} <> ${a.reviewerPassed} THEN NULL ELSE ${le.resolution} END`,updatedAt:new Date}}),c+=1;if(o.verdicts.some(a=>a.reviewerPassed!==a.humanPassed))try{let[{count:a}]=await d.select({count:Vi`count(*)::int`}).from(le).where(Wc(Mn(le.evalTargetId,n),Pg(le.resolvedAt),Vi`${le.reviewerPassed} <> ${le.humanPassed}`));if(a>0){let[l]=await d.select({name:k.name}).from(k).where(Mn(k.id,n));await en({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 ${a} of your label${a===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:a,reviewerModel:o.reviewerModel}})}}catch(a){console.error("[judge-reviews] flag notification failed:",a instanceof Error?a.message:a)}return e.json({upserted:c})});As.get("/eval-targets/:id/judge-reviews",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await Ge(n,t))return e.json({error:"Eval target not found"},404);let o=await d.select({evalRunId:le.evalRunId,expectationIndex:le.expectationIndex,reviewerEngine:le.reviewerEngine,reviewerModel:le.reviewerModel,reviewerPassed:le.reviewerPassed,humanPassed:le.humanPassed,resolvedAt:le.resolvedAt}).from(le).where(Mn(le.evalTargetId,n));return e.json(o)});As.get("/eval-targets/:id/judge-reviews/disagreements",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await Ge(n,t))return e.json({error:"Eval target not found"},404);let o=await d.select({id:le.id,evalRunId:le.evalRunId,expectationIndex:le.expectationIndex,expectationText:le.expectationText,judgePassed:le.judgePassed,humanPassed:le.humanPassed,reviewerEngine:le.reviewerEngine,reviewerModel:le.reviewerModel,reviewerPassed:le.reviewerPassed,evalName:Ie.name,configuration:ve.configuration,runNumber:ve.runNumber,outputExcerpt:Vi`LEFT(${ve.outputs}->>'transcript', 1200)`}).from(le).innerJoin(ve,Mn(ve.id,le.evalRunId)).leftJoin(Ie,Mn(Ie.id,ve.evalId)).where(Wc(Mn(le.evalTargetId,n),Pg(le.resolvedAt),Vi`${le.reviewerPassed} <> ${le.humanPassed}`)).orderBy(le.evalRunId,le.expectationIndex);return e.json(o)});var $D=dn.object({resolution:dn.enum(["kept","relabeled"])});As.patch("/judge-reviews/:id/resolve",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=dn.string().uuid().safeParse(n);if(!r.success)return e.json({error:"Invalid id"},400);let o=$D.parse(await e.req.json()),[s]=await d.select().from(le).where(Wc(Mn(le.id,r.data),Mn(le.userId,t)));if(!s)return e.json({error:"Not found"},404);let i=await d.update(le).set({resolvedAt:new Date,resolution:o.resolution,updatedAt:new Date}).where(Wc(Mn(le.evalRunId,s.evalRunId),Mn(le.expectationIndex,s.expectationIndex),Mn(le.userId,t),Pg(le.resolvedAt))).returning({id:le.id});return e.json({resolved:i.length})});C();import{createHash as UD}from"node:crypto";import{Hono as HD}from"hono";import{z as ne}from"zod";import{eq as Xt,and as Ji,desc as Og,asc as BD,sql as yr,isNull as FD}from"drizzle-orm";import{alias as jb}from"drizzle-orm/pg-core";function qD(e){if(e===null||typeof e!="object")return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}u(qD,"isPlainObject");function Cl(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=Cl(e[n]);t===null&&r!==e[n]&&(t=e.slice(0,n)),t!==null&&t.push(r)}return t??e}if(qD(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(""),c=Cl(s);if(n===null&&(i!==o||c!==s)){n={};for(let a=0;a<r;a++)n[t[a][0]]=t[a][1]}n!==null&&(n[i]=c)}return n??e}return e}u(Cl,"stripNullBytes");wl();function WD(){return{enabled:process.env.RULEMETRIC_OFFLOAD_DELTAS==="1"||process.env.RULEMETRIC_OFFLOAD_DELTAS==="true",thresholdBytes:Number(process.env.OFFLOAD_GZIP_THRESHOLD_BYTES)||49152}}u(WD,"offloadConfig");function Pb(e){return UD("sha256").update(JSON.stringify(e)).digest("hex")}u(Pb,"hashJson");function Db(e,t){return Array.isArray(e)?e:Array.isArray(t)?t:[]}u(Db,"arrayOr");function Ob(e,t){return yr`COALESCE(
|
|
996
910
|
CASE WHEN jsonb_typeof(${e}) = 'array' THEN ${e} END,
|
|
997
911
|
CASE WHEN jsonb_typeof(${t}) = 'array' THEN ${t} END,
|
|
998
912
|
'[]'::jsonb
|
|
999
|
-
)`}
|
|
913
|
+
)`}u(Ob,"resolvedJsonArray");async function zD(e){let{enabled:t,thresholdBytes:n}=WD();if(!t||e.length===0)return{messagesDelta:e,messagesDeltaRef:null};let r=pg(e);if(r.bytes<=n)return{messagesDelta:e,messagesDeltaRef:null};try{let{ref:o}=await fg(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}}}u(zD,"resolveDeltaStorage");async function Dg(e,t,n){let r=JSON.stringify(n);await d.insert(_n).values({hash:e,contentType:t,content:n,sizeBytes:Buffer.byteLength(r,"utf-8")}).onConflictDoNothing()}u(Dg,"upsertBlob");var Ki=new HD,VD=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()}),JD=100,KD=500;async function Cb(e,t){let[n]=await d.select({id:$.id,sequence:$.sequence}).from($).where(Ji(Xt($.sessionId,e),Xt($.requestHash,t))).limit(1);return n??null}u(Cb,"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=Cl(VD.parse(r)),[s]=await d.select({id:y.id,projectPath:y.projectPath,projectId:y.projectId}).from(y).where(Ji(Xt(y.id,n),Xt(y.userId,t)));if(!s)return e.json({error:"Session not found"},404);if(!s.projectPath&&o.context_items?.length){let h=o.context_items.find(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 d.select({projectId:de.projectId}).from(de).where(Xt(de.path,f)).limit(1);w=b?.projectId??null}await d.update(y).set({projectPath:f,...w?{projectId:w}:{}}).where(Ji(Xt(y.id,n),FD(y.projectPath)))}}let i=o.messages??o.messages_summary??[],c=o.messages_raw??[],a=o.request_hash??"",l=Array.isArray(o.injected_instructions)?o.injected_instructions:[o.injected_instructions];if(a){let h=await Cb(n,a);if(h)return e.json({id:h.id,sequence:h.sequence,deduplicated:!0})}let m=Pb(o.tools),p=Pb(l);await Promise.all([Dg(o.system_hash,"system_prompt",o.system_prompt),Dg(m,"tools",o.tools),Dg(p,"injected_instructions",l)]);let _={sessionId:n,userId:t,provider:o.provider,model:o.model,systemPrompt:"",injectedInstructions:[],messagesSummary:i,tools:[],systemHash:o.system_hash,toolsHash:m,injectedHash:p,requestHash:a,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}}},I=5;for(let h=0;h<=I;h++){let[f]=await d.select({sequence:$.sequence,messagesSummary:$.messagesSummary}).from($).where(Xt($.sessionId,n)).orderBy(Og($.sequence)).limit(1),w=(f?.sequence??-1)+1,b=Array.isArray(f?.messagesSummary)?f.messagesSummary:[],v=c,S=0,A=Math.min(b.length,v.length);for(;S<A&&JSON.stringify(b[S])===JSON.stringify(v[S]);)S++;let E=v.slice(S),R=await zD(E);try{let[P]=await d.insert($).values({..._,sequence:w,...R}).returning({id:$.id,sequence:$.sequence});return e.json({id:P.id,sequence:P.sequence},201)}catch(P){let N=P.cause,D=N?.constraint_name??"",q=`${P instanceof Error?P.message:""} ${N?.message??""}`.toLowerCase();if(N?.code==="23505"){if((D==="idx_snapshots_session_request"||q.includes("request"))&&a){let H=await Cb(n,a);if(H)return e.json({id:H.id,sequence:H.sequence,deduplicated:!0})}if(h<I)continue;return e.json({error:"snapshot sequence assignment failed after retries"},503)}if(q.includes("foreign key"))return e.json({error:"Session no longer exists"},404);throw P}}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")||JD),o=Math.min(Math.max(1,r),KD),s=Math.max(0,Number(e.req.query("offset")||0)),[i]=await d.select({id:y.id}).from(y).where(Ji(Xt(y.id,n),Xt(y.userId,t)));if(!i)return e.json({error:"Session not found"},404);if(!(e.req.query("full")==="true")){let l=jb(_n,"cb_tools"),m=jb(_n,"cb_injected"),_=(await d.select({id:$.id,sessionId:$.sessionId,userId:$.userId,sequence:$.sequence,provider:$.provider,model:$.model,systemHash:$.systemHash,requestHash:$.requestHash,maxTokens:$.maxTokens,temperature:$.temperature,estimatedTokens:$.estimatedTokens,capturedAt:$.capturedAt,injectedCount:yr`jsonb_array_length(${Ob(m.content,$.injectedInstructions)})`,toolsLight:yr`COALESCE((
|
|
1000
914
|
SELECT jsonb_agg(jsonb_build_object('name', t->'name', 'description', left(COALESCE(t->>'description', ''), 80)))
|
|
1001
|
-
FROM jsonb_array_elements(${
|
|
915
|
+
FROM jsonb_array_elements(${Ob(l.content,$.tools)}) AS t
|
|
1002
916
|
), '[]'::jsonb)`,metadataLight:yr`jsonb_strip_nulls(jsonb_build_object(
|
|
1003
|
-
'usage', ${
|
|
1004
|
-
'response', ${
|
|
1005
|
-
'thinking', ${
|
|
1006
|
-
'stream', ${
|
|
1007
|
-
'betaFeatures', ${
|
|
1008
|
-
'responseStatus', ${
|
|
1009
|
-
'apiMetadata', ${
|
|
917
|
+
'usage', ${$.metadata}->'usage',
|
|
918
|
+
'response', ${$.metadata}->'response',
|
|
919
|
+
'thinking', ${$.metadata}->'thinking',
|
|
920
|
+
'stream', ${$.metadata}->'stream',
|
|
921
|
+
'betaFeatures', ${$.metadata}->'betaFeatures',
|
|
922
|
+
'responseStatus', ${$.metadata}->'responseStatus',
|
|
923
|
+
'apiMetadata', ${$.metadata}->'apiMetadata',
|
|
1010
924
|
'contextItems', CASE
|
|
1011
|
-
WHEN jsonb_typeof(${
|
|
925
|
+
WHEN jsonb_typeof(${$.metadata}->'contextItems') = 'array' THEN (
|
|
1012
926
|
SELECT jsonb_agg(jsonb_build_object('type', ci->'type', 'name', ci->'name', 'estimated_tokens', ci->'estimated_tokens'))
|
|
1013
|
-
FROM jsonb_array_elements(${
|
|
927
|
+
FROM jsonb_array_elements(${$.metadata}->'contextItems') AS ci
|
|
1014
928
|
)
|
|
1015
929
|
ELSE NULL
|
|
1016
930
|
END
|
|
1017
|
-
))`}).from(
|
|
931
|
+
))`}).from($).leftJoin(l,Xt(l.hash,$.toolsHash)).leftJoin(m,Xt(m.hash,$.injectedHash)).where(Xt($.sessionId,n)).orderBy(Og($.capturedAt)).limit(o).offset(s)).map(I=>({id:I.id,sessionId:I.sessionId,userId:I.userId,sequence:I.sequence,provider:I.provider,model:I.model,systemHash:I.systemHash,requestHash:I.requestHash,maxTokens:I.maxTokens,temperature:I.temperature,estimatedTokens:I.estimatedTokens,capturedAt:I.capturedAt,metadata:I.metadataLight??{},systemPrompt:"",messagesSummary:[],tools:I.toolsLight??[],injectedInstructions:new Array(Number(I.injectedCount??0)).fill("[omitted]")}));return e.json(_)}let a=await tt.select().from($).where(Xt($.sessionId,n)).orderBy(Og($.capturedAt)).limit(o).offset(s);return e.json(await nb(await gg(a)))});Ki.get("/context-snapshots/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await tt.select().from($).where(Ji(Xt($.id,n),Xt($.userId,t)));if(!r)return e.json({error:"Snapshot not found"},404);let o=r.messagesDeltaRef?await Pc(r.messagesDeltaRef):r.messagesDelta;if(r.systemPrompt||r.tools?.length>0)return e.json(r.messagesDeltaRef?{...r,messagesDelta:o}:r);let s=[r.systemHash,r.toolsHash,r.injectedHash].filter(Boolean),i=s.length>0?await d.select().from(_n).where(yr`${_n.hash} IN (${yr.join(s.map(m=>yr`${m}`),yr`, `)})`):[],c=new Map(i.map(m=>[m.hash,m.content])),a=[],l=!1;if(o){let{messages:m,truncated:p}=await hl({fetchPage:u(async(_,I)=>Dc(await tt.select({sequence:$.sequence,messagesDelta:$.messagesDelta,messagesDeltaRef:$.messagesDeltaRef}).from($).where(Ji(Xt($.sessionId,r.sessionId),yr`${$.sequence} <= ${r.sequence}`,yr`${$.sequence} > ${_}`)).orderBy(BD($.sequence)).limit(I)),"fetchPage")});a=m,l=p}return e.json({...r,systemPrompt:c.get(r.systemHash)??r.systemPrompt??"",tools:Db(c.get(r.toolsHash??""),r.tools),injectedInstructions:Db(c.get(r.injectedHash??""),r.injectedInstructions),messagesDelta:o,messagesRaw:a,messagesTruncated:l})});C();import{Hono as GD}from"hono";import{z as To}from"zod";import{eq as Zn,and as zc,desc as YD,ne as XD}from"drizzle-orm";import{z as wr}from"zod";var Ll=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 Ro=new GD,QD=To.object({evalTargetId:To.string().uuid(),config:Ll});Ro.post("/eval-jobs",async e=>{let t=e.get("userId"),n=await e.req.json(),r=QD.parse(n),{id:o,noLiveWorker:s}=await Tt({taskName:"process_eval",payload:{evalTargetId:r.evalTargetId,config:r.config},userId:t,mirror:{userId:t,evalTargetId:r.evalTargetId,config:r.config}}),[i]=await d.select().from(Re).where(Zn(Re.id,o));return e.json({...i,noLiveWorker:s},201)});Ro.get("/eval-targets/:id/jobs",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await d.select().from(Re).where(zc(Zn(Re.evalTargetId,n),Zn(Re.userId,t))).orderBy(YD(Re.createdAt));return e.json(r)});Ro.patch("/eval-jobs/:id/progress",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),s=["running","paused"].includes(r.status)?r.status:"running",[i]=await d.update(Re).set({status:s,progress:r.progress,updatedAt:new Date}).where(zc(Zn(Re.id,n),Zn(Re.userId,t))).returning();return i?e.json(i):e.json({error:"Job not found"},404)});var ZD=To.object({status:To.enum(["running","completed","failed"]).optional(),attempts:To.number().int().nonnegative().optional(),error:To.string().optional(),result:To.record(To.unknown()).optional()});Ro.patch("/eval-jobs/:id/state",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=ZD.parse(await e.req.json()),o={updatedAt:new Date};r.attempts!==void 0&&(o.attempts=r.attempts),r.status&&(o.status=r.status),r.error&&(o.error=r.error),r.result!==void 0&&(o.result=r.result),(r.status==="completed"||r.status==="failed")&&(o.completedAt=new Date);let[s]=await d.update(Re).set(o).where(zc(Zn(Re.id,n),Zn(Re.userId,t),XD(Re.status,"cancelled"))).returning();if(!s){let[i]=await d.select().from(Re).where(zc(Zn(Re.id,n),Zn(Re.userId,t)));return i?e.json(i):e.json({error:"Job not found"},404)}return e.json(s)});Ro.post("/eval-jobs/:id/cancel",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.update(Re).set({status:"cancelled",updatedAt:new Date}).where(zc(Zn(Re.id,n),Zn(Re.userId,t))).returning();return r?e.json(r):e.json({error:"Job not found"},404)});C();import{Hono as eO}from"hono";import{z as Es}from"zod";import{eq as Vc,and as Cg,isNull as tO,desc as nO,sql as Lb}from"drizzle-orm";var Ml=new eO,rO=Es.object({contentHash:Es.string().min(1).optional(),evalTargetId:Es.string().uuid().optional(),name:Es.string().min(1).max(255),type:Es.enum(["instruction","skill","prompt","plan"]).default("instruction"),content:Es.string().optional(),sessionId:Es.string().uuid().optional(),config:Ll});async function oO(e){let t=await d.select({systemPrompt:$.systemPrompt,systemHash:$.systemHash,metadata:$.metadata}).from($).where(Lb`${$.metadata}->'contextItems' @> ${JSON.stringify([{content_hash:e}])}::jsonb`).orderBy(nO($.capturedAt)).limit(1);if(t.length===0)return null;let n=t[0],r=await vl(n.systemHash,n.systemPrompt),i=(n.metadata?.contextItems??[]).find(m=>m.content_hash===e);if(!i?.name)return r;let c=i.name.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),a=new RegExp(`Contents of [^\\n]*${c}[^\\n]*\\n([\\s\\S]*?)(?=Contents of |$)`,"i"),l=r.match(a);return l?l[1].trim():r}u(oO,"resolveContentFromSnapshot");Ml.post("/eval-from-context",async e=>{let t=e.get("userId"),n=await e.req.json(),r=rO.parse(n),o=!1,s;if(r.evalTargetId){let[_]=await d.select({id:k.id}).from(k).where(Cg(Vc(k.id,r.evalTargetId),Vc(k.userId,t))).limit(1);if(!_)return e.json({error:"Eval target not found"},404);s=_.id}else if(r.contentHash){let[_]=await d.select({id:k.id}).from(k).where(Cg(Vc(k.userId,t),Lb`${k.metadata}->>'content_hash' = ${r.contentHash}`)).limit(1);if(_)s=_.id;else{let I=r.content;if(I||(I=await oO(r.contentHash)??void 0),!I)return e.json({error:"Content not provided and could not be resolved from snapshots"},400);let[h]=await d.insert(k).values({userId:t,name:r.name,type:r.type,content:I,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 c=(await d.select({id:Ie.id}).from(Ie).where(Cg(Vc(Ie.evalTargetId,s),tO(Ie.retiredAt))).limit(1)).length===0,a=c?{...r.config,generateIfEmpty:!0}:r.config,{id:l,noLiveWorker:m}=await Tt({taskName:"process_eval",payload:{evalTargetId:s,config:a},userId:t,mirror:{userId:t,evalTargetId:s,config:a}}),[p]=await d.select().from(Re).where(Vc(Re.id,l));return e.json({evalTargetId:s,evalJobId:p.id,evalCasesCreated:0,generationDeferred:c,isNewTarget:o,noLiveWorker:m},201)});import{Hono as cC}from"hono";C();import{Hono as sO}from"hono";import{and as Mb,eq as Lg,sql as ln}from"drizzle-orm";var Mg=new sO;Mg.get("/insights/projects",async e=>{let t=e.get("userId"),n=await d.select({projectId:y.projectId,name:M.name,gitRemoteUrl:M.gitRemoteUrl,sessionCount:ln`COUNT(*)`,enrichedCount:ln`COUNT(CASE WHEN ${y.metadata}->'local_session_meta' IS NOT NULL THEN 1 END)`,analyzedCount:ln`COUNT(CASE WHEN ${y.analysis} IS NOT NULL THEN 1 END)`,firstSession:ln`MIN(${y.startedAt})`,lastSession:ln`MAX(${y.startedAt})`}).from(y).innerJoin(M,Lg(M.id,y.projectId)).where(Mb(Lg(y.userId,t),ln`${y.projectId} IS NOT NULL`)).groupBy(y.projectId,M.name,M.gitRemoteUrl),r=await d.execute(ln`
|
|
1018
932
|
select project_id, project_path, count(*)::int as n
|
|
1019
933
|
from sessions
|
|
1020
934
|
where user_id = ${t}
|
|
1021
935
|
and project_id is not null
|
|
1022
936
|
and project_path is not null
|
|
1023
937
|
group by project_id, project_path
|
|
1024
|
-
`),o=new Map,s=new Map;for(let
|
|
1025
|
-
${r}`).digest("hex")}
|
|
938
|
+
`),o=new Map,s=new Map;for(let m of r){let p=s.get(m.project_id)??-1;m.n>p&&(s.set(m.project_id,m.n),o.set(m.project_id,m.project_path))}let i=n.map(m=>({projectId:m.projectId,name:m.name,projectPath:m.projectId?o.get(m.projectId)??"":"",gitRemoteUrl:m.gitRemoteUrl,sessionCount:Number(m.sessionCount),enrichedCount:Number(m.enrichedCount),analyzedCount:Number(m.analyzedCount),firstSession:m.firstSession,lastSession:m.lastSession})),a=(await d.select({projectPath:y.projectPath,sessionCount:ln`COUNT(*)`,enrichedCount:ln`COUNT(CASE WHEN ${y.metadata}->'local_session_meta' IS NOT NULL THEN 1 END)`,analyzedCount:ln`COUNT(CASE WHEN ${y.analysis} IS NOT NULL THEN 1 END)`,firstSession:ln`MIN(${y.startedAt})`,lastSession:ln`MAX(${y.startedAt})`}).from(y).where(Mb(Lg(y.userId,t),ln`${y.projectId} IS NULL`,ln`${y.projectPath} IS NOT NULL`)).groupBy(y.projectPath)).map(m=>({projectId:null,name:(m.projectPath??"").split("/").pop()||"unknown",projectPath:m.projectPath??"",gitRemoteUrl:null,sessionCount:Number(m.sessionCount),enrichedCount:Number(m.enrichedCount),analyzedCount:Number(m.analyzedCount),firstSession:m.firstSession,lastSession:m.lastSession})),l=[...i,...a].sort((m,p)=>p.sessionCount-m.sessionCount);return e.json(l)});C();import AO from"node:fs";import EO from"node:path";import{Hono as xO}from"hono";import{and as Fg,desc as Wg,eq as jo,gte as TO,ilike as Vb,lte as RO,sql as Gi}from"drizzle-orm";C();import{createHash as iO}from"node:crypto";import{and as aO,eq as $b,inArray as cO,sql as ko}from"drizzle-orm";var uO=90,dO=.5,qb=[{category:"claude_md_additions",get:u(e=>e.suggestions?.claude_md_additions,"get"),label:u(e=>String(e.addition??"").slice(0,120),"label")},{category:"features_to_try",get:u(e=>e.suggestions?.features_to_try,"get"),label:u(e=>String(e.feature??"").slice(0,120),"label")},{category:"usage_patterns",get:u(e=>e.suggestions?.usage_patterns,"get"),label:u(e=>String(e.title??"").slice(0,120),"label")},{category:"friction_categories",get:u(e=>e.friction_analysis?.categories,"get"),label:u(e=>String(e.category??"").slice(0,120),"label")},{category:"opportunities",get:u(e=>e.on_the_horizon?.opportunities,"get"),label:u(e=>String(e.title??"").slice(0,120),"label")},{category:"impressive_workflows",get:u(e=>e.what_works?.impressive_workflows,"get"),label:u(e=>String(e.title??"").slice(0,120),"label")},{category:"project_areas",get:u(e=>e.project_areas,"get"),label:u(e=>String(e.name??"").slice(0,120),"label")}];function Ub(e,t){let n=Object.keys(t).filter(o=>o!=="id"&&o!=="timesGenerated").sort(),r=JSON.stringify(n.map(o=>[o,t[o]]));return iO("sha256").update(`${e}
|
|
939
|
+
${r}`).digest("hex")}u(Ub,"recommendationEntryHash");var lO=new Set(["42883","42P01","42704"]),mO=2,$l=!1;function pO(e){let t=e?.code;return typeof t=="string"&&lO.has(t)?"capability-absent":ec(e)||Za(e)||ti(e)||gd(e)?"load":"isolable"}u(pO,"classifyProbeFailure");function fO(e,t){return async n=>[...await d.execute(ko`
|
|
1026
940
|
SELECT p.probe_hash, m.content_hash, m.times_generated, m.last_job_id,
|
|
1027
941
|
m.dismissed_at, m.sim
|
|
1028
|
-
FROM (VALUES ${
|
|
942
|
+
FROM (VALUES ${ko.join(n.map(o=>ko`(${o.hash}::text, ${o.category}::text, ${o.label}::text)`),ko`, `)}) AS p(probe_hash, category, label)
|
|
1029
943
|
-- CROSS JOIN, not LEFT JOIN LATERAL: a probe with no row in its
|
|
1030
944
|
-- category simply produces no output row, which reads back as "no
|
|
1031
945
|
-- alias" — the same outcome the per-probe query gave via an empty
|
|
@@ -1041,10 +955,10 @@ ${r}`).digest("hex")}d(nS,"recommendationEntryHash");var aM=new Set(["42883","42
|
|
|
1041
955
|
ORDER BY sim DESC
|
|
1042
956
|
LIMIT 1
|
|
1043
957
|
) m
|
|
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`
|
|
958
|
+
`)]}u(fO,"dbProbeExecutor");async function $g(e,t,n,r=0){if(e.length===0)return[];if($l||n.aborted)return n.degraded+=e.length,[];try{return n.statements+=1,await t(e)}catch(o){let s=pO(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"&&($l=!0),s==="load"&&(n.aborted=!0),!(s==="isolable"&&r<mO&&e.length>1))return n.degraded+=e.length,[];n.bisections+=1;let c=Math.ceil(e.length/2),a=await $g(e.slice(0,c),t,n,r+1),l=await $g(e.slice(c),t,n,r+1);return[...a,...l]}}u($g,"resolveProbes");async function Hb(e){let{userId:t,jobId:n}=e,r=e.projectPath??"",o=[];for(let f of qb)for(let w of f.get(e.recs)??[]){if(w===null||typeof w!="object")continue;let b=w;o.push({category:f.category,hash:Ub(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 d.select({contentHash:Ae.contentHash,timesGenerated:Ae.timesGenerated,lastJobId:Ae.lastJobId,dismissedAt:Ae.dismissedAt}).from(Ae).where(aO($b(Ae.userId,t),$b(Ae.projectPath,r),cO(Ae.contentHash,s))),c=new Map(i.map(f=>[f.contentHash,f])),a=new Map,l=new Map;for(let f of o)c.has(f.hash)||f.label.trim().length===0||l.has(f.hash)||l.set(f.hash,f);if(l.size>0&&!$l){let f={probes:l.size,statements:0,bisections:0,degraded:0,aborted:!1},w=await $g([...l.values()],fO(t,r),f);for(let b of w)Number(b.sim)<dO||(a.set(b.probe_hash,b.content_hash),c.has(b.content_hash)||c.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}`:"")+($l?" \u2014 trigram probing disabled for this process":""),f.failure.message)}let m=u(f=>a.get(f)??f,"canonical");if(n){let f=o.filter(w=>{let b=c.get(m(w.hash));return!b||b.lastJobId!==n});if(f.length>0)try{let w=new Set,b=f.filter(v=>!w.has(m(v.hash))&&w.add(m(v.hash)));await d.insert(Ae).values(b.map(v=>({userId:t,projectPath:r,category:v.category,contentHash:m(v.hash),label:v.label,lastJobId:n}))).onConflictDoUpdate({target:[Ae.userId,Ae.projectPath,Ae.contentHash],set:{lastSeenAt:ko`now()`,timesGenerated:ko`${Ae.timesGenerated} + 1`,lastJobId:n}});for(let v of b){let S=m(v.hash),A=c.get(S);c.set(S,{contentHash:S,timesGenerated:(A?.timesGenerated??0)+1,lastJobId:n,dismissedAt:A?.dismissedAt??null})}}catch{}}let p=Date.now()-uO*24*3600*1e3,_=u(f=>{let w=c.get(f)?.dismissedAt;return w!=null&&new Date(w).getTime()>p},"suppressed"),I={...e.recs},h=u((f,w)=>{switch(f){case"claude_md_additions":case"features_to_try":case"usage_patterns":{let b={...I.suggestions};b[f]=w,I.suggestions=b;break}case"friction_categories":{I.friction_analysis={...I.friction_analysis,categories:w};break}case"opportunities":{I.on_the_horizon={...I.on_the_horizon,opportunities:w};break}case"impressive_workflows":{I.what_works={...I.what_works,impressive_workflows:w};break}case"project_areas":{I.project_areas=w;break}}},"setPath");for(let f of qb){let w=f.get(e.recs)??[];if(w.length===0)continue;let b=w.map(v=>{if(v===null||typeof v!="object")return v;let S=v,A=m(Ub(f.category,S));return{...S,id:A,timesGenerated:c.get(A)?.timesGenerated??1}}).filter(v=>v===null||typeof v!="object"?!0:!_(v.id??""));h(f.category,b)}return I}u(Hb,"applyRecommendationMemory");async function Bb(e){let t=e.projectPath??"";await d.insert(Ae).values({userId:e.userId,projectPath:t,category:"unknown",contentHash:e.contentHash,dismissedAt:ko`now()`}).onConflictDoUpdate({target:[Ae.userId,Ae.projectPath,Ae.contentHash],set:{dismissedAt:ko`now()`}})}u(Bb,"dismissRecommendation");C();var qg=[{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=qg.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"}u(No,"providerFromModelId");var Ug={provider:"anthropic",modelId:"default-sonnet-equivalent",inputPerMTok:3,outputPerMTok:15,cacheReadPerMTok:.3,cacheWrite5mPerMTok:3.75,cacheWrite1hPerMTok:6,contextWindow:2e5};function Hg(e){return qg.find(t=>t.modelId===e)}u(Hg,"findModel");var Jc=1e6;function gO(e){return Math.round(e*100)/100}u(gO,"roundCents");function ql(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),c=e.cache_creation_1h??0,a=r*t.inputPerMTok/Jc,l=o*t.outputPerMTok/Jc,m=s*t.cacheReadPerMTok/Jc,p=i*t.cacheWrite5mPerMTok/Jc,_=c*t.cacheWrite1hPerMTok/Jc,I=p+_,h=a+l+m+I;return{inputUsd:a,outputUsd:l,cacheReadUsd:m,cacheWriteUsd:I,totalUsd:gO(h),estimated:n}}u(ql,"computePrice");function Bg(e,t,n){let r=Hg(t);return ql(e,r??Ug,!r)}u(Bg,"priceUsage");C();import{and as hO,desc as _O,eq as Fb,isNull as yO,lte as wO,or as vO,gt as IO}from"drizzle-orm";function Kc(e){return e==null?0:typeof e=="number"?e:Number(e)}u(Kc,"toNumber");async function Fr(e,t,n,r,o="anthropic"){let s=await e.select().from(Qe).where(hO(Fb(Qe.provider,o),Fb(Qe.modelId,n),wO(Qe.effectiveFrom,r),vO(yO(Qe.effectiveUntil),IO(Qe.effectiveUntil,r)))).orderBy(_O(Qe.effectiveFrom)).limit(1);if(s.length===0)return Bg(t,n,r);let i=s[0];return ql(t,{inputPerMTok:Kc(i.inputPerM),outputPerMTok:Kc(i.outputPerM),cacheReadPerMTok:Kc(i.cacheReadPerM),cacheWrite5mPerMTok:Kc(i.cacheWrite5mPerM),cacheWrite1hPerMTok:Kc(i.cacheWrite1hPerM)},!1)}u(Fr,"priceUsageFromDb");var Gc=1e6,Wb=10*6e4,bO=500,xs=new Map;function SO(e,t,n){return`${e}:${t}:${n.toISOString().slice(0,7)}`}u(SO,"rateKey");function zb(e,t){let n=No(e),r=SO(n,e,t),o=xs.get(r),s=o&&Date.now()-o.at<Wb?o.rates:void 0;if(!s){s=(async()=>{let c={input_tokens:Gc},a={output_tokens:Gc},l={cache_read_input_tokens:Gc},m={cache_creation_5m:Gc},p={cache_creation_1h:Gc},[_,I,h,f,w]=await Promise.all([Fr(tt,c,e,t,n),Fr(tt,a,e,t,n),Fr(tt,l,e,t,n),Fr(tt,m,e,t,n),Fr(tt,p,e,t,n)]);return{inputPerM:_.inputUsd,outputPerM:I.outputUsd,cacheReadPerM:h.cacheReadUsd,cacheWrite5mPerM:f.cacheWriteUsd,cacheWrite1hPerM:w.cacheWriteUsd,estimated:_.estimated}})();let i=s;if(i.catch(()=>{xs.get(r)?.rates===i&&xs.delete(r)}),xs.set(r,{at:Date.now(),rates:i}),xs.size>bO)for(let[c,a]of xs)Date.now()-a.at>=Wb&&xs.delete(c)}return s}u(zb,"getRates");var Yc=new xO;function kO(e){let t=[],n=[];if(e.sessionsUsingMcp===0&&e.totalSessions>=5&&t.push({feature:"MCP Servers",one_liner:"Extend Claude with external tools via MCP",why_for_you:`Across ${e.totalSessions} sessions, you haven't used any MCP servers. MCP lets Claude access databases, APIs, and custom tools directly. Set up the RuleMetric MCP server from the /connect page in the dashboard.`,example_code:"claude mcp add <server-name> -- <command>"}),e.sessionsUsingTaskAgent===0&&e.totalSessions>=5&&t.push({feature:"Task Agents",one_liner:"Parallelize work with subagents",why_for_you:"You haven't used task agents yet. They can parallelize independent tasks \u2014 like running tests while editing code \u2014 saving significant time.",example_code:"claude -p 'Use an explore agent to map the architecture of this project, then use parallel agents to implement each change independently.'"}),e.totalToolErrors>10){let _=Object.entries(e.toolErrorCategories).sort(([,I],[,h])=>h-I)[0];_&&t.push({feature:"Hooks",one_liner:"Auto-run checks after tool calls",why_for_you:`You had ${e.totalToolErrors} tool errors, with "${_[0]}" being the most common (${_[1]}). Hooks can auto-run type-checks or linters after every edit to catch errors immediately.`,example_code:'Add to .claude/settings.json: {"hooks": {"PostToolUse": [{"matcher": "Edit|Write", "hooks": [{"type": "command", "command": "pnpm type-check 2>&1 | head -5"}]}]}}'})}if(e.totalMessages>100&&e.totalSessions>=10&&t.push({feature:"Headless Mode",one_liner:"Run Claude non-interactively for batch tasks",why_for_you:`With ${e.totalMessages} messages across ${e.totalSessions} sessions, you could automate repetitive tasks using headless mode.`,example_code:"claude -p 'Run pnpm type-check and pnpm test. Report only failures with file paths and line numbers.' --allowedTools 'Bash,Read,Grep'"}),Object.values(e.friction).reduce((_,I)=>_+I,0)>5){let I=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: ${I}. 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((_,I)=>_+I,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 c=e.friction.wrong_approach??0,a=e.friction.buggy_code??0;c+a>3&&i.push({skillId:"structured-debugging",reason:`${c+a} sessions had wrong-approach or buggy-code friction. Structured debugging prevents spiraling.`}),((e.toolErrorCategories.test_failure??e.toolErrorCategories.assertion??0)>3||(e.friction.buggy_code??0)>2)&&i.push({skillId:"tdd-workflow",reason:"Frequent test failures or buggy code suggest adopting red-green-refactor discipline."});let m=e.friction.excessive_changes??0;return m>2&&i.push({skillId:"git-commit-conventions",reason:`${m} sessions had excessive changes. Conventional commits enforce focused, atomic changes.`}),Object.entries(e.toolErrorCategories).filter(([_])=>_.includes("auth")||_.includes("security")||_.includes("permission")).reduce((_,[,I])=>_+I,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}}u(kO,"generateAutoSuggestions");var NO=45e3,Ul=new Map,jO=Il();Yc.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"),c=`${t}:${r??n??""}:${o??""}:${s??""}:${i??""}`,a=Ul.get(c),m=(a&&Date.now()-a.at<NO?a.data:null)??await jO.run(c,async()=>{let I=[jo(y.userId,t)];r?I.push(jo(y.projectId,r)):n&&I.push(Vb(y.projectPath,`%${rt(n)}%`)),i&&I.push(jo(y.tool,i)),o&&I.push(TO(y.startedAt,new Date(o))),s&&I.push(RO(y.startedAt,new Date(s)));let h=500,f=await tt.select({id:y.id,externalSessionId:y.externalSessionId,tool:y.tool,projectPath:y.projectPath,startedAt:y.startedAt,endedAt:y.endedAt,eventCount:y.eventCount,tokenUsage:y.tokenUsage,analysis:y.analysis,analyzedAt:y.analyzedAt,metadata:y.metadata}).from(y).where(Fg(...I)).orderBy(Wg(y.startedAt)).limit(h),w=1e6,b=u(async(z,fe,We)=>{let Be=await zb(fe,We),et=z.input_tokens??0,Ut=z.output_tokens??0,gn=z.cache_read_input_tokens??0,Zt=(z.cache_creation_5m??0)+(z.cache_creation_input_tokens??0),Wn=z.cache_creation_1h??0,st=et*Be.inputPerM/w,It=Ut*Be.outputPerM/w,_t=gn*Be.cacheReadPerM/w,sn=Zt*Be.cacheWrite5mPerM/w+Wn*Be.cacheWrite1hPerM/w,Ko=Math.round((st+It+_t+sn)*100)/100;return{inputUsd:st,outputUsd:It,cacheReadUsd:_t,cacheWriteUsd:sn,totalUsd:Ko,estimated:Be.estimated}},"getPriced"),v={},S={},A={},E={},R={},P={},N={},D={},q={},H={},B=[],ee=[],he=[],te=0,Te=0,j=0,me=0,L=0,ue=0,dt=0,He=0,re=0,ge=0,O=0,oe=0,we=0,Pe=0,xe=0,Ye=0,qt=0,Nr=0,Vo=0,Zr=0,bm=0,zh=0,Vh=0,Jh=0,ha=null,_a=null,iA=Date.now()-720*60*60*1e3,Sm=[],Iu="claude-sonnet-4-6",bu=u(()=>({input_tokens:0,output_tokens:0,cache_read_tokens:0,cache_write_tokens:0,cost_usd:0}),"newBucket"),Su=u((z,fe,We,Be,et,Ut)=>{z.input_tokens+=fe,z.output_tokens+=We,z.cache_read_tokens+=Be,z.cache_write_tokens+=et,z.cost_usd+=Ut},"accumulateBucket"),ya={},wa={},aA=new Map(f.map(z=>[z.id,z.startedAt])),cA=new Map(f.map(z=>[z.id,z.tool??"unknown"])),Kh=new Set,Gh=f.length>0?await tt.execute(Gi`
|
|
1045
959
|
SELECT
|
|
1046
960
|
deduped.session_id AS "sessionId",
|
|
1047
|
-
COALESCE(deduped.model, ${
|
|
961
|
+
COALESCE(deduped.model, ${Iu}) AS "model",
|
|
1048
962
|
COALESCE(SUM(COALESCE((deduped.token_usage->>'input_tokens')::bigint, (deduped.token_usage->>'input')::bigint)), 0)::bigint AS "inputTokens",
|
|
1049
963
|
COALESCE(SUM(COALESCE((deduped.token_usage->>'output_tokens')::bigint, (deduped.token_usage->>'output')::bigint)), 0)::bigint AS "outputTokens",
|
|
1050
964
|
COALESCE(SUM(COALESCE((deduped.token_usage->>'cache_read_input_tokens')::bigint, (deduped.token_usage->>'cacheRead')::bigint)), 0)::bigint AS "cacheReadTokens",
|
|
@@ -1055,29 +969,32 @@ ${r}`).digest("hex")}d(nS,"recommendationEntryHash");var aM=new Set(["42883","42
|
|
|
1055
969
|
SELECT DISTINCT ON (se.session_id, COALESCE(se.metadata->>'requestId', se.id::text))
|
|
1056
970
|
se.session_id, se.model, se.token_usage
|
|
1057
971
|
FROM session_events se
|
|
1058
|
-
WHERE se.session_id IN (${
|
|
972
|
+
WHERE se.session_id IN (${Gi.join(f.map(z=>Gi`${z.id}`),Gi`, `)})
|
|
1059
973
|
AND se.token_usage IS NOT NULL
|
|
1060
974
|
ORDER BY se.session_id, COALESCE(se.metadata->>'requestId', se.id::text), se.sequence
|
|
1061
975
|
) deduped
|
|
1062
976
|
GROUP BY deduped.session_id, deduped.model
|
|
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`
|
|
977
|
+
`):[];for(let z of Gh)Kh.add(z.sessionId);for(let z of f){let fe=z.metadata?.local_session_meta,We=z.analysis,Be=z.tokenUsage;if(z.tool&&(S[z.tool]=(S[z.tool]||0)+1),z.projectPath){let et=z.projectPath.split("/").pop()??z.projectPath;E[et]=(E[et]||0)+1}if(Be&&!Kh.has(z.id)){let et=Be.input_tokens??0,Ut=Be.output_tokens??0,gn=Be.cache_read_input_tokens??0,Zt=Be.cache_creation_5m??0,Wn=Be.cache_creation_1h??0,st=Be.cache_creation_input_tokens??0,It=Zt+Wn||st;j+=et,me+=Ut,L+=gn,ue+=It;let _t=await b(Be,Iu,z.startedAt);dt+=_t.inputUsd,He+=_t.outputUsd,re+=_t.cacheReadUsd,ge+=_t.cacheWriteUsd;let sn=_t.inputUsd+_t.outputUsd+_t.cacheReadUsd+_t.cacheWriteUsd,Ko=z.tool??"unknown",Zh=ya[Iu]??bu();Su(Zh,et,Ut,gn,It,sn),ya[Iu]=Zh;let e_=wa[Ko]??bu();Su(e_,et,Ut,gn,It,sn),wa[Ko]=e_}if(fe){Nr++;let et=fe.user_message_count??0;te+=et,Te+=(fe.duration_minutes??0)/60,O+=fe.git_commits??0,oe+=fe.git_pushes??0,we+=fe.lines_added??0,Pe+=fe.lines_removed??0,xe+=fe.files_modified??0,Ye+=fe.tool_errors??0;let Ut=fe.tool_counts;if(Ut)for(let[_t,sn]of Object.entries(Ut))v[_t]=(v[_t]||0)+sn;let gn=fe.languages;if(gn)for(let[_t,sn]of Object.entries(gn))A[_t]=(A[_t]||0)+sn;let Zt=fe.message_hours;Zt&&B.push(...Zt);let Wn=fe.tool_error_categories;if(Wn)for(let[_t,sn]of Object.entries(Wn))H[_t]=(H[_t]||0)+sn;let st=fe.user_response_times;st&&ee.push(...st),qt+=fe.user_interruptions??0,fe.uses_task_agent&&Zr++,fe.uses_mcp&&bm++;let It=fe.user_message_timestamps;It&&It.length>0&&he.push({id:z.id,start:z.startedAt.toISOString(),timestamps:It})}if(We)if(z.analyzedAt){zh++;let et=new Date(z.analyzedAt).getTime();(ha===null||et<ha)&&(ha=et),(_a===null||et>_a)&&(_a=et),et<iA&&Jh++}else Vh++;if(We){Vo++;let et=We.goal_categories;if(et)for(let[st,It]of Object.entries(et))It>0&&(R[st]=(R[st]||0)+It);let Ut=We.outcome;Ut&&(P[Ut]=(P[Ut]||0)+1);let gn=We.user_satisfaction;if(gn)for(let[st,It]of Object.entries(gn))It>0&&(N[st]=(N[st]||0)+It);let Zt=We.session_type;Zt&&(D[Zt]=(D[Zt]||0)+1);let Wn=We.friction??We.friction_counts;if(Wn)for(let[st,It]of Object.entries(Wn))It>0&&(q[st]=(q[st]||0)+It);Sm.length<50&&Sm.push({id:z.id,externalId:z.externalSessionId,date:z.startedAt.toISOString().split("T")[0]??"",summary:We.brief_summary??"",goal:We.underlying_goal,outcome:Ut})}}let Au=f.map(z=>z.startedAt.toISOString()).sort(),Am=new Set(Au.map(z=>z.split("T")[0]));for(let z of Gh){let fe=Number(z.inputTokens)||0,We=Number(z.outputTokens)||0,Be=Number(z.cacheReadTokens)||0,et=Number(z.cacheWrite5m)||0,Ut=Number(z.cacheWrite1h)||0,gn=Number(z.cacheWriteLegacy)||0,Zt=et+Ut||gn,Wn=aA.get(z.sessionId)??new Date,st=await b({input_tokens:fe,output_tokens:We,cache_read_input_tokens:Be,cache_creation_input_tokens:Zt},z.model,Wn);dt+=st.inputUsd,He+=st.outputUsd,re+=st.cacheReadUsd,ge+=st.cacheWriteUsd,j+=fe,me+=We,L+=Be,ue+=Zt;let It=st.inputUsd+st.outputUsd+st.cacheReadUsd+st.cacheWriteUsd,_t=ya[z.model]??bu();Su(_t,fe,We,Be,Zt,It),ya[z.model]=_t;let sn=cA.get(z.sessionId)??"unknown",Ko=wa[sn]??bu();Su(Ko,fe,We,Be,Zt,It),wa[sn]=Ko}let Jo=u(z=>Math.round(z*100)/100,"round2"),uA=dt+He+re+ge,dA=Jo(uA),lA={inputUsd:Jo(dt),outputUsd:Jo(He),cacheReadUsd:Jo(re),cacheWriteUsd:Jo(ge)},Em={};for(let[z,fe]of Object.entries(ya))Em[z]={input_tokens:fe.input_tokens,output_tokens:fe.output_tokens,cache_read_tokens:fe.cache_read_tokens,cache_write_tokens:fe.cache_write_tokens,cost_usd:Jo(fe.cost_usd)};let xm={};for(let[z,fe]of Object.entries(wa))xm[z]={input_tokens:fe.input_tokens,output_tokens:fe.output_tokens,cache_read_tokens:fe.cache_read_tokens,cache_write_tokens:fe.cache_write_tokens,cost_usd:Jo(fe.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 z of ee)z<10?eo["2-10s"]++:z<30?eo["10-30s"]++:z<60?eo["30s-1m"]++:z<120?eo["1-2m"]++:z<300?eo["2-5m"]++:z<900?eo["5-15m"]++:eo[">15m"]++;let Ms=[...ee].sort((z,fe)=>z-fe),mA=Ms.length>0?Ms[Math.floor(Ms.length/2)]:0,pA=Ms.length>0?Ms.reduce((z,fe)=>z+fe,0)/Ms.length:0,Yh=0,Xh=0;if(he.length>1){let z=he.flatMap(We=>We.timestamps.map(Be=>({sessionId:We.id,time:new Date(Be).getTime()}))).sort((We,Be)=>We.time-Be.time),fe=new Set;for(let We=0;We<z.length-1;We++){let Be=z[We],et=z[We+1];Be.sessionId!==et.sessionId&&et.time-Be.time<1800*1e3&&(fe.add(Be.sessionId),fe.add(et.sessionId),Yh++)}Xh=fe.size}let $s={computed:!0,total_sessions:f.length,window:{since:o??null,until:s??null},truncated:f.length>=h,sessions_with_meta:Nr,sessions_with_analysis:Vo,tools_used:S,date_range:{start:Au[0]?.split("T")[0]??"",end:Au[Au.length-1]?.split("T")[0]??""},total_messages:te,total_duration_hours:Math.round(Te*10)/10,total_input_tokens:j,total_output_tokens:me,total_cache_read_tokens:L,total_cache_write_tokens:ue,estimated_cost_usd:dA,estimated_cost_breakdown:lA,estimated_cost_by_model:Object.keys(Em).length>0?Em:void 0,estimated_cost_by_tool:Object.keys(xm).length>0?xm:void 0,tool_counts:v,languages:A,git_commits:O,git_pushes:oe,projects:E,goal_categories:R,outcomes:P,satisfaction:N,session_types:D,friction:q,tool_error_categories:H,session_summaries:Sm,total_tool_errors:Ye,total_interruptions:qt,total_lines_added:we,total_lines_removed:Pe,total_files_modified:xe,days_active:Am.size,messages_per_day:Am.size>0?Math.round(te/Am.size*10)/10:0,message_hours:B,sessions_using_task_agent:Zr,sessions_using_mcp:bm,response_time:{median_seconds:Math.round(mA*10)/10,avg_seconds:Math.round(pA*10)/10,histogram:eo,total_samples:ee.length},parallel_sessions:{events:Yh,sessions_involved:Xh},analysis_freshness:{with_timestamp:zh,pre_instrumentation:Vh,stale_30d:Jh,oldest_analyzed_at:ha?new Date(ha).toISOString():null,newest_analyzed_at:_a?new Date(_a).toISOString():null}};$s.autoAddAvailable=!!(n&&AO.existsSync(EO.join(n,"CLAUDE.md")));let Eu=[jo(W.userId,t),jo(W.status,"completed")];r?Eu.push(jo(W.projectId,r)):n?Eu.push(Vb(W.projectPath,`%${rt(n)}%`)):Eu.push(Gi`${W.projectPath} IS NULL`);let[Qh]=await tt.select({id:W.id,result:W.result}).from(W).where(Fg(...Eu)).orderBy(Wg(W.completedAt)).limit(1),fA=Qh?.result,Tm=Zp(fA?.recommendations);if(Tm&&Object.keys(Tm).length>0)$s.recommendations=Tm,$s._recsJobId=Qh?.id??null;else if(f.length>=3){let z=kO({totalSessions:f.length,sessionsWithAnalysis:Vo,toolCounts:v,toolErrorCategories:H,friction:q,outcomes:P,sessionsUsingMcp:bm,sessionsUsingTaskAgent:Zr,totalToolErrors:Ye,totalMessages:te,totalDurationHours:Te});z&&($s.recommendations=z)}return Ul.size>1e3&&Ul.clear(),Ul.set(c,{at:Date.now(),data:$s}),$s}),{_recsJobId:p,..._}=m;if(_.recommendations)try{_.recommendations=await Hb({userId:t,projectPath:n,jobId:p??null,recs:_.recommendations})}catch{}return e.json(_)});Yc.get("/insights/recommendations/history",async e=>{let t=e.get("userId"),n=e.req.query("projectPath")??"",r=await d.select({category:Ae.category,label:Ae.label,timesGenerated:Ae.timesGenerated,dismissedAt:Ae.dismissedAt,lastSeenAt:Ae.lastSeenAt}).from(Ae).where(Fg(jo(Ae.userId,t),jo(Ae.projectPath,n))).orderBy(Gi`${Ae.dismissedAt} IS NULL`,Wg(Ae.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}))})});Yc.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 Bb({userId:t,projectPath:o,contentHash:r}),e.json({ok:!0})});C();import{Hono as PO}from"hono";import{and as En,count as DO,eq as je,ilike as OO,inArray as CO,sql as mn}from"drizzle-orm";ds();var Rs=new PO,Ts=u(e=>us(e?.outcome??null),"scoreOf");Rs.get("/insights/linked-instructions",async e=>{let t=e.get("userId"),n=e.req.query("projectPath"),r=Number(e.req.query("limit")??20),o=[je(y.userId,t)];n&&o.push(OO(y.projectPath,`%${rt(n)}%`));let s=await d.select({id:g.id,name:g.name,contentHash:g.contentHash,source:mn`${g.frontmatter}->>'source'`,linkedSessions:mn`COUNT(DISTINCT ${se.sessionId})`}).from(se).innerJoin(y,je(y.id,se.sessionId)).innerJoin(g,je(g.id,se.instructionId)).where(En(...o)).groupBy(g.id,g.name,g.contentHash,mn`${g.frontmatter}->>'source'`).orderBy(mn`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)})))});Rs.get("/insights/instruction-impact",async e=>{let t=e.get("userId"),n=e.req.query("instructionId");if(!n)return e.json({error:"instructionId query param required"},400);let r=await d.select({id:y.id,projectId:y.projectId,model:y.model,tool:y.tool,tokenUsage:y.tokenUsage,analysis:y.analysis,metadata:y.metadata,eventCount:y.eventCount,startedAt:y.startedAt}).from(y).innerJoin(Z,je(Z.sessionId,y.id)).where(En(je(y.userId,t),je(Z.treatmentType,"instruction"),je(Z.treatmentId,n))),o=r.map(L=>L.id),s=await d.select({id:y.id,projectId:y.projectId,model:y.model,tool:y.tool,tokenUsage:y.tokenUsage,analysis:y.analysis,metadata:y.metadata,eventCount:y.eventCount,startedAt:y.startedAt}).from(y).where(En(je(y.userId,t),mn`${y.analysis} IS NOT NULL`)),i=await d.selectDistinct({sessionId:Z.sessionId}).from(Z).where(En(je(Z.userId,t),je(Z.treatmentType,"instruction"))),c=new Set(i.map(L=>L.sessionId)),a=new Set(o),l=s.filter(L=>!a.has(L.id)&&c.has(L.id));function m(L){let ue=0,dt=0,He=0,re=0,ge=[],O={},oe={achieved:1,fully_achieved:1,mostly_achieved:.75,partially_achieved:.5,unclear_from_transcript:.25,not_achieved:0,abandoned:0};for(let we of L){let Pe=we.analysis,xe=we.metadata?.local_session_meta;if(Pe?.outcome){let qt=oe[Pe.outcome];qt!==void 0&&ge.push(qt)}xe&&(re++,ue+=xe.tool_errors??0,dt+=xe.duration_minutes??0,He+=(xe.lines_added??0)+(xe.lines_removed??0));let Ye=Pe?.goal_categories??{};for(let[qt,Nr]of Object.entries(Ye))Nr>0&&(O[qt]=(O[qt]||0)+Nr)}return{sessionCount:L.length,enrichedCount:re,outcomeScores:ge,avgOutcomeScore:ge.length>0?Math.round(ge.reduce((we,Pe)=>we+Pe,0)/ge.length*100)/100:null,avgToolErrors:re>0?Math.round(ue/re*10)/10:null,avgDurationMinutes:re>0?Math.round(dt/re*10)/10:null,avgLinesChanged:re>0?Math.round(He/re):null,topGoalCategories:O}}u(m,"computeCohort");let p=m(r),_=m(l),I=u(L=>{if(!L)return"(no-date)";let ue=typeof L=="string"?new Date(L):L;return Number.isNaN(ue.getTime())?"(no-date)":`${ue.getUTCFullYear()}-${String(ue.getUTCMonth()+1).padStart(2,"0")}`},"monthKey"),h=u(L=>{if(!L)return 0;let ue=typeof L=="string"?new Date(L):L;return Number.isNaN(ue.getTime())?0:ue.getTime()},"timeOf"),f=new Map,w=u((L,ue,dt,He)=>{let re=`${L??"(no-project)"}|${I(ue)}`,ge=f.get(re);ge||(ge={key:re,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},f.set(re,ge)),(He?ge.withScores:ge.withoutScores).push(dt),(He?ge.withTimes:ge.withoutTimes).push(h(ue))},"addToStratum");for(let L of r){let ue=Ts(L.analysis);ue!=null&&w(L.projectId,L.startedAt,ue,!0)}for(let L of l){let ue=Ts(L.analysis);ue!=null&&w(L.projectId,L.startedAt,ue,!1)}let b=u(L=>{let ue=new Map,dt=new Set,He=u((re,ge,O,oe,we)=>{let Pe=ue.get(re);Pe||(Pe=new Map,ue.set(re,Pe));let xe=`${ge??"(no-project)"}|${I(O)}`,Ye=Pe.get(xe);Ye||(Ye={key:xe,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},Pe.set(xe,Ye)),(we?Ye.withScores:Ye.withoutScores).push(oe),(we?Ye.withTimes:Ye.withoutTimes).push(h(O))},"add");for(let re of r){let ge=Ts(re.analysis),O=L(re);ge==null||!O||(dt.add(O),He(O,re.projectId,re.startedAt,ge,!0))}for(let re of l){let ge=Ts(re.analysis),O=L(re);ge==null||!O||!dt.has(O)||He(O,re.projectId,re.startedAt,ge,!1)}return[...dt].map(re=>({segment:re,strata:[...ue.get(re)?.values()??[]]}))},"buildAxisSegments"),v=u(L=>[...L].sort((ue,dt)=>Number(dt.verdict.sufficient)-Number(ue.verdict.sufficient)||dt.verdict.nWith-ue.verdict.nWith),"sortSegs"),S=yf([...f.values()],b(L=>gs(L.model))),A=S.overall,E=v(S.segments).map(L=>({model:L.segment,verdict:L.verdict})),R=v(Md(b(L=>L.tool??null))).map(L=>({harness:L.segment,verdict:L.verdict})),{outcomeScores:P,...N}=p,{outcomeScores:D,...q}=_,[H]=await d.select({name:g.name}).from(g).where(je(g.id,n)).limit(1),[B]=await d.select({n:DO(),lastAssignedAt:mn`max(${kt.assignedAt})`}).from(kt).where(En(je(kt.userId,t),je(kt.treatmentType,"instruction"),je(kt.treatmentId,n),je(kt.method,"auto_added"))),ee=B&&Number(B.n)>0?{count:Number(B.n),lastAssignedAt:B.lastAssignedAt}:null,[he]=await d.select({content:g.content,name:g.name}).from(g).where(je(g.id,n)),te=qr(he?.content,he?.name),Te=te?(await d.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(je(Y.userId,t),je(Y.instructionId,n),je(Y.contentHash,te)))).map(L=>({projectPath:L.projectPath,decision:L.decision,delta:Number(L.delta),ciLower:Number(L.ciLower),ciUpper:Number(L.ciUpper),nTreated:L.nTreated,nControl:L.nControl,segment:L.segment,decidedAt:L.decidedAt})):[],j=await d.select({id:U.id,projectPath:U.projectPath,source:U.source,status:U.status}).from(U).where(En(je(U.userId,t),je(U.instructionId,n),je(U.status,"running"))),me=Te.length>0||j.length>0?{verdicts:Te,experiments:j}:null;return e.json({instructionId:n,instructionName:H?.name??"Unknown",verdict:A,segments:E,harnessSegments:R,autoAdded:ee,randomised:me,with:N,without:q,comparison:{outcomeScoreDelta:p.avgOutcomeScore!=null&&_.avgOutcomeScore!=null?Math.round((p.avgOutcomeScore-_.avgOutcomeScore)*100)/100:null,toolErrorsDelta:p.avgToolErrors!=null&&_.avgToolErrors!=null?Math.round((p.avgToolErrors-_.avgToolErrors)*10)/10:null,durationDelta:p.avgDurationMinutes!=null&&_.avgDurationMinutes!=null?Math.round((p.avgDurationMinutes-_.avgDurationMinutes)*10)/10:null}})});Rs.get("/insights/instruction-version-impact",async e=>{let t=e.get("userId"),n=e.req.query("instructionId");if(!n)return e.json({error:"instructionId query param required"},400);let r=await d.select({versionOrdinal:sr.versionOrdinal,contentHash:sr.contentHash,firstSeenAt:sr.firstSeenAt,contentLength:mn`COALESCE(LENGTH(${sr.content}), 0)::int`}).from(sr).where(je(sr.instructionId,n)).orderBy(sr.versionOrdinal),o=await d.select({id:y.id,projectId:y.projectId,analysis:y.analysis,startedAt:y.startedAt,version:Z.treatmentVersion}).from(y).innerJoin(Z,je(Z.sessionId,y.id)).where(En(je(y.userId,t),je(Z.treatmentType,"instruction"),je(Z.treatmentId,n),mn`${Z.treatmentVersion} > 0`)),s=new Map;for(let v of o){let S=s.get(v.version)??[];S.push(v),s.set(v.version,S)}let i=r.map(v=>({version:v.versionOrdinal,contentHash:v.contentHash,firstSeenAt:v.firstSeenAt,sessions:s.get(v.versionOrdinal)?.length??0,replayable:Number(v.contentLength)>0})),c=i.filter(v=>v.sessions>0).map(v=>v.version).sort((v,S)=>v-S),a=Number(e.req.query("version")),l=Number(e.req.query("baselineVersion")),m=Number.isFinite(a)&&a>0?a:c.at(-1),p=Number.isFinite(l)&&l>0?l:c.filter(v=>v!==m).at(-1);if(m==null||p==null)return e.json({instructionId:n,versions:i,version:m??null,baselineVersion:p??null,verdict:null,insufficientReason:"only one version of this instruction has attributed sessions; there is no prior version to compare against"});let _=u(v=>{if(!v)return"(no-date)";let S=typeof v=="string"?new Date(v):v;return Number.isNaN(S.getTime())?"(no-date)":`${S.getUTCFullYear()}-${String(S.getUTCMonth()+1).padStart(2,"0")}`},"monthKey"),I=u(v=>{if(!v)return 0;let S=typeof v=="string"?new Date(v):v;return Number.isNaN(S.getTime())?0:S.getTime()},"timeOf"),h=new Map,f=u((v,S)=>{let A=Ts(v.analysis);if(A==null)return;let E=`${v.projectId??"(no-project)"}|${_(v.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(I(v.startedAt))},"add");for(let v of s.get(m)??[])f(v,!0);for(let v of s.get(p)??[])f(v,!1);let w=In([...h.values()],{baseline:"prior-version"}),[b]=await d.select({name:g.name}).from(g).where(je(g.id,n)).limit(1);return e.json({instructionId:n,instructionName:b?.name??"Unknown",version:m,baselineVersion:p,versions:i,verdict:w,replayableVersions:i.filter(v=>v.replayable).length})});Rs.get("/insights/memory-impact",async e=>{let t=e.get("userId"),n=e.req.query("memoryId");if(!n)return e.json({error:"memoryId query param required"},400);let[r]=await d.select({id:F.id,title:F.title,kind:F.kind,version:F.version,status:F.status}).from(F).where(En(je(F.id,n),je(F.userId,t))).limit(1);if(!r)return e.json({error:"memory not found"},404);let o=await d.select({sessionId:Z.sessionId,treatmentVersion:Z.treatmentVersion}).from(Z).where(En(je(Z.userId,t),je(Z.treatmentType,"memory"),je(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 c=await d.select({id:y.id,projectId:y.projectId,outcome:mn`${y.analysis}->>'outcome'`,startedAt:y.startedAt,inputTokens:mn`coalesce((${y.tokenUsage}->>'input_tokens')::numeric, 0)`,outputTokens:mn`coalesce((${y.tokenUsage}->>'output_tokens')::numeric, 0)`}).from(y).where(En(je(y.userId,t),mn`${y.analysis} is not null`)).orderBy(y.id),a=u((f,w)=>w>0?Math.round(f/w*100)/100:null,"avg"),l=u(()=>({n:0,scoreSum:0,scoreN:0,tokenSum:0}),"cohort"),m=u(f=>f.n>0?Math.round(f.tokenSum/f.n):null,"avgTokens"),p=u(f=>{let w=s.get(f)??new Set,b=new Map,v=l(),S=l();for(let N of c){let D=w.has(N.id);if(!D&&i.has(N.id))continue;let q=D?v:S;q.n++,q.tokenSum+=Number(N.inputTokens)+Number(N.outputTokens);let H=Ts({outcome:N.outcome});if(H!=null){q.scoreSum+=H,q.scoreN++;let B=N.projectId??"(no-project)",ee=b.get(B);ee||(ee={key:B,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},b.set(B,ee)),(D?ee.withScores:ee.withoutScores).push(H),(D?ee.withTimes:ee.withoutTimes).push(N.startedAt?.getTime()??0)}}let A=In([...b.values()]),E={sessionCount:v.n,avgOutcomeScore:a(v.scoreSum,v.scoreN),avgTotalTokens:m(v)},R={sessionCount:S.n,avgOutcomeScore:a(S.scoreSum,S.scoreN),avgTotalTokens:m(S)},P={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:P}},"computeVersion"),I=[...new Set([r.version,...s.keys()])].sort((f,w)=>w-f).map(f=>({version:f,isCurrent:f===r.version,...p(f)})),h=I.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:I.map(({version:f,isCurrent:w,verdict:b,with:v,without:S})=>({version:f,isCurrent:w,verdict:b,with:v,without:S})),cost:{estimated:!0}})});var LO=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;Rs.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=>LO.test(l)))].slice(0,200);if(r.length===0)return e.json({error:"instructionIds query param (comma-separated uuids) required"},400);let o=await d.select({sessionId:Z.sessionId,treatmentId:Z.treatmentId}).from(Z).where(En(je(Z.userId,t),je(Z.treatmentType,"suggestion"),CO(Z.treatmentId,r))),s=new Map;for(let l of o){let m=s.get(l.treatmentId);m||(m=new Set,s.set(l.treatmentId,m)),m.add(l.sessionId)}let c=(await d.select({id:y.id,projectId:y.projectId,outcome:mn`${y.analysis}->>'outcome'`,startedAt:y.startedAt}).from(y).where(En(je(y.userId,t),mn`${y.analysis} is not null`)).orderBy(y.id)).map(l=>({id:l.id,key:l.projectId??"(no-project)",score:Ts({outcome:l.outcome}),time:l.startedAt?.getTime()??0})).filter(l=>l.score!=null),a={};for(let l of r){let m=s.get(l);if(!m||m.size===0){a[l]=In([]);continue}let p=new Map;for(let _ of c){let I=p.get(_.key);I||(I={key:_.key,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},p.set(_.key,I));let h=m.has(_.id);(h?I.withScores:I.withoutScores).push(_.score),(h?I.withTimes:I.withoutTimes).push(_.time)}a[l]=In([...p.values()],{iterations:2e3})}return e.json({impacts:a})});C();import{Hono as MO}from"hono";import{and as ks,count as zg,eq as xn,inArray as Jb,sql as Wr}from"drizzle-orm";var Jg=new MO,Vg=/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;Jg.get("/insights/groom-candidates",async e=>{let t=e.get("userId"),[n]=await d.select({n:zg()}).from(y).where(ks(xn(y.userId,t),Wr`${y.startedAt} > now() - interval '7 days'`));if(Number(n?.n??0)===0)return e.json({captureHealthy:!1,reason:'No sessions captured in the last 7 days \u2014 cannot tell "unused" from "uncaptured". Grooming paused (never trust a dark pipeline).',candidates:[],harmful:[],safetyGuarded:0,harmfulSafetyGuarded:0,bloated:[],trimSafetyFlagged:0});let[r,o,s,i]=await Promise.all([d.select({id:g.id,name:g.name,type:g.type,content:g.content,lastExposedAt:Wr`max(${Z.exposedAt})`,totalExposures:zg(Z.id)}).from(g).leftJoin(Z,ks(xn(Z.treatmentId,g.id),xn(Z.userId,t))).where(ks(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'`),d.select({id:g.id,name:g.name,type:g.type}).from(g).where(ks(xn(g.createdBy,t),xn(g.archived,!1))),d.select({treatmentId:Z.treatmentId,sessionId:Z.sessionId}).from(Z).where(ks(xn(Z.userId,t),xn(Z.treatmentType,"instruction"),Wr`${Z.sessionId} is not null`)),d.select({id:y.id,projectId:y.projectId,outcome:Wr`${y.analysis}->>'outcome'`,startedAt:y.startedAt}).from(y).where(ks(xn(y.userId,t),Wr`${y.analysis} is not null`))]),c=await d.select({treatmentId:Z.treatmentId,projectId:y.projectId,n:zg()}).from(Z).innerJoin(y,xn(y.id,Z.sessionId)).where(ks(xn(Z.userId,t),xn(Z.treatmentType,"instruction"),Wr`${y.projectId} is not null`)).groupBy(Z.treatmentId,y.projectId),a=new Map;for(let N of c){if(!N.projectId)continue;let D=Number(N.n),q=a.get(N.treatmentId);(!q||D>q.n||D===q.n&&N.projectId<q.projectId)&&a.set(N.treatmentId,{projectId:N.projectId,n:D})}let l=u(N=>a.get(N)?.projectId??null,"topProjectId"),m=r.filter(N=>!(N.content&&Vg.test(N.content))),p=r.length-m.length,_=m.map(N=>({id:N.id,name:N.name,type:N.type,reason:Number(N.totalExposures)===0?"never used":"not used in 30+ days",lastExposedAt:N.lastExposedAt,totalExposures:Number(N.totalExposures),topProjectId:l(N.id)})).sort((N,D)=>N.totalExposures-D.totalExposures).slice(0,50),I=new Map;for(let N of i){let D=N.outcome!=null?li[N.outcome]:void 0;D!==void 0&&I.set(N.id,{projectId:N.projectId,score:D,time:N.startedAt?.getTime()??0})}let h=new Map;for(let N of s){if(!N.sessionId)continue;let D=h.get(N.treatmentId);D||(D=new Set,h.set(N.treatmentId,D)),D.add(N.sessionId)}let f=[],w=[];for(let N of o){let D=h.get(N.id);if(!D)continue;let q=0;for(let he of D)I.has(he)&&q++;if(q<10)continue;let H=new Map;for(let[he,{projectId:te,score:Te,time:j}]of I){let me=te??"(no-project)",L=H.get(me);L||(L={key:me,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},H.set(me,L));let ue=D.has(he);(ue?L.withScores:L.withoutScores).push(Te),(ue?L.withTimes:L.withoutTimes).push(j)}let B=In([...H.values()]),ee=cs(B);ee==="harmful"?f.push({id:N.id,name:N.name,type:N.type,verdict:B,exposures:B.nWith,topProjectId:l(N.id)}):ee==="neutral"&&w.push({id:N.id,name:N.name,type:N.type,verdict:B,exposures:B.nWith,topProjectId:l(N.id)})}let b=0,v=f;if(f.length>0){let N=await d.select({id:g.id,content:g.content}).from(g).where(Jb(g.id,f.map(q=>q.id))),D=new Map(N.map(q=>[q.id,q.content]));v=f.filter(q=>{let H=D.get(q.id);return H&&Vg.test(H)?(b++,!1):!0})}v.sort((N,D)=>N.verdict.delta-D.verdict.delta);let S=1500,A=[],E=0;if(w.length>0){let N=await d.select({id:g.id,estimatedTokens:Wr`(length(${g.content}) / 4)::int`,content:g.content}).from(g).where(Jb(g.id,w.map(q=>q.id))),D=new Map(N.map(q=>[q.id,q]));for(let q of w){let H=D.get(q.id),B=Number(H?.estimatedTokens??0);if(B<S)continue;let ee=!!(H?.content&&Vg.test(H.content));ee&&E++,A.push({...q,estimatedTokens:B,containsSafetyLanguage:ee})}A.sort((q,H)=>H.estimatedTokens-q.estimatedTokens),A=A.slice(0,20)}let R=new Set(v.map(N=>N.id)),P=_.filter(N=>!R.has(N.id));return e.json({captureHealthy:!0,candidates:P,safetyGuarded:p,harmful:v,harmfulSafetyGuarded:b,bloated:A,trimSafetyFlagged:E})});C();import{Hono as $O}from"hono";import{z as Yi}from"zod";import{and as er,desc as Kb,eq as ft,getTableColumns as qO,gte as Kg,ilike as Hl,isNull as UO,ne as HO,or as BO,sql as vr}from"drizzle-orm";var Po=new $O;function FO(e,t){let n=t?Hl(W.projectPath,`%${rt(t)}%`):void 0;return e&&n?BO(ft(W.projectId,e),er(UO(W.projectId),n)):e?ft(W.projectId,e):n}u(FO,"insightsJobProjectScope");Po.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 Ur(o);if(r==="daily"){let m=new Date;m.setHours(0,0,0,0);let p=o,_=[ft(W.userId,t),Kg(W.createdAt,m)];s?_.push(ft(W.projectId,s)):p?_.push(Hl(W.projectPath,`%${rt(p)}%`)):_.push(vr`${W.projectPath} IS NULL`);let[I]=await d.select({id:W.id}).from(W).where(er(..._)).limit(1);if(I)return e.json({skipped:!0,reason:"already_generated_today",existingJobId:I.id},200);let h=[ft(W.userId,t),ft(W.status,"completed")];s?h.push(ft(W.projectId,s)):p?h.push(Hl(W.projectPath,`%${rt(p)}%`)):h.push(vr`${W.projectPath} IS NULL`);let[f]=await d.select({completedAt:W.completedAt}).from(W).where(er(...h)).orderBy(Kb(W.completedAt)).limit(1),w=f?.completedAt??new Date(0),b=[ft(y.userId,t),Kg(y.startedAt,w)];s?b.push(ft(y.projectId,s)):p&&b.push(Hl(y.projectPath,`%${rt(p)}%`));let[{count:v}]=await d.select({count:vr`COUNT(*)`}).from(y).where(er(...b));if(Number(v)<5)return e.json({skipped:!0,reason:"insufficient_sessions",sessionsSinceLastRun:Number(v),threshold:5},200)}let i=o,{id:c,noLiveWorker:a}=await Tt({taskName:"process_insights",payload:{projectPath:i,projectId:s},userId:t,mirror:{userId:t,projectPath:i,projectId:s}}),[l]=await d.select().from(W).where(ft(W.id,c));return e.json({...l,noLiveWorker:a},201)});Po.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 Ur(r??null),s=[ft(W.userId,t)],i=FO(o,r??null);i&&s.push(i);let{result:c,...a}=qO(W),l=await d.select(a).from(W).where(er(...s)).orderBy(Kb(W.createdAt)).limit(n);return e.json(l)});Po.get("/insights-jobs/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select().from(W).where(er(ft(W.id,n),ft(W.userId,t)));return r?e.json(r):e.json({error:"Job not found"},404)});Po.patch("/insights-jobs/:id/progress",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),s=["running","paused"].includes(r.status)?r.status:"running",[i]=await d.update(W).set({status:s,progress:r.progress,updatedAt:new Date}).where(er(ft(W.id,n),ft(W.userId,t))).returning();return i?e.json(i):e.json({error:"Job not found"},404)});var WO=Yi.object({status:Yi.enum(["running","completed","failed"]).optional(),attempts:Yi.number().int().nonnegative().optional(),error:Yi.string().optional(),result:Yi.record(Yi.unknown()).optional()});Po.patch("/insights-jobs/:id/state",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=WO.parse(await e.req.json()),o={updatedAt:new Date};r.attempts!==void 0&&(o.attempts=r.attempts),r.status&&(o.status=r.status),r.error&&(o.error=r.error),r.result!==void 0&&(o.result=r.result),(r.status==="completed"||r.status==="failed")&&(o.completedAt=new Date);let[s]=await d.update(W).set(o).where(er(ft(W.id,n),ft(W.userId,t),HO(W.status,"cancelled"))).returning();if(!s){let[i]=await d.select().from(W).where(er(ft(W.id,n),ft(W.userId,t)));return i?e.json(i):e.json({error:"Job not found"},404)}return e.json(s)});var zO=14400*1e3;Po.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()-zO),i=await d.select({projectId:y.projectId,sessionCount:vr`COUNT(*)`}).from(y).where(er(ft(y.userId,t),vr`${y.projectId} IS NOT NULL`)).groupBy(y.projectId).orderBy(vr`COUNT(*) DESC`),c=i.map(I=>I.projectId).filter(I=>!!I),a=new Map;if(c.length>0){let I=await d.execute(vr`
|
|
1064
978
|
SELECT DISTINCT ON (project_id) project_id, path
|
|
1065
979
|
FROM project_checkouts
|
|
1066
|
-
WHERE project_id IN (${vr.join(
|
|
980
|
+
WHERE project_id IN (${vr.join(c.map(h=>vr`${h}`),vr`, `)})
|
|
1067
981
|
ORDER BY project_id, is_worktree ASC, last_seen DESC
|
|
1068
|
-
`);for(let h of
|
|
982
|
+
`);for(let h of I)a.set(h.project_id,h.path)}let l=[],m=[],p=[],_=!1;for(let I of i){if(Number(I.sessionCount)<r||!I.projectId)continue;let h=a.get(I.projectId);if(!h){m.push({projectPath:"<unknown>",reason:"no_checkout"});continue}try{if(!o){let[v]=await d.select({id:W.id}).from(W).where(er(ft(W.userId,t),ft(W.status,"completed"),ft(W.projectPath,h),Kg(W.completedAt,s))).limit(1);if(v){m.push({projectPath:h,reason:"fresh"});continue}}let{id:f,noLiveWorker:w}=await Tt({taskName:"process_insights",payload:{projectPath:h},userId:t,mirror:{userId:t,projectPath:h}});w&&(_=!0);let[b]=await d.select().from(W).where(ft(W.id,f));b&&l.push(b)}catch(f){let w=f instanceof Error?f.message:String(f);p.push({projectPath:h,error:w})}}return e.json({created:l.length,jobs:l,skipped:m,errors:p,noLiveWorker:_},201)});C();import Bl from"node:fs";import VO from"node:path";import{createHash as JO}from"node:crypto";import{Hono as KO}from"hono";import{and as Gb,desc as GO,eq as Xc}from"drizzle-orm";var Gg=new KO;async function YO(e,t,n){try{let r=`${Id.claude_md}::${n}`,[o]=await d.select({id:g.id,version:g.version}).from(g).where(Gb(Xc(g.contextIdentity,r),Xc(g.createdBy,e),Xc(g.archived,!1))).orderBy(GO(g.createdAt)).limit(1);if(!o){let c=Bl.readFileSync(n,"utf-8"),a=JO("sha256").update(c).digest("hex"),l={name:n,description:"Project CLAUDE.md",type:"context_file",scope:"personal",version:"1.0.0"},[m]=await d.insert(g).values({name:n,description:"Project CLAUDE.md",type:"context_file",scope:"personal",scopeRef:e,version:"1.0.0",content:c,frontmatter:l,contentHash:a,contextIdentity:r,createdBy:e}).onConflictDoNothing().returning({id:g.id,version:g.version});o=m}if(!o)return null;let s=await Ur(t),[i]=await d.insert(kt).values({userId:e,treatmentType:"instruction",treatmentId:o.id,projectId:s??void 0,assignedBy:e,method:"auto_added"}).returning({id:kt.id});return i?.id??null}catch(r){return console.warn("[auto-add] failed to record treatment_assignment:",r instanceof Error?r.message:r),null}}u(YO,"recordAutoAddAssignment");Gg.post("/insights/auto-add",async e=>{let t=e.get("userId"),n=await e.req.json(),{projectPath:r,addition:o}=n;if(!r||!o)return e.json({error:"projectPath and addition are required"},400);let[s]=await d.select({id:y.id}).from(y).where(Gb(Xc(y.userId,t),Xc(y.projectPath,r))).limit(1);if(!s)return e.json({error:"projectPath is not a known project for this user"},403);let i=VO.join(r,"CLAUDE.md");if(!Bl.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 c=Bl.readFileSync(i,"utf-8");if(c.includes(o.trim()))return e.json({success:!1,reason:"already_present"},200);let a=c.endsWith(`
|
|
1069
983
|
`)?`
|
|
1070
984
|
`:`
|
|
1071
985
|
|
|
1072
|
-
`;
|
|
1073
|
-
`);let l=await
|
|
986
|
+
`;Bl.writeFileSync(i,c+a+o.trim()+`
|
|
987
|
+
`);let l=await YO(t,r,i);return e.json({success:!0,path:i,addedAt:new Date().toISOString(),assignmentId:l,tracked:l!=null})}catch(c){let a=c instanceof Error?c.message:String(c);return e.json({error:`Failed to write: ${a}`},500)}});C();import{createHash as XO}from"node:crypto";import{Hono as QO}from"hono";import{z as wt}from"zod";import{and as Yg,eq as Do,inArray as ZO,sql as Qc}from"drizzle-orm";function Yb(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"}u(Yb,"artifactTypeForFeature");function Xb(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(`
|
|
988
|
+
|
|
989
|
+
`)}u(Xb,"renderFeatureBody");function Qb(e){let t=[`## ${e.title}`];return e.lead&&t.push(e.lead),e.detail&&t.push(e.detail),e.copyable_prompt&&t.push("```\n"+e.copyable_prompt+"\n```"),t.join(`
|
|
1074
990
|
|
|
1075
|
-
`)}
|
|
1076
|
-
`)[0].replace(/^#+\s*/,"").trim();return(t.length>0?t:e.trim()).slice(0,80)}
|
|
991
|
+
`)}u(Qb,"renderAdviceBody");var Xg=new QO,eC=wt.object({projectPath:wt.string().min(1),additions:wt.array(wt.object({addition:wt.string().min(12).max(4e3),why:wt.string().max(2e3).default("")})).max(20).default([]),skills:wt.array(wt.object({skillId:wt.string().min(1).max(200),reason:wt.string().max(2e3).default("")})).max(20).default([]),features:wt.array(wt.object({feature:wt.string().min(2).max(200),one_liner:wt.string().max(1e3).default(""),why_for_you:wt.string().max(4e3).default(""),example_code:wt.string().max(8e3).default("")})).max(20).default([]),advice:wt.array(wt.object({title:wt.string().min(2).max(200),lead:wt.string().max(4e3).default(""),detail:wt.string().max(8e3).default(""),copyable_prompt:wt.string().max(8e3).default(""),origin:wt.enum(["usage_pattern","opportunity"])})).max(40).default([])}),Zb=.5,e0=.4,t0=u(e=>XO("sha256").update(e.trim()).digest("hex"),"hashAddition");function n0(e){let t=e.trim().split(`
|
|
992
|
+
`)[0].replace(/^#+\s*/,"").trim();return(t.length>0?t:e.trim()).slice(0,80)}u(n0,"deriveName");Xg.post("/insights/recommendations/nominate",async e=>{let t=e.get("userId"),n=eC.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,advice:c}=n.data,a=[],l=0,m=0,p=0,_=0,I=[];async function h(v){let S=gi(v.body);if(S.length>0)return I.push({name:v.name.slice(0,80),placeholders:S.map(P=>P.token)}),null;let A=t0(v.body),[E]=await d.select({id:g.id}).from(g).where(Yg(Do(g.createdBy,t),Do(g.contentHash,A),Do(g.archived,!1))).limit(1);if(E)return{id:E.id,created:!1};let[R]=await d.insert(g).values({name:v.name.slice(0,80),description:(v.body.split(`
|
|
993
|
+
`).find(P=>P.trim()&&!P.startsWith("#"))??"Suggested by insights").slice(0,500),type:v.type,scope:"personal",scopeRef:t,version:"1.0.0",content:v.body,frontmatter:{source:"insights",artifactType:v.type,origin:v.origin,projectPath:r,proposedAt:new Date().toISOString()},createdBy:t,contentHash:A}).returning({id:g.id});return{id:R.id,created:!0}}if(u(h,"materialise"),s.length>0){let v=s.flatMap(E=>[E.skillId,`skills--${E.skillId}`]),S=await d.select({id:g.id,name:g.name}).from(g).where(Yg(Do(g.type,"skill"),Do(g.archived,!1),ZO(g.name,v))),A=new Map(S.map(E=>[E.name,E.id]));for(let E of s){let R=A.get(`skills--${E.skillId}`)??A.get(E.skillId);if(!R){l+=1;continue}a.push({instructionId:R,reason:E.reason||"Recommended by insights",score:Zb})}}for(let v of o){let S=gi(v.addition);if(S.length>0){I.push({name:n0(v.addition),placeholders:S.map(P=>P.token)});continue}let A=t0(v.addition),[E]=await d.select({id:g.id}).from(g).where(Yg(Do(g.createdBy,t),Do(g.contentHash,A),Do(g.archived,!1))).limit(1),R=E?.id;if(!R){let[P]=await d.insert(g).values({name:n0(v.addition),description:v.why.slice(0,500)||"Proposed by insights from your session history",type:"instruction",scope:"personal",scopeRef:t,version:"1.0.0",content:v.addition,frontmatter:{source:"insights",projectPath:r,proposedAt:new Date().toISOString()},createdBy:t,contentHash:A}).returning({id:g.id});R=P.id,m+=1}a.push({instructionId:R,reason:v.why||"Proposed by insights from your session history",score:Zb})}for(let v of i){let S=await h({name:v.feature,body:Xb(v),type:Yb(v.feature),origin:"features_to_try"});S&&(S.created&&(p+=1),a.push({instructionId:S.id,reason:v.why_for_you||v.one_liner||"Suggested by insights from your session history",score:e0}))}for(let v of c){let S=await h({name:v.title,body:Qb(v),type:"feature",origin:v.origin});S&&(S.created&&(_+=1),a.push({instructionId:S.id,reason:v.lead||v.detail||"Surfaced by insights from your session history",score:e0}))}if(a.length===0)return e.json({nominated:0,additionsCreated:0,featuresCreated:0,adviceCreated:0,skillsUnresolved:l,additionsRejected:I});let f=new Set,w=a.filter(v=>f.has(v.instructionId)?!1:(f.add(v.instructionId),!0)).map(v=>({userId:t,instructionId:v.instructionId,projectPath:r,projectId:null,score:v.score,reason:v.reason,kind:"add",generatedAt:new Date,isStale:!1})),b=await Ur(r);for(let v of w)v.projectId=b;return await d.insert(x).values(w).onConflictDoUpdate({target:[x.userId,x.projectPath,x.instructionId,x.kind],set:{score:Qc`excluded.score`,reason:Qc`excluded.reason`,generatedAt:Qc`excluded.generated_at`,isStale:Qc`false`,dismissedAt:Qc`CASE WHEN ${x.dismissedAt} IS NOT NULL AND ${x.dismissedAt} >= now() - interval '30 days' THEN ${x.dismissedAt} ELSE NULL END`}}),e.json({nominated:w.length,additionsCreated:m,featuresCreated:p,adviceCreated:_,skillsUnresolved:l,additionsRejected:I})});C();import{Hono as tC}from"hono";import{and as nC,desc as rC,eq as Qg,isNotNull as oC}from"drizzle-orm";var Zg=new tC;Zg.get("/insights/evidence",async e=>{let t=e.get("userId"),n=e.req.query("projectPath");if(!n)return e.json({error:"projectPath is required"},400);let[r]=await d.select({result:W.result,completedAt:W.completedAt}).from(W).where(nC(Qg(W.userId,t),Qg(W.projectPath,n),Qg(W.status,"completed"),oC(W.result))).orderBy(rC(W.completedAt)).limit(1);if(!r)return e.json({analyzedAt:null,friction:[],whatWorks:[]});let o=u(m=>typeof m=="string"&&m.trim().length>0,"isStr"),s=u(m=>m!==null&&typeof m=="object"&&!Array.isArray(m),"isRecord"),i=r.result,c=s(i)&&s(i.recommendations)?i.recommendations:void 0,a=u(m=>Array.isArray(m)?m.flatMap(p=>{if(typeof p=="string")return p.trim()?[p.trim()]:[];if(s(p)){let _=p,I=[_.title,_.category,_.pattern].find(o),h=[_.detail,_.description,_.summary,Array.isArray(_.examples)?_.examples.find(o):void 0].find(o),f=[I,h].filter(o).join(" \u2014 ");return f?[f]:[]}return[]}):o(m)?[m.trim()]:[],"asLines"),l=u((m,p)=>{if(Array.isArray(m))return m;if(s(m)){let _=m[p];if(Array.isArray(_))return _}return[]},"listAt");return e.json({analyzedAt:r.completedAt,friction:a(l(c?.friction_analysis,"categories")).slice(0,8),whatWorks:a(l(c?.what_works,"impressive_workflows")).slice(0,8)})});C();import{Hono as sC}from"hono";import{and as eh,eq as Ns,inArray as r0,isNotNull as iC,or as aC,sql as th}from"drizzle-orm";var nh=new sC;nh.get("/insights/provenance-impact",async e=>{let t=e.get("userId"),n=await d.select({treatmentId:Z.treatmentId,sessions:th`count(distinct ${Z.sessionId})::int`}).from(Z).where(eh(Ns(Z.userId,t),Ns(Z.treatmentType,"instruction"))).groupBy(Z.treatmentId),r=n.map(h=>h.treatmentId),o=await d.select({id:g.id,name:g.name,source:th`${g.frontmatter}->>'source'`,createdBy:g.createdBy,scope:g.scope}).from(g).where(eh(Ns(g.archived,!1),r.length>0?aC(Ns(g.createdBy,t),r0(g.id,r)):Ns(g.createdBy,t))).limit(5e3),s=new Map(o.map(h=>[h.id,xd(h,t)])),i=o.map(h=>h.id),c=await d.select({instructionId:Y.instructionId,decision:Y.decision,delta:Y.delta}).from(Y).where(Ns(Y.userId,t)),a=i.length>0?await d.select({instructionId:x.instructionId,n:th`count(*)::int`}).from(x).where(eh(Ns(x.userId,t),iC(x.acceptedAt),r0(x.instructionId,i))).groupBy(x.instructionId):[],l=new Map,m=u(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"),p=new Map(n.map(h=>[h.treatmentId,Number(h.sessions)]));for(let h of o){let f=xd(h,t),w=p.get(h.id)??0;if(f==="catalog"&&w===0)continue;let b=m(f);b.instructions+=1,w>0&&(b.exposedInstructions+=1,b.exposedSessions+=w)}for(let h of a){let f=s.get(h.instructionId);f&&(m(f).accepted+=Number(h.n))}let _=new Map;for(let h of c){let f=s.get(h.instructionId);if(!f)continue;m(f).randomisedVerdicts+=1;let w=_.get(f)??{sum:0,n:0};w.sum+=Number(h.delta),w.n+=1,_.set(f,w)}for(let[h,f]of _){let w=m(h);w.meanDelta=f.n>0?f.sum/f.n:null,w.evidenceClass=f.n>0?"randomised":"none"}let I=["insights","evolution","user","catalog"];return e.json({groups:I.filter(h=>l.has(h)).map(h=>l.get(h)),measurable:c.length>0,note:c.length===0?"No randomised verdicts exist yet, so no group is measurable. Exposure counts show reach, not effect.":null})});var $n=new cC;$n.route("/",Mg);$n.route("/",Yc);$n.route("/",Rs);$n.route("/",Jg);$n.route("/",Po);$n.route("/",Xg);$n.route("/",Zg);$n.route("/",nh);$n.route("/",Gg);C();import{Hono as uC}from"hono";import{z as ot}from"zod";import{and as qn,desc as Fl,eq as Ze,sql as on}from"drizzle-orm";var pn=new uC,rh=["fact","decision","correction","convention"],o0=4e3,dC=ot.object({kind:ot.enum(rh),title:ot.string().min(1).max(300),body:ot.string().min(1).max(o0),projectId:ot.string().uuid().optional(),projectPath:ot.string().optional(),source:ot.enum(["manual","distilled"]).optional()}),lC=ot.object({kind:ot.enum(rh).optional(),title:ot.string().min(1).max(300).optional(),body:ot.string().min(1).max(o0).optional(),status:ot.enum(["active","archived"]).optional()});async function oh(e){if(!e)return null;try{let[t]=await d.select({projectId:de.projectId}).from(de).where(Ze(de.path,e)).orderBy(Fl(de.lastSeen)).limit(1);if(t)return t.projectId;let[n]=await d.select({id:M.id}).from(M).where(Ze(M.gitRemoteUrl,e)).limit(1);return n?.id??null}catch{return null}}u(oh,"resolveProjectId");pn.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),c=Number(e.req.query("offset")??"0"),a=Math.max(Number.isFinite(c)?c:0,0),l=e.req.query("rank"),m=n??await oh(r??null),p=[Ze(F.userId,t)];o!=="all"&&p.push(Ze(F.status,o));let _=e.req.query("kind");_&&rh.includes(_)&&p.push(Ze(F.kind,_));let I=e.req.query("search")?.trim();if(I){let b=`%${rt(I)}%`;p.push(on`(${F.title} ilike ${b} or ${F.body} ilike ${b})`)}(n||r)&&p.push(m?on`(${F.projectId} = ${m} or ${F.projectId} is null)`:on`${F.projectId} is null`);let h=on`${F.trustVersion} = ${F.version}`;l==="trust"&&p.push(on`coalesce(${F.trustClass} = 'harmful' and ${h}, false) = false`);let f=on`case
|
|
1077
994
|
when ${F.source} = 'manual' or (${F.trustClass} = 'helpful' and ${h}) then 0
|
|
1078
995
|
when ${F.trustClass} = 'neutral' and ${h} then 1
|
|
1079
996
|
else 2
|
|
1080
|
-
end`,w=await
|
|
997
|
+
end`,w=await d.select({id:F.id,version:F.version,kind:F.kind,title:F.title,body:F.body,source:F.source,status:F.status,projectId:F.projectId,createdAt:F.createdAt,updatedAt:F.updatedAt}).from(F).where(qn(...p)).orderBy(...l==="trust"?[f,Fl(F.updatedAt)]:[Fl(F.updatedAt)]).limit(i).offset(l==="trust"?0:a);return e.json({memories:w})});pn.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,c=Number(n.minRank),a=Number.isFinite(c)?Math.min(Math.max(c,0),1):i,l=Array.isArray(n.excludeIds)?n.excludeIds.filter(w=>typeof w=="string").slice(0,500):[],m=typeof n.projectId=="string"?n.projectId:void 0,p=typeof n.projectPath=="string"?n.projectPath:void 0,_=m??await oh(p??null),I=m||p?_?on`(m.project_id = ${_} or m.project_id is null)`:on`m.project_id is null`:on`true`,h=l.length?on`and m.id not in (${on.join(l.map(w=>on`${w}::uuid`),on`, `)})`:on``,f=await d.execute(on`
|
|
1081
998
|
with raw as (
|
|
1082
999
|
select websearch_to_tsquery('english', ${r})::text as t
|
|
1083
1000
|
), q as (
|
|
@@ -1089,7 +1006,7 @@ ${r}`).digest("hex")}d(nS,"recommendationEntryHash");var aM=new Set(["42883","42
|
|
|
1089
1006
|
from memories m, q
|
|
1090
1007
|
where m.user_id = ${t}
|
|
1091
1008
|
and m.status = 'active'
|
|
1092
|
-
and ${
|
|
1009
|
+
and ${I}
|
|
1093
1010
|
and coalesce(m.trust_class = 'harmful' and m.trust_version = m.version, false) = false
|
|
1094
1011
|
${h}
|
|
1095
1012
|
and q.query is not null
|
|
@@ -1101,14 +1018,14 @@ ${r}`).digest("hex")}d(nS,"recommendationEntryHash");var aM=new Set(["42883","42
|
|
|
1101
1018
|
-- memories into context AND stamp false exposures. The floor (default 0.035,
|
|
1102
1019
|
-- clamped to >= 0) subsumes the old rank-zero negation guard AND cuts the weak
|
|
1103
1020
|
-- single-word overlap band, keeping only memories with real topical overlap.
|
|
1104
|
-
and ts_rank(m.search_tsv, q.query) > ${
|
|
1021
|
+
and ts_rank(m.search_tsv, q.query) > ${a}
|
|
1105
1022
|
order by ts_rank(m.search_tsv, q.query) desc,
|
|
1106
1023
|
case when m.source = 'manual' or (m.trust_class = 'helpful' and m.trust_version = m.version) then 0
|
|
1107
1024
|
when m.trust_class = 'neutral' and m.trust_version = m.version then 1
|
|
1108
1025
|
else 2 end,
|
|
1109
1026
|
m.updated_at desc
|
|
1110
1027
|
limit ${s}
|
|
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.
|
|
1028
|
+
`);return e.json({memories:[...f]})});pn.get("/memories/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select().from(F).where(qn(Ze(F.id,n),Ze(F.userId,t))).limit(1);return r?e.json(r):e.json({error:"not found"},404)});pn.post("/memories",async e=>{let t=e.get("userId"),n=dC.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:c,source:a}=n.data,l=i??await oh(c??null),[m]=await d.select({orgId:T.activeOrgId}).from(T).where(Ze(T.id,t)).limit(1),[p]=await d.insert(F).values({userId:t,orgId:m?.orgId??null,projectId:l,kind:r,title:o,body:s,source:a??"manual",status:"active"}).returning();return e.json(p,201)});pn.patch("/memories/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=lC.safeParse(await e.req.json().catch(()=>({})));if(!r.success)return e.json({error:"invalid body",details:r.error.flatten()},400);let[o]=await d.select().from(F).where(qn(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:c,status:a}=r.data,l=s!==void 0&&s!==o.kind||i!==void 0&&i!==o.title||c!==void 0&&c!==o.body,[m]=await d.update(F).set({kind:s??o.kind,title:i??o.title,body:c??o.body,status:a??o.status,version:l?o.version+1:o.version,updatedAt:new Date}).where(qn(Ze(F.id,n),Ze(F.userId,t))).returning();return e.json(m)});pn.delete("/memories/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.update(F).set({status:"archived",updatedAt:new Date}).where(qn(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 mC=ot.object({externalSessionId:ot.string().min(1),projectPath:ot.string().optional()});pn.post("/memories/:id/exposures",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=mC.safeParse(await e.req.json().catch(()=>({})));if(!r.success)return e.json({error:"invalid body",details:r.error.flatten()},400);let[o]=await d.select({id:F.id,version:F.version,projectId:F.projectId}).from(F).where(qn(Ze(F.id,n),Ze(F.userId,t))).limit(1);return o?(await d.insert(qu).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 pC=ot.object({taskPrompt:ot.string().min(1).max(8e3),expectations:ot.array(ot.string().min(1)).min(1).max(20),trials:ot.number().int().min(1).max(50).default(10),model:ot.string().min(1).max(100).optional()});pn.post("/memories/:id/experiments",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=pC.safeParse(await e.req.json().catch(()=>({})));if(!r.success)return e.json({error:"invalid body",details:r.error.flatten()},400);let[o]=await d.select({id:F.id,version:F.version}).from(F).where(qn(Ze(F.id,n),Ze(F.userId,t))).limit(1);if(!o)return e.json({error:"not found"},404);let[s]=await d.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 Av({experimentId:s.id,userId:t});return e.json({experiment:s,noLiveWorker:i},201)});pn.get("/memories/:id/experiments",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select({id:F.id}).from(F).where(qn(Ze(F.id,n),Ze(F.userId,t))).limit(1);if(!r)return e.json({error:"not found"},404);let o=await d.select().from(Nt).where(qn(Ze(Nt.memoryId,n),Ze(Nt.userId,t))).orderBy(Fl(Nt.createdAt)).limit(20);return e.json({experiments:o})});pn.get("/memory-experiments/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select().from(Nt).where(qn(Ze(Nt.id,n),Ze(Nt.userId,t))).limit(1);return r?e.json(r):e.json({error:"not found"},404)});var fC=ot.object({status:ot.enum(["running","completed","failed"]),error:ot.string().max(1e3).nullable().optional(),result:ot.record(ot.unknown()).optional()});pn.patch("/memory-experiments/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=fC.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,[c]=await d.select({id:Nt.id,status:Nt.status}).from(Nt).where(qn(Ze(Nt.id,n),Ze(Nt.userId,t))).limit(1);if(!c)return e.json({error:"not found"},404);if(c.status==="completed"||c.status==="failed")return e.json({error:`experiment is already terminal (status='${c.status}')`,code:"INVALID_STATE"},409);let a=o==="completed"||o==="failed",[l]=await d.update(Nt).set({status:o,...s!==void 0?{error:s}:{},...i!==void 0?{result:i}:{},...o==="running"?{startedAt:new Date}:{},...a?{completedAt:new Date}:{}}).where(qn(Ze(Nt.id,n),Ze(Nt.userId,t))).returning();return e.json(l)});C();import{randomBytes as gC,createHash as hC}from"node:crypto";import{Hono as _C}from"hono";import{z as s0}from"zod";import{eq as Wl,and as yC,isNull as wC}from"drizzle-orm";var Xi=new _C;function vC(){let n=`rm_${gC(32).toString("base64url")}`,r=hC("sha256").update(n).digest("hex"),o=n.slice(0,11);return{plaintext:n,hash:r,prefix:o}}u(vC,"generateApiKey");var IC=s0.object({name:s0.string().min(1).max(100)});Xi.post("/auth/api-keys",async e=>{let t=e.get("userId"),n=await e.req.json(),r=IC.parse(n),{plaintext:o,hash:s,prefix:i}=vC(),[c]=await d.insert(be).values({userId:t,name:r.name,keyHash:s,keyPrefix:i}).returning();return e.json({id:c.id,name:c.name,key:o,keyPrefix:i,createdAt:c.createdAt},201)});Xi.get("/auth/api-keys",async e=>{let t=e.get("userId"),n=await d.select({id:be.id,name:be.name,keyPrefix:be.keyPrefix,lastUsedAt:be.lastUsedAt,expiresAt:be.expiresAt,revokedAt:be.revokedAt,createdAt:be.createdAt}).from(be).where(Wl(be.userId,t)).orderBy(be.createdAt);return e.json(n)});Xi.delete("/auth/api-keys/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select({id:be.id}).from(be).where(yC(Wl(be.id,n),Wl(be.userId,t),wC(be.revokedAt)));return r?(await d.update(be).set({revokedAt:new Date}).where(Wl(be.id,n)),e.json({revoked:!0})):e.json({error:"API key not found"},404)});C();import{Hono as bC}from"hono";import{z as zr}from"zod";import{eq as Et,and as Vr,isNull as SC,sql as sh}from"drizzle-orm";import{randomUUID as ih}from"node:crypto";var Jr=new bC;Jr.post("/eval-targets/:id/conversations",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select({id:k.id}).from(k).where(Vr(Et(k.id,n),Et(k.userId,t)));if(!r)return e.json({error:"Target not found"},404);let[o]=await d.select().from(Me).where(Vr(Et(Me.evalTargetId,n),Et(Me.userId,t),Et(Me.status,"active")));if(o)return e.json(o);let[s]=await d.insert(Me).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 d.select().from(Me).where(Vr(Et(Me.evalTargetId,n),Et(Me.userId,t),Et(Me.status,"active")));return r?e.json(r):e.json(null)});var AC=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=AC.parse(await e.req.json()),[o]=await d.select().from(Me).where(Vr(Et(Me.id,n),Et(Me.userId,t)));if(!o)return e.json({error:"Conversation not found"},404);let s=ih(),i={id:s,role:"user",content:r.content,createdAt:new Date().toISOString()};await d.update(Me).set({messages:sh`${Me.messages} || ${JSON.stringify([i])}::jsonb`,updatedAt:new Date}).where(Et(Me.id,n));let c={type:"conversation",conversationId:n,messageId:s,messageContent:r.content},{id:a,noLiveWorker:l}=await Tt({taskName:"process_conversation",payload:{evalTargetId:o.evalTargetId,config:c},userId:t,mirror:{userId:t,evalTargetId:o.evalTargetId,config:c}});return e.json({message:i,jobId:a,noLiveWorker:l},201)});var EC=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=EC.parse(await e.req.json()),o={id:ih(),role:"assistant",content:r.content,type:r.type,data:r.data,createdAt:new Date().toISOString()};return await d.update(Me).set({messages:sh`${Me.messages} || ${JSON.stringify([o])}::jsonb`,updatedAt:new Date}).where(Vr(Et(Me.id,n),Et(Me.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 d.select().from(Me).where(Vr(Et(Me.id,n),Et(Me.userId,t)));if(!o)return e.json({error:"Conversation not found"},404);let s=o.messages;if(r){let i=s.filter(c=>c.createdAt>r);return e.json(i)}return e.json(s)});var xC=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=xC.parse(await e.req.json()),[o]=await d.select().from(Me).where(Vr(Et(Me.id,n),Et(Me.userId,t)));if(!o)return e.json({error:"Conversation not found"},404);let i=o.messages.find(p=>p.id===r.messageId&&p.type==="proposal");if(!i?.data?.proposedContent)return e.json({error:"Proposal message not found or has no content"},400);let[c]=await d.select().from(k).where(Vr(Et(k.id,o.evalTargetId),Et(k.userId,t)));if(!c)return e.json({error:"Target not found"},404);let[a]=await d.insert(k).values({userId:t,name:c.name,type:c.type,content:i.data.proposedContent,description:c.description,metadata:c.metadata,version:c.version+1,parentId:c.id}).returning(),l=await d.select().from(Ie).where(Vr(Et(Ie.evalTargetId,c.id),SC(Ie.retiredAt)));l.length>0&&await d.insert(Ie).values(l.map(p=>({evalTargetId:a.id,name:p.name,prompt:p.prompt,expectedOutput:p.expectedOutput,files:p.files,expectations:p.expectations})));let m={id:ih(),role:"assistant",content:`Applied changes \u2014 created v${a.version}`,type:"applied",data:{newVersion:a.version,evalTargetId:a.id},createdAt:new Date().toISOString()};return await d.update(Me).set({evalTargetId:a.id,messages:sh`${Me.messages} || ${JSON.stringify([m])}::jsonb`,updatedAt:new Date}).where(Et(Me.id,n)),e.json({newTarget:a,message:m})});C();import*as Qi from"node:fs";import*as Ps from"node:path";import{createHash as TC}from"node:crypto";import{fileURLToPath as RC}from"node:url";import{createRequire as kC}from"node:module";import{Hono as NC}from"hono";import{z as vt}from"zod";import{eq as js,desc as jC,and as PC,sql as DC}from"drizzle-orm";var OC=Ps.dirname(RC(import.meta.url)),Oo=new NC,zl=null,Vl=null;function CC(){let e=process.env.RULEMETRIC_SKILLS_REGISTRY_PATH;if(e&&Qi.existsSync(e))return e;try{let n=kC(import.meta.url),r=Ps.dirname(n.resolve("@rulemetric/skills-registry/package.json")),o=Ps.join(r,"registry.json");if(Qi.existsSync(o))return o}catch{}let t=Ps.resolve(OC,"../../../../packages/skills-registry/registry.json");return Qi.existsSync(t)?t:null}u(CC,"resolveRegistryPath");function i0(){if(zl)return zl;let e=CC();return e?(zl=JSON.parse(Qi.readFileSync(e,"utf-8")),zl):null}u(i0,"loadRegistry");function LC(){if(Vl)return Vl;let e=i0();return e?(Vl={version:e.version,generatedAt:e.generatedAt,skills:e.skills.map(({content:t,...n})=>n)},Vl):null}u(LC,"loadRegistryIndex");Oo.get("/skills",e=>{let t=LC();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 d.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 d.select().from(ao).where(js(ao.status,"approved")).orderBy(jC(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 a0=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()}),Dte=vt.object({skills:vt.array(a0).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,c=0,a=0,l=0,m=0,p=0;for(let _ of i){let I=a0.safeParse(_);if(!I.success){console.warn("[sync-public] Skipping invalid skill entry:",JSON.stringify(I.error.issues)),p++;continue}let h=I.data,f=TC("sha256").update(h.content).digest("hex"),w=`public_skill::${h.source.repo}::${h.id}`,b=h.updatedAt??"1.0.0",[v]=await d.select({id:g.id,contentHash:g.contentHash,popularityScore:g.popularityScore,sourceUpdatedAt:g.sourceUpdatedAt}).from(g).where(PC(js(g.name,h.id),js(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(v)if(v.contentHash!==f){let P=!1;for(let N=0;N<=4;N++)try{await d.transaction(async D=>{await D.select({id:g.id}).from(g).where(js(g.id,v.id)).for("update"),await D.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(js(g.id,v.id));let[q]=await D.select({max:DC`coalesce(max(${Se.versionNumber}), 0)`}).from(Se).where(js(Se.instructionId,v.id));await D.insert(Se).values({instructionId:v.id,versionNumber:(q?.max??0)+1,content:h.content,frontmatter:{name:h.name,source:h.source,category:h.category??null},changeSummary:`Synced from registry (${b})`})}),P=!0;break}catch(D){if(D.cause?.code==="23505"){if(N<4)continue;break}throw D}if(!P)continue;a++,m++}else{let R=v.sourceUpdatedAt?.getTime()??null,P=E?.getTime()??null,N=v.popularityScore!==S,D=E!==null&&R!==P;(N||D)&&await d.update(g).set({...N?{popularityScore:S}:{},...D?{sourceUpdatedAt:E}:{}}).where(js(g.id,v.id)),l++}else{let[R]=await d.insert(g).values({name:h.id,description:h.description||h.name,type:"skill",scope:"public",scopeRef:null,version: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&&(c++,await d.insert(Se).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"}),m++)}}return e.json({inserted:c,updated:a,unchanged:l,versionsCreated:m,skipped:p})});Oo.get("/skills/:id",e=>{let t=i0();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)});C();import{Hono as GC}from"hono";import{desc as YC,eq as XC}from"drizzle-orm";C();import{eq as u0,and as VC}from"drizzle-orm";C();var MC=/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,$C="claude-haiku-4-5-20251001",qC=1e3,UC=.7,HC=`You extract pricing and rate-limit changes from AI provider release notes.
|
|
1112
1029
|
Return a JSON object: {
|
|
1113
1030
|
"observations": [
|
|
1114
1031
|
{
|
|
@@ -1123,71 +1040,71 @@ Return a JSON object: {
|
|
|
1123
1040
|
}
|
|
1124
1041
|
Only emit observations if the release notes EXPLICITLY state a numeric value.
|
|
1125
1042
|
Do NOT speculate. Do NOT emit observations for "increased by X%" without an absolute number.
|
|
1126
|
-
Return { "observations": [] } if nothing concrete.`;function
|
|
1043
|
+
Return { "observations": [] } if nothing concrete.`;function BC(){let e=process.env.ANTHROPIC_API_KEY;if(!e)return null;let t=cc("anthropic",e);return async n=>{let r=await t.complete(n,{model:$C,maxTokens:qC,temperature:0});return{text:r.text,usage:{inputTokens:r.usage?.inputTokens??0,outputTokens:r.usage?.outputTokens??0}}}}u(BC,"defaultLlm");async function FC(e){await d.insert(ye).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)})}u(FC,"defaultObserve");function WC(e){return`${HC}
|
|
1127
1044
|
|
|
1128
1045
|
Release notes (harness=${e.harness}, version=${e.version}):
|
|
1129
1046
|
|
|
1130
|
-
${e.body??""}`}
|
|
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}
|
|
1047
|
+
${e.body??""}`}u(WC,"buildPrompt");function zC(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 c of s.observations){if(!c||typeof c!="object")continue;let a=c;if(typeof a.limitType!="string"||typeof a.plan!="string"||typeof a.value!="number"||!Number.isFinite(a.value)||typeof a.unit!="string")continue;let l=a.comparator===">="||a.comparator==="<="?a.comparator:"=";i.push({limitType:a.limitType,plan:a.plan,value:a.value,unit:a.unit,comparator:l,evidence_quote:typeof a.evidence_quote=="string"?a.evidence_quote:""})}return{observations:i}}u(zC,"parseLlmJson");async function c0(e,t={}){let n=e.body??"";if(!MC.test(n))return{observations:[],llm_called:!1,reason:"no keywords matched"};let r=t.llm===void 0?BC():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 a=await r(WC(e));o=a.text,s=a.usage}catch(a){return{observations:[],llm_called:!0,error:`LLM call failed: ${a instanceof Error?a.message:String(a)}`}}let i;try{i=zC(o).observations}catch(a){return{observations:[],llm_called:!0,llm_tokens:{input:s.inputTokens,output:s.outputTokens},error:`failed to parse LLM JSON: ${a instanceof Error?a.message:String(a)}`}}if(i.length===0)return{observations:[],llm_called:!0,llm_tokens:{input:s.inputTokens,output:s.outputTokens},reason:"LLM returned no observations"};let c=t.observe??FC;for(let a of i)await c({plan:a.plan,limitType:a.limitType,value:a.value,unit:a.unit,comparator:a.comparator,sourceType:"release_notes",sourceUrl:e.url,sourceEvidence:{harness:e.harness,version:e.version,publishedAt:e.publishedAt.toISOString(),quote:a.evidence_quote,fullBody:n},confidence:UC,provider:"anthropic"});return{observations:i,llm_called:!0,llm_tokens:{input:s.inputTokens,output:s.outputTokens}}}u(c0,"extractAndPostObservationsFromRelease");var d0=[{harness:"claude_code",repo:"anthropics/claude-code"},{harness:"codex",repo:"openai/codex"}];function JC(e){return e.prerelease===!0||/-(alpha|beta|rc)\b/i.test(e.tag_name)}u(JC,"isPrerelease");function KC(e){let t=[],n=[],r=[],o=e.split(`
|
|
1048
|
+
`);for(let s of o){let i=s.trim();if(!i.startsWith("- ")&&!i.startsWith("* "))continue;let c=i.replace(/^[-*]\s+/,"").trim();if(!c)continue;let a=c.toLowerCase();a.startsWith("security:")||a.includes("security fix")||a.includes("cve-")?r.push(c):a.startsWith("fixed ")||a.startsWith("fix ")||a.startsWith("fixed:")?n.push(c):t.push(c)}return{features:t,fixes:n,security:r}}u(KC,"parseReleaseBody");async function Jl(e){let t=e?d0.filter(o=>o.harness===e):d0,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 c=await fetch(s,{headers:i});if(!c.ok)continue;let a=await c.json();r+=a.length;for(let l of a){if(JC(l))continue;let m=KC(l.body??"");if((await d.select({id:jt.id}).from(jt).where(VC(u0(jt.harness,o.harness),u0(jt.version,l.tag_name)))).length===0){await d.insert(jt).values({harness:o.harness,version:l.tag_name,publishedAt:new Date(l.published_at),title:l.name,body:l.body,categories:m,url:l.html_url}),n++;try{await c0({harness:o.harness,version:l.tag_name,url:l.html_url,publishedAt:new Date(l.published_at),body:l.body})}catch(_){console.warn("release notes extraction failed:",_)}}}}return{synced:n,total:r}}u(Jl,"syncHarnessReleases");var Zc=new GC;Zc.get("/harness-releases",async e=>{let t=e.req.query("harness"),n=Math.min(Number(e.req.query("limit")??50),100),r=t?XC(jt.harness,t):void 0,o=await d.select({id:jt.id,harness:jt.harness,version:jt.version,publishedAt:jt.publishedAt,title:jt.title,categories:jt.categories,url:jt.url}).from(jt).where(r).orderBy(YC(jt.publishedAt)).limit(n);return e.json(o)});Zc.post("/harness-releases/sync",async e=>{let t=await e.req.json().catch(()=>({})),n=await Jl(t.harness);return e.json(n)});C();import{Hono as QC}from"hono";import{and as Kl,desc as ZC,eq as Zi,isNull as ah,sql as eL}from"drizzle-orm";var ea=new QC;ea.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(Zi(bt.userId,t),ah(bt.readAt)):Zi(bt.userId,t),i=await d.select().from(bt).where(s).orderBy(ZC(bt.createdAt)).limit(n).offset(r),[{count:c}]=await d.select({count:eL`count(*)::int`}).from(bt).where(Kl(Zi(bt.userId,t),ah(bt.readAt)));return e.json({items:i,unreadCount:c})});ea.post("/notifications/:id/read",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await d.update(bt).set({readAt:new Date}).where(Kl(Zi(bt.id,t),Zi(bt.userId,n))).returning();return r?e.json(r):e.json({error:"Not found"},404)});ea.post("/notifications/read-all",async e=>{let t=e.get("userId");return await d.update(bt).set({readAt:new Date}).where(Kl(Zi(bt.userId,t),ah(bt.readAt))),e.json({success:!0})});C();import{Hono as tL}from"hono";import{z as Qt}from"zod";import{eq as Ir,and as Gl,desc as nL,ne as rL}from"drizzle-orm";var Co=new tL;function oL(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}}}u(oL,"parseTerminalTargetResult");async function sL(e){let t=oL(e.result);if(!t?.terminalTarget)return;let n=e.config&&typeof e.config=="object"?e.config:{},r=typeof n.projectPath=="string"?n.projectPath:null,o=typeof n.resumeSessionId=="string"?n.resumeSessionId:null,[s]=o?await d.select({id:y.id}).from(y).where(Gl(Ir(y.userId,e.userId),Ir(y.externalSessionId,o))).limit(1):[];await d.insert(ze).values({userId:e.userId,sessionId:s?.id??null,externalSessionId:o,kind:"tmux",target:t.terminalTarget.target,status:t.terminalTarget.live===!1?"unknown":"active",attachCommand:t.terminalTarget.attachCommand,projectPath:r,metadata:{launchJobId:e.jobId,launcherSessionId:t.sessionId}}).onConflictDoUpdate({target:[ze.userId,ze.target],set:{sessionId:s?.id??null,externalSessionId:o,status:t.terminalTarget.live===!1?"unknown":"active",attachCommand:t.terminalTarget.attachCommand,projectPath:r,metadata:{launchJobId:e.jobId,launcherSessionId:t.sessionId},lastSeenAt:new Date,updatedAt:new Date}})}u(sL,"upsertTerminalTargetFromLaunchResult");var iL=Qt.object({tool:Qt.string().min(1),config:Qt.object({projectPath:Qt.string().min(1),prompt:Qt.string().optional(),systemPrompt:Qt.string().optional(),model:Qt.string().optional(),mode:Qt.enum(["headless","interactive"]).default("interactive"),timeout:Qt.number().int().positive().optional(),resumeSessionId:Qt.string().optional()})});Co.post("/launch-jobs",async e=>{let t=e.get("userId"),n=await e.req.json(),r=iL.parse(n),{id:o,noLiveWorker:s}=await Tt({taskName:"process_launch",payload:{tool:r.tool,config:r.config},userId:t,mirror:{userId:t,tool:r.tool,config:r.config}}),[i]=await d.select().from(ce).where(Ir(ce.id,o));return e.json({...i,noLiveWorker:s},201)});Co.get("/launch-jobs",async e=>{let t=e.get("userId"),n=Number(e.req.query("limit")??50),r=await d.select().from(ce).where(Ir(ce.userId,t)).orderBy(nL(ce.createdAt)).limit(n);return e.json(r)});var aL=Qt.object({status:Qt.enum(["running","completed","failed"]).optional(),attempts:Qt.number().int().nonnegative().optional(),error:Qt.string().optional(),result:Qt.record(Qt.unknown()).optional()});Co.patch("/launch-jobs/:id/state",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=aL.parse(await e.req.json()),o={updatedAt:new Date};r.attempts!==void 0&&(o.attempts=r.attempts),r.status&&(o.status=r.status),r.error&&(o.error=r.error),r.result!==void 0&&(o.result=r.result),(r.status==="completed"||r.status==="failed")&&(o.completedAt=new Date);let[s]=await d.update(ce).set(o).where(Gl(Ir(ce.id,n),Ir(ce.userId,t),rL(ce.status,"cancelled"))).returning();if(!s){let[i]=await d.select().from(ce).where(Gl(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 sL({userId:t,jobId:n,config:s.config,result:r.result}),e.json(s)});Co.post("/launch-jobs/:id/cancel",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.update(ce).set({status:"cancelled",updatedAt:new Date}).where(Gl(Ir(ce.id,n),Ir(ce.userId,t))).returning();return r?e.json(r):e.json({error:"Job not found"},404)});Co.get("/launchers",async e=>{let{getAvailableLaunchers:t}=await Promise.resolve().then(()=>(ml(),HI));return e.json(t())});C();import{Hono as cL}from"hono";import{z as Un}from"zod";import{eq as Ee,and as $t,desc as Xl,inArray as Yl,isNull as uL,ne as dL}from"drizzle-orm";ml();var br=new cL,lL=Un.object({tool:Un.string().min(1),model:Un.string().optional(),label:Un.string().optional()}),mL=Un.object({title:Un.string().optional(),projectPath:Un.string().min(1),gitRemote:Un.string().optional(),baseBranch:Un.string().optional(),prompt:Un.string().optional(),autoWorktree:Un.boolean().optional(),sessions:Un.array(lL).min(1).max(8)});function pL(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/(^-|-$)/g,"")||"tool"}u(pL,"sanitizeTool");var fL=new Set(["pending","claimed","running"]);var gL=1800*1e3;function l0(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>gL:!1}u(l0,"canSkipRollup");function m0(e,t,n){if(e==="cancelled")return"cancelled";let r=t.length>0,o=t.some(c=>c.endedAt==null),s=n.some(c=>fL.has(c.status));return n.length>0&&n.every(c=>c.status==="failed")&&!r?"failed":o||s&&r?"running":r&&!o&&!s?"completed":"pending"}u(m0,"rollupRunStatus");async function p0(e){if(e.rolled===e.stored)return;let t=e.rolled==="completed"||e.rolled==="failed"||e.rolled==="cancelled",n={status:e.rolled,updatedAt:new Date};t&&!e.hadCompletedAt&&(n.completedAt=new Date);try{await d.update(X).set(n).where($t(Ee(X.id,e.runId),Ee(X.userId,e.userId),dL(X.status,"cancelled")))}catch{}}u(p0,"persistRolledUpStatus");function hL(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}u(hL,"frictionCount");async function _L(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(d,s,r,t,o);return i?{...i,estimated:!0}:null}u(_L,"deriveSessionCost");async function f0(e,t){let[n]=await d.select({id:X.id,autoWorktree:X.autoWorktree}).from(X).where($t(Ee(X.id,e),Ee(X.userId,t))).limit(1);if(!n||!n.autoWorktree)return{linked:0};let r=await d.select({config:ce.config,result:ce.result}).from(ce).where($t(Ee(ce.runId,e),Ee(ce.userId,t))),o=new Set;for(let i of r){let c=i.result??{};typeof c.worktreePath=="string"&&c.worktreePath&&o.add(c.worktreePath);let a=i.config??{};a.worktree?.create&&typeof a.worktree.branch=="string"&&typeof a.projectPath=="string"&&o.add(ll({repoRoot:a.projectPath,branch:a.worktree.branch}))}return o.size===0?{linked:0}:{linked:(await d.update(y).set({runId:e}).where($t(Ee(y.userId,t),uL(y.runId),Yl(y.projectPath,[...o]))).returning({id:y.id})).length}}u(f0,"linkRunSessions");br.post("/runs",async e=>{let t=e.get("userId"),n=await e.req.json(),r=mL.parse(n),o=await _o(t,null),s=r.autoWorktree??!0,i=r.baseBranch??"HEAD",c=null;if(r.projectPath){let[p]=await d.select({projectId:de.projectId}).from(de).where(Ee(de.path,r.projectPath)).orderBy(Xl(de.lastSeen)).limit(1);c=p?.projectId??null}if(!c&&r.gitRemote){let[p]=await d.select({id:M.id}).from(M).where(Ee(M.gitRemoteUrl,r.gitRemote)).limit(1);c=p?.id??null}let[a]=await d.insert(X).values({userId:t,orgId:o,projectPath:r.projectPath,projectId:c,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=a.id.slice(0,8),m=!1;try{for(let p=0;p<r.sessions.length;p++){let _=r.sessions[p],I=`rm/run-${l}/s${p}-${pL(_.tool)}`,h={projectPath:r.projectPath,prompt:r.prompt,systemPrompt:void 0,model:_.model,mode:"interactive",worktree:{create:s,branch:I,baseRef:i},runId:a.id},f=await Tt({taskName:"process_launch",userId:t,payload:{tool:_.tool,config:h},mirror:{userId:t,tool:_.tool,config:h},runId:a.id});m=m||f.noLiveWorker}}catch(p){return await d.update(X).set({status:"failed",updatedAt:new Date}).where(Ee(X.id,a.id)),await d.update(ce).set({status:"cancelled",updatedAt:new Date}).where($t(Ee(ce.runId,a.id),Ee(ce.status,"pending"))),e.json({error:"Failed to enqueue all launch jobs",detail:p instanceof Error?p.message:String(p),run:{...a,status:"failed"}},500)}return e.json({run:a,noLiveWorker:m},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"),c=i?$t(Ee(X.userId,t),Ee(X.projectId,i)):Ee(X.userId,t),a=await d.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(c).orderBy(Xl(X.createdAt)).limit(r).offset(s),l=a.filter(p=>!l0(p.status,p.completedAt)),m=l.map(p=>p.id);if(m.length>0){let[p,_]=await Promise.all([d.select({runId:y.runId,endedAt:y.endedAt}).from(y).where($t(Ee(y.userId,t),Yl(y.runId,m))),d.select({runId:ce.runId,status:ce.status}).from(ce).where($t(Ee(ce.userId,t),Yl(ce.runId,m)))]),I=new Map;for(let f of p){if(!f.runId)continue;let w=I.get(f.runId)??[];w.push({endedAt:f.endedAt}),I.set(f.runId,w)}let h=new Map;for(let f of _){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=m0(f.status,I.get(f.id)??[],h.get(f.id)??[]);w!==f.status&&(await p0({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:a})});br.get("/runs/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select().from(X).where($t(Ee(X.id,n),Ee(X.userId,t))).limit(1);if(!r)return e.json({error:"Run not found"},404);try{await f0(n,t)}catch{}let o=await d.select({id:y.id,tool:y.tool,gitBranch:y.gitBranch,projectPath:y.projectPath,startedAt:y.startedAt,endedAt:y.endedAt,eventCount:y.eventCount,tokenUsage:y.tokenUsage,analysis:y.analysis}).from(y).where($t(Ee(y.runId,n),Ee(y.userId,t))).orderBy(Xl(y.startedAt)),s=o.map(w=>w.id);if(!l0(r.status,r.completedAt)){let w=await d.select({status:ce.status}).from(ce).where($t(Ee(ce.runId,n),Ee(ce.userId,t))),b=m0(r.status,o.map(v=>({endedAt:v.endedAt})),w);b!==r.status&&(await p0({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 d.select({sessionId:se.sessionId,instructionId:g.id,name:g.name}).from(se).innerJoin(g,Ee(g.id,se.instructionId)).where(Yl(se.sessionId,s)):[],c=new Map;for(let w of s)c.set(w,[]);for(let w of i)c.get(w.sessionId)?.push({id:w.instructionId,name:w.name});let a=await Promise.all(o.map(async w=>{let b=w.analysis??{},v=typeof b.goalSummary=="string"?b.goalSummary:null,S=typeof b.outcome=="string"?b.outcome:null,A=b.friction??null,E=await _L(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:v,outcome:S,friction:A,cost:E,instructions:c.get(w.id)??[]}})),l=a.map(w=>({sessionId:w.id,score:w.outcome!=null?li[w.outcome]??-1:-1,costUsd:w.cost?.totalUsd??Number.POSITIVE_INFINITY,frictionCount:hL(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})),m=new Map,p=new Map;for(let w of i)m.set(w.instructionId,w.name),p.has(w.instructionId)||p.set(w.instructionId,new Set),p.get(w.instructionId).add(w.sessionId);let _=s.length,I=[],h=[];for(let[w,b]of p){let v=m.get(w)??"Unknown";_>0&&b.size===_?I.push({id:w,name:v}):h.push({id:w,name:v,sessionIds:[...b]})}let f=null;return r.autoWorktree?r.sessionCount>0&&a.length<r.sessionCount&&(f=`Only ${a.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:a,comparison:{ranking:l,instructionDiff:{shared:I,differing:h}},attributionCaveat:f})});br.post("/runs/:id/link-sessions",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select({id:X.id}).from(X).where($t(Ee(X.id,n),Ee(X.userId,t))).limit(1);if(!r)return e.json({error:"Run not found"},404);let{linked:o}=await f0(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 d.select({id:X.id}).from(X).where($t(Ee(X.id,n),Ee(X.userId,t))).limit(1);if(!r)return e.json({error:"Run not found"},404);let o=await d.select({id:ce.id,runId:ce.runId,status:ce.status,tool:ce.tool}).from(ce).where($t(Ee(ce.runId,n),Ee(ce.userId,t))).orderBy(Xl(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 d.select({id:X.id}).from(X).where($t(Ee(X.id,n),Ee(X.userId,t))).limit(1);if(!r)return e.json({error:"Run not found"},404);await d.update(ce).set({status:"cancelled",updatedAt:new Date}).where($t(Ee(ce.runId,n),Ee(ce.userId,t),Ee(ce.status,"pending")));let[o]=await d.update(X).set({status:"cancelled",updatedAt:new Date}).where($t(Ee(X.id,n),Ee(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 d.select({id:X.id}).from(X).where($t(Ee(X.id,n),Ee(X.userId,t))).limit(1);if(!r)return e.json({error:"Run not found"},404);let{noLiveWorker:o}=await bv({runId:n,userId:t});return e.json({enqueued:!0,noLiveWorker:o})});C();import{Hono as yL}from"hono";import{z as Ds}from"zod";import{and as ta,desc as ch,eq as zt,or as g0}from"drizzle-orm";var Os=new yL;function wL(e,t){return{liveSend:e?.kind==="tmux"&&e.status==="active"&&t,fallbackResume:!0,tmuxAvailable:e?.kind==="tmux"&&e.status!=="fallback_only",workerOnline:t}}u(wL,"capabilitiesFor");Os.get("/sessions/:id/terminal-target",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await d.select({id:y.id,externalSessionId:y.externalSessionId}).from(y).where(ta(zt(y.id,n),zt(y.userId,t))).limit(1);if(!r)return e.json({error:"Session not found"},404);let o=r.externalSessionId?g0(zt(ze.sessionId,r.id),zt(ze.externalSessionId,r.externalSessionId)):zt(ze.sessionId,r.id),[s]=await d.select().from(ze).where(ta(zt(ze.userId,t),o)).orderBy(ch(ze.lastSeenAt)).limit(1),i=await Ai(t);return e.json({target:s??null,capabilities:wL(s??null,i),...s?{}:{reason:"no_target"}})});var h0=Ds.enum(["active","missing","unknown","fallback_only"]),vL=Ds.object({message:Ds.string().min(1).max(16*1024),delivery:Ds.enum(["live","fallback"]).default("live"),submit:Ds.boolean().optional().default(!0)});Os.post("/sessions/:id/send",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=vL.parse(await e.req.json()),[o]=await d.select({id:y.id,externalSessionId:y.externalSessionId,projectPath:y.projectPath}).from(y).where(ta(zt(y.id,n),zt(y.userId,t))).limit(1);if(!o)return e.json({error:"Session not found"},404);let s=o.externalSessionId?g0(zt(ze.sessionId,o.id),zt(ze.externalSessionId,o.externalSessionId)):zt(ze.sessionId,o.id),[i]=await d.select().from(ze).where(ta(zt(ze.userId,t),zt(ze.status,"active"),s)).orderBy(ch(ze.lastSeenAt)).limit(1);if(!i){if(r.delivery==="fallback"){if(!o.externalSessionId||!o.projectPath)return e.json({error:"Live target unavailable",code:"LIVE_TARGET_UNAVAILABLE"},409);let m={projectPath:o.projectPath,mode:"interactive",resumeSessionId:o.externalSessionId,prompt:r.message},p={tool:"claude_code",config:m},{id:_,noLiveWorker:I}=await Tt({taskName:"process_launch",payload:p,userId:t,mirror:{userId:t,tool:"claude_code",config:m}});return e.json({delivery:"fallback",job:{id:_,kind:"process_launch"},noLiveWorker:I},202)}return e.json({error:"Live target unavailable",code:"LIVE_TARGET_UNAVAILABLE",fallback:{available:!!(o.externalSessionId&&o.projectPath),action:"resume_terminal"}},409)}if(!await Ai(t))return e.json({error:"Worker offline",code:"WORKER_OFFLINE"},409);let a={sessionId:o.id,terminalTargetId:i.id,target:i.target,message:r.message,submit:r.submit},{id:l}=await Tt({taskName:"process_send_message",payload:a,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 IL=Ds.object({status:h0,lastSeenAt:Ds.string().datetime().optional()});Os.patch("/terminal-targets/:id/status",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=IL.parse(await e.req.json()),o=r.lastSeenAt?new Date(r.lastSeenAt):new Date,s=new Date,[i]=await d.update(ze).set({status:r.status,lastSeenAt:o,updatedAt:s}).where(ta(zt(ze.id,n),zt(ze.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?h0.parse(n):null,o=await d.select().from(ze).where(ta(zt(ze.userId,t),...r?[zt(ze.status,r)]:[])).orderBy(ch(ze.lastSeenAt)).limit(100);return e.json({targets:o})});import{Hono as aM}from"hono";C();import{Hono as EL}from"hono";import{z as Lo}from"zod";import{eq as Gr,asc as y0,sql as xL}from"drizzle-orm";C();import{eq as uh,and as bL}from"drizzle-orm";function gt(e){return async(t,n)=>{let r=t.get("userId");if(!r)return t.json({error:"Unauthenticated",code:"UNAUTHENTICATED"},401);let o=t.req.param("slug");if(!o)return t.json({error:"Missing org slug",code:"BAD_REQUEST"},400);let[s]=await d.select({id:K.id,slug:K.slug}).from(K).where(uh(K.slug,o));if(!s)return t.json({error:"Organization not found",code:"ORG_NOT_FOUND"},404);let[i]=await d.select({role:Q.role}).from(Q).where(bL(uh(Q.orgId,s.id),uh(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()}}u(gt,"requireOrgRole");C();import{eq as _0,and as SL,sql as AL}from"drizzle-orm";var Kr=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Ql=AL`case ${Q.role}
|
|
1132
1049
|
when 'owner' then 0
|
|
1133
1050
|
when 'admin' then 1
|
|
1134
1051
|
when 'member' then 2
|
|
1135
1052
|
else 3
|
|
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-${
|
|
1138
|
-
`)}return"onboarding@resend.dev"}
|
|
1053
|
+
end`;async function Cs(e){let t=e.req.param("teamId");if(!t||!Kr.test(t))return{ok:!1,response:e.json({error:"Invalid teamId path param",code:"BAD_REQUEST"},400)};let n=e.get("orgId"),[r]=await d.select({id:G.id,orgId:G.orgId,name:G.name,slug:G.slug,createdAt:G.createdAt}).from(G).where(SL(_0(G.id,t),_0(G.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)}}u(Cs,"loadTeamInOrg");var na=/^(?=.{3,40}$)[a-z0-9]+(?:-[a-z0-9]+)*$/,ra="Slug must be 3-40 chars, lowercase alphanumerics with single dashes only \u2014 no leading, trailing, or consecutive dashes";var Mo=new EL,TL=Lo.object({name:Lo.string().min(1).max(100),slug:Lo.string().regex(na,{message:ra})}),RL=Lo.object({name:Lo.string().min(1).max(100).optional(),slug:Lo.string().regex(na,{message:ra}).optional()});Mo.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=TL.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:c}=await t.rpc("create_organization",{p_name:o,p_slug:s});if(c){let l=Ft(c),m=vo(c);if(l==="23505")return e.json({error:"Slug already taken",code:"ORG_SLUG_TAKEN"},409);if(l==="P0001"&&/unauthenticated/i.test(m))return e.json({error:"Unauthenticated",code:"UNAUTHENTICATED"},401);throw c}let a=i;return e.json({id:a.id,name:a.name,slug:a.slug,role:"owner"},201)});Mo.get("/orgs",async e=>{let t=e.get("userId"),n=await d.select({id:K.id,name:K.name,slug:K.slug,role:Q.role,createdAt:K.createdAt}).from(Q).innerJoin(K,Gr(Q.orgId,K.id)).where(Gr(Q.userId,t)).orderBy(K.createdAt);return e.json(n.map(r=>({id:r.id,name:r.name,slug:r.slug,role:r.role})))});Mo.get("/orgs/:slug",gt(["owner","admin","member"]),async e=>{let t=e.get("orgId"),[n]=await d.select({id:K.id,name:K.name,slug:K.slug,createdAt:K.createdAt}).from(K).where(Gr(K.id,t)),r=await d.select({userId:Q.userId,role:Q.role,joinedAt:Q.createdAt,email:T.email,displayName:T.displayName}).from(Q).leftJoin(T,Gr(Q.userId,T.id)).where(Gr(Q.orgId,t)).orderBy(Ql,y0(Q.createdAt)),o=await d.select({id:G.id,name:G.name,slug:G.slug,memberCount:xL`count(${_e.userId})::int`}).from(G).leftJoin(_e,Gr(_e.teamId,G.id)).where(Gr(G.orgId,t)).groupBy(G.id,G.name,G.slug).orderBy(y0(G.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)}))})});Mo.patch("/orgs/:slug",gt(["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=RL.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[c]=await d.update(K).set(i).where(Gr(K.id,t)).returning({id:K.id,name:K.name,slug:K.slug});return e.json({id:c.id,name:c.name,slug:c.slug})}catch(c){if(Ft(c)==="23505")return e.json({error:"Slug already taken",code:"ORG_SLUG_TAKEN"},409);throw c}});Mo.delete("/orgs/:slug",gt(["owner"]),async e=>{let t=e.get("orgId");return await d.delete(K).where(Gr(K.id,t)),e.body(null,204)});var kL=Lo.object({newOwnerId:Lo.string().uuid()});Mo.post("/orgs/:slug/transfer",gt(["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=kL.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:c}=await t.rpc("transfer_ownership",{p_org:s,p_new_owner_id:o});if(c){let l=Ft(c),m=vo(c);if(l==="P0001"){if(/same_user/i.test(m))return e.json({error:"Cannot transfer ownership to yourself",code:"SAME_USER"},400);if(/not_a_member/i.test(m))return e.json({error:"Target user is not a member of this organization",code:"NOT_A_MEMBER"},404);if(/forbidden/i.test(m))return e.json({error:"Forbidden",code:"ORG_FORBIDDEN"},403)}throw c}let a=i;return e.json({orgId:a.orgId,newOwnerId:a.newOwnerId,oldOwnerId:a.oldOwnerId})});C();import{Hono as NL}from"hono";import{z as w0}from"zod";import{eq as eu,and as v0,asc as jL,max as PL,inArray as I0}from"drizzle-orm";var tu=new NL;tu.get("/orgs/:slug/members",gt(["owner","admin"]),async e=>{let t=e.get("orgId"),n=await d.select({userId:Q.userId,role:Q.role,joinedAt:Q.createdAt,email:T.email,displayName:T.displayName}).from(Q).leftJoin(T,eu(Q.userId,T.id)).where(eu(Q.orgId,t)).orderBy(Ql,jL(Q.createdAt)),r=n.map(a=>a.userId),o=r.length?await d.select({userId:_e.userId,teamId:G.id,teamName:G.name,teamSlug:G.slug}).from(_e).innerJoin(G,eu(_e.teamId,G.id)).where(v0(eu(G.orgId,t),I0(_e.userId,r))):[],s=new Map;for(let a of o){let l=s.get(a.userId)??[];l.push({id:a.teamId,name:a.teamName,slug:a.teamSlug}),s.set(a.userId,l)}let i=r.length?await d.select({userId:y.userId,lastActiveAt:PL(y.startedAt)}).from(y).where(v0(eu(y.orgId,t),I0(y.userId,r))).groupBy(y.userId):[],c=new Map;for(let a of i)c.set(a.userId,a.lastActiveAt);return e.json(n.map(a=>{let l=c.get(a.userId)??null;return{userId:a.userId,email:a.email,displayName:a.displayName,role:a.role,joinedAt:a.joinedAt,teams:s.get(a.userId)??[],lastActiveAt:l?new Date(l).toISOString():null}}))});var DL=w0.object({role:w0.enum(["owner","admin","member"])});tu.patch("/orgs/:slug/members/:userId",gt(["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||!Kr.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=DL.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:c}=await t.rpc("change_member_role",{p_org:s,p_user:n,p_new_role:o.data.role});if(c){let l=Ft(c),m=vo(c);if(l==="P0001"){if(/invalid_role/i.test(m))return e.json({error:"Invalid role",code:"INVALID_ROLE"},400);if(/not_a_member/i.test(m))return e.json({error:"Target user is not a member of this organization",code:"NOT_A_MEMBER"},404);if(/last_owner_violation/i.test(m))return e.json({error:"Cannot demote the last owner of this organization",code:"LAST_OWNER"},409);if(/forbidden/i.test(m))return e.json({error:"Forbidden",code:"ORG_FORBIDDEN"},403)}throw c}let a=i;return e.json({userId:a.userId,orgId:a.orgId,role:a.role})});tu.delete("/orgs/:slug/members/:userId",gt(["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||!Kr.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 c=e.get("orgId"),{error:a}=await t.rpc("remove_member",{p_org:c,p_user:n});if(a){let l=Ft(a),m=vo(a);if(l==="P0001"){if(/not_a_member/i.test(m))return e.json({error:"Target user is not a member of this organization",code:"NOT_A_MEMBER"},404);if(/last_owner_violation/i.test(m))return e.json({error:"Cannot remove the last owner of this organization",code:"LAST_OWNER"},409);if(/forbidden/i.test(m))return e.json({error:"Forbidden",code:"ORG_FORBIDDEN"},403)}throw a}return e.body(null,204)});C();import{Hono as OL}from"hono";import{z as $o}from"zod";import{eq as qo,and as b0,asc as CL,sql as LL}from"drizzle-orm";var Uo=new OL,ML=$o.object({name:$o.string().min(1).max(100),slug:$o.string().regex(na,{message:ra})}),$L=$o.object({name:$o.string().min(1).max(100).optional(),slug:$o.string().regex(na,{message:ra}).optional()}),qL=$o.object({userId:$o.string().uuid()});Uo.get("/orgs/:slug/teams",gt(["owner","admin","member"]),async e=>{let t=e.get("orgId"),n=await d.select({id:G.id,name:G.name,slug:G.slug,createdAt:G.createdAt,memberCount:LL`count(${_e.userId})::int`}).from(G).leftJoin(_e,qo(_e.teamId,G.id)).where(qo(G.orgId,t)).groupBy(G.id,G.name,G.slug,G.createdAt).orderBy(CL(G.name));return e.json(n.map(r=>({id:r.id,name:r.name,slug:r.slug,memberCount:Number(r.memberCount),createdAt:r.createdAt})))});Uo.post("/orgs/:slug/teams",gt(["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=ML.safeParse(t);if(!n.success)return e.json({error:n.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let r=e.get("orgId"),{name:o,slug:s}=n.data;try{let[i]=await d.insert(G).values({orgId:r,name:o,slug:s}).returning({id:G.id,orgId:G.orgId,name:G.name,slug:G.slug,createdAt:G.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(Ft(i)==="23505")return e.json({error:"Slug already taken",code:"TEAM_SLUG_TAKEN"},409);throw i}});Uo.patch("/orgs/:slug/teams/:teamId",gt(["owner","admin"]),async e=>{let t=await Cs(e);if(!t.ok)return t.response;let n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let r=$L.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let{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[c]=await d.update(G).set(i).where(qo(G.id,t.team.id)).returning({id:G.id,orgId:G.orgId,name:G.name,slug:G.slug,createdAt:G.createdAt});return e.json({id:c.id,orgId:c.orgId,name:c.name,slug:c.slug,createdAt:c.createdAt})}catch(c){if(Ft(c)==="23505")return e.json({error:"Slug already taken",code:"TEAM_SLUG_TAKEN"},409);throw c}});Uo.delete("/orgs/:slug/teams/:teamId",gt(["owner","admin"]),async e=>{let t=await Cs(e);return t.ok?(await d.delete(G).where(qo(G.id,t.team.id)),e.body(null,204)):t.response});Uo.post("/orgs/:slug/teams/:teamId/members",gt(["owner","admin"]),async e=>{let t=await Cs(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=qL.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let{userId:o}=r.data,s=e.get("orgId"),[i]=await d.select({userId:Q.userId}).from(Q).where(b0(qo(Q.userId,o),qo(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 d.insert(_e).values({userId:o,teamId:t.team.id})}catch(c){if(Ft(c)==="23505")return e.json({error:"User is already a member of this team",code:"ALREADY_TEAM_MEMBER"},409);throw c}return e.json({userId:o,teamId:t.team.id},201)});Uo.delete("/orgs/:slug/teams/:teamId/members/:userId",gt(["owner","admin"]),async e=>{let t=await Cs(e);if(!t.ok)return t.response;let n=e.req.param("userId");return!n||!Kr.test(n)?e.json({error:"Invalid userId path param",code:"BAD_REQUEST"},400):(await d.delete(_e).where(b0(qo(_e.teamId,t.team.id),qo(_e.userId,n))).returning({userId:_e.userId})).length===0?e.json({error:"User is not a member of this team",code:"NOT_TEAM_MEMBER"},404):e.body(null,204)});C();import{Hono as ZL}from"hono";import{z as rm}from"zod";import{randomBytes as eM}from"node:crypto";import{eq as Hn,and as om,desc as tM,sql as nM,isNull as sa,gt as rM}from"drizzle-orm";import{randomBytes as UL}from"node:crypto";async function dh(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}
|
|
1054
|
+
`),{id:`noop-${UL(8).toString("hex")}`,provider:"noop"}}u(dh,"sendNoopEmail");var Zl=null;async function HL(){if(Zl)return Zl;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 Zl=new t(e),Zl}u(HL,"getClient");var S0=!1;function BL(){let e=process.env.RESEND_FROM_EMAIL;if(e)return e;if(!S0){S0=!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.
|
|
1055
|
+
`)}return"onboarding@resend.dev"}u(BL,"resolveFromEmail");async function A0(e){let t=e.fromName??"RuleMetric",n=BL(),r=`${t} <${n}>`,o=await HL(),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"}}u(A0,"sendResendEmail");async function E0(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.")}u(E0,"sendSmtpEmail");var FL="#2DD4BF",WL="#0d9488",zL="#0A0C12",em="#1a1a1a",tm="#666666",x0="#f5f5f7",VL="#ffffff",T0="#e5e5e9";function JL(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}`}u(JL,"formatExpiresAt");function oa(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}u(oa,"escapeHtml");function KL(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."}}u(KL,"roleCopy");function lh(e){let{orgName:t,inviterName:n,role:r,acceptUrl:o,expiresAt:s}=e,i=`${n} invited you to ${t} on RuleMetric`,c=JL(s),{article:a,description:l}=KL(r),m=`<!doctype html>
|
|
1139
1056
|
<html lang="en">
|
|
1140
1057
|
<head>
|
|
1141
1058
|
<meta charset="utf-8" />
|
|
1142
1059
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
1143
|
-
<title>${
|
|
1060
|
+
<title>${oa(i)}</title>
|
|
1144
1061
|
</head>
|
|
1145
|
-
<body style="margin:0;padding:0;background:${
|
|
1146
|
-
<table role="presentation" width="100%" cellspacing="0" cellpadding="0" border="0" style="background:${
|
|
1062
|
+
<body style="margin:0;padding:0;background:${x0};font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;color:${em};">
|
|
1063
|
+
<table role="presentation" width="100%" cellspacing="0" cellpadding="0" border="0" style="background:${x0};padding:32px 16px;">
|
|
1147
1064
|
<tr>
|
|
1148
1065
|
<td align="center">
|
|
1149
|
-
<table role="presentation" width="560" cellspacing="0" cellpadding="0" border="0" style="max-width:560px;background:${
|
|
1066
|
+
<table role="presentation" width="560" cellspacing="0" cellpadding="0" border="0" style="max-width:560px;background:${VL};border:1px solid ${T0};border-radius:8px;overflow:hidden;">
|
|
1150
1067
|
<tr>
|
|
1151
1068
|
<td style="padding:32px 32px 8px 32px;">
|
|
1152
|
-
<h1 style="margin:0 0 16px 0;font-size:22px;line-height:1.3;font-weight:600;color:${
|
|
1153
|
-
You've been invited to ${
|
|
1069
|
+
<h1 style="margin:0 0 16px 0;font-size:22px;line-height:1.3;font-weight:600;color:${em};">
|
|
1070
|
+
You've been invited to ${oa(t)}
|
|
1154
1071
|
</h1>
|
|
1155
|
-
<p style="margin:0 0 16px 0;font-size:15px;line-height:1.5;color:${
|
|
1072
|
+
<p style="margin:0 0 16px 0;font-size:15px;line-height:1.5;color:${em};">
|
|
1156
1073
|
Hi there,
|
|
1157
1074
|
</p>
|
|
1158
|
-
<p style="margin:0 0 16px 0;font-size:15px;line-height:1.5;color:${
|
|
1159
|
-
<strong>${
|
|
1160
|
-
<strong>${
|
|
1075
|
+
<p style="margin:0 0 16px 0;font-size:15px;line-height:1.5;color:${em};">
|
|
1076
|
+
<strong>${oa(n)}</strong> invited you to join
|
|
1077
|
+
<strong>${oa(t)}</strong> on RuleMetric as ${a}.
|
|
1161
1078
|
</p>
|
|
1162
|
-
<p style="margin:0 0 24px 0;font-size:15px;line-height:1.5;color:${
|
|
1079
|
+
<p style="margin:0 0 24px 0;font-size:15px;line-height:1.5;color:${tm};">
|
|
1163
1080
|
${l}
|
|
1164
1081
|
</p>
|
|
1165
1082
|
</td>
|
|
1166
1083
|
</tr>
|
|
1167
1084
|
<tr>
|
|
1168
1085
|
<td align="center" style="padding:0 32px 8px 32px;">
|
|
1169
|
-
<a href="${
|
|
1170
|
-
style="display:inline-block;padding:12px 24px;background:${
|
|
1086
|
+
<a href="${oa(o)}"
|
|
1087
|
+
style="display:inline-block;padding:12px 24px;background:${FL};color:${zL};text-decoration:none;border-radius:6px;font-size:15px;font-weight:600;">
|
|
1171
1088
|
Accept invitation
|
|
1172
1089
|
</a>
|
|
1173
1090
|
</td>
|
|
1174
1091
|
</tr>
|
|
1175
1092
|
<tr>
|
|
1176
1093
|
<td style="padding:16px 32px 8px 32px;">
|
|
1177
|
-
<p style="margin:0 0 8px 0;font-size:13px;line-height:1.5;color:${
|
|
1094
|
+
<p style="margin:0 0 8px 0;font-size:13px;line-height:1.5;color:${tm};">
|
|
1178
1095
|
Or copy and paste this link into your browser:
|
|
1179
1096
|
</p>
|
|
1180
|
-
<p style="margin:0 0 24px 0;font-size:13px;line-height:1.5;color:${
|
|
1181
|
-
${
|
|
1097
|
+
<p style="margin:0 0 24px 0;font-size:13px;line-height:1.5;color:${WL};word-break:break-all;">
|
|
1098
|
+
${oa(o)}
|
|
1182
1099
|
</p>
|
|
1183
|
-
<p style="margin:0 0 24px 0;font-size:13px;line-height:1.5;color:${
|
|
1184
|
-
This invitation expires on <strong>${
|
|
1100
|
+
<p style="margin:0 0 24px 0;font-size:13px;line-height:1.5;color:${tm};">
|
|
1101
|
+
This invitation expires on <strong>${c}</strong>.
|
|
1185
1102
|
</p>
|
|
1186
1103
|
</td>
|
|
1187
1104
|
</tr>
|
|
1188
1105
|
<tr>
|
|
1189
|
-
<td style="padding:16px 32px 32px 32px;border-top:1px solid ${
|
|
1190
|
-
<p style="margin:0;font-size:12px;line-height:1.5;color:${
|
|
1106
|
+
<td style="padding:16px 32px 32px 32px;border-top:1px solid ${T0};">
|
|
1107
|
+
<p style="margin:0;font-size:12px;line-height:1.5;color:${tm};">
|
|
1191
1108
|
If you didn't expect this email, you can safely ignore it. The link will expire on its own.
|
|
1192
1109
|
</p>
|
|
1193
1110
|
</td>
|
|
@@ -1197,12 +1114,12 @@ end`;async function Os(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1197
1114
|
</tr>
|
|
1198
1115
|
</table>
|
|
1199
1116
|
</body>
|
|
1200
|
-
</html>`,
|
|
1201
|
-
`);return{subject:i,html:
|
|
1202
|
-
`)),t){case"resend":return
|
|
1203
|
-
`),
|
|
1204
|
-
`)),t="https://rulemetric.com"):t="http://localhost:5174"),`${t.replace(/\/$/,"")}/invite/${e}`}
|
|
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`
|
|
1117
|
+
</html>`,p=[`You've been invited to ${t}`,"","Hi there,","",`${n} invited you to join ${t} on RuleMetric as ${a}.`,"",l,"","Accept the invitation:",o,"",`This invitation expires on ${c}.`,"","--","If you didn't expect this email, you can safely ignore it. The link will expire on its own."].join(`
|
|
1118
|
+
`);return{subject:i,html:m,text:p}}u(lh,"renderInvitation");function GL(){let e=process.env.RULEMETRIC_EMAIL_PROVIDER;return e==="resend"||e==="smtp"||e==="noop"?e:process.env.RESEND_API_KEY?"resend":"noop"}u(GL,"selectEmailProvider");var YL=new Set(["test","example","invalid","localhost"]),XL=/^example\.(com|net|org)$/;function QL(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!!(YL.has(o)||XL.test(r))}u(QL,"isUndeliverableRecipient");var R0=!1;async function nm(e){let t=GL();switch(R0||(R0=!0,process.stderr.write(`[email] active provider: ${t}
|
|
1119
|
+
`)),t){case"resend":return QL(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
|
|
1120
|
+
`),dh(e)):A0(e);case"smtp":return E0(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 dh(e)}}u(nm,"sendEmail");var ia=new ZL;function N0(){return eM(32).toString("base64url")}u(N0,"generateInviteToken");var k0=!1;function j0(e){let t=process.env.WEB_URL??process.env.RULEMETRIC_WEB_URL;return t||(process.env.NODE_ENV==="production"?(k0||(k0=!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
|
|
1121
|
+
`)),t="https://rulemetric.com"):t="http://localhost:5174"),`${t.replace(/\/$/,"")}/invite/${e}`}u(j0,"buildAcceptUrl");async function P0(e){let[t]=await d.select({displayName:T.displayName,email:T.email}).from(T).where(Hn(T.id,e));return t?.displayName?.trim()||t?.email||"A teammate"}u(P0,"getInviterDisplayName");async function D0(e){try{let{subject:t,html:n,text:r}=lh({orgName:e.orgName,inviterName:e.inviterName,role:e.role,acceptUrl:e.acceptUrl,expiresAt:e.expiresAt});return(await nm({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}
|
|
1122
|
+
`),rr(t,{tags:{source:"invite-email"},extra:{to:e.to,orgName:e.orgName}}),{sent:!1,reason:n}}}u(D0,"sendInvitationEmail");var oM=rm.enum(["admin","member"]),sM=rm.object({email:rm.string().email().max(254),role:oM.optional(),teamId:rm.string().uuid().optional()});ia.post("/orgs/:slug/invitations",gt(["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=sM.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",c=n.data.teamId;if(c){let[f]=await d.select({id:G.id}).from(G).where(om(Hn(G.id,c),Hn(G.orgId,r)));if(!f)return e.json({error:"Team not found in this organization",code:"INVALID_TEAM"},400)}let a=N0(),l;try{let[f]=await d.insert(ae).values({orgId:r,email:s,role:i,teamId:c??null,invitedBy:o,token:a,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(Ft(f)==="23505")return e.json({error:"A pending invitation for this email already exists",code:"INVITE_ALREADY_PENDING"},409);throw f}let m=j0(a),[p]=await d.select({name:K.name}).from(K).where(Hn(K.id,r)),_=await P0(o),I=await D0({to:s,orgName:p?.name??"your organization",inviterName:_,role:l.role,acceptUrl:m,expiresAt:l.expiresAt}),h=process.env.NODE_ENV==="test";return e.json({id:l.id,email:l.email,role:l.role,teamId:l.teamId,expiresAt:l.expiresAt,acceptUrl:m,emailSent:I.sent,...I.sent?{}:{emailError:I.reason},...h?{token:a}:{}},201)});ia.get("/orgs/:slug/invitations",gt(["owner","admin"]),async e=>{let t=e.get("orgId"),n=await d.select({id:ae.id,email:ae.email,role:ae.role,teamId:ae.teamId,teamName:G.name,invitedById:ae.invitedBy,invitedByDisplayName:T.displayName,invitedByEmail:T.email,createdAt:ae.createdAt,expiresAt:ae.expiresAt}).from(ae).leftJoin(G,Hn(ae.teamId,G.id)).leftJoin(T,Hn(ae.invitedBy,T.id)).where(om(Hn(ae.orgId,t),sa(ae.acceptedAt),sa(ae.revokedAt),rM(ae.expiresAt,nM`now()`))).orderBy(tM(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})))});ia.post("/orgs/:slug/invitations/:id/revoke",gt(["owner","admin"]),async e=>{let t=e.req.param("id");if(!t||!Kr.test(t))return e.json({error:"Invalid invitation id",code:"BAD_REQUEST"},400);let n=e.get("orgId");return(await d.update(ae).set({revokedAt:new Date}).where(om(Hn(ae.id,t),Hn(ae.orgId,n),sa(ae.acceptedAt),sa(ae.revokedAt))).returning({id:ae.id})).length===0?e.json({error:"Invitation not found",code:"INVITE_NOT_FOUND"},404):e.body(null,204)});ia.post("/orgs/:slug/invitations/:id/resend",gt(["owner","admin"]),async e=>{let t=e.req.param("id");if(!t||!Kr.test(t))return e.json({error:"Invalid invitation id",code:"BAD_REQUEST"},400);let n=e.get("orgId"),r=N0(),o=new Date(Date.now()+10080*60*1e3),s=await d.update(ae).set({token:r,expiresAt:o}).where(om(Hn(ae.id,t),Hn(ae.orgId,n),sa(ae.acceptedAt),sa(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],c=j0(r),a=e.get("userId"),[l]=await d.select({name:K.name}).from(K).where(Hn(K.id,n)),m=await P0(a),p=await D0({to:i.email,orgName:l?.name??"your organization",inviterName:m,role:i.role,acceptUrl:c,expiresAt:i.expiresAt}),_=process.env.NODE_ENV==="test";return e.json({id:i.id,email:i.email,expiresAt:i.expiresAt,acceptUrl:c,emailSent:p.sent,...p.sent?{}:{emailError:p.reason},..._?{token:r}:{}})});C();import{Hono as iM}from"hono";import{eq as nu,and as C0,sql as L0,inArray as mh,gte as M0}from"drizzle-orm";var im=new iM,sm={"7d":7,"30d":30},O0={fully_achieved:1,mostly_achieved:.75,partially_achieved:.5,unclear_from_transcript:.25,not_achieved:0};async function ph(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 c=[...i.entries()].sort((A,E)=>E[1]-A[1]).slice(0,5).map(([A,E])=>({tool:A,count:E})),a=new Map;for(let A of e)a.set(A.userId,(a.get(A.userId)??0)+1);let l=[...a.entries()].sort((A,E)=>E[1]-A[1]).slice(0,5).map(([A])=>A),m=l.length?await d.select({id:T.id,displayName:T.displayName,email:T.email}).from(T).where(mh(T.id,l)):[],p=new Map(m.map(A=>[A.id,A])),_=l.map(A=>{let E=p.get(A);return{userId:A,displayName:E?.displayName??null,email:E?.email??null,count:a.get(A)??0}}),I=new Map;for(let A of e){let E=A.analysis;if(!E)continue;let R=E.friction;if(!R)continue;let P=Object.values(R).reduce((q,H)=>q+(typeof H=="number"?H:0),0),N=A.startedAt.toISOString().split("T")[0]??"",D=I.get(N)??{sum:0,count:0};D.sum+=P,D.count+=1,I.set(N,D)}let h=[...I.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 d.select({sessionId:se.sessionId,instructionId:se.instructionId,name:g.name,source:L0`${g.frontmatter}->>'source'`}).from(se).innerJoin(g,nu(g.id,se.instructionId)).where(mh(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 v=new Map;for(let A of e){let E=A.analysis;if(!E)continue;let R=E.outcome;R&&R in O0&&v.set(A.id,O0[R])}let S=[];for(let[A,{name:E,source:R,sessions:P}]of b){let N=[],D=[];for(let he of e){let te=v.get(he.id);te!==void 0&&(P.has(he.id)?N.push(te):D.push(te))}let q=u(he=>he.length===0?null:he.reduce((te,Te)=>te+Te,0)/he.length,"avg"),H=q(N),B=q(D),ee=H!==null&&B!==null?Math.round((H-B)*1e3)/10:null;S.push({instructionId:A,name:E,source:R,withSessions:P.size,withoutSessions:e.length-P.size,deltaPct:ee})}return{range:t,sessionCount:e.length,memberCount:n,topTools:c,topMembers:_,frictionTrend:h,instructionEffectiveness:S}}u(ph,"buildActivityResponse");im.get("/orgs/:slug/activity",gt(["owner","admin","member"]),async e=>{let t=e.get("orgId"),n=e.req.query("range")??"7d";if(!(n in sm))return e.json({error:"Invalid range. Allowed: 7d, 30d",code:"BAD_REQUEST"},400);let r=new Date(Date.now()-sm[n]*24*60*60*1e3),o=await d.select({id:y.id,userId:y.userId,tool:y.tool,startedAt:y.startedAt,analysis:y.analysis}).from(y).where(C0(nu(y.orgId,t),M0(y.startedAt,r))),[{count:s}]=await d.select({count:L0`count(*)::int`}).from(Q).where(nu(Q.orgId,t)),i=await ph(o,n,Number(s),t,r,null);return e.json(i)});im.get("/orgs/:slug/teams/:teamId/activity",gt(["owner","admin","member"]),async e=>{let t=await Cs(e);if(!t.ok)return t.response;let n=t.team,r=e.req.query("range")??"7d";if(!(r in sm))return e.json({error:"Invalid range. Allowed: 7d, 30d",code:"BAD_REQUEST"},400);let o=new Date(Date.now()-sm[r]*24*60*60*1e3),s=e.get("orgId"),c=(await d.select({userId:_e.userId}).from(_e).where(nu(_e.teamId,n.id))).map(m=>m.userId);if(c.length===0){let m=await ph([],r,0,s,o,[]);return e.json(m)}let a=await d.select({id:y.id,userId:y.userId,tool:y.tool,startedAt:y.startedAt,analysis:y.analysis}).from(y).where(C0(nu(y.orgId,s),M0(y.startedAt,o),mh(y.userId,c))),l=await ph(a,r,c.length,s,o,c);return e.json(l)});var Ho=new aM;Ho.route("/",Mo);Ho.route("/",tu);Ho.route("/",Uo);Ho.route("/",ia);Ho.route("/",im);C();import{Hono as cM}from"hono";import{z as fh}from"zod";import{createClient as uM}from"@supabase/supabase-js";import{eq as ru,and as $0,isNull as q0,sql as U0}from"drizzle-orm";var ou=new cM;ou.get("/:token",async e=>{let t=e.req.param("token");if(!t||t.length<8)return e.json({error:"Invitation no longer valid",code:"INVITE_GONE"},410);let[n]=await d.select({orgName:K.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(K,ru(ae.orgId,K.id)).leftJoin(T,ru(ae.invitedBy,T.id)).where(ru(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,c=e.req.header("Authorization");if(c?.startsWith("Bearer ")){let l=c.slice(7);if(l&&!l.startsWith("rm_"))try{let m=uM(process.env.SUPABASE_URL,process.env.SUPABASE_ANON_KEY,{global:{headers:{Authorization:`Bearer ${l}`}}}),{data:p,error:_}=await m.auth.getUser();!_&&p.user&&(s=p.user.id,i=p.user.email)}catch{}}let a=null;if(s&&i&&i.toLowerCase()===n.email.toLowerCase()){let[{cnt:l}]=await d.select({cnt:U0`count(*)::int`}).from(y).where($0(ru(y.userId,s),q0(y.orgId)));a=Number(l)}return e.json({orgName:n.orgName,inviterName:n.inviterDisplayName??n.inviterEmail??null,role:n.role,sessionCount:a})});var dM=fh.object({token:fh.string().min(1),acknowledgedSessionCount:fh.number().int().nonnegative()});ou.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=dM.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:a}]=await d.select({cnt:U0`count(*)::int`}).from(y).where($0(ru(y.userId,o),q0(y.orgId))),l=Number(a);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 a=Ft(i),l=vo(i);if(a==="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 c=s;return e.json({orgId:c.orgId,role:c.role})});C();import{Hono as lM}from"hono";import{z as su}from"zod";import{eq as iu,and as mM}from"drizzle-orm";var au=new lM;au.get("/profile",async e=>{let t=e.get("userId"),[n]=await d.select({id:T.id,email:T.email,displayName:T.displayName,activeOrgId:T.activeOrgId,isSuperadmin:T.isSuperadmin,claudeCodePlan:T.claudeCodePlan,planSource:T.planSource,setupCompletedAt:T.setupCompletedAt,liveSendSkipped:T.liveSendSkipped}).from(T).where(iu(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 pM=["free","pro","max_5x","max_20x"],fM=su.object({activeOrgId:su.string().uuid().nullable().optional(),claudeCodePlan:su.enum(pM).nullable().optional(),setupCompletedAt:su.string().datetime().nullable().optional(),liveSendSkipped:su.boolean().optional()});au.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=fM.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[c]=await d.select({orgId:Q.orgId}).from(Q).where(mM(iu(Q.userId,t),iu(Q.orgId,o.activeOrgId)));if(!c)return e.json({error:"You are not a member of the requested organization",code:"NOT_A_MEMBER"},403)}let s={};"activeOrgId"in o&&(s.activeOrgId=o.activeOrgId??null),"claudeCodePlan"in o&&(s.claudeCodePlan=o.claudeCodePlan??null,s.planSource=o.claudeCodePlan==null?"detected":"manual"),"setupCompletedAt"in o&&(s.setupCompletedAt=o.setupCompletedAt?new Date(o.setupCompletedAt):null),"liveSendSkipped"in o&&(s.liveSendSkipped=o.liveSendSkipped),Object.keys(s).length>0&&await d.update(T).set(s).where(iu(T.id,t));let[i]=await d.select({activeOrgId:T.activeOrgId,claudeCodePlan:T.claudeCodePlan,planSource:T.planSource,setupCompletedAt:T.setupCompletedAt,liveSendSkipped:T.liveSendSkipped}).from(T).where(iu(T.id,t));return e.json({activeOrgId:i.activeOrgId,claudeCodePlan:i.claudeCodePlan,planSource:i.planSource,setupCompletedAt:i.setupCompletedAt,liveSendSkipped:i.liveSendSkipped})});C();import{Hono as hM}from"hono";import{z as ht}from"zod";import{asc as H0,eq as Ls,sql as Bn}from"drizzle-orm";C();import{eq as gM}from"drizzle-orm";function cu(){return async(e,t)=>{let n=e.get("userId");if(!n)return e.json({error:"Unauthenticated",code:"UNAUTHENTICATED"},401);let[r]=await d.select({isSuperadmin:T.isSuperadmin}).from(T).where(gM(T.id,n));if(!r?.isSuperadmin)return e.json({error:"Forbidden",code:"NOT_SUPERADMIN"},403);await t()}}u(cu,"requireSuperadmin");jc();var fn=new hM;fn.use("/superadmin/*",cu());var _M=ht.object({search:ht.string().trim().min(1).max(120).optional(),limit:ht.coerce.number().int().min(1).max(200).default(50),offset:ht.coerce.number().int().min(0).default(0)});fn.get("/superadmin/users",async e=>{let t=_M.safeParse({search:e.req.query("search"),limit:e.req.query("limit"),offset:e.req.query("offset")});if(!t.success)return e.json({error:t.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let{search:n,limit:r,offset:o}=t.data,s=await d.execute(Bn`
|
|
1206
1123
|
select
|
|
1207
1124
|
p.id,
|
|
1208
1125
|
p.email,
|
|
@@ -1224,16 +1141,16 @@ end`;async function Os(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1224
1141
|
count(*) filter (where org_id is null)::int as orphan
|
|
1225
1142
|
from sessions group by user_id
|
|
1226
1143
|
) s on s.user_id = p.id
|
|
1227
|
-
${n?
|
|
1144
|
+
${n?Bn`where p.email ilike ${"%"+rt(n)+"%"}`:Bn``}
|
|
1228
1145
|
order by p.created_at desc
|
|
1229
1146
|
limit ${r} offset ${o}
|
|
1230
|
-
`),[{total:i}]=await
|
|
1147
|
+
`),[{total:i}]=await d.execute(Bn`
|
|
1231
1148
|
select count(*)::int as total from profiles p
|
|
1232
|
-
${n?
|
|
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(!
|
|
1149
|
+
${n?Bn`where p.email ilike ${"%"+rt(n)+"%"}`:Bn``}
|
|
1150
|
+
`);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(!ht.string().uuid().safeParse(t).success)return e.json({error:"Invalid user id",code:"VALIDATION_ERROR"},400);let[n]=await d.select({id:T.id,email:T.email,displayName:T.displayName,isSuperadmin:T.isSuperadmin,activeOrgId:T.activeOrgId,createdAt:T.createdAt}).from(T).where(Ls(T.id,t));if(!n)return e.json({error:"User not found",code:"USER_NOT_FOUND"},404);let r=await d.select({orgId:K.id,orgName:K.name,orgSlug:K.slug,role:Q.role}).from(Q).innerJoin(K,Ls(K.id,Q.orgId)).where(Ls(Q.userId,t)).orderBy(H0(K.name)),[o]=await d.select({total:Bn`count(*)::int`,orphan:Bn`count(*) filter (where org_id is null)::int`}).from(y).where(Ls(y.userId,t)),s={banned:!1,bannedUntil:null,lastSignInAt:null};try{let{data:i,error:c}=await On().auth.admin.getUserById(t);!c&&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 B0(e){let[t]=await d.execute(Bn`
|
|
1234
1151
|
select count(*)::int as n from profiles
|
|
1235
1152
|
where is_superadmin = true and id <> ${e}
|
|
1236
|
-
`);return t?.n??0}
|
|
1153
|
+
`);return t?.n??0}u(B0,"countOtherSuperadmins");fn.post("/superadmin/users/:id/force-logout",async e=>{let t=e.req.param("id");if(!ht.string().uuid().safeParse(t).success)return e.json({error:"Invalid user id",code:"VALIDATION_ERROR"},400);if(t===e.get("userId"))return e.json({error:"Cannot force-logout yourself",code:"SELF_ACTION_FORBIDDEN"},400);try{await d.execute(Bn`update auth.refresh_tokens set revoked = true where user_id = ${t}`),await d.execute(Bn`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(!ht.string().uuid().safeParse(t).success)return e.json({error:"Invalid user id",code:"VALIDATION_ERROR"},400);let[n]=await d.select({email:T.email}).from(T).where(Ls(T.id,t));if(!n?.email)return e.json({error:"User not found",code:"USER_NOT_FOUND"},404);let{data:r,error:o}=await On().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 yM=ht.object({suspended:ht.boolean()});fn.patch("/superadmin/users/:id/suspend",async e=>{let t=e.req.param("id");if(!ht.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=yM.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);if(r.data.suspended){let[c]=await d.select({isSuperadmin:T.isSuperadmin}).from(T).where(Ls(T.id,t));if(c?.isSuperadmin&&await B0(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 On().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 wM=ht.object({confirmEmail:ht.string().email()});fn.delete("/superadmin/users/:id",async e=>{let t=e.req.param("id");if(!ht.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=wM.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let[o]=await d.select({email:T.email,isSuperadmin:T.isSuperadmin}).from(T).where(Ls(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 B0(t)===0)return e.json({error:"Cannot delete the last superadmin",code:"LAST_SUPERADMIN"},409);let{error:s}=await On().auth.admin.deleteUser(t);return s?e.json({error:s.message,code:"AUTH_ADMIN_ERROR"},400):e.json({ok:!0})});var vM=ht.object({email:ht.string().email(),orgId:ht.string().uuid().optional(),role:ht.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=vM.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=On(),c=process.env.WEB_URL??"http://localhost:5174",{data:a,error:l}=await i.auth.admin.inviteUserByEmail(r,{redirectTo:`${c}/auth/confirm`});if(l)return e.json({error:l.message,code:"AUTH_ADMIN_ERROR"},400);let m=a.user?.id,p=null;if(m&&o&&s){let _=e.get("supabase");if(_){let{error:I}=await _.rpc("superadmin_assign_user_to_org",{p_user_id:m,p_org_id:o,p_role:s,p_claim_sessions:!1});I||(p={orgId:o,role:s})}}return e.json({ok:!0,userId:m??null,email:r,assigned:p})});var IM=ht.object({orgId:ht.string().uuid(),role:ht.enum(["owner","admin","member"]),claimSessions:ht.boolean().default(!0)});fn.post("/superadmin/users/:id/assign",async e=>{let t=e.req.param("id");if(!ht.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=IM.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,c=e.get("supabase");if(!c)return e.json({error:"Internal: no auth client",code:"INTERNAL"},500);let{data:a,error:l}=await c.rpc("superadmin_assign_user_to_org",{p_user_id:t,p_org_id:o,p_role:s,p_claim_sessions:i});if(l){let m=l.message.includes("not_authorized")?403:l.message.includes("org_not_found")||l.message.includes("user_not_found")?404:400;return e.json({error:l.message,code:"RPC_ERROR"},m)}return e.json(a)});fn.delete("/superadmin/users/:id/orgs/:orgId",async e=>{let t=e.req.param("id"),n=e.req.param("orgId");if(!ht.string().uuid().safeParse(t).success||!ht.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 d.select({id:K.id,name:K.name,slug:K.slug,memberCount:Bn`(select count(*)::int from user_organizations where org_id = organizations.id)`,createdAt:K.createdAt}).from(K).orderBy(H0(K.name));return e.json({orgs:t})});import{Hono as bM}from"hono";import{z as Bo}from"zod";var am=new bM,F0=Bo.object({type:Bo.string().min(1).max(64),payload:Bo.record(Bo.unknown()).optional(),timestamp:Bo.string().datetime().optional()}),SM=Bo.union([F0,Bo.object({events:Bo.array(F0).max(50)})]);am.post("/telemetry/extension-events",async e=>{let t=e.get("userId"),n=await e.req.json().catch(()=>null),r=SM.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)});C();import{Hono as AM}from"hono";import{z as Sr}from"zod";import{sql as EM}from"drizzle-orm";var uu=new AM,W0=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()}),xM=Sr.union([W0,Sr.object({events:Sr.array(W0).max(50)})]);uu.post("/telemetry/cli-events",async e=>{let t=e.get("userId"),n=xM.safeParse(await e.req.json().catch(()=>null));if(!n.success)return e.json({error:"invalid payload",details:n.error.flatten()},400);let r="events"in n.data?n.data.events:[n.data];return r.length===0||await d.insert(Gu).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)});uu.get("/telemetry/deployments",async e=>{let t=e.get("userId"),n=await d.execute(EM`
|
|
1237
1154
|
select
|
|
1238
1155
|
device_id,
|
|
1239
1156
|
count(*)::int as event_count,
|
|
@@ -1250,7 +1167,7 @@ end`;async function Os(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1250
1167
|
group by device_id
|
|
1251
1168
|
order by max(created_at) desc
|
|
1252
1169
|
limit 200
|
|
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`
|
|
1170
|
+
`);return e.json({deployments:n})});C();import{Hono as TM}from"hono";import{z as Fn}from"zod";var cm=new TM,RM=Fn.object({event:Fn.string().min(1).max(64),deviceId:Fn.string().max(128).optional(),command:Fn.string().max(128).optional(),statusCode:Fn.number().int().optional(),message:Fn.string().max(1e3).optional(),cliVersion:Fn.string().max(64).optional(),os:Fn.string().max(32).optional(),nodeVersion:Fn.string().max(32).optional(),proxied:Fn.boolean().optional(),props:Fn.record(Fn.unknown()).optional()});cm.post("/telemetry/cli-error",async e=>{let t=RM.safeParse(await e.req.json().catch(()=>null));if(!t.success)return e.json({error:"invalid payload",details:t.error.flatten()},400);let n=t.data;console.warn(`[cli-error-beacon] event=${n.event} command=${n.command??""} status=${n.statusCode??""} proxied=${n.proxied??""} cli=${n.cliVersion??""} os=${n.os??""} node=${n.nodeVersion??""} device=${n.deviceId??""} msg=${JSON.stringify(n.message??"")}`);try{await d.insert(Yu).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)});C();import{Hono as K0}from"hono";import{z as Yr}from"zod";import{createHash as kM,randomBytes as G0}from"node:crypto";import{and as z0,eq as gh,gt as NM,isNull as jM,lt as PM}from"drizzle-orm";var DM={vscode:"VS Code extension","vscode-insiders":"VS Code Insiders extension",cursor:"Cursor extension",windsurf:"Windsurf extension"},V0="VS Code extension";function OM(e){return e?DM[e]??V0:V0}u(OM,"editorKeyName");var J0=6e4;async function CM(){try{await d.delete(Rn).where(PM(Rn.expiresAt,new Date))}catch{}}u(CM,"sweepExpiredCodes");setInterval(()=>void CM(),5*6e4).unref?.();var du=new K0,LM=Yr.object({code:Yr.string().min(1).max(256)}),MM=Yr.object({refreshToken:Yr.string().min(1).max(2048)});du.post("/auth/extension/refresh",async e=>{let t=await e.req.json().catch(()=>null),n=MM.safeParse(t);if(!n.success)return e.json({error:"invalid request"},400);let r=await yd(n.data.refreshToken);return r.ok?e.json(r.session):e.json({error:r.error},r.status)});du.post("/auth/extension/exchange",async e=>{let t=await e.req.json().catch(()=>null),n=LM.safeParse(t);if(!n.success)return e.json({error:"invalid request"},400);let[r]=await d.delete(Rn).where(z0(gh(Rn.code,n.data.code),NM(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=OM(r.editor),{plaintext:s,hash:i,prefix:c}=qM();try{await d.transaction(async a=>{await a.update(be).set({revokedAt:new Date}).where(z0(gh(be.userId,r.userId),gh(be.name,o),jM(be.revokedAt))),await a.insert(be).values({userId:r.userId,name:o,keyHash:i,keyPrefix:c})})}catch(a){return console.log(`[auth] extension/exchange mint failed userId=${r.userId} err=${a.message}`),e.json({error:"could not mint session"},500)}return e.json({accessToken:s,expiresAt:null,email:r.email})});var um=new K0,$M=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 qM(){let e=`rm_${G0(32).toString("base64url")}`;return{plaintext:e,hash:kM("sha256").update(e).digest("hex"),prefix:e.slice(0,11)}}u(qM,"generateApiKey");um.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=$M.safeParse(n);if(!r.success)return e.json({error:"invalid request"},400);let o=G0(32).toString("base64url");try{await d.insert(Rn).values({code:o,userId:t,editor:r.data.editor??null,email:r.data.email??null,expiresAt:new Date(Date.now()+J0)})}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(J0/1e3),sessionStrategy:"api_key"})});jc();import{Hono as UM}from"hono";var dm=new UM;function HM(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}u(HM,"formatEmbed");async function BM(e){if(!e)return null;try{let t=On(),{data:n}=await t.auth.admin.getUserById(e);return n.user?.email??null}catch{return null}}u(BM,"lookupEmail");async function FM(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(()=>""))}u(FM,"postToDiscord");dm.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 BM(o.record?.user_id):null,c=HM(o,i);return c?(await FM(n,c),e.json({ok:!0})):e.json({ok:!0,skipped:!0})});C();import{Hono as n$}from"hono";import{z as Ue}from"zod";import{and as pu,desc as fm,eq as Ar,gte as Nh,isNull as r$,sql as o$}from"drizzle-orm";var _h="anthropic",WM=[{limitType:"five_hour_percent",unit:"percentage",displayName:"5-hour window"}],hh=[{limitType:"five_hour_percent",unit:"percentage",displayName:"5-hour window"},{limitType:"seven_day_percent",unit:"percentage",displayName:"Weekly window"}];function zM(e){return typeof e=="object"&&e!==null}u(zM,"isOAuthUsageResponse");function Y0(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:_h,plan:n,limitType:t,value:e.used_percentage,unit:"percentage",comparator:"=",resetsAt:i,sourceType:"oauth_usage",sourceUrl:r,sourceEvidence:o,confidence:1,observedAt:s}}u(Y0,"parseWindow");function VM(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}u(VM,"parseResetTime");var yh={id:_h,displayName:"Anthropic (Claude Code)",plans:["unknown","pro","max_5x","max_20x"],limits:{unknown:hh,pro:WM,max_5x:hh,max_20x:hh},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(!zM(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},c=[],a=Y0(n.five_hour,"five_hour_percent",o,s,i,r);a&&c.push(a);let l=Y0(n.seven_day,"seven_day_percent",o,s,i,r);return l&&c.push(l),c}},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=VM(t,e.observedAt);return[{provider:_h,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 wh="codex",vh="chatgpt.com",X0="/backend-api/codex/responses",JM="codex.rate_limits",Q0=["primary","secondary"];function KM(e,t){return t!=null?t>=1440?"seven_day_percent":"five_hour_percent":e==="secondary"?"seven_day_percent":"five_hour_percent"}u(KM,"limitTypeForWindow");var aa=[{limitType:"five_hour_percent",unit:"percentage",displayName:"5-hour usage"},{limitType:"seven_day_percent",unit:"percentage",displayName:"7-day usage"}],Ih={id:wh,displayName:"Codex CLI (OpenAI)",plans:["unknown","free","plus","pro","team","enterprise"],limits:{unknown:aa,free:aa,plus:aa,pro:aa,team:aa,enterprise:aa},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===vh&&t.startsWith(X0)},parse(e,t){let n;try{n=JSON.parse(e)}catch{return null}if(typeof n!="object"||n===null||n.type!==JM)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 c of Q0){let a=r[c];if(typeof a!="object"||a===null)continue;let l=a,m=l.used_percent??l.used_percentage;if(typeof m!="number"||!isFinite(m))continue;let p=m,_=l.window_minutes,I=typeof _=="number"&&isFinite(_)?_:null,h=KM(c,I),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:wh,plan:s,limitType:h,value:p,unit:"percentage",comparator:"=",resetsAt:f,sourceType:"live_stream",sourceUrl:`wss://${vh}${X0}`,sourceEvidence:{wireKey:c,frame:n},confidence:1,observedAt:o})}return i.length===0&&Q0.some(a=>{let l=r[a];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!==vh?null:[{provider:wh,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 lu={anthropic:yh,codex:Ih};function bh(e){for(let t of Object.values(lu))if(t.liveSource?.headers?.matchesHost(e))return t}u(bh,"matchLiveHeaders");function Sh(e,t){for(let n of Object.values(lu))if(n.liveSource?.streamFrame?.matches(e,t))return n}u(Sh,"matchStreamFrame");var cie=1440*60*1e3;C();import{and as eS,desc as tS,eq as mu,gte as QM,sql as ZM}from"drizzle-orm";function Ah(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"}u(Ah,"classifySeverity");function ca(e){switch(e){case"none":return 0;case"soft":return 1;case"approaching":return 2;case"imminent":return 3;case"hit":return 4}}u(ca,"severityRank");var lm={soft:"soft warning",approaching:"approaching limit",imminent:"imminent limit",hit:"limit reached"};function GM(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`}u(GM,"formatTimeLeft");function Eh(e,t,n,r,o=Date.now()){let s=GM(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 ${lm[e]}. Resets ${s}.`}u(Eh,"formatAlertMessage");function xh(e,t=new Date){if(e.length<2)return null;let n=300*1e3,r=t.getTime()-n,o=e.filter(v=>v.observedAt.getTime()>=r).sort((v,S)=>v.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(),c=o.map(v=>(v.observedAt.getTime()-i)/1e3),a=o.map(v=>v.value),l=c.length,m=c.reduce((v,S)=>v+S,0),p=a.reduce((v,S)=>v+S,0),_=c.reduce((v,S,A)=>v+S*a[A],0),I=c.reduce((v,S)=>v+S*S,0),h=l*I-m*m;if(h===0)return null;let f=(l*_-m*p)/h;return f<=0?null:(100-s.value)/f}u(xh,"projectExhaustion");var YM=300*1e3,XM=70;function Th(e){let{proposedSeverity:t,lastDispatch:n,currentUsedPercentage:r,now:o,isFirstTime429:s}=e;if(s)return!0;if(!n)return ca(t)>0;let i=ca(t),c=ca(n.severity);return i>c?!0:o.getTime()-n.lastDispatchedAt.getTime()>=YM?c>=ca("approaching")&&i===c?!(r>=XM):i>0:!1}u(Th,"shouldDispatch");function Rh(e){let t=xh(e.observations,e.now),n=Math.max(0,Math.floor((e.currentResetsAt.getTime()-e.now.getTime())/1e3)),r=Ah({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=Th({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}}u(Rh,"evaluate");function Z0(e,t,n){return`${e}:${t}:${n}`}u(Z0,"deriveAlertKey");C();async function ua(e){await en({userId:e.userId,type:`usage_${e.severity}`,title:e.title??`Usage limit \u2014 ${lm[e.severity]}`,body:e.message,url:"/usage",sourceTable:"alert_dispatches",sourceId:e.dispatchId})}u(ua,"notifyFromDispatch");var e$=30*6e4;async function mm(e,t){let n=new Date((t.observedAt??new Date).getTime()-e$);try{let o=await d.execute(ZM`
|
|
1254
1171
|
SELECT id, observed_at
|
|
1255
1172
|
FROM limit_observations
|
|
1256
1173
|
WHERE user_id = ${e}
|
|
@@ -1263,9 +1180,9 @@ end`;async function Os(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1263
1180
|
AND observed_at >= ${n.toISOString()}::timestamptz
|
|
1264
1181
|
ORDER BY observed_at DESC
|
|
1265
1182
|
LIMIT 1
|
|
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`
|
|
1183
|
+
`);if(o.length>0){let s=o[0];return{id:s.id,observedAt:new Date(s.observed_at).toISOString(),deduped:!0}}}catch(o){console.warn("[observe] dedup probe failed; proceeding to insert",o)}let[r]=await d.insert(ye).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:ye.id,observedAt:ye.observedAt});if(t.sourceType==="oauth_usage"||t.sourceType==="self_observed_429")try{let o=Z0(t.provider,t.plan,t.limitType),s=new Date,i=new Date(s.getTime()-600*1e3),c=await d.select({observedAt:ye.observedAt,value:ye.value}).from(ye).where(eS(mu(ye.userId,e),mu(ye.provider,t.provider),mu(ye.limitType,t.limitType),QM(ye.observedAt,i))).orderBy(tS(ye.observedAt)).limit(50),a=await d.select().from(yn).where(eS(mu(yn.userId,e),mu(yn.alertKey,o))).orderBy(tS(yn.lastDispatchedAt)).limit(1),l=Rh({alertKey:o,observations:c.map(m=>({observedAt:m.observedAt,value:Number(m.value)})),currentUsedPercentage:t.value,currentResetsAt:t.resetsAt??new Date(s.getTime()+300*60*1e3),hadObserved429:t.sourceType==="self_observed_429",lastDispatch:a[0]?{severity:a[0].severity,lastDispatchedAt:a[0].lastDispatchedAt,lastState:a[0].lastState}:null,now:s});if(l.shouldDispatch&&l.severity!=="none"){let m=l.severity,[p]=await d.insert(yn).values({userId:e,alertKey:o,severity:m,lastState:l.payload,channel:"banner"}).returning({id:yn.id});p&&await ua({userId:e,dispatchId:p.id,severity:m,message:Eh(m,t.limitType,l.payload.usedPercentage,l.payload.resetsAt)})}}catch(o){console.error("alert evaluation failed",o)}return{id:r.id,observedAt:new Date(r.observedAt).toISOString(),deduped:!1}}u(mm,"processObservation");function nS(e,t){return`${e}::${t.provider}::${t.sourceType}::${t.limitType}`}u(nS,"observationKey");function pm(){return process.env.OBSERVE_BATCHING!=="0"}u(pm,"observeBatchingEnabled");function rS(){let e=Number(process.env.OBSERVE_BATCH_BUFFER_MAX);return Number.isFinite(e)&&e>0?Math.floor(e):5e3}u(rS,"observeBufferMax");function oS(){let e=Number(process.env.PG_POOL_MAX)||3;return Math.max(1,e-1)}u(oS,"defaultConcurrency");function t$(e={}){let t=e.process??((b,v)=>mm(b,v)),n=e.maxBuffered??rS(),r=Math.max(1,e.concurrency??oS()),o=new Map,s=0,i=new Set,c=0,a=!1,l=[];function m(){let b=l;l=[];for(let v of b)v()}u(m,"notifyProgress");function p(){for(;c<r;){let b=null,v=null;for(let[S,A]of o)if(!(i.has(S)||A.length===0)){v=A,o.delete(S),b=S;break}if(b==null||v==null)return;s-=v.length,i.add(b),c++,_(b,v)}}u(p,"tick");async function _(b,v){try{for(let S of v)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{c--,i.delete(b),m(),p()}}u(_,"runDrain");function I(b){if(a||s>=n)return!1;let v=nS(b.userId,b.obs),S=o.get(v);return S?S.push(b):o.set(v,[b]),s++,p(),!0}u(I,"push");function h(b){return new Promise(v=>{let S=!1,A=u(()=>{S||(S=!0,clearTimeout(E),v())},"finish"),E=setTimeout(A,b);E.unref?.(),l.push(A)})}u(h,"waitForProgress");async function f(b){let v=b!=null?Date.now()+b:Number.POSITIVE_INFINITY;for(;;){if(p(),s===0&&c===0)return;let S=v-Date.now();if(S<=0)return;await h(Math.min(S,50))}}u(f,"flush");function w(){a=!0}return u(w,"stop"),{push:I,flush:f,stop:w,size:u(()=>s,"size"),inFlight:u(()=>c,"inFlight")}}u(t$,"createObserveBatcher");var Fo=null;function kh(){return Fo==null&&(Fo=t$()),Fo}u(kh,"getObserveBatcher");function sS(){kh(),console.log(`[observe-batcher] batched observe ingest ON (bufferMax=${rS()} drainConcurrency=${oS()}; OBSERVE_BATCHING=0 to disable)`)}u(sS,"initObserveBatcher");async function iS(e=5e3){if(Fo==null)return;Fo.stop(),await Fo.flush(e);let t=Fo.size()+Fo.inFlight();t>0&&console.warn(`[observe-batcher] shutdown flush deadline (${e}ms) hit; dropping ~${t} buffered observation(s)`)}u(iS,"shutdownObserveBatcher");var tr=new n$,s$=Ue.object({provider:Ue.string().min(1).max(64),plan:Ue.string().min(1).max(64),limitType:Ue.string().min(1).max(128),value:Ue.number().finite(),unit:Ue.string().min(1).max(32),comparator:Ue.enum(["=",">=","<="]).default("="),resetsAt:Ue.union([Ue.string(),Ue.date(),Ue.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:Ue.enum(["oauth_usage","self_observed_429","official_docs","self_observed_lower_bound","community","llm_research","release_notes","live_headers","live_stream"]),sourceUrl:Ue.string().url().optional().nullable(),sourceEvidence:Ue.unknown().optional(),confidence:Ue.number().min(0).max(1),observedAt:Ue.union([Ue.string(),Ue.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=Ue.object({host:Ue.string(),path:Ue.string().default("/"),responseHeaders:Ue.record(Ue.string()),observedAt:Ue.string().optional(),plan:Ue.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:c,observedAt:a,plan:l}=o.data,m=bh(s);if(!m?.liveSource?.headers)return e.json({observations:[]});let p={host:s,path:i,plan:l??null,observedAt:a?new Date(a):new Date,userId:t},_=m.liveSource.headers.parse(c,p);if(!_||_.length===0)return e.json({observations:[]});let I=[];for(let h of _)try{let f=h.observedAt instanceof Date?h.observedAt:typeof h.observedAt=="string"?new Date(h.observedAt):void 0,[w]=await d.insert(ye).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:ye.id});I.push({...h,id:w.id})}catch{}return e.json({observations:I})});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=Ue.object({host:Ue.string(),path:Ue.string().default("/"),frameText:Ue.string(),observedAt:Ue.string().optional(),plan:Ue.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:c,observedAt:a,plan:l}=o.data,m=Sh(s,i);if(!m?.liveSource?.streamFrame)return e.json({observations:[]});let p={host:s,path:i,plan:l??null,observedAt:a?new Date(a):new Date,userId:t},_=m.liveSource.streamFrame.parse(c,p);if(!_||_.length===0)return e.json({observations:[]});let I=[];for(let h of _)try{let f=h.observedAt instanceof Date?h.observedAt:typeof h.observedAt=="string"?new Date(h.observedAt):void 0,[w]=await d.insert(ye).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:ye.id});I.push({...h,id:w.id})}catch{}return e.json({observations:I})});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=s$.safeParse(n);if(!r.success)return e.json({error:"Invalid observation",issues:r.error.issues},400);let o=r.data;if(pm())return kh().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 mm(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=[r$(Ke.effectiveUntil)];t&&r.push(Ar(Ke.provider,t)),n&&r.push(Ar(Ke.plan,n));let o=await d.select().from(Ke).where(pu(...r)).orderBy(Ke.provider,Ke.plan,Ke.limitType,fm(Ke.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 d.select({id:xt.id,fetchedAt:xt.fetchedAt,provider:xt.provider,docUrl:xt.docUrl,contentHash:xt.contentHash,parseSuccess:xt.parseSuccess}).from(xt).where(Nh(xt.fetchedAt,n)).orderBy(xt.provider,xt.docUrl,fm(xt.fetchedAt)),o=new Map;for(let s of r){let i=`${s.provider}::${s.docUrl}`,c=o.get(i);c?(c.previousHash===null&&s.contentHash!==c.latestHash&&(c.previousHash=s.contentHash,c.changed=!0),c.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 d.select().from(ye).where(pu(Ar(ye.userId,t),Nh(ye.observedAt,r))).orderBy(fm(ye.observedAt)),s=new Map;for(let c of o){let a=`${c.provider}::${c.plan}::${c.limitType}`,l=s.get(a);l||(l={provider:c.provider,plan:c.plan,limitType:c.limitType,observations:[]},s.set(a,l)),l.observations.push({id:c.id,value:Number(c.value),unit:c.unit,sourceType:c.sourceType,confidence:Number(c.confidence),observedAt:c.observedAt})}let i=[];for(let c of s.values()){if(c.observations.length<2)continue;let a=c.observations.map(_=>_.value).filter(_=>_>0);if(a.length<2)continue;let l=Math.min(...a),m=Math.max(...a);if(l===0)continue;let p=(m-l)/l*100;p>20&&i.push({provider:c.provider,plan:c.plan,limitType:c.limitType,minValue:l,maxValue:m,spreadPct:p,observations:c.observations})}return i.sort((c,a)=>a.spreadPct-c.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 d.select({effectiveFrom:Ke.effectiveFrom,effectiveUntil:Ke.effectiveUntil,confidence:Ke.confidence,value:Ke.value}).from(Ke).where(pu(Ar(Ke.provider,t),Ar(Ke.plan,n),Ar(Ke.limitType,r),Nh(Ke.effectiveFrom,s))).orderBy(Ke.effectiveFrom);return e.json({items:i.map(c=>({effectiveFrom:c.effectiveFrom,effectiveUntil:c.effectiveUntil,confidence:Number(c.confidence),value:Number(c.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),c=[Ar(ye.userId,t)];n&&c.push(Ar(ye.provider,n)),r&&c.push(Ar(ye.plan,r)),o&&c.push(Ar(ye.limitType,o));let a=await d.select().from(ye).where(pu(...c)).orderBy(fm(ye.observedAt)).limit(s).offset(i),[{total:l}]=await d.select({total:o$`count(*)::int`}).from(ye).where(pu(...c));return e.json({items:a,total:l,limit:s,offset:i})});C();import{Hono as i$}from"hono";import{and as dS,desc as a$,eq as da,isNull as c$,ne as u$,sql as Er}from"drizzle-orm";var aS={free:.2,pro:1,max_5x:5,max_20x:20},Ph=new Set(["free","pro","max_5x","max_20x"]),jh={fiveHourMessages:20,sevenDaySonnetHours:14,sevenDayOpusHours:1.65};function cS(e){let t=aS[e]??aS.max_20x;return{fiveHourMessages:Math.round(jh.fiveHourMessages*t),sevenDaySonnetHours:Math.round(jh.sevenDaySonnetHours*t),sevenDayOpusHours:Math.round(jh.sevenDayOpusHours*t)}}u(cS,"planDefaultCaps");var fu=new i$,d$=60*1e3,Dh=new Map;function l$(e,t){let n=`${e}::${t}`,r=Dh.get(n);if(r&&Date.now()-r.at<d$)return r.rows;let o=d.select({limitType:Ke.limitType,value:Ke.value,unit:Ke.unit}).from(Ke).where(dS(da(Ke.provider,e),da(Ke.plan,t),c$(Ke.effectiveUntil)));return o.catch(()=>Dh.delete(n)),Dh.set(n,{at:Date.now(),rows:o}),o}u(l$,"getActivePlanLimits");var uS=["five_hour_percent","seven_day_percent","seven_day_opus_percent"],m$={anthropic:["oauth_usage"],codex:["live_stream","self_observed_429"]};function p$(e){return m$[e]??["oauth_usage"]}u(p$,"sourceTypesFor");fu.get("/usage/current-limits",async e=>{let t=e.get("userId"),n=e.req.query("provider")??"anthropic",r=p$(n),o=await d.execute(Er`
|
|
1267
1184
|
SELECT lt.limit_type AS limit_type, o.value AS value, o.resets_at AS resets_at, o.observed_at AS observed_at
|
|
1268
|
-
FROM (VALUES ${Er.join(
|
|
1185
|
+
FROM (VALUES ${Er.join(uS.map(i=>Er`(${i})`),Er`, `)}) AS lt(limit_type)
|
|
1269
1186
|
LEFT JOIN LATERAL (
|
|
1270
1187
|
SELECT max(resets_at) AS resets_at
|
|
1271
1188
|
FROM limit_observations
|
|
@@ -1286,27 +1203,27 @@ end`;async function Os(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1286
1203
|
ORDER BY (CASE WHEN w.resets_at IS NULL THEN 0 ELSE value END) DESC, observed_at DESC
|
|
1287
1204
|
LIMIT 1
|
|
1288
1205
|
) o ON true
|
|
1289
|
-
`),s=new Map;for(let i of o)i.value==null||i.observed_at==null||
|
|
1206
|
+
`),s=new Map;for(let i of o)i.value==null||i.observed_at==null||uS.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})});fu.get("/usage/inferred-caps",async e=>{let t=e.get("userId"),n=e.req.query("provider")??"anthropic",[r]=await d.select({plan:T.claudeCodePlan,source:T.planSource}).from(T).where(da(T.id,t)),o=r?.source==="manual"&&r.plan&&Ph.has(r.plan)?r.plan:null,s=await d.select({plan:ye.plan}).from(ye).where(dS(da(ye.userId,t),da(ye.provider,n),da(ye.sourceType,"oauth_usage"),u$(ye.plan,"unknown"))).orderBy(a$(ye.observedAt)).limit(1),i=s[0]?.plan&&Ph.has(s[0].plan)?s[0].plan:null,c=o??i??"max_20x",a=o===null&&i===null,l=cS(c),m=await l$(n,c);function p(f,w,b){let v=m.filter(S=>S.limitType===f&&w.test(S.unit));return v.length===0?b:Math.max(...v.map(S=>Number(S.value)))}u(p,"bestCap");let _=p("five_hour_messages",/msg|message/i,l.fiveHourMessages),I=p("seven_day_sonnet_hours",/hour|hr/i,l.sevenDaySonnetHours),h=p("seven_day_opus_hours",/hour|hr/i,l.sevenDayOpusHours);return e.header("Cache-Control","private, max-age=15"),e.json({plan:c,assumed:a,five_hour_percent:{inferred_cap:_,unit:"messages",confidence_band_pct:20},seven_day_percent:{inferred_cap:I,unit:"hours",confidence_band_pct:20},seven_day_opus_percent:{inferred_cap:h,unit:"hours",confidence_band_pct:20}})});C();import{Hono as f$}from"hono";import{z as nr}from"zod";import{and as lS,desc as fS,eq as gu,sql as g$}from"drizzle-orm";var _u=new f$,mS=30,h$=30,_$=0,Oh=1e3,pS=2e3,Ch=2;function hu(e){return e==null?0:typeof e=="number"?e:Number(e)}u(hu,"toNum");function y$(e){if(!e)return null;let t=typeof e=="string"?Date.parse(e):e.getTime();return Number.isNaN(t)?null:(Date.now()-t)/864e5}u(y$,"ageDays");async function w$(){let e=await d.select({provider:Qe.provider,modelId:Qe.modelId,inputPerM:Qe.inputPerM,outputPerM:Qe.outputPerM,effectiveFrom:Qe.effectiveFrom,verifiedAt:Qe.verifiedAt}).from(Qe).orderBy(fS(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}u(w$,"loadActiveRows");_u.get("/pricing/coverage",async e=>{if(!e.get("userId"))return e.json({error:"unauthorized"},401);let n=await d.execute(g$`
|
|
1290
1207
|
SELECT model,
|
|
1291
1208
|
COUNT(*)::int AS events,
|
|
1292
1209
|
MAX(timestamp) AS last_seen
|
|
1293
1210
|
FROM session_events
|
|
1294
1211
|
WHERE model IS NOT NULL
|
|
1295
1212
|
AND model NOT IN ('unknown', '(null)')
|
|
1296
|
-
AND timestamp > now() - (${
|
|
1213
|
+
AND timestamp > now() - (${h$} || ' days')::interval
|
|
1297
1214
|
GROUP BY model
|
|
1298
1215
|
ORDER BY events DESC
|
|
1299
|
-
`),r=await
|
|
1300
|
-
UPDATE ${
|
|
1216
|
+
`),r=await w$(),o=[],s=[],i=0;for(let c of n){let a=c.model,l=No(a),m=r.get(`${l}::${a}`);if(!m){o.push({provider:l,modelId:a,events:c.events,lastSeen:String(c.last_seen)});continue}let p=y$(m.verifiedAt??m.effectiveFrom);p===null||p>mS?s.push({provider:l,modelId:a,events:c.events,verifiedAt:m.verifiedAt?String(m.verifiedAt):null,ageDays:p===null?null:Math.round(p),currentInput:hu(m.inputPerM),currentOutput:hu(m.outputPerM)}):i+=1}return e.json({staleDays:mS,capturedModels:n.length,pricedFresh:i,unpriced:o,stale:s})});var v$=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()});_u.post("/pricing/rates",async e=>{if(!e.get("userId"))return e.json({error:"unauthorized"},401);let n=v$.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=u((h,f)=>h>_$&&h<=f,"inRange");if(!s(r.inputPerM,Oh)||!s(r.outputPerM,Oh))return e.json({status:"rejected",reason:`input/output out of range (0, ${Oh}]`},422);let i=r.cacheReadPerM??0,c=r.cacheWrite5mPerM??0,a=r.cacheWrite1hPerM??0;for(let[h,f]of[["cacheReadPerM",i],["cacheWrite5mPerM",c],["cacheWrite1hPerM",a]])if(f<0||f>pS)return e.json({status:"rejected",reason:`${h} out of range [0, ${pS}]`},422);let m=(await d.select().from(Qe).where(lS(gu(Qe.provider,o),gu(Qe.modelId,r.modelId))).orderBy(fS(Qe.effectiveFrom)).limit(1))[0],p=1e-9;if(m){let h=hu(m.inputPerM),f=hu(m.outputPerM),w=u((A,E)=>E<=0?1/0:A/E,"ratio"),b=Math.max(w(r.inputPerM,h),w(h,r.inputPerM)),v=Math.max(w(r.outputPerM,f),w(f,r.outputPerM));if(b>Ch||v>Ch)return e.json({status:"flagged",reason:`new rate differs from current by more than ${Ch}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)<p&&Math.abs(f-r.outputPerM)<p&&Math.abs(hu(m.cacheReadPerM)-i)<p)return await d.update(Qe).set({verifiedAt:new Date}).where(lS(gu(Qe.provider,o),gu(Qe.modelId,r.modelId),gu(Qe.effectiveFrom,m.effectiveFrom))),e.json({status:"unchanged",modelId:r.modelId})}let _=r.effectiveFrom?new Date(r.effectiveFrom):new Date,I=new Date().toISOString().slice(0,10);return await d.insert(Qe).values({provider:o,modelId:r.modelId,inputPerM:String(r.inputPerM),outputPerM:String(r.outputPerM),cacheReadPerM:String(i),cacheWrite5mPerM:String(c),cacheWrite1hPerM:String(a),contextWindow:r.contextWindow??null,effectiveFrom:_,verifiedAt:new Date,source:`auto-refresh-${I}`}).onConflictDoNothing(),e.json({status:"written",modelId:r.modelId,provider:o,effectiveFrom:_.toISOString()})});C();import{Hono as I$}from"hono";import{desc as b$,eq as S$}from"drizzle-orm";var gm=new I$;gm.get("/alerts/recent",async e=>{let t=e.get("userId"),n=await d.select().from(yn).where(S$(yn.userId,t)).orderBy(b$(yn.lastDispatchedAt)).limit(20);return e.json({items:n})});C();import{Hono as A$}from"hono";import{randomUUID as E$}from"node:crypto";import{sql as la}from"drizzle-orm";var hm=new A$,_S=300,gS=3e4,x$=6e4,T$=1e3,Lh={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"},R$=["session_send_jobs","launch_jobs","eval_jobs","insights_jobs","agent_jobs"];async function k$(e,t,n,r){if(n.length===0)return null;let o=la.join(n.map(i=>la`${i}`),la`, `),s=await d.execute(la`
|
|
1217
|
+
UPDATE ${la.raw(e)} AS m
|
|
1301
1218
|
SET status = 'claimed',
|
|
1302
1219
|
claimed_by = ${r},
|
|
1303
1220
|
claimed_at = now(),
|
|
1304
|
-
lease_expires_at = now() + (${
|
|
1221
|
+
lease_expires_at = now() + (${_S}::int * interval '1 second'),
|
|
1305
1222
|
attempts = m.attempts + 1,
|
|
1306
1223
|
updated_at = now()
|
|
1307
1224
|
FROM (
|
|
1308
1225
|
SELECT id
|
|
1309
|
-
FROM ${
|
|
1226
|
+
FROM ${la.raw(e)}
|
|
1310
1227
|
WHERE user_id = ${t}
|
|
1311
1228
|
AND status = 'pending'
|
|
1312
1229
|
AND task_kind IN (${o})
|
|
@@ -1317,7 +1234,7 @@ end`;async function Os(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1317
1234
|
) AS picked
|
|
1318
1235
|
WHERE m.id = picked.id
|
|
1319
1236
|
RETURNING m.id, m.task_kind, m.payload, m.attempts
|
|
1320
|
-
`);return s.length>0?s[0]:null}
|
|
1237
|
+
`);return s.length>0?s[0]:null}u(k$,"claimOne");async function N$(e,t,n){let r={};for(let o of t){let s=Lh[o];s&&(r[s]??=[]).push(o)}for(let o of R$){let s=r[o];if(!s)continue;let i=await k$(o,e,s,n);if(i)return{job:i,table:o}}return null}u(N$,"tryClaimAcrossTables");var j$={cron_suggest_instructions:[0,7,37]};function P$(e){let t=/rulemetric-cli\/(\d+)\.(\d+)\.(\d+)/.exec(e??"");return t?[Number(t[1]),Number(t[2]),Number(t[3])]:null}u(P$,"parseCliVersion");function D$(e,t){return e[0]!==t[0]?e[0]>t[0]:e[1]!==t[1]?e[1]>t[1]:e[2]>=t[2]}u(D$,"versionAtLeast");function O$(e,t){let n=P$(t),r=[],o=[];for(let s of e){let i=j$[s];i&&(!n||!D$(n,i))?o.push(s):r.push(s)}return{allowed:r,fenced:o}}u(O$,"fenceCapabilities");var hS=new Set;hm.get("/work/next",async e=>{let t=e.get("userId"),r=(e.req.query("capabilities")??"").split(",").map(m=>m.trim()).filter(m=>m.length>0&&m in Lh),{allowed:o,fenced:s}=O$(r,e.req.header("user-agent"));if(s.length>0&&!hS.has(t)&&(hS.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(Lh).join(", ")},400);if(o.length===0)return e.body(null,204);let i=Number.parseInt(e.req.query("waitMs")??`${gS}`,10),c=Number.isFinite(i)?Math.max(0,Math.min(i,x$)):gS,a=E$(),l=Date.now()+c;for(;;){let m=await N$(t,o,a);if(m)return e.json({id:m.job.id,kind:m.job.task_kind,payload:m.job.payload,attempts:m.job.attempts,leaseToken:a,leaseDurationSeconds:_S,table:m.table});if(Date.now()>=l)break;await new Promise(p=>setTimeout(p,T$))}return e.body(null,204)});C();import{Hono as M$}from"hono";import{z as yu}from"zod";import{sql as Xr}from"drizzle-orm";C();import{eq as xr,and as Mh}from"drizzle-orm";var C$=u(e=>`${(e*100).toFixed(1)}pp`,"pct"),L$=u(e=>`${(e/6e4).toFixed(0)} min`,"mins");function yS(e){let{targetName:t,evalTargetId:n,status:r,result:o,error:s}=e,i=t.split("/").pop()||t,c=`/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:c,metadata:{evalTargetId:n,outcome:"crashed"}};if(!o)return null;if(o.skipped==="infrastructure-incomplete"||o.skipped==="quota-exhausted"){let p=o.cost?.modelCalls;return{type:"evolution_blocked",title:`Evolution stopped by the environment \u2014 ${i}`,body:`${o.reason??o.skipped}`+(p?` (${p} model call(s) spent before stopping)`:"")+" This is not a verdict about the instruction.",url:c,metadata:{evalTargetId:n,outcome:o.skipped,reason:o.reason,cost:o.cost}}}if(o.skipped||!o.decision)return null;let a=o.nPairs??o.cost?.usablePairs,l=[];if(a!=null){let p=o.cost?.plannedPairs;l.push(`${a}${p?`/${p}`:""} paired task(s)`)}typeof o.cost?.mde=="number"&&l.push(`resolves \xB1${C$(o.cost.mde)}`),o.cost?.modelCalls&&l.push(`${o.cost.modelCalls} model calls`),o.cost?.wallMs&&l.push(L$(o.cost.wallMs));let m=o.applied?"APPLIED \u2014 the instruction was rewritten":"recorded only \u2014 nothing was changed";return{type:"evolution_decided",title:`Evolution: ${o.decision} \u2014 ${i}`,body:`${m}. ${l.join(", ")}.`,url:c,metadata:{evalTargetId:n,outcome:o.decision,applied:o.applied===!0,nPairs:a??null,promotionId:o.promotionId??null,cost:o.cost??null}}}u(yS,"buildEvolutionNotification");async function wS(e,t,n,r){try{let[o]=await d.select({evalTargetId:Re.evalTargetId,config:Re.config}).from(Re).where(Mh(xr(Re.id,t),xr(Re.userId,e)));if(!o||o.config?.type==="conversation")return;let[s]=await d.select({name:k.name}).from(k).where(xr(k.id,o.evalTargetId)),i=s?.name??"eval target";n==="failed"?await en({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 en({userId:e,type:"eval_completed",title:"Eval run complete",body:`${i} finished`,url:`/eval-targets/${o.evalTargetId}`,sourceTable:"eval_jobs",sourceId:t}),await Fc(e,o.evalTargetId))}catch(o){console.error("[job-notifications] eval notify failed:",o instanceof Error?o.stack:o)}}u(wS,"notifyEvalTerminal");async function vS(e,t,n,r){try{let[o]=await d.select({projectPath:W.projectPath}).from(W).where(Mh(xr(W.id,t),xr(W.userId,e)));if(!o)return;let s=null,i;if(o.projectPath){let[m]=await d.select({id:M.id,name:M.name}).from(de).innerJoin(M,xr(M.id,de.projectId)).where(xr(de.path,o.projectPath)).limit(1);m?(s=m.id,i=m.name):i=`${o.projectPath.split("/").pop()||"Unknown"} (unregistered)`}else i="All Projects";let c=new Date().toISOString().slice(0,10),a=`${s??"unmatched"}-${c}`,l=o.projectPath?`/insights/computed?projectPath=${encodeURIComponent(o.projectPath)}&tab=recommendations`:"/insights";n==="failed"?await en({userId:e,type:"insights_failed",title:"Insights generation failed",body:`${i}: ${String(r??"").slice(0,200)}`,url:l,sourceTable:"insights_jobs",sourceId:a}):await en({userId:e,type:"insights_ready",title:`Insights ready: ${i}`,body:"New recommendations are available",url:l,sourceTable:"insights_jobs",sourceId:a})}catch(o){console.error("[job-notifications] insights notify failed:",o instanceof Error?o.stack:o)}}u(vS,"notifyInsightsTerminal");async function IS(e,t,n,r){try{let[o]=await d.select({payload:ke.payload,result:ke.result}).from(ke).where(Mh(xr(ke.id,t),xr(ke.userId,e)));if(!o)return;let s=o.payload?.evalTargetId;if(!s)return;let[i]=await d.select({name:k.name}).from(k).where(xr(k.id,s)),c=yS({targetName:i?.name??"instruction",evalTargetId:s,status:n,result:o.result,error:r});if(!c)return;await en({userId:e,type:c.type,title:c.title,body:c.body,url:c.url,sourceTable:"agent_jobs",sourceId:t,metadata:c.metadata})}catch(o){console.error("[job-notifications] evolution notify failed:",o instanceof Error?o.stack:o)}}u(IS,"notifyEvolutionTerminal");async function SS(e,t,n,r,o){e==="process_eval"?await wS(t,n,r,o):e==="process_insights"?await vS(t,n,r,o):e==="cron_instruction_evolution"&&await IS(t,n,r,o)}u(SS,"notifyTerminal");var ma=new M$,bS=300,$h={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},$$=["session_send_jobs","launch_jobs","eval_jobs","insights_jobs","agent_jobs"];async function qh(e,t,n){for(let r of $$){let o=await d.execute(Xr`
|
|
1321
1238
|
SELECT status, attempts, task_kind
|
|
1322
1239
|
FROM ${Xr.raw(r)}
|
|
1323
1240
|
WHERE id = ${e}
|
|
@@ -1325,17 +1242,17 @@ end`;async function Os(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1325
1242
|
AND claimed_by = ${n}
|
|
1326
1243
|
AND status IN ('claimed', 'running')
|
|
1327
1244
|
LIMIT 1
|
|
1328
|
-
`);if(o.length>0)return{table:r,status:o[0].status,attempts:o[0].attempts,taskKind:o[0].task_kind}}return null}
|
|
1245
|
+
`);if(o.length>0)return{table:r,status:o[0].status,attempts:o[0].attempts,taskKind:o[0].task_kind}}return null}u(qh,"locateRow");var q$=yu.object({result:yu.unknown().optional()}),U$=yu.object({error:yu.string().min(1).max(8192),terminal:yu.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 qh(n,t,o);return s?(await d.execute(Xr`
|
|
1329
1246
|
UPDATE ${Xr.raw(s.table)}
|
|
1330
|
-
SET lease_expires_at = now() + (${
|
|
1247
|
+
SET lease_expires_at = now() + (${bS}::int * interval '1 second'),
|
|
1331
1248
|
updated_at = now()
|
|
1332
1249
|
WHERE id = ${n}
|
|
1333
1250
|
AND claimed_by = ${o}
|
|
1334
1251
|
AND status IN ('claimed', 'running')
|
|
1335
|
-
`),e.json({ok:!0,leaseDurationSeconds:
|
|
1252
|
+
`),e.json({ok:!0,leaseDurationSeconds:bS})):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=q$.safeParse(r);if(!s.success)return e.json({error:s.error.format()},400);let i=await qh(n,t,o);if(!i)return e.json({error:"job not found or lease lost"},404);let c=JSON.stringify(s.data.result??null);return await d.execute(Xr`
|
|
1336
1253
|
UPDATE ${Xr.raw(i.table)}
|
|
1337
1254
|
SET status = 'completed',
|
|
1338
|
-
result = ${
|
|
1255
|
+
result = ${c}::jsonb,
|
|
1339
1256
|
error = NULL,
|
|
1340
1257
|
completed_at = now(),
|
|
1341
1258
|
updated_at = now(),
|
|
@@ -1344,24 +1261,24 @@ end`;async function Os(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1344
1261
|
WHERE id = ${n}
|
|
1345
1262
|
AND claimed_by = ${o}
|
|
1346
1263
|
AND status IN ('claimed', 'running')
|
|
1347
|
-
`),await
|
|
1264
|
+
`),await SS(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=U$.safeParse(r);if(!s.success)return e.json({error:s.error.format()},400);let i=await qh(n,t,o);if(!i)return e.json({error:"job not found or lease lost"},404);let c=$h[i.taskKind]??3,a=s.data.terminal||i.attempts>=c,l=a?"failed":"pending";return await d.execute(Xr`
|
|
1348
1265
|
UPDATE ${Xr.raw(i.table)}
|
|
1349
1266
|
SET status = ${l},
|
|
1350
1267
|
error = ${s.data.error},
|
|
1351
1268
|
updated_at = now(),
|
|
1352
|
-
${Xr.raw(
|
|
1269
|
+
${Xr.raw(a?"completed_at = now(),":"")}
|
|
1353
1270
|
claimed_by = NULL,
|
|
1354
1271
|
claimed_at = NULL,
|
|
1355
1272
|
lease_expires_at = NULL
|
|
1356
1273
|
WHERE id = ${n}
|
|
1357
1274
|
AND claimed_by = ${o}
|
|
1358
1275
|
AND status IN ('claimed', 'running')
|
|
1359
|
-
`),
|
|
1360
|
-
`)),s=t.webBaseUrl??process.env.RULEMETRIC_WEB_URL??process.env.WEB_URL??"https://rulemetric.com";if(
|
|
1361
|
-
`)}),e.json({processing:!0,resumed:s,announcement:o},202)});
|
|
1276
|
+
`),a&&await SS(i.taskKind,t,n,"failed",s.data.error),e.json({ok:!0,requeued:!a,attempts:i.attempts})});C();import{Hono as G$}from"hono";import{z as Wo}from"zod";import{and as kS,desc as Y$,eq as Qr,isNotNull as X$,sql as NS}from"drizzle-orm";C();import{and as H$,asc as B$,eq as Tr,gt as F$,isNotNull as W$,sql as z$}from"drizzle-orm";var AS=100,ES=10,_m=new Set;function xS(e){return _m.has(e)}u(xS,"isAnnouncementSendInFlight");async function TS(e,t={}){let n=t.db??d,r=t.sendEmail??nm,o=t.log??(i=>process.stderr.write(`[announcement-sender] ${i}
|
|
1277
|
+
`)),s=t.webBaseUrl??process.env.RULEMETRIC_WEB_URL??process.env.WEB_URL??"https://rulemetric.com";if(_m.has(e))throw new Error(`Announcement ${e} send already in flight`);_m.add(e);try{return await V$({announcementId:e,db:n,sendEmail:r,log:o,webBaseUrl:s})}finally{_m.delete(e)}}u(TS,"sendAnnouncement");async function V$(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 c=0,a=0,l=0,m=0,p=null;try{for(;;){let v=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(H$(Tr(At.productAnnouncements,!0),W$(T.email),p?F$(At.userId,p):void 0)).orderBy(B$(At.userId)).limit(AS);if(v.length===0)break;p=v[v.length-1].userId;for(let S=0;S<v.length;S+=ES){let A=v.slice(S,S+ES),E=await Promise.allSettled(A.map(R=>K$({recipient:R,announcement:i,webBaseUrl:s,sendEmail:r,db:n})));for(let R=0;R<E.length;R++){let P=E[R];if(P.status==="fulfilled")P.value.ok==="sent"?c++:P.value.ok==="skipped"?l++:(a++,P.value.provider==="noop"&&m++,o(` recipient ${A[R].userId}: send failed \u2014 ${P.value.error}`));else{a++;let N=P.reason instanceof Error?P.reason.message:String(P.reason);o(` recipient ${A[R].userId}: send failed \u2014 ${N}`)}}}if(v.length<AS)break}m>0&&o(`WARNING: ${m} recipient(s) hit the noop email provider and were recorded as FAILED \u2014 no email provider is configured on this API instance (set RESEND_API_KEY)`);let _=await n.select({status:St.status,count:z$`count(*)::int`}).from(St).where(Tr(St.announcementId,t)).groupBy(St.status),I={};for(let v of _)I[v.status]=v.count;let h=I.sent??0,f=I.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=${c} failed=${a} skipped=${l})`),{sent:c,failed:a,skipped:l}}catch(_){let I=_ instanceof Error?_.message:String(_);throw await n.update(Oe).set({status:"failed",error:I.slice(0,1e3),updatedAt:new Date}).where(Tr(Oe.id,t)).catch(()=>{}),_}}u(V$,"runSend");function J$(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}u(J$,"escapeHtml");async function K$(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 c=i[0].id,a=r.replace(/\/$/,""),l=encodeURIComponent(t.unsubscribeToken),m=`${a}/unsubscribe/${l}`,p=t.displayName?.trim().split(/\s+/)[0]||"there",_=n.htmlBody.replaceAll("{{unsubscribe_url}}",m).replaceAll("{{recipient_name}}",J$(p)),I=n.textBody.replaceAll("{{unsubscribe_url}}",m).replaceAll("{{recipient_name}}",p);try{let h=await o({to:t.email,subject:n.subject,html:_,text:I,fromName:"RuleMetric",idempotencyKey:c,headers:{"List-Unsubscribe":`<${a}/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,c)),{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,c)),{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,c)).catch(()=>{}),{ok:"failed",error:f}}}u(K$,"sendOne");var Rr=new G$;Rr.use("/announcements/*",cu());Rr.use("/announcements",cu());Rr.get("/announcements",async e=>{let t=await d.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(Y$(Oe.createdAt));return e.json({announcements:t})});Rr.get("/announcements/:id",async e=>{let t=e.req.param("id");if(!Wo.string().uuid().safeParse(t).success)return e.json({error:"Invalid id",code:"VALIDATION_ERROR"},400);let[n]=await d.select().from(Oe).where(Qr(Oe.id,t));if(!n)return e.json({error:"Announcement not found",code:"NOT_FOUND"},404);let r=await d.select({status:St.status,count:NS`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(!Wo.string().uuid().safeParse(t).success)return e.json({error:"Invalid id",code:"VALIDATION_ERROR"},400);let n=await Q$();return e.json({count:n})});async function Q$(){let[e]=await d.select({count:NS`count(*)::int`}).from(At).innerJoin(T,Qr(T.id,At.userId)).where(kS(Qr(At.productAnnouncements,!0),X$(T.email)));return e?.count??0}u(Q$,"countOptedInRecipients");var RS=u(e=>e.includes("{{unsubscribe_url}}"),"hasUnsubscribePlaceholder"),Z$=Wo.object({subject:Wo.string().min(1).max(500).optional(),htmlBody:Wo.string().min(1).refine(RS,{message:"htmlBody must contain the {{unsubscribe_url}} placeholder"}).optional(),textBody:Wo.string().min(1).refine(RS,{message:"textBody must contain the {{unsubscribe_url}} placeholder"}).optional()});Rr.patch("/announcements/:id",async e=>{let t=e.req.param("id");if(!Wo.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=Z$.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let o=r.data;if(Object.keys(o).length===0)return e.json({error:"No fields to update",code:"VALIDATION_ERROR"},400);let[s]=await d.select().from(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 d.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(!Wo.string().uuid().safeParse(n).success)return e.json({error:"Invalid id",code:"VALIDATION_ERROR"},400);let r=await d.update(Oe).set({status:"queued",sentBy:t,updatedAt:new Date}).where(kS(Qr(Oe.id,n),Qr(Oe.status,"draft"))).returning(),o=r[0],s=!1;if(r.length===0){let[i]=await d.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")&&!xS(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 TS(n).catch(i=>{process.stderr.write(`[announcements] send loop for ${n} failed: ${i instanceof Error?i.message:String(i)}
|
|
1278
|
+
`)}),e.json({processing:!0,resumed:s,announcement:o},202)});C();import{Hono as e1}from"hono";import{inArray as PS,sql as jS}from"drizzle-orm";var wu=new e1;function DS(e){let t;try{t=decodeURIComponent(e)}catch{return[]}let n=t.replace(/=+$/,"").replaceAll("+","-").replaceAll("/","_");return t===n?[t]:[t,n]}u(DS,"tokenCandidates");wu.get("/:token",async e=>{let t=e.req.param("token");if(!t||t.length<8)return e.json({error:"invalid_token"},404);let n=DS(t);if(n.length===0)return e.json({error:"invalid_token"},404);let[r]=await d.select({productAnnouncements:At.productAnnouncements,unsubscribedAt:At.unsubscribedAt}).from(At).where(PS(At.unsubscribeToken,n)).limit(1);return r?e.json({valid:!0,alreadyUnsubscribed:r.productAnnouncements===!1}):e.json({error:"invalid_token"},404)});wu.post("/:token",async e=>{let t=e.req.param("token");if(!t||t.length<8)return e.json({error:"invalid_token"},404);let n=DS(t);return n.length===0?e.json({error:"invalid_token"},404):(await d.update(At).set({productAnnouncements:!1,unsubscribedAt:jS`now()`,updatedAt:jS`now()`}).where(PS(At.unsubscribeToken,n)).returning({userId:At.userId})).length===0?e.json({error:"invalid_token"},404):e.json({ok:!0})});C();import{createHash as t1}from"node:crypto";async function OS(){let e=[],t=0,n=0,r=0;for(let[o,s]of Object.entries(lu)){t++;for(let i of s.docs)try{let c=await fetch(i.url,{headers:{"User-Agent":"RuleMetric-Research/1.0"}});if(!c.ok){e.push({provider:o,url:i.url,message:`HTTP ${c.status}`});continue}let a=await c.text(),l=t1("sha256").update(a).digest("hex"),m=!0,p=[],_=null;try{p=i.parse(a)}catch(f){m=!1,_=f instanceof Error?f.message:String(f)}if((await d.insert(xt).values({provider:o,docUrl:i.url,contentHash:l,content:a,parseSuccess:m,parseErrors:_?[_]:null}).onConflictDoNothing({target:[xt.provider,xt.docUrl,xt.contentHash]}).returning({id:xt.id})).length===1&&m){for(let f of p)await d.insert(ye).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(c){e.push({provider:o,url:i.url,message:c instanceof Error?c.message:String(c)})}}return{providers_scraped:t,snapshots_inserted:n,observations_inserted:r,errors:e}}u(OS,"scrapeProviderDocs");var n1=360*60*1e3,CS=!1;function LS(){if(CS)return{stop:u(()=>{},"stop")};CS=!0;let e=setTimeout(()=>{OS().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(()=>{OS().then(n=>{n.errors.length>0&&console.warn("[research] scrape completed with errors:",n)}).catch(n=>console.warn("[research] scrape failed:",n))},n1);return{stop:u(()=>{clearTimeout(e),clearInterval(t)},"stop")}}u(LS,"startScrapeInterval");var J=new s1,u1=process.env.ALLOWED_ORIGINS?.split(",")??["http://localhost:5174","http://localhost:5175"];J.use("*",i1({origin:u(e=>e?u1.includes(e)?e:"":"*","origin"),allowMethods:["GET","POST","PUT","PATCH","DELETE","OPTIONS"],allowHeaders:["Authorization","Content-Type"],credentials:!0}));J.use("*",Dm());J.use("*",bw());J.use("/api/*",a1({maxSize:10*1024*1024}));J.use("*",Iw);J.use("/auth/login",rc(900*1e3,10));var US=rc(60*1e3,10);J.use("/api/auth/api-keys",US);J.use("/api/auth/api-keys/*",US);J.use("/api/invitations/*",rc(60*1e3,30));J.use("/api/telemetry/cli-error",rc(60*1e3,60));J.route("/",ii);J.route("/api",vd);J.route("/",oi);J.route("/",du);J.route("/api",wd);J.route("/api",cm);J.route("/",dm);J.use("/api/*",_w);J.use("/api/*",ww);J.use("/api/sessions/:id/context-snapshots",sc);J.use("/api/sessions/:id/events",sc);J.use("/api/sessions/import",sc);J.use("/api/internal/research/observe",sc);J.use("/api/*",async(e,t)=>{let n=e.req.path,r=e.req.method,o=r==="GET"&&n.startsWith("/api/invitations/")&&n!=="/api/invitations/accept",s=r==="GET"&&n==="/api/cli/latest-version",i=r==="POST"&&n==="/api/skills/sync-public",c=(r==="GET"||r==="POST")&&n.startsWith("/api/unsubscribe/");return o||s||i||c?t():fw(e,t)});J.route("/api",wn);J.route("/api",lc);J.route("/api",mc);J.route("/api",pc);J.route("/api",gc);J.route("/api",Nd);J.route("/api",ho);J.route("/api",bo);J.route("/api",Mc);J.route("/api",fr);J.route("/api",Sl);J.route("/api",Ui);J.route("/api",Hc);J.route("/api",hr);J.route("/api",Nl);J.route("/api",Eo);J.route("/api",Hi);J.route("/api",Is);J.route("/api",bs);J.route("/api",Fi);J.route("/api",Br);J.route("/api",As);J.route("/api",Ki);J.route("/api",Ro);J.route("/api",Ml);J.route("/api",$n);J.route("/api",pn);J.route("/api",Xi);J.route("/api",Jr);J.route("/api",Oo);J.route("/api",Zc);J.route("/api",ea);J.route("/api",Co);J.route("/api",br);J.route("/api",Os);J.route("/api",Ho);J.route("/api/invitations",ou);J.route("/api",au);J.route("/api",fn);J.route("/api",am);J.route("/api",uu);J.route("/api",tr);J.route("/api",fu);J.route("/api",_u);J.route("/api",gm);J.route("/api",hm);J.route("/api",ma);J.route("/api",Rr);J.route("/api/unsubscribe",wu);J.route("/api",um);var d1=setTimeout(()=>{Jl().catch(()=>{})},5e3),l1=LS(),HS=[{stop:u(()=>clearTimeout(d1),"stop")},l1],m1=pa.dirname(o1(import.meta.url)),Uh=process.env.WEB_DIST_PATH??pa.resolve(m1,"../../../apps/web/dist");if(vu.existsSync(Uh)){let e=u(async t=>{let n=pa.join(Uh,"index.html");if(!vu.existsSync(n))return t.notFound();let{stampRuntimeConfig:r}=await Promise.resolve().then(()=>(qS(),$S));return t.html(r(vu.readFileSync(n,"utf-8")))},"serveIndex");J.get("/",e),J.get("/index.html",e),J.use("/*",c1({root:Uh,rewriteRequestPath:u(t=>t,"rewriteRequestPath")})),J.get("*",e)}J.onError(gw);C();import{sql as kr}from"drizzle-orm";var p1=300*1e3,f1="reconciler: lease expired with attempts exhausted \u2014 agent likely crashed mid-run",g1="reconciler: in-flight row had no lease and attempts were exhausted \u2014 unclaimable and unswept until recovered",fa=1,h1=["eval_jobs","insights_jobs","launch_jobs","session_send_jobs","agent_jobs"];function ga(){return kr.join(Object.entries($h).map(([e,t])=>kr`WHEN ${e} THEN ${t}::int`),kr` `)}u(ga,"maxAttemptsCase");async function _1(e){let t=await d.execute(kr`
|
|
1362
1279
|
UPDATE ${kr.raw(e)}
|
|
1363
1280
|
SET status = 'failed',
|
|
1364
|
-
error = ${
|
|
1281
|
+
error = ${f1},
|
|
1365
1282
|
completed_at = now(),
|
|
1366
1283
|
claimed_by = NULL,
|
|
1367
1284
|
claimed_at = NULL,
|
|
@@ -1370,10 +1287,10 @@ end`;async function Os(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1370
1287
|
WHERE status IN ('claimed', 'running')
|
|
1371
1288
|
AND claimed_by IS NOT NULL
|
|
1372
1289
|
AND lease_expires_at < now()
|
|
1373
|
-
AND attempts >= (CASE task_kind ${
|
|
1374
|
-
AND lease_recoveries >= ${
|
|
1290
|
+
AND attempts >= (CASE task_kind ${ga()} ELSE 3 END)
|
|
1291
|
+
AND lease_recoveries >= ${fa}
|
|
1375
1292
|
RETURNING id
|
|
1376
|
-
`),n=await
|
|
1293
|
+
`),n=await d.execute(kr`
|
|
1377
1294
|
UPDATE ${kr.raw(e)}
|
|
1378
1295
|
SET status = 'pending',
|
|
1379
1296
|
attempts = GREATEST(attempts - 1, 0),
|
|
@@ -1386,31 +1303,31 @@ end`;async function Os(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1386
1303
|
AND claimed_by IS NOT NULL
|
|
1387
1304
|
AND lease_expires_at < now()
|
|
1388
1305
|
RETURNING id
|
|
1389
|
-
`),r=await
|
|
1306
|
+
`),r=await d.execute(kr`
|
|
1390
1307
|
UPDATE ${kr.raw(e)}
|
|
1391
1308
|
SET status = CASE
|
|
1392
|
-
WHEN attempts >= (CASE task_kind ${
|
|
1393
|
-
AND lease_recoveries >= ${
|
|
1309
|
+
WHEN attempts >= (CASE task_kind ${ga()} ELSE 3 END)
|
|
1310
|
+
AND lease_recoveries >= ${fa} THEN 'failed'
|
|
1394
1311
|
ELSE 'pending'
|
|
1395
1312
|
END,
|
|
1396
1313
|
attempts = CASE
|
|
1397
|
-
WHEN attempts >= (CASE task_kind ${
|
|
1398
|
-
AND lease_recoveries >= ${
|
|
1314
|
+
WHEN attempts >= (CASE task_kind ${ga()} ELSE 3 END)
|
|
1315
|
+
AND lease_recoveries >= ${fa} THEN attempts
|
|
1399
1316
|
ELSE GREATEST(attempts - 1, 0)
|
|
1400
1317
|
END,
|
|
1401
1318
|
lease_recoveries = CASE
|
|
1402
|
-
WHEN attempts >= (CASE task_kind ${
|
|
1403
|
-
AND lease_recoveries >= ${
|
|
1319
|
+
WHEN attempts >= (CASE task_kind ${ga()} ELSE 3 END)
|
|
1320
|
+
AND lease_recoveries >= ${fa} THEN lease_recoveries
|
|
1404
1321
|
ELSE lease_recoveries + 1
|
|
1405
1322
|
END,
|
|
1406
1323
|
error = CASE
|
|
1407
|
-
WHEN attempts >= (CASE task_kind ${
|
|
1408
|
-
AND lease_recoveries >= ${
|
|
1324
|
+
WHEN attempts >= (CASE task_kind ${ga()} ELSE 3 END)
|
|
1325
|
+
AND lease_recoveries >= ${fa} THEN ${g1}
|
|
1409
1326
|
ELSE error
|
|
1410
1327
|
END,
|
|
1411
1328
|
completed_at = CASE
|
|
1412
|
-
WHEN attempts >= (CASE task_kind ${
|
|
1413
|
-
AND lease_recoveries >= ${
|
|
1329
|
+
WHEN attempts >= (CASE task_kind ${ga()} ELSE 3 END)
|
|
1330
|
+
AND lease_recoveries >= ${fa} THEN now()
|
|
1414
1331
|
ELSE completed_at
|
|
1415
1332
|
END,
|
|
1416
1333
|
claimed_at = NULL,
|
|
@@ -1420,7 +1337,7 @@ end`;async function Os(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1420
1337
|
AND claimed_by IS NULL
|
|
1421
1338
|
AND updated_at < now() - interval '15 minutes'
|
|
1422
1339
|
RETURNING id
|
|
1423
|
-
`);return t.length+n.length+r.length}
|
|
1340
|
+
`);return t.length+n.length+r.length}u(_1,"reclaimExpiredLeases");async function y1(){return(await d.execute(kr`
|
|
1424
1341
|
UPDATE memory_experiments me
|
|
1425
1342
|
SET status = 'failed',
|
|
1426
1343
|
error = 'reconciler: worker died mid-experiment (backing job terminal, row left running)',
|
|
@@ -1433,12 +1350,12 @@ end`;async function Os(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1433
1350
|
AND aj.status IN ('failed', 'completed')
|
|
1434
1351
|
)
|
|
1435
1352
|
RETURNING me.id
|
|
1436
|
-
`)).length}
|
|
1353
|
+
`)).length}u(y1,"failStrandedMemoryExperiments");function BS(){let e=setTimeout(()=>{n()},3e4),t=setInterval(()=>{n()},p1);async function n(){try{let r=[];for(let o of h1)try{let s=await _1(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 y1();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 u(n,"runOnce"),{stop(){clearTimeout(e),clearInterval(t)}}}u(BS,"startReconciler");C();import{and as v1,eq as Bh,sql as ym}from"drizzle-orm";C();import{and as FS,eq as Hh,inArray as w1,sql as WS}from"drizzle-orm";async function zS(e,t){let n=new Map;if(t.length===0)return n;let r=t.map(p=>p.id),o=new Map(t.map(p=>[p.id,p.version])),i=(await d.select({id:y.id,projectId:y.projectId,outcome:WS`${y.analysis}->>'outcome'`}).from(y).where(FS(Hh(y.userId,e),WS`${y.analysis} is not null`)).orderBy(y.id)).map(p=>({id:p.id,key:p.projectId??"(no-project)",score:us(p.outcome)})).filter(p=>p.score!=null),c=await d.select({sessionId:Z.sessionId,treatmentId:Z.treatmentId,treatmentVersion:Z.treatmentVersion}).from(Z).where(FS(Hh(Z.userId,e),Hh(Z.treatmentType,"memory"),w1(Z.treatmentId,r))),a=new Map,l=new Map;for(let p of c){let _=p.treatmentVersion===o.get(p.treatmentId)?a:l,I=_.get(p.treatmentId);I||(I=new Set,_.set(p.treatmentId,I)),I.add(p.sessionId)}let m=u(p=>{let _=a.get(p);if(!_||_.size===0)return"insufficient";let I=l.get(p),h=new Map;for(let f of i){if(I?.has(f.id)&&!_.has(f.id))continue;let w=h.get(f.key);w||(w={key:f.key,withScores:[],withoutScores:[]},h.set(f.key,w)),(_.has(f.id)?w.withScores:w.withoutScores).push(f.score)}return cs(In([...h.values()],{iterations:1e3}))},"effectOf");for(let p of t)n.set(p.id,m(p.id));return n}u(zS,"computeTrustClasses");var I1=1800*1e3;async function b1(e,t){if(t.length===0)return;let n=ym.join(t.map(r=>ym`(${r.id}::uuid, ${r.trustClass}::text, ${r.version}::int)`),ym`, `);await d.execute(ym`
|
|
1437
1354
|
update memories m
|
|
1438
1355
|
set trust_class = v.cls, trust_version = v.ver, trust_computed_at = now()
|
|
1439
1356
|
from (values ${n}) as v(id, cls, ver)
|
|
1440
1357
|
where m.id = v.id and m.user_id = ${e}
|
|
1441
|
-
`)}
|
|
1358
|
+
`)}u(b1,"applyMaterializedTrust");async function S1(e){let t=await d.select({id:F.id,version:F.version}).from(F).where(v1(Bh(F.userId,e),Bh(F.status,"active")));if(t.length===0)return 0;let n=await zS(e,t),r=t.map(o=>({id:o.id,trustClass:n.get(o.id)??"insufficient",version:o.version}));return await b1(e,r),r.length}u(S1,"refreshMemoryTrustForUser");async function A1(){let e=await d.selectDistinct({userId:F.userId}).from(F).where(Bh(F.status,"active")),t=0;for(let{userId:n}of e)try{t+=await S1(n)}catch(r){console.error(`[memory-trust-refresh] user ${n} failed:`,r instanceof Error?r.stack:r)}return{users:e.length,memories:t}}u(A1,"refreshAllMemoryTrust");function VS(){let e=setTimeout(()=>void n(),45e3),t=setInterval(()=>void n(),I1);async function n(){try{let{users:r,memories:o}=await A1();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 u(n,"runOnce"),{stop(){clearTimeout(e),clearInterval(t)}}}u(VS,"startMemoryTrustRefresh");C();import{sql as E1}from"drizzle-orm";var x1=30*6e4,JS=24,T1=6,KS="pipeline:usage_observations_stale";async function R1(){let e=await d.execute(E1`
|
|
1442
1359
|
WITH active_users AS (
|
|
1443
1360
|
SELECT user_id, count(*) AS sessions_24h
|
|
1444
1361
|
FROM sessions
|
|
@@ -1469,13 +1386,13 @@ end`;async function Os(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1469
1386
|
LEFT JOIN latest_obs o ON o.user_id = a.user_id
|
|
1470
1387
|
LEFT JOIN first_seen f ON f.user_id = a.user_id
|
|
1471
1388
|
WHERE (o.last_observed IS NULL
|
|
1472
|
-
AND f.first_session < now() - make_interval(hours => ${
|
|
1473
|
-
OR o.last_observed < now() - make_interval(hours => ${
|
|
1389
|
+
AND f.first_session < now() - make_interval(hours => ${JS}))
|
|
1390
|
+
OR o.last_observed < now() - make_interval(hours => ${JS})
|
|
1474
1391
|
)
|
|
1475
1392
|
INSERT INTO alert_dispatches (user_id, alert_key, severity, channel, last_state)
|
|
1476
1393
|
SELECT
|
|
1477
1394
|
s.user_id,
|
|
1478
|
-
${
|
|
1395
|
+
${KS},
|
|
1479
1396
|
'soft',
|
|
1480
1397
|
'in_app',
|
|
1481
1398
|
jsonb_build_object(
|
|
@@ -1492,11 +1409,11 @@ end`;async function Os(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1492
1409
|
WHERE NOT EXISTS (
|
|
1493
1410
|
SELECT 1 FROM alert_dispatches d
|
|
1494
1411
|
WHERE d.user_id = s.user_id
|
|
1495
|
-
AND d.alert_key = ${
|
|
1496
|
-
AND d.last_dispatched_at > now() - make_interval(hours => ${
|
|
1412
|
+
AND d.alert_key = ${KS}
|
|
1413
|
+
AND d.last_dispatched_at > now() - make_interval(hours => ${T1})
|
|
1497
1414
|
)
|
|
1498
1415
|
RETURNING user_id, id, last_state->>'message' AS message
|
|
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}
|
|
1416
|
+
`);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}u(R1,"checkUsageStalenessOnce");function GS(){let e=setTimeout(()=>{n()},6e4),t=setInterval(()=>{n()},x1);async function n(){try{await R1()}catch(r){console.error("[usage-staleness] check failed:",r instanceof Error?r.stack:r)}}return u(n,"runOnce"),{stop:u(()=>{clearTimeout(e),clearInterval(t)},"stop")}}u(GS,"startUsageStalenessChecker");C();import{sql as k1}from"drizzle-orm";var N1=30*6e4,wm=24,j1=6,YS="pipeline:session_capture_stale";async function P1(){let e=await d.execute(k1`
|
|
1500
1417
|
WITH active_users AS (
|
|
1501
1418
|
SELECT user_id, max(last_seen) AS last_observed,
|
|
1502
1419
|
array_agg(DISTINCT signal) AS signals
|
|
@@ -1506,13 +1423,13 @@ end`;async function Os(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1506
1423
|
FROM limit_observations
|
|
1507
1424
|
WHERE source_type = 'oauth_usage'
|
|
1508
1425
|
AND user_id IS NOT NULL
|
|
1509
|
-
AND observed_at > now() - make_interval(hours => ${
|
|
1426
|
+
AND observed_at > now() - make_interval(hours => ${wm})
|
|
1510
1427
|
GROUP BY user_id
|
|
1511
1428
|
UNION ALL
|
|
1512
1429
|
SELECT user_id, max(last_heartbeat), 'worker heartbeat'
|
|
1513
1430
|
FROM worker_connections
|
|
1514
1431
|
WHERE worker_type = 'cli-worker'
|
|
1515
|
-
AND last_heartbeat > now() - make_interval(hours => ${
|
|
1432
|
+
AND last_heartbeat > now() - make_interval(hours => ${wm})
|
|
1516
1433
|
GROUP BY user_id
|
|
1517
1434
|
UNION ALL
|
|
1518
1435
|
-- Beacons are unauthenticated (no user_id); attribute via the most
|
|
@@ -1528,7 +1445,7 @@ end`;async function Os(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1528
1445
|
) owner ON true
|
|
1529
1446
|
WHERE e.event = 'hook_capture_failed'
|
|
1530
1447
|
AND e.device_id IS NOT NULL
|
|
1531
|
-
AND e.created_at > now() - make_interval(hours => ${
|
|
1448
|
+
AND e.created_at > now() - make_interval(hours => ${wm})
|
|
1532
1449
|
GROUP BY owner.user_id
|
|
1533
1450
|
) signal_union
|
|
1534
1451
|
GROUP BY user_id
|
|
@@ -1547,12 +1464,12 @@ end`;async function Os(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1547
1464
|
FROM active_users a
|
|
1548
1465
|
LEFT JOIN latest_session s ON s.user_id = a.user_id
|
|
1549
1466
|
WHERE s.last_session IS NULL
|
|
1550
|
-
OR s.last_session < now() - make_interval(hours => ${
|
|
1467
|
+
OR s.last_session < now() - make_interval(hours => ${wm})
|
|
1551
1468
|
)
|
|
1552
1469
|
INSERT INTO alert_dispatches (user_id, alert_key, severity, channel, last_state)
|
|
1553
1470
|
SELECT
|
|
1554
1471
|
s.user_id,
|
|
1555
|
-
${
|
|
1472
|
+
${YS},
|
|
1556
1473
|
'soft',
|
|
1557
1474
|
'in_app',
|
|
1558
1475
|
jsonb_build_object(
|
|
@@ -1571,11 +1488,11 @@ end`;async function Os(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1571
1488
|
WHERE NOT EXISTS (
|
|
1572
1489
|
SELECT 1 FROM alert_dispatches d
|
|
1573
1490
|
WHERE d.user_id = s.user_id
|
|
1574
|
-
AND d.alert_key = ${
|
|
1575
|
-
AND d.last_dispatched_at > now() - make_interval(hours => ${
|
|
1491
|
+
AND d.alert_key = ${YS}
|
|
1492
|
+
AND d.last_dispatched_at > now() - make_interval(hours => ${j1})
|
|
1576
1493
|
)
|
|
1577
1494
|
RETURNING user_id, id, last_state->>'message' AS message
|
|
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}
|
|
1495
|
+
`);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}u(P1,"checkCaptureStalenessOnce");function XS(){let e=setTimeout(()=>{n()},9e4),t=setInterval(()=>{n()},N1);async function n(){try{await P1()}catch(r){console.error("[capture-staleness] check failed:",r instanceof Error?r.stack:r)}}return u(n,"runOnce"),{stop:u(()=>{clearTimeout(e),clearInterval(t)},"stop")}}u(XS,"startCaptureStalenessChecker");C();import{sql as QS}from"drizzle-orm";var D1=900*1e3,ZS=6,eA=60,O1=QS`array['user_message','tool_call','tool_result']`;async function C1(){return[...await d.execute(QS`
|
|
1579
1496
|
WITH session_stats AS (
|
|
1580
1497
|
SELECT s.id,
|
|
1581
1498
|
s.external_session_id,
|
|
@@ -1583,10 +1500,10 @@ end`;async function Os(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1583
1500
|
(
|
|
1584
1501
|
SELECT MAX(timestamp) FROM session_events e
|
|
1585
1502
|
WHERE e.session_id = s.id
|
|
1586
|
-
AND e.event_type = ANY(${
|
|
1503
|
+
AND e.event_type = ANY(${O1})
|
|
1587
1504
|
) AS last_hook_event
|
|
1588
1505
|
FROM sessions s
|
|
1589
|
-
WHERE s.started_at > now() - (${
|
|
1506
|
+
WHERE s.started_at > now() - (${ZS}::int * interval '1 hour')
|
|
1590
1507
|
)
|
|
1591
1508
|
SELECT ss.id AS "sessionId",
|
|
1592
1509
|
ss.external_session_id AS "externalSessionId",
|
|
@@ -1597,8 +1514,8 @@ end`;async function Os(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1597
1514
|
FROM session_stats ss
|
|
1598
1515
|
JOIN context_snapshots cs ON cs.session_id = ss.id
|
|
1599
1516
|
WHERE ss.last_hook_event IS NOT NULL
|
|
1600
|
-
AND cs.captured_at > ss.last_hook_event + (${
|
|
1517
|
+
AND cs.captured_at > ss.last_hook_event + (${eA}::int * interval '1 second')
|
|
1601
1518
|
GROUP BY ss.id, ss.external_session_id, ss.tool
|
|
1602
1519
|
HAVING COUNT(cs.id) > 0
|
|
1603
|
-
`)]}
|
|
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
|
|
1520
|
+
`)]}u(C1,"auditPollutionOnce");function tA(){let e=setTimeout(()=>{n()},6e4),t=setInterval(()=>{n()},D1);async function n(){try{let r=await C1();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=${ZS}h, grace=${eA}s)`)}catch(r){console.error("[pollution-auditor] pass failed:",r instanceof Error?r.stack:r)}}return u(n,"runOnce"),{stop(){clearTimeout(e),clearInterval(t)}}}u(tA,"startPollutionAuditor");C();var $1=Im.dirname(L1(import.meta.url)),nA=Im.resolve($1,"../../../.env.local");if(vm.existsSync(nA))for(let e of vm.readFileSync(nA,"utf-8").split(`
|
|
1521
|
+
`)){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 q1=Cm({serviceName:"rulemetric-api"});q1?console.log("[sentry] error capture enabled"):process.env.NODE_ENV==="production"&&console.log("[sentry] no SENTRY_DSN \u2014 error capture disabled");var Fh=km({serviceName:"rulemetric-api"});console.log(Fh==="otlp"?`[otel] traces exporting to ${process.env.OTEL_EXPORTER_OTLP_ENDPOINT}`:Fh==="console"?"[otel] traces printing to stdout (set OTEL_EXPORTER_OTLP_ENDPOINT to ship to a backend)":Fh==="silent"?"[otel] traces enabled, span export OFF (OTEL_SPAN_EXPORT=none \u2014 no stdout span dump)":"[otel] disabled (TELEMETRY_ENABLED=false)");var U1=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&&U1.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([ba(2e3),Qa()]).finally(()=>process.exit(1))});var Wh=Number(process.env.API_PORT)||3e3;console.log(`RuleMetric API starting on port ${Wh}`);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=of();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 oA,zo=[],rA=!1;async function H1(){let e=M1({fetch:J.fetch,hostname:"0.0.0.0",port:Wh});oA=e,e.keepAliveTimeout=65e3,e.headersTimeout=66e3,console.log(`RuleMetric API running at http://localhost:${Wh} (keepAliveTimeout=65s)`),lw().then(t=>console.log(`[auth] JWKS prime ${t?"ok":"deferred (will fetch on first auth)"}`)),zo.push(BS()),zo.push(VS()),el()&&Dv(),pm()&&sS(),zo.push(GS()),zo.push(XS()),zo.push(xw()),zo.push(tA()),zo.push(...HS)}u(H1,"start");H1().catch(e=>{console.error("Failed to start API:",e),rr(e,{tags:{phase:"boot",source:"start"}}),Promise.allSettled([ba(2e3),Qa()]).finally(()=>process.exit(1))});async function sA(){if(!rA){rA=!0;for(let e of zo)try{e.stop()}catch{}try{oA?.close?.()}catch{}try{await Ov(5e3)}catch{}try{await iS(5e3)}catch{}await Promise.allSettled([Nm(),ba(2e3),Qa()]),process.exit(0)}}u(sA,"gracefulShutdown");process.on("SIGTERM",sA);process.on("SIGINT",sA);
|