@geminixiang/mikan 1.0.0-beta.3 → 1.0.0-beta.30

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 (545) hide show
  1. package/CHANGELOG.md +563 -0
  2. package/README.md +60 -24
  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 +1 -0
  7. package/dist/adapters/discord/bot.d.ts.map +1 -1
  8. package/dist/adapters/discord/bot.js +47 -65
  9. package/dist/adapters/discord/bot.js.map +1 -1
  10. package/dist/adapters/discord/context.d.ts.map +1 -1
  11. package/dist/adapters/discord/context.js +46 -211
  12. package/dist/adapters/discord/context.js.map +1 -1
  13. package/dist/adapters/github/bot.d.ts +86 -0
  14. package/dist/adapters/github/bot.d.ts.map +1 -0
  15. package/dist/adapters/github/bot.js +640 -0
  16. package/dist/adapters/github/bot.js.map +1 -0
  17. package/dist/adapters/github/client.d.ts +122 -0
  18. package/dist/adapters/github/client.d.ts.map +1 -0
  19. package/dist/adapters/github/client.js +314 -0
  20. package/dist/adapters/github/client.js.map +1 -0
  21. package/dist/adapters/github/cloudbuild.d.ts +19 -0
  22. package/dist/adapters/github/cloudbuild.d.ts.map +1 -0
  23. package/dist/adapters/github/cloudbuild.js +71 -0
  24. package/dist/adapters/github/cloudbuild.js.map +1 -0
  25. package/dist/adapters/github/context.d.ts +9 -0
  26. package/dist/adapters/github/context.d.ts.map +1 -0
  27. package/dist/adapters/github/context.js +98 -0
  28. package/dist/adapters/github/context.js.map +1 -0
  29. package/dist/adapters/github/gcp-auth.d.ts +28 -0
  30. package/dist/adapters/github/gcp-auth.d.ts.map +1 -0
  31. package/dist/adapters/github/gcp-auth.js +196 -0
  32. package/dist/adapters/github/gcp-auth.js.map +1 -0
  33. package/dist/adapters/github/github-ops.d.ts +90 -0
  34. package/dist/adapters/github/github-ops.d.ts.map +1 -0
  35. package/dist/adapters/github/github-ops.js +405 -0
  36. package/dist/adapters/github/github-ops.js.map +1 -0
  37. package/dist/adapters/github/ids.d.ts +34 -0
  38. package/dist/adapters/github/ids.d.ts.map +1 -0
  39. package/dist/adapters/github/ids.js +53 -0
  40. package/dist/adapters/github/ids.js.map +1 -0
  41. package/dist/adapters/github/repo.d.ts +32 -0
  42. package/dist/adapters/github/repo.d.ts.map +1 -0
  43. package/dist/adapters/github/repo.js +141 -0
  44. package/dist/adapters/github/repo.js.map +1 -0
  45. package/dist/adapters/github/tool-pack.d.ts +14 -0
  46. package/dist/adapters/github/tool-pack.d.ts.map +1 -0
  47. package/dist/adapters/github/tool-pack.js +56 -0
  48. package/dist/adapters/github/tool-pack.js.map +1 -0
  49. package/dist/adapters/github/tools/checks.d.ts +19 -0
  50. package/dist/adapters/github/tools/checks.d.ts.map +1 -0
  51. package/dist/adapters/github/tools/checks.js +105 -0
  52. package/dist/adapters/github/tools/checks.js.map +1 -0
  53. package/dist/adapters/github/tools/issue.d.ts +21 -0
  54. package/dist/adapters/github/tools/issue.d.ts.map +1 -0
  55. package/dist/adapters/github/tools/issue.js +48 -0
  56. package/dist/adapters/github/tools/issue.js.map +1 -0
  57. package/dist/adapters/github/tools/pr.d.ts +22 -0
  58. package/dist/adapters/github/tools/pr.d.ts.map +1 -0
  59. package/dist/adapters/github/tools/pr.js +48 -0
  60. package/dist/adapters/github/tools/pr.js.map +1 -0
  61. package/dist/adapters/github/tools/read.d.ts +21 -0
  62. package/dist/adapters/github/tools/read.d.ts.map +1 -0
  63. package/dist/adapters/github/tools/read.js +141 -0
  64. package/dist/adapters/github/tools/read.js.map +1 -0
  65. package/dist/adapters/github/tools/review-reply.d.ts +17 -0
  66. package/dist/adapters/github/tools/review-reply.d.ts.map +1 -0
  67. package/dist/adapters/github/tools/review-reply.js +38 -0
  68. package/dist/adapters/github/tools/review-reply.js.map +1 -0
  69. package/dist/adapters/github/tools/sync.d.ts +17 -0
  70. package/dist/adapters/github/tools/sync.d.ts.map +1 -0
  71. package/dist/adapters/github/tools/sync.js +34 -0
  72. package/dist/adapters/github/tools/sync.js.map +1 -0
  73. package/dist/adapters/github/types.d.ts +372 -0
  74. package/dist/adapters/github/types.d.ts.map +1 -0
  75. package/dist/adapters/github/types.js +2 -0
  76. package/dist/adapters/github/types.js.map +1 -0
  77. package/dist/adapters/intake.d.ts +16 -5
  78. package/dist/adapters/intake.d.ts.map +1 -1
  79. package/dist/adapters/intake.js +84 -22
  80. package/dist/adapters/intake.js.map +1 -1
  81. package/dist/adapters/progressive-renderer.d.ts +7 -0
  82. package/dist/adapters/progressive-renderer.d.ts.map +1 -0
  83. package/dist/adapters/progressive-renderer.js +383 -0
  84. package/dist/adapters/progressive-renderer.js.map +1 -0
  85. package/dist/adapters/slack/blocks.d.ts.map +1 -1
  86. package/dist/adapters/slack/blocks.js +111 -111
  87. package/dist/adapters/slack/blocks.js.map +1 -1
  88. package/dist/adapters/slack/bot.d.ts +10 -6
  89. package/dist/adapters/slack/bot.d.ts.map +1 -1
  90. package/dist/adapters/slack/bot.js +173 -145
  91. package/dist/adapters/slack/bot.js.map +1 -1
  92. package/dist/adapters/slack/context.d.ts.map +1 -1
  93. package/dist/adapters/slack/context.js +3 -14
  94. package/dist/adapters/slack/context.js.map +1 -1
  95. package/dist/adapters/slack/response-lifecycle.d.ts.map +1 -1
  96. package/dist/adapters/slack/response-lifecycle.js +126 -323
  97. package/dist/adapters/slack/response-lifecycle.js.map +1 -1
  98. package/dist/adapters/slack/session.d.ts.map +1 -1
  99. package/dist/adapters/slack/session.js +5 -8
  100. package/dist/adapters/slack/session.js.map +1 -1
  101. package/dist/adapters/slack/tool-pack.d.ts +11 -0
  102. package/dist/adapters/slack/tool-pack.d.ts.map +1 -0
  103. package/dist/adapters/slack/tool-pack.js +45 -0
  104. package/dist/adapters/slack/tool-pack.js.map +1 -0
  105. package/dist/adapters/slack/tools/blockkit.d.ts +14 -0
  106. package/dist/adapters/slack/tools/blockkit.d.ts.map +1 -0
  107. package/dist/adapters/slack/tools/blockkit.js +106 -0
  108. package/dist/adapters/slack/tools/blockkit.js.map +1 -0
  109. package/dist/adapters/slack/types.d.ts +37 -0
  110. package/dist/adapters/slack/types.d.ts.map +1 -1
  111. package/dist/adapters/slack/types.js.map +1 -1
  112. package/dist/adapters/telegram/bot.d.ts +1 -2
  113. package/dist/adapters/telegram/bot.d.ts.map +1 -1
  114. package/dist/adapters/telegram/bot.js +51 -63
  115. package/dist/adapters/telegram/bot.js.map +1 -1
  116. package/dist/adapters/telegram/context.d.ts.map +1 -1
  117. package/dist/adapters/telegram/context.js +55 -182
  118. package/dist/adapters/telegram/context.js.map +1 -1
  119. package/dist/adapters/types.d.ts +86 -10
  120. package/dist/adapters/types.d.ts.map +1 -1
  121. package/dist/adapters/types.js.map +1 -1
  122. package/dist/agent.d.ts +14 -19
  123. package/dist/agent.d.ts.map +1 -1
  124. package/dist/agent.js +745 -243
  125. package/dist/agent.js.map +1 -1
  126. package/dist/cli/arg-grammar.d.ts +25 -0
  127. package/dist/cli/arg-grammar.d.ts.map +1 -0
  128. package/dist/cli/arg-grammar.js +59 -0
  129. package/dist/cli/arg-grammar.js.map +1 -0
  130. package/dist/cli/boot.d.ts +5 -0
  131. package/dist/cli/boot.d.ts.map +1 -0
  132. package/dist/cli/boot.js +112 -0
  133. package/dist/cli/boot.js.map +1 -0
  134. package/dist/cli/download.d.ts.map +1 -0
  135. package/dist/cli/download.js.map +1 -0
  136. package/dist/cli/ext-dev.d.ts +2 -0
  137. package/dist/cli/ext-dev.d.ts.map +1 -0
  138. package/dist/cli/ext-dev.js +177 -0
  139. package/dist/cli/ext-dev.js.map +1 -0
  140. package/dist/cli/ext-git.d.ts +17 -0
  141. package/dist/cli/ext-git.d.ts.map +1 -0
  142. package/dist/cli/ext-git.js +107 -0
  143. package/dist/cli/ext-git.js.map +1 -0
  144. package/dist/cli/ext.d.ts +2 -0
  145. package/dist/cli/ext.d.ts.map +1 -0
  146. package/dist/cli/ext.js +222 -0
  147. package/dist/cli/ext.js.map +1 -0
  148. package/dist/cli/types.d.ts +20 -0
  149. package/dist/cli/types.d.ts.map +1 -0
  150. package/dist/cli/types.js +2 -0
  151. package/dist/cli/types.js.map +1 -0
  152. package/dist/commands/admin.d.ts.map +1 -1
  153. package/dist/commands/admin.js +2 -1
  154. package/dist/commands/admin.js.map +1 -1
  155. package/dist/commands/auto-reply.d.ts.map +1 -1
  156. package/dist/commands/auto-reply.js +2 -6
  157. package/dist/commands/auto-reply.js.map +1 -1
  158. package/dist/commands/extensions.d.ts.map +1 -1
  159. package/dist/commands/extensions.js +18 -8
  160. package/dist/commands/extensions.js.map +1 -1
  161. package/dist/commands/login.d.ts +2 -1
  162. package/dist/commands/login.d.ts.map +1 -1
  163. package/dist/commands/login.js +35 -3
  164. package/dist/commands/login.js.map +1 -1
  165. package/dist/commands/manifest.d.ts +30 -0
  166. package/dist/commands/manifest.d.ts.map +1 -0
  167. package/dist/commands/manifest.js +121 -0
  168. package/dist/commands/manifest.js.map +1 -0
  169. package/dist/commands/model.d.ts +2 -3
  170. package/dist/commands/model.d.ts.map +1 -1
  171. package/dist/commands/model.js +57 -20
  172. package/dist/commands/model.js.map +1 -1
  173. package/dist/commands/new.d.ts.map +1 -1
  174. package/dist/commands/new.js +10 -2
  175. package/dist/commands/new.js.map +1 -1
  176. package/dist/commands/registry.d.ts +2 -2
  177. package/dist/commands/registry.d.ts.map +1 -1
  178. package/dist/commands/registry.js +1 -2
  179. package/dist/commands/registry.js.map +1 -1
  180. package/dist/commands/sandbox.d.ts.map +1 -1
  181. package/dist/commands/sandbox.js +23 -17
  182. package/dist/commands/sandbox.js.map +1 -1
  183. package/dist/commands/text.d.ts +2 -0
  184. package/dist/commands/text.d.ts.map +1 -0
  185. package/dist/commands/text.js +16 -0
  186. package/dist/commands/text.js.map +1 -0
  187. package/dist/commands/types.d.ts +70 -2
  188. package/dist/commands/types.d.ts.map +1 -1
  189. package/dist/commands/types.js.map +1 -1
  190. package/dist/config.d.ts +1 -3
  191. package/dist/config.d.ts.map +1 -1
  192. package/dist/config.js +102 -95
  193. package/dist/config.js.map +1 -1
  194. package/dist/env-manifest.d.ts +28 -0
  195. package/dist/env-manifest.d.ts.map +1 -0
  196. package/dist/env-manifest.js +214 -0
  197. package/dist/env-manifest.js.map +1 -0
  198. package/dist/events.d.ts.map +1 -1
  199. package/dist/events.js +9 -73
  200. package/dist/events.js.map +1 -1
  201. package/dist/execution-resolver.d.ts +7 -6
  202. package/dist/execution-resolver.d.ts.map +1 -1
  203. package/dist/execution-resolver.js +105 -110
  204. package/dist/execution-resolver.js.map +1 -1
  205. package/dist/harness/auth.d.ts +2 -1
  206. package/dist/harness/auth.d.ts.map +1 -1
  207. package/dist/harness/auth.js +6 -0
  208. package/dist/harness/auth.js.map +1 -1
  209. package/dist/harness/event-format.d.ts +25 -0
  210. package/dist/harness/event-format.d.ts.map +1 -0
  211. package/dist/harness/event-format.js +159 -0
  212. package/dist/harness/event-format.js.map +1 -0
  213. package/dist/harness/extensions/blockkit.d.ts +19 -0
  214. package/dist/harness/extensions/blockkit.d.ts.map +1 -0
  215. package/dist/harness/extensions/blockkit.js +42 -0
  216. package/dist/harness/extensions/blockkit.js.map +1 -0
  217. package/dist/harness/extensions/loader.d.ts +25 -48
  218. package/dist/harness/extensions/loader.d.ts.map +1 -1
  219. package/dist/harness/extensions/loader.js +373 -113
  220. package/dist/harness/extensions/loader.js.map +1 -1
  221. package/dist/harness/extensions/registry.d.ts +75 -2
  222. package/dist/harness/extensions/registry.d.ts.map +1 -1
  223. package/dist/harness/extensions/registry.js +239 -0
  224. package/dist/harness/extensions/registry.js.map +1 -1
  225. package/dist/harness/extensions/types.d.ts +318 -25
  226. package/dist/harness/extensions/types.d.ts.map +1 -1
  227. package/dist/harness/extensions/types.js.map +1 -1
  228. package/dist/harness/index.d.ts +18 -8
  229. package/dist/harness/index.d.ts.map +1 -1
  230. package/dist/harness/index.js +7 -4
  231. package/dist/harness/index.js.map +1 -1
  232. package/dist/harness/models.d.ts +7 -4
  233. package/dist/harness/models.d.ts.map +1 -1
  234. package/dist/harness/models.js +10 -0
  235. package/dist/harness/models.js.map +1 -1
  236. package/dist/harness/runner.d.ts +50 -54
  237. package/dist/harness/runner.d.ts.map +1 -1
  238. package/dist/harness/runner.js +230 -44
  239. package/dist/harness/runner.js.map +1 -1
  240. package/dist/harness/session-store.d.ts +9 -5
  241. package/dist/harness/session-store.d.ts.map +1 -1
  242. package/dist/harness/session-store.js +131 -30
  243. package/dist/harness/session-store.js.map +1 -1
  244. package/dist/harness/settings.d.ts +2 -20
  245. package/dist/harness/settings.d.ts.map +1 -1
  246. package/dist/harness/settings.js +11 -0
  247. package/dist/harness/settings.js.map +1 -1
  248. package/dist/harness/skills.d.ts +2 -29
  249. package/dist/harness/skills.d.ts.map +1 -1
  250. package/dist/harness/skills.js.map +1 -1
  251. package/dist/harness/subagent-profiles.d.ts +8 -0
  252. package/dist/harness/subagent-profiles.d.ts.map +1 -0
  253. package/dist/harness/subagent-profiles.js +290 -0
  254. package/dist/harness/subagent-profiles.js.map +1 -0
  255. package/dist/harness/subagent-runner.d.ts +39 -0
  256. package/dist/harness/subagent-runner.d.ts.map +1 -0
  257. package/dist/harness/subagent-runner.js +615 -0
  258. package/dist/harness/subagent-runner.js.map +1 -0
  259. package/dist/harness/types.d.ts +263 -1
  260. package/dist/harness/types.d.ts.map +1 -1
  261. package/dist/harness/types.js.map +1 -1
  262. package/dist/harness/usage.d.ts +6 -0
  263. package/dist/harness/usage.d.ts.map +1 -0
  264. package/dist/harness/usage.js +32 -0
  265. package/dist/harness/usage.js.map +1 -0
  266. package/dist/index.d.ts +33 -8
  267. package/dist/index.d.ts.map +1 -1
  268. package/dist/index.js +20 -6
  269. package/dist/index.js.map +1 -1
  270. package/dist/main.js +253 -109
  271. package/dist/main.js.map +1 -1
  272. package/dist/observability/instrument.js +6 -4
  273. package/dist/observability/instrument.js.map +1 -1
  274. package/dist/observability/sentry.d.ts.map +1 -1
  275. package/dist/observability/sentry.js +3 -2
  276. package/dist/observability/sentry.js.map +1 -1
  277. package/dist/packages/admin.d.ts +17 -0
  278. package/dist/packages/admin.d.ts.map +1 -0
  279. package/dist/packages/admin.js +96 -0
  280. package/dist/packages/admin.js.map +1 -0
  281. package/dist/packages/index.d.ts +6 -0
  282. package/dist/packages/index.d.ts.map +1 -0
  283. package/dist/packages/index.js +6 -0
  284. package/dist/packages/index.js.map +1 -0
  285. package/dist/packages/inspect.d.ts +11 -0
  286. package/dist/packages/inspect.d.ts.map +1 -0
  287. package/dist/packages/inspect.js +100 -0
  288. package/dist/packages/inspect.js.map +1 -0
  289. package/dist/packages/materialize.d.ts +39 -0
  290. package/dist/packages/materialize.d.ts.map +1 -0
  291. package/dist/packages/materialize.js +300 -0
  292. package/dist/packages/materialize.js.map +1 -0
  293. package/dist/packages/resolve.d.ts +25 -0
  294. package/dist/packages/resolve.d.ts.map +1 -0
  295. package/dist/packages/resolve.js +212 -0
  296. package/dist/packages/resolve.js.map +1 -0
  297. package/dist/packages/source.d.ts +33 -0
  298. package/dist/packages/source.d.ts.map +1 -0
  299. package/dist/packages/source.js +177 -0
  300. package/dist/packages/source.js.map +1 -0
  301. package/dist/packages/types.d.ts +104 -0
  302. package/dist/packages/types.d.ts.map +1 -0
  303. package/dist/packages/types.js +2 -0
  304. package/dist/packages/types.js.map +1 -0
  305. package/dist/provisioner.d.ts.map +1 -1
  306. package/dist/provisioner.js +6 -6
  307. package/dist/provisioner.js.map +1 -1
  308. package/dist/runtime/conversation-runtime.d.ts +1 -1
  309. package/dist/runtime/conversation-runtime.d.ts.map +1 -1
  310. package/dist/runtime/conversation-runtime.js +481 -98
  311. package/dist/runtime/conversation-runtime.js.map +1 -1
  312. package/dist/runtime/session-lifecycle.d.ts +28 -0
  313. package/dist/runtime/session-lifecycle.d.ts.map +1 -0
  314. package/dist/runtime/session-lifecycle.js +161 -0
  315. package/dist/runtime/session-lifecycle.js.map +1 -0
  316. package/dist/runtime/types.d.ts +45 -5
  317. package/dist/runtime/types.d.ts.map +1 -1
  318. package/dist/runtime/types.js.map +1 -1
  319. package/dist/sandbox/cloudflare.d.ts +3 -0
  320. package/dist/sandbox/cloudflare.d.ts.map +1 -1
  321. package/dist/sandbox/cloudflare.js +11 -0
  322. package/dist/sandbox/cloudflare.js.map +1 -1
  323. package/dist/sandbox/container.d.ts +4 -0
  324. package/dist/sandbox/container.d.ts.map +1 -1
  325. package/dist/sandbox/container.js +12 -2
  326. package/dist/sandbox/container.js.map +1 -1
  327. package/dist/sandbox/firecracker.d.ts +3 -0
  328. package/dist/sandbox/firecracker.d.ts.map +1 -1
  329. package/dist/sandbox/firecracker.js +11 -1
  330. package/dist/sandbox/firecracker.js.map +1 -1
  331. package/dist/sandbox/gondolin.d.ts +57 -0
  332. package/dist/sandbox/gondolin.d.ts.map +1 -0
  333. package/dist/sandbox/gondolin.js +764 -0
  334. package/dist/sandbox/gondolin.js.map +1 -0
  335. package/dist/sandbox/host.d.ts +4 -0
  336. package/dist/sandbox/host.d.ts.map +1 -1
  337. package/dist/sandbox/host.js +52 -0
  338. package/dist/sandbox/host.js.map +1 -1
  339. package/dist/sandbox/identity.d.ts +16 -0
  340. package/dist/sandbox/identity.d.ts.map +1 -0
  341. package/dist/sandbox/identity.js +42 -0
  342. package/dist/sandbox/identity.js.map +1 -0
  343. package/dist/sandbox/image.d.ts.map +1 -1
  344. package/dist/sandbox/image.js +1 -0
  345. package/dist/sandbox/image.js.map +1 -1
  346. package/dist/sandbox/index.d.ts +15 -4
  347. package/dist/sandbox/index.d.ts.map +1 -1
  348. package/dist/sandbox/index.js +25 -3
  349. package/dist/sandbox/index.js.map +1 -1
  350. package/dist/sandbox/path-context.js +18 -8
  351. package/dist/sandbox/path-context.js.map +1 -1
  352. package/dist/sandbox/types.d.ts +65 -1
  353. package/dist/sandbox/types.d.ts.map +1 -1
  354. package/dist/sandbox/types.js.map +1 -1
  355. package/dist/sandbox/utils.d.ts +12 -0
  356. package/dist/sandbox/utils.d.ts.map +1 -1
  357. package/dist/sandbox/utils.js +38 -0
  358. package/dist/sandbox/utils.js.map +1 -1
  359. package/dist/sessions/chat-history-sync.d.ts +25 -0
  360. package/dist/sessions/chat-history-sync.d.ts.map +1 -0
  361. package/dist/sessions/{agent-memory-file-manager.js → chat-history-sync.js} +98 -124
  362. package/dist/sessions/chat-history-sync.js.map +1 -0
  363. package/dist/sessions/conversation-log.d.ts +9 -0
  364. package/dist/sessions/conversation-log.d.ts.map +1 -0
  365. package/dist/sessions/conversation-log.js +47 -0
  366. package/dist/sessions/conversation-log.js.map +1 -0
  367. package/dist/sessions/history-line.d.ts +20 -0
  368. package/dist/sessions/history-line.d.ts.map +1 -0
  369. package/dist/sessions/history-line.js +24 -0
  370. package/dist/sessions/history-line.js.map +1 -0
  371. package/dist/sessions/policy.d.ts.map +1 -1
  372. package/dist/sessions/policy.js +5 -3
  373. package/dist/sessions/policy.js.map +1 -1
  374. package/dist/sessions/rotation.d.ts +2 -0
  375. package/dist/sessions/rotation.d.ts.map +1 -0
  376. package/dist/sessions/rotation.js +39 -0
  377. package/dist/sessions/rotation.js.map +1 -0
  378. package/dist/sessions/session-key.d.ts +40 -0
  379. package/dist/sessions/session-key.d.ts.map +1 -0
  380. package/dist/sessions/session-key.js +92 -0
  381. package/dist/sessions/session-key.js.map +1 -0
  382. package/dist/sessions/store.d.ts.map +1 -1
  383. package/dist/sessions/store.js +40 -18
  384. package/dist/sessions/store.js.map +1 -1
  385. package/dist/sessions/types.d.ts +17 -4
  386. package/dist/sessions/types.d.ts.map +1 -1
  387. package/dist/sessions/types.js.map +1 -1
  388. package/dist/settings-mutation.d.ts +8 -0
  389. package/dist/settings-mutation.d.ts.map +1 -0
  390. package/dist/settings-mutation.js +43 -0
  391. package/dist/settings-mutation.js.map +1 -0
  392. package/dist/subagent-progress.d.ts +43 -0
  393. package/dist/subagent-progress.d.ts.map +1 -0
  394. package/dist/subagent-progress.js +220 -0
  395. package/dist/subagent-progress.js.map +1 -0
  396. package/dist/tools/bash.d.ts +3 -1
  397. package/dist/tools/bash.d.ts.map +1 -1
  398. package/dist/tools/bash.js +25 -17
  399. package/dist/tools/bash.js.map +1 -1
  400. package/dist/tools/edit.d.ts.map +1 -1
  401. package/dist/tools/edit.js +10 -12
  402. package/dist/tools/edit.js.map +1 -1
  403. package/dist/tools/event.d.ts +1 -1
  404. package/dist/tools/event.d.ts.map +1 -1
  405. package/dist/tools/event.js +53 -43
  406. package/dist/tools/event.js.map +1 -1
  407. package/dist/tools/generate-image.d.ts +17 -0
  408. package/dist/tools/generate-image.d.ts.map +1 -0
  409. package/dist/tools/generate-image.js +63 -0
  410. package/dist/tools/generate-image.js.map +1 -0
  411. package/dist/tools/host-fn-tool.d.ts +21 -0
  412. package/dist/tools/host-fn-tool.d.ts.map +1 -0
  413. package/dist/tools/host-fn-tool.js +32 -0
  414. package/dist/tools/host-fn-tool.js.map +1 -0
  415. package/dist/tools/index.d.ts +14 -2
  416. package/dist/tools/index.d.ts.map +1 -1
  417. package/dist/tools/index.js +28 -3
  418. package/dist/tools/index.js.map +1 -1
  419. package/dist/tools/react.d.ts +15 -0
  420. package/dist/tools/react.d.ts.map +1 -0
  421. package/dist/tools/react.js +29 -0
  422. package/dist/tools/react.js.map +1 -0
  423. package/dist/tools/read.d.ts +1 -0
  424. package/dist/tools/read.d.ts.map +1 -1
  425. package/dist/tools/read.js +37 -31
  426. package/dist/tools/read.js.map +1 -1
  427. package/dist/tools/sandbox.d.ts +2 -2
  428. package/dist/tools/sandbox.d.ts.map +1 -1
  429. package/dist/tools/sandbox.js +14 -9
  430. package/dist/tools/sandbox.js.map +1 -1
  431. package/dist/tools/subagent-slots.d.ts +28 -0
  432. package/dist/tools/subagent-slots.d.ts.map +1 -0
  433. package/dist/tools/subagent-slots.js +72 -0
  434. package/dist/tools/subagent-slots.js.map +1 -0
  435. package/dist/tools/subagent.d.ts +54 -0
  436. package/dist/tools/subagent.d.ts.map +1 -0
  437. package/dist/tools/subagent.js +401 -0
  438. package/dist/tools/subagent.js.map +1 -0
  439. package/dist/tools/types.d.ts +40 -6
  440. package/dist/tools/types.d.ts.map +1 -1
  441. package/dist/tools/types.js.map +1 -1
  442. package/dist/tools/write.d.ts.map +1 -1
  443. package/dist/tools/write.js +2 -8
  444. package/dist/tools/write.js.map +1 -1
  445. package/dist/trigger.d.ts.map +1 -1
  446. package/dist/trigger.js +1 -2
  447. package/dist/trigger.js.map +1 -1
  448. package/dist/types.d.ts +232 -32
  449. package/dist/types.d.ts.map +1 -1
  450. package/dist/types.js.map +1 -1
  451. package/dist/utils/date.d.ts +1 -1
  452. package/dist/utils/date.js +1 -1
  453. package/dist/utils/date.js.map +1 -1
  454. package/dist/vault/disabled.d.ts +9 -0
  455. package/dist/vault/disabled.d.ts.map +1 -0
  456. package/dist/vault/disabled.js +22 -0
  457. package/dist/vault/disabled.js.map +1 -0
  458. package/dist/vault/index.d.ts +0 -2
  459. package/dist/vault/index.d.ts.map +1 -1
  460. package/dist/vault/index.js +30 -33
  461. package/dist/vault/index.js.map +1 -1
  462. package/dist/vault/injection.d.ts +10 -0
  463. package/dist/vault/injection.d.ts.map +1 -0
  464. package/dist/vault/injection.js +30 -0
  465. package/dist/vault/injection.js.map +1 -0
  466. package/dist/vault/policy.d.ts +20 -0
  467. package/dist/vault/policy.d.ts.map +1 -0
  468. package/dist/vault/policy.js +20 -0
  469. package/dist/vault/policy.js.map +1 -0
  470. package/dist/vault/types.d.ts +4 -2
  471. package/dist/vault/types.d.ts.map +1 -1
  472. package/dist/vault/types.js.map +1 -1
  473. package/dist/web/admin/portal.d.ts +17 -2
  474. package/dist/web/admin/portal.d.ts.map +1 -1
  475. package/dist/web/admin/portal.js +385 -155
  476. package/dist/web/admin/portal.js.map +1 -1
  477. package/dist/web/admin/types.d.ts +18 -0
  478. package/dist/web/admin/types.d.ts.map +1 -1
  479. package/dist/web/admin/types.js.map +1 -1
  480. package/dist/web/agent-events/portal.d.ts.map +1 -1
  481. package/dist/web/agent-events/portal.js +2 -1
  482. package/dist/web/agent-events/portal.js.map +1 -1
  483. package/dist/web/login/oauth.d.ts +2 -3
  484. package/dist/web/login/oauth.d.ts.map +1 -1
  485. package/dist/web/login/oauth.js +0 -31
  486. package/dist/web/login/oauth.js.map +1 -1
  487. package/dist/web/login/portal.js +1 -1
  488. package/dist/web/login/portal.js.map +1 -1
  489. package/dist/web/login/types.d.ts +0 -11
  490. package/dist/web/login/types.d.ts.map +1 -1
  491. package/dist/web/login/types.js.map +1 -1
  492. package/dist/web/portal-shell.d.ts +4 -0
  493. package/dist/web/portal-shell.d.ts.map +1 -0
  494. package/dist/{portal-shell.js → web/portal-shell.js} +2 -2
  495. package/dist/web/portal-shell.js.map +1 -0
  496. package/dist/web/server.d.ts.map +1 -1
  497. package/dist/web/server.js +7 -0
  498. package/dist/web/server.js.map +1 -1
  499. package/dist/web/session-view/command.d.ts.map +1 -1
  500. package/dist/web/session-view/command.js +4 -1
  501. package/dist/web/session-view/command.js.map +1 -1
  502. package/dist/web/session-view/portal.d.ts.map +1 -1
  503. package/dist/web/session-view/portal.js +4 -3
  504. package/dist/web/session-view/portal.js.map +1 -1
  505. package/dist/web/session-view/service.d.ts.map +1 -1
  506. package/dist/web/session-view/service.js +2 -1
  507. package/dist/web/session-view/service.js.map +1 -1
  508. package/dist/web/session-view/types.d.ts +2 -1
  509. package/dist/web/session-view/types.d.ts.map +1 -1
  510. package/dist/web/session-view/types.js.map +1 -1
  511. package/dist/workspace-projection/index.d.ts +5 -0
  512. package/dist/workspace-projection/index.d.ts.map +1 -0
  513. package/dist/workspace-projection/index.js +71 -0
  514. package/dist/workspace-projection/index.js.map +1 -0
  515. package/dist/workspace-projection/types.d.ts +7 -0
  516. package/dist/workspace-projection/types.d.ts.map +1 -0
  517. package/dist/workspace-projection/types.js +2 -0
  518. package/dist/workspace-projection/types.js.map +1 -0
  519. package/package.json +28 -15
  520. package/dist/adapters/streaming.d.ts +0 -18
  521. package/dist/adapters/streaming.d.ts.map +0 -1
  522. package/dist/adapters/streaming.js +0 -44
  523. package/dist/adapters/streaming.js.map +0 -1
  524. package/dist/download.d.ts.map +0 -1
  525. package/dist/download.js.map +0 -1
  526. package/dist/model-registry.d.ts +0 -4
  527. package/dist/model-registry.d.ts.map +0 -1
  528. package/dist/model-registry.js +0 -7
  529. package/dist/model-registry.js.map +0 -1
  530. package/dist/portal-shell.d.ts +0 -4
  531. package/dist/portal-shell.d.ts.map +0 -1
  532. package/dist/portal-shell.js.map +0 -1
  533. package/dist/runtime/agent-run-controller.d.ts +0 -31
  534. package/dist/runtime/agent-run-controller.d.ts.map +0 -1
  535. package/dist/runtime/agent-run-controller.js +0 -195
  536. package/dist/runtime/agent-run-controller.js.map +0 -1
  537. package/dist/sessions/agent-memory-file-manager.d.ts +0 -19
  538. package/dist/sessions/agent-memory-file-manager.d.ts.map +0 -1
  539. package/dist/sessions/agent-memory-file-manager.js.map +0 -1
  540. package/dist/vault/routing.d.ts +0 -3
  541. package/dist/vault/routing.d.ts.map +0 -1
  542. package/dist/vault/routing.js +0 -13
  543. package/dist/vault/routing.js.map +0 -1
  544. /package/dist/{download.d.ts → cli/download.d.ts} +0 -0
  545. /package/dist/{download.js → cli/download.js} +0 -0
