@cursor/bdk 0.2.9 → 0.2.10
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/artifacts.js +3 -5
- package/dist/bin/agent-serve.js +803 -812
- package/dist/channels/bitbucket/api.js +305 -321
- package/dist/channels/bitbucket/binding.js +97 -61
- package/dist/channels/bitbucket/bitbucket-channel.d.ts +15 -1
- package/dist/channels/bitbucket/bitbucket-channel.d.ts.map +1 -1
- package/dist/channels/bitbucket/bitbucket-channel.js +95 -42
- package/dist/channels/bitbucket/bitbucket-webhook.d.ts +11 -0
- package/dist/channels/bitbucket/bitbucket-webhook.d.ts.map +1 -1
- package/dist/channels/bitbucket/bitbucket-webhook.js +214 -204
- package/dist/channels/bitbucket/checks.js +9 -21
- package/dist/channels/bitbucket/cursor-account.js +1 -1
- package/dist/channels/bitbucket/defaults.js +14 -4
- package/dist/channels/bitbucket/events.js +1 -2
- package/dist/channels/bitbucket/index.d.ts +6 -2
- package/dist/channels/bitbucket/index.d.ts.map +1 -1
- package/dist/channels/bitbucket/index.js +6 -2
- package/dist/channels/bitbucket/replay.js +80 -56
- package/dist/channels/bitbucket/state.js +16 -7
- package/dist/channels/bitbucket/types.d.ts +11 -2
- package/dist/channels/bitbucket/types.d.ts.map +1 -1
- package/dist/channels/checks.js +18 -28
- package/dist/channels/deployments/deployments-channel.js +26 -34
- package/dist/channels/github/api.js +216 -210
- package/dist/channels/github/auth.d.ts +5 -1
- package/dist/channels/github/auth.d.ts.map +1 -1
- package/dist/channels/github/auth.js +157 -174
- package/dist/channels/github/binding.js +48 -39
- package/dist/channels/github/checks.js +9 -14
- package/dist/channels/github/cursor-account.js +6 -11
- package/dist/channels/github/defaults.js +105 -130
- package/dist/channels/github/forward.js +13 -17
- package/dist/channels/github/github-channel.d.ts +43 -2
- package/dist/channels/github/github-channel.d.ts.map +1 -1
- package/dist/channels/github/github-channel.js +1228 -958
- package/dist/channels/github/progress.js +145 -146
- package/dist/channels/github/replay.js +30 -39
- package/dist/channels/github/state.js +40 -16
- package/dist/channels/github/types.d.ts +30 -6
- package/dist/channels/github/types.d.ts.map +1 -1
- package/dist/channels/gitlab/api.js +100 -114
- package/dist/channels/gitlab/binding.js +52 -33
- package/dist/channels/gitlab/checks.js +28 -29
- package/dist/channels/gitlab/cursor-account.js +1 -1
- package/dist/channels/gitlab/defaults.js +9 -3
- package/dist/channels/gitlab/gitlab-channel.d.ts +16 -1
- package/dist/channels/gitlab/gitlab-channel.d.ts.map +1 -1
- package/dist/channels/gitlab/gitlab-channel.js +95 -42
- package/dist/channels/gitlab/gitlab-webhook.d.ts +10 -1
- package/dist/channels/gitlab/gitlab-webhook.d.ts.map +1 -1
- package/dist/channels/gitlab/gitlab-webhook.js +282 -249
- package/dist/channels/gitlab/index.d.ts +6 -2
- package/dist/channels/gitlab/index.d.ts.map +1 -1
- package/dist/channels/gitlab/index.js +6 -2
- package/dist/channels/gitlab/replay.js +50 -27
- package/dist/channels/gitlab/state.js +14 -6
- package/dist/channels/gitlab/types.d.ts +13 -2
- package/dist/channels/gitlab/types.d.ts.map +1 -1
- package/dist/channels/origin/api.js +100 -116
- package/dist/channels/origin/binding.js +15 -16
- package/dist/channels/origin/checks.js +30 -28
- package/dist/channels/origin/defaults.js +50 -65
- package/dist/channels/origin/origin-channel.js +266 -272
- package/dist/channels/origin/origin-webhook.js +70 -88
- package/dist/channels/origin/reactions.js +9 -21
- package/dist/channels/origin/state.js +13 -5
- package/dist/channels/slack/agentic-delivery.js +426 -478
- package/dist/channels/slack/agentic-posted.js +9 -10
- package/dist/channels/slack/agentic-signals.js +2 -3
- package/dist/channels/slack/api.js +417 -427
- package/dist/channels/slack/approvals.js +1 -1
- package/dist/channels/slack/assistant.js +37 -47
- package/dist/channels/slack/attachments.js +188 -206
- package/dist/channels/slack/auth.js +8 -6
- package/dist/channels/slack/bot-mentions.js +31 -45
- package/dist/channels/slack/channel-watch.js +42 -48
- package/dist/channels/slack/cli-project.js +112 -137
- package/dist/channels/slack/code-fences.js +3 -5
- package/dist/channels/slack/constants.js +2 -2
- package/dist/channels/slack/credentials.js +23 -38
- package/dist/channels/slack/defaults.js +292 -331
- package/dist/channels/slack/dispatch.d.ts.map +1 -1
- package/dist/channels/slack/dispatch.js +533 -460
- package/dist/channels/slack/doctor.js +200 -214
- package/dist/channels/slack/eval-directive.js +79 -96
- package/dist/channels/slack/event-id-dedupe.js +1 -1
- package/dist/channels/slack/external-policy.js +26 -39
- package/dist/channels/slack/footer.js +28 -41
- package/dist/channels/slack/inbound.d.ts +1 -0
- package/dist/channels/slack/inbound.d.ts.map +1 -1
- package/dist/channels/slack/inbound.js +50 -31
- package/dist/channels/slack/init.d.ts +1 -5
- package/dist/channels/slack/init.d.ts.map +1 -1
- package/dist/channels/slack/init.js +42 -59
- package/dist/channels/slack/interactive.d.ts +9 -3
- package/dist/channels/slack/interactive.d.ts.map +1 -1
- package/dist/channels/slack/interactive.js +160 -162
- package/dist/channels/slack/links.js +1 -2
- package/dist/channels/slack/live-delivery.js +172 -190
- package/dist/channels/slack/manifest.d.ts.map +1 -1
- package/dist/channels/slack/manifest.js +44 -23
- package/dist/channels/slack/message-body.js +2 -2
- package/dist/channels/slack/nudge-carrier.js +30 -42
- package/dist/channels/slack/nudge-store.js +164 -191
- package/dist/channels/slack/paint-start.js +66 -81
- package/dist/channels/slack/placeholder.js +123 -152
- package/dist/channels/slack/pr-ref.js +1 -1
- package/dist/channels/slack/progress-delivery.js +65 -78
- package/dist/channels/slack/reasoning-card.js +36 -49
- package/dist/channels/slack/recording-sink.js +12 -24
- package/dist/channels/slack/reply-options.js +7 -12
- package/dist/channels/slack/self-identity.js +27 -35
- package/dist/channels/slack/sender-name.d.ts +12 -3
- package/dist/channels/slack/sender-name.d.ts.map +1 -1
- package/dist/channels/slack/sender-name.js +57 -61
- package/dist/channels/slack/setup.js +2 -4
- package/dist/channels/slack/slack-channel.d.ts +6 -4
- package/dist/channels/slack/slack-channel.d.ts.map +1 -1
- package/dist/channels/slack/slack-channel.js +441 -308
- package/dist/channels/slack/socket-mode.js +38 -52
- package/dist/channels/slack/thread-context.js +143 -160
- package/dist/channels/slack/tool-approval-events.js +149 -166
- package/dist/channels/slack/tool-cards.js +6 -11
- package/dist/channels/slack/tool-chip.js +1 -2
- package/dist/channels/slack/types.d.ts +15 -17
- package/dist/channels/slack/types.d.ts.map +1 -1
- package/dist/channels/slack/upload.js +84 -97
- package/dist/channels/slack/user-info.js +27 -41
- package/dist/channels.js +9 -20
- package/dist/dashboard-session-url.js +3 -4
- package/dist/docs/404.html +2 -2
- package/dist/docs/assets/{app.BNhEdGa8.js → app.DXI7bwox.js} +4 -4
- package/dist/docs/assets/{building-with-agents.md.BPjPFxFg.js → building-with-agents.md.Df87rAe1.js} +1 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.CtLtpWcx.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.DIdUV1Ph.js → VPLocalSearchBox.BrbO5mEe.js} +1 -1
- package/dist/docs/assets/chunks/{arc.lELI4_SR.js → arc.BOG1yms8.js} +1 -1
- package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.iCMdvuoM.js → architectureDiagram-Q4EWVU46.C0hsMZnZ.js} +1 -1
- package/dist/docs/assets/chunks/{baseUniq.C1-nDJBf.js → baseUniq.H044KjKs.js} +1 -1
- package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.ClemzBox.js → blockDiagram-DXYQGD6D.BsRW6GoB.js} +1 -1
- package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.BqTak6cR.js → c4Diagram-AHTNJAMY.B9HV5PFR.js} +1 -1
- package/dist/docs/assets/chunks/channel.CBwrU9rP.js +1 -0
- package/dist/docs/assets/chunks/{chunk-4BX2VUAB.CUS3qs_R.js → chunk-4BX2VUAB.CPoT_ajl.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-4TB4RGXK.dz5fdHcl.js → chunk-4TB4RGXK.DZBwWuCL.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-55IACEB6.D6BEBmve.js → chunk-55IACEB6.CZ3yTiyq.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-EDXVE4YY.B5uK4ID9.js → chunk-EDXVE4YY.6DfvHSd8.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-FMBD7UC4.PgOJgNQs.js → chunk-FMBD7UC4.CpBj8HfK.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-OYMX7WX6.CvkTrCii.js → chunk-OYMX7WX6.BdKo8YqS.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-QZHKN3VN.BnSfKYsB.js → chunk-QZHKN3VN.BnXNyxJx.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-YZCP3GAM.MZH6v5UC.js → chunk-YZCP3GAM.Cg1OcF8G.js} +1 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.CbC_mrvB.js +1 -0
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.CbC_mrvB.js +1 -0
- package/dist/docs/assets/chunks/clone.BTvFyY1a.js +1 -0
- package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.BBbw_YZi.js → cose-bilkent-S5V4N54A.1SP8al9c.js} +1 -1
- package/dist/docs/assets/chunks/{dagre-KV5264BT.CNJB2l7E.js → dagre-KV5264BT.DS1L6hJt.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-5BDNPKRD.BQzlnFfq.js → diagram-5BDNPKRD.ChsausbG.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.DkgqqZMz.js → diagram-G4DWMVQ6.3XsptNWj.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-MMDJMWI5.DIT8L7H_.js → diagram-MMDJMWI5.DPA9Dk_P.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-TYMM5635.3xLPZWGJ.js → diagram-TYMM5635.BVswXWrB.js} +1 -1
- package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.5_IHz8jF.js → erDiagram-SMLLAGMA.BSak5OSP.js} +1 -1
- package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.BGUCXz8A.js → flowDiagram-DWJPFMVM.CQgN4TTz.js} +1 -1
- package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.DbfFavS1.js → ganttDiagram-T4ZO3ILL.GrT0kA4a.js} +1 -1
- package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.D2yKdeNW.js → gitGraphDiagram-UUTBAWPF.CdS7Ucll.js} +1 -1
- package/dist/docs/assets/chunks/{graph.CSCxwHba.js → graph.BVqKRmRo.js} +1 -1
- package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.FDeb6xHY.js → infoDiagram-42DDH7IO.C3C9FRto.js} +1 -1
- package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.DbeYs9VL.js → ishikawaDiagram-UXIWVN3A.2FuAh_Zj.js} +1 -1
- package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.CWjKINpx.js → journeyDiagram-VCZTEJTY.CaHMfK4b.js} +1 -1
- package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.B4FrAlwz.js → kanban-definition-6JOO6SKY.CjhIUwcA.js} +1 -1
- package/dist/docs/assets/chunks/{layout.DFGxQ9ab.js → layout.CGU3gfSf.js} +1 -1
- package/dist/docs/assets/chunks/{linear.BmjZ-G59.js → linear.DaihpW_n.js} +1 -1
- package/dist/docs/assets/chunks/{min.DZSxulMW.js → min.BS-j8kHQ.js} +1 -1
- package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.CHLi3-aN.js → mindmap-definition-QFDTVHPH.BVJ1Bbnk.js} +1 -1
- package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.DteG-CkU.js → pieDiagram-DEJITSTG.Cz1WIv9r.js} +1 -1
- package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.D458ipN3.js → quadrantDiagram-34T5L4WZ.DKLFxcjy.js} +1 -1
- package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.DcFgUxst.js → requirementDiagram-MS252O5E.BHegiK7x.js} +1 -1
- package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.BwQAMmSA.js → sankeyDiagram-XADWPNL6.DYkY6yPc.js} +1 -1
- package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.B_Xdsrh9.js → sequenceDiagram-FGHM5R23.DYQ1QUrI.js} +1 -1
- package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.CdfDW6-C.js → stateDiagram-FHFEXIEX.Iru8BsFo.js} +1 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.BYXl4LW6.js +1 -0
- package/dist/docs/assets/chunks/{theme.sfdL3srp.js → theme.DaplWQhQ.js} +2 -2
- package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.56-4hXaC.js → timeline-definition-GMOUNBTQ.BwFA8hiX.js} +1 -1
- package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.CvZSQBO7.js → vennDiagram-DHZGUBPP.CZ60W1C_.js} +1 -1
- package/dist/docs/assets/chunks/{wardley-RL74JXVD.C9qc8k39.js → wardley-RL74JXVD.iXazD3Z7.js} +1 -1
- package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.D9s0nihi.js → wardleyDiagram-NUSXRM2D.B69D2r8-.js} +1 -1
- package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.BVJSpYrC.js → xychartDiagram-5P7HB3ND.CLPZEIU9.js} +1 -1
- package/dist/docs/assets/{deployment.md.BdqTiGdc.js → deployment.md.BYuEcDBv.js} +2 -2
- package/dist/docs/assets/{guides_bitbucket.md.BB6fqD-M.js → guides_bitbucket.md.CKUayYtD.js} +3 -3
- package/dist/docs/assets/{guides_bitbucket.md.BB6fqD-M.lean.js → guides_bitbucket.md.CKUayYtD.lean.js} +1 -1
- package/dist/docs/assets/{guides_github.md.Cr1Xlf-m.js → guides_github.md.TuNiZAOQ.js} +4 -4
- package/dist/docs/assets/{guides_github.md.Cr1Xlf-m.lean.js → guides_github.md.TuNiZAOQ.lean.js} +1 -1
- package/dist/docs/assets/{guides_gitlab.md.CMpmFi4M.js → guides_gitlab.md.CtNI4fSH.js} +4 -4
- package/dist/docs/assets/{guides_gitlab.md.CMpmFi4M.lean.js → guides_gitlab.md.CtNI4fSH.lean.js} +1 -1
- package/dist/docs/assets/guides_migrate.md.sCAvvlC6.js +7 -0
- package/dist/docs/assets/guides_migrate.md.sCAvvlC6.lean.js +1 -0
- package/dist/docs/assets/{reference_cli.md.GwugN3n-.js → reference_cli.md.dYCAL2lB.js} +4 -3
- package/dist/docs/assets/reference_cli.md.dYCAL2lB.lean.js +1 -0
- package/dist/docs/assets/{reference_skills.md.ClkMoQsV.js → reference_skills.md.C0guGcH0.js} +3 -3
- package/dist/docs/assets/troubleshooting.md.x-GBa7wN.js +1 -0
- package/dist/docs/assets/{troubleshooting.md.Bscj6ODe.lean.js → troubleshooting.md.x-GBa7wN.lean.js} +1 -1
- package/dist/docs/building-with-agents.html +37 -37
- package/dist/docs/building-with-agents.md +2 -0
- package/dist/docs/deployment.html +38 -38
- package/dist/docs/deployment.md +7 -0
- package/dist/docs/evals.html +36 -36
- package/dist/docs/guides/agent-to-agent.html +35 -35
- package/dist/docs/guides/bitbucket.html +38 -38
- package/dist/docs/guides/bitbucket.md +9 -1
- package/dist/docs/guides/cloud-agents.html +35 -35
- package/dist/docs/guides/convert-automation.html +35 -35
- package/dist/docs/guides/github.html +39 -39
- package/dist/docs/guides/github.md +20 -4
- package/dist/docs/guides/gitlab.html +38 -38
- package/dist/docs/guides/gitlab.md +9 -1
- package/dist/docs/guides/grokbot-agents.html +35 -35
- package/dist/docs/guides/hooks.html +35 -35
- package/dist/docs/guides/improve.html +35 -35
- package/dist/docs/guides/jev.html +35 -35
- package/dist/docs/guides/mcp-oauth.html +35 -35
- package/dist/docs/guides/migrate.html +66 -0
- package/dist/docs/guides/migrate.md +122 -0
- package/dist/docs/guides/opentelemetry.html +35 -35
- package/dist/docs/guides/slack.html +35 -35
- package/dist/docs/guides/webhooks.html +35 -35
- package/dist/docs/hashmap.json +1 -1
- package/dist/docs/hillclimbing.html +35 -35
- package/dist/docs/index.html +35 -35
- package/dist/docs/llms-full.txt +214 -6
- package/dist/docs/llms.txt +1 -0
- package/dist/docs/quickstart.html +35 -35
- package/dist/docs/reference/agent-config.html +35 -35
- package/dist/docs/reference/artifacts.html +35 -35
- package/dist/docs/reference/channels.html +35 -35
- package/dist/docs/reference/cli.html +39 -38
- package/dist/docs/reference/cli.md +39 -0
- package/dist/docs/reference/connections.html +35 -35
- package/dist/docs/reference/evals.html +35 -35
- package/dist/docs/reference/extensions.html +35 -35
- package/dist/docs/reference/hooks.html +35 -35
- package/dist/docs/reference/http-api.html +35 -35
- package/dist/docs/reference/instructions.html +35 -35
- package/dist/docs/reference/playground.html +35 -35
- package/dist/docs/reference/project-layout.html +35 -35
- package/dist/docs/reference/prompt.html +35 -35
- package/dist/docs/reference/schedules.html +35 -35
- package/dist/docs/reference/sessions.html +35 -35
- package/dist/docs/reference/skills.html +38 -38
- package/dist/docs/reference/subagents.html +35 -35
- package/dist/docs/reference/tools.html +35 -35
- package/dist/docs/templates/agentic-owners.html +35 -35
- package/dist/docs/templates/grokbot-agents.html +35 -35
- package/dist/docs/templates/security-reviewer.html +35 -35
- package/dist/docs/templates/thermo-quality-review.html +35 -35
- package/dist/docs/templates/thermo-review.html +35 -35
- package/dist/docs/templates/triage.html +35 -35
- package/dist/docs/troubleshooting.html +36 -36
- package/dist/docs/troubleshooting.md +1 -0
- package/dist/evals/assertions.js +20 -34
- package/dist/evals/expect.js +3 -6
- package/dist/evals/judge.js +5 -8
- package/dist/evals/loaders.js +45 -62
- package/dist/evals/matchers.js +2 -3
- package/dist/evals/reporters.js +43 -67
- package/dist/evals/results.js +1 -1
- package/dist/evals/run-facts.js +5 -6
- package/dist/evals.js +27 -15
- package/dist/extensions/cursor-cloud-agents/extension.js +4 -1
- package/dist/extensions/cursor-cloud-agents/lib/backend.js +100 -126
- package/dist/extensions/cursor-cloud-agents/lib/fleet.js +22 -38
- package/dist/extensions/cursor-cloud-agents/lib/repos.js +8 -10
- package/dist/extensions/cursor-cloud-agents/lib/transcript.js +2 -3
- package/dist/extensions/cursor-cloud-agents/lib/watch.js +52 -66
- package/dist/extensions/cursor-cloud-agents/reminders/cloud-agent-stop-watch.js +29 -40
- package/dist/extensions/cursor-cloud-agents/tools/cancel.js +6 -17
- package/dist/extensions/cursor-cloud-agents/tools/dump.js +25 -36
- package/dist/extensions/cursor-cloud-agents/tools/get.js +3 -14
- package/dist/extensions/cursor-cloud-agents/tools/launch.js +13 -21
- package/dist/extensions/cursor-cloud-agents/tools/list.js +8 -19
- package/dist/extensions/cursor-cloud-agents/tools/reply.js +5 -16
- package/dist/extensions/cursor-grokbot-agents/extension.js +4 -1
- package/dist/extensions/cursor-grokbot-agents/lib/agents.js +3 -3
- package/dist/extensions/cursor-grokbot-agents/lib/backend.js +53 -73
- package/dist/extensions/cursor-grokbot-agents/lib/contacts.js +10 -23
- package/dist/extensions/cursor-grokbot-agents/lib/conversation.js +112 -132
- package/dist/extensions/cursor-grokbot-agents/lib/lock.js +1 -2
- package/dist/extensions/cursor-grokbot-agents/tools/ask.js +5 -16
- package/dist/extensions/cursor-grokbot-agents/tools/check.js +4 -15
- package/dist/extensions/cursor-grokbot-agents/tools/interrupt.js +2 -13
- package/dist/extensions/cursor-grokbot-agents/tools/list.js +11 -23
- package/dist/extensions/jev/extension.js +3 -3
- package/dist/extensions/jev/lib/evaluate.js +43 -60
- package/dist/extensions/jev/tools/evaluate.js +6 -17
- package/dist/extensions/slack-communication/tools/post-file.js +1 -1
- package/dist/extensions.js +3 -5
- package/dist/files-backends/cursor-hosted.js +504 -523
- package/dist/files-backends/local-fs.js +72 -134
- package/dist/files.js +3 -3
- package/dist/filesystem.js +562 -861
- package/dist/index.js +16 -35
- package/dist/internal/advertise-tools.js +74 -86
- package/dist/internal/artifacts-store.js +298 -361
- package/dist/internal/as-of.js +2 -4
- package/dist/internal/authored-alias-hooks.js +6 -4
- package/dist/internal/authored-loaders.js +37 -52
- package/dist/internal/bounded-int.js +1 -2
- package/dist/internal/bounded.js +13 -24
- package/dist/internal/brand.js +1 -1
- package/dist/internal/browser-origin-guard.js +4 -4
- package/dist/internal/builtin-tools/artifacts.js +15 -27
- package/dist/internal/builtin-tools/index.js +2 -3
- package/dist/internal/builtin-tools/reminders.js +33 -52
- package/dist/internal/channel-architecture.d.ts +21 -0
- package/dist/internal/channel-architecture.d.ts.map +1 -0
- package/dist/internal/channel-architecture.js +41 -0
- package/dist/internal/channel-dispatch.js +3 -4
- package/dist/internal/channel-route-dispatch.js +40 -51
- package/dist/internal/channel-state.js +1 -1
- package/dist/internal/chat-client.js +319 -340
- package/dist/internal/cli-ax.js +1262 -1294
- package/dist/internal/cli-bitbucket.js +244 -272
- package/dist/internal/cli-convert-automation.js +137 -151
- package/dist/internal/cli-cursor.js +126 -147
- package/dist/internal/cli-deploy.d.ts.map +1 -1
- package/dist/internal/cli-deploy.js +1457 -1507
- package/dist/internal/cli-docs.js +130 -147
- package/dist/internal/cli-github.js +437 -476
- package/dist/internal/cli-gitlab.js +259 -288
- package/dist/internal/cli-images.js +266 -334
- package/dist/internal/cli-manifest.js +25 -37
- package/dist/internal/cli-mcp-oauth.js +228 -247
- package/dist/internal/cli-mcp.js +358 -383
- package/dist/internal/cli-migrate.js +73 -90
- package/dist/internal/cli-skills.js +35 -47
- package/dist/internal/cli-slack-manual.d.ts +0 -1
- package/dist/internal/cli-slack-manual.d.ts.map +1 -1
- package/dist/internal/cli-slack-manual.js +175 -204
- package/dist/internal/cli-slack.d.ts +1 -1
- package/dist/internal/cli-slack.d.ts.map +1 -1
- package/dist/internal/cli-slack.js +416 -456
- package/dist/internal/cloud-merge.js +7 -3
- package/dist/internal/cloud-turn-cost.js +8 -1
- package/dist/internal/connection-env.js +5 -6
- package/dist/internal/continuation-channel.js +10 -7
- package/dist/internal/continuation-identity.js +85 -67
- package/dist/internal/conversation-mirror.js +112 -131
- package/dist/internal/convert-automation/convert-workflow.js +21 -31
- package/dist/internal/cron.js +3 -3
- package/dist/internal/cursor/account-mcp.js +147 -146
- package/dist/internal/cursor/backend-client.js +290 -320
- package/dist/internal/cursor/bound-secret-file.js +3 -3
- package/dist/internal/cursor/credentials.js +127 -142
- package/dist/internal/cursor/cursor-api-transport.js +4 -8
- package/dist/internal/cursor/github-credentials.js +91 -108
- package/dist/internal/cursor/hosted-bound-secrets.js +3 -4
- package/dist/internal/cursor/hosted-deployment-secrets.js +1 -1
- package/dist/internal/cursor/hosted-store-secrets.js +5 -9
- package/dist/internal/cursor/session-token.js +36 -48
- package/dist/internal/cursor/store-api-client.js +77 -92
- package/dist/internal/cursor-account-mcp-auth.js +132 -149
- package/dist/internal/cursor-agent-template.js +1 -1
- package/dist/internal/cursor-deployment-relay.js +33 -54
- package/dist/internal/cursor-event-relay.js +65 -59
- package/dist/internal/cursor-relay-core.js +258 -286
- package/dist/internal/deferred-channel-session.js +3 -12
- package/dist/internal/deploy-client.js +410 -475
- package/dist/internal/deploy-manifest.d.ts +17 -0
- package/dist/internal/deploy-manifest.d.ts.map +1 -1
- package/dist/internal/deploy-manifest.js +71 -21
- package/dist/internal/deploy-source.js +31 -43
- package/dist/internal/discovery/agent-config.js +45 -59
- package/dist/internal/discovery/agent.js +276 -280
- package/dist/internal/discovery/channels.js +67 -80
- package/dist/internal/discovery/connections.js +286 -296
- package/dist/internal/discovery/context.js +2 -13
- package/dist/internal/discovery/cursor-plugin.js +223 -259
- package/dist/internal/discovery/extension-overlay.js +104 -131
- package/dist/internal/discovery/extensions.js +276 -281
- package/dist/internal/discovery/fs.js +56 -79
- package/dist/internal/discovery/hooks.js +39 -50
- package/dist/internal/discovery/info.js +17 -19
- package/dist/internal/discovery/instructions.js +58 -71
- package/dist/internal/discovery/modules.js +45 -58
- package/dist/internal/discovery/project.d.ts.map +1 -1
- package/dist/internal/discovery/project.js +192 -215
- package/dist/internal/discovery/reminders.js +41 -52
- package/dist/internal/discovery/runtime.js +1 -1
- package/dist/internal/discovery/schedules.js +71 -82
- package/dist/internal/discovery/seed-files.js +21 -32
- package/dist/internal/discovery/services.js +74 -96
- package/dist/internal/discovery/skills.js +77 -94
- package/dist/internal/discovery/subagent.js +79 -95
- package/dist/internal/discovery/tools.js +12 -23
- package/dist/internal/distribution.js +2 -2
- package/dist/internal/docs-site.js +30 -45
- package/dist/internal/duration.js +1 -1
- package/dist/internal/env-file.js +48 -64
- package/dist/internal/eval-judge-model.js +17 -28
- package/dist/internal/eval-run-store.js +265 -254
- package/dist/internal/eval-runner.d.ts +8 -0
- package/dist/internal/eval-runner.d.ts.map +1 -1
- package/dist/internal/eval-runner.js +406 -408
- package/dist/internal/eval-transport.d.ts +24 -0
- package/dist/internal/eval-transport.d.ts.map +1 -0
- package/dist/internal/eval-transport.js +22 -0
- package/dist/internal/evals-client.js +242 -246
- package/dist/internal/event-log.js +72 -120
- package/dist/internal/event-mapper.js +30 -31
- package/dist/internal/factory-resource-channel.js +16 -30
- package/dist/internal/filesystem/errors.js +6 -6
- package/dist/internal/filesystem/format.js +10 -13
- package/dist/internal/filesystem/merge.js +52 -94
- package/dist/internal/filesystem/nearest.js +15 -27
- package/dist/internal/filesystem/scratch.js +65 -85
- package/dist/internal/filesystem/tools.js +221 -241
- package/dist/internal/filesystem/walk.js +76 -143
- package/dist/internal/framework-file-storage.js +118 -139
- package/dist/internal/framework-storage-selection.js +21 -13
- package/dist/internal/frontmatter.js +4 -6
- package/dist/internal/github-fanout.js +50 -64
- package/dist/internal/guest-network.js +96 -109
- package/dist/internal/handleAgentServeTrigger.js +121 -126
- package/dist/internal/host-files.js +73 -88
- package/dist/internal/host-kv.js +21 -36
- package/dist/internal/host-otel.js +22 -19
- package/dist/internal/host-platforms.js +49 -63
- package/dist/internal/hosted-catch-protocol.d.ts +1 -0
- package/dist/internal/hosted-catch-protocol.d.ts.map +1 -1
- package/dist/internal/hosted-catch-protocol.js +1 -0
- package/dist/internal/hosted-catch.d.ts +5 -3
- package/dist/internal/hosted-catch.d.ts.map +1 -1
- package/dist/internal/hosted-catch.js +84 -93
- package/dist/internal/hosted-delivery-protocol.js +32 -8
- package/dist/internal/hosted-delivery.d.ts +13 -1
- package/dist/internal/hosted-delivery.d.ts.map +1 -1
- package/dist/internal/hosted-delivery.js +614 -584
- package/dist/internal/hosted-eval-cases.d.ts +21 -0
- package/dist/internal/hosted-eval-cases.d.ts.map +1 -0
- package/dist/internal/hosted-eval-cases.js +162 -0
- package/dist/internal/hosted-execution-diag.js +38 -30
- package/dist/internal/hosted-execution-flush.js +75 -66
- package/dist/internal/hosted-execution-latency.js +16 -8
- package/dist/internal/hosted-managed-automation.js +2 -2
- package/dist/internal/hosting.js +2 -3
- package/dist/internal/http-channel-define.js +4 -1
- package/dist/internal/http-channel.js +101 -112
- package/dist/internal/http-control-plane-session.d.ts +18 -1
- package/dist/internal/http-control-plane-session.d.ts.map +1 -1
- package/dist/internal/http-control-plane-session.js +66 -32
- package/dist/internal/incoming-headers-to-fetch.js +1 -2
- package/dist/internal/init-interview.js +73 -93
- package/dist/internal/init-project.js +182 -214
- package/dist/internal/init-scaffold.js +10 -21
- package/dist/internal/inline-stdio-mcp.js +80 -86
- package/dist/internal/install-cursor-skills.js +231 -273
- package/dist/internal/legacy-command-guard.js +18 -31
- package/dist/internal/listen-port.js +34 -45
- package/dist/internal/local-control-plane.js +293 -307
- package/dist/internal/local-env.js +1 -1
- package/dist/internal/local-ingress.js +15 -9
- package/dist/internal/log-ring.js +1 -2
- package/dist/internal/logs-client.js +207 -227
- package/dist/internal/map-pool.js +24 -38
- package/dist/internal/mcp-endpoint.js +204 -180
- package/dist/internal/mcp-host.js +165 -168
- package/dist/internal/mcp-oauth-on-demand.js +170 -207
- package/dist/internal/mcp-oauth-persist.js +15 -29
- package/dist/internal/mcp-oauth.js +209 -266
- package/dist/internal/named-webhook-secret.d.ts +39 -0
- package/dist/internal/named-webhook-secret.d.ts.map +1 -0
- package/dist/internal/named-webhook-secret.js +47 -0
- package/dist/internal/open-browser.js +2 -3
- package/dist/internal/otel/collector.js +104 -68
- package/dist/internal/otel/config.js +24 -37
- package/dist/internal/otel/http.js +5 -7
- package/dist/internal/otel/mcp.js +3 -12
- package/dist/internal/otel/runtime.js +69 -83
- package/dist/internal/package-inline-stdio.js +57 -65
- package/dist/internal/peer-connections.js +9 -5
- package/dist/internal/platform-schedule-sync.js +39 -54
- package/dist/internal/platform-timers.js +176 -210
- package/dist/internal/playground/static.js +1 -2
- package/dist/internal/playground/toolchain.js +37 -53
- package/dist/internal/playground-proxy.js +230 -270
- package/dist/internal/process-memory-telemetry.js +33 -51
- package/dist/internal/prompt-context.js +3 -6
- package/dist/internal/reminder-control-plane-protocol.js +46 -13
- package/dist/internal/reminder-runner.js +770 -785
- package/dist/internal/reminder-schedule.js +1 -1
- package/dist/internal/reminder-store.js +57 -78
- package/dist/internal/request-error-status.js +1 -3
- package/dist/internal/request-headers.js +2 -2
- package/dist/internal/resolve-prod-target.js +119 -135
- package/dist/internal/resolved-connections.js +16 -6
- package/dist/internal/run-client.js +221 -229
- package/dist/internal/runtime-dispatch-runner.js +18 -43
- package/dist/internal/schedule-runner.js +49 -58
- package/dist/internal/scm/pr-url.js +7 -6
- package/dist/internal/sdk-runner.js +388 -363
- package/dist/internal/serve-restart.js +26 -39
- package/dist/internal/server.d.ts.map +1 -1
- package/dist/internal/server.js +1283 -1244
- package/dist/internal/session-cost.js +7 -9
- package/dist/internal/session-engine.d.ts +3 -1
- package/dist/internal/session-engine.d.ts.map +1 -1
- package/dist/internal/session-engine.js +2801 -2777
- package/dist/internal/session-links.js +12 -16
- package/dist/internal/session-run-log.js +134 -82
- package/dist/internal/session-store.js +133 -164
- package/dist/internal/sessions-client.js +97 -118
- package/dist/internal/skill-catalog.js +18 -23
- package/dist/internal/skills-sync.js +16 -30
- package/dist/internal/slack-provision-client.js +90 -116
- package/dist/internal/start-log-store.js +48 -67
- package/dist/internal/steering.js +1 -2
- package/dist/internal/storage-coordinator.js +160 -196
- package/dist/internal/store-mirror.js +16 -30
- package/dist/internal/stream-progress.js +6 -8
- package/dist/internal/terminal-style.js +3 -4
- package/dist/internal/testing/scm-continuation-fixtures.js +6 -2
- package/dist/internal/testing/slack-continuation-fixtures.d.ts +26 -0
- package/dist/internal/testing/slack-continuation-fixtures.d.ts.map +1 -0
- package/dist/internal/testing/slack-continuation-fixtures.js +136 -0
- package/dist/internal/tool-catalog.js +11 -5
- package/dist/internal/tool-result.js +1 -1
- package/dist/internal/trajectory.js +19 -22
- package/dist/internal/turn-cost.js +52 -62
- package/dist/internal/turn-governor.js +5 -8
- package/dist/internal/turn-lease-store.js +85 -105
- package/dist/internal/turn-outbox.js +28 -43
- package/dist/internal/update-check.js +231 -259
- package/dist/internal/v2-hosting.js +1 -2
- package/dist/internal/workspace-sync.js +25 -41
- package/dist/internal/workspace.js +111 -139
- package/dist/kv/memory-kv.js +27 -51
- package/dist/memory.js +106 -148
- package/dist/otel.js +5 -8
- package/dist/playground/assets/index-DXm_VXAQ.css +1 -0
- package/dist/playground/assets/{index-Co4CUVTQ.js → index-JekUQERK.js} +45 -45
- package/dist/playground/index.html +2 -2
- package/dist/prompt.js +2 -4
- package/dist/storage-backends/cursor-hosted-v2.js +53 -83
- package/dist/storage-backends/cursor-hosted.js +105 -145
- package/dist/storage-backends/file-kv.js +100 -128
- package/dist/storage-protocol.js +3 -5
- package/dist/storage.js +17 -26
- package/dist/types.d.ts +68 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +20 -18
- package/docs/building-with-agents.md +2 -0
- package/docs/deployment.md +7 -0
- package/docs/guides/bitbucket.md +9 -1
- package/docs/guides/github.md +20 -4
- package/docs/guides/gitlab.md +9 -1
- package/docs/guides/migrate.md +127 -0
- package/docs/reference/cli.md +39 -0
- package/docs/troubleshooting.md +1 -0
- package/package.json +1 -1
- package/skills/debug/SKILL.md +1 -0
- package/skills/github/SKILL.md +23 -0
- package/skills/migrate-v2/SKILL.md +51 -10
- package/dist/docs/assets/chunks/@localSearchIndexroot.BJ8UZggu.js +0 -1
- package/dist/docs/assets/chunks/channel.BTJ5J9FI.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.D4BZ3cVV.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.D4BZ3cVV.js +0 -1
- package/dist/docs/assets/chunks/clone.62tX-O-1.js +0 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.DkTs1aEU.js +0 -1
- package/dist/docs/assets/reference_cli.md.GwugN3n-.lean.js +0 -1
- package/dist/docs/assets/troubleshooting.md.Bscj6ODe.js +0 -1
- package/dist/playground/assets/index-C1g_PTTZ.css +0 -1
- /package/dist/docs/assets/{building-with-agents.md.BPjPFxFg.lean.js → building-with-agents.md.Df87rAe1.lean.js} +0 -0
- /package/dist/docs/assets/{deployment.md.BdqTiGdc.lean.js → deployment.md.BYuEcDBv.lean.js} +0 -0
- /package/dist/docs/assets/{reference_skills.md.ClkMoQsV.lean.js → reference_skills.md.C0guGcH0.lean.js} +0 -0
|
@@ -7,15 +7,6 @@
|
|
|
7
7
|
* Drive with `t.send`, assert with `t.succeeded` / `t.calledTool` /
|
|
8
8
|
* `t.messageIncludes` / `t.check`.
|
|
9
9
|
*/
|
|
10
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
11
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
12
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
13
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
14
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
15
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
16
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
17
|
-
});
|
|
18
|
-
};
|
|
19
10
|
import { readdir } from "node:fs/promises";
|
|
20
11
|
import { join, relative, resolve } from "node:path";
|
|
21
12
|
import { computeVerdict, createAssertions, EvalAssertionRecorder, EvalRequireFailure, EvalSkipSignal, } from "../evals/assertions.js";
|
|
@@ -28,84 +19,79 @@ import { EVAL_MAX_CONCURRENCY_LIMIT, expandEvalDefinition, expandSummarySuiteSel
|
|
|
28
19
|
import { importAuthoredModule } from "./authored-loaders.js";
|
|
29
20
|
import { isDefinitionOfKind } from "./brand.js";
|
|
30
21
|
import { callJudgeModel, EVAL_JUDGE_MODEL_ENV, resolveJudgeModel } from "./eval-judge-model.js";
|
|
22
|
+
import { localHttpEvalTransport } from "./eval-transport.js";
|
|
31
23
|
import { mapPool } from "./map-pool.js";
|
|
32
|
-
import { RunSessionTimeoutError
|
|
24
|
+
import { RunSessionTimeoutError } from "./run-client.js";
|
|
33
25
|
import { buildTrajectory } from "./trajectory.js";
|
|
34
|
-
function listEvalFiles(dir) {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
try {
|
|
41
|
-
entries = yield readdir(current, { withFileTypes: true });
|
|
42
|
-
}
|
|
43
|
-
catch (_a) {
|
|
44
|
-
return;
|
|
45
|
-
}
|
|
46
|
-
for (const entry of entries) {
|
|
47
|
-
if (entry.name.startsWith(".")) {
|
|
48
|
-
continue;
|
|
49
|
-
}
|
|
50
|
-
const abs = join(current, entry.name);
|
|
51
|
-
if (entry.isDirectory()) {
|
|
52
|
-
if (entry.name === "node_modules") {
|
|
53
|
-
continue;
|
|
54
|
-
}
|
|
55
|
-
yield walk(abs);
|
|
56
|
-
}
|
|
57
|
-
else if (entry.isFile()) {
|
|
58
|
-
out.push(abs);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
});
|
|
26
|
+
async function listEvalFiles(dir) {
|
|
27
|
+
const out = [];
|
|
28
|
+
async function walk(current) {
|
|
29
|
+
let entries;
|
|
30
|
+
try {
|
|
31
|
+
entries = await readdir(current, { withFileTypes: true });
|
|
62
32
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
return __awaiter(this, arguments, void 0, function* (projectRoot, importModule = importAuthoredModule) {
|
|
69
|
-
const root = resolve(projectRoot);
|
|
70
|
-
const evalsDir = join(root, "evals");
|
|
71
|
-
const files = yield listEvalFiles(evalsDir);
|
|
72
|
-
const evals = [];
|
|
73
|
-
let config = {};
|
|
74
|
-
// Fixture loaders resolve relative paths against the app root, so a dataset
|
|
75
|
-
// path reads the same however deep the eval file sits and whatever cwd the
|
|
76
|
-
// CLI ran from.
|
|
77
|
-
process.env[EVAL_ROOT_ENV] = root;
|
|
78
|
-
for (const abs of files) {
|
|
79
|
-
const rel = relative(evalsDir, abs).replace(/\\/g, "/");
|
|
80
|
-
if (rel === "evals.config.ts" || rel === "evals.config.js") {
|
|
81
|
-
const mod = yield importModule(abs);
|
|
82
|
-
if (mod.default !== null && typeof mod.default === "object") {
|
|
83
|
-
config = mod.default;
|
|
84
|
-
}
|
|
85
|
-
continue;
|
|
86
|
-
}
|
|
87
|
-
if (!rel.endsWith(".eval.ts") && !rel.endsWith(".eval.js")) {
|
|
33
|
+
catch {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
for (const entry of entries) {
|
|
37
|
+
if (entry.name.startsWith(".")) {
|
|
88
38
|
continue;
|
|
89
39
|
}
|
|
90
|
-
const
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
evals.push({
|
|
95
|
-
id: expanded.id,
|
|
96
|
-
fileId,
|
|
97
|
-
path: abs,
|
|
98
|
-
definition: expanded.definition,
|
|
99
|
-
});
|
|
40
|
+
const abs = join(current, entry.name);
|
|
41
|
+
if (entry.isDirectory()) {
|
|
42
|
+
if (entry.name === "node_modules") {
|
|
43
|
+
continue;
|
|
100
44
|
}
|
|
45
|
+
await walk(abs);
|
|
101
46
|
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
throw new Error(`${rel}: ${message}`);
|
|
47
|
+
else if (entry.isFile()) {
|
|
48
|
+
out.push(abs);
|
|
105
49
|
}
|
|
106
50
|
}
|
|
107
|
-
|
|
108
|
-
|
|
51
|
+
}
|
|
52
|
+
await walk(dir);
|
|
53
|
+
return out.sort();
|
|
54
|
+
}
|
|
55
|
+
export async function discoverEvals(projectRoot, importModule = importAuthoredModule) {
|
|
56
|
+
const root = resolve(projectRoot);
|
|
57
|
+
const evalsDir = join(root, "evals");
|
|
58
|
+
const files = await listEvalFiles(evalsDir);
|
|
59
|
+
const evals = [];
|
|
60
|
+
let config = {};
|
|
61
|
+
// Fixture loaders resolve relative paths against the app root, so a dataset
|
|
62
|
+
// path reads the same however deep the eval file sits and whatever cwd the
|
|
63
|
+
// CLI ran from.
|
|
64
|
+
process.env[EVAL_ROOT_ENV] = root;
|
|
65
|
+
for (const abs of files) {
|
|
66
|
+
const rel = relative(evalsDir, abs).replace(/\\/g, "/");
|
|
67
|
+
if (rel === "evals.config.ts" || rel === "evals.config.js") {
|
|
68
|
+
const mod = await importModule(abs);
|
|
69
|
+
if (mod.default !== null && typeof mod.default === "object") {
|
|
70
|
+
config = mod.default;
|
|
71
|
+
}
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
if (!rel.endsWith(".eval.ts") && !rel.endsWith(".eval.js")) {
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
const mod = await importModule(abs);
|
|
78
|
+
const fileId = rel.replace(/\.eval\.(ts|js)$/, "").replace(/\/index$/, "");
|
|
79
|
+
try {
|
|
80
|
+
for (const expanded of expandEvalModule(fileId, mod.default)) {
|
|
81
|
+
evals.push({
|
|
82
|
+
id: expanded.id,
|
|
83
|
+
fileId,
|
|
84
|
+
path: abs,
|
|
85
|
+
definition: expanded.definition,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
91
|
+
throw new Error(`${rel}: ${message}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return { evals, config };
|
|
109
95
|
}
|
|
110
96
|
/**
|
|
111
97
|
* Expand one eval module's default export into runnable datapoints.
|
|
@@ -140,86 +126,83 @@ export function filterDiscoveredEvals(evals, options = {}) {
|
|
|
140
126
|
selected = selected.filter(e => options.filterIds.some(f => matchesEvalIdFilter(e.id, f)));
|
|
141
127
|
}
|
|
142
128
|
if (options.tags !== undefined && options.tags.length > 0) {
|
|
143
|
-
selected = selected.filter(e =>
|
|
129
|
+
selected = selected.filter(e => (e.definition.tags ?? []).some(t => options.tags.includes(t)));
|
|
144
130
|
}
|
|
145
131
|
// Suite aggregators (`summary` tag) need sibling cases from the same file.
|
|
146
132
|
return expandSummarySuiteSelection(evals, selected, e => isEvalSummaryCase(e.definition.tags));
|
|
147
133
|
}
|
|
148
|
-
export function runDiscoveredEvals(options) {
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
134
|
+
export async function runDiscoveredEvals(options) {
|
|
135
|
+
let selected;
|
|
136
|
+
let config;
|
|
137
|
+
if (options.discovered !== undefined) {
|
|
138
|
+
selected = options.discovered.evals;
|
|
139
|
+
config = options.discovered.config;
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
const importModule = options.importModule ?? importAuthoredModule;
|
|
143
|
+
const discovered = await discoverEvals(options.projectRoot, importModule);
|
|
144
|
+
config = discovered.config;
|
|
145
|
+
selected = filterDiscoveredEvals(discovered.evals, {
|
|
146
|
+
filterIds: options.filterIds,
|
|
147
|
+
tags: options.tags,
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
if (selected.length === 0) {
|
|
151
|
+
return [];
|
|
152
|
+
}
|
|
153
|
+
const maxConcurrency = options.maxConcurrency === undefined
|
|
154
|
+
? resolveEvalMaxConcurrency(config)
|
|
155
|
+
: normalizeEvalMaxConcurrency(options.maxConcurrency);
|
|
156
|
+
const defaultTimeoutMs = options.timeoutMs ?? config.timeoutMs ?? DEFAULT_EVAL_TIMEOUT_MS;
|
|
157
|
+
const transport = options.transport ??
|
|
158
|
+
localHttpEvalTransport({
|
|
159
|
+
baseUrl: options.baseUrl,
|
|
160
|
+
auth: { bearerToken: options.bearerToken, headers: options.headers },
|
|
161
|
+
});
|
|
162
|
+
const reporter = buildReporterHub(options, config, selected);
|
|
163
|
+
const startedAt = new Date().toISOString();
|
|
164
|
+
await reporter?.runStart(selected, options.target ?? { baseUrl: options.baseUrl, mode: "local" });
|
|
165
|
+
// Iterations of the same authored datapoint share one concurrency slot and
|
|
166
|
+
// run sequentially. maxConcurrency is therefore the max number of distinct
|
|
167
|
+
// datapoints in flight, not datapoints × iterations.
|
|
168
|
+
const groups = groupEvalsForIterationSchedule(selected);
|
|
169
|
+
const nested = await mapPool(groups, maxConcurrency, async (group) => {
|
|
170
|
+
const results = [];
|
|
171
|
+
for (const discovered of group) {
|
|
172
|
+
if (options.signal?.aborted) {
|
|
173
|
+
break;
|
|
174
|
+
}
|
|
175
|
+
if (options.verbose) {
|
|
176
|
+
process.stderr.write(` eval ${discovered.id}…\n`);
|
|
177
|
+
}
|
|
178
|
+
options.onCaseStart?.(discovered.id);
|
|
179
|
+
const result = await runOneEval(discovered, {
|
|
180
|
+
transport,
|
|
181
|
+
defaultTimeoutMs,
|
|
182
|
+
verbose: Boolean(options.verbose),
|
|
183
|
+
signal: options.signal,
|
|
184
|
+
judge: {
|
|
185
|
+
configModel: config.judge?.model,
|
|
186
|
+
caller: options.judgeCaller ?? callJudgeModel,
|
|
187
|
+
},
|
|
188
|
+
onEvent: event => {
|
|
189
|
+
options.onCaseEvent?.(discovered.id, event);
|
|
190
|
+
options.onEvent?.(event);
|
|
191
|
+
},
|
|
164
192
|
});
|
|
193
|
+
options.onCaseDone?.(result);
|
|
194
|
+
await reporter?.caseComplete(discovered, result);
|
|
195
|
+
results.push(result);
|
|
165
196
|
}
|
|
166
|
-
if (selected.length === 0) {
|
|
167
|
-
return [];
|
|
168
|
-
}
|
|
169
|
-
const maxConcurrency = options.maxConcurrency === undefined
|
|
170
|
-
? resolveEvalMaxConcurrency(config)
|
|
171
|
-
: normalizeEvalMaxConcurrency(options.maxConcurrency);
|
|
172
|
-
const defaultTimeoutMs = (_c = (_b = options.timeoutMs) !== null && _b !== void 0 ? _b : config.timeoutMs) !== null && _c !== void 0 ? _c : 180000;
|
|
173
|
-
const reporter = buildReporterHub(options, config, selected);
|
|
174
|
-
const startedAt = new Date().toISOString();
|
|
175
|
-
yield reporter === null || reporter === void 0 ? void 0 : reporter.runStart(selected, (_d = options.target) !== null && _d !== void 0 ? _d : { baseUrl: options.baseUrl, mode: "local" });
|
|
176
|
-
// Iterations of the same authored datapoint share one concurrency slot and
|
|
177
|
-
// run sequentially. maxConcurrency is therefore the max number of distinct
|
|
178
|
-
// datapoints in flight, not datapoints × iterations.
|
|
179
|
-
const groups = groupEvalsForIterationSchedule(selected);
|
|
180
|
-
const nested = yield mapPool(groups, maxConcurrency, (group) => __awaiter(this, void 0, void 0, function* () {
|
|
181
|
-
var _a, _b, _c, _d;
|
|
182
|
-
var _e;
|
|
183
|
-
const results = [];
|
|
184
|
-
for (const discovered of group) {
|
|
185
|
-
if ((_a = options.signal) === null || _a === void 0 ? void 0 : _a.aborted) {
|
|
186
|
-
break;
|
|
187
|
-
}
|
|
188
|
-
if (options.verbose) {
|
|
189
|
-
process.stderr.write(` eval ${discovered.id}…\n`);
|
|
190
|
-
}
|
|
191
|
-
(_b = options.onCaseStart) === null || _b === void 0 ? void 0 : _b.call(options, discovered.id);
|
|
192
|
-
const result = yield runOneEval(discovered, {
|
|
193
|
-
baseUrl: options.baseUrl,
|
|
194
|
-
defaultTimeoutMs,
|
|
195
|
-
bearerToken: options.bearerToken,
|
|
196
|
-
headers: options.headers,
|
|
197
|
-
verbose: Boolean(options.verbose),
|
|
198
|
-
signal: options.signal,
|
|
199
|
-
judge: {
|
|
200
|
-
configModel: (_c = config.judge) === null || _c === void 0 ? void 0 : _c.model,
|
|
201
|
-
caller: (_e = options.judgeCaller) !== null && _e !== void 0 ? _e : callJudgeModel,
|
|
202
|
-
},
|
|
203
|
-
onEvent: event => {
|
|
204
|
-
var _a, _b;
|
|
205
|
-
(_a = options.onCaseEvent) === null || _a === void 0 ? void 0 : _a.call(options, discovered.id, event);
|
|
206
|
-
(_b = options.onEvent) === null || _b === void 0 ? void 0 : _b.call(options, event);
|
|
207
|
-
},
|
|
208
|
-
});
|
|
209
|
-
(_d = options.onCaseDone) === null || _d === void 0 ? void 0 : _d.call(options, result);
|
|
210
|
-
yield reporter === null || reporter === void 0 ? void 0 : reporter.caseComplete(discovered, result);
|
|
211
|
-
results.push(result);
|
|
212
|
-
}
|
|
213
|
-
return results;
|
|
214
|
-
}), { signal: options.signal });
|
|
215
|
-
const results = nested.flat();
|
|
216
|
-
yield reporter === null || reporter === void 0 ? void 0 : reporter.runComplete(summarizeEvalResults(results, {
|
|
217
|
-
strict: options.strict === true,
|
|
218
|
-
startedAt,
|
|
219
|
-
finishedAt: new Date().toISOString(),
|
|
220
|
-
}));
|
|
221
197
|
return results;
|
|
222
|
-
});
|
|
198
|
+
}, { signal: options.signal });
|
|
199
|
+
const results = nested.flat();
|
|
200
|
+
await reporter?.runComplete(summarizeEvalResults(results, {
|
|
201
|
+
strict: options.strict === true,
|
|
202
|
+
startedAt,
|
|
203
|
+
finishedAt: new Date().toISOString(),
|
|
204
|
+
}));
|
|
205
|
+
return results;
|
|
223
206
|
}
|
|
224
207
|
/**
|
|
225
208
|
* Fan results out to the reporters that observe them.
|
|
@@ -230,10 +213,9 @@ export function runDiscoveredEvals(options) {
|
|
|
230
213
|
* `onRunStart` / `onRunComplete` pair.
|
|
231
214
|
*/
|
|
232
215
|
function buildReporterHub(options, config, selected) {
|
|
233
|
-
var _a, _b;
|
|
234
216
|
const skip = options.skipReport === true;
|
|
235
|
-
const runWide = [...(
|
|
236
|
-
const perEval = skip ? [] : selected.flatMap(e =>
|
|
217
|
+
const runWide = [...(options.reporters ?? []), ...(skip ? [] : (config.reporters ?? []))];
|
|
218
|
+
const perEval = skip ? [] : selected.flatMap(e => e.definition.reporters ?? []);
|
|
237
219
|
const everyReporter = [...new Set([...runWide, ...perEval])];
|
|
238
220
|
if (everyReporter.length === 0) {
|
|
239
221
|
return undefined;
|
|
@@ -245,32 +227,22 @@ function buildReporterHub(options, config, selected) {
|
|
|
245
227
|
};
|
|
246
228
|
const all = combineReporters(everyReporter, onError);
|
|
247
229
|
return {
|
|
248
|
-
runStart(evals, target) {
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
tags: e.definition.tags,
|
|
256
|
-
})), target);
|
|
257
|
-
});
|
|
230
|
+
async runStart(evals, target) {
|
|
231
|
+
await all.onRunStart?.(evals.map(e => ({
|
|
232
|
+
id: e.id,
|
|
233
|
+
fileId: e.fileId,
|
|
234
|
+
description: e.definition.description,
|
|
235
|
+
tags: e.definition.tags,
|
|
236
|
+
})), target);
|
|
258
237
|
},
|
|
259
|
-
caseComplete(discovered, result) {
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
...new Set([...runWide, ...(skip ? [] : ((_c = discovered.definition.reporters) !== null && _c !== void 0 ? _c : []))]),
|
|
265
|
-
];
|
|
266
|
-
yield (_b = (_a = combineReporters(observers, onError)).onEvalComplete) === null || _b === void 0 ? void 0 : _b.call(_a, result);
|
|
267
|
-
});
|
|
238
|
+
async caseComplete(discovered, result) {
|
|
239
|
+
const observers = [
|
|
240
|
+
...new Set([...runWide, ...(skip ? [] : (discovered.definition.reporters ?? []))]),
|
|
241
|
+
];
|
|
242
|
+
await combineReporters(observers, onError).onEvalComplete?.(result);
|
|
268
243
|
},
|
|
269
|
-
runComplete(summary) {
|
|
270
|
-
|
|
271
|
-
var _a;
|
|
272
|
-
yield (_a = all.onRunComplete) === null || _a === void 0 ? void 0 : _a.call(all, summary);
|
|
273
|
-
});
|
|
244
|
+
async runComplete(summary) {
|
|
245
|
+
await all.onRunComplete?.(summary);
|
|
274
246
|
},
|
|
275
247
|
};
|
|
276
248
|
}
|
|
@@ -279,9 +251,8 @@ function buildReporterHub(options, config, selected) {
|
|
|
279
251
|
* (`weather/nyc/1`…`/3`) share a key; single-iteration ids keep their full id.
|
|
280
252
|
*/
|
|
281
253
|
export function iterationScheduleKey(discovered) {
|
|
282
|
-
|
|
283
|
-
const
|
|
284
|
-
const iteration = (_b = discovered.definition.iteration) !== null && _b !== void 0 ? _b : 1;
|
|
254
|
+
const iterations = discovered.definition.iterations ?? 1;
|
|
255
|
+
const iteration = discovered.definition.iteration ?? 1;
|
|
285
256
|
if (iterations <= 1) {
|
|
286
257
|
return discovered.id;
|
|
287
258
|
}
|
|
@@ -310,7 +281,7 @@ export function groupEvalsForIterationSchedule(evals) {
|
|
|
310
281
|
}
|
|
311
282
|
return order.map(key => {
|
|
312
283
|
const group = groups.get(key);
|
|
313
|
-
return group.sort((a, b) =>
|
|
284
|
+
return group.sort((a, b) => (a.definition.iteration ?? 1) - (b.definition.iteration ?? 1));
|
|
314
285
|
});
|
|
315
286
|
}
|
|
316
287
|
function resolveEvalMaxConcurrency(config) {
|
|
@@ -321,237 +292,266 @@ function resolveEvalMaxConcurrency(config) {
|
|
|
321
292
|
}
|
|
322
293
|
return normalizeEvalMaxConcurrency(config.maxConcurrency);
|
|
323
294
|
}
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
judge,
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
295
|
+
const DEFAULT_EVAL_TIMEOUT_MS = 180_000;
|
|
296
|
+
/**
|
|
297
|
+
* One discovered case on a caller-supplied transport, with the defaults
|
|
298
|
+
* {@link runDiscoveredEvals} applies and no reporters.
|
|
299
|
+
*/
|
|
300
|
+
export function runEvalCase(discovered, config, transport, signal) {
|
|
301
|
+
return runOneEval(discovered, {
|
|
302
|
+
transport,
|
|
303
|
+
defaultTimeoutMs: config.timeoutMs ?? DEFAULT_EVAL_TIMEOUT_MS,
|
|
304
|
+
verbose: false,
|
|
305
|
+
judge: { configModel: config.judge?.model, caller: callJudgeModel },
|
|
306
|
+
signal,
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
async function runOneEval(discovered, opts) {
|
|
310
|
+
const logs = [];
|
|
311
|
+
const metrics = {};
|
|
312
|
+
const recorder = new EvalAssertionRecorder();
|
|
313
|
+
const def = discovered.definition;
|
|
314
|
+
const timeoutMs = def.timeoutMs ?? opts.defaultTimeoutMs;
|
|
315
|
+
const startedAt = Date.now();
|
|
316
|
+
let sessionId;
|
|
317
|
+
let continuationToken;
|
|
318
|
+
// The session stream replays from an index and the client stops at the first
|
|
319
|
+
// terminal event, so each send must resume after the previous turn's last
|
|
320
|
+
// event or it would re-read that turn instead of the new one.
|
|
321
|
+
let nextEventIndex = 0;
|
|
322
|
+
const allEvents = [];
|
|
323
|
+
const inputs = [];
|
|
324
|
+
const turns = [];
|
|
325
|
+
let reply = null;
|
|
326
|
+
const toolsUsed = () => buildTrajectory(allEvents).turns.flatMap(t => t.toolCalls.map(c => c.toolName));
|
|
327
|
+
const toolCallIo = () => buildTrajectory(allEvents).turns.flatMap(turn => turn.toolCalls.map(c => ({
|
|
328
|
+
toolName: c.toolName,
|
|
329
|
+
...(c.args === undefined ? {} : { args: c.args }),
|
|
330
|
+
...(c.output === undefined ? {} : { output: c.output }),
|
|
331
|
+
isError: c.isError,
|
|
332
|
+
})));
|
|
333
|
+
const finish = (extra) => ({
|
|
334
|
+
id: discovered.id,
|
|
335
|
+
path: discovered.path,
|
|
336
|
+
...(def.description === undefined ? {} : { description: def.description }),
|
|
337
|
+
ok: extra.ok,
|
|
338
|
+
verdict: extra.verdict,
|
|
339
|
+
skipReason: extra.skipReason,
|
|
340
|
+
assertions: recorder.results(),
|
|
341
|
+
error: extra.error,
|
|
342
|
+
logs,
|
|
343
|
+
metrics,
|
|
344
|
+
metadata: def.metadata,
|
|
345
|
+
tags: def.tags,
|
|
346
|
+
inputs,
|
|
347
|
+
toolCalls: toolCallIo(),
|
|
348
|
+
...(sessionId === undefined ? {} : { sessionId }),
|
|
349
|
+
finalText: extra.finalText,
|
|
350
|
+
tools: toolsUsed(),
|
|
351
|
+
durationMs: Date.now() - startedAt,
|
|
352
|
+
});
|
|
353
|
+
if (opts.signal?.aborted) {
|
|
354
|
+
return finish({ verdict: "failed", ok: false, error: "cancelled" });
|
|
355
|
+
}
|
|
356
|
+
// A judge that cannot reach a model must not look like a quality regression:
|
|
357
|
+
// the case is skipped visibly instead.
|
|
358
|
+
let judgeUnavailable;
|
|
359
|
+
const timeout = new AbortController();
|
|
360
|
+
const timer = setTimeout(() => timeout.abort(), clampTimerDelay(timeoutMs));
|
|
361
|
+
// A pending case timer must not hold the process open on its own.
|
|
362
|
+
timer.unref?.();
|
|
363
|
+
const runAssertions = createAssertions({
|
|
364
|
+
recorder,
|
|
365
|
+
events: () => allEvents,
|
|
366
|
+
});
|
|
367
|
+
const judge = createJudgeSurface({
|
|
368
|
+
recorder,
|
|
369
|
+
grader: name => EVAL_JUDGE_GRADERS[name],
|
|
370
|
+
resolveModel: callModel => resolveJudgeModel({
|
|
371
|
+
call: callModel,
|
|
372
|
+
evalLevel: def.judge?.model,
|
|
373
|
+
config: opts.judge.configModel,
|
|
374
|
+
env: process.env[EVAL_JUDGE_MODEL_ENV],
|
|
375
|
+
}),
|
|
376
|
+
caller: opts.judge.caller,
|
|
377
|
+
defaultValue: () => reply,
|
|
378
|
+
onUnavailable: message => {
|
|
379
|
+
judgeUnavailable = judgeUnavailable ?? message;
|
|
380
|
+
},
|
|
381
|
+
});
|
|
382
|
+
// Accessors lead the literal: the es2015 build lowers an object spread to
|
|
383
|
+
// `Object.assign`, which reads any accessor after it once and freezes it.
|
|
384
|
+
const t = {
|
|
385
|
+
get reply() {
|
|
386
|
+
return reply;
|
|
387
|
+
},
|
|
388
|
+
get sessionId() {
|
|
389
|
+
return sessionId;
|
|
390
|
+
},
|
|
391
|
+
get events() {
|
|
392
|
+
return allEvents;
|
|
393
|
+
},
|
|
394
|
+
get turns() {
|
|
395
|
+
return turns;
|
|
396
|
+
},
|
|
397
|
+
get iteration() {
|
|
398
|
+
return def.iteration ?? 1;
|
|
399
|
+
},
|
|
400
|
+
get iterations() {
|
|
401
|
+
return def.iterations ?? 1;
|
|
402
|
+
},
|
|
403
|
+
get signal() {
|
|
404
|
+
return timeout.signal;
|
|
405
|
+
},
|
|
406
|
+
judge,
|
|
407
|
+
async send(message, options = {}) {
|
|
408
|
+
inputs.push(message);
|
|
409
|
+
const result = await opts.transport.send({
|
|
410
|
+
message,
|
|
411
|
+
sessionId,
|
|
412
|
+
continuationToken,
|
|
413
|
+
startIndex: nextEventIndex,
|
|
414
|
+
options,
|
|
415
|
+
timeoutMs,
|
|
416
|
+
signal: opts.signal,
|
|
417
|
+
onEvent: opts.onEvent,
|
|
418
|
+
});
|
|
419
|
+
sessionId = result.sessionId;
|
|
420
|
+
continuationToken = result.continuationToken;
|
|
421
|
+
nextEventIndex = result.nextEventIndex ?? nextEventIndex;
|
|
422
|
+
allEvents.push(...result.events);
|
|
423
|
+
if (result.trajectory.finalText !== "") {
|
|
424
|
+
reply = result.trajectory.finalText;
|
|
425
|
+
}
|
|
426
|
+
const index = turns.length + 1;
|
|
427
|
+
// The turn is immutable, so its assertions read a frozen event slice
|
|
428
|
+
// even after later turns append to the run.
|
|
429
|
+
const turnEvents = [...result.events];
|
|
430
|
+
const turn = {
|
|
431
|
+
...createAssertions({
|
|
432
|
+
recorder,
|
|
433
|
+
events: () => turnEvents,
|
|
434
|
+
scope: `turn[${index}]`,
|
|
435
|
+
}),
|
|
436
|
+
message: result.trajectory.finalText,
|
|
437
|
+
sessionId: result.sessionId,
|
|
438
|
+
events: turnEvents,
|
|
439
|
+
toolCalls: result.trajectory.turns.flatMap(turn => turn.toolCalls.map(c => c.toolName)),
|
|
440
|
+
ok: result.ok,
|
|
441
|
+
index,
|
|
442
|
+
expectOk() {
|
|
443
|
+
if (!result.ok) {
|
|
444
|
+
throw new Error(`turn[${index}] failed: ${result.trajectory.turns.find(x => x.failed)?.error ?? "unknown error"}`);
|
|
429
445
|
}
|
|
430
|
-
const index = turns.length + 1;
|
|
431
|
-
// The turn is immutable, so its assertions read a frozen event slice
|
|
432
|
-
// even after later turns append to the run.
|
|
433
|
-
const turnEvents = [...result.events];
|
|
434
|
-
const turn = Object.assign(Object.assign({}, createAssertions({
|
|
435
|
-
recorder,
|
|
436
|
-
events: () => turnEvents,
|
|
437
|
-
scope: `turn[${index}]`,
|
|
438
|
-
})), { message: result.trajectory.finalText, sessionId: result.sessionId, events: turnEvents, toolCalls: result.trajectory.turns.flatMap(turn => turn.toolCalls.map(c => c.toolName)), ok: result.ok, index,
|
|
439
|
-
expectOk() {
|
|
440
|
-
var _a;
|
|
441
|
-
var _b;
|
|
442
|
-
if (!result.ok) {
|
|
443
|
-
throw new Error(`turn[${index}] failed: ${(_b = (_a = result.trajectory.turns.find(x => x.failed)) === null || _a === void 0 ? void 0 : _a.error) !== null && _b !== void 0 ? _b : "unknown error"}`);
|
|
444
|
-
}
|
|
445
|
-
return turn;
|
|
446
|
-
} });
|
|
447
|
-
turns.push(turn);
|
|
448
446
|
return turn;
|
|
449
|
-
}
|
|
450
|
-
}
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
});
|
|
466
|
-
},
|
|
467
|
-
skip(reason) {
|
|
468
|
-
throw new EvalSkipSignal(reason);
|
|
469
|
-
},
|
|
470
|
-
log(message) {
|
|
471
|
-
logs.push(message);
|
|
472
|
-
if (opts.verbose) {
|
|
473
|
-
process.stderr.write(` ${message}\n`);
|
|
474
|
-
}
|
|
475
|
-
},
|
|
476
|
-
metric(name, value) {
|
|
477
|
-
const key = name.trim();
|
|
478
|
-
if (key === "") {
|
|
479
|
-
return;
|
|
480
|
-
}
|
|
481
|
-
metrics[key] = value;
|
|
482
|
-
if (opts.verbose) {
|
|
483
|
-
process.stderr.write(` metric ${key}=${String(value)}\n`);
|
|
484
|
-
}
|
|
485
|
-
} }, runAssertions);
|
|
486
|
-
try {
|
|
487
|
-
yield def.test(t);
|
|
488
|
-
}
|
|
489
|
-
catch (error) {
|
|
490
|
-
if (error instanceof EvalSkipSignal) {
|
|
491
|
-
clearTimeout(timer);
|
|
492
|
-
return finish({
|
|
493
|
-
verdict: "skipped",
|
|
494
|
-
ok: true,
|
|
495
|
-
skipReason: error.reason,
|
|
496
|
-
finalText: reply !== null && reply !== void 0 ? reply : undefined,
|
|
497
|
-
});
|
|
447
|
+
},
|
|
448
|
+
};
|
|
449
|
+
turns.push(turn);
|
|
450
|
+
return turn;
|
|
451
|
+
},
|
|
452
|
+
async require(value, assertion) {
|
|
453
|
+
const outcome = evaluateExpectation(value, assertion);
|
|
454
|
+
recorder.record({
|
|
455
|
+
name: `require(${assertion.kind})`,
|
|
456
|
+
passed: outcome.passed,
|
|
457
|
+
detail: outcome.detail,
|
|
458
|
+
score: outcome.score,
|
|
459
|
+
severity: "gate",
|
|
460
|
+
});
|
|
461
|
+
if (!outcome.passed) {
|
|
462
|
+
throw new EvalRequireFailure(`require(${assertion.kind})`);
|
|
498
463
|
}
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
verdict: "failed",
|
|
509
|
-
ok: false,
|
|
510
|
-
error: message,
|
|
511
|
-
finalText: reply !== null && reply !== void 0 ? reply : undefined,
|
|
512
|
-
});
|
|
464
|
+
return value;
|
|
465
|
+
},
|
|
466
|
+
skip(reason) {
|
|
467
|
+
throw new EvalSkipSignal(reason);
|
|
468
|
+
},
|
|
469
|
+
log(message) {
|
|
470
|
+
logs.push(message);
|
|
471
|
+
if (opts.verbose) {
|
|
472
|
+
process.stderr.write(` ${message}\n`);
|
|
513
473
|
}
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
if (judgeUnavailable !== undefined && verdict !== "failed") {
|
|
534
|
-
logs.push(`judge skipped: ${judgeUnavailable}`);
|
|
474
|
+
},
|
|
475
|
+
metric(name, value) {
|
|
476
|
+
const key = name.trim();
|
|
477
|
+
if (key === "") {
|
|
478
|
+
return;
|
|
479
|
+
}
|
|
480
|
+
metrics[key] = value;
|
|
481
|
+
if (opts.verbose) {
|
|
482
|
+
process.stderr.write(` metric ${key}=${String(value)}\n`);
|
|
483
|
+
}
|
|
484
|
+
},
|
|
485
|
+
...runAssertions,
|
|
486
|
+
};
|
|
487
|
+
try {
|
|
488
|
+
await def.test(t);
|
|
489
|
+
}
|
|
490
|
+
catch (error) {
|
|
491
|
+
if (error instanceof EvalSkipSignal) {
|
|
492
|
+
clearTimeout(timer);
|
|
535
493
|
return finish({
|
|
536
494
|
verdict: "skipped",
|
|
537
495
|
ok: true,
|
|
538
|
-
skipReason:
|
|
539
|
-
finalText,
|
|
496
|
+
skipReason: error.reason,
|
|
497
|
+
finalText: reply ?? undefined,
|
|
540
498
|
});
|
|
541
499
|
}
|
|
542
|
-
if (
|
|
543
|
-
|
|
500
|
+
if (!(error instanceof EvalRequireFailure)) {
|
|
501
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
502
|
+
if (error instanceof RunSessionTimeoutError) {
|
|
503
|
+
sessionId ??= error.sessionId;
|
|
504
|
+
allEvents.push(...error.events);
|
|
505
|
+
}
|
|
506
|
+
await recorder.waitForPending().catch(() => undefined);
|
|
507
|
+
clearTimeout(timer);
|
|
508
|
+
return finish({
|
|
509
|
+
verdict: "failed",
|
|
510
|
+
ok: false,
|
|
511
|
+
error: message,
|
|
512
|
+
finalText: reply ?? undefined,
|
|
513
|
+
});
|
|
544
514
|
}
|
|
515
|
+
// `require` already recorded the failing gate; fall through so the verdict
|
|
516
|
+
// comes from the assertions rather than a duplicate execution error.
|
|
517
|
+
}
|
|
518
|
+
await recorder.waitForPending();
|
|
519
|
+
clearTimeout(timer);
|
|
520
|
+
const assertions = recorder.results();
|
|
521
|
+
const traj = buildTrajectory(allEvents);
|
|
522
|
+
// With no assertions at all, keep the historical fallback: a case that just
|
|
523
|
+
// drives the agent passes when the run itself succeeded.
|
|
524
|
+
const verdict = assertions.length > 0
|
|
525
|
+
? computeVerdict(assertions)
|
|
526
|
+
: traj.ok && traj.turns.length > 0
|
|
527
|
+
? "passed"
|
|
528
|
+
: "failed";
|
|
529
|
+
const finalText = reply ?? traj.finalText;
|
|
530
|
+
// An unreachable judge means the *judged* signal is unknown, so the case is
|
|
531
|
+
// reported as skipped rather than as a quality regression. It must not also
|
|
532
|
+
// bury a deterministic gate that already failed: skipping a failed case would
|
|
533
|
+
// turn a red eval green on any machine that happens to lack credentials.
|
|
534
|
+
if (judgeUnavailable !== undefined && verdict !== "failed") {
|
|
535
|
+
logs.push(`judge skipped: ${judgeUnavailable}`);
|
|
545
536
|
return finish({
|
|
546
|
-
verdict,
|
|
547
|
-
ok:
|
|
537
|
+
verdict: "skipped",
|
|
538
|
+
ok: true,
|
|
539
|
+
skipReason: judgeUnavailable,
|
|
548
540
|
finalText,
|
|
549
541
|
});
|
|
542
|
+
}
|
|
543
|
+
if (judgeUnavailable !== undefined) {
|
|
544
|
+
logs.push(`judge unavailable (${judgeUnavailable}), but a gate already failed — reporting the failure`);
|
|
545
|
+
}
|
|
546
|
+
return finish({
|
|
547
|
+
verdict,
|
|
548
|
+
ok: verdict !== "failed",
|
|
549
|
+
finalText,
|
|
550
550
|
});
|
|
551
551
|
}
|
|
552
552
|
/** Clamp a case timeout to a delay `setTimeout` can represent. */
|
|
553
553
|
function clampTimerDelay(timeoutMs) {
|
|
554
|
-
const MAX_TIMER =
|
|
554
|
+
const MAX_TIMER = 2_147_483_647;
|
|
555
555
|
return Math.min(Math.max(timeoutMs, 0), MAX_TIMER);
|
|
556
556
|
}
|
|
557
557
|
/**
|
|
@@ -561,7 +561,7 @@ function clampTimerDelay(timeoutMs) {
|
|
|
561
561
|
function createJudgeSurface(args) {
|
|
562
562
|
const grade = (graderName, reference, options) => {
|
|
563
563
|
const grader = args.grader(graderName);
|
|
564
|
-
const model = args.resolveModel(options
|
|
564
|
+
const model = args.resolveModel(options?.model);
|
|
565
565
|
const name = `judge.${graderName}(${truncateForName(reference)})`;
|
|
566
566
|
if (model === undefined) {
|
|
567
567
|
// A missing judge model is an authoring error, not a flaky provider.
|
|
@@ -573,8 +573,8 @@ function createJudgeSurface(args) {
|
|
|
573
573
|
});
|
|
574
574
|
}
|
|
575
575
|
const submission = renderSubmission(options !== undefined && "on" in options ? options.on : args.defaultValue());
|
|
576
|
-
const settle = (() =>
|
|
577
|
-
const reply =
|
|
576
|
+
const settle = (async () => {
|
|
577
|
+
const reply = await args.caller({
|
|
578
578
|
prompt: grader.buildPrompt({ submission, reference }),
|
|
579
579
|
model,
|
|
580
580
|
});
|
|
@@ -586,7 +586,7 @@ function createJudgeSurface(args) {
|
|
|
586
586
|
? `${result.choice} (${result.score.toFixed(2)})`
|
|
587
587
|
: `${result.choice} (${result.score.toFixed(2)}) — ${result.rationale}`,
|
|
588
588
|
};
|
|
589
|
-
})
|
|
589
|
+
})().catch((error) => {
|
|
590
590
|
if (error instanceof EvalJudgeUnavailableError) {
|
|
591
591
|
args.onUnavailable(error.message);
|
|
592
592
|
return { passed: true, detail: `skipped: ${error.message}` };
|
|
@@ -597,14 +597,12 @@ function createJudgeSurface(args) {
|
|
|
597
597
|
return args.recorder.recordAsync({ name, passed: true, severity: "soft", detail: "grading…" }, settle);
|
|
598
598
|
};
|
|
599
599
|
return {
|
|
600
|
-
model(prompt, options) {
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
return args.caller({ prompt, model });
|
|
607
|
-
});
|
|
600
|
+
async model(prompt, options) {
|
|
601
|
+
const model = args.resolveModel(options?.model);
|
|
602
|
+
if (model === undefined) {
|
|
603
|
+
throw new Error("t.judge.model: no judge model configured; set judge.model in evals.config.ts, on the eval, or on the call");
|
|
604
|
+
}
|
|
605
|
+
return args.caller({ prompt, model });
|
|
608
606
|
},
|
|
609
607
|
factuality: (expected, options) => grade("factuality", expected, options),
|
|
610
608
|
summarizes: (expected, options) => grade("summarizes", expected, options),
|