@cursor/july 0.1.97 → 0.1.100

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 (337) hide show
  1. package/AGENTS.md +5 -3
  2. package/dist/bin/agent-serve.js +6 -7
  3. package/dist/channels/github/defaults.d.ts.map +1 -1
  4. package/dist/channels/github/defaults.js +28 -3
  5. package/dist/channels/github/github-channel.d.ts.map +1 -1
  6. package/dist/channels/github/github-channel.js +16 -0
  7. package/dist/channels/github/progress.d.ts +7 -0
  8. package/dist/channels/github/progress.d.ts.map +1 -1
  9. package/dist/channels/origin/origin-channel.d.ts +2 -0
  10. package/dist/channels/origin/origin-channel.d.ts.map +1 -1
  11. package/dist/channels/origin/origin-channel.js +37 -4
  12. package/dist/channels/slack/api.d.ts +16 -7
  13. package/dist/channels/slack/api.d.ts.map +1 -1
  14. package/dist/channels/slack/api.js +29 -13
  15. package/dist/channels/slack/constants.d.ts +6 -0
  16. package/dist/channels/slack/constants.d.ts.map +1 -1
  17. package/dist/channels/slack/constants.js +6 -0
  18. package/dist/channels/slack/defaults.d.ts +9 -4
  19. package/dist/channels/slack/defaults.d.ts.map +1 -1
  20. package/dist/channels/slack/defaults.js +221 -122
  21. package/dist/channels/slack/dispatch.d.ts.map +1 -1
  22. package/dist/channels/slack/dispatch.js +3 -3
  23. package/dist/channels/slack/inbound.d.ts +9 -0
  24. package/dist/channels/slack/inbound.d.ts.map +1 -1
  25. package/dist/channels/slack/inbound.js +14 -0
  26. package/dist/channels/slack/index.d.ts +1 -0
  27. package/dist/channels/slack/index.d.ts.map +1 -1
  28. package/dist/channels/slack/index.js +1 -0
  29. package/dist/channels/slack/live-delivery.d.ts +6 -1
  30. package/dist/channels/slack/live-delivery.d.ts.map +1 -1
  31. package/dist/channels/slack/live-delivery.js +110 -20
  32. package/dist/channels/slack/progress-delivery.d.ts +28 -0
  33. package/dist/channels/slack/progress-delivery.d.ts.map +1 -0
  34. package/dist/channels/slack/progress-delivery.js +115 -0
  35. package/dist/channels/slack/reasoning-card.d.ts +38 -0
  36. package/dist/channels/slack/reasoning-card.d.ts.map +1 -0
  37. package/dist/channels/slack/reasoning-card.js +104 -0
  38. package/dist/channels/slack/redact.d.ts +2 -0
  39. package/dist/channels/slack/redact.d.ts.map +1 -0
  40. package/dist/channels/slack/redact.js +5 -0
  41. package/dist/channels/slack/reply-options.d.ts +40 -0
  42. package/dist/channels/slack/reply-options.d.ts.map +1 -0
  43. package/dist/channels/slack/reply-options.js +150 -0
  44. package/dist/channels/slack/slack-channel.d.ts.map +1 -1
  45. package/dist/channels/slack/slack-channel.js +8 -4
  46. package/dist/channels/slack/stream.d.ts +22 -10
  47. package/dist/channels/slack/stream.d.ts.map +1 -1
  48. package/dist/channels/slack/stream.js +9 -16
  49. package/dist/channels/slack/tool-cards.d.ts +22 -0
  50. package/dist/channels/slack/tool-cards.d.ts.map +1 -0
  51. package/dist/channels/slack/tool-cards.js +178 -0
  52. package/dist/channels/slack/types.d.ts +154 -7
  53. package/dist/channels/slack/types.d.ts.map +1 -1
  54. package/dist/docs/404.html +2 -2
  55. package/dist/docs/ab.html +6 -6
  56. package/dist/docs/ab.md +1 -1
  57. package/dist/docs/assets/{ab.md.DJo5r4R-.js → ab.md.mlVgqvSk.js} +1 -1
  58. package/dist/docs/assets/{app.B3rWNYE1.js → app.DZ1e0Ycq.js} +1 -1
  59. package/dist/docs/assets/{building-with-agents.md.DI4mEzlt.js → building-with-agents.md.CUSWxlP_.js} +2 -2
  60. package/dist/docs/assets/chunks/@localSearchIndexroot.j70vvPL4.js +1 -0
  61. package/dist/docs/assets/chunks/{VPLocalSearchBox.C1lhqJJR.js → VPLocalSearchBox.l8omwc6D.js} +1 -1
  62. package/dist/docs/assets/chunks/{theme.B40_SXuv.js → theme.JVcD6gel.js} +2 -2
  63. package/dist/docs/assets/{evals.md.lfJoEVc8.js → evals.md.CPzDAwoH.js} +1 -1
  64. package/dist/docs/assets/{guides_github.md.Cnh2mL4a.js → guides_github.md.BtPr9GaP.js} +1 -1
  65. package/dist/docs/assets/{guides_mcp-oauth.md.CN-6YmTJ.js → guides_mcp-oauth.md.Dp6cDP7f.js} +1 -1
  66. package/dist/docs/assets/{guides_opentelemetry.md.bmPmkvJu.js → guides_opentelemetry.md.BVTXDCRg.js} +2 -2
  67. package/dist/docs/assets/{guides_slack.md.VDXQV3ja.js → guides_slack.md.9oHPye9o.js} +19 -3
  68. package/dist/docs/assets/{guides_slack.md.VDXQV3ja.lean.js → guides_slack.md.9oHPye9o.lean.js} +1 -1
  69. package/dist/docs/assets/hillclimbing.md.CpTGTCle.js +4 -0
  70. package/dist/docs/assets/{index.md.CVeRUOeZ.js → index.md.Bb4k8kUm.js} +1 -1
  71. package/dist/docs/assets/{quickstart.md.Nj_LjW_a.js → quickstart.md.DdQOF7Y8.js} +1 -1
  72. package/dist/docs/assets/{reference_cli.md.RyZf5OTE.js → reference_cli.md.DfoeyvL0.js} +4 -4
  73. package/dist/docs/assets/{reference_cli.md.RyZf5OTE.lean.js → reference_cli.md.DfoeyvL0.lean.js} +1 -1
  74. package/dist/docs/assets/{reference_connections.md.DxldvyIB.js → reference_connections.md.BiGoBAk2.js} +1 -1
  75. package/dist/docs/assets/{reference_http-api.md.5zOAbV86.js → reference_http-api.md.BEJx9XVj.js} +1 -1
  76. package/dist/docs/assets/{reference_tools.md.B84gw9Ii.js → reference_tools.md.CvAHsdSp.js} +10 -2
  77. package/dist/docs/assets/{reference_tools.md.B84gw9Ii.lean.js → reference_tools.md.CvAHsdSp.lean.js} +1 -1
  78. package/dist/docs/assets/scaffolding-agents.md.em43xlY1.js +1 -0
  79. package/dist/docs/assets/skills_ab.md.CsFNatVx.js +26 -0
  80. package/dist/docs/assets/skills_ab.md.CsFNatVx.lean.js +1 -0
  81. package/dist/docs/assets/skills_create-agent.md.BVoWPcan.js +8 -0
  82. package/dist/docs/assets/skills_create-agent.md.BVoWPcan.lean.js +1 -0
  83. package/dist/docs/assets/skills_debug.md.CDbPhHfg.js +1 -0
  84. package/dist/docs/assets/skills_debug.md.CDbPhHfg.lean.js +1 -0
  85. package/dist/docs/assets/skills_evals.md.723kpUmA.js +25 -0
  86. package/dist/docs/assets/skills_evals.md.723kpUmA.lean.js +1 -0
  87. package/dist/docs/assets/skills_framework-map.md.BTi817yv.js +1 -0
  88. package/dist/docs/assets/skills_framework-map.md.BTi817yv.lean.js +1 -0
  89. package/dist/docs/assets/skills_github.md.D0JahM8c.js +16 -0
  90. package/dist/docs/assets/skills_github.md.D0JahM8c.lean.js +1 -0
  91. package/dist/docs/assets/skills_hillclimb.md.B_zJerxA.js +7 -0
  92. package/dist/docs/assets/skills_hillclimb.md.B_zJerxA.lean.js +1 -0
  93. package/dist/docs/assets/skills_index.md.DKwIxzGg.js +1 -0
  94. package/dist/docs/assets/skills_index.md.DKwIxzGg.lean.js +1 -0
  95. package/dist/docs/assets/skills_mcp-auth.md.DGvFP3HE.js +18 -0
  96. package/dist/docs/assets/skills_mcp-auth.md.DGvFP3HE.lean.js +1 -0
  97. package/dist/docs/assets/skills_otel.md.CgiZryR3.js +8 -0
  98. package/dist/docs/assets/skills_otel.md.CgiZryR3.lean.js +1 -0
  99. package/dist/docs/assets/skills_setup-slack.md.BBgx8lUz.js +20 -0
  100. package/dist/docs/assets/skills_setup-slack.md.BBgx8lUz.lean.js +1 -0
  101. package/dist/docs/assets/{troubleshooting.md.DCiPBhYs.js → troubleshooting.md.Cus_YZga.js} +1 -1
  102. package/dist/docs/building-with-agents.html +6 -6
  103. package/dist/docs/building-with-agents.md +14 -11
  104. package/dist/docs/concepts.html +4 -4
  105. package/dist/docs/deployment.html +4 -4
  106. package/dist/docs/design/runtime-abstraction.md +1757 -0
  107. package/dist/docs/evals.html +6 -6
  108. package/dist/docs/evals.md +1 -1
  109. package/dist/docs/guides/agent-to-agent.html +4 -4
  110. package/dist/docs/guides/cloud-runtime.html +4 -4
  111. package/dist/docs/guides/convert-automation.html +4 -4
  112. package/dist/docs/guides/github.html +5 -5
  113. package/dist/docs/guides/github.md +1 -1
  114. package/dist/docs/guides/human-in-the-loop.html +4 -4
  115. package/dist/docs/guides/mcp-oauth.html +5 -5
  116. package/dist/docs/guides/mcp-oauth.md +1 -1
  117. package/dist/docs/guides/opentelemetry.html +7 -7
  118. package/dist/docs/guides/opentelemetry.md +2 -2
  119. package/dist/docs/guides/slack.html +22 -6
  120. package/dist/docs/guides/slack.md +80 -1
  121. package/dist/docs/guides/webhooks.html +5 -5
  122. package/dist/docs/hashmap.json +1 -1
  123. package/dist/docs/hillclimbing.html +6 -6
  124. package/dist/docs/hillclimbing.md +5 -5
  125. package/dist/docs/index.html +6 -6
  126. package/dist/docs/index.md +1 -1
  127. package/dist/docs/llms-full.txt +2830 -37
  128. package/dist/docs/llms.txt +15 -0
  129. package/dist/docs/quickstart.html +5 -5
  130. package/dist/docs/quickstart.md +1 -1
  131. package/dist/docs/reference/agent-config.html +4 -4
  132. package/dist/docs/reference/artifacts.html +4 -4
  133. package/dist/docs/reference/channels.html +4 -4
  134. package/dist/docs/reference/cli.html +7 -7
  135. package/dist/docs/reference/cli.md +1 -7
  136. package/dist/docs/reference/connections.html +6 -6
  137. package/dist/docs/reference/connections.md +1 -1
  138. package/dist/docs/reference/hooks.html +4 -4
  139. package/dist/docs/reference/http-api.html +6 -6
  140. package/dist/docs/reference/http-api.md +1 -0
  141. package/dist/docs/reference/instructions.html +4 -4
  142. package/dist/docs/reference/playground.html +4 -4
  143. package/dist/docs/reference/project-layout.html +4 -4
  144. package/dist/docs/reference/prompt.html +4 -4
  145. package/dist/docs/reference/schedules.html +4 -4
  146. package/dist/docs/reference/sessions.html +4 -4
  147. package/dist/docs/reference/skills.html +4 -4
  148. package/dist/docs/reference/subagents.html +4 -4
  149. package/dist/docs/reference/tools.html +14 -6
  150. package/dist/docs/reference/tools.md +25 -0
  151. package/dist/docs/scaffolding-agents.html +5 -5
  152. package/dist/docs/scaffolding-agents.md +3 -3
  153. package/dist/docs/skills/ab.html +52 -0
  154. package/dist/docs/skills/ab.md +50 -0
  155. package/dist/docs/skills/create-agent.html +34 -0
  156. package/dist/docs/skills/create-agent.md +160 -0
  157. package/dist/docs/skills/debug.html +27 -0
  158. package/dist/docs/skills/debug.md +36 -0
  159. package/dist/docs/skills/evals.html +51 -0
  160. package/dist/docs/skills/evals.md +99 -0
  161. package/dist/docs/skills/framework-map.html +27 -0
  162. package/dist/docs/skills/framework-map.md +95 -0
  163. package/dist/docs/skills/github.html +42 -0
  164. package/dist/docs/skills/github.md +93 -0
  165. package/dist/docs/skills/hillclimb.html +33 -0
  166. package/dist/docs/skills/hillclimb.md +55 -0
  167. package/dist/docs/skills/index.html +27 -0
  168. package/dist/docs/skills/index.md +21 -0
  169. package/dist/docs/skills/mcp-auth.html +44 -0
  170. package/dist/docs/skills/mcp-auth.md +76 -0
  171. package/dist/docs/skills/otel.html +34 -0
  172. package/dist/docs/skills/otel.md +48 -0
  173. package/dist/docs/skills/setup-slack.html +46 -0
  174. package/dist/docs/skills/setup-slack.md +141 -0
  175. package/dist/docs/storage.html +4 -4
  176. package/dist/docs/templates/agentic-owners.html +4 -4
  177. package/dist/docs/templates/agents-md.html +4 -4
  178. package/dist/docs/templates/code-wiki.html +4 -4
  179. package/dist/docs/templates/demo.html +4 -4
  180. package/dist/docs/templates/pr-autofixer.html +4 -4
  181. package/dist/docs/templates/security-help.html +4 -4
  182. package/dist/docs/templates/security-reviewer.html +4 -4
  183. package/dist/docs/templates/triage.html +4 -4
  184. package/dist/docs/troubleshooting.html +5 -5
  185. package/dist/docs/troubleshooting.md +1 -1
  186. package/dist/files-backends/cursor-hosted.d.ts +9 -2
  187. package/dist/files-backends/cursor-hosted.d.ts.map +1 -1
  188. package/dist/files-backends/cursor-hosted.js +9 -11
  189. package/dist/index.d.ts +1 -0
  190. package/dist/index.d.ts.map +1 -1
  191. package/dist/index.js +1 -0
  192. package/dist/internal/as-of.d.ts +19 -0
  193. package/dist/internal/as-of.d.ts.map +1 -0
  194. package/dist/internal/as-of.js +82 -0
  195. package/dist/internal/cli-deploy.d.ts +2 -1
  196. package/dist/internal/cli-deploy.d.ts.map +1 -1
  197. package/dist/internal/cli-deploy.js +102 -7
  198. package/dist/internal/conversation-mirror.d.ts.map +1 -1
  199. package/dist/internal/conversation-mirror.js +3 -4
  200. package/dist/internal/cursor/hosted-store-secrets.d.ts +15 -0
  201. package/dist/internal/cursor/hosted-store-secrets.d.ts.map +1 -0
  202. package/dist/internal/cursor/hosted-store-secrets.js +48 -0
  203. package/dist/internal/cursor-event-relay.d.ts.map +1 -1
  204. package/dist/internal/cursor-event-relay.js +5 -6
  205. package/dist/internal/deploy-client.d.ts +6 -6
  206. package/dist/internal/deploy-client.js +7 -7
  207. package/dist/internal/discovery.d.ts.map +1 -1
  208. package/dist/internal/discovery.js +11 -1
  209. package/dist/internal/framework-file-storage.d.ts +5 -4
  210. package/dist/internal/framework-file-storage.d.ts.map +1 -1
  211. package/dist/internal/framework-file-storage.js +6 -4
  212. package/dist/internal/framework-storage-selection.d.ts +13 -11
  213. package/dist/internal/framework-storage-selection.d.ts.map +1 -1
  214. package/dist/internal/framework-storage-selection.js +28 -23
  215. package/dist/internal/hosted-admission-adapter.d.ts +28 -0
  216. package/dist/internal/hosted-admission-adapter.d.ts.map +1 -0
  217. package/dist/internal/hosted-admission-adapter.js +7 -0
  218. package/dist/internal/hosted-delivery-protocol.d.ts +6 -1
  219. package/dist/internal/hosted-delivery-protocol.d.ts.map +1 -1
  220. package/dist/internal/hosted-delivery-protocol.js +1 -1
  221. package/dist/internal/hosted-delivery.d.ts +15 -1
  222. package/dist/internal/hosted-delivery.d.ts.map +1 -1
  223. package/dist/internal/hosted-delivery.js +47 -21
  224. package/dist/internal/hosted-execution-diag.d.ts +11 -0
  225. package/dist/internal/hosted-execution-diag.d.ts.map +1 -1
  226. package/dist/internal/hosted-execution-diag.js +39 -2
  227. package/dist/internal/http-channel.d.ts.map +1 -1
  228. package/dist/internal/http-channel.js +4 -1
  229. package/dist/internal/server.d.ts +3 -0
  230. package/dist/internal/server.d.ts.map +1 -1
  231. package/dist/internal/server.js +82 -19
  232. package/dist/internal/session-engine.d.ts.map +1 -1
  233. package/dist/internal/session-engine.js +24 -4
  234. package/dist/internal/session-run-log.d.ts +120 -0
  235. package/dist/internal/session-run-log.d.ts.map +1 -0
  236. package/dist/internal/session-run-log.js +358 -0
  237. package/dist/internal/tool-policy.d.ts +20 -8
  238. package/dist/internal/tool-policy.d.ts.map +1 -1
  239. package/dist/internal/tool-policy.js +11 -0
  240. package/dist/playground/assets/index-BszoQDc6.css +1 -0
  241. package/dist/playground/assets/index-DVs98vPL.js +69 -0
  242. package/dist/playground/index.html +2 -2
  243. package/dist/storage-backends/cursor-hosted-v2.d.ts +83 -0
  244. package/dist/storage-backends/cursor-hosted-v2.d.ts.map +1 -0
  245. package/dist/storage-backends/cursor-hosted-v2.js +164 -0
  246. package/dist/storage-backends/cursor-hosted.d.ts +6 -0
  247. package/dist/storage-backends/cursor-hosted.d.ts.map +1 -1
  248. package/dist/storage-backends/cursor-hosted.js +6 -1
  249. package/dist/storage-protocol.d.ts +8 -0
  250. package/dist/storage-protocol.d.ts.map +1 -1
  251. package/dist/storage-protocol.js +8 -0
  252. package/dist/tools.d.ts +12 -2
  253. package/dist/tools.d.ts.map +1 -1
  254. package/dist/types.d.ts +30 -0
  255. package/dist/types.d.ts.map +1 -1
  256. package/docs/README.md +1 -1
  257. package/docs/ab.md +1 -1
  258. package/docs/building-with-agents.md +14 -11
  259. package/docs/design/runtime-abstraction.md +1757 -0
  260. package/docs/evals.md +1 -1
  261. package/docs/guides/github.md +1 -1
  262. package/docs/guides/mcp-oauth.md +1 -1
  263. package/docs/guides/opentelemetry.md +2 -2
  264. package/docs/guides/slack.md +80 -1
  265. package/docs/hillclimbing.md +5 -5
  266. package/docs/quickstart.md +1 -1
  267. package/docs/reference/cli.md +1 -7
  268. package/docs/reference/connections.md +1 -1
  269. package/docs/reference/http-api.md +1 -0
  270. package/docs/reference/tools.md +25 -0
  271. package/docs/scaffolding-agents.md +3 -3
  272. package/docs/skills/index.md +26 -0
  273. package/docs/troubleshooting.md +1 -1
  274. package/package.json +1 -1
  275. package/src/bin/agent-serve.ts +6 -7
  276. package/src/channels/github/defaults.ts +36 -3
  277. package/src/channels/github/github-channel.ts +17 -0
  278. package/src/channels/github/progress.ts +7 -0
  279. package/src/channels/origin/origin-channel.ts +74 -10
  280. package/src/channels/slack/api.ts +35 -17
  281. package/src/channels/slack/constants.ts +6 -0
  282. package/src/channels/slack/defaults.ts +253 -144
  283. package/src/channels/slack/dispatch.ts +10 -1
  284. package/src/channels/slack/inbound.ts +17 -0
  285. package/src/channels/slack/index.ts +1 -0
  286. package/src/channels/slack/live-delivery.ts +135 -22
  287. package/src/channels/slack/progress-delivery.ts +133 -0
  288. package/src/channels/slack/reasoning-card.ts +140 -0
  289. package/src/channels/slack/redact.ts +6 -0
  290. package/src/channels/slack/reply-options.ts +229 -0
  291. package/src/channels/slack/slack-channel.ts +7 -2
  292. package/src/channels/slack/stream.ts +31 -24
  293. package/src/channels/slack/tool-cards.ts +221 -0
  294. package/src/channels/slack/types.ts +168 -7
  295. package/src/files-backends/cursor-hosted.ts +18 -7
  296. package/src/index.ts +4 -0
  297. package/src/internal/as-of.ts +107 -0
  298. package/src/internal/cli-deploy.ts +130 -10
  299. package/src/internal/conversation-mirror.ts +3 -8
  300. package/src/internal/cursor/hosted-store-secrets.ts +72 -0
  301. package/src/internal/cursor-event-relay.ts +5 -6
  302. package/src/internal/deploy-client.ts +10 -10
  303. package/src/internal/discovery.ts +9 -1
  304. package/src/internal/framework-file-storage.ts +6 -4
  305. package/src/internal/framework-storage-selection.ts +28 -25
  306. package/src/internal/hosted-admission-adapter.ts +42 -0
  307. package/src/internal/hosted-delivery-protocol.ts +7 -2
  308. package/src/internal/hosted-delivery.ts +88 -36
  309. package/src/internal/hosted-execution-diag.ts +45 -0
  310. package/src/internal/http-channel.ts +8 -0
  311. package/src/internal/server.ts +100 -2
  312. package/src/internal/session-engine.ts +32 -1
  313. package/src/internal/session-run-log.ts +579 -0
  314. package/src/internal/tool-policy.ts +31 -9
  315. package/src/storage-backends/cursor-hosted-v2.ts +219 -0
  316. package/src/storage-backends/cursor-hosted.ts +6 -1
  317. package/src/storage-protocol.ts +10 -0
  318. package/src/tools.ts +12 -2
  319. package/src/types.ts +30 -0
  320. package/dist/docs/assets/chunks/@localSearchIndexroot.BU9nHdnQ.js +0 -1
  321. package/dist/docs/assets/hillclimbing.md.DhESf3OO.js +0 -4
  322. package/dist/docs/assets/scaffolding-agents.md.D7UUkWw0.js +0 -1
  323. package/dist/playground/assets/index-DrkI6y5O.js +0 -88
  324. package/dist/playground/assets/index-DzNGwm7q.css +0 -1
  325. /package/dist/docs/assets/{ab.md.DJo5r4R-.lean.js → ab.md.mlVgqvSk.lean.js} +0 -0
  326. /package/dist/docs/assets/{building-with-agents.md.DI4mEzlt.lean.js → building-with-agents.md.CUSWxlP_.lean.js} +0 -0
  327. /package/dist/docs/assets/{evals.md.lfJoEVc8.lean.js → evals.md.CPzDAwoH.lean.js} +0 -0
  328. /package/dist/docs/assets/{guides_github.md.Cnh2mL4a.lean.js → guides_github.md.BtPr9GaP.lean.js} +0 -0
  329. /package/dist/docs/assets/{guides_mcp-oauth.md.CN-6YmTJ.lean.js → guides_mcp-oauth.md.Dp6cDP7f.lean.js} +0 -0
  330. /package/dist/docs/assets/{guides_opentelemetry.md.bmPmkvJu.lean.js → guides_opentelemetry.md.BVTXDCRg.lean.js} +0 -0
  331. /package/dist/docs/assets/{hillclimbing.md.DhESf3OO.lean.js → hillclimbing.md.CpTGTCle.lean.js} +0 -0
  332. /package/dist/docs/assets/{index.md.CVeRUOeZ.lean.js → index.md.Bb4k8kUm.lean.js} +0 -0
  333. /package/dist/docs/assets/{quickstart.md.Nj_LjW_a.lean.js → quickstart.md.DdQOF7Y8.lean.js} +0 -0
  334. /package/dist/docs/assets/{reference_connections.md.DxldvyIB.lean.js → reference_connections.md.BiGoBAk2.lean.js} +0 -0
  335. /package/dist/docs/assets/{reference_http-api.md.5zOAbV86.lean.js → reference_http-api.md.BEJx9XVj.lean.js} +0 -0
  336. /package/dist/docs/assets/{scaffolding-agents.md.D7UUkWw0.lean.js → scaffolding-agents.md.em43xlY1.lean.js} +0 -0
  337. /package/dist/docs/assets/{troubleshooting.md.DCiPBhYs.lean.js → troubleshooting.md.Cus_YZga.lean.js} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"live-delivery.d.ts","sourceRoot":"","sources":["../../../src/channels/slack/live-delivery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAE1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAuB,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEnE,KAAK,YAAY,GAAG,mBAAmB,CAAC,iBAAiB,CAAC,CAAC;AAE3D,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,aAAa,GAAG,SAAS,CAAC;IACpC,MAAM,EAAE,MAAM,QAAQ,CAAC;CACxB;AAED,KAAK,QAAQ,GAAG;IACd,OAAO,EAAE,YAAY,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,eAAe,EAAE,CAAC;CAC5B,CAAC;AAEF,KAAK,UAAU,GAAG;IAChB,OAAO,EAAE,YAAY,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,yEAAyE;IACzE,IAAI,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,YAAY,CACV,IAAI,EAAE,UAAU,GAAG;QAAE,MAAM,EAAE,eAAe,EAAE,CAAA;KAAE,GAC/C,OAAO,CAAC,OAAO,CAAC,CAAC;IACpB;;;OAGG;IACH,QAAQ,CACN,IAAI,EAAE,UAAU,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAClC,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACnC,aAAa,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,YAAY,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,aAAa,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,YAAY,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,IAAI,CACF,IAAI,EAAE,UAAU,GAAG;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,GACvC,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CACpC;AAmBD,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,gBAAgB,GACrB,oBAAoB,CA0PtB"}
