@geminixiang/mikan 0.3.2 → 0.4.0-beta.0

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 (371) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/adapter.d.ts +1 -138
  3. package/dist/adapter.d.ts.map +1 -1
  4. package/dist/adapter.js.map +1 -1
  5. package/dist/adapters/discord/bot.d.ts +1 -4
  6. package/dist/adapters/discord/bot.d.ts.map +1 -1
  7. package/dist/adapters/discord/bot.js +25 -33
  8. package/dist/adapters/discord/bot.js.map +1 -1
  9. package/dist/adapters/discord/context.d.ts.map +1 -1
  10. package/dist/adapters/discord/context.js +28 -0
  11. package/dist/adapters/discord/context.js.map +1 -1
  12. package/dist/adapters/discord/types.d.ts +6 -0
  13. package/dist/adapters/discord/types.d.ts.map +1 -0
  14. package/dist/adapters/discord/types.js +2 -0
  15. package/dist/adapters/discord/types.js.map +1 -0
  16. package/dist/adapters/intake.d.ts +11 -0
  17. package/dist/adapters/intake.d.ts.map +1 -0
  18. package/dist/adapters/intake.js +42 -0
  19. package/dist/adapters/intake.js.map +1 -0
  20. package/dist/adapters/shared.d.ts +7 -31
  21. package/dist/adapters/shared.d.ts.map +1 -1
  22. package/dist/adapters/shared.js +18 -2
  23. package/dist/adapters/shared.js.map +1 -1
  24. package/dist/adapters/slack/bot.d.ts +14 -33
  25. package/dist/adapters/slack/bot.d.ts.map +1 -1
  26. package/dist/adapters/slack/bot.js +148 -116
  27. package/dist/adapters/slack/bot.js.map +1 -1
  28. package/dist/adapters/slack/context.d.ts +3 -4
  29. package/dist/adapters/slack/context.d.ts.map +1 -1
  30. package/dist/adapters/slack/context.js +97 -14
  31. package/dist/adapters/slack/context.js.map +1 -1
  32. package/dist/adapters/slack/session.d.ts +5 -20
  33. package/dist/adapters/slack/session.d.ts.map +1 -1
  34. package/dist/adapters/slack/session.js.map +1 -1
  35. package/dist/adapters/slack/types.d.ts +84 -0
  36. package/dist/adapters/slack/types.d.ts.map +1 -0
  37. package/dist/adapters/slack/types.js +2 -0
  38. package/dist/adapters/slack/types.js.map +1 -0
  39. package/dist/adapters/streaming.d.ts +18 -0
  40. package/dist/adapters/streaming.d.ts.map +1 -0
  41. package/dist/adapters/streaming.js +44 -0
  42. package/dist/adapters/streaming.js.map +1 -0
  43. package/dist/adapters/telegram/bot.d.ts +1 -4
  44. package/dist/adapters/telegram/bot.d.ts.map +1 -1
  45. package/dist/adapters/telegram/bot.js +32 -39
  46. package/dist/adapters/telegram/bot.js.map +1 -1
  47. package/dist/adapters/telegram/context.d.ts.map +1 -1
  48. package/dist/adapters/telegram/context.js +33 -0
  49. package/dist/adapters/telegram/context.js.map +1 -1
  50. package/dist/adapters/telegram/types.d.ts +6 -0
  51. package/dist/adapters/telegram/types.d.ts.map +1 -0
  52. package/dist/adapters/telegram/types.js +2 -0
  53. package/dist/adapters/telegram/types.js.map +1 -0
  54. package/dist/adapters/types.d.ts +58 -0
  55. package/dist/adapters/types.d.ts.map +1 -0
  56. package/dist/adapters/types.js +2 -0
  57. package/dist/adapters/types.js.map +1 -0
  58. package/dist/agent.d.ts +4 -16
  59. package/dist/agent.d.ts.map +1 -1
  60. package/dist/agent.js +27 -20
  61. package/dist/agent.js.map +1 -1
  62. package/dist/commands/admin.d.ts.map +1 -1
  63. package/dist/commands/admin.js +1 -1
  64. package/dist/commands/admin.js.map +1 -1
  65. package/dist/commands/auto-reply.d.ts.map +1 -1
  66. package/dist/commands/auto-reply.js +1 -8
  67. package/dist/commands/auto-reply.js.map +1 -1
  68. package/dist/commands/login.d.ts.map +1 -1
  69. package/dist/commands/login.js +3 -3
  70. package/dist/commands/login.js.map +1 -1
  71. package/dist/commands/model.d.ts +5 -8
  72. package/dist/commands/model.d.ts.map +1 -1
  73. package/dist/commands/model.js +15 -20
  74. package/dist/commands/model.js.map +1 -1
  75. package/dist/commands/new.d.ts.map +1 -1
  76. package/dist/commands/new.js +5 -10
  77. package/dist/commands/new.js.map +1 -1
  78. package/dist/commands/parse.d.ts.map +1 -1
  79. package/dist/commands/parse.js +1 -4
  80. package/dist/commands/parse.js.map +1 -1
  81. package/dist/commands/registry.d.ts +1 -0
  82. package/dist/commands/registry.d.ts.map +1 -1
  83. package/dist/commands/registry.js +23 -0
  84. package/dist/commands/registry.js.map +1 -1
  85. package/dist/commands/sandbox.d.ts +2 -5
  86. package/dist/commands/sandbox.d.ts.map +1 -1
  87. package/dist/commands/sandbox.js +11 -16
  88. package/dist/commands/sandbox.js.map +1 -1
  89. package/dist/commands/session-view.d.ts.map +1 -1
  90. package/dist/commands/session-view.js +10 -15
  91. package/dist/commands/session-view.js.map +1 -1
  92. package/dist/commands/types.d.ts +11 -2
  93. package/dist/commands/types.d.ts.map +1 -1
  94. package/dist/commands/types.js.map +1 -1
  95. package/dist/config.d.ts +6 -28
  96. package/dist/config.d.ts.map +1 -1
  97. package/dist/config.js +43 -41
  98. package/dist/config.js.map +1 -1
  99. package/dist/context.d.ts +1 -15
  100. package/dist/context.d.ts.map +1 -1
  101. package/dist/context.js.map +1 -1
  102. package/dist/events.d.ts +3 -44
  103. package/dist/events.d.ts.map +1 -1
  104. package/dist/events.js +2 -9
  105. package/dist/events.js.map +1 -1
  106. package/dist/execution-resolver.d.ts +3 -7
  107. package/dist/execution-resolver.d.ts.map +1 -1
  108. package/dist/execution-resolver.js +8 -8
  109. package/dist/execution-resolver.js.map +1 -1
  110. package/dist/index.d.ts +3 -3
  111. package/dist/index.d.ts.map +1 -1
  112. package/dist/index.js +2 -2
  113. package/dist/index.js.map +1 -1
  114. package/dist/log.d.ts +2 -6
  115. package/dist/log.d.ts.map +1 -1
  116. package/dist/log.js +1 -37
  117. package/dist/log.js.map +1 -1
  118. package/dist/main.d.ts +1 -1
  119. package/dist/main.d.ts.map +1 -1
  120. package/dist/main.js +16 -16
  121. package/dist/main.js.map +1 -1
  122. package/dist/observability/instrument.d.ts.map +1 -0
  123. package/dist/{instrument.js → observability/instrument.js} +2 -2
  124. package/dist/observability/instrument.js.map +1 -0
  125. package/dist/{sentry.d.ts → observability/sentry.d.ts} +2 -30
  126. package/dist/observability/sentry.d.ts.map +1 -0
  127. package/dist/observability/sentry.js.map +1 -0
  128. package/dist/observability/types.d.ts +31 -0
  129. package/dist/observability/types.d.ts.map +1 -0
  130. package/dist/observability/types.js +2 -0
  131. package/dist/observability/types.js.map +1 -0
  132. package/dist/{ui-copy.d.ts → platform-messages.d.ts} +1 -1
  133. package/dist/platform-messages.d.ts.map +1 -0
  134. package/dist/{ui-copy.js → platform-messages.js} +1 -1
  135. package/dist/platform-messages.js.map +1 -0
  136. package/dist/portal-shell.d.ts +2 -28
  137. package/dist/portal-shell.d.ts.map +1 -1
  138. package/dist/portal-shell.js +2 -2
  139. package/dist/portal-shell.js.map +1 -1
  140. package/dist/provisioner.d.ts +2 -23
  141. package/dist/provisioner.d.ts.map +1 -1
  142. package/dist/provisioner.js +1 -1
  143. package/dist/provisioner.js.map +1 -1
  144. package/dist/runtime/conversation-orchestrator.d.ts +4 -19
  145. package/dist/runtime/conversation-orchestrator.d.ts.map +1 -1
  146. package/dist/runtime/conversation-orchestrator.js +3 -3
  147. package/dist/runtime/conversation-orchestrator.js.map +1 -1
  148. package/dist/runtime/session-runtime.d.ts +2 -23
  149. package/dist/runtime/session-runtime.d.ts.map +1 -1
  150. package/dist/runtime/session-runtime.js +7 -9
  151. package/dist/runtime/session-runtime.js.map +1 -1
  152. package/dist/runtime/types.d.ts +35 -0
  153. package/dist/runtime/types.d.ts.map +1 -0
  154. package/dist/runtime/types.js +2 -0
  155. package/dist/runtime/types.js.map +1 -0
  156. package/dist/sandbox/cloudflare.d.ts.map +1 -1
  157. package/dist/sandbox/cloudflare.js +1 -1
  158. package/dist/sandbox/cloudflare.js.map +1 -1
  159. package/dist/sandbox/container.d.ts.map +1 -1
  160. package/dist/sandbox/container.js +1 -4
  161. package/dist/sandbox/container.js.map +1 -1
  162. package/dist/sessions/chat-session-manager.d.ts +2 -46
  163. package/dist/sessions/chat-session-manager.d.ts.map +1 -1
  164. package/dist/sessions/chat-session-manager.js +12 -40
  165. package/dist/sessions/chat-session-manager.js.map +1 -1
  166. package/dist/sessions/metadata.d.ts +1 -13
  167. package/dist/sessions/metadata.d.ts.map +1 -1
  168. package/dist/sessions/metadata.js.map +1 -1
  169. package/dist/sessions/policy.d.ts +3 -10
  170. package/dist/sessions/policy.d.ts.map +1 -1
  171. package/dist/sessions/policy.js.map +1 -1
  172. package/dist/sessions/store.d.ts +1 -12
  173. package/dist/sessions/store.d.ts.map +1 -1
  174. package/dist/sessions/store.js +4 -7
  175. package/dist/sessions/store.js.map +1 -1
  176. package/dist/sessions/types.d.ts +76 -0
  177. package/dist/sessions/types.d.ts.map +1 -0
  178. package/dist/sessions/types.js +2 -0
  179. package/dist/sessions/types.js.map +1 -0
  180. package/dist/store.d.ts +2 -19
  181. package/dist/store.d.ts.map +1 -1
  182. package/dist/store.js +1 -1
  183. package/dist/store.js.map +1 -1
  184. package/dist/tools/event.d.ts +30 -36
  185. package/dist/tools/event.d.ts.map +1 -1
  186. package/dist/tools/event.js +207 -26
  187. package/dist/tools/event.js.map +1 -1
  188. package/dist/tools/index.d.ts +2 -2
  189. package/dist/tools/index.d.ts.map +1 -1
  190. package/dist/tools/index.js.map +1 -1
  191. package/dist/tools/sandbox.d.ts.map +1 -1
  192. package/dist/tools/sandbox.js +1 -1
  193. package/dist/tools/sandbox.js.map +1 -1
  194. package/dist/tools/truncate.d.ts +2 -26
  195. package/dist/tools/truncate.d.ts.map +1 -1
  196. package/dist/tools/truncate.js.map +1 -1
  197. package/dist/tools/types.d.ts +54 -0
  198. package/dist/tools/types.d.ts.map +1 -0
  199. package/dist/tools/types.js +2 -0
  200. package/dist/tools/types.js.map +1 -0
  201. package/dist/trigger.d.ts +2 -13
  202. package/dist/trigger.d.ts.map +1 -1
  203. package/dist/trigger.js.map +1 -1
  204. package/dist/types.d.ts +307 -0
  205. package/dist/types.d.ts.map +1 -0
  206. package/dist/types.js +4 -0
  207. package/dist/types.js.map +1 -0
  208. package/dist/utils/date.d.ts +10 -0
  209. package/dist/utils/date.d.ts.map +1 -0
  210. package/dist/utils/date.js +23 -0
  211. package/dist/utils/date.js.map +1 -0
  212. package/dist/utils/env.d.ts.map +1 -0
  213. package/dist/utils/env.js.map +1 -0
  214. package/dist/utils/file-guards.d.ts.map +1 -0
  215. package/dist/utils/file-guards.js.map +1 -0
  216. package/dist/utils/fs-atomic.d.ts.map +1 -0
  217. package/dist/utils/fs-atomic.js.map +1 -0
  218. package/dist/utils/html.d.ts.map +1 -0
  219. package/dist/utils/html.js.map +1 -0
  220. package/dist/utils/http-body.d.ts +10 -0
  221. package/dist/utils/http-body.d.ts.map +1 -0
  222. package/dist/utils/http-body.js +34 -0
  223. package/dist/utils/http-body.js.map +1 -0
  224. package/dist/vault/index.d.ts +34 -0
  225. package/dist/vault/index.d.ts.map +1 -0
  226. package/dist/{vault.js → vault/index.js} +4 -4
  227. package/dist/vault/index.js.map +1 -0
  228. package/dist/{vault-routing.d.ts → vault/routing.d.ts} +2 -2
  229. package/dist/vault/routing.d.ts.map +1 -0
  230. package/dist/{vault-routing.js → vault/routing.js} +2 -2
  231. package/dist/vault/routing.js.map +1 -0
  232. package/dist/{vault.d.ts → vault/types.d.ts} +3 -34
  233. package/dist/vault/types.d.ts.map +1 -0
  234. package/dist/vault/types.js +2 -0
  235. package/dist/vault/types.js.map +1 -0
  236. package/dist/web/admin/portal.d.ts +5 -0
  237. package/dist/web/admin/portal.d.ts.map +1 -0
  238. package/dist/{admin → web/admin}/portal.js +140 -52
  239. package/dist/web/admin/portal.js.map +1 -0
  240. package/dist/web/admin/store.d.ts +13 -0
  241. package/dist/web/admin/store.d.ts.map +1 -0
  242. package/dist/web/admin/store.js +23 -0
  243. package/dist/web/admin/store.js.map +1 -0
  244. package/dist/web/admin/types.d.ts +28 -0
  245. package/dist/web/admin/types.d.ts.map +1 -0
  246. package/dist/web/admin/types.js +2 -0
  247. package/dist/web/admin/types.js.map +1 -0
  248. package/dist/web/login/oauth.d.ts +6 -0
  249. package/dist/web/login/oauth.d.ts.map +1 -0
  250. package/dist/{login/index.js → web/login/oauth.js} +33 -30
  251. package/dist/web/login/oauth.js.map +1 -0
  252. package/dist/{login → web/login}/portal.d.ts +5 -5
  253. package/dist/web/login/portal.d.ts.map +1 -0
  254. package/dist/{login → web/login}/portal.js +16 -35
  255. package/dist/web/login/portal.js.map +1 -0
  256. package/dist/web/login/store.d.ts +12 -0
  257. package/dist/web/login/store.d.ts.map +1 -0
  258. package/dist/web/login/store.js +28 -0
  259. package/dist/web/login/store.js.map +1 -0
  260. package/dist/web/login/types.d.ts +50 -0
  261. package/dist/web/login/types.d.ts.map +1 -0
  262. package/dist/web/login/types.js +2 -0
  263. package/dist/web/login/types.js.map +1 -0
  264. package/dist/web/session-view/command.d.ts +4 -0
  265. package/dist/web/session-view/command.d.ts.map +1 -0
  266. package/dist/{session-view → web/session-view}/command.js +1 -1
  267. package/dist/web/session-view/command.js.map +1 -0
  268. package/dist/{session-view → web/session-view}/portal.d.ts +2 -5
  269. package/dist/web/session-view/portal.d.ts.map +1 -0
  270. package/dist/{session-view → web/session-view}/portal.js +5 -5
  271. package/dist/web/session-view/portal.js.map +1 -0
  272. package/dist/web/session-view/service.d.ts +6 -0
  273. package/dist/web/session-view/service.d.ts.map +1 -0
  274. package/dist/{session-view → web/session-view}/service.js +6 -36
  275. package/dist/web/session-view/service.js.map +1 -0
  276. package/dist/web/session-view/store.d.ts +8 -0
  277. package/dist/web/session-view/store.d.ts.map +1 -0
  278. package/dist/web/session-view/store.js +20 -0
  279. package/dist/web/session-view/store.js.map +1 -0
  280. package/dist/{session-view/service.d.ts → web/session-view/types.d.ts} +20 -4
  281. package/dist/web/session-view/types.d.ts.map +1 -0
  282. package/dist/web/session-view/types.js +2 -0
  283. package/dist/web/session-view/types.js.map +1 -0
  284. package/dist/web/token-store.d.ts +19 -0
  285. package/dist/web/token-store.d.ts.map +1 -0
  286. package/dist/web/token-store.js +45 -0
  287. package/dist/web/token-store.js.map +1 -0
  288. package/dist/web/types.d.ts +5 -0
  289. package/dist/web/types.d.ts.map +1 -0
  290. package/dist/web/types.js +2 -0
  291. package/dist/web/types.js.map +1 -0
  292. package/package.json +1 -1
  293. package/dist/adapters/discord/index.d.ts +0 -3
  294. package/dist/adapters/discord/index.d.ts.map +0 -1
  295. package/dist/adapters/discord/index.js +0 -3
  296. package/dist/adapters/discord/index.js.map +0 -1
  297. package/dist/adapters/slack/index.d.ts +0 -3
  298. package/dist/adapters/slack/index.d.ts.map +0 -1
  299. package/dist/adapters/slack/index.js +0 -3
  300. package/dist/adapters/slack/index.js.map +0 -1
  301. package/dist/adapters/slack/thread-manager.d.ts +0 -19
  302. package/dist/adapters/slack/thread-manager.d.ts.map +0 -1
  303. package/dist/adapters/slack/thread-manager.js +0 -11
  304. package/dist/adapters/slack/thread-manager.js.map +0 -1
  305. package/dist/adapters/telegram/index.d.ts +0 -3
  306. package/dist/adapters/telegram/index.d.ts.map +0 -1
  307. package/dist/adapters/telegram/index.js +0 -3
  308. package/dist/adapters/telegram/index.js.map +0 -1
  309. package/dist/admin/portal.d.ts +0 -27
  310. package/dist/admin/portal.d.ts.map +0 -1
  311. package/dist/admin/portal.js.map +0 -1
  312. package/dist/admin/store.d.ts +0 -22
  313. package/dist/admin/store.d.ts.map +0 -1
  314. package/dist/admin/store.js +0 -39
  315. package/dist/admin/store.js.map +0 -1
  316. package/dist/commands/index.d.ts +0 -5
  317. package/dist/commands/index.d.ts.map +0 -1
  318. package/dist/commands/index.js +0 -20
  319. package/dist/commands/index.js.map +0 -1
  320. package/dist/env.d.ts.map +0 -1
  321. package/dist/env.js.map +0 -1
  322. package/dist/file-guards.d.ts.map +0 -1
  323. package/dist/file-guards.js.map +0 -1
  324. package/dist/fs-atomic.d.ts.map +0 -1
  325. package/dist/fs-atomic.js.map +0 -1
  326. package/dist/html.d.ts.map +0 -1
  327. package/dist/html.js.map +0 -1
  328. package/dist/instrument.d.ts.map +0 -1
  329. package/dist/instrument.js.map +0 -1
  330. package/dist/login/index.d.ts +0 -43
  331. package/dist/login/index.d.ts.map +0 -1
  332. package/dist/login/index.js.map +0 -1
  333. package/dist/login/portal.d.ts.map +0 -1
  334. package/dist/login/portal.js.map +0 -1
  335. package/dist/login/store.d.ts +0 -26
  336. package/dist/login/store.d.ts.map +0 -1
  337. package/dist/login/store.js +0 -56
  338. package/dist/login/store.js.map +0 -1
  339. package/dist/runtime/index.d.ts +0 -2
  340. package/dist/runtime/index.d.ts.map +0 -1
  341. package/dist/runtime/index.js +0 -2
  342. package/dist/runtime/index.js.map +0 -1
  343. package/dist/sentry.d.ts.map +0 -1
  344. package/dist/sentry.js.map +0 -1
  345. package/dist/session-view/command.d.ts +0 -5
  346. package/dist/session-view/command.d.ts.map +0 -1
  347. package/dist/session-view/command.js.map +0 -1
  348. package/dist/session-view/portal.d.ts.map +0 -1
  349. package/dist/session-view/portal.js.map +0 -1
  350. package/dist/session-view/service.d.ts.map +0 -1
  351. package/dist/session-view/service.js.map +0 -1
  352. package/dist/session-view/store.d.ts +0 -18
  353. package/dist/session-view/store.d.ts.map +0 -1
  354. package/dist/session-view/store.js +0 -36
  355. package/dist/session-view/store.js.map +0 -1
  356. package/dist/ui-copy.d.ts.map +0 -1
  357. package/dist/ui-copy.js.map +0 -1
  358. package/dist/vault-routing.d.ts.map +0 -1
  359. package/dist/vault-routing.js.map +0 -1
  360. package/dist/vault.d.ts.map +0 -1
  361. package/dist/vault.js.map +0 -1
  362. /package/dist/{instrument.d.ts → observability/instrument.d.ts} +0 -0
  363. /package/dist/{sentry.js → observability/sentry.js} +0 -0
  364. /package/dist/{env.d.ts → utils/env.d.ts} +0 -0
  365. /package/dist/{env.js → utils/env.js} +0 -0
  366. /package/dist/{file-guards.d.ts → utils/file-guards.d.ts} +0 -0
  367. /package/dist/{file-guards.js → utils/file-guards.js} +0 -0
  368. /package/dist/{fs-atomic.d.ts → utils/fs-atomic.d.ts} +0 -0
  369. /package/dist/{fs-atomic.js → utils/fs-atomic.js} +0 -0
  370. /package/dist/{html.d.ts → utils/html.d.ts} +0 -0
  371. /package/dist/{html.js → utils/html.js} +0 -0
