@geminixiang/mikan 1.0.0-beta.4 → 1.0.0-beta.40

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 (639) hide show
  1. package/CHANGELOG.md +688 -0
  2. package/README.md +99 -36
  3. package/dist/adapter.d.ts +11 -1
  4. package/dist/adapter.d.ts.map +1 -1
  5. package/dist/adapter.js +18 -1
  6. package/dist/adapter.js.map +1 -1
  7. package/dist/adapters/discord/bot.d.ts +6 -7
  8. package/dist/adapters/discord/bot.d.ts.map +1 -1
  9. package/dist/adapters/discord/bot.js +82 -117
  10. package/dist/adapters/discord/bot.js.map +1 -1
  11. package/dist/adapters/discord/context.d.ts +3 -1
  12. package/dist/adapters/discord/context.d.ts.map +1 -1
  13. package/dist/adapters/discord/context.js +54 -215
  14. package/dist/adapters/discord/context.js.map +1 -1
  15. package/dist/adapters/github/bot.d.ts +89 -0
  16. package/dist/adapters/github/bot.d.ts.map +1 -0
  17. package/dist/adapters/github/bot.js +653 -0
  18. package/dist/adapters/github/bot.js.map +1 -0
  19. package/dist/adapters/github/client.d.ts +122 -0
  20. package/dist/adapters/github/client.d.ts.map +1 -0
  21. package/dist/adapters/github/client.js +314 -0
  22. package/dist/adapters/github/client.js.map +1 -0
  23. package/dist/adapters/github/cloudbuild.d.ts +19 -0
  24. package/dist/adapters/github/cloudbuild.d.ts.map +1 -0
  25. package/dist/adapters/github/cloudbuild.js +71 -0
  26. package/dist/adapters/github/cloudbuild.js.map +1 -0
  27. package/dist/adapters/github/context.d.ts +12 -0
  28. package/dist/adapters/github/context.d.ts.map +1 -0
  29. package/dist/adapters/github/context.js +101 -0
  30. package/dist/adapters/github/context.js.map +1 -0
  31. package/dist/adapters/github/gcp-auth.d.ts +28 -0
  32. package/dist/adapters/github/gcp-auth.d.ts.map +1 -0
  33. package/dist/adapters/github/gcp-auth.js +196 -0
  34. package/dist/adapters/github/gcp-auth.js.map +1 -0
  35. package/dist/adapters/github/github-ops.d.ts +91 -0
  36. package/dist/adapters/github/github-ops.d.ts.map +1 -0
  37. package/dist/adapters/github/github-ops.js +406 -0
  38. package/dist/adapters/github/github-ops.js.map +1 -0
  39. package/dist/adapters/github/ids.d.ts +34 -0
  40. package/dist/adapters/github/ids.d.ts.map +1 -0
  41. package/dist/adapters/github/ids.js +57 -0
  42. package/dist/adapters/github/ids.js.map +1 -0
  43. package/dist/adapters/github/repo.d.ts +33 -0
  44. package/dist/adapters/github/repo.d.ts.map +1 -0
  45. package/dist/adapters/github/repo.js +141 -0
  46. package/dist/adapters/github/repo.js.map +1 -0
  47. package/dist/adapters/github/tool-pack.d.ts +14 -0
  48. package/dist/adapters/github/tool-pack.d.ts.map +1 -0
  49. package/dist/adapters/github/tool-pack.js +56 -0
  50. package/dist/adapters/github/tool-pack.js.map +1 -0
  51. package/dist/adapters/github/tools/checks.d.ts +19 -0
  52. package/dist/adapters/github/tools/checks.d.ts.map +1 -0
  53. package/dist/adapters/github/tools/checks.js +105 -0
  54. package/dist/adapters/github/tools/checks.js.map +1 -0
  55. package/dist/adapters/github/tools/issue.d.ts +21 -0
  56. package/dist/adapters/github/tools/issue.d.ts.map +1 -0
  57. package/dist/adapters/github/tools/issue.js +48 -0
  58. package/dist/adapters/github/tools/issue.js.map +1 -0
  59. package/dist/adapters/github/tools/pr.d.ts +22 -0
  60. package/dist/adapters/github/tools/pr.d.ts.map +1 -0
  61. package/dist/adapters/github/tools/pr.js +48 -0
  62. package/dist/adapters/github/tools/pr.js.map +1 -0
  63. package/dist/adapters/github/tools/read.d.ts +21 -0
  64. package/dist/adapters/github/tools/read.d.ts.map +1 -0
  65. package/dist/adapters/github/tools/read.js +141 -0
  66. package/dist/adapters/github/tools/read.js.map +1 -0
  67. package/dist/adapters/github/tools/review-reply.d.ts +17 -0
  68. package/dist/adapters/github/tools/review-reply.d.ts.map +1 -0
  69. package/dist/adapters/github/tools/review-reply.js +38 -0
  70. package/dist/adapters/github/tools/review-reply.js.map +1 -0
  71. package/dist/adapters/github/tools/sync.d.ts +17 -0
  72. package/dist/adapters/github/tools/sync.d.ts.map +1 -0
  73. package/dist/adapters/github/tools/sync.js +34 -0
  74. package/dist/adapters/github/tools/sync.js.map +1 -0
  75. package/dist/adapters/github/types.d.ts +373 -0
  76. package/dist/adapters/github/types.d.ts.map +1 -0
  77. package/dist/adapters/github/types.js +2 -0
  78. package/dist/adapters/github/types.js.map +1 -0
  79. package/dist/adapters/intake.d.ts +16 -5
  80. package/dist/adapters/intake.d.ts.map +1 -1
  81. package/dist/adapters/intake.js +86 -23
  82. package/dist/adapters/intake.js.map +1 -1
  83. package/dist/adapters/progressive-renderer.d.ts +7 -0
  84. package/dist/adapters/progressive-renderer.d.ts.map +1 -0
  85. package/dist/adapters/progressive-renderer.js +383 -0
  86. package/dist/adapters/progressive-renderer.js.map +1 -0
  87. package/dist/adapters/shared.d.ts +23 -10
  88. package/dist/adapters/shared.d.ts.map +1 -1
  89. package/dist/adapters/shared.js +60 -22
  90. package/dist/adapters/shared.js.map +1 -1
  91. package/dist/adapters/slack/blocks.d.ts +14 -0
  92. package/dist/adapters/slack/blocks.d.ts.map +1 -1
  93. package/dist/adapters/slack/blocks.js +147 -111
  94. package/dist/adapters/slack/blocks.js.map +1 -1
  95. package/dist/adapters/slack/bot.d.ts +43 -13
  96. package/dist/adapters/slack/bot.d.ts.map +1 -1
  97. package/dist/adapters/slack/bot.js +385 -207
  98. package/dist/adapters/slack/bot.js.map +1 -1
  99. package/dist/adapters/slack/context.d.ts +3 -1
  100. package/dist/adapters/slack/context.d.ts.map +1 -1
  101. package/dist/adapters/slack/context.js +11 -17
  102. package/dist/adapters/slack/context.js.map +1 -1
  103. package/dist/adapters/slack/response-lifecycle.d.ts.map +1 -1
  104. package/dist/adapters/slack/response-lifecycle.js +126 -323
  105. package/dist/adapters/slack/response-lifecycle.js.map +1 -1
  106. package/dist/adapters/slack/session.d.ts.map +1 -1
  107. package/dist/adapters/slack/session.js +7 -11
  108. package/dist/adapters/slack/session.js.map +1 -1
  109. package/dist/adapters/slack/tool-pack.d.ts +11 -0
  110. package/dist/adapters/slack/tool-pack.d.ts.map +1 -0
  111. package/dist/adapters/slack/tool-pack.js +45 -0
  112. package/dist/adapters/slack/tool-pack.js.map +1 -0
  113. package/dist/adapters/slack/tools/attach.js +1 -1
  114. package/dist/adapters/slack/tools/attach.js.map +1 -1
  115. package/dist/adapters/slack/tools/blockkit.d.ts +14 -0
  116. package/dist/adapters/slack/tools/blockkit.d.ts.map +1 -0
  117. package/dist/adapters/slack/tools/blockkit.js +106 -0
  118. package/dist/adapters/slack/tools/blockkit.js.map +1 -0
  119. package/dist/adapters/slack/types.d.ts +40 -2
  120. package/dist/adapters/slack/types.d.ts.map +1 -1
  121. package/dist/adapters/slack/types.js.map +1 -1
  122. package/dist/adapters/telegram/bot.d.ts +8 -9
  123. package/dist/adapters/telegram/bot.d.ts.map +1 -1
  124. package/dist/adapters/telegram/bot.js +90 -117
  125. package/dist/adapters/telegram/bot.js.map +1 -1
  126. package/dist/adapters/telegram/context.d.ts +2 -0
  127. package/dist/adapters/telegram/context.d.ts.map +1 -1
  128. package/dist/adapters/telegram/context.js +61 -184
  129. package/dist/adapters/telegram/context.js.map +1 -1
  130. package/dist/adapters/telegram/html.d.ts.map +1 -1
  131. package/dist/adapters/telegram/html.js +10 -7
  132. package/dist/adapters/telegram/html.js.map +1 -1
  133. package/dist/adapters/types.d.ts +109 -12
  134. package/dist/adapters/types.d.ts.map +1 -1
  135. package/dist/adapters/types.js.map +1 -1
  136. package/dist/agent-events.d.ts +3 -2
  137. package/dist/agent-events.d.ts.map +1 -1
  138. package/dist/agent-events.js +19 -1
  139. package/dist/agent-events.js.map +1 -1
  140. package/dist/agent.d.ts +14 -19
  141. package/dist/agent.d.ts.map +1 -1
  142. package/dist/agent.js +840 -298
  143. package/dist/agent.js.map +1 -1
  144. package/dist/cli/arg-grammar.d.ts +25 -0
  145. package/dist/cli/arg-grammar.d.ts.map +1 -0
  146. package/dist/cli/arg-grammar.js +61 -0
  147. package/dist/cli/arg-grammar.js.map +1 -0
  148. package/dist/cli/boot.d.ts +5 -0
  149. package/dist/cli/boot.d.ts.map +1 -0
  150. package/dist/cli/boot.js +117 -0
  151. package/dist/cli/boot.js.map +1 -0
  152. package/dist/cli/download.d.ts.map +1 -0
  153. package/dist/{download.js → cli/download.js} +2 -0
  154. package/dist/cli/download.js.map +1 -0
  155. package/dist/cli/ext-dev.d.ts +2 -0
  156. package/dist/cli/ext-dev.d.ts.map +1 -0
  157. package/dist/cli/ext-dev.js +188 -0
  158. package/dist/cli/ext-dev.js.map +1 -0
  159. package/dist/cli/ext.d.ts +2 -0
  160. package/dist/cli/ext.d.ts.map +1 -0
  161. package/dist/cli/ext.js +324 -0
  162. package/dist/cli/ext.js.map +1 -0
  163. package/dist/cli/office.d.ts +2 -0
  164. package/dist/cli/office.d.ts.map +1 -0
  165. package/dist/cli/office.js +91 -0
  166. package/dist/cli/office.js.map +1 -0
  167. package/dist/cli/types.d.ts +16 -0
  168. package/dist/cli/types.d.ts.map +1 -0
  169. package/dist/cli/types.js +2 -0
  170. package/dist/cli/types.js.map +1 -0
  171. package/dist/commands/admin.d.ts.map +1 -1
  172. package/dist/commands/admin.js +3 -2
  173. package/dist/commands/admin.js.map +1 -1
  174. package/dist/commands/auto-reply.d.ts.map +1 -1
  175. package/dist/commands/auto-reply.js +5 -9
  176. package/dist/commands/auto-reply.js.map +1 -1
  177. package/dist/commands/extensions.d.ts.map +1 -1
  178. package/dist/commands/extensions.js +9 -6
  179. package/dist/commands/extensions.js.map +1 -1
  180. package/dist/commands/login.d.ts +2 -1
  181. package/dist/commands/login.d.ts.map +1 -1
  182. package/dist/commands/login.js +40 -5
  183. package/dist/commands/login.js.map +1 -1
  184. package/dist/commands/manifest.d.ts +37 -0
  185. package/dist/commands/manifest.d.ts.map +1 -0
  186. package/dist/commands/manifest.js +151 -0
  187. package/dist/commands/manifest.js.map +1 -0
  188. package/dist/commands/model.d.ts +2 -3
  189. package/dist/commands/model.d.ts.map +1 -1
  190. package/dist/commands/model.js +63 -24
  191. package/dist/commands/model.js.map +1 -1
  192. package/dist/commands/new.d.ts.map +1 -1
  193. package/dist/commands/new.js +15 -3
  194. package/dist/commands/new.js.map +1 -1
  195. package/dist/commands/registry.d.ts +2 -2
  196. package/dist/commands/registry.d.ts.map +1 -1
  197. package/dist/commands/registry.js +1 -2
  198. package/dist/commands/registry.js.map +1 -1
  199. package/dist/commands/sandbox.d.ts.map +1 -1
  200. package/dist/commands/sandbox.js +83 -33
  201. package/dist/commands/sandbox.js.map +1 -1
  202. package/dist/commands/session-view.d.ts.map +1 -1
  203. package/dist/commands/session-view.js +6 -3
  204. package/dist/commands/session-view.js.map +1 -1
  205. package/dist/commands/types.d.ts +79 -7
  206. package/dist/commands/types.d.ts.map +1 -1
  207. package/dist/commands/types.js.map +1 -1
  208. package/dist/config.d.ts +23 -8
  209. package/dist/config.d.ts.map +1 -1
  210. package/dist/config.js +222 -135
  211. package/dist/config.js.map +1 -1
  212. package/dist/env-manifest.d.ts +30 -0
  213. package/dist/env-manifest.d.ts.map +1 -0
  214. package/dist/env-manifest.js +229 -0
  215. package/dist/env-manifest.js.map +1 -0
  216. package/dist/events.d.ts.map +1 -1
  217. package/dist/events.js +20 -81
  218. package/dist/events.js.map +1 -1
  219. package/dist/execution-resolver.d.ts +7 -8
  220. package/dist/execution-resolver.d.ts.map +1 -1
  221. package/dist/execution-resolver.js +106 -110
  222. package/dist/execution-resolver.js.map +1 -1
  223. package/dist/extension-schedules.d.ts +31 -0
  224. package/dist/extension-schedules.d.ts.map +1 -0
  225. package/dist/extension-schedules.js +229 -0
  226. package/dist/extension-schedules.js.map +1 -0
  227. package/dist/harness/auth.d.ts +2 -1
  228. package/dist/harness/auth.d.ts.map +1 -1
  229. package/dist/harness/auth.js +11 -5
  230. package/dist/harness/auth.js.map +1 -1
  231. package/dist/harness/event-format.d.ts +27 -0
  232. package/dist/harness/event-format.d.ts.map +1 -0
  233. package/dist/harness/event-format.js +160 -0
  234. package/dist/harness/event-format.js.map +1 -0
  235. package/dist/harness/extensions/loader.d.ts +27 -49
  236. package/dist/harness/extensions/loader.d.ts.map +1 -1
  237. package/dist/harness/extensions/loader.js +486 -130
  238. package/dist/harness/extensions/loader.js.map +1 -1
  239. package/dist/harness/extensions/registry.d.ts +107 -2
  240. package/dist/harness/extensions/registry.d.ts.map +1 -1
  241. package/dist/harness/extensions/registry.js +316 -0
  242. package/dist/harness/extensions/registry.js.map +1 -1
  243. package/dist/harness/extensions/types.d.ts +482 -42
  244. package/dist/harness/extensions/types.d.ts.map +1 -1
  245. package/dist/harness/extensions/types.js.map +1 -1
  246. package/dist/harness/index.d.ts +18 -8
  247. package/dist/harness/index.d.ts.map +1 -1
  248. package/dist/harness/index.js +7 -4
  249. package/dist/harness/index.js.map +1 -1
  250. package/dist/harness/models.d.ts +7 -4
  251. package/dist/harness/models.d.ts.map +1 -1
  252. package/dist/harness/models.js +46 -24
  253. package/dist/harness/models.js.map +1 -1
  254. package/dist/harness/runner.d.ts +50 -54
  255. package/dist/harness/runner.d.ts.map +1 -1
  256. package/dist/harness/runner.js +232 -46
  257. package/dist/harness/runner.js.map +1 -1
  258. package/dist/harness/session-store.d.ts +11 -5
  259. package/dist/harness/session-store.d.ts.map +1 -1
  260. package/dist/harness/session-store.js +141 -36
  261. package/dist/harness/session-store.js.map +1 -1
  262. package/dist/harness/settings.d.ts +2 -20
  263. package/dist/harness/settings.d.ts.map +1 -1
  264. package/dist/harness/settings.js +12 -1
  265. package/dist/harness/settings.js.map +1 -1
  266. package/dist/harness/skills.d.ts +10 -29
  267. package/dist/harness/skills.d.ts.map +1 -1
  268. package/dist/harness/skills.js +48 -6
  269. package/dist/harness/skills.js.map +1 -1
  270. package/dist/harness/subagent-profiles.d.ts +8 -0
  271. package/dist/harness/subagent-profiles.d.ts.map +1 -0
  272. package/dist/harness/subagent-profiles.js +299 -0
  273. package/dist/harness/subagent-profiles.js.map +1 -0
  274. package/dist/harness/subagent-runner.d.ts +39 -0
  275. package/dist/harness/subagent-runner.d.ts.map +1 -0
  276. package/dist/harness/subagent-runner.js +617 -0
  277. package/dist/harness/subagent-runner.js.map +1 -0
  278. package/dist/harness/types.d.ts +267 -1
  279. package/dist/harness/types.d.ts.map +1 -1
  280. package/dist/harness/types.js.map +1 -1
  281. package/dist/harness/usage.d.ts +6 -0
  282. package/dist/harness/usage.d.ts.map +1 -0
  283. package/dist/harness/usage.js +32 -0
  284. package/dist/harness/usage.js.map +1 -0
  285. package/dist/index.d.ts +36 -8
  286. package/dist/index.d.ts.map +1 -1
  287. package/dist/index.js +22 -6
  288. package/dist/index.js.map +1 -1
  289. package/dist/main.js +391 -127
  290. package/dist/main.js.map +1 -1
  291. package/dist/observability/instrument.js +7 -5
  292. package/dist/observability/instrument.js.map +1 -1
  293. package/dist/observability/sentry.d.ts +2 -0
  294. package/dist/observability/sentry.d.ts.map +1 -1
  295. package/dist/observability/sentry.js +10 -2
  296. package/dist/observability/sentry.js.map +1 -1
  297. package/dist/office/address.d.ts +31 -0
  298. package/dist/office/address.d.ts.map +1 -0
  299. package/dist/office/address.js +113 -0
  300. package/dist/office/address.js.map +1 -0
  301. package/dist/office/index.d.ts +11 -0
  302. package/dist/office/index.d.ts.map +1 -0
  303. package/dist/office/index.js +11 -0
  304. package/dist/office/index.js.map +1 -0
  305. package/dist/office/layout.d.ts +27 -0
  306. package/dist/office/layout.d.ts.map +1 -0
  307. package/dist/office/layout.js +97 -0
  308. package/dist/office/layout.js.map +1 -0
  309. package/dist/office/migration.d.ts +44 -0
  310. package/dist/office/migration.d.ts.map +1 -0
  311. package/dist/office/migration.js +255 -0
  312. package/dist/office/migration.js.map +1 -0
  313. package/dist/office/registry.d.ts +75 -0
  314. package/dist/office/registry.d.ts.map +1 -0
  315. package/dist/office/registry.js +646 -0
  316. package/dist/office/registry.js.map +1 -0
  317. package/dist/office/types.d.ts +71 -0
  318. package/dist/office/types.d.ts.map +1 -0
  319. package/dist/office/types.js +2 -0
  320. package/dist/office/types.js.map +1 -0
  321. package/dist/packages/admin.d.ts +17 -0
  322. package/dist/packages/admin.d.ts.map +1 -0
  323. package/dist/packages/admin.js +98 -0
  324. package/dist/packages/admin.js.map +1 -0
  325. package/dist/packages/index.d.ts +6 -0
  326. package/dist/packages/index.d.ts.map +1 -0
  327. package/dist/packages/index.js +6 -0
  328. package/dist/packages/index.js.map +1 -0
  329. package/dist/packages/inspect.d.ts +11 -0
  330. package/dist/packages/inspect.d.ts.map +1 -0
  331. package/dist/packages/inspect.js +98 -0
  332. package/dist/packages/inspect.js.map +1 -0
  333. package/dist/packages/materialize.d.ts +40 -0
  334. package/dist/packages/materialize.d.ts.map +1 -0
  335. package/dist/packages/materialize.js +297 -0
  336. package/dist/packages/materialize.js.map +1 -0
  337. package/dist/packages/resolve.d.ts +25 -0
  338. package/dist/packages/resolve.d.ts.map +1 -0
  339. package/dist/packages/resolve.js +208 -0
  340. package/dist/packages/resolve.js.map +1 -0
  341. package/dist/packages/source.d.ts +39 -0
  342. package/dist/packages/source.d.ts.map +1 -0
  343. package/dist/packages/source.js +189 -0
  344. package/dist/packages/source.js.map +1 -0
  345. package/dist/packages/types.d.ts +104 -0
  346. package/dist/packages/types.d.ts.map +1 -0
  347. package/dist/packages/types.js +2 -0
  348. package/dist/packages/types.js.map +1 -0
  349. package/dist/provisioner.d.ts +66 -0
  350. package/dist/provisioner.d.ts.map +1 -1
  351. package/dist/provisioner.js +335 -13
  352. package/dist/provisioner.js.map +1 -1
  353. package/dist/runtime/conversation-runtime.d.ts +1 -1
  354. package/dist/runtime/conversation-runtime.d.ts.map +1 -1
  355. package/dist/runtime/conversation-runtime.js +562 -118
  356. package/dist/runtime/conversation-runtime.js.map +1 -1
  357. package/dist/runtime/session-lifecycle.d.ts +38 -0
  358. package/dist/runtime/session-lifecycle.d.ts.map +1 -0
  359. package/dist/runtime/session-lifecycle.js +193 -0
  360. package/dist/runtime/session-lifecycle.js.map +1 -0
  361. package/dist/runtime/types.d.ts +66 -7
  362. package/dist/runtime/types.d.ts.map +1 -1
  363. package/dist/runtime/types.js.map +1 -1
  364. package/dist/sandbox/cloudflare.d.ts +3 -0
  365. package/dist/sandbox/cloudflare.d.ts.map +1 -1
  366. package/dist/sandbox/cloudflare.js +13 -1
  367. package/dist/sandbox/cloudflare.js.map +1 -1
  368. package/dist/sandbox/container.d.ts +4 -0
  369. package/dist/sandbox/container.d.ts.map +1 -1
  370. package/dist/sandbox/container.js +13 -3
  371. package/dist/sandbox/container.js.map +1 -1
  372. package/dist/sandbox/firecracker.d.ts +3 -0
  373. package/dist/sandbox/firecracker.d.ts.map +1 -1
  374. package/dist/sandbox/firecracker.js +13 -2
  375. package/dist/sandbox/firecracker.js.map +1 -1
  376. package/dist/sandbox/gondolin.d.ts +57 -0
  377. package/dist/sandbox/gondolin.d.ts.map +1 -0
  378. package/dist/sandbox/gondolin.js +764 -0
  379. package/dist/sandbox/gondolin.js.map +1 -0
  380. package/dist/sandbox/host.d.ts +3 -0
  381. package/dist/sandbox/host.d.ts.map +1 -1
  382. package/dist/sandbox/host.js +18 -3
  383. package/dist/sandbox/host.js.map +1 -1
  384. package/dist/sandbox/identity.d.ts +44 -0
  385. package/dist/sandbox/identity.d.ts.map +1 -0
  386. package/dist/sandbox/identity.js +68 -0
  387. package/dist/sandbox/identity.js.map +1 -0
  388. package/dist/sandbox/image.d.ts.map +1 -1
  389. package/dist/sandbox/image.js +2 -0
  390. package/dist/sandbox/image.js.map +1 -1
  391. package/dist/sandbox/index.d.ts +17 -4
  392. package/dist/sandbox/index.d.ts.map +1 -1
  393. package/dist/sandbox/index.js +37 -3
  394. package/dist/sandbox/index.js.map +1 -1
  395. package/dist/sandbox/types.d.ts +65 -1
  396. package/dist/sandbox/types.d.ts.map +1 -1
  397. package/dist/sandbox/types.js.map +1 -1
  398. package/dist/sandbox/utils.d.ts +14 -0
  399. package/dist/sandbox/utils.d.ts.map +1 -1
  400. package/dist/sandbox/utils.js +68 -1
  401. package/dist/sandbox/utils.js.map +1 -1
  402. package/dist/sessions/chat-history-sync.d.ts +25 -0
  403. package/dist/sessions/chat-history-sync.d.ts.map +1 -0
  404. package/dist/sessions/{agent-memory-file-manager.js → chat-history-sync.js} +135 -131
  405. package/dist/sessions/chat-history-sync.js.map +1 -0
  406. package/dist/sessions/conversation-log.d.ts +9 -0
  407. package/dist/sessions/conversation-log.d.ts.map +1 -0
  408. package/dist/sessions/conversation-log.js +50 -0
  409. package/dist/sessions/conversation-log.js.map +1 -0
  410. package/dist/sessions/history-line.d.ts +29 -0
  411. package/dist/sessions/history-line.d.ts.map +1 -0
  412. package/dist/sessions/history-line.js +45 -0
  413. package/dist/sessions/history-line.js.map +1 -0
  414. package/dist/sessions/rotation.d.ts +2 -0
  415. package/dist/sessions/rotation.d.ts.map +1 -0
  416. package/dist/sessions/rotation.js +39 -0
  417. package/dist/sessions/rotation.js.map +1 -0
  418. package/dist/sessions/session-key.d.ts +33 -0
  419. package/dist/sessions/session-key.d.ts.map +1 -0
  420. package/dist/sessions/session-key.js +115 -0
  421. package/dist/sessions/session-key.js.map +1 -0
  422. package/dist/sessions/store.d.ts +15 -7
  423. package/dist/sessions/store.d.ts.map +1 -1
  424. package/dist/sessions/store.js +127 -36
  425. package/dist/sessions/store.js.map +1 -1
  426. package/dist/sessions/types.d.ts +19 -5
  427. package/dist/sessions/types.d.ts.map +1 -1
  428. package/dist/sessions/types.js.map +1 -1
  429. package/dist/settings-mutation.d.ts +40 -0
  430. package/dist/settings-mutation.d.ts.map +1 -0
  431. package/dist/settings-mutation.js +61 -0
  432. package/dist/settings-mutation.js.map +1 -0
  433. package/dist/subagent-progress.d.ts +43 -0
  434. package/dist/subagent-progress.d.ts.map +1 -0
  435. package/dist/subagent-progress.js +220 -0
  436. package/dist/subagent-progress.js.map +1 -0
  437. package/dist/tools/bash.d.ts +3 -1
  438. package/dist/tools/bash.d.ts.map +1 -1
  439. package/dist/tools/bash.js +26 -18
  440. package/dist/tools/bash.js.map +1 -1
  441. package/dist/tools/edit.d.ts.map +1 -1
  442. package/dist/tools/edit.js +14 -13
  443. package/dist/tools/edit.js.map +1 -1
  444. package/dist/tools/event.d.ts +1 -1
  445. package/dist/tools/event.d.ts.map +1 -1
  446. package/dist/tools/event.js +58 -45
  447. package/dist/tools/event.js.map +1 -1
  448. package/dist/tools/generate-image.d.ts +23 -0
  449. package/dist/tools/generate-image.d.ts.map +1 -0
  450. package/dist/tools/generate-image.js +65 -0
  451. package/dist/tools/generate-image.js.map +1 -0
  452. package/dist/tools/host-fn-tool.d.ts +21 -0
  453. package/dist/tools/host-fn-tool.d.ts.map +1 -0
  454. package/dist/tools/host-fn-tool.js +32 -0
  455. package/dist/tools/host-fn-tool.js.map +1 -0
  456. package/dist/tools/index.d.ts +19 -2
  457. package/dist/tools/index.d.ts.map +1 -1
  458. package/dist/tools/index.js +25 -2
  459. package/dist/tools/index.js.map +1 -1
  460. package/dist/tools/react.d.ts +15 -0
  461. package/dist/tools/react.d.ts.map +1 -0
  462. package/dist/tools/react.js +29 -0
  463. package/dist/tools/react.js.map +1 -0
  464. package/dist/tools/read.d.ts +1 -0
  465. package/dist/tools/read.d.ts.map +1 -1
  466. package/dist/tools/read.js +39 -33
  467. package/dist/tools/read.js.map +1 -1
  468. package/dist/tools/sandbox.d.ts +2 -2
  469. package/dist/tools/sandbox.d.ts.map +1 -1
  470. package/dist/tools/sandbox.js +14 -9
  471. package/dist/tools/sandbox.js.map +1 -1
  472. package/dist/tools/subagent-slots.d.ts +28 -0
  473. package/dist/tools/subagent-slots.d.ts.map +1 -0
  474. package/dist/tools/subagent-slots.js +72 -0
  475. package/dist/tools/subagent-slots.js.map +1 -0
  476. package/dist/tools/subagent.d.ts +54 -0
  477. package/dist/tools/subagent.d.ts.map +1 -0
  478. package/dist/tools/subagent.js +411 -0
  479. package/dist/tools/subagent.js.map +1 -0
  480. package/dist/tools/types.d.ts +40 -32
  481. package/dist/tools/types.d.ts.map +1 -1
  482. package/dist/tools/types.js.map +1 -1
  483. package/dist/tools/write.d.ts.map +1 -1
  484. package/dist/tools/write.js +2 -8
  485. package/dist/tools/write.js.map +1 -1
  486. package/dist/trigger.d.ts +2 -1
  487. package/dist/trigger.d.ts.map +1 -1
  488. package/dist/trigger.js +6 -9
  489. package/dist/trigger.js.map +1 -1
  490. package/dist/types.d.ts +403 -59
  491. package/dist/types.d.ts.map +1 -1
  492. package/dist/types.js +2 -2
  493. package/dist/types.js.map +1 -1
  494. package/dist/utils/file-guards.d.ts +9 -0
  495. package/dist/utils/file-guards.d.ts.map +1 -1
  496. package/dist/utils/file-guards.js +44 -1
  497. package/dist/utils/file-guards.js.map +1 -1
  498. package/dist/vault/disabled.d.ts +9 -0
  499. package/dist/vault/disabled.d.ts.map +1 -0
  500. package/dist/vault/disabled.js +25 -0
  501. package/dist/vault/disabled.js.map +1 -0
  502. package/dist/vault/index.d.ts +45 -2
  503. package/dist/vault/index.d.ts.map +1 -1
  504. package/dist/vault/index.js +127 -36
  505. package/dist/vault/index.js.map +1 -1
  506. package/dist/vault/types.d.ts +6 -2
  507. package/dist/vault/types.d.ts.map +1 -1
  508. package/dist/vault/types.js.map +1 -1
  509. package/dist/web/admin/portal.d.ts +31 -3
  510. package/dist/web/admin/portal.d.ts.map +1 -1
  511. package/dist/web/admin/portal.js +846 -345
  512. package/dist/web/admin/portal.js.map +1 -1
  513. package/dist/web/admin/provider-models.js +1 -1
  514. package/dist/web/admin/provider-models.js.map +1 -1
  515. package/dist/web/admin/types.d.ts +23 -3
  516. package/dist/web/admin/types.d.ts.map +1 -1
  517. package/dist/web/admin/types.js.map +1 -1
  518. package/dist/web/login/oauth.d.ts +2 -3
  519. package/dist/web/login/oauth.d.ts.map +1 -1
  520. package/dist/web/login/oauth.js +1 -32
  521. package/dist/web/login/oauth.js.map +1 -1
  522. package/dist/web/login/portal.d.ts +1 -1
  523. package/dist/web/login/portal.d.ts.map +1 -1
  524. package/dist/web/login/portal.js +13 -36
  525. package/dist/web/login/portal.js.map +1 -1
  526. package/dist/web/login/types.d.ts +0 -11
  527. package/dist/web/login/types.d.ts.map +1 -1
  528. package/dist/web/login/types.js.map +1 -1
  529. package/dist/web/portal-shell.d.ts +21 -0
  530. package/dist/web/portal-shell.d.ts.map +1 -0
  531. package/dist/{portal-shell.js → web/portal-shell.js} +67 -2
  532. package/dist/web/portal-shell.js.map +1 -0
  533. package/dist/web/server.d.ts +3 -2
  534. package/dist/web/server.d.ts.map +1 -1
  535. package/dist/web/server.js +11 -4
  536. package/dist/web/server.js.map +1 -1
  537. package/dist/web/session-view/portal.d.ts +1 -1
  538. package/dist/web/session-view/portal.d.ts.map +1 -1
  539. package/dist/web/session-view/portal.js +37 -28
  540. package/dist/web/session-view/portal.js.map +1 -1
  541. package/dist/web/session-view/service.d.ts +1 -1
  542. package/dist/web/session-view/service.d.ts.map +1 -1
  543. package/dist/web/session-view/service.js +61 -18
  544. package/dist/web/session-view/service.js.map +1 -1
  545. package/dist/web/session-view/types.d.ts +0 -3
  546. package/dist/web/session-view/types.d.ts.map +1 -1
  547. package/dist/web/session-view/types.js.map +1 -1
  548. package/dist/web/token-store.js +1 -1
  549. package/dist/web/token-store.js.map +1 -1
  550. package/dist/workspace-projection/index.d.ts +10 -0
  551. package/dist/workspace-projection/index.d.ts.map +1 -0
  552. package/dist/workspace-projection/index.js +120 -0
  553. package/dist/workspace-projection/index.js.map +1 -0
  554. package/dist/workspace-projection/types.d.ts +16 -0
  555. package/dist/workspace-projection/types.d.ts.map +1 -0
  556. package/dist/workspace-projection/types.js +2 -0
  557. package/dist/workspace-projection/types.js.map +1 -0
  558. package/package.json +67 -37
  559. package/dist/adapters/streaming.d.ts +0 -18
  560. package/dist/adapters/streaming.d.ts.map +0 -1
  561. package/dist/adapters/streaming.js +0 -44
  562. package/dist/adapters/streaming.js.map +0 -1
  563. package/dist/commands/parse.d.ts +0 -7
  564. package/dist/commands/parse.d.ts.map +0 -1
  565. package/dist/commands/parse.js +0 -14
  566. package/dist/commands/parse.js.map +0 -1
  567. package/dist/download.d.ts.map +0 -1
  568. package/dist/download.js.map +0 -1
  569. package/dist/model-registry.d.ts +0 -4
  570. package/dist/model-registry.d.ts.map +0 -1
  571. package/dist/model-registry.js +0 -7
  572. package/dist/model-registry.js.map +0 -1
  573. package/dist/portal-shell.d.ts +0 -4
  574. package/dist/portal-shell.d.ts.map +0 -1
  575. package/dist/portal-shell.js.map +0 -1
  576. package/dist/runtime/agent-run-controller.d.ts +0 -31
  577. package/dist/runtime/agent-run-controller.d.ts.map +0 -1
  578. package/dist/runtime/agent-run-controller.js +0 -195
  579. package/dist/runtime/agent-run-controller.js.map +0 -1
  580. package/dist/sandbox/path-context.d.ts +0 -3
  581. package/dist/sandbox/path-context.d.ts.map +0 -1
  582. package/dist/sandbox/path-context.js +0 -20
  583. package/dist/sandbox/path-context.js.map +0 -1
  584. package/dist/sessions/agent-memory-file-manager.d.ts +0 -19
  585. package/dist/sessions/agent-memory-file-manager.d.ts.map +0 -1
  586. package/dist/sessions/agent-memory-file-manager.js.map +0 -1
  587. package/dist/sessions/metadata.d.ts +0 -3
  588. package/dist/sessions/metadata.d.ts.map +0 -1
  589. package/dist/sessions/metadata.js +0 -11
  590. package/dist/sessions/metadata.js.map +0 -1
  591. package/dist/sessions/policy.d.ts +0 -6
  592. package/dist/sessions/policy.d.ts.map +0 -1
  593. package/dist/sessions/policy.js +0 -23
  594. package/dist/sessions/policy.js.map +0 -1
  595. package/dist/store.d.ts +0 -46
  596. package/dist/store.d.ts.map +0 -1
  597. package/dist/store.js +0 -177
  598. package/dist/store.js.map +0 -1
  599. package/dist/tools/truncate.d.ts +0 -33
  600. package/dist/tools/truncate.d.ts.map +0 -1
  601. package/dist/tools/truncate.js +0 -184
  602. package/dist/tools/truncate.js.map +0 -1
  603. package/dist/utils/date.d.ts +0 -10
  604. package/dist/utils/date.d.ts.map +0 -1
  605. package/dist/utils/date.js +0 -23
  606. package/dist/utils/date.js.map +0 -1
  607. package/dist/utils/env.d.ts +0 -3
  608. package/dist/utils/env.d.ts.map +0 -1
  609. package/dist/utils/env.js +0 -12
  610. package/dist/utils/env.js.map +0 -1
  611. package/dist/utils/fs-atomic.d.ts +0 -10
  612. package/dist/utils/fs-atomic.d.ts.map +0 -1
  613. package/dist/utils/fs-atomic.js +0 -45
  614. package/dist/utils/fs-atomic.js.map +0 -1
  615. package/dist/utils/html.d.ts +0 -2
  616. package/dist/utils/html.d.ts.map +0 -1
  617. package/dist/utils/html.js +0 -4
  618. package/dist/utils/html.js.map +0 -1
  619. package/dist/utils/http-body.d.ts +0 -10
  620. package/dist/utils/http-body.d.ts.map +0 -1
  621. package/dist/utils/http-body.js +0 -34
  622. package/dist/utils/http-body.js.map +0 -1
  623. package/dist/vault/routing.d.ts +0 -3
  624. package/dist/vault/routing.d.ts.map +0 -1
  625. package/dist/vault/routing.js +0 -13
  626. package/dist/vault/routing.js.map +0 -1
  627. package/dist/web/agent-events/portal.d.ts +0 -3
  628. package/dist/web/agent-events/portal.d.ts.map +0 -1
  629. package/dist/web/agent-events/portal.js +0 -18
  630. package/dist/web/agent-events/portal.js.map +0 -1
  631. package/dist/web/request.d.ts +0 -3
  632. package/dist/web/request.d.ts.map +0 -1
  633. package/dist/web/request.js +0 -13
  634. package/dist/web/request.js.map +0 -1
  635. package/dist/web/session-view/command.d.ts +0 -4
  636. package/dist/web/session-view/command.d.ts.map +0 -1
  637. package/dist/web/session-view/command.js +0 -7
  638. package/dist/web/session-view/command.js.map +0 -1
  639. /package/dist/{download.d.ts → cli/download.d.ts} +0 -0
