@geminixiang/mikan 1.0.0-beta.7 → 1.0.0-beta.71

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 (856) hide show
  1. package/CHANGELOG.md +1052 -0
  2. package/README.md +98 -38
  3. package/dist/adapters/commands/admin.d.ts.map +1 -0
  4. package/dist/{commands → adapters/commands}/admin.js +11 -8
  5. package/dist/adapters/commands/admin.js.map +1 -0
  6. package/dist/{commands → adapters/commands}/auto-reply.d.ts +0 -3
  7. package/dist/adapters/commands/auto-reply.d.ts.map +1 -0
  8. package/dist/adapters/commands/auto-reply.js +47 -0
  9. package/dist/adapters/commands/auto-reply.js.map +1 -0
  10. package/dist/adapters/commands/login.d.ts +6 -0
  11. package/dist/adapters/commands/login.d.ts.map +1 -0
  12. package/dist/adapters/commands/login.js +166 -0
  13. package/dist/adapters/commands/login.js.map +1 -0
  14. package/dist/adapters/commands/manifest.d.ts +37 -0
  15. package/dist/adapters/commands/manifest.d.ts.map +1 -0
  16. package/dist/adapters/commands/manifest.js +155 -0
  17. package/dist/adapters/commands/manifest.js.map +1 -0
  18. package/dist/adapters/commands/model.d.ts +15 -0
  19. package/dist/adapters/commands/model.d.ts.map +1 -0
  20. package/dist/adapters/commands/model.js +153 -0
  21. package/dist/adapters/commands/model.js.map +1 -0
  22. package/dist/adapters/commands/new.d.ts.map +1 -0
  23. package/dist/adapters/commands/new.js +41 -0
  24. package/dist/adapters/commands/new.js.map +1 -0
  25. package/dist/adapters/commands/registry.d.ts +5 -0
  26. package/dist/adapters/commands/registry.d.ts.map +1 -0
  27. package/dist/adapters/commands/registry.js +43 -0
  28. package/dist/adapters/commands/registry.js.map +1 -0
  29. package/dist/adapters/commands/sandbox.d.ts.map +1 -0
  30. package/dist/adapters/commands/sandbox.js +125 -0
  31. package/dist/adapters/commands/sandbox.js.map +1 -0
  32. package/dist/adapters/commands/session-view.d.ts.map +1 -0
  33. package/dist/{commands → adapters/commands}/session-view.js +23 -16
  34. package/dist/adapters/commands/session-view.js.map +1 -0
  35. package/dist/adapters/commands/types.d.ts +145 -0
  36. package/dist/adapters/commands/types.d.ts.map +1 -0
  37. package/dist/adapters/commands/types.js.map +1 -0
  38. package/dist/adapters/commands/utils.d.ts +14 -0
  39. package/dist/adapters/commands/utils.d.ts.map +1 -0
  40. package/dist/{commands → adapters/commands}/utils.js +18 -1
  41. package/dist/adapters/commands/utils.js.map +1 -0
  42. package/dist/adapters/discord/bot.d.ts +11 -8
  43. package/dist/adapters/discord/bot.d.ts.map +1 -1
  44. package/dist/adapters/discord/bot.js +223 -256
  45. package/dist/adapters/discord/bot.js.map +1 -1
  46. package/dist/adapters/discord/components.d.ts +28 -0
  47. package/dist/adapters/discord/components.d.ts.map +1 -0
  48. package/dist/adapters/discord/components.js +32 -0
  49. package/dist/adapters/discord/components.js.map +1 -0
  50. package/dist/adapters/discord/context.d.ts +2 -6
  51. package/dist/adapters/discord/context.d.ts.map +1 -1
  52. package/dist/adapters/discord/context.js +64 -218
  53. package/dist/adapters/discord/context.js.map +1 -1
  54. package/dist/adapters/discord/format.d.ts +3 -0
  55. package/dist/adapters/discord/format.d.ts.map +1 -0
  56. package/dist/adapters/discord/format.js +84 -0
  57. package/dist/adapters/discord/format.js.map +1 -0
  58. package/dist/adapters/discord/types.d.ts +8 -1
  59. package/dist/adapters/discord/types.d.ts.map +1 -1
  60. package/dist/adapters/discord/types.js.map +1 -1
  61. package/dist/adapters/github/bot.d.ts +102 -0
  62. package/dist/adapters/github/bot.d.ts.map +1 -0
  63. package/dist/adapters/github/bot.js +720 -0
  64. package/dist/adapters/github/bot.js.map +1 -0
  65. package/dist/adapters/github/client.d.ts +122 -0
  66. package/dist/adapters/github/client.d.ts.map +1 -0
  67. package/dist/adapters/github/client.js +301 -0
  68. package/dist/adapters/github/client.js.map +1 -0
  69. package/dist/adapters/github/context.d.ts +5 -0
  70. package/dist/adapters/github/context.d.ts.map +1 -0
  71. package/dist/adapters/github/context.js +101 -0
  72. package/dist/adapters/github/context.js.map +1 -0
  73. package/dist/adapters/github/github-ops.d.ts +78 -0
  74. package/dist/adapters/github/github-ops.d.ts.map +1 -0
  75. package/dist/adapters/github/github-ops.js +337 -0
  76. package/dist/adapters/github/github-ops.js.map +1 -0
  77. package/dist/adapters/github/ids.d.ts +34 -0
  78. package/dist/adapters/github/ids.d.ts.map +1 -0
  79. package/dist/adapters/github/ids.js +57 -0
  80. package/dist/adapters/github/ids.js.map +1 -0
  81. package/dist/adapters/github/repo.d.ts +33 -0
  82. package/dist/adapters/github/repo.d.ts.map +1 -0
  83. package/dist/adapters/github/repo.js +141 -0
  84. package/dist/adapters/github/repo.js.map +1 -0
  85. package/dist/adapters/github/tool-pack.d.ts +14 -0
  86. package/dist/adapters/github/tool-pack.d.ts.map +1 -0
  87. package/dist/adapters/github/tool-pack.js +55 -0
  88. package/dist/adapters/github/tool-pack.js.map +1 -0
  89. package/dist/adapters/github/tools/checks.d.ts +18 -0
  90. package/dist/adapters/github/tools/checks.d.ts.map +1 -0
  91. package/dist/adapters/github/tools/checks.js +86 -0
  92. package/dist/adapters/github/tools/checks.js.map +1 -0
  93. package/dist/adapters/github/tools/issue.d.ts +21 -0
  94. package/dist/adapters/github/tools/issue.d.ts.map +1 -0
  95. package/dist/adapters/github/tools/issue.js +48 -0
  96. package/dist/adapters/github/tools/issue.js.map +1 -0
  97. package/dist/adapters/github/tools/pr.d.ts +22 -0
  98. package/dist/adapters/github/tools/pr.d.ts.map +1 -0
  99. package/dist/adapters/github/tools/pr.js +48 -0
  100. package/dist/adapters/github/tools/pr.js.map +1 -0
  101. package/dist/adapters/github/tools/read.d.ts +21 -0
  102. package/dist/adapters/github/tools/read.d.ts.map +1 -0
  103. package/dist/adapters/github/tools/read.js +141 -0
  104. package/dist/adapters/github/tools/read.js.map +1 -0
  105. package/dist/adapters/github/tools/review-reply.d.ts +17 -0
  106. package/dist/adapters/github/tools/review-reply.d.ts.map +1 -0
  107. package/dist/adapters/github/tools/review-reply.js +38 -0
  108. package/dist/adapters/github/tools/review-reply.js.map +1 -0
  109. package/dist/adapters/github/tools/sync.d.ts +17 -0
  110. package/dist/adapters/github/tools/sync.d.ts.map +1 -0
  111. package/dist/adapters/github/tools/sync.js +34 -0
  112. package/dist/adapters/github/tools/sync.js.map +1 -0
  113. package/dist/adapters/github/types.d.ts +345 -0
  114. package/dist/adapters/github/types.d.ts.map +1 -0
  115. package/dist/adapters/github/types.js.map +1 -0
  116. package/dist/adapters/github/webhook.d.ts +20 -0
  117. package/dist/adapters/github/webhook.d.ts.map +1 -0
  118. package/dist/adapters/github/webhook.js +78 -0
  119. package/dist/adapters/github/webhook.js.map +1 -0
  120. package/dist/adapters/index.d.ts +12 -0
  121. package/dist/adapters/index.d.ts.map +1 -0
  122. package/dist/adapters/index.js +19 -0
  123. package/dist/adapters/index.js.map +1 -0
  124. package/dist/adapters/intake.d.ts +17 -6
  125. package/dist/adapters/intake.d.ts.map +1 -1
  126. package/dist/adapters/intake.js +96 -27
  127. package/dist/adapters/intake.js.map +1 -1
  128. package/dist/adapters/markdown-tables.d.ts +19 -0
  129. package/dist/adapters/markdown-tables.d.ts.map +1 -0
  130. package/dist/adapters/markdown-tables.js +152 -0
  131. package/dist/adapters/markdown-tables.js.map +1 -0
  132. package/dist/{platform-messages.d.ts → adapters/messages.d.ts} +3 -2
  133. package/dist/adapters/messages.d.ts.map +1 -0
  134. package/dist/{platform-messages.js → adapters/messages.js} +4 -1
  135. package/dist/adapters/messages.js.map +1 -0
  136. package/dist/adapters/progressive-renderer.d.ts +7 -0
  137. package/dist/adapters/progressive-renderer.d.ts.map +1 -0
  138. package/dist/adapters/progressive-renderer.js +443 -0
  139. package/dist/adapters/progressive-renderer.js.map +1 -0
  140. package/dist/adapters/shared.d.ts +37 -11
  141. package/dist/adapters/shared.d.ts.map +1 -1
  142. package/dist/adapters/shared.js +130 -24
  143. package/dist/adapters/shared.js.map +1 -1
  144. package/dist/adapters/slack/assistant.d.ts +73 -0
  145. package/dist/adapters/slack/assistant.d.ts.map +1 -0
  146. package/dist/adapters/slack/assistant.js +205 -0
  147. package/dist/adapters/slack/assistant.js.map +1 -0
  148. package/dist/adapters/slack/auto-reply-context.d.ts +21 -0
  149. package/dist/adapters/slack/auto-reply-context.d.ts.map +1 -0
  150. package/dist/adapters/slack/auto-reply-context.js +28 -0
  151. package/dist/adapters/slack/auto-reply-context.js.map +1 -0
  152. package/dist/adapters/slack/blocks.d.ts +14 -0
  153. package/dist/adapters/slack/blocks.d.ts.map +1 -1
  154. package/dist/adapters/slack/blocks.js +104 -148
  155. package/dist/adapters/slack/blocks.js.map +1 -1
  156. package/dist/adapters/slack/bot.d.ts +154 -21
  157. package/dist/adapters/slack/bot.d.ts.map +1 -1
  158. package/dist/adapters/slack/bot.js +1037 -484
  159. package/dist/adapters/slack/bot.js.map +1 -1
  160. package/dist/adapters/slack/context.d.ts +2 -6
  161. package/dist/adapters/slack/context.d.ts.map +1 -1
  162. package/dist/adapters/slack/context.js +11 -17
  163. package/dist/adapters/slack/context.js.map +1 -1
  164. package/dist/adapters/slack/jev-context.d.ts +30 -0
  165. package/dist/adapters/slack/jev-context.d.ts.map +1 -0
  166. package/dist/adapters/slack/jev-context.js +67 -0
  167. package/dist/adapters/slack/jev-context.js.map +1 -0
  168. package/dist/adapters/slack/markdown.d.ts +3 -0
  169. package/dist/adapters/slack/markdown.d.ts.map +1 -0
  170. package/dist/adapters/slack/markdown.js +48 -0
  171. package/dist/adapters/slack/markdown.js.map +1 -0
  172. package/dist/adapters/slack/persona.d.ts +15 -0
  173. package/dist/adapters/slack/persona.d.ts.map +1 -0
  174. package/dist/adapters/slack/persona.js +22 -0
  175. package/dist/adapters/slack/persona.js.map +1 -0
  176. package/dist/adapters/slack/response-lifecycle.d.ts +1 -1
  177. package/dist/adapters/slack/response-lifecycle.d.ts.map +1 -1
  178. package/dist/adapters/slack/response-lifecycle.js +261 -345
  179. package/dist/adapters/slack/response-lifecycle.js.map +1 -1
  180. package/dist/adapters/slack/session.d.ts.map +1 -1
  181. package/dist/adapters/slack/session.js +7 -11
  182. package/dist/adapters/slack/session.js.map +1 -1
  183. package/dist/adapters/slack/stream-limits.d.ts +35 -0
  184. package/dist/adapters/slack/stream-limits.d.ts.map +1 -0
  185. package/dist/adapters/slack/stream-limits.js +56 -0
  186. package/dist/adapters/slack/stream-limits.js.map +1 -0
  187. package/dist/adapters/slack/task-intent.d.ts +32 -0
  188. package/dist/adapters/slack/task-intent.d.ts.map +1 -0
  189. package/dist/adapters/slack/task-intent.js +72 -0
  190. package/dist/adapters/slack/task-intent.js.map +1 -0
  191. package/dist/adapters/slack/task-status.d.ts +7 -0
  192. package/dist/adapters/slack/task-status.d.ts.map +1 -0
  193. package/dist/adapters/slack/task-status.js +107 -0
  194. package/dist/adapters/slack/task-status.js.map +1 -0
  195. package/dist/adapters/slack/tool-pack.d.ts +11 -0
  196. package/dist/adapters/slack/tool-pack.d.ts.map +1 -0
  197. package/dist/adapters/slack/tool-pack.js +45 -0
  198. package/dist/adapters/slack/tool-pack.js.map +1 -0
  199. package/dist/adapters/slack/tools/blockkit.d.ts +14 -0
  200. package/dist/adapters/slack/tools/blockkit.d.ts.map +1 -0
  201. package/dist/adapters/slack/tools/blockkit.js +106 -0
  202. package/dist/adapters/slack/tools/blockkit.js.map +1 -0
  203. package/dist/adapters/slack/types.d.ts +73 -2
  204. package/dist/adapters/slack/types.d.ts.map +1 -1
  205. package/dist/adapters/slack/types.js.map +1 -1
  206. package/dist/adapters/slack/update-diagnostics.d.ts +14 -0
  207. package/dist/adapters/slack/update-diagnostics.d.ts.map +1 -0
  208. package/dist/adapters/slack/update-diagnostics.js +134 -0
  209. package/dist/adapters/slack/update-diagnostics.js.map +1 -0
  210. package/dist/adapters/telegram/bot.d.ts +10 -9
  211. package/dist/adapters/telegram/bot.d.ts.map +1 -1
  212. package/dist/adapters/telegram/bot.js +133 -202
  213. package/dist/adapters/telegram/bot.js.map +1 -1
  214. package/dist/adapters/telegram/context.d.ts +2 -6
  215. package/dist/adapters/telegram/context.d.ts.map +1 -1
  216. package/dist/adapters/telegram/context.js +53 -190
  217. package/dist/adapters/telegram/context.js.map +1 -1
  218. package/dist/adapters/telegram/types.d.ts +1 -1
  219. package/dist/adapters/telegram/types.d.ts.map +1 -1
  220. package/dist/adapters/telegram/types.js.map +1 -1
  221. package/dist/adapters/types.d.ts +144 -13
  222. package/dist/adapters/types.d.ts.map +1 -1
  223. package/dist/adapters/types.js.map +1 -1
  224. package/dist/adapters/web/admin/portal.d.ts +44 -0
  225. package/dist/adapters/web/admin/portal.d.ts.map +1 -0
  226. package/dist/adapters/web/admin/portal.js +3207 -0
  227. package/dist/adapters/web/admin/portal.js.map +1 -0
  228. package/dist/{web → adapters/web}/admin/provider-models.d.ts +1 -1
  229. package/dist/adapters/web/admin/provider-models.d.ts.map +1 -0
  230. package/dist/{web → adapters/web}/admin/provider-models.js +1 -1
  231. package/dist/adapters/web/admin/provider-models.js.map +1 -0
  232. package/dist/adapters/web/admin/types.d.ts +53 -0
  233. package/dist/adapters/web/admin/types.d.ts.map +1 -0
  234. package/dist/adapters/web/admin/types.js.map +1 -0
  235. package/dist/adapters/web/login/oauth.d.ts +5 -0
  236. package/dist/adapters/web/login/oauth.d.ts.map +1 -0
  237. package/dist/{web → adapters/web}/login/oauth.js +50 -85
  238. package/dist/adapters/web/login/oauth.js.map +1 -0
  239. package/dist/{web → adapters/web}/login/portal.d.ts +9 -3
  240. package/dist/adapters/web/login/portal.d.ts.map +1 -0
  241. package/dist/{web → adapters/web}/login/portal.js +161 -119
  242. package/dist/adapters/web/login/portal.js.map +1 -0
  243. package/dist/{web → adapters/web}/login/types.d.ts +1 -12
  244. package/dist/adapters/web/login/types.d.ts.map +1 -0
  245. package/dist/adapters/web/login/types.js.map +1 -0
  246. package/dist/adapters/web/portal-shell.d.ts +22 -0
  247. package/dist/adapters/web/portal-shell.d.ts.map +1 -0
  248. package/dist/{portal-shell.js → adapters/web/portal-shell.js} +78 -2
  249. package/dist/adapters/web/portal-shell.js.map +1 -0
  250. package/dist/{web → adapters/web}/server.d.ts +14 -8
  251. package/dist/adapters/web/server.d.ts.map +1 -0
  252. package/dist/{web → adapters/web}/server.js +14 -7
  253. package/dist/adapters/web/server.js.map +1 -0
  254. package/dist/adapters/web/session-view/portal.d.ts +20 -0
  255. package/dist/adapters/web/session-view/portal.d.ts.map +1 -0
  256. package/dist/{web → adapters/web}/session-view/portal.js +633 -162
  257. package/dist/adapters/web/session-view/portal.js.map +1 -0
  258. package/dist/{web → adapters/web}/session-view/types.d.ts +11 -6
  259. package/dist/adapters/web/session-view/types.d.ts.map +1 -0
  260. package/dist/adapters/web/session-view/types.js.map +1 -0
  261. package/dist/adapters/web/token-store.d.ts.map +1 -0
  262. package/dist/{web → adapters/web}/token-store.js +1 -1
  263. package/dist/adapters/web/token-store.js.map +1 -0
  264. package/dist/adapters/web/types.d.ts.map +1 -0
  265. package/dist/adapters/web/types.js.map +1 -0
  266. package/dist/cli/arg-grammar.d.ts +11 -0
  267. package/dist/cli/arg-grammar.d.ts.map +1 -0
  268. package/dist/cli/arg-grammar.js +50 -0
  269. package/dist/cli/arg-grammar.js.map +1 -0
  270. package/dist/cli/boot.d.ts +5 -0
  271. package/dist/cli/boot.d.ts.map +1 -0
  272. package/dist/cli/boot.js +90 -0
  273. package/dist/cli/boot.js.map +1 -0
  274. package/dist/cli/download.d.ts.map +1 -0
  275. package/dist/cli/download.js +88 -0
  276. package/dist/cli/download.js.map +1 -0
  277. package/dist/cli/office.d.ts +2 -0
  278. package/dist/cli/office.d.ts.map +1 -0
  279. package/dist/cli/office.js +181 -0
  280. package/dist/cli/office.js.map +1 -0
  281. package/dist/cli/onboard.d.ts +10 -0
  282. package/dist/cli/onboard.d.ts.map +1 -0
  283. package/dist/cli/onboard.js +225 -0
  284. package/dist/cli/onboard.js.map +1 -0
  285. package/dist/cli/process-lifecycle.d.ts +19 -0
  286. package/dist/cli/process-lifecycle.d.ts.map +1 -0
  287. package/dist/cli/process-lifecycle.js +67 -0
  288. package/dist/cli/process-lifecycle.js.map +1 -0
  289. package/dist/cli/sessions.d.ts +2 -0
  290. package/dist/cli/sessions.d.ts.map +1 -0
  291. package/dist/cli/sessions.js +88 -0
  292. package/dist/cli/sessions.js.map +1 -0
  293. package/dist/cli/types.d.ts +25 -0
  294. package/dist/cli/types.d.ts.map +1 -0
  295. package/dist/cli/types.js.map +1 -0
  296. package/dist/dream/index.d.ts +20 -0
  297. package/dist/dream/index.d.ts.map +1 -0
  298. package/dist/dream/index.js +264 -0
  299. package/dist/dream/index.js.map +1 -0
  300. package/dist/dream/types.d.ts +30 -0
  301. package/dist/dream/types.d.ts.map +1 -0
  302. package/dist/dream/types.js +2 -0
  303. package/dist/dream/types.js.map +1 -0
  304. package/dist/env-manifest.d.ts +38 -0
  305. package/dist/env-manifest.d.ts.map +1 -0
  306. package/dist/env-manifest.js +260 -0
  307. package/dist/env-manifest.js.map +1 -0
  308. package/dist/events/index.d.ts +172 -0
  309. package/dist/events/index.d.ts.map +1 -0
  310. package/dist/events/index.js +340 -0
  311. package/dist/events/index.js.map +1 -0
  312. package/dist/events/scheduler.d.ts +34 -0
  313. package/dist/events/scheduler.d.ts.map +1 -0
  314. package/dist/events/scheduler.js +231 -0
  315. package/dist/events/scheduler.js.map +1 -0
  316. package/dist/file-guards.d.ts +26 -0
  317. package/dist/file-guards.d.ts.map +1 -0
  318. package/dist/file-guards.js +133 -0
  319. package/dist/file-guards.js.map +1 -0
  320. package/dist/harness/execution-env.d.ts +19 -0
  321. package/dist/harness/execution-env.d.ts.map +1 -0
  322. package/dist/harness/execution-env.js +262 -0
  323. package/dist/harness/execution-env.js.map +1 -0
  324. package/dist/harness/execution-resolver.d.ts +25 -0
  325. package/dist/harness/execution-resolver.d.ts.map +1 -0
  326. package/dist/harness/execution-resolver.js +156 -0
  327. package/dist/harness/execution-resolver.js.map +1 -0
  328. package/dist/harness/index.d.ts +18 -13
  329. package/dist/harness/index.d.ts.map +1 -1
  330. package/dist/harness/index.js +11 -11
  331. package/dist/harness/index.js.map +1 -1
  332. package/dist/harness/jev.d.ts +86 -0
  333. package/dist/harness/jev.d.ts.map +1 -0
  334. package/dist/harness/jev.js +167 -0
  335. package/dist/harness/jev.js.map +1 -0
  336. package/dist/harness/mcp.d.ts +38 -0
  337. package/dist/harness/mcp.d.ts.map +1 -0
  338. package/dist/harness/mcp.js +304 -0
  339. package/dist/harness/mcp.js.map +1 -0
  340. package/dist/harness/models.d.ts +7 -4
  341. package/dist/harness/models.d.ts.map +1 -1
  342. package/dist/harness/models.js +54 -55
  343. package/dist/harness/models.js.map +1 -1
  344. package/dist/harness/open-connector.d.ts +25 -0
  345. package/dist/harness/open-connector.d.ts.map +1 -0
  346. package/dist/harness/open-connector.js +178 -0
  347. package/dist/harness/open-connector.js.map +1 -0
  348. package/dist/harness/presenter.d.ts +31 -0
  349. package/dist/harness/presenter.d.ts.map +1 -0
  350. package/dist/harness/presenter.js +859 -0
  351. package/dist/harness/presenter.js.map +1 -0
  352. package/dist/harness/prompt.d.ts +30 -0
  353. package/dist/harness/prompt.d.ts.map +1 -0
  354. package/dist/harness/prompt.js +420 -0
  355. package/dist/harness/prompt.js.map +1 -0
  356. package/dist/harness/runner.d.ts +2 -123
  357. package/dist/harness/runner.d.ts.map +1 -1
  358. package/dist/harness/runner.js +551 -416
  359. package/dist/harness/runner.js.map +1 -1
  360. package/dist/harness/session.d.ts +122 -0
  361. package/dist/harness/session.d.ts.map +1 -0
  362. package/dist/harness/session.js +581 -0
  363. package/dist/harness/session.js.map +1 -0
  364. package/dist/harness/skills.d.ts +17 -28
  365. package/dist/harness/skills.d.ts.map +1 -1
  366. package/dist/harness/skills.js +104 -39
  367. package/dist/harness/skills.js.map +1 -1
  368. package/dist/harness/subagent-profiles.d.ts +8 -0
  369. package/dist/harness/subagent-profiles.d.ts.map +1 -0
  370. package/dist/harness/subagent-profiles.js +293 -0
  371. package/dist/harness/subagent-profiles.js.map +1 -0
  372. package/dist/harness/subagent.d.ts +64 -0
  373. package/dist/harness/subagent.d.ts.map +1 -0
  374. package/dist/harness/subagent.js +687 -0
  375. package/dist/harness/subagent.js.map +1 -0
  376. package/dist/harness/tools/attach.d.ts.map +1 -0
  377. package/dist/{adapters/slack → harness}/tools/attach.js +1 -1
  378. package/dist/harness/tools/attach.js.map +1 -0
  379. package/dist/{tools → harness/tools}/event.d.ts +4 -33
  380. package/dist/harness/tools/event.d.ts.map +1 -0
  381. package/dist/harness/tools/event.js +175 -0
  382. package/dist/harness/tools/event.js.map +1 -0
  383. package/dist/harness/tools/generate-image.d.ts +23 -0
  384. package/dist/harness/tools/generate-image.d.ts.map +1 -0
  385. package/dist/harness/tools/generate-image.js +65 -0
  386. package/dist/harness/tools/generate-image.js.map +1 -0
  387. package/dist/harness/tools/host-fn-tool.d.ts +21 -0
  388. package/dist/harness/tools/host-fn-tool.d.ts.map +1 -0
  389. package/dist/harness/tools/host-fn-tool.js +32 -0
  390. package/dist/harness/tools/host-fn-tool.js.map +1 -0
  391. package/dist/harness/tools/index.d.ts +41 -0
  392. package/dist/harness/tools/index.d.ts.map +1 -0
  393. package/dist/harness/tools/index.js +51 -0
  394. package/dist/harness/tools/index.js.map +1 -0
  395. package/dist/harness/tools/jev.d.ts +21 -0
  396. package/dist/harness/tools/jev.d.ts.map +1 -0
  397. package/dist/harness/tools/jev.js +109 -0
  398. package/dist/harness/tools/jev.js.map +1 -0
  399. package/dist/harness/tools/pi-tools.d.ts +18 -0
  400. package/dist/harness/tools/pi-tools.d.ts.map +1 -0
  401. package/dist/harness/tools/pi-tools.js +84 -0
  402. package/dist/harness/tools/pi-tools.js.map +1 -0
  403. package/dist/harness/tools/react.d.ts.map +1 -0
  404. package/dist/{tools → harness/tools}/react.js +6 -17
  405. package/dist/harness/tools/react.js.map +1 -0
  406. package/dist/{tools → harness/tools}/sandbox.d.ts +4 -4
  407. package/dist/harness/tools/sandbox.d.ts.map +1 -0
  408. package/dist/{tools → harness/tools}/sandbox.js +12 -8
  409. package/dist/harness/tools/sandbox.js.map +1 -0
  410. package/dist/harness/tools/subagent.d.ts +85 -0
  411. package/dist/harness/tools/subagent.d.ts.map +1 -0
  412. package/dist/harness/tools/subagent.js +677 -0
  413. package/dist/harness/tools/subagent.js.map +1 -0
  414. package/dist/harness/tools/task.d.ts +20 -0
  415. package/dist/harness/tools/task.d.ts.map +1 -0
  416. package/dist/harness/tools/task.js +79 -0
  417. package/dist/harness/tools/task.js.map +1 -0
  418. package/dist/harness/tools/types.d.ts +29 -0
  419. package/dist/harness/tools/types.d.ts.map +1 -0
  420. package/dist/harness/tools/types.js +2 -0
  421. package/dist/harness/tools/types.js.map +1 -0
  422. package/dist/harness/types.d.ts +384 -25
  423. package/dist/harness/types.d.ts.map +1 -1
  424. package/dist/harness/types.js +1 -1
  425. package/dist/harness/types.js.map +1 -1
  426. package/dist/index.d.ts +33 -9
  427. package/dist/index.d.ts.map +1 -1
  428. package/dist/index.js +19 -6
  429. package/dist/index.js.map +1 -1
  430. package/dist/log.d.ts.map +1 -1
  431. package/dist/log.js +4 -1
  432. package/dist/log.js.map +1 -1
  433. package/dist/main.js +357 -198
  434. package/dist/main.js.map +1 -1
  435. package/dist/observability/index.d.ts +33 -0
  436. package/dist/observability/index.d.ts.map +1 -0
  437. package/dist/observability/index.js +257 -0
  438. package/dist/observability/index.js.map +1 -0
  439. package/dist/observability/instrument.js +14 -6
  440. package/dist/observability/instrument.js.map +1 -1
  441. package/dist/observability/otel.d.ts +10 -0
  442. package/dist/observability/otel.d.ts.map +1 -0
  443. package/dist/observability/otel.js +183 -0
  444. package/dist/observability/otel.js.map +1 -0
  445. package/dist/observability/sentry.d.ts +40 -7
  446. package/dist/observability/sentry.d.ts.map +1 -1
  447. package/dist/observability/sentry.js +176 -32
  448. package/dist/observability/sentry.js.map +1 -1
  449. package/dist/observability/types.d.ts +24 -3
  450. package/dist/observability/types.d.ts.map +1 -1
  451. package/dist/observability/types.js.map +1 -1
  452. package/dist/office/index.d.ts +139 -0
  453. package/dist/office/index.d.ts.map +1 -0
  454. package/dist/office/index.js +1084 -0
  455. package/dist/office/index.js.map +1 -0
  456. package/dist/office/projection.d.ts +42 -0
  457. package/dist/office/projection.d.ts.map +1 -0
  458. package/dist/office/projection.js +182 -0
  459. package/dist/office/projection.js.map +1 -0
  460. package/dist/office/types.d.ts +116 -0
  461. package/dist/office/types.d.ts.map +1 -0
  462. package/dist/office/types.js +2 -0
  463. package/dist/office/types.js.map +1 -0
  464. package/dist/runtime/conversation-runtime.d.ts +1 -1
  465. package/dist/runtime/conversation-runtime.d.ts.map +1 -1
  466. package/dist/runtime/conversation-runtime.js +423 -152
  467. package/dist/runtime/conversation-runtime.js.map +1 -1
  468. package/dist/runtime/session-lifecycle.d.ts +76 -0
  469. package/dist/runtime/session-lifecycle.d.ts.map +1 -0
  470. package/dist/runtime/session-lifecycle.js +404 -0
  471. package/dist/runtime/session-lifecycle.js.map +1 -0
  472. package/dist/runtime/types.d.ts +63 -15
  473. package/dist/runtime/types.d.ts.map +1 -1
  474. package/dist/runtime/types.js.map +1 -1
  475. package/dist/sandbox/cloudflare.d.ts +4 -0
  476. package/dist/sandbox/cloudflare.d.ts.map +1 -1
  477. package/dist/sandbox/cloudflare.js +54 -52
  478. package/dist/sandbox/cloudflare.js.map +1 -1
  479. package/dist/sandbox/container.d.ts +3 -0
  480. package/dist/sandbox/container.d.ts.map +1 -1
  481. package/dist/sandbox/container.js +19 -7
  482. package/dist/sandbox/container.js.map +1 -1
  483. package/dist/sandbox/host.d.ts +3 -0
  484. package/dist/sandbox/host.d.ts.map +1 -1
  485. package/dist/sandbox/host.js +44 -35
  486. package/dist/sandbox/host.js.map +1 -1
  487. package/dist/sandbox/identity.d.ts +42 -0
  488. package/dist/sandbox/identity.d.ts.map +1 -0
  489. package/dist/sandbox/identity.js +77 -0
  490. package/dist/sandbox/identity.js.map +1 -0
  491. package/dist/sandbox/index.d.ts +24 -6
  492. package/dist/sandbox/index.d.ts.map +1 -1
  493. package/dist/sandbox/index.js +77 -17
  494. package/dist/sandbox/index.js.map +1 -1
  495. package/dist/sandbox/provisioner.d.ts +139 -0
  496. package/dist/sandbox/provisioner.d.ts.map +1 -0
  497. package/dist/{provisioner.js → sandbox/provisioner.js} +378 -24
  498. package/dist/sandbox/provisioner.js.map +1 -0
  499. package/dist/sandbox/types.d.ts +43 -9
  500. package/dist/sandbox/types.d.ts.map +1 -1
  501. package/dist/sandbox/types.js.map +1 -1
  502. package/dist/sandbox/utils.d.ts +24 -0
  503. package/dist/sandbox/utils.d.ts.map +1 -1
  504. package/dist/sandbox/utils.js +92 -1
  505. package/dist/sandbox/utils.js.map +1 -1
  506. package/dist/sessions/chat-history-sync.d.ts +23 -0
  507. package/dist/sessions/chat-history-sync.d.ts.map +1 -0
  508. package/dist/sessions/{agent-memory-file-manager.js → chat-history-sync.js} +239 -175
  509. package/dist/sessions/chat-history-sync.js.map +1 -0
  510. package/dist/sessions/history-line.d.ts +29 -0
  511. package/dist/sessions/history-line.d.ts.map +1 -0
  512. package/dist/sessions/history-line.js +45 -0
  513. package/dist/sessions/history-line.js.map +1 -0
  514. package/dist/sessions/migrate-common.d.ts +43 -0
  515. package/dist/sessions/migrate-common.d.ts.map +1 -0
  516. package/dist/sessions/migrate-common.js +99 -0
  517. package/dist/sessions/migrate-common.js.map +1 -0
  518. package/dist/sessions/migrate-pi-084.d.ts +8 -0
  519. package/dist/sessions/migrate-pi-084.d.ts.map +1 -0
  520. package/dist/sessions/migrate-pi-084.js +302 -0
  521. package/dist/sessions/migrate-pi-084.js.map +1 -0
  522. package/dist/sessions/migrate-v3.d.ts +15 -0
  523. package/dist/sessions/migrate-v3.d.ts.map +1 -0
  524. package/dist/sessions/migrate-v3.js +419 -0
  525. package/dist/sessions/migrate-v3.js.map +1 -0
  526. package/dist/sessions/session-key.d.ts +33 -0
  527. package/dist/sessions/session-key.d.ts.map +1 -0
  528. package/dist/sessions/session-key.js +115 -0
  529. package/dist/sessions/session-key.js.map +1 -0
  530. package/dist/sessions/session-store.d.ts +61 -0
  531. package/dist/sessions/session-store.d.ts.map +1 -0
  532. package/dist/sessions/session-store.js +684 -0
  533. package/dist/sessions/session-store.js.map +1 -0
  534. package/dist/sessions/store.d.ts +17 -10
  535. package/dist/sessions/store.d.ts.map +1 -1
  536. package/dist/sessions/store.js +182 -47
  537. package/dist/sessions/store.js.map +1 -1
  538. package/dist/sessions/types.d.ts +74 -8
  539. package/dist/sessions/types.d.ts.map +1 -1
  540. package/dist/sessions/types.js +1 -1
  541. package/dist/sessions/types.js.map +1 -1
  542. package/dist/settings/apply.d.ts +16 -0
  543. package/dist/settings/apply.d.ts.map +1 -0
  544. package/dist/settings/apply.js +60 -0
  545. package/dist/settings/apply.js.map +1 -0
  546. package/dist/settings/index.d.ts +126 -0
  547. package/dist/settings/index.d.ts.map +1 -0
  548. package/dist/settings/index.js +422 -0
  549. package/dist/settings/index.js.map +1 -0
  550. package/dist/settings/migrate.d.ts +21 -0
  551. package/dist/settings/migrate.d.ts.map +1 -0
  552. package/dist/settings/migrate.js +86 -0
  553. package/dist/settings/migrate.js.map +1 -0
  554. package/dist/types.d.ts +330 -141
  555. package/dist/types.d.ts.map +1 -1
  556. package/dist/types.js +2 -2
  557. package/dist/types.js.map +1 -1
  558. package/dist/vault/index.d.ts +52 -2
  559. package/dist/vault/index.d.ts.map +1 -1
  560. package/dist/vault/index.js +218 -86
  561. package/dist/vault/index.js.map +1 -1
  562. package/dist/vault/types.d.ts +6 -2
  563. package/dist/vault/types.d.ts.map +1 -1
  564. package/dist/vault/types.js.map +1 -1
  565. package/package.json +79 -40
  566. package/dist/adapter.d.ts +0 -2
  567. package/dist/adapter.d.ts.map +0 -1
  568. package/dist/adapter.js +0 -2
  569. package/dist/adapter.js.map +0 -1
  570. package/dist/adapters/slack/tools/attach.d.ts.map +0 -1
  571. package/dist/adapters/slack/tools/attach.js.map +0 -1
  572. package/dist/adapters/streaming.d.ts +0 -18
  573. package/dist/adapters/streaming.d.ts.map +0 -1
  574. package/dist/adapters/streaming.js +0 -44
  575. package/dist/adapters/streaming.js.map +0 -1
  576. package/dist/adapters/telegram/html.d.ts +0 -3
  577. package/dist/adapters/telegram/html.d.ts.map +0 -1
  578. package/dist/adapters/telegram/html.js +0 -98
  579. package/dist/adapters/telegram/html.js.map +0 -1
  580. package/dist/agent-events.d.ts +0 -5
  581. package/dist/agent-events.d.ts.map +0 -1
  582. package/dist/agent-events.js +0 -26
  583. package/dist/agent-events.js.map +0 -1
  584. package/dist/agent.d.ts +0 -39
  585. package/dist/agent.d.ts.map +0 -1
  586. package/dist/agent.js +0 -1291
  587. package/dist/agent.js.map +0 -1
  588. package/dist/cli/ext-git.d.ts +0 -22
  589. package/dist/cli/ext-git.d.ts.map +0 -1
  590. package/dist/cli/ext-git.js +0 -76
  591. package/dist/cli/ext-git.js.map +0 -1
  592. package/dist/cli/ext.d.ts +0 -2
  593. package/dist/cli/ext.d.ts.map +0 -1
  594. package/dist/cli/ext.js +0 -217
  595. package/dist/cli/ext.js.map +0 -1
  596. package/dist/commands/admin.d.ts.map +0 -1
  597. package/dist/commands/admin.js.map +0 -1
  598. package/dist/commands/auto-reply.d.ts.map +0 -1
  599. package/dist/commands/auto-reply.js +0 -76
  600. package/dist/commands/auto-reply.js.map +0 -1
  601. package/dist/commands/extensions.d.ts +0 -14
  602. package/dist/commands/extensions.d.ts.map +0 -1
  603. package/dist/commands/extensions.js +0 -55
  604. package/dist/commands/extensions.js.map +0 -1
  605. package/dist/commands/login.d.ts +0 -5
  606. package/dist/commands/login.d.ts.map +0 -1
  607. package/dist/commands/login.js +0 -115
  608. package/dist/commands/login.js.map +0 -1
  609. package/dist/commands/model.d.ts +0 -10
  610. package/dist/commands/model.d.ts.map +0 -1
  611. package/dist/commands/model.js +0 -102
  612. package/dist/commands/model.js.map +0 -1
  613. package/dist/commands/new.d.ts.map +0 -1
  614. package/dist/commands/new.js +0 -25
  615. package/dist/commands/new.js.map +0 -1
  616. package/dist/commands/parse.d.ts +0 -7
  617. package/dist/commands/parse.d.ts.map +0 -1
  618. package/dist/commands/parse.js +0 -14
  619. package/dist/commands/parse.js.map +0 -1
  620. package/dist/commands/registry.d.ts +0 -5
  621. package/dist/commands/registry.d.ts.map +0 -1
  622. package/dist/commands/registry.js +0 -31
  623. package/dist/commands/registry.js.map +0 -1
  624. package/dist/commands/sandbox.d.ts.map +0 -1
  625. package/dist/commands/sandbox.js +0 -78
  626. package/dist/commands/sandbox.js.map +0 -1
  627. package/dist/commands/session-view.d.ts.map +0 -1
  628. package/dist/commands/session-view.js.map +0 -1
  629. package/dist/commands/types.d.ts +0 -66
  630. package/dist/commands/types.d.ts.map +0 -1
  631. package/dist/commands/types.js.map +0 -1
  632. package/dist/commands/utils.d.ts +0 -11
  633. package/dist/commands/utils.d.ts.map +0 -1
  634. package/dist/commands/utils.js.map +0 -1
  635. package/dist/config.d.ts +0 -78
  636. package/dist/config.d.ts.map +0 -1
  637. package/dist/config.js +0 -450
  638. package/dist/config.js.map +0 -1
  639. package/dist/download.d.ts.map +0 -1
  640. package/dist/download.js +0 -89
  641. package/dist/download.js.map +0 -1
  642. package/dist/events.d.ts +0 -43
  643. package/dist/events.d.ts.map +0 -1
  644. package/dist/events.js +0 -456
  645. package/dist/events.js.map +0 -1
  646. package/dist/execution-resolver.d.ts +0 -21
  647. package/dist/execution-resolver.d.ts.map +0 -1
  648. package/dist/execution-resolver.js +0 -170
  649. package/dist/execution-resolver.js.map +0 -1
  650. package/dist/harness/auth.d.ts +0 -16
  651. package/dist/harness/auth.d.ts.map +0 -1
  652. package/dist/harness/auth.js +0 -86
  653. package/dist/harness/auth.js.map +0 -1
  654. package/dist/harness/extensions/loader.d.ts +0 -86
  655. package/dist/harness/extensions/loader.d.ts.map +0 -1
  656. package/dist/harness/extensions/loader.js +0 -525
  657. package/dist/harness/extensions/loader.js.map +0 -1
  658. package/dist/harness/extensions/registry.d.ts +0 -23
  659. package/dist/harness/extensions/registry.d.ts.map +0 -1
  660. package/dist/harness/extensions/registry.js +0 -45
  661. package/dist/harness/extensions/registry.js.map +0 -1
  662. package/dist/harness/extensions/types.d.ts +0 -248
  663. package/dist/harness/extensions/types.d.ts.map +0 -1
  664. package/dist/harness/extensions/types.js.map +0 -1
  665. package/dist/harness/session-store.d.ts +0 -77
  666. package/dist/harness/session-store.d.ts.map +0 -1
  667. package/dist/harness/session-store.js +0 -248
  668. package/dist/harness/session-store.js.map +0 -1
  669. package/dist/harness/settings.d.ts +0 -47
  670. package/dist/harness/settings.d.ts.map +0 -1
  671. package/dist/harness/settings.js +0 -29
  672. package/dist/harness/settings.js.map +0 -1
  673. package/dist/model-registry.d.ts +0 -4
  674. package/dist/model-registry.d.ts.map +0 -1
  675. package/dist/model-registry.js +0 -7
  676. package/dist/model-registry.js.map +0 -1
  677. package/dist/platform-messages.d.ts.map +0 -1
  678. package/dist/platform-messages.js.map +0 -1
  679. package/dist/portal-shell.d.ts +0 -4
  680. package/dist/portal-shell.d.ts.map +0 -1
  681. package/dist/portal-shell.js.map +0 -1
  682. package/dist/provisioner.d.ts +0 -61
  683. package/dist/provisioner.d.ts.map +0 -1
  684. package/dist/provisioner.js.map +0 -1
  685. package/dist/runtime/agent-run-controller.d.ts +0 -31
  686. package/dist/runtime/agent-run-controller.d.ts.map +0 -1
  687. package/dist/runtime/agent-run-controller.js +0 -195
  688. package/dist/runtime/agent-run-controller.js.map +0 -1
  689. package/dist/sandbox/errors.d.ts +0 -6
  690. package/dist/sandbox/errors.d.ts.map +0 -1
  691. package/dist/sandbox/errors.js +0 -11
  692. package/dist/sandbox/errors.js.map +0 -1
  693. package/dist/sandbox/firecracker.d.ts +0 -15
  694. package/dist/sandbox/firecracker.d.ts.map +0 -1
  695. package/dist/sandbox/firecracker.js +0 -212
  696. package/dist/sandbox/firecracker.js.map +0 -1
  697. package/dist/sandbox/image.d.ts +0 -3
  698. package/dist/sandbox/image.d.ts.map +0 -1
  699. package/dist/sandbox/image.js +0 -27
  700. package/dist/sandbox/image.js.map +0 -1
  701. package/dist/sandbox/path-context.d.ts +0 -3
  702. package/dist/sandbox/path-context.d.ts.map +0 -1
  703. package/dist/sandbox/path-context.js +0 -20
  704. package/dist/sandbox/path-context.js.map +0 -1
  705. package/dist/sessions/agent-memory-file-manager.d.ts +0 -19
  706. package/dist/sessions/agent-memory-file-manager.d.ts.map +0 -1
  707. package/dist/sessions/agent-memory-file-manager.js.map +0 -1
  708. package/dist/sessions/metadata.d.ts +0 -3
  709. package/dist/sessions/metadata.d.ts.map +0 -1
  710. package/dist/sessions/metadata.js +0 -11
  711. package/dist/sessions/metadata.js.map +0 -1
  712. package/dist/sessions/policy.d.ts +0 -6
  713. package/dist/sessions/policy.d.ts.map +0 -1
  714. package/dist/sessions/policy.js +0 -23
  715. package/dist/sessions/policy.js.map +0 -1
  716. package/dist/store.d.ts +0 -46
  717. package/dist/store.d.ts.map +0 -1
  718. package/dist/store.js +0 -177
  719. package/dist/store.js.map +0 -1
  720. package/dist/tools/bash.d.ts +0 -10
  721. package/dist/tools/bash.d.ts.map +0 -1
  722. package/dist/tools/bash.js +0 -80
  723. package/dist/tools/bash.js.map +0 -1
  724. package/dist/tools/edit.d.ts +0 -11
  725. package/dist/tools/edit.d.ts.map +0 -1
  726. package/dist/tools/edit.js +0 -131
  727. package/dist/tools/edit.js.map +0 -1
  728. package/dist/tools/event.d.ts.map +0 -1
  729. package/dist/tools/event.js +0 -252
  730. package/dist/tools/event.js.map +0 -1
  731. package/dist/tools/index.d.ts +0 -24
  732. package/dist/tools/index.d.ts.map +0 -1
  733. package/dist/tools/index.js +0 -31
  734. package/dist/tools/index.js.map +0 -1
  735. package/dist/tools/react.d.ts.map +0 -1
  736. package/dist/tools/react.js.map +0 -1
  737. package/dist/tools/read.d.ts +0 -11
  738. package/dist/tools/read.d.ts.map +0 -1
  739. package/dist/tools/read.js +0 -134
  740. package/dist/tools/read.js.map +0 -1
  741. package/dist/tools/sandbox.d.ts.map +0 -1
  742. package/dist/tools/sandbox.js.map +0 -1
  743. package/dist/tools/truncate.d.ts +0 -33
  744. package/dist/tools/truncate.d.ts.map +0 -1
  745. package/dist/tools/truncate.js +0 -184
  746. package/dist/tools/truncate.js.map +0 -1
  747. package/dist/tools/types.d.ts +0 -54
  748. package/dist/tools/types.d.ts.map +0 -1
  749. package/dist/tools/types.js.map +0 -1
  750. package/dist/tools/write.d.ts +0 -10
  751. package/dist/tools/write.d.ts.map +0 -1
  752. package/dist/tools/write.js +0 -29
  753. package/dist/tools/write.js.map +0 -1
  754. package/dist/trigger.d.ts +0 -22
  755. package/dist/trigger.d.ts.map +0 -1
  756. package/dist/trigger.js +0 -100
  757. package/dist/trigger.js.map +0 -1
  758. package/dist/utils/date.d.ts +0 -10
  759. package/dist/utils/date.d.ts.map +0 -1
  760. package/dist/utils/date.js +0 -23
  761. package/dist/utils/date.js.map +0 -1
  762. package/dist/utils/env.d.ts +0 -3
  763. package/dist/utils/env.d.ts.map +0 -1
  764. package/dist/utils/env.js +0 -12
  765. package/dist/utils/env.js.map +0 -1
  766. package/dist/utils/file-guards.d.ts +0 -9
  767. package/dist/utils/file-guards.d.ts.map +0 -1
  768. package/dist/utils/file-guards.js +0 -59
  769. package/dist/utils/file-guards.js.map +0 -1
  770. package/dist/utils/fs-atomic.d.ts +0 -10
  771. package/dist/utils/fs-atomic.d.ts.map +0 -1
  772. package/dist/utils/fs-atomic.js +0 -45
  773. package/dist/utils/fs-atomic.js.map +0 -1
  774. package/dist/utils/html.d.ts +0 -2
  775. package/dist/utils/html.d.ts.map +0 -1
  776. package/dist/utils/html.js +0 -4
  777. package/dist/utils/html.js.map +0 -1
  778. package/dist/utils/http-body.d.ts +0 -10
  779. package/dist/utils/http-body.d.ts.map +0 -1
  780. package/dist/utils/http-body.js +0 -34
  781. package/dist/utils/http-body.js.map +0 -1
  782. package/dist/vault/routing.d.ts +0 -3
  783. package/dist/vault/routing.d.ts.map +0 -1
  784. package/dist/vault/routing.js +0 -13
  785. package/dist/vault/routing.js.map +0 -1
  786. package/dist/web/admin/portal.d.ts +0 -5
  787. package/dist/web/admin/portal.d.ts.map +0 -1
  788. package/dist/web/admin/portal.js +0 -2572
  789. package/dist/web/admin/portal.js.map +0 -1
  790. package/dist/web/admin/provider-models.d.ts.map +0 -1
  791. package/dist/web/admin/provider-models.js.map +0 -1
  792. package/dist/web/admin/store.d.ts +0 -13
  793. package/dist/web/admin/store.d.ts.map +0 -1
  794. package/dist/web/admin/store.js +0 -14
  795. package/dist/web/admin/store.js.map +0 -1
  796. package/dist/web/admin/types.d.ts +0 -30
  797. package/dist/web/admin/types.d.ts.map +0 -1
  798. package/dist/web/admin/types.js.map +0 -1
  799. package/dist/web/agent-events/portal.d.ts +0 -3
  800. package/dist/web/agent-events/portal.d.ts.map +0 -1
  801. package/dist/web/agent-events/portal.js +0 -18
  802. package/dist/web/agent-events/portal.js.map +0 -1
  803. package/dist/web/login/oauth.d.ts +0 -6
  804. package/dist/web/login/oauth.d.ts.map +0 -1
  805. package/dist/web/login/oauth.js.map +0 -1
  806. package/dist/web/login/portal.d.ts.map +0 -1
  807. package/dist/web/login/portal.js.map +0 -1
  808. package/dist/web/login/store.d.ts +0 -8
  809. package/dist/web/login/store.d.ts.map +0 -1
  810. package/dist/web/login/store.js +0 -15
  811. package/dist/web/login/store.js.map +0 -1
  812. package/dist/web/login/types.d.ts.map +0 -1
  813. package/dist/web/login/types.js.map +0 -1
  814. package/dist/web/request.d.ts +0 -3
  815. package/dist/web/request.d.ts.map +0 -1
  816. package/dist/web/request.js +0 -13
  817. package/dist/web/request.js.map +0 -1
  818. package/dist/web/server.d.ts.map +0 -1
  819. package/dist/web/server.js.map +0 -1
  820. package/dist/web/session-view/command.d.ts +0 -4
  821. package/dist/web/session-view/command.d.ts.map +0 -1
  822. package/dist/web/session-view/command.js +0 -7
  823. package/dist/web/session-view/command.js.map +0 -1
  824. package/dist/web/session-view/portal.d.ts +0 -13
  825. package/dist/web/session-view/portal.d.ts.map +0 -1
  826. package/dist/web/session-view/portal.js.map +0 -1
  827. package/dist/web/session-view/service.d.ts +0 -6
  828. package/dist/web/session-view/service.d.ts.map +0 -1
  829. package/dist/web/session-view/service.js +0 -498
  830. package/dist/web/session-view/service.js.map +0 -1
  831. package/dist/web/session-view/store.d.ts +0 -8
  832. package/dist/web/session-view/store.d.ts.map +0 -1
  833. package/dist/web/session-view/store.js +0 -15
  834. package/dist/web/session-view/store.js.map +0 -1
  835. package/dist/web/session-view/types.d.ts.map +0 -1
  836. package/dist/web/session-view/types.js.map +0 -1
  837. package/dist/web/token-store.d.ts.map +0 -1
  838. package/dist/web/token-store.js.map +0 -1
  839. package/dist/web/types.d.ts.map +0 -1
  840. package/dist/web/types.js.map +0 -1
  841. /package/dist/{commands → adapters/commands}/admin.d.ts +0 -0
  842. /package/dist/{commands → adapters/commands}/new.d.ts +0 -0
  843. /package/dist/{commands → adapters/commands}/sandbox.d.ts +0 -0
  844. /package/dist/{commands → adapters/commands}/session-view.d.ts +0 -0
  845. /package/dist/{commands → adapters/commands}/types.js +0 -0
  846. /package/dist/{harness/extensions → adapters/github}/types.js +0 -0
  847. /package/dist/{tools → adapters/web/admin}/types.js +0 -0
  848. /package/dist/{web/admin → adapters/web/login}/types.js +0 -0
  849. /package/dist/{web/login → adapters/web/session-view}/types.js +0 -0
  850. /package/dist/{web → adapters/web}/token-store.d.ts +0 -0
  851. /package/dist/{web → adapters/web}/types.d.ts +0 -0
  852. /package/dist/{web/session-view → adapters/web}/types.js +0 -0
  853. /package/dist/{download.d.ts → cli/download.d.ts} +0 -0
  854. /package/dist/{web → cli}/types.js +0 -0
  855. /package/dist/{adapters/slack → harness}/tools/attach.d.ts +0 -0
  856. /package/dist/{tools → harness/tools}/react.d.ts +0 -0
