@geminixiang/mikan 1.0.0-beta.78 → 1.0.0-beta.79

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 (471) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/adapters/commands/admin.js +1 -1
  3. package/dist/adapters/commands/admin.js.map +1 -1
  4. package/dist/adapters/commands/login.d.ts.map +1 -1
  5. package/dist/adapters/commands/login.js +3 -2
  6. package/dist/adapters/commands/login.js.map +1 -1
  7. package/dist/adapters/commands/manifest.d.ts +0 -1
  8. package/dist/adapters/commands/manifest.d.ts.map +1 -1
  9. package/dist/adapters/commands/manifest.js.map +1 -1
  10. package/dist/adapters/commands/model.d.ts +0 -1
  11. package/dist/adapters/commands/model.d.ts.map +1 -1
  12. package/dist/adapters/commands/model.js +8 -20
  13. package/dist/adapters/commands/model.js.map +1 -1
  14. package/dist/adapters/commands/new.js +1 -1
  15. package/dist/adapters/commands/new.js.map +1 -1
  16. package/dist/adapters/commands/registry.js +1 -1
  17. package/dist/adapters/commands/registry.js.map +1 -1
  18. package/dist/adapters/commands/sandbox.d.ts +0 -1
  19. package/dist/adapters/commands/sandbox.d.ts.map +1 -1
  20. package/dist/adapters/commands/sandbox.js +1 -1
  21. package/dist/adapters/commands/sandbox.js.map +1 -1
  22. package/dist/adapters/commands/types.d.ts +6 -17
  23. package/dist/adapters/commands/types.d.ts.map +1 -1
  24. package/dist/adapters/commands/types.js.map +1 -1
  25. package/dist/adapters/commands/utils.d.ts +1 -1
  26. package/dist/adapters/commands/utils.d.ts.map +1 -1
  27. package/dist/adapters/commands/utils.js.map +1 -1
  28. package/dist/adapters/discord/bot.d.ts +4 -10
  29. package/dist/adapters/discord/bot.d.ts.map +1 -1
  30. package/dist/adapters/discord/bot.js +26 -22
  31. package/dist/adapters/discord/bot.js.map +1 -1
  32. package/dist/adapters/discord/components.d.ts +0 -1
  33. package/dist/adapters/discord/components.d.ts.map +1 -1
  34. package/dist/adapters/discord/components.js.map +1 -1
  35. package/dist/adapters/discord/context.d.ts +3 -3
  36. package/dist/adapters/discord/context.d.ts.map +1 -1
  37. package/dist/adapters/discord/context.js +1 -1
  38. package/dist/adapters/discord/context.js.map +1 -1
  39. package/dist/adapters/discord/types.d.ts +83 -1
  40. package/dist/adapters/discord/types.d.ts.map +1 -1
  41. package/dist/adapters/discord/types.js.map +1 -1
  42. package/dist/adapters/github/bot.d.ts +4 -5
  43. package/dist/adapters/github/bot.d.ts.map +1 -1
  44. package/dist/adapters/github/bot.js +10 -10
  45. package/dist/adapters/github/bot.js.map +1 -1
  46. package/dist/adapters/github/client.js +1 -1
  47. package/dist/adapters/github/client.js.map +1 -1
  48. package/dist/adapters/github/context.d.ts +3 -4
  49. package/dist/adapters/github/context.d.ts.map +1 -1
  50. package/dist/adapters/github/context.js +1 -2
  51. package/dist/adapters/github/context.js.map +1 -1
  52. package/dist/adapters/github/github-ops.d.ts +5 -6
  53. package/dist/adapters/github/github-ops.d.ts.map +1 -1
  54. package/dist/adapters/github/github-ops.js +1 -2
  55. package/dist/adapters/github/github-ops.js.map +1 -1
  56. package/dist/adapters/github/ids.d.ts +0 -3
  57. package/dist/adapters/github/ids.d.ts.map +1 -1
  58. package/dist/adapters/github/ids.js +0 -19
  59. package/dist/adapters/github/ids.js.map +1 -1
  60. package/dist/adapters/github/repo.d.ts +1 -1
  61. package/dist/adapters/github/repo.js.map +1 -1
  62. package/dist/adapters/github/tools/checks.d.ts +6 -4
  63. package/dist/adapters/github/tools/checks.d.ts.map +1 -1
  64. package/dist/adapters/github/tools/checks.js +4 -3
  65. package/dist/adapters/github/tools/checks.js.map +1 -1
  66. package/dist/adapters/github/tools/issue.d.ts +10 -8
  67. package/dist/adapters/github/tools/issue.d.ts.map +1 -1
  68. package/dist/adapters/github/tools/issue.js +4 -3
  69. package/dist/adapters/github/tools/issue.js.map +1 -1
  70. package/dist/adapters/github/tools/pr.d.ts +8 -6
  71. package/dist/adapters/github/tools/pr.d.ts.map +1 -1
  72. package/dist/adapters/github/tools/pr.js +4 -3
  73. package/dist/adapters/github/tools/pr.js.map +1 -1
  74. package/dist/adapters/github/tools/read.d.ts +9 -7
  75. package/dist/adapters/github/tools/read.d.ts.map +1 -1
  76. package/dist/adapters/github/tools/read.js +4 -3
  77. package/dist/adapters/github/tools/read.js.map +1 -1
  78. package/dist/adapters/github/tools/review-reply.d.ts +6 -4
  79. package/dist/adapters/github/tools/review-reply.d.ts.map +1 -1
  80. package/dist/adapters/github/tools/review-reply.js +4 -3
  81. package/dist/adapters/github/tools/review-reply.js.map +1 -1
  82. package/dist/adapters/github/tools/sync.d.ts +5 -3
  83. package/dist/adapters/github/tools/sync.d.ts.map +1 -1
  84. package/dist/adapters/github/tools/sync.js +4 -3
  85. package/dist/adapters/github/tools/sync.js.map +1 -1
  86. package/dist/adapters/github/types.d.ts +5 -4
  87. package/dist/adapters/github/types.d.ts.map +1 -1
  88. package/dist/adapters/github/types.js.map +1 -1
  89. package/dist/adapters/github/webhook.d.ts +0 -1
  90. package/dist/adapters/github/webhook.d.ts.map +1 -1
  91. package/dist/adapters/github/webhook.js.map +1 -1
  92. package/dist/adapters/intake.d.ts +1 -1
  93. package/dist/adapters/intake.d.ts.map +1 -1
  94. package/dist/adapters/intake.js.map +1 -1
  95. package/dist/adapters/markdown-tables.d.ts +0 -1
  96. package/dist/adapters/markdown-tables.d.ts.map +1 -1
  97. package/dist/adapters/markdown-tables.js.map +1 -1
  98. package/dist/adapters/messages.d.ts +1 -1
  99. package/dist/adapters/messages.d.ts.map +1 -1
  100. package/dist/adapters/messages.js.map +1 -1
  101. package/dist/adapters/progressive-renderer.d.ts +1 -1
  102. package/dist/adapters/progressive-renderer.d.ts.map +1 -1
  103. package/dist/adapters/progressive-renderer.js +8 -6
  104. package/dist/adapters/progressive-renderer.js.map +1 -1
  105. package/dist/adapters/shared.d.ts +6 -4
  106. package/dist/adapters/shared.d.ts.map +1 -1
  107. package/dist/adapters/shared.js +39 -25
  108. package/dist/adapters/shared.js.map +1 -1
  109. package/dist/adapters/slack/assistant.d.ts +0 -1
  110. package/dist/adapters/slack/assistant.d.ts.map +1 -1
  111. package/dist/adapters/slack/assistant.js +2 -1
  112. package/dist/adapters/slack/assistant.js.map +1 -1
  113. package/dist/adapters/slack/bot.d.ts +5 -10
  114. package/dist/adapters/slack/bot.d.ts.map +1 -1
  115. package/dist/adapters/slack/bot.js +84 -86
  116. package/dist/adapters/slack/bot.js.map +1 -1
  117. package/dist/adapters/slack/context.d.ts +3 -5
  118. package/dist/adapters/slack/context.d.ts.map +1 -1
  119. package/dist/adapters/slack/context.js +1 -2
  120. package/dist/adapters/slack/context.js.map +1 -1
  121. package/dist/adapters/slack/jev-context.d.ts.map +1 -1
  122. package/dist/adapters/slack/jev-context.js +4 -2
  123. package/dist/adapters/slack/jev-context.js.map +1 -1
  124. package/dist/adapters/slack/response-lifecycle.d.ts +3 -4
  125. package/dist/adapters/slack/response-lifecycle.d.ts.map +1 -1
  126. package/dist/adapters/slack/response-lifecycle.js +5 -3
  127. package/dist/adapters/slack/response-lifecycle.js.map +1 -1
  128. package/dist/adapters/slack/session.d.ts +1 -1
  129. package/dist/adapters/slack/session.d.ts.map +1 -1
  130. package/dist/adapters/slack/session.js.map +1 -1
  131. package/dist/adapters/slack/task-intent.js +1 -1
  132. package/dist/adapters/slack/task-intent.js.map +1 -1
  133. package/dist/adapters/slack/task-status.d.ts.map +1 -1
  134. package/dist/adapters/slack/task-status.js +2 -1
  135. package/dist/adapters/slack/task-status.js.map +1 -1
  136. package/dist/adapters/slack/tool-pack.d.ts +0 -1
  137. package/dist/adapters/slack/tool-pack.d.ts.map +1 -1
  138. package/dist/adapters/slack/tool-pack.js +2 -1
  139. package/dist/adapters/slack/tool-pack.js.map +1 -1
  140. package/dist/adapters/slack/tools/blockkit.d.ts +9 -7
  141. package/dist/adapters/slack/tools/blockkit.d.ts.map +1 -1
  142. package/dist/adapters/slack/tools/blockkit.js +6 -4
  143. package/dist/adapters/slack/tools/blockkit.js.map +1 -1
  144. package/dist/adapters/slack/types.d.ts +36 -2
  145. package/dist/adapters/slack/types.d.ts.map +1 -1
  146. package/dist/adapters/slack/types.js.map +1 -1
  147. package/dist/adapters/telegram/bot.d.ts +3 -8
  148. package/dist/adapters/telegram/bot.d.ts.map +1 -1
  149. package/dist/adapters/telegram/bot.js +11 -11
  150. package/dist/adapters/telegram/bot.js.map +1 -1
  151. package/dist/adapters/telegram/context.d.ts +3 -3
  152. package/dist/adapters/telegram/context.d.ts.map +1 -1
  153. package/dist/adapters/telegram/context.js +2 -2
  154. package/dist/adapters/telegram/context.js.map +1 -1
  155. package/dist/adapters/telegram/types.d.ts +24 -1
  156. package/dist/adapters/telegram/types.d.ts.map +1 -1
  157. package/dist/adapters/telegram/types.js.map +1 -1
  158. package/dist/adapters/types.d.ts +1 -2
  159. package/dist/adapters/types.d.ts.map +1 -1
  160. package/dist/adapters/types.js.map +1 -1
  161. package/dist/adapters/web/admin/client-assets.d.ts +1 -1
  162. package/dist/adapters/web/admin/client-assets.d.ts.map +1 -1
  163. package/dist/adapters/web/admin/client-assets.js +3 -2
  164. package/dist/adapters/web/admin/client-assets.js.map +1 -1
  165. package/dist/adapters/web/admin/portal.d.ts +4 -11
  166. package/dist/adapters/web/admin/portal.d.ts.map +1 -1
  167. package/dist/adapters/web/admin/portal.js +27 -30
  168. package/dist/adapters/web/admin/portal.js.map +1 -1
  169. package/dist/adapters/web/admin/provider-models.d.ts +1 -1
  170. package/dist/adapters/web/admin/provider-models.d.ts.map +1 -1
  171. package/dist/adapters/web/admin/provider-models.js.map +1 -1
  172. package/dist/adapters/web/admin/types.d.ts +10 -4
  173. package/dist/adapters/web/admin/types.d.ts.map +1 -1
  174. package/dist/adapters/web/admin/types.js.map +1 -1
  175. package/dist/adapters/web/login/oauth.d.ts +0 -1
  176. package/dist/adapters/web/login/oauth.d.ts.map +1 -1
  177. package/dist/adapters/web/login/oauth.js +12 -12
  178. package/dist/adapters/web/login/oauth.js.map +1 -1
  179. package/dist/adapters/web/login/portal.d.ts +3 -6
  180. package/dist/adapters/web/login/portal.d.ts.map +1 -1
  181. package/dist/adapters/web/login/portal.js +5 -4
  182. package/dist/adapters/web/login/portal.js.map +1 -1
  183. package/dist/adapters/web/login/types.d.ts +1 -1
  184. package/dist/adapters/web/login/types.d.ts.map +1 -1
  185. package/dist/adapters/web/login/types.js.map +1 -1
  186. package/dist/adapters/web/portal-shell.d.ts +0 -1
  187. package/dist/adapters/web/portal-shell.d.ts.map +1 -1
  188. package/dist/adapters/web/portal-shell.js.map +1 -1
  189. package/dist/adapters/web/server.d.ts +6 -6
  190. package/dist/adapters/web/server.d.ts.map +1 -1
  191. package/dist/adapters/web/server.js +3 -2
  192. package/dist/adapters/web/server.js.map +1 -1
  193. package/dist/adapters/web/session-view/portal.d.ts +2 -3
  194. package/dist/adapters/web/session-view/portal.d.ts.map +1 -1
  195. package/dist/adapters/web/session-view/portal.js +12 -12
  196. package/dist/adapters/web/session-view/portal.js.map +1 -1
  197. package/dist/adapters/web/session-view/types.d.ts +1 -11
  198. package/dist/adapters/web/session-view/types.d.ts.map +1 -1
  199. package/dist/adapters/web/session-view/types.js.map +1 -1
  200. package/dist/adapters/web/token-store.d.ts +0 -1
  201. package/dist/adapters/web/token-store.d.ts.map +1 -1
  202. package/dist/adapters/web/token-store.js.map +1 -1
  203. package/dist/cli/boot.d.ts +0 -1
  204. package/dist/cli/boot.d.ts.map +1 -1
  205. package/dist/cli/boot.js +4 -4
  206. package/dist/cli/boot.js.map +1 -1
  207. package/dist/cli/office.d.ts.map +1 -1
  208. package/dist/cli/office.js +4 -3
  209. package/dist/cli/office.js.map +1 -1
  210. package/dist/cli/onboard.js +1 -1
  211. package/dist/cli/onboard.js.map +1 -1
  212. package/dist/cli/sandbox.d.ts.map +1 -1
  213. package/dist/cli/sandbox.js +2 -1
  214. package/dist/cli/sandbox.js.map +1 -1
  215. package/dist/cli/sessions.d.ts.map +1 -1
  216. package/dist/cli/sessions.js +2 -1
  217. package/dist/cli/sessions.js.map +1 -1
  218. package/dist/env-manifest.d.ts +1 -1
  219. package/dist/env-manifest.d.ts.map +1 -1
  220. package/dist/env-manifest.js.map +1 -1
  221. package/dist/events/index.d.ts +3 -2
  222. package/dist/events/index.d.ts.map +1 -1
  223. package/dist/events/index.js +11 -10
  224. package/dist/events/index.js.map +1 -1
  225. package/dist/events/scheduler.d.ts +1 -2
  226. package/dist/events/scheduler.d.ts.map +1 -1
  227. package/dist/events/scheduler.js +4 -4
  228. package/dist/events/scheduler.js.map +1 -1
  229. package/dist/file-guards.d.ts +8 -6
  230. package/dist/file-guards.d.ts.map +1 -1
  231. package/dist/file-guards.js +10 -15
  232. package/dist/file-guards.js.map +1 -1
  233. package/dist/harness/execution-env.d.ts +1 -1
  234. package/dist/harness/execution-env.d.ts.map +1 -1
  235. package/dist/harness/execution-env.js +7 -6
  236. package/dist/harness/execution-env.js.map +1 -1
  237. package/dist/harness/execution-resolver.d.ts +4 -6
  238. package/dist/harness/execution-resolver.d.ts.map +1 -1
  239. package/dist/harness/execution-resolver.js +1 -1
  240. package/dist/harness/execution-resolver.js.map +1 -1
  241. package/dist/harness/jev.d.ts +1 -1
  242. package/dist/harness/jev.d.ts.map +1 -1
  243. package/dist/harness/jev.js +1 -4
  244. package/dist/harness/jev.js.map +1 -1
  245. package/dist/harness/mcp-result.d.ts.map +1 -1
  246. package/dist/harness/mcp-result.js +15 -7
  247. package/dist/harness/mcp-result.js.map +1 -1
  248. package/dist/harness/mcp.d.ts +0 -2
  249. package/dist/harness/mcp.d.ts.map +1 -1
  250. package/dist/harness/mcp.js +13 -15
  251. package/dist/harness/mcp.js.map +1 -1
  252. package/dist/harness/models.d.ts +0 -1
  253. package/dist/harness/models.d.ts.map +1 -1
  254. package/dist/harness/models.js +2 -1
  255. package/dist/harness/models.js.map +1 -1
  256. package/dist/harness/open-connector.d.ts +2 -3
  257. package/dist/harness/open-connector.d.ts.map +1 -1
  258. package/dist/harness/open-connector.js +13 -9
  259. package/dist/harness/open-connector.js.map +1 -1
  260. package/dist/harness/presenter.d.ts +4 -25
  261. package/dist/harness/presenter.d.ts.map +1 -1
  262. package/dist/harness/presenter.js +26 -20
  263. package/dist/harness/presenter.js.map +1 -1
  264. package/dist/harness/prompt.d.ts +1 -2
  265. package/dist/harness/prompt.d.ts.map +1 -1
  266. package/dist/harness/prompt.js.map +1 -1
  267. package/dist/harness/runner.d.ts.map +1 -1
  268. package/dist/harness/runner.js +34 -17
  269. package/dist/harness/runner.js.map +1 -1
  270. package/dist/harness/session.d.ts +0 -7
  271. package/dist/harness/session.d.ts.map +1 -1
  272. package/dist/harness/session.js +16 -14
  273. package/dist/harness/session.js.map +1 -1
  274. package/dist/harness/skills.d.ts +2 -5
  275. package/dist/harness/skills.d.ts.map +1 -1
  276. package/dist/harness/skills.js.map +1 -1
  277. package/dist/harness/subagent-profiles.d.ts +0 -1
  278. package/dist/harness/subagent-profiles.d.ts.map +1 -1
  279. package/dist/harness/subagent-profiles.js +12 -16
  280. package/dist/harness/subagent-profiles.js.map +1 -1
  281. package/dist/harness/subagent.d.ts +1 -1
  282. package/dist/harness/subagent.d.ts.map +1 -1
  283. package/dist/harness/subagent.js +17 -17
  284. package/dist/harness/subagent.js.map +1 -1
  285. package/dist/harness/tool-args.d.ts +2 -0
  286. package/dist/harness/tool-args.d.ts.map +1 -0
  287. package/dist/harness/tool-args.js +20 -0
  288. package/dist/harness/tool-args.js.map +1 -0
  289. package/dist/harness/tools/attach.d.ts +5 -4
  290. package/dist/harness/tools/attach.d.ts.map +1 -1
  291. package/dist/harness/tools/attach.js +1 -1
  292. package/dist/harness/tools/attach.js.map +1 -1
  293. package/dist/harness/tools/event.d.ts +12 -11
  294. package/dist/harness/tools/event.d.ts.map +1 -1
  295. package/dist/harness/tools/event.js +1 -1
  296. package/dist/harness/tools/event.js.map +1 -1
  297. package/dist/harness/tools/generate-image.d.ts +7 -5
  298. package/dist/harness/tools/generate-image.d.ts.map +1 -1
  299. package/dist/harness/tools/generate-image.js +7 -5
  300. package/dist/harness/tools/generate-image.js.map +1 -1
  301. package/dist/harness/tools/host-fn-tool.d.ts +3 -2
  302. package/dist/harness/tools/host-fn-tool.d.ts.map +1 -1
  303. package/dist/harness/tools/host-fn-tool.js +5 -2
  304. package/dist/harness/tools/host-fn-tool.js.map +1 -1
  305. package/dist/harness/tools/index.d.ts +3 -4
  306. package/dist/harness/tools/index.d.ts.map +1 -1
  307. package/dist/harness/tools/index.js +1 -3
  308. package/dist/harness/tools/index.js.map +1 -1
  309. package/dist/harness/tools/jev-browser.d.ts +12 -10
  310. package/dist/harness/tools/jev-browser.d.ts.map +1 -1
  311. package/dist/harness/tools/jev-browser.js +6 -4
  312. package/dist/harness/tools/jev-browser.js.map +1 -1
  313. package/dist/harness/tools/jev.d.ts +9 -7
  314. package/dist/harness/tools/jev.d.ts.map +1 -1
  315. package/dist/harness/tools/jev.js +5 -6
  316. package/dist/harness/tools/jev.js.map +1 -1
  317. package/dist/harness/tools/pi-tools.d.ts.map +1 -1
  318. package/dist/harness/tools/pi-tools.js +2 -2
  319. package/dist/harness/tools/pi-tools.js.map +1 -1
  320. package/dist/harness/tools/react.d.ts +3 -2
  321. package/dist/harness/tools/react.d.ts.map +1 -1
  322. package/dist/harness/tools/react.js +1 -1
  323. package/dist/harness/tools/react.js.map +1 -1
  324. package/dist/harness/tools/sandbox.d.ts +7 -6
  325. package/dist/harness/tools/sandbox.d.ts.map +1 -1
  326. package/dist/harness/tools/sandbox.js +3 -2
  327. package/dist/harness/tools/sandbox.js.map +1 -1
  328. package/dist/harness/tools/subagent.d.ts +26 -26
  329. package/dist/harness/tools/subagent.d.ts.map +1 -1
  330. package/dist/harness/tools/subagent.js +25 -29
  331. package/dist/harness/tools/subagent.js.map +1 -1
  332. package/dist/harness/tools/task.d.ts +11 -8
  333. package/dist/harness/tools/task.d.ts.map +1 -1
  334. package/dist/harness/tools/task.js +8 -6
  335. package/dist/harness/tools/task.js.map +1 -1
  336. package/dist/harness/tools/types.d.ts +2 -1
  337. package/dist/harness/tools/types.d.ts.map +1 -1
  338. package/dist/harness/tools/types.js.map +1 -1
  339. package/dist/harness/types.d.ts +37 -4
  340. package/dist/harness/types.d.ts.map +1 -1
  341. package/dist/harness/types.js.map +1 -1
  342. package/dist/index.d.ts +16 -13
  343. package/dist/index.d.ts.map +1 -1
  344. package/dist/index.js +3 -2
  345. package/dist/index.js.map +1 -1
  346. package/dist/log.d.ts +0 -1
  347. package/dist/log.d.ts.map +1 -1
  348. package/dist/log.js +1 -1
  349. package/dist/log.js.map +1 -1
  350. package/dist/main.js +27 -17
  351. package/dist/main.js.map +1 -1
  352. package/dist/memory-capture/index.d.ts +1 -2
  353. package/dist/memory-capture/index.d.ts.map +1 -1
  354. package/dist/memory-capture/index.js +8 -3
  355. package/dist/memory-capture/index.js.map +1 -1
  356. package/dist/memory-capture/types.d.ts +1 -1
  357. package/dist/memory-capture/types.js.map +1 -1
  358. package/dist/observability/index.d.ts +0 -3
  359. package/dist/observability/index.d.ts.map +1 -1
  360. package/dist/observability/index.js +11 -16
  361. package/dist/observability/index.js.map +1 -1
  362. package/dist/observability/sentry.d.ts +9 -12
  363. package/dist/observability/sentry.d.ts.map +1 -1
  364. package/dist/observability/sentry.js +9 -118
  365. package/dist/observability/sentry.js.map +1 -1
  366. package/dist/office/index.d.ts +14 -3
  367. package/dist/office/index.d.ts.map +1 -1
  368. package/dist/office/index.js +51 -14
  369. package/dist/office/index.js.map +1 -1
  370. package/dist/office/projection.d.ts +1 -3
  371. package/dist/office/projection.d.ts.map +1 -1
  372. package/dist/office/projection.js +5 -5
  373. package/dist/office/projection.js.map +1 -1
  374. package/dist/office/types.d.ts +5 -0
  375. package/dist/office/types.d.ts.map +1 -1
  376. package/dist/office/types.js.map +1 -1
  377. package/dist/runtime/conversation-runtime.d.ts +0 -1
  378. package/dist/runtime/conversation-runtime.d.ts.map +1 -1
  379. package/dist/runtime/conversation-runtime.js +10 -6
  380. package/dist/runtime/conversation-runtime.js.map +1 -1
  381. package/dist/runtime/session-lifecycle.d.ts.map +1 -1
  382. package/dist/runtime/session-lifecycle.js +2 -1
  383. package/dist/runtime/session-lifecycle.js.map +1 -1
  384. package/dist/runtime/types.d.ts +8 -5
  385. package/dist/runtime/types.d.ts.map +1 -1
  386. package/dist/runtime/types.js.map +1 -1
  387. package/dist/sandbox/cloudflare.d.ts.map +1 -1
  388. package/dist/sandbox/cloudflare.js +3 -2
  389. package/dist/sandbox/cloudflare.js.map +1 -1
  390. package/dist/sandbox/container.d.ts.map +1 -1
  391. package/dist/sandbox/container.js +2 -1
  392. package/dist/sandbox/container.js.map +1 -1
  393. package/dist/sandbox/host.js +1 -1
  394. package/dist/sandbox/host.js.map +1 -1
  395. package/dist/sandbox/identity.d.ts +0 -1
  396. package/dist/sandbox/identity.d.ts.map +1 -1
  397. package/dist/sandbox/identity.js.map +1 -1
  398. package/dist/sandbox/index.d.ts +4 -14
  399. package/dist/sandbox/index.d.ts.map +1 -1
  400. package/dist/sandbox/index.js +4 -93
  401. package/dist/sandbox/index.js.map +1 -1
  402. package/dist/sandbox/provisioner.d.ts +0 -1
  403. package/dist/sandbox/provisioner.d.ts.map +1 -1
  404. package/dist/sandbox/provisioner.js +12 -11
  405. package/dist/sandbox/provisioner.js.map +1 -1
  406. package/dist/sandbox/registry.d.ts +12 -0
  407. package/dist/sandbox/registry.d.ts.map +1 -0
  408. package/dist/sandbox/registry.js +93 -0
  409. package/dist/sandbox/registry.js.map +1 -0
  410. package/dist/sandbox/types.d.ts +3 -0
  411. package/dist/sandbox/types.d.ts.map +1 -1
  412. package/dist/sandbox/types.js.map +1 -1
  413. package/dist/sandbox/utils.d.ts.map +1 -1
  414. package/dist/sandbox/utils.js +1 -0
  415. package/dist/sandbox/utils.js.map +1 -1
  416. package/dist/sessions/chat-history-sync.d.ts +2 -2
  417. package/dist/sessions/chat-history-sync.d.ts.map +1 -1
  418. package/dist/sessions/chat-history-sync.js +32 -23
  419. package/dist/sessions/chat-history-sync.js.map +1 -1
  420. package/dist/sessions/migrate-common.js +2 -2
  421. package/dist/sessions/migrate-common.js.map +1 -1
  422. package/dist/sessions/migrate-pi-084.d.ts +0 -1
  423. package/dist/sessions/migrate-pi-084.d.ts.map +1 -1
  424. package/dist/sessions/migrate-pi-084.js +4 -6
  425. package/dist/sessions/migrate-pi-084.js.map +1 -1
  426. package/dist/sessions/migrate-v3.d.ts +0 -1
  427. package/dist/sessions/migrate-v3.d.ts.map +1 -1
  428. package/dist/sessions/migrate-v3.js +3 -5
  429. package/dist/sessions/migrate-v3.js.map +1 -1
  430. package/dist/sessions/session-key.d.ts +0 -1
  431. package/dist/sessions/session-key.d.ts.map +1 -1
  432. package/dist/sessions/session-key.js.map +1 -1
  433. package/dist/sessions/session-store.d.ts.map +1 -1
  434. package/dist/sessions/session-store.js +12 -19
  435. package/dist/sessions/session-store.js.map +1 -1
  436. package/dist/sessions/store.d.ts +0 -1
  437. package/dist/sessions/store.d.ts.map +1 -1
  438. package/dist/sessions/store.js +5 -3
  439. package/dist/sessions/store.js.map +1 -1
  440. package/dist/sessions/types.d.ts +2 -0
  441. package/dist/sessions/types.d.ts.map +1 -1
  442. package/dist/sessions/types.js +1 -0
  443. package/dist/sessions/types.js.map +1 -1
  444. package/dist/settings/apply.d.ts +1 -2
  445. package/dist/settings/apply.d.ts.map +1 -1
  446. package/dist/settings/apply.js.map +1 -1
  447. package/dist/settings/index.d.ts +37 -34
  448. package/dist/settings/index.d.ts.map +1 -1
  449. package/dist/settings/index.js +28 -22
  450. package/dist/settings/index.js.map +1 -1
  451. package/dist/settings/migrate.d.ts +1 -1
  452. package/dist/settings/migrate.d.ts.map +1 -1
  453. package/dist/settings/migrate.js +5 -4
  454. package/dist/settings/migrate.js.map +1 -1
  455. package/dist/types.d.ts +17 -6
  456. package/dist/types.d.ts.map +1 -1
  457. package/dist/types.js +1 -3
  458. package/dist/types.js.map +1 -1
  459. package/dist/unknown-values.d.ts +3 -0
  460. package/dist/unknown-values.d.ts.map +1 -0
  461. package/dist/unknown-values.js +7 -0
  462. package/dist/unknown-values.js.map +1 -0
  463. package/dist/vault/index.d.ts +10 -2
  464. package/dist/vault/index.d.ts.map +1 -1
  465. package/dist/vault/index.js +16 -7
  466. package/dist/vault/index.js.map +1 -1
  467. package/package.json +3 -2
  468. package/dist/adapters/index.d.ts +0 -11
  469. package/dist/adapters/index.d.ts.map +0 -1
  470. package/dist/adapters/index.js +0 -19
  471. package/dist/adapters/index.js.map +0 -1