1
+ {"version":3,"file":"live-delivery.d.ts","sourceRoot":"","sources":["../../../src/channels/slack/live-delivery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAQ1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAIL,KAAK,eAAe,EACrB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEnE,KAAK,YAAY,GAAG,mBAAmB,CAAC,iBAAiB,CAAC,CAAC;AAE3D,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,aAAa,GAAG,SAAS,CAAC;IACpC,MAAM,EAAE,MAAM,QAAQ,CAAC;CACxB;AAED,KAAK,QAAQ,GAAG;IACd,OAAO,EAAE,YAAY,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,eAAe,EAAE,CAAC;CAC5B,CAAC;AAEF,KAAK,UAAU,GAAG;IAChB,OAAO,EAAE,YAAY,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,yEAAyE;IACzE,IAAI,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,YAAY,CACV,IAAI,EAAE,UAAU,GAAG;QAAE,MAAM,EAAE,eAAe,EAAE,CAAA;KAAE,GAC/C,OAAO,CAAC,OAAO,CAAC,CAAC;IACpB;;;OAGG;IACH,QAAQ,CACN,IAAI,EAAE,UAAU,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAClC,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACnC,aAAa,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,YAAY,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,aAAa,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,YAAY,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,IAAI,CACF,IAAI,EAAE,UAAU,GAAG;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,GACvC,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CACpC;AAmBD,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,gBAAgB,GACrB,oBAAoB,CA2VtB"}
@@ -8,6 +8,11 @@
8
8
  * Assistant-pane threads only render stream APIs. Start lazily with the
9
9
  * first real markdown/chunks plus recipient ids — empty startStream is
10
10
  * rejected or never attaches.
11
+ *
12
+ * Every call speaks `chunks`. Slack pins a stream's mode at start: text
13
+ * opened as bare `markdown_text` rejects later `task_update` appends with
14
+ * `streaming_mode_mismatch`, so assistant text goes out as `markdown_text`
15
+ * chunks and tool steps can land in the same message.
11
16
  */
12
17
  var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
13
18
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
@@ -18,8 +23,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
18
23
  step((generator = generator.apply(thisArg, _arguments || [])).next());
19
24
  });
