@cursor/bdk 0.2.8 → 0.2.10
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.d.ts +1 -0
- package/dist/bin/agent-serve.d.ts.map +1 -1
- package/dist/bin/agent-serve.js +820 -807
- 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.oyjtOr3W.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.D0P6J_UJ.js → VPLocalSearchBox.BrbO5mEe.js} +1 -1
- package/dist/docs/assets/chunks/{arc.B0LY1J1h.js → arc.BOG1yms8.js} +1 -1
- package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.dPduLUxY.js → architectureDiagram-Q4EWVU46.C0hsMZnZ.js} +1 -1
- package/dist/docs/assets/chunks/{baseUniq.B_Ohm21h.js → baseUniq.H044KjKs.js} +1 -1
- package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.B4zcanaJ.js → blockDiagram-DXYQGD6D.BsRW6GoB.js} +1 -1
- package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.D9Iw21nx.js → c4Diagram-AHTNJAMY.B9HV5PFR.js} +1 -1
- package/dist/docs/assets/chunks/channel.CBwrU9rP.js +1 -0
- package/dist/docs/assets/chunks/{chunk-4BX2VUAB.DDVwRShI.js → chunk-4BX2VUAB.CPoT_ajl.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-4TB4RGXK.DsYcdn1i.js → chunk-4TB4RGXK.DZBwWuCL.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-55IACEB6.BzzQvcYp.js → chunk-55IACEB6.CZ3yTiyq.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-EDXVE4YY.BMiXZ7FX.js → chunk-EDXVE4YY.6DfvHSd8.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-FMBD7UC4.D_mBcLoc.js → chunk-FMBD7UC4.CpBj8HfK.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-OYMX7WX6.CMVjWVMx.js → chunk-OYMX7WX6.BdKo8YqS.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-QZHKN3VN.BG-FrPv9.js → chunk-QZHKN3VN.BnXNyxJx.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-YZCP3GAM.CkFE1ap3.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.BVNnCTvY.js → cose-bilkent-S5V4N54A.1SP8al9c.js} +1 -1
- package/dist/docs/assets/chunks/{dagre-KV5264BT.CDN5PR9l.js → dagre-KV5264BT.DS1L6hJt.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-5BDNPKRD.DQRUlT-i.js → diagram-5BDNPKRD.ChsausbG.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.CoeblYQT.js → diagram-G4DWMVQ6.3XsptNWj.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-MMDJMWI5.DW3ymjl0.js → diagram-MMDJMWI5.DPA9Dk_P.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-TYMM5635.BP0uN4Jw.js → diagram-TYMM5635.BVswXWrB.js} +1 -1
- package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.DVFUWEn4.js → erDiagram-SMLLAGMA.BSak5OSP.js} +1 -1
- package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.HU-eHspv.js → flowDiagram-DWJPFMVM.CQgN4TTz.js} +1 -1
- package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.DHNhXijY.js → ganttDiagram-T4ZO3ILL.GrT0kA4a.js} +1 -1
- package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.DkISXcO3.js → gitGraphDiagram-UUTBAWPF.CdS7Ucll.js} +1 -1
- package/dist/docs/assets/chunks/{graph.CCV0fuRR.js → graph.BVqKRmRo.js} +1 -1
- package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.bgILzOoc.js → infoDiagram-42DDH7IO.C3C9FRto.js} +1 -1
- package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.CuryXC0F.js → ishikawaDiagram-UXIWVN3A.2FuAh_Zj.js} +1 -1
- package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.BL1Pr-wu.js → journeyDiagram-VCZTEJTY.CaHMfK4b.js} +1 -1
- package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.BbGjvk4l.js → kanban-definition-6JOO6SKY.CjhIUwcA.js} +1 -1
- package/dist/docs/assets/chunks/{layout.C4PfdldS.js → layout.CGU3gfSf.js} +1 -1
- package/dist/docs/assets/chunks/{linear.C3xD1T6X.js → linear.DaihpW_n.js} +1 -1
- package/dist/docs/assets/chunks/{min.CzgRAQ9c.js → min.BS-j8kHQ.js} +1 -1
- package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.CA9rSWum.js → mindmap-definition-QFDTVHPH.BVJ1Bbnk.js} +1 -1
- package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.B8MprgJu.js → pieDiagram-DEJITSTG.Cz1WIv9r.js} +1 -1
- package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.DndDwbKT.js → quadrantDiagram-34T5L4WZ.DKLFxcjy.js} +1 -1
- package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.Zhfgwlnn.js → requirementDiagram-MS252O5E.BHegiK7x.js} +1 -1
- package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.B6RRm6N5.js → sankeyDiagram-XADWPNL6.DYkY6yPc.js} +1 -1
- package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.Bfmz-1PN.js → sequenceDiagram-FGHM5R23.DYQ1QUrI.js} +1 -1
- package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.gbrdNqgj.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.gpWjytMh.js → theme.DaplWQhQ.js} +2 -2
- package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.Bl1l7M1f.js → timeline-definition-GMOUNBTQ.BwFA8hiX.js} +1 -1
- package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.Dfle4U0d.js → vennDiagram-DHZGUBPP.CZ60W1C_.js} +1 -1
- package/dist/docs/assets/chunks/wardley-RL74JXVD.iXazD3Z7.js +162 -0
- package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.CM_4lmvZ.js → wardleyDiagram-NUSXRM2D.B69D2r8-.js} +1 -1
- package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.CHT5X28R.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/{reference_skills.md.ClkMoQsV.js → reference_skills.md.C0guGcH0.js} +3 -3
- 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 +38 -38
- 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.d.ts +0 -1
- package/dist/extensions/cursor-cloud-agents/lib/backend.d.ts.map +1 -1
- package/dist/extensions/cursor-cloud-agents/lib/backend.js +101 -130
- 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.d.ts.map +1 -1
- package/dist/extensions/cursor-cloud-agents/tools/list.js +9 -20
- 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.d.ts +18 -0
- package/dist/internal/cli-migrate.d.ts.map +1 -0
- package/dist/internal/cli-migrate.js +136 -0
- 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.d.ts +1 -0
- package/dist/internal/cursor/credentials.d.ts.map +1 -1
- package/dist/internal/cursor/credentials.js +130 -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.js +410 -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.d.ts.map +1 -1
- package/dist/internal/install-cursor-skills.js +238 -274
- 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-DXm_VXAQ.css +1 -0
- package/dist/playground/assets/{index-MijLHTbB.js → index-JekUQERK.js} +45 -45
- 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 +264 -0
- package/dist/docs/assets/chunks/@localSearchIndexroot.C25zYVuc.js +0 -1
- package/dist/docs/assets/chunks/channel.CRUyWDV-.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.CG_UObcQ.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.CG_UObcQ.js +0 -1
- package/dist/docs/assets/chunks/clone.NYSZ9qZN.js +0 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.DOOmulfQ.js +0 -1
- package/dist/docs/assets/chunks/wardley-RL74JXVD.BJrCW6xc.js +0 -162
- 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-DPKLl4C_.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
- /package/dist/docs/assets/{reference_skills.md.ClkMoQsV.lean.js → reference_skills.md.C0guGcH0.lean.js} +0 -0
|
@@ -3,15 +3,6 @@
|
|
|
3
3
|
* dashboard-wizard launcher (`slack-provision-client.ts`), and
|
|
4
4
|
* `init --manual` for Slack CLI / paste-at-api.slack.com manifests.
|
|
5
5
|
*/
|
|
6
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
7
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
8
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
9
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
10
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
11
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
12
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
13
|
-
});
|
|
14
|
-
};
|
|
15
6
|
import { access, readFile } from "node:fs/promises";
|
|
16
7
|
import { basename, extname, join, resolve as resolvePath } from "node:path";
|
|
17
8
|
import { envPrefixFromName, formatSlackSetupGuide, initSlackChannel, runSlackDoctor, slackEnvKeys, } from "../channels/slack/index.js";
|
|
@@ -42,7 +33,7 @@ Usage:
|
|
|
42
33
|
${CLI} slack icon <URL-or-FILE> [--dir .] [--slack-team T0123ABCD]
|
|
43
34
|
[--prod] [--team <id>] [--json]
|
|
44
35
|
${CLI} slack init --manual [--dir .] [--name NAME]
|
|
45
|
-
[--prefix PREFIX | --no-prefix]
|
|
36
|
+
[--prefix PREFIX | --no-prefix]
|
|
46
37
|
[--install | --no-install]
|
|
47
38
|
[--slack-team T0123ABCD] [--prod]
|
|
48
39
|
${CLI} slack manifest --env dev|prod|both [--dir .] [--name NAME]
|
|
@@ -56,7 +47,7 @@ create/destroy/icon — dedicated Socket Mode app via the Cursor dashboard:
|
|
|
56
47
|
<dir>/.env.local and runs doctor. Requires \`${CLI} login\`
|
|
57
48
|
(or CURSOR_API_KEY). A team service-account key cannot
|
|
58
49
|
provision Slack apps. --prod provisions the prod app (default
|
|
59
|
-
dev). --name / --icon
|
|
50
|
+
dev). --name / --icon prefill the wizard.
|
|
60
51
|
All three follow the agent's \`architecture\` (agent.ts;
|
|
61
52
|
default v2): the wizard stores tokens on that deployment and
|
|
62
53
|
the app inventory lives on that control plane.
|
|
@@ -82,73 +73,67 @@ Env tokens:
|
|
|
82
73
|
|
|
83
74
|
See also: skills/setup-slack/SKILL.md
|
|
84
75
|
`;
|
|
85
|
-
export function cmdSlack(subcommand, options) {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
return 1;
|
|
128
|
-
}
|
|
129
|
-
});
|
|
76
|
+
export async function cmdSlack(subcommand, options) {
|
|
77
|
+
switch (subcommand) {
|
|
78
|
+
case undefined:
|
|
79
|
+
case "help":
|
|
80
|
+
case "--help":
|
|
81
|
+
case "-h":
|
|
82
|
+
process.stdout.write(SLACK_HELP);
|
|
83
|
+
return subcommand === undefined ? 1 : 0;
|
|
84
|
+
case "setup":
|
|
85
|
+
process.stdout.write(formatSlackSetupGuide());
|
|
86
|
+
return 0;
|
|
87
|
+
case "create":
|
|
88
|
+
return cmdSlackCreate(options);
|
|
89
|
+
case "destroy":
|
|
90
|
+
return cmdSlackDestroy(options);
|
|
91
|
+
case "icon":
|
|
92
|
+
return cmdSlackIcon(options);
|
|
93
|
+
case "init":
|
|
94
|
+
return cmdSlackInit({
|
|
95
|
+
dir: options.dir,
|
|
96
|
+
name: options.name,
|
|
97
|
+
prefix: options.prefix,
|
|
98
|
+
noPrefix: options.noPrefix,
|
|
99
|
+
manual: options.manual,
|
|
100
|
+
install: options.install,
|
|
101
|
+
noInstall: options.noInstall,
|
|
102
|
+
slackTeam: options.slackTeam,
|
|
103
|
+
detectSlackCli: options.detectSlackCli,
|
|
104
|
+
runSlackCli: options.runSlackCli,
|
|
105
|
+
prod: options.prod,
|
|
106
|
+
out: options.out,
|
|
107
|
+
err: options.err,
|
|
108
|
+
});
|
|
109
|
+
case "manifest":
|
|
110
|
+
return runSlackManifest(options);
|
|
111
|
+
case "doctor":
|
|
112
|
+
return runDoctor(options);
|
|
113
|
+
default:
|
|
114
|
+
process.stderr.write(`Unknown slack subcommand: ${subcommand}\n`);
|
|
115
|
+
process.stdout.write(SLACK_HELP);
|
|
116
|
+
return 1;
|
|
117
|
+
}
|
|
130
118
|
}
|
|
131
|
-
function runDoctor(options) {
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
envPrefix,
|
|
142
|
-
channels: channels.length > 0 ? channels : undefined,
|
|
143
|
-
});
|
|
144
|
-
if (options.json) {
|
|
145
|
-
process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
|
|
146
|
-
}
|
|
147
|
-
else {
|
|
148
|
-
process.stdout.write(renderDoctorReport(result));
|
|
149
|
-
}
|
|
150
|
-
return result.ok ? 0 : 1;
|
|
119
|
+
async function runDoctor(options) {
|
|
120
|
+
const dir = resolvePath(options.dir);
|
|
121
|
+
// Tokens usually live in the agent's .env.local; real env still wins.
|
|
122
|
+
loadAgentLocalEnv(dir);
|
|
123
|
+
const envPrefix = resolveDoctorEnvPrefix(options, dir);
|
|
124
|
+
const doctor = options.doctorImpl ?? runSlackDoctor;
|
|
125
|
+
const channels = options.channels ?? [];
|
|
126
|
+
const result = await doctor({
|
|
127
|
+
envPrefix,
|
|
128
|
+
channels: channels.length > 0 ? channels : undefined,
|
|
151
129
|
});
|
|
130
|
+
if (options.json) {
|
|
131
|
+
process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
process.stdout.write(renderDoctorReport(result));
|
|
135
|
+
}
|
|
136
|
+
return result.ok ? 0 : 1;
|
|
152
137
|
}
|
|
153
138
|
/**
|
|
154
139
|
* --prefix / --no-prefix win; otherwise the directory-derived prefix
|
|
@@ -171,10 +156,9 @@ function resolveDoctorEnvPrefix(options, dir) {
|
|
|
171
156
|
// ============================================================================
|
|
172
157
|
// create / destroy — Cursor "Add to Slack" managed provisioning
|
|
173
158
|
// ============================================================================
|
|
174
|
-
const DEFAULT_WIZARD_POLL_INTERVAL_MS =
|
|
159
|
+
const DEFAULT_WIZARD_POLL_INTERVAL_MS = 3_000;
|
|
175
160
|
const DEFAULT_WIZARD_POLL_TIMEOUT_MS = 60 * 60 * 1000;
|
|
176
161
|
function resolveSlackAppTarget(options, err) {
|
|
177
|
-
var _a, _b;
|
|
178
162
|
if (options.env === "both" && options.prod !== true) {
|
|
179
163
|
err("Provisioning targets one env at a time; pass --prod for the prod app (default dev).\n");
|
|
180
164
|
return 1;
|
|
@@ -188,15 +172,14 @@ function resolveSlackAppTarget(options, err) {
|
|
|
188
172
|
err(`Could not derive a valid app slug from the directory name ${JSON.stringify(basename(dir))} (slugs start with a letter or digit; lowercase letters, digits, '-', '_'); rename the directory or pass --dir <agent>.\n`);
|
|
189
173
|
return 1;
|
|
190
174
|
}
|
|
191
|
-
const name =
|
|
192
|
-
const envPrefix = options.noPrefix === true ? undefined : (
|
|
175
|
+
const name = options.name ?? basename(dir);
|
|
176
|
+
const envPrefix = options.noPrefix === true ? undefined : (options.prefix ?? envPrefixFromName(basename(dir)));
|
|
193
177
|
return { dir, name, slug, env, envPrefix, envKeys: slackEnvKeys(envPrefix) };
|
|
194
178
|
}
|
|
195
179
|
function errStream(options) {
|
|
196
|
-
|
|
197
|
-
return (_a = options.err) !== null && _a !== void 0 ? _a : ((text) => void process.stderr.write(text));
|
|
180
|
+
return options.err ?? ((text) => void process.stderr.write(text));
|
|
198
181
|
}
|
|
199
|
-
const SLACK_ICON_MAX_BYTES =
|
|
182
|
+
const SLACK_ICON_MAX_BYTES = 524_288;
|
|
200
183
|
const SLACK_ICON_URL_MAX_LENGTH = 3000;
|
|
201
184
|
const SLACK_ICON_CONTENT_TYPES = {
|
|
202
185
|
".png": "image/png",
|
|
@@ -204,39 +187,37 @@ const SLACK_ICON_CONTENT_TYPES = {
|
|
|
204
187
|
".jpeg": "image/jpeg",
|
|
205
188
|
".gif": "image/gif",
|
|
206
189
|
};
|
|
207
|
-
function resolveSlackIconSource(raw, err) {
|
|
208
|
-
|
|
209
|
-
if (raw.
|
|
210
|
-
|
|
211
|
-
err(`Icon URLs must be at most ${SLACK_ICON_URL_MAX_LENGTH} characters (got ${raw.length}).\n`);
|
|
212
|
-
return 1;
|
|
213
|
-
}
|
|
214
|
-
return { kind: "url", url: raw };
|
|
215
|
-
}
|
|
216
|
-
if (/^[a-z][a-z0-9+.-]*:\/\//i.test(raw)) {
|
|
217
|
-
err(`Icon URLs must be https (got ${JSON.stringify(raw)}).\n`);
|
|
218
|
-
return 1;
|
|
219
|
-
}
|
|
220
|
-
const path = resolvePath(raw);
|
|
221
|
-
const contentType = SLACK_ICON_CONTENT_TYPES[extname(path).toLowerCase()];
|
|
222
|
-
if (contentType === undefined) {
|
|
223
|
-
err(`Icon files must be .png, .jpg/.jpeg, or .gif (got ${JSON.stringify(basename(path))}).\n`);
|
|
224
|
-
return 1;
|
|
225
|
-
}
|
|
226
|
-
let data;
|
|
227
|
-
try {
|
|
228
|
-
data = yield readFile(path);
|
|
229
|
-
}
|
|
230
|
-
catch (error) {
|
|
231
|
-
err(`Could not read the icon file ${path}: ${describeError(error)}\n`);
|
|
190
|
+
async function resolveSlackIconSource(raw, err) {
|
|
191
|
+
if (raw.startsWith("https://")) {
|
|
192
|
+
if (raw.length > SLACK_ICON_URL_MAX_LENGTH) {
|
|
193
|
+
err(`Icon URLs must be at most ${SLACK_ICON_URL_MAX_LENGTH} characters (got ${raw.length}).\n`);
|
|
232
194
|
return 1;
|
|
233
195
|
}
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
}
|
|
238
|
-
return
|
|
239
|
-
}
|
|
196
|
+
return { kind: "url", url: raw };
|
|
197
|
+
}
|
|
198
|
+
if (/^[a-z][a-z0-9+.-]*:\/\//i.test(raw)) {
|
|
199
|
+
err(`Icon URLs must be https (got ${JSON.stringify(raw)}).\n`);
|
|
200
|
+
return 1;
|
|
201
|
+
}
|
|
202
|
+
const path = resolvePath(raw);
|
|
203
|
+
const contentType = SLACK_ICON_CONTENT_TYPES[extname(path).toLowerCase()];
|
|
204
|
+
if (contentType === undefined) {
|
|
205
|
+
err(`Icon files must be .png, .jpg/.jpeg, or .gif (got ${JSON.stringify(basename(path))}).\n`);
|
|
206
|
+
return 1;
|
|
207
|
+
}
|
|
208
|
+
let data;
|
|
209
|
+
try {
|
|
210
|
+
data = await readFile(path);
|
|
211
|
+
}
|
|
212
|
+
catch (error) {
|
|
213
|
+
err(`Could not read the icon file ${path}: ${describeError(error)}\n`);
|
|
214
|
+
return 1;
|
|
215
|
+
}
|
|
216
|
+
if (data.length > SLACK_ICON_MAX_BYTES) {
|
|
217
|
+
err(`Icon files must be at most ${SLACK_ICON_MAX_BYTES} bytes (${path} is ${data.length}).\n`);
|
|
218
|
+
return 1;
|
|
219
|
+
}
|
|
220
|
+
return { kind: "file", base64: data.toString("base64"), contentType, path };
|
|
240
221
|
}
|
|
241
222
|
function toSlackAppIconInput(source) {
|
|
242
223
|
return source.kind === "url"
|
|
@@ -247,24 +228,22 @@ function toSlackAppIconInput(source) {
|
|
|
247
228
|
* File icons post after the wizard finishes. URL icons ride the mint
|
|
248
229
|
* payload. Best-effort: failures warn, never fail the create.
|
|
249
230
|
*/
|
|
250
|
-
function applySlackCreateFileIcon(ctx, source, appId) {
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
}
|
|
267
|
-
});
|
|
231
|
+
async function applySlackCreateFileIcon(ctx, source, appId) {
|
|
232
|
+
if (source === undefined || source.kind === "url") {
|
|
233
|
+
return undefined;
|
|
234
|
+
}
|
|
235
|
+
try {
|
|
236
|
+
await ctx.client.setAppIcon({
|
|
237
|
+
teamId: ctx.teamId,
|
|
238
|
+
slackAppId: appId,
|
|
239
|
+
icon: toSlackAppIconInput(source),
|
|
240
|
+
});
|
|
241
|
+
return "set";
|
|
242
|
+
}
|
|
243
|
+
catch (error) {
|
|
244
|
+
ctx.err(`warning: setting the Slack app icon failed: ${describeError(error)}\nRetry with \`${CLI} slack icon ${source.path}\`.\n`);
|
|
245
|
+
return "failed";
|
|
246
|
+
}
|
|
268
247
|
}
|
|
269
248
|
/**
|
|
270
249
|
* The Slack control plane follows the agent's hosted architecture
|
|
@@ -274,15 +253,12 @@ function applySlackCreateFileIcon(ctx, source, appId) {
|
|
|
274
253
|
* that is not an agent project yet has nothing to read and takes the
|
|
275
254
|
* framework default, same as an `agent.ts` that omits the field.
|
|
276
255
|
*/
|
|
277
|
-
function resolveSlackAppArchitecture(dir) {
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
const project = yield loadAgentProject(dir);
|
|
284
|
-
return (_a = project.agent.architecture) !== null && _a !== void 0 ? _a : DEFAULT_AGENT_ARCHITECTURE;
|
|
285
|
-
});
|
|
256
|
+
async function resolveSlackAppArchitecture(dir) {
|
|
257
|
+
if (!(await isAgentProjectDir(dir))) {
|
|
258
|
+
return DEFAULT_AGENT_ARCHITECTURE;
|
|
259
|
+
}
|
|
260
|
+
const project = await loadAgentProject(dir);
|
|
261
|
+
return project.agent.architecture ?? DEFAULT_AGENT_ARCHITECTURE;
|
|
286
262
|
}
|
|
287
263
|
/**
|
|
288
264
|
* Credentials → provisioning client → team id, sharing the deploy CLI's
|
|
@@ -290,47 +266,44 @@ function resolveSlackAppArchitecture(dir) {
|
|
|
290
266
|
* default-team fallback). Returns an exit code (error already rendered)
|
|
291
267
|
* on failure.
|
|
292
268
|
*/
|
|
293
|
-
function prepareProvision(options) {
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
fetchImpl: options.fetchImpl,
|
|
307
|
-
err,
|
|
308
|
-
});
|
|
309
|
-
if (typeof auth === "number") {
|
|
310
|
-
return auth;
|
|
311
|
-
}
|
|
312
|
-
// Loading the project imports its authored modules; do it only once the
|
|
313
|
-
// credentials are known good.
|
|
314
|
-
const architecture = yield resolveSlackAppArchitecture(resolvePath(options.dir));
|
|
315
|
-
// Provisioning routes live on the external API host beside deploys.
|
|
316
|
-
return {
|
|
317
|
-
client: new AgentServeSlackClient({
|
|
318
|
-
backendUrl: cursorExternalApiUrl(),
|
|
319
|
-
apiKey: auth.apiKey,
|
|
320
|
-
architecture,
|
|
321
|
-
fetchImpl: options.fetchImpl,
|
|
322
|
-
}),
|
|
323
|
-
teamId: auth.teamId,
|
|
324
|
-
architecture,
|
|
325
|
-
json: options.json === true,
|
|
326
|
-
out,
|
|
327
|
-
err,
|
|
328
|
-
dim: ((_b = options.palette) !== null && _b !== void 0 ? _b : stderrPalette()).dim,
|
|
329
|
-
openBrowserImpl: (_c = options.openBrowserImpl) !== null && _c !== void 0 ? _c : openBrowser,
|
|
330
|
-
pollIntervalMs: (_d = options.connectPollIntervalMs) !== null && _d !== void 0 ? _d : DEFAULT_WIZARD_POLL_INTERVAL_MS,
|
|
331
|
-
pollTimeoutMs: (_e = options.connectPollTimeoutMs) !== null && _e !== void 0 ? _e : DEFAULT_WIZARD_POLL_TIMEOUT_MS,
|
|
332
|
-
};
|
|
269
|
+
async function prepareProvision(options) {
|
|
270
|
+
const out = options.out ?? ((text) => void process.stdout.write(text));
|
|
271
|
+
const err = errStream(options);
|
|
272
|
+
const credential = resolveApiKeySync(options.apiKey === undefined ? undefined : { apiKey: options.apiKey });
|
|
273
|
+
if (credential?.source === "service-account") {
|
|
274
|
+
err(`A team service-account key cannot provision Slack apps. Sign in with \`${CLI} login\` or set CURSOR_API_KEY.\n`);
|
|
275
|
+
return 1;
|
|
276
|
+
}
|
|
277
|
+
const auth = await resolveDeployAuth({
|
|
278
|
+
team: options.team,
|
|
279
|
+
apiKey: options.apiKey,
|
|
280
|
+
fetchImpl: options.fetchImpl,
|
|
281
|
+
err,
|
|
333
282
|
});
|
|
283
|
+
if (typeof auth === "number") {
|
|
284
|
+
return auth;
|
|
285
|
+
}
|
|
286
|
+
// Loading the project imports its authored modules; do it only once the
|
|
287
|
+
// credentials are known good.
|
|
288
|
+
const architecture = await resolveSlackAppArchitecture(resolvePath(options.dir));
|
|
289
|
+
// Provisioning routes live on the external API host beside deploys.
|
|
290
|
+
return {
|
|
291
|
+
client: new AgentServeSlackClient({
|
|
292
|
+
backendUrl: cursorExternalApiUrl(),
|
|
293
|
+
apiKey: auth.apiKey,
|
|
294
|
+
architecture,
|
|
295
|
+
fetchImpl: options.fetchImpl,
|
|
296
|
+
}),
|
|
297
|
+
teamId: auth.teamId,
|
|
298
|
+
architecture,
|
|
299
|
+
json: options.json === true,
|
|
300
|
+
out,
|
|
301
|
+
err,
|
|
302
|
+
dim: (options.palette ?? stderrPalette()).dim,
|
|
303
|
+
openBrowserImpl: options.openBrowserImpl ?? openBrowser,
|
|
304
|
+
pollIntervalMs: options.connectPollIntervalMs ?? DEFAULT_WIZARD_POLL_INTERVAL_MS,
|
|
305
|
+
pollTimeoutMs: options.connectPollTimeoutMs ?? DEFAULT_WIZARD_POLL_TIMEOUT_MS,
|
|
306
|
+
};
|
|
334
307
|
}
|
|
335
308
|
function writePendingAdminWait(ctx, poll) {
|
|
336
309
|
const appSuffix = poll.appId === undefined ? "" : ` (${poll.appId})`;
|
|
@@ -358,273 +331,266 @@ function writePendingAdminWait(ctx, poll) {
|
|
|
358
331
|
ctx.err(ctx.dim(` Keep this command running.\n` +
|
|
359
332
|
` After an admin approves, click Retry in the dashboard.\n`));
|
|
360
333
|
}
|
|
361
|
-
export function cmdSlackCreate(options) {
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
if (
|
|
370
|
-
|
|
371
|
-
if (typeof resolved === "number") {
|
|
372
|
-
return resolved;
|
|
373
|
-
}
|
|
374
|
-
iconSource = resolved;
|
|
375
|
-
}
|
|
376
|
-
const ctx = yield prepareProvision(options);
|
|
377
|
-
if (typeof ctx === "number") {
|
|
378
|
-
return ctx;
|
|
379
|
-
}
|
|
380
|
-
let wrote;
|
|
381
|
-
try {
|
|
382
|
-
wrote = yield scaffoldSlackChannelFiles(target);
|
|
383
|
-
}
|
|
384
|
-
catch (error) {
|
|
385
|
-
ctx.err(`${describeError(error)}\n`);
|
|
386
|
-
return 1;
|
|
387
|
-
}
|
|
388
|
-
if (wrote.length > 0 && !ctx.json) {
|
|
389
|
-
ctx.err(`${ctx.dim(`Scaffolded the Slack channel: ${wrote.join(", ")}`)}\n`);
|
|
334
|
+
export async function cmdSlackCreate(options) {
|
|
335
|
+
const target = resolveSlackAppTarget(options, errStream(options));
|
|
336
|
+
if (typeof target === "number") {
|
|
337
|
+
return target;
|
|
338
|
+
}
|
|
339
|
+
let iconSource;
|
|
340
|
+
if (options.icon !== undefined) {
|
|
341
|
+
const resolved = await resolveSlackIconSource(options.icon, errStream(options));
|
|
342
|
+
if (typeof resolved === "number") {
|
|
343
|
+
return resolved;
|
|
390
344
|
}
|
|
391
|
-
|
|
392
|
-
|
|
345
|
+
iconSource = resolved;
|
|
346
|
+
}
|
|
347
|
+
const ctx = await prepareProvision(options);
|
|
348
|
+
if (typeof ctx === "number") {
|
|
349
|
+
return ctx;
|
|
350
|
+
}
|
|
351
|
+
let wrote;
|
|
352
|
+
try {
|
|
353
|
+
wrote = await scaffoldSlackChannelFiles(target);
|
|
354
|
+
}
|
|
355
|
+
catch (error) {
|
|
356
|
+
ctx.err(`${describeError(error)}\n`);
|
|
357
|
+
return 1;
|
|
358
|
+
}
|
|
359
|
+
if (wrote.length > 0 && !ctx.json) {
|
|
360
|
+
ctx.err(`${ctx.dim(`Scaffolded the Slack channel: ${wrote.join(", ")}`)}\n`);
|
|
361
|
+
}
|
|
362
|
+
const source = await inferDeployGitSource(target.dir);
|
|
363
|
+
let minted;
|
|
364
|
+
try {
|
|
365
|
+
minted = await ctx.client.mintWizard({
|
|
366
|
+
teamId: ctx.teamId,
|
|
367
|
+
slug: target.slug,
|
|
368
|
+
env: target.env,
|
|
369
|
+
envPrefix: target.envPrefix,
|
|
370
|
+
name: options.name ?? target.name,
|
|
371
|
+
gitRepoUrl: source.gitRepoUrl,
|
|
372
|
+
gitRef: source.gitRef,
|
|
373
|
+
agentPath: source.agentPath,
|
|
374
|
+
// Control planes predating the full permission set only subscribe
|
|
375
|
+
// channel posts when asked; newer ones always do.
|
|
376
|
+
channelPosts: options.channelPosts === true ? true : undefined,
|
|
377
|
+
slackTeamId: options.slackTeam,
|
|
378
|
+
iconUrl: iconSource?.kind === "url" ? iconSource.url : undefined,
|
|
379
|
+
force: options.force === true ? true : undefined,
|
|
380
|
+
});
|
|
381
|
+
}
|
|
382
|
+
catch (error) {
|
|
383
|
+
return renderSlackApiError(error, ctx.err);
|
|
384
|
+
}
|
|
385
|
+
const waitMinutes = Math.round(ctx.pollTimeoutMs / 60_000);
|
|
386
|
+
ctx.err(`Finish Slack setup in the browser:\n\n ${minted.url}\n\n`);
|
|
387
|
+
ctx.err(ctx.dim(` Sign in as the same Cursor account that ran this command.\n` +
|
|
388
|
+
` The CLI waits here (up to ${waitMinutes} minutes).\n`));
|
|
389
|
+
ctx.openBrowserImpl(minted.url);
|
|
390
|
+
const deadline = Date.now() + ctx.pollTimeoutMs;
|
|
391
|
+
let sawPendingAdmin = false;
|
|
392
|
+
let poll;
|
|
393
|
+
for (;;) {
|
|
393
394
|
try {
|
|
394
|
-
|
|
395
|
-
teamId: ctx.teamId,
|
|
396
|
-
slug: target.slug,
|
|
397
|
-
env: target.env,
|
|
398
|
-
envPrefix: target.envPrefix,
|
|
399
|
-
name: (_a = options.name) !== null && _a !== void 0 ? _a : target.name,
|
|
400
|
-
gitRepoUrl: source.gitRepoUrl,
|
|
401
|
-
gitRef: source.gitRef,
|
|
402
|
-
agentPath: source.agentPath,
|
|
403
|
-
channelPosts: options.channelPosts === true ? true : undefined,
|
|
404
|
-
slackTeamId: options.slackTeam,
|
|
405
|
-
iconUrl: (iconSource === null || iconSource === void 0 ? void 0 : iconSource.kind) === "url" ? iconSource.url : undefined,
|
|
406
|
-
force: options.force === true ? true : undefined,
|
|
407
|
-
});
|
|
395
|
+
poll = await ctx.client.pollWizard(minted.wizardId);
|
|
408
396
|
}
|
|
409
397
|
catch (error) {
|
|
410
|
-
return renderSlackApiError(error, ctx.err);
|
|
411
|
-
}
|
|
412
|
-
const waitMinutes = Math.round(ctx.pollTimeoutMs / 60000);
|
|
413
|
-
ctx.err(`Finish Slack setup in the browser:\n\n ${minted.url}\n\n`);
|
|
414
|
-
ctx.err(ctx.dim(` Sign in as the same Cursor account that ran this command.\n` +
|
|
415
|
-
` The CLI waits here (up to ${waitMinutes} minutes).\n`));
|
|
416
|
-
ctx.openBrowserImpl(minted.url);
|
|
417
|
-
const deadline = Date.now() + ctx.pollTimeoutMs;
|
|
418
|
-
let sawPendingAdmin = false;
|
|
419
|
-
let poll;
|
|
420
|
-
for (;;) {
|
|
421
|
-
try {
|
|
422
|
-
poll = yield ctx.client.pollWizard(minted.wizardId);
|
|
423
|
-
}
|
|
424
|
-
catch (error) {
|
|
425
|
-
if (Date.now() >= deadline) {
|
|
426
|
-
return renderSlackApiError(error, ctx.err);
|
|
427
|
-
}
|
|
428
|
-
yield sleep(ctx.pollIntervalMs);
|
|
429
|
-
continue;
|
|
430
|
-
}
|
|
431
|
-
if (poll.status === "complete") {
|
|
432
|
-
break;
|
|
433
|
-
}
|
|
434
|
-
if (poll.status === "failed") {
|
|
435
|
-
ctx.err(`${(_b = poll.error) !== null && _b !== void 0 ? _b : "Slack setup failed"}\n`);
|
|
436
|
-
return 1;
|
|
437
|
-
}
|
|
438
|
-
if (poll.status === "pending_admin_approval" && !sawPendingAdmin) {
|
|
439
|
-
sawPendingAdmin = true;
|
|
440
|
-
writePendingAdminWait(ctx, poll);
|
|
441
|
-
}
|
|
442
398
|
if (Date.now() >= deadline) {
|
|
443
|
-
ctx.err
|
|
444
|
-
ctx.err(ctx.dim(` Finish it in the browser, then re-run \`${CLI} slack create\`.\n\n`));
|
|
445
|
-
ctx.err(` ${minted.url}\n`);
|
|
446
|
-
return 1;
|
|
399
|
+
return renderSlackApiError(error, ctx.err);
|
|
447
400
|
}
|
|
448
|
-
|
|
401
|
+
await sleep(ctx.pollIntervalMs);
|
|
402
|
+
continue;
|
|
449
403
|
}
|
|
450
|
-
if (poll
|
|
451
|
-
|
|
452
|
-
? "Tokens were already claimed by another poll; re-run create to rotate them.\n"
|
|
453
|
-
: "Slack setup finished but no tokens were returned; re-run create.\n");
|
|
454
|
-
return 1;
|
|
455
|
-
}
|
|
456
|
-
const envEntries = [{ key: target.envKeys.bot, value: poll.localEnv.botToken }];
|
|
457
|
-
if (poll.localEnv.appToken !== undefined) {
|
|
458
|
-
envEntries.push({ key: target.envKeys.app, value: poll.localEnv.appToken });
|
|
459
|
-
}
|
|
460
|
-
const envFile = join(target.dir, ".env.local");
|
|
461
|
-
try {
|
|
462
|
-
yield upsertEnvFile(envFile, envEntries);
|
|
463
|
-
if (yield ensureEnvLocalGitignored(target.dir)) {
|
|
464
|
-
wrote.push(".gitignore (+.env.local)");
|
|
465
|
-
}
|
|
404
|
+
if (poll.status === "complete") {
|
|
405
|
+
break;
|
|
466
406
|
}
|
|
467
|
-
|
|
468
|
-
ctx.err(
|
|
407
|
+
if (poll.status === "failed") {
|
|
408
|
+
ctx.err(`${poll.error ?? "Slack setup failed"}\n`);
|
|
469
409
|
return 1;
|
|
470
410
|
}
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
}
|
|
475
|
-
if (poll.localEnv.appToken === undefined) {
|
|
476
|
-
ctx.err(ctx.dim(`warning: Slack did not return an app-level token, so ${target.envKeys.app} was not written.\n` +
|
|
477
|
-
` Re-run \`${CLI} slack create\` to recover it.\n`));
|
|
411
|
+
if (poll.status === "pending_admin_approval" && !sawPendingAdmin) {
|
|
412
|
+
sawPendingAdmin = true;
|
|
413
|
+
writePendingAdminWait(ctx, poll);
|
|
478
414
|
}
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
415
|
+
if (Date.now() >= deadline) {
|
|
416
|
+
ctx.err(`Timed out waiting for Slack setup.\n\n`);
|
|
417
|
+
ctx.err(ctx.dim(` Finish it in the browser, then re-run \`${CLI} slack create\`.\n\n`));
|
|
418
|
+
ctx.err(` ${minted.url}\n`);
|
|
419
|
+
return 1;
|
|
482
420
|
}
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
421
|
+
await sleep(ctx.pollIntervalMs);
|
|
422
|
+
}
|
|
423
|
+
if (poll === undefined || poll.localEnv === undefined) {
|
|
424
|
+
ctx.err(poll.localEnvClaimed === true
|
|
425
|
+
? "Tokens were already claimed by another poll; re-run create to rotate them.\n"
|
|
426
|
+
: "Slack setup finished but no tokens were returned; re-run create.\n");
|
|
427
|
+
return 1;
|
|
428
|
+
}
|
|
429
|
+
const envEntries = [{ key: target.envKeys.bot, value: poll.localEnv.botToken }];
|
|
430
|
+
if (poll.localEnv.appToken !== undefined) {
|
|
431
|
+
envEntries.push({ key: target.envKeys.app, value: poll.localEnv.appToken });
|
|
432
|
+
}
|
|
433
|
+
const envFile = join(target.dir, ".env.local");
|
|
434
|
+
try {
|
|
435
|
+
await upsertEnvFile(envFile, envEntries);
|
|
436
|
+
if (await ensureEnvLocalGitignored(target.dir)) {
|
|
437
|
+
wrote.push(".gitignore (+.env.local)");
|
|
494
438
|
}
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
439
|
+
}
|
|
440
|
+
catch (error) {
|
|
441
|
+
ctx.err(`Could not write ${envFile}: ${describeError(error)}\n`);
|
|
442
|
+
return 1;
|
|
443
|
+
}
|
|
444
|
+
wrote.push(".env.local");
|
|
445
|
+
for (const { key, value } of envEntries) {
|
|
446
|
+
process.env[key] = value;
|
|
447
|
+
}
|
|
448
|
+
if (poll.localEnv.appToken === undefined) {
|
|
449
|
+
ctx.err(ctx.dim(`warning: Slack did not return an app-level token, so ${target.envKeys.app} was not written.\n` +
|
|
450
|
+
` Re-run \`${CLI} slack create\` to recover it.\n`));
|
|
451
|
+
}
|
|
452
|
+
let iconStatus;
|
|
453
|
+
if (poll.appId !== undefined) {
|
|
454
|
+
iconStatus = await applySlackCreateFileIcon(ctx, iconSource, poll.appId);
|
|
455
|
+
}
|
|
456
|
+
if (ctx.json) {
|
|
457
|
+
ctx.out(`${JSON.stringify({
|
|
458
|
+
ok: true,
|
|
459
|
+
appId: poll.appId,
|
|
460
|
+
status: poll.status,
|
|
461
|
+
architecture: ctx.architecture,
|
|
462
|
+
envKeys: target.envKeys,
|
|
463
|
+
wrote,
|
|
464
|
+
iconStatus,
|
|
465
|
+
}, null, 2)}\n`);
|
|
504
466
|
return 0;
|
|
505
|
-
}
|
|
467
|
+
}
|
|
468
|
+
ctx.out(`Slack is connected for ${target.slug}` +
|
|
469
|
+
(poll.appId === undefined ? "" : ` (app ${poll.appId})`) +
|
|
470
|
+
`.\n wrote ${envEntries.map(entry => entry.key).join(" + ")} to ${envFile}\n\n`);
|
|
471
|
+
const doctor = options.doctorImpl ?? runSlackDoctor;
|
|
472
|
+
const doctorResult = await doctor(target.envPrefix === undefined ? {} : { envPrefix: target.envPrefix });
|
|
473
|
+
ctx.out(renderDoctorReport(doctorResult));
|
|
474
|
+
ctx.out(`\nNext steps:\n` +
|
|
475
|
+
` 1. ${CLI} serve --dir ${options.dir} --dev\n` +
|
|
476
|
+
` 2. Invite the bot in Slack and @mention it.\n`);
|
|
477
|
+
return 0;
|
|
506
478
|
}
|
|
507
479
|
/**
|
|
508
480
|
* Resolve the one provisioned app for (slug, env[, --slack-team]) from
|
|
509
481
|
* `GET /status`. Returns an exit code with the error already rendered
|
|
510
482
|
* when zero or several apps match.
|
|
511
483
|
*/
|
|
512
|
-
function resolveProvisionedApp(ctx, target, options) {
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
return candidates[0];
|
|
540
|
-
});
|
|
484
|
+
async function resolveProvisionedApp(ctx, target, options) {
|
|
485
|
+
let status;
|
|
486
|
+
try {
|
|
487
|
+
status = await ctx.client.status(ctx.teamId);
|
|
488
|
+
}
|
|
489
|
+
catch (error) {
|
|
490
|
+
return renderSlackApiError(error, ctx.err);
|
|
491
|
+
}
|
|
492
|
+
const sameSlug = status.apps.filter(app => app.slug === target.slug);
|
|
493
|
+
let candidates = sameSlug.filter(app => app.env === target.env);
|
|
494
|
+
if (options.slackTeam !== undefined) {
|
|
495
|
+
candidates = candidates.filter(app => app.slackTeamId === options.slackTeam);
|
|
496
|
+
}
|
|
497
|
+
if (candidates.length === 0) {
|
|
498
|
+
ctx.err(`No provisioned ${target.env} Slack app for "${target.slug}"${options.slackTeam === undefined ? "" : ` in workspace ${options.slackTeam}`} (team ${ctx.teamId}).\n` +
|
|
499
|
+
(sameSlug.length === 0
|
|
500
|
+
? ""
|
|
501
|
+
: `Provisioned apps for this agent:\n${formatAppList(sameSlug)}`));
|
|
502
|
+
return 1;
|
|
503
|
+
}
|
|
504
|
+
if (candidates.length > 1) {
|
|
505
|
+
ctx.err(`Multiple provisioned Slack apps match "${target.slug}" (${target.env}):\n` +
|
|
506
|
+
formatAppList(candidates) +
|
|
507
|
+
`Pass --slack-team <id> to pick one.\n`);
|
|
508
|
+
return 1;
|
|
509
|
+
}
|
|
510
|
+
return candidates[0];
|
|
541
511
|
}
|
|
542
|
-
export function cmdSlackDestroy(options) {
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
}, null, 2)}\n`);
|
|
574
|
-
return 0;
|
|
575
|
-
}
|
|
576
|
-
ctx.out(`Deleted the ${target.env} Slack app for ${target.slug} (app ${app.slackAppId}) from workspace ${app.slackTeamId}.\n` +
|
|
577
|
-
`Tokens in .env.local were left in place — ${target.envKeys.bot} / ${target.envKeys.app} are now inert; remove them whenever you like.\n`);
|
|
512
|
+
export async function cmdSlackDestroy(options) {
|
|
513
|
+
const target = resolveSlackAppTarget(options, errStream(options));
|
|
514
|
+
if (typeof target === "number") {
|
|
515
|
+
return target;
|
|
516
|
+
}
|
|
517
|
+
const ctx = await prepareProvision(options);
|
|
518
|
+
if (typeof ctx === "number") {
|
|
519
|
+
return ctx;
|
|
520
|
+
}
|
|
521
|
+
const app = await resolveProvisionedApp(ctx, target, options);
|
|
522
|
+
if (typeof app === "number") {
|
|
523
|
+
return app;
|
|
524
|
+
}
|
|
525
|
+
try {
|
|
526
|
+
await ctx.client.deleteApp({
|
|
527
|
+
teamId: ctx.teamId,
|
|
528
|
+
slackAppId: app.slackAppId,
|
|
529
|
+
});
|
|
530
|
+
}
|
|
531
|
+
catch (error) {
|
|
532
|
+
return renderSlackApiError(error, ctx.err);
|
|
533
|
+
}
|
|
534
|
+
if (ctx.json) {
|
|
535
|
+
ctx.out(`${JSON.stringify({
|
|
536
|
+
ok: true,
|
|
537
|
+
deleted: true,
|
|
538
|
+
appId: app.slackAppId,
|
|
539
|
+
slackTeamId: app.slackTeamId,
|
|
540
|
+
slug: target.slug,
|
|
541
|
+
env: target.env,
|
|
542
|
+
}, null, 2)}\n`);
|
|
578
543
|
return 0;
|
|
579
|
-
}
|
|
544
|
+
}
|
|
545
|
+
ctx.out(`Deleted the ${target.env} Slack app for ${target.slug} (app ${app.slackAppId}) from workspace ${app.slackTeamId}.\n` +
|
|
546
|
+
`Tokens in .env.local were left in place — ${target.envKeys.bot} / ${target.envKeys.app} are now inert; remove them whenever you like.\n`);
|
|
547
|
+
return 0;
|
|
580
548
|
}
|
|
581
|
-
export function cmdSlackIcon(options) {
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
}, null, 2)}\n`);
|
|
623
|
-
return 0;
|
|
624
|
-
}
|
|
625
|
-
ctx.out(`Set the icon for the ${target.env} Slack app for ${target.slug} (app ${app.slackAppId}).\n`);
|
|
549
|
+
export async function cmdSlackIcon(options) {
|
|
550
|
+
const err = errStream(options);
|
|
551
|
+
if (options.iconSource === undefined) {
|
|
552
|
+
err(`Usage: ${CLI} slack icon <https-url-or-file> [--dir .] [--slack-team T0123ABCD] [--prod] [--team <id>] [--json]\n`);
|
|
553
|
+
return 1;
|
|
554
|
+
}
|
|
555
|
+
const source = await resolveSlackIconSource(options.iconSource, err);
|
|
556
|
+
if (typeof source === "number") {
|
|
557
|
+
return source;
|
|
558
|
+
}
|
|
559
|
+
const target = resolveSlackAppTarget(options, err);
|
|
560
|
+
if (typeof target === "number") {
|
|
561
|
+
return target;
|
|
562
|
+
}
|
|
563
|
+
const ctx = await prepareProvision(options);
|
|
564
|
+
if (typeof ctx === "number") {
|
|
565
|
+
return ctx;
|
|
566
|
+
}
|
|
567
|
+
const app = await resolveProvisionedApp(ctx, target, options);
|
|
568
|
+
if (typeof app === "number") {
|
|
569
|
+
return app;
|
|
570
|
+
}
|
|
571
|
+
try {
|
|
572
|
+
await ctx.client.setAppIcon({
|
|
573
|
+
teamId: ctx.teamId,
|
|
574
|
+
slackAppId: app.slackAppId,
|
|
575
|
+
icon: toSlackAppIconInput(source),
|
|
576
|
+
});
|
|
577
|
+
}
|
|
578
|
+
catch (error) {
|
|
579
|
+
return renderSlackApiError(error, ctx.err);
|
|
580
|
+
}
|
|
581
|
+
if (ctx.json) {
|
|
582
|
+
ctx.out(`${JSON.stringify({
|
|
583
|
+
ok: true,
|
|
584
|
+
appId: app.slackAppId,
|
|
585
|
+
slackTeamId: app.slackTeamId,
|
|
586
|
+
slug: target.slug,
|
|
587
|
+
env: target.env,
|
|
588
|
+
iconStatus: "set",
|
|
589
|
+
}, null, 2)}\n`);
|
|
626
590
|
return 0;
|
|
627
|
-
}
|
|
591
|
+
}
|
|
592
|
+
ctx.out(`Set the icon for the ${target.env} Slack app for ${target.slug} (app ${app.slackAppId}).\n`);
|
|
593
|
+
return 0;
|
|
628
594
|
}
|
|
629
595
|
function formatAppList(apps) {
|
|
630
596
|
return apps
|
|
@@ -635,37 +601,33 @@ function formatAppList(apps) {
|
|
|
635
601
|
* Scaffold the authored Slack channel when absent. Existing files are never
|
|
636
602
|
* overwritten: initSlackChannel writes with `wx`.
|
|
637
603
|
*/
|
|
638
|
-
function scaffoldSlackChannelFiles(target) {
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
604
|
+
async function scaffoldSlackChannelFiles(target) {
|
|
605
|
+
const channelFile = projectPath(resolveProjectRoot(target.dir), "channels/slack.ts");
|
|
606
|
+
if (await fileExists(join(target.dir, channelFile))) {
|
|
607
|
+
return [];
|
|
608
|
+
}
|
|
609
|
+
try {
|
|
610
|
+
const result = await initSlackChannel({
|
|
611
|
+
dir: target.dir,
|
|
612
|
+
name: target.name,
|
|
613
|
+
envPrefix: target.envPrefix ?? "",
|
|
614
|
+
});
|
|
615
|
+
return result.files;
|
|
616
|
+
}
|
|
617
|
+
catch (error) {
|
|
618
|
+
if (isErrnoException(error) && error.code === "EEXIST") {
|
|
643
619
|
return [];
|
|
644
620
|
}
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
dir: target.dir,
|
|
648
|
-
name: target.name,
|
|
649
|
-
envPrefix: (_a = target.envPrefix) !== null && _a !== void 0 ? _a : "",
|
|
650
|
-
});
|
|
651
|
-
return result.files;
|
|
652
|
-
}
|
|
653
|
-
catch (error) {
|
|
654
|
-
if (isErrnoException(error) && error.code === "EEXIST") {
|
|
655
|
-
return [];
|
|
656
|
-
}
|
|
657
|
-
throw error;
|
|
658
|
-
}
|
|
659
|
-
});
|
|
621
|
+
throw error;
|
|
622
|
+
}
|
|
660
623
|
}
|
|
661
624
|
function renderDoctorReport(result) {
|
|
662
|
-
var _a;
|
|
663
625
|
let text = `env: ${result.envKeys.bot} / ${result.envKeys.app}\n`;
|
|
664
626
|
for (const check of result.checks) {
|
|
665
627
|
text += `${check.ok ? "ok" : "!!"} ${check.id}: ${check.message}\n`;
|
|
666
628
|
}
|
|
667
629
|
text += result.ok ? "doctor: pass\n" : "doctor: fail\n";
|
|
668
|
-
for (const note of
|
|
630
|
+
for (const note of result.notes ?? []) {
|
|
669
631
|
text += `\nnote: ${note}\n`;
|
|
670
632
|
}
|
|
671
633
|
return text;
|
|
@@ -679,16 +641,14 @@ function renderSlackApiError(error, err) {
|
|
|
679
641
|
: `${error.message}\n`);
|
|
680
642
|
return 1;
|
|
681
643
|
}
|
|
682
|
-
function fileExists(path) {
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
}
|
|
691
|
-
});
|
|
644
|
+
async function fileExists(path) {
|
|
645
|
+
try {
|
|
646
|
+
await access(path);
|
|
647
|
+
return true;
|
|
648
|
+
}
|
|
649
|
+
catch {
|
|
650
|
+
return false;
|
|
651
|
+
}
|
|
692
652
|
}
|
|
693
653
|
function isErrnoException(error) {
|
|
694
654
|
return error instanceof Error && "code" in error;
|