@rulemetric/cli 0.7.4 → 0.7.5

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.
Files changed (163) hide show
  1. package/README.md +10 -8
  2. package/dist/base-command.js +1 -1
  3. package/dist/{chunk-O7ZMHCMG.js → chunk-2JRDG4LJ.js} +14 -14
  4. package/dist/chunk-2WLVDSAP.js +2 -0
  5. package/dist/{chunk-F2VP4B4J.js → chunk-32EEBARV.js} +1 -1
  6. package/dist/chunk-43YBXX7R.js +1 -0
  7. package/dist/{chunk-HOHD5HY2.js → chunk-AYUJY37O.js} +1 -1
  8. package/dist/{chunk-VAFAH6QL.js → chunk-DCLWFGEA.js} +1 -1
  9. package/dist/{chunk-IY5NXR3N.js → chunk-DPFNJZUO.js} +1 -1
  10. package/dist/chunk-G63KMH6U.js +1 -0
  11. package/dist/{chunk-T3W5N3BP.js → chunk-G6XGDHGC.js} +1 -1
  12. package/dist/{chunk-TIQ7DQ3M.js → chunk-H2ORWIEY.js} +1 -1
  13. package/dist/chunk-H4SV7FN4.js +1 -0
  14. package/dist/chunk-HS7X43XE.js +24 -0
  15. package/dist/{chunk-Y65CSJFF.js → chunk-JAPCCEKF.js} +1 -1
  16. package/dist/chunk-JQTGQXUX.js +1 -0
  17. package/dist/{chunk-V5QFOF4F.js → chunk-KAF3CYRW.js} +1 -1
  18. package/dist/{chunk-EUHNCVJQ.js → chunk-KV325CXF.js} +3 -3
  19. package/dist/{chunk-FHVBTDBM.js → chunk-N7TGRFVZ.js} +13 -12
  20. package/dist/{chunk-I4YJ7NTX.js → chunk-NEACEHQD.js} +1 -1
  21. package/dist/chunk-O2SDD2WW.js +1 -0
  22. package/dist/chunk-O6C2UGBY.js +7 -0
  23. package/dist/chunk-PPKPCXJD.js +4 -0
  24. package/dist/{chunk-VWEXKDWG.js → chunk-QFVGUZDO.js} +1 -1
  25. package/dist/{chunk-VMWY7KHH.js → chunk-RDET7CKR.js} +1 -1
  26. package/dist/chunk-RQ424GI6.js +5 -0
  27. package/dist/{chunk-PZS2KOU7.js → chunk-TIOKY2IA.js} +1 -1
  28. package/dist/chunk-TQMG647B.js +15 -0
  29. package/dist/{chunk-WJUQBMTF.js → chunk-U6ABMRT3.js} +1 -1
  30. package/dist/chunk-U6XEU573.js +1 -0
  31. package/dist/{chunk-CRAKDQ4H.js → chunk-V44SRRYR.js} +1 -1
  32. package/dist/{chunk-7XQ4VPLC.js → chunk-VAXRCSSH.js} +1 -1
  33. package/dist/{chunk-WPJ2BND4.js → chunk-VLOX6KOM.js} +1 -1
  34. package/dist/chunk-W2MOTOQE.js +1 -0
  35. package/dist/chunk-XICLXXRH.js +1 -0
  36. package/dist/{chunk-2UC3ULIG.js → chunk-XXDZJ6YI.js} +1 -1
  37. package/dist/{chunk-SBILN45P.js → chunk-ZR3MUNLS.js} +1 -1
  38. package/dist/commands/antigravity/backfill.js +1 -1
  39. package/dist/commands/auth/create-key.js +1 -1
  40. package/dist/commands/auth/login.js +1 -1
  41. package/dist/commands/auth/logout.js +1 -1
  42. package/dist/commands/auth/revoke-key.js +4 -1
  43. package/dist/commands/auth/signup.js +1 -1
  44. package/dist/commands/auth/status.js +1 -1
  45. package/dist/commands/catalog/index.js +1 -1
  46. package/dist/commands/catalog/recommend.js +1 -1
  47. package/dist/commands/convert.js +1 -1
  48. package/dist/commands/converters.js +1 -1
  49. package/dist/commands/crons/list.js +1 -1
  50. package/dist/commands/crons/run.js +1 -1
  51. package/dist/commands/dashboard.js +1 -1
  52. package/dist/commands/diagnostics.js +1 -1
  53. package/dist/commands/eval-targets/create.js +1 -1
  54. package/dist/commands/eval-targets/list.js +1 -1
  55. package/dist/commands/evals/agent.js +1 -1
  56. package/dist/commands/evals/benchmark.js +1 -1
  57. package/dist/commands/evals/compare.js +1 -1
  58. package/dist/commands/evals/create.js +1 -1
  59. package/dist/commands/evals/optimize-description.js +15 -15
  60. package/dist/commands/evals/optimize.js +5 -5
  61. package/dist/commands/evals/run.js +1 -1
  62. package/dist/commands/gateway/ensure.js +1 -1
  63. package/dist/commands/hooks/install.js +1 -1
  64. package/dist/commands/hooks/run.js +1 -1
  65. package/dist/commands/hooks/uninstall.js +1 -1
  66. package/dist/commands/import.js +1 -1
  67. package/dist/commands/instructions/create.js +1 -1
  68. package/dist/commands/instructions/delete.js +1 -1
  69. package/dist/commands/instructions/fork.js +1 -1
  70. package/dist/commands/instructions/get.js +1 -1
  71. package/dist/commands/instructions/list.js +1 -1
  72. package/dist/commands/instructions/promote.js +1 -1
  73. package/dist/commands/instructions/pull.js +1 -1
  74. package/dist/commands/instructions/upstream.js +1 -1
  75. package/dist/commands/instructions/versions.js +1 -1
  76. package/dist/commands/launcher.js +1 -1
  77. package/dist/commands/org/current.js +1 -1
  78. package/dist/commands/org/list.js +1 -1
  79. package/dist/commands/org/switch.js +1 -1
  80. package/dist/commands/packs/add-instruction.js +1 -1
  81. package/dist/commands/packs/apply.js +1 -1
  82. package/dist/commands/packs/create.js +1 -1
  83. package/dist/commands/packs/fork.js +1 -1
  84. package/dist/commands/packs/get.js +1 -1
  85. package/dist/commands/packs/list.js +1 -1
  86. package/dist/commands/packs/remove-instruction.js +1 -1
  87. package/dist/commands/proxy/env.js +1 -1
  88. package/dist/commands/proxy/logs.js +1 -1
  89. package/dist/commands/proxy/restart.js +1 -1
  90. package/dist/commands/proxy/setup.js +13 -11
  91. package/dist/commands/proxy/start.js +1 -1
  92. package/dist/commands/proxy/status.js +1 -1
  93. package/dist/commands/proxy/stop.js +1 -1
  94. package/dist/commands/research/backfill.js +1 -1
  95. package/dist/commands/research/tail-transcript.js +1 -1
  96. package/dist/commands/service/install.js +5 -5
  97. package/dist/commands/service/status.js +1 -1
  98. package/dist/commands/service/uninstall.js +1 -1
  99. package/dist/commands/sessions/analyze.js +1 -3
  100. package/dist/commands/sessions/end.js +2 -2
  101. package/dist/commands/sessions/import.js +1 -1
  102. package/dist/commands/sessions/list.js +1 -1
  103. package/dist/commands/sessions/start.js +1 -1
  104. package/dist/commands/setup.js +1 -1
  105. package/dist/commands/skills/export-approved.js +1 -1
  106. package/dist/commands/skills/install.js +1 -1
  107. package/dist/commands/skills/list.js +1 -1
  108. package/dist/commands/skills/publish.js +1 -1
  109. package/dist/commands/skills/search.js +1 -1
  110. package/dist/commands/skills/update.js +1 -1
  111. package/dist/commands/suggestions/accept.js +3 -3
  112. package/dist/commands/suggestions/dismiss.js +1 -1
  113. package/dist/commands/suggestions/list.js +2 -1
  114. package/dist/commands/suggestions/refresh.js +1 -1
  115. package/dist/dashboard/Dashboard.js +1 -1
  116. package/dist/dashboard/data.js +1 -1
  117. package/dist/dashboard/launcher/LauncherOverlay.js +1 -1
  118. package/dist/dashboard/launcher/api.js +1 -1
  119. package/dist/dashboard/launcher/useLaunchJobs.js +1 -1
  120. package/dist/dashboard/panels/insights.js +1 -1
  121. package/dist/lib/active-org-refresh.js +1 -1
  122. package/dist/lib/agent-loop.js +1 -1
  123. package/dist/lib/antigravity-transcript.js +1 -1
  124. package/dist/lib/api-client.js +1 -1
  125. package/dist/lib/auth.js +1 -1
  126. package/dist/lib/editor-proxy-pins.js +1 -1
  127. package/dist/lib/ensure-api-key.js +1 -1
  128. package/dist/lib/ensure-fresh-token.js +1 -0
  129. package/dist/lib/eval-benchmark.js +1 -1
  130. package/dist/lib/eval-conversation-handler.js +1 -1
  131. package/dist/lib/eval-trigger-tester.js +1 -1
  132. package/dist/lib/handlers/cron-refresh-pricing.js +1 -1
  133. package/dist/lib/handlers/cron-suggest-instructions.js +1 -1
  134. package/dist/lib/handlers/process-announcement.js +1 -1
  135. package/dist/lib/handlers/process-changelog.js +1 -1
  136. package/dist/lib/handlers/process-conversation.js +1 -1
  137. package/dist/lib/handlers/process-eval.js +1 -1
  138. package/dist/lib/handlers/process-insights.js +1 -1
  139. package/dist/lib/handlers/process-launch.js +1 -1
  140. package/dist/lib/handlers/process-run-cleanup.js +1 -1
  141. package/dist/lib/handlers/process-session-goal.js +1 -1
  142. package/dist/lib/hooks-config.js +1 -1
  143. package/dist/lib/insights-prompts.js +1 -1
  144. package/dist/lib/manual-tasks.js +1 -1
  145. package/dist/lib/research-client.js +1 -1
  146. package/dist/lib/setup-steps.js +1 -1
  147. package/dist/lib/telemetry.js +1 -1
  148. package/dist/lib/terminal-target-heartbeat.js +1 -1
  149. package/oclif.manifest.json +145 -167
  150. package/package.json +7 -7
  151. package/dist/chunk-72XLQE3X.js +0 -2
  152. package/dist/chunk-AHRHCERJ.js +0 -1
  153. package/dist/chunk-DT4GKEP5.js +0 -5
  154. package/dist/chunk-E4SFUPYR.js +0 -15
  155. package/dist/chunk-FEHM5OKW.js +0 -1
  156. package/dist/chunk-HP2BUPGS.js +0 -24
  157. package/dist/chunk-LQRYQE6Q.js +0 -4
  158. package/dist/chunk-M6AJDVCL.js +0 -5
  159. package/dist/chunk-ML36XQW7.js +0 -1
  160. package/dist/chunk-NVOTOQBA.js +0 -1
  161. package/dist/chunk-RTEATXTP.js +0 -1
  162. package/dist/chunk-RVO4HV3M.js +0 -1
  163. package/dist/chunk-WJ3H73G6.js +0 -1
package/README.md CHANGED
@@ -8,7 +8,7 @@ user-management release) organizations.
8
8
  ```bash
9
9
  rulemetric auth login # interactive — writes ~/.config/rulemetric/env
10
10
  rulemetric auth create-key # generate a long-lived API key
11
- rulemetric auth whoami # print the current user
11
+ rulemetric auth status # show the current auth state (email / API key)
12
12
  ```
13
13
 
14
14
  Credentials are read from (first match wins):
@@ -25,14 +25,14 @@ active org is set will stamp `sessions.org_id` to that org.
25
25
 
26
26
  ```bash
27
27
  rulemetric org list # list orgs you belong to; star marks the active one
28
- rulemetric org current # print the active org's slug, name, and role
28
+ rulemetric org current # print the active org's slug and id
29
29
  rulemetric org switch <slug> # set the active org (cached locally)
30
30
  rulemetric org switch --clear # clear the active org (back to personal mode)
31
31
  ```
32
32
 
33
33
  **Active-org resolution order:**
34
34
  1. `RULEMETRIC_ORG_ID` environment variable (process-scoped override)
35
- 2. Local cache at `~/.config/rulemetric/active-org.json` (written by
35
+ 2. Local cache at `~/.config/rulemetric/active-org` (written by
36
36
  `rulemetric org switch`)
37
37
  3. None (sessions captured without an org_id)
38
38
 
@@ -45,15 +45,17 @@ the active org in the web UI, which the CLI cache picks up).
45
45
 
46
46
  ## Other top-level commands
47
47
 
48
- - `rulemetric instructions ...` — list, get, create, edit, push, pull
48
+ - `rulemetric instructions ...` — list, get, create, delete, fork, promote, pull, upstream, versions
49
49
  - `rulemetric convert ...` — format conversion (25+ formats)
50
50
  - `rulemetric import ...` — bulk import from a project tree
51
- - `rulemetric sessions ...` — list/get/import sessions
52
- - `rulemetric evals ...` — eval target/case/run/optimize commands
53
- - `rulemetric insights sync|generate` — push local session-meta + facets up
51
+ - `rulemetric sessions ...` — list, start, end, import, analyze
52
+ - `rulemetric evals ...` — eval target/case/run/optimize commands + `agent` (background worker)
54
53
  - `rulemetric hooks install|uninstall|run <name>` — manage tool hook scripts
55
54
  - `rulemetric proxy ...` — start/stop the mitmproxy capture layer
56
- - `rulemetric service install|uninstall` — launchd services for API + worker
55
+ - `rulemetric service install|status|uninstall` — background services (`--worker-only` installs just the worker)
56
+
57
+ Session insights are enriched automatically (hooks + the background worker) —
58
+ there is no manual `insights` command.
57
59
 
58
60
  ## Tests
59
61
 
