@rulemetric/cli 0.1.1
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/bin/dev.js +3 -0
- package/bin/run.js +3 -0
- package/dist/base-command.d.ts +12 -0
- package/dist/base-command.d.ts.map +1 -0
- package/dist/base-command.js +37 -0
- package/dist/base-command.js.map +1 -0
- package/dist/commands/auth/create-key.d.ts +11 -0
- package/dist/commands/auth/create-key.d.ts.map +1 -0
- package/dist/commands/auth/create-key.js +34 -0
- package/dist/commands/auth/create-key.js.map +1 -0
- package/dist/commands/auth/login.d.ts +11 -0
- package/dist/commands/auth/login.d.ts.map +1 -0
- package/dist/commands/auth/login.js +40 -0
- package/dist/commands/auth/login.js.map +1 -0
- package/dist/commands/auth/logout.d.ts +7 -0
- package/dist/commands/auth/logout.d.ts.map +1 -0
- package/dist/commands/auth/logout.js +13 -0
- package/dist/commands/auth/logout.js.map +1 -0
- package/dist/commands/auth/revoke-key.d.ts +10 -0
- package/dist/commands/auth/revoke-key.d.ts.map +1 -0
- package/dist/commands/auth/revoke-key.js +18 -0
- package/dist/commands/auth/revoke-key.js.map +1 -0
- package/dist/commands/auth/status.d.ts +7 -0
- package/dist/commands/auth/status.d.ts.map +1 -0
- package/dist/commands/auth/status.js +23 -0
- package/dist/commands/auth/status.js.map +1 -0
- package/dist/commands/catalog/index.d.ts +11 -0
- package/dist/commands/catalog/index.d.ts.map +1 -0
- package/dist/commands/catalog/index.js +35 -0
- package/dist/commands/catalog/index.js.map +1 -0
- package/dist/commands/catalog/recommend.d.ts +9 -0
- package/dist/commands/catalog/recommend.d.ts.map +1 -0
- package/dist/commands/catalog/recommend.js +27 -0
- package/dist/commands/catalog/recommend.js.map +1 -0
- package/dist/commands/convert.d.ts +15 -0
- package/dist/commands/convert.d.ts.map +1 -0
- package/dist/commands/convert.js +55 -0
- package/dist/commands/convert.js.map +1 -0
- package/dist/commands/converters.d.ts +12 -0
- package/dist/commands/converters.d.ts.map +1 -0
- package/dist/commands/converters.js +39 -0
- package/dist/commands/converters.js.map +1 -0
- package/dist/commands/dashboard.d.ts +10 -0
- package/dist/commands/dashboard.d.ts.map +1 -0
- package/dist/commands/dashboard.js +24 -0
- package/dist/commands/dashboard.js.map +1 -0
- package/dist/commands/eval-targets/create.d.ts +14 -0
- package/dist/commands/eval-targets/create.d.ts.map +1 -0
- package/dist/commands/eval-targets/create.js +40 -0
- package/dist/commands/eval-targets/create.js.map +1 -0
- package/dist/commands/eval-targets/list.d.ts +10 -0
- package/dist/commands/eval-targets/list.d.ts.map +1 -0
- package/dist/commands/eval-targets/list.js +36 -0
- package/dist/commands/eval-targets/list.js.map +1 -0
- package/dist/commands/evals/benchmark.d.ts +13 -0
- package/dist/commands/evals/benchmark.d.ts.map +1 -0
- package/dist/commands/evals/benchmark.js +53 -0
- package/dist/commands/evals/benchmark.js.map +1 -0
- package/dist/commands/evals/compare.d.ts +15 -0
- package/dist/commands/evals/compare.d.ts.map +1 -0
- package/dist/commands/evals/compare.js +101 -0
- package/dist/commands/evals/compare.js.map +1 -0
- package/dist/commands/evals/create.d.ts +17 -0
- package/dist/commands/evals/create.d.ts.map +1 -0
- package/dist/commands/evals/create.js +52 -0
- package/dist/commands/evals/create.js.map +1 -0
- package/dist/commands/evals/listen.d.ts +11 -0
- package/dist/commands/evals/listen.d.ts.map +1 -0
- package/dist/commands/evals/listen.js +54 -0
- package/dist/commands/evals/listen.js.map +1 -0
- package/dist/commands/evals/optimize-description.d.ts +22 -0
- package/dist/commands/evals/optimize-description.d.ts.map +1 -0
- package/dist/commands/evals/optimize-description.js +269 -0
- package/dist/commands/evals/optimize-description.js.map +1 -0
- package/dist/commands/evals/optimize.d.ts +22 -0
- package/dist/commands/evals/optimize.d.ts.map +1 -0
- package/dist/commands/evals/optimize.js +200 -0
- package/dist/commands/evals/optimize.js.map +1 -0
- package/dist/commands/evals/run.d.ts +21 -0
- package/dist/commands/evals/run.d.ts.map +1 -0
- package/dist/commands/evals/run.js +168 -0
- package/dist/commands/evals/run.js.map +1 -0
- package/dist/commands/gateway/ensure.d.ts +7 -0
- package/dist/commands/gateway/ensure.d.ts.map +1 -0
- package/dist/commands/gateway/ensure.js +20 -0
- package/dist/commands/gateway/ensure.js.map +1 -0
- package/dist/commands/hooks/install.d.ts +16 -0
- package/dist/commands/hooks/install.d.ts.map +1 -0
- package/dist/commands/hooks/install.js +248 -0
- package/dist/commands/hooks/install.js.map +1 -0
- package/dist/commands/hooks/run.d.ts +11 -0
- package/dist/commands/hooks/run.d.ts.map +1 -0
- package/dist/commands/hooks/run.js +56 -0
- package/dist/commands/hooks/run.js.map +1 -0
- package/dist/commands/hooks/uninstall.d.ts +7 -0
- package/dist/commands/hooks/uninstall.d.ts.map +1 -0
- package/dist/commands/hooks/uninstall.js +88 -0
- package/dist/commands/hooks/uninstall.js.map +1 -0
- package/dist/commands/import.d.ts +17 -0
- package/dist/commands/import.d.ts.map +1 -0
- package/dist/commands/import.js +55 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/insights/sync.d.ts +17 -0
- package/dist/commands/insights/sync.d.ts.map +1 -0
- package/dist/commands/insights/sync.js +477 -0
- package/dist/commands/insights/sync.js.map +1 -0
- package/dist/commands/instructions/create.d.ts +17 -0
- package/dist/commands/instructions/create.d.ts.map +1 -0
- package/dist/commands/instructions/create.js +60 -0
- package/dist/commands/instructions/create.js.map +1 -0
- package/dist/commands/instructions/delete.d.ts +13 -0
- package/dist/commands/instructions/delete.d.ts.map +1 -0
- package/dist/commands/instructions/delete.js +37 -0
- package/dist/commands/instructions/delete.js.map +1 -0
- package/dist/commands/instructions/fork.d.ts +10 -0
- package/dist/commands/instructions/fork.d.ts.map +1 -0
- package/dist/commands/instructions/fork.js +19 -0
- package/dist/commands/instructions/fork.js.map +1 -0
- package/dist/commands/instructions/get.d.ts +15 -0
- package/dist/commands/instructions/get.d.ts.map +1 -0
- package/dist/commands/instructions/get.js +50 -0
- package/dist/commands/instructions/get.js.map +1 -0
- package/dist/commands/instructions/list.d.ts +12 -0
- package/dist/commands/instructions/list.d.ts.map +1 -0
- package/dist/commands/instructions/list.js +47 -0
- package/dist/commands/instructions/list.js.map +1 -0
- package/dist/commands/instructions/promote.d.ts +14 -0
- package/dist/commands/instructions/promote.d.ts.map +1 -0
- package/dist/commands/instructions/promote.js +27 -0
- package/dist/commands/instructions/promote.js.map +1 -0
- package/dist/commands/instructions/pull.d.ts +9 -0
- package/dist/commands/instructions/pull.d.ts.map +1 -0
- package/dist/commands/instructions/pull.js +22 -0
- package/dist/commands/instructions/pull.js.map +1 -0
- package/dist/commands/instructions/upstream.d.ts +9 -0
- package/dist/commands/instructions/upstream.d.ts.map +1 -0
- package/dist/commands/instructions/upstream.js +22 -0
- package/dist/commands/instructions/upstream.js.map +1 -0
- package/dist/commands/instructions/versions.d.ts +12 -0
- package/dist/commands/instructions/versions.d.ts.map +1 -0
- package/dist/commands/instructions/versions.js +34 -0
- package/dist/commands/instructions/versions.js.map +1 -0
- package/dist/commands/packs/add-instruction.d.ts +11 -0
- package/dist/commands/packs/add-instruction.d.ts.map +1 -0
- package/dist/commands/packs/add-instruction.js +22 -0
- package/dist/commands/packs/add-instruction.js.map +1 -0
- package/dist/commands/packs/apply.d.ts +13 -0
- package/dist/commands/packs/apply.d.ts.map +1 -0
- package/dist/commands/packs/apply.js +24 -0
- package/dist/commands/packs/apply.js.map +1 -0
- package/dist/commands/packs/create.d.ts +13 -0
- package/dist/commands/packs/create.d.ts.map +1 -0
- package/dist/commands/packs/create.js +35 -0
- package/dist/commands/packs/create.js.map +1 -0
- package/dist/commands/packs/fork.d.ts +10 -0
- package/dist/commands/packs/fork.d.ts.map +1 -0
- package/dist/commands/packs/fork.js +19 -0
- package/dist/commands/packs/fork.js.map +1 -0
- package/dist/commands/packs/get.d.ts +10 -0
- package/dist/commands/packs/get.d.ts.map +1 -0
- package/dist/commands/packs/get.js +36 -0
- package/dist/commands/packs/get.js.map +1 -0
- package/dist/commands/packs/list.d.ts +22 -0
- package/dist/commands/packs/list.d.ts.map +1 -0
- package/dist/commands/packs/list.js +48 -0
- package/dist/commands/packs/list.js.map +1 -0
- package/dist/commands/packs/remove-instruction.d.ts +11 -0
- package/dist/commands/packs/remove-instruction.d.ts.map +1 -0
- package/dist/commands/packs/remove-instruction.js +20 -0
- package/dist/commands/packs/remove-instruction.js.map +1 -0
- package/dist/commands/proxy/env.d.ts +14 -0
- package/dist/commands/proxy/env.d.ts.map +1 -0
- package/dist/commands/proxy/env.js +118 -0
- package/dist/commands/proxy/env.js.map +1 -0
- package/dist/commands/proxy/logs.d.ts +11 -0
- package/dist/commands/proxy/logs.d.ts.map +1 -0
- package/dist/commands/proxy/logs.js +75 -0
- package/dist/commands/proxy/logs.js.map +1 -0
- package/dist/commands/proxy/setup.d.ts +23 -0
- package/dist/commands/proxy/setup.d.ts.map +1 -0
- package/dist/commands/proxy/setup.js +391 -0
- package/dist/commands/proxy/setup.js.map +1 -0
- package/dist/commands/proxy/start.d.ts +17 -0
- package/dist/commands/proxy/start.d.ts.map +1 -0
- package/dist/commands/proxy/start.js +306 -0
- package/dist/commands/proxy/start.js.map +1 -0
- package/dist/commands/proxy/status.d.ts +7 -0
- package/dist/commands/proxy/status.d.ts.map +1 -0
- package/dist/commands/proxy/status.js +65 -0
- package/dist/commands/proxy/status.js.map +1 -0
- package/dist/commands/proxy/stop.d.ts +8 -0
- package/dist/commands/proxy/stop.d.ts.map +1 -0
- package/dist/commands/proxy/stop.js +77 -0
- package/dist/commands/proxy/stop.js.map +1 -0
- package/dist/commands/service/install.d.ts +17 -0
- package/dist/commands/service/install.d.ts.map +1 -0
- package/dist/commands/service/install.js +383 -0
- package/dist/commands/service/install.js.map +1 -0
- package/dist/commands/service/install.test.d.ts +2 -0
- package/dist/commands/service/install.test.d.ts.map +1 -0
- package/dist/commands/service/install.test.js +345 -0
- package/dist/commands/service/install.test.js.map +1 -0
- package/dist/commands/service/status.d.ts +6 -0
- package/dist/commands/service/status.d.ts.map +1 -0
- package/dist/commands/service/status.js +112 -0
- package/dist/commands/service/status.js.map +1 -0
- package/dist/commands/service/uninstall.d.ts +6 -0
- package/dist/commands/service/uninstall.d.ts.map +1 -0
- package/dist/commands/service/uninstall.js +84 -0
- package/dist/commands/service/uninstall.js.map +1 -0
- package/dist/commands/sessions/analyze.d.ts +10 -0
- package/dist/commands/sessions/analyze.d.ts.map +1 -0
- package/dist/commands/sessions/analyze.js +26 -0
- package/dist/commands/sessions/analyze.js.map +1 -0
- package/dist/commands/sessions/end.d.ts +9 -0
- package/dist/commands/sessions/end.d.ts.map +1 -0
- package/dist/commands/sessions/end.js +82 -0
- package/dist/commands/sessions/end.js.map +1 -0
- package/dist/commands/sessions/import.d.ts +13 -0
- package/dist/commands/sessions/import.d.ts.map +1 -0
- package/dist/commands/sessions/import.js +28 -0
- package/dist/commands/sessions/import.js.map +1 -0
- package/dist/commands/sessions/list.d.ts +11 -0
- package/dist/commands/sessions/list.d.ts.map +1 -0
- package/dist/commands/sessions/list.js +34 -0
- package/dist/commands/sessions/list.js.map +1 -0
- package/dist/commands/sessions/start.d.ts +11 -0
- package/dist/commands/sessions/start.d.ts.map +1 -0
- package/dist/commands/sessions/start.js +83 -0
- package/dist/commands/sessions/start.js.map +1 -0
- package/dist/commands/skills/install.d.ts +15 -0
- package/dist/commands/skills/install.d.ts.map +1 -0
- package/dist/commands/skills/install.js +91 -0
- package/dist/commands/skills/install.js.map +1 -0
- package/dist/commands/skills/list.d.ts +11 -0
- package/dist/commands/skills/list.d.ts.map +1 -0
- package/dist/commands/skills/list.js +47 -0
- package/dist/commands/skills/list.js.map +1 -0
- package/dist/commands/skills/search.d.ts +17 -0
- package/dist/commands/skills/search.d.ts.map +1 -0
- package/dist/commands/skills/search.js +56 -0
- package/dist/commands/skills/search.js.map +1 -0
- package/dist/commands/skills/update.d.ts +7 -0
- package/dist/commands/skills/update.d.ts.map +1 -0
- package/dist/commands/skills/update.js +30 -0
- package/dist/commands/skills/update.js.map +1 -0
- package/dist/dashboard/Dashboard.d.ts +3 -0
- package/dist/dashboard/Dashboard.d.ts.map +1 -0
- package/dist/dashboard/Dashboard.js +132 -0
- package/dist/dashboard/Dashboard.js.map +1 -0
- package/dist/dashboard/data.d.ts +11 -0
- package/dist/dashboard/data.d.ts.map +1 -0
- package/dist/dashboard/data.js +137 -0
- package/dist/dashboard/data.js.map +1 -0
- package/dist/dashboard/panels/friction.d.ts +7 -0
- package/dist/dashboard/panels/friction.d.ts.map +1 -0
- package/dist/dashboard/panels/friction.js +22 -0
- package/dist/dashboard/panels/friction.js.map +1 -0
- package/dist/dashboard/panels/insights.d.ts +8 -0
- package/dist/dashboard/panels/insights.d.ts.map +1 -0
- package/dist/dashboard/panels/insights.js +109 -0
- package/dist/dashboard/panels/insights.js.map +1 -0
- package/dist/dashboard/panels/instructions.d.ts +9 -0
- package/dist/dashboard/panels/instructions.d.ts.map +1 -0
- package/dist/dashboard/panels/instructions.js +17 -0
- package/dist/dashboard/panels/instructions.js.map +1 -0
- package/dist/dashboard/panels/outcomes.d.ts +7 -0
- package/dist/dashboard/panels/outcomes.d.ts.map +1 -0
- package/dist/dashboard/panels/outcomes.js +29 -0
- package/dist/dashboard/panels/outcomes.js.map +1 -0
- package/dist/dashboard/panels/overview.d.ts +8 -0
- package/dist/dashboard/panels/overview.d.ts.map +1 -0
- package/dist/dashboard/panels/overview.js +20 -0
- package/dist/dashboard/panels/overview.js.map +1 -0
- package/dist/dashboard/panels/shared.d.ts +17 -0
- package/dist/dashboard/panels/shared.d.ts.map +1 -0
- package/dist/dashboard/panels/shared.js +62 -0
- package/dist/dashboard/panels/shared.js.map +1 -0
- package/dist/dashboard/types.d.ts +80 -0
- package/dist/dashboard/types.d.ts.map +1 -0
- package/dist/dashboard/types.js +27 -0
- package/dist/dashboard/types.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api-client.d.ts +17 -0
- package/dist/lib/api-client.d.ts.map +1 -0
- package/dist/lib/api-client.js +92 -0
- package/dist/lib/api-client.js.map +1 -0
- package/dist/lib/api-client.test.d.ts +2 -0
- package/dist/lib/api-client.test.d.ts.map +1 -0
- package/dist/lib/api-client.test.js +161 -0
- package/dist/lib/api-client.test.js.map +1 -0
- package/dist/lib/auth.d.ts +27 -0
- package/dist/lib/auth.d.ts.map +1 -0
- package/dist/lib/auth.js +137 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/auth.test.d.ts +2 -0
- package/dist/lib/auth.test.d.ts.map +1 -0
- package/dist/lib/auth.test.js +110 -0
- package/dist/lib/auth.test.js.map +1 -0
- package/dist/lib/eval-analyzer.d.ts +23 -0
- package/dist/lib/eval-analyzer.d.ts.map +1 -0
- package/dist/lib/eval-analyzer.js +89 -0
- package/dist/lib/eval-analyzer.js.map +1 -0
- package/dist/lib/eval-benchmark.d.ts +17 -0
- package/dist/lib/eval-benchmark.d.ts.map +1 -0
- package/dist/lib/eval-benchmark.js +92 -0
- package/dist/lib/eval-benchmark.js.map +1 -0
- package/dist/lib/eval-conversation-handler.d.ts +9 -0
- package/dist/lib/eval-conversation-handler.d.ts.map +1 -0
- package/dist/lib/eval-conversation-handler.js +200 -0
- package/dist/lib/eval-conversation-handler.js.map +1 -0
- package/dist/lib/eval-executor.d.ts +21 -0
- package/dist/lib/eval-executor.d.ts.map +1 -0
- package/dist/lib/eval-executor.js +80 -0
- package/dist/lib/eval-executor.js.map +1 -0
- package/dist/lib/eval-executor.test.d.ts +2 -0
- package/dist/lib/eval-executor.test.d.ts.map +1 -0
- package/dist/lib/eval-executor.test.js +8 -0
- package/dist/lib/eval-executor.test.js.map +1 -0
- package/dist/lib/eval-grader.d.ts +38 -0
- package/dist/lib/eval-grader.d.ts.map +1 -0
- package/dist/lib/eval-grader.js +123 -0
- package/dist/lib/eval-grader.js.map +1 -0
- package/dist/lib/eval-grader.test.d.ts +2 -0
- package/dist/lib/eval-grader.test.d.ts.map +1 -0
- package/dist/lib/eval-grader.test.js +8 -0
- package/dist/lib/eval-grader.test.js.map +1 -0
- package/dist/lib/eval-meta-judge.d.ts +28 -0
- package/dist/lib/eval-meta-judge.d.ts.map +1 -0
- package/dist/lib/eval-meta-judge.js +116 -0
- package/dist/lib/eval-meta-judge.js.map +1 -0
- package/dist/lib/eval-trigger-tester.d.ts +19 -0
- package/dist/lib/eval-trigger-tester.d.ts.map +1 -0
- package/dist/lib/eval-trigger-tester.js +96 -0
- package/dist/lib/eval-trigger-tester.js.map +1 -0
- package/dist/lib/eval-worker.d.ts +12 -0
- package/dist/lib/eval-worker.d.ts.map +1 -0
- package/dist/lib/eval-worker.js +395 -0
- package/dist/lib/eval-worker.js.map +1 -0
- package/dist/lib/eval-worktree.d.ts +11 -0
- package/dist/lib/eval-worktree.d.ts.map +1 -0
- package/dist/lib/eval-worktree.js +87 -0
- package/dist/lib/eval-worktree.js.map +1 -0
- package/dist/lib/eval-worktree.test.d.ts +2 -0
- package/dist/lib/eval-worktree.test.d.ts.map +1 -0
- package/dist/lib/eval-worktree.test.js +68 -0
- package/dist/lib/eval-worktree.test.js.map +1 -0
- package/dist/lib/gateway-entry.d.ts +3 -0
- package/dist/lib/gateway-entry.d.ts.map +1 -0
- package/dist/lib/gateway-entry.js +19 -0
- package/dist/lib/gateway-entry.js.map +1 -0
- package/dist/lib/gateway-lifecycle.d.ts +9 -0
- package/dist/lib/gateway-lifecycle.d.ts.map +1 -0
- package/dist/lib/gateway-lifecycle.js +86 -0
- package/dist/lib/gateway-lifecycle.js.map +1 -0
- package/dist/lib/gateway.d.ts +12 -0
- package/dist/lib/gateway.d.ts.map +1 -0
- package/dist/lib/gateway.js +150 -0
- package/dist/lib/gateway.js.map +1 -0
- package/dist/lib/hooks-config.d.ts +95 -0
- package/dist/lib/hooks-config.d.ts.map +1 -0
- package/dist/lib/hooks-config.js +416 -0
- package/dist/lib/hooks-config.js.map +1 -0
- package/dist/lib/hooks-config.test.d.ts +2 -0
- package/dist/lib/hooks-config.test.d.ts.map +1 -0
- package/dist/lib/hooks-config.test.js +231 -0
- package/dist/lib/hooks-config.test.js.map +1 -0
- package/dist/lib/insights-prompts.d.ts +13 -0
- package/dist/lib/insights-prompts.d.ts.map +1 -0
- package/dist/lib/insights-prompts.js +145 -0
- package/dist/lib/insights-prompts.js.map +1 -0
- package/dist/lib/insights-worker.d.ts +10 -0
- package/dist/lib/insights-worker.d.ts.map +1 -0
- package/dist/lib/insights-worker.js +329 -0
- package/dist/lib/insights-worker.js.map +1 -0
- package/dist/lib/llm-client.d.ts +26 -0
- package/dist/lib/llm-client.d.ts.map +1 -0
- package/dist/lib/llm-client.js +142 -0
- package/dist/lib/llm-client.js.map +1 -0
- package/dist/lib/llm-client.test.d.ts +2 -0
- package/dist/lib/llm-client.test.d.ts.map +1 -0
- package/dist/lib/llm-client.test.js +62 -0
- package/dist/lib/llm-client.test.js.map +1 -0
- package/dist/lib/output.d.ts +4 -0
- package/dist/lib/output.d.ts.map +1 -0
- package/dist/lib/output.js +36 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/output.test.d.ts +2 -0
- package/dist/lib/output.test.d.ts.map +1 -0
- package/dist/lib/output.test.js +71 -0
- package/dist/lib/output.test.js.map +1 -0
- package/dist/lib/provider-aggregator.d.ts +24 -0
- package/dist/lib/provider-aggregator.d.ts.map +1 -0
- package/dist/lib/provider-aggregator.js +57 -0
- package/dist/lib/provider-aggregator.js.map +1 -0
- package/dist/lib/provider-aggregator.test.d.ts +2 -0
- package/dist/lib/provider-aggregator.test.d.ts.map +1 -0
- package/dist/lib/provider-aggregator.test.js +103 -0
- package/dist/lib/provider-aggregator.test.js.map +1 -0
- package/dist/lib/skills-loader.d.ts +6 -0
- package/dist/lib/skills-loader.d.ts.map +1 -0
- package/dist/lib/skills-loader.js +51 -0
- package/dist/lib/skills-loader.js.map +1 -0
- package/dist/lib/types.d.ts +48 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js +7 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/test-helpers.d.ts +58 -0
- package/dist/test-helpers.d.ts.map +1 -0
- package/dist/test-helpers.js +58 -0
- package/dist/test-helpers.js.map +1 -0
- package/oclif.manifest.json +3197 -0
- package/package.json +76 -0
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import { apiGet, apiPost } from './api-client.js';
|
|
2
|
+
import { executeEval } from './eval-executor.js';
|
|
3
|
+
import { gradeEvalOutput } from './eval-grader.js';
|
|
4
|
+
import { analyzeEvalResults } from './eval-analyzer.js';
|
|
5
|
+
export async function processConversationJob(jobConfig, evalTargetId, logger) {
|
|
6
|
+
const { conversationId, messageId, messageContent } = jobConfig;
|
|
7
|
+
// Fetch context
|
|
8
|
+
const target = await apiGet(`/api/eval-targets/${evalTargetId}`);
|
|
9
|
+
const evalCases = await apiGet(`/api/eval-targets/${evalTargetId}/evals`);
|
|
10
|
+
const messages = await apiGet(`/api/eval-conversations/${conversationId}/messages`);
|
|
11
|
+
// Idempotency: check if this message was already processed (has assistant responses after it)
|
|
12
|
+
const msgIdx = messages.findIndex((m) => m.id === messageId);
|
|
13
|
+
if (msgIdx >= 0) {
|
|
14
|
+
const hasResponse = messages.slice(msgIdx + 1).some((m) => m.role === 'assistant' && (m.type === 'results' || m.type === 'proposal' || m.type === 'generated' || m.type === 'text'));
|
|
15
|
+
if (hasResponse) {
|
|
16
|
+
logger(`Message ${messageId} already processed — skipping (idempotency guard)`);
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
// Helper to post assistant messages
|
|
21
|
+
const postMessage = async (content, type, data) => {
|
|
22
|
+
await apiPost(`/api/eval-conversations/${conversationId}/messages/assistant`, {
|
|
23
|
+
content,
|
|
24
|
+
type,
|
|
25
|
+
data,
|
|
26
|
+
});
|
|
27
|
+
};
|
|
28
|
+
// Decide what action to take
|
|
29
|
+
const decision = await decideAction(target, evalCases, messages, messageContent, logger);
|
|
30
|
+
logger(`Action: ${decision.action}`);
|
|
31
|
+
switch (decision.action) {
|
|
32
|
+
case 'run_evals':
|
|
33
|
+
await handleRunEvals(target, evalCases, conversationId, postMessage, logger);
|
|
34
|
+
break;
|
|
35
|
+
case 'generate_cases':
|
|
36
|
+
await handleGenerateCases(target, evalTargetId, conversationId, postMessage, logger);
|
|
37
|
+
break;
|
|
38
|
+
case 'analyze_results':
|
|
39
|
+
case 'propose_changes':
|
|
40
|
+
await handleAnalyzeAndPropose(target, evalCases, messages, messageContent, conversationId, postMessage, logger);
|
|
41
|
+
break;
|
|
42
|
+
case 'respond':
|
|
43
|
+
await postMessage(decision.response, 'text');
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
async function decideAction(target, evalCases, messages, latestMessage, logger) {
|
|
48
|
+
// Build conversation summary for context
|
|
49
|
+
const recentMessages = messages.slice(-10).map((m) => `${m.role}: ${m.content.slice(0, 200)}`).join('\n');
|
|
50
|
+
const prompt = `You are an eval assistant. Decide what action to take based on the user's message.
|
|
51
|
+
|
|
52
|
+
## Current State
|
|
53
|
+
- Eval target: "${target.name}" v${target.version} (${target.type})
|
|
54
|
+
- Eval cases: ${evalCases.length} defined${evalCases.length > 0 ? ` (${evalCases.map((e) => e.name).join(', ')})` : ''}
|
|
55
|
+
- Content length: ${target.content.length} chars
|
|
56
|
+
|
|
57
|
+
## Recent Conversation
|
|
58
|
+
${recentMessages}
|
|
59
|
+
|
|
60
|
+
## User's Latest Message
|
|
61
|
+
${latestMessage}
|
|
62
|
+
|
|
63
|
+
## Available Actions
|
|
64
|
+
- run_evals: Run all eval cases against current version (with + without target). Choose this when the user wants to test, evaluate, or see how the instruction performs.
|
|
65
|
+
- generate_cases: Auto-generate eval test cases from the instruction content. Choose this when there are no eval cases (${evalCases.length} currently) or user asks to create/generate tests.
|
|
66
|
+
- analyze_results: Analyze recent eval failures and propose improvements based on user feedback. Choose this when user gives qualitative feedback like "this is wrong", "missing X", etc.
|
|
67
|
+
- propose_changes: Propose specific content edits based on conversation. Choose this when user asks for improvements or changes.
|
|
68
|
+
- respond: Just answer a question without running any evals. Choose this for informational questions.
|
|
69
|
+
|
|
70
|
+
Respond with ONLY valid JSON:
|
|
71
|
+
{"action": "run_evals", "response": "What you want to say to the user", "params": {}}`;
|
|
72
|
+
const result = await executeEval({ prompt, timeout: 30_000 });
|
|
73
|
+
try {
|
|
74
|
+
let jsonStr = result.output.trim();
|
|
75
|
+
const jsonMatch = jsonStr.match(/\{[\s\S]*\}/);
|
|
76
|
+
if (jsonMatch)
|
|
77
|
+
jsonStr = jsonMatch[0];
|
|
78
|
+
return JSON.parse(jsonStr);
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
logger('Failed to parse action decision, defaulting to respond');
|
|
82
|
+
// Fallback: simple heuristics
|
|
83
|
+
const lower = latestMessage.toLowerCase();
|
|
84
|
+
if (lower.includes('run') || lower.includes('test') || lower.includes('eval')) {
|
|
85
|
+
return { action: 'run_evals', response: 'Running evals now...' };
|
|
86
|
+
}
|
|
87
|
+
if (lower.includes('generate') || lower.includes('create') || (evalCases.length === 0 && lower.includes('start'))) {
|
|
88
|
+
return { action: 'generate_cases', response: 'Generating test cases...' };
|
|
89
|
+
}
|
|
90
|
+
return { action: 'respond', response: 'I can help you run evals, generate test cases, or analyze results. What would you like to do?' };
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
async function handleRunEvals(target, evalCases, _conversationId, postMessage, logger) {
|
|
94
|
+
if (evalCases.length === 0) {
|
|
95
|
+
await postMessage('No eval cases exist yet. Would you like me to generate some from the instruction content?', 'text');
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
await postMessage(`Running ${evalCases.length} evals against "${target.name}" v${target.version}...`, 'status');
|
|
99
|
+
const results = [];
|
|
100
|
+
// Run with_target
|
|
101
|
+
for (const eval_ of evalCases) {
|
|
102
|
+
logger(`Running: ${eval_.name} (with_target)`);
|
|
103
|
+
const execResult = await executeEval({
|
|
104
|
+
prompt: eval_.prompt,
|
|
105
|
+
targetContent: target.content,
|
|
106
|
+
timeout: 120_000,
|
|
107
|
+
});
|
|
108
|
+
let passed = false;
|
|
109
|
+
let evidence = '';
|
|
110
|
+
if (!execResult.error && eval_.expectations.length > 0) {
|
|
111
|
+
const grading = await gradeEvalOutput({
|
|
112
|
+
prompt: eval_.prompt,
|
|
113
|
+
output: execResult.output,
|
|
114
|
+
expectations: eval_.expectations,
|
|
115
|
+
timeout: 120_000,
|
|
116
|
+
});
|
|
117
|
+
const summary = grading?.summary;
|
|
118
|
+
passed = summary?.pass_rate >= 1.0;
|
|
119
|
+
evidence = grading?.expectations
|
|
120
|
+
?.map((e) => `${e.passed ? 'PASS' : 'FAIL'}: ${e.text} — ${e.evidence}`)
|
|
121
|
+
.join('\n') ?? '';
|
|
122
|
+
}
|
|
123
|
+
results.push({
|
|
124
|
+
evalName: eval_.name,
|
|
125
|
+
passed,
|
|
126
|
+
output: execResult.error ?? execResult.output.slice(0, 2000),
|
|
127
|
+
expectations: eval_.expectations,
|
|
128
|
+
evidence,
|
|
129
|
+
configuration: 'with_target',
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
const passedCount = results.filter((r) => r.passed).length;
|
|
133
|
+
const total = results.length;
|
|
134
|
+
await postMessage(`${passedCount} of ${total} evals passed (${Math.round((passedCount / total) * 100)}%)`, 'results', {
|
|
135
|
+
summary: { passed: passedCount, failed: total - passedCount, total, passRate: passedCount / total },
|
|
136
|
+
results: results.map((r) => ({
|
|
137
|
+
evalName: r.evalName,
|
|
138
|
+
passed: r.passed,
|
|
139
|
+
output: r.output,
|
|
140
|
+
expectations: r.expectations,
|
|
141
|
+
evidence: r.evidence,
|
|
142
|
+
})),
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
async function handleGenerateCases(target, _evalTargetId, _conversationId, postMessage, logger) {
|
|
146
|
+
await postMessage('Generating eval cases from instruction content...', 'status');
|
|
147
|
+
logger('Calling eval-from-context endpoint');
|
|
148
|
+
// Use eval-from-context endpoint
|
|
149
|
+
const result = await apiPost('/api/eval-from-context', {
|
|
150
|
+
contentHash: '',
|
|
151
|
+
name: target.name,
|
|
152
|
+
type: target.type,
|
|
153
|
+
content: target.content,
|
|
154
|
+
config: { skipBaseline: false, skipGrading: false },
|
|
155
|
+
});
|
|
156
|
+
const cases = result.evals ?? [];
|
|
157
|
+
await postMessage(`Generated ${cases.length} eval cases. Review them below:`, 'generated', {
|
|
158
|
+
cases: cases.map((c) => ({
|
|
159
|
+
id: c.id,
|
|
160
|
+
name: c.name,
|
|
161
|
+
prompt: c.prompt,
|
|
162
|
+
expectations: c.expectations,
|
|
163
|
+
})),
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
async function handleAnalyzeAndPropose(target, evalCases, messages, userFeedback, _conversationId, postMessage, logger) {
|
|
167
|
+
await postMessage('Analyzing results and preparing improvements...', 'status');
|
|
168
|
+
// Find the most recent results message for context
|
|
169
|
+
const lastResults = [...messages]
|
|
170
|
+
.reverse()
|
|
171
|
+
.find((m) => m.type === 'results');
|
|
172
|
+
const evalResults = lastResults?.data?.results?.map((r) => ({
|
|
173
|
+
evalName: r.evalName,
|
|
174
|
+
prompt: '',
|
|
175
|
+
expectations: r.expectations ?? [],
|
|
176
|
+
grading: {
|
|
177
|
+
summary: { pass_rate: r.passed ? 1 : 0 },
|
|
178
|
+
expectations: r.expectations?.map((e) => ({
|
|
179
|
+
text: e,
|
|
180
|
+
passed: r.passed,
|
|
181
|
+
evidence: r.evidence ?? '',
|
|
182
|
+
})),
|
|
183
|
+
},
|
|
184
|
+
})) ?? [];
|
|
185
|
+
logger(`Analyzing ${evalResults.length} eval results with user feedback`);
|
|
186
|
+
// Include user feedback in the analysis
|
|
187
|
+
const analysis = await analyzeEvalResults({
|
|
188
|
+
content: target.content,
|
|
189
|
+
evalResults,
|
|
190
|
+
model: undefined,
|
|
191
|
+
timeout: 120_000,
|
|
192
|
+
userFeedback,
|
|
193
|
+
});
|
|
194
|
+
await postMessage(analysis.overallAssessment, 'proposal', {
|
|
195
|
+
suggestions: analysis.suggestions,
|
|
196
|
+
proposedContent: analysis.proposedContent,
|
|
197
|
+
fromVersion: target.version,
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=eval-conversation-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eval-conversation-handler.js","sourceRoot":"","sources":["../../src/lib/eval-conversation-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAyCxD,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,SAAgC,EAChC,YAAoB,EACpB,MAA6B;IAE7B,MAAM,EAAE,cAAc,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,SAAS,CAAC;IAEhE,gBAAgB;IAChB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAa,qBAAqB,YAAY,EAAE,CAAC,CAAC;IAC7E,MAAM,SAAS,GAAG,MAAM,MAAM,CAAa,qBAAqB,YAAY,QAAQ,CAAC,CAAC;IACtF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAC3B,2BAA2B,cAAc,WAAW,CACrD,CAAC;IAEF,8FAA8F;IAC9F,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;IAC7D,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QAChB,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CACjD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAChI,CAAC;QACF,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,CAAC,WAAW,SAAS,mDAAmD,CAAC,CAAC;YAChF,OAAO;QACT,CAAC;IACH,CAAC;IAED,oCAAoC;IACpC,MAAM,WAAW,GAAG,KAAK,EAAE,OAAe,EAAE,IAAY,EAAE,IAA8B,EAAE,EAAE;QAC1F,MAAM,OAAO,CAAC,2BAA2B,cAAc,qBAAqB,EAAE;YAC5E,OAAO;YACP,IAAI;YACJ,IAAI;SACL,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,6BAA6B;IAC7B,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC;IAEzF,MAAM,CAAC,WAAW,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAErC,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAAC;QACxB,KAAK,WAAW;YACd,MAAM,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;YAC7E,MAAM;QAER,KAAK,gBAAgB;YACnB,MAAM,mBAAmB,CAAC,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;YACrF,MAAM;QAER,KAAK,iBAAiB,CAAC;QACvB,KAAK,iBAAiB;YACpB,MAAM,uBAAuB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;YAChH,MAAM;QAER,KAAK,SAAS;YACZ,MAAM,WAAW,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC7C,MAAM;IACV,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,MAAkB,EAClB,SAAqB,EACrB,QAA+B,EAC/B,aAAqB,EACrB,MAA6B;IAE7B,yCAAyC;IACzC,MAAM,cAAc,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACnD,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CACxC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,MAAM,MAAM,GAAG;;;kBAGC,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC,OAAO,KAAK,MAAM,CAAC,IAAI;gBACjD,SAAS,CAAC,MAAM,WAAW,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;oBAClG,MAAM,CAAC,OAAO,CAAC,MAAM;;;EAGvC,cAAc;;;EAGd,aAAa;;;;0HAI2G,SAAS,CAAC,MAAM;;;;;;sFAMpD,CAAC;IAErF,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IAE9D,IAAI,CAAC;QACH,IAAI,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAC/C,IAAI,SAAS;YAAE,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAmB,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,CAAC,wDAAwD,CAAC,CAAC;QACjE,8BAA8B;QAC9B,MAAM,KAAK,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC;QAC1C,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9E,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,sBAAsB,EAAE,CAAC;QACnE,CAAC;QACD,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YAClH,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,0BAA0B,EAAE,CAAC;QAC5E,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,+FAA+F,EAAE,CAAC;IAC1I,CAAC;AACH,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,MAAkB,EAClB,SAAqB,EACrB,eAAuB,EACvB,WAA6F,EAC7F,MAA6B;IAE7B,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,WAAW,CACf,2FAA2F,EAC3F,MAAM,CACP,CAAC;QACF,OAAO;IACT,CAAC;IAED,MAAM,WAAW,CAAC,WAAW,SAAS,CAAC,MAAM,mBAAmB,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC,OAAO,KAAK,EAAE,QAAQ,CAAC,CAAC;IAEhH,MAAM,OAAO,GAOR,EAAE,CAAC;IAER,kBAAkB;IAClB,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;QAC9B,MAAM,CAAC,YAAY,KAAK,CAAC,IAAI,gBAAgB,CAAC,CAAC;QAC/C,MAAM,UAAU,GAAG,MAAM,WAAW,CAAC;YACnC,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,aAAa,EAAE,MAAM,CAAC,OAAO;YAC7B,OAAO,EAAE,OAAO;SACjB,CAAC,CAAC;QAEH,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,IAAI,QAAQ,GAAG,EAAE,CAAC;QAElB,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,KAAK,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvD,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC;gBACpC,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,MAAM,EAAE,UAAU,CAAC,MAAM;gBACzB,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,OAAO,EAAE,OAAO;aACjB,CAAC,CAAC;YACH,MAAM,OAAO,GAAI,OAAe,EAAE,OAAO,CAAC;YAC1C,MAAM,GAAG,OAAO,EAAE,SAAS,IAAI,GAAG,CAAC;YACnC,QAAQ,GAAI,OAAe,EAAE,YAAY;gBACvC,EAAE,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;iBAC5E,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACtB,CAAC;QAED,OAAO,CAAC,IAAI,CAAC;YACX,QAAQ,EAAE,KAAK,CAAC,IAAI;YACpB,MAAM;YACN,MAAM,EAAE,UAAU,CAAC,KAAK,IAAI,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;YAC5D,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,QAAQ;YACR,aAAa,EAAE,aAAa;SAC7B,CAAC,CAAC;IACL,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;IAC3D,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC;IAE7B,MAAM,WAAW,CACf,GAAG,WAAW,OAAO,KAAK,kBAAkB,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,IAAI,EACvF,SAAS,EACT;QACE,OAAO,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,GAAG,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,GAAG,KAAK,EAAE;QACnG,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3B,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,YAAY,EAAE,CAAC,CAAC,YAAY;YAC5B,QAAQ,EAAE,CAAC,CAAC,QAAQ;SACrB,CAAC,CAAC;KACJ,CACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,MAAkB,EAClB,aAAqB,EACrB,eAAuB,EACvB,WAA6F,EAC7F,MAA6B;IAE7B,MAAM,WAAW,CAAC,mDAAmD,EAAE,QAAQ,CAAC,CAAC;IAEjF,MAAM,CAAC,oCAAoC,CAAC,CAAC;IAE7C,iCAAiC;IACjC,MAAM,MAAM,GAAG,MAAM,OAAO,CAIzB,wBAAwB,EAAE;QAC3B,WAAW,EAAE,EAAE;QACf,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,MAAM,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE;KACpD,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;IAEjC,MAAM,WAAW,CACf,aAAa,KAAK,CAAC,MAAM,iCAAiC,EAC1D,WAAW,EACX;QACE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACvB,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,YAAY,EAAE,CAAC,CAAC,YAAY;SAC7B,CAAC,CAAC;KACJ,CACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,uBAAuB,CACpC,MAAkB,EAClB,SAAqB,EACrB,QAA+B,EAC/B,YAAoB,EACpB,eAAuB,EACvB,WAA6F,EAC7F,MAA6B;IAE7B,MAAM,WAAW,CAAC,iDAAiD,EAAE,QAAQ,CAAC,CAAC;IAE/E,mDAAmD;IACnD,MAAM,WAAW,GAAG,CAAC,GAAG,QAAQ,CAAC;SAC9B,OAAO,EAAE;SACT,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IAErC,MAAM,WAAW,GAAI,WAAW,EAAE,IAAY,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;QACxE,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,MAAM,EAAE,EAAE;QACV,YAAY,EAAE,CAAC,CAAC,YAAY,IAAI,EAAE;QAClC,OAAO,EAAE;YACP,OAAO,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;YACxC,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC;gBAChD,IAAI,EAAE,CAAC;gBACP,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,EAAE;aAC3B,CAAC,CAAC;SACJ;KACF,CAAC,CAAC,IAAI,EAAE,CAAC;IAEV,MAAM,CAAC,aAAa,WAAW,CAAC,MAAM,kCAAkC,CAAC,CAAC;IAE1E,wCAAwC;IACxC,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC;QACxC,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,WAAW;QACX,KAAK,EAAE,SAAS;QAChB,OAAO,EAAE,OAAO;QAChB,YAAY;KACb,CAAC,CAAC;IAEH,MAAM,WAAW,CACf,QAAQ,CAAC,iBAAiB,EAC1B,UAAU,EACV;QACE,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,eAAe,EAAE,QAAQ,CAAC,eAAe;QACzC,WAAW,EAAE,MAAM,CAAC,OAAO;KAC5B,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface EvalExecutorOptions {
|
|
2
|
+
prompt: string;
|
|
3
|
+
targetContent?: string;
|
|
4
|
+
systemPrompt?: string;
|
|
5
|
+
workDir?: string;
|
|
6
|
+
timeout?: number;
|
|
7
|
+
model?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface EvalExecutorResult {
|
|
10
|
+
output: string;
|
|
11
|
+
exitCode: number | null;
|
|
12
|
+
durationMs: number;
|
|
13
|
+
totalTokens: number;
|
|
14
|
+
error?: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Executes a prompt via `claude -p` and captures the output.
|
|
18
|
+
* Optionally injects target content as a system prompt.
|
|
19
|
+
*/
|
|
20
|
+
export declare function executeEval(options: EvalExecutorOptions): Promise<EvalExecutorResult>;
|
|
21
|
+
//# sourceMappingURL=eval-executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eval-executor.d.ts","sourceRoot":"","sources":["../../src/lib/eval-executor.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA2F3F"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
/**
|
|
3
|
+
* Executes a prompt via `claude -p` and captures the output.
|
|
4
|
+
* Optionally injects target content as a system prompt.
|
|
5
|
+
*/
|
|
6
|
+
export async function executeEval(options) {
|
|
7
|
+
const { prompt, targetContent, systemPrompt, workDir = process.cwd(), timeout = 120_000, model, } = options;
|
|
8
|
+
const args = ['-p', prompt, '--output-format', 'json'];
|
|
9
|
+
const sysPrompt = targetContent ?? systemPrompt;
|
|
10
|
+
if (sysPrompt) {
|
|
11
|
+
args.push('--system-prompt', sysPrompt);
|
|
12
|
+
}
|
|
13
|
+
if (model) {
|
|
14
|
+
args.push('--model', model);
|
|
15
|
+
}
|
|
16
|
+
const startTime = Date.now();
|
|
17
|
+
return new Promise((resolve) => {
|
|
18
|
+
// Remove CLAUDECODE flag so spawned claude doesn't think it's a nested session,
|
|
19
|
+
// but keep CLAUDE_CODE_SSE_PORT etc. so it can still authenticate
|
|
20
|
+
const env = { ...process.env };
|
|
21
|
+
delete env.CLAUDECODE;
|
|
22
|
+
const proc = spawn('claude', args, {
|
|
23
|
+
cwd: workDir,
|
|
24
|
+
env,
|
|
25
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
26
|
+
});
|
|
27
|
+
let stdout = '';
|
|
28
|
+
let stderr = '';
|
|
29
|
+
proc.stdout.on('data', (data) => {
|
|
30
|
+
stdout += data.toString();
|
|
31
|
+
});
|
|
32
|
+
proc.stderr.on('data', (data) => {
|
|
33
|
+
stderr += data.toString();
|
|
34
|
+
});
|
|
35
|
+
const timer = setTimeout(() => {
|
|
36
|
+
proc.kill('SIGTERM');
|
|
37
|
+
resolve({
|
|
38
|
+
output: stdout,
|
|
39
|
+
exitCode: null,
|
|
40
|
+
durationMs: Date.now() - startTime,
|
|
41
|
+
totalTokens: 0,
|
|
42
|
+
error: `Timed out after ${timeout}ms`,
|
|
43
|
+
});
|
|
44
|
+
}, timeout);
|
|
45
|
+
proc.on('close', (code) => {
|
|
46
|
+
clearTimeout(timer);
|
|
47
|
+
const durationMs = Date.now() - startTime;
|
|
48
|
+
// Try to parse JSON output for token usage
|
|
49
|
+
let totalTokens = 0;
|
|
50
|
+
let output = stdout;
|
|
51
|
+
try {
|
|
52
|
+
const parsed = JSON.parse(stdout);
|
|
53
|
+
output = parsed.result ?? parsed.content ?? stdout;
|
|
54
|
+
totalTokens = parsed.usage?.total_tokens
|
|
55
|
+
?? ((parsed.usage?.input_tokens ?? 0) + (parsed.usage?.output_tokens ?? 0));
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
// stdout wasn't JSON, use raw text
|
|
59
|
+
}
|
|
60
|
+
resolve({
|
|
61
|
+
output,
|
|
62
|
+
exitCode: code,
|
|
63
|
+
durationMs,
|
|
64
|
+
totalTokens,
|
|
65
|
+
error: code !== 0 ? stderr || `Exit code ${code}` : undefined,
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
proc.on('error', (err) => {
|
|
69
|
+
clearTimeout(timer);
|
|
70
|
+
resolve({
|
|
71
|
+
output: '',
|
|
72
|
+
exitCode: null,
|
|
73
|
+
durationMs: Date.now() - startTime,
|
|
74
|
+
totalTokens: 0,
|
|
75
|
+
error: `Failed to spawn claude: ${err.message}`,
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=eval-executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eval-executor.js","sourceRoot":"","sources":["../../src/lib/eval-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eval-executor.test.d.ts","sourceRoot":"","sources":["../../src/lib/eval-executor.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
describe('eval-executor', () => {
|
|
3
|
+
it('module exports executeEval function', async () => {
|
|
4
|
+
const mod = await import('./eval-executor.js');
|
|
5
|
+
expect(typeof mod.executeEval).toBe('function');
|
|
6
|
+
});
|
|
7
|
+
});
|
|
8
|
+
//# sourceMappingURL=eval-executor.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eval-executor.test.js","sourceRoot":"","sources":["../../src/lib/eval-executor.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE9C,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAC/C,MAAM,CAAC,OAAO,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export interface GradingExpectation {
|
|
2
|
+
text: string;
|
|
3
|
+
passed: boolean;
|
|
4
|
+
evidence: string;
|
|
5
|
+
}
|
|
6
|
+
export interface GradingResult {
|
|
7
|
+
expectations: GradingExpectation[];
|
|
8
|
+
summary: {
|
|
9
|
+
passed: number;
|
|
10
|
+
failed: number;
|
|
11
|
+
total: number;
|
|
12
|
+
pass_rate: number;
|
|
13
|
+
};
|
|
14
|
+
claims: Array<{
|
|
15
|
+
claim: string;
|
|
16
|
+
type: 'factual' | 'process' | 'quality';
|
|
17
|
+
verified: boolean;
|
|
18
|
+
evidence: string;
|
|
19
|
+
}>;
|
|
20
|
+
eval_feedback: {
|
|
21
|
+
suggestions: Array<{
|
|
22
|
+
assertion?: string;
|
|
23
|
+
reason: string;
|
|
24
|
+
}>;
|
|
25
|
+
overall: string;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Grades an eval output against expectations using an LLM grader.
|
|
30
|
+
*/
|
|
31
|
+
export declare function gradeEvalOutput(options: {
|
|
32
|
+
prompt: string;
|
|
33
|
+
output: string;
|
|
34
|
+
expectations: string[];
|
|
35
|
+
model?: string;
|
|
36
|
+
timeout?: number;
|
|
37
|
+
}): Promise<GradingResult>;
|
|
38
|
+
//# sourceMappingURL=eval-grader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eval-grader.d.ts","sourceRoot":"","sources":["../../src/lib/eval-grader.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,kBAAkB,EAAE,CAAC;IACnC,OAAO,EAAE;QACP,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,MAAM,EAAE,KAAK,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;QACxC,QAAQ,EAAE,OAAO,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC,CAAC;IACH,aAAa,EAAE;QACb,WAAW,EAAE,KAAK,CAAC;YAAE,SAAS,CAAC,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAC3D,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAgDD;;GAEG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,aAAa,CAAC,CA8EzB"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { executeEval } from './eval-executor.js';
|
|
2
|
+
const GRADER_SYSTEM_PROMPT = `You are a rigorous eval grader. Your job is to evaluate whether an AI assistant's output meets a set of expectations.
|
|
3
|
+
|
|
4
|
+
You will receive:
|
|
5
|
+
1. The original prompt that was given to the AI
|
|
6
|
+
2. The AI's output/response
|
|
7
|
+
3. A list of expectations (assertions) to evaluate
|
|
8
|
+
|
|
9
|
+
For each expectation:
|
|
10
|
+
- Search the output for evidence that the expectation is met
|
|
11
|
+
- Determine PASS or FAIL (no partial credit)
|
|
12
|
+
- Cite specific evidence (quote or description)
|
|
13
|
+
|
|
14
|
+
PASS criteria:
|
|
15
|
+
- Clear evidence the assertion is true
|
|
16
|
+
- Evidence reflects genuine completion, not surface compliance
|
|
17
|
+
|
|
18
|
+
FAIL criteria:
|
|
19
|
+
- No evidence found
|
|
20
|
+
- Evidence contradicts the expectation
|
|
21
|
+
- Cannot verify from available information
|
|
22
|
+
|
|
23
|
+
Beyond the predefined expectations, extract implicit claims from the output:
|
|
24
|
+
- Factual claims ("uses TypeScript", "has 3 parameters")
|
|
25
|
+
- Process claims ("used async/await pattern")
|
|
26
|
+
- Quality claims ("handles edge cases")
|
|
27
|
+
|
|
28
|
+
Verify each claim against the actual output.
|
|
29
|
+
|
|
30
|
+
Finally, critique the eval itself — identify assertions that are too weak (pass for wrong outputs) or important outcomes that no assertion covers.
|
|
31
|
+
|
|
32
|
+
You MUST respond with ONLY a valid JSON object matching this exact structure (no markdown, no explanation, just JSON):
|
|
33
|
+
|
|
34
|
+
{
|
|
35
|
+
"expectations": [
|
|
36
|
+
{ "text": "assertion text", "passed": true, "evidence": "specific quote or description" }
|
|
37
|
+
],
|
|
38
|
+
"summary": { "passed": 2, "failed": 1, "total": 3, "pass_rate": 0.67 },
|
|
39
|
+
"claims": [
|
|
40
|
+
{ "claim": "statement", "type": "factual", "verified": true, "evidence": "..." }
|
|
41
|
+
],
|
|
42
|
+
"eval_feedback": {
|
|
43
|
+
"suggestions": [{ "assertion": "suggested new assertion", "reason": "why it matters" }],
|
|
44
|
+
"overall": "brief summary assessment"
|
|
45
|
+
}
|
|
46
|
+
}`;
|
|
47
|
+
/**
|
|
48
|
+
* Grades an eval output against expectations using an LLM grader.
|
|
49
|
+
*/
|
|
50
|
+
export async function gradeEvalOutput(options) {
|
|
51
|
+
const { prompt, output, expectations, model, timeout = 120_000 } = options;
|
|
52
|
+
const graderPrompt = `## Original Prompt
|
|
53
|
+
|
|
54
|
+
${prompt}
|
|
55
|
+
|
|
56
|
+
## AI Output
|
|
57
|
+
|
|
58
|
+
${output}
|
|
59
|
+
|
|
60
|
+
## Expectations to Evaluate
|
|
61
|
+
|
|
62
|
+
${expectations.map((e, i) => `${i + 1}. ${e}`).join('\n')}
|
|
63
|
+
|
|
64
|
+
Grade the output against each expectation. Respond with ONLY valid JSON.`;
|
|
65
|
+
const result = await executeEval({
|
|
66
|
+
prompt: graderPrompt,
|
|
67
|
+
targetContent: GRADER_SYSTEM_PROMPT,
|
|
68
|
+
timeout,
|
|
69
|
+
model,
|
|
70
|
+
});
|
|
71
|
+
if (result.error) {
|
|
72
|
+
// Return a failed grading if the grader itself errors
|
|
73
|
+
return {
|
|
74
|
+
expectations: expectations.map((e) => ({
|
|
75
|
+
text: e,
|
|
76
|
+
passed: false,
|
|
77
|
+
evidence: `Grader error: ${result.error}`,
|
|
78
|
+
})),
|
|
79
|
+
summary: { passed: 0, failed: expectations.length, total: expectations.length, pass_rate: 0 },
|
|
80
|
+
claims: [],
|
|
81
|
+
eval_feedback: { suggestions: [], overall: `Grading failed: ${result.error}` },
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
// Parse the grader's JSON response
|
|
85
|
+
try {
|
|
86
|
+
// Extract JSON from the output (handle potential markdown wrapping)
|
|
87
|
+
let jsonStr = result.output.trim();
|
|
88
|
+
const jsonMatch = jsonStr.match(/```(?:json)?\s*([\s\S]*?)```/);
|
|
89
|
+
if (jsonMatch) {
|
|
90
|
+
jsonStr = jsonMatch[1].trim();
|
|
91
|
+
}
|
|
92
|
+
// Also try to find JSON object directly
|
|
93
|
+
const objMatch = jsonStr.match(/\{[\s\S]*\}/);
|
|
94
|
+
if (objMatch) {
|
|
95
|
+
jsonStr = objMatch[0];
|
|
96
|
+
}
|
|
97
|
+
const parsed = JSON.parse(jsonStr);
|
|
98
|
+
// Validate and ensure summary is correct
|
|
99
|
+
const passed = parsed.expectations.filter((e) => e.passed).length;
|
|
100
|
+
const total = parsed.expectations.length;
|
|
101
|
+
parsed.summary = {
|
|
102
|
+
passed,
|
|
103
|
+
failed: total - passed,
|
|
104
|
+
total,
|
|
105
|
+
pass_rate: total > 0 ? passed / total : 0,
|
|
106
|
+
};
|
|
107
|
+
return parsed;
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
// If we can't parse, return a best-effort result
|
|
111
|
+
return {
|
|
112
|
+
expectations: expectations.map((e) => ({
|
|
113
|
+
text: e,
|
|
114
|
+
passed: false,
|
|
115
|
+
evidence: 'Grader output was not valid JSON',
|
|
116
|
+
})),
|
|
117
|
+
summary: { passed: 0, failed: expectations.length, total: expectations.length, pass_rate: 0 },
|
|
118
|
+
claims: [],
|
|
119
|
+
eval_feedback: { suggestions: [], overall: `Grader returned unparseable output: ${result.output.slice(0, 200)}` },
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=eval-grader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eval-grader.js","sourceRoot":"","sources":["../../src/lib/eval-grader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eval-grader.test.d.ts","sourceRoot":"","sources":["../../src/lib/eval-grader.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
describe('eval-grader', () => {
|
|
3
|
+
it('module exports gradeEvalOutput function', async () => {
|
|
4
|
+
const mod = await import('./eval-grader.js');
|
|
5
|
+
expect(typeof mod.gradeEvalOutput).toBe('function');
|
|
6
|
+
});
|
|
7
|
+
});
|
|
8
|
+
//# sourceMappingURL=eval-grader.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eval-grader.test.js","sourceRoot":"","sources":["../../src/lib/eval-grader.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE9C,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;QAC7C,MAAM,CAAC,OAAO,GAAG,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { GradingResult } from './eval-grader.js';
|
|
2
|
+
export interface MetaJudgement {
|
|
3
|
+
quality_score: number;
|
|
4
|
+
issues: MetaIssue[];
|
|
5
|
+
recommendations: string[];
|
|
6
|
+
summary: string;
|
|
7
|
+
}
|
|
8
|
+
export interface MetaIssue {
|
|
9
|
+
type: 'weak_expectation' | 'inconsistent_grading' | 'trivial_test' | 'untestable_expectation' | 'all_pass_suspicious';
|
|
10
|
+
severity: 'low' | 'medium' | 'high';
|
|
11
|
+
description: string;
|
|
12
|
+
affected_eval?: string;
|
|
13
|
+
}
|
|
14
|
+
interface MetaJudgeInput {
|
|
15
|
+
targetName: string;
|
|
16
|
+
evalResults: Array<{
|
|
17
|
+
evalName: string;
|
|
18
|
+
prompt: string;
|
|
19
|
+
expectations: string[];
|
|
20
|
+
grading: GradingResult | null;
|
|
21
|
+
output?: string;
|
|
22
|
+
}>;
|
|
23
|
+
model?: string;
|
|
24
|
+
timeout?: number;
|
|
25
|
+
}
|
|
26
|
+
export declare function judgeEvalQuality(input: MetaJudgeInput): Promise<MetaJudgement>;
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=eval-meta-judge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eval-meta-judge.d.ts","sourceRoot":"","sources":["../../src/lib/eval-meta-judge.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,kBAAkB,GAAG,sBAAsB,GAAG,cAAc,GAAG,wBAAwB,GAAG,qBAAqB,CAAC;IACtH,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAmCD,UAAU,cAAc;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,KAAK,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,YAAY,EAAE,MAAM,EAAE,CAAC;QACvB,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC;QAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAuEpF"}
|