@@ -1,18 +1,35 @@
1
+ import { createOfficeAddress, officeKey } from "../office/index.js";
1
2
  import { createRunner } from "../agent.js";
2
- import { defaultCommandHandlers } from "../commands/registry.js";
3
+ import { MikanModels } from "../harness/index.js";
4
+ import { defaultCommandHandlers, dispatchCommand } from "../commands/registry.js";
5
+ import { isPrivateConversation } from "../commands/utils.js";
3
6
  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";
7
+ import { addLifecycleBreadcrumb, applyRunScope, createRunAttributionAttributes, registerTraceAttribution, reportUserFacingError, } from "../observability/sentry.js";
8
+ import { ChatHistorySync, hasMaterializedChatSession, waitForThreadSessionBootstrap, } from "../sessions/chat-history-sync.js";
9
+ import { shouldRotateTopLevelSession } from "../sessions/rotation.js";
10
+ import { resolveChannelSessionFile } from "../sessions/store.js";
11
+ import { assertSessionKeyBelongsToConversation, deriveSessionKey, inferConversationKind, } from "../sessions/session-key.js";
12
+ import { formatNothingRunning, formatStopped, formatStopping } from "../platform-messages.js";
8
13
  import * as Sentry from "@sentry/node";
9
- import { join } from "path";
10
- import { getUnresolvedSandboxPathContext } from "../agent.js";
11
- const MAX_SESSIONS = 500;
12
- const IDLE_TIMEOUT_MS = 3_600_000;
13
- function runtimeCwdForSandbox(sandbox, hostWorkspaceRoot, conversationId) {
14
- const runtimeWorkspaceRoot = getUnresolvedSandboxPathContext(sandbox, hostWorkspaceRoot).runtimeWorkspaceRoot;
15
- return `${runtimeWorkspaceRoot.replace(/\/+$/, "")}/${conversationId}`;
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
+ }
29
+ function runtimeCwdForSandbox(sandbox, workspace, address) {
30
+ const runtimeWorkspaceRoot = getUnresolvedSandboxPathContext(sandbox, workspace.root).runtimeWorkspaceRoot;
31
+ // The office key names the same segment on the host and in the runtime.
32
+ return `${runtimeWorkspaceRoot.replace(/\/+$/, "")}/${workspace.office(address).key}`;
16
33
  }