@@ -0,0 +1,139 @@
1
+ export type { ContainerBindTranslator, ContainerMount, DockerContainerManagerOptions, ProvisionOptions, ResourceLimits, SandboxLimitStatus, } from "../types.js";
2
+ import type { ContainerBindTranslator, DockerContainerManagerOptions, ProvisionOptions, ResourceLimits, SandboxLimitStatus } from "../types.js";
3
+ export declare class DockerContainerManager {
4
+ private readonly image;
5
+ private state;
6
+ private inflight;
7
+ /** Active layout migration; unset means no translation ever applies. */
8
+ private bindTranslator?;
9
+ private layoutMigrations;
10
+ private static readonly MANAGED_LABEL;
11
+ private static readonly IMAGE_MODE_LABEL;
12
+ private static readonly VAULT_ID_LABEL_KEY;
13
+ private static readonly CONVERSATION_ID_LABEL_KEY;
14
+ private static readonly MOUNT_SIGNATURE_LABEL_KEY;
15
+ private static readonly MIGRATE_IMAGE_PREFIX;
16
+ private static readonly MIGRATE_BINDS_LABEL_KEY;
17
+ private readonly limits?;
18
+ private readonly boostLimits?;
19
+ private readonly boostedKeys;
20
+ private readonly overrideLimits;
21
+ private readonly execFileImpl;
22
+ constructor(image: string, options?: DockerContainerManagerOptions);
23
+ static sanitizeSegment(value: string): string;
24
+ static containerName(containerKey: string): string;
25
+ static networkName(containerKey: string): string;
26
+ provision(containerKey: string, options?: ProvisionOptions): Promise<string>;
27
+ private provisionInner;
28
+ boost(containerKey: string): Promise<SandboxLimitStatus>;
29
+ setLimits(containerKey: string, limits: ResourceLimits): Promise<SandboxLimitStatus>;
30
+ getLimitStatus(containerKey: string): SandboxLimitStatus;
31
+ getDefaultLimits(): ResourceLimits | undefined;
32
+ getBoostLimits(): ResourceLimits | undefined;
33
+ stop(containerKey: string): Promise<void>;
34
+ remove(containerKey: string): Promise<void>;
35
+ stopIdle(maxIdleMs: number): Promise<void>;
36
+ /**
37
+ * Force-remove every managed container belonging to the given conversation
38
+ * ids. The office layout migration renames the host directories a
39
+ * container's workspace mount points at, so a surviving container would keep
40
+ * writing through stale mounts while the runtime works in the new location.
41
+ */
42
+ removeContainersForConversations(conversationIds: ReadonlySet<string>): Promise<void>;
43
+ /**
44
+ * Arm the office-layout container migration. Containers whose binds still
45
+ * reference legacy raw-id paths are moved to the office-key layout without
46
+ * losing their writable layer: commit → remove → create with translated
47
+ * binds, preserving everything installed inside. Idempotent per container
48
+ * and resumable — the pre-removal binds ride on the snapshot image label,
49
+ * so a crash between commit and create resumes from the snapshot.
50
+ */
51
+ armContainerLayoutMigration(translator: ContainerBindTranslator): void;
52
+ /**
53
+ * Sweep every managed container through the layout migration, serially and
54
+ * with a small gap, so the one-time cost never lands on the boot path or on
55
+ * a message. Safe to fire-and-forget; each unit is idempotent.
56
+ */
57
+ sweepContainerLayoutMigration(delayMs?: number): Promise<void>;
58
+ /** Move one container to the office-key layout; no-op when already there. */
59
+ private migrateContainerLayout;
60
+ private migrateContainerLayoutInner;
61
+ /**
62
+ * Create `containerName` from its layout snapshot with `bindSpecs`,
63
+ * restoring the managed labels and recomputing the mount signature.
64
+ * `create`, not `run`: idle containers stay stopped exactly as they were;
65
+ * callers that need the container running start it themselves.
66
+ */
67
+ private createContainerFromSnapshot;
68
+ /**
69
+ * `docker commit` captures the empty directories Docker created as bind
70
+ * targets, so a public office that stopped being mounted would linger in
71
+ * the snapshot as an empty `/workspace/public/<key>`. Remove any entry
72
+ * there that no current bind targets; only empty directories are removed,
73
+ * so a real file could never be deleted by this pass.
74
+ */
75
+ private removeStaleMountpoints;
76
+ /**
77
+ * Recreate a drifted container with the desired mounts while keeping its
78
+ * writable layer: commit — the new binds ride the snapshot label, so a
79
+ * crash at any point resumes through the layout-migration path — then
80
+ * remove, create from the snapshot, and start. The snapshot is untagged
81
+ * once the new container is confirmed up: its only job was bridging
82
+ * commit → create, and the container now owns that content in its own
83
+ * writable layer, so nothing still needs the tag.
84
+ */
85
+ private recreateContainerPreservingContents;
86
+ /** Binds recorded on a snapshot image, or undefined when no snapshot exists. */
87
+ private readMigrateImageBinds;
88
+ private readImageLabel;
89
+ /**
90
+ * Delete a container's layout snapshot after an intentional removal, so a
91
+ * missing container plus a surviving snapshot can only mean a crash in the
92
+ * middle of the layout migration (the resume discriminator).
93
+ */
94
+ private removeMigrateSnapshot;
95
+ private listMigrateSnapshotContainerNames;
96
+ /**
97
+ * Catch-up pass for snapshots the success path in
98
+ * `migrateContainerLayoutInner` did not get to remove itself — e.g. a
99
+ * crash between `createContainerFromSnapshot` and its own cleanup. A
100
+ * snapshot is only still needed while its container remains "missing"
101
+ * (the resume path in `migrateContainerLayoutInner` reads pre-removal
102
+ * binds off it); once the container exists again in any state, the
103
+ * snapshot has done its job regardless of whether that container's
104
+ * `Config.Image` still points at it — removing a tag never deletes
105
+ * layers a live container still uses.
106
+ */
107
+ private removeDanglingMigrateImages;
108
+ reconcile(): Promise<void>;
109
+ private setState;
110
+ private getContainerName;
111
+ private mountArgs;
112
+ private toBindSpec;
113
+ private runContainer;
114
+ private effectiveLimits;
115
+ private resourceLimitArgs;
116
+ private applyResourceLimits;
117
+ private hasRuntimeDrift;
118
+ private hasBindMountDrift;
119
+ private expectedBinds;
120
+ private sameBinds;
121
+ private hasMountSignatureDrift;
122
+ private mountSignature;
123
+ private mountSourceFingerprint;
124
+ private inspectBindMounts;
125
+ private hasNetworkModeDrift;
126
+ private ensureNetwork;
127
+ private inspectStatus;
128
+ private listContainerNamesByLabel;
129
+ private listContainerNamesByPrefix;
130
+ private parseNameLines;
131
+ private inspectContainerDetails;
132
+ private normalizeDockerValue;
133
+ private parseDockerTimestamp;
134
+ private containerKeyFromContainerName;
135
+ /** @returns true when the container is gone (removed or already missing). */
136
+ private forceRemoveContainer;
137
+ private removeLegacyContainer;
138
+ }
139
+ //# sourceMappingURL=provisioner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provisioner.d.ts","sourceRoot":"","sources":["../../src/sandbox/provisioner.ts"],"names":[],"mappings":"AAoCA,YAAY,EACV,uBAAuB,EACvB,cAAc,EACd,6BAA6B,EAC7B,gBAAgB,EAChB,cAAc,EACd,kBAAkB,GACnB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EACV,uBAAuB,EAEvB,6BAA6B,EAC7B,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EACnB,MAAM,aAAa,CAAC;AAcrB,qBAAa,sBAAsB;IAqB/B,OAAO,CAAC,QAAQ,CAAC,KAAK;IApBxB,OAAO,CAAC,KAAK,CAAqC;IAClD,OAAO,CAAC,QAAQ,CAAsC;IACtD,wEAAwE;IACxE,OAAO,CAAC,cAAc,CAAC,CAA0B;IACjD,OAAO,CAAC,gBAAgB,CAAoC;IAC5D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAwB;IAC7D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAyB;IACjE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAoB;IAC9D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,yBAAyB,CAA2B;IAC5E,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,yBAAyB,CAA2B;IAC5E,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAAmB;IAC/D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAAyB;IAExE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAiB;IACzC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAiB;IAC9C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IACjD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAqC;IACpE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgB;IAE7C,YACmB,KAAK,EAAE,MAAM,EAC9B,OAAO,GAAE,6BAAkC,EAK5C;IAED,MAAM,CAAC,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE5C;IAED,MAAM,CAAC,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAEjD;IAED,MAAM,CAAC,WAAW,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAE/C;IAEK,SAAS,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CASrF;YAEa,cAAc;IAmCtB,KAAK,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAY7D;IAEK,SAAS,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAQzF;IAED,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,kBAAkB,CAGvD;IAED,gBAAgB,IAAI,cAAc,GAAG,SAAS,CAE7C;IAED,cAAc,IAAI,cAAc,GAAG,SAAS,CAE3C;IAEK,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAc9C;IAEK,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA+BhD;IAEK,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAS/C;IAED;;;;;OAKG;IACG,gCAAgC,CAAC,eAAe,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAc1F;IAED;;;;;;;OAOG;IACH,2BAA2B,CAAC,UAAU,EAAE,uBAAuB,GAAG,IAAI,CAErE;IAED;;;;OAIG;IACG,6BAA6B,CAAC,OAAO,SAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BjE;IAED,6EAA6E;IAC7E,OAAO,CAAC,sBAAsB;YAYhB,2BAA2B;IA2CzC;;;;;OAKG;YACW,2BAA2B;IAwDzC;;;;;;OAMG;YACW,sBAAsB;IAiCpC;;;;;;;;OAQG;YACW,mCAAmC;IAqBjD,gFAAgF;YAClE,qBAAqB;YAarB,cAAc;IAc5B;;;;OAIG;YACW,qBAAqB;YAWrB,iCAAiC;IAc/C;;;;;;;;;;OAUG;YACW,2BAA2B;IAyBnC,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAwD/B;IAED,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,gBAAgB;IAOxB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,UAAU;YAOJ,YAAY;IAkD1B,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,iBAAiB;YAaX,mBAAmB;YA2BnB,eAAe;YAcf,iBAAiB;IAS/B,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,SAAS;YAQH,sBAAsB;IAgBpC,OAAO,CAAC,cAAc;IAatB,OAAO,CAAC,sBAAsB;YAoBhB,iBAAiB;YAqBjB,mBAAmB;YAWnB,aAAa;YAwBb,aAAa;YAeb,yBAAyB;YAsBzB,0BAA0B;IAoBxC,OAAO,CAAC,cAAc;YAOR,uBAAuB;IAwBrC,OAAO,CAAC,oBAAoB;IAM5B,OAAO,CAAC,oBAAoB;IAO5B,OAAO,CAAC,6BAA6B;IAOrC,6EAA6E;YAC/D,oBAAoB;YAiBpB,qBAAqB;CAOpC"}
@@ -1,9 +1,10 @@
1
- import { execFile } from "child_process";
2
- import { createHash } from "crypto";
3
- import { readFileSync, statSync } from "fs";
4
- import { promisify } from "util";
5
- import * as log from "./log.js";
6
- import { reportUserFacingError } from "./observability/sentry.js";
1
+ import { execFile } from "node:child_process";
2
+ import { legacyConversationResourceKey, sanitizeIdentitySegment } from "./identity.js";
3
+ import { createHash } from "node:crypto";
4
+ import { readFileSync, statSync } from "node:fs";
5
+ import { promisify } from "node:util";
6
+ import * as log from "../log.js";
7
+ import { reportUserFacingError } from "../observability/index.js";
7
8
  const execFileAsync = promisify(execFile);