@@ -3,14 +3,15 @@ import { WebClient } from "@slack/web-api";
3
3
  import { existsSync, readFileSync } from "fs";
4
4
  import { readFile } from "fs/promises";
5
5
  import { basename, join } from "path";
6
+ import { resolveConversationSettings } from "../../config.js";
6
7
  import * as log from "../../log.js";
7
- import { PRODUCT_NAME, formatForceStopped, formatNothingRunning } from "../../ui-copy.js";
8
+ import { PRODUCT_NAME, formatForceStopped, formatNothingRunning } from "../../platform-messages.js";
8
9
  import { appendBotResponseLog, appendChannelLog, ChannelQueue, resolveOnlyScopedStopTarget, resolveStopTarget, withRetry, } from "../shared.js";
9
- import { evaluateAutoReplyPolicy } from "../../trigger.js";
10
+ import { processMessageIntake } from "../intake.js";
10
11
  import { createSlackAdapters } from "./context.js";
11
12
  import { hasMaterializedChatSession, registerThreadSession, } from "../../sessions/chat-session-manager.js";
12
13
  import { isSlackThreadSessionKey, planSlackAdapterSession, planSlackEventAnchorRun, resolveSlackSessionKey, } from "./session.js";
13
- import { reportUserFacingError } from "../../sentry.js";
14
+ import { reportUserFacingError } from "../../observability/sentry.js";
14
15
  const SLACK_EVENT_ANCHOR_TEXT = "Working on it...";