20
25
  };
21
- import { appendChatStream, startChatStream, stopChatStream } from "./api.js";
22
- import { computeStreamAppend } from "./stream.js";
26
+ import { appendChatStream, postMessage, startChatStream, stopChatStream, } from "./api.js";
27
+ import { SLACK_MARKDOWN_TEXT_MAX_LEN } from "./constants.js";
28
+ import { computeStreamAppend, markdownChunk, } from "./stream.js";
23
29
  function streamRecipients(channel) {
24
30
  const user = channel.state.triggeringUserId;
25
31
  const team = channel.state.teamId;
@@ -38,13 +44,17 @@ export function createStreamDeliveryStrategy(deps) {
38
44
  if (activeStreamTs(channel) !== null) {
39
45
  return true;
40
46
  }
41
- const hasMarkdown = markdown_text !== undefined && markdown_text !== "";
42
- const hasChunks = chunks !== undefined && chunks.length > 0;
43
- if (!hasMarkdown && !hasChunks) {
47
+ const openingText = markdown_text !== null && markdown_text !== void 0 ? markdown_text : "";
48
+ const opening = [];
49
+ if (openingText !== "") {
50
+ opening.push(markdownChunk(openingText));
51
+ }
52
+ opening.push(...(chunks !== null && chunks !== void 0 ? chunks : []));
53
+ if (opening.length === 0) {
44
54
  return false;
45
55
  }
46
56
  const log = getLog();
47
- const started = yield startChatStream(Object.assign({ botToken, channel: channelId, thread_ts: threadTs, markdown_text: hasMarkdown ? markdown_text : undefined, chunks: hasChunks ? chunks : undefined }, streamRecipients(channel)));
57
+ const started = yield startChatStream(Object.assign({ botToken, channel: channelId, thread_ts: threadTs, chunks: opening }, streamRecipients(channel)));
48
58
  if (!started.ok) {
49
59
  log.warn("chat.startStream unavailable", {
50
60
  error: started.error,
@@ -59,7 +69,9 @@ export function createStreamDeliveryStrategy(deps) {
59
69
  }
60
70
  channel.state.streamTs = started.ts;
61
71
  channel.state.streamChannelId = started.channel;
62
- channel.state.lastPostedText = hasMarkdown ? (markdown_text !== null && markdown_text !== void 0 ? markdown_text : "") : "";
72
+ channel.state.streamFull = false;
73
+ channel.state.lastPostedText = openingText;
74
+ channel.state.streamBlockText = openingText;
63
75
  log.info("chat.startStream ok", {
64
76
  channel: started.channel,
65
77
  stream_ts: started.ts,
@@ -87,12 +99,12 @@ export function createStreamDeliveryStrategy(deps) {
87
99
  return opened ? activeStreamTs(args.channel) : null;
88
100
  });
89
101
  const stopWithSuffix = (args) => __awaiter(this, void 0, void 0, function* () {
90
- const appendText = computeStreamAppend(args.channel.state.lastPostedText, args.text);
102
+ const appendText = computeStreamAppend(args.channel.state.streamBlockText, args.text);
91
103
  const stopped = yield stopChatStream({
92
104
  botToken,
93
105
  channel: args.channelId,
94
106
  ts: args.ts,
95
- markdown_text: appendText === "" ? undefined : appendText,
107
+ chunks: appendText === "" ? undefined : [markdownChunk(appendText)],
96
108
  });
97
109
  args.channel.state.streamTs = null;
98
110
  if (stopped.ok) {
@@ -115,11 +127,67 @@ export function createStreamDeliveryStrategy(deps) {
115
127
  yield stopChatStream({ botToken, channel: channelId, ts: orphanTs });
116
128
  channel.state.streamTs = null;
117
129
  });
130
+ /**
131
+ * `msg_too_long` means the message is full: every further append would
132
+ * fail the same way, so appends stop until `finalize` continues the reply
133
+ * in a new message.
134
+ */
135
+ const noteAppendFailure = (channel, result) => {
136
+ if (result.unsupported === true) {
137
+ channel.state.streamingUnavailable = true;
138
+ }
139
+ if (result.error === "msg_too_long") {
140
+ channel.state.streamFull = true;
141
+ }
142
+ };
143
+ /**
144
+ * The streamed message is full. Close it as it stands so it stops spinning
145
+ * and post the rest as a new thread message. Most of the answer is on Slack
146
+ * either way, so the reply counts as delivered even if that post fails: a
147
+ * duplicate would be worse than a lost tail.
148
+ */
149
+ const continueOverflow = (args) => __awaiter(this, void 0, void 0, function* () {
150
+ const { channel, channelId, ts, remainder, sessionId } = args;
151
+ const log = getLog();
152
+ yield stopChatStream({ botToken, channel: channelId, ts });
153
+ channel.state.streamTs = null;
154
+ const threadTs = channel.state.threadTs;
155
+ if (remainder === "" || threadTs === null || threadTs === "") {
156
+ return;
157
+ }
158
+ try {
159
+ const posted = yield postMessage({
160
+ botToken,
161
+ channel: channelId,
162
+ text: remainder,
163
+ threadTs,
164
+ plainText: remainder.length >= SLACK_MARKDOWN_TEXT_MAX_LEN,
165
+ });
166
+ channel.state.lastBotMessageTs = posted.ts;
167
+ log.info("reply overflowed the stream; continued in a new message", {
168
+ channel: channelId,
169
+ stream_ts: ts,
170
+ session: sessionId,
171
+ continued_chars: remainder.length,
172
+ });
173
+ }
174
+ catch (error) {
175
+ log.warn("stream overflow continuation failed", {
176
+ error: error instanceof Error ? error.message : String(error),
177
+ channel: channelId,
178
+ stream_ts: ts,
179
+ session: sessionId,
180
+ });
181
+ }
182
+ });
118
183
  return {
119
184
  inlineToolSteps: true,
120
185
  open,
121
186
  append(_a) {
122
187
  return __awaiter(this, arguments, void 0, function* ({ channel, channelId, text, sessionId }) {
188
+ if (channel.state.streamFull === true) {
189
+ return;
190
+ }
123
191
  const ts = yield ensureOpen({
124
192
  channel,
125
193
  channelId,
@@ -129,7 +197,7 @@ export function createStreamDeliveryStrategy(deps) {
129
197
  if (ts === null) {
130
198
  return;
131
199
  }
132
- const appendText = computeStreamAppend(channel.state.lastPostedText, text);
200
+ const appendText = computeStreamAppend(channel.state.streamBlockText, text);
133
201
  if (appendText === "") {
134
202
  return;
135
203
  }
@@ -137,7 +205,7 @@ export function createStreamDeliveryStrategy(deps) {
137
205
  botToken,
138
206
  channel: channelId,
139
207
  ts,
140
- markdown_text: appendText,
208
+ chunks: [markdownChunk(appendText)],
141
209
  });
142
210
  if (!result.ok) {
143
211
  getLog().warn("appendStream failed", {
@@ -146,16 +214,18 @@ export function createStreamDeliveryStrategy(deps) {
146
214
  stream_ts: ts,
147
215
  session: sessionId,
148
216
  });
149
- if (result.unsupported === true) {
150
- channel.state.streamingUnavailable = true;
151
- }
217
+ noteAppendFailure(channel, result);
152
218
  return;
153
219
  }
154
220
  channel.state.lastPostedText = text;
221
+ channel.state.streamBlockText = text;
155
222
  });
156
223
  },
157
224
  appendChunks(_a) {
158
225
  return __awaiter(this, arguments, void 0, function* ({ channel, channelId, chunks, sessionId }) {
226
+ if (channel.state.streamFull === true) {
227
+ return false;
228
+ }
159
229
  const hadStream = activeStreamTs(channel) !== null;
160
230
  const ts = yield ensureOpen({
161
231
  channel,
@@ -175,6 +245,16 @@ export function createStreamDeliveryStrategy(deps) {
175
245
  ts,
176
246
  chunks,
177
247
  });
248
+ if (!result.ok) {
249
+ getLog().warn("appendStream chunks failed", {
250
+ error: result.error,
251
+ channel: channelId,
252
+ stream_ts: ts,
253
+ session: sessionId,
254
+ chunks: chunks.length,
255
+ });
256
+ noteAppendFailure(channel, result);
257
+ }
178
258
  return result.ok;
179
259
  });
180
260
  },
@@ -190,12 +270,11 @@ export function createStreamDeliveryStrategy(deps) {
190
270
  if (ts === null) {
191
271
  return { delivered: false };
192
272
  }
193
- const stopped = yield stopWithSuffix({
194
- channel,
195
- channelId,
196
- ts,
197
- text,
198
- });
273
+ // Measured before the stop attempt mutates stream state.
274
+ const remainder = computeStreamAppend(channel.state.streamBlockText, text);
275
+ const stopped = channel.state.streamFull === true
276
+ ? { ok: false, error: "msg_too_long" }
277
+ : yield stopWithSuffix({ channel, channelId, ts, text });
199
278
  if (stopped.ok) {
200
279
  log.info("reply delivered via stream", {
201
280
  channel: channelId,
@@ -205,6 +284,17 @@ export function createStreamDeliveryStrategy(deps) {
205
284
  });
206
285
  return { delivered: true };
207
286
  }
287
+ if (stopped.error === "msg_too_long") {
288
+ yield continueOverflow({
289
+ channel,
290
+ channelId,
291
+ ts,
292
+ remainder,
293
+ sessionId,
294
+ });
295
+ channel.state.lastPostedText = text;
296
+ return { delivered: true };
297
+ }
208
298
  log.warn("chat.stopStream failed; falling back to postMessage", {
209
299
  error: stopped.error,
210
300
  channel: channelId,
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Mid-turn thread progress when `chat.startStream` is unavailable.
3
+ * One editable message; `setThreadStatus` stays on the caller.
4
+ */
5
+ import type { ChannelEventContext } from "../../types.js";
6
+ import type { SlackLog } from "./log.js";
7
+ import type { SlackBotToken, SlackChannelState } from "./types.js";
8
+ type SlackChannel = ChannelEventContext<SlackChannelState>;
9
+ export interface ProgressDeliveryDeps {
10
+ botToken: SlackBotToken | undefined;
11
+ getLog: () => SlackLog;
12
+ }
13
+ export interface ProgressDelivery {
14
+ upsert(args: {
15
+ channel: SlackChannel;
16
+ text: string;
17
+ }): Promise<void>;
18
+ replace(args: {
19
+ channel: SlackChannel;
20
+ text: string;
21
+ }): Promise<boolean>;
22
+ clear(args: {
23
+ channel: SlackChannel;
24
+ }): Promise<void>;
25
+ }
26
+ export declare function createProgressDelivery(deps: ProgressDeliveryDeps): ProgressDelivery;
27
+ export {};
28
+ //# sourceMappingURL=progress-delivery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress-delivery.d.ts","sourceRoot":"","sources":["../../../src/channels/slack/progress-delivery.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAE1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEnE,KAAK,YAAY,GAAG,mBAAmB,CAAC,iBAAiB,CAAC,CAAC;AAE3D,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,aAAa,GAAG,SAAS,CAAC;IACpC,MAAM,EAAE,MAAM,QAAQ,CAAC;CACxB;AAOD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,YAAY,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrE,OAAO,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,YAAY,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACzE,KAAK,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,YAAY,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACvD;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,oBAAoB,GACzB,gBAAgB,CAsGlB"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Mid-turn thread progress when `chat.startStream` is unavailable.
3
+ * One editable message; `setThreadStatus` stays on the caller.
4
+ */
5
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
6
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
7
+ return new (P || (P = Promise))(function (resolve, reject) {
8
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
9
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
10
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
11
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
12
+ });
13
+ };
14
+ import { deleteMessage, postMessage, updateMessage } from "./api.js";
15
+ function activeProgressTs(state) {
16
+ const ts = state.progressTs;
17
+ return ts == null || ts === "" ? null : ts;
18
+ }
19
+ export function createProgressDelivery(deps) {
20
+ const { botToken, getLog } = deps;
21
+ const clear = (args) => __awaiter(this, void 0, void 0, function* () {
22
+ const state = args.channel.state;
23
+ const ts = activeProgressTs(state);
24
+ state.progressTs = null;
25
+ if (ts === null || state.channelId === null) {
26
+ return;
27
+ }
28
+ const deleted = yield deleteMessage({
29
+ botToken,
30
+ channel: state.channelId,
31
+ ts,
32
+ });
33
+ if (!deleted.ok) {
34
+ getLog().warn("progress delete failed", {
35
+ error: deleted.error,
36
+ channel: state.channelId,
37
+ progress_ts: ts,
38
+ });
39
+ }
40
+ });
41
+ return {
42
+ upsert(args) {
43
+ return __awaiter(this, void 0, void 0, function* () {
44
+ const state = args.channel.state;
45
+ if (state.channelId === null ||
46
+ state.threadTs === null ||
47
+ args.text === "") {
48
+ return;
49
+ }
50
+ const existing = activeProgressTs(state);
51
+ if (existing !== null) {
52
+ const updated = yield updateMessage({
53
+ botToken,
54
+ channel: state.channelId,
55
+ ts: existing,
56
+ text: args.text,
57
+ });
58
+ if (updated.ok) {
59
+ return;
60
+ }
61
+ getLog().warn("progress update failed; posting a new message", {
62
+ error: updated.error,
63
+ channel: state.channelId,
64
+ thread_ts: state.threadTs,
65
+ progress_ts: existing,
66
+ });
67
+ yield clear({ channel: args.channel });
68
+ }
69
+ try {
70
+ const posted = yield postMessage({
71
+ botToken,
72
+ channel: state.channelId,
73
+ threadTs: state.threadTs,
74
+ text: args.text,
75
+ });
76
+ state.progressTs = posted.ts;
77
+ }
78
+ catch (error) {
79
+ getLog().warn(`progress post failed: ${error instanceof Error ? error.message : String(error)}`, {
80
+ channel: state.channelId,
81
+ thread_ts: state.threadTs,
82
+ });
83
+ }
84
+ });
85
+ },
86
+ replace(args) {
87
+ return __awaiter(this, void 0, void 0, function* () {
88
+ const state = args.channel.state;
89
+ const ts = activeProgressTs(state);
90
+ if (ts === null || state.channelId === null || args.text === "") {
91
+ return false;
92
+ }
93
+ const updated = yield updateMessage({
94
+ botToken,
95
+ channel: state.channelId,
96
+ ts,
97
+ text: args.text,
98
+ });
99
+ if (!updated.ok) {
100
+ getLog().warn("progress replace failed", {
101
+ error: updated.error,
102
+ channel: state.channelId,
103
+ progress_ts: ts,
104
+ });
105
+ return false;
106
+ }
107
+ state.lastPostedText = args.text;
108
+ state.lastBotMessageTs = ts;
109
+ state.progressTs = null;
110
+ return true;
111
+ });
112
+ },
113
+ clear,
114
+ };
115
+ }
@@ -0,0 +1,38 @@
1
+ /**
2
+ * The "Thinking" task card that receives the model's reasoning as it streams.
3
+ * Slack appends a card's `details` across updates, so the card is fed
4
+ * deltas: the part of the current reasoning block already on Slack, plus a
5
+ * buffer of what has not gone out yet.
6
+ */
7
+ import type { ChannelEventContext } from "../../types.js";
8
+ import type { ResolvedSlackReasoningCard } from "./reply-options.js";
9
+ import { type StreamTaskChunk } from "./stream.js";
10
+ import type { SlackChannelState } from "./types.js";
11
+ type Channel = ChannelEventContext<SlackChannelState>;
12
+ type CardStatus = "in_progress" | "complete";
13
+ export interface ReasoningCard {
14
+ /** Buffer the current reasoning block's cumulative text; flushes when due. */
15
+ append(args: {
16
+ channel: Channel;
17
+ sessionId: string;
18
+ text: string;
19
+ }): Promise<void>;
20
+ /** Send buffered text and set the card status. */
21
+ flush(args: {
22
+ channel: Channel;
23
+ sessionId: string;
24
+ status: CardStatus;
25
+ }): Promise<void>;
26
+ /** The next reasoning block appends after a blank line. */
27
+ endBlock(channel: Channel): void;
28
+ inProgress(channel: Channel): boolean;
29
+ }
30
+ /** Delivers one chunk into the reply stream; `false` when nothing went out. */
31
+ export type SendCardChunk = (args: {
32
+ channel: Channel;
33
+ sessionId: string;
34
+ chunk: StreamTaskChunk;
35
+ }) => Promise<boolean>;
36
+ export declare function createReasoningCard(card: ResolvedSlackReasoningCard, send: SendCardChunk): ReasoningCard;
37
+ export {};
38
+ //# sourceMappingURL=reasoning-card.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reasoning-card.d.ts","sourceRoot":"","sources":["../../../src/channels/slack/reasoning-card.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,KAAK,eAAe,EAAoB,MAAM,aAAa,CAAC;AACrE,OAAO,KAAK,EAAsB,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAOxE,KAAK,OAAO,GAAG,mBAAmB,CAAC,iBAAiB,CAAC,CAAC;AACtD,KAAK,UAAU,GAAG,aAAa,GAAG,UAAU,CAAC;AAE7C,MAAM,WAAW,aAAa;IAC5B,8EAA8E;IAC9E,MAAM,CAAC,IAAI,EAAE;QACX,OAAO,EAAE,OAAO,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC;KACd,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClB,kDAAkD;IAClD,KAAK,CAAC,IAAI,EAAE;QACV,OAAO,EAAE,OAAO,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,UAAU,CAAC;KACpB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClB,2DAA2D;IAC3D,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACjC,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC;CACvC;AAED,+EAA+E;AAC/E,MAAM,MAAM,aAAa,GAAG,CAAC,IAAI,EAAE;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,eAAe,CAAC;CACxB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAevB,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,0BAA0B,EAChC,IAAI,EAAE,aAAa,GAClB,aAAa,CA8Ef"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * The "Thinking" task card that receives the model's reasoning as it streams.
3
+ * Slack appends a card's `details` across updates, so the card is fed
4
+ * deltas: the part of the current reasoning block already on Slack, plus a
5
+ * buffer of what has not gone out yet.
6
+ */
7
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
8
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
9
+ return new (P || (P = Promise))(function (resolve, reject) {
10
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
11
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
12
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
13
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
14
+ });
15
+ };
16
+ import { truncateCardText } from "./stream.js";
17
+ const FLUSH_MS = 1000;
18
+ const FLUSH_CHARS = 160;
19
+ const CARD_ID = "reasoning";
20
+ const BLOCK_SEPARATOR = "\n\n";
21
+ function cardState(state) {
22
+ if (state.reasoningCard === undefined) {
23
+ state.reasoningCard = {
24
+ status: null,
25
+ blockSent: null,
26
+ pending: "",
27
+ lastFlushMs: null,
28
+ chars: 0,
29
+ };
30
+ }
31
+ return state.reasoningCard;
32
+ }
33
+ export function createReasoningCard(card, send) {
34
+ const flush = (_a) => __awaiter(this, [_a], void 0, function* ({ channel, sessionId, status, }) {
35
+ const state = cardState(channel.state);
36
+ if (state.pending === "" &&
37
+ (state.status === status || state.status === null)) {
38
+ return;
39
+ }
40
+ const chunk = {
41
+ type: "task_update",
42
+ id: CARD_ID,
43
+ title: card.title,
44
+ status,
45
+ };
46
+ if (state.pending !== "") {
47
+ chunk.details = state.pending;
48
+ }
49
+ // Stamped on the attempt, so a failing stream is retried at most once
50
+ // per flush window instead of once per token.
51
+ state.lastFlushMs = Date.now();
52
+ if (!(yield send({ channel, sessionId, chunk }))) {
53
+ return;
54
+ }
55
+ state.chars += state.pending.length;
56
+ state.pending = "";
57
+ state.status = status;
58
+ });
59
+ return {
60
+ flush,
61
+ append(_a) {
62
+ return __awaiter(this, arguments, void 0, function* ({ channel, sessionId, text }) {
63
+ var _b;
64
+ const state = cardState(channel.state);
65
+ if (state.chars >= card.maxChars) {
66
+ return;
67
+ }
68
+ const sent = (_b = state.blockSent) !== null && _b !== void 0 ? _b : 0;
69
+ let delta;
70
+ if (sent > 0 && text.length >= sent) {
71
+ delta = text.slice(sent);
72
+ }
73
+ else {
74
+ const hasText = state.chars + state.pending.length > 0;
75
+ delta = `${hasText ? BLOCK_SEPARATOR : ""}${text}`;
76
+ }
77
+ state.blockSent = text.length;
78
+ if (delta === "") {
79
+ return;
80
+ }
81
+ let pending = `${state.pending}${delta}`;
82
+ const room = card.maxChars - state.chars;
83
+ if (pending.length > room) {
84
+ pending = truncateCardText(pending, room);
85
+ state.chars = card.maxChars - pending.length;
86
+ }
87
+ state.pending = pending;
88
+ const due = state.lastFlushMs === null ||
89
+ Date.now() - state.lastFlushMs >= FLUSH_MS ||
90
+ pending.length >= FLUSH_CHARS;
91
+ if (due) {
92
+ yield flush({ channel, sessionId, status: "in_progress" });
93
+ }
94
+ });
95
+ },
96
+ endBlock(channel) {
97
+ cardState(channel.state).blockSent = null;
98
+ },
99
+ inProgress(channel) {
100
+ var _a;
101
+ return ((_a = channel.state.reasoningCard) === null || _a === void 0 ? void 0 : _a.status) === "in_progress";
102
+ },
103
+ };
104
+ }
@@ -0,0 +1,2 @@
1
+ export declare function redactSecretTokens(text: string): string;
2
+ //# sourceMappingURL=redact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redact.d.ts","sourceRoot":"","sources":["../../../src/channels/slack/redact.ts"],"names":[],"mappings":"AAGA,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvD"}
@@ -0,0 +1,5 @@
1
+ /** Credential shapes that must never reach a Slack thread verbatim. */
2
+ const SECRET_TOKEN = /\b(crsr_|xox[baprs]-|sk-|Bearer\s+)\S+/gi;
3
+ export function redactSecretTokens(text) {
4
+ return text.replace(SECRET_TOKEN, "[redacted]");
5
+ }
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Resolve `slackChannel({ reply, toolLabels })` — and the deprecated
3
+ * `streaming` / `thinkingSteps` / `loadingMessages` flags — into one config
4
+ * the default event handlers read.
5
+ */
6
+ import type { SlackChannelOptions, SlackToolCall, SlackToolCardGroup, SlackToolResult } from "./types.js";
7
+ export type SlackReplyMode = "post" | "stream";
8
+ export interface ResolvedSlackStatus {
9
+ reasoning: boolean;
10
+ /** `false`, or the line to show when tool calls start. */
11
+ tools: false | ((calls: readonly SlackToolCall[]) => string);
12
+ idle: string[];
13
+ }
14
+ export interface ResolvedSlackToolCards {
15
+ group: SlackToolCardGroup;
16
+ details?: (call: SlackToolCall) => string | undefined;
17
+ output?: (result: SlackToolResult) => string | undefined;
18
+ }
19
+ export interface ResolvedSlackReasoningCard {
20
+ title: string;
21
+ maxChars: number;
22
+ }
23
+ export interface ResolvedSlackReply {
24
+ mode: SlackReplyMode;
25
+ status: ResolvedSlackStatus;
26
+ toolCards: false | ResolvedSlackToolCards;
27
+ reasoningCard: false | ResolvedSlackReasoningCard;
28
+ toolLabel: (toolName: string) => string;
29
+ /** Author-facing notices about deprecated options that were honored. */
30
+ deprecations: string[];
31
+ }
32
+ export declare const DEFAULT_REASONING_CARD_TITLE = "Thinking";
33
+ /** A modest share of `SLACK_MARKDOWN_TEXT_MAX_LEN`, which the whole streamed message shares. */
34
+ export declare const DEFAULT_REASONING_CARD_MAX_CHARS = 1500;
35
+ type ReplyInputs = Pick<SlackChannelOptions, "reply" | "toolLabels" | "streaming" | "thinkingSteps"> & {
36
+ loadingMessages?: readonly string[];
37
+ };
38
+ export declare function resolveSlackReply(options: ReplyInputs): ResolvedSlackReply;
39
+ export {};
40
+ //# sourceMappingURL=reply-options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reply-options.d.ts","sourceRoot":"","sources":["../../../src/channels/slack/reply-options.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EACV,mBAAmB,EAGnB,aAAa,EACb,kBAAkB,EAElB,eAAe,EAChB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE/C,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,OAAO,CAAC;IACnB,0DAA0D;IAC1D,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,KAAK,MAAM,CAAC,CAAC;IAC7D,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,kBAAkB,CAAC;IAC1B,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,MAAM,GAAG,SAAS,CAAC;IACtD,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,MAAM,GAAG,SAAS,CAAC;CAC1D;AAED,MAAM,WAAW,0BAA0B;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,cAAc,CAAC;IACrB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,SAAS,EAAE,KAAK,GAAG,sBAAsB,CAAC;IAC1C,aAAa,EAAE,KAAK,GAAG,0BAA0B,CAAC;IAClD,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;IACxC,wEAAwE;IACxE,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,eAAO,MAAM,4BAA4B,aAAa,CAAC;AACvD,gGAAgG;AAChG,eAAO,MAAM,gCAAgC,OAAO,CAAC;AAErD,KAAK,WAAW,GAAG,IAAI,CACrB,mBAAmB,EACnB,OAAO,GAAG,YAAY,GAAG,WAAW,GAAG,eAAe,CACvD,GAAG;IAAE,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAC;AA2H5C,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,WAAW,GAAG,kBAAkB,CAkD1E"}