@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
package/CHANGELOG.md CHANGED
@@ -9,6 +9,53 @@ any release.
9
9
 
10
10
  ## [Unreleased]
11
11
 
12
+ ## [1.0.0-beta.47]
13
+
14
+ ### Added
15
+
16
+ - Integrate OpenConnector as a host-side MCP gateway: Slack Conversation offices receive scoped runtime identities, while provider OAuth connections remain in the gateway and execution audit stays attributable to the originating conversation.
17
+ - Preserve operating guidance supplied during MCP initialization and present it to the agent with explicit system-prompt and user-intent boundaries.
18
+ - Add automatic selection of a sole OpenConnector provider connection when an action omits `connectionName`; retain explicit selection when multiple accounts exist.
19
+
20
+ ### Changed
21
+
22
+ - Gate MCP tools by the platform trust model and enforce the untrusted package boundary.
23
+ - Make platform shutdown cleanup bounded and strengthen runner/session lifecycle rollback handling.
24
+
25
+ ### Fixed
26
+
27
+ - Isolate Slack DM and thread E2E context and bound event-delivery waits.
28
+
29
+ ### Tests
30
+
31
+ - Add coverage for OpenConnector token provisioning, MCP instruction propagation, connection selection, trust gating, lifecycle cleanup, and Slack isolation.
32
+
33
+ ## [1.0.0-beta.46]
34
+
35
+ ### Added
36
+
37
+ - Add an interactive `mikan onboard` wizard that configures one chat adapter, an LLM provider, and the sandbox, writing private environment and settings files while retaining non-interactive template generation.
38
+ - Derive shared workspace visibility from platform channel privacy: Slack public channels can update shared memory, private channels receive it read-only, and DMs, external channels, unknown kinds, and other platforms stay isolated unless explicitly overridden.
39
+ - Schedule Dream maintenance for Conversation-office memory with durable evidence checkpoints.
40
+ - Add an Admin MCP Marketplace with reviewed GitHub, Context7, Playwright, Sequential Thinking, and Metabase presets; Metabase installations accept an instance endpoint and API key.
41
+
42
+ ### Changed
43
+
44
+ - Remove the executable extension system and its CLI/chat management surfaces; packages remain the supported path for deploying read-only skills.
45
+ - Remove the harness `auth.json` credential store; configure provider credentials through environment variables, onboarding, or the conversation vault.
46
+ - Remove Gondolin, Firecracker, and GitHub Cloud Build log integrations from the supported runtime surface.
47
+ - Fail closed when a sandbox backend cannot enforce an isolated office or read-only shared workspace memory; use `image:*` or explicitly select a trusted read-write projection.
48
+ - Consolidate runtime, session, adapter, web, and configuration ownership to reduce duplicate lifecycle and parsing rules.
49
+
50
+ ### Fixed
51
+
52
+ - Preserve streamed UTF-8 output when host sandbox chunks split multi-byte characters.
53
+ - Re-aim migrated session lanes at the nearest surviving ancestor when the newest v3 entry contains facts but no v4 message.
54
+
55
+ ### Tests
56
+
57
+ - Move CI action runtimes to Node 24 and strengthen runtime, presenter, workspace-projection, MCP marketplace, and session migration coverage.
58
+
12
59
  ## [1.0.0-beta.45]
13
60
 
14
61
  ### Fixed
package/README.md CHANGED
@@ -22,15 +22,15 @@ mikan keeps the chat record, agent session, and execution runtime separate:
22
22
  - **Chat / conversation data** is the platform-facing record: `log.jsonl`, attachments, and conversation files.
23
23
  - **Session orchestration** turns platform events into agent runs, handles top-level/thread scopes, and persists structured context under `sessions/*.jsonl`.
24
24
  - **mikan agent harness** (`src/harness/`, built on pi-agent-core and pi-ai) runs the model loop, session persistence, compaction, and calls mikan tools.
25
- - **Sandbox runtime** is where tool commands execute: host, Docker container/image, local Gondolin microVM, Firecracker, or Cloudflare bridge.
25
+ - **Sandbox runtime** is where tool commands execute: host, Docker container/image, or the experimental Cloudflare bridge.
26
26
  - **Vault** provides runtime credentials as env vars and mounted secret files.
27
27
 
28
28
  ## Features
29
29
 
30
30
  - **Multi-platform** — Slack, Telegram, Discord, and GitHub adapters
31
31
  - **Concurrent conversations** — Slack threads, Discord replies/threads, and Telegram reply chains run as independent sessions
