@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
|
@@ -1,15 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Slack Web API helpers used by the channel pack (`@slack/web-api`).
|
|
3
3
|
*/
|
|
4
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
5
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
6
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
7
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
8
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
9
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
10
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
11
|
-
});
|
|
12
|
-
};
|
|
13
4
|
import { ErrorCode, WebClient } from "@slack/web-api";
|
|
14
5
|
import { slackifyMarkdown } from "slackify-markdown";
|
|
15
6
|
import { slackThreadKey } from "../../internal/slack-thread-key.js";
|
|
@@ -23,24 +14,20 @@ export function isSlackApiTransport(token) {
|
|
|
23
14
|
token !== null &&
|
|
24
15
|
token.kind === "api-transport");
|
|
25
16
|
}
|
|
26
|
-
export function resolveBotToken(credentials) {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
return token;
|
|
33
|
-
});
|
|
17
|
+
export async function resolveBotToken(credentials) {
|
|
18
|
+
const token = await tryResolveBotToken(credentials);
|
|
19
|
+
if (token === undefined) {
|
|
20
|
+
throw new Error("SLACK_BOT_TOKEN is required (set credentials.botToken, envPrefix, or the env var).");
|
|
21
|
+
}
|
|
22
|
+
return token;
|
|
34
23
|
}
|
|
35
24
|
/** Resolve the Socket Mode app-level token (`xapp-…`). */
|
|
36
|
-
export function resolveAppToken(credentials) {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
return token;
|
|
43
|
-
});
|
|
25
|
+
export async function resolveAppToken(credentials) {
|
|
26
|
+
const token = await tryResolveAppToken(credentials);
|
|
27
|
+
if (token === undefined) {
|
|
28
|
+
throw new Error("SLACK_APP_TOKEN is required for Socket Mode (set credentials.appToken, envPrefix, or the env var).");
|
|
29
|
+
}
|
|
30
|
+
return token;
|
|
44
31
|
}
|
|
45
32
|
/** Channel-local continuation key. IMs are the channel; threads keep ts. */
|
|
46
33
|
export function slackContinuationKey(channelId, threadTs) {
|
|
@@ -53,10 +40,8 @@ function isPlatformError(error) {
|
|
|
53
40
|
error.code === ErrorCode.PlatformError &&
|
|
54
41
|
"data" in error);
|
|
55
42
|
}
|
|
56
|
-
function createWebClient(botToken) {
|
|
57
|
-
return
|
|
58
|
-
return new WebClient(yield resolveBotToken({ botToken }));
|
|
59
|
-
});
|
|
43
|
+
async function createWebClient(botToken) {
|
|
44
|
+
return new WebClient(await resolveBotToken({ botToken }));
|
|
60
45
|
}
|
|
61
46
|
/**
|
|
62
47
|
* Call a Slack Web API method. Platform errors (`ok: false`) are returned as
|
|
@@ -64,49 +49,49 @@ function createWebClient(botToken) {
|
|
|
64
49
|
* bot token slot holds a {@link SlackApiTransport} (e.g. the Cursor account
|
|
65
50
|
* proxy), the call is executed by the transport instead of `@slack/web-api`.
|
|
66
51
|
*/
|
|
67
|
-
export function callSlackApi(args) {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
return error.data;
|
|
80
|
-
}
|
|
81
|
-
throw error;
|
|
52
|
+
export async function callSlackApi(args) {
|
|
53
|
+
if (isSlackApiTransport(args.botToken)) {
|
|
54
|
+
return args.botToken.call(args.operation, args.body);
|
|
55
|
+
}
|
|
56
|
+
const client = await createWebClient(args.botToken);
|
|
57
|
+
try {
|
|
58
|
+
const result = await client.apiCall(args.operation, args.body);
|
|
59
|
+
return result;
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
if (isPlatformError(error)) {
|
|
63
|
+
return error.data;
|
|
82
64
|
}
|
|
83
|
-
|
|
65
|
+
throw error;
|
|
66
|
+
}
|
|
84
67
|
}
|
|
85
68
|
/**
|
|
86
69
|
* Soft-fail wrapper: never throws for Slack API errors. Network/throw
|
|
87
70
|
* errors become `{ ok: false, error }`. Unsupported feature errors set
|
|
88
71
|
* `unsupported: true`.
|
|
89
72
|
*/
|
|
90
|
-
export function callSlackApiSoft(args) {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
73
|
+
export async function callSlackApiSoft(args) {
|
|
74
|
+
try {
|
|
75
|
+
const response = await callSlackApi(args);
|
|
76
|
+
if (response.ok === true) {
|
|
77
|
+
return { ok: true, ...response };
|
|
78
|
+
}
|
|
79
|
+
const error = typeof response.error === "string" ? response.error : "unknown_error";
|
|
80
|
+
return {
|
|
81
|
+
ok: false,
|
|
82
|
+
error,
|
|
83
|
+
...(SLACK_UNSUPPORTED_ERRORS.has(error) ? { unsupported: true } : {}),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
return {
|
|
88
|
+
ok: false,
|
|
89
|
+
error: error instanceof Error ? error.message : String(error),
|
|
90
|
+
};
|
|
91
|
+
}
|
|
107
92
|
}
|
|
108
93
|
export function truncateTypingStatus(status, max) {
|
|
109
|
-
const limit = max
|
|
94
|
+
const limit = max ?? SLACK_STATUS_MAX_LEN;
|
|
110
95
|
const trimmed = status.trim().replace(/\s+/g, " ");
|
|
111
96
|
if (trimmed.length <= limit) {
|
|
112
97
|
return trimmed;
|
|
@@ -136,7 +121,7 @@ export function truncateLoadingMessages(messages, nowMs = Date.now()) {
|
|
|
136
121
|
return window;
|
|
137
122
|
}
|
|
138
123
|
export function truncateTitle(title, max) {
|
|
139
|
-
const limit = max
|
|
124
|
+
const limit = max ?? SLACK_TITLE_MAX_LEN;
|
|
140
125
|
const trimmed = title.trim().replace(/\s+/g, " ");
|
|
141
126
|
if (trimmed.length <= limit) {
|
|
142
127
|
return trimmed;
|
|
@@ -160,166 +145,154 @@ export function truncateTitle(title, max) {
|
|
|
160
145
|
* the session to `processing` on Slack's side, so status text only shows on
|
|
161
146
|
* non-streaming turns. The empty assistant call stays for older workspaces.
|
|
162
147
|
*/
|
|
163
|
-
export function setThreadStatus(args) {
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
body.loading_messages = loading_messages;
|
|
181
|
-
}
|
|
182
|
-
return callSlackApiSoft({
|
|
183
|
-
botToken: args.botToken,
|
|
184
|
-
operation: "assistant.threads.setStatus",
|
|
185
|
-
body,
|
|
186
|
-
});
|
|
148
|
+
export async function setThreadStatus(args) {
|
|
149
|
+
if (args.channelId === "" || args.threadTs === "") {
|
|
150
|
+
return { ok: false, error: "missing_channel_or_thread" };
|
|
151
|
+
}
|
|
152
|
+
const status = truncateTypingStatus(args.status);
|
|
153
|
+
const body = {
|
|
154
|
+
channel_id: args.channelId,
|
|
155
|
+
thread_ts: args.threadTs,
|
|
156
|
+
status,
|
|
157
|
+
};
|
|
158
|
+
if (status.length > 0) {
|
|
159
|
+
const loadingRaw = args.loadingMessages !== undefined && args.loadingMessages.length > 0
|
|
160
|
+
? args.loadingMessages
|
|
161
|
+
: [status, ...SLACK_DEFAULT_LOADING_MESSAGES.filter(m => m !== status)];
|
|
162
|
+
const loading_messages = truncateLoadingMessages(loadingRaw);
|
|
163
|
+
if (loading_messages.length > 0) {
|
|
164
|
+
body.loading_messages = loading_messages;
|
|
187
165
|
}
|
|
188
|
-
|
|
189
|
-
botToken: args.botToken,
|
|
190
|
-
operation: "agents.sessions.setStatus",
|
|
191
|
-
body: {
|
|
192
|
-
channel_id: args.channelId,
|
|
193
|
-
thread_ts: args.threadTs,
|
|
194
|
-
status: "active",
|
|
195
|
-
},
|
|
196
|
-
});
|
|
197
|
-
const assistantResult = yield callSlackApiSoft({
|
|
166
|
+
return callSlackApiSoft({
|
|
198
167
|
botToken: args.botToken,
|
|
199
168
|
operation: "assistant.threads.setStatus",
|
|
200
169
|
body,
|
|
201
170
|
});
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
171
|
+
}
|
|
172
|
+
const sessionResult = await callSlackApiSoft({
|
|
173
|
+
botToken: args.botToken,
|
|
174
|
+
operation: "agents.sessions.setStatus",
|
|
175
|
+
body: {
|
|
176
|
+
channel_id: args.channelId,
|
|
177
|
+
thread_ts: args.threadTs,
|
|
178
|
+
status: "active",
|
|
179
|
+
},
|
|
209
180
|
});
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
botToken: args.botToken,
|
|
215
|
-
operation: "assistant.threads.setTitle",
|
|
216
|
-
body: {
|
|
217
|
-
channel_id: args.channelId,
|
|
218
|
-
thread_ts: args.threadTs,
|
|
219
|
-
title: truncateTitle(args.title),
|
|
220
|
-
},
|
|
221
|
-
});
|
|
181
|
+
const assistantResult = await callSlackApiSoft({
|
|
182
|
+
botToken: args.botToken,
|
|
183
|
+
operation: "assistant.threads.setStatus",
|
|
184
|
+
body,
|
|
222
185
|
});
|
|
186
|
+
if (sessionResult.ok) {
|
|
187
|
+
return sessionResult;
|
|
188
|
+
}
|
|
189
|
+
if (sessionResult.unsupported === true || assistantResult.ok) {
|
|
190
|
+
return assistantResult;
|
|
191
|
+
}
|
|
192
|
+
return sessionResult;
|
|
223
193
|
}
|
|
224
|
-
export function
|
|
225
|
-
return
|
|
226
|
-
|
|
194
|
+
export async function setThreadTitle(args) {
|
|
195
|
+
return callSlackApiSoft({
|
|
196
|
+
botToken: args.botToken,
|
|
197
|
+
operation: "assistant.threads.setTitle",
|
|
198
|
+
body: {
|
|
227
199
|
channel_id: args.channelId,
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
})),
|
|
232
|
-
};
|
|
233
|
-
if (args.threadTs !== undefined && args.threadTs !== "") {
|
|
234
|
-
body.thread_ts = args.threadTs;
|
|
235
|
-
}
|
|
236
|
-
if (args.title !== undefined && args.title !== "") {
|
|
237
|
-
body.title = args.title;
|
|
238
|
-
}
|
|
239
|
-
return callSlackApiSoft({
|
|
240
|
-
botToken: args.botToken,
|
|
241
|
-
operation: "assistant.threads.setSuggestedPrompts",
|
|
242
|
-
body,
|
|
243
|
-
});
|
|
200
|
+
thread_ts: args.threadTs,
|
|
201
|
+
title: truncateTitle(args.title),
|
|
202
|
+
},
|
|
244
203
|
});
|
|
245
204
|
}
|
|
246
|
-
export function
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
}
|
|
265
|
-
if (args.recipient_team_id !== undefined && args.recipient_team_id !== "") {
|
|
266
|
-
body.recipient_team_id = args.recipient_team_id;
|
|
267
|
-
}
|
|
268
|
-
const result = yield callSlackApiSoft({
|
|
269
|
-
botToken: args.botToken,
|
|
270
|
-
operation: "chat.startStream",
|
|
271
|
-
body,
|
|
272
|
-
});
|
|
273
|
-
if (!result.ok) {
|
|
274
|
-
return result;
|
|
275
|
-
}
|
|
276
|
-
const ts = typeof result.ts === "string" ? result.ts : "";
|
|
277
|
-
const channel = typeof result.channel === "string" ? result.channel : args.channel;
|
|
278
|
-
if (ts === "") {
|
|
279
|
-
return { ok: false, error: "missing_ts" };
|
|
280
|
-
}
|
|
281
|
-
return { ok: true, ts, channel };
|
|
205
|
+
export async function setSuggestedPrompts(args) {
|
|
206
|
+
const body = {
|
|
207
|
+
channel_id: args.channelId,
|
|
208
|
+
prompts: args.prompts.map(p => ({
|
|
209
|
+
title: p.title,
|
|
210
|
+
message: p.message,
|
|
211
|
+
})),
|
|
212
|
+
};
|
|
213
|
+
if (args.threadTs !== undefined && args.threadTs !== "") {
|
|
214
|
+
body.thread_ts = args.threadTs;
|
|
215
|
+
}
|
|
216
|
+
if (args.title !== undefined && args.title !== "") {
|
|
217
|
+
body.title = args.title;
|
|
218
|
+
}
|
|
219
|
+
return callSlackApiSoft({
|
|
220
|
+
botToken: args.botToken,
|
|
221
|
+
operation: "assistant.threads.setSuggestedPrompts",
|
|
222
|
+
body,
|
|
282
223
|
});
|
|
283
224
|
}
|
|
284
|
-
export function
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
225
|
+
export async function startChatStream(args) {
|
|
226
|
+
const body = {
|
|
227
|
+
channel: args.channel,
|
|
228
|
+
};
|
|
229
|
+
// Empty markdown_text is rejected or opens a stream the assistant pane
|
|
230
|
+
// never attaches. Recipients are required outside DMs.
|
|
231
|
+
if (args.thread_ts !== undefined && args.thread_ts !== "") {
|
|
232
|
+
body.thread_ts = args.thread_ts;
|
|
233
|
+
}
|
|
234
|
+
if (args.markdown_text !== undefined && args.markdown_text !== "") {
|
|
235
|
+
body.markdown_text = args.markdown_text;
|
|
236
|
+
}
|
|
237
|
+
if (args.chunks !== undefined && args.chunks.length > 0) {
|
|
238
|
+
body.chunks = args.chunks;
|
|
239
|
+
}
|
|
240
|
+
if (args.recipient_user_id !== undefined && args.recipient_user_id !== "") {
|
|
241
|
+
body.recipient_user_id = args.recipient_user_id;
|
|
242
|
+
}
|
|
243
|
+
if (args.recipient_team_id !== undefined && args.recipient_team_id !== "") {
|
|
244
|
+
body.recipient_team_id = args.recipient_team_id;
|
|
245
|
+
}
|
|
246
|
+
const result = await callSlackApiSoft({
|
|
247
|
+
botToken: args.botToken,
|
|
248
|
+
operation: "chat.startStream",
|
|
249
|
+
body,
|
|
301
250
|
});
|
|
251
|
+
if (!result.ok) {
|
|
252
|
+
return result;
|
|
253
|
+
}
|
|
254
|
+
const ts = typeof result.ts === "string" ? result.ts : "";
|
|
255
|
+
const channel = typeof result.channel === "string" ? result.channel : args.channel;
|
|
256
|
+
if (ts === "") {
|
|
257
|
+
return { ok: false, error: "missing_ts" };
|
|
258
|
+
}
|
|
259
|
+
return { ok: true, ts, channel };
|
|
302
260
|
}
|
|
303
|
-
export function
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
261
|
+
export async function appendChatStream(args) {
|
|
262
|
+
const body = {
|
|
263
|
+
channel: args.channel,
|
|
264
|
+
ts: args.ts,
|
|
265
|
+
};
|
|
266
|
+
if (args.markdown_text !== undefined) {
|
|
267
|
+
body.markdown_text = args.markdown_text;
|
|
268
|
+
}
|
|
269
|
+
if (args.chunks !== undefined && args.chunks.length > 0) {
|
|
270
|
+
body.chunks = args.chunks;
|
|
271
|
+
}
|
|
272
|
+
return callSlackApiSoft({
|
|
273
|
+
botToken: args.botToken,
|
|
274
|
+
operation: "chat.appendStream",
|
|
275
|
+
body,
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
export async function stopChatStream(args) {
|
|
279
|
+
const body = {
|
|
280
|
+
channel: args.channel,
|
|
281
|
+
ts: args.ts,
|
|
282
|
+
};
|
|
283
|
+
if (args.markdown_text !== undefined) {
|
|
284
|
+
body.markdown_text = args.markdown_text;
|
|
285
|
+
}
|
|
286
|
+
if (args.chunks !== undefined && args.chunks.length > 0) {
|
|
287
|
+
body.chunks = args.chunks;
|
|
288
|
+
}
|
|
289
|
+
if (args.blocks !== undefined && args.blocks.length > 0) {
|
|
290
|
+
body.blocks = args.blocks;
|
|
291
|
+
}
|
|
292
|
+
return callSlackApiSoft({
|
|
293
|
+
botToken: args.botToken,
|
|
294
|
+
operation: "chat.stopStream",
|
|
295
|
+
body,
|
|
323
296
|
});
|
|
324
297
|
}
|
|
325
298
|
const SLACK_MRKDWN_LITERAL_PATTERN = /<(?:[@#!][^>\r\n]+|(?:https?|ftp|mailto|tel):[^>\r\n]+)>/gi;
|
|
@@ -347,266 +320,283 @@ export function markdownToSlackMrkdwn(markdown) {
|
|
|
347
320
|
function requiresMrkdwnText(text) {
|
|
348
321
|
return text.includes("<!subteam^") || SLACK_MRKDWN_LINK_PATTERN.test(text);
|
|
349
322
|
}
|
|
350
|
-
export function postMessage(args) {
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
323
|
+
export async function postMessage(args) {
|
|
324
|
+
// Slack treats markdown_text as mutually exclusive with text and blocks
|
|
325
|
+
// (error: markdown_text_conflict). Prefer markdown when we have no
|
|
326
|
+
// blocks; with Block Kit or plainText, use text as body/fallback.
|
|
327
|
+
const base = {
|
|
328
|
+
channel: args.channel,
|
|
329
|
+
unfurl_links: false,
|
|
330
|
+
unfurl_media: false,
|
|
331
|
+
};
|
|
332
|
+
if (args.threadTs !== undefined && args.threadTs !== "") {
|
|
333
|
+
base.thread_ts = args.threadTs;
|
|
334
|
+
}
|
|
335
|
+
if (args.metadata !== undefined) {
|
|
336
|
+
base.metadata = args.metadata;
|
|
337
|
+
}
|
|
338
|
+
const hasBlocks = args.blocks !== undefined && args.blocks.length > 0;
|
|
339
|
+
const convertToMrkdwn = args.plainText !== true && !hasBlocks && requiresMrkdwnText(args.text);
|
|
340
|
+
// User-group mentions (`<!subteam^…>`) and Slack mrkdwn links
|
|
341
|
+
// (`<https://…|label>`) only render correctly via mrkdwn `text`,
|
|
342
|
+
// not `markdown_text`.
|
|
343
|
+
const useText = args.plainText === true || hasBlocks || convertToMrkdwn;
|
|
344
|
+
let response;
|
|
345
|
+
if (useText) {
|
|
346
|
+
response = await callSlackApi({
|
|
347
|
+
botToken: args.botToken,
|
|
348
|
+
operation: "chat.postMessage",
|
|
349
|
+
body: {
|
|
350
|
+
...base,
|
|
351
|
+
text: convertToMrkdwn ? markdownToSlackMrkdwn(args.text) : args.text,
|
|
352
|
+
...(hasBlocks ? { blocks: args.blocks } : {}),
|
|
353
|
+
},
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
else {
|
|
357
|
+
response = await callSlackApi({
|
|
358
|
+
botToken: args.botToken,
|
|
359
|
+
operation: "chat.postMessage",
|
|
360
|
+
body: {
|
|
361
|
+
...base,
|
|
362
|
+
markdown_text: highlightCodeFences(args.text),
|
|
363
|
+
},
|
|
364
|
+
});
|
|
365
|
+
// Older workspaces / scopes may not accept markdown_text — retry with text.
|
|
366
|
+
// Also fall back when markdown_text hits its 12k limit (msg_too_long) while
|
|
367
|
+
// plain text still allows up to ~40k.
|
|
368
|
+
if (response.ok !== true &&
|
|
369
|
+
(response.error === "markdown_text_conflict" ||
|
|
370
|
+
response.error === "invalid_arguments" ||
|
|
371
|
+
response.error === "invalid_blocks" ||
|
|
372
|
+
response.error === "msg_too_long" ||
|
|
373
|
+
SLACK_UNSUPPORTED_ERRORS.has(String(response.error ?? "")))) {
|
|
374
|
+
response = await callSlackApi({
|
|
383
375
|
botToken: args.botToken,
|
|
384
376
|
operation: "chat.postMessage",
|
|
385
|
-
body:
|
|
377
|
+
body: {
|
|
378
|
+
...base,
|
|
379
|
+
text: markdownToSlackMrkdwn(args.text),
|
|
380
|
+
},
|
|
386
381
|
});
|
|
387
|
-
// Older workspaces / scopes may not accept markdown_text — retry with text.
|
|
388
|
-
// Also fall back when markdown_text hits its 12k limit (msg_too_long) while
|
|
389
|
-
// plain text still allows up to ~40k.
|
|
390
|
-
if (response.ok !== true &&
|
|
391
|
-
(response.error === "markdown_text_conflict" ||
|
|
392
|
-
response.error === "invalid_arguments" ||
|
|
393
|
-
response.error === "invalid_blocks" ||
|
|
394
|
-
response.error === "msg_too_long" ||
|
|
395
|
-
SLACK_UNSUPPORTED_ERRORS.has(String((_a = response.error) !== null && _a !== void 0 ? _a : "")))) {
|
|
396
|
-
response = yield callSlackApi({
|
|
397
|
-
botToken: args.botToken,
|
|
398
|
-
operation: "chat.postMessage",
|
|
399
|
-
body: Object.assign(Object.assign({}, base), { text: markdownToSlackMrkdwn(args.text) }),
|
|
400
|
-
});
|
|
401
|
-
}
|
|
402
|
-
}
|
|
403
|
-
if (response.ok !== true) {
|
|
404
|
-
throw new Error(`Slack chat.postMessage failed: ${String((_b = response.error) !== null && _b !== void 0 ? _b : "unknown_error")}`);
|
|
405
382
|
}
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
383
|
+
}
|
|
384
|
+
if (response.ok !== true) {
|
|
385
|
+
throw new Error(`Slack chat.postMessage failed: ${String(response.error ?? "unknown_error")}`);
|
|
386
|
+
}
|
|
387
|
+
// Slack requires thread_ts as a string. A numeric ts (JSON number) silently
|
|
388
|
+
// drops threading server-side — never coerce via Number.
|
|
389
|
+
const ts = typeof response.ts === "string" ? response.ts : "";
|
|
390
|
+
if (ts === "") {
|
|
391
|
+
throw new Error(`Slack chat.postMessage ok but missing string ts (got ${typeof response.ts})`);
|
|
392
|
+
}
|
|
393
|
+
// When we asked to thread, confirm Slack honored it — but only when the
|
|
394
|
+
// response includes a thread_ts. Some proxy / customize-username payloads
|
|
395
|
+
// omit `message.thread_ts` even for successful threaded posts; treating
|
|
396
|
+
// that as failure retries (or deletes) replies and leaves empty threads.
|
|
397
|
+
const requestedThreadTs = args.threadTs;
|
|
398
|
+
if (requestedThreadTs !== undefined && requestedThreadTs !== "") {
|
|
399
|
+
const message = response.message;
|
|
400
|
+
if (typeof message === "object" && message !== null && !Array.isArray(message)) {
|
|
401
|
+
const applied = typeof message.thread_ts === "string"
|
|
402
|
+
? message.thread_ts
|
|
403
|
+
: "";
|
|
404
|
+
if (applied !== "" && applied !== requestedThreadTs) {
|
|
405
|
+
throw new Error(`Slack chat.postMessage ignored thread_ts (requested ${requestedThreadTs}, got ${applied})`);
|
|
426
406
|
}
|
|
427
407
|
}
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
}
|
|
408
|
+
}
|
|
409
|
+
// Slack returns the resolved channel ID (C…) even when the request used a name.
|
|
410
|
+
const channel = typeof response.channel === "string" && response.channel !== ""
|
|
411
|
+
? response.channel
|
|
412
|
+
: args.channel;
|
|
413
|
+
return { ts, channel };
|
|
434
414
|
}
|
|
435
415
|
/** Replace an existing message (e.g. strip Approve/Deny after a decision). */
|
|
436
|
-
export function updateMessage(args) {
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
// legacy text path (same as postMessage).
|
|
448
|
-
return callSlackApiSoft({
|
|
449
|
-
botToken: args.botToken,
|
|
450
|
-
operation: "chat.update",
|
|
451
|
-
body: Object.assign(Object.assign(Object.assign({}, base), { text: convertToMrkdwn ? markdownToSlackMrkdwn(args.text) : args.text }), (args.blocks !== undefined ? { blocks: args.blocks } : {})),
|
|
452
|
-
});
|
|
453
|
-
}
|
|
454
|
-
let result = yield callSlackApiSoft({
|
|
416
|
+
export async function updateMessage(args) {
|
|
417
|
+
const base = {
|
|
418
|
+
channel: args.channel,
|
|
419
|
+
ts: args.ts,
|
|
420
|
+
};
|
|
421
|
+
const useRawText = args.blocks !== undefined || args.plainText === true;
|
|
422
|
+
const convertToMrkdwn = !useRawText && requiresMrkdwnText(args.text);
|
|
423
|
+
if (useRawText || convertToMrkdwn) {
|
|
424
|
+
// Blocks / plainText / user-group mentions / mrkdwn links force the
|
|
425
|
+
// legacy text path (same as postMessage).
|
|
426
|
+
return callSlackApiSoft({
|
|
455
427
|
botToken: args.botToken,
|
|
456
428
|
operation: "chat.update",
|
|
457
|
-
body:
|
|
429
|
+
body: {
|
|
430
|
+
...base,
|
|
431
|
+
text: convertToMrkdwn ? markdownToSlackMrkdwn(args.text) : args.text,
|
|
432
|
+
...(args.blocks !== undefined ? { blocks: args.blocks } : {}),
|
|
433
|
+
},
|
|
458
434
|
});
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
result = yield callSlackApiSoft({
|
|
468
|
-
botToken: args.botToken,
|
|
469
|
-
operation: "chat.update",
|
|
470
|
-
body: Object.assign(Object.assign({}, base), { text: markdownToSlackMrkdwn(args.text) }),
|
|
471
|
-
});
|
|
472
|
-
}
|
|
473
|
-
return result;
|
|
435
|
+
}
|
|
436
|
+
let result = await callSlackApiSoft({
|
|
437
|
+
botToken: args.botToken,
|
|
438
|
+
operation: "chat.update",
|
|
439
|
+
body: {
|
|
440
|
+
...base,
|
|
441
|
+
markdown_text: args.text,
|
|
442
|
+
},
|
|
474
443
|
});
|
|
444
|
+
// Older workspaces / scopes may not accept markdown_text — retry with text.
|
|
445
|
+
// Also fall back when markdown_text hits its 12k limit (msg_too_long).
|
|
446
|
+
if (!result.ok &&
|
|
447
|
+
(result.error === "markdown_text_conflict" ||
|
|
448
|
+
result.error === "invalid_arguments" ||
|
|
449
|
+
result.error === "invalid_blocks" ||
|
|
450
|
+
result.error === "msg_too_long" ||
|
|
451
|
+
SLACK_UNSUPPORTED_ERRORS.has(String(result.error ?? "")))) {
|
|
452
|
+
result = await callSlackApiSoft({
|
|
453
|
+
botToken: args.botToken,
|
|
454
|
+
operation: "chat.update",
|
|
455
|
+
body: {
|
|
456
|
+
...base,
|
|
457
|
+
text: markdownToSlackMrkdwn(args.text),
|
|
458
|
+
},
|
|
459
|
+
});
|
|
460
|
+
}
|
|
461
|
+
return result;
|
|
475
462
|
}
|
|
476
463
|
/**
|
|
477
464
|
* Delete a message (`chat.delete`). Soft-fails — used best-effort to remove an
|
|
478
465
|
* orphaned skeleton before falling back to a fresh post, so a failed delete
|
|
479
466
|
* never blocks delivery of the reply.
|
|
480
467
|
*/
|
|
481
|
-
export function deleteMessage(args) {
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
},
|
|
493
|
-
});
|
|
468
|
+
export async function deleteMessage(args) {
|
|
469
|
+
if (args.channel === "" || args.ts === "") {
|
|
470
|
+
return { ok: false, error: "missing_channel_or_ts" };
|
|
471
|
+
}
|
|
472
|
+
return callSlackApiSoft({
|
|
473
|
+
botToken: args.botToken,
|
|
474
|
+
operation: "chat.delete",
|
|
475
|
+
body: {
|
|
476
|
+
channel: args.channel,
|
|
477
|
+
ts: args.ts,
|
|
478
|
+
},
|
|
494
479
|
});
|
|
495
480
|
}
|
|
496
481
|
/** Add an emoji reaction (`reactions.add`). Soft-fails. */
|
|
497
|
-
export function addReaction(args) {
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
},
|
|
510
|
-
});
|
|
482
|
+
export async function addReaction(args) {
|
|
483
|
+
if (args.channel === "" || args.ts === "" || args.name === "") {
|
|
484
|
+
return { ok: false, error: "missing_channel_ts_or_name" };
|
|
485
|
+
}
|
|
486
|
+
return callSlackApiSoft({
|
|
487
|
+
botToken: args.botToken,
|
|
488
|
+
operation: "reactions.add",
|
|
489
|
+
body: {
|
|
490
|
+
channel: args.channel,
|
|
491
|
+
timestamp: args.ts,
|
|
492
|
+
name: args.name,
|
|
493
|
+
},
|
|
511
494
|
});
|
|
512
495
|
}
|
|
513
496
|
/** Remove an emoji reaction (`reactions.remove`). Soft-fails. */
|
|
514
|
-
export function removeReaction(args) {
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
},
|
|
527
|
-
});
|
|
497
|
+
export async function removeReaction(args) {
|
|
498
|
+
if (args.channel === "" || args.ts === "" || args.name === "") {
|
|
499
|
+
return { ok: false, error: "missing_channel_ts_or_name" };
|
|
500
|
+
}
|
|
501
|
+
return callSlackApiSoft({
|
|
502
|
+
botToken: args.botToken,
|
|
503
|
+
operation: "reactions.remove",
|
|
504
|
+
body: {
|
|
505
|
+
channel: args.channel,
|
|
506
|
+
timestamp: args.ts,
|
|
507
|
+
name: args.name,
|
|
508
|
+
},
|
|
528
509
|
});
|
|
529
510
|
}
|
|
530
511
|
export function buildSlackBinding(args) {
|
|
531
|
-
var _a;
|
|
532
512
|
let threadTs = args.threadTs;
|
|
533
|
-
const log =
|
|
513
|
+
const log = args.log ?? defaultSlackLog;
|
|
534
514
|
const thread = {
|
|
535
|
-
post(text, options) {
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
515
|
+
async post(text, options) {
|
|
516
|
+
const result = await postMessage({
|
|
517
|
+
botToken: args.botToken,
|
|
518
|
+
channel: args.channelId,
|
|
519
|
+
text,
|
|
520
|
+
threadTs,
|
|
521
|
+
...(options?.blocks === undefined ? {} : { blocks: options.blocks }),
|
|
522
|
+
});
|
|
523
|
+
if (result.ts !== "" && threadTs === "") {
|
|
524
|
+
threadTs = result.ts;
|
|
525
|
+
args.onThreadTsChanged?.(result.ts);
|
|
526
|
+
}
|
|
527
|
+
log.info("postMessage ok", {
|
|
528
|
+
channel: args.channelId,
|
|
529
|
+
thread_ts: threadTs,
|
|
530
|
+
message_ts: result.ts,
|
|
531
|
+
});
|
|
532
|
+
return { ts: result.ts };
|
|
533
|
+
},
|
|
534
|
+
async startTyping(status, loadingMessages) {
|
|
535
|
+
if (args.channelId === "" || threadTs === "") {
|
|
536
|
+
return;
|
|
537
|
+
}
|
|
538
|
+
const result = await setThreadStatus({
|
|
539
|
+
botToken: args.botToken,
|
|
540
|
+
channelId: args.channelId,
|
|
541
|
+
threadTs,
|
|
542
|
+
status,
|
|
543
|
+
...(loadingMessages === undefined ? {} : { loadingMessages }),
|
|
544
|
+
});
|
|
545
|
+
if (!result.ok) {
|
|
546
|
+
log.warn("slack setStatus not-ok", {
|
|
547
|
+
error: result.error,
|
|
545
548
|
channel: args.channelId,
|
|
546
549
|
thread_ts: threadTs,
|
|
547
|
-
message_ts: result.ts,
|
|
548
550
|
});
|
|
549
|
-
|
|
550
|
-
});
|
|
551
|
+
}
|
|
551
552
|
},
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
error: result.error,
|
|
562
|
-
channel: args.channelId,
|
|
563
|
-
thread_ts: threadTs,
|
|
564
|
-
});
|
|
565
|
-
}
|
|
553
|
+
async setTitle(title) {
|
|
554
|
+
if (args.channelId === "" || threadTs === "") {
|
|
555
|
+
return;
|
|
556
|
+
}
|
|
557
|
+
const result = await setThreadTitle({
|
|
558
|
+
botToken: args.botToken,
|
|
559
|
+
channelId: args.channelId,
|
|
560
|
+
threadTs,
|
|
561
|
+
title,
|
|
566
562
|
});
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
}
|
|
573
|
-
const result = yield setThreadTitle({
|
|
574
|
-
botToken: args.botToken,
|
|
575
|
-
channelId: args.channelId,
|
|
576
|
-
threadTs,
|
|
577
|
-
title,
|
|
563
|
+
if (!result.ok) {
|
|
564
|
+
log.warn("assistant.threads.setTitle not-ok", {
|
|
565
|
+
error: result.error,
|
|
566
|
+
channel: args.channelId,
|
|
567
|
+
thread_ts: threadTs,
|
|
578
568
|
});
|
|
579
|
-
|
|
580
|
-
log.warn("assistant.threads.setTitle not-ok", {
|
|
581
|
-
error: result.error,
|
|
582
|
-
channel: args.channelId,
|
|
583
|
-
thread_ts: threadTs,
|
|
584
|
-
});
|
|
585
|
-
}
|
|
586
|
-
});
|
|
569
|
+
}
|
|
587
570
|
},
|
|
588
|
-
setSuggestedPrompts(prompts, title) {
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
channel: args.channelId,
|
|
599
|
-
thread_ts: threadTs,
|
|
600
|
-
});
|
|
601
|
-
}
|
|
571
|
+
async setSuggestedPrompts(prompts, title) {
|
|
572
|
+
if (args.channelId === "" || threadTs === "" || prompts.length === 0) {
|
|
573
|
+
return;
|
|
574
|
+
}
|
|
575
|
+
const result = await setSuggestedPrompts({
|
|
576
|
+
botToken: args.botToken,
|
|
577
|
+
channelId: args.channelId,
|
|
578
|
+
threadTs,
|
|
579
|
+
prompts,
|
|
580
|
+
...(title === undefined ? {} : { title }),
|
|
602
581
|
});
|
|
582
|
+
if (!result.ok) {
|
|
583
|
+
log.warn("assistant.threads.setSuggestedPrompts not-ok", {
|
|
584
|
+
error: result.error,
|
|
585
|
+
channel: args.channelId,
|
|
586
|
+
thread_ts: threadTs,
|
|
587
|
+
});
|
|
588
|
+
}
|
|
603
589
|
},
|
|
604
590
|
};
|
|
605
591
|
return {
|
|
606
592
|
thread,
|
|
607
|
-
slack:
|
|
593
|
+
slack: {
|
|
594
|
+
channelId: args.channelId,
|
|
595
|
+
get threadTs() {
|
|
608
596
|
return threadTs;
|
|
609
|
-
}
|
|
597
|
+
},
|
|
598
|
+
...(args.teamId === undefined ? {} : { teamId: args.teamId }),
|
|
599
|
+
},
|
|
610
600
|
host: args.host,
|
|
611
601
|
artifacts: args.artifacts,
|
|
612
602
|
};
|