15
16
  // Slack WebClient errors carry either `code: "rate_limited"` (retry-after) or
16
17
  // the legacy `data.error === "rate_limited"` / 429 status shape.
@@ -53,10 +54,30 @@ function buildSlackAppMessageText(event) {
53
54
  const deduped = parts.filter((part, index) => parts.indexOf(part) === index);
54
55
  return deduped.join("\n");
55
56
  }
57
+ // ---------------------------------------------------------------------------
58
+ // Shared mrkdwn truncation helper
59
+ // ---------------------------------------------------------------------------
60
+ const MRKDWN_CONTEXT_TEXT_LIMIT = 3000;
61
+ /**
62
+ * Build a Slack context block whose text is capped at the mrkdwn limit.
63
+ * Used for muted diagnostics and ephemeral command responses.
64
+ */
65
+ export function buildMrkdwnContextBlock(text) {
66
+ const blockText = text.length > MRKDWN_CONTEXT_TEXT_LIMIT
67
+ ? text.substring(0, MRKDWN_CONTEXT_TEXT_LIMIT - 20) + "\n_(truncated)_"
68
+ : text;
69
+ return { type: "context", elements: [{ type: "mrkdwn", text: blockText }] };
70
+ }
56
71
  // ============================================================================
57
72
  // SlackBot