@@ -1,22 +1,28 @@
1
1
  import { SocketModeClient } from "@slack/socket-mode";
2
- import { WebClient } from "@slack/web-api";
2
+ import { WebAPIRateLimitedError, 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 { COMMAND_MANIFEST } from "../../commands/manifest.js";
6
7
  import { resolveConversationSettings } from "../../config.js";
8
+ import { parseExtActionId } from "../../harness/extensions/blockkit.js";
7
9
  import * as log from "../../log.js";
8
- import { PRODUCT_NAME, formatForceStopped, formatNothingRunning } from "../../platform-messages.js";
9
- import { appendBotResponseLog, appendChannelLog, MessagingEventQueue, resolveOnlyScopedStopTarget, resolveStopTarget, withRetry, } from "../shared.js";
10
+ import { isRecord, readTextFileIfExists } from "../../utils/file-guards.js";
11
+ import { PRODUCT_NAME, formatForceStopped } from "../../platform-messages.js";
12
+ import { appendBotResponseLog, appendChannelLog, MessagingEventQueue, withRetry, } from "../shared.js";
10
13
  import { processMessageIntake } from "../intake.js";
11
14
  import { createSlackAdapters } from "./context.js";
12
- import { hasMaterializedChatSession, registerThreadSession, } from "../../sessions/agent-memory-file-manager.js";
15
+ import { hasMaterializedChatSession, registerThreadSession, } from "../../sessions/chat-history-sync.js";
16
+ import { conversationIdOf } from "../../sessions/session-key.js";
13
17
  import { isSlackThreadSessionKey, planSlackAdapterSession, planSlackEventAnchorRun, resolveSlackSessionKey, } from "./session.js";
14
18
  import { reportUserFacingError } from "../../observability/sentry.js";
15
19
  import { renderSlackBlocks } from "./blocks.js";
16
20
  const SLACK_EVENT_ANCHOR_TEXT = "Working on it...";
17
- // Slack WebClient errors carry either `code: "rate_limited"` (retry-after) or
18
- // the legacy `data.error === "rate_limited"` / 429 status shape.
21
+ // web-api v8 throws WebAPIRateLimitedError; the duck-typed shapes cover
22
+ // platform `data.error === "rate_limited"` / 429 responses and older callers.
19
23
  function slackIsRateLimited(err) {
24
+ if (err instanceof WebAPIRateLimitedError)
25
+ return true;
20
26
  if (err.code === "rate_limited")
21
27
  return true;
22
28
  const data = err.data;
@@ -152,6 +158,21 @@ export class SlackMessagingBot {
152
158
  return result.ts;
153
159
  });
154
160
  }
