@geminixiang/mikan 1.0.0-beta.44 → 1.0.0-beta.46

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 (422) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/README.md +12 -19
  3. package/dist/adapter.d.ts +1 -1
  4. package/dist/adapter.d.ts.map +1 -1
  5. package/dist/adapter.js.map +1 -1
  6. package/dist/adapters/discord/bot.d.ts +3 -1
  7. package/dist/adapters/discord/bot.d.ts.map +1 -1
  8. package/dist/adapters/discord/bot.js +143 -141
  9. package/dist/adapters/discord/bot.js.map +1 -1
  10. package/dist/adapters/discord/context.d.ts +2 -8
  11. package/dist/adapters/discord/context.d.ts.map +1 -1
  12. package/dist/adapters/discord/context.js +1 -1
  13. package/dist/adapters/discord/context.js.map +1 -1
  14. package/dist/adapters/discord/format.d.ts.map +1 -1
  15. package/dist/adapters/discord/format.js +2 -4
  16. package/dist/adapters/discord/format.js.map +1 -1
  17. package/dist/adapters/github/bot.d.ts.map +1 -1
  18. package/dist/adapters/github/bot.js +1 -4
  19. package/dist/adapters/github/bot.js.map +1 -1
  20. package/dist/adapters/github/context.d.ts +2 -9
  21. package/dist/adapters/github/context.d.ts.map +1 -1
  22. package/dist/adapters/github/context.js.map +1 -1
  23. package/dist/adapters/github/github-ops.d.ts +4 -17
  24. package/dist/adapters/github/github-ops.d.ts.map +1 -1
  25. package/dist/adapters/github/github-ops.js +17 -86
  26. package/dist/adapters/github/github-ops.js.map +1 -1
  27. package/dist/adapters/github/tool-pack.d.ts.map +1 -1
  28. package/dist/adapters/github/tool-pack.js +0 -1
  29. package/dist/adapters/github/tool-pack.js.map +1 -1
  30. package/dist/adapters/github/tools/checks.d.ts +0 -1
  31. package/dist/adapters/github/tools/checks.d.ts.map +1 -1
  32. package/dist/adapters/github/tools/checks.js +3 -22
  33. package/dist/adapters/github/tools/checks.js.map +1 -1
  34. package/dist/adapters/github/types.d.ts +0 -33
  35. package/dist/adapters/github/types.d.ts.map +1 -1
  36. package/dist/adapters/github/types.js.map +1 -1
  37. package/dist/adapters/progressive-renderer.d.ts.map +1 -1
  38. package/dist/adapters/progressive-renderer.js +311 -318
  39. package/dist/adapters/progressive-renderer.js.map +1 -1
  40. package/dist/adapters/slack/blocks.d.ts.map +1 -1
  41. package/dist/adapters/slack/blocks.js +1 -4
  42. package/dist/adapters/slack/blocks.js.map +1 -1
  43. package/dist/adapters/slack/bot.d.ts +12 -0
  44. package/dist/adapters/slack/bot.d.ts.map +1 -1
  45. package/dist/adapters/slack/bot.js +158 -178
  46. package/dist/adapters/slack/bot.js.map +1 -1
  47. package/dist/adapters/slack/context.d.ts +2 -8
  48. package/dist/adapters/slack/context.d.ts.map +1 -1
  49. package/dist/adapters/slack/context.js +1 -1
  50. package/dist/adapters/slack/context.js.map +1 -1
  51. package/dist/adapters/slack/response-lifecycle.d.ts.map +1 -1
  52. package/dist/adapters/slack/response-lifecycle.js +135 -123
  53. package/dist/adapters/slack/response-lifecycle.js.map +1 -1
  54. package/dist/adapters/slack/stream-limits.d.ts +1 -1
  55. package/dist/adapters/slack/stream-limits.js +1 -1
  56. package/dist/adapters/slack/stream-limits.js.map +1 -1
  57. package/dist/adapters/slack/types.d.ts +4 -0
  58. package/dist/adapters/slack/types.d.ts.map +1 -1
  59. package/dist/adapters/slack/types.js.map +1 -1
  60. package/dist/adapters/telegram/context.d.ts +2 -8
  61. package/dist/adapters/telegram/context.d.ts.map +1 -1
  62. package/dist/adapters/telegram/context.js +1 -2
  63. package/dist/adapters/telegram/context.js.map +1 -1
  64. package/dist/adapters/types.d.ts +11 -5
  65. package/dist/adapters/types.d.ts.map +1 -1
  66. package/dist/adapters/types.js.map +1 -1
  67. package/dist/agent/catalog.d.ts +6 -18
  68. package/dist/agent/catalog.d.ts.map +1 -1
  69. package/dist/agent/catalog.js +19 -155
  70. package/dist/agent/catalog.js.map +1 -1
  71. package/dist/agent/execution.d.ts +0 -7
  72. package/dist/agent/execution.d.ts.map +1 -1
  73. package/dist/agent/execution.js +23 -21
  74. package/dist/agent/execution.js.map +1 -1
  75. package/dist/agent/presenter.d.ts +7 -9
  76. package/dist/agent/presenter.d.ts.map +1 -1
  77. package/dist/agent/presenter.js +355 -357
  78. package/dist/agent/presenter.js.map +1 -1
  79. package/dist/agent/prompt.d.ts +5 -12
  80. package/dist/agent/prompt.d.ts.map +1 -1
  81. package/dist/agent/prompt.js +56 -81
  82. package/dist/agent/prompt.js.map +1 -1
  83. package/dist/agent/runner.d.ts +0 -7
  84. package/dist/agent/runner.d.ts.map +1 -1
  85. package/dist/agent/runner.js +255 -308
  86. package/dist/agent/runner.js.map +1 -1
  87. package/dist/agent/types.d.ts +21 -17
  88. package/dist/agent/types.d.ts.map +1 -1
  89. package/dist/agent/types.js +0 -1
  90. package/dist/agent/types.js.map +1 -1
  91. package/dist/cli/boot.d.ts.map +1 -1
  92. package/dist/cli/boot.js +7 -10
  93. package/dist/cli/boot.js.map +1 -1
  94. package/dist/cli/onboard.d.ts +10 -0
  95. package/dist/cli/onboard.d.ts.map +1 -0
  96. package/dist/cli/onboard.js +237 -0
  97. package/dist/cli/onboard.js.map +1 -0
  98. package/dist/cli/types.d.ts +8 -3
  99. package/dist/cli/types.d.ts.map +1 -1
  100. package/dist/cli/types.js.map +1 -1
  101. package/dist/commands/auto-reply.d.ts.map +1 -1
  102. package/dist/commands/auto-reply.js +5 -12
  103. package/dist/commands/auto-reply.js.map +1 -1
  104. package/dist/commands/manifest.d.ts.map +1 -1
  105. package/dist/commands/manifest.js +9 -16
  106. package/dist/commands/manifest.js.map +1 -1
  107. package/dist/commands/new.d.ts.map +1 -1
  108. package/dist/commands/new.js +15 -10
  109. package/dist/commands/new.js.map +1 -1
  110. package/dist/commands/registry.d.ts.map +1 -1
  111. package/dist/commands/registry.js +0 -2
  112. package/dist/commands/registry.js.map +1 -1
  113. package/dist/commands/sandbox.d.ts.map +1 -1
  114. package/dist/commands/sandbox.js +89 -70
  115. package/dist/commands/sandbox.js.map +1 -1
  116. package/dist/commands/session-view.js +9 -2
  117. package/dist/commands/session-view.js.map +1 -1
  118. package/dist/commands/types.d.ts +4 -3
  119. package/dist/commands/types.d.ts.map +1 -1
  120. package/dist/commands/types.js.map +1 -1
  121. package/dist/config.d.ts +13 -17
  122. package/dist/config.d.ts.map +1 -1
  123. package/dist/config.js +39 -37
  124. package/dist/config.js.map +1 -1
  125. package/dist/dream/index.d.ts +20 -0
  126. package/dist/dream/index.d.ts.map +1 -0
  127. package/dist/dream/index.js +253 -0
  128. package/dist/dream/index.js.map +1 -0
  129. package/dist/dream/types.d.ts +30 -0
  130. package/dist/dream/types.d.ts.map +1 -0
  131. package/dist/dream/types.js.map +1 -0
  132. package/dist/env-manifest.d.ts.map +1 -1
  133. package/dist/env-manifest.js +2 -34
  134. package/dist/env-manifest.js.map +1 -1
  135. package/dist/execution-resolver.d.ts +9 -2
  136. package/dist/execution-resolver.d.ts.map +1 -1
  137. package/dist/execution-resolver.js +26 -27
  138. package/dist/execution-resolver.js.map +1 -1
  139. package/dist/harness/event-format.d.ts +1 -2
  140. package/dist/harness/event-format.d.ts.map +1 -1
  141. package/dist/harness/event-format.js +9 -15
  142. package/dist/harness/event-format.js.map +1 -1
  143. package/dist/harness/index.d.ts +1 -7
  144. package/dist/harness/index.d.ts.map +1 -1
  145. package/dist/harness/index.js +0 -4
  146. package/dist/harness/index.js.map +1 -1
  147. package/dist/harness/models.d.ts.map +1 -1
  148. package/dist/harness/models.js +15 -35
  149. package/dist/harness/models.js.map +1 -1
  150. package/dist/harness/runner.d.ts +7 -16
  151. package/dist/harness/runner.d.ts.map +1 -1
  152. package/dist/harness/runner.js +13 -131
  153. package/dist/harness/runner.js.map +1 -1
  154. package/dist/harness/session-store.d.ts +1 -1
  155. package/dist/harness/session-store.d.ts.map +1 -1
  156. package/dist/harness/session-store.js +1 -1
  157. package/dist/harness/session-store.js.map +1 -1
  158. package/dist/harness/subagent-runner.d.ts +2 -2
  159. package/dist/harness/subagent-runner.d.ts.map +1 -1
  160. package/dist/harness/subagent-runner.js +157 -162
  161. package/dist/harness/subagent-runner.js.map +1 -1
  162. package/dist/harness/types.d.ts +1 -13
  163. package/dist/harness/types.d.ts.map +1 -1
  164. package/dist/harness/types.js.map +1 -1
  165. package/dist/index.d.ts +3 -9
  166. package/dist/index.d.ts.map +1 -1
  167. package/dist/index.js +1 -5
  168. package/dist/index.js.map +1 -1
  169. package/dist/main.js +31 -212
  170. package/dist/main.js.map +1 -1
  171. package/dist/mcp/catalog.d.ts +5 -0
  172. package/dist/mcp/catalog.d.ts.map +1 -0
  173. package/dist/mcp/catalog.js +135 -0
  174. package/dist/mcp/catalog.js.map +1 -0
  175. package/dist/mcp/loader.d.ts.map +1 -1
  176. package/dist/mcp/loader.js +3 -6
  177. package/dist/mcp/loader.js.map +1 -1
  178. package/dist/mcp/types.d.ts +22 -0
  179. package/dist/mcp/types.d.ts.map +1 -1
  180. package/dist/mcp/types.js.map +1 -1
  181. package/dist/office/index.d.ts +136 -8
  182. package/dist/office/index.d.ts.map +1 -1
  183. package/dist/office/index.js +1050 -9
  184. package/dist/office/index.js.map +1 -1
  185. package/dist/office/types.d.ts +19 -1
  186. package/dist/office/types.d.ts.map +1 -1
  187. package/dist/office/types.js.map +1 -1
  188. package/dist/packages/index.d.ts +168 -5
  189. package/dist/packages/index.d.ts.map +1 -1
  190. package/dist/packages/index.js +749 -5
  191. package/dist/packages/index.js.map +1 -1
  192. package/dist/packages/types.d.ts +1 -5
  193. package/dist/packages/types.d.ts.map +1 -1
  194. package/dist/packages/types.js.map +1 -1
  195. package/dist/provisioner.d.ts +2 -9
  196. package/dist/provisioner.d.ts.map +1 -1
  197. package/dist/provisioner.js +3 -12
  198. package/dist/provisioner.js.map +1 -1
  199. package/dist/runtime/conversation-runtime.d.ts.map +1 -1
  200. package/dist/runtime/conversation-runtime.js +117 -380
  201. package/dist/runtime/conversation-runtime.js.map +1 -1
  202. package/dist/runtime/session-lifecycle.d.ts +32 -18
  203. package/dist/runtime/session-lifecycle.d.ts.map +1 -1
  204. package/dist/runtime/session-lifecycle.js +159 -46
  205. package/dist/runtime/session-lifecycle.js.map +1 -1
  206. package/dist/runtime/types.d.ts +4 -26
  207. package/dist/runtime/types.d.ts.map +1 -1
  208. package/dist/runtime/types.js.map +1 -1
  209. package/dist/sandbox/cloudflare.d.ts.map +1 -1
  210. package/dist/sandbox/cloudflare.js +2 -3
  211. package/dist/sandbox/cloudflare.js.map +1 -1
  212. package/dist/sandbox/container.d.ts +0 -1
  213. package/dist/sandbox/container.d.ts.map +1 -1
  214. package/dist/sandbox/container.js +2 -3
  215. package/dist/sandbox/container.js.map +1 -1
  216. package/dist/sandbox/host.d.ts.map +1 -1
  217. package/dist/sandbox/host.js +4 -2
  218. package/dist/sandbox/host.js.map +1 -1
  219. package/dist/sandbox/identity.d.ts +10 -19
  220. package/dist/sandbox/identity.d.ts.map +1 -1
  221. package/dist/sandbox/identity.js +8 -8
  222. package/dist/sandbox/identity.js.map +1 -1
  223. package/dist/sandbox/index.d.ts +7 -10
  224. package/dist/sandbox/index.d.ts.map +1 -1
  225. package/dist/sandbox/index.js +45 -16
  226. package/dist/sandbox/index.js.map +1 -1
  227. package/dist/sandbox/types.d.ts +13 -45
  228. package/dist/sandbox/types.d.ts.map +1 -1
  229. package/dist/sandbox/types.js.map +1 -1
  230. package/dist/sandbox/utils.d.ts +5 -0
  231. package/dist/sandbox/utils.d.ts.map +1 -1
  232. package/dist/sandbox/utils.js +10 -0
  233. package/dist/sandbox/utils.js.map +1 -1
  234. package/dist/sessions/chat-history-sync.d.ts +1 -3
  235. package/dist/sessions/chat-history-sync.d.ts.map +1 -1
  236. package/dist/sessions/chat-history-sync.js +58 -11
  237. package/dist/sessions/chat-history-sync.js.map +1 -1
  238. package/dist/sessions/migrate-v3.d.ts +2 -5
  239. package/dist/sessions/migrate-v3.d.ts.map +1 -1
  240. package/dist/sessions/migrate-v3.js +34 -4
  241. package/dist/sessions/migrate-v3.js.map +1 -1
  242. package/dist/sessions/store.d.ts +5 -6
  243. package/dist/sessions/store.d.ts.map +1 -1
  244. package/dist/sessions/store.js +62 -2
  245. package/dist/sessions/store.js.map +1 -1
  246. package/dist/sessions/types.d.ts +9 -0
  247. package/dist/sessions/types.d.ts.map +1 -1
  248. package/dist/sessions/types.js.map +1 -1
  249. package/dist/tools/bash.d.ts.map +1 -1
  250. package/dist/tools/bash.js +2 -10
  251. package/dist/tools/bash.js.map +1 -1
  252. package/dist/tools/read.js +2 -2
  253. package/dist/tools/read.js.map +1 -1
  254. package/dist/tools/sandbox.d.ts.map +1 -1
  255. package/dist/tools/sandbox.js +2 -3
  256. package/dist/tools/sandbox.js.map +1 -1
  257. package/dist/tools/subagent.d.ts +1 -1
  258. package/dist/tools/subagent.js.map +1 -1
  259. package/dist/types.d.ts +38 -127
  260. package/dist/types.d.ts.map +1 -1
  261. package/dist/types.js.map +1 -1
  262. package/dist/vault/index.d.ts +9 -2
  263. package/dist/vault/index.d.ts.map +1 -1
  264. package/dist/vault/index.js +29 -5
  265. package/dist/vault/index.js.map +1 -1
  266. package/dist/web/admin/portal.d.ts +12 -1
  267. package/dist/web/admin/portal.d.ts.map +1 -1
  268. package/dist/web/admin/portal.js +437 -422
  269. package/dist/web/admin/portal.js.map +1 -1
  270. package/dist/web/admin/types.d.ts +2 -2
  271. package/dist/web/admin/types.d.ts.map +1 -1
  272. package/dist/web/admin/types.js.map +1 -1
  273. package/dist/web/login/portal.d.ts +7 -1
  274. package/dist/web/login/portal.d.ts.map +1 -1
  275. package/dist/web/login/portal.js +143 -78
  276. package/dist/web/login/portal.js.map +1 -1
  277. package/dist/web/portal-shell.d.ts +1 -0
  278. package/dist/web/portal-shell.d.ts.map +1 -1
  279. package/dist/web/portal-shell.js +12 -1
  280. package/dist/web/portal-shell.js.map +1 -1
  281. package/dist/web/server.d.ts +3 -3
  282. package/dist/web/server.d.ts.map +1 -1
  283. package/dist/web/server.js.map +1 -1
  284. package/dist/web/session-view/portal.d.ts +8 -1
  285. package/dist/web/session-view/portal.d.ts.map +1 -1
  286. package/dist/web/session-view/portal.js +609 -132
  287. package/dist/web/session-view/portal.js.map +1 -1
  288. package/dist/web/session-view/types.d.ts +8 -0
  289. package/dist/web/session-view/types.d.ts.map +1 -1
  290. package/dist/web/session-view/types.js.map +1 -1
  291. package/dist/workspace-projection/index.d.ts +14 -2
  292. package/dist/workspace-projection/index.d.ts.map +1 -1
  293. package/dist/workspace-projection/index.js +102 -14
  294. package/dist/workspace-projection/index.js.map +1 -1
  295. package/dist/workspace-projection/types.d.ts +14 -1
  296. package/dist/workspace-projection/types.d.ts.map +1 -1
  297. package/dist/workspace-projection/types.js.map +1 -1
  298. package/package.json +3 -5
  299. package/dist/adapters/github/cloudbuild.d.ts +0 -19
  300. package/dist/adapters/github/cloudbuild.d.ts.map +0 -1
  301. package/dist/adapters/github/cloudbuild.js +0 -71
  302. package/dist/adapters/github/cloudbuild.js.map +0 -1
  303. package/dist/adapters/github/gcp-auth.d.ts +0 -28
  304. package/dist/adapters/github/gcp-auth.d.ts.map +0 -1
  305. package/dist/adapters/github/gcp-auth.js +0 -196
  306. package/dist/adapters/github/gcp-auth.js.map +0 -1
  307. package/dist/agent/index.d.ts +0 -9
  308. package/dist/agent/index.d.ts.map +0 -1
  309. package/dist/agent/index.js +0 -8
  310. package/dist/agent/index.js.map +0 -1
  311. package/dist/cli/ext-dev.d.ts +0 -2
  312. package/dist/cli/ext-dev.d.ts.map +0 -1
  313. package/dist/cli/ext-dev.js +0 -188
  314. package/dist/cli/ext-dev.js.map +0 -1
  315. package/dist/cli/ext.d.ts +0 -2
  316. package/dist/cli/ext.d.ts.map +0 -1
  317. package/dist/cli/ext.js +0 -324
  318. package/dist/cli/ext.js.map +0 -1
  319. package/dist/commands/extensions.d.ts +0 -26
  320. package/dist/commands/extensions.d.ts.map +0 -1
  321. package/dist/commands/extensions.js +0 -103
  322. package/dist/commands/extensions.js.map +0 -1
  323. package/dist/extension-schedules.d.ts +0 -31
  324. package/dist/extension-schedules.d.ts.map +0 -1
  325. package/dist/extension-schedules.js +0 -229
  326. package/dist/extension-schedules.js.map +0 -1
  327. package/dist/harness/auth.d.ts +0 -17
  328. package/dist/harness/auth.d.ts.map +0 -1
  329. package/dist/harness/auth.js +0 -92
  330. package/dist/harness/auth.js.map +0 -1
  331. package/dist/harness/extensions/loader.d.ts +0 -40
  332. package/dist/harness/extensions/loader.d.ts.map +0 -1
  333. package/dist/harness/extensions/loader.js +0 -723
  334. package/dist/harness/extensions/loader.js.map +0 -1
  335. package/dist/harness/extensions/registry.d.ts +0 -155
  336. package/dist/harness/extensions/registry.d.ts.map +0 -1
  337. package/dist/harness/extensions/registry.js +0 -420
  338. package/dist/harness/extensions/registry.js.map +0 -1
  339. package/dist/harness/extensions/types.d.ts +0 -665
  340. package/dist/harness/extensions/types.d.ts.map +0 -1
  341. package/dist/harness/extensions/types.js.map +0 -1
  342. package/dist/office/address.d.ts +0 -31
  343. package/dist/office/address.d.ts.map +0 -1
  344. package/dist/office/address.js +0 -113
  345. package/dist/office/address.js.map +0 -1
  346. package/dist/office/layout.d.ts +0 -27
  347. package/dist/office/layout.d.ts.map +0 -1
  348. package/dist/office/layout.js +0 -97
  349. package/dist/office/layout.js.map +0 -1
  350. package/dist/office/migration.d.ts +0 -44
  351. package/dist/office/migration.d.ts.map +0 -1
  352. package/dist/office/migration.js +0 -255
  353. package/dist/office/migration.js.map +0 -1
  354. package/dist/office/registry.d.ts +0 -75
  355. package/dist/office/registry.d.ts.map +0 -1
  356. package/dist/office/registry.js +0 -646
  357. package/dist/office/registry.js.map +0 -1
  358. package/dist/packages/admin.d.ts +0 -17
  359. package/dist/packages/admin.d.ts.map +0 -1
  360. package/dist/packages/admin.js +0 -98
  361. package/dist/packages/admin.js.map +0 -1
  362. package/dist/packages/inspect.d.ts +0 -11
  363. package/dist/packages/inspect.d.ts.map +0 -1
  364. package/dist/packages/inspect.js +0 -98
  365. package/dist/packages/inspect.js.map +0 -1
  366. package/dist/packages/materialize.d.ts +0 -40
  367. package/dist/packages/materialize.d.ts.map +0 -1
  368. package/dist/packages/materialize.js +0 -297
  369. package/dist/packages/materialize.js.map +0 -1
  370. package/dist/packages/resolve.d.ts +0 -25
  371. package/dist/packages/resolve.d.ts.map +0 -1
  372. package/dist/packages/resolve.js +0 -208
  373. package/dist/packages/resolve.js.map +0 -1
  374. package/dist/packages/source.d.ts +0 -39
  375. package/dist/packages/source.d.ts.map +0 -1
  376. package/dist/packages/source.js +0 -189
  377. package/dist/packages/source.js.map +0 -1
  378. package/dist/sandbox/errors.d.ts +0 -6
  379. package/dist/sandbox/errors.d.ts.map +0 -1
  380. package/dist/sandbox/errors.js +0 -11
  381. package/dist/sandbox/errors.js.map +0 -1
  382. package/dist/sandbox/firecracker.d.ts +0 -18
  383. package/dist/sandbox/firecracker.d.ts.map +0 -1
  384. package/dist/sandbox/firecracker.js +0 -223
  385. package/dist/sandbox/firecracker.js.map +0 -1
  386. package/dist/sandbox/gondolin.d.ts +0 -57
  387. package/dist/sandbox/gondolin.d.ts.map +0 -1
  388. package/dist/sandbox/gondolin.js +0 -764
  389. package/dist/sandbox/gondolin.js.map +0 -1
  390. package/dist/sandbox/image.d.ts +0 -3
  391. package/dist/sandbox/image.d.ts.map +0 -1
  392. package/dist/sandbox/image.js +0 -29
  393. package/dist/sandbox/image.js.map +0 -1
  394. package/dist/sessions/conversation-log.d.ts +0 -9
  395. package/dist/sessions/conversation-log.d.ts.map +0 -1
  396. package/dist/sessions/conversation-log.js +0 -50
  397. package/dist/sessions/conversation-log.js.map +0 -1
  398. package/dist/sessions/rotation.d.ts +0 -2
  399. package/dist/sessions/rotation.d.ts.map +0 -1
  400. package/dist/sessions/rotation.js +0 -41
  401. package/dist/sessions/rotation.js.map +0 -1
  402. package/dist/vault/disabled.d.ts +0 -9
  403. package/dist/vault/disabled.d.ts.map +0 -1
  404. package/dist/vault/disabled.js +0 -25
  405. package/dist/vault/disabled.js.map +0 -1
  406. package/dist/web/admin/store.d.ts +0 -13
  407. package/dist/web/admin/store.d.ts.map +0 -1
  408. package/dist/web/admin/store.js +0 -14
  409. package/dist/web/admin/store.js.map +0 -1
  410. package/dist/web/login/store.d.ts +0 -8
  411. package/dist/web/login/store.d.ts.map +0 -1
  412. package/dist/web/login/store.js +0 -15
  413. package/dist/web/login/store.js.map +0 -1
  414. package/dist/web/session-view/service.d.ts +0 -6
  415. package/dist/web/session-view/service.d.ts.map +0 -1
  416. package/dist/web/session-view/service.js +0 -517
  417. package/dist/web/session-view/service.js.map +0 -1
  418. package/dist/web/session-view/store.d.ts +0 -8
  419. package/dist/web/session-view/store.d.ts.map +0 -1
  420. package/dist/web/session-view/store.js +0 -15
  421. package/dist/web/session-view/store.js.map +0 -1
  422. /package/dist/{harness/extensions → dream}/types.js +0 -0