58
73
  // ============================================================================
59
74
  export class SlackBot {
75
+ createAdapters(event) {
76
+ return createSlackAdapters(event, this, {
77
+ replyMode: resolveConversationSettings(join(this.workingDir, event.conversationId)).slack?.replyMode ??
78
+ "top-level",
79
+ });
80
+ }
60
81
  constructor(handler, config) {
61
82
  this.botUserId = null;
62
83
  this.botId = null;
@@ -163,16 +184,10 @@ export class SlackBot {
163
184
  }
164
185
  async postPrivateDiagnostic(conversationId, userId, text, options) {
165
186
  if (options?.style !== "muted") {
166
- await this.postPrivate(conversationId, userId, options?.style === "error" ? `_${text}_` : text);
187
+ await this.postEphemeral(conversationId, userId, options?.style === "error" ? `_${text}_` : text);
167
188
  return;
168
189
  }
169
- const CONTEXT_TEXT_LIMIT = 3000;
170
- const blockText = text.length > CONTEXT_TEXT_LIMIT
171
- ? text.substring(0, CONTEXT_TEXT_LIMIT - 20) + "\n_(truncated)_"
172
- : text;
173
- await this.postEphemeralBlocks(conversationId, userId, text, [
174
- { type: "context", elements: [{ type: "mrkdwn", text: blockText }] },
175
- ]);
190
+ await this.postEphemeralBlocks(conversationId, userId, text, [buildMrkdwnContextBlock(text)]);
176
191
  }
177
192
  async openDirectMessage(userId) {
178
193
  return slackRetry(async () => {
@@ -189,6 +204,33 @@ export class SlackBot {
189
204
  await this.webClient.chat.update({ channel, ts, text });
190
205
  });
191
206
  }
207
+ async startMessageStream(channel, text, threadTs) {
208
+ return slackRetry(async () => {
209
+ const result = await this.webClient.apiCall("chat.startStream", {
210
+ channel,
211
+ markdown_text: text,
212
+ ...(threadTs ? { thread_ts: threadTs } : {}),
213
+ });
214
+ const ts = result.ts;
215
+ if (!ts)
216
+ throw new Error("Slack chat.startStream did not return ts");
217
+ return ts;
218
+ });
219
+ }
220
+ async appendMessageStream(channel, ts, text) {
221
+ return slackRetry(async () => {
222
+ await this.webClient.apiCall("chat.appendStream", {
223
+ channel,
224
+ ts,
225
+ markdown_text: text,
226
+ });
227
+ });
228
+ }
229
+ async stopMessageStream(channel, ts) {
230
+ return slackRetry(async () => {
231
+ await this.webClient.apiCall("chat.stopStream", { channel, ts });
232
+ });
233
+ }
192
234
  async deleteMessage(channel, ts) {
193
235
  return slackRetry(async () => {
194
236
  await this.webClient.chat.delete({ channel, ts });
@@ -353,6 +395,8 @@ export class SlackBot {
353
395
  };
354
396
  const adapters = createSlackAdapters(slackEvent, this, {
355
397
  initialMessageTs: eventPlan.initialMessageTs,
398
+ replyMode: resolveConversationSettings(join(this.workingDir, eventForRun.conversationId)).slack
399
+ ?.replyMode ?? "top-level",
356
400
  });
357
401
  return this.handler.handleEvent(eventForRun, this, adapters);
358
402
  });
@@ -383,6 +427,22 @@ export class SlackBot {
383
427
  sessionKey,
384
428
  });
385
429
  }
430
+ processSlackMessageIntake(options) {
431
+ void processMessageIntake({
432
+ eventBase: options.event,
433
+ workingDir: this.workingDir,
434
+ isAutoReplyCandidate: options.isAutoReplyCandidate,
435
+ logEntryBase: {},
436
+ processAttachments: () => options.attachmentsPromise,
437
+ queueKey: options.queueKey,
438
+ enqueue: (queueKey, work) => this.getQueue(queueKey).enqueue(work),
439
+ handler: this.handler,
440
+ bot: this,
441
+ createAdapters: (event) => this.createAdapters(event),
442
+ onNotTriggered: options.onNotTriggered,
443
+ deferAttachmentsUntilRun: true,
444
+ });
445
+ }
386
446
  buildHomeView() {
387
447
  const blocks = [
388
448
  {
@@ -552,11 +612,7 @@ export class SlackBot {
552
612
  this.logBotResponse(conversationId, responseText, messageTs);
553
613
  };
554
614
  const respondMuted = async (responseText) => {
555
- const CONTEXT_TEXT_LIMIT = 3000;
556
- const blockText = responseText.length > CONTEXT_TEXT_LIMIT
557
- ? responseText.substring(0, CONTEXT_TEXT_LIMIT - 20) + "\n_(truncated)_"
558
- : responseText;
559
- const blocks = [{ type: "context", elements: [{ type: "mrkdwn", text: blockText }] }];
615
+ const blocks = [buildMrkdwnContextBlock(responseText)];
560
616
  if (options.ephemeralChannelId) {
561
617
  await this.postEphemeralBlocks(options.ephemeralChannelId, userId, responseText, blocks, options.threadTs);
562
618
  return;
@@ -627,22 +683,6 @@ export class SlackBot {
627
683
  const adapters = this.createCommandAdapters(conversationId, payload.user_id, userName, commandText, eventTs, isDirectMessage ? { threadTs } : { ephemeralChannelId: conversationId, threadTs });
628
684
  return { event, adapters };
629
685
  }
630
- createSlashCommandBot(conversationId, threadTs) {
631
- return {
632
- start: async () => { },
633
- postMessage: async (_channel, text) => {
634
- if (threadTs) {
635
- return this.postInThread(conversationId, threadTs, text);
636
- }
637
- return this.postMessage(conversationId, text);
638
- },
639
- updateMessage: async (channel, ts, text) => {
640
- await this.updateMessage(channel, ts, text);
641
- },
642
- enqueueEvent: (event) => this.enqueueEvent(event),
643
- getPlatformInfo: () => this.getPlatformInfo(),
644
- };
645
- }
646
686
  async routeSlashLoginCommand(payload) {
647
687
  const { event, adapters } = this.buildSlashCommandEvent(payload, {
648
688
  type: payload.channel_id.startsWith("D") ? "dm" : "private_command",
@@ -668,19 +708,19 @@ export class SlackBot {
668
708
  attachments: [],
669
709
  isBot: false,
670
710
  });
671
- const commandBot = this.createSlashCommandBot(conversationId);
711
+ const commandBot = {
712
+ start: async () => { },
713
+ postMessage: async (_channel, text) => this.postMessage(conversationId, text),
714
+ updateMessage: async (channel, ts, text) => this.updateMessage(channel, ts, text),
715
+ enqueueEvent: (event) => this.enqueueEvent(event),
716
+ getPlatformInfo: () => this.getPlatformInfo(),
717
+ };
672
718
  await this.handler.handleNewCommand(conversationId, conversationId, commandBot);
673
719
  }
674
720
  async routeSlashModelCommand(payload) {
675
721
  const { event, adapters } = this.buildSlashCommandEvent(payload, { includeText: true });
676
722
  await this.handler.handleEvent(event, this, adapters);
677
723
  }
678
- async routeSlashSandboxCommand(payload) {
679
- await this.routeSlashModelCommand(payload);
680
- }
681
- async routeSlashAutoReplyCommand(payload) {
682
- await this.routeSlashModelCommand(payload);
683
- }
684
724
  async routeSlashSessionCommand(payload) {
685
725
  const { event, adapters } = this.buildSlashCommandEvent(payload, { thread: true });
686
726
  await this.handler.handleEvent(event, this, adapters);
@@ -754,10 +794,11 @@ export class SlackBot {
754
794
  ack();
755
795
  return;
756
796
  }
757
- this.getQueue(this.resolveQueueKey(e.channel, sessionKey)).enqueue(async () => {
758
- slackEvent.attachments = await attachmentsPromise;
759
- const adapters = createSlackAdapters(slackEvent, this);
760
- return this.handler.handleEvent(slackEvent, this, adapters);
797
+ this.processSlackMessageIntake({
798
+ event: slackEvent,
799
+ attachmentsPromise,
800
+ queueKey: this.resolveQueueKey(e.channel, sessionKey),
801
+ isAutoReplyCandidate: false,
761
802
  });
762
803
  ack();
763
804
  }
@@ -853,10 +894,11 @@ export class SlackBot {
853
894
  // treats the message ts as a thread session (`channel:ts`) instead of the
854
895
  // persistent top-level channel session.
855
896
  slackEvent.sessionKey = activeSessionKey;
856
- this.getQueue(this.resolveQueueKey(e.channel, activeSessionKey)).enqueue(async () => {
857
- slackEvent.attachments = await attachmentsPromise;
858
- const adapters = createSlackAdapters(slackEvent, this);
859
- return this.handler.handleEvent(slackEvent, this, adapters);
897
+ this.processSlackMessageIntake({
898
+ event: slackEvent,
899
+ attachmentsPromise,
900
+ queueKey: this.resolveQueueKey(e.channel, activeSessionKey),
901
+ isAutoReplyCandidate: false,
860
902
  });
861
903
  };
862
904
  const logOnly = () => {
@@ -874,18 +916,14 @@ export class SlackBot {
874
916
  ack();
875
917
  return;
876
918
  }
877
- // Shared-channel non-mention top-level messages: gate via auto-reply policy.
878
- // evaluateAutoReplyPolicy never throws — judge errors/timeouts surface as
879
- // trigger:false with a distinct reason, and the user message has already
880
- // been queued for logging via logUserMessage above.
881
- evaluateAutoReplyPolicy({
919
+ const activeSessionKey = resolveSlackSessionKey(e.channel, e.thread_ts);
920
+ slackEvent.sessionKey = activeSessionKey;
921
+ this.processSlackMessageIntake({
882
922
  event: slackEvent,
883
- workingDir: this.workingDir,
884
- }).then((triggerResult) => {
885
- if (triggerResult.trigger)
886
- enqueueTriggered();
887
- else
888
- logOnly();
923
+ attachmentsPromise,
924
+ queueKey: this.resolveQueueKey(e.channel, activeSessionKey),
925
+ isAutoReplyCandidate: true,
926
+ onNotTriggered: logOnly,
889
927
  });
890
928
  ack();
891
929
  }
@@ -895,62 +933,56 @@ export class SlackBot {
895
933
  if (!payload.command || !payload.channel_id || !payload.user_id) {
896
934
  return;
897
935
  }
898
- const handlerPromise = payload.command === "/pi-login"
899
- ? this.routeSlashLoginCommand({
900
- command: payload.command,
901
- text: payload.text,
902
- channel_id: payload.channel_id,
903
- user_id: payload.user_id,
904
- user_name: payload.user_name,
905
- })
906
- : payload.command === "/pi-new"
907
- ? this.routeSlashNewCommand({
908
- command: payload.command,
909
- channel_id: payload.channel_id,
910
- user_id: payload.user_id,
911
- user_name: payload.user_name,
912
- })
913
- : payload.command === "/pi-session"
914
- ? this.routeSlashSessionCommand({
915
- command: payload.command,
916
- channel_id: payload.channel_id,
917
- user_id: payload.user_id,
918
- user_name: payload.user_name,
919
- thread_ts: payload.thread_ts,
920
- })
921
- : payload.command === "/pi-model"
922
- ? this.routeSlashModelCommand({
923
- command: payload.command,
924
- text: payload.text,
925
- channel_id: payload.channel_id,
926
- user_id: payload.user_id,
927
- user_name: payload.user_name,
928
- })
929
- : payload.command === "/pi-sandbox"
930
- ? this.routeSlashSandboxCommand({
931
- command: payload.command,
932
- text: payload.text,
933
- channel_id: payload.channel_id,
934
- user_id: payload.user_id,
935
- user_name: payload.user_name,
936
- })
937
- : payload.command === "/pi-auto-reply"
938
- ? this.routeSlashAutoReplyCommand({
939
- command: payload.command,
940
- text: payload.text,
941
- channel_id: payload.channel_id,
942
- user_id: payload.user_id,
943
- user_name: payload.user_name,
944
- })
945
- : payload.command === "/pi-admin"
946
- ? this.routeSlashAdminCommand({
947
- command: payload.command,
948
- channel_id: payload.channel_id,
949
- user_id: payload.user_id,
950
- user_name: payload.user_name,
951
- thread_ts: payload.thread_ts,
952
- })
953
- : null;
936
+ const { command, text, channel_id, user_id, user_name, thread_ts } = payload;
937
+ let handlerPromise = null;
938
+ if (command === "/pi-login") {
939
+ handlerPromise = this.routeSlashLoginCommand({
940
+ command,
941
+ text,
942
+ channel_id,
943
+ user_id,
944
+ user_name,
945
+ });
946
+ }
947
+ else if (command === "/pi-new") {
948
+ handlerPromise = this.routeSlashNewCommand({ command, channel_id, user_id, user_name });
949
+ }
950
+ else if (command === "/pi-session") {
951
+ handlerPromise = this.routeSlashSessionCommand({
952
+ command,
953
+ channel_id,
954
+ user_id,
955
+ user_name,
956
+ thread_ts,
957
+ });
958
+ }
959
+ else if (command === "/pi-model") {
960
+ handlerPromise = this.routeSlashModelCommand({
961
+ command,
962
+ text,
963
+ channel_id,
964
+ user_id,
965
+ user_name,
966
+ });
967
+ }
968
+ else if (command === "/pi-sandbox" || command === "/pi-auto-reply") {
969
+ handlerPromise = this.routeSlashModelCommand({
970
+ command,
971
+ text,
972
+ channel_id,
973
+ user_id,
974
+ user_name,
975
+ });
976
+ }
977
+ else if (command === "/pi-admin") {
978
+ handlerPromise = this.routeSlashAdminCommand({
979
+ command,
980
+ channel_id,
981
+ user_id,
982
+ user_name,
983
+ thread_ts,
984
+ });
985
+ }
954
986
  if (!handlerPromise) {
955
987
  return;
956
988
  }
@@ -972,7 +1004,7 @@ export class SlackBot {
972
1004
  log.logWarning(`Failed to publish App Home view`, String(err));
973
1005
  });
974
1006
  }
975
- async handleBlockAction({ body, ack }) {
1007
+ async handleBlockAction({ body, ack, }) {
976
1008
  const action = body.actions?.[0];
977
1009
  if (!action) {
978
1010
  ack();
@@ -1073,7 +1105,7 @@ export class SlackBot {
1073
1105
  attachments: [],
1074
1106
  sessionKey,
1075
1107
  };
1076
- return this.handler.handleEvent(event, this, createSlackAdapters(slackEvent, this));
1108
+ return this.handler.handleEvent(event, this, this.createAdapters(slackEvent));
1077
1109
  });
1078
1110
  }
1079
1111
  /**