17
34
  export function createConversationRuntime(options) {
18
35
  return new ConversationRuntimeImpl(options);
@@ -20,45 +37,36 @@ export function createConversationRuntime(options) {
20
37
  class ConversationRuntimeImpl {
21
38
  constructor(options) {
22
39
  this.options = options;
23
- this.conversationStates = new Map();
24
- this.sessionQueues = new Map();
40
+ this.sessions = new SessionLifecycle();
25
41
  this.inFlightRuns = new Set();
26
- this.chatSessionManager = new AgentMemoryFileManager();
42
+ this.sessionDreamSettlements = new Set();
43
+ this.chatSessionManager = new ChatHistorySync();
44
+ this.globalRunnerGeneration = 0;
45
+ this.conversationRunnerGenerations = new Map();
27
46
  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
- });
47
+ this.resolvedModels = options.models ?? MikanModels.create();
48
+ this.commandServices = {
49
+ ...options,
50
+ resourceController: options.resourceController ?? options.provisioner,
51
+ vaultManager: options.vaultManager ?? disabledVaultManager,
52
+ linkTokenStore: options.linkTokenStore ?? portalNotConfiguredTokenStore("Login"),
53
+ sessionViewTokenStore: options.sessionViewTokenStore ?? portalNotConfiguredTokenStore("Session viewer"),
54
+ adminTokenStore: options.adminTokenStore ?? portalNotConfiguredTokenStore("Admin"),
55
+ runtime: this,
56
+ };
57
+ this.commandHandlers = options.commandHandlers ?? defaultCommandHandlers(this.resolvedModels);
50
58
  }
51
- isRunning(sessionKey) {
52
- const state = this.conversationStates.get(sessionKey);
53
- return !!state?.running;
59
+ isRunning(address, sessionKey) {
60
+ return this.sessions.isRunning(address, sessionKey);
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 state of this.sessions.runningStates()) {
65
+ if (state.startedAt) {
59
66
  const currentStep = state.runner.getCurrentStep();
60
67
  sessions.push({
61
- sessionKey,
68
+ address: state.address,
69
+ sessionKey: state.sessionKey,
62
70
  startedAt: state.startedAt,
63
71
  lastActivityAt: state.lastActivityAt,
64
72
  currentTool: currentStep?.label || currentStep?.toolName,
@@ -67,114 +75,571 @@ class ConversationRuntimeImpl {
67
75
  }
68
76
  return sessions;
69
77
  }
70
- async handleStop(sessionKey, conversationId, bot) {
71
- const state = this.conversationStates.get(sessionKey);
78
+ async handleStop(address, sessionKey, bot) {
79
+ assertSessionKeyBelongsToConversation(sessionKey, address.conversationId);
80
+ const state = this.sessions.get(address, sessionKey);
72
81
  if (state?.running) {
73
82
  state.stopRequested = true;
74
83
  state.runner.abort();
75
- const ts = await bot.postMessage(conversationId, formatStopping(bot));
84
+ const ts = await bot.postMessage(address.conversationId, formatStopping(bot));
76
85
  state.stopMessageTs = ts;
77
86
  }
78
87
  else {
79
- await bot.postMessage(conversationId, formatNothingRunning(bot));
88
+ await bot.postMessage(address.conversationId, formatNothingRunning(bot));
80
89
  }
81
90
  }
82
- forceStop(sessionKey) {
83
- const state = this.conversationStates.get(sessionKey);
91
+ forceStop(address, sessionKey) {
92
+ const state = this.sessions.get(address, sessionKey);
84
93
  if (state?.running) {
85
94
  log.logInfo(`[Force Stop] Force stopping session: ${sessionKey}`);
86
95
  state.stopRequested = true;
87
96
  state.runner.abort();
88
- state.running = false;
89
97
  }
90
98
  }
91
- async handleNewCommand(sessionKey, conversationId, bot) {
92
- const state = this.conversationStates.get(sessionKey);
93
- if (state?.running) {
99
+ async handleNewCommand(sessionKey, conversationId, bot, message, responder, platform) {
100
+ // The message's address is the authority; the raw id is still passed for
101
+ // filesystem layout, so a disagreement must fail loudly, not pick one.
102
+ const address = message.address;
103
+ if (conversationId !== address.conversationId) {
104
+ throw new Error(`Conversation id ${JSON.stringify(conversationId)} does not match office ` +
105
+ JSON.stringify(address.conversationId));
106
+ }
107
+ assertSessionKeyBelongsToConversation(sessionKey, address.conversationId);
108
+ const activeState = this.sessions.get(address, sessionKey);
109
+ if (activeState?.running ||
110
+ (activeState?.runSettlement && this.sessionDreamSettlements.has(activeState.runSettlement))) {
111
+ const activeSettlement = activeState.runSettlement;
112
+ if (activeSettlement && this.sessionDreamSettlements.has(activeSettlement)) {
113
+ await activeSettlement;
114
+ return;
115
+ }
116
+ activeState.stopRequested = true;
117
+ activeState.runner.abort();
118
+ await activeSettlement;
119
+ }
120
+ const state = await this.getOrCreateState({
121
+ address,
122
+ conversationId,
123
+ sessionKey,
124
+ conversationKind: message.conversationKind,
125
+ });
126
+ if (state.running ||
127
+ (state.runSettlement && this.sessionDreamSettlements.has(state.runSettlement))) {
128
+ const activeSettlement = state.runSettlement;
129
+ if (activeSettlement && this.sessionDreamSettlements.has(activeSettlement)) {
130
+ await activeSettlement;
131
+ return;
132
+ }
94
133
  state.stopRequested = true;
95
134
  state.runner.abort();
135
+ await activeSettlement;
136
+ return this.handleNewCommand(sessionKey, conversationId, bot, message, responder, platform);
96
137
  }
97
- const conversationDir = join(this.options.workingDir, conversationId);
98
- const runtimeCwd = runtimeCwdForSandbox(this.options.sandbox, this.options.workingDir, conversationId);
138
+ const dreamSettlement = this.startSessionDream(state, async () => {
139
+ let working = false;
140
+ try {
141
+ await responder.setWorking(true);
142
+ working = true;
143
+ const result = await this.dreamSessionMemory(state, message, platform);
144
+ if (!result.success) {
145
+ const detail = result.errorMessage ? ` ${result.errorMessage}` : "";
146
+ await responder.respondDiagnostic(`Could not preserve memory, so the current conversation was not reset.${detail}`, { style: "error" });
147
+ return;
148
+ }
149
+ await responder.setWorking(false);
150
+ working = false;
151
+ await this.resetSession(state, bot);
152
+ }
153
+ finally {
154
+ if (working)
155
+ await responder.setWorking(false);
156
+ }
157
+ });
158
+ try {
159
+ await dreamSettlement;
160
+ }
161
+ finally {
162
+ this.finishSessionDream(state, dreamSettlement);
163
+ }
164
+ }
165
+ startSessionDream(state, dream, markRunning = true) {
166
+ if (markRunning) {
167
+ state.running = true;
168
+ state.stopRequested = false;
169
+ state.startedAt = Date.now();
170
+ state.lastActivityAt = Date.now();
171
+ }
172
+ const settlement = Promise.resolve().then(dream);
173
+ state.runSettlement = settlement;
174
+ this.sessionDreamSettlements.add(settlement);
175
+ this.inFlightRuns.add(settlement);
176
+ return settlement;
177
+ }
178
+ finishSessionDream(state, settlement) {
179
+ this.sessionDreamSettlements.delete(settlement);
180
+ this.inFlightRuns.delete(settlement);
181
+ if (state.runSettlement !== settlement)
182
+ return;
183
+ state.runSettlement = undefined;
184
+ state.running = false;
185
+ state.startedAt = 0;
186
+ state.lastAccessedAt = Date.now();
187
+ this.sessions.onSettlement(state.address);
188
+ this.sessions.evictIdle();
189
+ }
190
+ async dreamSessionMemory(state, message, platform) {
191
+ try {
192
+ const result = await state.runner.dreamSessionMemory(message, platform);
193
+ // Only a clean stop means the dream finished its work. Everything else —
194
+ // budget abort, length cutoff, error, blocked — leaves memory unwritten,
195
+ // and treating it as success resets the session and loses it silently.
196
+ // Listed as a whitelist so a new stop reason fails safe.
197
+ if (result.stopReason !== "stop") {
198
+ return {
199
+ success: false,
200
+ errorMessage: result.errorMessage ?? `Session Dream stopped early (${result.stopReason})`,
201
+ };
202
+ }
203
+ return { success: true };
204
+ }
205
+ catch (err) {
206
+ return { success: false, errorMessage: err instanceof Error ? err.message : String(err) };
207
+ }
208
+ }
209
+ async rotateSharedSessionAfterDream(address, sessionKey, message, platform) {
210
+ const conversationId = address.conversationId;
211
+ if (message.conversationKind !== "shared" || sessionKey !== conversationId)
212
+ return;
213
+ const conversationDir = this.options.workspace.office(address).dir;
214
+ const currentSession = resolveChannelSessionFile(conversationDir);
215
+ if (!currentSession || !shouldRotateTopLevelSession(currentSession, new Date()))
216
+ return;
217
+ await this.sessions.runConversationMaintenance(address, async () => {
218
+ const session = resolveChannelSessionFile(conversationDir);
219
+ if (!session || !shouldRotateTopLevelSession(session, new Date()))
220
+ return;
221
+ const state = await this.getOrCreateState({
222
+ address,
223
+ conversationId,
224
+ sessionKey,
225
+ conversationKind: message.conversationKind,
226
+ currentMessageId: message.id,
227
+ });
228
+ const dreamSettlement = this.startSessionDream(state, async () => {
229
+ const result = await this.dreamSessionMemory(state, message, platform);
230
+ if (!result.success) {
231
+ const detail = result.errorMessage ? `: ${result.errorMessage}` : "";
232
+ log.logWarning(`[${conversationId}] Automatic Session Dream failed${detail}`);
233
+ return;
234
+ }
235
+ const runtimeCwd = runtimeCwdForSandbox(this.options.sandbox, this.options.workspace, address);
236
+ this.chatSessionManager.resetSession({ conversationDir, sessionKey, cwd: runtimeCwd });
237
+ this.sessions.discard(address, sessionKey);
238
+ log.logInfo(`[${conversationId}] Session Dream completed; rotated session: ${sessionKey}`);
239
+ }, false);
240
+ try {
241
+ await dreamSettlement;
242
+ }
243
+ finally {
244
+ this.finishSessionDream(state, dreamSettlement);
245
+ }
246
+ });
247
+ }
248
+ async resetSession(state, bot) {
249
+ const { address, sessionKey } = state;
250
+ const conversationId = address.conversationId;
251
+ const conversationDir = this.options.workspace.office(address).dir;
252
+ const runtimeCwd = runtimeCwdForSandbox(this.options.sandbox, this.options.workspace, address);
99
253
  this.chatSessionManager.resetSession({ conversationDir, sessionKey, cwd: runtimeCwd });
100
- this.conversationStates.delete(sessionKey);
254
+ this.sessions.discard(address, sessionKey);
101
255
  log.logInfo(`[${conversationId}] Session reset: ${sessionKey}`);
102
256
  await bot.postMessage(conversationId, "Conversation reset. Send a new message to start fresh.");
103
257
  }
104
258
  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);
259
+ const sessionKey = deriveSessionKey(event);
260
+ await this.sessions.enqueue(event.address, sessionKey, () => this.runSession({ event, bot, context }));
261
+ }
262
+ /**
263
+ * Dispatch an extension-owned interactive block action: materialize the
264
+ * conversation's harness instance (activating its extensions) and run the
265
+ * matching onAction handler — deterministic, no agent run. Serialized on
266
+ * the session queue so rapid interactions (votes) never interleave.
267
+ */
268
+ async handleExtensionAction(params) {
269
+ if (this.isShuttingDown)
270
+ return false;
271
+ const { address, sessionKey, conversationKind, slug, action } = params;
272
+ const conversationId = address.conversationId;
273
+ let consumed = false;
274
+ await this.sessions.enqueue(address, sessionKey, async () => {
275
+ try {
276
+ const state = await this.getOrCreateState({
277
+ address,
278
+ conversationId,
279
+ sessionKey,
280
+ currentMessageId: action.messageTs ?? sessionKey,
281
+ conversationKind,
282
+ });
283
+ consumed = await state.runner.tryExtensionAction(slug, action);
284
+ if (consumed)
285
+ state.lastAccessedAt = Date.now();
286
+ }
287
+ catch (err) {
288
+ log.logWarning(`[${conversationId}] Extension action dispatch failed (${slug}:${action.actionId})`, err instanceof Error ? err.message : String(err));
289
+ }
290
+ });
291
+ return consumed;
292
+ }
293
+ /**
294
+ * Dispatch a fired extension callback schedule: materialize the
295
+ * conversation's harness instance (activating its extensions) and run the
296
+ * matching `onCallback` handler — deterministic, no agent run, no model
297
+ * call. Serialized on the session queue so fires never interleave with
298
+ * block actions or runs in the same conversation.
299
+ */
300
+ async handleExtensionScheduleCallback(fire) {
301
+ if (this.isShuttingDown)
302
+ return false;
303
+ const address = createOfficeAddress(fire.platform, fire.conversationId);
304
+ const conversationId = fire.conversationId;
305
+ // Schedules belong to the conversation, not a thread: use the top-level
306
+ // session scope, like the schedules that fire agent runs.
307
+ const sessionKey = conversationId;
308
+ let consumed = false;
309
+ await this.sessions.enqueue(address, sessionKey, async () => {
310
+ try {
311
+ const state = await this.getOrCreateState({
312
+ address,
313
+ conversationId,
314
+ sessionKey,
315
+ currentMessageId: `extsched:${fire.slug}.${fire.scheduleName}`,
316
+ conversationKind: inferConversationKind(fire.platform, conversationId),
317
+ });
318
+ consumed = await state.runner.tryExtensionScheduleCallback(fire.slug, fire.callback, {
319
+ scheduleName: fire.scheduleName,
320
+ ...(fire.args !== undefined ? { args: fire.args } : {}),
321
+ });
322
+ if (consumed)
323
+ state.lastAccessedAt = Date.now();
324
+ }
325
+ catch (err) {
326
+ log.logWarning(`[${conversationId}] Extension schedule dispatch failed (${fire.slug}.${fire.scheduleName} → ${fire.callback})`, err instanceof Error ? err.message : String(err));
327
+ }
328
+ });
329
+ return consumed;
330
+ }
331
+ async runSession({ event, bot, context }) {
332
+ const conversationId = event.conversationId;
333
+ if (this.isShuttingDown) {
334
+ log.logInfo(`[${conversationId}] Rejected event during shutdown: ${event.text.substring(0, 50)}`);
335
+ return;
336
+ }
337
+ const sessionKey = deriveSessionKey(event);
338
+ const privateConversation = isPrivateConversation(event);
339
+ const handledCommand = await dispatchCommand(this.commandHandlers, {
340
+ bot,
341
+ responder: context.responder,
342
+ platform: context.platform.name,
343
+ address: event.address,
344
+ platformUserId: event.user,
345
+ platformUserName: context.message.userName,
346
+ conversationId,
347
+ vaultConversationId: event.vaultConversationId,
348
+ sessionKey,
349
+ commandText: event.text,
350
+ privateConversation,
351
+ services: this.commandServices,
352
+ });
353
+ if (handledCommand)
354
+ return;
355
+ const address = event.address;
356
+ const activeSettlement = this.sessions.get(address, sessionKey)?.runSettlement;
357
+ if (activeSettlement)
358
+ await activeSettlement;
359
+ if (sessionKey === conversationId) {
360
+ await this.rotateSharedSessionAfterDream(address, sessionKey, context.message, context.platform);
361
+ }
362
+ const releaseConversationWork = await this.sessions.acquireConversationWork(address);
109
363
  try {
110
- await next;
364
+ const conversationDir = this.options.workspace.office(address).dir;
365
+ const waitedForParent = await waitForThreadSessionBootstrap({
366
+ parentSessionKey: conversationId,
367
+ sessionKey,
368
+ hasThreadSession: () => hasMaterializedChatSession({ conversationDir, sessionKey }),
369
+ isParentRunning: () => this.sessions.get(address, conversationId)?.running === true,
370
+ });
371
+ if (waitedForParent) {
372
+ log.logInfo(`[${conversationId}] Delayed thread bootstrap until parent session sealed: ${sessionKey}`);
373
+ }
374
+ let state;
375
+ try {
376
+ state = await this.getOrCreateState({
377
+ address,
378
+ conversationId,
379
+ sessionKey,
380
+ currentMessageId: event.ts,
381
+ conversationKind: event.conversationKind,
382
+ });
383
+ state.runner.syncChatHistory(event.ts);
384
+ // Extension-contributed commands: deterministic dispatch, no agent run.
385
+ // Built-in commands already had their chance above, so extensions can
386
+ // never shadow them; unmatched slash text falls through to the agent.
387
+ if (event.text.trim().startsWith("/")) {
388
+ const handled = await state.runner.tryExtensionCommand(context.message, context.responder);
389
+ if (handled) {
390
+ state.lastAccessedAt = Date.now();
391
+ return;
392
+ }
393
+ }
394
+ }
395
+ catch (err) {
396
+ reportUserFacingError(err, {
397
+ domain: "mikan",
398
+ surface: "session_setup",
399
+ operation: "get_or_create_state",
400
+ severity: "error",
401
+ platform: context.platform.name,
402
+ context: {
403
+ conversationId,
404
+ sessionKey,
405
+ messageId: context.message.id,
406
+ threadTs: context.message.threadTs,
407
+ attachmentCount: context.message.attachments?.length ?? 0,
408
+ },
409
+ });
410
+ throw err;
411
+ }
412
+ state.running = true;
413
+ state.stopRequested = false;
414
+ state.startedAt = Date.now();
415
+ state.lastActivityAt = Date.now();
416
+ log.logInfo(`[${conversationId}] Starting run: ${event.text.substring(0, 50)}`);
417
+ const runPromise = (async () => {
418
+ try {
419
+ const result = await this.runWithInstrumentation(context, { conversationId, sessionKey, startedAt: state.startedAt }, async () => {
420
+ await context.responder.setTyping(true);
421
+ await context.responder.setWorking(true);
422
+ try {
423
+ return await state.runner.run(context.message, context.responder, context.platform);
424
+ }
425
+ finally {
426
+ await context.responder.setWorking(false);
427
+ }
428
+ });
429
+ if (result?.stopReason === "aborted" && state.stopRequested) {
430
+ if (state.stopMessageTs) {
431
+ await bot.updateMessage(conversationId, state.stopMessageTs, formatStopped(bot));
432
+ state.stopMessageTs = undefined;
433
+ }
434
+ else {
435
+ await bot.postMessage(conversationId, formatStopped(bot));
436
+ }
437
+ }
438
+ }
439
+ finally {
440
+ state.running = false;
441
+ state.lastAccessedAt = Date.now();
442
+ Sentry.metrics.gauge("agent.sessions.active", this.inFlightRuns.size - 1);
443
+ }
444
+ })();
445
+ this.inFlightRuns.add(runPromise);
446
+ state.runSettlement = runPromise;
447
+ Sentry.metrics.gauge("agent.sessions.active", this.inFlightRuns.size);
448
+ try {
449
+ await runPromise;
450
+ }
451
+ finally {
452
+ this.inFlightRuns.delete(runPromise);
453
+ if (state.runSettlement === runPromise)
454
+ state.runSettlement = undefined;
455
+ this.sessions.onSettlement(address);
456
+ this.sessions.evictIdle();
457
+ }
111
458
  }
112
459
  finally {
113
- if (this.sessionQueues.get(sessionKey) === next) {
114
- this.sessionQueues.delete(sessionKey);
115
- }
460
+ releaseConversationWork();
116
461
  }
117
462
  }
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;
124
- }
125
- switchConversationModel(conversationId, _provider, _model) {
126
- return this.clearConversationStates(conversationId, `[${conversationId}] Model switched; cleared cached session runners`);
463
+ async runWithInstrumentation(context, meta, body) {
464
+ const { conversationId, sessionKey, startedAt } = meta;
465
+ const { message, platform } = context;
466
+ const attribution = createRunAttributionAttributes({
467
+ conversationId,
468
+ sessionKey,
469
+ messageId: message.id,
470
+ platform: platform.name,
471
+ userId: message.userId,
472
+ userName: message.userName,
473
+ threadTs: message.threadTs,
474
+ });
475
+ Sentry.metrics.count("agent.run.started", 1, {
476
+ attributes: attribution,
477
+ });
478
+ return Sentry.startSpan({ name: "agent.run", op: "agent", attributes: attribution }, async (span) => Sentry.withScope(async (scope) => {
479
+ registerTraceAttribution(span, attribution);
480
+ applyRunScope(scope, {
481
+ conversationId,
482
+ sessionKey,
483
+ messageId: message.id,
484
+ platform: platform.name,
485
+ userId: message.userId,
486
+ userName: message.userName,
487
+ threadTs: message.threadTs,
488
+ });
489
+ addLifecycleBreadcrumb("agent.run.started", {
490
+ channel_id: conversationId,
491
+ platform: platform.name,
492
+ has_attachments: (message.attachments?.length ?? 0) > 0,
493
+ });
494
+ try {
495
+ const result = await body();
496
+ const durationMs = Date.now() - startedAt;
497
+ const completionAttrs = {
498
+ ...attribution,
499
+ stop_reason: result.stopReason,
500
+ };
501
+ Sentry.metrics.distribution("agent.run.duration", durationMs, {
502
+ unit: "millisecond",
503
+ attributes: completionAttrs,
504
+ });
505
+ Sentry.metrics.count("agent.run.completed", 1, { attributes: completionAttrs });
506
+ addLifecycleBreadcrumb("agent.run.completed", {
507
+ channel_id: conversationId,
508
+ platform: platform.name,
509
+ stop_reason: result.stopReason,
510
+ duration_ms: durationMs,
511
+ });
512
+ return result;
513
+ }
514
+ catch (err) {
515
+ scope.setContext("agent_run_error", {
516
+ conversationId,
517
+ sessionKey,
518
+ platform: platform.name,
519
+ messageId: message.id,
520
+ threadTs: message.threadTs,
521
+ });
522
+ reportUserFacingError(err, {
523
+ domain: "mikan",
524
+ surface: "agent_run",
525
+ operation: "run",
526
+ severity: "error",
527
+ platform: platform.name,
528
+ context: {
529
+ conversationId,
530
+ sessionKey,
531
+ messageId: message.id,
532
+ threadTs: message.threadTs,
533
+ attachmentCount: message.attachments?.length ?? 0,
534
+ },
535
+ });
536
+ Sentry.metrics.count("agent.run.errors", 1, {
537
+ attributes: attribution,
538
+ });
539
+ log.logWarning(`[${conversationId}] Run error`, err instanceof Error ? err.message : String(err));
540
+ return undefined;
541
+ }
542
+ }));
127
543
  }
128
- refreshConversationEnvironment(conversationId) {
129
- return this.clearConversationStates(conversationId, `[${conversationId}] Environment refreshed; cleared cached session runners`);
544
+ switchConversationModel(address, _provider, _model) {
545
+ this.bumpConversationRunnerGeneration(address);
546
+ return this.clearOffice(address, "Model switched");
130
547
  }
131
- isConversationSession(sessionKey, conversationId) {
132
- return sessionKey === conversationId || sessionKey.startsWith(`${conversationId}:`);
548
+ refreshConversationEnvironment(address) {
549
+ this.bumpConversationRunnerGeneration(address);
550
+ return this.clearOffice(address, "Environment refreshed");
133
551
  }
134
- clearConversationStates(conversationId, message) {
135
- for (const [sessionKey, state] of this.conversationStates) {
136
- if (this.isConversationSession(sessionKey, conversationId) && state.running) {
137
- return false;
552
+ refreshAllConversations() {
553
+ this.globalRunnerGeneration++;
554
+ const busy = [];
555
+ for (const address of this.sessions.offices()) {
556
+ if (!this.clearOffice(address, "Global settings changed")) {
557
+ this.sessions.deferConversationClear(address);
558
+ busy.push(address);
138
559
  }
139
560
  }
140
- for (const sessionKey of Array.from(this.conversationStates.keys())) {
141
- if (this.isConversationSession(sessionKey, conversationId)) {
142
- this.conversationStates.delete(sessionKey);
143
- }
561
+ return { busy };
562
+ }
563
+ clearOffice(address, reason) {
564
+ const cleared = this.sessions.clearConversation(address);
565
+ if (cleared) {
566
+ log.logInfo(`[${address.conversationId}] ${reason}; cleared cached session runners`);
567
+ }
568
+ return cleared;
569
+ }
570
+ bumpConversationRunnerGeneration(address) {
571
+ const key = officeKey(address);
572
+ this.conversationRunnerGenerations.set(key, (this.conversationRunnerGenerations.get(key) ?? 0) + 1);
573
+ }
574
+ runnerGeneration(address) {
575
+ return `${this.globalRunnerGeneration}:${this.conversationRunnerGenerations.get(officeKey(address)) ?? 0}`;
576
+ }
577
+ async createCurrentRunner(options, conversationDir, sessionScope) {
578
+ while (true) {
579
+ const generation = this.runnerGeneration(options.address);
580
+ const runner = await createRunner({
581
+ sandboxConfig: this.options.sandbox,
582
+ sessionKey: options.sessionKey,
583
+ office: this.options.workspace.office(options.address),
584
+ sessionScope,
585
+ vaultManager: this.options.vaultManager,
586
+ provisioner: this.options.provisioner,
587
+ resourceController: this.options.resourceController,
588
+ sessionView: this.options.sessionViewTokenStore
589
+ ? {
590
+ tokenStore: this.options.sessionViewTokenStore,
591
+ portalBaseUrl: this.options.portalBaseUrl,
592
+ }
593
+ : undefined,
594
+ platformNotifier: this.options.platformNotifier,
595
+ platformReactor: this.options.platformReactor,
596
+ platformUploader: this.options.platformUploader,
597
+ platformBlockKit: this.options.platformBlockKit,
598
+ platformDmOpener: this.options.platformDmOpener,
599
+ platformHistoryFetcher: this.options.platformHistoryFetcher,
600
+ platformUserLister: this.options.platformUserLister,
601
+ extensionScheduleEngine: this.options.extensionScheduleEngine,
602
+ platformToolPackFactories: this.options.platformToolPackFactories,
603
+ models: this.resolvedModels,
604
+ });
605
+ if (generation === this.runnerGeneration(options.address))
606
+ return runner;
607
+ await runner.dispose();
144
608
  }
145
- log.logInfo(message);
146
- return true;
147
609
  }
148
610
  async getOrCreateState(options) {
149
- const { conversationId, sessionKey, currentMessageId } = options;
150
- const existing = this.conversationStates.get(sessionKey);
611
+ const { address, sessionKey, currentMessageId } = options;
612
+ const existing = this.sessions.get(address, sessionKey);
151
613
  if (existing?.running)
152
614
  return existing;
153
- const conversationDir = join(this.options.workingDir, conversationId);
154
- const runtimeCwd = runtimeCwdForSandbox(this.options.sandbox, this.options.workingDir, conversationId);
615
+ const conversationDir = this.options.workspace.office(address).dir;
616
+ const runtimeCwd = runtimeCwdForSandbox(this.options.sandbox, this.options.workspace, address);
155
617
  const sessionScope = await this.chatSessionManager.resolveSessionScope({
156
618
  conversationDir,
157
619
  sessionKey,
158
620
  cwd: runtimeCwd,
159
621
  currentMessageId,
160
- rotateTopLevelSession: options.conversationKind === "shared" && sessionKey === conversationId,
622
+ rotateTopLevelSession: false,
161
623
  });
162
624
  if (existing && existing.sessionFile === sessionScope.contextFile) {
163
625
  existing.lastAccessedAt = Date.now();
164
626
  return existing;
165
627
  }
628
+ // A stale state (rotated session file) is being replaced: release the old
629
+ // runner's extension resources before the new one takes the slot.
630
+ if (existing)
631
+ this.sessions.discard(address, sessionKey);
166
632
  const state = {
633
+ address,
634
+ sessionKey,
167
635
  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),
636
+ runner: await this.createCurrentRunner(options, conversationDir, sessionScope),
172
637
  stopRequested: false,
173
638
  lastAccessedAt: Date.now(),
174
639
  sessionFile: sessionScope.contextFile,
175
640
  startedAt: 0,
176
641
  };
177
- this.conversationStates.set(sessionKey, state);
642
+ this.sessions.set(state);
178
643
  return state;
179
644
  }
180
645
  async shutdown(timeoutMs = 30_000) {
@@ -197,26 +662,5 @@ class ConversationRuntimeImpl {
197
662
  });
198
663
  }
199
664
  }
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
665
  }
222
666
  //# sourceMappingURL=conversation-runtime.js.map