@@ -1,18 +1,18 @@
1
- import { createOfficeAddress, officeKey } from "../office/index.js";
2
- import { createRunner } from "../agent/index.js";
1
+ import { createRunner } from "../agent/runner.js";
2
+ import { commitOfficeDream, generateMemoryAnchor, prepareOfficeDream } from "../dream/index.js";
3
3
  import { MikanModels } from "../harness/index.js";
4
4
  import { defaultCommandHandlers, dispatchCommand } from "../commands/registry.js";
5
5
  import { isPrivateConversation } from "../commands/utils.js";
6
6
  import * as log from "../log.js";
7
7
  import { addLifecycleBreadcrumb, applyRunScope, createRunAttributionAttributes, registerTraceAttribution, reportUserFacingError, } from "../observability/sentry.js";
8
8
  import { ChatHistorySync, hasMaterializedChatSession, waitForThreadSessionBootstrap, } from "../sessions/chat-history-sync.js";
9
- import { shouldRotateTopLevelSession } from "../sessions/rotation.js";
9
+ import { shouldRotateTopLevelSession } from "../sessions/store.js";
10
10
  import { getThreadSessionFile, resolveChannelSessionFile, tryResolveThreadSession, } from "../sessions/store.js";
11
- import { assertSessionKeyBelongsToConversation, deriveSessionKey, inferConversationKind, } from "../sessions/session-key.js";
11
+ import { assertSessionKeyBelongsToConversation, deriveSessionKey, } from "../sessions/session-key.js";
12
12
  import { formatNothingRunning, formatStopped, formatStopping } from "../platform-messages.js";