@@ -1,6 +1,4 @@
1
- import { type ConversationContext } from "../index.js";
2
- import { type SlackMessagingBot, type SlackEvent } from "./bot.js";
3
- export type { SlackAdapterOptions } from "./types.js";
4
- import type { SlackAdapterOptions } from "./types.js";
5
- export declare function createSlackAdapters(event: SlackEvent, slack: SlackMessagingBot, adapterOptions?: SlackAdapterOptions): ConversationContext;
1
+ import type { ConversationContext } from "../../types.js";
2
+ import type { SlackEvent, SlackAdapterOptions, SlackResponderBot } from "./types.js";
3
+ export declare function createSlackAdapters(event: SlackEvent, slack: SlackResponderBot, adapterOptions?: SlackAdapterOptions): ConversationContext;
6
4
  //# sourceMappingURL=context.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/adapters/slack/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClF,OAAO,EAAE,KAAK,iBAAiB,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAGnE,YAAY,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,UAAU,EACjB,KAAK,EAAE,iBAAiB,EACxB,cAAc,GAAE,mBAAwB,GACvC,mBAAmB,CAkCrB"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/adapters/slack/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAE1D,OAAO,KAAK,EAAE,UAAU,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAIrF,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,UAAU,EACjB,KAAK,EAAE,iBAAiB,EACxB,cAAc,GAAE,mBAAwB,GACvC,mBAAmB,CAkCrB"}
@@ -1,5 +1,4 @@
1
- import { createConversationMessage } from "../index.js";
2
- import {} from "./bot.js";
1
+ import { createConversationMessage } from "../../office/index.js";
3
2
  import { createSlackResponseContext } from "./response-lifecycle.js";
4
3
  import { planSlackAdapterSession } from "./session.js";