32
- - **Conversation offices** — one office directory and one sandbox runtime per conversation, isolated by default; the door policy is configurable per conversation
33
- - **Sandbox execution** — host, shared container, per-conversation managed container, local Gondolin microVM (preview), Firecracker (alpha), or Cloudflare bridge (experimental)
32
+ - **Conversation offices** — one office directory and one sandbox runtime per conversation, with platform-derived workspace sharing and explicit door-policy overrides
33
+ - **Sandbox execution** — host, shared container, per-conversation managed container, or Cloudflare bridge (experimental)
34
34
  - **Credential vaults** — `/login` stores credentials under `--state-dir` and injects env into sandbox runs
35
35
  - **Web session viewer** — read-only web view of the current session via `session` / `/session`
36
36
  - **Persistent memory** — workspace-level and per-office `MEMORY.md`
@@ -118,20 +118,18 @@ Slack threads, Discord replies/threads, and Telegram reply chains are mapped to
118
118
 
119
119
  ## Sandbox
120
120
 
121
- | Mode | Description |
122
- | ---------------------------- | ----------------------------------------------------------------------------- |
123
- | `host` (default) | Run on host; no vault env injection |
124
- | `container:<name>` | Run in an existing shared container; everyone sharing it shares its one vault |
125
- | `image:<image>` | Auto-provision one Docker container and one vault per conversation office |
126
- | `gondolin:default` | Local Gondolin/QEMU microVM (preview; single-host, in mikan's own process) |
127
- | `firecracker:<vm-id>:<path>` | Firecracker microVM (alpha; not recommended) |
128
- | `cloudflare:<sandbox-id>` | Cloudflare Worker bridge (experimental; no auto workspace sync) |
121
+ | Mode | Description |
122
+ | ------------------------- | ----------------------------------------------------------------------------- |
123
+ | `host` (default) | Run on host; no vault env injection |
124
+ | `container:<name>` | Run in an existing shared container; everyone sharing it shares its one vault |
125
+ | `image:<image>` | Auto-provision one Docker container and one vault per conversation office |
126
+ | `cloudflare:<sandbox-id>` | Cloudflare Worker bridge (experimental; no auto workspace sync) |
129
127
 
130
- Each office's data view is set by its **door policy**: `isolated` (the fresh-install default only this conversation's directory is projected into the sandbox) or `trusted` with a `shared-support` or `full` layout. Change it per conversation from the admin portal or with `/pi-sandbox door <default|isolated|shared|full>`. Door policy governs data access only; execution isolation is unaffected.
128
+ Each office's data view is set by its **door policy**. Without an explicit workspace setting, Slack follows the channel kind: public channels use trusted shared support and can update workspace `MEMORY.md`; private channels can read that shared memory but receive it read-only; DMs, external channels, unknown channel kinds, and other platforms stay isolated. The admin portal or `/pi-sandbox door <default|isolated|shared|shared-private|full>` can override that result. Door policy governs data access only; execution isolation is unaffected.
131
129
 
132
- Only `image:*` and `gondolin:default` can project an isolated office, so `host` and `container:*` runs need an explicit trusted door policy otherwise the run fails with `Sandbox '<type>' cannot provide an isolated conversation office`.
130
+ Only `image:*` can enforce isolated projections and read-only shared memory. `host`, `container:*`, and `cloudflare:*` therefore fail closed for isolated or private-channel projections; an admin must either use `image:*` or explicitly select a trusted read-write layout.
133
131
 
134
- For routing, mounts, vault behavior, managed container details, and Gondolin/Firecracker/Cloudflare notes, see [src/content/docs/sandbox.mdx](src/content/docs/sandbox.mdx).
132
+ For routing, mounts, vault behavior, managed container details, and Cloudflare notes, see [src/content/docs/sandbox.mdx](src/content/docs/sandbox.mdx).
135
133
 
136
134
  ## Chat commands
137
135
 
@@ -158,11 +156,6 @@ mikan reads global settings from `<state-dir>/settings.json`; host-only per-conv
158
156
  "provider": "anthropic",
159
157
  "model": "claude-sonnet-4-6",
160
158
  "thinkingLevel": "off"
161
- },
162
- "sandbox": {
163
- "workspace": {
164
- "doorPolicy": "isolated"
165
- }
166
159
  }
167
160
  }
