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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (471) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/adapters/commands/admin.js +1 -1
  3. package/dist/adapters/commands/admin.js.map +1 -1
  4. package/dist/adapters/commands/login.d.ts.map +1 -1
  5. package/dist/adapters/commands/login.js +3 -2
  6. package/dist/adapters/commands/login.js.map +1 -1
  7. package/dist/adapters/commands/manifest.d.ts +0 -1
  8. package/dist/adapters/commands/manifest.d.ts.map +1 -1
  9. package/dist/adapters/commands/manifest.js.map +1 -1
  10. package/dist/adapters/commands/model.d.ts +0 -1
  11. package/dist/adapters/commands/model.d.ts.map +1 -1
  12. package/dist/adapters/commands/model.js +8 -20
  13. package/dist/adapters/commands/model.js.map +1 -1
  14. package/dist/adapters/commands/new.js +1 -1
  15. package/dist/adapters/commands/new.js.map +1 -1
  16. package/dist/adapters/commands/registry.js +1 -1
  17. package/dist/adapters/commands/registry.js.map +1 -1
  18. package/dist/adapters/commands/sandbox.d.ts +0 -1
  19. package/dist/adapters/commands/sandbox.d.ts.map +1 -1
  20. package/dist/adapters/commands/sandbox.js +1 -1
  21. package/dist/adapters/commands/sandbox.js.map +1 -1
  22. package/dist/adapters/commands/types.d.ts +6 -17
  23. package/dist/adapters/commands/types.d.ts.map +1 -1
  24. package/dist/adapters/commands/types.js.map +1 -1
  25. package/dist/adapters/commands/utils.d.ts +1 -1
  26. package/dist/adapters/commands/utils.d.ts.map +1 -1
  27. package/dist/adapters/commands/utils.js.map +1 -1
  28. package/dist/adapters/discord/bot.d.ts +4 -10
  29. package/dist/adapters/discord/bot.d.ts.map +1 -1
  30. package/dist/adapters/discord/bot.js +26 -22
  31. package/dist/adapters/discord/bot.js.map +1 -1
  32. package/dist/adapters/discord/components.d.ts +0 -1
  33. package/dist/adapters/discord/components.d.ts.map +1 -1
  34. package/dist/adapters/discord/components.js.map +1 -1
  35. package/dist/adapters/discord/context.d.ts +3 -3
  36. package/dist/adapters/discord/context.d.ts.map +1 -1
  37. package/dist/adapters/discord/context.js +1 -1
  38. package/dist/adapters/discord/context.js.map +1 -1
  39. package/dist/adapters/discord/types.d.ts +83 -1
  40. package/dist/adapters/discord/types.d.ts.map +1 -1
  41. package/dist/adapters/discord/types.js.map +1 -1
  42. package/dist/adapters/github/bot.d.ts +4 -5
  43. package/dist/adapters/github/bot.d.ts.map +1 -1
  44. package/dist/adapters/github/bot.js +10 -10
  45. package/dist/adapters/github/bot.js.map +1 -1
  46. package/dist/adapters/github/client.js +1 -1
  47. package/dist/adapters/github/client.js.map +1 -1
  48. package/dist/adapters/github/context.d.ts +3 -4
  49. package/dist/adapters/github/context.d.ts.map +1 -1
  50. package/dist/adapters/github/context.js +1 -2
  51. package/dist/adapters/github/context.js.map +1 -1
  52. package/dist/adapters/github/github-ops.d.ts +5 -6
  53. package/dist/adapters/github/github-ops.d.ts.map +1 -1
  54. package/dist/adapters/github/github-ops.js +1 -2
  55. package/dist/adapters/github/github-ops.js.map +1 -1
  56. package/dist/adapters/github/ids.d.ts +0 -3
  57. package/dist/adapters/github/ids.d.ts.map +1 -1
  58. package/dist/adapters/github/ids.js +0 -19
  59. package/dist/adapters/github/ids.js.map +1 -1
  60. package/dist/adapters/github/repo.d.ts +1 -1
  61. package/dist/adapters/github/repo.js.map +1 -1
  62. package/dist/adapters/github/tools/checks.d.ts +6 -4
  63. package/dist/adapters/github/tools/checks.d.ts.map +1 -1
  64. package/dist/adapters/github/tools/checks.js +4 -3
  65. package/dist/adapters/github/tools/checks.js.map +1 -1
  66. package/dist/adapters/github/tools/issue.d.ts +10 -8
  67. package/dist/adapters/github/tools/issue.d.ts.map +1 -1
  68. package/dist/adapters/github/tools/issue.js +4 -3
  69. package/dist/adapters/github/tools/issue.js.map +1 -1
  70. package/dist/adapters/github/tools/pr.d.ts +8 -6
  71. package/dist/adapters/github/tools/pr.d.ts.map +1 -1
  72. package/dist/adapters/github/tools/pr.js +4 -3
  73. package/dist/adapters/github/tools/pr.js.map +1 -1
  74. package/dist/adapters/github/tools/read.d.ts +9 -7
  75. package/dist/adapters/github/tools/read.d.ts.map +1 -1
  76. package/dist/adapters/github/tools/read.js +4 -3
  77. package/dist/adapters/github/tools/read.js.map +1 -1
  78. package/dist/adapters/github/tools/review-reply.d.ts +6 -4
  79. package/dist/adapters/github/tools/review-reply.d.ts.map +1 -1
  80. package/dist/adapters/github/tools/review-reply.js +4 -3
  81. package/dist/adapters/github/tools/review-reply.js.map +1 -1
  82. package/dist/adapters/github/tools/sync.d.ts +5 -3
  83. package/dist/adapters/github/tools/sync.d.ts.map +1 -1
  84. package/dist/adapters/github/tools/sync.js +4 -3
  85. package/dist/adapters/github/tools/sync.js.map +1 -1
  86. package/dist/adapters/github/types.d.ts +5 -4
  87. package/dist/adapters/github/types.d.ts.map +1 -1
  88. package/dist/adapters/github/types.js.map +1 -1
  89. package/dist/adapters/github/webhook.d.ts +0 -1
  90. package/dist/adapters/github/webhook.d.ts.map +1 -1
  91. package/dist/adapters/github/webhook.js.map +1 -1
  92. package/dist/adapters/intake.d.ts +1 -1
  93. package/dist/adapters/intake.d.ts.map +1 -1
  94. package/dist/adapters/intake.js.map +1 -1
  95. package/dist/adapters/markdown-tables.d.ts +0 -1
  96. package/dist/adapters/markdown-tables.d.ts.map +1 -1
  97. package/dist/adapters/markdown-tables.js.map +1 -1
  98. package/dist/adapters/messages.d.ts +1 -1
  99. package/dist/adapters/messages.d.ts.map +1 -1
  100. package/dist/adapters/messages.js.map +1 -1
  101. package/dist/adapters/progressive-renderer.d.ts +1 -1
  102. package/dist/adapters/progressive-renderer.d.ts.map +1 -1
  103. package/dist/adapters/progressive-renderer.js +8 -6
  104. package/dist/adapters/progressive-renderer.js.map +1 -1
  105. package/dist/adapters/shared.d.ts +6 -4
  106. package/dist/adapters/shared.d.ts.map +1 -1
  107. package/dist/adapters/shared.js +39 -25
  108. package/dist/adapters/shared.js.map +1 -1
  109. package/dist/adapters/slack/assistant.d.ts +0 -1
  110. package/dist/adapters/slack/assistant.d.ts.map +1 -1
  111. package/dist/adapters/slack/assistant.js +2 -1
  112. package/dist/adapters/slack/assistant.js.map +1 -1
  113. package/dist/adapters/slack/bot.d.ts +5 -10
  114. package/dist/adapters/slack/bot.d.ts.map +1 -1
  115. package/dist/adapters/slack/bot.js +84 -86
  116. package/dist/adapters/slack/bot.js.map +1 -1
  117. package/dist/adapters/slack/context.d.ts +3 -5
  118. package/dist/adapters/slack/context.d.ts.map +1 -1
  119. package/dist/adapters/slack/context.js +1 -2
  120. package/dist/adapters/slack/context.js.map +1 -1
  121. package/dist/adapters/slack/jev-context.d.ts.map +1 -1
  122. package/dist/adapters/slack/jev-context.js +4 -2
  123. package/dist/adapters/slack/jev-context.js.map +1 -1
  124. package/dist/adapters/slack/response-lifecycle.d.ts +3 -4
  125. package/dist/adapters/slack/response-lifecycle.d.ts.map +1 -1
  126. package/dist/adapters/slack/response-lifecycle.js +5 -3
  127. package/dist/adapters/slack/response-lifecycle.js.map +1 -1
  128. package/dist/adapters/slack/session.d.ts +1 -1
  129. package/dist/adapters/slack/session.d.ts.map +1 -1
  130. package/dist/adapters/slack/session.js.map +1 -1
  131. package/dist/adapters/slack/task-intent.js +1 -1
  132. package/dist/adapters/slack/task-intent.js.map +1 -1
  133. package/dist/adapters/slack/task-status.d.ts.map +1 -1
  134. package/dist/adapters/slack/task-status.js +2 -1
  135. package/dist/adapters/slack/task-status.js.map +1 -1
  136. package/dist/adapters/slack/tool-pack.d.ts +0 -1
  137. package/dist/adapters/slack/tool-pack.d.ts.map +1 -1
  138. package/dist/adapters/slack/tool-pack.js +2 -1
  139. package/dist/adapters/slack/tool-pack.js.map +1 -1
  140. package/dist/adapters/slack/tools/blockkit.d.ts +9 -7
  141. package/dist/adapters/slack/tools/blockkit.d.ts.map +1 -1
  142. package/dist/adapters/slack/tools/blockkit.js +6 -4
  143. package/dist/adapters/slack/tools/blockkit.js.map +1 -1
  144. package/dist/adapters/slack/types.d.ts +36 -2
  145. package/dist/adapters/slack/types.d.ts.map +1 -1
  146. package/dist/adapters/slack/types.js.map +1 -1
  147. package/dist/adapters/telegram/bot.d.ts +3 -8
  148. package/dist/adapters/telegram/bot.d.ts.map +1 -1
  149. package/dist/adapters/telegram/bot.js +11 -11
  150. package/dist/adapters/telegram/bot.js.map +1 -1
  151. package/dist/adapters/telegram/context.d.ts +3 -3
  152. package/dist/adapters/telegram/context.d.ts.map +1 -1
  153. package/dist/adapters/telegram/context.js +2 -2
  154. package/dist/adapters/telegram/context.js.map +1 -1
  155. package/dist/adapters/telegram/types.d.ts +24 -1
  156. package/dist/adapters/telegram/types.d.ts.map +1 -1
  157. package/dist/adapters/telegram/types.js.map +1 -1
  158. package/dist/adapters/types.d.ts +1 -2
  159. package/dist/adapters/types.d.ts.map +1 -1
  160. package/dist/adapters/types.js.map +1 -1
  161. package/dist/adapters/web/admin/client-assets.d.ts +1 -1
  162. package/dist/adapters/web/admin/client-assets.d.ts.map +1 -1
  163. package/dist/adapters/web/admin/client-assets.js +3 -2
  164. package/dist/adapters/web/admin/client-assets.js.map +1 -1
  165. package/dist/adapters/web/admin/portal.d.ts +4 -11
  166. package/dist/adapters/web/admin/portal.d.ts.map +1 -1
  167. package/dist/adapters/web/admin/portal.js +27 -30
  168. package/dist/adapters/web/admin/portal.js.map +1 -1
  169. package/dist/adapters/web/admin/provider-models.d.ts +1 -1
  170. package/dist/adapters/web/admin/provider-models.d.ts.map +1 -1
  171. package/dist/adapters/web/admin/provider-models.js.map +1 -1
  172. package/dist/adapters/web/admin/types.d.ts +10 -4
  173. package/dist/adapters/web/admin/types.d.ts.map +1 -1
  174. package/dist/adapters/web/admin/types.js.map +1 -1
  175. package/dist/adapters/web/login/oauth.d.ts +0 -1
  176. package/dist/adapters/web/login/oauth.d.ts.map +1 -1
  177. package/dist/adapters/web/login/oauth.js +12 -12
  178. package/dist/adapters/web/login/oauth.js.map +1 -1
  179. package/dist/adapters/web/login/portal.d.ts +3 -6
  180. package/dist/adapters/web/login/portal.d.ts.map +1 -1
  181. package/dist/adapters/web/login/portal.js +5 -4
  182. package/dist/adapters/web/login/portal.js.map +1 -1
  183. package/dist/adapters/web/login/types.d.ts +1 -1
  184. package/dist/adapters/web/login/types.d.ts.map +1 -1
  185. package/dist/adapters/web/login/types.js.map +1 -1
  186. package/dist/adapters/web/portal-shell.d.ts +0 -1
  187. package/dist/adapters/web/portal-shell.d.ts.map +1 -1
  188. package/dist/adapters/web/portal-shell.js.map +1 -1
  189. package/dist/adapters/web/server.d.ts +6 -6
  190. package/dist/adapters/web/server.d.ts.map +1 -1
  191. package/dist/adapters/web/server.js +3 -2
  192. package/dist/adapters/web/server.js.map +1 -1
  193. package/dist/adapters/web/session-view/portal.d.ts +2 -3
  194. package/dist/adapters/web/session-view/portal.d.ts.map +1 -1
  195. package/dist/adapters/web/session-view/portal.js +12 -12
  196. package/dist/adapters/web/session-view/portal.js.map +1 -1
  197. package/dist/adapters/web/session-view/types.d.ts +1 -11
  198. package/dist/adapters/web/session-view/types.d.ts.map +1 -1
  199. package/dist/adapters/web/session-view/types.js.map +1 -1
  200. package/dist/adapters/web/token-store.d.ts +0 -1
  201. package/dist/adapters/web/token-store.d.ts.map +1 -1
  202. package/dist/adapters/web/token-store.js.map +1 -1
  203. package/dist/cli/boot.d.ts +0 -1
  204. package/dist/cli/boot.d.ts.map +1 -1
  205. package/dist/cli/boot.js +4 -4
  206. package/dist/cli/boot.js.map +1 -1
  207. package/dist/cli/office.d.ts.map +1 -1
  208. package/dist/cli/office.js +4 -3
  209. package/dist/cli/office.js.map +1 -1
  210. package/dist/cli/onboard.js +1 -1
  211. package/dist/cli/onboard.js.map +1 -1
  212. package/dist/cli/sandbox.d.ts.map +1 -1
  213. package/dist/cli/sandbox.js +2 -1
  214. package/dist/cli/sandbox.js.map +1 -1
  215. package/dist/cli/sessions.d.ts.map +1 -1
  216. package/dist/cli/sessions.js +2 -1
  217. package/dist/cli/sessions.js.map +1 -1
  218. package/dist/env-manifest.d.ts +1 -1
  219. package/dist/env-manifest.d.ts.map +1 -1
  220. package/dist/env-manifest.js.map +1 -1
  221. package/dist/events/index.d.ts +3 -2
  222. package/dist/events/index.d.ts.map +1 -1
  223. package/dist/events/index.js +11 -10
  224. package/dist/events/index.js.map +1 -1
  225. package/dist/events/scheduler.d.ts +1 -2
  226. package/dist/events/scheduler.d.ts.map +1 -1
  227. package/dist/events/scheduler.js +4 -4
  228. package/dist/events/scheduler.js.map +1 -1
  229. package/dist/file-guards.d.ts +8 -6
  230. package/dist/file-guards.d.ts.map +1 -1
  231. package/dist/file-guards.js +10 -15
  232. package/dist/file-guards.js.map +1 -1
  233. package/dist/harness/execution-env.d.ts +1 -1
  234. package/dist/harness/execution-env.d.ts.map +1 -1
  235. package/dist/harness/execution-env.js +7 -6
  236. package/dist/harness/execution-env.js.map +1 -1
  237. package/dist/harness/execution-resolver.d.ts +4 -6
  238. package/dist/harness/execution-resolver.d.ts.map +1 -1
  239. package/dist/harness/execution-resolver.js +1 -1
  240. package/dist/harness/execution-resolver.js.map +1 -1
  241. package/dist/harness/jev.d.ts +1 -1
  242. package/dist/harness/jev.d.ts.map +1 -1
  243. package/dist/harness/jev.js +1 -4
  244. package/dist/harness/jev.js.map +1 -1
  245. package/dist/harness/mcp-result.d.ts.map +1 -1
  246. package/dist/harness/mcp-result.js +15 -7
  247. package/dist/harness/mcp-result.js.map +1 -1
  248. package/dist/harness/mcp.d.ts +0 -2
  249. package/dist/harness/mcp.d.ts.map +1 -1
  250. package/dist/harness/mcp.js +13 -15
  251. package/dist/harness/mcp.js.map +1 -1
  252. package/dist/harness/models.d.ts +0 -1
  253. package/dist/harness/models.d.ts.map +1 -1
  254. package/dist/harness/models.js +2 -1
  255. package/dist/harness/models.js.map +1 -1
  256. package/dist/harness/open-connector.d.ts +2 -3
  257. package/dist/harness/open-connector.d.ts.map +1 -1
  258. package/dist/harness/open-connector.js +13 -9
  259. package/dist/harness/open-connector.js.map +1 -1
  260. package/dist/harness/presenter.d.ts +4 -25
  261. package/dist/harness/presenter.d.ts.map +1 -1
  262. package/dist/harness/presenter.js +26 -20
  263. package/dist/harness/presenter.js.map +1 -1
  264. package/dist/harness/prompt.d.ts +1 -2
  265. package/dist/harness/prompt.d.ts.map +1 -1
  266. package/dist/harness/prompt.js.map +1 -1
  267. package/dist/harness/runner.d.ts.map +1 -1
  268. package/dist/harness/runner.js +34 -17
  269. package/dist/harness/runner.js.map +1 -1
  270. package/dist/harness/session.d.ts +0 -7
  271. package/dist/harness/session.d.ts.map +1 -1
  272. package/dist/harness/session.js +16 -14
  273. package/dist/harness/session.js.map +1 -1
  274. package/dist/harness/skills.d.ts +2 -5
  275. package/dist/harness/skills.d.ts.map +1 -1
  276. package/dist/harness/skills.js.map +1 -1
  277. package/dist/harness/subagent-profiles.d.ts +0 -1
  278. package/dist/harness/subagent-profiles.d.ts.map +1 -1
  279. package/dist/harness/subagent-profiles.js +12 -16
  280. package/dist/harness/subagent-profiles.js.map +1 -1
  281. package/dist/harness/subagent.d.ts +1 -1
  282. package/dist/harness/subagent.d.ts.map +1 -1
  283. package/dist/harness/subagent.js +17 -17
  284. package/dist/harness/subagent.js.map +1 -1
  285. package/dist/harness/tool-args.d.ts +2 -0
  286. package/dist/harness/tool-args.d.ts.map +1 -0
  287. package/dist/harness/tool-args.js +20 -0
  288. package/dist/harness/tool-args.js.map +1 -0
  289. package/dist/harness/tools/attach.d.ts +5 -4
  290. package/dist/harness/tools/attach.d.ts.map +1 -1
  291. package/dist/harness/tools/attach.js +1 -1
  292. package/dist/harness/tools/attach.js.map +1 -1
  293. package/dist/harness/tools/event.d.ts +12 -11
  294. package/dist/harness/tools/event.d.ts.map +1 -1
  295. package/dist/harness/tools/event.js +1 -1
  296. package/dist/harness/tools/event.js.map +1 -1
  297. package/dist/harness/tools/generate-image.d.ts +7 -5
  298. package/dist/harness/tools/generate-image.d.ts.map +1 -1
  299. package/dist/harness/tools/generate-image.js +7 -5
  300. package/dist/harness/tools/generate-image.js.map +1 -1
  301. package/dist/harness/tools/host-fn-tool.d.ts +3 -2
  302. package/dist/harness/tools/host-fn-tool.d.ts.map +1 -1
  303. package/dist/harness/tools/host-fn-tool.js +5 -2
  304. package/dist/harness/tools/host-fn-tool.js.map +1 -1
  305. package/dist/harness/tools/index.d.ts +3 -4
  306. package/dist/harness/tools/index.d.ts.map +1 -1
  307. package/dist/harness/tools/index.js +1 -3
  308. package/dist/harness/tools/index.js.map +1 -1
  309. package/dist/harness/tools/jev-browser.d.ts +12 -10
  310. package/dist/harness/tools/jev-browser.d.ts.map +1 -1
  311. package/dist/harness/tools/jev-browser.js +6 -4
  312. package/dist/harness/tools/jev-browser.js.map +1 -1
  313. package/dist/harness/tools/jev.d.ts +9 -7
  314. package/dist/harness/tools/jev.d.ts.map +1 -1
  315. package/dist/harness/tools/jev.js +5 -6
  316. package/dist/harness/tools/jev.js.map +1 -1
  317. package/dist/harness/tools/pi-tools.d.ts.map +1 -1
  318. package/dist/harness/tools/pi-tools.js +2 -2
  319. package/dist/harness/tools/pi-tools.js.map +1 -1
  320. package/dist/harness/tools/react.d.ts +3 -2
  321. package/dist/harness/tools/react.d.ts.map +1 -1
  322. package/dist/harness/tools/react.js +1 -1
  323. package/dist/harness/tools/react.js.map +1 -1
  324. package/dist/harness/tools/sandbox.d.ts +7 -6
  325. package/dist/harness/tools/sandbox.d.ts.map +1 -1
  326. package/dist/harness/tools/sandbox.js +3 -2
  327. package/dist/harness/tools/sandbox.js.map +1 -1
  328. package/dist/harness/tools/subagent.d.ts +26 -26
  329. package/dist/harness/tools/subagent.d.ts.map +1 -1
  330. package/dist/harness/tools/subagent.js +25 -29
  331. package/dist/harness/tools/subagent.js.map +1 -1
  332. package/dist/harness/tools/task.d.ts +11 -8
  333. package/dist/harness/tools/task.d.ts.map +1 -1
  334. package/dist/harness/tools/task.js +8 -6
  335. package/dist/harness/tools/task.js.map +1 -1
  336. package/dist/harness/tools/types.d.ts +2 -1
  337. package/dist/harness/tools/types.d.ts.map +1 -1
  338. package/dist/harness/tools/types.js.map +1 -1
  339. package/dist/harness/types.d.ts +37 -4
  340. package/dist/harness/types.d.ts.map +1 -1
  341. package/dist/harness/types.js.map +1 -1
  342. package/dist/index.d.ts +16 -13
  343. package/dist/index.d.ts.map +1 -1
  344. package/dist/index.js +3 -2
  345. package/dist/index.js.map +1 -1
  346. package/dist/log.d.ts +0 -1
  347. package/dist/log.d.ts.map +1 -1
  348. package/dist/log.js +1 -1
  349. package/dist/log.js.map +1 -1
  350. package/dist/main.js +27 -17
  351. package/dist/main.js.map +1 -1
  352. package/dist/memory-capture/index.d.ts +1 -2
  353. package/dist/memory-capture/index.d.ts.map +1 -1
  354. package/dist/memory-capture/index.js +8 -3
  355. package/dist/memory-capture/index.js.map +1 -1
  356. package/dist/memory-capture/types.d.ts +1 -1
  357. package/dist/memory-capture/types.js.map +1 -1
  358. package/dist/observability/index.d.ts +0 -3
  359. package/dist/observability/index.d.ts.map +1 -1
  360. package/dist/observability/index.js +11 -16
  361. package/dist/observability/index.js.map +1 -1
  362. package/dist/observability/sentry.d.ts +9 -12
  363. package/dist/observability/sentry.d.ts.map +1 -1
  364. package/dist/observability/sentry.js +9 -118
  365. package/dist/observability/sentry.js.map +1 -1
  366. package/dist/office/index.d.ts +14 -3
  367. package/dist/office/index.d.ts.map +1 -1
  368. package/dist/office/index.js +51 -14
  369. package/dist/office/index.js.map +1 -1
  370. package/dist/office/projection.d.ts +1 -3
  371. package/dist/office/projection.d.ts.map +1 -1
  372. package/dist/office/projection.js +5 -5
  373. package/dist/office/projection.js.map +1 -1
  374. package/dist/office/types.d.ts +5 -0
  375. package/dist/office/types.d.ts.map +1 -1
  376. package/dist/office/types.js.map +1 -1
  377. package/dist/runtime/conversation-runtime.d.ts +0 -1
  378. package/dist/runtime/conversation-runtime.d.ts.map +1 -1
  379. package/dist/runtime/conversation-runtime.js +10 -6
  380. package/dist/runtime/conversation-runtime.js.map +1 -1
  381. package/dist/runtime/session-lifecycle.d.ts.map +1 -1
  382. package/dist/runtime/session-lifecycle.js +2 -1
  383. package/dist/runtime/session-lifecycle.js.map +1 -1
  384. package/dist/runtime/types.d.ts +8 -5
  385. package/dist/runtime/types.d.ts.map +1 -1
  386. package/dist/runtime/types.js.map +1 -1
  387. package/dist/sandbox/cloudflare.d.ts.map +1 -1
  388. package/dist/sandbox/cloudflare.js +3 -2
  389. package/dist/sandbox/cloudflare.js.map +1 -1
  390. package/dist/sandbox/container.d.ts.map +1 -1
  391. package/dist/sandbox/container.js +2 -1
  392. package/dist/sandbox/container.js.map +1 -1
  393. package/dist/sandbox/host.js +1 -1
  394. package/dist/sandbox/host.js.map +1 -1
  395. package/dist/sandbox/identity.d.ts +0 -1
  396. package/dist/sandbox/identity.d.ts.map +1 -1
  397. package/dist/sandbox/identity.js.map +1 -1
  398. package/dist/sandbox/index.d.ts +4 -14
  399. package/dist/sandbox/index.d.ts.map +1 -1
  400. package/dist/sandbox/index.js +4 -93
  401. package/dist/sandbox/index.js.map +1 -1
  402. package/dist/sandbox/provisioner.d.ts +0 -1
  403. package/dist/sandbox/provisioner.d.ts.map +1 -1
  404. package/dist/sandbox/provisioner.js +12 -11
  405. package/dist/sandbox/provisioner.js.map +1 -1
  406. package/dist/sandbox/registry.d.ts +12 -0
  407. package/dist/sandbox/registry.d.ts.map +1 -0
  408. package/dist/sandbox/registry.js +93 -0
  409. package/dist/sandbox/registry.js.map +1 -0
  410. package/dist/sandbox/types.d.ts +3 -0
  411. package/dist/sandbox/types.d.ts.map +1 -1
  412. package/dist/sandbox/types.js.map +1 -1
  413. package/dist/sandbox/utils.d.ts.map +1 -1
  414. package/dist/sandbox/utils.js +1 -0
  415. package/dist/sandbox/utils.js.map +1 -1
  416. package/dist/sessions/chat-history-sync.d.ts +2 -2
  417. package/dist/sessions/chat-history-sync.d.ts.map +1 -1
  418. package/dist/sessions/chat-history-sync.js +32 -23
  419. package/dist/sessions/chat-history-sync.js.map +1 -1
  420. package/dist/sessions/migrate-common.js +2 -2
  421. package/dist/sessions/migrate-common.js.map +1 -1
  422. package/dist/sessions/migrate-pi-084.d.ts +0 -1
  423. package/dist/sessions/migrate-pi-084.d.ts.map +1 -1
  424. package/dist/sessions/migrate-pi-084.js +4 -6
  425. package/dist/sessions/migrate-pi-084.js.map +1 -1
  426. package/dist/sessions/migrate-v3.d.ts +0 -1
  427. package/dist/sessions/migrate-v3.d.ts.map +1 -1
  428. package/dist/sessions/migrate-v3.js +3 -5
  429. package/dist/sessions/migrate-v3.js.map +1 -1
  430. package/dist/sessions/session-key.d.ts +0 -1
  431. package/dist/sessions/session-key.d.ts.map +1 -1
  432. package/dist/sessions/session-key.js.map +1 -1
  433. package/dist/sessions/session-store.d.ts.map +1 -1
  434. package/dist/sessions/session-store.js +12 -19
  435. package/dist/sessions/session-store.js.map +1 -1
  436. package/dist/sessions/store.d.ts +0 -1
  437. package/dist/sessions/store.d.ts.map +1 -1
  438. package/dist/sessions/store.js +5 -3
  439. package/dist/sessions/store.js.map +1 -1
  440. package/dist/sessions/types.d.ts +2 -0
  441. package/dist/sessions/types.d.ts.map +1 -1
  442. package/dist/sessions/types.js +1 -0
  443. package/dist/sessions/types.js.map +1 -1
  444. package/dist/settings/apply.d.ts +1 -2
  445. package/dist/settings/apply.d.ts.map +1 -1
  446. package/dist/settings/apply.js.map +1 -1
  447. package/dist/settings/index.d.ts +37 -34
  448. package/dist/settings/index.d.ts.map +1 -1
  449. package/dist/settings/index.js +28 -22
  450. package/dist/settings/index.js.map +1 -1
  451. package/dist/settings/migrate.d.ts +1 -1
  452. package/dist/settings/migrate.d.ts.map +1 -1
  453. package/dist/settings/migrate.js +5 -4
  454. package/dist/settings/migrate.js.map +1 -1
  455. package/dist/types.d.ts +17 -6
  456. package/dist/types.d.ts.map +1 -1
  457. package/dist/types.js +1 -3
  458. package/dist/types.js.map +1 -1
  459. package/dist/unknown-values.d.ts +3 -0
  460. package/dist/unknown-values.d.ts.map +1 -0
  461. package/dist/unknown-values.js +7 -0
  462. package/dist/unknown-values.js.map +1 -0
  463. package/dist/vault/index.d.ts +10 -2
  464. package/dist/vault/index.d.ts.map +1 -1
  465. package/dist/vault/index.js +16 -7
  466. package/dist/vault/index.js.map +1 -1
  467. package/package.json +3 -2
  468. package/dist/adapters/index.d.ts +0 -11
  469. package/dist/adapters/index.d.ts.map +0 -1
  470. package/dist/adapters/index.js +0 -19
  471. package/dist/adapters/index.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"env-manifest.js","sourceRoot":"","sources":["../src/env-manifest.ts"],"names":[],"mappings":"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","sourcesContent":["import type { EnvGroup } from \"./types.js\";\n\nexport function readEnv(name: string): string | undefined {\n const raw = process.env[name]?.trim();\n if (raw) return raw;\n\n const prefixed = process.env[`MIKAN_${name}`]?.trim();\n return prefixed || undefined;\n}\n\nexport function readStandardEnv(name: string): string | undefined {\n return process.env[name]?.trim() || undefined;\n}\n\nexport function setEnvAliases(name: string, value: string): void {\n process.env[name] = value;\n process.env[`MIKAN_${name}`] = value;\n}\n\nexport type { EnvGroup } from \"./types.js\";\n\nexport const ENV_MANIFEST: readonly EnvGroup[] = [\n {\n key: \"slack\",\n title: \"Slack\",\n kind: \"platform\",\n vars: [\n {\n name: \"SLACK_APP_TOKEN\",\n required: true,\n secret: true,\n doc: \"Socket-mode app token (xapp-…)\",\n },\n { name: \"SLACK_BOT_TOKEN\", required: true, secret: true, doc: \"Bot token (xoxb-…)\" },\n ],\n },\n {\n key: \"telegram\",\n title: \"Telegram\",\n kind: \"platform\",\n vars: [{ name: \"TELEGRAM_BOT_TOKEN\", required: true, secret: true, doc: \"BotFather token\" }],\n },\n {\n key: \"discord\",\n title: \"Discord\",\n kind: \"platform\",\n vars: [{ name: \"DISCORD_BOT_TOKEN\", required: true, secret: true, doc: \"Bot token\" }],\n },\n {\n key: \"github\",\n title: \"GitHub\",\n kind: \"platform\",\n doc: \"Issue/PR conversations via a GitHub App (polling; optional webhook poke)\",\n vars: [\n { name: \"GITHUB_APP_ID\", required: true, doc: \"GitHub App id\" },\n { name: \"GITHUB_INSTALLATION_ID\", required: true, doc: \"App installation id\" },\n {\n name: \"GITHUB_APP_PRIVATE_KEY_PATH\",\n doc: \"Path to the App private key .pem (preferred; keep outside any repo)\",\n },\n {\n name: \"GITHUB_APP_PRIVATE_KEY\",\n secret: true,\n deploy: false,\n doc: \"App private key PEM with literal \\\\n newlines (fallback)\",\n },\n {\n name: \"GITHUB_REPOS\",\n doc: \"Comma-separated owner/repo allowlist (default: all installed)\",\n },\n { name: \"GITHUB_POLL_INTERVAL\", doc: \"Poll interval in seconds (default 60)\" },\n {\n name: \"GITHUB_WEBHOOK_SECRET\",\n secret: true,\n doc: \"Webhook secret; when set, deliveries to /github/webhook trigger an immediate poll (needs LINK_PORT)\",\n },\n ],\n anyOf: [\"GITHUB_APP_PRIVATE_KEY\", \"GITHUB_APP_PRIVATE_KEY_PATH\"],\n },\n {\n key: \"llm\",\n title: \"LLM providers\",\n kind: \"feature\",\n vars: [\n { name: \"ANTHROPIC_API_KEY\", secret: true, doc: \"Anthropic API key\" },\n { name: \"OPENAI_API_KEY\", secret: true, doc: \"OpenAI API key\" },\n {\n name: \"OPENROUTER_API_KEY\",\n secret: true,\n doc: \"OpenRouter API key (chat models routed through OpenRouter, and harness/jev.ts's Jev client via @geminixiang/jev)\",\n },\n ],\n },\n {\n key: \"link\",\n title: \"Link/OAuth server\",\n kind: \"feature\",\n doc: \"Credential onboarding links, session view, and the Admin portal\",\n vars: [\n { name: \"LINK_URL\", doc: \"Externally visible base URL, e.g. https://mikan.example.com\" },\n { name: \"LINK_PORT\", doc: \"Listen port (default 8181 when LINK_URL is set)\" },\n { name: \"GITHUB_OAUTH_CLIENT_ID\", doc: \"GitHub OAuth app for /login linking\" },\n { name: \"GITHUB_OAUTH_CLIENT_SECRET\", secret: true, doc: \"GitHub OAuth app secret\" },\n { name: \"GOOGLE_WORKSPACE_CLI_CLIENT_ID\", doc: \"Google Workspace OAuth client for /login\" },\n {\n name: \"GOOGLE_WORKSPACE_CLI_CLIENT_SECRET\",\n secret: true,\n doc: \"Google Workspace OAuth secret\",\n },\n { name: \"GOOGLE_CLOUD_SDK_CLIENT_ID\", doc: \"Google Cloud SDK OAuth client for /login\" },\n {\n name: \"GOOGLE_CLOUD_SDK_CLIENT_SECRET\",\n secret: true,\n doc: \"Google Cloud SDK OAuth secret\",\n },\n ],\n },\n {\n key: \"openconnector\",\n title: \"OpenConnector\",\n kind: \"feature\",\n doc: \"Default open-connector MCP server and the admin token that mints per-conversation runtime tokens\",\n vars: [\n {\n name: \"OPENCONNECTOR_ENDPOINT\",\n doc: \"Default MCP endpoint used when a conversation does not declare open-connector\",\n },\n {\n name: \"OPENCONNECTOR_ADMIN_TOKEN\",\n secret: true,\n doc: \"Host-only admin token used to mint one runtime token per conversation for the default server\",\n },\n ],\n },\n {\n key: \"cloudflare\",\n title: \"Cloudflare sandbox\",\n kind: \"feature\",\n doc: \"For --sandbox=cloudflare:<id> via the bridge worker\",\n vars: [\n { name: \"CLOUDFLARE_SANDBOX_URL\", doc: \"Bridge worker URL\" },\n { name: \"CLOUDFLARE_SANDBOX_TOKEN\", secret: true, doc: \"Bridge worker auth token\" },\n ],\n },\n {\n key: \"observability\",\n title: \"Observability\",\n kind: \"feature\",\n vars: [\n { name: \"SENTRY_DSN\", secret: true, doc: \"Sentry DSN (settings.json sentry.dsn wins)\" },\n {\n name: \"SENTRY_ENVIRONMENT\",\n deploy: false,\n doc: \"Sentry environment tag (default production)\",\n },\n { name: \"SENTRY_ENABLED\", deploy: false, doc: \"Set to false to disable Sentry errors\" },\n { name: \"OTEL_SDK_DISABLED\", doc: \"Set to true to disable OpenTelemetry\" },\n { name: \"OTEL_SERVICE_NAME\", doc: \"OTLP service name (default mikan)\" },\n {\n name: \"OTEL_RESOURCE_ATTRIBUTES\",\n secret: true,\n doc: \"Comma-separated safe resource attrs\",\n },\n { name: \"OTEL_TRACES_EXPORTER\", doc: \"Trace exporter: otlp or none\" },\n { name: \"OTEL_METRICS_EXPORTER\", doc: \"Metrics exporter: otlp or none\" },\n { name: \"OTEL_EXPORTER_OTLP_ENDPOINT\", secret: true, doc: \"Base OTLP HTTP endpoint\" },\n { name: \"OTEL_EXPORTER_OTLP_TRACES_ENDPOINT\", secret: true, doc: \"OTLP traces endpoint\" },\n { name: \"OTEL_EXPORTER_OTLP_METRICS_ENDPOINT\", secret: true, doc: \"OTLP metrics endpoint\" },\n { name: \"OTEL_EXPORTER_OTLP_HEADERS\", secret: true, doc: \"Shared OTLP auth headers\" },\n { name: \"OTEL_EXPORTER_OTLP_TRACES_HEADERS\", secret: true, doc: \"OTLP trace headers\" },\n { name: \"OTEL_EXPORTER_OTLP_METRICS_HEADERS\", secret: true, doc: \"OTLP metric headers\" },\n { name: \"OTEL_EXPORTER_OTLP_PROTOCOL\", doc: \"OTLP protocol; http/protobuf supported\" },\n { name: \"OTEL_EXPORTER_OTLP_TRACES_PROTOCOL\", doc: \"Trace protocol override\" },\n { name: \"OTEL_EXPORTER_OTLP_METRICS_PROTOCOL\", doc: \"Metric protocol override\" },\n { name: \"OTEL_EXPORTER_OTLP_TIMEOUT\", doc: \"Shared OTLP timeout in milliseconds\" },\n { name: \"OTEL_EXPORTER_OTLP_TRACES_TIMEOUT\", doc: \"Trace timeout in milliseconds\" },\n { name: \"OTEL_EXPORTER_OTLP_METRICS_TIMEOUT\", doc: \"Metric timeout in milliseconds\" },\n { name: \"OTEL_METRIC_EXPORT_INTERVAL\", doc: \"Metric export interval in milliseconds\" },\n { name: \"OTEL_METRIC_EXPORT_TIMEOUT\", doc: \"Metric export timeout in milliseconds\" },\n ],\n },\n {\n key: \"runtime\",\n title: \"Runtime\",\n kind: \"feature\",\n vars: [\n { name: \"STATE_DIR\", deploy: false, doc: \"State dir override (same as --state-dir)\" },\n {\n name: \"HTTP_IDLE_TIMEOUT\",\n deploy: false,\n doc: \"Idle timeout in ms for outbound HTTP streams\",\n },\n ],\n },\n];\n\ntype EnvLookup = (name: string) => string | undefined;\n\nexport function platformIsActive(key: string, env: EnvLookup = readEnv): boolean {\n const group = ENV_MANIFEST.find((candidate) => candidate.key === key);\n if (!group) throw new Error(`Unknown env-manifest group: ${key}`);\n const required = group.vars.filter((spec) => spec.required);\n if (!required.every((spec) => env(spec.name))) return false;\n if (group.anyOf && !group.anyOf.some((name) => env(name))) return false;\n return true;\n}\n\nexport function activePlatformKeys(env: EnvLookup = readEnv): string[] {\n return ENV_MANIFEST.filter(\n (group) => group.kind === \"platform\" && platformIsActive(group.key, env),\n ).map((group) => group.key);\n}\n\nfunction platformRecipe(group: EnvGroup): string {\n const required = group.vars.filter((spec) => spec.required).map((spec) => spec.name);\n const alternative = group.anyOf ? ` + ${group.anyOf.join(\" | \")}` : \"\";\n return `${group.title}: ${required.join(\" + \")}${alternative}`;\n}\n\nexport function noPlatformsMessage(): string {\n const recipes = ENV_MANIFEST.filter((group) => group.kind === \"platform\")\n .map((group) => ` ${platformRecipe(group)}`)\n .join(\"\\n\");\n return `No platform tokens found. Set one of:\\n${recipes}`;\n}\n\nexport function envSummaryLines(): string[] {\n return ENV_MANIFEST.filter((group) => group.kind === \"platform\").map(\n (group) => ` ${platformRecipe(group)}`,\n );\n}\n\nexport function manifestVarNames(options?: { deployOnly?: boolean }): string[] {\n return ENV_MANIFEST.flatMap((group) =>\n group.vars\n .filter((spec) => !options?.deployOnly || spec.deploy !== false)\n .map((spec) => spec.name),\n );\n}\n\nexport function envReport(env: EnvLookup = readEnv): string {\n const lines: string[] = [];\n for (const group of ENV_MANIFEST) {\n const active =\n group.kind === \"platform\"\n ? platformIsActive(group.key, env)\n ? \" — active\"\n : \" — inactive\"\n : \"\";\n lines.push(`${group.title}${active}${group.doc ? ` · ${group.doc}` : \"\"}`);\n for (const spec of group.vars) {\n const status = env(spec.name) ? \"set\" : \"unset\";\n const marks = [spec.required ? \"required\" : \"\", spec.secret ? \"secret\" : \"\"]\n .filter(Boolean)\n .join(\", \");\n lines.push(\n ` ${spec.name.padEnd(36)} ${status.padEnd(6)}${marks ? ` [${marks}]` : \"\"} ${spec.doc}`,\n );\n }\n lines.push(\"\");\n }\n lines.push(\"Each var also accepts a MIKAN_-prefixed alias (e.g. MIKAN_LINK_URL).\");\n return lines.join(\"\\n\");\n}\n\nexport function resolveLinkBaseUrl(): string | undefined {\n const raw = readEnv(\"LINK_URL\");\n if (!raw) return undefined;\n return raw.replace(/\\/+$/, \"\");\n}\n"]}
