@cursor/july 0.1.16 → 0.1.18

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.
Files changed (273) hide show
  1. package/README.md +9 -4
  2. package/dist/bin/agent-serve.js +60 -2
  3. package/dist/channels/slack/api.d.ts.map +1 -1
  4. package/dist/channels/slack/api.js +13 -3
  5. package/dist/channels/slack/auth.d.ts +7 -1
  6. package/dist/channels/slack/auth.d.ts.map +1 -1
  7. package/dist/channels/slack/auth.js +14 -0
  8. package/dist/channels/slack/blocks.d.ts +61 -0
  9. package/dist/channels/slack/blocks.d.ts.map +1 -0
  10. package/dist/channels/slack/blocks.js +90 -0
  11. package/dist/channels/slack/cursor-account.d.ts.map +1 -1
  12. package/dist/channels/slack/cursor-account.js +1 -1
  13. package/dist/channels/slack/defaults.d.ts +2 -0
  14. package/dist/channels/slack/defaults.d.ts.map +1 -1
  15. package/dist/channels/slack/defaults.js +29 -3
  16. package/dist/channels/slack/dispatch.d.ts +3 -17
  17. package/dist/channels/slack/dispatch.d.ts.map +1 -1
  18. package/dist/channels/slack/dispatch.js +4 -1
  19. package/dist/channels/slack/inbound.d.ts.map +1 -1
  20. package/dist/channels/slack/inbound.js +6 -1
  21. package/dist/channels/slack/index.d.ts +2 -0
  22. package/dist/channels/slack/index.d.ts.map +1 -1
  23. package/dist/channels/slack/index.js +2 -0
  24. package/dist/channels/slack/init.d.ts.map +1 -1
  25. package/dist/channels/slack/init.js +4 -1
  26. package/dist/channels/slack/interactive.d.ts +39 -3
  27. package/dist/channels/slack/interactive.d.ts.map +1 -1
  28. package/dist/channels/slack/interactive.js +153 -7
  29. package/dist/channels/slack/manifest.d.ts +13 -0
  30. package/dist/channels/slack/manifest.d.ts.map +1 -1
  31. package/dist/channels/slack/manifest.js +36 -14
  32. package/dist/channels/slack/message-body.d.ts +13 -0
  33. package/dist/channels/slack/message-body.d.ts.map +1 -0
  34. package/dist/channels/slack/message-body.js +82 -0
  35. package/dist/channels/slack/setup.d.ts +4 -1
  36. package/dist/channels/slack/setup.d.ts.map +1 -1
  37. package/dist/channels/slack/setup.js +16 -2
  38. package/dist/channels/slack/slack-channel.d.ts.map +1 -1
  39. package/dist/channels/slack/slack-channel.js +24 -3
  40. package/dist/channels/slack/thread-context.d.ts +0 -2
  41. package/dist/channels/slack/thread-context.d.ts.map +1 -1
  42. package/dist/channels/slack/thread-context.js +1 -65
  43. package/dist/channels/slack/types.d.ts +93 -1
  44. package/dist/channels/slack/types.d.ts.map +1 -1
  45. package/dist/connections.d.ts +4 -1
  46. package/dist/connections.d.ts.map +1 -1
  47. package/dist/connections.js +4 -1
  48. package/dist/docs/404.html +2 -2
  49. package/dist/docs/ab.html +3 -3
  50. package/dist/docs/assets/{app.DjHC-Ggf.js → app.BR5EdVSq.js} +1 -1
  51. package/dist/docs/assets/chunks/@localSearchIndexroot.BOzkeUi8.js +1 -0
  52. package/dist/docs/assets/chunks/{VPLocalSearchBox.DwviwmIq.js → VPLocalSearchBox.CNCzfUKC.js} +1 -1
  53. package/dist/docs/assets/chunks/{theme.BIpeYSon.js → theme.CwKvMSWv.js} +2 -2
  54. package/dist/docs/assets/{example-agents_security-reviewer.md.BZSNycMf.js → example-agents_security-reviewer.md.Dhj_m7_B.js} +1 -1
  55. package/dist/docs/assets/{guides_mcp-oauth.md.DqmEOQY1.js → guides_mcp-oauth.md.Dd8EgSem.js} +3 -2
  56. package/dist/docs/assets/{guides_mcp-oauth.md.DqmEOQY1.lean.js → guides_mcp-oauth.md.Dd8EgSem.lean.js} +1 -1
  57. package/dist/docs/assets/{guides_slack.md.FWale6Ip.js → guides_slack.md.D_xFKlnF.js} +1 -1
  58. package/dist/docs/assets/{reference_connections.md.CsSr3rDz.js → reference_connections.md.B9Q3TOve.js} +12 -5
  59. package/dist/docs/assets/{reference_connections.md.CsSr3rDz.lean.js → reference_connections.md.B9Q3TOve.lean.js} +1 -1
  60. package/dist/docs/building-with-agents.html +3 -3
  61. package/dist/docs/concepts.html +3 -3
  62. package/dist/docs/deployment.html +3 -3
  63. package/dist/docs/evals.html +3 -3
  64. package/dist/docs/example-agents/approval-buddy.html +3 -3
  65. package/dist/docs/example-agents/benny.html +3 -3
  66. package/dist/docs/example-agents/bugbot.html +3 -3
  67. package/dist/docs/example-agents/codebase-wiki.html +3 -3
  68. package/dist/docs/example-agents/codeowners-review.html +3 -3
  69. package/dist/docs/example-agents/concierge.html +3 -3
  70. package/dist/docs/example-agents/fsd.html +3 -3
  71. package/dist/docs/example-agents/index.html +3 -3
  72. package/dist/docs/example-agents/knowledge-base.html +3 -3
  73. package/dist/docs/example-agents/oncall.html +3 -3
  74. package/dist/docs/example-agents/security-reviewer.html +5 -5
  75. package/dist/docs/example-agents/slack-agent.html +3 -3
  76. package/dist/docs/example-agents/weather-agent.html +3 -3
  77. package/dist/docs/guides/agent-to-agent.html +3 -3
  78. package/dist/docs/guides/cloud-runtime.html +3 -3
  79. package/dist/docs/guides/github.html +3 -3
  80. package/dist/docs/guides/human-in-the-loop.html +3 -3
  81. package/dist/docs/guides/mcp-oauth.html +6 -5
  82. package/dist/docs/guides/slack.html +5 -5
  83. package/dist/docs/guides/webhooks.html +3 -3
  84. package/dist/docs/hashmap.json +1 -1
  85. package/dist/docs/hillclimbing.html +3 -3
  86. package/dist/docs/index.html +3 -3
  87. package/dist/docs/quickstart.html +3 -3
  88. package/dist/docs/reference/agent-config.html +3 -3
  89. package/dist/docs/reference/channels.html +3 -3
  90. package/dist/docs/reference/cli.html +3 -3
  91. package/dist/docs/reference/connections.html +14 -7
  92. package/dist/docs/reference/hooks.html +3 -3
  93. package/dist/docs/reference/http-api.html +3 -3
  94. package/dist/docs/reference/instructions.html +3 -3
  95. package/dist/docs/reference/playground.html +3 -3
  96. package/dist/docs/reference/project-layout.html +3 -3
  97. package/dist/docs/reference/prompt.html +3 -3
  98. package/dist/docs/reference/schedules.html +3 -3
  99. package/dist/docs/reference/sessions.html +3 -3
  100. package/dist/docs/reference/skills.html +3 -3
  101. package/dist/docs/reference/subagents.html +3 -3
  102. package/dist/docs/reference/tools.html +3 -3
  103. package/dist/docs/scaffolding-agents.html +3 -3
  104. package/dist/docs/storage.html +3 -3
  105. package/dist/docs/troubleshooting.html +3 -3
  106. package/dist/evals/assertions.d.ts +190 -0
  107. package/dist/evals/assertions.d.ts.map +1 -0
  108. package/dist/evals/assertions.js +461 -0
  109. package/dist/evals/expect.d.ts +95 -0
  110. package/dist/evals/expect.d.ts.map +1 -0
  111. package/dist/evals/expect.js +194 -0
  112. package/dist/evals/judge.d.ts +133 -0
  113. package/dist/evals/judge.d.ts.map +1 -0
  114. package/dist/evals/judge.js +228 -0
  115. package/dist/evals/loaders.d.ts +51 -0
  116. package/dist/evals/loaders.d.ts.map +1 -0
  117. package/dist/evals/loaders.js +124 -0
  118. package/dist/evals/matchers.d.ts +95 -0
  119. package/dist/evals/matchers.d.ts.map +1 -0
  120. package/dist/evals/matchers.js +145 -0
  121. package/dist/evals/reporters.d.ts +70 -0
  122. package/dist/evals/reporters.d.ts.map +1 -0
  123. package/dist/evals/reporters.js +221 -0
  124. package/dist/evals/results.d.ts +103 -0
  125. package/dist/evals/results.d.ts.map +1 -0
  126. package/dist/evals/results.js +28 -0
  127. package/dist/evals/run-facts.d.ts +77 -0
  128. package/dist/evals/run-facts.d.ts.map +1 -0
  129. package/dist/evals/run-facts.js +187 -0
  130. package/dist/evals.d.ts +118 -31
  131. package/dist/evals.d.ts.map +1 -1
  132. package/dist/evals.js +46 -12
  133. package/dist/index.d.ts +1 -1
  134. package/dist/index.d.ts.map +1 -1
  135. package/dist/index.js +1 -1
  136. package/dist/internal/builtin-tools/index.d.ts +10 -0
  137. package/dist/internal/builtin-tools/index.d.ts.map +1 -0
  138. package/dist/internal/builtin-tools/index.js +27 -0
  139. package/dist/internal/builtin-tools/reminders.d.ts +9 -0
  140. package/dist/internal/builtin-tools/reminders.d.ts.map +1 -0
  141. package/dist/internal/builtin-tools/reminders.js +138 -0
  142. package/dist/internal/cli-ax.d.ts +27 -0
  143. package/dist/internal/cli-ax.d.ts.map +1 -1
  144. package/dist/internal/cli-ax.js +90 -12
  145. package/dist/internal/cli-mcp.d.ts +8 -0
  146. package/dist/internal/cli-mcp.d.ts.map +1 -1
  147. package/dist/internal/cli-mcp.js +98 -0
  148. package/dist/internal/cli-slack.d.ts +29 -1
  149. package/dist/internal/cli-slack.d.ts.map +1 -1
  150. package/dist/internal/cli-slack.js +799 -13
  151. package/dist/internal/cursor-event-relay.d.ts +30 -0
  152. package/dist/internal/cursor-event-relay.d.ts.map +1 -1
  153. package/dist/internal/cursor-event-relay.js +37 -0
  154. package/dist/internal/deploy-client.d.ts +7 -0
  155. package/dist/internal/deploy-client.d.ts.map +1 -1
  156. package/dist/internal/deploy-client.js +9 -0
  157. package/dist/internal/discovery.d.ts.map +1 -1
  158. package/dist/internal/discovery.js +70 -9
  159. package/dist/internal/distribution.d.ts.map +1 -1
  160. package/dist/internal/distribution.js +2 -0
  161. package/dist/internal/eval-judge-model.d.ts +59 -0
  162. package/dist/internal/eval-judge-model.d.ts.map +1 -0
  163. package/dist/internal/eval-judge-model.js +131 -0
  164. package/dist/internal/eval-run-store.d.ts.map +1 -1
  165. package/dist/internal/eval-run-store.js +12 -20
  166. package/dist/internal/eval-runner.d.ts +31 -25
  167. package/dist/internal/eval-runner.d.ts.map +1 -1
  168. package/dist/internal/eval-runner.js +329 -126
  169. package/dist/internal/evals-client.d.ts.map +1 -1
  170. package/dist/internal/evals-client.js +4 -1
  171. package/dist/internal/local-env.d.ts +8 -0
  172. package/dist/internal/local-env.d.ts.map +1 -0
  173. package/dist/internal/local-env.js +47 -0
  174. package/dist/internal/playground/static.d.ts +3 -0
  175. package/dist/internal/playground/static.d.ts.map +1 -1
  176. package/dist/internal/playground/static.js +3 -0
  177. package/dist/internal/reminder-runner.d.ts +7 -0
  178. package/dist/internal/reminder-runner.d.ts.map +1 -1
  179. package/dist/internal/reminder-runner.js +21 -0
  180. package/dist/internal/run-client.d.ts +15 -0
  181. package/dist/internal/run-client.d.ts.map +1 -1
  182. package/dist/internal/run-client.js +3 -2
  183. package/dist/internal/sdk-runner.d.ts +51 -1
  184. package/dist/internal/sdk-runner.d.ts.map +1 -1
  185. package/dist/internal/sdk-runner.js +176 -36
  186. package/dist/internal/server.d.ts.map +1 -1
  187. package/dist/internal/server.js +11 -1
  188. package/dist/internal/session-engine.d.ts +18 -5
  189. package/dist/internal/session-engine.d.ts.map +1 -1
  190. package/dist/internal/session-engine.js +81 -19
  191. package/dist/internal/slack-provision-client.d.ts +133 -0
  192. package/dist/internal/slack-provision-client.d.ts.map +1 -0
  193. package/dist/internal/slack-provision-client.js +286 -0
  194. package/dist/playground/assets/cursor-icons-16-f_W_ogc-.woff2 +0 -0
  195. package/dist/playground/assets/index-DRjS5klQ.js +85 -0
  196. package/dist/playground/assets/index-TCDs-UhZ.css +1 -0
  197. package/dist/playground/index.html +2 -2
  198. package/dist/types.d.ts +98 -4
  199. package/dist/types.d.ts.map +1 -1
  200. package/dist/types.js +26 -0
  201. package/docs/example-agents/security-reviewer.md +1 -1
  202. package/docs/guides/mcp-oauth.md +10 -5
  203. package/docs/guides/slack.md +3 -2
  204. package/docs/reference/connections.md +28 -18
  205. package/package.json +20 -2
  206. package/skills/create-agent/SKILL.md +15 -7
  207. package/skills/debug/SKILL.md +3 -1
  208. package/skills/mcp-auth/SKILL.md +1 -1
  209. package/skills/setup-slack/SKILL.md +177 -11
  210. package/src/bin/agent-serve.ts +63 -2
  211. package/src/channels/slack/api.ts +16 -3
  212. package/src/channels/slack/auth.ts +16 -1
  213. package/src/channels/slack/blocks.ts +139 -0
  214. package/src/channels/slack/cursor-account.ts +1 -0
  215. package/src/channels/slack/defaults.ts +32 -4
  216. package/src/channels/slack/dispatch.ts +6 -19
  217. package/src/channels/slack/inbound.ts +6 -1
  218. package/src/channels/slack/index.ts +2 -0
  219. package/src/channels/slack/init.ts +3 -0
  220. package/src/channels/slack/interactive.ts +184 -19
  221. package/src/channels/slack/manifest.ts +37 -6
  222. package/src/channels/slack/message-body.ts +90 -0
  223. package/src/channels/slack/setup.ts +16 -2
  224. package/src/channels/slack/slack-channel.ts +37 -6
  225. package/src/channels/slack/thread-context.ts +1 -69
  226. package/src/channels/slack/types.ts +105 -1
  227. package/src/connections.ts +4 -1
  228. package/src/evals/assertions.ts +704 -0
  229. package/src/evals/expect.ts +272 -0
  230. package/src/evals/judge.ts +346 -0
  231. package/src/evals/loaders.ts +113 -0
  232. package/src/evals/matchers.ts +246 -0
  233. package/src/evals/reporters.ts +274 -0
  234. package/src/evals/results.ts +132 -0
  235. package/src/evals/run-facts.ts +274 -0
  236. package/src/evals.ts +205 -42
  237. package/src/index.ts +2 -0
  238. package/src/internal/builtin-tools/index.ts +40 -0
  239. package/src/internal/builtin-tools/reminders.ts +158 -0
  240. package/src/internal/cli-ax.ts +134 -15
  241. package/src/internal/cli-mcp.ts +118 -5
  242. package/src/internal/cli-slack.ts +1017 -15
  243. package/src/internal/cursor-event-relay.ts +67 -0
  244. package/src/internal/deploy-client.ts +10 -0
  245. package/src/internal/discovery.ts +83 -5
  246. package/src/internal/distribution.ts +2 -0
  247. package/src/internal/eval-judge-model.ts +148 -0
  248. package/src/internal/eval-run-store.ts +10 -14
  249. package/src/internal/eval-runner.ts +460 -214
  250. package/src/internal/evals-client.ts +5 -0
  251. package/src/internal/local-env.ts +53 -0
  252. package/src/internal/playground/static.ts +3 -0
  253. package/src/internal/reminder-runner.ts +30 -0
  254. package/src/internal/run-client.ts +17 -1
  255. package/src/internal/sdk-runner.ts +234 -35
  256. package/src/internal/server.ts +12 -0
  257. package/src/internal/session-engine.ts +103 -21
  258. package/src/internal/slack-provision-client.ts +442 -0
  259. package/src/types.ts +125 -4
  260. package/dist/channels/slack/post-update-delivery.d.ts +0 -85
  261. package/dist/channels/slack/post-update-delivery.d.ts.map +0 -1
  262. package/dist/docs/assets/chunks/@localSearchIndexroot.DZtu0ZIc.js +0 -1
  263. package/dist/internal/json-dir-store.d.ts +0 -32
  264. package/dist/internal/json-dir-store.d.ts.map +0 -1
  265. package/dist/internal/persistence-coordinator.d.ts +0 -127
  266. package/dist/internal/persistence-coordinator.d.ts.map +0 -1
  267. package/dist/persistence.d.ts +0 -184
  268. package/dist/persistence.d.ts.map +0 -1
  269. package/dist/playground/assets/cursor-icons-16-CQ50JpfO.woff2 +0 -0
  270. package/dist/playground/assets/index-Bwl4Onx4.js +0 -85
  271. package/dist/playground/assets/index-ByV4nfch.css +0 -1
  272. /package/dist/docs/assets/{example-agents_security-reviewer.md.BZSNycMf.lean.js → example-agents_security-reviewer.md.Dhj_m7_B.lean.js} +0 -0
  273. /package/dist/docs/assets/{guides_slack.md.FWale6Ip.lean.js → guides_slack.md.D_xFKlnF.lean.js} +0 -0