161
+ async addReaction(channel, messageTs, emoji) {
162
+ // Slack reaction names are colon-free short names; strip any wrapping colons.
163
+ const name = emoji.replace(/^:|:$/g, "");
164
+ await slackRetry(async () => {
165
+ try {
166
+ await this.webClient.reactions.add({ channel, timestamp: messageTs, name });
167
+ }
168
+ catch (err) {
169
+ // Re-reacting with the same emoji is not an error worth surfacing.
170
+ if (err?.data?.error === "already_reacted")
171
+ return;
172
+ throw err;
173
+ }
174
+ });
175
+ }
155
176
  async postEphemeral(channel, user, text, threadTs) {
156
177
  return slackRetry(async () => {
157
178
  await this.webClient.chat.postEphemeral({
@@ -180,6 +201,11 @@ export class SlackMessagingBot {
180
201
  return result.ts;
181
202
  });
182
203
  }
204
+ async updateMessageBlocks(channel, ts, text, blocks) {
205
+ return slackRetry(async () => {
206
+ await this.webClient.chat.update({ channel, ts, text, blocks: blocks });
207
+ });
208
+ }
183
209
  async postPrivate(conversationId, userId, text) {
184
210
  await this.postEphemeral(conversationId, userId, text);
185
211
  }
@@ -294,10 +320,31 @@ export class SlackMessagingBot {
294
320
  ...(slackBlocks ? { slackBlocks } : {}),
295
321
  });
296
322
  }
323
+ ownsBlockKitMessage(channel, ts, threadTs) {
324
+ const content = readTextFileIfExists(join(this.workingDir, channel, "log.jsonl"));
325
+ if (content === undefined)
326
+ return false;
327
+ for (const line of content.trim().split("\n").toReversed()) {
328
+ try {
329
+ const entry = JSON.parse(line);
330
+ if (!isRecord(entry) || entry.ts !== ts)
331
+ continue;
332
+ return (entry.isMessagingBot === true &&
333
+ entry.platform === "slack" &&
334
+ Array.isArray(entry.slackBlocks) &&
335
+ entry.threadTs === threadTs);
336
+ }
337
+ catch {
338
+ continue;
339
+ }
340
+ }
341
+ return false;
342
+ }
297
343
  getMessagingInfo() {
298
344
  return {
299
345
  name: "slack",
300
- formattingGuide: "## Slack Formatting (mrkdwn, NOT Markdown)\nBold: *text*, Italic: _text_, Code: `code`, Block: ```code```, Links: <url|text>\nDo NOT use **double asterisks** or [markdown](links).",
346
+ trustModel: "membership",
347
+ 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.",
301
348
  channels: this.getAllChannels().map((c) => ({ id: c.id, name: c.name })),
302
349
  users: this.getAllUsers().map((u) => ({
303
350
  id: u.id,
@@ -410,10 +457,17 @@ export class SlackMessagingBot {
410
457
  });
411
458
  }
412
459
  processSlackMessageIntake(options) {
413
- void processMessageIntake({
460
+ const absorbAttachmentFailure = () => {
461
+ void options.attachmentsPromise.catch((err) => {
462
+ log.logWarning("Failed to log Slack message", String(err));
463
+ });
464
+ };
465
+ processMessageIntake({
414
466
  eventBase: options.event,
415
467
  workingDir: this.workingDir,
416
468
  isAutoReplyCandidate: options.isAutoReplyCandidate,
469
+ magicWord: { addressed: options.addressed, scopeFallback: "top-level" },
470
+ busyPolicy: "queue",
417
471
  logEntryBase: {},
418
472
  processAttachments: () => options.attachmentsPromise,
419
473
  queueKey: options.queueKey,
@@ -421,8 +475,15 @@ export class SlackMessagingBot {
421
475
  handler: this.handler,
422
476
  bot: this,
423
477
  createContext: (event) => this.createContext(event),
424
- onNotTriggered: options.onNotTriggered,
425
478
  deferAttachmentsUntilRun: true,
479
+ }).then((outcome) => {
480
+ // Slack logs eagerly via logUserMessage; when intake does not enqueue,
481
+ // nothing awaits the attachment download, so absorb its failure here.
482
+ if (outcome !== "enqueued")
483
+ absorbAttachmentFailure();
484
+ }, (err) => {
485
+ log.logWarning("Slack message intake failed", String(err));
486
+ absorbAttachmentFailure();
426
487
  });
427
488
  }
428
489
  buildHomeView() {
@@ -460,7 +521,7 @@ export class SlackMessagingBot {
460
521
  // Threshold for "stuck" detection (10 minutes)
461
522
  const STUCK_THRESHOLD_MS = 10 * 60 * 1000;
462
523
  for (const session of runningSessions) {
463
- const channelId = session.sessionKey.split(":")[0];
524
+ const channelId = conversationIdOf(session.sessionKey);
464
525
  const channel = this.channels.get(channelId);
465
526
  const channelName = channel ? `#${channel.name}` : channelId;
466
527
  const elapsed = Math.floor((Date.now() - session.startedAt) / 60000);
@@ -500,7 +561,14 @@ export class SlackMessagingBot {
500
561
  {
501
562
  type: "button",
502
563
  text: { type: "plain_text", text: "Force Stop", emoji: true },
564
+ // The raw session key travels in `value` (Slack returns it
565
+ // verbatim); the action_id only routes and must be unique per
566
+ // view, so it carries a sanitized copy of the key. Never
567
+ // decode the key from the action_id — the `:`↔`_` rewrite is
568
+ // irreversible for conversation ids that contain `_` (GitHub's
569
+ // GH_owner_repo_number do, by design).
503
570
  action_id: `force_stop_${session.sessionKey.replace(/:/g, "_")}`,
571
+ value: session.sessionKey,
504
572
  style: "danger",
505
573
  },
506
574
  ],
@@ -559,22 +627,6 @@ export class SlackMessagingBot {
559
627
  });
560
628
  return { type: "home", blocks: blocks };
561
629
  }
562
- resolveStopTarget(channelId, threadTs) {
563
- const directTarget = resolveStopTarget({
564
- handler: this.handler,
565
- conversationId: channelId,
566
- sessionKey: resolveSlackSessionKey(channelId, threadTs),
567
- });
568
- if (directTarget)
569
- return directTarget;
570
- if (threadTs)
571
- return null;
572
- return resolveOnlyScopedStopTarget(this.handler, channelId);
573
- }
574
- isStopText(text) {
575
- const normalized = text.trim().toLowerCase();
576
- return normalized === "stop" || normalized === "/stop";
577
- }
578
630
  createCommandAdapters(conversationId, userId, userName, text, ts, options = {}) {
579
631
  const message = {
580
632
  id: ts,
@@ -665,10 +717,23 @@ export class SlackMessagingBot {
665
717
  const context = this.createCommandAdapters(conversationId, payload.user_id, userName, commandText, eventTs, isDirectMessage ? { threadTs } : { ephemeralChannelId: conversationId, threadTs });
666
718
  return { event, context };
667
719
  }
668
- async routeSlashLoginCommand(payload) {
720
+ /**
721
+ * Generic slash-command route: synthesize the command text per the
722
+ * manifest's SlackSlashRoute data and dispatch to the handler. `/pi-new`
723
+ * stays bespoke (routeSlashNewCommand) because it replies in 中文 and calls
724
+ * handleNewCommand directly.
725
+ */
726
+ async routeSlashCommand(route, payload) {
669
727
  const { event, context } = this.buildSlashCommandEvent(payload, {
670
- type: payload.channel_id.startsWith("D") ? "dm" : "private_command",
671
- includeText: true,
728
+ includeText: route.includeText,
729
+ thread: route.thread,
730
+ ...(route.privateCommand
731
+ ? {
732
+ type: payload.channel_id.startsWith("D")
733
+ ? "dm"
734
+ : "private_command",
735
+ }
736
+ : {}),
672
737
  });
673
738
  await this.handler.handleEvent(event, this, context);
674
739
  }
@@ -697,19 +762,19 @@ export class SlackMessagingBot {
697
762
  enqueueEvent: (event) => this.enqueueEvent(event),
698
763
  getMessagingInfo: () => this.getMessagingInfo(),
699
764
  };
700
- await this.handler.handleNewCommand(conversationId, conversationId, commandMessagingBot);
701
- }
702
- async routeSlashModelCommand(payload) {
703
- const { event, context } = this.buildSlashCommandEvent(payload, { includeText: true });
704
- await this.handler.handleEvent(event, this, context);
705
- }
706
- async routeSlashSessionCommand(payload) {
707
- const { event, context } = this.buildSlashCommandEvent(payload, { thread: true });
708
- await this.handler.handleEvent(event, this, context);
709
- }
710
- async routeSlashAdminCommand(payload) {
711
- const { event, context } = this.buildSlashCommandEvent(payload, { thread: true });
712
- await this.handler.handleEvent(event, this, context);
765
+ const event = {
766
+ type: "dm",
767
+ conversationId,
768
+ conversationKind: "direct",
769
+ channel: conversationId,
770
+ ts: eventTs,
771
+ user: payload.user_id,
772
+ text: payload.command,
773
+ attachments: [],
774
+ sessionKey: conversationId,
775
+ };
776
+ const context = createSlackAdapters(event, this);
777
+ await this.handler.handleNewCommand(conversationId, conversationId, commandMessagingBot, context.message, context.responder, context.platform);
713
778
  }
714
779
  setupEventHandlers() {
715
780
  this.socketClient.on("disconnect", (err) => {
@@ -761,26 +826,12 @@ export class SlackMessagingBot {
761
826
  ack();
762
827
  return;
763
828
  }
764
- // Check for stop command - execute immediately, don't queue!
765
- if (this.isStopText(slackEvent.text)) {
766
- const stopTarget = this.resolveStopTarget(e.channel, e.thread_ts);
767
- if (stopTarget) {
768
- this.handler.handleStop(stopTarget, e.channel, this);
769
- }
770
- else {
771
- this.postMessage(e.channel, formatNothingRunning("slack"));
772
- }
773
- void attachmentsPromise.catch((err) => {
774
- log.logWarning("Failed to log Slack message", String(err));
775
- });
776
- ack();
777
- return;
778
- }
779
829
  this.processSlackMessageIntake({
780
830
  event: slackEvent,
781
831
  attachmentsPromise,
782
832
  queueKey: this.resolveQueueKey(e.channel, sessionKey),
783
833
  isAutoReplyCandidate: false,
834
+ addressed: true,
784
835
  });
785
836
  ack();
786
837
  }
@@ -793,7 +844,13 @@ export class SlackMessagingBot {
793
844
  ack();
794
845
  return;
795
846
  }
796
- const isExternalMessagingBotMessage = !!e.bot_id || e.subtype === "bot_message";
847
+ // API posts made with a user token carry the posting app's bot_id/app_id
848
+ // alongside the human `user` — bot_id alone does not make the author a
849
+ // bot. Only treat the message as bot-authored when the author is not a
850
+ // known human user (bot users have is_bot=true; unknown authors stay on
851
+ // the conservative bot path so loop protection holds).
852
+ const authorIsKnownHuman = !!e.user && this.users.get(e.user)?.isBot === false;
853
+ const isExternalMessagingBotMessage = e.subtype === "bot_message" || (!!e.bot_id && !authorIsKnownHuman);
797
854
  if (isExternalMessagingBotMessage) {
798
855
  if (e.subtype !== undefined && e.subtype !== "bot_message" && e.subtype !== "file_share") {
799
856
  ack();
@@ -821,7 +878,11 @@ export class SlackMessagingBot {
821
878
  ack();
822
879
  return;
823
880
  }
824
- const isDM = e.channel_type === "im";
881
+ // message.im normally carries channel_type "im", but fall back to the
882
+ // D-prefix convention (used by handleAppMention and session keys) so a
883
+ // missing channel_type cannot silently demote a DM to an auto-reply
884
+ // candidate that never triggers.
885
+ const isDM = e.channel_type === "im" || e.channel.startsWith("D");
825
886
  const conversationKind = isDM ? "direct" : "shared";
826
887
  const isMessagingBotMention = e.text?.includes(`<@${this.botUserId}>`);
827
888
  // Skip channel @mentions - already handled by app_mention event
@@ -853,59 +914,26 @@ export class SlackMessagingBot {
853
914
  ack();
854
915
  return;
855
916
  }
856
- // Stop command for DM only (app_mention handles shared-channel "@mikan stop").
857
- if (isDM && this.isStopText(slackEvent.text)) {
858
- const stopTarget = this.resolveStopTarget(e.channel, e.thread_ts);
859
- if (stopTarget) {
860
- this.handler.handleStop(stopTarget, e.channel, this);
861
- }
862
- else {
863
- this.postMessage(e.channel, formatNothingRunning("slack"));
864
- }
917
+ if (!isDM && isThreadReply) {
865
918
  void attachmentsPromise.catch((err) => {
866
919
  log.logWarning("Failed to log Slack message", String(err));
867
920
  });
868
921
  ack();
869
922
  return;
870
923
  }
871
- const enqueueTriggered = () => {
872
- const activeSessionKey = slackEvent.sessionKey ?? resolveSlackSessionKey(e.channel, e.thread_ts);
873
- // Auto-reply top-level channel messages start with no sessionKey because
874
- // they are only candidates until the policy allows them. Once triggered,
875
- // persist the resolved key on the event; otherwise the runtime fallback
876
- // treats the message ts as a thread session (`channel:ts`) instead of the
877
- // persistent top-level channel session.
878
- slackEvent.sessionKey = activeSessionKey;
879
- this.processSlackMessageIntake({
880
- event: slackEvent,
881
- attachmentsPromise,
882
- queueKey: this.resolveQueueKey(e.channel, activeSessionKey),
883
- isAutoReplyCandidate: false,
884
- });
885
- };
886
- const logOnly = () => {
887
- void attachmentsPromise.catch((err) => {
888
- log.logWarning("Failed to log Slack message", String(err));
889
- });
890
- };
891
- if (isDM) {
892
- enqueueTriggered();
893
- ack();
894
- return;
895
- }
896
- if (isThreadReply) {
897
- logOnly();
898
- ack();
899
- return;
900
- }
901
- const activeSessionKey = resolveSlackSessionKey(e.channel, e.thread_ts);
924
+ const activeSessionKey = slackEvent.sessionKey ?? resolveSlackSessionKey(e.channel, e.thread_ts);
925
+ // Auto-reply top-level channel messages start with no sessionKey because
926
+ // they are only candidates until the policy allows them. Persist the
927
+ // resolved key on the event; otherwise the runtime fallback treats the
928
+ // message ts as a thread session (`channel:ts`) instead of the persistent
929
+ // top-level channel session.
902
930
  slackEvent.sessionKey = activeSessionKey;
903
931
  this.processSlackMessageIntake({
904
932
  event: slackEvent,
905
933
  attachmentsPromise,
906
934
  queueKey: this.resolveQueueKey(e.channel, activeSessionKey),
907
- isAutoReplyCandidate: true,
908
- onNotTriggered: logOnly,
935
+ isAutoReplyCandidate: !isDM,
936
+ addressed: isDM,
909
937
  });
910
938
  ack();
911
939
  }
@@ -916,54 +944,20 @@ export class SlackMessagingBot {
916
944
  return;
917
945
  }
918
946
  const { command, text, channel_id, user_id, user_name, thread_ts } = payload;
947
+ const entry = COMMAND_MANIFEST.find((candidate) => candidate.slackCommand === command);
948
+ if (!entry)
949
+ return;
919
950
  let handlerPromise = null;
920
- if (command === "/pi-login") {
921
- handlerPromise = this.routeSlashLoginCommand({
922
- command,
923
- text,
924
- channel_id,
925
- user_id,
926
- user_name,
927
- });
928
- }
929
- else if (command === "/pi-new") {
951
+ if (entry.name === "new") {
930
952
  handlerPromise = this.routeSlashNewCommand({ command, channel_id, user_id, user_name });
931
953
  }
932
- else if (command === "/pi-session") {
933
- handlerPromise = this.routeSlashSessionCommand({
934
- command,
935
- channel_id,
936
- user_id,
937
- user_name,
938
- thread_ts,
939
- });
940
- }
941
- else if (command === "/pi-model") {
942
- handlerPromise = this.routeSlashModelCommand({
954
+ else if (entry.slackRoute) {
955
+ handlerPromise = this.routeSlashCommand(entry.slackRoute, {
943
956
  command,
944
957
  text,
945
958
  channel_id,
946
959
  user_id,
947
960
  user_name,
948
- });
949
- }
950
- else if (command === "/pi-sandbox" ||
951
- command === "/pi-auto-reply" ||
952
- command === "/pi-extensions") {
953
- handlerPromise = this.routeSlashModelCommand({
954
- command,
955
- text,
956
- channel_id,
957
- user_id,
958
- user_name,
959
- });
960
- }
961
- else if (command === "/pi-admin") {
962
- handlerPromise = this.routeSlashAdminCommand({
963
- command,
964
- channel_id,
965
- user_id,
966
- user_name,
967
961
  thread_ts,
968
962
  });
969
963
  }
@@ -1000,9 +994,12 @@ export class SlackMessagingBot {
1000
994
  return;
1001
995
  }
1002
996
  ack();
1003
- const sessionKey = action.action_id.replace("force_stop_", "").replace(/_/g, ":");
997
+ // Prefer the verbatim key from `value`; the action_id fallback only
998
+ // serves buttons rendered before `value` existed and misdecodes session
999
+ // keys whose conversation id contains "_".
1000
+ const sessionKey = action.value ?? action.action_id.replace("force_stop_", "").replace(/_/g, ":");
1004
1001
  const userId = body.user?.id;
1005
- const channelId = body.container?.channel_id || sessionKey.split(":")[0];
1002
+ const channelId = body.container?.channel_id || conversationIdOf(sessionKey);
1006
1003
  log.logInfo(`[Force Stop] User ${userId} requested force stop for ${sessionKey}`);
1007
1004
  // Use handler's forceStop method
1008
1005
  this.handler.forceStop(sessionKey);
@@ -1030,6 +1027,38 @@ export class SlackMessagingBot {
1030
1027
  const selectedOptions = Array.isArray(action.selected_options)
1031
1028
  ? action.selected_options
1032
1029
  : undefined;
1030
+ const threadTs = container.thread_ts;
1031
+ const sessionKey = resolveSlackSessionKey(channelId, threadTs);
1032
+ // Extension-owned actions (ext:<slug>: namespaced by api.blockkit.post)
1033
+ // dispatch exclusively to the extension's onAction handler — no agent
1034
+ // run, no chat-history entry. They never fall through to the model: an
1035
+ // unconsumed namespaced action means the extension is gone, and its
1036
+ // routing id would only confuse an agent run.
1037
+ const extAction = parseExtActionId(action.action_id ?? "");
1038
+ if (extAction) {
1039
+ this.getQueue(this.resolveQueueKey(channelId, sessionKey)).enqueue(async () => {
1040
+ const consumed = await this.handler.handleExtensionAction({
1041
+ conversationId: channelId,
1042
+ sessionKey,
1043
+ conversationKind: channelId.startsWith("D") ? "direct" : "shared",
1044
+ slug: extAction.slug,
1045
+ action: {
1046
+ actionId: extAction.actionId,
1047
+ value: action.value ?? selectedOption?.value ?? selectedOption?.text?.text,
1048
+ selectedValues: selectedOptions?.map((option) => option.value ?? option.text?.text ?? ""),
1049
+ userId,
1050
+ userName: body.user?.username ?? body.user?.name,
1051
+ conversationId: channelId,
1052
+ messageTs: container.message_ts,
1053
+ threadTs,
1054
+ },
1055
+ });
1056
+ if (!consumed) {
1057
+ log.logWarning(`[${channelId}] Dropped extension action ${action.action_id}`, `no handler registered by extension "${extAction.slug}"`);
1058
+ }
1059
+ });
1060
+ return;
1061
+ }
1033
1062
  const selectedText = selectedOption?.text?.text ?? selectedOption?.value;
1034
1063
  const selectedTexts = selectedOptions?.map((option) => option.text?.text ?? option.value);
1035
1064
  const valueText = selectedTexts?.length
@@ -1037,8 +1066,6 @@ export class SlackMessagingBot {
1037
1066
  : (selectedText ?? action.value ?? action.action_id);
1038
1067
  const text = `[Slack action] ${action.action_id}: ${valueText}`;
1039
1068
  const ts = `action:${Date.now()}`;
1040
- const threadTs = container.thread_ts;
1041
- const sessionKey = resolveSlackSessionKey(channelId, threadTs);
1042
1069
  this.logToFile(channelId, {
1043
1070
  date: new Date().toISOString(),
1044
1071
  ts,
@@ -1296,6 +1323,7 @@ export class SlackMessagingBot {
1296
1323
  id: u.id,
1297
1324
  userName: u.name,
1298
1325
  displayName: u.real_name || u.name,
1326
+ isBot: !!u.is_bot,
1299
1327
  });
1300
1328
  }
1301
1329
  }