@cursor/bdk 0.2.3 → 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/agent-serve.js +9 -1
- package/dist/channels/slack/attachments.d.ts +2 -1
- package/dist/channels/slack/attachments.d.ts.map +1 -1
- package/dist/channels/slack/attachments.js +19 -9
- package/dist/channels/slack/dispatch.d.ts.map +1 -1
- package/dist/channels/slack/dispatch.js +26 -24
- package/dist/channels/slack/thread-context.d.ts +21 -11
- package/dist/channels/slack/thread-context.d.ts.map +1 -1
- package/dist/channels/slack/thread-context.js +75 -27
- package/dist/docs/404.html +2 -2
- package/dist/docs/assets/{app.BOIHhrKi.js → app.4kQ8Db_q.js} +4 -4
- package/dist/docs/assets/chunks/@localSearchIndexroot.CvuAJ0My.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.D49zVZqM.js → VPLocalSearchBox.DY1RwB8Q.js} +1 -1
- package/dist/docs/assets/chunks/{arc.hmjb-sc4.js → arc.CxE_fSPK.js} +1 -1
- package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.CxEI1KqM.js → architectureDiagram-Q4EWVU46.CPX426ui.js} +1 -1
- package/dist/docs/assets/chunks/{baseUniq.DHHvBWoV.js → baseUniq.CB52JrKG.js} +1 -1
- package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.DnXW-3bu.js → blockDiagram-DXYQGD6D.J0cNaQCL.js} +1 -1
- package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.e-47O2jM.js → c4Diagram-AHTNJAMY.DJn3vEGT.js} +1 -1
- package/dist/docs/assets/chunks/channel.BoNycAoN.js +1 -0
- package/dist/docs/assets/chunks/{chunk-4BX2VUAB.3ry4pYXB.js → chunk-4BX2VUAB.Dao618F6.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-4TB4RGXK.DGIZFRx6.js → chunk-4TB4RGXK.QW8Rhjai.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-55IACEB6.DKBnqg9U.js → chunk-55IACEB6.DfRLLKF_.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-EDXVE4YY.BIU8Ue5k.js → chunk-EDXVE4YY.CIV2ApKQ.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-FMBD7UC4.DP-TFhjI.js → chunk-FMBD7UC4.BEheSuxp.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-OYMX7WX6.Ux0OYj5v.js → chunk-OYMX7WX6.CUN88ENB.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-QZHKN3VN.BzHMwYox.js → chunk-QZHKN3VN.CgqCs8b_.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-YZCP3GAM.D4OGAsSP.js → chunk-YZCP3GAM.iCH0nnTJ.js} +1 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.C4x07Gkj.js +1 -0
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.C4x07Gkj.js +1 -0
- package/dist/docs/assets/chunks/clone.Db22cH_-.js +1 -0
- package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.Jq_7BUNx.js → cose-bilkent-S5V4N54A.BLcUxhWE.js} +1 -1
- package/dist/docs/assets/chunks/{dagre-KV5264BT.Di-skR2x.js → dagre-KV5264BT.Ep7LofOm.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-5BDNPKRD.DeREHIdH.js → diagram-5BDNPKRD.Bzf4GSQ4.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.C7Kcqxro.js → diagram-G4DWMVQ6.DD6Jh-eM.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-MMDJMWI5.BK3eohyo.js → diagram-MMDJMWI5.oOIl8bWd.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-TYMM5635.C6TyymXT.js → diagram-TYMM5635.DHs85Ade.js} +1 -1
- package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.DYGG-gGx.js → erDiagram-SMLLAGMA.BIb5ghCk.js} +1 -1
- package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.C9nBcSV4.js → flowDiagram-DWJPFMVM.DV4paY9k.js} +1 -1
- package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.wAg_ymsp.js → ganttDiagram-T4ZO3ILL.AyEKA6_v.js} +1 -1
- package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.B87j9Oeg.js → gitGraphDiagram-UUTBAWPF.BltiCDFo.js} +1 -1
- package/dist/docs/assets/chunks/{graph.CuFMj31w.js → graph.DzuEYGdC.js} +1 -1
- package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.P_mLGumP.js → infoDiagram-42DDH7IO.BV2l981J.js} +1 -1
- package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.DyuL_MsT.js → ishikawaDiagram-UXIWVN3A.BA4Izf-m.js} +1 -1
- package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.CtP09IoJ.js → journeyDiagram-VCZTEJTY.DjaFbFS3.js} +1 -1
- package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.BoeSYPZo.js → kanban-definition-6JOO6SKY.CfTFieDs.js} +1 -1
- package/dist/docs/assets/chunks/{layout.B0lMMtNo.js → layout.DzfWqTBV.js} +1 -1
- package/dist/docs/assets/chunks/{linear.HxRBiAFX.js → linear.BO6mpulV.js} +1 -1
- package/dist/docs/assets/chunks/{min.BGlFFHwS.js → min.BGgTadgT.js} +1 -1
- package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.JyLBD9M8.js → mindmap-definition-QFDTVHPH.DPuIXVWY.js} +1 -1
- package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.DnSmNZF8.js → pieDiagram-DEJITSTG.BOnl3bBg.js} +1 -1
- package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.CUCnbfCa.js → quadrantDiagram-34T5L4WZ.DNB6Ckdc.js} +1 -1
- package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.py0IVUn5.js → requirementDiagram-MS252O5E.D5-Qo7vb.js} +1 -1
- package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.Bkc-HWYp.js → sankeyDiagram-XADWPNL6.8t65cesf.js} +1 -1
- package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.Dqn8Mlv2.js → sequenceDiagram-FGHM5R23.CaG07BdS.js} +1 -1
- package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.JikkoQUU.js → stateDiagram-FHFEXIEX.TKOweTB6.js} +1 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.CuqmyQc4.js +1 -0
- package/dist/docs/assets/chunks/{theme.b6HQ6zG_.js → theme.Dx-JhpTB.js} +2 -2
- package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.BvpSXiBj.js → timeline-definition-GMOUNBTQ.fE53zQ2s.js} +1 -1
- package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.CU7MVnZx.js → vennDiagram-DHZGUBPP.DJsZZaJg.js} +1 -1
- package/dist/docs/assets/chunks/{wardley-RL74JXVD.BKwC4ctG.js → wardley-RL74JXVD.844kyrjl.js} +1 -1
- package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.BfaF6Uhe.js → wardleyDiagram-NUSXRM2D.CMZ-Ru_t.js} +1 -1
- package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.Bg5dcpj4.js → xychartDiagram-5P7HB3ND.XXrhBc7a.js} +1 -1
- package/dist/docs/assets/{deployment.md.BJ8i7Q6p.js → deployment.md.UhnJIMr-.js} +2 -2
- package/dist/docs/assets/{deployment.md.BJ8i7Q6p.lean.js → deployment.md.UhnJIMr-.lean.js} +1 -1
- package/dist/docs/assets/{guides_jev.md.BNDm14Gy.js → guides_jev.md.CRcgmjDb.js} +2 -2
- package/dist/docs/assets/{guides_jev.md.BNDm14Gy.lean.js → guides_jev.md.CRcgmjDb.lean.js} +1 -1
- package/dist/docs/assets/{reference_agent-config.md.DzGI777n.js → reference_agent-config.md.Cj5uBKp4.js} +1 -1
- package/dist/docs/assets/{reference_extensions.md.CPPrkWlJ.js → reference_extensions.md.pa2tN-e4.js} +4 -3
- package/dist/docs/assets/{reference_extensions.md.CPPrkWlJ.lean.js → reference_extensions.md.pa2tN-e4.lean.js} +1 -1
- package/dist/docs/building-with-agents.html +35 -35
- package/dist/docs/deployment.html +37 -37
- package/dist/docs/deployment.md +4 -1
- package/dist/docs/evals.html +35 -35
- package/dist/docs/guides/agent-to-agent.html +35 -35
- package/dist/docs/guides/bitbucket.html +35 -35
- package/dist/docs/guides/cloud-agents.html +35 -35
- package/dist/docs/guides/convert-automation.html +35 -35
- package/dist/docs/guides/github.html +35 -35
- package/dist/docs/guides/gitlab.html +35 -35
- 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 +37 -37
- package/dist/docs/guides/jev.md +7 -0
- package/dist/docs/guides/mcp-oauth.html +35 -35
- 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 +25 -2
- package/dist/docs/quickstart.html +35 -35
- package/dist/docs/reference/agent-config.html +37 -37
- package/dist/docs/reference/agent-config.md +1 -1
- package/dist/docs/reference/artifacts.html +35 -35
- package/dist/docs/reference/channels.html +35 -35
- package/dist/docs/reference/cli.html +35 -35
- package/dist/docs/reference/connections.html +35 -35
- package/dist/docs/reference/evals.html +35 -35
- package/dist/docs/reference/extensions.html +39 -38
- package/dist/docs/reference/extensions.md +13 -0
- 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 +35 -35
- 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/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 +35 -35
- package/dist/extensions/jev/extension.d.ts +3 -0
- package/dist/extensions/jev/extension.d.ts.map +1 -1
- package/dist/extensions/jev/extension.js +10 -1
- package/dist/extensions/jev/lib/evaluate.d.ts +4 -0
- package/dist/extensions/jev/lib/evaluate.d.ts.map +1 -1
- package/dist/extensions/jev/lib/evaluate.js +6 -2
- package/dist/extensions.d.ts +4 -2
- package/dist/extensions.d.ts.map +1 -1
- package/dist/extensions.js +5 -2
- package/dist/internal/cli-deploy.d.ts.map +1 -1
- package/dist/internal/cli-deploy.js +19 -5
- package/dist/internal/discovery/agent-config.d.ts +6 -5
- package/dist/internal/discovery/agent-config.d.ts.map +1 -1
- package/dist/internal/discovery/agent-config.js +29 -28
- package/dist/internal/discovery/agent.js +1 -1
- package/dist/internal/discovery/extensions.d.ts.map +1 -1
- package/dist/internal/discovery/extensions.js +12 -0
- package/dist/internal/hosting.d.ts +8 -0
- package/dist/internal/hosting.d.ts.map +1 -1
- package/dist/internal/hosting.js +24 -0
- package/dist/types.d.ts +18 -2
- package/dist/types.d.ts.map +1 -1
- package/docs/deployment.md +4 -1
- package/docs/guides/jev.md +7 -0
- package/docs/reference/agent-config.md +1 -1
- package/docs/reference/extensions.md +13 -0
- package/package.json +1 -9
- package/dist/docs/assets/chunks/@localSearchIndexroot.D5L-b34G.js +0 -1
- package/dist/docs/assets/chunks/channel.BbOGaJQP.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.Db58HCb1.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.Db58HCb1.js +0 -1
- package/dist/docs/assets/chunks/clone.Co4MBflG.js +0 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.CMsKhrW0.js +0 -1
- package/src/artifacts.ts +0 -68
- package/src/bin/agent-serve.ts +0 -1854
- package/src/channels/bitbucket/api.ts +0 -891
- package/src/channels/bitbucket/binding.ts +0 -417
- package/src/channels/bitbucket/bitbucket-channel.ts +0 -162
- package/src/channels/bitbucket/bitbucket-webhook.ts +0 -519
- package/src/channels/bitbucket/checks.ts +0 -146
- package/src/channels/bitbucket/cursor-account.ts +0 -106
- package/src/channels/bitbucket/defaults.ts +0 -100
- package/src/channels/bitbucket/events.ts +0 -74
- package/src/channels/bitbucket/index.ts +0 -51
- package/src/channels/bitbucket/replay.ts +0 -421
- package/src/channels/bitbucket/state.ts +0 -59
- package/src/channels/bitbucket/types.ts +0 -261
- package/src/channels/change-monitors/change-monitors-channel.ts +0 -63
- package/src/channels/change-monitors/index.ts +0 -8
- package/src/channels/change-monitors/types.ts +0 -42
- package/src/channels/checks.ts +0 -185
- package/src/channels/deployments/deployments-channel.ts +0 -224
- package/src/channels/deployments/index.ts +0 -25
- package/src/channels/deployments/types.ts +0 -92
- package/src/channels/github/api.ts +0 -526
- package/src/channels/github/auth.ts +0 -293
- package/src/channels/github/binding.ts +0 -233
- package/src/channels/github/checks.ts +0 -145
- package/src/channels/github/cursor-account.ts +0 -303
- package/src/channels/github/defaults.ts +0 -168
- package/src/channels/github/events.ts +0 -67
- package/src/channels/github/forward.ts +0 -359
- package/src/channels/github/github-channel.ts +0 -2334
- package/src/channels/github/index.ts +0 -54
- package/src/channels/github/progress.ts +0 -365
- package/src/channels/github/replay.ts +0 -372
- package/src/channels/github/state.ts +0 -124
- package/src/channels/github/types.ts +0 -590
- package/src/channels/gitlab/api.ts +0 -329
- package/src/channels/gitlab/binding.ts +0 -231
- package/src/channels/gitlab/checks.ts +0 -228
- package/src/channels/gitlab/cursor-account.ts +0 -105
- package/src/channels/gitlab/defaults.ts +0 -80
- package/src/channels/gitlab/events.ts +0 -37
- package/src/channels/gitlab/gitlab-channel.ts +0 -160
- package/src/channels/gitlab/gitlab-webhook.ts +0 -509
- package/src/channels/gitlab/index.ts +0 -44
- package/src/channels/gitlab/replay.ts +0 -328
- package/src/channels/gitlab/state.ts +0 -55
- package/src/channels/gitlab/types.ts +0 -247
- package/src/channels/issues/index.ts +0 -9
- package/src/channels/issues/issues-channel.ts +0 -45
- package/src/channels/issues/types.ts +0 -38
- package/src/channels/origin/api.ts +0 -507
- package/src/channels/origin/binding.ts +0 -114
- package/src/channels/origin/checks.ts +0 -250
- package/src/channels/origin/cursor-account.ts +0 -58
- package/src/channels/origin/defaults.ts +0 -140
- package/src/channels/origin/events.ts +0 -35
- package/src/channels/origin/index.ts +0 -35
- package/src/channels/origin/origin-channel.ts +0 -815
- package/src/channels/origin/origin-webhook.ts +0 -296
- package/src/channels/origin/reactions.ts +0 -72
- package/src/channels/origin/state.ts +0 -54
- package/src/channels/origin/types.ts +0 -295
- package/src/channels/slack/agentic-delivery.ts +0 -634
- package/src/channels/slack/agentic-posted.ts +0 -135
- package/src/channels/slack/agentic-signals.ts +0 -231
- package/src/channels/slack/api.ts +0 -761
- package/src/channels/slack/approvals.ts +0 -279
- package/src/channels/slack/assistant.ts +0 -76
- package/src/channels/slack/attachments.ts +0 -596
- package/src/channels/slack/auth.ts +0 -127
- package/src/channels/slack/blocks.ts +0 -131
- package/src/channels/slack/bot-mentions.ts +0 -318
- package/src/channels/slack/channel-watch.ts +0 -314
- package/src/channels/slack/cli-project.ts +0 -249
- package/src/channels/slack/code-fences.ts +0 -171
- package/src/channels/slack/constants.ts +0 -38
- package/src/channels/slack/credentials.ts +0 -88
- package/src/channels/slack/defaults.ts +0 -714
- package/src/channels/slack/dispatch.ts +0 -1060
- package/src/channels/slack/doctor.ts +0 -338
- package/src/channels/slack/eval-directive.ts +0 -306
- package/src/channels/slack/event-id-dedupe.ts +0 -30
- package/src/channels/slack/external-policy.ts +0 -75
- package/src/channels/slack/footer.ts +0 -106
- package/src/channels/slack/inbound.ts +0 -416
- package/src/channels/slack/index.ts +0 -53
- package/src/channels/slack/init.ts +0 -169
- package/src/channels/slack/interactive.ts +0 -406
- package/src/channels/slack/links.ts +0 -23
- package/src/channels/slack/live-delivery.ts +0 -489
- package/src/channels/slack/log.ts +0 -70
- package/src/channels/slack/manifest.ts +0 -240
- package/src/channels/slack/message-body.ts +0 -82
- package/src/channels/slack/nudge-carrier.ts +0 -224
- package/src/channels/slack/nudge-store.ts +0 -334
- package/src/channels/slack/paint-start.ts +0 -93
- package/src/channels/slack/placeholder.ts +0 -358
- package/src/channels/slack/pr-ref.ts +0 -74
- package/src/channels/slack/progress-delivery.ts +0 -138
- package/src/channels/slack/reasoning-card.ts +0 -125
- package/src/channels/slack/reasoning-chip.ts +0 -41
- package/src/channels/slack/recording-sink.ts +0 -167
- package/src/channels/slack/redact.ts +0 -6
- package/src/channels/slack/reply-options.ts +0 -279
- package/src/channels/slack/setup.ts +0 -125
- package/src/channels/slack/slack-channel.ts +0 -744
- package/src/channels/slack/socket-mode.ts +0 -140
- package/src/channels/slack/stop.ts +0 -25
- package/src/channels/slack/stream.ts +0 -66
- package/src/channels/slack/thread-context.ts +0 -485
- package/src/channels/slack/tool-approval-events.ts +0 -233
- package/src/channels/slack/tool-cards.ts +0 -198
- package/src/channels/slack/tool-chip.ts +0 -34
- package/src/channels/slack/types.ts +0 -787
- package/src/channels/slack/upload.ts +0 -137
- package/src/channels.ts +0 -543
- package/src/connections.ts +0 -153
- package/src/dashboard-session-url.ts +0 -30
- package/src/evals/assertions.ts +0 -688
- package/src/evals/expect.ts +0 -250
- package/src/evals/judge.ts +0 -329
- package/src/evals/loaders.ts +0 -111
- package/src/evals/matchers.ts +0 -223
- package/src/evals/reporters.ts +0 -257
- package/src/evals/results.ts +0 -130
- package/src/evals/run-facts.ts +0 -306
- package/src/evals.ts +0 -709
- package/src/extensions/cursor-cloud-agents/extension.ts +0 -131
- package/src/extensions/cursor-cloud-agents/lib/backend.ts +0 -386
- package/src/extensions/cursor-cloud-agents/lib/channels.ts +0 -11
- package/src/extensions/cursor-cloud-agents/lib/fleet.ts +0 -98
- package/src/extensions/cursor-cloud-agents/lib/inputs.ts +0 -5
- package/src/extensions/cursor-cloud-agents/lib/repos.ts +0 -80
- package/src/extensions/cursor-cloud-agents/lib/transcript.ts +0 -19
- package/src/extensions/cursor-cloud-agents/skills/handoff.md +0 -37
- package/src/extensions/cursor-cloud-agents/tools/cancel.ts +0 -21
- package/src/extensions/cursor-cloud-agents/tools/dump.ts +0 -47
- package/src/extensions/cursor-cloud-agents/tools/get.ts +0 -18
- package/src/extensions/cursor-cloud-agents/tools/launch.ts +0 -62
- package/src/extensions/cursor-cloud-agents/tools/list.ts +0 -31
- package/src/extensions/cursor-cloud-agents/tools/reply.ts +0 -36
- package/src/extensions/cursor-grokbot-agents/extension.ts +0 -132
- package/src/extensions/cursor-grokbot-agents/lib/agents.ts +0 -42
- package/src/extensions/cursor-grokbot-agents/lib/backend.ts +0 -208
- package/src/extensions/cursor-grokbot-agents/lib/contacts.ts +0 -74
- package/src/extensions/cursor-grokbot-agents/lib/conversation.ts +0 -260
- package/src/extensions/cursor-grokbot-agents/lib/inputs.ts +0 -21
- package/src/extensions/cursor-grokbot-agents/lib/lock.ts +0 -26
- package/src/extensions/cursor-grokbot-agents/skills/consult.md +0 -40
- package/src/extensions/cursor-grokbot-agents/tools/ask.ts +0 -32
- package/src/extensions/cursor-grokbot-agents/tools/check.ts +0 -25
- package/src/extensions/cursor-grokbot-agents/tools/interrupt.ts +0 -17
- package/src/extensions/cursor-grokbot-agents/tools/list.ts +0 -26
- package/src/extensions/improve/extension.ts +0 -69
- package/src/extensions/improve/skills/yourself.ts +0 -50
- package/src/extensions/jev/extension.ts +0 -95
- package/src/extensions/jev/lib/evaluate.ts +0 -266
- package/src/extensions/jev/skills/gated-write.md +0 -25
- package/src/extensions/jev/skills/questions.md +0 -33
- package/src/extensions/jev/tools/evaluate.ts +0 -82
- package/src/extensions/slack-communication/evals/harness.ts +0 -705
- package/src/extensions/slack-communication/evals/slack-communication.eval.ts +0 -830
- package/src/extensions/slack-communication/evals/slack-placeholder.eval.ts +0 -172
- package/src/extensions/slack-communication/extension.ts +0 -44
- package/src/extensions/slack-communication/skills/slack-voice.ts +0 -56
- package/src/extensions/slack-communication/tools/delete-message.ts +0 -33
- package/src/extensions/slack-communication/tools/edit-message.ts +0 -42
- package/src/extensions/slack-communication/tools/post-card.ts +0 -28
- package/src/extensions/slack-communication/tools/post-file.ts +0 -82
- package/src/extensions/slack-communication/tools/post-update.ts +0 -40
- package/src/extensions/slack-communication/tools/react.ts +0 -30
- package/src/extensions/slack-communication/tools/set-status.ts +0 -21
- package/src/extensions.ts +0 -179
- package/src/files-backends/agent-store-presigned-url.ts +0 -11
- package/src/files-backends/cursor-hosted.ts +0 -1212
- package/src/files-backends/local-fs.ts +0 -163
- package/src/files.ts +0 -293
- package/src/filesystem.ts +0 -2005
- package/src/hooks.ts +0 -30
- package/src/index.ts +0 -259
- package/src/internal/advertise-tools.ts +0 -370
- package/src/internal/approval-gate.ts +0 -103
- package/src/internal/artifacts-store.ts +0 -836
- package/src/internal/as-of.ts +0 -257
- package/src/internal/auth.ts +0 -46
- package/src/internal/authored-alias-hooks.ts +0 -138
- package/src/internal/authored-loaders.ts +0 -188
- package/src/internal/bounded-int.ts +0 -24
- package/src/internal/bounded.ts +0 -25
- package/src/internal/brand.ts +0 -28
- package/src/internal/browser-origin-guard.ts +0 -67
- package/src/internal/builtin-tools/artifacts.ts +0 -62
- package/src/internal/builtin-tools/index.ts +0 -53
- package/src/internal/builtin-tools/reminders.ts +0 -145
- package/src/internal/channel-dispatch.ts +0 -129
- package/src/internal/channel-route-dispatch.ts +0 -58
- package/src/internal/channel-state.ts +0 -83
- package/src/internal/chat-client.ts +0 -594
- package/src/internal/cli-ax.ts +0 -2318
- package/src/internal/cli-bitbucket.ts +0 -438
- package/src/internal/cli-convert-automation.ts +0 -335
- package/src/internal/cli-cursor.ts +0 -282
- package/src/internal/cli-deploy.ts +0 -2519
- package/src/internal/cli-docs.ts +0 -192
- package/src/internal/cli-github.ts +0 -806
- package/src/internal/cli-gitlab.ts +0 -452
- package/src/internal/cli-images.ts +0 -672
- package/src/internal/cli-manifest.ts +0 -56
- package/src/internal/cli-mcp-oauth.ts +0 -396
- package/src/internal/cli-mcp.ts +0 -808
- package/src/internal/cli-skills.ts +0 -98
- package/src/internal/cli-slack-manual.ts +0 -418
- package/src/internal/cli-slack.ts +0 -874
- package/src/internal/cloud-merge.ts +0 -51
- package/src/internal/cloud-turn-cost.ts +0 -159
- package/src/internal/connection-env.ts +0 -106
- package/src/internal/continuation-channel.ts +0 -233
- package/src/internal/continuation-identity.ts +0 -935
- package/src/internal/conversation-mirror.ts +0 -423
- package/src/internal/convert-automation/convert-workflow.ts +0 -1377
- package/src/internal/convert-automation/slug.ts +0 -29
- package/src/internal/convert-automation/types.ts +0 -212
- package/src/internal/cron.ts +0 -76
- package/src/internal/cursor/account-mcp.ts +0 -692
- package/src/internal/cursor/backend-client.ts +0 -984
- package/src/internal/cursor/bound-secret-file.ts +0 -101
- package/src/internal/cursor/credentials.ts +0 -560
- package/src/internal/cursor/cursor-api-transport.ts +0 -65
- package/src/internal/cursor/github-credentials.ts +0 -228
- package/src/internal/cursor/hosted-bound-secrets.ts +0 -71
- package/src/internal/cursor/hosted-deployment-secrets.ts +0 -100
- package/src/internal/cursor/hosted-store-secrets.ts +0 -152
- package/src/internal/cursor/session-token.ts +0 -111
- package/src/internal/cursor/store-api-client.ts +0 -323
- package/src/internal/cursor-account-mcp-auth.ts +0 -303
- package/src/internal/cursor-agent-template.ts +0 -50
- package/src/internal/cursor-deployment-relay.ts +0 -315
- package/src/internal/cursor-event-relay.ts +0 -675
- package/src/internal/cursor-relay-core.ts +0 -563
- package/src/internal/deferred-channel-session.ts +0 -61
- package/src/internal/deploy-client.ts +0 -1574
- package/src/internal/deploy-manifest.ts +0 -361
- package/src/internal/deploy-source.ts +0 -144
- package/src/internal/describe-error.ts +0 -32
- package/src/internal/dev-mode.ts +0 -20
- package/src/internal/discovery/agent-config.ts +0 -288
- package/src/internal/discovery/agent.ts +0 -381
- package/src/internal/discovery/channels.ts +0 -100
- package/src/internal/discovery/connections.ts +0 -516
- package/src/internal/discovery/context.ts +0 -38
- package/src/internal/discovery/cursor-plugin.ts +0 -628
- package/src/internal/discovery/extension-overlay.ts +0 -247
- package/src/internal/discovery/extensions.ts +0 -490
- package/src/internal/discovery/fs.ts +0 -103
- package/src/internal/discovery/hooks.ts +0 -63
- package/src/internal/discovery/info.ts +0 -174
- package/src/internal/discovery/instructions.ts +0 -98
- package/src/internal/discovery/modules.ts +0 -107
- package/src/internal/discovery/names.ts +0 -45
- package/src/internal/discovery/project.ts +0 -319
- package/src/internal/discovery/reminders.ts +0 -65
- package/src/internal/discovery/runtime.ts +0 -158
- package/src/internal/discovery/schedules.ts +0 -120
- package/src/internal/discovery/seed-files.ts +0 -34
- package/src/internal/discovery/services.ts +0 -151
- package/src/internal/discovery/skills.ts +0 -174
- package/src/internal/discovery/subagent.ts +0 -138
- package/src/internal/discovery/tools.ts +0 -170
- package/src/internal/discovery.ts +0 -27
- package/src/internal/distribution.ts +0 -126
- package/src/internal/docs-site.ts +0 -248
- package/src/internal/duration.ts +0 -37
- package/src/internal/env-file.ts +0 -83
- package/src/internal/eval-judge-model.ts +0 -142
- package/src/internal/eval-run-store.ts +0 -585
- package/src/internal/eval-runner.ts +0 -823
- package/src/internal/evals-client.ts +0 -475
- package/src/internal/event-log.ts +0 -342
- package/src/internal/event-mapper.ts +0 -811
- package/src/internal/expected-delivery-failure.ts +0 -34
- package/src/internal/factory-resource-channel.ts +0 -103
- package/src/internal/filesystem/errors.ts +0 -207
- package/src/internal/filesystem/format.ts +0 -253
- package/src/internal/filesystem/merge.ts +0 -192
- package/src/internal/filesystem/nearest.ts +0 -112
- package/src/internal/filesystem/scratch.ts +0 -239
- package/src/internal/filesystem/sdk-schemas.ts +0 -204
- package/src/internal/filesystem/tools.ts +0 -804
- package/src/internal/filesystem/walk.ts +0 -366
- package/src/internal/fixtures/units-server.ts +0 -52
- package/src/internal/framework-file-storage.ts +0 -357
- package/src/internal/framework-storage-selection.ts +0 -156
- package/src/internal/frontmatter.ts +0 -108
- package/src/internal/github-fanout.ts +0 -144
- package/src/internal/guest-network.ts +0 -391
- package/src/internal/handleAgentServeTrigger.ts +0 -286
- package/src/internal/host-files.ts +0 -341
- package/src/internal/host-kv.ts +0 -81
- package/src/internal/host-otel.ts +0 -231
- package/src/internal/host-platforms.ts +0 -170
- package/src/internal/hosted-admission-adapter.ts +0 -47
- package/src/internal/hosted-admission-context.ts +0 -37
- package/src/internal/hosted-catch-protocol.ts +0 -112
- package/src/internal/hosted-catch.ts +0 -179
- package/src/internal/hosted-delivery-protocol.ts +0 -824
- package/src/internal/hosted-delivery.ts +0 -1410
- package/src/internal/hosted-execution-diag.ts +0 -291
- package/src/internal/hosted-execution-flush.ts +0 -136
- package/src/internal/hosted-execution-latency.ts +0 -301
- package/src/internal/hosted-managed-automation.ts +0 -116
- package/src/internal/hosting.ts +0 -114
- package/src/internal/http-channel-define.ts +0 -25
- package/src/internal/http-channel.ts +0 -669
- package/src/internal/http-control-plane-session.ts +0 -110
- package/src/internal/ids.ts +0 -39
- package/src/internal/incoming-headers-to-fetch.ts +0 -45
- package/src/internal/init-interview.ts +0 -360
- package/src/internal/init-project.ts +0 -711
- package/src/internal/init-scaffold.ts +0 -182
- package/src/internal/inline-stdio-define-stub.ts +0 -4
- package/src/internal/inline-stdio-mcp.ts +0 -230
- package/src/internal/install-cursor-skills.ts +0 -604
- package/src/internal/is-record.ts +0 -3
- package/src/internal/json-schema.ts +0 -95
- package/src/internal/legacy-command-guard.ts +0 -66
- package/src/internal/listen-port.ts +0 -85
- package/src/internal/local-control-plane.ts +0 -442
- package/src/internal/local-env.ts +0 -59
- package/src/internal/local-ingress.ts +0 -90
- package/src/internal/log-ring.ts +0 -59
- package/src/internal/logs-client.ts +0 -477
- package/src/internal/map-pool.ts +0 -39
- package/src/internal/mcp-endpoint.ts +0 -747
- package/src/internal/mcp-host.ts +0 -509
- package/src/internal/mcp-oauth-on-demand.ts +0 -337
- package/src/internal/mcp-oauth-persist.ts +0 -118
- package/src/internal/mcp-oauth.ts +0 -549
- package/src/internal/net.ts +0 -29
- package/src/internal/open-browser.ts +0 -41
- package/src/internal/otel/attrs.ts +0 -16
- package/src/internal/otel/collector.ts +0 -937
- package/src/internal/otel/config.ts +0 -287
- package/src/internal/otel/http.ts +0 -122
- package/src/internal/otel/mcp.ts +0 -56
- package/src/internal/otel/propagation.ts +0 -17
- package/src/internal/otel/runtime.ts +0 -441
- package/src/internal/package-inline-stdio.ts +0 -114
- package/src/internal/peer-connections.ts +0 -96
- package/src/internal/platform-schedule-sync.ts +0 -75
- package/src/internal/platform-timers.ts +0 -365
- package/src/internal/playground/static.ts +0 -278
- package/src/internal/playground/toolchain.ts +0 -270
- package/src/internal/playground-proxy.ts +0 -564
- package/src/internal/process-memory-telemetry.ts +0 -334
- package/src/internal/project-layout.ts +0 -31
- package/src/internal/prompt-context.ts +0 -116
- package/src/internal/reminder-control-plane-protocol.ts +0 -482
- package/src/internal/reminder-runner.ts +0 -1559
- package/src/internal/reminder-schedule.ts +0 -104
- package/src/internal/reminder-store.ts +0 -176
- package/src/internal/request-error-status.ts +0 -95
- package/src/internal/request-headers.ts +0 -21
- package/src/internal/resolve-prod-target.ts +0 -334
- package/src/internal/resolved-connections.ts +0 -190
- package/src/internal/router.ts +0 -143
- package/src/internal/run-client.ts +0 -354
- package/src/internal/runtime-dispatch-runner.ts +0 -50
- package/src/internal/sanitize-mcp-tool-name.ts +0 -31
- package/src/internal/schedule-runner.ts +0 -154
- package/src/internal/scm/pr-url.ts +0 -245
- package/src/internal/sdk-runner.ts +0 -959
- package/src/internal/serve-restart.ts +0 -113
- package/src/internal/server.ts +0 -3147
- package/src/internal/session-cost.ts +0 -208
- package/src/internal/session-engine.ts +0 -5622
- package/src/internal/session-links.ts +0 -84
- package/src/internal/session-run-log.ts +0 -535
- package/src/internal/session-store.ts +0 -307
- package/src/internal/session-urls.ts +0 -32
- package/src/internal/sessions-client.ts +0 -239
- package/src/internal/skill-catalog.ts +0 -66
- package/src/internal/skills-sync.ts +0 -55
- package/src/internal/slack-provision-client.ts +0 -544
- package/src/internal/slack-thread-key.ts +0 -11
- package/src/internal/sleep.ts +0 -3
- package/src/internal/start-log-store.ts +0 -164
- package/src/internal/steering.ts +0 -17
- package/src/internal/storage-coordinator.ts +0 -800
- package/src/internal/storage-roles.ts +0 -86
- package/src/internal/storage.ts +0 -1
- package/src/internal/store-api-protocol.ts +0 -205
- package/src/internal/store-mirror.ts +0 -73
- package/src/internal/stream-progress.ts +0 -294
- package/src/internal/terminal-style.ts +0 -133
- package/src/internal/testing/factory-resource-fixtures.ts +0 -84
- package/src/internal/testing/scm-continuation-fixtures.ts +0 -285
- package/src/internal/tool-catalog.ts +0 -104
- package/src/internal/tool-policy.ts +0 -222
- package/src/internal/tool-result.ts +0 -50
- package/src/internal/trajectory.ts +0 -418
- package/src/internal/turn-cost.ts +0 -136
- package/src/internal/turn-governor.ts +0 -145
- package/src/internal/turn-lease-store.ts +0 -144
- package/src/internal/turn-outbox.ts +0 -77
- package/src/internal/update-check.ts +0 -517
- package/src/internal/v2-hosting.ts +0 -52
- package/src/internal/workspace-sync.ts +0 -114
- package/src/internal/workspace.ts +0 -505
- package/src/kv/memory-kv.ts +0 -94
- package/src/kv.ts +0 -18
- package/src/memory.ts +0 -487
- package/src/otel-public.ts +0 -24
- package/src/otel.ts +0 -320
- package/src/prompt.ts +0 -80
- package/src/reminders.ts +0 -65
- package/src/schedules.ts +0 -31
- package/src/skills.ts +0 -27
- package/src/storage-backends/cursor-hosted-v2.ts +0 -204
- package/src/storage-backends/cursor-hosted.ts +0 -388
- package/src/storage-backends/file-kv.ts +0 -276
- package/src/storage-protocol.ts +0 -261
- package/src/storage.ts +0 -408
- package/src/tools.ts +0 -166
- package/src/types.ts +0 -3776
- /package/dist/docs/assets/{reference_agent-config.md.DzGI777n.lean.js → reference_agent-config.md.Cj5uBKp4.lean.js} +0 -0
|
@@ -1,669 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The built-in HTTP session channel: the default API that `curl`, SDK
|
|
3
|
-
* clients, and frontends talk to. Mounted at `/v1/session*` even when no
|
|
4
|
-
* channel override is present.
|
|
5
|
-
*
|
|
6
|
-
* Continuation semantics: `POST /v1/session` returns a `continuationToken`;
|
|
7
|
-
* each accepted follow-up rotates it and returns the replacement, and a
|
|
8
|
-
* stale token is rejected with 409. Follow-ups address any chat session by
|
|
9
|
-
* id (including custom channels such as `drive`) when the token matches its
|
|
10
|
-
* active HTTP follow-up key; task sessions stay fire-and-forget.
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
import type {
|
|
14
|
-
AgentCloudOptions,
|
|
15
|
-
AuthContext,
|
|
16
|
-
AuthPolicy,
|
|
17
|
-
HttpChannelDefinition,
|
|
18
|
-
SessionRecord,
|
|
19
|
-
} from "../types.js";
|
|
20
|
-
import { samePrincipal } from "./auth.js";
|
|
21
|
-
import { formatContinuationToken, parseContinuationToken } from "./ids.js";
|
|
22
|
-
import { isRecord } from "./is-record.js";
|
|
23
|
-
import { isLoopbackAddress } from "./net.js";
|
|
24
|
-
import type { ServerRoute } from "./router.js";
|
|
25
|
-
import {
|
|
26
|
-
ApprovalInterruptedError,
|
|
27
|
-
ApprovalNotFoundError,
|
|
28
|
-
AuthInterruptedError,
|
|
29
|
-
AuthNotFoundError,
|
|
30
|
-
HTTP_CHANNEL_ID,
|
|
31
|
-
SessionAuthError,
|
|
32
|
-
type SessionEngine,
|
|
33
|
-
} from "./session-engine.js";
|
|
34
|
-
import { eventsUrlForSession, playgroundUrlForSession } from "./session-urls.js";
|
|
35
|
-
|
|
36
|
-
const SESSION_ID_HEADER = "x-agent-serve-session-id";
|
|
37
|
-
|
|
38
|
-
export function buildHttpChannelRoutes(args: {
|
|
39
|
-
engine: SessionEngine;
|
|
40
|
-
config: HttpChannelDefinition;
|
|
41
|
-
auth: AuthPolicy[];
|
|
42
|
-
/** Path prefix ("" single-agent, "/<slug>" multi-agent). */
|
|
43
|
-
basePath?: string;
|
|
44
|
-
/**
|
|
45
|
-
* When true (server `--dev` without bearer/custom auth), session
|
|
46
|
-
* stream/events/follow-up are readable without matching the creating
|
|
47
|
-
* principal — matching `GET /v1/sessions` includeAll so the playground
|
|
48
|
-
* can open every listed session. Still requires a loopback caller unless
|
|
49
|
-
* {@link relaxSessionReadAuthBeyondLoopback} is also set.
|
|
50
|
-
*/
|
|
51
|
-
relaxSessionReadAuth?: boolean;
|
|
52
|
-
/**
|
|
53
|
-
* With {@link relaxSessionReadAuth}, skip the loopback IP check so remote
|
|
54
|
-
* callers (e.g. Tailscale + `--allow-anonymous`) can open listed sessions.
|
|
55
|
-
*/
|
|
56
|
-
relaxSessionReadAuthBeyondLoopback?: boolean;
|
|
57
|
-
/**
|
|
58
|
-
* `--dev` bridge: allow playground / HTTP callers to Approve/Deny parked
|
|
59
|
-
* tools on Slack-owned sessions (Slack principals never match local /
|
|
60
|
-
* anonymous auth). Does not open approval writes on HTTP-owned sessions.
|
|
61
|
-
* Respects the same loopback / beyondLoopback gate as session reads.
|
|
62
|
-
*/
|
|
63
|
-
relaxSessionApprovalAuth?: boolean;
|
|
64
|
-
}): ServerRoute[] {
|
|
65
|
-
const { engine, config, auth } = args;
|
|
66
|
-
const base = args.basePath ?? "";
|
|
67
|
-
const relaxSessionReadAuth = args.relaxSessionReadAuth ?? false;
|
|
68
|
-
const relaxSessionReadAuthBeyondLoopback = args.relaxSessionReadAuthBeyondLoopback ?? false;
|
|
69
|
-
const relaxSessionApprovalAuth = args.relaxSessionApprovalAuth ?? false;
|
|
70
|
-
|
|
71
|
-
const transformMessage = async (
|
|
72
|
-
message: string,
|
|
73
|
-
authContext: AuthContext | null,
|
|
74
|
-
): Promise<string> => {
|
|
75
|
-
if (config.onMessage === undefined) {
|
|
76
|
-
return message;
|
|
77
|
-
}
|
|
78
|
-
return config.onMessage(message, { auth: authContext });
|
|
79
|
-
};
|
|
80
|
-
|
|
81
|
-
const createSession: ServerRoute = {
|
|
82
|
-
method: "POST",
|
|
83
|
-
pattern: `${base}/v1/session`,
|
|
84
|
-
auth,
|
|
85
|
-
handler: async (request, ctx) => {
|
|
86
|
-
const body = await readJsonObject(request);
|
|
87
|
-
if (body === undefined || typeof body.message !== "string") {
|
|
88
|
-
return errorResponse(
|
|
89
|
-
400,
|
|
90
|
-
"invalid_request",
|
|
91
|
-
"Expected a JSON body with a string `message`.",
|
|
92
|
-
);
|
|
93
|
-
}
|
|
94
|
-
if (body.asOf !== undefined && typeof body.asOf !== "string") {
|
|
95
|
-
return errorResponse(
|
|
96
|
-
400,
|
|
97
|
-
"invalid_request",
|
|
98
|
-
"`asOf` must be an ISO-8601 instant with a timezone when provided.",
|
|
99
|
-
);
|
|
100
|
-
}
|
|
101
|
-
const message = await transformMessage(body.message, ctx.auth);
|
|
102
|
-
const workspaceFiles = readWorkspaceFiles(body.workspaceFiles);
|
|
103
|
-
// Per-session cloud attach (create only). Eval harness uses this to pin
|
|
104
|
-
// fixture repos without putting them on the agent's default cloud.repos.
|
|
105
|
-
const cloud = readCloudOptions(body.cloud);
|
|
106
|
-
const session = await engine.send(HTTP_CHANNEL_ID, message, {
|
|
107
|
-
auth: ctx.auth,
|
|
108
|
-
...(typeof body.title === "string" ? { title: body.title } : {}),
|
|
109
|
-
...(body.purpose === "eval" ? { purpose: "eval" as const } : {}),
|
|
110
|
-
...(body.dryRun === true ? { dryRun: true } : {}),
|
|
111
|
-
asOf: body.asOf,
|
|
112
|
-
...(workspaceFiles === undefined ? {} : { workspaceFiles }),
|
|
113
|
-
...(cloud === undefined ? {} : { cloud }),
|
|
114
|
-
});
|
|
115
|
-
return jsonResponse(
|
|
116
|
-
{
|
|
117
|
-
ok: true,
|
|
118
|
-
sessionId: session.id,
|
|
119
|
-
continuationToken: formatContinuationToken(
|
|
120
|
-
HTTP_CHANNEL_ID,
|
|
121
|
-
session.continuationToken ?? "",
|
|
122
|
-
),
|
|
123
|
-
playgroundUrl: playgroundUrlForSession(request, base, session.id),
|
|
124
|
-
traceUrl: eventsUrlForSession(request.url, base, session.id),
|
|
125
|
-
},
|
|
126
|
-
{ headers: { [SESSION_ID_HEADER]: session.id } },
|
|
127
|
-
);
|
|
128
|
-
},
|
|
129
|
-
};
|
|
130
|
-
|
|
131
|
-
const followUp: ServerRoute = {
|
|
132
|
-
method: "POST",
|
|
133
|
-
pattern: `${base}/v1/session/:sessionId`,
|
|
134
|
-
auth,
|
|
135
|
-
handler: async (request, ctx) => {
|
|
136
|
-
const sessionId = ctx.params.sessionId ?? "";
|
|
137
|
-
const record = await engine.getOrRestoreSession(sessionId);
|
|
138
|
-
if (record === undefined) {
|
|
139
|
-
return errorResponse(404, "session_not_found", `Unknown session ${sessionId}.`);
|
|
140
|
-
}
|
|
141
|
-
// HTTP can follow any chat session. Its credential is separate from the
|
|
142
|
-
// owning channel's continuation key.
|
|
143
|
-
if (record.mode === "task") {
|
|
144
|
-
return errorResponse(
|
|
145
|
-
409,
|
|
146
|
-
"session_not_followable",
|
|
147
|
-
"Task sessions are fire-and-forget; they do not accept follow-ups.",
|
|
148
|
-
);
|
|
149
|
-
}
|
|
150
|
-
const ownership = requireSessionOwner(record, ctx.auth, {
|
|
151
|
-
relax: relaxSessionReadAuth,
|
|
152
|
-
beyondLoopback: relaxSessionReadAuthBeyondLoopback,
|
|
153
|
-
requestIp: ctx.requestIp,
|
|
154
|
-
});
|
|
155
|
-
if (ownership !== undefined) {
|
|
156
|
-
return ownership;
|
|
157
|
-
}
|
|
158
|
-
const body = await readJsonObject(request);
|
|
159
|
-
if (body === undefined || typeof body.message !== "string") {
|
|
160
|
-
return errorResponse(
|
|
161
|
-
400,
|
|
162
|
-
"invalid_request",
|
|
163
|
-
"Expected a JSON body with a string `message`.",
|
|
164
|
-
);
|
|
165
|
-
}
|
|
166
|
-
if (typeof body.continuationToken !== "string") {
|
|
167
|
-
return errorResponse(
|
|
168
|
-
400,
|
|
169
|
-
"invalid_request",
|
|
170
|
-
"Expected a `continuationToken` from the previous response.",
|
|
171
|
-
);
|
|
172
|
-
}
|
|
173
|
-
const presented = parseContinuationToken(body.continuationToken);
|
|
174
|
-
if (presented === null) {
|
|
175
|
-
return errorResponse(
|
|
176
|
-
409,
|
|
177
|
-
"stale_continuation_token",
|
|
178
|
-
"The continuation token does not address this session's active continuation.",
|
|
179
|
-
);
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
const message = await transformMessage(body.message, ctx.auth);
|
|
183
|
-
const rotated = await engine.followUpHttp(sessionId, presented, message);
|
|
184
|
-
if (rotated === undefined) {
|
|
185
|
-
return errorResponse(
|
|
186
|
-
409,
|
|
187
|
-
"stale_continuation_token",
|
|
188
|
-
"The continuation token does not address this session's active continuation.",
|
|
189
|
-
);
|
|
190
|
-
}
|
|
191
|
-
return jsonResponse(
|
|
192
|
-
{
|
|
193
|
-
ok: true,
|
|
194
|
-
sessionId,
|
|
195
|
-
continuationToken: formatContinuationToken(HTTP_CHANNEL_ID, rotated),
|
|
196
|
-
},
|
|
197
|
-
{ headers: { [SESSION_ID_HEADER]: sessionId } },
|
|
198
|
-
);
|
|
199
|
-
},
|
|
200
|
-
};
|
|
201
|
-
|
|
202
|
-
const stream: ServerRoute = {
|
|
203
|
-
method: "GET",
|
|
204
|
-
pattern: `${base}/v1/session/:sessionId/stream`,
|
|
205
|
-
auth,
|
|
206
|
-
handler: async (request, ctx) => {
|
|
207
|
-
const sessionId = ctx.params.sessionId ?? "";
|
|
208
|
-
// The stream-and-inspect handle is runtime-owned: sessions started by
|
|
209
|
-
// custom channels or schedules are observable here too when the caller
|
|
210
|
-
// matches the session's stored principal (or `--dev` relax). Follow-ups
|
|
211
|
-
// use the same ownership gate plus the session's continuation token.
|
|
212
|
-
// Lazy-restore by id so playground Open-trace works after redeploy
|
|
213
|
-
// when the session is durable but not in the local state root yet.
|
|
214
|
-
const record = await engine.getOrRestoreSession(sessionId);
|
|
215
|
-
if (record === undefined) {
|
|
216
|
-
return errorResponse(404, "session_not_found", `Unknown session ${sessionId}.`);
|
|
217
|
-
}
|
|
218
|
-
const ownership = requireSessionOwner(record, ctx.auth, {
|
|
219
|
-
relax: relaxSessionReadAuth,
|
|
220
|
-
beyondLoopback: relaxSessionReadAuthBeyondLoopback,
|
|
221
|
-
requestIp: ctx.requestIp,
|
|
222
|
-
});
|
|
223
|
-
if (ownership !== undefined) {
|
|
224
|
-
return ownership;
|
|
225
|
-
}
|
|
226
|
-
const url = new URL(request.url);
|
|
227
|
-
const rawStartIndex = url.searchParams.get("startIndex");
|
|
228
|
-
const startIndex = rawStartIndex === null ? 0 : Number.parseInt(rawStartIndex, 10);
|
|
229
|
-
if (Number.isNaN(startIndex) || startIndex < 0) {
|
|
230
|
-
return errorResponse(400, "invalid_request", "startIndex must be a non-negative integer.");
|
|
231
|
-
}
|
|
232
|
-
const body = await engine.eventStream(sessionId, startIndex);
|
|
233
|
-
return new Response(body, {
|
|
234
|
-
status: 200,
|
|
235
|
-
headers: {
|
|
236
|
-
"content-type": "application/x-ndjson; charset=utf-8",
|
|
237
|
-
"cache-control": "no-store",
|
|
238
|
-
[SESSION_ID_HEADER]: sessionId,
|
|
239
|
-
},
|
|
240
|
-
});
|
|
241
|
-
},
|
|
242
|
-
};
|
|
243
|
-
|
|
244
|
-
/** One-shot NDJSON (or JSON) dump of the session trace. */
|
|
245
|
-
const events: ServerRoute = {
|
|
246
|
-
method: "GET",
|
|
247
|
-
pattern: `${base}/v1/session/:sessionId/events`,
|
|
248
|
-
auth,
|
|
249
|
-
handler: async (request, ctx) => {
|
|
250
|
-
const sessionId = ctx.params.sessionId ?? "";
|
|
251
|
-
const record = await engine.getOrRestoreSession(sessionId);
|
|
252
|
-
if (record === undefined) {
|
|
253
|
-
return errorResponse(404, "session_not_found", `Unknown session ${sessionId}.`);
|
|
254
|
-
}
|
|
255
|
-
const ownership = requireSessionOwner(record, ctx.auth, {
|
|
256
|
-
relax: relaxSessionReadAuth,
|
|
257
|
-
beyondLoopback: relaxSessionReadAuthBeyondLoopback,
|
|
258
|
-
requestIp: ctx.requestIp,
|
|
259
|
-
});
|
|
260
|
-
if (ownership !== undefined) {
|
|
261
|
-
return ownership;
|
|
262
|
-
}
|
|
263
|
-
const url = new URL(request.url);
|
|
264
|
-
const asJson = url.searchParams.get("format") === "json";
|
|
265
|
-
const snapshot = await engine.listEvents(sessionId, 0, {
|
|
266
|
-
backfillCloudCost: true,
|
|
267
|
-
});
|
|
268
|
-
if (asJson) {
|
|
269
|
-
return jsonResponse({
|
|
270
|
-
sessionId,
|
|
271
|
-
events: snapshot,
|
|
272
|
-
playgroundUrl: playgroundUrlForSession(request, base, sessionId),
|
|
273
|
-
});
|
|
274
|
-
}
|
|
275
|
-
const ndjson = `${snapshot.map(e => JSON.stringify(e)).join("\n")}${
|
|
276
|
-
snapshot.length > 0 ? "\n" : ""
|
|
277
|
-
}`;
|
|
278
|
-
return new Response(ndjson, {
|
|
279
|
-
status: 200,
|
|
280
|
-
headers: {
|
|
281
|
-
"content-type": "application/x-ndjson; charset=utf-8",
|
|
282
|
-
"cache-control": "no-store",
|
|
283
|
-
"content-disposition": `attachment; filename="${sessionId}.ndjson"`,
|
|
284
|
-
[SESSION_ID_HEADER]: sessionId,
|
|
285
|
-
},
|
|
286
|
-
});
|
|
287
|
-
},
|
|
288
|
-
};
|
|
289
|
-
|
|
290
|
-
const cost: ServerRoute = {
|
|
291
|
-
method: "GET",
|
|
292
|
-
pattern: `${base}/v1/session/:sessionId/cost`,
|
|
293
|
-
auth,
|
|
294
|
-
handler: async (_request, ctx) => {
|
|
295
|
-
const sessionId = ctx.params.sessionId ?? "";
|
|
296
|
-
const record = await engine.getOrRestoreSession(sessionId);
|
|
297
|
-
if (record === undefined) {
|
|
298
|
-
return errorResponse(404, "session_not_found", `Unknown session ${sessionId}.`);
|
|
299
|
-
}
|
|
300
|
-
const ownership = requireSessionOwner(record, ctx.auth, {
|
|
301
|
-
relax: relaxSessionReadAuth,
|
|
302
|
-
beyondLoopback: relaxSessionReadAuthBeyondLoopback,
|
|
303
|
-
requestIp: ctx.requestIp,
|
|
304
|
-
});
|
|
305
|
-
if (ownership !== undefined) {
|
|
306
|
-
return ownership;
|
|
307
|
-
}
|
|
308
|
-
const payload = await engine.sessionCost(sessionId);
|
|
309
|
-
return jsonResponse(payload, {
|
|
310
|
-
headers: { [SESSION_ID_HEADER]: sessionId },
|
|
311
|
-
});
|
|
312
|
-
},
|
|
313
|
-
};
|
|
314
|
-
|
|
315
|
-
const listApprovals: ServerRoute = {
|
|
316
|
-
method: "GET",
|
|
317
|
-
pattern: `${base}/v1/session/:sessionId/approvals`,
|
|
318
|
-
auth,
|
|
319
|
-
handler: async (_request, ctx) => {
|
|
320
|
-
const sessionId = ctx.params.sessionId ?? "";
|
|
321
|
-
const record = await engine.getOrRestoreSession(sessionId);
|
|
322
|
-
if (record === undefined) {
|
|
323
|
-
return errorResponse(404, "session_not_found", `Unknown session ${sessionId}.`);
|
|
324
|
-
}
|
|
325
|
-
const ownership = requireSessionOwner(record, ctx.auth, {
|
|
326
|
-
relax: relaxSessionReadAuth,
|
|
327
|
-
beyondLoopback: relaxSessionReadAuthBeyondLoopback,
|
|
328
|
-
requestIp: ctx.requestIp,
|
|
329
|
-
});
|
|
330
|
-
if (ownership !== undefined) {
|
|
331
|
-
return ownership;
|
|
332
|
-
}
|
|
333
|
-
const pending = await engine.listPendingApprovals(sessionId);
|
|
334
|
-
return jsonResponse({ ok: true, sessionId, pending });
|
|
335
|
-
},
|
|
336
|
-
};
|
|
337
|
-
|
|
338
|
-
const resolveApproval: ServerRoute = {
|
|
339
|
-
method: "POST",
|
|
340
|
-
pattern: `${base}/v1/session/:sessionId/approvals/:callId`,
|
|
341
|
-
auth,
|
|
342
|
-
handler: async (request, ctx) => {
|
|
343
|
-
const sessionId = ctx.params.sessionId ?? "";
|
|
344
|
-
const callId = ctx.params.callId ?? "";
|
|
345
|
-
const record = await engine.getOrRestoreSession(sessionId);
|
|
346
|
-
if (record === undefined) {
|
|
347
|
-
return errorResponse(404, "session_not_found", `Unknown session ${sessionId}.`);
|
|
348
|
-
}
|
|
349
|
-
const bridgeSlackApproval =
|
|
350
|
-
relaxSessionApprovalAuth === true &&
|
|
351
|
-
record.auth?.authenticator === "slack" &&
|
|
352
|
-
(relaxSessionReadAuthBeyondLoopback === true ||
|
|
353
|
-
(typeof ctx.requestIp === "string" && isLoopbackAddress(ctx.requestIp)));
|
|
354
|
-
const ownership = requireSessionOwner(record, ctx.auth, {
|
|
355
|
-
// HTTP sessions stay strict. Slack sessions may use the --dev
|
|
356
|
-
// playground bridge (see relaxSessionApprovalAuth).
|
|
357
|
-
relax: bridgeSlackApproval,
|
|
358
|
-
beyondLoopback: relaxSessionReadAuthBeyondLoopback,
|
|
359
|
-
requestIp: ctx.requestIp,
|
|
360
|
-
});
|
|
361
|
-
if (ownership !== undefined) {
|
|
362
|
-
return ownership;
|
|
363
|
-
}
|
|
364
|
-
const body = await readJsonObject(request);
|
|
365
|
-
const decision = body?.decision;
|
|
366
|
-
if (decision !== "approve" && decision !== "deny") {
|
|
367
|
-
return errorResponse(
|
|
368
|
-
400,
|
|
369
|
-
"invalid_request",
|
|
370
|
-
'Expected a JSON body with `decision`: "approve" | "deny".',
|
|
371
|
-
);
|
|
372
|
-
}
|
|
373
|
-
try {
|
|
374
|
-
const pending = await engine.resolveApproval(
|
|
375
|
-
sessionId,
|
|
376
|
-
callId,
|
|
377
|
-
decision,
|
|
378
|
-
ctx.auth,
|
|
379
|
-
bridgeSlackApproval ? { asSessionOwner: true } : undefined,
|
|
380
|
-
);
|
|
381
|
-
return jsonResponse({
|
|
382
|
-
ok: true,
|
|
383
|
-
sessionId,
|
|
384
|
-
callId,
|
|
385
|
-
decision,
|
|
386
|
-
toolName: pending.toolName,
|
|
387
|
-
});
|
|
388
|
-
} catch (error) {
|
|
389
|
-
if (error instanceof ApprovalNotFoundError) {
|
|
390
|
-
return errorResponse(404, "approval_not_found", error.message);
|
|
391
|
-
}
|
|
392
|
-
if (error instanceof ApprovalInterruptedError) {
|
|
393
|
-
return errorResponse(409, "approval_interrupted", error.message);
|
|
394
|
-
}
|
|
395
|
-
if (error instanceof SessionAuthError) {
|
|
396
|
-
return errorResponse(403, "forbidden", error.message);
|
|
397
|
-
}
|
|
398
|
-
throw error;
|
|
399
|
-
}
|
|
400
|
-
},
|
|
401
|
-
};
|
|
402
|
-
|
|
403
|
-
const stop: ServerRoute = {
|
|
404
|
-
method: "POST",
|
|
405
|
-
pattern: `${base}/v1/session/:sessionId/stop`,
|
|
406
|
-
auth,
|
|
407
|
-
handler: async (_request, ctx) => {
|
|
408
|
-
const sessionId = ctx.params.sessionId ?? "";
|
|
409
|
-
const record = await engine.getOrRestoreSession(sessionId);
|
|
410
|
-
if (record === undefined) {
|
|
411
|
-
return errorResponse(404, "session_not_found", `Unknown session ${sessionId}.`);
|
|
412
|
-
}
|
|
413
|
-
const ownership = requireSessionOwner(record, ctx.auth, {
|
|
414
|
-
relax: relaxSessionReadAuth,
|
|
415
|
-
beyondLoopback: relaxSessionReadAuthBeyondLoopback,
|
|
416
|
-
requestIp: ctx.requestIp,
|
|
417
|
-
});
|
|
418
|
-
if (ownership !== undefined) {
|
|
419
|
-
return ownership;
|
|
420
|
-
}
|
|
421
|
-
const interrupted = await engine.interrupt(sessionId);
|
|
422
|
-
return jsonResponse(
|
|
423
|
-
{ ok: true, interrupted },
|
|
424
|
-
{ headers: { [SESSION_ID_HEADER]: sessionId } },
|
|
425
|
-
);
|
|
426
|
-
},
|
|
427
|
-
};
|
|
428
|
-
|
|
429
|
-
const listAuths: ServerRoute = {
|
|
430
|
-
method: "GET",
|
|
431
|
-
pattern: `${base}/v1/session/:sessionId/auths`,
|
|
432
|
-
auth,
|
|
433
|
-
handler: async (_request, ctx) => {
|
|
434
|
-
const sessionId = ctx.params.sessionId ?? "";
|
|
435
|
-
const record = await engine.getOrRestoreSession(sessionId);
|
|
436
|
-
if (record === undefined) {
|
|
437
|
-
return errorResponse(404, "session_not_found", `Unknown session ${sessionId}.`);
|
|
438
|
-
}
|
|
439
|
-
const ownership = requireSessionOwner(record, ctx.auth, {
|
|
440
|
-
relax: relaxSessionReadAuth,
|
|
441
|
-
beyondLoopback: relaxSessionReadAuthBeyondLoopback,
|
|
442
|
-
requestIp: ctx.requestIp,
|
|
443
|
-
});
|
|
444
|
-
if (ownership !== undefined) {
|
|
445
|
-
return ownership;
|
|
446
|
-
}
|
|
447
|
-
const pending = await engine.listPendingAuths(sessionId);
|
|
448
|
-
return jsonResponse({ ok: true, sessionId, pending });
|
|
449
|
-
},
|
|
450
|
-
};
|
|
451
|
-
|
|
452
|
-
const resolveAuth: ServerRoute = {
|
|
453
|
-
method: "POST",
|
|
454
|
-
pattern: `${base}/v1/session/:sessionId/auths/:callId`,
|
|
455
|
-
auth,
|
|
456
|
-
handler: async (request, ctx) => {
|
|
457
|
-
const sessionId = ctx.params.sessionId ?? "";
|
|
458
|
-
const callId = ctx.params.callId ?? "";
|
|
459
|
-
const record = await engine.getOrRestoreSession(sessionId);
|
|
460
|
-
if (record === undefined) {
|
|
461
|
-
return errorResponse(404, "session_not_found", `Unknown session ${sessionId}.`);
|
|
462
|
-
}
|
|
463
|
-
const bridgeSlackAuth =
|
|
464
|
-
relaxSessionApprovalAuth === true &&
|
|
465
|
-
record.auth?.authenticator === "slack" &&
|
|
466
|
-
(relaxSessionReadAuthBeyondLoopback === true ||
|
|
467
|
-
(typeof ctx.requestIp === "string" && isLoopbackAddress(ctx.requestIp)));
|
|
468
|
-
const ownership = requireSessionOwner(record, ctx.auth, {
|
|
469
|
-
relax: bridgeSlackAuth,
|
|
470
|
-
beyondLoopback: relaxSessionReadAuthBeyondLoopback,
|
|
471
|
-
requestIp: ctx.requestIp,
|
|
472
|
-
});
|
|
473
|
-
if (ownership !== undefined) {
|
|
474
|
-
return ownership;
|
|
475
|
-
}
|
|
476
|
-
const body = await readJsonObject(request);
|
|
477
|
-
const decision = body?.decision;
|
|
478
|
-
if (decision !== "approve" && decision !== "deny") {
|
|
479
|
-
return errorResponse(
|
|
480
|
-
400,
|
|
481
|
-
"invalid_request",
|
|
482
|
-
'Expected a JSON body with `decision`: "approve" | "deny".',
|
|
483
|
-
);
|
|
484
|
-
}
|
|
485
|
-
try {
|
|
486
|
-
const pending = await engine.resolveAuth(
|
|
487
|
-
sessionId,
|
|
488
|
-
callId,
|
|
489
|
-
decision,
|
|
490
|
-
ctx.auth,
|
|
491
|
-
bridgeSlackAuth ? { asSessionOwner: true } : undefined,
|
|
492
|
-
);
|
|
493
|
-
return jsonResponse({
|
|
494
|
-
ok: true,
|
|
495
|
-
sessionId,
|
|
496
|
-
callId,
|
|
497
|
-
decision,
|
|
498
|
-
connection: pending.connection,
|
|
499
|
-
});
|
|
500
|
-
} catch (error) {
|
|
501
|
-
if (error instanceof AuthNotFoundError) {
|
|
502
|
-
return errorResponse(404, "auth_not_found", error.message);
|
|
503
|
-
}
|
|
504
|
-
if (error instanceof AuthInterruptedError) {
|
|
505
|
-
return errorResponse(409, "auth_interrupted", error.message);
|
|
506
|
-
}
|
|
507
|
-
if (error instanceof SessionAuthError) {
|
|
508
|
-
return errorResponse(403, "forbidden", error.message);
|
|
509
|
-
}
|
|
510
|
-
throw error;
|
|
511
|
-
}
|
|
512
|
-
},
|
|
513
|
-
};
|
|
514
|
-
|
|
515
|
-
return [
|
|
516
|
-
createSession,
|
|
517
|
-
followUp,
|
|
518
|
-
stop,
|
|
519
|
-
stream,
|
|
520
|
-
events,
|
|
521
|
-
cost,
|
|
522
|
-
listApprovals,
|
|
523
|
-
resolveApproval,
|
|
524
|
-
listAuths,
|
|
525
|
-
resolveAuth,
|
|
526
|
-
];
|
|
527
|
-
}
|
|
528
|
-
|
|
529
|
-
export function requireSessionOwner(
|
|
530
|
-
record: SessionRecord,
|
|
531
|
-
caller: AuthContext | null,
|
|
532
|
-
options?: {
|
|
533
|
-
relax?: boolean;
|
|
534
|
-
beyondLoopback?: boolean;
|
|
535
|
-
requestIp?: string | null;
|
|
536
|
-
},
|
|
537
|
-
): Response | undefined {
|
|
538
|
-
// Dev playground lists every session (`includeAll`); match that by
|
|
539
|
-
// allowing cross-principal read/follow-up. Loopback-only unless
|
|
540
|
-
// `--allow-anonymous` also opted into beyondLoopback.
|
|
541
|
-
const relaxOwnership =
|
|
542
|
-
options?.relax === true &&
|
|
543
|
-
(options.beyondLoopback === true ||
|
|
544
|
-
(typeof options.requestIp === "string" && isLoopbackAddress(options.requestIp)));
|
|
545
|
-
if (relaxOwnership || samePrincipal(record.auth, caller)) {
|
|
546
|
-
return undefined;
|
|
547
|
-
}
|
|
548
|
-
return errorResponse(403, "forbidden", "This session belongs to a different principal.");
|
|
549
|
-
}
|
|
550
|
-
|
|
551
|
-
export function jsonResponse(
|
|
552
|
-
data: unknown,
|
|
553
|
-
init: { status?: number; headers?: Record<string, string> } = {},
|
|
554
|
-
): Response {
|
|
555
|
-
return new Response(JSON.stringify(data), {
|
|
556
|
-
status: init.status ?? 200,
|
|
557
|
-
headers: {
|
|
558
|
-
"content-type": "application/json; charset=utf-8",
|
|
559
|
-
...init.headers,
|
|
560
|
-
},
|
|
561
|
-
});
|
|
562
|
-
}
|
|
563
|
-
|
|
564
|
-
export function errorResponse(status: number, code: string, message: string): Response {
|
|
565
|
-
return jsonResponse({ ok: false, error: code, message }, { status });
|
|
566
|
-
}
|
|
567
|
-
|
|
568
|
-
function readWorkspaceFiles(value: unknown): Record<string, string> | undefined {
|
|
569
|
-
if (value === undefined || value === null || typeof value !== "object") {
|
|
570
|
-
return undefined;
|
|
571
|
-
}
|
|
572
|
-
if (Array.isArray(value)) {
|
|
573
|
-
return undefined;
|
|
574
|
-
}
|
|
575
|
-
const files: Record<string, string> = {};
|
|
576
|
-
for (const [path, contents] of Object.entries(value as Record<string, unknown>)) {
|
|
577
|
-
if (typeof path !== "string" || path.trim() === "") {
|
|
578
|
-
continue;
|
|
579
|
-
}
|
|
580
|
-
if (typeof contents !== "string") {
|
|
581
|
-
continue;
|
|
582
|
-
}
|
|
583
|
-
files[path] = contents;
|
|
584
|
-
}
|
|
585
|
-
return Object.keys(files).length === 0 ? undefined : files;
|
|
586
|
-
}
|
|
587
|
-
|
|
588
|
-
/** Best-effort parse of {@link AgentCloudOptions} from a JSON body field. */
|
|
589
|
-
function readCloudOptions(value: unknown): AgentCloudOptions | undefined {
|
|
590
|
-
if (!isRecord(value)) {
|
|
591
|
-
return undefined;
|
|
592
|
-
}
|
|
593
|
-
const cloud: AgentCloudOptions = {};
|
|
594
|
-
|
|
595
|
-
if (isRecord(value.env) && typeof value.env.type === "string") {
|
|
596
|
-
const name = typeof value.env.name === "string" ? value.env.name : undefined;
|
|
597
|
-
if (value.env.type === "cloud") {
|
|
598
|
-
cloud.env = name === undefined ? { type: "cloud" } : { type: "cloud", name };
|
|
599
|
-
} else if (value.env.type === "pool") {
|
|
600
|
-
cloud.env = name === undefined ? { type: "pool" } : { type: "pool", name };
|
|
601
|
-
} else if (value.env.type === "machine") {
|
|
602
|
-
cloud.env = name === undefined ? { type: "machine" } : { type: "machine", name };
|
|
603
|
-
}
|
|
604
|
-
}
|
|
605
|
-
|
|
606
|
-
if (Array.isArray(value.repos)) {
|
|
607
|
-
const repos: NonNullable<AgentCloudOptions["repos"]> = [];
|
|
608
|
-
for (const entry of value.repos) {
|
|
609
|
-
if (!isRecord(entry) || typeof entry.url !== "string" || entry.url === "") {
|
|
610
|
-
continue;
|
|
611
|
-
}
|
|
612
|
-
repos.push({
|
|
613
|
-
url: entry.url,
|
|
614
|
-
...(typeof entry.startingRef === "string" ? { startingRef: entry.startingRef } : {}),
|
|
615
|
-
...(typeof entry.prUrl === "string" ? { prUrl: entry.prUrl } : {}),
|
|
616
|
-
});
|
|
617
|
-
}
|
|
618
|
-
if (repos.length > 0) {
|
|
619
|
-
cloud.repos = repos;
|
|
620
|
-
}
|
|
621
|
-
}
|
|
622
|
-
|
|
623
|
-
if (typeof value.workOnCurrentBranch === "boolean") {
|
|
624
|
-
cloud.workOnCurrentBranch = value.workOnCurrentBranch;
|
|
625
|
-
}
|
|
626
|
-
if (typeof value.autoCreatePR === "boolean") {
|
|
627
|
-
cloud.autoCreatePR = value.autoCreatePR;
|
|
628
|
-
}
|
|
629
|
-
if (typeof value.skipReviewerRequest === "boolean") {
|
|
630
|
-
cloud.skipReviewerRequest = value.skipReviewerRequest;
|
|
631
|
-
}
|
|
632
|
-
|
|
633
|
-
if (isRecord(value.envVars)) {
|
|
634
|
-
const envVars: Record<string, string> = {};
|
|
635
|
-
for (const [key, envValue] of Object.entries(value.envVars)) {
|
|
636
|
-
if (typeof key === "string" && typeof envValue === "string") {
|
|
637
|
-
envVars[key] = envValue;
|
|
638
|
-
}
|
|
639
|
-
}
|
|
640
|
-
if (Object.keys(envVars).length > 0) {
|
|
641
|
-
cloud.envVars = envVars;
|
|
642
|
-
}
|
|
643
|
-
}
|
|
644
|
-
|
|
645
|
-
return Object.keys(cloud).length === 0 ? undefined : cloud;
|
|
646
|
-
}
|
|
647
|
-
|
|
648
|
-
/** Parse a JSON object body. Requires `application/json` (CORS-simple types do not parse). */
|
|
649
|
-
export async function readJsonObject(
|
|
650
|
-
request: Request,
|
|
651
|
-
): Promise<Record<string, unknown> | undefined> {
|
|
652
|
-
const contentType = request.headers.get("content-type");
|
|
653
|
-
if (contentType === null || !isApplicationJson(contentType)) {
|
|
654
|
-
return undefined;
|
|
655
|
-
}
|
|
656
|
-
try {
|
|
657
|
-
const parsed: unknown = await request.json();
|
|
658
|
-
if (typeof parsed === "object" && parsed !== null && !Array.isArray(parsed)) {
|
|
659
|
-
return parsed as Record<string, unknown>;
|
|
660
|
-
}
|
|
661
|
-
return undefined;
|
|
662
|
-
} catch {
|
|
663
|
-
return undefined;
|
|
664
|
-
}
|
|
665
|
-
}
|
|
666
|
-
|
|
667
|
-
function isApplicationJson(contentType: string): boolean {
|
|
668
|
-
return contentType.split(";", 1)[0]?.trim().toLowerCase() === "application/json";
|
|
669
|
-
}
|