1
+ {"version":3,"file":"env-manifest.js","sourceRoot":"","sources":["../src/env-manifest.ts"],"names":[],"mappings":"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","sourcesContent":["import type { EnvGroup } from \"./types.js\";\n\nexport function readEnv(name: string): string | undefined {\n const raw = process.env[name]?.trim();\n if (raw) return raw;\n\n const prefixed = process.env[`MIKAN_${name}`]?.trim();\n return prefixed || undefined;\n}\n\nexport function readStandardEnv(name: string): string | undefined {\n return process.env[name]?.trim() || undefined;\n}\n\nexport function setEnvAliases(name: string, value: string): void {\n process.env[name] = value;\n process.env[`MIKAN_${name}`] = value;\n}\n\nexport const ENV_MANIFEST: readonly EnvGroup[] = [\n {\n key: \"slack\",\n title: \"Slack\",\n kind: \"platform\",\n vars: [\n {\n name: \"SLACK_APP_TOKEN\",\n required: true,\n secret: true,\n doc: \"Socket-mode app token (xapp-…)\",\n },\n { name: \"SLACK_BOT_TOKEN\", required: true, secret: true, doc: \"Bot token (xoxb-…)\" },\n ],\n },\n {\n key: \"telegram\",\n title: \"Telegram\",\n kind: \"platform\",\n vars: [{ name: \"TELEGRAM_BOT_TOKEN\", required: true, secret: true, doc: \"BotFather token\" }],\n },\n {\n key: \"discord\",\n title: \"Discord\",\n kind: \"platform\",\n vars: [{ name: \"DISCORD_BOT_TOKEN\", required: true, secret: true, doc: \"Bot token\" }],\n },\n {\n key: \"github\",\n title: \"GitHub\",\n kind: \"platform\",\n doc: \"Issue/PR conversations via a GitHub App (polling; optional webhook poke)\",\n vars: [\n { name: \"GITHUB_APP_ID\", required: true, doc: \"GitHub App id\" },\n { name: \"GITHUB_INSTALLATION_ID\", required: true, doc: \"App installation id\" },\n {\n name: \"GITHUB_APP_PRIVATE_KEY_PATH\",\n doc: \"Path to the App private key .pem (preferred; keep outside any repo)\",\n },\n {\n name: \"GITHUB_APP_PRIVATE_KEY\",\n secret: true,\n deploy: false,\n doc: \"App private key PEM with literal \\\\n newlines (fallback)\",\n },\n {\n name: \"GITHUB_REPOS\",\n doc: \"Comma-separated owner/repo allowlist (default: all installed)\",\n },\n { name: \"GITHUB_POLL_INTERVAL\", doc: \"Poll interval in seconds (default 60)\" },\n {\n name: \"GITHUB_WEBHOOK_SECRET\",\n secret: true,\n doc: \"Webhook secret; when set, deliveries to /github/webhook trigger an immediate poll (needs LINK_PORT)\",\n },\n ],\n anyOf: [\"GITHUB_APP_PRIVATE_KEY\", \"GITHUB_APP_PRIVATE_KEY_PATH\"],\n },\n {\n key: \"llm\",\n title: \"LLM providers\",\n kind: \"feature\",\n vars: [\n { name: \"ANTHROPIC_API_KEY\", secret: true, doc: \"Anthropic API key\" },\n { name: \"OPENAI_API_KEY\", secret: true, doc: \"OpenAI API key\" },\n {\n name: \"OPENROUTER_API_KEY\",\n secret: true,\n doc: \"OpenRouter API key (chat models routed through OpenRouter, and harness/jev.ts's Jev client via @geminixiang/jev)\",\n },\n ],\n },\n {\n key: \"link\",\n title: \"Link/OAuth server\",\n kind: \"feature\",\n doc: \"Credential onboarding links, session view, and the Admin portal\",\n vars: [\n { name: \"LINK_URL\", doc: \"Externally visible base URL, e.g. https://mikan.example.com\" },\n { name: \"LINK_PORT\", doc: \"Listen port (default 8181 when LINK_URL is set)\" },\n { name: \"GITHUB_OAUTH_CLIENT_ID\", doc: \"GitHub OAuth app for /login linking\" },\n { name: \"GITHUB_OAUTH_CLIENT_SECRET\", secret: true, doc: \"GitHub OAuth app secret\" },\n { name: \"GOOGLE_WORKSPACE_CLI_CLIENT_ID\", doc: \"Google Workspace OAuth client for /login\" },\n {\n name: \"GOOGLE_WORKSPACE_CLI_CLIENT_SECRET\",\n secret: true,\n doc: \"Google Workspace OAuth secret\",\n },\n { name: \"GOOGLE_CLOUD_SDK_CLIENT_ID\", doc: \"Google Cloud SDK OAuth client for /login\" },\n {\n name: \"GOOGLE_CLOUD_SDK_CLIENT_SECRET\",\n secret: true,\n doc: \"Google Cloud SDK OAuth secret\",\n },\n ],\n },\n {\n key: \"openconnector\",\n title: \"OpenConnector\",\n kind: \"feature\",\n doc: \"Default open-connector MCP server and the admin token that mints per-conversation runtime tokens\",\n vars: [\n {\n name: \"OPENCONNECTOR_ENDPOINT\",\n doc: \"Default MCP endpoint used when a conversation does not declare open-connector\",\n },\n {\n name: \"OPENCONNECTOR_ADMIN_TOKEN\",\n secret: true,\n doc: \"Host-only admin token used to mint one runtime token per conversation for the default server\",\n },\n ],\n },\n {\n key: \"cloudflare\",\n title: \"Cloudflare sandbox\",\n kind: \"feature\",\n doc: \"For --sandbox=cloudflare:<id> via the bridge worker\",\n vars: [\n { name: \"CLOUDFLARE_SANDBOX_URL\", doc: \"Bridge worker URL\" },\n { name: \"CLOUDFLARE_SANDBOX_TOKEN\", secret: true, doc: \"Bridge worker auth token\" },\n ],\n },\n {\n key: \"observability\",\n title: \"Observability\",\n kind: \"feature\",\n vars: [\n { name: \"SENTRY_DSN\", secret: true, doc: \"Sentry DSN (settings.json sentry.dsn wins)\" },\n {\n name: \"SENTRY_ENVIRONMENT\",\n deploy: false,\n doc: \"Sentry environment tag (default production)\",\n },\n { name: \"SENTRY_ENABLED\", deploy: false, doc: \"Set to false to disable Sentry errors\" },\n { name: \"OTEL_SDK_DISABLED\", doc: \"Set to true to disable OpenTelemetry\" },\n { name: \"OTEL_SERVICE_NAME\", doc: \"OTLP service name (default mikan)\" },\n {\n name: \"OTEL_RESOURCE_ATTRIBUTES\",\n secret: true,\n doc: \"Comma-separated safe resource attrs\",\n },\n { name: \"OTEL_TRACES_EXPORTER\", doc: \"Trace exporter: otlp or none\" },\n { name: \"OTEL_METRICS_EXPORTER\", doc: \"Metrics exporter: otlp or none\" },\n { name: \"OTEL_EXPORTER_OTLP_ENDPOINT\", secret: true, doc: \"Base OTLP HTTP endpoint\" },\n { name: \"OTEL_EXPORTER_OTLP_TRACES_ENDPOINT\", secret: true, doc: \"OTLP traces endpoint\" },\n { name: \"OTEL_EXPORTER_OTLP_METRICS_ENDPOINT\", secret: true, doc: \"OTLP metrics endpoint\" },\n { name: \"OTEL_EXPORTER_OTLP_HEADERS\", secret: true, doc: \"Shared OTLP auth headers\" },\n { name: \"OTEL_EXPORTER_OTLP_TRACES_HEADERS\", secret: true, doc: \"OTLP trace headers\" },\n { name: \"OTEL_EXPORTER_OTLP_METRICS_HEADERS\", secret: true, doc: \"OTLP metric headers\" },\n { name: \"OTEL_EXPORTER_OTLP_PROTOCOL\", doc: \"OTLP protocol; http/protobuf supported\" },\n { name: \"OTEL_EXPORTER_OTLP_TRACES_PROTOCOL\", doc: \"Trace protocol override\" },\n { name: \"OTEL_EXPORTER_OTLP_METRICS_PROTOCOL\", doc: \"Metric protocol override\" },\n { name: \"OTEL_EXPORTER_OTLP_TIMEOUT\", doc: \"Shared OTLP timeout in milliseconds\" },\n { name: \"OTEL_EXPORTER_OTLP_TRACES_TIMEOUT\", doc: \"Trace timeout in milliseconds\" },\n { name: \"OTEL_EXPORTER_OTLP_METRICS_TIMEOUT\", doc: \"Metric timeout in milliseconds\" },\n { name: \"OTEL_METRIC_EXPORT_INTERVAL\", doc: \"Metric export interval in milliseconds\" },\n { name: \"OTEL_METRIC_EXPORT_TIMEOUT\", doc: \"Metric export timeout in milliseconds\" },\n ],\n },\n {\n key: \"runtime\",\n title: \"Runtime\",\n kind: \"feature\",\n vars: [\n { name: \"STATE_DIR\", deploy: false, doc: \"State dir override (same as --state-dir)\" },\n {\n name: \"HTTP_IDLE_TIMEOUT\",\n deploy: false,\n doc: \"Idle timeout in ms for outbound HTTP streams\",\n },\n ],\n },\n];\n\ntype EnvLookup = (name: string) => string | undefined;\n\nexport function platformIsActive(key: string, env: EnvLookup = readEnv): boolean {\n const group = ENV_MANIFEST.find((candidate) => candidate.key === key);\n if (!group) throw new Error(`Unknown env-manifest group: ${key}`);\n const required = group.vars.filter((spec) => spec.required);\n if (!required.every((spec) => env(spec.name))) return false;\n if (group.anyOf && !group.anyOf.some((name) => env(name))) return false;\n return true;\n}\n\nexport function activePlatformKeys(env: EnvLookup = readEnv): string[] {\n return ENV_MANIFEST.filter(\n (group) => group.kind === \"platform\" && platformIsActive(group.key, env),\n ).map((group) => group.key);\n}\n\nfunction platformRecipe(group: EnvGroup): string {\n const required = group.vars.filter((spec) => spec.required).map((spec) => spec.name);\n const alternative = group.anyOf ? ` + ${group.anyOf.join(\" | \")}` : \"\";\n return `${group.title}: ${required.join(\" + \")}${alternative}`;\n}\n\nexport function noPlatformsMessage(): string {\n const recipes = ENV_MANIFEST.filter((group) => group.kind === \"platform\")\n .map((group) => ` ${platformRecipe(group)}`)\n .join(\"\\n\");\n return `No platform tokens found. Set one of:\\n${recipes}`;\n}\n\nexport function envSummaryLines(): string[] {\n return ENV_MANIFEST.filter((group) => group.kind === \"platform\").map(\n (group) => ` ${platformRecipe(group)}`,\n );\n}\n\nexport function manifestVarNames(options?: { deployOnly?: boolean }): string[] {\n return ENV_MANIFEST.flatMap((group) =>\n group.vars\n .filter((spec) => !options?.deployOnly || spec.deploy !== false)\n .map((spec) => spec.name),\n );\n}\n\nexport function envReport(env: EnvLookup = readEnv): string {\n const lines: string[] = [];\n for (const group of ENV_MANIFEST) {\n const active =\n group.kind === \"platform\"\n ? platformIsActive(group.key, env)\n ? \" — active\"\n : \" — inactive\"\n : \"\";\n lines.push(`${group.title}${active}${group.doc ? ` · ${group.doc}` : \"\"}`);\n for (const spec of group.vars) {\n const status = env(spec.name) ? \"set\" : \"unset\";\n const marks = [spec.required ? \"required\" : \"\", spec.secret ? \"secret\" : \"\"]\n .filter(Boolean)\n .join(\", \");\n lines.push(\n ` ${spec.name.padEnd(36)} ${status.padEnd(6)}${marks ? ` [${marks}]` : \"\"} ${spec.doc}`,\n );\n }\n lines.push(\"\");\n }\n lines.push(\"Each var also accepts a MIKAN_-prefixed alias (e.g. MIKAN_LINK_URL).\");\n return lines.join(\"\\n\");\n}\n\nexport function resolveLinkBaseUrl(): string | undefined {\n const raw = readEnv(\"LINK_URL\");\n if (!raw) return undefined;\n return raw.replace(/\\/+$/, \"\");\n}\n"]}
@@ -76,11 +76,12 @@ export interface PeriodicEventInfo {
76
76
  timezone: string;
77
77
  nextRun: string | null;
78
78
  }
