@cursor/bdk 0.2.9 → 0.2.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/artifacts.js +3 -5
- package/dist/bin/agent-serve.js +803 -812
- package/dist/channels/bitbucket/api.js +305 -321
- package/dist/channels/bitbucket/binding.js +97 -61
- package/dist/channels/bitbucket/bitbucket-channel.d.ts +15 -1
- package/dist/channels/bitbucket/bitbucket-channel.d.ts.map +1 -1
- package/dist/channels/bitbucket/bitbucket-channel.js +95 -42
- package/dist/channels/bitbucket/bitbucket-webhook.d.ts +11 -0
- package/dist/channels/bitbucket/bitbucket-webhook.d.ts.map +1 -1
- package/dist/channels/bitbucket/bitbucket-webhook.js +214 -204
- package/dist/channels/bitbucket/checks.js +9 -21
- package/dist/channels/bitbucket/cursor-account.js +1 -1
- package/dist/channels/bitbucket/defaults.js +14 -4
- package/dist/channels/bitbucket/events.js +1 -2
- package/dist/channels/bitbucket/index.d.ts +6 -2
- package/dist/channels/bitbucket/index.d.ts.map +1 -1
- package/dist/channels/bitbucket/index.js +6 -2
- package/dist/channels/bitbucket/replay.js +80 -56
- package/dist/channels/bitbucket/state.js +16 -7
- package/dist/channels/bitbucket/types.d.ts +11 -2
- package/dist/channels/bitbucket/types.d.ts.map +1 -1
- package/dist/channels/checks.js +18 -28
- package/dist/channels/deployments/deployments-channel.js +26 -34
- package/dist/channels/github/api.js +216 -210
- package/dist/channels/github/auth.d.ts +5 -1
- package/dist/channels/github/auth.d.ts.map +1 -1
- package/dist/channels/github/auth.js +157 -174
- package/dist/channels/github/binding.js +48 -39
- package/dist/channels/github/checks.js +9 -14
- package/dist/channels/github/cursor-account.js +6 -11
- package/dist/channels/github/defaults.js +105 -130
- package/dist/channels/github/forward.js +13 -17
- package/dist/channels/github/github-channel.d.ts +43 -2
- package/dist/channels/github/github-channel.d.ts.map +1 -1
- package/dist/channels/github/github-channel.js +1228 -958
- package/dist/channels/github/progress.js +145 -146
- package/dist/channels/github/replay.js +30 -39
- package/dist/channels/github/state.js +40 -16
- package/dist/channels/github/types.d.ts +30 -6
- package/dist/channels/github/types.d.ts.map +1 -1
- package/dist/channels/gitlab/api.js +100 -114
- package/dist/channels/gitlab/binding.js +52 -33
- package/dist/channels/gitlab/checks.js +28 -29
- package/dist/channels/gitlab/cursor-account.js +1 -1
- package/dist/channels/gitlab/defaults.js +9 -3
- package/dist/channels/gitlab/gitlab-channel.d.ts +16 -1
- package/dist/channels/gitlab/gitlab-channel.d.ts.map +1 -1
- package/dist/channels/gitlab/gitlab-channel.js +95 -42
- package/dist/channels/gitlab/gitlab-webhook.d.ts +10 -1
- package/dist/channels/gitlab/gitlab-webhook.d.ts.map +1 -1
- package/dist/channels/gitlab/gitlab-webhook.js +282 -249
- package/dist/channels/gitlab/index.d.ts +6 -2
- package/dist/channels/gitlab/index.d.ts.map +1 -1
- package/dist/channels/gitlab/index.js +6 -2
- package/dist/channels/gitlab/replay.js +50 -27
- package/dist/channels/gitlab/state.js +14 -6
- package/dist/channels/gitlab/types.d.ts +13 -2
- package/dist/channels/gitlab/types.d.ts.map +1 -1
- package/dist/channels/origin/api.js +100 -116
- package/dist/channels/origin/binding.js +15 -16
- package/dist/channels/origin/checks.js +30 -28
- package/dist/channels/origin/defaults.js +50 -65
- package/dist/channels/origin/origin-channel.js +266 -272
- package/dist/channels/origin/origin-webhook.js +70 -88
- package/dist/channels/origin/reactions.js +9 -21
- package/dist/channels/origin/state.js +13 -5
- package/dist/channels/slack/agentic-delivery.js +426 -478
- package/dist/channels/slack/agentic-posted.js +9 -10
- package/dist/channels/slack/agentic-signals.js +2 -3
- package/dist/channels/slack/api.js +417 -427
- package/dist/channels/slack/approvals.js +1 -1
- package/dist/channels/slack/assistant.js +37 -47
- package/dist/channels/slack/attachments.js +188 -206
- package/dist/channels/slack/auth.js +8 -6
- package/dist/channels/slack/bot-mentions.js +31 -45
- package/dist/channels/slack/channel-watch.js +42 -48
- package/dist/channels/slack/cli-project.js +112 -137
- package/dist/channels/slack/code-fences.js +3 -5
- package/dist/channels/slack/constants.js +2 -2
- package/dist/channels/slack/credentials.js +23 -38
- package/dist/channels/slack/defaults.js +292 -331
- package/dist/channels/slack/dispatch.d.ts.map +1 -1
- package/dist/channels/slack/dispatch.js +533 -460
- package/dist/channels/slack/doctor.js +200 -214
- package/dist/channels/slack/eval-directive.js +79 -96
- package/dist/channels/slack/event-id-dedupe.js +1 -1
- package/dist/channels/slack/external-policy.js +26 -39
- package/dist/channels/slack/footer.js +28 -41
- package/dist/channels/slack/inbound.d.ts +1 -0
- package/dist/channels/slack/inbound.d.ts.map +1 -1
- package/dist/channels/slack/inbound.js +50 -31
- package/dist/channels/slack/init.d.ts +1 -5
- package/dist/channels/slack/init.d.ts.map +1 -1
- package/dist/channels/slack/init.js +42 -59
- package/dist/channels/slack/interactive.d.ts +9 -3
- package/dist/channels/slack/interactive.d.ts.map +1 -1
- package/dist/channels/slack/interactive.js +160 -162
- package/dist/channels/slack/links.js +1 -2
- package/dist/channels/slack/live-delivery.js +172 -190
- package/dist/channels/slack/manifest.d.ts.map +1 -1
- package/dist/channels/slack/manifest.js +44 -23
- package/dist/channels/slack/message-body.js +2 -2
- package/dist/channels/slack/nudge-carrier.js +30 -42
- package/dist/channels/slack/nudge-store.js +164 -191
- package/dist/channels/slack/paint-start.js +66 -81
- package/dist/channels/slack/placeholder.js +123 -152
- package/dist/channels/slack/pr-ref.js +1 -1
- package/dist/channels/slack/progress-delivery.js +65 -78
- package/dist/channels/slack/reasoning-card.js +36 -49
- package/dist/channels/slack/recording-sink.js +12 -24
- package/dist/channels/slack/reply-options.js +7 -12
- package/dist/channels/slack/self-identity.js +27 -35
- package/dist/channels/slack/sender-name.d.ts +12 -3
- package/dist/channels/slack/sender-name.d.ts.map +1 -1
- package/dist/channels/slack/sender-name.js +57 -61
- package/dist/channels/slack/setup.js +2 -4
- package/dist/channels/slack/slack-channel.d.ts +6 -4
- package/dist/channels/slack/slack-channel.d.ts.map +1 -1
- package/dist/channels/slack/slack-channel.js +441 -308
- package/dist/channels/slack/socket-mode.js +38 -52
- package/dist/channels/slack/thread-context.js +143 -160
- package/dist/channels/slack/tool-approval-events.js +149 -166
- package/dist/channels/slack/tool-cards.js +6 -11
- package/dist/channels/slack/tool-chip.js +1 -2
- package/dist/channels/slack/types.d.ts +15 -17
- package/dist/channels/slack/types.d.ts.map +1 -1
- package/dist/channels/slack/upload.js +84 -97
- package/dist/channels/slack/user-info.js +27 -41
- package/dist/channels.js +9 -20
- package/dist/dashboard-session-url.js +3 -4
- package/dist/docs/404.html +2 -2
- package/dist/docs/assets/{app.BNhEdGa8.js → app.DXI7bwox.js} +4 -4
- package/dist/docs/assets/{building-with-agents.md.BPjPFxFg.js → building-with-agents.md.Df87rAe1.js} +1 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.CtLtpWcx.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.DIdUV1Ph.js → VPLocalSearchBox.BrbO5mEe.js} +1 -1
- package/dist/docs/assets/chunks/{arc.lELI4_SR.js → arc.BOG1yms8.js} +1 -1
- package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.iCMdvuoM.js → architectureDiagram-Q4EWVU46.C0hsMZnZ.js} +1 -1
- package/dist/docs/assets/chunks/{baseUniq.C1-nDJBf.js → baseUniq.H044KjKs.js} +1 -1
- package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.ClemzBox.js → blockDiagram-DXYQGD6D.BsRW6GoB.js} +1 -1
- package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.BqTak6cR.js → c4Diagram-AHTNJAMY.B9HV5PFR.js} +1 -1
- package/dist/docs/assets/chunks/channel.CBwrU9rP.js +1 -0
- package/dist/docs/assets/chunks/{chunk-4BX2VUAB.CUS3qs_R.js → chunk-4BX2VUAB.CPoT_ajl.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-4TB4RGXK.dz5fdHcl.js → chunk-4TB4RGXK.DZBwWuCL.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-55IACEB6.D6BEBmve.js → chunk-55IACEB6.CZ3yTiyq.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-EDXVE4YY.B5uK4ID9.js → chunk-EDXVE4YY.6DfvHSd8.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-FMBD7UC4.PgOJgNQs.js → chunk-FMBD7UC4.CpBj8HfK.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-OYMX7WX6.CvkTrCii.js → chunk-OYMX7WX6.BdKo8YqS.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-QZHKN3VN.BnSfKYsB.js → chunk-QZHKN3VN.BnXNyxJx.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-YZCP3GAM.MZH6v5UC.js → chunk-YZCP3GAM.Cg1OcF8G.js} +1 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.CbC_mrvB.js +1 -0
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.CbC_mrvB.js +1 -0
- package/dist/docs/assets/chunks/clone.BTvFyY1a.js +1 -0
- package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.BBbw_YZi.js → cose-bilkent-S5V4N54A.1SP8al9c.js} +1 -1
- package/dist/docs/assets/chunks/{dagre-KV5264BT.CNJB2l7E.js → dagre-KV5264BT.DS1L6hJt.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-5BDNPKRD.BQzlnFfq.js → diagram-5BDNPKRD.ChsausbG.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.DkgqqZMz.js → diagram-G4DWMVQ6.3XsptNWj.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-MMDJMWI5.DIT8L7H_.js → diagram-MMDJMWI5.DPA9Dk_P.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-TYMM5635.3xLPZWGJ.js → diagram-TYMM5635.BVswXWrB.js} +1 -1
- package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.5_IHz8jF.js → erDiagram-SMLLAGMA.BSak5OSP.js} +1 -1
- package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.BGUCXz8A.js → flowDiagram-DWJPFMVM.CQgN4TTz.js} +1 -1
- package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.DbfFavS1.js → ganttDiagram-T4ZO3ILL.GrT0kA4a.js} +1 -1
- package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.D2yKdeNW.js → gitGraphDiagram-UUTBAWPF.CdS7Ucll.js} +1 -1
- package/dist/docs/assets/chunks/{graph.CSCxwHba.js → graph.BVqKRmRo.js} +1 -1
- package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.FDeb6xHY.js → infoDiagram-42DDH7IO.C3C9FRto.js} +1 -1
- package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.DbeYs9VL.js → ishikawaDiagram-UXIWVN3A.2FuAh_Zj.js} +1 -1
- package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.CWjKINpx.js → journeyDiagram-VCZTEJTY.CaHMfK4b.js} +1 -1
- package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.B4FrAlwz.js → kanban-definition-6JOO6SKY.CjhIUwcA.js} +1 -1
- package/dist/docs/assets/chunks/{layout.DFGxQ9ab.js → layout.CGU3gfSf.js} +1 -1
- package/dist/docs/assets/chunks/{linear.BmjZ-G59.js → linear.DaihpW_n.js} +1 -1
- package/dist/docs/assets/chunks/{min.DZSxulMW.js → min.BS-j8kHQ.js} +1 -1
- package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.CHLi3-aN.js → mindmap-definition-QFDTVHPH.BVJ1Bbnk.js} +1 -1
- package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.DteG-CkU.js → pieDiagram-DEJITSTG.Cz1WIv9r.js} +1 -1
- package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.D458ipN3.js → quadrantDiagram-34T5L4WZ.DKLFxcjy.js} +1 -1
- package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.DcFgUxst.js → requirementDiagram-MS252O5E.BHegiK7x.js} +1 -1
- package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.BwQAMmSA.js → sankeyDiagram-XADWPNL6.DYkY6yPc.js} +1 -1
- package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.B_Xdsrh9.js → sequenceDiagram-FGHM5R23.DYQ1QUrI.js} +1 -1
- package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.CdfDW6-C.js → stateDiagram-FHFEXIEX.Iru8BsFo.js} +1 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.BYXl4LW6.js +1 -0
- package/dist/docs/assets/chunks/{theme.sfdL3srp.js → theme.DaplWQhQ.js} +2 -2
- package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.56-4hXaC.js → timeline-definition-GMOUNBTQ.BwFA8hiX.js} +1 -1
- package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.CvZSQBO7.js → vennDiagram-DHZGUBPP.CZ60W1C_.js} +1 -1
- package/dist/docs/assets/chunks/{wardley-RL74JXVD.C9qc8k39.js → wardley-RL74JXVD.iXazD3Z7.js} +1 -1
- package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.D9s0nihi.js → wardleyDiagram-NUSXRM2D.B69D2r8-.js} +1 -1
- package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.BVJSpYrC.js → xychartDiagram-5P7HB3ND.CLPZEIU9.js} +1 -1
- package/dist/docs/assets/{deployment.md.BdqTiGdc.js → deployment.md.BYuEcDBv.js} +2 -2
- package/dist/docs/assets/{guides_bitbucket.md.BB6fqD-M.js → guides_bitbucket.md.CKUayYtD.js} +3 -3
- package/dist/docs/assets/{guides_bitbucket.md.BB6fqD-M.lean.js → guides_bitbucket.md.CKUayYtD.lean.js} +1 -1
- package/dist/docs/assets/{guides_github.md.Cr1Xlf-m.js → guides_github.md.TuNiZAOQ.js} +4 -4
- package/dist/docs/assets/{guides_github.md.Cr1Xlf-m.lean.js → guides_github.md.TuNiZAOQ.lean.js} +1 -1
- package/dist/docs/assets/{guides_gitlab.md.CMpmFi4M.js → guides_gitlab.md.CtNI4fSH.js} +4 -4
- package/dist/docs/assets/{guides_gitlab.md.CMpmFi4M.lean.js → guides_gitlab.md.CtNI4fSH.lean.js} +1 -1
- package/dist/docs/assets/guides_migrate.md.sCAvvlC6.js +7 -0
- package/dist/docs/assets/guides_migrate.md.sCAvvlC6.lean.js +1 -0
- package/dist/docs/assets/{reference_cli.md.GwugN3n-.js → reference_cli.md.dYCAL2lB.js} +4 -3
- package/dist/docs/assets/reference_cli.md.dYCAL2lB.lean.js +1 -0
- package/dist/docs/assets/troubleshooting.md.x-GBa7wN.js +1 -0
- package/dist/docs/assets/{troubleshooting.md.Bscj6ODe.lean.js → troubleshooting.md.x-GBa7wN.lean.js} +1 -1
- package/dist/docs/building-with-agents.html +37 -37
- package/dist/docs/building-with-agents.md +2 -0
- package/dist/docs/deployment.html +38 -38
- package/dist/docs/deployment.md +7 -0
- package/dist/docs/evals.html +36 -36
- package/dist/docs/guides/agent-to-agent.html +35 -35
- package/dist/docs/guides/bitbucket.html +38 -38
- package/dist/docs/guides/bitbucket.md +9 -1
- package/dist/docs/guides/cloud-agents.html +35 -35
- package/dist/docs/guides/convert-automation.html +35 -35
- package/dist/docs/guides/github.html +39 -39
- package/dist/docs/guides/github.md +20 -4
- package/dist/docs/guides/gitlab.html +38 -38
- package/dist/docs/guides/gitlab.md +9 -1
- package/dist/docs/guides/grokbot-agents.html +35 -35
- package/dist/docs/guides/hooks.html +35 -35
- package/dist/docs/guides/improve.html +35 -35
- package/dist/docs/guides/jev.html +35 -35
- package/dist/docs/guides/mcp-oauth.html +35 -35
- package/dist/docs/guides/migrate.html +66 -0
- package/dist/docs/guides/migrate.md +122 -0
- package/dist/docs/guides/opentelemetry.html +35 -35
- package/dist/docs/guides/slack.html +35 -35
- package/dist/docs/guides/webhooks.html +35 -35
- package/dist/docs/hashmap.json +1 -1
- package/dist/docs/hillclimbing.html +35 -35
- package/dist/docs/index.html +35 -35
- package/dist/docs/llms-full.txt +214 -6
- package/dist/docs/llms.txt +1 -0
- package/dist/docs/quickstart.html +35 -35
- package/dist/docs/reference/agent-config.html +35 -35
- package/dist/docs/reference/artifacts.html +35 -35
- package/dist/docs/reference/channels.html +35 -35
- package/dist/docs/reference/cli.html +39 -38
- package/dist/docs/reference/cli.md +39 -0
- package/dist/docs/reference/connections.html +35 -35
- package/dist/docs/reference/evals.html +35 -35
- package/dist/docs/reference/extensions.html +35 -35
- package/dist/docs/reference/hooks.html +35 -35
- package/dist/docs/reference/http-api.html +35 -35
- package/dist/docs/reference/instructions.html +35 -35
- package/dist/docs/reference/playground.html +35 -35
- package/dist/docs/reference/project-layout.html +35 -35
- package/dist/docs/reference/prompt.html +35 -35
- package/dist/docs/reference/schedules.html +35 -35
- package/dist/docs/reference/sessions.html +35 -35
- package/dist/docs/reference/skills.html +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/grokbot-agents.html +35 -35
- package/dist/docs/templates/security-reviewer.html +35 -35
- package/dist/docs/templates/thermo-quality-review.html +35 -35
- package/dist/docs/templates/thermo-review.html +35 -35
- package/dist/docs/templates/triage.html +35 -35
- package/dist/docs/troubleshooting.html +36 -36
- package/dist/docs/troubleshooting.md +1 -0
- package/dist/evals/assertions.js +20 -34
- package/dist/evals/expect.js +3 -6
- package/dist/evals/judge.js +5 -8
- package/dist/evals/loaders.js +45 -62
- package/dist/evals/matchers.js +2 -3
- package/dist/evals/reporters.js +43 -67
- package/dist/evals/results.js +1 -1
- package/dist/evals/run-facts.js +5 -6
- package/dist/evals.js +27 -15
- package/dist/extensions/cursor-cloud-agents/extension.js +4 -1
- package/dist/extensions/cursor-cloud-agents/lib/backend.js +100 -126
- package/dist/extensions/cursor-cloud-agents/lib/fleet.js +22 -38
- package/dist/extensions/cursor-cloud-agents/lib/repos.js +8 -10
- package/dist/extensions/cursor-cloud-agents/lib/transcript.js +2 -3
- package/dist/extensions/cursor-cloud-agents/lib/watch.js +52 -66
- package/dist/extensions/cursor-cloud-agents/reminders/cloud-agent-stop-watch.js +29 -40
- package/dist/extensions/cursor-cloud-agents/tools/cancel.js +6 -17
- package/dist/extensions/cursor-cloud-agents/tools/dump.js +25 -36
- package/dist/extensions/cursor-cloud-agents/tools/get.js +3 -14
- package/dist/extensions/cursor-cloud-agents/tools/launch.js +13 -21
- package/dist/extensions/cursor-cloud-agents/tools/list.js +8 -19
- package/dist/extensions/cursor-cloud-agents/tools/reply.js +5 -16
- package/dist/extensions/cursor-grokbot-agents/extension.js +4 -1
- package/dist/extensions/cursor-grokbot-agents/lib/agents.js +3 -3
- package/dist/extensions/cursor-grokbot-agents/lib/backend.js +53 -73
- package/dist/extensions/cursor-grokbot-agents/lib/contacts.js +10 -23
- package/dist/extensions/cursor-grokbot-agents/lib/conversation.js +112 -132
- package/dist/extensions/cursor-grokbot-agents/lib/lock.js +1 -2
- package/dist/extensions/cursor-grokbot-agents/tools/ask.js +5 -16
- package/dist/extensions/cursor-grokbot-agents/tools/check.js +4 -15
- package/dist/extensions/cursor-grokbot-agents/tools/interrupt.js +2 -13
- package/dist/extensions/cursor-grokbot-agents/tools/list.js +11 -23
- package/dist/extensions/jev/extension.js +3 -3
- package/dist/extensions/jev/lib/evaluate.js +43 -60
- package/dist/extensions/jev/tools/evaluate.js +6 -17
- package/dist/extensions/slack-communication/tools/post-file.js +1 -1
- package/dist/extensions.js +3 -5
- package/dist/files-backends/cursor-hosted.js +504 -523
- package/dist/files-backends/local-fs.js +72 -134
- package/dist/files.js +3 -3
- package/dist/filesystem.js +562 -861
- package/dist/index.js +16 -35
- package/dist/internal/advertise-tools.js +74 -86
- package/dist/internal/artifacts-store.js +298 -361
- package/dist/internal/as-of.js +2 -4
- package/dist/internal/authored-alias-hooks.js +6 -4
- package/dist/internal/authored-loaders.js +37 -52
- package/dist/internal/bounded-int.js +1 -2
- package/dist/internal/bounded.js +13 -24
- package/dist/internal/brand.js +1 -1
- package/dist/internal/browser-origin-guard.js +4 -4
- package/dist/internal/builtin-tools/artifacts.js +15 -27
- package/dist/internal/builtin-tools/index.js +2 -3
- package/dist/internal/builtin-tools/reminders.js +33 -52
- package/dist/internal/channel-architecture.d.ts +21 -0
- package/dist/internal/channel-architecture.d.ts.map +1 -0
- package/dist/internal/channel-architecture.js +41 -0
- package/dist/internal/channel-dispatch.js +3 -4
- package/dist/internal/channel-route-dispatch.js +40 -51
- package/dist/internal/channel-state.js +1 -1
- package/dist/internal/chat-client.js +319 -340
- package/dist/internal/cli-ax.js +1262 -1294
- package/dist/internal/cli-bitbucket.js +244 -272
- package/dist/internal/cli-convert-automation.js +137 -151
- package/dist/internal/cli-cursor.js +126 -147
- package/dist/internal/cli-deploy.d.ts.map +1 -1
- package/dist/internal/cli-deploy.js +1457 -1507
- package/dist/internal/cli-docs.js +130 -147
- package/dist/internal/cli-github.js +437 -476
- package/dist/internal/cli-gitlab.js +259 -288
- package/dist/internal/cli-images.js +266 -334
- package/dist/internal/cli-manifest.js +25 -37
- package/dist/internal/cli-mcp-oauth.js +228 -247
- package/dist/internal/cli-mcp.js +358 -383
- package/dist/internal/cli-migrate.js +73 -90
- package/dist/internal/cli-skills.js +35 -47
- package/dist/internal/cli-slack-manual.d.ts +0 -1
- package/dist/internal/cli-slack-manual.d.ts.map +1 -1
- package/dist/internal/cli-slack-manual.js +175 -204
- package/dist/internal/cli-slack.d.ts +1 -1
- package/dist/internal/cli-slack.d.ts.map +1 -1
- package/dist/internal/cli-slack.js +416 -456
- package/dist/internal/cloud-merge.js +7 -3
- package/dist/internal/cloud-turn-cost.js +8 -1
- package/dist/internal/connection-env.js +5 -6
- package/dist/internal/continuation-channel.js +10 -7
- package/dist/internal/continuation-identity.js +85 -67
- package/dist/internal/conversation-mirror.js +112 -131
- package/dist/internal/convert-automation/convert-workflow.js +21 -31
- package/dist/internal/cron.js +3 -3
- package/dist/internal/cursor/account-mcp.js +147 -146
- package/dist/internal/cursor/backend-client.js +290 -320
- package/dist/internal/cursor/bound-secret-file.js +3 -3
- package/dist/internal/cursor/credentials.js +127 -142
- package/dist/internal/cursor/cursor-api-transport.js +4 -8
- package/dist/internal/cursor/github-credentials.js +91 -108
- package/dist/internal/cursor/hosted-bound-secrets.js +3 -4
- package/dist/internal/cursor/hosted-deployment-secrets.js +1 -1
- package/dist/internal/cursor/hosted-store-secrets.js +5 -9
- package/dist/internal/cursor/session-token.js +36 -48
- package/dist/internal/cursor/store-api-client.js +77 -92
- package/dist/internal/cursor-account-mcp-auth.js +132 -149
- package/dist/internal/cursor-agent-template.js +1 -1
- package/dist/internal/cursor-deployment-relay.js +33 -54
- package/dist/internal/cursor-event-relay.js +65 -59
- package/dist/internal/cursor-relay-core.js +258 -286
- package/dist/internal/deferred-channel-session.js +3 -12
- package/dist/internal/deploy-client.d.ts.map +1 -1
- package/dist/internal/deploy-client.js +413 -475
- package/dist/internal/deploy-manifest.d.ts +17 -0
- package/dist/internal/deploy-manifest.d.ts.map +1 -1
- package/dist/internal/deploy-manifest.js +71 -21
- package/dist/internal/deploy-source.js +31 -43
- package/dist/internal/discovery/agent-config.js +45 -59
- package/dist/internal/discovery/agent.js +276 -280
- package/dist/internal/discovery/channels.js +67 -80
- package/dist/internal/discovery/connections.js +286 -296
- package/dist/internal/discovery/context.js +2 -13
- package/dist/internal/discovery/cursor-plugin.js +223 -259
- package/dist/internal/discovery/extension-overlay.js +104 -131
- package/dist/internal/discovery/extensions.js +276 -281
- package/dist/internal/discovery/fs.js +56 -79
- package/dist/internal/discovery/hooks.js +39 -50
- package/dist/internal/discovery/info.js +17 -19
- package/dist/internal/discovery/instructions.js +58 -71
- package/dist/internal/discovery/modules.js +45 -58
- package/dist/internal/discovery/project.d.ts.map +1 -1
- package/dist/internal/discovery/project.js +192 -215
- package/dist/internal/discovery/reminders.js +41 -52
- package/dist/internal/discovery/runtime.js +1 -1
- package/dist/internal/discovery/schedules.js +71 -82
- package/dist/internal/discovery/seed-files.js +21 -32
- package/dist/internal/discovery/services.js +74 -96
- package/dist/internal/discovery/skills.js +77 -94
- package/dist/internal/discovery/subagent.js +79 -95
- package/dist/internal/discovery/tools.js +12 -23
- package/dist/internal/distribution.js +2 -2
- package/dist/internal/docs-site.js +30 -45
- package/dist/internal/duration.js +1 -1
- package/dist/internal/env-file.js +48 -64
- package/dist/internal/eval-judge-model.js +17 -28
- package/dist/internal/eval-run-store.js +265 -254
- package/dist/internal/eval-runner.d.ts +8 -0
- package/dist/internal/eval-runner.d.ts.map +1 -1
- package/dist/internal/eval-runner.js +406 -408
- package/dist/internal/eval-transport.d.ts +24 -0
- package/dist/internal/eval-transport.d.ts.map +1 -0
- package/dist/internal/eval-transport.js +22 -0
- package/dist/internal/evals-client.js +242 -246
- package/dist/internal/event-log.js +72 -120
- package/dist/internal/event-mapper.js +30 -31
- package/dist/internal/factory-resource-channel.js +16 -30
- package/dist/internal/filesystem/errors.js +6 -6
- package/dist/internal/filesystem/format.js +10 -13
- package/dist/internal/filesystem/merge.js +52 -94
- package/dist/internal/filesystem/nearest.js +15 -27
- package/dist/internal/filesystem/scratch.js +65 -85
- package/dist/internal/filesystem/tools.js +221 -241
- package/dist/internal/filesystem/walk.js +76 -143
- package/dist/internal/framework-file-storage.js +118 -139
- package/dist/internal/framework-storage-selection.js +21 -13
- package/dist/internal/frontmatter.js +4 -6
- package/dist/internal/github-fanout.js +50 -64
- package/dist/internal/guest-network.js +96 -109
- package/dist/internal/handleAgentServeTrigger.js +121 -126
- package/dist/internal/host-files.js +73 -88
- package/dist/internal/host-kv.js +21 -36
- package/dist/internal/host-otel.js +22 -19
- package/dist/internal/host-platforms.js +49 -63
- package/dist/internal/hosted-catch-protocol.d.ts +1 -0
- package/dist/internal/hosted-catch-protocol.d.ts.map +1 -1
- package/dist/internal/hosted-catch-protocol.js +1 -0
- package/dist/internal/hosted-catch.d.ts +5 -3
- package/dist/internal/hosted-catch.d.ts.map +1 -1
- package/dist/internal/hosted-catch.js +84 -93
- package/dist/internal/hosted-delivery-protocol.js +32 -8
- package/dist/internal/hosted-delivery.d.ts +13 -1
- package/dist/internal/hosted-delivery.d.ts.map +1 -1
- package/dist/internal/hosted-delivery.js +614 -584
- package/dist/internal/hosted-eval-cases.d.ts +21 -0
- package/dist/internal/hosted-eval-cases.d.ts.map +1 -0
- package/dist/internal/hosted-eval-cases.js +162 -0
- package/dist/internal/hosted-execution-diag.js +38 -30
- package/dist/internal/hosted-execution-flush.js +75 -66
- package/dist/internal/hosted-execution-latency.js +16 -8
- package/dist/internal/hosted-managed-automation.js +2 -2
- package/dist/internal/hosting.js +2 -3
- package/dist/internal/http-channel-define.js +4 -1
- package/dist/internal/http-channel.js +101 -112
- package/dist/internal/http-control-plane-session.d.ts +18 -1
- package/dist/internal/http-control-plane-session.d.ts.map +1 -1
- package/dist/internal/http-control-plane-session.js +66 -32
- package/dist/internal/incoming-headers-to-fetch.js +1 -2
- package/dist/internal/init-interview.js +73 -93
- package/dist/internal/init-project.js +182 -214
- package/dist/internal/init-scaffold.js +10 -21
- package/dist/internal/inline-stdio-mcp.js +80 -86
- package/dist/internal/install-cursor-skills.js +231 -273
- package/dist/internal/legacy-command-guard.js +18 -31
- package/dist/internal/listen-port.js +34 -45
- package/dist/internal/local-control-plane.js +293 -307
- package/dist/internal/local-env.js +1 -1
- package/dist/internal/local-ingress.js +15 -9
- package/dist/internal/log-ring.js +1 -2
- package/dist/internal/logs-client.js +207 -227
- package/dist/internal/map-pool.js +24 -38
- package/dist/internal/mcp-endpoint.js +204 -180
- package/dist/internal/mcp-host.js +165 -168
- package/dist/internal/mcp-oauth-on-demand.js +170 -207
- package/dist/internal/mcp-oauth-persist.js +15 -29
- package/dist/internal/mcp-oauth.js +209 -266
- package/dist/internal/named-webhook-secret.d.ts +39 -0
- package/dist/internal/named-webhook-secret.d.ts.map +1 -0
- package/dist/internal/named-webhook-secret.js +47 -0
- package/dist/internal/open-browser.js +2 -3
- package/dist/internal/otel/collector.js +104 -68
- package/dist/internal/otel/config.js +24 -37
- package/dist/internal/otel/http.js +5 -7
- package/dist/internal/otel/mcp.js +3 -12
- package/dist/internal/otel/runtime.js +69 -83
- package/dist/internal/package-inline-stdio.js +57 -65
- package/dist/internal/peer-connections.js +9 -5
- package/dist/internal/platform-schedule-sync.js +39 -54
- package/dist/internal/platform-timers.js +176 -210
- package/dist/internal/playground/static.js +1 -2
- package/dist/internal/playground/toolchain.js +37 -53
- package/dist/internal/playground-proxy.js +230 -270
- package/dist/internal/process-memory-telemetry.js +33 -51
- package/dist/internal/prompt-context.js +3 -6
- package/dist/internal/reminder-control-plane-protocol.js +46 -13
- package/dist/internal/reminder-runner.js +770 -785
- package/dist/internal/reminder-schedule.js +1 -1
- package/dist/internal/reminder-store.js +57 -78
- package/dist/internal/request-error-status.js +1 -3
- package/dist/internal/request-headers.js +2 -2
- package/dist/internal/resolve-prod-target.js +119 -135
- package/dist/internal/resolved-connections.js +16 -6
- package/dist/internal/run-client.js +221 -229
- package/dist/internal/runtime-dispatch-runner.js +18 -43
- package/dist/internal/schedule-runner.js +49 -58
- package/dist/internal/scm/pr-url.js +7 -6
- package/dist/internal/sdk-runner.js +388 -363
- package/dist/internal/serve-restart.js +26 -39
- package/dist/internal/server.d.ts.map +1 -1
- package/dist/internal/server.js +1283 -1244
- package/dist/internal/session-cost.js +7 -9
- package/dist/internal/session-engine.d.ts +3 -1
- package/dist/internal/session-engine.d.ts.map +1 -1
- package/dist/internal/session-engine.js +2801 -2777
- package/dist/internal/session-links.js +12 -16
- package/dist/internal/session-run-log.js +134 -82
- package/dist/internal/session-store.js +133 -164
- package/dist/internal/sessions-client.js +97 -118
- package/dist/internal/skill-catalog.js +18 -23
- package/dist/internal/skills-sync.js +16 -30
- package/dist/internal/slack-provision-client.js +90 -116
- package/dist/internal/start-log-store.js +48 -67
- package/dist/internal/steering.js +1 -2
- package/dist/internal/storage-coordinator.js +160 -196
- package/dist/internal/store-mirror.js +16 -30
- package/dist/internal/stream-progress.js +6 -8
- package/dist/internal/terminal-style.js +3 -4
- package/dist/internal/testing/scm-continuation-fixtures.js +6 -2
- package/dist/internal/testing/slack-continuation-fixtures.d.ts +26 -0
- package/dist/internal/testing/slack-continuation-fixtures.d.ts.map +1 -0
- package/dist/internal/testing/slack-continuation-fixtures.js +136 -0
- package/dist/internal/tool-catalog.js +11 -5
- package/dist/internal/tool-result.js +1 -1
- package/dist/internal/trajectory.js +19 -22
- package/dist/internal/turn-cost.js +52 -62
- package/dist/internal/turn-governor.js +5 -8
- package/dist/internal/turn-lease-store.js +85 -105
- package/dist/internal/turn-outbox.js +28 -43
- package/dist/internal/update-check.js +231 -259
- package/dist/internal/v2-hosting.js +1 -2
- package/dist/internal/workspace-sync.js +25 -41
- package/dist/internal/workspace.js +111 -139
- package/dist/kv/memory-kv.js +27 -51
- package/dist/memory.js +106 -148
- package/dist/otel.js +5 -8
- package/dist/playground/assets/{index-Co4CUVTQ.js → index-Be0-1hw2.js} +45 -45
- package/dist/playground/assets/index-Clz6uHj9.css +1 -0
- package/dist/playground/index.html +2 -2
- package/dist/prompt.js +2 -4
- package/dist/storage-backends/cursor-hosted-v2.js +53 -83
- package/dist/storage-backends/cursor-hosted.js +105 -145
- package/dist/storage-backends/file-kv.js +100 -128
- package/dist/storage-protocol.js +3 -5
- package/dist/storage.js +17 -26
- package/dist/types.d.ts +68 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +20 -18
- package/docs/building-with-agents.md +2 -0
- package/docs/deployment.md +7 -0
- package/docs/guides/bitbucket.md +9 -1
- package/docs/guides/github.md +20 -4
- package/docs/guides/gitlab.md +9 -1
- package/docs/guides/migrate.md +127 -0
- package/docs/reference/cli.md +39 -0
- package/docs/troubleshooting.md +1 -0
- package/package.json +1 -1
- package/skills/debug/SKILL.md +1 -0
- package/skills/github/SKILL.md +23 -0
- package/skills/migrate-v2/SKILL.md +51 -10
- package/dist/docs/assets/chunks/@localSearchIndexroot.BJ8UZggu.js +0 -1
- package/dist/docs/assets/chunks/channel.BTJ5J9FI.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.D4BZ3cVV.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.D4BZ3cVV.js +0 -1
- package/dist/docs/assets/chunks/clone.62tX-O-1.js +0 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.DkTs1aEU.js +0 -1
- package/dist/docs/assets/reference_cli.md.GwugN3n-.lean.js +0 -1
- package/dist/docs/assets/troubleshooting.md.Bscj6ODe.js +0 -1
- package/dist/playground/assets/index-C1g_PTTZ.css +0 -1
- /package/dist/docs/assets/{building-with-agents.md.BPjPFxFg.lean.js → building-with-agents.md.Df87rAe1.lean.js} +0 -0
- /package/dist/docs/assets/{deployment.md.BdqTiGdc.lean.js → deployment.md.BYuEcDBv.lean.js} +0 -0
|
@@ -14,15 +14,6 @@
|
|
|
14
14
|
* Exit 0 even with warnings; nonzero only for bad args, auth/fetch
|
|
15
15
|
* failures, or filesystem write failures.
|
|
16
16
|
*/
|
|
17
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
18
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
19
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
20
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
21
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
22
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
23
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
24
|
-
});
|
|
25
|
-
};
|
|
26
17
|
import { mkdir, rm, writeFile } from "node:fs/promises";
|
|
27
18
|
import { dirname, join, resolve } from "node:path";
|
|
28
19
|
import { convertWorkflow } from "./convert-automation/convert-workflow.js";
|
|
@@ -48,7 +39,7 @@ export function parseAutomationRef(input) {
|
|
|
48
39
|
try {
|
|
49
40
|
parsed = new URL(trimmed);
|
|
50
41
|
}
|
|
51
|
-
catch
|
|
42
|
+
catch {
|
|
52
43
|
return undefined;
|
|
53
44
|
}
|
|
54
45
|
if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
|
|
@@ -67,159 +58,154 @@ export function parseAutomationRef(input) {
|
|
|
67
58
|
}
|
|
68
59
|
return uuid.toLowerCase();
|
|
69
60
|
}
|
|
70
|
-
export function cmdConvertAutomation(options) {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
if (json) {
|
|
79
|
-
out(`${JSON.stringify({ ok: false, error: message })}\n`);
|
|
80
|
-
}
|
|
81
|
-
err(`${message}\n`);
|
|
82
|
-
return 1;
|
|
83
|
-
};
|
|
84
|
-
if (options.url === undefined || options.url.trim() === "") {
|
|
85
|
-
return fail(`Usage: ${CLI} convert-automation <automation-url-or-uuid> [--dir <path>] [--json]`);
|
|
86
|
-
}
|
|
87
|
-
const uuid = parseAutomationRef(options.url);
|
|
88
|
-
if (uuid === undefined) {
|
|
89
|
-
return fail(`Could not parse ${JSON.stringify(options.url)} — expected an automation URL (https://cursor.com/automations/<uuid> or .../custom-agents/<uuid>) or a bare uuid.`);
|
|
90
|
-
}
|
|
91
|
-
const resolved = yield resolveApiKey({ apiKey: options.apiKey });
|
|
92
|
-
if (resolved === undefined) {
|
|
93
|
-
return fail(`Not signed in to Cursor. ${SIGN_IN_HINT}`);
|
|
94
|
-
}
|
|
95
|
-
const client = new AgentServeDeployClient({
|
|
96
|
-
backendUrl: cursorExternalApiUrl(),
|
|
97
|
-
apiKey: resolved.apiKey,
|
|
98
|
-
fetchImpl: options.fetchImpl,
|
|
99
|
-
});
|
|
100
|
-
let payload;
|
|
101
|
-
try {
|
|
102
|
-
payload = yield client.exportAutomation({ uuid });
|
|
61
|
+
export async function cmdConvertAutomation(options) {
|
|
62
|
+
const out = options.out ?? ((text) => void process.stdout.write(text));
|
|
63
|
+
const err = options.err ?? ((text) => void process.stderr.write(text));
|
|
64
|
+
const json = options.json === true;
|
|
65
|
+
// Failures stay machine-readable under --json (stderr keeps the prose).
|
|
66
|
+
const fail = (message) => {
|
|
67
|
+
if (json) {
|
|
68
|
+
out(`${JSON.stringify({ ok: false, error: message })}\n`);
|
|
103
69
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
70
|
+
err(`${message}\n`);
|
|
71
|
+
return 1;
|
|
72
|
+
};
|
|
73
|
+
if (options.url === undefined || options.url.trim() === "") {
|
|
74
|
+
return fail(`Usage: ${CLI} convert-automation <automation-url-or-uuid> [--dir <path>] [--json]`);
|
|
75
|
+
}
|
|
76
|
+
const uuid = parseAutomationRef(options.url);
|
|
77
|
+
if (uuid === undefined) {
|
|
78
|
+
return fail(`Could not parse ${JSON.stringify(options.url)} — expected an automation URL (https://cursor.com/automations/<uuid> or .../custom-agents/<uuid>) or a bare uuid.`);
|
|
79
|
+
}
|
|
80
|
+
const resolved = await resolveApiKey({ apiKey: options.apiKey });
|
|
81
|
+
if (resolved === undefined) {
|
|
82
|
+
return fail(`Not signed in to Cursor. ${SIGN_IN_HINT}`);
|
|
83
|
+
}
|
|
84
|
+
const client = new AgentServeDeployClient({
|
|
85
|
+
backendUrl: cursorExternalApiUrl(),
|
|
86
|
+
apiKey: resolved.apiKey,
|
|
87
|
+
fetchImpl: options.fetchImpl,
|
|
88
|
+
});
|
|
89
|
+
let payload;
|
|
90
|
+
try {
|
|
91
|
+
payload = await client.exportAutomation({ uuid });
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
if (error instanceof DeployApiError) {
|
|
95
|
+
return fail(error.message);
|
|
109
96
|
}
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
97
|
+
throw error;
|
|
98
|
+
}
|
|
99
|
+
const displayDir = options.dir ?? `./${slugify(payload.automation.name, "automation")}`;
|
|
100
|
+
const rootDir = resolve(options.cwd ?? process.cwd(), displayDir);
|
|
101
|
+
const projectRoot = resolveProjectRoot(rootDir);
|
|
102
|
+
const result = convertWorkflow({
|
|
103
|
+
automation: payload.automation,
|
|
104
|
+
workflow: payload.workflow,
|
|
105
|
+
mcpServers: payload.mcpServers,
|
|
106
|
+
exportedAt: new Date().toISOString(),
|
|
107
|
+
projectRoot,
|
|
108
|
+
});
|
|
109
|
+
let files;
|
|
110
|
+
try {
|
|
111
|
+
files = await writeProjectFiles(rootDir, result, projectRoot);
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
return fail(`Could not write project files under ${rootDir}: ${describe(error)}`);
|
|
115
|
+
}
|
|
116
|
+
// Same npm install as `init`, so the printed `validate` / `dev` next steps
|
|
117
|
+
// work immediately. Failure (npm exit or spawn error) is loud but never
|
|
118
|
+
// fails the conversion.
|
|
119
|
+
const install = options.installImpl ?? installScaffoldDependencies;
|
|
120
|
+
if (!json) {
|
|
121
|
+
out("\nInstalling npm packages\n");
|
|
122
|
+
}
|
|
123
|
+
let installed;
|
|
124
|
+
try {
|
|
125
|
+
installed = await install(rootDir, {
|
|
126
|
+
stdio: json ? "pipe" : "inherit",
|
|
119
127
|
});
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
installed
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
const reason = installed.stderr.trim() || `exit ${installed.exitCode}`;
|
|
145
|
-
err(`npm install failed (${reason}); run \`npm install\` in ${displayDir} before \`${CLI} dev\`.\n`);
|
|
146
|
-
}
|
|
147
|
-
if (json) {
|
|
148
|
-
out(`${JSON.stringify({
|
|
149
|
-
ok: true,
|
|
150
|
-
directory: rootDir,
|
|
151
|
-
files: files.map(({ path, action }) => ({ path, action })),
|
|
152
|
-
warnings: result.warnings,
|
|
153
|
-
setupSteps: result.setupSteps,
|
|
154
|
-
installed: installed.ok,
|
|
155
|
-
installError: installed.ok
|
|
156
|
-
? null
|
|
157
|
-
: installed.stderr.trim() || `npm install exited ${installed.exitCode}`,
|
|
158
|
-
mcpConnections: result.mcpConnections.map(connection => ({
|
|
159
|
-
name: connection.name,
|
|
160
|
-
kind: connection.kind,
|
|
161
|
-
})),
|
|
162
|
-
}, null, 2)}\n`);
|
|
163
|
-
return 0;
|
|
164
|
-
}
|
|
165
|
-
out(renderSummary({
|
|
166
|
-
automationName: payload.automation.name,
|
|
167
|
-
displayDir,
|
|
168
|
-
rootDir,
|
|
169
|
-
cwd: (_f = options.cwd) !== null && _f !== void 0 ? _f : process.cwd(),
|
|
170
|
-
files,
|
|
171
|
-
result,
|
|
172
|
-
}));
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
installed = { ok: false, exitCode: -1, stderr: describe(error) };
|
|
131
|
+
}
|
|
132
|
+
if (!installed.ok && !json) {
|
|
133
|
+
const reason = installed.stderr.trim() || `exit ${installed.exitCode}`;
|
|
134
|
+
err(`npm install failed (${reason}); run \`npm install\` in ${displayDir} before \`${CLI} dev\`.\n`);
|
|
135
|
+
}
|
|
136
|
+
if (json) {
|
|
137
|
+
out(`${JSON.stringify({
|
|
138
|
+
ok: true,
|
|
139
|
+
directory: rootDir,
|
|
140
|
+
files: files.map(({ path, action }) => ({ path, action })),
|
|
141
|
+
warnings: result.warnings,
|
|
142
|
+
setupSteps: result.setupSteps,
|
|
143
|
+
installed: installed.ok,
|
|
144
|
+
installError: installed.ok
|
|
145
|
+
? null
|
|
146
|
+
: installed.stderr.trim() || `npm install exited ${installed.exitCode}`,
|
|
147
|
+
mcpConnections: result.mcpConnections.map(connection => ({
|
|
148
|
+
name: connection.name,
|
|
149
|
+
kind: connection.kind,
|
|
150
|
+
})),
|
|
151
|
+
}, null, 2)}\n`);
|
|
173
152
|
return 0;
|
|
174
|
-
}
|
|
153
|
+
}
|
|
154
|
+
out(renderSummary({
|
|
155
|
+
automationName: payload.automation.name,
|
|
156
|
+
displayDir,
|
|
157
|
+
rootDir,
|
|
158
|
+
cwd: options.cwd ?? process.cwd(),
|
|
159
|
+
files,
|
|
160
|
+
result,
|
|
161
|
+
}));
|
|
162
|
+
return 0;
|
|
175
163
|
}
|
|
176
164
|
/**
|
|
177
165
|
* Converter files first (wx — existing files are kept), then the init
|
|
178
166
|
* scaffold fills in around them with the same skip-existing semantics.
|
|
179
167
|
*/
|
|
180
|
-
function writeProjectFiles(rootDir, result, projectRoot) {
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
entries.push({ path, action: "create" });
|
|
193
|
-
}
|
|
194
|
-
catch (error) {
|
|
195
|
-
if (!isEexist(error)) {
|
|
196
|
-
throw error;
|
|
197
|
-
}
|
|
198
|
-
entries.push({ path, action: "exist" });
|
|
199
|
-
}
|
|
168
|
+
async function writeProjectFiles(rootDir, result, projectRoot) {
|
|
169
|
+
const entries = [];
|
|
170
|
+
const converterPaths = new Set();
|
|
171
|
+
await mkdir(rootDir, { recursive: true });
|
|
172
|
+
for (const file of result.files) {
|
|
173
|
+
const path = file.path;
|
|
174
|
+
converterPaths.add(path);
|
|
175
|
+
const abs = join(rootDir, path);
|
|
176
|
+
await mkdir(dirname(abs), { recursive: true });
|
|
177
|
+
try {
|
|
178
|
+
await writeFile(abs, file.contents, { flag: "wx" });
|
|
179
|
+
entries.push({ path, action: "create" });
|
|
200
180
|
}
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
// enabled — the converter emits its own copy then) and the echo demo tool.
|
|
205
|
-
const dropPaths = new Set();
|
|
206
|
-
for (const scaffoldPath of [
|
|
207
|
-
projectPath(projectRoot, "hooks/memory.ts"),
|
|
208
|
-
projectPath(projectRoot, "tools/echo.ts"),
|
|
209
|
-
]) {
|
|
210
|
-
if (!converterPaths.has(scaffoldPath) && init.created.includes(scaffoldPath)) {
|
|
211
|
-
dropPaths.add(scaffoldPath);
|
|
212
|
-
yield rm(join(rootDir, scaffoldPath));
|
|
181
|
+
catch (error) {
|
|
182
|
+
if (!isEexist(error)) {
|
|
183
|
+
throw error;
|
|
213
184
|
}
|
|
185
|
+
entries.push({ path, action: "exist" });
|
|
214
186
|
}
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
187
|
+
}
|
|
188
|
+
const init = await initProject({ dir: rootDir });
|
|
189
|
+
// Scaffold files that make sense in a fresh `init` but not in an exported
|
|
190
|
+
// automation: the default memory hook (only when the automation had memory
|
|
191
|
+
// enabled — the converter emits its own copy then) and the echo demo tool.
|
|
192
|
+
const dropPaths = new Set();
|
|
193
|
+
for (const scaffoldPath of [
|
|
194
|
+
projectPath(projectRoot, "hooks/memory.ts"),
|
|
195
|
+
projectPath(projectRoot, "tools/echo.ts"),
|
|
196
|
+
]) {
|
|
197
|
+
if (!converterPaths.has(scaffoldPath) && init.created.includes(scaffoldPath)) {
|
|
198
|
+
dropPaths.add(scaffoldPath);
|
|
199
|
+
await rm(join(rootDir, scaffoldPath));
|
|
220
200
|
}
|
|
221
|
-
|
|
222
|
-
|
|
201
|
+
}
|
|
202
|
+
for (const entry of init.files) {
|
|
203
|
+
if (converterPaths.has(entry.path) || dropPaths.has(entry.path)) {
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
206
|
+
entries.push(entry);
|
|
207
|
+
}
|
|
208
|
+
return entries;
|
|
223
209
|
}
|
|
224
210
|
function renderSummary(args) {
|
|
225
211
|
const c = stdoutPalette();
|
|
@@ -232,7 +218,7 @@ function renderSummary(args) {
|
|
|
232
218
|
if (file.path.endsWith(".gitkeep")) {
|
|
233
219
|
continue;
|
|
234
220
|
}
|
|
235
|
-
anyExisting
|
|
221
|
+
anyExisting ||= file.action === "exist";
|
|
236
222
|
lines.push(c.dim(`${file.action.padStart(12)} ${file.path}`));
|
|
237
223
|
}
|
|
238
224
|
if (anyExisting) {
|
|
@@ -7,15 +7,6 @@
|
|
|
7
7
|
* everything on the host — inference, cloud runtime, account MCP
|
|
8
8
|
* connections — flows from it.
|
|
9
9
|
*/
|
|
10
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
11
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
12
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
13
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
14
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
15
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
16
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
17
|
-
});
|
|
18
|
-
};
|
|
19
10
|
import { hostname } from "node:os";
|
|
20
11
|
import { CursorBackendClient, CursorBackendError, createUserApiKeyWithSessionToken, revokeMintedUserApiKey, } from "./cursor/backend-client.js";
|
|
21
12
|
import { clearStoredCredentials, credentialsFilePath, cursorBackendUrl, pollForLoginTokens, readStoredCredentials, resolveApiKey, SIGN_IN_HINT, startBrowserLogin, writeStoredCredentials, } from "./cursor/credentials.js";
|
|
@@ -23,93 +14,90 @@ import { describeError } from "./describe-error.js";
|
|
|
23
14
|
import { CLI_COMMAND_NAME } from "./distribution.js";
|
|
24
15
|
import { openBrowser } from "./open-browser.js";
|
|
25
16
|
import { stderrPalette, stdoutPalette } from "./terminal-style.js";
|
|
26
|
-
export function cmdLogin(options) {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
backendUrl,
|
|
48
|
-
logger: line => process.stderr.write(`warning: ${line}\n`),
|
|
49
|
-
});
|
|
50
|
-
if (login.status !== "signed_in") {
|
|
51
|
-
process.stderr.write(`${describeLoginPollFailure(login)}\n`);
|
|
52
|
-
return 1;
|
|
53
|
-
}
|
|
54
|
-
const requestedKeyName = (_a = options.keyName) === null || _a === void 0 ? void 0 : _a.trim();
|
|
55
|
-
const keyName = requestedKeyName === undefined || requestedKeyName === ""
|
|
56
|
-
? `${CLI_COMMAND_NAME} (${hostname()})`
|
|
57
|
-
: requestedKeyName;
|
|
58
|
-
try {
|
|
59
|
-
apiKey = yield createUserApiKeyWithSessionToken({
|
|
60
|
-
backendUrl,
|
|
61
|
-
sessionToken: login.accessToken,
|
|
62
|
-
keyName,
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
catch (error) {
|
|
66
|
-
if (error instanceof CursorBackendError && error.status === 401) {
|
|
67
|
-
// Team policy: non-admin members may be blocked from minting keys.
|
|
68
|
-
process.stderr.write(`${error.message}\nYour team may restrict API key creation. Ask a team admin, or run \`${CLI_COMMAND_NAME} login --api-key <key>\` with a key from the Cursor dashboard.\n`);
|
|
69
|
-
return 1;
|
|
70
|
-
}
|
|
71
|
-
throw error;
|
|
72
|
-
}
|
|
73
|
-
minted = { keyName, sessionToken: login.accessToken };
|
|
74
|
-
process.stderr.write(err.dim(`Minted the "${keyName}" API key.\n`));
|
|
75
|
-
}
|
|
76
|
-
// Revoke the just-minted key when a later step fails, so a botched login
|
|
77
|
-
// never leaves an orphaned live credential (no-op on the headless path).
|
|
78
|
-
const rollbackMintedKey = () => __awaiter(this, void 0, void 0, function* () {
|
|
79
|
-
if (minted !== undefined) {
|
|
80
|
-
yield revokeMintedUserApiKey({
|
|
81
|
-
backendUrl,
|
|
82
|
-
keyName: minted.keyName,
|
|
83
|
-
apiKey,
|
|
84
|
-
sessionToken: minted.sessionToken,
|
|
85
|
-
}).catch(() => { });
|
|
86
|
-
}
|
|
17
|
+
export async function cmdLogin(options) {
|
|
18
|
+
const backendUrl = cursorBackendUrl();
|
|
19
|
+
const err = stderrPalette();
|
|
20
|
+
const out = stdoutPalette();
|
|
21
|
+
let apiKey;
|
|
22
|
+
// Set only on the browser-mint path; carries what the revoke-on-failure
|
|
23
|
+
// cleanup needs (the session token that minted the key + its label).
|
|
24
|
+
let minted;
|
|
25
|
+
if (options.apiKey !== undefined && options.apiKey.trim() !== "") {
|
|
26
|
+
// Headless path: the operator brings a key (dashboard → Integrations).
|
|
27
|
+
apiKey = options.apiKey.trim();
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
const { loginUrl, uuid, verifier } = startBrowserLogin();
|
|
31
|
+
process.stderr.write(err.dim(`Opening your browser to sign in to Cursor…\n\n ${loginUrl}\n\n(waiting for the browser sign-in to complete)\n`));
|
|
32
|
+
openBrowser(loginUrl);
|
|
33
|
+
const login = await pollForLoginTokens({
|
|
34
|
+
uuid,
|
|
35
|
+
verifier,
|
|
36
|
+
backendUrl,
|
|
37
|
+
logger: line => process.stderr.write(`warning: ${line}\n`),
|
|
87
38
|
});
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
let identity;
|
|
91
|
-
try {
|
|
92
|
-
identity = yield client.getMe();
|
|
93
|
-
}
|
|
94
|
-
catch (error) {
|
|
95
|
-
yield rollbackMintedKey();
|
|
96
|
-
process.stderr.write(`The API key did not authenticate against ${backendUrl}: ${describeError(error)}\n`);
|
|
39
|
+
if (login.status !== "signed_in") {
|
|
40
|
+
process.stderr.write(`${describeLoginPollFailure(login)}\n`);
|
|
97
41
|
return 1;
|
|
98
42
|
}
|
|
43
|
+
const requestedKeyName = options.keyName?.trim();
|
|
44
|
+
const keyName = requestedKeyName === undefined || requestedKeyName === ""
|
|
45
|
+
? `${CLI_COMMAND_NAME} (${hostname()})`
|
|
46
|
+
: requestedKeyName;
|
|
99
47
|
try {
|
|
100
|
-
|
|
48
|
+
apiKey = await createUserApiKeyWithSessionToken({
|
|
49
|
+
backendUrl,
|
|
50
|
+
sessionToken: login.accessToken,
|
|
51
|
+
keyName,
|
|
52
|
+
});
|
|
101
53
|
}
|
|
102
54
|
catch (error) {
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
55
|
+
if (error instanceof CursorBackendError && error.status === 401) {
|
|
56
|
+
// Team policy: non-admin members may be blocked from minting keys.
|
|
57
|
+
process.stderr.write(`${error.message}\nYour team may restrict API key creation. Ask a team admin, or run \`${CLI_COMMAND_NAME} login --api-key <key>\` with a key from the Cursor dashboard.\n`);
|
|
58
|
+
return 1;
|
|
59
|
+
}
|
|
60
|
+
throw error;
|
|
106
61
|
}
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
62
|
+
minted = { keyName, sessionToken: login.accessToken };
|
|
63
|
+
process.stderr.write(err.dim(`Minted the "${keyName}" API key.\n`));
|
|
64
|
+
}
|
|
65
|
+
// Revoke the just-minted key when a later step fails, so a botched login
|
|
66
|
+
// never leaves an orphaned live credential (no-op on the headless path).
|
|
67
|
+
const rollbackMintedKey = async () => {
|
|
68
|
+
if (minted !== undefined) {
|
|
69
|
+
await revokeMintedUserApiKey({
|
|
70
|
+
backendUrl,
|
|
71
|
+
keyName: minted.keyName,
|
|
72
|
+
apiKey,
|
|
73
|
+
sessionToken: minted.sessionToken,
|
|
74
|
+
}).catch(() => { });
|
|
110
75
|
}
|
|
111
|
-
|
|
112
|
-
|
|
76
|
+
};
|
|
77
|
+
// Prove the credential end-to-end (exchange + GetMe) before storing it.
|
|
78
|
+
const client = new CursorBackendClient({ backendUrl, apiKey });
|
|
79
|
+
let identity;
|
|
80
|
+
try {
|
|
81
|
+
identity = await client.getMe();
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
await rollbackMintedKey();
|
|
85
|
+
process.stderr.write(`The API key did not authenticate against ${backendUrl}: ${describeError(error)}\n`);
|
|
86
|
+
return 1;
|
|
87
|
+
}
|
|
88
|
+
try {
|
|
89
|
+
await writeStoredCredentials({ backendUrl, apiKey });
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
await rollbackMintedKey();
|
|
93
|
+
process.stderr.write(`Could not store credentials at ${credentialsFilePath()}: ${describeError(error)}\n`);
|
|
94
|
+
return 1;
|
|
95
|
+
}
|
|
96
|
+
process.stdout.write(`Signed in as ${formatIdentity(identity)} (${backendUrl})\n${out.dim(`Credentials stored at ${credentialsFilePath()}`)}\n`);
|
|
97
|
+
if (process.env.CURSOR_API_KEY !== undefined) {
|
|
98
|
+
process.stderr.write(err.dim("note: CURSOR_API_KEY is set in this shell and takes precedence over the stored login.\n"));
|
|
99
|
+
}
|
|
100
|
+
return 0;
|
|
113
101
|
}
|
|
114
102
|
/**
|
|
115
103
|
* Gate for commands that need a Cursor credential before they can do useful
|
|
@@ -119,75 +107,66 @@ export function cmdLogin(options) {
|
|
|
119
107
|
* Docker) fails fast with {@link SIGN_IN_HINT}
|
|
120
108
|
* instead of polling a browser that will never open.
|
|
121
109
|
*/
|
|
122
|
-
export function ensureCursorLogin() {
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
const login = (_b = options.login) !== null && _b !== void 0 ? _b : cmdLogin;
|
|
136
|
-
return login({});
|
|
137
|
-
});
|
|
110
|
+
export async function ensureCursorLogin(options = {}) {
|
|
111
|
+
const resolved = await resolveApiKey({ apiKey: options.apiKey });
|
|
112
|
+
if (resolved !== undefined) {
|
|
113
|
+
return 0;
|
|
114
|
+
}
|
|
115
|
+
const interactive = options.interactive ?? process.stderr.isTTY === true;
|
|
116
|
+
if (!interactive) {
|
|
117
|
+
process.stderr.write(`Not signed in to Cursor. ${SIGN_IN_HINT}\n`);
|
|
118
|
+
return 1;
|
|
119
|
+
}
|
|
120
|
+
process.stdout.write("Signing you in to Cursor\n\n");
|
|
121
|
+
const login = options.login ?? cmdLogin;
|
|
122
|
+
return login({});
|
|
138
123
|
}
|
|
139
|
-
export function cmdLogout() {
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
process.stdout.write("No stored Cursor credentials.\n");
|
|
145
|
-
return 0;
|
|
146
|
-
}
|
|
147
|
-
process.stdout.write(`Signed out (removed ${credentialsFilePath()}). The API key still exists — revoke it in the Cursor dashboard if it should stop working.\n`);
|
|
124
|
+
export async function cmdLogout() {
|
|
125
|
+
const stored = await readStoredCredentials();
|
|
126
|
+
const removed = await clearStoredCredentials();
|
|
127
|
+
if (!removed || stored === undefined) {
|
|
128
|
+
process.stdout.write("No stored Cursor credentials.\n");
|
|
148
129
|
return 0;
|
|
149
|
-
}
|
|
130
|
+
}
|
|
131
|
+
process.stdout.write(`Signed out (removed ${credentialsFilePath()}). The API key still exists — revoke it in the Cursor dashboard if it should stop working.\n`);
|
|
132
|
+
return 0;
|
|
150
133
|
}
|
|
151
|
-
export function cmdWhoami(options) {
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
134
|
+
export async function cmdWhoami(options) {
|
|
135
|
+
const resolved = await resolveApiKey();
|
|
136
|
+
if (resolved === undefined) {
|
|
137
|
+
process.stderr.write(`Not signed in to Cursor. ${SIGN_IN_HINT}\n`);
|
|
138
|
+
return 1;
|
|
139
|
+
}
|
|
140
|
+
const client = new CursorBackendClient({
|
|
141
|
+
backendUrl: resolved.backendUrl,
|
|
142
|
+
apiKey: resolved.apiKey,
|
|
143
|
+
});
|
|
144
|
+
let identity;
|
|
145
|
+
try {
|
|
146
|
+
identity = await client.getMe();
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
process.stderr.write(`The ${describeSource(resolved.source)} did not authenticate against ${resolved.backendUrl}: ${describeError(error)}\n`);
|
|
150
|
+
return 1;
|
|
151
|
+
}
|
|
152
|
+
if (options.json === true) {
|
|
153
|
+
process.stdout.write(`${JSON.stringify({
|
|
154
|
+
email: identity.email ?? null,
|
|
155
|
+
authId: identity.authId ?? null,
|
|
156
|
+
teamName: identity.teamName ?? null,
|
|
160
157
|
backendUrl: resolved.backendUrl,
|
|
161
|
-
|
|
162
|
-
});
|
|
163
|
-
let identity;
|
|
164
|
-
try {
|
|
165
|
-
identity = yield client.getMe();
|
|
166
|
-
}
|
|
167
|
-
catch (error) {
|
|
168
|
-
process.stderr.write(`The ${describeSource(resolved.source)} did not authenticate against ${resolved.backendUrl}: ${describeError(error)}\n`);
|
|
169
|
-
return 1;
|
|
170
|
-
}
|
|
171
|
-
if (options.json === true) {
|
|
172
|
-
process.stdout.write(`${JSON.stringify({
|
|
173
|
-
email: (_a = identity.email) !== null && _a !== void 0 ? _a : null,
|
|
174
|
-
authId: (_b = identity.authId) !== null && _b !== void 0 ? _b : null,
|
|
175
|
-
teamName: (_c = identity.teamName) !== null && _c !== void 0 ? _c : null,
|
|
176
|
-
backendUrl: resolved.backendUrl,
|
|
177
|
-
credentialSource: resolved.source,
|
|
178
|
-
}, null, 2)}\n`);
|
|
179
|
-
return 0;
|
|
180
|
-
}
|
|
181
|
-
process.stdout.write(`${formatIdentity(identity)}\n backend: ${resolved.backendUrl}\n credential: ${describeSource(resolved.source)}\n`);
|
|
158
|
+
credentialSource: resolved.source,
|
|
159
|
+
}, null, 2)}\n`);
|
|
182
160
|
return 0;
|
|
183
|
-
}
|
|
161
|
+
}
|
|
162
|
+
process.stdout.write(`${formatIdentity(identity)}\n backend: ${resolved.backendUrl}\n credential: ${describeSource(resolved.source)}\n`);
|
|
163
|
+
return 0;
|
|
184
164
|
}
|
|
185
165
|
function formatIdentity(identity) {
|
|
186
|
-
var _a, _b;
|
|
187
166
|
const name = [identity.firstName, identity.lastName]
|
|
188
167
|
.filter(part => part !== undefined && part !== "")
|
|
189
168
|
.join(" ");
|
|
190
|
-
const email =
|
|
169
|
+
const email = identity.email ?? identity.authId ?? "(unknown user)";
|
|
191
170
|
const team = identity.teamName === undefined ? "" : ` — team ${identity.teamName}`;
|
|
192
171
|
return name === "" ? `${email}${team}` : `${name} <${email}>${team}`;
|
|
193
172
|
}
|