@cursor/bdk 0.2.3 → 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/agent-serve.js +9 -1
- package/dist/channels/slack/attachments.d.ts +2 -1
- package/dist/channels/slack/attachments.d.ts.map +1 -1
- package/dist/channels/slack/attachments.js +19 -9
- package/dist/channels/slack/dispatch.d.ts.map +1 -1
- package/dist/channels/slack/dispatch.js +26 -24
- package/dist/channels/slack/thread-context.d.ts +21 -11
- package/dist/channels/slack/thread-context.d.ts.map +1 -1
- package/dist/channels/slack/thread-context.js +75 -27
- package/dist/docs/404.html +2 -2
- package/dist/docs/assets/{app.BOIHhrKi.js → app.4kQ8Db_q.js} +4 -4
- package/dist/docs/assets/chunks/@localSearchIndexroot.CvuAJ0My.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.D49zVZqM.js → VPLocalSearchBox.DY1RwB8Q.js} +1 -1
- package/dist/docs/assets/chunks/{arc.hmjb-sc4.js → arc.CxE_fSPK.js} +1 -1
- package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.CxEI1KqM.js → architectureDiagram-Q4EWVU46.CPX426ui.js} +1 -1
- package/dist/docs/assets/chunks/{baseUniq.DHHvBWoV.js → baseUniq.CB52JrKG.js} +1 -1
- package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.DnXW-3bu.js → blockDiagram-DXYQGD6D.J0cNaQCL.js} +1 -1
- package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.e-47O2jM.js → c4Diagram-AHTNJAMY.DJn3vEGT.js} +1 -1
- package/dist/docs/assets/chunks/channel.BoNycAoN.js +1 -0
- package/dist/docs/assets/chunks/{chunk-4BX2VUAB.3ry4pYXB.js → chunk-4BX2VUAB.Dao618F6.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-4TB4RGXK.DGIZFRx6.js → chunk-4TB4RGXK.QW8Rhjai.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-55IACEB6.DKBnqg9U.js → chunk-55IACEB6.DfRLLKF_.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-EDXVE4YY.BIU8Ue5k.js → chunk-EDXVE4YY.CIV2ApKQ.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-FMBD7UC4.DP-TFhjI.js → chunk-FMBD7UC4.BEheSuxp.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-OYMX7WX6.Ux0OYj5v.js → chunk-OYMX7WX6.CUN88ENB.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-QZHKN3VN.BzHMwYox.js → chunk-QZHKN3VN.CgqCs8b_.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-YZCP3GAM.D4OGAsSP.js → chunk-YZCP3GAM.iCH0nnTJ.js} +1 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.C4x07Gkj.js +1 -0
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.C4x07Gkj.js +1 -0
- package/dist/docs/assets/chunks/clone.Db22cH_-.js +1 -0
- package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.Jq_7BUNx.js → cose-bilkent-S5V4N54A.BLcUxhWE.js} +1 -1
- package/dist/docs/assets/chunks/{dagre-KV5264BT.Di-skR2x.js → dagre-KV5264BT.Ep7LofOm.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-5BDNPKRD.DeREHIdH.js → diagram-5BDNPKRD.Bzf4GSQ4.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.C7Kcqxro.js → diagram-G4DWMVQ6.DD6Jh-eM.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-MMDJMWI5.BK3eohyo.js → diagram-MMDJMWI5.oOIl8bWd.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-TYMM5635.C6TyymXT.js → diagram-TYMM5635.DHs85Ade.js} +1 -1
- package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.DYGG-gGx.js → erDiagram-SMLLAGMA.BIb5ghCk.js} +1 -1
- package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.C9nBcSV4.js → flowDiagram-DWJPFMVM.DV4paY9k.js} +1 -1
- package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.wAg_ymsp.js → ganttDiagram-T4ZO3ILL.AyEKA6_v.js} +1 -1
- package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.B87j9Oeg.js → gitGraphDiagram-UUTBAWPF.BltiCDFo.js} +1 -1
- package/dist/docs/assets/chunks/{graph.CuFMj31w.js → graph.DzuEYGdC.js} +1 -1
- package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.P_mLGumP.js → infoDiagram-42DDH7IO.BV2l981J.js} +1 -1
- package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.DyuL_MsT.js → ishikawaDiagram-UXIWVN3A.BA4Izf-m.js} +1 -1
- package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.CtP09IoJ.js → journeyDiagram-VCZTEJTY.DjaFbFS3.js} +1 -1
- package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.BoeSYPZo.js → kanban-definition-6JOO6SKY.CfTFieDs.js} +1 -1
- package/dist/docs/assets/chunks/{layout.B0lMMtNo.js → layout.DzfWqTBV.js} +1 -1
- package/dist/docs/assets/chunks/{linear.HxRBiAFX.js → linear.BO6mpulV.js} +1 -1
- package/dist/docs/assets/chunks/{min.BGlFFHwS.js → min.BGgTadgT.js} +1 -1
- package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.JyLBD9M8.js → mindmap-definition-QFDTVHPH.DPuIXVWY.js} +1 -1
- package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.DnSmNZF8.js → pieDiagram-DEJITSTG.BOnl3bBg.js} +1 -1
- package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.CUCnbfCa.js → quadrantDiagram-34T5L4WZ.DNB6Ckdc.js} +1 -1
- package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.py0IVUn5.js → requirementDiagram-MS252O5E.D5-Qo7vb.js} +1 -1
- package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.Bkc-HWYp.js → sankeyDiagram-XADWPNL6.8t65cesf.js} +1 -1
- package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.Dqn8Mlv2.js → sequenceDiagram-FGHM5R23.CaG07BdS.js} +1 -1
- package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.JikkoQUU.js → stateDiagram-FHFEXIEX.TKOweTB6.js} +1 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.CuqmyQc4.js +1 -0
- package/dist/docs/assets/chunks/{theme.b6HQ6zG_.js → theme.Dx-JhpTB.js} +2 -2
- package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.BvpSXiBj.js → timeline-definition-GMOUNBTQ.fE53zQ2s.js} +1 -1
- package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.CU7MVnZx.js → vennDiagram-DHZGUBPP.DJsZZaJg.js} +1 -1
- package/dist/docs/assets/chunks/{wardley-RL74JXVD.BKwC4ctG.js → wardley-RL74JXVD.844kyrjl.js} +1 -1
- package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.BfaF6Uhe.js → wardleyDiagram-NUSXRM2D.CMZ-Ru_t.js} +1 -1
- package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.Bg5dcpj4.js → xychartDiagram-5P7HB3ND.XXrhBc7a.js} +1 -1
- package/dist/docs/assets/{deployment.md.BJ8i7Q6p.js → deployment.md.UhnJIMr-.js} +2 -2
- package/dist/docs/assets/{deployment.md.BJ8i7Q6p.lean.js → deployment.md.UhnJIMr-.lean.js} +1 -1
- package/dist/docs/assets/{guides_jev.md.BNDm14Gy.js → guides_jev.md.CRcgmjDb.js} +2 -2
- package/dist/docs/assets/{guides_jev.md.BNDm14Gy.lean.js → guides_jev.md.CRcgmjDb.lean.js} +1 -1
- package/dist/docs/assets/{reference_agent-config.md.DzGI777n.js → reference_agent-config.md.Cj5uBKp4.js} +1 -1
- package/dist/docs/assets/{reference_extensions.md.CPPrkWlJ.js → reference_extensions.md.pa2tN-e4.js} +4 -3
- package/dist/docs/assets/{reference_extensions.md.CPPrkWlJ.lean.js → reference_extensions.md.pa2tN-e4.lean.js} +1 -1
- package/dist/docs/building-with-agents.html +35 -35
- package/dist/docs/deployment.html +37 -37
- package/dist/docs/deployment.md +4 -1
- package/dist/docs/evals.html +35 -35
- package/dist/docs/guides/agent-to-agent.html +35 -35
- package/dist/docs/guides/bitbucket.html +35 -35
- package/dist/docs/guides/cloud-agents.html +35 -35
- package/dist/docs/guides/convert-automation.html +35 -35
- package/dist/docs/guides/github.html +35 -35
- package/dist/docs/guides/gitlab.html +35 -35
- package/dist/docs/guides/grokbot-agents.html +35 -35
- package/dist/docs/guides/hooks.html +35 -35
- package/dist/docs/guides/improve.html +35 -35
- package/dist/docs/guides/jev.html +37 -37
- package/dist/docs/guides/jev.md +7 -0
- package/dist/docs/guides/mcp-oauth.html +35 -35
- package/dist/docs/guides/opentelemetry.html +35 -35
- package/dist/docs/guides/slack.html +35 -35
- package/dist/docs/guides/webhooks.html +35 -35
- package/dist/docs/hashmap.json +1 -1
- package/dist/docs/hillclimbing.html +35 -35
- package/dist/docs/index.html +35 -35
- package/dist/docs/llms-full.txt +25 -2
- package/dist/docs/quickstart.html +35 -35
- package/dist/docs/reference/agent-config.html +37 -37
- package/dist/docs/reference/agent-config.md +1 -1
- package/dist/docs/reference/artifacts.html +35 -35
- package/dist/docs/reference/channels.html +35 -35
- package/dist/docs/reference/cli.html +35 -35
- package/dist/docs/reference/connections.html +35 -35
- package/dist/docs/reference/evals.html +35 -35
- package/dist/docs/reference/extensions.html +39 -38
- package/dist/docs/reference/extensions.md +13 -0
- package/dist/docs/reference/hooks.html +35 -35
- package/dist/docs/reference/http-api.html +35 -35
- package/dist/docs/reference/instructions.html +35 -35
- package/dist/docs/reference/playground.html +35 -35
- package/dist/docs/reference/project-layout.html +35 -35
- package/dist/docs/reference/prompt.html +35 -35
- package/dist/docs/reference/schedules.html +35 -35
- package/dist/docs/reference/sessions.html +35 -35
- package/dist/docs/reference/skills.html +35 -35
- package/dist/docs/reference/subagents.html +35 -35
- package/dist/docs/reference/tools.html +35 -35
- package/dist/docs/templates/agentic-owners.html +35 -35
- package/dist/docs/templates/security-reviewer.html +35 -35
- package/dist/docs/templates/thermo-quality-review.html +35 -35
- package/dist/docs/templates/thermo-review.html +35 -35
- package/dist/docs/templates/triage.html +35 -35
- package/dist/docs/troubleshooting.html +35 -35
- package/dist/extensions/jev/extension.d.ts +3 -0
- package/dist/extensions/jev/extension.d.ts.map +1 -1
- package/dist/extensions/jev/extension.js +10 -1
- package/dist/extensions/jev/lib/evaluate.d.ts +4 -0
- package/dist/extensions/jev/lib/evaluate.d.ts.map +1 -1
- package/dist/extensions/jev/lib/evaluate.js +6 -2
- package/dist/extensions.d.ts +4 -2
- package/dist/extensions.d.ts.map +1 -1
- package/dist/extensions.js +5 -2
- package/dist/internal/cli-deploy.d.ts.map +1 -1
- package/dist/internal/cli-deploy.js +19 -5
- package/dist/internal/discovery/agent-config.d.ts +6 -5
- package/dist/internal/discovery/agent-config.d.ts.map +1 -1
- package/dist/internal/discovery/agent-config.js +29 -28
- package/dist/internal/discovery/agent.js +1 -1
- package/dist/internal/discovery/extensions.d.ts.map +1 -1
- package/dist/internal/discovery/extensions.js +12 -0
- package/dist/internal/hosting.d.ts +8 -0
- package/dist/internal/hosting.d.ts.map +1 -1
- package/dist/internal/hosting.js +24 -0
- package/dist/types.d.ts +18 -2
- package/dist/types.d.ts.map +1 -1
- package/docs/deployment.md +4 -1
- package/docs/guides/jev.md +7 -0
- package/docs/reference/agent-config.md +1 -1
- package/docs/reference/extensions.md +13 -0
- package/package.json +1 -9
- package/dist/docs/assets/chunks/@localSearchIndexroot.D5L-b34G.js +0 -1
- package/dist/docs/assets/chunks/channel.BbOGaJQP.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.Db58HCb1.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.Db58HCb1.js +0 -1
- package/dist/docs/assets/chunks/clone.Co4MBflG.js +0 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.CMsKhrW0.js +0 -1
- package/src/artifacts.ts +0 -68
- package/src/bin/agent-serve.ts +0 -1854
- package/src/channels/bitbucket/api.ts +0 -891
- package/src/channels/bitbucket/binding.ts +0 -417
- package/src/channels/bitbucket/bitbucket-channel.ts +0 -162
- package/src/channels/bitbucket/bitbucket-webhook.ts +0 -519
- package/src/channels/bitbucket/checks.ts +0 -146
- package/src/channels/bitbucket/cursor-account.ts +0 -106
- package/src/channels/bitbucket/defaults.ts +0 -100
- package/src/channels/bitbucket/events.ts +0 -74
- package/src/channels/bitbucket/index.ts +0 -51
- package/src/channels/bitbucket/replay.ts +0 -421
- package/src/channels/bitbucket/state.ts +0 -59
- package/src/channels/bitbucket/types.ts +0 -261
- package/src/channels/change-monitors/change-monitors-channel.ts +0 -63
- package/src/channels/change-monitors/index.ts +0 -8
- package/src/channels/change-monitors/types.ts +0 -42
- package/src/channels/checks.ts +0 -185
- package/src/channels/deployments/deployments-channel.ts +0 -224
- package/src/channels/deployments/index.ts +0 -25
- package/src/channels/deployments/types.ts +0 -92
- package/src/channels/github/api.ts +0 -526
- package/src/channels/github/auth.ts +0 -293
- package/src/channels/github/binding.ts +0 -233
- package/src/channels/github/checks.ts +0 -145
- package/src/channels/github/cursor-account.ts +0 -303
- package/src/channels/github/defaults.ts +0 -168
- package/src/channels/github/events.ts +0 -67
- package/src/channels/github/forward.ts +0 -359
- package/src/channels/github/github-channel.ts +0 -2334
- package/src/channels/github/index.ts +0 -54
- package/src/channels/github/progress.ts +0 -365
- package/src/channels/github/replay.ts +0 -372
- package/src/channels/github/state.ts +0 -124
- package/src/channels/github/types.ts +0 -590
- package/src/channels/gitlab/api.ts +0 -329
- package/src/channels/gitlab/binding.ts +0 -231
- package/src/channels/gitlab/checks.ts +0 -228
- package/src/channels/gitlab/cursor-account.ts +0 -105
- package/src/channels/gitlab/defaults.ts +0 -80
- package/src/channels/gitlab/events.ts +0 -37
- package/src/channels/gitlab/gitlab-channel.ts +0 -160
- package/src/channels/gitlab/gitlab-webhook.ts +0 -509
- package/src/channels/gitlab/index.ts +0 -44
- package/src/channels/gitlab/replay.ts +0 -328
- package/src/channels/gitlab/state.ts +0 -55
- package/src/channels/gitlab/types.ts +0 -247
- package/src/channels/issues/index.ts +0 -9
- package/src/channels/issues/issues-channel.ts +0 -45
- package/src/channels/issues/types.ts +0 -38
- package/src/channels/origin/api.ts +0 -507
- package/src/channels/origin/binding.ts +0 -114
- package/src/channels/origin/checks.ts +0 -250
- package/src/channels/origin/cursor-account.ts +0 -58
- package/src/channels/origin/defaults.ts +0 -140
- package/src/channels/origin/events.ts +0 -35
- package/src/channels/origin/index.ts +0 -35
- package/src/channels/origin/origin-channel.ts +0 -815
- package/src/channels/origin/origin-webhook.ts +0 -296
- package/src/channels/origin/reactions.ts +0 -72
- package/src/channels/origin/state.ts +0 -54
- package/src/channels/origin/types.ts +0 -295
- package/src/channels/slack/agentic-delivery.ts +0 -634
- package/src/channels/slack/agentic-posted.ts +0 -135
- package/src/channels/slack/agentic-signals.ts +0 -231
- package/src/channels/slack/api.ts +0 -761
- package/src/channels/slack/approvals.ts +0 -279
- package/src/channels/slack/assistant.ts +0 -76
- package/src/channels/slack/attachments.ts +0 -596
- package/src/channels/slack/auth.ts +0 -127
- package/src/channels/slack/blocks.ts +0 -131
- package/src/channels/slack/bot-mentions.ts +0 -318
- package/src/channels/slack/channel-watch.ts +0 -314
- package/src/channels/slack/cli-project.ts +0 -249
- package/src/channels/slack/code-fences.ts +0 -171
- package/src/channels/slack/constants.ts +0 -38
- package/src/channels/slack/credentials.ts +0 -88
- package/src/channels/slack/defaults.ts +0 -714
- package/src/channels/slack/dispatch.ts +0 -1060
- package/src/channels/slack/doctor.ts +0 -338
- package/src/channels/slack/eval-directive.ts +0 -306
- package/src/channels/slack/event-id-dedupe.ts +0 -30
- package/src/channels/slack/external-policy.ts +0 -75
- package/src/channels/slack/footer.ts +0 -106
- package/src/channels/slack/inbound.ts +0 -416
- package/src/channels/slack/index.ts +0 -53
- package/src/channels/slack/init.ts +0 -169
- package/src/channels/slack/interactive.ts +0 -406
- package/src/channels/slack/links.ts +0 -23
- package/src/channels/slack/live-delivery.ts +0 -489
- package/src/channels/slack/log.ts +0 -70
- package/src/channels/slack/manifest.ts +0 -240
- package/src/channels/slack/message-body.ts +0 -82
- package/src/channels/slack/nudge-carrier.ts +0 -224
- package/src/channels/slack/nudge-store.ts +0 -334
- package/src/channels/slack/paint-start.ts +0 -93
- package/src/channels/slack/placeholder.ts +0 -358
- package/src/channels/slack/pr-ref.ts +0 -74
- package/src/channels/slack/progress-delivery.ts +0 -138
- package/src/channels/slack/reasoning-card.ts +0 -125
- package/src/channels/slack/reasoning-chip.ts +0 -41
- package/src/channels/slack/recording-sink.ts +0 -167
- package/src/channels/slack/redact.ts +0 -6
- package/src/channels/slack/reply-options.ts +0 -279
- package/src/channels/slack/setup.ts +0 -125
- package/src/channels/slack/slack-channel.ts +0 -744
- package/src/channels/slack/socket-mode.ts +0 -140
- package/src/channels/slack/stop.ts +0 -25
- package/src/channels/slack/stream.ts +0 -66
- package/src/channels/slack/thread-context.ts +0 -485
- package/src/channels/slack/tool-approval-events.ts +0 -233
- package/src/channels/slack/tool-cards.ts +0 -198
- package/src/channels/slack/tool-chip.ts +0 -34
- package/src/channels/slack/types.ts +0 -787
- package/src/channels/slack/upload.ts +0 -137
- package/src/channels.ts +0 -543
- package/src/connections.ts +0 -153
- package/src/dashboard-session-url.ts +0 -30
- package/src/evals/assertions.ts +0 -688
- package/src/evals/expect.ts +0 -250
- package/src/evals/judge.ts +0 -329
- package/src/evals/loaders.ts +0 -111
- package/src/evals/matchers.ts +0 -223
- package/src/evals/reporters.ts +0 -257
- package/src/evals/results.ts +0 -130
- package/src/evals/run-facts.ts +0 -306
- package/src/evals.ts +0 -709
- package/src/extensions/cursor-cloud-agents/extension.ts +0 -131
- package/src/extensions/cursor-cloud-agents/lib/backend.ts +0 -386
- package/src/extensions/cursor-cloud-agents/lib/channels.ts +0 -11
- package/src/extensions/cursor-cloud-agents/lib/fleet.ts +0 -98
- package/src/extensions/cursor-cloud-agents/lib/inputs.ts +0 -5
- package/src/extensions/cursor-cloud-agents/lib/repos.ts +0 -80
- package/src/extensions/cursor-cloud-agents/lib/transcript.ts +0 -19
- package/src/extensions/cursor-cloud-agents/skills/handoff.md +0 -37
- package/src/extensions/cursor-cloud-agents/tools/cancel.ts +0 -21
- package/src/extensions/cursor-cloud-agents/tools/dump.ts +0 -47
- package/src/extensions/cursor-cloud-agents/tools/get.ts +0 -18
- package/src/extensions/cursor-cloud-agents/tools/launch.ts +0 -62
- package/src/extensions/cursor-cloud-agents/tools/list.ts +0 -31
- package/src/extensions/cursor-cloud-agents/tools/reply.ts +0 -36
- package/src/extensions/cursor-grokbot-agents/extension.ts +0 -132
- package/src/extensions/cursor-grokbot-agents/lib/agents.ts +0 -42
- package/src/extensions/cursor-grokbot-agents/lib/backend.ts +0 -208
- package/src/extensions/cursor-grokbot-agents/lib/contacts.ts +0 -74
- package/src/extensions/cursor-grokbot-agents/lib/conversation.ts +0 -260
- package/src/extensions/cursor-grokbot-agents/lib/inputs.ts +0 -21
- package/src/extensions/cursor-grokbot-agents/lib/lock.ts +0 -26
- package/src/extensions/cursor-grokbot-agents/skills/consult.md +0 -40
- package/src/extensions/cursor-grokbot-agents/tools/ask.ts +0 -32
- package/src/extensions/cursor-grokbot-agents/tools/check.ts +0 -25
- package/src/extensions/cursor-grokbot-agents/tools/interrupt.ts +0 -17
- package/src/extensions/cursor-grokbot-agents/tools/list.ts +0 -26
- package/src/extensions/improve/extension.ts +0 -69
- package/src/extensions/improve/skills/yourself.ts +0 -50
- package/src/extensions/jev/extension.ts +0 -95
- package/src/extensions/jev/lib/evaluate.ts +0 -266
- package/src/extensions/jev/skills/gated-write.md +0 -25
- package/src/extensions/jev/skills/questions.md +0 -33
- package/src/extensions/jev/tools/evaluate.ts +0 -82
- package/src/extensions/slack-communication/evals/harness.ts +0 -705
- package/src/extensions/slack-communication/evals/slack-communication.eval.ts +0 -830
- package/src/extensions/slack-communication/evals/slack-placeholder.eval.ts +0 -172
- package/src/extensions/slack-communication/extension.ts +0 -44
- package/src/extensions/slack-communication/skills/slack-voice.ts +0 -56
- package/src/extensions/slack-communication/tools/delete-message.ts +0 -33
- package/src/extensions/slack-communication/tools/edit-message.ts +0 -42
- package/src/extensions/slack-communication/tools/post-card.ts +0 -28
- package/src/extensions/slack-communication/tools/post-file.ts +0 -82
- package/src/extensions/slack-communication/tools/post-update.ts +0 -40
- package/src/extensions/slack-communication/tools/react.ts +0 -30
- package/src/extensions/slack-communication/tools/set-status.ts +0 -21
- package/src/extensions.ts +0 -179
- package/src/files-backends/agent-store-presigned-url.ts +0 -11
- package/src/files-backends/cursor-hosted.ts +0 -1212
- package/src/files-backends/local-fs.ts +0 -163
- package/src/files.ts +0 -293
- package/src/filesystem.ts +0 -2005
- package/src/hooks.ts +0 -30
- package/src/index.ts +0 -259
- package/src/internal/advertise-tools.ts +0 -370
- package/src/internal/approval-gate.ts +0 -103
- package/src/internal/artifacts-store.ts +0 -836
- package/src/internal/as-of.ts +0 -257
- package/src/internal/auth.ts +0 -46
- package/src/internal/authored-alias-hooks.ts +0 -138
- package/src/internal/authored-loaders.ts +0 -188
- package/src/internal/bounded-int.ts +0 -24
- package/src/internal/bounded.ts +0 -25
- package/src/internal/brand.ts +0 -28
- package/src/internal/browser-origin-guard.ts +0 -67
- package/src/internal/builtin-tools/artifacts.ts +0 -62
- package/src/internal/builtin-tools/index.ts +0 -53
- package/src/internal/builtin-tools/reminders.ts +0 -145
- package/src/internal/channel-dispatch.ts +0 -129
- package/src/internal/channel-route-dispatch.ts +0 -58
- package/src/internal/channel-state.ts +0 -83
- package/src/internal/chat-client.ts +0 -594
- package/src/internal/cli-ax.ts +0 -2318
- package/src/internal/cli-bitbucket.ts +0 -438
- package/src/internal/cli-convert-automation.ts +0 -335
- package/src/internal/cli-cursor.ts +0 -282
- package/src/internal/cli-deploy.ts +0 -2519
- package/src/internal/cli-docs.ts +0 -192
- package/src/internal/cli-github.ts +0 -806
- package/src/internal/cli-gitlab.ts +0 -452
- package/src/internal/cli-images.ts +0 -672
- package/src/internal/cli-manifest.ts +0 -56
- package/src/internal/cli-mcp-oauth.ts +0 -396
- package/src/internal/cli-mcp.ts +0 -808
- package/src/internal/cli-skills.ts +0 -98
- package/src/internal/cli-slack-manual.ts +0 -418
- package/src/internal/cli-slack.ts +0 -874
- package/src/internal/cloud-merge.ts +0 -51
- package/src/internal/cloud-turn-cost.ts +0 -159
- package/src/internal/connection-env.ts +0 -106
- package/src/internal/continuation-channel.ts +0 -233
- package/src/internal/continuation-identity.ts +0 -935
- package/src/internal/conversation-mirror.ts +0 -423
- package/src/internal/convert-automation/convert-workflow.ts +0 -1377
- package/src/internal/convert-automation/slug.ts +0 -29
- package/src/internal/convert-automation/types.ts +0 -212
- package/src/internal/cron.ts +0 -76
- package/src/internal/cursor/account-mcp.ts +0 -692
- package/src/internal/cursor/backend-client.ts +0 -984
- package/src/internal/cursor/bound-secret-file.ts +0 -101
- package/src/internal/cursor/credentials.ts +0 -560
- package/src/internal/cursor/cursor-api-transport.ts +0 -65
- package/src/internal/cursor/github-credentials.ts +0 -228
- package/src/internal/cursor/hosted-bound-secrets.ts +0 -71
- package/src/internal/cursor/hosted-deployment-secrets.ts +0 -100
- package/src/internal/cursor/hosted-store-secrets.ts +0 -152
- package/src/internal/cursor/session-token.ts +0 -111
- package/src/internal/cursor/store-api-client.ts +0 -323
- package/src/internal/cursor-account-mcp-auth.ts +0 -303
- package/src/internal/cursor-agent-template.ts +0 -50
- package/src/internal/cursor-deployment-relay.ts +0 -315
- package/src/internal/cursor-event-relay.ts +0 -675
- package/src/internal/cursor-relay-core.ts +0 -563
- package/src/internal/deferred-channel-session.ts +0 -61
- package/src/internal/deploy-client.ts +0 -1574
- package/src/internal/deploy-manifest.ts +0 -361
- package/src/internal/deploy-source.ts +0 -144
- package/src/internal/describe-error.ts +0 -32
- package/src/internal/dev-mode.ts +0 -20
- package/src/internal/discovery/agent-config.ts +0 -288
- package/src/internal/discovery/agent.ts +0 -381
- package/src/internal/discovery/channels.ts +0 -100
- package/src/internal/discovery/connections.ts +0 -516
- package/src/internal/discovery/context.ts +0 -38
- package/src/internal/discovery/cursor-plugin.ts +0 -628
- package/src/internal/discovery/extension-overlay.ts +0 -247
- package/src/internal/discovery/extensions.ts +0 -490
- package/src/internal/discovery/fs.ts +0 -103
- package/src/internal/discovery/hooks.ts +0 -63
- package/src/internal/discovery/info.ts +0 -174
- package/src/internal/discovery/instructions.ts +0 -98
- package/src/internal/discovery/modules.ts +0 -107
- package/src/internal/discovery/names.ts +0 -45
- package/src/internal/discovery/project.ts +0 -319
- package/src/internal/discovery/reminders.ts +0 -65
- package/src/internal/discovery/runtime.ts +0 -158
- package/src/internal/discovery/schedules.ts +0 -120
- package/src/internal/discovery/seed-files.ts +0 -34
- package/src/internal/discovery/services.ts +0 -151
- package/src/internal/discovery/skills.ts +0 -174
- package/src/internal/discovery/subagent.ts +0 -138
- package/src/internal/discovery/tools.ts +0 -170
- package/src/internal/discovery.ts +0 -27
- package/src/internal/distribution.ts +0 -126
- package/src/internal/docs-site.ts +0 -248
- package/src/internal/duration.ts +0 -37
- package/src/internal/env-file.ts +0 -83
- package/src/internal/eval-judge-model.ts +0 -142
- package/src/internal/eval-run-store.ts +0 -585
- package/src/internal/eval-runner.ts +0 -823
- package/src/internal/evals-client.ts +0 -475
- package/src/internal/event-log.ts +0 -342
- package/src/internal/event-mapper.ts +0 -811
- package/src/internal/expected-delivery-failure.ts +0 -34
- package/src/internal/factory-resource-channel.ts +0 -103
- package/src/internal/filesystem/errors.ts +0 -207
- package/src/internal/filesystem/format.ts +0 -253
- package/src/internal/filesystem/merge.ts +0 -192
- package/src/internal/filesystem/nearest.ts +0 -112
- package/src/internal/filesystem/scratch.ts +0 -239
- package/src/internal/filesystem/sdk-schemas.ts +0 -204
- package/src/internal/filesystem/tools.ts +0 -804
- package/src/internal/filesystem/walk.ts +0 -366
- package/src/internal/fixtures/units-server.ts +0 -52
- package/src/internal/framework-file-storage.ts +0 -357
- package/src/internal/framework-storage-selection.ts +0 -156
- package/src/internal/frontmatter.ts +0 -108
- package/src/internal/github-fanout.ts +0 -144
- package/src/internal/guest-network.ts +0 -391
- package/src/internal/handleAgentServeTrigger.ts +0 -286
- package/src/internal/host-files.ts +0 -341
- package/src/internal/host-kv.ts +0 -81
- package/src/internal/host-otel.ts +0 -231
- package/src/internal/host-platforms.ts +0 -170
- package/src/internal/hosted-admission-adapter.ts +0 -47
- package/src/internal/hosted-admission-context.ts +0 -37
- package/src/internal/hosted-catch-protocol.ts +0 -112
- package/src/internal/hosted-catch.ts +0 -179
- package/src/internal/hosted-delivery-protocol.ts +0 -824
- package/src/internal/hosted-delivery.ts +0 -1410
- package/src/internal/hosted-execution-diag.ts +0 -291
- package/src/internal/hosted-execution-flush.ts +0 -136
- package/src/internal/hosted-execution-latency.ts +0 -301
- package/src/internal/hosted-managed-automation.ts +0 -116
- package/src/internal/hosting.ts +0 -114
- package/src/internal/http-channel-define.ts +0 -25
- package/src/internal/http-channel.ts +0 -669
- package/src/internal/http-control-plane-session.ts +0 -110
- package/src/internal/ids.ts +0 -39
- package/src/internal/incoming-headers-to-fetch.ts +0 -45
- package/src/internal/init-interview.ts +0 -360
- package/src/internal/init-project.ts +0 -711
- package/src/internal/init-scaffold.ts +0 -182
- package/src/internal/inline-stdio-define-stub.ts +0 -4
- package/src/internal/inline-stdio-mcp.ts +0 -230
- package/src/internal/install-cursor-skills.ts +0 -604
- package/src/internal/is-record.ts +0 -3
- package/src/internal/json-schema.ts +0 -95
- package/src/internal/legacy-command-guard.ts +0 -66
- package/src/internal/listen-port.ts +0 -85
- package/src/internal/local-control-plane.ts +0 -442
- package/src/internal/local-env.ts +0 -59
- package/src/internal/local-ingress.ts +0 -90
- package/src/internal/log-ring.ts +0 -59
- package/src/internal/logs-client.ts +0 -477
- package/src/internal/map-pool.ts +0 -39
- package/src/internal/mcp-endpoint.ts +0 -747
- package/src/internal/mcp-host.ts +0 -509
- package/src/internal/mcp-oauth-on-demand.ts +0 -337
- package/src/internal/mcp-oauth-persist.ts +0 -118
- package/src/internal/mcp-oauth.ts +0 -549
- package/src/internal/net.ts +0 -29
- package/src/internal/open-browser.ts +0 -41
- package/src/internal/otel/attrs.ts +0 -16
- package/src/internal/otel/collector.ts +0 -937
- package/src/internal/otel/config.ts +0 -287
- package/src/internal/otel/http.ts +0 -122
- package/src/internal/otel/mcp.ts +0 -56
- package/src/internal/otel/propagation.ts +0 -17
- package/src/internal/otel/runtime.ts +0 -441
- package/src/internal/package-inline-stdio.ts +0 -114
- package/src/internal/peer-connections.ts +0 -96
- package/src/internal/platform-schedule-sync.ts +0 -75
- package/src/internal/platform-timers.ts +0 -365
- package/src/internal/playground/static.ts +0 -278
- package/src/internal/playground/toolchain.ts +0 -270
- package/src/internal/playground-proxy.ts +0 -564
- package/src/internal/process-memory-telemetry.ts +0 -334
- package/src/internal/project-layout.ts +0 -31
- package/src/internal/prompt-context.ts +0 -116
- package/src/internal/reminder-control-plane-protocol.ts +0 -482
- package/src/internal/reminder-runner.ts +0 -1559
- package/src/internal/reminder-schedule.ts +0 -104
- package/src/internal/reminder-store.ts +0 -176
- package/src/internal/request-error-status.ts +0 -95
- package/src/internal/request-headers.ts +0 -21
- package/src/internal/resolve-prod-target.ts +0 -334
- package/src/internal/resolved-connections.ts +0 -190
- package/src/internal/router.ts +0 -143
- package/src/internal/run-client.ts +0 -354
- package/src/internal/runtime-dispatch-runner.ts +0 -50
- package/src/internal/sanitize-mcp-tool-name.ts +0 -31
- package/src/internal/schedule-runner.ts +0 -154
- package/src/internal/scm/pr-url.ts +0 -245
- package/src/internal/sdk-runner.ts +0 -959
- package/src/internal/serve-restart.ts +0 -113
- package/src/internal/server.ts +0 -3147
- package/src/internal/session-cost.ts +0 -208
- package/src/internal/session-engine.ts +0 -5622
- package/src/internal/session-links.ts +0 -84
- package/src/internal/session-run-log.ts +0 -535
- package/src/internal/session-store.ts +0 -307
- package/src/internal/session-urls.ts +0 -32
- package/src/internal/sessions-client.ts +0 -239
- package/src/internal/skill-catalog.ts +0 -66
- package/src/internal/skills-sync.ts +0 -55
- package/src/internal/slack-provision-client.ts +0 -544
- package/src/internal/slack-thread-key.ts +0 -11
- package/src/internal/sleep.ts +0 -3
- package/src/internal/start-log-store.ts +0 -164
- package/src/internal/steering.ts +0 -17
- package/src/internal/storage-coordinator.ts +0 -800
- package/src/internal/storage-roles.ts +0 -86
- package/src/internal/storage.ts +0 -1
- package/src/internal/store-api-protocol.ts +0 -205
- package/src/internal/store-mirror.ts +0 -73
- package/src/internal/stream-progress.ts +0 -294
- package/src/internal/terminal-style.ts +0 -133
- package/src/internal/testing/factory-resource-fixtures.ts +0 -84
- package/src/internal/testing/scm-continuation-fixtures.ts +0 -285
- package/src/internal/tool-catalog.ts +0 -104
- package/src/internal/tool-policy.ts +0 -222
- package/src/internal/tool-result.ts +0 -50
- package/src/internal/trajectory.ts +0 -418
- package/src/internal/turn-cost.ts +0 -136
- package/src/internal/turn-governor.ts +0 -145
- package/src/internal/turn-lease-store.ts +0 -144
- package/src/internal/turn-outbox.ts +0 -77
- package/src/internal/update-check.ts +0 -517
- package/src/internal/v2-hosting.ts +0 -52
- package/src/internal/workspace-sync.ts +0 -114
- package/src/internal/workspace.ts +0 -505
- package/src/kv/memory-kv.ts +0 -94
- package/src/kv.ts +0 -18
- package/src/memory.ts +0 -487
- package/src/otel-public.ts +0 -24
- package/src/otel.ts +0 -320
- package/src/prompt.ts +0 -80
- package/src/reminders.ts +0 -65
- package/src/schedules.ts +0 -31
- package/src/skills.ts +0 -27
- package/src/storage-backends/cursor-hosted-v2.ts +0 -204
- package/src/storage-backends/cursor-hosted.ts +0 -388
- package/src/storage-backends/file-kv.ts +0 -276
- package/src/storage-protocol.ts +0 -261
- package/src/storage.ts +0 -408
- package/src/tools.ts +0 -166
- package/src/types.ts +0 -3776
- /package/dist/docs/assets/{reference_agent-config.md.DzGI777n.lean.js → reference_agent-config.md.Cj5uBKp4.lean.js} +0 -0
|
@@ -1,761 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Slack Web API helpers used by the channel pack (`@slack/web-api`).
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { ErrorCode, type WebAPIPlatformError, WebClient } from "@slack/web-api";
|
|
6
|
-
import { slackifyMarkdown } from "slackify-markdown";
|
|
7
|
-
import { slackThreadKey } from "../../internal/slack-thread-key.js";
|
|
8
|
-
import type { ArtifactsApi, HostContext } from "../../types.js";
|
|
9
|
-
import { highlightCodeFences } from "./code-fences.js";
|
|
10
|
-
import {
|
|
11
|
-
SLACK_DEFAULT_LOADING_MESSAGES,
|
|
12
|
-
SLACK_LOADING_MESSAGE_MAX_LEN,
|
|
13
|
-
SLACK_LOADING_MESSAGES_MAX,
|
|
14
|
-
SLACK_STATUS_MAX_LEN,
|
|
15
|
-
SLACK_TITLE_MAX_LEN,
|
|
16
|
-
SLACK_TYPING_MIN_INTERVAL_MS,
|
|
17
|
-
SLACK_UNSUPPORTED_ERRORS,
|
|
18
|
-
} from "./constants.js";
|
|
19
|
-
import { tryResolveAppToken, tryResolveBotToken } from "./credentials.js";
|
|
20
|
-
import { defaultSlackLog, type SlackLog } from "./log.js";
|
|
21
|
-
import type { StreamChunk } from "./stream.js";
|
|
22
|
-
import type {
|
|
23
|
-
SlackApiTransport,
|
|
24
|
-
SlackBinding,
|
|
25
|
-
SlackBotToken,
|
|
26
|
-
SlackCredentials,
|
|
27
|
-
SlackSuggestedPrompt,
|
|
28
|
-
SoftSlackResult,
|
|
29
|
-
} from "./types.js";
|
|
30
|
-
|
|
31
|
-
/** Whether a bot token slot holds an API transport instead of a token. */
|
|
32
|
-
export function isSlackApiTransport(token: SlackBotToken | undefined): token is SlackApiTransport {
|
|
33
|
-
return (
|
|
34
|
-
typeof token === "object" &&
|
|
35
|
-
token !== null &&
|
|
36
|
-
(token as SlackApiTransport).kind === "api-transport"
|
|
37
|
-
);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export async function resolveBotToken(credentials: SlackCredentials | undefined): Promise<string> {
|
|
41
|
-
const token = await tryResolveBotToken(credentials);
|
|
42
|
-
if (token === undefined) {
|
|
43
|
-
throw new Error(
|
|
44
|
-
"SLACK_BOT_TOKEN is required (set credentials.botToken, envPrefix, or the env var).",
|
|
45
|
-
);
|
|
46
|
-
}
|
|
47
|
-
return token;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/** Resolve the Socket Mode app-level token (`xapp-…`). */
|
|
51
|
-
export async function resolveAppToken(credentials: SlackCredentials | undefined): Promise<string> {
|
|
52
|
-
const token = await tryResolveAppToken(credentials);
|
|
53
|
-
if (token === undefined) {
|
|
54
|
-
throw new Error(
|
|
55
|
-
"SLACK_APP_TOKEN is required for Socket Mode (set credentials.appToken, envPrefix, or the env var).",
|
|
56
|
-
);
|
|
57
|
-
}
|
|
58
|
-
return token;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/** Channel-local continuation key. IMs are the channel; threads keep ts. */
|
|
62
|
-
export function slackContinuationKey(channelId: string, threadTs: string): string {
|
|
63
|
-
return slackThreadKey(channelId, threadTs);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
function isPlatformError(error: unknown): error is WebAPIPlatformError {
|
|
67
|
-
return (
|
|
68
|
-
typeof error === "object" &&
|
|
69
|
-
error !== null &&
|
|
70
|
-
"code" in error &&
|
|
71
|
-
(error as { code: unknown }).code === ErrorCode.PlatformError &&
|
|
72
|
-
"data" in error
|
|
73
|
-
);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
async function createWebClient(botToken: SlackBotToken | undefined): Promise<WebClient> {
|
|
77
|
-
return new WebClient(await resolveBotToken({ botToken }));
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* Call a Slack Web API method. Platform errors (`ok: false`) are returned as
|
|
82
|
-
* the response body (not thrown) so callers can soft-fail cleanly. When the
|
|
83
|
-
* bot token slot holds a {@link SlackApiTransport} (e.g. the Cursor account
|
|
84
|
-
* proxy), the call is executed by the transport instead of `@slack/web-api`.
|
|
85
|
-
*/
|
|
86
|
-
export async function callSlackApi(args: {
|
|
87
|
-
botToken: SlackBotToken | undefined;
|
|
88
|
-
operation: string;
|
|
89
|
-
body: Record<string, unknown>;
|
|
90
|
-
}): Promise<Record<string, unknown>> {
|
|
91
|
-
if (isSlackApiTransport(args.botToken)) {
|
|
92
|
-
return args.botToken.call(args.operation, args.body);
|
|
93
|
-
}
|
|
94
|
-
const client = await createWebClient(args.botToken);
|
|
95
|
-
try {
|
|
96
|
-
const result = await client.apiCall(args.operation, args.body);
|
|
97
|
-
return result as unknown as Record<string, unknown>;
|
|
98
|
-
} catch (error) {
|
|
99
|
-
if (isPlatformError(error)) {
|
|
100
|
-
return error.data as unknown as Record<string, unknown>;
|
|
101
|
-
}
|
|
102
|
-
throw error;
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
/**
|
|
107
|
-
* Soft-fail wrapper: never throws for Slack API errors. Network/throw
|
|
108
|
-
* errors become `{ ok: false, error }`. Unsupported feature errors set
|
|
109
|
-
* `unsupported: true`.
|
|
110
|
-
*/
|
|
111
|
-
export async function callSlackApiSoft(args: {
|
|
112
|
-
botToken: SlackBotToken | undefined;
|
|
113
|
-
operation: string;
|
|
114
|
-
body: Record<string, unknown>;
|
|
115
|
-
}): Promise<SoftSlackResult> {
|
|
116
|
-
try {
|
|
117
|
-
const response = await callSlackApi(args);
|
|
118
|
-
if (response.ok === true) {
|
|
119
|
-
return { ok: true, ...response };
|
|
120
|
-
}
|
|
121
|
-
const error = typeof response.error === "string" ? response.error : "unknown_error";
|
|
122
|
-
return {
|
|
123
|
-
ok: false,
|
|
124
|
-
error,
|
|
125
|
-
...(SLACK_UNSUPPORTED_ERRORS.has(error) ? { unsupported: true } : {}),
|
|
126
|
-
};
|
|
127
|
-
} catch (error) {
|
|
128
|
-
return {
|
|
129
|
-
ok: false,
|
|
130
|
-
error: error instanceof Error ? error.message : String(error),
|
|
131
|
-
};
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
export function truncateTypingStatus(status: string, max?: number): string {
|
|
136
|
-
const limit = max ?? SLACK_STATUS_MAX_LEN;
|
|
137
|
-
const trimmed = status.trim().replace(/\s+/g, " ");
|
|
138
|
-
if (trimmed.length <= limit) {
|
|
139
|
-
return trimmed;
|
|
140
|
-
}
|
|
141
|
-
return `${trimmed.slice(0, limit - 1)}…`;
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
/**
|
|
145
|
-
* Slack caps `loading_messages` at 5. When the cleaned list is longer,
|
|
146
|
-
* send a wrapping time-based window of 5 so later strings still appear.
|
|
147
|
-
*/
|
|
148
|
-
export function truncateLoadingMessages(messages: string[], nowMs: number = Date.now()): string[] {
|
|
149
|
-
const cleaned = messages
|
|
150
|
-
.map(message => truncateTypingStatus(message, SLACK_LOADING_MESSAGE_MAX_LEN))
|
|
151
|
-
.filter(message => message.length > 0);
|
|
152
|
-
if (cleaned.length <= SLACK_LOADING_MESSAGES_MAX) {
|
|
153
|
-
return cleaned;
|
|
154
|
-
}
|
|
155
|
-
const start = Math.floor(nowMs / SLACK_TYPING_MIN_INTERVAL_MS) % cleaned.length;
|
|
156
|
-
const window: string[] = [];
|
|
157
|
-
for (let i = 0; i < SLACK_LOADING_MESSAGES_MAX; i++) {
|
|
158
|
-
const message = cleaned[(start + i) % cleaned.length];
|
|
159
|
-
if (message === undefined) {
|
|
160
|
-
break;
|
|
161
|
-
}
|
|
162
|
-
window.push(message);
|
|
163
|
-
}
|
|
164
|
-
return window;
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
export function truncateTitle(title: string, max?: number): string {
|
|
168
|
-
const limit = max ?? SLACK_TITLE_MAX_LEN;
|
|
169
|
-
const trimmed = title.trim().replace(/\s+/g, " ");
|
|
170
|
-
if (trimmed.length <= limit) {
|
|
171
|
-
return trimmed;
|
|
172
|
-
}
|
|
173
|
-
return `${trimmed.slice(0, limit - 1)}…`;
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
// ---------------------------------------------------------------------------
|
|
177
|
-
// Assistant / stream helpers
|
|
178
|
-
// ---------------------------------------------------------------------------
|
|
179
|
-
|
|
180
|
-
/**
|
|
181
|
-
* Show or clear the status chip under the thread.
|
|
182
|
-
*
|
|
183
|
-
* Status text goes through `assistant.threads.setStatus` alone. The agent
|
|
184
|
-
* session is only written when clearing: Agent UX ignores an empty assistant
|
|
185
|
-
* status, so `agents.sessions.setStatus` `active` is what actually drops the
|
|
186
|
-
* chip. That same write must not accompany status text — Slack applies it
|
|
187
|
-
* asynchronously and it blanks the chip when it lands after the text, which
|
|
188
|
-
* reads as flicker between updates. A `processing` write would be worse:
|
|
189
|
-
* Agent UX paints its own generic "is working…" over the assistant text
|
|
190
|
-
* while the session is `processing`. An open `chat.startStream` also flips
|
|
191
|
-
* the session to `processing` on Slack's side, so status text only shows on
|
|
192
|
-
* non-streaming turns. The empty assistant call stays for older workspaces.
|
|
193
|
-
*/
|
|
194
|
-
export async function setThreadStatus(args: {
|
|
195
|
-
botToken: SlackBotToken | undefined;
|
|
196
|
-
channelId: string;
|
|
197
|
-
threadTs: string;
|
|
198
|
-
status: string;
|
|
199
|
-
loadingMessages?: string[];
|
|
200
|
-
}): Promise<SoftSlackResult> {
|
|
201
|
-
if (args.channelId === "" || args.threadTs === "") {
|
|
202
|
-
return { ok: false, error: "missing_channel_or_thread" };
|
|
203
|
-
}
|
|
204
|
-
const status = truncateTypingStatus(args.status);
|
|
205
|
-
const body: Record<string, unknown> = {
|
|
206
|
-
channel_id: args.channelId,
|
|
207
|
-
thread_ts: args.threadTs,
|
|
208
|
-
status,
|
|
209
|
-
};
|
|
210
|
-
|
|
211
|
-
if (status.length > 0) {
|
|
212
|
-
const loadingRaw =
|
|
213
|
-
args.loadingMessages !== undefined && args.loadingMessages.length > 0
|
|
214
|
-
? args.loadingMessages
|
|
215
|
-
: [status, ...SLACK_DEFAULT_LOADING_MESSAGES.filter(m => m !== status)];
|
|
216
|
-
const loading_messages = truncateLoadingMessages(loadingRaw);
|
|
217
|
-
if (loading_messages.length > 0) {
|
|
218
|
-
body.loading_messages = loading_messages;
|
|
219
|
-
}
|
|
220
|
-
return callSlackApiSoft({
|
|
221
|
-
botToken: args.botToken,
|
|
222
|
-
operation: "assistant.threads.setStatus",
|
|
223
|
-
body,
|
|
224
|
-
});
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
const sessionResult = await callSlackApiSoft({
|
|
228
|
-
botToken: args.botToken,
|
|
229
|
-
operation: "agents.sessions.setStatus",
|
|
230
|
-
body: {
|
|
231
|
-
channel_id: args.channelId,
|
|
232
|
-
thread_ts: args.threadTs,
|
|
233
|
-
status: "active",
|
|
234
|
-
},
|
|
235
|
-
});
|
|
236
|
-
const assistantResult = await callSlackApiSoft({
|
|
237
|
-
botToken: args.botToken,
|
|
238
|
-
operation: "assistant.threads.setStatus",
|
|
239
|
-
body,
|
|
240
|
-
});
|
|
241
|
-
|
|
242
|
-
if (sessionResult.ok) {
|
|
243
|
-
return sessionResult;
|
|
244
|
-
}
|
|
245
|
-
if (sessionResult.unsupported === true || assistantResult.ok) {
|
|
246
|
-
return assistantResult;
|
|
247
|
-
}
|
|
248
|
-
return sessionResult;
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
export async function setThreadTitle(args: {
|
|
252
|
-
botToken: SlackBotToken | undefined;
|
|
253
|
-
channelId: string;
|
|
254
|
-
threadTs: string;
|
|
255
|
-
title: string;
|
|
256
|
-
}): Promise<SoftSlackResult> {
|
|
257
|
-
return callSlackApiSoft({
|
|
258
|
-
botToken: args.botToken,
|
|
259
|
-
operation: "assistant.threads.setTitle",
|
|
260
|
-
body: {
|
|
261
|
-
channel_id: args.channelId,
|
|
262
|
-
thread_ts: args.threadTs,
|
|
263
|
-
title: truncateTitle(args.title),
|
|
264
|
-
},
|
|
265
|
-
});
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
export async function setSuggestedPrompts(args: {
|
|
269
|
-
botToken: SlackBotToken | undefined;
|
|
270
|
-
channelId: string;
|
|
271
|
-
threadTs?: string;
|
|
272
|
-
prompts: SlackSuggestedPrompt[];
|
|
273
|
-
title?: string;
|
|
274
|
-
}): Promise<SoftSlackResult> {
|
|
275
|
-
const body: Record<string, unknown> = {
|
|
276
|
-
channel_id: args.channelId,
|
|
277
|
-
prompts: args.prompts.map(p => ({
|
|
278
|
-
title: p.title,
|
|
279
|
-
message: p.message,
|
|
280
|
-
})),
|
|
281
|
-
};
|
|
282
|
-
if (args.threadTs !== undefined && args.threadTs !== "") {
|
|
283
|
-
body.thread_ts = args.threadTs;
|
|
284
|
-
}
|
|
285
|
-
if (args.title !== undefined && args.title !== "") {
|
|
286
|
-
body.title = args.title;
|
|
287
|
-
}
|
|
288
|
-
return callSlackApiSoft({
|
|
289
|
-
botToken: args.botToken,
|
|
290
|
-
operation: "assistant.threads.setSuggestedPrompts",
|
|
291
|
-
body,
|
|
292
|
-
});
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
export async function startChatStream(args: {
|
|
296
|
-
botToken: SlackBotToken | undefined;
|
|
297
|
-
channel: string;
|
|
298
|
-
thread_ts?: string;
|
|
299
|
-
markdown_text?: string;
|
|
300
|
-
chunks?: StreamChunk[];
|
|
301
|
-
recipient_user_id?: string;
|
|
302
|
-
recipient_team_id?: string;
|
|
303
|
-
}): Promise<SoftSlackResult<{ ts: string; channel: string }>> {
|
|
304
|
-
const body: Record<string, unknown> = {
|
|
305
|
-
channel: args.channel,
|
|
306
|
-
};
|
|
307
|
-
// Empty markdown_text is rejected or opens a stream the assistant pane
|
|
308
|
-
// never attaches. Recipients are required outside DMs.
|
|
309
|
-
if (args.thread_ts !== undefined && args.thread_ts !== "") {
|
|
310
|
-
body.thread_ts = args.thread_ts;
|
|
311
|
-
}
|
|
312
|
-
if (args.markdown_text !== undefined && args.markdown_text !== "") {
|
|
313
|
-
body.markdown_text = args.markdown_text;
|
|
314
|
-
}
|
|
315
|
-
if (args.chunks !== undefined && args.chunks.length > 0) {
|
|
316
|
-
body.chunks = args.chunks;
|
|
317
|
-
}
|
|
318
|
-
if (args.recipient_user_id !== undefined && args.recipient_user_id !== "") {
|
|
319
|
-
body.recipient_user_id = args.recipient_user_id;
|
|
320
|
-
}
|
|
321
|
-
if (args.recipient_team_id !== undefined && args.recipient_team_id !== "") {
|
|
322
|
-
body.recipient_team_id = args.recipient_team_id;
|
|
323
|
-
}
|
|
324
|
-
const result = await callSlackApiSoft({
|
|
325
|
-
botToken: args.botToken,
|
|
326
|
-
operation: "chat.startStream",
|
|
327
|
-
body,
|
|
328
|
-
});
|
|
329
|
-
if (!result.ok) {
|
|
330
|
-
return result;
|
|
331
|
-
}
|
|
332
|
-
const ts = typeof result.ts === "string" ? result.ts : "";
|
|
333
|
-
const channel = typeof result.channel === "string" ? result.channel : args.channel;
|
|
334
|
-
if (ts === "") {
|
|
335
|
-
return { ok: false, error: "missing_ts" };
|
|
336
|
-
}
|
|
337
|
-
return { ok: true, ts, channel };
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
export async function appendChatStream(args: {
|
|
341
|
-
botToken: SlackBotToken | undefined;
|
|
342
|
-
channel: string;
|
|
343
|
-
ts: string;
|
|
344
|
-
markdown_text?: string;
|
|
345
|
-
chunks?: StreamChunk[];
|
|
346
|
-
}): Promise<SoftSlackResult> {
|
|
347
|
-
const body: Record<string, unknown> = {
|
|
348
|
-
channel: args.channel,
|
|
349
|
-
ts: args.ts,
|
|
350
|
-
};
|
|
351
|
-
if (args.markdown_text !== undefined) {
|
|
352
|
-
body.markdown_text = args.markdown_text;
|
|
353
|
-
}
|
|
354
|
-
if (args.chunks !== undefined && args.chunks.length > 0) {
|
|
355
|
-
body.chunks = args.chunks;
|
|
356
|
-
}
|
|
357
|
-
return callSlackApiSoft({
|
|
358
|
-
botToken: args.botToken,
|
|
359
|
-
operation: "chat.appendStream",
|
|
360
|
-
body,
|
|
361
|
-
});
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
export async function stopChatStream(args: {
|
|
365
|
-
botToken: SlackBotToken | undefined;
|
|
366
|
-
channel: string;
|
|
367
|
-
ts: string;
|
|
368
|
-
markdown_text?: string;
|
|
369
|
-
chunks?: StreamChunk[];
|
|
370
|
-
blocks?: unknown[];
|
|
371
|
-
}): Promise<SoftSlackResult> {
|
|
372
|
-
const body: Record<string, unknown> = {
|
|
373
|
-
channel: args.channel,
|
|
374
|
-
ts: args.ts,
|
|
375
|
-
};
|
|
376
|
-
if (args.markdown_text !== undefined) {
|
|
377
|
-
body.markdown_text = args.markdown_text;
|
|
378
|
-
}
|
|
379
|
-
if (args.chunks !== undefined && args.chunks.length > 0) {
|
|
380
|
-
body.chunks = args.chunks;
|
|
381
|
-
}
|
|
382
|
-
if (args.blocks !== undefined && args.blocks.length > 0) {
|
|
383
|
-
body.blocks = args.blocks;
|
|
384
|
-
}
|
|
385
|
-
return callSlackApiSoft({
|
|
386
|
-
botToken: args.botToken,
|
|
387
|
-
operation: "chat.stopStream",
|
|
388
|
-
body,
|
|
389
|
-
});
|
|
390
|
-
}
|
|
391
|
-
|
|
392
|
-
const SLACK_MRKDWN_LITERAL_PATTERN = /<(?:[@#!][^>\r\n]+|(?:https?|ftp|mailto|tel):[^>\r\n]+)>/gi;
|
|
393
|
-
const SLACK_MRKDWN_LINK_PATTERN = /<https?:\/\/[^|>]+\|/;
|
|
394
|
-
|
|
395
|
-
/**
|
|
396
|
-
* Convert CommonMark accepted by `markdown_text` to Slack's legacy mrkdwn
|
|
397
|
-
* without letting the CommonMark parser reinterpret Slack-native syntax.
|
|
398
|
-
*/
|
|
399
|
-
export function markdownToSlackMrkdwn(markdown: string): string {
|
|
400
|
-
const literals: string[] = [];
|
|
401
|
-
const placeholder = (index: number): string => `\ue000SLACK_LITERAL_${index}\ue001`;
|
|
402
|
-
const protectedMarkdown = markdown.replace(SLACK_MRKDWN_LITERAL_PATTERN, literal => {
|
|
403
|
-
const index = literals.push(literal) - 1;
|
|
404
|
-
return placeholder(index);
|
|
405
|
-
});
|
|
406
|
-
|
|
407
|
-
let converted = slackifyMarkdown(protectedMarkdown);
|
|
408
|
-
if (!markdown.endsWith("\n") && converted.endsWith("\n")) {
|
|
409
|
-
converted = converted.slice(0, -1);
|
|
410
|
-
}
|
|
411
|
-
for (const [index, literal] of literals.entries()) {
|
|
412
|
-
converted = converted.replaceAll(placeholder(index), literal);
|
|
413
|
-
}
|
|
414
|
-
return converted;
|
|
415
|
-
}
|
|
416
|
-
|
|
417
|
-
function requiresMrkdwnText(text: string): boolean {
|
|
418
|
-
return text.includes("<!subteam^") || SLACK_MRKDWN_LINK_PATTERN.test(text);
|
|
419
|
-
}
|
|
420
|
-
|
|
421
|
-
export async function postMessage(args: {
|
|
422
|
-
botToken: SlackBotToken | undefined;
|
|
423
|
-
channel: string;
|
|
424
|
-
text: string;
|
|
425
|
-
threadTs?: string;
|
|
426
|
-
blocks?: unknown[];
|
|
427
|
-
/**
|
|
428
|
-
* Skip `markdown_text` and post with plain `text` only (Deploy Buddy /
|
|
429
|
-
* host-report pattern). Prefer this for large structured bodies — Slack
|
|
430
|
-
* `markdown_text` hard-caps at 12k while `text` allows ~40k.
|
|
431
|
-
*/
|
|
432
|
-
plainText?: boolean;
|
|
433
|
-
/** Slack message metadata (`{ event_type, event_payload }`). */
|
|
434
|
-
metadata?: Record<string, unknown>;
|
|
435
|
-
}): Promise<{ ts: string; channel: string }> {
|
|
436
|
-
// Slack treats markdown_text as mutually exclusive with text and blocks
|
|
437
|
-
// (error: markdown_text_conflict). Prefer markdown when we have no
|
|
438
|
-
// blocks; with Block Kit or plainText, use text as body/fallback.
|
|
439
|
-
const base: Record<string, unknown> = {
|
|
440
|
-
channel: args.channel,
|
|
441
|
-
unfurl_links: false,
|
|
442
|
-
unfurl_media: false,
|
|
443
|
-
};
|
|
444
|
-
if (args.threadTs !== undefined && args.threadTs !== "") {
|
|
445
|
-
base.thread_ts = args.threadTs;
|
|
446
|
-
}
|
|
447
|
-
if (args.metadata !== undefined) {
|
|
448
|
-
base.metadata = args.metadata;
|
|
449
|
-
}
|
|
450
|
-
const hasBlocks = args.blocks !== undefined && args.blocks.length > 0;
|
|
451
|
-
const convertToMrkdwn = args.plainText !== true && !hasBlocks && requiresMrkdwnText(args.text);
|
|
452
|
-
// User-group mentions (`<!subteam^…>`) and Slack mrkdwn links
|
|
453
|
-
// (`<https://…|label>`) only render correctly via mrkdwn `text`,
|
|
454
|
-
// not `markdown_text`.
|
|
455
|
-
const useText = args.plainText === true || hasBlocks || convertToMrkdwn;
|
|
456
|
-
|
|
457
|
-
let response: Record<string, unknown>;
|
|
458
|
-
if (useText) {
|
|
459
|
-
response = await callSlackApi({
|
|
460
|
-
botToken: args.botToken,
|
|
461
|
-
operation: "chat.postMessage",
|
|
462
|
-
body: {
|
|
463
|
-
...base,
|
|
464
|
-
text: convertToMrkdwn ? markdownToSlackMrkdwn(args.text) : args.text,
|
|
465
|
-
...(hasBlocks ? { blocks: args.blocks } : {}),
|
|
466
|
-
},
|
|
467
|
-
});
|
|
468
|
-
} else {
|
|
469
|
-
response = await callSlackApi({
|
|
470
|
-
botToken: args.botToken,
|
|
471
|
-
operation: "chat.postMessage",
|
|
472
|
-
body: {
|
|
473
|
-
...base,
|
|
474
|
-
markdown_text: highlightCodeFences(args.text),
|
|
475
|
-
},
|
|
476
|
-
});
|
|
477
|
-
// Older workspaces / scopes may not accept markdown_text — retry with text.
|
|
478
|
-
// Also fall back when markdown_text hits its 12k limit (msg_too_long) while
|
|
479
|
-
// plain text still allows up to ~40k.
|
|
480
|
-
if (
|
|
481
|
-
response.ok !== true &&
|
|
482
|
-
(response.error === "markdown_text_conflict" ||
|
|
483
|
-
response.error === "invalid_arguments" ||
|
|
484
|
-
response.error === "invalid_blocks" ||
|
|
485
|
-
response.error === "msg_too_long" ||
|
|
486
|
-
SLACK_UNSUPPORTED_ERRORS.has(String(response.error ?? "")))
|
|
487
|
-
) {
|
|
488
|
-
response = await callSlackApi({
|
|
489
|
-
botToken: args.botToken,
|
|
490
|
-
operation: "chat.postMessage",
|
|
491
|
-
body: {
|
|
492
|
-
...base,
|
|
493
|
-
text: markdownToSlackMrkdwn(args.text),
|
|
494
|
-
},
|
|
495
|
-
});
|
|
496
|
-
}
|
|
497
|
-
}
|
|
498
|
-
if (response.ok !== true) {
|
|
499
|
-
throw new Error(`Slack chat.postMessage failed: ${String(response.error ?? "unknown_error")}`);
|
|
500
|
-
}
|
|
501
|
-
// Slack requires thread_ts as a string. A numeric ts (JSON number) silently
|
|
502
|
-
// drops threading server-side — never coerce via Number.
|
|
503
|
-
const ts = typeof response.ts === "string" ? response.ts : "";
|
|
504
|
-
if (ts === "") {
|
|
505
|
-
throw new Error(`Slack chat.postMessage ok but missing string ts (got ${typeof response.ts})`);
|
|
506
|
-
}
|
|
507
|
-
// When we asked to thread, confirm Slack honored it — but only when the
|
|
508
|
-
// response includes a thread_ts. Some proxy / customize-username payloads
|
|
509
|
-
// omit `message.thread_ts` even for successful threaded posts; treating
|
|
510
|
-
// that as failure retries (or deletes) replies and leaves empty threads.
|
|
511
|
-
const requestedThreadTs = args.threadTs;
|
|
512
|
-
if (requestedThreadTs !== undefined && requestedThreadTs !== "") {
|
|
513
|
-
const message = response.message;
|
|
514
|
-
if (typeof message === "object" && message !== null && !Array.isArray(message)) {
|
|
515
|
-
const applied =
|
|
516
|
-
typeof (message as { thread_ts?: unknown }).thread_ts === "string"
|
|
517
|
-
? (message as { thread_ts: string }).thread_ts
|
|
518
|
-
: "";
|
|
519
|
-
if (applied !== "" && applied !== requestedThreadTs) {
|
|
520
|
-
throw new Error(
|
|
521
|
-
`Slack chat.postMessage ignored thread_ts (requested ${requestedThreadTs}, got ${applied})`,
|
|
522
|
-
);
|
|
523
|
-
}
|
|
524
|
-
}
|
|
525
|
-
}
|
|
526
|
-
// Slack returns the resolved channel ID (C…) even when the request used a name.
|
|
527
|
-
const channel =
|
|
528
|
-
typeof response.channel === "string" && response.channel !== ""
|
|
529
|
-
? response.channel
|
|
530
|
-
: args.channel;
|
|
531
|
-
return { ts, channel };
|
|
532
|
-
}
|
|
533
|
-
|
|
534
|
-
/** Replace an existing message (e.g. strip Approve/Deny after a decision). */
|
|
535
|
-
export async function updateMessage(args: {
|
|
536
|
-
botToken: SlackBotToken | undefined;
|
|
537
|
-
channel: string;
|
|
538
|
-
ts: string;
|
|
539
|
-
text: string;
|
|
540
|
-
blocks?: unknown[];
|
|
541
|
-
/** Skip `markdown_text` and update with plain `text` only. */
|
|
542
|
-
plainText?: boolean;
|
|
543
|
-
}): Promise<SoftSlackResult> {
|
|
544
|
-
const base: Record<string, unknown> = {
|
|
545
|
-
channel: args.channel,
|
|
546
|
-
ts: args.ts,
|
|
547
|
-
};
|
|
548
|
-
const useRawText = args.blocks !== undefined || args.plainText === true;
|
|
549
|
-
const convertToMrkdwn = !useRawText && requiresMrkdwnText(args.text);
|
|
550
|
-
if (useRawText || convertToMrkdwn) {
|
|
551
|
-
// Blocks / plainText / user-group mentions / mrkdwn links force the
|
|
552
|
-
// legacy text path (same as postMessage).
|
|
553
|
-
return callSlackApiSoft({
|
|
554
|
-
botToken: args.botToken,
|
|
555
|
-
operation: "chat.update",
|
|
556
|
-
body: {
|
|
557
|
-
...base,
|
|
558
|
-
text: convertToMrkdwn ? markdownToSlackMrkdwn(args.text) : args.text,
|
|
559
|
-
...(args.blocks !== undefined ? { blocks: args.blocks } : {}),
|
|
560
|
-
},
|
|
561
|
-
});
|
|
562
|
-
}
|
|
563
|
-
let result = await callSlackApiSoft({
|
|
564
|
-
botToken: args.botToken,
|
|
565
|
-
operation: "chat.update",
|
|
566
|
-
body: {
|
|
567
|
-
...base,
|
|
568
|
-
markdown_text: args.text,
|
|
569
|
-
},
|
|
570
|
-
});
|
|
571
|
-
// Older workspaces / scopes may not accept markdown_text — retry with text.
|
|
572
|
-
// Also fall back when markdown_text hits its 12k limit (msg_too_long).
|
|
573
|
-
if (
|
|
574
|
-
!result.ok &&
|
|
575
|
-
(result.error === "markdown_text_conflict" ||
|
|
576
|
-
result.error === "invalid_arguments" ||
|
|
577
|
-
result.error === "invalid_blocks" ||
|
|
578
|
-
result.error === "msg_too_long" ||
|
|
579
|
-
SLACK_UNSUPPORTED_ERRORS.has(String(result.error ?? "")))
|
|
580
|
-
) {
|
|
581
|
-
result = await callSlackApiSoft({
|
|
582
|
-
botToken: args.botToken,
|
|
583
|
-
operation: "chat.update",
|
|
584
|
-
body: {
|
|
585
|
-
...base,
|
|
586
|
-
text: markdownToSlackMrkdwn(args.text),
|
|
587
|
-
},
|
|
588
|
-
});
|
|
589
|
-
}
|
|
590
|
-
return result;
|
|
591
|
-
}
|
|
592
|
-
|
|
593
|
-
/**
|
|
594
|
-
* Delete a message (`chat.delete`). Soft-fails — used best-effort to remove an
|
|
595
|
-
* orphaned skeleton before falling back to a fresh post, so a failed delete
|
|
596
|
-
* never blocks delivery of the reply.
|
|
597
|
-
*/
|
|
598
|
-
export async function deleteMessage(args: {
|
|
599
|
-
botToken: SlackBotToken | undefined;
|
|
600
|
-
channel: string;
|
|
601
|
-
ts: string;
|
|
602
|
-
}): Promise<SoftSlackResult> {
|
|
603
|
-
if (args.channel === "" || args.ts === "") {
|
|
604
|
-
return { ok: false, error: "missing_channel_or_ts" };
|
|
605
|
-
}
|
|
606
|
-
return callSlackApiSoft({
|
|
607
|
-
botToken: args.botToken,
|
|
608
|
-
operation: "chat.delete",
|
|
609
|
-
body: {
|
|
610
|
-
channel: args.channel,
|
|
611
|
-
ts: args.ts,
|
|
612
|
-
},
|
|
613
|
-
});
|
|
614
|
-
}
|
|
615
|
-
|
|
616
|
-
/** Add an emoji reaction (`reactions.add`). Soft-fails. */
|
|
617
|
-
export async function addReaction(args: {
|
|
618
|
-
botToken: SlackBotToken | undefined;
|
|
619
|
-
channel: string;
|
|
620
|
-
ts: string;
|
|
621
|
-
name: string;
|
|
622
|
-
}): Promise<SoftSlackResult> {
|
|
623
|
-
if (args.channel === "" || args.ts === "" || args.name === "") {
|
|
624
|
-
return { ok: false, error: "missing_channel_ts_or_name" };
|
|
625
|
-
}
|
|
626
|
-
return callSlackApiSoft({
|
|
627
|
-
botToken: args.botToken,
|
|
628
|
-
operation: "reactions.add",
|
|
629
|
-
body: {
|
|
630
|
-
channel: args.channel,
|
|
631
|
-
timestamp: args.ts,
|
|
632
|
-
name: args.name,
|
|
633
|
-
},
|
|
634
|
-
});
|
|
635
|
-
}
|
|
636
|
-
|
|
637
|
-
/** Remove an emoji reaction (`reactions.remove`). Soft-fails. */
|
|
638
|
-
export async function removeReaction(args: {
|
|
639
|
-
botToken: SlackBotToken | undefined;
|
|
640
|
-
channel: string;
|
|
641
|
-
ts: string;
|
|
642
|
-
name: string;
|
|
643
|
-
}): Promise<SoftSlackResult> {
|
|
644
|
-
if (args.channel === "" || args.ts === "" || args.name === "") {
|
|
645
|
-
return { ok: false, error: "missing_channel_ts_or_name" };
|
|
646
|
-
}
|
|
647
|
-
return callSlackApiSoft({
|
|
648
|
-
botToken: args.botToken,
|
|
649
|
-
operation: "reactions.remove",
|
|
650
|
-
body: {
|
|
651
|
-
channel: args.channel,
|
|
652
|
-
timestamp: args.ts,
|
|
653
|
-
name: args.name,
|
|
654
|
-
},
|
|
655
|
-
});
|
|
656
|
-
}
|
|
657
|
-
|
|
658
|
-
export function buildSlackBinding(args: {
|
|
659
|
-
botToken: SlackBotToken | undefined;
|
|
660
|
-
channelId: string;
|
|
661
|
-
threadTs: string;
|
|
662
|
-
teamId?: string;
|
|
663
|
-
host: HostContext;
|
|
664
|
-
artifacts: ArtifactsApi;
|
|
665
|
-
onThreadTsChanged?: (threadTs: string) => void;
|
|
666
|
-
log?: SlackLog;
|
|
667
|
-
}): SlackBinding {
|
|
668
|
-
let threadTs = args.threadTs;
|
|
669
|
-
const log = args.log ?? defaultSlackLog;
|
|
670
|
-
|
|
671
|
-
const thread = {
|
|
672
|
-
async post(text: string, options?: { blocks?: unknown[] }): Promise<{ ts: string }> {
|
|
673
|
-
const result = await postMessage({
|
|
674
|
-
botToken: args.botToken,
|
|
675
|
-
channel: args.channelId,
|
|
676
|
-
text,
|
|
677
|
-
threadTs,
|
|
678
|
-
...(options?.blocks === undefined ? {} : { blocks: options.blocks }),
|
|
679
|
-
});
|
|
680
|
-
if (result.ts !== "" && threadTs === "") {
|
|
681
|
-
threadTs = result.ts;
|
|
682
|
-
args.onThreadTsChanged?.(result.ts);
|
|
683
|
-
}
|
|
684
|
-
log.info("postMessage ok", {
|
|
685
|
-
channel: args.channelId,
|
|
686
|
-
thread_ts: threadTs,
|
|
687
|
-
message_ts: result.ts,
|
|
688
|
-
});
|
|
689
|
-
return { ts: result.ts };
|
|
690
|
-
},
|
|
691
|
-
async startTyping(status: string, loadingMessages?: string[]): Promise<void> {
|
|
692
|
-
if (args.channelId === "" || threadTs === "") {
|
|
693
|
-
return;
|
|
694
|
-
}
|
|
695
|
-
const result = await setThreadStatus({
|
|
696
|
-
botToken: args.botToken,
|
|
697
|
-
channelId: args.channelId,
|
|
698
|
-
threadTs,
|
|
699
|
-
status,
|
|
700
|
-
...(loadingMessages === undefined ? {} : { loadingMessages }),
|
|
701
|
-
});
|
|
702
|
-
if (!result.ok) {
|
|
703
|
-
log.warn("slack setStatus not-ok", {
|
|
704
|
-
error: result.error,
|
|
705
|
-
channel: args.channelId,
|
|
706
|
-
thread_ts: threadTs,
|
|
707
|
-
});
|
|
708
|
-
}
|
|
709
|
-
},
|
|
710
|
-
async setTitle(title: string): Promise<void> {
|
|
711
|
-
if (args.channelId === "" || threadTs === "") {
|
|
712
|
-
return;
|
|
713
|
-
}
|
|
714
|
-
const result = await setThreadTitle({
|
|
715
|
-
botToken: args.botToken,
|
|
716
|
-
channelId: args.channelId,
|
|
717
|
-
threadTs,
|
|
718
|
-
title,
|
|
719
|
-
});
|
|
720
|
-
if (!result.ok) {
|
|
721
|
-
log.warn("assistant.threads.setTitle not-ok", {
|
|
722
|
-
error: result.error,
|
|
723
|
-
channel: args.channelId,
|
|
724
|
-
thread_ts: threadTs,
|
|
725
|
-
});
|
|
726
|
-
}
|
|
727
|
-
},
|
|
728
|
-
async setSuggestedPrompts(prompts: SlackSuggestedPrompt[], title?: string): Promise<void> {
|
|
729
|
-
if (args.channelId === "" || threadTs === "" || prompts.length === 0) {
|
|
730
|
-
return;
|
|
731
|
-
}
|
|
732
|
-
const result = await setSuggestedPrompts({
|
|
733
|
-
botToken: args.botToken,
|
|
734
|
-
channelId: args.channelId,
|
|
735
|
-
threadTs,
|
|
736
|
-
prompts,
|
|
737
|
-
...(title === undefined ? {} : { title }),
|
|
738
|
-
});
|
|
739
|
-
if (!result.ok) {
|
|
740
|
-
log.warn("assistant.threads.setSuggestedPrompts not-ok", {
|
|
741
|
-
error: result.error,
|
|
742
|
-
channel: args.channelId,
|
|
743
|
-
thread_ts: threadTs,
|
|
744
|
-
});
|
|
745
|
-
}
|
|
746
|
-
},
|
|
747
|
-
};
|
|
748
|
-
|
|
749
|
-
return {
|
|
750
|
-
thread,
|
|
751
|
-
slack: {
|
|
752
|
-
channelId: args.channelId,
|
|
753
|
-
get threadTs() {
|
|
754
|
-
return threadTs;
|
|
755
|
-
},
|
|
756
|
-
...(args.teamId === undefined ? {} : { teamId: args.teamId }),
|
|
757
|
-
},
|
|
758
|
-
host: args.host,
|
|
759
|
-
artifacts: args.artifacts,
|
|
760
|
-
};
|
|
761
|
-
}
|