@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
|
@@ -9,15 +9,6 @@
|
|
|
9
9
|
* id (including custom channels such as `drive`) when the token matches its
|
|
10
10
|
* active HTTP follow-up key; task sessions stay fire-and-forget.
|
|
11
11
|
*/
|
|
12
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
13
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
14
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
15
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
16
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
17
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
18
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
19
|
-
});
|
|
20
|
-
};
|
|
21
12
|
import { samePrincipal } from "./auth.js";
|
|
22
13
|
import { formatContinuationToken, parseContinuationToken } from "./ids.js";
|
|
23
14
|
import { isRecord } from "./is-record.js";
|
|
@@ -26,54 +17,59 @@ import { ApprovalInterruptedError, ApprovalNotFoundError, AuthInterruptedError,
|
|
|
26
17
|
import { eventsUrlForSession, playgroundUrlForSession } from "./session-urls.js";
|
|
27
18
|
const SESSION_ID_HEADER = "x-agent-serve-session-id";
|
|
28
19
|
export function buildHttpChannelRoutes(args) {
|
|
29
|
-
var _a, _b, _c, _d;
|
|
30
20
|
const { engine, config, auth } = args;
|
|
31
|
-
const base =
|
|
32
|
-
const relaxSessionReadAuth =
|
|
33
|
-
const relaxSessionReadAuthBeyondLoopback =
|
|
34
|
-
const relaxSessionApprovalAuth =
|
|
35
|
-
const transformMessage = (message, authContext) =>
|
|
21
|
+
const base = args.basePath ?? "";
|
|
22
|
+
const relaxSessionReadAuth = args.relaxSessionReadAuth ?? false;
|
|
23
|
+
const relaxSessionReadAuthBeyondLoopback = args.relaxSessionReadAuthBeyondLoopback ?? false;
|
|
24
|
+
const relaxSessionApprovalAuth = args.relaxSessionApprovalAuth ?? false;
|
|
25
|
+
const transformMessage = async (message, authContext) => {
|
|
36
26
|
if (config.onMessage === undefined) {
|
|
37
27
|
return message;
|
|
38
28
|
}
|
|
39
29
|
return config.onMessage(message, { auth: authContext });
|
|
40
|
-
}
|
|
30
|
+
};
|
|
41
31
|
const createSession = {
|
|
42
32
|
method: "POST",
|
|
43
33
|
pattern: `${base}/v1/session`,
|
|
44
34
|
auth,
|
|
45
|
-
handler: (request, ctx) =>
|
|
46
|
-
|
|
47
|
-
const body = yield readJsonObject(request);
|
|
35
|
+
handler: async (request, ctx) => {
|
|
36
|
+
const body = await readJsonObject(request);
|
|
48
37
|
if (body === undefined || typeof body.message !== "string") {
|
|
49
38
|
return errorResponse(400, "invalid_request", "Expected a JSON body with a string `message`.");
|
|
50
39
|
}
|
|
51
40
|
if (body.asOf !== undefined && typeof body.asOf !== "string") {
|
|
52
41
|
return errorResponse(400, "invalid_request", "`asOf` must be an ISO-8601 instant with a timezone when provided.");
|
|
53
42
|
}
|
|
54
|
-
const message =
|
|
43
|
+
const message = await transformMessage(body.message, ctx.auth);
|
|
55
44
|
const workspaceFiles = readWorkspaceFiles(body.workspaceFiles);
|
|
56
45
|
// Per-session cloud attach (create only). Eval harness uses this to pin
|
|
57
46
|
// fixture repos without putting them on the agent's default cloud.repos.
|
|
58
47
|
const cloud = readCloudOptions(body.cloud);
|
|
59
|
-
const session =
|
|
48
|
+
const session = await engine.send(HTTP_CHANNEL_ID, message, {
|
|
49
|
+
auth: ctx.auth,
|
|
50
|
+
...(typeof body.title === "string" ? { title: body.title } : {}),
|
|
51
|
+
...(body.purpose === "eval" ? { purpose: "eval" } : {}),
|
|
52
|
+
...(body.dryRun === true ? { dryRun: true } : {}),
|
|
53
|
+
asOf: body.asOf,
|
|
54
|
+
...(workspaceFiles === undefined ? {} : { workspaceFiles }),
|
|
55
|
+
...(cloud === undefined ? {} : { cloud }),
|
|
56
|
+
});
|
|
60
57
|
return jsonResponse({
|
|
61
58
|
ok: true,
|
|
62
59
|
sessionId: session.id,
|
|
63
|
-
continuationToken: formatContinuationToken(HTTP_CHANNEL_ID,
|
|
60
|
+
continuationToken: formatContinuationToken(HTTP_CHANNEL_ID, session.continuationToken ?? ""),
|
|
64
61
|
playgroundUrl: playgroundUrlForSession(request, base, session.id),
|
|
65
62
|
traceUrl: eventsUrlForSession(request.url, base, session.id),
|
|
66
63
|
}, { headers: { [SESSION_ID_HEADER]: session.id } });
|
|
67
|
-
}
|
|
64
|
+
},
|
|
68
65
|
};
|
|
69
66
|
const followUp = {
|
|
70
67
|
method: "POST",
|
|
71
68
|
pattern: `${base}/v1/session/:sessionId`,
|
|
72
69
|
auth,
|
|
73
|
-
handler: (request, ctx) =>
|
|
74
|
-
|
|
75
|
-
const
|
|
76
|
-
const record = yield engine.getOrRestoreSession(sessionId);
|
|
70
|
+
handler: async (request, ctx) => {
|
|
71
|
+
const sessionId = ctx.params.sessionId ?? "";
|
|
72
|
+
const record = await engine.getOrRestoreSession(sessionId);
|
|
77
73
|
if (record === undefined) {
|
|
78
74
|
return errorResponse(404, "session_not_found", `Unknown session ${sessionId}.`);
|
|
79
75
|
}
|
|
@@ -90,7 +86,7 @@ export function buildHttpChannelRoutes(args) {
|
|
|
90
86
|
if (ownership !== undefined) {
|
|
91
87
|
return ownership;
|
|
92
88
|
}
|
|
93
|
-
const body =
|
|
89
|
+
const body = await readJsonObject(request);
|
|
94
90
|
if (body === undefined || typeof body.message !== "string") {
|
|
95
91
|
return errorResponse(400, "invalid_request", "Expected a JSON body with a string `message`.");
|
|
96
92
|
}
|
|
@@ -101,8 +97,8 @@ export function buildHttpChannelRoutes(args) {
|
|
|
101
97
|
if (presented === null) {
|
|
102
98
|
return errorResponse(409, "stale_continuation_token", "The continuation token does not address this session's active continuation.");
|
|
103
99
|
}
|
|
104
|
-
const message =
|
|
105
|
-
const rotated =
|
|
100
|
+
const message = await transformMessage(body.message, ctx.auth);
|
|
101
|
+
const rotated = await engine.followUpHttp(sessionId, presented, message);
|
|
106
102
|
if (rotated === undefined) {
|
|
107
103
|
return errorResponse(409, "stale_continuation_token", "The continuation token does not address this session's active continuation.");
|
|
108
104
|
}
|
|
@@ -111,22 +107,21 @@ export function buildHttpChannelRoutes(args) {
|
|
|
111
107
|
sessionId,
|
|
112
108
|
continuationToken: formatContinuationToken(HTTP_CHANNEL_ID, rotated),
|
|
113
109
|
}, { headers: { [SESSION_ID_HEADER]: sessionId } });
|
|
114
|
-
}
|
|
110
|
+
},
|
|
115
111
|
};
|
|
116
112
|
const stream = {
|
|
117
113
|
method: "GET",
|
|
118
114
|
pattern: `${base}/v1/session/:sessionId/stream`,
|
|
119
115
|
auth,
|
|
120
|
-
handler: (request, ctx) =>
|
|
121
|
-
|
|
122
|
-
const sessionId = (_a = ctx.params.sessionId) !== null && _a !== void 0 ? _a : "";
|
|
116
|
+
handler: async (request, ctx) => {
|
|
117
|
+
const sessionId = ctx.params.sessionId ?? "";
|
|
123
118
|
// The stream-and-inspect handle is runtime-owned: sessions started by
|
|
124
119
|
// custom channels or schedules are observable here too when the caller
|
|
125
120
|
// matches the session's stored principal (or `--dev` relax). Follow-ups
|
|
126
121
|
// use the same ownership gate plus the session's continuation token.
|
|
127
122
|
// Lazy-restore by id so playground Open-trace works after redeploy
|
|
128
123
|
// when the session is durable but not in the local state root yet.
|
|
129
|
-
const record =
|
|
124
|
+
const record = await engine.getOrRestoreSession(sessionId);
|
|
130
125
|
if (record === undefined) {
|
|
131
126
|
return errorResponse(404, "session_not_found", `Unknown session ${sessionId}.`);
|
|
132
127
|
}
|
|
@@ -144,7 +139,7 @@ export function buildHttpChannelRoutes(args) {
|
|
|
144
139
|
if (Number.isNaN(startIndex) || startIndex < 0) {
|
|
145
140
|
return errorResponse(400, "invalid_request", "startIndex must be a non-negative integer.");
|
|
146
141
|
}
|
|
147
|
-
const body =
|
|
142
|
+
const body = await engine.eventStream(sessionId, startIndex);
|
|
148
143
|
return new Response(body, {
|
|
149
144
|
status: 200,
|
|
150
145
|
headers: {
|
|
@@ -153,17 +148,16 @@ export function buildHttpChannelRoutes(args) {
|
|
|
153
148
|
[SESSION_ID_HEADER]: sessionId,
|
|
154
149
|
},
|
|
155
150
|
});
|
|
156
|
-
}
|
|
151
|
+
},
|
|
157
152
|
};
|
|
158
153
|
/** One-shot NDJSON (or JSON) dump of the session trace. */
|
|
159
154
|
const events = {
|
|
160
155
|
method: "GET",
|
|
161
156
|
pattern: `${base}/v1/session/:sessionId/events`,
|
|
162
157
|
auth,
|
|
163
|
-
handler: (request, ctx) =>
|
|
164
|
-
|
|
165
|
-
const
|
|
166
|
-
const record = yield engine.getOrRestoreSession(sessionId);
|
|
158
|
+
handler: async (request, ctx) => {
|
|
159
|
+
const sessionId = ctx.params.sessionId ?? "";
|
|
160
|
+
const record = await engine.getOrRestoreSession(sessionId);
|
|
167
161
|
if (record === undefined) {
|
|
168
162
|
return errorResponse(404, "session_not_found", `Unknown session ${sessionId}.`);
|
|
169
163
|
}
|
|
@@ -177,7 +171,7 @@ export function buildHttpChannelRoutes(args) {
|
|
|
177
171
|
}
|
|
178
172
|
const url = new URL(request.url);
|
|
179
173
|
const asJson = url.searchParams.get("format") === "json";
|
|
180
|
-
const snapshot =
|
|
174
|
+
const snapshot = await engine.listEvents(sessionId, 0, {
|
|
181
175
|
backfillCloudCost: true,
|
|
182
176
|
});
|
|
183
177
|
if (asJson) {
|
|
@@ -197,16 +191,15 @@ export function buildHttpChannelRoutes(args) {
|
|
|
197
191
|
[SESSION_ID_HEADER]: sessionId,
|
|
198
192
|
},
|
|
199
193
|
});
|
|
200
|
-
}
|
|
194
|
+
},
|
|
201
195
|
};
|
|
202
196
|
const cost = {
|
|
203
197
|
method: "GET",
|
|
204
198
|
pattern: `${base}/v1/session/:sessionId/cost`,
|
|
205
199
|
auth,
|
|
206
|
-
handler: (_request, ctx) =>
|
|
207
|
-
|
|
208
|
-
const
|
|
209
|
-
const record = yield engine.getOrRestoreSession(sessionId);
|
|
200
|
+
handler: async (_request, ctx) => {
|
|
201
|
+
const sessionId = ctx.params.sessionId ?? "";
|
|
202
|
+
const record = await engine.getOrRestoreSession(sessionId);
|
|
210
203
|
if (record === undefined) {
|
|
211
204
|
return errorResponse(404, "session_not_found", `Unknown session ${sessionId}.`);
|
|
212
205
|
}
|
|
@@ -218,20 +211,19 @@ export function buildHttpChannelRoutes(args) {
|
|
|
218
211
|
if (ownership !== undefined) {
|
|
219
212
|
return ownership;
|
|
220
213
|
}
|
|
221
|
-
const payload =
|
|
214
|
+
const payload = await engine.sessionCost(sessionId);
|
|
222
215
|
return jsonResponse(payload, {
|
|
223
216
|
headers: { [SESSION_ID_HEADER]: sessionId },
|
|
224
217
|
});
|
|
225
|
-
}
|
|
218
|
+
},
|
|
226
219
|
};
|
|
227
220
|
const listApprovals = {
|
|
228
221
|
method: "GET",
|
|
229
222
|
pattern: `${base}/v1/session/:sessionId/approvals`,
|
|
230
223
|
auth,
|
|
231
|
-
handler: (_request, ctx) =>
|
|
232
|
-
|
|
233
|
-
const
|
|
234
|
-
const record = yield engine.getOrRestoreSession(sessionId);
|
|
224
|
+
handler: async (_request, ctx) => {
|
|
225
|
+
const sessionId = ctx.params.sessionId ?? "";
|
|
226
|
+
const record = await engine.getOrRestoreSession(sessionId);
|
|
235
227
|
if (record === undefined) {
|
|
236
228
|
return errorResponse(404, "session_not_found", `Unknown session ${sessionId}.`);
|
|
237
229
|
}
|
|
@@ -243,25 +235,23 @@ export function buildHttpChannelRoutes(args) {
|
|
|
243
235
|
if (ownership !== undefined) {
|
|
244
236
|
return ownership;
|
|
245
237
|
}
|
|
246
|
-
const pending =
|
|
238
|
+
const pending = await engine.listPendingApprovals(sessionId);
|
|
247
239
|
return jsonResponse({ ok: true, sessionId, pending });
|
|
248
|
-
}
|
|
240
|
+
},
|
|
249
241
|
};
|
|
250
242
|
const resolveApproval = {
|
|
251
243
|
method: "POST",
|
|
252
244
|
pattern: `${base}/v1/session/:sessionId/approvals/:callId`,
|
|
253
245
|
auth,
|
|
254
|
-
handler: (request, ctx) =>
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
const
|
|
258
|
-
const callId = (_c = ctx.params.callId) !== null && _c !== void 0 ? _c : "";
|
|
259
|
-
const record = yield engine.getOrRestoreSession(sessionId);
|
|
246
|
+
handler: async (request, ctx) => {
|
|
247
|
+
const sessionId = ctx.params.sessionId ?? "";
|
|
248
|
+
const callId = ctx.params.callId ?? "";
|
|
249
|
+
const record = await engine.getOrRestoreSession(sessionId);
|
|
260
250
|
if (record === undefined) {
|
|
261
251
|
return errorResponse(404, "session_not_found", `Unknown session ${sessionId}.`);
|
|
262
252
|
}
|
|
263
253
|
const bridgeSlackApproval = relaxSessionApprovalAuth === true &&
|
|
264
|
-
|
|
254
|
+
record.auth?.authenticator === "slack" &&
|
|
265
255
|
(relaxSessionReadAuthBeyondLoopback === true ||
|
|
266
256
|
(typeof ctx.requestIp === "string" && isLoopbackAddress(ctx.requestIp)));
|
|
267
257
|
const ownership = requireSessionOwner(record, ctx.auth, {
|
|
@@ -274,13 +264,13 @@ export function buildHttpChannelRoutes(args) {
|
|
|
274
264
|
if (ownership !== undefined) {
|
|
275
265
|
return ownership;
|
|
276
266
|
}
|
|
277
|
-
const body =
|
|
278
|
-
const decision = body
|
|
267
|
+
const body = await readJsonObject(request);
|
|
268
|
+
const decision = body?.decision;
|
|
279
269
|
if (decision !== "approve" && decision !== "deny") {
|
|
280
270
|
return errorResponse(400, "invalid_request", 'Expected a JSON body with `decision`: "approve" | "deny".');
|
|
281
271
|
}
|
|
282
272
|
try {
|
|
283
|
-
const pending =
|
|
273
|
+
const pending = await engine.resolveApproval(sessionId, callId, decision, ctx.auth, bridgeSlackApproval ? { asSessionOwner: true } : undefined);
|
|
284
274
|
return jsonResponse({
|
|
285
275
|
ok: true,
|
|
286
276
|
sessionId,
|
|
@@ -301,16 +291,15 @@ export function buildHttpChannelRoutes(args) {
|
|
|
301
291
|
}
|
|
302
292
|
throw error;
|
|
303
293
|
}
|
|
304
|
-
}
|
|
294
|
+
},
|
|
305
295
|
};
|
|
306
296
|
const stop = {
|
|
307
297
|
method: "POST",
|
|
308
298
|
pattern: `${base}/v1/session/:sessionId/stop`,
|
|
309
299
|
auth,
|
|
310
|
-
handler: (_request, ctx) =>
|
|
311
|
-
|
|
312
|
-
const
|
|
313
|
-
const record = yield engine.getOrRestoreSession(sessionId);
|
|
300
|
+
handler: async (_request, ctx) => {
|
|
301
|
+
const sessionId = ctx.params.sessionId ?? "";
|
|
302
|
+
const record = await engine.getOrRestoreSession(sessionId);
|
|
314
303
|
if (record === undefined) {
|
|
315
304
|
return errorResponse(404, "session_not_found", `Unknown session ${sessionId}.`);
|
|
316
305
|
}
|
|
@@ -322,18 +311,17 @@ export function buildHttpChannelRoutes(args) {
|
|
|
322
311
|
if (ownership !== undefined) {
|
|
323
312
|
return ownership;
|
|
324
313
|
}
|
|
325
|
-
const interrupted =
|
|
314
|
+
const interrupted = await engine.interrupt(sessionId);
|
|
326
315
|
return jsonResponse({ ok: true, interrupted }, { headers: { [SESSION_ID_HEADER]: sessionId } });
|
|
327
|
-
}
|
|
316
|
+
},
|
|
328
317
|
};
|
|
329
318
|
const listAuths = {
|
|
330
319
|
method: "GET",
|
|
331
320
|
pattern: `${base}/v1/session/:sessionId/auths`,
|
|
332
321
|
auth,
|
|
333
|
-
handler: (_request, ctx) =>
|
|
334
|
-
|
|
335
|
-
const
|
|
336
|
-
const record = yield engine.getOrRestoreSession(sessionId);
|
|
322
|
+
handler: async (_request, ctx) => {
|
|
323
|
+
const sessionId = ctx.params.sessionId ?? "";
|
|
324
|
+
const record = await engine.getOrRestoreSession(sessionId);
|
|
337
325
|
if (record === undefined) {
|
|
338
326
|
return errorResponse(404, "session_not_found", `Unknown session ${sessionId}.`);
|
|
339
327
|
}
|
|
@@ -345,25 +333,23 @@ export function buildHttpChannelRoutes(args) {
|
|
|
345
333
|
if (ownership !== undefined) {
|
|
346
334
|
return ownership;
|
|
347
335
|
}
|
|
348
|
-
const pending =
|
|
336
|
+
const pending = await engine.listPendingAuths(sessionId);
|
|
349
337
|
return jsonResponse({ ok: true, sessionId, pending });
|
|
350
|
-
}
|
|
338
|
+
},
|
|
351
339
|
};
|
|
352
340
|
const resolveAuth = {
|
|
353
341
|
method: "POST",
|
|
354
342
|
pattern: `${base}/v1/session/:sessionId/auths/:callId`,
|
|
355
343
|
auth,
|
|
356
|
-
handler: (request, ctx) =>
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
const
|
|
360
|
-
const callId = (_c = ctx.params.callId) !== null && _c !== void 0 ? _c : "";
|
|
361
|
-
const record = yield engine.getOrRestoreSession(sessionId);
|
|
344
|
+
handler: async (request, ctx) => {
|
|
345
|
+
const sessionId = ctx.params.sessionId ?? "";
|
|
346
|
+
const callId = ctx.params.callId ?? "";
|
|
347
|
+
const record = await engine.getOrRestoreSession(sessionId);
|
|
362
348
|
if (record === undefined) {
|
|
363
349
|
return errorResponse(404, "session_not_found", `Unknown session ${sessionId}.`);
|
|
364
350
|
}
|
|
365
351
|
const bridgeSlackAuth = relaxSessionApprovalAuth === true &&
|
|
366
|
-
|
|
352
|
+
record.auth?.authenticator === "slack" &&
|
|
367
353
|
(relaxSessionReadAuthBeyondLoopback === true ||
|
|
368
354
|
(typeof ctx.requestIp === "string" && isLoopbackAddress(ctx.requestIp)));
|
|
369
355
|
const ownership = requireSessionOwner(record, ctx.auth, {
|
|
@@ -374,13 +360,13 @@ export function buildHttpChannelRoutes(args) {
|
|
|
374
360
|
if (ownership !== undefined) {
|
|
375
361
|
return ownership;
|
|
376
362
|
}
|
|
377
|
-
const body =
|
|
378
|
-
const decision = body
|
|
363
|
+
const body = await readJsonObject(request);
|
|
364
|
+
const decision = body?.decision;
|
|
379
365
|
if (decision !== "approve" && decision !== "deny") {
|
|
380
366
|
return errorResponse(400, "invalid_request", 'Expected a JSON body with `decision`: "approve" | "deny".');
|
|
381
367
|
}
|
|
382
368
|
try {
|
|
383
|
-
const pending =
|
|
369
|
+
const pending = await engine.resolveAuth(sessionId, callId, decision, ctx.auth, bridgeSlackAuth ? { asSessionOwner: true } : undefined);
|
|
384
370
|
return jsonResponse({
|
|
385
371
|
ok: true,
|
|
386
372
|
sessionId,
|
|
@@ -401,7 +387,7 @@ export function buildHttpChannelRoutes(args) {
|
|
|
401
387
|
}
|
|
402
388
|
throw error;
|
|
403
389
|
}
|
|
404
|
-
}
|
|
390
|
+
},
|
|
405
391
|
};
|
|
406
392
|
return [
|
|
407
393
|
createSession,
|
|
@@ -420,7 +406,7 @@ export function requireSessionOwner(record, caller, options) {
|
|
|
420
406
|
// Dev playground lists every session (`includeAll`); match that by
|
|
421
407
|
// allowing cross-principal read/follow-up. Loopback-only unless
|
|
422
408
|
// `--allow-anonymous` also opted into beyondLoopback.
|
|
423
|
-
const relaxOwnership =
|
|
409
|
+
const relaxOwnership = options?.relax === true &&
|
|
424
410
|
(options.beyondLoopback === true ||
|
|
425
411
|
(typeof options.requestIp === "string" && isLoopbackAddress(options.requestIp)));
|
|
426
412
|
if (relaxOwnership || samePrincipal(record.auth, caller)) {
|
|
@@ -429,10 +415,12 @@ export function requireSessionOwner(record, caller, options) {
|
|
|
429
415
|
return errorResponse(403, "forbidden", "This session belongs to a different principal.");
|
|
430
416
|
}
|
|
431
417
|
export function jsonResponse(data, init = {}) {
|
|
432
|
-
var _a;
|
|
433
418
|
return new Response(JSON.stringify(data), {
|
|
434
|
-
status:
|
|
435
|
-
headers:
|
|
419
|
+
status: init.status ?? 200,
|
|
420
|
+
headers: {
|
|
421
|
+
"content-type": "application/json; charset=utf-8",
|
|
422
|
+
...init.headers,
|
|
423
|
+
},
|
|
436
424
|
});
|
|
437
425
|
}
|
|
438
426
|
export function errorResponse(status, code, message) {
|
|
@@ -481,7 +469,11 @@ function readCloudOptions(value) {
|
|
|
481
469
|
if (!isRecord(entry) || typeof entry.url !== "string" || entry.url === "") {
|
|
482
470
|
continue;
|
|
483
471
|
}
|
|
484
|
-
repos.push(
|
|
472
|
+
repos.push({
|
|
473
|
+
url: entry.url,
|
|
474
|
+
...(typeof entry.startingRef === "string" ? { startingRef: entry.startingRef } : {}),
|
|
475
|
+
...(typeof entry.prUrl === "string" ? { prUrl: entry.prUrl } : {}),
|
|
476
|
+
});
|
|
485
477
|
}
|
|
486
478
|
if (repos.length > 0) {
|
|
487
479
|
cloud.repos = repos;
|
|
@@ -510,25 +502,22 @@ function readCloudOptions(value) {
|
|
|
510
502
|
return Object.keys(cloud).length === 0 ? undefined : cloud;
|
|
511
503
|
}
|
|
512
504
|
/** Parse a JSON object body. Requires `application/json` (CORS-simple types do not parse). */
|
|
513
|
-
export function readJsonObject(request) {
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
return parsed;
|
|
523
|
-
}
|
|
524
|
-
return undefined;
|
|
525
|
-
}
|
|
526
|
-
catch (_a) {
|
|
527
|
-
return undefined;
|
|
505
|
+
export async function readJsonObject(request) {
|
|
506
|
+
const contentType = request.headers.get("content-type");
|
|
507
|
+
if (contentType === null || !isApplicationJson(contentType)) {
|
|
508
|
+
return undefined;
|
|
509
|
+
}
|
|
510
|
+
try {
|
|
511
|
+
const parsed = await request.json();
|
|
512
|
+
if (typeof parsed === "object" && parsed !== null && !Array.isArray(parsed)) {
|
|
513
|
+
return parsed;
|
|
528
514
|
}
|
|
529
|
-
|
|
515
|
+
return undefined;
|
|
516
|
+
}
|
|
517
|
+
catch {
|
|
518
|
+
return undefined;
|
|
519
|
+
}
|
|
530
520
|
}
|
|
531
521
|
function isApplicationJson(contentType) {
|
|
532
|
-
|
|
533
|
-
return ((_a = contentType.split(";", 1)[0]) === null || _a === void 0 ? void 0 : _a.trim().toLowerCase()) === "application/json";
|
|
522
|
+
return contentType.split(";", 1)[0]?.trim().toLowerCase() === "application/json";
|
|
534
523
|
}
|
|
@@ -8,13 +8,23 @@
|
|
|
8
8
|
* execution (never through this payload), so authored code cannot pick
|
|
9
9
|
* one. {@link HttpChannelDefinition.onAdmit} runs against the mailbox
|
|
10
10
|
* key and the original message before that send is captured.
|
|
11
|
+
*
|
|
12
|
+
* `agentsdk.eval-case` reserves the session's send for one eval case: the
|
|
13
|
+
* hosted execution runs the case body there instead of a single turn. The
|
|
14
|
+
* case body writes every message, so it skips `onAdmit` and `onMessage`.
|
|
11
15
|
*/
|
|
12
|
-
import type { ChannelHandlerArgs, HttpChannelDefinition } from "../types.js";
|
|
16
|
+
import type { ChannelHandlerArgs, HttpChannelDefinition, SendMessageOptions } from "../types.js";
|
|
13
17
|
export type ControlPlaneSessionPayload = {
|
|
14
18
|
message: string;
|
|
15
19
|
dryRun?: boolean | undefined;
|
|
16
20
|
asOf?: string | undefined;
|
|
17
21
|
};
|
|
22
|
+
export type EvalCaseRef = {
|
|
23
|
+
runId: string;
|
|
24
|
+
caseId: string;
|
|
25
|
+
};
|
|
26
|
+
/** The eval case an `agentsdk.eval-case` admission reserved this send for. */
|
|
27
|
+
export declare function evalCaseOf(options: SendMessageOptions): EvalCaseRef | undefined;
|
|
18
28
|
export declare function parseControlPlaneSessionPayload(payload: unknown): {
|
|
19
29
|
ok: true;
|
|
20
30
|
data: ControlPlaneSessionPayload;
|
|
@@ -22,6 +32,13 @@ export declare function parseControlPlaneSessionPayload(payload: unknown): {
|
|
|
22
32
|
ok: false;
|
|
23
33
|
error: string;
|
|
24
34
|
};
|
|
35
|
+
export declare function parseControlPlaneEvalCasePayload(payload: unknown): {
|
|
36
|
+
ok: true;
|
|
37
|
+
data: EvalCaseRef;
|
|
38
|
+
} | {
|
|
39
|
+
ok: false;
|
|
40
|
+
error: string;
|
|
41
|
+
};
|
|
25
42
|
export declare function dispatchHttpControlPlaneSession(input: {
|
|
26
43
|
eventType: string;
|
|
27
44
|
payload: unknown;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-control-plane-session.d.ts","sourceRoot":"","sources":["../../src/internal/http-control-plane-session.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"http-control-plane-session.d.ts","sourceRoot":"","sources":["../../src/internal/http-control-plane-session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAUjG,MAAM,MAAM,0BAA0B,GAAG;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAY5D,8EAA8E;AAC9E,wBAAgB,UAAU,CAAC,OAAO,EAAE,kBAAkB,GAAG,WAAW,GAAG,SAAS,CAE/E;AAED,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,OAAO,GACf;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,0BAA0B,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CA4B/E;AAED,wBAAgB,gCAAgC,CAC9C,OAAO,EAAE,OAAO,GACf;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,WAAW,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAiBhE;AAeD,wBAAsB,+BAA+B,CAAC,KAAK,EAAE;IAC3D,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,kBAAkB,CAAC;IACzB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,SAAS,CAAC,EAAE,qBAAqB,CAAC,WAAW,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,qBAAqB,CAAC,SAAS,CAAC,CAAC;CAC5C,GAAG,OAAO,CAAC,QAAQ,CAAC,CA4BpB;AAED,wBAAgB,+BAA+B,CAAC,UAAU,EAAE,qBAAqB,GAAG,IAAI,CAavF"}
|
|
@@ -8,22 +8,25 @@
|
|
|
8
8
|
* execution (never through this payload), so authored code cannot pick
|
|
9
9
|
* one. {@link HttpChannelDefinition.onAdmit} runs against the mailbox
|
|
10
10
|
* key and the original message before that send is captured.
|
|
11
|
+
*
|
|
12
|
+
* `agentsdk.eval-case` reserves the session's send for one eval case: the
|
|
13
|
+
* hosted execution runs the case body there instead of a single turn. The
|
|
14
|
+
* case body writes every message, so it skips `onAdmit` and `onMessage`.
|
|
11
15
|
*/
|
|
12
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
13
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
14
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
15
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
16
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
17
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
18
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
19
|
-
});
|
|
20
|
-
};
|
|
21
16
|
import { skipped, turnStarted } from "./channel-dispatch.js";
|
|
22
17
|
import { attachHostedAdmissionAdapter } from "./hosted-admission-adapter.js";
|
|
23
|
-
import { AGENT_SDK_HTTP_CHANNEL_KIND, AGENT_SDK_SESSION_EVENT_TYPE, } from "./hosted-catch-protocol.js";
|
|
18
|
+
import { AGENT_SDK_EVAL_CASE_EVENT_TYPE, AGENT_SDK_HTTP_CHANNEL_KIND, AGENT_SDK_SESSION_EVENT_TYPE, } from "./hosted-catch-protocol.js";
|
|
24
19
|
import { isRecord } from "./is-record.js";
|
|
25
20
|
const PAYLOAD_KEYS = new Set(["message", "dryRun", "asOf"]);
|
|
21
|
+
const EVAL_CASE_PAYLOAD_KEYS = new Set(["runId", "caseId"]);
|
|
26
22
|
const MAX_MESSAGE_CHARS = 64 * 1024;
|
|
23
|
+
const MAX_EVAL_ID_CHARS = 512;
|
|
24
|
+
/** Symbol-keyed so authored channels cannot forge an eval-case send. */
|
|
25
|
+
const EVAL_CASE = Symbol("agentsdk.eval-case");
|
|
26
|
+
/** The eval case an `agentsdk.eval-case` admission reserved this send for. */
|
|
27
|
+
export function evalCaseOf(options) {
|
|
28
|
+
return options[EVAL_CASE];
|
|
29
|
+
}
|
|
27
30
|
export function parseControlPlaneSessionPayload(payload) {
|
|
28
31
|
if (!isRecord(payload)) {
|
|
29
32
|
return { ok: false, error: "payload must be an object" };
|
|
@@ -51,32 +54,63 @@ export function parseControlPlaneSessionPayload(payload) {
|
|
|
51
54
|
},
|
|
52
55
|
};
|
|
53
56
|
}
|
|
54
|
-
export function
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
yield input.onAdmit({
|
|
66
|
-
message: original,
|
|
67
|
-
sessionKey: input.mailboxContinuationKey,
|
|
68
|
-
dryRun: parsed.data.dryRun,
|
|
69
|
-
asOf: parsed.data.asOf,
|
|
70
|
-
host: input.args.host,
|
|
71
|
-
});
|
|
57
|
+
export function parseControlPlaneEvalCasePayload(payload) {
|
|
58
|
+
if (!isRecord(payload)) {
|
|
59
|
+
return { ok: false, error: "payload must be an object" };
|
|
60
|
+
}
|
|
61
|
+
if (Object.keys(payload).some(key => !EVAL_CASE_PAYLOAD_KEYS.has(key))) {
|
|
62
|
+
return { ok: false, error: "payload carries an unsupported field" };
|
|
63
|
+
}
|
|
64
|
+
for (const key of ["runId", "caseId"]) {
|
|
65
|
+
const value = payload[key];
|
|
66
|
+
if (typeof value !== "string" || value.length === 0 || value.length > MAX_EVAL_ID_CHARS) {
|
|
67
|
+
return { ok: false, error: `payload.${key} is required` };
|
|
72
68
|
}
|
|
73
|
-
|
|
74
|
-
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
ok: true,
|
|
72
|
+
data: { runId: payload.runId, caseId: payload.caseId },
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
async function dispatchEvalCase(payload, args) {
|
|
76
|
+
const parsed = parseControlPlaneEvalCasePayload(payload);
|
|
77
|
+
if (!parsed.ok) {
|
|
78
|
+
return Response.json({ ok: false, error: parsed.error }, { status: 400 });
|
|
79
|
+
}
|
|
80
|
+
const options = {
|
|
81
|
+
purpose: "eval",
|
|
82
|
+
title: `Eval ${parsed.data.caseId}`,
|
|
83
|
+
[EVAL_CASE]: parsed.data,
|
|
84
|
+
};
|
|
85
|
+
return turnStarted(await args.send(parsed.data.caseId, options));
|
|
86
|
+
}
|
|
87
|
+
export async function dispatchHttpControlPlaneSession(input) {
|
|
88
|
+
if (input.eventType === AGENT_SDK_EVAL_CASE_EVENT_TYPE) {
|
|
89
|
+
return dispatchEvalCase(input.payload, input.args);
|
|
90
|
+
}
|
|
91
|
+
if (input.eventType !== AGENT_SDK_SESSION_EVENT_TYPE) {
|
|
92
|
+
return skipped("not a control-plane session");
|
|
93
|
+
}
|
|
94
|
+
const parsed = parseControlPlaneSessionPayload(input.payload);
|
|
95
|
+
if (!parsed.ok) {
|
|
96
|
+
return Response.json({ ok: false, error: parsed.error }, { status: 400 });
|
|
97
|
+
}
|
|
98
|
+
const original = parsed.data.message;
|
|
99
|
+
if (input.onAdmit !== undefined) {
|
|
100
|
+
await input.onAdmit({
|
|
101
|
+
message: original,
|
|
102
|
+
sessionKey: input.mailboxContinuationKey,
|
|
75
103
|
dryRun: parsed.data.dryRun,
|
|
76
104
|
asOf: parsed.data.asOf,
|
|
105
|
+
host: input.args.host,
|
|
77
106
|
});
|
|
78
|
-
|
|
107
|
+
}
|
|
108
|
+
const message = input.onMessage === undefined ? original : await input.onMessage(original, { auth: null });
|
|
109
|
+
const session = await input.args.send(message, {
|
|
110
|
+
dryRun: parsed.data.dryRun,
|
|
111
|
+
asOf: parsed.data.asOf,
|
|
79
112
|
});
|
|
113
|
+
return turnStarted(session);
|
|
80
114
|
}
|
|
81
115
|
export function attachHttpControlPlaneAdmission(definition) {
|
|
82
116
|
attachHostedAdmissionAdapter(definition, {
|
|
@@ -85,7 +119,7 @@ export function attachHttpControlPlaneAdmission(definition) {
|
|
|
85
119
|
eventType,
|
|
86
120
|
payload,
|
|
87
121
|
args,
|
|
88
|
-
mailboxContinuationKey: mailboxContinuationKey
|
|
122
|
+
mailboxContinuationKey: mailboxContinuationKey ?? "",
|
|
89
123
|
onMessage: definition.onMessage,
|
|
90
124
|
onAdmit: definition.onAdmit,
|
|
91
125
|
}),
|
|
@@ -36,6 +36,5 @@ function firstHeaderValue(value) {
|
|
|
36
36
|
}
|
|
37
37
|
/** HTTP/1 `Host`, or HTTP/2 `:authority` when Host was not copied. */
|
|
38
38
|
export function incomingRequestHost(headers, fallback = "127.0.0.1") {
|
|
39
|
-
|
|
40
|
-
return (_b = (_a = firstHeaderValue(headers.host)) !== null && _a !== void 0 ? _a : firstHeaderValue(headers[":authority"])) !== null && _b !== void 0 ? _b : fallback;
|
|
39
|
+
return firstHeaderValue(headers.host) ?? firstHeaderValue(headers[":authority"]) ?? fallback;
|
|
41
40
|
}
|