@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,15 +1,31 @@
1
1
  import { createRunner } from "../agent.js";
2
- import { defaultCommandHandlers } from "../commands/registry.js";
2
+ import { MikanModels } from "../harness/index.js";
3
+ import { defaultCommandHandlers, dispatchCommand } from "../commands/registry.js";
4
+ import { isPrivateConversation } from "../commands/utils.js";
3
5
  import * as log from "../log.js";
4
- import { reportUserFacingError } from "../observability/sentry.js";
5
- import { AgentMemoryFileManager, hasMaterializedChatSession, } from "../sessions/agent-memory-file-manager.js";
6
- import { formatNothingRunning, formatStopping } from "../platform-messages.js";
7
- import { AgentRunController } from "./agent-run-controller.js";
6
+ import { addLifecycleBreadcrumb, applyRunScope, createRunAttributionAttributes, registerTraceAttribution, reportUserFacingError, } from "../observability/sentry.js";
7
+ import { ChatHistorySync, hasMaterializedChatSession, waitForThreadSessionBootstrap, } from "../sessions/chat-history-sync.js";
8
+ import { shouldRotateTopLevelSession } from "../sessions/rotation.js";
9
+ import { resolveChannelSessionFile } from "../sessions/store.js";
10
+ import { assertSessionKeyBelongsToConversation, deriveSessionKey, } from "../sessions/session-key.js";
11
+ import { formatNothingRunning, formatStopped, formatStopping } from "../platform-messages.js";
8
12
  import * as Sentry from "@sentry/node";
9
13
  import { join } from "path";
