@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,144 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Local fan-out proxy for `agent-sdk github forward`.
|
|
3
|
-
*
|
|
4
|
-
* `gh webhook forward` can only target a single URL, and GitHub allows just one
|
|
5
|
-
* forwarder per repo/org. To feed several GitHub channels at once, we run one
|
|
6
|
-
* forwarder into this loopback proxy, which re-posts each delivery — raw body
|
|
7
|
-
* and signature headers intact, so per-channel `X-Hub-Signature-256` checks
|
|
8
|
-
* still pass — to every channel whose declared event set matches the
|
|
9
|
-
* delivery's `x-github-event`.
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import { createServer, type IncomingMessage, type ServerResponse } from "node:http";
|
|
13
|
-
import type { AddressInfo } from "node:net";
|
|
14
|
-
import { type GitHubForwardTarget, targetLabel } from "../channels/github/forward.js";
|
|
15
|
-
|
|
16
|
-
/** Request headers copied verbatim from gh onto each fanned-out delivery. */
|
|
17
|
-
export const FANOUT_FORWARD_HEADERS: readonly string[] = [
|
|
18
|
-
"content-type",
|
|
19
|
-
"x-github-event",
|
|
20
|
-
"x-github-delivery",
|
|
21
|
-
"x-github-hook-id",
|
|
22
|
-
"x-hub-signature",
|
|
23
|
-
"x-hub-signature-256",
|
|
24
|
-
"user-agent",
|
|
25
|
-
"accept",
|
|
26
|
-
];
|
|
27
|
-
|
|
28
|
-
export interface FanoutServer {
|
|
29
|
-
/** Loopback URL to point `gh webhook forward --url` at. */
|
|
30
|
-
url: string;
|
|
31
|
-
close(): void;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export interface FanoutOptions {
|
|
35
|
-
/** Sink for per-delivery failures. Defaults to `process.stderr`. */
|
|
36
|
-
logger?: (line: string) => void;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/** Start a loopback proxy that fans deliveries out to {@link targets}. */
|
|
40
|
-
export async function startFanoutServer(
|
|
41
|
-
targets: readonly GitHubForwardTarget[],
|
|
42
|
-
options: FanoutOptions = {},
|
|
43
|
-
): Promise<FanoutServer> {
|
|
44
|
-
const server = createServer((req, res) => {
|
|
45
|
-
handleFanoutRequest(req, res, targets, options);
|
|
46
|
-
});
|
|
47
|
-
await new Promise<void>((resolve, reject) => {
|
|
48
|
-
server.once("error", reject);
|
|
49
|
-
server.listen(0, "127.0.0.1", () => {
|
|
50
|
-
resolve();
|
|
51
|
-
});
|
|
52
|
-
});
|
|
53
|
-
const address = server.address() as AddressInfo;
|
|
54
|
-
return {
|
|
55
|
-
url: `http://127.0.0.1:${address.port}`,
|
|
56
|
-
close: () => {
|
|
57
|
-
server.close();
|
|
58
|
-
},
|
|
59
|
-
};
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
function handleFanoutRequest(
|
|
63
|
-
req: IncomingMessage,
|
|
64
|
-
res: ServerResponse,
|
|
65
|
-
targets: readonly GitHubForwardTarget[],
|
|
66
|
-
options: FanoutOptions,
|
|
67
|
-
): void {
|
|
68
|
-
const chunks: Buffer[] = [];
|
|
69
|
-
req.on("data", (chunk: Buffer) => {
|
|
70
|
-
chunks.push(chunk);
|
|
71
|
-
});
|
|
72
|
-
req.on("end", () => {
|
|
73
|
-
void fanoutDelivery(Buffer.concat(chunks), req.headers, targets, options)
|
|
74
|
-
.then(delivered => {
|
|
75
|
-
res.writeHead(200, { "content-type": "application/json" });
|
|
76
|
-
res.end(JSON.stringify({ ok: true, delivered }));
|
|
77
|
-
})
|
|
78
|
-
.catch((error: unknown) => {
|
|
79
|
-
res.writeHead(502, { "content-type": "application/json" });
|
|
80
|
-
res.end(
|
|
81
|
-
JSON.stringify({
|
|
82
|
-
ok: false,
|
|
83
|
-
error: error instanceof Error ? error.message : String(error),
|
|
84
|
-
}),
|
|
85
|
-
);
|
|
86
|
-
});
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
/**
|
|
91
|
-
* Re-post a single delivery to the matching targets, returning the labels that
|
|
92
|
-
* accepted it. Only targets whose event set includes the delivery's
|
|
93
|
-
* `x-github-event` receive it (all of them when the header is absent).
|
|
94
|
-
*/
|
|
95
|
-
export async function fanoutDelivery(
|
|
96
|
-
body: Buffer,
|
|
97
|
-
headers: IncomingMessage["headers"],
|
|
98
|
-
targets: readonly GitHubForwardTarget[],
|
|
99
|
-
options: FanoutOptions = {},
|
|
100
|
-
): Promise<string[]> {
|
|
101
|
-
const log = options.logger ?? (line => process.stderr.write(line));
|
|
102
|
-
const event =
|
|
103
|
-
typeof headers["x-github-event"] === "string" ? headers["x-github-event"] : undefined;
|
|
104
|
-
const outbound: Record<string, string> = {};
|
|
105
|
-
for (const name of FANOUT_FORWARD_HEADERS) {
|
|
106
|
-
const value = headers[name];
|
|
107
|
-
if (typeof value === "string") {
|
|
108
|
-
outbound[name] = value;
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
const recipients = targets.filter(target => event === undefined || target.events.includes(event));
|
|
112
|
-
// Reuse one Uint8Array view across recipients (Buffer isn't a BodyInit).
|
|
113
|
-
const payload = new Uint8Array(body);
|
|
114
|
-
const delivered: string[] = [];
|
|
115
|
-
// Bounded by the number of GitHub channels in the project (a handful), so
|
|
116
|
-
// unbounded-concurrency concerns do not apply here.
|
|
117
|
-
await Promise.all(
|
|
118
|
-
recipients.map(async target => {
|
|
119
|
-
const label = targetLabel(target);
|
|
120
|
-
try {
|
|
121
|
-
const response = await fetch(target.url, {
|
|
122
|
-
method: "POST",
|
|
123
|
-
headers: outbound,
|
|
124
|
-
body: payload,
|
|
125
|
-
});
|
|
126
|
-
if (!response.ok) {
|
|
127
|
-
log(`[agent-sdk] delivery to ${label} failed: HTTP ${response.status}\n`);
|
|
128
|
-
return;
|
|
129
|
-
}
|
|
130
|
-
delivered.push(label);
|
|
131
|
-
} catch (error) {
|
|
132
|
-
log(
|
|
133
|
-
`[agent-sdk] delivery to ${label} failed: ${
|
|
134
|
-
error instanceof Error ? error.message : String(error)
|
|
135
|
-
}\n`,
|
|
136
|
-
);
|
|
137
|
-
}
|
|
138
|
-
}),
|
|
139
|
-
);
|
|
140
|
-
if (recipients.length > 0 && delivered.length === 0) {
|
|
141
|
-
throw new Error(`fan-out delivery failed for all ${recipients.length} matching channel(s)`);
|
|
142
|
-
}
|
|
143
|
-
return delivered;
|
|
144
|
-
}
|
|
@@ -1,391 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Guest egress readiness for hosted v2.
|
|
3
|
-
*
|
|
4
|
-
* `waitForEngineReady` only polls July `/v1/health` (process listening). After
|
|
5
|
-
* a freeze restore the guest network (DNS, egress programming, dead sockets)
|
|
6
|
-
* often comes up later. Authored admission/execution that `fetch`es in that
|
|
7
|
-
* window throws undici `TypeError: fetch failed`, which used to become a
|
|
8
|
-
* redacted HTTP 500 `internal_error` and a minutes-long Temporal retry.
|
|
9
|
-
*
|
|
10
|
-
* TAS waits on GET `/v1/guest-network` (90s, Sand's resume bar) before
|
|
11
|
-
* opening the hosted POST. The in-POST wait stays a short last-line check
|
|
12
|
-
* so leftover races still return 503 `guest_network_unavailable` instead of
|
|
13
|
-
* a redacted 500.
|
|
14
|
-
*
|
|
15
|
-
* Quiet guest Connect failures with a typed Connect/undici code are stalls,
|
|
16
|
-
* not dead NICs. Those become `guest_connect_stalled` so TAS retries the same
|
|
17
|
-
* pod. Untyped errors stay unknown rather than being classified from prose.
|
|
18
|
-
*/
|
|
19
|
-
|
|
20
|
-
import { HOSTED_GUEST_RETRY_TRANSIENT } from "./hosted-delivery-protocol.js";
|
|
21
|
-
|
|
22
|
-
export const GUEST_NETWORK_UNAVAILABLE = "guest_network_unavailable";
|
|
23
|
-
export const GUEST_CONNECT_STALLED = "guest_connect_stalled";
|
|
24
|
-
|
|
25
|
-
/** Control-plane readiness probe. Auth none, same as `/v1/health`. */
|
|
26
|
-
export const GUEST_NETWORK_PATH = "/v1/guest-network";
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Sand `READY_TIMEOUT_MS` / resume reachability bar. The in-POST wait stays
|
|
30
|
-
* at {@link DEFAULT_WAIT_TIMEOUT_MS}; this budget is for GET `/v1/guest-network`
|
|
31
|
-
* so TAS does not open a hosted turn on a dead NIC.
|
|
32
|
-
*/
|
|
33
|
-
export const GUEST_NETWORK_READY_WAIT_TIMEOUT_MS = 90_000;
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Node/undici codes that mean the request never produced an HTTP response.
|
|
37
|
-
* `ENOTFOUND`/`EAI_AGAIN` cover restored-pod DNS races.
|
|
38
|
-
*/
|
|
39
|
-
const TRANSIENT_NETWORK_ERROR_CODES: ReadonlySet<string> = new Set([
|
|
40
|
-
"ECONNREFUSED",
|
|
41
|
-
"ECONNRESET",
|
|
42
|
-
"EAI_AGAIN",
|
|
43
|
-
"EHOSTUNREACH",
|
|
44
|
-
"ENETDOWN",
|
|
45
|
-
"ENETUNREACH",
|
|
46
|
-
"ENOTFOUND",
|
|
47
|
-
"EPIPE",
|
|
48
|
-
"ETIMEDOUT",
|
|
49
|
-
"UND_ERR_CONNECT_TIMEOUT",
|
|
50
|
-
"UND_ERR_SOCKET",
|
|
51
|
-
"UND_ERR_CLOSED",
|
|
52
|
-
]);
|
|
53
|
-
|
|
54
|
-
const MAX_CAUSE_DEPTH = 8;
|
|
55
|
-
|
|
56
|
-
export class GuestNetworkUnavailableError extends Error {
|
|
57
|
-
readonly code: typeof GUEST_NETWORK_UNAVAILABLE = GUEST_NETWORK_UNAVAILABLE;
|
|
58
|
-
readonly waitMs: number;
|
|
59
|
-
readonly probeAttempts: number;
|
|
60
|
-
|
|
61
|
-
constructor(
|
|
62
|
-
message = "Guest network is not ready for outbound requests.",
|
|
63
|
-
extras: { waitMs?: number; probeAttempts?: number } = {},
|
|
64
|
-
) {
|
|
65
|
-
super(message);
|
|
66
|
-
this.name = "GuestNetworkUnavailableError";
|
|
67
|
-
this.waitMs = extras.waitMs ?? 0;
|
|
68
|
-
this.probeAttempts = extras.probeAttempts ?? 0;
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
class GuestNetworkProbeFailedError extends Error {
|
|
73
|
-
constructor(cause: unknown) {
|
|
74
|
-
super("Guest network probe failed", { cause });
|
|
75
|
-
this.name = "GuestNetworkProbeFailedError";
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* True when the error (or anything on its `cause` chain, or inside an
|
|
81
|
-
* `AggregateError`) carries a known network-level code.
|
|
82
|
-
*/
|
|
83
|
-
export function isTransientGuestNetworkError(error: unknown): boolean {
|
|
84
|
-
return isTransientAtDepth(error, 0);
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* Connect/undici codes that mean the socket was up but the RPC went quiet
|
|
89
|
-
* (headers never arrived, body stalled, caller aborted). Not a DNS/egress
|
|
90
|
-
* miss — those live in the network errno set.
|
|
91
|
-
*/
|
|
92
|
-
const QUIET_CONNECT_ERROR_CODES: ReadonlySet<string> = new Set([
|
|
93
|
-
"ABORT_ERR",
|
|
94
|
-
"UND_ERR_BODY_TIMEOUT",
|
|
95
|
-
"UND_ERR_HEADERS_TIMEOUT",
|
|
96
|
-
]);
|
|
97
|
-
// gRPC Canceled, Unknown, and Unavailable.
|
|
98
|
-
const QUIET_CONNECT_CODES: ReadonlySet<number> = new Set([1, 2, 14]);
|
|
99
|
-
|
|
100
|
-
export function hasGuestNetworkErrno(error: unknown): boolean {
|
|
101
|
-
return hasCodeAtDepth(error, 0, TRANSIENT_NETWORK_ERROR_CODES);
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* Quiet guest Connect: the request left the guest but never produced a
|
|
106
|
-
* useful RPC outcome. Distinct from {@link isTransientGuestNetworkError}
|
|
107
|
-
* so the in-POST wait still retries bare `fetch failed`, while the HTTP
|
|
108
|
-
* mapper can return `guest_connect_stalled` instead of a mystery 503.
|
|
109
|
-
*/
|
|
110
|
-
export function isQuietGuestConnectStall(error: unknown): boolean {
|
|
111
|
-
if (error instanceof GuestNetworkUnavailableError) {
|
|
112
|
-
return false;
|
|
113
|
-
}
|
|
114
|
-
if (hasGuestNetworkErrno(error)) {
|
|
115
|
-
return false;
|
|
116
|
-
}
|
|
117
|
-
return isQuietSignatureAtDepth(error, 0);
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
function errorCode(error: Error): string | undefined {
|
|
121
|
-
const code = (error as NodeJS.ErrnoException).code;
|
|
122
|
-
return typeof code === "string" && code.length > 0 ? code : undefined;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
function numericErrorCode(error: Error): number | undefined {
|
|
126
|
-
const code = (error as { code?: unknown }).code;
|
|
127
|
-
return typeof code === "number" ? code : undefined;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
function hasCodeAtDepth(error: unknown, depth: number, codes: ReadonlySet<string>): boolean {
|
|
131
|
-
if (depth >= MAX_CAUSE_DEPTH || !(error instanceof Error)) {
|
|
132
|
-
return false;
|
|
133
|
-
}
|
|
134
|
-
const code = errorCode(error);
|
|
135
|
-
if (code !== undefined && codes.has(code)) {
|
|
136
|
-
return true;
|
|
137
|
-
}
|
|
138
|
-
if (
|
|
139
|
-
error instanceof AggregateError &&
|
|
140
|
-
error.errors.some(inner => hasCodeAtDepth(inner, depth + 1, codes))
|
|
141
|
-
) {
|
|
142
|
-
return true;
|
|
143
|
-
}
|
|
144
|
-
return hasCodeAtDepth(error.cause, depth + 1, codes);
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
function isQuietSignatureAtDepth(error: unknown, depth: number): boolean {
|
|
148
|
-
if (depth >= MAX_CAUSE_DEPTH || !(error instanceof Error)) {
|
|
149
|
-
return false;
|
|
150
|
-
}
|
|
151
|
-
if (error.name === "AbortError") {
|
|
152
|
-
return true;
|
|
153
|
-
}
|
|
154
|
-
const numericCode = numericErrorCode(error);
|
|
155
|
-
if (numericCode !== undefined && QUIET_CONNECT_CODES.has(numericCode)) {
|
|
156
|
-
return true;
|
|
157
|
-
}
|
|
158
|
-
const code = errorCode(error);
|
|
159
|
-
if (code !== undefined && QUIET_CONNECT_ERROR_CODES.has(code)) {
|
|
160
|
-
return true;
|
|
161
|
-
}
|
|
162
|
-
if (
|
|
163
|
-
error instanceof AggregateError &&
|
|
164
|
-
error.errors.some(inner => isQuietSignatureAtDepth(inner, depth + 1))
|
|
165
|
-
) {
|
|
166
|
-
return true;
|
|
167
|
-
}
|
|
168
|
-
return isQuietSignatureAtDepth(error.cause, depth + 1);
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
function isTransientAtDepth(error: unknown, depth: number): boolean {
|
|
172
|
-
if (depth >= MAX_CAUSE_DEPTH || !(error instanceof Error)) {
|
|
173
|
-
return false;
|
|
174
|
-
}
|
|
175
|
-
if (error instanceof GuestNetworkUnavailableError) {
|
|
176
|
-
return true;
|
|
177
|
-
}
|
|
178
|
-
if (error instanceof GuestNetworkProbeFailedError) {
|
|
179
|
-
return true;
|
|
180
|
-
}
|
|
181
|
-
if (error.name === "AbortError") {
|
|
182
|
-
return true;
|
|
183
|
-
}
|
|
184
|
-
const numericCode = numericErrorCode(error);
|
|
185
|
-
if (numericCode !== undefined && QUIET_CONNECT_CODES.has(numericCode)) {
|
|
186
|
-
return true;
|
|
187
|
-
}
|
|
188
|
-
const code = errorCode(error);
|
|
189
|
-
if (
|
|
190
|
-
code !== undefined &&
|
|
191
|
-
(TRANSIENT_NETWORK_ERROR_CODES.has(code) || QUIET_CONNECT_ERROR_CODES.has(code))
|
|
192
|
-
) {
|
|
193
|
-
return true;
|
|
194
|
-
}
|
|
195
|
-
if (
|
|
196
|
-
error instanceof AggregateError &&
|
|
197
|
-
error.errors.some(inner => isTransientAtDepth(inner, depth + 1))
|
|
198
|
-
) {
|
|
199
|
-
return true;
|
|
200
|
-
}
|
|
201
|
-
return isTransientAtDepth(error.cause, depth + 1);
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
const DEFAULT_PROBE_TIMEOUT_MS = 2_000;
|
|
205
|
-
/** Last-line wait inside an already-open hosted POST. */
|
|
206
|
-
export const DEFAULT_WAIT_TIMEOUT_MS = 8_000;
|
|
207
|
-
const DEFAULT_POLL_MS = 250;
|
|
208
|
-
|
|
209
|
-
export type GuestNetworkWaitOptions = {
|
|
210
|
-
/**
|
|
211
|
-
* When omitted, wait is enabled only on hosted engines (probe URL set and
|
|
212
|
-
* not running under Vitest). Tests pass `true` plus a mock `probe`.
|
|
213
|
-
*/
|
|
214
|
-
enabled?: boolean;
|
|
215
|
-
/** Override the allowlisted probe URL. */
|
|
216
|
-
probeUrl?: string;
|
|
217
|
-
waitTimeoutMs?: number;
|
|
218
|
-
pollMs?: number;
|
|
219
|
-
probeTimeoutMs?: number;
|
|
220
|
-
probe?: () => Promise<void>;
|
|
221
|
-
now?: () => number;
|
|
222
|
-
sleep?: (ms: number) => Promise<void>;
|
|
223
|
-
};
|
|
224
|
-
|
|
225
|
-
function defaultSleep(ms: number): Promise<void> {
|
|
226
|
-
return new Promise(resolve => {
|
|
227
|
-
setTimeout(resolve, ms);
|
|
228
|
-
});
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
function resolveProbeUrl(explicit?: string): string | undefined {
|
|
232
|
-
const raw =
|
|
233
|
-
explicit ??
|
|
234
|
-
process.env.AGENT_SERVE_EGRESS_PROBE_URL ??
|
|
235
|
-
process.env.AGENT_SERVE_CURSOR_BACKEND_URL;
|
|
236
|
-
const trimmed = raw?.trim() ?? "";
|
|
237
|
-
return trimmed.length > 0 ? trimmed : undefined;
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
function waitEnabled(options: GuestNetworkWaitOptions): boolean {
|
|
241
|
-
if (options.enabled !== undefined) {
|
|
242
|
-
return options.enabled;
|
|
243
|
-
}
|
|
244
|
-
if (process.env.VITEST === "true") {
|
|
245
|
-
return false;
|
|
246
|
-
}
|
|
247
|
-
if (process.env.AGENT_SERVE_SKIP_GUEST_NETWORK_WAIT === "1") {
|
|
248
|
-
return false;
|
|
249
|
-
}
|
|
250
|
-
return resolveProbeUrl(options.probeUrl) !== undefined;
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
async function defaultProbe(probeUrl: string, probeTimeoutMs: number): Promise<void> {
|
|
254
|
-
try {
|
|
255
|
-
// Any HTTP response means egress and DNS work. 401/404 are ready.
|
|
256
|
-
const response = await fetch(probeUrl, {
|
|
257
|
-
method: "GET",
|
|
258
|
-
redirect: "manual",
|
|
259
|
-
signal: AbortSignal.timeout(probeTimeoutMs),
|
|
260
|
-
});
|
|
261
|
-
void response.body?.cancel();
|
|
262
|
-
} catch (error) {
|
|
263
|
-
throw new GuestNetworkProbeFailedError(error);
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
export type GuestNetworkWaitOutcome = "ready" | "skipped" | "unavailable";
|
|
268
|
-
|
|
269
|
-
export type GuestNetworkWaitResult = {
|
|
270
|
-
outcome: Exclude<GuestNetworkWaitOutcome, "unavailable">;
|
|
271
|
-
waitMs: number;
|
|
272
|
-
probeAttempts: number;
|
|
273
|
-
};
|
|
274
|
-
|
|
275
|
-
export type GuestNetworkWaitStats = {
|
|
276
|
-
outcome: GuestNetworkWaitOutcome;
|
|
277
|
-
waitMs: number;
|
|
278
|
-
probeAttempts: number;
|
|
279
|
-
};
|
|
280
|
-
|
|
281
|
-
/**
|
|
282
|
-
* `Server-Timing` metric the control plane scrapes for Datadog
|
|
283
|
-
* `hosted_*.guest_network_wait_ms`. Any HTTP response (ok or 503) can
|
|
284
|
-
* carry it so restore time-to-egress is visible on both paths.
|
|
285
|
-
*/
|
|
286
|
-
export function formatGuestNetworkServerTiming(stats: GuestNetworkWaitStats): string {
|
|
287
|
-
return `guest_net;desc="${stats.outcome}";dur=${Math.max(0, stats.waitMs).toFixed(1)};probes=${String(stats.probeAttempts)}`;
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
/**
|
|
291
|
-
* Poll until a cheap allowlisted GET succeeds or the wait budget expires.
|
|
292
|
-
* Throws {@link GuestNetworkUnavailableError} on timeout so hosted routes
|
|
293
|
-
* can return 503 without running authored code.
|
|
294
|
-
*/
|
|
295
|
-
export async function waitForGuestNetworkReady(
|
|
296
|
-
options: GuestNetworkWaitOptions = {},
|
|
297
|
-
): Promise<GuestNetworkWaitResult> {
|
|
298
|
-
if (!waitEnabled(options)) {
|
|
299
|
-
return { outcome: "skipped", waitMs: 0, probeAttempts: 0 };
|
|
300
|
-
}
|
|
301
|
-
const probeUrl = resolveProbeUrl(options.probeUrl);
|
|
302
|
-
const probe =
|
|
303
|
-
options.probe ??
|
|
304
|
-
(probeUrl === undefined
|
|
305
|
-
? undefined
|
|
306
|
-
: () => defaultProbe(probeUrl, options.probeTimeoutMs ?? DEFAULT_PROBE_TIMEOUT_MS));
|
|
307
|
-
if (probe === undefined) {
|
|
308
|
-
return { outcome: "skipped", waitMs: 0, probeAttempts: 0 };
|
|
309
|
-
}
|
|
310
|
-
const waitTimeoutMs = options.waitTimeoutMs ?? DEFAULT_WAIT_TIMEOUT_MS;
|
|
311
|
-
const pollMs = options.pollMs ?? DEFAULT_POLL_MS;
|
|
312
|
-
const now = options.now ?? Date.now;
|
|
313
|
-
const sleep = options.sleep ?? defaultSleep;
|
|
314
|
-
const startedAt = now();
|
|
315
|
-
let lastError: unknown;
|
|
316
|
-
let probeAttempts = 0;
|
|
317
|
-
for (;;) {
|
|
318
|
-
probeAttempts += 1;
|
|
319
|
-
try {
|
|
320
|
-
await probe();
|
|
321
|
-
return {
|
|
322
|
-
outcome: "ready",
|
|
323
|
-
waitMs: Math.max(0, now() - startedAt),
|
|
324
|
-
probeAttempts,
|
|
325
|
-
};
|
|
326
|
-
} catch (error) {
|
|
327
|
-
lastError = error;
|
|
328
|
-
if (!isTransientGuestNetworkError(error)) {
|
|
329
|
-
throw error;
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
const elapsedMs = now() - startedAt;
|
|
333
|
-
if (elapsedMs >= waitTimeoutMs) {
|
|
334
|
-
const detail = lastError instanceof Error ? lastError.message : String(lastError);
|
|
335
|
-
throw new GuestNetworkUnavailableError(
|
|
336
|
-
`Guest network did not become ready within ${String(waitTimeoutMs)}ms (${detail}).`,
|
|
337
|
-
{ waitMs: Math.max(0, elapsedMs), probeAttempts },
|
|
338
|
-
);
|
|
339
|
-
}
|
|
340
|
-
await sleep(pollMs);
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
/**
|
|
345
|
-
* GET `/v1/guest-network`: wait up to
|
|
346
|
-
* {@link GUEST_NETWORK_READY_WAIT_TIMEOUT_MS} and return 200 (ready/skipped)
|
|
347
|
-
* or 503 `guest_network_unavailable`. Server-Timing matches the hosted POST
|
|
348
|
-
* so TAS can scrape the same `guest_net` metric before `postHosted`.
|
|
349
|
-
*/
|
|
350
|
-
export async function guestNetworkReadinessResponse(
|
|
351
|
-
options: GuestNetworkWaitOptions = {},
|
|
352
|
-
): Promise<Response> {
|
|
353
|
-
try {
|
|
354
|
-
const result = await waitForGuestNetworkReady({
|
|
355
|
-
waitTimeoutMs: GUEST_NETWORK_READY_WAIT_TIMEOUT_MS,
|
|
356
|
-
...options,
|
|
357
|
-
});
|
|
358
|
-
return new Response(JSON.stringify({ ok: true, ...result }), {
|
|
359
|
-
status: 200,
|
|
360
|
-
headers: {
|
|
361
|
-
"content-type": "application/json; charset=utf-8",
|
|
362
|
-
"server-timing": formatGuestNetworkServerTiming(result),
|
|
363
|
-
},
|
|
364
|
-
});
|
|
365
|
-
} catch (error) {
|
|
366
|
-
if (!(error instanceof GuestNetworkUnavailableError)) {
|
|
367
|
-
throw error;
|
|
368
|
-
}
|
|
369
|
-
return new Response(
|
|
370
|
-
JSON.stringify({
|
|
371
|
-
ok: false,
|
|
372
|
-
error: GUEST_NETWORK_UNAVAILABLE,
|
|
373
|
-
retry: HOSTED_GUEST_RETRY_TRANSIENT,
|
|
374
|
-
message: error.message,
|
|
375
|
-
waitMs: error.waitMs,
|
|
376
|
-
probeAttempts: error.probeAttempts,
|
|
377
|
-
}),
|
|
378
|
-
{
|
|
379
|
-
status: 503,
|
|
380
|
-
headers: {
|
|
381
|
-
"content-type": "application/json; charset=utf-8",
|
|
382
|
-
"server-timing": formatGuestNetworkServerTiming({
|
|
383
|
-
outcome: "unavailable",
|
|
384
|
-
waitMs: error.waitMs,
|
|
385
|
-
probeAttempts: error.probeAttempts,
|
|
386
|
-
}),
|
|
387
|
-
},
|
|
388
|
-
},
|
|
389
|
-
);
|
|
390
|
-
}
|
|
391
|
-
}
|