168
161
  ```
package/dist/adapter.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import type { ConversationEvent, ConversationMessage, OfficeAddress, PlatformName } from "./types.js";
2
- export type { MessagingBot, ConversationContext, ConversationEvent, MessagingEventHandler, ChatAdapter, ConversationMessage, ConversationResponder, ChatToolResult, ConversationKind, MessagingInfo, OfficeAddress, OfficeKey, PlatformBlockKit, PlatformDmOpener, PlatformHistoryFetcher, PlatformHistoryMessage, PlatformHistoryOptions, PlatformName, PlatformNotifier, PlatformReactor, PlatformUploader, PlatformUserInfo, PlatformUserLister, RunningSession, SubagentProgressSnapshot, } from "./types.js";
2
+ export type { MessagingBot, ConversationContext, ConversationEvent, MessagingEventHandler, HandleNewCommandOptions, ConversationMessage, ConversationResponder, ChatToolResult, ConversationKind, MessagingInfo, OfficeAddress, OfficeKey, PlatformHistoryMessage, PlatformHistoryOptions, PlatformName, PlatformUserInfo, RunningSession, SubagentProgressSnapshot, } from "./types.js";
3
3
  interface ConversationIdentityInput {
4
4
  platform: PlatformName;
5
5
  conversationId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,EACb,YAAY,EACb,MAAM,YAAY,CAAC;AAEpB,YAAY,EACV,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,EACjB,qBAAqB,EACrB,WAAW,EACX,mBAAmB,EACnB,qBAAqB,EACrB,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,SAAS,EACT,gBAAgB,EAChB,gBAAgB,EAChB,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,EACtB,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACd,wBAAwB,GACzB,MAAM,YAAY,CAAC;AAEpB,UAAU,yBAAyB;IACjC,QAAQ,EAAE,YAAY,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AAYD,8EAA8E;AAC9E,wBAAgB,uBAAuB,CACrC,CAAC,SAAS,IAAI,CAAC,iBAAiB,EAAE,SAAS,GAAG,gBAAgB,CAAC,EAC/D,KAAK,EAAE,CAAC,GAAG,yBAAyB,GAAG,CAAC,GAAG,iBAAiB,CAG7D;AAED,6EAA6E;AAC7E,wBAAgB,yBAAyB,CACvC,CAAC,SAAS,IAAI,CAAC,mBAAmB,EAAE,SAAS,GAAG,gBAAgB,CAAC,EACjE,KAAK,EAAE,CAAC,GAAG,yBAAyB,GAAG,CAAC,GAAG,mBAAmB,CAG/D"}
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,EACb,YAAY,EACb,MAAM,YAAY,CAAC;AAEpB,YAAY,EACV,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,EACjB,qBAAqB,EACrB,uBAAuB,EACvB,mBAAmB,EACnB,qBAAqB,EACrB,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,SAAS,EACT,sBAAsB,EACtB,sBAAsB,EACtB,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,wBAAwB,GACzB,MAAM,YAAY,CAAC;AAEpB,UAAU,yBAAyB;IACjC,QAAQ,EAAE,YAAY,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AAYD,8EAA8E;AAC9E,wBAAgB,uBAAuB,CACrC,CAAC,SAAS,IAAI,CAAC,iBAAiB,EAAE,SAAS,GAAG,gBAAgB,CAAC,EAC/D,KAAK,EAAE,CAAC,GAAG,yBAAyB,GAAG,CAAC,GAAG,iBAAiB,CAG7D;AAED,6EAA6E;AAC7E,wBAAgB,yBAAyB,CACvC,CAAC,SAAS,IAAI,CAAC,mBAAmB,EAAE,SAAS,GAAG,gBAAgB,CAAC,EACjE,KAAK,EAAE,CAAC,GAAG,yBAAyB,GAAG,CAAC,GAAG,mBAAmB,CAG/D"}
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AA0CpE,SAAS,0BAA0B,CAAC,KAAgC;IAClE,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;IAC1E,IAAI,KAAK,CAAC,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CACb,qCAAqC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,KAAK,CAAC,QAAQ,EAAE,CACjG,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,uBAAuB,CAErC,KAAoC;IACpC,MAAM,OAAO,GAAG,0BAA0B,CAAC,KAAK,CAAC,CAAC;IAClD,OAAO,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC;AACvE,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,yBAAyB,CAEvC,KAAoC;IACpC,MAAM,OAAO,GAAG,0BAA0B,CAAC,KAAK,CAAC,CAAC;IAClD,OAAO,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC;AACvE,CAAC","sourcesContent":["import { createOfficeAddress, sameOffice } from \"./office/index.js\";\nimport type {\n ConversationEvent,\n ConversationMessage,\n OfficeAddress,\n PlatformName,\n} from \"./types.js\";\n\nexport type {\n MessagingBot,\n ConversationContext,\n ConversationEvent,\n MessagingEventHandler,\n ChatAdapter,\n ConversationMessage,\n ConversationResponder,\n ChatToolResult,\n ConversationKind,\n MessagingInfo,\n OfficeAddress,\n OfficeKey,\n PlatformBlockKit,\n PlatformDmOpener,\n PlatformHistoryFetcher,\n PlatformHistoryMessage,\n PlatformHistoryOptions,\n PlatformName,\n PlatformNotifier,\n PlatformReactor,\n PlatformUploader,\n PlatformUserInfo,\n PlatformUserLister,\n RunningSession,\n SubagentProgressSnapshot,\n} from \"./types.js\";\n\ninterface ConversationIdentityInput {\n platform: PlatformName;\n conversationId: string;\n address?: OfficeAddress;\n}\n\nfunction resolveConversationAddress(input: ConversationIdentityInput): OfficeAddress {\n const address = createOfficeAddress(input.platform, input.conversationId);\n if (input.address && !sameOffice(address, input.address)) {\n throw new Error(\n `Conversation address mismatch for ${JSON.stringify(input.conversationId)} on ${input.platform}`,\n );\n }\n return address;\n}\n\n/** Normalize platform intake into one authoritative conversation identity. */\nexport function createConversationEvent<\n T extends Omit<ConversationEvent, \"address\" | \"conversationId\">,\n>(input: T & ConversationIdentityInput): T & ConversationEvent {\n const address = resolveConversationAddress(input);\n return { ...input, address, conversationId: address.conversationId };\n}\n\n/** Normalize a platform response context into one authoritative identity. */\nexport function createConversationMessage<\n T extends Omit<ConversationMessage, \"address\" | \"conversationId\">,\n>(input: T & ConversationIdentityInput): T & ConversationMessage {\n const address = resolveConversationAddress(input);\n return { ...input, address, conversationId: address.conversationId };\n}\n"]}
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAmCpE,SAAS,0BAA0B,CAAC,KAAgC;IAClE,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;IAC1E,IAAI,KAAK,CAAC,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CACb,qCAAqC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,KAAK,CAAC,QAAQ,EAAE,CACjG,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,uBAAuB,CAErC,KAAoC;IACpC,MAAM,OAAO,GAAG,0BAA0B,CAAC,KAAK,CAAC,CAAC;IAClD,OAAO,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC;AACvE,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,yBAAyB,CAEvC,KAAoC;IACpC,MAAM,OAAO,GAAG,0BAA0B,CAAC,KAAK,CAAC,CAAC;IAClD,OAAO,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC;AACvE,CAAC","sourcesContent":["import { createOfficeAddress, sameOffice } from \"./office/index.js\";\nimport type {\n ConversationEvent,\n ConversationMessage,\n OfficeAddress,\n PlatformName,\n} from \"./types.js\";\n\nexport type {\n MessagingBot,\n ConversationContext,\n ConversationEvent,\n MessagingEventHandler,\n HandleNewCommandOptions,\n ConversationMessage,\n ConversationResponder,\n ChatToolResult,\n ConversationKind,\n MessagingInfo,\n OfficeAddress,\n OfficeKey,\n PlatformHistoryMessage,\n PlatformHistoryOptions,\n PlatformName,\n PlatformUserInfo,\n RunningSession,\n SubagentProgressSnapshot,\n} from \"./types.js\";\n\ninterface ConversationIdentityInput {\n platform: PlatformName;\n conversationId: string;\n address?: OfficeAddress;\n}\n\nfunction resolveConversationAddress(input: ConversationIdentityInput): OfficeAddress {\n const address = createOfficeAddress(input.platform, input.conversationId);\n if (input.address && !sameOffice(address, input.address)) {\n throw new Error(\n `Conversation address mismatch for ${JSON.stringify(input.conversationId)} on ${input.platform}`,\n );\n }\n return address;\n}\n\n/** Normalize platform intake into one authoritative conversation identity. */\nexport function createConversationEvent<\n T extends Omit<ConversationEvent, \"address\" | \"conversationId\">,\n>(input: T & ConversationIdentityInput): T & ConversationEvent {\n const address = resolveConversationAddress(input);\n return { ...input, address, conversationId: address.conversationId };\n}\n\n/** Normalize a platform response context into one authoritative identity. */\nexport function createConversationMessage<\n T extends Omit<ConversationMessage, \"address\" | \"conversationId\">,\n>(input: T & ConversationIdentityInput): T & ConversationMessage {\n const address = resolveConversationAddress(input);\n return { ...input, address, conversationId: address.conversationId };\n}\n"]}
@@ -9,7 +9,9 @@ export declare class DiscordMessagingBot implements MessagingBot {
9
9
  private token;
10
10
  private workspace;
11
11
  private botUserId;
12
+ private stopped;
12
13
  private queues;
14
+ private intake;
13
15
  private startupTime;
14
16
  private channels;
15
17
  private users;
@@ -18,6 +20,7 @@ export declare class DiscordMessagingBot implements MessagingBot {
18
20
  workspace: Workspace;
19
21
  });
20
22
  start(): Promise<void>;
23
+ stop(): Promise<void>;
21
24
  postMessage(channel: string, text: string): Promise<string>;
22
25
  updateMessage(channel: string, ts: string, text: string): Promise<void>;
23
26
  addReaction(channel: string, messageTs: string, emoji: string): Promise<void>;
@@ -46,7 +49,7 @@ export declare class DiscordMessagingBot implements MessagingBot {
46
49
  * Process attachments from a Discord message.
47
50
  * Downloads files before returning so the agent can read them immediately.
48
51
  */
49
- processAttachments(channelId: string, attachments: Collection<string, Attachment>, _messageId: string): Promise<{
52
+ processAttachments(channelId: string, attachments: Collection<string, Attachment>): Promise<{
50
53
  name: string;
51
54
  localPath: string;
52
55
  }[]>;
@@ -57,6 +60,8 @@ export declare class DiscordMessagingBot implements MessagingBot {
57
60
  private resolveConversationContext;
58
61
  private createSlashCommandAdapters;
59
62
  private setupEventHandlers;
63
+ private handleInteractionCreate;
64
+ private handleMessageCreate;
60
65
  private fetchTextChannel;
61
66
  }
62
67
  //# sourceMappingURL=bot.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../../../src/adapters/discord/bot.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../../../src/adapters/discord/bot.ts"],"names":[],"mappings":"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"}
@@ -7,7 +7,7 @@ import * as log from "../../log.js";
7
7
  import { createOfficeAddress } from "../../office/index.js";
8
8
  import { resolveChatSessionKey } from "../../sessions/session-key.js";
9
9
  import { formatNothingRunning } from "../../platform-messages.js";
10
- import { appendBotResponseLog, appendChannelLog, MessagingEventQueue, downloadUrlToFile, resolveOnlyScopedStopTarget, resolveStopTarget, saveIncomingAttachments, withRetry, } from "../shared.js";
10
+ import { appendBotResponseLog, appendChannelLog, MessagingEventQueue, MessagingIntakeTracker, downloadUrlToFile, resolveOnlyScopedStopTarget, resolveStopTarget, saveIncomingAttachments, withRetry, } from "../shared.js";
11
11
  import { COMMAND_MANIFEST } from "../../commands/manifest.js";
12
12
  import { processMessageIntake } from "../intake.js";
13
13
  import { createDiscordAdapters } from "./context.js";
@@ -29,7 +29,9 @@ const discordRetry = (fn) => withRetry(fn, { isRateLimited: discordIsRateLimited
29
29
  export class DiscordMessagingBot {
30
30
  constructor(handler, config) {
31
31
  this.botUserId = null;
32
+ this.stopped = false;
32
33
  this.queues = new Map();
34
+ this.intake = new MessagingIntakeTracker("Discord");
33
35
  this.startupTime = 0;
34
36
  this.channels = new Map();
35
37
  this.users = new Map();
@@ -50,8 +52,13 @@ export class DiscordMessagingBot {
50
52
  // Public API (implements MessagingBot)
51
53
  // ==========================================================================
52
54
  async start() {
55
+ this.stopped = false;
53
56
  await new Promise((resolve, reject) => {
54
57
  this.client.once(Events.ClientReady, async (readyClient) => {
58
+ if (this.stopped) {
59
+ resolve();
60
+ return;
61
+ }
55
62
  this.botUserId = readyClient.user.id;
56
63
  this.startupTime = Date.now();
57
64
  log.logConnected("Discord");
@@ -86,6 +93,16 @@ export class DiscordMessagingBot {
86
93
  this.client.login(this.token).catch(reject);
87
94
  });
88
95
  }
96
+ async stop() {
97
+ this.stopped = true;
98
+ try {
99
+ this.client.destroy();
100
+ }
101
+ finally {
102
+ await this.intake.close();
103
+ await Promise.all([...this.queues.values()].map((queue) => queue.close()));
104
+ }
105
+ }
89
106
  async postMessage(channel, text) {
90
107
  return discordRetry(async () => {
91
108
  const ch = await this.fetchTextChannel(channel);
@@ -106,6 +123,8 @@ export class DiscordMessagingBot {
106
123
  });
107
124
  }
108
125
  enqueueEvent(event) {
126
+ if (this.stopped)
127
+ return false;
109
128
  const conversationId = event.conversationId;
110
129
  const queue = this.getQueue(conversationId);
111
130
  if (queue.size() >= 5) {
@@ -113,11 +132,10 @@ export class DiscordMessagingBot {
113
132
  return false;
114
133
  }
115
134
  log.logInfo(`Enqueueing event for ${conversationId}: ${event.text.substring(0, 50)}`);
116
- queue.enqueue(() => {
135
+ return queue.enqueue(() => {
117
136
  const context = createDiscordAdapters(event, this);
118
137
  return this.handler.handleEvent(event, this, context);
119
138
  });
120
- return true;
121
139
  }
122
140
  getMessagingInfo() {
123
141
  return {
@@ -218,7 +236,7 @@ export class DiscordMessagingBot {
218
236
  * Process attachments from a Discord message.
219
237
  * Downloads files before returning so the agent can read them immediately.
220
238
  */
221
- async processAttachments(channelId, attachments, _messageId) {
239
+ async processAttachments(channelId, attachments) {
222
240
  const items = [];
223
241
  for (const attachment of attachments.values()) {
224
242
  if (!attachment.name) {
@@ -354,161 +372,167 @@ export class DiscordMessagingBot {
354
372
  return { address: message.address, message, responder, platform };
355
373
  }
356
374
  setupEventHandlers() {
357
- this.client.on(Events.InteractionCreate, async (interaction) => {
358
- if (!interaction.isChatInputCommand())
359
- return;
360
- const manifestEntry = COMMAND_MANIFEST.find((entry) => entry.discord && entry.name === interaction.commandName);
361
- if (!manifestEntry)
375
+ this.client.on(Events.InteractionCreate, (interaction) => {
376
+ void this.intake.run(() => this.handleInteractionCreate(interaction));
377
+ });
378
+ this.client.on(Events.MessageCreate, (message) => {
379
+ void this.intake.run(() => this.handleMessageCreate(message));
380
+ });
381
+ }
382
+ async handleInteractionCreate(interaction) {
383
+ if (!interaction.isChatInputCommand())
384
+ return;
385
+ const manifestEntry = COMMAND_MANIFEST.find((entry) => entry.discord && entry.name === interaction.commandName);
386
+ if (!manifestEntry)
387
+ return;
388
+ const isDM = !interaction.inGuild();
389
+ const { conversationId, threadTs } = this.resolveConversationContext({
390
+ channelId: interaction.channelId,
391
+ inGuild: interaction.inGuild(),
392
+ isThread: interaction.channel?.isThread() ?? false,
393
+ parentChannelId: interaction.channel && "parentId" in interaction.channel
394
+ ? interaction.channel.parentId
395
+ : null,
396
+ });
397
+ const sessionKey = resolveChatSessionKey({
398
+ conversationId,
399
+ conversationKind: isDM ? "direct" : "shared",
400
+ messageId: interaction.id,
401
+ persistentTopLevel: true,
402
+ threadTs,
403
+ });
404
+ const commandArg = manifestEntry.arg
405
+ ? interaction.options.getString(manifestEntry.arg.name)?.trim()
406
+ : undefined;
407
+ const commandText = commandArg
408
+ ? `/${interaction.commandName} ${commandArg}`
409
+ : `/${interaction.commandName}`;
410
+ this.logToFile(conversationId, {
411
+ date: new Date(interaction.createdTimestamp).toISOString(),
412
+ ts: interaction.id,
413
+ ...(threadTs ? { threadTs } : {}),
414
+ user: interaction.user.id,
415
+ userName: interaction.user.username,
416
+ text: commandText,
417
+ attachments: [],
418
+ isMessagingBot: false,
419
+ });
420
+ const context = this.createSlashCommandAdapters(interaction, commandText, sessionKey, conversationId);
421
+ try {
422
+ // Magic words are conversation-intake controls, not command handlers;
423
+ // the manifest's metadata routes them (today only `stop`).
424
+ if (manifestEntry.magicWord) {
425
+ const stopTarget = this.resolveStopTarget(conversationId, sessionKey);
426
+ if (stopTarget) {
427
+ await this.handler.handleStop(createOfficeAddress("discord", conversationId), stopTarget, this);
428
+ await context.responder.respond("Stopped the current conversation.");
429
+ }
430
+ else {
431
+ await context.responder.respond(formatNothingRunning("discord"));
432
+ }
362
433
  return;
363
- const isDM = !interaction.inGuild();
364
- const { conversationId, threadTs } = this.resolveConversationContext({
365
- channelId: interaction.channelId,
366
- inGuild: interaction.inGuild(),
367
- isThread: interaction.channel?.isThread() ?? false,
368
- parentChannelId: interaction.channel && "parentId" in interaction.channel
369
- ? interaction.channel.parentId
370
- : null,
371
- });
372
- const sessionKey = resolveChatSessionKey({
434
+ }
435
+ const event = createConversationEvent({
436
+ platform: "discord",
437
+ type: "dm",
373
438
  conversationId,
374
439
  conversationKind: isDM ? "direct" : "shared",
375
- messageId: interaction.id,
376
- persistentTopLevel: true,
377
- threadTs,
378
- });
379
- const commandArg = manifestEntry.arg
380
- ? interaction.options.getString(manifestEntry.arg.name)?.trim()
381
- : undefined;
382
- const commandText = commandArg
383
- ? `/${interaction.commandName} ${commandArg}`
384
- : `/${interaction.commandName}`;
385
- this.logToFile(conversationId, {
386
- date: new Date(interaction.createdTimestamp).toISOString(),
387
440
  ts: interaction.id,
388
- ...(threadTs ? { threadTs } : {}),
441
+ thread_ts: threadTs,
442
+ sessionKey,
389
443
  user: interaction.user.id,
390
- userName: interaction.user.username,
391
444
  text: commandText,
392
445
  attachments: [],
393
- isMessagingBot: false,
394
446
  });
395
- const context = this.createSlashCommandAdapters(interaction, commandText, sessionKey, conversationId);
396
- try {
397
- // Magic words are conversation-intake controls, not command handlers;
398
- // the manifest's metadata routes them (today only `stop`).
399
- if (manifestEntry.magicWord) {
400
- const stopTarget = this.resolveStopTarget(conversationId, sessionKey);
401
- if (stopTarget) {
402
- await this.handler.handleStop(createOfficeAddress("discord", conversationId), stopTarget, this);
403
- await context.responder.respond("Stopped the current conversation.");
404
- }
405
- else {
406
- await context.responder.respond(formatNothingRunning("discord"));
407
- }
408
- return;
409
- }
410
- const event = createConversationEvent({
411
- platform: "discord",
412
- type: "dm",
413
- conversationId,
414
- conversationKind: isDM ? "direct" : "shared",
415
- ts: interaction.id,
416
- thread_ts: threadTs,
417
- sessionKey,
418
- user: interaction.user.id,
419
- text: commandText,
420
- attachments: [],
447
+ await this.handler.handleEvent(event, this, context);
448
+ }
449
+ catch (err) {
450
+ log.logWarning("Discord slash command error", err instanceof Error ? err.message : String(err));
451
+ if (!interaction.replied && !interaction.deferred) {
452
+ await interaction.reply({
453
+ content: `${interaction.commandName} command failed. Please try again later.`,
454
+ ephemeral: !isDM,
421
455
  });
422
- await this.handler.handleEvent(event, this, context);
423
- }
424
- catch (err) {
425
- log.logWarning("Discord slash command error", err instanceof Error ? err.message : String(err));
426
- if (!interaction.replied && !interaction.deferred) {
427
- await interaction.reply({
428
- content: `${interaction.commandName} command failed. Please try again later.`,
429
- ephemeral: !isDM,
430
- });
431
- }
432
456
  }
457
+ }
458
+ }
459
+ async handleMessageCreate(msg) {
460
+ // Skip messages from before startup
461
+ if (msg.createdTimestamp < this.startupTime)
462
+ return;
463
+ // Skip bot messages
464
+ if (msg.author.bot)
465
+ return;
466
+ const isDM = msg.channel.type === 1; // ChannelType.DM = 1
467
+ const isInThread = msg.channel.isThread();
468
+ const referencedMsgId = msg.reference?.messageId;
469
+ const isThreadReply = isInThread || !!referencedMsgId;
470
+ const isMentioned = msg.mentions.users.has(this.botUserId ?? "");
471
+ const isAutoReplyCandidate = !isDM && !isMentioned && !isThreadReply;
472
+ const { conversationId, threadTs } = this.resolveConversationContext({
473
+ channelId: msg.channelId,
474
+ inGuild: !isDM,
475
+ isThread: isInThread,
476
+ parentChannelId: "parentId" in msg.channel ? msg.channel.parentId : null,
477
+ referencedMsgId,
433
478
  });
434
- this.client.on(Events.MessageCreate, async (msg) => {
435
- // Skip messages from before startup
436
- if (msg.createdTimestamp < this.startupTime)
437
- return;
438
- // Skip bot messages
439
- if (msg.author.bot)
440
- return;
441
- const isDM = msg.channel.type === 1; // ChannelType.DM = 1
442
- const isInThread = msg.channel.isThread();
443
- const referencedMsgId = msg.reference?.messageId;
444
- const isThreadReply = isInThread || !!referencedMsgId;
445
- const isMentioned = msg.mentions.users.has(this.botUserId ?? "");
446
- const isAutoReplyCandidate = !isDM && !isMentioned && !isThreadReply;
447
- const { conversationId, threadTs } = this.resolveConversationContext({
448
- channelId: msg.channelId,
449
- inGuild: !isDM,
450
- isThread: isInThread,
451
- parentChannelId: "parentId" in msg.channel ? msg.channel.parentId : null,
452
- referencedMsgId,
453
- });
454
- const userId = msg.author.id;
455
- const userName = msg.author.username;
456
- const msgId = msg.id;
457
- // Track user
458
- this.users.set(userId, {
459
- id: userId,
460
- userName,
461
- displayName: msg.member?.displayName ?? userName,
462
- });
463
- // Track channel
464
- if (!this.channels.has(conversationId) && "name" in msg.channel) {
465
- const ch = msg.channel;
466
- this.channels.set(conversationId, { id: conversationId, name: ch.name });
467
- }
468
- const conversationKind = isDM ? "direct" : "shared";
469
- const sessionKey = resolveChatSessionKey({
470
- conversationId,
471
- conversationKind,
472
- messageId: msgId,
473
- persistentTopLevel: true,
474
- threadTs,
475
- });
476
- const cleanedText = this.stripMessagingBotMention(msg.content);
477
- const eventBase = createConversationEvent({
478
- platform: "discord",
479
- type: isDM ? "dm" : "mention",
480
- conversationId,
481
- conversationKind,
479
+ const userId = msg.author.id;
480
+ const userName = msg.author.username;
481
+ const msgId = msg.id;
482
+ // Track user
483
+ this.users.set(userId, {
484
+ id: userId,
485
+ userName,
486
+ displayName: msg.member?.displayName ?? userName,
487
+ });
488
+ // Track channel
489
+ if (!this.channels.has(conversationId) && "name" in msg.channel) {
490
+ const ch = msg.channel;
491
+ this.channels.set(conversationId, { id: conversationId, name: ch.name });
492
+ }
493
+ const conversationKind = isDM ? "direct" : "shared";
494
+ const sessionKey = resolveChatSessionKey({
495
+ conversationId,
496
+ conversationKind,
497
+ messageId: msgId,
498
+ persistentTopLevel: true,
499
+ threadTs,
500
+ });
501
+ const cleanedText = this.stripMessagingBotMention(msg.content);
502
+ const eventBase = createConversationEvent({
503
+ platform: "discord",
504
+ type: isDM ? "dm" : "mention",
505
+ conversationId,
506
+ conversationKind,
507
+ ts: msgId,
508
+ thread_ts: threadTs,
509
+ sessionKey,
510
+ user: userId,
511
+ userName,
512
+ text: cleanedText,
513
+ });
514
+ await processMessageIntake({
515
+ eventBase,
516
+ office: this.workspace.office(eventBase.address),
517
+ isAutoReplyCandidate,
518
+ magicWord: { addressed: !isAutoReplyCandidate, scopeFallback: "top-level" },
519
+ busyPolicy: "queue",
520
+ logEntryBase: {
521
+ date: msg.createdAt.toISOString(),
482
522
  ts: msgId,
483
- thread_ts: threadTs,
484
- sessionKey,
523
+ ...(!isDM && threadTs ? { threadTs } : {}),
485
524
  user: userId,
486
525
  userName,
487
526
  text: cleanedText,
488
- });
489
- await processMessageIntake({
490
- eventBase,
491
- office: this.workspace.office(eventBase.address),
492
- isAutoReplyCandidate,
493
- magicWord: { addressed: !isAutoReplyCandidate, scopeFallback: "top-level" },
494
- busyPolicy: "queue",
495
- logEntryBase: {
496
- date: msg.createdAt.toISOString(),
497
- ts: msgId,
498
- ...(!isDM && threadTs ? { threadTs } : {}),
499
- user: userId,
500
- userName,
501
- text: cleanedText,
502
- isMessagingBot: false,
503
- },
504
- log: (entry) => this.logToFile(conversationId, entry),
505
- processAttachments: () => this.processAttachments(conversationId, msg.attachments, msgId),
506
- queueKey: sessionKey,
507
- enqueue: (queueKey, work) => this.getQueue(queueKey).enqueue(work),
508
- handler: this.handler,
509
- bot: this,
510
- createContext: (event) => createDiscordAdapters(event, this),
511
- });
527
+ isMessagingBot: false,
528
+ },
529
+ log: (entry) => this.logToFile(conversationId, entry),
530
+ processAttachments: () => this.processAttachments(conversationId, msg.attachments),
531
+ queueKey: sessionKey,
532
+ enqueue: (queueKey, work) => this.getQueue(queueKey).enqueue(work),
533
+ handler: this.handler,
534
+ bot: this,
535
+ createContext: (event) => createDiscordAdapters(event, this),
512
536
  });
513
537
  }
514
538
  async fetchTextChannel(channelId) {