10
- import { getUnresolvedSandboxPathContext } from "../agent.js";
11
- const MAX_SESSIONS = 500;
12
- const IDLE_TIMEOUT_MS = 3_600_000;
14
+ import { getUnresolvedSandboxPathContext } from "../sandbox/index.js";
15
+ import { disabledVaultManager } from "../vault/disabled.js";
16
+ import { SessionLifecycle } from "./session-lifecycle.js";
17
+ /**
18
+ * Placeholder token store for embedders that run without the web portal.
19
+ * Command handlers guard on `portalBaseUrl` before minting tokens, so this
20
+ * only fires when a portal URL is configured without its backing store.
21
+ */
22
+ function portalNotConfiguredTokenStore(portal) {
23
+ return {
24
+ create: () => {
25
+ throw new Error(`${portal} portal not configured`);
26
+ },
27
+ };
28
+ }
13
29
  function runtimeCwdForSandbox(sandbox, hostWorkspaceRoot, conversationId) {
14
30
  const runtimeWorkspaceRoot = getUnresolvedSandboxPathContext(sandbox, hostWorkspaceRoot).runtimeWorkspaceRoot;
15
31
  return `${runtimeWorkspaceRoot.replace(/\/+$/, "")}/${conversationId}`;
@@ -20,42 +36,33 @@ export function createConversationRuntime(options) {
20
36
  class ConversationRuntimeImpl {
21
37
  constructor(options) {
22
38
  this.options = options;
23
- this.conversationStates = new Map();
24
- this.sessionQueues = new Map();
39
+ this.sessions = new SessionLifecycle();
25
40
  this.inFlightRuns = new Set();
26
- this.chatSessionManager = new AgentMemoryFileManager();
41
+ this.sessionDreamSettlements = new Set();
42
+ this.chatSessionManager = new ChatHistorySync();
43
+ this.globalRunnerGeneration = 0;
44
+ this.conversationRunnerGenerations = new Map();
27
45
  this.isShuttingDown = false;
28
- const commandServices = { ...options, runtime: this };
29
- const commandHandlers = options.commandHandlers ?? defaultCommandHandlers();
30
- this.orchestrator = new AgentRunController({
31
- workingDir: options.workingDir,
32
- commandHandlers,
33
- commandServices,
34
- isShuttingDown: () => this.isShuttingDown,
35
- getState: (sessionKey) => this.conversationStates.get(sessionKey),
36
- getOrCreateState: (createOptions) => this.getOrCreateState(createOptions),
37
- hasMaterializedSession: ({ conversationDir, sessionKey }) => hasMaterializedChatSession({ conversationDir, sessionKey }),
38
- beforeRunTracked: (runPromise) => {
39
- this.inFlightRuns.add(runPromise);
40
- Sentry.metrics.gauge("agent.sessions.active", this.inFlightRuns.size);
41
- },
42
- afterRunTracked: (runPromise) => {
43
- this.inFlightRuns.delete(runPromise);
44
- },
45
- onRunFinished: () => {
46
- Sentry.metrics.gauge("agent.sessions.active", this.inFlightRuns.size - 1);
47
- this.evictIdleSessions();
48
- },
49
- });
46
+ this.resolvedModels = options.models ?? MikanModels.create();
47
+ this.commandServices = {
48
+ ...options,
49
+ resourceController: options.resourceController ?? options.provisioner,
50
+ vaultManager: options.vaultManager ?? disabledVaultManager,
51
+ linkTokenStore: options.linkTokenStore ?? portalNotConfiguredTokenStore("Login"),
52
+ sessionViewTokenStore: options.sessionViewTokenStore ?? portalNotConfiguredTokenStore("Session viewer"),
53
+ adminTokenStore: options.adminTokenStore ?? portalNotConfiguredTokenStore("Admin"),
54
+ runtime: this,
55
+ };
56
+ this.commandHandlers = options.commandHandlers ?? defaultCommandHandlers(this.resolvedModels);
50
57
  }
51
58
  isRunning(sessionKey) {
52
- const state = this.conversationStates.get(sessionKey);
59
+ const state = this.sessions.get(sessionKey);
53
60
  return !!state?.running;
54
61
  }
55
62
  getRunningSessions() {
56
63
  const sessions = [];
57
- for (const [sessionKey, state] of this.conversationStates) {
58
- if (state.running && state.startedAt) {
64
+ for (const [sessionKey, state] of this.sessions.runningStates()) {
65
+ if (state.startedAt) {
59
66
  const currentStep = state.runner.getCurrentStep();
60
67
  sessions.push({
61
68
  sessionKey,
@@ -68,7 +75,8 @@ class ConversationRuntimeImpl {
68
75
  return sessions;
69
76
  }
70
77
  async handleStop(sessionKey, conversationId, bot) {
71
- const state = this.conversationStates.get(sessionKey);
78
+ assertSessionKeyBelongsToConversation(sessionKey, conversationId);
79
+ const state = this.sessions.get(sessionKey);
72
80
  if (state?.running) {
73
81
  state.stopRequested = true;
74
82
  state.runner.abort();
@@ -80,74 +88,469 @@ class ConversationRuntimeImpl {
80
88
  }
81
89
  }
82
90
  forceStop(sessionKey) {
83
- const state = this.conversationStates.get(sessionKey);
91
+ const state = this.sessions.get(sessionKey);
84
92
  if (state?.running) {
85
93
  log.logInfo(`[Force Stop] Force stopping session: ${sessionKey}`);
86
94
  state.stopRequested = true;
87
95
  state.runner.abort();
88
- state.running = false;
89
96
  }
90
97
  }
91
- async handleNewCommand(sessionKey, conversationId, bot) {
92
- const state = this.conversationStates.get(sessionKey);
93
- if (state?.running) {
98
+ async handleNewCommand(sessionKey, conversationId, bot, message, responder, platform) {
99
+ assertSessionKeyBelongsToConversation(sessionKey, conversationId);
100
+ const activeState = this.sessions.get(sessionKey);
101
+ if (activeState?.running ||
102
+ (activeState?.runSettlement && this.sessionDreamSettlements.has(activeState.runSettlement))) {
103
+ const activeSettlement = activeState.runSettlement;
104
+ if (activeSettlement && this.sessionDreamSettlements.has(activeSettlement)) {
105
+ await activeSettlement;
106
+ return;
107
+ }
108
+ activeState.stopRequested = true;
109
+ activeState.runner.abort();
110
+ await activeSettlement;
111
+ }
112
+ const state = await this.getOrCreateState({
113
+ conversationId,
114
+ sessionKey,
115
+ conversationKind: message.conversationKind,
116
+ });
117
+ if (state.running ||
118
+ (state.runSettlement && this.sessionDreamSettlements.has(state.runSettlement))) {
119
+ const activeSettlement = state.runSettlement;
120
+ if (activeSettlement && this.sessionDreamSettlements.has(activeSettlement)) {
121
+ await activeSettlement;
122
+ return;
123
+ }
94
124
  state.stopRequested = true;
95
125
  state.runner.abort();
126
+ await activeSettlement;
127
+ return this.handleNewCommand(sessionKey, conversationId, bot, message, responder, platform);
96
128
  }
129
+ const dreamSettlement = this.startSessionDream(state, async () => {
130
+ let working = false;
131
+ try {
132
+ await responder.setWorking(true);
133
+ working = true;
134
+ const result = await this.dreamSessionMemory(state, message, platform);
135
+ if (!result.success) {
136
+ const detail = result.errorMessage ? ` ${result.errorMessage}` : "";
137
+ await responder.respondDiagnostic(`Could not preserve memory, so the current conversation was not reset.${detail}`, { style: "error" });
138
+ return;
139
+ }
140
+ await responder.setWorking(false);
141
+ working = false;
142
+ await this.resetSession(sessionKey, conversationId, bot);
143
+ }
144
+ finally {
145
+ if (working)
146
+ await responder.setWorking(false);
147
+ }
148
+ });
149
+ try {
150
+ await dreamSettlement;
151
+ }
152
+ finally {
153
+ this.finishSessionDream(sessionKey, state, dreamSettlement);
154
+ }
155
+ }
156
+ startSessionDream(state, dream, markRunning = true) {
157
+ if (markRunning) {
158
+ state.running = true;
159
+ state.stopRequested = false;
160
+ state.startedAt = Date.now();
161
+ state.lastActivityAt = Date.now();
162
+ }
163
+ const settlement = Promise.resolve().then(dream);
164
+ state.runSettlement = settlement;
165
+ this.sessionDreamSettlements.add(settlement);
166
+ this.inFlightRuns.add(settlement);
167
+ return settlement;
168
+ }
169
+ finishSessionDream(sessionKey, state, settlement) {
170
+ this.sessionDreamSettlements.delete(settlement);
171
+ this.inFlightRuns.delete(settlement);
172
+ if (state.runSettlement !== settlement)
173
+ return;
174
+ state.runSettlement = undefined;
175
+ state.running = false;
176
+ state.startedAt = 0;
177
+ state.lastAccessedAt = Date.now();
178
+ this.sessions.onSettlement(sessionKey);
179
+ this.sessions.evictIdle();
180
+ }
181
+ async dreamSessionMemory(state, message, platform) {
182
+ try {
183
+ const result = await state.runner.dreamSessionMemory(message, platform);
184
+ // Only a clean stop means the dream finished its work. Everything else —
185
+ // budget abort, length cutoff, error, blocked — leaves memory unwritten,
186
+ // and treating it as success resets the session and loses it silently.
187
+ // Listed as a whitelist so a new stop reason fails safe.
188
+ if (result.stopReason !== "stop") {
189
+ return {
190
+ success: false,
191
+ errorMessage: result.errorMessage ?? `Session Dream stopped early (${result.stopReason})`,
192
+ };
193
+ }
194
+ return { success: true };
195
+ }
196
+ catch (err) {
197
+ return { success: false, errorMessage: err instanceof Error ? err.message : String(err) };
198
+ }
199
+ }
200
+ async rotateSharedSessionAfterDream(conversationId, sessionKey, message, platform) {
201
+ if (message.conversationKind !== "shared" || sessionKey !== conversationId)
202
+ return;
203
+ const conversationDir = join(this.options.workingDir, conversationId);
204
+ const currentSession = resolveChannelSessionFile(conversationDir);
205
+ if (!currentSession || !shouldRotateTopLevelSession(currentSession, new Date()))
206
+ return;
207
+ await this.sessions.runConversationMaintenance(conversationId, async () => {
208
+ const session = resolveChannelSessionFile(conversationDir);
209
+ if (!session || !shouldRotateTopLevelSession(session, new Date()))
210
+ return;
211
+ const state = await this.getOrCreateState({
212
+ conversationId,
213
+ sessionKey,
214
+ conversationKind: message.conversationKind,
215
+ currentMessageId: message.id,
216
+ });
217
+ const dreamSettlement = this.startSessionDream(state, async () => {
218
+ const result = await this.dreamSessionMemory(state, message, platform);
219
+ if (!result.success) {
220
+ const detail = result.errorMessage ? `: ${result.errorMessage}` : "";
221
+ log.logWarning(`[${conversationId}] Automatic Session Dream failed${detail}`);
222
+ return;
223
+ }
224
+ const runtimeCwd = runtimeCwdForSandbox(this.options.sandbox, this.options.workingDir, conversationId);
225
+ this.chatSessionManager.resetSession({ conversationDir, sessionKey, cwd: runtimeCwd });
226
+ this.sessions.discard(sessionKey);
227
+ log.logInfo(`[${conversationId}] Session Dream completed; rotated session: ${sessionKey}`);
228
+ }, false);
229
+ try {
230
+ await dreamSettlement;
231
+ }
232
+ finally {
233
+ this.finishSessionDream(sessionKey, state, dreamSettlement);
234
+ }
235
+ });
236
+ }
237
+ async resetSession(sessionKey, conversationId, bot) {
97
238
  const conversationDir = join(this.options.workingDir, conversationId);
98
239
  const runtimeCwd = runtimeCwdForSandbox(this.options.sandbox, this.options.workingDir, conversationId);
99
240
  this.chatSessionManager.resetSession({ conversationDir, sessionKey, cwd: runtimeCwd });
100
- this.conversationStates.delete(sessionKey);
241
+ this.sessions.discard(sessionKey);
101
242
  log.logInfo(`[${conversationId}] Session reset: ${sessionKey}`);
102
243
  await bot.postMessage(conversationId, "Conversation reset. Send a new message to start fresh.");
103
244
  }
104
245
  async handleEvent(event, bot, context) {
105
- const sessionKey = event.sessionKey ?? `${event.conversationId}:${event.thread_ts ?? event.ts}`;
106
- const previous = this.sessionQueues.get(sessionKey) ?? Promise.resolve();
107
- const next = previous.catch(() => { }).then(() => this.runSession({ event, bot, context }));
108
- this.sessionQueues.set(sessionKey, next);
246
+ const sessionKey = deriveSessionKey(event);
247
+ await this.sessions.enqueue(sessionKey, () => this.runSession({ event, bot, context }));
248
+ }
249
+ /**
250
+ * Dispatch an extension-owned interactive block action: materialize the
251
+ * conversation's harness instance (activating its extensions) and run the
252
+ * matching onAction handler — deterministic, no agent run. Serialized on
253
+ * the session queue so rapid interactions (votes) never interleave.
254
+ */
255
+ async handleExtensionAction(params) {
256
+ if (this.isShuttingDown)
257
+ return false;
258
+ const { conversationId, sessionKey, conversationKind, slug, action } = params;
259
+ let consumed = false;
260
+ await this.sessions.enqueue(sessionKey, async () => {
261
+ try {
262
+ const state = await this.getOrCreateState({
263
+ conversationId,
264
+ sessionKey,
265
+ currentMessageId: action.messageTs ?? sessionKey,
266
+ conversationKind,
267
+ });
268
+ consumed = await state.runner.tryExtensionAction(slug, action);
269
+ if (consumed)
270
+ state.lastAccessedAt = Date.now();
271
+ }
272
+ catch (err) {
273
+ log.logWarning(`[${conversationId}] Extension action dispatch failed (${slug}:${action.actionId})`, err instanceof Error ? err.message : String(err));
274
+ }
275
+ });
276
+ return consumed;
277
+ }
278
+ async runSession({ event, bot, context }) {
279
+ const conversationId = event.conversationId;
280
+ if (this.isShuttingDown) {
281
+ log.logInfo(`[${conversationId}] Rejected event during shutdown: ${event.text.substring(0, 50)}`);
282
+ return;
283
+ }
284
+ const sessionKey = deriveSessionKey(event);
285
+ const privateConversation = isPrivateConversation(event);
286
+ const handledCommand = await dispatchCommand(this.commandHandlers, {
287
+ bot,
288
+ responder: context.responder,
289
+ platform: context.platform.name,
290
+ platformUserId: event.user,
291
+ platformUserName: context.message.userName,
292
+ conversationId,
293
+ vaultConversationId: event.vaultConversationId,
294
+ sessionKey,
295
+ commandText: event.text,
296
+ privateConversation,
297
+ services: this.commandServices,
298
+ });
299
+ if (handledCommand)
300
+ return;
301
+ const activeSettlement = this.sessions.get(sessionKey)?.runSettlement;
302
+ if (activeSettlement)
303
+ await activeSettlement;
304
+ if (sessionKey === conversationId) {
305
+ await this.rotateSharedSessionAfterDream(conversationId, sessionKey, context.message, context.platform);
306
+ }
307
+ const releaseConversationWork = await this.sessions.acquireConversationWork(conversationId);
109
308
  try {
110
- await next;
309
+ const conversationDir = join(this.options.workingDir, conversationId);
310
+ const waitedForParent = await waitForThreadSessionBootstrap({
311
+ parentSessionKey: conversationId,
312
+ sessionKey,
313
+ hasThreadSession: () => hasMaterializedChatSession({ conversationDir, sessionKey }),
314
+ isParentRunning: () => this.sessions.get(conversationId)?.running === true,
315
+ });
316
+ if (waitedForParent) {
317
+ log.logInfo(`[${conversationId}] Delayed thread bootstrap until parent session sealed: ${sessionKey}`);
318
+ }
319
+ let state;
320
+ try {
321
+ state = await this.getOrCreateState({
322
+ conversationId,
323
+ sessionKey,
324
+ currentMessageId: event.ts,
325
+ conversationKind: event.conversationKind,
326
+ });
327
+ state.runner.syncChatHistory(event.ts);
328
+ // Extension-contributed commands: deterministic dispatch, no agent run.
329
+ // Built-in commands already had their chance above, so extensions can
330
+ // never shadow them; unmatched slash text falls through to the agent.
331
+ if (event.text.trim().startsWith("/")) {
332
+ const handled = await state.runner.tryExtensionCommand(context.message, context.responder);
333
+ if (handled) {
334
+ state.lastAccessedAt = Date.now();
335
+ return;
336
+ }
337
+ }
338
+ }
339
+ catch (err) {
340
+ reportUserFacingError(err, {
341
+ domain: "mikan",
342
+ surface: "session_setup",
343
+ operation: "get_or_create_state",
344
+ severity: "error",
345
+ platform: context.platform.name,
346
+ context: {
347
+ conversationId,
348
+ sessionKey,
349
+ messageId: context.message.id,
350
+ threadTs: context.message.threadTs,
351
+ attachmentCount: context.message.attachments?.length ?? 0,
352
+ },
353
+ });
354
+ throw err;
355
+ }
356
+ state.running = true;
357
+ state.stopRequested = false;
358
+ state.startedAt = Date.now();
359
+ state.lastActivityAt = Date.now();
360
+ log.logInfo(`[${conversationId}] Starting run: ${event.text.substring(0, 50)}`);
361
+ const runPromise = (async () => {
362
+ try {
363
+ const result = await this.runWithInstrumentation(context, { conversationId, sessionKey, startedAt: state.startedAt }, async () => {
364
+ await context.responder.setTyping(true);
365
+ await context.responder.setWorking(true);
366
+ try {
367
+ return await state.runner.run(context.message, context.responder, context.platform);
368
+ }
369
+ finally {
370
+ await context.responder.setWorking(false);
371
+ }
372
+ });
373
+ if (result?.stopReason === "aborted" && state.stopRequested) {
374
+ if (state.stopMessageTs) {
375
+ await bot.updateMessage(conversationId, state.stopMessageTs, formatStopped(bot));
376
+ state.stopMessageTs = undefined;
377
+ }
378
+ else {
379
+ await bot.postMessage(conversationId, formatStopped(bot));
380
+ }
381
+ }
382
+ }
383
+ finally {
384
+ state.running = false;
385
+ state.lastAccessedAt = Date.now();
386
+ Sentry.metrics.gauge("agent.sessions.active", this.inFlightRuns.size - 1);
387
+ }
388
+ })();
389
+ this.inFlightRuns.add(runPromise);
390
+ state.runSettlement = runPromise;
391
+ Sentry.metrics.gauge("agent.sessions.active", this.inFlightRuns.size);
392
+ try {
393
+ await runPromise;
394
+ }
395
+ finally {
396
+ this.inFlightRuns.delete(runPromise);
397
+ if (state.runSettlement === runPromise)
398
+ state.runSettlement = undefined;
399
+ this.sessions.onSettlement(sessionKey);
400
+ this.sessions.evictIdle();
401
+ }
111
402
  }
112
403
  finally {
113
- if (this.sessionQueues.get(sessionKey) === next) {
114
- this.sessionQueues.delete(sessionKey);
115
- }
404
+ releaseConversationWork();
116
405
  }
117
406
  }
118
- async runSession({ event, bot, context }) {
119
- await this.orchestrator.runSession({ event, bot, context });
120
- }
121
- async createSessionSandbox(options) {
122
- const state = await this.getOrCreateState(options);
123
- return state.runner;
407
+ async runWithInstrumentation(context, meta, body) {
408
+ const { conversationId, sessionKey, startedAt } = meta;
409
+ const { message, platform } = context;
410
+ const attribution = createRunAttributionAttributes({
411
+ conversationId,
412
+ sessionKey,
413
+ messageId: message.id,
414
+ platform: platform.name,
415
+ userId: message.userId,
416
+ userName: message.userName,
417
+ threadTs: message.threadTs,
418
+ });
419
+ Sentry.metrics.count("agent.run.started", 1, {
420
+ attributes: attribution,
421
+ });
422
+ return Sentry.startSpan({ name: "agent.run", op: "agent", attributes: attribution }, async (span) => Sentry.withScope(async (scope) => {
423
+ registerTraceAttribution(span, attribution);
424
+ applyRunScope(scope, {
425
+ conversationId,
426
+ sessionKey,
427
+ messageId: message.id,
428
+ platform: platform.name,
429
+ userId: message.userId,
430
+ userName: message.userName,
431
+ threadTs: message.threadTs,
432
+ });
433
+ addLifecycleBreadcrumb("agent.run.started", {
434
+ channel_id: conversationId,
435
+ platform: platform.name,
436
+ has_attachments: (message.attachments?.length ?? 0) > 0,
437
+ });
438
+ try {
439
+ const result = await body();
440
+ const durationMs = Date.now() - startedAt;
441
+ const completionAttrs = {
442
+ ...attribution,
443
+ stop_reason: result.stopReason,
444
+ };
445
+ Sentry.metrics.distribution("agent.run.duration", durationMs, {
446
+ unit: "millisecond",
447
+ attributes: completionAttrs,
448
+ });
449
+ Sentry.metrics.count("agent.run.completed", 1, { attributes: completionAttrs });
450
+ addLifecycleBreadcrumb("agent.run.completed", {
451
+ channel_id: conversationId,
452
+ platform: platform.name,
453
+ stop_reason: result.stopReason,
454
+ duration_ms: durationMs,
455
+ });
456
+ return result;
457
+ }
458
+ catch (err) {
459
+ scope.setContext("agent_run_error", {
460
+ conversationId,
461
+ sessionKey,
462
+ platform: platform.name,
463
+ messageId: message.id,
464
+ threadTs: message.threadTs,
465
+ });
466
+ reportUserFacingError(err, {
467
+ domain: "mikan",
468
+ surface: "agent_run",
469
+ operation: "run",
470
+ severity: "error",
471
+ platform: platform.name,
472
+ context: {
473
+ conversationId,
474
+ sessionKey,
475
+ messageId: message.id,
476
+ threadTs: message.threadTs,
477
+ attachmentCount: message.attachments?.length ?? 0,
478
+ },
479
+ });
480
+ Sentry.metrics.count("agent.run.errors", 1, {
481
+ attributes: attribution,
482
+ });
483
+ log.logWarning(`[${conversationId}] Run error`, err instanceof Error ? err.message : String(err));
484
+ return undefined;
485
+ }
486
+ }));
124
487
  }
125
488
  switchConversationModel(conversationId, _provider, _model) {
489
+ this.bumpConversationRunnerGeneration(conversationId);
126
490
  return this.clearConversationStates(conversationId, `[${conversationId}] Model switched; cleared cached session runners`);
127
491
  }
128
492
  refreshConversationEnvironment(conversationId) {
493
+ this.bumpConversationRunnerGeneration(conversationId);
129
494
  return this.clearConversationStates(conversationId, `[${conversationId}] Environment refreshed; cleared cached session runners`);
130
495
  }
131
- isConversationSession(sessionKey, conversationId) {
132
- return sessionKey === conversationId || sessionKey.startsWith(`${conversationId}:`);
133
- }
134
- clearConversationStates(conversationId, message) {
135
- for (const [sessionKey, state] of this.conversationStates) {
136
- if (this.isConversationSession(sessionKey, conversationId) && state.running) {
137
- return false;
496
+ refreshAllConversations() {
497
+ this.globalRunnerGeneration++;
498
+ const busy = [];
499
+ for (const conversationId of this.sessions.conversationIds()) {
500
+ const cleared = this.clearConversationStates(conversationId, `[${conversationId}] Global settings changed; cleared cached session runners`);
501
+ if (!cleared) {
502
+ this.sessions.deferConversationClear(conversationId);
503
+ busy.push(conversationId);
138
504
  }
139
505
  }
140
- for (const sessionKey of Array.from(this.conversationStates.keys())) {
141
- if (this.isConversationSession(sessionKey, conversationId)) {
142
- this.conversationStates.delete(sessionKey);
143
- }
506
+ return { busy };
507
+ }
508
+ clearConversationStates(conversationId, message) {
509
+ const cleared = this.sessions.clearConversation(conversationId);
510
+ if (cleared)
511
+ log.logInfo(message);
512
+ return cleared;
513
+ }
514
+ bumpConversationRunnerGeneration(conversationId) {
515
+ this.conversationRunnerGenerations.set(conversationId, (this.conversationRunnerGenerations.get(conversationId) ?? 0) + 1);
516
+ }
517
+ runnerGeneration(conversationId) {
518
+ return `${this.globalRunnerGeneration}:${this.conversationRunnerGenerations.get(conversationId) ?? 0}`;
519
+ }
520
+ async createCurrentRunner(options, conversationDir, sessionScope) {
521
+ while (true) {
522
+ const generation = this.runnerGeneration(options.conversationId);
523
+ const runner = await createRunner({
524
+ sandboxConfig: this.options.sandbox,
525
+ sessionKey: options.sessionKey,
526
+ conversationId: options.conversationId,
527
+ conversationDir,
528
+ workspaceDir: this.options.workingDir,
529
+ sessionScope,
530
+ vaultManager: this.options.vaultManager,
531
+ provisioner: this.options.provisioner,
532
+ resourceController: this.options.resourceController,
533
+ sessionView: this.options.sessionViewTokenStore
534
+ ? {
535
+ tokenStore: this.options.sessionViewTokenStore,
536
+ portalBaseUrl: this.options.portalBaseUrl,
537
+ }
538
+ : undefined,
539
+ platformNotifier: this.options.platformNotifier,
540
+ platformReactor: this.options.platformReactor,
541
+ platformUploader: this.options.platformUploader,
542
+ platformBlockKit: this.options.platformBlockKit,
543
+ platformToolPackFactories: this.options.platformToolPackFactories,
544
+ models: this.resolvedModels,
545
+ });
546
+ if (generation === this.runnerGeneration(options.conversationId))
547
+ return runner;
548
+ await runner.dispose();
144
549
  }
145
- log.logInfo(message);
146
- return true;
147
550
  }
148
551
  async getOrCreateState(options) {
149
552
  const { conversationId, sessionKey, currentMessageId } = options;
150
- const existing = this.conversationStates.get(sessionKey);
553
+ const existing = this.sessions.get(sessionKey);
151
554
  if (existing?.running)
152
555
  return existing;
153
556
  const conversationDir = join(this.options.workingDir, conversationId);
@@ -157,24 +560,25 @@ class ConversationRuntimeImpl {
157
560
  sessionKey,
158
561
  cwd: runtimeCwd,
159
562
  currentMessageId,
160
- rotateTopLevelSession: options.conversationKind === "shared" && sessionKey === conversationId,
563
+ rotateTopLevelSession: false,
161
564
  });
162
565
  if (existing && existing.sessionFile === sessionScope.contextFile) {
163
566
  existing.lastAccessedAt = Date.now();
164
567
  return existing;
165
568
  }
569
+ // A stale state (rotated session file) is being replaced: release the old
570
+ // runner's extension resources before the new one takes the slot.
571
+ if (existing)
572
+ this.sessions.discard(sessionKey);
166
573
  const state = {
167
574
  running: false,
168
- runner: await createRunner(this.options.sandbox, sessionKey, conversationId, conversationDir, this.options.workingDir, sessionScope, this.options.vaultManager, this.options.provisioner, {
169
- tokenStore: this.options.sessionViewTokenStore,
170
- portalBaseUrl: this.options.portalBaseUrl,
171
- }, this.options.platformNotifier),
575
+ runner: await this.createCurrentRunner(options, conversationDir, sessionScope),
172
576
  stopRequested: false,
173
577
  lastAccessedAt: Date.now(),
174
578
  sessionFile: sessionScope.contextFile,
175
579
  startedAt: 0,
176
580
  };
177
- this.conversationStates.set(sessionKey, state);
581
+ this.sessions.set(sessionKey, state);
178
582
  return state;
179
583
  }
180
584
  async shutdown(timeoutMs = 30_000) {
@@ -197,26 +601,5 @@ class ConversationRuntimeImpl {
197
601
  });
198
602
  }
199
603
  }
200
- evictIdleSessions() {
201
- const now = Date.now();
202
- for (const [key, state] of this.conversationStates) {
203
- if (!state.running && now - state.lastAccessedAt > IDLE_TIMEOUT_MS) {
204
- this.conversationStates.delete(key);
205
- }
206
- }
207
- if (this.conversationStates.size > MAX_SESSIONS) {
208
- const idleSessions = [];
209
- for (const [key, state] of this.conversationStates) {
210
- if (!state.running) {
211
- idleSessions.push({ key, lastAccessedAt: state.lastAccessedAt });
212
- }
213
- }
214
- idleSessions.sort((a, b) => a.lastAccessedAt - b.lastAccessedAt);
215
- const toEvict = this.conversationStates.size - MAX_SESSIONS;
216
- for (let i = 0; i < toEvict && i < idleSessions.length; i++) {
217
- this.conversationStates.delete(idleSessions[i].key);
218
- }
219
- }
220
- }
221
604
  }
222
605
  //# sourceMappingURL=conversation-runtime.js.map