@geminixiang/mikan 1.0.0-beta.78 → 1.0.0-beta.79

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 (471) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/adapters/commands/admin.js +1 -1
  3. package/dist/adapters/commands/admin.js.map +1 -1
  4. package/dist/adapters/commands/login.d.ts.map +1 -1
  5. package/dist/adapters/commands/login.js +3 -2
  6. package/dist/adapters/commands/login.js.map +1 -1
  7. package/dist/adapters/commands/manifest.d.ts +0 -1
  8. package/dist/adapters/commands/manifest.d.ts.map +1 -1
  9. package/dist/adapters/commands/manifest.js.map +1 -1
  10. package/dist/adapters/commands/model.d.ts +0 -1
  11. package/dist/adapters/commands/model.d.ts.map +1 -1
  12. package/dist/adapters/commands/model.js +8 -20
  13. package/dist/adapters/commands/model.js.map +1 -1
  14. package/dist/adapters/commands/new.js +1 -1
  15. package/dist/adapters/commands/new.js.map +1 -1
  16. package/dist/adapters/commands/registry.js +1 -1
  17. package/dist/adapters/commands/registry.js.map +1 -1
  18. package/dist/adapters/commands/sandbox.d.ts +0 -1
  19. package/dist/adapters/commands/sandbox.d.ts.map +1 -1
  20. package/dist/adapters/commands/sandbox.js +1 -1
  21. package/dist/adapters/commands/sandbox.js.map +1 -1
  22. package/dist/adapters/commands/types.d.ts +6 -17
  23. package/dist/adapters/commands/types.d.ts.map +1 -1
  24. package/dist/adapters/commands/types.js.map +1 -1
  25. package/dist/adapters/commands/utils.d.ts +1 -1
  26. package/dist/adapters/commands/utils.d.ts.map +1 -1
  27. package/dist/adapters/commands/utils.js.map +1 -1
  28. package/dist/adapters/discord/bot.d.ts +4 -10
  29. package/dist/adapters/discord/bot.d.ts.map +1 -1
  30. package/dist/adapters/discord/bot.js +26 -22
  31. package/dist/adapters/discord/bot.js.map +1 -1
  32. package/dist/adapters/discord/components.d.ts +0 -1
  33. package/dist/adapters/discord/components.d.ts.map +1 -1
  34. package/dist/adapters/discord/components.js.map +1 -1
  35. package/dist/adapters/discord/context.d.ts +3 -3
  36. package/dist/adapters/discord/context.d.ts.map +1 -1
  37. package/dist/adapters/discord/context.js +1 -1
  38. package/dist/adapters/discord/context.js.map +1 -1
  39. package/dist/adapters/discord/types.d.ts +83 -1
  40. package/dist/adapters/discord/types.d.ts.map +1 -1
  41. package/dist/adapters/discord/types.js.map +1 -1
  42. package/dist/adapters/github/bot.d.ts +4 -5
  43. package/dist/adapters/github/bot.d.ts.map +1 -1
  44. package/dist/adapters/github/bot.js +10 -10
  45. package/dist/adapters/github/bot.js.map +1 -1
  46. package/dist/adapters/github/client.js +1 -1
  47. package/dist/adapters/github/client.js.map +1 -1
  48. package/dist/adapters/github/context.d.ts +3 -4
  49. package/dist/adapters/github/context.d.ts.map +1 -1
  50. package/dist/adapters/github/context.js +1 -2
  51. package/dist/adapters/github/context.js.map +1 -1
  52. package/dist/adapters/github/github-ops.d.ts +5 -6
  53. package/dist/adapters/github/github-ops.d.ts.map +1 -1
  54. package/dist/adapters/github/github-ops.js +1 -2
  55. package/dist/adapters/github/github-ops.js.map +1 -1
  56. package/dist/adapters/github/ids.d.ts +0 -3
  57. package/dist/adapters/github/ids.d.ts.map +1 -1
  58. package/dist/adapters/github/ids.js +0 -19
  59. package/dist/adapters/github/ids.js.map +1 -1
  60. package/dist/adapters/github/repo.d.ts +1 -1
  61. package/dist/adapters/github/repo.js.map +1 -1
  62. package/dist/adapters/github/tools/checks.d.ts +6 -4
  63. package/dist/adapters/github/tools/checks.d.ts.map +1 -1
  64. package/dist/adapters/github/tools/checks.js +4 -3
  65. package/dist/adapters/github/tools/checks.js.map +1 -1
  66. package/dist/adapters/github/tools/issue.d.ts +10 -8
  67. package/dist/adapters/github/tools/issue.d.ts.map +1 -1
  68. package/dist/adapters/github/tools/issue.js +4 -3
  69. package/dist/adapters/github/tools/issue.js.map +1 -1
  70. package/dist/adapters/github/tools/pr.d.ts +8 -6
  71. package/dist/adapters/github/tools/pr.d.ts.map +1 -1
  72. package/dist/adapters/github/tools/pr.js +4 -3
  73. package/dist/adapters/github/tools/pr.js.map +1 -1
  74. package/dist/adapters/github/tools/read.d.ts +9 -7
  75. package/dist/adapters/github/tools/read.d.ts.map +1 -1
  76. package/dist/adapters/github/tools/read.js +4 -3
  77. package/dist/adapters/github/tools/read.js.map +1 -1
  78. package/dist/adapters/github/tools/review-reply.d.ts +6 -4
  79. package/dist/adapters/github/tools/review-reply.d.ts.map +1 -1
  80. package/dist/adapters/github/tools/review-reply.js +4 -3
  81. package/dist/adapters/github/tools/review-reply.js.map +1 -1
  82. package/dist/adapters/github/tools/sync.d.ts +5 -3
  83. package/dist/adapters/github/tools/sync.d.ts.map +1 -1
  84. package/dist/adapters/github/tools/sync.js +4 -3
  85. package/dist/adapters/github/tools/sync.js.map +1 -1
  86. package/dist/adapters/github/types.d.ts +5 -4
  87. package/dist/adapters/github/types.d.ts.map +1 -1
  88. package/dist/adapters/github/types.js.map +1 -1
  89. package/dist/adapters/github/webhook.d.ts +0 -1
  90. package/dist/adapters/github/webhook.d.ts.map +1 -1
  91. package/dist/adapters/github/webhook.js.map +1 -1
  92. package/dist/adapters/intake.d.ts +1 -1
  93. package/dist/adapters/intake.d.ts.map +1 -1
  94. package/dist/adapters/intake.js.map +1 -1
  95. package/dist/adapters/markdown-tables.d.ts +0 -1
  96. package/dist/adapters/markdown-tables.d.ts.map +1 -1
  97. package/dist/adapters/markdown-tables.js.map +1 -1
  98. package/dist/adapters/messages.d.ts +1 -1
  99. package/dist/adapters/messages.d.ts.map +1 -1
  100. package/dist/adapters/messages.js.map +1 -1
  101. package/dist/adapters/progressive-renderer.d.ts +1 -1
  102. package/dist/adapters/progressive-renderer.d.ts.map +1 -1
  103. package/dist/adapters/progressive-renderer.js +8 -6
  104. package/dist/adapters/progressive-renderer.js.map +1 -1
  105. package/dist/adapters/shared.d.ts +6 -4
  106. package/dist/adapters/shared.d.ts.map +1 -1
  107. package/dist/adapters/shared.js +39 -25
  108. package/dist/adapters/shared.js.map +1 -1
  109. package/dist/adapters/slack/assistant.d.ts +0 -1
  110. package/dist/adapters/slack/assistant.d.ts.map +1 -1
  111. package/dist/adapters/slack/assistant.js +2 -1
  112. package/dist/adapters/slack/assistant.js.map +1 -1
  113. package/dist/adapters/slack/bot.d.ts +5 -10
  114. package/dist/adapters/slack/bot.d.ts.map +1 -1
  115. package/dist/adapters/slack/bot.js +84 -86
  116. package/dist/adapters/slack/bot.js.map +1 -1
  117. package/dist/adapters/slack/context.d.ts +3 -5
  118. package/dist/adapters/slack/context.d.ts.map +1 -1
  119. package/dist/adapters/slack/context.js +1 -2
  120. package/dist/adapters/slack/context.js.map +1 -1
  121. package/dist/adapters/slack/jev-context.d.ts.map +1 -1
  122. package/dist/adapters/slack/jev-context.js +4 -2
  123. package/dist/adapters/slack/jev-context.js.map +1 -1
  124. package/dist/adapters/slack/response-lifecycle.d.ts +3 -4
  125. package/dist/adapters/slack/response-lifecycle.d.ts.map +1 -1
  126. package/dist/adapters/slack/response-lifecycle.js +5 -3
  127. package/dist/adapters/slack/response-lifecycle.js.map +1 -1
  128. package/dist/adapters/slack/session.d.ts +1 -1
  129. package/dist/adapters/slack/session.d.ts.map +1 -1
  130. package/dist/adapters/slack/session.js.map +1 -1
  131. package/dist/adapters/slack/task-intent.js +1 -1
  132. package/dist/adapters/slack/task-intent.js.map +1 -1
  133. package/dist/adapters/slack/task-status.d.ts.map +1 -1
  134. package/dist/adapters/slack/task-status.js +2 -1
  135. package/dist/adapters/slack/task-status.js.map +1 -1
  136. package/dist/adapters/slack/tool-pack.d.ts +0 -1
  137. package/dist/adapters/slack/tool-pack.d.ts.map +1 -1
  138. package/dist/adapters/slack/tool-pack.js +2 -1
  139. package/dist/adapters/slack/tool-pack.js.map +1 -1
  140. package/dist/adapters/slack/tools/blockkit.d.ts +9 -7
  141. package/dist/adapters/slack/tools/blockkit.d.ts.map +1 -1
  142. package/dist/adapters/slack/tools/blockkit.js +6 -4
  143. package/dist/adapters/slack/tools/blockkit.js.map +1 -1
  144. package/dist/adapters/slack/types.d.ts +36 -2
  145. package/dist/adapters/slack/types.d.ts.map +1 -1
  146. package/dist/adapters/slack/types.js.map +1 -1
  147. package/dist/adapters/telegram/bot.d.ts +3 -8
  148. package/dist/adapters/telegram/bot.d.ts.map +1 -1
  149. package/dist/adapters/telegram/bot.js +11 -11
  150. package/dist/adapters/telegram/bot.js.map +1 -1
  151. package/dist/adapters/telegram/context.d.ts +3 -3
  152. package/dist/adapters/telegram/context.d.ts.map +1 -1
  153. package/dist/adapters/telegram/context.js +2 -2
  154. package/dist/adapters/telegram/context.js.map +1 -1
  155. package/dist/adapters/telegram/types.d.ts +24 -1
  156. package/dist/adapters/telegram/types.d.ts.map +1 -1
  157. package/dist/adapters/telegram/types.js.map +1 -1
  158. package/dist/adapters/types.d.ts +1 -2
  159. package/dist/adapters/types.d.ts.map +1 -1
  160. package/dist/adapters/types.js.map +1 -1
  161. package/dist/adapters/web/admin/client-assets.d.ts +1 -1
  162. package/dist/adapters/web/admin/client-assets.d.ts.map +1 -1
  163. package/dist/adapters/web/admin/client-assets.js +3 -2
  164. package/dist/adapters/web/admin/client-assets.js.map +1 -1
  165. package/dist/adapters/web/admin/portal.d.ts +4 -11
  166. package/dist/adapters/web/admin/portal.d.ts.map +1 -1
  167. package/dist/adapters/web/admin/portal.js +27 -30
  168. package/dist/adapters/web/admin/portal.js.map +1 -1
  169. package/dist/adapters/web/admin/provider-models.d.ts +1 -1
  170. package/dist/adapters/web/admin/provider-models.d.ts.map +1 -1
  171. package/dist/adapters/web/admin/provider-models.js.map +1 -1
  172. package/dist/adapters/web/admin/types.d.ts +10 -4
  173. package/dist/adapters/web/admin/types.d.ts.map +1 -1
  174. package/dist/adapters/web/admin/types.js.map +1 -1
  175. package/dist/adapters/web/login/oauth.d.ts +0 -1
  176. package/dist/adapters/web/login/oauth.d.ts.map +1 -1
  177. package/dist/adapters/web/login/oauth.js +12 -12
  178. package/dist/adapters/web/login/oauth.js.map +1 -1
  179. package/dist/adapters/web/login/portal.d.ts +3 -6
  180. package/dist/adapters/web/login/portal.d.ts.map +1 -1
  181. package/dist/adapters/web/login/portal.js +5 -4
  182. package/dist/adapters/web/login/portal.js.map +1 -1
  183. package/dist/adapters/web/login/types.d.ts +1 -1
  184. package/dist/adapters/web/login/types.d.ts.map +1 -1
  185. package/dist/adapters/web/login/types.js.map +1 -1
  186. package/dist/adapters/web/portal-shell.d.ts +0 -1
  187. package/dist/adapters/web/portal-shell.d.ts.map +1 -1
  188. package/dist/adapters/web/portal-shell.js.map +1 -1
  189. package/dist/adapters/web/server.d.ts +6 -6
  190. package/dist/adapters/web/server.d.ts.map +1 -1
  191. package/dist/adapters/web/server.js +3 -2
  192. package/dist/adapters/web/server.js.map +1 -1
  193. package/dist/adapters/web/session-view/portal.d.ts +2 -3
  194. package/dist/adapters/web/session-view/portal.d.ts.map +1 -1
  195. package/dist/adapters/web/session-view/portal.js +12 -12
  196. package/dist/adapters/web/session-view/portal.js.map +1 -1
  197. package/dist/adapters/web/session-view/types.d.ts +1 -11
  198. package/dist/adapters/web/session-view/types.d.ts.map +1 -1
  199. package/dist/adapters/web/session-view/types.js.map +1 -1
  200. package/dist/adapters/web/token-store.d.ts +0 -1
  201. package/dist/adapters/web/token-store.d.ts.map +1 -1
  202. package/dist/adapters/web/token-store.js.map +1 -1
  203. package/dist/cli/boot.d.ts +0 -1
  204. package/dist/cli/boot.d.ts.map +1 -1
  205. package/dist/cli/boot.js +4 -4
  206. package/dist/cli/boot.js.map +1 -1
  207. package/dist/cli/office.d.ts.map +1 -1
  208. package/dist/cli/office.js +4 -3
  209. package/dist/cli/office.js.map +1 -1
  210. package/dist/cli/onboard.js +1 -1
  211. package/dist/cli/onboard.js.map +1 -1
  212. package/dist/cli/sandbox.d.ts.map +1 -1
  213. package/dist/cli/sandbox.js +2 -1
  214. package/dist/cli/sandbox.js.map +1 -1
  215. package/dist/cli/sessions.d.ts.map +1 -1
  216. package/dist/cli/sessions.js +2 -1
  217. package/dist/cli/sessions.js.map +1 -1
  218. package/dist/env-manifest.d.ts +1 -1
  219. package/dist/env-manifest.d.ts.map +1 -1
  220. package/dist/env-manifest.js.map +1 -1
  221. package/dist/events/index.d.ts +3 -2
  222. package/dist/events/index.d.ts.map +1 -1
  223. package/dist/events/index.js +11 -10
  224. package/dist/events/index.js.map +1 -1
  225. package/dist/events/scheduler.d.ts +1 -2
  226. package/dist/events/scheduler.d.ts.map +1 -1
  227. package/dist/events/scheduler.js +4 -4
  228. package/dist/events/scheduler.js.map +1 -1
  229. package/dist/file-guards.d.ts +8 -6
  230. package/dist/file-guards.d.ts.map +1 -1
  231. package/dist/file-guards.js +10 -15
  232. package/dist/file-guards.js.map +1 -1
  233. package/dist/harness/execution-env.d.ts +1 -1
  234. package/dist/harness/execution-env.d.ts.map +1 -1
  235. package/dist/harness/execution-env.js +7 -6
  236. package/dist/harness/execution-env.js.map +1 -1
  237. package/dist/harness/execution-resolver.d.ts +4 -6
  238. package/dist/harness/execution-resolver.d.ts.map +1 -1
  239. package/dist/harness/execution-resolver.js +1 -1
  240. package/dist/harness/execution-resolver.js.map +1 -1
  241. package/dist/harness/jev.d.ts +1 -1
  242. package/dist/harness/jev.d.ts.map +1 -1
  243. package/dist/harness/jev.js +1 -4
  244. package/dist/harness/jev.js.map +1 -1
  245. package/dist/harness/mcp-result.d.ts.map +1 -1
  246. package/dist/harness/mcp-result.js +15 -7
  247. package/dist/harness/mcp-result.js.map +1 -1
  248. package/dist/harness/mcp.d.ts +0 -2
  249. package/dist/harness/mcp.d.ts.map +1 -1
  250. package/dist/harness/mcp.js +13 -15
  251. package/dist/harness/mcp.js.map +1 -1
  252. package/dist/harness/models.d.ts +0 -1
  253. package/dist/harness/models.d.ts.map +1 -1
  254. package/dist/harness/models.js +2 -1
  255. package/dist/harness/models.js.map +1 -1
  256. package/dist/harness/open-connector.d.ts +2 -3
  257. package/dist/harness/open-connector.d.ts.map +1 -1
  258. package/dist/harness/open-connector.js +13 -9
  259. package/dist/harness/open-connector.js.map +1 -1
  260. package/dist/harness/presenter.d.ts +4 -25
  261. package/dist/harness/presenter.d.ts.map +1 -1
  262. package/dist/harness/presenter.js +26 -20
  263. package/dist/harness/presenter.js.map +1 -1
  264. package/dist/harness/prompt.d.ts +1 -2
  265. package/dist/harness/prompt.d.ts.map +1 -1
  266. package/dist/harness/prompt.js.map +1 -1
  267. package/dist/harness/runner.d.ts.map +1 -1
  268. package/dist/harness/runner.js +34 -17
  269. package/dist/harness/runner.js.map +1 -1
  270. package/dist/harness/session.d.ts +0 -7
  271. package/dist/harness/session.d.ts.map +1 -1
  272. package/dist/harness/session.js +16 -14
  273. package/dist/harness/session.js.map +1 -1
  274. package/dist/harness/skills.d.ts +2 -5
  275. package/dist/harness/skills.d.ts.map +1 -1
  276. package/dist/harness/skills.js.map +1 -1
  277. package/dist/harness/subagent-profiles.d.ts +0 -1
  278. package/dist/harness/subagent-profiles.d.ts.map +1 -1
  279. package/dist/harness/subagent-profiles.js +12 -16
  280. package/dist/harness/subagent-profiles.js.map +1 -1
  281. package/dist/harness/subagent.d.ts +1 -1
  282. package/dist/harness/subagent.d.ts.map +1 -1
  283. package/dist/harness/subagent.js +17 -17
  284. package/dist/harness/subagent.js.map +1 -1
  285. package/dist/harness/tool-args.d.ts +2 -0
  286. package/dist/harness/tool-args.d.ts.map +1 -0
  287. package/dist/harness/tool-args.js +20 -0
  288. package/dist/harness/tool-args.js.map +1 -0
  289. package/dist/harness/tools/attach.d.ts +5 -4
  290. package/dist/harness/tools/attach.d.ts.map +1 -1
  291. package/dist/harness/tools/attach.js +1 -1
  292. package/dist/harness/tools/attach.js.map +1 -1
  293. package/dist/harness/tools/event.d.ts +12 -11
  294. package/dist/harness/tools/event.d.ts.map +1 -1
  295. package/dist/harness/tools/event.js +1 -1
  296. package/dist/harness/tools/event.js.map +1 -1
  297. package/dist/harness/tools/generate-image.d.ts +7 -5
  298. package/dist/harness/tools/generate-image.d.ts.map +1 -1
  299. package/dist/harness/tools/generate-image.js +7 -5
  300. package/dist/harness/tools/generate-image.js.map +1 -1
  301. package/dist/harness/tools/host-fn-tool.d.ts +3 -2
  302. package/dist/harness/tools/host-fn-tool.d.ts.map +1 -1
  303. package/dist/harness/tools/host-fn-tool.js +5 -2
  304. package/dist/harness/tools/host-fn-tool.js.map +1 -1
  305. package/dist/harness/tools/index.d.ts +3 -4
  306. package/dist/harness/tools/index.d.ts.map +1 -1
  307. package/dist/harness/tools/index.js +1 -3
  308. package/dist/harness/tools/index.js.map +1 -1
  309. package/dist/harness/tools/jev-browser.d.ts +12 -10
  310. package/dist/harness/tools/jev-browser.d.ts.map +1 -1
  311. package/dist/harness/tools/jev-browser.js +6 -4
  312. package/dist/harness/tools/jev-browser.js.map +1 -1
  313. package/dist/harness/tools/jev.d.ts +9 -7
  314. package/dist/harness/tools/jev.d.ts.map +1 -1
  315. package/dist/harness/tools/jev.js +5 -6
  316. package/dist/harness/tools/jev.js.map +1 -1
  317. package/dist/harness/tools/pi-tools.d.ts.map +1 -1
  318. package/dist/harness/tools/pi-tools.js +2 -2
  319. package/dist/harness/tools/pi-tools.js.map +1 -1
  320. package/dist/harness/tools/react.d.ts +3 -2
  321. package/dist/harness/tools/react.d.ts.map +1 -1
  322. package/dist/harness/tools/react.js +1 -1
  323. package/dist/harness/tools/react.js.map +1 -1
  324. package/dist/harness/tools/sandbox.d.ts +7 -6
  325. package/dist/harness/tools/sandbox.d.ts.map +1 -1
  326. package/dist/harness/tools/sandbox.js +3 -2
  327. package/dist/harness/tools/sandbox.js.map +1 -1
  328. package/dist/harness/tools/subagent.d.ts +26 -26
  329. package/dist/harness/tools/subagent.d.ts.map +1 -1
  330. package/dist/harness/tools/subagent.js +25 -29
  331. package/dist/harness/tools/subagent.js.map +1 -1
  332. package/dist/harness/tools/task.d.ts +11 -8
  333. package/dist/harness/tools/task.d.ts.map +1 -1
  334. package/dist/harness/tools/task.js +8 -6
  335. package/dist/harness/tools/task.js.map +1 -1
  336. package/dist/harness/tools/types.d.ts +2 -1
  337. package/dist/harness/tools/types.d.ts.map +1 -1
  338. package/dist/harness/tools/types.js.map +1 -1
  339. package/dist/harness/types.d.ts +37 -4
  340. package/dist/harness/types.d.ts.map +1 -1
  341. package/dist/harness/types.js.map +1 -1
  342. package/dist/index.d.ts +16 -13
  343. package/dist/index.d.ts.map +1 -1
  344. package/dist/index.js +3 -2
  345. package/dist/index.js.map +1 -1
  346. package/dist/log.d.ts +0 -1
  347. package/dist/log.d.ts.map +1 -1
  348. package/dist/log.js +1 -1
  349. package/dist/log.js.map +1 -1
  350. package/dist/main.js +27 -17
  351. package/dist/main.js.map +1 -1
  352. package/dist/memory-capture/index.d.ts +1 -2
  353. package/dist/memory-capture/index.d.ts.map +1 -1
  354. package/dist/memory-capture/index.js +8 -3
  355. package/dist/memory-capture/index.js.map +1 -1
  356. package/dist/memory-capture/types.d.ts +1 -1
  357. package/dist/memory-capture/types.js.map +1 -1
  358. package/dist/observability/index.d.ts +0 -3
  359. package/dist/observability/index.d.ts.map +1 -1
  360. package/dist/observability/index.js +11 -16
  361. package/dist/observability/index.js.map +1 -1
  362. package/dist/observability/sentry.d.ts +9 -12
  363. package/dist/observability/sentry.d.ts.map +1 -1
  364. package/dist/observability/sentry.js +9 -118
  365. package/dist/observability/sentry.js.map +1 -1
  366. package/dist/office/index.d.ts +14 -3
  367. package/dist/office/index.d.ts.map +1 -1
  368. package/dist/office/index.js +51 -14
  369. package/dist/office/index.js.map +1 -1
  370. package/dist/office/projection.d.ts +1 -3
  371. package/dist/office/projection.d.ts.map +1 -1
  372. package/dist/office/projection.js +5 -5
  373. package/dist/office/projection.js.map +1 -1
  374. package/dist/office/types.d.ts +5 -0
  375. package/dist/office/types.d.ts.map +1 -1
  376. package/dist/office/types.js.map +1 -1
  377. package/dist/runtime/conversation-runtime.d.ts +0 -1
  378. package/dist/runtime/conversation-runtime.d.ts.map +1 -1
  379. package/dist/runtime/conversation-runtime.js +10 -6
  380. package/dist/runtime/conversation-runtime.js.map +1 -1
  381. package/dist/runtime/session-lifecycle.d.ts.map +1 -1
  382. package/dist/runtime/session-lifecycle.js +2 -1
  383. package/dist/runtime/session-lifecycle.js.map +1 -1
  384. package/dist/runtime/types.d.ts +8 -5
  385. package/dist/runtime/types.d.ts.map +1 -1
  386. package/dist/runtime/types.js.map +1 -1
  387. package/dist/sandbox/cloudflare.d.ts.map +1 -1
  388. package/dist/sandbox/cloudflare.js +3 -2
  389. package/dist/sandbox/cloudflare.js.map +1 -1
  390. package/dist/sandbox/container.d.ts.map +1 -1
  391. package/dist/sandbox/container.js +2 -1
  392. package/dist/sandbox/container.js.map +1 -1
  393. package/dist/sandbox/host.js +1 -1
  394. package/dist/sandbox/host.js.map +1 -1
  395. package/dist/sandbox/identity.d.ts +0 -1
  396. package/dist/sandbox/identity.d.ts.map +1 -1
  397. package/dist/sandbox/identity.js.map +1 -1
  398. package/dist/sandbox/index.d.ts +4 -14
  399. package/dist/sandbox/index.d.ts.map +1 -1
  400. package/dist/sandbox/index.js +4 -93
  401. package/dist/sandbox/index.js.map +1 -1
  402. package/dist/sandbox/provisioner.d.ts +0 -1
  403. package/dist/sandbox/provisioner.d.ts.map +1 -1
  404. package/dist/sandbox/provisioner.js +12 -11
  405. package/dist/sandbox/provisioner.js.map +1 -1
  406. package/dist/sandbox/registry.d.ts +12 -0
  407. package/dist/sandbox/registry.d.ts.map +1 -0
  408. package/dist/sandbox/registry.js +93 -0
  409. package/dist/sandbox/registry.js.map +1 -0
  410. package/dist/sandbox/types.d.ts +3 -0
  411. package/dist/sandbox/types.d.ts.map +1 -1
  412. package/dist/sandbox/types.js.map +1 -1
  413. package/dist/sandbox/utils.d.ts.map +1 -1
  414. package/dist/sandbox/utils.js +1 -0
  415. package/dist/sandbox/utils.js.map +1 -1
  416. package/dist/sessions/chat-history-sync.d.ts +2 -2
  417. package/dist/sessions/chat-history-sync.d.ts.map +1 -1
  418. package/dist/sessions/chat-history-sync.js +32 -23
  419. package/dist/sessions/chat-history-sync.js.map +1 -1
  420. package/dist/sessions/migrate-common.js +2 -2
  421. package/dist/sessions/migrate-common.js.map +1 -1
  422. package/dist/sessions/migrate-pi-084.d.ts +0 -1
  423. package/dist/sessions/migrate-pi-084.d.ts.map +1 -1
  424. package/dist/sessions/migrate-pi-084.js +4 -6
  425. package/dist/sessions/migrate-pi-084.js.map +1 -1
  426. package/dist/sessions/migrate-v3.d.ts +0 -1
  427. package/dist/sessions/migrate-v3.d.ts.map +1 -1
  428. package/dist/sessions/migrate-v3.js +3 -5
  429. package/dist/sessions/migrate-v3.js.map +1 -1
  430. package/dist/sessions/session-key.d.ts +0 -1
  431. package/dist/sessions/session-key.d.ts.map +1 -1
  432. package/dist/sessions/session-key.js.map +1 -1
  433. package/dist/sessions/session-store.d.ts.map +1 -1
  434. package/dist/sessions/session-store.js +12 -19
  435. package/dist/sessions/session-store.js.map +1 -1
  436. package/dist/sessions/store.d.ts +0 -1
  437. package/dist/sessions/store.d.ts.map +1 -1
  438. package/dist/sessions/store.js +5 -3
  439. package/dist/sessions/store.js.map +1 -1
  440. package/dist/sessions/types.d.ts +2 -0
  441. package/dist/sessions/types.d.ts.map +1 -1
  442. package/dist/sessions/types.js +1 -0
  443. package/dist/sessions/types.js.map +1 -1
  444. package/dist/settings/apply.d.ts +1 -2
  445. package/dist/settings/apply.d.ts.map +1 -1
  446. package/dist/settings/apply.js.map +1 -1
  447. package/dist/settings/index.d.ts +37 -34
  448. package/dist/settings/index.d.ts.map +1 -1
  449. package/dist/settings/index.js +28 -22
  450. package/dist/settings/index.js.map +1 -1
  451. package/dist/settings/migrate.d.ts +1 -1
  452. package/dist/settings/migrate.d.ts.map +1 -1
  453. package/dist/settings/migrate.js +5 -4
  454. package/dist/settings/migrate.js.map +1 -1
  455. package/dist/types.d.ts +17 -6
  456. package/dist/types.d.ts.map +1 -1
  457. package/dist/types.js +1 -3
  458. package/dist/types.js.map +1 -1
  459. package/dist/unknown-values.d.ts +3 -0
  460. package/dist/unknown-values.d.ts.map +1 -0
  461. package/dist/unknown-values.js +7 -0
  462. package/dist/unknown-values.js.map +1 -0
  463. package/dist/vault/index.d.ts +10 -2
  464. package/dist/vault/index.d.ts.map +1 -1
  465. package/dist/vault/index.js +16 -7
  466. package/dist/vault/index.js.map +1 -1
  467. package/package.json +3 -2
  468. package/dist/adapters/index.d.ts +0 -11
  469. package/dist/adapters/index.d.ts.map +0 -1
  470. package/dist/adapters/index.js +0 -19
  471. package/dist/adapters/index.js.map +0 -1
