@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,65 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The one resolution of "which Cursor control plane, as whom" for hosted
|
|
3
|
-
* transports. The verb-lane files sink (`files-backends/cursor-hosted.ts`)
|
|
4
|
-
* and the domain-lane store API client (`store-api-client.ts`) both build on
|
|
5
|
-
* these, so the pod credential and base URL resolve identically on every
|
|
6
|
-
* wire — one place to change, no drift between lanes.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Same default as the hosted storage backend, inlined so these entrypoints
|
|
11
|
-
* do not import CLI code.
|
|
12
|
-
*/
|
|
13
|
-
export const DEFAULT_CURSOR_EXTERNAL_API_URL = "https://api.cursor.com";
|
|
14
|
-
|
|
15
|
-
export interface CursorApiTransportOptions {
|
|
16
|
-
/** Control-plane base URL (default: `CURSOR_API_BASE_URL`, else api.cursor.com). */
|
|
17
|
-
baseUrl?: string;
|
|
18
|
-
/** Bearer credential (default: `CURSOR_API_KEY`). */
|
|
19
|
-
apiKey?: string;
|
|
20
|
-
/**
|
|
21
|
-
* Lazy credential, re-resolved on every call and preferred over
|
|
22
|
-
* {@link apiKey} — hosted freeze snapshots listen unsigned and bind the
|
|
23
|
-
* key file after serve start. Kept separate so `apiKey` stays a plain
|
|
24
|
-
* string.
|
|
25
|
-
*/
|
|
26
|
-
resolveApiKey?: () => string | undefined;
|
|
27
|
-
/** Test seam; defaults to global fetch. */
|
|
28
|
-
fetch?: typeof fetch;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
function trimTrailingSlash(raw: string): string {
|
|
32
|
-
const trimmed = raw.trim();
|
|
33
|
-
return trimmed.endsWith("/") ? trimmed.slice(0, -1) : trimmed;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export function resolveCursorApiBaseUrl(options: CursorApiTransportOptions): string {
|
|
37
|
-
return trimTrailingSlash(
|
|
38
|
-
options.baseUrl ?? process.env.CURSOR_API_BASE_URL ?? DEFAULT_CURSOR_EXTERNAL_API_URL,
|
|
39
|
-
);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* The pod credential is the whole authorization on every hosted wire: the
|
|
44
|
-
* API resolves the caller's deployment from it, so there is no second,
|
|
45
|
-
* narrower credential to manage. Fails loudly rather than defaulting —
|
|
46
|
-
* calling the control plane as nobody is worse than not calling.
|
|
47
|
-
*/
|
|
48
|
-
export function resolveCursorApiKey(options: CursorApiTransportOptions): string {
|
|
49
|
-
const configured = options.resolveApiKey?.() ?? options.apiKey;
|
|
50
|
-
const key = (configured ?? process.env.CURSOR_API_KEY)?.trim();
|
|
51
|
-
if (key === undefined || key === "") {
|
|
52
|
-
throw new Error(
|
|
53
|
-
"Cursor hosted transport requires CURSOR_API_KEY (deployment pod credential on Cursor hosting)",
|
|
54
|
-
);
|
|
55
|
-
}
|
|
56
|
-
return key;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
export function resolveCursorApiFetch(options: CursorApiTransportOptions): typeof fetch {
|
|
60
|
-
const impl = options.fetch ?? globalThis.fetch;
|
|
61
|
-
if (typeof impl !== "function") {
|
|
62
|
-
throw new Error("Cursor hosted transport requires fetch");
|
|
63
|
-
}
|
|
64
|
-
return impl;
|
|
65
|
-
}
|
|
@@ -1,228 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Short-lived GitHub credentials minted from the host's Cursor account.
|
|
3
|
-
*
|
|
4
|
-
* The token stays in memory. `GH_TOKEN` is updated for child `gh` processes,
|
|
5
|
-
* while Octokit callers use {@link getToken} so long-lived clients refresh
|
|
6
|
-
* without being rebuilt.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import type { CursorGithubRepoScope } from "../../channels/github/cursor-account.js";
|
|
10
|
-
import type { CursorBackendClient } from "./backend-client.js";
|
|
11
|
-
import { CursorBackendError } from "./backend-client.js";
|
|
12
|
-
|
|
13
|
-
const REFRESH_LEEWAY_MS = 5 * 60_000;
|
|
14
|
-
const REFRESH_RETRY_MS = 60_000;
|
|
15
|
-
const FAILURE_CACHE_TTL_MS = 60_000;
|
|
16
|
-
const MAX_RETRY_AFTER_MS = 60 * 60_000;
|
|
17
|
-
const MIN_TIMER_DELAY_MS = 1_000;
|
|
18
|
-
|
|
19
|
-
type GithubTokenClient = Pick<CursorBackendClient, "getGithubToken">;
|
|
20
|
-
|
|
21
|
-
export interface CursorGithubCredentialProviderOptions {
|
|
22
|
-
client: GithubTokenClient;
|
|
23
|
-
scope: CursorGithubRepoScope;
|
|
24
|
-
logger?: (line: string) => void;
|
|
25
|
-
/** Test seam. */
|
|
26
|
-
now?: () => number;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
interface CachedGithubToken {
|
|
30
|
-
token: string;
|
|
31
|
-
expiresAtMs: number;
|
|
32
|
-
refreshAtMs: number;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
interface CachedFailure {
|
|
36
|
-
message: string;
|
|
37
|
-
retryAtMs: number;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export class CursorGithubCredentialProvider {
|
|
41
|
-
private readonly client: GithubTokenClient;
|
|
42
|
-
private readonly repos: string[];
|
|
43
|
-
private readonly permissions: CursorGithubRepoScope["permissions"];
|
|
44
|
-
private readonly logger: (line: string) => void;
|
|
45
|
-
private readonly now: () => number;
|
|
46
|
-
private cached: CachedGithubToken | undefined;
|
|
47
|
-
private failure: CachedFailure | undefined;
|
|
48
|
-
private refreshPromise: Promise<string> | undefined;
|
|
49
|
-
private refreshTimer: ReturnType<typeof setTimeout> | undefined;
|
|
50
|
-
private started = false;
|
|
51
|
-
private stopped = false;
|
|
52
|
-
private previousGhToken: string | undefined;
|
|
53
|
-
private installedGhToken: string | undefined;
|
|
54
|
-
|
|
55
|
-
constructor(options: CursorGithubCredentialProviderOptions) {
|
|
56
|
-
this.client = options.client;
|
|
57
|
-
this.repos = [...options.scope.repos];
|
|
58
|
-
this.permissions = options.scope.permissions;
|
|
59
|
-
this.logger = options.logger ?? (() => {});
|
|
60
|
-
this.now = options.now ?? (() => Date.now());
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
async start(): Promise<void> {
|
|
64
|
-
if (this.stopped) {
|
|
65
|
-
throw new Error("Cursor account GitHub credentials have been stopped.");
|
|
66
|
-
}
|
|
67
|
-
if (this.started) {
|
|
68
|
-
return;
|
|
69
|
-
}
|
|
70
|
-
this.previousGhToken = process.env.GH_TOKEN;
|
|
71
|
-
this.started = true;
|
|
72
|
-
try {
|
|
73
|
-
const token = await this.getToken();
|
|
74
|
-
this.installGhToken(token);
|
|
75
|
-
this.scheduleRefresh();
|
|
76
|
-
} catch (error) {
|
|
77
|
-
this.started = false;
|
|
78
|
-
this.restoreGhToken();
|
|
79
|
-
throw error;
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
async getToken(): Promise<string> {
|
|
84
|
-
if (this.stopped) {
|
|
85
|
-
throw new Error("Cursor account GitHub credentials have been stopped.");
|
|
86
|
-
}
|
|
87
|
-
const now = this.now();
|
|
88
|
-
if (this.cached !== undefined && now >= this.cached.expiresAtMs) {
|
|
89
|
-
// Expired leases must not be served; drop them so the next mint is clean.
|
|
90
|
-
this.cached = undefined;
|
|
91
|
-
this.restoreGhToken();
|
|
92
|
-
}
|
|
93
|
-
if (this.cached !== undefined && now < this.cached.refreshAtMs) {
|
|
94
|
-
return this.cached.token;
|
|
95
|
-
}
|
|
96
|
-
if (this.failure !== undefined && now < this.failure.retryAtMs && this.cached === undefined) {
|
|
97
|
-
throw new Error(this.failure.message);
|
|
98
|
-
}
|
|
99
|
-
if (this.refreshPromise === undefined) {
|
|
100
|
-
this.refreshPromise = this.refresh().finally(() => {
|
|
101
|
-
this.refreshPromise = undefined;
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
return this.refreshPromise;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
stop(): void {
|
|
108
|
-
this.started = false;
|
|
109
|
-
this.stopped = true;
|
|
110
|
-
if (this.refreshTimer !== undefined) {
|
|
111
|
-
clearTimeout(this.refreshTimer);
|
|
112
|
-
this.refreshTimer = undefined;
|
|
113
|
-
}
|
|
114
|
-
this.cached = undefined;
|
|
115
|
-
this.failure = undefined;
|
|
116
|
-
this.restoreGhToken();
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
private async refresh(): Promise<string> {
|
|
120
|
-
try {
|
|
121
|
-
const result = await this.client.getGithubToken(this.repos, {
|
|
122
|
-
permissions: this.permissions,
|
|
123
|
-
});
|
|
124
|
-
if (this.stopped) {
|
|
125
|
-
throw new Error("Cursor account GitHub credentials have been stopped.");
|
|
126
|
-
}
|
|
127
|
-
const expiresAtMs = Date.parse(result.expiresAt);
|
|
128
|
-
if (!Number.isFinite(expiresAtMs) || expiresAtMs <= this.now() + REFRESH_LEEWAY_MS) {
|
|
129
|
-
throw new Error("Cursor backend returned an invalid GitHub credential expiry.");
|
|
130
|
-
}
|
|
131
|
-
this.failure = undefined;
|
|
132
|
-
this.cached = {
|
|
133
|
-
token: result.token,
|
|
134
|
-
expiresAtMs,
|
|
135
|
-
refreshAtMs: expiresAtMs - REFRESH_LEEWAY_MS,
|
|
136
|
-
};
|
|
137
|
-
if (this.started) {
|
|
138
|
-
this.installGhToken(result.token);
|
|
139
|
-
this.scheduleRefresh();
|
|
140
|
-
}
|
|
141
|
-
this.logger(
|
|
142
|
-
`[agent-sdk] GitHub auth: refreshed Cursor account credential for ${this.repos.length} repo(s)`,
|
|
143
|
-
);
|
|
144
|
-
return result.token;
|
|
145
|
-
} catch (error) {
|
|
146
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
147
|
-
if (this.cached !== undefined && this.now() < this.cached.expiresAtMs) {
|
|
148
|
-
this.logger(
|
|
149
|
-
`[agent-sdk] GitHub auth: Cursor account credential refresh failed; using the current lease: ${message}`,
|
|
150
|
-
);
|
|
151
|
-
this.cached.refreshAtMs = Math.min(this.cached.expiresAtMs, this.now() + REFRESH_RETRY_MS);
|
|
152
|
-
if (this.started) {
|
|
153
|
-
this.scheduleRetry();
|
|
154
|
-
}
|
|
155
|
-
return this.cached.token;
|
|
156
|
-
}
|
|
157
|
-
// Hard failure with no usable lease: evict any stale cache and back off.
|
|
158
|
-
this.cached = undefined;
|
|
159
|
-
this.restoreGhToken();
|
|
160
|
-
this.failure = {
|
|
161
|
-
message,
|
|
162
|
-
retryAtMs: this.now() + failureBackoffMs(error),
|
|
163
|
-
};
|
|
164
|
-
if (this.started) {
|
|
165
|
-
this.scheduleRetry();
|
|
166
|
-
}
|
|
167
|
-
throw error instanceof Error ? error : new Error(message);
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
private scheduleRefresh(): void {
|
|
172
|
-
if (!this.started || this.cached === undefined) {
|
|
173
|
-
return;
|
|
174
|
-
}
|
|
175
|
-
this.replaceTimer(Math.max(MIN_TIMER_DELAY_MS, this.cached.refreshAtMs - this.now()));
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
private scheduleRetry(): void {
|
|
179
|
-
if (!this.started) {
|
|
180
|
-
return;
|
|
181
|
-
}
|
|
182
|
-
const delayMs =
|
|
183
|
-
this.failure !== undefined
|
|
184
|
-
? Math.max(MIN_TIMER_DELAY_MS, this.failure.retryAtMs - this.now())
|
|
185
|
-
: REFRESH_RETRY_MS;
|
|
186
|
-
this.replaceTimer(delayMs);
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
private replaceTimer(delayMs: number): void {
|
|
190
|
-
if (this.refreshTimer !== undefined) {
|
|
191
|
-
clearTimeout(this.refreshTimer);
|
|
192
|
-
}
|
|
193
|
-
this.refreshTimer = setTimeout(() => {
|
|
194
|
-
void this.getToken().catch((error: unknown) => {
|
|
195
|
-
this.logger(
|
|
196
|
-
`[agent-sdk] GitHub auth: Cursor account credential refresh failed: ${
|
|
197
|
-
error instanceof Error ? error.message : String(error)
|
|
198
|
-
}`,
|
|
199
|
-
);
|
|
200
|
-
this.scheduleRetry();
|
|
201
|
-
});
|
|
202
|
-
}, delayMs);
|
|
203
|
-
this.refreshTimer.unref?.();
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
private installGhToken(token: string): void {
|
|
207
|
-
process.env.GH_TOKEN = token;
|
|
208
|
-
this.installedGhToken = token;
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
private restoreGhToken(): void {
|
|
212
|
-
if (this.installedGhToken !== undefined && process.env.GH_TOKEN === this.installedGhToken) {
|
|
213
|
-
if (this.previousGhToken === undefined) {
|
|
214
|
-
delete process.env.GH_TOKEN;
|
|
215
|
-
} else {
|
|
216
|
-
process.env.GH_TOKEN = this.previousGhToken;
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
this.installedGhToken = undefined;
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
function failureBackoffMs(error: unknown): number {
|
|
224
|
-
if (error instanceof CursorBackendError && error.retryAfterMs !== undefined) {
|
|
225
|
-
return Math.min(Math.max(error.retryAfterMs, FAILURE_CACHE_TTL_MS), MAX_RETRY_AFTER_MS);
|
|
226
|
-
}
|
|
227
|
-
return FAILURE_CACHE_TTL_MS;
|
|
228
|
-
}
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The hosted v2 per-request secret handoff: bind files in, `process.env` out,
|
|
3
|
-
* nothing recoverable left on disk.
|
|
4
|
-
*
|
|
5
|
-
* The control plane rewrites `/run/cursor/secrets/` before every hosted
|
|
6
|
-
* admission and execution because it cannot set the already-running July
|
|
7
|
-
* process's environment. This module closes that handoff at the top of each
|
|
8
|
-
* request: copy both documents into `process.env`, then destroy them. Hosted
|
|
9
|
-
* request code and authored agents read env from there on — nothing on the
|
|
10
|
-
* hosted path should open these paths again.
|
|
11
|
-
*
|
|
12
|
-
* It fails closed. A secret that survives the consume would sit world-readable
|
|
13
|
-
* next to authored agent code for the length of a turn, so the caller returns
|
|
14
|
-
* a retryable error instead of dispatching. The next request re-binds and
|
|
15
|
-
* consumes again.
|
|
16
|
-
*/
|
|
17
|
-
|
|
18
|
-
import { consumeBoundCursorApiKey, DEFAULT_CURSOR_API_KEY_FILE } from "./credentials.js";
|
|
19
|
-
import {
|
|
20
|
-
consumeBoundDeploymentSecrets,
|
|
21
|
-
DEFAULT_AGENT_SERVE_DEPLOYMENT_SECRETS_FILE,
|
|
22
|
-
} from "./hosted-deployment-secrets.js";
|
|
23
|
-
|
|
24
|
-
/** Wire error code for a bind file that outlived its consume. */
|
|
25
|
-
export const BOUND_SECRETS_NOT_CONSUMED = "bound_secrets_not_consumed";
|
|
26
|
-
|
|
27
|
-
export type HostedBoundSecretsResult =
|
|
28
|
-
| { ok: true }
|
|
29
|
-
| { ok: false; code: typeof BOUND_SECRETS_NOT_CONSUMED; message: string };
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Hydrate `process.env` from both bind files and remove them from disk.
|
|
33
|
-
* Returns a failure when either secret is still readable afterwards.
|
|
34
|
-
*
|
|
35
|
-
* Both paths are platform constants, deliberately not the `CURSOR_API_KEY_FILE`
|
|
36
|
-
* override that {@link resolveApiKeySync} honors. That override is a read
|
|
37
|
-
* chain; this is a destructive consume. Following it here would let authored
|
|
38
|
-
* code redirect the destroy at a decoy path — reporting success while the real
|
|
39
|
-
* bind file stays live — and would delete an operator's own long-lived key
|
|
40
|
-
* file on a surface that points the variable at one.
|
|
41
|
-
*/
|
|
42
|
-
export function consumeHostedBoundSecrets(options?: {
|
|
43
|
-
apiKeyFilePath?: string;
|
|
44
|
-
deploymentSecretsFilePath?: string;
|
|
45
|
-
}): HostedBoundSecretsResult {
|
|
46
|
-
const survivors: string[] = [];
|
|
47
|
-
|
|
48
|
-
const secretsPath =
|
|
49
|
-
options?.deploymentSecretsFilePath ?? DEFAULT_AGENT_SERVE_DEPLOYMENT_SECRETS_FILE;
|
|
50
|
-
const secrets = consumeBoundDeploymentSecrets(secretsPath);
|
|
51
|
-
if (secrets.disposal.state === "readable") {
|
|
52
|
-
survivors.push(`${secretsPath} (${secrets.disposal.reason})`);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
const apiKeyPath = options?.apiKeyFilePath ?? DEFAULT_CURSOR_API_KEY_FILE;
|
|
56
|
-
const apiKey = consumeBoundCursorApiKey({ filePath: apiKeyPath });
|
|
57
|
-
if (apiKey.disposal.state === "readable") {
|
|
58
|
-
survivors.push(`${apiKeyPath} (${apiKey.disposal.reason})`);
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
if (survivors.length === 0) {
|
|
62
|
-
return { ok: true };
|
|
63
|
-
}
|
|
64
|
-
return {
|
|
65
|
-
ok: false,
|
|
66
|
-
code: BOUND_SECRETS_NOT_CONSUMED,
|
|
67
|
-
message:
|
|
68
|
-
`Task-bind secrets are still readable after being hydrated into the ` +
|
|
69
|
-
`environment, so authored work did not run: ${survivors.join(", ")}.`,
|
|
70
|
-
};
|
|
71
|
-
}
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Task-time application secrets for hosted v2 freeze restores.
|
|
3
|
-
*
|
|
4
|
-
* The deployment host rewrites this tmpfs document before each admission and
|
|
5
|
-
* execution request. July reloads it synchronously because the process was
|
|
6
|
-
* already running in the frozen snapshot when the task-specific values
|
|
7
|
-
* arrived, then destroys the document: `process.env` is the source authored
|
|
8
|
-
* code reads, and the file is only how the value crossed the process
|
|
9
|
-
* boundary.
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import { readFileSync } from "node:fs";
|
|
13
|
-
|
|
14
|
-
import { type BoundSecretFileDisposal, destroyBoundSecretFile } from "./bound-secret-file.js";
|
|
15
|
-
|
|
16
|
-
export const DEFAULT_AGENT_SERVE_DEPLOYMENT_SECRETS_FILE =
|
|
17
|
-
"/run/cursor/secrets/AGENT_SERVE_DEPLOYMENT_SECRETS.json";
|
|
18
|
-
|
|
19
|
-
const SECRET_NAME_PATTERN = /^[A-Z][A-Z0-9_]{0,63}$/;
|
|
20
|
-
const appliedSecretNames = new Set<string>();
|
|
21
|
-
|
|
22
|
-
function parseBoundSecrets(path: string): Record<string, string> | undefined {
|
|
23
|
-
let parsed: unknown;
|
|
24
|
-
try {
|
|
25
|
-
parsed = JSON.parse(readFileSync(path, "utf8"));
|
|
26
|
-
} catch {
|
|
27
|
-
return undefined;
|
|
28
|
-
}
|
|
29
|
-
if (parsed === null || typeof parsed !== "object") {
|
|
30
|
-
return undefined;
|
|
31
|
-
}
|
|
32
|
-
const envelope = parsed as { v?: unknown; secrets?: unknown };
|
|
33
|
-
if (
|
|
34
|
-
envelope.v !== 1 ||
|
|
35
|
-
envelope.secrets === null ||
|
|
36
|
-
typeof envelope.secrets !== "object" ||
|
|
37
|
-
Array.isArray(envelope.secrets)
|
|
38
|
-
) {
|
|
39
|
-
return undefined;
|
|
40
|
-
}
|
|
41
|
-
const secrets: Record<string, string> = {};
|
|
42
|
-
for (const [name, value] of Object.entries(envelope.secrets)) {
|
|
43
|
-
if (
|
|
44
|
-
SECRET_NAME_PATTERN.test(name) &&
|
|
45
|
-
!name.startsWith("CURSOR_") &&
|
|
46
|
-
typeof value === "string"
|
|
47
|
-
) {
|
|
48
|
-
secrets[name] = value;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
return secrets;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Apply the latest bound document to `process.env`. An empty valid document
|
|
56
|
-
* removes values loaded by an earlier bind after the deployment secret was
|
|
57
|
-
* unset, which is why the applied names are tracked across calls.
|
|
58
|
-
*/
|
|
59
|
-
function applyBoundSecrets(secrets: Record<string, string>): void {
|
|
60
|
-
for (const name of appliedSecretNames) {
|
|
61
|
-
if (!(name in secrets)) {
|
|
62
|
-
delete process.env[name];
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
appliedSecretNames.clear();
|
|
66
|
-
for (const [name, value] of Object.entries(secrets)) {
|
|
67
|
-
process.env[name] = value;
|
|
68
|
-
appliedSecretNames.add(name);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
export type BoundDeploymentSecretsConsumeResult = {
|
|
73
|
-
/** The document supplied values on this call. */
|
|
74
|
-
applied: boolean;
|
|
75
|
-
disposal: BoundSecretFileDisposal;
|
|
76
|
-
};
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* Apply the bound document to `process.env`, then destroy it.
|
|
80
|
-
*
|
|
81
|
-
* The env refresh always runs first, so a failed destroy never costs the
|
|
82
|
-
* request its secrets. A malformed document is destroyed too: it carries no
|
|
83
|
-
* values this process can use, and leaving it on disk only leaves whatever
|
|
84
|
-
* the control plane did manage to write.
|
|
85
|
-
*
|
|
86
|
-
* A `readable` disposal means the document survived; hosted callers must fail
|
|
87
|
-
* the request rather than run authored code next to a live secrets file.
|
|
88
|
-
*/
|
|
89
|
-
export function consumeBoundDeploymentSecrets(
|
|
90
|
-
path: string = DEFAULT_AGENT_SERVE_DEPLOYMENT_SECRETS_FILE,
|
|
91
|
-
): BoundDeploymentSecretsConsumeResult {
|
|
92
|
-
const secrets = parseBoundSecrets(path);
|
|
93
|
-
if (secrets !== undefined) {
|
|
94
|
-
applyBoundSecrets(secrets);
|
|
95
|
-
}
|
|
96
|
-
return {
|
|
97
|
-
applied: secrets !== undefined,
|
|
98
|
-
disposal: destroyBoundSecretFile(path),
|
|
99
|
-
};
|
|
100
|
-
}
|
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Task-time bind paths for hosted deployment file-store source ids.
|
|
3
|
-
*
|
|
4
|
-
* Freeze v2 snapshots start `agent-sdk serve` at bake time without a service
|
|
5
|
-
* account, so neither store id is in process env. Execute-from-freeze binds
|
|
6
|
-
* the deployment credential and store ids into `/run/cursor/secrets/` without
|
|
7
|
-
* restarting July — the same pattern as {@link DEFAULT_CURSOR_API_KEY_FILE}.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import { readFileSync } from "node:fs";
|
|
11
|
-
|
|
12
|
-
export const DEFAULT_AGENT_SERVE_STORE_SOURCE_ID_FILE =
|
|
13
|
-
"/run/cursor/secrets/AGENT_SERVE_STORE_SOURCE_ID";
|
|
14
|
-
|
|
15
|
-
export const DEFAULT_AGENT_SERVE_FRAMEWORK_STORE_SOURCE_ID_FILE =
|
|
16
|
-
"/run/cursor/secrets/AGENT_SERVE_FRAMEWORK_STORE_SOURCE_ID";
|
|
17
|
-
|
|
18
|
-
export const DEFAULT_AGENT_SERVE_STORE_PROTOCOL_FILE =
|
|
19
|
-
"/run/cursor/secrets/AGENT_SERVE_STORE_PROTOCOL";
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Pin value selecting the factory store API (`/internal/agentsdk/store`)
|
|
23
|
-
* over `/v0/agent-serve-files`. Any other value — including a newer pin this
|
|
24
|
-
* runtime does not know — falls back to `/v0`, so the pin fails safe in both
|
|
25
|
-
* directions.
|
|
26
|
-
*/
|
|
27
|
-
export const AGENT_SERVE_FACTORY_FLUSH_PROTOCOL = "factory-flush-v1";
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Pin value additionally enabling the domain-call lane
|
|
31
|
-
* (`POST /internal/agentsdk/store/api/<call>`), where the server owns the
|
|
32
|
-
* storage pattern for framework state — starting with `memory.append`. A
|
|
33
|
-
* strict superset of {@link AGENT_SERVE_FACTORY_FLUSH_PROTOCOL}: verbs keep
|
|
34
|
-
* riding the factory flush wire under this pin too. The same fail-safe
|
|
35
|
-
* applies in both directions — an unknown value keeps today's behavior, and
|
|
36
|
-
* re-pinning to `factory-flush-v1` turns the domain lane back off without a
|
|
37
|
-
* client change.
|
|
38
|
-
*/
|
|
39
|
-
export const AGENT_SERVE_FACTORY_API_PROTOCOL = "factory-api-v1";
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Does this pin select the factory flush wire for the store verbs? True for
|
|
43
|
-
* the flush pin and for the domain-API superset pin.
|
|
44
|
-
*/
|
|
45
|
-
export function storeProtocolEnablesFactoryFlush(protocol: string | undefined): boolean {
|
|
46
|
-
return (
|
|
47
|
-
protocol === AGENT_SERVE_FACTORY_FLUSH_PROTOCOL || protocol === AGENT_SERVE_FACTORY_API_PROTOCOL
|
|
48
|
-
);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* Does this pin enable the domain-call lane (server-owned storage patterns)?
|
|
53
|
-
* Only its exact value does; everything else keeps the client-side patterns.
|
|
54
|
-
*/
|
|
55
|
-
export function storeProtocolEnablesStoreApi(protocol: string | undefined): boolean {
|
|
56
|
-
return protocol === AGENT_SERVE_FACTORY_API_PROTOCOL;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
const STORE_SOURCE_ID_ENV = "AGENT_SERVE_STORE_SOURCE_ID";
|
|
60
|
-
const FRAMEWORK_STORE_SOURCE_ID_ENV = "AGENT_SERVE_FRAMEWORK_STORE_SOURCE_ID";
|
|
61
|
-
const STORE_SOURCE_ID_FILE_ENV = "AGENT_SERVE_STORE_SOURCE_ID_FILE";
|
|
62
|
-
const FRAMEWORK_STORE_SOURCE_ID_FILE_ENV = "AGENT_SERVE_FRAMEWORK_STORE_SOURCE_ID_FILE";
|
|
63
|
-
const STORE_PROTOCOL_ENV = "AGENT_SERVE_STORE_PROTOCOL";
|
|
64
|
-
const STORE_PROTOCOL_FILE_ENV = "AGENT_SERVE_STORE_PROTOCOL_FILE";
|
|
65
|
-
|
|
66
|
-
function readTrimmedFile(path: string): string | undefined {
|
|
67
|
-
try {
|
|
68
|
-
const raw = readFileSync(path, "utf8").trim();
|
|
69
|
-
return raw === "" ? undefined : raw;
|
|
70
|
-
} catch {
|
|
71
|
-
return undefined;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
function readBoundSecretFile(
|
|
76
|
-
fileEnvVar: string,
|
|
77
|
-
defaultPath: string,
|
|
78
|
-
env: NodeJS.ProcessEnv,
|
|
79
|
-
): string | undefined {
|
|
80
|
-
const configured = env[fileEnvVar]?.trim();
|
|
81
|
-
const path = configured !== undefined && configured !== "" ? configured : defaultPath;
|
|
82
|
-
return readTrimmedFile(path);
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
/** Deployment user-land store: env, then task-bind file. */
|
|
86
|
-
export function resolveDeploymentStoreSourceIdSync(
|
|
87
|
-
env: NodeJS.ProcessEnv = process.env,
|
|
88
|
-
): string | undefined {
|
|
89
|
-
const fromEnv = env[STORE_SOURCE_ID_ENV]?.trim();
|
|
90
|
-
if (fromEnv !== undefined && fromEnv !== "") {
|
|
91
|
-
return fromEnv;
|
|
92
|
-
}
|
|
93
|
-
return readBoundSecretFile(
|
|
94
|
-
STORE_SOURCE_ID_FILE_ENV,
|
|
95
|
-
DEFAULT_AGENT_SERVE_STORE_SOURCE_ID_FILE,
|
|
96
|
-
env,
|
|
97
|
-
);
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
/** Engine framework store: env, then task-bind file. */
|
|
101
|
-
export function resolveFrameworkStoreSourceIdSync(
|
|
102
|
-
env: NodeJS.ProcessEnv = process.env,
|
|
103
|
-
): string | undefined {
|
|
104
|
-
const fromEnv = env[FRAMEWORK_STORE_SOURCE_ID_ENV]?.trim();
|
|
105
|
-
if (fromEnv !== undefined && fromEnv !== "") {
|
|
106
|
-
return fromEnv;
|
|
107
|
-
}
|
|
108
|
-
return readBoundSecretFile(
|
|
109
|
-
FRAMEWORK_STORE_SOURCE_ID_FILE_ENV,
|
|
110
|
-
DEFAULT_AGENT_SERVE_FRAMEWORK_STORE_SOURCE_ID_FILE,
|
|
111
|
-
env,
|
|
112
|
-
);
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
/**
|
|
116
|
-
* Store protocol pin: env, then task-bind file. The control plane binds
|
|
117
|
-
* `factory-flush-v1` on every hosted v2 pod. Absence or an unknown value
|
|
118
|
-
* still means `/v0/agent-serve-files`. Resolved lazily per operation like
|
|
119
|
-
* the store ids, so a pod bound after serve start takes effect without a
|
|
120
|
-
* restart.
|
|
121
|
-
*/
|
|
122
|
-
export function resolveStoreProtocolSync(env: NodeJS.ProcessEnv = process.env): string | undefined {
|
|
123
|
-
const fromEnv = env[STORE_PROTOCOL_ENV]?.trim();
|
|
124
|
-
if (fromEnv !== undefined && fromEnv !== "") {
|
|
125
|
-
return fromEnv;
|
|
126
|
-
}
|
|
127
|
-
return readBoundSecretFile(STORE_PROTOCOL_FILE_ENV, DEFAULT_AGENT_SERVE_STORE_PROTOCOL_FILE, env);
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
export type CursorManagedV2StoreIds = {
|
|
131
|
-
deploymentStoreSourceId: string;
|
|
132
|
-
frameworkStoreSourceId: string;
|
|
133
|
-
};
|
|
134
|
-
|
|
135
|
-
/**
|
|
136
|
-
* Resolve the complete managed-v2 store identity at the process boundary.
|
|
137
|
-
*
|
|
138
|
-
* Freeze snapshots construct storage before task bind, so callers keep this
|
|
139
|
-
* resolver lazy. Once an operation needs storage, both ids are mandatory.
|
|
140
|
-
*/
|
|
141
|
-
export function requireCursorManagedV2StoreIdsSync(
|
|
142
|
-
env: NodeJS.ProcessEnv = process.env,
|
|
143
|
-
): CursorManagedV2StoreIds {
|
|
144
|
-
const deploymentStoreSourceId = resolveDeploymentStoreSourceIdSync(env);
|
|
145
|
-
const frameworkStoreSourceId = resolveFrameworkStoreSourceIdSync(env);
|
|
146
|
-
if (deploymentStoreSourceId === undefined || frameworkStoreSourceId === undefined) {
|
|
147
|
-
throw new Error(
|
|
148
|
-
"Cursor-managed AgentSDK v2 requires AGENT_SERVE_STORE_SOURCE_ID and AGENT_SERVE_FRAMEWORK_STORE_SOURCE_ID",
|
|
149
|
-
);
|
|
150
|
-
}
|
|
151
|
-
return { deploymentStoreSourceId, frameworkStoreSourceId };
|
|
152
|
-
}
|