@geminixiang/mikan 1.0.0-beta.53 → 1.0.0-beta.55

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 (556) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/README.md +3 -2
  3. package/dist/adapters/commands/admin.d.ts.map +1 -0
  4. package/dist/{commands → adapters/commands}/admin.js +4 -8
  5. package/dist/adapters/commands/admin.js.map +1 -0
  6. package/dist/adapters/commands/login.d.ts.map +1 -0
  7. package/dist/adapters/commands/login.js +166 -0
  8. package/dist/adapters/commands/login.js.map +1 -0
  9. package/dist/adapters/commands/manifest.d.ts.map +1 -0
  10. package/dist/{commands → adapters/commands}/manifest.js +0 -7
  11. package/dist/adapters/commands/manifest.js.map +1 -0
  12. package/dist/{commands → adapters/commands}/model.d.ts +6 -0
  13. package/dist/adapters/commands/model.d.ts.map +1 -0
  14. package/dist/{commands → adapters/commands}/model.js +56 -44
  15. package/dist/adapters/commands/model.js.map +1 -0
  16. package/dist/adapters/commands/new.d.ts.map +1 -0
  17. package/dist/{commands → adapters/commands}/new.js +7 -8
  18. package/dist/adapters/commands/new.js.map +1 -0
  19. package/dist/adapters/commands/registry.d.ts.map +1 -0
  20. package/dist/{commands → adapters/commands}/registry.js +1 -3
  21. package/dist/adapters/commands/registry.js.map +1 -0
  22. package/dist/adapters/commands/sandbox.d.ts.map +1 -0
  23. package/dist/{commands → adapters/commands}/sandbox.js +22 -21
  24. package/dist/adapters/commands/sandbox.js.map +1 -0
  25. package/dist/adapters/commands/session-view.d.ts.map +1 -0
  26. package/dist/{commands → adapters/commands}/session-view.js +8 -11
  27. package/dist/adapters/commands/session-view.js.map +1 -0
  28. package/dist/{commands → adapters/commands}/types.d.ts +6 -6
  29. package/dist/adapters/commands/types.d.ts.map +1 -0
  30. package/dist/adapters/commands/types.js.map +1 -0
  31. package/dist/adapters/commands/utils.d.ts +14 -0
  32. package/dist/adapters/commands/utils.d.ts.map +1 -0
  33. package/dist/{commands → adapters/commands}/utils.js +18 -1
  34. package/dist/adapters/commands/utils.js.map +1 -0
  35. package/dist/adapters/discord/bot.d.ts.map +1 -1
  36. package/dist/adapters/discord/bot.js +4 -5
  37. package/dist/adapters/discord/bot.js.map +1 -1
  38. package/dist/adapters/github/bot.d.ts.map +1 -1
  39. package/dist/adapters/github/bot.js +3 -4
  40. package/dist/adapters/github/bot.js.map +1 -1
  41. package/dist/adapters/github/client.d.ts.map +1 -1
  42. package/dist/adapters/github/client.js +5 -18
  43. package/dist/adapters/github/client.js.map +1 -1
  44. package/dist/adapters/github/tool-pack.d.ts +1 -1
  45. package/dist/adapters/github/tool-pack.d.ts.map +1 -1
  46. package/dist/adapters/github/tool-pack.js.map +1 -1
  47. package/dist/adapters/github/tools/checks.js +1 -1
  48. package/dist/adapters/github/tools/checks.js.map +1 -1
  49. package/dist/adapters/github/tools/issue.js +1 -1
  50. package/dist/adapters/github/tools/issue.js.map +1 -1
  51. package/dist/adapters/github/tools/pr.js +1 -1
  52. package/dist/adapters/github/tools/pr.js.map +1 -1
  53. package/dist/adapters/github/tools/read.d.ts.map +1 -1
  54. package/dist/adapters/github/tools/read.js +53 -53
  55. package/dist/adapters/github/tools/read.js.map +1 -1
  56. package/dist/adapters/github/tools/review-reply.js +1 -1
  57. package/dist/adapters/github/tools/review-reply.js.map +1 -1
  58. package/dist/adapters/github/tools/sync.js +1 -1
  59. package/dist/adapters/github/tools/sync.js.map +1 -1
  60. package/dist/adapters/intake.d.ts +1 -1
  61. package/dist/adapters/intake.d.ts.map +1 -1
  62. package/dist/adapters/intake.js +2 -6
  63. package/dist/adapters/intake.js.map +1 -1
  64. package/dist/adapters/markdown-tables.d.ts +0 -13
  65. package/dist/adapters/markdown-tables.d.ts.map +1 -1
  66. package/dist/adapters/markdown-tables.js +26 -38
  67. package/dist/adapters/markdown-tables.js.map +1 -1
  68. package/dist/adapters/shared.js +1 -1
  69. package/dist/adapters/shared.js.map +1 -1
  70. package/dist/adapters/slack/bot.d.ts +7 -4
  71. package/dist/adapters/slack/bot.d.ts.map +1 -1
  72. package/dist/adapters/slack/bot.js +104 -122
  73. package/dist/adapters/slack/bot.js.map +1 -1
  74. package/dist/adapters/slack/response-lifecycle.d.ts.map +1 -1
  75. package/dist/adapters/slack/response-lifecycle.js +33 -25
  76. package/dist/adapters/slack/response-lifecycle.js.map +1 -1
  77. package/dist/adapters/slack/tool-pack.d.ts +1 -1
  78. package/dist/adapters/slack/tool-pack.d.ts.map +1 -1
  79. package/dist/adapters/slack/tool-pack.js.map +1 -1
  80. package/dist/adapters/slack/update-diagnostics.d.ts.map +1 -1
  81. package/dist/adapters/slack/update-diagnostics.js +8 -24
  82. package/dist/adapters/slack/update-diagnostics.js.map +1 -1
  83. package/dist/adapters/telegram/bot.d.ts.map +1 -1
  84. package/dist/adapters/telegram/bot.js +3 -4
  85. package/dist/adapters/telegram/bot.js.map +1 -1
  86. package/dist/adapters/types.d.ts +2 -4
  87. package/dist/adapters/types.d.ts.map +1 -1
  88. package/dist/adapters/types.js.map +1 -1
  89. package/dist/{web → adapters/web}/admin/portal.d.ts +3 -3
  90. package/dist/adapters/web/admin/portal.d.ts.map +1 -0
  91. package/dist/{web → adapters/web}/admin/portal.js +535 -709
  92. package/dist/adapters/web/admin/portal.js.map +1 -0
  93. package/dist/{web → adapters/web}/admin/provider-models.d.ts +1 -1
  94. package/dist/adapters/web/admin/provider-models.d.ts.map +1 -0
  95. package/dist/adapters/web/admin/provider-models.js.map +1 -0
  96. package/dist/{web → adapters/web}/admin/types.d.ts +5 -5
  97. package/dist/adapters/web/admin/types.d.ts.map +1 -0
  98. package/dist/adapters/web/admin/types.js.map +1 -0
  99. package/dist/adapters/web/login/oauth.d.ts.map +1 -0
  100. package/dist/{web → adapters/web}/login/oauth.js +50 -54
  101. package/dist/adapters/web/login/oauth.js.map +1 -0
  102. package/dist/{web → adapters/web}/login/portal.d.ts +2 -2
  103. package/dist/adapters/web/login/portal.d.ts.map +1 -0
  104. package/dist/{web → adapters/web}/login/portal.js +6 -6
  105. package/dist/adapters/web/login/portal.js.map +1 -0
  106. package/dist/{web → adapters/web}/login/types.d.ts +1 -1
  107. package/dist/adapters/web/login/types.d.ts.map +1 -0
  108. package/dist/adapters/web/login/types.js.map +1 -0
  109. package/dist/{web → adapters/web}/portal-shell.d.ts +2 -2
  110. package/dist/adapters/web/portal-shell.d.ts.map +1 -0
  111. package/dist/{web → adapters/web}/portal-shell.js +2 -2
  112. package/dist/adapters/web/portal-shell.js.map +1 -0
  113. package/dist/{web → adapters/web}/server.d.ts +5 -5
  114. package/dist/adapters/web/server.d.ts.map +1 -0
  115. package/dist/{web → adapters/web}/server.js +4 -7
  116. package/dist/adapters/web/server.js.map +1 -0
  117. package/dist/adapters/web/session-view/portal.d.ts.map +1 -0
  118. package/dist/{web → adapters/web}/session-view/portal.js +9 -9
  119. package/dist/adapters/web/session-view/portal.js.map +1 -0
  120. package/dist/{web → adapters/web}/session-view/types.d.ts +3 -3
  121. package/dist/adapters/web/session-view/types.d.ts.map +1 -0
  122. package/dist/adapters/web/session-view/types.js.map +1 -0
  123. package/dist/adapters/web/token-store.d.ts.map +1 -0
  124. package/dist/adapters/web/token-store.js.map +1 -0
  125. package/dist/adapters/web/types.d.ts.map +1 -0
  126. package/dist/adapters/web/types.js.map +1 -0
  127. package/dist/cli/arg-grammar.d.ts +24 -0
  128. package/dist/cli/arg-grammar.d.ts.map +1 -1
  129. package/dist/cli/arg-grammar.js +39 -8
  130. package/dist/cli/arg-grammar.js.map +1 -1
  131. package/dist/cli/boot.d.ts.map +1 -1
  132. package/dist/cli/boot.js +48 -62
  133. package/dist/cli/boot.js.map +1 -1
  134. package/dist/cli/download.d.ts.map +1 -1
  135. package/dist/cli/download.js +51 -54
  136. package/dist/cli/download.js.map +1 -1
  137. package/dist/cli/office.d.ts.map +1 -1
  138. package/dist/cli/office.js +9 -26
  139. package/dist/cli/office.js.map +1 -1
  140. package/dist/cli/onboard.d.ts.map +1 -1
  141. package/dist/cli/onboard.js +15 -11
  142. package/dist/cli/onboard.js.map +1 -1
  143. package/dist/cli/sessions.d.ts.map +1 -1
  144. package/dist/cli/sessions.js +49 -52
  145. package/dist/cli/sessions.js.map +1 -1
  146. package/dist/config.d.ts +4 -28
  147. package/dist/config.d.ts.map +1 -1
  148. package/dist/config.js +7 -112
  149. package/dist/config.js.map +1 -1
  150. package/dist/dream/index.d.ts.map +1 -1
  151. package/dist/dream/index.js +8 -2
  152. package/dist/dream/index.js.map +1 -1
  153. package/dist/dream/types.d.ts +1 -1
  154. package/dist/dream/types.d.ts.map +1 -1
  155. package/dist/dream/types.js.map +1 -1
  156. package/dist/env-manifest.d.ts +2 -0
  157. package/dist/env-manifest.d.ts.map +1 -1
  158. package/dist/env-manifest.js +29 -8
  159. package/dist/env-manifest.js.map +1 -1
  160. package/dist/events/index.d.ts +150 -0
  161. package/dist/events/index.d.ts.map +1 -0
  162. package/dist/{harness/event-format.js → events/index.js} +80 -2
  163. package/dist/events/index.js.map +1 -0
  164. package/dist/{events.d.ts → events/watcher.d.ts} +4 -4
  165. package/dist/events/watcher.d.ts.map +1 -0
  166. package/dist/{events.js → events/watcher.js} +8 -8
  167. package/dist/events/watcher.js.map +1 -0
  168. package/dist/file-guards.d.ts.map +1 -0
  169. package/dist/file-guards.js.map +1 -0
  170. package/dist/harness/execution-env.d.ts +19 -0
  171. package/dist/harness/execution-env.d.ts.map +1 -0
  172. package/dist/harness/execution-env.js +262 -0
  173. package/dist/harness/execution-env.js.map +1 -0
  174. package/dist/harness/execution-resolver.d.ts +25 -0
  175. package/dist/harness/execution-resolver.d.ts.map +1 -0
  176. package/dist/{execution-resolver.js → harness/execution-resolver.js} +12 -21
  177. package/dist/harness/execution-resolver.js.map +1 -0
  178. package/dist/harness/index.d.ts +9 -9
  179. package/dist/harness/index.d.ts.map +1 -1
  180. package/dist/harness/index.js +8 -8
  181. package/dist/harness/index.js.map +1 -1
  182. package/dist/harness/mcp.d.ts +38 -0
  183. package/dist/harness/mcp.d.ts.map +1 -0
  184. package/dist/{mcp/loader.js → harness/mcp.js} +155 -6
  185. package/dist/harness/mcp.js.map +1 -0
  186. package/dist/harness/models.js +1 -1
  187. package/dist/harness/models.js.map +1 -1
  188. package/dist/harness/open-connector.d.ts.map +1 -0
  189. package/dist/{mcp → harness}/open-connector.js +1 -1
  190. package/dist/harness/open-connector.js.map +1 -0
  191. package/dist/{agent → harness}/presenter.d.ts +2 -9
  192. package/dist/harness/presenter.d.ts.map +1 -0
  193. package/dist/{agent → harness}/presenter.js +170 -146
  194. package/dist/harness/presenter.js.map +1 -0
  195. package/dist/{agent → harness}/prompt.d.ts +10 -3
  196. package/dist/harness/prompt.d.ts.map +1 -0
  197. package/dist/{agent → harness}/prompt.js +137 -41
  198. package/dist/harness/prompt.js.map +1 -0
  199. package/dist/harness/runner.d.ts +2 -109
  200. package/dist/harness/runner.d.ts.map +1 -1
  201. package/dist/harness/runner.js +499 -467
  202. package/dist/harness/runner.js.map +1 -1
  203. package/dist/harness/session.d.ts +119 -0
  204. package/dist/harness/session.d.ts.map +1 -0
  205. package/dist/harness/session.js +561 -0
  206. package/dist/harness/session.js.map +1 -0
  207. package/dist/harness/skills.d.ts +10 -2
  208. package/dist/harness/skills.d.ts.map +1 -1
  209. package/dist/harness/skills.js +62 -39
  210. package/dist/harness/skills.js.map +1 -1
  211. package/dist/harness/{subagent-runner.d.ts → subagent.d.ts} +25 -6
  212. package/dist/harness/subagent.d.ts.map +1 -0
  213. package/dist/harness/{subagent-runner.js → subagent.js} +106 -54
  214. package/dist/harness/subagent.js.map +1 -0
  215. package/dist/harness/tools/attach.d.ts.map +1 -0
  216. package/dist/harness/tools/attach.js.map +1 -0
  217. package/dist/{tools → harness/tools}/event.d.ts +3 -32
  218. package/dist/harness/tools/event.d.ts.map +1 -0
  219. package/dist/harness/tools/event.js +178 -0
  220. package/dist/harness/tools/event.js.map +1 -0
  221. package/dist/harness/tools/generate-image.d.ts.map +1 -0
  222. package/dist/harness/tools/generate-image.js.map +1 -0
  223. package/dist/harness/tools/host-fn-tool.d.ts.map +1 -0
  224. package/dist/harness/tools/host-fn-tool.js.map +1 -0
  225. package/dist/{tools → harness/tools}/index.d.ts +5 -6
  226. package/dist/harness/tools/index.d.ts.map +1 -0
  227. package/dist/{tools → harness/tools}/index.js +12 -16
  228. package/dist/harness/tools/index.js.map +1 -0
  229. package/dist/harness/tools/pi-tools.d.ts +18 -0
  230. package/dist/harness/tools/pi-tools.d.ts.map +1 -0
  231. package/dist/harness/tools/pi-tools.js +84 -0
  232. package/dist/harness/tools/pi-tools.js.map +1 -0
  233. package/dist/harness/tools/react.d.ts.map +1 -0
  234. package/dist/harness/tools/react.js.map +1 -0
  235. package/dist/{tools → harness/tools}/sandbox.d.ts +2 -2
  236. package/dist/harness/tools/sandbox.d.ts.map +1 -0
  237. package/dist/{tools → harness/tools}/sandbox.js +1 -1
  238. package/dist/harness/tools/sandbox.js.map +1 -0
  239. package/dist/{tools → harness/tools}/subagent.d.ts +28 -1
  240. package/dist/harness/tools/subagent.d.ts.map +1 -0
  241. package/dist/{tools → harness/tools}/subagent.js +218 -2
  242. package/dist/harness/tools/subagent.js.map +1 -0
  243. package/dist/{tools → harness/tools}/types.d.ts +0 -33
  244. package/dist/harness/tools/types.d.ts.map +1 -0
  245. package/dist/harness/tools/types.js.map +1 -0
  246. package/dist/harness/types.d.ts +180 -97
  247. package/dist/harness/types.d.ts.map +1 -1
  248. package/dist/harness/types.js +1 -1
  249. package/dist/harness/types.js.map +1 -1
  250. package/dist/index.d.ts +12 -11
  251. package/dist/index.d.ts.map +1 -1
  252. package/dist/index.js +6 -6
  253. package/dist/index.js.map +1 -1
  254. package/dist/main.js +10 -12
  255. package/dist/main.js.map +1 -1
  256. package/dist/observability/index.d.ts +33 -0
  257. package/dist/observability/index.d.ts.map +1 -0
  258. package/dist/observability/index.js +256 -0
  259. package/dist/observability/index.js.map +1 -0
  260. package/dist/observability/instrument.js +7 -1
  261. package/dist/observability/instrument.js.map +1 -1
  262. package/dist/observability/otel.d.ts +10 -0
  263. package/dist/observability/otel.d.ts.map +1 -0
  264. package/dist/observability/otel.js +183 -0
  265. package/dist/observability/otel.js.map +1 -0
  266. package/dist/observability/sentry.d.ts +22 -5
  267. package/dist/observability/sentry.d.ts.map +1 -1
  268. package/dist/observability/sentry.js +68 -23
  269. package/dist/observability/sentry.js.map +1 -1
  270. package/dist/observability/types.d.ts +6 -2
  271. package/dist/observability/types.d.ts.map +1 -1
  272. package/dist/observability/types.js.map +1 -1
  273. package/dist/office/index.d.ts +2 -3
  274. package/dist/office/index.d.ts.map +1 -1
  275. package/dist/office/index.js +172 -140
  276. package/dist/office/index.js.map +1 -1
  277. package/dist/{workspace-projection/index.d.ts → office/projection.d.ts} +2 -2
  278. package/dist/office/projection.d.ts.map +1 -0
  279. package/dist/{workspace-projection/index.js → office/projection.js} +2 -2
  280. package/dist/office/projection.js.map +1 -0
  281. package/dist/office/types.d.ts +29 -2
  282. package/dist/office/types.d.ts.map +1 -1
  283. package/dist/office/types.js.map +1 -1
  284. package/dist/process-lifecycle.d.ts +1 -1
  285. package/dist/process-lifecycle.d.ts.map +1 -1
  286. package/dist/process-lifecycle.js +3 -3
  287. package/dist/process-lifecycle.js.map +1 -1
  288. package/dist/runtime/conversation-runtime.d.ts.map +1 -1
  289. package/dist/runtime/conversation-runtime.js +106 -107
  290. package/dist/runtime/conversation-runtime.js.map +1 -1
  291. package/dist/runtime/session-lifecycle.d.ts +10 -0
  292. package/dist/runtime/session-lifecycle.d.ts.map +1 -1
  293. package/dist/runtime/session-lifecycle.js +42 -24
  294. package/dist/runtime/session-lifecycle.js.map +1 -1
  295. package/dist/runtime/types.d.ts +3 -3
  296. package/dist/runtime/types.d.ts.map +1 -1
  297. package/dist/runtime/types.js.map +1 -1
  298. package/dist/sandbox/cloudflare.d.ts +1 -0
  299. package/dist/sandbox/cloudflare.d.ts.map +1 -1
  300. package/dist/sandbox/cloudflare.js +41 -50
  301. package/dist/sandbox/cloudflare.js.map +1 -1
  302. package/dist/sandbox/container.d.ts.map +1 -1
  303. package/dist/sandbox/container.js +7 -4
  304. package/dist/sandbox/container.js.map +1 -1
  305. package/dist/sandbox/host.d.ts.map +1 -1
  306. package/dist/sandbox/host.js +27 -35
  307. package/dist/sandbox/host.js.map +1 -1
  308. package/dist/sandbox/index.d.ts.map +1 -1
  309. package/dist/sandbox/index.js +8 -15
  310. package/dist/sandbox/index.js.map +1 -1
  311. package/dist/{provisioner.d.ts → sandbox/provisioner.d.ts} +2 -2
  312. package/dist/sandbox/provisioner.d.ts.map +1 -0
  313. package/dist/{provisioner.js → sandbox/provisioner.js} +3 -3
  314. package/dist/sandbox/provisioner.js.map +1 -0
  315. package/dist/sandbox/types.d.ts +2 -0
  316. package/dist/sandbox/types.d.ts.map +1 -1
  317. package/dist/sandbox/types.js.map +1 -1
  318. package/dist/sandbox/utils.d.ts +5 -0
  319. package/dist/sandbox/utils.d.ts.map +1 -1
  320. package/dist/sandbox/utils.js +14 -0
  321. package/dist/sandbox/utils.js.map +1 -1
  322. package/dist/sessions/chat-history-sync.d.ts.map +1 -1
  323. package/dist/sessions/chat-history-sync.js +72 -62
  324. package/dist/sessions/chat-history-sync.js.map +1 -1
  325. package/dist/sessions/migrate-common.d.ts +43 -0
  326. package/dist/sessions/migrate-common.d.ts.map +1 -0
  327. package/dist/sessions/migrate-common.js +99 -0
  328. package/dist/sessions/migrate-common.js.map +1 -0
  329. package/dist/sessions/migrate-pi-084.d.ts.map +1 -1
  330. package/dist/sessions/migrate-pi-084.js +152 -203
  331. package/dist/sessions/migrate-pi-084.js.map +1 -1
  332. package/dist/sessions/migrate-v3.d.ts +5 -0
  333. package/dist/sessions/migrate-v3.d.ts.map +1 -1
  334. package/dist/sessions/migrate-v3.js +161 -209
  335. package/dist/sessions/migrate-v3.js.map +1 -1
  336. package/dist/{harness → sessions}/session-store.d.ts +12 -1
  337. package/dist/sessions/session-store.d.ts.map +1 -0
  338. package/dist/{harness → sessions}/session-store.js +74 -35
  339. package/dist/sessions/session-store.js.map +1 -0
  340. package/dist/sessions/store.d.ts +1 -1
  341. package/dist/sessions/store.d.ts.map +1 -1
  342. package/dist/sessions/store.js +18 -17
  343. package/dist/sessions/store.js.map +1 -1
  344. package/dist/sessions/types.d.ts +40 -1
  345. package/dist/sessions/types.d.ts.map +1 -1
  346. package/dist/sessions/types.js +1 -1
  347. package/dist/sessions/types.js.map +1 -1
  348. package/dist/types.d.ts +7 -99
  349. package/dist/types.d.ts.map +1 -1
  350. package/dist/types.js.map +1 -1
  351. package/dist/vault/index.d.ts.map +1 -1
  352. package/dist/vault/index.js +70 -53
  353. package/dist/vault/index.js.map +1 -1
  354. package/package.json +10 -4
  355. package/dist/adapters/slack/tools/attach.d.ts.map +0 -1
  356. package/dist/adapters/slack/tools/attach.js.map +0 -1
  357. package/dist/agent/catalog.d.ts +0 -22
  358. package/dist/agent/catalog.d.ts.map +0 -1
  359. package/dist/agent/catalog.js +0 -104
  360. package/dist/agent/catalog.js.map +0 -1
  361. package/dist/agent/execution.d.ts +0 -25
  362. package/dist/agent/execution.d.ts.map +0 -1
  363. package/dist/agent/execution.js +0 -171
  364. package/dist/agent/execution.js.map +0 -1
  365. package/dist/agent/presenter.d.ts.map +0 -1
  366. package/dist/agent/presenter.js.map +0 -1
  367. package/dist/agent/prompt.d.ts.map +0 -1
  368. package/dist/agent/prompt.js.map +0 -1
  369. package/dist/agent/runner.d.ts +0 -3
  370. package/dist/agent/runner.d.ts.map +0 -1
  371. package/dist/agent/runner.js +0 -452
  372. package/dist/agent/runner.js.map +0 -1
  373. package/dist/agent/types.d.ts +0 -101
  374. package/dist/agent/types.d.ts.map +0 -1
  375. package/dist/agent/types.js +0 -3
  376. package/dist/agent/types.js.map +0 -1
  377. package/dist/agent-events.d.ts +0 -6
  378. package/dist/agent-events.d.ts.map +0 -1
  379. package/dist/agent-events.js +0 -44
  380. package/dist/agent-events.js.map +0 -1
  381. package/dist/commands/admin.d.ts.map +0 -1
  382. package/dist/commands/admin.js.map +0 -1
  383. package/dist/commands/auto-reply.d.ts +0 -8
  384. package/dist/commands/auto-reply.d.ts.map +0 -1
  385. package/dist/commands/auto-reply.js +0 -65
  386. package/dist/commands/auto-reply.js.map +0 -1
  387. package/dist/commands/login.d.ts.map +0 -1
  388. package/dist/commands/login.js +0 -158
  389. package/dist/commands/login.js.map +0 -1
  390. package/dist/commands/manifest.d.ts.map +0 -1
  391. package/dist/commands/manifest.js.map +0 -1
  392. package/dist/commands/model.d.ts.map +0 -1
  393. package/dist/commands/model.js.map +0 -1
  394. package/dist/commands/new.d.ts.map +0 -1
  395. package/dist/commands/new.js.map +0 -1
  396. package/dist/commands/registry.d.ts.map +0 -1
  397. package/dist/commands/registry.js.map +0 -1
  398. package/dist/commands/sandbox.d.ts.map +0 -1
  399. package/dist/commands/sandbox.js.map +0 -1
  400. package/dist/commands/session-view.d.ts.map +0 -1
  401. package/dist/commands/session-view.js.map +0 -1
  402. package/dist/commands/types.d.ts.map +0 -1
  403. package/dist/commands/types.js.map +0 -1
  404. package/dist/commands/utils.d.ts +0 -11
  405. package/dist/commands/utils.d.ts.map +0 -1
  406. package/dist/commands/utils.js.map +0 -1
  407. package/dist/events.d.ts.map +0 -1
  408. package/dist/events.js.map +0 -1
  409. package/dist/execution-resolver.d.ts +0 -27
  410. package/dist/execution-resolver.d.ts.map +0 -1
  411. package/dist/execution-resolver.js.map +0 -1
  412. package/dist/harness/event-format.d.ts +0 -33
  413. package/dist/harness/event-format.d.ts.map +0 -1
  414. package/dist/harness/event-format.js.map +0 -1
  415. package/dist/harness/session-store.d.ts.map +0 -1
  416. package/dist/harness/session-store.js.map +0 -1
  417. package/dist/harness/settings.d.ts +0 -29
  418. package/dist/harness/settings.d.ts.map +0 -1
  419. package/dist/harness/settings.js +0 -40
  420. package/dist/harness/settings.js.map +0 -1
  421. package/dist/harness/subagent-runner.d.ts.map +0 -1
  422. package/dist/harness/subagent-runner.js.map +0 -1
  423. package/dist/harness/subagent-slots.d.ts +0 -28
  424. package/dist/harness/subagent-slots.d.ts.map +0 -1
  425. package/dist/harness/subagent-slots.js +0 -72
  426. package/dist/harness/subagent-slots.js.map +0 -1
  427. package/dist/harness/usage.d.ts +0 -11
  428. package/dist/harness/usage.d.ts.map +0 -1
  429. package/dist/harness/usage.js +0 -38
  430. package/dist/harness/usage.js.map +0 -1
  431. package/dist/mcp/catalog.d.ts +0 -5
  432. package/dist/mcp/catalog.d.ts.map +0 -1
  433. package/dist/mcp/catalog.js +0 -68
  434. package/dist/mcp/catalog.js.map +0 -1
  435. package/dist/mcp/loader.d.ts +0 -12
  436. package/dist/mcp/loader.d.ts.map +0 -1
  437. package/dist/mcp/loader.js.map +0 -1
  438. package/dist/mcp/open-connector.d.ts.map +0 -1
  439. package/dist/mcp/open-connector.js.map +0 -1
  440. package/dist/mcp/types.d.ts +0 -66
  441. package/dist/mcp/types.d.ts.map +0 -1
  442. package/dist/mcp/types.js.map +0 -1
  443. package/dist/packages/index.d.ts +0 -169
  444. package/dist/packages/index.d.ts.map +0 -1
  445. package/dist/packages/index.js +0 -721
  446. package/dist/packages/index.js.map +0 -1
  447. package/dist/packages/types.d.ts +0 -100
  448. package/dist/packages/types.d.ts.map +0 -1
  449. package/dist/packages/types.js.map +0 -1
  450. package/dist/provisioner.d.ts.map +0 -1
  451. package/dist/provisioner.js.map +0 -1
  452. package/dist/subagent-progress.d.ts +0 -39
  453. package/dist/subagent-progress.d.ts.map +0 -1
  454. package/dist/subagent-progress.js +0 -225
  455. package/dist/subagent-progress.js.map +0 -1
  456. package/dist/tools/bash.d.ts +0 -12
  457. package/dist/tools/bash.d.ts.map +0 -1
  458. package/dist/tools/bash.js +0 -80
  459. package/dist/tools/bash.js.map +0 -1
  460. package/dist/tools/edit.d.ts +0 -11
  461. package/dist/tools/edit.d.ts.map +0 -1
  462. package/dist/tools/edit.js +0 -132
  463. package/dist/tools/edit.js.map +0 -1
  464. package/dist/tools/event.d.ts.map +0 -1
  465. package/dist/tools/event.js +0 -255
  466. package/dist/tools/event.js.map +0 -1
  467. package/dist/tools/generate-image.d.ts.map +0 -1
  468. package/dist/tools/generate-image.js.map +0 -1
  469. package/dist/tools/host-fn-tool.d.ts.map +0 -1
  470. package/dist/tools/host-fn-tool.js.map +0 -1
  471. package/dist/tools/index.d.ts.map +0 -1
  472. package/dist/tools/index.js.map +0 -1
  473. package/dist/tools/react.d.ts.map +0 -1
  474. package/dist/tools/react.js.map +0 -1
  475. package/dist/tools/read.d.ts +0 -12
  476. package/dist/tools/read.d.ts.map +0 -1
  477. package/dist/tools/read.js +0 -140
  478. package/dist/tools/read.js.map +0 -1
  479. package/dist/tools/sandbox.d.ts.map +0 -1
  480. package/dist/tools/sandbox.js.map +0 -1
  481. package/dist/tools/subagent.d.ts.map +0 -1
  482. package/dist/tools/subagent.js.map +0 -1
  483. package/dist/tools/types.d.ts.map +0 -1
  484. package/dist/tools/types.js.map +0 -1
  485. package/dist/tools/write.d.ts +0 -10
  486. package/dist/tools/write.d.ts.map +0 -1
  487. package/dist/tools/write.js +0 -23
  488. package/dist/tools/write.js.map +0 -1
  489. package/dist/trigger.d.ts +0 -23
  490. package/dist/trigger.d.ts.map +0 -1
  491. package/dist/trigger.js +0 -97
  492. package/dist/trigger.js.map +0 -1
  493. package/dist/utils/file-guards.d.ts.map +0 -1
  494. package/dist/utils/file-guards.js.map +0 -1
  495. package/dist/web/admin/portal.d.ts.map +0 -1
  496. package/dist/web/admin/portal.js.map +0 -1
  497. package/dist/web/admin/provider-models.d.ts.map +0 -1
  498. package/dist/web/admin/provider-models.js.map +0 -1
  499. package/dist/web/admin/types.d.ts.map +0 -1
  500. package/dist/web/admin/types.js.map +0 -1
  501. package/dist/web/login/oauth.d.ts.map +0 -1
  502. package/dist/web/login/oauth.js.map +0 -1
  503. package/dist/web/login/portal.d.ts.map +0 -1
  504. package/dist/web/login/portal.js.map +0 -1
  505. package/dist/web/login/types.d.ts.map +0 -1
  506. package/dist/web/login/types.js.map +0 -1
  507. package/dist/web/portal-shell.d.ts.map +0 -1
  508. package/dist/web/portal-shell.js.map +0 -1
  509. package/dist/web/server.d.ts.map +0 -1
  510. package/dist/web/server.js.map +0 -1
  511. package/dist/web/session-view/portal.d.ts.map +0 -1
  512. package/dist/web/session-view/portal.js.map +0 -1
  513. package/dist/web/session-view/types.d.ts.map +0 -1
  514. package/dist/web/session-view/types.js +0 -2
  515. package/dist/web/session-view/types.js.map +0 -1
  516. package/dist/web/token-store.d.ts.map +0 -1
  517. package/dist/web/token-store.js.map +0 -1
  518. package/dist/web/types.d.ts.map +0 -1
  519. package/dist/web/types.js +0 -2
  520. package/dist/web/types.js.map +0 -1
  521. package/dist/workspace-projection/index.d.ts.map +0 -1
  522. package/dist/workspace-projection/index.js.map +0 -1
  523. package/dist/workspace-projection/types.d.ts +0 -29
  524. package/dist/workspace-projection/types.d.ts.map +0 -1
  525. package/dist/workspace-projection/types.js +0 -2
  526. package/dist/workspace-projection/types.js.map +0 -1
  527. /package/dist/{commands → adapters/commands}/admin.d.ts +0 -0
  528. /package/dist/{commands → adapters/commands}/login.d.ts +0 -0
  529. /package/dist/{commands → adapters/commands}/manifest.d.ts +0 -0
  530. /package/dist/{commands → adapters/commands}/new.d.ts +0 -0
  531. /package/dist/{commands → adapters/commands}/registry.d.ts +0 -0
  532. /package/dist/{commands → adapters/commands}/sandbox.d.ts +0 -0
  533. /package/dist/{commands → adapters/commands}/session-view.d.ts +0 -0
  534. /package/dist/{commands → adapters/commands}/types.js +0 -0
  535. /package/dist/{web → adapters/web}/admin/provider-models.js +0 -0
  536. /package/dist/{mcp → adapters/web/admin}/types.js +0 -0
  537. /package/dist/{web → adapters/web}/login/oauth.d.ts +0 -0
  538. /package/dist/{packages → adapters/web/login}/types.js +0 -0
  539. /package/dist/{web → adapters/web}/session-view/portal.d.ts +0 -0
  540. /package/dist/{tools → adapters/web/session-view}/types.js +0 -0
  541. /package/dist/{web → adapters/web}/token-store.d.ts +0 -0
  542. /package/dist/{web → adapters/web}/token-store.js +0 -0
  543. /package/dist/{web → adapters/web}/types.d.ts +0 -0
  544. /package/dist/{web/admin → adapters/web}/types.js +0 -0
  545. /package/dist/{utils/file-guards.d.ts → file-guards.d.ts} +0 -0
  546. /package/dist/{utils/file-guards.js → file-guards.js} +0 -0
  547. /package/dist/{mcp → harness}/open-connector.d.ts +0 -0
  548. /package/dist/{adapters/slack → harness}/tools/attach.d.ts +0 -0
  549. /package/dist/{adapters/slack → harness}/tools/attach.js +0 -0
  550. /package/dist/{tools → harness/tools}/generate-image.d.ts +0 -0
  551. /package/dist/{tools → harness/tools}/generate-image.js +0 -0
  552. /package/dist/{tools → harness/tools}/host-fn-tool.d.ts +0 -0
  553. /package/dist/{tools → harness/tools}/host-fn-tool.js +0 -0
  554. /package/dist/{tools → harness/tools}/react.d.ts +0 -0
  555. /package/dist/{tools → harness/tools}/react.js +0 -0
  556. /package/dist/{web/login → harness/tools}/types.js +0 -0
