@geminixiang/mikan 1.0.0-beta.45 → 1.0.0-beta.47

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 (440) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/README.md +12 -19
  3. package/dist/adapter.d.ts +1 -1
  4. package/dist/adapter.d.ts.map +1 -1
  5. package/dist/adapter.js.map +1 -1
  6. package/dist/adapters/discord/bot.d.ts +6 -1
  7. package/dist/adapters/discord/bot.d.ts.map +1 -1
  8. package/dist/adapters/discord/bot.js +168 -144
  9. package/dist/adapters/discord/bot.js.map +1 -1
  10. package/dist/adapters/discord/context.d.ts +2 -8
  11. package/dist/adapters/discord/context.d.ts.map +1 -1
  12. package/dist/adapters/discord/context.js +1 -1
  13. package/dist/adapters/discord/context.js.map +1 -1
  14. package/dist/adapters/discord/format.d.ts.map +1 -1
  15. package/dist/adapters/discord/format.js +2 -4
  16. package/dist/adapters/discord/format.js.map +1 -1
  17. package/dist/adapters/github/bot.d.ts +6 -1
  18. package/dist/adapters/github/bot.d.ts.map +1 -1
  19. package/dist/adapters/github/bot.js +57 -25
  20. package/dist/adapters/github/bot.js.map +1 -1
  21. package/dist/adapters/github/context.d.ts +2 -9
  22. package/dist/adapters/github/context.d.ts.map +1 -1
  23. package/dist/adapters/github/context.js.map +1 -1
  24. package/dist/adapters/github/github-ops.d.ts +4 -17
  25. package/dist/adapters/github/github-ops.d.ts.map +1 -1
  26. package/dist/adapters/github/github-ops.js +17 -86
  27. package/dist/adapters/github/github-ops.js.map +1 -1
  28. package/dist/adapters/github/tool-pack.d.ts.map +1 -1
  29. package/dist/adapters/github/tool-pack.js +0 -1
  30. package/dist/adapters/github/tool-pack.js.map +1 -1
  31. package/dist/adapters/github/tools/checks.d.ts +0 -1
  32. package/dist/adapters/github/tools/checks.d.ts.map +1 -1
  33. package/dist/adapters/github/tools/checks.js +3 -22
  34. package/dist/adapters/github/tools/checks.js.map +1 -1
  35. package/dist/adapters/github/types.d.ts +0 -33
  36. package/dist/adapters/github/types.d.ts.map +1 -1
  37. package/dist/adapters/github/types.js.map +1 -1
  38. package/dist/adapters/progressive-renderer.d.ts.map +1 -1
  39. package/dist/adapters/progressive-renderer.js +311 -318
  40. package/dist/adapters/progressive-renderer.js.map +1 -1
  41. package/dist/adapters/shared.d.ts +12 -1
  42. package/dist/adapters/shared.d.ts.map +1 -1
  43. package/dist/adapters/shared.js +44 -1
  44. package/dist/adapters/shared.js.map +1 -1
  45. package/dist/adapters/slack/blocks.d.ts.map +1 -1
  46. package/dist/adapters/slack/blocks.js +1 -4
  47. package/dist/adapters/slack/blocks.js.map +1 -1
  48. package/dist/adapters/slack/bot.d.ts +15 -0
  49. package/dist/adapters/slack/bot.d.ts.map +1 -1
  50. package/dist/adapters/slack/bot.js +233 -206
  51. package/dist/adapters/slack/bot.js.map +1 -1
  52. package/dist/adapters/slack/context.d.ts +2 -8
  53. package/dist/adapters/slack/context.d.ts.map +1 -1
  54. package/dist/adapters/slack/context.js +1 -1
  55. package/dist/adapters/slack/context.js.map +1 -1
  56. package/dist/adapters/slack/response-lifecycle.d.ts.map +1 -1
  57. package/dist/adapters/slack/response-lifecycle.js +135 -123
  58. package/dist/adapters/slack/response-lifecycle.js.map +1 -1
  59. package/dist/adapters/slack/stream-limits.d.ts +1 -1
  60. package/dist/adapters/slack/stream-limits.js +1 -1
  61. package/dist/adapters/slack/stream-limits.js.map +1 -1
  62. package/dist/adapters/slack/types.d.ts +4 -0
  63. package/dist/adapters/slack/types.d.ts.map +1 -1
  64. package/dist/adapters/slack/types.js.map +1 -1
  65. package/dist/adapters/telegram/bot.d.ts +3 -0
  66. package/dist/adapters/telegram/bot.d.ts.map +1 -1
  67. package/dist/adapters/telegram/bot.js +23 -7
  68. package/dist/adapters/telegram/bot.js.map +1 -1
  69. package/dist/adapters/telegram/context.d.ts +2 -8
  70. package/dist/adapters/telegram/context.d.ts.map +1 -1
  71. package/dist/adapters/telegram/context.js +1 -2
  72. package/dist/adapters/telegram/context.js.map +1 -1
  73. package/dist/adapters/types.d.ts +11 -5
  74. package/dist/adapters/types.d.ts.map +1 -1
  75. package/dist/adapters/types.js.map +1 -1
  76. package/dist/agent/catalog.d.ts +6 -18
  77. package/dist/agent/catalog.d.ts.map +1 -1
  78. package/dist/agent/catalog.js +24 -156
  79. package/dist/agent/catalog.js.map +1 -1
  80. package/dist/agent/execution.d.ts +0 -7
  81. package/dist/agent/execution.d.ts.map +1 -1
  82. package/dist/agent/execution.js +23 -21
  83. package/dist/agent/execution.js.map +1 -1
  84. package/dist/agent/presenter.d.ts +7 -9
  85. package/dist/agent/presenter.d.ts.map +1 -1
  86. package/dist/agent/presenter.js +355 -357
  87. package/dist/agent/presenter.js.map +1 -1
  88. package/dist/agent/prompt.d.ts +5 -12
  89. package/dist/agent/prompt.d.ts.map +1 -1
  90. package/dist/agent/prompt.js +56 -81
  91. package/dist/agent/prompt.js.map +1 -1
  92. package/dist/agent/runner.d.ts +0 -7
  93. package/dist/agent/runner.d.ts.map +1 -1
  94. package/dist/agent/runner.js +335 -318
  95. package/dist/agent/runner.js.map +1 -1
  96. package/dist/agent/types.d.ts +21 -17
  97. package/dist/agent/types.d.ts.map +1 -1
  98. package/dist/agent/types.js +0 -1
  99. package/dist/agent/types.js.map +1 -1
  100. package/dist/cli/boot.d.ts.map +1 -1
  101. package/dist/cli/boot.js +7 -10
  102. package/dist/cli/boot.js.map +1 -1
  103. package/dist/cli/onboard.d.ts +10 -0
  104. package/dist/cli/onboard.d.ts.map +1 -0
  105. package/dist/cli/onboard.js +237 -0
  106. package/dist/cli/onboard.js.map +1 -0
  107. package/dist/cli/types.d.ts +8 -3
  108. package/dist/cli/types.d.ts.map +1 -1
  109. package/dist/cli/types.js.map +1 -1
  110. package/dist/commands/auto-reply.d.ts.map +1 -1
  111. package/dist/commands/auto-reply.js +5 -12
  112. package/dist/commands/auto-reply.js.map +1 -1
  113. package/dist/commands/manifest.d.ts.map +1 -1
  114. package/dist/commands/manifest.js +9 -16
  115. package/dist/commands/manifest.js.map +1 -1
  116. package/dist/commands/new.d.ts.map +1 -1
  117. package/dist/commands/new.js +15 -10
  118. package/dist/commands/new.js.map +1 -1
  119. package/dist/commands/registry.d.ts.map +1 -1
  120. package/dist/commands/registry.js +0 -2
  121. package/dist/commands/registry.js.map +1 -1
  122. package/dist/commands/sandbox.d.ts.map +1 -1
  123. package/dist/commands/sandbox.js +89 -70
  124. package/dist/commands/sandbox.js.map +1 -1
  125. package/dist/commands/session-view.js +9 -2
  126. package/dist/commands/session-view.js.map +1 -1
  127. package/dist/commands/types.d.ts +4 -3
  128. package/dist/commands/types.d.ts.map +1 -1
  129. package/dist/commands/types.js.map +1 -1
  130. package/dist/config.d.ts +13 -17
  131. package/dist/config.d.ts.map +1 -1
  132. package/dist/config.js +39 -37
  133. package/dist/config.js.map +1 -1
  134. package/dist/dream/index.d.ts +20 -0
  135. package/dist/dream/index.d.ts.map +1 -0
  136. package/dist/dream/index.js +253 -0
  137. package/dist/dream/index.js.map +1 -0
  138. package/dist/dream/types.d.ts +30 -0
  139. package/dist/dream/types.d.ts.map +1 -0
  140. package/dist/dream/types.js.map +1 -0
  141. package/dist/env-manifest.d.ts.map +1 -1
  142. package/dist/env-manifest.js +12 -27
  143. package/dist/env-manifest.js.map +1 -1
  144. package/dist/execution-resolver.d.ts +9 -2
  145. package/dist/execution-resolver.d.ts.map +1 -1
  146. package/dist/execution-resolver.js +26 -27
  147. package/dist/execution-resolver.js.map +1 -1
  148. package/dist/harness/event-format.d.ts +1 -2
  149. package/dist/harness/event-format.d.ts.map +1 -1
  150. package/dist/harness/event-format.js +9 -15
  151. package/dist/harness/event-format.js.map +1 -1
  152. package/dist/harness/index.d.ts +1 -7
  153. package/dist/harness/index.d.ts.map +1 -1
  154. package/dist/harness/index.js +0 -4
  155. package/dist/harness/index.js.map +1 -1
  156. package/dist/harness/models.d.ts.map +1 -1
  157. package/dist/harness/models.js +15 -35
  158. package/dist/harness/models.js.map +1 -1
  159. package/dist/harness/runner.d.ts +7 -16
  160. package/dist/harness/runner.d.ts.map +1 -1
  161. package/dist/harness/runner.js +13 -131
  162. package/dist/harness/runner.js.map +1 -1
  163. package/dist/harness/session-store.d.ts +1 -1
  164. package/dist/harness/session-store.d.ts.map +1 -1
  165. package/dist/harness/session-store.js +1 -1
  166. package/dist/harness/session-store.js.map +1 -1
  167. package/dist/harness/subagent-runner.d.ts +2 -2
  168. package/dist/harness/subagent-runner.d.ts.map +1 -1
  169. package/dist/harness/subagent-runner.js +157 -162
  170. package/dist/harness/subagent-runner.js.map +1 -1
  171. package/dist/harness/types.d.ts +1 -13
  172. package/dist/harness/types.d.ts.map +1 -1
  173. package/dist/harness/types.js.map +1 -1
  174. package/dist/index.d.ts +3 -9
  175. package/dist/index.d.ts.map +1 -1
  176. package/dist/index.js +1 -5
  177. package/dist/index.js.map +1 -1
  178. package/dist/main.js +103 -222
  179. package/dist/main.js.map +1 -1
  180. package/dist/mcp/catalog.d.ts +5 -0
  181. package/dist/mcp/catalog.d.ts.map +1 -0
  182. package/dist/mcp/catalog.js +156 -0
  183. package/dist/mcp/catalog.js.map +1 -0
  184. package/dist/mcp/loader.d.ts +3 -2
  185. package/dist/mcp/loader.d.ts.map +1 -1
  186. package/dist/mcp/loader.js +54 -23
  187. package/dist/mcp/loader.js.map +1 -1
  188. package/dist/mcp/open-connector.d.ts +14 -0
  189. package/dist/mcp/open-connector.d.ts.map +1 -0
  190. package/dist/mcp/open-connector.js +203 -0
  191. package/dist/mcp/open-connector.js.map +1 -0
  192. package/dist/mcp/types.d.ts +28 -0
  193. package/dist/mcp/types.d.ts.map +1 -1
  194. package/dist/mcp/types.js.map +1 -1
  195. package/dist/office/index.d.ts +136 -8
  196. package/dist/office/index.d.ts.map +1 -1
  197. package/dist/office/index.js +1050 -9
  198. package/dist/office/index.js.map +1 -1
  199. package/dist/office/types.d.ts +19 -1
  200. package/dist/office/types.d.ts.map +1 -1
  201. package/dist/office/types.js.map +1 -1
  202. package/dist/packages/index.d.ts +168 -5
  203. package/dist/packages/index.d.ts.map +1 -1
  204. package/dist/packages/index.js +720 -5
  205. package/dist/packages/index.js.map +1 -1
  206. package/dist/packages/types.d.ts +1 -5
  207. package/dist/packages/types.d.ts.map +1 -1
  208. package/dist/packages/types.js.map +1 -1
  209. package/dist/process-lifecycle.d.ts +19 -0
  210. package/dist/process-lifecycle.d.ts.map +1 -0
  211. package/dist/process-lifecycle.js +60 -0
  212. package/dist/process-lifecycle.js.map +1 -0
  213. package/dist/provisioner.d.ts +2 -9
  214. package/dist/provisioner.d.ts.map +1 -1
  215. package/dist/provisioner.js +3 -12
  216. package/dist/provisioner.js.map +1 -1
  217. package/dist/runtime/conversation-runtime.d.ts.map +1 -1
  218. package/dist/runtime/conversation-runtime.js +124 -380
  219. package/dist/runtime/conversation-runtime.js.map +1 -1
  220. package/dist/runtime/session-lifecycle.d.ts +34 -18
  221. package/dist/runtime/session-lifecycle.d.ts.map +1 -1
  222. package/dist/runtime/session-lifecycle.js +179 -46
  223. package/dist/runtime/session-lifecycle.js.map +1 -1
  224. package/dist/runtime/types.d.ts +8 -26
  225. package/dist/runtime/types.d.ts.map +1 -1
  226. package/dist/runtime/types.js.map +1 -1
  227. package/dist/sandbox/cloudflare.d.ts.map +1 -1
  228. package/dist/sandbox/cloudflare.js +2 -3
  229. package/dist/sandbox/cloudflare.js.map +1 -1
  230. package/dist/sandbox/container.d.ts +0 -1
  231. package/dist/sandbox/container.d.ts.map +1 -1
  232. package/dist/sandbox/container.js +2 -3
  233. package/dist/sandbox/container.js.map +1 -1
  234. package/dist/sandbox/host.d.ts.map +1 -1
  235. package/dist/sandbox/host.js +4 -2
  236. package/dist/sandbox/host.js.map +1 -1
  237. package/dist/sandbox/identity.d.ts +10 -19
  238. package/dist/sandbox/identity.d.ts.map +1 -1
  239. package/dist/sandbox/identity.js +8 -8
  240. package/dist/sandbox/identity.js.map +1 -1
  241. package/dist/sandbox/index.d.ts +7 -10
  242. package/dist/sandbox/index.d.ts.map +1 -1
  243. package/dist/sandbox/index.js +45 -16
  244. package/dist/sandbox/index.js.map +1 -1
  245. package/dist/sandbox/types.d.ts +13 -45
  246. package/dist/sandbox/types.d.ts.map +1 -1
  247. package/dist/sandbox/types.js.map +1 -1
  248. package/dist/sandbox/utils.d.ts +5 -0
  249. package/dist/sandbox/utils.d.ts.map +1 -1
  250. package/dist/sandbox/utils.js +10 -0
  251. package/dist/sandbox/utils.js.map +1 -1
  252. package/dist/sessions/chat-history-sync.d.ts +1 -3
  253. package/dist/sessions/chat-history-sync.d.ts.map +1 -1
  254. package/dist/sessions/chat-history-sync.js +58 -11
  255. package/dist/sessions/chat-history-sync.js.map +1 -1
  256. package/dist/sessions/migrate-v3.d.ts +2 -5
  257. package/dist/sessions/migrate-v3.d.ts.map +1 -1
  258. package/dist/sessions/migrate-v3.js +17 -1
  259. package/dist/sessions/migrate-v3.js.map +1 -1
  260. package/dist/sessions/store.d.ts +5 -6
  261. package/dist/sessions/store.d.ts.map +1 -1
  262. package/dist/sessions/store.js +62 -2
  263. package/dist/sessions/store.js.map +1 -1
  264. package/dist/sessions/types.d.ts +9 -0
  265. package/dist/sessions/types.d.ts.map +1 -1
  266. package/dist/sessions/types.js.map +1 -1
  267. package/dist/tools/bash.d.ts.map +1 -1
  268. package/dist/tools/bash.js +2 -10
  269. package/dist/tools/bash.js.map +1 -1
  270. package/dist/tools/read.js +2 -2
  271. package/dist/tools/read.js.map +1 -1
  272. package/dist/tools/sandbox.d.ts.map +1 -1
  273. package/dist/tools/sandbox.js +2 -3
  274. package/dist/tools/sandbox.js.map +1 -1
  275. package/dist/tools/subagent.d.ts +1 -1
  276. package/dist/tools/subagent.js.map +1 -1
  277. package/dist/types.d.ts +54 -130
  278. package/dist/types.d.ts.map +1 -1
  279. package/dist/types.js.map +1 -1
  280. package/dist/vault/index.d.ts +9 -2
  281. package/dist/vault/index.d.ts.map +1 -1
  282. package/dist/vault/index.js +29 -5
  283. package/dist/vault/index.js.map +1 -1
  284. package/dist/web/admin/portal.d.ts +12 -1
  285. package/dist/web/admin/portal.d.ts.map +1 -1
  286. package/dist/web/admin/portal.js +437 -422
  287. package/dist/web/admin/portal.js.map +1 -1
  288. package/dist/web/admin/types.d.ts +2 -2
  289. package/dist/web/admin/types.d.ts.map +1 -1
  290. package/dist/web/admin/types.js.map +1 -1
  291. package/dist/web/login/portal.d.ts +7 -1
  292. package/dist/web/login/portal.d.ts.map +1 -1
  293. package/dist/web/login/portal.js +143 -78
  294. package/dist/web/login/portal.js.map +1 -1
  295. package/dist/web/portal-shell.d.ts +1 -0
  296. package/dist/web/portal-shell.d.ts.map +1 -1
  297. package/dist/web/portal-shell.js +12 -1
  298. package/dist/web/portal-shell.js.map +1 -1
  299. package/dist/web/server.d.ts +3 -3
  300. package/dist/web/server.d.ts.map +1 -1
  301. package/dist/web/server.js.map +1 -1
  302. package/dist/web/session-view/portal.d.ts +8 -1
  303. package/dist/web/session-view/portal.d.ts.map +1 -1
  304. package/dist/web/session-view/portal.js +609 -132
  305. package/dist/web/session-view/portal.js.map +1 -1
  306. package/dist/web/session-view/types.d.ts +8 -0
  307. package/dist/web/session-view/types.d.ts.map +1 -1
  308. package/dist/web/session-view/types.js.map +1 -1
  309. package/dist/workspace-projection/index.d.ts +14 -2
  310. package/dist/workspace-projection/index.d.ts.map +1 -1
  311. package/dist/workspace-projection/index.js +102 -14
  312. package/dist/workspace-projection/index.js.map +1 -1
  313. package/dist/workspace-projection/types.d.ts +14 -1
  314. package/dist/workspace-projection/types.d.ts.map +1 -1
  315. package/dist/workspace-projection/types.js.map +1 -1
  316. package/package.json +3 -5
  317. package/dist/adapters/github/cloudbuild.d.ts +0 -19
  318. package/dist/adapters/github/cloudbuild.d.ts.map +0 -1
  319. package/dist/adapters/github/cloudbuild.js +0 -71
  320. package/dist/adapters/github/cloudbuild.js.map +0 -1
  321. package/dist/adapters/github/gcp-auth.d.ts +0 -28
  322. package/dist/adapters/github/gcp-auth.d.ts.map +0 -1
  323. package/dist/adapters/github/gcp-auth.js +0 -196
  324. package/dist/adapters/github/gcp-auth.js.map +0 -1
  325. package/dist/agent/index.d.ts +0 -9
  326. package/dist/agent/index.d.ts.map +0 -1
  327. package/dist/agent/index.js +0 -8
  328. package/dist/agent/index.js.map +0 -1
  329. package/dist/cli/ext-dev.d.ts +0 -2
  330. package/dist/cli/ext-dev.d.ts.map +0 -1
  331. package/dist/cli/ext-dev.js +0 -188
  332. package/dist/cli/ext-dev.js.map +0 -1
  333. package/dist/cli/ext.d.ts +0 -2
  334. package/dist/cli/ext.d.ts.map +0 -1
  335. package/dist/cli/ext.js +0 -324
  336. package/dist/cli/ext.js.map +0 -1
  337. package/dist/commands/extensions.d.ts +0 -26
  338. package/dist/commands/extensions.d.ts.map +0 -1
  339. package/dist/commands/extensions.js +0 -103
  340. package/dist/commands/extensions.js.map +0 -1
  341. package/dist/extension-schedules.d.ts +0 -31
  342. package/dist/extension-schedules.d.ts.map +0 -1
  343. package/dist/extension-schedules.js +0 -229
  344. package/dist/extension-schedules.js.map +0 -1
  345. package/dist/harness/auth.d.ts +0 -17
  346. package/dist/harness/auth.d.ts.map +0 -1
  347. package/dist/harness/auth.js +0 -92
  348. package/dist/harness/auth.js.map +0 -1
  349. package/dist/harness/extensions/loader.d.ts +0 -40
  350. package/dist/harness/extensions/loader.d.ts.map +0 -1
  351. package/dist/harness/extensions/loader.js +0 -723
  352. package/dist/harness/extensions/loader.js.map +0 -1
  353. package/dist/harness/extensions/registry.d.ts +0 -155
  354. package/dist/harness/extensions/registry.d.ts.map +0 -1
  355. package/dist/harness/extensions/registry.js +0 -420
  356. package/dist/harness/extensions/registry.js.map +0 -1
  357. package/dist/harness/extensions/types.d.ts +0 -665
  358. package/dist/harness/extensions/types.d.ts.map +0 -1
  359. package/dist/harness/extensions/types.js.map +0 -1
  360. package/dist/office/address.d.ts +0 -31
  361. package/dist/office/address.d.ts.map +0 -1
  362. package/dist/office/address.js +0 -113
  363. package/dist/office/address.js.map +0 -1
  364. package/dist/office/layout.d.ts +0 -27
  365. package/dist/office/layout.d.ts.map +0 -1
  366. package/dist/office/layout.js +0 -97
  367. package/dist/office/layout.js.map +0 -1
  368. package/dist/office/migration.d.ts +0 -44
  369. package/dist/office/migration.d.ts.map +0 -1
  370. package/dist/office/migration.js +0 -255
  371. package/dist/office/migration.js.map +0 -1
  372. package/dist/office/registry.d.ts +0 -75
  373. package/dist/office/registry.d.ts.map +0 -1
  374. package/dist/office/registry.js +0 -646
  375. package/dist/office/registry.js.map +0 -1
  376. package/dist/packages/admin.d.ts +0 -17
  377. package/dist/packages/admin.d.ts.map +0 -1
  378. package/dist/packages/admin.js +0 -98
  379. package/dist/packages/admin.js.map +0 -1
  380. package/dist/packages/inspect.d.ts +0 -11
  381. package/dist/packages/inspect.d.ts.map +0 -1
  382. package/dist/packages/inspect.js +0 -98
  383. package/dist/packages/inspect.js.map +0 -1
  384. package/dist/packages/materialize.d.ts +0 -40
  385. package/dist/packages/materialize.d.ts.map +0 -1
  386. package/dist/packages/materialize.js +0 -297
  387. package/dist/packages/materialize.js.map +0 -1
  388. package/dist/packages/resolve.d.ts +0 -25
  389. package/dist/packages/resolve.d.ts.map +0 -1
  390. package/dist/packages/resolve.js +0 -208
  391. package/dist/packages/resolve.js.map +0 -1
  392. package/dist/packages/source.d.ts +0 -39
  393. package/dist/packages/source.d.ts.map +0 -1
  394. package/dist/packages/source.js +0 -189
  395. package/dist/packages/source.js.map +0 -1
  396. package/dist/sandbox/errors.d.ts +0 -6
  397. package/dist/sandbox/errors.d.ts.map +0 -1
  398. package/dist/sandbox/errors.js +0 -11
  399. package/dist/sandbox/errors.js.map +0 -1
  400. package/dist/sandbox/firecracker.d.ts +0 -18
  401. package/dist/sandbox/firecracker.d.ts.map +0 -1
  402. package/dist/sandbox/firecracker.js +0 -223
  403. package/dist/sandbox/firecracker.js.map +0 -1
  404. package/dist/sandbox/gondolin.d.ts +0 -57
  405. package/dist/sandbox/gondolin.d.ts.map +0 -1
  406. package/dist/sandbox/gondolin.js +0 -764
  407. package/dist/sandbox/gondolin.js.map +0 -1
  408. package/dist/sandbox/image.d.ts +0 -3
  409. package/dist/sandbox/image.d.ts.map +0 -1
  410. package/dist/sandbox/image.js +0 -29
  411. package/dist/sandbox/image.js.map +0 -1
  412. package/dist/sessions/conversation-log.d.ts +0 -9
  413. package/dist/sessions/conversation-log.d.ts.map +0 -1
  414. package/dist/sessions/conversation-log.js +0 -50
  415. package/dist/sessions/conversation-log.js.map +0 -1
  416. package/dist/sessions/rotation.d.ts +0 -2
  417. package/dist/sessions/rotation.d.ts.map +0 -1
  418. package/dist/sessions/rotation.js +0 -41
  419. package/dist/sessions/rotation.js.map +0 -1
  420. package/dist/vault/disabled.d.ts +0 -9
  421. package/dist/vault/disabled.d.ts.map +0 -1
  422. package/dist/vault/disabled.js +0 -25
  423. package/dist/vault/disabled.js.map +0 -1
  424. package/dist/web/admin/store.d.ts +0 -13
  425. package/dist/web/admin/store.d.ts.map +0 -1
  426. package/dist/web/admin/store.js +0 -14
  427. package/dist/web/admin/store.js.map +0 -1
  428. package/dist/web/login/store.d.ts +0 -8
  429. package/dist/web/login/store.d.ts.map +0 -1
  430. package/dist/web/login/store.js +0 -15
  431. package/dist/web/login/store.js.map +0 -1
  432. package/dist/web/session-view/service.d.ts +0 -6
  433. package/dist/web/session-view/service.d.ts.map +0 -1
  434. package/dist/web/session-view/service.js +0 -517
  435. package/dist/web/session-view/service.js.map +0 -1
  436. package/dist/web/session-view/store.d.ts +0 -8
  437. package/dist/web/session-view/store.d.ts.map +0 -1
  438. package/dist/web/session-view/store.js +0 -15
  439. package/dist/web/session-view/store.js.map +0 -1
  440. /package/dist/{harness/extensions → dream}/types.js +0 -0