13
13
  import * as Sentry from "@sentry/node";
14
14
  import { getUnresolvedSandboxPathContext } from "../sandbox/index.js";
15
- import { disabledVaultManager } from "../vault/disabled.js";
15
+ import { disabledVaultManager } from "../vault/index.js";
16
16
  import { SessionLifecycle } from "./session-lifecycle.js";
17
17
  /**
18
18
  * Placeholder token store for embedders that run without the web portal.
@@ -38,11 +38,7 @@ class ConversationRuntimeImpl {
38
38
  constructor(options) {
39
39
  this.options = options;
40
40
  this.sessions = new SessionLifecycle();
41
- this.inFlightRuns = new Set();
42
- this.sessionDreamSettlements = new Set();
43
41
  this.chatSessionManager = new ChatHistorySync();
44
- this.globalRunnerGeneration = 0;
45
- this.conversationRunnerGenerations = new Map();
46
42
  this.isShuttingDown = false;
47
43
  this.resolvedModels = options.models ?? MikanModels.create();
48
44
  this.commandServices = {
@@ -57,7 +53,7 @@ class ConversationRuntimeImpl {
57
53
  this.commandHandlers = options.commandHandlers ?? defaultCommandHandlers(this.resolvedModels);
58
54
  }
59
55
  isRunning(address, sessionKey) {
60
- return this.sessions.isRunning(address, sessionKey);
56
+ return this.sessions.get(address, sessionKey)?.running === true;
61
57
  }
62
58
  getRunningSessions() {
63
59
  const sessions = [];
@@ -75,6 +71,18 @@ class ConversationRuntimeImpl {
75
71
  }
76
72
  return sessions;
77
73
  }
74
+ async runDream(address, now = new Date()) {
75
+ return this.sessions.runConversationMaintenance(address, async () => {
76
+ const office = this.options.workspace.office(address);
77
+ const plan = await prepareOfficeDream(office, now);
78
+ if (!plan)
79
+ return false;
80
+ const memory = await generateMemoryAnchor(office, plan, this.resolvedModels);
81
+ commitOfficeDream(office, plan, memory);
82
+ log.logInfo(`[${address.conversationId}] Dream updated the Memory anchor`);
83
+ return true;
84
+ });
85
+ }
78
86
  async handleStop(address, sessionKey, bot) {
79
87
  assertSessionKeyBelongsToConversation(sessionKey, address.conversationId);
80
88
  const state = this.sessions.get(address, sessionKey);
@@ -96,9 +104,7 @@ class ConversationRuntimeImpl {
96
104
  state.runner.abort();
97
105
  }
98
106
  }
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.
107
+ async handleNewCommand({ sessionKey, conversationId, bot, message, }) {
102
108
  const address = message.address;
103
109
  if (conversationId !== address.conversationId) {
104
110
  throw new Error(`Conversation id ${JSON.stringify(conversationId)} does not match office ` +
@@ -106,116 +112,20 @@ class ConversationRuntimeImpl {
106
112
  }
107
113
  assertSessionKeyBelongsToConversation(sessionKey, address.conversationId);
108
114
  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
- // Scope resolution only materializes; the Session Dream below reads the
127
- // session, so bring it up to date with the log first.
128
- await state.runner.syncChatHistory(message.id);
129
- if (state.running ||
130
- (state.runSettlement && this.sessionDreamSettlements.has(state.runSettlement))) {
131
- const activeSettlement = state.runSettlement;
132
- if (activeSettlement && this.sessionDreamSettlements.has(activeSettlement)) {
133
- await activeSettlement;
134
- return;
115
+ if (activeState?.runSettlement) {
116
+ if (activeState.running) {
117
+ activeState.stopRequested = true;
118
+ activeState.runner.abort();
135
119
  }
136
- state.stopRequested = true;
137
- state.runner.abort();
138
- await activeSettlement;
139
- return this.handleNewCommand(sessionKey, conversationId, bot, message, responder, platform);
120
+ await activeState.runSettlement;
140
121
  }
141
- const dreamSettlement = this.startSessionDream(state, async () => {
142
- let working = false;
143
- try {
144
- await responder.setWorking(true);
145
- working = true;
146
- const result = await this.dreamSessionMemory(state, message, platform);
147
- if (!result.success) {
148
- const detail = result.errorMessage ? ` ${result.errorMessage}` : "";
149
- await responder.respondDiagnostic(`Could not preserve memory, so the current conversation was not reset.${detail}`, { style: "error" });
150
- return;
151
- }
152
- await responder.setWorking(false);
153
- working = false;
154
- await this.resetSession(state, bot);
155
- }
156
- finally {
157
- if (working)
158
- await responder.setWorking(false);
159
- }
122
+ await this.sessions.runConversationMaintenance(address, async () => {
123
+ await this.resetSession(address, sessionKey, bot);
160
124
  });
161
- void dreamSettlement
162
- .catch((err) => {
163
- reportUserFacingError(err, {
164
- domain: "mikan",
165
- surface: "session_dream",
166
- operation: "run_new_command_in_background",
167
- });
168
- })
169
- .finally(() => this.finishSessionDream(state, dreamSettlement));
170
- }
171
- startSessionDream(state, dream, markRunning = true) {
172
- if (markRunning) {
173
- state.running = true;
174
- state.stopRequested = false;
175
- state.startedAt = Date.now();
176
- state.lastActivityAt = Date.now();
177
- }
178
- const settlement = Promise.resolve().then(dream);
179
- state.runSettlement = settlement;
180
- this.sessionDreamSettlements.add(settlement);
181
- this.inFlightRuns.add(settlement);
182
- return settlement;
183
- }
184
- finishSessionDream(state, settlement) {
185
- this.sessionDreamSettlements.delete(settlement);
186
- this.inFlightRuns.delete(settlement);
187
- if (state.runSettlement !== settlement)
188
- return;
189
- state.runSettlement = undefined;
190
- state.running = false;
191
- state.startedAt = 0;
192
- state.lastAccessedAt = Date.now();
193
- this.sessions.onSettlement(state.address);
194
- this.sessions.evictIdle();
195
- }
196
- async dreamSessionMemory(state, message, platform) {
197
- try {
198
- const result = await state.runner.dreamSessionMemory(message, platform);
199
- // Only a clean stop means the dream finished its work. Everything else —
200
- // budget abort, length cutoff, error, blocked — leaves memory unwritten,
201
- // and treating it as success resets the session and loses it silently.
202
- // Listed as a whitelist so a new stop reason fails safe.
203
- if (result.stopReason !== "stop") {
204
- return {
205
- success: false,
206
- errorMessage: result.errorMessage ?? `Session Dream stopped early (${result.stopReason})`,
207
- };
208
- }
209
- return { success: true };
210
- }
211
- catch (err) {
212
- return { success: false, errorMessage: err instanceof Error ? err.message : String(err) };
213
- }
214
125
  }
215
126
  scheduleSharedSessionRotation({ event, bot, context }, sessionKey) {
216
127
  const { address, conversationId } = event;
217
- const { message, platform } = context;
218
- if (message.conversationKind !== "shared" || sessionKey !== conversationId)
128
+ if (context.message.conversationKind !== "shared" || sessionKey !== conversationId)
219
129
  return false;
220
130
  const conversationDir = this.options.workspace.office(address).dir;
221
131
  const currentSession = resolveChannelSessionFile(conversationDir);
@@ -228,51 +138,26 @@ class ConversationRuntimeImpl {
228
138
  await this.runSession({ event, bot, context }, true);
229
139
  return;
230
140
  }
231
- const state = await this.getOrCreateState({
232
- address,
233
- conversationId,
141
+ const runtimeCwd = runtimeCwdForSandbox(this.options.sandbox, this.options.workspace, address);
142
+ await this.chatSessionManager.resetSession({
143
+ conversationDir,
234
144
  sessionKey,
235
- conversationKind: message.conversationKind,
236
- currentMessageId: message.id,
145
+ cwd: runtimeCwd,
237
146
  });
238
- // The rotation Dream summarizes the session; sync the log into it
239
- // first (scope resolution only materializes).
240
- await state.runner.syncChatHistory(message.id);
241
- const dreamSettlement = this.startSessionDream(state, async () => {
242
- const result = await this.dreamSessionMemory(state, message, platform);
243
- if (!result.success) {
244
- const detail = result.errorMessage ? `: ${result.errorMessage}` : "";
245
- log.logWarning(`[${conversationId}] Automatic Session Dream failed${detail}`);
246
- return;
247
- }
248
- const runtimeCwd = runtimeCwdForSandbox(this.options.sandbox, this.options.workspace, address);
249
- await this.chatSessionManager.resetSession({
250
- conversationDir,
251
- sessionKey,
252
- cwd: runtimeCwd,
253
- });
254
- await this.sessions.discardAndWait(address, sessionKey);
255
- log.logInfo(`[${conversationId}] Session Dream completed; rotated session: ${sessionKey}`);
256
- }, false);
257
- try {
258
- await dreamSettlement;
259
- }
260
- finally {
261
- this.finishSessionDream(state, dreamSettlement);
262
- }
147
+ await this.sessions.discardAndWait(address, sessionKey);
148
+ log.logInfo(`[${conversationId}] Rotated session: ${sessionKey}`);
263
149
  await this.runSession({ event, bot, context }, true);
264
150
  })
265
151
  .catch((err) => {
266
152
  reportUserFacingError(err, {
267
153
  domain: "mikan",
268
- surface: "session_dream",
154
+ surface: "session_rotation",
269
155
  operation: "rotate_shared_session_in_background",
270
156
  });
271
157
  });
272
158
  return true;
273
159
  }
274
- async resetSession(state, bot) {
275
- const { address, sessionKey } = state;
160
+ async resetSession(address, sessionKey, bot) {
276
161
  const conversationId = address.conversationId;
277
162
  const conversationDir = this.options.workspace.office(address).dir;
278
163
  const runtimeCwd = runtimeCwdForSandbox(this.options.sandbox, this.options.workspace, address);
@@ -285,75 +170,6 @@ class ConversationRuntimeImpl {
285
170
  const sessionKey = deriveSessionKey(event);
286
171
  await this.sessions.enqueue(event.address, sessionKey, () => this.runSession({ event, bot, context }));
287
172
  }
288
- /**
289
- * Dispatch an extension-owned interactive block action: materialize the
290
- * conversation's harness instance (activating its extensions) and run the
291
- * matching onAction handler — deterministic, no agent run. Serialized on
292
- * the session queue so rapid interactions (votes) never interleave.
293
- */
294
- async handleExtensionAction(params) {
295
- if (this.isShuttingDown)
296
- return false;
297
- const { address, sessionKey, conversationKind, slug, action } = params;
298
- const conversationId = address.conversationId;
299
- let consumed = false;
300
- await this.sessions.enqueue(address, sessionKey, async () => {
301
- try {
302
- const state = await this.getOrCreateState({
303
- address,
304
- conversationId,
305
- sessionKey,
306
- currentMessageId: action.messageTs ?? sessionKey,
307
- conversationKind,
308
- });
309
- consumed = await state.runner.tryExtensionAction(slug, action);
310
- if (consumed)
311
- state.lastAccessedAt = Date.now();
312
- }
313
- catch (err) {
314
- log.logWarning(`[${conversationId}] Extension action dispatch failed (${slug}:${action.actionId})`, err instanceof Error ? err.message : String(err));
315
- }
316
- });
317
- return consumed;
318
- }
319
- /**
320
- * Dispatch a fired extension callback schedule: materialize the
321
- * conversation's harness instance (activating its extensions) and run the
322
- * matching `onCallback` handler — deterministic, no agent run, no model
323
- * call. Serialized on the session queue so fires never interleave with
324
- * block actions or runs in the same conversation.
325
- */
326
- async handleExtensionScheduleCallback(fire) {
327
- if (this.isShuttingDown)
328
- return false;
329
- const address = createOfficeAddress(fire.platform, fire.conversationId);
330
- const conversationId = fire.conversationId;
331
- // Schedules belong to the conversation, not a thread: use the top-level
332
- // session scope, like the schedules that fire agent runs.
333
- const sessionKey = conversationId;
334
- let consumed = false;
335
- await this.sessions.enqueue(address, sessionKey, async () => {
336
- try {
337
- const state = await this.getOrCreateState({
338
- address,
339
- conversationId,
340
- sessionKey,
341
- currentMessageId: `extsched:${fire.slug}.${fire.scheduleName}`,
342
- conversationKind: inferConversationKind(fire.platform, conversationId),
343
- });
344
- consumed = await state.runner.tryExtensionScheduleCallback(fire.slug, fire.callback, {
345
- scheduleName: fire.scheduleName,
346
- ...(fire.args !== undefined ? { args: fire.args } : {}),
347
- });
348
- if (consumed)
349
- state.lastAccessedAt = Date.now();
350
- }
351
- catch (err) {
352
- log.logWarning(`[${conversationId}] Extension schedule dispatch failed (${fire.slug}.${fire.scheduleName} → ${fire.callback})`, err instanceof Error ? err.message : String(err));
353
- }
354
- });
355
- return consumed;
356
- }
357
173
  async runSession({ event, bot, context }, skipRotation = false) {
358
174
  const conversationId = event.conversationId;
359
175
  if (this.isShuttingDown) {
@@ -361,24 +177,8 @@ class ConversationRuntimeImpl {
361
177
  return;
362
178
  }
363
179
  const sessionKey = deriveSessionKey(event);
364
- if (!skipRotation) {
365
- const privateConversation = isPrivateConversation(event);
366
- const handledCommand = await dispatchCommand(this.commandHandlers, {
367
- bot,
368
- responder: context.responder,
369
- platform: context.platform.name,
370
- address: event.address,
371
- platformUserId: event.user,
372
- platformUserName: context.message.userName,
373
- conversationId,
374
- vaultConversationId: event.vaultConversationId,
375
- sessionKey,
376
- commandText: event.text,
377
- privateConversation,
378
- services: this.commandServices,
379
- });
380
- if (handledCommand)
381
- return;
180
+ if (!skipRotation && (await this.dispatchSessionCommand({ event, bot, context }, sessionKey))) {
181
+ return;
382
182
  }
383
183
  const address = event.address;
384
184
  const activeSettlement = this.sessions.get(address, sessionKey)?.runSettlement;
@@ -394,42 +194,19 @@ class ConversationRuntimeImpl {
394
194
  : await this.sessions.acquireConversationWork(address);
395
195
  try {
396
196
  const conversationDir = this.options.workspace.office(address).dir;
397
- const waitedForParent = await waitForThreadSessionBootstrap({
398
- parentSessionKey: conversationId,
399
- sessionKey,
400
- hasThreadSession: () => hasMaterializedChatSession({ conversationDir, sessionKey }),
401
- isParentRunning: () => this.sessions.get(address, conversationId)?.running === true,
402
- });
403
- if (waitedForParent) {
404
- log.logInfo(`[${conversationId}] Delayed thread bootstrap until parent session sealed: ${sessionKey}`);
405
- }
406
- let state;
197
+ await this.waitForParentSession(address, sessionKey, conversationDir);
198
+ let lease;
407
199
  try {
408
- state = await this.getOrCreateState({
200
+ lease = await this.acquireState({
409
201
  address,
410
- conversationId,
411
202
  sessionKey,
412
203
  currentMessageId: event.ts,
413
- conversationKind: event.conversationKind,
414
204
  });
205
+ const { state } = lease;
415
206
  await state.runner.syncChatHistory(event.ts);
416
- // Extension-contributed commands: deterministic dispatch, no agent run.
417
- // Built-in commands already had their chance above, so extensions can
418
- // never shadow them; unmatched text falls through to the agent.
419
- //
420
- // Where the platform eats the slash before we ever see it, the leading
421
- // name alone is enough — otherwise those commands would be unreachable
422
- // rather than merely awkward.
423
- const bareName = context.platform.bareExtensionCommands === true;
424
- if (bareName || event.text.trim().startsWith("/")) {
425
- const handled = await state.runner.tryExtensionCommand(context.message, context.responder, { bareName });
426
- if (handled) {
427
- state.lastAccessedAt = Date.now();
428
- return;
429
- }
430
- }
431
207
  }
432
208
  catch (err) {
209
+ lease?.release();
433
210
  reportUserFacingError(err, {
434
211
  domain: "mikan",
435
212
  surface: "session_setup",
@@ -446,12 +223,9 @@ class ConversationRuntimeImpl {
446
223
  });
447
224
  throw err;
448
225
  }
449
- state.running = true;
450
- state.stopRequested = false;
451
- state.startedAt = Date.now();
452
- state.lastActivityAt = Date.now();
226
+ const { state } = lease;
453
227
  log.logInfo(`[${conversationId}] Starting run: ${event.text.substring(0, 50)}`);
454
- const runPromise = (async () => {
228
+ const runPromise = this.sessions.settle(state, async () => {
455
229
  try {
456
230
  const result = await this.runWithInstrumentation(context, { conversationId, sessionKey, startedAt: state.startedAt }, async () => {
457
231
  await context.responder.setTyping(true);
@@ -474,29 +248,45 @@ class ConversationRuntimeImpl {
474
248
  }
475
249
  }
476
250
  finally {
477
- state.running = false;
478
- state.lastAccessedAt = Date.now();
479
- Sentry.metrics.gauge("agent.sessions.active", this.inFlightRuns.size - 1);
251
+ Sentry.metrics.gauge("agent.sessions.active", this.sessions.settlementCount() - 1);
480
252
  }
481
- })();
482
- this.inFlightRuns.add(runPromise);
483
- state.runSettlement = runPromise;
484
- Sentry.metrics.gauge("agent.sessions.active", this.inFlightRuns.size);
485
- try {
486
- await runPromise;
487
- }
488
- finally {
489
- this.inFlightRuns.delete(runPromise);
490
- if (state.runSettlement === runPromise)
491
- state.runSettlement = undefined;
492
- this.sessions.onSettlement(address);
493
- this.sessions.evictIdle();
494
- }
253
+ });
254
+ lease.release();
255
+ Sentry.metrics.gauge("agent.sessions.active", this.sessions.settlementCount());
256
+ await runPromise;
495
257
  }
496
258
  finally {
497
259
  releaseConversationWork();
498
260
  }
499
261
  }
262
+ async waitForParentSession(address, sessionKey, conversationDir) {
263
+ const conversationId = address.conversationId;
264
+ const waited = await waitForThreadSessionBootstrap({
265
+ parentSessionKey: conversationId,
266
+ sessionKey,
267
+ hasThreadSession: () => hasMaterializedChatSession({ conversationDir, sessionKey }),
268
+ isParentRunning: () => this.sessions.get(address, conversationId)?.running === true,
269
+ });
270
+ if (waited) {
271
+ log.logInfo(`[${conversationId}] Delayed thread bootstrap until parent session sealed: ${sessionKey}`);
272
+ }
273
+ }
274
+ async dispatchSessionCommand({ event, bot, context }, sessionKey) {
275
+ return dispatchCommand(this.commandHandlers, {
276
+ bot,
277
+ responder: context.responder,
278
+ platform: context.platform.name,
279
+ address: event.address,
280
+ platformUserId: event.user,
281
+ platformUserName: context.message.userName,
282
+ conversationId: event.conversationId,
283
+ vaultConversationId: event.vaultConversationId,
284
+ sessionKey,
285
+ commandText: event.text,
286
+ privateConversation: isPrivateConversation(event),
287
+ services: this.commandServices,
288
+ });
289
+ }
500
290
  async runWithInstrumentation(context, meta, body) {
501
291
  const { conversationId, sessionKey, startedAt } = meta;
502
292
  const { message, platform } = context;
@@ -579,92 +369,57 @@ class ConversationRuntimeImpl {
579
369
  }));
580
370
  }
581
371
  switchConversationModel(address, _provider, _model) {
582
- this.bumpConversationRunnerGeneration(address);
583
- return this.clearOffice(address, "Model switched");
372
+ return this.invalidateOffice(address, "Model switched");
584
373
  }
585
374
  refreshConversationEnvironment(address) {
586
- this.bumpConversationRunnerGeneration(address);
587
- return this.clearOffice(address, "Environment refreshed");
375
+ return this.invalidateOffice(address, "Environment refreshed");
588
376
  }
589
377
  refreshAllConversations() {
590
- this.globalRunnerGeneration++;
591
- const busy = [];
592
- for (const address of this.sessions.offices()) {
593
- if (!this.clearOffice(address, "Global settings changed")) {
594
- this.sessions.deferConversationClear(address);
595
- busy.push(address);
596
- }
378
+ const offices = this.sessions.offices();
379
+ const result = this.sessions.invalidateAll();
380
+ const busyKeys = new Set(result.busy.map((address) => `${address.platform}:${address.conversationId}`));
381
+ for (const address of offices) {
382
+ if (busyKeys.has(`${address.platform}:${address.conversationId}`))
383
+ continue;
384
+ log.logInfo(`[${address.conversationId}] Global settings changed; cleared cached session runners`);
597
385
  }
598
- return { busy };
386
+ return result;
599
387
  }
600
- clearOffice(address, reason) {
601
- const cleared = this.sessions.clearConversation(address);
388
+ invalidateOffice(address, reason) {
389
+ const cleared = this.sessions.invalidateConversation(address);
602
390
  if (cleared) {
603
391
  log.logInfo(`[${address.conversationId}] ${reason}; cleared cached session runners`);
604
392
  }
605
393
  return cleared;
606
394
  }
607
- bumpConversationRunnerGeneration(address) {
608
- const key = officeKey(address);
609
- this.conversationRunnerGenerations.set(key, (this.conversationRunnerGenerations.get(key) ?? 0) + 1);
610
- }
611
- runnerGeneration(address) {
612
- return `${this.globalRunnerGeneration}:${this.conversationRunnerGenerations.get(officeKey(address)) ?? 0}`;
613
- }
614
- async createCurrentRunner(options, conversationDir, sessionScope) {
615
- while (true) {
616
- const generation = this.runnerGeneration(options.address);
617
- const runner = await createRunner({
618
- sandboxConfig: this.options.sandbox,
619
- sessionKey: options.sessionKey,
620
- office: this.options.workspace.office(options.address),
621
- sessionScope,
622
- vaultManager: this.options.vaultManager,
623
- provisioner: this.options.provisioner,
624
- resourceController: this.options.resourceController,
625
- sessionView: this.options.sessionViewTokenStore
626
- ? {
627
- tokenStore: this.options.sessionViewTokenStore,
628
- portalBaseUrl: this.options.portalBaseUrl,
629
- }
630
- : undefined,
631
- platformNotifier: this.options.platformNotifier,
632
- platformReactor: this.options.platformReactor,
633
- platformUploader: this.options.platformUploader,
634
- platformBlockKit: this.options.platformBlockKit,
635
- platformDmOpener: this.options.platformDmOpener,
636
- platformHistoryFetcher: this.options.platformHistoryFetcher,
637
- platformUserLister: this.options.platformUserLister,
638
- extensionScheduleEngine: this.options.extensionScheduleEngine,
639
- platformToolPackFactories: this.options.platformToolPackFactories,
640
- models: this.resolvedModels,
641
- });
642
- if (generation === this.runnerGeneration(options.address))
643
- return runner;
644
- await runner.dispose();
645
- }
646
- }
647
- async getOrCreateState(options) {
648
- return this.sessions.transition(options.address, options.sessionKey, () => this.getOrCreateStateExclusive(options));
395
+ async createCurrentRunner(options, sessionScope) {
396
+ return createRunner({
397
+ sandboxConfig: this.options.sandbox,
398
+ sessionKey: options.sessionKey,
399
+ office: this.options.workspace.office(options.address),
400
+ sessionScope,
401
+ vaultManager: this.options.vaultManager,
402
+ provisioner: this.options.provisioner,
403
+ resourceController: this.options.resourceController,
404
+ sessionView: this.options.sessionViewTokenStore
405
+ ? {
406
+ tokenStore: this.options.sessionViewTokenStore,
407
+ portalBaseUrl: this.options.portalBaseUrl,
408
+ }
409
+ : undefined,
410
+ platformToolPackFactories: this.options.platformToolPackFactories,
411
+ models: this.resolvedModels,
412
+ });
649
413
  }
650
- async getOrCreateStateExclusive(options) {
651
- const { address, sessionKey, currentMessageId } = options;
652
- await this.sessions.waitForClose(address, sessionKey);
653
- const existing = this.sessions.get(address, sessionKey);
654
- // A cached runner is the sole writable pi v4 session handle for its file:
655
- // reuse it before scope resolution can open the same path a second time.
414
+ acquireState(options) {
415
+ const { address, sessionKey } = options;
656
416
  const conversationDir = this.options.workspace.office(address).dir;
657
- const expectedFile = sessionKey === address.conversationId
417
+ return this.sessions.acquire(address, sessionKey, () => sessionKey === address.conversationId
658
418
  ? resolveChannelSessionFile(conversationDir)
659
- : tryResolveThreadSession(getThreadSessionFile(conversationDir, sessionKey));
660
- if (existing && expectedFile === existing.sessionFile) {
661
- existing.lastAccessedAt = Date.now();
662
- return existing;
663
- }
664
- if (existing?.running)
665
- return existing;
666
- if (existing)
667
- await this.sessions.discardAndWait(address, sessionKey);
419
+ : tryResolveThreadSession(getThreadSessionFile(conversationDir, sessionKey)), () => this.materializeState(options, conversationDir));
420
+ }
421
+ async materializeState(options, conversationDir) {
422
+ const { address, sessionKey, currentMessageId } = options;
668
423
  const runtimeCwd = runtimeCwdForSandbox(this.options.sandbox, this.options.workspace, address);
669
424
  const sessionScope = await this.chatSessionManager.resolveSessionScope({
670
425
  conversationDir,
@@ -672,41 +427,23 @@ class ConversationRuntimeImpl {
672
427
  cwd: runtimeCwd,
673
428
  currentMessageId,
674
429
  });
675
- const state = {
430
+ return {
676
431
  address,
677
432
  sessionKey,
678
433
  running: false,
679
- runner: await this.createCurrentRunner(options, conversationDir, sessionScope),
434
+ runner: await this.createCurrentRunner(options, sessionScope),
680
435
  stopRequested: false,
681
436
  lastAccessedAt: Date.now(),
682
437
  sessionFile: sessionScope.contextFile,
683
438
  startedAt: 0,
684
439
  };
685
- this.sessions.set(state);
686
- return state;
687
440
  }
688
441
  async shutdown(timeoutMs = 30_000) {
689
442
  if (this.isShuttingDown)
690
443
  return;
691
444
  this.isShuttingDown = true;
692
445
  log.logInfo("Shutting down gracefully...");
693
- const timeout = Date.now() + timeoutMs;
694
- while (this.inFlightRuns.size > 0 && Date.now() < timeout) {
695
- await new Promise((resolve) => setTimeout(resolve, 500));
696
- }
697
- if (this.inFlightRuns.size > 0) {
698
- log.logWarning(`Aborting ${this.inFlightRuns.size} runs after shutdown timeout`, `${timeoutMs}ms`);
699
- for (const state of this.sessions.runningStates())
700
- state.runner.abort();
701
- const closeDeadline = Date.now() + 5_000;
702
- while (this.inFlightRuns.size > 0 && Date.now() < closeDeadline) {
703
- await new Promise((resolve) => setTimeout(resolve, 100));
704
- }
705
- if (this.inFlightRuns.size > 0) {
706
- throw new Error(`Shutdown could not settle ${this.inFlightRuns.size} aborted runs within 5000ms`);
707
- }
708
- }
709
- await this.sessions.closeAll();
446
+ await this.sessions.shutdown(timeoutMs);
710
447
  }
711
448
  }
712
449
  //# sourceMappingURL=conversation-runtime.js.map