@@ -1 +1 @@
1
- import{a}from"./chunk-LQRYQE6Q.js";import"./chunk-IZTIYR5Q.js";import"./chunk-CRAKDQ4H.js";import"./chunk-WPJ2BND4.js";import"./chunk-3AV3GTMP.js";import"./chunk-TIQ7DQ3M.js";import"./chunk-M6AJDVCL.js";import"./chunk-ZLLER3HP.js";export{a as BaseCommand};
1
+ import{a}from"./chunk-PPKPCXJD.js";import"./chunk-IZTIYR5Q.js";import"./chunk-V44SRRYR.js";import"./chunk-U6XEU573.js";import"./chunk-VLOX6KOM.js";import"./chunk-3AV3GTMP.js";import"./chunk-H2ORWIEY.js";import"./chunk-O6C2UGBY.js";import"./chunk-ZLLER3HP.js";export{a as BaseCommand};
@@ -1,11 +1,11 @@
1
- import{f as x}from"./chunk-I2DZGJRR.js";import{a as r}from"./chunk-ZLLER3HP.js";import{execSync as h}from"node:child_process";import{existsSync as c,mkdirSync as y,readFileSync as d,writeFileSync as a,unlinkSync as v,copyFileSync as _}from"node:fs";import{homedir as f}from"node:os";import{join as i,dirname as $}from"node:path";function q(e){let t=["claude_code"];return c(i(e,".cursor"))&&t.push("cursor"),c(i(e,".github"))&&t.push("copilot_agent"),c(i(e,".agents"))&&t.push("antigravity"),t}r(q,"detectInstalledTools");function N(e){let t=e?`PATH="${e}:$PATH" `:"",o=r(n=>({command:`${t}rulemetric hooks run ${n}`}),"cmd");return{version:1,hooks:{sessionStart:[o("session-start")],beforeSubmitPrompt:[o("user-prompt")],afterFileEdit:[o("post-tool-use")],beforeShellExecution:[o("post-tool-use")],afterShellExecution:[o("post-tool-use")],beforeMCPExecution:[o("post-tool-use")],afterMCPExecution:[o("post-tool-use")],afterAgentResponse:[o("assistant-response")],stop:[o("post-tool-use")],sessionEnd:[o("session-end")]}}}r(N,"generateCursorHooksConfig");function L(e){let t=e?`PATH="${e}:$PATH" `:"",o=r(n=>({type:"command",bash:`${t}rulemetric hooks run ${n}`}),"cmd");return{version:1,hooks:{sessionStart:[o("session-start")],userPromptSubmitted:[o("user-prompt")],postToolUse:[o("post-tool-use")],sessionEnd:[o("session-end")]}}}r(L,"generateCopilotHooksConfig");function B(e){let t=e?`PATH="${e}:$PATH" `:"",o=r(n=>({type:"command",command:`${t}rulemetric hooks run ${n}`}),"mk");return{SessionStart:[{hooks:[o("session-start")]}],UserPromptSubmit:[{hooks:[o("user-prompt")]}],PostToolUse:[{matcher:".*",hooks:[o("post-tool-use")]}],Stop:[{hooks:[o("assistant-response")]}],SessionEnd:[{hooks:[o("session-end")]}]}}r(B,"generateClaudeCodeHooksConfig");function J(e){if(!c(e))return{settings:{},recoveredBackup:null};let t=d(e,"utf-8");try{return{settings:JSON.parse(t),recoveredBackup:null}}catch{let o=`${e}.corrupt.bak`;return a(o,t),{settings:{},recoveredBackup:o}}}r(J,"readClaudeSettings");function b(e,t){y($(e),{recursive:!0});let o=null;return c(e)&&(o=`${e}.bak`,_(e,o)),a(e,JSON.stringify(t,null,2)+`
2
- `),{backupPath:o}}r(b,"writeClaudeSettingsWithBackup");function k(e){if(!c(e))return{};let t=d(e,"utf-8");try{return JSON.parse(t)}catch{try{a(`${e}.corrupt.bak`,t)}catch{}return null}}r(k,"readMergeableJson");function Q(e,t){let o=B(t),n=e.hooks??{};for(let[s,u]of Object.entries(o)){let l=n[s]??[];l.some(m=>m?.hooks?.some(p=>typeof p?.command=="string"&&p.command.includes("rulemetric")))||(n[s]=[...l,...u])}e.hooks=n}r(Q,"mergeClaudeCodeHooks");function Z(e){if(!e.hooks||typeof e.hooks!="object")return!1;let t=e.hooks;return Object.values(t).some(o=>Array.isArray(o)&&o.some(n=>n?.hooks?.some(s=>typeof s?.command=="string"&&s.command.includes("rulemetric"))))}r(Z,"hasRulemetricClaudeHooks");function D(e){if(!e.hooks||typeof e.hooks!="object")return!1;let t=e.hooks,o=0;for(let n of Object.keys(t)){let s=t[n];if(!Array.isArray(s))continue;let u=s.filter(l=>{let g=l?.hooks?.some(m=>typeof m?.command=="string"&&m.command.includes("rulemetric"));return g&&(o+=1),!g});u.length===0?delete t[n]:t[n]=u}return Object.keys(t).length===0&&delete e.hooks,o>0}r(D,"removeClaudeCodeHooks");var X="localhost,127.0.0.1,*.supabase.co,*.supabase.in";function tt(e,t){return i(e,t?"settings.json":"settings.local.json")}r(tt,"claudeSettingsInstallPath");function M(e,t){let o=e.env;if(!o||typeof o!="object")return!1;let n=!1,s=o.HTTPS_PROXY;(s===`http://localhost:${t}`||s===`http://127.0.0.1:${t}`)&&(delete o.HTTPS_PROXY,n=!0),o.NO_PROXY===X&&(delete o.NO_PROXY,n=!0);let u=o.NODE_EXTRA_CA_CERTS;return typeof u=="string"&&u.includes(".mitmproxy")&&u.endsWith("mitmproxy-ca-cert.pem")&&(delete o.NODE_EXTRA_CA_CERTS,n=!0),n&&Object.keys(o).length===0&&delete e.env,n}r(M,"removeRulemetricProxyEnv");function C(e,t){let o=D(e),n=M(e,t),s=x(e);return{removedHooks:o,removedProxyEnv:n,removedStatusline:s,removed:o||n||s}}r(C,"removeRulemetricMachineState");function et(e,t){let o={migrated:!1,backupPath:null,removedHooks:!1,removedProxyEnv:!1,removedStatusline:!1,removed:!1};if(!c(e))return o;let n;try{n=JSON.parse(d(e,"utf-8"))}catch{return o}let s=C(n,t);if(!s.removed)return o;let{backupPath:u}=b(e,n);return{...s,migrated:!0,backupPath:u}}r(et,"migrateSharedClaudeSettings");function ot(e,t){let o=[];for(let n of["settings.json","settings.local.json"]){let s=i(e,n);if(!c(s))continue;let{settings:u,recoveredBackup:l}=J(s),g=C(u,t);g.removed&&b(s,u),o.push({...g,configPath:s,fileName:n,recoveredBackup:l,changed:g.removed})}return o}r(ot,"cleanClaudeSettingsFiles");function R(e,t){if(!c(e))return null;let o=i(e,"hooks.json"),n=N(t),s=k(o);if(s===null)return null;let u=s,l={...u.hooks??{}},g=r(p=>typeof p=="object"&&p!==null&&"command"in p&&typeof p.command=="string"&&p.command.includes("rulemetric"),"isRulemetricHook");for(let[p,w]of Object.entries(n.hooks)){let j=(l[p]??[]).filter(U=>!g(U));l[p]=[...j,...w]}let m={version:u.version??n.version,hooks:l};return a(o,JSON.stringify(m,null,2)+`
3
- `),o}r(R,"writeCursorHooksToDir");function nt(e,t){return R(i(e,".cursor"),t)}r(nt,"writeCursorHooks");function rt(e,t=f()){let o=i(t,".cursor");return c(o)?R(o,e):null}r(rt,"writeCursorUserHooks");function st(e,t){let o=i(e,".github");if(!c(o))return null;let n=i(o,"hooks");y(n,{recursive:!0});let s=i(n,"rulemetric.json"),u=L(t);return a(s,JSON.stringify(u,null,2)+`
4
- `),s}r(st,"writeCopilotHooks");function A(e){if(!c(e))return!1;let t;try{t=JSON.parse(d(e,"utf-8"))}catch{return!1}if(!t.hooks)return!1;let o=!1;for(let[n,s]of Object.entries(t.hooks)){let u=s.filter(l=>{if(typeof l!="object"||l===null||!("command"in l))return!0;let g=l.command;return typeof g=="string"&&g.includes("rulemetric")?(o=!0,!1):!0});u.length===0?delete t.hooks[n]:t.hooks[n]=u}return o&&a(e,JSON.stringify(t,null,2)+`
5
- `),o}r(A,"removeCursorHooksFromFile");function it(e){return A(i(e,".cursor","hooks.json"))}r(it,"removeCursorHooks");function ut(){return A(i(f(),".cursor","hooks.json"))}r(ut,"removeCursorUserHooks");function ct(e,t,o){let n=i(e,".cursor");if(!c(n))return!1;let s=i(n,"settings.json"),u=k(s);return u===null?!1:(u["http.proxy"]=`http://localhost:${t}`,u["http.proxyStrictSSL"]=c(o),a(s,JSON.stringify(u,null,2)+`
1
+ import{f as x}from"./chunk-I2DZGJRR.js";import{a as r}from"./chunk-ZLLER3HP.js";import{execSync as h}from"node:child_process";import{existsSync as c,mkdirSync as y,readFileSync as p,writeFileSync as a,unlinkSync as S,copyFileSync as $}from"node:fs";import{homedir as d}from"node:os";import{join as i,dirname as N}from"node:path";function q(e){let t=["claude_code"];return c(i(e,".cursor"))&&t.push("cursor"),c(i(e,".github"))&&t.push("copilot_agent"),c(i(e,".agents"))&&t.push("antigravity"),t}r(q,"detectInstalledTools");function U(e){let t=e?`PATH="${e}:$PATH" `:"",o=r(n=>({command:`${t}rulemetric hooks run ${n}`}),"cmd");return{version:1,hooks:{sessionStart:[o("session-start")],beforeSubmitPrompt:[o("user-prompt")],afterFileEdit:[o("post-tool-use")],beforeShellExecution:[o("post-tool-use")],afterShellExecution:[o("post-tool-use")],beforeMCPExecution:[o("post-tool-use")],afterMCPExecution:[o("post-tool-use")],afterAgentResponse:[o("assistant-response")],stop:[o("post-tool-use")],sessionEnd:[o("session-end")]}}}r(U,"generateCursorHooksConfig");function L(e){let t=e?`PATH="${e}:$PATH" `:"",o=r(n=>({type:"command",bash:`${t}rulemetric hooks run ${n}`}),"cmd");return{version:1,hooks:{sessionStart:[o("session-start")],userPromptSubmitted:[o("user-prompt")],postToolUse:[o("post-tool-use")],sessionEnd:[o("session-end")]}}}r(L,"generateCopilotHooksConfig");function B(e){let t=e?`PATH="${e}:$PATH" `:"",o=r(n=>({type:"command",command:`${t}rulemetric hooks run ${n}`}),"mk");return{SessionStart:[{hooks:[o("session-start")]}],UserPromptSubmit:[{hooks:[o("user-prompt")]}],PostToolUse:[{matcher:".*",hooks:[o("post-tool-use")]}],SessionEnd:[{hooks:[o("session-end")]}]}}r(B,"generateClaudeCodeHooksConfig");function J(e){if(!c(e))return{settings:{},recoveredBackup:null};let t=p(e,"utf-8");try{return{settings:JSON.parse(t),recoveredBackup:null}}catch{let o=`${e}.corrupt.bak`;return a(o,t),{settings:{},recoveredBackup:o}}}r(J,"readClaudeSettings");function b(e,t){y(N(e),{recursive:!0});let o=null;return c(e)&&(o=`${e}.bak`,$(e,o)),a(e,JSON.stringify(t,null,2)+`
2
+ `),{backupPath:o}}r(b,"writeClaudeSettingsWithBackup");function k(e){if(!c(e))return{};let t=p(e,"utf-8");try{return JSON.parse(t)}catch{try{a(`${e}.corrupt.bak`,t)}catch{}return null}}r(k,"readMergeableJson");function Q(e,t){let o=B(t),n=e.hooks??{};for(let[s,u]of Object.entries(o)){let l=n[s]??[];l.some(m=>m?.hooks?.some(f=>typeof f?.command=="string"&&f.command.includes("rulemetric")))||(n[s]=[...l,...u])}e.hooks=n}r(Q,"mergeClaudeCodeHooks");function Z(e){if(!e.hooks||typeof e.hooks!="object")return!1;let t=e.hooks;return Object.values(t).some(o=>Array.isArray(o)&&o.some(n=>n?.hooks?.some(s=>typeof s?.command=="string"&&s.command.includes("rulemetric"))))}r(Z,"hasRulemetricClaudeHooks");function D(e){if(!e.hooks||typeof e.hooks!="object")return!1;let t=e.hooks,o=0;for(let n of Object.keys(t)){let s=t[n];if(!Array.isArray(s))continue;let u=s.filter(l=>{let g=l?.hooks?.some(m=>typeof m?.command=="string"&&m.command.includes("rulemetric"));return g&&(o+=1),!g});u.length===0?delete t[n]:t[n]=u}return Object.keys(t).length===0&&delete e.hooks,o>0}r(D,"removeClaudeCodeHooks");var X="localhost,127.0.0.1,*.supabase.co,*.supabase.in";function tt(e,t){return i(e,t?"settings.json":"settings.local.json")}r(tt,"claudeSettingsInstallPath");function M(e,t){let o=e.env;if(!o||typeof o!="object")return!1;let n=!1,s=o.HTTPS_PROXY;(s===`http://localhost:${t}`||s===`http://127.0.0.1:${t}`)&&(delete o.HTTPS_PROXY,n=!0),o.NO_PROXY===X&&(delete o.NO_PROXY,n=!0);let u=o.NODE_EXTRA_CA_CERTS;return typeof u=="string"&&u.includes(".mitmproxy")&&u.endsWith("mitmproxy-ca-cert.pem")&&(delete o.NODE_EXTRA_CA_CERTS,n=!0),n&&Object.keys(o).length===0&&delete e.env,n}r(M,"removeRulemetricProxyEnv");function C(e,t){let o=D(e),n=M(e,t),s=x(e);return{removedHooks:o,removedProxyEnv:n,removedStatusline:s,removed:o||n||s}}r(C,"removeRulemetricMachineState");function et(e,t){let o={migrated:!1,backupPath:null,removedHooks:!1,removedProxyEnv:!1,removedStatusline:!1,removed:!1};if(!c(e))return o;let n;try{n=JSON.parse(p(e,"utf-8"))}catch{return o}let s=C(n,t);if(!s.removed)return o;let{backupPath:u}=b(e,n);return{...s,migrated:!0,backupPath:u}}r(et,"migrateSharedClaudeSettings");function ot(e,t){let o=[];for(let n of["settings.json","settings.local.json"]){let s=i(e,n);if(!c(s))continue;let{settings:u,recoveredBackup:l}=J(s),g=C(u,t);g.removed&&b(s,u),o.push({...g,configPath:s,fileName:n,recoveredBackup:l,changed:g.removed})}return o}r(ot,"cleanClaudeSettingsFiles");function R(e,t){if(!c(e))return null;let o=i(e,"hooks.json"),n=U(t),s=k(o);if(s===null)return null;let u=s,l={...u.hooks??{}},g=r(f=>typeof f=="object"&&f!==null&&"command"in f&&typeof f.command=="string"&&f.command.includes("rulemetric"),"isRulemetricHook");for(let[f,w]of Object.entries(n.hooks)){let j=(l[f]??[]).filter(_=>!g(_));l[f]=[...j,...w]}let m={version:u.version??n.version,hooks:l};return a(o,JSON.stringify(m,null,2)+`
3
+ `),o}r(R,"writeCursorHooksToDir");function nt(e,t){return R(i(e,".cursor"),t)}r(nt,"writeCursorHooks");function rt(e,t=d()){let o=i(t,".cursor");return c(o)?R(o,e):null}r(rt,"writeCursorUserHooks");function st(e,t){let o=i(e,".github");if(!c(o))return null;let n=i(o,"hooks");y(n,{recursive:!0});let s=i(n,"rulemetric.json"),u=L(t);return a(s,JSON.stringify(u,null,2)+`
4
+ `),s}r(st,"writeCopilotHooks");function A(e){if(!c(e))return!1;let t;try{t=JSON.parse(p(e,"utf-8"))}catch{return!1}if(!t.hooks)return!1;let o=!1;for(let[n,s]of Object.entries(t.hooks)){let u=s.filter(l=>{if(typeof l!="object"||l===null||!("command"in l))return!0;let g=l.command;return typeof g=="string"&&g.includes("rulemetric")?(o=!0,!1):!0});u.length===0?delete t.hooks[n]:t.hooks[n]=u}return o&&a(e,JSON.stringify(t,null,2)+`
5
+ `),o}r(A,"removeCursorHooksFromFile");function it(e){return A(i(e,".cursor","hooks.json"))}r(it,"removeCursorHooks");function ut(){return A(i(d(),".cursor","hooks.json"))}r(ut,"removeCursorUserHooks");function ct(e,t,o){let n=i(e,".cursor");if(!c(n))return!1;let s=i(n,"settings.json"),u=k(s);return u===null?!1:(u["http.proxy"]=`http://localhost:${t}`,u["http.proxyStrictSSL"]=c(o),a(s,JSON.stringify(u,null,2)+`
6
6
  `),!0)}r(ct,"writeCursorProxyConfig");function lt(e,t,o){let n=i(e,".vscode");if(!c(n))return!1;let s=i(n,"settings.json"),u=k(s);if(u===null)return!1;u["http.proxy"]=`http://localhost:${t}`,u["http.proxyStrictSSL"]=c(o);let l=u["github.copilot.advanced"]??{};return l["debug.overrideProxyUrl"]=`http://localhost:${t}`,u["github.copilot.advanced"]=l,a(s,JSON.stringify(u,null,2)+`
7
- `),!0}r(lt,"writeVSCodeProxyConfig");function at(e){let t=i(e,".vscode","settings.json");if(!c(t))return!1;let o;try{o=JSON.parse(d(t,"utf-8"))}catch{return!1}let n=!1;o["http.proxy"]&&(delete o["http.proxy"],delete o["http.proxyStrictSSL"],n=!0);let s=o["github.copilot.advanced"];return s?.["debug.overrideProxyUrl"]&&(delete s["debug.overrideProxyUrl"],Object.keys(s).length===0&&delete o["github.copilot.advanced"],n=!0),n&&a(t,JSON.stringify(o,null,2)+`
8
- `),n}r(at,"removeVSCodeProxyConfig");function gt(e){let t=i(e,".github","hooks","rulemetric.json");return c(t)?(v(t),!0):!1}r(gt,"removeCopilotHooks");var H="com.rulemetric.env";function P(){return i(f(),"Library","LaunchAgents",`${H}.plist`)}r(P,"getLaunchAgentPath");function pt(e,t){if(process.platform!=="darwin")return!1;let o=`http://localhost:${e}`;try{h(`launchctl setenv HTTPS_PROXY ${o}`,{stdio:"pipe"}),c(t)&&h(`launchctl setenv NODE_EXTRA_CA_CERTS ${t}`,{stdio:"pipe"})}catch{return!1}let n=P(),s=i(f(),"Library","LaunchAgents");y(s,{recursive:!0});let u=c(t)?`launchctl setenv NODE_EXTRA_CA_CERTS ${t};`:"",l=`if nc -z -w 1 127.0.0.1 ${e} 2>/dev/null; then launchctl setenv HTTPS_PROXY ${o};${u} else launchctl unsetenv HTTPS_PROXY; launchctl unsetenv NODE_EXTRA_CA_CERTS; fi`,g=`<?xml version="1.0" encoding="UTF-8"?>
7
+ `),!0}r(lt,"writeVSCodeProxyConfig");function at(e){let t=i(e,".vscode","settings.json");if(!c(t))return!1;let o;try{o=JSON.parse(p(t,"utf-8"))}catch{return!1}let n=!1;o["http.proxy"]&&(delete o["http.proxy"],delete o["http.proxyStrictSSL"],n=!0);let s=o["github.copilot.advanced"];return s?.["debug.overrideProxyUrl"]&&(delete s["debug.overrideProxyUrl"],Object.keys(s).length===0&&delete o["github.copilot.advanced"],n=!0),n&&a(t,JSON.stringify(o,null,2)+`
8
+ `),n}r(at,"removeVSCodeProxyConfig");function gt(e){let t=i(e,".github","hooks","rulemetric.json");return c(t)?(S(t),!0):!1}r(gt,"removeCopilotHooks");var H="com.rulemetric.env";function P(){return i(d(),"Library","LaunchAgents",`${H}.plist`)}r(P,"getLaunchAgentPath");function ft(e,t){if(process.platform!=="darwin")return!1;let o=`http://localhost:${e}`;try{h(`launchctl setenv HTTPS_PROXY ${o}`,{stdio:"pipe"}),c(t)&&h(`launchctl setenv NODE_EXTRA_CA_CERTS ${t}`,{stdio:"pipe"})}catch{return!1}let n=P(),s=i(d(),"Library","LaunchAgents");y(s,{recursive:!0});let u=c(t)?`launchctl setenv NODE_EXTRA_CA_CERTS ${t};`:"",l=`if nc -z -w 1 127.0.0.1 ${e} 2>/dev/null; then launchctl setenv HTTPS_PROXY ${o};${u} else launchctl unsetenv HTTPS_PROXY; launchctl unsetenv NODE_EXTRA_CA_CERTS; fi`,g=`<?xml version="1.0" encoding="UTF-8"?>
9
9
  <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
10
10
  "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
11
11
  <plist version="1.0">
@@ -22,10 +22,10 @@ import{f as x}from"./chunk-I2DZGJRR.js";import{a as r}from"./chunk-ZLLER3HP.js";
22
22
  <true/>
23
23
  </dict>
24
24
  </plist>
25
- `;return a(n,g),!0}r(pt,"installMacOSProxyEnv");function ft(){if(process.platform!=="darwin")return!1;let e=!1;try{h("launchctl unsetenv HTTPS_PROXY",{stdio:"pipe"}),h("launchctl unsetenv NODE_EXTRA_CA_CERTS",{stdio:"pipe"})}catch{}let t=P();return c(t)&&(v(t),e=!0),e}r(ft,"uninstallMacOSProxyEnv");function O(){return process.platform==="darwin"?i(f(),"Library","Application Support","Code","User","settings.json"):process.platform==="win32"?i(process.env.APPDATA??"","Code","User","settings.json"):i(f(),".config","Code","User","settings.json")}r(O,"getVSCodeUserSettingsPath");function dt(e){let t=O();if(!c(i(t,"..")))return!1;let o=k(t);return o===null||o["http.proxy"]&&!o["http.proxy"].includes("localhost")?!1:(o["http.proxy"]=`http://localhost:${e}`,o["http.proxyStrictSSL"]=!1,a(t,JSON.stringify(o,null,2)+`
26
- `),!0)}r(dt,"writeVSCodeUserProxyConfig");function mt(){let e=O();if(!c(e))return!1;let t;try{t=JSON.parse(d(e,"utf-8"))}catch{return!1}return t["http.proxy"]?.includes("localhost")?(delete t["http.proxy"],delete t["http.proxyStrictSSL"],a(e,JSON.stringify(t,null,2)+`
27
- `),!0):!1}r(mt,"removeVSCodeUserProxyConfig");function T(){return process.platform==="darwin"?i(f(),"Library","Application Support","Cursor","User","settings.json"):process.platform==="win32"?i(process.env.APPDATA??"","Cursor","User","settings.json"):i(f(),".config","Cursor","User","settings.json")}r(T,"getCursorUserSettingsPath");function kt(e){let t=T();if(!c(i(t,"..")))return!1;let o=k(t);return o===null||o["http.proxy"]&&!o["http.proxy"].includes("localhost")?!1:(o["http.proxy"]=`http://localhost:${e}`,o["http.proxyStrictSSL"]=!1,a(t,JSON.stringify(o,null,2)+`
28
- `),!0)}r(kt,"writeCursorUserProxyConfig");function ht(){let e=T();if(!c(e))return!1;let t;try{t=JSON.parse(d(e,"utf-8"))}catch{return!1}return t["http.proxy"]?.includes("localhost")?(delete t["http.proxy"],delete t["http.proxyStrictSSL"],a(e,JSON.stringify(t,null,2)+`
29
- `),!0):!1}r(ht,"removeCursorUserProxyConfig");function F(){let e=process.execPath,t=process.argv[1];return t&&t.endsWith("run.js")?`${e} ${t}`:"rulemetric"}r(F,"getRulemetricCommand");function Y(){let e=F(),t=r(o=>({type:"command",command:`RULEMETRIC_HOOK_TOOL=antigravity ${e} hooks run ${o}`,timeout:30}),"mk");return{rulemetric:{enabled:!0,SessionStart:[{hooks:[t("session-start")]}],UserPromptSubmit:[{hooks:[t("user-prompt")]}],PreToolUse:[{matcher:".*",hooks:[t("post-tool-use")]}],PostToolUse:[{matcher:".*",hooks:[t("post-tool-use")]}],Stop:[{hooks:[t("assistant-response")]}],SessionEnd:[{hooks:[t("session-end")]}]}}}r(Y,"generateAntigravityHooksConfig");function E(e){let t=i(e,"hooks.json"),o=k(t);if(o===null)return null;let n=Y(),s={...o,rulemetric:n.rulemetric};return y(e,{recursive:!0}),a(t,JSON.stringify(s,null,2)+`
30
- `),t}r(E,"writeAntigravityHooksToDir");function yt(e){return E(i(e,".agents"))}r(yt,"writeAntigravityHooks");function St(e=f()){let t=i(e,".gemini");return c(t)?E(i(t,"config")):null}r(St,"writeAntigravityUserHooks");function S(e){if(!c(e))return!1;let t;try{t=JSON.parse(d(e,"utf-8"))}catch{return!1}if(!("rulemetric"in t))return!1;if(delete t.rulemetric,Object.keys(t).length===0)try{v(e)}catch{}else a(e,JSON.stringify(t,null,2)+`
31
- `);return!0}r(S,"removeAntigravityHooksFromFile");function vt(e){return S(i(e,".agents","hooks.json"))}r(vt,"removeAntigravityHooks");function xt(){let e=S(i(f(),".gemini","config","hooks.json")),t=S(i(f(),".gemini","hooks.json"));return e||t}r(xt,"removeAntigravityUserHooks");export{q as a,N as b,L as c,B as d,J as e,b as f,Q as g,Z as h,D as i,X as j,tt as k,M as l,C as m,et as n,ot as o,nt as p,rt as q,st as r,it as s,ut as t,ct as u,lt as v,at as w,gt as x,pt as y,ft as z,O as A,dt as B,mt as C,T as D,kt as E,ht as F,Y as G,yt as H,St as I,vt as J,xt as K};
25
+ `;return a(n,g),!0}r(ft,"installMacOSProxyEnv");function dt(){if(process.platform!=="darwin")return!1;let e=!1;try{h("launchctl unsetenv HTTPS_PROXY",{stdio:"pipe"}),h("launchctl unsetenv NODE_EXTRA_CA_CERTS",{stdio:"pipe"})}catch{}let t=P();return c(t)&&(S(t),e=!0),e}r(dt,"uninstallMacOSProxyEnv");function O(){return process.platform==="darwin"?i(d(),"Library","Application Support","Code","User","settings.json"):process.platform==="win32"?i(process.env.APPDATA??"","Code","User","settings.json"):i(d(),".config","Code","User","settings.json")}r(O,"getVSCodeUserSettingsPath");function pt(e){let t=O();if(!c(i(t,"..")))return!1;let o=k(t);return o===null||o["http.proxy"]&&!o["http.proxy"].includes("localhost")?!1:(o["http.proxy"]=`http://localhost:${e}`,o["http.proxyStrictSSL"]=!1,a(t,JSON.stringify(o,null,2)+`
26
+ `),!0)}r(pt,"writeVSCodeUserProxyConfig");function mt(){let e=O();if(!c(e))return!1;let t;try{t=JSON.parse(p(e,"utf-8"))}catch{return!1}return t["http.proxy"]?.includes("localhost")?(delete t["http.proxy"],delete t["http.proxyStrictSSL"],a(e,JSON.stringify(t,null,2)+`
27
+ `),!0):!1}r(mt,"removeVSCodeUserProxyConfig");function T(){return process.platform==="darwin"?i(d(),"Library","Application Support","Cursor","User","settings.json"):process.platform==="win32"?i(process.env.APPDATA??"","Cursor","User","settings.json"):i(d(),".config","Cursor","User","settings.json")}r(T,"getCursorUserSettingsPath");function kt(e){let t=T();if(!c(i(t,"..")))return!1;let o=k(t);return o===null||o["http.proxy"]&&!o["http.proxy"].includes("localhost")?!1:(o["http.proxy"]=`http://localhost:${e}`,o["http.proxyStrictSSL"]=!1,a(t,JSON.stringify(o,null,2)+`
28
+ `),!0)}r(kt,"writeCursorUserProxyConfig");function ht(){let e=T();if(!c(e))return!1;let t;try{t=JSON.parse(p(e,"utf-8"))}catch{return!1}return t["http.proxy"]?.includes("localhost")?(delete t["http.proxy"],delete t["http.proxyStrictSSL"],a(e,JSON.stringify(t,null,2)+`
29
+ `),!0):!1}r(ht,"removeCursorUserProxyConfig");function F(){let e=process.execPath,t=process.argv[1];return t&&t.endsWith("run.js")?`${e} ${t}`:"rulemetric"}r(F,"getRulemetricCommand");function Y(){let e=F(),t=r(o=>({type:"command",command:`RULEMETRIC_HOOK_TOOL=antigravity ${e} hooks run ${o}`,timeout:30}),"mk");return{rulemetric:{enabled:!0,SessionStart:[{hooks:[t("session-start")]}],PostToolUse:[{matcher:".*",hooks:[t("post-tool-use")]}],SessionEnd:[{hooks:[t("session-end")]}]}}}r(Y,"generateAntigravityHooksConfig");function E(e){let t=i(e,"hooks.json"),o=k(t);if(o===null)return null;let n=Y(),s={...o,rulemetric:n.rulemetric};return y(e,{recursive:!0}),a(t,JSON.stringify(s,null,2)+`
30
+ `),t}r(E,"writeAntigravityHooksToDir");function yt(e){return E(i(e,".agents"))}r(yt,"writeAntigravityHooks");function vt(e=d()){let t=i(e,".gemini");return c(t)?E(i(t,"config")):null}r(vt,"writeAntigravityUserHooks");function v(e){if(!c(e))return!1;let t;try{t=JSON.parse(p(e,"utf-8"))}catch{return!1}if(!("rulemetric"in t))return!1;if(delete t.rulemetric,Object.keys(t).length===0)try{S(e)}catch{}else a(e,JSON.stringify(t,null,2)+`
31
+ `);return!0}r(v,"removeAntigravityHooksFromFile");function St(e){return v(i(e,".agents","hooks.json"))}r(St,"removeAntigravityHooks");function xt(){let e=v(i(d(),".gemini","config","hooks.json")),t=v(i(d(),".gemini","hooks.json"));return e||t}r(xt,"removeAntigravityUserHooks");export{q as a,U as b,L as c,B as d,J as e,b as f,Q as g,Z as h,D as i,X as j,tt as k,M as l,C as m,et as n,ot as o,nt as p,rt as q,st as r,it as s,ut as t,ct as u,lt as v,at as w,gt as x,ft as y,dt as z,O as A,pt as B,mt as C,T as D,kt as E,ht as F,Y as G,yt as H,vt as I,St as J,xt as K};
@@ -0,0 +1,2 @@
1
+ import{b as B}from"./chunk-N7TGRFVZ.js";import{a as v,e as d,f as n,g as m,h as U}from"./chunk-H4SV7FN4.js";import{a as R}from"./chunk-5RBLIVBF.js";import{a as $}from"./chunk-ZLLER3HP.js";import{and as L,asc as j,eq as l,gt as q,isNotNull as F,sql as O}from"drizzle-orm";var _=100,C=10;async function G(I,s={}){let t=s.db??U(),D=s.sendEmail??B,p=s.log??(o=>process.stderr.write(`[process_announcement] ${o}
2
+ `)),b=s.webBaseUrl??process.env.RULEMETRIC_WEB_URL??process.env.WEB_URL??"https://rulemetric.com",{announcementId:r}=I,[i]=await t.select().from(d).where(l(d.id,r)).limit(1);if(!i)throw new R(`Announcement ${r} not found`);if(i.status!=="queued"&&i.status!=="sending")throw new R(`Announcement ${r} is in status='${i.status}'; expected 'queued' or 'sending'.`);await t.update(d).set({status:"sending",updatedAt:new Date}).where(l(d.id,r)),p(`Sending announcement ${r} (${i.subject??""})`);let w=0,f=0,h=0,y=0,k=null;try{for(;;){let c=await t.select({userId:m.userId,email:v.email,displayName:v.displayName,unsubscribeToken:m.unsubscribeToken}).from(m).innerJoin(v,l(v.id,m.userId)).where(L(l(m.productAnnouncements,!0),F(v.email),k?q(m.userId,k):void 0)).orderBy(j(m.userId)).limit(_);if(c.length===0)break;k=c[c.length-1].userId;for(let A=0;A<c.length;A+=C){let P=c.slice(A,A+C),S=await Promise.allSettled(P.map(g=>W({recipient:g,announcement:i,webBaseUrl:b,sendEmail:D,db:t})));for(let g=0;g<S.length;g++){let u=S[g];if(u.status==="fulfilled")u.value.ok==="sent"?w++:u.value.ok==="skipped"?h++:(f++,u.value.provider==="noop"&&y++,p(` recipient ${P[g].userId}: send failed \u2014 ${u.value.error}`));else{f++;let T=u.reason instanceof Error?u.reason.message:String(u.reason);p(` recipient ${P[g].userId}: send failed \u2014 ${T}`)}}}if(c.length<_)break}y>0&&p(`WARNING: ${y} recipient(s) hit the noop email provider and were recorded as FAILED \u2014 no email provider is configured on this worker (set RESEND_API_KEY in ~/.config/rulemetric/env and reinstall the service)`);let o=await t.select({status:n.status,count:O`count(*)::int`}).from(n).where(l(n.announcementId,r)).groupBy(n.status),e={};for(let c of o)e[c.status]=c.count;let a=e.sent??0,E=e.failed??0,N=a===0&&E>0?"failed":"sent",x=E>0?`${E} of ${a+E} recipient(s) failed; see announcement_deliveries`:null;return await t.update(d).set({status:N,recipientCount:a,...N==="sent"?{sentAt:new Date}:{},error:x,updatedAt:new Date}).where(l(d.id,r)),p(`Done: status=${N} sent=${a} failed=${E} (this attempt: sent=${w} failed=${f} skipped=${h})`),{sent:w,failed:f,skipped:h}}catch(o){let e=o instanceof Error?o.message:String(o);throw await t.update(d).set({status:"failed",error:e.slice(0,1e3),updatedAt:new Date}).where(l(d.id,r)).catch(()=>{}),o}}$(G,"processAnnouncement");function K(I){return I.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}$(K,"escapeHtml");async function W(I){let{recipient:s,announcement:t,webBaseUrl:D,sendEmail:p,db:b}=I;if(!s.email)return{ok:"skipped",reason:"no-email"};let r=await b.insert(n).values({announcementId:t.id,userId:s.userId,email:s.email,status:"pending"}).onConflictDoNothing({target:[n.announcementId,n.userId]}).returning({id:n.id});if(r.length===0)return{ok:"skipped",reason:"already-claimed"};let i=r[0].id,w=D.replace(/\/$/,""),f=encodeURIComponent(s.unsubscribeToken),h=`${w}/unsubscribe/${f}`,y=s.displayName?.trim().split(/\s+/)[0]||"there",k=t.htmlBody.replaceAll("{{unsubscribe_url}}",h).replaceAll("{{recipient_name}}",K(y)),o=t.textBody.replaceAll("{{unsubscribe_url}}",h).replaceAll("{{recipient_name}}",y);try{let e=await p({to:s.email,subject:t.subject,html:k,text:o,fromName:"RuleMetric",idempotencyKey:i,headers:{"List-Unsubscribe":`<${w}/api/unsubscribe/${f}>`,"List-Unsubscribe-Post":"List-Unsubscribe=One-Click"}});if(e.provider==="noop"){let a="no email provider configured (RESEND_API_KEY unset on the worker)";return await b.update(n).set({status:"failed",error:a}).where(l(n.id,i)),{ok:"failed",error:a,provider:e.provider}}return await b.update(n).set({status:"sent",providerId:e.id,sentAt:new Date}).where(l(n.id,i)),{ok:"sent",providerId:e.id,provider:e.provider}}catch(e){let a=e instanceof Error?e.message:String(e);return await b.update(n).set({status:"failed",error:a.slice(0,1e3)}).where(l(n.id,i)).catch(()=>{}),{ok:"failed",error:a}}}$(W,"sendOne");export{G as a};
@@ -1 +1 @@
1
- import{a as R}from"./chunk-5RBLIVBF.js";import{a as N}from"./chunk-2TC6WCUT.js";import{a as C}from"./chunk-6V4WM73L.js";import{a as I}from"./chunk-CADKBP3D.js";import{a as M}from"./chunk-MGHFDHHM.js";import{d as k,e as y,g as p}from"./chunk-TIQ7DQ3M.js";import{a as h}from"./chunk-ZLLER3HP.js";async function H(v,m){let{mirrorId:s,evalTargetId:d,config:a}=v,r=h(t=>m.logger.info(t),"log");if(m.job.attempts>1)throw new R(`process_eval is not safe to retry (attempt ${m.job.attempts}). Re-trigger the eval run from the UI.`);let i=await k(`/api/eval-targets/${d}`),$=await k(`/api/eval-targets/${d}/evals`);if($.length===0)throw new R("No evals defined for target");let J=a.runsPerEval??1,E=a.timeout??12e4,T=a.iteration??1,_=[{name:"with_target",content:i.content}];a.skipBaseline||_.push({name:"without_target"});let f=[];for(let t of $)for(let e of _)for(let n=1;n<=J;n++)f.push({eval_:t,configuration:e.name,targetContent:e.content,runNumber:n});let l=f.length,u=0,g=Math.min(a.parallel??1,4);await p(`/api/eval-jobs/${s}/progress`,{status:"running",progress:{total:l,completed:0,current:null,message:`Starting ${l} eval runs (concurrency: ${g})...`}});let w=[];async function j(t){let e=`${t.configuration} \xB7 ${t.eval_.name} \xB7 run#${t.runNumber}`;r(`[${u+1}/${l}] ${e}`);let n=g>1?C():null;try{let o=await M({prompt:t.eval_.prompt,targetContent:t.targetContent,workDir:n?.workDir,timeout:E,model:a.model}),c={};return!a.skipGrading&&t.eval_.expectations.length>0&&!o.error&&(c=await I({prompt:t.eval_.prompt,output:o.output,expectations:t.eval_.expectations,model:a.graderModel??a.model,timeout:E})),{evalId:t.eval_.id,evalTargetId:i.id,evalTargetVersion:i.version,configuration:t.configuration,runNumber:t.runNumber,iteration:T,status:o.error?"failed":"completed",outputs:o.error?{error:o.error}:{transcript:o.output},timing:{duration_ms:o.durationMs,total_tokens:o.totalTokens},grading:c,worktree:n?.isWorktree?!0:void 0}}finally{n?.cleanup()}}if(h(j,"processItem"),g<=1)for(let t of f){let e=`${t.configuration} \xB7 ${t.eval_.name} \xB7 run#${t.runNumber}`;await p(`/api/eval-jobs/${s}/progress`,{status:"running",progress:{total:l,completed:u,current:e,message:`Executing ${e}...`}});let n=await j(t);await y("/api/eval-runs",n),w.push(n),u++,await p(`/api/eval-jobs/${s}/progress`,{status:"running",progress:{total:l,completed:u,current:e,message:`Completed ${e}`}})}else{r(`Running ${l} evals with concurrency=${g} (worktree isolation)`);for(let t=0;t<f.length;t+=g){let e=f.slice(t,t+g),n=`batch ${Math.floor(t/g)+1}/${Math.ceil(f.length/g)}`;await p(`/api/eval-jobs/${s}/progress`,{status:"running",progress:{total:l,completed:u,current:n,message:`Executing ${n} (${e.length} parallel)...`}});let o=await Promise.all(e.map(j));for(let c of o)await y("/api/eval-runs",c),w.push(c),u++;await p(`/api/eval-jobs/${s}/progress`,{status:"running",progress:{total:l,completed:u,current:n,message:`Completed ${n}`}})}}let x=G(w),b;if(!a.skipGrading&&w.some(t=>t.grading&&Object.keys(t.grading).length>0))try{r(`Running meta-judge for job ${s}...`);let t=$.map(e=>{let o=w.filter(c=>c.evalId===e.id&&c.configuration==="with_target")[0];return{evalName:e.name,prompt:e.prompt,expectations:e.expectations,grading:o?.grading?o.grading:null,output:o?.outputs?.transcript?.slice(0,500)}});b=await N({targetName:i.name,evalResults:t,model:a.graderModel??a.model,timeout:6e4}),r(`Meta-judge: quality=${b.quality_score}/5, issues=${b.issues.length}`)}catch(t){r(`Meta-judge failed (non-fatal): ${t instanceof Error?t.message:String(t)}`)}let P=b?{...x,meta_judgement:b}:x;return r(`Job ${s} completed: ${u}/${l} runs`),await p(`/api/eval-jobs/${s}/state`,{result:P}).catch(t=>{r(`result persist failed: ${t instanceof Error?t.message:String(t)}`)}),P}h(H,"processEval");function G(v){let m=v.filter(r=>r.status==="completed"),s=v.filter(r=>r.status==="failed"),d=m.filter(r=>{let i=r.grading;return i&&Object.keys(i).length>0}),a=d.length>0?d.reduce((r,i)=>r+(i.grading?.summary?.pass_rate??0),0)/d.length:null;return{total:v.length,completed:m.length,failed:s.length,avgPassRate:a}}h(G,"buildSummary");export{H as a};
1
+ import{a as R}from"./chunk-5RBLIVBF.js";import{a as N}from"./chunk-2TC6WCUT.js";import{a as C}from"./chunk-6V4WM73L.js";import{a as I}from"./chunk-CADKBP3D.js";import{a as M}from"./chunk-MGHFDHHM.js";import{e as k,f as y,h as p}from"./chunk-H2ORWIEY.js";import{a as h}from"./chunk-ZLLER3HP.js";async function H(v,m){let{mirrorId:s,evalTargetId:d,config:a}=v,r=h(t=>m.logger.info(t),"log");if(m.job.attempts>1)throw new R(`process_eval is not safe to retry (attempt ${m.job.attempts}). Re-trigger the eval run from the UI.`);let i=await k(`/api/eval-targets/${d}`),$=await k(`/api/eval-targets/${d}/evals`);if($.length===0)throw new R("No evals defined for target");let J=a.runsPerEval??1,E=a.timeout??12e4,T=a.iteration??1,_=[{name:"with_target",content:i.content}];a.skipBaseline||_.push({name:"without_target"});let f=[];for(let t of $)for(let e of _)for(let n=1;n<=J;n++)f.push({eval_:t,configuration:e.name,targetContent:e.content,runNumber:n});let l=f.length,u=0,g=Math.min(a.parallel??1,4);await p(`/api/eval-jobs/${s}/progress`,{status:"running",progress:{total:l,completed:0,current:null,message:`Starting ${l} eval runs (concurrency: ${g})...`}});let w=[];async function j(t){let e=`${t.configuration} \xB7 ${t.eval_.name} \xB7 run#${t.runNumber}`;r(`[${u+1}/${l}] ${e}`);let n=g>1?C():null;try{let o=await M({prompt:t.eval_.prompt,targetContent:t.targetContent,workDir:n?.workDir,timeout:E,model:a.model}),c={};return!a.skipGrading&&t.eval_.expectations.length>0&&!o.error&&(c=await I({prompt:t.eval_.prompt,output:o.output,expectations:t.eval_.expectations,model:a.graderModel??a.model,timeout:E})),{evalId:t.eval_.id,evalTargetId:i.id,evalTargetVersion:i.version,configuration:t.configuration,runNumber:t.runNumber,iteration:T,status:o.error?"failed":"completed",outputs:o.error?{error:o.error}:{transcript:o.output},timing:{duration_ms:o.durationMs,total_tokens:o.totalTokens},grading:c,worktree:n?.isWorktree?!0:void 0}}finally{n?.cleanup()}}if(h(j,"processItem"),g<=1)for(let t of f){let e=`${t.configuration} \xB7 ${t.eval_.name} \xB7 run#${t.runNumber}`;await p(`/api/eval-jobs/${s}/progress`,{status:"running",progress:{total:l,completed:u,current:e,message:`Executing ${e}...`}});let n=await j(t);await y("/api/eval-runs",n),w.push(n),u++,await p(`/api/eval-jobs/${s}/progress`,{status:"running",progress:{total:l,completed:u,current:e,message:`Completed ${e}`}})}else{r(`Running ${l} evals with concurrency=${g} (worktree isolation)`);for(let t=0;t<f.length;t+=g){let e=f.slice(t,t+g),n=`batch ${Math.floor(t/g)+1}/${Math.ceil(f.length/g)}`;await p(`/api/eval-jobs/${s}/progress`,{status:"running",progress:{total:l,completed:u,current:n,message:`Executing ${n} (${e.length} parallel)...`}});let o=await Promise.all(e.map(j));for(let c of o)await y("/api/eval-runs",c),w.push(c),u++;await p(`/api/eval-jobs/${s}/progress`,{status:"running",progress:{total:l,completed:u,current:n,message:`Completed ${n}`}})}}let x=G(w),b;if(!a.skipGrading&&w.some(t=>t.grading&&Object.keys(t.grading).length>0))try{r(`Running meta-judge for job ${s}...`);let t=$.map(e=>{let o=w.filter(c=>c.evalId===e.id&&c.configuration==="with_target")[0];return{evalName:e.name,prompt:e.prompt,expectations:e.expectations,grading:o?.grading?o.grading:null,output:o?.outputs?.transcript?.slice(0,500)}});b=await N({targetName:i.name,evalResults:t,model:a.graderModel??a.model,timeout:6e4}),r(`Meta-judge: quality=${b.quality_score}/5, issues=${b.issues.length}`)}catch(t){r(`Meta-judge failed (non-fatal): ${t instanceof Error?t.message:String(t)}`)}let P=b?{...x,meta_judgement:b}:x;return r(`Job ${s} completed: ${u}/${l} runs`),await p(`/api/eval-jobs/${s}/state`,{result:P}).catch(t=>{r(`result persist failed: ${t instanceof Error?t.message:String(t)}`)}),P}h(H,"processEval");function G(v){let m=v.filter(r=>r.status==="completed"),s=v.filter(r=>r.status==="failed"),d=m.filter(r=>{let i=r.grading;return i&&Object.keys(i).length>0}),a=d.length>0?d.reduce((r,i)=>r+(i.grading?.summary?.pass_rate??0),0)/d.length:null;return{total:v.length,completed:m.length,failed:s.length,avgPassRate:a}}h(G,"buildSummary");export{H as a};
@@ -0,0 +1 @@
1
+ import{c as H}from"./chunk-TIOKY2IA.js";import{a as b}from"./chunk-TQMG647B.js";import{b as I}from"./chunk-W2MOTOQE.js";import{a as T}from"./chunk-VAXRCSSH.js";import{a as S}from"./chunk-RSKQRVPJ.js";import{a as A}from"./chunk-AYUJY37O.js";import{a as y}from"./chunk-KAF3CYRW.js";import{a as k}from"./chunk-UF6US7VU.js";import{a as _}from"./chunk-DPFNJZUO.js";import{a as R}from"./chunk-2WLVDSAP.js";import{a as E}from"./chunk-NEACEHQD.js";import{a as h}from"./chunk-32EEBARV.js";import{b as w}from"./chunk-5RBLIVBF.js";import{b as f,e as v,f as p}from"./chunk-H2ORWIEY.js";import{a as s}from"./chunk-ZLLER3HP.js";var D={process_eval:h,process_insights:b,process_launch:I,process_send_message:S,process_conversation:E,process_session_goal:A,process_announcement:R,process_run_cleanup:T,cron_suggest_instructions:_,cron_refresh_skills:k,cron_refresh_pricing:y},M=Object.keys(D),V=new Set(["process_session_goal","process_announcement","process_run_cleanup"]);function x(e=process.env){return e.DATABASE_URL?M:M.filter(n=>!V.has(n))}s(x,"availableCapabilities");var O=3e4,W=3e4,$=3e4,L=250,N=5e3,B=`thin-agent-${process.pid}`,g=null;function F(e,n,r,l){let a=s(t=>{p("/api/workers/heartbeat",{workerType:"cli-worker",clientName:B,clientVersion:l,workerVersion:"0.1.0",currentJobId:null,inFlightCount:0,lastError:null,status:t,metadata:{capabilities:e,mode:"thin-agent"}}).then(c=>{let u=c?.advisory;u&&u.message!==g?(g=u.message,o(r,{event:"worker_advisory",code:u.code,message:u.message})):u||(g=null)}).catch(c=>{o(r,{event:"presence_heartbeat_error",error:c instanceof Error?c.message:String(c)})})},"send");a("alive");let d=setInterval(()=>a("alive"),$);n.addEventListener("abort",()=>{clearInterval(d),a("shutting_down")},{once:!0})}s(F,"startPresenceHeartbeat");function o(e,n){try{e(JSON.stringify({ts:new Date().toISOString(),...n}))}catch{e(`[agent-loop] log_error event=${n.event}`)}}s(o,"structuredLog");function P(e,n){return n.aborted?Promise.resolve(!1):e<=0?Promise.resolve(!0):new Promise(r=>{let l=setTimeout(()=>{n.removeEventListener("abort",a),r(!0)},e),a=s(()=>{clearTimeout(l),n.removeEventListener("abort",a),r(!1)},"onAbort");n.addEventListener("abort",a,{once:!0})})}s(P,"abortableSleep");async function J(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(J,"pollForWork");function U(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(U,"makeHelpers");async function K(e,n,r){let l=D[e.kind],a=Date.now();if(o(r,{event:"claim",jobId:e.id,kind:e.kind,attempts:e.attempts}),!l){let t=`unknown kind: ${e.kind}`;o(r,{event:"fail",jobId:e.id,kind:e.kind,terminal:!0,error:t}),await p(`/api/work/${e.id}/fail`,{leaseToken:e.leaseToken,error:t,terminal:!0}).catch(()=>{});return}let d=setInterval(()=>{o(r,{event:"heartbeat",jobId:e.id}),p(`/api/work/${e.id}/heartbeat`,{leaseToken:e.leaseToken}).catch(t=>{o(r,{event:"heartbeat_error",jobId:e.id,error:t instanceof Error?t.message:String(t)})})},n);try{let t=U(e.attempts,r),c=await l(e.payload,t)??{};clearInterval(d),o(r,{event:"complete",jobId:e.id,kind:e.kind,durationMs:Date.now()-a}),await p(`/api/work/${e.id}/complete`,{leaseToken:e.leaseToken,result:c})}catch(t){clearInterval(d);let c=w(t),u=t instanceof Error?t.message:String(t);o(r,{event:"fail",jobId:e.id,kind:e.kind,durationMs:Date.now()-a,terminal:c,error:u}),await p(`/api/work/${e.id}/fail`,{leaseToken:e.leaseToken,error:u,terminal:c}).catch(i=>{o(r,{event:"fail_post_error",jobId:e.id,error:i instanceof Error?i.message:String(i)})})}}s(K,"runOne");async function ie(e){let n=e.log??(()=>{}),r=e.pollWaitMs??O,l=e.heartbeatIntervalMs??W,a=e.capabilities??x(),d=L;o(n,{event:"agent_start",capabilities:a,pollWaitMs:r,heartbeatIntervalMs:l}),F(a,e.signal,n,e.version),H({signal:e.signal,log:n}).catch(i=>{o(n,{event:"tt_heartbeat_fatal",error:i instanceof Error?i.message:String(i)})});let t=5*6e4,c=0,u=s(()=>{if(!e.readInstalledVersion||!e.version)return!1;let i=Date.now();if(i-c<t)return!1;c=i;let m=e.readInstalledVersion();return!!(m&&m!==e.version)},"versionDrifted");for(;!e.signal.aborted;){if(u()){o(n,{event:"agent_version_drift",bootVersion:e.version,installedVersion:e.readInstalledVersion?.()??null}),e.onVersionDrift?.();break}let i=null;try{i=await J(a,r)}catch(m){let C=m instanceof f?m.statusCode:void 0;if(o(n,{event:"poll_error",status:C,error:m instanceof Error?m.message:String(m)}),!await P(d,e.signal))break;d=Math.min(d*2,N);continue}if(!i){if(o(n,{event:"poll_204"}),!await P(d,e.signal))break;d=Math.min(d*2,N);continue}d=L,await K(i,l,n)}o(n,{event:"agent_stop"})}s(ie,"runAgentLoop");export{D as a,M as b,x as c,J as d,ie as e};
@@ -1,4 +1,4 @@
1
- import{c as e,d as o,h as y}from"./chunk-NVOTOQBA.js";import{f as d}from"./chunk-RTWRHIKY.js";import{a as g}from"./chunk-ZLLER3HP.js";import{eq as c,asc as P,sql as R}from"drizzle-orm";var T=1800*1e3,I=300*1e3,h=10,D=`Given these messages from an AI coding session, write a 1-2 sentence summary of what the user is trying to accomplish. Focus on the goal, not the steps. No preamble.
1
+ import{f as d}from"./chunk-RTWRHIKY.js";import{c as e,d as o,h as y}from"./chunk-H4SV7FN4.js";import{a as g}from"./chunk-ZLLER3HP.js";import{eq as c,asc as P,sql as R}from"drizzle-orm";var T=1800*1e3,I=300*1e3,h=10,D=`Given these messages from an AI coding session, write a 1-2 sentence summary of what the user is trying to accomplish. Focus on the goal, not the steps. No preamble.
2
2
 
3
3
  Return strict JSON in the form: {"goalSummary": "..."}`;async function b(t,a={}){let n=a.db??y(),f=a.llm??d,r=a.now??Date.now,[i]=await n.select().from(e).where(c(e.id,t.sessionId)).limit(1);if(!i)return{skipped:"not_found"};let w=(await n.execute(R`SELECT MAX(timestamp) AS last_at FROM session_events WHERE session_id = ${t.sessionId}`))?.[0]?.last_at??i.startedAt,_=new Date(w).getTime();if(r()-_>T)return{skipped:"stale"};let m=i.analysis??{},p=m.goalSummaryAt?new Date(m.goalSummaryAt).getTime():0;if(p&&r()-p<I)return{skipped:"recent"};let u=(await n.select().from(o).where(c(o.sessionId,t.sessionId)).orderBy(P(o.timestamp)).limit(h*2)).filter(s=>s.content&&(s.eventType==="user_message"||s.eventType==="assistant_response")).map(s=>`${s.eventType==="user_message"?"USER":"ASSISTANT"}: ${s.content}`).join(`
4
4
 
@@ -1 +1 @@
1
- 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{a as j}from"./chunk-VMWY7KHH.js";import{b as I,c as P,d as v}from"./chunk-SBILN45P.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};
1
+ 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{a as j}from"./chunk-RDET7CKR.js";import{b as I,c as P,d as v}from"./chunk-ZR3MUNLS.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};
@@ -1 +1 @@
1
- import{d as j,f as y}from"./chunk-RTWRHIKY.js";import{b as R}from"./chunk-ZL4MZMUK.js";import{a as S}from"./chunk-TDD7IOV2.js";import{a as p}from"./chunk-MODXEGCU.js";import{d as i,e as l}from"./chunk-TIQ7DQ3M.js";import{a as g}from"./chunk-ZLLER3HP.js";import{readFileSync as b}from"node:fs";import E from"node:path";import $ from"node:os";var N=5,L=Number(process.env.RULEMETRIC_MAX_SUGGESTION_PROJECTS??10),T=48,M=.5,k=400;async function O(){let d=E.join($.homedir(),".config","rulemetric","skills-registry.json");try{let o=b(d,"utf-8"),s=JSON.parse(o);return Date.now()-new Date(s.generatedAt).getTime()>T*60*60*1e3}catch{return!0}}g(O,"checkSkillsRegistryStale");var X=g(async(d,o)=>{let s=j();if(s==="none"){o.logger.warn("No LLM backend available (claude CLI missing and ANTHROPIC_API_KEY unset); skipping suggestion compute");return}o.logger.info(`Scoring backend: ${s}`);let r;try{r=(await i("/api/sessions/project-paths?limit="+L)).projectPaths}catch(e){o.logger.warn(`Failed to fetch project paths: ${e instanceof Error?e.message:String(e)}`);return}if(r.length===0){o.logger.info("No recent project paths; nothing to score");return}let m=new Map;try{let e=await i("/api/projects?limit=200");for(let t of e.projects??[])t.primaryCheckoutPath&&m.set(p(t.primaryCheckoutPath),t.id)}catch(e){o.logger.warn(`Failed to fetch projects for id resolution: ${e instanceof Error?e.message:String(e)}`)}let a=new Map;try{let e=await i("/api/catalog?limit=200");for(let t of e)a.set(t.id,{id:t.id,name:t.name,description:t.description??"",tags:t.tags??[],contentPreview:(t.content??"").slice(0,k)})}catch(e){o.logger.warn(`Failed to fetch catalog: ${e instanceof Error?e.message:String(e)}`)}try{let e=await i("/api/instructions?limit=100");for(let t of e.instructions??[])a.has(t.id)||a.set(t.id,{id:t.id,name:t.name,description:t.description??"",tags:t.tags??[],contentPreview:(t.content??"").slice(0,k)})}catch(e){o.logger.warn(`Failed to fetch personal instructions: ${e instanceof Error?e.message:String(e)}`)}let c=[...a.values()];if(c.length===0){o.logger.info("No candidate instructions; nothing to score");return}o.logger.info(`Scoring ${c.length} candidates across ${r.length} project(s)`);let u=0;for(let e of r)try{let t=p(e),f=S(t);if(f.length===0){o.logger.info(`Skipping ${t}: insufficient language signals`);continue}let C={name:E.basename(t),description:null,languages:f,topics:[],dependencies:[]},I=R(C,c),w=await y(I,"",4096);if(!w){o.logger.warn(`LLM returned null for ${t} (backend ${s})`);continue}let P=(w.recommendations??[]).filter(n=>typeof n.instructionId=="string"&&typeof n.score=="number"&&typeof n.reason=="string").map(n=>({instructionId:n.instructionId,score:n.score,reason:n.reason})).filter(n=>n.score>=M).sort((n,_)=>_.score-n.score).slice(0,N);if(P.length===0){o.logger.info(`No suggestions over threshold for ${t}`);continue}let h=m.get(t);await l("/api/instruction-suggestions/batch-upsert",{projectPath:t,...h?{projectId:h}:{},suggestions:P.map(n=>({instructionId:n.instructionId,score:n.score,reason:n.reason}))}),u++}catch(t){o.logger.warn(`Failed to score ${e}: ${t instanceof Error?t.message:String(t)}`)}if(await O())try{await l("/api/instruction-suggestions/mark-stale",{}),o.logger.warn("Skills registry is stale (>48h); marked all suggestions stale")}catch{}o.logger.info(`Done: scored ${u}/${r.length} projects`)},"cronSuggestInstructions");export{X as a};
1
+ import{d as j,f as y}from"./chunk-RTWRHIKY.js";import{b as R}from"./chunk-ZL4MZMUK.js";import{a as S}from"./chunk-TDD7IOV2.js";import{a as p}from"./chunk-MODXEGCU.js";import{e as i,f as l}from"./chunk-H2ORWIEY.js";import{a as g}from"./chunk-ZLLER3HP.js";import{readFileSync as b}from"node:fs";import E from"node:path";import $ from"node:os";var N=5,L=Number(process.env.RULEMETRIC_MAX_SUGGESTION_PROJECTS??10),T=48,M=.5,k=400;async function O(){let d=E.join($.homedir(),".config","rulemetric","skills-registry.json");try{let o=b(d,"utf-8"),s=JSON.parse(o);return Date.now()-new Date(s.generatedAt).getTime()>T*60*60*1e3}catch{return!0}}g(O,"checkSkillsRegistryStale");var X=g(async(d,o)=>{let s=j();if(s==="none"){o.logger.warn("No LLM backend available (claude CLI missing and ANTHROPIC_API_KEY unset); skipping suggestion compute");return}o.logger.info(`Scoring backend: ${s}`);let r;try{r=(await i("/api/sessions/project-paths?limit="+L)).projectPaths}catch(e){o.logger.warn(`Failed to fetch project paths: ${e instanceof Error?e.message:String(e)}`);return}if(r.length===0){o.logger.info("No recent project paths; nothing to score");return}let m=new Map;try{let e=await i("/api/projects?limit=200");for(let t of e.projects??[])t.primaryCheckoutPath&&m.set(p(t.primaryCheckoutPath),t.id)}catch(e){o.logger.warn(`Failed to fetch projects for id resolution: ${e instanceof Error?e.message:String(e)}`)}let a=new Map;try{let e=await i("/api/catalog?limit=200");for(let t of e)a.set(t.id,{id:t.id,name:t.name,description:t.description??"",tags:t.tags??[],contentPreview:(t.content??"").slice(0,k)})}catch(e){o.logger.warn(`Failed to fetch catalog: ${e instanceof Error?e.message:String(e)}`)}try{let e=await i("/api/instructions?limit=100");for(let t of e.instructions??[])a.has(t.id)||a.set(t.id,{id:t.id,name:t.name,description:t.description??"",tags:t.tags??[],contentPreview:(t.content??"").slice(0,k)})}catch(e){o.logger.warn(`Failed to fetch personal instructions: ${e instanceof Error?e.message:String(e)}`)}let c=[...a.values()];if(c.length===0){o.logger.info("No candidate instructions; nothing to score");return}o.logger.info(`Scoring ${c.length} candidates across ${r.length} project(s)`);let u=0;for(let e of r)try{let t=p(e),f=S(t);if(f.length===0){o.logger.info(`Skipping ${t}: insufficient language signals`);continue}let C={name:E.basename(t),description:null,languages:f,topics:[],dependencies:[]},I=R(C,c),w=await y(I,"",4096);if(!w){o.logger.warn(`LLM returned null for ${t} (backend ${s})`);continue}let P=(w.recommendations??[]).filter(n=>typeof n.instructionId=="string"&&typeof n.score=="number"&&typeof n.reason=="string").map(n=>({instructionId:n.instructionId,score:n.score,reason:n.reason})).filter(n=>n.score>=M).sort((n,_)=>_.score-n.score).slice(0,N);if(P.length===0){o.logger.info(`No suggestions over threshold for ${t}`);continue}let h=m.get(t);await l("/api/instruction-suggestions/batch-upsert",{projectPath:t,...h?{projectId:h}:{},suggestions:P.map(n=>({instructionId:n.instructionId,score:n.score,reason:n.reason}))}),u++}catch(t){o.logger.warn(`Failed to score ${e}: ${t instanceof Error?t.message:String(t)}`)}if(await O())try{await l("/api/instruction-suggestions/mark-stale",{}),o.logger.warn("Skills registry is stale (>48h); marked all suggestions stale")}catch{}o.logger.info(`Done: scored ${u}/${r.length} projects`)},"cronSuggestInstructions");export{X as a};
@@ -0,0 +1 @@
1
+ import{e as R,f as _}from"./chunk-H2ORWIEY.js";import{a as f}from"./chunk-ZLLER3HP.js";function p(a){if(a.length===0)return{mean:0,stddev:0,min:0,max:0};let i=a.reduce((o,c)=>o+c,0)/a.length,m=a.reduce((o,c)=>o+(c-i)**2,0)/a.length;return{mean:Math.round(i*1e3)/1e3,stddev:Math.round(Math.sqrt(m)*1e3)/1e3,min:Math.min(...a),max:Math.max(...a)}}f(p,"computeStats");async function y(a,i){let m=i?`&iteration=${i}`:"",o=100,c=[];for(let t=0;t<1e5;t+=o){let n=await R(`/api/eval-targets/${a}/runs?limit=${o}&offset=${t}${m}`);if(c.push(...n),n.length<o)break}let l=c.filter(t=>t.status==="completed");if(l.length===0)return{runSummary:{},notes:["No completed runs found"],totalRuns:0};let g={};for(let t of l)g[t.configuration]||(g[t.configuration]=[]),g[t.configuration].push(t);let e={},u=[];for(let[t,n]of Object.entries(g)){let r=n.filter(s=>Object.keys(s.grading).length>0).map(s=>s.grading.summary?.pass_rate??0),d=n.map(s=>s.timing.duration_ms/1e3).filter(s=>!isNaN(s)),h=n.map(s=>s.timing.total_tokens??0).filter(s=>s>0);e[t]={},r.length>0&&(e[t].pass_rate=p(r)),d.length>0&&(e[t].time_seconds=p(d)),h.length>0&&(e[t].tokens=p(h))}if(e.with_target&&e.without_target){let t={};for(let d of["pass_rate","time_seconds","tokens"]){let h=e.with_target[d]?.mean??0,s=e.without_target[d]?.mean??0,b=h-s;t[d]=`${b>=0?"+":""}${Math.round(b*1e3)/1e3}`}e.delta=t,u.push(`Delta is a raw mean difference over ${g.with_target.length} with-target / ${g.without_target.length} without-target runs \u2014 no significance test; small samples are not statistically meaningful.`);let n=(e.with_target.pass_rate?.mean??0)-(e.without_target.pass_rate?.mean??0);n>.1?u.push(`Target improves pass rate by ${(n*100).toFixed(0)}%`):n<-.1?u.push(`Target decreases pass rate by ${(Math.abs(n)*100).toFixed(0)}%`):u.push("Target has minimal impact on pass rate");let r=(e.with_target.time_seconds?.mean??0)-(e.without_target.time_seconds?.mean??0);Math.abs(r)>5&&u.push(`Target ${r>0?"adds":"saves"} ${Math.abs(r).toFixed(1)}s average execution time`)}for(let[t,n]of Object.entries(e)){if(t==="delta")continue;let r=n.pass_rate;r&&r.stddev>.2&&u.push(`${t} shows high pass rate variance (stddev=${r.stddev.toFixed(2)}) \u2014 results may be unreliable`)}return{runSummary:e,notes:u,totalRuns:l.length}}f(y,"aggregateBenchmark");async function $(a,i,m){return _(`/api/eval-targets/${a}/benchmarks`,{iteration:i,runSummary:m.runSummary,notes:m.notes})}f($,"postBenchmark");export{y as a,$ as b};
@@ -1,2 +1,2 @@
1
- import{c as E,o as m}from"./chunk-7DFNBRLY.js";import{a as d}from"./chunk-TIQ7DQ3M.js";import{a as c}from"./chunk-ZLLER3HP.js";import*as p from"node:fs";import*as u from"node:path";import*as _ from"node:os";function T(){if(process.env.RULEMETRIC_API_KEY||process.env.RULEMETRIC_ACCESS_TOKEN)return;let s=u.join(_.homedir(),".config","rulemetric","env");C(s)||C(u.join(process.cwd(),".env.local"))}c(T,"ensureEnv");function C(s){try{let t=p.readFileSync(s,"utf-8");for(let n of t.split(`
1
+ import{c as E,o as m}from"./chunk-7DFNBRLY.js";import{a as d}from"./chunk-H2ORWIEY.js";import{a as c}from"./chunk-ZLLER3HP.js";import*as p from"node:fs";import*as u from"node:path";import*as _ from"node:os";function T(){if(process.env.RULEMETRIC_API_KEY||process.env.RULEMETRIC_ACCESS_TOKEN)return;let s=u.join(_.homedir(),".config","rulemetric","env");C(s)||C(u.join(process.cwd(),".env.local"))}c(T,"ensureEnv");function C(s){try{let t=p.readFileSync(s,"utf-8");for(let n of t.split(`
2
2
  `)){let e=n.trim();if(!e||e.startsWith("#"))continue;let o=e.indexOf("=");if(o<0)continue;let r=e.slice(0,o).trim(),i=e.slice(o+1).trim();process.env[r]||(process.env[r]=i)}return!!(process.env.RULEMETRIC_API_KEY||process.env.RULEMETRIC_ACCESS_TOKEN)}catch{return!1}}c(C,"loadEnvFile");T();async function I(s){let t={totalSessions:0,totalCalls:0,totalInputTokens:0,totalOutputTokens:0,totalCacheReadTokens:0,totalCacheWriteTokens:0,totalCostUSD:0,providers:{}},n=await m(s);t.providers={};for(let a of n)t.providers[a.provider]=(t.providers[a.provider]||0)+1;let e=new E,o=n.filter(a=>a.provider==="claude");for(let a of o)try{let h=p.readdirSync(a.path).filter(f=>f.endsWith(".jsonl"));t.totalSessions+=h.length;for(let f of h){let v=p.readFileSync(u.join(a.path,f),"utf-8"),R=e.parse(v);for(let l of R.events)l.tokenUsage&&(t.totalCalls++,t.totalInputTokens+=l.tokenUsage.input,t.totalOutputTokens+=l.tokenUsage.output,t.totalCacheReadTokens+=l.tokenUsage.cacheRead??0,t.totalCacheWriteTokens+=l.tokenUsage.cacheWrite??0)}}catch{}let r=15,i=75;return t.totalCostUSD=Math.round((t.totalInputTokens/1e6*r+t.totalOutputTokens/1e6*i+t.totalCacheReadTokens/1e6*(r*.1)+t.totalCacheWriteTokens/1e6*(r*1.25))*100)/100,t}c(I,"loadLocalStats");async function U(s){let t=process.env.RULEMETRIC_API_URL??d,n=process.env.RULEMETRIC_API_KEY,e=process.env.RULEMETRIC_ACCESS_TOKEN,o=n??e;if(!o)return null;let r=new URLSearchParams;s&&r.set("projectPath",s);try{let i=await fetch(`${t}/api/insights/compute?${r}`,{headers:{Authorization:`Bearer ${o}`},signal:AbortSignal.timeout(5e3)});return i.ok?await i.json():null}catch{return null}}c(U,"loadApiInsights");async function g(s){let t=process.env.RULEMETRIC_API_URL??d,n=process.env.RULEMETRIC_API_KEY??process.env.RULEMETRIC_ACCESS_TOKEN;if(!n)return null;let e=new URLSearchParams;s&&e.set("projectPath",s);try{let o=await fetch(`${t}/api/insights/linked-instructions?${e}`,{headers:{Authorization:`Bearer ${n}`},signal:AbortSignal.timeout(5e3)});return o.ok?await o.json():null}catch{return null}}c(g,"loadLinkedInstructions");export{I as a,U as b,g as c};
@@ -1 +1 @@
1
- import{a as T,e as w}from"./chunk-M6AJDVCL.js";import{a as s}from"./chunk-ZLLER3HP.js";import{fileURLToPath as x}from"node:url";import{existsSync as A,readFileSync as E}from"node:fs";import{dirname as v,join as O}from"node:path";function _(){let e=v(x(import.meta.url));for(let t=0;t<8;t++){let c=O(e,"package.json");if(A(c))try{let i=JSON.parse(E(c,"utf8"));if(i.name==="@rulemetric/cli"&&i.version)return i.version}catch{}let o=v(e);if(o===e)break;e=o}return"0.0.0"}s(_,"readCliVersion");var k=_(),L="https://rulemetric.com",l=class extends Error{constructor(c,o){super(o);this.statusCode=c;this.name="ApiError"}static{s(this,"ApiError")}};function H(){let e=process.env.RULEMETRIC_API_URL??T().apiUrl??L,t=new URL(e);if(t.protocol==="http:"&&t.hostname!=="localhost"&&t.hostname!=="127.0.0.1")throw new Error(`API URL must use HTTPS for non-localhost hosts: ${e}`);return e}s(H,"getBaseUrl");async function a(e,t={}){let o=`${H()}${e}`,i={"Content-Type":"application/json","User-Agent":`rulemetric-cli/${k}`,...t.headers},m=T(),d=process.env.RULEMETRIC_API_KEY||m.apiKey||w()?.accessToken||m.accessToken;d&&(i.Authorization=`Bearer ${d}`);let h=new URL(o),f=h.hostname==="localhost"||h.hostname==="127.0.0.1",P=process.env.HTTPS_PROXY,g=process.env.HTTP_PROXY;f&&(delete process.env.HTTPS_PROXY,delete process.env.HTTP_PROXY);let u=t.timeoutMs?new AbortController:void 0,y=!1,R=u?setTimeout(()=>{y=!0,u.abort()},t.timeoutMs):void 0,n;try{n=await fetch(o,{method:t.method??"GET",headers:i,body:t.body?JSON.stringify(t.body):void 0,signal:u?.signal})}catch(p){if(y){let U=new URL(o).host,b=Math.round(t.timeoutMs/1e3);throw new l(408,`Request to ${U} timed out after ${b}s. This is usually transient or a local proxy/gateway issue \u2014 retry, and if it persists check HTTPS_PROXY / the RuleMetric gateway (:8787).`)}throw p}finally{R&&clearTimeout(R),f&&(P!==void 0&&(process.env.HTTPS_PROXY=P),g!==void 0&&(process.env.HTTP_PROXY=g))}let r;if(n.headers.get("content-type")?.includes("application/json")?r=await n.json():r=await n.text(),!n.ok){let p=r&&typeof r=="object"&&"error"in r?String(r.error):`HTTP ${n.status}`;throw new l(n.status,p)}return r}s(a,"api");var C=s(e=>a(e),"apiGet"),X=s((e,t)=>a(e,{method:"POST",body:t}),"apiPost"),I=s((e,t)=>a(e,{method:"PUT",body:t}),"apiPut"),B=s((e,t)=>a(e,{method:"PATCH",body:t}),"apiPatch"),D=s(e=>a(e,{method:"DELETE"}),"apiDelete");export{L as a,l as b,a as c,C as d,X as e,I as f,B as g,D as h};
1
+ import{a as T,e as w}from"./chunk-O6C2UGBY.js";import{a as s}from"./chunk-ZLLER3HP.js";import{fileURLToPath as x}from"node:url";import{existsSync as A,readFileSync as E}from"node:fs";import{dirname as v,join as O}from"node:path";function _(){let e=v(x(import.meta.url));for(let t=0;t<8;t++){let c=O(e,"package.json");if(A(c))try{let i=JSON.parse(E(c,"utf8"));if(i.name==="@rulemetric/cli"&&i.version)return i.version}catch{}let o=v(e);if(o===e)break;e=o}return"0.0.0"}s(_,"readCliVersion");var k=_(),L="https://rulemetric.com",l=class extends Error{constructor(c,o){super(o);this.statusCode=c;this.name="ApiError"}static{s(this,"ApiError")}};function H(){let e=process.env.RULEMETRIC_API_URL??T().apiUrl??L,t=new URL(e);if(t.protocol==="http:"&&t.hostname!=="localhost"&&t.hostname!=="127.0.0.1")throw new Error(`API URL must use HTTPS for non-localhost hosts: ${e}`);return e}s(H,"getBaseUrl");async function a(e,t={}){let o=`${H()}${e}`,i={"Content-Type":"application/json","User-Agent":`rulemetric-cli/${k}`,...t.headers},m=T(),d=process.env.RULEMETRIC_API_KEY||m.apiKey||w()?.accessToken||m.accessToken;d&&(i.Authorization=`Bearer ${d}`);let h=new URL(o),f=h.hostname==="localhost"||h.hostname==="127.0.0.1",P=process.env.HTTPS_PROXY,g=process.env.HTTP_PROXY;f&&(delete process.env.HTTPS_PROXY,delete process.env.HTTP_PROXY);let p=t.timeoutMs?new AbortController:void 0,y=!1,R=p?setTimeout(()=>{y=!0,p.abort()},t.timeoutMs):void 0,r;try{r=await fetch(o,{method:t.method??"GET",headers:i,body:t.body?JSON.stringify(t.body):void 0,signal:p?.signal})}catch(u){if(y){let U=new URL(o).host,b=Math.round(t.timeoutMs/1e3);throw new l(408,`Request to ${U} timed out after ${b}s. This is usually transient or a local proxy/gateway issue \u2014 retry, and if it persists check HTTPS_PROXY / the RuleMetric gateway (:8787).`)}throw u}finally{R&&clearTimeout(R),f&&(P!==void 0&&(process.env.HTTPS_PROXY=P),g!==void 0&&(process.env.HTTP_PROXY=g))}let n;if(r.headers.get("content-type")?.includes("application/json")?n=await r.json():n=await r.text(),!r.ok){let u=n&&typeof n=="object"&&"error"in n?String(n.error):`HTTP ${r.status}`;throw new l(r.status,u)}return n}s(a,"api");var C=s(e=>a(e),"apiGet"),X=s((e,t)=>a(e,{method:"POST",body:t}),"apiPost"),I=s((e,t)=>a(e,{method:"PUT",body:t}),"apiPut"),B=s((e,t)=>a(e,{method:"PATCH",body:t}),"apiPatch"),D=s(e=>a(e,{method:"DELETE"}),"apiDelete");export{L as a,l as b,H as c,a as d,C as e,X as f,I as g,B as h,D as i};
@@ -0,0 +1 @@
1
+ import{a as p,c as Bn}from"./chunk-ZLLER3HP.js";import{boolean as io,pgTable as Hn,text as Le,timestamp as Nt,uuid as ao}from"drizzle-orm/pg-core";import{pgTable as Me,text as Q,timestamp as ge,jsonb as ro,uuid as U,primaryKey as so}from"drizzle-orm/pg-core";var a=Me("organizations",{id:U("id").primaryKey().defaultRandom(),name:Q("name").unique().notNull(),slug:Q("slug").unique().notNull(),metadata:ro("metadata"),createdAt:ge("created_at",{withTimezone:!0}).defaultNow(),updatedAt:ge("updated_at",{withTimezone:!0}).defaultNow()}),x=Me("teams",{id:U("id").primaryKey().defaultRandom(),orgId:U("org_id").references(()=>a.id,{onDelete:"cascade"}),name:Q("name").notNull(),slug:Q("slug").notNull(),metadata:ro("metadata"),createdAt:ge("created_at",{withTimezone:!0}).defaultNow()}),W=Me("user_organizations",{userId:U("user_id").notNull(),orgId:U("org_id").references(()=>a.id,{onDelete:"cascade"}).notNull(),role:Q("role").notNull().default("member"),createdAt:ge("created_at",{withTimezone:!0}).defaultNow()},e=>[so({columns:[e.userId,e.orgId]})]),X=Me("user_teams",{userId:U("user_id").notNull(),teamId:U("team_id").references(()=>x.id,{onDelete:"cascade"}).notNull(),role:Q("role").notNull().default("member"),createdAt:ge("created_at",{withTimezone:!0}).defaultNow()},e=>[so({columns:[e.userId,e.teamId]})]);var s=Hn("profiles",{id:ao("id").primaryKey(),email:Le("email"),displayName:Le("display_name"),activeOrgId:ao("active_org_id").references(()=>a.id,{onDelete:"set null"}),isSuperadmin:io("is_superadmin").notNull().default(!1),claudeCodePlan:Le("claude_code_plan"),planSource:Le("plan_source").notNull().default("detected"),setupCompletedAt:Nt("setup_completed_at",{withTimezone:!0}),liveSendSkipped:io("live_send_skipped").notNull().default(!1),createdAt:Nt("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Nt("updated_at",{withTimezone:!0}).defaultNow()});import{pgTable as Yn,text as Z,timestamp as It,jsonb as _o,uuid as He,integer as Qn,boolean as Wn,index as Tt}from"drizzle-orm/pg-core";import{boolean as Gn,jsonb as Vn,pgTable as yt,primaryKey as co,text as B,timestamp as ve,uniqueIndex as ht,uuid as H}from"drizzle-orm/pg-core";import{sql as Jn}from"drizzle-orm";import{pgTable as uo,text as f,timestamp as Ne,jsonb as Be,uuid as E,integer as vt,boolean as Fn,uniqueIndex as lo,index as Ue}from"drizzle-orm/pg-core";var o=uo("instructions",{id:E("id").primaryKey().defaultRandom(),name:f("name").notNull(),description:f("description").notNull(),type:f("type").notNull().default("instruction"),scope:f("scope").notNull(),scopeRef:E("scope_ref"),version:f("version").notNull(),content:f("content").notNull(),frontmatter:Be("frontmatter").notNull(),slots:Be("slots"),tags:f("tags").array(),compatibility:f("compatibility").array(),createdBy:E("created_by"),createdAt:Ne("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Ne("updated_at",{withTimezone:!0}).defaultNow(),archived:Fn("archived").default(!1),archivedAt:Ne("archived_at",{withTimezone:!0}),archivedBy:E("archived_by"),forkedFromId:E("forked_from_id").references(()=>o.id,{onDelete:"set null"}),upstreamVersion:f("upstream_version"),badge:f("badge"),contentHash:f("content_hash"),contextIdentity:f("context_identity"),scanScore:vt("scan_score"),scanFindings:Be("scan_findings"),popularityScore:vt("popularity_score"),sourceUpdatedAt:Ne("source_updated_at",{withTimezone:!0})},e=>[lo("instructions_name_scope_ref_idx").on(e.name,e.scope,e.scopeRef),Ue("idx_instructions_scope").on(e.scope,e.scopeRef),Ue("idx_instructions_created_by").on(e.createdBy),Ue("idx_instructions_context_identity").on(e.createdBy,e.contextIdentity),Ue("idx_instructions_public_recency").on(e.scope,e.sourceUpdatedAt.desc())]),$=uo("instruction_versions",{id:E("id").primaryKey().defaultRandom(),instructionId:E("instruction_id").references(()=>o.id,{onDelete:"cascade"}),versionNumber:vt("version_number").notNull(),content:f("content").notNull(),frontmatter:Be("frontmatter").notNull(),changeSummary:f("change_summary"),createdBy:E("created_by"),createdAt:Ne("created_at",{withTimezone:!0}).defaultNow()},e=>[lo("instruction_versions_instruction_version_idx").on(e.instructionId,e.versionNumber)]);var l=yt("projects",{id:H("id").primaryKey().defaultRandom(),orgId:H("org_id").references(()=>a.id,{onDelete:"cascade"}),name:B("name").notNull(),description:B("description"),githubRepo:B("github_repo"),gitRemoteUrl:B("git_remote_url"),gitRootCommit:B("git_root_commit"),gitRemoteAliases:B("git_remote_aliases").array().notNull().default([]),metadata:Vn("metadata"),createdBy:H("created_by"),createdAt:ve("created_at",{withTimezone:!0}).defaultNow(),updatedAt:ve("updated_at",{withTimezone:!0}).defaultNow()},e=>[ht("projects_org_name_idx").on(e.orgId,e.name),ht("projects_git_remote_url_unique").on(e.gitRemoteUrl).where(Jn`${e.gitRemoteUrl} IS NOT NULL`)]),j=yt("project_instructions",{projectId:H("project_id").references(()=>l.id,{onDelete:"cascade"}).notNull(),instructionId:H("instruction_id").references(()=>o.id,{onDelete:"cascade"}).notNull(),addedAt:ve("added_at",{withTimezone:!0}).defaultNow(),addedBy:H("added_by")},e=>[co({columns:[e.projectId,e.instructionId]})]),po=yt("project_checkouts",{projectId:H("project_id").references(()=>l.id,{onDelete:"cascade"}).notNull(),path:B("path").notNull(),isWorktree:Gn("is_worktree").notNull().default(!1),firstSeen:ve("first_seen",{withTimezone:!0}).notNull().defaultNow(),lastSeen:ve("last_seen",{withTimezone:!0}).notNull().defaultNow()},e=>[co({columns:[e.projectId,e.path]}),ht("project_checkouts_path_unique").on(e.path)]);var m=Yn("agent_runs",{id:He("id").primaryKey().defaultRandom(),userId:He("user_id").notNull().references(()=>s.id,{onDelete:"cascade"}),orgId:He("org_id").references(()=>a.id,{onDelete:"set null"}),projectId:He("project_id").references(()=>l.id,{onDelete:"set null"}),projectPath:Z("project_path"),gitRemote:Z("git_remote"),baseBranch:Z("base_branch"),title:Z("title"),prompt:Z("prompt"),toolSpec:_o("tool_spec").notNull().default([]),autoWorktree:Wn("auto_worktree").notNull().default(!0),status:Z("status").notNull().default("pending"),sessionCount:Qn("session_count").notNull().default(0),metadata:_o("metadata").notNull().default({}),createdAt:It("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:It("updated_at",{withTimezone:!0}).notNull().defaultNow(),completedAt:It("completed_at",{withTimezone:!0})},e=>[Tt("idx_agent_runs_user").on(e.userId),Tt("idx_agent_runs_org_created").on(e.orgId,e.createdAt),Tt("idx_agent_runs_project").on(e.projectId)]);import{pgTable as wt,text as y,timestamp as he,jsonb as F,uuid as w,integer as Fe,uniqueIndex as mo,index as h}from"drizzle-orm/pg-core";var u=wt("sessions",{id:w("id").primaryKey().defaultRandom(),userId:w("user_id").notNull().references(()=>s.id,{onDelete:"cascade"}),externalSessionId:y("external_session_id"),projectId:w("project_id").references(()=>l.id,{onDelete:"set null"}),orgId:w("org_id").references(()=>a.id,{onDelete:"set null"}),tool:y("tool").notNull(),projectPath:y("project_path"),gitBranch:y("git_branch"),startedAt:he("started_at",{withTimezone:!0}).notNull(),endedAt:he("ended_at",{withTimezone:!0}),eventCount:Fe("event_count").default(0),tokenUsage:F("token_usage"),analysis:F("analysis"),analyzedAt:he("analyzed_at",{withTimezone:!0}),analyzedEventCount:Fe("analyzed_event_count"),analyzedTurnCount:Fe("analyzed_turn_count"),metadata:F("metadata").default({}),origin:y("origin").notNull().default("unknown"),runId:w("run_id").references(()=>m.id,{onDelete:"set null"}),createdAt:he("created_at",{withTimezone:!0}).defaultNow()},e=>[h("idx_sessions_user").on(e.userId),h("idx_sessions_tool").on(e.tool),h("idx_sessions_started_at").on(e.startedAt),h("idx_sessions_project").on(e.projectId),h("idx_sessions_org_started_at").on(e.orgId,e.startedAt),h("idx_sessions_run").on(e.runId),mo("idx_sessions_user_external").on(e.userId,e.externalSessionId)]),ee=wt("session_events",{id:w("id").primaryKey().defaultRandom(),sessionId:w("session_id").notNull().references(()=>u.id,{onDelete:"cascade"}),sequence:Fe("sequence").notNull(),eventType:y("event_type").notNull(),content:y("content"),toolName:y("tool_name"),toolInput:F("tool_input"),toolOutput:F("tool_output"),tokenUsage:F("token_usage"),model:y("model"),timestamp:he("timestamp",{withTimezone:!0}).notNull(),metadata:F("metadata").default({})},e=>[mo("session_events_session_sequence_idx").on(e.sessionId,e.sequence),h("idx_session_events_session_id").on(e.sessionId),h("idx_session_events_event_type").on(e.eventType),h("idx_session_events_model").on(e.model)]),S=wt("session_instructions",{sessionId:w("session_id").notNull().references(()=>u.id,{onDelete:"cascade"}),instructionId:w("instruction_id").notNull().references(()=>o.id,{onDelete:"cascade"}),linkMethod:y("link_method").notNull()},e=>[h("idx_session_instructions_instruction_id").on(e.instructionId)]);import{boolean as Xn,date as $n,index as At,integer as Zn,jsonb as er,pgTable as bt,text as N,timestamp as P,uniqueIndex as tr,uuid as te}from"drizzle-orm/pg-core";var fo=bt("announcements",{id:te("id").primaryKey().defaultRandom(),version:N("version").notNull().unique(),releaseDate:$n("release_date").notNull(),subject:N("subject").notNull(),htmlBody:N("html_body").notNull(),textBody:N("text_body").notNull(),sections:er("sections").notNull().default({}),status:N("status").notNull().default("draft"),recipientCount:Zn("recipient_count"),sentAt:P("sent_at",{withTimezone:!0}),sentBy:te("sent_by"),error:N("error"),createdAt:P("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:P("updated_at",{withTimezone:!0}).notNull().defaultNow()},e=>[At("idx_announcements_status").on(e.status),At("idx_announcements_created").on(e.createdAt)]),xo=bt("announcement_deliveries",{id:te("id").primaryKey().defaultRandom(),announcementId:te("announcement_id").notNull(),userId:te("user_id").notNull(),email:N("email").notNull(),status:N("status").notNull().default("pending"),providerId:N("provider_id"),error:N("error"),sentAt:P("sent_at",{withTimezone:!0}),createdAt:P("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[tr("uniq_announcement_deliveries_announcement_user").on(e.announcementId,e.userId),At("idx_announcement_deliveries_user").on(e.userId,e.createdAt)]),go=bt("notification_preferences",{userId:te("user_id").primaryKey(),productAnnouncements:Xn("product_announcements").notNull().default(!0),unsubscribeToken:N("unsubscribe_token").notNull().unique(),unsubscribedAt:P("unsubscribed_at",{withTimezone:!0}),createdAt:P("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:P("updated_at",{withTimezone:!0}).notNull().defaultNow()});import{pgTable as or,text as zt,timestamp as Ge,uuid as Ve,index as No}from"drizzle-orm/pg-core";var A=or("org_invitations",{id:Ve("id").primaryKey().defaultRandom(),orgId:Ve("org_id").notNull().references(()=>a.id,{onDelete:"cascade"}),email:zt("email").notNull(),role:zt("role").notNull().default("member"),teamId:Ve("team_id").references(()=>x.id,{onDelete:"set null"}),invitedBy:Ve("invited_by").notNull().references(()=>s.id),token:zt("token").notNull().unique(),expiresAt:Ge("expires_at",{withTimezone:!0}).notNull(),acceptedAt:Ge("accepted_at",{withTimezone:!0}),revokedAt:Ge("revoked_at",{withTimezone:!0}),createdAt:Ge("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[No("idx_org_invitations_token").on(e.token),No("idx_org_invitations_org").on(e.orgId)]);import{pgTable as nr,text as rr,timestamp as sr,jsonb as ir,uuid as Dt,index as vo}from"drizzle-orm/pg-core";var oe=nr("instruction_events",{id:Dt("id").primaryKey().defaultRandom(),instructionId:Dt("instruction_id").notNull().references(()=>o.id,{onDelete:"cascade"}),eventType:rr("event_type").notNull(),actorId:Dt("actor_id").notNull(),metadata:ir("metadata"),createdAt:sr("created_at",{withTimezone:!0}).defaultNow()},e=>[vo("idx_instruction_events_instruction").on(e.instructionId),vo("idx_instruction_events_type").on(e.eventType)]);import{pgTable as ar,text as ne,timestamp as kt,uuid as Rt,jsonb as dr,uniqueIndex as ur,index as ho}from"drizzle-orm/pg-core";var Je=ar("session_terminal_targets",{id:Rt("id").primaryKey().defaultRandom(),userId:Rt("user_id").notNull().references(()=>s.id,{onDelete:"cascade"}),sessionId:Rt("session_id").references(()=>u.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:dr("metadata").notNull().default({}),lastSeenAt:kt("last_seen_at",{withTimezone:!0}).defaultNow(),createdAt:kt("created_at",{withTimezone:!0}).defaultNow(),updatedAt:kt("updated_at",{withTimezone:!0}).defaultNow()},e=>[ur("idx_session_terminal_targets_user_target").on(e.userId,e.target),ho("idx_session_terminal_targets_session").on(e.sessionId),ho("idx_session_terminal_targets_user_status").on(e.userId,e.status)]);import{boolean as lr,index as Ye,jsonb as yo,pgTable as cr,text as G,timestamp as ye,uuid as Qe,integer as pr}from"drizzle-orm/pg-core";var Io=cr("session_send_jobs",{id:Qe("id").primaryKey().defaultRandom(),userId:Qe("user_id").notNull(),sessionId:Qe("session_id").notNull().references(()=>u.id,{onDelete:"cascade"}),terminalTargetId:Qe("terminal_target_id").references(()=>Je.id,{onDelete:"set null"}),target:G("target").notNull(),message:G("message").notNull(),submit:lr("submit").notNull().default(!0),delivery:G("delivery").notNull().default("live"),status:G("status").notNull().default("pending"),result:yo("result"),error:G("error"),attempts:pr("attempts").notNull().default(0),taskKind:G("task_kind"),payload:yo("payload"),claimedBy:G("claimed_by"),claimedAt:ye("claimed_at",{withTimezone:!0}),leaseExpiresAt:ye("lease_expires_at",{withTimezone:!0}),createdAt:ye("created_at",{withTimezone:!0}).defaultNow(),updatedAt:ye("updated_at",{withTimezone:!0}).defaultNow(),completedAt:ye("completed_at",{withTimezone:!0})},e=>[Ye("idx_session_send_jobs_user").on(e.userId),Ye("idx_session_send_jobs_session").on(e.sessionId),Ye("idx_session_send_jobs_status").on(e.status),Ye("idx_session_send_jobs_pending").on(e.userId,e.status)]);import{pgTable as wo,text as V,timestamp as We,jsonb as Ao,uuid as K,integer as _r,boolean as mr,uniqueIndex as fr,index as To,primaryKey as xr}from"drizzle-orm/pg-core";var v=wo("packs",{id:K("id").primaryKey().defaultRandom(),name:V("name").notNull(),description:V("description").notNull(),scope:V("scope").notNull(),scopeRef:K("scope_ref"),version:V("version").notNull().default("1.0.0"),tags:V("tags").array(),badge:V("badge"),metadata:Ao("metadata"),createdBy:K("created_by"),createdAt:We("created_at",{withTimezone:!0}).defaultNow(),updatedAt:We("updated_at",{withTimezone:!0}).defaultNow(),archived:mr("archived").default(!1),archivedAt:We("archived_at",{withTimezone:!0}),archivedBy:K("archived_by"),forkedFromId:K("forked_from_id").references(()=>v.id,{onDelete:"set null"}),upstreamVersion:V("upstream_version")},e=>[fr("packs_name_scope_ref_idx").on(e.name,e.scope,e.scopeRef),To("idx_packs_scope").on(e.scope,e.scopeRef),To("idx_packs_created_by").on(e.createdBy)]),O=wo("pack_instructions",{packId:K("pack_id").references(()=>v.id,{onDelete:"cascade"}).notNull(),instructionId:K("instruction_id").references(()=>o.id,{onDelete:"cascade"}).notNull(),position:_r("position").notNull().default(0),slotOverrides:Ao("slot_overrides"),addedAt:We("added_at",{withTimezone:!0}).defaultNow(),addedBy:K("added_by")},e=>[xr({columns:[e.packId,e.instructionId]})]);import{pgTable as gr,text as Et,timestamp as Nr,jsonb as vr,uuid as jt,index as re}from"drizzle-orm/pg-core";var se=gr("instruction_usage_events",{id:jt("id").primaryKey().defaultRandom(),instructionId:jt("instruction_id").references(()=>o.id,{onDelete:"set null"}),userId:jt("user_id").notNull(),surface:Et("surface").notNull(),action:Et("action").notNull(),metadata:vr("metadata"),traceId:Et("trace_id"),createdAt:Nr("created_at",{withTimezone:!0}).defaultNow()},e=>[re("idx_usage_events_instruction").on(e.instructionId),re("idx_usage_events_user").on(e.userId),re("idx_usage_events_surface").on(e.surface),re("idx_usage_events_action").on(e.action),re("idx_usage_events_created_at").on(e.createdAt),re("idx_usage_events_user_created").on(e.userId,e.createdAt)]);import{pgTable as hr,text as Xe,timestamp as bo,jsonb as yr,uuid as zo,index as St}from"drizzle-orm/pg-core";var Do=hr("worker_connections",{id:zo("id").primaryKey().defaultRandom(),userId:zo("user_id").notNull(),workerType:Xe("worker_type").notNull().default("mcp"),clientName:Xe("client_name").notNull(),clientVersion:Xe("client_version"),workerVersion:Xe("worker_version"),lastHeartbeat:bo("last_heartbeat",{withTimezone:!0}).notNull().defaultNow(),connectedAt:bo("connected_at",{withTimezone:!0}).notNull().defaultNow(),metadata:yr("metadata")},e=>[St("idx_worker_connections_user").on(e.userId),St("idx_worker_connections_heartbeat").on(e.userId,e.lastHeartbeat),St("idx_worker_connections_type").on(e.userId,e.workerType)]);import{pgTable as Ir,text as $e,timestamp as Tr,jsonb as wr,uuid as ko,index as Ro}from"drizzle-orm/pg-core";var Eo=Ir("cli_setup_events",{id:ko("id").primaryKey().defaultRandom(),userId:ko("user_id").notNull(),deviceId:$e("device_id").notNull(),event:$e("event").notNull(),cliVersion:$e("cli_version"),os:$e("os"),props:wr("props").notNull().default({}),createdAt:Tr("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Ro("idx_cli_setup_events_user").on(e.userId,e.createdAt),Ro("idx_cli_setup_events_device").on(e.deviceId,e.createdAt)]);import{pgTable as Ar,text as J,integer as br,boolean as zr,timestamp as Dr,jsonb as kr,uuid as Rr,index as jo}from"drizzle-orm/pg-core";var So=Ar("cli_error_events",{id:Rr("id").primaryKey().defaultRandom(),deviceId:J("device_id"),event:J("event").notNull(),command:J("command"),statusCode:br("status_code"),message:J("message"),cliVersion:J("cli_version"),os:J("os"),nodeVersion:J("node_version"),proxied:zr("proxied"),props:kr("props").notNull().default({}),createdAt:Dr("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[jo("idx_cli_error_events_created").on(e.createdAt),jo("idx_cli_error_events_device").on(e.deviceId,e.createdAt)]);import{pgTable as Ze,text as b,timestamp as ie,jsonb as I,uuid as T,integer as Ie,index as z}from"drizzle-orm/pg-core";var n=Ze("eval_targets",{id:T("id").primaryKey().defaultRandom(),userId:T("user_id").notNull(),name:b("name").notNull(),type:b("type").notNull(),content:b("content").notNull(),description:b("description").notNull().default(""),metadata:I("metadata").notNull().default({}),version:Ie("version").notNull().default(1),parentId:T("parent_id").references(()=>n.id,{onDelete:"set null"}),createdAt:ie("created_at",{withTimezone:!0}).defaultNow(),updatedAt:ie("updated_at",{withTimezone:!0}).defaultNow()},e=>[z("eval_targets_name_user_idx").on(e.name,e.userId),z("idx_eval_targets_user").on(e.userId),z("idx_eval_targets_type").on(e.type),z("idx_eval_targets_parent").on(e.parentId)]),D=Ze("evals",{id:T("id").primaryKey().defaultRandom(),evalTargetId:T("eval_target_id").notNull().references(()=>n.id,{onDelete:"cascade"}),name:b("name").notNull(),prompt:b("prompt").notNull(),expectedOutput:b("expected_output").notNull().default(""),files:I("files").notNull().default([]),expectations:I("expectations").notNull().default([]),createdAt:ie("created_at",{withTimezone:!0}).defaultNow(),updatedAt:ie("updated_at",{withTimezone:!0}).defaultNow()},e=>[z("idx_evals_target").on(e.evalTargetId)]),C=Ze("eval_runs",{id:T("id").primaryKey().defaultRandom(),evalId:T("eval_id").notNull().references(()=>D.id,{onDelete:"cascade"}),evalTargetId:T("eval_target_id").notNull().references(()=>n.id,{onDelete:"cascade"}),evalTargetVersion:Ie("eval_target_version").notNull(),configuration:b("configuration").notNull(),runNumber:Ie("run_number").notNull().default(1),iteration:Ie("iteration").notNull().default(1),status:b("status").notNull().default("completed"),outputs:I("outputs").notNull().default({}),timing:I("timing").notNull().default({}),grading:I("grading").notNull().default({}),comparison:I("comparison"),createdAt:ie("created_at",{withTimezone:!0}).defaultNow()},e=>[z("idx_eval_runs_eval").on(e.evalId),z("idx_eval_runs_target").on(e.evalTargetId),z("idx_eval_runs_iteration").on(e.evalTargetId,e.iteration)]),ae=Ze("benchmarks",{id:T("id").primaryKey().defaultRandom(),evalTargetId:T("eval_target_id").notNull().references(()=>n.id,{onDelete:"cascade"}),iteration:Ie("iteration").notNull().default(1),runSummary:I("run_summary").notNull().default({}),notes:I("notes").notNull().default([]),feedback:I("feedback"),createdAt:ie("created_at",{withTimezone:!0}).defaultNow()},e=>[z("idx_benchmarks_target").on(e.evalTargetId)]);import{pgTable as Ko,text as Pt,timestamp as Kt,jsonb as Oo,uuid as de,integer as Te,index as et,real as Po}from"drizzle-orm/pg-core";var ue=Ko("trigger_evals",{id:de("id").primaryKey().defaultRandom(),evalTargetId:de("eval_target_id").notNull().references(()=>n.id,{onDelete:"cascade"}),userId:de("user_id").notNull(),queries:Oo("queries").notNull().default([]),status:Pt("status").notNull().default("pending_review"),trainIndices:Te("train_indices").array().default([]),testIndices:Te("test_indices").array().default([]),createdAt:Kt("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Kt("updated_at",{withTimezone:!0}).defaultNow()},e=>[et("idx_trigger_evals_target").on(e.evalTargetId),et("idx_trigger_evals_user").on(e.userId)]),le=Ko("optimization_runs",{id:de("id").primaryKey().defaultRandom(),evalTargetId:de("eval_target_id").notNull().references(()=>n.id,{onDelete:"cascade"}),userId:de("user_id").notNull(),type:Pt("type").notNull(),iteration:Te("iteration").notNull(),inputVersion:Te("input_version").notNull(),outputVersion:Te("output_version"),trainScore:Po("train_score"),testScore:Po("test_score"),analysis:Oo("analysis").notNull().default({}),status:Pt("status").notNull().default("running"),createdAt:Kt("created_at",{withTimezone:!0}).defaultNow()},e=>[et("idx_optimization_runs_target").on(e.evalTargetId),et("idx_optimization_runs_user").on(e.userId)]);import{pgTable as Er,text as q,timestamp as jr,jsonb as we,uuid as Ot,integer as Ct,real as Sr,index as Ae,uniqueIndex as Co}from"drizzle-orm/pg-core";var M=Er("context_snapshots",{id:Ot("id").primaryKey().defaultRandom(),sessionId:Ot("session_id").references(()=>u.id,{onDelete:"cascade"}),userId:Ot("user_id").notNull().references(()=>s.id,{onDelete:"cascade"}),sequence:Ct("sequence").notNull().default(0),provider:q("provider").notNull(),model:q("model").notNull(),systemPrompt:q("system_prompt").notNull(),injectedInstructions:we("injected_instructions").notNull().default([]),messagesSummary:we("messages_summary").notNull(),tools:we("tools").notNull().default([]),systemHash:q("system_hash").notNull(),requestHash:q("request_hash").notNull().default(""),toolsHash:q("tools_hash"),injectedHash:q("injected_hash"),messagesDelta:we("messages_delta").default([]),messagesDeltaRef:q("messages_delta_ref"),maxTokens:Ct("max_tokens"),temperature:Sr("temperature"),estimatedTokens:Ct("estimated_tokens"),capturedAt:jr("captured_at",{withTimezone:!0}).notNull().defaultNow(),metadata:we("metadata").default({})},e=>[Ae("idx_context_snapshots_session").on(e.sessionId),Ae("idx_context_snapshots_user").on(e.userId),Ae("idx_context_snapshots_hash").on(e.systemHash),Ae("idx_context_snapshots_request_hash").on(e.requestHash),Co("idx_snapshots_session_request").on(e.sessionId,e.requestHash),Co("idx_snapshots_session_sequence").on(e.sessionId,e.sequence),Ae("idx_context_snapshots_user_session_captured").on(e.userId,e.sessionId,e.capturedAt.desc())]);import{pgTable as Pr,text as qo,timestamp as Kr,jsonb as Or,integer as Cr,index as qr}from"drizzle-orm/pg-core";var Mo=Pr("content_blobs",{hash:qo("hash").primaryKey(),contentType:qo("content_type").notNull(),content:Or("content").notNull(),sizeBytes:Cr("size_bytes").notNull().default(0),createdAt:Kr("created_at",{withTimezone:!0}).defaultNow()},e=>[qr("idx_content_blobs_type").on(e.contentType)]);import{pgTable as Mr,text as tt,timestamp as be,jsonb as ot,uuid as qt,index as nt,integer as Lr}from"drizzle-orm/pg-core";var ce=Mr("eval_jobs",{id:qt("id").primaryKey().defaultRandom(),userId:qt("user_id").notNull(),evalTargetId:qt("eval_target_id").notNull().references(()=>n.id,{onDelete:"cascade"}),status:tt("status").notNull().default("pending"),config:ot("config").notNull().default({}),progress:ot("progress").notNull().default({}),result:ot("result"),error:tt("error"),attempts:Lr("attempts").notNull().default(0),taskKind:tt("task_kind"),payload:ot("payload"),claimedBy:tt("claimed_by"),claimedAt:be("claimed_at",{withTimezone:!0}),leaseExpiresAt:be("lease_expires_at",{withTimezone:!0}),createdAt:be("created_at",{withTimezone:!0}).defaultNow(),updatedAt:be("updated_at",{withTimezone:!0}).defaultNow(),completedAt:be("completed_at",{withTimezone:!0})},e=>[nt("idx_eval_jobs_user").on(e.userId),nt("idx_eval_jobs_target").on(e.evalTargetId),nt("idx_eval_jobs_status").on(e.status),nt("idx_eval_jobs_pending").on(e.userId,e.status)]);import{pgTable as Ur,text as ze,timestamp as De,jsonb as Lo,uuid as Uo,integer as Br,index as Bo}from"drizzle-orm/pg-core";var Ho=Ur("agent_jobs",{id:Uo("id").primaryKey().defaultRandom(),userId:Uo("user_id").notNull(),taskKind:ze("task_kind").notNull(),status:ze("status").notNull().default("pending"),payload:Lo("payload").notNull(),dedupeKey:ze("dedupe_key"),result:Lo("result"),error:ze("error"),attempts:Br("attempts").notNull().default(0),claimedBy:ze("claimed_by"),claimedAt:De("claimed_at",{withTimezone:!0}),leaseExpiresAt:De("lease_expires_at",{withTimezone:!0}),createdAt:De("created_at",{withTimezone:!0}).notNull().defaultNow(),updatedAt:De("updated_at",{withTimezone:!0}).notNull().defaultNow(),completedAt:De("completed_at",{withTimezone:!0})},e=>[Bo("idx_agent_jobs_claim").on(e.userId,e.status,e.taskKind,e.createdAt),Bo("idx_agent_jobs_dedupe").on(e.userId,e.taskKind,e.dedupeKey)]);import{pgTable as Hr,text as ke,timestamp as Re,jsonb as rt,uuid as Mt,index as st,integer as Fr}from"drizzle-orm/pg-core";var Fo=Hr("insights_jobs",{id:Mt("id").primaryKey().defaultRandom(),userId:Mt("user_id").notNull(),status:ke("status").notNull().default("pending"),projectPath:ke("project_path"),projectId:Mt("project_id").references(()=>l.id,{onDelete:"set null"}),config:rt("config").notNull().default({}),progress:rt("progress").notNull().default({}),result:rt("result"),error:ke("error"),attempts:Fr("attempts").notNull().default(0),taskKind:ke("task_kind"),payload:rt("payload"),claimedBy:ke("claimed_by"),claimedAt:Re("claimed_at",{withTimezone:!0}),leaseExpiresAt:Re("lease_expires_at",{withTimezone:!0}),createdAt:Re("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Re("updated_at",{withTimezone:!0}).defaultNow(),completedAt:Re("completed_at",{withTimezone:!0})},e=>[st("idx_insights_jobs_user").on(e.userId),st("idx_insights_jobs_status").on(e.status),st("idx_insights_jobs_pending").on(e.userId,e.status),st("idx_insights_jobs_project").on(e.projectId)]);import{pgTable as Gr,text as Lt,timestamp as it,uuid as Go,index as Vr,uniqueIndex as Jr}from"drizzle-orm/pg-core";var pe=Gr("api_keys",{id:Go("id").primaryKey().defaultRandom(),userId:Go("user_id").notNull().references(()=>s.id,{onDelete:"cascade"}),name:Lt("name").notNull(),keyHash:Lt("key_hash").notNull(),keyPrefix:Lt("key_prefix").notNull(),lastUsedAt:it("last_used_at",{withTimezone:!0}),expiresAt:it("expires_at",{withTimezone:!0}),revokedAt:it("revoked_at",{withTimezone:!0}),createdAt:it("created_at",{withTimezone:!0}).defaultNow()},e=>[Vr("idx_api_keys_user").on(e.userId),Jr("idx_api_keys_hash").on(e.keyHash)]);import{pgTable as Yr,text as Ut,timestamp as Vo,uuid as Qr,index as Wr}from"drizzle-orm/pg-core";var Jo=Yr("extension_auth_codes",{code:Ut("code").primaryKey(),userId:Qr("user_id").notNull().references(()=>s.id,{onDelete:"cascade"}),editor:Ut("editor"),email:Ut("email"),expiresAt:Vo("expires_at",{withTimezone:!0}).notNull(),createdAt:Vo("created_at",{withTimezone:!0}).defaultNow()},e=>[Wr("idx_ext_auth_codes_expiry").on(e.expiresAt)]);import{pgTable as Xr,text as $r,timestamp as Yo,jsonb as Zr,uuid as Bt,index as Qo}from"drizzle-orm/pg-core";var _e=Xr("eval_conversations",{id:Bt("id").primaryKey().defaultRandom(),evalTargetId:Bt("eval_target_id").notNull().references(()=>n.id,{onDelete:"cascade"}),userId:Bt("user_id").notNull(),messages:Zr("messages").notNull().default([]),status:$r("status").notNull().default("active"),createdAt:Yo("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Yo("updated_at",{withTimezone:!0}).defaultNow()},e=>[Qo("idx_eval_conversations_target").on(e.evalTargetId),Qo("idx_eval_conversations_user").on(e.userId)]);import{pgTable as es,text as k,timestamp as Wo,jsonb as ts,uuid as Ht}from"drizzle-orm/pg-core";var Xo=es("skill_submissions",{id:Ht("id").primaryKey().defaultRandom(),skillId:k("skill_id").notNull(),name:k("name").notNull(),description:k("description").notNull(),category:k("category").notNull(),tools:k("tools").array().notNull(),tags:k("tags").array().default([]),content:k("content").notNull(),status:k("status").notNull().default("pending"),submittedBy:Ht("submitted_by").notNull(),reviewedBy:Ht("reviewed_by"),reviewNote:k("review_note"),metadata:ts("metadata"),createdAt:Wo("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Wo("updated_at",{withTimezone:!0}).defaultNow()});import{pgTable as os,text as Ee,timestamp as $o,jsonb as ns,uuid as rs,uniqueIndex as ss,index as Zo}from"drizzle-orm/pg-core";var en=os("harness_releases",{id:rs("id").primaryKey().defaultRandom(),harness:Ee("harness").notNull(),version:Ee("version").notNull(),publishedAt:$o("published_at",{withTimezone:!0}).notNull(),title:Ee("title"),body:Ee("body"),categories:ns("categories").default({}),url:Ee("url"),createdAt:$o("created_at",{withTimezone:!0}).defaultNow()},e=>[ss("idx_harness_releases_unique").on(e.harness,e.version),Zo("idx_harness_releases_harness").on(e.harness),Zo("idx_harness_releases_published").on(e.publishedAt)]);import{pgTable as is,text as me,timestamp as tn,jsonb as as,uuid as on,index as nn,uniqueIndex as ds}from"drizzle-orm/pg-core";var Ft=is("notifications",{id:on("id").primaryKey().defaultRandom(),userId:on("user_id").notNull(),type:me("type").notNull(),title:me("title").notNull(),body:me("body"),url:me("url"),sourceTable:me("source_table"),sourceId:me("source_id"),metadata:as("metadata").notNull().default({}),readAt:tn("read_at",{withTimezone:!0}),createdAt:tn("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[nn("idx_notifications_user_created").on(e.userId,e.createdAt),nn("idx_notifications_user_unread").on(e.userId),ds("idx_notifications_source_dedup").on(e.userId,e.sourceTable,e.sourceId)]);import{pgTable as us,text as je,timestamp as Se,jsonb as Gt,uuid as Vt,index as at,integer as ls}from"drizzle-orm/pg-core";var fe=us("launch_jobs",{id:Vt("id").primaryKey().defaultRandom(),userId:Vt("user_id").notNull(),tool:je("tool").notNull(),status:je("status").notNull().default("pending"),config:Gt("config").notNull().default({}),result:Gt("result"),error:je("error"),attempts:ls("attempts").notNull().default(0),taskKind:je("task_kind"),payload:Gt("payload"),claimedBy:je("claimed_by"),claimedAt:Se("claimed_at",{withTimezone:!0}),leaseExpiresAt:Se("lease_expires_at",{withTimezone:!0}),createdAt:Se("created_at",{withTimezone:!0}).defaultNow(),updatedAt:Se("updated_at",{withTimezone:!0}).defaultNow(),completedAt:Se("completed_at",{withTimezone:!0}),runId:Vt("run_id").references(()=>m.id,{onDelete:"set null"})},e=>[at("idx_launch_jobs_user").on(e.userId),at("idx_launch_jobs_status").on(e.status),at("idx_launch_jobs_pending").on(e.userId,e.status),at("idx_launch_jobs_run").on(e.runId)]);import{pgTable as rn,uuid as R,text as Pe,real as cs,timestamp as dt,boolean as ps,uniqueIndex as _s,index as Ke}from"drizzle-orm/pg-core";var Jt=rn("instruction_suggestions",{id:R("id").primaryKey().defaultRandom(),userId:R("user_id").notNull().references(()=>s.id,{onDelete:"cascade"}),instructionId:R("instruction_id").notNull().references(()=>o.id,{onDelete:"cascade"}),projectPath:Pe("project_path").notNull(),projectId:R("project_id").references(()=>l.id,{onDelete:"set null"}),score:cs("score").notNull(),reason:Pe("reason").notNull(),generatedAt:dt("generated_at",{withTimezone:!0}).notNull().defaultNow(),isStale:ps("is_stale").notNull().default(!1),dismissedAt:dt("dismissed_at",{withTimezone:!0}),acceptedAt:dt("accepted_at",{withTimezone:!0}),promotedToInstructionId:R("promoted_to_instruction_id").references(()=>o.id,{onDelete:"set null"})},e=>[_s("idx_instruction_suggestions_user_project_instruction").on(e.userId,e.projectPath,e.instructionId),Ke("idx_instruction_suggestions_user_project").on(e.userId,e.projectPath),Ke("idx_instruction_suggestions_user_proj_id").on(e.userId,e.projectId),Ke("idx_instruction_suggestions_generated_at").on(e.generatedAt)]),sn=rn("instruction_suggestion_events",{id:R("id").primaryKey().defaultRandom(),suggestionId:R("suggestion_id").notNull().references(()=>Jt.id,{onDelete:"cascade"}),userId:R("user_id").notNull().references(()=>s.id,{onDelete:"cascade"}),eventType:Pe("event_type").notNull(),tool:Pe("tool"),sessionId:R("session_id"),projectPath:Pe("project_path").notNull(),createdAt:dt("created_at",{withTimezone:!0}).notNull().defaultNow()},e=>[Ke("idx_instruction_suggestion_events_suggestion_id").on(e.suggestionId),Ke("idx_instruction_suggestion_events_user_id").on(e.userId)]);import{pgTable as ms,text as Yt,integer as fs,numeric as Oe,timestamp as Qt,index as xs,primaryKey as gs}from"drizzle-orm/pg-core";var an=ms("model_pricing",{provider:Yt("provider").notNull(),modelId:Yt("model_id").notNull(),inputPerM:Oe("input_per_m").notNull(),outputPerM:Oe("output_per_m").notNull(),cacheReadPerM:Oe("cache_read_per_m").notNull(),cacheWrite5mPerM:Oe("cache_write_5m_per_m").notNull(),cacheWrite1hPerM:Oe("cache_write_1h_per_m").notNull(),contextWindow:fs("context_window"),effectiveFrom:Qt("effective_from",{withTimezone:!0}).notNull(),effectiveUntil:Qt("effective_until",{withTimezone:!0}),source:Yt("source").notNull(),verifiedAt:Qt("verified_at",{withTimezone:!0})},e=>[gs({columns:[e.provider,e.modelId,e.effectiveFrom]}),xs("idx_model_pricing_active").on(e.provider,e.modelId,e.effectiveFrom.desc())]);import{pgTable as Ns,text as Y,numeric as dn,timestamp as un,uuid as ln,jsonb as vs,index as cn}from"drizzle-orm/pg-core";var pn=Ns("limit_observations",{id:ln("id").primaryKey().defaultRandom(),observedAt:un("observed_at",{withTimezone:!0}).notNull().defaultNow(),provider:Y("provider").notNull(),plan:Y("plan").notNull(),limitType:Y("limit_type").notNull(),value:dn("value").notNull(),unit:Y("unit").notNull(),comparator:Y("comparator").notNull().default("="),resetsAt:un("resets_at",{withTimezone:!0}),sourceType:Y("source_type").notNull(),sourceUrl:Y("source_url"),sourceEvidence:vs("source_evidence"),confidence:dn("confidence").notNull(),userId:ln("user_id")},e=>[cn("idx_limit_obs_lookup").on(e.provider,e.plan,e.limitType,e.observedAt.desc()),cn("idx_limit_obs_user").on(e.userId,e.observedAt.desc())]);import{pgTable as hs,text as ut,timestamp as ys,uuid as Is,jsonb as Ts,boolean as ws,uniqueIndex as As}from"drizzle-orm/pg-core";var _n=hs("provider_docs_snapshots",{id:Is("id").primaryKey().defaultRandom(),fetchedAt:ys("fetched_at",{withTimezone:!0}).notNull().defaultNow(),provider:ut("provider").notNull(),docUrl:ut("doc_url").notNull(),contentHash:ut("content_hash").notNull(),content:ut("content").notNull(),parseSuccess:ws("parse_success").notNull(),parseErrors:Ts("parse_errors")},e=>[As("idx_docs_dedup").on(e.provider,e.docUrl,e.contentHash)]);import{pgTable as bs,text as lt,numeric as mn,timestamp as fn,uuid as zs,primaryKey as Ds,index as ks}from"drizzle-orm/pg-core";var xn=bs("plan_limits_active",{provider:lt("provider").notNull(),plan:lt("plan").notNull(),limitType:lt("limit_type").notNull(),value:mn("value").notNull(),unit:lt("unit").notNull(),effectiveFrom:fn("effective_from",{withTimezone:!0}).notNull(),effectiveUntil:fn("effective_until",{withTimezone:!0}),confidence:mn("confidence").notNull(),sourceObservationIds:zs("source_observation_ids").array().notNull()},e=>[Ds({columns:[e.provider,e.plan,e.limitType,e.effectiveFrom]}),ks("idx_plan_limits_lookup").on(e.provider,e.plan,e.limitType,e.effectiveFrom.desc())]);import{pgTable as Rs,text as Wt,timestamp as Es,uuid as gn,jsonb as js,index as Ss}from"drizzle-orm/pg-core";var Nn=Rs("alert_dispatches",{id:gn("id").primaryKey().defaultRandom(),userId:gn("user_id").notNull(),alertKey:Wt("alert_key").notNull(),severity:Wt("severity").notNull(),lastDispatchedAt:Es("last_dispatched_at",{withTimezone:!0}).notNull().defaultNow(),lastState:js("last_state").notNull(),channel:Wt("channel").notNull()},e=>[Ss("idx_alert_user_key").on(e.userId,e.alertKey,e.lastDispatchedAt.desc())]);import{drizzle as Tn}from"drizzle-orm/postgres-js";import wn from"postgres";var ct={};Bn(ct,{agentJobs:()=>Ho,agentRuns:()=>m,agentRunsRelations:()=>Js,alertDispatches:()=>Nn,announcementDeliveries:()=>xo,announcements:()=>fo,apiKeys:()=>pe,apiKeysRelations:()=>Ks,benchmarks:()=>ae,benchmarksRelations:()=>ni,cliErrorEvents:()=>So,cliSetupEvents:()=>Eo,contentBlobs:()=>Mo,contextSnapshots:()=>M,contextSnapshotsRelations:()=>di,evalConversations:()=>_e,evalConversationsRelations:()=>ai,evalJobs:()=>ce,evalJobsRelations:()=>ii,evalRuns:()=>C,evalRunsRelations:()=>oi,evalTargets:()=>n,evalTargetsRelations:()=>ei,evals:()=>D,evalsRelations:()=>ti,extensionAuthCodes:()=>Jo,harnessReleases:()=>en,insightsJobs:()=>Fo,instructionEvents:()=>oe,instructionEventsRelations:()=>Bs,instructionSuggestionEvents:()=>sn,instructionSuggestions:()=>Jt,instructionUsageEvents:()=>se,instructionUsageEventsRelations:()=>Zs,instructionVersions:()=>$,instructionVersionsRelations:()=>Hs,instructions:()=>o,instructionsRelations:()=>Us,launchJobs:()=>fe,launchJobsRelations:()=>Ys,limitObservations:()=>pn,modelPricing:()=>an,notificationPreferences:()=>go,notifications:()=>Ft,optimizationRuns:()=>le,optimizationRunsRelations:()=>si,orgInvitations:()=>A,orgInvitationsRelations:()=>qs,organizations:()=>a,organizationsRelations:()=>Os,packInstructions:()=>O,packInstructionsRelations:()=>$s,packs:()=>v,packsRelations:()=>Xs,planLimitsActive:()=>xn,profiles:()=>s,profilesRelations:()=>Ps,projectCheckouts:()=>po,projectInstructions:()=>j,projectInstructionsRelations:()=>Gs,projects:()=>l,projectsRelations:()=>Fs,providerDocsSnapshots:()=>_n,sessionEvents:()=>ee,sessionEventsRelations:()=>Qs,sessionInstructions:()=>S,sessionInstructionsRelations:()=>Ws,sessionSendJobs:()=>Io,sessionTerminalTargets:()=>Je,sessions:()=>u,sessionsRelations:()=>Vs,skillSubmissions:()=>Xo,teams:()=>x,teamsRelations:()=>Cs,triggerEvals:()=>ue,triggerEvalsRelations:()=>ri,userOrganizations:()=>W,userOrganizationsRelations:()=>Ms,userTeams:()=>X,userTeamsRelations:()=>Ls,workerConnections:()=>Do});import{relations as i}from"drizzle-orm";var Ps=i(s,({many:e})=>({sessions:e(u),contextSnapshots:e(M),apiKeys:e(pe)})),Ks=i(pe,({one:e})=>({profile:e(s,{fields:[pe.userId],references:[s.id]})})),Os=i(a,({many:e})=>({teams:e(x),userOrganizations:e(W),projects:e(l),invitations:e(A)})),Cs=i(x,({one:e,many:t})=>({organization:e(a,{fields:[x.orgId],references:[a.id]}),userTeams:t(X),invitations:t(A)})),qs=i(A,({one:e})=>({organization:e(a,{fields:[A.orgId],references:[a.id]}),team:e(x,{fields:[A.teamId],references:[x.id]}),inviter:e(s,{fields:[A.invitedBy],references:[s.id]})})),Ms=i(W,({one:e})=>({organization:e(a,{fields:[W.orgId],references:[a.id]})})),Ls=i(X,({one:e})=>({team:e(x,{fields:[X.teamId],references:[x.id]})})),Us=i(o,({one:e,many:t})=>({versions:t($),projectInstructions:t(j),events:t(oe),usageEvents:t(se),sessionInstructions:t(S),packInstructions:t(O),forkedFrom:e(o,{fields:[o.forkedFromId],references:[o.id]})})),Bs=i(oe,({one:e})=>({instruction:e(o,{fields:[oe.instructionId],references:[o.id]})})),Hs=i($,({one:e})=>({instruction:e(o,{fields:[$.instructionId],references:[o.id]})})),Fs=i(l,({one:e,many:t})=>({organization:e(a,{fields:[l.orgId],references:[a.id]}),projectInstructions:t(j),sessions:t(u)})),Gs=i(j,({one:e})=>({project:e(l,{fields:[j.projectId],references:[l.id]}),instruction:e(o,{fields:[j.instructionId],references:[o.id]})})),Vs=i(u,({one:e,many:t})=>({profile:e(s,{fields:[u.userId],references:[s.id]}),project:e(l,{fields:[u.projectId],references:[l.id]}),run:e(m,{fields:[u.runId],references:[m.id]}),events:t(ee),sessionInstructions:t(S),contextSnapshots:t(M)})),Js=i(m,({one:e,many:t})=>({profile:e(s,{fields:[m.userId],references:[s.id]}),organization:e(a,{fields:[m.orgId],references:[a.id]}),project:e(l,{fields:[m.projectId],references:[l.id]}),sessions:t(u),launchJobs:t(fe)})),Ys=i(fe,({one:e})=>({run:e(m,{fields:[fe.runId],references:[m.id]})})),Qs=i(ee,({one:e})=>({session:e(u,{fields:[ee.sessionId],references:[u.id]})})),Ws=i(S,({one:e})=>({session:e(u,{fields:[S.sessionId],references:[u.id]}),instruction:e(o,{fields:[S.instructionId],references:[o.id]})})),Xs=i(v,({one:e,many:t})=>({packInstructions:t(O),forkedFrom:e(v,{fields:[v.forkedFromId],references:[v.id]})})),$s=i(O,({one:e})=>({pack:e(v,{fields:[O.packId],references:[v.id]}),instruction:e(o,{fields:[O.instructionId],references:[o.id]})})),Zs=i(se,({one:e})=>({instruction:e(o,{fields:[se.instructionId],references:[o.id]})})),ei=i(n,({one:e,many:t})=>({parent:e(n,{fields:[n.parentId],references:[n.id]}),evals:t(D),evalRuns:t(C),benchmarks:t(ae),triggerEvals:t(ue),optimizationRuns:t(le),evalJobs:t(ce),evalConversations:t(_e)})),ti=i(D,({one:e,many:t})=>({evalTarget:e(n,{fields:[D.evalTargetId],references:[n.id]}),runs:t(C)})),oi=i(C,({one:e})=>({eval:e(D,{fields:[C.evalId],references:[D.id]}),evalTarget:e(n,{fields:[C.evalTargetId],references:[n.id]})})),ni=i(ae,({one:e})=>({evalTarget:e(n,{fields:[ae.evalTargetId],references:[n.id]})})),ri=i(ue,({one:e})=>({evalTarget:e(n,{fields:[ue.evalTargetId],references:[n.id]})})),si=i(le,({one:e})=>({evalTarget:e(n,{fields:[le.evalTargetId],references:[n.id]})})),ii=i(ce,({one:e})=>({evalTarget:e(n,{fields:[ce.evalTargetId],references:[n.id]})})),ai=i(_e,({one:e})=>({evalTarget:e(n,{fields:[_e.evalTargetId],references:[n.id]})})),di=i(M,({one:e})=>({session:e(u,{fields:[M.sessionId],references:[u.id]}),profile:e(s,{fields:[M.userId],references:[s.id]})}));var Ce=0,vn=0,qe=0,hn=0;var ui=0;function Xt(){Ce++,Ce>vn&&(vn=Ce)}p(Xt,"trackDbOpStart");function $t(){Ce>0&&Ce--}p($t,"trackDbOpEnd");function Zt(){qe++,qe>hn&&(hn=qe)}p(Zt,"trackHeavyDbOpStart");function eo(){qe>0&&qe--}p(eo,"trackHeavyDbOpEnd");function yn(){ui++}p(yn,"recordQueryDeadline");var _t,ft,to=!1,pt;var In,xt,mt;function An(e){let t=process.env[e];if(!t)throw new Error(`Missing required env var: ${e}`);return t}p(An,"getEnv");function bn(){if(to)throw new Error("getDb() called after closeDb(): the connection pool is closed for shutdown. Stop issuing queries (timers/requests) before draining the pool.");if(!_t){let e=process.env.PG_APPLICATION_NAME||"rulemetric",t=Number(process.env.PG_POOL_MAX)||3,r=Number(process.env.PG_CONNECT_TIMEOUT_S)||10,d=Number(process.env.PG_STATEMENT_TIMEOUT_MS)||0,c=Number(process.env.PG_IDLE_TIMEOUT)||5,_=Number(process.env.PG_KEEP_ALIVE_S)||60;ft=wn(An("DATABASE_URL"),{prepare:!1,max:t,connect_timeout:r,idle_timeout:c,keep_alive:_,max_lifetime:300,connection:{application_name:e,...d>0?{statement_timeout:d}:{}}}),_t=Tn(ft,{schema:ct})}return _t}p(bn,"getDb");function zn(){if(to)throw new Error("getHeavyDb() called after closeDb(): the connection pool is closed for shutdown. Stop issuing queries (timers/requests) before draining the pool.");if(!mt){let e=(process.env.PG_APPLICATION_NAME||"rulemetric")+":heavy",t=Number(process.env.PG_HEAVY_POOL_MAX)||2;xt=wn(An("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}}),mt=Tn(xt,{schema:ct})}return mt}p(zn,"getHeavyDb");async function li(){if(pt)return pt;to=!0;let e=ft,t=In,r=xt;return ft=void 0,_t=void 0,In=void 0,xt=void 0,mt=void 0,pt=Promise.allSettled([e?e.end({timeout:5}):Promise.resolve(),t?t.end({timeout:5}):Promise.resolve(),r?r.end({timeout:5}):Promise.resolve()]).then(()=>{}),pt}p(li,"closeDb");var ci=new Set(["CONNECT_TIMEOUT","ETIMEDOUT","ENOTFOUND","ECONNREFUSED","EAI_AGAIN"]);function Dn(e){let t=e,r=t?.code??t?.cause?.code??t?.errno;return r!==void 0&&ci.has(r)}p(Dn,"isRetryableConnectError");var pi=new Set(["CONNECTION_CLOSED","ECONNRESET","EPIPE"]);function kn(e){let t=e,r=t?.code??t?.cause?.code??t?.errno;return r!==void 0&&pi.has(r)}p(kn,"isRetryableResetError");async function Rn(e,t={}){let r=t.attempts??3,d=t.baseMs??100,c;for(let _=0;_<r;_++)try{return await e()}catch(g){c=g;let xe=Dn(g)||t.retryResets===!0&&kn(g);if(_===r-1||!xe)throw g;await new Promise(L=>setTimeout(L,d*2**_))}throw c}p(Rn,"withDbRetry");var gt=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 En(){let e=Number(process.env.PG_QUERY_DEADLINE_MS);return Number.isFinite(e)&&e>=0?e:2e4}p(En,"queryDeadlineMs");function _i(e,t){let r,d=new Promise((c,_)=>{r=setTimeout(()=>{yn(),_(new gt(t))},t);let g=r;typeof g.unref=="function"&&g.unref()});return Promise.race([e,d]).finally(()=>clearTimeout(r))}p(_i,"raceWithDeadline");var jn=new Set(["select","selectDistinct","selectDistinctOn","insert","update","delete","execute","with","$count","refreshMaterializedView"]),Sn=new Set(["select","selectDistinct","selectDistinctOn","$count"]);function oo(e,t=!1,r=0,d=!1){return e===null||typeof e!="object"&&typeof e!="function"?e:new Proxy(e,{get(c,_,g){if(_==="then"){let L=Reflect.get(c,_,g);return typeof L!="function"?L:(On,Cn)=>{let qn=d?Zt:Xt,Mn=d?eo:$t;qn();let no=Rn(()=>new Promise((Ln,Un)=>L.call(c,Ln,Un)),{retryResets:t});return(r>0?_i(no,r):no).finally(Mn).then(On,Cn)}}let xe=Reflect.get(c,_,g);return typeof xe=="function"?(...L)=>oo(xe.apply(c,L),t,r,d):xe}})}p(oo,"wrapBuilder");function Pn(e,t=!1){let r=t?Zt:Xt,d=t?eo:$t;r();try{return Promise.resolve(e()).finally(d)}catch(c){throw d(),c}}p(Pn,"gaugeTransaction");var Kn=new Proxy({},{get(e,t){let r=bn(),d=r[t];if(typeof t=="string"&&jn.has(t)&&typeof d=="function"){let c=Sn.has(t),_=En();return(...g)=>oo(d.apply(r,g),c,_)}return t==="transaction"&&typeof d=="function"?(...c)=>Pn(()=>d.apply(r,c)):d}}),mi=new Proxy({},{get(e,t){let r=zn(),d=r[t];if(typeof t=="string"&&jn.has(t)&&typeof d=="function"){let c=Sn.has(t);return(..._)=>oo(d.apply(r,_),c,0,!0)}return t==="transaction"&&typeof d=="function"?(...c)=>Pn(()=>d.apply(r,c),!0):d}});export{s as a,m as b,u as c,ee as d,fo as e,xo as f,go as g,bn as h,li as i};
@@ -0,0 +1,24 @@
1
+ import{a as $}from"./chunk-DSO2U4Y6.js";import{a as y}from"./chunk-CADKBP3D.js";import{a as w}from"./chunk-MGHFDHHM.js";import{e as h,f}from"./chunk-H2ORWIEY.js";import{a as v}from"./chunk-ZLLER3HP.js";async function I(t,r,u){let{conversationId:a,messageId:d,messageContent:c}=t,n=await h(`/api/eval-targets/${r}`),o=await h(`/api/eval-targets/${r}/evals`),e=await h(`/api/eval-conversations/${a}/messages`),s=e.findIndex(l=>l.id===d);if(s>=0&&e.slice(s+1).some(p=>p.role==="assistant"&&(p.type==="results"||p.type==="proposal"||p.type==="generated"||p.type==="text"))){u(`Message ${d} already processed \u2014 skipping (idempotency guard)`);return}let i=v(async(l,p,m)=>{await f(`/api/eval-conversations/${a}/messages/assistant`,{content:l,type:p,data:m})},"postMessage"),g=await C(n,o,e,c,u);u(`Action: ${g.action}`);try{switch(g.action){case"run_evals":await x(n,o,a,i,u);break;case"generate_cases":await _(n,r,a,i,u);break;case"analyze_results":case"propose_changes":await k(n,o,e,c,a,i,u);break;case"respond":await i(g.response,"text");break}}catch(l){let p=l instanceof Error?l.message:String(l);throw await i(`Something went wrong: ${p}`,"text").catch(()=>{}),l}}v(I,"processConversationJob");async function C(t,r,u,a,d){let c=u.slice(-10).map(e=>`${e.role}: ${e.content.slice(0,200)}`).join(`
2
+ `),n=`You are an eval assistant. Decide what action to take based on the user's message.
3
+
4
+ ## Current State
5
+ - Eval target: "${t.name}" v${t.version} (${t.type})
6
+ - Eval cases: ${r.length} defined${r.length>0?` (${r.map(e=>e.name).join(", ")})`:""}
7
+ - Content length: ${t.content.length} chars
8
+
9
+ ## Recent Conversation
10
+ ${c}
11
+
12
+ ## User's Latest Message
13
+ ${a}
14
+
15
+ ## Available Actions
16
+ - run_evals: Run all eval cases against the current version (target content injected; no baseline arm). Choose this when the user wants to test, evaluate, or see how the instruction performs.
17
+ - generate_cases: Auto-generate eval test cases from the instruction content. Choose this when there are no eval cases (${r.length} currently) or user asks to create/generate tests.
18
+ - analyze_results: Analyze recent eval failures and propose improvements based on user feedback. Choose this when user gives qualitative feedback like "this is wrong", "missing X", etc.
19
+ - propose_changes: Propose specific content edits based on conversation. Choose this when user asks for improvements or changes.
20
+ - respond: Just answer a question without running any evals. Choose this for informational questions.
21
+
22
+ Respond with ONLY valid JSON:
23
+ {"action": "run_evals", "response": "What you want to say to the user", "params": {}}`,o=await w({prompt:n,timeout:3e4});try{let e=o.output.trim(),s=e.match(/\{[\s\S]*\}/);return s&&(e=s[0]),JSON.parse(e)}catch{d("Failed to parse action decision, defaulting to respond");let e=a.toLowerCase();return e.includes("run")||e.includes("test")||e.includes("eval")?{action:"run_evals",response:"Running evals now..."}:e.includes("generate")||e.includes("create")||r.length===0&&e.includes("start")?{action:"generate_cases",response:"Generating test cases..."}:{action:"respond",response:"I can help you run evals, generate test cases, or analyze results. What would you like to do?"}}}v(C,"decideAction");async function x(t,r,u,a,d){if(r.length===0){await a("No eval cases exist yet. Would you like me to generate some from the instruction content?","text");return}await a(`Running ${r.length} evals against "${t.name}" v${t.version}...`,"status");let c=[];for(let e of r){d(`Running: ${e.name} (with_target)`);let s=await w({prompt:e.prompt,targetContent:t.content,timeout:12e4}),i=!1,g="",l={};!s.error&&e.expectations.length>0&&(l=await y({prompt:e.prompt,output:s.output,expectations:e.expectations,timeout:12e4}),i=l?.summary?.pass_rate>=1,g=l?.expectations?.map(m=>`${m.passed?"PASS":"FAIL"}: ${m.text} \u2014 ${m.evidence}`).join(`
24
+ `)??"");try{await f("/api/eval-runs",{evalId:e.id,evalTargetId:t.id,evalTargetVersion:t.version,configuration:"with_target",status:s.error?"failed":"completed",outputs:s.error?{error:s.error}:{transcript:s.output},timing:{duration_ms:s.durationMs,total_tokens:s.totalTokens},grading:l})}catch(p){d(`eval-run persist failed (non-fatal): ${p instanceof Error?p.message:String(p)}`)}c.push({evalName:e.name,passed:i,output:s.error??s.output.slice(0,2e3),expectations:e.expectations,evidence:g,configuration:"with_target"})}let n=c.filter(e=>e.passed).length,o=c.length;await a(`${n} of ${o} evals passed (${Math.round(n/o*100)}%)`,"results",{summary:{passed:n,failed:o-n,total:o,passRate:n/o},results:c.map(e=>({evalName:e.evalName,passed:e.passed,output:e.output,expectations:e.expectations,evidence:e.evidence}))})}v(x,"handleRunEvals");async function _(t,r,u,a,d){await a("Generating eval cases from instruction content...","status"),d("Calling eval-from-context endpoint");let c=await f("/api/eval-from-context",{evalTargetId:t.id,name:t.name,type:t.type,content:t.content,config:{skipBaseline:!1,skipGrading:!1}}),n=await h(`/api/eval-targets/${t.id}/evals`);await a(c.evalCasesCreated>0?`Generated ${c.evalCasesCreated} eval cases. Review them below:`:`This target already has ${n.length} eval case${n.length===1?"":"s"}:`,"generated",{cases:n.map(o=>({id:o.id,name:o.name,prompt:o.prompt,expectations:o.expectations}))})}v(_,"handleGenerateCases");async function k(t,r,u,a,d,c,n){await c("Analyzing results and preparing improvements...","status");let e=[...u].reverse().find(i=>i.type==="results")?.data?.results?.map(i=>({evalName:i.evalName,prompt:"",expectations:i.expectations??[],grading:{summary:{pass_rate:i.passed?1:0},expectations:i.expectations?.map(g=>({text:g,passed:i.passed,evidence:i.evidence??""}))}}))??[];n(`Analyzing ${e.length} eval results with user feedback`);let s=await $({content:t.content,evalResults:e,model:void 0,timeout:12e4,userFeedback:a});await c(s.overallAssessment,"proposal",{suggestions:s.suggestions,proposedContent:s.proposedContent,fromVersion:t.version})}v(k,"handleAnalyzeAndPropose");export{I as a};
@@ -1,3 +1,3 @@
1
- import{A as u,D as d}from"./chunk-O7ZMHCMG.js";import{a as s}from"./chunk-ZLLER3HP.js";import{existsSync as l,readFileSync as p,unlinkSync as y,writeFileSync as a}from"node:fs";import{homedir as h}from"node:os";import{join as S}from"node:path";function f(){return{vscode:u(),cursor:d(),marker:S(h(),".config","rulemetric","editor-proxy-unpinned.json")}}s(f,"defaultEditorPinPaths");function m(r,t){return r===`http://localhost:${t}`||r===`http://127.0.0.1:${t}`}s(m,"isOurProxyValue");function c(r){if(!l(r))return null;try{return JSON.parse(p(r,"utf-8"))}catch{return null}}s(c,"readSettings");function v(r,t=f()){let o=[];for(let e of["vscode","cursor"]){let n=t[e],i=c(n);if(!(!i||!m(i["http.proxy"],r))){delete i["http.proxy"],i["http.proxyStrictSSL"]===!1&&delete i["http.proxyStrictSSL"];try{a(n,JSON.stringify(i,null,2)+`
1
+ import{A as u,D as d}from"./chunk-2JRDG4LJ.js";import{a as s}from"./chunk-ZLLER3HP.js";import{existsSync as l,readFileSync as p,unlinkSync as y,writeFileSync as a}from"node:fs";import{homedir as h}from"node:os";import{join as S}from"node:path";function f(){return{vscode:u(),cursor:d(),marker:S(h(),".config","rulemetric","editor-proxy-unpinned.json")}}s(f,"defaultEditorPinPaths");function m(r,t){return r===`http://localhost:${t}`||r===`http://127.0.0.1:${t}`}s(m,"isOurProxyValue");function c(r){if(!l(r))return null;try{return JSON.parse(p(r,"utf-8"))}catch{return null}}s(c,"readSettings");function v(r,t=f()){let o=[];for(let e of["vscode","cursor"]){let n=t[e],i=c(n);if(!(!i||!m(i["http.proxy"],r))){delete i["http.proxy"],i["http.proxyStrictSSL"]===!1&&delete i["http.proxyStrictSSL"];try{a(n,JSON.stringify(i,null,2)+`
2
2
  `),o.push(e)}catch{}}}if(o.length>0){let e=c(t.marker),n=[...new Set([...e?.editors??[],...o])];try{a(t.marker,JSON.stringify({editors:n,gatewayPort:r,unpinnedAt:new Date().toISOString()},null,2)+`
3
3
  `)}catch{}}return o}s(v,"unpinEditorProxies");function A(r,t=f()){let o=c(t.marker);if(!o||!Array.isArray(o.editors))return[];let e=[];for(let n of o.editors)if(!(n!=="vscode"&&n!=="cursor"))try{r(n),e.push(n)}catch{}try{y(t.marker)}catch{}return e}s(A,"repinEditorProxies");export{f as a,v as b,A as c};
@@ -0,0 +1 @@
1
+ import{c as m,d as p}from"./chunk-ZL4MZMUK.js";import{a as C}from"./chunk-N7TGRFVZ.js";import{e as c,h as f}from"./chunk-H4SV7FN4.js";import{a as r}from"./chunk-ZLLER3HP.js";import*as a from"node:fs/promises";import*as g from"node:path";import{eq as b}from"drizzle-orm";async function v(e){let n=e;for(let t=0;t<50;t++){try{return await a.stat(g.join(n,"pnpm-workspace.yaml")),n}catch{}let i=g.dirname(n);if(i===n)return null;n=i}return null}r(v,"findRepoRoot");async function k(e){if(e)try{return await a.readFile(e,"utf-8")}catch{return null}let n=await v(process.cwd())??process.cwd(),t=g.join(n,"CHANGELOG.md");try{return await a.readFile(t,"utf-8")}catch{return null}}r(k,"readChangelog");var _="https://rulemetric.com";function D(e){let n=e.date??new Date().toISOString().slice(0,10),t=C({version:e.version,date:n,sections:e.sections,unsubscribeUrl:"{{unsubscribe_url}}",recipientName:"{{recipient_name}}",productUrl:_});return{version:e.version,releaseDate:n,subject:t.subject,htmlBody:t.html,textBody:t.text,sections:e.sections}}r(D,"renderRow");async function R(e={}){let n=e.db??f(),t=e.logger??{info:r(s=>console.log(s),"info"),warn:r(s=>console.warn(s),"warn")},i=await k(e.changelogPath);if(i===null)return t.info("[cron_check_changelog] CHANGELOG.md not found; nothing to do"),{createdCount:0,skippedCount:0};let y=m(i),h=p(y);if(h.length===0)return t.info("[cron_check_changelog] No announceable entries; nothing to do"),{createdCount:0,skippedCount:0};let d=0,l=0;for(let s of h){if((await n.select({id:c.id}).from(c).where(b(c.version,s.version)).limit(1)).length>0){l++;continue}let o=D(s);try{await n.insert(c).values({version:o.version,releaseDate:o.releaseDate,subject:o.subject,htmlBody:o.htmlBody,textBody:o.textBody,sections:o.sections,status:"draft"}),d++,t.info(`[cron_check_changelog] Created draft announcement for ${o.version}`)}catch(u){let w=u instanceof Error?u.message:String(u);if(/duplicate key|unique/i.test(w)){l++;continue}throw u}}return t.info(`[cron_check_changelog] Done: created ${d}, skipped ${l}`),{createdCount:d,skippedCount:l}}r(R,"processChangelog");export{R as a};
@@ -1,4 +1,4 @@
1
- import{d as b,f as y}from"./chunk-RTWRHIKY.js";import{d as M,e as w}from"./chunk-TIQ7DQ3M.js";import{a as u}from"./chunk-ZLLER3HP.js";var $={anthropic:["https://platform.claude.com/docs/en/about-claude/pricing.md"],openai:["https://platform.openai.com/docs/pricing"]},R=.7,v=16e3,x=["You extract LLM API pricing from a provider pricing page.","You will be given the page text in <data> tags and, in this system prompt,","a list of model ids to find. For EACH requested model id, return its","published USD price per 1,000,000 tokens.","","Rules:","- Only report a model if you can find its rate ON THE PAGE. If it is not on"," the page, set found=false and omit the numbers \u2014 never guess from memory.","- inputPerM and outputPerM are the standard (non-batch, non-priority) rates.","- cacheReadPerM: the cached/discounted-input rate if published, else omit.","- For Anthropic models ONLY, if cache-write rates are not explicitly listed,"," compute them as cacheWrite5mPerM = inputPerM * 1.25 and"," cacheWrite1hPerM = inputPerM * 2.0. For all other providers, omit them.","- confidence is 0..1: how sure you are the numbers are correct for THIS id.","- contextWindow in tokens if stated, else omit.","","Respond with ONLY a JSON object of the form:",'{"rates":[{"modelId":"...","found":true,"confidence":0.9,"inputPerM":5,"outputPerM":25,"cacheReadPerM":0.5,"contextWindow":1000000}]}'].join(`
1
+ import{d as b,f as y}from"./chunk-RTWRHIKY.js";import{e as M,f as w}from"./chunk-H2ORWIEY.js";import{a as u}from"./chunk-ZLLER3HP.js";var $={anthropic:["https://platform.claude.com/docs/en/about-claude/pricing.md"],openai:["https://platform.openai.com/docs/pricing"]},R=.7,v=16e3,x=["You extract LLM API pricing from a provider pricing page.","You will be given the page text in <data> tags and, in this system prompt,","a list of model ids to find. For EACH requested model id, return its","published USD price per 1,000,000 tokens.","","Rules:","- Only report a model if you can find its rate ON THE PAGE. If it is not on"," the page, set found=false and omit the numbers \u2014 never guess from memory.","- inputPerM and outputPerM are the standard (non-batch, non-priority) rates.","- cacheReadPerM: the cached/discounted-input rate if published, else omit.","- For Anthropic models ONLY, if cache-write rates are not explicitly listed,"," compute them as cacheWrite5mPerM = inputPerM * 1.25 and"," cacheWrite1hPerM = inputPerM * 2.0. For all other providers, omit them.","- confidence is 0..1: how sure you are the numbers are correct for THIS id.","- contextWindow in tokens if stated, else omit.","","Respond with ONLY a JSON object of the form:",'{"rates":[{"modelId":"...","found":true,"confidence":0.9,"inputPerM":5,"outputPerM":25,"cacheReadPerM":0.5,"contextWindow":1000000}]}'].join(`
2
2
  `);async function C(f){try{let n=await fetch(f,{headers:{accept:"text/plain, text/markdown, text/html"}});if(!n.ok)return null;let i=await n.text();return i.length>v?i.slice(0,v):i}catch{return null}}u(C,"fetchPage");var L=u(async(f,n)=>{let i=await M("/api/pricing/coverage"),I=[...i.unpriced,...i.stale],m=new Map;for(let r of I)m.set(`${r.provider}::${r.modelId}`,r);let a=[...m.values()];if(a.length===0)return n.logger.info("[cron-refresh-pricing] coverage clean \u2014 nothing unpriced or stale"),{status:"clean",checked:i.unpriced.length+i.stale.length};if(b()==="none")return n.logger.warn(`[cron-refresh-pricing] ${a.length} model(s) need pricing but no LLM backend (install the claude CLI or set ANTHROPIC_API_KEY) \u2014 skipping`),{status:"no-llm",pending:a.length};let d=new Map;for(let r of a){let o=d.get(r.provider)??[];o.push(r.modelId),d.set(r.provider,o)}let t={written:0,unchanged:0,flagged:0,rejected:0,skipped:0},c=[];for(let[r,o]of d){let h=$[r];if(!h){n.logger.warn(`[cron-refresh-pricing] no pricing source configured for provider '${r}' (${o.length} model(s)) \u2014 skipping`),t.skipped+=o.length;continue}let p="",l="";for(let e of h){let s=await C(e);s&&(p+=`
3
3
 
4
4
  === ${e} ===
@@ -1,4 +1,4 @@
1
- import{a as u}from"./chunk-MGHFDHHM.js";import{a as l}from"./chunk-ZLLER3HP.js";var w=`You are determining whether an AI assistant's response shows evidence of using a specific skill/instruction.
1
+ import{a as u}from"./chunk-MGHFDHHM.js";import{a as l}from"./chunk-ZLLER3HP.js";var y='Warning: trigger "accuracy" is heuristic \u2014 the skill content is always injected during execution, so scores measure detectable influence on the output, not real description-gated triggering.',w=`You are determining whether an AI assistant's response shows evidence of using a specific skill/instruction.
2
2
 
3
3
  You will receive:
4
4
  1. The skill name and description
@@ -17,7 +17,7 @@ Respond with ONLY a valid JSON object:
17
17
  "triggered": true,
18
18
  "confidence": 0.85,
19
19
  "evidence": "The response follows the X pattern described in the skill..."
20
- }`;async function v(t){let{query:r,shouldTrigger:e,skillName:m,skillDescription:T,skillContent:a,model:d,timeout:k=12e4}=t,s=await u({prompt:r,targetContent:a,timeout:k,model:d});if(s.error)return{query:r,shouldTrigger:e,didTrigger:!1,correct:!e,confidence:0,evidence:`Execution failed: ${s.error}`};let b=`## Skill
20
+ }`;async function v(t){let{query:r,shouldTrigger:e,skillName:m,skillDescription:T,skillContent:a,model:g,timeout:k=12e4}=t,s=await u({prompt:r,targetContent:a,timeout:k,model:g});if(s.error)return{query:r,shouldTrigger:e,didTrigger:!1,correct:!e,confidence:0,evidence:`Execution failed: ${s.error}`};let b=`## Skill
21
21
  Name: ${m}
22
22
  Description: ${T}
23
23
 
@@ -30,4 +30,4 @@ ${r}
30
30
  ## AI Response
31
31
  ${s.output}
32
32
 
33
- Did the AI's response show evidence of using this skill? Respond with ONLY valid JSON.`,g=await u({prompt:b,targetContent:w,timeout:6e4,model:d}),o=!1,h=0,n="";try{let i=g.output.trim(),p=i.match(/```(?:json)?\s*([\s\S]*?)```/);p&&(i=p[1].trim());let f=i.match(/\{[\s\S]*\}/);f&&(i=f[0]);let c=JSON.parse(i);o=c.triggered===!0,h=c.confidence??0,n=c.evidence??""}catch{n=`Detector returned unparseable output: ${g.output.slice(0,200)}`}return{query:r,shouldTrigger:e,didTrigger:o,correct:o===e,confidence:h,evidence:n}}l(v,"testTrigger");function y(t){return t.length===0?0:t.filter(e=>e.correct).length/t.length}l(y,"computeTriggerScore");export{v as a,y as b};
33
+ Did the AI's response show evidence of using this skill? Respond with ONLY valid JSON.`,d=await u({prompt:b,targetContent:w,timeout:6e4,model:g}),n=!1,h=0,o="";try{let i=d.output.trim(),p=i.match(/```(?:json)?\s*([\s\S]*?)```/);p&&(i=p[1].trim());let f=i.match(/\{[\s\S]*\}/);f&&(i=f[0]);let c=JSON.parse(i);n=c.triggered===!0,h=c.confidence??0,o=c.evidence??""}catch{o=`Detector returned unparseable output: ${d.output.slice(0,200)}`}return{query:r,shouldTrigger:e,didTrigger:n,correct:n===e,confidence:h,evidence:o}}l(v,"testTrigger");function D(t){return t.length===0?0:t.filter(e=>e.correct).length/t.length}l(D,"computeTriggerScore");export{y as a,v as b,D as c};