@@ -1,6 +1,5 @@
1
1
  import { SocketModeClient } from "@slack/socket-mode";
2
2
  import { WebAPIRateLimitedError, WebClient } from "@slack/web-api";
3
- import { readEnv } from "../../env-manifest.js";
4
3
  import { existsSync, readFileSync } from "node:fs";
5
4
  import { readFile, writeFile } from "node:fs/promises";
6
5
  import { basename, join } from "node:path";
@@ -8,12 +7,12 @@ import { createConversationEvent, createConversationMessage, } from "../../adapt
8
7
  import { createOfficeAddress } from "../../office/index.js";
9
8
  import { COMMAND_MANIFEST } from "../../commands/manifest.js";
10
9
  import { resolveConversationSettings } from "../../config.js";
11
- import { parseExtActionId } from "../../harness/extensions/registry.js";
12
10
  import * as log from "../../log.js";
13
11
  import { isRecord, readTextFileIfExists } from "../../utils/file-guards.js";
14
12
  import { PRODUCT_NAME, formatForceStopped } from "../../platform-messages.js";
15
- import { appendBotResponseLog, appendChannelLog, MessagingEventQueue, saveIncomingAttachments, withRetry, } from "../shared.js";
13
+ import { appendBotResponseLog, appendChannelLog, MessagingEventQueue, MessagingIntakeTracker, saveIncomingAttachments, withRetry, } from "../shared.js";
16
14
  import { processMessageIntake } from "../intake.js";