@@ -11,7 +11,7 @@ import * as log from "../log.js";
11
11
  import { parseGithubConversationId } from "../adapters/github/ids.js";
12
12
  import { legacyConversationCredentialKey } from "../sandbox/identity.js";
13
13
  import { migrateConversationVaultKeys } from "../vault/index.js";
14
- import { atomicWritePrivateFile, isRecord, readTextFileIfExists } from "../utils/file-guards.js";
14
+ import { atomicWritePrivateFile, isRecord, readTextFileIfExists } from "../file-guards.js";
15
15
  // ── Office identity (address & keys) ──────────────────────────────────────────
16
16
  const OFFICE_KEY_VERSION = "v1";
17
17
  const OFFICE_KEY_DOMAIN = "office-address-v1";
@@ -47,20 +47,18 @@ export function assertPlatformName(value) {
47
47
  throw new Error(`Unsupported platform: ${JSON.stringify(value)}`);
48
48
  return value;
49
49
  }
50
+ /** Path separators and the C0/C1 control ranges are never allowed in an id. */
51
+ function isUnsafeConversationIdChar(character) {
52
+ const code = character.codePointAt(0) ?? 0;
53
+ return character === "/" || character === "\\" || code <= 0x1f || (code >= 0x7f && code <= 0x9f);
54
+ }
50
55
  /** Validate a raw platform conversation identifier before it enters storage. */