79
- export declare const EventTypeSchema: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"immediate">, import("@sinclair/typebox").TLiteral<"one-shot">, import("@sinclair/typebox").TLiteral<"periodic">]>;
79
+ import { Type } from "typebox";
80
+ export declare const EventTypeSchema: Type.TUnion<[Type.TLiteral<"immediate">, Type.TLiteral<"one-shot">, Type.TLiteral<"periodic">]>;
80
81
  export declare function validateEventFilename(filename: string): string;
81
82
  export declare function parseEventPayload(content: string, filename: string): EventFilePayload;
82
83
  export declare function buildEventPayload(input: EventPayloadInput): EventFilePayload;
83
- import type { Office, Workspace } from "../office/index.js";
84
+ import type { Office, Workspace } from "../office/types.js";
84
85
  export declare function officeEventsDir(office: Office): string;
85
86
  export declare class OfficeEventStore implements EventStore {
86
87
  private readonly office;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/events/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/events/index.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { Type } from "@sinclair/typebox";
1
+ import { Type } from "typebox";
2
2
  import { parseJsonSchemaValue } from "../file-guards.js";
3
3
  export const EventTypeSchema = Type.Union([
4
4
  Type.Literal("immediate"),
@@ -65,7 +65,7 @@ function isValidIsoTimestampWithOffset(value) {
65
65
  Number.isFinite(Date.parse(value)));
66
66
  }
67
67
  export function parseEventPayload(content, filename) {
68
- const data = parseJsonSchemaValue(content, EventFileSchema, (detail) => detail === "unexpected JSON shape"
68
+ const data = parseJsonSchemaValue(content, EventFileSchema, (detail, kind) => kind === "shape"
69
69
  ? `Expected top-level JSON object in ${filename}`
70
70
  : `Malformed event file ${filename}: ${detail}`);
71
71
  const conversationId = typeof data.conversationId === "string"
@@ -78,10 +78,10 @@ export function parseEventPayload(content, filename) {
78
78
  throw new Error(`Missing required fields (type, conversationId, text) in ${filename}`);
79
79
  }
80
80
  const base = {
81
- ...(data.platform !== undefined ? { platform: data.platform } : {}),
81
+ platform: data.platform,
82
82
  conversationId,
83
- ...(data.conversationKind !== undefined ? { conversationKind: data.conversationKind } : {}),
84
- ...(data.userId !== undefined ? { userId: data.userId } : {}),
83
+ conversationKind: data.conversationKind,
84
+ userId: data.userId,
85
85
  text,
86
86
  };
87
87
  switch (type) {
@@ -107,10 +107,10 @@ export function parseEventPayload(content, filename) {
107
107
  }
108
108
  export function buildEventPayload(input) {
109
109
  const base = {
110
- ...(input.platform !== undefined ? { platform: input.platform } : {}),
110
+ platform: input.platform,
111
111
  conversationId: input.conversationId,
112
- ...(input.conversationKind !== undefined ? { conversationKind: input.conversationKind } : {}),
113
- ...(input.userId !== undefined ? { userId: input.userId } : {}),
112
+ conversationKind: input.conversationKind,
113
+ userId: input.userId,
114
114
  text: input.text,
115
115
  };
116
116
  switch (input.type) {
@@ -140,6 +140,7 @@ import { mkdir, readdir, readFile, rm, stat } from "node:fs/promises";
140
140
  import { join } from "node:path";
141
141
  import { atomicWritePrivateFile } from "../file-guards.js";
142
142
  import { createOfficeAddress, listRegisteredOffices, officeKey } from "../office/index.js";
143
+ import { errorMessage } from "../unknown-values.js";
143
144
  export function officeEventsDir(office) {
144
145
  return join(office.stateDir, "events");
145
146
  }
@@ -257,7 +258,7 @@ export function migrateLegacyWorkspaceEvents(workspace) {
257
258
  catch (error) {
258
259
  report.skipped.push({
259
260
  filename,
260
- reason: error instanceof Error ? error.message : String(error),
261
+ reason: errorMessage(error),
261
262
  });
262
263
  continue;
263
264
  }
@@ -272,7 +273,7 @@ export function migrateLegacyWorkspaceEvents(workspace) {
272
273
  catch (error) {
273
274
  report.skipped.push({
274
275
  filename,
275
- reason: error instanceof Error ? error.message : String(error),
276
+ reason: errorMessage(error),
276
277
  });
277
278
  continue;
278
279
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/events/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { OfficeAddress, OfficeKey } from \"../types.js\";\n\nexport type EventPayload = EventFilePayload;\n\nexport interface EventRecord {\n filename: string;\n payload: EventFilePayload;\n size: number;\n mtimeMs: number;\n}\n\nexport interface EventStore {\n readonly address: OfficeAddress;\n create(filename: string, payload: EventFilePayload): Promise<{ path: string; size: number }>;\n list(): Promise<Array<Omit<EventRecord, \"payload\"> & { payload: EventFilePayload | null }>>;\n read(filename: string): Promise<EventRecord>;\n update(filename: string, payload: EventFilePayload): Promise<{ path: string; size: number }>;\n delete(filename: string): Promise<{ deleted: boolean }>;\n}\n\nexport interface EventScheduleSink {\n scheduleRecord(address: OfficeAddress, record: EventRecord): void;\n cancelRecord(address: OfficeAddress, filename: string): void;\n}\n\nexport type EventConversationKind = \"direct\" | \"shared\";\n\nexport type EventType = \"immediate\" | \"one-shot\" | \"periodic\";\n\ninterface EventPayloadBase {\n platform?: string;\n conversationId: string;\n conversationKind?: EventConversationKind;\n userId?: string;\n text: string;\n}\n\nexport interface ImmediateEventPayload extends EventPayloadBase {\n type: \"immediate\";\n}\n\nexport interface OneShotEventPayload extends EventPayloadBase {\n type: \"one-shot\";\n at: string;\n}\n\nexport interface PeriodicEventPayload extends EventPayloadBase {\n type: \"periodic\";\n schedule: string;\n timezone: string;\n}\n\nexport type EventFilePayload = ImmediateEventPayload | OneShotEventPayload | PeriodicEventPayload;\n\nexport interface EventPayloadInput {\n type: EventType;\n platform?: string;\n conversationId: string;\n conversationKind?: EventConversationKind;\n userId?: string;\n text: string;\n at?: string;\n schedule?: string;\n timezone?: string;\n}\n\ninterface ResolvedEventFields {\n platform: string;\n conversationKind: EventConversationKind;\n}\n\nexport type MikanEvent =\n | (ImmediateEventPayload & ResolvedEventFields)\n | (OneShotEventPayload & ResolvedEventFields)\n | (PeriodicEventPayload & ResolvedEventFields);\n\nexport interface PeriodicEventInfo {\n filename: string;\n platform: string;\n conversationId: string;\n conversationKind: EventConversationKind;\n text: string;\n schedule: string;\n timezone: string;\n nextRun: string | null;\n}\n\nimport { type Static, Type } from \"@sinclair/typebox\";\nimport { parseJsonSchemaValue } from \"../file-guards.js\";\n\nexport const EventTypeSchema = Type.Union([\n Type.Literal(\"immediate\"),\n Type.Literal(\"one-shot\"),\n Type.Literal(\"periodic\"),\n]);\n\nconst EventFileSchema = Type.Object({\n type: Type.Optional(EventTypeSchema),\n platform: Type.Optional(Type.String()),\n conversationId: Type.Optional(Type.String()),\n channelId: Type.Optional(Type.String()),\n conversationKind: Type.Optional(Type.Union([Type.Literal(\"direct\"), Type.Literal(\"shared\")])),\n userId: Type.Optional(Type.String()),\n text: Type.Optional(Type.String()),\n at: Type.Optional(Type.String()),\n schedule: Type.Optional(Type.String()),\n timezone: Type.Optional(Type.String()),\n});\n\ntype EventFileData = Static<typeof EventFileSchema>;\n\nconst ISO_TIMESTAMP_WITH_OFFSET =\n /^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2})(?::(\\d{2})(?:\\.\\d+)?)?(Z|[+-](\\d{2}):(\\d{2}))$/;\n\nfunction daysInMonth(year: number, month: number): number {\n if (month === 2) {\n const leapYear = year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);\n return leapYear ? 29 : 28;\n }\n return month === 4 || month === 6 || month === 9 || month === 11 ? 30 : 31;\n}\n\nexport function validateEventFilename(filename: string): string {\n const trimmed = filename.trim();\n if (\n !trimmed ||\n trimmed.includes(\"/\") ||\n trimmed.includes(\"\\\\\") ||\n trimmed.includes(\"..\") ||\n !trimmed.endsWith(\".json\")\n ) {\n throw new Error(\"Invalid event filename\");\n }\n return trimmed;\n}\n\nfunction isValidIsoTimestampWithOffset(value: string): boolean {\n const match = ISO_TIMESTAMP_WITH_OFFSET.exec(value);\n if (!match) return false;\n\n const year = Number(match[1]);\n const month = Number(match[2]);\n const day = Number(match[3]);\n const hour = Number(match[4]);\n const minute = Number(match[5]);\n const second = match[6] === undefined ? 0 : Number(match[6]);\n const offsetHour = match[8] === undefined ? 0 : Number(match[8]);\n const offsetMinute = match[9] === undefined ? 0 : Number(match[9]);\n\n return (\n month >= 1 &&\n month <= 12 &&\n day >= 1 &&\n day <= daysInMonth(year, month) &&\n hour >= 0 &&\n hour <= 23 &&\n minute >= 0 &&\n minute <= 59 &&\n second >= 0 &&\n second <= 59 &&\n offsetHour >= 0 &&\n offsetHour <= 23 &&\n offsetMinute >= 0 &&\n offsetMinute <= 59 &&\n Number.isFinite(Date.parse(value))\n );\n}\n\nexport function parseEventPayload(content: string, filename: string): EventFilePayload {\n const data: EventFileData = parseJsonSchemaValue(content, EventFileSchema, (detail) =>\n detail === \"unexpected JSON shape\"\n ? `Expected top-level JSON object in ${filename}`\n : `Malformed event file ${filename}: ${detail}`,\n );\n const conversationId =\n typeof data.conversationId === \"string\"\n ? data.conversationId\n : typeof data.channelId === \"string\"\n ? data.channelId\n : undefined;\n const { type, text } = data;\n\n if (!type || !conversationId || !text) {\n throw new Error(`Missing required fields (type, conversationId, text) in ${filename}`);\n }\n\n const base = {\n ...(data.platform !== undefined ? { platform: data.platform } : {}),\n conversationId,\n ...(data.conversationKind !== undefined ? { conversationKind: data.conversationKind } : {}),\n ...(data.userId !== undefined ? { userId: data.userId } : {}),\n text,\n };\n\n switch (type) {\n case \"immediate\":\n return { type, ...base };\n\n case \"one-shot\":\n if (typeof data.at !== \"string\" || data.at.length === 0) {\n throw new Error(`Missing 'at' field for one-shot event in ${filename}`);\n }\n if (!isValidIsoTimestampWithOffset(data.at)) {\n throw new Error(\n `Invalid 'at' field for one-shot event in ${filename}: expected a valid ISO 8601 timestamp with UTC offset`,\n );\n }\n return { type, ...base, at: data.at };\n\n case \"periodic\":\n if (typeof data.schedule !== \"string\" || data.schedule.length === 0) {\n throw new Error(`Missing 'schedule' field for periodic event in ${filename}`);\n }\n if (typeof data.timezone !== \"string\" || data.timezone.length === 0) {\n throw new Error(`Missing 'timezone' field for periodic event in ${filename}`);\n }\n return { type, ...base, schedule: data.schedule, timezone: data.timezone };\n }\n}\n\nexport function buildEventPayload(input: EventPayloadInput): EventFilePayload {\n const base = {\n ...(input.platform !== undefined ? { platform: input.platform } : {}),\n conversationId: input.conversationId,\n ...(input.conversationKind !== undefined ? { conversationKind: input.conversationKind } : {}),\n ...(input.userId !== undefined ? { userId: input.userId } : {}),\n text: input.text,\n };\n\n switch (input.type) {\n case \"immediate\":\n return { type: \"immediate\", ...base };\n\n case \"one-shot\": {\n if (!input.at) {\n throw new Error(\"`at` is required for one-shot events\");\n }\n if (!isValidIsoTimestampWithOffset(input.at)) {\n throw new Error(\"`at` must be a valid ISO 8601 timestamp with UTC offset\");\n }\n return { type: \"one-shot\", ...base, at: input.at };\n }\n\n case \"periodic\":\n if (!input.schedule) {\n throw new Error(\"`schedule` is required for periodic events\");\n }\n if (!input.timezone) {\n throw new Error(\"`timezone` is required for periodic events\");\n }\n return { type: \"periodic\", ...base, schedule: input.schedule, timezone: input.timezone };\n }\n}\n\nimport { existsSync, mkdirSync, readdirSync, readFileSync, rmSync, statSync } from \"node:fs\";\nimport { mkdir, readdir, readFile, rm, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { atomicWritePrivateFile } from \"../file-guards.js\";\nimport type { Office, Workspace } from \"../office/index.js\";\nimport { createOfficeAddress, listRegisteredOffices, officeKey } from \"../office/index.js\";\n\nexport function officeEventsDir(office: Office): string {\n return join(office.stateDir, \"events\");\n}\n\nexport class OfficeEventStore implements EventStore {\n readonly address: OfficeAddress;\n private readonly eventsDir: string;\n\n constructor(\n private readonly office: Office,\n private readonly scheduler?: EventScheduleSink,\n ) {\n this.address = office.address;\n this.eventsDir = officeEventsDir(office);\n }\n\n async create(filename: string, payload: EventPayload): Promise<{ path: string; size: number }> {\n const safeFilename = validateEventFilename(filename);\n this.assertOwnPayload(payload);\n const filePath = join(this.eventsDir, safeFilename);\n if (existsSync(filePath)) {\n throw new Error(`Event ${safeFilename} already exists`);\n }\n return this.writeRecord(safeFilename, payload);\n }\n\n async list(): Promise<Array<Omit<EventRecord, \"payload\"> & { payload: EventPayload | null }>> {\n if (!existsSync(this.eventsDir)) return [];\n const entries = await readdir(this.eventsDir, { withFileTypes: true });\n const events = await Promise.all(\n entries\n .filter((entry) => entry.isFile() && entry.name.endsWith(\".json\"))\n .map(async (entry) => {\n try {\n return await this.read(entry.name);\n } catch {\n try {\n const fileStat = await stat(join(this.eventsDir, entry.name));\n return {\n filename: entry.name,\n payload: null,\n size: fileStat.size,\n mtimeMs: fileStat.mtimeMs,\n };\n } catch {\n return null;\n }\n }\n }),\n );\n return events\n .filter((event) => event !== null)\n .toSorted((a, b) => a.filename.localeCompare(b.filename));\n }\n\n async read(filename: string): Promise<EventRecord> {\n const safeFilename = validateEventFilename(filename);\n const filePath = join(this.eventsDir, safeFilename);\n if (!existsSync(filePath)) {\n throw new Error(`Event ${safeFilename} not found in the current office`);\n }\n const [raw, fileStat] = await Promise.all([readFile(filePath, \"utf-8\"), stat(filePath)]);\n return {\n filename: safeFilename,\n payload: parseEventPayload(raw, safeFilename),\n size: fileStat.size,\n mtimeMs: fileStat.mtimeMs,\n };\n }\n\n async update(filename: string, payload: EventPayload): Promise<{ path: string; size: number }> {\n const safeFilename = validateEventFilename(filename);\n this.assertOwnPayload(payload);\n if (!existsSync(join(this.eventsDir, safeFilename))) {\n throw new Error(`Event ${safeFilename} not found in the current office`);\n }\n return this.writeRecord(safeFilename, payload);\n }\n\n async delete(filename: string): Promise<{ deleted: boolean }> {\n const safeFilename = validateEventFilename(filename);\n const filePath = join(this.eventsDir, safeFilename);\n if (!existsSync(filePath)) {\n throw new Error(`Event ${safeFilename} not found in the current office`);\n }\n this.scheduler?.cancelRecord(this.address, safeFilename);\n await rm(filePath, { force: true });\n return { deleted: true };\n }\n\n private assertOwnPayload(payload: EventPayload): void {\n if (\n payload.platform !== this.address.platform ||\n payload.conversationId !== this.address.conversationId\n ) {\n throw new Error(\"Event payload must address the current office\");\n }\n }\n\n private async writeRecord(\n safeFilename: string,\n payload: EventPayload,\n ): Promise<{ path: string; size: number }> {\n await mkdir(this.eventsDir, { recursive: true });\n const filePath = join(this.eventsDir, safeFilename);\n atomicWritePrivateFile(filePath, JSON.stringify(payload) + \"\\n\");\n const fileStat = await stat(filePath);\n this.scheduler?.scheduleRecord(this.address, {\n filename: safeFilename,\n payload,\n size: fileStat.size,\n mtimeMs: fileStat.mtimeMs,\n });\n return { path: filePath, size: fileStat.size };\n }\n}\n\nexport interface LegacyEventMigrationReport {\n migrated: { filename: string; key: OfficeKey }[];\n skipped: { filename: string; reason: string }[];\n}\n\nexport function migrateLegacyWorkspaceEvents(workspace: Workspace): LegacyEventMigrationReport {\n const report: LegacyEventMigrationReport = { migrated: [], skipped: [] };\n const legacyDir = join(workspace.root, \"events\");\n if (!existsSync(legacyDir)) return report;\n const registered = new Set(\n listRegisteredOffices(workspace.stateDir).map((record) => officeKey(record)),\n );\n for (const filename of readdirSync(legacyDir).filter((name) => name.endsWith(\".json\"))) {\n const source = join(legacyDir, filename);\n if (!statSync(source).isFile()) continue;\n let payload: EventFilePayload;\n try {\n payload = parseEventPayload(readFileSync(source, \"utf-8\"), filename);\n } catch (error) {\n report.skipped.push({\n filename,\n reason: error instanceof Error ? error.message : String(error),\n });\n continue;\n }\n if (!payload.platform) {\n report.skipped.push({ filename, reason: \"no platform; owner cannot be attributed\" });\n continue;\n }\n let address: OfficeAddress;\n try {\n address = createOfficeAddress(\n payload.platform as OfficeAddress[\"platform\"],\n payload.conversationId,\n );\n } catch (error) {\n report.skipped.push({\n filename,\n reason: error instanceof Error ? error.message : String(error),\n });\n continue;\n }\n const key = officeKey(address);\n if (!registered.has(key)) {\n report.skipped.push({ filename, reason: `office ${key} is not registered` });\n continue;\n }\n const office = workspace.office(address);\n const targetDir = officeEventsDir(office);\n mkdirSync(targetDir, { recursive: true });\n const target = join(targetDir, filename);\n if (existsSync(target)) {\n report.skipped.push({ filename, reason: `already exists in ${key}` });\n continue;\n }\n atomicWritePrivateFile(target, JSON.stringify(payload) + \"\\n\");\n rmSync(source);\n report.migrated.push({ filename, key });\n }\n return report;\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/events/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { OfficeAddress, OfficeKey } from \"../types.js\";\n\nexport type EventPayload = EventFilePayload;\n\nexport interface EventRecord {\n filename: string;\n payload: EventFilePayload;\n size: number;\n mtimeMs: number;\n}\n\nexport interface EventStore {\n readonly address: OfficeAddress;\n create(filename: string, payload: EventFilePayload): Promise<{ path: string; size: number }>;\n list(): Promise<Array<Omit<EventRecord, \"payload\"> & { payload: EventFilePayload | null }>>;\n read(filename: string): Promise<EventRecord>;\n update(filename: string, payload: EventFilePayload): Promise<{ path: string; size: number }>;\n delete(filename: string): Promise<{ deleted: boolean }>;\n}\n\nexport interface EventScheduleSink {\n scheduleRecord(address: OfficeAddress, record: EventRecord): void;\n cancelRecord(address: OfficeAddress, filename: string): void;\n}\n\nexport type EventConversationKind = \"direct\" | \"shared\";\n\nexport type EventType = \"immediate\" | \"one-shot\" | \"periodic\";\n\ninterface EventPayloadBase {\n platform?: string;\n conversationId: string;\n conversationKind?: EventConversationKind;\n userId?: string;\n text: string;\n}\n\nexport interface ImmediateEventPayload extends EventPayloadBase {\n type: \"immediate\";\n}\n\nexport interface OneShotEventPayload extends EventPayloadBase {\n type: \"one-shot\";\n at: string;\n}\n\nexport interface PeriodicEventPayload extends EventPayloadBase {\n type: \"periodic\";\n schedule: string;\n timezone: string;\n}\n\nexport type EventFilePayload = ImmediateEventPayload | OneShotEventPayload | PeriodicEventPayload;\n\nexport interface EventPayloadInput {\n type: EventType;\n platform?: string;\n conversationId: string;\n conversationKind?: EventConversationKind;\n userId?: string;\n text: string;\n at?: string;\n schedule?: string;\n timezone?: string;\n}\n\ninterface ResolvedEventFields {\n platform: string;\n conversationKind: EventConversationKind;\n}\n\nexport type MikanEvent =\n | (ImmediateEventPayload & ResolvedEventFields)\n | (OneShotEventPayload & ResolvedEventFields)\n | (PeriodicEventPayload & ResolvedEventFields);\n\nexport interface PeriodicEventInfo {\n filename: string;\n platform: string;\n conversationId: string;\n conversationKind: EventConversationKind;\n text: string;\n schedule: string;\n timezone: string;\n nextRun: string | null;\n}\n\nimport { type Static, Type } from \"typebox\";\nimport { parseJsonSchemaValue } from \"../file-guards.js\";\n\nexport const EventTypeSchema = Type.Union([\n Type.Literal(\"immediate\"),\n Type.Literal(\"one-shot\"),\n Type.Literal(\"periodic\"),\n]);\n\nconst EventFileSchema = Type.Object({\n type: Type.Optional(EventTypeSchema),\n platform: Type.Optional(Type.String()),\n conversationId: Type.Optional(Type.String()),\n channelId: Type.Optional(Type.String()),\n conversationKind: Type.Optional(Type.Union([Type.Literal(\"direct\"), Type.Literal(\"shared\")])),\n userId: Type.Optional(Type.String()),\n text: Type.Optional(Type.String()),\n at: Type.Optional(Type.String()),\n schedule: Type.Optional(Type.String()),\n timezone: Type.Optional(Type.String()),\n});\n\ntype EventFileData = Static<typeof EventFileSchema>;\n\nconst ISO_TIMESTAMP_WITH_OFFSET =\n /^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2})(?::(\\d{2})(?:\\.\\d+)?)?(Z|[+-](\\d{2}):(\\d{2}))$/;\n\nfunction daysInMonth(year: number, month: number): number {\n if (month === 2) {\n const leapYear = year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);\n return leapYear ? 29 : 28;\n }\n return month === 4 || month === 6 || month === 9 || month === 11 ? 30 : 31;\n}\n\nexport function validateEventFilename(filename: string): string {\n const trimmed = filename.trim();\n if (\n !trimmed ||\n trimmed.includes(\"/\") ||\n trimmed.includes(\"\\\\\") ||\n trimmed.includes(\"..\") ||\n !trimmed.endsWith(\".json\")\n ) {\n throw new Error(\"Invalid event filename\");\n }\n return trimmed;\n}\n\nfunction isValidIsoTimestampWithOffset(value: string): boolean {\n const match = ISO_TIMESTAMP_WITH_OFFSET.exec(value);\n if (!match) return false;\n\n const year = Number(match[1]);\n const month = Number(match[2]);\n const day = Number(match[3]);\n const hour = Number(match[4]);\n const minute = Number(match[5]);\n const second = match[6] === undefined ? 0 : Number(match[6]);\n const offsetHour = match[8] === undefined ? 0 : Number(match[8]);\n const offsetMinute = match[9] === undefined ? 0 : Number(match[9]);\n\n return (\n month >= 1 &&\n month <= 12 &&\n day >= 1 &&\n day <= daysInMonth(year, month) &&\n hour >= 0 &&\n hour <= 23 &&\n minute >= 0 &&\n minute <= 59 &&\n second >= 0 &&\n second <= 59 &&\n offsetHour >= 0 &&\n offsetHour <= 23 &&\n offsetMinute >= 0 &&\n offsetMinute <= 59 &&\n Number.isFinite(Date.parse(value))\n );\n}\n\nexport function parseEventPayload(content: string, filename: string): EventFilePayload {\n const data: EventFileData = parseJsonSchemaValue(content, EventFileSchema, (detail, kind) =>\n kind === \"shape\"\n ? `Expected top-level JSON object in ${filename}`\n : `Malformed event file ${filename}: ${detail}`,\n );\n const conversationId =\n typeof data.conversationId === \"string\"\n ? data.conversationId\n : typeof data.channelId === \"string\"\n ? data.channelId\n : undefined;\n const { type, text } = data;\n\n if (!type || !conversationId || !text) {\n throw new Error(`Missing required fields (type, conversationId, text) in ${filename}`);\n }\n\n const base = {\n platform: data.platform,\n conversationId,\n conversationKind: data.conversationKind,\n userId: data.userId,\n text,\n };\n\n switch (type) {\n case \"immediate\":\n return { type, ...base };\n\n case \"one-shot\":\n if (typeof data.at !== \"string\" || data.at.length === 0) {\n throw new Error(`Missing 'at' field for one-shot event in ${filename}`);\n }\n if (!isValidIsoTimestampWithOffset(data.at)) {\n throw new Error(\n `Invalid 'at' field for one-shot event in ${filename}: expected a valid ISO 8601 timestamp with UTC offset`,\n );\n }\n return { type, ...base, at: data.at };\n\n case \"periodic\":\n if (typeof data.schedule !== \"string\" || data.schedule.length === 0) {\n throw new Error(`Missing 'schedule' field for periodic event in ${filename}`);\n }\n if (typeof data.timezone !== \"string\" || data.timezone.length === 0) {\n throw new Error(`Missing 'timezone' field for periodic event in ${filename}`);\n }\n return { type, ...base, schedule: data.schedule, timezone: data.timezone };\n }\n}\n\nexport function buildEventPayload(input: EventPayloadInput): EventFilePayload {\n const base = {\n platform: input.platform,\n conversationId: input.conversationId,\n conversationKind: input.conversationKind,\n userId: input.userId,\n text: input.text,\n };\n\n switch (input.type) {\n case \"immediate\":\n return { type: \"immediate\", ...base };\n\n case \"one-shot\": {\n if (!input.at) {\n throw new Error(\"`at` is required for one-shot events\");\n }\n if (!isValidIsoTimestampWithOffset(input.at)) {\n throw new Error(\"`at` must be a valid ISO 8601 timestamp with UTC offset\");\n }\n return { type: \"one-shot\", ...base, at: input.at };\n }\n\n case \"periodic\":\n if (!input.schedule) {\n throw new Error(\"`schedule` is required for periodic events\");\n }\n if (!input.timezone) {\n throw new Error(\"`timezone` is required for periodic events\");\n }\n return { type: \"periodic\", ...base, schedule: input.schedule, timezone: input.timezone };\n }\n}\n\nimport { existsSync, mkdirSync, readdirSync, readFileSync, rmSync, statSync } from \"node:fs\";\nimport { mkdir, readdir, readFile, rm, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { atomicWritePrivateFile } from \"../file-guards.js\";\nimport type { Office, Workspace } from \"../office/types.js\";\nimport { createOfficeAddress, listRegisteredOffices, officeKey } from \"../office/index.js\";\nimport { errorMessage } from \"../unknown-values.js\";\n\nexport function officeEventsDir(office: Office): string {\n return join(office.stateDir, \"events\");\n}\n\nexport class OfficeEventStore implements EventStore {\n readonly address: OfficeAddress;\n private readonly eventsDir: string;\n\n constructor(\n private readonly office: Office,\n private readonly scheduler?: EventScheduleSink,\n ) {\n this.address = office.address;\n this.eventsDir = officeEventsDir(office);\n }\n\n async create(filename: string, payload: EventPayload): Promise<{ path: string; size: number }> {\n const safeFilename = validateEventFilename(filename);\n this.assertOwnPayload(payload);\n const filePath = join(this.eventsDir, safeFilename);\n if (existsSync(filePath)) {\n throw new Error(`Event ${safeFilename} already exists`);\n }\n return this.writeRecord(safeFilename, payload);\n }\n\n async list(): Promise<Array<Omit<EventRecord, \"payload\"> & { payload: EventPayload | null }>> {\n if (!existsSync(this.eventsDir)) return [];\n const entries = await readdir(this.eventsDir, { withFileTypes: true });\n const events = await Promise.all(\n entries\n .filter((entry) => entry.isFile() && entry.name.endsWith(\".json\"))\n .map(async (entry) => {\n try {\n return await this.read(entry.name);\n } catch {\n try {\n const fileStat = await stat(join(this.eventsDir, entry.name));\n return {\n filename: entry.name,\n payload: null,\n size: fileStat.size,\n mtimeMs: fileStat.mtimeMs,\n };\n } catch {\n return null;\n }\n }\n }),\n );\n return events\n .filter((event) => event !== null)\n .toSorted((a, b) => a.filename.localeCompare(b.filename));\n }\n\n async read(filename: string): Promise<EventRecord> {\n const safeFilename = validateEventFilename(filename);\n const filePath = join(this.eventsDir, safeFilename);\n if (!existsSync(filePath)) {\n throw new Error(`Event ${safeFilename} not found in the current office`);\n }\n const [raw, fileStat] = await Promise.all([readFile(filePath, \"utf-8\"), stat(filePath)]);\n return {\n filename: safeFilename,\n payload: parseEventPayload(raw, safeFilename),\n size: fileStat.size,\n mtimeMs: fileStat.mtimeMs,\n };\n }\n\n async update(filename: string, payload: EventPayload): Promise<{ path: string; size: number }> {\n const safeFilename = validateEventFilename(filename);\n this.assertOwnPayload(payload);\n if (!existsSync(join(this.eventsDir, safeFilename))) {\n throw new Error(`Event ${safeFilename} not found in the current office`);\n }\n return this.writeRecord(safeFilename, payload);\n }\n\n async delete(filename: string): Promise<{ deleted: boolean }> {\n const safeFilename = validateEventFilename(filename);\n const filePath = join(this.eventsDir, safeFilename);\n if (!existsSync(filePath)) {\n throw new Error(`Event ${safeFilename} not found in the current office`);\n }\n this.scheduler?.cancelRecord(this.address, safeFilename);\n await rm(filePath, { force: true });\n return { deleted: true };\n }\n\n private assertOwnPayload(payload: EventPayload): void {\n if (\n payload.platform !== this.address.platform ||\n payload.conversationId !== this.address.conversationId\n ) {\n throw new Error(\"Event payload must address the current office\");\n }\n }\n\n private async writeRecord(\n safeFilename: string,\n payload: EventPayload,\n ): Promise<{ path: string; size: number }> {\n await mkdir(this.eventsDir, { recursive: true });\n const filePath = join(this.eventsDir, safeFilename);\n atomicWritePrivateFile(filePath, JSON.stringify(payload) + \"\\n\");\n const fileStat = await stat(filePath);\n this.scheduler?.scheduleRecord(this.address, {\n filename: safeFilename,\n payload,\n size: fileStat.size,\n mtimeMs: fileStat.mtimeMs,\n });\n return { path: filePath, size: fileStat.size };\n }\n}\n\nexport interface LegacyEventMigrationReport {\n migrated: { filename: string; key: OfficeKey }[];\n skipped: { filename: string; reason: string }[];\n}\n\nexport function migrateLegacyWorkspaceEvents(workspace: Workspace): LegacyEventMigrationReport {\n const report: LegacyEventMigrationReport = { migrated: [], skipped: [] };\n const legacyDir = join(workspace.root, \"events\");\n if (!existsSync(legacyDir)) return report;\n const registered = new Set(\n listRegisteredOffices(workspace.stateDir).map((record) => officeKey(record)),\n );\n for (const filename of readdirSync(legacyDir).filter((name) => name.endsWith(\".json\"))) {\n const source = join(legacyDir, filename);\n if (!statSync(source).isFile()) continue;\n let payload: EventFilePayload;\n try {\n payload = parseEventPayload(readFileSync(source, \"utf-8\"), filename);\n } catch (error) {\n report.skipped.push({\n filename,\n reason: errorMessage(error),\n });\n continue;\n }\n if (!payload.platform) {\n report.skipped.push({ filename, reason: \"no platform; owner cannot be attributed\" });\n continue;\n }\n let address: OfficeAddress;\n try {\n address = createOfficeAddress(\n payload.platform as OfficeAddress[\"platform\"],\n payload.conversationId,\n );\n } catch (error) {\n report.skipped.push({\n filename,\n reason: errorMessage(error),\n });\n continue;\n }\n const key = officeKey(address);\n if (!registered.has(key)) {\n report.skipped.push({ filename, reason: `office ${key} is not registered` });\n continue;\n }\n const office = workspace.office(address);\n const targetDir = officeEventsDir(office);\n mkdirSync(targetDir, { recursive: true });\n const target = join(targetDir, filename);\n if (existsSync(target)) {\n report.skipped.push({ filename, reason: `already exists in ${key}` });\n continue;\n }\n atomicWritePrivateFile(target, JSON.stringify(payload) + \"\\n\");\n rmSync(source);\n report.migrated.push({ filename, key });\n }\n return report;\n}\n"]}
@@ -1,8 +1,7 @@
1
1
  import type { MessagingBot } from "../types.js";
2
- import { type Workspace } from "../office/index.js";
2
+ import type { Workspace } from "../office/types.js";
3
3
  import type { OfficeAddress } from "../types.js";
4
4
  import { type EventRecord, type EventScheduleSink, type MikanEvent, type PeriodicEventInfo } from "./index.js";
5
- export type { MikanEvent, PeriodicEventInfo } from "./index.js";
6
5
  export declare class EventScheduler implements EventScheduleSink {
7
6
  private readonly workspace;
8
7
  private readonly botsByPlatform;
@@ -1 +1 @@
1
- {"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../src/events/scheduler.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAoB,YAAY,EAAgB,MAAM,aAAa,CAAC;AAEhF,OAAO,EAAoC,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAGtF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,UAAU,EACf,KAAK,iBAAiB,EACvB,MAAM,YAAY,CAAC;AAEpB,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAUhE,qBAAa,cAAe,YAAW,iBAAiB;IAKpD,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,cAAc;IALjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgC;IAC1D,OAAO,CAAC,SAAS,CAAc;IAE/B,YACmB,SAAS,EAAE,SAAS,EACpB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,EAC3D;IAEJ,KAAK,IAAI,IAAI,CAuBZ;IAED,IAAI,IAAI,IAAI,CAOX;IAED,cAAc,IAAI,MAAM,CAEvB;IAED,cAAc,CAAC,OAAO,EAAE,aAAa,GAAG,iBAAiB,EAAE,CAiB1D;IAED,cAAc,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI,CA6ChE;IAED,YAAY,CAAC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAE3D;IAED,OAAO,CAAC,GAAG;IAIX,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,OAAO;IAcf,OAAO,CAAC,OAAO;IA0Bf,OAAO,CAAC,aAAa;IAyBrB,OAAO,CAAC,UAAU;CAUnB;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAwB1D"}
1
+ {"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../src/events/scheduler.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAoB,YAAY,EAAgB,MAAM,aAAa,CAAC;AAGhF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAGpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,UAAU,EACf,KAAK,iBAAiB,EACvB,MAAM,YAAY,CAAC;AAWpB,qBAAa,cAAe,YAAW,iBAAiB;IAKpD,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,cAAc;IALjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgC;IAC1D,OAAO,CAAC,SAAS,CAAc;IAE/B,YACmB,SAAS,EAAE,SAAS,EACpB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,EAC3D;IAEJ,KAAK,IAAI,IAAI,CAuBZ;IAED,IAAI,IAAI,IAAI,CAOX;IAED,cAAc,IAAI,MAAM,CAEvB;IAED,cAAc,CAAC,OAAO,EAAE,aAAa,GAAG,iBAAiB,EAAE,CAiB1D;IAED,cAAc,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI,CA0ChE;IAED,YAAY,CAAC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAE3D;IAED,OAAO,CAAC,GAAG;IAIX,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,OAAO;IAcf,OAAO,CAAC,OAAO;IA0Bf,OAAO,CAAC,aAAa;IAyBrB,OAAO,CAAC,UAAU;CAUnB;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAwB1D"}
@@ -1,12 +1,12 @@
1
1
  import { Cron } from "croner";
2
2
  import { existsSync, readdirSync, readFileSync, unlinkSync } from "node:fs";
3
3
  import { join } from "node:path";
4
- import { createConversationEvent } from "../adapters/index.js";
5
4
  import * as log from "../log.js";
6
- import { listRegisteredOffices, officeKey } from "../office/index.js";
5
+ import { createConversationEvent, listRegisteredOffices, officeKey } from "../office/index.js";
7
6
  import { reportUserFacingError } from "../observability/index.js";
8
7
  import { inferConversationKind } from "../sessions/session-key.js";
9
8
  import { officeEventsDir, parseEventPayload, } from "./index.js";
9
+ import { errorMessage } from "../unknown-values.js";
10
10
  export class EventScheduler {
11
11
  constructor(workspace, botsByPlatform) {
12
12
  this.workspace = workspace;
@@ -30,7 +30,7 @@ export class EventScheduler {
30
30
  loaded++;
31
31
  }
32
32
  catch (error) {
33
- log.logWarning(`Removing unparseable event file ${filename} for ${office.key}`, error instanceof Error ? error.message : String(error));
33
+ log.logWarning(`Removing unparseable event file ${filename} for ${office.key}`, errorMessage(error));
34
34
  this.removeFile(office.address, filename);
35
35
  }
36
36
  }
@@ -76,7 +76,7 @@ export class EventScheduler {
76
76
  event = this.resolve(record, address);
77
77
  }
78
78
  catch (error) {
79
- log.logWarning(`Rejecting event ${record.filename}`, error instanceof Error ? error.message : String(error));
79
+ log.logWarning(`Rejecting event ${record.filename}`, errorMessage(error));
80
80
  this.removeFile(address, record.filename);
81
81
  return;
82
82
  }
@@ -1 +1 @@
1
- {"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../src/events/scheduler.ts"],"names":[],"mappings":"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","sourcesContent":["import { Cron } from \"croner\";\nimport { existsSync, readdirSync, readFileSync, unlinkSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { createConversationEvent } from \"../adapters/index.js\";\nimport type { ConversationKind, MessagingBot, PlatformName } from \"../types.js\";\nimport * as log from \"../log.js\";\nimport { listRegisteredOffices, officeKey, type Workspace } from \"../office/index.js\";\nimport { reportUserFacingError } from \"../observability/index.js\";\nimport { inferConversationKind } from \"../sessions/session-key.js\";\nimport type { OfficeAddress } from \"../types.js\";\nimport {\n officeEventsDir,\n parseEventPayload,\n type EventRecord,\n type EventScheduleSink,\n type MikanEvent,\n type PeriodicEventInfo,\n} from \"./index.js\";\n\nexport type { MikanEvent, PeriodicEventInfo } from \"./index.js\";\n\ninterface Scheduled {\n address: OfficeAddress;\n filename: string;\n event: MikanEvent;\n timer?: NodeJS.Timeout;\n cron?: Cron;\n}\n\nexport class EventScheduler implements EventScheduleSink {\n private readonly scheduled = new Map<string, Scheduled>();\n private startTime = Date.now();\n\n constructor(\n private readonly workspace: Workspace,\n private readonly botsByPlatform: Record<string, MessagingBot>,\n ) {}\n\n start(): void {\n this.startTime = Date.now();\n let loaded = 0;\n for (const record of listRegisteredOffices(this.workspace.stateDir)) {\n const office = this.workspace.office(record);\n const dir = officeEventsDir(office);\n if (!existsSync(dir)) continue;\n for (const filename of readdirSync(dir).filter((name) => name.endsWith(\".json\"))) {\n const path = join(dir, filename);\n try {\n const payload = parseEventPayload(readFileSync(path, \"utf-8\"), filename);\n this.scheduleRecord(office.address, { filename, payload, size: 0, mtimeMs: 0 });\n loaded++;\n } catch (error) {\n log.logWarning(\n `Removing unparseable event file ${filename} for ${office.key}`,\n error instanceof Error ? error.message : String(error),\n );\n this.removeFile(office.address, filename);\n }\n }\n }\n log.logInfo(`Event scheduler started, tracking ${loaded} records`);\n }\n\n stop(): void {\n for (const entry of this.scheduled.values()) {\n if (entry.timer) clearTimeout(entry.timer);\n entry.cron?.stop();\n }\n this.scheduled.clear();\n log.logInfo(\"Event scheduler stopped\");\n }\n\n scheduledCount(): number {\n return this.scheduled.size;\n }\n\n periodicEvents(address: OfficeAddress): PeriodicEventInfo[] {\n const prefix = `${officeKey(address)}/`;\n const results: PeriodicEventInfo[] = [];\n for (const [key, entry] of this.scheduled) {\n if (!key.startsWith(prefix) || entry.event.type !== \"periodic\" || !entry.cron) continue;\n results.push({\n filename: entry.filename,\n platform: entry.event.platform,\n conversationId: entry.event.conversationId,\n conversationKind: entry.event.conversationKind,\n text: entry.event.text,\n schedule: entry.event.schedule,\n timezone: entry.event.timezone,\n nextRun: entry.cron.nextRun()?.toISOString() ?? null,\n });\n }\n return results;\n }\n\n scheduleRecord(address: OfficeAddress, record: EventRecord): void {\n const key = this.key(address, record.filename);\n this.cancelKey(key);\n let event: MikanEvent;\n try {\n event = this.resolve(record, address);\n } catch (error) {\n log.logWarning(\n `Rejecting event ${record.filename}`,\n error instanceof Error ? error.message : String(error),\n );\n this.removeFile(address, record.filename);\n return;\n }\n const entry: Scheduled = { address, filename: record.filename, event };\n switch (event.type) {\n case \"immediate\":\n this.execute(entry);\n return;\n case \"one-shot\": {\n const delay = new Date(event.at).getTime() - Date.now();\n if (delay <= 0) {\n log.logInfo(`One-shot event in the past, deleting: ${record.filename}`);\n this.removeFile(address, record.filename);\n return;\n }\n entry.timer = setTimeout(() => {\n this.scheduled.delete(key);\n this.execute(entry);\n }, delay);\n this.scheduled.set(key, entry);\n return;\n }\n case \"periodic\":\n try {\n entry.cron = new Cron(event.schedule, { timezone: event.timezone }, () =>\n this.execute(entry, false),\n );\n } catch (error) {\n log.logWarning(`Invalid cron schedule for ${record.filename}`, String(error));\n this.removeFile(address, record.filename);\n return;\n }\n this.scheduled.set(key, entry);\n }\n }\n\n cancelRecord(address: OfficeAddress, filename: string): void {\n this.cancelKey(this.key(address, filename));\n }\n\n private key(address: OfficeAddress, filename: string): string {\n return `${officeKey(address)}/${filename}`;\n }\n\n private cancelKey(key: string): void {\n const entry = this.scheduled.get(key);\n if (!entry) return;\n if (entry.timer) clearTimeout(entry.timer);\n entry.cron?.stop();\n this.scheduled.delete(key);\n }\n\n private resolve(record: EventRecord, address: OfficeAddress): MikanEvent {\n const { payload } = record;\n const platform = (payload.platform ?? address.platform).toLowerCase();\n if (platform !== address.platform || payload.conversationId !== address.conversationId) {\n throw new Error(\"event payload does not address its owning office\");\n }\n if (!this.botsByPlatform[platform]) {\n throw new Error(`no bot configured for platform '${platform}'`);\n }\n const conversationKind: ConversationKind =\n payload.conversationKind ?? inferConversationKind(platform, payload.conversationId);\n return { ...payload, platform, conversationKind };\n }\n\n private execute(entry: Scheduled, deleteAfter = true): void {\n const { event, filename, address } = entry;\n const bot = this.botsByPlatform[event.platform];\n if (!bot) {\n this.reportFailure(entry, deleteAfter, \"missing_bot\");\n if (deleteAfter) this.removeFile(address, filename);\n return;\n }\n const enqueued = bot.enqueueEvent(\n createConversationEvent({\n platform: event.platform as PlatformName,\n type: \"mention\",\n conversationId: event.conversationId,\n conversationKind: event.conversationKind,\n user: event.userId ?? \"EVENT\",\n text: buildEventPrompt(event),\n ts: `event:${filename.replace(/\\.json$/i, \"\")}`,\n }),\n );\n if (!enqueued) {\n log.logWarning(`Event queue full, discarded: ${filename}`);\n this.reportFailure(entry, deleteAfter, \"queue_full\");\n }\n if (deleteAfter) this.removeFile(address, filename);\n }\n\n private reportFailure(\n entry: Scheduled,\n deleteAfter: boolean,\n failure: \"missing_bot\" | \"queue_full\",\n ): void {\n const reason = failure === \"missing_bot\" ? \"missing bot\" : \"queue full\";\n reportUserFacingError(new Error(`Scheduled event delivery failed: ${reason}`), {\n domain: \"events\",\n surface: \"event_delivery\",\n operation: \"event_execute\",\n severity: \"error\",\n platform: entry.event.platform,\n context: {\n failure,\n filename: entry.filename,\n eventType: entry.event.type,\n conversationId: entry.event.conversationId,\n conversationKind: entry.event.conversationKind,\n deleteAfter,\n triggeredByEventFile: true,\n textLength: entry.event.text.length,\n },\n });\n }\n\n private removeFile(address: OfficeAddress, filename: string): void {\n const path = join(officeEventsDir(this.workspace.office(address)), filename);\n try {\n unlinkSync(path);\n } catch (error) {\n if (error instanceof Error && \"code\" in error && error.code !== \"ENOENT\") {\n log.logWarning(`Failed to delete event file: ${filename}`, String(error));\n }\n }\n }\n}\n\nexport function buildEventPrompt(event: MikanEvent): string {\n switch (event.type) {\n case \"one-shot\":\n return [\n \"Please deliver the following reminder to the user in a short, natural way.\",\n \"Do not greet, do not introduce yourself, and do not ask generic follow-up questions.\",\n \"\",\n `Reminder: ${event.text}`,\n ].join(\"\\n\");\n case \"periodic\":\n return [\n \"Handle the following recurring task.\",\n \"Respond concisely. If there is nothing actionable to report, reply with [SILENT].\",\n \"\",\n `Task: ${event.text}`,\n ].join(\"\\n\");\n case \"immediate\":\n return [\n \"Handle the following event/update in a concise, context-appropriate way.\",\n \"If it reads like a reminder or follow-up, deliver it directly without greeting or generic offers to help.\",\n \"\",\n `Event: ${event.text}`,\n ].join(\"\\n\");\n }\n}\n"]}
1
+ {"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../src/events/scheduler.ts"],"names":[],"mappings":"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","sourcesContent":["import { Cron } from \"croner\";\nimport { existsSync, readdirSync, readFileSync, unlinkSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { ConversationKind, MessagingBot, PlatformName } from \"../types.js\";\nimport * as log from \"../log.js\";\nimport { createConversationEvent, listRegisteredOffices, officeKey } from \"../office/index.js\";\nimport type { Workspace } from \"../office/types.js\";\nimport { reportUserFacingError } from \"../observability/index.js\";\nimport { inferConversationKind } from \"../sessions/session-key.js\";\nimport type { OfficeAddress } from \"../types.js\";\nimport {\n officeEventsDir,\n parseEventPayload,\n type EventRecord,\n type EventScheduleSink,\n type MikanEvent,\n type PeriodicEventInfo,\n} from \"./index.js\";\nimport { errorMessage } from \"../unknown-values.js\";\n\ninterface Scheduled {\n address: OfficeAddress;\n filename: string;\n event: MikanEvent;\n timer?: NodeJS.Timeout;\n cron?: Cron;\n}\n\nexport class EventScheduler implements EventScheduleSink {\n private readonly scheduled = new Map<string, Scheduled>();\n private startTime = Date.now();\n\n constructor(\n private readonly workspace: Workspace,\n private readonly botsByPlatform: Record<string, MessagingBot>,\n ) {}\n\n start(): void {\n this.startTime = Date.now();\n let loaded = 0;\n for (const record of listRegisteredOffices(this.workspace.stateDir)) {\n const office = this.workspace.office(record);\n const dir = officeEventsDir(office);\n if (!existsSync(dir)) continue;\n for (const filename of readdirSync(dir).filter((name) => name.endsWith(\".json\"))) {\n const path = join(dir, filename);\n try {\n const payload = parseEventPayload(readFileSync(path, \"utf-8\"), filename);\n this.scheduleRecord(office.address, { filename, payload, size: 0, mtimeMs: 0 });\n loaded++;\n } catch (error) {\n log.logWarning(\n `Removing unparseable event file ${filename} for ${office.key}`,\n errorMessage(error),\n );\n this.removeFile(office.address, filename);\n }\n }\n }\n log.logInfo(`Event scheduler started, tracking ${loaded} records`);\n }\n\n stop(): void {\n for (const entry of this.scheduled.values()) {\n if (entry.timer) clearTimeout(entry.timer);\n entry.cron?.stop();\n }\n this.scheduled.clear();\n log.logInfo(\"Event scheduler stopped\");\n }\n\n scheduledCount(): number {\n return this.scheduled.size;\n }\n\n periodicEvents(address: OfficeAddress): PeriodicEventInfo[] {\n const prefix = `${officeKey(address)}/`;\n const results: PeriodicEventInfo[] = [];\n for (const [key, entry] of this.scheduled) {\n if (!key.startsWith(prefix) || entry.event.type !== \"periodic\" || !entry.cron) continue;\n results.push({\n filename: entry.filename,\n platform: entry.event.platform,\n conversationId: entry.event.conversationId,\n conversationKind: entry.event.conversationKind,\n text: entry.event.text,\n schedule: entry.event.schedule,\n timezone: entry.event.timezone,\n nextRun: entry.cron.nextRun()?.toISOString() ?? null,\n });\n }\n return results;\n }\n\n scheduleRecord(address: OfficeAddress, record: EventRecord): void {\n const key = this.key(address, record.filename);\n this.cancelKey(key);\n let event: MikanEvent;\n try {\n event = this.resolve(record, address);\n } catch (error) {\n log.logWarning(`Rejecting event ${record.filename}`, errorMessage(error));\n this.removeFile(address, record.filename);\n return;\n }\n const entry: Scheduled = { address, filename: record.filename, event };\n switch (event.type) {\n case \"immediate\":\n this.execute(entry);\n return;\n case \"one-shot\": {\n const delay = new Date(event.at).getTime() - Date.now();\n if (delay <= 0) {\n log.logInfo(`One-shot event in the past, deleting: ${record.filename}`);\n this.removeFile(address, record.filename);\n return;\n }\n entry.timer = setTimeout(() => {\n this.scheduled.delete(key);\n this.execute(entry);\n }, delay);\n this.scheduled.set(key, entry);\n return;\n }\n case \"periodic\":\n try {\n entry.cron = new Cron(event.schedule, { timezone: event.timezone }, () =>\n this.execute(entry, false),\n );\n } catch (error) {\n log.logWarning(`Invalid cron schedule for ${record.filename}`, String(error));\n this.removeFile(address, record.filename);\n return;\n }\n this.scheduled.set(key, entry);\n }\n }\n\n cancelRecord(address: OfficeAddress, filename: string): void {\n this.cancelKey(this.key(address, filename));\n }\n\n private key(address: OfficeAddress, filename: string): string {\n return `${officeKey(address)}/${filename}`;\n }\n\n private cancelKey(key: string): void {\n const entry = this.scheduled.get(key);\n if (!entry) return;\n if (entry.timer) clearTimeout(entry.timer);\n entry.cron?.stop();\n this.scheduled.delete(key);\n }\n\n private resolve(record: EventRecord, address: OfficeAddress): MikanEvent {\n const { payload } = record;\n const platform = (payload.platform ?? address.platform).toLowerCase();\n if (platform !== address.platform || payload.conversationId !== address.conversationId) {\n throw new Error(\"event payload does not address its owning office\");\n }\n if (!this.botsByPlatform[platform]) {\n throw new Error(`no bot configured for platform '${platform}'`);\n }\n const conversationKind: ConversationKind =\n payload.conversationKind ?? inferConversationKind(platform, payload.conversationId);\n return { ...payload, platform, conversationKind };\n }\n\n private execute(entry: Scheduled, deleteAfter = true): void {\n const { event, filename, address } = entry;\n const bot = this.botsByPlatform[event.platform];\n if (!bot) {\n this.reportFailure(entry, deleteAfter, \"missing_bot\");\n if (deleteAfter) this.removeFile(address, filename);\n return;\n }\n const enqueued = bot.enqueueEvent(\n createConversationEvent({\n platform: event.platform as PlatformName,\n type: \"mention\",\n conversationId: event.conversationId,\n conversationKind: event.conversationKind,\n user: event.userId ?? \"EVENT\",\n text: buildEventPrompt(event),\n ts: `event:${filename.replace(/\\.json$/i, \"\")}`,\n }),\n );\n if (!enqueued) {\n log.logWarning(`Event queue full, discarded: ${filename}`);\n this.reportFailure(entry, deleteAfter, \"queue_full\");\n }\n if (deleteAfter) this.removeFile(address, filename);\n }\n\n private reportFailure(\n entry: Scheduled,\n deleteAfter: boolean,\n failure: \"missing_bot\" | \"queue_full\",\n ): void {\n const reason = failure === \"missing_bot\" ? \"missing bot\" : \"queue full\";\n reportUserFacingError(new Error(`Scheduled event delivery failed: ${reason}`), {\n domain: \"events\",\n surface: \"event_delivery\",\n operation: \"event_execute\",\n severity: \"error\",\n platform: entry.event.platform,\n context: {\n failure,\n filename: entry.filename,\n eventType: entry.event.type,\n conversationId: entry.event.conversationId,\n conversationKind: entry.event.conversationKind,\n deleteAfter,\n triggeredByEventFile: true,\n textLength: entry.event.text.length,\n },\n });\n }\n\n private removeFile(address: OfficeAddress, filename: string): void {\n const path = join(officeEventsDir(this.workspace.office(address)), filename);\n try {\n unlinkSync(path);\n } catch (error) {\n if (error instanceof Error && \"code\" in error && error.code !== \"ENOENT\") {\n log.logWarning(`Failed to delete event file: ${filename}`, String(error));\n }\n }\n }\n}\n\nexport function buildEventPrompt(event: MikanEvent): string {\n switch (event.type) {\n case \"one-shot\":\n return [\n \"Please deliver the following reminder to the user in a short, natural way.\",\n \"Do not greet, do not introduce yourself, and do not ask generic follow-up questions.\",\n \"\",\n `Reminder: ${event.text}`,\n ].join(\"\\n\");\n case \"periodic\":\n return [\n \"Handle the following recurring task.\",\n \"Respond concisely. If there is nothing actionable to report, reply with [SILENT].\",\n \"\",\n `Task: ${event.text}`,\n ].join(\"\\n\");\n case \"immediate\":\n return [\n \"Handle the following event/update in a concise, context-appropriate way.\",\n \"If it reads like a reminder or follow-up, deliver it directly without greeting or generic offers to help.\",\n \"\",\n `Event: ${event.text}`,\n ].join(\"\\n\");\n }\n}\n"]}
@@ -1,11 +1,13 @@
1
- import type { Static, TSchema } from "@sinclair/typebox";
1
+ import type { Static, TSchema } from "typebox";
2
+ type JsonFailureKind = "syntax" | "shape" | "field";
3
+ type MalformedJsonMessage = (detail: string, kind: JsonFailureKind) => string;
2
4
  export declare function ensureDirExists(dir: string): void;
3
5
  export declare function readTextFileIfExists(path: string): string | undefined;
4
- export declare function readJsonFileIfExists<T>(path: string, validate: (value: unknown) => value is T, malformedMessage: (detail: string) => string): T | undefined;
5
- export declare function readJsonSchemaFileIfExists<T extends TSchema>(path: string, schema: T, malformedMessage: (detail: string) => string): Static<T> | undefined;
6
- export declare function parseJsonValue<T>(raw: string, validate: (value: unknown) => value is T, malformedMessage: (detail: string) => string): T;
7
- export declare function parseJsonSchemaValue<T extends TSchema>(raw: string, schema: T, malformedMessage: (detail: string) => string): Static<T>;
8
- export declare function isRecord(value: unknown): value is Record<string, unknown>;
6
+ export declare function readJsonFileIfExists<T>(path: string, validate: (value: unknown) => value is T, malformedMessage: MalformedJsonMessage): T | undefined;
7
+ export declare function readJsonSchemaFileIfExists<T extends TSchema>(path: string, schema: T, malformedMessage: MalformedJsonMessage): Static<T> | undefined;
8
+ export declare function parseJsonValue<T>(raw: string, validate: (value: unknown) => value is T, malformedMessage: MalformedJsonMessage): T;
9
+ export declare function parseJsonSchemaValue<T extends TSchema>(raw: string, schema: T, malformedMessage: MalformedJsonMessage): Static<T>;
9
10
  export declare function atomicWritePrivateFile(targetPath: string, content: string): void;
10
11
  export declare function assertStateDirOutsideWorkspace(stateDir: string, workingDir: string, sandboxType: string): void;
12
+ export {};
11
13
  //# sourceMappingURL=file-guards.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-guards.d.ts","sourceRoot":"","sources":["../src/file-guards.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAiBzD,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEjD;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CASrE;AAED,wBAAgB,oBAAoB,CAAC,CAAC,EACpC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,IAAI,CAAC,EACxC,gBAAgB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,GAC3C,CAAC,GAAG,SAAS,CAGf;AAED,wBAAgB,0BAA0B,CAAC,CAAC,SAAS,OAAO,EAC1D,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,CAAC,EACT,gBAAgB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,GAC3C,MAAM,CAAC,CAAC,CAAC,GAAG,SAAS,CAGvB;AAWD,wBAAgB,cAAc,CAAC,CAAC,EAC9B,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,IAAI,CAAC,EACxC,gBAAgB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,GAC3C,CAAC,CAMH;AAED,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,OAAO,EACpD,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,CAAC,EACT,gBAAgB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,GAC3C,MAAM,CAAC,CAAC,CAAC,CAeX;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE;AAID,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CA6BhF;AAQD,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,IAAI,CAWN"}
1
+ {"version":3,"file":"file-guards.d.ts","sourceRoot":"","sources":["../src/file-guards.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAkB/C,KAAK,eAAe,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAC;AAEpD,KAAK,oBAAoB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,KAAK,MAAM,CAAC;AAI9E,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEjD;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CASrE;AAED,wBAAgB,oBAAoB,CAAC,CAAC,EACpC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,IAAI,CAAC,EACxC,gBAAgB,EAAE,oBAAoB,GACrC,CAAC,GAAG,SAAS,CAGf;AAED,wBAAgB,0BAA0B,CAAC,CAAC,SAAS,OAAO,EAC1D,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,CAAC,EACT,gBAAgB,EAAE,oBAAoB,GACrC,MAAM,CAAC,CAAC,CAAC,GAAG,SAAS,CAGvB;AAWD,wBAAgB,cAAc,CAAC,CAAC,EAC9B,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,IAAI,CAAC,EACxC,gBAAgB,EAAE,oBAAoB,GACrC,CAAC,CAMH;AAED,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,OAAO,EACpD,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,CAAC,EACT,gBAAgB,EAAE,oBAAoB,GACrC,MAAM,CAAC,CAAC,CAAC,CAUX;AAID,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CA6BhF;AAQD,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,IAAI,CAWN"}
@@ -1,9 +1,11 @@
1
- import { Value } from "@sinclair/typebox/value";
1
+ import { Value } from "typebox/value";
2
2
  import { closeSync, constants as fsConstants, mkdirSync, openSync, readFileSync, renameSync, unlinkSync, writeSync, } from "node:fs";
3
3
  import { resolve } from "node:path";
4
4
  import * as log from "./log.js";
5
5
  import { randomBytes } from "node:crypto";
6
6
  import { basename, dirname, join } from "node:path";
7
+ import { errorMessage } from "./unknown-values.js";
8
+ const UNEXPECTED_JSON_SHAPE = "unexpected JSON shape";
7
9
  export function ensureDirExists(dir) {
8
10
  mkdirSync(dir, { recursive: true });
9
11
  }
@@ -31,35 +33,28 @@ function parseJson(raw, malformedMessage) {
31
33
  return JSON.parse(raw);
32
34
  }
33
35
  catch (err) {
34
- const detail = err instanceof Error ? err.message : String(err);
35
- throw new Error(malformedMessage(detail), { cause: err });
36
+ const detail = errorMessage(err);
37
+ throw new Error(malformedMessage(detail, "syntax"), { cause: err });
36
38
  }
37
39
  }
38
40
  export function parseJsonValue(raw, validate, malformedMessage) {
39
41
  const parsed = parseJson(raw, malformedMessage);
40
42
  if (!validate(parsed)) {
41
- throw new Error(malformedMessage("unexpected JSON shape"));
43
+ throw new Error(malformedMessage(UNEXPECTED_JSON_SHAPE, "shape"));
42
44
  }
43
45
  return parsed;
44
46
  }
45
47
  export function parseJsonSchemaValue(raw, schema, malformedMessage) {
46
48
  const parsed = parseJson(raw, malformedMessage);
47
49
  if (!Value.Check(schema, parsed)) {
48
- let firstError;
49
- for (const err of Value.Errors(schema, parsed)) {
50
- firstError = err;
51
- break;
50
+ const firstError = Value.Errors(schema, parsed)[0];
51
+ if (!firstError || firstError.instancePath === "" || firstError.instancePath === "/") {
52
+ throw new Error(malformedMessage(UNEXPECTED_JSON_SHAPE, "shape"));
52
53
  }
53
- const detail = !firstError || firstError.path === "" || firstError.path === "/"
54
- ? "unexpected JSON shape"
55
- : `${firstError.path}: ${firstError.message}`;
56
- throw new Error(malformedMessage(detail));
54
+ throw new Error(malformedMessage(`${firstError.instancePath}: ${firstError.message}`, "field"));
57
55
  }
58
56
  return parsed;
59
57
  }
60
- export function isRecord(value) {
61
- return typeof value === "object" && value !== null && !Array.isArray(value);
62
- }
63
58
  const PRIVATE_FILE_MODE = 0o600;
64
59
  export function atomicWritePrivateFile(targetPath, content) {
65
60
  const dir = dirname(targetPath);