5
4
  export function createSlackAdapters(event, slack, adapterOptions = {}) {
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/adapters/slack/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAA4B,MAAM,aAAa,CAAC;AAClF,OAAO,EAA2C,MAAM,UAAU,CAAC;AACnE,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAIvD,MAAM,UAAU,mBAAmB,CACjC,KAAiB,EACjB,KAAwB,EACxB,cAAc,GAAwB,EAAE;IAExC,MAAM,WAAW,GAAG,uBAAuB,CAAC,KAAK,EAAE;QACjD,gBAAgB,EAAE,cAAc,CAAC,gBAAgB;KAClD,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAEvC,MAAM,OAAO,GAAG,yBAAyB,CAAC;QACxC,QAAQ,EAAE,OAAO;QACjB,cAAc,EAAE,KAAK,CAAC,OAAO,CAAC,cAAc;QAC5C,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,UAAU,EAAE,WAAW,CAAC,UAAU;QAClC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;QACxC,MAAM,EAAE,KAAK,CAAC,IAAI;QAClB,QAAQ,EAAE,IAAI,EAAE,QAAQ;QACxB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,WAAW,EAAE,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACjD,IAAI,EAAE,CAAC,CAAC,QAAQ;YAChB,SAAS,EAAE,CAAC,CAAC,SAAS;SACvB,CAAC,CAAC;QACH,QAAQ,EAAE,KAAK,CAAC,SAAS;KAC1B,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,KAAK,CAAC,gBAAgB,EAAE,CAAC;IAE1C,MAAM,SAAS,GAAG,0BAA0B,CAAC;QAC3C,KAAK;QACL,KAAK;QACL,WAAW;QACX,SAAS,EAAE,cAAc,CAAC,SAAS,IAAI,WAAW;QAClD,OAAO;KACR,CAAC,CAAC;IAEH,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;AACpE,CAAC","sourcesContent":["import { createConversationMessage, type ConversationContext } from \"../index.js\";\nimport { type SlackMessagingBot, type SlackEvent } from \"./bot.js\";\nimport { createSlackResponseContext } from \"./response-lifecycle.js\";\nimport { planSlackAdapterSession } from \"./session.js\";\nexport type { SlackAdapterOptions } from \"./types.js\";\nimport type { SlackAdapterOptions } from \"./types.js\";\n\nexport function createSlackAdapters(\n event: SlackEvent,\n slack: SlackMessagingBot,\n adapterOptions: SlackAdapterOptions = {},\n): ConversationContext {\n const sessionPlan = planSlackAdapterSession(event, {\n initialMessageTs: adapterOptions.initialMessageTs,\n });\n const user = slack.getUser(event.user);\n\n const message = createConversationMessage({\n platform: \"slack\",\n conversationId: event.address.conversationId,\n address: event.address,\n id: event.ts,\n sessionKey: sessionPlan.sessionKey,\n conversationKind: event.conversationKind,\n userId: event.user,\n userName: user?.userName,\n text: event.text,\n attachments: (event.attachments || []).map((a) => ({\n name: a.original,\n localPath: a.localPath,\n })),\n threadTs: event.thread_ts,\n });\n\n const platform = slack.getMessagingInfo();\n\n const responder = createSlackResponseContext({\n event,\n slack,\n sessionPlan,\n replyMode: adapterOptions.replyMode ?? \"top-level\",\n message,\n });\n\n return { address: message.address, message, responder, platform };\n}\n"]}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/adapters/slack/context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAElE,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAEvD,MAAM,UAAU,mBAAmB,CACjC,KAAiB,EACjB,KAAwB,EACxB,cAAc,GAAwB,EAAE;IAExC,MAAM,WAAW,GAAG,uBAAuB,CAAC,KAAK,EAAE;QACjD,gBAAgB,EAAE,cAAc,CAAC,gBAAgB;KAClD,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAEvC,MAAM,OAAO,GAAG,yBAAyB,CAAC;QACxC,QAAQ,EAAE,OAAO;QACjB,cAAc,EAAE,KAAK,CAAC,OAAO,CAAC,cAAc;QAC5C,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,UAAU,EAAE,WAAW,CAAC,UAAU;QAClC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;QACxC,MAAM,EAAE,KAAK,CAAC,IAAI;QAClB,QAAQ,EAAE,IAAI,EAAE,QAAQ;QACxB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,WAAW,EAAE,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACjD,IAAI,EAAE,CAAC,CAAC,QAAQ;YAChB,SAAS,EAAE,CAAC,CAAC,SAAS;SACvB,CAAC,CAAC;QACH,QAAQ,EAAE,KAAK,CAAC,SAAS;KAC1B,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,KAAK,CAAC,gBAAgB,EAAE,CAAC;IAE1C,MAAM,SAAS,GAAG,0BAA0B,CAAC;QAC3C,KAAK;QACL,KAAK;QACL,WAAW;QACX,SAAS,EAAE,cAAc,CAAC,SAAS,IAAI,WAAW;QAClD,OAAO;KACR,CAAC,CAAC;IAEH,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;AACpE,CAAC","sourcesContent":["import type { ConversationContext } from \"../../types.js\";\nimport { createConversationMessage } from \"../../office/index.js\";\nimport type { SlackEvent, SlackAdapterOptions, SlackResponderBot } from \"./types.js\";\nimport { createSlackResponseContext } from \"./response-lifecycle.js\";\nimport { planSlackAdapterSession } from \"./session.js\";\n\nexport function createSlackAdapters(\n event: SlackEvent,\n slack: SlackResponderBot,\n adapterOptions: SlackAdapterOptions = {},\n): ConversationContext {\n const sessionPlan = planSlackAdapterSession(event, {\n initialMessageTs: adapterOptions.initialMessageTs,\n });\n const user = slack.getUser(event.user);\n\n const message = createConversationMessage({\n platform: \"slack\",\n conversationId: event.address.conversationId,\n address: event.address,\n id: event.ts,\n sessionKey: sessionPlan.sessionKey,\n conversationKind: event.conversationKind,\n userId: event.user,\n userName: user?.userName,\n text: event.text,\n attachments: (event.attachments || []).map((a) => ({\n name: a.original,\n localPath: a.localPath,\n })),\n threadTs: event.thread_ts,\n });\n\n const platform = slack.getMessagingInfo();\n\n const responder = createSlackResponseContext({\n event,\n slack,\n sessionPlan,\n replyMode: adapterOptions.replyMode ?? \"top-level\",\n message,\n });\n\n return { address: message.address, message, responder, platform };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"jev-context.d.ts","sourceRoot":"","sources":["../../../src/adapters/slack/jev-context.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,MAAM,iBAAiB,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;AAEvE,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,iBAAiB,EAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,GACvB,MAAM,CAMR;AAED,wBAAgB,eAAe,CAC7B,eAAe,EAAE,MAAM,EACvB,KAAK,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,EACzC,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAA;CAAO,GACpE,UAAU,EAAE,CAmCd;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,MAAM,CAE7D"}
1
+ {"version":3,"file":"jev-context.d.ts","sourceRoot":"","sources":["../../../src/adapters/slack/jev-context.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,MAAM,iBAAiB,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;AAEvE,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,iBAAiB,EAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,GACvB,MAAM,CAMR;AAED,wBAAgB,eAAe,CAC7B,eAAe,EAAE,MAAM,EACvB,KAAK,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,EACzC,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAA;CAAO,GACpE,UAAU,EAAE,CAmCd;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,MAAM,CAE7D"}
@@ -1,5 +1,7 @@
1
1
  import { join } from "node:path";
2
- import { isRecord, readTextFileIfExists } from "../../file-guards.js";
2
+ import { readTextFileIfExists } from "../../file-guards.js";
3
+ import { OFFICE_LOG_FILENAME } from "../../office/index.js";
4
+ import { isRecord } from "../../unknown-values.js";
3
5
  export function humanizeMentions(text, resolve, botUserId) {
4
6
  return text.replace(/<@([A-Z0-9]+)(?:\|[^>]*)?>/g, (_match, id) => {
5
7
  if (botUserId && id === botUserId)
@@ -11,7 +13,7 @@ export function humanizeMentions(text, resolve, botUserId) {
11
13
  export function readRecentScope(conversationDir, event, options = {}) {
12
14
  const limit = options.limit ?? 12;
13
15
  const humanize = options.humanize ?? ((text) => text);
14
- const raw = readTextFileIfExists(join(conversationDir, "log.jsonl"));
16
+ const raw = readTextFileIfExists(join(conversationDir, OFFICE_LOG_FILENAME));
15
17
  if (raw === undefined)
16
18
  return [];
17
19
  const lines = [];
@@ -1 +1 @@
1
- {"version":3,"file":"jev-context.js","sourceRoot":"","sources":["../../../src/adapters/slack/jev-context.ts"],"names":[],"mappings":"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","sourcesContent":["import { join } from \"node:path\";\nimport { isRecord, readTextFileIfExists } from \"../../file-guards.js\";\n\nexport interface RecentLine {\n ts: string;\n speaker: string;\n text: string;\n isMikan: boolean;\n}\n\nexport type SlackNameResolver = (userId: string) => string | undefined;\n\nexport function humanizeMentions(\n text: string,\n resolve: SlackNameResolver,\n botUserId: string | null,\n): string {\n return text.replace(/<@([A-Z0-9]+)(?:\\|[^>]*)?>/g, (_match, id: string) => {\n if (botUserId && id === botUserId) return \"@mikan\";\n const name = resolve(id);\n return name ? `@${name}` : `@${id}`;\n });\n}\n\nexport function readRecentScope(\n conversationDir: string,\n event: { ts: string; thread_ts?: string },\n options: { limit?: number; humanize?: (text: string) => string } = {},\n): RecentLine[] {\n const limit = options.limit ?? 12;\n const humanize = options.humanize ?? ((text: string) => text);\n const raw = readTextFileIfExists(join(conversationDir, \"log.jsonl\"));\n if (raw === undefined) return [];\n const lines: RecentLine[] = [];\n for (const line of raw.split(\"\\n\")) {\n if (!line) continue;\n let entry: unknown;\n try {\n entry = JSON.parse(line);\n } catch {\n continue;\n }\n if (!isRecord(entry) || typeof entry.ts !== \"string\" || typeof entry.text !== \"string\") {\n continue;\n }\n const threadTs = typeof entry.threadTs === \"string\" ? entry.threadTs : undefined;\n const inScope = event.thread_ts\n ? threadTs === event.thread_ts || entry.ts === event.thread_ts\n : threadTs === undefined;\n if (!inScope || entry.ts === event.ts) continue;\n const isMikan = entry.isMessagingBot === true && entry.user === \"bot\";\n const speaker = isMikan\n ? \"mikan\"\n : String(entry.displayName ?? entry.userName ?? entry.user ?? \"unknown\");\n const previous = lines.at(-1);\n if (previous && previous.isMikan && isMikan && previous.ts === entry.ts) {\n previous.text += entry.text;\n continue;\n }\n lines.push({ ts: entry.ts, speaker, text: entry.text, isMikan });\n }\n for (const line of lines) line.text = humanize(line.text);\n return lines.slice(-limit);\n}\n\nexport function formatRecentScope(lines: RecentLine[]): string {\n return lines.length ? lines.map((l) => `- ${l.speaker}: ${l.text}`).join(\"\\n\") : \"(none)\";\n}\n"]}
1
+ {"version":3,"file":"jev-context.js","sourceRoot":"","sources":["../../../src/adapters/slack/jev-context.ts"],"names":[],"mappings":"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","sourcesContent":["import { join } from \"node:path\";\nimport { readTextFileIfExists } from \"../../file-guards.js\";\nimport { OFFICE_LOG_FILENAME } from \"../../office/index.js\";\nimport { isRecord } from \"../../unknown-values.js\";\n\nexport interface RecentLine {\n ts: string;\n speaker: string;\n text: string;\n isMikan: boolean;\n}\n\nexport type SlackNameResolver = (userId: string) => string | undefined;\n\nexport function humanizeMentions(\n text: string,\n resolve: SlackNameResolver,\n botUserId: string | null,\n): string {\n return text.replace(/<@([A-Z0-9]+)(?:\\|[^>]*)?>/g, (_match, id: string) => {\n if (botUserId && id === botUserId) return \"@mikan\";\n const name = resolve(id);\n return name ? `@${name}` : `@${id}`;\n });\n}\n\nexport function readRecentScope(\n conversationDir: string,\n event: { ts: string; thread_ts?: string },\n options: { limit?: number; humanize?: (text: string) => string } = {},\n): RecentLine[] {\n const limit = options.limit ?? 12;\n const humanize = options.humanize ?? ((text: string) => text);\n const raw = readTextFileIfExists(join(conversationDir, OFFICE_LOG_FILENAME));\n if (raw === undefined) return [];\n const lines: RecentLine[] = [];\n for (const line of raw.split(\"\\n\")) {\n if (!line) continue;\n let entry: unknown;\n try {\n entry = JSON.parse(line);\n } catch {\n continue;\n }\n if (!isRecord(entry) || typeof entry.ts !== \"string\" || typeof entry.text !== \"string\") {\n continue;\n }\n const threadTs = typeof entry.threadTs === \"string\" ? entry.threadTs : undefined;\n const inScope = event.thread_ts\n ? threadTs === event.thread_ts || entry.ts === event.thread_ts\n : threadTs === undefined;\n if (!inScope || entry.ts === event.ts) continue;\n const isMikan = entry.isMessagingBot === true && entry.user === \"bot\";\n const speaker = isMikan\n ? \"mikan\"\n : String(entry.displayName ?? entry.userName ?? entry.user ?? \"unknown\");\n const previous = lines.at(-1);\n if (previous && previous.isMikan && isMikan && previous.ts === entry.ts) {\n previous.text += entry.text;\n continue;\n }\n lines.push({ ts: entry.ts, speaker, text: entry.text, isMikan });\n }\n for (const line of lines) line.text = humanize(line.text);\n return lines.slice(-limit);\n}\n\nexport function formatRecentScope(lines: RecentLine[]): string {\n return lines.length ? lines.map((l) => `- ${l.speaker}: ${l.text}`).join(\"\\n\") : \"(none)\";\n}\n"]}
@@ -1,9 +1,8 @@
1
- import type { ConversationMessage, ConversationResponder } from "../index.js";
2
- import { type SlackMessagingBot, type SlackEvent } from "./bot.js";
3
- import type { SlackAdapterSessionPlan } from "./types.js";
1
+ import type { ConversationMessage, ConversationResponder } from "../../types.js";
2
+ import type { SlackEvent, SlackAdapterSessionPlan, SlackResponderBot } from "./types.js";
4
3
  export declare function createSlackResponseContext({ event, slack, sessionPlan, replyMode, message, }: {
5
4
  event: SlackEvent;
6
- slack: SlackMessagingBot;
5
+ slack: SlackResponderBot;
7
6
  sessionPlan: SlackAdapterSessionPlan;
8
7
  replyMode: "top-level" | "thread";
9
8
  message: ConversationMessage;
@@ -1 +1 @@
1
- {"version":3,"file":"response-lifecycle.d.ts","sourceRoot":"","sources":["../../../src/adapters/slack/response-lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,qBAAqB,EAAkB,MAAM,aAAa,CAAC;AAK9F,OAAO,EAA2B,KAAK,iBAAiB,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAG5F,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAiP1D,wBAAgB,0BAA0B,CAAC,EACzC,KAAK,EACL,KAAK,EACL,WAAW,EACX,SAAS,EACT,OAAO,GACR,EAAE;IACD,KAAK,EAAE,UAAU,CAAC;IAClB,KAAK,EAAE,iBAAiB,CAAC;IACzB,WAAW,EAAE,uBAAuB,CAAC;IACrC,SAAS,EAAE,WAAW,GAAG,QAAQ,CAAC;IAClC,OAAO,EAAE,mBAAmB,CAAC;CAC9B,GAAG,qBAAqB,CAwFxB"}
1
+ {"version":3,"file":"response-lifecycle.d.ts","sourceRoot":"","sources":["../../../src/adapters/slack/response-lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,qBAAqB,EAAkB,MAAM,gBAAgB,CAAC;AAOjG,OAAO,KAAK,EAAE,UAAU,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAoPzF,wBAAgB,0BAA0B,CAAC,EACzC,KAAK,EACL,KAAK,EACL,WAAW,EACX,SAAS,EACT,OAAO,GACR,EAAE;IACD,KAAK,EAAE,UAAU,CAAC;IAClB,KAAK,EAAE,iBAAiB,CAAC;IACzB,WAAW,EAAE,uBAAuB,CAAC;IACrC,SAAS,EAAE,WAAW,GAAG,QAAQ,CAAC;IAClC,OAAO,EAAE,mBAAmB,CAAC;CAC9B,GAAG,qBAAqB,CAwFxB"}
@@ -1,10 +1,12 @@
1
1
  import * as log from "../../log.js";
2
2
  import { createProgressiveRenderer } from "../progressive-renderer.js";
3
- import { formatToolArgs, splitText } from "../shared.js";
3
+ import { splitText } from "../shared.js";
4
+ import { formatToolArgs } from "../../harness/tool-args.js";
4
5
  import { buildMrkdwnContextBlock } from "./bot.js";
5
6
  import { renderSlackBlocks } from "./blocks.js";
6
7
  import { normalizeSlackCurrencyBold } from "./markdown.js";
7
8
  import { slackPersonaForProfile } from "./persona.js";
9
+ import { errorMessage } from "../../unknown-values.js";
8
10
  const MAX_MAIN_LENGTH = 35000;
9
11
  const STREAM_MIN_DELTA_CHARS = 256;
10
12
  const MAX_THREAD_LENGTH = 20000;
@@ -14,7 +16,7 @@ const TRUNCATION_NOTE_INCREMENTAL = "\n\n_(message truncated, ask me to elaborat
14
16
  const formatSlackContinuation = (partNum) => `_(continued ${partNum})_`;
15
17
  function isSlackMsgTooLong(err) {
16
18
  const data = err?.data;
17
- const message = err instanceof Error ? err.message : String(err);
19
+ const message = errorMessage(err);
18
20
  return data?.error === "msg_too_long" || message.includes("msg_too_long");
19
21
  }
20
22
  function truncationCut(text, limit) {
@@ -91,7 +93,7 @@ class SlackResponseLifecycle {
91
93
  if (this.assistantStatusFailureWarned)
92
94
  return;
93
95
  this.assistantStatusFailureWarned = true;
94
- log.logWarning(`Slack setAssistantStatus failed (${label}; further occurrences suppressed for this session)`, err instanceof Error ? err.message : String(err));
96
+ log.logWarning(`Slack setAssistantStatus failed (${label}; further occurrences suppressed for this session)`, errorMessage(err));
95
97
  }
96
98
  async postThreadDiagnostic(text, options = {}, responseId) {
97
99
  const { event, sessionPlan, slack } = this.context;
@@ -1 +1 @@
1
- {"version":3,"file":"response-lifecycle.js","sourceRoot":"","sources":["../../../src/adapters/slack/response-lifecycle.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzD,OAAO,EAAE,uBAAuB,EAA2C,MAAM,UAAU,CAAC;AAC5F,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAE3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAEtD,MAAM,eAAe,GAAG,KAAK,CAAC;AAC9B,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAEnC,MAAM,iBAAiB,GAAG,KAAK,CAAC;AAChC,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAClC,MAAM,iBAAiB,GAAG,SAAS,CAAC;AACpC,MAAM,2BAA2B,GAC/B,kEAAkE,CAAC;AACrE,MAAM,uBAAuB,GAAG,CAAC,OAAe,EAAU,EAAE,CAAC,eAAe,OAAO,IAAI,CAAC;AAExF,SAAS,iBAAiB,CAAC,GAAY;IACrC,MAAM,IAAI,GAAI,GAAiD,EAAE,IAAI,CAAC;IACtE,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjE,OAAO,IAAI,EAAE,KAAK,KAAK,cAAc,IAAI,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;AAC5E,CAAC;AAED,SAAS,aAAa,CAAC,IAAY,EAAE,KAAa;IAChD,IAAI,IAAI,CAAC,MAAM,IAAI,KAAK;QAAE,OAAO,IAAI,CAAC,MAAM,CAAC;IAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAChD,OAAO,SAAS,GAAG,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;AACtD,CAAC;AAED,SAAS,qBAAqB,CAC5B,IAAY,EACZ,YAAqB,EACrB,YAAY,GAAG,oBAAoB;IAEnC,MAAM,MAAM,GAAG,YAAY;QACzB,CAAC,CAAC,yEAAyE,YAAY,UAAU;QACjG,CAAC,CAAC,yDAAyD,CAAC;IAC9D,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAC9C,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC;AACzD,CAAC;AAED,KAAK,UAAU,yBAAyB,CACtC,IAAqC,EACrC,IAAY,EACZ,YAAqB;IAErB,IAAI,YAAY,GAAG,oBAAoB,CAAC;IACxC,SAAS,CAAC;QACR,MAAM,QAAQ,GAAG,qBAAqB,CAAC,IAAI,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;QACzE,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC1B,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,YAAY,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAC;QAC7D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC;gBAAE,MAAM,GAAG,CAAC;YACvC,IAAI,YAAY,KAAK,CAAC;gBAAE,MAAM,GAAG,CAAC;YAClC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,qBAAqB,CAAC,MAAsB;IACnD,MAAM,aAAa,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACvD,IAAI,IAAI,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC,QAAQ,GAAG,CAAC;IAChE,IAAI,MAAM,CAAC,KAAK;QAAE,IAAI,IAAI,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC;IAC9C,IAAI,IAAI,KAAK,QAAQ,MAAM,CAAC;IAC5B,IAAI,aAAa;QAAE,IAAI,IAAI,WAAW,aAAa,YAAY,CAAC;IAChE,IAAI,IAAI,sBAAsB,MAAM,CAAC,MAAM,UAAU,CAAC;IACtD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACnC,IAAI,UAAU,GAAkB,IAAI,CAAC;IACrC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACpD,IAAI,MAAM,KAAK,SAAS;YAAE,SAAS;QACnC,IAAI,UAAU,KAAK,IAAI;YAAE,UAAU,GAAG,MAAM,CAAC;aACxC,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM,IAAI,UAAU,CAAC,MAAM;YAAE,UAAU,GAAG,IAAI,CAAC;IAChG,CAAC;IACD,OAAO,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,UAAU,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACtD,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAY;IACxC,IAAI,0BAA0B,CAAC,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC3D,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;AAChF,CAAC;AAUD,MAAM,sBAAsB;IAQ1B,YAA6B,OAAsC;QAAtC,YAAO,GAAP,OAAO,CAA+B;QAP3D,iCAA4B,GAAG,KAAK,CAAC;QACrC,gBAAW,GAAG,KAAK,CAAC;QACpB,oBAAe,GAAG,KAAK,CAAC;QACxB,wBAAmB,GAAG,EAAE,CAAC;QACzB,uBAAkB,GAAkB,IAAI,CAAC;QACzC,qBAAgB,GAAG,EAAE,CAAC;IAEwC,CAAC;IAE/D,sBAAsB,CAAC,KAAa,EAAE,GAAY;QACxD,IAAI,IAAI,CAAC,4BAA4B;YAAE,OAAO;QAC9C,IAAI,CAAC,4BAA4B,GAAG,IAAI,CAAC;QACzC,GAAG,CAAC,UAAU,CACZ,oCAAoC,KAAK,oDAAoD,EAC7F,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CACjD,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,oBAAoB,CACxB,IAAY,EACZ,OAAO,GAAkC,EAAE,EAC3C,UAAyB;QAEzB,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACnD,MAAM,YAAY,GAAG,UAAU,IAAI,WAAW,CAAC,MAAM,CAAC;QACtD,IAAI,CAAC,YAAY;YAAE,OAAO,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAa,EAAE,CAAC;QACzB,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,IAAI,EAAE,iBAAiB,EAAE,uBAAuB,CAAC,EAAE,CAAC;YAC/E,IAAI,OAAO,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;gBAC9B,GAAG,CAAC,IAAI,CACN,MAAM,KAAK,CAAC,kBAAkB,CAAC,KAAK,CAAC,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE;oBAChE,uBAAuB,CAAC,IAAI,CAAC;iBAC9B,CAAC,CACH,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,IAAI,CACN,MAAM,KAAK,CAAC,YAAY,CACtB,KAAK,CAAC,OAAO,EACb,YAAY,EACZ,OAAO,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAC/C,CACF,CAAC;YACJ,CAAC;QACH,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAEO,KAAK,CAAC,iBAAiB;QAC7B,IAAI,CAAC,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,mBAAmB,KAAK,IAAI,CAAC,gBAAgB;YAAE,OAAO;QAC5F,MAAM,iBAAiB,GAAG,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACrF,MAAM,MAAM,GAAG,iBAAiB;YAC9B,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;YAC9D,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;YAAE,OAAO;QAC3B,MAAM,IAAI,CAAC,oBAAoB,CAC7B,iBAAiB,IAAI,IAAI,CAAC,gBAAgB;YACxC,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,2CAA2C,MAAM,EAAE,EACvD,EAAE,EACF,IAAI,CAAC,kBAAkB,CACxB,CAAC;QACF,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,mBAAmB,CAAC;IACnD,CAAC;IAEO,aAAa,CAAC,MAAc;QAClC,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACnD,IAAI,CAAC,WAAW,CAAC,MAAM;YAAE,OAAO;QAChC,KAAK,KAAK;aACP,kBAAkB,CAAC,KAAK,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC;aAC7D,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC,CAAC;IAC3F,CAAC;IAED,SAAS;QACP,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO;QAC7B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,EAAU;QAC5B,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACtC,MAAM,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,QAAiB,EAAE,UAAyB;QAC1D,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACpD,IAAI,CAAC,QAAQ,IAAI,UAAU,IAAI,CAAC,WAAW,CAAC,MAAM,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,eAAe;YAC5F,OAAO;QACT,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC,mBAAmB,aAAa,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IACtF,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,OAAgB;QACrC,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,SAAS,EAAE,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAY,EAAE,UAAyB;QACpD,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QAClE,IAAI,UAAU,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YAC9B,KAAK,CAAC,cAAc,CAClB,KAAK,CAAC,OAAO,EACb,IAAI,EACJ,UAAU,EACV,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAC/C,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,EAClB,IAAI,EACJ,SAAS,EACT,OAAO,EACP,UAAU,EACV,KAAK,EACL,aAAa,GACM;QACnB,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACpD,IAAI,YAAgC,CAAC;QACrC,MAAM,mBAAmB,GAAG,GAAuB,EAAE;YACnD,IAAI,YAAY,KAAK,SAAS,IAAI,OAAO,EAAE,kBAAkB,EAAE,CAAC;gBAC9D,YAAY,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;YAC9C,CAAC;YACD,OAAO,YAAY,CAAC;QACtB,CAAC,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,yBAAyB,CAAC,KAAK,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC,CAAC;QAErF,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,SAAS,EAAE,CAAC;QACzE,IAAI,CAAC,kBAAkB,GAAG,aAAa;YACrC,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,IAAI,aAAa,EAAE,IAAI,UAAU,CAAC;YACvD,CAAC,CAAC,CAAC,aAAa,EAAE,IAAI,UAAU,CAAC,CAAC;QACpC,IAAI,SAAS,KAAK,SAAS;YAAE,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC5D,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF;AAED,SAAS,0BAA0B,CAAC,IAAY,EAAE,OAAgB;IAChE,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACrC,OAAO,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,iBAAiB,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;AAC5D,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY,EAAE,OAAgB;IACxD,IAAI,GAAG,0BAA0B,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,eAAe,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC;IACrF,IAAI,IAAI,CAAC,MAAM,IAAI,KAAK;QAAE,OAAO,IAAI,CAAC;IACtC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,2BAA2B,CAAC,MAAM,CAAC,CAAC,GAAG,2BAA2B,EAAE,CAAC;AACnH,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,EACzC,KAAK,EACL,KAAK,EACL,WAAW,EACX,SAAS,EACT,OAAO,GAOR;IACC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,WAAW,CAAC;IAC3C,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,UAAU,IAAI,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC;IAChF,MAAM,aAAa,GAAG,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,2BAA2B,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACvE,MAAM,SAAS,GAAG,IAAI,sBAAsB,CAAC;QAC3C,KAAK;QACL,KAAK;QACL,WAAW;QACX,aAAa;QACb,aAAa;KACd,CAAC,CAAC;IAEH,MAAM,UAAU,GACd,aAAa,IAAI,MAAM,IAAI,KAAK,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC;IACnF,MAAM,EAAE,SAAS,EAAE,GAAG,yBAAyB,CAAC;QAC9C,KAAK,EAAE,OAAO;QACd,SAAS,EAAE,eAAe;QAC1B,iBAAiB,EAAE,WAAW,CAAC,gBAAgB,IAAI,IAAI;QACvD,kBAAkB,EAAE,uBAAuB;QAC3C,WAAW,EAAE,EAAE;QACf,gBAAgB,EAAE,UAAU,KAAK,UAAU,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS;QAC3E,iBAAiB,EAAE,0BAA0B;QAC7C,aAAa,EAAE,kBAAkB;QACjC,cAAc,EAAE,IAAI;QACpB,MAAM,EACJ,UAAU,KAAK,QAAQ;YACrB,CAAC,CAAC;gBACE,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC;gBAClF,MAAM,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,mBAAmB,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,EAAE,KAAK,CAAC;gBAC1E,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;gBACxD,aAAa,EAAE,sBAAsB;aACtC;YACH,CAAC,CAAC,SAAS;QACf,oBAAoB;QACpB,gBAAgB,EAAE,qBAAqB;QACvC,oBAAoB,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YACrC,QAAQ,EAAE,OAAO;YACjB,cAAc,EAAE,KAAK,CAAC,OAAO,CAAC,cAAc;YAC5C,SAAS,EAAE,KAAK,CAAC,OAAO;YACxB,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,iBAAiB,EAAE,UAAU;YAC7B,QAAQ,EAAE,MAAM;YAChB,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;YAC1C,UAAU;SACX,CAAC;QACF,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CACb,aAAa,IAAI,MAAM;YACrB,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC;YACjD,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC;QAC5C,MAAM,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC;QAClE,SAAS,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,CAC9B,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,UAAU,IAAI,MAAM,IAAI,EAAE,EAAE,IAAI,CAAC;QACrE,cAAc,EAAE,SAAS,CAAC,oBAAoB,CAAC,IAAI,CAAC,SAAS,CAAC;QAC9D,MAAM,EAAE,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC;QAC/C,WAAW,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QACnE,SAAS,EAAE,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC;QAC9C,gBAAgB,EAAE,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC;QAC5D,QAAQ,EAAE,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC;QAC5C,cAAc,EAAE,iBAAiB;QACjC,aAAa,EAAE,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC;QACtD,UAAU,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,CAC9B,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;QACtF,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YACrB,IAAI,CAAC,aAAa;gBAAE,MAAM,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QAC9E,CAAC;KACF,CAAC,CAAC;IAEH,OAAO;QACL,GAAG,SAAS;QACZ,cAAc,EAAE,KAAK,IAAI,EAAE;YACzB,SAAS,CAAC,SAAS,EAAE,CAAC;YACtB,MAAM,SAAS,CAAC,cAAc,EAAE,CAAC;QACnC,CAAC;QACD,aAAa,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;YACrC,MAAM,QAAQ,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;YACjD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,CAAC,aAAa,IAAI,MAAM;oBAC5B,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC;oBACjD,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;gBAC5C,OAAO;YACT,CAAC;YACD,MAAM,EAAE,GAAG,MAAM,CAAC,aAAa,IAAI,MAAM;gBACvC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC;gBAC3D,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;YACjE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACpF,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["import type { ConversationMessage, ConversationResponder, ChatToolResult } from \"../index.js\";\nimport * as log from \"../../log.js\";\nimport { createProgressiveRenderer } from \"../progressive-renderer.js\";\nimport { formatToolArgs, splitText } from \"../shared.js\";\nimport type { HandleTooLongInput } from \"../types.js\";\nimport { buildMrkdwnContextBlock, type SlackMessagingBot, type SlackEvent } from \"./bot.js\";\nimport { renderSlackBlocks } from \"./blocks.js\";\nimport { normalizeSlackCurrencyBold } from \"./markdown.js\";\nimport type { SlackAdapterSessionPlan } from \"./types.js\";\nimport { slackPersonaForProfile } from \"./persona.js\";\n\nconst MAX_MAIN_LENGTH = 35000;\nconst STREAM_MIN_DELTA_CHARS = 256;\n\nconst MAX_THREAD_LENGTH = 20000;\nconst FALLBACK_MAIN_LENGTH = 3000;\nconst WORKING_INDICATOR = \"\\n\\n...\";\nconst TRUNCATION_NOTE_INCREMENTAL =\n \"\\n\\n_(message truncated, ask me to elaborate on specific parts)_\";\nconst formatSlackContinuation = (partNum: number): string => `_(continued ${partNum})_`;\n\nfunction isSlackMsgTooLong(err: unknown): boolean {\n const data = (err as { data?: { error?: string } } | undefined)?.data;\n const message = err instanceof Error ? err.message : String(err);\n return data?.error === \"msg_too_long\" || message.includes(\"msg_too_long\");\n}\n\nfunction truncationCut(text: string, limit: number): number {\n if (text.length <= limit) return text.length;\n const lastBreak = text.lastIndexOf(\"\\n\", limit);\n return lastBreak > limit * 0.75 ? lastBreak : limit;\n}\n\nfunction fallbackLongSlackText(\n text: string,\n overflowLink?: string,\n prefixLength = FALLBACK_MAIN_LENGTH,\n): { text: string; cut: number } {\n const suffix = overflowLink\n ? `\\n\\n_(message too long for Slack; continued in thread; session view: <${overflowLink}|open>)_`\n : \"\\n\\n_(message too long for Slack; continued in thread)_\";\n const cut = truncationCut(text, prefixLength);\n return { text: `${text.slice(0, cut)}${suffix}`, cut };\n}\n\nasync function postSlackTextWithFallback(\n post: (text: string) => Promise<void>,\n text: string,\n overflowLink?: string,\n): Promise<{ text: string; prefixLength: number }> {\n let prefixLength = FALLBACK_MAIN_LENGTH;\n for (;;) {\n const fallback = fallbackLongSlackText(text, overflowLink, prefixLength);\n try {\n await post(fallback.text);\n return { text: fallback.text, prefixLength: fallback.cut };\n } catch (err) {\n if (!isSlackMsgTooLong(err)) throw err;\n if (prefixLength === 0) throw err;\n prefixLength = Math.max(0, Math.floor(prefixLength / 2));\n }\n }\n}\n\nfunction formatSlackToolResult(result: ChatToolResult): string {\n const argsFormatted = formatToolArgs(result.args);\n const duration = (result.durationMs / 1000).toFixed(1);\n let text = `*${result.isError ? \"✗\" : \"✓\"} ${result.toolName}*`;\n if (result.label) text += `: ${result.label}`;\n text += ` (${duration}s)\\n`;\n if (argsFormatted) text += `\\`\\`\\`\\n${argsFormatted}\\n\\`\\`\\`\\n`;\n text += `*Result:*\\n\\`\\`\\`\\n${result.result}\\n\\`\\`\\``;\n return text;\n}\n\nfunction closeOpenFences(text: string): string {\n let openMarker: string | null = null;\n for (const line of text.split(\"\\n\")) {\n const marker = line.match(/^\\s*(`{3,}|~{3,})/)?.[1];\n if (marker === undefined) continue;\n if (openMarker === null) openMarker = marker;\n else if (marker[0] === openMarker[0] && marker.length >= openMarker.length) openMarker = null;\n }\n return openMarker ? `${text}\\n${openMarker}` : text;\n}\n\nfunction needsCanonicalRender(text: string): boolean {\n if (normalizeSlackCurrencyBold(text) !== text) return true;\n return renderSlackBlocks(text).blocks.some((block) => block.type === \"table\");\n}\n\ninterface SlackResponseLifecycleOptions {\n event: SlackEvent;\n slack: SlackMessagingBot;\n sessionPlan: SlackAdapterSessionPlan;\n replyInThread: boolean;\n eventFilename: string | undefined;\n}\n\nclass SlackResponseLifecycle {\n private assistantStatusFailureWarned = false;\n private statusEnded = false;\n private statusRequested = false;\n private pendingContinuation = \"\";\n private continuationAnchor: string | null = null;\n private continuationSent = \"\";\n\n constructor(private readonly context: SlackResponseLifecycleOptions) {}\n\n private onAssistantStatusError(label: string, err: unknown): void {\n if (this.assistantStatusFailureWarned) return;\n this.assistantStatusFailureWarned = true;\n log.logWarning(\n `Slack setAssistantStatus failed (${label}; further occurrences suppressed for this session)`,\n err instanceof Error ? err.message : String(err),\n );\n }\n\n async postThreadDiagnostic(\n text: string,\n options: { style?: \"muted\" | \"error\" } = {},\n responseId: string | null,\n ): Promise<Array<string | number>> {\n const { event, sessionPlan, slack } = this.context;\n const threadAnchor = responseId ?? sessionPlan.rootTs;\n if (!threadAnchor) return [];\n const ids: string[] = [];\n for (const part of splitText(text, MAX_THREAD_LENGTH, formatSlackContinuation)) {\n if (options.style === \"muted\") {\n ids.push(\n await slack.postInThreadBlocks(event.channel, threadAnchor, part, [\n buildMrkdwnContextBlock(part),\n ]),\n );\n } else {\n ids.push(\n await slack.postInThread(\n event.channel,\n threadAnchor,\n options.style === \"error\" ? `_${part}_` : part,\n ),\n );\n }\n }\n return ids;\n }\n\n private async flushContinuation(): Promise<void> {\n if (!this.pendingContinuation || this.pendingContinuation === this.continuationSent) return;\n const extendsSentPrefix = this.pendingContinuation.startsWith(this.continuationSent);\n const unsent = extendsSentPrefix\n ? this.pendingContinuation.slice(this.continuationSent.length)\n : this.pendingContinuation;\n if (!unsent.trim()) return;\n await this.postThreadDiagnostic(\n extendsSentPrefix && this.continuationSent\n ? unsent\n : `_(continued from truncated message)_\\n\\n${unsent}`,\n {},\n this.continuationAnchor,\n );\n this.continuationSent = this.pendingContinuation;\n }\n\n private requestStatus(status: string): void {\n const { event, sessionPlan, slack } = this.context;\n if (!sessionPlan.rootTs) return;\n void slack\n .setAssistantStatus(event.channel, sessionPlan.rootTs, status)\n .catch((err) => this.onAssistantStatusError(status ? \"typing\" : \"clear-on-idle\", err));\n }\n\n endStatus(): void {\n if (this.statusEnded) return;\n this.statusEnded = true;\n this.requestStatus(\"\");\n }\n\n async deleteMessage(id: string): Promise<void> {\n this.endStatus();\n const { event, slack } = this.context;\n await slack.deleteMessage(event.channel, id);\n }\n\n async setTyping(isTyping: boolean, responseId: string | null): Promise<void> {\n const { eventFilename, sessionPlan } = this.context;\n if (!isTyping || responseId || !sessionPlan.rootTs || this.statusEnded || this.statusRequested)\n return;\n this.statusRequested = true;\n this.requestStatus(eventFilename ? `Starting event: ${eventFilename}` : \"Thinking\");\n }\n\n async onWorkingChanged(working: boolean): Promise<void> {\n if (!working) this.endStatus();\n }\n\n async onFinish(text: string, responseId: string | null): Promise<void> {\n const { event, replyInThread, sessionPlan, slack } = this.context;\n if (responseId && text.trim()) {\n slack.logBotResponse(\n event.channel,\n text,\n responseId,\n replyInThread ? sessionPlan.rootTs : undefined,\n );\n }\n this.endStatus();\n await this.flushContinuation();\n }\n\n async handleTooLong({\n text,\n operation,\n options,\n responseId,\n write,\n getResponseId,\n }: HandleTooLongInput): Promise<{ text: string; prefixLength: number }> {\n const { replyInThread, sessionPlan } = this.context;\n let overflowLink: string | undefined;\n const resolveOverflowLink = (): string | undefined => {\n if (overflowLink === undefined && options?.createOverflowLink) {\n overflowLink = options.createOverflowLink();\n }\n return overflowLink;\n };\n const fallback = await postSlackTextWithFallback(write, text, resolveOverflowLink());\n\n this.pendingContinuation = text.slice(fallback.prefixLength).trimStart();\n this.continuationAnchor = replyInThread\n ? (sessionPlan.rootTs ?? getResponseId() ?? responseId)\n : (getResponseId() ?? responseId);\n if (operation === \"replace\") await this.flushContinuation();\n return fallback;\n }\n}\n\nfunction formatProvisionalSlackText(text: string, working: boolean): string {\n const closed = closeOpenFences(text);\n return working ? `${closed}${WORKING_INDICATOR}` : closed;\n}\n\nfunction prepareSlackSource(text: string, working: boolean): string {\n text = normalizeSlackCurrencyBold(text);\n const limit = working ? MAX_MAIN_LENGTH - WORKING_INDICATOR.length : MAX_MAIN_LENGTH;\n if (text.length <= limit) return text;\n return `${text.slice(0, Math.max(0, limit - TRUNCATION_NOTE_INCREMENTAL.length))}${TRUNCATION_NOTE_INCREMENTAL}`;\n}\n\nexport function createSlackResponseContext({\n event,\n slack,\n sessionPlan,\n replyMode,\n message,\n}: {\n event: SlackEvent;\n slack: SlackMessagingBot;\n sessionPlan: SlackAdapterSessionPlan;\n replyMode: \"top-level\" | \"thread\";\n message: ConversationMessage;\n}): ConversationResponder {\n const { rootTs, isThreaded } = sessionPlan;\n const replyInThread = Boolean(rootTs && (isThreaded || replyMode === \"thread\"));\n const eventFilename = event.ts.match(/^event:([^:]+(?:\\.json)?)/)?.[1];\n const lifecycle = new SlackResponseLifecycle({\n event,\n slack,\n sessionPlan,\n replyInThread,\n eventFilename,\n });\n\n const streamKind =\n replyInThread && rootTs && slack.tryReserveStreamStart() ? \"native\" : \"buffered\";\n const { responder } = createProgressiveRenderer({\n label: \"Slack\",\n maxLength: MAX_MAIN_LENGTH,\n initialResponseId: sessionPlan.initialMessageTs ?? null,\n formatContinuation: formatSlackContinuation,\n errorPrefix: \"\",\n workingIndicator: streamKind === \"buffered\" ? WORKING_INDICATOR : undefined,\n formatProvisional: formatProvisionalSlackText,\n prepareSource: prepareSlackSource,\n supportsDeltas: true,\n stream:\n streamKind === \"native\"\n ? {\n start: (text) => slack.startMessageStream(event.channel, text, rootTs, event.user),\n append: (id, delta) => slack.appendMessageStream(event.channel, id, delta),\n stop: (id) => slack.stopMessageStream(event.channel, id),\n minDeltaChars: STREAM_MIN_DELTA_CHARS,\n }\n : undefined,\n needsCanonicalRender,\n formatToolResult: formatSlackToolResult,\n responseErrorContext: (responseId) => ({\n platform: \"slack\",\n conversationId: event.address.conversationId,\n channelId: event.channel,\n messageId: message.id,\n sessionKey: message.sessionKey,\n responseMessageId: responseId,\n threadTs: rootTs,\n conversationKind: message.conversationKind,\n isThreaded,\n }),\n post: (text) =>\n replyInThread && rootTs\n ? slack.postInThread(event.channel, rootTs, text)\n : slack.postMessage(event.channel, text),\n update: (id, text) => slack.updateMessage(event.channel, id, text),\n postExtra: (text, responseId) =>\n slack.postInThread(event.channel, responseId ?? rootTs ?? \"\", text),\n postDiagnostic: lifecycle.postThreadDiagnostic.bind(lifecycle),\n delete: lifecycle.deleteMessage.bind(lifecycle),\n deleteExtra: (id) => slack.deleteMessage(event.channel, String(id)),\n setTyping: lifecycle.setTyping.bind(lifecycle),\n onWorkingChanged: lifecycle.onWorkingChanged.bind(lifecycle),\n onFinish: lifecycle.onFinish.bind(lifecycle),\n isTooLongError: isSlackMsgTooLong,\n handleTooLong: lifecycle.handleTooLong.bind(lifecycle),\n uploadFile: (filePath, title) =>\n slack.uploadFile(event.channel, filePath, title, replyInThread ? rootTs : undefined),\n react: async (emoji) => {\n if (!eventFilename) await slack.addReaction(event.channel, event.ts, emoji);\n },\n });\n\n return {\n ...responder,\n deleteResponse: async () => {\n lifecycle.endStatus();\n await responder.deleteResponse();\n },\n respondAsRole: async (profile, text) => {\n const identity = slackPersonaForProfile(profile);\n if (!identity) {\n await (replyInThread && rootTs\n ? slack.postInThread(event.channel, rootTs, text)\n : slack.postMessage(event.channel, text));\n return;\n }\n const ts = await (replyInThread && rootTs\n ? slack.postInThread(event.channel, rootTs, text, identity)\n : slack.postMessage(event.channel, text, undefined, identity));\n slack.logBotResponse(event.channel, text, ts, replyInThread ? rootTs : undefined);\n },\n };\n}\n"]}
1
+ {"version":3,"file":"response-lifecycle.js","sourceRoot":"","sources":["../../../src/adapters/slack/response-lifecycle.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ConversationMessage, ConversationResponder, ChatToolResult } from \"../../types.js\";\nimport * as log from \"../../log.js\";\nimport { createProgressiveRenderer } from \"../progressive-renderer.js\";\nimport { splitText } from \"../shared.js\";\nimport { formatToolArgs } from \"../../harness/tool-args.js\";\nimport type { HandleTooLongInput } from \"../types.js\";\nimport { buildMrkdwnContextBlock } from \"./bot.js\";\nimport type { SlackEvent, SlackAdapterSessionPlan, SlackResponderBot } from \"./types.js\";\nimport { renderSlackBlocks } from \"./blocks.js\";\nimport { normalizeSlackCurrencyBold } from \"./markdown.js\";\nimport { slackPersonaForProfile } from \"./persona.js\";\nimport { errorMessage } from \"../../unknown-values.js\";\n\nconst MAX_MAIN_LENGTH = 35000;\nconst STREAM_MIN_DELTA_CHARS = 256;\n\nconst MAX_THREAD_LENGTH = 20000;\nconst FALLBACK_MAIN_LENGTH = 3000;\nconst WORKING_INDICATOR = \"\\n\\n...\";\nconst TRUNCATION_NOTE_INCREMENTAL =\n \"\\n\\n_(message truncated, ask me to elaborate on specific parts)_\";\nconst formatSlackContinuation = (partNum: number): string => `_(continued ${partNum})_`;\n\nfunction isSlackMsgTooLong(err: unknown): boolean {\n const data = (err as { data?: { error?: string } } | undefined)?.data;\n const message = errorMessage(err);\n return data?.error === \"msg_too_long\" || message.includes(\"msg_too_long\");\n}\n\nfunction truncationCut(text: string, limit: number): number {\n if (text.length <= limit) return text.length;\n const lastBreak = text.lastIndexOf(\"\\n\", limit);\n return lastBreak > limit * 0.75 ? lastBreak : limit;\n}\n\nfunction fallbackLongSlackText(\n text: string,\n overflowLink?: string,\n prefixLength = FALLBACK_MAIN_LENGTH,\n): { text: string; cut: number } {\n const suffix = overflowLink\n ? `\\n\\n_(message too long for Slack; continued in thread; session view: <${overflowLink}|open>)_`\n : \"\\n\\n_(message too long for Slack; continued in thread)_\";\n const cut = truncationCut(text, prefixLength);\n return { text: `${text.slice(0, cut)}${suffix}`, cut };\n}\n\nasync function postSlackTextWithFallback(\n post: (text: string) => Promise<void>,\n text: string,\n overflowLink?: string,\n): Promise<{ text: string; prefixLength: number }> {\n let prefixLength = FALLBACK_MAIN_LENGTH;\n for (;;) {\n const fallback = fallbackLongSlackText(text, overflowLink, prefixLength);\n try {\n await post(fallback.text);\n return { text: fallback.text, prefixLength: fallback.cut };\n } catch (err) {\n if (!isSlackMsgTooLong(err)) throw err;\n if (prefixLength === 0) throw err;\n prefixLength = Math.max(0, Math.floor(prefixLength / 2));\n }\n }\n}\n\nfunction formatSlackToolResult(result: ChatToolResult): string {\n const argsFormatted = formatToolArgs(result.args);\n const duration = (result.durationMs / 1000).toFixed(1);\n let text = `*${result.isError ? \"✗\" : \"✓\"} ${result.toolName}*`;\n if (result.label) text += `: ${result.label}`;\n text += ` (${duration}s)\\n`;\n if (argsFormatted) text += `\\`\\`\\`\\n${argsFormatted}\\n\\`\\`\\`\\n`;\n text += `*Result:*\\n\\`\\`\\`\\n${result.result}\\n\\`\\`\\``;\n return text;\n}\n\nfunction closeOpenFences(text: string): string {\n let openMarker: string | null = null;\n for (const line of text.split(\"\\n\")) {\n const marker = line.match(/^\\s*(`{3,}|~{3,})/)?.[1];\n if (marker === undefined) continue;\n if (openMarker === null) openMarker = marker;\n else if (marker[0] === openMarker[0] && marker.length >= openMarker.length) openMarker = null;\n }\n return openMarker ? `${text}\\n${openMarker}` : text;\n}\n\nfunction needsCanonicalRender(text: string): boolean {\n if (normalizeSlackCurrencyBold(text) !== text) return true;\n return renderSlackBlocks(text).blocks.some((block) => block.type === \"table\");\n}\n\ninterface SlackResponseLifecycleOptions {\n event: SlackEvent;\n slack: SlackResponderBot;\n sessionPlan: SlackAdapterSessionPlan;\n replyInThread: boolean;\n eventFilename: string | undefined;\n}\n\nclass SlackResponseLifecycle {\n private assistantStatusFailureWarned = false;\n private statusEnded = false;\n private statusRequested = false;\n private pendingContinuation = \"\";\n private continuationAnchor: string | null = null;\n private continuationSent = \"\";\n\n constructor(private readonly context: SlackResponseLifecycleOptions) {}\n\n private onAssistantStatusError(label: string, err: unknown): void {\n if (this.assistantStatusFailureWarned) return;\n this.assistantStatusFailureWarned = true;\n log.logWarning(\n `Slack setAssistantStatus failed (${label}; further occurrences suppressed for this session)`,\n errorMessage(err),\n );\n }\n\n async postThreadDiagnostic(\n text: string,\n options: { style?: \"muted\" | \"error\" } = {},\n responseId: string | null,\n ): Promise<Array<string | number>> {\n const { event, sessionPlan, slack } = this.context;\n const threadAnchor = responseId ?? sessionPlan.rootTs;\n if (!threadAnchor) return [];\n const ids: string[] = [];\n for (const part of splitText(text, MAX_THREAD_LENGTH, formatSlackContinuation)) {\n if (options.style === \"muted\") {\n ids.push(\n await slack.postInThreadBlocks(event.channel, threadAnchor, part, [\n buildMrkdwnContextBlock(part),\n ]),\n );\n } else {\n ids.push(\n await slack.postInThread(\n event.channel,\n threadAnchor,\n options.style === \"error\" ? `_${part}_` : part,\n ),\n );\n }\n }\n return ids;\n }\n\n private async flushContinuation(): Promise<void> {\n if (!this.pendingContinuation || this.pendingContinuation === this.continuationSent) return;\n const extendsSentPrefix = this.pendingContinuation.startsWith(this.continuationSent);\n const unsent = extendsSentPrefix\n ? this.pendingContinuation.slice(this.continuationSent.length)\n : this.pendingContinuation;\n if (!unsent.trim()) return;\n await this.postThreadDiagnostic(\n extendsSentPrefix && this.continuationSent\n ? unsent\n : `_(continued from truncated message)_\\n\\n${unsent}`,\n {},\n this.continuationAnchor,\n );\n this.continuationSent = this.pendingContinuation;\n }\n\n private requestStatus(status: string): void {\n const { event, sessionPlan, slack } = this.context;\n if (!sessionPlan.rootTs) return;\n void slack\n .setAssistantStatus(event.channel, sessionPlan.rootTs, status)\n .catch((err) => this.onAssistantStatusError(status ? \"typing\" : \"clear-on-idle\", err));\n }\n\n endStatus(): void {\n if (this.statusEnded) return;\n this.statusEnded = true;\n this.requestStatus(\"\");\n }\n\n async deleteMessage(id: string): Promise<void> {\n this.endStatus();\n const { event, slack } = this.context;\n await slack.deleteMessage(event.channel, id);\n }\n\n async setTyping(isTyping: boolean, responseId: string | null): Promise<void> {\n const { eventFilename, sessionPlan } = this.context;\n if (!isTyping || responseId || !sessionPlan.rootTs || this.statusEnded || this.statusRequested)\n return;\n this.statusRequested = true;\n this.requestStatus(eventFilename ? `Starting event: ${eventFilename}` : \"Thinking\");\n }\n\n async onWorkingChanged(working: boolean): Promise<void> {\n if (!working) this.endStatus();\n }\n\n async onFinish(text: string, responseId: string | null): Promise<void> {\n const { event, replyInThread, sessionPlan, slack } = this.context;\n if (responseId && text.trim()) {\n slack.logBotResponse(\n event.channel,\n text,\n responseId,\n replyInThread ? sessionPlan.rootTs : undefined,\n );\n }\n this.endStatus();\n await this.flushContinuation();\n }\n\n async handleTooLong({\n text,\n operation,\n options,\n responseId,\n write,\n getResponseId,\n }: HandleTooLongInput): Promise<{ text: string; prefixLength: number }> {\n const { replyInThread, sessionPlan } = this.context;\n let overflowLink: string | undefined;\n const resolveOverflowLink = (): string | undefined => {\n if (overflowLink === undefined && options?.createOverflowLink) {\n overflowLink = options.createOverflowLink();\n }\n return overflowLink;\n };\n const fallback = await postSlackTextWithFallback(write, text, resolveOverflowLink());\n\n this.pendingContinuation = text.slice(fallback.prefixLength).trimStart();\n this.continuationAnchor = replyInThread\n ? (sessionPlan.rootTs ?? getResponseId() ?? responseId)\n : (getResponseId() ?? responseId);\n if (operation === \"replace\") await this.flushContinuation();\n return fallback;\n }\n}\n\nfunction formatProvisionalSlackText(text: string, working: boolean): string {\n const closed = closeOpenFences(text);\n return working ? `${closed}${WORKING_INDICATOR}` : closed;\n}\n\nfunction prepareSlackSource(text: string, working: boolean): string {\n text = normalizeSlackCurrencyBold(text);\n const limit = working ? MAX_MAIN_LENGTH - WORKING_INDICATOR.length : MAX_MAIN_LENGTH;\n if (text.length <= limit) return text;\n return `${text.slice(0, Math.max(0, limit - TRUNCATION_NOTE_INCREMENTAL.length))}${TRUNCATION_NOTE_INCREMENTAL}`;\n}\n\nexport function createSlackResponseContext({\n event,\n slack,\n sessionPlan,\n replyMode,\n message,\n}: {\n event: SlackEvent;\n slack: SlackResponderBot;\n sessionPlan: SlackAdapterSessionPlan;\n replyMode: \"top-level\" | \"thread\";\n message: ConversationMessage;\n}): ConversationResponder {\n const { rootTs, isThreaded } = sessionPlan;\n const replyInThread = Boolean(rootTs && (isThreaded || replyMode === \"thread\"));\n const eventFilename = event.ts.match(/^event:([^:]+(?:\\.json)?)/)?.[1];\n const lifecycle = new SlackResponseLifecycle({\n event,\n slack,\n sessionPlan,\n replyInThread,\n eventFilename,\n });\n\n const streamKind =\n replyInThread && rootTs && slack.tryReserveStreamStart() ? \"native\" : \"buffered\";\n const { responder } = createProgressiveRenderer({\n label: \"Slack\",\n maxLength: MAX_MAIN_LENGTH,\n initialResponseId: sessionPlan.initialMessageTs ?? null,\n formatContinuation: formatSlackContinuation,\n errorPrefix: \"\",\n workingIndicator: streamKind === \"buffered\" ? WORKING_INDICATOR : undefined,\n formatProvisional: formatProvisionalSlackText,\n prepareSource: prepareSlackSource,\n supportsDeltas: true,\n stream:\n streamKind === \"native\"\n ? {\n start: (text) => slack.startMessageStream(event.channel, text, rootTs, event.user),\n append: (id, delta) => slack.appendMessageStream(event.channel, id, delta),\n stop: (id) => slack.stopMessageStream(event.channel, id),\n minDeltaChars: STREAM_MIN_DELTA_CHARS,\n }\n : undefined,\n needsCanonicalRender,\n formatToolResult: formatSlackToolResult,\n responseErrorContext: (responseId) => ({\n platform: \"slack\",\n conversationId: event.address.conversationId,\n channelId: event.channel,\n messageId: message.id,\n sessionKey: message.sessionKey,\n responseMessageId: responseId,\n threadTs: rootTs,\n conversationKind: message.conversationKind,\n isThreaded,\n }),\n post: (text) =>\n replyInThread && rootTs\n ? slack.postInThread(event.channel, rootTs, text)\n : slack.postMessage(event.channel, text),\n update: (id, text) => slack.updateMessage(event.channel, id, text),\n postExtra: (text, responseId) =>\n slack.postInThread(event.channel, responseId ?? rootTs ?? \"\", text),\n postDiagnostic: lifecycle.postThreadDiagnostic.bind(lifecycle),\n delete: lifecycle.deleteMessage.bind(lifecycle),\n deleteExtra: (id) => slack.deleteMessage(event.channel, String(id)),\n setTyping: lifecycle.setTyping.bind(lifecycle),\n onWorkingChanged: lifecycle.onWorkingChanged.bind(lifecycle),\n onFinish: lifecycle.onFinish.bind(lifecycle),\n isTooLongError: isSlackMsgTooLong,\n handleTooLong: lifecycle.handleTooLong.bind(lifecycle),\n uploadFile: (filePath, title) =>\n slack.uploadFile(event.channel, filePath, title, replyInThread ? rootTs : undefined),\n react: async (emoji) => {\n if (!eventFilename) await slack.addReaction(event.channel, event.ts, emoji);\n },\n });\n\n return {\n ...responder,\n deleteResponse: async () => {\n lifecycle.endStatus();\n await responder.deleteResponse();\n },\n respondAsRole: async (profile, text) => {\n const identity = slackPersonaForProfile(profile);\n if (!identity) {\n await (replyInThread && rootTs\n ? slack.postInThread(event.channel, rootTs, text)\n : slack.postMessage(event.channel, text));\n return;\n }\n const ts = await (replyInThread && rootTs\n ? slack.postInThread(event.channel, rootTs, text, identity)\n : slack.postMessage(event.channel, text, undefined, identity));\n slack.logBotResponse(event.channel, text, ts, replyInThread ? rootTs : undefined);\n },\n };\n}\n"]}
@@ -1,4 +1,3 @@
1
- export type { SlackAdapterSessionPlan, SlackEventAnchorRunPlan, SlackSessionRef } from "./types.js";
2
1
  import type { OfficeAddress } from "../../types.js";
3
2
  import type { SlackAdapterSessionPlan, SlackEventAnchorRunPlan, SlackSessionRef } from "./types.js";
4
3
  interface SlackSessionEventLike {
@@ -18,4 +17,5 @@ export declare function planSlackAdapterSession(event: SlackSessionEventLike, op
18
17
  export declare function planSlackEventAnchorRun<T extends SlackSessionEventLike>(event: T, anchorTs?: string): SlackEventAnchorRunPlan<T & {
19
18
  sessionKey?: string;
20
19
  }>;
20
+ export {};
21
21
  //# sourceMappingURL=session.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/adapters/slack/session.ts"],"names":[],"mappings":"AAMA,YAAY,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACpG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEpG,UAAU,qBAAqB;IAC7B,OAAO,EAAE,aAAa,CAAC;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAElE;AAED,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,CAMxE;AAED,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAEnE;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAUnF;AAMD,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,IAAI,CAAC,qBAAqB,EAAE,IAAI,GAAG,WAAW,CAAC,GACrD,MAAM,GAAG,SAAS,CAEpB;AAED,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,qBAAqB,EAC5B,OAAO,GAAE;IAAE,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAAO,GAC1C,uBAAuB,CAUzB;AAED,wBAAgB,uBAAuB,CAAC,CAAC,SAAS,qBAAqB,EACrE,KAAK,EAAE,CAAC,EACR,QAAQ,CAAC,EAAE,MAAM,GAChB,uBAAuB,CAAC,CAAC,GAAG;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAYtD"}
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/adapters/slack/session.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEpG,UAAU,qBAAqB;IAC7B,OAAO,EAAE,aAAa,CAAC;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAElE;AAED,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,CAMxE;AAED,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAEnE;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAUnF;AAMD,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,IAAI,CAAC,qBAAqB,EAAE,IAAI,GAAG,WAAW,CAAC,GACrD,MAAM,GAAG,SAAS,CAEpB;AAED,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,qBAAqB,EAC5B,OAAO,GAAE;IAAE,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAAO,GAC1C,uBAAuB,CAUzB;AAED,wBAAgB,uBAAuB,CAAC,CAAC,SAAS,qBAAqB,EACrE,KAAK,EAAE,CAAC,EACR,QAAQ,CAAC,EAAE,MAAM,GAChB,uBAAuB,CAAC,CAAC,GAAG;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAYtD"}
@@ -1 +1 @@
1
- {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/adapters/slack/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAC7F,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,GACf,MAAM,+BAA+B,CAAC;AAYvC,MAAM,UAAU,qBAAqB,CAAC,GAAoB;IACxD,OAAO,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,oBAAoB,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;AACpG,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,UAAkB;IACrD,MAAM,QAAQ,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IAC5C,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;IACpD,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,gBAAgB,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,UAAkB;IACxD,OAAO,oBAAoB,CAAC,UAAU,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,SAAiB,EAAE,QAAiB;IACzE,MAAM,UAAU,GAAG,qBAAqB,CAAC;QACvC,cAAc,EAAE,SAAS;QACzB,gBAAgB,EAAE,qBAAqB,CAAC,OAAO,EAAE,SAAS,CAAC;QAC3D,SAAS,EAAE,SAAS;QACpB,QAAQ;QACR,kBAAkB,EAAE,IAAI;QACxB,kBAAkB,EAAE,IAAI;KACzB,CAAC,CAAC;IACH,OAAO,qBAAqB,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,gBAAgB,CAAC,EAAsB;IAC9C,OAAO,OAAO,EAAE,KAAK,QAAQ,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,KAAsD;IAEtD,OAAO,KAAK,CAAC,SAAS,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,KAA4B,EAC5B,OAAO,GAAkC,EAAE;IAE3C,MAAM,UAAU,GACd,KAAK,CAAC,UAAU,IAAI,sBAAsB,CAAC,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAE5F,OAAO;QACL,UAAU;QACV,MAAM,EAAE,OAAO,CAAC,gBAAgB,IAAI,0BAA0B,CAAC,KAAK,CAAC;QACrE,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;QAC1C,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS;KAC9B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,KAAQ,EACR,QAAiB;IAEjB,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACjC,OAAO,EAAE,KAAK,EAAE,CAAC;IACnB,CAAC;IAED,OAAO;QACL,KAAK,EAAE;YACL,GAAG,KAAK;YACR,UAAU,EAAE,sBAAsB,CAAC,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE,QAAQ,CAAC;SAC3E;QACD,gBAAgB,EAAE,QAAQ;KAC3B,CAAC;AACJ,CAAC","sourcesContent":["import { inferConversationKind, resolveChatSessionKey } from \"../../sessions/session-key.js\";\nimport {\n conversationIdOf,\n makeThreadSessionKey,\n threadSuffixOf,\n} from \"../../sessions/session-key.js\";\nexport type { SlackAdapterSessionPlan, SlackEventAnchorRunPlan, SlackSessionRef } from \"./types.js\";\nimport type { OfficeAddress } from \"../../types.js\";\nimport type { SlackAdapterSessionPlan, SlackEventAnchorRunPlan, SlackSessionRef } from \"./types.js\";\n\ninterface SlackSessionEventLike {\n address: OfficeAddress;\n ts: string;\n thread_ts?: string;\n sessionKey?: string;\n}\n\nexport function formatSlackSessionKey(ref: SlackSessionRef): string {\n return ref.kind === \"channel\" ? ref.channelId : makeThreadSessionKey(ref.channelId, ref.threadTs);\n}\n\nexport function parseSlackSessionKey(sessionKey: string): SlackSessionRef {\n const threadTs = threadSuffixOf(sessionKey);\n if (threadTs === null) {\n return { kind: \"channel\", channelId: sessionKey };\n }\n return { kind: \"thread\", channelId: conversationIdOf(sessionKey), threadTs };\n}\n\nexport function isSlackThreadSessionKey(sessionKey: string): boolean {\n return parseSlackSessionKey(sessionKey).kind === \"thread\";\n}\n\nexport function resolveSlackSessionKey(channelId: string, threadTs?: string): string {\n const sessionKey = resolveChatSessionKey({\n conversationId: channelId,\n conversationKind: inferConversationKind(\"slack\", channelId),\n messageId: channelId,\n threadTs,\n persistentTopLevel: true,\n scopeDirectThreads: true,\n });\n return formatSlackSessionKey(parseSlackSessionKey(sessionKey));\n}\n\nfunction isSlackMessageTs(ts: string | undefined): ts is string {\n return typeof ts === \"string\" && /^\\d+\\.\\d+$/.test(ts);\n}\n\nexport function resolveSlackResponseRootTs(\n event: Pick<SlackSessionEventLike, \"ts\" | \"thread_ts\">,\n): string | undefined {\n return event.thread_ts ?? (isSlackMessageTs(event.ts) ? event.ts : undefined);\n}\n\nexport function planSlackAdapterSession(\n event: SlackSessionEventLike,\n options: { initialMessageTs?: string } = {},\n): SlackAdapterSessionPlan {\n const sessionKey =\n event.sessionKey ?? resolveSlackSessionKey(event.address.conversationId, event.thread_ts);\n\n return {\n sessionKey,\n rootTs: options.initialMessageTs ?? resolveSlackResponseRootTs(event),\n initialMessageTs: options.initialMessageTs,\n isThreaded: !!event.thread_ts,\n };\n}\n\nexport function planSlackEventAnchorRun<T extends SlackSessionEventLike>(\n event: T,\n anchorTs?: string,\n): SlackEventAnchorRunPlan<T & { sessionKey?: string }> {\n if (!anchorTs || event.thread_ts) {\n return { event };\n }\n\n return {\n event: {\n ...event,\n sessionKey: resolveSlackSessionKey(event.address.conversationId, anchorTs),\n },\n initialMessageTs: anchorTs,\n };\n}\n"]}
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/adapters/slack/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAC7F,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,GACf,MAAM,+BAA+B,CAAC;AAWvC,MAAM,UAAU,qBAAqB,CAAC,GAAoB;IACxD,OAAO,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,oBAAoB,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;AACpG,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,UAAkB;IACrD,MAAM,QAAQ,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IAC5C,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;IACpD,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,gBAAgB,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,UAAkB;IACxD,OAAO,oBAAoB,CAAC,UAAU,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,SAAiB,EAAE,QAAiB;IACzE,MAAM,UAAU,GAAG,qBAAqB,CAAC;QACvC,cAAc,EAAE,SAAS;QACzB,gBAAgB,EAAE,qBAAqB,CAAC,OAAO,EAAE,SAAS,CAAC;QAC3D,SAAS,EAAE,SAAS;QACpB,QAAQ;QACR,kBAAkB,EAAE,IAAI;QACxB,kBAAkB,EAAE,IAAI;KACzB,CAAC,CAAC;IACH,OAAO,qBAAqB,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,gBAAgB,CAAC,EAAsB;IAC9C,OAAO,OAAO,EAAE,KAAK,QAAQ,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,KAAsD;IAEtD,OAAO,KAAK,CAAC,SAAS,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,KAA4B,EAC5B,OAAO,GAAkC,EAAE;IAE3C,MAAM,UAAU,GACd,KAAK,CAAC,UAAU,IAAI,sBAAsB,CAAC,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAE5F,OAAO;QACL,UAAU;QACV,MAAM,EAAE,OAAO,CAAC,gBAAgB,IAAI,0BAA0B,CAAC,KAAK,CAAC;QACrE,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;QAC1C,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS;KAC9B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,KAAQ,EACR,QAAiB;IAEjB,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACjC,OAAO,EAAE,KAAK,EAAE,CAAC;IACnB,CAAC;IAED,OAAO;QACL,KAAK,EAAE;YACL,GAAG,KAAK;YACR,UAAU,EAAE,sBAAsB,CAAC,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE,QAAQ,CAAC;SAC3E;QACD,gBAAgB,EAAE,QAAQ;KAC3B,CAAC;AACJ,CAAC","sourcesContent":["import { inferConversationKind, resolveChatSessionKey } from \"../../sessions/session-key.js\";\nimport {\n conversationIdOf,\n makeThreadSessionKey,\n threadSuffixOf,\n} from \"../../sessions/session-key.js\";\nimport type { OfficeAddress } from \"../../types.js\";\nimport type { SlackAdapterSessionPlan, SlackEventAnchorRunPlan, SlackSessionRef } from \"./types.js\";\n\ninterface SlackSessionEventLike {\n address: OfficeAddress;\n ts: string;\n thread_ts?: string;\n sessionKey?: string;\n}\n\nexport function formatSlackSessionKey(ref: SlackSessionRef): string {\n return ref.kind === \"channel\" ? ref.channelId : makeThreadSessionKey(ref.channelId, ref.threadTs);\n}\n\nexport function parseSlackSessionKey(sessionKey: string): SlackSessionRef {\n const threadTs = threadSuffixOf(sessionKey);\n if (threadTs === null) {\n return { kind: \"channel\", channelId: sessionKey };\n }\n return { kind: \"thread\", channelId: conversationIdOf(sessionKey), threadTs };\n}\n\nexport function isSlackThreadSessionKey(sessionKey: string): boolean {\n return parseSlackSessionKey(sessionKey).kind === \"thread\";\n}\n\nexport function resolveSlackSessionKey(channelId: string, threadTs?: string): string {\n const sessionKey = resolveChatSessionKey({\n conversationId: channelId,\n conversationKind: inferConversationKind(\"slack\", channelId),\n messageId: channelId,\n threadTs,\n persistentTopLevel: true,\n scopeDirectThreads: true,\n });\n return formatSlackSessionKey(parseSlackSessionKey(sessionKey));\n}\n\nfunction isSlackMessageTs(ts: string | undefined): ts is string {\n return typeof ts === \"string\" && /^\\d+\\.\\d+$/.test(ts);\n}\n\nexport function resolveSlackResponseRootTs(\n event: Pick<SlackSessionEventLike, \"ts\" | \"thread_ts\">,\n): string | undefined {\n return event.thread_ts ?? (isSlackMessageTs(event.ts) ? event.ts : undefined);\n}\n\nexport function planSlackAdapterSession(\n event: SlackSessionEventLike,\n options: { initialMessageTs?: string } = {},\n): SlackAdapterSessionPlan {\n const sessionKey =\n event.sessionKey ?? resolveSlackSessionKey(event.address.conversationId, event.thread_ts);\n\n return {\n sessionKey,\n rootTs: options.initialMessageTs ?? resolveSlackResponseRootTs(event),\n initialMessageTs: options.initialMessageTs,\n isThreaded: !!event.thread_ts,\n };\n}\n\nexport function planSlackEventAnchorRun<T extends SlackSessionEventLike>(\n event: T,\n anchorTs?: string,\n): SlackEventAnchorRunPlan<T & { sessionKey?: string }> {\n if (!anchorTs || event.thread_ts) {\n return { event };\n }\n\n return {\n event: {\n ...event,\n sessionKey: resolveSlackSessionKey(event.address.conversationId, anchorTs),\n },\n initialMessageTs: anchorTs,\n };\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { evaluateWithJev, JevNotConfiguredError } from "../../harness/index.js";
1
+ import { evaluateWithJev, JevNotConfiguredError } from "../../harness/jev.js";
2
2
  import { reportUserFacingError } from "../../observability/index.js";
3
3
  import * as log from "../../log.js";
4
4
  import { formatRecentScope, humanizeMentions, readRecentScope, } from "./jev-context.js";
@@ -1 +1 @@
1
- {"version":3,"file":"task-intent.js","sourceRoot":"","sources":["../../../src/adapters/slack/task-intent.ts"],"names":[],"mappings":"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","sourcesContent":["import { evaluateWithJev, JevNotConfiguredError } from \"../../harness/index.js\";\nimport { reportUserFacingError } from \"../../observability/index.js\";\nimport * as log from \"../../log.js\";\nimport type { TaskStatus } from \"../../types.js\";\nimport {\n formatRecentScope,\n humanizeMentions,\n readRecentScope,\n type SlackNameResolver,\n} from \"./jev-context.js\";\nimport { isTaskStatusQuestion } from \"./task-status.js\";\n\nexport type TaskIntent = \"status\" | \"steer\" | \"request\";\n\nconst TASK_INTENT_CRITERIA = {\n status:\n \"Only asks whether the ongoing work is done, how it is going, what step it is on, or how long it will take. Contains no new instruction, constraint, correction, or request for content.\",\n steer:\n \"Adds information, a constraint, a correction, or a change of direction for the ongoing work while it continues (e.g. 先不要部署, also check the staging config, use the other branch). May be combined with a progress question.\",\n request:\n \"A new standalone question or request unrelated to steering the ongoing work, a reaction to a finished result, or anything else.\",\n} as const;\n\nexport function buildTaskIntentState(\n conversationDir: string,\n event: { ts: string; thread_ts?: string; user: string; text: string },\n options: {\n speaker?: string;\n tasks: TaskStatus[];\n resolveName?: SlackNameResolver;\n botUserId?: string | null;\n },\n): string {\n const resolve = options.resolveName ?? (() => undefined);\n const humanize = (text: string) => humanizeMentions(text, resolve, options.botUserId ?? null);\n const recent = readRecentScope(conversationDir, event, { humanize });\n const tasks = options.tasks.length\n ? options.tasks\n .map(\n (t) =>\n `- ${t.status}${t.currentTool ? ` (currently: ${t.currentTool})` : \"\"}: ${t.acknowledgement}`,\n )\n .join(\"\\n\")\n : \"(none)\";\n return [\n event.thread_ts\n ? \"Slack DM reply inside a background task thread.\"\n : \"Slack DM top-level message while background tasks exist.\",\n \"\",\n \"Tasks in this DM (most recent first):\",\n tasks,\n \"\",\n \"Recent messages in this scope (oldest first):\",\n formatRecentScope(recent),\n \"\",\n `NEW message from ${options.speaker ?? event.user}:`,\n humanize(event.text),\n ].join(\"\\n\");\n}\n\nexport async function classifyTaskIntent(\n state: string,\n text: string,\n context: { conversationId: string; inTaskThread: boolean },\n): Promise<TaskIntent> {\n const fallback = (): TaskIntent =>\n isTaskStatusQuestion(text) ? \"status\" : context.inTaskThread ? \"steer\" : \"request\";\n try {\n const result = await evaluateWithJev(\n state,\n {\n intent: {\n type: \"choice\",\n instructions:\n \"Given the tasks in play and the recent conversation, what does the NEW message mean?\",\n criteria: TASK_INTENT_CRITERIA,\n },\n },\n { caller: \"task_intent\" },\n );\n const choice = result.answers.intent.choice;\n const probabilities = result.answers.intent.probabilities;\n log.logInfo(\n `[${context.conversationId}] jev task intent: ${choice}${\n probabilities ? ` ${JSON.stringify(probabilities)}` : \"\"\n } text=\"${text.slice(0, 80)}\"`,\n );\n if (choice === \"status\" || choice === \"steer\" || choice === \"request\") return choice;\n return fallback();\n } catch (err) {\n if (!(err instanceof JevNotConfiguredError)) {\n reportUserFacingError(err, {\n domain: \"chat_platform\",\n surface: \"slack_task_intent_jev\",\n operation: \"evaluate\",\n severity: \"warning\",\n context: { conversationId: context.conversationId },\n });\n }\n return fallback();\n }\n}\n"]}
1
+ {"version":3,"file":"task-intent.js","sourceRoot":"","sources":["../../../src/adapters/slack/task-intent.ts"],"names":[],"mappings":"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","sourcesContent":["import { evaluateWithJev, JevNotConfiguredError } from \"../../harness/jev.js\";\nimport { reportUserFacingError } from \"../../observability/index.js\";\nimport * as log from \"../../log.js\";\nimport type { TaskStatus } from \"../../types.js\";\nimport {\n formatRecentScope,\n humanizeMentions,\n readRecentScope,\n type SlackNameResolver,\n} from \"./jev-context.js\";\nimport { isTaskStatusQuestion } from \"./task-status.js\";\n\nexport type TaskIntent = \"status\" | \"steer\" | \"request\";\n\nconst TASK_INTENT_CRITERIA = {\n status:\n \"Only asks whether the ongoing work is done, how it is going, what step it is on, or how long it will take. Contains no new instruction, constraint, correction, or request for content.\",\n steer:\n \"Adds information, a constraint, a correction, or a change of direction for the ongoing work while it continues (e.g. 先不要部署, also check the staging config, use the other branch). May be combined with a progress question.\",\n request:\n \"A new standalone question or request unrelated to steering the ongoing work, a reaction to a finished result, or anything else.\",\n} as const;\n\nexport function buildTaskIntentState(\n conversationDir: string,\n event: { ts: string; thread_ts?: string; user: string; text: string },\n options: {\n speaker?: string;\n tasks: TaskStatus[];\n resolveName?: SlackNameResolver;\n botUserId?: string | null;\n },\n): string {\n const resolve = options.resolveName ?? (() => undefined);\n const humanize = (text: string) => humanizeMentions(text, resolve, options.botUserId ?? null);\n const recent = readRecentScope(conversationDir, event, { humanize });\n const tasks = options.tasks.length\n ? options.tasks\n .map(\n (t) =>\n `- ${t.status}${t.currentTool ? ` (currently: ${t.currentTool})` : \"\"}: ${t.acknowledgement}`,\n )\n .join(\"\\n\")\n : \"(none)\";\n return [\n event.thread_ts\n ? \"Slack DM reply inside a background task thread.\"\n : \"Slack DM top-level message while background tasks exist.\",\n \"\",\n \"Tasks in this DM (most recent first):\",\n tasks,\n \"\",\n \"Recent messages in this scope (oldest first):\",\n formatRecentScope(recent),\n \"\",\n `NEW message from ${options.speaker ?? event.user}:`,\n humanize(event.text),\n ].join(\"\\n\");\n}\n\nexport async function classifyTaskIntent(\n state: string,\n text: string,\n context: { conversationId: string; inTaskThread: boolean },\n): Promise<TaskIntent> {\n const fallback = (): TaskIntent =>\n isTaskStatusQuestion(text) ? \"status\" : context.inTaskThread ? \"steer\" : \"request\";\n try {\n const result = await evaluateWithJev(\n state,\n {\n intent: {\n type: \"choice\",\n instructions:\n \"Given the tasks in play and the recent conversation, what does the NEW message mean?\",\n criteria: TASK_INTENT_CRITERIA,\n },\n },\n { caller: \"task_intent\" },\n );\n const choice = result.answers.intent.choice;\n const probabilities = result.answers.intent.probabilities;\n log.logInfo(\n `[${context.conversationId}] jev task intent: ${choice}${\n probabilities ? ` ${JSON.stringify(probabilities)}` : \"\"\n } text=\"${text.slice(0, 80)}\"`,\n );\n if (choice === \"status\" || choice === \"steer\" || choice === \"request\") return choice;\n return fallback();\n } catch (err) {\n if (!(err instanceof JevNotConfiguredError)) {\n reportUserFacingError(err, {\n domain: \"chat_platform\",\n surface: \"slack_task_intent_jev\",\n operation: \"evaluate\",\n severity: \"warning\",\n context: { conversationId: context.conversationId },\n });\n }\n return fallback();\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"task-status.d.ts","sourceRoot":"","sources":["../../../src/adapters/slack/task-status.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEjE,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAI1D;AAED,wBAAgB,aAAa,CAAC,eAAe,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAW1E;AAED,wBAAsB,eAAe,CACnC,eAAe,EAAE,MAAM,EACvB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,cAAc,EAAE,EACzB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,UAAU,EAAE,CAAC,CAmDvB;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,MAAM,CAwB5D"}
1
+ {"version":3,"file":"task-status.d.ts","sourceRoot":"","sources":["../../../src/adapters/slack/task-status.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEjE,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAI1D;AAED,wBAAgB,aAAa,CAAC,eAAe,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAW1E;AAED,wBAAsB,eAAe,CACnC,eAAe,EAAE,MAAM,EACvB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,cAAc,EAAE,EACzB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,UAAU,EAAE,CAAC,CAmDvB;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,MAAM,CAwB5D"}
@@ -1,5 +1,6 @@
1
1
  import { readTextFileIfExists } from "../../file-guards.js";
2
2
  import { join } from "node:path";
3
+ import { OFFICE_LOG_FILENAME } from "../../office/index.js";
3
4
  import { resolveSlackSessionKey } from "./session.js";
4
5
  import { getThreadSessionFile } from "../../sessions/store.js";
5
6
  import { reportUserFacingError } from "../../observability/index.js";
@@ -8,7 +9,7 @@ export function isTaskStatusQuestion(text) {
8
9
  return /^(好了嗎|完成了嗎|有進展嗎|現在做到哪了|進度如何|還要多久|還要多久啊|現在怎麼樣|怎麼樣了|how(?:'s| is) it going|are you done|any updates|status)[??!!。\s]*$/i.test(text.trim());
9
10
  }
10
11
  export function readTaskRoots(conversationDir) {
11
- const raw = readTextFileIfExists(join(conversationDir, "log.jsonl")) ?? "";
12
+ const raw = readTextFileIfExists(join(conversationDir, OFFICE_LOG_FILENAME)) ?? "";
12
13
  const roots = new Map();
13
14
  for (const line of raw.split("\n")) {
14
15
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"task-status.js","sourceRoot":"","sources":["../../../src/adapters/slack/task-status.ts"],"names":[],"mappings":"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","sourcesContent":["import { readTextFileIfExists } from \"../../file-guards.js\";\nimport { join } from \"node:path\";\nimport { resolveSlackSessionKey } from \"./session.js\";\nimport { getThreadSessionFile } from \"../../sessions/store.js\";\nimport { reportUserFacingError } from \"../../observability/index.js\";\nimport { SessionStore } from \"../../sessions/session-store.js\";\nimport type { TaskStatus, RunningSession } from \"../../types.js\";\n\nexport function isTaskStatusQuestion(text: string): boolean {\n return /^(好了嗎|完成了嗎|有進展嗎|現在做到哪了|進度如何|還要多久|還要多久啊|現在怎麼樣|怎麼樣了|how(?:'s| is) it going|are you done|any updates|status)[??!!。\\s]*$/i.test(\n text.trim(),\n );\n}\n\nexport function readTaskRoots(conversationDir: string): Map<string, string> {\n const raw = readTextFileIfExists(join(conversationDir, \"log.jsonl\")) ?? \"\";\n const roots = new Map<string, string>();\n for (const line of raw.split(\"\\n\")) {\n try {\n const entry = JSON.parse(line);\n if (entry.taskRoot === true && entry.isMessagingBot === true && typeof entry.ts === \"string\")\n roots.set(entry.ts, String(entry.text ?? \"\"));\n } catch {}\n }\n return roots;\n}\n\nexport async function querySlackTasks(\n conversationDir: string,\n channel: string,\n running: RunningSession[],\n sessionKey?: string,\n): Promise<TaskStatus[]> {\n const roots = readTaskRoots(conversationDir);\n const matching = [...roots]\n .toReversed()\n .filter(([root]) => !sessionKey || resolveSlackSessionKey(channel, root) === sessionKey);\n const activeByKey = new Map(\n running\n .filter((s) => s.address.platform === \"slack\" && s.address.conversationId === channel)\n .map((s) => [s.sessionKey, s]),\n );\n const selected = matching.filter(\n ([root], index) => index < 10 || activeByKey.has(resolveSlackSessionKey(channel, root)),\n );\n const observations: TaskStatus[] = [];\n for (const [root, acknowledgement] of selected) {\n const key = resolveSlackSessionKey(channel, root);\n const active = activeByKey.get(key);\n const observation: TaskStatus = {\n sessionKey: key,\n threadTs: root,\n acknowledgement,\n observedAt: new Date().toISOString(),\n status: \"unknown\",\n };\n if (active) {\n observation.status = active.stopping ? \"stopping\" : \"running\";\n observation.currentTool = active.currentTool;\n observations.push(observation);\n continue;\n }\n try {\n const state = await SessionStore.inspectExecution(getThreadSessionFile(conversationDir, key));\n if (!state.open && state.result) {\n observation.status = state.result.status;\n observation.endedAt = new Date(state.result.endedAt).toISOString();\n } else if (!state.started) {\n observation.status = \"queued\";\n }\n } catch (error) {\n reportUserFacingError(error, {\n domain: \"mikan\",\n surface: \"task_status\",\n operation: \"inspect_task_status\",\n severity: \"warning\",\n platform: \"slack\",\n context: { conversationId: channel, sessionKey: key, threadTs: root },\n });\n }\n observations.push(observation);\n }\n return observations;\n}\n\nexport function formatTaskStatus(tasks: TaskStatus[]): string {\n if (!tasks.length) return \"找不到這個任務的狀態。\";\n return tasks\n .map((task) => {\n switch (task.status) {\n case \"running\":\n return `還在處理${task.currentTool ? `,目前正在:${task.currentTool}` : \"\"}。目前無法可靠估計還要多久,結束後會通知你。`;\n case \"completed\":\n return \"這一輪執行已結束。這是執行狀態,不代表結果訊息已成功送達;請查看任務對話串。\";\n case \"aborted\":\n return \"這一輪已停止,不會自行繼續。你可以補充新要求後再繼續。\";\n case \"failed\":\n return \"這一輪執行失敗。\";\n case \"queued\":\n return \"任務尚未開始執行。\";\n case \"declined\":\n return \"這一輪沒有執行。\";\n case \"stopping\":\n return \"正在停止,還在等待執行收尾。\";\n default:\n return \"目前無法確認任務狀態,不能判定已完成。\";\n }\n })\n .join(\"\\n\\n\");\n}\n"]}
1
+ {"version":3,"file":"task-status.js","sourceRoot":"","sources":["../../../src/adapters/slack/task-status.ts"],"names":[],"mappings":"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","sourcesContent":["import { readTextFileIfExists } from \"../../file-guards.js\";\nimport { join } from \"node:path\";\nimport { OFFICE_LOG_FILENAME } from \"../../office/index.js\";\nimport { resolveSlackSessionKey } from \"./session.js\";\nimport { getThreadSessionFile } from \"../../sessions/store.js\";\nimport { reportUserFacingError } from \"../../observability/index.js\";\nimport { SessionStore } from \"../../sessions/session-store.js\";\nimport type { TaskStatus, RunningSession } from \"../../types.js\";\n\nexport function isTaskStatusQuestion(text: string): boolean {\n return /^(好了嗎|完成了嗎|有進展嗎|現在做到哪了|進度如何|還要多久|還要多久啊|現在怎麼樣|怎麼樣了|how(?:'s| is) it going|are you done|any updates|status)[??!!。\\s]*$/i.test(\n text.trim(),\n );\n}\n\nexport function readTaskRoots(conversationDir: string): Map<string, string> {\n const raw = readTextFileIfExists(join(conversationDir, OFFICE_LOG_FILENAME)) ?? \"\";\n const roots = new Map<string, string>();\n for (const line of raw.split(\"\\n\")) {\n try {\n const entry = JSON.parse(line);\n if (entry.taskRoot === true && entry.isMessagingBot === true && typeof entry.ts === \"string\")\n roots.set(entry.ts, String(entry.text ?? \"\"));\n } catch {}\n }\n return roots;\n}\n\nexport async function querySlackTasks(\n conversationDir: string,\n channel: string,\n running: RunningSession[],\n sessionKey?: string,\n): Promise<TaskStatus[]> {\n const roots = readTaskRoots(conversationDir);\n const matching = [...roots]\n .toReversed()\n .filter(([root]) => !sessionKey || resolveSlackSessionKey(channel, root) === sessionKey);\n const activeByKey = new Map(\n running\n .filter((s) => s.address.platform === \"slack\" && s.address.conversationId === channel)\n .map((s) => [s.sessionKey, s]),\n );\n const selected = matching.filter(\n ([root], index) => index < 10 || activeByKey.has(resolveSlackSessionKey(channel, root)),\n );\n const observations: TaskStatus[] = [];\n for (const [root, acknowledgement] of selected) {\n const key = resolveSlackSessionKey(channel, root);\n const active = activeByKey.get(key);\n const observation: TaskStatus = {\n sessionKey: key,\n threadTs: root,\n acknowledgement,\n observedAt: new Date().toISOString(),\n status: \"unknown\",\n };\n if (active) {\n observation.status = active.stopping ? \"stopping\" : \"running\";\n observation.currentTool = active.currentTool;\n observations.push(observation);\n continue;\n }\n try {\n const state = await SessionStore.inspectExecution(getThreadSessionFile(conversationDir, key));\n if (!state.open && state.result) {\n observation.status = state.result.status;\n observation.endedAt = new Date(state.result.endedAt).toISOString();\n } else if (!state.started) {\n observation.status = \"queued\";\n }\n } catch (error) {\n reportUserFacingError(error, {\n domain: \"mikan\",\n surface: \"task_status\",\n operation: \"inspect_task_status\",\n severity: \"warning\",\n platform: \"slack\",\n context: { conversationId: channel, sessionKey: key, threadTs: root },\n });\n }\n observations.push(observation);\n }\n return observations;\n}\n\nexport function formatTaskStatus(tasks: TaskStatus[]): string {\n if (!tasks.length) return \"找不到這個任務的狀態。\";\n return tasks\n .map((task) => {\n switch (task.status) {\n case \"running\":\n return `還在處理${task.currentTool ? `,目前正在:${task.currentTool}` : \"\"}。目前無法可靠估計還要多久,結束後會通知你。`;\n case \"completed\":\n return \"這一輪執行已結束。這是執行狀態,不代表結果訊息已成功送達;請查看任務對話串。\";\n case \"aborted\":\n return \"這一輪已停止,不會自行繼續。你可以補充新要求後再繼續。\";\n case \"failed\":\n return \"這一輪執行失敗。\";\n case \"queued\":\n return \"任務尚未開始執行。\";\n case \"declined\":\n return \"這一輪沒有執行。\";\n case \"stopping\":\n return \"正在停止,還在等待執行收尾。\";\n default:\n return \"目前無法確認任務狀態,不能判定已完成。\";\n }\n })\n .join(\"\\n\\n\");\n}\n"]}
@@ -1,5 +1,4 @@
1
1
  import type { PlatformToolPack } from "../../harness/tools/types.js";
2
- export type { PlatformSlackOps } from "./types.js";
3
2
  import type { PlatformSlackOps } from "./types.js";
4
3
  export declare function createSlackToolPack(ops: PlatformSlackOps): PlatformToolPack;
5
4
  //# sourceMappingURL=tool-pack.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tool-pack.d.ts","sourceRoot":"","sources":["../../../src/adapters/slack/tool-pack.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAErE,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,gBAAgB,GAAG,gBAAgB,CAuC3E"}
1
+ {"version":3,"file":"tool-pack.d.ts","sourceRoot":"","sources":["../../../src/adapters/slack/tool-pack.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAErE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,gBAAgB,GAAG,gBAAgB,CAwC3E"}
@@ -1,10 +1,11 @@
1
- import { createSlackBlockKitTool } from "./tools/blockkit.js";
1
+ import { createSlackBlockKitTool, SLACK_BLOCKKIT_TOOL } from "./tools/blockkit.js";
2
2
  export function createSlackToolPack(ops) {
3
3
  const { tool: blockkitTool, setSlackBlockKitOps } = createSlackBlockKitTool();
4
4
  const ownedMessageTs = new Set();
5
5
  let boundTarget;
6
6
  return {
7
7
  tools: [blockkitTool],
8
+ finalResponseTools: [SLACK_BLOCKKIT_TOOL],
8
9
  bindRun({ conversationId, platformName, threadTs }) {
9
10
  if (platformName !== "slack") {
10
11
  setSlackBlockKitOps(null);
@@ -1 +1 @@
1
- {"version":3,"file":"tool-pack.js","sourceRoot":"","sources":["../../../src/adapters/slack/tool-pack.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAI9D,MAAM,UAAU,mBAAmB,CAAC,GAAqB;IACvD,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,mBAAmB,EAAE,GAAG,uBAAuB,EAAE,CAAC;IAC9E,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IACzC,IAAI,WAA+B,CAAC;IAEpC,OAAO;QACL,KAAK,EAAE,CAAC,YAAY,CAAC;QACrB,OAAO,CAAC,EAAE,cAAc,EAAE,YAAY,EAAE,QAAQ,EAAE;YAChD,IAAI,YAAY,KAAK,OAAO,EAAE,CAAC;gBAC7B,mBAAmB,CAAC,IAAI,CAAC,CAAC;gBAC1B,OAAO;YACT,CAAC;YACD,MAAM,MAAM,GAAG,GAAG,cAAc,IAAI,QAAQ,IAAI,WAAW,EAAE,CAAC;YAC9D,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;gBAC3B,cAAc,CAAC,KAAK,EAAE,CAAC;gBACvB,WAAW,GAAG,MAAM,CAAC;YACvB,CAAC;YACD,mBAAmB,CAAC;gBAClB,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;oBACzB,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;wBAC9D,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;oBACvF,CAAC;oBACD,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,cAAc,EAAE,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;oBAC3E,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;oBAC9B,OAAO,MAAM,CAAC;gBAChB,CAAC;gBACD,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;oBAC3B,IACE,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;wBAC5B,CAAC,GAAG,CAAC,mBAAmB,CAAC,cAAc,EAAE,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC,EAC3D,CAAC;wBACD,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;oBACjF,CAAC;oBACD,MAAM,GAAG,CAAC,YAAY,CAAC,cAAc,EAAE,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;oBAC9D,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC9B,CAAC;aACF,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["import type { PlatformToolPack } from \"../../harness/tools/types.js\";\nimport { createSlackBlockKitTool } from \"./tools/blockkit.js\";\nexport type { PlatformSlackOps } from \"./types.js\";\nimport type { PlatformSlackOps } from \"./types.js\";\n\nexport function createSlackToolPack(ops: PlatformSlackOps): PlatformToolPack {\n const { tool: blockkitTool, setSlackBlockKitOps } = createSlackBlockKitTool();\n const ownedMessageTs = new Set<string>();\n let boundTarget: string | undefined;\n\n return {\n tools: [blockkitTool],\n bindRun({ conversationId, platformName, threadTs }) {\n if (platformName !== \"slack\") {\n setSlackBlockKitOps(null);\n return;\n }\n const target = `${conversationId}:${threadTs ?? \"top-level\"}`;\n if (boundTarget !== target) {\n ownedMessageTs.clear();\n boundTarget = target;\n }\n setSlackBlockKitOps({\n postBlocks: async (args) => {\n if (args.threadTs !== undefined && args.threadTs !== threadTs) {\n throw new Error(\"slack_blockkit cannot post outside the active conversation thread\");\n }\n const result = await ops.postBlocks(conversationId, { ...args, threadTs });\n ownedMessageTs.add(result.ts);\n return result;\n },\n updateBlocks: async (args) => {\n if (\n !ownedMessageTs.has(args.ts) &&\n !ops.ownsBlockKitMessage(conversationId, args.ts, threadTs)\n ) {\n throw new Error(\"slack_blockkit can only update messages posted by this tool\");\n }\n await ops.updateBlocks(conversationId, { ...args, threadTs });\n ownedMessageTs.add(args.ts);\n },\n });\n },\n };\n}\n"]}
1
+ {"version":3,"file":"tool-pack.js","sourceRoot":"","sources":["../../../src/adapters/slack/tool-pack.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAGnF,MAAM,UAAU,mBAAmB,CAAC,GAAqB;IACvD,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,mBAAmB,EAAE,GAAG,uBAAuB,EAAE,CAAC;IAC9E,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IACzC,IAAI,WAA+B,CAAC;IAEpC,OAAO;QACL,KAAK,EAAE,CAAC,YAAY,CAAC;QACrB,kBAAkB,EAAE,CAAC,mBAAmB,CAAC;QACzC,OAAO,CAAC,EAAE,cAAc,EAAE,YAAY,EAAE,QAAQ,EAAE;YAChD,IAAI,YAAY,KAAK,OAAO,EAAE,CAAC;gBAC7B,mBAAmB,CAAC,IAAI,CAAC,CAAC;gBAC1B,OAAO;YACT,CAAC;YACD,MAAM,MAAM,GAAG,GAAG,cAAc,IAAI,QAAQ,IAAI,WAAW,EAAE,CAAC;YAC9D,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;gBAC3B,cAAc,CAAC,KAAK,EAAE,CAAC;gBACvB,WAAW,GAAG,MAAM,CAAC;YACvB,CAAC;YACD,mBAAmB,CAAC;gBAClB,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;oBACzB,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;wBAC9D,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;oBACvF,CAAC;oBACD,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,cAAc,EAAE,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;oBAC3E,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;oBAC9B,OAAO,MAAM,CAAC;gBAChB,CAAC;gBACD,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;oBAC3B,IACE,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;wBAC5B,CAAC,GAAG,CAAC,mBAAmB,CAAC,cAAc,EAAE,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC,EAC3D,CAAC;wBACD,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;oBACjF,CAAC;oBACD,MAAM,GAAG,CAAC,YAAY,CAAC,cAAc,EAAE,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;oBAC9D,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC9B,CAAC;aACF,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["import type { PlatformToolPack } from \"../../harness/tools/types.js\";\nimport { createSlackBlockKitTool, SLACK_BLOCKKIT_TOOL } from \"./tools/blockkit.js\";\nimport type { PlatformSlackOps } from \"./types.js\";\n\nexport function createSlackToolPack(ops: PlatformSlackOps): PlatformToolPack {\n const { tool: blockkitTool, setSlackBlockKitOps } = createSlackBlockKitTool();\n const ownedMessageTs = new Set<string>();\n let boundTarget: string | undefined;\n\n return {\n tools: [blockkitTool],\n finalResponseTools: [SLACK_BLOCKKIT_TOOL],\n bindRun({ conversationId, platformName, threadTs }) {\n if (platformName !== \"slack\") {\n setSlackBlockKitOps(null);\n return;\n }\n const target = `${conversationId}:${threadTs ?? \"top-level\"}`;\n if (boundTarget !== target) {\n ownedMessageTs.clear();\n boundTarget = target;\n }\n setSlackBlockKitOps({\n postBlocks: async (args) => {\n if (args.threadTs !== undefined && args.threadTs !== threadTs) {\n throw new Error(\"slack_blockkit cannot post outside the active conversation thread\");\n }\n const result = await ops.postBlocks(conversationId, { ...args, threadTs });\n ownedMessageTs.add(result.ts);\n return result;\n },\n updateBlocks: async (args) => {\n if (\n !ownedMessageTs.has(args.ts) &&\n !ops.ownsBlockKitMessage(conversationId, args.ts, threadTs)\n ) {\n throw new Error(\"slack_blockkit can only update messages posted by this tool\");\n }\n await ops.updateBlocks(conversationId, { ...args, threadTs });\n ownedMessageTs.add(args.ts);\n },\n });\n },\n };\n}\n"]}
@@ -1,15 +1,17 @@
1
1
  import type { AgentTool } from "@earendil-works/pi-agent-core";
2
- export type { SlackBlockKitOps } from "../types.js";
2
+ import { Type } from "typebox";
3
3
  import type { SlackBlockKitOps } from "../types.js";
4
- declare const blockkitSchema: import("@sinclair/typebox").TObject<{
5
- label: import("@sinclair/typebox").TString;
6
- blocks: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TUnknown>;
7
- text: import("@sinclair/typebox").TString;
8
- thread_ts: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
9
- update_ts: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
4
+ export declare const SLACK_BLOCKKIT_TOOL = "slack_blockkit";
5
+ declare const blockkitSchema: Type.TObject<{
6
+ label: Type.TString;
7
+ blocks: Type.TArray<Type.TUnknown>;
8
+ text: Type.TString;
9
+ thread_ts: Type.TOptional<Type.TString>;
10
+ update_ts: Type.TOptional<Type.TString>;
10
11
  }>;
11
12
  export declare function createSlackBlockKitTool(): {
12
13
  tool: AgentTool<typeof blockkitSchema>;
13
14
  setSlackBlockKitOps: (ops: SlackBlockKitOps | null) => void;
14
15
  };
16
+ export {};
15
17
  //# sourceMappingURL=blockkit.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"blockkit.d.ts","sourceRoot":"","sources":["../../../../src/adapters/slack/tools/blockkit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAE/D,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAKpD,QAAA,MAAM,cAAc;;;;;;EAqBlB,CAAC;AA+BH,wBAAgB,uBAAuB,IAAI;IACzC,IAAI,EAAE,SAAS,CAAC,OAAO,cAAc,CAAC,CAAC;IACvC,mBAAmB,EAAE,CAAC,GAAG,EAAE,gBAAgB,GAAG,IAAI,KAAK,IAAI,CAAC;CAC7D,CAsEA"}
1
+ {"version":3,"file":"blockkit.d.ts","sourceRoot":"","sources":["../../../../src/adapters/slack/tools/blockkit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAe,MAAM,SAAS,CAAC;AAC5C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGpD,eAAO,MAAM,mBAAmB,mBAAmB,CAAC;AAKpD,QAAA,MAAM,cAAc;;;;;;EAqBlB,CAAC;AA+BH,wBAAgB,uBAAuB,IAAI;IACzC,IAAI,EAAE,SAAS,CAAC,OAAO,cAAc,CAAC,CAAC;IACvC,mBAAmB,EAAE,CAAC,GAAG,EAAE,gBAAgB,GAAG,IAAI,KAAK,IAAI,CAAC;CAC7D,CAsEA"}
@@ -1,8 +1,10 @@
1
- import { Type } from "@sinclair/typebox";
1
+ import { Type } from "typebox";
2
+ import { LABEL_PARAMETER } from "../../../harness/tools/host-fn-tool.js";
3
+ export const SLACK_BLOCKKIT_TOOL = "slack_blockkit";
2
4
  const MAX_BLOCKS = 50;
3
5
  const MAX_ARGUMENT_BYTES = 64 * 1024;
4
6
  const blockkitSchema = Type.Object({
5
- label: Type.String({ description: "Brief description of this action (shown to user)" }),
7
+ label: LABEL_PARAMETER,
6
8
  blocks: Type.Array(Type.Unknown(), {
7
9
  maxItems: MAX_BLOCKS,
8
10
  description: `Slack Block Kit blocks (max ${MAX_BLOCKS}). Use {type:'markdown', text} for prose, {type:'table'} for tables, and actions/section blocks for buttons and select menus.`,
@@ -43,8 +45,8 @@ function formatSlackApiError(err) {
43
45
  export function createSlackBlockKitTool() {
44
46
  let boundOps = null;
45
47
  const tool = {
46
- name: "slack_blockkit",
47
- label: "slack_blockkit",
48
+ name: SLACK_BLOCKKIT_TOOL,
49
+ label: SLACK_BLOCKKIT_TOOL,
48
50
  description: "Post an interactive Slack Block Kit message (buttons, select menus, custom layouts) to the current conversation, or update one previously posted with this tool. Normal replies already render Markdown — use this only when you need interactive elements or a layout Markdown cannot express. When a user clicks a button or picks an option, you receive a new message '[Slack action] <action_id>: <value>' — choose descriptive action_ids and values so the interaction tells you what to do. Returns the message ts; pass it back as update_ts to edit the message later (e.g. refreshing vote tallies). After handling an interaction, update the message via update_ts to replace the buttons with the outcome (e.g. '✅ approved') — buttons stay clickable otherwise and repeated clicks re-trigger the action. If Slack rejects the blocks, the error includes its validation messages — fix the JSON and retry.",
49
51
  parameters: blockkitSchema,
50
52
  prepareArguments: guardBlockKitArguments,
@@ -1 +1 @@
1
- {"version":3,"file":"blockkit.js","sourceRoot":"","sources":["../../../../src/adapters/slack/tools/blockkit.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentTool } from \"@earendil-works/pi-agent-core\";\nimport { Type } from \"@sinclair/typebox\";\nexport type { SlackBlockKitOps } from \"../types.js\";\nimport type { SlackBlockKitOps } from \"../types.js\";\n\nconst MAX_BLOCKS = 50;\nconst MAX_ARGUMENT_BYTES = 64 * 1024;\n\nconst blockkitSchema = Type.Object({\n label: Type.String({ description: \"Brief description of this action (shown to user)\" }),\n blocks: Type.Array(Type.Unknown(), {\n maxItems: MAX_BLOCKS,\n description: `Slack Block Kit blocks (max ${MAX_BLOCKS}). Use {type:'markdown', text} for prose, {type:'table'} for tables, and actions/section blocks for buttons and select menus.`,\n }),\n text: Type.String({\n description: \"Plain-text fallback shown in notifications and screen readers\",\n }),\n thread_ts: Type.Optional(\n Type.String({\n description:\n \"Optional active-thread TS. Posts are always constrained to the current conversation thread.\",\n }),\n ),\n update_ts: Type.Optional(\n Type.String({\n description:\n \"Update a message previously posted by slack_blockkit in this conversation instead of posting a new one.\",\n }),\n ),\n});\n\nfunction guardBlockKitArguments(args: unknown): unknown {\n if (!args || typeof args !== \"object\") return args;\n const bytes = Buffer.byteLength(JSON.stringify(args) ?? \"\", \"utf-8\");\n if (bytes > MAX_ARGUMENT_BYTES) {\n throw new Error(\n `slack_blockkit arguments are ${Math.round(bytes / 1024)}KB, over the ${MAX_ARGUMENT_BYTES / 1024}KB limit. ` +\n \"Post a short message and attach the long content as a file instead.\",\n );\n }\n const blocks = (args as { blocks?: unknown }).blocks;\n if (Array.isArray(blocks) && blocks.length > MAX_BLOCKS) {\n throw new Error(`slack_blockkit accepts at most ${MAX_BLOCKS} blocks, got ${blocks.length}.`);\n }\n return args;\n}\n\nfunction formatSlackApiError(err: unknown): Error {\n const data = (\n err as { data?: { error?: string; response_metadata?: { messages?: string[] } } } | undefined\n )?.data;\n if (!data?.error) return err instanceof Error ? err : new Error(String(err));\n const details = data.response_metadata?.messages?.length\n ? `\\n${data.response_metadata.messages.join(\"\\n\")}`\n : \"\";\n return new Error(\n `Slack rejected the request: ${data.error}${details}\\nFix the blocks JSON and retry.`,\n );\n}\n\nexport function createSlackBlockKitTool(): {\n tool: AgentTool<typeof blockkitSchema>;\n setSlackBlockKitOps: (ops: SlackBlockKitOps | null) => void;\n} {\n let boundOps: SlackBlockKitOps | null = null;\n\n const tool: AgentTool<typeof blockkitSchema> = {\n name: \"slack_blockkit\",\n label: \"slack_blockkit\",\n description:\n \"Post an interactive Slack Block Kit message (buttons, select menus, custom layouts) to the current conversation, or update one previously posted with this tool. Normal replies already render Markdown — use this only when you need interactive elements or a layout Markdown cannot express. When a user clicks a button or picks an option, you receive a new message '[Slack action] <action_id>: <value>' — choose descriptive action_ids and values so the interaction tells you what to do. Returns the message ts; pass it back as update_ts to edit the message later (e.g. refreshing vote tallies). After handling an interaction, update the message via update_ts to replace the buttons with the outcome (e.g. '✅ approved') — buttons stay clickable otherwise and repeated clicks re-trigger the action. If Slack rejects the blocks, the error includes its validation messages — fix the JSON and retry.\",\n parameters: blockkitSchema,\n prepareArguments: guardBlockKitArguments as (args: unknown) => typeof blockkitSchema.static,\n execute: async (\n _toolCallId: string,\n {\n blocks,\n text,\n thread_ts,\n update_ts,\n }: {\n blocks: unknown[];\n text: string;\n thread_ts?: string;\n update_ts?: string;\n label?: string;\n },\n signal?: AbortSignal,\n ) => {\n const ops = boundOps;\n if (!ops) {\n throw new Error(\"slack_blockkit is only available in Slack conversations\");\n }\n if (signal?.aborted) {\n throw new Error(\"Operation aborted\");\n }\n\n try {\n if (update_ts) {\n await ops.updateBlocks({ ts: update_ts, text, blocks: blocks as object[] });\n return {\n content: [\n { type: \"text\" as const, text: `Updated Block Kit message (ts: ${update_ts}).` },\n ],\n details: undefined,\n };\n }\n const { ts } = await ops.postBlocks({\n text,\n blocks: blocks as object[],\n threadTs: thread_ts,\n });\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Posted Block Kit message (ts: ${ts}). Interactive elements will arrive as \"[Slack action] <action_id>: <value>\" messages; pass ts back as update_ts to edit this message.`,\n },\n ],\n details: undefined,\n };\n } catch (err) {\n throw formatSlackApiError(err);\n }\n },\n };\n\n return {\n tool,\n setSlackBlockKitOps: (ops) => {\n boundOps = ops;\n },\n };\n}\n"]}
1
+ {"version":3,"file":"blockkit.js","sourceRoot":"","sources":["../../../../src/adapters/slack/tools/blockkit.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentTool } from \"@earendil-works/pi-agent-core\";\nimport { Type, type Static } from \"typebox\";\nimport type { SlackBlockKitOps } from \"../types.js\";\nimport { LABEL_PARAMETER } from \"../../../harness/tools/host-fn-tool.js\";\n\nexport const SLACK_BLOCKKIT_TOOL = \"slack_blockkit\";\n\nconst MAX_BLOCKS = 50;\nconst MAX_ARGUMENT_BYTES = 64 * 1024;\n\nconst blockkitSchema = Type.Object({\n label: LABEL_PARAMETER,\n blocks: Type.Array(Type.Unknown(), {\n maxItems: MAX_BLOCKS,\n description: `Slack Block Kit blocks (max ${MAX_BLOCKS}). Use {type:'markdown', text} for prose, {type:'table'} for tables, and actions/section blocks for buttons and select menus.`,\n }),\n text: Type.String({\n description: \"Plain-text fallback shown in notifications and screen readers\",\n }),\n thread_ts: Type.Optional(\n Type.String({\n description:\n \"Optional active-thread TS. Posts are always constrained to the current conversation thread.\",\n }),\n ),\n update_ts: Type.Optional(\n Type.String({\n description:\n \"Update a message previously posted by slack_blockkit in this conversation instead of posting a new one.\",\n }),\n ),\n});\n\nfunction guardBlockKitArguments(args: unknown): unknown {\n if (!args || typeof args !== \"object\") return args;\n const bytes = Buffer.byteLength(JSON.stringify(args) ?? \"\", \"utf-8\");\n if (bytes > MAX_ARGUMENT_BYTES) {\n throw new Error(\n `slack_blockkit arguments are ${Math.round(bytes / 1024)}KB, over the ${MAX_ARGUMENT_BYTES / 1024}KB limit. ` +\n \"Post a short message and attach the long content as a file instead.\",\n );\n }\n const blocks = (args as { blocks?: unknown }).blocks;\n if (Array.isArray(blocks) && blocks.length > MAX_BLOCKS) {\n throw new Error(`slack_blockkit accepts at most ${MAX_BLOCKS} blocks, got ${blocks.length}.`);\n }\n return args;\n}\n\nfunction formatSlackApiError(err: unknown): Error {\n const data = (\n err as { data?: { error?: string; response_metadata?: { messages?: string[] } } } | undefined\n )?.data;\n if (!data?.error) return err instanceof Error ? err : new Error(String(err));\n const details = data.response_metadata?.messages?.length\n ? `\\n${data.response_metadata.messages.join(\"\\n\")}`\n : \"\";\n return new Error(\n `Slack rejected the request: ${data.error}${details}\\nFix the blocks JSON and retry.`,\n );\n}\n\nexport function createSlackBlockKitTool(): {\n tool: AgentTool<typeof blockkitSchema>;\n setSlackBlockKitOps: (ops: SlackBlockKitOps | null) => void;\n} {\n let boundOps: SlackBlockKitOps | null = null;\n\n const tool: AgentTool<typeof blockkitSchema> = {\n name: SLACK_BLOCKKIT_TOOL,\n label: SLACK_BLOCKKIT_TOOL,\n description:\n \"Post an interactive Slack Block Kit message (buttons, select menus, custom layouts) to the current conversation, or update one previously posted with this tool. Normal replies already render Markdown — use this only when you need interactive elements or a layout Markdown cannot express. When a user clicks a button or picks an option, you receive a new message '[Slack action] <action_id>: <value>' — choose descriptive action_ids and values so the interaction tells you what to do. Returns the message ts; pass it back as update_ts to edit the message later (e.g. refreshing vote tallies). After handling an interaction, update the message via update_ts to replace the buttons with the outcome (e.g. '✅ approved') — buttons stay clickable otherwise and repeated clicks re-trigger the action. If Slack rejects the blocks, the error includes its validation messages — fix the JSON and retry.\",\n parameters: blockkitSchema,\n prepareArguments: guardBlockKitArguments as (args: unknown) => Static<typeof blockkitSchema>,\n execute: async (\n _toolCallId: string,\n {\n blocks,\n text,\n thread_ts,\n update_ts,\n }: {\n blocks: unknown[];\n text: string;\n thread_ts?: string;\n update_ts?: string;\n label?: string;\n },\n signal?: AbortSignal,\n ) => {\n const ops = boundOps;\n if (!ops) {\n throw new Error(\"slack_blockkit is only available in Slack conversations\");\n }\n if (signal?.aborted) {\n throw new Error(\"Operation aborted\");\n }\n\n try {\n if (update_ts) {\n await ops.updateBlocks({ ts: update_ts, text, blocks: blocks as object[] });\n return {\n content: [\n { type: \"text\" as const, text: `Updated Block Kit message (ts: ${update_ts}).` },\n ],\n details: undefined,\n };\n }\n const { ts } = await ops.postBlocks({\n text,\n blocks: blocks as object[],\n threadTs: thread_ts,\n });\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Posted Block Kit message (ts: ${ts}). Interactive elements will arrive as \"[Slack action] <action_id>: <value>\" messages; pass ts back as update_ts to edit this message.`,\n },\n ],\n details: undefined,\n };\n } catch (err) {\n throw formatSlackApiError(err);\n }\n },\n };\n\n return {\n tool,\n setSlackBlockKitOps: (ops) => {\n boundOps = ops;\n },\n };\n}\n"]}