8
9
  function isDockerNotFoundError(err) {
9
10
  if (!err || typeof err !== "object")
@@ -18,16 +19,30 @@ function isDockerNotFoundError(err) {
18
19
  /network [^\n]+ not found/.test(haystack) ||
19
20
  /error: no such [^\n]+/.test(haystack));
20
21
  }
22
+ /** Parse `src:dst[:ro]` back into a ContainerMount for signature computation. */
23
+ function bindSpecToMount(bindSpec) {
24
+ const readOnly = bindSpec.endsWith(":ro");
25
+ const spec = readOnly ? bindSpec.slice(0, -3) : bindSpec;
26
+ const separator = spec.indexOf(":");
27
+ return {
28
+ source: spec.slice(0, separator),
29
+ target: spec.slice(separator + 1),
30
+ ...(readOnly ? { readOnly: true } : {}),
31
+ };
32
+ }
21
33
  export class DockerContainerManager {
22
34
  static { this.MANAGED_LABEL = "mikan.managed=true"; }
23
35
  static { this.IMAGE_MODE_LABEL = "mikan.sandbox=image"; }
24
36
  static { this.VAULT_ID_LABEL_KEY = "mikan.vault-id"; }
25
37
  static { this.CONVERSATION_ID_LABEL_KEY = "mikan.conversation-id"; }
26
38
  static { this.MOUNT_SIGNATURE_LABEL_KEY = "mikan.mount-signature"; }
39
+ static { this.MIGRATE_IMAGE_PREFIX = "mikan-migrate"; }
40
+ static { this.MIGRATE_BINDS_LABEL_KEY = "mikan.migrate-binds"; }
27
41
  constructor(image, options = {}) {
28
42
  this.image = image;
29
43
  this.state = new Map();
30
44
  this.inflight = new Map();
45
+ this.layoutMigrations = new Map();
31
46
  this.boostedKeys = new Set();
32
47
  this.overrideLimits = new Map();
33
48
  this.limits = options.limits;
@@ -35,11 +50,7 @@ export class DockerContainerManager {
35
50
  this.execFileImpl = options.execFileImpl ?? execFileAsync;
36
51
  }
37
52
  static sanitizeSegment(value) {
38
- const sanitized = value
39
- .toLowerCase()
40
- .replace(/[^a-z0-9]+/g, "-")
41
- .replace(/^-+|-+$/g, "");
42
- return sanitized || "unknown";
53
+ return sanitizeIdentitySegment(value);
43
54
  }
44
55
  static containerName(containerKey) {
45
56
  return `mikan-sandbox-${containerKey}`;
@@ -60,23 +71,23 @@ export class DockerContainerManager {
60
71
  async provisionInner(containerKey, options) {
61
72
  const containerName = options.containerName ?? DockerContainerManager.containerName(containerKey);
62
73
  const mounts = options.mounts ?? [];
74
+ // A container still on the pre-office layout must move its writable layer
75
+ // to the new mounts before the drift check below would recreate it from
76
+ // the base image and discard everything installed inside.
77
+ await this.migrateContainerLayout(containerName);
63
78
  const status = await this.inspectStatus(containerName);
64
79
  try {
65
80
  if (status !== "missing" &&
66
81
  (await this.hasRuntimeDrift(containerKey, containerName, mounts))) {
67
82
  log.logInfo(`Container ${containerName} configuration changed; recreating container`);
68
- await this.execFileImpl("docker", ["rm", "-f", containerName]);
69
- await this.runContainer(containerKey, containerName, mounts, options);
83
+ await this.recreateContainerPreservingContents(containerKey, containerName, mounts);
70
84
  log.logInfo(`Container ${containerName} recreated`);
71
85
  }
72
- else if (status === "running") {
73
- log.logInfo(`Container ${containerName} already running`);
74
- }
75
86
  else if (status === "stopped") {
76
87
  await this.execFileImpl("docker", ["start", containerName]);
77
88
  log.logInfo(`Container ${containerName} started`);
78
89
  }
79
- else {
90
+ else if (status === "missing") {
80
91
  await this.runContainer(containerKey, containerName, mounts, options);
81
92
  log.logInfo(`Container ${containerName} created`);
82
93
  }
@@ -136,7 +147,13 @@ export class DockerContainerManager {
136
147
  async remove(containerKey) {
137
148
  const containerName = this.getContainerName(containerKey);
138
149
  const networkName = DockerContainerManager.networkName(containerKey);
139
- await this.forceRemoveContainer(containerName, `Container ${containerName} removed`, `Failed to remove container ${containerName}`);
150
+ const removed = await this.forceRemoveContainer(containerName, `Container ${containerName} removed`, `Failed to remove container ${containerName}`);
151
+ if (!removed) {
152
+ // The container may still be running with its old mounts. Keeping the
153
+ // ownership state (and throwing) is the honest outcome: callers such
154
+ // as credential refresh must not report a teardown that did not happen.
155
+ throw new Error(`Failed to remove container ${containerName}`);
156
+ }
140
157
  try {
141
158
  await this.execFileImpl("docker", ["network", "rm", networkName]);
142
159
  log.logInfo(`Network ${networkName} removed`);
@@ -144,6 +161,7 @@ export class DockerContainerManager {
144
161
  catch (err) {
145
162
  log.logWarning(`Failed to remove network ${networkName}`, err instanceof Error ? err.message : String(err));
146
163
  }
164
+ await this.removeMigrateSnapshot(containerName);
147
165
  this.state.delete(containerKey);
148
166
  this.boostedKeys.delete(containerKey);
149
167
  this.overrideLimits.delete(containerKey);
@@ -158,6 +176,319 @@ export class DockerContainerManager {
158
176
  }
159
177
  await Promise.all(toStop.map((containerKey) => this.stop(containerKey)));
160
178
  }
179
+ /**
180
+ * Force-remove every managed container belonging to the given conversation
181
+ * ids. The office layout migration renames the host directories a
182
+ * container's workspace mount points at, so a surviving container would keep
183
+ * writing through stale mounts while the runtime works in the new location.
184
+ */
185
+ async removeContainersForConversations(conversationIds) {
186
+ if (conversationIds.size === 0)
187
+ return;
188
+ const names = await this.listContainerNamesByLabel();
189
+ await Promise.all(names.map(async (containerName) => {
190
+ const details = await this.inspectContainerDetails(containerName);
191
+ if (!details?.conversationId || !conversationIds.has(details.conversationId))
192
+ return;
193
+ await this.forceRemoveContainer(containerName, `Removed container ${containerName} after office migration`, `Failed to remove container ${containerName} after office migration`);
194
+ }));
195
+ }
196
+ /**
197
+ * Arm the office-layout container migration. Containers whose binds still
198
+ * reference legacy raw-id paths are moved to the office-key layout without
199
+ * losing their writable layer: commit → remove → create with translated
200
+ * binds, preserving everything installed inside. Idempotent per container
201
+ * and resumable — the pre-removal binds ride on the snapshot image label,
202
+ * so a crash between commit and create resumes from the snapshot.
203
+ */
204
+ armContainerLayoutMigration(translator) {
205
+ this.bindTranslator = translator;
206
+ }
207
+ /**
208
+ * Sweep every managed container through the layout migration, serially and
209
+ * with a small gap, so the one-time cost never lands on the boot path or on
210
+ * a message. Safe to fire-and-forget; each unit is idempotent.
211
+ */
212
+ async sweepContainerLayoutMigration(delayMs = 2000) {
213
+ if (!this.bindTranslator)
214
+ return;
215
+ let names;
216
+ try {
217
+ // Include snapshot names: a crash between commit and create leaves a
218
+ // snapshot with no container, which must resume before the GC below
219
+ // could mistake it for an orphan.
220
+ const containers = await this.listContainerNamesByLabel();
221
+ const snapshots = await this.listMigrateSnapshotContainerNames();
222
+ names = Array.from(new Set([...containers, ...snapshots]));
223
+ }
224
+ catch (err) {
225
+ log.logWarning("Container layout sweep could not list containers", String(err));
226
+ return;
227
+ }
228
+ for (const containerName of names) {
229
+ try {
230
+ await this.migrateContainerLayout(containerName);
231
+ }
232
+ catch (err) {
233
+ log.logWarning(`Container layout migration failed for ${containerName}; leaving it in place`, err instanceof Error ? err.message : String(err));
234
+ }
235
+ await new Promise((resolve) => setTimeout(resolve, delayMs));
236
+ }
237
+ // Snapshot images whose container has since been recreated from the base
238
+ // image are no longer referenced; reclaim them.
239
+ await this.removeDanglingMigrateImages();
240
+ }
241
+ /** Move one container to the office-key layout; no-op when already there. */
242
+ migrateContainerLayout(containerName) {
243
+ const translator = this.bindTranslator;
244
+ if (!translator)
245
+ return Promise.resolve();
246
+ const existing = this.layoutMigrations.get(containerName);
247
+ if (existing)
248
+ return existing;
249
+ const pending = this.migrateContainerLayoutInner(containerName, translator).finally(() => {
250
+ this.layoutMigrations.delete(containerName);
251
+ });
252
+ this.layoutMigrations.set(containerName, pending);
253
+ return pending;
254
+ }
255
+ async migrateContainerLayoutInner(containerName, translator) {
256
+ const snapshotImage = `${DockerContainerManager.MIGRATE_IMAGE_PREFIX}:${containerName}`;
257
+ let originalBinds;
258
+ const status = await this.inspectStatus(containerName);
259
+ if (status === "missing") {
260
+ // Resume path: a previous run committed and removed the container but
261
+ // died before creating the replacement. The snapshot carries the
262
+ // pre-removal binds on its label.
263
+ const labeled = await this.readMigrateImageBinds(snapshotImage);
264
+ if (labeled === undefined)
265
+ return;
266
+ originalBinds = labeled;
267
+ }
268
+ else {
269
+ originalBinds = await this.inspectBindMounts(containerName);
270
+ const translated = originalBinds.map(translator);
271
+ if (this.sameBinds(translated.toSorted(), originalBinds.slice().toSorted())) {
272
+ return; // already on the office layout
273
+ }
274
+ log.logInfo(`Migrating container ${containerName} to the office layout`);
275
+ await this.execFileImpl("docker", [
276
+ "commit",
277
+ "-c",
278
+ `LABEL ${DockerContainerManager.MIGRATE_BINDS_LABEL_KEY}=${JSON.stringify(JSON.stringify(originalBinds))}`,
279
+ containerName,
280
+ snapshotImage,
281
+ ]);
282
+ await this.execFileImpl("docker", ["rm", "-f", containerName]);
283
+ }
284
+ await this.createContainerFromSnapshot(containerName, originalBinds.map(translator));
285
+ // The snapshot's only job was bridging commit → create; the new container
286
+ // already owns that content in its own writable layer; untagging it now
287
+ // (rather than waiting for a "natural recreation from the base image"
288
+ // that never happens — every recreation path here targets this same
289
+ // snapshot family) is what makes migration actually one-time instead of
290
+ // repeating on every future sweep that still finds the tag.
291
+ await this.removeMigrateSnapshot(containerName);
292
+ log.logInfo(`Container ${containerName} migrated to the office layout`);
293
+ }
294
+ /**
295
+ * Create `containerName` from its layout snapshot with `bindSpecs`,
296
+ * restoring the managed labels and recomputing the mount signature.
297
+ * `create`, not `run`: idle containers stay stopped exactly as they were;
298
+ * callers that need the container running start it themselves.
299
+ */
300
+ async createContainerFromSnapshot(containerName, bindSpecs, knownContainerKey) {
301
+ const snapshotImage = `${DockerContainerManager.MIGRATE_IMAGE_PREFIX}:${containerName}`;
302
+ // The sweep has only the container name and derives the key; the drift
303
+ // path knows the real key (container names can be caller-supplied).
304
+ const containerKey = knownContainerKey ?? this.containerKeyFromContainerName(containerName) ?? containerName;
305
+ const networkName = await this.ensureNetwork(containerKey);
306
+ const conversationId = await this.readImageLabel(snapshotImage, DockerContainerManager.CONVERSATION_ID_LABEL_KEY);
307
+ const labels = [
308
+ "--label",
309
+ DockerContainerManager.MANAGED_LABEL,
310
+ "--label",
311
+ DockerContainerManager.IMAGE_MODE_LABEL,
312
+ "--label",
313
+ `${DockerContainerManager.VAULT_ID_LABEL_KEY}=${containerKey}`,
314
+ ];
315
+ if (conversationId) {
316
+ labels.push("--label", `${DockerContainerManager.CONVERSATION_ID_LABEL_KEY}=${conversationId}`);
317
+ }
318
+ labels.push("--label", `${DockerContainerManager.MOUNT_SIGNATURE_LABEL_KEY}=${this.mountSignature(bindSpecs.map(bindSpecToMount))}`);
319
+ await this.execFileImpl("docker", [
320
+ "create",
321
+ "--name",
322
+ containerName,
323
+ "--network",
324
+ networkName,
325
+ "--cap-drop",
326
+ "ALL",
327
+ "--security-opt",
328
+ "no-new-privileges",
329
+ "--pids-limit",
330
+ "1024",
331
+ ...labels,
332
+ ...this.resourceLimitArgs(this.effectiveLimits(containerKey)),
333
+ ...bindSpecs.flatMap((bind) => ["-v", bind]),
334
+ snapshotImage,
335
+ "sleep",
336
+ "infinity",
337
+ ]);
338
+ }
339
+ /**
340
+ * `docker commit` captures the empty directories Docker created as bind
341
+ * targets, so a public office that stopped being mounted would linger in
342
+ * the snapshot as an empty `/workspace/public/<key>`. Remove any entry
343
+ * there that no current bind targets; only empty directories are removed,
344
+ * so a real file could never be deleted by this pass.
345
+ */
346
+ async removeStaleMountpoints(containerName, bindSpecs) {
347
+ const keep = new Set(bindSpecs
348
+ .map((bind) => bindSpecToMount(bind).target)
349
+ .filter((target) => target.startsWith("/workspace/public/"))
350
+ .map((target) => target.slice("/workspace/public/".length)));
351
+ const script = [
352
+ "[ -d /workspace/public ] || exit 0",
353
+ "for d in /workspace/public/*; do",
354
+ ' [ -e "$d" ] || continue',
355
+ ' case " $KEEP " in *" ${d##*/} "*) continue;; esac',
356
+ ' rmdir "$d" 2>/dev/null || true',
357
+ "done",
358
+ ].join("\n");
359
+ try {
360
+ await this.execFileImpl("docker", [
361
+ "exec",
362
+ "-e",
363
+ `KEEP=${[...keep].join(" ")}`,
364
+ containerName,
365
+ "sh",
366
+ "-c",
367
+ script,
368
+ ]);
369
+ }
370
+ catch (err) {
371
+ log.logWarning(`Could not clean stale mountpoints in ${containerName}`, String(err));
372
+ }
373
+ }
374
+ /**
375
+ * Recreate a drifted container with the desired mounts while keeping its
376
+ * writable layer: commit — the new binds ride the snapshot label, so a
377
+ * crash at any point resumes through the layout-migration path — then
378
+ * remove, create from the snapshot, and start. The snapshot is untagged
379
+ * once the new container is confirmed up: its only job was bridging
380
+ * commit → create, and the container now owns that content in its own
381
+ * writable layer, so nothing still needs the tag.
382
+ */
383
+ async recreateContainerPreservingContents(containerKey, containerName, mounts) {
384
+ const snapshotImage = `${DockerContainerManager.MIGRATE_IMAGE_PREFIX}:${containerName}`;
385
+ const bindSpecs = mounts.map((mount) => this.toBindSpec(mount));
386
+ await this.execFileImpl("docker", [
387
+ "commit",
388
+ "-c",
389
+ `LABEL ${DockerContainerManager.MIGRATE_BINDS_LABEL_KEY}=${JSON.stringify(JSON.stringify(bindSpecs))}`,
390
+ containerName,
391
+ snapshotImage,
392
+ ]);
393
+ await this.execFileImpl("docker", ["rm", "-f", containerName]);
394
+ await this.createContainerFromSnapshot(containerName, bindSpecs, containerKey);
395
+ await this.execFileImpl("docker", ["start", containerName]);
396
+ await this.removeStaleMountpoints(containerName, bindSpecs);
397
+ await this.removeMigrateSnapshot(containerName);
398
+ }
399
+ /** Binds recorded on a snapshot image, or undefined when no snapshot exists. */
400
+ async readMigrateImageBinds(snapshotImage) {
401
+ const raw = await this.readImageLabel(snapshotImage, DockerContainerManager.MIGRATE_BINDS_LABEL_KEY);
402
+ if (raw === undefined)
403
+ return undefined;
404
+ const parsed = JSON.parse(raw);
405
+ if (!Array.isArray(parsed) || parsed.some((bind) => typeof bind !== "string")) {
406
+ throw new Error(`Snapshot image ${snapshotImage} carries malformed migrate binds`);
407
+ }
408
+ return parsed;
409
+ }
410
+ async readImageLabel(image, key) {
411
+ try {
412
+ const { stdout } = await this.execFileImpl("docker", [
413
+ "inspect",
414
+ "-f",
415
+ `{{index .Config.Labels "${key}"}}`,
416
+ image,
417
+ ]);
418
+ return this.normalizeDockerValue(stdout.trim());
419
+ }
420
+ catch {
421
+ return undefined;
422
+ }
423
+ }
424
+ /**
425
+ * Delete a container's layout snapshot after an intentional removal, so a
426
+ * missing container plus a surviving snapshot can only mean a crash in the
427
+ * middle of the layout migration (the resume discriminator).
428
+ */
429
+ async removeMigrateSnapshot(containerName) {
430
+ try {
431
+ await this.execFileImpl("docker", [
432
+ "rmi",
433
+ `${DockerContainerManager.MIGRATE_IMAGE_PREFIX}:${containerName}`,
434
+ ]);
435
+ }
436
+ catch {
437
+ // No snapshot for this container — the common case.
438
+ }
439
+ }
440
+ async listMigrateSnapshotContainerNames() {
441
+ try {
442
+ const { stdout } = await this.execFileImpl("docker", [
443
+ "images",
444
+ DockerContainerManager.MIGRATE_IMAGE_PREFIX,
445
+ "--format",
446
+ "{{.Tag}}",
447
+ ]);
448
+ return this.parseNameLines(stdout);
449
+ }
450
+ catch {
451
+ return [];
452
+ }
453
+ }
454
+ /**
455
+ * Catch-up pass for snapshots the success path in
456
+ * `migrateContainerLayoutInner` did not get to remove itself — e.g. a
457
+ * crash between `createContainerFromSnapshot` and its own cleanup. A
458
+ * snapshot is only still needed while its container remains "missing"
459
+ * (the resume path in `migrateContainerLayoutInner` reads pre-removal
460
+ * binds off it); once the container exists again in any state, the
461
+ * snapshot has done its job regardless of whether that container's
462
+ * `Config.Image` still points at it — removing a tag never deletes
463
+ * layers a live container still uses.
464
+ */
465
+ async removeDanglingMigrateImages() {
466
+ let stdout;
467
+ try {
468
+ ({ stdout } = await this.execFileImpl("docker", [
469
+ "images",
470
+ `${DockerContainerManager.MIGRATE_IMAGE_PREFIX}`,
471
+ "--format",
472
+ "{{.Repository}}:{{.Tag}}",
473
+ ]));
474
+ }
475
+ catch {
476
+ return;
477
+ }
478
+ for (const image of this.parseNameLines(stdout)) {
479
+ const containerName = image.slice(DockerContainerManager.MIGRATE_IMAGE_PREFIX.length + 1);
480
+ const status = await this.inspectStatus(containerName);
481
+ if (status === "missing")
482
+ continue; // still needed for a future resume
483
+ try {
484
+ await this.execFileImpl("docker", ["rmi", image]);
485
+ log.logInfo(`Removed layout-migration snapshot image ${image}`);
486
+ }
487
+ catch (err) {
488
+ log.logWarning(`Could not remove snapshot image ${image}`, String(err));
489
+ }
490
+ }
491
+ }
161
492
  async reconcile() {
162
493
  const discovered = new Set();
163
494
  const labeledNames = await this.listContainerNamesByLabel();
@@ -184,6 +515,13 @@ export class DockerContainerManager {
184
515
  log.logWarning(`Skipping unmanaged-style container without container key`, containerName);
185
516
  continue;
186
517
  }
518
+ // Containers keyed under the pre-office raw-conversation resource key
519
+ // are unreachable now that resource identity is the office key: no
520
+ // provision will ever address them again, so reap rather than adopt.
521
+ if (containerKey === legacyConversationResourceKey(details.conversationId)) {
522
+ legacyRemovals.push(this.forceRemoveContainer(containerName, `Removed container ${containerName} keyed by pre-office resource identity`, `Failed to remove legacy-keyed container ${containerName}`).then(() => undefined));
523
+ continue;
524
+ }
187
525
  const status = details.running ? "running" : "stopped";
188
526
  const lastUsed = details.startedAtMs ?? Date.now();
189
527
  this.state.set(containerKey, { status, lastUsed, containerName });
@@ -204,7 +542,10 @@ export class DockerContainerManager {
204
542
  return mounts.flatMap((mount) => ["-v", this.toBindSpec(mount)]);
205
543
  }
206
544
  toBindSpec(mount) {
207
- return `${mount.source}:${mount.target}`;
545
+ // The `:ro` suffix is part of the bind spec, so it also flows into
546
+ // expectedBinds/mountSignature — flipping a mount's writability is drift
547
+ // and recreates the container rather than leaving a stale writable bind.
548
+ return `${mount.source}:${mount.target}${mount.readOnly ? ":ro" : ""}`;
208
549
  }
209
550
  async runContainer(containerKey, containerName, mounts, options) {
210
551
  const networkName = await this.ensureNetwork(containerKey);
@@ -343,9 +684,17 @@ export class DockerContainerManager {
343
684
  try {
344
685
  const stat = statSync(source);
345
686
  if (stat.isFile()) {
687
+ // Files are atomically replaced (rename), which leaves the container
688
+ // holding a stale inode — content changes must recreate the mount.
346
689
  return createHash("sha256").update(readFileSync(source)).digest("hex");
347
690
  }
348
- return `${stat.isDirectory() ? "dir" : "other"}:${stat.size}:${stat.mtimeMs}`;
691
+ // Directories: a bind mount follows changes inside the directory live,
692
+ // so only replacing the directory itself makes the mount stale.
693
+ // Size/mtime churn from ordinary activity — event files coming and
694
+ // going, children being created — must not read as drift. Identity is
695
+ // dev:ino plus birth time, because ext4 recycles inode numbers
696
+ // immediately and a same-path replacement can reuse the old one.
697
+ return `${stat.isDirectory() ? "dir" : "other"}:${stat.dev}:${stat.ino}:${stat.birthtimeMs}`;
349
698
  }
350
699
  catch {
351
700
  return "missing";
@@ -469,12 +818,11 @@ export class DockerContainerManager {
469
818
  `{{.State.Running}}\t{{.State.StartedAt}}\t{{index .Config.Labels "${DockerContainerManager.VAULT_ID_LABEL_KEY}"}}\t{{index .Config.Labels "${DockerContainerManager.CONVERSATION_ID_LABEL_KEY}"}}`,
470
819
  containerName,
471
820
  ]);
472
- const [runningRaw, startedAtRaw, vaultIdRaw, conversationIdRaw] = stdout.trim().split("\t");
821
+ const [runningRaw, startedAtRaw, , conversationIdRaw] = stdout.trim().split("\t");
473
822
  const running = runningRaw === "true";
474
823
  const startedAtMs = this.parseDockerTimestamp(startedAtRaw);
475
- const vaultId = this.normalizeDockerValue(vaultIdRaw);
476
824
  const conversationId = this.normalizeDockerValue(conversationIdRaw);
477
- return { running, startedAtMs, vaultId, conversationId };
825
+ return { running, startedAtMs, conversationId };
478
826
  }
479
827
  catch (err) {
480
828
  log.logWarning(`Failed to inspect container ${containerName} during reconcile`, err instanceof Error ? err.message : String(err));
@@ -501,13 +849,19 @@ export class DockerContainerManager {
501
849
  const containerKey = containerName.slice(prefix.length);
502
850
  return containerKey.length > 0 ? containerKey : undefined;
503
851
  }
852
+ /** @returns true when the container is gone (removed or already missing). */
504
853
  async forceRemoveContainer(containerName, successLog, failureLog) {
505
854
  try {
506
855
  await this.execFileImpl("docker", ["rm", "-f", containerName]);
507
856
  log.logInfo(successLog);
857
+ return true;
508
858
  }
509
859
  catch (err) {
510
- log.logWarning(failureLog, err instanceof Error ? err.message : String(err));
860
+ const message = err instanceof Error ? err.message : String(err);
861
+ if (/no such container/i.test(message))
862
+ return true;
863
+ log.logWarning(failureLog, message);
864
+ return false;
511
865
  }
512
866
  }
513
867
  async removeLegacyContainer(containerName) {