@rulemetric/local 0.9.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 +223 -301
- 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-nZEuBmTP.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 o_=Object.defineProperty;var d=(e,t)=>o_(e,"name",{value:t,configurable:!0}),kp=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var J=(e,t)=>()=>(e&&(t=e(e=0)),t);var to=(e,t)=>{for(var n in t)o_(e,n,{get:t[n],enumerable:!0})};import{pgTable as Ed,text as Hs,timestamp as Aa,jsonb as c_,uuid as Yo,primaryKey as d_}from"drizzle-orm/pg-core";var G,K,Q,ye,Xo=J(()=>{"use strict";G=Ed("organizations",{id:Yo("id").primaryKey().defaultRandom(),name:Hs("name").unique().notNull(),slug:Hs("slug").unique().notNull(),metadata:c_("metadata"),createdAt:Aa("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Aa("updated_at",{withTimezone:!0}).defaultNow()}),K=Ed("teams",{id:Yo("id").primaryKey().defaultRandom(),orgId:Yo("org_id").references(()=>G.id,{onDelete:"cascade"}),name:Hs("name").notNull(),slug:Hs("slug").notNull(),metadata:c_("metadata"),createdAt:Aa("created_at",{withTimezone:!0}).defaultNow()}),Q=Ed("user_organizations",{userId:Yo("user_id").notNull(),orgId:Yo("org_id").references(()=>G.id,{onDelete:"cascade"}).notNull(),role:Hs("role").notNull().default("member"),createdAt:Aa("created_at",{withTimezone:!0}).defaultNow()},e=>[d_({columns:[e.userId,e.orgId]})]),ye=Ed("user_teams",{userId:Yo("user_id").notNull(),teamId:Yo("team_id").references(()=>K.id,{onDelete:"cascade"}).notNull(),role:Hs("role").notNull().default("member"),createdAt:Aa("created_at",{withTimezone:!0}).defaultNow()},e=>[d_({columns:[e.userId,e.teamId]})])});import{boolean as xd,pgTable as qE,real as UE,text as Td,timestamp as Lp,uuid as u_}from"drizzle-orm/pg-core";var T,Ft=J(()=>{"use strict";Xo();T=qE("profiles",{id:u_("id").primaryKey(),email:Td("email"),displayName:Td("display_name"),activeOrgId:u_("active_org_id").references(()=>G.id,{onDelete:"set null"}),isSuperadmin:xd("is_superadmin").notNull().default(!1),claudeCodePlan:Td("claude_code_plan"),planSource:Td("plan_source").notNull().default("detected"),setupCompletedAt:Lp("setup_completed_at",{withTimezone:!0}),liveSendSkipped:xd("live_send_skipped").notNull().default(!1),autoAcceptSuggestions:xd("auto_accept_suggestions").notNull().default(!0),evolutionPaused:xd("evolution_paused").notNull().default(!1),suggestionConfidenceThreshold:UE("suggestion_confidence_threshold").notNull().default(.7),createdAt:Lp("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Lp("updated_at",{withTimezone:!0}).defaultNow()})});import{pgTable as HE,text as $p,timestamp as Rd,uuid as kd,index as l_}from"drizzle-orm/pg-core";var ae,p_=J(()=>{"use strict";Xo();Ft();ae=HE("org_invitations",{id:kd("id").primaryKey().defaultRandom(),orgId:kd("org_id").notNull().references(()=>G.id,{onDelete:"cascade"}),email:$p("email").notNull(),role:$p("role").notNull().default("member"),teamId:kd("team_id").references(()=>K.id,{onDelete:"set null"}),invitedBy:kd("invited_by").notNull().references(()=>T.id,{onDelete:"cascade"}),token:$p("token").notNull().unique(),expiresAt:Rd("expires_at",{withTimezone:!0}).notNull(),acceptedAt:Rd("accepted_at",{withTimezone:!0}),revokedAt:Rd("revoked_at",{withTimezone:!0}),createdAt:Rd("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[l_("idx_org_invitations_token").on(e.token),l_("idx_org_invitations_org").on(e.orgId)])});import{pgTable as qp,text as Jt,timestamp as no,jsonb as jd,uuid as or,integer as Nd,boolean as BE,uniqueIndex as Pd,index as Ea}from"drizzle-orm/pg-core";var g,sr,Ie,Fn=J(()=>{"use strict";g=qp("instructions",{id:or("id").primaryKey().defaultRandom(),name:Jt("name").notNull(),description:Jt("description").notNull(),type:Jt("type").notNull().default("instruction"),scope:Jt("scope").notNull(),scopeRef:or("scope_ref"),version:Jt("version").notNull(),content:Jt("content").notNull(),frontmatter:jd("frontmatter").notNull(),slots:jd("slots"),tags:Jt("tags").array(),compatibility:Jt("compatibility").array(),createdBy:or("created_by"),createdAt:no("created_at",{withTimezone:!0}).defaultNow(),updatedAt:no("updated_at",{withTimezone:!0}).defaultNow(),archived:BE("archived").default(!1),archivedAt:no("archived_at",{withTimezone:!0}),archivedBy:or("archived_by"),forkedFromId:or("forked_from_id").references(()=>g.id,{onDelete:"set null"}),upstreamVersion:Jt("upstream_version"),badge:Jt("badge"),contentHash:Jt("content_hash"),contextIdentity:Jt("context_identity"),scanScore:Nd("scan_score"),scanFindings:jd("scan_findings"),popularityScore:Nd("popularity_score"),sourceUpdatedAt:no("source_updated_at",{withTimezone:!0})},e=>[Pd("instructions_name_scope_ref_idx").on(e.name,e.scope,e.scopeRef),Ea("idx_instructions_scope").on(e.scope,e.scopeRef),Ea("idx_instructions_created_by").on(e.createdBy),Ea("idx_instructions_context_identity").on(e.createdBy,e.contextIdentity),Ea("idx_instructions_public_recency").on(e.scope,e.sourceUpdatedAt.desc())]),sr=qp("instruction_version_identities",{id:or("id").primaryKey().defaultRandom(),instructionId:or("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),contentHash:Jt("content_hash").notNull(),versionOrdinal:Nd("version_ordinal").notNull(),content:Jt("content"),firstSeenAt:no("first_seen_at",{withTimezone:!0}).notNull().defaultNow(),lastSeenAt:no("last_seen_at",{withTimezone:!0}).notNull().defaultNow(),createdAt:no("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Pd("instruction_version_identities_hash_unique").on(e.instructionId,e.contentHash),Pd("instruction_version_identities_ordinal_unique").on(e.instructionId,e.versionOrdinal),Ea("idx_ivi_instruction").on(e.instructionId)]),Ie=qp("instruction_versions",{id:or("id").primaryKey().defaultRandom(),instructionId:or("instruction_id").references(()=>g.id,{onDelete:"cascade"}),versionNumber:Nd("version_number").notNull(),content:Jt("content").notNull(),frontmatter:jd("frontmatter").notNull(),changeSummary:Jt("change_summary"),createdBy:or("created_by"),createdAt:no("created_at",{withTimezone:!0}).defaultNow()},e=>[Pd("instruction_versions_instruction_version_idx").on(e.instructionId,e.versionNumber)])});import{pgTable as FE,text as WE,timestamp as zE,jsonb as VE,uuid as Up,index as m_}from"drizzle-orm/pg-core";var Ct,f_=J(()=>{"use strict";Fn();Ct=FE("instruction_events",{id:Up("id").primaryKey().defaultRandom(),instructionId:Up("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),eventType:WE("event_type").notNull(),actorId:Up("actor_id").notNull(),metadata:VE("metadata"),createdAt:zE("created_at",{withTimezone:!0}).defaultNow()},e=>[m_("idx_instruction_events_instruction").on(e.instructionId),m_("idx_instruction_events_type").on(e.eventType)])});import{boolean as JE,jsonb as GE,pgTable as Bp,primaryKey as g_,text as Qo,timestamp as xa,uniqueIndex as Hp,uuid as Zo}from"drizzle-orm/pg-core";import{sql as KE}from"drizzle-orm";var U,at,le,Pr=J(()=>{"use strict";Xo();Fn();U=Bp("projects",{id:Zo("id").primaryKey().defaultRandom(),orgId:Zo("org_id").references(()=>G.id,{onDelete:"cascade"}),name:Qo("name").notNull(),description:Qo("description"),githubRepo:Qo("github_repo"),gitRemoteUrl:Qo("git_remote_url"),gitRootCommit:Qo("git_root_commit"),gitRemoteAliases:Qo("git_remote_aliases").array().notNull().default([]),metadata:GE("metadata"),createdBy:Zo("created_by"),createdAt:xa("created_at",{withTimezone:!0}).defaultNow(),updatedAt:xa("updated_at",{withTimezone:!0}).defaultNow()},e=>[Hp("projects_org_name_idx").on(e.orgId,e.name),Hp("projects_git_remote_url_unique").on(e.gitRemoteUrl).where(KE`${e.gitRemoteUrl} IS NOT NULL`)]),at=Bp("project_instructions",{projectId:Zo("project_id").references(()=>U.id,{onDelete:"cascade"}).notNull(),instructionId:Zo("instruction_id").references(()=>g.id,{onDelete:"cascade"}).notNull(),addedAt:xa("added_at",{withTimezone:!0}).defaultNow(),addedBy:Zo("added_by")},e=>[g_({columns:[e.projectId,e.instructionId]})]),le=Bp("project_checkouts",{projectId:Zo("project_id").references(()=>U.id,{onDelete:"cascade"}).notNull(),path:Qo("path").notNull(),isWorktree:JE("is_worktree").notNull().default(!1),firstSeen:xa("first_seen",{withTimezone:!0}).notNull().defaultNow(),lastSeen:xa("last_seen",{withTimezone:!0}).notNull().defaultNow()},e=>[g_({columns:[e.projectId,e.path]}),Hp("project_checkouts_path_unique").on(e.path)])});import{pgTable as YE,text as Bs,timestamp as Fp,jsonb as h_,uuid as Cd,integer as XE,boolean as QE,index as Wp}from"drizzle-orm/pg-core";var X,Od=J(()=>{"use strict";Ft();Xo();Pr();X=YE("agent_runs",{id:Cd("id").primaryKey().defaultRandom(),userId:Cd("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),orgId:Cd("org_id").references(()=>G.id,{onDelete:"set null"}),projectId:Cd("project_id").references(()=>U.id,{onDelete:"set null"}),projectPath:Bs("project_path"),gitRemote:Bs("git_remote"),baseBranch:Bs("base_branch"),title:Bs("title"),prompt:Bs("prompt"),toolSpec:h_("tool_spec").notNull().default([]),autoWorktree:QE("auto_worktree").notNull().default(!0),status:Bs("status").notNull().default("pending"),sessionCount:XE("session_count").notNull().default(0),metadata:h_("metadata").notNull().default({}),createdAt:Fp("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:Fp("updated_at",{withTimezone:!0}).notNull().defaultNow(),completedAt:Fp("completed_at",{withTimezone:!0})},e=>[Wp("idx_agent_runs_user").on(e.userId),Wp("idx_agent_runs_org_created").on(e.orgId,e.createdAt),Wp("idx_agent_runs_project").on(e.projectId)])});import{pgTable as zp,text as hn,timestamp as Ta,jsonb as es,uuid as Cr,integer as Dd,uniqueIndex as __,index as ir}from"drizzle-orm/pg-core";var _,qe,se,Fs=J(()=>{"use strict";Fn();Pr();Ft();Xo();Od();_=zp("sessions",{id:Cr("id").primaryKey().defaultRandom(),userId:Cr("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),externalSessionId:hn("external_session_id"),projectId:Cr("project_id").references(()=>U.id,{onDelete:"set null"}),orgId:Cr("org_id").references(()=>G.id,{onDelete:"set null"}),tool:hn("tool").notNull(),projectPath:hn("project_path"),gitBranch:hn("git_branch"),startedAt:Ta("started_at",{withTimezone:!0}).notNull(),endedAt:Ta("ended_at",{withTimezone:!0}),eventCount:Dd("event_count").default(0),tokenUsage:es("token_usage"),analysis:es("analysis"),analyzedAt:Ta("analyzed_at",{withTimezone:!0}),analyzedEventCount:Dd("analyzed_event_count"),analyzedTurnCount:Dd("analyzed_turn_count"),metadata:es("metadata").default({}),origin:hn("origin").notNull().default("unknown"),runId:Cr("run_id").references(()=>X.id,{onDelete:"set null"}),model:hn("model"),harnessVersion:hn("harness_version"),createdAt:Ta("created_at",{withTimezone:!0}).defaultNow()},e=>[ir("idx_sessions_user").on(e.userId),ir("idx_sessions_tool").on(e.tool),ir("idx_sessions_started_at").on(e.startedAt),ir("idx_sessions_project").on(e.projectId),ir("idx_sessions_org_started_at").on(e.orgId,e.startedAt),ir("idx_sessions_run").on(e.runId),__("idx_sessions_user_external").on(e.userId,e.externalSessionId)]),qe=zp("session_events",{id:Cr("id").primaryKey().defaultRandom(),sessionId:Cr("session_id").notNull().references(()=>_.id,{onDelete:"cascade"}),sequence:Dd("sequence").notNull(),eventType:hn("event_type").notNull(),content:hn("content"),toolName:hn("tool_name"),toolInput:es("tool_input"),toolOutput:es("tool_output"),tokenUsage:es("token_usage"),model:hn("model"),timestamp:Ta("timestamp",{withTimezone:!0}).notNull(),metadata:es("metadata").default({})},e=>[__("session_events_session_sequence_idx").on(e.sessionId,e.sequence),ir("idx_session_events_session_id").on(e.sessionId),ir("idx_session_events_event_type").on(e.eventType),ir("idx_session_events_model").on(e.model)]),se=zp("session_instructions",{sessionId:Cr("session_id").notNull().references(()=>_.id,{onDelete:"cascade"}),instructionId:Cr("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),linkMethod:hn("link_method").notNull(),contentHash:hn("content_hash")},e=>[ir("idx_session_instructions_instruction_id").on(e.instructionId)])});import{pgTable as y_,text as Md,timestamp as w_,uuid as ar,integer as v_,index as Ws,unique as ZE}from"drizzle-orm/pg-core";var jt,Z,I_=J(()=>{"use strict";Ft();Pr();Fs();jt=y_("treatment_assignments",{id:ar("id").primaryKey().defaultRandom(),userId:ar("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),treatmentType:Md("treatment_type").notNull(),treatmentId:ar("treatment_id").notNull(),treatmentVersion:v_("treatment_version").notNull().default(1),projectId:ar("project_id").references(()=>U.id,{onDelete:"set null"}),assignedBy:ar("assigned_by").references(()=>T.id,{onDelete:"set null"}),method:Md("method").notNull(),assignedAt:w_("assigned_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Ws("idx_treatment_assignments_user").on(e.userId),Ws("idx_treatment_assignments_treatment").on(e.treatmentType,e.treatmentId),Ws("idx_treatment_assignments_project").on(e.projectId)]),Z=y_("treatment_exposures",{id:ar("id").primaryKey().defaultRandom(),sessionId:ar("session_id").notNull().references(()=>_.id,{onDelete:"cascade"}),userId:ar("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),treatmentType:Md("treatment_type").notNull(),treatmentId:ar("treatment_id").notNull(),treatmentVersion:v_("treatment_version").notNull().default(1),assignmentId:ar("assignment_id").references(()=>jt.id,{onDelete:"set null"}),method:Md("method").notNull(),exposedAt:w_("exposed_at",{withTimezone:!0}).notNull().defaultNow()},e=>[ZE("treatment_exposures_unique").on(e.sessionId,e.treatmentType,e.treatmentId,e.treatmentVersion),Ws("idx_treatment_exposures_treatment").on(e.treatmentType,e.treatmentId),Ws("idx_treatment_exposures_user").on(e.userId),Ws("idx_treatment_exposures_session").on(e.sessionId)])});import{pgTable as ex,text as Vp,timestamp as tx,uuid as Ld,integer as nx,index as b_,uniqueIndex as rx}from"drizzle-orm/pg-core";var $d,S_=J(()=>{"use strict";Ft();Pr();$d=ex("pending_treatment_exposures",{id:Ld("id").primaryKey().defaultRandom(),userId:Ld("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),externalSessionId:Vp("external_session_id").notNull(),treatmentType:Vp("treatment_type").notNull(),treatmentId:Ld("treatment_id").notNull(),treatmentVersion:nx("treatment_version").notNull().default(1),method:Vp("method").notNull().default("injected"),projectId:Ld("project_id").references(()=>U.id,{onDelete:"set null"}),createdAt:tx("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[rx("pending_treatment_exposures_unique").on(e.externalSessionId,e.treatmentType,e.treatmentId,e.treatmentVersion),b_("idx_pending_treatment_exposures_ext").on(e.externalSessionId),b_("idx_pending_treatment_exposures_user").on(e.userId)])});import{pgTable as A_,text as ro,timestamp as E_,uuid as zs,numeric as ox,index as Jp,unique as sx}from"drizzle-orm/pg-core";var q,Or,Gp=J(()=>{"use strict";Ft();Fn();q=A_("instruction_experiments",{id:zs("id").primaryKey().defaultRandom(),userId:zs("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),instructionId:zs("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),projectPath:ro("project_path").notNull(),status:ro("status").notNull().default("running"),treatedShare:ox("treated_share").notNull().default("0.5"),salt:ro("salt").notNull(),contentHash:ro("content_hash"),source:ro("source").notNull().default("manual"),stoppedReason:ro("stopped_reason"),createdAt:E_("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Jp("idx_instruction_experiments_lookup").on(e.userId,e.projectPath)]),Or=A_("instruction_experiment_arms",{id:zs("id").primaryKey().defaultRandom(),experimentId:zs("experiment_id").notNull().references(()=>q.id,{onDelete:"cascade"}),userId:zs("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),externalSessionId:ro("external_session_id").notNull(),arm:ro("arm").notNull(),assignedAt:E_("assigned_at",{withTimezone:!0}).notNull().defaultNow()},e=>[sx("instruction_experiment_arms_unique").on(e.experimentId,e.externalSessionId),Jp("idx_instruction_experiment_arms_experiment").on(e.experimentId,e.arm),Jp("idx_instruction_experiment_arms_session").on(e.externalSessionId)])});import{pgTable as ix,text as Kp,timestamp as ax,uuid as qd,numeric as Yp,integer as x_,jsonb as cx,index as dx,unique as ux}from"drizzle-orm/pg-core";var Y,T_=J(()=>{"use strict";Ft();Fn();Gp();Y=ix("instruction_verdicts",{id:qd("id").primaryKey().defaultRandom(),userId:qd("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),instructionId:qd("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),contentHash:Kp("content_hash").notNull(),projectPath:Kp("project_path").notNull(),segment:cx("segment").notNull().default({}),decision:Kp("decision").notNull(),delta:Yp("delta").notNull(),ciLower:Yp("ci_lower").notNull(),ciUpper:Yp("ci_upper").notNull(),nTreated:x_("n_treated").notNull(),nControl:x_("n_control").notNull(),experimentId:qd("experiment_id").references(()=>q.id,{onDelete:"set null"}),decidedAt:ax("decided_at",{withTimezone:!0}).notNull().defaultNow()},e=>[ux("instruction_verdicts_unique").on(e.instructionId,e.contentHash,e.projectPath),dx("idx_instruction_verdicts_render").on(e.userId,e.projectPath)])});import{pgTable as lx,text as Ud,timestamp as Xp,uuid as Qp,integer as px,unique as mx,index as fx}from"drizzle-orm/pg-core";var Ee,R_=J(()=>{"use strict";Ft();Ee=lx("insight_recommendation_log",{id:Qp("id").primaryKey().defaultRandom(),userId:Qp("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),projectPath:Ud("project_path").notNull().default(""),category:Ud("category").notNull(),contentHash:Ud("content_hash").notNull(),label:Ud("label").notNull().default(""),firstSeenAt:Xp("first_seen_at",{withTimezone:!0}).notNull().defaultNow(),lastSeenAt:Xp("last_seen_at",{withTimezone:!0}).notNull().defaultNow(),timesGenerated:px("times_generated").notNull().default(1),lastJobId:Qp("last_job_id"),dismissedAt:Xp("dismissed_at",{withTimezone:!0})},e=>[mx("insight_recommendation_log_unique").on(e.userId,e.projectPath,e.contentHash),fx("idx_insight_recommendation_log_read").on(e.userId,e.projectPath)])});import{pgTable as gx,text as Vs,timestamp as Zp,uuid as Ra,integer as k_,index as Hd}from"drizzle-orm/pg-core";var F,em=J(()=>{"use strict";Ft();Pr();F=gx("memories",{id:Ra("id").primaryKey().defaultRandom(),userId:Ra("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),orgId:Ra("org_id"),projectId:Ra("project_id").references(()=>U.id,{onDelete:"set null"}),version:k_("version").notNull().default(1),parentId:Ra("parent_id").references(()=>F.id,{onDelete:"set null"}),kind:Vs("kind").notNull(),title:Vs("title").notNull(),body:Vs("body").notNull(),source:Vs("source").notNull(),status:Vs("status").notNull().default("active"),trustClass:Vs("trust_class"),trustVersion:k_("trust_version"),trustComputedAt:Zp("trust_computed_at",{withTimezone:!0}),createdAt:Zp("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:Zp("updated_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Hd("idx_memories_user").on(e.userId),Hd("idx_memories_project").on(e.projectId),Hd("idx_memories_parent").on(e.parentId),Hd("idx_memories_user_status").on(e.userId,e.status)])});import{pgTable as hx,text as ka,timestamp as tm,uuid as nm,integer as j_,jsonb as _x,index as N_}from"drizzle-orm/pg-core";var Nt,P_=J(()=>{"use strict";Ft();em();Nt=hx("memory_experiments",{id:nm("id").primaryKey().defaultRandom(),memoryId:nm("memory_id").notNull().references(()=>F.id,{onDelete:"cascade"}),userId:nm("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),memoryVersion:j_("memory_version").notNull().default(1),taskPrompt:ka("task_prompt").notNull(),expectations:ka("expectations").array().notNull().default([]),trials:j_("trials").notNull().default(10),model:ka("model"),status:ka("status").notNull().default("pending"),result:_x("result").$type(),error:ka("error"),createdAt:tm("created_at",{withTimezone:!0}).notNull().defaultNow(),startedAt:tm("started_at",{withTimezone:!0}),completedAt:tm("completed_at",{withTimezone:!0})},e=>[N_("idx_memory_experiments_memory").on(e.memoryId),N_("idx_memory_experiments_user").on(e.userId)])});import{pgTable as yx,text as Js,timestamp as rm,uuid as om,jsonb as wx,uniqueIndex as vx,index as C_}from"drizzle-orm/pg-core";var Ve,sm=J(()=>{"use strict";Ft();Fs();Ve=yx("session_terminal_targets",{id:om("id").primaryKey().defaultRandom(),userId:om("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),sessionId:om("session_id").references(()=>_.id,{onDelete:"set null"}),externalSessionId:Js("external_session_id"),kind:Js("kind").notNull(),target:Js("target").notNull(),status:Js("status").notNull().default("active"),attachCommand:Js("attach_command").notNull(),projectPath:Js("project_path"),metadata:wx("metadata").notNull().default({}),lastSeenAt:rm("last_seen_at",{withTimezone:!0}).defaultNow(),createdAt:rm("created_at",{withTimezone:!0}).defaultNow(),updatedAt:rm("updated_at",{withTimezone:!0}).defaultNow()},e=>[vx("idx_session_terminal_targets_user_target").on(e.userId,e.target),C_("idx_session_terminal_targets_session").on(e.sessionId),C_("idx_session_terminal_targets_user_status").on(e.userId,e.status)])});import{boolean as Ix,index as Bd,jsonb as O_,pgTable as bx,text as ts,timestamp as ja,uuid as Fd,integer as D_}from"drizzle-orm/pg-core";var Wd,M_=J(()=>{"use strict";Fs();sm();Wd=bx("session_send_jobs",{id:Fd("id").primaryKey().defaultRandom(),userId:Fd("user_id").notNull(),sessionId:Fd("session_id").notNull().references(()=>_.id,{onDelete:"cascade"}),terminalTargetId:Fd("terminal_target_id").references(()=>Ve.id,{onDelete:"set null"}),target:ts("target").notNull(),message:ts("message").notNull(),submit:Ix("submit").notNull().default(!0),delivery:ts("delivery").notNull().default("live"),status:ts("status").notNull().default("pending"),result:O_("result"),error:ts("error"),attempts:D_("attempts").notNull().default(0),taskKind:ts("task_kind"),payload:O_("payload"),claimedBy:ts("claimed_by"),claimedAt:ja("claimed_at",{withTimezone:!0}),leaseExpiresAt:ja("lease_expires_at",{withTimezone:!0}),leaseRecoveries:D_("lease_recoveries").notNull().default(0),createdAt:ja("created_at",{withTimezone:!0}).defaultNow(),updatedAt:ja("updated_at",{withTimezone:!0}).defaultNow(),completedAt:ja("completed_at",{withTimezone:!0})},e=>[Bd("idx_session_send_jobs_user").on(e.userId),Bd("idx_session_send_jobs_session").on(e.sessionId),Bd("idx_session_send_jobs_status").on(e.status),Bd("idx_session_send_jobs_pending").on(e.userId,e.status)])});import{pgTable as $_,text as ns,timestamp as zd,jsonb as q_,uuid as oo,integer as Sx,boolean as Ax,uniqueIndex as Ex,index as L_,primaryKey as xx}from"drizzle-orm/pg-core";var Le,Oe,U_=J(()=>{"use strict";Fn();Le=$_("packs",{id:oo("id").primaryKey().defaultRandom(),name:ns("name").notNull(),description:ns("description").notNull(),scope:ns("scope").notNull(),scopeRef:oo("scope_ref"),version:ns("version").notNull().default("1.0.0"),tags:ns("tags").array(),badge:ns("badge"),metadata:q_("metadata"),createdBy:oo("created_by"),createdAt:zd("created_at",{withTimezone:!0}).defaultNow(),updatedAt:zd("updated_at",{withTimezone:!0}).defaultNow(),archived:Ax("archived").default(!1),archivedAt:zd("archived_at",{withTimezone:!0}),archivedBy:oo("archived_by"),forkedFromId:oo("forked_from_id").references(()=>Le.id,{onDelete:"set null"}),upstreamVersion:ns("upstream_version")},e=>[Ex("packs_name_scope_ref_idx").on(e.name,e.scope,e.scopeRef),L_("idx_packs_scope").on(e.scope,e.scopeRef),L_("idx_packs_created_by").on(e.createdBy)]),Oe=$_("pack_instructions",{packId:oo("pack_id").references(()=>Le.id,{onDelete:"cascade"}).notNull(),instructionId:oo("instruction_id").references(()=>g.id,{onDelete:"cascade"}).notNull(),position:Sx("position").notNull().default(0),slotOverrides:q_("slot_overrides"),addedAt:zd("added_at",{withTimezone:!0}).defaultNow(),addedBy:oo("added_by")},e=>[xx({columns:[e.packId,e.instructionId]})])});import{pgTable as Tx,text as im,timestamp as Rx,jsonb as kx,uuid as am,index as Gs}from"drizzle-orm/pg-core";var so,H_=J(()=>{"use strict";Fn();so=Tx("instruction_usage_events",{id:am("id").primaryKey().defaultRandom(),instructionId:am("instruction_id").references(()=>g.id,{onDelete:"set null"}),userId:am("user_id").notNull(),surface:im("surface").notNull(),action:im("action").notNull(),metadata:kx("metadata"),traceId:im("trace_id"),createdAt:Rx("created_at",{withTimezone:!0}).defaultNow()},e=>[Gs("idx_usage_events_instruction").on(e.instructionId),Gs("idx_usage_events_user").on(e.userId),Gs("idx_usage_events_surface").on(e.surface),Gs("idx_usage_events_action").on(e.action),Gs("idx_usage_events_created_at").on(e.createdAt),Gs("idx_usage_events_user_created").on(e.userId,e.createdAt)])});import{pgTable as jx,text as Vd,timestamp as B_,jsonb as Nx,uuid as F_,index as cm}from"drizzle-orm/pg-core";var fe,W_=J(()=>{"use strict";fe=jx("worker_connections",{id:F_("id").primaryKey().defaultRandom(),userId:F_("user_id").notNull(),workerType:Vd("worker_type").notNull().default("mcp"),clientName:Vd("client_name").notNull(),clientVersion:Vd("client_version"),workerVersion:Vd("worker_version"),lastHeartbeat:B_("last_heartbeat",{withTimezone:!0}).notNull().defaultNow(),connectedAt:B_("connected_at",{withTimezone:!0}).notNull().defaultNow(),metadata:Nx("metadata")},e=>[cm("idx_worker_connections_user").on(e.userId),cm("idx_worker_connections_heartbeat").on(e.userId,e.lastHeartbeat),cm("idx_worker_connections_type").on(e.userId,e.workerType)])});import{pgTable as Px,text as Jd,timestamp as Cx,jsonb as Ox,uuid as z_,index as V_}from"drizzle-orm/pg-core";var Gd,J_=J(()=>{"use strict";Gd=Px("cli_setup_events",{id:z_("id").primaryKey().defaultRandom(),userId:z_("user_id").notNull(),deviceId:Jd("device_id").notNull(),event:Jd("event").notNull(),cliVersion:Jd("cli_version"),os:Jd("os"),props:Ox("props").notNull().default({}),createdAt:Cx("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[V_("idx_cli_setup_events_user").on(e.userId,e.createdAt),V_("idx_cli_setup_events_device").on(e.deviceId,e.createdAt)])});import{pgTable as Dx,text as rs,integer as Mx,boolean as Lx,timestamp as $x,jsonb as qx,uuid as Ux,index as G_}from"drizzle-orm/pg-core";var Kd,K_=J(()=>{"use strict";Kd=Dx("cli_error_events",{id:Ux("id").primaryKey().defaultRandom(),deviceId:rs("device_id"),event:rs("event").notNull(),command:rs("command"),statusCode:Mx("status_code"),message:rs("message"),cliVersion:rs("cli_version"),os:rs("os"),nodeVersion:rs("node_version"),proxied:Lx("proxied"),props:qx("props").notNull().default({}),createdAt:$x("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[G_("idx_cli_error_events_created").on(e.createdAt),G_("idx_cli_error_events_device").on(e.deviceId,e.createdAt)])});import{sql as Hx}from"drizzle-orm";import{pgTable as os,text as wt,timestamp as cn,jsonb as Tn,uuid as pt,integer as Dr,boolean as Na,index as Gt,unique as Y_}from"drizzle-orm/pg-core";var k,Se,be,Xe,Je,pe,Wn,Pa=J(()=>{"use strict";k=os("eval_targets",{id:pt("id").primaryKey().defaultRandom(),userId:pt("user_id").notNull(),name:wt("name").notNull(),type:wt("type").notNull(),content:wt("content").notNull(),description:wt("description").notNull().default(""),metadata:Tn("metadata").notNull().default({}),version:Dr("version").notNull().default(1),parentId:pt("parent_id").references(()=>k.id,{onDelete:"set null"}),createdAt:cn("created_at",{withTimezone:!0}).defaultNow(),updatedAt:cn("updated_at",{withTimezone:!0}).defaultNow()},e=>[Gt("eval_targets_name_user_idx").on(e.name,e.userId),Gt("idx_eval_targets_user").on(e.userId),Gt("idx_eval_targets_type").on(e.type),Gt("idx_eval_targets_parent").on(e.parentId)]),Se=os("evals",{id:pt("id").primaryKey().defaultRandom(),evalTargetId:pt("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),name:wt("name").notNull(),prompt:wt("prompt").notNull(),expectedOutput:wt("expected_output").notNull().default(""),files:Tn("files").notNull().default([]),expectations:Tn("expectations").notNull().default([]),retiredAt:cn("retired_at",{withTimezone:!0}),retiredReason:wt("retired_reason"),createdAt:cn("created_at",{withTimezone:!0}).defaultNow(),updatedAt:cn("updated_at",{withTimezone:!0}).defaultNow(),contentUpdatedAt:cn("content_updated_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Gt("idx_evals_target").on(e.evalTargetId),Gt("idx_evals_target_active").on(e.evalTargetId).where(Hx`${e.retiredAt} IS NULL`)]),be=os("eval_runs",{id:pt("id").primaryKey().defaultRandom(),jobId:pt("job_id"),evalId:pt("eval_id").notNull().references(()=>Se.id,{onDelete:"cascade"}),evalTargetId:pt("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),evalTargetVersion:Dr("eval_target_version").notNull(),configuration:wt("configuration").notNull(),runNumber:Dr("run_number").notNull().default(1),iteration:Dr("iteration").notNull().default(1),status:wt("status").notNull().default("completed"),outputs:Tn("outputs").notNull().default({}),timing:Tn("timing").notNull().default({}),grading:Tn("grading").notNull().default({}),comparison:Tn("comparison"),createdAt:cn("created_at",{withTimezone:!0}).defaultNow()},e=>[Gt("idx_eval_runs_eval").on(e.evalId),Gt("idx_eval_runs_target").on(e.evalTargetId),Gt("idx_eval_runs_iteration").on(e.evalTargetId,e.iteration)]),Xe=os("eval_comparisons",{id:pt("id").primaryKey().defaultRandom(),userId:pt("user_id").notNull(),targetAId:pt("target_a_id").notNull().references(()=>k.id,{onDelete:"cascade"}),targetBId:pt("target_b_id").notNull().references(()=>k.id,{onDelete:"cascade"}),targetAVersion:Dr("target_a_version").notNull(),targetBVersion:Dr("target_b_version").notNull(),isSwapped:Na("is_swapped").notNull().default(!1),winnerTargetId:pt("winner_target_id").references(()=>k.id,{onDelete:"set null"}),perEval:Tn("per_eval").notNull().default([]),overall:Tn("overall").notNull().default({}),rawOutput:wt("raw_output"),model:wt("model"),status:wt("status").notNull().default("completed"),createdAt:cn("created_at",{withTimezone:!0}).defaultNow()},e=>[Gt("idx_eval_comparisons_target_a").on(e.targetAId),Gt("idx_eval_comparisons_target_b").on(e.targetBId),Gt("idx_eval_comparisons_user").on(e.userId)]),Je=os("eval_grade_annotations",{id:pt("id").primaryKey().defaultRandom(),userId:pt("user_id").notNull(),evalRunId:pt("eval_run_id").notNull().references(()=>be.id,{onDelete:"cascade"}),evalTargetId:pt("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),expectationIndex:Dr("expectation_index").notNull(),expectationText:wt("expectation_text").notNull(),judgePassed:Na("judge_passed").notNull(),judgeMethod:wt("judge_method").notNull(),judgeModel:wt("judge_model"),verdict:wt("verdict").notNull(),flag:wt("flag"),note:wt("note"),createdAt:cn("created_at",{withTimezone:!0}).defaultNow(),updatedAt:cn("updated_at",{withTimezone:!0}).defaultNow()},e=>[Gt("idx_eval_grade_annotations_target").on(e.evalTargetId),Gt("idx_eval_grade_annotations_run").on(e.evalRunId),Y_("eval_grade_annotations_eval_run_id_expectation_index_key").on(e.evalRunId,e.expectationIndex)]),pe=os("judge_reviewer_verdicts",{id:pt("id").primaryKey().defaultRandom(),userId:pt("user_id").notNull(),evalTargetId:pt("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),evalRunId:pt("eval_run_id").notNull().references(()=>be.id,{onDelete:"cascade"}),expectationIndex:Dr("expectation_index").notNull(),expectationText:wt("expectation_text").notNull(),judgePassed:Na("judge_passed").notNull(),humanPassed:Na("human_passed").notNull(),reviewerEngine:wt("reviewer_engine").notNull(),reviewerModel:wt("reviewer_model").notNull(),reviewerPassed:Na("reviewer_passed").notNull(),resolvedAt:cn("resolved_at",{withTimezone:!0}),resolution:wt("resolution"),createdAt:cn("created_at",{withTimezone:!0}).defaultNow(),updatedAt:cn("updated_at",{withTimezone:!0}).defaultNow()},e=>[Gt("idx_jrv_target").on(e.evalTargetId),Y_("judge_reviewer_verdicts_eval_run_id_expectation_index_review_key").on(e.evalRunId,e.expectationIndex,e.reviewerModel)]),Wn=os("benchmarks",{id:pt("id").primaryKey().defaultRandom(),evalTargetId:pt("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),iteration:Dr("iteration").notNull().default(1),runSummary:Tn("run_summary").notNull().default({}),notes:Tn("notes").notNull().default([]),feedback:Tn("feedback"),createdAt:cn("created_at",{withTimezone:!0}).defaultNow()},e=>[Gt("idx_benchmarks_target").on(e.evalTargetId)])});import{sql as dm}from"drizzle-orm";import{pgTable as Bx,text as Mr,timestamp as Fx,jsonb as Yd,uuid as Xd,boolean as Wx,index as Ca,uniqueIndex as zx}from"drizzle-orm/pg-core";var ie,X_=J(()=>{"use strict";Pa();Fn();ie=Bx("instruction_promotions",{id:Xd("id").primaryKey().defaultRandom(),userId:Xd("user_id").notNull(),evalTargetId:Xd("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),instructionId:Xd("instruction_id").references(()=>g.id,{onDelete:"set null"}),fromContentHash:Mr("from_content_hash").notNull(),toContentHash:Mr("to_content_hash").notNull(),fromContent:Mr("from_content").notNull(),toContent:Mr("to_content").notNull(),proposalSource:Mr("proposal_source").notNull(),proposalRationale:Mr("proposal_rationale").notNull().default(""),decision:Mr("decision").notNull(),applied:Wx("applied").notNull().default(!1),refusals:Yd("refusals").notNull().default([]),rationale:Mr("rationale").notNull().default(""),effectClass:Mr("effect_class").notNull(),verdict:Yd("verdict").notNull().default({}),gates:Yd("gates").notNull().default({}),touchedSections:Yd("touched_sections").notNull().default([]),createdAt:Fx("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Ca("idx_instruction_promotions_budget").on(e.evalTargetId,e.createdAt.desc()).where(dm`${e.applied}`),Ca("idx_instruction_promotions_target").on(e.evalTargetId,e.createdAt.desc()),Ca("idx_instruction_promotions_user").on(e.userId,e.createdAt.desc()),Ca("idx_instruction_promotions_to_hash").on(e.toContentHash),zx("uq_instruction_promotions_applied").on(e.evalTargetId,e.fromContentHash,e.toContentHash).where(dm`${e.applied}`),Ca("idx_instruction_promotions_applied_hash").on(e.toContentHash,e.createdAt.desc()).where(dm`${e.applied}`)])});import{pgTable as Vx,text as io,timestamp as Jx,jsonb as Oa,uuid as um,integer as lm,real as Gx,index as Da,uniqueIndex as Q_}from"drizzle-orm/pg-core";var L,Z_=J(()=>{"use strict";Fs();Ft();L=Vx("context_snapshots",{id:um("id").primaryKey().defaultRandom(),sessionId:um("session_id").references(()=>_.id,{onDelete:"cascade"}),userId:um("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),sequence:lm("sequence").notNull().default(0),provider:io("provider").notNull(),model:io("model").notNull(),systemPrompt:io("system_prompt").notNull(),injectedInstructions:Oa("injected_instructions").notNull().default([]),messagesSummary:Oa("messages_summary").notNull(),tools:Oa("tools").notNull().default([]),systemHash:io("system_hash").notNull(),requestHash:io("request_hash").notNull().default(""),toolsHash:io("tools_hash"),injectedHash:io("injected_hash"),messagesDelta:Oa("messages_delta").default([]),messagesDeltaRef:io("messages_delta_ref"),maxTokens:lm("max_tokens"),temperature:Gx("temperature"),estimatedTokens:lm("estimated_tokens"),capturedAt:Jx("captured_at",{withTimezone:!0}).notNull().defaultNow(),metadata:Oa("metadata").default({})},e=>[Da("idx_context_snapshots_session").on(e.sessionId),Da("idx_context_snapshots_user").on(e.userId),Da("idx_context_snapshots_hash").on(e.systemHash),Da("idx_context_snapshots_request_hash").on(e.requestHash),Q_("idx_snapshots_session_request").on(e.sessionId,e.requestHash),Q_("idx_snapshots_session_sequence").on(e.sessionId,e.sequence),Da("idx_context_snapshots_user_session_captured").on(e.userId,e.sessionId,e.capturedAt.desc())])});import{pgTable as Kx,text as ey,timestamp as Yx,jsonb as Xx,integer as Qx,index as Zx}from"drizzle-orm/pg-core";var _n,ty=J(()=>{"use strict";_n=Kx("content_blobs",{hash:ey("hash").primaryKey(),contentType:ey("content_type").notNull(),content:Xx("content").notNull(),sizeBytes:Qx("size_bytes").notNull().default(0),createdAt:Yx("created_at",{withTimezone:!0}).defaultNow()},e=>[Zx("idx_content_blobs_type").on(e.contentType)])});import{pgTable as eT,text as Qd,timestamp as Ma,jsonb as Zd,uuid as pm,index as eu,integer as ny}from"drizzle-orm/pg-core";var ke,ry=J(()=>{"use strict";Pa();ke=eT("eval_jobs",{id:pm("id").primaryKey().defaultRandom(),userId:pm("user_id").notNull(),evalTargetId:pm("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),status:Qd("status").notNull().default("pending"),config:Zd("config").notNull().default({}),progress:Zd("progress").notNull().default({}),result:Zd("result"),error:Qd("error"),attempts:ny("attempts").notNull().default(0),taskKind:Qd("task_kind"),payload:Zd("payload"),claimedBy:Qd("claimed_by"),claimedAt:Ma("claimed_at",{withTimezone:!0}),leaseExpiresAt:Ma("lease_expires_at",{withTimezone:!0}),leaseRecoveries:ny("lease_recoveries").notNull().default(0),createdAt:Ma("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Ma("updated_at",{withTimezone:!0}).defaultNow(),completedAt:Ma("completed_at",{withTimezone:!0})},e=>[eu("idx_eval_jobs_user").on(e.userId),eu("idx_eval_jobs_target").on(e.evalTargetId),eu("idx_eval_jobs_status").on(e.status),eu("idx_eval_jobs_pending").on(e.userId,e.status)])});import{pgTable as tT,text as La,timestamp as $a,jsonb as oy,uuid as sy,integer as iy,index as ay}from"drizzle-orm/pg-core";var je,cy=J(()=>{"use strict";je=tT("agent_jobs",{id:sy("id").primaryKey().defaultRandom(),userId:sy("user_id").notNull(),taskKind:La("task_kind").notNull(),status:La("status").notNull().default("pending"),payload:oy("payload").notNull(),dedupeKey:La("dedupe_key"),result:oy("result"),error:La("error"),attempts:iy("attempts").notNull().default(0),claimedBy:La("claimed_by"),claimedAt:$a("claimed_at",{withTimezone:!0}),leaseExpiresAt:$a("lease_expires_at",{withTimezone:!0}),leaseRecoveries:iy("lease_recoveries").notNull().default(0),createdAt:$a("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:$a("updated_at",{withTimezone:!0}).notNull().defaultNow(),completedAt:$a("completed_at",{withTimezone:!0})},e=>[ay("idx_agent_jobs_claim").on(e.userId,e.status,e.taskKind,e.createdAt),ay("idx_agent_jobs_dedupe").on(e.userId,e.taskKind,e.dedupeKey)])});import{pgTable as nT,text as qa,timestamp as Ua,jsonb as tu,uuid as mm,index as nu,integer as dy}from"drizzle-orm/pg-core";var W,uy=J(()=>{"use strict";Pr();W=nT("insights_jobs",{id:mm("id").primaryKey().defaultRandom(),userId:mm("user_id").notNull(),status:qa("status").notNull().default("pending"),projectPath:qa("project_path"),projectId:mm("project_id").references(()=>U.id,{onDelete:"set null"}),config:tu("config").notNull().default({}),progress:tu("progress").notNull().default({}),result:tu("result"),error:qa("error"),attempts:dy("attempts").notNull().default(0),taskKind:qa("task_kind"),payload:tu("payload"),claimedBy:qa("claimed_by"),claimedAt:Ua("claimed_at",{withTimezone:!0}),leaseExpiresAt:Ua("lease_expires_at",{withTimezone:!0}),leaseRecoveries:dy("lease_recoveries").notNull().default(0),createdAt:Ua("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Ua("updated_at",{withTimezone:!0}).defaultNow(),completedAt:Ua("completed_at",{withTimezone:!0})},e=>[nu("idx_insights_jobs_user").on(e.userId),nu("idx_insights_jobs_status").on(e.status),nu("idx_insights_jobs_pending").on(e.userId,e.status),nu("idx_insights_jobs_project").on(e.projectId)])});import{pgTable as rT,text as fm,timestamp as ru,uuid as ly,index as oT,uniqueIndex as sT}from"drizzle-orm/pg-core";var Ae,py=J(()=>{"use strict";Ft();Ae=rT("api_keys",{id:ly("id").primaryKey().defaultRandom(),userId:ly("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),name:fm("name").notNull(),keyHash:fm("key_hash").notNull(),keyPrefix:fm("key_prefix").notNull(),lastUsedAt:ru("last_used_at",{withTimezone:!0}),expiresAt:ru("expires_at",{withTimezone:!0}),revokedAt:ru("revoked_at",{withTimezone:!0}),createdAt:ru("created_at",{withTimezone:!0}).defaultNow()},e=>[oT("idx_api_keys_user").on(e.userId),sT("idx_api_keys_hash").on(e.keyHash)])});import{pgTable as iT,text as gm,timestamp as my,uuid as aT,index as cT}from"drizzle-orm/pg-core";var Rn,fy=J(()=>{"use strict";Ft();Rn=iT("extension_auth_codes",{code:gm("code").primaryKey(),userId:aT("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),editor:gm("editor"),email:gm("email"),expiresAt:my("expires_at",{withTimezone:!0}).notNull(),createdAt:my("created_at",{withTimezone:!0}).defaultNow()},e=>[cT("idx_ext_auth_codes_expiry").on(e.expiresAt)])});import{pgTable as dT,text as uT,timestamp as gy,jsonb as lT,uuid as hm,index as hy}from"drizzle-orm/pg-core";var $e,_y=J(()=>{"use strict";Pa();$e=dT("eval_conversations",{id:hm("id").primaryKey().defaultRandom(),evalTargetId:hm("eval_target_id").notNull().references(()=>k.id,{onDelete:"cascade"}),userId:hm("user_id").notNull(),messages:lT("messages").notNull().default([]),status:uT("status").notNull().default("active"),createdAt:gy("created_at",{withTimezone:!0}).defaultNow(),updatedAt:gy("updated_at",{withTimezone:!0}).defaultNow()},e=>[hy("idx_eval_conversations_target").on(e.evalTargetId),hy("idx_eval_conversations_user").on(e.userId)])});import{pgTable as pT,text as Lr,timestamp as yy,jsonb as mT,uuid as _m}from"drizzle-orm/pg-core";var ao,wy=J(()=>{"use strict";ao=pT("skill_submissions",{id:_m("id").primaryKey().defaultRandom(),skillId:Lr("skill_id").notNull(),name:Lr("name").notNull(),description:Lr("description").notNull(),category:Lr("category").notNull(),tools:Lr("tools").array().notNull(),tags:Lr("tags").array().default([]),content:Lr("content").notNull(),status:Lr("status").notNull().default("pending"),submittedBy:_m("submitted_by").notNull(),reviewedBy:_m("reviewed_by"),reviewNote:Lr("review_note"),metadata:mT("metadata"),createdAt:yy("created_at",{withTimezone:!0}).defaultNow(),updatedAt:yy("updated_at",{withTimezone:!0}).defaultNow()})});import{pgTable as fT,text as Ha,timestamp as vy,jsonb as gT,uuid as hT,uniqueIndex as _T,index as Iy}from"drizzle-orm/pg-core";var Pt,by=J(()=>{"use strict";Pt=fT("harness_releases",{id:hT("id").primaryKey().defaultRandom(),harness:Ha("harness").notNull(),version:Ha("version").notNull(),publishedAt:vy("published_at",{withTimezone:!0}).notNull(),title:Ha("title"),body:Ha("body"),categories:gT("categories").default({}),url:Ha("url"),createdAt:vy("created_at",{withTimezone:!0}).defaultNow()},e=>[_T("idx_harness_releases_unique").on(e.harness,e.version),Iy("idx_harness_releases_harness").on(e.harness),Iy("idx_harness_releases_published").on(e.publishedAt)])});import{pgTable as yT,text as Ks,timestamp as Sy,jsonb as wT,uuid as Ay,index as Ey,uniqueIndex as vT}from"drizzle-orm/pg-core";var bt,xy=J(()=>{"use strict";bt=yT("notifications",{id:Ay("id").primaryKey().defaultRandom(),userId:Ay("user_id").notNull(),type:Ks("type").notNull(),title:Ks("title").notNull(),body:Ks("body"),url:Ks("url"),sourceTable:Ks("source_table"),sourceId:Ks("source_id"),metadata:wT("metadata").notNull().default({}),readAt:Sy("read_at",{withTimezone:!0}),createdAt:Sy("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Ey("idx_notifications_user_created").on(e.userId,e.createdAt),Ey("idx_notifications_user_unread").on(e.userId),vT("idx_notifications_source_dedup").on(e.userId,e.sourceTable,e.sourceId)])});import{pgTable as IT,text as Ba,timestamp as Fa,jsonb as ym,uuid as wm,index as ou,integer as Ty}from"drizzle-orm/pg-core";var ce,Ry=J(()=>{"use strict";Od();ce=IT("launch_jobs",{id:wm("id").primaryKey().defaultRandom(),userId:wm("user_id").notNull(),tool:Ba("tool").notNull(),status:Ba("status").notNull().default("pending"),config:ym("config").notNull().default({}),result:ym("result"),error:Ba("error"),attempts:Ty("attempts").notNull().default(0),taskKind:Ba("task_kind"),payload:ym("payload"),claimedBy:Ba("claimed_by"),claimedAt:Fa("claimed_at",{withTimezone:!0}),leaseExpiresAt:Fa("lease_expires_at",{withTimezone:!0}),leaseRecoveries:Ty("lease_recoveries").notNull().default(0),createdAt:Fa("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Fa("updated_at",{withTimezone:!0}).defaultNow(),completedAt:Fa("completed_at",{withTimezone:!0}),runId:wm("run_id").references(()=>X.id,{onDelete:"set null"})},e=>[ou("idx_launch_jobs_user").on(e.userId),ou("idx_launch_jobs_status").on(e.status),ou("idx_launch_jobs_pending").on(e.userId,e.status),ou("idx_launch_jobs_run").on(e.runId)])});import{pgTable as ky,uuid as $r,text as co,real as bT,timestamp as Wa,boolean as ST,uniqueIndex as AT,index as za}from"drizzle-orm/pg-core";var su,x,tt,jy=J(()=>{"use strict";Ft();Fn();Pr();su=["add","remove","trim"],x=ky("instruction_suggestions",{id:$r("id").primaryKey().defaultRandom(),userId:$r("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),instructionId:$r("instruction_id").notNull().references(()=>g.id,{onDelete:"cascade"}),projectPath:co("project_path").notNull(),projectId:$r("project_id").references(()=>U.id,{onDelete:"set null"}),score:bT("score").notNull(),reason:co("reason").notNull(),kind:co("kind").$type().notNull().default("add"),generatedAt:Wa("generated_at",{withTimezone:!0}).notNull().defaultNow(),isStale:ST("is_stale").notNull().default(!1),dismissedAt:Wa("dismissed_at",{withTimezone:!0}),acceptedAt:Wa("accepted_at",{withTimezone:!0}),declinedAt:Wa("declined_at",{withTimezone:!0}),declinedReason:co("declined_reason"),promotedToInstructionId:$r("promoted_to_instruction_id").references(()=>g.id,{onDelete:"set null"})},e=>[AT("idx_instruction_suggestions_user_project_instruction_kind").on(e.userId,e.projectPath,e.instructionId,e.kind),za("idx_instruction_suggestions_user_project").on(e.userId,e.projectPath),za("idx_instruction_suggestions_user_proj_id").on(e.userId,e.projectId),za("idx_instruction_suggestions_generated_at").on(e.generatedAt)]),tt=ky("instruction_suggestion_events",{id:$r("id").primaryKey().defaultRandom(),suggestionId:$r("suggestion_id").notNull().references(()=>x.id,{onDelete:"cascade"}),userId:$r("user_id").notNull().references(()=>T.id,{onDelete:"cascade"}),eventType:co("event_type").notNull(),tool:co("tool"),sessionId:$r("session_id"),projectPath:co("project_path").notNull(),actor:co("actor"),createdAt:Wa("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[za("idx_instruction_suggestion_events_suggestion_id").on(e.suggestionId),za("idx_instruction_suggestion_events_user_id").on(e.userId)])});import{pgTable as ET,text as vm,integer as xT,numeric as Va,timestamp as Im,index as TT,primaryKey as RT}from"drizzle-orm/pg-core";var Qe,Ny=J(()=>{"use strict";Qe=ET("model_pricing",{provider:vm("provider").notNull(),modelId:vm("model_id").notNull(),inputPerM:Va("input_per_m").notNull(),outputPerM:Va("output_per_m").notNull(),cacheReadPerM:Va("cache_read_per_m").notNull(),cacheWrite5mPerM:Va("cache_write_5m_per_m").notNull(),cacheWrite1hPerM:Va("cache_write_1h_per_m").notNull(),contextWindow:xT("context_window"),effectiveFrom:Im("effective_from",{withTimezone:!0}).notNull(),effectiveUntil:Im("effective_until",{withTimezone:!0}),source:vm("source").notNull(),verifiedAt:Im("verified_at",{withTimezone:!0})},e=>[RT({columns:[e.provider,e.modelId,e.effectiveFrom]}),TT("idx_model_pricing_active").on(e.provider,e.modelId,e.effectiveFrom.desc())])});import{pgTable as kT,text as ss,numeric as Py,timestamp as Cy,uuid as Oy,jsonb as jT,index as Dy}from"drizzle-orm/pg-core";var we,My=J(()=>{"use strict";we=kT("limit_observations",{id:Oy("id").primaryKey().defaultRandom(),observedAt:Cy("observed_at",{withTimezone:!0}).notNull().defaultNow(),provider:ss("provider").notNull(),plan:ss("plan").notNull(),limitType:ss("limit_type").notNull(),value:Py("value").notNull(),unit:ss("unit").notNull(),comparator:ss("comparator").notNull().default("="),resetsAt:Cy("resets_at",{withTimezone:!0}),sourceType:ss("source_type").notNull(),sourceUrl:ss("source_url"),sourceEvidence:jT("source_evidence"),confidence:Py("confidence").notNull(),userId:Oy("user_id")},e=>[Dy("idx_limit_obs_lookup").on(e.provider,e.plan,e.limitType,e.observedAt.desc()),Dy("idx_limit_obs_user").on(e.userId,e.observedAt.desc())])});import{pgTable as NT,text as iu,timestamp as PT,uuid as CT,jsonb as OT,boolean as DT,uniqueIndex as MT}from"drizzle-orm/pg-core";var xt,Ly=J(()=>{"use strict";xt=NT("provider_docs_snapshots",{id:CT("id").primaryKey().defaultRandom(),fetchedAt:PT("fetched_at",{withTimezone:!0}).notNull().defaultNow(),provider:iu("provider").notNull(),docUrl:iu("doc_url").notNull(),contentHash:iu("content_hash").notNull(),content:iu("content").notNull(),parseSuccess:DT("parse_success").notNull(),parseErrors:OT("parse_errors")},e=>[MT("idx_docs_dedup").on(e.provider,e.docUrl,e.contentHash)])});import{pgTable as LT,text as au,numeric as $y,timestamp as qy,uuid as $T,primaryKey as qT,index as UT}from"drizzle-orm/pg-core";var Ge,Uy=J(()=>{"use strict";Ge=LT("plan_limits_active",{provider:au("provider").notNull(),plan:au("plan").notNull(),limitType:au("limit_type").notNull(),value:$y("value").notNull(),unit:au("unit").notNull(),effectiveFrom:qy("effective_from",{withTimezone:!0}).notNull(),effectiveUntil:qy("effective_until",{withTimezone:!0}),confidence:$y("confidence").notNull(),sourceObservationIds:$T("source_observation_ids").array().notNull()},e=>[qT({columns:[e.provider,e.plan,e.limitType,e.effectiveFrom]}),UT("idx_plan_limits_lookup").on(e.provider,e.plan,e.limitType,e.effectiveFrom.desc())])});import{pgTable as HT,text as bm,timestamp as BT,uuid as Hy,jsonb as FT,index as WT}from"drizzle-orm/pg-core";var yn,By=J(()=>{"use strict";yn=HT("alert_dispatches",{id:Hy("id").primaryKey().defaultRandom(),userId:Hy("user_id").notNull(),alertKey:bm("alert_key").notNull(),severity:bm("severity").notNull(),lastDispatchedAt:BT("last_dispatched_at",{withTimezone:!0}).notNull().defaultNow(),lastState:FT("last_state").notNull(),channel:bm("channel").notNull()},e=>[WT("idx_alert_user_key").on(e.userId,e.alertKey,e.lastDispatchedAt.desc())])});import{boolean as zT,date as VT,index as Sm,integer as JT,jsonb as GT,pgTable as Am,text as zn,timestamp as uo,uniqueIndex as KT,uuid as Ys}from"drizzle-orm/pg-core";var De,St,At,Fy=J(()=>{"use strict";De=Am("announcements",{id:Ys("id").primaryKey().defaultRandom(),version:zn("version").notNull().unique(),releaseDate:VT("release_date").notNull(),subject:zn("subject").notNull(),htmlBody:zn("html_body").notNull(),textBody:zn("text_body").notNull(),sections:GT("sections").notNull().default({}),status:zn("status").notNull().default("draft"),recipientCount:JT("recipient_count"),sentAt:uo("sent_at",{withTimezone:!0}),sentBy:Ys("sent_by"),error:zn("error"),createdAt:uo("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:uo("updated_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Sm("idx_announcements_status").on(e.status),Sm("idx_announcements_created").on(e.createdAt)]),St=Am("announcement_deliveries",{id:Ys("id").primaryKey().defaultRandom(),announcementId:Ys("announcement_id").notNull(),userId:Ys("user_id").notNull(),email:zn("email").notNull(),status:zn("status").notNull().default("pending"),providerId:zn("provider_id"),error:zn("error"),sentAt:uo("sent_at",{withTimezone:!0}),createdAt:uo("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[KT("uniq_announcement_deliveries_announcement_user").on(e.announcementId,e.userId),Sm("idx_announcement_deliveries_user").on(e.userId,e.createdAt)]),At=Am("notification_preferences",{userId:Ys("user_id").primaryKey(),productAnnouncements:zT("product_announcements").notNull().default(!0),unsubscribeToken:zn("unsubscribe_token").notNull().unique(),unsubscribedAt:uo("unsubscribed_at",{withTimezone:!0}),createdAt:uo("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:uo("updated_at",{withTimezone:!0}).notNull().defaultNow()})});import{pgTable as YT,text as Em,timestamp as Wy,uuid as xm,integer as XT,index as QT,unique as ZT}from"drizzle-orm/pg-core";var zy,Vy=J(()=>{"use strict";zy=YT("scaffolding_fingerprints",{id:xm("id").primaryKey().defaultRandom(),userId:xm("user_id").notNull(),harness:Em("harness").notNull(),model:Em("model").notNull(),toolsHash:Em("tools_hash").notNull(),firstSeenAt:Wy("first_seen_at",{withTimezone:!0}).notNull().defaultNow(),lastSeenAt:Wy("last_seen_at",{withTimezone:!0}).notNull().defaultNow(),snapshotCount:XT("snapshot_count").notNull().default(1),firstSessionId:xm("first_session_id")},e=>[ZT("scaffolding_fingerprints_user_id_harness_model_tools_hash_key").on(e.userId,e.harness,e.model,e.toolsHash),QT("idx_scaffolding_fp_segment").on(e.userId,e.harness,e.model)])});import{pgTable as eR,text as Tm,timestamp as tR,jsonb as nR,uuid as Jy,integer as rR,unique as oR}from"drizzle-orm/pg-core";var Gy,Ky=J(()=>{"use strict";Gy=eR("scaffolding_segments",{id:Jy("id").primaryKey().defaultRandom(),userId:Jy("user_id").notNull(),harness:Tm("harness").notNull(),model:Tm("model").notNull(),coreNames:nR("core_names").notNull(),coreHash:Tm("core_hash").notNull(),activeFingerprints:rR("active_fingerprints").notNull(),computedAt:tR("computed_at",{withTimezone:!0}).notNull().defaultNow()},e=>[oR("scaffolding_segments_user_id_harness_model_key").on(e.userId,e.harness,e.model)])});var Rm=J(()=>{"use strict";Ft();Xo();p_();Fn();f_();Pr();Fs();I_();S_();Gp();T_();R_();em();P_();Od();sm();M_();U_();H_();W_();J_();K_();Pa();X_();Z_();ty();ry();cy();uy();py();fy();_y();wy();by();xy();Ry();jy();Ny();My();Ly();Uy();By();Fy();Vy();Ky()});import{relations as We}from"drizzle-orm";var sR,iR,aR,cR,dR,uR,lR,pR,mR,fR,gR,hR,_R,yR,wR,vR,IR,bR,SR,AR,ER,xR,TR,RR,kR,jR,NR,PR,CR,OR,Yy=J(()=>{"use strict";Rm();sR=We(T,({many:e})=>({sessions:e(_),contextSnapshots:e(L),apiKeys:e(Ae)})),iR=We(Ae,({one:e})=>({profile:e(T,{fields:[Ae.userId],references:[T.id]})})),aR=We(G,({many:e})=>({teams:e(K),userOrganizations:e(Q),projects:e(U),invitations:e(ae)})),cR=We(K,({one:e,many:t})=>({organization:e(G,{fields:[K.orgId],references:[G.id]}),userTeams:t(ye),invitations:t(ae)})),dR=We(ae,({one:e})=>({organization:e(G,{fields:[ae.orgId],references:[G.id]}),team:e(K,{fields:[ae.teamId],references:[K.id]}),inviter:e(T,{fields:[ae.invitedBy],references:[T.id]})})),uR=We(Q,({one:e})=>({organization:e(G,{fields:[Q.orgId],references:[G.id]})})),lR=We(ye,({one:e})=>({team:e(K,{fields:[ye.teamId],references:[K.id]})})),pR=We(g,({one:e,many:t})=>({versions:t(Ie),projectInstructions:t(at),events:t(Ct),usageEvents:t(so),sessionInstructions:t(se),packInstructions:t(Oe),forkedFrom:e(g,{fields:[g.forkedFromId],references:[g.id]})})),mR=We(Ct,({one:e})=>({instruction:e(g,{fields:[Ct.instructionId],references:[g.id]})})),fR=We(F,({one:e,many:t})=>({project:e(U,{fields:[F.projectId],references:[U.id]}),parent:e(F,{fields:[F.parentId],references:[F.id]}),versions:t(F)})),gR=We(Ie,({one:e})=>({instruction:e(g,{fields:[Ie.instructionId],references:[g.id]})})),hR=We(U,({one:e,many:t})=>({organization:e(G,{fields:[U.orgId],references:[G.id]}),projectInstructions:t(at),sessions:t(_)})),_R=We(at,({one:e})=>({project:e(U,{fields:[at.projectId],references:[U.id]}),instruction:e(g,{fields:[at.instructionId],references:[g.id]})})),yR=We(_,({one:e,many:t})=>({profile:e(T,{fields:[_.userId],references:[T.id]}),project:e(U,{fields:[_.projectId],references:[U.id]}),run:e(X,{fields:[_.runId],references:[X.id]}),events:t(qe),sessionInstructions:t(se),treatmentExposures:t(Z),contextSnapshots:t(L)})),wR=We(X,({one:e,many:t})=>({profile:e(T,{fields:[X.userId],references:[T.id]}),organization:e(G,{fields:[X.orgId],references:[G.id]}),project:e(U,{fields:[X.projectId],references:[U.id]}),sessions:t(_),launchJobs:t(ce)})),vR=We(ce,({one:e})=>({run:e(X,{fields:[ce.runId],references:[X.id]})})),IR=We(qe,({one:e})=>({session:e(_,{fields:[qe.sessionId],references:[_.id]})})),bR=We(se,({one:e})=>({session:e(_,{fields:[se.sessionId],references:[_.id]}),instruction:e(g,{fields:[se.instructionId],references:[g.id]})})),SR=We(jt,({one:e,many:t})=>({owner:e(T,{fields:[jt.userId],references:[T.id]}),project:e(U,{fields:[jt.projectId],references:[U.id]}),exposures:t(Z)})),AR=We(Z,({one:e})=>({session:e(_,{fields:[Z.sessionId],references:[_.id]}),owner:e(T,{fields:[Z.userId],references:[T.id]}),assignment:e(jt,{fields:[Z.assignmentId],references:[jt.id]})})),ER=We(Le,({one:e,many:t})=>({packInstructions:t(Oe),forkedFrom:e(Le,{fields:[Le.forkedFromId],references:[Le.id]})})),xR=We(Oe,({one:e})=>({pack:e(Le,{fields:[Oe.packId],references:[Le.id]}),instruction:e(g,{fields:[Oe.instructionId],references:[g.id]})})),TR=We(so,({one:e})=>({instruction:e(g,{fields:[so.instructionId],references:[g.id]})})),RR=We(k,({one:e,many:t})=>({parent:e(k,{fields:[k.parentId],references:[k.id]}),evals:t(Se),evalRuns:t(be),benchmarks:t(Wn),evalJobs:t(ke),evalConversations:t($e)})),kR=We(Se,({one:e,many:t})=>({evalTarget:e(k,{fields:[Se.evalTargetId],references:[k.id]}),runs:t(be)})),jR=We(be,({one:e})=>({eval:e(Se,{fields:[be.evalId],references:[Se.id]}),evalTarget:e(k,{fields:[be.evalTargetId],references:[k.id]})})),NR=We(Wn,({one:e})=>({evalTarget:e(k,{fields:[Wn.evalTargetId],references:[k.id]})})),PR=We(ke,({one:e})=>({evalTarget:e(k,{fields:[ke.evalTargetId],references:[k.id]})})),CR=We($e,({one:e})=>({evalTarget:e(k,{fields:[$e.evalTargetId],references:[k.id]})})),OR=We(L,({one:e})=>({session:e(_,{fields:[L.sessionId],references:[_.id]}),profile:e(T,{fields:[L.userId],references:[T.id]})}))});var cu={};to(cu,{SUGGESTION_KINDS:()=>su,agentJobs:()=>je,agentRuns:()=>X,agentRunsRelations:()=>wR,alertDispatches:()=>yn,announcementDeliveries:()=>St,announcements:()=>De,apiKeys:()=>Ae,apiKeysRelations:()=>iR,benchmarks:()=>Wn,benchmarksRelations:()=>NR,cliErrorEvents:()=>Kd,cliSetupEvents:()=>Gd,contentBlobs:()=>_n,contextSnapshots:()=>L,contextSnapshotsRelations:()=>OR,evalComparisons:()=>Xe,evalConversations:()=>$e,evalConversationsRelations:()=>CR,evalGradeAnnotations:()=>Je,evalJobs:()=>ke,evalJobsRelations:()=>PR,evalRuns:()=>be,evalRunsRelations:()=>jR,evalTargets:()=>k,evalTargetsRelations:()=>RR,evals:()=>Se,evalsRelations:()=>kR,extensionAuthCodes:()=>Rn,harnessReleases:()=>Pt,insightRecommendationLog:()=>Ee,insightsJobs:()=>W,instructionEvents:()=>Ct,instructionEventsRelations:()=>mR,instructionExperimentArms:()=>Or,instructionExperiments:()=>q,instructionPromotions:()=>ie,instructionSuggestionEvents:()=>tt,instructionSuggestions:()=>x,instructionUsageEvents:()=>so,instructionUsageEventsRelations:()=>TR,instructionVerdicts:()=>Y,instructionVersionIdentities:()=>sr,instructionVersions:()=>Ie,instructionVersionsRelations:()=>gR,instructions:()=>g,instructionsRelations:()=>pR,judgeReviewerVerdicts:()=>pe,launchJobs:()=>ce,launchJobsRelations:()=>vR,limitObservations:()=>we,memories:()=>F,memoriesRelations:()=>fR,memoryExperiments:()=>Nt,modelPricing:()=>Qe,notificationPreferences:()=>At,notifications:()=>bt,orgInvitations:()=>ae,orgInvitationsRelations:()=>dR,organizations:()=>G,organizationsRelations:()=>aR,packInstructions:()=>Oe,packInstructionsRelations:()=>xR,packs:()=>Le,packsRelations:()=>ER,pendingTreatmentExposures:()=>$d,planLimitsActive:()=>Ge,profiles:()=>T,profilesRelations:()=>sR,projectCheckouts:()=>le,projectInstructions:()=>at,projectInstructionsRelations:()=>_R,projects:()=>U,projectsRelations:()=>hR,providerDocsSnapshots:()=>xt,scaffoldingFingerprints:()=>zy,scaffoldingSegments:()=>Gy,sessionEvents:()=>qe,sessionEventsRelations:()=>IR,sessionInstructions:()=>se,sessionInstructionsRelations:()=>bR,sessionSendJobs:()=>Wd,sessionTerminalTargets:()=>Ve,sessions:()=>_,sessionsRelations:()=>yR,skillSubmissions:()=>ao,teams:()=>K,teamsRelations:()=>cR,treatmentAssignments:()=>jt,treatmentAssignmentsRelations:()=>SR,treatmentExposures:()=>Z,treatmentExposuresRelations:()=>AR,userOrganizations:()=>Q,userOrganizationsRelations:()=>uR,userTeams:()=>ye,userTeamsRelations:()=>lR,workerConnections:()=>fe});var du=J(()=>{"use strict";Rm();Yy()});function Pm(){is++,is>km&&(km=is)}function Cm(){is>0&&is--}function Om(){Xs++,Xs>jm&&(jm=Xs)}function Dm(){Xs>0&&Xs--}function Ja(){return is}function Mm(){Xy++}function Ga(){Qy++}function Zy(){Nm++}function Lm(){let e=Nm;return Nm=0,e}function $m(){return{current:is,peak:km,heavyCurrent:Xs,heavyPeak:jm,shedCount:Xy,ingestShedCount:Qy}}function Qs(){let e=Number(process.env.PG_INFLIGHT_MAX);return Number.isFinite(e)&&e>0?e:(Number(process.env.PG_POOL_MAX)||3)*4}function Ka(){let e=Qs(),t=Number(process.env.PG_INGEST_INFLIGHT_MAX);if(Number.isFinite(t)&&t>0)return Math.min(t,e);let n=Number(process.env.PG_POOL_MAX)||3;return Math.min(e,Math.max(n,Math.floor(e/2)))}var is,km,Xs,jm,Xy,Qy,Nm,qm=J(()=>{"use strict";is=0,km=0,Xs=0,jm=0,Xy=0,Qy=0,Nm=0;d(Pm,"trackDbOpStart");d(Cm,"trackDbOpEnd");d(Om,"trackHeavyDbOpStart");d(Dm,"trackHeavyDbOpEnd");d(Ja,"getDbLoad");d(Mm,"recordDbShed");d(Ga,"recordIngestShed");d(Zy,"recordQueryDeadline");d(Lm,"consumeDeadlineCount");d($m,"getDbLoadStats");d(Qs,"dbInflightMax");d(Ka,"dbIngestInflightMax")});import{drizzle as ew}from"drizzle-orm/postgres-js";import Um from"postgres";function Hm(e){let t=process.env[e];if(!t)throw new Error(`Missing required env var: ${e}`);return t}function tw(){if(Qa)throw new Error("getDb() called after closeDb(): the connection pool is closed for shutdown. Stop issuing queries (timers/requests) before draining the pool.");if(!Xa){let e=process.env.PG_APPLICATION_NAME||"rulemetric",t=Number(process.env.PG_POOL_MAX)||3,n=Number(process.env.PG_CONNECT_TIMEOUT_S)||10,r=Number(process.env.PG_STATEMENT_TIMEOUT_MS)||0,o=Number(process.env.PG_IDLE_TIMEOUT)||5,s=Number(process.env.PG_KEEP_ALIVE_S)||60;ei=Um(Hm("DATABASE_URL"),{prepare:!1,max:t,connect_timeout:n,idle_timeout:o,keep_alive:s,max_lifetime:300,connection:{application_name:e,...r>0?{statement_timeout:r}:{}}}),Xa=ew(ei,{schema:cu})}return Xa}function nw(){if(Qa)throw new Error("getHeavyDb() called after closeDb(): the connection pool is closed for shutdown. Stop issuing queries (timers/requests) before draining the pool.");if(!lu){let e=(process.env.PG_APPLICATION_NAME||"rulemetric")+":heavy",t=Number(process.env.PG_HEAVY_POOL_MAX)||2;pu=Um(Hm("DATABASE_URL"),{prepare:!1,max:t,connect_timeout:Number(process.env.PG_CONNECT_TIMEOUT_S)||10,idle_timeout:Number(process.env.PG_IDLE_TIMEOUT)||5,keep_alive:Number(process.env.PG_KEEP_ALIVE_S)||60,max_lifetime:300,connection:{application_name:e}}),lu=ew(pu,{schema:cu})}return lu}async function Za(){if(uu)return uu;Qa=!0;let e=ei,t=Zs,n=pu;return ei=void 0,Xa=void 0,Zs=void 0,pu=void 0,lu=void 0,uu=Promise.allSettled([e?e.end({timeout:5}):Promise.resolve(),t?t.end({timeout:5}):Promise.resolve(),n?n.end({timeout:5}):Promise.resolve()]).then(()=>{}),uu}function Bm(){if(Qa)return Promise.resolve();if(Ya)return Ya;let e=ei;return ei=void 0,Xa=void 0,Ya=(async()=>{e&&await e.end({timeout:5}).catch(()=>{})})().finally(()=>{Ya=void 0}),Ya}async function Fm(e){let t=Date.now();if(Qa)return{ok:!1,ms:0,err:new Error("pool closed for shutdown")};let n=Zs;try{return n||(n=Um(Hm("DATABASE_URL"),{prepare:!1,max:1,connect_timeout:Number(process.env.PG_CONNECT_TIMEOUT_S)||10,idle_timeout:20,max_lifetime:300,connection:{application_name:(process.env.PG_APPLICATION_NAME||"rulemetric")+":probe",statement_timeout:Math.max(2e3,e-2e3)}}),Zs=n),await Promise.race([n`SELECT 1`,new Promise((r,o)=>setTimeout(()=>o(new Error("db probe timeout")),e))]),{ok:!0,ms:Date.now()-t}}catch(r){return Zs===n&&(Zs=void 0),n?.end({timeout:1}).catch(()=>{}),{ok:!1,ms:Date.now()-t,err:r}}}function ec(e){let t=e?.message;return typeof t=="string"&&t.includes(DR)}function ti(e){let t=e,n=t?.code??t?.cause?.code??t?.errno;return n!==void 0&&MR.has(n)}function fu(e){let t=e,n=t?.code??t?.cause?.code??t?.errno;return n!==void 0&&LR.has(n)}async function rw(e,t={}){let n=t.attempts??3,r=t.baseMs??100,o;for(let s=0;s<n;s++)try{return await e()}catch(i){o=i;let a=ti(i)||t.retryResets===!0&&fu(i);if(s===n-1||!a)throw i;await new Promise(c=>setTimeout(c,r*2**s))}throw o}function tc(e){return e?.code==="QUERY_DEADLINE"}function ow(){let e=Number(process.env.PG_QUERY_DEADLINE_MS);return Number.isFinite(e)&&e>=0?e:2e4}function sw(){let e=Number(process.env.PG_HEAVY_QUERY_DEADLINE_MS);return Number.isFinite(e)&&e>=0?e:6e4}function $R(e,t,n=!0){let r,o=new Promise((s,i)=>{r=setTimeout(()=>{n&&Zy(),i(new mu(t))},t);let a=r;typeof a.unref=="function"&&a.unref()});return Promise.race([e,o]).finally(()=>clearTimeout(r))}function Wm(e,t=!1,n=0,r=!1){return e===null||typeof e!="object"&&typeof e!="function"?e:new Proxy(e,{get(o,s,i){if(s==="then"){let c=Reflect.get(o,s,i);return typeof c!="function"?c:(l,p)=>{let m=r?Om:Pm,y=r?Dm:Cm;m();let v=rw(()=>new Promise((f,w)=>c.call(o,f,w)),{retryResets:t});return(n>0?$R(v,n,!r):v).finally(y).then(l,p)}}let a=Reflect.get(o,s,i);return typeof a=="function"?(...c)=>Wm(a.apply(o,c),t,n,r):a}})}function cw(e,t=!1){let n=t?Om:Pm,r=t?Dm:Cm;n();try{return Promise.resolve(e()).finally(r)}catch(o){throw r(),o}}var Xa,ei,Qa,uu,Ya,Zs,pu,lu,DR,MR,LR,mu,iw,aw,u,nt,zm=J(()=>{"use strict";du();qm();Qa=!1;d(Hm,"getEnv");d(tw,"getDb");d(nw,"getHeavyDb");d(Za,"closeDb");d(Bm,"recyclePool");d(Fm,"probeDbReachable");DR="called after closeDb()";d(ec,"isPoolClosedError");MR=new Set(["CONNECT_TIMEOUT","ETIMEDOUT","ENOTFOUND","ECONNREFUSED","EAI_AGAIN"]);d(ti,"isRetryableConnectError");LR=new Set(["CONNECTION_CLOSED","ECONNRESET","EPIPE"]);d(fu,"isRetryableResetError");d(rw,"withDbRetry");mu=class extends Error{static{d(this,"QueryDeadlineError")}code="QUERY_DEADLINE";constructor(t){super(`Query exceeded the client-side deadline of ${t}ms \u2014 the DB pool is likely saturated (acquire-wait) or holding a dead socket; failing fast to avoid pinning the caller. See client.ts.`),this.name="QueryDeadlineError"}};d(tc,"isQueryDeadlineError");d(ow,"queryDeadlineMs");d(sw,"heavyQueryDeadlineMs");d($R,"raceWithDeadline");iw=new Set(["select","selectDistinct","selectDistinctOn","insert","update","delete","execute","with","$count","refreshMaterializedView"]),aw=new Set(["select","selectDistinct","selectDistinctOn","$count"]);d(Wm,"wrapBuilder");d(cw,"gaugeTransaction");u=new Proxy({},{get(e,t){let n=tw(),r=n[t];if(typeof t=="string"&&iw.has(t)&&typeof r=="function"){let o=aw.has(t),s=ow();return(...i)=>Wm(r.apply(n,i),o,s)}return t==="transaction"&&typeof r=="function"?(...o)=>cw(()=>r.apply(n,o)):r}}),nt=new Proxy({},{get(e,t){let n=nw(),r=n[t];if(typeof t=="string"&&iw.has(t)&&typeof r=="function"){let o=aw.has(t);return(...s)=>Wm(r.apply(n,s),o,sw(),!0)}return t==="transaction"&&typeof r=="function"?(...o)=>cw(()=>r.apply(n,o),!0):r}})});async function tn(e){let[t]=await u.insert(bt).values({userId:e.userId,type:e.type,title:e.title,body:e.body??null,url:e.url??null,sourceTable:e.sourceTable??null,sourceId:e.sourceId??null,metadata:e.metadata??{}}).onConflictDoNothing({target:[bt.userId,bt.sourceTable,bt.sourceId]}).returning();return t??null}var dw=J(()=>{"use strict";zm();du();d(tn,"notifyUser")});var O=J(()=>{"use strict";du();zm();qm();dw()});function dI(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Fu(e,t){let n=(e??"").trim();if(!n)return null;if(!n.includes("Contents of "))return n;if(t){let o=n.match(new RegExp(`Contents of [^\\n]*${dI(t)}[^\\n]*\\n([\\s\\S]*?)(?=\\nContents of |$)`,"i"))?.[1]?.trim();if(o)return o;let s=t.split("/").pop();if(s&&s!==t){let a=n.match(new RegExp(`Contents of [^\\n]*${dI(s)}[^\\n]*\\n([\\s\\S]*?)(?=\\nContents of |$)`,"i"))?.[1]?.trim();if(a)return a}}return null}var Nf=J(()=>{"use strict";d(dI,"escapeRegExp");d(Fu,"extractInstructionSection")});var mI={};to(mI,{GRADUATION_MIN_N:()=>Ic,decideGraduation:()=>lI,graduatedRulesForRender:()=>Pf,instructionContentHash:()=>Ur,maybeGraduate:()=>pI,settleExperiment:()=>gi,verdictRowsForExperiments:()=>zu});import{createHash as cN}from"node:crypto";import{and as Wu,eq as Gn,inArray as dN,sql as uI}from"drizzle-orm";function lI(e){return e.resolution!=="resolved"||e.randomisationSuspect||e.contentChanged||e.delta===null||e.ci===null||e.measured.treated<Ic||e.measured.control<Ic?null:e.delta>0?"always":"never"}function Ur(e,t){let n=Fu(e,t);return n?cN("sha256").update(n).digest("hex"):null}async function pI(e){let{experimentId:t,userId:n,verdict:r}=e,o=lI(r);if(o===null)return null;let[s]=await u.select({id:q.id,instructionId:q.instructionId,projectPath:q.projectPath,status:q.status}).from(q).where(Wu(Gn(q.id,t),Gn(q.userId,n)));if(!s||s.status!=="running")return null;let[i]=await u.select({content:g.content,name:g.name}).from(g).where(Gn(g.id,s.instructionId)),a=Ur(i?.content,i?.name);if(!a)return null;let l=(await u.execute(uI`
|
|
1
|
+
var 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 o_=Object.defineProperty;var d=(e,t)=>o_(e,"name",{value:t,configurable:!0})
|
|
|
9
9
|
AND s.user_id = a.user_id
|
|
10
10
|
WHERE a.experiment_id = ${t}
|
|
11
11
|
AND s.analysis->>'outcome' IS NOT NULL
|
|
12
|
-
`))[0];return await
|
|
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 o_=Object.defineProperty;var d=(e,t)=>o_(e,"name",{value:t,configurable:!0})
|
|
|
17
17
|
AND project_path = ${r.projectPath}
|
|
18
18
|
AND accepted_at IS NULL
|
|
19
19
|
AND declined_at IS NULL
|
|
20
|
-
`),"trial_neutral"):null}async function
|
|
21
|
-
`).filter(h=>h.trim()),r=[];for(let h of n)try{r.push(JSON.parse(h))}catch{}let o=r.filter(h=>h.type==="user"||h.type==="assistant"),s=null,i=null,
|
|
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 ZI(e){try{let t=e.match(/\{[\s\S]*\}/);if(!t)r
|
|
|
81
81
|
WHERE key LIKE 'bubbleId:%'
|
|
82
82
|
AND json_extract(value, '$.tokenCount.inputTokens') > 0
|
|
83
83
|
ORDER BY json_extract(value, '$.createdAt') ASC
|
|
84
|
-
`;
|
|
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
86
|
${Nc(t)}
|
|
87
|
-
`;return await
|
|
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 XA=J(()=>{"use strict";d(KA,"resolveRuntimeWebConfig");d(Gq,"stampRuntimeConfig")});import*as Ip from"node:fs";import*as bp from"node:path";import{fileURLToPath as TU}from"node:url";import{serve as RU}from"@hono/node-server";import{trace as i_,context as TE}from"@opentelemetry/api";import{NodeSDK as RE}from"@opentelemetry/sdk-node";import{OTLPTraceExporter as kE}from"@opentelemetry/exporter-trace-otlp-http";import{BatchSpanProcessor as jE,ConsoleSpanExporter as NE,SimpleSpanProcessor as PE}from"@opentelemetry/sdk-trace-node";import{Resource as CE}from"@opentelemetry/resources";import{ATTR_SERVICE_NAME as OE,ATTR_SERVICE_VERSION as DE}from"@opentelemetry/semantic-conventions";function s_(e){if(!e)return{};let t={};for(let n of e.split(",")){let r=n.indexOf("=");if(r===-1)continue;let o=n.slice(0,r).trim(),s=n.slice(r+1).trim();o&&(t[o]=s)}return t}d(s_,"parseOtlpHeaders");var qs=null;function Us(){return process.env.TELEMETRY_ENABLED!=="false"}d(Us,"isTelemetryEnabled");function jp(e){if(!Us()||qs!==null)return"off";let t=new CE({[OE]:e.serviceName,[DE]:e.serviceVersion??"0.1.0"}),n=process.env.OTEL_EXPORTER_OTLP_ENDPOINT,r,o;if(n){let s=s_(process.env.OTEL_EXPORTER_OTLP_HEADERS),i=new kE({url:`${n}/v1/traces`,headers:s});o=new jE(i),r="otlp"}else if(process.env.OTEL_SPAN_EXPORT==="none")o=void 0,r="silent";else{let s=new NE;o=new PE(s),r="console"}return qs=new RE({resource:t,spanProcessors:o?[o]:[]}),qs.start(),r}d(jp,"initTelemetry");async function Np(){qs&&(await qs.shutdown(),qs=null)}d(Np,"shutdownTelemetry");function Pp(e){return i_.getTracer(e??"rulemetric")}d(Pp,"getTracer");function Cp(){return i_.getSpan(TE.active())?.spanContext().traceId}d(Cp,"getTraceId");import{SpanKind as ME,SpanStatusCode as a_}from"@opentelemetry/api";function Op(){return async(e,t)=>{if(!Us()){await t();return}let n=Pp(),r=e.req.method,o=e.req.path;await n.startActiveSpan(`${r} ${o}`,{kind:ME.SERVER,attributes:{"http.method":r,"http.url":e.req.url,"http.route":o}},async s=>{try{await t(),s.setAttribute("http.status_code",e.res.status);let i=e.get("userId");i&&s.setAttribute("rulemetric.user_id",i),e.res.status>=400&&s.setStatus({code:a_.ERROR})}catch(i){throw s.setStatus({code:a_.ERROR}),s.recordException(i),i}finally{s.end()}})}}d(Op,"telemetryMiddleware");import{trace as LE,context as $E}from"@opentelemetry/api";function Dp(e){let t=LE.getSpan($E.active());if(t)for(let[n,r]of Object.entries(e))t.setAttribute(n,r)}d(Dp,"setSpanAttributes");import*as Nr from"@sentry/node";var Ia=!1;function Mp(e){if(Ia)return!1;let t=process.env.SENTRY_DSN;return t?(Nr.init({dsn:t,serverName:e.serviceName,environment:process.env.NODE_ENV??"development",tracesSampleRate:0}),Ia=!0,!0):!1}d(Mp,"initSentry");function rr(e,t){if(!Ia)return;let n=e instanceof Error?e:new Error(typeof e=="string"?e:JSON.stringify(e));Nr.captureException(n,t)}d(rr,"captureException");function ba(e){if(Ia){if(e===null){Nr.setUser(null);return}Nr.setUser({id:e})}}d(ba,"setSentryUser");async function Sa(e){Ia&&await Nr.flush(e)}d(Sa,"flushSentry");import*as wd from"node:fs";import*as fa from"node:path";import{fileURLToPath as Kq}from"node:url";import{Hono as Yq}from"hono";import{cors as Xq}from"hono/cors";import{bodyLimit as Qq}from"hono/body-limit";import{serveStatic as Zq}from"@hono/node-server/serve-static";O();import{createHash as GR}from"node:crypto";import{createClient as KR}from"@supabase/supabase-js";import{eq as gw,and as YR,isNull as XR}from"drizzle-orm";import{createHmac as qR,createPublicKey as UR,timingSafeEqual as HR,verify as BR}from"node:crypto";var FR=6e4,rc=null,lw=0,nc=null,WR=null;async function zR(){let e=process.env.SUPABASE_URL;if(!e)throw new Error("SUPABASE_URL not set");let t=await fetch(`${e}/auth/v1/.well-known/jwks.json`,{signal:AbortSignal.timeout(5e3)});if(!t.ok)throw new Error(`JWKS fetch failed: ${t.status}`);return await t.json()}d(zR,"defaultJwksFetcher");async function Vm(){return nc||(nc=(async()=>{try{let e=await(WR??zR)(),t=new Map;for(let n of e.keys)if(n.kid)try{t.set(n.kid,UR({key:n,format:"jwk"}))}catch{}rc=t,lw=Date.now()}finally{nc=null}})(),nc)}d(Vm,"refreshJwks");function uw(e){try{return JSON.parse(Buffer.from(e,"base64url").toString("utf-8"))}catch{return null}}d(uw,"decodeB64Json");function VR(e){if(typeof e.exp=="number"&&e.exp*1e3<Date.now()||typeof e.sub!="string"||e.sub.length===0)return null;let t=e.aud;return t==="authenticated"||Array.isArray(t)&&t.includes("authenticated")?{userId:e.sub}:null}d(VR,"checkPayload");function JR(e,t,n,r){let o=qR("sha256",r).update(`${e}.${t}`).digest(),s;try{s=Buffer.from(n,"base64url")}catch{return!1}return s.length!==o.length?!1:HR(s,o)}d(JR,"verifyHs256");async function pw(e){let t=e.split(".");if(t.length!==3)return{ok:!1,reason:"invalid"};let[n,r,o]=t,s=uw(n);if(!s)return{ok:!1,reason:"invalid"};if(s.alg==="HS256"){let c=process.env.SUPABASE_JWT_SECRET;if(!c)return{ok:!1,reason:"unavailable"};if(!JR(n,r,o,c))return{ok:!1,reason:"invalid"}}else if(s.alg==="ES256"){if(typeof s.kid!="string")return{ok:!1,reason:"invalid"};if(rc===null)try{await Vm()}catch{return{ok:!1,reason:"unavailable"}}let c=rc?.get(s.kid);if(!c&&Date.now()-lw>=FR){try{await Vm()}catch{return{ok:!1,reason:"unavailable"}}c=rc?.get(s.kid)}if(!c)return{ok:!1,reason:"invalid"};let l;try{l=Buffer.from(o,"base64url")}catch{return{ok:!1,reason:"invalid"}}if(!BR("sha256",Buffer.from(`${n}.${r}`),{key:c,dsaEncoding:"ieee-p1363"},l))return{ok:!1,reason:"invalid"}}else return{ok:!1,reason:"invalid"};let i=uw(r);if(!i)return{ok:!1,reason:"invalid"};let a=VR(i);return a?{ok:!0,userId:a.userId,payload:i}:{ok:!1,reason:"invalid"}}d(pw,"verifySupabaseJwt");async function mw(e=3){for(let t=0;t<e;t++)try{return await Vm(),rc!==null}catch{await new Promise(n=>setTimeout(n,500*2**t))}return!1}d(mw,"primeJwks");function QR(e){return GR("sha256").update(e).digest("hex")}d(QR,"hashApiKey");var fw=new Map,ZR=300*1e3;function ek(e){let t=Date.now(),n=fw.get(e)??0;t-n<ZR||(fw.set(e,t),u.update(Ae).set({lastUsedAt:new Date}).where(gw(Ae.id,e)).then(()=>{}).catch(()=>{}))}d(ek,"updateLastUsed");var tk=60*1e3,nk=5e3,ni=new Map;async function hw(e,t){let n=e.req.header("Authorization");if(!n?.startsWith("Bearer "))return e.json({error:"Missing authorization header"},401);let r=n.slice(7);if(r.startsWith("rm_")){let o=QR(r),s,i=ni.get(o);if(i&&Date.now()-i.cachedAt<tk)s=i;else{i&&ni.delete(o);let[a]=await u.select({id:Ae.id,userId:Ae.userId,expiresAt:Ae.expiresAt}).from(Ae).where(YR(gw(Ae.keyHash,o),XR(Ae.revokedAt)));if(!a)return e.json({error:"Invalid API key"},401);s={id:a.id,userId:a.userId,expiresAt:a.expiresAt,cachedAt:Date.now()},ni.size>=nk&&ni.clear(),ni.set(o,s)}if(s.expiresAt&&new Date(s.expiresAt)<new Date)return ni.delete(o),e.json({error:"API key expired"},401);e.set("userId",s.userId),ba(s.userId),ek(s.id),await t();return}try{let o=KR(process.env.SUPABASE_URL,process.env.SUPABASE_ANON_KEY,{global:{headers:{Authorization:`Bearer ${r}`}}}),s=await pw(r);if(s.ok){e.set("userId",s.userId),e.set("supabase",o),ba(s.userId),await t();return}if(s.reason==="invalid")return console.log(`[auth] local JWT verify FAIL ${e.req.method} ${e.req.path}`),e.json({error:"Invalid token"},401);let i=Date.now(),{data:{user:a},error:c}=await o.auth.getUser();if(console.log(`[auth] getUser ${e.req.method} ${e.req.path} ms=${Date.now()-i} ${c?`err=${c.message}`:`userId=${a?.id??"?"}`}`),c||!a)return e.json({error:"Invalid token"},401);e.set("user",a),e.set("userId",a.id),e.set("supabase",o),ba(a.id),await t()}catch{return e.json({error:"Authentication failed"},401)}}d(hw,"authMiddleware");O();import{HTTPException as rk}from"hono/http-exception";import{ZodError as ok}from"zod";function ot(e){return e.replace(/[%_\\]/g,"\\$&")}d(ot,"escapeLike");function ri(e){let t=e;return t?.code??t?.cause?.code??t?.errno}d(ri,"transientCode");var sk=new Set(["ECONNRESET","EPIPE","ECONNABORTED"]);function _w(e,t){return e instanceof ok?t.json({error:"Validation error",details:e.flatten().fieldErrors},400):e instanceof rk?e.getResponse():ec(e)?t.json({error:"Server draining, retry shortly"},503):tc(e)?(process.env.LOG_LEVEL==="debug"&&console.debug("[req] query deadline exceeded \u2014 DB pool saturated; shed 503"),t.json({error:"Database busy, retry shortly"},503,{"Retry-After":"2"})):e.message==="aborted"||sk.has(ri(e)??"")?(process.env.LOG_LEVEL==="debug"&&console.debug(`[req] client/transient disconnect code=${ri(e)??"aborted"}`),t.body(null,503)):(console.error("Unhandled error:",e),t.json({error:"Internal server error"},500))}d(_w,"errorHandler");function oc(e,t){let n=new Map;return setInterval(()=>{let r=Date.now();for(let[o,s]of n)r>s.resetAt&&n.delete(o)},6e4).unref(),async(r,o)=>{let i=`${r.req.header("x-forwarded-for")?.split(",")[0]?.trim()??r.req.header("x-real-ip")??"unknown"}:${r.req.path}`,a=Date.now(),c=n.get(i);if((!c||a>c.resetAt)&&(c={count:0,resetAt:a+e},n.set(i,c)),c.count++,r.res.headers.set("X-RateLimit-Limit",String(t)),r.res.headers.set("X-RateLimit-Remaining",String(Math.max(0,t-c.count))),r.res.headers.set("X-RateLimit-Reset",String(Math.ceil(c.resetAt/1e3))),c.count>t)return r.json({error:"Too many requests, please try again later"},429);await o()}}d(oc,"rateLimit");var gu=!0,Jm="",yw=0;function Gm(e,t="",n=-1){if(e===gu){!e&&t&&(Jm=t);return}gu=e,Jm=e?"":t,yw=n,console.log(`[db-readiness] -> ${e?"READY":"NOT READY"}${t?` (${t})`:""}`)}d(Gm,"setDbReady");function sc(){return gu}d(sc,"isDbReady");function hu(){return{ready:gu,reason:Jm,changedAt:yw}}d(hu,"dbReadiness");async function ww(e,t){return sc()?t():(e.header("Retry-After","5"),e.json({error:"Service temporarily unavailable: the database is recovering. Retry shortly.",reason:hu().reason||void 0},503))}d(ww,"dbShed");O();var ik=5e3,vw=0;async function Iw(e,t){let n=Ja(),r=Qs();if(n>r){Mm();let o=Date.now();return o-vw>=ik&&(vw=o,console.warn(`[db_load_shed] shedding: inFlight=${n} > max=${r} path=${e.req.path}`)),e.header("Retry-After","1"),e.json({error:"Service busy: the database is under transient load. Retry shortly.",inFlight:n},503)}return t()}d(Iw,"dbLoadShed");O();var ak=5e3,bw=0;async function ic(e,t){if(e.req.method!=="POST")return t();let n=Ja(),r=Ka();if(n>=r){Ga();let o=Date.now();return o-bw>=ak&&(bw=o,console.warn(`[ingest_load_shed] shedding write: inFlight=${n} >= ingestMax=${r} path=${e.req.path}`)),e.header("Retry-After","2"),e.json({error:"Ingest busy: the database is under transient write load. Retry shortly.",inFlight:n},429)}return t()}d(ic,"ingestLoadShed");var Sw=d(async(e,t)=>{await t(),e.res.headers.set("X-Content-Type-Options","nosniff"),e.res.headers.set("X-Frame-Options","DENY"),e.res.headers.set("X-XSS-Protection","0"),e.res.headers.set("Referrer-Policy","strict-origin-when-cross-origin"),e.res.headers.set("Permissions-Policy","camera=(), microphone=(), geolocation=()")},"securityHeaders");function Aw(){return async(e,t)=>{let n=Date.now();try{await t()}finally{let r=Date.now()-n,o=Number(process.env.SLOW_REQUEST_LOG_MS)||2e3,s=Number(process.env.SLOW_REQUEST_MAX_MS)||12e4;if(r>s||r<o&&e.res.status<500)return;let i=new URL(e.req.url).pathname,a=e.get("userId");console.warn(`[http] slow_or_error method=${e.req.method} path=${i} status=${e.res.status} ms=${r}${a?` user=${a}`:""}`)}}}d(Aw,"slowRequestLog");import{Hono as dk}from"hono";import{z as lo}from"zod";import{createClient as Ew}from"@supabase/supabase-js";import{createClient as ck}from"@supabase/supabase-js";async function _u(e){let t=process.env.SUPABASE_URL,n=process.env.SUPABASE_ANON_KEY;if(!t||!n)return{ok:!1,status:500,error:"Server authentication not configured"};let r=ck(t,n,{auth:{persistSession:!1,autoRefreshToken:!1}}),o=`${e.slice(0,6)}\u2026${e.slice(-4)}`,s=Date.now();console.log(`[auth] refreshSession start refresh_token=${o}`);let{data:i,error:a}=await r.auth.refreshSession({refresh_token:e});return a||!i.session?(console.log(`[auth] refreshSession FAIL refresh_token=${o} ms=${Date.now()-s} err=${a?.message??"no-session"}`),{ok:!1,status:401,error:a?.message??"refresh failed"}):(console.log(`[auth] refreshSession OK refresh_token=${o} ms=${Date.now()-s} userId=${i.user?.id??"?"}`),{ok:!0,session:{accessToken:i.session.access_token,refreshToken:i.session.refresh_token,expiresAt:i.session.expires_at?new Date(i.session.expires_at*1e3).toISOString():null,email:i.user?.email??null}})}d(_u,"refreshSupabaseSession");var oi=new dk,uk=lo.object({email:lo.string().email(),password:lo.string().min(1)}),lk=lo.object({refreshToken:lo.string().min(1)});oi.post("/auth/login",async e=>{let t=await e.req.json(),n=uk.parse(t),r=process.env.SUPABASE_URL,o=process.env.SUPABASE_ANON_KEY;if(!r||!o)return e.json({error:"Server authentication not configured"},500);let s=Ew(r,o),i=Date.now();console.log(`[auth] signInWithPassword start email=${n.email} ua="${e.req.header("user-agent")??""}"`);let{data:a,error:c}=await s.auth.signInWithPassword({email:n.email,password:n.password});return c||!a.session?(console.log(`[auth] signInWithPassword FAIL email=${n.email} ms=${Date.now()-i} err=${c?.message??"no-session"}`),e.json({error:"Invalid email or password"},401)):(console.log(`[auth] signInWithPassword OK email=${n.email} ms=${Date.now()-i} userId=${a.user?.id??"?"}`),e.json({accessToken:a.session.access_token,refreshToken:a.session.refresh_token,expiresAt:a.session.expires_at?new Date(a.session.expires_at*1e3).toISOString():null,email:a.user?.email??n.email}))});var pk=lo.object({email:lo.string().email(),password:lo.string().min(8,"Password must be at least 8 characters")});oi.post("/auth/signup",async e=>{let t=await e.req.json(),n=pk.parse(t),r=process.env.SUPABASE_URL,o=process.env.SUPABASE_ANON_KEY;if(!r||!o)return e.json({error:"Server authentication not configured"},500);let s=Ew(r,o),i=process.env.WEB_URL??"http://localhost:5174",{data:a,error:c}=await s.auth.signUp({email:n.email,password:n.password,options:{emailRedirectTo:`${i}/auth/confirm`}});if(c){let l=/already registered|already exists|user already/i.test(c.message);return e.json({error:c.message},l?409:400)}return a.user&&(a.user.identities?.length??0)===0&&!a.session?e.json({error:"An account with this email already exists. Run `rulemetric auth login`."},409):a.session?e.json({confirmationRequired:!1,accessToken:a.session.access_token,refreshToken:a.session.refresh_token,expiresAt:a.session.expires_at?new Date(a.session.expires_at*1e3).toISOString():null,email:a.user?.email??n.email}):e.json({confirmationRequired:!0,email:a.user?.email??n.email})});oi.post("/auth/refresh",async e=>{let t=await e.req.json().catch(()=>null),n=lk.safeParse(t);if(!n.success)return e.json({error:"refreshToken is required"},400);let r=await _u(n.data.refreshToken);return r.ok?e.json(r.session):e.json({error:r.error},r.status)});import{readFileSync as mk}from"node:fs";import{dirname as fk,resolve as Km}from"node:path";import{fileURLToPath as gk}from"node:url";import{Hono as hk}from"hono";var _k="https://registry.npmjs.org/-/package/@rulemetric%2Fcli/dist-tags",yk=3600*1e3,wk=3e3,ac=null;function vk(){if(process.env.RULEMETRIC_BUNDLED_CLI_VERSION)return process.env.RULEMETRIC_BUNDLED_CLI_VERSION;let e=fk(gk(import.meta.url)),t=[Km(e,"../../../cli/package.json"),Km(e,"../../../../apps/cli/package.json"),Km(process.cwd(),"apps/cli/package.json")];for(let n of t)try{let r=JSON.parse(mk(n,"utf-8"));if(r.version)return r.version}catch{}return"0.0.0"}d(vk,"readBundledCliVersion");async function Ik(){try{let e=await fetch(_k,{headers:{accept:"application/json"},signal:AbortSignal.timeout(wk)});if(!e.ok)return null;let t=await e.json();return typeof t.latest=="string"&&t.latest?t.latest:null}catch{return null}}d(Ik,"fetchLatestFromNpm");async function bk(){let e=Date.now();if(ac&&e-ac.at<yk)return ac.version;let n=await Ik()??ac?.version??vk();return ac={version:n,at:e},n}d(bk,"getLatestCliVersion");var yu=new hk;yu.get("/cli/latest-version",async e=>e.json({latest:await bk()}));import{Hono as Dk}from"hono";O();import{sql as Sk}from"drizzle-orm";var Ak=12e3,Ek=3e4,xw=4,xk=Number(process.env.PG_RECYCLE_DEADLINE_THRESHOLD)||3,Tk="pipeline:api_db_pool_wedged",Rk="pipeline:api_db_pool_recycled",si=0;async function Ym(){return Fm(Ak)}d(Ym,"probeDb");function kk(e){let t=[],n=[],r=e;for(let o=0;r&&o<8;o++){let s=r;typeof s.code=="string"&&t.push(s.code),typeof s.message=="string"&&n.push(s.message),r=s.cause}return{codes:t,message:n.join(" ").toLowerCase()}}d(kk,"flattenCauseChain");function jk(e){let{codes:t,message:n}=kk(e);return n.includes("max client")||n.includes("emaxconn")||n.includes("max_client_conn")||t.includes("XX000")&&n.includes("client")}d(jk,"isPoolSaturation");function Nk(e){return jk(e)?"Supavisor tenant saturated (client cap reached)":ti(e)?"transient connect failure":"DB unreachable / probe timed out"}d(Nk,"classifyProbeFailure");async function Pk(e=Ym,t={}){let n=t.consumeDeadlines??Lm,r=t.recycle??Bm,o=t.onRecycle??Ok,s=await e();if(s.ok){let a=!sc();si>0&&console.log(`[db-wedge] DB reachable again after ${si} failed probe(s)`),si=0,Gm(!0,"",Date.now()),a&&Ck();let c=n();c>=xk&&(console.error(`[db-wedge] recycling the MAIN pool: ${c} client-side query-deadline(s) while a fresh dedicated probe is healthy \u2014 the pool is holding black-holed sockets a restart is not needed to clear.`),Promise.resolve().then(()=>r()).catch(l=>console.error("[db-wedge] pool recycle failed:",l instanceof Error?l.message:l)),o(c));return}si+=1;let i=Nk(s.err);console.error(`[db-wedge] dedicated DB probe failed (${si}/${xw}) \u2014 ${i}`),si>=xw&&sc()&&(Gm(!1,`DB unreachable from a dedicated connection \u2014 ${i}`,Date.now()),console.error("[db-wedge] marking API NOT READY (shedding DB traffic). NOT restarting: a process restart cannot free a shared Supavisor pooler. Readiness restores automatically on the next OK probe."))}d(Pk,"watchdogTick");async function Tw(e,t){try{await u.execute(Sk`
|
|
94
|
+
${e}`}var 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 XA=J(()=>{"use strict";d(KA,"resolveRuntimeWebConfig");d(Gq,"stampRunt
|
|
|
110
110
|
WHERE datname = current_database()
|
|
111
111
|
GROUP BY application_name, client_addr, state
|
|
112
112
|
ORDER BY conns DESC
|
|
113
|
-
`),n=t.reduce((s,i)=>s+i.conns,0),r=
|
|
114
|
-
|
|
115
|
-
${i}`):n.push(i);break}}return n.join(`
|
|
116
|
-
|
|
117
|
-
`)}d(Cw,"assembleSlots");function de(e,t,n,r){if(!t||Object.keys(t).length===0)return e;let o=Cw(t,n);return r?.appendContent&&e.trim()?`${o}
|
|
118
|
-
|
|
119
|
-
${e.trim()}`:o}d(de,"buildOutput");function ef(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(ef,"detectFormat");var Bk={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"}},Ow={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,Bk);return o&&n.push(o),{output:n.join(`
|
|
120
|
-
|
|
121
|
-
`),format:"agents-md",outputPath:"AGENTS.md",warnings:[]}}},Dw={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 tf(e){return e.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n")}d(tf,"escapeYamlString");function cr(e){return e.replace(/[\r\n]+/g," ").trim()}d(cr,"sanitizeHeading");var Fk={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"}},Mw={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,Fk);return o&&n.push(o),{output:n.join(`
|
|
122
|
-
|
|
123
|
-
`),format:"claude-md",outputPath:"CLAUDE.md",warnings:[]}}},Lw={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 Wk={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"}},$w={convert(e,t){let n=[],r=["---",`description: "${tf(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,Wk);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}}},qw={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 zk={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"}},Uw={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(`
|
|
130
|
-
|
|
131
|
-
`),format:"copilot",outputPath:".github/copilot-instructions.md",warnings:[]}}},Hw={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 Vk={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"}},Bw={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,Vk);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}}},Fw={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 Jk={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"}},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,Jk);return o&&n.push(o),{output:n.join(`
|
|
134
|
-
|
|
135
|
-
`),format:"cline",outputPath:".clinerules",warnings:[]}}},zw={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 Gk={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={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(`
|
|
136
|
-
|
|
137
|
-
`),format:"roo",outputPath:".roo/rules/rulemetric.md",warnings:[]}}},Jw={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 Kk={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"}},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,Kk);return o&&n.push(o),{output:n.join(`
|
|
138
|
-
|
|
139
|
-
`),format:"aider",outputPath:"CONVENTIONS.md",warnings:[]}}},Kw={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 Yk={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"}},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,Yk);return o&&n.push(o),{output:n.join(`
|
|
140
|
-
|
|
141
|
-
`),format:"gemini",outputPath:"GEMINI.md",warnings:[]}}},Xw={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 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"}},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,Xk);return o&&n.push(o),{output:n.join(`
|
|
142
|
-
|
|
143
|
-
`),format:"continue",outputPath:".continuerules",warnings:[]}}},Zw={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 Qk={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"}},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,Qk);return o&&n.push(o),{output:n.join(`
|
|
144
|
-
|
|
145
|
-
`),format:"junie",outputPath:".junie/guidelines.md",warnings:[]}}},tv={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 Zk={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,Zk);return o&&n.push(o),{output:n.join(`
|
|
146
|
-
|
|
147
|
-
`),format:"jetbrains",outputPath:".aiassistant/rules/rulemetric.md",warnings:[]}}},rv={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 ej={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"}},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,ej);return o&&n.push(o),{output:n.join(`
|
|
148
|
-
|
|
149
|
-
`),format:"codex",outputPath:"AGENTS.md",warnings:[]}}},sv={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 tj={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,tj);return o&&n.push(o),{output:n.join(`
|
|
150
|
-
|
|
151
|
-
`),format:"amazon-q",outputPath:".amazonq/rules/rulemetric.md",warnings:[]}}},av={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 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"}},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,nj);return o&&n.push(o),{output:n.join(`
|
|
152
|
-
|
|
153
|
-
`),format:"goose",outputPath:".goosehints",warnings:[]}}},dv={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 rj={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,rj);return o&&n.push(o),{output:n.join(`
|
|
154
|
-
|
|
155
|
-
`),format:"kilocode",outputPath:".kilocode/rules/rulemetric.md",warnings:[]}}},lv={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 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"}},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,oj);return o&&n.push(o),{output:n.join(`
|
|
156
|
-
|
|
157
|
-
`),format:"augment",outputPath:".augment-guidelines/rulemetric.md",warnings:[]}}},mv={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 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"}},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,sj);return o&&n.push(o),{output:n.join(`
|
|
158
|
-
|
|
159
|
-
`),format:"tabnine",outputPath:".tabnine/instructions.md",warnings:[]}}},gv={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 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"}},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,ij);return o&&n.push(o),{output:n.join(`
|
|
160
|
-
|
|
161
|
-
`),format:"opencode",outputPath:"AGENTS.md",warnings:[]}}},_v={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 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"}},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,aj);return o&&n.push(o),{output:n.join(`
|
|
162
|
-
|
|
163
|
-
`),format:"warp",outputPath:".warp/rules/rulemetric.md",warnings:[]}}},wv={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 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"}},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,cj);return o&&n.push(o),{output:n.join(`
|
|
164
|
-
|
|
165
|
-
`),format:"trae",outputPath:".trae/rules/rulemetric.md",warnings:[]}}},Iv={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 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"}},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,dj);return o&&n.push(o),{output:n.join(`
|
|
166
|
-
|
|
167
|
-
`),format:"vscode-copilot",outputPath:".vscode/copilot-instructions.md",warnings:[]}}},Sv={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 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"}},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,uj);return o&&n.push(o),{output:n.join(`
|
|
168
|
-
|
|
169
|
-
`),format:"qodo",outputPath:".qodo/guidelines.md",warnings:[]}}},Ev={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 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"}},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,lj);return o&&n.push(o),{output:n.join(`
|
|
170
|
-
|
|
171
|
-
`),format:"genkit",outputPath:".genkit/rulemetric.md",warnings:[]}}},Tv={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 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"}},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,pj);return o&&n.push(o),{output:n.join(`
|
|
172
|
-
|
|
173
|
-
`),format:"amp",outputPath:"AGENTS.md",warnings:[]}}},kv={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 mj={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"}},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,mj);return o&&n.push(o),{output:n.join(`
|
|
174
|
-
|
|
175
|
-
`),format:"soul-md",outputPath:"SOUL.md",warnings:[]}}},Nv={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 fj={"## identity":"system_identity","## file handling":"file_access_rules","## code generation":"code_generation_rules","## review process":"review_checklist"},Pv={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=fj[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 gj={"## file access":"file_access_rules","## code rules":"code_generation_rules","## checklist":"review_checklist"},Cv={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=gj[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 hj={"## file rules":"file_access_rules","## rules":"code_generation_rules","## review":"review_checklist"},Ov={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=hj[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 _j={"## file rules":"file_access_rules","## coding rules":"code_generation_rules","## review steps":"review_checklist"},Dv={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=_j[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 yj={"## identity":"system_identity","## file rules":"file_access_rules","## code rules":"code_generation_rules","## review":"review_checklist"},Mv={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=yj[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 wj={"## persona":"system_identity","## identity":"system_identity","## rules":"code_generation_rules","## constraints":"code_generation_rules","## workflow":"review_checklist","## knowledge":"file_access_rules"},Lv={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=wj[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",Ow,Dw),e.register("claude-md",Mw,Lw),e.register("cursorrules",$w,qw),e.register("copilot",Uw,Hw),e.register("windsurf",Bw,Fw),e.register("cline",Ww,zw),e.register("roo",Vw,Jw),e.register("aider",Gw,Kw),e.register("gemini",Yw,Xw),e.register("continue",Qw,Zw),e.register("junie",ev,tv),e.register("jetbrains",nv,rv),e.register("codex",ov,sv),e.register("soul-md",jv,Nv),e.register("amazon-q",iv,av),e.register("goose",cv,dv),e.register("kilocode",uv,lv),e.register("augment",pv,mv),e.register("tabnine",fv,gv),e.register("opencode",hv,_v),e.register("warp",yv,wv),e.register("trae",vv,Iv),e.register("vscode-copilot",bv,Sv),e.register("qodo",Av,Ev),e.register("genkit",xv,Tv),e.register("amp",Rv,kv),e.registerReverse("agents-md",Pv),e.registerReverse("claude-md",Cv),e.registerReverse("cursorrules",Ov),e.registerReverse("copilot",Dv),e.registerReverse("windsurf",Mv),e.registerReverse("soul-md",Lv),e}d(ci,"defaultRegistry");function $v(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($v,"scoreCompleteness");function qv(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(qv,"scoreSpecificity");function Uv(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(Uv,"scoreFormatting");function Hv(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(Hv,"scoreLength");function Bv(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(Bv,"scoreCompatibility");function nf(e,t){let n=[{...$v(e,t),weight:.3},{...qv(e),weight:.25},{...Uv(e),weight:.15},{...Hv(e,t),weight:.15},{...Bv(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(nf,"scoreOutput");function rf(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 Rj){let a=o.match(i.pattern);a&&r.push({pattern:i.description,severity:i.severity,category:i.category,match:a[0].slice(0,100)})}let s=100;for(let i of r)s-=Tj[i.severity]??5;return{score:Math.max(0,Math.min(100,s)),findings:r}}d(df,"scanContent");var wn=new kj,Nj=ct.object({name:ct.string().min(1).max(255),description:ct.string().min(1),scope:ct.enum(["org","team","project","personal"]),scopeRef:ct.string().uuid().optional(),version:ct.string().default("1.0.0"),content:ct.string().min(1),tags:ct.array(ct.string()).optional(),compatibility:ct.array(ct.string()).optional()}),Pj=ct.object({name:ct.string().min(1).max(255).optional(),description:ct.string().min(1).optional(),version:ct.string().optional(),content:ct.string().min(1).optional(),tags:ct.array(ct.string()).optional(),compatibility:ct.array(ct.string()).optional(),changeSummary:ct.string().optional()});wn.get("/instructions",async e=>{let t=e.get("userId"),n=e.req.query("search"),r=e.req.query("scope"),o=e.req.query("tags"),s=e.req.query("type"),i=parseInt(e.req.query("limit")??"100",10),a=parseInt(e.req.query("offset")??"0",10),c=[Me(g.archived,!1),Me(g.createdBy,t)];if(r&&c.push(Me(g.scope,r)),s&&c.push(Me(g.type,s)),n){let h=ot(n);c.push(lf(uf(g.name,`%${h}%`),uf(g.description,`%${h}%`),uf(g.content,`%${h}%`)))}let l=await u.select().from(g).where(dr(...c)).orderBy(Vv(g.updatedAt)).limit(i).offset(a);if(o){let h=o.split(",").map(f=>f.trim().toLowerCase());l=l.filter(f=>h.some(w=>f.tags?.some(b=>b.toLowerCase().includes(w))))}let p=l.map(h=>h.id),m=p.length>0?await u.select({instructionId:at.instructionId,projectName:U.name,projectId:U.id}).from(at).innerJoin(U,Me(U.id,at.projectId)).where(di`${at.instructionId} IN (${di.join(p.map(h=>di`${h}`),di`, `)})`):[],y=new Map;for(let h of m){let f=y.get(h.instructionId)??[];f.push({projectId:h.projectId,projectName:h.projectName}),y.set(h.instructionId,f)}let v=l.map(h=>({...h,projects:y.get(h.id)??[]}));return Tt({userId:t,surface:"api",action:"list"}),e.json(v)});wn.get("/instructions/by-hash/:hash",async e=>{let t=e.get("userId"),n=e.req.param("hash"),[r]=await u.select({id:g.id,name:g.name,contextIdentity:g.contextIdentity,version:g.version,type:g.type}).from(g).where(dr(Me(g.contentHash,n),Me(g.createdBy,t),Me(g.archived,!1))).limit(1);return r?e.json({instruction:r}):e.json({instruction:null})});wn.post("/instructions/by-hashes",async e=>{let t=e.get("userId"),n=await e.req.json(),r=ct.array(ct.string()).max(200).parse(n.hashes??[]),o=ct.array(ct.string()).max(200).parse(n.identities??[]);if(r.length===0&&o.length===0)return e.json({instructions:{}});let s=[Me(g.createdBy,t),Me(g.archived,!1)],i=[];r.length>0&&i.push(zv(g.contentHash,r)),o.length>0&&i.push(zv(g.contextIdentity,o));let a=await u.select({id:g.id,name:g.name,contextIdentity:g.contextIdentity,version:g.version,type:g.type,contentHash:g.contentHash,source:di`${g.frontmatter}->>'source'`}).from(g).where(dr(...s,i.length===1?i[0]:lf(...i))),c={};for(let l of a)l.contentHash&&(c[l.contentHash]=l),l.contextIdentity&&(c[l.contextIdentity]=l);return e.json({instructions:c})});wn.get("/instructions/:id/sessions",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await u.select({sessionId:se.sessionId,linkMethod:se.linkMethod,tool:_.tool,projectPath:_.projectPath,startedAt:_.startedAt,endedAt:_.endedAt,analysis:_.analysis}).from(se).innerJoin(_,Me(_.id,se.sessionId)).where(dr(Me(se.instructionId,n),Me(_.userId,t))).orderBy(Vv(_.startedAt)).limit(50);return e.json({sessions:r})});wn.get("/instructions/:id",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await u.select().from(g).where(dr(Me(g.id,t),Me(g.archived,!1),lf(Me(g.createdBy,n),Me(g.scope,"public"))));return r?(Tt({instructionId:t,userId:n,surface:"api",action:"view"}),e.json(r)):e.json({error:"Instruction not found"},404)});var Cj=/<\/?(?:system-reminder|system|available-deferred-tools|tool-result)>/i;function Jv(e){return Cj.test(e)?"Content contains forbidden system tags":null}d(Jv,"validateNoForbiddenTags");wn.post("/instructions",async e=>{let t=e.get("userId"),n=await e.req.json(),r=Nj.parse(n),o=Jv(r.content);if(o)return e.json({error:o},422);r.name=cr(r.name),r.description=cr(r.description);let s={},i=null;try{let p=ai(r.content);s=p.frontmatter,i=p.slots}catch{s={name:r.name,description:r.description,type:"instruction",scope:r.scope,version:r.version}}let a=r.scope==="personal"?t:r.scopeRef??null,c=df(r.content,r.name,r.description),[l]=await u.insert(g).values({name:r.name,description:r.description,type:"instruction",scope:r.scope,scopeRef:a,version:r.version,content:r.content,frontmatter:s,slots:i,tags:r.tags??[],compatibility:r.compatibility??[],createdBy:t,scanScore:c.score,scanFindings:c.findings.length>0?c.findings:null}).returning();return await u.insert(Ie).values({instructionId:l.id,versionNumber:1,content:r.content,frontmatter:s,changeSummary:"Initial version",createdBy:t}),Tt({instructionId:l.id,userId:t,surface:"api",action:"create"}),e.json(l,201)});wn.put("/instructions/:id",async e=>{let t=e.req.param("id"),n=e.get("userId"),r=await e.req.json(),o=Pj.parse(r);if(o.content){let m=Jv(o.content);if(m)return e.json({error:m},422)}o.name&&(o.name=cr(o.name)),o.description&&(o.description=cr(o.description));let[s]=await u.select().from(g).where(dr(Me(g.id,t),Me(g.createdBy,n),Me(g.archived,!1)));if(!s)return e.json({error:"Instruction not found"},404);let i=s.frontmatter,a=s.slots;if(o.content)try{let m=ai(o.content);i=m.frontmatter,a=m.slots}catch{}let c={};if(o.content||o.name||o.description){let m=df(o.content??s.content,o.name??s.name,o.description??s.description);c.scanScore=m.score,c.scanFindings=m.findings.length>0?m.findings:null}let l,p=4;for(let m=0;m<=p;m++)try{l=await u.transaction(async y=>{await y.select({id:g.id}).from(g).where(Me(g.id,t)).for("update");let[{maxVersion:v}]=await y.select({maxVersion:di`COALESCE(MAX(${Ie.versionNumber}), 0)`}).from(Ie).where(Me(Ie.instructionId,t)),h=v+1,[f]=await y.update(g).set({...o.name&&{name:o.name},...o.description&&{description:o.description},...o.version&&{version:o.version},...o.content&&{content:o.content},...o.tags&&{tags:o.tags},...o.compatibility&&{compatibility:o.compatibility},frontmatter:i,slots:a,...c,updatedAt:new Date}).where(Me(g.id,t)).returning();return await y.insert(Ie).values({instructionId:t,versionNumber:h,content:o.content??s.content,frontmatter:i,changeSummary:o.changeSummary??null,createdBy:n}),f});break}catch(y){if(y.cause?.code==="23505"&&m<p)continue;throw y}return l?(Tt({instructionId:t,userId:n,surface:"api",action:"update"}),e.json(l)):e.json({error:"Instruction update failed"},500)});wn.delete("/instructions/:id",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await u.select().from(g).where(dr(Me(g.id,t),Me(g.createdBy,n),Me(g.archived,!1)));if(!r)return e.json({error:"Instruction not found"},404);let[o]=await u.update(g).set({archived:!0,archivedAt:new Date,archivedBy:n}).where(Me(g.id,t)).returning(),s=await u.update(x).set({dismissedAt:new Date,isStale:!0}).where(dr(Me(x.userId,n),Me(x.instructionId,t),jj(x.dismissedAt))).returning({id:x.id});return Tt({instructionId:t,userId:n,surface:"api",action:"delete"}),e.json({...o,dismissedSuggestions:s.length})});wn.post("/instructions/:id/restore",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await u.select().from(g).where(dr(Me(g.id,t),Me(g.createdBy,n),Me(g.archived,!0)));if(!r)return e.json({error:"Archived instruction not found"},404);let[o]=await u.update(g).set({archived:!1,archivedAt:null,archivedBy:null}).where(Me(g.id,t)).returning();return Tt({instructionId:t,userId:n,surface:"api",action:"update"}),e.json(o)});wn.get("/instructions/:id/versions",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await u.select({id:g.id}).from(g).where(dr(Me(g.id,t),Me(g.createdBy,n)));if(!r)return e.json({error:"Instruction not found"},404);let o=await u.select().from(Ie).where(Me(Ie.instructionId,t)).orderBy(Ie.versionNumber);return e.json(o)});O();import{Hono as Oj}from"hono";import{z as pf}from"zod";import{eq as Gv,and as Dj}from"drizzle-orm";var xu=new Oj,Mj=pf.object({format:pf.enum(Iu),score:pf.enum(["true","false"]).optional().default("false")});xu.post("/instructions/:id/convert",async e=>{let t=e.req.param("id"),n=Mj.parse(e.req.query()),r=n.format,o=n.score==="true",[s]=await u.select().from(g).where(Dj(Gv(g.id,t),Gv(g.archived,!1)));if(!s)return e.json({error:"Instruction not found"},404);let i;try{i=ai(s.content)}catch{i={frontmatter:{name:s.name,description:s.description??"",type:"instruction",scope:s.scope,version:s.version??"1.0.0",tags:s.tags??[],compatibility:s.compatibility??[]},content:s.content,slots:s.slots}}let a=ci(),c=a.get(r);if(!c)return e.json({error:`Unsupported format: ${r}`},400);let l=c.convert(i),p=e.get("userId");if(Tt({instructionId:t,userId:p,surface:"api",action:"convert",metadata:{format:r}}),o){let m=a.getMetadata(r);if(m){let y=nf(l.output,m.scoringMetadata);return e.json({...l,score:y})}}return e.json(l)});import{Hono as Lj}from"hono";var Tu=new Lj;Tu.get("/converters",async e=>{let n=ci().listAll().map(r=>({id:r.metadata.id,name:r.metadata.name,description:r.metadata.description,tier:r.metadata.tier,outputPath:r.metadata.outputPath,toolUrl:r.metadata.toolUrl}));return e.json(n)});O();import{Hono as $j}from"hono";import{z as qr}from"zod";var Ru=new $j,qj=qr.object({content:qr.string().min(1),sourceFormat:qr.enum(Iu).optional(),filename:qr.string().optional(),name:qr.string().optional(),scope:qr.enum(["org","team","project","personal"]).default("personal"),scopeRef:qr.string().uuid().optional(),tags:qr.array(qr.string()).optional()});Ru.post("/instructions/import",async e=>{let t=e.get("userId"),n=await e.req.json(),r=qj.parse(n),o=r.sourceFormat??null;if(!o){let m=ef({filename:r.filename,content:r.content});m&&(o=m.format)}if(!o)return e.json({error:"Could not detect format. Provide sourceFormat explicitly."},400);let s=ci(),i=s.getReverse(o);if(!i)return e.json({error:`No import parser for format: ${o}`,supportedFormats:s.listReverseFormats()},400);let a=i.parse(r.content,r.filename),c=r.name??a.frontmatter.name,l=r.scope==="personal"?t:r.scopeRef??null,[p]=await u.insert(g).values({name:c,description:a.frontmatter.description,type:"instruction",scope:r.scope,scopeRef:l,version:"1.0.0",content:a.content,frontmatter:a.frontmatter,slots:a.slots,tags:r.tags??a.frontmatter.tags??[],compatibility:a.frontmatter.compatibility??[],createdBy:t}).returning();return await u.insert(Ie).values({instructionId:p.id,versionNumber:1,content:a.content,frontmatter:a.frontmatter,changeSummary:`Imported from ${o}`,createdBy:t}),Tt({instructionId:p.id,userId:t,surface:"api",action:"import",metadata:{sourceFormat:o}}),e.json({instruction:p,sourceFormat:o,parseWarnings:[]},201)});O();import{Hono as Uj}from"hono";import{eq as po,and as mf}from"drizzle-orm";var pc=new Uj;pc.post("/instructions/:id/fork",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(g).where(mf(po(g.id,n),po(g.archived,!1)));if(!r)return e.json({error:"Instruction not found"},404);if(r.createdBy===t)return e.json({error:"Cannot fork your own instruction"},400);if(r.scope==="org"&&r.scopeRef){let[s]=await u.select({id:g.id}).from(g).where(mf(po(g.createdBy,t),po(g.scope,"org"),po(g.scopeRef,r.scopeRef))).limit(1);if(!s)return e.json({error:"Instruction not found"},404)}else if(r.scope!=="org")return e.json({error:"Instruction not found"},404);let[o]=await u.insert(g).values({name:`${r.name} (fork)`,description:r.description,type:r.type,scope:"personal",scopeRef:t,version:"1.0.0",content:r.content,frontmatter:r.frontmatter,slots:r.slots,tags:r.tags,compatibility:r.compatibility,createdBy:t,forkedFromId:r.id,upstreamVersion:r.version}).returning();return await u.insert(Ie).values({instructionId:o.id,versionNumber:1,content:o.content,frontmatter:o.frontmatter,changeSummary:`Forked from ${r.name}`,createdBy:t}),await u.insert(Ct).values({instructionId:o.id,eventType:"fork",actorId:t,metadata:{sourceId:r.id,sourceName:r.name,sourceVersion:r.version}}),Tt({instructionId:o.id,userId:t,surface:"api",action:"fork"}),e.json(o,201)});pc.get("/instructions/:id/events",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await u.select({id:g.id}).from(g).where(mf(po(g.id,t),po(g.createdBy,n)));if(!r)return e.json({error:"Instruction not found"},404);let o=await u.select().from(Ct).where(po(Ct.instructionId,t)).orderBy(Ct.createdAt);return e.json(o)});O();import{Hono as Hj}from"hono";import{eq as Vn,and as Kv,sql as Bj}from"drizzle-orm";var mc=new Hj;mc.get("/instructions/:id/upstream",async e=>{let t=e.req.param("id"),[n]=await u.select().from(g).where(Kv(Vn(g.id,t),Vn(g.archived,!1)));if(!n)return e.json({error:"Instruction not found"},404);if(!n.forkedFromId)return e.json({error:"This instruction is not a fork"},400);let[r]=await u.select().from(g).where(Vn(g.id,n.forkedFromId));return r?e.json({hasUpdate:r.version!==n.upstreamVersion,currentVersion:n.upstreamVersion,upstreamVersion:r.version,parentId:r.id,parentName:r.name}):e.json({hasUpdate:!1,currentVersion:n.upstreamVersion,upstreamVersion:null,parentId:n.forkedFromId})});mc.post("/instructions/:id/pull-upstream",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(g).where(Kv(Vn(g.id,n),Vn(g.createdBy,t),Vn(g.archived,!1)));if(!r)return e.json({error:"Instruction not found"},404);if(!r.forkedFromId)return e.json({error:"This instruction is not a fork"},400);let[o]=await u.select().from(g).where(Vn(g.id,r.forkedFromId));if(!o)return e.json({error:"Parent instruction no longer exists"},404);let[s]=await u.select().from(Ie).where(Vn(Ie.instructionId,o.id)).orderBy(Ie.versionNumber).limit(1),i=s?.content??o.content,a=rf(i,o.content,r.content);if(a.hasConflicts)return e.json({hasConflicts:!0,merged:a.merged,conflicts:a.conflicts});let c,l=4;for(let p=0;p<=l;p++)try{c=await u.transaction(async m=>{await m.select({id:g.id}).from(g).where(Vn(g.id,n)).for("update");let[y]=await m.select({maxVersion:Bj`COALESCE(MAX(${Ie.versionNumber}), 0)`}).from(Ie).where(Vn(Ie.instructionId,n)),v=(y?.maxVersion??0)+1,[h]=await m.update(g).set({content:a.merged,upstreamVersion:o.version,updatedAt:new Date}).where(Vn(g.id,n)).returning();return await m.insert(Ie).values({instructionId:n,versionNumber:v,content:a.merged,frontmatter:r.frontmatter,changeSummary:`Pulled upstream changes from ${o.name} (${o.version})`,createdBy:t}),await m.insert(Ct).values({instructionId:n,eventType:"pull_upstream",actorId:t,metadata:{parentId:o.id,parentVersion:o.version,previousUpstreamVersion:r.upstreamVersion}}),h});break}catch(m){if(m.cause?.code==="23505"&&p<l)continue;throw m}return c?(Tt({instructionId:n,userId:t,surface:"api",action:"pull_upstream"}),e.json({hasConflicts:!1,instruction:c})):e.json({error:"Pull-upstream failed after version conflict"},500)});O();import{Hono as Fj}from"hono";import{z as mo}from"zod";import{eq as Ot,and as as,sql as Wj}from"drizzle-orm";var zj=mo.object({scope:mo.enum(["team","org"]),scopeRef:mo.string().uuid()}),fc=new Fj;fc.post("/instructions/:id/promote",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=zj.parse(await e.req.json()),[o]=await u.select().from(g).where(as(Ot(g.id,n),Ot(g.createdBy,t),Ot(g.archived,!1)));if(!o)return e.json({error:"Instruction not found"},404);if(o.scope==="org")return e.json({error:"Instruction is already org-scoped"},400);if(r.scope==="team"){let[c]=await u.select().from(ye).where(as(Ot(ye.userId,t),Ot(ye.teamId,r.scopeRef)));if(!c)return e.json({error:"You are not a member of this team"},403)}else if(r.scope==="org"){let[c]=await u.select().from(Q).where(as(Ot(Q.userId,t),Ot(Q.orgId,r.scopeRef)));if(!c||c.role!=="admin"&&c.role!=="owner")return e.json({error:"You must be an org admin to promote to org scope"},403)}let s=o.scope,i=o.scopeRef,[a]=await u.update(g).set({scope:r.scope,scopeRef:r.scopeRef,updatedAt:new Date}).where(Ot(g.id,n)).returning();return await u.insert(Ct).values({instructionId:n,eventType:"promote",actorId:t,metadata:{fromScope:s,fromScopeRef:i,toScope:r.scope,toScopeRef:r.scopeRef}}),Tt({instructionId:n,userId:t,surface:"api",action:"promote"}),e.json(a)});var Vj=mo.object({targetScope:mo.enum(["personal","team","org"]),targetScopeRef:mo.string().uuid().optional(),name:mo.string().optional(),seedEvalTarget:mo.boolean().optional()});async function Jj(e){let[t]=await u.select({id:k.id}).from(k).where(Wj`${k.metadata}->>'instructionId' = ${e}`).limit(1);return t??null}d(Jj,"findExistingEvalTarget");fc.post("/instructions/:id/promote-from-public",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=Vj.parse(await e.req.json()),[o]=await u.select().from(g).where(as(Ot(g.id,n),Ot(g.scope,"public")));if(!o)return e.json({error:"Public instruction not found"},404);if(r.targetScope==="team"){if(!r.targetScopeRef)return e.json({error:"targetScopeRef is required for team scope"},400);let[m]=await u.select().from(ye).where(as(Ot(ye.userId,t),Ot(ye.teamId,r.targetScopeRef)));if(!m)return e.json({error:"You are not a member of this team"},403)}else if(r.targetScope==="org"){if(!r.targetScopeRef)return e.json({error:"targetScopeRef is required for org scope"},400);let[m]=await u.select().from(Q).where(as(Ot(Q.userId,t),Ot(Q.orgId,r.targetScopeRef)));if(!m||m.role!=="admin"&&m.role!=="owner")return e.json({error:"You must be an org admin to promote into an org"},403)}let s=r.targetScope==="personal"?t:r.targetScopeRef,i=r.name??o.name,a=r.seedEvalTarget??(r.targetScope==="org"||r.targetScope==="team"),[c]=await u.select().from(g).where(as(Ot(g.scope,r.targetScope),Ot(g.scopeRef,s),Ot(g.forkedFromId,n),Ot(g.archived,!1)));if(c){let m=null;return a&&(m=(await Jj(c.id))?.id??null),e.json({instructionId:c.id,alreadyExisted:!0,evalTargetId:m})}let[l]=await u.insert(g).values({name:i,description:o.description,type:o.type,scope:r.targetScope,scopeRef:s,version:o.version,content:o.content,frontmatter:o.frontmatter,slots:o.slots,tags:o.tags,compatibility:o.compatibility,createdBy:t,forkedFromId:o.id,upstreamVersion:o.upstreamVersion??o.version,contentHash:o.contentHash,contextIdentity:o.contextIdentity}).returning();if(!l)return e.json({error:"Failed to clone instruction"},500);await u.insert(Ie).values({instructionId:l.id,versionNumber:1,content:o.content,frontmatter:o.frontmatter,changeSummary:`Promoted from public skill ${o.name}`,createdBy:t}),await u.insert(Ct).values({instructionId:l.id,eventType:"promote_from_public",actorId:t,metadata:{sourceInstructionId:o.id,sourceName:o.name,targetScope:r.targetScope,targetScopeRef:s}}),Tt({instructionId:l.id,userId:t,surface:"api",action:"promote_from_public"});let p=null;if(a){let[m]=await u.insert(k).values({userId:t,name:`${i} \u2014 baseline eval`,type:"instruction",content:o.content,description:`Auto-seeded from public skill \`${o.name}\` on promote.`,metadata:{instructionId:l.id,publicSourceId:o.id,publicContentHash:o.contentHash??null,publicVersion:o.version??null}}).returning({id:k.id});p=m?.id??null}return e.json({instructionId:l.id,alreadyExisted:!1,evalTargetId:p})});O();import{Hono as Gj}from"hono";import{z as Yv}from"zod";import{eq as vn,and as gc,or as Xv,inArray as Qv,sql as ku,desc as Kj}from"drizzle-orm";var hc=new Gj,Yj=Yv.object({badge:Yv.enum(["recommended","required"]).nullable()});hc.get("/catalog",async e=>{let t=e.get("userId"),n=e.req.query("badge"),r=e.req.query("scope"),o=e.req.query("search"),s=parseInt(e.req.query("contentPreview")??"0",10),i=Number.isFinite(s)?Math.min(Math.max(s,0),400):0,a=parseInt(e.req.query("limit")??"50",10),c=parseInt(e.req.query("offset")??"0",10),l=Math.min(Math.max(a,1),200),p=Math.max(c,0),m=await u.select({orgId:Q.orgId}).from(Q).where(vn(Q.userId,t)),y=await u.select({teamId:ye.teamId}).from(ye).where(vn(ye.userId,t)),v=m.map(E=>E.orgId).filter(E=>E!==null),h=y.map(E=>E.teamId).filter(E=>E!==null),f=[vn(g.archived,!1)],w=[vn(g.scope,"public")];if(v.length>0&&w.push(gc(vn(g.scope,"org"),Qv(g.scopeRef,v))),h.length>0&&w.push(gc(vn(g.scope,"team"),Qv(g.scopeRef,h))),f.push(Xv(...w)),n&&f.push(vn(g.badge,n)),r&&f.push(vn(g.scope,r)),o){let E=ot(o);f.push(Xv(ku`${g.name} ILIKE ${`%${E}%`}`,ku`${g.description} ILIKE ${`%${E}%`}`))}let b=[Kj(ku`COALESCE(${g.sourceUpdatedAt}, ${g.updatedAt})`)],I={id:g.id,name:g.name,description:g.description,type:g.type,scope:g.scope,scopeRef:g.scopeRef,version:g.version,tags:g.tags,badge:g.badge,popularityScore:g.popularityScore,updatedAt:g.updatedAt,createdAt:g.createdAt,sourceUpdatedAt:g.sourceUpdatedAt},A=await(i>0?nt:u).select(i>0?{...I,contentPreview:ku`left(${g.content}, ${i})`}:I).from(g).where(gc(...f)).orderBy(...b).limit(l).offset(p);return Tt({userId:t,surface:"api",action:"search",metadata:o?{query:o}:void 0}),e.header("Cache-Control","private, max-age=30"),e.json(A)});hc.post("/instructions/:id/badge",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=Yj.parse(await e.req.json()),[o]=await u.select().from(g).where(gc(vn(g.id,n),vn(g.archived,!1)));if(!o)return e.json({error:"Instruction not found"},404);if(o.scope!=="org"&&o.scope!=="team")return e.json({error:"Badges can only be set on org or team-scoped instructions"},400);let s=o.scopeRef;if(!s)return e.json({error:"Instruction has no scope reference"},400);let[i]=await u.select().from(Q).where(gc(vn(Q.userId,t),vn(Q.orgId,s)));if(!i||i.role!=="admin"&&i.role!=="owner")return e.json({error:"Only admins of the owning organization can set badges"},403);let[a]=await u.update(g).set({badge:r.badge,updatedAt:new Date}).where(vn(g.id,n)).returning(),c=r.badge?"badge_set":"badge_removed";return await u.insert(Ct).values({instructionId:n,eventType:c,actorId:t,metadata:{badge:r.badge}}),e.json(a)});O();import{Hono as Xj}from"hono";import{eq as fo,and as ju,or as Qj,inArray as Zv}from"drizzle-orm";var Nu=new Xj;Nu.post("/projects/:id/recommendations",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(U).where(ju(fo(U.id,n),fo(U.createdBy,t)));if(!r)return e.json({error:"Project not found"},404);let o=await u.select({orgId:Q.orgId}).from(Q).where(fo(Q.userId,t)),s=await u.select({teamId:ye.teamId}).from(ye).where(fo(ye.userId,t)),i=o.map(f=>f.orgId).filter(f=>f!==null),a=s.map(f=>f.teamId).filter(f=>f!==null),c=[fo(g.scope,"public")];i.length>0&&c.push(ju(fo(g.scope,"org"),Zv(g.scopeRef,i))),a.length>0&&c.push(ju(fo(g.scope,"team"),Zv(g.scopeRef,a)));let l=await u.select().from(g).where(ju(fo(g.archived,!1),Qj(...c))).limit(50);if(l.length===0)return e.json({recommendations:[],error:null});let p={name:r.name,description:r.description,languages:[],topics:[],dependencies:[]};if(r.githubRepo)try{let f=r.githubRepo.replace("https://github.com/",""),[w,b]=await Promise.all([fetch(`https://api.github.com/repos/${f}`,{headers:{Accept:"application/vnd.github.v3+json","User-Agent":"RuleMetric"}}),fetch(`https://api.github.com/repos/${f}/languages`,{headers:{Accept:"application/vnd.github.v3+json","User-Agent":"RuleMetric"}})]);if(w.ok){let I=await w.json();p.topics=I.topics??[]}if(b.ok){let I=await b.json();p.languages=Object.keys(I)}}catch{}let m=l.map(f=>({id:f.id,name:f.name,description:f.description??"",tags:f.tags??[],contentPreview:(f.content??"").slice(0,400)})),y=process.env.LLM_PROVIDER,v=process.env.LLM_API_KEY;if(!y||!v)return e.json({recommendations:[],error:"LLM not configured"});let h=await af(p,m,{llmProvider:y,llmApiKey:v});return e.json(h)});import{Hono as JN}from"hono";O();import{Hono as vN}from"hono";import{z as Of}from"zod";import{eq as mt,and as Sc,desc as yI,sql as Kn}from"drizzle-orm";O();import{and as uN,eq as Cf,sql as lN}from"drizzle-orm";function ff(e,t){let n=e,r=t,o=n+r;if(o===0)return{pValue:1,nDiscordant:0};let s=Math.min(n,r),i=Math.pow(.5,o),a=i;for(let c=1;c<=s;c++)i*=(o-c+1)/c,a+=i;return{pValue:Math.min(1,2*a),nDiscordant:o}}d(ff,"mcnemarExact");function Pu(e,t,n=10){return{sufficient:e>=n&&t>=n,minN:n,nWith:e,nWithout:t,shortfall:{with:Math.max(0,n-e),without:Math.max(0,n-t)}}}d(Pu,"assessSufficiency");var go=1.959963984540054;function Cu(e,t,n=go){if(t===0)return{lower:0,upper:1};let r=e/t,o=n*n,s=1+o/t,i=(r+o/(2*t))/s,a=n/s*Math.sqrt(r*(1-r)/t+o/(4*t*t));return{lower:Math.max(0,i-a),upper:Math.min(1,i+a)}}d(Cu,"wilsonInterval");function li(e){let t=e>>>0;return()=>{t=t+1831565813|0;let n=Math.imul(t^t>>>15,1|t);return n=n+Math.imul(n^n>>>7,61|n)^n,((n^n>>>14)>>>0)/4294967296}}d(li,"seededRandom");function ui(e,t){let n=e.length;if(n===1)return e[0];let r=(n-1)*t,o=Math.floor(r),s=Math.ceil(r);return o===s?e[o]:e[o]+(r-o)*(e[s]-e[o])}d(ui,"sortedQuantile");function gf(e,t={}){let n=e.length;if(n===0)return{estimate:0,lower:0,upper:0,iterations:0};let r=t.iterations??1e4,o=t.ciLevel??.95,s=li(t.seed??1),i=e.reduce((l,p)=>l+p,0)/n,a=new Array(r);for(let l=0;l<r;l++){let p=0;for(let m=0;m<n;m++)p+=e[s()*n|0];a[l]=p/n}a.sort((l,p)=>l-p);let c=(1-o)/2;return{estimate:i,lower:ui(a,c),upper:ui(a,1-c),iterations:r}}d(gf,"pairedBootstrapCI");function hf(e,t,n={}){if(e.length===0||t.length===0)return{estimate:0,lower:0,upper:0,pValue:1,iterations:0};let r=n.iterations??1e4,o=n.ciLevel??.95,s=li(n.seed??1),i=d(v=>v.reduce((h,f)=>h+f,0)/v.length,"mean"),a=i(e)-i(t),c=new Array(r),l=0,p=0;for(let v=0;v<r;v++){let h=0;for(let b=0;b<e.length;b++)h+=e[s()*e.length|0];let f=0;for(let b=0;b<t.length;b++)f+=t[s()*t.length|0];let w=h/e.length-f/t.length;c[v]=w,w<=0&&l++,w>=0&&p++}c.sort((v,h)=>v-h);let m=(1-o)/2,y=Math.min(1,2*Math.min(l,p)/r);return{estimate:a,lower:ui(c,m),upper:ui(c,1-m),pValue:y,iterations:r}}d(hf,"twoSampleBootstrapCI");function _f(e,t={}){let n=e.filter(f=>f.withScores.length>0&&f.withoutScores.length>0);if(n.length===0)return{estimate:0,lower:0,upper:0,pValue:1,iterations:0};let r=d(f=>f.reduce((w,b)=>w+b,0)/f.length,"mean"),o=n.map(f=>f.withScores.length*f.withoutScores.length/(f.withScores.length+f.withoutScores.length)),s=o.reduce((f,w)=>f+w,0),i=d(f=>f.reduce((w,b,I)=>w+o[I]*b,0)/s,"combine"),a=i(n.map(f=>r(f.withScores)-r(f.withoutScores))),c=t.iterations??1e4,l=t.ciLevel??.95,p=li(t.seed??1),m=new Array(c),y=0,v=0;for(let f=0;f<c;f++){let w=n.map(I=>{let S=0;for(let E=0;E<I.withScores.length;E++)S+=I.withScores[p()*I.withScores.length|0];let A=0;for(let E=0;E<I.withoutScores.length;E++)A+=I.withoutScores[p()*I.withoutScores.length|0];return S/I.withScores.length-A/I.withoutScores.length}),b=i(w);m[f]=b,b<=0&&y++,b>=0&&v++}m.sort((f,w)=>f-w);let h=(1-l)/2;return{estimate:a,lower:ui(m,h),upper:ui(m,1-h),pValue:Math.min(1,2*Math.min(y,v)/c),iterations:c}}d(_f,"stratifiedBootstrapCI");function yf(e,t){if(e.length!==t.length)throw new Error(`cupedAdjust: outcomes (${e.length}) and covariates (${t.length}) must be the same length`);let n=e.length;if(n===0)return{adjusted:[],theta:0,varianceReduction:0};let r=t.reduce((v,h)=>v+h,0)/n,o=e.reduce((v,h)=>v+h,0)/n,s=0,i=0,a=0;for(let v=0;v<n;v++){let h=t[v]-r,f=e[v]-o;s+=h*f,i+=h*h,a+=f*f}if(i===0)return{adjusted:[...e],theta:0,varianceReduction:0};let c=s/i,l=e.map((v,h)=>v-c*(t[h]-r)),p=0,m=l.reduce((v,h)=>v+h,0)/n;for(let v of l)p+=(v-m)*(v-m);let y=a===0?0:1-p/a;return{adjusted:l,theta:c,varianceReduction:y}}d(yf,"cupedAdjust");function wf(e,t=.05){return e.map(n=>{let r=Math.abs(n.withPassRate-n.withoutPassRate),o=r>t,s;return o?s=`discriminates: ${(n.withPassRate*100).toFixed(0)}% with vs ${(n.withoutPassRate*100).toFixed(0)}% without`:n.withPassRate>=1-t&&n.withoutPassRate>=1-t?s="always passes in both cohorts \u2014 measures nothing about the treatment":n.withPassRate<=t&&n.withoutPassRate<=t?s="always fails in both cohorts \u2014 measures nothing about the treatment":s="similar pass rate in both cohorts \u2014 non-discriminating",{...n,discriminating:o,separation:r,note:s}})}d(wf,"diagnoseAssertions");function vf(e,t={}){let n=t.unpaired??0,r=t.materialFraction??.5,o=e.filter(l=>l.discriminating).length,s=e.length-o,i=e.length+n,a=s+n,c=null;if(i>0&&a>0&&a/i>=r){let l=n>0?` (${n} with no baseline cohort)`:"";c=`${a}/${i} cases do not discriminate with vs without${l} \u2014 cull or replace them before adding runs; more runs of a non-discriminating case cannot lower the MDE`}return{total:i,discriminating:o,nonDiscriminating:s,unpaired:n,diagnoses:e,gateReason:c}}d(vf,"summarizeDiscrimination");function Ou(e,t){let n=e.length,r=t.length;if(n===0||r===0)return 0;let o=[...e.map(l=>({t:l,exposed:!0})),...t.map(l=>({t:l,exposed:!1}))].sort((l,p)=>l.t-p.t),s=0,i=0;for(;i<o.length;){let l=i;for(;l+1<o.length&&o[l+1].t===o[i].t;)l++;let p=(i+1+l+1)/2;for(let m=i;m<=l;m++)o[m].exposed&&(s+=p);i=l+1}let c=(s-n*(n+1)/2)/(n*r);return Math.abs(c-.5)}d(Ou,"cohortTimeSeparation");var cs=.35,Du=900*1e3;function If(e,t,n=cs,r=Du){if(e.length===0||t.length===0)return!1;let o=[...e,...t];return Math.max(...o)-Math.min(...o)<r?!1:Ou(e,t)>n}d(If,"isTimeSeparated");var eI=d(e=>e===0||e===1,"isBinary");function tI(e,t,n){return e.every(o=>o[t]!=null&&o[n]!=null)?e.reduce((o,s)=>o+(s[t]-s[n]),0)/e.length:null}d(tI,"meanPairDelta");function Mu(e,t={}){let n=t.baseline??"no-rule",r=t.minN??10,o=e.length,s=e.map(f=>f.withScore-f.withoutScore),i=o===0?0:s.reduce((f,w)=>f+w,0)/o,a=gf(s,{seed:t.seed,iterations:t.iterations}),c={lower:a.lower,upper:a.upper},l=e.every(f=>eI(f.withScore)&&eI(f.withoutScore)),p=null;if(l&&o>0){let f=0,w=0;for(let b of e)b.withScore===1&&b.withoutScore===0?f++:b.withScore===0&&b.withoutScore===1&&w++;p=ff(f,w).pValue}let{sufficient:m}=Pu(o,o,r),y=c.lower>0||c.upper<0,h={mode:"controlled",baseline:n,delta:i,ci:c,pValue:p,significant:m&&y,sufficient:m,nWith:o,nWithout:o,costDelta:tI(e,"withCost","withoutCost"),latencyDelta:tI(e,"withLatency","withoutLatency"),confounded:!1};return m||(h.insufficientReason=`insufficient data: need >= ${r} paired tasks per cohort, have ${o}`),h}d(Mu,"buildControlledVerdict");var Zj=2;function Lu(e,t,n={}){let r=n.minN??10,o=e.length,s=t.length,i=e.map(I=>I.score),a=t.map(I=>I.score),c=[...e,...t],l=c.length>0&&c.every(I=>typeof I.covariate=="number");if(l){let{adjusted:I}=yf(c.map(S=>S.score),c.map(S=>S.covariate));i=I.slice(0,o),a=I.slice(o)}let p=hf(i,a,{seed:n.seed,iterations:n.iterations}),m={lower:p.lower,upper:p.upper},y=p.estimate,v=o>0&&s>0?p.pValue:null,{sufficient:h}=Pu(o,s,r),f=h&&(m.lower>0||m.upper<0),w=d(I=>{if(o===0||s===0||!e.every(E=>I(E)!=null)||!t.every(E=>I(E)!=null))return null;let S=e.reduce((E,R)=>E+I(R),0)/o,A=t.reduce((E,R)=>E+I(R),0)/s;return S-A},"meanDiff"),b={mode:"observational",baseline:n.baseline??"no-rule",delta:y,ci:m,pValue:v,significant:f,sufficient:h,nWith:o,nWithout:s,costDelta:w(I=>I.cost),latencyDelta:w(I=>I.latency),confounded:!0,cupedApplied:l};return h||(b.insufficientReason=`insufficient data: need >= ${r} sessions per cohort, have ${o} exposed / ${s} unexposed`),b}d(Lu,"buildObservationalVerdict");function In(e,t={}){let n=t.minN??10,r=t.minPerStratum??Zj,o=t.maxTimeSeparation??cs,s=t.minStratumSpanMs??Du,i=e.filter(R=>R.withScores.length>=r&&R.withoutScores.length>=r),a=i.filter(R=>R.withTimes!=null&&R.withoutTimes!=null&&If(R.withTimes,R.withoutTimes,o,s)),c=new Set(a.map(R=>R.key)),l=i.filter(R=>!c.has(R.key)),p=e.filter(R=>R.withScores.length>0&&R.withoutScores.length>0&&(R.withScores.length<r||R.withoutScores.length<r)).length,m=l.reduce((R,D)=>R+D.withScores.length,0),y=l.reduce((R,D)=>R+D.withoutScores.length,0),v=_f(l,{seed:t.seed,iterations:t.iterations}),h={lower:v.lower,upper:v.upper},f=v.estimate,w=l.length>0&&m>=n&&y>=n,b=l.length>0?v.pValue:null,I=w&&(h.lower>0||h.upper<0),S=e.reduce((R,D)=>R+D.withScores.length+D.withoutScores.length,0),A=S>0?(m+y)/S:0,E={mode:"observational",baseline:t.baseline??"no-rule",delta:f,ci:h,pValue:b,significant:I,sufficient:w,nWith:m,nWithout:y,costDelta:null,latencyDelta:null,confounded:!0,strata:l.length,strataDroppedForTimeSeparation:a.length,coverage:A};if(!w){let R=p>0?` (${p} project(s) had both cohorts but fewer than ${r} sessions in one of them)`:"",D=a.length>0?` ${a.length} project-month(s) held both cohorts but their sessions are separated in time (exposure predicts when a session ran), so the difference within them is a calendar difference, not a treatment effect`:"";E.insufficientReason=l.length===0?a.length>0?`insufficient data: no comparable cohort.${D}${R}`:`insufficient data: no project has >= ${r} exposed AND >= ${r} unexposed sessions to compare within${R}`:`insufficient data: need >= ${n} sessions per cohort across comparable projects, have ${m} exposed / ${y} unexposed${R}${D?`.${D}`:""}`}return E}d(In,"buildStratifiedVerdict");function bf(e,t,n={}){return{overall:In(e,n),segments:$u(t,n)}}d(bf,"buildSegmentedVerdict");function $u(e,t={}){return e.map(n=>({segment:n.segment,verdict:In(n.strata,t)}))}d($u,"buildSegmentVerdicts");function ds(e){return e.sufficient?e.significant?e.delta<0?"harmful":"helpful":"neutral":"insufficient"}d(ds,"classifyEffect");var pi={achieved:1,fully_achieved:1,mostly_achieved:.75,partially_achieved:.5,unclear_from_transcript:.25,not_achieved:0,abandoned:0},us=d(e=>{let t=e?pi[e]:void 0;return t===void 0?null:t},"scoreOutcome");var mi=10,qu=d(e=>e.length===0?0:e.reduce((t,n)=>t+n,0)/e.length,"mean"),Sf=d(e=>{if(e.length<2)return 0;let t=qu(e);return e.reduce((n,r)=>n+(r-t)**2,0)/(e.length-1)},"sampleVar"),nI=d((e,t)=>{let n=t.reduce((l,p)=>l+p,0);if(n<=0||e.length===0)return{mean:0,varOfMean:0,nEff:0};let r=t.reduce((l,p)=>l+p*p,0),o=n*n/r,s=e.reduce((l,p,m)=>l+t[m]*p,0)/n,i=n-r/n,c=(i>0?e.reduce((l,p,m)=>l+t[m]*(p-s)**2,0)/i:0)*r/(n*n);return{mean:s,varOfMean:c,nEff:o}},"weightedStats");function Af(e,t,n={}){let r=n.minAnchors??mi,o=n.z??go,s=e.length,i=t.length,a=[...e,...t.map(A=>A.judge)],c=qu(a),l=t.map(A=>A.weight??1),p=t.map(A=>A.human-A.judge),m=nI(p,l),y=m.mean,v=i>0?m.nEff:0,h=t.filter(A=>A.validated!==!1).length;if(n.pooledRectifier){let A=n.pooledRectifier,E=s>0?e:t.map($=>$.judge);if(E.length===0)return{estimate:NaN,ci:{lower:NaN,upper:NaN},se:1/0,naive:c,rectifier:A.rectifier,nLabeled:i,nUnlabeled:s,nEffective:v,nValidated:h,sufficient:!1,insufficientReason:"no judge scores to correct with the pooled rectifier"};let R=qu(E)+A.rectifier,D=Sf(E)/E.length+A.variance,j=Math.sqrt(D),P={estimate:R,ci:{lower:R-o*j,upper:R+o*j},se:j,naive:c,rectifier:A.rectifier,nLabeled:i,nUnlabeled:s,nEffective:v,nValidated:h,sufficient:A.sufficient};return A.sufficient||(P.insufficientReason="pooled rectifier not yet adequate"),P}let f,w;if(i===0)f=c,w=a.length>0?Sf(a)/a.length:0;else if(s===0){let A=nI(t.map(E=>E.human),l);f=A.mean,w=A.varOfMean}else f=qu(e)+y,w=Sf(e)/s+m.varOfMean;let b=Math.sqrt(w),I=h>=r,S={estimate:f,ci:{lower:f-o*b,upper:f+o*b},se:b,naive:c,rectifier:y,nLabeled:i,nUnlabeled:s,nEffective:v,nValidated:h,sufficient:I};if(!I){let A=i-h;S.insufficientReason=`insufficient anchors: need >= ${r} VALIDATED human-labeled items, have ${h}${A>0?` (+${A} passive, which don't count toward the floor)`:""}`}return S}d(Af,"ppiMeanEstimate");function _c(e,t,n={}){let r=Af(e.unlabeledJudge,e.labeled,{...n,pooledRectifier:n.withPooledRectifier}),o=Af(t.unlabeledJudge,t.labeled,{...n,pooledRectifier:n.withoutPooledRectifier}),s=n.z??go,i=r.estimate-o.estimate,a=Math.sqrt(r.se**2+o.se**2),c={lower:i-s*a,upper:i+s*a},l=r.sufficient&&o.sufficient,p=l&&(c.lower>0||c.upper<0),m={delta:i,ci:c,se:a,with:r,without:o,sufficient:l,significant:p};return l||(m.insufficientReason=r.insufficientReason??o.insufficientReason),m}d(_c,"ppiDifference");var Uu=50,sI=.2,iI=.8416212335729143,eN=d(e=>e.length===0?0:e.reduce((t,n)=>t+n,0)/e.length,"mean"),yc=d(e=>{if(e.length<2)return 0;let t=eN(e);return e.reduce((n,r)=>n+(r-t)**2,0)/(e.length-1)},"sampleVar");function rI(e,t){let n=e.labeled.length,r=e.unlabeledJudge.length;return n>0&&r>0?{fixed:yc(e.unlabeledJudge)/r,scaling:yc(e.labeled.map(o=>o.human-o.judge)),n}:n>0?{fixed:0,scaling:yc(e.labeled.map(o=>o.human)),n}:{fixed:r>0?yc(e.unlabeledJudge)/r:0,scaling:t.labeled.length>0?yc(t.labeled.map(o=>o.human-o.judge)):null,n:0}}d(rI,"varianceComponents");var oI=1e6;function tN(e,t){if(e.some(s=>s.scaling===null))return null;let n=d(s=>e.reduce((i,a)=>i+a.fixed+(a.scaling===0?0:a.scaling/(a.n+s)),0),"se2");if(n(oI)>t)return null;let r=0,o=oI;for(;r<o;){let s=Math.floor((r+o)/2);n(s)<=t?o=s:r=s+1}return r}d(tN,"solvePerCohortIncrement");function Ef(e,t,n={}){let r=n.pilotTarget??Uu,o=n.targetEffect??sI,s=n.minAnchors??mi,i=n.z??go,a=n.zPower??iI,c=i+a,l=d(j=>(j*100).toFixed(0),"pp"),p=e.labeled.length,m=t.labeled.length,y=n.humanLabeledRuns??p+m,v=e.unlabeledJudge.length+p+t.unlabeledJudge.length+m,h={nAnchors:y,nAnchorsWith:p,nAnchorsWithout:m,pilotTarget:r,pilotMet:y>=r,targetEffect:o};if(v===0)return{...h,seDelta:null,mde:null,powered:!1,adequate:!1,reasons:["no graded runs to calibrate against"],additionalAnchorsNeeded:r};let f=_c(e,t,{minAnchors:s,z:i,withPooledRectifier:n.pool?.withPooledRectifier,withoutPooledRectifier:n.pool?.withoutPooledRectifier}).se,w=c*f,b=w<=o;if(n.pool){let{totalAnchors:j,targets:P}=n.pool,$=j>=r,H=P>=3,B=$&&H&&b,te=[];return H||te.push(`pool spans ${P}/3 same-judge targets \u2014 between-target variance is assumed, not measured`),$||te.push(`pool floor not met: ${j}/${r} human-labeled runs across the same-judge pool`),b||te.push(`MDE \xB1${l(w)}pp exceeds the \xB1${l(o)}pp target effect \u2014 pooling lowers the label cost, not this; more graded runs are needed (\xA76d(f))`),{...h,seDelta:f,mde:w,powered:b,adequate:B,reasons:te,additionalAnchorsNeeded:$?null:r-j,pooled:!0,poolAnchors:j,poolTargets:P}}let I=p>=s,S=m>=s,A=h.pilotMet&&I&&S&&b,E,R=0;if(!b){let j=(o/c)**2,P=tN([rI(e,t),rI(t,e)],j);R=P===null?null:2*P}if(!h.pilotMet)E=r-y;else if(R===null)E=null;else{let j=Math.max(0,s-p)+Math.max(0,s-m);E=Math.max(j,R)}let D=[];if(h.pilotMet||D.push(`pilot target not met: ${y}/${r} human-labeled runs`),I||D.push(`with-target cohort has ${p}/${s} labeled runs (minimum for a corrected estimate)`),S||D.push(`without-target cohort has ${m}/${s} labeled runs (minimum for a corrected estimate)`),!b){let j=R===null?" \u2014 anchors alone cannot reach it; more graded runs are needed":h.pilotMet&&R>0?` \u2014 ~${R} more labeled runs projected to reach it`:"";D.push(`MDE \xB1${l(w)}pp exceeds the \xB1${l(o)}pp target effect${j}`)}return{...h,seDelta:f,mde:w,powered:b,adequate:A,reasons:D,additionalAnchorsNeeded:E}}d(Ef,"anchorPowerCheck");function xf(e,t){return{rectifierUsed:e.rectifier,variance:e.variance,lambda:0,pooled:e.rectifier,pooledVariance:e.variance,tau2:0,i2:0,k:1,pooledApplied:!1,assumedExchangeability:!1,...t}}d(xf,"localOnly");function Hu(e,t,n={}){let r=n.maxI2??.6,o=[e,...t].filter(B=>B.n>=1&&Number.isFinite(B.variance)&&B.variance>=0),s=o.length;if(s<2)return e.n<1||!Number.isFinite(e.variance)?xf(e,{rectifierUsed:NaN,variance:1/0,reason:"no anchors on this target and none to pool from"}):xf(e,{reason:"only one target with anchors \u2014 nothing to pool"});let i=o.map(B=>B.variance).filter(B=>B>0),a=i.length?i.reduce((B,te)=>B+te,0)/i.length:0,c=Math.max(a*.001,1e-12),l=d(B=>Math.max(B,c),"flooredVar"),p=o.map(B=>1/l(B.variance)),m=p.reduce((B,te)=>B+te,0),y=p.reduce((B,te)=>B+te*te,0),v=o.reduce((B,te,_e)=>B+p[_e]*te.rectifier,0)/m,h=o.reduce((B,te,_e)=>B+p[_e]*(te.rectifier-v)**2,0),f=s-1,w=m-y/m,b=w>0?Math.max(0,(h-f)/w):0,I=h>0?Math.max(0,(h-f)/h):0,S=o.map(B=>1/(l(B.variance)+b)),A=S.reduce((B,te)=>B+te,0),E=o.reduce((B,te,_e)=>B+S[_e]*te.rectifier,0)/A,R=1/A,D=s<3;if(I>r)return e.n>=1&&Number.isFinite(e.variance)?xf(e,{pooled:E,pooledVariance:R,tau2:b,i2:I,k:s,assumedExchangeability:D,reason:`heterogeneity too high (I\xB2=${(I*100).toFixed(0)}%) \u2014 targets disagree; not pooling`}):{rectifierUsed:E,variance:R,lambda:1,pooled:E,pooledVariance:R,tau2:b,i2:I,k:s,pooledApplied:!1,assumedExchangeability:D,reason:`no anchors on this target; pooled estimate is high-heterogeneity (I\xB2=${(I*100).toFixed(0)}%) \u2014 treat as unknown`};let j=e.n<1||!Number.isFinite(e.variance),P=j?1:l(e.variance)/(l(e.variance)+b),$=j?E:P*E+(1-P)*e.rectifier,H=j?R+b:(1-P)*e.variance+P*P*R;return{rectifierUsed:$,variance:H,lambda:P,pooled:E,pooledVariance:R,tau2:b,i2:I,k:s,pooledApplied:!0,assumedExchangeability:D}}d(Hu,"shrinkRectifier");var fi=3,vc=7,Tf="(preamble)",iN=/^\s*(`{3,}|~{3,})/,aN=/^(#{1,6})\s+(.*)$/;function wc(e){let t=e.split(`
|
|
242
|
-
`),n=[],r=[],o={heading:"",level:0,path:[
|
|
243
|
-
`).trim()})},"flush");for(let
|
|
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,17 +163,22 @@ 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 (
|
|
167
|
+
SELECT 1 FROM instruction_suggestion_events ev
|
|
168
|
+
WHERE ev.suggestion_id = ${x.id}
|
|
169
|
+
AND ev.event_type = 'redundant'
|
|
170
|
+
AND ev.created_at > now() - interval '30 days'
|
|
171
|
+
)`,jn`NOT EXISTS (
|
|
253
172
|
SELECT 1 FROM instruction_experiments e
|
|
254
173
|
WHERE e.instruction_id = ${x.instructionId}
|
|
255
174
|
AND e.project_path = ${x.projectPath}
|
|
256
175
|
AND e.status = 'running'
|
|
257
|
-
)`)).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 (
|
|
258
177
|
SELECT 1 FROM instruction_experiments e
|
|
259
178
|
WHERE e.instruction_id = ${x.instructionId}
|
|
260
179
|
AND e.project_path = ${x.projectPath}
|
|
261
180
|
AND e.status = 'running'
|
|
262
|
-
)`)).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`(
|
|
263
182
|
SELECT count(*) FROM (
|
|
264
183
|
SELECT date_trunc('hour', min(e.created_at)) AS h
|
|
265
184
|
FROM instruction_suggestion_events e
|
|
@@ -274,7 +193,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
274
193
|
AND e.event_type IN ('surfaced', 'surfaced_with_content')
|
|
275
194
|
AND e.session_id IS NULL
|
|
276
195
|
) hours
|
|
277
|
-
)`,
|
|
196
|
+
)`,Sc=Pf`(${x.declinedAt} IS NULL OR ${x.declinedAt} < now() - make_interval(days => ${Dk}))`;async function Kd(e,t){await d.execute(Pf`
|
|
278
197
|
WITH over_budget AS (
|
|
279
198
|
SELECT instruction_suggestions.id
|
|
280
199
|
FROM instruction_suggestions
|
|
@@ -290,12 +209,12 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
290
209
|
AND instruction_suggestions.accepted_at IS NULL
|
|
291
210
|
AND (instruction_suggestions.dismissed_at IS NULL
|
|
292
211
|
OR instruction_suggestions.dismissed_at < now() - interval '30 days')
|
|
293
|
-
AND ${
|
|
212
|
+
AND ${Ck} >= ${Pk}
|
|
294
213
|
),
|
|
295
214
|
stamped AS (
|
|
296
215
|
UPDATE instruction_suggestions t
|
|
297
216
|
SET declined_at = now(),
|
|
298
|
-
declined_reason = ${
|
|
217
|
+
declined_reason = ${Ok}
|
|
299
218
|
FROM over_budget o
|
|
300
219
|
-- Re-checked here, not only in the CTE: under READ COMMITTED two
|
|
301
220
|
-- concurrent session starts both see declined_at IS NULL, and only
|
|
@@ -305,8 +224,8 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
305
224
|
RETURNING t.id, t.user_id, t.project_path
|
|
306
225
|
)
|
|
307
226
|
INSERT INTO instruction_suggestion_events (suggestion_id, user_id, event_type, project_path)
|
|
308
|
-
SELECT id, user_id, ${
|
|
309
|
-
`)}d(Ku,"sweepDeclinedBySilence");var $f=new jN,AI=2e3,NN=4,PN={"session-start":{add:3,remove:2,trim:1}},CN=["add","remove","trim"];function Lf(e){return e.length<=AI?e:e.slice(0,AI)+"... [truncated]"}d(Lf,"truncateContent");$f.get("/instruction-suggestions",async e=>{let t=e.get("userId"),n=e.req.query("projectId"),r=e.req.query("projectPath"),o=Number(e.req.query("limit")??"5"),s=Math.min(Math.max(o,1),10),i=e.req.query("includeContent")==="true",a=e.req.query("groupByKind")==="true",c=e.req.query("renderFor"),l=c?PN[c]:void 0;if(c&&!l)return e.json({error:`unknown renderFor: ${c}`},400);let p=a||l!==void 0;if(!n&&!r)return e.json({error:"projectId or projectPath is required"},400);let m=n?Wt(x.projectId,n):Wt(x.projectPath,r);try{await Ku(t,ur`${m}`)}catch{}let y=await u.select({id:x.id,instructionId:x.instructionId,score:x.score,reason:x.reason,generatedAt:x.generatedAt,isStale:x.isStale,kind:x.kind,name:g.name,description:g.description,tags:g.tags,instructionScope:g.scope,estimatedTokens:ur`(length(${g.content}) / 4)::int`,_rawContent:g.content}).from(x).innerJoin(g,Wt(x.instructionId,g.id)).where(ps(Wt(x.userId,t),m,Wt(g.archived,!1),ur`${x.acceptedAt} IS NULL`,ur`(${x.dismissedAt} IS NULL OR ${x.dismissedAt} < now() - interval '30 days')`,Ac)).orderBy(bI(x.isStale),SI(x.score)).limit(s),v=[];if(p){let ee=new Set(y.map(N=>N.id));v=(await u.select({id:x.id,instructionId:x.instructionId,score:x.score,reason:x.reason,generatedAt:x.generatedAt,isStale:x.isStale,kind:x.kind,name:g.name,description:g.description,tags:g.tags,instructionScope:g.scope,estimatedTokens:ur`(length(${g.content}) / 4)::int`,_rawContent:g.content}).from(x).innerJoin(g,Wt(x.instructionId,g.id)).where(ps(Wt(x.userId,t),m,ur`${x.kind} <> 'add'`,Wt(g.archived,!1),ur`${x.acceptedAt} IS NULL`,ur`(${x.dismissedAt} IS NULL OR ${x.dismissedAt} < now() - interval '30 days')`,Ac)).orderBy(bI(x.isStale),SI(x.score)).limit(NN)).filter(N=>!ee.has(N.id))}let h=i?await Gu(t):wi,f=[...y,...v].map(ee=>{let{_rawContent:Re,...N}=ee,me=i&&ee.kind==="add"&&ee.score>=h&&typeof Re=="string"?Lf(Re):null;return{...N,content:me}}),w=l?await vI({userId:t,projectPath:r??"",externalSessionId:e.req.query("sessionId")||void 0}):[],b=II(w),I=l?await Pf(t,r??""):[],S=new Set(I.filter(ee=>ee.decision==="never").map(ee=>ee.instructionId)),A=I.filter(ee=>ee.decision==="always"),E=new Set(I.map(ee=>ee.instructionId)),R=w.filter(ee=>ee.arm==="treated"),D=new Set(w.map(ee=>ee.instructionId)),j=b.size===0&&E.size===0&&D.size===0?f:f.filter(ee=>!b.has(ee.instructionId)&&!E.has(ee.instructionId)&&!D.has(ee.instructionId)),P=j,$;if(l){let ee=new Map;for(let N of j){let me=N.kind??"add",M=l[me];if(M===void 0||M<=0)continue;let ue=ee.get(me)??[];ue.length>=M||(ue.push(N),ee.set(me,ue))}let Re=ee.get("add")??[];if(R.length>0){let N=new Map(R.map(M=>[M.instructionId,M.experimentId])),me=await u.select({id:g.id,name:g.name,description:g.description,tags:g.tags,instructionScope:g.scope,content:g.content}).from(g).where(ps(Yu(g.id,R.map(M=>M.instructionId)),Wt(g.archived,!1)));for(let M of me.reverse())Re.unshift({id:`experiment:${N.get(M.id)}`,instructionId:M.id,score:1,reason:"under measurement on this project",generatedAt:new Date,isStale:!1,kind:"add",name:M.name,description:M.description,tags:M.tags,instructionScope:M.instructionScope,estimatedTokens:Math.ceil((M.content?.length??0)/4),content:i?Lf(M.content??""):null});ee.set("add",Re)}if(A.length>0){let N=await u.select({id:g.id,name:g.name,description:g.description,tags:g.tags,instructionScope:g.scope,content:g.content}).from(g).where(ps(Yu(g.id,A.map(me=>me.instructionId)),Wt(g.archived,!1)));for(let me of N.reverse())Re.unshift({id:`graduated:${me.id}`,instructionId:me.id,score:1,reason:"graduated: measured to help on this project",generatedAt:new Date,isStale:!1,kind:"add",name:me.name,description:me.description,tags:me.tags,instructionScope:me.instructionScope,estimatedTokens:Math.ceil((me.content?.length??0)/4),content:i?Lf(me.content??""):null});ee.set("add",Re)}P=CN.flatMap(N=>ee.get(N)??[]),$={addCount:Re.length,costCount:(ee.get("remove")??[]).length+(ee.get("trim")??[]).length,highConfidenceCount:Re.filter(N=>N.content!==null).length,omitted:j.length-(P.length-Re.filter(N=>N.id.startsWith("graduated:")||N.id.startsWith("experiment:")).length),...b.size>0?{withheld:b.size}:{}}}let H=await u.select({eventType:tt.eventType,count:ur`count(*)::int`}).from(tt).innerJoin(x,Wt(tt.suggestionId,x.id)).where(ps(Wt(tt.userId,t),m)).groupBy(tt.eventType),B={};for(let ee of H)B[ee.eventType]=ee.count;let te,_e;if(!l&&r&&P.length>0){let ee=[...new Set(P.map(M=>M.instructionId))],Re=await u.select({id:q.id,instructionId:q.instructionId,source:q.source}).from(q).where(ps(Wt(q.userId,t),Wt(q.projectPath,r),Wt(q.status,"running"),Yu(q.instructionId,ee)));Re.length>0&&(te=Object.fromEntries(Re.map(M=>[M.instructionId,{id:M.id,source:M.source}])));let N=await u.select({instructionId:Y.instructionId,contentHash:Y.contentHash,projectPath:Y.projectPath,decision:Y.decision,delta:Y.delta,ciLower:Y.ciLower,ciUpper:Y.ciUpper,nTreated:Y.nTreated,nControl:Y.nControl,segment:Y.segment,decidedAt:Y.decidedAt,liveContent:g.content,liveName:g.name}).from(Y).innerJoin(g,Wt(Y.instructionId,g.id)).where(ps(Wt(Y.userId,t),Yu(Y.instructionId,ee),ur`${Y.projectPath} <> ${r}`)),me={};for(let M of N){let ue=Ur(M.liveContent,M.liveName);ue===null||ue!==M.contentHash||(me[M.instructionId]??=[]).push({projectPath:M.projectPath,decision:M.decision,delta:M.delta,ciLower:M.ciLower,ciUpper:M.ciUpper,nTreated:M.nTreated,nControl:M.nControl,segment:M.segment,decidedAt:M.decidedAt})}Object.keys(me).length>0&&(_e=me)}return e.json({suggestions:P,stats:B,...$?{render:$}:{},...te?{experiments:te}:{},..._e?{crossProject:_e}:{}})});O();import{Hono as ON}from"hono";import{z as EI}from"zod";import{eq as ms,and as xI,desc as DN,sql as dn}from"drizzle-orm";var MN=EI.object({threshold:EI.number().min(0).max(1)}),fs=new ON;fs.get("/instruction-suggestions/pending-count",async e=>{let t=e.get("userId"),n=await u.select({projectPath:x.projectPath,count:dn`count(*)::int`}).from(x).where(xI(ms(x.userId,t),dn`${x.acceptedAt} IS NULL`,dn`(${x.dismissedAt} IS NULL OR ${x.dismissedAt} < now() - interval '30 days')`,Ac)).groupBy(x.projectPath).orderBy(DN(dn`count(*)`)),r=n.reduce((o,s)=>o+s.count,0);return e.json({total:r,byProject:n.slice(0,5)})});fs.get("/instruction-suggestions/stats",async e=>{let t=e.get("userId"),[n]=await u.select({total:dn`count(*)::int`,accepted:dn`count(*) filter (where ${x.acceptedAt} is not null)::int`,dismissed:dn`count(*) filter (where ${x.acceptedAt} is null and ${x.dismissedAt} is not null)::int`,declinedBySilence:dn`count(*) filter (where ${x.acceptedAt} is null and ${x.dismissedAt} is null and ${x.declinedAt} is not null)::int`,pending:dn`count(*) filter (where ${x.acceptedAt} is null and ${x.dismissedAt} is null and ${x.declinedAt} is null)::int`,stale:dn`count(*) filter (where ${x.isStale})::int`,promoted:dn`count(*) filter (where ${x.promotedToInstructionId} is not null)::int`}).from(x).where(ms(x.userId,t)),r=await u.select({eventType:tt.eventType,count:dn`count(*)::int`}).from(tt).where(ms(tt.userId,t)).groupBy(tt.eventType),o={surfaced:0,surfaced_with_content:0,accepted:0,dismissed:0,promoted:0,proxy_injected:0,[Mf]:0};for(let c of r)o[c.eventType]=c.count;let[s]=await u.select({distinctUsersWithSuggestions:dn`count(distinct ${x.userId})::int`}).from(x),i=o.surfaced+o.surfaced_with_content,a=o.accepted+o.dismissed;return e.json({suggestions:n,events:o,funnel:{surfaced:i,acted:a,adoptionRate:i>0?a/i:0},denominator:{distinctUsersWithSuggestions:s?.distinctUsersWithSuggestions??0,scope:"global"}})});fs.get("/instruction-suggestions/confidence",async e=>{let t=e.get("userId");return e.json({threshold:await Gu(t),default:wi,governs:"Minimum score at which an add-suggestion carries its instruction body into session context. Surfacing only \u2014 never a write."})});fs.put("/instruction-suggestions/confidence",async e=>{let t=e.get("userId"),n=MN.safeParse(await e.req.json().catch(()=>null));return n.success?(await u.update(T).set({suggestionConfidenceThreshold:n.data.threshold}).where(ms(T.id,t)),e.json({threshold:n.data.threshold})):e.json({error:"threshold must be a number between 0 and 1"},400)});fs.get("/instruction-suggestions/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:x.id,instructionId:x.instructionId,projectPath:x.projectPath,score:x.score,reason:x.reason,generatedAt:x.generatedAt,isStale:x.isStale,kind:x.kind,estimatedTokens:dn`(length(${g.content}) / 4)::int`,dismissedAt:x.dismissedAt,acceptedAt:x.acceptedAt,name:g.name,description:g.description,tags:g.tags,instructionScope:g.scope}).from(x).innerJoin(g,ms(x.instructionId,g.id)).where(xI(ms(x.id,n),ms(x.userId,t)));return r?e.json(r):e.json({error:"Suggestion not found"},404)});O();import{Hono as LN}from"hono";import{z as Yt}from"zod";import{eq as lr,and as TI,or as $N,desc as qN,sql as vi}from"drizzle-orm";var Ec=new LN,UN=Yt.object({projectPath:Yt.string().min(1),projectId:Yt.string().uuid().optional(),suggestions:Yt.array(Yt.object({instructionId:Yt.string().uuid(),score:Yt.number().min(0).max(1),reason:Yt.string(),kind:Yt.enum(su).optional()})).max(50)});async function HN(e){try{let[t]=await u.select({projectId:le.projectId}).from(le).where(lr(le.path,e)).orderBy(qN(le.lastSeen)).limit(1);return t?.projectId??null}catch{return null}}d(HN,"resolveProjectId");Ec.post("/instruction-suggestions/batch-upsert",async e=>{let t=e.get("userId"),n=UN.parse(await e.req.json());if(n.suggestions.length===0)return e.json({inserted:0});let r=n.projectId??await HN(n.projectPath),o=n.suggestions.map(s=>({userId:t,instructionId:s.instructionId,projectPath:n.projectPath,projectId:r,score:s.score,reason:s.reason,kind:s.kind??"add",generatedAt:new Date,isStale:!1}));return await u.insert(x).values(o).onConflictDoUpdate({target:[x.userId,x.projectPath,x.instructionId,x.kind],set:{score:vi`excluded.score`,reason:vi`excluded.reason`,generatedAt:vi`excluded.generated_at`,isStale:vi`false`,dismissedAt:vi`CASE WHEN ${x.dismissedAt} IS NOT NULL AND ${x.dismissedAt} >= now() - interval '30 days' THEN ${x.dismissedAt} ELSE NULL END`}}),e.json({inserted:o.length})});Ec.post("/instruction-suggestions/mark-stale",async e=>{let t=e.get("userId");return await u.update(x).set({isStale:!0}).where(lr(x.userId,t)),e.json({ok:!0})});var BN=Yt.object({eventType:Yt.enum(["surfaced","surfaced_with_content","accepted","dismissed","promoted","proxy_injected"]),tool:Yt.string().optional(),sessionId:Yt.string().uuid().optional(),projectPath:Yt.string().min(1),instructionId:Yt.string().uuid().optional(),actor:Yt.enum(["human","auto"]).default("human")});Ec.post("/instruction-suggestions/:id/events",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=BN.parse(await e.req.json()),[o]=await u.select().from(x).where(TI(lr(x.id,n),lr(x.userId,t)));if(!o)return e.json({error:"Suggestion not found"},404);let s=r.eventType==="accepted"||r.eventType==="promoted",i=o.instructionId;if(s&&r.instructionId){let[a]=await u.select({id:g.id}).from(g).where(TI(lr(g.id,r.instructionId),$N(lr(g.createdBy,t),lr(g.scope,"public")))).limit(1);if(!a)return e.json({error:"instructionId not found",code:"INVALID_INSTRUCTION"},400);i=a.id}if(await u.insert(tt).values({suggestionId:n,userId:t,eventType:r.eventType,tool:r.tool??null,sessionId:r.sessionId??null,projectPath:r.projectPath,actor:r.actor}),s)await u.update(x).set({acceptedAt:new Date,promotedToInstructionId:i}).where(lr(x.id,n));else if(r.eventType==="dismissed")await u.update(x).set({dismissedAt:new Date}).where(lr(x.id,n));else if(r.eventType==="surfaced"||r.eventType==="surfaced_with_content")try{await Ku(t,vi`${lr(x.id,n)}`)}catch{}return e.json({ok:!0})});O();import{Hono as zN}from"hono";import{z as xc}from"zod";import{eq as Ii,and as kI,desc as jI,sql as Qu}from"drizzle-orm";ls();O();ls();import{randomUUID as FN}from"node:crypto";import{and as Xu,eq as bn,sql as qf}from"drizzle-orm";var WN=.8;async function RI(e){let{userId:t,instructionId:n,projectPath:r,source:o}=e,s=e.treatedShare??.5,[i]=await u.select({id:g.id,name:g.name,content:g.content,archived:g.archived,scope:g.scope,createdBy:g.createdBy}).from(g).where(bn(g.id,n));if(!i||i.createdBy!==t&&i.scope!=="public")return{ok:!1,code:"not_found",reason:"instruction not found"};if(i.archived)return{ok:!1,code:"archived",reason:"instruction is archived"};let a=Ur(i.content,i.name);if(!a)return{ok:!1,code:"no_body",reason:"instruction body could not be extracted from its content"};let[c]=await u.select({id:Y.id}).from(Y).where(Xu(bn(Y.instructionId,n),bn(Y.contentHash,a),bn(Y.projectPath,r)));if(c)return{ok:!1,code:"already_decided",reason:"this exact content already has a verdict on this project \u2014 edit the instruction to re-enter testing"};if(o==="groom"){let[p]=await u.select({id:x.id}).from(x).where(Xu(bn(x.userId,t),bn(x.instructionId,n),bn(x.projectPath,r),qf`${x.acceptedAt} IS NULL`,qf`${x.dismissedAt} IS NULL`,qf`${x.score} >= ${WN}`));if(!p)return{ok:!1,code:"not_injectable",reason:"not delivered by injection on this project (accepted into a file, or no renderable proposal) \u2014 withholding would measure nothing"}}let[l]=await u.select({id:q.id}).from(q).where(Xu(bn(q.instructionId,n),bn(q.projectPath,r),bn(q.status,"running")));if(l)return{ok:!0,experimentId:l.id,existing:!0};try{let[p]=await u.insert(q).values({userId:t,instructionId:n,projectPath:r,status:"running",treatedShare:String(s),salt:FN(),contentHash:a,source:o}).returning({id:q.id});return{ok:!0,experimentId:p.id,existing:!1}}catch(p){let[m]=await u.select({id:q.id}).from(q).where(Xu(bn(q.instructionId,n),bn(q.projectPath,r),bn(q.status,"running")));if(m)return{ok:!0,experimentId:m.id,existing:!0};throw p}}d(RI,"nominateExperiment");var bi=new zN;bi.get("/instruction-experiments",async e=>{let t=e.get("userId"),n=e.req.query("projectPath"),r=Math.min(Math.max(Number(e.req.query("limit"))||50,1),200),o=kI(Ii(q.userId,t),n?Ii(q.projectPath,n):Qu`true`),s=await u.select({id:q.id,instructionId:q.instructionId,instructionName:g.name,projectPath:q.projectPath,status:q.status,source:q.source,instructionSource:Qu`${g.frontmatter}->>'source'`,stoppedReason:q.stoppedReason,createdAt:q.createdAt}).from(q).innerJoin(g,Ii(q.instructionId,g.id)).where(o).orderBy(jI(q.createdAt)).limit(r),[{total:i}]=await u.select({total:Qu`count(*)::int`}).from(q).where(o),a=await Promise.all(s.map(async l=>{let p=await bc(l.id,t),m=l.status,y=l.stoppedReason;if(p&&l.status==="running")try{let v=await gi({experimentId:l.id,userId:t,verdict:p,source:l.source,status:l.status});v&&(m="stopped",y=v)}catch{}return{...l,status:m,stoppedReason:y,verdict:p}})),c=await zu(a.map(l=>l.id));return e.json({experiments:a.map(l=>({...l,graduation:c.get(l.id)??null})),total:i})});var VN=xc.object({instructionId:xc.string().uuid(),projectPath:xc.string().min(1),source:xc.enum(["manual","groom","trial","borrow"]).default("manual"),treatedShare:xc.number().gt(0).lt(1).optional()});bi.post("/instruction-experiments",async e=>{let t=e.get("userId"),n=VN.safeParse(await e.req.json().catch(()=>({})));if(!n.success)return e.json({error:n.error.flatten()},400);let r=await RI({userId:t,...n.data});if(!r.ok){let o={not_found:404,archived:400,no_body:400,already_decided:409,not_injectable:409};return e.json({error:r.reason,code:r.code},o[r.code])}return e.json({experimentId:r.experimentId,existing:r.existing},r.existing?200:201)});bi.get("/instruction-experiments/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await bc(n,t);if(!r)return e.json({error:"not found"},404);try{let[s]=await u.select({source:q.source,status:q.status}).from(q).where(Ii(q.id,n));s&&await gi({experimentId:n,userId:t,verdict:r,source:s.source,status:s.status})}catch{}let o=await zu([n]);return e.json({verdict:r,graduation:o.get(n)??null})});bi.get("/instruction-verdicts",async e=>{let t=e.get("userId"),n=e.req.query("instructionId"),r=await u.select({id:Y.id,instructionId:Y.instructionId,contentHash:Y.contentHash,projectPath:Y.projectPath,decision:Y.decision,delta:Y.delta,ciLower:Y.ciLower,ciUpper:Y.ciUpper,nTreated:Y.nTreated,nControl:Y.nControl,decidedAt:Y.decidedAt}).from(Y).where(kI(Ii(Y.userId,t),n?Ii(Y.instructionId,n):Qu`true`)).orderBy(jI(Y.decidedAt)).limit(50);return e.json({verdicts:r,total:r.length})});var ho=new JN;ho.route("/",yi);ho.route("/",$f);ho.route("/",fs);ho.route("/",Ec);ho.route("/",bi);import{Hono as iO}from"hono";import{Hono as MC}from"hono";O();import{Hono as nP}from"hono";import{z as jn}from"zod";import{eq as Lt,and as xi,desc as $I,sql as pr,or as qI,gte as rP,ne as oP}from"drizzle-orm";function NI(e){if(!e||typeof e!="string")return null;let t=e.trim();if(!t)return null;if(!t.includes("://")&&!/^([\w.-]+@)?[\w.-]+:[^/]/.test(t)&&/^[\w.-]+(\.[\w.-]+)+\//.test(t)){let a=t.replace(/\.git$/i,"").replace(/\/+$/,""),c=a.indexOf("/"),l=a.slice(0,c).toLowerCase(),p=a.slice(c+1);return p?`${l}/${p}`:null}let n=t,r=/^([\w.-]+@)?([\w.-]+):([^/].*)$/.exec(t);if(r&&!t.includes("://")){let[,,a,c]=r;n=`ssh://${a}/${c}`}let o;try{o=new URL(n)}catch{return null}let s=o.hostname.toLowerCase();if(!s)return null;let i=o.pathname.replace(/^\/+|\/+$/g,"");return!i||(i=i.replace(/\.git$/i,""),!i)?null:`${s}/${i}`}d(NI,"canonicalizeRemote");var GN=new Set(["","unknown","<synthetic>"]);function gs(e){if(typeof e!="string")return null;let t=e.trim();return GN.has(t)?null:t}d(gs,"resolveModelId");var KN=["claudeCodeVersion","codexCliVersion"];function Si(e){if(typeof e!="object"||e===null)return null;let t=e;for(let n of KN){let r=gs(t[n]);if(r!==null)return r}return null}d(Si,"resolveHarnessVersion");O();import{eq as Uf,and as QN,sql as LI}from"drizzle-orm";O();import{randomUUID as Ai}from"node:crypto";import{eq as Mt,and as Tc,gt as YN,sql as PI}from"drizzle-orm";var XN=6e4;async function Ei(e){try{let t=new Date(Date.now()-XN),[n]=await u.select({exists:PI`1`}).from(fe).where(Tc(Mt(fe.userId,e),Mt(fe.workerType,"cli-worker"),YN(fe.lastHeartbeat,t))).limit(1);return n!==void 0}catch(t){return console.warn("[enqueueJob] hasLiveWorker check failed; skipping warning:",t instanceof Error?t.message:t),!0}}d(Ei,"hasLiveWorker");async function Rt(e){let t=!await Ei(e.userId),n=Ai(),r={...e.payload,mirrorId:n};switch(e.taskName){case"process_eval":case"process_conversation":{await u.insert(ke).values({...e.mirror,id:n,status:"pending",taskKind:e.taskName,payload:r});break}case"process_insights":{await u.insert(W).values({...e.mirror,id:n,status:"pending",taskKind:e.taskName,payload:r});break}case"process_launch":{await u.insert(ce).values({...e.mirror,id:n,status:"pending",taskKind:e.taskName,payload:r,...e.runId?{runId:e.runId}:{}});break}case"process_send_message":{await u.insert(Wd).values({...e.mirror,id:n,status:"pending",taskKind:e.taskName,payload:r});break}}return{id:n,noLiveWorker:t}}d(Rt,"enqueueJob");async function Zu(e){let t=`goal-${e.sessionId}-${e.milestone}`,[n]=await u.select({id:je.id}).from(je).where(Tc(Mt(je.userId,e.userId),Mt(je.taskKind,"process_session_goal"),Mt(je.dedupeKey,t),Mt(je.status,"pending"))).limit(1);if(n)return;let r=Ai();await u.insert(je).values({id:r,userId:e.userId,taskKind:"process_session_goal",payload:{sessionId:e.sessionId,milestone:e.milestone,mirrorId:r},dedupeKey:t})}d(Zu,"enqueueSessionGoalJob");async function CI(e){let t=`distill-${e.sessionId}`,[n]=await u.select({id:je.id}).from(je).where(Tc(Mt(je.userId,e.userId),Mt(je.taskKind,"distill_memories"),Mt(je.dedupeKey,t),Mt(je.status,"pending"))).limit(1);if(n)return;let r=Ai();await u.insert(je).values({id:r,userId:e.userId,taskKind:"distill_memories",payload:{sessionId:e.sessionId,mirrorId:r},dedupeKey:t})}d(CI,"enqueueDistillMemoriesJob");async function OI(e){let t=!await Ei(e.userId),n=`run-cleanup:${e.runId}`,[r]=await u.select({id:je.id}).from(je).where(Tc(Mt(je.userId,e.userId),Mt(je.taskKind,"process_run_cleanup"),Mt(je.dedupeKey,n),Mt(je.status,"pending"))).limit(1);if(r)return{jobId:r.id,noLiveWorker:t};let o=Ai();return await u.insert(je).values({id:o,userId:e.userId,taskKind:"process_run_cleanup",payload:{runId:e.runId,mirrorId:o},dedupeKey:n}),{jobId:o,noLiveWorker:t}}d(OI,"enqueueRunCleanupJob");async function DI(e){let t=`judge-review:${e.evalTargetId}`,n=Ai();await u.execute(PI`
|
|
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`
|
|
310
229
|
INSERT INTO agent_jobs (id, user_id, task_kind, payload, dedupe_key)
|
|
311
230
|
SELECT ${n}, ${e.userId}, 'process_judge_review',
|
|
312
231
|
${JSON.stringify({evalTargetId:e.evalTargetId,mirrorId:n})}::jsonb,
|
|
@@ -318,7 +237,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
318
237
|
AND dedupe_key = ${t}
|
|
319
238
|
AND status = 'pending'
|
|
320
239
|
)
|
|
321
|
-
`)}
|
|
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`
|
|
322
241
|
insert into treatment_exposures
|
|
323
242
|
(session_id, user_id, treatment_type, treatment_id, treatment_version, method, exposed_at)
|
|
324
243
|
select ${e}::uuid, ${t}::uuid, 'suggestion', s.instruction_id, 1, 'injected', min(ise.created_at)
|
|
@@ -328,7 +247,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
328
247
|
and ise.event_type in ('surfaced', 'surfaced_with_content', 'proxy_injected')
|
|
329
248
|
group by s.instruction_id
|
|
330
249
|
on conflict on constraint treatment_exposures_unique do nothing
|
|
331
|
-
`)}catch(r){console.warn("[reimport] suggestion exposure reconcile failed:",r instanceof Error?r.message:r)}}
|
|
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`
|
|
332
251
|
with drained as (
|
|
333
252
|
insert into treatment_exposures
|
|
334
253
|
(session_id, user_id, treatment_type, treatment_id, treatment_version, method, exposed_at)
|
|
@@ -343,13 +262,13 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
343
262
|
delete from pending_treatment_exposures
|
|
344
263
|
where external_session_id = ${n}
|
|
345
264
|
and user_id = ${t}::uuid
|
|
346
|
-
`)}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`
|
|
347
266
|
WITH base AS (
|
|
348
267
|
SELECT COALESCE(MAX(sequence), 0) AS seq
|
|
349
268
|
FROM session_events WHERE session_id = ${e}
|
|
350
269
|
),
|
|
351
270
|
vals (rn, explicit_seq, event_type, content, tool_name, tool_input, tool_output, token_usage, model, ts, metadata) AS (
|
|
352
|
-
VALUES ${
|
|
271
|
+
VALUES ${Dn.join(s,Dn`, `)}
|
|
353
272
|
),
|
|
354
273
|
ins AS (
|
|
355
274
|
INSERT INTO session_events (id, session_id, sequence, event_type, content, tool_name, tool_input, tool_output, token_usage, model, timestamp, metadata)
|
|
@@ -370,7 +289,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
370
289
|
)
|
|
371
290
|
SELECT (SELECT COUNT(*)::int FROM ins) AS inserted,
|
|
372
291
|
(SELECT event_count FROM upd) AS new_count
|
|
373
|
-
`))[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`
|
|
374
293
|
WITH ins AS (
|
|
375
294
|
INSERT INTO session_events (id, session_id, sequence, event_type, content, tool_name, tool_input, tool_output, token_usage, model, timestamp, metadata)
|
|
376
295
|
SELECT
|
|
@@ -380,12 +299,12 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
380
299
|
${o.eventType},
|
|
381
300
|
${o.content??null},
|
|
382
301
|
${o.toolName??null},
|
|
383
|
-
${
|
|
384
|
-
${l==null?
|
|
385
|
-
${
|
|
302
|
+
${a==null?pr`NULL`:pr`${a}::jsonb`},
|
|
303
|
+
${l==null?pr`NULL`:pr`${l}::jsonb`},
|
|
304
|
+
${p==null?pr`NULL`:pr`${p}::jsonb`},
|
|
386
305
|
${o.model??null},
|
|
387
306
|
${new Date(o.timestamp).toISOString()}::timestamptz,
|
|
388
|
-
${
|
|
307
|
+
${pr`${m}::jsonb`}
|
|
389
308
|
RETURNING sequence
|
|
390
309
|
),
|
|
391
310
|
upd AS (
|
|
@@ -395,13 +314,13 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
395
314
|
RETURNING id
|
|
396
315
|
)
|
|
397
316
|
SELECT ins.sequence FROM ins, upd
|
|
398
|
-
`))[0]?.sequence??
|
|
399
|
-
`)}
|
|
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`
|
|
400
319
|
SELECT session_id, MAX(timestamp) AS last_at
|
|
401
320
|
FROM session_events
|
|
402
|
-
WHERE session_id IN (${
|
|
321
|
+
WHERE session_id IN (${qe.join(w.map(j=>qe`${j}`),qe`, `)})
|
|
403
322
|
GROUP BY session_id
|
|
404
|
-
`),
|
|
323
|
+
`),d.execute(qe`
|
|
405
324
|
SELECT DISTINCT ON (e.session_id)
|
|
406
325
|
e.session_id,
|
|
407
326
|
-- Collapse whitespace runs into a single space for preview rendering.
|
|
@@ -411,27 +330,27 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
411
330
|
-- lowercase s from every preview ever shown.
|
|
412
331
|
LEFT(REGEXP_REPLACE(COALESCE(e.content, ''), '[[:space:]]+', ' ', 'g'), 120) AS preview
|
|
413
332
|
FROM session_events e
|
|
414
|
-
WHERE e.session_id IN (${
|
|
333
|
+
WHERE e.session_id IN (${qe.join(w.map(j=>qe`${j}`),qe`, `)})
|
|
415
334
|
AND e.event_type IN ('user_message', 'human')
|
|
416
335
|
AND e.content IS NOT NULL
|
|
417
336
|
AND e.content <> ''
|
|
418
337
|
ORDER BY e.session_id, e.timestamp DESC
|
|
419
|
-
`),
|
|
338
|
+
`),d.execute(qe`
|
|
420
339
|
SELECT DISTINCT ON (e.session_id)
|
|
421
340
|
e.session_id,
|
|
422
341
|
LEFT(REGEXP_REPLACE(COALESCE(e.content, ''), '[[:space:]]+', ' ', 'g'), 240) AS first_prompt
|
|
423
342
|
FROM session_events e
|
|
424
|
-
WHERE e.session_id IN (${
|
|
343
|
+
WHERE e.session_id IN (${qe.join(w.map(j=>qe`${j}`),qe`, `)})
|
|
425
344
|
AND e.event_type IN ('user_message', 'human')
|
|
426
345
|
AND e.content IS NOT NULL
|
|
427
346
|
AND e.content <> ''
|
|
428
347
|
ORDER BY e.session_id, e.timestamp ASC
|
|
429
|
-
`),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`
|
|
430
349
|
SELECT DISTINCT ON (project_id) project_id, path
|
|
431
350
|
FROM project_checkouts
|
|
432
|
-
WHERE project_id IN (${
|
|
351
|
+
WHERE project_id IN (${qe.join(b.map(j=>qe`${j}`),qe`, `)})
|
|
433
352
|
ORDER BY project_id, is_worktree ASC, last_seen DESC
|
|
434
|
-
`):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`
|
|
435
354
|
WITH recent AS (
|
|
436
355
|
SELECT
|
|
437
356
|
s.project_id,
|
|
@@ -487,14 +406,14 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
487
406
|
) deduped
|
|
488
407
|
ORDER BY last_activity DESC
|
|
489
408
|
LIMIT ${o}
|
|
490
|
-
`),
|
|
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`
|
|
491
410
|
UPDATE sessions
|
|
492
411
|
SET analyzed_at = started_at
|
|
493
412
|
WHERE user_id = ${t}
|
|
494
413
|
AND analysis IS NOT NULL
|
|
495
414
|
AND analyzed_at IS NULL
|
|
496
415
|
RETURNING id
|
|
497
|
-
`);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`
|
|
498
417
|
WITH usage_rows AS (
|
|
499
418
|
SELECT DISTINCT ON (coalesce(metadata->>'requestId', id::text))
|
|
500
419
|
coalesce(
|
|
@@ -529,15 +448,15 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
529
448
|
(SELECT max(timestamp) FROM session_events WHERE session_id = ${n}) AS last_ts,
|
|
530
449
|
(SELECT coalesce(sum(input_tokens), 0)::bigint FROM usage_rows) AS input_tokens,
|
|
531
450
|
(SELECT coalesce(sum(output_tokens), 0)::bigint FROM usage_rows) AS output_tokens
|
|
532
|
-
`);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`
|
|
533
452
|
SELECT coalesce(tool_name, 'unknown') AS tool, count(*)::int AS n
|
|
534
453
|
FROM session_events
|
|
535
454
|
WHERE session_id = ${n}
|
|
536
455
|
AND event_type IN ('tool_call', 'tool_use')
|
|
537
456
|
GROUP BY 1
|
|
538
|
-
`),h={};for(let
|
|
539
|
-
ELSE length(${
|
|
540
|
-
+ 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`
|
|
541
460
|
WITH tool_events AS (
|
|
542
461
|
SELECT
|
|
543
462
|
tool_name,
|
|
@@ -585,7 +504,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
585
504
|
count(*) FILTER (
|
|
586
505
|
WHERE jsonb_typeof(tool_output) = 'object' AND tool_output ? 'error')::int AS tool_errors
|
|
587
506
|
FROM tool_events
|
|
588
|
-
`),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`
|
|
589
508
|
SELECT DISTINCT coalesce(tool_input->>'file_path', tool_input->>'notebook_path') AS path
|
|
590
509
|
FROM session_events
|
|
591
510
|
WHERE session_id = ${n}
|
|
@@ -593,7 +512,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
593
512
|
AND tool_name IN ('Edit','MultiEdit','Write','NotebookEdit')
|
|
594
513
|
AND jsonb_typeof(tool_input) = 'object'
|
|
595
514
|
AND coalesce(tool_input->>'file_path', tool_input->>'notebook_path') IS NOT NULL
|
|
596
|
-
`),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`
|
|
597
516
|
insert into instruction_version_identities
|
|
598
517
|
(instruction_id, content_hash, version_ordinal, content, first_seen_at, last_seen_at)
|
|
599
518
|
select
|
|
@@ -615,8 +534,8 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
615
534
|
first_seen_at = least(
|
|
616
535
|
instruction_version_identities.first_seen_at, excluded.first_seen_at),
|
|
617
536
|
content = coalesce(instruction_version_identities.content, excluded.content)
|
|
618
|
-
`);return}catch(i){if(i.cause?.code==="23505"&&s<4)continue;console.warn(`[link-instructions] version identity registration failed for ${e}:`,i instanceof Error?i.message:i);return}}
|
|
619
|
-
`):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`
|
|
620
539
|
WITH session_activity AS (
|
|
621
540
|
SELECT
|
|
622
541
|
s.id,
|
|
@@ -636,7 +555,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
636
555
|
project_id,
|
|
637
556
|
COUNT(*)::int AS session_count,
|
|
638
557
|
COUNT(*) FILTER (
|
|
639
|
-
WHERE ended_at IS NULL AND last_at >= now() - ${
|
|
558
|
+
WHERE ended_at IS NULL AND last_at >= now() - ${qi.raw(ab)}
|
|
640
559
|
)::int AS active_session_count,
|
|
641
560
|
MAX(last_at) AS last_activity_at
|
|
642
561
|
FROM session_activity
|
|
@@ -662,18 +581,18 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
662
581
|
JOIN projects p ON p.id = pa.project_id
|
|
663
582
|
ORDER BY pa.last_activity_at DESC NULLS LAST, p.created_at DESC
|
|
664
583
|
LIMIT ${n} OFFSET ${r}
|
|
665
|
-
`),[{count:i}={count:0}]=await
|
|
584
|
+
`),[{count:i}={count:0}]=await d.execute(qi`
|
|
666
585
|
SELECT COUNT(DISTINCT s.project_id)::int AS count
|
|
667
586
|
FROM sessions s
|
|
668
587
|
WHERE s.org_id = ${o}
|
|
669
588
|
AND s.origin <> 'internal_worker'
|
|
670
589
|
AND s.project_id IS NOT NULL
|
|
671
|
-
`);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`
|
|
672
591
|
SELECT EXISTS(
|
|
673
592
|
SELECT 1 FROM sessions
|
|
674
593
|
WHERE project_id = ${n} AND org_id = ${r} AND origin <> 'internal_worker'
|
|
675
594
|
) AS has_session
|
|
676
|
-
`);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`
|
|
677
596
|
WITH session_activity AS (
|
|
678
597
|
SELECT
|
|
679
598
|
s.id,
|
|
@@ -688,11 +607,11 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
688
607
|
SELECT
|
|
689
608
|
COUNT(*)::int AS session_count,
|
|
690
609
|
COUNT(*) FILTER (
|
|
691
|
-
WHERE ended_at IS NULL AND last_at >= now() - ${
|
|
610
|
+
WHERE ended_at IS NULL AND last_at >= now() - ${qi.raw(ab)}
|
|
692
611
|
)::int AS active_session_count,
|
|
693
612
|
MAX(last_at) AS last_activity_at
|
|
694
613
|
FROM session_activity
|
|
695
|
-
`),
|
|
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`
|
|
696
615
|
WITH RECURSIVE ancestors AS (
|
|
697
616
|
SELECT id, name, forked_from_id, version, scope, created_by, created_at::text, 1 as depth
|
|
698
617
|
FROM instructions
|
|
@@ -705,7 +624,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
705
624
|
WHERE i.archived = false AND a.depth < 20
|
|
706
625
|
)
|
|
707
626
|
SELECT * FROM ancestors ORDER BY depth DESC
|
|
708
|
-
`):[],s=await
|
|
627
|
+
`):[],s=await d.execute(ub`
|
|
709
628
|
WITH RECURSIVE descendants AS (
|
|
710
629
|
SELECT id, name, forked_from_id, version, scope, created_by, created_at::text, 1 as depth
|
|
711
630
|
FROM instructions
|
|
@@ -718,32 +637,32 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
718
637
|
WHERE i.archived = false AND d.depth < 20
|
|
719
638
|
)
|
|
720
639
|
SELECT * FROM descendants ORDER BY depth ASC
|
|
721
|
-
`),i=Array.isArray(o)?o.map(
|
|
722
|
-
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,
|
|
723
642
|
count(*)::int AS n,
|
|
724
643
|
min(created_at) AS oldest
|
|
725
|
-
FROM ${
|
|
644
|
+
FROM ${nn.raw(i)}
|
|
726
645
|
WHERE user_id = ${e}
|
|
727
646
|
AND status = 'pending'
|
|
728
647
|
AND created_at < ${n}::timestamptz
|
|
729
648
|
GROUP BY 1
|
|
730
|
-
`),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`
|
|
731
650
|
SELECT count(*)::int AS n
|
|
732
|
-
FROM ${
|
|
651
|
+
FROM ${nn.raw(n)}
|
|
733
652
|
WHERE user_id = ${e}
|
|
734
653
|
AND status IN ('claimed', 'running')
|
|
735
654
|
AND lease_expires_at IS NOT NULL
|
|
736
655
|
AND lease_expires_at > now()
|
|
737
|
-
`),
|
|
738
|
-
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,
|
|
739
658
|
count(*)::int AS n,
|
|
740
659
|
min(created_at) AS oldest
|
|
741
|
-
FROM ${
|
|
660
|
+
FROM ${nn.raw(m)}
|
|
742
661
|
WHERE user_id = ${e}
|
|
743
662
|
AND status = 'pending'
|
|
744
663
|
AND created_at < ${n}::timestamptz
|
|
745
664
|
GROUP BY 1
|
|
746
|
-
`),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`
|
|
747
666
|
SELECT id::text AS id,
|
|
748
667
|
${n} AS source_table,
|
|
749
668
|
coalesce(task_kind, ${r}) AS kind,
|
|
@@ -753,15 +672,15 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
753
672
|
claimed_at,
|
|
754
673
|
lease_expires_at,
|
|
755
674
|
completed_at,
|
|
756
|
-
${
|
|
757
|
-
${
|
|
675
|
+
${nt.raw(o)} AS label_id,
|
|
676
|
+
${nt.raw(s)} AS label_text,
|
|
758
677
|
result->>'skipped' AS skipped,
|
|
759
678
|
result->>'reason' AS reason,
|
|
760
679
|
result->>'decision' AS decision,
|
|
761
680
|
error
|
|
762
|
-
FROM ${
|
|
763
|
-
WHERE user_id = ${e}::uuid AND ${t}`),
|
|
764
|
-
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`
|
|
765
684
|
SELECT count(*)::int AS decisions,
|
|
766
685
|
count(*) FILTER (WHERE p.applied)::int AS applied,
|
|
767
686
|
count(*) FILTER (WHERE p.decision = 'promote')::int AS promote,
|
|
@@ -796,7 +715,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
796
715
|
FROM instruction_promotions p
|
|
797
716
|
LEFT JOIN eval_targets t ON t.id = p.eval_target_id
|
|
798
717
|
WHERE p.user_id = ${t}::uuid
|
|
799
|
-
`),S=u.select({proposed:rt`count(*)::int`,accepted:rt`count(*) filter (where ${x.acceptedAt} is not null)::int`,lastAcceptedAt:rt`max(${x.acceptedAt})::text`}).from(x).where(gr(x.userId,t)),[A,E,R,D]=await Promise.all([u.select({n:rt`count(*)::int`}).from(ie).where(gr(ie.userId,t)),u.select({n:rt`count(*)::int`}).from(q).where(Ng(gr(q.userId,t),gr(q.status,"running"))),u.select({kind:x.kind,n:rt`count(*)::int`}).from(x).where(Ng(gr(x.userId,t),xO(x.dismissedAt))).groupBy(x.kind),u.select({entries:rt`count(*)::int`,distinct:rt`count(distinct ${Ee.contentHash})::int`,repeated:rt`count(*) filter (where ${Ee.timesGenerated} > 1)::int`,dismissed:rt`count(*) filter (where ${Ee.dismissedAt} is not null)::int`,maxTimesGenerated:rt`coalesce(max(${Ee.timesGenerated}), 0)::int`,lastSeenAt:rt`max(${Ee.lastSeenAt})`}).from(Ee).where(gr(Ee.userId,t))]),[j,P]=await Promise.all([I,S]),$=j[0],H=P[0],te=(await u.select({lastHeartbeat:fe.lastHeartbeat,clientName:fe.clientName,clientVersion:fe.clientVersion,metadata:fe.metadata}).from(fe).where(Ng(gr(fe.userId,t),gr(fe.workerType,"cli-worker"),rt`${fe.lastHeartbeat} > ${new Date(y-kO).toISOString()}::timestamptz`)).orderBy(R0(fe.lastHeartbeat)).limit(1))[0],_e=te?y-new Date(te.lastHeartbeat).getTime():null,ee=f.map(N=>({kind:N.kind,count:1,oldestMinutes:Math.round(N.waitedSeconds/60)})),Re={present:te!=null,active:_e!=null&&_e<RO,ageSeconds:_e==null?null:Math.round(_e/1e3),capabilities:null,busy:h.length>0};return e.json({worker:{present:Re.present,active:Re.active,ageSeconds:Re.ageSeconds,clientName:te?.clientName??null,clientVersion:te?.clientVersion??null,lastHeartbeat:te?.lastHeartbeat??null},verdict:xl(Re,ee),running:h,queued:f,recent:w,recentTotal:l[0]?.n??0,proposals:b,proposalTotal:A[0]?.n??0,changes:{decisions:$?.decisions??0,applied:$?.applied??0,byDecision:{promote:$?.promote??0,revert:$?.revert??0,refuse:$?.refuse??0},readyToApply:$?.ready_to_apply??0,readyToApplyTargetId:$?.ready_to_apply_target_id??null,readyToApplyPromotionId:$?.ready_to_apply_promotion_id??null,lastAppliedAt:$?.last_applied_at??null,lastDecidedAt:$?.last_decided_at??null,suggestionsProposed:H?.proposed??0,suggestionsAccepted:H?.accepted??0,lastAcceptedAt:H?.lastAcceptedAt??null},counts:{experimentsRunning:E[0]?.n??0,suggestions:Object.fromEntries(R.map(N=>[N.kind,N.n]))},insights:{entries:D[0]?.entries??0,distinct:D[0]?.distinct??0,repeated:D[0]?.repeated??0,dismissed:D[0]?.dismissed??0,maxTimesGenerated:D[0]?.maxTimesGenerated??0,lastSeenAt:D[0]?.lastSeenAt??null},windowHours:o})});O();import{Hono as NO}from"hono";import{z as On}from"zod";import{and as PO,eq as Xn,sql as Eo}from"drizzle-orm";O();import{and as jO,eq as j0}from"drizzle-orm";async function Ke(e,t){let[n]=await u.select({id:k.id}).from(k).where(jO(j0(k.id,e),j0(k.userId,t)));return n}d(Ke,"verifyTargetOwnership");function Hc(e){return e===!0||e==="true"}d(Hc,"flagOn");function Rl(e,t=!1){let n=e??{},r=n.autoEvolvePairs,o=typeof r=="number"?r:typeof r=="string"?Number(r):NaN,s=Number.isFinite(o)&&o>=1,i=Hc(n.autoEvolvePaused);return{enabled:Hc(n.autoEvolveEnabled),optOut:Hc(n.autoEvolveOptOut),apply:Hc(n.autoEvolveApply),paused:t||i,pausedBy:t?"account":i?"target":null,pairs:s?Math.min(128,Math.max(10,Math.floor(o))):10,pairsConfigured:s,accumulate:Hc(n.autoEvolveAccumulate)}}d(Rl,"resolveEvolutionSettings");function N0(e,t){let n={...e??{}};return t.enabled!==void 0&&(n.autoEvolveEnabled=t.enabled),t.optOut!==void 0&&(n.autoEvolveOptOut=t.optOut),t.apply!==void 0&&(n.autoEvolveApply=t.apply),t.paused!==void 0&&(n.autoEvolvePaused=t.paused),t.accumulate!==void 0&&(n.autoEvolveAccumulate=t.accumulate),t.pairs!==void 0&&(n.autoEvolvePairs=Math.min(128,Math.max(10,Math.floor(t.pairs)))),n}d(N0,"applyEvolutionPatch");function kl(e){if(e.paused)return e.pausedBy==="account"?"Paused for the whole account \u2014 no instruction is measured or rewritten.":"Paused \u2014 no model budget is spent, and the opt-in is kept.";if(e.optOut&&!e.enabled)return"Opted out \u2014 this instruction is never enrolled automatically.";let t=e.enabled?"Enrolled manually":"Eligible for automatic enrolment",n=e.apply?"a promote MAY rewrite the file":"decisions are recorded only, nothing is written";return`${t}; ${n}. Needs ${e.pairs} paired tasks before it can act.`}d(kl,"describeEvolutionState");var hr=new NO,CO=On.object({enabled:On.boolean(),projectId:On.string().uuid().optional()});hr.get("/settings/auto-accept",async e=>{let t=e.get("userId"),n=e.req.query("projectId")??null,[r]=await u.select({enabled:T.autoAcceptSuggestions}).from(T).where(Xn(T.id,t)),o=null;if(n){let[i]=await u.select({raw:Eo`${U.metadata}->>'autoAcceptSuggestions'`}).from(U).where(Xn(U.id,n));i?.raw!=null&&(o=i.raw==="true")}let s=await Vu(t,n);return e.json({effective:s.allowed,source:s.source,accountDefault:r?.enabled??!0,projectOverride:o,limits:{minScore:Dt.MIN_SCORE,maxPerRun:Dt.MAX_PER_RUN,maxPerWindow:Dt.MAX_PER_WINDOW,windowDays:Dt.WINDOW_DAYS,kind:Dt.KIND}})});hr.patch("/settings/auto-accept",async e=>{let t=e.get("userId"),n=CO.safeParse(await e.req.json().catch(()=>({})));if(!n.success)return e.json({error:n.error.flatten()},400);let{enabled:r,projectId:o}=n.data;return o?(await u.update(U).set({metadata:Eo`coalesce(${U.metadata}, '{}'::jsonb) || jsonb_build_object('autoAcceptSuggestions', ${r}::boolean)`}).where(Xn(U.id,o)).returning({id:U.id})).length===0?e.json({error:"Project not found"},404):e.json({scope:"project",projectId:o,enabled:r}):(await u.update(T).set({autoAcceptSuggestions:r}).where(Xn(T.id,t)),e.json({scope:"account",enabled:r}))});var OO=On.object({enabled:On.boolean().optional(),optOut:On.boolean().optional(),apply:On.boolean().optional(),paused:On.boolean().optional(),accumulate:On.boolean().optional(),pairs:On.number().int().min(1).max(1e3).optional()}).refine(e=>Object.keys(e).length>0,{message:"no settings supplied"});async function jl(e){let[t]=await u.select({paused:T.evolutionPaused}).from(T).where(Xn(T.id,e));return t?.paused??!1}d(jl,"readAccountPaused");var DO=On.object({paused:On.boolean()});hr.get("/settings/evolution-account",async e=>{let t=e.get("userId");return e.json({paused:await jl(t)})});hr.patch("/settings/evolution-account",async e=>{let t=e.get("userId"),n=DO.safeParse(await e.req.json().catch(()=>({})));return n.success?(await u.update(T).set({evolutionPaused:n.data.paused}).where(Xn(T.id,t)),e.json({paused:n.data.paused})):e.json({error:n.error.flatten()},400)});hr.get("/settings/evolution/targets",async e=>{let t=e.get("userId"),n=await jl(t),o=(await u.select({id:k.id,name:k.name,autoEvolveEnabled:Eo`${k.metadata}->>'autoEvolveEnabled'`,autoEvolveOptOut:Eo`${k.metadata}->>'autoEvolveOptOut'`,autoEvolveApply:Eo`${k.metadata}->>'autoEvolveApply'`,autoEvolvePaused:Eo`${k.metadata}->>'autoEvolvePaused'`,autoEvolveAccumulate:Eo`${k.metadata}->>'autoEvolveAccumulate'`,autoEvolvePairs:Eo`${k.metadata}->>'autoEvolvePairs'`}).from(k).where(PO(Xn(k.userId,t),Xn(k.type,"instruction"))).orderBy(k.name)).map(i=>{let a=Rl(i,n);return{evalTargetId:i.id,name:i.name,settings:a,summary:kl(a)}}),s=o.filter(i=>i.settings.enabled||i.settings.apply||i.settings.paused||i.settings.optOut||i.settings.accumulate||i.settings.pairsConfigured);return e.json({targets:s,accountPaused:n,limits:{minPairs:10,maxPairs:128},totalInstructionTargets:o.length,unconfigured:o.length-s.length,writable:s.filter(i=>i.settings.apply&&!i.settings.paused).length})});hr.get("/settings/evolution",async e=>{let t=e.get("userId"),n=e.req.query("evalTargetId");if(!n)return e.json({error:"evalTargetId is required"},400);if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let[o]=await u.select({name:k.name,metadata:k.metadata}).from(k).where(Xn(k.id,n));if(!o)return e.json({error:"Eval target not found"},404);let s=Rl(o.metadata,await jl(t));return e.json({evalTargetId:n,name:o.name,settings:s,summary:kl(s),limits:{minPairs:10,maxPairs:128}})});hr.patch("/settings/evolution",async e=>{let t=e.get("userId"),n=e.req.query("evalTargetId");if(!n)return e.json({error:"evalTargetId is required"},400);let r=OO.safeParse(await e.req.json().catch(()=>({})));if(!r.success)return e.json({error:r.error.flatten()},400);if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let[s]=await u.select({metadata:k.metadata}).from(k).where(Xn(k.id,n));if(!s)return e.json({error:"Eval target not found"},404);let i=N0(s.metadata,r.data);await u.update(k).set({metadata:i}).where(Xn(k.id,n));let a=Rl(i,await jl(t));return e.json({evalTargetId:n,settings:a,summary:kl(a)})});O();import{Hono as MO}from"hono";import{and as LO,eq as $O,sql as qO}from"drizzle-orm";var Nl=new MO;Nl.get("/setup/status",async e=>{let t=e.get("userId"),[n,r,o]=await Promise.all([T0(t),u.select({id:_.id}).from(_).where(LO($O(_.userId,t),qO`${_.origin} <> 'internal_worker'`)).limit(1),Tl(t)]);return e.json({cliEverConnected:n.cliEverConnected,anyCapturedSession:r.length>0,workerActive:n.workerActive,llmEngines:o})});O();import{createHash as UO}from"node:crypto";import{Hono as HO}from"hono";import{z as An}from"zod";import{eq as _r,and as Pl,desc as BO,sql as FO}from"drizzle-orm";var xo=new HO,WO=An.object({name:An.string().min(1).max(255),type:An.enum(["instruction","skill","prompt","plan"]),content:An.string().min(1),description:An.string().default(""),metadata:An.record(An.unknown()).default({})}),zO=An.object({name:An.string().min(1).max(255).optional(),content:An.string().min(1).optional(),description:An.string().optional(),metadata:An.record(An.unknown()).optional()});xo.post("/eval-targets",async e=>{let t=e.get("userId"),n=await e.req.json(),r=WO.parse(n),[o]=await u.insert(k).values({userId:t,name:r.name,type:r.type,content:r.content,description:r.description,metadata:r.metadata}).returning();return e.json(o,201)});xo.get("/eval-targets",async e=>{let t=e.get("userId"),n=e.req.query("type"),r=e.req.query("content_hash"),o=[_r(k.userId,t)];n&&o.push(_r(k.type,n)),r&&o.push(FO`${k.metadata}->>'content_hash' = ${r}`);let s=e.req.query("limit"),i=e.req.query("offset"),a=s?parseInt(s,10):NaN,c=Number.isFinite(a)?Math.min(Math.max(1,a),200):100,l=i?parseInt(i,10):NaN,p=Number.isFinite(l)?Math.max(0,l):0,m=await u.select({id:k.id,userId:k.userId,name:k.name,type:k.type,description:k.description,metadata:k.metadata,version:k.version,parentId:k.parentId,createdAt:k.createdAt,updatedAt:k.updatedAt}).from(k).where(Pl(...o)).orderBy(BO(k.updatedAt)).limit(c).offset(p);return e.json(m)});xo.get("/eval-targets/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(k).where(Pl(_r(k.id,n),_r(k.userId,t)));return r?e.json(r):e.json({error:"Eval target not found"},404)});xo.post("/eval-targets/:id/sync-content",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json().catch(()=>({})),o=typeof r?.content=="string"?r.content:null;if(!o||o.trim().length===0)return e.json({error:"content is required"},400);let[s]=await u.select().from(k).where(Pl(_r(k.id,n),_r(k.userId,t)));if(!s)return e.json({error:"Eval target not found"},404);if(s.content===o)return e.json({id:n,synced:!1,version:s.version,reason:"already current"});let i=s.metadata&&typeof s.metadata=="object"&&!Array.isArray(s.metadata)?s.metadata:{},[a]=await u.update(k).set({content:o,version:(s.version??1)+1,metadata:{...i,content_hash:UO("sha256").update(o).digest("hex")},updatedAt:new Date}).where(_r(k.id,n)).returning({version:k.version});return e.json({id:n,synced:!0,version:a.version})});xo.put("/eval-targets/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=zO.parse(r),[s]=await u.select().from(k).where(Pl(_r(k.id,n),_r(k.userId,t)));if(!s)return e.json({error:"Eval target not found"},404);if(o.content&&o.content!==s.content){let[a]=await u.insert(k).values({userId:t,name:o.name??s.name,type:s.type,content:o.content,description:o.description??s.description,metadata:o.metadata??s.metadata,version:s.version+1,parentId:s.id}).returning();return e.json(a)}let[i]=await u.update(k).set({name:o.name??s.name,description:o.description??s.description,metadata:o.metadata??s.metadata,updatedAt:new Date}).where(_r(k.id,n)).returning();return e.json(i)});O();import{Hono as VO}from"hono";import{z as $t}from"zod";import{eq as Cl,and as O0,isNull as JO,desc as GO}from"drizzle-orm";var Bi=new VO,KO=$t.object({name:$t.string().min(1).max(255),prompt:$t.string().min(1),expectedOutput:$t.string().default(""),files:$t.array($t.unknown()).default([]),expectations:$t.array($t.string()).default([])});Bi.post("/eval-targets/:id/evals",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=KO.parse(r);if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let[i]=await u.insert(Se).values({evalTargetId:n,name:o.name,prompt:o.prompt,expectedOutput:o.expectedOutput,files:o.files,expectations:o.expectations}).returning();return e.json(i,201)});Bi.get("/eval-targets/:id/evals",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=e.req.query("includeRetired")==="1";if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let s=await u.select().from(Se).where(r?Cl(Se.evalTargetId,n):O0(Cl(Se.evalTargetId,n),JO(Se.retiredAt))).orderBy(GO(Se.createdAt));return e.json(s)});var YO=$t.object({retire:$t.boolean().optional(),retiredReason:$t.string().max(500).optional(),name:$t.string().min(1).max(255).optional(),prompt:$t.string().min(1).optional(),expectedOutput:$t.string().optional(),files:$t.array($t.unknown()).optional(),expectations:$t.array($t.string()).optional()}).refine(e=>e.retire!==void 0||e.name!==void 0||e.prompt!==void 0||e.expectedOutput!==void 0||e.files!==void 0||e.expectations!==void 0,{message:"nothing to update"});Bi.patch("/eval-targets/:id/evals/:evalId",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=e.req.param("evalId"),o=YO.parse(await e.req.json());if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let i={updatedAt:new Date};o.retire!==void 0&&(i.retiredAt=o.retire?new Date:null,i.retiredReason=o.retire?o.retiredReason??null:null),o.name!==void 0&&(i.name=o.name),o.prompt!==void 0&&(i.prompt=o.prompt),o.expectedOutput!==void 0&&(i.expectedOutput=o.expectedOutput),o.files!==void 0&&(i.files=o.files),o.expectations!==void 0&&(i.expectations=o.expectations),(o.prompt!==void 0||o.expectations!==void 0||o.files!==void 0||o.expectedOutput!==void 0)&&(i.contentUpdatedAt=new Date);let[a]=await u.update(Se).set(i).where(O0(Cl(Se.id,r),Cl(Se.evalTargetId,n))).returning();return a?e.json(a):e.json({error:"Eval case not found"},404)});O();import{Hono as QO}from"hono";import{z as Ne}from"zod";import{createHash as ZO}from"node:crypto";import{and as Dl,eq as on,gte as M0,desc as eD,sql as Pg}from"drizzle-orm";O();import{eq as XO,sql as To}from"drizzle-orm";async function Fi(e,t){let r=await u.execute(To`
|
|
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`
|
|
800
719
|
SELECT
|
|
801
720
|
r.configuration,
|
|
802
721
|
r.created_at,
|
|
@@ -839,7 +758,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
839
758
|
AND ev.retired_at IS NULL
|
|
840
759
|
AND r.grading->'summary'->>'pass_rate' IS NOT NULL
|
|
841
760
|
AND r.configuration IN ('with_target', 'without_target')
|
|
842
|
-
`),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`
|
|
843
762
|
SELECT
|
|
844
763
|
r.eval_target_id::text AS target_id,
|
|
845
764
|
r.configuration,
|
|
@@ -881,7 +800,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
881
800
|
AND r.grading->'summary'->>'pass_rate' IS NOT NULL
|
|
882
801
|
AND r.configuration IN ('with_target', 'without_target')
|
|
883
802
|
AND r.grading->>'judge_model' IS NOT DISTINCT FROM ${o}
|
|
884
|
-
`),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`
|
|
885
804
|
WITH current_judge AS (
|
|
886
805
|
SELECT r.grading->>'judge_model' AS model
|
|
887
806
|
FROM eval_runs r
|
|
@@ -910,7 +829,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
910
829
|
AND (SELECT count(*) FROM jsonb_array_elements(r.grading->'expectations') e
|
|
911
830
|
WHERE COALESCE(e->>'method', 'llm') = 'llm'
|
|
912
831
|
AND COALESCE(e->>'errored', 'false') <> 'true') > COALESCE(a.llm_annotated, 0)
|
|
913
|
-
`))[0]?.remaining??0}d(D0,"countRunsAwaitingReview");var vs=new QO,Ol=d(e=>ZO("sha256").update(e).digest("hex"),"sha256"),tD=Ne.object({withScore:Ne.number().min(0).max(1),withoutScore:Ne.number().min(0).max(1),withCost:Ne.number().nonnegative().optional(),withoutCost:Ne.number().nonnegative().optional(),withLatency:Ne.number().nonnegative().optional(),withoutLatency:Ne.number().nonnegative().optional()}),nD=Ne.object({candidateContent:Ne.string().min(1),proposalSource:Ne.enum(["llm","groom","human"]),proposalRationale:Ne.string().default(""),pairs:Ne.array(tD).default([]),canaryGreen:Ne.boolean(),measuredAgainstContentHash:Ne.string().optional(),accumulation:Ne.object({candidateContentHash:Ne.string(),priorContentHash:Ne.string(),targetPairs:Ne.number().int().positive(),carriedPairs:Ne.number().int().nonnegative(),runs:Ne.number().int().positive()}).optional(),immutableSections:Ne.array(Ne.string()).default([]),maxPromotionsPerWindow:Ne.number().int().positive().optional(),windowDays:Ne.number().int().positive().optional(),measurementCost:Ne.object({modelCalls:Ne.number().int().nonnegative(),proposalCalls:Ne.number().int().nonnegative(),executorCalls:Ne.number().int().nonnegative(),graderCalls:Ne.number().int().nonnegative(),plannedPairs:Ne.number().int().nonnegative(),usablePairs:Ne.number().int().nonnegative(),verdictPairs:Ne.number().int().nonnegative().optional(),passes:Ne.number().int().nonnegative(),liveCases:Ne.number().int().nonnegative(),mde:Ne.number().nonnegative().nullable(),wallMs:Ne.number().nonnegative()}).optional(),apply:Ne.boolean().default(!0)});vs.post("/eval-targets/:id/promotions",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=nD.parse(await e.req.json());if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let[s]=await u.select({id:k.id,content:k.content,version:k.version,metadata:k.metadata}).from(k).where(on(k.id,n));if(!s)return e.json({error:"Eval target not found"},404);let i=s.content,a=r.candidateContent,c=r.pairs,l=Mu(c,{baseline:"prior-version"}),p=!1,m=["adequacy could not be computed for this target"];try{let D=await Fi(t,n);p=D.powerCheck.adequate,m=D.powerCheck.reasons??[]}catch(D){m=[`adequacy check failed: ${D instanceof Error?D.message:String(D)}`]}let y=r.windowDays??vc,v=r.maxPromotionsPerWindow??fi,h=new Date(Date.now()-y*24*60*60*1e3),[f]=await u.select({n:Pg`count(*)::int`}).from(ie).where(Dl(on(ie.evalTargetId,n),on(ie.applied,!0),M0(ie.createdAt,h))),w=f?.n??0,b=Ol(i),I=r.measuredAgainstContentHash===void 0?void 0:r.measuredAgainstContentHash===b,S=jf({verdict:l,canaryGreen:r.canaryGreen,adequate:p,adequacyReasons:m,promotionsInWindow:w,maxPromotionsPerWindow:v,immutableSections:r.immutableSections,beforeContent:i,afterContent:a,measurementMatchesPredecessor:I}),A={canaryGreen:r.canaryGreen,adequate:p,adequacyReasons:m,promotionsInWindow:w,maxPromotionsPerWindow:v,windowDays:y,immutableSections:r.immutableSections,nPairs:c.length,measurementMatchesPredecessor:I??null,measuredAgainstContentHash:r.measuredAgainstContentHash??null,cost:r.measurementCost??null,accumulation:r.accumulation?{...r.accumulation,pairs:c}:null,applied:!1},E=S.decision==="promote"&&r.apply;A.applied=E;let R;try{R=await u.transaction(async D=>{if(E){let P=s.metadata&&typeof s.metadata=="object"&&!Array.isArray(s.metadata)?s.metadata:{};await D.update(k).set({content:a,version:(s.version??1)+1,metadata:{...P,content_hash:Ol(a)},updatedAt:new Date}).where(on(k.id,n))}let[j]=await D.insert(ie).values({userId:t,evalTargetId:n,fromContentHash:b,toContentHash:Ol(a),fromContent:i,toContent:a,proposalSource:r.proposalSource,proposalRationale:r.proposalRationale,decision:S.decision,applied:E,refusals:S.refusals,rationale:S.rationale,effectClass:S.effect,verdict:l,gates:A,touchedSections:S.touched}).returning({id:ie.id,createdAt:ie.createdAt});return j})}catch(D){if(D?.code==="23505")return e.json({error:"This edit has already been applied to this target",code:"PROMOTION_ALREADY_APPLIED"},409);throw D}return e.json({id:R.id,createdAt:R.createdAt,decision:S.decision,applied:E,rationale:S.rationale,refusals:S.refusals,effectClass:S.effect,touchedSections:S.touched,verdict:l,gates:A},201)});vs.get("/eval-targets/:id/promotions",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=Math.min(Number(e.req.query("limit")??50)||50,200),o=Math.max(Number(e.req.query("offset")??0)||0,0);if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let i=await u.select({id:ie.id,createdAt:ie.createdAt,decision:ie.decision,applied:ie.applied,effectClass:ie.effectClass,rationale:ie.rationale,refusals:ie.refusals,proposalSource:ie.proposalSource,proposalRationale:ie.proposalRationale,fromContentHash:ie.fromContentHash,toContentHash:ie.toContentHash,touchedSections:ie.touchedSections,verdict:ie.verdict,gates:ie.gates}).from(ie).where(on(ie.evalTargetId,n)).orderBy(eD(ie.createdAt)).limit(r).offset(o),a=await u.select({decision:ie.decision,n:Pg`count(*)::int`}).from(ie).where(on(ie.evalTargetId,n)).groupBy(ie.decision),c={promote:0,revert:0,refuse:0};for(let l of a)c[l.decision]=l.n;return e.json({promotions:i,counts:c,total:Object.values(c).reduce((l,p)=>l+p,0),limit:r,offset:o})});vs.post("/promotions/:promotionId/apply",async e=>{let t=e.get("userId"),n=e.req.param("promotionId");try{let r=await u.transaction(async o=>{let[s]=await o.select().from(ie).where(Dl(on(ie.id,n),on(ie.userId,t))).for("update");if(!s)return{status:404,body:{error:"Promotion not found"}};if(s.applied)return{status:409,body:{error:"Already applied",code:"ALREADY_APPLIED"}};if(s.decision!=="promote")return{status:409,body:{error:`Only a "promote" can be applied; this decision was "${s.decision}"`,code:"NOT_A_PROMOTE"}};let[i]=await o.select().from(k).where(on(k.id,s.evalTargetId));if(!i)return{status:404,body:{error:"Eval target not found"}};if(i.content!==s.fromContent)return{status:409,body:{error:"The target has changed since this was measured \u2014 the verdict no longer describes this edit. Re-measure rather than applying a stale decision.",code:"STALE_MEASUREMENT"}};let a=new Date(Date.now()-vc*864e5),[c]=await o.select({n:Pg`count(*)::int`}).from(ie).where(Dl(on(ie.evalTargetId,s.evalTargetId),on(ie.applied,!0),M0(ie.createdAt,a)));if((c?.n??0)>=fi)return{status:409,body:{error:`Change budget exhausted (${c?.n}/${fi} applied in ${vc}d)`,code:"BUDGET_EXHAUSTED"}};let l=i.metadata&&typeof i.metadata=="object"&&!Array.isArray(i.metadata)?i.metadata:{};await o.update(k).set({content:s.toContent,version:(i.version??1)+1,metadata:{...l,content_hash:Ol(s.toContent)},updatedAt:new Date}).where(on(k.id,s.evalTargetId));let p=s.gates&&typeof s.gates=="object"&&!Array.isArray(s.gates)?s.gates:{};return await o.update(ie).set({applied:!0,gates:{...p,applied:!0,appliedAt:new Date().toISOString(),appliedVia:"deferred-human-apply"}}).where(on(ie.id,s.id)),{status:200,body:{id:s.id,applied:!0,evalTargetId:s.evalTargetId,newVersion:(i.version??1)+1}}});return e.json(r.body,r.status)}catch(r){if(r?.code==="23505")return e.json({error:"This edit is already applied to this target",code:"PROMOTION_ALREADY_APPLIED"},409);throw r}});vs.get("/promotions/:promotionId",async e=>{let t=e.get("userId"),n=e.req.param("promotionId"),[r]=await u.select().from(ie).where(Dl(on(ie.id,n),on(ie.userId,t)));return r?e.json(r):e.json({error:"Promotion not found"},404)});O();import{Hono as rD}from"hono";import{z as ft}from"zod";import{eq as Qn,and as Cg,asc as oD,desc as L0,isNull as sD,inArray as iD,sql as aD}from"drizzle-orm";var Is=new rD,cD=ft.object({jobId:ft.string().uuid().optional(),evalId:ft.string().uuid(),evalTargetId:ft.string().uuid(),evalTargetVersion:ft.number().int(),configuration:ft.enum(["with_target","without_target","baseline","with_candidate","with_prior_version"]),runNumber:ft.number().int().default(1),iteration:ft.number().int().default(1),status:ft.enum(["pending","running","completed","failed"]).default("completed"),outputs:ft.record(ft.unknown()).default({}),timing:ft.record(ft.unknown()).default({}),grading:ft.record(ft.unknown()).default({}),comparison:ft.record(ft.unknown()).nullable().optional()}),dD=ft.object({iteration:ft.number().int().default(1),runSummary:ft.record(ft.unknown()).default({}),notes:ft.array(ft.string()).default([])});Is.post("/eval-runs",async e=>{let t=e.get("userId"),n=await e.req.json(),r=cD.parse(n);if(!await Ke(r.evalTargetId,t))return e.json({error:"Eval target not found"},404);let[s]=await u.insert(be).values({jobId:r.jobId??null,evalId:r.evalId,evalTargetId:r.evalTargetId,evalTargetVersion:r.evalTargetVersion,configuration:r.configuration,runNumber:r.runNumber,iteration:r.iteration,status:r.status,outputs:r.outputs,timing:r.timing,grading:r.grading,comparison:r.comparison??null}).onConflictDoNothing().returning();if(s)return e.json(s,201);if(!r.jobId)return e.json({error:"Insert conflicted without a jobId"},409);let[i]=await u.select().from(be).where(Cg(Qn(be.jobId,r.jobId),Qn(be.evalId,r.evalId),Qn(be.configuration,r.configuration),Qn(be.runNumber,r.runNumber),Qn(be.iteration,r.iteration))).limit(1);return i?e.json({...i,deduped:!0},200):e.json({error:"Run conflicted but existing row not found"},409)});Is.get("/eval-targets/:id/runs",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=e.req.query("iteration"),o=e.req.query("configuration");if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let i=e.req.query("limit"),a=e.req.query("offset"),c=i?parseInt(i,10):NaN,l=Number.isFinite(c)?Math.min(Math.max(1,c),100):50,p=a?parseInt(a,10):NaN,m=Number.isFinite(p)?Math.max(0,p):0,y=[Qn(be.evalTargetId,n)];r&&y.push(Qn(be.iteration,parseInt(r,10))),o&&y.push(Qn(be.configuration,o)),e.req.query("activeCasesOnly")==="1"&&y.push(iD(be.evalId,u.select({id:Se.id}).from(Se).where(Cg(Qn(Se.evalTargetId,n),sD(Se.retiredAt)))));let v=e.req.query("candidateContentHash");v&&y.push(aD`${be.outputs}->>'candidateContentHash' = ${v}`);let h=e.req.query("jobId");if(h){let b=ft.string().uuid().safeParse(h);if(!b.success)return e.json({error:"Invalid jobId"},400);y.push(Qn(be.jobId,b.data))}let w=(await u.select().from(be).where(Cg(...y)).orderBy(L0(be.createdAt),oD(be.id)).limit(l).offset(m)).map(b=>{let I=b.outputs??{},{diff:S,transcript:A,...E}=I,R=v?E:{...E,transcript:A};return{...b,outputs:R,comparison:null}});return e.json(w)});Is.post("/eval-targets/:id/benchmarks",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),o=dD.parse(r);if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let[i]=await u.insert(Wn).values({evalTargetId:n,iteration:o.iteration,runSummary:o.runSummary,notes:o.notes}).returning();return e.json(i,201)});Is.get("/eval-targets/:id/benchmarks",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let o=await u.select().from(Wn).where(Qn(Wn.evalTargetId,n)).orderBy(L0(Wn.createdAt));return e.json(o)});O();import{Hono as uD}from"hono";import{z as qt}from"zod";import{eq as bs,and as q0,or as lD,desc as pD,asc as mD}from"drizzle-orm";import{alias as $0}from"drizzle-orm/pg-core";var Wi=new uD,fD=qt.object({targetAId:qt.string().uuid(),targetBId:qt.string().uuid(),targetAVersion:qt.number().int(),targetBVersion:qt.number().int(),isSwapped:qt.boolean(),winnerTargetId:qt.string().uuid().nullable(),perEval:qt.array(qt.object({evalName:qt.string(),winnerTargetId:qt.string().uuid().nullable(),reasoning:qt.string().default("")})).default([]),overall:qt.record(qt.unknown()).default({}),rawOutput:qt.string().nullable().optional(),model:qt.string().nullable().optional(),status:qt.enum(["completed","parse_failed"]).default("completed")});Wi.post("/eval-comparisons",async e=>{let t=e.get("userId"),n=await e.req.json(),r=fD.parse(n),[o,s]=await Promise.all([Ke(r.targetAId,t),Ke(r.targetBId,t)]);if(!o||!s)return e.json({error:"Eval target not found"},404);let i=d(c=>c===null||c===r.targetAId||c===r.targetBId,"validWinner");if(!i(r.winnerTargetId)||!r.perEval.every(c=>i(c.winnerTargetId)))return e.json({error:"winnerTargetId must be one of the compared targets or null"},400);let[a]=await u.insert(Xe).values({userId:t,targetAId:r.targetAId,targetBId:r.targetBId,targetAVersion:r.targetAVersion,targetBVersion:r.targetBVersion,isSwapped:r.isSwapped,winnerTargetId:r.winnerTargetId,perEval:r.perEval,overall:r.overall,rawOutput:r.rawOutput??null,model:r.model??null,status:r.status}).returning();return e.json(a,201)});Wi.get("/eval-targets/:id/comparisons",async e=>{let t=e.get("userId"),n=e.req.param("id");if(!await Ke(n,t))return e.json({error:"Eval target not found"},404);let o=e.req.query("limit"),s=e.req.query("offset"),i=o?parseInt(o,10):NaN,a=Number.isFinite(i)?Math.min(Math.max(1,i),100):50,c=s?parseInt(s,10):NaN,l=Number.isFinite(c)?Math.max(0,c):0,p=$0(k,"targets_a"),m=$0(k,"targets_b"),y=await u.select({id:Xe.id,userId:Xe.userId,targetAId:Xe.targetAId,targetBId:Xe.targetBId,targetAName:p.name,targetBName:m.name,targetAVersion:Xe.targetAVersion,targetBVersion:Xe.targetBVersion,isSwapped:Xe.isSwapped,winnerTargetId:Xe.winnerTargetId,perEval:Xe.perEval,overall:Xe.overall,model:Xe.model,status:Xe.status,createdAt:Xe.createdAt}).from(Xe).innerJoin(p,bs(Xe.targetAId,p.id)).innerJoin(m,bs(Xe.targetBId,m.id)).where(q0(bs(Xe.userId,t),lD(bs(Xe.targetAId,n),bs(Xe.targetBId,n)))).orderBy(pD(Xe.createdAt),mD(Xe.id)).limit(a).offset(l);return e.json(y.map(v=>({...v,rawOutput:null})))});Wi.get("/eval-comparisons/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=qt.string().uuid().safeParse(n);if(!r.success)return e.json({error:"Invalid comparison id"},400);let[o]=await u.select().from(Xe).where(q0(bs(Xe.id,r.data),bs(Xe.userId,t)));return o?e.json(o):e.json({error:"Comparison not found"},404)});O();import{Hono as yD}from"hono";import{z as zi}from"zod";import{eq as Vi,and as Og,desc as wD,asc as vD,inArray as ID,sql as bD}from"drizzle-orm";O();import{sql as gD}from"drizzle-orm";function U0(e){if(e.n===0)return null;let t=e.agree/e.n,n=e.aYes/e.n,r=e.bYes/e.n,o=n*r+(1-n)*(1-r);return o>=1?null:(t-o)/(1-o)}d(U0,"kappaFromCounts");var H0=d((e,t)=>({agree:e,total:t,rate:t>0?e/t:null}),"slice");function hD(e){let t=e.pairs>0?e.agreeHuman/e.pairs:null;return{engine:e.reviewerEngine,models:e.models,pairs:e.pairs,orphaned:e.orphaned,agreementRate:t,kappa:U0({n:e.pairs,agree:e.agreeHuman,aYes:e.humanYes,bYes:e.reviewerYes}),snapshotAgreementRate:e.pairs>0?e.snapshotAgree/e.pairs:null,snapshotKappa:U0({n:e.pairs,agree:e.snapshotAgree,aYes:e.snapshotHumanYes,bYes:e.reviewerYes}),judgeAgreementRate:e.pairs>0?e.judgeAgreeHuman/e.pairs:null,onJudgePass:H0(e.judgePassAgree,e.judgePassPairs),onJudgeFail:H0(e.agreeHuman-e.judgePassAgree,e.pairs-e.judgePassPairs),suggestedAnchorWeight:t==null?null:Math.max(0,2*t-1)**2,unresolvedFlags:e.unresolvedFlags,kept:e.kept,relabeled:e.relabeled,lastReviewedAt:e.lastReviewedAt}}d(hD,"reviewerAgreementReport");async function B0(e){return(await u.execute(gD`
|
|
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`
|
|
914
833
|
SELECT
|
|
915
834
|
j.reviewer_engine,
|
|
916
835
|
array_agg(DISTINCT j.reviewer_model) AS models,
|
|
@@ -942,7 +861,7 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
942
861
|
) j
|
|
943
862
|
GROUP BY j.reviewer_engine
|
|
944
863
|
ORDER BY j.reviewer_engine
|
|
945
|
-
`)).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`
|
|
946
865
|
WITH current_judge AS (
|
|
947
866
|
-- Same definition as judge-calibration: most recently stamped run's
|
|
948
867
|
-- model; empty (NULL) until any grading carries judge_model. Labeling a
|
|
@@ -987,40 +906,40 @@ Only include instructions with a relevance score >= 0.5. Order by score descendi
|
|
|
987
906
|
WHERE llm_total > llm_annotated
|
|
988
907
|
ORDER BY (llm_annotated > 0) DESC, random()
|
|
989
908
|
LIMIT ${i}
|
|
990
|
-
`),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(
|
|
991
910
|
CASE WHEN jsonb_typeof(${e}) = 'array' THEN ${e} END,
|
|
992
911
|
CASE WHEN jsonb_typeof(${t}) = 'array' THEN ${t} END,
|
|
993
912
|
'[]'::jsonb
|
|
994
|
-
)`}
|
|
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((
|
|
995
914
|
SELECT jsonb_agg(jsonb_build_object('name', t->'name', 'description', left(COALESCE(t->>'description', ''), 80)))
|
|
996
|
-
FROM jsonb_array_elements(${
|
|
915
|
+
FROM jsonb_array_elements(${Ob(l.content,$.tools)}) AS t
|
|
997
916
|
), '[]'::jsonb)`,metadataLight:yr`jsonb_strip_nulls(jsonb_build_object(
|
|
998
|
-
'usage', ${
|
|
999
|
-
'response', ${
|
|
1000
|
-
'thinking', ${
|
|
1001
|
-
'stream', ${
|
|
1002
|
-
'betaFeatures', ${
|
|
1003
|
-
'responseStatus', ${
|
|
1004
|
-
'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',
|
|
1005
924
|
'contextItems', CASE
|
|
1006
|
-
WHEN jsonb_typeof(${
|
|
925
|
+
WHEN jsonb_typeof(${$.metadata}->'contextItems') = 'array' THEN (
|
|
1007
926
|
SELECT jsonb_agg(jsonb_build_object('type', ci->'type', 'name', ci->'name', 'estimated_tokens', ci->'estimated_tokens'))
|
|
1008
|
-
FROM jsonb_array_elements(${
|
|
927
|
+
FROM jsonb_array_elements(${$.metadata}->'contextItems') AS ci
|
|
1009
928
|
)
|
|
1010
929
|
ELSE NULL
|
|
1011
930
|
END
|
|
1012
|
-
))`}).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`
|
|
1013
932
|
select project_id, project_path, count(*)::int as n
|
|
1014
933
|
from sessions
|
|
1015
934
|
where user_id = ${t}
|
|
1016
935
|
and project_id is not null
|
|
1017
936
|
and project_path is not null
|
|
1018
937
|
group by project_id, project_path
|
|
1019
|
-
`),o=new Map,s=new Map;for(let
|
|
1020
|
-
${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`
|
|
1021
940
|
SELECT p.probe_hash, m.content_hash, m.times_generated, m.last_job_id,
|
|
1022
941
|
m.dismissed_at, m.sim
|
|
1023
|
-
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)
|
|
1024
943
|
-- CROSS JOIN, not LEFT JOIN LATERAL: a probe with no row in its
|
|
1025
944
|
-- category simply produces no output row, which reads back as "no
|
|
1026
945
|
-- alias" — the same outcome the per-probe query gave via an empty
|
|
@@ -1036,10 +955,10 @@ ${r}`).digest("hex")}d(Z0,"recommendationEntryHash");var tM=new Set(["42883","42
|
|
|
1036
955
|
ORDER BY sim DESC
|
|
1037
956
|
LIMIT 1
|
|
1038
957
|
) m
|
|
1039
|
-
`)]}d(oM,"dbProbeExecutor");async function Hg(e,t,n,r=0){if(e.length===0)return[];if(ql||n.aborted)return n.degraded+=e.length,[];try{return n.statements+=1,await t(e)}catch(o){let s=rM(o);if(n.failure??={kind:s,code:typeof o?.code=="string"?String(o.code):void 0,message:o instanceof Error?o.message:String(o)},s==="capability-absent"&&(ql=!0),s==="load"&&(n.aborted=!0),!(s==="isolable"&&r<nM&&e.length>1))return n.degraded+=e.length,[];n.bisections+=1;let a=Math.ceil(e.length/2),c=await Hg(e.slice(0,a),t,n,r+1),l=await Hg(e.slice(a),t,n,r+1);return[...c,...l]}}d(Hg,"resolveProbes");async function eS(e){let{userId:t,jobId:n}=e,r=e.projectPath??"",o=[];for(let f of Q0)for(let w of f.get(e.recs)??[]){if(w===null||typeof w!="object")continue;let b=w;o.push({category:f.category,hash:Z0(f.category,b),label:f.label(b)})}if(o.length===0)return e.recs;let s=[...new Set(o.map(f=>f.hash))],i=await u.select({contentHash:Ee.contentHash,timesGenerated:Ee.timesGenerated,lastJobId:Ee.lastJobId,dismissedAt:Ee.dismissedAt}).from(Ee).where(XD(X0(Ee.userId,t),X0(Ee.projectPath,r),QD(Ee.contentHash,s))),a=new Map(i.map(f=>[f.contentHash,f])),c=new Map,l=new Map;for(let f of o)a.has(f.hash)||f.label.trim().length===0||l.has(f.hash)||l.set(f.hash,f);if(l.size>0&&!ql){let f={probes:l.size,statements:0,bisections:0,degraded:0,aborted:!1},w=await Hg([...l.values()],oM(t,r),f);for(let b of w)Number(b.sim)<eM||(c.set(b.probe_hash,b.content_hash),a.has(b.content_hash)||a.set(b.content_hash,{contentHash:b.content_hash,timesGenerated:Number(b.times_generated),lastJobId:b.last_job_id,dismissedAt:b.dismissed_at?new Date(b.dismissed_at):null}));f.failure&&console.warn(`[insight-memory] semantic probe degraded to verbatim identity: ${f.degraded}/${f.probes} probes, ${f.statements} statement(s), ${f.bisections} bisection(s), class=${f.failure.kind}`+(f.failure.code?` code=${f.failure.code}`:"")+(ql?" \u2014 trigram probing disabled for this process":""),f.failure.message)}let p=d(f=>c.get(f)??f,"canonical");if(n){let f=o.filter(w=>{let b=a.get(p(w.hash));return!b||b.lastJobId!==n});if(f.length>0)try{let w=new Set,b=f.filter(I=>!w.has(p(I.hash))&&w.add(p(I.hash)));await u.insert(Ee).values(b.map(I=>({userId:t,projectPath:r,category:I.category,contentHash:p(I.hash),label:I.label,lastJobId:n}))).onConflictDoUpdate({target:[Ee.userId,Ee.projectPath,Ee.contentHash],set:{lastSeenAt:jo`now()`,timesGenerated:jo`${Ee.timesGenerated} + 1`,lastJobId:n}});for(let I of b){let S=p(I.hash),A=a.get(S);a.set(S,{contentHash:S,timesGenerated:(A?.timesGenerated??0)+1,lastJobId:n,dismissedAt:A?.dismissedAt??null})}}catch{}}let m=Date.now()-ZD*24*3600*1e3,y=d(f=>{let w=a.get(f)?.dismissedAt;return w!=null&&new Date(w).getTime()>m},"suppressed"),v={...e.recs},h=d((f,w)=>{switch(f){case"claude_md_additions":case"features_to_try":case"usage_patterns":{let b={...v.suggestions};b[f]=w,v.suggestions=b;break}case"friction_categories":{v.friction_analysis={...v.friction_analysis,categories:w};break}case"opportunities":{v.on_the_horizon={...v.on_the_horizon,opportunities:w};break}case"impressive_workflows":{v.what_works={...v.what_works,impressive_workflows:w};break}case"project_areas":{v.project_areas=w;break}}},"setPath");for(let f of Q0){let w=f.get(e.recs)??[];if(w.length===0)continue;let b=w.map(I=>{if(I===null||typeof I!="object")return I;let S=I,A=p(Z0(f.category,S));return{...S,id:A,timesGenerated:a.get(A)?.timesGenerated??1}}).filter(I=>I===null||typeof I!="object"?!0:!y(I.id??""));h(f.category,b)}return v}d(eS,"applyRecommendationMemory");async function tS(e){let t=e.projectPath??"";await u.insert(Ee).values({userId:e.userId,projectPath:t,category:"unknown",contentHash:e.contentHash,dismissedAt:jo`now()`}).onConflictDoUpdate({target:[Ee.userId,Ee.projectPath,Ee.contentHash],set:{dismissedAt:jo`now()`}})}d(tS,"dismissRecommendation");O();var Bg=[{provider:"anthropic",modelId:"claude-fable-5",inputPerMTok:10,outputPerMTok:50,cacheReadPerMTok:1,cacheWrite5mPerMTok:12.5,cacheWrite1hPerMTok:20,contextWindow:1e6},{provider:"anthropic",modelId:"claude-opus-4-8",inputPerMTok:5,outputPerMTok:25,cacheReadPerMTok:.5,cacheWrite5mPerMTok:6.25,cacheWrite1hPerMTok:10,contextWindow:1e6},{provider:"anthropic",modelId:"claude-opus-4-7",inputPerMTok:5,outputPerMTok:25,cacheReadPerMTok:.5,cacheWrite5mPerMTok:6.25,cacheWrite1hPerMTok:10,contextWindow:1e6},{provider:"anthropic",modelId:"claude-opus-4-6",inputPerMTok:5,outputPerMTok:25,cacheReadPerMTok:.5,cacheWrite5mPerMTok:6.25,cacheWrite1hPerMTok:10,contextWindow:1e6},{provider:"anthropic",modelId:"claude-sonnet-5",inputPerMTok:3,outputPerMTok:15,cacheReadPerMTok:.3,cacheWrite5mPerMTok:3.75,cacheWrite1hPerMTok:6,contextWindow:1e6},{provider:"anthropic",modelId:"claude-sonnet-4-6",inputPerMTok:3,outputPerMTok:15,cacheReadPerMTok:.3,cacheWrite5mPerMTok:3.75,cacheWrite1hPerMTok:6,contextWindow:2e5},{provider:"anthropic",modelId:"claude-haiku-4-5-20251001",inputPerMTok:1,outputPerMTok:5,cacheReadPerMTok:.1,cacheWrite5mPerMTok:1.25,cacheWrite1hPerMTok:2,contextWindow:2e5},{provider:"anthropic",modelId:"claude-haiku-4-5",inputPerMTok:1,outputPerMTok:5,cacheReadPerMTok:.1,cacheWrite5mPerMTok:1.25,cacheWrite1hPerMTok:2,contextWindow:2e5},{provider:"openai",modelId:"gpt-5.5",inputPerMTok:5,outputPerMTok:30,cacheReadPerMTok:.5,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:4e5},{provider:"openai",modelId:"gpt-4o",inputPerMTok:2.5,outputPerMTok:10,cacheReadPerMTok:1.25,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:128e3},{provider:"openai",modelId:"gpt-4o-mini",inputPerMTok:.15,outputPerMTok:.6,cacheReadPerMTok:.075,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:128e3},{provider:"openai",modelId:"gpt-4.1",inputPerMTok:2,outputPerMTok:8,cacheReadPerMTok:.5,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:1e6},{provider:"openai",modelId:"gpt-4.1-mini",inputPerMTok:.4,outputPerMTok:1.6,cacheReadPerMTok:.1,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:1e6},{provider:"openai",modelId:"o1",inputPerMTok:15,outputPerMTok:60,cacheReadPerMTok:7.5,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:2e5},{provider:"openai",modelId:"o3",inputPerMTok:2,outputPerMTok:8,cacheReadPerMTok:.5,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:2e5},{provider:"openai",modelId:"o4-mini",inputPerMTok:1.1,outputPerMTok:4.4,cacheReadPerMTok:.275,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:2e5},{provider:"google",modelId:"gemini-2.5-pro",inputPerMTok:1.25,outputPerMTok:10,cacheReadPerMTok:.31,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:1e6},{provider:"google",modelId:"gemini-2.5-flash",inputPerMTok:.3,outputPerMTok:2.5,cacheReadPerMTok:.075,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:1e6},{provider:"google",modelId:"gemini-2.0-flash",inputPerMTok:.1,outputPerMTok:.4,cacheReadPerMTok:.025,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:1e6},{provider:"google",modelId:"gemini-1.5-pro",inputPerMTok:1.25,outputPerMTok:5,cacheReadPerMTok:.3125,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:2e6},{provider:"google",modelId:"gemini-1.5-flash",inputPerMTok:.075,outputPerMTok:.3,cacheReadPerMTok:.01875,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:1e6},{provider:"xai",modelId:"grok-4",inputPerMTok:3,outputPerMTok:15,cacheReadPerMTok:.75,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:256e3},{provider:"xai",modelId:"grok-3",inputPerMTok:3,outputPerMTok:15,cacheReadPerMTok:.75,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:131072},{provider:"deepseek",modelId:"deepseek-chat",inputPerMTok:.27,outputPerMTok:1.1,cacheReadPerMTok:.07,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:128e3},{provider:"deepseek",modelId:"deepseek-reasoner",inputPerMTok:.55,outputPerMTok:2.19,cacheReadPerMTok:.14,cacheWrite5mPerMTok:0,cacheWrite1hPerMTok:0,contextWindow:128e3}];function No(e){if(!e)return"anthropic";let t=Bg.find(r=>r.modelId===e);if(t)return t.provider;let n=e.toLowerCase();return n.startsWith("claude")?"anthropic":n.startsWith("gpt")||n.startsWith("o1")||n.startsWith("o3")||n.startsWith("o4")||n.startsWith("chatgpt")?"openai":n.startsWith("gemini")?"google":n.startsWith("grok")?"xai":n.startsWith("deepseek")?"deepseek":n.startsWith("mistral")||n.startsWith("mixtral")||n.startsWith("magistral")||n.startsWith("codestral")?"mistral":n.startsWith("llama")||n.startsWith("meta-llama")?"meta":"anthropic"}d(No,"providerFromModelId");var Fg={provider:"anthropic",modelId:"default-sonnet-equivalent",inputPerMTok:3,outputPerMTok:15,cacheReadPerMTok:.3,cacheWrite5mPerMTok:3.75,cacheWrite1hPerMTok:6,contextWindow:2e5};function Wg(e){return Bg.find(t=>t.modelId===e)}d(Wg,"findModel");var Vc=1e6;function sM(e){return Math.round(e*100)/100}d(sM,"roundCents");function Ul(e,t,n){let r=e.input_tokens??0,o=e.output_tokens??0,s=e.cache_read_input_tokens??0,i=(e.cache_creation_5m??0)+(e.cache_creation_input_tokens??0),a=e.cache_creation_1h??0,c=r*t.inputPerMTok/Vc,l=o*t.outputPerMTok/Vc,p=s*t.cacheReadPerMTok/Vc,m=i*t.cacheWrite5mPerMTok/Vc,y=a*t.cacheWrite1hPerMTok/Vc,v=m+y,h=c+l+p+v;return{inputUsd:c,outputUsd:l,cacheReadUsd:p,cacheWriteUsd:v,totalUsd:sM(h),estimated:n}}d(Ul,"computePrice");function zg(e,t,n){let r=Wg(t);return Ul(e,r??Fg,!r)}d(zg,"priceUsage");O();import{and as iM,desc as aM,eq as nS,isNull as cM,lte as dM,or as uM,gt as lM}from"drizzle-orm";function Jc(e){return e==null?0:typeof e=="number"?e:Number(e)}d(Jc,"toNumber");async function Fr(e,t,n,r,o="anthropic"){let s=await e.select().from(Qe).where(iM(nS(Qe.provider,o),nS(Qe.modelId,n),dM(Qe.effectiveFrom,r),uM(cM(Qe.effectiveUntil),lM(Qe.effectiveUntil,r)))).orderBy(aM(Qe.effectiveFrom)).limit(1);if(s.length===0)return zg(t,n,r);let i=s[0];return Ul(t,{inputPerMTok:Jc(i.inputPerM),outputPerMTok:Jc(i.outputPerM),cacheReadPerMTok:Jc(i.cacheReadPerM),cacheWrite5mPerMTok:Jc(i.cacheWrite5mPerM),cacheWrite1hPerMTok:Jc(i.cacheWrite1hPerM)},!1)}d(Fr,"priceUsageFromDb");var Gc=1e6,rS=10*6e4,pM=500,Es=new Map;function mM(e,t,n){return`${e}:${t}:${n.toISOString().slice(0,7)}`}d(mM,"rateKey");function oS(e,t){let n=No(e),r=mM(n,e,t),o=Es.get(r),s=o&&Date.now()-o.at<rS?o.rates:void 0;if(!s){s=(async()=>{let a={input_tokens:Gc},c={output_tokens:Gc},l={cache_read_input_tokens:Gc},p={cache_creation_5m:Gc},m={cache_creation_1h:Gc},[y,v,h,f,w]=await Promise.all([Fr(nt,a,e,t,n),Fr(nt,c,e,t,n),Fr(nt,l,e,t,n),Fr(nt,p,e,t,n),Fr(nt,m,e,t,n)]);return{inputPerM:y.inputUsd,outputPerM:v.outputUsd,cacheReadPerM:h.cacheReadUsd,cacheWrite5mPerM:f.cacheWriteUsd,cacheWrite1hPerM:w.cacheWriteUsd,estimated:y.estimated}})();let i=s;if(i.catch(()=>{Es.get(r)?.rates===i&&Es.delete(r)}),Es.set(r,{at:Date.now(),rates:i}),Es.size>pM)for(let[a,c]of Es)Date.now()-c.at>=rS&&Es.delete(a)}return s}d(oS,"getRates");var Kc=new hM;function wM(e){let t=[],n=[];if(e.sessionsUsingMcp===0&&e.totalSessions>=5&&t.push({feature:"MCP Servers",one_liner:"Extend Claude with external tools via MCP",why_for_you:`Across ${e.totalSessions} sessions, you haven't used any MCP servers. MCP lets Claude access databases, APIs, and custom tools directly. Set up the RuleMetric MCP server from the /connect page in the dashboard.`,example_code:"claude mcp add <server-name> -- <command>"}),e.sessionsUsingTaskAgent===0&&e.totalSessions>=5&&t.push({feature:"Task Agents",one_liner:"Parallelize work with subagents",why_for_you:"You haven't used task agents yet. They can parallelize independent tasks \u2014 like running tests while editing code \u2014 saving significant time.",example_code:"claude -p 'Use an explore agent to map the architecture of this project, then use parallel agents to implement each change independently.'"}),e.totalToolErrors>10){let y=Object.entries(e.toolErrorCategories).sort(([,v],[,h])=>h-v)[0];y&&t.push({feature:"Hooks",one_liner:"Auto-run checks after tool calls",why_for_you:`You had ${e.totalToolErrors} tool errors, with "${y[0]}" being the most common (${y[1]}). Hooks can auto-run type-checks or linters after every edit to catch errors immediately.`,example_code:'Add to .claude/settings.json: {"hooks": {"PostToolUse": [{"matcher": "Edit|Write", "hooks": [{"type": "command", "command": "pnpm type-check 2>&1 | head -5"}]}]}}'})}if(e.totalMessages>100&&e.totalSessions>=10&&t.push({feature:"Headless Mode",one_liner:"Run Claude non-interactively for batch tasks",why_for_you:`With ${e.totalMessages} messages across ${e.totalSessions} sessions, you could automate repetitive tasks using headless mode.`,example_code:"claude -p 'Run pnpm type-check and pnpm test. Report only failures with file paths and line numbers.' --allowedTools 'Bash,Read,Grep'"}),Object.values(e.friction).reduce((y,v)=>y+v,0)>5){let v=Object.entries(e.friction).sort(([,h],[,f])=>f-h).slice(0,2).map(([h,f])=>`${h.replace(/_/g," ")} (${f}x)`).join(", ");n.push({title:"Reduce Friction with Structured Prompts",suggestion:`Your top friction points are: ${v}. Giving Claude more context upfront reduces back-and-forth.`,detail:"Start each session with a clear goal statement and constraints.",copyable_prompt:"This session has ONE goal: [describe goal]. Before making any changes, read the relevant files and explain your plan. Do not modify code until I approve the approach."})}e.sessionsWithAnalysis<e.totalSessions*.3&&e.totalSessions>=5&&n.push({title:"Enrich Sessions for Better Insights",suggestion:`Only ${e.sessionsWithAnalysis} of ${e.totalSessions} sessions have quality analysis. Enriching them unlocks outcome tracking, friction detection, and deeper recommendations.`,detail:"Sessions are analyzed automatically by the background worker. Start it with `rulemetric evals agent` (or use the Regenerate button on the dashboard) and enrichment catches up on its own.",copyable_prompt:"rulemetric evals agent"});let o=(e.outcomes.not_achieved??0)+(e.outcomes.partially_achieved??0),s=Object.values(e.outcomes).reduce((y,v)=>y+v,0);s>5&&o/s>.3&&n.push({title:"Scope Sessions to One Goal",suggestion:`${Math.round(o/s*100)}% of analyzed sessions didn't fully achieve their goal. Breaking work into focused, single-goal sessions improves success rates.`,detail:"Start each session with a clear, narrow objective.",copyable_prompt:"This session has ONE goal: [describe specific goal]. Do not touch any other code. When this specific task is done and verified, stop."});let i=[];e.totalToolErrors>10&&i.push({skillId:"type-check-hook",reason:`You had ${e.totalToolErrors} tool errors. This hook auto-runs type-check after every edit to catch them immediately.`});let a=e.friction.wrong_approach??0,c=e.friction.buggy_code??0;a+c>3&&i.push({skillId:"structured-debugging",reason:`${a+c} sessions had wrong-approach or buggy-code friction. Structured debugging prevents spiraling.`}),((e.toolErrorCategories.test_failure??e.toolErrorCategories.assertion??0)>3||(e.friction.buggy_code??0)>2)&&i.push({skillId:"tdd-workflow",reason:"Frequent test failures or buggy code suggest adopting red-green-refactor discipline."});let p=e.friction.excessive_changes??0;return p>2&&i.push({skillId:"git-commit-conventions",reason:`${p} sessions had excessive changes. Conventional commits enforce focused, atomic changes.`}),Object.entries(e.toolErrorCategories).filter(([y])=>y.includes("auth")||y.includes("security")||y.includes("permission")).reduce((y,[,v])=>y+v,0)>0&&i.push({skillId:"security-review",reason:"Security-related errors detected. A security review checklist catches vulnerabilities before they ship."}),t.length===0&&n.length===0&&i.length===0?null:{suggestions:{features_to_try:t,usage_patterns:n,claude_md_additions:[]},recommended_skills:i.length>0?i:void 0,_auto_generated:!0}}d(wM,"generateAutoSuggestions");var vM=45e3,Hl=new Map,IM=bl();Kc.get("/insights/compute",async e=>{let t=e.get("userId"),n=e.req.query("projectPath"),r=e.req.query("projectId"),o=e.req.query("since"),s=e.req.query("until"),i=e.req.query("tool"),a=`${t}:${r??n??""}:${o??""}:${s??""}:${i??""}`,c=Hl.get(a),p=(c&&Date.now()-c.at<vM?c.data:null)??await IM.run(a,async()=>{let v=[Po(_.userId,t)];r?v.push(Po(_.projectId,r)):n&&v.push(sS(_.projectPath,`%${ot(n)}%`)),i&&v.push(Po(_.tool,i)),o&&v.push(_M(_.startedAt,new Date(o))),s&&v.push(yM(_.startedAt,new Date(s)));let h=500,f=await nt.select({id:_.id,externalSessionId:_.externalSessionId,tool:_.tool,projectPath:_.projectPath,startedAt:_.startedAt,endedAt:_.endedAt,eventCount:_.eventCount,tokenUsage:_.tokenUsage,analysis:_.analysis,analyzedAt:_.analyzedAt,metadata:_.metadata}).from(_).where(Vg(...v)).orderBy(Jg(_.startedAt)).limit(h),w=1e6,b=d(async(V,ge,ze)=>{let Fe=await oS(ge,ze),et=V.input_tokens??0,Bt=V.output_tokens??0,gn=V.cache_read_input_tokens??0,en=(V.cache_creation_5m??0)+(V.cache_creation_input_tokens??0),Bn=V.cache_creation_1h??0,it=et*Fe.inputPerM/w,It=Bt*Fe.outputPerM/w,yt=gn*Fe.cacheReadPerM/w,an=en*Fe.cacheWrite5mPerM/w+Bn*Fe.cacheWrite1hPerM/w,Ko=Math.round((it+It+yt+an)*100)/100;return{inputUsd:it,outputUsd:It,cacheReadUsd:yt,cacheWriteUsd:an,totalUsd:Ko,estimated:Fe.estimated}},"getPriced"),I={},S={},A={},E={},R={},D={},j={},P={},$={},H={},B=[],te=[],_e=[],ee=0,Re=0,N=0,me=0,M=0,ue=0,lt=0,Be=0,re=0,he=0,C=0,oe=0,ve=0,Ce=0,Te=0,Ye=0,Ht=0,jr=0,Jo=0,Zr=0,Sp=0,Gh=0,Kh=0,Yh=0,_a=null,ya=null,yE=Date.now()-720*60*60*1e3,Ap=[],vd="claude-sonnet-4-6",Id=d(()=>({input_tokens:0,output_tokens:0,cache_read_tokens:0,cache_write_tokens:0,cost_usd:0}),"newBucket"),bd=d((V,ge,ze,Fe,et,Bt)=>{V.input_tokens+=ge,V.output_tokens+=ze,V.cache_read_tokens+=Fe,V.cache_write_tokens+=et,V.cost_usd+=Bt},"accumulateBucket"),wa={},va={},wE=new Map(f.map(V=>[V.id,V.startedAt])),vE=new Map(f.map(V=>[V.id,V.tool??"unknown"])),Xh=new Set,Qh=f.length>0?await nt.execute(Yi`
|
|
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`
|
|
1040
959
|
SELECT
|
|
1041
960
|
deduped.session_id AS "sessionId",
|
|
1042
|
-
COALESCE(deduped.model, ${
|
|
961
|
+
COALESCE(deduped.model, ${Iu}) AS "model",
|
|
1043
962
|
COALESCE(SUM(COALESCE((deduped.token_usage->>'input_tokens')::bigint, (deduped.token_usage->>'input')::bigint)), 0)::bigint AS "inputTokens",
|
|
1044
963
|
COALESCE(SUM(COALESCE((deduped.token_usage->>'output_tokens')::bigint, (deduped.token_usage->>'output')::bigint)), 0)::bigint AS "outputTokens",
|
|
1045
964
|
COALESCE(SUM(COALESCE((deduped.token_usage->>'cache_read_input_tokens')::bigint, (deduped.token_usage->>'cacheRead')::bigint)), 0)::bigint AS "cacheReadTokens",
|
|
@@ -1050,29 +969,32 @@ ${r}`).digest("hex")}d(Z0,"recommendationEntryHash");var tM=new Set(["42883","42
|
|
|
1050
969
|
SELECT DISTINCT ON (se.session_id, COALESCE(se.metadata->>'requestId', se.id::text))
|
|
1051
970
|
se.session_id, se.model, se.token_usage
|
|
1052
971
|
FROM session_events se
|
|
1053
|
-
WHERE se.session_id IN (${
|
|
972
|
+
WHERE se.session_id IN (${Gi.join(f.map(z=>Gi`${z.id}`),Gi`, `)})
|
|
1054
973
|
AND se.token_usage IS NOT NULL
|
|
1055
974
|
ORDER BY se.session_id, COALESCE(se.metadata->>'requestId', se.id::text), se.sequence
|
|
1056
975
|
) deduped
|
|
1057
976
|
GROUP BY deduped.session_id, deduped.model
|
|
1058
|
-
`):[];for(let V of Qh)Xh.add(V.sessionId);for(let V of f){let ge=V.metadata?.local_session_meta,ze=V.analysis,Fe=V.tokenUsage;if(V.tool&&(S[V.tool]=(S[V.tool]||0)+1),V.projectPath){let et=V.projectPath.split("/").pop()??V.projectPath;E[et]=(E[et]||0)+1}if(Fe&&!Xh.has(V.id)){let et=Fe.input_tokens??0,Bt=Fe.output_tokens??0,gn=Fe.cache_read_input_tokens??0,en=Fe.cache_creation_5m??0,Bn=Fe.cache_creation_1h??0,it=Fe.cache_creation_input_tokens??0,It=en+Bn||it;N+=et,me+=Bt,M+=gn,ue+=It;let yt=await b(Fe,vd,V.startedAt);lt+=yt.inputUsd,Be+=yt.outputUsd,re+=yt.cacheReadUsd,he+=yt.cacheWriteUsd;let an=yt.inputUsd+yt.outputUsd+yt.cacheReadUsd+yt.cacheWriteUsd,Ko=V.tool??"unknown",n_=wa[vd]??Id();bd(n_,et,Bt,gn,It,an),wa[vd]=n_;let r_=va[Ko]??Id();bd(r_,et,Bt,gn,It,an),va[Ko]=r_}if(ge){jr++;let et=ge.user_message_count??0;ee+=et,Re+=(ge.duration_minutes??0)/60,C+=ge.git_commits??0,oe+=ge.git_pushes??0,ve+=ge.lines_added??0,Ce+=ge.lines_removed??0,Te+=ge.files_modified??0,Ye+=ge.tool_errors??0;let Bt=ge.tool_counts;if(Bt)for(let[yt,an]of Object.entries(Bt))I[yt]=(I[yt]||0)+an;let gn=ge.languages;if(gn)for(let[yt,an]of Object.entries(gn))A[yt]=(A[yt]||0)+an;let en=ge.message_hours;en&&B.push(...en);let Bn=ge.tool_error_categories;if(Bn)for(let[yt,an]of Object.entries(Bn))H[yt]=(H[yt]||0)+an;let it=ge.user_response_times;it&&te.push(...it),Ht+=ge.user_interruptions??0,ge.uses_task_agent&&Zr++,ge.uses_mcp&&Sp++;let It=ge.user_message_timestamps;It&&It.length>0&&_e.push({id:V.id,start:V.startedAt.toISOString(),timestamps:It})}if(ze)if(V.analyzedAt){Gh++;let et=new Date(V.analyzedAt).getTime();(_a===null||et<_a)&&(_a=et),(ya===null||et>ya)&&(ya=et),et<yE&&Yh++}else Kh++;if(ze){Jo++;let et=ze.goal_categories;if(et)for(let[it,It]of Object.entries(et))It>0&&(R[it]=(R[it]||0)+It);let Bt=ze.outcome;Bt&&(D[Bt]=(D[Bt]||0)+1);let gn=ze.user_satisfaction;if(gn)for(let[it,It]of Object.entries(gn))It>0&&(j[it]=(j[it]||0)+It);let en=ze.session_type;en&&(P[en]=(P[en]||0)+1);let Bn=ze.friction??ze.friction_counts;if(Bn)for(let[it,It]of Object.entries(Bn))It>0&&($[it]=($[it]||0)+It);Ap.length<50&&Ap.push({id:V.id,externalId:V.externalSessionId,date:V.startedAt.toISOString().split("T")[0]??"",summary:ze.brief_summary??"",goal:ze.underlying_goal,outcome:Bt})}}let Sd=f.map(V=>V.startedAt.toISOString()).sort(),Ep=new Set(Sd.map(V=>V.split("T")[0]));for(let V of Qh){let ge=Number(V.inputTokens)||0,ze=Number(V.outputTokens)||0,Fe=Number(V.cacheReadTokens)||0,et=Number(V.cacheWrite5m)||0,Bt=Number(V.cacheWrite1h)||0,gn=Number(V.cacheWriteLegacy)||0,en=et+Bt||gn,Bn=wE.get(V.sessionId)??new Date,it=await b({input_tokens:ge,output_tokens:ze,cache_read_input_tokens:Fe,cache_creation_input_tokens:en},V.model,Bn);lt+=it.inputUsd,Be+=it.outputUsd,re+=it.cacheReadUsd,he+=it.cacheWriteUsd,N+=ge,me+=ze,M+=Fe,ue+=en;let It=it.inputUsd+it.outputUsd+it.cacheReadUsd+it.cacheWriteUsd,yt=wa[V.model]??Id();bd(yt,ge,ze,Fe,en,It),wa[V.model]=yt;let an=vE.get(V.sessionId)??"unknown",Ko=va[an]??Id();bd(Ko,ge,ze,Fe,en,It),va[an]=Ko}let Go=d(V=>Math.round(V*100)/100,"round2"),IE=lt+Be+re+he,bE=Go(IE),SE={inputUsd:Go(lt),outputUsd:Go(Be),cacheReadUsd:Go(re),cacheWriteUsd:Go(he)},xp={};for(let[V,ge]of Object.entries(wa))xp[V]={input_tokens:ge.input_tokens,output_tokens:ge.output_tokens,cache_read_tokens:ge.cache_read_tokens,cache_write_tokens:ge.cache_write_tokens,cost_usd:Go(ge.cost_usd)};let Tp={};for(let[V,ge]of Object.entries(va))Tp[V]={input_tokens:ge.input_tokens,output_tokens:ge.output_tokens,cache_read_tokens:ge.cache_read_tokens,cache_write_tokens:ge.cache_write_tokens,cost_usd:Go(ge.cost_usd)};let eo={"2-10s":0,"10-30s":0,"30s-1m":0,"1-2m":0,"2-5m":0,"5-15m":0,">15m":0};for(let V of te)V<10?eo["2-10s"]++:V<30?eo["10-30s"]++:V<60?eo["30s-1m"]++:V<120?eo["1-2m"]++:V<300?eo["2-5m"]++:V<900?eo["5-15m"]++:eo[">15m"]++;let Ls=[...te].sort((V,ge)=>V-ge),AE=Ls.length>0?Ls[Math.floor(Ls.length/2)]:0,EE=Ls.length>0?Ls.reduce((V,ge)=>V+ge,0)/Ls.length:0,Zh=0,e_=0;if(_e.length>1){let V=_e.flatMap(ze=>ze.timestamps.map(Fe=>({sessionId:ze.id,time:new Date(Fe).getTime()}))).sort((ze,Fe)=>ze.time-Fe.time),ge=new Set;for(let ze=0;ze<V.length-1;ze++){let Fe=V[ze],et=V[ze+1];Fe.sessionId!==et.sessionId&&et.time-Fe.time<1800*1e3&&(ge.add(Fe.sessionId),ge.add(et.sessionId),Zh++)}e_=ge.size}let $s={computed:!0,total_sessions:f.length,window:{since:o??null,until:s??null},truncated:f.length>=h,sessions_with_meta:jr,sessions_with_analysis:Jo,tools_used:S,date_range:{start:Sd[0]?.split("T")[0]??"",end:Sd[Sd.length-1]?.split("T")[0]??""},total_messages:ee,total_duration_hours:Math.round(Re*10)/10,total_input_tokens:N,total_output_tokens:me,total_cache_read_tokens:M,total_cache_write_tokens:ue,estimated_cost_usd:bE,estimated_cost_breakdown:SE,estimated_cost_by_model:Object.keys(xp).length>0?xp:void 0,estimated_cost_by_tool:Object.keys(Tp).length>0?Tp:void 0,tool_counts:I,languages:A,git_commits:C,git_pushes:oe,projects:E,goal_categories:R,outcomes:D,satisfaction:j,session_types:P,friction:$,tool_error_categories:H,session_summaries:Ap,total_tool_errors:Ye,total_interruptions:Ht,total_lines_added:ve,total_lines_removed:Ce,total_files_modified:Te,days_active:Ep.size,messages_per_day:Ep.size>0?Math.round(ee/Ep.size*10)/10:0,message_hours:B,sessions_using_task_agent:Zr,sessions_using_mcp:Sp,response_time:{median_seconds:Math.round(AE*10)/10,avg_seconds:Math.round(EE*10)/10,histogram:eo,total_samples:te.length},parallel_sessions:{events:Zh,sessions_involved:e_},analysis_freshness:{with_timestamp:Gh,pre_instrumentation:Kh,stale_30d:Yh,oldest_analyzed_at:_a?new Date(_a).toISOString():null,newest_analyzed_at:ya?new Date(ya).toISOString():null}};$s.autoAddAvailable=!!(n&&fM.existsSync(gM.join(n,"CLAUDE.md")));let Ad=[Po(W.userId,t),Po(W.status,"completed")];r?Ad.push(Po(W.projectId,r)):n?Ad.push(sS(W.projectPath,`%${ot(n)}%`)):Ad.push(Yi`${W.projectPath} IS NULL`);let[t_]=await nt.select({id:W.id,result:W.result}).from(W).where(Vg(...Ad)).orderBy(Jg(W.completedAt)).limit(1),xE=t_?.result,Rp=Zm(xE?.recommendations);if(Rp&&Object.keys(Rp).length>0)$s.recommendations=Rp,$s._recsJobId=t_?.id??null;else if(f.length>=3){let V=wM({totalSessions:f.length,sessionsWithAnalysis:Jo,toolCounts:I,toolErrorCategories:H,friction:$,outcomes:D,sessionsUsingMcp:Sp,sessionsUsingTaskAgent:Zr,totalToolErrors:Ye,totalMessages:ee,totalDurationHours:Re});V&&($s.recommendations=V)}return Hl.size>1e3&&Hl.clear(),Hl.set(a,{at:Date.now(),data:$s}),$s}),{_recsJobId:m,...y}=p;if(y.recommendations)try{y.recommendations=await eS({userId:t,projectPath:n,jobId:m??null,recs:y.recommendations})}catch{}return e.json(y)});Kc.get("/insights/recommendations/history",async e=>{let t=e.get("userId"),n=e.req.query("projectPath")??"",r=await u.select({category:Ee.category,label:Ee.label,timesGenerated:Ee.timesGenerated,dismissedAt:Ee.dismissedAt,lastSeenAt:Ee.lastSeenAt}).from(Ee).where(Vg(Po(Ee.userId,t),Po(Ee.projectPath,n))).orderBy(Yi`${Ee.dismissedAt} IS NULL`,Jg(Ee.timesGenerated)).limit(40);return e.json({dismissed:r.filter(o=>o.dismissedAt!==null&&o.label!=="").map(o=>({category:o.category,label:o.label,dismissedAt:o.dismissedAt})),repeated:r.filter(o=>o.dismissedAt===null&&o.timesGenerated>=2&&o.label!=="").map(o=>({category:o.category,label:o.label,timesGenerated:o.timesGenerated}))})});Kc.post("/insights/recommendations/dismiss",async e=>{let t=e.get("userId"),n=await e.req.json().catch(()=>({})),r=typeof n.contentHash=="string"?n.contentHash:"";if(!/^[0-9a-f]{64}$/.test(r))return e.json({error:"contentHash must be the 64-hex entry id from the compute response"},400);let o=typeof n.projectPath=="string"?n.projectPath:void 0;return await tS({userId:t,projectPath:o,contentHash:r}),e.json({ok:!0})});O();import{Hono as bM}from"hono";import{and as En,count as SM,eq as Pe,ilike as AM,inArray as EM,sql as pn}from"drizzle-orm";ls();var Ts=new bM,xs=d(e=>us(e?.outcome??null),"scoreOf");Ts.get("/insights/linked-instructions",async e=>{let t=e.get("userId"),n=e.req.query("projectPath"),r=Number(e.req.query("limit")??20),o=[Pe(_.userId,t)];n&&o.push(AM(_.projectPath,`%${ot(n)}%`));let s=await u.select({id:g.id,name:g.name,contentHash:g.contentHash,source:pn`${g.frontmatter}->>'source'`,linkedSessions:pn`COUNT(DISTINCT ${se.sessionId})`}).from(se).innerJoin(_,Pe(_.id,se.sessionId)).innerJoin(g,Pe(g.id,se.instructionId)).where(En(...o)).groupBy(g.id,g.name,g.contentHash,pn`${g.frontmatter}->>'source'`).orderBy(pn`COUNT(DISTINCT ${se.sessionId}) DESC`).limit(r);return e.json(s.map(i=>({id:i.id,name:i.name,contentHash:i.contentHash,source:i.source,linkedSessions:Number(i.linkedSessions)})))});Ts.get("/insights/instruction-impact",async e=>{let t=e.get("userId"),n=e.req.query("instructionId");if(!n)return e.json({error:"instructionId query param required"},400);let r=await u.select({id:_.id,projectId:_.projectId,model:_.model,tool:_.tool,tokenUsage:_.tokenUsage,analysis:_.analysis,metadata:_.metadata,eventCount:_.eventCount,startedAt:_.startedAt}).from(_).innerJoin(Z,Pe(Z.sessionId,_.id)).where(En(Pe(_.userId,t),Pe(Z.treatmentType,"instruction"),Pe(Z.treatmentId,n))),o=r.map(M=>M.id),s=await u.select({id:_.id,projectId:_.projectId,model:_.model,tool:_.tool,tokenUsage:_.tokenUsage,analysis:_.analysis,metadata:_.metadata,eventCount:_.eventCount,startedAt:_.startedAt}).from(_).where(En(Pe(_.userId,t),pn`${_.analysis} IS NOT NULL`)),i=await u.selectDistinct({sessionId:Z.sessionId}).from(Z).where(En(Pe(Z.userId,t),Pe(Z.treatmentType,"instruction"))),a=new Set(i.map(M=>M.sessionId)),c=new Set(o),l=s.filter(M=>!c.has(M.id)&&a.has(M.id));function p(M){let ue=0,lt=0,Be=0,re=0,he=[],C={},oe={achieved:1,fully_achieved:1,mostly_achieved:.75,partially_achieved:.5,unclear_from_transcript:.25,not_achieved:0,abandoned:0};for(let ve of M){let Ce=ve.analysis,Te=ve.metadata?.local_session_meta;if(Ce?.outcome){let Ht=oe[Ce.outcome];Ht!==void 0&&he.push(Ht)}Te&&(re++,ue+=Te.tool_errors??0,lt+=Te.duration_minutes??0,Be+=(Te.lines_added??0)+(Te.lines_removed??0));let Ye=Ce?.goal_categories??{};for(let[Ht,jr]of Object.entries(Ye))jr>0&&(C[Ht]=(C[Ht]||0)+jr)}return{sessionCount:M.length,enrichedCount:re,outcomeScores:he,avgOutcomeScore:he.length>0?Math.round(he.reduce((ve,Ce)=>ve+Ce,0)/he.length*100)/100:null,avgToolErrors:re>0?Math.round(ue/re*10)/10:null,avgDurationMinutes:re>0?Math.round(lt/re*10)/10:null,avgLinesChanged:re>0?Math.round(Be/re):null,topGoalCategories:C}}d(p,"computeCohort");let m=p(r),y=p(l),v=d(M=>{if(!M)return"(no-date)";let ue=typeof M=="string"?new Date(M):M;return Number.isNaN(ue.getTime())?"(no-date)":`${ue.getUTCFullYear()}-${String(ue.getUTCMonth()+1).padStart(2,"0")}`},"monthKey"),h=d(M=>{if(!M)return 0;let ue=typeof M=="string"?new Date(M):M;return Number.isNaN(ue.getTime())?0:ue.getTime()},"timeOf"),f=new Map,w=d((M,ue,lt,Be)=>{let re=`${M??"(no-project)"}|${v(ue)}`,he=f.get(re);he||(he={key:re,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},f.set(re,he)),(Be?he.withScores:he.withoutScores).push(lt),(Be?he.withTimes:he.withoutTimes).push(h(ue))},"addToStratum");for(let M of r){let ue=xs(M.analysis);ue!=null&&w(M.projectId,M.startedAt,ue,!0)}for(let M of l){let ue=xs(M.analysis);ue!=null&&w(M.projectId,M.startedAt,ue,!1)}let b=d(M=>{let ue=new Map,lt=new Set,Be=d((re,he,C,oe,ve)=>{let Ce=ue.get(re);Ce||(Ce=new Map,ue.set(re,Ce));let Te=`${he??"(no-project)"}|${v(C)}`,Ye=Ce.get(Te);Ye||(Ye={key:Te,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},Ce.set(Te,Ye)),(ve?Ye.withScores:Ye.withoutScores).push(oe),(ve?Ye.withTimes:Ye.withoutTimes).push(h(C))},"add");for(let re of r){let he=xs(re.analysis),C=M(re);he==null||!C||(lt.add(C),Be(C,re.projectId,re.startedAt,he,!0))}for(let re of l){let he=xs(re.analysis),C=M(re);he==null||!C||!lt.has(C)||Be(C,re.projectId,re.startedAt,he,!1)}return[...lt].map(re=>({segment:re,strata:[...ue.get(re)?.values()??[]]}))},"buildAxisSegments"),I=d(M=>[...M].sort((ue,lt)=>Number(lt.verdict.sufficient)-Number(ue.verdict.sufficient)||lt.verdict.nWith-ue.verdict.nWith),"sortSegs"),S=bf([...f.values()],b(M=>gs(M.model))),A=S.overall,E=I(S.segments).map(M=>({model:M.segment,verdict:M.verdict})),R=I($u(b(M=>M.tool??null))).map(M=>({harness:M.segment,verdict:M.verdict})),{outcomeScores:D,...j}=m,{outcomeScores:P,...$}=y,[H]=await u.select({name:g.name}).from(g).where(Pe(g.id,n)).limit(1),[B]=await u.select({n:SM(),lastAssignedAt:pn`max(${jt.assignedAt})`}).from(jt).where(En(Pe(jt.userId,t),Pe(jt.treatmentType,"instruction"),Pe(jt.treatmentId,n),Pe(jt.method,"auto_added"))),te=B&&Number(B.n)>0?{count:Number(B.n),lastAssignedAt:B.lastAssignedAt}:null,[_e]=await u.select({content:g.content,name:g.name}).from(g).where(Pe(g.id,n)),ee=Ur(_e?.content,_e?.name),Re=ee?(await u.select({projectPath:Y.projectPath,decision:Y.decision,delta:Y.delta,ciLower:Y.ciLower,ciUpper:Y.ciUpper,nTreated:Y.nTreated,nControl:Y.nControl,segment:Y.segment,decidedAt:Y.decidedAt}).from(Y).where(En(Pe(Y.userId,t),Pe(Y.instructionId,n),Pe(Y.contentHash,ee)))).map(M=>({projectPath:M.projectPath,decision:M.decision,delta:Number(M.delta),ciLower:Number(M.ciLower),ciUpper:Number(M.ciUpper),nTreated:M.nTreated,nControl:M.nControl,segment:M.segment,decidedAt:M.decidedAt})):[],N=await u.select({id:q.id,projectPath:q.projectPath,source:q.source,status:q.status}).from(q).where(En(Pe(q.userId,t),Pe(q.instructionId,n),Pe(q.status,"running"))),me=Re.length>0||N.length>0?{verdicts:Re,experiments:N}:null;return e.json({instructionId:n,instructionName:H?.name??"Unknown",verdict:A,segments:E,harnessSegments:R,autoAdded:te,randomised:me,with:j,without:$,comparison:{outcomeScoreDelta:m.avgOutcomeScore!=null&&y.avgOutcomeScore!=null?Math.round((m.avgOutcomeScore-y.avgOutcomeScore)*100)/100:null,toolErrorsDelta:m.avgToolErrors!=null&&y.avgToolErrors!=null?Math.round((m.avgToolErrors-y.avgToolErrors)*10)/10:null,durationDelta:m.avgDurationMinutes!=null&&y.avgDurationMinutes!=null?Math.round((m.avgDurationMinutes-y.avgDurationMinutes)*10)/10:null}})});Ts.get("/insights/instruction-version-impact",async e=>{let t=e.get("userId"),n=e.req.query("instructionId");if(!n)return e.json({error:"instructionId query param required"},400);let r=await u.select({versionOrdinal:sr.versionOrdinal,contentHash:sr.contentHash,firstSeenAt:sr.firstSeenAt,contentLength:pn`COALESCE(LENGTH(${sr.content}), 0)::int`}).from(sr).where(Pe(sr.instructionId,n)).orderBy(sr.versionOrdinal),o=await u.select({id:_.id,projectId:_.projectId,analysis:_.analysis,startedAt:_.startedAt,version:Z.treatmentVersion}).from(_).innerJoin(Z,Pe(Z.sessionId,_.id)).where(En(Pe(_.userId,t),Pe(Z.treatmentType,"instruction"),Pe(Z.treatmentId,n),pn`${Z.treatmentVersion} > 0`)),s=new Map;for(let I of o){let S=s.get(I.version)??[];S.push(I),s.set(I.version,S)}let i=r.map(I=>({version:I.versionOrdinal,contentHash:I.contentHash,firstSeenAt:I.firstSeenAt,sessions:s.get(I.versionOrdinal)?.length??0,replayable:Number(I.contentLength)>0})),a=i.filter(I=>I.sessions>0).map(I=>I.version).sort((I,S)=>I-S),c=Number(e.req.query("version")),l=Number(e.req.query("baselineVersion")),p=Number.isFinite(c)&&c>0?c:a.at(-1),m=Number.isFinite(l)&&l>0?l:a.filter(I=>I!==p).at(-1);if(p==null||m==null)return e.json({instructionId:n,versions:i,version:p??null,baselineVersion:m??null,verdict:null,insufficientReason:"only one version of this instruction has attributed sessions; there is no prior version to compare against"});let y=d(I=>{if(!I)return"(no-date)";let S=typeof I=="string"?new Date(I):I;return Number.isNaN(S.getTime())?"(no-date)":`${S.getUTCFullYear()}-${String(S.getUTCMonth()+1).padStart(2,"0")}`},"monthKey"),v=d(I=>{if(!I)return 0;let S=typeof I=="string"?new Date(I):I;return Number.isNaN(S.getTime())?0:S.getTime()},"timeOf"),h=new Map,f=d((I,S)=>{let A=xs(I.analysis);if(A==null)return;let E=`${I.projectId??"(no-project)"}|${y(I.startedAt)}`,R=h.get(E);R||(R={key:E,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},h.set(E,R)),(S?R.withScores:R.withoutScores).push(A),(S?R.withTimes:R.withoutTimes).push(v(I.startedAt))},"add");for(let I of s.get(p)??[])f(I,!0);for(let I of s.get(m)??[])f(I,!1);let w=In([...h.values()],{baseline:"prior-version"}),[b]=await u.select({name:g.name}).from(g).where(Pe(g.id,n)).limit(1);return e.json({instructionId:n,instructionName:b?.name??"Unknown",version:p,baselineVersion:m,versions:i,verdict:w,replayableVersions:i.filter(I=>I.replayable).length})});Ts.get("/insights/memory-impact",async e=>{let t=e.get("userId"),n=e.req.query("memoryId");if(!n)return e.json({error:"memoryId query param required"},400);let[r]=await u.select({id:F.id,title:F.title,kind:F.kind,version:F.version,status:F.status}).from(F).where(En(Pe(F.id,n),Pe(F.userId,t))).limit(1);if(!r)return e.json({error:"memory not found"},404);let o=await u.select({sessionId:Z.sessionId,treatmentVersion:Z.treatmentVersion}).from(Z).where(En(Pe(Z.userId,t),Pe(Z.treatmentType,"memory"),Pe(Z.treatmentId,n))),s=new Map,i=new Set;for(let f of o){let w=s.get(f.treatmentVersion);w||(w=new Set,s.set(f.treatmentVersion,w)),w.add(f.sessionId),i.add(f.sessionId)}let a=await u.select({id:_.id,projectId:_.projectId,outcome:pn`${_.analysis}->>'outcome'`,startedAt:_.startedAt,inputTokens:pn`coalesce((${_.tokenUsage}->>'input_tokens')::numeric, 0)`,outputTokens:pn`coalesce((${_.tokenUsage}->>'output_tokens')::numeric, 0)`}).from(_).where(En(Pe(_.userId,t),pn`${_.analysis} is not null`)).orderBy(_.id),c=d((f,w)=>w>0?Math.round(f/w*100)/100:null,"avg"),l=d(()=>({n:0,scoreSum:0,scoreN:0,tokenSum:0}),"cohort"),p=d(f=>f.n>0?Math.round(f.tokenSum/f.n):null,"avgTokens"),m=d(f=>{let w=s.get(f)??new Set,b=new Map,I=l(),S=l();for(let j of a){let P=w.has(j.id);if(!P&&i.has(j.id))continue;let $=P?I:S;$.n++,$.tokenSum+=Number(j.inputTokens)+Number(j.outputTokens);let H=xs({outcome:j.outcome});if(H!=null){$.scoreSum+=H,$.scoreN++;let B=j.projectId??"(no-project)",te=b.get(B);te||(te={key:B,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},b.set(B,te)),(P?te.withScores:te.withoutScores).push(H),(P?te.withTimes:te.withoutTimes).push(j.startedAt?.getTime()??0)}}let A=In([...b.values()]),E={sessionCount:I.n,avgOutcomeScore:c(I.scoreSum,I.scoreN),avgTotalTokens:p(I)},R={sessionCount:S.n,avgOutcomeScore:c(S.scoreSum,S.scoreN),avgTotalTokens:p(S)},D={outcomeScoreDelta:E.avgOutcomeScore!=null&&R.avgOutcomeScore!=null?Math.round((E.avgOutcomeScore-R.avgOutcomeScore)*100)/100:null,totalTokensDelta:E.avgTotalTokens!=null&&R.avgTotalTokens!=null?E.avgTotalTokens-R.avgTotalTokens:null};return{verdict:A,with:E,without:R,comparison:D}},"computeVersion"),v=[...new Set([r.version,...s.keys()])].sort((f,w)=>w-f).map(f=>({version:f,isCurrent:f===r.version,...m(f)})),h=v.find(f=>f.isCurrent);return e.json({memoryId:n,memoryTitle:r.title,memoryKind:r.kind,memoryVersion:r.version,verdict:h.verdict,with:h.with,without:h.without,comparison:h.comparison,versions:v.map(({version:f,isCurrent:w,verdict:b,with:I,without:S})=>({version:f,isCurrent:w,verdict:b,with:I,without:S})),cost:{estimated:!0}})});var xM=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;Ts.get("/insights/suggestion-impact",async e=>{let t=e.get("userId"),n=e.req.query("instructionIds")??e.req.query("instructionId")??"",r=[...new Set(n.split(",").map(l=>l.trim()).filter(l=>xM.test(l)))].slice(0,200);if(r.length===0)return e.json({error:"instructionIds query param (comma-separated uuids) required"},400);let o=await u.select({sessionId:Z.sessionId,treatmentId:Z.treatmentId}).from(Z).where(En(Pe(Z.userId,t),Pe(Z.treatmentType,"suggestion"),EM(Z.treatmentId,r))),s=new Map;for(let l of o){let p=s.get(l.treatmentId);p||(p=new Set,s.set(l.treatmentId,p)),p.add(l.sessionId)}let a=(await u.select({id:_.id,projectId:_.projectId,outcome:pn`${_.analysis}->>'outcome'`,startedAt:_.startedAt}).from(_).where(En(Pe(_.userId,t),pn`${_.analysis} is not null`)).orderBy(_.id)).map(l=>({id:l.id,key:l.projectId??"(no-project)",score:xs({outcome:l.outcome}),time:l.startedAt?.getTime()??0})).filter(l=>l.score!=null),c={};for(let l of r){let p=s.get(l);if(!p||p.size===0){c[l]=In([]);continue}let m=new Map;for(let y of a){let v=m.get(y.key);v||(v={key:y.key,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},m.set(y.key,v));let h=p.has(y.id);(h?v.withScores:v.withoutScores).push(y.score),(h?v.withTimes:v.withoutTimes).push(y.time)}c[l]=In([...m.values()],{iterations:2e3})}return e.json({impacts:c})});O();import{Hono as TM}from"hono";import{and as Rs,count as Gg,eq as xn,inArray as iS,sql as Wr}from"drizzle-orm";var Yg=new TM,Kg=/force[- ]?push|rm\s+-rf|git\s+reset\s+--hard|drop\s+table|truncate\b|--no-verify|chmod\s+777|\bsudo\b|secret|credential|password|api[- ]?key|never\s+(delete|drop|force|push|commit|run|deploy)|do\s+not\s+(delete|drop|force|push|commit|run|deploy)/i;Yg.get("/insights/groom-candidates",async e=>{let t=e.get("userId"),[n]=await u.select({n:Gg()}).from(_).where(Rs(xn(_.userId,t),Wr`${_.startedAt} > now() - interval '7 days'`));if(Number(n?.n??0)===0)return e.json({captureHealthy:!1,reason:'No sessions captured in the last 7 days \u2014 cannot tell "unused" from "uncaptured". Grooming paused (never trust a dark pipeline).',candidates:[],harmful:[],safetyGuarded:0,harmfulSafetyGuarded:0,bloated:[],trimSafetyFlagged:0});let[r,o,s,i]=await Promise.all([u.select({id:g.id,name:g.name,type:g.type,content:g.content,lastExposedAt:Wr`max(${Z.exposedAt})`,totalExposures:Gg(Z.id)}).from(g).leftJoin(Z,Rs(xn(Z.treatmentId,g.id),xn(Z.userId,t))).where(Rs(xn(g.createdBy,t),xn(g.archived,!1),Wr`${g.createdAt} < now() - interval '30 days'`)).groupBy(g.id).having(Wr`max(${Z.exposedAt}) is null or max(${Z.exposedAt}) < now() - interval '30 days'`),u.select({id:g.id,name:g.name,type:g.type}).from(g).where(Rs(xn(g.createdBy,t),xn(g.archived,!1))),u.select({treatmentId:Z.treatmentId,sessionId:Z.sessionId}).from(Z).where(Rs(xn(Z.userId,t),xn(Z.treatmentType,"instruction"),Wr`${Z.sessionId} is not null`)),u.select({id:_.id,projectId:_.projectId,outcome:Wr`${_.analysis}->>'outcome'`,startedAt:_.startedAt}).from(_).where(Rs(xn(_.userId,t),Wr`${_.analysis} is not null`))]),a=await u.select({treatmentId:Z.treatmentId,projectId:_.projectId,n:Gg()}).from(Z).innerJoin(_,xn(_.id,Z.sessionId)).where(Rs(xn(Z.userId,t),xn(Z.treatmentType,"instruction"),Wr`${_.projectId} is not null`)).groupBy(Z.treatmentId,_.projectId),c=new Map;for(let j of a){if(!j.projectId)continue;let P=Number(j.n),$=c.get(j.treatmentId);(!$||P>$.n||P===$.n&&j.projectId<$.projectId)&&c.set(j.treatmentId,{projectId:j.projectId,n:P})}let l=d(j=>c.get(j)?.projectId??null,"topProjectId"),p=r.filter(j=>!(j.content&&Kg.test(j.content))),m=r.length-p.length,y=p.map(j=>({id:j.id,name:j.name,type:j.type,reason:Number(j.totalExposures)===0?"never used":"not used in 30+ days",lastExposedAt:j.lastExposedAt,totalExposures:Number(j.totalExposures),topProjectId:l(j.id)})).sort((j,P)=>j.totalExposures-P.totalExposures).slice(0,50),v=new Map;for(let j of i){let P=j.outcome!=null?pi[j.outcome]:void 0;P!==void 0&&v.set(j.id,{projectId:j.projectId,score:P,time:j.startedAt?.getTime()??0})}let h=new Map;for(let j of s){if(!j.sessionId)continue;let P=h.get(j.treatmentId);P||(P=new Set,h.set(j.treatmentId,P)),P.add(j.sessionId)}let f=[],w=[];for(let j of o){let P=h.get(j.id);if(!P)continue;let $=0;for(let _e of P)v.has(_e)&&$++;if($<10)continue;let H=new Map;for(let[_e,{projectId:ee,score:Re,time:N}]of v){let me=ee??"(no-project)",M=H.get(me);M||(M={key:me,withScores:[],withoutScores:[],withTimes:[],withoutTimes:[]},H.set(me,M));let ue=P.has(_e);(ue?M.withScores:M.withoutScores).push(Re),(ue?M.withTimes:M.withoutTimes).push(N)}let B=In([...H.values()]),te=ds(B);te==="harmful"?f.push({id:j.id,name:j.name,type:j.type,verdict:B,exposures:B.nWith,topProjectId:l(j.id)}):te==="neutral"&&w.push({id:j.id,name:j.name,type:j.type,verdict:B,exposures:B.nWith,topProjectId:l(j.id)})}let b=0,I=f;if(f.length>0){let j=await u.select({id:g.id,content:g.content}).from(g).where(iS(g.id,f.map($=>$.id))),P=new Map(j.map($=>[$.id,$.content]));I=f.filter($=>{let H=P.get($.id);return H&&Kg.test(H)?(b++,!1):!0})}I.sort((j,P)=>j.verdict.delta-P.verdict.delta);let S=1500,A=[],E=0;if(w.length>0){let j=await u.select({id:g.id,estimatedTokens:Wr`(length(${g.content}) / 4)::int`,content:g.content}).from(g).where(iS(g.id,w.map($=>$.id))),P=new Map(j.map($=>[$.id,$]));for(let $ of w){let H=P.get($.id),B=Number(H?.estimatedTokens??0);if(B<S)continue;let te=!!(H?.content&&Kg.test(H.content));te&&E++,A.push({...$,estimatedTokens:B,containsSafetyLanguage:te})}A.sort(($,H)=>H.estimatedTokens-$.estimatedTokens),A=A.slice(0,20)}let R=new Set(I.map(j=>j.id)),D=y.filter(j=>!R.has(j.id));return e.json({captureHealthy:!0,candidates:D,safetyGuarded:m,harmful:I,harmfulSafetyGuarded:b,bloated:A,trimSafetyFlagged:E})});O();import{Hono as kM}from"hono";import{z as Xi}from"zod";import{and as er,desc as cS,eq as gt,getTableColumns as jM,gte as Xg,ilike as Bl,isNull as NM,ne as PM,or as CM,sql as vr}from"drizzle-orm";O();import{desc as RM,eq as aS}from"drizzle-orm";async function ks(e){if(!e)return null;try{let[t]=await u.select({projectId:le.projectId}).from(le).where(aS(le.path,e)).orderBy(RM(le.lastSeen)).limit(1);if(t)return t.projectId;let[n]=await u.select({id:U.id}).from(U).where(aS(U.gitRemoteUrl,e)).limit(1);return n?.id??null}catch{return null}}d(ks,"resolveProjectIdForPath");var Co=new kM;function OM(e,t){let n=t?Bl(W.projectPath,`%${ot(t)}%`):void 0;return e&&n?CM(gt(W.projectId,e),er(NM(W.projectId),n)):e?gt(W.projectId,e):n}d(OM,"insightsJobProjectScope");Co.post("/insights-jobs",async e=>{let t=e.get("userId"),n=await e.req.json().catch(()=>({})),r=n.dedup,o=n.projectPath??null,s=await ks(o);if(r==="daily"){let p=new Date;p.setHours(0,0,0,0);let m=o,y=[gt(W.userId,t),Xg(W.createdAt,p)];s?y.push(gt(W.projectId,s)):m?y.push(Bl(W.projectPath,`%${ot(m)}%`)):y.push(vr`${W.projectPath} IS NULL`);let[v]=await u.select({id:W.id}).from(W).where(er(...y)).limit(1);if(v)return e.json({skipped:!0,reason:"already_generated_today",existingJobId:v.id},200);let h=[gt(W.userId,t),gt(W.status,"completed")];s?h.push(gt(W.projectId,s)):m?h.push(Bl(W.projectPath,`%${ot(m)}%`)):h.push(vr`${W.projectPath} IS NULL`);let[f]=await u.select({completedAt:W.completedAt}).from(W).where(er(...h)).orderBy(cS(W.completedAt)).limit(1),w=f?.completedAt??new Date(0),b=[gt(_.userId,t),Xg(_.startedAt,w)];s?b.push(gt(_.projectId,s)):m&&b.push(Bl(_.projectPath,`%${ot(m)}%`));let[{count:I}]=await u.select({count:vr`COUNT(*)`}).from(_).where(er(...b));if(Number(I)<5)return e.json({skipped:!0,reason:"insufficient_sessions",sessionsSinceLastRun:Number(I),threshold:5},200)}let i=o,{id:a,noLiveWorker:c}=await Rt({taskName:"process_insights",payload:{projectPath:i,projectId:s},userId:t,mirror:{userId:t,projectPath:i,projectId:s}}),[l]=await u.select().from(W).where(gt(W.id,a));return e.json({...l,noLiveWorker:c},201)});Co.get("/insights-jobs",async e=>{let t=e.get("userId"),n=Number(e.req.query("limit")??10),r=e.req.query("projectPath"),o=e.req.query("projectId")??await ks(r??null),s=[gt(W.userId,t)],i=OM(o,r??null);i&&s.push(i);let{result:a,...c}=jM(W),l=await u.select(c).from(W).where(er(...s)).orderBy(cS(W.createdAt)).limit(n);return e.json(l)});Co.get("/insights-jobs/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(W).where(er(gt(W.id,n),gt(W.userId,t)));return r?e.json(r):e.json({error:"Job not found"},404)});Co.patch("/insights-jobs/:id/progress",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=await e.req.json(),s=["running","paused"].includes(r.status)?r.status:"running",[i]=await u.update(W).set({status:s,progress:r.progress,updatedAt:new Date}).where(er(gt(W.id,n),gt(W.userId,t))).returning();return i?e.json(i):e.json({error:"Job not found"},404)});var DM=Xi.object({status:Xi.enum(["running","completed","failed"]).optional(),attempts:Xi.number().int().nonnegative().optional(),error:Xi.string().optional(),result:Xi.record(Xi.unknown()).optional()});Co.patch("/insights-jobs/:id/state",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=DM.parse(await e.req.json()),o={updatedAt:new Date};r.attempts!==void 0&&(o.attempts=r.attempts),r.status&&(o.status=r.status),r.error&&(o.error=r.error),r.result!==void 0&&(o.result=r.result),(r.status==="completed"||r.status==="failed")&&(o.completedAt=new Date);let[s]=await u.update(W).set(o).where(er(gt(W.id,n),gt(W.userId,t),PM(W.status,"cancelled"))).returning();if(!s){let[i]=await u.select().from(W).where(er(gt(W.id,n),gt(W.userId,t)));return i?e.json(i):e.json({error:"Job not found"},404)}return e.json(s)});var MM=14400*1e3;Co.post("/insights-jobs/regenerate-all",async e=>{let t=e.get("userId"),n=await e.req.json().catch(()=>({})),r=Number(n.minSessions??3),o=n.force===!0,s=new Date(Date.now()-MM),i=await u.select({projectId:_.projectId,sessionCount:vr`COUNT(*)`}).from(_).where(er(gt(_.userId,t),vr`${_.projectId} IS NOT NULL`)).groupBy(_.projectId).orderBy(vr`COUNT(*) DESC`),a=i.map(v=>v.projectId).filter(v=>!!v),c=new Map;if(a.length>0){let v=await u.execute(vr`
|
|
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`
|
|
1059
978
|
SELECT DISTINCT ON (project_id) project_id, path
|
|
1060
979
|
FROM project_checkouts
|
|
1061
|
-
WHERE project_id IN (${vr.join(
|
|
980
|
+
WHERE project_id IN (${vr.join(c.map(h=>vr`${h}`),vr`, `)})
|
|
1062
981
|
ORDER BY project_id, is_worktree ASC, last_seen DESC
|
|
1063
|
-
`);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(`
|
|
1064
983
|
`)?`
|
|
1065
984
|
`:`
|
|
1066
985
|
|
|
1067
|
-
`;
|
|
1068
|
-
`);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(`
|
|
1069
990
|
|
|
1070
|
-
`)}
|
|
1071
|
-
`)[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
|
|
1072
994
|
when ${F.source} = 'manual' or (${F.trustClass} = 'helpful' and ${h}) then 0
|
|
1073
995
|
when ${F.trustClass} = 'neutral' and ${h} then 1
|
|
1074
996
|
else 2
|
|
1075
|
-
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`
|
|
1076
998
|
with raw as (
|
|
1077
999
|
select websearch_to_tsquery('english', ${r})::text as t
|
|
1078
1000
|
), q as (
|
|
@@ -1084,7 +1006,7 @@ ${r}`).digest("hex")}d(Z0,"recommendationEntryHash");var tM=new Set(["42883","42
|
|
|
1084
1006
|
from memories m, q
|
|
1085
1007
|
where m.user_id = ${t}
|
|
1086
1008
|
and m.status = 'active'
|
|
1087
|
-
and ${
|
|
1009
|
+
and ${I}
|
|
1088
1010
|
and coalesce(m.trust_class = 'harmful' and m.trust_version = m.version, false) = false
|
|
1089
1011
|
${h}
|
|
1090
1012
|
and q.query is not null
|
|
@@ -1096,14 +1018,14 @@ ${r}`).digest("hex")}d(Z0,"recommendationEntryHash");var tM=new Set(["42883","42
|
|
|
1096
1018
|
-- memories into context AND stamp false exposures. The floor (default 0.035,
|
|
1097
1019
|
-- clamped to >= 0) subsumes the old rank-zero negation guard AND cuts the weak
|
|
1098
1020
|
-- single-word overlap band, keeping only memories with real topical overlap.
|
|
1099
|
-
and ts_rank(m.search_tsv, q.query) > ${
|
|
1021
|
+
and ts_rank(m.search_tsv, q.query) > ${a}
|
|
1100
1022
|
order by ts_rank(m.search_tsv, q.query) desc,
|
|
1101
1023
|
case when m.source = 'manual' or (m.trust_class = 'helpful' and m.trust_version = m.version) then 0
|
|
1102
1024
|
when m.trust_class = 'neutral' and m.trust_version = m.version then 1
|
|
1103
1025
|
else 2 end,
|
|
1104
1026
|
m.updated_at desc
|
|
1105
1027
|
limit ${s}
|
|
1106
|
-
`);return e.json({memories:[...f]})});mn.get("/memories/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(F).where(Ln(Ze(F.id,n),Ze(F.userId,t))).limit(1);return r?e.json(r):e.json({error:"not found"},404)});mn.post("/memories",async e=>{let t=e.get("userId"),n=nL.safeParse(await e.req.json().catch(()=>({})));if(!n.success)return e.json({error:"invalid body",details:n.error.flatten()},400);let{kind:r,title:o,body:s,projectId:i,projectPath:a,source:c}=n.data,l=i??await ah(a??null),[p]=await u.select({orgId:T.activeOrgId}).from(T).where(Ze(T.id,t)).limit(1),[m]=await u.insert(F).values({userId:t,orgId:p?.orgId??null,projectId:l,kind:r,title:o,body:s,source:c??"manual",status:"active"}).returning();return e.json(m,201)});mn.patch("/memories/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=rL.safeParse(await e.req.json().catch(()=>({})));if(!r.success)return e.json({error:"invalid body",details:r.error.flatten()},400);let[o]=await u.select().from(F).where(Ln(Ze(F.id,n),Ze(F.userId,t))).limit(1);if(!o)return e.json({error:"not found"},404);let{kind:s,title:i,body:a,status:c}=r.data,l=s!==void 0&&s!==o.kind||i!==void 0&&i!==o.title||a!==void 0&&a!==o.body,[p]=await u.update(F).set({kind:s??o.kind,title:i??o.title,body:a??o.body,status:c??o.status,version:l?o.version+1:o.version,updatedAt:new Date}).where(Ln(Ze(F.id,n),Ze(F.userId,t))).returning();return e.json(p)});mn.delete("/memories/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.update(F).set({status:"archived",updatedAt:new Date}).where(Ln(Ze(F.id,n),Ze(F.userId,t))).returning({id:F.id,status:F.status});return r?e.json({ok:!0,id:r.id,status:r.status}):e.json({error:"not found"},404)});var oL=st.object({externalSessionId:st.string().min(1),projectPath:st.string().optional()});mn.post("/memories/:id/exposures",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=oL.safeParse(await e.req.json().catch(()=>({})));if(!r.success)return e.json({error:"invalid body",details:r.error.flatten()},400);let[o]=await u.select({id:F.id,version:F.version,projectId:F.projectId}).from(F).where(Ln(Ze(F.id,n),Ze(F.userId,t))).limit(1);return o?(await u.insert($d).values({userId:t,externalSessionId:r.data.externalSessionId,treatmentType:"memory",treatmentId:o.id,treatmentVersion:o.version,method:"injected",projectId:o.projectId}).onConflictDoNothing(),e.json({ok:!0})):e.json({error:"not found"},404)});var sL=st.object({taskPrompt:st.string().min(1).max(8e3),expectations:st.array(st.string().min(1)).min(1).max(20),trials:st.number().int().min(1).max(50).default(10),model:st.string().min(1).max(100).optional()});mn.post("/memories/:id/experiments",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=sL.safeParse(await e.req.json().catch(()=>({})));if(!r.success)return e.json({error:"invalid body",details:r.error.flatten()},400);let[o]=await u.select({id:F.id,version:F.version}).from(F).where(Ln(Ze(F.id,n),Ze(F.userId,t))).limit(1);if(!o)return e.json({error:"not found"},404);let[s]=await u.insert(Nt).values({memoryId:o.id,userId:t,memoryVersion:o.version,taskPrompt:r.data.taskPrompt,expectations:r.data.expectations,trials:r.data.trials,model:r.data.model??null,status:"pending"}).returning(),{noLiveWorker:i}=await MI({experimentId:s.id,userId:t});return e.json({experiment:s,noLiveWorker:i},201)});mn.get("/memories/:id/experiments",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:F.id}).from(F).where(Ln(Ze(F.id,n),Ze(F.userId,t))).limit(1);if(!r)return e.json({error:"not found"},404);let o=await u.select().from(Nt).where(Ln(Ze(Nt.memoryId,n),Ze(Nt.userId,t))).orderBy(Wl(Nt.createdAt)).limit(20);return e.json({experiments:o})});mn.get("/memory-experiments/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(Nt).where(Ln(Ze(Nt.id,n),Ze(Nt.userId,t))).limit(1);return r?e.json(r):e.json({error:"not found"},404)});var iL=st.object({status:st.enum(["running","completed","failed"]),error:st.string().max(1e3).nullable().optional(),result:st.record(st.unknown()).optional()});mn.patch("/memory-experiments/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=iL.safeParse(await e.req.json().catch(()=>({})));if(!r.success)return e.json({error:"invalid body",details:r.error.flatten()},400);let{status:o,error:s,result:i}=r.data,[a]=await u.select({id:Nt.id,status:Nt.status}).from(Nt).where(Ln(Ze(Nt.id,n),Ze(Nt.userId,t))).limit(1);if(!a)return e.json({error:"not found"},404);if(a.status==="completed"||a.status==="failed")return e.json({error:`experiment is already terminal (status='${a.status}')`,code:"INVALID_STATE"},409);let c=o==="completed"||o==="failed",[l]=await u.update(Nt).set({status:o,...s!==void 0?{error:s}:{},...i!==void 0?{result:i}:{},...o==="running"?{startedAt:new Date}:{},...c?{completedAt:new Date}:{}}).where(Ln(Ze(Nt.id,n),Ze(Nt.userId,t))).returning();return e.json(l)});O();import{randomBytes as aL,createHash as cL}from"node:crypto";import{Hono as dL}from"hono";import{z as _S}from"zod";import{eq as zl,and as uL,isNull as lL}from"drizzle-orm";var Qi=new dL;function pL(){let n=`rm_${aL(32).toString("base64url")}`,r=cL("sha256").update(n).digest("hex"),o=n.slice(0,11);return{plaintext:n,hash:r,prefix:o}}d(pL,"generateApiKey");var mL=_S.object({name:_S.string().min(1).max(100)});Qi.post("/auth/api-keys",async e=>{let t=e.get("userId"),n=await e.req.json(),r=mL.parse(n),{plaintext:o,hash:s,prefix:i}=pL(),[a]=await u.insert(Ae).values({userId:t,name:r.name,keyHash:s,keyPrefix:i}).returning();return e.json({id:a.id,name:a.name,key:o,keyPrefix:i,createdAt:a.createdAt},201)});Qi.get("/auth/api-keys",async e=>{let t=e.get("userId"),n=await u.select({id:Ae.id,name:Ae.name,keyPrefix:Ae.keyPrefix,lastUsedAt:Ae.lastUsedAt,expiresAt:Ae.expiresAt,revokedAt:Ae.revokedAt,createdAt:Ae.createdAt}).from(Ae).where(zl(Ae.userId,t)).orderBy(Ae.createdAt);return e.json(n)});Qi.delete("/auth/api-keys/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:Ae.id}).from(Ae).where(uL(zl(Ae.id,n),zl(Ae.userId,t),lL(Ae.revokedAt)));return r?(await u.update(Ae).set({revokedAt:new Date}).where(zl(Ae.id,n)),e.json({revoked:!0})):e.json({error:"API key not found"},404)});O();import{Hono as fL}from"hono";import{z as zr}from"zod";import{eq as Et,and as Vr,isNull as gL,sql as ch}from"drizzle-orm";import{randomUUID as dh}from"node:crypto";var Jr=new fL;Jr.post("/eval-targets/:id/conversations",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:k.id}).from(k).where(Vr(Et(k.id,n),Et(k.userId,t)));if(!r)return e.json({error:"Target not found"},404);let[o]=await u.select().from($e).where(Vr(Et($e.evalTargetId,n),Et($e.userId,t),Et($e.status,"active")));if(o)return e.json(o);let[s]=await u.insert($e).values({evalTargetId:n,userId:t}).returning();return e.json(s,201)});Jr.get("/eval-targets/:id/conversations",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from($e).where(Vr(Et($e.evalTargetId,n),Et($e.userId,t),Et($e.status,"active")));return r?e.json(r):e.json(null)});var hL=zr.object({content:zr.string().min(1).max(5e3)});Jr.post("/eval-conversations/:id/messages",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=hL.parse(await e.req.json()),[o]=await u.select().from($e).where(Vr(Et($e.id,n),Et($e.userId,t)));if(!o)return e.json({error:"Conversation not found"},404);let s=dh(),i={id:s,role:"user",content:r.content,createdAt:new Date().toISOString()};await u.update($e).set({messages:ch`${$e.messages} || ${JSON.stringify([i])}::jsonb`,updatedAt:new Date}).where(Et($e.id,n));let a={type:"conversation",conversationId:n,messageId:s,messageContent:r.content},{id:c,noLiveWorker:l}=await Rt({taskName:"process_conversation",payload:{evalTargetId:o.evalTargetId,config:a},userId:t,mirror:{userId:t,evalTargetId:o.evalTargetId,config:a}});return e.json({message:i,jobId:c,noLiveWorker:l},201)});var _L=zr.object({content:zr.string(),type:zr.enum(["text","status","results","proposal","applied","generated","comparison"]).default("text"),data:zr.record(zr.unknown()).optional()});Jr.post("/eval-conversations/:id/messages/assistant",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=_L.parse(await e.req.json()),o={id:dh(),role:"assistant",content:r.content,type:r.type,data:r.data,createdAt:new Date().toISOString()};return await u.update($e).set({messages:ch`${$e.messages} || ${JSON.stringify([o])}::jsonb`,updatedAt:new Date}).where(Vr(Et($e.id,n),Et($e.userId,t))),e.json(o,201)});Jr.get("/eval-conversations/:id/messages",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=e.req.query("after"),[o]=await u.select().from($e).where(Vr(Et($e.id,n),Et($e.userId,t)));if(!o)return e.json({error:"Conversation not found"},404);let s=o.messages;if(r){let i=s.filter(a=>a.createdAt>r);return e.json(i)}return e.json(s)});var yL=zr.object({messageId:zr.string().uuid()});Jr.post("/eval-conversations/:id/apply-proposal",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=yL.parse(await e.req.json()),[o]=await u.select().from($e).where(Vr(Et($e.id,n),Et($e.userId,t)));if(!o)return e.json({error:"Conversation not found"},404);let i=o.messages.find(m=>m.id===r.messageId&&m.type==="proposal");if(!i?.data?.proposedContent)return e.json({error:"Proposal message not found or has no content"},400);let[a]=await u.select().from(k).where(Vr(Et(k.id,o.evalTargetId),Et(k.userId,t)));if(!a)return e.json({error:"Target not found"},404);let[c]=await u.insert(k).values({userId:t,name:a.name,type:a.type,content:i.data.proposedContent,description:a.description,metadata:a.metadata,version:a.version+1,parentId:a.id}).returning(),l=await u.select().from(Se).where(Vr(Et(Se.evalTargetId,a.id),gL(Se.retiredAt)));l.length>0&&await u.insert(Se).values(l.map(m=>({evalTargetId:c.id,name:m.name,prompt:m.prompt,expectedOutput:m.expectedOutput,files:m.files,expectations:m.expectations})));let p={id:dh(),role:"assistant",content:`Applied changes \u2014 created v${c.version}`,type:"applied",data:{newVersion:c.version,evalTargetId:c.id},createdAt:new Date().toISOString()};return await u.update($e).set({evalTargetId:c.id,messages:ch`${$e.messages} || ${JSON.stringify([p])}::jsonb`,updatedAt:new Date}).where(Et($e.id,n)),e.json({newTarget:c,message:p})});O();import*as Zi from"node:fs";import*as Ps from"node:path";import{createHash as wL}from"node:crypto";import{fileURLToPath as vL}from"node:url";import{createRequire as IL}from"node:module";import{Hono as bL}from"hono";import{z as vt}from"zod";import{eq as Ns,desc as SL,and as AL,sql as EL}from"drizzle-orm";var xL=Ps.dirname(vL(import.meta.url)),Do=new bL,Vl=null,Jl=null;function TL(){let e=process.env.RULEMETRIC_SKILLS_REGISTRY_PATH;if(e&&Zi.existsSync(e))return e;try{let n=IL(import.meta.url),r=Ps.dirname(n.resolve("@rulemetric/skills-registry/package.json")),o=Ps.join(r,"registry.json");if(Zi.existsSync(o))return o}catch{}let t=Ps.resolve(xL,"../../../../packages/skills-registry/registry.json");return Zi.existsSync(t)?t:null}d(TL,"resolveRegistryPath");function yS(){if(Vl)return Vl;let e=TL();return e?(Vl=JSON.parse(Zi.readFileSync(e,"utf-8")),Vl):null}d(yS,"loadRegistry");function RL(){if(Jl)return Jl;let e=yS();return e?(Jl={version:e.version,generatedAt:e.generatedAt,skills:e.skills.map(({content:t,...n})=>n)},Jl):null}d(RL,"loadRegistryIndex");Do.get("/skills",e=>{let t=RL();return t?e.json(t):e.json({error:"Skills registry not found"},404)});Do.post("/skills/publish",async e=>{let t=e.get("userId"),n=await e.req.json();if(!n.id||!n.name||!n.content)return e.json({error:"Missing required fields: id, name, content"},400);if(n.content.trim().length<20)return e.json({error:"Content too short (minimum 20 characters)"},400);let[r]=await u.insert(ao).values({skillId:n.id,name:n.name,description:n.description,category:n.category,tools:n.tools,tags:n.tags,content:n.content,submittedBy:t}).returning({id:ao.id});return e.json({id:r.id,skillId:n.id,message:`Skill "${n.name}" submitted for review. It will appear in the registry after approval.`},201)});Do.get("/skills/submissions/approved",async e=>{let n=(await u.select().from(ao).where(Ns(ao.status,"approved")).orderBy(SL(ao.createdAt))).map(r=>({id:r.skillId,name:r.name,description:r.description,category:r.category,tags:r.tags??[],tools:r.tools,source:{repo:"community",path:`published/${r.skillId}.md`,url:"",license:"MIT"},content:r.content,popularity:{installs:0},updatedAt:r.updatedAt?.toISOString()??new Date().toISOString()}));return e.json(n)});var wS=vt.object({id:vt.string().min(1),name:vt.string().min(1),description:vt.string(),content:vt.string().min(1),source:vt.object({repo:vt.string(),path:vt.string(),url:vt.string(),license:vt.string().optional()}),tags:vt.array(vt.string()).optional(),category:vt.string().optional(),updatedAt:vt.string().optional(),sourceUpdatedAt:vt.string().optional(),popularity:vt.object({stars:vt.number().int().nonnegative().optional(),installs:vt.number().int().nonnegative().optional()}).optional()}),Use=vt.object({skills:vt.array(wS).max(5e3)});Do.post("/skills/sync-public",async e=>{let t=process.env.RULEMETRIC_REGISTRY_BOT_TOKEN;if(!t)return e.json({error:"Registry bot token not configured"},503);let n=e.req.header("authorization")??"";if((n.startsWith("Bearer ")?n.slice(7):"")!==t)return e.json({error:"Invalid bot token"},401);let o=await e.req.json(),s=vt.object({skills:vt.array(vt.unknown()).max(5e3)}).safeParse(o);if(!s.success)return e.json({error:"Invalid request body",issues:s.error.issues},400);let i=s.data.skills,a=0,c=0,l=0,p=0,m=0;for(let y of i){let v=wS.safeParse(y);if(!v.success){console.warn("[sync-public] Skipping invalid skill entry:",JSON.stringify(v.error.issues)),m++;continue}let h=v.data,f=wL("sha256").update(h.content).digest("hex"),w=`public_skill::${h.source.repo}::${h.id}`,b=h.updatedAt??"1.0.0",[I]=await u.select({id:g.id,contentHash:g.contentHash,popularityScore:g.popularityScore,sourceUpdatedAt:g.sourceUpdatedAt}).from(g).where(AL(Ns(g.name,h.id),Ns(g.scope,"public"))),S=h.popularity&&Math.max(h.popularity.stars??0,h.popularity.installs??0)||null,A=h.sourceUpdatedAt?new Date(h.sourceUpdatedAt):null,E=A&&!Number.isNaN(A.getTime())?A:null;if(I)if(I.contentHash!==f){let D=!1;for(let j=0;j<=4;j++)try{await u.transaction(async P=>{await P.select({id:g.id}).from(g).where(Ns(g.id,I.id)).for("update"),await P.update(g).set({description:h.description||h.name,content:h.content,contentHash:f,version:b,upstreamVersion:b,popularityScore:S,sourceUpdatedAt:E,frontmatter:{name:h.name,source:h.source,category:h.category??null,popularity:h.popularity??null},updatedAt:new Date}).where(Ns(g.id,I.id));let[$]=await P.select({max:EL`coalesce(max(${Ie.versionNumber}), 0)`}).from(Ie).where(Ns(Ie.instructionId,I.id));await P.insert(Ie).values({instructionId:I.id,versionNumber:($?.max??0)+1,content:h.content,frontmatter:{name:h.name,source:h.source,category:h.category??null},changeSummary:`Synced from registry (${b})`})}),D=!0;break}catch(P){if(P.cause?.code==="23505"){if(j<4)continue;break}throw P}if(!D)continue;c++,p++}else{let R=I.sourceUpdatedAt?.getTime()??null,D=E?.getTime()??null,j=I.popularityScore!==S,P=E!==null&&R!==D;(j||P)&&await u.update(g).set({...j?{popularityScore:S}:{},...P?{sourceUpdatedAt:E}:{}}).where(Ns(g.id,I.id)),l++}else{let[R]=await u.insert(g).values({name:h.id,description:h.description||h.name,type:"skill",scope:"public",scopeRef:null,version:b,content:h.content,frontmatter:{name:h.name,source:h.source,category:h.category??null,popularity:h.popularity??null},tags:h.tags??null,contentHash:f,contextIdentity:w,upstreamVersion:b,popularityScore:S,sourceUpdatedAt:E}).returning({id:g.id});R&&(a++,await u.insert(Ie).values({instructionId:R.id,versionNumber:1,content:h.content,frontmatter:{name:h.name,source:h.source,category:h.category??null},changeSummary:"Initial sync from public registry"}),p++)}}return e.json({inserted:a,updated:c,unchanged:l,versionsCreated:p,skipped:m})});Do.get("/skills/:id",e=>{let t=yS();if(!t?.skills)return e.json({error:"Skills registry not found"},404);let n=t.skills.find(r=>r.id===e.req.param("id"));return n?e.json(n):e.json({error:"Skill not found"},404)});O();import{Hono as UL}from"hono";import{desc as HL,eq as BL}from"drizzle-orm";O();import{eq as IS,and as $L}from"drizzle-orm";O();var kL=/pricing|rate.?limit|rate.?cap|messages.?per|tokens.?per|RPM|TPM|TPD|cache.?write|cache.?read|context.?window|5.?hour|five.?hour|7.?day|seven.?day|weekly.?limit/i,jL="claude-haiku-4-5-20251001",NL=1e3,PL=.7,CL=`You extract pricing and rate-limit changes from AI provider release notes.
|
|
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.
|
|
1107
1029
|
Return a JSON object: {
|
|
1108
1030
|
"observations": [
|
|
1109
1031
|
{
|
|
@@ -1118,71 +1040,71 @@ Return a JSON object: {
|
|
|
1118
1040
|
}
|
|
1119
1041
|
Only emit observations if the release notes EXPLICITLY state a numeric value.
|
|
1120
1042
|
Do NOT speculate. Do NOT emit observations for "increased by X%" without an absolute number.
|
|
1121
|
-
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}
|
|
1122
1044
|
|
|
1123
1045
|
Release notes (harness=${e.harness}, version=${e.version}):
|
|
1124
1046
|
|
|
1125
|
-
${e.body??""}`}
|
|
1126
|
-
`);for(let s of o){let i=s.trim();if(!i.startsWith("- ")&&!i.startsWith("* "))continue;let a=i.replace(/^[-*]\s+/,"").trim();if(!a)continue;let c=a.toLowerCase();c.startsWith("security:")||c.includes("security fix")||c.includes("cve-")?r.push(a):c.startsWith("fixed ")||c.startsWith("fix ")||c.startsWith("fixed:")?n.push(a):t.push(a)}return{features:t,fixes:n,security:r}}d(qL,"parseReleaseBody");async function Gl(e){let t=e?bS.filter(o=>o.harness===e):bS,n=0,r=0;for(let o of t){let s=`https://api.github.com/repos/${o.repo}/releases?per_page=100`,i={Accept:"application/vnd.github+json"};process.env.GITHUB_TOKEN&&(i.Authorization=`Bearer ${process.env.GITHUB_TOKEN}`);let a=await fetch(s,{headers:i});if(!a.ok)continue;let c=await a.json();r+=c.length;for(let l of c){let p=qL(l.body??"");if((await u.select({id:Pt.id}).from(Pt).where($L(IS(Pt.harness,o.harness),IS(Pt.version,l.tag_name)))).length===0){await u.insert(Pt).values({harness:o.harness,version:l.tag_name,publishedAt:new Date(l.published_at),title:l.name,body:l.body,categories:p,url:l.html_url}),n++;try{await vS({harness:o.harness,version:l.tag_name,url:l.html_url,publishedAt:new Date(l.published_at),body:l.body})}catch(y){console.warn("release notes extraction failed:",y)}}}}return{synced:n,total:r}}d(Gl,"syncHarnessReleases");var Qc=new UL;Qc.get("/harness-releases",async e=>{let t=e.req.query("harness"),n=Math.min(Number(e.req.query("limit")??50),100),r=t?BL(Pt.harness,t):void 0,o=await u.select({id:Pt.id,harness:Pt.harness,version:Pt.version,publishedAt:Pt.publishedAt,title:Pt.title,categories:Pt.categories,url:Pt.url}).from(Pt).where(r).orderBy(HL(Pt.publishedAt)).limit(n);return e.json(o)});Qc.post("/harness-releases/sync",async e=>{let t=await e.req.json().catch(()=>({})),n=await Gl(t.harness);return e.json(n)});O();import{Hono as FL}from"hono";import{and as Kl,desc as WL,eq as ea,isNull as uh,sql as zL}from"drizzle-orm";var ta=new FL;ta.get("/notifications",async e=>{let t=e.get("userId"),n=Math.min(parseInt(e.req.query("limit")??"20",10),100),r=parseInt(e.req.query("offset")??"0",10),s=e.req.query("unread")==="true"?Kl(ea(bt.userId,t),uh(bt.readAt)):ea(bt.userId,t),i=await u.select().from(bt).where(s).orderBy(WL(bt.createdAt)).limit(n).offset(r),[{count:a}]=await u.select({count:zL`count(*)::int`}).from(bt).where(Kl(ea(bt.userId,t),uh(bt.readAt)));return e.json({items:i,unreadCount:a})});ta.post("/notifications/:id/read",async e=>{let t=e.req.param("id"),n=e.get("userId"),[r]=await u.update(bt).set({readAt:new Date}).where(Kl(ea(bt.id,t),ea(bt.userId,n))).returning();return r?e.json(r):e.json({error:"Not found"},404)});ta.post("/notifications/read-all",async e=>{let t=e.get("userId");return await u.update(bt).set({readAt:new Date}).where(Kl(ea(bt.userId,t),uh(bt.readAt))),e.json({success:!0})});O();import{Hono as VL}from"hono";import{z as Zt}from"zod";import{eq as Ir,and as Yl,desc as JL,ne as GL}from"drizzle-orm";var Mo=new VL;function KL(e){let t=e.terminalTarget;if(!t||typeof t!="object")return null;let n=t;return n.kind!=="tmux"||typeof n.target!="string"||typeof n.attachCommand!="string"?null:{sessionId:typeof e.sessionId=="string"?e.sessionId:void 0,terminalTarget:{kind:"tmux",target:n.target,attachCommand:n.attachCommand,live:typeof n.live=="boolean"?n.live:void 0}}}d(KL,"parseTerminalTargetResult");async function YL(e){let t=KL(e.result);if(!t?.terminalTarget)return;let n=e.config&&typeof e.config=="object"?e.config:{},r=typeof n.projectPath=="string"?n.projectPath:null,o=typeof n.resumeSessionId=="string"?n.resumeSessionId:null,[s]=o?await u.select({id:_.id}).from(_).where(Yl(Ir(_.userId,e.userId),Ir(_.externalSessionId,o))).limit(1):[];await u.insert(Ve).values({userId:e.userId,sessionId:s?.id??null,externalSessionId:o,kind:"tmux",target:t.terminalTarget.target,status:t.terminalTarget.live===!1?"unknown":"active",attachCommand:t.terminalTarget.attachCommand,projectPath:r,metadata:{launchJobId:e.jobId,launcherSessionId:t.sessionId}}).onConflictDoUpdate({target:[Ve.userId,Ve.target],set:{sessionId:s?.id??null,externalSessionId:o,status:t.terminalTarget.live===!1?"unknown":"active",attachCommand:t.terminalTarget.attachCommand,projectPath:r,metadata:{launchJobId:e.jobId,launcherSessionId:t.sessionId},lastSeenAt:new Date,updatedAt:new Date}})}d(YL,"upsertTerminalTargetFromLaunchResult");var XL=Zt.object({tool:Zt.string().min(1),config:Zt.object({projectPath:Zt.string().min(1),prompt:Zt.string().optional(),systemPrompt:Zt.string().optional(),model:Zt.string().optional(),mode:Zt.enum(["headless","interactive"]).default("interactive"),timeout:Zt.number().int().positive().optional(),resumeSessionId:Zt.string().optional()})});Mo.post("/launch-jobs",async e=>{let t=e.get("userId"),n=await e.req.json(),r=XL.parse(n),{id:o,noLiveWorker:s}=await Rt({taskName:"process_launch",payload:{tool:r.tool,config:r.config},userId:t,mirror:{userId:t,tool:r.tool,config:r.config}}),[i]=await u.select().from(ce).where(Ir(ce.id,o));return e.json({...i,noLiveWorker:s},201)});Mo.get("/launch-jobs",async e=>{let t=e.get("userId"),n=Number(e.req.query("limit")??50),r=await u.select().from(ce).where(Ir(ce.userId,t)).orderBy(JL(ce.createdAt)).limit(n);return e.json(r)});var QL=Zt.object({status:Zt.enum(["running","completed","failed"]).optional(),attempts:Zt.number().int().nonnegative().optional(),error:Zt.string().optional(),result:Zt.record(Zt.unknown()).optional()});Mo.patch("/launch-jobs/:id/state",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=QL.parse(await e.req.json()),o={updatedAt:new Date};r.attempts!==void 0&&(o.attempts=r.attempts),r.status&&(o.status=r.status),r.error&&(o.error=r.error),r.result!==void 0&&(o.result=r.result),(r.status==="completed"||r.status==="failed")&&(o.completedAt=new Date);let[s]=await u.update(ce).set(o).where(Yl(Ir(ce.id,n),Ir(ce.userId,t),GL(ce.status,"cancelled"))).returning();if(!s){let[i]=await u.select().from(ce).where(Yl(Ir(ce.id,n),Ir(ce.userId,t)));return i?e.json(i):e.json({error:"Job not found"},404)}return r.result!==void 0&&await YL({userId:t,jobId:n,config:s.config,result:r.result}),e.json(s)});Mo.post("/launch-jobs/:id/cancel",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.update(ce).set({status:"cancelled",updatedAt:new Date}).where(Yl(Ir(ce.id,n),Ir(ce.userId,t))).returning();return r?e.json(r):e.json({error:"Job not found"},404)});Mo.get("/launchers",async e=>{let{getAvailableLaunchers:t}=await Promise.resolve().then(()=>(ml(),Zb));return e.json(t())});O();import{Hono as ZL}from"hono";import{z as $n}from"zod";import{eq as xe,and as Ut,desc as Ql,inArray as Xl,isNull as e$,ne as t$}from"drizzle-orm";ml();var br=new ZL,n$=$n.object({tool:$n.string().min(1),model:$n.string().optional(),label:$n.string().optional()}),r$=$n.object({title:$n.string().optional(),projectPath:$n.string().min(1),gitRemote:$n.string().optional(),baseBranch:$n.string().optional(),prompt:$n.string().optional(),autoWorktree:$n.boolean().optional(),sessions:$n.array(n$).min(1).max(8)});function o$(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/(^-|-$)/g,"")||"tool"}d(o$,"sanitizeTool");var s$=new Set(["pending","claimed","running"]);var i$=1800*1e3;function SS(e,t){if(e==="cancelled")return!0;if(e!=="completed"&&e!=="failed"||t==null)return!1;let n=t instanceof Date?t.getTime():Date.parse(t);return Number.isFinite(n)?Date.now()-n>i$:!1}d(SS,"canSkipRollup");function AS(e,t,n){if(e==="cancelled")return"cancelled";let r=t.length>0,o=t.some(a=>a.endedAt==null),s=n.some(a=>s$.has(a.status));return n.length>0&&n.every(a=>a.status==="failed")&&!r?"failed":o||s&&r?"running":r&&!o&&!s?"completed":"pending"}d(AS,"rollupRunStatus");async function ES(e){if(e.rolled===e.stored)return;let t=e.rolled==="completed"||e.rolled==="failed"||e.rolled==="cancelled",n={status:e.rolled,updatedAt:new Date};t&&!e.hadCompletedAt&&(n.completedAt=new Date);try{await u.update(X).set(n).where(Ut(xe(X.id,e.runId),xe(X.userId,e.userId),t$(X.status,"cancelled")))}catch{}}d(ES,"persistRolledUpStatus");function a$(e){return Array.isArray(e)?e.length:e&&typeof e=="object"?Object.values(e).reduce((t,n)=>t+(typeof n=="number"&&n>0?n:0),0):0}d(a$,"frictionCount");async function c$(e,t){if(!e||typeof e!="object")return null;let n=e,r="claude-sonnet-4-6",o=No(r),s={input_tokens:n.input_tokens??0,output_tokens:n.output_tokens??0,cache_read_input_tokens:n.cache_read_input_tokens??0,cache_creation_5m:n.cache_creation_5m??0,cache_creation_1h:n.cache_creation_1h??0,cache_creation_input_tokens:n.cache_creation_input_tokens??0},i=await Fr(u,s,r,t,o);return i?{...i,estimated:!0}:null}d(c$,"deriveSessionCost");async function xS(e,t){let[n]=await u.select({id:X.id,autoWorktree:X.autoWorktree}).from(X).where(Ut(xe(X.id,e),xe(X.userId,t))).limit(1);if(!n||!n.autoWorktree)return{linked:0};let r=await u.select({config:ce.config,result:ce.result}).from(ce).where(Ut(xe(ce.runId,e),xe(ce.userId,t))),o=new Set;for(let i of r){let a=i.result??{};typeof a.worktreePath=="string"&&a.worktreePath&&o.add(a.worktreePath);let c=i.config??{};c.worktree?.create&&typeof c.worktree.branch=="string"&&typeof c.projectPath=="string"&&o.add(pl({repoRoot:c.projectPath,branch:c.worktree.branch}))}return o.size===0?{linked:0}:{linked:(await u.update(_).set({runId:e}).where(Ut(xe(_.userId,t),e$(_.runId),Xl(_.projectPath,[...o]))).returning({id:_.id})).length}}d(xS,"linkRunSessions");br.post("/runs",async e=>{let t=e.get("userId"),n=await e.req.json(),r=r$.parse(n),o=await _o(t,null),s=r.autoWorktree??!0,i=r.baseBranch??"HEAD",a=null;if(r.projectPath){let[m]=await u.select({projectId:le.projectId}).from(le).where(xe(le.path,r.projectPath)).orderBy(Ql(le.lastSeen)).limit(1);a=m?.projectId??null}if(!a&&r.gitRemote){let[m]=await u.select({id:U.id}).from(U).where(xe(U.gitRemoteUrl,r.gitRemote)).limit(1);a=m?.id??null}let[c]=await u.insert(X).values({userId:t,orgId:o,projectPath:r.projectPath,projectId:a,gitRemote:r.gitRemote??null,baseBranch:r.baseBranch??null,title:r.title??null,prompt:r.prompt??null,toolSpec:r.sessions,autoWorktree:s,status:"pending",sessionCount:r.sessions.length}).returning(),l=c.id.slice(0,8),p=!1;try{for(let m=0;m<r.sessions.length;m++){let y=r.sessions[m],v=`rm/run-${l}/s${m}-${o$(y.tool)}`,h={projectPath:r.projectPath,prompt:r.prompt,systemPrompt:void 0,model:y.model,mode:"interactive",worktree:{create:s,branch:v,baseRef:i},runId:c.id},f=await Rt({taskName:"process_launch",userId:t,payload:{tool:y.tool,config:h},mirror:{userId:t,tool:y.tool,config:h},runId:c.id});p=p||f.noLiveWorker}}catch(m){return await u.update(X).set({status:"failed",updatedAt:new Date}).where(xe(X.id,c.id)),await u.update(ce).set({status:"cancelled",updatedAt:new Date}).where(Ut(xe(ce.runId,c.id),xe(ce.status,"pending"))),e.json({error:"Failed to enqueue all launch jobs",detail:m instanceof Error?m.message:String(m),run:{...c,status:"failed"}},500)}return e.json({run:c,noLiveWorker:p},201)});br.get("/runs",async e=>{let t=e.get("userId"),n=Number(e.req.query("limit")),r=Math.min(Math.max(Number.isFinite(n)?n:50,1),100),o=Number(e.req.query("offset")),s=Math.max(Number.isFinite(o)?o:0,0),i=e.req.query("projectId"),a=i?Ut(xe(X.userId,t),xe(X.projectId,i)):xe(X.userId,t),c=await u.select({id:X.id,userId:X.userId,orgId:X.orgId,projectId:X.projectId,projectPath:X.projectPath,gitRemote:X.gitRemote,baseBranch:X.baseBranch,title:X.title,toolSpec:X.toolSpec,autoWorktree:X.autoWorktree,status:X.status,sessionCount:X.sessionCount,createdAt:X.createdAt,updatedAt:X.updatedAt,completedAt:X.completedAt}).from(X).where(a).orderBy(Ql(X.createdAt)).limit(r).offset(s),l=c.filter(m=>!SS(m.status,m.completedAt)),p=l.map(m=>m.id);if(p.length>0){let[m,y]=await Promise.all([u.select({runId:_.runId,endedAt:_.endedAt}).from(_).where(Ut(xe(_.userId,t),Xl(_.runId,p))),u.select({runId:ce.runId,status:ce.status}).from(ce).where(Ut(xe(ce.userId,t),Xl(ce.runId,p)))]),v=new Map;for(let f of m){if(!f.runId)continue;let w=v.get(f.runId)??[];w.push({endedAt:f.endedAt}),v.set(f.runId,w)}let h=new Map;for(let f of y){if(!f.runId)continue;let w=h.get(f.runId)??[];w.push({status:f.status}),h.set(f.runId,w)}await Promise.all(l.map(async f=>{let w=AS(f.status,v.get(f.id)??[],h.get(f.id)??[]);w!==f.status&&(await ES({runId:f.id,userId:t,stored:f.status,rolled:w,hadCompletedAt:f.completedAt!=null}),f.status=w,f.completedAt==null&&(w==="completed"||w==="failed"||w==="cancelled")&&(f.completedAt=new Date))}))}return e.json({runs:c})});br.get("/runs/:id",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select().from(X).where(Ut(xe(X.id,n),xe(X.userId,t))).limit(1);if(!r)return e.json({error:"Run not found"},404);try{await xS(n,t)}catch{}let o=await u.select({id:_.id,tool:_.tool,gitBranch:_.gitBranch,projectPath:_.projectPath,startedAt:_.startedAt,endedAt:_.endedAt,eventCount:_.eventCount,tokenUsage:_.tokenUsage,analysis:_.analysis}).from(_).where(Ut(xe(_.runId,n),xe(_.userId,t))).orderBy(Ql(_.startedAt)),s=o.map(w=>w.id);if(!SS(r.status,r.completedAt)){let w=await u.select({status:ce.status}).from(ce).where(Ut(xe(ce.runId,n),xe(ce.userId,t))),b=AS(r.status,o.map(I=>({endedAt:I.endedAt})),w);b!==r.status&&(await ES({runId:n,userId:t,stored:r.status,rolled:b,hadCompletedAt:r.completedAt!=null}),r.status=b,r.completedAt==null&&(b==="completed"||b==="failed"||b==="cancelled")&&(r.completedAt=new Date))}let i=s.length>0?await u.select({sessionId:se.sessionId,instructionId:g.id,name:g.name}).from(se).innerJoin(g,xe(g.id,se.instructionId)).where(Xl(se.sessionId,s)):[],a=new Map;for(let w of s)a.set(w,[]);for(let w of i)a.get(w.sessionId)?.push({id:w.instructionId,name:w.name});let c=await Promise.all(o.map(async w=>{let b=w.analysis??{},I=typeof b.goalSummary=="string"?b.goalSummary:null,S=typeof b.outcome=="string"?b.outcome:null,A=b.friction??null,E=await c$(w.tokenUsage,w.startedAt??new Date);return{id:w.id,tool:w.tool,gitBranch:w.gitBranch,projectPath:w.projectPath,startedAt:w.startedAt,endedAt:w.endedAt,eventCount:w.eventCount,tokenUsage:w.tokenUsage,goalSummary:I,outcome:S,friction:A,cost:E,instructions:a.get(w.id)??[]}})),l=c.map(w=>({sessionId:w.id,score:w.outcome!=null?pi[w.outcome]??-1:-1,costUsd:w.cost?.totalUsd??Number.POSITIVE_INFINITY,frictionCount:a$(w.friction)})).sort((w,b)=>b.score!==w.score?b.score-w.score:w.costUsd!==b.costUsd?w.costUsd-b.costUsd:w.frictionCount-b.frictionCount).map((w,b)=>({sessionId:w.sessionId,rank:b+1,isWinner:b===0&&w.score>=0,score:w.score,costUsd:Number.isFinite(w.costUsd)?w.costUsd:null,frictionCount:w.frictionCount})),p=new Map,m=new Map;for(let w of i)p.set(w.instructionId,w.name),m.has(w.instructionId)||m.set(w.instructionId,new Set),m.get(w.instructionId).add(w.sessionId);let y=s.length,v=[],h=[];for(let[w,b]of m){let I=p.get(w)??"Unknown";y>0&&b.size===y?v.push({id:w,name:I}):h.push({id:w,name:I,sessionIds:[...b]})}let f=null;return r.autoWorktree?r.sessionCount>0&&c.length<r.sessionCount&&(f=`Only ${c.length} of ${r.sessionCount} expected sessions are attributed to this run so far \u2014 the comparison may be incomplete while sessions are still launching or being linked.`):f="This run did not auto-create per-session worktrees, so sessions are attributed only via the launch hook. Sessions from tools that do not run RuleMetric hooks may be missing from this comparison.",e.json({run:r,sessions:c,comparison:{ranking:l,instructionDiff:{shared:v,differing:h}},attributionCaveat:f})});br.post("/runs/:id/link-sessions",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:X.id}).from(X).where(Ut(xe(X.id,n),xe(X.userId,t))).limit(1);if(!r)return e.json({error:"Run not found"},404);let{linked:o}=await xS(n,t);return e.json({linked:o})});br.get("/runs/:id/jobs",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:X.id}).from(X).where(Ut(xe(X.id,n),xe(X.userId,t))).limit(1);if(!r)return e.json({error:"Run not found"},404);let o=await u.select({id:ce.id,runId:ce.runId,status:ce.status,tool:ce.tool}).from(ce).where(Ut(xe(ce.runId,n),xe(ce.userId,t))).orderBy(Ql(ce.createdAt));return e.json(o)});br.post("/runs/:id/cancel",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:X.id}).from(X).where(Ut(xe(X.id,n),xe(X.userId,t))).limit(1);if(!r)return e.json({error:"Run not found"},404);await u.update(ce).set({status:"cancelled",updatedAt:new Date}).where(Ut(xe(ce.runId,n),xe(ce.userId,t),xe(ce.status,"pending")));let[o]=await u.update(X).set({status:"cancelled",updatedAt:new Date}).where(Ut(xe(X.id,n),xe(X.userId,t))).returning();return e.json({run:o})});br.post("/runs/:id/cleanup",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:X.id}).from(X).where(Ut(xe(X.id,n),xe(X.userId,t))).limit(1);if(!r)return e.json({error:"Run not found"},404);let{noLiveWorker:o}=await OI({runId:n,userId:t});return e.json({enqueued:!0,noLiveWorker:o})});O();import{Hono as d$}from"hono";import{z as Cs}from"zod";import{and as na,desc as lh,eq as Vt,or as TS}from"drizzle-orm";var Os=new d$;function u$(e,t){return{liveSend:e?.kind==="tmux"&&e.status==="active"&&t,fallbackResume:!0,tmuxAvailable:e?.kind==="tmux"&&e.status!=="fallback_only",workerOnline:t}}d(u$,"capabilitiesFor");Os.get("/sessions/:id/terminal-target",async e=>{let t=e.get("userId"),n=e.req.param("id"),[r]=await u.select({id:_.id,externalSessionId:_.externalSessionId}).from(_).where(na(Vt(_.id,n),Vt(_.userId,t))).limit(1);if(!r)return e.json({error:"Session not found"},404);let o=r.externalSessionId?TS(Vt(Ve.sessionId,r.id),Vt(Ve.externalSessionId,r.externalSessionId)):Vt(Ve.sessionId,r.id),[s]=await u.select().from(Ve).where(na(Vt(Ve.userId,t),o)).orderBy(lh(Ve.lastSeenAt)).limit(1),i=await Ei(t);return e.json({target:s??null,capabilities:u$(s??null,i),...s?{}:{reason:"no_target"}})});var RS=Cs.enum(["active","missing","unknown","fallback_only"]),l$=Cs.object({message:Cs.string().min(1).max(16*1024),delivery:Cs.enum(["live","fallback"]).default("live"),submit:Cs.boolean().optional().default(!0)});Os.post("/sessions/:id/send",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=l$.parse(await e.req.json()),[o]=await u.select({id:_.id,externalSessionId:_.externalSessionId,projectPath:_.projectPath}).from(_).where(na(Vt(_.id,n),Vt(_.userId,t))).limit(1);if(!o)return e.json({error:"Session not found"},404);let s=o.externalSessionId?TS(Vt(Ve.sessionId,o.id),Vt(Ve.externalSessionId,o.externalSessionId)):Vt(Ve.sessionId,o.id),[i]=await u.select().from(Ve).where(na(Vt(Ve.userId,t),Vt(Ve.status,"active"),s)).orderBy(lh(Ve.lastSeenAt)).limit(1);if(!i){if(r.delivery==="fallback"){if(!o.externalSessionId||!o.projectPath)return e.json({error:"Live target unavailable",code:"LIVE_TARGET_UNAVAILABLE"},409);let p={projectPath:o.projectPath,mode:"interactive",resumeSessionId:o.externalSessionId,prompt:r.message},m={tool:"claude_code",config:p},{id:y,noLiveWorker:v}=await Rt({taskName:"process_launch",payload:m,userId:t,mirror:{userId:t,tool:"claude_code",config:p}});return e.json({delivery:"fallback",job:{id:y,kind:"process_launch"},noLiveWorker:v},202)}return e.json({error:"Live target unavailable",code:"LIVE_TARGET_UNAVAILABLE",fallback:{available:!!(o.externalSessionId&&o.projectPath),action:"resume_terminal"}},409)}if(!await Ei(t))return e.json({error:"Worker offline",code:"WORKER_OFFLINE"},409);let c={sessionId:o.id,terminalTargetId:i.id,target:i.target,message:r.message,submit:r.submit},{id:l}=await Rt({taskName:"process_send_message",payload:c,userId:t,mirror:{userId:t,sessionId:o.id,terminalTargetId:i.id,target:i.target,message:r.message,submit:r.submit,delivery:"live"}});return e.json({delivery:"live",job:{id:l,kind:"process_send_message"},target:i},202)});var p$=Cs.object({status:RS,lastSeenAt:Cs.string().datetime().optional()});Os.patch("/terminal-targets/:id/status",async e=>{let t=e.get("userId"),n=e.req.param("id"),r=p$.parse(await e.req.json()),o=r.lastSeenAt?new Date(r.lastSeenAt):new Date,s=new Date,[i]=await u.update(Ve).set({status:r.status,lastSeenAt:o,updatedAt:s}).where(na(Vt(Ve.id,n),Vt(Ve.userId,t))).returning();return i?e.json({target:i}):e.json({error:"Terminal target not found"},404)});Os.get("/terminal-targets",async e=>{let t=e.get("userId"),n=e.req.query("status"),r=n?RS.parse(n):null,o=await u.select().from(Ve).where(na(Vt(Ve.userId,t),...r?[Vt(Ve.status,r)]:[])).orderBy(lh(Ve.lastSeenAt)).limit(100);return e.json({targets:o})});import{Hono as Q$}from"hono";O();import{Hono as h$}from"hono";import{z as Lo}from"zod";import{eq as Kr,asc as jS,sql as _$}from"drizzle-orm";O();import{eq as ph,and as m$}from"drizzle-orm";function ht(e){return async(t,n)=>{let r=t.get("userId");if(!r)return t.json({error:"Unauthenticated",code:"UNAUTHENTICATED"},401);let o=t.req.param("slug");if(!o)return t.json({error:"Missing org slug",code:"BAD_REQUEST"},400);let[s]=await u.select({id:G.id,slug:G.slug}).from(G).where(ph(G.slug,o));if(!s)return t.json({error:"Organization not found",code:"ORG_NOT_FOUND"},404);let[i]=await u.select({role:Q.role}).from(Q).where(m$(ph(Q.orgId,s.id),ph(Q.userId,r)));if(!i||!e.includes(i.role))return t.json({error:"Forbidden",code:"ORG_FORBIDDEN"},403);t.set("orgId",s.id),t.set("orgSlug",o),t.set("orgRole",i.role),await n()}}d(ht,"requireOrgRole");O();import{eq as kS,and as f$,sql as g$}from"drizzle-orm";var Gr=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Zl=g$`case ${Q.role}
|
|
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}
|
|
1127
1049
|
when 'owner' then 0
|
|
1128
1050
|
when 'admin' then 1
|
|
1129
1051
|
when 'member' then 2
|
|
1130
1052
|
else 3
|
|
1131
|
-
end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{ok:!1,response:e.json({error:"Invalid teamId path param",code:"BAD_REQUEST"},400)};let n=e.get("orgId"),[r]=await u.select({id:K.id,orgId:K.orgId,name:K.name,slug:K.slug,createdAt:K.createdAt}).from(K).where(f$(kS(K.id,t),kS(K.orgId,n)));return r?{ok:!0,team:{id:r.id,orgId:r.orgId,name:r.name,slug:r.slug,createdAt:r.createdAt}}:{ok:!1,response:e.json({error:"Team not found",code:"TEAM_NOT_FOUND"},404)}}d(Ds,"loadTeamInOrg");var ra=/^(?=.{3,40}$)[a-z0-9]+(?:-[a-z0-9]+)*$/,oa="Slug must be 3-40 chars, lowercase alphanumerics with single dashes only \u2014 no leading, trailing, or consecutive dashes";var $o=new h$,y$=Lo.object({name:Lo.string().min(1).max(100),slug:Lo.string().regex(ra,{message:oa})}),w$=Lo.object({name:Lo.string().min(1).max(100).optional(),slug:Lo.string().regex(ra,{message:oa}).optional()});$o.post("/orgs",async e=>{let t=e.get("supabase");if(!t)return e.json({error:"JWT authentication required for this endpoint",code:"JWT_REQUIRED"},401);let n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let r=y$.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let{name:o,slug:s}=r.data,{data:i,error:a}=await t.rpc("create_organization",{p_name:o,p_slug:s});if(a){let l=zt(a),p=vo(a);if(l==="23505")return e.json({error:"Slug already taken",code:"ORG_SLUG_TAKEN"},409);if(l==="P0001"&&/unauthenticated/i.test(p))return e.json({error:"Unauthenticated",code:"UNAUTHENTICATED"},401);throw a}let c=i;return e.json({id:c.id,name:c.name,slug:c.slug,role:"owner"},201)});$o.get("/orgs",async e=>{let t=e.get("userId"),n=await u.select({id:G.id,name:G.name,slug:G.slug,role:Q.role,createdAt:G.createdAt}).from(Q).innerJoin(G,Kr(Q.orgId,G.id)).where(Kr(Q.userId,t)).orderBy(G.createdAt);return e.json(n.map(r=>({id:r.id,name:r.name,slug:r.slug,role:r.role})))});$o.get("/orgs/:slug",ht(["owner","admin","member"]),async e=>{let t=e.get("orgId"),[n]=await u.select({id:G.id,name:G.name,slug:G.slug,createdAt:G.createdAt}).from(G).where(Kr(G.id,t)),r=await u.select({userId:Q.userId,role:Q.role,joinedAt:Q.createdAt,email:T.email,displayName:T.displayName}).from(Q).leftJoin(T,Kr(Q.userId,T.id)).where(Kr(Q.orgId,t)).orderBy(Zl,jS(Q.createdAt)),o=await u.select({id:K.id,name:K.name,slug:K.slug,memberCount:_$`count(${ye.userId})::int`}).from(K).leftJoin(ye,Kr(ye.teamId,K.id)).where(Kr(K.orgId,t)).groupBy(K.id,K.name,K.slug).orderBy(jS(K.name));return e.json({id:n.id,name:n.name,slug:n.slug,createdAt:n.createdAt,members:r.map(s=>({userId:s.userId,email:s.email,displayName:s.displayName,role:s.role,joinedAt:s.joinedAt})),teams:o.map(s=>({id:s.id,name:s.name,slug:s.slug,memberCount:Number(s.memberCount)}))})});$o.patch("/orgs/:slug",ht(["owner","admin"]),async e=>{let t=e.get("orgId"),n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let r=w$.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let{name:o,slug:s}=r.data;if(o===void 0&&s===void 0)return e.json({error:"At least one of `name` or `slug` is required",code:"BAD_REQUEST"},400);let i={};o!==void 0&&(i.name=o),s!==void 0&&(i.slug=s);try{let[a]=await u.update(G).set(i).where(Kr(G.id,t)).returning({id:G.id,name:G.name,slug:G.slug});return e.json({id:a.id,name:a.name,slug:a.slug})}catch(a){if(zt(a)==="23505")return e.json({error:"Slug already taken",code:"ORG_SLUG_TAKEN"},409);throw a}});$o.delete("/orgs/:slug",ht(["owner"]),async e=>{let t=e.get("orgId");return await u.delete(G).where(Kr(G.id,t)),e.body(null,204)});var v$=Lo.object({newOwnerId:Lo.string().uuid()});$o.post("/orgs/:slug/transfer",ht(["owner"]),async e=>{let t=e.get("supabase");if(!t)return e.json({error:"JWT authentication required for this endpoint",code:"JWT_REQUIRED"},401);let n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let r=v$.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let{newOwnerId:o}=r.data,s=e.get("orgId"),{data:i,error:a}=await t.rpc("transfer_ownership",{p_org:s,p_new_owner_id:o});if(a){let l=zt(a),p=vo(a);if(l==="P0001"){if(/same_user/i.test(p))return e.json({error:"Cannot transfer ownership to yourself",code:"SAME_USER"},400);if(/not_a_member/i.test(p))return e.json({error:"Target user is not a member of this organization",code:"NOT_A_MEMBER"},404);if(/forbidden/i.test(p))return e.json({error:"Forbidden",code:"ORG_FORBIDDEN"},403)}throw a}let c=i;return e.json({orgId:c.orgId,newOwnerId:c.newOwnerId,oldOwnerId:c.oldOwnerId})});O();import{Hono as I$}from"hono";import{z as NS}from"zod";import{eq as Zc,and as PS,asc as b$,max as S$,inArray as CS}from"drizzle-orm";var ed=new I$;ed.get("/orgs/:slug/members",ht(["owner","admin"]),async e=>{let t=e.get("orgId"),n=await u.select({userId:Q.userId,role:Q.role,joinedAt:Q.createdAt,email:T.email,displayName:T.displayName}).from(Q).leftJoin(T,Zc(Q.userId,T.id)).where(Zc(Q.orgId,t)).orderBy(Zl,b$(Q.createdAt)),r=n.map(c=>c.userId),o=r.length?await u.select({userId:ye.userId,teamId:K.id,teamName:K.name,teamSlug:K.slug}).from(ye).innerJoin(K,Zc(ye.teamId,K.id)).where(PS(Zc(K.orgId,t),CS(ye.userId,r))):[],s=new Map;for(let c of o){let l=s.get(c.userId)??[];l.push({id:c.teamId,name:c.teamName,slug:c.teamSlug}),s.set(c.userId,l)}let i=r.length?await u.select({userId:_.userId,lastActiveAt:S$(_.startedAt)}).from(_).where(PS(Zc(_.orgId,t),CS(_.userId,r))).groupBy(_.userId):[],a=new Map;for(let c of i)a.set(c.userId,c.lastActiveAt);return e.json(n.map(c=>{let l=a.get(c.userId)??null;return{userId:c.userId,email:c.email,displayName:c.displayName,role:c.role,joinedAt:c.joinedAt,teams:s.get(c.userId)??[],lastActiveAt:l?new Date(l).toISOString():null}}))});var A$=NS.object({role:NS.enum(["owner","admin","member"])});ed.patch("/orgs/:slug/members/:userId",ht(["owner","admin"]),async e=>{let t=e.get("supabase");if(!t)return e.json({error:"JWT authentication required for this endpoint",code:"JWT_REQUIRED"},401);let n=e.req.param("userId");if(!n||!Gr.test(n))return e.json({error:"Invalid userId path param",code:"BAD_REQUEST"},400);let r;try{r=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let o=A$.safeParse(r);if(!o.success)return e.json({error:o.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let s=e.get("orgId"),{data:i,error:a}=await t.rpc("change_member_role",{p_org:s,p_user:n,p_new_role:o.data.role});if(a){let l=zt(a),p=vo(a);if(l==="P0001"){if(/invalid_role/i.test(p))return e.json({error:"Invalid role",code:"INVALID_ROLE"},400);if(/not_a_member/i.test(p))return e.json({error:"Target user is not a member of this organization",code:"NOT_A_MEMBER"},404);if(/last_owner_violation/i.test(p))return e.json({error:"Cannot demote the last owner of this organization",code:"LAST_OWNER"},409);if(/forbidden/i.test(p))return e.json({error:"Forbidden",code:"ORG_FORBIDDEN"},403)}throw a}let c=i;return e.json({userId:c.userId,orgId:c.orgId,role:c.role})});ed.delete("/orgs/:slug/members/:userId",ht(["owner","admin","member"]),async e=>{let t=e.get("supabase");if(!t)return e.json({error:"JWT authentication required for this endpoint",code:"JWT_REQUIRED"},401);let n=e.req.param("userId");if(!n||!Gr.test(n))return e.json({error:"Invalid userId path param",code:"BAD_REQUEST"},400);let r=e.get("orgRole"),o=e.get("userId");if(!(n===o)&&!(r==="owner"||r==="admin"))return e.json({error:"Forbidden",code:"ORG_FORBIDDEN"},403);let a=e.get("orgId"),{error:c}=await t.rpc("remove_member",{p_org:a,p_user:n});if(c){let l=zt(c),p=vo(c);if(l==="P0001"){if(/not_a_member/i.test(p))return e.json({error:"Target user is not a member of this organization",code:"NOT_A_MEMBER"},404);if(/last_owner_violation/i.test(p))return e.json({error:"Cannot remove the last owner of this organization",code:"LAST_OWNER"},409);if(/forbidden/i.test(p))return e.json({error:"Forbidden",code:"ORG_FORBIDDEN"},403)}throw c}return e.body(null,204)});O();import{Hono as E$}from"hono";import{z as qo}from"zod";import{eq as Uo,and as OS,asc as x$,sql as T$}from"drizzle-orm";var Ho=new E$,R$=qo.object({name:qo.string().min(1).max(100),slug:qo.string().regex(ra,{message:oa})}),k$=qo.object({name:qo.string().min(1).max(100).optional(),slug:qo.string().regex(ra,{message:oa}).optional()}),j$=qo.object({userId:qo.string().uuid()});Ho.get("/orgs/:slug/teams",ht(["owner","admin","member"]),async e=>{let t=e.get("orgId"),n=await u.select({id:K.id,name:K.name,slug:K.slug,createdAt:K.createdAt,memberCount:T$`count(${ye.userId})::int`}).from(K).leftJoin(ye,Uo(ye.teamId,K.id)).where(Uo(K.orgId,t)).groupBy(K.id,K.name,K.slug,K.createdAt).orderBy(x$(K.name));return e.json(n.map(r=>({id:r.id,name:r.name,slug:r.slug,memberCount:Number(r.memberCount),createdAt:r.createdAt})))});Ho.post("/orgs/:slug/teams",ht(["owner","admin"]),async e=>{let t;try{t=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let n=R$.safeParse(t);if(!n.success)return e.json({error:n.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let r=e.get("orgId"),{name:o,slug:s}=n.data;try{let[i]=await u.insert(K).values({orgId:r,name:o,slug:s}).returning({id:K.id,orgId:K.orgId,name:K.name,slug:K.slug,createdAt:K.createdAt});return e.json({id:i.id,orgId:i.orgId,name:i.name,slug:i.slug,createdAt:i.createdAt,memberCount:0},201)}catch(i){if(zt(i)==="23505")return e.json({error:"Slug already taken",code:"TEAM_SLUG_TAKEN"},409);throw i}});Ho.patch("/orgs/:slug/teams/:teamId",ht(["owner","admin"]),async e=>{let t=await Ds(e);if(!t.ok)return t.response;let n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let r=k$.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let{name:o,slug:s}=r.data;if(o===void 0&&s===void 0)return e.json({error:"At least one of `name` or `slug` is required",code:"BAD_REQUEST"},400);let i={};o!==void 0&&(i.name=o),s!==void 0&&(i.slug=s);try{let[a]=await u.update(K).set(i).where(Uo(K.id,t.team.id)).returning({id:K.id,orgId:K.orgId,name:K.name,slug:K.slug,createdAt:K.createdAt});return e.json({id:a.id,orgId:a.orgId,name:a.name,slug:a.slug,createdAt:a.createdAt})}catch(a){if(zt(a)==="23505")return e.json({error:"Slug already taken",code:"TEAM_SLUG_TAKEN"},409);throw a}});Ho.delete("/orgs/:slug/teams/:teamId",ht(["owner","admin"]),async e=>{let t=await Ds(e);return t.ok?(await u.delete(K).where(Uo(K.id,t.team.id)),e.body(null,204)):t.response});Ho.post("/orgs/:slug/teams/:teamId/members",ht(["owner","admin"]),async e=>{let t=await Ds(e);if(!t.ok)return t.response;let n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let r=j$.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let{userId:o}=r.data,s=e.get("orgId"),[i]=await u.select({userId:Q.userId}).from(Q).where(OS(Uo(Q.userId,o),Uo(Q.orgId,s)));if(!i)return e.json({error:"Target user is not a member of this organization",code:"NOT_ORG_MEMBER"},400);try{await u.insert(ye).values({userId:o,teamId:t.team.id})}catch(a){if(zt(a)==="23505")return e.json({error:"User is already a member of this team",code:"ALREADY_TEAM_MEMBER"},409);throw a}return e.json({userId:o,teamId:t.team.id},201)});Ho.delete("/orgs/:slug/teams/:teamId/members/:userId",ht(["owner","admin"]),async e=>{let t=await Ds(e);if(!t.ok)return t.response;let n=e.req.param("userId");return!n||!Gr.test(n)?e.json({error:"Invalid userId path param",code:"BAD_REQUEST"},400):(await u.delete(ye).where(OS(Uo(ye.teamId,t.team.id),Uo(ye.userId,n))).returning({userId:ye.userId})).length===0?e.json({error:"User is not a member of this team",code:"NOT_TEAM_MEMBER"},404):e.body(null,204)});O();import{Hono as W$}from"hono";import{z as op}from"zod";import{randomBytes as z$}from"node:crypto";import{eq as qn,and as sp,desc as V$,sql as J$,isNull as ia,gt as G$}from"drizzle-orm";import{randomBytes as N$}from"node:crypto";async function mh(e){let t=e.idempotencyKey?` idempotencyKey=${e.idempotencyKey}`:"";return process.stderr.write(`[email:noop] would send to=${e.to} subject=${JSON.stringify(e.subject)}${t}
|
|
1132
|
-
`),{id:`noop-${
|
|
1133
|
-
`)}return"onboarding@resend.dev"}
|
|
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>
|
|
1134
1056
|
<html lang="en">
|
|
1135
1057
|
<head>
|
|
1136
1058
|
<meta charset="utf-8" />
|
|
1137
1059
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
1138
|
-
<title>${
|
|
1060
|
+
<title>${oa(i)}</title>
|
|
1139
1061
|
</head>
|
|
1140
|
-
<body style="margin:0;padding:0;background:${
|
|
1141
|
-
<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;">
|
|
1142
1064
|
<tr>
|
|
1143
1065
|
<td align="center">
|
|
1144
|
-
<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;">
|
|
1145
1067
|
<tr>
|
|
1146
1068
|
<td style="padding:32px 32px 8px 32px;">
|
|
1147
|
-
<h1 style="margin:0 0 16px 0;font-size:22px;line-height:1.3;font-weight:600;color:${
|
|
1148
|
-
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)}
|
|
1149
1071
|
</h1>
|
|
1150
|
-
<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};">
|
|
1151
1073
|
Hi there,
|
|
1152
1074
|
</p>
|
|
1153
|
-
<p style="margin:0 0 16px 0;font-size:15px;line-height:1.5;color:${
|
|
1154
|
-
<strong>${
|
|
1155
|
-
<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}.
|
|
1156
1078
|
</p>
|
|
1157
|
-
<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};">
|
|
1158
1080
|
${l}
|
|
1159
1081
|
</p>
|
|
1160
1082
|
</td>
|
|
1161
1083
|
</tr>
|
|
1162
1084
|
<tr>
|
|
1163
1085
|
<td align="center" style="padding:0 32px 8px 32px;">
|
|
1164
|
-
<a href="${
|
|
1165
|
-
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;">
|
|
1166
1088
|
Accept invitation
|
|
1167
1089
|
</a>
|
|
1168
1090
|
</td>
|
|
1169
1091
|
</tr>
|
|
1170
1092
|
<tr>
|
|
1171
1093
|
<td style="padding:16px 32px 8px 32px;">
|
|
1172
|
-
<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};">
|
|
1173
1095
|
Or copy and paste this link into your browser:
|
|
1174
1096
|
</p>
|
|
1175
|
-
<p style="margin:0 0 24px 0;font-size:13px;line-height:1.5;color:${
|
|
1176
|
-
${
|
|
1097
|
+
<p style="margin:0 0 24px 0;font-size:13px;line-height:1.5;color:${WL};word-break:break-all;">
|
|
1098
|
+
${oa(o)}
|
|
1177
1099
|
</p>
|
|
1178
|
-
<p style="margin:0 0 24px 0;font-size:13px;line-height:1.5;color:${
|
|
1179
|
-
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>.
|
|
1180
1102
|
</p>
|
|
1181
1103
|
</td>
|
|
1182
1104
|
</tr>
|
|
1183
1105
|
<tr>
|
|
1184
|
-
<td style="padding:16px 32px 32px 32px;border-top:1px solid ${
|
|
1185
|
-
<p style="margin:0;font-size:12px;line-height:1.5;color:${
|
|
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};">
|
|
1186
1108
|
If you didn't expect this email, you can safely ignore it. The link will expire on its own.
|
|
1187
1109
|
</p>
|
|
1188
1110
|
</td>
|
|
@@ -1192,12 +1114,12 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1192
1114
|
</tr>
|
|
1193
1115
|
</table>
|
|
1194
1116
|
</body>
|
|
1195
|
-
</html>`,
|
|
1196
|
-
`);return{subject:i,html:
|
|
1197
|
-
`)),t){case"resend":return
|
|
1198
|
-
`),
|
|
1199
|
-
`)),t="https://rulemetric.com"):t="http://localhost:5174"),`${t.replace(/\/$/,"")}/invite/${e}`}
|
|
1200
|
-
`),rr(t,{tags:{source:"invite-email"},extra:{to:e.to,orgName:e.orgName}}),{sent:!1,reason:n}}}d(zS,"sendInvitationEmail");var K$=op.enum(["admin","member"]),Y$=op.object({email:op.string().email().max(254),role:K$.optional(),teamId:op.string().uuid().optional()});aa.post("/orgs/:slug/invitations",ht(["owner","admin"]),async e=>{let t;try{t=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let n=Y$.safeParse(t);if(!n.success)return e.json({error:n.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let r=e.get("orgId"),o=e.get("userId"),s=n.data.email.toLowerCase(),i=n.data.role??"member",a=n.data.teamId;if(a){let[f]=await u.select({id:K.id}).from(K).where(sp(qn(K.id,a),qn(K.orgId,r)));if(!f)return e.json({error:"Team not found in this organization",code:"INVALID_TEAM"},400)}let c=BS(),l;try{let[f]=await u.insert(ae).values({orgId:r,email:s,role:i,teamId:a??null,invitedBy:o,token:c,expiresAt:new Date(Date.now()+6048e5)}).returning({id:ae.id,email:ae.email,role:ae.role,teamId:ae.teamId,expiresAt:ae.expiresAt});l=f}catch(f){if(zt(f)==="23505")return e.json({error:"A pending invitation for this email already exists",code:"INVITE_ALREADY_PENDING"},409);throw f}let p=FS(c),[m]=await u.select({name:G.name}).from(G).where(qn(G.id,r)),y=await WS(o),v=await zS({to:s,orgName:m?.name??"your organization",inviterName:y,role:l.role,acceptUrl:p,expiresAt:l.expiresAt}),h=process.env.NODE_ENV==="test";return e.json({id:l.id,email:l.email,role:l.role,teamId:l.teamId,expiresAt:l.expiresAt,acceptUrl:p,emailSent:v.sent,...v.sent?{}:{emailError:v.reason},...h?{token:c}:{}},201)});aa.get("/orgs/:slug/invitations",ht(["owner","admin"]),async e=>{let t=e.get("orgId"),n=await u.select({id:ae.id,email:ae.email,role:ae.role,teamId:ae.teamId,teamName:K.name,invitedById:ae.invitedBy,invitedByDisplayName:T.displayName,invitedByEmail:T.email,createdAt:ae.createdAt,expiresAt:ae.expiresAt}).from(ae).leftJoin(K,qn(ae.teamId,K.id)).leftJoin(T,qn(ae.invitedBy,T.id)).where(sp(qn(ae.orgId,t),ia(ae.acceptedAt),ia(ae.revokedAt),G$(ae.expiresAt,J$`now()`))).orderBy(V$(ae.createdAt));return e.json(n.map(r=>({id:r.id,email:r.email,role:r.role,teamId:r.teamId,teamName:r.teamName,invitedById:r.invitedById,invitedByName:r.invitedByDisplayName??r.invitedByEmail??null,createdAt:r.createdAt,expiresAt:r.expiresAt})))});aa.post("/orgs/:slug/invitations/:id/revoke",ht(["owner","admin"]),async e=>{let t=e.req.param("id");if(!t||!Gr.test(t))return e.json({error:"Invalid invitation id",code:"BAD_REQUEST"},400);let n=e.get("orgId");return(await u.update(ae).set({revokedAt:new Date}).where(sp(qn(ae.id,t),qn(ae.orgId,n),ia(ae.acceptedAt),ia(ae.revokedAt))).returning({id:ae.id})).length===0?e.json({error:"Invitation not found",code:"INVITE_NOT_FOUND"},404):e.body(null,204)});aa.post("/orgs/:slug/invitations/:id/resend",ht(["owner","admin"]),async e=>{let t=e.req.param("id");if(!t||!Gr.test(t))return e.json({error:"Invalid invitation id",code:"BAD_REQUEST"},400);let n=e.get("orgId"),r=BS(),o=new Date(Date.now()+10080*60*1e3),s=await u.update(ae).set({token:r,expiresAt:o}).where(sp(qn(ae.id,t),qn(ae.orgId,n),ia(ae.acceptedAt),ia(ae.revokedAt))).returning({id:ae.id,email:ae.email,role:ae.role,expiresAt:ae.expiresAt});if(s.length===0)return e.json({error:"Invitation not found",code:"INVITE_NOT_FOUND"},404);let i=s[0],a=FS(r),c=e.get("userId"),[l]=await u.select({name:G.name}).from(G).where(qn(G.id,n)),p=await WS(c),m=await zS({to:i.email,orgName:l?.name??"your organization",inviterName:p,role:i.role,acceptUrl:a,expiresAt:i.expiresAt}),y=process.env.NODE_ENV==="test";return e.json({id:i.id,email:i.email,expiresAt:i.expiresAt,acceptUrl:a,emailSent:m.sent,...m.sent?{}:{emailError:m.reason},...y?{token:r}:{}})});O();import{Hono as X$}from"hono";import{eq as td,and as JS,sql as GS,inArray as gh,gte as KS}from"drizzle-orm";var ap=new X$,ip={"7d":7,"30d":30},VS={fully_achieved:1,mostly_achieved:.75,partially_achieved:.5,unclear_from_transcript:.25,not_achieved:0};async function hh(e,t,n,r,o,s){let i=new Map;for(let A of e)i.set(A.tool,(i.get(A.tool)??0)+1);let a=[...i.entries()].sort((A,E)=>E[1]-A[1]).slice(0,5).map(([A,E])=>({tool:A,count:E})),c=new Map;for(let A of e)c.set(A.userId,(c.get(A.userId)??0)+1);let l=[...c.entries()].sort((A,E)=>E[1]-A[1]).slice(0,5).map(([A])=>A),p=l.length?await u.select({id:T.id,displayName:T.displayName,email:T.email}).from(T).where(gh(T.id,l)):[],m=new Map(p.map(A=>[A.id,A])),y=l.map(A=>{let E=m.get(A);return{userId:A,displayName:E?.displayName??null,email:E?.email??null,count:c.get(A)??0}}),v=new Map;for(let A of e){let E=A.analysis;if(!E)continue;let R=E.friction;if(!R)continue;let D=Object.values(R).reduce(($,H)=>$+(typeof H=="number"?H:0),0),j=A.startedAt.toISOString().split("T")[0]??"",P=v.get(j)??{sum:0,count:0};P.sum+=D,P.count+=1,v.set(j,P)}let h=[...v.entries()].sort(([A],[E])=>A<E?-1:1).map(([A,{sum:E,count:R}])=>({day:A,avgFriction:Math.round(E/R*100)/100})),f=e.map(A=>A.id),w=f.length?await u.select({sessionId:se.sessionId,instructionId:se.instructionId,name:g.name,source:GS`${g.frontmatter}->>'source'`}).from(se).innerJoin(g,td(g.id,se.instructionId)).where(gh(se.sessionId,f)):[],b=new Map;for(let A of w){let E=b.get(A.instructionId);E?E.sessions.add(A.sessionId):b.set(A.instructionId,{name:A.name,source:A.source,sessions:new Set([A.sessionId])})}let I=new Map;for(let A of e){let E=A.analysis;if(!E)continue;let R=E.outcome;R&&R in VS&&I.set(A.id,VS[R])}let S=[];for(let[A,{name:E,source:R,sessions:D}]of b){let j=[],P=[];for(let _e of e){let ee=I.get(_e.id);ee!==void 0&&(D.has(_e.id)?j.push(ee):P.push(ee))}let $=d(_e=>_e.length===0?null:_e.reduce((ee,Re)=>ee+Re,0)/_e.length,"avg"),H=$(j),B=$(P),te=H!==null&&B!==null?Math.round((H-B)*1e3)/10:null;S.push({instructionId:A,name:E,source:R,withSessions:D.size,withoutSessions:e.length-D.size,deltaPct:te})}return{range:t,sessionCount:e.length,memberCount:n,topTools:a,topMembers:y,frictionTrend:h,instructionEffectiveness:S}}d(hh,"buildActivityResponse");ap.get("/orgs/:slug/activity",ht(["owner","admin","member"]),async e=>{let t=e.get("orgId"),n=e.req.query("range")??"7d";if(!(n in ip))return e.json({error:"Invalid range. Allowed: 7d, 30d",code:"BAD_REQUEST"},400);let r=new Date(Date.now()-ip[n]*24*60*60*1e3),o=await u.select({id:_.id,userId:_.userId,tool:_.tool,startedAt:_.startedAt,analysis:_.analysis}).from(_).where(JS(td(_.orgId,t),KS(_.startedAt,r))),[{count:s}]=await u.select({count:GS`count(*)::int`}).from(Q).where(td(Q.orgId,t)),i=await hh(o,n,Number(s),t,r,null);return e.json(i)});ap.get("/orgs/:slug/teams/:teamId/activity",ht(["owner","admin","member"]),async e=>{let t=await Ds(e);if(!t.ok)return t.response;let n=t.team,r=e.req.query("range")??"7d";if(!(r in ip))return e.json({error:"Invalid range. Allowed: 7d, 30d",code:"BAD_REQUEST"},400);let o=new Date(Date.now()-ip[r]*24*60*60*1e3),s=e.get("orgId"),a=(await u.select({userId:ye.userId}).from(ye).where(td(ye.teamId,n.id))).map(p=>p.userId);if(a.length===0){let p=await hh([],r,0,s,o,[]);return e.json(p)}let c=await u.select({id:_.id,userId:_.userId,tool:_.tool,startedAt:_.startedAt,analysis:_.analysis}).from(_).where(JS(td(_.orgId,s),KS(_.startedAt,o),gh(_.userId,a))),l=await hh(c,r,a.length,s,o,a);return e.json(l)});var Bo=new Q$;Bo.route("/",$o);Bo.route("/",ed);Bo.route("/",Ho);Bo.route("/",aa);Bo.route("/",ap);O();import{Hono as Z$}from"hono";import{z as _h}from"zod";import{createClient as e1}from"@supabase/supabase-js";import{eq as nd,and as YS,isNull as XS,sql as QS}from"drizzle-orm";var rd=new Z$;rd.get("/:token",async e=>{let t=e.req.param("token");if(!t||t.length<8)return e.json({error:"Invitation no longer valid",code:"INVITE_GONE"},410);let[n]=await u.select({orgName:G.name,role:ae.role,email:ae.email,acceptedAt:ae.acceptedAt,revokedAt:ae.revokedAt,expiresAt:ae.expiresAt,inviterDisplayName:T.displayName,inviterEmail:T.email}).from(ae).innerJoin(G,nd(ae.orgId,G.id)).leftJoin(T,nd(ae.invitedBy,T.id)).where(nd(ae.token,t));if(!n)return e.json({error:"Invitation no longer valid",code:"INVITE_GONE"},410);let r=Date.now(),o=new Date(n.expiresAt).getTime()<r;if(n.acceptedAt||n.revokedAt||o)return e.json({error:"Invitation no longer valid",code:"INVITE_GONE"},410);let s=null,i,a=e.req.header("Authorization");if(a?.startsWith("Bearer ")){let l=a.slice(7);if(l&&!l.startsWith("rm_"))try{let p=e1(process.env.SUPABASE_URL,process.env.SUPABASE_ANON_KEY,{global:{headers:{Authorization:`Bearer ${l}`}}}),{data:m,error:y}=await p.auth.getUser();!y&&m.user&&(s=m.user.id,i=m.user.email)}catch{}}let c=null;if(s&&i&&i.toLowerCase()===n.email.toLowerCase()){let[{cnt:l}]=await u.select({cnt:QS`count(*)::int`}).from(_).where(YS(nd(_.userId,s),XS(_.orgId)));c=Number(l)}return e.json({orgName:n.orgName,inviterName:n.inviterDisplayName??n.inviterEmail??null,role:n.role,sessionCount:c})});var t1=_h.object({token:_h.string().min(1),acknowledgedSessionCount:_h.number().int().nonnegative()});rd.post("/accept",async e=>{let t=e.get("supabase");if(!t)return e.json({error:"JWT authentication required for this endpoint",code:"JWT_REQUIRED"},401);let n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let r=t1.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let o=e.get("userId");if(o){let[{cnt:c}]=await u.select({cnt:QS`count(*)::int`}).from(_).where(YS(nd(_.userId,o),XS(_.orgId))),l=Number(c);if(l>r.data.acknowledgedSessionCount)return e.json({error:"Session count changed since you reviewed the consent notice \u2014 please re-confirm",code:"SESSION_COUNT_CHANGED",currentSessionCount:l},409)}let{data:s,error:i}=await t.rpc("accept_invitation",{p_token:r.data.token});if(i){let c=zt(i),l=vo(i);if(c==="P0001"){if(/invitation_not_found/i.test(l))return e.json({error:"Invitation not found",code:"INVITE_NOT_FOUND"},404);if(/invitation_revoked/i.test(l))return e.json({error:"Invitation no longer valid",code:"INVITE_GONE"},410);if(/invitation_already_accepted/i.test(l))return e.json({error:"Invitation no longer valid",code:"INVITE_GONE"},410);if(/invitation_expired/i.test(l))return e.json({error:"Invitation no longer valid",code:"INVITE_GONE"},410);if(/invitation_email_mismatch/i.test(l))return e.json({error:"This invitation is for a different email address",code:"INVITE_EMAIL_MISMATCH"},403);if(/already_member/i.test(l))return e.json({error:"You are already a member of this organization",code:"ALREADY_MEMBER"},409);if(/already_team_member/i.test(l))return e.json({error:"You are already a member of this team",code:"ALREADY_TEAM_MEMBER"},409);if(/unauthenticated/i.test(l))return e.json({error:"Unauthenticated",code:"UNAUTHENTICATED"},401)}throw i}let a=s;return e.json({orgId:a.orgId,role:a.role})});O();import{Hono as n1}from"hono";import{z as od}from"zod";import{eq as sd,and as r1}from"drizzle-orm";var id=new n1;id.get("/profile",async e=>{let t=e.get("userId"),[n]=await u.select({id:T.id,email:T.email,displayName:T.displayName,activeOrgId:T.activeOrgId,isSuperadmin:T.isSuperadmin,claudeCodePlan:T.claudeCodePlan,planSource:T.planSource,setupCompletedAt:T.setupCompletedAt,liveSendSkipped:T.liveSendSkipped}).from(T).where(sd(T.id,t));return n?(e.header("Cache-Control","private, max-age=15"),e.json({id:n.id,email:n.email,displayName:n.displayName,activeOrgId:n.activeOrgId,isSuperadmin:n.isSuperadmin,claudeCodePlan:n.claudeCodePlan,planSource:n.planSource,setupCompletedAt:n.setupCompletedAt,liveSendSkipped:n.liveSendSkipped})):e.json({error:"Profile not found",code:"PROFILE_NOT_FOUND"},404)});var o1=["free","pro","max_5x","max_20x"],s1=od.object({activeOrgId:od.string().uuid().nullable().optional(),claudeCodePlan:od.enum(o1).nullable().optional(),setupCompletedAt:od.string().datetime().nullable().optional(),liveSendSkipped:od.boolean().optional()});id.patch("/profile",async e=>{let t=e.get("userId"),n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON body",code:"VALIDATION_ERROR"},400)}let r=s1.safeParse(n);if(!r.success)return e.json({error:r.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let o=r.data;if("activeOrgId"in o&&o.activeOrgId!=null){let[a]=await u.select({orgId:Q.orgId}).from(Q).where(r1(sd(Q.userId,t),sd(Q.orgId,o.activeOrgId)));if(!a)return e.json({error:"You are not a member of the requested organization",code:"NOT_A_MEMBER"},403)}let s={};"activeOrgId"in o&&(s.activeOrgId=o.activeOrgId??null),"claudeCodePlan"in o&&(s.claudeCodePlan=o.claudeCodePlan??null,s.planSource=o.claudeCodePlan==null?"detected":"manual"),"setupCompletedAt"in o&&(s.setupCompletedAt=o.setupCompletedAt?new Date(o.setupCompletedAt):null),"liveSendSkipped"in o&&(s.liveSendSkipped=o.liveSendSkipped),Object.keys(s).length>0&&await u.update(T).set(s).where(sd(T.id,t));let[i]=await u.select({activeOrgId:T.activeOrgId,claudeCodePlan:T.claudeCodePlan,planSource:T.planSource,setupCompletedAt:T.setupCompletedAt,liveSendSkipped:T.liveSendSkipped}).from(T).where(sd(T.id,t));return e.json({activeOrgId:i.activeOrgId,claudeCodePlan:i.claudeCodePlan,planSource:i.planSource,setupCompletedAt:i.setupCompletedAt,liveSendSkipped:i.liveSendSkipped})});O();import{Hono as a1}from"hono";import{z as _t}from"zod";import{asc as ZS,eq as Ms,sql as Un}from"drizzle-orm";O();import{eq as i1}from"drizzle-orm";function ad(){return async(e,t)=>{let n=e.get("userId");if(!n)return e.json({error:"Unauthenticated",code:"UNAUTHENTICATED"},401);let[r]=await u.select({isSuperadmin:T.isSuperadmin}).from(T).where(i1(T.id,n));if(!r?.isSuperadmin)return e.json({error:"Forbidden",code:"NOT_SUPERADMIN"},403);await t()}}d(ad,"requireSuperadmin");Pc();var fn=new a1;fn.use("/superadmin/*",ad());var c1=_t.object({search:_t.string().trim().min(1).max(120).optional(),limit:_t.coerce.number().int().min(1).max(200).default(50),offset:_t.coerce.number().int().min(0).default(0)});fn.get("/superadmin/users",async e=>{let t=c1.safeParse({search:e.req.query("search"),limit:e.req.query("limit"),offset:e.req.query("offset")});if(!t.success)return e.json({error:t.error.flatten().fieldErrors,code:"VALIDATION_ERROR"},400);let{search:n,limit:r,offset:o}=t.data,s=await u.execute(Un`
|
|
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`
|
|
1201
1123
|
select
|
|
1202
1124
|
p.id,
|
|
1203
1125
|
p.email,
|
|
@@ -1219,16 +1141,16 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1219
1141
|
count(*) filter (where org_id is null)::int as orphan
|
|
1220
1142
|
from sessions group by user_id
|
|
1221
1143
|
) s on s.user_id = p.id
|
|
1222
|
-
${n?
|
|
1144
|
+
${n?Bn`where p.email ilike ${"%"+rt(n)+"%"}`:Bn``}
|
|
1223
1145
|
order by p.created_at desc
|
|
1224
1146
|
limit ${r} offset ${o}
|
|
1225
|
-
`),[{total:i}]=await
|
|
1147
|
+
`),[{total:i}]=await d.execute(Bn`
|
|
1226
1148
|
select count(*)::int as total from profiles p
|
|
1227
|
-
${n?
|
|
1228
|
-
`);return e.json({users:s,total:i,limit:r,offset:o})});fn.get("/superadmin/users/:id",async e=>{let t=e.req.param("id");if(!
|
|
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`
|
|
1229
1151
|
select count(*)::int as n from profiles
|
|
1230
1152
|
where is_superadmin = true and id <> ${e}
|
|
1231
|
-
`);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`
|
|
1232
1154
|
select
|
|
1233
1155
|
device_id,
|
|
1234
1156
|
count(*)::int as event_count,
|
|
@@ -1245,7 +1167,7 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1245
1167
|
group by device_id
|
|
1246
1168
|
order by max(created_at) desc
|
|
1247
1169
|
limit 200
|
|
1248
|
-
`);return e.json({deployments:n})});O();import{Hono as y1}from"hono";import{z as Hn}from"zod";var dp=new y1,w1=Hn.object({event:Hn.string().min(1).max(64),deviceId:Hn.string().max(128).optional(),command:Hn.string().max(128).optional(),statusCode:Hn.number().int().optional(),message:Hn.string().max(1e3).optional(),cliVersion:Hn.string().max(64).optional(),os:Hn.string().max(32).optional(),nodeVersion:Hn.string().max(32).optional(),proxied:Hn.boolean().optional(),props:Hn.record(Hn.unknown()).optional()});dp.post("/telemetry/cli-error",async e=>{let t=w1.safeParse(await e.req.json().catch(()=>null));if(!t.success)return e.json({error:"invalid payload",details:t.error.flatten()},400);let n=t.data;console.warn(`[cli-error-beacon] event=${n.event} command=${n.command??""} status=${n.statusCode??""} proxied=${n.proxied??""} cli=${n.cliVersion??""} os=${n.os??""} node=${n.nodeVersion??""} device=${n.deviceId??""} msg=${JSON.stringify(n.message??"")}`);try{await u.insert(Kd).values({deviceId:n.deviceId??null,event:n.event,command:n.command??null,statusCode:n.statusCode??null,message:n.message??null,cliVersion:n.cliVersion??null,os:n.os??null,nodeVersion:n.nodeVersion??null,proxied:n.proxied??null,props:n.props??{}})}catch{}return e.body(null,204)});O();import{Hono as iA}from"hono";import{z as Yr}from"zod";import{createHash as v1,randomBytes as aA}from"node:crypto";import{and as rA,eq as yh,gt as I1,isNull as b1,lt as S1}from"drizzle-orm";var A1={vscode:"VS Code extension","vscode-insiders":"VS Code Insiders extension",cursor:"Cursor extension",windsurf:"Windsurf extension"},oA="VS Code extension";function E1(e){return e?A1[e]??oA:oA}d(E1,"editorKeyName");var sA=6e4;async function x1(){try{await u.delete(Rn).where(S1(Rn.expiresAt,new Date))}catch{}}d(x1,"sweepExpiredCodes");setInterval(()=>void x1(),5*6e4).unref?.();var dd=new iA,T1=Yr.object({code:Yr.string().min(1).max(256)}),R1=Yr.object({refreshToken:Yr.string().min(1).max(2048)});dd.post("/auth/extension/refresh",async e=>{let t=await e.req.json().catch(()=>null),n=R1.safeParse(t);if(!n.success)return e.json({error:"invalid request"},400);let r=await _u(n.data.refreshToken);return r.ok?e.json(r.session):e.json({error:r.error},r.status)});dd.post("/auth/extension/exchange",async e=>{let t=await e.req.json().catch(()=>null),n=T1.safeParse(t);if(!n.success)return e.json({error:"invalid request"},400);let[r]=await u.delete(Rn).where(rA(yh(Rn.code,n.data.code),I1(Rn.expiresAt,new Date))).returning({userId:Rn.userId,editor:Rn.editor,email:Rn.email});if(!r)return e.json({error:"code not found or expired"},404);let o=E1(r.editor),{plaintext:s,hash:i,prefix:a}=j1();try{await u.transaction(async c=>{await c.update(Ae).set({revokedAt:new Date}).where(rA(yh(Ae.userId,r.userId),yh(Ae.name,o),b1(Ae.revokedAt))),await c.insert(Ae).values({userId:r.userId,name:o,keyHash:i,keyPrefix:a})})}catch(c){return console.log(`[auth] extension/exchange mint failed userId=${r.userId} err=${c.message}`),e.json({error:"could not mint session"},500)}return e.json({accessToken:s,expiresAt:null,email:r.email})});var up=new iA,k1=Yr.object({refreshToken:Yr.string().min(1).nullish(),expiresAt:Yr.string().nullish(),email:Yr.string().email().nullish(),editor:Yr.enum(["vscode","vscode-insiders","cursor","windsurf"]).nullish()});function j1(){let e=`rm_${aA(32).toString("base64url")}`;return{plaintext:e,hash:v1("sha256").update(e).digest("hex"),prefix:e.slice(0,11)}}d(j1,"generateApiKey");up.post("/auth/extension/code",async e=>{let t=e.get("userId");if(!t)return e.json({error:"unauthenticated"},401);let n=await e.req.json().catch(()=>null),r=k1.safeParse(n);if(!r.success)return e.json({error:"invalid request"},400);let o=aA(32).toString("base64url");try{await u.insert(Rn).values({code:o,userId:t,editor:r.data.editor??null,email:r.data.email??null,expiresAt:new Date(Date.now()+sA)})}catch(s){return console.log(`[auth] extension/code intent insert failed userId=${t} err=${s.message}`),e.json({error:"could not start sign-in"},500)}return e.json({code:o,expiresInSeconds:Math.floor(sA/1e3),sessionStrategy:"api_key"})});Pc();import{Hono as N1}from"hono";var lp=new N1;function P1(e,t){let n=e.record??{};return e.schema==="auth"&&e.table==="users"&&e.type==="INSERT"?{title:"\u{1F389} New signup",color:2278750,fields:[{name:"Email",value:n.email??t??"unknown",inline:!0},{name:"User ID",value:String(n.id??"unknown"),inline:!0}],timestamp:new Date().toISOString()}:e.schema==="auth"&&e.table==="sessions"&&e.type==="INSERT"?{title:"\u{1F44B} Login",color:3900150,fields:[{name:"Email",value:t??"unknown",inline:!0},{name:"User ID",value:String(n.user_id??"unknown"),inline:!0}],timestamp:new Date().toISOString()}:null}d(P1,"formatEmbed");async function C1(e){if(!e)return null;try{let t=Pn(),{data:n}=await t.auth.admin.getUserById(e);return n.user?.email??null}catch{return null}}d(C1,"lookupEmail");async function O1(e,t){let n=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({embeds:[t]})});n.ok||console.error("[webhooks] Discord post failed",n.status,await n.text().catch(()=>""))}d(O1,"postToDiscord");lp.post("/webhooks/supabase-auth",async e=>{let t=process.env.SUPABASE_WEBHOOK_SECRET,n=process.env.DISCORD_WEBHOOK_URL;if(!t||!n)return e.json({error:"webhook not configured"},503);if(e.req.header("x-webhook-secret")!==t)return e.json({error:"unauthorized"},401);let o;try{o=await e.req.json()}catch{return e.json({error:"invalid json"},400)}let i=o.schema==="auth"&&o.table==="sessions"&&o.type==="INSERT"?await C1(o.record?.user_id):null,a=P1(o,i);return a?(await O1(n,a),e.json({ok:!0})):e.json({ok:!0,skipped:!0})});O();import{Hono as J1}from"hono";import{z as He}from"zod";import{and as pd,desc as gp,eq as Ar,gte as Ch,isNull as G1,sql as K1}from"drizzle-orm";var vh="anthropic",D1=[{limitType:"five_hour_percent",unit:"percentage",displayName:"5-hour window"}],wh=[{limitType:"five_hour_percent",unit:"percentage",displayName:"5-hour window"},{limitType:"seven_day_percent",unit:"percentage",displayName:"Weekly window"}];function M1(e){return typeof e=="object"&&e!==null}d(M1,"isOAuthUsageResponse");function cA(e,t,n,r,o,s){if(!e||typeof e.used_percentage!="number")return null;let i=typeof e.resets_at=="number"?new Date(e.resets_at*1e3):null;return{provider:vh,plan:n,limitType:t,value:e.used_percentage,unit:"percentage",comparator:"=",resetsAt:i,sourceType:"oauth_usage",sourceUrl:r,sourceEvidence:o,confidence:1,observedAt:s}}d(cA,"parseWindow");function L1(e,t){let n=e.match(/reset(?:s|\s+at)?\s+(?:at\s+)?(\d{1,2}):(\d{2})\s*(am|pm)?\s*(?:\(([^)]+)\))?/i);if(!n)return null;let r=parseInt(n[1],10),o=parseInt(n[2],10),s=n[3]?.toLowerCase();if(s==="pm"&&r<12&&(r+=12),s==="am"&&r===12&&(r=0),isNaN(r)||isNaN(o)||r>23||o>59)return null;let i=new Date(t);return i.setHours(r,o,0,0),i.getTime()<=t.getTime()&&i.setDate(i.getDate()+1),i}d(L1,"parseResetTime");var Ih={id:vh,displayName:"Anthropic (Claude Code)",plans:["unknown","pro","max_5x","max_20x"],limits:{unknown:wh,pro:D1,max_5x:wh,max_20x:wh},docs:[{url:"https://docs.claude.com/en/docs/claude-code/setup#usage-limits",parse(e){let t=[],n=e.replace(/<script[\s\S]*?<\/script>/gi," ").replace(/<style[\s\S]*?<\/style>/gi," ").replace(/<[^>]+>/g," ").replace(/\s+/g," ").trim(),r=n.match(/(\d{1,4})\s+messages?\s+(?:every|per)\s+5[-\s]?hours?/i);r&&t.push({plan:"unknown",limitType:"five_hour_messages",value:parseInt(r[1],10),unit:"messages",comparator:"="});let o=n.match(/(\d{1,5})\s+messages?\s+(?:per|every)\s+(?:week|7[-\s]?days?)/i);return o&&t.push({plan:"unknown",limitType:"seven_day_messages",value:parseInt(o[1],10),unit:"messages",comparator:"="}),t}}],liveSource:{matches(e,t){return e==="api.anthropic.com"&&t==="/api/oauth/usage"},parse(e,t){if(!M1(e))return null;let n=e.rate_limits;if(!n||typeof n!="object")return[];let r=t.observedAt??new Date,o=t.plan??"unknown",s=`https://${t.host}${t.path}`,i={rawResponse:e},a=[],c=cA(n.five_hour,"five_hour_percent",o,s,i,r);c&&a.push(c);let l=cA(n.seven_day,"seven_day_percent",o,s,i,r);return l&&a.push(l),a}},observe429(e){if(e.statusCode!==429||e.host!=="api.anthropic.com")return null;let t="",n=e.responseBody;if(typeof n=="string")t=n;else if(n&&typeof n=="object"){let o=n,s=o.error;if(s&&typeof s.message=="string")t=s.message;else if(typeof o.message=="string")t=o.message;else try{t=JSON.stringify(n)}catch{return null}}if(!t)return null;let r=L1(t,e.observedAt);return[{provider:vh,plan:e.plan??"unknown",limitType:"five_hour_percent",value:100,unit:"percentage",comparator:">=",resetsAt:r,sourceType:"self_observed_429",sourceUrl:`https://${e.host}${e.path}`,sourceEvidence:{responseBody:n,parsedText:t},confidence:.9,userId:e.userId??null,observedAt:e.observedAt}]}};var bh="codex",Sh="chatgpt.com",dA="/backend-api/codex/responses",$1="codex.rate_limits",uA=["primary","secondary"];function q1(e,t){return t!=null?t>=1440?"seven_day_percent":"five_hour_percent":e==="secondary"?"seven_day_percent":"five_hour_percent"}d(q1,"limitTypeForWindow");var ca=[{limitType:"five_hour_percent",unit:"percentage",displayName:"5-hour usage"},{limitType:"seven_day_percent",unit:"percentage",displayName:"7-day usage"}],Ah={id:bh,displayName:"Codex CLI (OpenAI)",plans:["unknown","free","plus","pro","team","enterprise"],limits:{unknown:ca,free:ca,plus:ca,pro:ca,team:ca,enterprise:ca},docs:[{url:"https://platform.openai.com/docs/guides/rate-limits",parse(e){return[]}}],liveSource:{matches(e,t){return!1},parse(e,t){return null},streamFrame:{matches(e,t){return e===Sh&&t.startsWith(dA)},parse(e,t){let n;try{n=JSON.parse(e)}catch{return null}if(typeof n!="object"||n===null||n.type!==$1)return null;let r=n.rate_limits;if(typeof r!="object"||r===null)return null;let o=t.observedAt??new Date,s=t.plan??"unknown",i=[];for(let a of uA){let c=r[a];if(typeof c!="object"||c===null)continue;let l=c,p=l.used_percent??l.used_percentage;if(typeof p!="number"||!isFinite(p))continue;let m=p,y=l.window_minutes,v=typeof y=="number"&&isFinite(y)?y:null,h=q1(a,v),f=null,w=l.reset_at??l.resets_at;if(typeof w=="string"){let b=new Date(w);isNaN(b.getTime())||(f=b)}else typeof w=="number"&&isFinite(w)&&(f=new Date(w*1e3));i.push({provider:bh,plan:s,limitType:h,value:m,unit:"percentage",comparator:"=",resetsAt:f,sourceType:"live_stream",sourceUrl:`wss://${Sh}${dA}`,sourceEvidence:{wireKey:a,frame:n},confidence:1,observedAt:o})}return i.length===0&&uA.some(c=>{let l=r[c];return typeof l=="object"&&l!==null})&&console.warn(`[codex] rate_limits windows present but none parsed \u2014 field drift? sample=${JSON.stringify(r).slice(0,300)}`),i.length>0?i:null}}},observe429(e){return e.statusCode!==429||e.host!==Sh?null:[{provider:bh,plan:e.plan??"unknown",limitType:"five_hour_percent",value:100,unit:"percentage",comparator:">=",resetsAt:null,sourceType:"self_observed_429",sourceUrl:`https://${e.host}${e.path}`,sourceEvidence:{responseBody:e.responseBody},confidence:.9,userId:e.userId??null,observedAt:e.observedAt}]}};var ud={anthropic:Ih,codex:Ah};function Eh(e){for(let t of Object.values(ud))if(t.liveSource?.headers?.matchesHost(e))return t}d(Eh,"matchLiveHeaders");function xh(e,t){for(let n of Object.values(ud))if(n.liveSource?.streamFrame?.matches(e,t))return n}d(xh,"matchStreamFrame");var gue=1440*60*1e3;O();import{and as pA,desc as mA,eq as ld,gte as F1,sql as W1}from"drizzle-orm";function Th(e){let{used_percentage:t,burnRateEtaSeconds:n,secondsUntilReset:r,hadObserved429:o}=e;return t>=100||o?"hit":t>=95||t>=80&&n!==null&&n<900?"imminent":t>=80&&n!==null&&n<r?"approaching":t>=80?"soft":"none"}d(Th,"classifySeverity");function da(e){switch(e){case"none":return 0;case"soft":return 1;case"approaching":return 2;case"imminent":return 3;case"hit":return 4}}d(da,"severityRank");var pp={soft:"soft warning",approaching:"approaching limit",imminent:"imminent limit",hit:"limit reached"};function U1(e,t){if(!e)return"soon";let n=new Date(e).getTime()-t;if(n<=0)return"now";let r=Math.round(n/6e4);if(r<60)return`in ${r} min`;let o=Math.floor(r/60),s=r%60;return s>0?`in ${o}h ${s}m`:`in ${o}h`}d(U1,"formatTimeLeft");function Rh(e,t,n,r,o=Date.now()){let s=U1(r,o);if(e==="hit")return`Claude ${t} reached 100% \u2014 requests will fail. Resets ${s}.`;let i=n!=null?`${n.toFixed(0)}%`:"limit";return`Claude ${t} at ${i} \u2014 ${pp[e]}. Resets ${s}.`}d(Rh,"formatAlertMessage");function kh(e,t=new Date){if(e.length<2)return null;let n=300*1e3,r=t.getTime()-n,o=e.filter(I=>I.observedAt.getTime()>=r).sort((I,S)=>I.observedAt.getTime()-S.observedAt.getTime());if(o.length<2)return null;let s=o[o.length-1];if(s.value>=100)return null;let i=o[0].observedAt.getTime(),a=o.map(I=>(I.observedAt.getTime()-i)/1e3),c=o.map(I=>I.value),l=a.length,p=a.reduce((I,S)=>I+S,0),m=c.reduce((I,S)=>I+S,0),y=a.reduce((I,S,A)=>I+S*c[A],0),v=a.reduce((I,S)=>I+S*S,0),h=l*v-p*p;if(h===0)return null;let f=(l*y-p*m)/h;return f<=0?null:(100-s.value)/f}d(kh,"projectExhaustion");var H1=300*1e3,B1=70;function jh(e){let{proposedSeverity:t,lastDispatch:n,currentUsedPercentage:r,now:o,isFirstTime429:s}=e;if(s)return!0;if(!n)return da(t)>0;let i=da(t),a=da(n.severity);return i>a?!0:o.getTime()-n.lastDispatchedAt.getTime()>=H1?a>=da("approaching")&&i===a?!(r>=B1):i>0:!1}d(jh,"shouldDispatch");function Nh(e){let t=kh(e.observations,e.now),n=Math.max(0,Math.floor((e.currentResetsAt.getTime()-e.now.getTime())/1e3)),r=Th({used_percentage:e.currentUsedPercentage,burnRateEtaSeconds:t,secondsUntilReset:n,hadObserved429:e.hadObserved429}),o={alertKey:e.alertKey,severity:r,usedPercentage:e.currentUsedPercentage,resetsAt:e.currentResetsAt.toISOString(),burnRateEtaSeconds:t};if(r==="none")return{shouldDispatch:!1,severity:"none",reason:"below threshold",payload:o};let s=e.hadObserved429&&(e.lastDispatch===null||e.lastDispatch.severity!=="hit"),i=jh({proposedSeverity:r,lastDispatch:e.lastDispatch,currentResetsAt:e.currentResetsAt,currentUsedPercentage:e.currentUsedPercentage,now:e.now,isFirstTime429:s});return{shouldDispatch:i,severity:r,reason:i?"dispatch":"suppressed by cooldown/hysteresis",payload:o}}d(Nh,"evaluate");function lA(e,t,n){return`${e}:${t}:${n}`}d(lA,"deriveAlertKey");O();async function ua(e){await tn({userId:e.userId,type:`usage_${e.severity}`,title:e.title??`Usage limit \u2014 ${pp[e.severity]}`,body:e.message,url:"/usage",sourceTable:"alert_dispatches",sourceId:e.dispatchId})}d(ua,"notifyFromDispatch");var z1=30*6e4;async function mp(e,t){let n=new Date((t.observedAt??new Date).getTime()-z1);try{let o=await u.execute(W1`
|
|
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`
|
|
1249
1171
|
SELECT id, observed_at
|
|
1250
1172
|
FROM limit_observations
|
|
1251
1173
|
WHERE user_id = ${e}
|
|
@@ -1258,9 +1180,9 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1258
1180
|
AND observed_at >= ${n.toISOString()}::timestamptz
|
|
1259
1181
|
ORDER BY observed_at DESC
|
|
1260
1182
|
LIMIT 1
|
|
1261
|
-
`);if(o.length>0){let s=o[0];return{id:s.id,observedAt:new Date(s.observed_at).toISOString(),deduped:!0}}}catch(o){console.warn("[observe] dedup probe failed; proceeding to insert",o)}let[r]=await u.insert(we).values({provider:t.provider,plan:t.plan,limitType:t.limitType,value:String(t.value),unit:t.unit,comparator:t.comparator,resetsAt:t.resetsAt??null,sourceType:t.sourceType,sourceUrl:t.sourceUrl??null,sourceEvidence:t.sourceEvidence??null,confidence:String(t.confidence),userId:e,...t.observedAt?{observedAt:t.observedAt}:{}}).returning({id:we.id,observedAt:we.observedAt});if(t.sourceType==="oauth_usage"||t.sourceType==="self_observed_429")try{let o=lA(t.provider,t.plan,t.limitType),s=new Date,i=new Date(s.getTime()-600*1e3),a=await u.select({observedAt:we.observedAt,value:we.value}).from(we).where(pA(ld(we.userId,e),ld(we.provider,t.provider),ld(we.limitType,t.limitType),F1(we.observedAt,i))).orderBy(mA(we.observedAt)).limit(50),c=await u.select().from(yn).where(pA(ld(yn.userId,e),ld(yn.alertKey,o))).orderBy(mA(yn.lastDispatchedAt)).limit(1),l=Nh({alertKey:o,observations:a.map(p=>({observedAt:p.observedAt,value:Number(p.value)})),currentUsedPercentage:t.value,currentResetsAt:t.resetsAt??new Date(s.getTime()+300*60*1e3),hadObserved429:t.sourceType==="self_observed_429",lastDispatch:c[0]?{severity:c[0].severity,lastDispatchedAt:c[0].lastDispatchedAt,lastState:c[0].lastState}:null,now:s});if(l.shouldDispatch&&l.severity!=="none"){let p=l.severity,[m]=await u.insert(yn).values({userId:e,alertKey:o,severity:p,lastState:l.payload,channel:"banner"}).returning({id:yn.id});m&&await ua({userId:e,dispatchId:m.id,severity:p,message:Rh(p,t.limitType,l.payload.usedPercentage,l.payload.resetsAt)})}}catch(o){console.error("alert evaluation failed",o)}return{id:r.id,observedAt:new Date(r.observedAt).toISOString(),deduped:!1}}d(mp,"processObservation");function fA(e,t){return`${e}::${t.provider}::${t.sourceType}::${t.limitType}`}d(fA,"observationKey");function fp(){return process.env.OBSERVE_BATCHING!=="0"}d(fp,"observeBatchingEnabled");function gA(){let e=Number(process.env.OBSERVE_BATCH_BUFFER_MAX);return Number.isFinite(e)&&e>0?Math.floor(e):5e3}d(gA,"observeBufferMax");function hA(){let e=Number(process.env.PG_POOL_MAX)||3;return Math.max(1,e-1)}d(hA,"defaultConcurrency");function V1(e={}){let t=e.process??((b,I)=>mp(b,I)),n=e.maxBuffered??gA(),r=Math.max(1,e.concurrency??hA()),o=new Map,s=0,i=new Set,a=0,c=!1,l=[];function p(){let b=l;l=[];for(let I of b)I()}d(p,"notifyProgress");function m(){for(;a<r;){let b=null,I=null;for(let[S,A]of o)if(!(i.has(S)||A.length===0)){I=A,o.delete(S),b=S;break}if(b==null||I==null)return;s-=I.length,i.add(b),a++,y(b,I)}}d(m,"tick");async function y(b,I){try{for(let S of I)try{await t(S.userId,S.obs)}catch(A){console.warn("[observe-batcher] drain failed for one observation; dropping it:",A instanceof Error?A.message:A)}}finally{a--,i.delete(b),p(),m()}}d(y,"runDrain");function v(b){if(c||s>=n)return!1;let I=fA(b.userId,b.obs),S=o.get(I);return S?S.push(b):o.set(I,[b]),s++,m(),!0}d(v,"push");function h(b){return new Promise(I=>{let S=!1,A=d(()=>{S||(S=!0,clearTimeout(E),I())},"finish"),E=setTimeout(A,b);E.unref?.(),l.push(A)})}d(h,"waitForProgress");async function f(b){let I=b!=null?Date.now()+b:Number.POSITIVE_INFINITY;for(;;){if(m(),s===0&&a===0)return;let S=I-Date.now();if(S<=0)return;await h(Math.min(S,50))}}d(f,"flush");function w(){c=!0}return d(w,"stop"),{push:v,flush:f,stop:w,size:d(()=>s,"size"),inFlight:d(()=>a,"inFlight")}}d(V1,"createObserveBatcher");var Wo=null;function Ph(){return Wo==null&&(Wo=V1()),Wo}d(Ph,"getObserveBatcher");function _A(){Ph(),console.log(`[observe-batcher] batched observe ingest ON (bufferMax=${gA()} drainConcurrency=${hA()}; OBSERVE_BATCHING=0 to disable)`)}d(_A,"initObserveBatcher");async function yA(e=5e3){if(Wo==null)return;Wo.stop(),await Wo.flush(e);let t=Wo.size()+Wo.inFlight();t>0&&console.warn(`[observe-batcher] shutdown flush deadline (${e}ms) hit; dropping ~${t} buffered observation(s)`)}d(yA,"shutdownObserveBatcher");var tr=new J1,Y1=He.object({provider:He.string().min(1).max(64),plan:He.string().min(1).max(64),limitType:He.string().min(1).max(128),value:He.number().finite(),unit:He.string().min(1).max(32),comparator:He.enum(["=",">=","<="]).default("="),resetsAt:He.union([He.string(),He.date(),He.null()]).optional().transform(e=>{if(e==null)return null;if(e instanceof Date)return e;let t=new Date(e);return isNaN(t.getTime())?null:t}),sourceType:He.enum(["oauth_usage","self_observed_429","official_docs","self_observed_lower_bound","community","llm_research","release_notes","live_headers","live_stream"]),sourceUrl:He.string().url().optional().nullable(),sourceEvidence:He.unknown().optional(),confidence:He.number().min(0).max(1),observedAt:He.union([He.string(),He.date()]).optional().transform(e=>{if(e==null)return;if(e instanceof Date)return e;let t=new Date(e);return isNaN(t.getTime())?void 0:t})});tr.post("/internal/research/match-headers",async e=>{let t=e.get("userId"),n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON"},400)}let o=He.object({host:He.string(),path:He.string().default("/"),responseHeaders:He.record(He.string()),observedAt:He.string().optional(),plan:He.string().optional()}).safeParse(n);if(!o.success)return e.json({error:"Invalid request body",issues:o.error.issues},400);let{host:s,path:i,responseHeaders:a,observedAt:c,plan:l}=o.data,p=Eh(s);if(!p?.liveSource?.headers)return e.json({observations:[]});let m={host:s,path:i,plan:l??null,observedAt:c?new Date(c):new Date,userId:t},y=p.liveSource.headers.parse(a,m);if(!y||y.length===0)return e.json({observations:[]});let v=[];for(let h of y)try{let f=h.observedAt instanceof Date?h.observedAt:typeof h.observedAt=="string"?new Date(h.observedAt):void 0,[w]=await u.insert(we).values({provider:h.provider,plan:h.plan,limitType:h.limitType,value:String(h.value),unit:h.unit,comparator:h.comparator??"=",resetsAt:h.resetsAt instanceof Date?h.resetsAt:null,sourceType:h.sourceType,sourceUrl:h.sourceUrl??null,sourceEvidence:h.sourceEvidence??null,confidence:String(h.confidence),userId:t,...f?{observedAt:f}:{}}).returning({id:we.id});v.push({...h,id:w.id})}catch{}return e.json({observations:v})});tr.post("/internal/research/match-stream-frame",async e=>{let t=e.get("userId"),n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON"},400)}let o=He.object({host:He.string(),path:He.string().default("/"),frameText:He.string(),observedAt:He.string().optional(),plan:He.string().optional()}).safeParse(n);if(!o.success)return e.json({error:"Invalid request body",issues:o.error.issues},400);let{host:s,path:i,frameText:a,observedAt:c,plan:l}=o.data,p=xh(s,i);if(!p?.liveSource?.streamFrame)return e.json({observations:[]});let m={host:s,path:i,plan:l??null,observedAt:c?new Date(c):new Date,userId:t},y=p.liveSource.streamFrame.parse(a,m);if(!y||y.length===0)return e.json({observations:[]});let v=[];for(let h of y)try{let f=h.observedAt instanceof Date?h.observedAt:typeof h.observedAt=="string"?new Date(h.observedAt):void 0,[w]=await u.insert(we).values({provider:h.provider,plan:h.plan,limitType:h.limitType,value:String(h.value),unit:h.unit,comparator:h.comparator??"=",resetsAt:h.resetsAt instanceof Date?h.resetsAt:null,sourceType:h.sourceType,sourceUrl:h.sourceUrl??null,sourceEvidence:h.sourceEvidence??null,confidence:String(h.confidence),userId:t,...f?{observedAt:f}:{}}).returning({id:we.id});v.push({...h,id:w.id})}catch{}return e.json({observations:v})});tr.post("/internal/research/observe",async e=>{let t=e.get("userId"),n;try{n=await e.req.json()}catch{return e.json({error:"Invalid JSON"},400)}let r=Y1.safeParse(n);if(!r.success)return e.json({error:"Invalid observation",issues:r.error.issues},400);let o=r.data;if(fp())return Ph().push({userId:t,obs:o})?e.json({buffered:!0,durable:!1},202):(e.header("Retry-After","2"),e.json({error:"Observe buffer full; retry shortly.",durable:!1},429));let s=await mp(t,o);return e.json({id:s.id,observedAt:s.observedAt,...s.deduped?{deduped:!0}:{}},s.deduped?200:201)});tr.get("/research/active-limits",async e=>{let t=e.req.query("provider"),n=e.req.query("plan"),r=[G1(Ge.effectiveUntil)];t&&r.push(Ar(Ge.provider,t)),n&&r.push(Ar(Ge.plan,n));let o=await u.select().from(Ge).where(pd(...r)).orderBy(Ge.provider,Ge.plan,Ge.limitType,gp(Ge.effectiveFrom));return e.json({items:o})});tr.get("/research/doc-changes",async e=>{let t=e.req.query("since"),n=t?new Date(t):new Date(Date.now()-7*864e5);if(isNaN(n.getTime()))return e.json({error:"Invalid since parameter"},400);let r=await u.select({id:xt.id,fetchedAt:xt.fetchedAt,provider:xt.provider,docUrl:xt.docUrl,contentHash:xt.contentHash,parseSuccess:xt.parseSuccess}).from(xt).where(Ch(xt.fetchedAt,n)).orderBy(xt.provider,xt.docUrl,gp(xt.fetchedAt)),o=new Map;for(let s of r){let i=`${s.provider}::${s.docUrl}`,a=o.get(i);a?(a.previousHash===null&&s.contentHash!==a.latestHash&&(a.previousHash=s.contentHash,a.changed=!0),a.snapshots.push(s)):o.set(i,{provider:s.provider,docUrl:s.docUrl,latestFetchedAt:s.fetchedAt,latestHash:s.contentHash,previousHash:null,parseSuccess:s.parseSuccess,changed:!1,snapshots:[s]})}return e.json({items:Array.from(o.values())})});tr.get("/research/disagreements",async e=>{let t=e.get("userId"),n=Math.min(parseInt(e.req.query("since_days")??"14",10)||14,90),r=new Date(Date.now()-n*864e5),o=await u.select().from(we).where(pd(Ar(we.userId,t),Ch(we.observedAt,r))).orderBy(gp(we.observedAt)),s=new Map;for(let a of o){let c=`${a.provider}::${a.plan}::${a.limitType}`,l=s.get(c);l||(l={provider:a.provider,plan:a.plan,limitType:a.limitType,observations:[]},s.set(c,l)),l.observations.push({id:a.id,value:Number(a.value),unit:a.unit,sourceType:a.sourceType,confidence:Number(a.confidence),observedAt:a.observedAt})}let i=[];for(let a of s.values()){if(a.observations.length<2)continue;let c=a.observations.map(y=>y.value).filter(y=>y>0);if(c.length<2)continue;let l=Math.min(...c),p=Math.max(...c);if(l===0)continue;let m=(p-l)/l*100;m>20&&i.push({provider:a.provider,plan:a.plan,limitType:a.limitType,minValue:l,maxValue:p,spreadPct:m,observations:a.observations})}return i.sort((a,c)=>c.spreadPct-a.spreadPct),e.json({items:i.slice(0,100)})});tr.get("/research/confidence-history",async e=>{let t=e.req.query("provider"),n=e.req.query("plan"),r=e.req.query("limit_type"),o=Math.min(parseInt(e.req.query("days")??"90",10)||90,365);if(!t||!n||!r)return e.json({error:"provider, plan, limit_type required"},400);let s=new Date(Date.now()-o*864e5),i=await u.select({effectiveFrom:Ge.effectiveFrom,effectiveUntil:Ge.effectiveUntil,confidence:Ge.confidence,value:Ge.value}).from(Ge).where(pd(Ar(Ge.provider,t),Ar(Ge.plan,n),Ar(Ge.limitType,r),Ch(Ge.effectiveFrom,s))).orderBy(Ge.effectiveFrom);return e.json({items:i.map(a=>({effectiveFrom:a.effectiveFrom,effectiveUntil:a.effectiveUntil,confidence:Number(a.confidence),value:Number(a.value)}))})});tr.get("/research/observations",async e=>{let t=e.get("userId"),n=e.req.query("provider"),r=e.req.query("plan"),o=e.req.query("limit_type"),s=Math.min(parseInt(e.req.query("limit")??"50",10)||50,200),i=Math.max(parseInt(e.req.query("offset")??"0",10)||0,0),a=[Ar(we.userId,t)];n&&a.push(Ar(we.provider,n)),r&&a.push(Ar(we.plan,r)),o&&a.push(Ar(we.limitType,o));let c=await u.select().from(we).where(pd(...a)).orderBy(gp(we.observedAt)).limit(s).offset(i),[{total:l}]=await u.select({total:K1`count(*)::int`}).from(we).where(pd(...a));return e.json({items:c,total:l,limit:s,offset:i})});O();import{Hono as X1}from"hono";import{and as bA,desc as Q1,eq as la,isNull as Z1,ne as eq,sql as Er}from"drizzle-orm";var wA={free:.2,pro:1,max_5x:5,max_20x:20},Dh=new Set(["free","pro","max_5x","max_20x"]),Oh={fiveHourMessages:20,sevenDaySonnetHours:14,sevenDayOpusHours:1.65};function vA(e){let t=wA[e]??wA.max_20x;return{fiveHourMessages:Math.round(Oh.fiveHourMessages*t),sevenDaySonnetHours:Math.round(Oh.sevenDaySonnetHours*t),sevenDayOpusHours:Math.round(Oh.sevenDayOpusHours*t)}}d(vA,"planDefaultCaps");var md=new X1,tq=60*1e3,Mh=new Map;function nq(e,t){let n=`${e}::${t}`,r=Mh.get(n);if(r&&Date.now()-r.at<tq)return r.rows;let o=u.select({limitType:Ge.limitType,value:Ge.value,unit:Ge.unit}).from(Ge).where(bA(la(Ge.provider,e),la(Ge.plan,t),Z1(Ge.effectiveUntil)));return o.catch(()=>Mh.delete(n)),Mh.set(n,{at:Date.now(),rows:o}),o}d(nq,"getActivePlanLimits");var IA=["five_hour_percent","seven_day_percent","seven_day_opus_percent"],rq={anthropic:["oauth_usage"],codex:["live_stream","self_observed_429"]};function oq(e){return rq[e]??["oauth_usage"]}d(oq,"sourceTypesFor");md.get("/usage/current-limits",async e=>{let t=e.get("userId"),n=e.req.query("provider")??"anthropic",r=oq(n),o=await u.execute(Er`
|
|
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`
|
|
1262
1184
|
SELECT lt.limit_type AS limit_type, o.value AS value, o.resets_at AS resets_at, o.observed_at AS observed_at
|
|
1263
|
-
FROM (VALUES ${Er.join(
|
|
1185
|
+
FROM (VALUES ${Er.join(uS.map(i=>Er`(${i})`),Er`, `)}) AS lt(limit_type)
|
|
1264
1186
|
LEFT JOIN LATERAL (
|
|
1265
1187
|
SELECT max(resets_at) AS resets_at
|
|
1266
1188
|
FROM limit_observations
|
|
@@ -1281,27 +1203,27 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1281
1203
|
ORDER BY (CASE WHEN w.resets_at IS NULL THEN 0 ELSE value END) DESC, observed_at DESC
|
|
1282
1204
|
LIMIT 1
|
|
1283
1205
|
) o ON true
|
|
1284
|
-
`),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$`
|
|
1285
1207
|
SELECT model,
|
|
1286
1208
|
COUNT(*)::int AS events,
|
|
1287
1209
|
MAX(timestamp) AS last_seen
|
|
1288
1210
|
FROM session_events
|
|
1289
1211
|
WHERE model IS NOT NULL
|
|
1290
1212
|
AND model NOT IN ('unknown', '(null)')
|
|
1291
|
-
AND timestamp > now() - (${
|
|
1213
|
+
AND timestamp > now() - (${h$} || ' days')::interval
|
|
1292
1214
|
GROUP BY model
|
|
1293
1215
|
ORDER BY events DESC
|
|
1294
|
-
`),r=await
|
|
1295
|
-
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
|
|
1296
1218
|
SET status = 'claimed',
|
|
1297
1219
|
claimed_by = ${r},
|
|
1298
1220
|
claimed_at = now(),
|
|
1299
|
-
lease_expires_at = now() + (${
|
|
1221
|
+
lease_expires_at = now() + (${_S}::int * interval '1 second'),
|
|
1300
1222
|
attempts = m.attempts + 1,
|
|
1301
1223
|
updated_at = now()
|
|
1302
1224
|
FROM (
|
|
1303
1225
|
SELECT id
|
|
1304
|
-
FROM ${
|
|
1226
|
+
FROM ${la.raw(e)}
|
|
1305
1227
|
WHERE user_id = ${t}
|
|
1306
1228
|
AND status = 'pending'
|
|
1307
1229
|
AND task_kind IN (${o})
|
|
@@ -1312,7 +1234,7 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1312
1234
|
) AS picked
|
|
1313
1235
|
WHERE m.id = picked.id
|
|
1314
1236
|
RETURNING m.id, m.task_kind, m.payload, m.attempts
|
|
1315
|
-
`);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`
|
|
1316
1238
|
SELECT status, attempts, task_kind
|
|
1317
1239
|
FROM ${Xr.raw(r)}
|
|
1318
1240
|
WHERE id = ${e}
|
|
@@ -1320,17 +1242,17 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1320
1242
|
AND claimed_by = ${n}
|
|
1321
1243
|
AND status IN ('claimed', 'running')
|
|
1322
1244
|
LIMIT 1
|
|
1323
|
-
`);if(o.length>0)return{table:r,status:o[0].status,attempts:o[0].attempts,taskKind:o[0].task_kind}}return null}
|
|
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`
|
|
1324
1246
|
UPDATE ${Xr.raw(s.table)}
|
|
1325
|
-
SET lease_expires_at = now() + (${
|
|
1247
|
+
SET lease_expires_at = now() + (${bS}::int * interval '1 second'),
|
|
1326
1248
|
updated_at = now()
|
|
1327
1249
|
WHERE id = ${n}
|
|
1328
1250
|
AND claimed_by = ${o}
|
|
1329
1251
|
AND status IN ('claimed', 'running')
|
|
1330
|
-
`),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`
|
|
1331
1253
|
UPDATE ${Xr.raw(i.table)}
|
|
1332
1254
|
SET status = 'completed',
|
|
1333
|
-
result = ${
|
|
1255
|
+
result = ${c}::jsonb,
|
|
1334
1256
|
error = NULL,
|
|
1335
1257
|
completed_at = now(),
|
|
1336
1258
|
updated_at = now(),
|
|
@@ -1339,24 +1261,24 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1339
1261
|
WHERE id = ${n}
|
|
1340
1262
|
AND claimed_by = ${o}
|
|
1341
1263
|
AND status IN ('claimed', 'running')
|
|
1342
|
-
`),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`
|
|
1343
1265
|
UPDATE ${Xr.raw(i.table)}
|
|
1344
1266
|
SET status = ${l},
|
|
1345
1267
|
error = ${s.data.error},
|
|
1346
1268
|
updated_at = now(),
|
|
1347
|
-
${Xr.raw(
|
|
1269
|
+
${Xr.raw(a?"completed_at = now(),":"")}
|
|
1348
1270
|
claimed_by = NULL,
|
|
1349
1271
|
claimed_at = NULL,
|
|
1350
1272
|
lease_expires_at = NULL
|
|
1351
1273
|
WHERE id = ${n}
|
|
1352
1274
|
AND claimed_by = ${o}
|
|
1353
1275
|
AND status IN ('claimed', 'running')
|
|
1354
|
-
`),
|
|
1355
|
-
`)),s=t.webBaseUrl??process.env.RULEMETRIC_WEB_URL??process.env.WEB_URL??"https://rulemetric.com";if(
|
|
1356
|
-
`)}),e.json({processing:!0,resumed:s,announcement:o},202)});
|
|
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`
|
|
1357
1279
|
UPDATE ${kr.raw(e)}
|
|
1358
1280
|
SET status = 'failed',
|
|
1359
|
-
error = ${
|
|
1281
|
+
error = ${f1},
|
|
1360
1282
|
completed_at = now(),
|
|
1361
1283
|
claimed_by = NULL,
|
|
1362
1284
|
claimed_at = NULL,
|
|
@@ -1365,10 +1287,10 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1365
1287
|
WHERE status IN ('claimed', 'running')
|
|
1366
1288
|
AND claimed_by IS NOT NULL
|
|
1367
1289
|
AND lease_expires_at < now()
|
|
1368
|
-
AND attempts >= (CASE task_kind ${
|
|
1369
|
-
AND lease_recoveries >= ${
|
|
1290
|
+
AND attempts >= (CASE task_kind ${ga()} ELSE 3 END)
|
|
1291
|
+
AND lease_recoveries >= ${fa}
|
|
1370
1292
|
RETURNING id
|
|
1371
|
-
`),n=await
|
|
1293
|
+
`),n=await d.execute(kr`
|
|
1372
1294
|
UPDATE ${kr.raw(e)}
|
|
1373
1295
|
SET status = 'pending',
|
|
1374
1296
|
attempts = GREATEST(attempts - 1, 0),
|
|
@@ -1381,31 +1303,31 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1381
1303
|
AND claimed_by IS NOT NULL
|
|
1382
1304
|
AND lease_expires_at < now()
|
|
1383
1305
|
RETURNING id
|
|
1384
|
-
`),r=await
|
|
1306
|
+
`),r=await d.execute(kr`
|
|
1385
1307
|
UPDATE ${kr.raw(e)}
|
|
1386
1308
|
SET status = CASE
|
|
1387
|
-
WHEN attempts >= (CASE task_kind ${
|
|
1388
|
-
AND lease_recoveries >= ${
|
|
1309
|
+
WHEN attempts >= (CASE task_kind ${ga()} ELSE 3 END)
|
|
1310
|
+
AND lease_recoveries >= ${fa} THEN 'failed'
|
|
1389
1311
|
ELSE 'pending'
|
|
1390
1312
|
END,
|
|
1391
1313
|
attempts = CASE
|
|
1392
|
-
WHEN attempts >= (CASE task_kind ${
|
|
1393
|
-
AND lease_recoveries >= ${
|
|
1314
|
+
WHEN attempts >= (CASE task_kind ${ga()} ELSE 3 END)
|
|
1315
|
+
AND lease_recoveries >= ${fa} THEN attempts
|
|
1394
1316
|
ELSE GREATEST(attempts - 1, 0)
|
|
1395
1317
|
END,
|
|
1396
1318
|
lease_recoveries = CASE
|
|
1397
|
-
WHEN attempts >= (CASE task_kind ${
|
|
1398
|
-
AND lease_recoveries >= ${
|
|
1319
|
+
WHEN attempts >= (CASE task_kind ${ga()} ELSE 3 END)
|
|
1320
|
+
AND lease_recoveries >= ${fa} THEN lease_recoveries
|
|
1399
1321
|
ELSE lease_recoveries + 1
|
|
1400
1322
|
END,
|
|
1401
1323
|
error = CASE
|
|
1402
|
-
WHEN attempts >= (CASE task_kind ${
|
|
1403
|
-
AND lease_recoveries >= ${
|
|
1324
|
+
WHEN attempts >= (CASE task_kind ${ga()} ELSE 3 END)
|
|
1325
|
+
AND lease_recoveries >= ${fa} THEN ${g1}
|
|
1404
1326
|
ELSE error
|
|
1405
1327
|
END,
|
|
1406
1328
|
completed_at = CASE
|
|
1407
|
-
WHEN attempts >= (CASE task_kind ${
|
|
1408
|
-
AND lease_recoveries >= ${
|
|
1329
|
+
WHEN attempts >= (CASE task_kind ${ga()} ELSE 3 END)
|
|
1330
|
+
AND lease_recoveries >= ${fa} THEN now()
|
|
1409
1331
|
ELSE completed_at
|
|
1410
1332
|
END,
|
|
1411
1333
|
claimed_at = NULL,
|
|
@@ -1415,7 +1337,7 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1415
1337
|
AND claimed_by IS NULL
|
|
1416
1338
|
AND updated_at < now() - interval '15 minutes'
|
|
1417
1339
|
RETURNING id
|
|
1418
|
-
`);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`
|
|
1419
1341
|
UPDATE memory_experiments me
|
|
1420
1342
|
SET status = 'failed',
|
|
1421
1343
|
error = 'reconciler: worker died mid-experiment (backing job terminal, row left running)',
|
|
@@ -1428,12 +1350,12 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1428
1350
|
AND aj.status IN ('failed', 'completed')
|
|
1429
1351
|
)
|
|
1430
1352
|
RETURNING me.id
|
|
1431
|
-
`)).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`
|
|
1432
1354
|
update memories m
|
|
1433
1355
|
set trust_class = v.cls, trust_version = v.ver, trust_computed_at = now()
|
|
1434
1356
|
from (values ${n}) as v(id, cls, ver)
|
|
1435
1357
|
where m.id = v.id and m.user_id = ${e}
|
|
1436
|
-
`)}
|
|
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`
|
|
1437
1359
|
WITH active_users AS (
|
|
1438
1360
|
SELECT user_id, count(*) AS sessions_24h
|
|
1439
1361
|
FROM sessions
|
|
@@ -1464,13 +1386,13 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1464
1386
|
LEFT JOIN latest_obs o ON o.user_id = a.user_id
|
|
1465
1387
|
LEFT JOIN first_seen f ON f.user_id = a.user_id
|
|
1466
1388
|
WHERE (o.last_observed IS NULL
|
|
1467
|
-
AND f.first_session < now() - make_interval(hours => ${
|
|
1468
|
-
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})
|
|
1469
1391
|
)
|
|
1470
1392
|
INSERT INTO alert_dispatches (user_id, alert_key, severity, channel, last_state)
|
|
1471
1393
|
SELECT
|
|
1472
1394
|
s.user_id,
|
|
1473
|
-
${
|
|
1395
|
+
${KS},
|
|
1474
1396
|
'soft',
|
|
1475
1397
|
'in_app',
|
|
1476
1398
|
jsonb_build_object(
|
|
@@ -1487,11 +1409,11 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1487
1409
|
WHERE NOT EXISTS (
|
|
1488
1410
|
SELECT 1 FROM alert_dispatches d
|
|
1489
1411
|
WHERE d.user_id = s.user_id
|
|
1490
|
-
AND d.alert_key = ${
|
|
1491
|
-
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})
|
|
1492
1414
|
)
|
|
1493
1415
|
RETURNING user_id, id, last_state->>'message' AS message
|
|
1494
|
-
`);e.length>0&&console.log(`[usage-staleness] dispatched stale-pipeline alert for ${e.length} user(s)`);for(let t of e)try{await ua({userId:t.user_id,dispatchId:t.id,severity:"soft",message:t.message??"Usage tracking looks broken \u2014 open /usage.",title:"Usage tracking issue"})}catch(n){console.error("[usage-staleness] bell mirror failed:",n instanceof Error?n.message:n)}return e.length}
|
|
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`
|
|
1495
1417
|
WITH active_users AS (
|
|
1496
1418
|
SELECT user_id, max(last_seen) AS last_observed,
|
|
1497
1419
|
array_agg(DISTINCT signal) AS signals
|
|
@@ -1501,13 +1423,13 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1501
1423
|
FROM limit_observations
|
|
1502
1424
|
WHERE source_type = 'oauth_usage'
|
|
1503
1425
|
AND user_id IS NOT NULL
|
|
1504
|
-
AND observed_at > now() - make_interval(hours => ${
|
|
1426
|
+
AND observed_at > now() - make_interval(hours => ${wm})
|
|
1505
1427
|
GROUP BY user_id
|
|
1506
1428
|
UNION ALL
|
|
1507
1429
|
SELECT user_id, max(last_heartbeat), 'worker heartbeat'
|
|
1508
1430
|
FROM worker_connections
|
|
1509
1431
|
WHERE worker_type = 'cli-worker'
|
|
1510
|
-
AND last_heartbeat > now() - make_interval(hours => ${
|
|
1432
|
+
AND last_heartbeat > now() - make_interval(hours => ${wm})
|
|
1511
1433
|
GROUP BY user_id
|
|
1512
1434
|
UNION ALL
|
|
1513
1435
|
-- Beacons are unauthenticated (no user_id); attribute via the most
|
|
@@ -1523,7 +1445,7 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1523
1445
|
) owner ON true
|
|
1524
1446
|
WHERE e.event = 'hook_capture_failed'
|
|
1525
1447
|
AND e.device_id IS NOT NULL
|
|
1526
|
-
AND e.created_at > now() - make_interval(hours => ${
|
|
1448
|
+
AND e.created_at > now() - make_interval(hours => ${wm})
|
|
1527
1449
|
GROUP BY owner.user_id
|
|
1528
1450
|
) signal_union
|
|
1529
1451
|
GROUP BY user_id
|
|
@@ -1542,12 +1464,12 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1542
1464
|
FROM active_users a
|
|
1543
1465
|
LEFT JOIN latest_session s ON s.user_id = a.user_id
|
|
1544
1466
|
WHERE s.last_session IS NULL
|
|
1545
|
-
OR s.last_session < now() - make_interval(hours => ${
|
|
1467
|
+
OR s.last_session < now() - make_interval(hours => ${wm})
|
|
1546
1468
|
)
|
|
1547
1469
|
INSERT INTO alert_dispatches (user_id, alert_key, severity, channel, last_state)
|
|
1548
1470
|
SELECT
|
|
1549
1471
|
s.user_id,
|
|
1550
|
-
${
|
|
1472
|
+
${YS},
|
|
1551
1473
|
'soft',
|
|
1552
1474
|
'in_app',
|
|
1553
1475
|
jsonb_build_object(
|
|
@@ -1566,11 +1488,11 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1566
1488
|
WHERE NOT EXISTS (
|
|
1567
1489
|
SELECT 1 FROM alert_dispatches d
|
|
1568
1490
|
WHERE d.user_id = s.user_id
|
|
1569
|
-
AND d.alert_key = ${
|
|
1570
|
-
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})
|
|
1571
1493
|
)
|
|
1572
1494
|
RETURNING user_id, id, last_state->>'message' AS message
|
|
1573
|
-
`);e.length>0&&console.log(`[capture-staleness] dispatched stale-capture alert for ${e.length} user(s)`);for(let t of e)try{await ua({userId:t.user_id,dispatchId:t.id,severity:"soft",message:t.message??"Session capture looks broken \u2014 check the proxy.",title:"Session capture issue"})}catch(n){console.error("[capture-staleness] bell mirror failed:",n instanceof Error?n.message:n)}return e.length}
|
|
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`
|
|
1574
1496
|
WITH session_stats AS (
|
|
1575
1497
|
SELECT s.id,
|
|
1576
1498
|
s.external_session_id,
|
|
@@ -1578,10 +1500,10 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1578
1500
|
(
|
|
1579
1501
|
SELECT MAX(timestamp) FROM session_events e
|
|
1580
1502
|
WHERE e.session_id = s.id
|
|
1581
|
-
AND e.event_type = ANY(${
|
|
1503
|
+
AND e.event_type = ANY(${O1})
|
|
1582
1504
|
) AS last_hook_event
|
|
1583
1505
|
FROM sessions s
|
|
1584
|
-
WHERE s.started_at > now() - (${
|
|
1506
|
+
WHERE s.started_at > now() - (${ZS}::int * interval '1 hour')
|
|
1585
1507
|
)
|
|
1586
1508
|
SELECT ss.id AS "sessionId",
|
|
1587
1509
|
ss.external_session_id AS "externalSessionId",
|
|
@@ -1592,8 +1514,8 @@ end`;async function Ds(e){let t=e.req.param("teamId");if(!t||!Gr.test(t))return{
|
|
|
1592
1514
|
FROM session_stats ss
|
|
1593
1515
|
JOIN context_snapshots cs ON cs.session_id = ss.id
|
|
1594
1516
|
WHERE ss.last_hook_event IS NOT NULL
|
|
1595
|
-
AND cs.captured_at > ss.last_hook_event + (${
|
|
1517
|
+
AND cs.captured_at > ss.last_hook_event + (${eA}::int * interval '1 second')
|
|
1596
1518
|
GROUP BY ss.id, ss.external_session_id, ss.tool
|
|
1597
1519
|
HAVING COUNT(cs.id) > 0
|
|
1598
|
-
`)]}
|
|
1599
|
-
`)){let t=e.trim();if(!t||t.startsWith("#"))continue;let n=t.indexOf("=");if(n===-1)continue;let r=t.slice(0,n),o=t.slice(n+1);process.env[r]||(process.env[r]=o)}process.env.PG_APPLICATION_NAME||="rulemetric-api";var
|
|
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);
|