@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,604 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Offer to install the package's coding-agent skills into the user's
|
|
3
|
-
* personal Cursor skills dir under `~/.cursor/skills/bdk/<skill>/`.
|
|
4
|
-
*
|
|
5
|
-
* Cursor walks `~/.cursor/skills` recursively, so the `bdk/` folder is
|
|
6
|
-
* only organizational — identity comes from the leaf folder that holds
|
|
7
|
-
* SKILL.md. Installed copies get `alwaysApply: true` so Cursor injects the
|
|
8
|
-
* skill body as a global rule instead of leaving it as an on-demand catalog
|
|
9
|
-
* entry. Skipped for `--json` / non-TTY hosts.
|
|
10
|
-
*
|
|
11
|
-
* Consumer installs (`npm install` / `npx` of `@cursor/bdk`) also copy
|
|
12
|
-
* these skills from a postinstall hook. That path never prompts and never
|
|
13
|
-
* fails the package install. The monorepo source checkout is not a consumer
|
|
14
|
-
* install, so `pnpm install` in everysphere does not overwrite `~/.cursor`.
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
import { access, chmod, cp, mkdir, readdir, readFile, rm, stat, writeFile } from "node:fs/promises";
|
|
18
|
-
import { homedir } from "node:os";
|
|
19
|
-
import { join } from "node:path";
|
|
20
|
-
import { CLI_COMMAND_NAME, packageRootDir } from "./distribution.js";
|
|
21
|
-
import { parseFrontmatter } from "./frontmatter.js";
|
|
22
|
-
import { stdoutPalette } from "./terminal-style.js";
|
|
23
|
-
|
|
24
|
-
/** Category folder under ~/.cursor/skills (Cursor discovers nested skills). */
|
|
25
|
-
export const CURSOR_SKILLS_NAMESPACE = "bdk";
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Earlier install folders. Deleted on install so stale skill ids stop
|
|
29
|
-
* being discovered next to the current copies.
|
|
30
|
-
*/
|
|
31
|
-
const LEGACY_CURSOR_SKILLS_NAMESPACES = ["agentsdk", "agentkit"] as const;
|
|
32
|
-
|
|
33
|
-
/** How long the `init` offer waits for an answer before skipping the install. */
|
|
34
|
-
export const SKILL_PROMPT_TIMEOUT_MS = 45_000;
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Override the resolved `~/.cursor/skills` directory (not the user home).
|
|
38
|
-
* Used by the postinstall hook in tests and publish smoke.
|
|
39
|
-
*/
|
|
40
|
-
export const CURSOR_JULY_SKILLS_HOME_ENV = "CURSOR_JULY_SKILLS_HOME";
|
|
41
|
-
|
|
42
|
-
/** Set to `1` to skip the postinstall skill copy. */
|
|
43
|
-
export const CURSOR_JULY_SKIP_SKILL_INSTALL_ENV = "CURSOR_JULY_SKIP_SKILL_INSTALL";
|
|
44
|
-
|
|
45
|
-
export interface PackageSkill {
|
|
46
|
-
/** Frontmatter `name` (e.g. bdk-create-agent). */
|
|
47
|
-
name: string;
|
|
48
|
-
/** Leaf install directory under bdk/ (e.g. create-agent). */
|
|
49
|
-
leafDir: string;
|
|
50
|
-
/** Absolute path to the source skill directory in the package. */
|
|
51
|
-
sourceDir: string;
|
|
52
|
-
/** Exact package version that supplied this skill. */
|
|
53
|
-
packageVersion: string;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
export function cursorSkillsHome(home?: string): string {
|
|
57
|
-
if (home !== undefined) {
|
|
58
|
-
return join(home.trim() === "" ? homedir() : home, ".cursor", "skills");
|
|
59
|
-
}
|
|
60
|
-
const override = process.env[CURSOR_JULY_SKILLS_HOME_ENV]?.trim();
|
|
61
|
-
if (override !== undefined && override !== "") {
|
|
62
|
-
return override;
|
|
63
|
-
}
|
|
64
|
-
return join(homedir(), ".cursor", "skills");
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* True when this package root is an installed copy under `node_modules`
|
|
69
|
-
* (npm, pnpm, yarn, npx, global), not the everysphere source checkout.
|
|
70
|
-
*/
|
|
71
|
-
export function isConsumerPackageInstall(packageRoot: string): boolean {
|
|
72
|
-
// Segment check only — split on both separators so a Windows path still
|
|
73
|
-
// matches when this runs (or is tested) on POSIX. Do not rewrite the path.
|
|
74
|
-
return packageRoot.split(/[\\/]/).includes("node_modules");
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
/** `~/.cursor/skills/bdk` — where package skills are installed. */
|
|
78
|
-
export function bdkCursorSkillsDir(skillsHome: string = cursorSkillsHome()): string {
|
|
79
|
-
return join(skillsHome, CURSOR_SKILLS_NAMESPACE);
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
function legacyCursorSkillsDirs(skillsHome: string): string[] {
|
|
83
|
-
return LEGACY_CURSOR_SKILLS_NAMESPACES.map(name => join(skillsHome, name));
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
/** Absolute install path for one skill: `…/bdk/<leafDir>`. */
|
|
87
|
-
export function skillInstallPath(
|
|
88
|
-
skill: Pick<PackageSkill, "leafDir">,
|
|
89
|
-
skillsHome: string = cursorSkillsHome(),
|
|
90
|
-
): string {
|
|
91
|
-
return join(bdkCursorSkillsDir(skillsHome), skill.leafDir);
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* Skills shipped next to the running package. Uses the frontmatter `name`
|
|
96
|
-
* when present, otherwise `bdk-<dir>`.
|
|
97
|
-
*/
|
|
98
|
-
export async function listShippedPackageSkills(
|
|
99
|
-
packageRoot: string = packageRootDir(),
|
|
100
|
-
): Promise<PackageSkill[]> {
|
|
101
|
-
const skillsRoot = join(packageRoot, "skills");
|
|
102
|
-
let entries: Array<{ name: string; isDirectory: () => boolean }>;
|
|
103
|
-
try {
|
|
104
|
-
entries = await readdir(skillsRoot, { withFileTypes: true });
|
|
105
|
-
} catch {
|
|
106
|
-
return [];
|
|
107
|
-
}
|
|
108
|
-
const packageVersion = await readPackageVersion(packageRoot);
|
|
109
|
-
|
|
110
|
-
const skills: PackageSkill[] = [];
|
|
111
|
-
for (const entry of entries) {
|
|
112
|
-
if (!entry.isDirectory()) {
|
|
113
|
-
continue;
|
|
114
|
-
}
|
|
115
|
-
const sourceDir = join(skillsRoot, entry.name);
|
|
116
|
-
const skillMd = join(sourceDir, "SKILL.md");
|
|
117
|
-
try {
|
|
118
|
-
await access(skillMd);
|
|
119
|
-
} catch {
|
|
120
|
-
continue;
|
|
121
|
-
}
|
|
122
|
-
const raw = await readFile(skillMd, "utf8");
|
|
123
|
-
const name = parseFrontmatter(raw).data.name || `${CURSOR_SKILLS_NAMESPACE}-${entry.name}`;
|
|
124
|
-
skills.push({ name, leafDir: entry.name, sourceDir, packageVersion });
|
|
125
|
-
}
|
|
126
|
-
skills.sort((a, b) => a.leafDir.localeCompare(b.leafDir));
|
|
127
|
-
return skills;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
const PACKAGE_VERSION_PLACEHOLDER = "__CURSOR_JULY_VERSION__";
|
|
131
|
-
|
|
132
|
-
async function readPackageVersion(packageRoot: string): Promise<string> {
|
|
133
|
-
const raw = await readFile(join(packageRoot, "package.json"), "utf8");
|
|
134
|
-
const manifest = JSON.parse(raw) as { version?: unknown };
|
|
135
|
-
if (typeof manifest.version !== "string" || manifest.version.trim() === "") {
|
|
136
|
-
throw new Error("The @cursor/bdk package must declare a version.");
|
|
137
|
-
}
|
|
138
|
-
return manifest.version;
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
/**
|
|
142
|
-
* Skills that do not yet have a SKILL.md under ~/.cursor/skills/bdk/.
|
|
143
|
-
* Install still overwrites every shipped skill when the user confirms — this
|
|
144
|
-
* helper is for messaging (fresh install vs update).
|
|
145
|
-
*/
|
|
146
|
-
export async function findMissingCursorSkills(options?: {
|
|
147
|
-
packageRoot?: string;
|
|
148
|
-
skillsHome?: string;
|
|
149
|
-
}): Promise<PackageSkill[]> {
|
|
150
|
-
const shipped = await listShippedPackageSkills(options?.packageRoot);
|
|
151
|
-
const home = options?.skillsHome ?? cursorSkillsHome();
|
|
152
|
-
const missing: PackageSkill[] = [];
|
|
153
|
-
for (const skill of shipped) {
|
|
154
|
-
try {
|
|
155
|
-
await access(join(skillInstallPath(skill, home), "SKILL.md"));
|
|
156
|
-
} catch {
|
|
157
|
-
missing.push(skill);
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
return missing;
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
export interface SkillInstallResult {
|
|
164
|
-
/** Leaf dirs written. */
|
|
165
|
-
installed: string[];
|
|
166
|
-
/** Leaf dirs deleted because the package no longer ships them. */
|
|
167
|
-
removed: string[];
|
|
168
|
-
/** Leftover namespace dirs deleted (`…/agentsdk`, `…/agentkit`). */
|
|
169
|
-
removedLegacyDirs: string[];
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
/**
|
|
173
|
-
* Copy each skill directory into `skillsHome/bdk/<leafDir>/`.
|
|
174
|
-
* Always overwrites so a package upgrade refreshes local Cursor skills.
|
|
175
|
-
* Strips monorepo-only frontmatter, sets `alwaysApply: true` so Cursor
|
|
176
|
-
* loads the body into context, and removes leaf dirs no longer shipped.
|
|
177
|
-
* Also deletes leftover `skillsHome/agentsdk/` and `skillsHome/agentkit/`.
|
|
178
|
-
*/
|
|
179
|
-
export async function installCursorSkills(
|
|
180
|
-
skills: readonly PackageSkill[],
|
|
181
|
-
skillsHome: string = cursorSkillsHome(),
|
|
182
|
-
): Promise<SkillInstallResult> {
|
|
183
|
-
const namespaceDir = bdkCursorSkillsDir(skillsHome);
|
|
184
|
-
await mkdir(namespaceDir, { recursive: true });
|
|
185
|
-
|
|
186
|
-
const removed = await orphanLeaves(namespaceDir, skills);
|
|
187
|
-
for (const leaf of removed) {
|
|
188
|
-
await rm(join(namespaceDir, leaf), { recursive: true, force: true });
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
const installed: string[] = [];
|
|
192
|
-
for (const skill of skills) {
|
|
193
|
-
const target = skillInstallPath(skill, skillsHome);
|
|
194
|
-
await cp(skill.sourceDir, target, { recursive: true, force: true });
|
|
195
|
-
// cp() preserves source modes, and installs can come from read-only
|
|
196
|
-
// stores (Bazel runfiles, pnpm's content-addressed store, nix). Make the
|
|
197
|
-
// copies writable so the SKILL.md rewrite below and the overwrite on the
|
|
198
|
-
// next upgrade both work.
|
|
199
|
-
await makeTreeWritable(target);
|
|
200
|
-
const skillMdPath = join(target, "SKILL.md");
|
|
201
|
-
const raw = await readFile(skillMdPath, "utf8");
|
|
202
|
-
const adjusted = prepareSkillMarkdownForCursorInstall(raw, skill.packageVersion);
|
|
203
|
-
if (adjusted !== raw) {
|
|
204
|
-
await writeFile(skillMdPath, adjusted, "utf8");
|
|
205
|
-
}
|
|
206
|
-
installed.push(skill.leafDir);
|
|
207
|
-
}
|
|
208
|
-
const removedLegacyDirs = await removeLegacyCursorSkillsNamespaces(skillsHome);
|
|
209
|
-
return { installed, removed, removedLegacyDirs };
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
async function makeTreeWritable(root: string): Promise<void> {
|
|
213
|
-
await addOwnerWrite(root);
|
|
214
|
-
const entries = await readdir(root, { withFileTypes: true });
|
|
215
|
-
for (const entry of entries) {
|
|
216
|
-
const child = join(root, entry.name);
|
|
217
|
-
if (entry.isDirectory()) {
|
|
218
|
-
await makeTreeWritable(child);
|
|
219
|
-
} else {
|
|
220
|
-
await addOwnerWrite(child);
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
/** Add owner-write, preserving every other mode bit (e.g. exec on scripts). */
|
|
226
|
-
async function addOwnerWrite(path: string): Promise<void> {
|
|
227
|
-
const mode = (await stat(path)).mode & 0o7777;
|
|
228
|
-
if ((mode & 0o200) === 0) {
|
|
229
|
-
await chmod(path, mode | 0o200);
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
/** Installed leaf dirs the package no longer ships. Installing deletes these. */
|
|
234
|
-
async function orphanLeaves(
|
|
235
|
-
namespaceDir: string,
|
|
236
|
-
skills: readonly PackageSkill[],
|
|
237
|
-
): Promise<string[]> {
|
|
238
|
-
const shipped = new Set(skills.map(skill => skill.leafDir));
|
|
239
|
-
let entries: Array<{ name: string; isDirectory: () => boolean }>;
|
|
240
|
-
try {
|
|
241
|
-
entries = await readdir(namespaceDir, { withFileTypes: true });
|
|
242
|
-
} catch {
|
|
243
|
-
return [];
|
|
244
|
-
}
|
|
245
|
-
return entries
|
|
246
|
-
.filter(entry => entry.isDirectory() && !shipped.has(entry.name))
|
|
247
|
-
.map(entry => entry.name);
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
/** Drop leftover earlier install folders so stale skill ids are not discovered. */
|
|
251
|
-
async function removeLegacyCursorSkillsNamespaces(skillsHome: string): Promise<string[]> {
|
|
252
|
-
const present = await existingLegacyCursorSkillsDirs(skillsHome);
|
|
253
|
-
for (const dir of present) {
|
|
254
|
-
await rm(dir, { recursive: true, force: true });
|
|
255
|
-
}
|
|
256
|
-
return present;
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
async function existingLegacyCursorSkillsDirs(skillsHome: string): Promise<string[]> {
|
|
260
|
-
const present: string[] = [];
|
|
261
|
-
for (const dir of legacyCursorSkillsDirs(skillsHome)) {
|
|
262
|
-
try {
|
|
263
|
-
await stat(dir);
|
|
264
|
-
present.push(dir);
|
|
265
|
-
} catch {
|
|
266
|
-
continue;
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
return present;
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
/**
|
|
273
|
-
* Drop monorepo `paths` globs, set `alwaysApply: true` so Cursor injects the
|
|
274
|
-
* body as a global rule, bind package commands to the installing version, and
|
|
275
|
-
* fix package doc links for ~/.cursor installs.
|
|
276
|
-
*/
|
|
277
|
-
export function prepareSkillMarkdownForCursorInstall(
|
|
278
|
-
content: string,
|
|
279
|
-
packageVersion?: string,
|
|
280
|
-
): string {
|
|
281
|
-
const match = /^---\r?\n([\s\S]*?)\r?\n---/.exec(content);
|
|
282
|
-
if (match === null) {
|
|
283
|
-
return content;
|
|
284
|
-
}
|
|
285
|
-
const frontmatter = withAlwaysApply(stripPathsFromFrontmatter(match[1] ?? ""));
|
|
286
|
-
const body = content.slice(match[0].length);
|
|
287
|
-
const adjustedBody = body.replace(
|
|
288
|
-
/\[`docs\/([^`]+)`\]\(\.\.\/\.\.\/docs\/[^)]+\)/g,
|
|
289
|
-
"docs/$1 in the @cursor/bdk package",
|
|
290
|
-
);
|
|
291
|
-
if (
|
|
292
|
-
adjustedBody.includes(PACKAGE_VERSION_PLACEHOLDER) &&
|
|
293
|
-
(packageVersion === undefined || packageVersion.trim() === "")
|
|
294
|
-
) {
|
|
295
|
-
throw new Error("Cannot install a BDK skill without a package version.");
|
|
296
|
-
}
|
|
297
|
-
const versionBoundBody =
|
|
298
|
-
packageVersion === undefined
|
|
299
|
-
? adjustedBody
|
|
300
|
-
: adjustedBody.replaceAll(PACKAGE_VERSION_PLACEHOLDER, packageVersion);
|
|
301
|
-
return `---\n${frontmatter.trimEnd()}\n---${versionBoundBody}`;
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
function stripPathsFromFrontmatter(frontmatter: string): string {
|
|
305
|
-
const lines = frontmatter.split(/\r?\n/);
|
|
306
|
-
const out: string[] = [];
|
|
307
|
-
for (let i = 0; i < lines.length; i++) {
|
|
308
|
-
const line = lines[i] ?? "";
|
|
309
|
-
if (line.trimStart().startsWith("paths:")) {
|
|
310
|
-
i++;
|
|
311
|
-
while (i < lines.length && /^[ \t]*-/.test(lines[i] ?? "")) {
|
|
312
|
-
i++;
|
|
313
|
-
}
|
|
314
|
-
i--;
|
|
315
|
-
continue;
|
|
316
|
-
}
|
|
317
|
-
out.push(line);
|
|
318
|
-
}
|
|
319
|
-
return out.join("\n");
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
/** Cursor loads `alwaysApply: true` skills as global rules, not catalog rows. */
|
|
323
|
-
function withAlwaysApply(frontmatter: string): string {
|
|
324
|
-
const without = frontmatter
|
|
325
|
-
.split(/\r?\n/)
|
|
326
|
-
.filter(line => !/^\s*alwaysApply\s*:/.test(line))
|
|
327
|
-
.join("\n")
|
|
328
|
-
.replace(/\n+$/, "");
|
|
329
|
-
if (without === "") {
|
|
330
|
-
return "alwaysApply: true";
|
|
331
|
-
}
|
|
332
|
-
return `${without}\nalwaysApply: true`;
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
export interface SkillInstallPlan {
|
|
336
|
-
shipped: PackageSkill[];
|
|
337
|
-
/** Resolved `~/.cursor/skills`, to install into. */
|
|
338
|
-
skillsHome: string;
|
|
339
|
-
/** Install target: `<skillsHome>/bdk`. */
|
|
340
|
-
directory: string;
|
|
341
|
-
/** Leaf dirs the package ships. */
|
|
342
|
-
leaves: string[];
|
|
343
|
-
/** Nothing installed yet, so this is a fresh install rather than a refresh. */
|
|
344
|
-
firstInstall: boolean;
|
|
345
|
-
/** Installed leaf dirs the package dropped; installing deletes them. */
|
|
346
|
-
orphans: string[];
|
|
347
|
-
/** Leftover namespace dirs that still exist. Installing deletes them. */
|
|
348
|
-
legacyDirs: string[];
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
/** What an install would do, for the offer and for `install-skills`. */
|
|
352
|
-
export async function planSkillInstall(options?: {
|
|
353
|
-
packageRoot?: string;
|
|
354
|
-
skillsHome?: string;
|
|
355
|
-
}): Promise<SkillInstallPlan> {
|
|
356
|
-
const skillsHome = options?.skillsHome ?? cursorSkillsHome();
|
|
357
|
-
const directory = bdkCursorSkillsDir(skillsHome);
|
|
358
|
-
const shipped = await listShippedPackageSkills(options?.packageRoot);
|
|
359
|
-
const present = await Promise.all(
|
|
360
|
-
shipped.map(async skill => {
|
|
361
|
-
try {
|
|
362
|
-
await access(join(skillInstallPath(skill, skillsHome), "SKILL.md"));
|
|
363
|
-
return true;
|
|
364
|
-
} catch {
|
|
365
|
-
return false;
|
|
366
|
-
}
|
|
367
|
-
}),
|
|
368
|
-
);
|
|
369
|
-
return {
|
|
370
|
-
shipped,
|
|
371
|
-
skillsHome,
|
|
372
|
-
directory,
|
|
373
|
-
leaves: shipped.map(skill => skill.leafDir),
|
|
374
|
-
firstInstall: present.every(isPresent => !isPresent),
|
|
375
|
-
orphans: await orphanLeaves(directory, shipped),
|
|
376
|
-
legacyDirs: await existingLegacyCursorSkillsDirs(skillsHome),
|
|
377
|
-
};
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
/** `Installed 9 BDK skills`, what it dropped, and where it went. */
|
|
381
|
-
export function formatSkillInstall(plan: SkillInstallPlan, result: SkillInstallResult): string {
|
|
382
|
-
const noun = result.installed.length === 1 ? "skill" : "skills";
|
|
383
|
-
const verb = plan.firstInstall ? "Installed" : "Updated";
|
|
384
|
-
const lines = [`${verb} ${result.installed.length} BDK ${noun}`];
|
|
385
|
-
if (result.removed.length > 0) {
|
|
386
|
-
lines.push(` removed: ${result.removed.join(", ")}`);
|
|
387
|
-
}
|
|
388
|
-
for (const dir of result.removedLegacyDirs) {
|
|
389
|
-
lines.push(` removed: ${dir}`);
|
|
390
|
-
}
|
|
391
|
-
lines.push(` location: ${plan.directory}`);
|
|
392
|
-
return `${lines.join("\n")}\n`;
|
|
393
|
-
}
|
|
394
|
-
|
|
395
|
-
export type PackageInstallSkillSyncResult =
|
|
396
|
-
| { status: "installed"; installed: string[]; removed: string[] }
|
|
397
|
-
| {
|
|
398
|
-
status: "skipped";
|
|
399
|
-
reason: "opt-out" | "not-consumer" | "no-skills" | "error";
|
|
400
|
-
};
|
|
401
|
-
|
|
402
|
-
export interface SyncCursorSkillsOnPackageInstallOptions {
|
|
403
|
-
packageRoot?: string;
|
|
404
|
-
skillsHome?: string;
|
|
405
|
-
env?: NodeJS.ProcessEnv;
|
|
406
|
-
/** Override the node_modules consumer check. */
|
|
407
|
-
consumer?: boolean;
|
|
408
|
-
out?: (text: string) => void;
|
|
409
|
-
}
|
|
410
|
-
|
|
411
|
-
/**
|
|
412
|
-
* Copy shipped coding-agent skills into ~/.cursor/skills/bdk during a
|
|
413
|
-
* consumer `npm install` / `npx`. Never throws: a failed copy must not fail
|
|
414
|
-
* the package install. No-op in the monorepo source tree and when
|
|
415
|
-
* `CURSOR_JULY_SKIP_SKILL_INSTALL=1`.
|
|
416
|
-
*/
|
|
417
|
-
export async function syncCursorSkillsOnPackageInstall(
|
|
418
|
-
options: SyncCursorSkillsOnPackageInstallOptions = {},
|
|
419
|
-
): Promise<PackageInstallSkillSyncResult> {
|
|
420
|
-
try {
|
|
421
|
-
const env = options.env ?? process.env;
|
|
422
|
-
if (env[CURSOR_JULY_SKIP_SKILL_INSTALL_ENV] === "1") {
|
|
423
|
-
return { status: "skipped", reason: "opt-out" };
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
const packageRoot = options.packageRoot ?? packageRootDir();
|
|
427
|
-
const consumer = options.consumer ?? isConsumerPackageInstall(packageRoot);
|
|
428
|
-
if (!consumer) {
|
|
429
|
-
return { status: "skipped", reason: "not-consumer" };
|
|
430
|
-
}
|
|
431
|
-
|
|
432
|
-
const plan = await planSkillInstall({
|
|
433
|
-
packageRoot,
|
|
434
|
-
skillsHome: options.skillsHome,
|
|
435
|
-
});
|
|
436
|
-
if (plan.shipped.length === 0) {
|
|
437
|
-
return { status: "skipped", reason: "no-skills" };
|
|
438
|
-
}
|
|
439
|
-
|
|
440
|
-
const result = await installCursorSkills(plan.shipped, plan.skillsHome);
|
|
441
|
-
const out = options.out ?? (text => process.stderr.write(text));
|
|
442
|
-
out(formatSkillInstall(plan, result));
|
|
443
|
-
return {
|
|
444
|
-
status: "installed",
|
|
445
|
-
installed: result.installed,
|
|
446
|
-
removed: result.removed,
|
|
447
|
-
};
|
|
448
|
-
} catch {
|
|
449
|
-
return { status: "skipped", reason: "error" };
|
|
450
|
-
}
|
|
451
|
-
}
|
|
452
|
-
|
|
453
|
-
export interface OfferInstallCursorSkillsOptions {
|
|
454
|
-
/** Skip when false (non-TTY / `--json`). */
|
|
455
|
-
interactive?: boolean;
|
|
456
|
-
packageRoot?: string;
|
|
457
|
-
skillsHome?: string;
|
|
458
|
-
/** Injected yes/no for tests. `undefined` means the prompt went unanswered. */
|
|
459
|
-
confirm?: (question: string) => Promise<boolean | undefined>;
|
|
460
|
-
out?: (text: string) => void;
|
|
461
|
-
}
|
|
462
|
-
|
|
463
|
-
/**
|
|
464
|
-
* On a TTY, offer to install/update every shipped package skill into
|
|
465
|
-
* ~/.cursor/skills/bdk (always overwriting). No-op when non-interactive
|
|
466
|
-
* or the package ships no skills. An unanswered prompt skips the install
|
|
467
|
-
* rather than blocking the caller — see `SKILL_PROMPT_TIMEOUT_MS`.
|
|
468
|
-
*/
|
|
469
|
-
export async function offerInstallCursorSkills(
|
|
470
|
-
options: OfferInstallCursorSkillsOptions = {},
|
|
471
|
-
): Promise<{ installed: string[]; skipped: boolean }> {
|
|
472
|
-
const out = options.out ?? (text => process.stdout.write(text));
|
|
473
|
-
const interactive =
|
|
474
|
-
options.interactive ?? (process.stdin.isTTY === true && process.stdout.isTTY === true);
|
|
475
|
-
if (!interactive) {
|
|
476
|
-
return { installed: [], skipped: true };
|
|
477
|
-
}
|
|
478
|
-
|
|
479
|
-
const plan = await planSkillInstall({
|
|
480
|
-
packageRoot: options.packageRoot,
|
|
481
|
-
skillsHome: options.skillsHome,
|
|
482
|
-
});
|
|
483
|
-
if (plan.shipped.length === 0) {
|
|
484
|
-
return { installed: [], skipped: true };
|
|
485
|
-
}
|
|
486
|
-
|
|
487
|
-
const noun = plan.shipped.length === 1 ? "skill" : "skills";
|
|
488
|
-
const verb = plan.firstInstall ? "Install" : "Update";
|
|
489
|
-
const c = stdoutPalette();
|
|
490
|
-
out(`${verb} ${plan.shipped.length} BDK ${noun} in ${plan.directory}?\n`);
|
|
491
|
-
out(c.dim(` ${plan.leaves.join(", ")}\n`));
|
|
492
|
-
if (!plan.firstInstall) {
|
|
493
|
-
out(c.dim(" (overwrites existing copies with the package version)\n"));
|
|
494
|
-
}
|
|
495
|
-
if (plan.orphans.length > 0) {
|
|
496
|
-
out(c.dim(` (deletes ${plan.orphans.join(", ")})\n`));
|
|
497
|
-
}
|
|
498
|
-
for (const dir of plan.legacyDirs) {
|
|
499
|
-
out(c.dim(` (deletes leftover ${dir})\n`));
|
|
500
|
-
}
|
|
501
|
-
|
|
502
|
-
const confirm =
|
|
503
|
-
options.confirm ??
|
|
504
|
-
(q =>
|
|
505
|
-
promptYesNo(q, {
|
|
506
|
-
defaultYes: true,
|
|
507
|
-
out,
|
|
508
|
-
timeoutMs: SKILL_PROMPT_TIMEOUT_MS,
|
|
509
|
-
}));
|
|
510
|
-
const accepted = await confirm(`${verb} now?`);
|
|
511
|
-
|
|
512
|
-
if (accepted !== true) {
|
|
513
|
-
// `undefined` is the prompt timing out or stdin closing; both mean nobody
|
|
514
|
-
// said yes, so do not claim a duration neither case is guaranteed to have.
|
|
515
|
-
const why =
|
|
516
|
-
accepted === undefined ? "No answer — skipped the skill install." : "Skipped skill install.";
|
|
517
|
-
out(c.dim(`${why}\nInstall later: ${CLI_COMMAND_NAME} install-skills (${plan.directory})\n\n`));
|
|
518
|
-
return { installed: [], skipped: true };
|
|
519
|
-
}
|
|
520
|
-
|
|
521
|
-
const result = await installCursorSkills(plan.shipped, plan.skillsHome);
|
|
522
|
-
out(`${formatSkillInstall(plan, result)}\n`);
|
|
523
|
-
return { installed: result.installed, skipped: false };
|
|
524
|
-
}
|
|
525
|
-
|
|
526
|
-
export interface PromptYesNoOptions {
|
|
527
|
-
defaultYes: boolean;
|
|
528
|
-
out: (text: string) => void;
|
|
529
|
-
/** Give up after this long; `0` (or omitted) waits forever. */
|
|
530
|
-
timeoutMs?: number;
|
|
531
|
-
/** Answer source; defaults to `process.stdin`. */
|
|
532
|
-
input?: NodeJS.ReadableStream;
|
|
533
|
-
}
|
|
534
|
-
|
|
535
|
-
/**
|
|
536
|
-
* Ask a yes/no question. Resolves `undefined` when the answer never comes —
|
|
537
|
-
* the prompt timed out, or stdin closed on an empty line.
|
|
538
|
-
*/
|
|
539
|
-
export async function promptYesNo(
|
|
540
|
-
question: string,
|
|
541
|
-
options: PromptYesNoOptions,
|
|
542
|
-
): Promise<boolean | undefined> {
|
|
543
|
-
const hint = options.defaultYes ? "Y/n" : "y/N";
|
|
544
|
-
const input = options.input ?? process.stdin;
|
|
545
|
-
options.out(`${question} [${hint}] `);
|
|
546
|
-
input.resume();
|
|
547
|
-
const line = await readOneLine(input, options.timeoutMs);
|
|
548
|
-
input.pause();
|
|
549
|
-
if (line === undefined) {
|
|
550
|
-
options.out("\n");
|
|
551
|
-
return undefined;
|
|
552
|
-
}
|
|
553
|
-
if (line.trim() === "") {
|
|
554
|
-
return options.defaultYes;
|
|
555
|
-
}
|
|
556
|
-
const answer = line.trim().toLowerCase();
|
|
557
|
-
if (answer === "y" || answer === "yes") {
|
|
558
|
-
return true;
|
|
559
|
-
}
|
|
560
|
-
if (answer === "n" || answer === "no") {
|
|
561
|
-
return false;
|
|
562
|
-
}
|
|
563
|
-
return options.defaultYes;
|
|
564
|
-
}
|
|
565
|
-
|
|
566
|
-
/** The line, or `undefined` when the stream ends or the clock runs out first. */
|
|
567
|
-
function readOneLine(
|
|
568
|
-
stream: NodeJS.ReadableStream,
|
|
569
|
-
timeoutMs?: number,
|
|
570
|
-
): Promise<string | undefined> {
|
|
571
|
-
return new Promise(resolve => {
|
|
572
|
-
let buffer = "";
|
|
573
|
-
let timer: NodeJS.Timeout | undefined;
|
|
574
|
-
const onData = (chunk: string | Buffer): void => {
|
|
575
|
-
buffer += typeof chunk === "string" ? chunk : chunk.toString("utf8");
|
|
576
|
-
const newline = buffer.indexOf("\n");
|
|
577
|
-
if (newline === -1) {
|
|
578
|
-
return;
|
|
579
|
-
}
|
|
580
|
-
cleanup();
|
|
581
|
-
resolve(buffer.slice(0, newline).replace(/\r$/, ""));
|
|
582
|
-
};
|
|
583
|
-
// EOF and the timeout both land here. A tty holds a half-typed line until
|
|
584
|
-
// Enter, so a non-empty buffer only ever happens on piped input.
|
|
585
|
-
const giveUp = (): void => {
|
|
586
|
-
cleanup();
|
|
587
|
-
resolve(buffer === "" ? undefined : buffer.replace(/\r$/, ""));
|
|
588
|
-
};
|
|
589
|
-
const cleanup = (): void => {
|
|
590
|
-
if (timer !== undefined) {
|
|
591
|
-
clearTimeout(timer);
|
|
592
|
-
}
|
|
593
|
-
stream.off("data", onData);
|
|
594
|
-
stream.off("end", giveUp);
|
|
595
|
-
};
|
|
596
|
-
stream.on("data", onData);
|
|
597
|
-
stream.on("end", giveUp);
|
|
598
|
-
if (timeoutMs !== undefined && timeoutMs > 0) {
|
|
599
|
-
timer = setTimeout(giveUp, timeoutMs);
|
|
600
|
-
// Never keep the process alive purely to wait for an answer.
|
|
601
|
-
timer.unref();
|
|
602
|
-
}
|
|
603
|
-
});
|
|
604
|
-
}
|
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
import { zodToJsonSchema } from "zod-to-json-schema";
|
|
3
|
-
import type { JsonSchemaObject } from "../types.js";
|
|
4
|
-
|
|
5
|
-
const ANY_OBJECT_SCHEMA: JsonSchemaObject = {
|
|
6
|
-
type: "object",
|
|
7
|
-
properties: {},
|
|
8
|
-
additionalProperties: true,
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
export function isZodSchema(value: unknown): value is z.ZodTypeAny {
|
|
12
|
-
if (value instanceof z.ZodType) {
|
|
13
|
-
return true;
|
|
14
|
-
}
|
|
15
|
-
// Structural check for zod instances that come from a different module
|
|
16
|
-
// copy in the authoring project's node_modules. Zod 4 keeps `_zod`
|
|
17
|
-
// (and often `_def`).
|
|
18
|
-
return (
|
|
19
|
-
typeof value === "object" &&
|
|
20
|
-
value !== null &&
|
|
21
|
-
typeof (value as { safeParse?: unknown }).safeParse === "function" &&
|
|
22
|
-
("_def" in value || "_zod" in value)
|
|
23
|
-
);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/** Convert an authored input schema into the JSON Schema shown to the model. */
|
|
27
|
-
export function toolInputJsonSchema(
|
|
28
|
-
inputSchema: z.ZodTypeAny | JsonSchemaObject | undefined,
|
|
29
|
-
): JsonSchemaObject {
|
|
30
|
-
if (inputSchema === undefined) {
|
|
31
|
-
return ANY_OBJECT_SCHEMA;
|
|
32
|
-
}
|
|
33
|
-
return authoredSchemaToJsonSchema(inputSchema);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Convert an authored output schema into the JSON Schema advertised on the
|
|
38
|
-
* tool. Unlike {@link toolInputJsonSchema} there is no fallback: an
|
|
39
|
-
* undeclared output schema stays undeclared (the MCP field is optional), and
|
|
40
|
-
* outputs are never validated against it.
|
|
41
|
-
*/
|
|
42
|
-
export function toolOutputJsonSchema(
|
|
43
|
-
outputSchema: z.ZodTypeAny | JsonSchemaObject | undefined,
|
|
44
|
-
): JsonSchemaObject | undefined {
|
|
45
|
-
if (outputSchema === undefined) {
|
|
46
|
-
return undefined;
|
|
47
|
-
}
|
|
48
|
-
return authoredSchemaToJsonSchema(outputSchema);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
function authoredSchemaToJsonSchema(schema: z.ZodTypeAny | JsonSchemaObject): JsonSchemaObject {
|
|
52
|
-
if (!isZodSchema(schema)) {
|
|
53
|
-
return schema;
|
|
54
|
-
}
|
|
55
|
-
const converted = convertZodSchema(schema);
|
|
56
|
-
delete converted.$schema;
|
|
57
|
-
return converted;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
function convertZodSchema(schema: z.ZodTypeAny): Record<string, unknown> {
|
|
61
|
-
const native = (schema as { toJSONSchema?: () => unknown }).toJSONSchema;
|
|
62
|
-
if (typeof native === "function") {
|
|
63
|
-
return native.call(schema) as Record<string, unknown>;
|
|
64
|
-
}
|
|
65
|
-
return zodToJsonSchema(schema, {
|
|
66
|
-
$refStrategy: "none",
|
|
67
|
-
target: "jsonSchema7",
|
|
68
|
-
}) as Record<string, unknown>;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
export type ToolInputValidation = { ok: true; value: unknown } | { ok: false; message: string };
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* Validate tool-call args before `execute` runs. Zod schemas validate (and
|
|
75
|
-
* transform); plain JSON schemas pass through unvalidated.
|
|
76
|
-
*/
|
|
77
|
-
export function validateToolInput(
|
|
78
|
-
inputSchema: z.ZodTypeAny | JsonSchemaObject | undefined,
|
|
79
|
-
args: unknown,
|
|
80
|
-
): ToolInputValidation {
|
|
81
|
-
if (inputSchema === undefined || !isZodSchema(inputSchema)) {
|
|
82
|
-
return { ok: true, value: args };
|
|
83
|
-
}
|
|
84
|
-
const parsed = (inputSchema as z.ZodTypeAny).safeParse(args);
|
|
85
|
-
if (parsed.success) {
|
|
86
|
-
return { ok: true, value: parsed.data };
|
|
87
|
-
}
|
|
88
|
-
const issues = parsed.error.issues
|
|
89
|
-
.map(issue => {
|
|
90
|
-
const path = issue.path.join(".");
|
|
91
|
-
return path === "" ? issue.message : `${path}: ${issue.message}`;
|
|
92
|
-
})
|
|
93
|
-
.join("; ");
|
|
94
|
-
return { ok: false, message: issues || "invalid input" };
|
|
95
|
-
}
|