15
+ import { recordPlatformChannelKind, } from "../../workspace-projection/index.js";
17
16
  import { AssistantThreadRegistry, handleAgentContextChanged, handleAgentDmOpened, handleAssistantThreadStarted, titleAssistantThread, } from "./assistant.js";
18
17
  import { createSlackAdapters } from "./context.js";
19
18
  import { hasMaterializedChatSession, registerThreadSession, } from "../../sessions/chat-history-sync.js";
@@ -140,7 +139,9 @@ export class SlackMessagingBot {
140
139
  * instead of inheriting whatever ran before it.
141
140
  */
142
141
  this.streamStarts = new StreamStartLimiter();
142
+ this.stopped = false;
143
143
  this.queues = new Map();
144
+ this.intake = new MessagingIntakeTracker("Slack");
144
145
  this.eventsWatcher = null;
145
146
  this.handler = handler;
146
147
  this.workspace = config.workspace;
@@ -160,11 +161,14 @@ export class SlackMessagingBot {
160
161
  // Public API
161
162
  // ==========================================================================
162
163
  async start() {
164
+ this.stopped = false;
163
165
  const auth = await this.webClient.auth.test();
164
166
  this.botUserId = auth.user_id;
165
167
  this.botId = typeof auth.bot_id === "string" ? auth.bot_id : null;
166
168
  this.teamId = typeof auth.team_id === "string" ? auth.team_id : null;
167
169
  await Promise.all([this.fetchUsers(), this.fetchChannels()]);
170
+ if (this.stopped)
171
+ return;
168
172
  log.logInfo(`Loaded ${this.channels.size} channels, ${this.users.size} users`);
169
173
  // Record startup time before opening the socket. Slack may replay older events;
170
174
  // those should be logged but not processed. Backfill runs in the background up
@@ -177,6 +181,16 @@ export class SlackMessagingBot {
177
181
  log.logWarning("Slack backfill failed", String(error));
178
182
  });
179
183
  }
184
+ async stop() {
185
+ this.stopped = true;
186
+ try {
187
+ await this.socketClient.disconnect();
188
+ }
189
+ finally {
190
+ await this.intake.close();
191
+ await Promise.all([...this.queues.values()].map((queue) => queue.close()));
192
+ }
193
+ }
180
194
  getUser(userId) {
181
195
  return this.users.get(userId);
182
196
  }
@@ -559,8 +573,8 @@ export class SlackMessagingBot {
559
573
  getMessagingInfo() {
560
574
  return {
561
575
  name: "slack",
576
+ ...(this.teamId ? { workspaceId: this.teamId } : {}),
562
577
  trustModel: "membership",
563
- bareExtensionCommands: true,
564
578
  formattingGuide: "## Slack Formatting\nWrite standard Markdown/GFM: **bold**, _italic_, ~~strike~~, `code`, fenced code blocks, [links](url), lists, and pipe tables (rendered as native Slack tables).\nDo NOT use Slack mrkdwn syntax like *single-asterisk bold* or <url|label> links.",
565
579
  channels: this.getAllChannels().map((c) => ({ id: c.id, name: c.name })),
566
580
  users: this.getAllUsers().map((u) => ({
@@ -581,6 +595,8 @@ export class SlackMessagingBot {
581
595
  * Returns true if enqueued, false if queue is full (max 5).
582
596
  */
583
597
  enqueueEvent(event) {
598
+ if (this.stopped)
599
+ return false;
584
600
  const conversationId = event.conversationId;
585
601
  const queue = this.getQueue(conversationId);
586
602
  if (queue.size() >= 5) {
@@ -588,7 +604,7 @@ export class SlackMessagingBot {
588
604
  return false;
589
605
  }
590
606
  log.logInfo(`Enqueueing event for ${conversationId}: ${event.text.substring(0, 50)}`);
591
- queue.enqueue(async () => {
607
+ return queue.enqueue(async () => {
592
608
  let anchorTs;
593
609
  if (!event.thread_ts) {
594
610
  try {
@@ -623,7 +639,7 @@ export class SlackMessagingBot {
623
639
  const runQueueKey = planSlackAdapterSession(eventForRun, {
624
640
  initialMessageTs: eventPlan.initialMessageTs,
625
641
  }).sessionKey;
626
- this.getQueue(runQueueKey).enqueue(async () => {
642
+ const run = async () => {
627
643
  const slackEvent = createConversationEvent({
628
644
  platform: "slack",
629
645
  address: eventForRun.address,
@@ -643,9 +659,13 @@ export class SlackMessagingBot {
643
659
  replyMode: this.resolveReplyMode(eventForRun.address),
644
660
  });
645
661
  return this.handler.handleEvent(eventForRun, this, context);
646
- });
662
+ };
663
+ const runQueue = this.getQueue(runQueueKey);
664
+ if (!runQueue.enqueue(run)) {
665
+ await runQueue.close();
666
+ await run();
667
+ }
647
668
  });
648
- return true;
649
669
  }
650
670
  // ==========================================================================
651
671
  // Private - Event Handlers
@@ -654,6 +674,8 @@ export class SlackMessagingBot {
654
674
  let queue = this.queues.get(channelId);
655
675
  if (!queue) {
656
676
  queue = new MessagingEventQueue("Slack");
677
+ if (this.stopped)
678
+ void queue.close();
657
679
  this.queues.set(channelId, queue);
658
680
  }
659
681
  return queue;
@@ -672,13 +694,48 @@ export class SlackMessagingBot {
672
694
  sessionKey,
673
695
  });
674
696
  }
697
+ /**
698
+ * Slack's own conversation vocabulary for this channel, from the metadata
699
+ * fetchChannels() already loads. Externally shared channels report
700
+ * "external" regardless of privacy — platform-public within one workspace
701
+ * is the sharing condition, and a channel visible to another organization
702
+ * does not satisfy it. Unknown channels return undefined (never recorded,
703
+ * so the projection keeps its isolated default).
704
+ */
705
+ channelKindFor(channelId) {
706
+ if (channelId.startsWith("D"))
707
+ return "im";
708
+ const channel = this.channels.get(channelId);
709
+ if (!channel)
710
+ return undefined;
711
+ if (channel.name.startsWith("DM:"))
712
+ return "im";
713
+ if (channel.isExternallyShared)
714
+ return "external";
715
+ if (channel.isPrivate === true)
716
+ return "private_channel";
717
+ if (channel.isPrivate === false)
718
+ return "public_channel";
719
+ return undefined;
720
+ }
675
721
  processSlackMessageIntake(options) {
722
+ const kind = this.channelKindFor(options.event.conversationId);
723
+ if (kind) {
724
+ try {
725
+ recordPlatformChannelKind(this.workspace.office(options.event.address), kind);
726
+ }
727
+ catch (err) {
728
+ // A failed snapshot must not block the message; the projection just
729
+ // keeps its previous (or isolated default) posture.
730
+ log.logWarning("Failed to record Slack channel kind", String(err));
731
+ }
732
+ }
676
733
  const absorbAttachmentFailure = () => {
677
734
  void options.attachmentsPromise.catch((err) => {
678
735
  log.logWarning("Failed to log Slack message", String(err));
679
736
  });
680
737
  };
681
- processMessageIntake({
738
+ return processMessageIntake({
682
739
  eventBase: options.event,
683
740
  office: this.workspace.office(options.event.address),
684
741
  isAutoReplyCandidate: options.isAutoReplyCandidate,
@@ -702,22 +759,7 @@ export class SlackMessagingBot {
702
759
  absorbAttachmentFailure();
703
760
  });
704
761
  }
705
- buildHomeView() {
706
- const blocks = [
707
- {
708
- type: "section",
709
- text: {
710
- type: "mrkdwn",
711
- text: `*${PRODUCT_NAME}*\nStart a new task or check on running work.`,
712
- },
713
- accessory: {
714
- type: "image",
715
- image_url: "https://media1.tenor.com/m/lfDATg4Bhc0AAAAC/happy-cat.gif",
716
- alt_text: PRODUCT_NAME,
717
- },
718
- },
719
- ];
720
- // --- Running tasks ---
762
+ appendRunningTasks(blocks) {
721
763
  const runningSessions = this.handler.getRunningSessions();
722
764
  blocks.push({ type: "divider" }, {
723
765
  type: "header",
@@ -732,67 +774,49 @@ export class SlackMessagingBot {
732
774
  type: "context",
733
775
  elements: [{ type: "mrkdwn", text: "_No tasks running right now._" }],
734
776
  });
777
+ return;
735
778
  }
736
- else {
737
- // Threshold for "stuck" detection (10 minutes)
738
- const STUCK_THRESHOLD_MS = 10 * 60 * 1000;
739
- for (const session of runningSessions) {
740
- const channelId = conversationIdOf(session.sessionKey);
741
- const channel = this.channels.get(channelId);
742
- const channelName = channel ? `#${channel.name}` : channelId;
743
- const elapsed = Math.floor((Date.now() - session.startedAt) / 60000);
744
- const elapsedStr = elapsed < 1 ? "<1 min" : `${elapsed} min`;
745
- // Check if task might be stuck
746
- const lastActivity = session.lastActivityAt ? Date.now() - session.lastActivityAt : 0;
747
- const isStuck = lastActivity > STUCK_THRESHOLD_MS;
748
- const statusText = isStuck ? "_stuck_" : "_running_";
749
- // Build status line: channel · status · time · step
750
- let statusLine = `${statusText} · ${elapsedStr}`;
751
- if (session.currentTool) {
752
- statusLine += ` · ${session.currentTool}`;
753
- }
754
- if (isStuck && lastActivity > 0) {
755
- const inactiveMin = Math.floor(lastActivity / 60000);
756
- statusLine += ` · idle ${inactiveMin}m`;
757
- }
758
- // Use context block for gray small text (like "No scheduled jobs.")
779
+ const stuckThresholdMs = 10 * 60 * 1000;
780
+ for (const session of runningSessions) {
781
+ const channelId = conversationIdOf(session.sessionKey);
782
+ const channelName = this.channels.get(channelId)?.name;
783
+ const elapsed = Math.floor((Date.now() - session.startedAt) / 60000);
784
+ const elapsedStr = elapsed < 1 ? "<1 min" : `${elapsed} min`;
785
+ const lastActivity = session.lastActivityAt ? Date.now() - session.lastActivityAt : 0;
786
+ const isStuck = lastActivity > stuckThresholdMs;
787
+ let statusLine = `${isStuck ? "_stuck_" : "_running_"} · ${elapsedStr}`;
788
+ if (session.currentTool)
789
+ statusLine += ` · ${session.currentTool}`;
790
+ if (isStuck)
791
+ statusLine += ` · idle ${Math.floor(lastActivity / 60000)}m`;
792
+ blocks.push({
793
+ type: "context",
794
+ elements: [
795
+ {
796
+ type: "mrkdwn",
797
+ text: `*${channelName ? `#${channelName}` : channelId}* · ${statusLine}`,
798
+ },
799
+ ],
800
+ });
801
+ if (isStuck) {
759
802
  blocks.push({
760
803
  type: "context",
761
804
  elements: [
805
+ { type: "mrkdwn", text: " " },
762
806
  {
763
- type: "mrkdwn",
764
- text: `*${channelName}* · ${statusLine}`,
807
+ type: "button",
808
+ text: { type: "plain_text", text: "Force Stop", emoji: true },
809
+ // `value` preserves the raw key; action_id is only a unique route.
810
+ action_id: `force_stop_${session.sessionKey.replace(/:/g, "_")}`,
811
+ value: session.sessionKey,
812
+ style: "danger",
765
813
  },
766
814
  ],
767
815
  });
768
- // Add Force Stop button as separate element if stuck
769
- if (isStuck) {
770
- blocks.push({
771
- type: "context",
772
- elements: [
773
- {
774
- type: "mrkdwn",
775
- text: " ",
776
- },
777
- {
778
- type: "button",
779
- text: { type: "plain_text", text: "Force Stop", emoji: true },
780
- // The raw session key travels in `value` (Slack returns it
781
- // verbatim); the action_id only routes and must be unique per
782
- // view, so it carries a sanitized copy of the key. Never
783
- // decode the key from the action_id — the `:`↔`_` rewrite is
784
- // irreversible for conversation ids that contain `_` (GitHub's
785
- // GH_owner_repo_number do, by design).
786
- action_id: `force_stop_${session.sessionKey.replace(/:/g, "_")}`,
787
- value: session.sessionKey,
788
- style: "danger",
789
- },
790
- ],
791
- });
792
- }
793
816
  }
794
817
  }
795
- // --- Cron jobs ---
818
+ }
819
+ appendScheduledJobs(blocks) {
796
820
  const periodicEvents = this.eventsWatcher?.getPeriodicEvents() ?? [];
797
821
  blocks.push({ type: "divider" }, {
798
822
  type: "header",
@@ -807,34 +831,46 @@ export class SlackMessagingBot {
807
831
  type: "context",
808
832
  elements: [{ type: "mrkdwn", text: "_No scheduled jobs._" }],
809
833
  });
834
+ return;
810
835
  }
811
- else {
812
- for (const ev of periodicEvents) {
813
- const channelLabel = ev.platform === "slack"
814
- ? (() => {
815
- const channel = this.channels.get(ev.conversationId);
816
- const channelName = channel ? `#${channel.name}` : ev.conversationId;
817
- return `${ev.platform}:${channelName}`;
818
- })()
819
- : `${ev.platform}:${ev.conversationId}`;
820
- const nextStr = ev.nextRun
821
- ? new Date(ev.nextRun).toLocaleString("en-US", {
822
- month: "short",
823
- day: "numeric",
824
- hour: "2-digit",
825
- minute: "2-digit",
826
- })
827
- : "—";
828
- blocks.push({
829
- type: "section",
830
- text: {
831
- type: "mrkdwn",
832
- text: `*${ev.text}*\n└ \`${ev.schedule}\` · ${channelLabel} · Next: ${nextStr}`,
833
- },
834
- });
835
- }
836
+ for (const event of periodicEvents) {
837
+ const channel = event.platform === "slack" ? this.channels.get(event.conversationId) : undefined;
838
+ const channelId = channel ? `#${channel.name}` : event.conversationId;
839
+ const channelLabel = `${event.platform}:${channelId}`;
840
+ const nextRun = event.nextRun
841
+ ? new Date(event.nextRun).toLocaleString("en-US", {
842
+ month: "short",
843
+ day: "numeric",
844
+ hour: "2-digit",
845
+ minute: "2-digit",
846
+ })
847
+ : "—";
848
+ blocks.push({
849
+ type: "section",
850
+ text: {
851
+ type: "mrkdwn",
852
+ text: `*${event.text}*\n└ \`${event.schedule}\` · ${channelLabel} · Next: ${nextRun}`,
853
+ },
854
+ });
836
855
  }
837
- // --- Footer ---
856
+ }
857
+ buildHomeView() {
858
+ const blocks = [
859
+ {
860
+ type: "section",
861
+ text: {
862
+ type: "mrkdwn",
863
+ text: `*${PRODUCT_NAME}*\nStart a new task or check on running work.`,
864
+ },
865
+ accessory: {
866
+ type: "image",
867
+ image_url: "https://media1.tenor.com/m/lfDATg4Bhc0AAAAC/happy-cat.gif",
868
+ alt_text: PRODUCT_NAME,
869
+ },
870
+ },
871
+ ];
872
+ this.appendRunningTasks(blocks);
873
+ this.appendScheduledJobs(blocks);
838
874
  blocks.push({ type: "divider" }, {
839
875
  type: "context",
840
876
  elements: [
@@ -843,7 +879,8 @@ export class SlackMessagingBot {
843
879
  });
844
880
  return { type: "home", blocks: blocks };
845
881
  }
846
- createCommandAdapters(conversationId, userId, userName, text, ts, options = {}) {
882
+ createCommandAdapters(input) {
883
+ const { conversationId, userId, userName, text, ts, ...options } = input;
847
884
  const message = createConversationMessage({
848
885
  platform: "slack",
849
886
  conversationId,
@@ -937,9 +974,16 @@ export class SlackMessagingBot {
937
974
  ...(threadTs ? { thread_ts: threadTs } : {}),
938
975
  sessionKey,
939
976
  });
940
- const context = this.createCommandAdapters(conversationId, payload.user_id, userName, commandText, eventTs, isDirectMessage
941
- ? { threadTs, sessionKey }
942
- : { ephemeralChannelId: conversationId, threadTs, sessionKey });
977
+ const context = this.createCommandAdapters({
978
+ conversationId,
979
+ userId: payload.user_id,
980
+ userName,
981
+ text: commandText,
982
+ ts: eventTs,
983
+ ...(isDirectMessage
984
+ ? { threadTs, sessionKey }
985
+ : { ephemeralChannelId: conversationId, threadTs, sessionKey }),
986
+ });
943
987
  return { event, context };
944
988
  }
945
989
  /**
@@ -972,31 +1016,39 @@ export class SlackMessagingBot {
972
1016
  this.socketClient.on("unable_to_socket_mode_start", (err) => {
973
1017
  log.logWarning("Slack socket unable_to_start", err ? String(err) : "");
974
1018
  });
975
- // Which events Slack actually delivers is otherwise unknowable from here:
976
- // a listener that never fires looks the same whether the subscription is
977
- // missing, the app needs reinstalling, or the surface never emits it at
978
- // all. Off by default — this is one line per event on a busy workspace.
979
- if (readEnv("SLACK_TRACE_EVENTS")) {
980
- this.socketClient.on("slack_event", ({ type, body }) => {
981
- const inner = body?.event;
982
- log.logInfo(`Slack socket event: ${type ?? "?"}${inner?.type ? ` → ${inner.type}` : ""}${inner?.tab ? ` (tab: ${inner.tab})` : ""}`);
983
- });
984
- }
985
- this.socketClient.on("app_mention", (payload) => this.handleAppMention(payload));
986
- this.socketClient.on("message", (payload) => this.handleMessageEvent(payload));
987
- this.socketClient.on("slash_commands", (payload) => void this.handleSlashCommand(payload));
988
- this.socketClient.on("app_home_opened", (payload) => this.handleAppHomeOpened(payload));
1019
+ this.socketClient.on("app_mention", (payload) => {
1020
+ void this.intake.run(() => this.handleAppMention(payload));
1021
+ });
1022
+ this.socketClient.on("message", (payload) => {
1023
+ void this.intake.run(() => this.handleMessageEvent(payload));
1024
+ });
1025
+ this.socketClient.on("slash_commands", (payload) => {
1026
+ void this.intake.run(() => this.handleSlashCommand(payload));
1027
+ });
1028
+ this.socketClient.on("app_home_opened", (payload) => {
1029
+ void this.intake.run(() => this.handleAppHomeOpened(payload));
1030
+ });
989
1031
  // The assistant surface's lifecycle. Both events were already subscribed
990
1032
  // in the app manifest and then dropped on the floor, which is why the pane
991
1033
  // opened empty and the sidebar filled with untitled conversations.
992
- this.socketClient.on("assistant_thread_started", (payload) => this.handleAssistantThreadStarted(payload));
993
- this.socketClient.on("assistant_thread_context_changed", (payload) => this.handleAgentContextChangedEvent(payload));
1034
+ this.socketClient.on("assistant_thread_started", (payload) => {
1035
+ void this.intake.run(() => this.handleAssistantThreadStarted(payload));
1036
+ });
1037
+ this.socketClient.on("assistant_thread_context_changed", (payload) => {
1038
+ void this.intake.run(() => this.handleAgentContextChangedEvent(payload));
1039
+ });
994
1040
  // agent_view's spelling of the same signal.
995
- this.socketClient.on("app_context_changed", (payload) => this.handleAgentContextChangedEvent(payload));
996
- this.socketClient.on("block_actions", (payload) => void this.handleBlockAction(payload));
997
- this.socketClient.on("interactive", (payload) => void this.handleBlockAction(payload));
1041
+ this.socketClient.on("app_context_changed", (payload) => {
1042
+ void this.intake.run(() => this.handleAgentContextChangedEvent(payload));
1043
+ });
1044
+ this.socketClient.on("block_actions", (payload) => {
1045
+ void this.intake.run(() => this.handleBlockAction(payload));
1046
+ });
1047
+ this.socketClient.on("interactive", (payload) => {
1048
+ void this.intake.run(() => this.handleBlockAction(payload));
1049
+ });
998
1050
  }
999
- handleAppMention({ event, ack }) {
1051
+ async handleAppMention({ event, ack, }) {
1000
1052
  const e = event;
1001
1053
  // Skip DMs (handled by message event)
1002
1054
  if (e.channel.startsWith("D")) {
@@ -1030,7 +1082,7 @@ export class SlackMessagingBot {
1030
1082
  ack();
1031
1083
  return;
1032
1084
  }
1033
- this.processSlackMessageIntake({
1085
+ const intake = this.processSlackMessageIntake({
1034
1086
  event: slackEvent,
1035
1087
  attachmentsPromise,
1036
1088
  queueKey: this.resolveQueueKey(e.channel, sessionKey),
@@ -1038,50 +1090,46 @@ export class SlackMessagingBot {
1038
1090
  addressed: true,
1039
1091
  });
1040
1092
  ack();
1041
- }
1042
- handleMessageEvent({ event, ack }) {
1043
- const e = event;
1044
- const hasFiles = !!e.files && e.files.length > 0;
1045
- const hasSlackContent = !!e.text || hasFiles || !!e.blocks?.length || !!e.attachments?.length;
1046
- const isOwnMessagingBotMessage = (!!e.user && e.user === this.botUserId) || (!!this.botId && e.bot_id === this.botId);
1047
- if (isOwnMessagingBotMessage) {
1093
+ await intake;
1094
+ }
1095
+ admitHumanMessage(event, ack) {
1096
+ const hasSlackContent = !!event.text ||
1097
+ !!event.files?.length ||
1098
+ !!event.blocks?.length ||
1099
+ !!event.attachments?.length;
1100
+ const isOwnMessage = event.user === this.botUserId || (!!this.botId && event.bot_id === this.botId);
1101
+ if (isOwnMessage) {
1048
1102
  ack();
1049
- return;
1103
+ return false;
1050
1104
  }
1051
- // API posts made with a user token carry the posting app's bot_id/app_id
1052
- // alongside the human `user` — bot_id alone does not make the author a
1053
- // bot. Only treat the message as bot-authored when the author is not a
1054
- // known human user (bot users have is_bot=true; unknown authors stay on
1055
- // the conservative bot path so loop protection holds).
1056
- const authorIsKnownHuman = !!e.user && this.users.get(e.user)?.isBot === false;
1057
- const isExternalMessagingBotMessage = e.subtype === "bot_message" || (!!e.bot_id && !authorIsKnownHuman);
1058
- if (isExternalMessagingBotMessage) {
1059
- if (e.subtype !== undefined && e.subtype !== "bot_message" && e.subtype !== "file_share") {
1060
- ack();
1061
- return;
1062
- }
1063
- if (!hasSlackContent) {
1064
- ack();
1065
- return;
1105
+ // User-token posts carry bot_id/app_id beside the human user. Only unknown
1106
+ // authors and known bot users take the external-bot loop-protection path.
1107
+ const authorIsKnownHuman = !!event.user && this.users.get(event.user)?.isBot === false;
1108
+ const isExternalMessage = event.subtype === "bot_message" || (!!event.bot_id && !authorIsKnownHuman);
1109
+ if (isExternalMessage) {
1110
+ const supportedSubtype = event.subtype === undefined ||
1111
+ event.subtype === "bot_message" ||
1112
+ event.subtype === "file_share";
1113
+ if (supportedSubtype && hasSlackContent) {
1114
+ void this.logExternalMessagingBotMessage(event).catch((err) => {
1115
+ log.logWarning("Failed to log Slack bot message", String(err));
1116
+ });
1066
1117
  }
1067
- void this.logExternalMessagingBotMessage(e).catch((err) => {
1068
- log.logWarning("Failed to log Slack bot message", String(err));
1069
- });
1070
- ack();
1071
- return;
1072
- }
1073
- if (!e.user) {
1074
- ack();
1075
- return;
1076
- }
1077
- if (e.subtype !== undefined && e.subtype !== "file_share") {
1078
1118
  ack();
1079
- return;
1119
+ return false;
1080
1120
  }
1081
- if (!hasSlackContent) {
1082
- ack();
1121
+ const isSupportedUserMessage = !!event.user &&
1122
+ (event.subtype === undefined || event.subtype === "file_share") &&
1123
+ hasSlackContent;
1124
+ if (isSupportedUserMessage)
1125
+ return true;
1126
+ ack();
1127
+ return false;
1128
+ }
1129
+ async handleMessageEvent({ event, ack, }) {
1130
+ const e = event;
1131
+ if (!this.admitHumanMessage(e, ack))
1083
1132
  return;
1084
- }
1085
1133
  // message.im normally carries channel_type "im", but fall back to the
1086
1134
  // D-prefix convention (used by handleAppMention and session keys) so a
1087
1135
  // missing channel_type cannot silently demote a DM to an auto-reply
@@ -1139,7 +1187,7 @@ export class SlackMessagingBot {
1139
1187
  // message ts as a thread session (`channel:ts`) instead of the persistent
1140
1188
  // top-level channel session.
1141
1189
  slackEvent.sessionKey = activeSessionKey;
1142
- this.processSlackMessageIntake({
1190
+ const intake = this.processSlackMessageIntake({
1143
1191
  event: slackEvent,
1144
1192
  attachmentsPromise,
1145
1193
  queueKey: this.resolveQueueKey(e.channel, activeSessionKey),
@@ -1147,6 +1195,7 @@ export class SlackMessagingBot {
1147
1195
  addressed: isDM,
1148
1196
  });
1149
1197
  ack();
1198
+ await intake;
1150
1199
  }
1151
1200
  async handleSlashCommand({ body, ack, }) {
1152
1201
  const payload = body;
@@ -1160,16 +1209,19 @@ export class SlackMessagingBot {
1160
1209
  return;
1161
1210
  if (!entry.slackRoute)
1162
1211
  return;
1163
- this.routeSlashCommand(entry.slackRoute, {
1164
- command,
1165
- text,
1166
- channel_id,
1167
- user_id,
1168
- user_name,
1169
- thread_ts,
1170
- }).catch((err) => {
1212
+ try {
1213
+ await this.routeSlashCommand(entry.slackRoute, {
1214
+ command,
1215
+ text,
1216
+ channel_id,
1217
+ user_id,
1218
+ user_name,
1219
+ thread_ts,
1220
+ });
1221
+ }
1222
+ catch (err) {
1171
1223
  log.logWarning("Slack slash command error", err instanceof Error ? err.message : String(err));
1172
- });
1224
+ }
1173
1225
  }
1174
1226
  handleAppHomeOpened({ event, ack }) {
1175
1227
  const e = event;
@@ -1242,36 +1294,6 @@ export class SlackMessagingBot {
1242
1294
  : undefined;
1243
1295
  const threadTs = container.thread_ts;
1244
1296
  const sessionKey = resolveSlackSessionKey(channelId, threadTs);
1245
- // Extension-owned actions (ext:<slug>: namespaced by api.blockkit.post)
1246
- // dispatch exclusively to the extension's onAction handler — no agent
1247
- // run, no chat-history entry. They never fall through to the model: an
1248
- // unconsumed namespaced action means the extension is gone, and its
1249
- // routing id would only confuse an agent run.
1250
- const extAction = parseExtActionId(action.action_id ?? "");
1251
- if (extAction) {
1252
- this.getQueue(this.resolveQueueKey(channelId, sessionKey)).enqueue(async () => {
1253
- const consumed = await this.handler.handleExtensionAction({
1254
- address: createOfficeAddress("slack", channelId),
1255
- sessionKey,
1256
- conversationKind: channelId.startsWith("D") ? "direct" : "shared",
1257
- slug: extAction.slug,
1258
- action: {
1259
- actionId: extAction.actionId,
1260
- value: action.value ?? selectedOption?.value ?? selectedOption?.text?.text,
1261
- selectedValues: selectedOptions?.map((option) => option.value ?? option.text?.text ?? ""),
1262
- userId,
1263
- userName: body.user?.username ?? body.user?.name,
1264
- conversationId: channelId,
1265
- messageTs: container.message_ts,
1266
- threadTs,
1267
- },
1268
- });
1269
- if (!consumed) {
1270
- log.logWarning(`[${channelId}] Dropped extension action ${action.action_id}`, `no handler registered by extension "${extAction.slug}"`);
1271
- }
1272
- });
1273
- return;
1274
- }
1275
1297
  const selectedText = selectedOption?.text?.text ?? selectedOption?.value;
1276
1298
  const selectedTexts = selectedOptions?.map((option) => option.text?.text ?? option.value);
1277
1299
  const valueText = selectedTexts?.length
@@ -1607,7 +1629,12 @@ export class SlackMessagingBot {
1607
1629
  if (channels) {
1608
1630
  for (const c of channels) {
1609
1631
  if (c.id && c.name && c.is_member) {
1610
- this.channels.set(c.id, { id: c.id, name: c.name });
1632
+ this.channels.set(c.id, {
1633
+ id: c.id,
1634
+ name: c.name,
1635
+ ...(typeof c.is_private === "boolean" ? { isPrivate: c.is_private } : {}),
1636
+ ...(c.is_shared || c.is_ext_shared ? { isExternallyShared: true } : {}),
1637
+ });
1611
1638
  }
1612
1639
  }
1613
1640
  }