51
56
  export function assertConversationId(value) {
52
57
  if (value.length === 0 || value === "." || value === "..") {
53
58
  throw new Error("Conversation id must be non-empty and not a path marker");
54
59
  }
55
- for (const character of value) {
56
- const code = character.codePointAt(0) ?? 0;
57
- if (character === "/" ||
58
- character === "\\" ||
59
- code === 0 ||
60
- code <= 0x1f ||
61
- (code >= 0x7f && code <= 0x9f)) {
62
- throw new Error("Conversation id must not contain path separators or control characters");
63
- }
60
+ if ([...value].some(isUnsafeConversationIdChar)) {
61
+ throw new Error("Conversation id must not contain path separators or control characters");
64
62
  }
65
63
  return value;
66
64
  }
@@ -85,9 +83,8 @@ export function officeDir(workspaceRoot, address) {
85
83
  /**
86
84
  * Resolve the host-only state directory for an office.
87
85
  *
88
- * Transitional: settings/package callers that only hold a
89
- * `stateDir` string keep using this until their option bags carry an
90
- * `Office` value (which exposes the same path as `stateDir`).
86
+ * Settings and migration callers that only hold a `stateDir` string use this
87
+ * when no materialized `Office` value is available.
91
88
  */
92
89
  export function officeStateDir(stateDir, address) {
93
90
  return join(stateDir, "conversations", officeKey(address));
@@ -552,14 +549,16 @@ function parseOfficeRecord(value, path) {
552
549
  recordedAt: value.recordedAt,
553
550
  });
554
551
  }
555
- function parseRecord(value, path, enabledPlatforms) {
556
- if (!isRecord(value))
557
- throw new Error(`Invalid office migration record in ${path}`);
558
- if (typeof value.rawConversationId !== "string" ||
559
- typeof value.sourceDir !== "string" ||
560
- typeof value.workspaceRoot !== "string" ||
561
- typeof value.status !== "string" ||
562
- typeof value.updatedAt !== "string") {
552
+ function hasMigrationStrings(value) {
553
+ return (typeof value.rawConversationId === "string" &&
554
+ typeof value.sourceDir === "string" &&
555
+ typeof value.workspaceRoot === "string" &&
556
+ typeof value.status === "string" &&
557
+ typeof value.updatedAt === "string");
558
+ }
559
+ /** Validate the fields every stored migration record must carry. */
560
+ function parseMigrationFields(value, path) {
561
+ if (!hasMigrationStrings(value)) {
563
562
  throw new Error(`Invalid office migration fields in ${path}`);
564
563
  }
565
564
  assertConversationId(value.rawConversationId);
@@ -570,44 +569,66 @@ function parseRecord(value, path, enabledPlatforms) {
570
569
  if (!MIGRATION_STATUSES.has(value.status)) {
571
570
  throw new Error(`Invalid office migration status in ${path}`);
572
571
  }
573
- const ownerPlatform = optionalPlatform(value.ownerPlatform);
574
- const targetDir = optionalString(value.targetDir);
575
- const error = optionalString(value.error);
576
- if (ownerPlatform !== undefined && !enabledPlatforms.includes(ownerPlatform)) {
577
- throw new Error(`Office migration owner is not enabled in ${path}`);
578
- }
579
- if (value.status === "needs-owner" && (ownerPlatform !== undefined || targetDir !== undefined)) {
572
+ return {
573
+ rawConversationId: value.rawConversationId,
574
+ sourceDir: value.sourceDir,
575
+ workspaceRoot: value.workspaceRoot,
576
+ status: value.status,
577
+ updatedAt: value.updatedAt,
578
+ };
579
+ }
580
+ /**
581
+ * Ownership rules by status: `needs-owner` must carry neither owner nor
582
+ * target, `failed` may carry either, every other status must carry both.
583
+ */
584
+ function assertOwnershipMatchesStatus(status, ownerPlatform, targetDir, path) {
585
+ const owned = ownerPlatform !== undefined;
586
+ const targeted = targetDir !== undefined;
587
+ if (status === "needs-owner" && (owned || targeted)) {
580
588
  throw new Error(`Needs-owner migration cannot have an owner or target in ${path}`);
581
589
  }
582
- if (value.status !== "needs-owner" &&
583
- value.status !== "failed" &&
584
- (ownerPlatform === undefined || targetDir === undefined)) {
590
+ if (status !== "needs-owner" && status !== "failed" && !(owned && targeted)) {
585
591
  throw new Error(`Prepared office migration is missing ownership in ${path}`);
586
592
  }
587
- if (ownerPlatform === undefined && targetDir !== undefined) {
593
+ if (!owned && targeted) {
588
594
  throw new Error(`Office migration target has no owner in ${path}`);
589
595
  }
596
+ }
597
+ function parseRecord(value, path, enabledPlatforms) {
598
+ if (!isRecord(value))
599
+ throw new Error(`Invalid office migration record in ${path}`);
600
+ const fields = parseMigrationFields(value, path);
601
+ const ownerPlatform = optionalPlatform(value.ownerPlatform);
602
+ const targetDir = optionalString(value.targetDir);
603
+ const error = optionalString(value.error);
604
+ if (ownerPlatform !== undefined && !enabledPlatforms.includes(ownerPlatform)) {
605
+ throw new Error(`Office migration owner is not enabled in ${path}`);
606
+ }
607
+ assertOwnershipMatchesStatus(fields.status, ownerPlatform, targetDir, path);
590
608
  const expectedTargetDir = ownerPlatform
591
- ? officeDir(value.workspaceRoot, {
609
+ ? officeDir(fields.workspaceRoot, {
592
610
  platform: ownerPlatform,
593
- conversationId: value.rawConversationId,
611
+ conversationId: fields.rawConversationId,
594
612
  })
595
613
  : undefined;
596
614
  if (targetDir !== expectedTargetDir) {
597
615
  throw new Error(`Office migration target does not match its office address in ${path}`);
598
616
  }
599
- if (value.status === "failed" && !error) {
617
+ if (fields.status === "failed" && !error) {
600
618
  throw new Error(`Failed office migration is missing an error in ${path}`);
601
619
  }
620
+ return buildMigrationRecord(fields, ownerPlatform, expectedTargetDir, error);
621
+ }
622
+ function buildMigrationRecord(fields, ownerPlatform, targetDir, error) {
602
623
  return makeRecord({
603
- rawConversationId: value.rawConversationId,
604
- sourceDir: value.sourceDir,
605
- workspaceRoot: value.workspaceRoot,
624
+ rawConversationId: fields.rawConversationId,
625
+ sourceDir: fields.sourceDir,
626
+ workspaceRoot: fields.workspaceRoot,
606
627
  ...(ownerPlatform ? { ownerPlatform } : {}),
607
- ...(expectedTargetDir ? { targetDir: expectedTargetDir } : {}),
608
- status: value.status,
628
+ ...(targetDir ? { targetDir } : {}),
629
+ status: fields.status,
609
630
  ...(error ? { error } : {}),
610
- updatedAt: value.updatedAt,
631
+ updatedAt: fields.updatedAt,
611
632
  });
612
633
  }
613
634
  function optionalPlatform(value) {
@@ -652,51 +673,44 @@ function assertRegularDirectory(path, label) {
652
673
  throw new Error(`${label} must be a regular directory: ${path}`);
653
674
  }
654
675
  }
655
- function assertRegistryFileSafe(path) {
676
+ /** `lstat` that reports a missing path as undefined; other errors still throw. */
677
+ function lstatIfExists(path) {
656
678
  try {
657
- const stat = lstatSync(path);
658
- if (stat.isSymbolicLink() || !stat.isFile()) {
659
- throw new Error(`Office registry must be a regular file: ${path}`);
660
- }
679
+ return lstatSync(path);
661
680
  }
662
681
  catch (error) {
663
682
  if (isErrno(error, "ENOENT"))
664
- return;
683
+ return undefined;
665
684
  throw error;
666
685
  }
667
686
  }
668
- function assertPathIfPresent(path, label) {
669
- try {
670
- const stat = lstatSync(path);
671
- if (stat.isSymbolicLink() || !stat.isDirectory()) {
672
- throw new Error(`${label} must be a regular directory: ${path}`);
673
- }
687
+ function assertRegistryFileSafe(path) {
688
+ const stat = lstatIfExists(path);
689
+ if (stat && (stat.isSymbolicLink() || !stat.isFile())) {
690
+ throw new Error(`Office registry must be a regular file: ${path}`);
674
691
  }
675
- catch (error) {
676
- if (isErrno(error, "ENOENT"))
677
- return;
678
- throw error;
692
+ }
693
+ function assertPathIfPresent(path, label) {
694
+ const stat = lstatIfExists(path);
695
+ if (stat && (stat.isSymbolicLink() || !stat.isDirectory())) {
696
+ throw new Error(`${label} must be a regular directory: ${path}`);
679
697
  }
680
698
  }
681
699
  function assertPathAbsent(path, label) {
682
- try {
683
- lstatSync(path);
684
- }
685
- catch (error) {
686
- if (isErrno(error, "ENOENT"))
687
- return;
688
- throw error;
689
- }
690
- throw new Error(`${label} must be absent: ${path}`);
700
+ if (lstatIfExists(path))
701
+ throw new Error(`${label} must be absent: ${path}`);
691
702
  }
692
703
  function pathExists(path) {
704
+ return lstatIfExists(path) !== undefined;
705
+ }
706
+ /** Create the lock directory and stamp it with our token, unwinding on failure. */
707
+ function claimRegistryLock(lockPath, token) {
708
+ mkdirSync(lockPath, { mode: 0o700 });
693
709
  try {
694
- lstatSync(path);
695
- return true;
710
+ writeFileSync(join(lockPath, "owner"), `${token}\n`, { mode: 0o600 });
696
711
  }
697
712
  catch (error) {
698
- if (isErrno(error, "ENOENT"))
699
- return false;
713
+ rmSync(lockPath, { recursive: true, force: true });
700
714
  throw error;
701
715
  }
702
716
  }
@@ -705,30 +719,30 @@ function acquireRegistryLease(lockPath, timeoutMs) {
705
719
  const token = `${process.pid}:${randomBytes(8).toString("hex")}`;
706
720
  for (;;) {
707
721
  try {
708
- mkdirSync(lockPath, { mode: 0o700 });
709
- try {
710
- writeFileSync(join(lockPath, "owner"), `${token}\n`, { mode: 0o600 });
711
- }
712
- catch (error) {
713
- rmSync(lockPath, { recursive: true, force: true });
714
- throw error;
715
- }
722
+ claimRegistryLock(lockPath, token);
716
723
  return () => releaseRegistryLease(lockPath, token);
717
724
  }
718
725
  catch (error) {
719
- if (!isErrno(error, "EEXIST"))
720
- throw error;
721
- if (registryLockIsStale(lockPath)) {
722
- rmSync(lockPath, { recursive: true, force: true });
723
- continue;
724
- }
725
- if (Date.now() >= deadline) {
726
- throw new Error(`Timed out acquiring office registry lock: ${lockPath}`, { cause: error });
727
- }
728
- sleepSync(REGISTRY_LOCK_RETRY_MS);
726
+ awaitFreeRegistryLock(lockPath, deadline, error);
729
727
  }
730
728
  }
731
729
  }
730
+ /**
731
+ * Handle one failed lock attempt: rethrow anything but a held lock, clear a
732
+ * stale lock so the next attempt wins, else wait until the deadline passes.
733
+ */
734
+ function awaitFreeRegistryLock(lockPath, deadline, error) {
735
+ if (!isErrno(error, "EEXIST"))
736
+ throw error;
737
+ if (registryLockIsStale(lockPath)) {
738
+ rmSync(lockPath, { recursive: true, force: true });
739
+ return;
740
+ }
741
+ if (Date.now() >= deadline) {
742
+ throw new Error(`Timed out acquiring office registry lock: ${lockPath}`, { cause: error });
743
+ }
744
+ sleepSync(REGISTRY_LOCK_RETRY_MS);
745
+ }
732
746
  function releaseRegistryLease(lockPath, token) {
733
747
  try {
734
748
  if (readFileSync(join(lockPath, "owner"), "utf8").trim() === token) {
@@ -866,41 +880,51 @@ function recoverInterruptedMoves(registry, summary) {
866
880
  for (const record of registry.getState().migrations) {
867
881
  if (record.status !== "moving")
868
882
  continue;
869
- const targetDir = record.targetDir;
870
- if (!targetDir) {
871
- registry.markFailed(record.rawConversationId, "Moving record has no target directory");
872
- continue;
873
- }
874
- const sourceExists = pathExists(record.sourceDir);
875
- const targetExists = pathExists(targetDir);
876
- if (sourceExists && targetExists) {
877
- registry.markFailed(record.rawConversationId, "Both legacy source and office target exist; merge them manually");
878
- continue;
879
- }
880
- if (!sourceExists && !targetExists) {
881
- registry.markFailed(record.rawConversationId, "Neither legacy source nor office target exists");
883
+ const failure = finishInterruptedMove(record);
884
+ if (failure) {
885
+ registry.markFailed(record.rawConversationId, failure);
882
886
  continue;
883
887
  }
884
- if (sourceExists)
885
- renameSync(record.sourceDir, targetDir);
886
888
  registry.markCommitted(record.rawConversationId);
887
889
  recordMigratedOffice(registry, record);
888
890
  summary.recovered.push(record.rawConversationId);
889
891
  log.logInfo(`[office] Recovered interrupted migration: ${record.rawConversationId}`);
890
892
  }
891
893
  }
894
+ /** Complete one interrupted rename; returns the failure reason when it cannot. */
895
+ function finishInterruptedMove(record) {
896
+ const targetDir = record.targetDir;
897
+ if (!targetDir)
898
+ return "Moving record has no target directory";
899
+ const sourceExists = pathExists(record.sourceDir);
900
+ const targetExists = pathExists(targetDir);
901
+ if (sourceExists && targetExists) {
902
+ return "Both legacy source and office target exist; merge them manually";
903
+ }
904
+ if (!sourceExists && !targetExists)
905
+ return "Neither legacy source nor office target exists";
906
+ if (sourceExists)
907
+ renameSync(record.sourceDir, targetDir);
908
+ return undefined;
909
+ }
910
+ /**
911
+ * A legacy directory is claimable unless it already failed (reported via
912
+ * summary.failed). One that reappears after a committed move is a different
913
+ * (or resurrected) office the runtime can no longer see, so refusing to boot
914
+ * beats silently ignoring its data.
915
+ */
916
+ function isClaimableLegacyDir(registry, workspaceRoot, rawConversationId) {
917
+ const existing = registry.getMigration(rawConversationId);
918
+ if (existing?.status === "committed") {
919
+ throw new Error(`Legacy office directory reappeared after migration: ${join(workspaceRoot, rawConversationId)}`);
920
+ }
921
+ return existing?.status !== "failed";
922
+ }
892
923
  /** Scan the workspace root and move every claimable legacy office directory. */
893
924
  function claimAndMoveLegacyDirs(registry, workspaceRoot, summary) {
894
925
  for (const rawConversationId of listLegacyOfficeDirs(workspaceRoot)) {
895
- const existing = registry.getMigration(rawConversationId);
896
- if (existing?.status === "committed") {
897
- // The move already happened; a raw-id dir with this name reappearing
898
- // afterwards is a different (or resurrected) office the runtime can no
899
- // longer see. Refusing to boot beats silently ignoring its data.
900
- throw new Error(`Legacy office directory reappeared after migration: ${join(workspaceRoot, rawConversationId)}`);
901
- }
902
- if (existing?.status === "failed")
903
- continue; // reported via summary.failed
926
+ if (!isClaimableLegacyDir(registry, workspaceRoot, rawConversationId))
927
+ continue;
904
928
  const record = registry.prepareLegacyMigration({
905
929
  rawConversationId,
906
930
  sourceDir: join(workspaceRoot, rawConversationId),
@@ -963,26 +987,27 @@ function recordMigratedOffice(registry, record) {
963
987
  * are (an operator can still claim one explicitly via `mikan office claim`).
964
988
  */
965
989
  function listLegacyOfficeDirs(workspaceRoot) {
966
- const candidates = [];
967
- for (const entry of readdirSync(workspaceRoot, { withFileTypes: true })) {
968
- if (entry.name.startsWith("."))
969
- continue;
970
- if (RESERVED_WORKSPACE_NAMES.has(entry.name))
971
- continue;
972
- if (isOfficeKey(entry.name))
973
- continue;
974
- if (entry.isSymbolicLink()) {
975
- throw new Error(`Workspace entry must not be a symlink: ${join(workspaceRoot, entry.name)}`);
976
- }
977
- if (!entry.isDirectory())
978
- continue;
979
- if (!looksLikeConversationOffice(join(workspaceRoot, entry.name))) {
980
- log.logInfo(`[office] Skipping non-office workspace directory (no log.jsonl or sessions/): ${entry.name}`);
981
- continue;
982
- }
983
- candidates.push(entry.name);
990
+ return readdirSync(workspaceRoot, { withFileTypes: true })
991
+ .filter((entry) => isLegacyOfficeDir(workspaceRoot, entry))
992
+ .map((entry) => entry.name)
993
+ .toSorted();
994
+ }
995
+ function isLegacyOfficeDir(workspaceRoot, entry) {
996
+ if (entry.name.startsWith("."))
997
+ return false;
998
+ if (RESERVED_WORKSPACE_NAMES.has(entry.name))
999
+ return false;
1000
+ if (isOfficeKey(entry.name))
1001
+ return false;
1002
+ if (entry.isSymbolicLink()) {
1003
+ throw new Error(`Workspace entry must not be a symlink: ${join(workspaceRoot, entry.name)}`);
984
1004
  }
985
- return candidates.toSorted();
1005
+ if (!entry.isDirectory())
1006
+ return false;
1007
+ if (looksLikeConversationOffice(join(workspaceRoot, entry.name)))
1008
+ return true;
1009
+ log.logInfo(`[office] Skipping non-office workspace directory (no log.jsonl or sessions/): ${entry.name}`);
1010
+ return false;
986
1011
  }
987
1012
  function looksLikeConversationOffice(dir) {
988
1013
  return existsSync(join(dir, "log.jsonl")) || existsSync(join(dir, "sessions"));
@@ -993,17 +1018,24 @@ export function formatUnmigratedOfficesError(summary) {
993
1018
  if (summary.unowned.length > 0) {
994
1019
  lines.push("", "These legacy conversation directories have no owning platform (several", "platforms are enabled, so ownership cannot be inferred):", ...summary.unowned.map((id) => ` - ${id}`), "", "Assign each one with:", " mikan office claim <conversationId> <platform>");
995
1020
  }
996
- if (summary.failed.length > 0) {
997
- lines.push("", "These migrations previously failed and need manual repair (see", "office-registry.json in the state dir for each error):", ...summary.failed.map((id) => ` - ${id}`));
998
- }
999
- if (summary.vaultConflicts.length > 0) {
1000
- lines.push("", "These conversations have credentials under both the legacy and the", "office-key vault directory; merge them manually under <state-dir>/vaults:", ...summary.vaultConflicts.map((id) => ` - ${id}`));
1001
- }
1002
- if (summary.stateDirConflicts.length > 0) {
1003
- lines.push("", "These conversations have host state under both the legacy and the", "office-key directory; merge them manually under <state-dir>/conversations:", ...summary.stateDirConflicts.map((id) => ` - ${id}`));
1004
- }
1021
+ lines.push(...conflictSection(summary.failed, [
1022
+ "These migrations previously failed and need manual repair (see",
1023
+ "office-registry.json in the state dir for each error):",
1024
+ ]), ...conflictSection(summary.vaultConflicts, [
1025
+ "These conversations have credentials under both the legacy and the",
1026
+ "office-key vault directory; merge them manually under <state-dir>/vaults:",
1027
+ ]), ...conflictSection(summary.stateDirConflicts, [
1028
+ "These conversations have host state under both the legacy and the",
1029
+ "office-key directory; merge them manually under <state-dir>/conversations:",
1030
+ ]));
1005
1031
  return lines.join("\n");
1006
1032
  }
1033
+ /** One blank-separated "these need manual work" block, empty when nothing does. */
1034
+ function conflictSection(ids, explanation) {
1035
+ if (ids.length === 0)
1036
+ return [];
1037
+ return ["", ...explanation, ...ids.map((id) => ` - ${id}`)];
1038
+ }
1007
1039
  /**
1008
1040
  * Bind-spec translator for the container layout migration: rewrites every
1009
1041
  * host path the office migration renamed — workspace dirs, per-conversation