@rulemetric/cli 0.7.2 → 0.7.4
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 +1 -14
- package/dist/chunk-2TC6WCUT.js +34 -0
- package/dist/chunk-2UC3ULIG.js +1 -0
- package/dist/chunk-3AV3GTMP.js +1 -0
- package/dist/chunk-4Z5ECCJE.js +1 -0
- package/dist/chunk-5RBLIVBF.js +1 -0
- package/dist/chunk-67QCYUJU.js +1 -0
- package/dist/chunk-6QKI756T.js +2 -0
- package/dist/chunk-6V4WM73L.js +1 -0
- package/dist/chunk-6XEC6474.js +1 -0
- package/dist/chunk-72XLQE3X.js +2 -0
- package/dist/chunk-7DFNBRLY.js +61 -0
- package/dist/chunk-7XQ4VPLC.js +2 -0
- package/dist/chunk-AHRHCERJ.js +1 -0
- package/dist/chunk-ARNZQBMX.js +1 -0
- package/dist/chunk-CADKBP3D.js +58 -0
- package/dist/chunk-CDI5CCHU.js +1 -0
- package/dist/chunk-CNQ5DTNC.js +1 -0
- package/dist/chunk-CRAKDQ4H.js +1 -0
- package/dist/chunk-DNF4HDI6.js +14 -0
- package/dist/chunk-DSO2U4Y6.js +56 -0
- package/dist/chunk-DT4GKEP5.js +5 -0
- package/dist/chunk-DVN7GFJG.js +1 -0
- package/dist/chunk-E4SFUPYR.js +15 -0
- package/dist/chunk-EUHNCVJQ.js +33 -0
- package/dist/chunk-F2VP4B4J.js +1 -0
- package/dist/chunk-FEHM5OKW.js +1 -0
- package/dist/chunk-FHVBTDBM.js +69 -0
- package/dist/chunk-GBMF3TP6.js +1 -0
- package/dist/chunk-GY5IJ4RS.js +1 -0
- package/dist/chunk-HOHD5HY2.js +5 -0
- package/dist/chunk-HP2BUPGS.js +24 -0
- package/dist/{chunk-OQBBVTDG.js → chunk-I2DZGJRR.js} +6 -71
- package/dist/chunk-I4YJ7NTX.js +1 -0
- package/dist/chunk-IY5NXR3N.js +1 -0
- package/dist/chunk-IZTIYR5Q.js +2 -0
- package/dist/chunk-KKDHD4XA.js +2 -0
- package/dist/chunk-LQRYQE6Q.js +4 -0
- package/dist/chunk-M6AJDVCL.js +5 -0
- package/dist/chunk-MGHFDHHM.js +1 -0
- package/dist/chunk-ML36XQW7.js +1 -0
- package/dist/chunk-MODXEGCU.js +1 -0
- package/dist/chunk-MVM6OGAF.js +4 -0
- package/dist/chunk-N7ODX6PO.js +1 -0
- package/dist/chunk-NBTC5FNV.js +1 -0
- package/dist/chunk-NJ5UED3H.js +1 -0
- package/dist/chunk-NVKX36YN.js +3 -0
- package/dist/chunk-NVOTOQBA.js +1 -0
- package/dist/chunk-O7ZMHCMG.js +31 -0
- package/dist/chunk-OMXUK4M6.js +1 -0
- package/dist/chunk-PZS2KOU7.js +1 -0
- package/dist/chunk-RSKQRVPJ.js +1 -0
- package/dist/chunk-RTEATXTP.js +1 -0
- package/dist/chunk-RTWRHIKY.js +7 -0
- package/dist/chunk-RVO4HV3M.js +1 -0
- package/dist/chunk-SBILN45P.js +1 -0
- package/dist/chunk-SZ62CP55.js +1 -0
- package/dist/chunk-T3W5N3BP.js +2 -0
- package/dist/chunk-TDD7IOV2.js +1 -0
- package/dist/chunk-TIQ7DQ3M.js +1 -0
- package/dist/chunk-TU2AR6XO.js +1 -0
- package/dist/chunk-UF6US7VU.js +1 -0
- package/dist/chunk-V5QFOF4F.js +9 -0
- package/dist/chunk-V5U3E4BZ.js +1 -0
- package/dist/chunk-VAFAH6QL.js +1 -0
- package/dist/chunk-VMWY7KHH.js +1 -0
- package/dist/chunk-VUGRXM7R.js +1 -0
- package/dist/{chunk-XZXS2W24.js → chunk-VWEXKDWG.js} +10 -56
- package/dist/chunk-W2MV25SB.js +1 -0
- package/dist/chunk-WJ3H73G6.js +1 -0
- package/dist/chunk-WJUQBMTF.js +9 -0
- package/dist/chunk-WLVQJH4E.js +1 -0
- package/dist/chunk-WPJ2BND4.js +1 -0
- package/dist/chunk-WSCK4WNK.js +1 -0
- package/dist/chunk-Y65CSJFF.js +3 -0
- package/dist/chunk-ZL4MZMUK.js +34 -0
- package/dist/chunk-ZLLER3HP.js +1 -0
- package/dist/chunk-ZXF5NE54.js +1 -0
- package/dist/commands/antigravity/backfill.js +2 -136
- package/dist/commands/auth/create-key.js +1 -52
- package/dist/commands/auth/login.js +1 -85
- package/dist/commands/auth/logout.js +1 -29
- package/dist/commands/auth/revoke-key.js +1 -33
- package/dist/commands/auth/signup.js +1 -89
- package/dist/commands/auth/status.js +1 -42
- package/dist/commands/catalog/index.js +2 -52
- package/dist/commands/catalog/recommend.js +3 -43
- package/dist/commands/convert.js +1 -75
- package/dist/commands/converters.js +1 -54
- package/dist/commands/crons/list.js +1 -41
- package/dist/commands/crons/run.js +2 -76
- package/dist/commands/dashboard.js +1 -46
- package/dist/commands/diagnostics.js +1 -117
- package/dist/commands/eval-targets/create.js +1 -53
- package/dist/commands/eval-targets/list.js +1 -54
- package/dist/commands/evals/agent.js +3 -309
- package/dist/commands/evals/benchmark.js +6 -73
- package/dist/commands/evals/compare.js +13 -96
- package/dist/commands/evals/create.js +1 -67
- package/dist/commands/evals/optimize-description.js +25 -239
- package/dist/commands/evals/optimize.js +5 -211
- package/dist/commands/evals/run.js +3 -183
- package/dist/commands/gateway/ensure.js +1 -104
- package/dist/commands/hooks/emit-instructions.js +1 -25
- package/dist/commands/hooks/install.js +1 -442
- package/dist/commands/hooks/run.js +3 -81
- package/dist/commands/hooks/uninstall.js +2 -156
- package/dist/commands/import.js +1 -66
- package/dist/commands/instructions/create.js +1 -74
- package/dist/commands/instructions/delete.js +1 -55
- package/dist/commands/instructions/fork.js +1 -34
- package/dist/commands/instructions/get.js +1 -68
- package/dist/commands/instructions/list.js +1 -65
- package/dist/commands/instructions/promote.js +1 -42
- package/dist/commands/instructions/pull.js +1 -39
- package/dist/commands/instructions/upstream.js +1 -38
- package/dist/commands/instructions/versions.js +1 -53
- package/dist/commands/launcher.js +1 -40
- package/dist/commands/org/current.js +1 -77
- package/dist/commands/org/list.js +1 -52
- package/dist/commands/org/switch.js +1 -71
- package/dist/commands/packs/add-instruction.js +1 -37
- package/dist/commands/packs/apply.js +1 -39
- package/dist/commands/packs/create.js +1 -50
- package/dist/commands/packs/fork.js +1 -34
- package/dist/commands/packs/get.js +3 -56
- package/dist/commands/packs/list.js +1 -66
- package/dist/commands/packs/remove-instruction.js +1 -35
- package/dist/commands/proxy/env.js +3 -131
- package/dist/commands/proxy/logs.js +3 -85
- package/dist/commands/proxy/restart.js +1 -35
- package/dist/commands/proxy/setup.js +15 -454
- package/dist/commands/proxy/start.js +10 -333
- package/dist/commands/proxy/status.js +1 -78
- package/dist/commands/proxy/stop.js +1 -94
- package/dist/commands/research/backfill.js +1 -59
- package/dist/commands/research/tail-transcript.js +1 -70
- package/dist/commands/service/install.js +57 -781
- package/dist/commands/service/status.js +1 -180
- package/dist/commands/service/uninstall.js +1 -119
- package/dist/commands/sessions/analyze.js +3 -48
- package/dist/commands/sessions/end.js +2 -85
- package/dist/commands/sessions/import.js +1 -46
- package/dist/commands/sessions/list.js +1 -48
- package/dist/commands/sessions/start.js +3 -90
- package/dist/commands/setup.js +3 -150
- package/dist/commands/skills/export-approved.js +1 -46
- package/dist/commands/skills/install.js +4 -107
- package/dist/commands/skills/list.js +4 -65
- package/dist/commands/skills/publish.js +2 -98
- package/dist/commands/skills/search.js +3 -72
- package/dist/commands/skills/update.js +3 -55
- package/dist/commands/suggestions/accept.js +8 -84
- package/dist/commands/suggestions/dismiss.js +1 -45
- package/dist/commands/suggestions/list.js +1 -61
- package/dist/commands/suggestions/refresh.js +1 -27
- package/dist/cursor-T7AMCMKS.js +13 -0
- package/dist/dashboard/Dashboard.js +1 -243
- package/dist/dashboard/data.js +1 -15
- package/dist/dashboard/launcher/ActiveJobsList.js +1 -10
- package/dist/dashboard/launcher/LauncherOverlay.js +1 -16
- package/dist/dashboard/launcher/NewLaunchForm.js +1 -10
- package/dist/dashboard/launcher/api.js +1 -16
- package/dist/dashboard/launcher/tool-labels.js +1 -10
- package/dist/dashboard/launcher/types.js +0 -1
- package/dist/dashboard/launcher/useLaunchJobs.js +1 -11
- package/dist/dashboard/panels/friction.js +1 -10
- package/dist/dashboard/panels/insights.js +1 -10
- package/dist/dashboard/panels/instructions.js +1 -10
- package/dist/dashboard/panels/outcomes.js +1 -10
- package/dist/dashboard/panels/overview.js +1 -10
- package/dist/dashboard/panels/shared.js +1 -19
- package/dist/dashboard/types.js +1 -24
- package/dist/dist-FAVALJ5C.js +1 -0
- package/dist/index.js +1 -8
- package/dist/lib/active-org-refresh.js +1 -15
- package/dist/lib/active-org.js +1 -16
- package/dist/lib/agent-loop.js +1 -46
- package/dist/lib/antigravity-transcript.js +1 -22
- package/dist/lib/api-client.js +1 -23
- package/dist/lib/auth.js +1 -30
- package/dist/lib/capture-hosts.js +1 -8
- package/dist/lib/detect-languages.js +1 -8
- package/dist/lib/detect-tmux.js +1 -9
- package/dist/lib/diagnostics.js +1 -12
- package/dist/lib/editor-proxy-pins.js +1 -14
- package/dist/lib/ensure-api-key.js +1 -11
- package/dist/lib/eval-analyzer.js +1 -9
- package/dist/lib/eval-benchmark.js +1 -12
- package/dist/lib/eval-conversation-handler.js +1 -13
- package/dist/lib/eval-executor.js +1 -8
- package/dist/lib/eval-grader.js +1 -9
- package/dist/lib/eval-meta-judge.js +1 -9
- package/dist/lib/eval-trigger-tester.js +1 -11
- package/dist/lib/eval-worktree.js +1 -8
- package/dist/lib/gateway-entry.js +1 -61
- package/dist/lib/gateway-identity.js +1 -16
- package/dist/lib/gateway-lifecycle.js +1 -32
- package/dist/lib/gateway.js +1 -14
- package/dist/lib/handlers/cron-refresh-pricing.js +1 -0
- package/dist/lib/handlers/cron-refresh-skills.js +1 -8
- package/dist/lib/handlers/cron-suggest-instructions.js +1 -15
- package/dist/lib/handlers/process-announcement.js +1 -11
- package/dist/lib/handlers/process-changelog.js +1 -11
- package/dist/lib/handlers/process-conversation.js +1 -14
- package/dist/lib/handlers/process-eval.js +1 -15
- package/dist/lib/handlers/process-insights.js +1 -14
- package/dist/lib/handlers/process-launch.js +1 -16
- package/dist/lib/handlers/process-run-cleanup.js +1 -13
- package/dist/lib/handlers/process-send-message.js +1 -10
- package/dist/lib/handlers/process-session-goal.js +1 -11
- package/dist/lib/hooks-config.js +1 -81
- package/dist/lib/insights-prompts.js +1 -12
- package/dist/lib/instruction-snapshot.js +1 -8
- package/dist/lib/job-helpers.js +0 -1
- package/dist/lib/llm-client.js +1 -17
- package/dist/lib/manual-tasks-meta.js +1 -8
- package/dist/lib/manual-tasks.js +1 -79
- package/dist/lib/output.js +1 -12
- package/dist/lib/permanent-job-error.js +1 -10
- package/dist/lib/pid-identity.js +1 -14
- package/dist/lib/proxy-respawn.js +1 -12
- package/dist/lib/research-client.js +1 -12
- package/dist/lib/setup-steps.js +1 -33
- package/dist/lib/skills-loader.js +1 -8
- package/dist/lib/statusline-shim.js +1 -20
- package/dist/lib/telemetry.js +1 -16
- package/dist/lib/terminal-target-heartbeat.js +1 -15
- package/dist/lib/tmux.js +1 -16
- package/dist/lib/transcript-rate-limit-watcher.js +1 -22
- package/dist/lib/types.js +1 -8
- package/dist/lib/version-check.js +1 -12
- package/dist/lib/which.js +1 -8
- package/dist/lib/worktree.js +1 -17
- package/dist/opencode-QRJ3BH23.js +1 -0
- package/oclif.manifest.json +135 -135
- package/package.json +8 -7
- package/dist/base-command.js.map +0 -7
- package/dist/chunk-2HK7RGZB.js +0 -82
- package/dist/chunk-2HK7RGZB.js.map +0 -7
- package/dist/chunk-2ORJWTNZ.js +0 -307
- package/dist/chunk-2ORJWTNZ.js.map +0 -7
- package/dist/chunk-37LN5O7M.js +0 -59
- package/dist/chunk-37LN5O7M.js.map +0 -7
- package/dist/chunk-3S7223UR.js +0 -81
- package/dist/chunk-3S7223UR.js.map +0 -7
- package/dist/chunk-3TIMQ3O6.js +0 -96
- package/dist/chunk-3TIMQ3O6.js.map +0 -7
- package/dist/chunk-42GFSAJP.js +0 -32
- package/dist/chunk-42GFSAJP.js.map +0 -7
- package/dist/chunk-4BHDHHKL.js +0 -48
- package/dist/chunk-4BHDHHKL.js.map +0 -7
- package/dist/chunk-4D537GXE.js +0 -99
- package/dist/chunk-4D537GXE.js.map +0 -7
- package/dist/chunk-4LYCDS2N.js +0 -139
- package/dist/chunk-4LYCDS2N.js.map +0 -7
- package/dist/chunk-4SCZK7AL.js +0 -129
- package/dist/chunk-4SCZK7AL.js.map +0 -7
- package/dist/chunk-4XAWK6S2.js +0 -161
- package/dist/chunk-4XAWK6S2.js.map +0 -7
- package/dist/chunk-52WIYRZH.js +0 -73
- package/dist/chunk-52WIYRZH.js.map +0 -7
- package/dist/chunk-5BAOGNUH.js +0 -79
- package/dist/chunk-5BAOGNUH.js.map +0 -7
- package/dist/chunk-5EDMGK3W.js +0 -39
- package/dist/chunk-5EDMGK3W.js.map +0 -7
- package/dist/chunk-6NBS5XFS.js +0 -99
- package/dist/chunk-6NBS5XFS.js.map +0 -7
- package/dist/chunk-7DULPSFU.js +0 -299
- package/dist/chunk-7DULPSFU.js.map +0 -7
- package/dist/chunk-7LVVKQMZ.js +0 -98
- package/dist/chunk-7LVVKQMZ.js.map +0 -7
- package/dist/chunk-7NNFYWKK.js +0 -243
- package/dist/chunk-7NNFYWKK.js.map +0 -7
- package/dist/chunk-7NYKWN7U.js +0 -12
- package/dist/chunk-7NYKWN7U.js.map +0 -7
- package/dist/chunk-BO76WKJR.js +0 -42
- package/dist/chunk-BO76WKJR.js.map +0 -7
- package/dist/chunk-BRD5RUGM.js +0 -53
- package/dist/chunk-BRD5RUGM.js.map +0 -7
- package/dist/chunk-BT6Z6545.js +0 -43
- package/dist/chunk-BT6Z6545.js.map +0 -7
- package/dist/chunk-BZDKEQKU.js +0 -39
- package/dist/chunk-BZDKEQKU.js.map +0 -7
- package/dist/chunk-DGHWRQXL.js +0 -17
- package/dist/chunk-DGHWRQXL.js.map +0 -7
- package/dist/chunk-DNKSVWMD.js +0 -108
- package/dist/chunk-DNKSVWMD.js.map +0 -7
- package/dist/chunk-DQ3KELXD.js +0 -74
- package/dist/chunk-DQ3KELXD.js.map +0 -7
- package/dist/chunk-DUJSRBLP.js +0 -122
- package/dist/chunk-DUJSRBLP.js.map +0 -7
- package/dist/chunk-E3BIT53W.js +0 -154
- package/dist/chunk-E3BIT53W.js.map +0 -7
- package/dist/chunk-EARWG4EV.js +0 -22
- package/dist/chunk-EARWG4EV.js.map +0 -7
- package/dist/chunk-EI5BHWXA.js +0 -1662
- package/dist/chunk-EI5BHWXA.js.map +0 -7
- package/dist/chunk-EJ3YAFDP.js +0 -37
- package/dist/chunk-EJ3YAFDP.js.map +0 -7
- package/dist/chunk-EKJ2CABV.js +0 -76
- package/dist/chunk-EKJ2CABV.js.map +0 -7
- package/dist/chunk-EKP32DLN.js +0 -16
- package/dist/chunk-EKP32DLN.js.map +0 -7
- package/dist/chunk-EYPAAGN5.js +0 -51
- package/dist/chunk-EYPAAGN5.js.map +0 -7
- package/dist/chunk-F5N6CLJJ.js +0 -1995
- package/dist/chunk-F5N6CLJJ.js.map +0 -7
- package/dist/chunk-FZKLLNDS.js +0 -228
- package/dist/chunk-FZKLLNDS.js.map +0 -7
- package/dist/chunk-GIUBARWS.js +0 -99
- package/dist/chunk-GIUBARWS.js.map +0 -7
- package/dist/chunk-GQNJO2P2.js +0 -102
- package/dist/chunk-GQNJO2P2.js.map +0 -7
- package/dist/chunk-IJGF2ETG.js +0 -68
- package/dist/chunk-IJGF2ETG.js.map +0 -7
- package/dist/chunk-ILYDELUE.js +0 -46
- package/dist/chunk-ILYDELUE.js.map +0 -7
- package/dist/chunk-J6QFW4LD.js +0 -55
- package/dist/chunk-J6QFW4LD.js.map +0 -7
- package/dist/chunk-J7N3DLH6.js +0 -117
- package/dist/chunk-J7N3DLH6.js.map +0 -7
- package/dist/chunk-JFDWKLQC.js +0 -23
- package/dist/chunk-JFDWKLQC.js.map +0 -7
- package/dist/chunk-JULOLTZS.js +0 -61
- package/dist/chunk-JULOLTZS.js.map +0 -7
- package/dist/chunk-KJKBDQ4D.js +0 -220
- package/dist/chunk-KJKBDQ4D.js.map +0 -7
- package/dist/chunk-KRBQLMOP.js +0 -41
- package/dist/chunk-KRBQLMOP.js.map +0 -7
- package/dist/chunk-LXKPNATC.js +0 -624
- package/dist/chunk-LXKPNATC.js.map +0 -7
- package/dist/chunk-NSBPE2FW.js +0 -17
- package/dist/chunk-NSBPE2FW.js.map +0 -7
- package/dist/chunk-OK3I555A.js +0 -243
- package/dist/chunk-OK3I555A.js.map +0 -7
- package/dist/chunk-OKWCKCPE.js +0 -414
- package/dist/chunk-OKWCKCPE.js.map +0 -7
- package/dist/chunk-OO7JDFS4.js +0 -157
- package/dist/chunk-OO7JDFS4.js.map +0 -7
- package/dist/chunk-OQBBVTDG.js.map +0 -7
- package/dist/chunk-OQSQC7VB.js +0 -77
- package/dist/chunk-OQSQC7VB.js.map +0 -7
- package/dist/chunk-PED7L5GX.js +0 -92
- package/dist/chunk-PED7L5GX.js.map +0 -7
- package/dist/chunk-PMI56ED5.js +0 -167
- package/dist/chunk-PMI56ED5.js.map +0 -7
- package/dist/chunk-QJQS6TUN.js +0 -44
- package/dist/chunk-QJQS6TUN.js.map +0 -7
- package/dist/chunk-QN34TGD3.js +0 -83
- package/dist/chunk-QN34TGD3.js.map +0 -7
- package/dist/chunk-QSN77T7C.js +0 -250
- package/dist/chunk-QSN77T7C.js.map +0 -7
- package/dist/chunk-R56PH7YE.js +0 -78
- package/dist/chunk-R56PH7YE.js.map +0 -7
- package/dist/chunk-RH7NHVSK.js +0 -16
- package/dist/chunk-RH7NHVSK.js.map +0 -7
- package/dist/chunk-RMTT4KDY.js +0 -191
- package/dist/chunk-RMTT4KDY.js.map +0 -7
- package/dist/chunk-RQ2TMLKG.js +0 -142
- package/dist/chunk-RQ2TMLKG.js.map +0 -7
- package/dist/chunk-SO3T35U7.js +0 -80
- package/dist/chunk-SO3T35U7.js.map +0 -7
- package/dist/chunk-UKMLICWS.js +0 -51
- package/dist/chunk-UKMLICWS.js.map +0 -7
- package/dist/chunk-W2YERO7E.js +0 -170
- package/dist/chunk-W2YERO7E.js.map +0 -7
- package/dist/chunk-W53GKIZQ.js +0 -50
- package/dist/chunk-W53GKIZQ.js.map +0 -7
- package/dist/chunk-WA4MWYRW.js +0 -254
- package/dist/chunk-WA4MWYRW.js.map +0 -7
- package/dist/chunk-XC6M4CSW.js +0 -44
- package/dist/chunk-XC6M4CSW.js.map +0 -7
- package/dist/chunk-XK42ZBDE.js +0 -23
- package/dist/chunk-XK42ZBDE.js.map +0 -7
- package/dist/chunk-XUV6DDBF.js +0 -124
- package/dist/chunk-XUV6DDBF.js.map +0 -7
- package/dist/chunk-XZXS2W24.js.map +0 -7
- package/dist/chunk-Y3WD5CSW.js +0 -49
- package/dist/chunk-Y3WD5CSW.js.map +0 -7
- package/dist/chunk-Y4BJXXYV.js +0 -148
- package/dist/chunk-Y4BJXXYV.js.map +0 -7
- package/dist/chunk-YNIH3KMU.js +0 -121
- package/dist/chunk-YNIH3KMU.js.map +0 -7
- package/dist/chunk-YOBA3NAM.js +0 -55
- package/dist/chunk-YOBA3NAM.js.map +0 -7
- package/dist/chunk-ZUJBM6HE.js +0 -125
- package/dist/chunk-ZUJBM6HE.js.map +0 -7
- package/dist/commands/antigravity/backfill.js.map +0 -7
- package/dist/commands/auth/create-key.js.map +0 -7
- package/dist/commands/auth/login.js.map +0 -7
- package/dist/commands/auth/logout.js.map +0 -7
- package/dist/commands/auth/revoke-key.js.map +0 -7
- package/dist/commands/auth/signup.js.map +0 -7
- package/dist/commands/auth/status.js.map +0 -7
- package/dist/commands/catalog/index.js.map +0 -7
- package/dist/commands/catalog/recommend.js.map +0 -7
- package/dist/commands/convert.js.map +0 -7
- package/dist/commands/converters.js.map +0 -7
- package/dist/commands/crons/list.js.map +0 -7
- package/dist/commands/crons/run.js.map +0 -7
- package/dist/commands/dashboard.js.map +0 -7
- package/dist/commands/diagnostics.js.map +0 -7
- package/dist/commands/eval-targets/create.js.map +0 -7
- package/dist/commands/eval-targets/list.js.map +0 -7
- package/dist/commands/evals/agent.js.map +0 -7
- package/dist/commands/evals/benchmark.js.map +0 -7
- package/dist/commands/evals/compare.js.map +0 -7
- package/dist/commands/evals/create.js.map +0 -7
- package/dist/commands/evals/optimize-description.js.map +0 -7
- package/dist/commands/evals/optimize.js.map +0 -7
- package/dist/commands/evals/run.js.map +0 -7
- package/dist/commands/gateway/ensure.js.map +0 -7
- package/dist/commands/hooks/emit-instructions.js.map +0 -7
- package/dist/commands/hooks/install.js.map +0 -7
- package/dist/commands/hooks/run.js.map +0 -7
- package/dist/commands/hooks/uninstall.js.map +0 -7
- package/dist/commands/import.js.map +0 -7
- package/dist/commands/instructions/create.js.map +0 -7
- package/dist/commands/instructions/delete.js.map +0 -7
- package/dist/commands/instructions/fork.js.map +0 -7
- package/dist/commands/instructions/get.js.map +0 -7
- package/dist/commands/instructions/list.js.map +0 -7
- package/dist/commands/instructions/promote.js.map +0 -7
- package/dist/commands/instructions/pull.js.map +0 -7
- package/dist/commands/instructions/upstream.js.map +0 -7
- package/dist/commands/instructions/versions.js.map +0 -7
- package/dist/commands/launcher.js.map +0 -7
- package/dist/commands/org/current.js.map +0 -7
- package/dist/commands/org/list.js.map +0 -7
- package/dist/commands/org/switch.js.map +0 -7
- package/dist/commands/packs/add-instruction.js.map +0 -7
- package/dist/commands/packs/apply.js.map +0 -7
- package/dist/commands/packs/create.js.map +0 -7
- package/dist/commands/packs/fork.js.map +0 -7
- package/dist/commands/packs/get.js.map +0 -7
- package/dist/commands/packs/list.js.map +0 -7
- package/dist/commands/packs/remove-instruction.js.map +0 -7
- package/dist/commands/proxy/env.js.map +0 -7
- package/dist/commands/proxy/logs.js.map +0 -7
- package/dist/commands/proxy/restart.js.map +0 -7
- package/dist/commands/proxy/setup.js.map +0 -7
- package/dist/commands/proxy/start.js.map +0 -7
- package/dist/commands/proxy/status.js.map +0 -7
- package/dist/commands/proxy/stop.js.map +0 -7
- package/dist/commands/research/backfill.js.map +0 -7
- package/dist/commands/research/tail-transcript.js.map +0 -7
- package/dist/commands/service/install.js.map +0 -7
- package/dist/commands/service/status.js.map +0 -7
- package/dist/commands/service/uninstall.js.map +0 -7
- package/dist/commands/sessions/analyze.js.map +0 -7
- package/dist/commands/sessions/end.js.map +0 -7
- package/dist/commands/sessions/import.js.map +0 -7
- package/dist/commands/sessions/list.js.map +0 -7
- package/dist/commands/sessions/start.js.map +0 -7
- package/dist/commands/setup.js.map +0 -7
- package/dist/commands/skills/export-approved.js.map +0 -7
- package/dist/commands/skills/install.js.map +0 -7
- package/dist/commands/skills/list.js.map +0 -7
- package/dist/commands/skills/publish.js.map +0 -7
- package/dist/commands/skills/search.js.map +0 -7
- package/dist/commands/skills/update.js.map +0 -7
- package/dist/commands/suggestions/accept.js.map +0 -7
- package/dist/commands/suggestions/dismiss.js.map +0 -7
- package/dist/commands/suggestions/list.js.map +0 -7
- package/dist/commands/suggestions/refresh.js.map +0 -7
- package/dist/cursor-BGQJ4CWI.js +0 -134
- package/dist/cursor-BGQJ4CWI.js.map +0 -7
- package/dist/dashboard/Dashboard.js.map +0 -7
- package/dist/dashboard/data.js.map +0 -7
- package/dist/dashboard/launcher/ActiveJobsList.js.map +0 -7
- package/dist/dashboard/launcher/LauncherOverlay.js.map +0 -7
- package/dist/dashboard/launcher/NewLaunchForm.js.map +0 -7
- package/dist/dashboard/launcher/api.js.map +0 -7
- package/dist/dashboard/launcher/tool-labels.js.map +0 -7
- package/dist/dashboard/launcher/types.js.map +0 -7
- package/dist/dashboard/launcher/useLaunchJobs.js.map +0 -7
- package/dist/dashboard/panels/friction.js.map +0 -7
- package/dist/dashboard/panels/insights.js.map +0 -7
- package/dist/dashboard/panels/instructions.js.map +0 -7
- package/dist/dashboard/panels/outcomes.js.map +0 -7
- package/dist/dashboard/panels/overview.js.map +0 -7
- package/dist/dashboard/panels/shared.js.map +0 -7
- package/dist/dashboard/types.js.map +0 -7
- package/dist/dist-UNYP5PJR.js +0 -56
- package/dist/dist-UNYP5PJR.js.map +0 -7
- package/dist/index.js.map +0 -7
- package/dist/lib/active-org-refresh.js.map +0 -7
- package/dist/lib/active-org.js.map +0 -7
- package/dist/lib/agent-loop.js.map +0 -7
- package/dist/lib/antigravity-transcript.js.map +0 -7
- package/dist/lib/api-client.js.map +0 -7
- package/dist/lib/auth.js.map +0 -7
- package/dist/lib/capture-hosts.js.map +0 -7
- package/dist/lib/detect-languages.js.map +0 -7
- package/dist/lib/detect-tmux.js.map +0 -7
- package/dist/lib/diagnostics.js.map +0 -7
- package/dist/lib/editor-proxy-pins.js.map +0 -7
- package/dist/lib/ensure-api-key.js.map +0 -7
- package/dist/lib/eval-analyzer.js.map +0 -7
- package/dist/lib/eval-benchmark.js.map +0 -7
- package/dist/lib/eval-conversation-handler.js.map +0 -7
- package/dist/lib/eval-executor.js.map +0 -7
- package/dist/lib/eval-grader.js.map +0 -7
- package/dist/lib/eval-meta-judge.js.map +0 -7
- package/dist/lib/eval-trigger-tester.js.map +0 -7
- package/dist/lib/eval-worktree.js.map +0 -7
- package/dist/lib/gateway-entry.js.map +0 -7
- package/dist/lib/gateway-identity.js.map +0 -7
- package/dist/lib/gateway-lifecycle.js.map +0 -7
- package/dist/lib/gateway.js.map +0 -7
- package/dist/lib/handlers/cron-refresh-skills.js.map +0 -7
- package/dist/lib/handlers/cron-suggest-instructions.js.map +0 -7
- package/dist/lib/handlers/process-announcement.js.map +0 -7
- package/dist/lib/handlers/process-changelog.js.map +0 -7
- package/dist/lib/handlers/process-conversation.js.map +0 -7
- package/dist/lib/handlers/process-eval.js.map +0 -7
- package/dist/lib/handlers/process-insights.js.map +0 -7
- package/dist/lib/handlers/process-launch.js.map +0 -7
- package/dist/lib/handlers/process-run-cleanup.js.map +0 -7
- package/dist/lib/handlers/process-send-message.js.map +0 -7
- package/dist/lib/handlers/process-session-goal.js.map +0 -7
- package/dist/lib/hooks-config.js.map +0 -7
- package/dist/lib/insights-prompts.js.map +0 -7
- package/dist/lib/instruction-snapshot.js.map +0 -7
- package/dist/lib/job-helpers.js.map +0 -7
- package/dist/lib/llm-client.js.map +0 -7
- package/dist/lib/manual-tasks-meta.js.map +0 -7
- package/dist/lib/manual-tasks.js.map +0 -7
- package/dist/lib/output.js.map +0 -7
- package/dist/lib/permanent-job-error.js.map +0 -7
- package/dist/lib/pid-identity.js.map +0 -7
- package/dist/lib/proxy-respawn.js.map +0 -7
- package/dist/lib/research-client.js.map +0 -7
- package/dist/lib/setup-steps.js.map +0 -7
- package/dist/lib/skills-loader.js.map +0 -7
- package/dist/lib/statusline-shim.js.map +0 -7
- package/dist/lib/telemetry.js.map +0 -7
- package/dist/lib/terminal-target-heartbeat.js.map +0 -7
- package/dist/lib/tmux.js.map +0 -7
- package/dist/lib/transcript-rate-limit-watcher.js.map +0 -7
- package/dist/lib/types.js.map +0 -7
- package/dist/lib/version-check.js.map +0 -7
- package/dist/lib/which.js.map +0 -7
- package/dist/lib/worktree.js.map +0 -7
- package/dist/opencode-IQ7X5YMJ.js +0 -190
- package/dist/opencode-IQ7X5YMJ.js.map +0 -7
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/lib/handlers/process-eval.ts"],
|
|
4
|
-
"sourcesContent": ["import type { JobHelpers } from '../job-helpers.js';\nimport { apiGet, apiPost, apiPatch } from '../api-client.js';\nimport { executeEval } from '../eval-executor.js';\nimport { gradeEvalOutput, type GradingResult } from '../eval-grader.js';\nimport { judgeEvalQuality, type MetaJudgement } from '../eval-meta-judge.js';\nimport { createEvalWorktree } from '../eval-worktree.js';\nimport { PermanentJobError } from '../permanent-job-error.js';\n\ninterface EvalTarget {\n id: string;\n name: string;\n type: string;\n content: string;\n version: number;\n}\n\ninterface Eval {\n id: string;\n name: string;\n prompt: string;\n expectedOutput: string;\n expectations: string[];\n}\n\ninterface EvalPayload {\n mirrorId: string;\n evalTargetId: string;\n config: {\n parallel?: number;\n runsPerEval?: number;\n iteration?: number;\n skipBaseline?: boolean;\n skipGrading?: boolean;\n model?: string;\n graderModel?: string;\n timeout?: number;\n };\n}\n\n/**\n * Graphile-shaped handler for the `process_eval` task.\n *\n * Lifted verbatim from the legacy `eval-worker.ts:processJob` body, with the\n * queue plumbing stripped out:\n * - no claim \u2014 Graphile already claimed the job before invoking us\n * - no /complete POST \u2014 we return the result object (or throw)\n * - no `processing` flag \u2014 that lived in the polling loop's closure\n * - no conversation branch \u2014 split into its own handler (Task 14)\n *\n * Mid-job progress patches still hit the existing\n * `PATCH /api/eval-jobs/:id/progress` endpoint, just keyed by the mirror row's\n * id instead of the legacy queue id.\n */\nexport async function processEval(\n payload: EvalPayload,\n helpers: JobHelpers,\n): Promise<Record<string, unknown>> {\n const { mirrorId, evalTargetId, config } = payload;\n const log = (msg: string) => helpers.logger.info(msg);\n\n // Fail-fast on retry. Each eval_run is INSERT'd as it completes, but\n // there's no idempotency key tying a row to a specific job \u2014 re-running\n // the whole batch would duplicate every previously-completed row in\n // eval_runs. Until proper resume-from-progress-checkpoint lands, surface\n // the failure to the user instead of silently doubling-up rows. See\n // docs/audits/2026-05-07-worker-audit.md \"Handlers not idempotent\".\n if (helpers.job.attempts > 1) {\n throw new PermanentJobError(\n `process_eval is not safe to retry (attempt ${helpers.job.attempts}). Re-trigger the eval run from the UI.`,\n );\n }\n\n const target = await apiGet<EvalTarget>(`/api/eval-targets/${evalTargetId}`);\n const evalCases = await apiGet<Eval[]>(`/api/eval-targets/${evalTargetId}/evals`);\n\n if (evalCases.length === 0) {\n // No retries \u2014 eval cases don't materialize on their own; the user has\n // to add one via the UI/CLI. Skip Graphile's retry loop.\n throw new PermanentJobError('No evals defined for target');\n }\n\n const runsPerEval = config.runsPerEval ?? 1;\n const timeout = config.timeout ?? 120_000;\n const iteration = config.iteration ?? 1;\n\n const configurations: Array<{ name: string; content?: string }> = [\n { name: 'with_target', content: target.content },\n ];\n if (!config.skipBaseline) {\n configurations.push({ name: 'without_target' });\n }\n\n // Build work queue\n const workQueue: Array<{ eval_: Eval; configuration: string; targetContent?: string; runNumber: number }> = [];\n for (const eval_ of evalCases) {\n for (const cfg of configurations) {\n for (let run = 1; run <= runsPerEval; run++) {\n workQueue.push({ eval_: eval_, configuration: cfg.name, targetContent: cfg.content, runNumber: run });\n }\n }\n }\n\n const total = workQueue.length;\n let completed = 0;\n const concurrency = Math.min(config.parallel ?? 1, 4); // cap at 4 parallel\n\n await apiPatch(`/api/eval-jobs/${mirrorId}/progress`, {\n status: 'running',\n progress: { total, completed: 0, current: null, message: `Starting ${total} eval runs (concurrency: ${concurrency})...` },\n });\n\n const results: Record<string, unknown>[] = [];\n\n // Process work items \u2014 sequential if concurrency=1, parallel otherwise\n async function processItem(item: typeof workQueue[0]): Promise<Record<string, unknown>> {\n const label = `${item.configuration} \u00B7 ${item.eval_.name} \u00B7 run#${item.runNumber}`;\n log(`[${completed + 1}/${total}] ${label}`);\n\n // Create isolated worktree for parallel execution\n const worktree = concurrency > 1 ? createEvalWorktree() : null;\n\n try {\n const execResult = await executeEval({\n prompt: item.eval_.prompt,\n targetContent: item.targetContent,\n workDir: worktree?.workDir,\n timeout,\n model: config.model,\n });\n\n let grading: Record<string, unknown> = {};\n if (!config.skipGrading && item.eval_.expectations.length > 0 && !execResult.error) {\n const gradingResult = await gradeEvalOutput({\n prompt: item.eval_.prompt,\n output: execResult.output,\n expectations: item.eval_.expectations,\n model: config.graderModel ?? config.model,\n timeout,\n });\n grading = gradingResult as unknown as Record<string, unknown>;\n }\n\n return {\n evalId: item.eval_.id,\n evalTargetId: target.id,\n evalTargetVersion: target.version,\n configuration: item.configuration,\n runNumber: item.runNumber,\n iteration,\n status: execResult.error ? 'failed' : 'completed',\n outputs: execResult.error ? { error: execResult.error } : { transcript: execResult.output },\n timing: { duration_ms: execResult.durationMs, total_tokens: execResult.totalTokens },\n grading,\n worktree: worktree?.isWorktree ? true : undefined,\n };\n } finally {\n worktree?.cleanup();\n }\n }\n\n if (concurrency <= 1) {\n // Sequential execution (existing behavior)\n for (const item of workQueue) {\n const label = `${item.configuration} \u00B7 ${item.eval_.name} \u00B7 run#${item.runNumber}`;\n await apiPatch(`/api/eval-jobs/${mirrorId}/progress`, {\n status: 'running',\n progress: { total, completed, current: label, message: `Executing ${label}...` },\n });\n\n const runResult = await processItem(item);\n await apiPost('/api/eval-runs', runResult);\n results.push(runResult);\n completed++;\n\n await apiPatch(`/api/eval-jobs/${mirrorId}/progress`, {\n status: 'running',\n progress: { total, completed, current: label, message: `Completed ${label}` },\n });\n }\n } else {\n // Parallel execution with worktree isolation\n log(`Running ${total} evals with concurrency=${concurrency} (worktree isolation)`);\n for (let i = 0; i < workQueue.length; i += concurrency) {\n const batch = workQueue.slice(i, i + concurrency);\n const batchLabel = `batch ${Math.floor(i / concurrency) + 1}/${Math.ceil(workQueue.length / concurrency)}`;\n\n await apiPatch(`/api/eval-jobs/${mirrorId}/progress`, {\n status: 'running',\n progress: { total, completed, current: batchLabel, message: `Executing ${batchLabel} (${batch.length} parallel)...` },\n });\n\n const batchResults = await Promise.all(batch.map(processItem));\n\n for (const runResult of batchResults) {\n await apiPost('/api/eval-runs', runResult);\n results.push(runResult);\n completed++;\n }\n\n await apiPatch(`/api/eval-jobs/${mirrorId}/progress`, {\n status: 'running',\n progress: { total, completed, current: batchLabel, message: `Completed ${batchLabel}` },\n });\n }\n }\n\n const summary = buildSummary(results);\n\n // Meta-judge: assess eval quality if we have grading results\n let metaJudgement: MetaJudgement | undefined;\n if (!config.skipGrading && results.some(r => r.grading && Object.keys(r.grading as object).length > 0)) {\n try {\n log(`Running meta-judge for job ${mirrorId}...`);\n const evalInputs = evalCases.map(e => {\n const matchingResults = results.filter(r => r.evalId === e.id && r.configuration === 'with_target');\n const firstResult = matchingResults[0];\n return {\n evalName: e.name,\n prompt: e.prompt,\n expectations: e.expectations,\n grading: firstResult?.grading ? firstResult.grading as unknown as GradingResult : null,\n output: (firstResult?.outputs as Record<string, string>)?.transcript?.slice(0, 500),\n };\n });\n metaJudgement = await judgeEvalQuality({\n targetName: target.name,\n evalResults: evalInputs,\n model: config.graderModel ?? config.model,\n timeout: 60000,\n });\n log(`Meta-judge: quality=${metaJudgement.quality_score}/5, issues=${metaJudgement.issues.length}`);\n } catch (err) {\n log(`Meta-judge failed (non-fatal): ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n const result = metaJudgement\n ? { ...summary, meta_judgement: metaJudgement }\n : summary;\n log(`Job ${mirrorId} completed: ${completed}/${total} runs`);\n\n // Graphile discards task return values, so persist the summary onto the\n // mirror row here. Best-effort: a failure to write the result must not\n // mark the job as failed (it succeeded; we just lose the summary blob).\n await apiPatch(`/api/eval-jobs/${mirrorId}/state`, { result }).catch((err: unknown) => {\n log(`result persist failed: ${err instanceof Error ? err.message : String(err)}`);\n });\n\n return result;\n}\n\nfunction buildSummary(results: Record<string, unknown>[]): Record<string, unknown> {\n const completed = results.filter((r) => r.status === 'completed');\n const failed = results.filter((r) => r.status === 'failed');\n\n const gradedRuns = completed.filter((r) => {\n const grading = r.grading as Record<string, any>;\n return grading && Object.keys(grading).length > 0;\n });\n\n const avgPassRate = gradedRuns.length > 0\n ? gradedRuns.reduce((sum, r) => sum + ((r.grading as any)?.summary?.pass_rate ?? 0), 0) / gradedRuns.length\n : null;\n\n return {\n total: results.length,\n completed: completed.length,\n failed: failed.length,\n avgPassRate,\n };\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
package/dist/chunk-RQ2TMLKG.js
DELETED
|
@@ -1,142 +0,0 @@
|
|
|
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
|
|
@@ -1,7 +0,0 @@
|
|
|
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
|
-
}
|
package/dist/chunk-SO3T35U7.js
DELETED
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
// src/lib/instruction-snapshot.ts
|
|
2
|
-
import { createHash } from "node:crypto";
|
|
3
|
-
import { readdirSync, readFileSync } from "node:fs";
|
|
4
|
-
import { join, relative } from "node:path";
|
|
5
|
-
var SKIP_DIRS = /* @__PURE__ */ new Set([
|
|
6
|
-
"node_modules",
|
|
7
|
-
".git",
|
|
8
|
-
"dist",
|
|
9
|
-
"build",
|
|
10
|
-
"out",
|
|
11
|
-
".next",
|
|
12
|
-
"coverage",
|
|
13
|
-
".turbo",
|
|
14
|
-
"vendor",
|
|
15
|
-
".venv"
|
|
16
|
-
]);
|
|
17
|
-
var MAX_FILES = 50;
|
|
18
|
-
var MAX_DEPTH = 8;
|
|
19
|
-
var sha256 = (s) => createHash("sha256").update(s).digest("hex");
|
|
20
|
-
function findClaudeMdFiles(root) {
|
|
21
|
-
const found = [];
|
|
22
|
-
const walk = (dir, depth) => {
|
|
23
|
-
if (found.length >= MAX_FILES || depth > MAX_DEPTH) return;
|
|
24
|
-
let entries;
|
|
25
|
-
try {
|
|
26
|
-
entries = readdirSync(dir, { withFileTypes: true });
|
|
27
|
-
} catch {
|
|
28
|
-
return;
|
|
29
|
-
}
|
|
30
|
-
for (const entry of entries) {
|
|
31
|
-
if (found.length >= MAX_FILES) return;
|
|
32
|
-
if (entry.isDirectory()) {
|
|
33
|
-
if (SKIP_DIRS.has(entry.name) || entry.name.startsWith(".")) continue;
|
|
34
|
-
walk(join(dir, entry.name), depth + 1);
|
|
35
|
-
} else if (entry.isFile() && entry.name === "CLAUDE.md") {
|
|
36
|
-
found.push(join(dir, entry.name));
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
};
|
|
40
|
-
walk(root, 0);
|
|
41
|
-
return found.sort();
|
|
42
|
-
}
|
|
43
|
-
function buildInstructionSnapshot(projectDir) {
|
|
44
|
-
const context_items = [];
|
|
45
|
-
const injected_instructions = [];
|
|
46
|
-
for (const filePath of findClaudeMdFiles(projectDir)) {
|
|
47
|
-
let body;
|
|
48
|
-
try {
|
|
49
|
-
body = readFileSync(filePath, "utf-8");
|
|
50
|
-
} catch {
|
|
51
|
-
continue;
|
|
52
|
-
}
|
|
53
|
-
if (!body.trim()) continue;
|
|
54
|
-
const instruction_index = injected_instructions.length;
|
|
55
|
-
injected_instructions.push(body);
|
|
56
|
-
context_items.push({
|
|
57
|
-
type: "claude_md",
|
|
58
|
-
name: relative(projectDir, filePath) || "CLAUDE.md",
|
|
59
|
-
content_hash: sha256(body),
|
|
60
|
-
char_count: body.length,
|
|
61
|
-
estimated_tokens: Math.ceil(body.length / 4),
|
|
62
|
-
instruction_index
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
if (context_items.length === 0) return null;
|
|
66
|
-
return {
|
|
67
|
-
provider: "claude_code",
|
|
68
|
-
model: "unknown",
|
|
69
|
-
system_prompt: "",
|
|
70
|
-
system_hash: sha256(""),
|
|
71
|
-
injected_instructions,
|
|
72
|
-
context_items,
|
|
73
|
-
metadata: { source: "hook_instruction_snapshot" }
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
export {
|
|
78
|
-
buildInstructionSnapshot
|
|
79
|
-
};
|
|
80
|
-
//# sourceMappingURL=chunk-SO3T35U7.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/lib/instruction-snapshot.ts"],
|
|
4
|
-
"sourcesContent": ["import { createHash } from 'node:crypto';\nimport { readdirSync, readFileSync } from 'node:fs';\nimport { join, relative } from 'node:path';\n\n/**\n * A synthetic instruction snapshot for the hooks-first (zero-proxy) capture path.\n *\n * The proxy captures the *rendered* system prompt and classifies it into\n * `context_items` that `link-instructions` matches on. Hooks-only sessions never\n * hit the proxy, so this reconstructs an equivalent snapshot from the on-disk\n * instruction files (CLAUDE.md) \u2014 enough for `link-instructions` to auto-create\n * and link `claude_md` instructions.\n *\n * LIMITATION (by design): this hashes the RAW file body, whereas the proxy hashes\n * the rendered/normalized system-prompt text, so hook-sourced and proxy-sourced\n * instructions live in different content_hash namespaces and will NOT merge. It is\n * also STATIC \u2014 it cannot see runtime-injected context (skills invoked mid-session,\n * @-imports resolved on demand, subagent prompts). It is a partial, best-effort\n * bridge for zero-proxy users, not proxy parity.\n */\nexport interface InstructionContextItem {\n type: 'claude_md';\n name: string;\n content_hash: string;\n char_count: number;\n estimated_tokens: number;\n instruction_index: number;\n}\n\nexport interface InstructionSnapshot {\n provider: string;\n model: string;\n system_prompt: string;\n system_hash: string;\n injected_instructions: string[];\n context_items: InstructionContextItem[];\n metadata: Record<string, unknown>;\n}\n\nconst SKIP_DIRS = new Set([\n 'node_modules', '.git', 'dist', 'build', 'out', '.next', 'coverage', '.turbo', 'vendor', '.venv',\n]);\nconst MAX_FILES = 50;\nconst MAX_DEPTH = 8;\n\nconst sha256 = (s: string) => createHash('sha256').update(s).digest('hex');\n\n/** Recursively locate CLAUDE.md files, skipping heavy/hidden dirs. */\nfunction findClaudeMdFiles(root: string): string[] {\n const found: string[] = [];\n const walk = (dir: string, depth: number): void => {\n if (found.length >= MAX_FILES || depth > MAX_DEPTH) return;\n let entries;\n try {\n entries = readdirSync(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const entry of entries) {\n if (found.length >= MAX_FILES) return;\n if (entry.isDirectory()) {\n if (SKIP_DIRS.has(entry.name) || entry.name.startsWith('.')) continue;\n walk(join(dir, entry.name), depth + 1);\n } else if (entry.isFile() && entry.name === 'CLAUDE.md') {\n found.push(join(dir, entry.name));\n }\n }\n };\n walk(root, 0);\n return found.sort();\n}\n\n/**\n * Build a synthetic context snapshot from a project's on-disk instruction files,\n * ready to `POST /api/sessions/:id/context-snapshots`. Returns null when the\n * project has no non-empty instruction files (nothing to link).\n */\nexport function buildInstructionSnapshot(projectDir: string): InstructionSnapshot | null {\n const context_items: InstructionContextItem[] = [];\n const injected_instructions: string[] = [];\n\n for (const filePath of findClaudeMdFiles(projectDir)) {\n let body: string;\n try {\n body = readFileSync(filePath, 'utf-8');\n } catch {\n continue;\n }\n if (!body.trim()) continue;\n const instruction_index = injected_instructions.length;\n injected_instructions.push(body);\n context_items.push({\n type: 'claude_md',\n name: relative(projectDir, filePath) || 'CLAUDE.md',\n content_hash: sha256(body),\n char_count: body.length,\n estimated_tokens: Math.ceil(body.length / 4),\n instruction_index,\n });\n }\n\n if (context_items.length === 0) return null;\n\n return {\n provider: 'claude_code',\n model: 'unknown',\n system_prompt: '',\n system_hash: sha256(''),\n injected_instructions,\n context_items,\n metadata: { source: 'hook_instruction_snapshot' },\n };\n}\n"],
|
|
5
|
-
"mappings": ";AAAA,SAAS,kBAAkB;AAC3B,SAAS,aAAa,oBAAoB;AAC1C,SAAS,MAAM,gBAAgB;AAqC/B,IAAM,YAAY,oBAAI,IAAI;AAAA,EACxB;AAAA,EAAgB;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAS;AAAA,EAAO;AAAA,EAAS;AAAA,EAAY;AAAA,EAAU;AAAA,EAAU;AAC3F,CAAC;AACD,IAAM,YAAY;AAClB,IAAM,YAAY;AAElB,IAAM,SAAS,CAAC,MAAc,WAAW,QAAQ,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK;AAGzE,SAAS,kBAAkB,MAAwB;AACjD,QAAM,QAAkB,CAAC;AACzB,QAAM,OAAO,CAAC,KAAa,UAAwB;AACjD,QAAI,MAAM,UAAU,aAAa,QAAQ,UAAW;AACpD,QAAI;AACJ,QAAI;AACF,gBAAU,YAAY,KAAK,EAAE,eAAe,KAAK,CAAC;AAAA,IACpD,QAAQ;AACN;AAAA,IACF;AACA,eAAW,SAAS,SAAS;AAC3B,UAAI,MAAM,UAAU,UAAW;AAC/B,UAAI,MAAM,YAAY,GAAG;AACvB,YAAI,UAAU,IAAI,MAAM,IAAI,KAAK,MAAM,KAAK,WAAW,GAAG,EAAG;AAC7D,aAAK,KAAK,KAAK,MAAM,IAAI,GAAG,QAAQ,CAAC;AAAA,MACvC,WAAW,MAAM,OAAO,KAAK,MAAM,SAAS,aAAa;AACvD,cAAM,KAAK,KAAK,KAAK,MAAM,IAAI,CAAC;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AACA,OAAK,MAAM,CAAC;AACZ,SAAO,MAAM,KAAK;AACpB;AAOO,SAAS,yBAAyB,YAAgD;AACvF,QAAM,gBAA0C,CAAC;AACjD,QAAM,wBAAkC,CAAC;AAEzC,aAAW,YAAY,kBAAkB,UAAU,GAAG;AACpD,QAAI;AACJ,QAAI;AACF,aAAO,aAAa,UAAU,OAAO;AAAA,IACvC,QAAQ;AACN;AAAA,IACF;AACA,QAAI,CAAC,KAAK,KAAK,EAAG;AAClB,UAAM,oBAAoB,sBAAsB;AAChD,0BAAsB,KAAK,IAAI;AAC/B,kBAAc,KAAK;AAAA,MACjB,MAAM;AAAA,MACN,MAAM,SAAS,YAAY,QAAQ,KAAK;AAAA,MACxC,cAAc,OAAO,IAAI;AAAA,MACzB,YAAY,KAAK;AAAA,MACjB,kBAAkB,KAAK,KAAK,KAAK,SAAS,CAAC;AAAA,MAC3C;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,cAAc,WAAW,EAAG,QAAO;AAEvC,SAAO;AAAA,IACL,UAAU;AAAA,IACV,OAAO;AAAA,IACP,eAAe;AAAA,IACf,aAAa,OAAO,EAAE;AAAA,IACtB;AAAA,IACA;AAAA,IACA,UAAU,EAAE,QAAQ,4BAA4B;AAAA,EAClD;AACF;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
package/dist/chunk-UKMLICWS.js
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
DEFAULT_API_URL
|
|
3
|
-
} from "./chunk-ZUJBM6HE.js";
|
|
4
|
-
|
|
5
|
-
// src/dashboard/launcher/api.ts
|
|
6
|
-
function apiUrl() {
|
|
7
|
-
return process.env.RULEMETRIC_API_URL ?? DEFAULT_API_URL;
|
|
8
|
-
}
|
|
9
|
-
function authToken() {
|
|
10
|
-
const t = process.env.RULEMETRIC_API_KEY ?? process.env.RULEMETRIC_ACCESS_TOKEN;
|
|
11
|
-
if (!t) throw new Error("not signed in \u2014 run `rulemetric auth login`");
|
|
12
|
-
return t;
|
|
13
|
-
}
|
|
14
|
-
async function request(path, init) {
|
|
15
|
-
const resp = await fetch(`${apiUrl()}${path}`, {
|
|
16
|
-
...init,
|
|
17
|
-
headers: {
|
|
18
|
-
Authorization: `Bearer ${authToken()}`,
|
|
19
|
-
"Content-Type": "application/json",
|
|
20
|
-
...init?.headers ?? {}
|
|
21
|
-
},
|
|
22
|
-
signal: AbortSignal.timeout(1e4)
|
|
23
|
-
});
|
|
24
|
-
if (!resp.ok) {
|
|
25
|
-
throw new Error(`${resp.status} ${resp.statusText}`);
|
|
26
|
-
}
|
|
27
|
-
return await resp.json();
|
|
28
|
-
}
|
|
29
|
-
function fetchLaunchJobs({ limit }) {
|
|
30
|
-
return request(`/api/launch-jobs?limit=${limit}`);
|
|
31
|
-
}
|
|
32
|
-
function createLaunchJob(payload) {
|
|
33
|
-
return request("/api/launch-jobs", {
|
|
34
|
-
method: "POST",
|
|
35
|
-
body: JSON.stringify(payload)
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
function cancelLaunchJob(id) {
|
|
39
|
-
return request(`/api/launch-jobs/${id}/cancel`, { method: "POST" });
|
|
40
|
-
}
|
|
41
|
-
function listLaunchers() {
|
|
42
|
-
return request("/api/launchers");
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
export {
|
|
46
|
-
fetchLaunchJobs,
|
|
47
|
-
createLaunchJob,
|
|
48
|
-
cancelLaunchJob,
|
|
49
|
-
listLaunchers
|
|
50
|
-
};
|
|
51
|
-
//# sourceMappingURL=chunk-UKMLICWS.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/dashboard/launcher/api.ts"],
|
|
4
|
-
"sourcesContent": ["import { DEFAULT_API_URL } from '../../lib/api-client.js';\nimport type { LaunchJob, AvailableLauncher, CreateLaunchPayload } from './types.js';\n\nfunction apiUrl(): string {\n return process.env.RULEMETRIC_API_URL ?? DEFAULT_API_URL;\n}\n\nfunction authToken(): string {\n const t = process.env.RULEMETRIC_API_KEY ?? process.env.RULEMETRIC_ACCESS_TOKEN;\n if (!t) throw new Error('not signed in \u2014 run `rulemetric auth login`');\n return t;\n}\n\nasync function request<T>(path: string, init?: RequestInit): Promise<T> {\n const resp = await fetch(`${apiUrl()}${path}`, {\n ...init,\n headers: {\n Authorization: `Bearer ${authToken()}`,\n 'Content-Type': 'application/json',\n ...(init?.headers ?? {}),\n },\n signal: AbortSignal.timeout(10_000),\n });\n if (!resp.ok) {\n throw new Error(`${resp.status} ${resp.statusText}`);\n }\n return (await resp.json()) as T;\n}\n\nexport function fetchLaunchJobs({ limit }: { limit: number }): Promise<LaunchJob[]> {\n return request<LaunchJob[]>(`/api/launch-jobs?limit=${limit}`);\n}\n\nexport function createLaunchJob(payload: CreateLaunchPayload): Promise<LaunchJob> {\n return request<LaunchJob>('/api/launch-jobs', {\n method: 'POST',\n body: JSON.stringify(payload),\n });\n}\n\nexport function cancelLaunchJob(id: string): Promise<{ ok: true }> {\n return request<{ ok: true }>(`/api/launch-jobs/${id}/cancel`, { method: 'POST' });\n}\n\nexport function listLaunchers(): Promise<AvailableLauncher[]> {\n return request<AvailableLauncher[]>('/api/launchers');\n}\n"],
|
|
5
|
-
"mappings": ";;;;;AAGA,SAAS,SAAiB;AACxB,SAAO,QAAQ,IAAI,sBAAsB;AAC3C;AAEA,SAAS,YAAoB;AAC3B,QAAM,IAAI,QAAQ,IAAI,sBAAsB,QAAQ,IAAI;AACxD,MAAI,CAAC,EAAG,OAAM,IAAI,MAAM,kDAA6C;AACrE,SAAO;AACT;AAEA,eAAe,QAAW,MAAc,MAAgC;AACtE,QAAM,OAAO,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI;AAAA,IAC7C,GAAG;AAAA,IACH,SAAS;AAAA,MACP,eAAe,UAAU,UAAU,CAAC;AAAA,MACpC,gBAAgB;AAAA,MAChB,GAAI,MAAM,WAAW,CAAC;AAAA,IACxB;AAAA,IACA,QAAQ,YAAY,QAAQ,GAAM;AAAA,EACpC,CAAC;AACD,MAAI,CAAC,KAAK,IAAI;AACZ,UAAM,IAAI,MAAM,GAAG,KAAK,MAAM,IAAI,KAAK,UAAU,EAAE;AAAA,EACrD;AACA,SAAQ,MAAM,KAAK,KAAK;AAC1B;AAEO,SAAS,gBAAgB,EAAE,MAAM,GAA4C;AAClF,SAAO,QAAqB,0BAA0B,KAAK,EAAE;AAC/D;AAEO,SAAS,gBAAgB,SAAkD;AAChF,SAAO,QAAmB,oBAAoB;AAAA,IAC5C,QAAQ;AAAA,IACR,MAAM,KAAK,UAAU,OAAO;AAAA,EAC9B,CAAC;AACH;AAEO,SAAS,gBAAgB,IAAmC;AACjE,SAAO,QAAsB,oBAAoB,EAAE,WAAW,EAAE,QAAQ,OAAO,CAAC;AAClF;AAEO,SAAS,gBAA8C;AAC5D,SAAO,QAA6B,gBAAgB;AACtD;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
package/dist/chunk-W2YERO7E.js
DELETED
|
@@ -1,170 +0,0 @@
|
|
|
1
|
-
// src/lib/auth.ts
|
|
2
|
-
import * as fs from "node:fs";
|
|
3
|
-
import * as path from "node:path";
|
|
4
|
-
import * as os from "node:os";
|
|
5
|
-
function getConfigDir() {
|
|
6
|
-
return process.env.RULEMETRIC_CONFIG_DIR || path.join(os.homedir(), ".config", "rulemetric");
|
|
7
|
-
}
|
|
8
|
-
var _envFileAuthCache;
|
|
9
|
-
function loadEnvFileAuth() {
|
|
10
|
-
if (_envFileAuthCache !== void 0) return _envFileAuthCache;
|
|
11
|
-
try {
|
|
12
|
-
const envPath = path.join(getConfigDir(), "env");
|
|
13
|
-
if (!fs.existsSync(envPath)) return _envFileAuthCache = {};
|
|
14
|
-
const content = fs.readFileSync(envPath, "utf-8");
|
|
15
|
-
const read = (key) => content.match(new RegExp(`^${key}=(.+)$`, "m"))?.[1]?.trim();
|
|
16
|
-
_envFileAuthCache = {
|
|
17
|
-
apiKey: read("RULEMETRIC_API_KEY"),
|
|
18
|
-
accessToken: read("RULEMETRIC_ACCESS_TOKEN"),
|
|
19
|
-
apiUrl: read("RULEMETRIC_API_URL")
|
|
20
|
-
};
|
|
21
|
-
return _envFileAuthCache;
|
|
22
|
-
} catch {
|
|
23
|
-
return _envFileAuthCache = {};
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
function __resetEnvFileAuthCache() {
|
|
27
|
-
_envFileAuthCache = void 0;
|
|
28
|
-
}
|
|
29
|
-
function createAuthStore(configDir = getConfigDir()) {
|
|
30
|
-
const authFile = path.join(configDir, "auth.json");
|
|
31
|
-
function saveToken2(token) {
|
|
32
|
-
fs.mkdirSync(configDir, { recursive: true, mode: 448 });
|
|
33
|
-
fs.writeFileSync(authFile, JSON.stringify(token, null, 2), {
|
|
34
|
-
encoding: "utf-8",
|
|
35
|
-
mode: 384
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
function loadToken2() {
|
|
39
|
-
try {
|
|
40
|
-
const data = fs.readFileSync(authFile, "utf-8");
|
|
41
|
-
const parsed = JSON.parse(data);
|
|
42
|
-
if (parsed && typeof parsed === "object" && "accessToken" in parsed && "expiresAt" in parsed && "email" in parsed && typeof parsed.accessToken === "string" && typeof parsed.expiresAt === "string") {
|
|
43
|
-
return parsed;
|
|
44
|
-
}
|
|
45
|
-
return null;
|
|
46
|
-
} catch {
|
|
47
|
-
return null;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
function clearToken2() {
|
|
51
|
-
try {
|
|
52
|
-
fs.unlinkSync(authFile);
|
|
53
|
-
} catch {
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
function isAuthenticated2() {
|
|
57
|
-
const token = loadToken2();
|
|
58
|
-
if (!token) return false;
|
|
59
|
-
const expiresAt = new Date(token.expiresAt).getTime();
|
|
60
|
-
if (Number.isNaN(expiresAt)) return false;
|
|
61
|
-
return Date.now() < expiresAt;
|
|
62
|
-
}
|
|
63
|
-
function saveEnvFile2(accessToken, apiUrl) {
|
|
64
|
-
fs.mkdirSync(configDir, { recursive: true, mode: 448 });
|
|
65
|
-
const envPath = path.join(configDir, "env");
|
|
66
|
-
let existingApiKey = "";
|
|
67
|
-
try {
|
|
68
|
-
const existing = fs.readFileSync(envPath, "utf-8");
|
|
69
|
-
const match = existing.match(/^RULEMETRIC_API_KEY=(.+)$/m);
|
|
70
|
-
if (match) existingApiKey = match[1];
|
|
71
|
-
} catch {
|
|
72
|
-
}
|
|
73
|
-
const lines = [
|
|
74
|
-
`RULEMETRIC_ACCESS_TOKEN=${accessToken}`
|
|
75
|
-
];
|
|
76
|
-
if (existingApiKey) {
|
|
77
|
-
lines.push(`RULEMETRIC_API_KEY=${existingApiKey}`);
|
|
78
|
-
}
|
|
79
|
-
if (apiUrl) {
|
|
80
|
-
lines.push(`RULEMETRIC_API_URL=${apiUrl}`);
|
|
81
|
-
}
|
|
82
|
-
fs.writeFileSync(envPath, lines.join("\n") + "\n", {
|
|
83
|
-
encoding: "utf-8",
|
|
84
|
-
mode: 384
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
function saveApiKeyToEnv(apiKey, apiUrl) {
|
|
88
|
-
fs.mkdirSync(configDir, { recursive: true, mode: 448 });
|
|
89
|
-
const envPath = path.join(configDir, "env");
|
|
90
|
-
let existingToken = "";
|
|
91
|
-
let existingUrl = "";
|
|
92
|
-
try {
|
|
93
|
-
const existing = fs.readFileSync(envPath, "utf-8");
|
|
94
|
-
const tokenMatch = existing.match(/^RULEMETRIC_ACCESS_TOKEN=(.+)$/m);
|
|
95
|
-
if (tokenMatch) existingToken = tokenMatch[1];
|
|
96
|
-
const urlMatch = existing.match(/^RULEMETRIC_API_URL=(.+)$/m);
|
|
97
|
-
if (urlMatch) existingUrl = urlMatch[1];
|
|
98
|
-
} catch {
|
|
99
|
-
}
|
|
100
|
-
const lines = [
|
|
101
|
-
`RULEMETRIC_API_KEY=${apiKey}`
|
|
102
|
-
];
|
|
103
|
-
if (existingToken) {
|
|
104
|
-
lines.push(`RULEMETRIC_ACCESS_TOKEN=${existingToken}`);
|
|
105
|
-
}
|
|
106
|
-
const url = apiUrl ?? existingUrl;
|
|
107
|
-
if (url) {
|
|
108
|
-
lines.push(`RULEMETRIC_API_URL=${url}`);
|
|
109
|
-
}
|
|
110
|
-
fs.writeFileSync(envPath, lines.join("\n") + "\n", {
|
|
111
|
-
encoding: "utf-8",
|
|
112
|
-
mode: 384
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
function clearEnvFile2() {
|
|
116
|
-
const envPath = path.join(configDir, "env");
|
|
117
|
-
try {
|
|
118
|
-
fs.unlinkSync(envPath);
|
|
119
|
-
} catch {
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
return { saveToken: saveToken2, loadToken: loadToken2, clearToken: clearToken2, isAuthenticated: isAuthenticated2, saveEnvFile: saveEnvFile2, saveApiKeyToEnv, clearEnvFile: clearEnvFile2, configDir, authFile };
|
|
123
|
-
}
|
|
124
|
-
function getStore() {
|
|
125
|
-
return createAuthStore();
|
|
126
|
-
}
|
|
127
|
-
function saveToken(token) {
|
|
128
|
-
getStore().saveToken(token);
|
|
129
|
-
}
|
|
130
|
-
function loadToken() {
|
|
131
|
-
return getStore().loadToken();
|
|
132
|
-
}
|
|
133
|
-
function clearToken() {
|
|
134
|
-
getStore().clearToken();
|
|
135
|
-
}
|
|
136
|
-
function isAuthenticated() {
|
|
137
|
-
if (process.env.RULEMETRIC_API_KEY) return true;
|
|
138
|
-
if (getStore().isAuthenticated()) return true;
|
|
139
|
-
const envAuth = loadEnvFileAuth();
|
|
140
|
-
return Boolean(envAuth.apiKey || envAuth.accessToken);
|
|
141
|
-
}
|
|
142
|
-
function saveEnvFile(accessToken, apiUrl) {
|
|
143
|
-
getStore().saveEnvFile(accessToken, apiUrl);
|
|
144
|
-
}
|
|
145
|
-
function saveApiKey(apiKey, apiUrl) {
|
|
146
|
-
getStore().saveApiKeyToEnv(apiKey, apiUrl);
|
|
147
|
-
}
|
|
148
|
-
function clearEnvFile() {
|
|
149
|
-
getStore().clearEnvFile();
|
|
150
|
-
}
|
|
151
|
-
function getDefaultConfigDir() {
|
|
152
|
-
return getConfigDir();
|
|
153
|
-
}
|
|
154
|
-
var CONFIG_DIR = getConfigDir();
|
|
155
|
-
|
|
156
|
-
export {
|
|
157
|
-
loadEnvFileAuth,
|
|
158
|
-
__resetEnvFileAuthCache,
|
|
159
|
-
createAuthStore,
|
|
160
|
-
saveToken,
|
|
161
|
-
loadToken,
|
|
162
|
-
clearToken,
|
|
163
|
-
isAuthenticated,
|
|
164
|
-
saveEnvFile,
|
|
165
|
-
saveApiKey,
|
|
166
|
-
clearEnvFile,
|
|
167
|
-
getDefaultConfigDir,
|
|
168
|
-
CONFIG_DIR
|
|
169
|
-
};
|
|
170
|
-
//# sourceMappingURL=chunk-W2YERO7E.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/lib/auth.ts"],
|
|
4
|
-
"sourcesContent": ["import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\n\nexport interface AuthToken {\n accessToken: string;\n refreshToken: string;\n expiresAt: string;\n email: string;\n}\n\nfunction getConfigDir(): string {\n return process.env.RULEMETRIC_CONFIG_DIR || path.join(os.homedir(), '.config', 'rulemetric');\n}\n\nexport interface EnvFileAuth {\n apiKey?: string;\n accessToken?: string;\n apiUrl?: string;\n}\n\n// Read credentials persisted in ~/.config/rulemetric/env (written by `auth login`\n// / `auth create-key`). The interactive Node CLI does NOT source this file into\n// process.env the way the bash hooks do, so WITHOUT this the CLI reports \"Not\n// logged in\" from any shell that hasn't exported the vars \u2014 even though valid\n// long-lived creds are on disk (this is the documented #2 credential source in\n// CLAUDE.md). Consulted ONLY as an additive fallback, after process.env +\n// auth.json, so it can never regress an already-working auth path. Cached per\n// process (config is read once; a login within the same process is rare and can\n// re-read via the explicit save paths).\nlet _envFileAuthCache: EnvFileAuth | undefined;\nexport function loadEnvFileAuth(): EnvFileAuth {\n if (_envFileAuthCache !== undefined) return _envFileAuthCache;\n try {\n const envPath = path.join(getConfigDir(), 'env');\n if (!fs.existsSync(envPath)) return (_envFileAuthCache = {});\n const content = fs.readFileSync(envPath, 'utf-8');\n const read = (key: string): string | undefined =>\n content.match(new RegExp(`^${key}=(.+)$`, 'm'))?.[1]?.trim();\n _envFileAuthCache = {\n apiKey: read('RULEMETRIC_API_KEY'),\n accessToken: read('RULEMETRIC_ACCESS_TOKEN'),\n apiUrl: read('RULEMETRIC_API_URL'),\n };\n return _envFileAuthCache;\n } catch {\n return (_envFileAuthCache = {});\n }\n}\n\n/** Test-only: drop the env-file auth cache so a test can change the file. */\nexport function __resetEnvFileAuthCache(): void {\n _envFileAuthCache = undefined;\n}\n\nexport function createAuthStore(configDir: string = getConfigDir()) {\n const authFile = path.join(configDir, 'auth.json');\n\n function saveToken(token: AuthToken): void {\n fs.mkdirSync(configDir, { recursive: true, mode: 0o700 });\n fs.writeFileSync(authFile, JSON.stringify(token, null, 2), {\n encoding: 'utf-8',\n mode: 0o600,\n });\n }\n\n function loadToken(): AuthToken | null {\n try {\n const data = fs.readFileSync(authFile, 'utf-8');\n const parsed: unknown = JSON.parse(data);\n if (\n parsed &&\n typeof parsed === 'object' &&\n 'accessToken' in parsed &&\n 'expiresAt' in parsed &&\n 'email' in parsed &&\n typeof (parsed as AuthToken).accessToken === 'string' &&\n typeof (parsed as AuthToken).expiresAt === 'string'\n ) {\n return parsed as AuthToken;\n }\n return null;\n } catch {\n return null;\n }\n }\n\n function clearToken(): void {\n try {\n fs.unlinkSync(authFile);\n } catch {\n // File doesn't exist, nothing to clear\n }\n }\n\n function isAuthenticated(): boolean {\n const token = loadToken();\n if (!token) return false;\n const expiresAt = new Date(token.expiresAt).getTime();\n if (Number.isNaN(expiresAt)) return false;\n return Date.now() < expiresAt;\n }\n\n function saveEnvFile(accessToken: string, apiUrl?: string): void {\n fs.mkdirSync(configDir, { recursive: true, mode: 0o700 });\n const envPath = path.join(configDir, 'env');\n\n // Preserve existing RULEMETRIC_API_KEY if present\n let existingApiKey = '';\n try {\n const existing = fs.readFileSync(envPath, 'utf-8');\n const match = existing.match(/^RULEMETRIC_API_KEY=(.+)$/m);\n if (match) existingApiKey = match[1];\n } catch { /* file doesn't exist */ }\n\n const lines = [\n `RULEMETRIC_ACCESS_TOKEN=${accessToken}`,\n ];\n if (existingApiKey) {\n lines.push(`RULEMETRIC_API_KEY=${existingApiKey}`);\n }\n if (apiUrl) {\n lines.push(`RULEMETRIC_API_URL=${apiUrl}`);\n }\n\n fs.writeFileSync(envPath, lines.join('\\n') + '\\n', {\n encoding: 'utf-8',\n mode: 0o600,\n });\n }\n\n function saveApiKeyToEnv(apiKey: string, apiUrl?: string): void {\n fs.mkdirSync(configDir, { recursive: true, mode: 0o700 });\n const envPath = path.join(configDir, 'env');\n\n // Preserve existing ACCESS_TOKEN if present\n let existingToken = '';\n let existingUrl = '';\n try {\n const existing = fs.readFileSync(envPath, 'utf-8');\n const tokenMatch = existing.match(/^RULEMETRIC_ACCESS_TOKEN=(.+)$/m);\n if (tokenMatch) existingToken = tokenMatch[1];\n const urlMatch = existing.match(/^RULEMETRIC_API_URL=(.+)$/m);\n if (urlMatch) existingUrl = urlMatch[1];\n } catch { /* file doesn't exist */ }\n\n const lines = [\n `RULEMETRIC_API_KEY=${apiKey}`,\n ];\n if (existingToken) {\n lines.push(`RULEMETRIC_ACCESS_TOKEN=${existingToken}`);\n }\n const url = apiUrl ?? existingUrl;\n if (url) {\n lines.push(`RULEMETRIC_API_URL=${url}`);\n }\n\n fs.writeFileSync(envPath, lines.join('\\n') + '\\n', {\n encoding: 'utf-8',\n mode: 0o600,\n });\n }\n\n function clearEnvFile(): void {\n const envPath = path.join(configDir, 'env');\n try { fs.unlinkSync(envPath); } catch { /* noop */ }\n }\n\n return { saveToken, loadToken, clearToken, isAuthenticated, saveEnvFile, saveApiKeyToEnv, clearEnvFile, configDir, authFile };\n}\n\n// Lazy accessors \u2014 re-evaluate config dir from env on each call\nfunction getStore() {\n return createAuthStore();\n}\n\nexport function saveToken(token: AuthToken): void { getStore().saveToken(token); }\nexport function loadToken(): AuthToken | null { return getStore().loadToken(); }\nexport function clearToken(): void { getStore().clearToken(); }\nexport function isAuthenticated(): boolean {\n // API key counts as authenticated\n if (process.env.RULEMETRIC_API_KEY) return true;\n if (getStore().isAuthenticated()) return true;\n // Additive fallback: creds persisted in the env file by `auth login` /\n // `create-key` (not exported to process.env in a plain interactive shell,\n // and the OAuth auth.json may be expired, but the API key is long-lived).\n const envAuth = loadEnvFileAuth();\n return Boolean(envAuth.apiKey || envAuth.accessToken);\n}\nexport function saveEnvFile(accessToken: string, apiUrl?: string): void { getStore().saveEnvFile(accessToken, apiUrl); }\nexport function saveApiKey(apiKey: string, apiUrl?: string): void { getStore().saveApiKeyToEnv(apiKey, apiUrl); }\nexport function clearEnvFile(): void { getStore().clearEnvFile(); }\nexport function getDefaultConfigDir(): string { return getConfigDir(); }\n// Re-exported for backward compat (evaluated at import time; prefer getDefaultConfigDir() for dynamic usage)\nexport const CONFIG_DIR = getConfigDir();\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["saveToken", "loadToken", "clearToken", "isAuthenticated", "saveEnvFile", "clearEnvFile"]
|
|
7
|
-
}
|
package/dist/chunk-W53GKIZQ.js
DELETED
|
@@ -1,50 +0,0 @@
|
|
|
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
|
|
@@ -1,7 +0,0 @@
|
|
|
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
|
-
}
|