@rulemetric/cli 0.2.1 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/base-command.js +13 -52
- package/dist/base-command.js.map +7 -1
- package/dist/chunk-2AM54TUK.js +59 -0
- package/dist/chunk-2AM54TUK.js.map +7 -0
- package/dist/chunk-3TIMQ3O6.js +96 -0
- package/dist/chunk-3TIMQ3O6.js.map +7 -0
- package/dist/chunk-4BHDHHKL.js +48 -0
- package/dist/chunk-4BHDHHKL.js.map +7 -0
- package/dist/chunk-4D537GXE.js +99 -0
- package/dist/chunk-4D537GXE.js.map +7 -0
- package/dist/chunk-4SCZK7AL.js +129 -0
- package/dist/chunk-4SCZK7AL.js.map +7 -0
- package/dist/chunk-4WFE4PFP.js +61 -0
- package/dist/chunk-4WFE4PFP.js.map +7 -0
- package/dist/chunk-52WIYRZH.js +73 -0
- package/dist/chunk-52WIYRZH.js.map +7 -0
- package/dist/chunk-7FAA3YNB.js +1549 -0
- package/dist/chunk-7FAA3YNB.js.map +7 -0
- package/dist/chunk-7NYKWN7U.js +12 -0
- package/dist/chunk-7NYKWN7U.js.map +7 -0
- package/dist/chunk-AULP2OWH.js +99 -0
- package/dist/chunk-AULP2OWH.js.map +7 -0
- package/dist/chunk-B5KNTGMJ.js +1788 -0
- package/dist/chunk-B5KNTGMJ.js.map +7 -0
- package/dist/chunk-BD7CY42U.js +23 -0
- package/dist/chunk-BD7CY42U.js.map +7 -0
- package/dist/chunk-BO76WKJR.js +42 -0
- package/dist/chunk-BO76WKJR.js.map +7 -0
- package/dist/chunk-BRD5RUGM.js +53 -0
- package/dist/chunk-BRD5RUGM.js.map +7 -0
- package/dist/chunk-BT6Z6545.js +43 -0
- package/dist/chunk-BT6Z6545.js.map +7 -0
- package/dist/chunk-BZDKEQKU.js +39 -0
- package/dist/chunk-BZDKEQKU.js.map +7 -0
- package/dist/chunk-CROYS75W.js +161 -0
- package/dist/chunk-CROYS75W.js.map +7 -0
- package/dist/chunk-DGHWRQXL.js +17 -0
- package/dist/chunk-DGHWRQXL.js.map +7 -0
- package/dist/chunk-DQ3KELXD.js +74 -0
- package/dist/chunk-DQ3KELXD.js.map +7 -0
- package/dist/chunk-DTFXCHHI.js +108 -0
- package/dist/chunk-DTFXCHHI.js.map +7 -0
- package/dist/chunk-DU73QUS3.js +75 -0
- package/dist/chunk-DU73QUS3.js.map +7 -0
- package/dist/chunk-EHZJ6OXD.js +307 -0
- package/dist/chunk-EHZJ6OXD.js.map +7 -0
- package/dist/chunk-EJOI2ZGU.js +109 -0
- package/dist/chunk-EJOI2ZGU.js.map +7 -0
- package/dist/chunk-EKJ2CABV.js +76 -0
- package/dist/chunk-EKJ2CABV.js.map +7 -0
- package/dist/chunk-EKP32DLN.js +16 -0
- package/dist/chunk-EKP32DLN.js.map +7 -0
- package/dist/chunk-EOOP6WTC.js +148 -0
- package/dist/chunk-EOOP6WTC.js.map +7 -0
- package/dist/chunk-ERPMDAO3.js +20 -0
- package/dist/chunk-ERPMDAO3.js.map +7 -0
- package/dist/chunk-FTJRMUID.js +96 -0
- package/dist/chunk-FTJRMUID.js.map +7 -0
- package/dist/chunk-FZKLLNDS.js +228 -0
- package/dist/chunk-FZKLLNDS.js.map +7 -0
- package/dist/chunk-GQCISMAH.js +157 -0
- package/dist/chunk-GQCISMAH.js.map +7 -0
- package/dist/chunk-IGXX624H.js +55 -0
- package/dist/chunk-IGXX624H.js.map +7 -0
- package/dist/chunk-IJGF2ETG.js +68 -0
- package/dist/chunk-IJGF2ETG.js.map +7 -0
- package/dist/chunk-IWYCRLEK.js +220 -0
- package/dist/chunk-IWYCRLEK.js.map +7 -0
- package/dist/chunk-J7N3DLH6.js +117 -0
- package/dist/chunk-J7N3DLH6.js.map +7 -0
- package/dist/chunk-JX5UI6RW.js +99 -0
- package/dist/chunk-JX5UI6RW.js.map +7 -0
- package/dist/chunk-K3BFZ7KG.js +154 -0
- package/dist/chunk-K3BFZ7KG.js.map +7 -0
- package/dist/chunk-KHJUQFIK.js +51 -0
- package/dist/chunk-KHJUQFIK.js.map +7 -0
- package/dist/chunk-KRBQLMOP.js +41 -0
- package/dist/chunk-KRBQLMOP.js.map +7 -0
- package/dist/chunk-KZRFUXGF.js +145 -0
- package/dist/chunk-KZRFUXGF.js.map +7 -0
- package/dist/chunk-L674RNKQ.js +492 -0
- package/dist/chunk-L674RNKQ.js.map +7 -0
- package/dist/chunk-N52AHNBH.js +47 -0
- package/dist/chunk-N52AHNBH.js.map +7 -0
- package/dist/chunk-NIDLJO6F.js +228 -0
- package/dist/chunk-NIDLJO6F.js.map +7 -0
- package/dist/chunk-NSBPE2FW.js +17 -0
- package/dist/chunk-NSBPE2FW.js.map +7 -0
- package/dist/chunk-OGVORIFM.js +70 -0
- package/dist/chunk-OGVORIFM.js.map +7 -0
- package/dist/chunk-OQSQC7VB.js +77 -0
- package/dist/chunk-OQSQC7VB.js.map +7 -0
- package/dist/chunk-PHLMIZKM.js +153 -0
- package/dist/chunk-PHLMIZKM.js.map +7 -0
- package/dist/chunk-PQU7GZ7A.js +92 -0
- package/dist/chunk-PQU7GZ7A.js.map +7 -0
- package/dist/chunk-PXVQLD7S.js +196 -0
- package/dist/chunk-PXVQLD7S.js.map +7 -0
- package/dist/chunk-QD6X4L4L.js +79 -0
- package/dist/chunk-QD6X4L4L.js.map +7 -0
- package/dist/chunk-QJQS6TUN.js +44 -0
- package/dist/chunk-QJQS6TUN.js.map +7 -0
- package/dist/chunk-QJXAULRC.js +191 -0
- package/dist/chunk-QJXAULRC.js.map +7 -0
- package/dist/chunk-QN34TGD3.js +83 -0
- package/dist/chunk-QN34TGD3.js.map +7 -0
- package/dist/chunk-R5MFHGHR.js +122 -0
- package/dist/chunk-R5MFHGHR.js.map +7 -0
- package/dist/chunk-RH7NHVSK.js +16 -0
- package/dist/chunk-RH7NHVSK.js.map +7 -0
- package/dist/chunk-RJ7BHDLM.js +121 -0
- package/dist/chunk-RJ7BHDLM.js.map +7 -0
- package/dist/chunk-RQ2TMLKG.js +142 -0
- package/dist/chunk-RQ2TMLKG.js.map +7 -0
- package/dist/chunk-S56LOTGQ.js +63 -0
- package/dist/chunk-S56LOTGQ.js.map +7 -0
- package/dist/chunk-UF73WX2J.js +49 -0
- package/dist/chunk-UF73WX2J.js.map +7 -0
- package/dist/chunk-W53GKIZQ.js +50 -0
- package/dist/chunk-W53GKIZQ.js.map +7 -0
- package/dist/chunk-WA4MWYRW.js +254 -0
- package/dist/chunk-WA4MWYRW.js.map +7 -0
- package/dist/chunk-WFULKPEQ.js +269 -0
- package/dist/chunk-WFULKPEQ.js.map +7 -0
- package/dist/chunk-XC6M4CSW.js +44 -0
- package/dist/chunk-XC6M4CSW.js.map +7 -0
- package/dist/chunk-XPUEGHXN.js +243 -0
- package/dist/chunk-XPUEGHXN.js.map +7 -0
- package/dist/chunk-XZXS2W24.js +148 -0
- package/dist/chunk-XZXS2W24.js.map +7 -0
- package/dist/chunk-YBNW7ARH.js +167 -0
- package/dist/chunk-YBNW7ARH.js.map +7 -0
- package/dist/chunk-YNIH3KMU.js +121 -0
- package/dist/chunk-YNIH3KMU.js.map +7 -0
- package/dist/commands/antigravity/backfill.js +135 -0
- package/dist/commands/antigravity/backfill.js.map +7 -0
- package/dist/commands/auth/create-key.js +48 -33
- package/dist/commands/auth/create-key.js.map +7 -1
- package/dist/commands/auth/login.js +58 -46
- package/dist/commands/auth/login.js.map +7 -1
- package/dist/commands/auth/logout.js +28 -13
- package/dist/commands/auth/logout.js.map +7 -1
- package/dist/commands/auth/revoke-key.js +32 -18
- package/dist/commands/auth/revoke-key.js.map +7 -1
- package/dist/commands/auth/status.js +40 -22
- package/dist/commands/auth/status.js.map +7 -1
- package/dist/commands/catalog/index.js +50 -34
- package/dist/commands/catalog/index.js.map +7 -1
- package/dist/commands/catalog/recommend.js +41 -26
- package/dist/commands/catalog/recommend.js.map +7 -1
- package/dist/commands/convert.js +72 -54
- package/dist/commands/convert.js.map +7 -1
- package/dist/commands/converters.js +52 -38
- package/dist/commands/converters.js.map +7 -1
- package/dist/commands/crons/list.js +50 -24
- package/dist/commands/crons/list.js.map +7 -1
- package/dist/commands/crons/run.js +72 -47
- package/dist/commands/crons/run.js.map +7 -1
- package/dist/commands/dashboard.js +45 -24
- package/dist/commands/dashboard.js.map +7 -1
- package/dist/commands/eval-targets/create.js +51 -39
- package/dist/commands/eval-targets/create.js.map +7 -1
- package/dist/commands/eval-targets/list.js +52 -35
- package/dist/commands/eval-targets/list.js.map +7 -1
- package/dist/commands/evals/agent.js +292 -0
- package/dist/commands/evals/agent.js.map +7 -0
- package/dist/commands/evals/benchmark.js +70 -51
- package/dist/commands/evals/benchmark.js.map +7 -1
- package/dist/commands/evals/compare.js +90 -78
- package/dist/commands/evals/compare.js.map +7 -1
- package/dist/commands/evals/create.js +64 -50
- package/dist/commands/evals/create.js.map +7 -1
- package/dist/commands/evals/optimize-description.js +225 -222
- package/dist/commands/evals/optimize-description.js.map +7 -1
- package/dist/commands/evals/optimize.js +206 -196
- package/dist/commands/evals/optimize.js.map +7 -1
- package/dist/commands/evals/run.js +178 -164
- package/dist/commands/evals/run.js.map +7 -1
- package/dist/commands/gateway/ensure.js +33 -19
- package/dist/commands/gateway/ensure.js.map +7 -1
- package/dist/commands/hooks/install.js +335 -275
- package/dist/commands/hooks/install.js.map +7 -1
- package/dist/commands/hooks/run.js +72 -53
- package/dist/commands/hooks/run.js.map +7 -1
- package/dist/commands/hooks/uninstall.js +117 -94
- package/dist/commands/hooks/uninstall.js.map +7 -1
- package/dist/commands/import.js +63 -53
- package/dist/commands/import.js.map +7 -1
- package/dist/commands/instructions/create.js +71 -58
- package/dist/commands/instructions/create.js.map +7 -1
- package/dist/commands/instructions/delete.js +53 -36
- package/dist/commands/instructions/delete.js.map +7 -1
- package/dist/commands/instructions/fork.js +33 -19
- package/dist/commands/instructions/fork.js.map +7 -1
- package/dist/commands/instructions/get.js +66 -49
- package/dist/commands/instructions/get.js.map +7 -1
- package/dist/commands/instructions/list.js +63 -46
- package/dist/commands/instructions/list.js.map +7 -1
- package/dist/commands/instructions/promote.js +41 -27
- package/dist/commands/instructions/promote.js.map +7 -1
- package/dist/commands/instructions/pull.js +37 -21
- package/dist/commands/instructions/pull.js.map +7 -1
- package/dist/commands/instructions/upstream.js +36 -21
- package/dist/commands/instructions/upstream.js.map +7 -1
- package/dist/commands/instructions/versions.js +51 -33
- package/dist/commands/instructions/versions.js.map +7 -1
- package/dist/commands/launcher.js +39 -0
- package/dist/commands/launcher.js.map +7 -0
- package/dist/commands/org/current.js +74 -68
- package/dist/commands/org/current.js.map +7 -1
- package/dist/commands/org/list.js +50 -36
- package/dist/commands/org/list.js.map +7 -1
- package/dist/commands/org/switch.js +69 -51
- package/dist/commands/org/switch.js.map +7 -1
- package/dist/commands/packs/add-instruction.js +36 -22
- package/dist/commands/packs/add-instruction.js.map +7 -1
- package/dist/commands/packs/apply.js +38 -24
- package/dist/commands/packs/apply.js.map +7 -1
- package/dist/commands/packs/create.js +47 -33
- package/dist/commands/packs/create.js.map +7 -1
- package/dist/commands/packs/fork.js +33 -19
- package/dist/commands/packs/fork.js.map +7 -1
- package/dist/commands/packs/get.js +54 -35
- package/dist/commands/packs/get.js.map +7 -1
- package/dist/commands/packs/list.js +64 -47
- package/dist/commands/packs/list.js.map +7 -1
- package/dist/commands/packs/remove-instruction.js +34 -20
- package/dist/commands/packs/remove-instruction.js.map +7 -1
- package/dist/commands/proxy/env.js +126 -116
- package/dist/commands/proxy/env.js.map +7 -1
- package/dist/commands/proxy/logs.js +83 -74
- package/dist/commands/proxy/logs.js.map +7 -1
- package/dist/commands/proxy/restart.js +34 -36
- package/dist/commands/proxy/restart.js.map +7 -1
- package/dist/commands/proxy/setup.js +432 -375
- package/dist/commands/proxy/setup.js.map +7 -1
- package/dist/commands/proxy/start.js +289 -289
- package/dist/commands/proxy/start.js.map +7 -1
- package/dist/commands/proxy/status.js +74 -64
- package/dist/commands/proxy/status.js.map +7 -1
- package/dist/commands/proxy/stop.js +81 -75
- package/dist/commands/proxy/stop.js.map +7 -1
- package/dist/commands/research/backfill.js +58 -0
- package/dist/commands/research/backfill.js.map +7 -0
- package/dist/commands/research/tail-transcript.js +69 -0
- package/dist/commands/research/tail-transcript.js.map +7 -0
- package/dist/commands/service/install.js +639 -405
- package/dist/commands/service/install.js.map +7 -1
- package/dist/commands/service/status.js +178 -111
- package/dist/commands/service/status.js.map +7 -1
- package/dist/commands/service/uninstall.js +85 -110
- package/dist/commands/service/uninstall.js.map +7 -1
- package/dist/commands/sessions/analyze.js +46 -25
- package/dist/commands/sessions/analyze.js.map +7 -1
- package/dist/commands/sessions/end.js +81 -79
- package/dist/commands/sessions/end.js.map +7 -1
- package/dist/commands/sessions/import.js +44 -27
- package/dist/commands/sessions/import.js.map +7 -1
- package/dist/commands/sessions/list.js +46 -33
- package/dist/commands/sessions/list.js.map +7 -1
- package/dist/commands/sessions/start.js +88 -87
- package/dist/commands/sessions/start.js.map +7 -1
- package/dist/commands/signals/report.js +42 -34
- package/dist/commands/signals/report.js.map +7 -1
- package/dist/commands/skills/export-approved.js +44 -30
- package/dist/commands/skills/export-approved.js.map +7 -1
- package/dist/commands/skills/install.js +99 -84
- package/dist/commands/skills/install.js.map +7 -1
- package/dist/commands/skills/list.js +59 -42
- package/dist/commands/skills/list.js.map +7 -1
- package/dist/commands/skills/publish.js +95 -78
- package/dist/commands/skills/publish.js.map +7 -1
- package/dist/commands/skills/search.js +68 -53
- package/dist/commands/skills/search.js.map +7 -1
- package/dist/commands/skills/update.js +52 -39
- package/dist/commands/skills/update.js.map +7 -1
- package/dist/commands/suggestions/accept.js +82 -59
- package/dist/commands/suggestions/accept.js.map +7 -1
- package/dist/commands/suggestions/dismiss.js +44 -26
- package/dist/commands/suggestions/dismiss.js.map +7 -1
- package/dist/commands/suggestions/list.js +59 -39
- package/dist/commands/suggestions/list.js.map +7 -1
- package/dist/commands/suggestions/refresh.js +26 -11
- package/dist/commands/suggestions/refresh.js.map +7 -1
- package/dist/cursor-BGQJ4CWI.js +134 -0
- package/dist/cursor-BGQJ4CWI.js.map +7 -0
- package/dist/dashboard/Dashboard.js +229 -126
- package/dist/dashboard/Dashboard.js.map +7 -1
- package/dist/dashboard/data.js +13 -137
- package/dist/dashboard/data.js.map +7 -1
- package/dist/dashboard/launcher/ActiveJobsList.js +10 -0
- package/dist/dashboard/launcher/ActiveJobsList.js.map +7 -0
- package/dist/dashboard/launcher/LauncherOverlay.js +14 -0
- package/dist/dashboard/launcher/LauncherOverlay.js.map +7 -0
- package/dist/dashboard/launcher/NewLaunchForm.js +10 -0
- package/dist/dashboard/launcher/NewLaunchForm.js.map +7 -0
- package/dist/dashboard/launcher/api.js +14 -0
- package/dist/dashboard/launcher/api.js.map +7 -0
- package/dist/dashboard/launcher/tool-labels.js +10 -0
- package/dist/dashboard/launcher/tool-labels.js.map +7 -0
- package/dist/dashboard/launcher/types.js +1 -0
- package/dist/dashboard/launcher/types.js.map +7 -0
- package/dist/dashboard/launcher/useLaunchJobs.js +9 -0
- package/dist/dashboard/launcher/useLaunchJobs.js.map +7 -0
- package/dist/dashboard/panels/friction.js +10 -22
- package/dist/dashboard/panels/friction.js.map +7 -1
- package/dist/dashboard/panels/insights.js +10 -109
- package/dist/dashboard/panels/insights.js.map +7 -1
- package/dist/dashboard/panels/instructions.js +10 -17
- package/dist/dashboard/panels/instructions.js.map +7 -1
- package/dist/dashboard/panels/outcomes.js +9 -28
- package/dist/dashboard/panels/outcomes.js.map +7 -1
- package/dist/dashboard/panels/overview.js +10 -20
- package/dist/dashboard/panels/overview.js.map +7 -1
- package/dist/dashboard/panels/shared.js +18 -61
- package/dist/dashboard/panels/shared.js.map +7 -1
- package/dist/dashboard/types.js +23 -26
- package/dist/dashboard/types.js.map +7 -1
- package/dist/dist-CSUYFYKI.js +52 -0
- package/dist/dist-CSUYFYKI.js.map +7 -0
- package/dist/index.js +8 -2
- package/dist/index.js.map +7 -1
- package/dist/lib/active-org-refresh.js +15 -108
- package/dist/lib/active-org-refresh.js.map +7 -1
- package/dist/lib/active-org.js +15 -95
- package/dist/lib/active-org.js.map +7 -1
- package/dist/lib/agent-loop.js +44 -0
- package/dist/lib/agent-loop.js.map +7 -0
- package/dist/lib/antigravity-transcript.js +22 -0
- package/dist/lib/antigravity-transcript.js.map +7 -0
- package/dist/lib/api-client.js +21 -92
- package/dist/lib/api-client.js.map +7 -1
- package/dist/lib/auth.js +26 -137
- package/dist/lib/auth.js.map +7 -1
- package/dist/lib/detect-languages.js +8 -113
- package/dist/lib/detect-languages.js.map +7 -1
- package/dist/lib/detect-tmux.js +9 -0
- package/dist/lib/detect-tmux.js.map +7 -0
- package/dist/lib/eval-analyzer.js +9 -89
- package/dist/lib/eval-analyzer.js.map +7 -1
- package/dist/lib/eval-benchmark.js +12 -92
- package/dist/lib/eval-benchmark.js.map +7 -1
- package/dist/lib/eval-conversation-handler.js +13 -200
- package/dist/lib/eval-conversation-handler.js.map +7 -1
- package/dist/lib/eval-executor.js +8 -83
- package/dist/lib/eval-executor.js.map +7 -1
- package/dist/lib/eval-grader.js +9 -123
- package/dist/lib/eval-grader.js.map +7 -1
- package/dist/lib/eval-meta-judge.js +9 -116
- package/dist/lib/eval-meta-judge.js.map +7 -1
- package/dist/lib/eval-trigger-tester.js +11 -96
- package/dist/lib/eval-trigger-tester.js.map +7 -1
- package/dist/lib/eval-worktree.js +8 -87
- package/dist/lib/eval-worktree.js.map +7 -1
- package/dist/lib/gateway-entry.js +20 -18
- package/dist/lib/gateway-entry.js.map +7 -1
- package/dist/lib/gateway-lifecycle.js +22 -97
- package/dist/lib/gateway-lifecycle.js.map +7 -1
- package/dist/lib/gateway.js +12 -216
- package/dist/lib/gateway.js.map +7 -1
- package/dist/lib/handlers/cron-close-stale-sessions.js +18 -7
- package/dist/lib/handlers/cron-close-stale-sessions.js.map +7 -1
- package/dist/lib/handlers/cron-data-integrity-audit.js +21 -15
- package/dist/lib/handlers/cron-data-integrity-audit.js.map +7 -1
- package/dist/lib/handlers/cron-refresh-skills.js +7 -90
- package/dist/lib/handlers/cron-refresh-skills.js.map +7 -1
- package/dist/lib/handlers/cron-suggest-instructions.js +14 -158
- package/dist/lib/handlers/cron-suggest-instructions.js.map +7 -1
- package/dist/lib/handlers/process-announcement.js +11 -0
- package/dist/lib/handlers/process-announcement.js.map +7 -0
- package/dist/lib/handlers/process-changelog.js +11 -0
- package/dist/lib/handlers/process-changelog.js.map +7 -0
- package/dist/lib/handlers/process-conversation.js +14 -35
- package/dist/lib/handlers/process-conversation.js.map +7 -1
- package/dist/lib/handlers/process-eval.js +15 -207
- package/dist/lib/handlers/process-eval.js.map +7 -1
- package/dist/lib/handlers/process-insights.js +14 -300
- package/dist/lib/handlers/process-insights.js.map +7 -1
- package/dist/lib/handlers/process-launch.js +16 -41
- package/dist/lib/handlers/process-launch.js.map +7 -1
- package/dist/lib/handlers/process-run-cleanup.js +13 -0
- package/dist/lib/handlers/process-run-cleanup.js.map +7 -0
- package/dist/lib/handlers/process-send-message.js +10 -0
- package/dist/lib/handlers/process-send-message.js.map +7 -0
- package/dist/lib/handlers/process-session-goal.js +11 -74
- package/dist/lib/handlers/process-session-goal.js.map +7 -1
- package/dist/lib/hooks-config.js +52 -544
- package/dist/lib/hooks-config.js.map +7 -1
- package/dist/lib/insights-prompts.js +12 -145
- package/dist/lib/insights-prompts.js.map +7 -1
- package/dist/lib/job-helpers.js +1 -0
- package/dist/lib/job-helpers.js.map +7 -0
- package/dist/lib/llm-client.js +16 -274
- package/dist/lib/llm-client.js.map +7 -1
- package/dist/lib/manual-tasks.js +22 -0
- package/dist/lib/manual-tasks.js.map +7 -0
- package/dist/lib/output.js +12 -36
- package/dist/lib/output.js.map +7 -1
- package/dist/lib/permanent-job-error.js +10 -23
- package/dist/lib/permanent-job-error.js.map +7 -1
- package/dist/lib/provider-aggregator.js +57 -55
- package/dist/lib/provider-aggregator.js.map +7 -1
- package/dist/lib/research-client.js +12 -0
- package/dist/lib/research-client.js.map +7 -0
- package/dist/lib/skills-loader.js +8 -51
- package/dist/lib/skills-loader.js.map +7 -1
- package/dist/lib/statusline-shim.js +16 -0
- package/dist/lib/statusline-shim.js.map +7 -0
- package/dist/lib/terminal-target-heartbeat.js +15 -0
- package/dist/lib/terminal-target-heartbeat.js.map +7 -0
- package/dist/lib/tmux.js +16 -0
- package/dist/lib/tmux.js.map +7 -0
- package/dist/lib/transcript-rate-limit-watcher.js +22 -0
- package/dist/lib/transcript-rate-limit-watcher.js.map +7 -0
- package/dist/lib/types.js +8 -7
- package/dist/lib/types.js.map +7 -1
- package/dist/lib/version-check.js +10 -106
- package/dist/lib/version-check.js.map +7 -1
- package/dist/lib/which.js +8 -0
- package/dist/lib/which.js.map +7 -0
- package/dist/lib/worktree.js +17 -0
- package/dist/lib/worktree.js.map +7 -0
- package/dist/opencode-IQ7X5YMJ.js +190 -0
- package/dist/opencode-IQ7X5YMJ.js.map +7 -0
- package/oclif.manifest.json +299 -66
- package/package.json +26 -10
- package/dist/base-command.d.ts +0 -12
- package/dist/base-command.d.ts.map +0 -1
- package/dist/commands/auth/create-key.d.ts +0 -11
- package/dist/commands/auth/create-key.d.ts.map +0 -1
- package/dist/commands/auth/login.d.ts +0 -11
- package/dist/commands/auth/login.d.ts.map +0 -1
- package/dist/commands/auth/logout.d.ts +0 -7
- package/dist/commands/auth/logout.d.ts.map +0 -1
- package/dist/commands/auth/revoke-key.d.ts +0 -10
- package/dist/commands/auth/revoke-key.d.ts.map +0 -1
- package/dist/commands/auth/status.d.ts +0 -7
- package/dist/commands/auth/status.d.ts.map +0 -1
- package/dist/commands/catalog/index.d.ts +0 -11
- package/dist/commands/catalog/index.d.ts.map +0 -1
- package/dist/commands/catalog/recommend.d.ts +0 -9
- package/dist/commands/catalog/recommend.d.ts.map +0 -1
- package/dist/commands/convert.d.ts +0 -15
- package/dist/commands/convert.d.ts.map +0 -1
- package/dist/commands/converters.d.ts +0 -12
- package/dist/commands/converters.d.ts.map +0 -1
- package/dist/commands/crons/list.d.ts +0 -7
- package/dist/commands/crons/list.d.ts.map +0 -1
- package/dist/commands/crons/run.d.ts +0 -13
- package/dist/commands/crons/run.d.ts.map +0 -1
- package/dist/commands/dashboard.d.ts +0 -10
- package/dist/commands/dashboard.d.ts.map +0 -1
- package/dist/commands/eval-targets/create.d.ts +0 -14
- package/dist/commands/eval-targets/create.d.ts.map +0 -1
- package/dist/commands/eval-targets/list.d.ts +0 -10
- package/dist/commands/eval-targets/list.d.ts.map +0 -1
- package/dist/commands/evals/benchmark.d.ts +0 -13
- package/dist/commands/evals/benchmark.d.ts.map +0 -1
- package/dist/commands/evals/compare.d.ts +0 -15
- package/dist/commands/evals/compare.d.ts.map +0 -1
- package/dist/commands/evals/create.d.ts +0 -17
- package/dist/commands/evals/create.d.ts.map +0 -1
- package/dist/commands/evals/listen.d.ts +0 -37
- package/dist/commands/evals/listen.d.ts.map +0 -1
- package/dist/commands/evals/listen.js +0 -188
- package/dist/commands/evals/listen.js.map +0 -1
- package/dist/commands/evals/listen.test.d.ts +0 -2
- package/dist/commands/evals/listen.test.d.ts.map +0 -1
- package/dist/commands/evals/listen.test.js +0 -48
- package/dist/commands/evals/listen.test.js.map +0 -1
- package/dist/commands/evals/optimize-description.d.ts +0 -22
- package/dist/commands/evals/optimize-description.d.ts.map +0 -1
- package/dist/commands/evals/optimize.d.ts +0 -22
- package/dist/commands/evals/optimize.d.ts.map +0 -1
- package/dist/commands/evals/run.d.ts +0 -21
- package/dist/commands/evals/run.d.ts.map +0 -1
- package/dist/commands/gateway/ensure.d.ts +0 -7
- package/dist/commands/gateway/ensure.d.ts.map +0 -1
- package/dist/commands/hooks/install.d.ts +0 -16
- package/dist/commands/hooks/install.d.ts.map +0 -1
- package/dist/commands/hooks/run.d.ts +0 -11
- package/dist/commands/hooks/run.d.ts.map +0 -1
- package/dist/commands/hooks/uninstall.d.ts +0 -7
- package/dist/commands/hooks/uninstall.d.ts.map +0 -1
- package/dist/commands/import.d.ts +0 -17
- package/dist/commands/import.d.ts.map +0 -1
- package/dist/commands/instructions/create.d.ts +0 -17
- package/dist/commands/instructions/create.d.ts.map +0 -1
- package/dist/commands/instructions/delete.d.ts +0 -13
- package/dist/commands/instructions/delete.d.ts.map +0 -1
- package/dist/commands/instructions/fork.d.ts +0 -10
- package/dist/commands/instructions/fork.d.ts.map +0 -1
- package/dist/commands/instructions/get.d.ts +0 -15
- package/dist/commands/instructions/get.d.ts.map +0 -1
- package/dist/commands/instructions/list.d.ts +0 -12
- package/dist/commands/instructions/list.d.ts.map +0 -1
- package/dist/commands/instructions/promote.d.ts +0 -14
- package/dist/commands/instructions/promote.d.ts.map +0 -1
- package/dist/commands/instructions/pull.d.ts +0 -9
- package/dist/commands/instructions/pull.d.ts.map +0 -1
- package/dist/commands/instructions/upstream.d.ts +0 -9
- package/dist/commands/instructions/upstream.d.ts.map +0 -1
- package/dist/commands/instructions/versions.d.ts +0 -12
- package/dist/commands/instructions/versions.d.ts.map +0 -1
- package/dist/commands/org/current.d.ts +0 -7
- package/dist/commands/org/current.d.ts.map +0 -1
- package/dist/commands/org/list.d.ts +0 -7
- package/dist/commands/org/list.d.ts.map +0 -1
- package/dist/commands/org/switch.d.ts +0 -13
- package/dist/commands/org/switch.d.ts.map +0 -1
- package/dist/commands/packs/add-instruction.d.ts +0 -11
- package/dist/commands/packs/add-instruction.d.ts.map +0 -1
- package/dist/commands/packs/apply.d.ts +0 -13
- package/dist/commands/packs/apply.d.ts.map +0 -1
- package/dist/commands/packs/create.d.ts +0 -13
- package/dist/commands/packs/create.d.ts.map +0 -1
- package/dist/commands/packs/fork.d.ts +0 -10
- package/dist/commands/packs/fork.d.ts.map +0 -1
- package/dist/commands/packs/get.d.ts +0 -10
- package/dist/commands/packs/get.d.ts.map +0 -1
- package/dist/commands/packs/list.d.ts +0 -22
- package/dist/commands/packs/list.d.ts.map +0 -1
- package/dist/commands/packs/remove-instruction.d.ts +0 -11
- package/dist/commands/packs/remove-instruction.d.ts.map +0 -1
- package/dist/commands/proxy/env.d.ts +0 -14
- package/dist/commands/proxy/env.d.ts.map +0 -1
- package/dist/commands/proxy/logs.d.ts +0 -11
- package/dist/commands/proxy/logs.d.ts.map +0 -1
- package/dist/commands/proxy/restart.d.ts +0 -11
- package/dist/commands/proxy/restart.d.ts.map +0 -1
- package/dist/commands/proxy/setup.d.ts +0 -23
- package/dist/commands/proxy/setup.d.ts.map +0 -1
- package/dist/commands/proxy/start.d.ts +0 -17
- package/dist/commands/proxy/start.d.ts.map +0 -1
- package/dist/commands/proxy/status.d.ts +0 -7
- package/dist/commands/proxy/status.d.ts.map +0 -1
- package/dist/commands/proxy/stop.d.ts +0 -8
- package/dist/commands/proxy/stop.d.ts.map +0 -1
- package/dist/commands/service/install.d.ts +0 -33
- package/dist/commands/service/install.d.ts.map +0 -1
- package/dist/commands/service/install.test.d.ts +0 -2
- package/dist/commands/service/install.test.d.ts.map +0 -1
- package/dist/commands/service/install.test.js +0 -345
- package/dist/commands/service/install.test.js.map +0 -1
- package/dist/commands/service/status.d.ts +0 -6
- package/dist/commands/service/status.d.ts.map +0 -1
- package/dist/commands/service/uninstall.d.ts +0 -6
- package/dist/commands/service/uninstall.d.ts.map +0 -1
- package/dist/commands/sessions/analyze.d.ts +0 -10
- package/dist/commands/sessions/analyze.d.ts.map +0 -1
- package/dist/commands/sessions/end.d.ts +0 -9
- package/dist/commands/sessions/end.d.ts.map +0 -1
- package/dist/commands/sessions/import.d.ts +0 -13
- package/dist/commands/sessions/import.d.ts.map +0 -1
- package/dist/commands/sessions/list.d.ts +0 -11
- package/dist/commands/sessions/list.d.ts.map +0 -1
- package/dist/commands/sessions/start.d.ts +0 -11
- package/dist/commands/sessions/start.d.ts.map +0 -1
- package/dist/commands/signals/report.d.ts +0 -10
- package/dist/commands/signals/report.d.ts.map +0 -1
- package/dist/commands/signals/report.test.d.ts +0 -2
- package/dist/commands/signals/report.test.d.ts.map +0 -1
- package/dist/commands/signals/report.test.js +0 -65
- package/dist/commands/signals/report.test.js.map +0 -1
- package/dist/commands/skills/export-approved.d.ts +0 -10
- package/dist/commands/skills/export-approved.d.ts.map +0 -1
- package/dist/commands/skills/install.d.ts +0 -15
- package/dist/commands/skills/install.d.ts.map +0 -1
- package/dist/commands/skills/list.d.ts +0 -11
- package/dist/commands/skills/list.d.ts.map +0 -1
- package/dist/commands/skills/publish.d.ts +0 -17
- package/dist/commands/skills/publish.d.ts.map +0 -1
- package/dist/commands/skills/search.d.ts +0 -17
- package/dist/commands/skills/search.d.ts.map +0 -1
- package/dist/commands/skills/update.d.ts +0 -10
- package/dist/commands/skills/update.d.ts.map +0 -1
- package/dist/commands/suggestions/accept.d.ts +0 -16
- package/dist/commands/suggestions/accept.d.ts.map +0 -1
- package/dist/commands/suggestions/accept.test.d.ts +0 -2
- package/dist/commands/suggestions/accept.test.d.ts.map +0 -1
- package/dist/commands/suggestions/accept.test.js +0 -52
- package/dist/commands/suggestions/accept.test.js.map +0 -1
- package/dist/commands/suggestions/dismiss.d.ts +0 -10
- package/dist/commands/suggestions/dismiss.d.ts.map +0 -1
- package/dist/commands/suggestions/list.d.ts +0 -10
- package/dist/commands/suggestions/list.d.ts.map +0 -1
- package/dist/commands/suggestions/refresh.d.ts +0 -7
- package/dist/commands/suggestions/refresh.d.ts.map +0 -1
- package/dist/dashboard/Dashboard.d.ts +0 -3
- package/dist/dashboard/Dashboard.d.ts.map +0 -1
- package/dist/dashboard/data.d.ts +0 -11
- package/dist/dashboard/data.d.ts.map +0 -1
- package/dist/dashboard/panels/friction.d.ts +0 -7
- package/dist/dashboard/panels/friction.d.ts.map +0 -1
- package/dist/dashboard/panels/insights.d.ts +0 -8
- package/dist/dashboard/panels/insights.d.ts.map +0 -1
- package/dist/dashboard/panels/instructions.d.ts +0 -9
- package/dist/dashboard/panels/instructions.d.ts.map +0 -1
- package/dist/dashboard/panels/outcomes.d.ts +0 -7
- package/dist/dashboard/panels/outcomes.d.ts.map +0 -1
- package/dist/dashboard/panels/overview.d.ts +0 -8
- package/dist/dashboard/panels/overview.d.ts.map +0 -1
- package/dist/dashboard/panels/shared.d.ts +0 -17
- package/dist/dashboard/panels/shared.d.ts.map +0 -1
- package/dist/dashboard/types.d.ts +0 -80
- package/dist/dashboard/types.d.ts.map +0 -1
- package/dist/index.d.ts +0 -2
- package/dist/index.d.ts.map +0 -1
- package/dist/lib/active-org-refresh.d.ts +0 -22
- package/dist/lib/active-org-refresh.d.ts.map +0 -1
- package/dist/lib/active-org-refresh.test.d.ts +0 -2
- package/dist/lib/active-org-refresh.test.d.ts.map +0 -1
- package/dist/lib/active-org-refresh.test.js +0 -190
- package/dist/lib/active-org-refresh.test.js.map +0 -1
- package/dist/lib/active-org.d.ts +0 -43
- package/dist/lib/active-org.d.ts.map +0 -1
- package/dist/lib/active-org.test.d.ts +0 -2
- package/dist/lib/active-org.test.d.ts.map +0 -1
- package/dist/lib/active-org.test.js +0 -147
- package/dist/lib/active-org.test.js.map +0 -1
- package/dist/lib/api-client.d.ts +0 -17
- package/dist/lib/api-client.d.ts.map +0 -1
- package/dist/lib/api-client.test.d.ts +0 -2
- package/dist/lib/api-client.test.d.ts.map +0 -1
- package/dist/lib/api-client.test.js +0 -161
- package/dist/lib/api-client.test.js.map +0 -1
- package/dist/lib/auth.d.ts +0 -27
- package/dist/lib/auth.d.ts.map +0 -1
- package/dist/lib/auth.test.d.ts +0 -2
- package/dist/lib/auth.test.d.ts.map +0 -1
- package/dist/lib/auth.test.js +0 -110
- package/dist/lib/auth.test.js.map +0 -1
- package/dist/lib/cron-registry.d.ts +0 -47
- package/dist/lib/cron-registry.d.ts.map +0 -1
- package/dist/lib/cron-registry.js +0 -102
- package/dist/lib/cron-registry.js.map +0 -1
- package/dist/lib/cron-registry.test.d.ts +0 -2
- package/dist/lib/cron-registry.test.d.ts.map +0 -1
- package/dist/lib/cron-registry.test.js +0 -136
- package/dist/lib/cron-registry.test.js.map +0 -1
- package/dist/lib/cron-runner.d.ts +0 -16
- package/dist/lib/cron-runner.d.ts.map +0 -1
- package/dist/lib/cron-runner.js +0 -68
- package/dist/lib/cron-runner.js.map +0 -1
- package/dist/lib/detect-languages.d.ts +0 -7
- package/dist/lib/detect-languages.d.ts.map +0 -1
- package/dist/lib/detect-languages.test.d.ts +0 -2
- package/dist/lib/detect-languages.test.d.ts.map +0 -1
- package/dist/lib/detect-languages.test.js +0 -29
- package/dist/lib/detect-languages.test.js.map +0 -1
- package/dist/lib/eval-analyzer.d.ts +0 -23
- package/dist/lib/eval-analyzer.d.ts.map +0 -1
- package/dist/lib/eval-benchmark.d.ts +0 -17
- package/dist/lib/eval-benchmark.d.ts.map +0 -1
- package/dist/lib/eval-conversation-handler.d.ts +0 -9
- package/dist/lib/eval-conversation-handler.d.ts.map +0 -1
- package/dist/lib/eval-executor.d.ts +0 -21
- package/dist/lib/eval-executor.d.ts.map +0 -1
- package/dist/lib/eval-executor.test.d.ts +0 -2
- package/dist/lib/eval-executor.test.d.ts.map +0 -1
- package/dist/lib/eval-executor.test.js +0 -8
- package/dist/lib/eval-executor.test.js.map +0 -1
- package/dist/lib/eval-grader.d.ts +0 -38
- package/dist/lib/eval-grader.d.ts.map +0 -1
- package/dist/lib/eval-grader.test.d.ts +0 -2
- package/dist/lib/eval-grader.test.d.ts.map +0 -1
- package/dist/lib/eval-grader.test.js +0 -8
- package/dist/lib/eval-grader.test.js.map +0 -1
- package/dist/lib/eval-meta-judge.d.ts +0 -28
- package/dist/lib/eval-meta-judge.d.ts.map +0 -1
- package/dist/lib/eval-trigger-tester.d.ts +0 -19
- package/dist/lib/eval-trigger-tester.d.ts.map +0 -1
- package/dist/lib/eval-worktree.d.ts +0 -11
- package/dist/lib/eval-worktree.d.ts.map +0 -1
- package/dist/lib/eval-worktree.test.d.ts +0 -2
- package/dist/lib/eval-worktree.test.d.ts.map +0 -1
- package/dist/lib/eval-worktree.test.js +0 -68
- package/dist/lib/eval-worktree.test.js.map +0 -1
- package/dist/lib/gateway-entry.d.ts +0 -3
- package/dist/lib/gateway-entry.d.ts.map +0 -1
- package/dist/lib/gateway-lifecycle.d.ts +0 -9
- package/dist/lib/gateway-lifecycle.d.ts.map +0 -1
- package/dist/lib/gateway.d.ts +0 -11
- package/dist/lib/gateway.d.ts.map +0 -1
- package/dist/lib/graphile-worker-runner.d.ts +0 -124
- package/dist/lib/graphile-worker-runner.d.ts.map +0 -1
- package/dist/lib/graphile-worker-runner.js +0 -530
- package/dist/lib/graphile-worker-runner.js.map +0 -1
- package/dist/lib/graphile-worker-runner.test.d.ts +0 -2
- package/dist/lib/graphile-worker-runner.test.d.ts.map +0 -1
- package/dist/lib/graphile-worker-runner.test.js +0 -153
- package/dist/lib/graphile-worker-runner.test.js.map +0 -1
- package/dist/lib/handlers/cron-close-stale-sessions.d.ts +0 -3
- package/dist/lib/handlers/cron-close-stale-sessions.d.ts.map +0 -1
- package/dist/lib/handlers/cron-data-integrity-audit.d.ts +0 -3
- package/dist/lib/handlers/cron-data-integrity-audit.d.ts.map +0 -1
- package/dist/lib/handlers/cron-refresh-skills.d.ts +0 -3
- package/dist/lib/handlers/cron-refresh-skills.d.ts.map +0 -1
- package/dist/lib/handlers/cron-refresh-skills.test.d.ts +0 -2
- package/dist/lib/handlers/cron-refresh-skills.test.d.ts.map +0 -1
- package/dist/lib/handlers/cron-refresh-skills.test.js +0 -114
- package/dist/lib/handlers/cron-refresh-skills.test.js.map +0 -1
- package/dist/lib/handlers/cron-regenerate-insights.d.ts +0 -3
- package/dist/lib/handlers/cron-regenerate-insights.d.ts.map +0 -1
- package/dist/lib/handlers/cron-regenerate-insights.js +0 -6
- package/dist/lib/handlers/cron-regenerate-insights.js.map +0 -1
- package/dist/lib/handlers/cron-suggest-instructions.d.ts +0 -3
- package/dist/lib/handlers/cron-suggest-instructions.d.ts.map +0 -1
- package/dist/lib/handlers/cron-suggest-instructions.test.d.ts +0 -2
- package/dist/lib/handlers/cron-suggest-instructions.test.d.ts.map +0 -1
- package/dist/lib/handlers/cron-suggest-instructions.test.js +0 -80
- package/dist/lib/handlers/cron-suggest-instructions.test.js.map +0 -1
- package/dist/lib/handlers/process-conversation.d.ts +0 -35
- package/dist/lib/handlers/process-conversation.d.ts.map +0 -1
- package/dist/lib/handlers/process-eval.d.ts +0 -32
- package/dist/lib/handlers/process-eval.d.ts.map +0 -1
- package/dist/lib/handlers/process-insights.d.ts +0 -39
- package/dist/lib/handlers/process-insights.d.ts.map +0 -1
- package/dist/lib/handlers/process-launch.d.ts +0 -29
- package/dist/lib/handlers/process-launch.d.ts.map +0 -1
- package/dist/lib/handlers/process-session-goal.d.ts +0 -29
- package/dist/lib/handlers/process-session-goal.d.ts.map +0 -1
- package/dist/lib/handlers/process-session-goal.test.d.ts +0 -2
- package/dist/lib/handlers/process-session-goal.test.d.ts.map +0 -1
- package/dist/lib/handlers/process-session-goal.test.js +0 -134
- package/dist/lib/handlers/process-session-goal.test.js.map +0 -1
- package/dist/lib/hooks-config.d.ts +0 -119
- package/dist/lib/hooks-config.d.ts.map +0 -1
- package/dist/lib/hooks-config.test.d.ts +0 -2
- package/dist/lib/hooks-config.test.d.ts.map +0 -1
- package/dist/lib/hooks-config.test.js +0 -231
- package/dist/lib/hooks-config.test.js.map +0 -1
- package/dist/lib/insights-prompts.d.ts +0 -13
- package/dist/lib/insights-prompts.d.ts.map +0 -1
- package/dist/lib/llm-client.d.ts +0 -26
- package/dist/lib/llm-client.d.ts.map +0 -1
- package/dist/lib/llm-client.test.d.ts +0 -2
- package/dist/lib/llm-client.test.d.ts.map +0 -1
- package/dist/lib/llm-client.test.js +0 -62
- package/dist/lib/llm-client.test.js.map +0 -1
- package/dist/lib/mirror-writer-db.d.ts +0 -12
- package/dist/lib/mirror-writer-db.d.ts.map +0 -1
- package/dist/lib/mirror-writer-db.js +0 -51
- package/dist/lib/mirror-writer-db.js.map +0 -1
- package/dist/lib/mirror-writer.d.ts +0 -35
- package/dist/lib/mirror-writer.d.ts.map +0 -1
- package/dist/lib/mirror-writer.js +0 -27
- package/dist/lib/mirror-writer.js.map +0 -1
- package/dist/lib/mirror-writer.test.d.ts +0 -2
- package/dist/lib/mirror-writer.test.d.ts.map +0 -1
- package/dist/lib/mirror-writer.test.js +0 -47
- package/dist/lib/mirror-writer.test.js.map +0 -1
- package/dist/lib/output.d.ts +0 -4
- package/dist/lib/output.d.ts.map +0 -1
- package/dist/lib/output.test.d.ts +0 -2
- package/dist/lib/output.test.d.ts.map +0 -1
- package/dist/lib/output.test.js +0 -71
- package/dist/lib/output.test.js.map +0 -1
- package/dist/lib/permanent-job-error.d.ts +0 -17
- package/dist/lib/permanent-job-error.d.ts.map +0 -1
- package/dist/lib/permanent-job-error.test.d.ts +0 -2
- package/dist/lib/permanent-job-error.test.d.ts.map +0 -1
- package/dist/lib/permanent-job-error.test.js +0 -29
- package/dist/lib/permanent-job-error.test.js.map +0 -1
- package/dist/lib/provider-aggregator.d.ts +0 -24
- package/dist/lib/provider-aggregator.d.ts.map +0 -1
- package/dist/lib/provider-aggregator.test.d.ts +0 -2
- package/dist/lib/provider-aggregator.test.d.ts.map +0 -1
- package/dist/lib/provider-aggregator.test.js +0 -103
- package/dist/lib/provider-aggregator.test.js.map +0 -1
- package/dist/lib/skills-loader.d.ts +0 -6
- package/dist/lib/skills-loader.d.ts.map +0 -1
- package/dist/lib/types.d.ts +0 -48
- package/dist/lib/types.d.ts.map +0 -1
- package/dist/lib/version-check.d.ts +0 -11
- package/dist/lib/version-check.d.ts.map +0 -1
- package/dist/test-helpers.d.ts +0 -58
- package/dist/test-helpers.d.ts.map +0 -1
- package/dist/test-helpers.js +0 -58
- package/dist/test-helpers.js.map +0 -1
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
// src/dashboard/types.ts
|
|
2
|
+
var PERIODS = ["today", "week", "30days", "month", "all"];
|
|
3
|
+
var PERIOD_LABELS = {
|
|
4
|
+
today: "Today",
|
|
5
|
+
week: "7 Days",
|
|
6
|
+
"30days": "30 Days",
|
|
7
|
+
month: "This Month",
|
|
8
|
+
all: "All Time"
|
|
9
|
+
};
|
|
10
|
+
function getDateRange(period) {
|
|
11
|
+
const now = /* @__PURE__ */ new Date();
|
|
12
|
+
const end = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 23, 59, 59, 999);
|
|
13
|
+
switch (period) {
|
|
14
|
+
case "today":
|
|
15
|
+
return { start: new Date(now.getFullYear(), now.getMonth(), now.getDate()), end };
|
|
16
|
+
case "week":
|
|
17
|
+
return { start: new Date(now.getFullYear(), now.getMonth(), now.getDate() - 7), end };
|
|
18
|
+
case "30days":
|
|
19
|
+
return { start: new Date(now.getFullYear(), now.getMonth(), now.getDate() - 30), end };
|
|
20
|
+
case "month":
|
|
21
|
+
return { start: new Date(now.getFullYear(), now.getMonth(), 1), end };
|
|
22
|
+
case "all":
|
|
23
|
+
return { start: /* @__PURE__ */ new Date(0), end };
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
var ORANGE = "#FF8C42";
|
|
27
|
+
var DIM = "#555555";
|
|
28
|
+
var GOLD = "#FFD700";
|
|
29
|
+
var GREEN = "#5BF58C";
|
|
30
|
+
var RED = "#F55B5B";
|
|
31
|
+
var BLUE = "#5B9EF5";
|
|
32
|
+
|
|
33
|
+
export {
|
|
34
|
+
PERIODS,
|
|
35
|
+
PERIOD_LABELS,
|
|
36
|
+
getDateRange,
|
|
37
|
+
ORANGE,
|
|
38
|
+
DIM,
|
|
39
|
+
GOLD,
|
|
40
|
+
GREEN,
|
|
41
|
+
RED,
|
|
42
|
+
BLUE
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=chunk-QJQS6TUN.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/dashboard/types.ts"],
|
|
4
|
+
"sourcesContent": ["export type Period = 'today' | 'week' | '30days' | 'month' | 'all';\n\nexport const PERIODS: Period[] = ['today', 'week', '30days', 'month', 'all'];\n\nexport const PERIOD_LABELS: Record<Period, string> = {\n today: 'Today',\n week: '7 Days',\n '30days': '30 Days',\n month: 'This Month',\n all: 'All Time',\n};\n\nexport function getDateRange(period: Period): { start: Date; end: Date } {\n const now = new Date();\n const end = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 23, 59, 59, 999);\n switch (period) {\n case 'today': return { start: new Date(now.getFullYear(), now.getMonth(), now.getDate()), end };\n case 'week': return { start: new Date(now.getFullYear(), now.getMonth(), now.getDate() - 7), end };\n case '30days': return { start: new Date(now.getFullYear(), now.getMonth(), now.getDate() - 30), end };\n case 'month': return { start: new Date(now.getFullYear(), now.getMonth(), 1), end };\n case 'all': return { start: new Date(0), end };\n }\n}\n\n// Colors\nexport const ORANGE = '#FF8C42';\nexport const DIM = '#555555';\nexport const GOLD = '#FFD700';\nexport const GREEN = '#5BF58C';\nexport const RED = '#F55B5B';\nexport const BLUE = '#5B9EF5';\n\nexport interface LocalStats {\n totalSessions: number;\n totalCalls: number;\n totalInputTokens: number;\n totalOutputTokens: number;\n totalCacheReadTokens: number;\n totalCacheWriteTokens: number;\n totalCostUSD: number;\n providers: Record<string, number>;\n}\n\nexport interface Suggestion {\n label: string;\n description: string;\n command: string;\n}\n\nexport interface ApiInsights {\n total_sessions: number;\n sessions_with_meta: number;\n sessions_with_analysis: number;\n total_messages: number;\n total_duration_hours: number;\n total_input_tokens: number;\n total_output_tokens: number;\n total_cache_read_tokens: number;\n total_cache_write_tokens: number;\n estimated_cost_usd: number;\n outcomes: Record<string, number>;\n friction: Record<string, number>;\n goal_categories: Record<string, number>;\n tools_used: Record<string, number>;\n tool_counts: Record<string, number>;\n git_commits: number;\n days_active: number;\n messages_per_day: number;\n recommendations?: {\n at_a_glance?: Record<string, string>;\n suggestions?: {\n features_to_try?: Array<{ feature: string; one_liner: string; why_for_you: string; example_code: string }>;\n usage_patterns?: Array<{ title: string; suggestion: string; detail: string; copyable_prompt: string }>;\n claude_md_additions?: Array<{ addition: string; why: string; prompt_scaffold: string }>;\n };\n on_the_horizon?: {\n opportunities?: Array<{ title: string; whats_possible: string; how_to_try: string; copyable_prompt: string }>;\n };\n [key: string]: unknown;\n };\n}\n"],
|
|
5
|
+
"mappings": ";AAEO,IAAM,UAAoB,CAAC,SAAS,QAAQ,UAAU,SAAS,KAAK;AAEpE,IAAM,gBAAwC;AAAA,EACnD,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU;AAAA,EACV,OAAO;AAAA,EACP,KAAK;AACP;AAEO,SAAS,aAAa,QAA4C;AACvE,QAAM,MAAM,oBAAI,KAAK;AACrB,QAAM,MAAM,IAAI,KAAK,IAAI,YAAY,GAAG,IAAI,SAAS,GAAG,IAAI,QAAQ,GAAG,IAAI,IAAI,IAAI,GAAG;AACtF,UAAQ,QAAQ;AAAA,IACd,KAAK;AAAS,aAAO,EAAE,OAAO,IAAI,KAAK,IAAI,YAAY,GAAG,IAAI,SAAS,GAAG,IAAI,QAAQ,CAAC,GAAG,IAAI;AAAA,IAC9F,KAAK;AAAQ,aAAO,EAAE,OAAO,IAAI,KAAK,IAAI,YAAY,GAAG,IAAI,SAAS,GAAG,IAAI,QAAQ,IAAI,CAAC,GAAG,IAAI;AAAA,IACjG,KAAK;AAAU,aAAO,EAAE,OAAO,IAAI,KAAK,IAAI,YAAY,GAAG,IAAI,SAAS,GAAG,IAAI,QAAQ,IAAI,EAAE,GAAG,IAAI;AAAA,IACpG,KAAK;AAAS,aAAO,EAAE,OAAO,IAAI,KAAK,IAAI,YAAY,GAAG,IAAI,SAAS,GAAG,CAAC,GAAG,IAAI;AAAA,IAClF,KAAK;AAAO,aAAO,EAAE,OAAO,oBAAI,KAAK,CAAC,GAAG,IAAI;AAAA,EAC/C;AACF;AAGO,IAAM,SAAS;AACf,IAAM,MAAM;AACZ,IAAM,OAAO;AACb,IAAM,QAAQ;AACd,IAAM,MAAM;AACZ,IAAM,OAAO;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import {
|
|
2
|
+
PermanentJobError
|
|
3
|
+
} from "./chunk-DGHWRQXL.js";
|
|
4
|
+
import {
|
|
5
|
+
judgeEvalQuality
|
|
6
|
+
} from "./chunk-J7N3DLH6.js";
|
|
7
|
+
import {
|
|
8
|
+
createEvalWorktree
|
|
9
|
+
} from "./chunk-52WIYRZH.js";
|
|
10
|
+
import {
|
|
11
|
+
gradeEvalOutput
|
|
12
|
+
} from "./chunk-YNIH3KMU.js";
|
|
13
|
+
import {
|
|
14
|
+
executeEval
|
|
15
|
+
} from "./chunk-QN34TGD3.js";
|
|
16
|
+
import {
|
|
17
|
+
apiGet,
|
|
18
|
+
apiPatch,
|
|
19
|
+
apiPost
|
|
20
|
+
} from "./chunk-EJOI2ZGU.js";
|
|
21
|
+
|
|
22
|
+
// src/lib/handlers/process-eval.ts
|
|
23
|
+
async function processEval(payload, helpers) {
|
|
24
|
+
const { mirrorId, evalTargetId, config } = payload;
|
|
25
|
+
const log = (msg) => helpers.logger.info(msg);
|
|
26
|
+
if (helpers.job.attempts > 1) {
|
|
27
|
+
throw new PermanentJobError(
|
|
28
|
+
`process_eval is not safe to retry (attempt ${helpers.job.attempts}). Re-trigger the eval run from the UI.`
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
const target = await apiGet(`/api/eval-targets/${evalTargetId}`);
|
|
32
|
+
const evalCases = await apiGet(`/api/eval-targets/${evalTargetId}/evals`);
|
|
33
|
+
if (evalCases.length === 0) {
|
|
34
|
+
throw new PermanentJobError("No evals defined for target");
|
|
35
|
+
}
|
|
36
|
+
const runsPerEval = config.runsPerEval ?? 1;
|
|
37
|
+
const timeout = config.timeout ?? 12e4;
|
|
38
|
+
const iteration = config.iteration ?? 1;
|
|
39
|
+
const configurations = [
|
|
40
|
+
{ name: "with_target", content: target.content }
|
|
41
|
+
];
|
|
42
|
+
if (!config.skipBaseline) {
|
|
43
|
+
configurations.push({ name: "without_target" });
|
|
44
|
+
}
|
|
45
|
+
const workQueue = [];
|
|
46
|
+
for (const eval_ of evalCases) {
|
|
47
|
+
for (const cfg of configurations) {
|
|
48
|
+
for (let run = 1; run <= runsPerEval; run++) {
|
|
49
|
+
workQueue.push({ eval_, configuration: cfg.name, targetContent: cfg.content, runNumber: run });
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
const total = workQueue.length;
|
|
54
|
+
let completed = 0;
|
|
55
|
+
const concurrency = Math.min(config.parallel ?? 1, 4);
|
|
56
|
+
await apiPatch(`/api/eval-jobs/${mirrorId}/progress`, {
|
|
57
|
+
status: "running",
|
|
58
|
+
progress: { total, completed: 0, current: null, message: `Starting ${total} eval runs (concurrency: ${concurrency})...` }
|
|
59
|
+
});
|
|
60
|
+
const results = [];
|
|
61
|
+
async function processItem(item) {
|
|
62
|
+
const label = `${item.configuration} \xB7 ${item.eval_.name} \xB7 run#${item.runNumber}`;
|
|
63
|
+
log(`[${completed + 1}/${total}] ${label}`);
|
|
64
|
+
const worktree = concurrency > 1 ? createEvalWorktree() : null;
|
|
65
|
+
try {
|
|
66
|
+
const execResult = await executeEval({
|
|
67
|
+
prompt: item.eval_.prompt,
|
|
68
|
+
targetContent: item.targetContent,
|
|
69
|
+
workDir: worktree?.workDir,
|
|
70
|
+
timeout,
|
|
71
|
+
model: config.model
|
|
72
|
+
});
|
|
73
|
+
let grading = {};
|
|
74
|
+
if (!config.skipGrading && item.eval_.expectations.length > 0 && !execResult.error) {
|
|
75
|
+
const gradingResult = await gradeEvalOutput({
|
|
76
|
+
prompt: item.eval_.prompt,
|
|
77
|
+
output: execResult.output,
|
|
78
|
+
expectations: item.eval_.expectations,
|
|
79
|
+
model: config.graderModel ?? config.model,
|
|
80
|
+
timeout
|
|
81
|
+
});
|
|
82
|
+
grading = gradingResult;
|
|
83
|
+
}
|
|
84
|
+
return {
|
|
85
|
+
evalId: item.eval_.id,
|
|
86
|
+
evalTargetId: target.id,
|
|
87
|
+
evalTargetVersion: target.version,
|
|
88
|
+
configuration: item.configuration,
|
|
89
|
+
runNumber: item.runNumber,
|
|
90
|
+
iteration,
|
|
91
|
+
status: execResult.error ? "failed" : "completed",
|
|
92
|
+
outputs: execResult.error ? { error: execResult.error } : { transcript: execResult.output },
|
|
93
|
+
timing: { duration_ms: execResult.durationMs, total_tokens: execResult.totalTokens },
|
|
94
|
+
grading,
|
|
95
|
+
worktree: worktree?.isWorktree ? true : void 0
|
|
96
|
+
};
|
|
97
|
+
} finally {
|
|
98
|
+
worktree?.cleanup();
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
if (concurrency <= 1) {
|
|
102
|
+
for (const item of workQueue) {
|
|
103
|
+
const label = `${item.configuration} \xB7 ${item.eval_.name} \xB7 run#${item.runNumber}`;
|
|
104
|
+
await apiPatch(`/api/eval-jobs/${mirrorId}/progress`, {
|
|
105
|
+
status: "running",
|
|
106
|
+
progress: { total, completed, current: label, message: `Executing ${label}...` }
|
|
107
|
+
});
|
|
108
|
+
const runResult = await processItem(item);
|
|
109
|
+
await apiPost("/api/eval-runs", runResult);
|
|
110
|
+
results.push(runResult);
|
|
111
|
+
completed++;
|
|
112
|
+
await apiPatch(`/api/eval-jobs/${mirrorId}/progress`, {
|
|
113
|
+
status: "running",
|
|
114
|
+
progress: { total, completed, current: label, message: `Completed ${label}` }
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
} else {
|
|
118
|
+
log(`Running ${total} evals with concurrency=${concurrency} (worktree isolation)`);
|
|
119
|
+
for (let i = 0; i < workQueue.length; i += concurrency) {
|
|
120
|
+
const batch = workQueue.slice(i, i + concurrency);
|
|
121
|
+
const batchLabel = `batch ${Math.floor(i / concurrency) + 1}/${Math.ceil(workQueue.length / concurrency)}`;
|
|
122
|
+
await apiPatch(`/api/eval-jobs/${mirrorId}/progress`, {
|
|
123
|
+
status: "running",
|
|
124
|
+
progress: { total, completed, current: batchLabel, message: `Executing ${batchLabel} (${batch.length} parallel)...` }
|
|
125
|
+
});
|
|
126
|
+
const batchResults = await Promise.all(batch.map(processItem));
|
|
127
|
+
for (const runResult of batchResults) {
|
|
128
|
+
await apiPost("/api/eval-runs", runResult);
|
|
129
|
+
results.push(runResult);
|
|
130
|
+
completed++;
|
|
131
|
+
}
|
|
132
|
+
await apiPatch(`/api/eval-jobs/${mirrorId}/progress`, {
|
|
133
|
+
status: "running",
|
|
134
|
+
progress: { total, completed, current: batchLabel, message: `Completed ${batchLabel}` }
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
const summary = buildSummary(results);
|
|
139
|
+
let metaJudgement;
|
|
140
|
+
if (!config.skipGrading && results.some((r) => r.grading && Object.keys(r.grading).length > 0)) {
|
|
141
|
+
try {
|
|
142
|
+
log(`Running meta-judge for job ${mirrorId}...`);
|
|
143
|
+
const evalInputs = evalCases.map((e) => {
|
|
144
|
+
const matchingResults = results.filter((r) => r.evalId === e.id && r.configuration === "with_target");
|
|
145
|
+
const firstResult = matchingResults[0];
|
|
146
|
+
return {
|
|
147
|
+
evalName: e.name,
|
|
148
|
+
prompt: e.prompt,
|
|
149
|
+
expectations: e.expectations,
|
|
150
|
+
grading: firstResult?.grading ? firstResult.grading : null,
|
|
151
|
+
output: firstResult?.outputs?.transcript?.slice(0, 500)
|
|
152
|
+
};
|
|
153
|
+
});
|
|
154
|
+
metaJudgement = await judgeEvalQuality({
|
|
155
|
+
targetName: target.name,
|
|
156
|
+
evalResults: evalInputs,
|
|
157
|
+
model: config.graderModel ?? config.model,
|
|
158
|
+
timeout: 6e4
|
|
159
|
+
});
|
|
160
|
+
log(`Meta-judge: quality=${metaJudgement.quality_score}/5, issues=${metaJudgement.issues.length}`);
|
|
161
|
+
} catch (err) {
|
|
162
|
+
log(`Meta-judge failed (non-fatal): ${err instanceof Error ? err.message : String(err)}`);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
const result = metaJudgement ? { ...summary, meta_judgement: metaJudgement } : summary;
|
|
166
|
+
log(`Job ${mirrorId} completed: ${completed}/${total} runs`);
|
|
167
|
+
await apiPatch(`/api/eval-jobs/${mirrorId}/state`, { result }).catch((err) => {
|
|
168
|
+
log(`result persist failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
169
|
+
});
|
|
170
|
+
return result;
|
|
171
|
+
}
|
|
172
|
+
function buildSummary(results) {
|
|
173
|
+
const completed = results.filter((r) => r.status === "completed");
|
|
174
|
+
const failed = results.filter((r) => r.status === "failed");
|
|
175
|
+
const gradedRuns = completed.filter((r) => {
|
|
176
|
+
const grading = r.grading;
|
|
177
|
+
return grading && Object.keys(grading).length > 0;
|
|
178
|
+
});
|
|
179
|
+
const avgPassRate = gradedRuns.length > 0 ? gradedRuns.reduce((sum, r) => sum + (r.grading?.summary?.pass_rate ?? 0), 0) / gradedRuns.length : null;
|
|
180
|
+
return {
|
|
181
|
+
total: results.length,
|
|
182
|
+
completed: completed.length,
|
|
183
|
+
failed: failed.length,
|
|
184
|
+
avgPassRate
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
export {
|
|
189
|
+
processEval
|
|
190
|
+
};
|
|
191
|
+
//# sourceMappingURL=chunk-QJXAULRC.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/lib/handlers/process-eval.ts"],
|
|
4
|
+
"sourcesContent": ["import type { JobHelpers } from '../job-helpers.js';\nimport { apiGet, apiPost, apiPatch } from '../api-client.js';\nimport { executeEval } from '../eval-executor.js';\nimport { gradeEvalOutput, type GradingResult } from '../eval-grader.js';\nimport { judgeEvalQuality, type MetaJudgement } from '../eval-meta-judge.js';\nimport { createEvalWorktree } from '../eval-worktree.js';\nimport { PermanentJobError } from '../permanent-job-error.js';\n\ninterface EvalTarget {\n id: string;\n name: string;\n type: string;\n content: string;\n version: number;\n}\n\ninterface Eval {\n id: string;\n name: string;\n prompt: string;\n expectedOutput: string;\n expectations: string[];\n}\n\ninterface EvalPayload {\n mirrorId: string;\n evalTargetId: string;\n config: {\n parallel?: number;\n runsPerEval?: number;\n iteration?: number;\n skipBaseline?: boolean;\n skipGrading?: boolean;\n model?: string;\n graderModel?: string;\n timeout?: number;\n };\n}\n\n/**\n * Graphile-shaped handler for the `process_eval` task.\n *\n * Lifted verbatim from the legacy `eval-worker.ts:processJob` body, with the\n * queue plumbing stripped out:\n * - no claim \u2014 Graphile already claimed the job before invoking us\n * - no /complete POST \u2014 we return the result object (or throw)\n * - no `processing` flag \u2014 that lived in the polling loop's closure\n * - no conversation branch \u2014 split into its own handler (Task 14)\n *\n * Mid-job progress patches still hit the existing\n * `PATCH /api/eval-jobs/:id/progress` endpoint, just keyed by the mirror row's\n * id instead of the legacy queue id.\n */\nexport async function processEval(\n payload: EvalPayload,\n helpers: JobHelpers,\n): Promise<Record<string, unknown>> {\n const { mirrorId, evalTargetId, config } = payload;\n const log = (msg: string) => helpers.logger.info(msg);\n\n // Fail-fast on retry. Each eval_run is INSERT'd as it completes, but\n // there's no idempotency key tying a row to a specific job \u2014 re-running\n // the whole batch would duplicate every previously-completed row in\n // eval_runs. Until proper resume-from-progress-checkpoint lands, surface\n // the failure to the user instead of silently doubling-up rows. See\n // docs/audits/2026-05-07-worker-audit.md \"Handlers not idempotent\".\n if (helpers.job.attempts > 1) {\n throw new PermanentJobError(\n `process_eval is not safe to retry (attempt ${helpers.job.attempts}). Re-trigger the eval run from the UI.`,\n );\n }\n\n const target = await apiGet<EvalTarget>(`/api/eval-targets/${evalTargetId}`);\n const evalCases = await apiGet<Eval[]>(`/api/eval-targets/${evalTargetId}/evals`);\n\n if (evalCases.length === 0) {\n // No retries \u2014 eval cases don't materialize on their own; the user has\n // to add one via the UI/CLI. Skip Graphile's retry loop.\n throw new PermanentJobError('No evals defined for target');\n }\n\n const runsPerEval = config.runsPerEval ?? 1;\n const timeout = config.timeout ?? 120_000;\n const iteration = config.iteration ?? 1;\n\n const configurations: Array<{ name: string; content?: string }> = [\n { name: 'with_target', content: target.content },\n ];\n if (!config.skipBaseline) {\n configurations.push({ name: 'without_target' });\n }\n\n // Build work queue\n const workQueue: Array<{ eval_: Eval; configuration: string; targetContent?: string; runNumber: number }> = [];\n for (const eval_ of evalCases) {\n for (const cfg of configurations) {\n for (let run = 1; run <= runsPerEval; run++) {\n workQueue.push({ eval_: eval_, configuration: cfg.name, targetContent: cfg.content, runNumber: run });\n }\n }\n }\n\n const total = workQueue.length;\n let completed = 0;\n const concurrency = Math.min(config.parallel ?? 1, 4); // cap at 4 parallel\n\n await apiPatch(`/api/eval-jobs/${mirrorId}/progress`, {\n status: 'running',\n progress: { total, completed: 0, current: null, message: `Starting ${total} eval runs (concurrency: ${concurrency})...` },\n });\n\n const results: Record<string, unknown>[] = [];\n\n // Process work items \u2014 sequential if concurrency=1, parallel otherwise\n async function processItem(item: typeof workQueue[0]): Promise<Record<string, unknown>> {\n const label = `${item.configuration} \u00B7 ${item.eval_.name} \u00B7 run#${item.runNumber}`;\n log(`[${completed + 1}/${total}] ${label}`);\n\n // Create isolated worktree for parallel execution\n const worktree = concurrency > 1 ? createEvalWorktree() : null;\n\n try {\n const execResult = await executeEval({\n prompt: item.eval_.prompt,\n targetContent: item.targetContent,\n workDir: worktree?.workDir,\n timeout,\n model: config.model,\n });\n\n let grading: Record<string, unknown> = {};\n if (!config.skipGrading && item.eval_.expectations.length > 0 && !execResult.error) {\n const gradingResult = await gradeEvalOutput({\n prompt: item.eval_.prompt,\n output: execResult.output,\n expectations: item.eval_.expectations,\n model: config.graderModel ?? config.model,\n timeout,\n });\n grading = gradingResult as unknown as Record<string, unknown>;\n }\n\n return {\n evalId: item.eval_.id,\n evalTargetId: target.id,\n evalTargetVersion: target.version,\n configuration: item.configuration,\n runNumber: item.runNumber,\n iteration,\n status: execResult.error ? 'failed' : 'completed',\n outputs: execResult.error ? { error: execResult.error } : { transcript: execResult.output },\n timing: { duration_ms: execResult.durationMs, total_tokens: execResult.totalTokens },\n grading,\n worktree: worktree?.isWorktree ? true : undefined,\n };\n } finally {\n worktree?.cleanup();\n }\n }\n\n if (concurrency <= 1) {\n // Sequential execution (existing behavior)\n for (const item of workQueue) {\n const label = `${item.configuration} \u00B7 ${item.eval_.name} \u00B7 run#${item.runNumber}`;\n await apiPatch(`/api/eval-jobs/${mirrorId}/progress`, {\n status: 'running',\n progress: { total, completed, current: label, message: `Executing ${label}...` },\n });\n\n const runResult = await processItem(item);\n await apiPost('/api/eval-runs', runResult);\n results.push(runResult);\n completed++;\n\n await apiPatch(`/api/eval-jobs/${mirrorId}/progress`, {\n status: 'running',\n progress: { total, completed, current: label, message: `Completed ${label}` },\n });\n }\n } else {\n // Parallel execution with worktree isolation\n log(`Running ${total} evals with concurrency=${concurrency} (worktree isolation)`);\n for (let i = 0; i < workQueue.length; i += concurrency) {\n const batch = workQueue.slice(i, i + concurrency);\n const batchLabel = `batch ${Math.floor(i / concurrency) + 1}/${Math.ceil(workQueue.length / concurrency)}`;\n\n await apiPatch(`/api/eval-jobs/${mirrorId}/progress`, {\n status: 'running',\n progress: { total, completed, current: batchLabel, message: `Executing ${batchLabel} (${batch.length} parallel)...` },\n });\n\n const batchResults = await Promise.all(batch.map(processItem));\n\n for (const runResult of batchResults) {\n await apiPost('/api/eval-runs', runResult);\n results.push(runResult);\n completed++;\n }\n\n await apiPatch(`/api/eval-jobs/${mirrorId}/progress`, {\n status: 'running',\n progress: { total, completed, current: batchLabel, message: `Completed ${batchLabel}` },\n });\n }\n }\n\n const summary = buildSummary(results);\n\n // Meta-judge: assess eval quality if we have grading results\n let metaJudgement: MetaJudgement | undefined;\n if (!config.skipGrading && results.some(r => r.grading && Object.keys(r.grading as object).length > 0)) {\n try {\n log(`Running meta-judge for job ${mirrorId}...`);\n const evalInputs = evalCases.map(e => {\n const matchingResults = results.filter(r => r.evalId === e.id && r.configuration === 'with_target');\n const firstResult = matchingResults[0];\n return {\n evalName: e.name,\n prompt: e.prompt,\n expectations: e.expectations,\n grading: firstResult?.grading ? firstResult.grading as unknown as GradingResult : null,\n output: (firstResult?.outputs as Record<string, string>)?.transcript?.slice(0, 500),\n };\n });\n metaJudgement = await judgeEvalQuality({\n targetName: target.name,\n evalResults: evalInputs,\n model: config.graderModel ?? config.model,\n timeout: 60000,\n });\n log(`Meta-judge: quality=${metaJudgement.quality_score}/5, issues=${metaJudgement.issues.length}`);\n } catch (err) {\n log(`Meta-judge failed (non-fatal): ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n const result = metaJudgement\n ? { ...summary, meta_judgement: metaJudgement }\n : summary;\n log(`Job ${mirrorId} completed: ${completed}/${total} runs`);\n\n // Graphile discards task return values, so persist the summary onto the\n // mirror row here. Best-effort: a failure to write the result must not\n // mark the job as failed (it succeeded; we just lose the summary blob).\n await apiPatch(`/api/eval-jobs/${mirrorId}/state`, { result }).catch((err: unknown) => {\n log(`result persist failed: ${err instanceof Error ? err.message : String(err)}`);\n });\n\n return result;\n}\n\nfunction buildSummary(results: Record<string, unknown>[]): Record<string, unknown> {\n const completed = results.filter((r) => r.status === 'completed');\n const failed = results.filter((r) => r.status === 'failed');\n\n const gradedRuns = completed.filter((r) => {\n const grading = r.grading as Record<string, any>;\n return grading && Object.keys(grading).length > 0;\n });\n\n const avgPassRate = gradedRuns.length > 0\n ? gradedRuns.reduce((sum, r) => sum + ((r.grading as any)?.summary?.pass_rate ?? 0), 0) / gradedRuns.length\n : null;\n\n return {\n total: results.length,\n completed: completed.length,\n failed: failed.length,\n avgPassRate,\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// src/lib/eval-executor.ts
|
|
2
|
+
import { spawn } from "node:child_process";
|
|
3
|
+
async function executeEval(options) {
|
|
4
|
+
const {
|
|
5
|
+
prompt,
|
|
6
|
+
targetContent,
|
|
7
|
+
systemPrompt,
|
|
8
|
+
workDir = process.cwd(),
|
|
9
|
+
timeout = 12e4,
|
|
10
|
+
model
|
|
11
|
+
} = options;
|
|
12
|
+
const args = ["-p", prompt, "--output-format", "json"];
|
|
13
|
+
const sysPrompt = targetContent ?? systemPrompt;
|
|
14
|
+
if (sysPrompt) {
|
|
15
|
+
args.push("--system-prompt", sysPrompt);
|
|
16
|
+
}
|
|
17
|
+
if (model) {
|
|
18
|
+
args.push("--model", model);
|
|
19
|
+
}
|
|
20
|
+
const startTime = Date.now();
|
|
21
|
+
return new Promise((resolve) => {
|
|
22
|
+
const env = { ...process.env };
|
|
23
|
+
delete env.CLAUDECODE;
|
|
24
|
+
delete env.HTTPS_PROXY;
|
|
25
|
+
const proc = spawn("claude", args, {
|
|
26
|
+
cwd: workDir,
|
|
27
|
+
env,
|
|
28
|
+
stdio: ["ignore", "pipe", "pipe"]
|
|
29
|
+
});
|
|
30
|
+
let stdout = "";
|
|
31
|
+
let stderr = "";
|
|
32
|
+
proc.stdout.on("data", (data) => {
|
|
33
|
+
stdout += data.toString();
|
|
34
|
+
});
|
|
35
|
+
proc.stderr.on("data", (data) => {
|
|
36
|
+
stderr += data.toString();
|
|
37
|
+
});
|
|
38
|
+
const timer = setTimeout(() => {
|
|
39
|
+
proc.kill("SIGTERM");
|
|
40
|
+
resolve({
|
|
41
|
+
output: stdout,
|
|
42
|
+
exitCode: null,
|
|
43
|
+
durationMs: Date.now() - startTime,
|
|
44
|
+
totalTokens: 0,
|
|
45
|
+
error: `Timed out after ${timeout}ms`
|
|
46
|
+
});
|
|
47
|
+
}, timeout);
|
|
48
|
+
proc.on("close", (code) => {
|
|
49
|
+
clearTimeout(timer);
|
|
50
|
+
const durationMs = Date.now() - startTime;
|
|
51
|
+
let totalTokens = 0;
|
|
52
|
+
let output = stdout;
|
|
53
|
+
try {
|
|
54
|
+
const parsed = JSON.parse(stdout);
|
|
55
|
+
output = parsed.result ?? parsed.content ?? stdout;
|
|
56
|
+
totalTokens = parsed.usage?.total_tokens ?? (parsed.usage?.input_tokens ?? 0) + (parsed.usage?.output_tokens ?? 0);
|
|
57
|
+
} catch {
|
|
58
|
+
}
|
|
59
|
+
resolve({
|
|
60
|
+
output,
|
|
61
|
+
exitCode: code,
|
|
62
|
+
durationMs,
|
|
63
|
+
totalTokens,
|
|
64
|
+
error: code !== 0 ? stderr || `Exit code ${code}` : void 0
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
proc.on("error", (err) => {
|
|
68
|
+
clearTimeout(timer);
|
|
69
|
+
resolve({
|
|
70
|
+
output: "",
|
|
71
|
+
exitCode: null,
|
|
72
|
+
durationMs: Date.now() - startTime,
|
|
73
|
+
totalTokens: 0,
|
|
74
|
+
error: `Failed to spawn claude: ${err.message}`
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export {
|
|
81
|
+
executeEval
|
|
82
|
+
};
|
|
83
|
+
//# sourceMappingURL=chunk-QN34TGD3.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/lib/eval-executor.ts"],
|
|
4
|
+
"sourcesContent": ["import { spawn } from 'node:child_process';\n\nexport interface EvalExecutorOptions {\n prompt: string;\n targetContent?: string;\n systemPrompt?: string; // alias for targetContent (used by grader/meta-judge)\n workDir?: string;\n timeout?: number; // ms, default 120_000\n model?: string;\n}\n\nexport interface EvalExecutorResult {\n output: string;\n exitCode: number | null;\n durationMs: number;\n totalTokens: number;\n error?: string;\n}\n\n/**\n * Executes a prompt via `claude -p` and captures the output.\n * Optionally injects target content as a system prompt.\n */\nexport async function executeEval(options: EvalExecutorOptions): Promise<EvalExecutorResult> {\n const {\n prompt,\n targetContent,\n systemPrompt,\n workDir = process.cwd(),\n timeout = 120_000,\n model,\n } = options;\n\n const args = ['-p', prompt, '--output-format', 'json'];\n const sysPrompt = targetContent ?? systemPrompt;\n if (sysPrompt) {\n args.push('--system-prompt', sysPrompt);\n }\n if (model) {\n args.push('--model', model);\n }\n\n const startTime = Date.now();\n\n return new Promise<EvalExecutorResult>((resolve) => {\n // Remove CLAUDECODE flag so spawned claude doesn't think it's a nested session.\n // Remove HTTPS_PROXY so eval runs bypass the capture proxy \u2014 these are internal\n // infrastructure calls, not user sessions. Routing through the proxy creates\n // phantom sessions that pollute insights.\n const env = { ...process.env };\n delete env.CLAUDECODE;\n delete env.HTTPS_PROXY;\n\n const proc = spawn('claude', args, {\n cwd: workDir,\n env,\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n\n let stdout = '';\n let stderr = '';\n\n proc.stdout.on('data', (data: Buffer) => {\n stdout += data.toString();\n });\n\n proc.stderr.on('data', (data: Buffer) => {\n stderr += data.toString();\n });\n\n const timer = setTimeout(() => {\n proc.kill('SIGTERM');\n resolve({\n output: stdout,\n exitCode: null,\n durationMs: Date.now() - startTime,\n totalTokens: 0,\n error: `Timed out after ${timeout}ms`,\n });\n }, timeout);\n\n proc.on('close', (code) => {\n clearTimeout(timer);\n const durationMs = Date.now() - startTime;\n\n // Try to parse JSON output for token usage\n let totalTokens = 0;\n let output = stdout;\n try {\n const parsed = JSON.parse(stdout);\n output = parsed.result ?? parsed.content ?? stdout;\n totalTokens = parsed.usage?.total_tokens\n ?? ((parsed.usage?.input_tokens ?? 0) + (parsed.usage?.output_tokens ?? 0));\n } catch {\n // stdout wasn't JSON, use raw text\n }\n\n resolve({\n output,\n exitCode: code,\n durationMs,\n totalTokens,\n error: code !== 0 ? stderr || `Exit code ${code}` : undefined,\n });\n });\n\n proc.on('error', (err) => {\n clearTimeout(timer);\n resolve({\n output: '',\n exitCode: null,\n durationMs: Date.now() - startTime,\n totalTokens: 0,\n error: `Failed to spawn claude: ${err.message}`,\n });\n });\n });\n}\n"],
|
|
5
|
+
"mappings": ";AAAA,SAAS,aAAa;AAuBtB,eAAsB,YAAY,SAA2D;AAC3F,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU,QAAQ,IAAI;AAAA,IACtB,UAAU;AAAA,IACV;AAAA,EACF,IAAI;AAEJ,QAAM,OAAO,CAAC,MAAM,QAAQ,mBAAmB,MAAM;AACrD,QAAM,YAAY,iBAAiB;AACnC,MAAI,WAAW;AACb,SAAK,KAAK,mBAAmB,SAAS;AAAA,EACxC;AACA,MAAI,OAAO;AACT,SAAK,KAAK,WAAW,KAAK;AAAA,EAC5B;AAEA,QAAM,YAAY,KAAK,IAAI;AAE3B,SAAO,IAAI,QAA4B,CAAC,YAAY;AAKlD,UAAM,MAAM,EAAE,GAAG,QAAQ,IAAI;AAC7B,WAAO,IAAI;AACX,WAAO,IAAI;AAEX,UAAM,OAAO,MAAM,UAAU,MAAM;AAAA,MACjC,KAAK;AAAA,MACL;AAAA,MACA,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,IAClC,CAAC;AAED,QAAI,SAAS;AACb,QAAI,SAAS;AAEb,SAAK,OAAO,GAAG,QAAQ,CAAC,SAAiB;AACvC,gBAAU,KAAK,SAAS;AAAA,IAC1B,CAAC;AAED,SAAK,OAAO,GAAG,QAAQ,CAAC,SAAiB;AACvC,gBAAU,KAAK,SAAS;AAAA,IAC1B,CAAC;AAED,UAAM,QAAQ,WAAW,MAAM;AAC7B,WAAK,KAAK,SAAS;AACnB,cAAQ;AAAA,QACN,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,YAAY,KAAK,IAAI,IAAI;AAAA,QACzB,aAAa;AAAA,QACb,OAAO,mBAAmB,OAAO;AAAA,MACnC,CAAC;AAAA,IACH,GAAG,OAAO;AAEV,SAAK,GAAG,SAAS,CAAC,SAAS;AACzB,mBAAa,KAAK;AAClB,YAAM,aAAa,KAAK,IAAI,IAAI;AAGhC,UAAI,cAAc;AAClB,UAAI,SAAS;AACb,UAAI;AACF,cAAM,SAAS,KAAK,MAAM,MAAM;AAChC,iBAAS,OAAO,UAAU,OAAO,WAAW;AAC5C,sBAAc,OAAO,OAAO,iBACrB,OAAO,OAAO,gBAAgB,MAAM,OAAO,OAAO,iBAAiB;AAAA,MAC5E,QAAQ;AAAA,MAER;AAEA,cAAQ;AAAA,QACN;AAAA,QACA,UAAU;AAAA,QACV;AAAA,QACA;AAAA,QACA,OAAO,SAAS,IAAI,UAAU,aAAa,IAAI,KAAK;AAAA,MACtD,CAAC;AAAA,IACH,CAAC;AAED,SAAK,GAAG,SAAS,CAAC,QAAQ;AACxB,mBAAa,KAAK;AAClB,cAAQ;AAAA,QACN,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,YAAY,KAAK,IAAI,IAAI;AAAA,QACzB,aAAa;AAAA,QACb,OAAO,2BAA2B,IAAI,OAAO;AAAA,MAC/C,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AACH;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import {
|
|
2
|
+
announceableEntries,
|
|
3
|
+
parseChangelog
|
|
4
|
+
} from "./chunk-K3BFZ7KG.js";
|
|
5
|
+
import {
|
|
6
|
+
renderChangelogAnnouncement
|
|
7
|
+
} from "./chunk-NIDLJO6F.js";
|
|
8
|
+
import {
|
|
9
|
+
announcements,
|
|
10
|
+
getDb
|
|
11
|
+
} from "./chunk-7FAA3YNB.js";
|
|
12
|
+
|
|
13
|
+
// src/lib/handlers/process-changelog.ts
|
|
14
|
+
import * as fs from "node:fs/promises";
|
|
15
|
+
import * as path from "node:path";
|
|
16
|
+
import { eq } from "drizzle-orm";
|
|
17
|
+
async function findRepoRoot(start) {
|
|
18
|
+
let dir = start;
|
|
19
|
+
for (let i = 0; i < 50; i++) {
|
|
20
|
+
try {
|
|
21
|
+
await fs.stat(path.join(dir, "pnpm-workspace.yaml"));
|
|
22
|
+
return dir;
|
|
23
|
+
} catch {
|
|
24
|
+
}
|
|
25
|
+
const parent = path.dirname(dir);
|
|
26
|
+
if (parent === dir) return null;
|
|
27
|
+
dir = parent;
|
|
28
|
+
}
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
async function readChangelog(explicitPath) {
|
|
32
|
+
if (explicitPath) {
|
|
33
|
+
try {
|
|
34
|
+
return await fs.readFile(explicitPath, "utf-8");
|
|
35
|
+
} catch {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const root = await findRepoRoot(process.cwd()) ?? process.cwd();
|
|
40
|
+
const p = path.join(root, "CHANGELOG.md");
|
|
41
|
+
try {
|
|
42
|
+
return await fs.readFile(p, "utf-8");
|
|
43
|
+
} catch {
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
var PRODUCT_URL = "https://rulemetric.com";
|
|
48
|
+
function renderRow(entry) {
|
|
49
|
+
const date = entry.date ?? (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
|
|
50
|
+
const rendered = renderChangelogAnnouncement({
|
|
51
|
+
version: entry.version,
|
|
52
|
+
date,
|
|
53
|
+
sections: entry.sections,
|
|
54
|
+
unsubscribeUrl: "{{unsubscribe_url}}",
|
|
55
|
+
productUrl: PRODUCT_URL
|
|
56
|
+
});
|
|
57
|
+
return {
|
|
58
|
+
version: entry.version,
|
|
59
|
+
releaseDate: date,
|
|
60
|
+
subject: rendered.subject,
|
|
61
|
+
htmlBody: rendered.html,
|
|
62
|
+
textBody: rendered.text,
|
|
63
|
+
sections: entry.sections
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
async function processChangelog(deps = {}) {
|
|
67
|
+
const db = deps.db ?? getDb();
|
|
68
|
+
const logger = deps.logger ?? {
|
|
69
|
+
info: (m) => console.log(m),
|
|
70
|
+
warn: (m) => console.warn(m)
|
|
71
|
+
};
|
|
72
|
+
const md = await readChangelog(deps.changelogPath);
|
|
73
|
+
if (md === null) {
|
|
74
|
+
logger.info("[cron_check_changelog] CHANGELOG.md not found; nothing to do");
|
|
75
|
+
return { createdCount: 0, skippedCount: 0 };
|
|
76
|
+
}
|
|
77
|
+
const parsed = parseChangelog(md);
|
|
78
|
+
const entries = announceableEntries(parsed);
|
|
79
|
+
if (entries.length === 0) {
|
|
80
|
+
logger.info("[cron_check_changelog] No announceable entries; nothing to do");
|
|
81
|
+
return { createdCount: 0, skippedCount: 0 };
|
|
82
|
+
}
|
|
83
|
+
let createdCount = 0;
|
|
84
|
+
let skippedCount = 0;
|
|
85
|
+
for (const entry of entries) {
|
|
86
|
+
const existing = await db.select({ id: announcements.id }).from(announcements).where(eq(announcements.version, entry.version)).limit(1);
|
|
87
|
+
if (existing.length > 0) {
|
|
88
|
+
skippedCount++;
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
const row = renderRow(entry);
|
|
92
|
+
try {
|
|
93
|
+
await db.insert(announcements).values({
|
|
94
|
+
version: row.version,
|
|
95
|
+
releaseDate: row.releaseDate,
|
|
96
|
+
subject: row.subject,
|
|
97
|
+
htmlBody: row.htmlBody,
|
|
98
|
+
textBody: row.textBody,
|
|
99
|
+
sections: row.sections,
|
|
100
|
+
status: "draft"
|
|
101
|
+
});
|
|
102
|
+
createdCount++;
|
|
103
|
+
logger.info(`[cron_check_changelog] Created draft announcement for ${row.version}`);
|
|
104
|
+
} catch (err) {
|
|
105
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
106
|
+
if (/duplicate key|unique/i.test(msg)) {
|
|
107
|
+
skippedCount++;
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
throw err;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
logger.info(
|
|
114
|
+
`[cron_check_changelog] Done: created ${createdCount}, skipped ${skippedCount}`
|
|
115
|
+
);
|
|
116
|
+
return { createdCount, skippedCount };
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export {
|
|
120
|
+
processChangelog
|
|
121
|
+
};
|
|
122
|
+
//# sourceMappingURL=chunk-R5MFHGHR.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/lib/handlers/process-changelog.ts"],
|
|
4
|
+
"sourcesContent": ["// Manual handler for `cron_check_changelog`. Reads CHANGELOG.md from the\n// repo root, parses it, and INSERTs one draft `announcements` row per new\n// release version. Idempotent \u2014 running twice in a row creates no\n// duplicates because we check existing rows by `version` (which is also\n// uniquely indexed in the DB).\n//\n// The handler does NOT email anyone and is not scheduled automatically.\n// It only creates `status='draft'` rows. The actual send is a separate\n// manual admin action that enqueues `process_announcement` jobs from the\n// admin UI.\n//\n// Why pure({db, logger}) instead of a worker Task signature: keeps the\n// unit tests trivial (no Graphile helpers to mock) and matches the\n// \"pure handler\" pattern called out in the design brief. The Task\n// adapter in cron-registry.ts wraps this with `wrapCronWithEnvelope`.\n\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { eq } from 'drizzle-orm';\nimport { announcements, getDb } from '@rulemetric/db';\nimport {\n parseChangelog,\n announceableEntries,\n type ChangelogEntry,\n} from '@rulemetric/core';\nimport { renderChangelogAnnouncement } from '@rulemetric/email';\n\nexport interface ProcessChangelogDeps {\n db?: any;\n logger?: { info: (msg: string) => void; warn: (msg: string) => void };\n /** Override the resolved CHANGELOG path for tests. */\n changelogPath?: string;\n}\n\nexport interface ProcessChangelogResult {\n createdCount: number;\n skippedCount: number;\n}\n\n/**\n * Walk up from `start` looking for a directory that contains\n * `pnpm-workspace.yaml`. Returns null if nothing matches before hitting\n * the filesystem root.\n */\nasync function findRepoRoot(start: string): Promise<string | null> {\n let dir = start;\n // Bound the walk to avoid infinite loops on broken cwds.\n for (let i = 0; i < 50; i++) {\n try {\n await fs.stat(path.join(dir, 'pnpm-workspace.yaml'));\n return dir;\n } catch {\n // not here, keep walking\n }\n const parent = path.dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n return null;\n}\n\n/**\n * Read CHANGELOG.md. Returns null when the file doesn't exist \u2014 the cron\n * must be a no-op on a fresh checkout (or in test environments where the\n * file may live outside cwd).\n */\nasync function readChangelog(explicitPath: string | undefined): Promise<string | null> {\n if (explicitPath) {\n try {\n return await fs.readFile(explicitPath, 'utf-8');\n } catch {\n return null;\n }\n }\n const root = (await findRepoRoot(process.cwd())) ?? process.cwd();\n const p = path.join(root, 'CHANGELOG.md');\n try {\n return await fs.readFile(p, 'utf-8');\n } catch {\n return null;\n }\n}\n\nconst PRODUCT_URL = 'https://rulemetric.com';\n\n/**\n * Render a draft announcement row from a parsed entry. The\n * `unsubscribeUrl` is left as a literal `{{unsubscribe_url}}` placeholder\n * \u2014 the per-recipient send handler (`process_announcement`) does the\n * actual substitution, so every recipient gets a unique tokenised URL.\n * Same idea for `recipientName`, which is undefined here.\n */\nfunction renderRow(entry: ChangelogEntry): {\n version: string;\n releaseDate: string;\n subject: string;\n htmlBody: string;\n textBody: string;\n sections: ChangelogEntry['sections'];\n} {\n // Entries returned by `announceableEntries` are guaranteed non-Unreleased\n // and have at least one non-empty section, but `date` may still be null\n // when the CHANGELOG heading omitted ` - YYYY-MM-DD`. Fall back to today\n // so we can still insert a draft (admin can correct before sending).\n const date = entry.date ?? new Date().toISOString().slice(0, 10);\n const rendered = renderChangelogAnnouncement({\n version: entry.version,\n date,\n sections: entry.sections,\n unsubscribeUrl: '{{unsubscribe_url}}',\n productUrl: PRODUCT_URL,\n });\n return {\n version: entry.version,\n releaseDate: date,\n subject: rendered.subject,\n htmlBody: rendered.html,\n textBody: rendered.text,\n sections: entry.sections,\n };\n}\n\n/**\n * The cron's actual work. Pure-ish: all side effects routed through the\n * injected `db` and `logger`, both of which default to real\n * implementations so a worker/manual-task wrapper can call this with no\n * arguments.\n */\nexport async function processChangelog(\n deps: ProcessChangelogDeps = {},\n): Promise<ProcessChangelogResult> {\n const db = deps.db ?? getDb();\n const logger = deps.logger ?? {\n info: (m: string) => console.log(m),\n warn: (m: string) => console.warn(m),\n };\n\n const md = await readChangelog(deps.changelogPath);\n if (md === null) {\n logger.info('[cron_check_changelog] CHANGELOG.md not found; nothing to do');\n return { createdCount: 0, skippedCount: 0 };\n }\n\n const parsed = parseChangelog(md);\n const entries = announceableEntries(parsed);\n if (entries.length === 0) {\n logger.info('[cron_check_changelog] No announceable entries; nothing to do');\n return { createdCount: 0, skippedCount: 0 };\n }\n\n let createdCount = 0;\n let skippedCount = 0;\n\n for (const entry of entries) {\n // Dedup by version. The DB also has a UNIQUE constraint on `version`\n // (see announcements schema), so even if two workers raced here the\n // second INSERT would fail loudly \u2014 but we'd rather skip silently.\n const existing = await db\n .select({ id: announcements.id })\n .from(announcements)\n .where(eq(announcements.version, entry.version))\n .limit(1);\n\n if (existing.length > 0) {\n skippedCount++;\n continue;\n }\n\n const row = renderRow(entry);\n try {\n await db.insert(announcements).values({\n version: row.version,\n releaseDate: row.releaseDate,\n subject: row.subject,\n htmlBody: row.htmlBody,\n textBody: row.textBody,\n sections: row.sections,\n status: 'draft',\n });\n createdCount++;\n logger.info(`[cron_check_changelog] Created draft announcement for ${row.version}`);\n } catch (err) {\n // Defensive: a UNIQUE-constraint race still counts as a skip, not a\n // failure. Anything else is unexpected \u2014 re-throw so the worker\n // retries.\n const msg = err instanceof Error ? err.message : String(err);\n if (/duplicate key|unique/i.test(msg)) {\n skippedCount++;\n continue;\n }\n throw err;\n }\n }\n\n logger.info(\n `[cron_check_changelog] Done: created ${createdCount}, skipped ${skippedCount}`,\n );\n return { createdCount, skippedCount };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// src/dashboard/launcher/tool-labels.ts
|
|
2
|
+
var TOOL_LABELS = {
|
|
3
|
+
claude_code: "Claude Code",
|
|
4
|
+
codex: "Codex",
|
|
5
|
+
aider: "Aider",
|
|
6
|
+
generic: "Generic"
|
|
7
|
+
};
|
|
8
|
+
function toolLabel(tool) {
|
|
9
|
+
return TOOL_LABELS[tool] ?? tool;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export {
|
|
13
|
+
TOOL_LABELS,
|
|
14
|
+
toolLabel
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=chunk-RH7NHVSK.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/dashboard/launcher/tool-labels.ts"],
|
|
4
|
+
"sourcesContent": ["export const TOOL_LABELS: Record<string, string> = {\n claude_code: 'Claude Code',\n codex: 'Codex',\n aider: 'Aider',\n generic: 'Generic',\n};\n\nexport function toolLabel(tool: string): string {\n return TOOL_LABELS[tool] ?? tool;\n}\n"],
|
|
5
|
+
"mappings": ";AAAO,IAAM,cAAsC;AAAA,EACjD,aAAa;AAAA,EACb,OAAO;AAAA,EACP,OAAO;AAAA,EACP,SAAS;AACX;AAEO,SAAS,UAAU,MAAsB;AAC9C,SAAO,YAAY,IAAI,KAAK;AAC9B;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|