@@ -1,5 +1,6 @@
1
1
  import { createRunner } from "../harness/runner.js";
2
- import { MikanModels } from "../harness/index.js";
2
+ import { MikanModels } from "../harness/models.js";
3
+ import { isCommandText } from "../adapters/commands/manifest.js";
3
4
  import { defaultCommandHandlers, dispatchCommand } from "../adapters/commands/registry.js";
4
5
  import { isPrivateConversation } from "../adapters/commands/utils.js";
5
6
  import * as log from "../log.js";
@@ -8,9 +9,10 @@ import { ChatHistorySync, hasMaterializedChatSession, waitForThreadSessionBootst
8
9
  import { getThreadSessionFile, resolveChannelSessionFile, tryResolveThreadSession, } from "../sessions/store.js";
9
10
  import { assertSessionKeyBelongsToConversation, deriveSessionKey, threadSuffixOf, } from "../sessions/session-key.js";
10
11
  import { formatNothingRunning, formatRestarting, formatStopped, formatStopping, } from "../adapters/messages.js";
11
- import { getUnresolvedSandboxPathContext } from "../sandbox/index.js";
12
+ import { getUnresolvedSandboxPathContext } from "../sandbox/registry.js";
12
13
  import { disabledVaultManager } from "../vault/index.js";
13
14
  import { SessionLifecycle } from "./session-lifecycle.js";
15
+ import { errorMessage } from "../unknown-values.js";
14
16
  function portalNotConfiguredTokenStore(portal) {
15
17
  return {
16
18
  create: () => {
@@ -52,7 +54,7 @@ class ConversationRuntimeImpl {
52
54
  constructor(options) {
53
55
  this.options = options;
54
56
  this.sessions = new SessionLifecycle();
55
- this.chatSessionManager = new ChatHistorySync();
57
+ this.chatSessionManager = new ChatHistorySync({ isCommandText });
56
58
  this.isShuttingDown = false;
57
59
  this.resolvedModels = options.models ?? MikanModels.create();
58
60
  this.memoryCapture = options.memoryCapture?.(this.resolvedModels);
@@ -81,7 +83,7 @@ class ConversationRuntimeImpl {
81
83
  startedAt: state.startedAt,
82
84
  lastActivityAt: state.lastActivityAt,
83
85
  currentTool: currentStep?.label || currentStep?.toolName,
84
- ...(state.stopRequested ? { stopping: true } : {}),
86
+ stopping: state.stopRequested ? true : undefined,
85
87
  });
86
88
  }
87
89
  }
@@ -345,7 +347,7 @@ class ConversationRuntimeImpl {
345
347
  },
346
348
  });
347
349
  recordCounter("agent.run.errors", 1, attribution);
348
- log.logWarning(`[${conversationId}] Run error`, err instanceof Error ? err.message : String(err));
350
+ log.logWarning(`[${conversationId}] Run error`, errorMessage(err));
349
351
  await context.responder
350
352
  .replaceResponse("Could not complete the request. Please reply to retry or revise it.")
351
353
  .catch(() => { });
@@ -378,7 +380,8 @@ class ConversationRuntimeImpl {
378
380
  return cleared;
379
381
  }
380
382
  async createCurrentRunner(options, sessionScope, signal) {
381
- return createRunner({
383
+ const runnerFactory = this.options.runnerFactory ?? createRunner;
384
+ return runnerFactory({
382
385
  sandboxConfig: this.options.sandbox,
383
386
  sessionKey: options.sessionKey,
384
387
  office: this.options.workspace.office(options.address),
@@ -387,6 +390,7 @@ class ConversationRuntimeImpl {
387
390
  openConnector: this.options.openConnector,
388
391
  eventScheduler: this.options.eventScheduler?.(),
389
392
  sessionScope,
393
+ chatHistory: this.chatSessionManager,
390
394
  signal,
391
395
  vaultManager: this.options.vaultManager,
392
396
  provisioner: this.options.provisioner,
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-runtime.js","sourceRoot":"","sources":["../../src/runtime/conversation-runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n MessagingBot,\n ConversationContext,\n ConversationMessage,\n ConversationEvent,\n HandleNewCommandOptions,\n OfficeAddress,\n PlatformName,\n RunningSession,\n} from \"../types.js\";\nimport type { Workspace } from \"../office/index.js\";\nimport { createRunner } from \"../harness/runner.js\";\nimport type { PiAgentWrapper } from \"../types.js\";\nimport type { RunMemoryCapture } from \"../memory-capture/index.js\";\nimport { MikanModels } from \"../harness/index.js\";\nimport { defaultCommandHandlers, dispatchCommand } from \"../adapters/commands/registry.js\";\nimport type { CommandHandler, CommandServices } from \"../adapters/commands/types.js\";\nimport { isPrivateConversation } from \"../adapters/commands/utils.js\";\nimport * as log from \"../log.js\";\nimport {\n addLifecycleEvent,\n createRunAttributionAttributes,\n recordCounter,\n recordDistribution,\n recordGauge,\n reportUserFacingError,\n withRunSpan,\n} from \"../observability/index.js\";\nimport {\n ChatHistorySync,\n hasMaterializedChatSession,\n waitForThreadSessionBootstrap,\n} from \"../sessions/chat-history-sync.js\";\nimport {\n getThreadSessionFile,\n resolveChannelSessionFile,\n tryResolveThreadSession,\n} from \"../sessions/store.js\";\nimport {\n assertSessionKeyBelongsToConversation,\n deriveSessionKey,\n threadSuffixOf,\n} from \"../sessions/session-key.js\";\nimport {\n formatNothingRunning,\n formatRestarting,\n formatStopped,\n formatStopping,\n} from \"../adapters/messages.js\";\nimport { getUnresolvedSandboxPathContext } from \"../sandbox/index.js\";\nimport { disabledVaultManager } from \"../vault/index.js\";\nimport type { ConversationRuntimeState } from \"./types.js\";\nimport { SessionLifecycle } from \"./session-lifecycle.js\";\n\ntype ConversationState = ConversationRuntimeState;\n\nexport type {\n RunSessionOptions,\n ConversationRuntime,\n ConversationRuntimeOptions,\n} from \"./types.js\";\nimport type {\n RunSessionOptions,\n ConversationRuntime,\n ConversationRuntimeOptions,\n SessionStateOptions,\n} from \"./types.js\";\n\ntype RunResult = Awaited<ReturnType<PiAgentWrapper[\"run\"]>>;\n\nfunction portalNotConfiguredTokenStore(portal: string): { create: () => never } {\n return {\n create: () => {\n throw new Error(`${portal} portal not configured`);\n },\n };\n}\n\nfunction runtimeCwdForSandbox(\n sandbox: ConversationRuntimeOptions[\"sandbox\"],\n workspace: Workspace,\n address: OfficeAddress,\n): string {\n const runtimeWorkspaceRoot = getUnresolvedSandboxPathContext(\n sandbox,\n workspace.root,\n ).runtimeWorkspaceRoot;\n return `${runtimeWorkspaceRoot.replace(/\\/+$/, \"\")}/${workspace.office(address).key}`;\n}\n\nfunction requestStop(state: ConversationRuntimeState): void {\n state.stopRequested = true;\n state.runner.abort();\n}\n\nasync function postAbortNotice(\n state: ConversationRuntimeState,\n bot: MessagingBot,\n conversationId: string,\n platformName: string,\n): Promise<void> {\n if (state.shutdownAborted) {\n recordCounter(\"agent.run.shutdown_aborted\", 1, { platform: platformName });\n const text = formatRestarting(bot);\n const ts = await bot.postMessage(conversationId, text);\n bot.logBotResponse?.(conversationId, text, ts);\n return;\n }\n if (!state.stopRequested) return;\n if (state.stopNoticeOwned) return;\n const thread = threadSuffixOf(state.sessionKey) ?? undefined;\n const text = formatStopped(bot);\n const ts =\n thread && bot.postInThread\n ? await bot.postInThread(conversationId, thread, text)\n : await bot.postMessage(conversationId, text);\n bot.logBotResponse?.(conversationId, text, ts, thread);\n}\n\nexport function createConversationRuntime(\n options: ConversationRuntimeOptions,\n): ConversationRuntime {\n return new ConversationRuntimeImpl(options);\n}\n\nclass ConversationRuntimeImpl implements ConversationRuntime {\n private readonly sessions = new SessionLifecycle();\n private readonly chatSessionManager = new ChatHistorySync();\n private readonly commandServices: CommandServices;\n private readonly commandHandlers: readonly CommandHandler[];\n private readonly resolvedModels: MikanModels;\n private readonly memoryCapture: RunMemoryCapture | undefined;\n private isShuttingDown = false;\n\n constructor(private readonly options: ConversationRuntimeOptions) {\n this.resolvedModels = options.models ?? MikanModels.create();\n this.memoryCapture = options.memoryCapture?.(this.resolvedModels);\n this.commandServices = {\n ...options,\n resourceController: options.resourceController ?? options.provisioner,\n vaultManager: options.vaultManager ?? disabledVaultManager,\n linkTokenStore: options.linkTokenStore ?? portalNotConfiguredTokenStore(\"Login\"),\n sessionViewTokenStore:\n options.sessionViewTokenStore ?? portalNotConfiguredTokenStore(\"Session viewer\"),\n adminTokenStore: options.adminTokenStore ?? portalNotConfiguredTokenStore(\"Admin\"),\n runtime: this,\n };\n this.commandHandlers = options.commandHandlers ?? defaultCommandHandlers(this.resolvedModels);\n }\n\n isRunning(address: OfficeAddress, sessionKey: string): boolean {\n return this.sessions.get(address, sessionKey)?.running === true;\n }\n\n getRunningSessions(): RunningSession[] {\n const sessions: RunningSession[] = [];\n for (const state of this.sessions.runningStates()) {\n if (state.startedAt) {\n const currentStep = state.runner.getCurrentStep();\n sessions.push({\n address: state.address,\n sessionKey: state.sessionKey,\n startedAt: state.startedAt,\n lastActivityAt: state.lastActivityAt,\n currentTool: currentStep?.label || currentStep?.toolName,\n ...(state.stopRequested ? { stopping: true } : {}),\n });\n }\n }\n return sessions;\n }\n\n async steer(message: ConversationMessage): Promise<boolean> {\n const state = this.sessions.get(message.address, message.sessionKey);\n if (!state?.running) return false;\n return state.runner.steer ? state.runner.steer(message) : false;\n }\n\n async handleStop(\n address: OfficeAddress,\n sessionKey: string,\n bot: MessagingBot,\n replyThreadTs?: string,\n ): Promise<void> {\n assertSessionKeyBelongsToConversation(sessionKey, address.conversationId);\n const post = async (text: string) => {\n const ts =\n replyThreadTs && bot.postInThread\n ? await bot.postInThread(address.conversationId, replyThreadTs, text)\n : await bot.postMessage(address.conversationId, text);\n bot.logBotResponse?.(address.conversationId, text, ts, replyThreadTs);\n return ts;\n };\n const state = this.sessions.get(address, sessionKey);\n if (!state?.running) {\n await post(formatNothingRunning(bot));\n return;\n }\n const settlement = state.runSettlement;\n state.stopNoticeOwned = true;\n requestStop(state);\n try {\n const ts = await post(formatStopping(bot));\n await settlement;\n const stoppedText = formatStopped(bot);\n await bot.updateMessage(address.conversationId, ts, stoppedText);\n bot.logBotResponse?.(address.conversationId, stoppedText, ts, replyThreadTs);\n } finally {\n state.stopNoticeOwned = false;\n }\n }\n\n forceStop(address: OfficeAddress, sessionKey: string): void {\n const state = this.sessions.get(address, sessionKey);\n if (state?.running) {\n log.logInfo(`[Force Stop] Force stopping session: ${sessionKey}`);\n requestStop(state);\n }\n }\n\n async handleNewCommand({ bot, message }: HandleNewCommandOptions): Promise<void> {\n const { address, sessionKey } = message;\n assertSessionKeyBelongsToConversation(sessionKey, address.conversationId);\n\n const activeState = this.sessions.get(address, sessionKey);\n if (activeState?.runSettlement) {\n if (activeState.running) requestStop(activeState);\n await activeState.runSettlement;\n }\n\n await this.sessions.runConversationMaintenance(address, async () => {\n await this.resetSession(address, sessionKey, bot);\n });\n }\n\n private async resetSession(\n address: OfficeAddress,\n sessionKey: string,\n bot: MessagingBot,\n ): Promise<void> {\n const conversationId = address.conversationId;\n const conversationDir = this.options.workspace.office(address).dir;\n const runtimeCwd = runtimeCwdForSandbox(this.options.sandbox, this.options.workspace, address);\n await this.chatSessionManager.resetSession({ conversationDir, sessionKey, cwd: runtimeCwd });\n\n await this.sessions.discardAndWait(address, sessionKey);\n\n log.logInfo(`[${conversationId}] Session reset: ${sessionKey}`);\n await bot.postMessage(conversationId, \"Conversation reset. Send a new message to start fresh.\");\n }\n\n async handleEvent(\n event: ConversationEvent,\n bot: MessagingBot,\n context: ConversationContext,\n ): Promise<void> {\n const sessionKey = deriveSessionKey(event);\n await this.sessions.enqueue(event.address, sessionKey, () =>\n this.runSession({ event, bot, context }),\n );\n }\n\n async runSession(options: RunSessionOptions): Promise<void> {\n const { event } = options;\n const conversationId = event.address.conversationId;\n if (this.isShuttingDown) {\n log.logInfo(\n `[${conversationId}] Rejected event during shutdown: ${event.text.substring(0, 50)}`,\n );\n return;\n }\n\n const sessionKey = deriveSessionKey(event);\n if (await this.handledBeforeRun(options, sessionKey)) return;\n\n const address = event.address;\n const releaseConversationWork = await this.sessions.acquireConversationWork(address);\n try {\n const conversationDir = this.options.workspace.office(address).dir;\n await this.waitForParentSession(address, sessionKey, conversationDir);\n\n const lease = await this.acquireRunLease(options, sessionKey);\n const { state } = lease;\n log.logInfo(`[${conversationId}] Starting run: ${event.text.substring(0, 50)}`);\n const runPromise = this.sessions.settle(state, () =>\n this.executeRun(options, sessionKey, state),\n );\n lease.release();\n recordGauge(\"agent.sessions.active\", this.sessions.settlementCount());\n await runPromise;\n } finally {\n releaseConversationWork();\n }\n }\n\n private async handledBeforeRun(options: RunSessionOptions, sessionKey: string): Promise<boolean> {\n const { event } = options;\n if (await this.dispatchSessionCommand(options, sessionKey)) return true;\n\n const activeSettlement = this.sessions.get(event.address, sessionKey)?.runSettlement;\n if (activeSettlement) await activeSettlement;\n return false;\n }\n\n private async acquireRunLease(\n { event, context }: RunSessionOptions,\n sessionKey: string,\n ): Promise<{ state: ConversationState; release: () => void }> {\n let lease: { state: ConversationState; release: () => void } | undefined;\n try {\n lease = await this.acquireState({\n address: event.address,\n sessionKey,\n currentMessageId: event.ts,\n trustModel: context.platform.trustModel ?? \"membership\",\n platformWorkspaceId: context.platform.workspaceId,\n });\n await lease.state.runner.syncChatHistory(event.ts);\n return lease;\n } catch (err) {\n lease?.release();\n reportUserFacingError(err, {\n domain: \"mikan\",\n surface: \"session_setup\",\n operation: \"get_or_create_state\",\n severity: \"error\",\n platform: context.platform.name,\n context: {\n conversationId: event.address.conversationId,\n sessionKey,\n messageId: context.message.id,\n threadTs: context.message.threadTs,\n attachmentCount: context.message.attachments?.length ?? 0,\n },\n });\n throw err;\n }\n }\n\n private async executeRun(\n { event, bot, context }: RunSessionOptions,\n sessionKey: string,\n state: ConversationState,\n ): Promise<void> {\n const conversationId = event.address.conversationId;\n try {\n const result = await this.runWithInstrumentation(\n context,\n { conversationId, sessionKey, startedAt: state.startedAt },\n async () => {\n await context.responder.setTyping(true);\n await context.responder.setWorking(true);\n try {\n return await state.runner.run(context.message, context.responder, context.platform);\n } finally {\n await context.responder.setWorking(false);\n }\n },\n );\n\n if (result?.stopReason === \"aborted\") {\n await postAbortNotice(state, bot, conversationId, context.platform.name);\n }\n if (result) {\n this.memoryCapture?.capture({\n office: this.options.workspace.office(event.address),\n message: context.message,\n stopReason: result.stopReason,\n reply: result.finalText ?? \"\",\n });\n }\n } finally {\n recordGauge(\"agent.sessions.active\", this.sessions.settlementCount() - 1);\n }\n }\n\n private async waitForParentSession(\n address: OfficeAddress,\n sessionKey: string,\n conversationDir: string,\n ): Promise<void> {\n const conversationId = address.conversationId;\n const waited = await waitForThreadSessionBootstrap({\n parentSessionKey: conversationId,\n sessionKey,\n hasThreadSession: () => hasMaterializedChatSession({ conversationDir, sessionKey }),\n isParentRunning: () => this.sessions.get(address, conversationId)?.running === true,\n });\n if (waited) {\n log.logInfo(\n `[${conversationId}] Delayed thread bootstrap until parent session sealed: ${sessionKey}`,\n );\n }\n }\n\n private async dispatchSessionCommand(\n { event, bot, context }: RunSessionOptions,\n sessionKey: string,\n ): Promise<boolean> {\n return dispatchCommand(this.commandHandlers, {\n bot,\n responder: context.responder,\n platform: context.platform.name as PlatformName,\n address: event.address,\n platformUserId: event.user,\n platformUserName: context.message.userName,\n conversationId: event.address.conversationId,\n vaultConversationId: event.vaultConversationId,\n sessionKey,\n commandText: event.text,\n privateConversation: isPrivateConversation(event),\n services: this.commandServices,\n });\n }\n\n private async runWithInstrumentation(\n context: ConversationContext,\n meta: {\n conversationId: string;\n sessionKey: string;\n startedAt: number;\n },\n body: () => Promise<RunResult>,\n ): Promise<RunResult | undefined> {\n const { conversationId, sessionKey, startedAt } = meta;\n const { message, platform } = context;\n\n const attribution = createRunAttributionAttributes({\n conversationId,\n sessionKey,\n messageId: message.id,\n platform: platform.name,\n conversationKind: message.conversationKind,\n userId: message.userId,\n userName: message.userName,\n threadTs: message.threadTs,\n });\n\n recordCounter(\"agent.run.started\", 1, attribution);\n\n return withRunSpan(\n {\n conversationId,\n sessionKey,\n messageId: message.id,\n platform: platform.name,\n conversationKind: message.conversationKind,\n userId: message.userId,\n userName: message.userName,\n threadTs: message.threadTs,\n },\n async () => {\n addLifecycleEvent(\"agent.run.started\", {\n channel_id: attribution.channel_id,\n platform: platform.name,\n conversation_kind: message.conversationKind,\n has_attachments: (message.attachments?.length ?? 0) > 0,\n });\n\n try {\n const result = await body();\n const durationMs = Date.now() - startedAt;\n const completionAttrs = {\n ...attribution,\n stop_reason: result.stopReason,\n };\n recordDistribution(\"agent.run.duration\", durationMs, {\n unit: \"millisecond\",\n attributes: completionAttrs,\n });\n recordCounter(\"agent.run.completed\", 1, completionAttrs);\n addLifecycleEvent(\"agent.run.completed\", {\n channel_id: attribution.channel_id,\n platform: platform.name,\n stop_reason: result.stopReason,\n duration_ms: durationMs,\n });\n return result;\n } catch (err) {\n reportUserFacingError(err, {\n domain: \"mikan\",\n surface: \"agent_run\",\n operation: \"run\",\n severity: \"error\",\n platform: platform.name,\n context: {\n conversationId,\n sessionKey,\n messageId: message.id,\n threadTs: message.threadTs,\n attachmentCount: message.attachments?.length ?? 0,\n },\n });\n recordCounter(\"agent.run.errors\", 1, attribution);\n log.logWarning(\n `[${conversationId}] Run error`,\n err instanceof Error ? err.message : String(err),\n );\n await context.responder\n .replaceResponse(\"Could not complete the request. Please reply to retry or revise it.\")\n .catch(() => {});\n return undefined;\n }\n },\n );\n }\n\n switchConversationModel(address: OfficeAddress, _provider: string, _model: string): boolean {\n return this.invalidateOffice(address, \"Model switched\");\n }\n\n refreshConversationEnvironment(address: OfficeAddress): boolean {\n return this.invalidateOffice(address, \"Environment refreshed\");\n }\n\n refreshAllConversations(): { busy: OfficeAddress[] } {\n const offices = this.sessions.offices();\n const result = this.sessions.invalidateAll();\n const busyKeys = new Set(\n result.busy.map((address) => `${address.platform}:${address.conversationId}`),\n );\n for (const address of offices) {\n if (busyKeys.has(`${address.platform}:${address.conversationId}`)) continue;\n log.logInfo(\n `[${address.conversationId}] Global settings changed; cleared cached session runners`,\n );\n }\n return result;\n }\n\n private invalidateOffice(address: OfficeAddress, reason: string): boolean {\n const cleared = this.sessions.invalidateConversation(address);\n if (cleared) {\n log.logInfo(`[${address.conversationId}] ${reason}; cleared cached session runners`);\n }\n return cleared;\n }\n\n private async createCurrentRunner(\n options: SessionStateOptions,\n sessionScope: Awaited<ReturnType<ChatHistorySync[\"resolveSessionScope\"]>>,\n signal: AbortSignal,\n ): Promise<PiAgentWrapper> {\n return createRunner({\n sandboxConfig: this.options.sandbox,\n sessionKey: options.sessionKey,\n office: this.options.workspace.office(options.address),\n trustModel: options.trustModel,\n platformWorkspaceId: options.platformWorkspaceId,\n openConnector: this.options.openConnector,\n eventScheduler: this.options.eventScheduler?.(),\n sessionScope,\n signal,\n vaultManager: this.options.vaultManager,\n provisioner: this.options.provisioner,\n resourceController: this.options.resourceController,\n sessionView: this.options.sessionViewTokenStore\n ? {\n tokenStore: this.options.sessionViewTokenStore,\n portalBaseUrl: this.options.portalBaseUrl,\n }\n : undefined,\n platformToolPackFactories: this.options.platformToolPackFactories,\n models: this.resolvedModels,\n });\n }\n\n private acquireState(options: SessionStateOptions & { currentMessageId?: string }) {\n const { address, sessionKey } = options;\n const conversationDir = this.options.workspace.office(address).dir;\n return this.sessions.acquire(\n address,\n sessionKey,\n () =>\n sessionKey === address.conversationId\n ? resolveChannelSessionFile(conversationDir)\n : tryResolveThreadSession(getThreadSessionFile(conversationDir, sessionKey)),\n (signal) => this.materializeState(options, conversationDir, signal),\n );\n }\n\n private async materializeState(\n options: SessionStateOptions & { currentMessageId?: string },\n conversationDir: string,\n signal: AbortSignal,\n ): Promise<ConversationState> {\n signal.throwIfAborted();\n const { address, sessionKey, currentMessageId } = options;\n const runtimeCwd = runtimeCwdForSandbox(this.options.sandbox, this.options.workspace, address);\n const sessionScope = await this.chatSessionManager.resolveSessionScope({\n conversationDir,\n sessionKey,\n cwd: runtimeCwd,\n currentMessageId,\n });\n signal.throwIfAborted();\n return {\n address,\n sessionKey,\n running: false,\n runner: await this.createCurrentRunner(options, sessionScope, signal),\n stopRequested: false,\n lastAccessedAt: Date.now(),\n sessionFile: sessionScope.contextFile,\n startedAt: 0,\n };\n }\n\n async shutdown(timeoutMs = 30_000): Promise<void> {\n if (this.isShuttingDown) return;\n this.isShuttingDown = true;\n log.logInfo(\"Shutting down gracefully...\");\n await this.sessions.shutdown(timeoutMs);\n }\n}\n"]}
1
+ {"version":3,"file":"conversation-runtime.js","sourceRoot":"","sources":["../../src/runtime/conversation-runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n MessagingBot,\n ConversationContext,\n ConversationMessage,\n ConversationEvent,\n HandleNewCommandOptions,\n OfficeAddress,\n PlatformName,\n RunningSession,\n} from \"../types.js\";\nimport type { Workspace } from \"../office/types.js\";\nimport { createRunner } from \"../harness/runner.js\";\nimport type { PiAgentWrapper } from \"../types.js\";\nimport type { RunMemoryCapture } from \"../memory-capture/types.js\";\nimport { MikanModels } from \"../harness/models.js\";\nimport { isCommandText } from \"../adapters/commands/manifest.js\";\nimport { defaultCommandHandlers, dispatchCommand } from \"../adapters/commands/registry.js\";\nimport type { CommandHandler, CommandServices } from \"../adapters/commands/types.js\";\nimport { isPrivateConversation } from \"../adapters/commands/utils.js\";\nimport * as log from \"../log.js\";\nimport {\n addLifecycleEvent,\n createRunAttributionAttributes,\n recordCounter,\n recordDistribution,\n recordGauge,\n reportUserFacingError,\n withRunSpan,\n} from \"../observability/index.js\";\nimport {\n ChatHistorySync,\n hasMaterializedChatSession,\n waitForThreadSessionBootstrap,\n} from \"../sessions/chat-history-sync.js\";\nimport {\n getThreadSessionFile,\n resolveChannelSessionFile,\n tryResolveThreadSession,\n} from \"../sessions/store.js\";\nimport {\n assertSessionKeyBelongsToConversation,\n deriveSessionKey,\n threadSuffixOf,\n} from \"../sessions/session-key.js\";\nimport {\n formatNothingRunning,\n formatRestarting,\n formatStopped,\n formatStopping,\n} from \"../adapters/messages.js\";\nimport { getUnresolvedSandboxPathContext } from \"../sandbox/registry.js\";\nimport { disabledVaultManager } from \"../vault/index.js\";\nimport type { ConversationRuntimeState } from \"./types.js\";\nimport { SessionLifecycle } from \"./session-lifecycle.js\";\n\ntype ConversationState = ConversationRuntimeState;\n\nimport type {\n RunSessionOptions,\n ConversationRuntime,\n ConversationRuntimeOptions,\n SessionStateOptions,\n} from \"./types.js\";\nimport { errorMessage } from \"../unknown-values.js\";\n\ntype RunResult = Awaited<ReturnType<PiAgentWrapper[\"run\"]>>;\n\nfunction portalNotConfiguredTokenStore(portal: string): { create: () => never } {\n return {\n create: () => {\n throw new Error(`${portal} portal not configured`);\n },\n };\n}\n\nfunction runtimeCwdForSandbox(\n sandbox: ConversationRuntimeOptions[\"sandbox\"],\n workspace: Workspace,\n address: OfficeAddress,\n): string {\n const runtimeWorkspaceRoot = getUnresolvedSandboxPathContext(\n sandbox,\n workspace.root,\n ).runtimeWorkspaceRoot;\n return `${runtimeWorkspaceRoot.replace(/\\/+$/, \"\")}/${workspace.office(address).key}`;\n}\n\nfunction requestStop(state: ConversationRuntimeState): void {\n state.stopRequested = true;\n state.runner.abort();\n}\n\nasync function postAbortNotice(\n state: ConversationRuntimeState,\n bot: MessagingBot,\n conversationId: string,\n platformName: string,\n): Promise<void> {\n if (state.shutdownAborted) {\n recordCounter(\"agent.run.shutdown_aborted\", 1, { platform: platformName });\n const text = formatRestarting(bot);\n const ts = await bot.postMessage(conversationId, text);\n bot.logBotResponse?.(conversationId, text, ts);\n return;\n }\n if (!state.stopRequested) return;\n if (state.stopNoticeOwned) return;\n const thread = threadSuffixOf(state.sessionKey) ?? undefined;\n const text = formatStopped(bot);\n const ts =\n thread && bot.postInThread\n ? await bot.postInThread(conversationId, thread, text)\n : await bot.postMessage(conversationId, text);\n bot.logBotResponse?.(conversationId, text, ts, thread);\n}\n\nexport function createConversationRuntime(\n options: ConversationRuntimeOptions,\n): ConversationRuntime {\n return new ConversationRuntimeImpl(options);\n}\n\nclass ConversationRuntimeImpl implements ConversationRuntime {\n private readonly sessions = new SessionLifecycle();\n private readonly chatSessionManager = new ChatHistorySync({ isCommandText });\n private readonly commandServices: CommandServices;\n private readonly commandHandlers: readonly CommandHandler[];\n private readonly resolvedModels: MikanModels;\n private readonly memoryCapture: RunMemoryCapture | undefined;\n private isShuttingDown = false;\n\n constructor(private readonly options: ConversationRuntimeOptions) {\n this.resolvedModels = options.models ?? MikanModels.create();\n this.memoryCapture = options.memoryCapture?.(this.resolvedModels);\n this.commandServices = {\n ...options,\n resourceController: options.resourceController ?? options.provisioner,\n vaultManager: options.vaultManager ?? disabledVaultManager,\n linkTokenStore: options.linkTokenStore ?? portalNotConfiguredTokenStore(\"Login\"),\n sessionViewTokenStore:\n options.sessionViewTokenStore ?? portalNotConfiguredTokenStore(\"Session viewer\"),\n adminTokenStore: options.adminTokenStore ?? portalNotConfiguredTokenStore(\"Admin\"),\n runtime: this,\n };\n this.commandHandlers = options.commandHandlers ?? defaultCommandHandlers(this.resolvedModels);\n }\n\n isRunning(address: OfficeAddress, sessionKey: string): boolean {\n return this.sessions.get(address, sessionKey)?.running === true;\n }\n\n getRunningSessions(): RunningSession[] {\n const sessions: RunningSession[] = [];\n for (const state of this.sessions.runningStates()) {\n if (state.startedAt) {\n const currentStep = state.runner.getCurrentStep();\n sessions.push({\n address: state.address,\n sessionKey: state.sessionKey,\n startedAt: state.startedAt,\n lastActivityAt: state.lastActivityAt,\n currentTool: currentStep?.label || currentStep?.toolName,\n stopping: state.stopRequested ? true : undefined,\n });\n }\n }\n return sessions;\n }\n\n async steer(message: ConversationMessage): Promise<boolean> {\n const state = this.sessions.get(message.address, message.sessionKey);\n if (!state?.running) return false;\n return state.runner.steer ? state.runner.steer(message) : false;\n }\n\n async handleStop(\n address: OfficeAddress,\n sessionKey: string,\n bot: MessagingBot,\n replyThreadTs?: string,\n ): Promise<void> {\n assertSessionKeyBelongsToConversation(sessionKey, address.conversationId);\n const post = async (text: string) => {\n const ts =\n replyThreadTs && bot.postInThread\n ? await bot.postInThread(address.conversationId, replyThreadTs, text)\n : await bot.postMessage(address.conversationId, text);\n bot.logBotResponse?.(address.conversationId, text, ts, replyThreadTs);\n return ts;\n };\n const state = this.sessions.get(address, sessionKey);\n if (!state?.running) {\n await post(formatNothingRunning(bot));\n return;\n }\n const settlement = state.runSettlement;\n state.stopNoticeOwned = true;\n requestStop(state);\n try {\n const ts = await post(formatStopping(bot));\n await settlement;\n const stoppedText = formatStopped(bot);\n await bot.updateMessage(address.conversationId, ts, stoppedText);\n bot.logBotResponse?.(address.conversationId, stoppedText, ts, replyThreadTs);\n } finally {\n state.stopNoticeOwned = false;\n }\n }\n\n forceStop(address: OfficeAddress, sessionKey: string): void {\n const state = this.sessions.get(address, sessionKey);\n if (state?.running) {\n log.logInfo(`[Force Stop] Force stopping session: ${sessionKey}`);\n requestStop(state);\n }\n }\n\n async handleNewCommand({ bot, message }: HandleNewCommandOptions): Promise<void> {\n const { address, sessionKey } = message;\n assertSessionKeyBelongsToConversation(sessionKey, address.conversationId);\n\n const activeState = this.sessions.get(address, sessionKey);\n if (activeState?.runSettlement) {\n if (activeState.running) requestStop(activeState);\n await activeState.runSettlement;\n }\n\n await this.sessions.runConversationMaintenance(address, async () => {\n await this.resetSession(address, sessionKey, bot);\n });\n }\n\n private async resetSession(\n address: OfficeAddress,\n sessionKey: string,\n bot: MessagingBot,\n ): Promise<void> {\n const conversationId = address.conversationId;\n const conversationDir = this.options.workspace.office(address).dir;\n const runtimeCwd = runtimeCwdForSandbox(this.options.sandbox, this.options.workspace, address);\n await this.chatSessionManager.resetSession({ conversationDir, sessionKey, cwd: runtimeCwd });\n\n await this.sessions.discardAndWait(address, sessionKey);\n\n log.logInfo(`[${conversationId}] Session reset: ${sessionKey}`);\n await bot.postMessage(conversationId, \"Conversation reset. Send a new message to start fresh.\");\n }\n\n async handleEvent(\n event: ConversationEvent,\n bot: MessagingBot,\n context: ConversationContext,\n ): Promise<void> {\n const sessionKey = deriveSessionKey(event);\n await this.sessions.enqueue(event.address, sessionKey, () =>\n this.runSession({ event, bot, context }),\n );\n }\n\n async runSession(options: RunSessionOptions): Promise<void> {\n const { event } = options;\n const conversationId = event.address.conversationId;\n if (this.isShuttingDown) {\n log.logInfo(\n `[${conversationId}] Rejected event during shutdown: ${event.text.substring(0, 50)}`,\n );\n return;\n }\n\n const sessionKey = deriveSessionKey(event);\n if (await this.handledBeforeRun(options, sessionKey)) return;\n\n const address = event.address;\n const releaseConversationWork = await this.sessions.acquireConversationWork(address);\n try {\n const conversationDir = this.options.workspace.office(address).dir;\n await this.waitForParentSession(address, sessionKey, conversationDir);\n\n const lease = await this.acquireRunLease(options, sessionKey);\n const { state } = lease;\n log.logInfo(`[${conversationId}] Starting run: ${event.text.substring(0, 50)}`);\n const runPromise = this.sessions.settle(state, () =>\n this.executeRun(options, sessionKey, state),\n );\n lease.release();\n recordGauge(\"agent.sessions.active\", this.sessions.settlementCount());\n await runPromise;\n } finally {\n releaseConversationWork();\n }\n }\n\n private async handledBeforeRun(options: RunSessionOptions, sessionKey: string): Promise<boolean> {\n const { event } = options;\n if (await this.dispatchSessionCommand(options, sessionKey)) return true;\n\n const activeSettlement = this.sessions.get(event.address, sessionKey)?.runSettlement;\n if (activeSettlement) await activeSettlement;\n return false;\n }\n\n private async acquireRunLease(\n { event, context }: RunSessionOptions,\n sessionKey: string,\n ): Promise<{ state: ConversationState; release: () => void }> {\n let lease: { state: ConversationState; release: () => void } | undefined;\n try {\n lease = await this.acquireState({\n address: event.address,\n sessionKey,\n currentMessageId: event.ts,\n trustModel: context.platform.trustModel ?? \"membership\",\n platformWorkspaceId: context.platform.workspaceId,\n });\n await lease.state.runner.syncChatHistory(event.ts);\n return lease;\n } catch (err) {\n lease?.release();\n reportUserFacingError(err, {\n domain: \"mikan\",\n surface: \"session_setup\",\n operation: \"get_or_create_state\",\n severity: \"error\",\n platform: context.platform.name,\n context: {\n conversationId: event.address.conversationId,\n sessionKey,\n messageId: context.message.id,\n threadTs: context.message.threadTs,\n attachmentCount: context.message.attachments?.length ?? 0,\n },\n });\n throw err;\n }\n }\n\n private async executeRun(\n { event, bot, context }: RunSessionOptions,\n sessionKey: string,\n state: ConversationState,\n ): Promise<void> {\n const conversationId = event.address.conversationId;\n try {\n const result = await this.runWithInstrumentation(\n context,\n { conversationId, sessionKey, startedAt: state.startedAt },\n async () => {\n await context.responder.setTyping(true);\n await context.responder.setWorking(true);\n try {\n return await state.runner.run(context.message, context.responder, context.platform);\n } finally {\n await context.responder.setWorking(false);\n }\n },\n );\n\n if (result?.stopReason === \"aborted\") {\n await postAbortNotice(state, bot, conversationId, context.platform.name);\n }\n if (result) {\n this.memoryCapture?.capture({\n office: this.options.workspace.office(event.address),\n message: context.message,\n stopReason: result.stopReason,\n reply: result.finalText ?? \"\",\n });\n }\n } finally {\n recordGauge(\"agent.sessions.active\", this.sessions.settlementCount() - 1);\n }\n }\n\n private async waitForParentSession(\n address: OfficeAddress,\n sessionKey: string,\n conversationDir: string,\n ): Promise<void> {\n const conversationId = address.conversationId;\n const waited = await waitForThreadSessionBootstrap({\n parentSessionKey: conversationId,\n sessionKey,\n hasThreadSession: () => hasMaterializedChatSession({ conversationDir, sessionKey }),\n isParentRunning: () => this.sessions.get(address, conversationId)?.running === true,\n });\n if (waited) {\n log.logInfo(\n `[${conversationId}] Delayed thread bootstrap until parent session sealed: ${sessionKey}`,\n );\n }\n }\n\n private async dispatchSessionCommand(\n { event, bot, context }: RunSessionOptions,\n sessionKey: string,\n ): Promise<boolean> {\n return dispatchCommand(this.commandHandlers, {\n bot,\n responder: context.responder,\n platform: context.platform.name as PlatformName,\n address: event.address,\n platformUserId: event.user,\n platformUserName: context.message.userName,\n conversationId: event.address.conversationId,\n vaultConversationId: event.vaultConversationId,\n sessionKey,\n commandText: event.text,\n privateConversation: isPrivateConversation(event),\n services: this.commandServices,\n });\n }\n\n private async runWithInstrumentation(\n context: ConversationContext,\n meta: {\n conversationId: string;\n sessionKey: string;\n startedAt: number;\n },\n body: () => Promise<RunResult>,\n ): Promise<RunResult | undefined> {\n const { conversationId, sessionKey, startedAt } = meta;\n const { message, platform } = context;\n\n const attribution = createRunAttributionAttributes({\n conversationId,\n sessionKey,\n messageId: message.id,\n platform: platform.name,\n conversationKind: message.conversationKind,\n userId: message.userId,\n userName: message.userName,\n threadTs: message.threadTs,\n });\n\n recordCounter(\"agent.run.started\", 1, attribution);\n\n return withRunSpan(\n {\n conversationId,\n sessionKey,\n messageId: message.id,\n platform: platform.name,\n conversationKind: message.conversationKind,\n userId: message.userId,\n userName: message.userName,\n threadTs: message.threadTs,\n },\n async () => {\n addLifecycleEvent(\"agent.run.started\", {\n channel_id: attribution.channel_id,\n platform: platform.name,\n conversation_kind: message.conversationKind,\n has_attachments: (message.attachments?.length ?? 0) > 0,\n });\n\n try {\n const result = await body();\n const durationMs = Date.now() - startedAt;\n const completionAttrs = {\n ...attribution,\n stop_reason: result.stopReason,\n };\n recordDistribution(\"agent.run.duration\", durationMs, {\n unit: \"millisecond\",\n attributes: completionAttrs,\n });\n recordCounter(\"agent.run.completed\", 1, completionAttrs);\n addLifecycleEvent(\"agent.run.completed\", {\n channel_id: attribution.channel_id,\n platform: platform.name,\n stop_reason: result.stopReason,\n duration_ms: durationMs,\n });\n return result;\n } catch (err) {\n reportUserFacingError(err, {\n domain: \"mikan\",\n surface: \"agent_run\",\n operation: \"run\",\n severity: \"error\",\n platform: platform.name,\n context: {\n conversationId,\n sessionKey,\n messageId: message.id,\n threadTs: message.threadTs,\n attachmentCount: message.attachments?.length ?? 0,\n },\n });\n recordCounter(\"agent.run.errors\", 1, attribution);\n log.logWarning(`[${conversationId}] Run error`, errorMessage(err));\n await context.responder\n .replaceResponse(\"Could not complete the request. Please reply to retry or revise it.\")\n .catch(() => {});\n return undefined;\n }\n },\n );\n }\n\n switchConversationModel(address: OfficeAddress, _provider: string, _model: string): boolean {\n return this.invalidateOffice(address, \"Model switched\");\n }\n\n refreshConversationEnvironment(address: OfficeAddress): boolean {\n return this.invalidateOffice(address, \"Environment refreshed\");\n }\n\n refreshAllConversations(): { busy: OfficeAddress[] } {\n const offices = this.sessions.offices();\n const result = this.sessions.invalidateAll();\n const busyKeys = new Set(\n result.busy.map((address) => `${address.platform}:${address.conversationId}`),\n );\n for (const address of offices) {\n if (busyKeys.has(`${address.platform}:${address.conversationId}`)) continue;\n log.logInfo(\n `[${address.conversationId}] Global settings changed; cleared cached session runners`,\n );\n }\n return result;\n }\n\n private invalidateOffice(address: OfficeAddress, reason: string): boolean {\n const cleared = this.sessions.invalidateConversation(address);\n if (cleared) {\n log.logInfo(`[${address.conversationId}] ${reason}; cleared cached session runners`);\n }\n return cleared;\n }\n\n private async createCurrentRunner(\n options: SessionStateOptions,\n sessionScope: Awaited<ReturnType<ChatHistorySync[\"resolveSessionScope\"]>>,\n signal: AbortSignal,\n ): Promise<PiAgentWrapper> {\n const runnerFactory = this.options.runnerFactory ?? createRunner;\n return runnerFactory({\n sandboxConfig: this.options.sandbox,\n sessionKey: options.sessionKey,\n office: this.options.workspace.office(options.address),\n trustModel: options.trustModel,\n platformWorkspaceId: options.platformWorkspaceId,\n openConnector: this.options.openConnector,\n eventScheduler: this.options.eventScheduler?.(),\n sessionScope,\n chatHistory: this.chatSessionManager,\n signal,\n vaultManager: this.options.vaultManager,\n provisioner: this.options.provisioner,\n resourceController: this.options.resourceController,\n sessionView: this.options.sessionViewTokenStore\n ? {\n tokenStore: this.options.sessionViewTokenStore,\n portalBaseUrl: this.options.portalBaseUrl,\n }\n : undefined,\n platformToolPackFactories: this.options.platformToolPackFactories,\n models: this.resolvedModels,\n });\n }\n\n private acquireState(options: SessionStateOptions & { currentMessageId?: string }) {\n const { address, sessionKey } = options;\n const conversationDir = this.options.workspace.office(address).dir;\n return this.sessions.acquire(\n address,\n sessionKey,\n () =>\n sessionKey === address.conversationId\n ? resolveChannelSessionFile(conversationDir)\n : tryResolveThreadSession(getThreadSessionFile(conversationDir, sessionKey)),\n (signal) => this.materializeState(options, conversationDir, signal),\n );\n }\n\n private async materializeState(\n options: SessionStateOptions & { currentMessageId?: string },\n conversationDir: string,\n signal: AbortSignal,\n ): Promise<ConversationState> {\n signal.throwIfAborted();\n const { address, sessionKey, currentMessageId } = options;\n const runtimeCwd = runtimeCwdForSandbox(this.options.sandbox, this.options.workspace, address);\n const sessionScope = await this.chatSessionManager.resolveSessionScope({\n conversationDir,\n sessionKey,\n cwd: runtimeCwd,\n currentMessageId,\n });\n signal.throwIfAborted();\n return {\n address,\n sessionKey,\n running: false,\n runner: await this.createCurrentRunner(options, sessionScope, signal),\n stopRequested: false,\n lastAccessedAt: Date.now(),\n sessionFile: sessionScope.contextFile,\n startedAt: 0,\n };\n }\n\n async shutdown(timeoutMs = 30_000): Promise<void> {\n if (this.isShuttingDown) return;\n this.isShuttingDown = true;\n log.logInfo(\"Shutting down gracefully...\");\n await this.sessions.shutdown(timeoutMs);\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"session-lifecycle.d.ts","sourceRoot":"","sources":["../../src/runtime/session-lifecycle.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session-lifecycle.d.ts","sourceRoot":"","sources":["../../src/runtime/session-lifecycle.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import * as log from "../log.js";
2
2
  import { officeKey } from "../office/index.js";
3
+ import { errorMessage } from "../unknown-values.js";
3
4
  const DEFAULT_MAX_SESSIONS = 500;
4
5
  const DEFAULT_IDLE_TIMEOUT_MS = 3_600_000;
5
6
  const MATERIALIZATION_ABORT_GRACE_MS = 5_000;
@@ -310,7 +311,7 @@ export class SessionLifecycle {
310
311
  const close = state.runner.dispose();
311
312
  this.trackClosing(id, close);
312
313
  close.catch((err) => {
313
- log.logWarning(`Runner dispose failed: ${sessionKey}`, err instanceof Error ? err.message : String(err));
314
+ log.logWarning(`Runner dispose failed: ${sessionKey}`, errorMessage(err));
314
315
  });
315
316
  }
316
317
  trackClosing(id, close) {
@@ -1 +1 @@
1
- {"version":3,"file":"session-lifecycle.js","sourceRoot":"","sources":["../../src/runtime/session-lifecycle.ts"],"names":[],"mappings":"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","sourcesContent":["import type { OfficeAddress } from \"../types.js\";\nimport * as log from \"../log.js\";\nimport { officeKey } from \"../office/index.js\";\nimport type { ConversationRuntimeState, SessionLifecycleOptions } from \"./types.js\";\n\nconst DEFAULT_MAX_SESSIONS = 500;\nconst DEFAULT_IDLE_TIMEOUT_MS = 3_600_000;\nconst MATERIALIZATION_ABORT_GRACE_MS = 5_000;\n\ninterface ConversationBarrier {\n activeWork: number;\n pendingMaintenance: number;\n maintenanceTail: Promise<void>;\n activeWaiters: Array<() => void>;\n workWaiters: Array<() => void>;\n}\n\nfunction releaseWaiters(waiters: Array<() => void>): void {\n for (const resolve of waiters.splice(0)) resolve();\n}\n\nfunction runtimeSessionId(address: OfficeAddress, sessionKey: string): string {\n return `${officeKey(address)}|${sessionKey}`;\n}\n\nexport class SessionLifecycle {\n private readonly states = new Map<string, ConversationRuntimeState>();\n private readonly closing = new Map<string, Promise<void>>();\n private readonly transitions = new Map<string, Promise<void>>();\n private readonly queues = new Map<string, Promise<void>>();\n private readonly leases = new Map<string, number>();\n private readonly settlementSessions = new Map<Promise<void>, string>();\n private readonly conversationBarriers = new Map<string, ConversationBarrier>();\n private readonly pendingConversationClears = new Set<string>();\n private readonly conversationGenerations = new Map<string, number>();\n private readonly maxSessions: number;\n private readonly idleTimeoutMs: number;\n private readonly now: () => number;\n private globalGeneration = 0;\n private shuttingDown = false;\n private readonly materializationAbort = new AbortController();\n\n constructor(options: SessionLifecycleOptions = {}) {\n this.maxSessions = options.maxSessions ?? DEFAULT_MAX_SESSIONS;\n this.idleTimeoutMs = options.idleTimeoutMs ?? DEFAULT_IDLE_TIMEOUT_MS;\n this.now = options.now ?? Date.now;\n }\n\n get(address: OfficeAddress, sessionKey: string): ConversationRuntimeState | undefined {\n return this.states.get(runtimeSessionId(address, sessionKey));\n }\n\n set(state: ConversationRuntimeState): void {\n this.states.set(runtimeSessionId(state.address, state.sessionKey), state);\n }\n\n async acquire(\n address: OfficeAddress,\n sessionKey: string,\n expectedFile: () => string | null | undefined,\n materialize: (signal: AbortSignal) => Promise<ConversationRuntimeState>,\n ): Promise<{ state: ConversationRuntimeState; release: () => void }> {\n if (this.shuttingDown) throw new Error(\"Session lifecycle is shutting down\");\n return this.transition(address, sessionKey, async () => {\n const state = await this.materializeExclusive(address, sessionKey, expectedFile, materialize);\n const id = runtimeSessionId(address, sessionKey);\n this.leases.set(id, (this.leases.get(id) ?? 0) + 1);\n return { state, release: this.createLeaseRelease(id, address) };\n });\n }\n\n private reusableState(\n id: string,\n expectedFile: () => string | null | undefined,\n ): ConversationRuntimeState | undefined {\n const existing = this.states.get(id);\n if (!existing) return undefined;\n if (expectedFile() === existing.sessionFile) {\n existing.lastAccessedAt = this.now();\n return existing;\n }\n return this.isStateActive(id, existing) ? existing : undefined;\n }\n\n private async publishMaterialized(\n id: string,\n address: OfficeAddress,\n generation: string,\n state: ConversationRuntimeState,\n ): Promise<boolean> {\n if (!this.shuttingDown && generation === this.generation(address)) {\n this.states.set(id, state);\n return true;\n }\n await state.runner.dispose();\n if (this.shuttingDown) throw new Error(\"Session lifecycle is shutting down\");\n return false;\n }\n\n private async materializeExclusive(\n address: OfficeAddress,\n sessionKey: string,\n expectedFile: () => string | null | undefined,\n materialize: (signal: AbortSignal) => Promise<ConversationRuntimeState>,\n ): Promise<ConversationRuntimeState> {\n const id = runtimeSessionId(address, sessionKey);\n while (true) {\n if (this.shuttingDown) throw new Error(\"Session lifecycle is shutting down\");\n await this.waitForClose(address, sessionKey);\n const reusable = this.reusableState(id, expectedFile);\n if (reusable) return reusable;\n if (this.states.has(id)) await this.discardAndWait(address, sessionKey);\n\n const generation = this.generation(address);\n const state = await materialize(this.materializationAbort.signal);\n if (await this.publishMaterialized(id, address, generation, state)) return state;\n }\n }\n\n private createLeaseRelease(id: string, address: OfficeAddress): () => void {\n let released = false;\n return () => {\n if (released) return;\n released = true;\n this.releaseLease(id, address);\n };\n }\n\n private releaseLease(id: string, address: OfficeAddress): void {\n const count = this.leases.get(id) ?? 0;\n if (count <= 1) this.leases.delete(id);\n else this.leases.set(id, count - 1);\n this.applyDeferredClear(address);\n }\n\n settle(\n state: ConversationRuntimeState,\n work: () => Promise<void>,\n options: { markRunning?: boolean } = {},\n ): Promise<void> {\n const id = runtimeSessionId(state.address, state.sessionKey);\n this.leases.set(id, (this.leases.get(id) ?? 0) + 1);\n if (options.markRunning !== false) {\n state.running = true;\n state.stopRequested = false;\n state.startedAt = this.now();\n state.lastActivityAt = this.now();\n }\n\n let settlement!: Promise<void>;\n settlement = Promise.resolve()\n .then(work)\n .finally(() => this.finishSettlement(state, settlement, id));\n state.runSettlement = settlement;\n this.settlementSessions.set(settlement, id);\n return settlement;\n }\n\n private finishSettlement(\n state: ConversationRuntimeState,\n settlement: Promise<void>,\n id: string,\n ): void {\n this.settlementSessions.delete(settlement);\n if (state.runSettlement === settlement) state.runSettlement = undefined;\n state.running = false;\n state.startedAt = 0;\n state.lastAccessedAt = this.now();\n this.releaseLease(id, state.address);\n this.evictIdle();\n }\n\n settlementCount(): number {\n return this.settlementSessions.size;\n }\n\n async enqueue(\n address: OfficeAddress,\n sessionKey: string,\n run: () => Promise<void>,\n ): Promise<void> {\n const id = runtimeSessionId(address, sessionKey);\n const previous = this.queues.get(id) ?? Promise.resolve();\n const next = previous.catch(() => {}).then(run);\n this.queues.set(id, next);\n try {\n await next;\n } finally {\n if (this.queues.get(id) === next) this.queues.delete(id);\n }\n }\n\n async acquireConversationWork(address: OfficeAddress): Promise<() => void> {\n const barrier = this.getConversationBarrier(address);\n while (barrier.pendingMaintenance > 0) {\n await new Promise<void>((resolve) => barrier.workWaiters.push(resolve));\n }\n barrier.activeWork++;\n let released = false;\n return () => {\n if (released) return;\n released = true;\n barrier.activeWork--;\n if (barrier.activeWork === 0) releaseWaiters(barrier.activeWaiters);\n };\n }\n\n async runConversationMaintenance<T>(\n address: OfficeAddress,\n maintenance: () => Promise<T>,\n ): Promise<T> {\n const barrier = this.getConversationBarrier(address);\n barrier.pendingMaintenance++;\n const previousMaintenance = barrier.maintenanceTail;\n let finishMaintenance!: () => void;\n const maintenanceTurn = new Promise<void>((resolve) => (finishMaintenance = resolve));\n barrier.maintenanceTail = previousMaintenance.then(() => maintenanceTurn);\n\n await previousMaintenance;\n if (barrier.activeWork > 0) {\n await new Promise<void>((resolve) => barrier.activeWaiters.push(resolve));\n }\n try {\n return await maintenance();\n } finally {\n finishMaintenance();\n barrier.pendingMaintenance--;\n if (barrier.pendingMaintenance === 0) releaseWaiters(barrier.workWaiters);\n }\n }\n\n private getConversationBarrier(address: OfficeAddress): ConversationBarrier {\n const key = officeKey(address);\n const existing = this.conversationBarriers.get(key);\n if (existing) return existing;\n const barrier: ConversationBarrier = {\n activeWork: 0,\n pendingMaintenance: 0,\n maintenanceTail: Promise.resolve(),\n activeWaiters: [],\n workWaiters: [],\n };\n this.conversationBarriers.set(key, barrier);\n return barrier;\n }\n\n runningStates(): ConversationRuntimeState[] {\n return Array.from(this.states.values()).filter((state) => state.running);\n }\n\n offices(): OfficeAddress[] {\n const offices = new Map<string, OfficeAddress>();\n for (const state of this.states.values()) offices.set(officeKey(state.address), state.address);\n return Array.from(offices.values());\n }\n\n officesForConversationId(conversationId: string): OfficeAddress[] {\n return this.offices().filter((address) => address.conversationId === conversationId);\n }\n\n invalidateConversation(address: OfficeAddress): boolean {\n const key = officeKey(address);\n this.conversationGenerations.set(key, (this.conversationGenerations.get(key) ?? 0) + 1);\n return this.clearConversation(address);\n }\n\n invalidateAll(): { busy: OfficeAddress[] } {\n this.globalGeneration++;\n const busy: OfficeAddress[] = [];\n for (const address of this.offices()) {\n if (this.clearConversation(address)) continue;\n this.deferConversationClear(address);\n busy.push(address);\n }\n return { busy };\n }\n\n clearConversation(address: OfficeAddress): boolean {\n if (this.hasActiveWork(address)) return false;\n this.pendingConversationClears.delete(officeKey(address));\n this.discardConversation(address);\n return true;\n }\n\n deferConversationClear(address: OfficeAddress): void {\n this.pendingConversationClears.add(officeKey(address));\n }\n\n private applyDeferredClear(address: OfficeAddress): void {\n const key = officeKey(address);\n if (!this.pendingConversationClears.has(key) || this.hasActiveWork(address)) return;\n this.pendingConversationClears.delete(key);\n this.discardConversation(address);\n }\n\n private hasActiveWork(address: OfficeAddress): boolean {\n const key = officeKey(address);\n for (const state of this.states.values()) {\n const id = runtimeSessionId(state.address, state.sessionKey);\n if (officeKey(state.address) === key && this.isStateActive(id, state)) return true;\n }\n return false;\n }\n\n private isStateActive(id: string, state: ConversationRuntimeState): boolean {\n return (this.leases.get(id) ?? 0) > 0 || state.running || state.runSettlement !== undefined;\n }\n\n private discardConversation(address: OfficeAddress): void {\n const key = officeKey(address);\n for (const state of Array.from(this.states.values())) {\n if (officeKey(state.address) === key) this.discard(state.address, state.sessionKey);\n }\n }\n\n private generation(address: OfficeAddress): string {\n return `${this.globalGeneration}:${this.conversationGenerations.get(officeKey(address)) ?? 0}`;\n }\n\n async transition<T>(\n address: OfficeAddress,\n sessionKey: string,\n work: () => Promise<T>,\n ): Promise<T> {\n const id = runtimeSessionId(address, sessionKey);\n const previous = this.transitions.get(id) ?? Promise.resolve();\n let release!: () => void;\n const current = new Promise<void>((resolve) => (release = resolve));\n const tail = previous.then(() => current);\n this.transitions.set(id, tail);\n await previous;\n try {\n return await work();\n } finally {\n release();\n if (this.transitions.get(id) === tail) this.transitions.delete(id);\n }\n }\n\n async discardAndWait(address: OfficeAddress, sessionKey: string): Promise<void> {\n const id = runtimeSessionId(address, sessionKey);\n const state = this.states.get(id);\n if (!state) {\n await this.closing.get(id);\n return;\n }\n this.states.delete(id);\n const close = state.runner.dispose();\n this.trackClosing(id, close);\n await close;\n }\n\n async waitForClose(address: OfficeAddress, sessionKey: string): Promise<void> {\n await this.closing.get(runtimeSessionId(address, sessionKey));\n }\n\n async closeAll(): Promise<void> {\n const states = Array.from(this.states.values());\n this.states.clear();\n for (const state of states) {\n const id = runtimeSessionId(state.address, state.sessionKey);\n this.trackClosing(id, state.runner.dispose());\n }\n await Promise.all(this.closing.values());\n }\n\n private discard(address: OfficeAddress, sessionKey: string): void {\n const id = runtimeSessionId(address, sessionKey);\n const state = this.states.get(id);\n if (!state) return;\n this.states.delete(id);\n const close = state.runner.dispose();\n this.trackClosing(id, close);\n close.catch((err: unknown) => {\n log.logWarning(\n `Runner dispose failed: ${sessionKey}`,\n err instanceof Error ? err.message : String(err),\n );\n });\n }\n\n private trackClosing(id: string, close: Promise<void>): void {\n this.closing.set(id, close);\n const clear = () => {\n if (this.closing.get(id) === close) this.closing.delete(id);\n };\n void close.then(clear, clear);\n }\n\n evictIdle(): void {\n const now = this.now();\n for (const state of Array.from(this.states.values())) {\n const id = runtimeSessionId(state.address, state.sessionKey);\n if (!this.isStateActive(id, state) && now - state.lastAccessedAt > this.idleTimeoutMs) {\n this.discard(state.address, state.sessionKey);\n }\n }\n if (this.states.size <= this.maxSessions) return;\n\n const idle = Array.from(this.states.values())\n .filter(\n (state) => !this.isStateActive(runtimeSessionId(state.address, state.sessionKey), state),\n )\n .toSorted((left, right) => left.lastAccessedAt - right.lastAccessedAt);\n const toEvict = this.states.size - this.maxSessions;\n for (const state of idle.slice(0, toEvict)) this.discard(state.address, state.sessionKey);\n }\n\n async shutdown(timeoutMs: number): Promise<void> {\n if (this.shuttingDown) return;\n this.shuttingDown = true;\n const materializationDeadline = Date.now() + MATERIALIZATION_ABORT_GRACE_MS;\n this.materializationAbort.abort(new Error(\"Session lifecycle is shutting down\"));\n const timeout = Date.now() + timeoutMs;\n await this.waitForActiveWork(timeout, 500);\n\n if (this.activeWorkCount() > 0) {\n log.logWarning(\n `Aborting ${this.activeWorkCount()} runs after shutdown timeout`,\n `${timeoutMs}ms`,\n );\n for (const state of this.runningStates()) {\n state.shutdownAborted = true;\n state.runner.abort();\n }\n await this.waitForActiveWork(Date.now() + 5_000, 100);\n if (this.activeWorkCount() > 0) {\n throw new Error(\n `Shutdown could not settle ${this.activeWorkCount()} aborted runs within 5000ms`,\n );\n }\n }\n\n await this.waitForMaterializations(materializationDeadline);\n await this.closeAll();\n }\n\n private async waitForMaterializations(deadline: number): Promise<void> {\n if (this.transitions.size === 0) return;\n let timeout: NodeJS.Timeout | undefined;\n const settled = await Promise.race([\n Promise.all(this.transitions.values()).then(() => true),\n new Promise<false>((resolve) => {\n timeout = setTimeout(() => resolve(false), Math.max(0, deadline - Date.now()));\n }),\n ]);\n if (timeout) clearTimeout(timeout);\n if (!settled) {\n throw new Error(\n `Shutdown could not settle ${this.transitions.size} runner materializations within ${MATERIALIZATION_ABORT_GRACE_MS}ms`,\n );\n }\n }\n\n private async waitForActiveWork(deadline: number, intervalMs: number): Promise<void> {\n while (this.activeWorkCount() > 0 && Date.now() < deadline) {\n await new Promise((resolve) => setTimeout(resolve, intervalMs));\n }\n }\n\n private activeWorkCount(): number {\n const sessionIds = new Set(this.leases.keys());\n for (const sessionId of this.settlementSessions.values()) {\n sessionIds.add(sessionId);\n }\n return sessionIds.size;\n }\n}\n"]}
1
+ {"version":3,"file":"session-lifecycle.js","sourceRoot":"","sources":["../../src/runtime/session-lifecycle.ts"],"names":[],"mappings":"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","sourcesContent":["import type { OfficeAddress } from \"../types.js\";\nimport * as log from \"../log.js\";\nimport { officeKey } from \"../office/index.js\";\nimport type { ConversationRuntimeState, SessionLifecycleOptions } from \"./types.js\";\nimport { errorMessage } from \"../unknown-values.js\";\n\nconst DEFAULT_MAX_SESSIONS = 500;\nconst DEFAULT_IDLE_TIMEOUT_MS = 3_600_000;\nconst MATERIALIZATION_ABORT_GRACE_MS = 5_000;\n\ninterface ConversationBarrier {\n activeWork: number;\n pendingMaintenance: number;\n maintenanceTail: Promise<void>;\n activeWaiters: Array<() => void>;\n workWaiters: Array<() => void>;\n}\n\nfunction releaseWaiters(waiters: Array<() => void>): void {\n for (const resolve of waiters.splice(0)) resolve();\n}\n\nfunction runtimeSessionId(address: OfficeAddress, sessionKey: string): string {\n return `${officeKey(address)}|${sessionKey}`;\n}\n\nexport class SessionLifecycle {\n private readonly states = new Map<string, ConversationRuntimeState>();\n private readonly closing = new Map<string, Promise<void>>();\n private readonly transitions = new Map<string, Promise<void>>();\n private readonly queues = new Map<string, Promise<void>>();\n private readonly leases = new Map<string, number>();\n private readonly settlementSessions = new Map<Promise<void>, string>();\n private readonly conversationBarriers = new Map<string, ConversationBarrier>();\n private readonly pendingConversationClears = new Set<string>();\n private readonly conversationGenerations = new Map<string, number>();\n private readonly maxSessions: number;\n private readonly idleTimeoutMs: number;\n private readonly now: () => number;\n private globalGeneration = 0;\n private shuttingDown = false;\n private readonly materializationAbort = new AbortController();\n\n constructor(options: SessionLifecycleOptions = {}) {\n this.maxSessions = options.maxSessions ?? DEFAULT_MAX_SESSIONS;\n this.idleTimeoutMs = options.idleTimeoutMs ?? DEFAULT_IDLE_TIMEOUT_MS;\n this.now = options.now ?? Date.now;\n }\n\n get(address: OfficeAddress, sessionKey: string): ConversationRuntimeState | undefined {\n return this.states.get(runtimeSessionId(address, sessionKey));\n }\n\n set(state: ConversationRuntimeState): void {\n this.states.set(runtimeSessionId(state.address, state.sessionKey), state);\n }\n\n async acquire(\n address: OfficeAddress,\n sessionKey: string,\n expectedFile: () => string | null | undefined,\n materialize: (signal: AbortSignal) => Promise<ConversationRuntimeState>,\n ): Promise<{ state: ConversationRuntimeState; release: () => void }> {\n if (this.shuttingDown) throw new Error(\"Session lifecycle is shutting down\");\n return this.transition(address, sessionKey, async () => {\n const state = await this.materializeExclusive(address, sessionKey, expectedFile, materialize);\n const id = runtimeSessionId(address, sessionKey);\n this.leases.set(id, (this.leases.get(id) ?? 0) + 1);\n return { state, release: this.createLeaseRelease(id, address) };\n });\n }\n\n private reusableState(\n id: string,\n expectedFile: () => string | null | undefined,\n ): ConversationRuntimeState | undefined {\n const existing = this.states.get(id);\n if (!existing) return undefined;\n if (expectedFile() === existing.sessionFile) {\n existing.lastAccessedAt = this.now();\n return existing;\n }\n return this.isStateActive(id, existing) ? existing : undefined;\n }\n\n private async publishMaterialized(\n id: string,\n address: OfficeAddress,\n generation: string,\n state: ConversationRuntimeState,\n ): Promise<boolean> {\n if (!this.shuttingDown && generation === this.generation(address)) {\n this.states.set(id, state);\n return true;\n }\n await state.runner.dispose();\n if (this.shuttingDown) throw new Error(\"Session lifecycle is shutting down\");\n return false;\n }\n\n private async materializeExclusive(\n address: OfficeAddress,\n sessionKey: string,\n expectedFile: () => string | null | undefined,\n materialize: (signal: AbortSignal) => Promise<ConversationRuntimeState>,\n ): Promise<ConversationRuntimeState> {\n const id = runtimeSessionId(address, sessionKey);\n while (true) {\n if (this.shuttingDown) throw new Error(\"Session lifecycle is shutting down\");\n await this.waitForClose(address, sessionKey);\n const reusable = this.reusableState(id, expectedFile);\n if (reusable) return reusable;\n if (this.states.has(id)) await this.discardAndWait(address, sessionKey);\n\n const generation = this.generation(address);\n const state = await materialize(this.materializationAbort.signal);\n if (await this.publishMaterialized(id, address, generation, state)) return state;\n }\n }\n\n private createLeaseRelease(id: string, address: OfficeAddress): () => void {\n let released = false;\n return () => {\n if (released) return;\n released = true;\n this.releaseLease(id, address);\n };\n }\n\n private releaseLease(id: string, address: OfficeAddress): void {\n const count = this.leases.get(id) ?? 0;\n if (count <= 1) this.leases.delete(id);\n else this.leases.set(id, count - 1);\n this.applyDeferredClear(address);\n }\n\n settle(\n state: ConversationRuntimeState,\n work: () => Promise<void>,\n options: { markRunning?: boolean } = {},\n ): Promise<void> {\n const id = runtimeSessionId(state.address, state.sessionKey);\n this.leases.set(id, (this.leases.get(id) ?? 0) + 1);\n if (options.markRunning !== false) {\n state.running = true;\n state.stopRequested = false;\n state.startedAt = this.now();\n state.lastActivityAt = this.now();\n }\n\n let settlement!: Promise<void>;\n settlement = Promise.resolve()\n .then(work)\n .finally(() => this.finishSettlement(state, settlement, id));\n state.runSettlement = settlement;\n this.settlementSessions.set(settlement, id);\n return settlement;\n }\n\n private finishSettlement(\n state: ConversationRuntimeState,\n settlement: Promise<void>,\n id: string,\n ): void {\n this.settlementSessions.delete(settlement);\n if (state.runSettlement === settlement) state.runSettlement = undefined;\n state.running = false;\n state.startedAt = 0;\n state.lastAccessedAt = this.now();\n this.releaseLease(id, state.address);\n this.evictIdle();\n }\n\n settlementCount(): number {\n return this.settlementSessions.size;\n }\n\n async enqueue(\n address: OfficeAddress,\n sessionKey: string,\n run: () => Promise<void>,\n ): Promise<void> {\n const id = runtimeSessionId(address, sessionKey);\n const previous = this.queues.get(id) ?? Promise.resolve();\n const next = previous.catch(() => {}).then(run);\n this.queues.set(id, next);\n try {\n await next;\n } finally {\n if (this.queues.get(id) === next) this.queues.delete(id);\n }\n }\n\n async acquireConversationWork(address: OfficeAddress): Promise<() => void> {\n const barrier = this.getConversationBarrier(address);\n while (barrier.pendingMaintenance > 0) {\n await new Promise<void>((resolve) => barrier.workWaiters.push(resolve));\n }\n barrier.activeWork++;\n let released = false;\n return () => {\n if (released) return;\n released = true;\n barrier.activeWork--;\n if (barrier.activeWork === 0) releaseWaiters(barrier.activeWaiters);\n };\n }\n\n async runConversationMaintenance<T>(\n address: OfficeAddress,\n maintenance: () => Promise<T>,\n ): Promise<T> {\n const barrier = this.getConversationBarrier(address);\n barrier.pendingMaintenance++;\n const previousMaintenance = barrier.maintenanceTail;\n let finishMaintenance!: () => void;\n const maintenanceTurn = new Promise<void>((resolve) => (finishMaintenance = resolve));\n barrier.maintenanceTail = previousMaintenance.then(() => maintenanceTurn);\n\n await previousMaintenance;\n if (barrier.activeWork > 0) {\n await new Promise<void>((resolve) => barrier.activeWaiters.push(resolve));\n }\n try {\n return await maintenance();\n } finally {\n finishMaintenance();\n barrier.pendingMaintenance--;\n if (barrier.pendingMaintenance === 0) releaseWaiters(barrier.workWaiters);\n }\n }\n\n private getConversationBarrier(address: OfficeAddress): ConversationBarrier {\n const key = officeKey(address);\n const existing = this.conversationBarriers.get(key);\n if (existing) return existing;\n const barrier: ConversationBarrier = {\n activeWork: 0,\n pendingMaintenance: 0,\n maintenanceTail: Promise.resolve(),\n activeWaiters: [],\n workWaiters: [],\n };\n this.conversationBarriers.set(key, barrier);\n return barrier;\n }\n\n runningStates(): ConversationRuntimeState[] {\n return Array.from(this.states.values()).filter((state) => state.running);\n }\n\n offices(): OfficeAddress[] {\n const offices = new Map<string, OfficeAddress>();\n for (const state of this.states.values()) offices.set(officeKey(state.address), state.address);\n return Array.from(offices.values());\n }\n\n officesForConversationId(conversationId: string): OfficeAddress[] {\n return this.offices().filter((address) => address.conversationId === conversationId);\n }\n\n invalidateConversation(address: OfficeAddress): boolean {\n const key = officeKey(address);\n this.conversationGenerations.set(key, (this.conversationGenerations.get(key) ?? 0) + 1);\n return this.clearConversation(address);\n }\n\n invalidateAll(): { busy: OfficeAddress[] } {\n this.globalGeneration++;\n const busy: OfficeAddress[] = [];\n for (const address of this.offices()) {\n if (this.clearConversation(address)) continue;\n this.deferConversationClear(address);\n busy.push(address);\n }\n return { busy };\n }\n\n clearConversation(address: OfficeAddress): boolean {\n if (this.hasActiveWork(address)) return false;\n this.pendingConversationClears.delete(officeKey(address));\n this.discardConversation(address);\n return true;\n }\n\n deferConversationClear(address: OfficeAddress): void {\n this.pendingConversationClears.add(officeKey(address));\n }\n\n private applyDeferredClear(address: OfficeAddress): void {\n const key = officeKey(address);\n if (!this.pendingConversationClears.has(key) || this.hasActiveWork(address)) return;\n this.pendingConversationClears.delete(key);\n this.discardConversation(address);\n }\n\n private hasActiveWork(address: OfficeAddress): boolean {\n const key = officeKey(address);\n for (const state of this.states.values()) {\n const id = runtimeSessionId(state.address, state.sessionKey);\n if (officeKey(state.address) === key && this.isStateActive(id, state)) return true;\n }\n return false;\n }\n\n private isStateActive(id: string, state: ConversationRuntimeState): boolean {\n return (this.leases.get(id) ?? 0) > 0 || state.running || state.runSettlement !== undefined;\n }\n\n private discardConversation(address: OfficeAddress): void {\n const key = officeKey(address);\n for (const state of Array.from(this.states.values())) {\n if (officeKey(state.address) === key) this.discard(state.address, state.sessionKey);\n }\n }\n\n private generation(address: OfficeAddress): string {\n return `${this.globalGeneration}:${this.conversationGenerations.get(officeKey(address)) ?? 0}`;\n }\n\n async transition<T>(\n address: OfficeAddress,\n sessionKey: string,\n work: () => Promise<T>,\n ): Promise<T> {\n const id = runtimeSessionId(address, sessionKey);\n const previous = this.transitions.get(id) ?? Promise.resolve();\n let release!: () => void;\n const current = new Promise<void>((resolve) => (release = resolve));\n const tail = previous.then(() => current);\n this.transitions.set(id, tail);\n await previous;\n try {\n return await work();\n } finally {\n release();\n if (this.transitions.get(id) === tail) this.transitions.delete(id);\n }\n }\n\n async discardAndWait(address: OfficeAddress, sessionKey: string): Promise<void> {\n const id = runtimeSessionId(address, sessionKey);\n const state = this.states.get(id);\n if (!state) {\n await this.closing.get(id);\n return;\n }\n this.states.delete(id);\n const close = state.runner.dispose();\n this.trackClosing(id, close);\n await close;\n }\n\n async waitForClose(address: OfficeAddress, sessionKey: string): Promise<void> {\n await this.closing.get(runtimeSessionId(address, sessionKey));\n }\n\n async closeAll(): Promise<void> {\n const states = Array.from(this.states.values());\n this.states.clear();\n for (const state of states) {\n const id = runtimeSessionId(state.address, state.sessionKey);\n this.trackClosing(id, state.runner.dispose());\n }\n await Promise.all(this.closing.values());\n }\n\n private discard(address: OfficeAddress, sessionKey: string): void {\n const id = runtimeSessionId(address, sessionKey);\n const state = this.states.get(id);\n if (!state) return;\n this.states.delete(id);\n const close = state.runner.dispose();\n this.trackClosing(id, close);\n close.catch((err: unknown) => {\n log.logWarning(`Runner dispose failed: ${sessionKey}`, errorMessage(err));\n });\n }\n\n private trackClosing(id: string, close: Promise<void>): void {\n this.closing.set(id, close);\n const clear = () => {\n if (this.closing.get(id) === close) this.closing.delete(id);\n };\n void close.then(clear, clear);\n }\n\n evictIdle(): void {\n const now = this.now();\n for (const state of Array.from(this.states.values())) {\n const id = runtimeSessionId(state.address, state.sessionKey);\n if (!this.isStateActive(id, state) && now - state.lastAccessedAt > this.idleTimeoutMs) {\n this.discard(state.address, state.sessionKey);\n }\n }\n if (this.states.size <= this.maxSessions) return;\n\n const idle = Array.from(this.states.values())\n .filter(\n (state) => !this.isStateActive(runtimeSessionId(state.address, state.sessionKey), state),\n )\n .toSorted((left, right) => left.lastAccessedAt - right.lastAccessedAt);\n const toEvict = this.states.size - this.maxSessions;\n for (const state of idle.slice(0, toEvict)) this.discard(state.address, state.sessionKey);\n }\n\n async shutdown(timeoutMs: number): Promise<void> {\n if (this.shuttingDown) return;\n this.shuttingDown = true;\n const materializationDeadline = Date.now() + MATERIALIZATION_ABORT_GRACE_MS;\n this.materializationAbort.abort(new Error(\"Session lifecycle is shutting down\"));\n const timeout = Date.now() + timeoutMs;\n await this.waitForActiveWork(timeout, 500);\n\n if (this.activeWorkCount() > 0) {\n log.logWarning(\n `Aborting ${this.activeWorkCount()} runs after shutdown timeout`,\n `${timeoutMs}ms`,\n );\n for (const state of this.runningStates()) {\n state.shutdownAborted = true;\n state.runner.abort();\n }\n await this.waitForActiveWork(Date.now() + 5_000, 100);\n if (this.activeWorkCount() > 0) {\n throw new Error(\n `Shutdown could not settle ${this.activeWorkCount()} aborted runs within 5000ms`,\n );\n }\n }\n\n await this.waitForMaterializations(materializationDeadline);\n await this.closeAll();\n }\n\n private async waitForMaterializations(deadline: number): Promise<void> {\n if (this.transitions.size === 0) return;\n let timeout: NodeJS.Timeout | undefined;\n const settled = await Promise.race([\n Promise.all(this.transitions.values()).then(() => true),\n new Promise<false>((resolve) => {\n timeout = setTimeout(() => resolve(false), Math.max(0, deadline - Date.now()));\n }),\n ]);\n if (timeout) clearTimeout(timeout);\n if (!settled) {\n throw new Error(\n `Shutdown could not settle ${this.transitions.size} runner materializations within ${MATERIALIZATION_ABORT_GRACE_MS}ms`,\n );\n }\n }\n\n private async waitForActiveWork(deadline: number, intervalMs: number): Promise<void> {\n while (this.activeWorkCount() > 0 && Date.now() < deadline) {\n await new Promise((resolve) => setTimeout(resolve, intervalMs));\n }\n }\n\n private activeWorkCount(): number {\n const sessionIds = new Set(this.leases.keys());\n for (const sessionId of this.settlementSessions.values()) {\n sessionIds.add(sessionId);\n }\n return sessionIds.size;\n }\n}\n"]}
@@ -1,12 +1,14 @@
1
1
  import type { McpServerConfig } from "../harness/types.js";
2
2
  import type { EventScheduleSink } from "../events/index.js";
3
- import type { PiAgentWrapper, PlatformTrustModel } from "../types.js";
3
+ import type { CreateRunnerOptions, PiAgentWrapper, PlatformTrustModel } from "../types.js";
4
4
  import type { MessagingBot, ConversationContext, ConversationEvent, MessagingEventHandler, OfficeAddress } from "../types.js";
5
- import type { AdminTokenStoreLike, CommandHandler, CommandServices, LinkTokenStoreLike, SessionViewTokenStoreLike } from "../adapters/commands/types.js";
6
- import type { MikanModels } from "../harness/index.js";
7
- import type { RunMemoryCapture } from "../memory-capture/index.js";
5
+ import type { AdminTokenStoreLike, CommandHandler, CommandServices, LinkTokenStoreLike } from "../adapters/commands/types.js";
6
+ import type { SessionViewTokenStoreLike } from "../types.js";
7
+ import type { MikanModels } from "../harness/models.js";
8
+ import type { RunMemoryCapture } from "../memory-capture/types.js";
8
9
  import type { PlatformToolPackFactory } from "../harness/tools/types.js";
9
- import type { VaultManager } from "../vault/index.js";
10
+ import type { VaultManager } from "../vault/types.js";
11
+ export type RunnerFactory = (options: CreateRunnerOptions) => Promise<PiAgentWrapper>;
10
12
  export interface SessionLifecycleOptions {
11
13
  maxSessions?: number;
12
14
  idleTimeoutMs?: number;
@@ -48,6 +50,7 @@ export interface ConversationRuntimeOptions extends Omit<CommandServices, "runti
48
50
  eventScheduler?: () => EventScheduleSink | undefined;
49
51
  platformToolPackFactories?: readonly PlatformToolPackFactory[];
50
52
  memoryCapture?: (models: MikanModels) => RunMemoryCapture;
53
+ runnerFactory?: RunnerFactory;
51
54
  }
52
55
  export interface ConversationRuntime extends MessagingEventHandler {
53
56
  runSession(options: RunSessionOptions): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/runtime/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/runtime/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/runtime/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { McpServerConfig } from \"../harness/types.js\";\nimport type { EventScheduleSink } from \"../events/index.js\";\nimport type { PiAgentWrapper, PlatformTrustModel } from \"../types.js\";\nimport type {\n MessagingBot,\n ConversationContext,\n ConversationEvent,\n MessagingEventHandler,\n OfficeAddress,\n} from \"../types.js\";\nimport type {\n AdminTokenStoreLike,\n CommandHandler,\n CommandServices,\n LinkTokenStoreLike,\n SessionViewTokenStoreLike,\n} from \"../adapters/commands/types.js\";\nimport type { MikanModels } from \"../harness/index.js\";\nimport type { RunMemoryCapture } from \"../memory-capture/index.js\";\nimport type { PlatformToolPackFactory } from \"../harness/tools/types.js\";\nimport type { VaultManager } from \"../vault/index.js\";\n\nexport interface SessionLifecycleOptions {\n maxSessions?: number;\n idleTimeoutMs?: number;\n now?: () => number;\n}\n\nexport interface ConversationRuntimeState {\n address: OfficeAddress;\n sessionKey: string;\n running: boolean;\n runSettlement?: Promise<void>;\n runner: PiAgentWrapper;\n stopRequested: boolean;\n shutdownAborted?: boolean;\n stopNoticeOwned?: boolean;\n lastAccessedAt: number;\n sessionFile: string;\n startedAt: number;\n lastActivityAt?: number;\n}\n\nexport interface RunSessionOptions {\n event: ConversationEvent;\n bot: MessagingBot;\n context: ConversationContext;\n}\n\nexport interface SessionStateOptions {\n address: OfficeAddress;\n sessionKey: string;\n trustModel: PlatformTrustModel;\n platformWorkspaceId?: string;\n}\n\nexport interface ConversationRuntimeOptions extends Omit<\n CommandServices,\n \"runtime\" | \"vaultManager\" | \"linkTokenStore\" | \"sessionViewTokenStore\" | \"adminTokenStore\"\n> {\n vaultManager?: VaultManager;\n linkTokenStore?: LinkTokenStoreLike;\n sessionViewTokenStore?: SessionViewTokenStoreLike;\n adminTokenStore?: AdminTokenStoreLike;\n commandHandlers?: readonly CommandHandler[];\n models?: MikanModels;\n openConnector?: McpServerConfig;\n eventScheduler?: () => EventScheduleSink | undefined;\n platformToolPackFactories?: readonly PlatformToolPackFactory[];\n memoryCapture?: (models: MikanModels) => RunMemoryCapture;\n}\n\nexport interface ConversationRuntime extends MessagingEventHandler {\n runSession(options: RunSessionOptions): Promise<void>;\n switchConversationModel(address: OfficeAddress, provider: string, model: string): boolean;\n refreshConversationEnvironment(address: OfficeAddress): boolean;\n refreshAllConversations(): { busy: OfficeAddress[] };\n shutdown(timeoutMs?: number): Promise<void>;\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/runtime/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { McpServerConfig } from \"../harness/types.js\";\nimport type { EventScheduleSink } from \"../events/index.js\";\nimport type { CreateRunnerOptions, PiAgentWrapper, PlatformTrustModel } from \"../types.js\";\nimport type {\n MessagingBot,\n ConversationContext,\n ConversationEvent,\n MessagingEventHandler,\n OfficeAddress,\n} from \"../types.js\";\nimport type {\n AdminTokenStoreLike,\n CommandHandler,\n CommandServices,\n LinkTokenStoreLike,\n} from \"../adapters/commands/types.js\";\nimport type { SessionViewTokenStoreLike } from \"../types.js\";\nimport type { MikanModels } from \"../harness/models.js\";\nimport type { RunMemoryCapture } from \"../memory-capture/types.js\";\nimport type { PlatformToolPackFactory } from \"../harness/tools/types.js\";\nimport type { VaultManager } from \"../vault/types.js\";\n\nexport type RunnerFactory = (options: CreateRunnerOptions) => Promise<PiAgentWrapper>;\n\nexport interface SessionLifecycleOptions {\n maxSessions?: number;\n idleTimeoutMs?: number;\n now?: () => number;\n}\n\nexport interface ConversationRuntimeState {\n address: OfficeAddress;\n sessionKey: string;\n running: boolean;\n runSettlement?: Promise<void>;\n runner: PiAgentWrapper;\n stopRequested: boolean;\n shutdownAborted?: boolean;\n stopNoticeOwned?: boolean;\n lastAccessedAt: number;\n sessionFile: string;\n startedAt: number;\n lastActivityAt?: number;\n}\n\nexport interface RunSessionOptions {\n event: ConversationEvent;\n bot: MessagingBot;\n context: ConversationContext;\n}\n\nexport interface SessionStateOptions {\n address: OfficeAddress;\n sessionKey: string;\n trustModel: PlatformTrustModel;\n platformWorkspaceId?: string;\n}\n\nexport interface ConversationRuntimeOptions extends Omit<\n CommandServices,\n \"runtime\" | \"vaultManager\" | \"linkTokenStore\" | \"sessionViewTokenStore\" | \"adminTokenStore\"\n> {\n vaultManager?: VaultManager;\n linkTokenStore?: LinkTokenStoreLike;\n sessionViewTokenStore?: SessionViewTokenStoreLike;\n adminTokenStore?: AdminTokenStoreLike;\n commandHandlers?: readonly CommandHandler[];\n models?: MikanModels;\n openConnector?: McpServerConfig;\n eventScheduler?: () => EventScheduleSink | undefined;\n platformToolPackFactories?: readonly PlatformToolPackFactory[];\n memoryCapture?: (models: MikanModels) => RunMemoryCapture;\n runnerFactory?: RunnerFactory;\n}\n\nexport interface ConversationRuntime extends MessagingEventHandler {\n runSession(options: RunSessionOptions): Promise<void>;\n switchConversationModel(address: OfficeAddress, provider: string, model: string): boolean;\n refreshConversationEnvironment(address: OfficeAddress): boolean;\n refreshAllConversations(): { busy: OfficeAddress[] };\n shutdown(timeoutMs?: number): Promise<void>;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"cloudflare.d.ts","sourceRoot":"","sources":["../../src/sandbox/cloudflare.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,uBAAuB,EACvB,WAAW,EACX,UAAU,EACV,QAAQ,EACR,kBAAkB,EAClB,cAAc,EACf,MAAM,YAAY,CAAC;AAmEpB,qBAAa,yBAA0B,YAAW,QAAQ;IAItD,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;IAJvB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAE7B,YACmB,SAAS,EAAE,MAAM,EACjB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,YAAA,EAC7C,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EAGnC;IAEK,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAkBtE;YAEa,QAAQ;IAwCtB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAE7D;IAED,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAEnE;IAED,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAE7E;IAED,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE1C;IAED,cAAc,CAAC,iBAAiB,EAAE,MAAM,GAAG,kBAAkB,CAK5D;IAED,gBAAgB,IAAI,uBAAuB,CAE1C;CACF;AAED,eAAO,MAAM,wBAAwB,EAAE,cAAc,CAAC,uBAAuB,CAQ5E,CAAC"}
1
+ {"version":3,"file":"cloudflare.d.ts","sourceRoot":"","sources":["../../src/sandbox/cloudflare.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,uBAAuB,EACvB,WAAW,EACX,UAAU,EACV,QAAQ,EACR,kBAAkB,EAClB,cAAc,EACf,MAAM,YAAY,CAAC;AAoEpB,qBAAa,yBAA0B,YAAW,QAAQ;IAItD,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;IAJvB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAE7B,YACmB,SAAS,EAAE,MAAM,EACjB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,YAAA,EAC7C,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EAGnC;IAEK,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAkBtE;YAEa,QAAQ;IAwCtB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAE7D;IAED,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAEnE;IAED,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAE7E;IAED,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE1C;IAED,cAAc,CAAC,iBAAiB,EAAE,MAAM,GAAG,kBAAkB,CAK5D;IAED,gBAAgB,IAAI,uBAAuB,CAE1C;CACF;AAED,eAAO,MAAM,wBAAwB,EAAE,cAAc,CAAC,uBAAuB,CAQ5E,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import { SandboxError, execReadFile, execReadFileBase64, execWriteFile, linkAbortSignal, } from "./utils.js";
2
2
  import { readEnv } from "../env-manifest.js";
3
3
  import { GUEST_WORKSPACE_ROOT } from "./layout.js";
4
+ import { errorMessage } from "../unknown-values.js";
4
5
  const DEFAULT_CLOUDFLARE_CWD = GUEST_WORKSPACE_ROOT;
5
6
  function parseCloudflareSandboxArg(value) {
6
7
  if (!value.startsWith("cloudflare:")) {
@@ -26,7 +27,7 @@ async function validateCloudflareSandbox(_config) {
26
27
  if (error instanceof SandboxError) {
27
28
  throw error;
28
29
  }
29
- const detail = error instanceof Error ? error.message : String(error);
30
+ const detail = errorMessage(error);
30
31
  throw new SandboxError(`Error: Cloudflare sandbox bridge is not reachable: ${detail}`);
31
32
  }
32
33
  console.log(` Cloudflare sandbox bridge enabled. Base URL: ${url.toString().replace(/\/$/, "")}`);
@@ -130,7 +131,7 @@ function resolveCloudflareSandboxUrl() {
130
131
  return new URL(raw);
131
132
  }
132
133
  catch (error) {
133
- const detail = error instanceof Error ? error.message : String(error);
134
+ const detail = errorMessage(error);
134
135
  throw new SandboxError(`Error: invalid CLOUDFLARE_SANDBOX_URL: ${detail}`);
135
136
  }
136
137
  }
@@ -1 +1 @@
1
- {"version":3,"file":"cloudflare.js","sourceRoot":"","sources":["../../src/sandbox/cloudflare.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n CloudflareSandboxConfig,\n ExecOptions,\n ExecResult,\n Executor,\n RuntimePathContext,\n SandboxAdapter,\n} from \"./types.js\";\nimport {\n SandboxError,\n execReadFile,\n execReadFileBase64,\n execWriteFile,\n linkAbortSignal,\n} from \"./utils.js\";\nimport { readEnv } from \"../env-manifest.js\";\nimport { GUEST_WORKSPACE_ROOT } from \"./layout.js\";\n\nconst DEFAULT_CLOUDFLARE_CWD = GUEST_WORKSPACE_ROOT;\n\ninterface CloudflareExecPayload {\n sandboxId: string;\n command: string;\n timeoutSeconds?: number;\n cwd?: string;\n env?: Record<string, string>;\n}\n\ninterface CloudflareExecResponse {\n stdout?: string;\n stderr?: string;\n code?: number;\n error?: string;\n}\n\nfunction parseCloudflareSandboxArg(value: string): CloudflareSandboxConfig | undefined {\n if (!value.startsWith(\"cloudflare:\")) {\n return undefined;\n }\n\n const sandboxId = value.slice(\"cloudflare:\".length).trim();\n if (!sandboxId) {\n throw new SandboxError(\n \"Error: cloudflare sandbox requires sandbox id (e.g., cloudflare:slack-u123)\",\n );\n }\n\n return { type: \"cloudflare\", sandboxId };\n}\n\nasync function validateCloudflareSandbox(_config: CloudflareSandboxConfig): Promise<void> {\n const url = resolveCloudflareSandboxUrl();\n try {\n const response = await fetch(new URL(\"/health\", url), {\n headers: buildCloudflareHeaders(),\n });\n if (!response.ok) {\n throw new SandboxError(\n `Error: Cloudflare sandbox bridge health check failed with HTTP ${response.status}`,\n );\n }\n } catch (error) {\n if (error instanceof SandboxError) {\n throw error;\n }\n const detail = error instanceof Error ? error.message : String(error);\n throw new SandboxError(`Error: Cloudflare sandbox bridge is not reachable: ${detail}`);\n }\n\n console.log(\n ` Cloudflare sandbox bridge enabled. Base URL: ${url.toString().replace(/\\/$/, \"\")}`,\n );\n}\n\nexport class CloudflareSandboxExecutor implements Executor {\n private readonly cwd: string;\n\n constructor(\n private readonly sandboxId: string,\n private readonly env?: Record<string, string>,\n _ensureReady?: () => Promise<void>,\n ) {\n this.cwd = DEFAULT_CLOUDFLARE_CWD;\n }\n\n async exec(command: string, options?: ExecOptions): Promise<ExecResult> {\n const controller = new AbortController();\n const timeoutHandle =\n options?.timeout && options.timeout > 0\n ? setTimeout(() => controller.abort(), options.timeout * 1000)\n : undefined;\n const unlinkSignal = linkAbortSignal(options?.signal, () => controller.abort());\n\n try {\n return await this.postExec(command, options, controller.signal);\n } catch (error) {\n if (!controller.signal.aborted) throw error;\n if (options?.signal?.aborted) throw new Error(\"Command aborted\", { cause: error });\n throw new Error(`Command timed out after ${options?.timeout} seconds`, { cause: error });\n } finally {\n if (timeoutHandle) clearTimeout(timeoutHandle);\n unlinkSignal();\n }\n }\n\n private async postExec(\n command: string,\n options: ExecOptions | undefined,\n signal: AbortSignal,\n ): Promise<ExecResult> {\n const payload: CloudflareExecPayload = {\n sandboxId: this.sandboxId,\n command,\n cwd: options?.cwd ?? this.cwd,\n };\n if (options?.timeout) payload.timeoutSeconds = options.timeout;\n if (this.env && Object.keys(this.env).length > 0) payload.env = this.env;\n\n const response = await fetch(new URL(\"/exec\", resolveCloudflareSandboxUrl()), {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n ...buildCloudflareHeaders(),\n },\n body: JSON.stringify(payload),\n signal,\n });\n\n const raw = (await response.text()).trim();\n const parsed = raw ? (JSON.parse(raw) as CloudflareExecResponse) : {};\n if (!response.ok) {\n throw new Error(\n parsed.error ||\n parsed.stderr ||\n `Cloudflare sandbox bridge returned HTTP ${response.status}`,\n );\n }\n\n return {\n stdout: parsed.stdout || \"\",\n stderr: parsed.stderr || \"\",\n code: parsed.code ?? 0,\n };\n }\n\n readFile(path: string, options?: ExecOptions): Promise<string> {\n return execReadFile(this, path, options);\n }\n\n readFileBase64(path: string, options?: ExecOptions): Promise<string> {\n return execReadFileBase64(this, path, options);\n }\n\n writeFile(path: string, content: string, options?: ExecOptions): Promise<void> {\n return execWriteFile(this, path, content, options);\n }\n\n getWorkspacePath(_hostPath: string): string {\n return this.cwd;\n }\n\n getPathContext(hostWorkspaceRoot: string): RuntimePathContext {\n return {\n hostWorkspaceRoot,\n runtimeWorkspaceRoot: this.cwd,\n };\n }\n\n getSandboxConfig(): CloudflareSandboxConfig {\n return { type: \"cloudflare\", sandboxId: this.sandboxId };\n }\n}\n\nexport const cloudflareSandboxAdapter: SandboxAdapter<CloudflareSandboxConfig> = {\n type: \"cloudflare\",\n credentials: { env: true, fileMounts: false },\n workspace: { managedProjection: false },\n parse: parseCloudflareSandboxArg,\n validate: validateCloudflareSandbox,\n createExecutor: (config, env, ensureReady) =>\n new CloudflareSandboxExecutor(config.sandboxId, env, ensureReady),\n};\n\nfunction resolveCloudflareSandboxUrl(): URL {\n const raw = readEnv(\"CLOUDFLARE_SANDBOX_URL\");\n if (!raw) {\n throw new SandboxError(\n \"Error: CLOUDFLARE_SANDBOX_URL or MIKAN_CLOUDFLARE_SANDBOX_URL is required for cloudflare sandbox mode\",\n );\n }\n\n try {\n return new URL(raw);\n } catch (error) {\n const detail = error instanceof Error ? error.message : String(error);\n throw new SandboxError(`Error: invalid CLOUDFLARE_SANDBOX_URL: ${detail}`);\n }\n}\n\nfunction buildCloudflareHeaders(): Record<string, string> {\n const token = readEnv(\"CLOUDFLARE_SANDBOX_TOKEN\");\n return token ? { authorization: `Bearer ${token}` } : {};\n}\n"]}
1
+ {"version":3,"file":"cloudflare.js","sourceRoot":"","sources":["../../src/sandbox/cloudflare.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n CloudflareSandboxConfig,\n ExecOptions,\n ExecResult,\n Executor,\n RuntimePathContext,\n SandboxAdapter,\n} from \"./types.js\";\nimport {\n SandboxError,\n execReadFile,\n execReadFileBase64,\n execWriteFile,\n linkAbortSignal,\n} from \"./utils.js\";\nimport { readEnv } from \"../env-manifest.js\";\nimport { GUEST_WORKSPACE_ROOT } from \"./layout.js\";\nimport { errorMessage } from \"../unknown-values.js\";\n\nconst DEFAULT_CLOUDFLARE_CWD = GUEST_WORKSPACE_ROOT;\n\ninterface CloudflareExecPayload {\n sandboxId: string;\n command: string;\n timeoutSeconds?: number;\n cwd?: string;\n env?: Record<string, string>;\n}\n\ninterface CloudflareExecResponse {\n stdout?: string;\n stderr?: string;\n code?: number;\n error?: string;\n}\n\nfunction parseCloudflareSandboxArg(value: string): CloudflareSandboxConfig | undefined {\n if (!value.startsWith(\"cloudflare:\")) {\n return undefined;\n }\n\n const sandboxId = value.slice(\"cloudflare:\".length).trim();\n if (!sandboxId) {\n throw new SandboxError(\n \"Error: cloudflare sandbox requires sandbox id (e.g., cloudflare:slack-u123)\",\n );\n }\n\n return { type: \"cloudflare\", sandboxId };\n}\n\nasync function validateCloudflareSandbox(_config: CloudflareSandboxConfig): Promise<void> {\n const url = resolveCloudflareSandboxUrl();\n try {\n const response = await fetch(new URL(\"/health\", url), {\n headers: buildCloudflareHeaders(),\n });\n if (!response.ok) {\n throw new SandboxError(\n `Error: Cloudflare sandbox bridge health check failed with HTTP ${response.status}`,\n );\n }\n } catch (error) {\n if (error instanceof SandboxError) {\n throw error;\n }\n const detail = errorMessage(error);\n throw new SandboxError(`Error: Cloudflare sandbox bridge is not reachable: ${detail}`);\n }\n\n console.log(\n ` Cloudflare sandbox bridge enabled. Base URL: ${url.toString().replace(/\\/$/, \"\")}`,\n );\n}\n\nexport class CloudflareSandboxExecutor implements Executor {\n private readonly cwd: string;\n\n constructor(\n private readonly sandboxId: string,\n private readonly env?: Record<string, string>,\n _ensureReady?: () => Promise<void>,\n ) {\n this.cwd = DEFAULT_CLOUDFLARE_CWD;\n }\n\n async exec(command: string, options?: ExecOptions): Promise<ExecResult> {\n const controller = new AbortController();\n const timeoutHandle =\n options?.timeout && options.timeout > 0\n ? setTimeout(() => controller.abort(), options.timeout * 1000)\n : undefined;\n const unlinkSignal = linkAbortSignal(options?.signal, () => controller.abort());\n\n try {\n return await this.postExec(command, options, controller.signal);\n } catch (error) {\n if (!controller.signal.aborted) throw error;\n if (options?.signal?.aborted) throw new Error(\"Command aborted\", { cause: error });\n throw new Error(`Command timed out after ${options?.timeout} seconds`, { cause: error });\n } finally {\n if (timeoutHandle) clearTimeout(timeoutHandle);\n unlinkSignal();\n }\n }\n\n private async postExec(\n command: string,\n options: ExecOptions | undefined,\n signal: AbortSignal,\n ): Promise<ExecResult> {\n const payload: CloudflareExecPayload = {\n sandboxId: this.sandboxId,\n command,\n cwd: options?.cwd ?? this.cwd,\n };\n if (options?.timeout) payload.timeoutSeconds = options.timeout;\n if (this.env && Object.keys(this.env).length > 0) payload.env = this.env;\n\n const response = await fetch(new URL(\"/exec\", resolveCloudflareSandboxUrl()), {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n ...buildCloudflareHeaders(),\n },\n body: JSON.stringify(payload),\n signal,\n });\n\n const raw = (await response.text()).trim();\n const parsed = raw ? (JSON.parse(raw) as CloudflareExecResponse) : {};\n if (!response.ok) {\n throw new Error(\n parsed.error ||\n parsed.stderr ||\n `Cloudflare sandbox bridge returned HTTP ${response.status}`,\n );\n }\n\n return {\n stdout: parsed.stdout || \"\",\n stderr: parsed.stderr || \"\",\n code: parsed.code ?? 0,\n };\n }\n\n readFile(path: string, options?: ExecOptions): Promise<string> {\n return execReadFile(this, path, options);\n }\n\n readFileBase64(path: string, options?: ExecOptions): Promise<string> {\n return execReadFileBase64(this, path, options);\n }\n\n writeFile(path: string, content: string, options?: ExecOptions): Promise<void> {\n return execWriteFile(this, path, content, options);\n }\n\n getWorkspacePath(_hostPath: string): string {\n return this.cwd;\n }\n\n getPathContext(hostWorkspaceRoot: string): RuntimePathContext {\n return {\n hostWorkspaceRoot,\n runtimeWorkspaceRoot: this.cwd,\n };\n }\n\n getSandboxConfig(): CloudflareSandboxConfig {\n return { type: \"cloudflare\", sandboxId: this.sandboxId };\n }\n}\n\nexport const cloudflareSandboxAdapter: SandboxAdapter<CloudflareSandboxConfig> = {\n type: \"cloudflare\",\n credentials: { env: true, fileMounts: false },\n workspace: { managedProjection: false },\n parse: parseCloudflareSandboxArg,\n validate: validateCloudflareSandbox,\n createExecutor: (config, env, ensureReady) =>\n new CloudflareSandboxExecutor(config.sandboxId, env, ensureReady),\n};\n\nfunction resolveCloudflareSandboxUrl(): URL {\n const raw = readEnv(\"CLOUDFLARE_SANDBOX_URL\");\n if (!raw) {\n throw new SandboxError(\n \"Error: CLOUDFLARE_SANDBOX_URL or MIKAN_CLOUDFLARE_SANDBOX_URL is required for cloudflare sandbox mode\",\n );\n }\n\n try {\n return new URL(raw);\n } catch (error) {\n const detail = errorMessage(error);\n throw new SandboxError(`Error: invalid CLOUDFLARE_SANDBOX_URL: ${detail}`);\n }\n}\n\nfunction buildCloudflareHeaders(): Record<string, string> {\n const token = readEnv(\"CLOUDFLARE_SANDBOX_TOKEN\");\n return token ? { authorization: `Bearer ${token}` } : {};\n}\n"]}