@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
|
@@ -1,153 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it, vi } from 'vitest';
|
|
2
|
-
import { watchdogVerdict, watchdogStatus, parsePoolerSockets, reclaimStaleLocks, } from './graphile-worker-runner.js';
|
|
3
|
-
const baseState = () => ({
|
|
4
|
-
consecutiveHeartbeatFailures: 0,
|
|
5
|
-
lastListenSuccessAt: null,
|
|
6
|
-
lastListenErrorAt: null,
|
|
7
|
-
});
|
|
8
|
-
describe('watchdogVerdict', () => {
|
|
9
|
-
// The verdict function never returns a reason. Both signals it used to
|
|
10
|
-
// exit on (heartbeat failures, pg LISTEN dead) fire reliably during
|
|
11
|
-
// Supavisor pool pressure even when the worker itself is healthy.
|
|
12
|
-
// Exiting turned transient outages into launchd respawn loops that
|
|
13
|
-
// stacked sockets onto an already-saturated pooler — the EMAXCONN
|
|
14
|
-
// cascade reproduced in scripts/repro-pool-cascade.sh injections C and D.
|
|
15
|
-
// Visibility now goes through watchdogStatus() → heartbeat lastError.
|
|
16
|
-
it('returns null on a healthy boot (no errors yet)', () => {
|
|
17
|
-
expect(watchdogVerdict(baseState(), 1_000_000)).toBeNull();
|
|
18
|
-
});
|
|
19
|
-
it('does NOT fire on heartbeat failures alone — API outage must not kill the worker', () => {
|
|
20
|
-
expect(watchdogVerdict({ ...baseState(), consecutiveHeartbeatFailures: 99 }, 0)).toBeNull();
|
|
21
|
-
});
|
|
22
|
-
it('does NOT fire on prolonged LISTEN-dead — pool pressure must not kill the worker', () => {
|
|
23
|
-
const state = {
|
|
24
|
-
consecutiveHeartbeatFailures: 0,
|
|
25
|
-
lastListenErrorAt: 1_000_000,
|
|
26
|
-
lastListenSuccessAt: null,
|
|
27
|
-
};
|
|
28
|
-
// 10 minutes past last LISTEN error with no recovery — old code exited here.
|
|
29
|
-
expect(watchdogVerdict(state, 1_000_000 + 600_000)).toBeNull();
|
|
30
|
-
});
|
|
31
|
-
});
|
|
32
|
-
describe('watchdogStatus', () => {
|
|
33
|
-
// Replacement for the exit paths: surface the same signals via a string
|
|
34
|
-
// the heartbeat merges into `lastError` so the dashboard can flag wedged
|
|
35
|
-
// workers without launchd respawning them.
|
|
36
|
-
it('returns null when everything is healthy', () => {
|
|
37
|
-
expect(watchdogStatus(baseState(), 1_000_000)).toBeNull();
|
|
38
|
-
});
|
|
39
|
-
it('returns null when recent failures are below the heartbeat limit', () => {
|
|
40
|
-
expect(watchdogStatus({ ...baseState(), consecutiveHeartbeatFailures: 4 }, 0)).toBeNull();
|
|
41
|
-
});
|
|
42
|
-
it('reports persistent heartbeat failures', () => {
|
|
43
|
-
const status = watchdogStatus({ ...baseState(), consecutiveHeartbeatFailures: 5 }, 0);
|
|
44
|
-
expect(status).toMatch(/heartbeat has failed 5/);
|
|
45
|
-
});
|
|
46
|
-
it('reports a stuck LISTEN past the threshold', () => {
|
|
47
|
-
const state = {
|
|
48
|
-
consecutiveHeartbeatFailures: 0,
|
|
49
|
-
lastListenErrorAt: 1_000_000,
|
|
50
|
-
lastListenSuccessAt: null,
|
|
51
|
-
};
|
|
52
|
-
expect(watchdogStatus(state, 1_000_000 + 180_001)).toMatch(/pg listen has been failing/);
|
|
53
|
-
});
|
|
54
|
-
it('does not report LISTEN failures that recovered', () => {
|
|
55
|
-
const state = {
|
|
56
|
-
consecutiveHeartbeatFailures: 0,
|
|
57
|
-
lastListenErrorAt: 1_000_000,
|
|
58
|
-
lastListenSuccessAt: 1_005_000,
|
|
59
|
-
};
|
|
60
|
-
expect(watchdogStatus(state, 1_999_999)).toBeNull();
|
|
61
|
-
});
|
|
62
|
-
it('does not report a fresh LISTEN error below the threshold', () => {
|
|
63
|
-
const state = {
|
|
64
|
-
consecutiveHeartbeatFailures: 0,
|
|
65
|
-
lastListenErrorAt: 1_000_000,
|
|
66
|
-
lastListenSuccessAt: null,
|
|
67
|
-
};
|
|
68
|
-
expect(watchdogStatus(state, 1_000_000 + 60_000)).toBeNull();
|
|
69
|
-
});
|
|
70
|
-
});
|
|
71
|
-
describe('parsePoolerSockets', () => {
|
|
72
|
-
// The worker connects via the SESSION pooler (:5432, see deriveSessionPoolerUrl
|
|
73
|
-
// in commands/evals/listen.ts); the API uses the TRANSACTION pooler (:6543).
|
|
74
|
-
// A counter that matched only :6543 reported 0 sockets for every worker —
|
|
75
|
-
// a monitoring blind spot. parsePoolerSockets must count both pooler ports.
|
|
76
|
-
it('counts session-pooler sockets (:5432), grouped by remote host', () => {
|
|
77
|
-
const lsof = [
|
|
78
|
-
'COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME',
|
|
79
|
-
'node 99860 nick 25u IPv4 0xaa 0t0 TCP 192.168.1.5:51000->18.214.78.123:5432 (ESTABLISHED)',
|
|
80
|
-
'node 99860 nick 26u IPv4 0xab 0t0 TCP 192.168.1.5:51001->3.227.209.82:5432 (ESTABLISHED)',
|
|
81
|
-
'node 99860 nick 27u IPv4 0xac 0t0 TCP 192.168.1.5:51002->18.214.78.123:5432 (ESTABLISHED)',
|
|
82
|
-
].join('\n');
|
|
83
|
-
expect(parsePoolerSockets(lsof)).toEqual({
|
|
84
|
-
total: 3,
|
|
85
|
-
byNode: { '18.214.78.123': 2, '3.227.209.82': 1 },
|
|
86
|
-
});
|
|
87
|
-
});
|
|
88
|
-
it('counts transaction-pooler sockets (:6543) too', () => {
|
|
89
|
-
const lsof = 'node 1 u 1u IPv4 0x 0t0 TCP 10.0.0.1:5000->5.6.7.8:6543 (ESTABLISHED)';
|
|
90
|
-
expect(parsePoolerSockets(lsof)).toEqual({ total: 1, byNode: { '5.6.7.8': 1 } });
|
|
91
|
-
});
|
|
92
|
-
it('matches the REMOTE port only — a local :5432 source port is not counted', () => {
|
|
93
|
-
// Local side is :5432; the remote port is :443. The `->` anchor must
|
|
94
|
-
// prevent this from being counted as a pooler socket.
|
|
95
|
-
const lsof = 'node 1 u 1u IPv4 0x 0t0 TCP 127.0.0.1:5432->1.2.3.4:443 (ESTABLISHED)';
|
|
96
|
-
expect(parsePoolerSockets(lsof)).toEqual({ total: 0, byNode: {} });
|
|
97
|
-
});
|
|
98
|
-
it('returns zero for output with no pooler sockets', () => {
|
|
99
|
-
expect(parsePoolerSockets('')).toEqual({ total: 0, byNode: {} });
|
|
100
|
-
});
|
|
101
|
-
});
|
|
102
|
-
describe('reclaimStaleLocks', () => {
|
|
103
|
-
// Workers crash mid-job (SIGKILL, OOM, force-shutdown). Their graphile job
|
|
104
|
-
// rows stay with locked_at IS NOT NULL — graphile-worker's "lock timeout"
|
|
105
|
-
// detector only kicks in after a 4-hour TTL by default. Until then the
|
|
106
|
-
// (now-dead) lock blocks claiming the job. At worker boot, no jobs of OUR
|
|
107
|
-
// user are legitimately in flight, so any lock currently held against
|
|
108
|
-
// task identifiers ending `__<our userId>` is by definition stale and
|
|
109
|
-
// safe to release.
|
|
110
|
-
it('runs an UPDATE filtered by the per-user task suffix', async () => {
|
|
111
|
-
const exec = vi.fn().mockResolvedValue([]);
|
|
112
|
-
await reclaimStaleLocks(exec, 'user-abc', () => { });
|
|
113
|
-
expect(exec).toHaveBeenCalledOnce();
|
|
114
|
-
const [sql, params] = exec.mock.calls[0];
|
|
115
|
-
expect(sql).toContain('graphile_worker._private_jobs');
|
|
116
|
-
expect(sql).toMatch(/locked_at\s*=\s*NULL/i);
|
|
117
|
-
expect(sql).toContain('graphile_worker._private_tasks');
|
|
118
|
-
expect(params).toEqual(['%__user-abc']);
|
|
119
|
-
});
|
|
120
|
-
it('logs the reclaim count and identifiers when locks are released', async () => {
|
|
121
|
-
const exec = vi.fn().mockResolvedValue([
|
|
122
|
-
{ id: 100, identifier: 'process_eval__user-abc' },
|
|
123
|
-
{ id: 101, identifier: 'cron_refresh_skills__user-abc' },
|
|
124
|
-
]);
|
|
125
|
-
const log = vi.fn();
|
|
126
|
-
const released = await reclaimStaleLocks(exec, 'user-abc', log);
|
|
127
|
-
expect(released).toBe(2);
|
|
128
|
-
expect(log).toHaveBeenCalledOnce();
|
|
129
|
-
const msg = log.mock.calls[0][0];
|
|
130
|
-
expect(msg).toMatch(/reclaimed 2 stale lock/i);
|
|
131
|
-
expect(msg).toContain('process_eval__user-abc');
|
|
132
|
-
expect(msg).toContain('cron_refresh_skills__user-abc');
|
|
133
|
-
});
|
|
134
|
-
it('stays silent when nothing was stale', async () => {
|
|
135
|
-
const exec = vi.fn().mockResolvedValue([]);
|
|
136
|
-
const log = vi.fn();
|
|
137
|
-
const released = await reclaimStaleLocks(exec, 'user-abc', log);
|
|
138
|
-
expect(released).toBe(0);
|
|
139
|
-
expect(log).not.toHaveBeenCalled();
|
|
140
|
-
});
|
|
141
|
-
it('swallows executor errors so a boot-time DB hiccup never blocks the worker', async () => {
|
|
142
|
-
// Reclaim is best-effort. A failing reclaim must not abort startWorker —
|
|
143
|
-
// graphile-worker's own background lock-timeout will eventually free
|
|
144
|
-
// these jobs (~4h), and the worker is more useful alive than dead.
|
|
145
|
-
const exec = vi.fn().mockRejectedValue(new Error('connection refused'));
|
|
146
|
-
const log = vi.fn();
|
|
147
|
-
await expect(reclaimStaleLocks(exec, 'user-abc', log)).resolves.toBe(0);
|
|
148
|
-
// Should log the error so it's visible in the worker log.
|
|
149
|
-
expect(log).toHaveBeenCalled();
|
|
150
|
-
expect(log.mock.calls[0][0]).toMatch(/reclaim.*failed/i);
|
|
151
|
-
});
|
|
152
|
-
});
|
|
153
|
-
//# sourceMappingURL=graphile-worker-runner.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"graphile-worker-runner.test.js","sourceRoot":"","sources":["../../src/lib/graphile-worker-runner.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cron-close-stale-sessions.d.ts","sourceRoot":"","sources":["../../../src/lib/handlers/cron-close-stale-sessions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAQ5C,eAAO,MAAM,sBAAsB,EAAE,IAOpC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cron-data-integrity-audit.d.ts","sourceRoot":"","sources":["../../../src/lib/handlers/cron-data-integrity-audit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AA0B5C,eAAO,MAAM,sBAAsB,EAAE,IAapC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cron-refresh-skills.d.ts","sourceRoot":"","sources":["../../../src/lib/handlers/cron-refresh-skills.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAa5C,eAAO,MAAM,iBAAiB,EAAE,IAsG/B,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cron-refresh-skills.test.d.ts","sourceRoot":"","sources":["../../../src/lib/handlers/cron-refresh-skills.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
// Tests for the cron_refresh_skills hang fix.
|
|
2
|
-
//
|
|
3
|
-
// Bug history (2026-05-21 debugging session, follow-up to
|
|
4
|
-
// docs/incidents/2026-05-20-launches-stuck-and-worker-wedge.md task #26):
|
|
5
|
-
//
|
|
6
|
-
// Without a GITHUB_TOKEN the unauthenticated GitHub API caps at 60 req/hr.
|
|
7
|
-
// Pre-fix, `cron_refresh_skills` walked ~351 sources with two API calls each
|
|
8
|
-
// (`repos.get` + `repos.getBranch`) and let Octokit's `throttling` plugin
|
|
9
|
-
// schedule retries via `setTimeout(retryAfter * 1000)`. Observed `retryAfter`
|
|
10
|
-
// values: 1129s → 3450s (~19 → ~57 minutes). The handler slept inside that
|
|
11
|
-
// timer, holding a graphile-worker concurrency slot for up to ~3 hours per
|
|
12
|
-
// run while emitting zero progress logs.
|
|
13
|
-
//
|
|
14
|
-
// Fix has two parts, both tested here:
|
|
15
|
-
//
|
|
16
|
-
// 1. Bounded retry — the throttle callbacks now refuse to retry when
|
|
17
|
-
// `retryAfter` exceeds the budget (5 minutes). The exhausted request
|
|
18
|
-
// throws back into fetchSource's catch, which logs and treats the
|
|
19
|
-
// source as skipped instead of hanging.
|
|
20
|
-
//
|
|
21
|
-
// 2. Fail-fast on missing token — the handler refuses to even attempt the
|
|
22
|
-
// crawl without a `GITHUB_TOKEN`. The 60-req/hr unauthenticated cap is
|
|
23
|
-
// not enough for 351 sources × 2 calls, so attempting is worse than
|
|
24
|
-
// giving up cleanly.
|
|
25
|
-
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
26
|
-
import { shouldRetryRateLimit, shouldRetrySecondaryRateLimit, } from '@rulemetric/skills-registry';
|
|
27
|
-
import { cronRefreshSkills } from './cron-refresh-skills.js';
|
|
28
|
-
describe('shouldRetryRateLimit', () => {
|
|
29
|
-
it('returns false when GitHub reports a reset >5 min away', () => {
|
|
30
|
-
// The original symptom: retryAfter=1129 (19 min). Octokit waits the full
|
|
31
|
-
// window before invoking the retry, so returning true here means a worker
|
|
32
|
-
// sleeps ~19 min holding a concurrency slot. Refuse.
|
|
33
|
-
expect(shouldRetryRateLimit(1129, 0)).toBe(false);
|
|
34
|
-
expect(shouldRetryRateLimit(3450, 0)).toBe(false);
|
|
35
|
-
});
|
|
36
|
-
it('returns true within budget when reset is <5 min and retries left', () => {
|
|
37
|
-
// Short waits (~minutes) are still legitimate — e.g. transient secondary
|
|
38
|
-
// rate. Honour them up to retry budget.
|
|
39
|
-
expect(shouldRetryRateLimit(60, 0)).toBe(true);
|
|
40
|
-
expect(shouldRetryRateLimit(60, 1)).toBe(true);
|
|
41
|
-
});
|
|
42
|
-
it('returns false once the retry budget is exhausted', () => {
|
|
43
|
-
// Default Octokit retryCount semantics: 0 = first retry attempt.
|
|
44
|
-
// We allow up to 2 retries; a 3rd call (retryCount=2) gives up.
|
|
45
|
-
expect(shouldRetryRateLimit(60, 2)).toBe(false);
|
|
46
|
-
});
|
|
47
|
-
it('treats the 5-minute boundary inclusively (300s is OK, 301s is not)', () => {
|
|
48
|
-
expect(shouldRetryRateLimit(300, 0)).toBe(true);
|
|
49
|
-
expect(shouldRetryRateLimit(301, 0)).toBe(false);
|
|
50
|
-
});
|
|
51
|
-
});
|
|
52
|
-
describe('shouldRetrySecondaryRateLimit', () => {
|
|
53
|
-
// Secondary rate limits = GitHub abuse detection (concurrent same-IP
|
|
54
|
-
// hammering). Pre-fix this always returned true → retry forever, which
|
|
55
|
-
// amplified the primary-limit hang. Same 5-min cap.
|
|
56
|
-
it('returns false when reset is >5 min away', () => {
|
|
57
|
-
expect(shouldRetrySecondaryRateLimit(600)).toBe(false);
|
|
58
|
-
});
|
|
59
|
-
it('returns true for short waits', () => {
|
|
60
|
-
expect(shouldRetrySecondaryRateLimit(30)).toBe(true);
|
|
61
|
-
});
|
|
62
|
-
});
|
|
63
|
-
describe('cronRefreshSkills (GITHUB_TOKEN fail-fast)', () => {
|
|
64
|
-
const origToken = process.env.GITHUB_TOKEN;
|
|
65
|
-
beforeEach(() => {
|
|
66
|
-
delete process.env.GITHUB_TOKEN;
|
|
67
|
-
});
|
|
68
|
-
afterEach(() => {
|
|
69
|
-
if (origToken !== undefined) {
|
|
70
|
-
process.env.GITHUB_TOKEN = origToken;
|
|
71
|
-
}
|
|
72
|
-
else {
|
|
73
|
-
delete process.env.GITHUB_TOKEN;
|
|
74
|
-
}
|
|
75
|
-
});
|
|
76
|
-
it('skips the crawl when GITHUB_TOKEN is missing and emits an actionable warning', async () => {
|
|
77
|
-
const logs = [];
|
|
78
|
-
const log = (level) => (msg) => {
|
|
79
|
-
logs.push({ level, msg });
|
|
80
|
-
};
|
|
81
|
-
const helpers = {
|
|
82
|
-
job: { id: '1', attempts: 1, max_attempts: 25 },
|
|
83
|
-
logger: { info: log('info'), warn: log('warn'), error: log('error') },
|
|
84
|
-
addJob: vi.fn(),
|
|
85
|
-
};
|
|
86
|
-
const start = Date.now();
|
|
87
|
-
await cronRefreshSkills({}, helpers);
|
|
88
|
-
const duration = Date.now() - start;
|
|
89
|
-
// The skip path should be near-instantaneous (no network) — well under
|
|
90
|
-
// the 60s ish bound the pre-fix path would burn before hitting the cap.
|
|
91
|
-
expect(duration).toBeLessThan(2_000);
|
|
92
|
-
// Must mention GITHUB_TOKEN by name so the operator knows the fix.
|
|
93
|
-
const tokenWarning = logs.find((l) => /GITHUB_TOKEN/i.test(l.msg));
|
|
94
|
-
expect(tokenWarning).toBeDefined();
|
|
95
|
-
expect(tokenWarning.level).toBe('warn');
|
|
96
|
-
});
|
|
97
|
-
it('does not log "Fetching from N sources" when GITHUB_TOKEN is missing', async () => {
|
|
98
|
-
// Pre-fix the handler logged "Fetching from 351 sources" BEFORE realising
|
|
99
|
-
// the futility. The skip-fast path must short-circuit before that.
|
|
100
|
-
const logs = [];
|
|
101
|
-
const helpers = {
|
|
102
|
-
job: { id: '1', attempts: 1, max_attempts: 25 },
|
|
103
|
-
logger: {
|
|
104
|
-
info: (msg) => logs.push(msg),
|
|
105
|
-
warn: (msg) => logs.push(msg),
|
|
106
|
-
error: (msg) => logs.push(msg),
|
|
107
|
-
},
|
|
108
|
-
addJob: vi.fn(),
|
|
109
|
-
};
|
|
110
|
-
await cronRefreshSkills({}, helpers);
|
|
111
|
-
expect(logs.find((m) => /^Fetching from/.test(m))).toBeUndefined();
|
|
112
|
-
});
|
|
113
|
-
});
|
|
114
|
-
//# sourceMappingURL=cron-refresh-skills.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cron-refresh-skills.test.js","sourceRoot":"","sources":["../../../src/lib/handlers/cron-refresh-skills.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cron-regenerate-insights.d.ts","sourceRoot":"","sources":["../../../src/lib/handlers/cron-regenerate-insights.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAG5C,eAAO,MAAM,sBAAsB,EAAE,IAGpC,CAAC"}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import { apiPost } from '../api-client.js';
|
|
2
|
-
export const cronRegenerateInsights = async (_payload, helpers) => {
|
|
3
|
-
await apiPost('/api/insights-jobs/regenerate-all', {});
|
|
4
|
-
helpers.logger.info('Regenerate-stale-insights cron fired');
|
|
5
|
-
};
|
|
6
|
-
//# sourceMappingURL=cron-regenerate-insights.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cron-regenerate-insights.js","sourceRoot":"","sources":["../../../src/lib/handlers/cron-regenerate-insights.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAE3C,MAAM,CAAC,MAAM,sBAAsB,GAAS,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;IACtE,MAAM,OAAO,CAAC,mCAAmC,EAAE,EAAE,CAAC,CAAC;IACvD,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;AAC9D,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cron-suggest-instructions.d.ts","sourceRoot":"","sources":["../../../src/lib/handlers/cron-suggest-instructions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAmD5C,eAAO,MAAM,uBAAuB,EAAE,IA2IrC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cron-suggest-instructions.test.d.ts","sourceRoot":"","sources":["../../../src/lib/handlers/cron-suggest-instructions.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, beforeAll, afterAll } from 'vitest';
|
|
2
|
-
import { mkdtempSync, mkdirSync, writeFileSync, rmSync } from 'node:fs';
|
|
3
|
-
import { tmpdir } from 'node:os';
|
|
4
|
-
import path from 'node:path';
|
|
5
|
-
import { detectLanguages } from '../detect-languages.js';
|
|
6
|
-
describe('detectLanguages', () => {
|
|
7
|
-
let root;
|
|
8
|
-
beforeAll(() => {
|
|
9
|
-
root = mkdtempSync(path.join(tmpdir(), 'rulemetric-detect-'));
|
|
10
|
-
});
|
|
11
|
-
afterAll(() => {
|
|
12
|
-
rmSync(root, { recursive: true, force: true });
|
|
13
|
-
});
|
|
14
|
-
function fresh(name) {
|
|
15
|
-
const dir = path.join(root, name);
|
|
16
|
-
mkdirSync(dir, { recursive: true });
|
|
17
|
-
return dir;
|
|
18
|
-
}
|
|
19
|
-
it('returns [] for an empty directory', () => {
|
|
20
|
-
const dir = fresh('empty');
|
|
21
|
-
expect(detectLanguages(dir)).toEqual([]);
|
|
22
|
-
});
|
|
23
|
-
it('returns [] for a single signal (insufficient evidence)', () => {
|
|
24
|
-
const dir = fresh('one-signal');
|
|
25
|
-
writeFileSync(path.join(dir, 'package.json'), '{}');
|
|
26
|
-
// Just package.json with no .ts/.js source = 1 signal
|
|
27
|
-
expect(detectLanguages(dir)).toEqual([]);
|
|
28
|
-
});
|
|
29
|
-
it('detects TypeScript from package.json + tsconfig.json', () => {
|
|
30
|
-
const dir = fresh('ts-config');
|
|
31
|
-
writeFileSync(path.join(dir, 'package.json'), '{}');
|
|
32
|
-
writeFileSync(path.join(dir, 'tsconfig.json'), '{}');
|
|
33
|
-
expect(detectLanguages(dir)).toContain('TypeScript');
|
|
34
|
-
});
|
|
35
|
-
it('detects TypeScript from package.json + a .ts source file', () => {
|
|
36
|
-
const dir = fresh('ts-source');
|
|
37
|
-
writeFileSync(path.join(dir, 'package.json'), '{}');
|
|
38
|
-
const src = path.join(dir, 'src');
|
|
39
|
-
mkdirSync(src);
|
|
40
|
-
writeFileSync(path.join(src, 'index.ts'), 'export {};');
|
|
41
|
-
expect(detectLanguages(dir)).toContain('TypeScript');
|
|
42
|
-
});
|
|
43
|
-
it('detects Python from pyproject.toml + requirements.txt', () => {
|
|
44
|
-
const dir = fresh('py');
|
|
45
|
-
writeFileSync(path.join(dir, 'pyproject.toml'), '');
|
|
46
|
-
writeFileSync(path.join(dir, 'requirements.txt'), '');
|
|
47
|
-
expect(detectLanguages(dir)).toContain('Python');
|
|
48
|
-
});
|
|
49
|
-
it('detects multiple languages in a polyglot project', () => {
|
|
50
|
-
const dir = fresh('polyglot');
|
|
51
|
-
writeFileSync(path.join(dir, 'package.json'), '{}');
|
|
52
|
-
writeFileSync(path.join(dir, 'pyproject.toml'), '');
|
|
53
|
-
const langs = detectLanguages(dir);
|
|
54
|
-
expect(langs).toContain('JavaScript');
|
|
55
|
-
expect(langs).toContain('Python');
|
|
56
|
-
});
|
|
57
|
-
it('walks 3 levels deep (monorepo case)', () => {
|
|
58
|
-
const dir = fresh('mono');
|
|
59
|
-
// packages/foo/src/index.ts is 3 levels deep
|
|
60
|
-
const deep = path.join(dir, 'packages', 'foo', 'src');
|
|
61
|
-
mkdirSync(deep, { recursive: true });
|
|
62
|
-
writeFileSync(path.join(dir, 'package.json'), '{}');
|
|
63
|
-
writeFileSync(path.join(deep, 'index.ts'), 'export {};');
|
|
64
|
-
expect(detectLanguages(dir)).toContain('TypeScript');
|
|
65
|
-
});
|
|
66
|
-
it('skips excluded directories like node_modules', () => {
|
|
67
|
-
const dir = fresh('exclude');
|
|
68
|
-
// ONLY signals are inside node_modules — should not count
|
|
69
|
-
const nm = path.join(dir, 'node_modules', 'foo');
|
|
70
|
-
mkdirSync(nm, { recursive: true });
|
|
71
|
-
writeFileSync(path.join(nm, 'package.json'), '{}');
|
|
72
|
-
writeFileSync(path.join(nm, 'index.ts'), 'export {};');
|
|
73
|
-
// Root itself has nothing → 0 signals → []
|
|
74
|
-
expect(detectLanguages(dir)).toEqual([]);
|
|
75
|
-
});
|
|
76
|
-
it('returns [] for a non-existent path without throwing', () => {
|
|
77
|
-
expect(detectLanguages(path.join(root, 'nonexistent'))).toEqual([]);
|
|
78
|
-
});
|
|
79
|
-
});
|
|
80
|
-
//# sourceMappingURL=cron-suggest-instructions.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cron-suggest-instructions.test.js","sourceRoot":"","sources":["../../../src/lib/handlers/cron-suggest-instructions.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import type { JobHelpers } from 'graphile-worker';
|
|
2
|
-
interface ConversationJobConfig {
|
|
3
|
-
type: 'conversation';
|
|
4
|
-
conversationId: string;
|
|
5
|
-
messageId: string;
|
|
6
|
-
messageContent: string;
|
|
7
|
-
}
|
|
8
|
-
interface ConversationPayload {
|
|
9
|
-
mirrorId: string;
|
|
10
|
-
evalTargetId: string;
|
|
11
|
-
config: ConversationJobConfig;
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* Graphile-shaped handler for the `process_conversation` task.
|
|
15
|
-
*
|
|
16
|
-
* Thin wrapper around `eval-conversation-handler.processConversationJob` —
|
|
17
|
-
* the existing function already does all the work (action decision,
|
|
18
|
-
* run_evals/generate_cases/analyze branches, idempotency guard via
|
|
19
|
-
* already-posted assistant messages). The handler just unpacks the payload
|
|
20
|
-
* and threads the helpers' logger through.
|
|
21
|
-
*
|
|
22
|
-
* Mechanical contract vs. the legacy worker:
|
|
23
|
-
* - no claim — Graphile claimed the job before invoking us
|
|
24
|
-
* - no /complete POST — we return a small marker on success (matches the
|
|
25
|
-
* `{ type: 'conversation' }` blob the legacy code POSTed)
|
|
26
|
-
* - no surrounding try/catch — errors propagate to Graphile, which flips
|
|
27
|
-
* the mirror row to `failed` via the runner.events handler
|
|
28
|
-
*
|
|
29
|
-
* Conversation jobs run with `maxAttempts: 1` (set at enqueue time in
|
|
30
|
-
* `apps/api/src/lib/queue.ts`) — chat is interactive and silent retries
|
|
31
|
-
* would confuse users mid-flow.
|
|
32
|
-
*/
|
|
33
|
-
export declare function processConversation(payload: ConversationPayload, helpers: JobHelpers): Promise<Record<string, unknown>>;
|
|
34
|
-
export {};
|
|
35
|
-
//# sourceMappingURL=process-conversation.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"process-conversation.d.ts","sourceRoot":"","sources":["../../../src/lib/handlers/process-conversation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAIlD,UAAU,qBAAqB;IAC7B,IAAI,EAAE,cAAc,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,UAAU,mBAAmB;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,qBAAqB,CAAC;CAC/B;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,mBAAmB,EAC5B,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAclC"}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import type { JobHelpers } from 'graphile-worker';
|
|
2
|
-
interface EvalPayload {
|
|
3
|
-
mirrorId: string;
|
|
4
|
-
evalTargetId: string;
|
|
5
|
-
config: {
|
|
6
|
-
parallel?: number;
|
|
7
|
-
runsPerEval?: number;
|
|
8
|
-
iteration?: number;
|
|
9
|
-
skipBaseline?: boolean;
|
|
10
|
-
skipGrading?: boolean;
|
|
11
|
-
model?: string;
|
|
12
|
-
graderModel?: string;
|
|
13
|
-
timeout?: number;
|
|
14
|
-
};
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* Graphile-shaped handler for the `process_eval` task.
|
|
18
|
-
*
|
|
19
|
-
* Lifted verbatim from the legacy `eval-worker.ts:processJob` body, with the
|
|
20
|
-
* queue plumbing stripped out:
|
|
21
|
-
* - no claim — Graphile already claimed the job before invoking us
|
|
22
|
-
* - no /complete POST — we return the result object (or throw)
|
|
23
|
-
* - no `processing` flag — that lived in the polling loop's closure
|
|
24
|
-
* - no conversation branch — split into its own handler (Task 14)
|
|
25
|
-
*
|
|
26
|
-
* Mid-job progress patches still hit the existing
|
|
27
|
-
* `PATCH /api/eval-jobs/:id/progress` endpoint, just keyed by the mirror row's
|
|
28
|
-
* id instead of the legacy queue id.
|
|
29
|
-
*/
|
|
30
|
-
export declare function processEval(payload: EvalPayload, helpers: JobHelpers): Promise<Record<string, unknown>>;
|
|
31
|
-
export {};
|
|
32
|
-
//# sourceMappingURL=process-eval.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"process-eval.d.ts","sourceRoot":"","sources":["../../../src/lib/handlers/process-eval.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAwBlD,UAAU,WAAW;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE;QACN,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAiMlC"}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import type { JobHelpers } from 'graphile-worker';
|
|
2
|
-
interface InsightsPayload {
|
|
3
|
-
mirrorId: string;
|
|
4
|
-
projectPath: string | null;
|
|
5
|
-
config?: {
|
|
6
|
-
sessionId?: string;
|
|
7
|
-
[key: string]: unknown;
|
|
8
|
-
};
|
|
9
|
-
}
|
|
10
|
-
/**
|
|
11
|
-
* Graphile-shaped handler for the `process_insights` task.
|
|
12
|
-
*
|
|
13
|
-
* Lifted from the legacy `insights-worker.ts:processInsightsJob` and
|
|
14
|
-
* `processSessionAnalysisJob`, with the queue plumbing stripped out:
|
|
15
|
-
* - no claim — Graphile already claimed the job before invoking us
|
|
16
|
-
* - no /complete POST — we return the result object (or throw)
|
|
17
|
-
* - no "could not claim" early-return branches
|
|
18
|
-
*
|
|
19
|
-
* Mid-job progress patches still hit the existing
|
|
20
|
-
* `PATCH /api/insights-jobs/:id/progress` endpoint, just keyed by the
|
|
21
|
-
* mirror row's id.
|
|
22
|
-
*
|
|
23
|
-
* The session-analysis branch (selected when `payload.config.sessionId`
|
|
24
|
-
* is set) lives inline below — it's a different code path but cheap to
|
|
25
|
-
* keep co-located.
|
|
26
|
-
*
|
|
27
|
-
* The `buildDataSummary*` helpers are duplicated here as private locals;
|
|
28
|
-
* Task 21 will hoist them into a shared `insights-data.ts` once
|
|
29
|
-
* `insights-worker.ts` is deleted.
|
|
30
|
-
*
|
|
31
|
-
* User-facing notifications go through the API's `notifyUser()` path
|
|
32
|
-
* (insert into `notifications` → Supabase Realtime → service-worker
|
|
33
|
-
* `showNotification` with a deep-link). The worker no longer fires native
|
|
34
|
-
* `osascript` banners — those duplicated the browser path, weren't
|
|
35
|
-
* clickable to a URL, and stacked one-per-project on macOS.
|
|
36
|
-
*/
|
|
37
|
-
export declare function processInsights(payload: InsightsPayload, helpers: JobHelpers): Promise<Record<string, unknown>>;
|
|
38
|
-
export {};
|
|
39
|
-
//# sourceMappingURL=process-insights.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"process-insights.d.ts","sourceRoot":"","sources":["../../../src/lib/handlers/process-insights.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAMlD,UAAU,eAAe;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,CAAC,EAAE;QACP,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;CACH;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA4LlC"}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import type { JobHelpers } from 'graphile-worker';
|
|
2
|
-
interface LaunchPayload {
|
|
3
|
-
mirrorId: string;
|
|
4
|
-
tool: string;
|
|
5
|
-
config: {
|
|
6
|
-
projectPath: string;
|
|
7
|
-
prompt?: string;
|
|
8
|
-
systemPrompt?: string;
|
|
9
|
-
model?: string;
|
|
10
|
-
mode: 'headless' | 'interactive';
|
|
11
|
-
timeout?: number;
|
|
12
|
-
};
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Graphile-shaped handler for the `process_launch` task.
|
|
16
|
-
*
|
|
17
|
-
* Lifted from the legacy `eval-worker.ts:processLaunchJob`, with the queue
|
|
18
|
-
* plumbing stripped out:
|
|
19
|
-
* - no claim — Graphile already claimed the job before invoking us
|
|
20
|
-
* - no /complete POST — we return the launcher result (or throw)
|
|
21
|
-
* - no surrounding try/catch — errors propagate to Graphile's retry path
|
|
22
|
-
*
|
|
23
|
-
* The dynamic import of `@rulemetric/session` is intentional: it avoids
|
|
24
|
-
* loading the launcher (and its tool-specific subprocess wrappers) unless a
|
|
25
|
-
* launch job actually fires.
|
|
26
|
-
*/
|
|
27
|
-
export declare function processLaunch(payload: LaunchPayload, helpers: JobHelpers): Promise<Record<string, unknown>>;
|
|
28
|
-
export {};
|
|
29
|
-
//# sourceMappingURL=process-launch.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"process-launch.d.ts","sourceRoot":"","sources":["../../../src/lib/handlers/process-launch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAIlD,UAAU,aAAa;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE;QACN,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,UAAU,GAAG,aAAa,CAAC;QACjC,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA+BlC"}
|