@@ -8,6 +8,7 @@
8
8
  import { callSlackApiSoft } from "./api.js";
9
9
  import { slackTextToMarkdown } from "./inbound.js";
10
10
  import { defaultSlackLog, type SlackLog } from "./log.js";
11
+ import { slackApiMessageBody } from "./message-body.js";
11
12
  import type { SlackBotToken, SoftSlackResult } from "./types.js";
12
13
 
13
14
  /** Cap replies fetched from Slack (plus the parent). */
@@ -95,75 +96,6 @@ function asString(value: unknown): string | undefined {
95
96
  return typeof value === "string" ? value : undefined;
96
97
  }
97
98
 
98
- /** Pull readable text out of Slack attachment / Block Kit payloads. */
99
- export function slackApiMessageBody(message: JsonRecord): string {
100
- const parts: string[] = [];
101
- const text = asString(message.text);
102
- if (text !== undefined && text.trim() !== "") {
103
- parts.push(text);
104
- }
105
-
106
- const attachments = Array.isArray(message.attachments)
107
- ? message.attachments
108
- : [];
109
- for (const attachment of attachments) {
110
- const rec = asRecord(attachment);
111
- if (rec === null) {
112
- continue;
113
- }
114
- for (const key of [
115
- "pretext",
116
- "title",
117
- "text",
118
- "fallback",
119
- "footer",
120
- ] as const) {
121
- const value = asString(rec[key]);
122
- if (value !== undefined && value.trim() !== "") {
123
- parts.push(value);
124
- }
125
- }
126
- const titleLink = asString(rec.title_link);
127
- if (titleLink !== undefined && titleLink.trim() !== "") {
128
- parts.push(titleLink);
129
- }
130
- }
131
-
132
- const blocks = Array.isArray(message.blocks) ? message.blocks : [];
133
- for (const block of blocks) {
134
- const rec = asRecord(block);
135
- if (rec === null) {
136
- continue;
137
- }
138
- const blockText = asRecord(rec.text);
139
- const blockTextValue = asString(blockText?.text);
140
- if (blockTextValue !== undefined && blockTextValue.trim() !== "") {
141
- parts.push(blockTextValue);
142
- }
143
- const fields = Array.isArray(rec.fields) ? rec.fields : [];
144
- for (const field of fields) {
145
- const fieldRec = asRecord(field);
146
- const fieldText = asString(fieldRec?.text);
147
- if (fieldText !== undefined && fieldText.trim() !== "") {
148
- parts.push(fieldText);
149
- }
150
- }
151
- }
152
-
153
- // Dedupe identical chunks (Datadog often repeats text/fallback across fields).
154
- const seen = new Set<string>();
155
- const deduped: string[] = [];
156
- for (const part of parts) {
157
- const trimmed = part.trim();
158
- if (trimmed === "" || seen.has(trimmed)) {
159
- continue;
160
- }
161
- seen.add(trimmed);
162
- deduped.push(trimmed);
163
- }
164
- return deduped.join("\n");
165
- }
166
-
167
99
  function formatThreadEntry(
168
100
  message: JsonRecord,
169
101
  role: "parent" | "reply"
@@ -89,8 +89,16 @@ export interface SlackAuthor {
89
89
  }
90
90
 
91
91
  export interface SlackMessage {
92
+ /** Raw top-level `text` exactly as Slack sent it. Often empty on bot posts. */
92
93
  text: string;
93
- /** Text roughly suitable for the model (mention markers cleaned). */
94
+ /**
95
+ * Raw mrkdwn body: top-level `text` plus attachment / Block Kit content.
96
+ * Alert feeds (Datadog, PagerDuty) leave `text` empty and put the whole
97
+ * notification in attachments, so read `body` for message content. Unlike
98
+ * {@link markdown} this keeps `<url|label>` links intact.
99
+ */
100
+ body: string;
101
+ /** Body roughly suitable for the model (mention markers cleaned). */
94
102
  markdown: string;
95
103
  ts: string;
96
104
  threadTs: string;
@@ -175,6 +183,83 @@ export type SlackMessageHandler = (
175
183
  | undefined
176
184
  | Promise<SlackDispatchDecision | null | undefined>;
177
185
 
186
+ /**
187
+ * Host probes into a Slack thread's continuation. Optional on dispatch
188
+ * deps; the serve host wires them at channel start.
189
+ */
190
+ export interface SlackContinuationProbes {
191
+ /**
192
+ * When set, full-thread hydration runs only for cold-start turns (no
193
+ * existing session). Warm turns load a `<slack_thread_delta>` instead.
194
+ */
195
+ hasContinuationSession?: (continuationToken: string) => Promise<boolean>;
196
+ /** True when a turn is already running for this Slack continuation. */
197
+ isContinuationBusy?: (continuationToken: string) => Promise<boolean>;
198
+ /**
199
+ * Warm-delta watermark from session channel state (`lastBotMessageTs`).
200
+ * When absent, delta falls back to the last matching bot post in-thread.
201
+ */
202
+ getContinuationLastBotMessageTs?: (
203
+ continuationToken: string
204
+ ) => Promise<string | undefined>;
205
+ /** Cancel the active turn + clear coalesced nudges for this continuation. */
206
+ interruptContinuation?: (continuationToken: string) => Promise<boolean>;
207
+ }
208
+
209
+ /**
210
+ * A Block Kit action click (Socket Mode `block_actions` payload) that the
211
+ * framework does not own — the built-in tool-approval Approve/Deny actions
212
+ * are routed to `resolveApproval` before author handlers see anything.
213
+ */
214
+ export interface SlackBlockAction {
215
+ /** `action_id` of the clicked element. */
216
+ actionId: string;
217
+ /** `block_id` of the actions row holding the element (Slack always sets one). */
218
+ blockId: string;
219
+ /**
220
+ * Element `value` payload; empty string when absent (button-style
221
+ * elements only — select/overflow `selected_option`s are not read).
222
+ */
223
+ value: string;
224
+ /** Plain-text label of the clicked element, when present. */
225
+ label?: string;
226
+ channelId: string;
227
+ /**
228
+ * Thread of the message carrying the element (the message's own ts when
229
+ * it is a top-level post — clicks on a thread root stay in its thread).
230
+ */
231
+ threadTs: string;
232
+ /** The message carrying the clicked element. */
233
+ messageTs: string;
234
+ /** That message's blocks, for `chat.update` resolution cards. */
235
+ messageBlocks?: unknown[];
236
+ /** Slack user who clicked. */
237
+ userId: string;
238
+ userName?: string;
239
+ teamId?: string;
240
+ /**
241
+ * Slack `action_ts` — unique per click; block-action dispatch dedupes on
242
+ * it. Empty when the payload omitted it (malformed; never dispatched).
243
+ */
244
+ actionTs: string;
245
+ }
246
+
247
+ /**
248
+ * Author handler for {@link SlackBlockAction} clicks. Return a
249
+ * {@link SlackDispatchDecision} to dispatch a turn on the click's thread —
250
+ * the click is dispatched like an inbound message from the clicking user
251
+ * (thread-scoped continuation, `<slack_context>` naming the clicker) — or
252
+ * `null` to ignore the click.
253
+ */
254
+ export type SlackBlockActionHandler = (
255
+ ctx: SlackBinding,
256
+ action: SlackBlockAction
257
+ ) =>
258
+ | SlackDispatchDecision
259
+ | null
260
+ | undefined
261
+ | Promise<SlackDispatchDecision | null | undefined>;
262
+
178
263
  /**
179
264
  * Opt-in channel watch: dispatch on posts in explicitly allowlisted
180
265
  * channels without requiring an @mention. There is deliberately no
@@ -371,6 +456,18 @@ export interface SlackChannelOptions {
371
456
  * only — rejected on `cursorAccount: true`.
372
457
  */
373
458
  interactivity?: boolean;
459
+ /**
460
+ * Handler for Block Kit actions the framework does not own (the built-in
461
+ * tool-approval Approve/Deny clicks are routed to `resolveApproval`
462
+ * first). Return a {@link SlackDispatchDecision} — typically with a
463
+ * thread-scoped auth via `buildSlackAuthContext` so replies in the same
464
+ * thread continue the session — to dispatch a turn on the click's
465
+ * thread, or `null` to ignore the click. Setting this implies
466
+ * interactive routing; the Slack app manifest still needs
467
+ * `interactivity` enabled (`buildSlackManifest({ interactivity: true })`).
468
+ * Socket Mode only — rejected on `cursorAccount: true`.
469
+ */
470
+ onBlockAction?: SlackBlockActionHandler;
374
471
  /**
375
472
  * Suggested prompts shown when an assistant thread starts (and optionally
376
473
  * after a turn completes).
@@ -416,6 +513,13 @@ export interface SlackManifestOptions {
416
513
  channelPosts?: boolean;
417
514
  /** Seed suggested prompts into the manifest `assistant_view`. */
418
515
  suggestedPrompts?: Array<{ title: string; message: string }>;
516
+ /**
517
+ * Emit `settings.managed_app_settings`. Defaults to `true` — Cursor
518
+ * provisions these apps through its manager app. Pass `false` for a
519
+ * manifest a human pastes into api.slack.com: only a manager user token
520
+ * may set that block.
521
+ */
522
+ managedByCursor?: boolean;
419
523
  }
420
524
 
421
525
  /** Soft-fail result for optional Slack API features. */
@@ -30,8 +30,10 @@
30
30
  * to be signed in (`agent-serve login` or `CURSOR_API_KEY`):
31
31
  *
32
32
  * ```ts
33
- * // agent/mcp-connections/cursor.ts — every connected server
33
+ * // agent/mcp-connections/cursor.ts — every connected server (no allowlist)
34
34
  * export default defineConnection({ cursorAccount: true });
35
+ * // equivalent explicit form:
36
+ * export default defineConnection({ cursorAccount: true, servers: "*" });
35
37
  *
36
38
  * // or restrict to specific connectors by name
37
39
  * export default defineConnection({ cursorAccount: true, servers: ["Linear"] });
@@ -86,6 +88,7 @@ export type {
86
88
  HostMcpRegistry,
87
89
  HostMcpToolInfo,
88
90
  } from "./types.js";
91
+ export { normalizeCursorAccountServers } from "./types.js";
89
92
 
90
93
  export function defineConnection(
91
94
  config: ConnectionConfig