@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,314 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Opt-in channel watch: dispatch on posts in allowlisted channels.
|
|
3
|
-
*
|
|
4
|
-
* Filtering rules (the anti-slop guarantees):
|
|
5
|
-
* - The allowlist is a finite id list, or a lone `"*"` for every channel
|
|
6
|
-
* the bot is in. Mixing `"*"` with ids is a definition error.
|
|
7
|
-
* - Top-level posts only by default. `"replies"` is thread replies only
|
|
8
|
-
* (`ts !== threadTs`). `"all"` is both. A lone `"*"` is replies only.
|
|
9
|
-
* - Posts that @mention the bot are skipped here (the `app_mention` path
|
|
10
|
-
* owns them).
|
|
11
|
-
* - Bot-authored posts are dropped unless `includeBotPosts` is configured
|
|
12
|
-
* (alert feeds / webhook integrations); the watching bot's own posts are
|
|
13
|
-
* always dropped either way (loop safety).
|
|
14
|
-
* - An optional debounce window lets rapid edits settle: edits update the
|
|
15
|
-
* pending text, deleting the post cancels the dispatch.
|
|
16
|
-
*/
|
|
17
|
-
|
|
18
|
-
import type { WebClient } from "@slack/web-api";
|
|
19
|
-
import type { SlackChannelMessageEvent } from "./inbound.js";
|
|
20
|
-
import { defaultSlackLog, type SlackLog } from "./log.js";
|
|
21
|
-
import type { SlackChannelPostsOptions, SlackMessage } from "./types.js";
|
|
22
|
-
|
|
23
|
-
const CHANNEL_ID_PATTERN = /^[CG][A-Z0-9]+$/;
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Channel-watch allowlist contract, mirrored by the control plane's
|
|
27
|
-
* deploy-time validation (proto posture: both sides validate
|
|
28
|
-
* independently). Ids are required because on Cursor-managed hosting they
|
|
29
|
-
* become channel-scoped subscription edges — the control plane drops
|
|
30
|
-
* channel posts outside the id set before any compute wakes, and it cannot
|
|
31
|
-
* resolve `#names`.
|
|
32
|
-
*/
|
|
33
|
-
export const CHANNEL_POSTS_MAX_CHANNEL_IDS = 10;
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* True when the allowlist is only `"*"`: every channel the bot is in.
|
|
37
|
-
* Guest-side only. It is not a deploy-manifest subscription — the control
|
|
38
|
-
* plane rejects `"*"` and already delivers a reply in a thread a mention
|
|
39
|
-
* started. Top-level posts do not match it (`posts: "replies"`).
|
|
40
|
-
*/
|
|
41
|
-
export function channelPostsWatchEverywhere(entries: readonly string[]): boolean {
|
|
42
|
-
const trimmed = entries.map(entry => entry.trim()).filter(entry => entry !== "");
|
|
43
|
-
return trimmed.length > 0 && trimmed.every(entry => entry === "*");
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
/** The channel-id (`C…`/`G…`) entries of an allowlist, deduped. */
|
|
47
|
-
export function channelPostIdEntries(entries: readonly string[]): string[] {
|
|
48
|
-
const ids = new Set<string>();
|
|
49
|
-
for (const raw of entries) {
|
|
50
|
-
const entry = raw.trim();
|
|
51
|
-
if (CHANNEL_ID_PATTERN.test(entry)) {
|
|
52
|
-
ids.add(entry);
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
return [...ids];
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* Validate `channelPosts.allow` at definition time. Returns an actionable
|
|
60
|
-
* error string (to be prefixed with the option path), or undefined.
|
|
61
|
-
*/
|
|
62
|
-
export function validateChannelPostsAllow(entries: readonly string[]): string | undefined {
|
|
63
|
-
if (channelPostsWatchEverywhere(entries)) {
|
|
64
|
-
return undefined;
|
|
65
|
-
}
|
|
66
|
-
if (entries.some(entry => entry.trim() === "*")) {
|
|
67
|
-
return (
|
|
68
|
-
'must not mix "*": a lone "*" watches every channel the bot is in, ' +
|
|
69
|
-
"thread replies only. Otherwise list channel ids (C…/G…), up to " +
|
|
70
|
-
`${CHANNEL_POSTS_MAX_CHANNEL_IDS} channels.`
|
|
71
|
-
);
|
|
72
|
-
}
|
|
73
|
-
const ids = channelPostIdEntries(entries);
|
|
74
|
-
if (ids.length === 0) {
|
|
75
|
-
return (
|
|
76
|
-
"must include at least one channel id (C…/G…). Ids define the " +
|
|
77
|
-
"watched set on Cursor-managed hosting; `#name` entries alone are " +
|
|
78
|
-
"not enough."
|
|
79
|
-
);
|
|
80
|
-
}
|
|
81
|
-
if (ids.length > CHANNEL_POSTS_MAX_CHANNEL_IDS) {
|
|
82
|
-
return `lists ${ids.length} channel ids; the maximum is ${CHANNEL_POSTS_MAX_CHANNEL_IDS}.`;
|
|
83
|
-
}
|
|
84
|
-
return undefined;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
/** Allowlist over channel ids and `#names` (names resolve lazily). */
|
|
88
|
-
export class SlackChannelAllowlist {
|
|
89
|
-
private readonly ids = new Set<string>();
|
|
90
|
-
private readonly names = new Set<string>();
|
|
91
|
-
private readonly everywhere: boolean;
|
|
92
|
-
|
|
93
|
-
constructor(entries: readonly string[]) {
|
|
94
|
-
this.everywhere = channelPostsWatchEverywhere(entries);
|
|
95
|
-
if (this.everywhere) {
|
|
96
|
-
return;
|
|
97
|
-
}
|
|
98
|
-
for (const raw of entries) {
|
|
99
|
-
const entry = raw.trim();
|
|
100
|
-
// A mixed "*" is a definition error. Ignore it here so a stale
|
|
101
|
-
// config degrades to its explicit entries instead of matching all.
|
|
102
|
-
if (entry === "" || entry === "*") {
|
|
103
|
-
continue;
|
|
104
|
-
}
|
|
105
|
-
if (entry.startsWith("#")) {
|
|
106
|
-
this.names.add(entry.slice(1).toLowerCase());
|
|
107
|
-
} else if (CHANNEL_ID_PATTERN.test(entry)) {
|
|
108
|
-
this.ids.add(entry);
|
|
109
|
-
} else {
|
|
110
|
-
// Bare name without "#" — treat as a name for forgiving authoring.
|
|
111
|
-
this.names.add(entry.toLowerCase());
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
matches(channelId: string): boolean {
|
|
117
|
-
return this.everywhere || this.ids.has(channelId);
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
unresolvedNames(): string[] {
|
|
121
|
-
return [...this.names];
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
/** Fold resolved `name → id` pairs into the id set. */
|
|
125
|
-
applyResolvedNames(resolved: ReadonlyMap<string, string>): void {
|
|
126
|
-
for (const name of this.names) {
|
|
127
|
-
const id = resolved.get(name);
|
|
128
|
-
if (id !== undefined) {
|
|
129
|
-
this.ids.add(id);
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
/**
|
|
136
|
-
* Resolve channel `#names` to ids via `conversations.list`. Best-effort:
|
|
137
|
-
* returns whatever resolved; the caller logs names that stayed unresolved.
|
|
138
|
-
*/
|
|
139
|
-
export async function resolveChannelNames(
|
|
140
|
-
client: WebClient,
|
|
141
|
-
names: readonly string[],
|
|
142
|
-
log: SlackLog = defaultSlackLog,
|
|
143
|
-
): Promise<Map<string, string>> {
|
|
144
|
-
const wanted = new Set(names.map(name => name.toLowerCase()));
|
|
145
|
-
const resolved = new Map<string, string>();
|
|
146
|
-
if (wanted.size === 0) {
|
|
147
|
-
return resolved;
|
|
148
|
-
}
|
|
149
|
-
let cursor: string | undefined;
|
|
150
|
-
for (let page = 0; page < 20 && resolved.size < wanted.size; page += 1) {
|
|
151
|
-
const response = await client.conversations.list({
|
|
152
|
-
types: "public_channel,private_channel",
|
|
153
|
-
exclude_archived: true,
|
|
154
|
-
limit: 200,
|
|
155
|
-
...(cursor === undefined ? {} : { cursor }),
|
|
156
|
-
});
|
|
157
|
-
for (const channel of response.channels ?? []) {
|
|
158
|
-
const name = channel.name?.toLowerCase();
|
|
159
|
-
if (name !== undefined && wanted.has(name) && channel.id !== undefined) {
|
|
160
|
-
resolved.set(name, channel.id);
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
cursor = response.response_metadata?.next_cursor || undefined;
|
|
164
|
-
if (cursor === undefined) {
|
|
165
|
-
break;
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
for (const name of wanted) {
|
|
169
|
-
if (!resolved.has(name)) {
|
|
170
|
-
log.error("channel watch: could not resolve channel name", {
|
|
171
|
-
name: `#${name}`,
|
|
172
|
-
});
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
return resolved;
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
export interface ChannelPostWatcher {
|
|
179
|
-
/** Handle a parsed channel message event. Returns true when consumed. */
|
|
180
|
-
handle(event: SlackChannelMessageEvent, eventId?: string): boolean;
|
|
181
|
-
/** Cancel pending debounced dispatches. */
|
|
182
|
-
stop(): void;
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
export function createChannelPostWatcher(args: {
|
|
186
|
-
options: SlackChannelPostsOptions;
|
|
187
|
-
allowlist: SlackChannelAllowlist;
|
|
188
|
-
/** Bot user id (from `auth.test`) so bot mentions route via app_mention. */
|
|
189
|
-
getBotUserId: () => string | undefined;
|
|
190
|
-
/** This app's own `bot_id` (from `auth.test`) for self-post loop safety. */
|
|
191
|
-
getBotId?: () => string | undefined;
|
|
192
|
-
dispatch: (message: SlackMessage, eventId?: string) => void;
|
|
193
|
-
log?: SlackLog;
|
|
194
|
-
}): ChannelPostWatcher {
|
|
195
|
-
const log = args.log ?? defaultSlackLog;
|
|
196
|
-
const posts = args.options.posts ?? "top-level";
|
|
197
|
-
const includeBotPosts = args.options.includeBotPosts === true;
|
|
198
|
-
const debounceMs = args.options.debounceMs ?? 0;
|
|
199
|
-
const pending = new Map<
|
|
200
|
-
string,
|
|
201
|
-
{
|
|
202
|
-
timer: ReturnType<typeof setTimeout>;
|
|
203
|
-
message: SlackMessage;
|
|
204
|
-
eventId?: string;
|
|
205
|
-
}
|
|
206
|
-
>();
|
|
207
|
-
|
|
208
|
-
const pendingKey = (channelId: string, ts: string): string => `${channelId}:${ts}`;
|
|
209
|
-
|
|
210
|
-
function skip(reason: string, message: SlackMessage): true {
|
|
211
|
-
log.debug(`channel watch skip (${reason})`, {
|
|
212
|
-
channel: message.channelId,
|
|
213
|
-
message_ts: message.ts,
|
|
214
|
-
thread_ts: message.threadTs,
|
|
215
|
-
});
|
|
216
|
-
return true;
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
function fire(message: SlackMessage, eventId: string | undefined): void {
|
|
220
|
-
log.info("channel watch dispatch", {
|
|
221
|
-
channel: message.channelId,
|
|
222
|
-
message_ts: message.ts,
|
|
223
|
-
thread_ts: message.threadTs,
|
|
224
|
-
event_id: eventId,
|
|
225
|
-
});
|
|
226
|
-
args.dispatch(message, eventId);
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
return {
|
|
230
|
-
handle(event, eventId) {
|
|
231
|
-
if (event.kind === "deleted") {
|
|
232
|
-
const key = pendingKey(event.channelId, event.ts);
|
|
233
|
-
const entry = pending.get(key);
|
|
234
|
-
if (entry !== undefined) {
|
|
235
|
-
clearTimeout(entry.timer);
|
|
236
|
-
pending.delete(key);
|
|
237
|
-
log.info("channel watch cancel (post deleted)", {
|
|
238
|
-
channel: event.channelId,
|
|
239
|
-
message_ts: event.ts,
|
|
240
|
-
});
|
|
241
|
-
}
|
|
242
|
-
return true;
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
const message = event.message;
|
|
246
|
-
if (!args.allowlist.matches(message.channelId)) {
|
|
247
|
-
return skip("channel not allowlisted", message);
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
if (event.kind === "edited") {
|
|
251
|
-
const entry = pending.get(pendingKey(message.channelId, message.ts));
|
|
252
|
-
if (entry !== undefined) {
|
|
253
|
-
entry.message = { ...entry.message, ...message };
|
|
254
|
-
}
|
|
255
|
-
// Edits never (re-)dispatch on their own.
|
|
256
|
-
return true;
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
const reply = message.ts !== message.threadTs;
|
|
260
|
-
if (posts === "replies" && !reply) {
|
|
261
|
-
return skip("top-level post (posts: replies)", message);
|
|
262
|
-
}
|
|
263
|
-
if (posts === "top-level" && reply) {
|
|
264
|
-
return skip("thread reply (posts: top-level)", message);
|
|
265
|
-
}
|
|
266
|
-
const botUserId = args.getBotUserId();
|
|
267
|
-
const author = message.author;
|
|
268
|
-
if (author?.isBot === true) {
|
|
269
|
-
if (!includeBotPosts) {
|
|
270
|
-
return skip("bot-authored post (includeBotPosts off)", message);
|
|
271
|
-
}
|
|
272
|
-
const selfBotId = args.getBotId?.();
|
|
273
|
-
if (selfBotId === undefined && botUserId === undefined) {
|
|
274
|
-
return skip("bot-authored post (bot identity unknown; loop safety)", message);
|
|
275
|
-
}
|
|
276
|
-
if (
|
|
277
|
-
(selfBotId !== undefined && author.botId === selfBotId) ||
|
|
278
|
-
(botUserId !== undefined && author.userId !== "" && author.userId === botUserId)
|
|
279
|
-
) {
|
|
280
|
-
return skip("own post (loop safety)", message);
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
if (botUserId !== undefined && message.text.includes(`<@${botUserId}>`)) {
|
|
284
|
-
return skip("bot mention (app_mention path owns it)", message);
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
if (debounceMs <= 0) {
|
|
288
|
-
fire(message, eventId);
|
|
289
|
-
return true;
|
|
290
|
-
}
|
|
291
|
-
const key = pendingKey(message.channelId, message.ts);
|
|
292
|
-
const existing = pending.get(key);
|
|
293
|
-
if (existing !== undefined) {
|
|
294
|
-
clearTimeout(existing.timer);
|
|
295
|
-
}
|
|
296
|
-
const entry = {
|
|
297
|
-
timer: setTimeout(() => {
|
|
298
|
-
pending.delete(key);
|
|
299
|
-
fire(entry.message, entry.eventId);
|
|
300
|
-
}, debounceMs),
|
|
301
|
-
message,
|
|
302
|
-
...(eventId === undefined ? {} : { eventId }),
|
|
303
|
-
};
|
|
304
|
-
pending.set(key, entry);
|
|
305
|
-
return true;
|
|
306
|
-
},
|
|
307
|
-
stop() {
|
|
308
|
-
for (const entry of pending.values()) {
|
|
309
|
-
clearTimeout(entry.timer);
|
|
310
|
-
}
|
|
311
|
-
pending.clear();
|
|
312
|
-
},
|
|
313
|
-
};
|
|
314
|
-
}
|
|
@@ -1,249 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Official Slack CLI project files for `slack init --manual`.
|
|
3
|
-
*
|
|
4
|
-
* `.slack/` is the committed Slack CLI project: hook, manifests, hooks.json.
|
|
5
|
-
* Agent SDK serve owns the socket; do not `slack deploy` / `slack run`.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import { randomUUID } from "node:crypto";
|
|
9
|
-
import { existsSync } from "node:fs";
|
|
10
|
-
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
11
|
-
import { homedir } from "node:os";
|
|
12
|
-
import { join } from "node:path";
|
|
13
|
-
|
|
14
|
-
export const SLACK_CLI_HOME_BIN = ".slack/bin/slack";
|
|
15
|
-
|
|
16
|
-
export const SLACK_CLI_GET_MANIFEST = "node .slack/get-manifest.mjs";
|
|
17
|
-
|
|
18
|
-
export type SlackCliEnvironment = "local" | "deployed";
|
|
19
|
-
|
|
20
|
-
const TEAM_ID_RE = /\(Team ID: ([TE][A-Z0-9]+)\)/g;
|
|
21
|
-
|
|
22
|
-
const GET_MANIFEST_JS = `import { readFileSync } from "node:fs";
|
|
23
|
-
import { dirname, join } from "node:path";
|
|
24
|
-
import { fileURLToPath } from "node:url";
|
|
25
|
-
|
|
26
|
-
const here = dirname(fileURLToPath(import.meta.url));
|
|
27
|
-
|
|
28
|
-
function target() {
|
|
29
|
-
const env = process.env.SLACK_ENV ?? process.env.SLACK_APP_ENVIRONMENT;
|
|
30
|
-
if (env === "deployed" || env === "prod") return "manifest.prod.json";
|
|
31
|
-
if (env === "local" || env === "dev") return "manifest.dev.json";
|
|
32
|
-
try {
|
|
33
|
-
const raw = readFileSync(join(here, "cli-environment"), "utf8").trim();
|
|
34
|
-
if (raw === "deployed" || raw === "prod") return "manifest.prod.json";
|
|
35
|
-
} catch {
|
|
36
|
-
// default local
|
|
37
|
-
}
|
|
38
|
-
return "manifest.dev.json";
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
process.stdout.write(readFileSync(join(here, target()), "utf8"));
|
|
42
|
-
`;
|
|
43
|
-
|
|
44
|
-
function isEnoent(error: unknown): boolean {
|
|
45
|
-
return (
|
|
46
|
-
error instanceof Error && "code" in error && (error as NodeJS.ErrnoException).code === "ENOENT"
|
|
47
|
-
);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/** Official Slack CLI, if present. `SLACK_CLI` overrides. */
|
|
51
|
-
export function detectSlackCli(env: NodeJS.ProcessEnv = process.env): string | undefined {
|
|
52
|
-
const override = env.SLACK_CLI;
|
|
53
|
-
if (override !== undefined && override !== "") {
|
|
54
|
-
return override;
|
|
55
|
-
}
|
|
56
|
-
const home = env.HOME ?? env.USERPROFILE ?? homedir();
|
|
57
|
-
const homeBin = join(home, SLACK_CLI_HOME_BIN);
|
|
58
|
-
return existsSync(homeBin) ? homeBin : undefined;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/** Hook + manifests under `.slack/`. Merge hooks.json; keep existing config. */
|
|
62
|
-
export async function writeSlackCliProject(
|
|
63
|
-
rootDir: string,
|
|
64
|
-
manifests: ReadonlyArray<{ name: string; contents: string }>,
|
|
65
|
-
): Promise<string[]> {
|
|
66
|
-
const slackDir = join(rootDir, ".slack");
|
|
67
|
-
await mkdir(slackDir, { recursive: true });
|
|
68
|
-
const created: string[] = [];
|
|
69
|
-
|
|
70
|
-
await writeFile(join(slackDir, "get-manifest.mjs"), GET_MANIFEST_JS);
|
|
71
|
-
created.push(".slack/get-manifest.mjs");
|
|
72
|
-
|
|
73
|
-
for (const file of manifests) {
|
|
74
|
-
await writeFile(join(slackDir, file.name), file.contents);
|
|
75
|
-
created.push(`.slack/${file.name}`);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
if (await upsertGetManifestHook(slackDir)) {
|
|
79
|
-
created.push(".slack/hooks.json");
|
|
80
|
-
}
|
|
81
|
-
if (
|
|
82
|
-
await writeIfMissing(
|
|
83
|
-
join(slackDir, "config.json"),
|
|
84
|
-
`${JSON.stringify(
|
|
85
|
-
{
|
|
86
|
-
manifest: { source: "local" },
|
|
87
|
-
project_id: randomUUID(),
|
|
88
|
-
},
|
|
89
|
-
null,
|
|
90
|
-
2,
|
|
91
|
-
)}\n`,
|
|
92
|
-
)
|
|
93
|
-
) {
|
|
94
|
-
created.push(".slack/config.json");
|
|
95
|
-
}
|
|
96
|
-
if (await mergeGitignore(join(slackDir, ".gitignore"))) {
|
|
97
|
-
created.push(".slack/.gitignore");
|
|
98
|
-
}
|
|
99
|
-
return created;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
async function upsertGetManifestHook(slackDir: string): Promise<boolean> {
|
|
103
|
-
const path = join(slackDir, "hooks.json");
|
|
104
|
-
let existing: { hooks?: Record<string, string> };
|
|
105
|
-
try {
|
|
106
|
-
const parsed: unknown = JSON.parse(await readFile(path, "utf8"));
|
|
107
|
-
if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
108
|
-
throw new Error(".slack/hooks.json is not a JSON object");
|
|
109
|
-
}
|
|
110
|
-
existing = parsed as { hooks?: Record<string, string> };
|
|
111
|
-
} catch (error) {
|
|
112
|
-
if (!isEnoent(error)) {
|
|
113
|
-
throw error;
|
|
114
|
-
}
|
|
115
|
-
await writeFile(
|
|
116
|
-
path,
|
|
117
|
-
`${JSON.stringify({ hooks: { "get-manifest": SLACK_CLI_GET_MANIFEST } }, null, 2)}\n`,
|
|
118
|
-
);
|
|
119
|
-
return true;
|
|
120
|
-
}
|
|
121
|
-
const hooks = existing.hooks ?? {};
|
|
122
|
-
if (hooks["get-manifest"] === SLACK_CLI_GET_MANIFEST) {
|
|
123
|
-
return false;
|
|
124
|
-
}
|
|
125
|
-
hooks["get-manifest"] = SLACK_CLI_GET_MANIFEST;
|
|
126
|
-
existing.hooks = hooks;
|
|
127
|
-
await writeFile(path, `${JSON.stringify(existing, null, 2)}\n`);
|
|
128
|
-
return true;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
async function writeIfMissing(path: string, contents: string): Promise<boolean> {
|
|
132
|
-
try {
|
|
133
|
-
await writeFile(path, contents, { flag: "wx" });
|
|
134
|
-
return true;
|
|
135
|
-
} catch (error) {
|
|
136
|
-
if (
|
|
137
|
-
error instanceof Error &&
|
|
138
|
-
"code" in error &&
|
|
139
|
-
(error as NodeJS.ErrnoException).code === "EEXIST"
|
|
140
|
-
) {
|
|
141
|
-
return false;
|
|
142
|
-
}
|
|
143
|
-
throw error;
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
async function mergeGitignore(path: string): Promise<boolean> {
|
|
148
|
-
const lines = ["apps.dev.json", "cache/", "cli-environment"];
|
|
149
|
-
let existing = "";
|
|
150
|
-
try {
|
|
151
|
-
existing = await readFile(path, "utf8");
|
|
152
|
-
} catch (error) {
|
|
153
|
-
if (!isEnoent(error)) {
|
|
154
|
-
throw error;
|
|
155
|
-
}
|
|
156
|
-
await writeFile(path, `${lines.join("\n")}\n`);
|
|
157
|
-
return true;
|
|
158
|
-
}
|
|
159
|
-
const have = new Set(
|
|
160
|
-
existing
|
|
161
|
-
.split(/\r?\n/)
|
|
162
|
-
.map(line => line.trim())
|
|
163
|
-
.filter(line => line !== ""),
|
|
164
|
-
);
|
|
165
|
-
const missing = lines.filter(line => !have.has(line));
|
|
166
|
-
if (missing.length === 0) {
|
|
167
|
-
return false;
|
|
168
|
-
}
|
|
169
|
-
const prefix = existing === "" || existing.endsWith("\n") ? existing : `${existing}\n`;
|
|
170
|
-
await writeFile(path, `${prefix}${missing.join("\n")}\n`);
|
|
171
|
-
return true;
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
export function parseSlackAuthTeams(text: string): string[] {
|
|
175
|
-
const ids: string[] = [];
|
|
176
|
-
for (const match of text.matchAll(TEAM_ID_RE)) {
|
|
177
|
-
const id = match[1];
|
|
178
|
-
if (id !== undefined && !ids.includes(id)) {
|
|
179
|
-
ids.push(id);
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
return ids;
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
export async function readSlackCliAppId(
|
|
186
|
-
dir: string,
|
|
187
|
-
environment: SlackCliEnvironment,
|
|
188
|
-
team?: string,
|
|
189
|
-
): Promise<string | undefined> {
|
|
190
|
-
const apps = await loadAppMap(dir, environment);
|
|
191
|
-
if (apps === undefined) {
|
|
192
|
-
return undefined;
|
|
193
|
-
}
|
|
194
|
-
if (team !== undefined) {
|
|
195
|
-
return appIdOf(apps[team]);
|
|
196
|
-
}
|
|
197
|
-
return firstAppId(apps);
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
async function loadAppMap(
|
|
201
|
-
dir: string,
|
|
202
|
-
environment: SlackCliEnvironment,
|
|
203
|
-
): Promise<Record<string, unknown> | undefined> {
|
|
204
|
-
if (environment === "local") {
|
|
205
|
-
return readJson(join(dir, ".slack/apps.dev.json"));
|
|
206
|
-
}
|
|
207
|
-
const deployed = await readJson(join(dir, ".slack/apps.json"));
|
|
208
|
-
if (deployed === undefined) {
|
|
209
|
-
return undefined;
|
|
210
|
-
}
|
|
211
|
-
const apps = deployed.apps;
|
|
212
|
-
if (apps !== undefined && typeof apps === "object" && apps !== null) {
|
|
213
|
-
return apps as Record<string, unknown>;
|
|
214
|
-
}
|
|
215
|
-
return deployed;
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
function firstAppId(value: Record<string, unknown>): string | undefined {
|
|
219
|
-
for (const entry of Object.values(value)) {
|
|
220
|
-
const id = appIdOf(entry);
|
|
221
|
-
if (id !== undefined) {
|
|
222
|
-
return id;
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
return undefined;
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
function appIdOf(entry: unknown): string | undefined {
|
|
229
|
-
if (entry === undefined || entry === null || typeof entry !== "object") {
|
|
230
|
-
return undefined;
|
|
231
|
-
}
|
|
232
|
-
const appId = (entry as { app_id?: unknown }).app_id;
|
|
233
|
-
if (typeof appId === "string" && appId.startsWith("A")) {
|
|
234
|
-
return appId;
|
|
235
|
-
}
|
|
236
|
-
return undefined;
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
async function readJson(path: string): Promise<Record<string, unknown> | undefined> {
|
|
240
|
-
try {
|
|
241
|
-
const parsed: unknown = JSON.parse(await readFile(path, "utf8"));
|
|
242
|
-
if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
243
|
-
return undefined;
|
|
244
|
-
}
|
|
245
|
-
return parsed as Record<string, unknown>;
|
|
246
|
-
} catch {
|
|
247
|
-
return undefined;
|
|
248
|
-
}
|
|
249
|
-
}
|