@rulemetric/cli 0.2.0 → 0.2.2
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 -0
- package/dist/lib/handlers/process-session-goal.js.map +7 -0
- 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 +28 -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 -526
- 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/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,121 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ClaudeCodeAdapter,
|
|
3
|
+
discoverAllSessions
|
|
4
|
+
} from "./chunk-B5KNTGMJ.js";
|
|
5
|
+
|
|
6
|
+
// src/dashboard/data.ts
|
|
7
|
+
import * as fs from "node:fs";
|
|
8
|
+
import * as path from "node:path";
|
|
9
|
+
import * as os from "node:os";
|
|
10
|
+
function ensureEnv() {
|
|
11
|
+
if (process.env.RULEMETRIC_API_KEY || process.env.RULEMETRIC_ACCESS_TOKEN) return;
|
|
12
|
+
const globalEnv = path.join(os.homedir(), ".config", "rulemetric", "env");
|
|
13
|
+
if (loadEnvFile(globalEnv)) return;
|
|
14
|
+
loadEnvFile(path.join(process.cwd(), ".env.local"));
|
|
15
|
+
}
|
|
16
|
+
function loadEnvFile(filePath) {
|
|
17
|
+
try {
|
|
18
|
+
const content = fs.readFileSync(filePath, "utf-8");
|
|
19
|
+
for (const line of content.split("\n")) {
|
|
20
|
+
const trimmed = line.trim();
|
|
21
|
+
if (!trimmed || trimmed.startsWith("#")) continue;
|
|
22
|
+
const eqIdx = trimmed.indexOf("=");
|
|
23
|
+
if (eqIdx < 0) continue;
|
|
24
|
+
const key = trimmed.slice(0, eqIdx).trim();
|
|
25
|
+
const value = trimmed.slice(eqIdx + 1).trim();
|
|
26
|
+
if (!process.env[key]) {
|
|
27
|
+
process.env[key] = value;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return !!(process.env.RULEMETRIC_API_KEY || process.env.RULEMETRIC_ACCESS_TOKEN);
|
|
31
|
+
} catch {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
ensureEnv();
|
|
36
|
+
async function loadLocalStats(providerFilter) {
|
|
37
|
+
const stats = {
|
|
38
|
+
totalSessions: 0,
|
|
39
|
+
totalCalls: 0,
|
|
40
|
+
totalInputTokens: 0,
|
|
41
|
+
totalOutputTokens: 0,
|
|
42
|
+
totalCacheReadTokens: 0,
|
|
43
|
+
totalCacheWriteTokens: 0,
|
|
44
|
+
totalCostUSD: 0,
|
|
45
|
+
providers: {}
|
|
46
|
+
};
|
|
47
|
+
const sources = await discoverAllSessions(providerFilter);
|
|
48
|
+
stats.providers = {};
|
|
49
|
+
for (const s of sources) {
|
|
50
|
+
stats.providers[s.provider] = (stats.providers[s.provider] || 0) + 1;
|
|
51
|
+
}
|
|
52
|
+
const adapter = new ClaudeCodeAdapter();
|
|
53
|
+
const claudeSources = sources.filter((s) => s.provider === "claude");
|
|
54
|
+
for (const source of claudeSources) {
|
|
55
|
+
try {
|
|
56
|
+
const files = fs.readdirSync(source.path).filter((f) => f.endsWith(".jsonl"));
|
|
57
|
+
stats.totalSessions += files.length;
|
|
58
|
+
for (const file of files) {
|
|
59
|
+
const content = fs.readFileSync(path.join(source.path, file), "utf-8");
|
|
60
|
+
const parsed = adapter.parse(content);
|
|
61
|
+
for (const event of parsed.events) {
|
|
62
|
+
if (event.tokenUsage) {
|
|
63
|
+
stats.totalCalls++;
|
|
64
|
+
stats.totalInputTokens += event.tokenUsage.input;
|
|
65
|
+
stats.totalOutputTokens += event.tokenUsage.output;
|
|
66
|
+
stats.totalCacheReadTokens += event.tokenUsage.cacheRead ?? 0;
|
|
67
|
+
stats.totalCacheWriteTokens += event.tokenUsage.cacheWrite ?? 0;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
} catch {
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const inputCostPerM = 15;
|
|
75
|
+
const outputCostPerM = 75;
|
|
76
|
+
stats.totalCostUSD = Math.round((stats.totalInputTokens / 1e6 * inputCostPerM + stats.totalOutputTokens / 1e6 * outputCostPerM + stats.totalCacheReadTokens / 1e6 * (inputCostPerM * 0.1) + stats.totalCacheWriteTokens / 1e6 * (inputCostPerM * 1.25)) * 100) / 100;
|
|
77
|
+
return stats;
|
|
78
|
+
}
|
|
79
|
+
async function loadApiInsights(projectPath) {
|
|
80
|
+
const apiUrl = process.env.RULEMETRIC_API_URL ?? "http://localhost:3000";
|
|
81
|
+
const apiKey = process.env.RULEMETRIC_API_KEY;
|
|
82
|
+
const accessToken = process.env.RULEMETRIC_ACCESS_TOKEN;
|
|
83
|
+
const token = apiKey ?? accessToken;
|
|
84
|
+
if (!token) return null;
|
|
85
|
+
const params = new URLSearchParams();
|
|
86
|
+
if (projectPath) params.set("projectPath", projectPath);
|
|
87
|
+
try {
|
|
88
|
+
const resp = await fetch(`${apiUrl}/api/insights/compute?${params}`, {
|
|
89
|
+
headers: { Authorization: `Bearer ${token}` },
|
|
90
|
+
signal: AbortSignal.timeout(5e3)
|
|
91
|
+
});
|
|
92
|
+
if (!resp.ok) return null;
|
|
93
|
+
return await resp.json();
|
|
94
|
+
} catch {
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
async function loadLinkedInstructions(projectPath) {
|
|
99
|
+
const apiUrl = process.env.RULEMETRIC_API_URL ?? "http://localhost:3000";
|
|
100
|
+
const token = process.env.RULEMETRIC_API_KEY ?? process.env.RULEMETRIC_ACCESS_TOKEN;
|
|
101
|
+
if (!token) return null;
|
|
102
|
+
const params = new URLSearchParams();
|
|
103
|
+
if (projectPath) params.set("projectPath", projectPath);
|
|
104
|
+
try {
|
|
105
|
+
const resp = await fetch(`${apiUrl}/api/insights/linked-instructions?${params}`, {
|
|
106
|
+
headers: { Authorization: `Bearer ${token}` },
|
|
107
|
+
signal: AbortSignal.timeout(5e3)
|
|
108
|
+
});
|
|
109
|
+
if (!resp.ok) return null;
|
|
110
|
+
return await resp.json();
|
|
111
|
+
} catch {
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export {
|
|
117
|
+
loadLocalStats,
|
|
118
|
+
loadApiInsights,
|
|
119
|
+
loadLinkedInstructions
|
|
120
|
+
};
|
|
121
|
+
//# sourceMappingURL=chunk-RJ7BHDLM.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/dashboard/data.ts"],
|
|
4
|
+
"sourcesContent": ["import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport { discoverAllSessions, ClaudeCodeAdapter } from '@rulemetric/session';\nimport type { LocalStats, ApiInsights } from './types.js';\n\n/** Load auth config from env vars \u2192 ~/.config/rulemetric/env \u2192 .env.local */\nfunction ensureEnv(): void {\n if (process.env.RULEMETRIC_API_KEY || process.env.RULEMETRIC_ACCESS_TOKEN) return;\n\n // Try ~/.config/rulemetric/env\n const globalEnv = path.join(os.homedir(), '.config', 'rulemetric', 'env');\n if (loadEnvFile(globalEnv)) return;\n\n // Try .env.local in cwd\n loadEnvFile(path.join(process.cwd(), '.env.local'));\n}\n\nfunction loadEnvFile(filePath: string): boolean {\n try {\n const content = fs.readFileSync(filePath, 'utf-8');\n for (const line of content.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n const eqIdx = trimmed.indexOf('=');\n if (eqIdx < 0) continue;\n const key = trimmed.slice(0, eqIdx).trim();\n const value = trimmed.slice(eqIdx + 1).trim();\n if (!process.env[key]) {\n process.env[key] = value;\n }\n }\n return !!(process.env.RULEMETRIC_API_KEY || process.env.RULEMETRIC_ACCESS_TOKEN);\n } catch {\n return false;\n }\n}\n\n// Load on import\nensureEnv();\n\n/** Read local JSONL files and compute basic stats. */\nexport async function loadLocalStats(providerFilter?: string): Promise<LocalStats> {\n const stats: LocalStats = {\n totalSessions: 0,\n totalCalls: 0,\n totalInputTokens: 0,\n totalOutputTokens: 0,\n totalCacheReadTokens: 0,\n totalCacheWriteTokens: 0,\n totalCostUSD: 0,\n providers: {},\n };\n\n const sources = await discoverAllSessions(providerFilter);\n stats.providers = {};\n for (const s of sources) {\n stats.providers[s.provider] = (stats.providers[s.provider] || 0) + 1;\n }\n\n // Parse Claude Code sessions from local JSONL files\n const adapter = new ClaudeCodeAdapter();\n const claudeSources = sources.filter(s => s.provider === 'claude');\n\n for (const source of claudeSources) {\n try {\n const files = fs.readdirSync(source.path).filter(f => f.endsWith('.jsonl'));\n stats.totalSessions += files.length;\n\n for (const file of files) {\n const content = fs.readFileSync(path.join(source.path, file), 'utf-8');\n const parsed = adapter.parse(content);\n\n for (const event of parsed.events) {\n if (event.tokenUsage) {\n stats.totalCalls++;\n stats.totalInputTokens += event.tokenUsage.input;\n stats.totalOutputTokens += event.tokenUsage.output;\n stats.totalCacheReadTokens += event.tokenUsage.cacheRead ?? 0;\n stats.totalCacheWriteTokens += event.tokenUsage.cacheWrite ?? 0;\n }\n }\n }\n } catch {\n // Skip unreadable directories\n }\n }\n\n // Estimate cost (Opus pricing as default)\n const inputCostPerM = 15;\n const outputCostPerM = 75;\n stats.totalCostUSD = Math.round((\n (stats.totalInputTokens / 1_000_000) * inputCostPerM +\n (stats.totalOutputTokens / 1_000_000) * outputCostPerM +\n (stats.totalCacheReadTokens / 1_000_000) * (inputCostPerM * 0.1) +\n (stats.totalCacheWriteTokens / 1_000_000) * (inputCostPerM * 1.25)\n ) * 100) / 100;\n\n return stats;\n}\n\n/** Fetch enriched insights from the API. Returns null if API is unreachable. */\nexport async function loadApiInsights(projectPath?: string): Promise<ApiInsights | null> {\n const apiUrl = process.env.RULEMETRIC_API_URL ?? 'http://localhost:3000';\n const apiKey = process.env.RULEMETRIC_API_KEY;\n const accessToken = process.env.RULEMETRIC_ACCESS_TOKEN;\n const token = apiKey ?? accessToken;\n if (!token) return null;\n\n const params = new URLSearchParams();\n if (projectPath) params.set('projectPath', projectPath);\n\n try {\n const resp = await fetch(`${apiUrl}/api/insights/compute?${params}`, {\n headers: { Authorization: `Bearer ${token}` },\n signal: AbortSignal.timeout(5000),\n });\n if (!resp.ok) return null;\n return await resp.json() as ApiInsights;\n } catch {\n return null;\n }\n}\n\n/** Fetch linked instructions from the API. */\nexport async function loadLinkedInstructions(projectPath?: string): Promise<Array<{ name: string; linkedSessions: number }> | null> {\n const apiUrl = process.env.RULEMETRIC_API_URL ?? 'http://localhost:3000';\n const token = process.env.RULEMETRIC_API_KEY ?? process.env.RULEMETRIC_ACCESS_TOKEN;\n if (!token) return null;\n\n const params = new URLSearchParams();\n if (projectPath) params.set('projectPath', projectPath);\n\n try {\n const resp = await fetch(`${apiUrl}/api/insights/linked-instructions?${params}`, {\n headers: { Authorization: `Bearer ${token}` },\n signal: AbortSignal.timeout(5000),\n });\n if (!resp.ok) return null;\n return await resp.json() as Array<{ name: string; linkedSessions: number }>;\n } catch {\n return null;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
// src/lib/handlers/cron-refresh-skills.ts
|
|
2
|
+
import {
|
|
3
|
+
fetchAllSources,
|
|
4
|
+
TIER_1_SOURCES,
|
|
5
|
+
TIER_2_SOURCES,
|
|
6
|
+
loadDiscoveredSources
|
|
7
|
+
} from "@rulemetric/skills-registry";
|
|
8
|
+
import { writeFile, mkdir } from "node:fs/promises";
|
|
9
|
+
import os from "node:os";
|
|
10
|
+
import path from "node:path";
|
|
11
|
+
var BATCH_SIZE = 200;
|
|
12
|
+
async function postDiscordAlert(webhookUrl, opts) {
|
|
13
|
+
const color = opts.failed > 0 ? 16096779 : 2278750;
|
|
14
|
+
const title = opts.failed > 0 ? "\u26A0\uFE0F Skills registry refresh (partial failures)" : "\u2705 Skills registry refreshed";
|
|
15
|
+
const embed = {
|
|
16
|
+
title,
|
|
17
|
+
color,
|
|
18
|
+
fields: [
|
|
19
|
+
{ name: "Total skills", value: String(opts.total), inline: true },
|
|
20
|
+
{ name: "Sources", value: String(opts.sources), inline: true },
|
|
21
|
+
{ name: "Duration", value: `${Math.round(opts.durationMs / 1e3)}s`, inline: true },
|
|
22
|
+
{ name: "Inserted", value: String(opts.inserted), inline: true },
|
|
23
|
+
{ name: "Updated", value: String(opts.updated), inline: true },
|
|
24
|
+
{ name: "Unchanged", value: String(opts.unchanged), inline: true },
|
|
25
|
+
...opts.failed > 0 ? [{ name: "Failed", value: String(opts.failed), inline: true }] : []
|
|
26
|
+
],
|
|
27
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
28
|
+
};
|
|
29
|
+
try {
|
|
30
|
+
const res = await fetch(webhookUrl, {
|
|
31
|
+
method: "POST",
|
|
32
|
+
headers: { "Content-Type": "application/json" },
|
|
33
|
+
body: JSON.stringify({ embeds: [embed] })
|
|
34
|
+
});
|
|
35
|
+
if (!res.ok) {
|
|
36
|
+
console.error("[cron-refresh-skills] Discord alert failed", res.status);
|
|
37
|
+
}
|
|
38
|
+
} catch (err) {
|
|
39
|
+
console.error("[cron-refresh-skills] Discord alert threw", err);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
var cronRefreshSkills = async (_payload, helpers) => {
|
|
43
|
+
if (!process.env.GITHUB_TOKEN) {
|
|
44
|
+
helpers.logger.warn(
|
|
45
|
+
"GITHUB_TOKEN unset \u2014 skipping skills registry refresh. Without a token the unauthenticated 60 req/hr cap is too tight for ~351 sources; set GITHUB_TOKEN (5000 req/hr) and re-run."
|
|
46
|
+
);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const startedAt = Date.now();
|
|
50
|
+
const discovered = loadDiscoveredSources();
|
|
51
|
+
const seen = /* @__PURE__ */ new Set();
|
|
52
|
+
const sources = [...TIER_1_SOURCES, ...TIER_2_SOURCES, ...discovered].filter((s) => {
|
|
53
|
+
if (seen.has(s.repo)) return false;
|
|
54
|
+
seen.add(s.repo);
|
|
55
|
+
return true;
|
|
56
|
+
});
|
|
57
|
+
helpers.logger.info(`Fetching from ${sources.length} sources (T1=${TIER_1_SOURCES.length}, T2=${TIER_2_SOURCES.length}, discovered=${discovered.length})`);
|
|
58
|
+
const result = await fetchAllSources(sources, {
|
|
59
|
+
onProgress: (source, count) => helpers.logger.info(`fetched ${count} from ${source}`)
|
|
60
|
+
});
|
|
61
|
+
const configDir = path.join(os.homedir(), ".config", "rulemetric");
|
|
62
|
+
await mkdir(configDir, { recursive: true });
|
|
63
|
+
const outPath = path.join(configDir, "skills-registry.json");
|
|
64
|
+
await writeFile(
|
|
65
|
+
outPath,
|
|
66
|
+
JSON.stringify({ generatedAt: (/* @__PURE__ */ new Date()).toISOString(), skills: result.entries }, null, 2)
|
|
67
|
+
);
|
|
68
|
+
helpers.logger.info(`Refreshed disk registry: ${result.entries.length} skills`);
|
|
69
|
+
const apiUrl = process.env.RULEMETRIC_API_URL;
|
|
70
|
+
const botToken = process.env.RULEMETRIC_REGISTRY_BOT_TOKEN;
|
|
71
|
+
if (!apiUrl || !botToken) {
|
|
72
|
+
helpers.logger.warn(
|
|
73
|
+
"RULEMETRIC_API_URL or RULEMETRIC_REGISTRY_BOT_TOKEN unset; skipping DB sync"
|
|
74
|
+
);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
let totalInserted = 0;
|
|
78
|
+
let totalUpdated = 0;
|
|
79
|
+
let totalUnchanged = 0;
|
|
80
|
+
let totalFailed = 0;
|
|
81
|
+
for (let i = 0; i < result.entries.length; i += BATCH_SIZE) {
|
|
82
|
+
const batch = result.entries.slice(i, i + BATCH_SIZE).map((s) => ({
|
|
83
|
+
id: s.id,
|
|
84
|
+
name: s.name,
|
|
85
|
+
description: s.description,
|
|
86
|
+
content: s.content,
|
|
87
|
+
source: s.source,
|
|
88
|
+
tags: s.tags,
|
|
89
|
+
category: s.category,
|
|
90
|
+
updatedAt: s.updatedAt,
|
|
91
|
+
sourceUpdatedAt: s.sourceUpdatedAt,
|
|
92
|
+
// source file's last git-commit date (catalog recency sort)
|
|
93
|
+
popularity: s.popularity
|
|
94
|
+
}));
|
|
95
|
+
try {
|
|
96
|
+
const res = await fetch(`${apiUrl}/api/skills/sync-public`, {
|
|
97
|
+
method: "POST",
|
|
98
|
+
headers: {
|
|
99
|
+
"content-type": "application/json",
|
|
100
|
+
authorization: `Bearer ${botToken}`
|
|
101
|
+
},
|
|
102
|
+
body: JSON.stringify({ skills: batch })
|
|
103
|
+
});
|
|
104
|
+
if (!res.ok) {
|
|
105
|
+
helpers.logger.warn(`Batch ${i / BATCH_SIZE} failed: ${res.status} ${await res.text()}`);
|
|
106
|
+
totalFailed += batch.length;
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
const json = await res.json();
|
|
110
|
+
totalInserted += json.inserted;
|
|
111
|
+
totalUpdated += json.updated;
|
|
112
|
+
totalUnchanged += json.unchanged;
|
|
113
|
+
if (json.skipped) {
|
|
114
|
+
helpers.logger.warn(`Batch ${i / BATCH_SIZE}: ${json.skipped} skills skipped (invalid)`);
|
|
115
|
+
totalFailed += json.skipped;
|
|
116
|
+
}
|
|
117
|
+
} catch (err) {
|
|
118
|
+
helpers.logger.warn(`Batch ${i / BATCH_SIZE} threw: ${err instanceof Error ? err.message : String(err)}`);
|
|
119
|
+
totalFailed += batch.length;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
helpers.logger.info(
|
|
123
|
+
`DB sync: inserted=${totalInserted} updated=${totalUpdated} unchanged=${totalUnchanged} failed=${totalFailed}`
|
|
124
|
+
);
|
|
125
|
+
const discordUrl = process.env.DISCORD_WEBHOOK_URL;
|
|
126
|
+
if (discordUrl) {
|
|
127
|
+
await postDiscordAlert(discordUrl, {
|
|
128
|
+
total: result.entries.length,
|
|
129
|
+
inserted: totalInserted,
|
|
130
|
+
updated: totalUpdated,
|
|
131
|
+
unchanged: totalUnchanged,
|
|
132
|
+
failed: totalFailed,
|
|
133
|
+
sources: sources.length,
|
|
134
|
+
durationMs: Date.now() - startedAt
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
export {
|
|
140
|
+
cronRefreshSkills
|
|
141
|
+
};
|
|
142
|
+
//# sourceMappingURL=chunk-RQ2TMLKG.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/lib/handlers/cron-refresh-skills.ts"],
|
|
4
|
+
"sourcesContent": ["import type { JobHelpers } from '../job-helpers.js';\nimport {\n fetchAllSources,\n TIER_1_SOURCES,\n TIER_2_SOURCES,\n loadDiscoveredSources,\n} from '@rulemetric/skills-registry';\nimport { writeFile, mkdir } from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\n\nconst BATCH_SIZE = 200;\n\nasync function postDiscordAlert(\n webhookUrl: string,\n opts: {\n total: number;\n inserted: number;\n updated: number;\n unchanged: number;\n failed: number;\n sources: number;\n durationMs: number;\n },\n): Promise<void> {\n const color = opts.failed > 0 ? 0xf59e0b : 0x22c55e;\n const title = opts.failed > 0 ? '\u26A0\uFE0F Skills registry refresh (partial failures)' : '\u2705 Skills registry refreshed';\n const embed = {\n title,\n color,\n fields: [\n { name: 'Total skills', value: String(opts.total), inline: true },\n { name: 'Sources', value: String(opts.sources), inline: true },\n { name: 'Duration', value: `${Math.round(opts.durationMs / 1000)}s`, inline: true },\n { name: 'Inserted', value: String(opts.inserted), inline: true },\n { name: 'Updated', value: String(opts.updated), inline: true },\n { name: 'Unchanged', value: String(opts.unchanged), inline: true },\n ...(opts.failed > 0 ? [{ name: 'Failed', value: String(opts.failed), inline: true }] : []),\n ],\n timestamp: new Date().toISOString(),\n };\n try {\n const res = await fetch(webhookUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ embeds: [embed] }),\n });\n if (!res.ok) {\n console.error('[cron-refresh-skills] Discord alert failed', res.status);\n }\n } catch (err) {\n console.error('[cron-refresh-skills] Discord alert threw', err);\n }\n}\n\nexport const cronRefreshSkills = async (_payload: unknown, helpers: JobHelpers): Promise<void> => {\n // Fail fast when there's no GITHUB_TOKEN. The unauthenticated GitHub API\n // gives 60 req/hr; this cron does 2 calls per source \u00D7 ~351 sources = 702\n // calls. Without a token we'd exhaust the cap on the first batch, hit\n // Octokit's throttle plugin, and (pre-fix) sleep up to 57 min per source\n // waiting for the rate window to reset \u2014 all while holding a graphile\n // concurrency slot. The bounded-retry change in github-fetcher.ts makes\n // that survivable, but we'd still rather skip cleanly than crawl 702 calls\n // just to skip them all individually. Set GITHUB_TOKEN in the worker env\n // (e.g. via launchctl setenv) to enable.\n if (!process.env.GITHUB_TOKEN) {\n helpers.logger.warn(\n 'GITHUB_TOKEN unset \u2014 skipping skills registry refresh. Without a token the unauthenticated 60 req/hr cap is too tight for ~351 sources; set GITHUB_TOKEN (5000 req/hr) and re-run.',\n );\n return;\n }\n\n const startedAt = Date.now();\n\n // Combine all source tiers + the discovered set so the cron's coverage\n // matches the bundled registry. De-dupe by repo to avoid double-fetching\n // when discovered overlaps with explicit sources.\n const discovered = loadDiscoveredSources();\n const seen = new Set<string>();\n const sources = [...TIER_1_SOURCES, ...TIER_2_SOURCES, ...discovered].filter((s) => {\n if (seen.has(s.repo)) return false;\n seen.add(s.repo);\n return true;\n });\n helpers.logger.info(`Fetching from ${sources.length} sources (T1=${TIER_1_SOURCES.length}, T2=${TIER_2_SOURCES.length}, discovered=${discovered.length})`);\n\n const result = await fetchAllSources(sources, {\n onProgress: (source, count) => helpers.logger.info(`fetched ${count} from ${source}`),\n });\n\n // Persist JSON-on-disk view (legacy / fast-path consumers).\n const configDir = path.join(os.homedir(), '.config', 'rulemetric');\n await mkdir(configDir, { recursive: true });\n const outPath = path.join(configDir, 'skills-registry.json');\n await writeFile(\n outPath,\n JSON.stringify({ generatedAt: new Date().toISOString(), skills: result.entries }, null, 2),\n );\n helpers.logger.info(`Refreshed disk registry: ${result.entries.length} skills`);\n\n // Mirror to DB as scope='public' instructions rows so the catalog,\n // recommendations, and suggestion-cron all see one source of truth.\n const apiUrl = process.env.RULEMETRIC_API_URL;\n const botToken = process.env.RULEMETRIC_REGISTRY_BOT_TOKEN;\n if (!apiUrl || !botToken) {\n helpers.logger.warn(\n 'RULEMETRIC_API_URL or RULEMETRIC_REGISTRY_BOT_TOKEN unset; skipping DB sync',\n );\n return;\n }\n\n let totalInserted = 0;\n let totalUpdated = 0;\n let totalUnchanged = 0;\n let totalFailed = 0;\n\n for (let i = 0; i < result.entries.length; i += BATCH_SIZE) {\n const batch = result.entries.slice(i, i + BATCH_SIZE).map((s) => ({\n id: s.id,\n name: s.name,\n description: s.description,\n content: s.content,\n source: s.source,\n tags: s.tags,\n category: s.category,\n updatedAt: s.updatedAt,\n sourceUpdatedAt: s.sourceUpdatedAt, // source file's last git-commit date (catalog recency sort)\n popularity: s.popularity,\n }));\n try {\n const res = await fetch(`${apiUrl}/api/skills/sync-public`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n authorization: `Bearer ${botToken}`,\n },\n body: JSON.stringify({ skills: batch }),\n });\n if (!res.ok) {\n helpers.logger.warn(`Batch ${i / BATCH_SIZE} failed: ${res.status} ${await res.text()}`);\n totalFailed += batch.length;\n continue;\n }\n const json = (await res.json()) as {\n inserted: number;\n updated: number;\n unchanged: number;\n skipped?: number;\n };\n totalInserted += json.inserted;\n totalUpdated += json.updated;\n totalUnchanged += json.unchanged;\n if (json.skipped) {\n helpers.logger.warn(`Batch ${i / BATCH_SIZE}: ${json.skipped} skills skipped (invalid)`);\n totalFailed += json.skipped;\n }\n } catch (err) {\n helpers.logger.warn(`Batch ${i / BATCH_SIZE} threw: ${err instanceof Error ? err.message : String(err)}`);\n totalFailed += batch.length;\n }\n }\n\n helpers.logger.info(\n `DB sync: inserted=${totalInserted} updated=${totalUpdated} unchanged=${totalUnchanged} failed=${totalFailed}`,\n );\n\n const discordUrl = process.env.DISCORD_WEBHOOK_URL;\n if (discordUrl) {\n await postDiscordAlert(discordUrl, {\n total: result.entries.length,\n inserted: totalInserted,\n updated: totalUpdated,\n unchanged: totalUnchanged,\n failed: totalFailed,\n sources: sources.length,\n durationMs: Date.now() - startedAt,\n });\n }\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getUpgradeBanner,
|
|
3
|
+
refreshVersionCacheInBackground
|
|
4
|
+
} from "./chunk-OGVORIFM.js";
|
|
5
|
+
import {
|
|
6
|
+
maybeRefreshActiveOrg
|
|
7
|
+
} from "./chunk-2AM54TUK.js";
|
|
8
|
+
import {
|
|
9
|
+
ApiError
|
|
10
|
+
} from "./chunk-EJOI2ZGU.js";
|
|
11
|
+
import {
|
|
12
|
+
isAuthenticated
|
|
13
|
+
} from "./chunk-KZRFUXGF.js";
|
|
14
|
+
|
|
15
|
+
// src/base-command.ts
|
|
16
|
+
import { Command, Flags } from "@oclif/core";
|
|
17
|
+
var BaseCommand = class extends Command {
|
|
18
|
+
static baseFlags = {
|
|
19
|
+
"api-url": Flags.string({
|
|
20
|
+
description: "Override API base URL",
|
|
21
|
+
env: "RULEMETRIC_API_URL",
|
|
22
|
+
hidden: true
|
|
23
|
+
})
|
|
24
|
+
};
|
|
25
|
+
async init() {
|
|
26
|
+
await super.init();
|
|
27
|
+
const { flags } = await this.parse(this.constructor);
|
|
28
|
+
if (flags["api-url"]) {
|
|
29
|
+
process.env.RULEMETRIC_API_URL = flags["api-url"];
|
|
30
|
+
}
|
|
31
|
+
const banner = getUpgradeBanner(this.config.version);
|
|
32
|
+
if (banner && !this.argv.includes("--quiet") && !process.env.RULEMETRIC_QUIET) {
|
|
33
|
+
process.stderr.write(`
|
|
34
|
+
${banner}
|
|
35
|
+
|
|
36
|
+
`);
|
|
37
|
+
}
|
|
38
|
+
refreshVersionCacheInBackground();
|
|
39
|
+
}
|
|
40
|
+
requireAuth() {
|
|
41
|
+
if (!isAuthenticated()) {
|
|
42
|
+
this.error("Not logged in. Run `rulemetric auth login` to authenticate.");
|
|
43
|
+
}
|
|
44
|
+
void maybeRefreshActiveOrg();
|
|
45
|
+
}
|
|
46
|
+
async catch(err) {
|
|
47
|
+
if (err instanceof ApiError) {
|
|
48
|
+
if (err.statusCode === 401) {
|
|
49
|
+
this.error("Session expired. Run `rulemetric auth login` to re-authenticate.");
|
|
50
|
+
}
|
|
51
|
+
this.error(err.message);
|
|
52
|
+
}
|
|
53
|
+
if (err.message?.includes("fetch failed") || err.message?.includes("ECONNREFUSED")) {
|
|
54
|
+
this.error("Could not connect to the API server. Is it running?");
|
|
55
|
+
}
|
|
56
|
+
throw err;
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
export {
|
|
61
|
+
BaseCommand
|
|
62
|
+
};
|
|
63
|
+
//# sourceMappingURL=chunk-S56LOTGQ.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/base-command.ts"],
|
|
4
|
+
"sourcesContent": ["import { Command, Flags } from '@oclif/core';\nimport { isAuthenticated } from './lib/auth.js';\nimport { ApiError } from './lib/api-client.js';\nimport { maybeRefreshActiveOrg } from './lib/active-org-refresh.js';\nimport { getUpgradeBanner, refreshVersionCacheInBackground } from './lib/version-check.js';\n\nexport abstract class BaseCommand extends Command {\n static override baseFlags = {\n 'api-url': Flags.string({\n description: 'Override API base URL',\n env: 'RULEMETRIC_API_URL',\n hidden: true,\n }),\n };\n\n protected override async init(): Promise<void> {\n await super.init();\n const { flags } = await this.parse(this.constructor as typeof BaseCommand);\n if (flags['api-url']) {\n process.env.RULEMETRIC_API_URL = flags['api-url'];\n }\n // Print the upgrade banner from the cache (populated by the previous\n // command). To stderr so it doesn't pollute scriptable stdout. Then\n // kick off a background refresh for the *next* invocation. Suppressed\n // on commands meant to be machine-readable (`hooks run`, etc.) since\n // a banner there would corrupt JSON output piped to other tools.\n const banner = getUpgradeBanner(this.config.version);\n if (banner && !this.argv.includes('--quiet') && !process.env.RULEMETRIC_QUIET) {\n process.stderr.write(`\\n${banner}\\n\\n`);\n }\n refreshVersionCacheInBackground();\n }\n\n protected requireAuth(): void {\n if (!isAuthenticated()) {\n this.error('Not logged in. Run `rulemetric auth login` to authenticate.');\n }\n // Fire-and-forget refresh of the local active-org cache. Doesn't block\n // the command \u2014 its only side effect is rewriting the cache file.\n void maybeRefreshActiveOrg();\n }\n\n protected override async catch(err: Error & { exitCode?: number }): Promise<void> {\n if (err instanceof ApiError) {\n if (err.statusCode === 401) {\n this.error('Session expired. Run `rulemetric auth login` to re-authenticate.');\n }\n\n this.error(err.message);\n }\n\n if (err.message?.includes('fetch failed') || err.message?.includes('ECONNREFUSED')) {\n this.error('Could not connect to the API server. Is it running?');\n }\n\n throw err;\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;AAAA,SAAS,SAAS,aAAa;AAMxB,IAAe,cAAf,cAAmC,QAAQ;AAAA,EAChD,OAAgB,YAAY;AAAA,IAC1B,WAAW,MAAM,OAAO;AAAA,MACtB,aAAa;AAAA,MACb,KAAK;AAAA,MACL,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AAAA,EAEA,MAAyB,OAAsB;AAC7C,UAAM,MAAM,KAAK;AACjB,UAAM,EAAE,MAAM,IAAI,MAAM,KAAK,MAAM,KAAK,WAAiC;AACzE,QAAI,MAAM,SAAS,GAAG;AACpB,cAAQ,IAAI,qBAAqB,MAAM,SAAS;AAAA,IAClD;AAMA,UAAM,SAAS,iBAAiB,KAAK,OAAO,OAAO;AACnD,QAAI,UAAU,CAAC,KAAK,KAAK,SAAS,SAAS,KAAK,CAAC,QAAQ,IAAI,kBAAkB;AAC7E,cAAQ,OAAO,MAAM;AAAA,EAAK,MAAM;AAAA;AAAA,CAAM;AAAA,IACxC;AACA,oCAAgC;AAAA,EAClC;AAAA,EAEU,cAAoB;AAC5B,QAAI,CAAC,gBAAgB,GAAG;AACtB,WAAK,MAAM,6DAA6D;AAAA,IAC1E;AAGA,SAAK,sBAAsB;AAAA,EAC7B;AAAA,EAEA,MAAyB,MAAM,KAAmD;AAChF,QAAI,eAAe,UAAU;AAC3B,UAAI,IAAI,eAAe,KAAK;AAC1B,aAAK,MAAM,kEAAkE;AAAA,MAC/E;AAEA,WAAK,MAAM,IAAI,OAAO;AAAA,IACxB;AAEA,QAAI,IAAI,SAAS,SAAS,cAAc,KAAK,IAAI,SAAS,SAAS,cAAc,GAAG;AAClF,WAAK,MAAM,qDAAqD;AAAA,IAClE;AAEA,UAAM;AAAA,EACR;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ApiError,
|
|
3
|
+
apiPost
|
|
4
|
+
} from "./chunk-EJOI2ZGU.js";
|
|
5
|
+
|
|
6
|
+
// src/lib/research-client.ts
|
|
7
|
+
function serializeDate(v) {
|
|
8
|
+
if (v == null) return v ?? null;
|
|
9
|
+
return v instanceof Date ? v.toISOString() : v;
|
|
10
|
+
}
|
|
11
|
+
async function postObservation(obs) {
|
|
12
|
+
const body = {
|
|
13
|
+
provider: obs.provider,
|
|
14
|
+
plan: obs.plan,
|
|
15
|
+
limitType: obs.limitType,
|
|
16
|
+
value: obs.value,
|
|
17
|
+
unit: obs.unit,
|
|
18
|
+
comparator: obs.comparator,
|
|
19
|
+
resetsAt: serializeDate(obs.resetsAt),
|
|
20
|
+
sourceType: obs.sourceType,
|
|
21
|
+
sourceUrl: obs.sourceUrl,
|
|
22
|
+
sourceEvidence: obs.sourceEvidence,
|
|
23
|
+
confidence: obs.confidence,
|
|
24
|
+
observedAt: serializeDate(obs.observedAt)
|
|
25
|
+
};
|
|
26
|
+
return apiPost("/api/internal/research/observe", body);
|
|
27
|
+
}
|
|
28
|
+
async function postObservations(observations) {
|
|
29
|
+
let posted = 0;
|
|
30
|
+
let failed = 0;
|
|
31
|
+
const errors = [];
|
|
32
|
+
for (const obs of observations) {
|
|
33
|
+
try {
|
|
34
|
+
await postObservation(obs);
|
|
35
|
+
posted++;
|
|
36
|
+
} catch (err) {
|
|
37
|
+
failed++;
|
|
38
|
+
const msg = err instanceof ApiError ? `HTTP ${err.statusCode}: ${err.message}` : String(err);
|
|
39
|
+
if (errors.length < 5) errors.push(msg);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return { posted, failed, errors };
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export {
|
|
46
|
+
postObservation,
|
|
47
|
+
postObservations
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=chunk-UF73WX2J.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/lib/research-client.ts"],
|
|
4
|
+
"sourcesContent": ["// Thin wrapper around apiPost for the research observation endpoint. Keeps\n// the body schema (camelCase, Date|string for resetsAt) co-located with the\n// transcript watcher so changes don't drift apart.\n\nimport { apiPost, ApiError } from './api-client.js';\nimport type { ParsedObservation } from './transcript-rate-limit-watcher.js';\n\ninterface ObserveResponse {\n id: string;\n observedAt: string;\n}\n\nfunction serializeDate(v: Date | string | null | undefined): string | null | undefined {\n if (v == null) return v ?? null;\n return v instanceof Date ? v.toISOString() : v;\n}\n\nexport async function postObservation(obs: ParsedObservation): Promise<ObserveResponse> {\n const body: Record<string, unknown> = {\n provider: obs.provider,\n plan: obs.plan,\n limitType: obs.limitType,\n value: obs.value,\n unit: obs.unit,\n comparator: obs.comparator,\n resetsAt: serializeDate(obs.resetsAt),\n sourceType: obs.sourceType,\n sourceUrl: obs.sourceUrl,\n sourceEvidence: obs.sourceEvidence,\n confidence: obs.confidence,\n observedAt: serializeDate(obs.observedAt),\n };\n return apiPost<ObserveResponse>('/api/internal/research/observe', body);\n}\n\n/**\n * POST a batch best-effort. Returns counts. Individual failures are swallowed\n * so a 429 on one observation doesn't lose the rest.\n */\nexport async function postObservations(\n observations: ParsedObservation[],\n): Promise<{ posted: number; failed: number; errors: string[] }> {\n let posted = 0;\n let failed = 0;\n const errors: string[] = [];\n for (const obs of observations) {\n try {\n await postObservation(obs);\n posted++;\n } catch (err) {\n failed++;\n const msg = err instanceof ApiError ? `HTTP ${err.statusCode}: ${err.message}` : String(err);\n if (errors.length < 5) errors.push(msg);\n }\n }\n return { posted, failed, errors };\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;AAYA,SAAS,cAAc,GAAgE;AACrF,MAAI,KAAK,KAAM,QAAO,KAAK;AAC3B,SAAO,aAAa,OAAO,EAAE,YAAY,IAAI;AAC/C;AAEA,eAAsB,gBAAgB,KAAkD;AACtF,QAAM,OAAgC;AAAA,IACpC,UAAU,IAAI;AAAA,IACd,MAAM,IAAI;AAAA,IACV,WAAW,IAAI;AAAA,IACf,OAAO,IAAI;AAAA,IACX,MAAM,IAAI;AAAA,IACV,YAAY,IAAI;AAAA,IAChB,UAAU,cAAc,IAAI,QAAQ;AAAA,IACpC,YAAY,IAAI;AAAA,IAChB,WAAW,IAAI;AAAA,IACf,gBAAgB,IAAI;AAAA,IACpB,YAAY,IAAI;AAAA,IAChB,YAAY,cAAc,IAAI,UAAU;AAAA,EAC1C;AACA,SAAO,QAAyB,kCAAkC,IAAI;AACxE;AAMA,eAAsB,iBACpB,cAC+D;AAC/D,MAAI,SAAS;AACb,MAAI,SAAS;AACb,QAAM,SAAmB,CAAC;AAC1B,aAAW,OAAO,cAAc;AAC9B,QAAI;AACF,YAAM,gBAAgB,GAAG;AACzB;AAAA,IACF,SAAS,KAAK;AACZ;AACA,YAAM,MAAM,eAAe,WAAW,QAAQ,IAAI,UAAU,KAAK,IAAI,OAAO,KAAK,OAAO,GAAG;AAC3F,UAAI,OAAO,SAAS,EAAG,QAAO,KAAK,GAAG;AAAA,IACxC;AAAA,EACF;AACA,SAAO,EAAE,QAAQ,QAAQ,OAAO;AAClC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import {
|
|
2
|
+
PermanentJobError
|
|
3
|
+
} from "./chunk-DGHWRQXL.js";
|
|
4
|
+
import {
|
|
5
|
+
buildTmuxHasSessionArgs,
|
|
6
|
+
buildTmuxSendEnterArgs,
|
|
7
|
+
buildTmuxSendLiteralArgs,
|
|
8
|
+
runTmux
|
|
9
|
+
} from "./chunk-KRBQLMOP.js";
|
|
10
|
+
|
|
11
|
+
// src/lib/handlers/process-send-message.ts
|
|
12
|
+
var MAX_ERROR_DETAIL = 2e3;
|
|
13
|
+
function errorDetail(result) {
|
|
14
|
+
return (result.stderr.trim() || "no stderr").slice(0, MAX_ERROR_DETAIL);
|
|
15
|
+
}
|
|
16
|
+
async function processSendMessage(payload, helpers) {
|
|
17
|
+
const target = typeof payload.target === "string" ? payload.target : null;
|
|
18
|
+
const message = typeof payload.message === "string" ? payload.message : null;
|
|
19
|
+
const submit = payload.submit !== false;
|
|
20
|
+
if (!target) throw new PermanentJobError("tmux target is required");
|
|
21
|
+
if (!message) throw new PermanentJobError("message is required");
|
|
22
|
+
helpers.logger.info(`Sending message to tmux target ${target}...`);
|
|
23
|
+
const hasSession = await runTmux(buildTmuxHasSessionArgs(target));
|
|
24
|
+
if (hasSession.code === null) {
|
|
25
|
+
throw new PermanentJobError(`tmux not available: ${errorDetail(hasSession)}`);
|
|
26
|
+
}
|
|
27
|
+
if (hasSession.code !== 0) {
|
|
28
|
+
throw new PermanentJobError(`tmux target not found: ${target}: ${errorDetail(hasSession)}`);
|
|
29
|
+
}
|
|
30
|
+
const send = await runTmux(buildTmuxSendLiteralArgs(target, message));
|
|
31
|
+
if (send.code !== 0) {
|
|
32
|
+
throw new Error(`tmux send-keys failed: ${errorDetail(send)}`);
|
|
33
|
+
}
|
|
34
|
+
if (submit) {
|
|
35
|
+
const enter = await runTmux(buildTmuxSendEnterArgs(target));
|
|
36
|
+
if (enter.code !== 0) {
|
|
37
|
+
throw new Error(`tmux send Enter failed: ${errorDetail(enter)}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return {
|
|
41
|
+
target,
|
|
42
|
+
sentAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
43
|
+
submitted: submit
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export {
|
|
48
|
+
processSendMessage
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=chunk-W53GKIZQ.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/lib/handlers/process-send-message.ts"],
|
|
4
|
+
"sourcesContent": ["import type { JobHelpers } from '../job-helpers.js';\nimport { PermanentJobError } from '../permanent-job-error.js';\nimport {\n buildTmuxHasSessionArgs,\n buildTmuxSendEnterArgs,\n buildTmuxSendLiteralArgs,\n runTmux,\n type TmuxRunResult,\n} from '../tmux.js';\n\ninterface SendMessagePayload {\n target?: unknown;\n message?: unknown;\n submit?: unknown;\n}\n\nconst MAX_ERROR_DETAIL = 2_000;\n\nfunction errorDetail(result: TmuxRunResult): string {\n return (result.stderr.trim() || 'no stderr').slice(0, MAX_ERROR_DETAIL);\n}\n\nexport async function processSendMessage(\n payload: SendMessagePayload,\n helpers: JobHelpers,\n): Promise<Record<string, unknown>> {\n const target = typeof payload.target === 'string' ? payload.target : null;\n const message = typeof payload.message === 'string' ? payload.message : null;\n const submit = payload.submit !== false;\n\n if (!target) throw new PermanentJobError('tmux target is required');\n if (!message) throw new PermanentJobError('message is required');\n\n helpers.logger.info(`Sending message to tmux target ${target}...`);\n\n const hasSession = await runTmux(buildTmuxHasSessionArgs(target));\n if (hasSession.code === null) {\n throw new PermanentJobError(`tmux not available: ${errorDetail(hasSession)}`);\n }\n if (hasSession.code !== 0) {\n throw new PermanentJobError(`tmux target not found: ${target}: ${errorDetail(hasSession)}`);\n }\n\n const send = await runTmux(buildTmuxSendLiteralArgs(target, message));\n if (send.code !== 0) {\n throw new Error(`tmux send-keys failed: ${errorDetail(send)}`);\n }\n\n if (submit) {\n const enter = await runTmux(buildTmuxSendEnterArgs(target));\n if (enter.code !== 0) {\n throw new Error(`tmux send Enter failed: ${errorDetail(enter)}`);\n }\n }\n\n return {\n target,\n sentAt: new Date().toISOString(),\n submitted: submit,\n };\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;AAgBA,IAAM,mBAAmB;AAEzB,SAAS,YAAY,QAA+B;AAClD,UAAQ,OAAO,OAAO,KAAK,KAAK,aAAa,MAAM,GAAG,gBAAgB;AACxE;AAEA,eAAsB,mBACpB,SACA,SACkC;AAClC,QAAM,SAAS,OAAO,QAAQ,WAAW,WAAW,QAAQ,SAAS;AACrE,QAAM,UAAU,OAAO,QAAQ,YAAY,WAAW,QAAQ,UAAU;AACxE,QAAM,SAAS,QAAQ,WAAW;AAElC,MAAI,CAAC,OAAQ,OAAM,IAAI,kBAAkB,yBAAyB;AAClE,MAAI,CAAC,QAAS,OAAM,IAAI,kBAAkB,qBAAqB;AAE/D,UAAQ,OAAO,KAAK,kCAAkC,MAAM,KAAK;AAEjE,QAAM,aAAa,MAAM,QAAQ,wBAAwB,MAAM,CAAC;AAChE,MAAI,WAAW,SAAS,MAAM;AAC5B,UAAM,IAAI,kBAAkB,uBAAuB,YAAY,UAAU,CAAC,EAAE;AAAA,EAC9E;AACA,MAAI,WAAW,SAAS,GAAG;AACzB,UAAM,IAAI,kBAAkB,0BAA0B,MAAM,KAAK,YAAY,UAAU,CAAC,EAAE;AAAA,EAC5F;AAEA,QAAM,OAAO,MAAM,QAAQ,yBAAyB,QAAQ,OAAO,CAAC;AACpE,MAAI,KAAK,SAAS,GAAG;AACnB,UAAM,IAAI,MAAM,0BAA0B,YAAY,IAAI,CAAC,EAAE;AAAA,EAC/D;AAEA,MAAI,QAAQ;AACV,UAAM,QAAQ,MAAM,QAAQ,uBAAuB,MAAM,CAAC;AAC1D,QAAI,MAAM,SAAS,GAAG;AACpB,YAAM,IAAI,MAAM,2BAA2B,YAAY,KAAK,CAAC,EAAE;AAAA,IACjE;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,SAAQ,oBAAI,KAAK,GAAE,YAAY;AAAA,IAC/B,WAAW;AAAA,EACb;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|