@rulemetric/cli 0.7.44 → 0.8.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/README.md +34 -0
- package/dist/base-command.js +1 -1
- package/dist/{chunk-QFVGUZDO.js → chunk-4PWGV2OW.js} +9 -8
- package/dist/chunk-7QQSYEPT.js +1 -0
- package/dist/chunk-A4FYFRN7.js +1 -0
- package/dist/chunk-BAVLNWO4.js +1 -0
- package/dist/{chunk-AF3ITIZ4.js → chunk-CF7FUQQ4.js} +1 -1
- package/dist/{chunk-FFI3C3B3.js → chunk-EVAQBD5V.js} +1 -1
- package/dist/chunk-FAZMKMTC.js +45 -0
- package/dist/{chunk-2DXBC2JQ.js → chunk-LWI5K6T4.js} +1 -1
- package/dist/{chunk-ATA4J4ZG.js → chunk-MBHDTW3M.js} +1 -1
- package/dist/chunk-UKN2YVY4.js +17 -0
- package/dist/chunk-XJYNMJHH.js +9 -0
- package/dist/chunk-ZE2PGHJQ.js +13 -0
- package/dist/commands/antigravity/backfill.js +1 -1
- package/dist/commands/auth/create-key.js +1 -1
- package/dist/commands/auth/login.js +1 -1
- package/dist/commands/auth/logout.js +1 -1
- package/dist/commands/auth/revoke-key.js +1 -1
- package/dist/commands/auth/signup.js +1 -1
- package/dist/commands/auth/status.js +1 -1
- package/dist/commands/capture/scope.js +1 -1
- package/dist/commands/catalog/index.js +1 -1
- package/dist/commands/catalog/recommend.js +1 -1
- package/dist/commands/convert.js +1 -1
- package/dist/commands/converters.js +1 -1
- package/dist/commands/crons/list.js +1 -1
- package/dist/commands/crons/run.js +1 -1
- package/dist/commands/dashboard.js +1 -1
- package/dist/commands/diagnostics.js +1 -1
- package/dist/commands/eval-targets/create.js +1 -1
- package/dist/commands/eval-targets/list.js +1 -1
- package/dist/commands/evals/agent.js +1 -1
- package/dist/commands/evals/auto-run.js +1 -1
- package/dist/commands/evals/benchmark.js +1 -1
- package/dist/commands/evals/compare.js +1 -1
- package/dist/commands/evals/create.js +1 -1
- package/dist/commands/evals/optimize-description.js +1 -1
- package/dist/commands/evals/optimize.js +1 -1
- package/dist/commands/evals/refine-cases.js +1 -1
- package/dist/commands/evals/run.js +1 -1
- package/dist/commands/evals/validate-judge.js +1 -1
- package/dist/commands/experiments/list.js +1 -0
- package/dist/commands/gateway/ensure.js +1 -1
- package/dist/commands/hooks/install.js +1 -1
- package/dist/commands/hooks/run.js +1 -1
- package/dist/commands/hooks/uninstall.js +1 -1
- package/dist/commands/import.js +1 -1
- package/dist/commands/instructions/create.js +1 -1
- package/dist/commands/instructions/delete.js +1 -1
- package/dist/commands/instructions/fork.js +1 -1
- package/dist/commands/instructions/get.js +1 -1
- package/dist/commands/instructions/list.js +1 -1
- package/dist/commands/instructions/promote.js +1 -1
- package/dist/commands/instructions/pull.js +1 -1
- package/dist/commands/instructions/restore.js +1 -1
- package/dist/commands/instructions/retract.js +1 -0
- package/dist/commands/instructions/upstream.js +1 -1
- package/dist/commands/instructions/versions.js +1 -1
- package/dist/commands/launcher.js +1 -1
- package/dist/commands/local/down.js +1 -1
- package/dist/commands/local/up.js +1 -1
- package/dist/commands/org/current.js +1 -1
- package/dist/commands/org/list.js +1 -1
- package/dist/commands/org/switch.js +1 -1
- package/dist/commands/packs/add-instruction.js +1 -1
- package/dist/commands/packs/apply.js +1 -1
- package/dist/commands/packs/create.js +1 -1
- package/dist/commands/packs/fork.js +1 -1
- package/dist/commands/packs/get.js +1 -1
- package/dist/commands/packs/list.js +1 -1
- package/dist/commands/packs/remove-instruction.js +1 -1
- package/dist/commands/proxy/env.js +1 -1
- package/dist/commands/proxy/logs.js +1 -1
- package/dist/commands/proxy/restart.js +1 -1
- package/dist/commands/proxy/setup.js +1 -1
- package/dist/commands/proxy/start.js +1 -1
- package/dist/commands/proxy/status.js +1 -1
- package/dist/commands/proxy/stop.js +1 -1
- package/dist/commands/research/backfill.js +1 -1
- package/dist/commands/research/tail-transcript.js +1 -1
- package/dist/commands/service/install.js +1 -1
- package/dist/commands/service/status.js +1 -1
- package/dist/commands/service/uninstall.js +1 -1
- package/dist/commands/sessions/analyze.js +1 -1
- package/dist/commands/sessions/delete.js +1 -1
- package/dist/commands/sessions/end.js +1 -1
- package/dist/commands/sessions/import.js +1 -1
- package/dist/commands/sessions/list.js +1 -1
- package/dist/commands/sessions/start.js +1 -1
- package/dist/commands/setup.js +1 -1
- package/dist/commands/skills/export-approved.js +1 -1
- package/dist/commands/skills/install.js +1 -1
- package/dist/commands/skills/list.js +1 -1
- package/dist/commands/skills/publish.js +1 -1
- package/dist/commands/skills/search.js +1 -1
- package/dist/commands/skills/update.js +1 -1
- package/dist/commands/suggestions/accept.js +1 -1
- package/dist/commands/suggestions/dismiss.js +1 -1
- package/dist/commands/suggestions/list.js +1 -1
- package/dist/commands/suggestions/refresh.js +1 -1
- package/dist/dashboard/Dashboard.js +1 -1
- package/dist/dashboard/launcher/LauncherOverlay.js +1 -1
- package/dist/lib/agent-loop.js +1 -1
- package/dist/lib/handlers/cron-instruction-evolution.js +1 -1
- package/dist/lib/handlers/cron-suggest-instructions.js +1 -1
- package/dist/lib/handlers/process-changelog.js +1 -1
- package/dist/lib/handlers/process-insights.js +1 -1
- package/dist/lib/insights-prompts.js +1 -1
- package/dist/lib/instruction-proposer.js +1 -1
- package/dist/lib/manual-tasks.js +1 -1
- package/dist/lib/retraction.js +1 -0
- package/oclif.manifest.json +434 -300
- package/package.json +9 -6
- package/dist/chunk-2RCWYVEU.js +0 -1
- package/dist/chunk-5R5RGKOW.js +0 -38
- package/dist/chunk-I7QSMY3Z.js +0 -1
- package/dist/chunk-O7PSLZO6.js +0 -15
- package/dist/chunk-RMDLJN4L.js +0 -8
- package/dist/chunk-V2IEFHT7.js +0 -1
package/README.md
CHANGED
|
@@ -17,6 +17,40 @@ Credentials are read from (first match wins):
|
|
|
17
17
|
3. `~/.config/rulemetric/auth.json` (JSON fallback, requires `jq`)
|
|
18
18
|
4. `.env.local` in the project root (development)
|
|
19
19
|
|
|
20
|
+
## Local mode (all data on your machine)
|
|
21
|
+
|
|
22
|
+
By default the CLI talks to the hosted service at `rulemetric.com`. `local up`
|
|
23
|
+
runs the whole product on your own machine instead — API, dashboard, and
|
|
24
|
+
database — with no cloud contact at all.
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
rulemetric local up # start (downloads the local runtime on first run)
|
|
28
|
+
rulemetric local up --foreground # run in this terminal instead of as a service
|
|
29
|
+
rulemetric local up --port 3210 # non-default port
|
|
30
|
+
rulemetric local up --email you@example.com --password '<pw>' # provision the first user
|
|
31
|
+
rulemetric local down # stop; data is preserved
|
|
32
|
+
rulemetric local down --delete-data # stop and wipe the local database (irreversible)
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
**Requires Docker** (the database runs in it) and the
|
|
36
|
+
[Supabase CLI](https://supabase.com/docs/guides/cli) —
|
|
37
|
+
`brew install supabase/tap/supabase`. First run downloads `@rulemetric/local`
|
|
38
|
+
(~10 MB: bundled API server, dashboard, and migrations) at a version locked to
|
|
39
|
+
your CLI; add `--yes` to skip the confirmation. Cloud-only users never download it.
|
|
40
|
+
|
|
41
|
+
The dashboard is then at `http://localhost:3000` (or your `--port`), and
|
|
42
|
+
`rulemetric hooks install` points capture at it like any other API URL.
|
|
43
|
+
|
|
44
|
+
To guarantee nothing ever reaches the cloud — including implicit fallbacks —
|
|
45
|
+
set strict mode, which turns every unconfigured cloud call into a loud failure
|
|
46
|
+
instead of a silent upload:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
echo 'RULEMETRIC_STRICT_LOCAL=1' >> ~/.config/rulemetric/env
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
`local down` leaves your data on disk; `local up` picks it back up.
|
|
53
|
+
|
|
20
54
|
## Org commands
|
|
21
55
|
|
|
22
56
|
The org commands let you list and switch the "active org" used by every
|
package/dist/base-command.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a}from"./chunk-
|
|
1
|
+
import{a}from"./chunk-LWI5K6T4.js";import"./chunk-IZTIYR5Q.js";import"./chunk-6VKQT2J3.js";import"./chunk-NIRD7ETU.js";import"./chunk-QY3UKLDE.js";import"./chunk-3AV3GTMP.js";import"./chunk-KLEF5D3A.js";import"./chunk-JZ5Z2BRO.js";import"./chunk-ZLLER3HP.js";export{a as BaseCommand};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
import{a}from"./chunk-ZLLER3HP.js";function i(n){let t=n.dismissed.filter(e=>e.label.trim()!==""),o=n.repeated.filter(e=>e.label.trim()!=="");if(t.length===0&&o.length===0)return"";let s=["","## ADVICE YOU HAVE ALREADY GIVEN THIS USER","This is your own prior output for this project. Use it to say something NEW."];return t.length>0&&s.push("","DISMISSED by the user \u2014 do NOT propose these again, and do not propose a","reworded version of them. A paraphrase of a dismissed suggestion is still","the dismissed suggestion:",...t.map(e=>`- [${e.category}] ${e.label}`)),o.length>0&&s.push("","ALREADY GENERATED, sometimes repeatedly. Repeat one ONLY if it is still","the single most important finding in the data \u2014 otherwise prefer a new","observation over restating these:",...o.map(e=>`- [${e.category}] ${e.label} (generated ${e.timesGenerated}x)`)),s.join(`
|
|
2
|
+
`)}a(i,"renderGeneratorMemory");var r=[{name:"project_areas",usesGeneratorMemory:!0,prompt:`Analyze this Claude Code usage data and identify project areas.
|
|
2
3
|
RESPOND WITH ONLY A VALID JSON OBJECT:
|
|
3
4
|
{
|
|
4
5
|
"areas": [
|
|
@@ -10,7 +11,7 @@ RESPOND WITH ONLY A VALID JSON OBJECT:
|
|
|
10
11
|
{
|
|
11
12
|
"narrative": "2-3 paragraphs analyzing HOW the user interacts with Claude Code. Use second person 'you'. Describe patterns: iterate quickly vs detailed upfront specs? Interrupt often or let Claude run? Include specific examples. Use **bold** for key insights.",
|
|
12
13
|
"key_pattern": "One sentence summary of most distinctive interaction style"
|
|
13
|
-
}`,maxTokens:8192},{name:"what_works",prompt:`Analyze this Claude Code usage data and identify what's working well for this user. Use second person ("you").
|
|
14
|
+
}`,maxTokens:8192},{name:"what_works",usesGeneratorMemory:!0,prompt:`Analyze this Claude Code usage data and identify what's working well for this user. Use second person ("you").
|
|
14
15
|
RESPOND WITH ONLY A VALID JSON OBJECT:
|
|
15
16
|
{
|
|
16
17
|
"intro": "1 sentence of context",
|
|
@@ -18,7 +19,7 @@ RESPOND WITH ONLY A VALID JSON OBJECT:
|
|
|
18
19
|
{"title": "Short title (3-6 words)", "description": "2-3 sentences describing the impressive workflow or approach. Use 'you' not 'the user'."}
|
|
19
20
|
]
|
|
20
21
|
}
|
|
21
|
-
Include 3 impressive workflows.`,maxTokens:8192},{name:"friction_analysis",prompt:`Analyze this Claude Code usage data and identify friction points for this user. Use second person ("you").
|
|
22
|
+
Include 3 impressive workflows.`,maxTokens:8192},{name:"friction_analysis",usesGeneratorMemory:!0,prompt:`Analyze this Claude Code usage data and identify friction points for this user. Use second person ("you").
|
|
22
23
|
RESPOND WITH ONLY A VALID JSON OBJECT:
|
|
23
24
|
{
|
|
24
25
|
"intro": "1 sentence summarizing friction patterns",
|
|
@@ -26,7 +27,7 @@ RESPOND WITH ONLY A VALID JSON OBJECT:
|
|
|
26
27
|
{"category": "Concrete category name", "description": "1-2 sentences explaining this category and what could be done differently. Use 'you' not 'the user'.", "examples": ["Specific example with consequence", "Another example"]}
|
|
27
28
|
]
|
|
28
29
|
}
|
|
29
|
-
Include 3 friction categories with 2 examples each.`,maxTokens:8192},{name:"suggestions",prompt:`Analyze this Claude Code usage data and suggest improvements.
|
|
30
|
+
Include 3 friction categories with 2 examples each.`,maxTokens:8192},{name:"suggestions",usesGeneratorMemory:!0,prompt:`Analyze this Claude Code usage data and suggest improvements.
|
|
30
31
|
## CC FEATURES REFERENCE (pick from these for features_to_try):
|
|
31
32
|
1. **MCP Servers**: Connect Claude to external tools, databases, and APIs via Model Context Protocol.
|
|
32
33
|
- How to use: Run \`claude mcp add <server-name> -- <command>\`
|
|
@@ -50,7 +51,7 @@ RESPOND WITH ONLY A VALID JSON OBJECT:
|
|
|
50
51
|
{"title": "Short title", "suggestion": "1-2 sentence summary", "detail": "3-4 sentences explaining how this applies", "copyable_prompt": "A specific prompt to copy and try"}
|
|
51
52
|
]
|
|
52
53
|
}
|
|
53
|
-
Include 2-3 items for each category.`,maxTokens:8192},{name:"on_the_horizon",prompt:`Analyze this Claude Code usage data and identify future opportunities.
|
|
54
|
+
Include 2-3 items for each category.`,maxTokens:8192},{name:"on_the_horizon",usesGeneratorMemory:!0,prompt:`Analyze this Claude Code usage data and identify future opportunities.
|
|
54
55
|
RESPOND WITH ONLY A VALID JSON OBJECT:
|
|
55
56
|
{
|
|
56
57
|
"intro": "1 sentence about evolving AI-assisted development",
|
|
@@ -64,7 +65,7 @@ RESPOND WITH ONLY A VALID JSON OBJECT:
|
|
|
64
65
|
"headline": "A memorable QUALITATIVE moment from the transcripts - not a statistic. Something human, funny, or surprising.",
|
|
65
66
|
"detail": "Brief context about when/where this happened"
|
|
66
67
|
}
|
|
67
|
-
Find something genuinely interesting or amusing from the session summaries.`,maxTokens:8192}],
|
|
68
|
+
Find something genuinely interesting or amusing from the session summaries.`,maxTokens:8192}],d=`You're writing an "At a Glance" summary for a Claude Code usage insights report.
|
|
68
69
|
Use this 4-part structure:
|
|
69
70
|
1. **What's working** - What is the user's unique style and what impactful things have they done? Don't be fluffy.
|
|
70
71
|
2. **What's hindering you** - Split into (a) Claude's fault and (b) user-side friction. Be honest but constructive.
|
|
@@ -77,7 +78,7 @@ RESPOND WITH ONLY A VALID JSON OBJECT:
|
|
|
77
78
|
"whats_hindering": "(refer to instructions above)",
|
|
78
79
|
"quick_wins": "(refer to instructions above)",
|
|
79
80
|
"ambitious_workflows": "(refer to instructions above)"
|
|
80
|
-
}`,
|
|
81
|
+
}`,l=`Analyze this coding session and produce a structured analysis.
|
|
81
82
|
The session is from a non-Claude-Code tool, so analyze the conversation and tool usage patterns.
|
|
82
83
|
|
|
83
84
|
RESPOND WITH ONLY A VALID JSON OBJECT:
|
|
@@ -99,4 +100,4 @@ Outcome guide:
|
|
|
99
100
|
- mostly_achieved: Main goal done but minor items remain
|
|
100
101
|
- partially_achieved: Some progress but significant work left
|
|
101
102
|
- not_achieved: Attempted but failed
|
|
102
|
-
- abandoned: User gave up or switched tasks`;export{
|
|
103
|
+
- abandoned: User gave up or switched tasks`;export{i as a,r as b,d as c,l as d};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as p,c as Zr}from"./chunk-ZLLER3HP.js";import{boolean as es,date as ts,index as Lt,integer as os,jsonb as ns,pgTable as Ut,text as A,timestamp as H,uniqueIndex as rs,uuid as ie}from"drizzle-orm/pg-core";var Lo=Ut("announcements",{id:ie("id").primaryKey().defaultRandom(),version:A("version").notNull().unique(),releaseDate:ts("release_date").notNull(),subject:A("subject").notNull(),htmlBody:A("html_body").notNull(),textBody:A("text_body").notNull(),sections:ns("sections").notNull().default({}),status:A("status").notNull().default("draft"),recipientCount:os("recipient_count"),sentAt:H("sent_at",{withTimezone:!0}),sentBy:ie("sent_by"),error:A("error"),createdAt:H("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:H("updated_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Lt("idx_announcements_status").on(e.status),Lt("idx_announcements_created").on(e.createdAt)]),Uo=Ut("announcement_deliveries",{id:ie("id").primaryKey().defaultRandom(),announcementId:ie("announcement_id").notNull(),userId:ie("user_id").notNull(),email:A("email").notNull(),status:A("status").notNull().default("pending"),providerId:A("provider_id"),error:A("error"),sentAt:H("sent_at",{withTimezone:!0}),createdAt:H("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[rs("uniq_announcement_deliveries_announcement_user").on(e.announcementId,e.userId),Lt("idx_announcement_deliveries_user").on(e.userId,e.createdAt)]),Bo=Ut("notification_preferences",{userId:ie("user_id").primaryKey(),productAnnouncements:es("product_announcements").notNull().default(!0),unsubscribeToken:A("unsubscribe_token").notNull().unique(),unsubscribedAt:H("unsubscribed_at",{withTimezone:!0}),createdAt:H("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:H("updated_at",{withTimezone:!0}).notNull().defaultNow()});import{boolean as Fo,pgTable as ss,text as nt,timestamp as Bt,uuid as Jo}from"drizzle-orm/pg-core";import{pgTable as ot,text as ae,timestamp as ke,jsonb as Vo,uuid as Q,primaryKey as Go}from"drizzle-orm/pg-core";var u=ot("organizations",{id:Q("id").primaryKey().defaultRandom(),name:ae("name").unique().notNull(),slug:ae("slug").unique().notNull(),metadata:Vo("metadata"),createdAt:ke("created_at",{withTimezone:!0}).defaultNow(),updatedAt:ke("updated_at",{withTimezone:!0}).defaultNow()}),v=ot("teams",{id:Q("id").primaryKey().defaultRandom(),orgId:Q("org_id").references(()=>u.id,{onDelete:"cascade"}),name:ae("name").notNull(),slug:ae("slug").notNull(),metadata:Vo("metadata"),createdAt:ke("created_at",{withTimezone:!0}).defaultNow()}),de=ot("user_organizations",{userId:Q("user_id").notNull(),orgId:Q("org_id").references(()=>u.id,{onDelete:"cascade"}).notNull(),role:ae("role").notNull().default("member"),createdAt:ke("created_at",{withTimezone:!0}).defaultNow()},e=>[Go({columns:[e.userId,e.orgId]})]),ue=ot("user_teams",{userId:Q("user_id").notNull(),teamId:Q("team_id").references(()=>v.id,{onDelete:"cascade"}).notNull(),role:ae("role").notNull().default("member"),createdAt:ke("created_at",{withTimezone:!0}).defaultNow()},e=>[Go({columns:[e.userId,e.teamId]})]);var o=ss("profiles",{id:Jo("id").primaryKey(),email:nt("email"),displayName:nt("display_name"),activeOrgId:Jo("active_org_id").references(()=>u.id,{onDelete:"set null"}),isSuperadmin:Fo("is_superadmin").notNull().default(!1),claudeCodePlan:nt("claude_code_plan"),planSource:nt("plan_source").notNull().default("detected"),setupCompletedAt:Bt("setup_completed_at",{withTimezone:!0}),liveSendSkipped:Fo("live_send_skipped").notNull().default(!1),createdAt:Bt("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Bt("updated_at",{withTimezone:!0}).defaultNow()});import{pgTable as is,text as Vt,timestamp as rt,uuid as st,index as $o}from"drizzle-orm/pg-core";var E=is("org_invitations",{id:st("id").primaryKey().defaultRandom(),orgId:st("org_id").notNull().references(()=>u.id,{onDelete:"cascade"}),email:Vt("email").notNull(),role:Vt("role").notNull().default("member"),teamId:st("team_id").references(()=>v.id,{onDelete:"set null"}),invitedBy:st("invited_by").notNull().references(()=>o.id,{onDelete:"cascade"}),token:Vt("token").notNull().unique(),expiresAt:rt("expires_at",{withTimezone:!0}).notNull(),acceptedAt:rt("accepted_at",{withTimezone:!0}),revokedAt:rt("revoked_at",{withTimezone:!0}),createdAt:rt("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[$o("idx_org_invitations_token").on(e.token),$o("idx_org_invitations_org").on(e.orgId)]);import{pgTable as Gt,text as x,timestamp as L,jsonb as it,uuid as j,integer as at,boolean as as,uniqueIndex as dt,index as Ee}from"drizzle-orm/pg-core";var n=Gt("instructions",{id:j("id").primaryKey().defaultRandom(),name:x("name").notNull(),description:x("description").notNull(),type:x("type").notNull().default("instruction"),scope:x("scope").notNull(),scopeRef:j("scope_ref"),version:x("version").notNull(),content:x("content").notNull(),frontmatter:it("frontmatter").notNull(),slots:it("slots"),tags:x("tags").array(),compatibility:x("compatibility").array(),createdBy:j("created_by"),createdAt:L("created_at",{withTimezone:!0}).defaultNow(),updatedAt:L("updated_at",{withTimezone:!0}).defaultNow(),archived:as("archived").default(!1),archivedAt:L("archived_at",{withTimezone:!0}),archivedBy:j("archived_by"),forkedFromId:j("forked_from_id").references(()=>n.id,{onDelete:"set null"}),upstreamVersion:x("upstream_version"),badge:x("badge"),contentHash:x("content_hash"),contextIdentity:x("context_identity"),scanScore:at("scan_score"),scanFindings:it("scan_findings"),popularityScore:at("popularity_score"),sourceUpdatedAt:L("source_updated_at",{withTimezone:!0})},e=>[dt("instructions_name_scope_ref_idx").on(e.name,e.scope,e.scopeRef),Ee("idx_instructions_scope").on(e.scope,e.scopeRef),Ee("idx_instructions_created_by").on(e.createdBy),Ee("idx_instructions_context_identity").on(e.createdBy,e.contextIdentity),Ee("idx_instructions_public_recency").on(e.scope,e.sourceUpdatedAt.desc())]),Yo=Gt("instruction_version_identities",{id:j("id").primaryKey().defaultRandom(),instructionId:j("instruction_id").notNull().references(()=>n.id,{onDelete:"cascade"}),contentHash:x("content_hash").notNull(),versionOrdinal:at("version_ordinal").notNull(),content:x("content"),firstSeenAt:L("first_seen_at",{withTimezone:!0}).notNull().defaultNow(),lastSeenAt:L("last_seen_at",{withTimezone:!0}).notNull().defaultNow(),createdAt:L("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[dt("instruction_version_identities_hash_unique").on(e.instructionId,e.contentHash),dt("instruction_version_identities_ordinal_unique").on(e.instructionId,e.versionOrdinal),Ee("idx_ivi_instruction").on(e.instructionId)]),le=Gt("instruction_versions",{id:j("id").primaryKey().defaultRandom(),instructionId:j("instruction_id").references(()=>n.id,{onDelete:"cascade"}),versionNumber:at("version_number").notNull(),content:x("content").notNull(),frontmatter:it("frontmatter").notNull(),changeSummary:x("change_summary"),createdBy:j("created_by"),createdAt:L("created_at",{withTimezone:!0}).defaultNow()},e=>[dt("instruction_versions_instruction_version_idx").on(e.instructionId,e.versionNumber)]);import{pgTable as ds,text as us,timestamp as ls,jsonb as cs,uuid as Ft,index as Qo}from"drizzle-orm/pg-core";var ce=ds("instruction_events",{id:Ft("id").primaryKey().defaultRandom(),instructionId:Ft("instruction_id").notNull().references(()=>n.id,{onDelete:"cascade"}),eventType:us("event_type").notNull(),actorId:Ft("actor_id").notNull(),metadata:cs("metadata"),createdAt:ls("created_at",{withTimezone:!0}).defaultNow()},e=>[Qo("idx_instruction_events_instruction").on(e.instructionId),Qo("idx_instruction_events_type").on(e.eventType)]);import{boolean as ms,jsonb as _s,pgTable as $t,primaryKey as Wo,text as W,timestamp as be,uniqueIndex as Jt,uuid as X}from"drizzle-orm/pg-core";import{sql as ps}from"drizzle-orm";var s=$t("projects",{id:X("id").primaryKey().defaultRandom(),orgId:X("org_id").references(()=>u.id,{onDelete:"cascade"}),name:W("name").notNull(),description:W("description"),githubRepo:W("github_repo"),gitRemoteUrl:W("git_remote_url"),gitRootCommit:W("git_root_commit"),gitRemoteAliases:W("git_remote_aliases").array().notNull().default([]),metadata:_s("metadata"),createdBy:X("created_by"),createdAt:be("created_at",{withTimezone:!0}).defaultNow(),updatedAt:be("updated_at",{withTimezone:!0}).defaultNow()},e=>[Jt("projects_org_name_idx").on(e.orgId,e.name),Jt("projects_git_remote_url_unique").on(e.gitRemoteUrl).where(ps`${e.gitRemoteUrl} IS NOT NULL`)]),U=$t("project_instructions",{projectId:X("project_id").references(()=>s.id,{onDelete:"cascade"}).notNull(),instructionId:X("instruction_id").references(()=>n.id,{onDelete:"cascade"}).notNull(),addedAt:be("added_at",{withTimezone:!0}).defaultNow(),addedBy:X("added_by")},e=>[Wo({columns:[e.projectId,e.instructionId]})]),Xo=$t("project_checkouts",{projectId:X("project_id").references(()=>s.id,{onDelete:"cascade"}).notNull(),path:W("path").notNull(),isWorktree:ms("is_worktree").notNull().default(!1),firstSeen:be("first_seen",{withTimezone:!0}).notNull().defaultNow(),lastSeen:be("last_seen",{withTimezone:!0}).notNull().defaultNow()},e=>[Wo({columns:[e.projectId,e.path]}),Jt("project_checkouts_path_unique").on(e.path)]);import{pgTable as Wt,text as I,timestamp as Se,jsonb as Z,uuid as b,integer as lt,uniqueIndex as en,index as D}from"drizzle-orm/pg-core";import{pgTable as fs,text as me,timestamp as Yt,jsonb as Zo,uuid as ut,integer as xs,boolean as Ns,index as Qt}from"drizzle-orm/pg-core";var g=fs("agent_runs",{id:ut("id").primaryKey().defaultRandom(),userId:ut("user_id").notNull().references(()=>o.id,{onDelete:"cascade"}),orgId:ut("org_id").references(()=>u.id,{onDelete:"set null"}),projectId:ut("project_id").references(()=>s.id,{onDelete:"set null"}),projectPath:me("project_path"),gitRemote:me("git_remote"),baseBranch:me("base_branch"),title:me("title"),prompt:me("prompt"),toolSpec:Zo("tool_spec").notNull().default([]),autoWorktree:Ns("auto_worktree").notNull().default(!0),status:me("status").notNull().default("pending"),sessionCount:xs("session_count").notNull().default(0),metadata:Zo("metadata").notNull().default({}),createdAt:Yt("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:Yt("updated_at",{withTimezone:!0}).notNull().defaultNow(),completedAt:Yt("completed_at",{withTimezone:!0})},e=>[Qt("idx_agent_runs_user").on(e.userId),Qt("idx_agent_runs_org_created").on(e.orgId,e.createdAt),Qt("idx_agent_runs_project").on(e.projectId)]);var d=Wt("sessions",{id:b("id").primaryKey().defaultRandom(),userId:b("user_id").notNull().references(()=>o.id,{onDelete:"cascade"}),externalSessionId:I("external_session_id"),projectId:b("project_id").references(()=>s.id,{onDelete:"set null"}),orgId:b("org_id").references(()=>u.id,{onDelete:"set null"}),tool:I("tool").notNull(),projectPath:I("project_path"),gitBranch:I("git_branch"),startedAt:Se("started_at",{withTimezone:!0}).notNull(),endedAt:Se("ended_at",{withTimezone:!0}),eventCount:lt("event_count").default(0),tokenUsage:Z("token_usage"),analysis:Z("analysis"),analyzedAt:Se("analyzed_at",{withTimezone:!0}),analyzedEventCount:lt("analyzed_event_count"),analyzedTurnCount:lt("analyzed_turn_count"),metadata:Z("metadata").default({}),origin:I("origin").notNull().default("unknown"),runId:b("run_id").references(()=>g.id,{onDelete:"set null"}),model:I("model"),harnessVersion:I("harness_version"),createdAt:Se("created_at",{withTimezone:!0}).defaultNow()},e=>[D("idx_sessions_user").on(e.userId),D("idx_sessions_tool").on(e.tool),D("idx_sessions_started_at").on(e.startedAt),D("idx_sessions_project").on(e.projectId),D("idx_sessions_org_started_at").on(e.orgId,e.startedAt),D("idx_sessions_run").on(e.runId),en("idx_sessions_user_external").on(e.userId,e.externalSessionId)]),_e=Wt("session_events",{id:b("id").primaryKey().defaultRandom(),sessionId:b("session_id").notNull().references(()=>d.id,{onDelete:"cascade"}),sequence:lt("sequence").notNull(),eventType:I("event_type").notNull(),content:I("content"),toolName:I("tool_name"),toolInput:Z("tool_input"),toolOutput:Z("tool_output"),tokenUsage:Z("token_usage"),model:I("model"),timestamp:Se("timestamp",{withTimezone:!0}).notNull(),metadata:Z("metadata").default({})},e=>[en("session_events_session_sequence_idx").on(e.sessionId,e.sequence),D("idx_session_events_session_id").on(e.sessionId),D("idx_session_events_event_type").on(e.eventType),D("idx_session_events_model").on(e.model)]),B=Wt("session_instructions",{sessionId:b("session_id").notNull().references(()=>d.id,{onDelete:"cascade"}),instructionId:b("instruction_id").notNull().references(()=>n.id,{onDelete:"cascade"}),linkMethod:I("link_method").notNull(),contentHash:I("content_hash")},e=>[D("idx_session_instructions_instruction_id").on(e.instructionId)]);import{pgTable as tn,text as ct,timestamp as on,uuid as R,integer as nn,index as pe,unique as gs}from"drizzle-orm/pg-core";var S=tn("treatment_assignments",{id:R("id").primaryKey().defaultRandom(),userId:R("user_id").notNull().references(()=>o.id,{onDelete:"cascade"}),treatmentType:ct("treatment_type").notNull(),treatmentId:R("treatment_id").notNull(),treatmentVersion:nn("treatment_version").notNull().default(1),projectId:R("project_id").references(()=>s.id,{onDelete:"set null"}),assignedBy:R("assigned_by").references(()=>o.id,{onDelete:"set null"}),method:ct("method").notNull(),assignedAt:on("assigned_at",{withTimezone:!0}).notNull().defaultNow()},e=>[pe("idx_treatment_assignments_user").on(e.userId),pe("idx_treatment_assignments_treatment").on(e.treatmentType,e.treatmentId),pe("idx_treatment_assignments_project").on(e.projectId)]),K=tn("treatment_exposures",{id:R("id").primaryKey().defaultRandom(),sessionId:R("session_id").notNull().references(()=>d.id,{onDelete:"cascade"}),userId:R("user_id").notNull().references(()=>o.id,{onDelete:"cascade"}),treatmentType:ct("treatment_type").notNull(),treatmentId:R("treatment_id").notNull(),treatmentVersion:nn("treatment_version").notNull().default(1),assignmentId:R("assignment_id").references(()=>S.id,{onDelete:"set null"}),method:ct("method").notNull(),exposedAt:on("exposed_at",{withTimezone:!0}).notNull().defaultNow()},e=>[gs("treatment_exposures_unique").on(e.sessionId,e.treatmentType,e.treatmentId,e.treatmentVersion),pe("idx_treatment_exposures_treatment").on(e.treatmentType,e.treatmentId),pe("idx_treatment_exposures_user").on(e.userId),pe("idx_treatment_exposures_session").on(e.sessionId)]);import{pgTable as hs,text as Xt,timestamp as vs,uuid as mt,integer as Is,index as rn,uniqueIndex as ys}from"drizzle-orm/pg-core";var sn=hs("pending_treatment_exposures",{id:mt("id").primaryKey().defaultRandom(),userId:mt("user_id").notNull().references(()=>o.id,{onDelete:"cascade"}),externalSessionId:Xt("external_session_id").notNull(),treatmentType:Xt("treatment_type").notNull(),treatmentId:mt("treatment_id").notNull(),treatmentVersion:Is("treatment_version").notNull().default(1),method:Xt("method").notNull().default("injected"),projectId:mt("project_id").references(()=>s.id,{onDelete:"set null"}),createdAt:vs("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[ys("pending_treatment_exposures_unique").on(e.externalSessionId,e.treatmentType,e.treatmentId,e.treatmentVersion),rn("idx_pending_treatment_exposures_ext").on(e.externalSessionId),rn("idx_pending_treatment_exposures_user").on(e.userId)]);import{pgTable as an,text as V,timestamp as dn,uuid as fe,numeric as Ts,index as Zt,unique as ws}from"drizzle-orm/pg-core";var Ke=an("instruction_experiments",{id:fe("id").primaryKey().defaultRandom(),userId:fe("user_id").notNull().references(()=>o.id,{onDelete:"cascade"}),instructionId:fe("instruction_id").notNull().references(()=>n.id,{onDelete:"cascade"}),projectPath:V("project_path").notNull(),status:V("status").notNull().default("running"),treatedShare:Ts("treated_share").notNull().default("0.5"),salt:V("salt").notNull(),contentHash:V("content_hash"),source:V("source").notNull().default("manual"),stoppedReason:V("stopped_reason"),createdAt:dn("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Zt("idx_instruction_experiments_lookup").on(e.userId,e.projectPath)]),un=an("instruction_experiment_arms",{id:fe("id").primaryKey().defaultRandom(),experimentId:fe("experiment_id").notNull().references(()=>Ke.id,{onDelete:"cascade"}),userId:fe("user_id").notNull().references(()=>o.id,{onDelete:"cascade"}),externalSessionId:V("external_session_id").notNull(),arm:V("arm").notNull(),assignedAt:dn("assigned_at",{withTimezone:!0}).notNull().defaultNow()},e=>[ws("instruction_experiment_arms_unique").on(e.experimentId,e.externalSessionId),Zt("idx_instruction_experiment_arms_experiment").on(e.experimentId,e.arm),Zt("idx_instruction_experiment_arms_session").on(e.externalSessionId)]);import{pgTable as As,text as eo,timestamp as zs,uuid as _t,numeric as to,integer as ln,jsonb as js,index as Ds,unique as Rs}from"drizzle-orm/pg-core";var cn=As("instruction_verdicts",{id:_t("id").primaryKey().defaultRandom(),userId:_t("user_id").notNull().references(()=>o.id,{onDelete:"cascade"}),instructionId:_t("instruction_id").notNull().references(()=>n.id,{onDelete:"cascade"}),contentHash:eo("content_hash").notNull(),projectPath:eo("project_path").notNull(),segment:js("segment").notNull().default({}),decision:eo("decision").notNull(),delta:to("delta").notNull(),ciLower:to("ci_lower").notNull(),ciUpper:to("ci_upper").notNull(),nTreated:ln("n_treated").notNull(),nControl:ln("n_control").notNull(),experimentId:_t("experiment_id").references(()=>Ke.id,{onDelete:"set null"}),decidedAt:zs("decided_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Rs("instruction_verdicts_unique").on(e.instructionId,e.contentHash,e.projectPath),Ds("idx_instruction_verdicts_render").on(e.userId,e.projectPath)]);import{pgTable as ks,text as pt,timestamp as oo,uuid as no,integer as Es,unique as bs,index as Ss}from"drizzle-orm/pg-core";var mn=ks("insight_recommendation_log",{id:no("id").primaryKey().defaultRandom(),userId:no("user_id").notNull().references(()=>o.id,{onDelete:"cascade"}),projectPath:pt("project_path").notNull().default(""),category:pt("category").notNull(),contentHash:pt("content_hash").notNull(),label:pt("label").notNull().default(""),firstSeenAt:oo("first_seen_at",{withTimezone:!0}).notNull().defaultNow(),lastSeenAt:oo("last_seen_at",{withTimezone:!0}).notNull().defaultNow(),timesGenerated:Es("times_generated").notNull().default(1),lastJobId:no("last_job_id"),dismissedAt:oo("dismissed_at",{withTimezone:!0})},e=>[bs("insight_recommendation_log_unique").on(e.userId,e.projectPath,e.contentHash),Ss("idx_insight_recommendation_log_read").on(e.userId,e.projectPath)]);import{pgTable as Ks,text as xe,timestamp as ro,uuid as Pe,integer as _n,index as ft}from"drizzle-orm/pg-core";var T=Ks("memories",{id:Pe("id").primaryKey().defaultRandom(),userId:Pe("user_id").notNull().references(()=>o.id,{onDelete:"cascade"}),orgId:Pe("org_id"),projectId:Pe("project_id").references(()=>s.id,{onDelete:"set null"}),version:_n("version").notNull().default(1),parentId:Pe("parent_id").references(()=>T.id,{onDelete:"set null"}),kind:xe("kind").notNull(),title:xe("title").notNull(),body:xe("body").notNull(),source:xe("source").notNull(),status:xe("status").notNull().default("active"),trustClass:xe("trust_class"),trustVersion:_n("trust_version"),trustComputedAt:ro("trust_computed_at",{withTimezone:!0}),createdAt:ro("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:ro("updated_at",{withTimezone:!0}).notNull().defaultNow()},e=>[ft("idx_memories_user").on(e.userId),ft("idx_memories_project").on(e.projectId),ft("idx_memories_parent").on(e.parentId),ft("idx_memories_user_status").on(e.userId,e.status)]);import{pgTable as Ps,text as Ce,timestamp as so,uuid as io,integer as pn,jsonb as Cs,index as fn}from"drizzle-orm/pg-core";var xn=Ps("memory_experiments",{id:io("id").primaryKey().defaultRandom(),memoryId:io("memory_id").notNull().references(()=>T.id,{onDelete:"cascade"}),userId:io("user_id").notNull().references(()=>o.id,{onDelete:"cascade"}),memoryVersion:pn("memory_version").notNull().default(1),taskPrompt:Ce("task_prompt").notNull(),expectations:Ce("expectations").array().notNull().default([]),trials:pn("trials").notNull().default(10),model:Ce("model"),status:Ce("status").notNull().default("pending"),result:Cs("result").$type(),error:Ce("error"),createdAt:so("created_at",{withTimezone:!0}).notNull().defaultNow(),startedAt:so("started_at",{withTimezone:!0}),completedAt:so("completed_at",{withTimezone:!0})},e=>[fn("idx_memory_experiments_memory").on(e.memoryId),fn("idx_memory_experiments_user").on(e.userId)]);import{pgTable as Os,text as Ne,timestamp as ao,uuid as uo,jsonb as qs,uniqueIndex as Ms,index as Nn}from"drizzle-orm/pg-core";var xt=Os("session_terminal_targets",{id:uo("id").primaryKey().defaultRandom(),userId:uo("user_id").notNull().references(()=>o.id,{onDelete:"cascade"}),sessionId:uo("session_id").references(()=>d.id,{onDelete:"set null"}),externalSessionId:Ne("external_session_id"),kind:Ne("kind").notNull(),target:Ne("target").notNull(),status:Ne("status").notNull().default("active"),attachCommand:Ne("attach_command").notNull(),projectPath:Ne("project_path"),metadata:qs("metadata").notNull().default({}),lastSeenAt:ao("last_seen_at",{withTimezone:!0}).defaultNow(),createdAt:ao("created_at",{withTimezone:!0}).defaultNow(),updatedAt:ao("updated_at",{withTimezone:!0}).defaultNow()},e=>[Ms("idx_session_terminal_targets_user_target").on(e.userId,e.target),Nn("idx_session_terminal_targets_session").on(e.sessionId),Nn("idx_session_terminal_targets_user_status").on(e.userId,e.status)]);import{boolean as Hs,index as Nt,jsonb as gn,pgTable as Ls,text as ee,timestamp as Oe,uuid as gt,integer as hn}from"drizzle-orm/pg-core";var vn=Ls("session_send_jobs",{id:gt("id").primaryKey().defaultRandom(),userId:gt("user_id").notNull(),sessionId:gt("session_id").notNull().references(()=>d.id,{onDelete:"cascade"}),terminalTargetId:gt("terminal_target_id").references(()=>xt.id,{onDelete:"set null"}),target:ee("target").notNull(),message:ee("message").notNull(),submit:Hs("submit").notNull().default(!0),delivery:ee("delivery").notNull().default("live"),status:ee("status").notNull().default("pending"),result:gn("result"),error:ee("error"),attempts:hn("attempts").notNull().default(0),taskKind:ee("task_kind"),payload:gn("payload"),claimedBy:ee("claimed_by"),claimedAt:Oe("claimed_at",{withTimezone:!0}),leaseExpiresAt:Oe("lease_expires_at",{withTimezone:!0}),leaseRecoveries:hn("lease_recoveries").notNull().default(0),createdAt:Oe("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Oe("updated_at",{withTimezone:!0}).defaultNow(),completedAt:Oe("completed_at",{withTimezone:!0})},e=>[Nt("idx_session_send_jobs_user").on(e.userId),Nt("idx_session_send_jobs_session").on(e.sessionId),Nt("idx_session_send_jobs_status").on(e.status),Nt("idx_session_send_jobs_pending").on(e.userId,e.status)]);import{pgTable as yn,text as te,timestamp as ht,jsonb as Tn,uuid as G,integer as Us,boolean as Bs,uniqueIndex as Vs,index as In,primaryKey as Gs}from"drizzle-orm/pg-core";var z=yn("packs",{id:G("id").primaryKey().defaultRandom(),name:te("name").notNull(),description:te("description").notNull(),scope:te("scope").notNull(),scopeRef:G("scope_ref"),version:te("version").notNull().default("1.0.0"),tags:te("tags").array(),badge:te("badge"),metadata:Tn("metadata"),createdBy:G("created_by"),createdAt:ht("created_at",{withTimezone:!0}).defaultNow(),updatedAt:ht("updated_at",{withTimezone:!0}).defaultNow(),archived:Bs("archived").default(!1),archivedAt:ht("archived_at",{withTimezone:!0}),archivedBy:G("archived_by"),forkedFromId:G("forked_from_id").references(()=>z.id,{onDelete:"set null"}),upstreamVersion:te("upstream_version")},e=>[Vs("packs_name_scope_ref_idx").on(e.name,e.scope,e.scopeRef),In("idx_packs_scope").on(e.scope,e.scopeRef),In("idx_packs_created_by").on(e.createdBy)]),F=yn("pack_instructions",{packId:G("pack_id").references(()=>z.id,{onDelete:"cascade"}).notNull(),instructionId:G("instruction_id").references(()=>n.id,{onDelete:"cascade"}).notNull(),position:Us("position").notNull().default(0),slotOverrides:Tn("slot_overrides"),addedAt:ht("added_at",{withTimezone:!0}).defaultNow(),addedBy:G("added_by")},e=>[Gs({columns:[e.packId,e.instructionId]})]);import{pgTable as Fs,text as lo,timestamp as Js,jsonb as $s,uuid as co,index as ge}from"drizzle-orm/pg-core";var he=Fs("instruction_usage_events",{id:co("id").primaryKey().defaultRandom(),instructionId:co("instruction_id").references(()=>n.id,{onDelete:"set null"}),userId:co("user_id").notNull(),surface:lo("surface").notNull(),action:lo("action").notNull(),metadata:$s("metadata"),traceId:lo("trace_id"),createdAt:Js("created_at",{withTimezone:!0}).defaultNow()},e=>[ge("idx_usage_events_instruction").on(e.instructionId),ge("idx_usage_events_user").on(e.userId),ge("idx_usage_events_surface").on(e.surface),ge("idx_usage_events_action").on(e.action),ge("idx_usage_events_created_at").on(e.createdAt),ge("idx_usage_events_user_created").on(e.userId,e.createdAt)]);import{pgTable as Ys,text as vt,timestamp as wn,jsonb as Qs,uuid as An,index as mo}from"drizzle-orm/pg-core";var zn=Ys("worker_connections",{id:An("id").primaryKey().defaultRandom(),userId:An("user_id").notNull(),workerType:vt("worker_type").notNull().default("mcp"),clientName:vt("client_name").notNull(),clientVersion:vt("client_version"),workerVersion:vt("worker_version"),lastHeartbeat:wn("last_heartbeat",{withTimezone:!0}).notNull().defaultNow(),connectedAt:wn("connected_at",{withTimezone:!0}).notNull().defaultNow(),metadata:Qs("metadata")},e=>[mo("idx_worker_connections_user").on(e.userId),mo("idx_worker_connections_heartbeat").on(e.userId,e.lastHeartbeat),mo("idx_worker_connections_type").on(e.userId,e.workerType)]);import{pgTable as Ws,text as It,timestamp as Xs,jsonb as Zs,uuid as jn,index as Dn}from"drizzle-orm/pg-core";var Rn=Ws("cli_setup_events",{id:jn("id").primaryKey().defaultRandom(),userId:jn("user_id").notNull(),deviceId:It("device_id").notNull(),event:It("event").notNull(),cliVersion:It("cli_version"),os:It("os"),props:Zs("props").notNull().default({}),createdAt:Xs("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Dn("idx_cli_setup_events_user").on(e.userId,e.createdAt),Dn("idx_cli_setup_events_device").on(e.deviceId,e.createdAt)]);import{pgTable as ei,text as oe,integer as ti,boolean as oi,timestamp as ni,jsonb as ri,uuid as si,index as kn}from"drizzle-orm/pg-core";var En=ei("cli_error_events",{id:si("id").primaryKey().defaultRandom(),deviceId:oe("device_id"),event:oe("event").notNull(),command:oe("command"),statusCode:ti("status_code"),message:oe("message"),cliVersion:oe("cli_version"),os:oe("os"),nodeVersion:oe("node_version"),proxied:oi("proxied"),props:ri("props").notNull().default({}),createdAt:ni("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[kn("idx_cli_error_events_created").on(e.createdAt),kn("idx_cli_error_events_device").on(e.deviceId,e.createdAt)]);import{sql as ii}from"drizzle-orm";import{pgTable as ne,text as m,timestamp as h,jsonb as w,uuid as c,integer as P,boolean as qe,index as N,unique as bn}from"drizzle-orm/pg-core";var r=ne("eval_targets",{id:c("id").primaryKey().defaultRandom(),userId:c("user_id").notNull(),name:m("name").notNull(),type:m("type").notNull(),content:m("content").notNull(),description:m("description").notNull().default(""),metadata:w("metadata").notNull().default({}),version:P("version").notNull().default(1),parentId:c("parent_id").references(()=>r.id,{onDelete:"set null"}),createdAt:h("created_at",{withTimezone:!0}).defaultNow(),updatedAt:h("updated_at",{withTimezone:!0}).defaultNow()},e=>[N("eval_targets_name_user_idx").on(e.name,e.userId),N("idx_eval_targets_user").on(e.userId),N("idx_eval_targets_type").on(e.type),N("idx_eval_targets_parent").on(e.parentId)]),C=ne("evals",{id:c("id").primaryKey().defaultRandom(),evalTargetId:c("eval_target_id").notNull().references(()=>r.id,{onDelete:"cascade"}),name:m("name").notNull(),prompt:m("prompt").notNull(),expectedOutput:m("expected_output").notNull().default(""),files:w("files").notNull().default([]),expectations:w("expectations").notNull().default([]),retiredAt:h("retired_at",{withTimezone:!0}),retiredReason:m("retired_reason"),createdAt:h("created_at",{withTimezone:!0}).defaultNow(),updatedAt:h("updated_at",{withTimezone:!0}).defaultNow(),contentUpdatedAt:h("content_updated_at",{withTimezone:!0}).notNull().defaultNow()},e=>[N("idx_evals_target").on(e.evalTargetId),N("idx_evals_target_active").on(e.evalTargetId).where(ii`${e.retiredAt} IS NULL`)]),k=ne("eval_runs",{id:c("id").primaryKey().defaultRandom(),jobId:c("job_id"),evalId:c("eval_id").notNull().references(()=>C.id,{onDelete:"cascade"}),evalTargetId:c("eval_target_id").notNull().references(()=>r.id,{onDelete:"cascade"}),evalTargetVersion:P("eval_target_version").notNull(),configuration:m("configuration").notNull(),runNumber:P("run_number").notNull().default(1),iteration:P("iteration").notNull().default(1),status:m("status").notNull().default("completed"),outputs:w("outputs").notNull().default({}),timing:w("timing").notNull().default({}),grading:w("grading").notNull().default({}),comparison:w("comparison"),createdAt:h("created_at",{withTimezone:!0}).defaultNow()},e=>[N("idx_eval_runs_eval").on(e.evalId),N("idx_eval_runs_target").on(e.evalTargetId),N("idx_eval_runs_iteration").on(e.evalTargetId,e.iteration)]),Sn=ne("eval_comparisons",{id:c("id").primaryKey().defaultRandom(),userId:c("user_id").notNull(),targetAId:c("target_a_id").notNull().references(()=>r.id,{onDelete:"cascade"}),targetBId:c("target_b_id").notNull().references(()=>r.id,{onDelete:"cascade"}),targetAVersion:P("target_a_version").notNull(),targetBVersion:P("target_b_version").notNull(),isSwapped:qe("is_swapped").notNull().default(!1),winnerTargetId:c("winner_target_id").references(()=>r.id,{onDelete:"set null"}),perEval:w("per_eval").notNull().default([]),overall:w("overall").notNull().default({}),rawOutput:m("raw_output"),model:m("model"),status:m("status").notNull().default("completed"),createdAt:h("created_at",{withTimezone:!0}).defaultNow()},e=>[N("idx_eval_comparisons_target_a").on(e.targetAId),N("idx_eval_comparisons_target_b").on(e.targetBId),N("idx_eval_comparisons_user").on(e.userId)]),Kn=ne("eval_grade_annotations",{id:c("id").primaryKey().defaultRandom(),userId:c("user_id").notNull(),evalRunId:c("eval_run_id").notNull().references(()=>k.id,{onDelete:"cascade"}),evalTargetId:c("eval_target_id").notNull().references(()=>r.id,{onDelete:"cascade"}),expectationIndex:P("expectation_index").notNull(),expectationText:m("expectation_text").notNull(),judgePassed:qe("judge_passed").notNull(),judgeMethod:m("judge_method").notNull(),judgeModel:m("judge_model"),verdict:m("verdict").notNull(),flag:m("flag"),note:m("note"),createdAt:h("created_at",{withTimezone:!0}).defaultNow(),updatedAt:h("updated_at",{withTimezone:!0}).defaultNow()},e=>[N("idx_eval_grade_annotations_target").on(e.evalTargetId),N("idx_eval_grade_annotations_run").on(e.evalRunId),bn("eval_grade_annotations_eval_run_id_expectation_index_key").on(e.evalRunId,e.expectationIndex)]),Pn=ne("judge_reviewer_verdicts",{id:c("id").primaryKey().defaultRandom(),userId:c("user_id").notNull(),evalTargetId:c("eval_target_id").notNull().references(()=>r.id,{onDelete:"cascade"}),evalRunId:c("eval_run_id").notNull().references(()=>k.id,{onDelete:"cascade"}),expectationIndex:P("expectation_index").notNull(),expectationText:m("expectation_text").notNull(),judgePassed:qe("judge_passed").notNull(),humanPassed:qe("human_passed").notNull(),reviewerEngine:m("reviewer_engine").notNull(),reviewerModel:m("reviewer_model").notNull(),reviewerPassed:qe("reviewer_passed").notNull(),resolvedAt:h("resolved_at",{withTimezone:!0}),resolution:m("resolution"),createdAt:h("created_at",{withTimezone:!0}).defaultNow(),updatedAt:h("updated_at",{withTimezone:!0}).defaultNow()},e=>[N("idx_jrv_target").on(e.evalTargetId),bn("judge_reviewer_verdicts_eval_run_id_expectation_index_review_key").on(e.evalRunId,e.expectationIndex,e.reviewerModel)]),ve=ne("benchmarks",{id:c("id").primaryKey().defaultRandom(),evalTargetId:c("eval_target_id").notNull().references(()=>r.id,{onDelete:"cascade"}),iteration:P("iteration").notNull().default(1),runSummary:w("run_summary").notNull().default({}),notes:w("notes").notNull().default([]),feedback:w("feedback"),createdAt:h("created_at",{withTimezone:!0}).defaultNow()},e=>[N("idx_benchmarks_target").on(e.evalTargetId)]);import{sql as _o}from"drizzle-orm";import{pgTable as ai,text as O,timestamp as di,jsonb as yt,uuid as Tt,boolean as ui,index as Me,uniqueIndex as li}from"drizzle-orm/pg-core";var Cn=ai("instruction_promotions",{id:Tt("id").primaryKey().defaultRandom(),userId:Tt("user_id").notNull(),evalTargetId:Tt("eval_target_id").notNull().references(()=>r.id,{onDelete:"cascade"}),instructionId:Tt("instruction_id").references(()=>n.id,{onDelete:"set null"}),fromContentHash:O("from_content_hash").notNull(),toContentHash:O("to_content_hash").notNull(),fromContent:O("from_content").notNull(),toContent:O("to_content").notNull(),proposalSource:O("proposal_source").notNull(),proposalRationale:O("proposal_rationale").notNull().default(""),decision:O("decision").notNull(),applied:ui("applied").notNull().default(!1),refusals:yt("refusals").notNull().default([]),rationale:O("rationale").notNull().default(""),effectClass:O("effect_class").notNull(),verdict:yt("verdict").notNull().default({}),gates:yt("gates").notNull().default({}),touchedSections:yt("touched_sections").notNull().default([]),createdAt:di("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Me("idx_instruction_promotions_budget").on(e.evalTargetId,e.createdAt.desc()).where(_o`${e.applied}`),Me("idx_instruction_promotions_target").on(e.evalTargetId,e.createdAt.desc()),Me("idx_instruction_promotions_user").on(e.userId,e.createdAt.desc()),Me("idx_instruction_promotions_to_hash").on(e.toContentHash),li("uq_instruction_promotions_applied").on(e.evalTargetId,e.fromContentHash,e.toContentHash).where(_o`${e.applied}`),Me("idx_instruction_promotions_applied_hash").on(e.toContentHash,e.createdAt.desc()).where(_o`${e.applied}`)]);import{pgTable as qn,text as po,timestamp as fo,jsonb as Mn,uuid as Ie,integer as He,index as wt,real as On}from"drizzle-orm/pg-core";var ye=qn("trigger_evals",{id:Ie("id").primaryKey().defaultRandom(),evalTargetId:Ie("eval_target_id").notNull().references(()=>r.id,{onDelete:"cascade"}),userId:Ie("user_id").notNull(),queries:Mn("queries").notNull().default([]),status:po("status").notNull().default("pending_review"),trainIndices:He("train_indices").array().default([]),testIndices:He("test_indices").array().default([]),createdAt:fo("created_at",{withTimezone:!0}).defaultNow(),updatedAt:fo("updated_at",{withTimezone:!0}).defaultNow()},e=>[wt("idx_trigger_evals_target").on(e.evalTargetId),wt("idx_trigger_evals_user").on(e.userId)]),Te=qn("optimization_runs",{id:Ie("id").primaryKey().defaultRandom(),evalTargetId:Ie("eval_target_id").notNull().references(()=>r.id,{onDelete:"cascade"}),userId:Ie("user_id").notNull(),type:po("type").notNull(),iteration:He("iteration").notNull(),inputVersion:He("input_version").notNull(),outputVersion:He("output_version"),trainScore:On("train_score"),testScore:On("test_score"),analysis:Mn("analysis").notNull().default({}),status:po("status").notNull().default("running"),createdAt:fo("created_at",{withTimezone:!0}).defaultNow()},e=>[wt("idx_optimization_runs_target").on(e.evalTargetId),wt("idx_optimization_runs_user").on(e.userId)]);import{pgTable as ci,text as J,timestamp as mi,jsonb as Le,uuid as xo,integer as No,real as _i,index as Ue,uniqueIndex as Hn}from"drizzle-orm/pg-core";var $=ci("context_snapshots",{id:xo("id").primaryKey().defaultRandom(),sessionId:xo("session_id").references(()=>d.id,{onDelete:"cascade"}),userId:xo("user_id").notNull().references(()=>o.id,{onDelete:"cascade"}),sequence:No("sequence").notNull().default(0),provider:J("provider").notNull(),model:J("model").notNull(),systemPrompt:J("system_prompt").notNull(),injectedInstructions:Le("injected_instructions").notNull().default([]),messagesSummary:Le("messages_summary").notNull(),tools:Le("tools").notNull().default([]),systemHash:J("system_hash").notNull(),requestHash:J("request_hash").notNull().default(""),toolsHash:J("tools_hash"),injectedHash:J("injected_hash"),messagesDelta:Le("messages_delta").default([]),messagesDeltaRef:J("messages_delta_ref"),maxTokens:No("max_tokens"),temperature:_i("temperature"),estimatedTokens:No("estimated_tokens"),capturedAt:mi("captured_at",{withTimezone:!0}).notNull().defaultNow(),metadata:Le("metadata").default({})},e=>[Ue("idx_context_snapshots_session").on(e.sessionId),Ue("idx_context_snapshots_user").on(e.userId),Ue("idx_context_snapshots_hash").on(e.systemHash),Ue("idx_context_snapshots_request_hash").on(e.requestHash),Hn("idx_snapshots_session_request").on(e.sessionId,e.requestHash),Hn("idx_snapshots_session_sequence").on(e.sessionId,e.sequence),Ue("idx_context_snapshots_user_session_captured").on(e.userId,e.sessionId,e.capturedAt.desc())]);import{pgTable as pi,text as Ln,timestamp as fi,jsonb as xi,integer as Ni,index as gi}from"drizzle-orm/pg-core";var Un=pi("content_blobs",{hash:Ln("hash").primaryKey(),contentType:Ln("content_type").notNull(),content:xi("content").notNull(),sizeBytes:Ni("size_bytes").notNull().default(0),createdAt:fi("created_at",{withTimezone:!0}).defaultNow()},e=>[gi("idx_content_blobs_type").on(e.contentType)]);import{pgTable as hi,text as At,timestamp as Be,jsonb as zt,uuid as go,index as jt,integer as Bn}from"drizzle-orm/pg-core";var we=hi("eval_jobs",{id:go("id").primaryKey().defaultRandom(),userId:go("user_id").notNull(),evalTargetId:go("eval_target_id").notNull().references(()=>r.id,{onDelete:"cascade"}),status:At("status").notNull().default("pending"),config:zt("config").notNull().default({}),progress:zt("progress").notNull().default({}),result:zt("result"),error:At("error"),attempts:Bn("attempts").notNull().default(0),taskKind:At("task_kind"),payload:zt("payload"),claimedBy:At("claimed_by"),claimedAt:Be("claimed_at",{withTimezone:!0}),leaseExpiresAt:Be("lease_expires_at",{withTimezone:!0}),leaseRecoveries:Bn("lease_recoveries").notNull().default(0),createdAt:Be("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Be("updated_at",{withTimezone:!0}).defaultNow(),completedAt:Be("completed_at",{withTimezone:!0})},e=>[jt("idx_eval_jobs_user").on(e.userId),jt("idx_eval_jobs_target").on(e.evalTargetId),jt("idx_eval_jobs_status").on(e.status),jt("idx_eval_jobs_pending").on(e.userId,e.status)]);import{pgTable as vi,text as Ve,timestamp as Ge,jsonb as Vn,uuid as Gn,integer as Fn,index as Jn}from"drizzle-orm/pg-core";var $n=vi("agent_jobs",{id:Gn("id").primaryKey().defaultRandom(),userId:Gn("user_id").notNull(),taskKind:Ve("task_kind").notNull(),status:Ve("status").notNull().default("pending"),payload:Vn("payload").notNull(),dedupeKey:Ve("dedupe_key"),result:Vn("result"),error:Ve("error"),attempts:Fn("attempts").notNull().default(0),claimedBy:Ve("claimed_by"),claimedAt:Ge("claimed_at",{withTimezone:!0}),leaseExpiresAt:Ge("lease_expires_at",{withTimezone:!0}),leaseRecoveries:Fn("lease_recoveries").notNull().default(0),createdAt:Ge("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:Ge("updated_at",{withTimezone:!0}).notNull().defaultNow(),completedAt:Ge("completed_at",{withTimezone:!0})},e=>[Jn("idx_agent_jobs_claim").on(e.userId,e.status,e.taskKind,e.createdAt),Jn("idx_agent_jobs_dedupe").on(e.userId,e.taskKind,e.dedupeKey)]);import{pgTable as Ii,text as Fe,timestamp as Je,jsonb as Dt,uuid as ho,index as Rt,integer as Yn}from"drizzle-orm/pg-core";var Qn=Ii("insights_jobs",{id:ho("id").primaryKey().defaultRandom(),userId:ho("user_id").notNull(),status:Fe("status").notNull().default("pending"),projectPath:Fe("project_path"),projectId:ho("project_id").references(()=>s.id,{onDelete:"set null"}),config:Dt("config").notNull().default({}),progress:Dt("progress").notNull().default({}),result:Dt("result"),error:Fe("error"),attempts:Yn("attempts").notNull().default(0),taskKind:Fe("task_kind"),payload:Dt("payload"),claimedBy:Fe("claimed_by"),claimedAt:Je("claimed_at",{withTimezone:!0}),leaseExpiresAt:Je("lease_expires_at",{withTimezone:!0}),leaseRecoveries:Yn("lease_recoveries").notNull().default(0),createdAt:Je("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Je("updated_at",{withTimezone:!0}).defaultNow(),completedAt:Je("completed_at",{withTimezone:!0})},e=>[Rt("idx_insights_jobs_user").on(e.userId),Rt("idx_insights_jobs_status").on(e.status),Rt("idx_insights_jobs_pending").on(e.userId,e.status),Rt("idx_insights_jobs_project").on(e.projectId)]);import{pgTable as yi,text as vo,timestamp as kt,uuid as Wn,index as Ti,uniqueIndex as wi}from"drizzle-orm/pg-core";var Ae=yi("api_keys",{id:Wn("id").primaryKey().defaultRandom(),userId:Wn("user_id").notNull().references(()=>o.id,{onDelete:"cascade"}),name:vo("name").notNull(),keyHash:vo("key_hash").notNull(),keyPrefix:vo("key_prefix").notNull(),lastUsedAt:kt("last_used_at",{withTimezone:!0}),expiresAt:kt("expires_at",{withTimezone:!0}),revokedAt:kt("revoked_at",{withTimezone:!0}),createdAt:kt("created_at",{withTimezone:!0}).defaultNow()},e=>[Ti("idx_api_keys_user").on(e.userId),wi("idx_api_keys_hash").on(e.keyHash)]);import{pgTable as Ai,text as Io,timestamp as Xn,uuid as zi,index as ji}from"drizzle-orm/pg-core";var Zn=Ai("extension_auth_codes",{code:Io("code").primaryKey(),userId:zi("user_id").notNull().references(()=>o.id,{onDelete:"cascade"}),editor:Io("editor"),email:Io("email"),expiresAt:Xn("expires_at",{withTimezone:!0}).notNull(),createdAt:Xn("created_at",{withTimezone:!0}).defaultNow()},e=>[ji("idx_ext_auth_codes_expiry").on(e.expiresAt)]);import{pgTable as Di,text as Ri,timestamp as er,jsonb as ki,uuid as yo,index as tr}from"drizzle-orm/pg-core";var ze=Di("eval_conversations",{id:yo("id").primaryKey().defaultRandom(),evalTargetId:yo("eval_target_id").notNull().references(()=>r.id,{onDelete:"cascade"}),userId:yo("user_id").notNull(),messages:ki("messages").notNull().default([]),status:Ri("status").notNull().default("active"),createdAt:er("created_at",{withTimezone:!0}).defaultNow(),updatedAt:er("updated_at",{withTimezone:!0}).defaultNow()},e=>[tr("idx_eval_conversations_target").on(e.evalTargetId),tr("idx_eval_conversations_user").on(e.userId)]);import{pgTable as Ei,text as q,timestamp as or,jsonb as bi,uuid as To}from"drizzle-orm/pg-core";var nr=Ei("skill_submissions",{id:To("id").primaryKey().defaultRandom(),skillId:q("skill_id").notNull(),name:q("name").notNull(),description:q("description").notNull(),category:q("category").notNull(),tools:q("tools").array().notNull(),tags:q("tags").array().default([]),content:q("content").notNull(),status:q("status").notNull().default("pending"),submittedBy:To("submitted_by").notNull(),reviewedBy:To("reviewed_by"),reviewNote:q("review_note"),metadata:bi("metadata"),createdAt:or("created_at",{withTimezone:!0}).defaultNow(),updatedAt:or("updated_at",{withTimezone:!0}).defaultNow()});import{pgTable as Si,text as $e,timestamp as rr,jsonb as Ki,uuid as Pi,uniqueIndex as Ci,index as sr}from"drizzle-orm/pg-core";var ir=Si("harness_releases",{id:Pi("id").primaryKey().defaultRandom(),harness:$e("harness").notNull(),version:$e("version").notNull(),publishedAt:rr("published_at",{withTimezone:!0}).notNull(),title:$e("title"),body:$e("body"),categories:Ki("categories").default({}),url:$e("url"),createdAt:rr("created_at",{withTimezone:!0}).defaultNow()},e=>[Ci("idx_harness_releases_unique").on(e.harness,e.version),sr("idx_harness_releases_harness").on(e.harness),sr("idx_harness_releases_published").on(e.publishedAt)]);import{pgTable as Oi,text as je,timestamp as ar,jsonb as qi,uuid as dr,index as ur,uniqueIndex as Mi}from"drizzle-orm/pg-core";var wo=Oi("notifications",{id:dr("id").primaryKey().defaultRandom(),userId:dr("user_id").notNull(),type:je("type").notNull(),title:je("title").notNull(),body:je("body"),url:je("url"),sourceTable:je("source_table"),sourceId:je("source_id"),metadata:qi("metadata").notNull().default({}),readAt:ar("read_at",{withTimezone:!0}),createdAt:ar("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[ur("idx_notifications_user_created").on(e.userId,e.createdAt),ur("idx_notifications_user_unread").on(e.userId),Mi("idx_notifications_source_dedup").on(e.userId,e.sourceTable,e.sourceId)]);import{pgTable as Hi,text as Ye,timestamp as Qe,jsonb as Ao,uuid as zo,index as Et,integer as lr}from"drizzle-orm/pg-core";var De=Hi("launch_jobs",{id:zo("id").primaryKey().defaultRandom(),userId:zo("user_id").notNull(),tool:Ye("tool").notNull(),status:Ye("status").notNull().default("pending"),config:Ao("config").notNull().default({}),result:Ao("result"),error:Ye("error"),attempts:lr("attempts").notNull().default(0),taskKind:Ye("task_kind"),payload:Ao("payload"),claimedBy:Ye("claimed_by"),claimedAt:Qe("claimed_at",{withTimezone:!0}),leaseExpiresAt:Qe("lease_expires_at",{withTimezone:!0}),leaseRecoveries:lr("lease_recoveries").notNull().default(0),createdAt:Qe("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Qe("updated_at",{withTimezone:!0}).defaultNow(),completedAt:Qe("completed_at",{withTimezone:!0}),runId:zo("run_id").references(()=>g.id,{onDelete:"set null"})},e=>[Et("idx_launch_jobs_user").on(e.userId),Et("idx_launch_jobs_status").on(e.status),Et("idx_launch_jobs_pending").on(e.userId,e.status),Et("idx_launch_jobs_run").on(e.runId)]);import{pgTable as cr,uuid as M,text as re,real as Li,timestamp as We,boolean as Ui,uniqueIndex as Bi,index as Xe}from"drizzle-orm/pg-core";var mr=["add","remove","trim"],jo=cr("instruction_suggestions",{id:M("id").primaryKey().defaultRandom(),userId:M("user_id").notNull().references(()=>o.id,{onDelete:"cascade"}),instructionId:M("instruction_id").notNull().references(()=>n.id,{onDelete:"cascade"}),projectPath:re("project_path").notNull(),projectId:M("project_id").references(()=>s.id,{onDelete:"set null"}),score:Li("score").notNull(),reason:re("reason").notNull(),kind:re("kind").$type().notNull().default("add"),generatedAt:We("generated_at",{withTimezone:!0}).notNull().defaultNow(),isStale:Ui("is_stale").notNull().default(!1),dismissedAt:We("dismissed_at",{withTimezone:!0}),acceptedAt:We("accepted_at",{withTimezone:!0}),declinedAt:We("declined_at",{withTimezone:!0}),declinedReason:re("declined_reason"),promotedToInstructionId:M("promoted_to_instruction_id").references(()=>n.id,{onDelete:"set null"})},e=>[Bi("idx_instruction_suggestions_user_project_instruction_kind").on(e.userId,e.projectPath,e.instructionId,e.kind),Xe("idx_instruction_suggestions_user_project").on(e.userId,e.projectPath),Xe("idx_instruction_suggestions_user_proj_id").on(e.userId,e.projectId),Xe("idx_instruction_suggestions_generated_at").on(e.generatedAt)]),_r=cr("instruction_suggestion_events",{id:M("id").primaryKey().defaultRandom(),suggestionId:M("suggestion_id").notNull().references(()=>jo.id,{onDelete:"cascade"}),userId:M("user_id").notNull().references(()=>o.id,{onDelete:"cascade"}),eventType:re("event_type").notNull(),tool:re("tool"),sessionId:M("session_id"),projectPath:re("project_path").notNull(),createdAt:We("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Xe("idx_instruction_suggestion_events_suggestion_id").on(e.suggestionId),Xe("idx_instruction_suggestion_events_user_id").on(e.userId)]);import{pgTable as Vi,text as Do,integer as Gi,numeric as Ze,timestamp as Ro,index as Fi,primaryKey as Ji}from"drizzle-orm/pg-core";var pr=Vi("model_pricing",{provider:Do("provider").notNull(),modelId:Do("model_id").notNull(),inputPerM:Ze("input_per_m").notNull(),outputPerM:Ze("output_per_m").notNull(),cacheReadPerM:Ze("cache_read_per_m").notNull(),cacheWrite5mPerM:Ze("cache_write_5m_per_m").notNull(),cacheWrite1hPerM:Ze("cache_write_1h_per_m").notNull(),contextWindow:Gi("context_window"),effectiveFrom:Ro("effective_from",{withTimezone:!0}).notNull(),effectiveUntil:Ro("effective_until",{withTimezone:!0}),source:Do("source").notNull(),verifiedAt:Ro("verified_at",{withTimezone:!0})},e=>[Ji({columns:[e.provider,e.modelId,e.effectiveFrom]}),Fi("idx_model_pricing_active").on(e.provider,e.modelId,e.effectiveFrom.desc())]);import{pgTable as $i,text as se,numeric as fr,timestamp as xr,uuid as Nr,jsonb as Yi,index as gr}from"drizzle-orm/pg-core";var hr=$i("limit_observations",{id:Nr("id").primaryKey().defaultRandom(),observedAt:xr("observed_at",{withTimezone:!0}).notNull().defaultNow(),provider:se("provider").notNull(),plan:se("plan").notNull(),limitType:se("limit_type").notNull(),value:fr("value").notNull(),unit:se("unit").notNull(),comparator:se("comparator").notNull().default("="),resetsAt:xr("resets_at",{withTimezone:!0}),sourceType:se("source_type").notNull(),sourceUrl:se("source_url"),sourceEvidence:Yi("source_evidence"),confidence:fr("confidence").notNull(),userId:Nr("user_id")},e=>[gr("idx_limit_obs_lookup").on(e.provider,e.plan,e.limitType,e.observedAt.desc()),gr("idx_limit_obs_user").on(e.userId,e.observedAt.desc())]);import{pgTable as Qi,text as bt,timestamp as Wi,uuid as Xi,jsonb as Zi,boolean as ea,uniqueIndex as ta}from"drizzle-orm/pg-core";var vr=Qi("provider_docs_snapshots",{id:Xi("id").primaryKey().defaultRandom(),fetchedAt:Wi("fetched_at",{withTimezone:!0}).notNull().defaultNow(),provider:bt("provider").notNull(),docUrl:bt("doc_url").notNull(),contentHash:bt("content_hash").notNull(),content:bt("content").notNull(),parseSuccess:ea("parse_success").notNull(),parseErrors:Zi("parse_errors")},e=>[ta("idx_docs_dedup").on(e.provider,e.docUrl,e.contentHash)]);import{pgTable as oa,text as St,numeric as Ir,timestamp as yr,uuid as na,primaryKey as ra,index as sa}from"drizzle-orm/pg-core";var Tr=oa("plan_limits_active",{provider:St("provider").notNull(),plan:St("plan").notNull(),limitType:St("limit_type").notNull(),value:Ir("value").notNull(),unit:St("unit").notNull(),effectiveFrom:yr("effective_from",{withTimezone:!0}).notNull(),effectiveUntil:yr("effective_until",{withTimezone:!0}),confidence:Ir("confidence").notNull(),sourceObservationIds:na("source_observation_ids").array().notNull()},e=>[ra({columns:[e.provider,e.plan,e.limitType,e.effectiveFrom]}),sa("idx_plan_limits_lookup").on(e.provider,e.plan,e.limitType,e.effectiveFrom.desc())]);import{pgTable as ia,text as ko,timestamp as aa,uuid as wr,jsonb as da,index as ua}from"drizzle-orm/pg-core";var Ar=ia("alert_dispatches",{id:wr("id").primaryKey().defaultRandom(),userId:wr("user_id").notNull(),alertKey:ko("alert_key").notNull(),severity:ko("severity").notNull(),lastDispatchedAt:aa("last_dispatched_at",{withTimezone:!0}).notNull().defaultNow(),lastState:da("last_state").notNull(),channel:ko("channel").notNull()},e=>[ua("idx_alert_user_key").on(e.userId,e.alertKey,e.lastDispatchedAt.desc())]);import{pgTable as la,text as Eo,timestamp as zr,uuid as bo,integer as ca,index as ma,unique as _a}from"drizzle-orm/pg-core";var jr=la("scaffolding_fingerprints",{id:bo("id").primaryKey().defaultRandom(),userId:bo("user_id").notNull(),harness:Eo("harness").notNull(),model:Eo("model").notNull(),toolsHash:Eo("tools_hash").notNull(),firstSeenAt:zr("first_seen_at",{withTimezone:!0}).notNull().defaultNow(),lastSeenAt:zr("last_seen_at",{withTimezone:!0}).notNull().defaultNow(),snapshotCount:ca("snapshot_count").notNull().default(1),firstSessionId:bo("first_session_id")},e=>[_a("scaffolding_fingerprints_user_id_harness_model_tools_hash_key").on(e.userId,e.harness,e.model,e.toolsHash),ma("idx_scaffolding_fp_segment").on(e.userId,e.harness,e.model)]);import{pgTable as pa,text as So,timestamp as fa,jsonb as xa,uuid as Dr,integer as Na,unique as ga}from"drizzle-orm/pg-core";var Rr=pa("scaffolding_segments",{id:Dr("id").primaryKey().defaultRandom(),userId:Dr("user_id").notNull(),harness:So("harness").notNull(),model:So("model").notNull(),coreNames:xa("core_names").notNull(),coreHash:So("core_hash").notNull(),activeFingerprints:Na("active_fingerprints").notNull(),computedAt:fa("computed_at",{withTimezone:!0}).notNull().defaultNow()},e=>[ga("scaffolding_segments_user_id_harness_model_key").on(e.userId,e.harness,e.model)]);import{drizzle as Kr}from"drizzle-orm/postgres-js";import Pr from"postgres";var Kt={};Zr(Kt,{SUGGESTION_KINDS:()=>mr,agentJobs:()=>$n,agentRuns:()=>g,agentRunsRelations:()=>Sa,alertDispatches:()=>Ar,announcementDeliveries:()=>Uo,announcements:()=>Lo,apiKeys:()=>Ae,apiKeysRelations:()=>va,benchmarks:()=>ve,benchmarksRelations:()=>Ga,cliErrorEvents:()=>En,cliSetupEvents:()=>Rn,contentBlobs:()=>Un,contextSnapshots:()=>$,contextSnapshotsRelations:()=>Qa,evalComparisons:()=>Sn,evalConversations:()=>ze,evalConversationsRelations:()=>Ya,evalGradeAnnotations:()=>Kn,evalJobs:()=>we,evalJobsRelations:()=>$a,evalRuns:()=>k,evalRunsRelations:()=>Va,evalTargets:()=>r,evalTargetsRelations:()=>Ua,evals:()=>C,evalsRelations:()=>Ba,extensionAuthCodes:()=>Zn,harnessReleases:()=>ir,insightRecommendationLog:()=>mn,insightsJobs:()=>Qn,instructionEvents:()=>ce,instructionEventsRelations:()=>ja,instructionExperimentArms:()=>un,instructionExperiments:()=>Ke,instructionPromotions:()=>Cn,instructionSuggestionEvents:()=>_r,instructionSuggestions:()=>jo,instructionUsageEvents:()=>he,instructionUsageEventsRelations:()=>La,instructionVerdicts:()=>cn,instructionVersionIdentities:()=>Yo,instructionVersions:()=>le,instructionVersionsRelations:()=>Ra,instructions:()=>n,instructionsRelations:()=>za,judgeReviewerVerdicts:()=>Pn,launchJobs:()=>De,launchJobsRelations:()=>Ka,limitObservations:()=>hr,memories:()=>T,memoriesRelations:()=>Da,memoryExperiments:()=>xn,modelPricing:()=>pr,notificationPreferences:()=>Bo,notifications:()=>wo,optimizationRuns:()=>Te,optimizationRunsRelations:()=>Ja,orgInvitations:()=>E,orgInvitationsRelations:()=>Ta,organizations:()=>u,organizationsRelations:()=>Ia,packInstructions:()=>F,packInstructionsRelations:()=>Ha,packs:()=>z,packsRelations:()=>Ma,pendingTreatmentExposures:()=>sn,planLimitsActive:()=>Tr,profiles:()=>o,profilesRelations:()=>ha,projectCheckouts:()=>Xo,projectInstructions:()=>U,projectInstructionsRelations:()=>Ea,projects:()=>s,projectsRelations:()=>ka,providerDocsSnapshots:()=>vr,scaffoldingFingerprints:()=>jr,scaffoldingSegments:()=>Rr,sessionEvents:()=>_e,sessionEventsRelations:()=>Pa,sessionInstructions:()=>B,sessionInstructionsRelations:()=>Ca,sessionSendJobs:()=>vn,sessionTerminalTargets:()=>xt,sessions:()=>d,sessionsRelations:()=>ba,skillSubmissions:()=>nr,teams:()=>v,teamsRelations:()=>ya,treatmentAssignments:()=>S,treatmentAssignmentsRelations:()=>Oa,treatmentExposures:()=>K,treatmentExposuresRelations:()=>qa,triggerEvals:()=>ye,triggerEvalsRelations:()=>Fa,userOrganizations:()=>de,userOrganizationsRelations:()=>wa,userTeams:()=>ue,userTeamsRelations:()=>Aa,workerConnections:()=>zn});import{relations as i}from"drizzle-orm";var ha=i(o,({many:e})=>({sessions:e(d),contextSnapshots:e($),apiKeys:e(Ae)})),va=i(Ae,({one:e})=>({profile:e(o,{fields:[Ae.userId],references:[o.id]})})),Ia=i(u,({many:e})=>({teams:e(v),userOrganizations:e(de),projects:e(s),invitations:e(E)})),ya=i(v,({one:e,many:t})=>({organization:e(u,{fields:[v.orgId],references:[u.id]}),userTeams:t(ue),invitations:t(E)})),Ta=i(E,({one:e})=>({organization:e(u,{fields:[E.orgId],references:[u.id]}),team:e(v,{fields:[E.teamId],references:[v.id]}),inviter:e(o,{fields:[E.invitedBy],references:[o.id]})})),wa=i(de,({one:e})=>({organization:e(u,{fields:[de.orgId],references:[u.id]})})),Aa=i(ue,({one:e})=>({team:e(v,{fields:[ue.teamId],references:[v.id]})})),za=i(n,({one:e,many:t})=>({versions:t(le),projectInstructions:t(U),events:t(ce),usageEvents:t(he),sessionInstructions:t(B),packInstructions:t(F),forkedFrom:e(n,{fields:[n.forkedFromId],references:[n.id]})})),ja=i(ce,({one:e})=>({instruction:e(n,{fields:[ce.instructionId],references:[n.id]})})),Da=i(T,({one:e,many:t})=>({project:e(s,{fields:[T.projectId],references:[s.id]}),parent:e(T,{fields:[T.parentId],references:[T.id]}),versions:t(T)})),Ra=i(le,({one:e})=>({instruction:e(n,{fields:[le.instructionId],references:[n.id]})})),ka=i(s,({one:e,many:t})=>({organization:e(u,{fields:[s.orgId],references:[u.id]}),projectInstructions:t(U),sessions:t(d)})),Ea=i(U,({one:e})=>({project:e(s,{fields:[U.projectId],references:[s.id]}),instruction:e(n,{fields:[U.instructionId],references:[n.id]})})),ba=i(d,({one:e,many:t})=>({profile:e(o,{fields:[d.userId],references:[o.id]}),project:e(s,{fields:[d.projectId],references:[s.id]}),run:e(g,{fields:[d.runId],references:[g.id]}),events:t(_e),sessionInstructions:t(B),treatmentExposures:t(K),contextSnapshots:t($)})),Sa=i(g,({one:e,many:t})=>({profile:e(o,{fields:[g.userId],references:[o.id]}),organization:e(u,{fields:[g.orgId],references:[u.id]}),project:e(s,{fields:[g.projectId],references:[s.id]}),sessions:t(d),launchJobs:t(De)})),Ka=i(De,({one:e})=>({run:e(g,{fields:[De.runId],references:[g.id]})})),Pa=i(_e,({one:e})=>({session:e(d,{fields:[_e.sessionId],references:[d.id]})})),Ca=i(B,({one:e})=>({session:e(d,{fields:[B.sessionId],references:[d.id]}),instruction:e(n,{fields:[B.instructionId],references:[n.id]})})),Oa=i(S,({one:e,many:t})=>({owner:e(o,{fields:[S.userId],references:[o.id]}),project:e(s,{fields:[S.projectId],references:[s.id]}),exposures:t(K)})),qa=i(K,({one:e})=>({session:e(d,{fields:[K.sessionId],references:[d.id]}),owner:e(o,{fields:[K.userId],references:[o.id]}),assignment:e(S,{fields:[K.assignmentId],references:[S.id]})})),Ma=i(z,({one:e,many:t})=>({packInstructions:t(F),forkedFrom:e(z,{fields:[z.forkedFromId],references:[z.id]})})),Ha=i(F,({one:e})=>({pack:e(z,{fields:[F.packId],references:[z.id]}),instruction:e(n,{fields:[F.instructionId],references:[n.id]})})),La=i(he,({one:e})=>({instruction:e(n,{fields:[he.instructionId],references:[n.id]})})),Ua=i(r,({one:e,many:t})=>({parent:e(r,{fields:[r.parentId],references:[r.id]}),evals:t(C),evalRuns:t(k),benchmarks:t(ve),triggerEvals:t(ye),optimizationRuns:t(Te),evalJobs:t(we),evalConversations:t(ze)})),Ba=i(C,({one:e,many:t})=>({evalTarget:e(r,{fields:[C.evalTargetId],references:[r.id]}),runs:t(k)})),Va=i(k,({one:e})=>({eval:e(C,{fields:[k.evalId],references:[C.id]}),evalTarget:e(r,{fields:[k.evalTargetId],references:[r.id]})})),Ga=i(ve,({one:e})=>({evalTarget:e(r,{fields:[ve.evalTargetId],references:[r.id]})})),Fa=i(ye,({one:e})=>({evalTarget:e(r,{fields:[ye.evalTargetId],references:[r.id]})})),Ja=i(Te,({one:e})=>({evalTarget:e(r,{fields:[Te.evalTargetId],references:[r.id]})})),$a=i(we,({one:e})=>({evalTarget:e(r,{fields:[we.evalTargetId],references:[r.id]})})),Ya=i(ze,({one:e})=>({evalTarget:e(r,{fields:[ze.evalTargetId],references:[r.id]})})),Qa=i($,({one:e})=>({session:e(d,{fields:[$.sessionId],references:[d.id]}),profile:e(o,{fields:[$.userId],references:[o.id]})}));var et=0,kr=0,tt=0,Er=0;var Wa=0;function Ko(){et++,et>kr&&(kr=et)}p(Ko,"trackDbOpStart");function Po(){et>0&&et--}p(Po,"trackDbOpEnd");function Co(){tt++,tt>Er&&(Er=tt)}p(Co,"trackHeavyDbOpStart");function Oo(){tt>0&&tt--}p(Oo,"trackHeavyDbOpEnd");function br(){Wa++}p(br,"recordQueryDeadline");var Ct,qt,qo=!1,Pt;var Sr,Mt,Ot;function Cr(e){let t=process.env[e];if(!t)throw new Error(`Missing required env var: ${e}`);return t}p(Cr,"getEnv");function Or(){if(qo)throw new Error("getDb() called after closeDb(): the connection pool is closed for shutdown. Stop issuing queries (timers/requests) before draining the pool.");if(!Ct){let e=process.env.PG_APPLICATION_NAME||"rulemetric",t=Number(process.env.PG_POOL_MAX)||3,a=Number(process.env.PG_CONNECT_TIMEOUT_S)||10,l=Number(process.env.PG_STATEMENT_TIMEOUT_MS)||0,_=Number(process.env.PG_IDLE_TIMEOUT)||5,f=Number(process.env.PG_KEEP_ALIVE_S)||60;qt=Pr(Cr("DATABASE_URL"),{prepare:!1,max:t,connect_timeout:a,idle_timeout:_,keep_alive:f,max_lifetime:300,connection:{application_name:e,...l>0?{statement_timeout:l}:{}}}),Ct=Kr(qt,{schema:Kt})}return Ct}p(Or,"getDb");function qr(){if(qo)throw new Error("getHeavyDb() called after closeDb(): the connection pool is closed for shutdown. Stop issuing queries (timers/requests) before draining the pool.");if(!Ot){let e=(process.env.PG_APPLICATION_NAME||"rulemetric")+":heavy",t=Number(process.env.PG_HEAVY_POOL_MAX)||2;Mt=Pr(Cr("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}}),Ot=Kr(Mt,{schema:Kt})}return Ot}p(qr,"getHeavyDb");async function Xa(){if(Pt)return Pt;qo=!0;let e=qt,t=Sr,a=Mt;return qt=void 0,Ct=void 0,Sr=void 0,Mt=void 0,Ot=void 0,Pt=Promise.allSettled([e?e.end({timeout:5}):Promise.resolve(),t?t.end({timeout:5}):Promise.resolve(),a?a.end({timeout:5}):Promise.resolve()]).then(()=>{}),Pt}p(Xa,"closeDb");var Za=new Set(["CONNECT_TIMEOUT","ETIMEDOUT","ENOTFOUND","ECONNREFUSED","EAI_AGAIN"]);function Mr(e){let t=e,a=t?.code??t?.cause?.code??t?.errno;return a!==void 0&&Za.has(a)}p(Mr,"isRetryableConnectError");var ed=new Set(["CONNECTION_CLOSED","ECONNRESET","EPIPE"]);function Hr(e){let t=e,a=t?.code??t?.cause?.code??t?.errno;return a!==void 0&&ed.has(a)}p(Hr,"isRetryableResetError");async function Lr(e,t={}){let a=t.attempts??3,l=t.baseMs??100,_;for(let f=0;f<a;f++)try{return await e()}catch(y){_=y;let Re=Mr(y)||t.retryResets===!0&&Hr(y);if(f===a-1||!Re)throw y;await new Promise(Y=>setTimeout(Y,l*2**f))}throw _}p(Lr,"withDbRetry");var Ht=class extends Error{static{p(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"}};function Ur(){let e=Number(process.env.PG_QUERY_DEADLINE_MS);return Number.isFinite(e)&&e>=0?e:2e4}p(Ur,"queryDeadlineMs");function td(e,t){let a,l=new Promise((_,f)=>{a=setTimeout(()=>{br(),f(new Ht(t))},t);let y=a;typeof y.unref=="function"&&y.unref()});return Promise.race([e,l]).finally(()=>clearTimeout(a))}p(td,"raceWithDeadline");var Br=new Set(["select","selectDistinct","selectDistinctOn","insert","update","delete","execute","with","$count","refreshMaterializedView"]),Vr=new Set(["select","selectDistinct","selectDistinctOn","$count"]);function Mo(e,t=!1,a=0,l=!1){return e===null||typeof e!="object"&&typeof e!="function"?e:new Proxy(e,{get(_,f,y){if(f==="then"){let Y=Reflect.get(_,f,y);return typeof Y!="function"?Y:(Jr,$r)=>{let Yr=l?Co:Ko,Qr=l?Oo:Po;Yr();let Ho=Lr(()=>new Promise((Wr,Xr)=>Y.call(_,Wr,Xr)),{retryResets:t});return(a>0?td(Ho,a):Ho).finally(Qr).then(Jr,$r)}}let Re=Reflect.get(_,f,y);return typeof Re=="function"?(...Y)=>Mo(Re.apply(_,Y),t,a,l):Re}})}p(Mo,"wrapBuilder");function Gr(e,t=!1){let a=t?Co:Ko,l=t?Oo:Po;a();try{return Promise.resolve(e()).finally(l)}catch(_){throw l(),_}}p(Gr,"gaugeTransaction");var Fr=new Proxy({},{get(e,t){let a=Or(),l=a[t];if(typeof t=="string"&&Br.has(t)&&typeof l=="function"){let _=Vr.has(t),f=Ur();return(...y)=>Mo(l.apply(a,y),_,f)}return t==="transaction"&&typeof l=="function"?(..._)=>Gr(()=>l.apply(a,_)):l}}),od=new Proxy({},{get(e,t){let a=qr(),l=a[t];if(typeof t=="string"&&Br.has(t)&&typeof l=="function"){let _=Vr.has(t);return(...f)=>Mo(l.apply(a,f),_,0,!0)}return t==="transaction"&&typeof l=="function"?(..._)=>Gr(()=>l.apply(a,_),!0):l}});export{Lo as a,Or as b,Xa as c};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{g as re}from"./chunk-XJYNMJHH.js";import{b as z,i as K,j as Q,k as Z,l as ee,m as te,n as ne}from"./chunk-BL4BN6RU.js";import{e as oe}from"./chunk-DBELYMDA.js";import{d as J,e as L,f as Y}from"./chunk-G5BXZT6F.js";import{e as y,f as V}from"./chunk-KLEF5D3A.js";import{a as c}from"./chunk-ZLLER3HP.js";import{createHash as de}from"node:crypto";var N=c(e=>de("sha256").update(e).digest("hex"),"sha256"),ie=1.3,j=4,ge=20;function me(e,a){if(!e.configured||a<=0)return j;let n=Math.ceil(e.minPairs*ie/a);return Math.min(ge,Math.max(j,n))}c(me,"passCapFor");function fe(e,a=10,n=j){if(e<=0)return{passes:0,expectedPairs:0,feasible:!1,reason:"no live cases"};let l=Math.ceil(a*ie),t=Math.min(n,Math.ceil(l/e)),o=t*e;return o<a?{passes:t,expectedPairs:o,feasible:!1,reason:`${e} live case(s) x ${n} passes = ${e*n} pairs at best, below the ${a} a controlled verdict requires \u2014 add cases rather than replaying these`}:{passes:t,expectedPairs:o,feasible:!0}}c(fe,"planPasses");var he=60,be=c(e=>typeof e=="object"&&e!==null&&typeof e.withScore=="number"&&typeof e.withoutScore=="number","isPair");function Pe(e,a,n){let l=[...e].sort((t,o)=>Date.parse(o.createdAt)-Date.parse(t.createdAt));for(let t of l){if(t.applied)continue;let o=t.gates?.accumulation;if(!o||typeof o!="object"||o.priorContentHash!==a||o.targetPairs!==n||typeof o.candidateContentHash!="string"||!Array.isArray(o.pairs))continue;let r=o.pairs.filter(be);if(r.length===o.pairs.length&&!(r.length>=n))return{promotionId:t.id,candidateContentHash:o.candidateContentHash,pairs:r,runs:typeof o.runs=="number"?o.runs:1}}return null}c(Pe,"findOpenAccumulation");var we=5,ae=c(e=>Array.isArray(e)?e.filter(a=>typeof a=="string"):[],"stringList"),D=c(e=>typeof e=="number"&&Number.isFinite(e)?e:null,"finite");function $e(e,a,n=we){let l=[...e].filter(r=>r.fromContentHash===a).sort((r,b)=>Date.parse(b.createdAt)-Date.parse(r.createdAt)),t=[],o=new Set;for(let r of l){let b=r.toContentHash??r.id;if(o.has(b))continue;o.add(b);let g=r.verdict??null,I=D(g?.delta),m=D(g?.ci?.lower),P=D(g?.ci?.upper),u=D(g?.nWith),S=g?.sufficient===!0&&I!=null&&m!=null&&P!=null&&u!=null?{delta:I,ciLower:m,ciUpper:P,nPairs:u}:null;if(t.push({decision:typeof r.decision=="string"?r.decision:"unknown",applied:r.applied===!0,at:typeof r.createdAt=="string"?r.createdAt:"",rationale:typeof r.proposalRationale=="string"?r.proposalRationale:"",touched:ae(r.touchedSections),refusals:ae(r.refusals),measured:S}),t.length>=n)break}return t}c($e,"summarisePriorDecisions");function ve(e,a){let n=a.accumulate??(e.autoEvolveAccumulate===!0||e.autoEvolveAccumulate==="true"),l=a.accumulateTargetPairs??e.autoEvolveAccumulateTarget,t=typeof l=="string"?Number.parseInt(l,10):l,o=typeof t=="number"&&Number.isInteger(t)&&t>0?t:he;return{enabled:n,targetPairs:o}}c(ve,"readAccumulateConfig");function ye(e){let a=e.accumulateEnabled&&e.pairCount<e.targetPairs;return{apply:e.consented&&!a,peeking:a}}c(ye,"resolveApply");async function Ie(e,a){let n=c(i=>a?.logger?.info?.(i)??console.log(i),"log"),{evalTargetId:l}=e,t=`[cron_instruction_evolution] ${l}`,o=await y(`/api/eval-targets/${l}`),r=o.metadata??{};if(Q(r))return n(`${t}: PAUSED (metadata.autoEvolvePaused) \u2014 no model budget spent. Opt-in is intact.`),{skipped:"paused"};let b=e.apply??(r.autoEvolveApply===!0||r.autoEvolveApply==="true"),g=Ce(r);if(g==null){if(b)return n(`${t}: refusing \u2014 metadata.immutableSections is unset. Set it (use [] to explicitly protect nothing) before letting the loop edit this target unattended.`),{skipped:"immutable-sections-unset"};n(`${t}: metadata.immutableSections unset \u2014 measure-only cycle proceeds with [] (nothing protected). Writing still requires setting it explicitly.`),g=[]}let m=(await y(`/api/eval-targets/${l}/evals`)).filter(i=>!i.retiredAt);if(m.length===0)return{skipped:"no-live-cases"};let P=K(r);P.note&&n(`${t}: ${P.note}`);let u=fe(m.length,P.minPairs,me(P,m.length));if(!u.feasible)return n(`${t}: cannot reach a sufficient verdict \u2014 ${u.reason}`),{skipped:"cannot-reach-min-n",reason:u.reason};let S=Z({liveCases:m.length,passes:u.passes});n(`${t}: budget for this run \u2014 ${ne(S)}`);let H=await y(`/api/eval-targets/${l}/judge-calibration`);if(!H.powerCheck.adequate){let i=(H.powerCheck.reasons??[]).join("; ");return n(`${t}: not adequately powered, skipping before spending budget \u2014 ${i}`),{skipped:"not-adequate",reason:i}}let U=Y,se=Date.now()-U*24*60*60*1e3,_=await y(`/api/eval-targets/${l}/promotions?limit=200`),W=_.promotions.filter(i=>i.applied&&Date.parse(i.createdAt)>=se).length;if(W>=L)return n(`${t}: change budget looks exhausted (${W}/${L} applied in ${U}d), skipping before spending budget`),{skipped:"budget-exhausted"};let E=J();if(!E.green)return n(`${t}: A/A canary is RED \u2014 halting. ${E.failures.join(" | ")}`),{skipped:"canary-red",reason:E.failures.join(" | ")};let F=o.content,x=N(F),p=ve(r,e),w=p.enabled?Pe(_.promotions,x,p.targetPairs):null,C,M,A=[],R=0,q=z;if(w){let i=await y(`/api/promotions/${w.promotionId}`);if(N(i.toContent)!==w.candidateContentHash)return n(`${t}: stored candidate does not match its recorded hash \u2014 refusing to continue`),{skipped:"accumulation-hash-mismatch",reason:w.promotionId};C=i.toContent,M=i.proposalRationale??"",A=w.pairs,R=w.runs,q=0,n(`${t}: continuing accumulation ${w.promotionId} \u2014 ${A.length}/${p.targetPairs} pair(s) carried from ${R} prior run(s)`)}else{let i=H.caseDiscrimination?.cases??[],d=[];try{d=$e(_.promotions,x)}catch(s){n(`${t}: could not summarise prior decisions (${s instanceof Error?s.message:String(s)}) \u2014 proposing without them`)}d.length>0&&n(`${t}: proposer sees ${d.length} prior decision(s) against this exact body (${d.map(s=>`${s.decision}${s.measured?"/measured":""}`).join(", ")})`);let k=await re({currentContent:o.content,targetType:o.type,targetName:o.name,immutableSections:g,evidence:{nonDiscriminating:i.filter(s=>!s.discriminating).map(s=>`${s.name??s.assertion??"unnamed"} \u2014 ${s.note}`),weakest:i.filter(s=>s.discriminating&&s.withPassRate<s.withoutPassRate).map(s=>({name:s.name??s.assertion??"unnamed",withPassRate:s.withPassRate,withoutPassRate:s.withoutPassRate})),priorDecisions:d,notes:[]}});if(!k.ok)return n(`${t}: no usable proposal \u2014 ${k.reason}`),{skipped:"no-proposal",reason:k.reason};C=k.proposal.candidateContent,M=k.proposal.rationale}n(`${t}: measuring ${m.length} case(s) x ${u.passes} pass(es) = up to ${u.expectedPairs} pairs, candidate vs prior version`);let $=[],G=[],le=Date.now(),B=0,O=0;for(let i=1;i<=u.passes;i++){let d=await oe({cases:m,candidateContent:C,priorVersionContent:F,concurrency:e.concurrency??2,runNumber:i,opts:{targetId:l,targetVersion:o.version??1,iteration:1,timeout:e.timeout??24e4,model:e.model,graderModel:e.graderModel,skipGrading:!1,targetType:o.type,targetName:o.name},onLog:n});$.push(...d.pairs),G.push(...d.results),B+=d.completed,O+=d.failed,n(`${t}: pass ${i}/${u.passes} \u2014 ${d.pairs.length} pair(s), running total ${$.length}`)}let v=[...A,...$],T=$.length>0,f=ee({runs:G,plannedPairs:u.expectedPairs,usablePairs:$.length,verdictPairs:T?v.length:$.length,proposalCalls:q,passes:u.passes,liveCases:m.length,wallMs:Date.now()-le});if(n(`${t}: ${B} completed, ${O} failed, ${$.length} usable pair(s) \u2014 spent ~${f.modelCalls} model calls (${f.proposalCalls} proposal + ${f.executorCalls} executor + >=${f.graderCalls} grader) in ${(f.wallMs/6e4).toFixed(1)} min`+(T?`; the ${f.verdictPairs} pair(s) behind this verdict resolve +/-${te(f.mde)} at 80% power`:"")),!T)return{skipped:"no-pairs",reason:`${O} run(s) failed or were ungradeable`,cost:f};p.enabled&&n(`${t}: accumulated ${v.length}/${p.targetPairs} pair(s) over ${R+1} run(s) on one candidate`);let X=b,{apply:ce,peeking:ue}=ye({consented:X,accumulateEnabled:p.enabled,pairCount:v.length,targetPairs:p.targetPairs});X&&ue&&n(`${t}: interim readout at ${v.length}/${p.targetPairs} pairs \u2014 recording the decision but not acting until the target is reached`);let h=await V(`/api/eval-targets/${l}/promotions`,{candidateContent:C,proposalSource:"llm",proposalRationale:M,pairs:v,canaryGreen:E.green,measuredAgainstContentHash:x,immutableSections:g,apply:ce,measurementCost:f,...p.enabled?{accumulation:{candidateContentHash:N(C),priorContentHash:x,targetPairs:p.targetPairs,carriedPairs:A.length,runs:R+1}}:{}});return n(`${t}: ${h.decision}${h.applied?" (APPLIED)":""} \u2014 ${h.rationale}`+(h.refusals.length>0?` | refusals: ${h.refusals.join("; ")}`:"")),{decision:h.decision,applied:h.applied,nPairs:v.length,promotionId:h.id,cost:f,...p.enabled?{carriedPairs:A.length,accumulationRuns:R+1}:{}}}c(Ie,"cronInstructionEvolution");function Ce(e){let a=e.immutableSections;return a==null||!Array.isArray(a)?null:a.filter(n=>typeof n=="string")}c(Ce,"readImmutableSections");export{ie as a,j as b,ge as c,me as d,fe as e,he as f,Pe as g,we as h,$e as i,ve as j,ye as k,Ie as l,Ce as m};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{b as J}from"./chunk-GIRPEMTW.js";import{b as F,c as G}from"./chunk-FAZMKMTC.js";import{a as _}from"./chunk-MODXEGCU.js";import{d as H,f as U}from"./chunk-B3BHB26P.js";import{e as w,f as R}from"./chunk-KLEF5D3A.js";import{a as u}from"./chunk-ZLLER3HP.js";import{readFileSync as K,realpathSync as B}from"node:fs";import y from"node:path";import x from"node:os";function W(s){let o=y.resolve(s);if(o===y.resolve(x.homedir()))return!1;let a=y.parse(o).root;if(o===a)return!1;try{let n=B(x.tmpdir());if(B(o)===n)return!1}catch{}return!0}u(W,"isScorableProjectPath");var Y=5,q=Number(process.env.RULEMETRIC_MAX_SUGGESTION_PROJECTS??10),Q=48,Z=.5,T=400,tt=3,et=.6,ot=1;function nt(s){let o=s.bloated??[],a=new Set([...s.harmful.map(n=>n.id),...s.candidates.map(n=>n.id)]);return o.filter(n=>!a.has(n.id)).slice(0,ot).map(n=>({instructionId:n.id,estimatedTokens:n.estimatedTokens,topProjectId:n.topProjectId??null,score:.55,reason:`Costs ~${n.estimatedTokens} tokens every session and measures neutral across ${n.exposures} exposed session(s) \u2014 enough data to detect an effect, and none found. Consider shortening "${n.name}" rather than removing it.`+(n.containsSafetyLanguage?" CAUTION: it contains guardrail language (destructive-command or credential rules) \u2014 preserve those lines when shortening.":"")}))}u(nt,"buildTrimProposals");async function rt(s,o,a){let n=[],i=0;for(let d of s)try{await a("/api/instruction-experiments",{instructionId:d.instructionId,projectPath:o,source:"groom"}),i++}catch(g){let m=g instanceof Error?g.message:String(g);n.push({...d,reason:`${d.reason} (not measurable by withholding: ${m})`})}return{nominated:i,unmeasurable:n}}u(rt,"nominateRemovals");function st(s){let o=[];for(let n of s.harmful){let i=n.verdict.delta;o.push({instructionId:n.id,score:Math.min(.95,.75+Math.abs(i)),topProjectId:n.topProjectId??null,reason:`Measured harmful: sessions using "${n.name}" scored ${(i*100).toFixed(1)}pp worse across ${n.exposures} exposed session(s). Observational \u2014 review before archiving.`})}let a=new Set(s.harmful.map(n=>n.id));for(let n of s.candidates)a.has(n.id)||o.push({instructionId:n.id,score:et,topProjectId:n.topProjectId??null,reason:`Unused: "${n.name}" is ${n.reason} (${n.totalExposures} lifetime exposure(s)) but still costs context budget every session.`});return o.slice(0,tt)}u(st,"buildRemovalProposals");async function at(){let s=y.join(x.homedir(),".config","rulemetric","skills-registry.json");try{let o=K(s,"utf-8"),a=JSON.parse(o);return Date.now()-new Date(a.generatedAt).getTime()>Q*60*60*1e3}catch{return!0}}u(at,"checkSkillsRegistryStale");var ft=u(async(s,o)=>{let a=H(),n=a!=="none";n?o.logger.info(`Scoring backend: ${a}`):o.logger.warn("No LLM backend available (claude CLI missing and ANTHROPIC_API_KEY unset); skipping relevance scoring. Removal/trim proposals still run \u2014 they need no LLM.");let i;try{i=(await w("/api/sessions/project-paths?limit="+q)).projectPaths}catch(t){o.logger.warn(`Failed to fetch project paths: ${t instanceof Error?t.message:String(t)}`);return}if(i.length===0){o.logger.info("No recent project paths; nothing to score");return}let d=new Map;try{let t=await w("/api/projects?limit=200");for(let e of t.projects??[])e.primaryCheckoutPath&&d.set(_(e.primaryCheckoutPath),e.id)}catch(t){o.logger.warn(`Failed to fetch projects for id resolution: ${t instanceof Error?t.message:String(t)}`)}let g=new Map;try{let t=await w(`/api/catalog?limit=200&contentPreview=${T}`);for(let e of t)g.set(e.id,{id:e.id,name:e.name,description:e.description??"",tags:e.tags??[],contentPreview:(e.contentPreview??"").slice(0,T)})}catch(t){o.logger.warn(`Failed to fetch catalog: ${t instanceof Error?t.message:String(t)}`)}try{let t=await w("/api/instructions?limit=100");for(let e of t.instructions??[])g.has(e.id)||g.set(e.id,{id:e.id,name:e.name,description:e.description??"",tags:e.tags??[],contentPreview:(e.content??"").slice(0,T)})}catch(t){o.logger.warn(`Failed to fetch personal instructions: ${t instanceof Error?t.message:String(t)}`)}let m=[],p=[];try{let t=await w("/api/insights/groom-candidates");if(!t.captureHealthy)o.logger.info(`Grooming paused: ${t.reason??"capture unhealthy"}`);else{m=st(t),p=nt(t);let e=t.safetyGuarded+t.harmfulSafetyGuarded;o.logger.info(`Removal proposals: ${m.length} (${t.harmful.length} measured-harmful, ${t.candidates.length} never-used, ${e} withheld by the safety allowlist); trim proposals: ${p.length} (${(t.bloated??[]).length} measured-neutral and expensive, ${t.trimSafetyFlagged??0} flagged as containing guardrail language)`)}}catch(t){o.logger.warn(`Failed to fetch groom candidates: ${t instanceof Error?t.message:String(t)}`)}let I=[...g.values()];if(I.length===0&&m.length===0&&p.length===0){o.logger.info("No candidate instructions and nothing to retire; nothing to score");return}o.logger.info(`Scoring ${I.length} candidates across ${i.length} project(s)`);let O=0,l=null,$=new Set;for(let t of i)try{let e=_(t);if(!W(e)){o.logger.info(`Skipping ${e}: not a project directory (home/root)`);continue}let f=J(e),S=n&&f.length>0;f.length===0&&o.logger.info(`${e}: insufficient language signals; removal/trim only`);let D={name:y.basename(e),description:null,languages:f,topics:[],dependencies:[]},v=S?G(I):[];S&&o.logger.info(`Scoring ${I.length} candidates for ${e} in ${v.length} batch(es)`);let k=[],b=0;for(let r of v)try{let c=await U(F(D,r),"",4096);if(!c){b++;continue}let C=c.recommendations??[];for(let P of C)typeof P.instructionId=="string"&&typeof P.score=="number"&&typeof P.reason=="string"&&k.push({instructionId:P.instructionId,score:P.score,reason:P.reason})}catch(c){b++,o.logger.warn(`Batch failed for ${e}: ${c instanceof Error?c.message:String(c)}`)}b>0&&o.logger.warn(`${b}/${v.length} batch(es) failed for ${e} (backend ${a}); suggestions are partial`),S&&k.length===0&&o.logger.warn(`No usable LLM output for ${e} (backend ${a})`);let X=k.filter(r=>r.score>=Z).sort((r,c)=>c.score-r.score).slice(0,Y),E=d.get(e),V=l===null||l===e;l===null&&(l=e);let M=u(r=>r.topProjectId?r.topProjectId===E:V,"placeHere"),A=m.filter(M),{nominated:L,unmeasurable:N}=await rt(A,e,R);L>0&&o.logger.info(`${e}: ${L} removal candidate(s) nominated for randomised withholding instead of the feed`);let h=[...X.map(r=>({instructionId:r.instructionId,score:r.score,reason:r.reason,kind:"add"})),...N.map(({topProjectId:r,...c})=>({...c,kind:"remove"})),...p.filter(M).map(({estimatedTokens:r,topProjectId:c,...C})=>({...C,kind:"trim"}))];if(h.length===0){o.logger.info(`Nothing to suggest for ${e}`);continue}await R("/api/instruction-suggestions/batch-upsert",{projectPath:e,...E?{projectId:E}:{},suggestions:h}),o.logger.info(`${e}: ${h.filter(r=>r.kind==="add").length} add + ${h.filter(r=>r.kind==="remove").length} remove + ${h.filter(r=>r.kind==="trim").length} trim`);for(let r of h)r.kind!=="add"&&$.add(r.instructionId);let z=new Set(N.map(r=>r.instructionId));for(let r of A)z.has(r.instructionId)||$.add(r.instructionId);O++}catch(e){o.logger.warn(`Failed to score ${t}: ${e instanceof Error?e.message:String(e)}`)}let j=[...m.filter(t=>!$.has(t.instructionId)),...p.filter(t=>!$.has(t.instructionId)).map(({estimatedTokens:t,...e})=>e)];if(j.length>0&&l)try{let t=new Set(p.map(e=>e.instructionId));await R("/api/instruction-suggestions/batch-upsert",{projectPath:l,...d.get(l)?{projectId:d.get(l)}:{},suggestions:j.map(({topProjectId:e,...f})=>({...f,kind:t.has(f.instructionId)?"trim":"remove"}))}),o.logger.info(`Orphan sweep: ${j.length} proposal(s) whose project was not scored this run placed on ${l}`)}catch(t){o.logger.warn(`Orphan sweep failed: ${t instanceof Error?t.message:String(t)}`)}if(await at())try{await R("/api/instruction-suggestions/mark-stale",{}),o.logger.warn("Skills registry is stale (>48h); marked all suggestions stale")}catch{}o.logger.info(`Done: scored ${O}/${i.length} projects`)},"cronSuggestInstructions");export{W as a,nt as b,rt as c,st as d,ft as e};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{a as h,b as _}from"./chunk-
|
|
1
|
+
import{a as h,b as _}from"./chunk-7QQSYEPT.js";import{d as C,e as D}from"./chunk-FAZMKMTC.js";import{a as o}from"./chunk-ZLLER3HP.js";import*as m from"node:fs/promises";import*as x from"node:path";import{eq as z}from"drizzle-orm";import{randomBytes as H}from"node:crypto";var A="#0d9488",g="#1a1a1a",y="#666666",M="#f5f5f7",k="#ffffff",I="#e5e5e9",O=["Added","Changed","Fixed","Removed","Deprecated","Security"];function U(e){let t=["January","February","March","April","May","June","July","August","September","October","November","December"],[n,r,a]=e.split("-").map(p=>parseInt(p,10));return!n||!r||!a||r<1||r>12?e:`${t[r-1]} ${a}, ${n}`}o(U,"formatIsoDate");function l(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}o(l,"escapeHtml");function P(e){let t=[];for(let n of O){let r=e[n];r&&r.length>0&&t.push({name:n,items:r})}return t}o(P,"orderedSections");function v(e){let{version:t,date:n,sections:r,unsubscribeUrl:a,productUrl:p,recipientName:u}=e,c=U(n),s=`What's new in RuleMetric \u2014 ${c}`,b=u?`Hi ${u},`:"Hi there,",i=P(r),d=new Date().getUTCFullYear(),E=i.map(({name:$,items:R})=>{let w=R.map(S=>` <li style="margin:0 0 6px 0;font-size:15px;line-height:1.5;color:${g};">${l(S)}</li>`).join(`
|
|
2
2
|
`);return` <h3 style="margin:24px 0 8px 0;font-size:16px;line-height:1.3;font-weight:600;color:${g};">${$}</h3>
|
|
3
3
|
<ul style="margin:0 0 8px 0;padding-left:20px;">
|
|
4
4
|
${w}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{c as P}from"./chunk-5XUN743A.js";import{a as
|
|
1
|
+
import{c as P}from"./chunk-5XUN743A.js";import{a as L}from"./chunk-MOAJLSYV.js";import{b as S}from"./chunk-BLCMXTIK.js";import{a as M}from"./chunk-T4ZIK6RS.js";import{a as T}from"./chunk-W76EQSEV.js";import{a as y}from"./chunk-RSKQRVPJ.js";import{a as R}from"./chunk-HXZM2UHO.js";import{a as x}from"./chunk-FAXV5AAG.js";import{a as _}from"./chunk-UF6US7VU.js";import{e as k}from"./chunk-BAVLNWO4.js";import{b as H}from"./chunk-YW3JQKGY.js";import{a as A}from"./chunk-O2BKBW7Z.js";import{a as E}from"./chunk-KGQ5W54Y.js";import{a as I}from"./chunk-UKN2YVY4.js";import{b as h}from"./chunk-5RBLIVBF.js";import{a as N}from"./chunk-EN43UYBN.js";import{l as b}from"./chunk-A4FYFRN7.js";import{d as w}from"./chunk-NTKO4H2K.js";import{b as f,e as v,f as g}from"./chunk-KLEF5D3A.js";import{a as s}from"./chunk-ZLLER3HP.js";var O={process_eval:E,process_insights:I,process_launch:S,process_send_message:y,process_conversation:A,process_session_goal:R,distill_memories:H,memory_ab:M,process_run_cleanup:T,cron_suggest_instructions:k,cron_refresh_skills:_,cron_refresh_pricing:x,cron_eval_autorun:N,cron_instruction_evolution:b,process_judge_review:L},C=Object.keys(O),$=new Set([]);function F(e=process.env){return e.DATABASE_URL?C:C.filter(n=>!$.has(n))}s(F,"availableCapabilities");var J=3e4,U=3e4,K=3e4,D=250,V=5e3,G=`thin-agent-${process.pid}`,p=null;function q(e,n,r,l){let c;try{let d=w();c={claude:d.claudeBin!=null,codex:d.codexBin!=null,codexModel:d.codexConfiguredModel}}catch{}let i=s(d=>{g("/api/workers/heartbeat",{workerType:"cli-worker",clientName:G,clientVersion:l,workerVersion:"0.1.0",currentJobId:null,inFlightCount:0,lastError:null,status:d,metadata:{capabilities:e,mode:"thin-agent",llmEngines:c}}).then(u=>{let t=u?.advisory;t&&t.message!==p?(p=t.message,a(r,{event:"worker_advisory",code:t.code,message:t.message})):t||(p=null)}).catch(u=>{a(r,{event:"presence_heartbeat_error",error:u instanceof Error?u.message:String(u)})})},"send");i("alive");let o=setInterval(()=>i("alive"),K);n.addEventListener("abort",()=>{clearInterval(o),i("shutting_down")},{once:!0})}s(q,"startPresenceHeartbeat");function a(e,n){try{e(JSON.stringify({ts:new Date().toISOString(),...n}))}catch{e(`[agent-loop] log_error event=${n.event}`)}}s(a,"structuredLog");function B(e,n){return n.aborted?Promise.resolve(!1):e<=0?Promise.resolve(!0):new Promise(r=>{let l=setTimeout(()=>{n.removeEventListener("abort",c),r(!0)},e),c=s(()=>{clearTimeout(l),n.removeEventListener("abort",c),r(!1)},"onAbort");n.addEventListener("abort",c,{once:!0})})}s(B,"abortableSleep");async function Q(e,n){let r=`capabilities=${encodeURIComponent(e.join(","))}&waitMs=${n}`,l=await v(`/api/work/next?${r}`);return l==null||typeof l=="string"?null:l}s(Q,"pollForWork");function X(e,n){return{logger:{info:s(r=>n(r),"info"),warn:s(r=>n(r),"warn"),error:s(r=>n(r),"error")},job:{attempts:e}}}s(X,"makeHelpers");async function z(e,n,r){let l=O[e.kind],c=Date.now();if(a(r,{event:"claim",jobId:e.id,kind:e.kind,attempts:e.attempts}),!l){let o=`unknown kind: ${e.kind}`;a(r,{event:"fail",jobId:e.id,kind:e.kind,terminal:!0,error:o}),await g(`/api/work/${e.id}/fail`,{leaseToken:e.leaseToken,error:o,terminal:!0}).catch(()=>{});return}let i=setInterval(()=>{a(r,{event:"heartbeat",jobId:e.id}),g(`/api/work/${e.id}/heartbeat`,{leaseToken:e.leaseToken}).catch(o=>{a(r,{event:"heartbeat_error",jobId:e.id,error:o instanceof Error?o.message:String(o)})})},n);try{let o=X(e.attempts,r),d=await l(e.payload,o)??{};clearInterval(i),a(r,{event:"complete",jobId:e.id,kind:e.kind,durationMs:Date.now()-c}),await g(`/api/work/${e.id}/complete`,{leaseToken:e.leaseToken,result:d})}catch(o){clearInterval(i);let d=h(o),u=o instanceof Error?o.message:String(o);a(r,{event:"fail",jobId:e.id,kind:e.kind,durationMs:Date.now()-c,terminal:d,error:u}),await g(`/api/work/${e.id}/fail`,{leaseToken:e.leaseToken,error:u,terminal:d}).catch(t=>{a(r,{event:"fail_post_error",jobId:e.id,error:t instanceof Error?t.message:String(t)})})}}s(z,"runOne");async function ke(e){let n=e.log??(()=>{}),r=e.pollWaitMs??J,l=e.heartbeatIntervalMs??U,c=e.capabilities??F(),i=D;a(n,{event:"agent_start",capabilities:c,pollWaitMs:r,heartbeatIntervalMs:l}),q(c,e.signal,n,e.version),P({signal:e.signal,log:n}).catch(t=>{a(n,{event:"tt_heartbeat_fatal",error:t instanceof Error?t.message:String(t)})});let o=5*6e4,d=0,u=s(()=>{if(!e.readInstalledVersion||!e.version)return!1;let t=Date.now();if(t-d<o)return!1;d=t;let m=e.readInstalledVersion();return!!(m&&m!==e.version)},"versionDrifted");for(;!e.signal.aborted;){if(u()){a(n,{event:"agent_version_drift",bootVersion:e.version,installedVersion:e.readInstalledVersion?.()??null}),e.onVersionDrift?.();break}let t=null;try{t=await Q(c,r)}catch(m){let W=m instanceof f?m.statusCode:void 0;if(a(n,{event:"poll_error",status:W,error:m instanceof Error?m.message:String(m)}),!await B(i,e.signal))break;i=Math.min(i*2,V);continue}if(!t){if(a(n,{event:"poll_204"}),!await B(i,e.signal))break;i=Math.min(i*2,V);continue}i=D,await z(t,l,n)}a(n,{event:"agent_stop"})}s(ke,"runAgentLoop");export{O as a,C as b,F as c,Q as d,ke as e};
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import{a as o}from"./chunk-ZLLER3HP.js";function I(e){if(!e||typeof e!="object")return e;let r=e,t=r.project_areas;if(t!==void 0&&!Array.isArray(t)){let n=t&&typeof t=="object"?t.areas:void 0;r.project_areas=Array.isArray(n)?n:void 0}return e}o(I,"normalizeRecommendations");import{z as l}from"zod";var x=["org","team","project","personal"],_=l.object({name:l.string().min(1),description:l.string().min(1),type:l.literal("instruction").default("instruction"),scope:l.enum(x),version:l.string().min(1),tags:l.array(l.string()).optional(),compatibility:l.array(l.string()).optional(),slots:l.record(l.string(),l.string()).optional(),metadata:l.record(l.string(),l.unknown()).optional()});import{z as p}from"zod";var C=p.object({name:p.string().min(1),description:p.string().min(1),type:p.literal("prompt"),version:p.string().min(1),tags:p.array(p.string()).optional(),variables:p.array(p.string()).optional(),metadata:p.record(p.string(),p.unknown()).optional()});function h(e,r){let t=r.map(n=>`- ID: ${n.id}
|
|
2
|
+
Name: ${n.name}
|
|
3
|
+
Description: ${n.description}
|
|
4
|
+
Tags: ${n.tags.join(", ")}
|
|
5
|
+
Preview: ${n.contentPreview}`).join(`
|
|
6
|
+
|
|
7
|
+
`);return`You are an expert at matching AI coding instructions to software projects.
|
|
8
|
+
|
|
9
|
+
## Project
|
|
10
|
+
- Name: ${e.name}
|
|
11
|
+
- Description: ${e.description??"No description"}
|
|
12
|
+
- Languages: ${e.languages.join(", ")||"Unknown"}
|
|
13
|
+
- Topics: ${e.topics.join(", ")||"None"}
|
|
14
|
+
- Dependencies: ${e.dependencies.join(", ")||"None"}
|
|
15
|
+
|
|
16
|
+
## Available Instructions
|
|
17
|
+
|
|
18
|
+
${t}
|
|
19
|
+
|
|
20
|
+
## Task
|
|
21
|
+
|
|
22
|
+
Analyze the project and recommend which instructions would be most useful. Consider:
|
|
23
|
+
1. Language and framework alignment
|
|
24
|
+
2. Project purpose and what standards/practices would help
|
|
25
|
+
3. Security, testing, and quality needs based on the project type
|
|
26
|
+
|
|
27
|
+
Return your response as JSON in this exact format:
|
|
28
|
+
{
|
|
29
|
+
"recommendations": [
|
|
30
|
+
{ "instructionId": "<id>", "score": <0.0-1.0>, "reason": "<one sentence explanation>" }
|
|
31
|
+
]
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
Only include instructions with a relevance score >= 0.5. Order by score descending. Return valid JSON only, no markdown fences.`}o(h,"buildRecommendationPrompt");var R=32e3,L={name:"x".repeat(64),description:"x".repeat(256),languages:["TypeScript","Python","Go"],topics:["x".repeat(32)],dependencies:["x".repeat(32)]};function M(e,r={}){if(e.length===0)return[];let t=r.charBudget??R,n=h(L,[]).length,i=[],a=[],u=0;for(let d of e){let m=O(d);a.length>0&&n+u+m>t&&(i.push(a),a=[],u=0),a.push(d),u+=m}return a.length>0&&i.push(a),i}o(M,"batchCandidatesForPrompt");function O(e){return`- ID: ${e.id}
|
|
35
|
+
Name: ${e.name}
|
|
36
|
+
Description: ${e.description}
|
|
37
|
+
Tags: ${e.tags.join(", ")}
|
|
38
|
+
Preview: ${e.contentPreview}`.length+2}o(O,"renderedSize");var T=["Added","Changed","Fixed","Removed","Deprecated","Security"],j=/^##\s+\[([^\]]+)\](?:\s*[-–]\s*(\d{4}-\d{2}-\d{2}))?\s*$/,A=/^###\s+(.+?)\s*$/,F=/^[-*]\s+(.*\S)\s*$/,N=/^ {2,}(\S.*)$/;function D(e){let r=e.split(/\r?\n/),t=[],n=null,i=null,a=null;for(let u of r){let d=u.match(j);if(d){n&&t.push(n);let c=d[1].trim();n={version:c,date:d[2]??null,unreleased:c.toLowerCase()==="unreleased",sections:{}},i=null,a=null;continue}if(!n)continue;let m=u.match(A);if(m){let c=m[1].trim();T.includes(c)?(i=c,n.sections[i]||(n.sections[i]=[]),a=n.sections[i]):(i=null,a=null);continue}if(!i||!a)continue;let f=u.match(F);if(f){a.push(f[1]);continue}let g=u.match(N);if(g&&a.length>0){a[a.length-1]+=" "+g[1].trim();continue}}return n&&t.push(n),{entries:t}}o(D,"parseChangelog");function E(e){return e.entries.filter(r=>r.unreleased?!1:Object.values(r.sections).some(t=>t&&t.length>0))}o(E,"announceableEntries");function w(e){let r=/^(#{1,6})\s+/.exec(e);return r?r[1].length:0}o(w,"headingLevel");function b(e){return e.replace(/^#{1,6}\s+/,"").replace(/[`*_~]/g,"").trim().toLowerCase()}o(b,"normaliseHeading");function $(e,r){let t=b(r);if(t.length===0)return{content:e,removed:!1,removedText:null,reason:"not-found"};let n=e.split(`
|
|
39
|
+
`),i=[];for(let c=0;c<n.length;c+=1)w(n[c])>0&&b(n[c])===t&&i.push(c);if(i.length===0)return{content:e,removed:!1,removedText:null,reason:"not-found"};if(i.length>1)return{content:e,removed:!1,removedText:null,reason:"ambiguous"};let a=i[0],u=w(n[a]),d=n.length;for(let c=a+1;c<n.length;c+=1){let v=w(n[c]);if(v>0&&v<=u){d=c;break}}let m=n.slice(a,d).join(`
|
|
40
|
+
`),f=[...n.slice(0,a),...n.slice(d)];return f.join("").trim().length===0?{content:e,removed:!1,removedText:null,reason:"would-empty-file"}:{content:f.join(`
|
|
41
|
+
`).replace(/\n{3,}/g,`
|
|
42
|
+
|
|
43
|
+
`),removed:!0,removedText:m}}o($,"removeMarkdownSection");function G(e,r){let t=r.trim();if(t.length===0)return{content:e,removed:!1,removedText:null,reason:"not-found"};let n=e.indexOf(t);if(n===-1)return{content:e,removed:!1,removedText:null,reason:"not-found"};if(e.indexOf(t,n+1)!==-1)return{content:e,removed:!1,removedText:null,reason:"ambiguous"};let i=(e.slice(0,n)+e.slice(n+t.length)).replace(/\n{3,}/g,`
|
|
44
|
+
|
|
45
|
+
`);return i.trim().length===0?{content:e,removed:!1,removedText:null,reason:"would-empty-file"}:{content:i,removed:!0,removedText:t}}o(G,"removeExactBlock");var k=["HTTPS_PROXY","HTTP_PROXY","NODE_EXTRA_CA_CERTS"];function U(e,r){if(!e||typeof e!="object")return{value:e,removed:!1,removedDescriptions:[],reason:"not-found"};let t=structuredClone(e);if(!t.hooks)return{value:t,removed:!1,removedDescriptions:[],reason:"not-found"};let n=[];for(let[i,a]of Object.entries(t.hooks)){if(!Array.isArray(a))continue;let u=a.filter(d=>{let m=(d.hooks??[]).some(f=>typeof f.command=="string"&&f.command.includes(r));return m&&n.push(`${i}: ${d.matcher??"*"} \u2192 ${(d.hooks??[]).map(f=>f.command).join(", ")}`),!m});u.length===0?delete t.hooks[i]:t.hooks[i]=u}return Object.keys(t.hooks).length===0&&delete t.hooks,{value:t,removed:n.length>0,removedDescriptions:n,...n.length===0?{reason:"not-found"}:{}}}o(U,"removeHookByCommand");function z(e,r){if(!e||typeof e!="object")return{value:e,removed:!1,removedDescriptions:[],reason:"not-found"};let t=structuredClone(e);return!t.mcpServers||!(r in t.mcpServers)?{value:t,removed:!1,removedDescriptions:[],reason:"not-found"}:(delete t.mcpServers[r],Object.keys(t.mcpServers).length===0&&delete t.mcpServers,{value:t,removed:!0,removedDescriptions:[`mcpServers.${r}`]})}o(z,"removeMcpServer");function y(e){if(!e||typeof e!="object")return[];let r=e.env;return r?k.filter(t=>t in r):[]}o(y,"protectedEnvKeysPresent");function H(e,r){let t=y(e),n=new Set(y(r));return t.filter(i=>!n.has(i))}o(H,"lostProtectedEnvKeys");import Re from"gray-matter";import{z as S}from"zod";var ke=S.object({type:S.enum(["instruction","prompt"])});export{I as a,h as b,M as c,D as d,E as e,$ as f,G as g,U as h,z as i,H as j};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{a as c,c as d}from"./chunk-IZTIYR5Q.js";import{
|
|
1
|
+
import{a as c,c as d}from"./chunk-IZTIYR5Q.js";import{d as u}from"./chunk-6VKQT2J3.js";import{a}from"./chunk-NIRD7ETU.js";import{a as n}from"./chunk-QY3UKLDE.js";import{b as i}from"./chunk-KLEF5D3A.js";import{g as r}from"./chunk-JZ5Z2BRO.js";import{a as s}from"./chunk-ZLLER3HP.js";import{Command as f,Flags as h}from"@oclif/core";function p(t){return t instanceof i?t.statusCode>=500||t.statusCode===408||t.statusCode===0:/fetch failed|ECONNREFUSED|ECONNRESET|ETIMEDOUT|EAI_AGAIN|bad gateway|timed out/i.test(t.message??"")}s(p,"isAvailabilityError");var m=class extends f{static{s(this,"BaseCommand")}static baseFlags={"api-url":h.string({description:"Override API base URL",env:"RULEMETRIC_API_URL",hidden:!0})};async init(){await super.init();let{flags:e}=await this.parse(this.constructor);e["api-url"]&&(process.env.RULEMETRIC_API_URL=e["api-url"]);let o=d(this.config.version);o&&!this.argv.includes("--quiet")&&!process.env.RULEMETRIC_QUIET&&process.stderr.write(`
|
|
2
2
|
${o}
|
|
3
3
|
|
|
4
4
|
`),c();try{await a()}catch{}}requireAuth(){r()||this.error("Not logged in. Run `rulemetric auth login` to authenticate."),n()}async catch(e){throw p(e)&&await u({command:this.id,statusCode:e instanceof i?e.statusCode:void 0,message:e.message,cliVersion:this.config.version}),e instanceof i&&(e.statusCode===401&&this.error("Session expired. Run `rulemetric auth login` to re-authenticate."),this.error(e.message)),(e.message?.includes("fetch failed")||e.message?.includes("ECONNREFUSED"))&&this.error("Could not connect to the API server. Is it running?"),e}};export{m as a};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as
|
|
1
|
+
import{a as j}from"./chunk-ULMEKK7C.js";import{a as E}from"./chunk-NBTC5FNV.js";import{a as J}from"./chunk-TU2AR6XO.js";import{d as T}from"./chunk-NJ5UED3H.js";import{b as I,c as P,d as v}from"./chunk-5RUEROLC.js";import{a as b}from"./chunk-ZLLER3HP.js";import{useEffect as R,useState as i}from"react";import{Box as l,Text as s,useInput as Z}from"ink";import{jsx as t,jsxs as a}from"react/jsx-runtime";function K({onClose:A,activeOrg:F,defaultProjectPath:y,width:_}){let{jobs:u,error:L,loading:$,refetch:S}=j(20),[M,C]=i([]),[d,m]=i("list"),[f,w]=i(0),[h,g]=i(null),[x,B]=i(null),[p,c]=i(null);R(()=>{v().then(C).catch(o=>{let r=o instanceof Error?o.message:String(o);c(`couldn't load launchers: ${r}`),C([{tool:"claude_code",capabilities:{headless:!0,interactive:!0,remoteSpawn:!0}}])})},[]),R(()=>{if(!p)return;let o=setTimeout(()=>c(null),5e3);return()=>clearTimeout(o)},[p]),Z((o,r)=>{if(h){if(o==="y"||o==="Y"){let e=h.id;g(null),P(e).then(()=>{S(),c(`cancelled ${e.slice(0,8)}`)}).catch(n=>c(`cancel failed: ${n instanceof Error?n.message:String(n)}`))}else(o==="n"||o==="N"||r.escape)&&g(null);return}if(r.escape){if(d!=="none"){m("none");return}A();return}if(r.tab){m(e=>e==="list"?"form":e==="form"?"none":"list");return}if(o!=="q"&&d==="list"){if(r.upArrow)w(e=>Math.max(0,e-1));else if(r.downArrow)w(e=>Math.min(u.length-1,e+1));else if(o==="c"){let e=u[f];e&&(e.status==="running"||e.status==="queued"||e.status==="pending")&&g(e)}else if(o==="r"){let e=u[f],n=e?.result?.externalSessionId;e&&e.tool==="claude_code"&&n?(B({tool:"claude_code",projectPath:e.config.projectPath,resumeSessionId:n}),m("form")):c("resume needs a Claude Code session with a session id")}else if(o==="o"){let n=u[f]?.result?.externalSessionId;if(n){let O=process.env.RULEMETRIC_WEB_URL??"http://localhost:5174";import("node:child_process").then(({spawn:U})=>{U("open",[`${O}/sessions/${n}`],{detached:!0,stdio:"ignore"}).unref()})}}}});async function N(o){await I(o),B(null),m("list"),c("launched"),S()}return b(N,"handleSubmit"),a(l,{flexDirection:"column",borderStyle:"round",borderColor:T,width:_,paddingX:1,children:[a(l,{children:[t(s,{bold:!0,color:T,children:"Launcher"}),t(s,{dimColor:!0,children:" active org: "}),t(s,{children:F??"(none)"}),$&&t(s,{dimColor:!0,children:" loading\u2026"}),L&&a(s,{color:"#F55B5B",children:[" \u26A0 ",L]})]}),t(l,{marginTop:1,children:t(E,{jobs:u,selectedIndex:f,focused:d==="list"})}),t(l,{marginTop:1,children:t(J,{launchers:M,defaultProjectPath:x?.projectPath??y,defaultTool:x?.tool,defaultResumeSessionId:x?.resumeSessionId,focused:d==="form",onSubmit:N})}),h&&t(l,{marginTop:1,children:a(s,{color:"#FFD700",children:["Cancel job ",h.id.slice(0,8),"? (y/n)"]})}),p&&t(l,{marginTop:1,children:a(s,{dimColor:!0,children:["\xB7 ",p]})}),t(l,{marginTop:1,children:a(s,{dimColor:!0,children:["\u2191\u2193 select tab focus c cancel r resume o open esc ",d==="none"?"close":"back"]})})]})}b(K,"LauncherOverlay");export{K as a};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import{a as M,b as v,c as N,d as A}from"./chunk-4PWGV2OW.js";import{a as S}from"./chunk-5RBLIVBF.js";import{a as C}from"./chunk-FAZMKMTC.js";import{c as O,d as z,f as b}from"./chunk-B3BHB26P.js";import{e as h,f as j,h as p}from"./chunk-KLEF5D3A.js";import{a as y}from"./chunk-ZLLER3HP.js";async function Z(c,l){let{mirrorId:o,projectPath:n,projectId:i,config:u}=c,s=y(e=>l.logger.info(e),"log");if(u?.sessionId)return L({mirrorId:o,sessionId:u.sessionId},s);s(`Processing insights job ${o}...`),await p(`/api/insights-jobs/${o}/progress`,{status:"running",progress:{step:"reading_data"}});try{let{repaired:e}=await j("/api/sessions/repair-analyzed-at",{});e>0&&s(` Repaired analyzed_at on ${e} orphan session(s).`)}catch(e){s(` Warning: analyzed_at repair failed: ${e instanceof Error?e.message:String(e)}`)}let t=await H(n,i);if(!t)throw new S("No session data found \u2014 ensure sessions are captured and enriched.");s(` Found ${t.stats.sessions} sessions, generating recommendations...`);let w=20,m=200;if(z()!=="none"){let e=0,r=0;try{for(;e<m;){let d=await h(`/api/sessions?hasAnalysis=false&limit=${w}&offset=${r}`);if(d.length===0)break;s(` Generating facets for ${d.length} un-analyzed sessions (drained ${e} so far)...`);for(let f of d){if(e>=m)break;try{let g=await h(`/api/sessions/${f.id}/events?limit=100`);if(g.length<2){e++,r++;continue}let P=g.filter($=>$.eventType==="user_message"||$.eventType==="human").map($=>$.content?.slice(0,200)??"").filter(Boolean).join(`
|
|
2
|
+
---
|
|
3
|
+
`);if(!P){e++,r++;continue}let R=await b(A,P,4096);if(R){let $=g.filter(E=>E.eventType==="user_message"||E.eventType==="human").length;await p(`/api/sessions/${f.id}/enrich`,{analysis:{source:"generated_facets",...R},analyzedEventCount:g.length,analyzedTurnCount:$}),s(` Generated facets for session ${f.id} (${f.tool})`)}else r++;e++}catch(g){s(` Failed to generate facets for session ${f.id}: ${g instanceof Error?g.message:String(g)}`),e++,r++}}if(d.length<w)break}}catch(d){s(` Warning: facet generation failed after ${e} sessions: ${d instanceof Error?d.message:String(d)}`)}}let k=await F(n,s);k&&s(` Generator memory: ${k.split(`
|
|
4
|
+
`).length} lines of prior-advice context`);let a={},_=v.length+1;for(let e=0;e<v.length;e++){let r=v[e];s(` [${e+1}/${_}] Generating ${r.name}...`);try{await p(`/api/insights-jobs/${o}/progress`,{status:"running",progress:{step:r.name,current:e+1,total:_,partial:{...a}}})}catch(g){s(` Warning: progress update failed for ${r.name}: ${g instanceof Error?g.message:String(g)}`)}s(` Running LLM prompt for ${r.name}...`);let d=r.usesGeneratorMemory&&k?`${t.summary}
|
|
5
|
+
${k}`:t.summary,f=await b(r.prompt,d,r.maxTokens);f?(a[r.name]=f,s(` Got result for ${r.name}`)):s(` No result for ${r.name} (LLM returned null)`)}s(` [${_}/${_}] Generating at_a_glance...`),await p(`/api/insights-jobs/${o}/progress`,{status:"running",progress:{step:"at_a_glance",current:_,total:_,partial:{...a}}});let G=[t.summary,a.what_works?`
|
|
6
|
+
## What Works
|
|
7
|
+
${JSON.stringify(a.what_works)}`:"",a.friction_analysis?`
|
|
8
|
+
## Friction
|
|
9
|
+
${JSON.stringify(a.friction_analysis)}`:"",a.suggestions?`
|
|
10
|
+
## Suggestions
|
|
11
|
+
${JSON.stringify(a.suggestions)}`:"",a.on_the_horizon?`
|
|
12
|
+
## On the Horizon
|
|
13
|
+
${JSON.stringify(a.on_the_horizon)}`:""].join(`
|
|
14
|
+
`),T=await b(N,G,8192);T&&(a.at_a_glance=T),s(" Uploading results..."),s(` Done! Recommendations generated for job ${o}`),C(a);let I={recommendations:a};return await p(`/api/insights-jobs/${o}/state`,{result:I}).catch(e=>{s(`result persist failed: ${e instanceof Error?e.message:String(e)}`)}),await J(a,n,s),I}y(Z,"processInsights");async function J(c,l,o){if(l)try{let n=c.suggestions,i=Array.isArray(n?.claude_md_additions)?n.claude_md_additions.filter(t=>typeof t?.addition=="string"&&t.addition.trim().length>=12).map(t=>({addition:String(t.addition).trim(),why:String(t.why??"")})):[],u=Array.isArray(c.recommended_skills)?c.recommended_skills.filter(t=>typeof t?.skillId=="string"&&t.skillId.length>0).map(t=>({skillId:String(t.skillId),reason:String(t.reason??"")})):[];if(i.length===0&&u.length===0)return;let s=await j("/api/insights/recommendations/nominate",{projectPath:l,additions:i.slice(0,20),skills:u.slice(0,20)});o(` ${s.nominated} recommendation(s) nominated into the suggestion feed (${s.additionsCreated} new instruction(s)`+(s.skillsUnresolved>0?`, ${s.skillsUnresolved} skill slug(s) unresolved`:"")+")")}catch(n){o(` nomination skipped: ${n instanceof Error?n.message:String(n)}`)}}y(J,"nominateRecommendations");async function L(c,l){let{mirrorId:o,sessionId:n}=c;l(`Analyzing session ${n} via tool CLI...`),await p(`/api/insights-jobs/${o}/progress`,{status:"running",progress:{step:"fetching_session"}});let i=await h(`/api/sessions/${n}`);if(i.analysis&&i.analysis.source==="session_analysis")return l(` Session ${n} already analyzed \u2014 skipping (idempotency guard)`),{sessionId:n,skipped:!0,reason:"already_analyzed"};let u=await h(`/api/sessions/${n}/events?limit=100`);if(u.length<2)throw new S("Session has too few events to analyze");let s=u.filter(m=>m.eventType==="user_message"||m.eventType==="human").map(m=>m.content?.slice(0,200)??"").filter(Boolean).join(`
|
|
15
|
+
---
|
|
16
|
+
`);if(!s)throw new S("No user messages found in session");await p(`/api/insights-jobs/${o}/progress`,{status:"running",progress:{step:"running_analysis",tool:i.tool}});let t=await O(i.tool,A,s);if(!t)throw new Error(`Analysis failed \u2014 ${i.tool} CLI returned no result`);let w=u.filter(m=>m.eventType==="user_message"||m.eventType==="human").length;return await p(`/api/sessions/${n}/enrich`,{analysis:{source:"session_analysis",tool:i.tool,...t},analyzedEventCount:u.length,analyzedTurnCount:w}),l(` Session ${n} analyzed via ${i.tool}`),{sessionId:n,tool:i.tool,facets:t}}y(L,"processSessionAnalysisInline");async function F(c,l,o=h){try{let n=await o(`/api/insights/recommendations/history?projectPath=${encodeURIComponent(c??"")}`);return!n||!Array.isArray(n.dismissed)||!Array.isArray(n.repeated)?"":M(n)}catch(n){return l(` Warning: generator memory unavailable (${n instanceof Error?n.message:String(n)}) \u2014 generating without it`),""}}y(F,"fetchGeneratorMemory");async function H(c,l){try{let o=new URLSearchParams;l?o.set("projectId",l):c&&o.set("projectPath",c);let n=await h(`/api/insights/compute?${o}`);if(!n||n.total_sessions===0)return null;let i=Object.entries(n.tool_counts??{}).sort((s,t)=>t[1]-s[1]).slice(0,10).map(([s,t])=>`${s}: ${t}`).join(", ");return{summary:[`Sessions: ${n.total_sessions}, Messages: ${n.total_messages}, Hours: ${Math.round(n.total_duration_hours)}`,`Top tools: ${i}`,n.goal_categories&&Object.keys(n.goal_categories).length>0?`Goals: ${JSON.stringify(n.goal_categories)}`:"",n.friction&&Object.keys(n.friction).length>0?`Friction: ${JSON.stringify(n.friction)}`:"",n.outcomes&&Object.keys(n.outcomes).length>0?`Outcomes: ${JSON.stringify(n.outcomes)}`:"",n.projects&&Object.keys(n.projects).length>0?`Projects: ${JSON.stringify(n.projects)}`:""].filter(Boolean).join(`
|
|
17
|
+
`),stats:{sessions:n.total_sessions,totalMessages:n.total_messages,totalHours:n.total_duration_hours,toolCounts:n.tool_counts,goalCounts:n.goal_categories,frictionCounts:n.friction}}}catch{return null}}y(H,"buildDataSummaryFromApi");export{Z as a,F as b};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import{g as p}from"./chunk-B3BHB26P.js";import{a as s}from"./chunk-ZLLER3HP.js";var f="<RATIONALE>",m="</RATIONALE>",l="<PROPOSED_INSTRUCTION>",c="</PROPOSED_INSTRUCTION>",h=.5,u=3;function g(e){let t=e.immutableSections.length>0?e.immutableSections.map(n=>` - ${n}`).join(`
|
|
2
|
+
`):" (none)",o=e.evidence.priorDecisions.length>0?["6. You have edited this file before. The attempts are listed below with"," how each was judged. Do not re-propose an edit that was MEASURED and"," rejected: it was replayed against this exact file and did not beat it,"," so measuring it again spends the same budget for the same answer. An"," attempt marked NOT MEASURED is different \u2014 the gate stopped it before"," it earned a verdict, so whether it would have helped is still unknown."]:[];return["You are improving an AI coding assistant instruction file so that it scores","better on a fixed set of evaluation cases.","",`The file is a ${e.targetType} named "${e.targetName}".`,"","RULES","1. Return the COMPLETE new file, not a diff, not a patch, not a summary,"," and not an excerpt. Everything you omit will be DELETED from the file.","2. Preserve everything you are not deliberately changing, byte for byte.","3. Make a focused edit. You are one step in a measured loop: a small change"," that can be attributed beats a rewrite that cannot.","4. Do not edit these sections or anything nested under them \u2014 an edit that"," touches them is refused downstream and the whole proposal is wasted:",t,"5. Do not add meta-commentary about the evaluation, the loop, or this"," prompt to the file. The file is read by other agents as instructions.",...o,"","OUTPUT FORMAT \u2014 exactly this, with no text before or after:",f,"One or two sentences: what you changed and which evidence motivated it.",m,l,"The complete new file content.",c].join(`
|
|
3
|
+
`)}s(g,"buildProposerSystemPrompt");var a=s(e=>`${e>=0?"+":"-"}${Math.abs(e*100).toFixed(1)}pp`,"signedPp");function E(e){let t=/^\d{4}-\d{2}-\d{2}/.exec(e.at??"")?.[0]??"undated",o;if(e.measured){let i=e.measured;o=`MEASURED against this exact file and ${e.decision==="promote"?"ACCEPTED":"REJECTED"}: ${a(i.delta)} (CI ${a(i.ciLower)} to ${a(i.ciUpper)}, ${i.nPairs} paired cases)`}else o=`NOT MEASURED \u2014 the gate refused it, so its merit is still unknown: ${e.refusals.length>0?e.refusals.join("; "):"no reason recorded"}`;let n=[`- ${t} \u2014 ${o}`];return e.decision==="promote"&&n.push(e.applied?" The file WAS rewritten by this decision.":" Dry run: the file was NOT rewritten, so this edit is still available."),e.touched.length>0&&n.push(` Sections touched: ${e.touched.join(", ")}`),e.rationale.trim()!==""&&n.push(` You said at the time: ${e.rationale.trim()}`),n.join(`
|
|
4
|
+
`)}s(E,"describePriorDecision");function w(e){let t=e.evidence,o=["## CURRENT FILE CONTENT","",e.currentContent,""];if(t.weakest.length>0){o.push("## CASES WHERE THIS FILE CURRENTLY UNDERPERFORMS","");for(let n of t.weakest)o.push(`- ${n.name}: passes ${(n.withPassRate*100).toFixed(0)}% with the file vs ${(n.withoutPassRate*100).toFixed(0)}% without it`);o.push("")}return t.nonDiscriminating.length>0&&o.push("## CASES THAT CARRY NO SIGNAL EITHER WAY","","These score the same with and without the file. Changing the file to chase","them is unlikely to move anything.","",...t.nonDiscriminating.map(n=>`- ${n}`),""),t.priorDecisions.length>0&&o.push("## WHAT YOU ALREADY PROPOSED FOR THIS FILE, AND HOW IT WAS JUDGED","","Newest first. Every attempt listed here was made against the file above,","byte for byte. Attempts against a different version of the file are not","shown, because a verdict earned by different text says nothing about this","one.","",...t.priorDecisions.map(E),""),t.notes.length>0&&o.push("## NOTES","",...t.notes.map(n=>`- ${n}`),""),o.join(`
|
|
5
|
+
`)}s(w,"buildProposerData");function d(e,t,o){let n=e.lastIndexOf(o);if(n<0)return null;let i=e.lastIndexOf(t,n);return i<0?null:e.slice(i+t.length,n)}s(d,"between");function T(e){let t=e.split(`
|
|
6
|
+
`);for(;t.length>0&&t[0].trim()==="";)t.shift();for(;t.length>0&&t[t.length-1].trim()==="";)t.pop();if(t.length<2)return t.join(`
|
|
7
|
+
`);let o=t[0].trim(),n=t[t.length-1].trim(),i=/^(`{3,}|~{3,})[a-zA-Z0-9_-]*$/.test(o),r=/^(`{3,}|~{3,})$/.test(n);return i&&r?t.slice(1,-1).join(`
|
|
8
|
+
`):t.join(`
|
|
9
|
+
`)}s(T,"stripWrappingFence");function R(e,t){if(!e||e.trim()==="")return{ok:!1,reason:"proposer returned nothing"};let o=d(e,l,c);if(o==null)return{ok:!1,reason:`proposer reply had no ${l}\u2026${c} block`};let n=T(o).trim();if(n==="")return{ok:!1,reason:"proposed content was empty"};if(n===t.trim())return{ok:!1,reason:"proposal is identical to the current version"};let i=n.length/Math.max(1,t.trim().length);if(i<h)return{ok:!1,reason:`proposal retains only ${(i*100).toFixed(0)}% of the predecessor's length (floor ${(h*100).toFixed(0)}%) \u2014 treating it as a truncated or summarised reply rather than an edit`};if(i>u)return{ok:!1,reason:`proposal is ${i.toFixed(1)}x the predecessor's length (ceiling ${u}x) \u2014 treating it as runaway generation`};let r=(d(e,f,m)??"").trim();return{ok:!0,proposal:{candidateContent:n,rationale:r===""?"(proposer supplied no rationale)":r}}}s(R,"parseProposalResponse");async function P(e,t=16e3){let o=await p(g(e),w(e),t);return o==null?{ok:!1,reason:"no LLM backend available, or the proposer call failed"}:R(o,e.currentContent)}s(P,"proposeInstructionEdit");export{h as a,u as b,g as c,E as d,w as e,R as f,P as g};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import{f as g,g as f,h as p,i as m,j as k}from"./chunk-FAZMKMTC.js";import{a as o}from"./chunk-ZLLER3HP.js";import{existsSync as d,readFileSync as u,writeFileSync as _,copyFileSync as v,rmSync as S,statSync as P,readdirSync as x,mkdirSync as R}from"node:fs";import{join as i,dirname as $}from"node:path";import{homedir as c}from"node:os";var j=["/plugins/cache/","/plugins/marketplaces/","/node_modules/","/.git/"];function h(e){return j.some(t=>e.includes(t))}o(h,"isUnownedPath");function K(e,t){let n=i(c(),".config","rulemetric","retraction-backups",t),r=e.replace(/^\/+/,"").replace(/\//g,"__");return i(n,r)}o(K,"backupPathFor");function y(e){return e.split(`
|
|
2
|
+
`).slice(0,40).map(t=>`- ${t}`).join(`
|
|
3
|
+
`)}o(y,"shortDiff");function a(e,t,n){return{kind:e,path:t,ok:!1,refusal:n,preview:"",warnings:[]}}o(a,"refuse");function M(e){let[t,...n]=e.split("::"),r=n.join("::");if(!r)return null;switch(t){case"claude_md":return{kind:"claude_md_section",target:r};case"memory":return{kind:"memory_section",target:r};case"skill":return{kind:"skill_file",target:r};default:return null}}o(M,"pathFromContextIdentity");function F(e,t){let n=e.replace(/^skills--/,"");return[...[i(t,".claude","skills",n,"SKILL.md"),i(t,".claude","skills",`${n}.md`),i(c(),".claude","skills",n,"SKILL.md"),i(c(),".claude","skills",`${n}.md`)],...I(n)]}o(F,"candidateSkillPaths");function I(e){let t=i(c(),".claude","plugins","marketplaces");if(!d(t))return[];let n=[];try{for(let r of x(t))n.push(i(t,r,"skills",e,"SKILL.md"),i(t,r,"plugins",e,"SKILL.md"),i(t,r,"skills",`${e}.md`))}catch{}return n}o(I,"pluginSkillPaths");function O(e){switch(e.kind){case"claude_md_section":case"memory_section":case"claude_md_block":return C(e);case"skill_file":return D(e);case"settings_hook":case"mcp_server":return L(e)}}o(O,"planRetraction");function C(e){let t=e.target;if(!d(t))return a(e.kind,t,`File does not exist: ${t}`);if(h(t))return a(e.kind,t,`Refusing to edit a path this tool does not own: ${t}`);let n=u(t,"utf-8"),r=e.body?f(n,e.body):g(n,e.heading??"");if(!r.removed){let l={"not-found":"The content is not present in this file (already removed, or edited since).",ambiguous:"The content appears more than once \u2014 refusing to guess which copy the verdict was about.","would-empty-file":"Removing it would empty the file. Delete the file by hand if that is really the intent."}[r.reason??"not-found"];return a(e.kind,t,l)}let s=[];return w(t,e.cwd)||s.push("This file is not tracked by git in this repo \u2014 the timestamped backup is your only undo."),{kind:e.kind,path:t,ok:!0,preview:y(r.removedText??""),nextContent:r.content,warnings:s}}o(C,"planFileEdit");function D(e){let t=e.target.startsWith("/")?[e.target]:F(e.target,e.cwd),n=t.find(l=>d(l));if(!n)return a("skill_file",t[0]??e.target,`No local skill file found for "${e.target}". Searched:
|
|
4
|
+
${t.join(`
|
|
5
|
+
`)}`);if(h(n))return a("skill_file",n,`"${e.target}" is installed by a plugin (${n}).
|
|
6
|
+
Deleting it would be undone by the next plugin update, and the files are not ours to remove.
|
|
7
|
+
Uninstall the plugin that provides it instead.`);let r=u(n,"utf-8"),s=[];return w(n,e.cwd)||s.push("Not tracked by git \u2014 the timestamped backup is your only undo."),{kind:"skill_file",path:n,ok:!0,deletesFile:!0,preview:y(r.split(`
|
|
8
|
+
`).slice(0,20).join(`
|
|
9
|
+
`)),warnings:s}}o(D,"planSkillDelete");function L(e){let t=e.kind==="mcp_server"?[i(e.cwd,".mcp.json"),i(e.cwd,".claude","settings.json"),i(c(),".claude","settings.json")]:[i(e.cwd,".claude","settings.json"),i(c(),".claude","settings.json"),i(e.cwd,".claude","settings.local.json")];for(let n of t){if(!d(n))continue;let r;try{r=JSON.parse(u(n,"utf-8"))}catch{continue}let s=e.kind==="mcp_server"?m(r,e.target):p(r,e.target);if(!s.removed)continue;let l=k(r,s.value);return l.length>0?a(e.kind,n,`Refusing: this rewrite would drop ${l.join(", ")} from ${n}. A settings file missing these breaks Claude Code entirely.`):{kind:e.kind,path:n,ok:!0,preview:s.removedDescriptions.map(b=>`- ${b}`).join(`
|
|
10
|
+
`),nextContent:`${JSON.stringify(s.value,null,2)}
|
|
11
|
+
`,warnings:n.endsWith("settings.local.json")?["Editing settings.local.json \u2014 this file also carries the proxy env block."]:[]}}return a(e.kind,t[0],`"${e.target}" was not found in any settings file. Searched:
|
|
12
|
+
${t.join(`
|
|
13
|
+
`)}`)}o(L,"planSettingsEdit");function w(e,t){try{let n=i(t,".git");return e.startsWith(t)&&d(n)&&P(n).isDirectory()}catch{return!1}}o(w,"isGitTracked");function U(e,t){if(!e.ok)return{applied:!1,backupPath:null,error:e.refusal??"plan is not applicable"};let n=K(e.path,t);try{R($(n),{recursive:!0}),v(e.path,n)}catch(r){return{applied:!1,backupPath:null,error:`backup failed, nothing written: ${String(r)}`}}try{return e.deletesFile?S(e.path,{force:!0}):_(e.path,e.nextContent??""),{applied:!0,backupPath:n}}catch(r){return{applied:!1,backupPath:n,error:`write failed: ${String(r)}`}}}o(U,"applyRetraction");export{K as a,M as b,F as c,O as d,U as e};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as v,b as u,e as y,g as d}from"../../chunk-IQCE4VBP.js";import{a as h}from"../../chunk-
|
|
1
|
+
import{a as v,b as u,e as y,g as d}from"../../chunk-IQCE4VBP.js";import{a as h}from"../../chunk-LWI5K6T4.js";import"../../chunk-IZTIYR5Q.js";import"../../chunk-6VKQT2J3.js";import"../../chunk-NIRD7ETU.js";import"../../chunk-QY3UKLDE.js";import"../../chunk-3AV3GTMP.js";import"../../chunk-KLEF5D3A.js";import"../../chunk-JZ5Z2BRO.js";import{a as p}from"../../chunk-ZLLER3HP.js";import{Args as k,Flags as o}from"@oclif/core";import{existsSync as T}from"node:fs";import{homedir as P}from"node:os";import{join as I}from"node:path";var A=I(P(),".gemini","antigravity-ide","brain"),g=class x extends h{static{p(this,"AntigravityBackfill")}static description="Backfill historical events from an Antigravity conversation transcript into a RuleMetric session. Useful for seeding a conversation that existed before hooks were installed \u2014 the live hook intentionally only captures forward.";static examples=["<%= config.bin %> antigravity backfill 26fd215d-f43b-4ea5-b177-dc2c0e696f97 --session 158db9aa-68ee-43fc-961b-f3a180578694","<%= config.bin %> antigravity backfill 26fd215d-f43b-4ea5-b177-dc2c0e696f97 --dry-run"];static args={conversationId:k.string({description:"Antigravity conversationId (UUID) \u2014 the directory name under ~/.gemini/antigravity-ide/brain/",required:!0})};static flags={session:o.string({char:"s",description:"RuleMetric session UUID to POST events into. If omitted, resolved from the hook tmp file ($TMPDIR/rulemetric/<conversationId>) \u2014 fails if neither is present."}),transcript:o.string({description:"Path to the transcript.jsonl file. Defaults to ~/.gemini/antigravity-ide/brain/<conversationId>/.system_generated/logs/transcript.jsonl"}),"after-step":o.integer({description:"Only emit records with step_index > this value. Default: read from existing state file, else -1 (everything)."}),limit:o.integer({description:"Cap on the number of records to process this run."}),"dry-run":o.boolean({default:!1,description:"Classify records without POSTing. Reports counts only."}),"save-state":o.boolean({default:!0,allowNo:!0,description:"After backfill, persist the highest step_index so the live hook resumes from there."})};async run(){let{args:b,flags:e}=await this.parse(x),t=b.conversationId;d.loadEnvFile(),process.env.RULEMETRIC_API_URL||this.error("RULEMETRIC_API_URL is not set. Configure it via env or ~/.config/rulemetric/env.");let l=e.transcript??I(A,t,".system_generated","logs","transcript.jsonl");T(l)||this.error(`Transcript not found: ${l}`);let m=e.session??d.resolveRwSessionId(t);m||this.error(`No RuleMetric session resolved. Pass --session <uuid>, or run the Antigravity hook at least once so $TMPDIR/rulemetric/${t} is populated.`);let n=e["after-step"];n===void 0&&(n=d.load(t)?.lastStepIdx??-1);let i=v(l,n);e.limit!==void 0&&i.length>e.limit&&(i=i.slice(0,e.limit));let R=u(l);if(this.log(`Conversation ${t}: transcript max step = ${R}, after-step = ${n}, records to process = ${i.length}`),i.length===0){this.log("Nothing to backfill.");return}if(e["dry-run"]){let r=0,a=0,c={};for(let S of i){let f=(await import("../../lib/antigravity-transcript.js")).classifyRecord(S,0);f?(r++,c[f.eventType]=(c[f.eventType]??0)+1):a++}this.log(`Dry run: would emit ${r}, skip ${a}. By eventType: ${JSON.stringify(c)}`);return}let w=Date.now(),s=await y(i,m,t,n,{onProgress:p(({attempted:r,total:a})=>{(r%100===0||r===a)&&process.stderr.write(` \u2026${r}/${a}
|
|
2
2
|
`)},"onProgress")}),$=((Date.now()-w)/1e3).toFixed(1);this.log(`Backfill complete in ${$}s. attempted=${s.attempted} emitted=${s.emitted} skipped=${s.skipped} failed=${s.failed} highestStepIdx=${s.highestStepIdx}`),e["save-state"]?(d.save(t,{lastStepIdx:s.highestStepIdx}),this.log(`State saved \u2192 live hook will resume from step_index > ${s.highestStepIdx}.`)):this.log("State NOT saved (--no-save-state). Live hook will re-emit any new records from after-step.")}};export{g as default};
|