@geminixiang/mikan 1.0.0-beta.2 → 1.0.0-beta.21

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 (497) hide show
  1. package/CHANGELOG.md +388 -0
  2. package/README.md +49 -16
  3. package/dist/adapter.d.ts +1 -1
  4. package/dist/adapter.d.ts.map +1 -1
  5. package/dist/adapter.js.map +1 -1
  6. package/dist/adapters/buffered-responder.d.ts +60 -0
  7. package/dist/adapters/buffered-responder.d.ts.map +1 -0
  8. package/dist/adapters/buffered-responder.js +201 -0
  9. package/dist/adapters/buffered-responder.js.map +1 -0
  10. package/dist/adapters/discord/bot.d.ts +1 -0
  11. package/dist/adapters/discord/bot.d.ts.map +1 -1
  12. package/dist/adapters/discord/bot.js +36 -67
  13. package/dist/adapters/discord/bot.js.map +1 -1
  14. package/dist/adapters/discord/context.d.ts.map +1 -1
  15. package/dist/adapters/discord/context.js +44 -204
  16. package/dist/adapters/discord/context.js.map +1 -1
  17. package/dist/adapters/github/bot.d.ts +86 -0
  18. package/dist/adapters/github/bot.d.ts.map +1 -0
  19. package/dist/adapters/github/bot.js +640 -0
  20. package/dist/adapters/github/bot.js.map +1 -0
  21. package/dist/adapters/github/client.d.ts +122 -0
  22. package/dist/adapters/github/client.d.ts.map +1 -0
  23. package/dist/adapters/github/client.js +314 -0
  24. package/dist/adapters/github/client.js.map +1 -0
  25. package/dist/adapters/github/cloudbuild.d.ts +24 -0
  26. package/dist/adapters/github/cloudbuild.d.ts.map +1 -0
  27. package/dist/adapters/github/cloudbuild.js +71 -0
  28. package/dist/adapters/github/cloudbuild.js.map +1 -0
  29. package/dist/adapters/github/context.d.ts +9 -0
  30. package/dist/adapters/github/context.d.ts.map +1 -0
  31. package/dist/adapters/github/context.js +103 -0
  32. package/dist/adapters/github/context.js.map +1 -0
  33. package/dist/adapters/github/gcp-auth.d.ts +31 -0
  34. package/dist/adapters/github/gcp-auth.d.ts.map +1 -0
  35. package/dist/adapters/github/gcp-auth.js +196 -0
  36. package/dist/adapters/github/gcp-auth.js.map +1 -0
  37. package/dist/adapters/github/github-ops.d.ts +90 -0
  38. package/dist/adapters/github/github-ops.d.ts.map +1 -0
  39. package/dist/adapters/github/github-ops.js +405 -0
  40. package/dist/adapters/github/github-ops.js.map +1 -0
  41. package/dist/adapters/github/ids.d.ts +34 -0
  42. package/dist/adapters/github/ids.d.ts.map +1 -0
  43. package/dist/adapters/github/ids.js +53 -0
  44. package/dist/adapters/github/ids.js.map +1 -0
  45. package/dist/adapters/github/repo.d.ts +32 -0
  46. package/dist/adapters/github/repo.d.ts.map +1 -0
  47. package/dist/adapters/github/repo.js +141 -0
  48. package/dist/adapters/github/repo.js.map +1 -0
  49. package/dist/adapters/github/tool-pack.d.ts +14 -0
  50. package/dist/adapters/github/tool-pack.d.ts.map +1 -0
  51. package/dist/adapters/github/tool-pack.js +56 -0
  52. package/dist/adapters/github/tool-pack.js.map +1 -0
  53. package/dist/adapters/github/tools/checks.d.ts +24 -0
  54. package/dist/adapters/github/tools/checks.d.ts.map +1 -0
  55. package/dist/adapters/github/tools/checks.js +105 -0
  56. package/dist/adapters/github/tools/checks.js.map +1 -0
  57. package/dist/adapters/github/tools/issue.d.ts +22 -0
  58. package/dist/adapters/github/tools/issue.d.ts.map +1 -0
  59. package/dist/adapters/github/tools/issue.js +48 -0
  60. package/dist/adapters/github/tools/issue.js.map +1 -0
  61. package/dist/adapters/github/tools/pr.d.ts +22 -0
  62. package/dist/adapters/github/tools/pr.d.ts.map +1 -0
  63. package/dist/adapters/github/tools/pr.js +48 -0
  64. package/dist/adapters/github/tools/pr.js.map +1 -0
  65. package/dist/adapters/github/tools/read.d.ts +22 -0
  66. package/dist/adapters/github/tools/read.d.ts.map +1 -0
  67. package/dist/adapters/github/tools/read.js +141 -0
  68. package/dist/adapters/github/tools/read.js.map +1 -0
  69. package/dist/adapters/github/tools/review-reply.d.ts +19 -0
  70. package/dist/adapters/github/tools/review-reply.d.ts.map +1 -0
  71. package/dist/adapters/github/tools/review-reply.js +38 -0
  72. package/dist/adapters/github/tools/review-reply.js.map +1 -0
  73. package/dist/adapters/github/tools/sync.d.ts +17 -0
  74. package/dist/adapters/github/tools/sync.d.ts.map +1 -0
  75. package/dist/adapters/github/tools/sync.js +34 -0
  76. package/dist/adapters/github/tools/sync.js.map +1 -0
  77. package/dist/adapters/github/types.d.ts +350 -0
  78. package/dist/adapters/github/types.d.ts.map +1 -0
  79. package/dist/adapters/github/types.js +2 -0
  80. package/dist/adapters/github/types.js.map +1 -0
  81. package/dist/adapters/intake.d.ts +16 -5
  82. package/dist/adapters/intake.d.ts.map +1 -1
  83. package/dist/adapters/intake.js +79 -22
  84. package/dist/adapters/intake.js.map +1 -1
  85. package/dist/adapters/slack/bot.d.ts +8 -6
  86. package/dist/adapters/slack/bot.d.ts.map +1 -1
  87. package/dist/adapters/slack/bot.js +82 -134
  88. package/dist/adapters/slack/bot.js.map +1 -1
  89. package/dist/adapters/slack/context.d.ts.map +1 -1
  90. package/dist/adapters/slack/context.js +3 -14
  91. package/dist/adapters/slack/context.js.map +1 -1
  92. package/dist/adapters/slack/response-lifecycle.d.ts.map +1 -1
  93. package/dist/adapters/slack/response-lifecycle.js +14 -17
  94. package/dist/adapters/slack/response-lifecycle.js.map +1 -1
  95. package/dist/adapters/slack/session.d.ts.map +1 -1
  96. package/dist/adapters/slack/session.js +5 -8
  97. package/dist/adapters/slack/session.js.map +1 -1
  98. package/dist/adapters/streaming.d.ts +4 -0
  99. package/dist/adapters/streaming.d.ts.map +1 -1
  100. package/dist/adapters/streaming.js +11 -0
  101. package/dist/adapters/streaming.js.map +1 -1
  102. package/dist/adapters/telegram/bot.d.ts +1 -2
  103. package/dist/adapters/telegram/bot.d.ts.map +1 -1
  104. package/dist/adapters/telegram/bot.js +27 -62
  105. package/dist/adapters/telegram/bot.js.map +1 -1
  106. package/dist/adapters/telegram/context.d.ts.map +1 -1
  107. package/dist/adapters/telegram/context.js +37 -174
  108. package/dist/adapters/telegram/context.js.map +1 -1
  109. package/dist/adapters/types.d.ts +28 -2
  110. package/dist/adapters/types.d.ts.map +1 -1
  111. package/dist/adapters/types.js.map +1 -1
  112. package/dist/agent.d.ts +37 -14
  113. package/dist/agent.d.ts.map +1 -1
  114. package/dist/agent.js +359 -229
  115. package/dist/agent.js.map +1 -1
  116. package/dist/cli/arg-grammar.d.ts +25 -0
  117. package/dist/cli/arg-grammar.d.ts.map +1 -0
  118. package/dist/cli/arg-grammar.js +59 -0
  119. package/dist/cli/arg-grammar.js.map +1 -0
  120. package/dist/cli/boot.d.ts +16 -0
  121. package/dist/cli/boot.d.ts.map +1 -0
  122. package/dist/cli/boot.js +119 -0
  123. package/dist/cli/boot.js.map +1 -0
  124. package/dist/cli/download.d.ts.map +1 -0
  125. package/dist/cli/download.js.map +1 -0
  126. package/dist/cli/ext-git.d.ts +22 -0
  127. package/dist/cli/ext-git.d.ts.map +1 -0
  128. package/dist/cli/ext-git.js +76 -0
  129. package/dist/cli/ext-git.js.map +1 -0
  130. package/dist/cli/ext.d.ts +2 -0
  131. package/dist/cli/ext.d.ts.map +1 -0
  132. package/dist/cli/ext.js +215 -0
  133. package/dist/cli/ext.js.map +1 -0
  134. package/dist/commands/admin.d.ts.map +1 -1
  135. package/dist/commands/admin.js +2 -1
  136. package/dist/commands/admin.js.map +1 -1
  137. package/dist/commands/auto-reply.d.ts.map +1 -1
  138. package/dist/commands/auto-reply.js +2 -6
  139. package/dist/commands/auto-reply.js.map +1 -1
  140. package/dist/commands/extensions.d.ts.map +1 -1
  141. package/dist/commands/extensions.js +18 -8
  142. package/dist/commands/extensions.js.map +1 -1
  143. package/dist/commands/login.d.ts +2 -1
  144. package/dist/commands/login.d.ts.map +1 -1
  145. package/dist/commands/login.js +35 -3
  146. package/dist/commands/login.js.map +1 -1
  147. package/dist/commands/manifest.d.ts +72 -0
  148. package/dist/commands/manifest.d.ts.map +1 -0
  149. package/dist/commands/manifest.js +121 -0
  150. package/dist/commands/manifest.js.map +1 -0
  151. package/dist/commands/model.d.ts.map +1 -1
  152. package/dist/commands/model.js +11 -9
  153. package/dist/commands/model.js.map +1 -1
  154. package/dist/commands/new.d.ts.map +1 -1
  155. package/dist/commands/new.js +2 -1
  156. package/dist/commands/new.js.map +1 -1
  157. package/dist/commands/sandbox.d.ts.map +1 -1
  158. package/dist/commands/sandbox.js +23 -17
  159. package/dist/commands/sandbox.js.map +1 -1
  160. package/dist/commands/text.d.ts +2 -0
  161. package/dist/commands/text.d.ts.map +1 -0
  162. package/dist/commands/text.js +16 -0
  163. package/dist/commands/text.js.map +1 -0
  164. package/dist/commands/types.d.ts +14 -1
  165. package/dist/commands/types.d.ts.map +1 -1
  166. package/dist/commands/types.js.map +1 -1
  167. package/dist/config.d.ts +1 -3
  168. package/dist/config.d.ts.map +1 -1
  169. package/dist/config.js +98 -95
  170. package/dist/config.js.map +1 -1
  171. package/dist/env-manifest.d.ts +35 -0
  172. package/dist/env-manifest.d.ts.map +1 -0
  173. package/dist/env-manifest.js +225 -0
  174. package/dist/env-manifest.js.map +1 -0
  175. package/dist/events.d.ts.map +1 -1
  176. package/dist/events.js +9 -73
  177. package/dist/events.js.map +1 -1
  178. package/dist/execution-resolver.d.ts +4 -2
  179. package/dist/execution-resolver.d.ts.map +1 -1
  180. package/dist/execution-resolver.js +54 -41
  181. package/dist/execution-resolver.js.map +1 -1
  182. package/dist/harness/event-format.d.ts +66 -0
  183. package/dist/harness/event-format.d.ts.map +1 -0
  184. package/dist/harness/event-format.js +112 -0
  185. package/dist/harness/event-format.js.map +1 -0
  186. package/dist/harness/extensions/loader.d.ts +44 -11
  187. package/dist/harness/extensions/loader.d.ts.map +1 -1
  188. package/dist/harness/extensions/loader.js +273 -84
  189. package/dist/harness/extensions/loader.js.map +1 -1
  190. package/dist/harness/extensions/registry.d.ts +48 -1
  191. package/dist/harness/extensions/registry.d.ts.map +1 -1
  192. package/dist/harness/extensions/registry.js +146 -0
  193. package/dist/harness/extensions/registry.js.map +1 -1
  194. package/dist/harness/extensions/types.d.ts +165 -22
  195. package/dist/harness/extensions/types.d.ts.map +1 -1
  196. package/dist/harness/extensions/types.js.map +1 -1
  197. package/dist/harness/index.d.ts +6 -5
  198. package/dist/harness/index.d.ts.map +1 -1
  199. package/dist/harness/index.js +3 -2
  200. package/dist/harness/index.js.map +1 -1
  201. package/dist/harness/models.d.ts +5 -0
  202. package/dist/harness/models.d.ts.map +1 -1
  203. package/dist/harness/models.js +10 -0
  204. package/dist/harness/models.js.map +1 -1
  205. package/dist/harness/runner.d.ts +37 -2
  206. package/dist/harness/runner.d.ts.map +1 -1
  207. package/dist/harness/runner.js +107 -23
  208. package/dist/harness/runner.js.map +1 -1
  209. package/dist/harness/session-store.d.ts +4 -1
  210. package/dist/harness/session-store.d.ts.map +1 -1
  211. package/dist/harness/session-store.js +11 -2
  212. package/dist/harness/session-store.js.map +1 -1
  213. package/dist/harness/subagent-runner.d.ts +34 -0
  214. package/dist/harness/subagent-runner.d.ts.map +1 -0
  215. package/dist/harness/subagent-runner.js +339 -0
  216. package/dist/harness/subagent-runner.js.map +1 -0
  217. package/dist/harness/types.d.ts +53 -0
  218. package/dist/harness/types.d.ts.map +1 -1
  219. package/dist/harness/types.js.map +1 -1
  220. package/dist/index.d.ts +3 -3
  221. package/dist/index.d.ts.map +1 -1
  222. package/dist/index.js +2 -2
  223. package/dist/index.js.map +1 -1
  224. package/dist/main.js +260 -109
  225. package/dist/main.js.map +1 -1
  226. package/dist/observability/instrument.js +6 -4
  227. package/dist/observability/instrument.js.map +1 -1
  228. package/dist/observability/sentry.d.ts.map +1 -1
  229. package/dist/observability/sentry.js +3 -2
  230. package/dist/observability/sentry.js.map +1 -1
  231. package/dist/provisioner.d.ts.map +1 -1
  232. package/dist/provisioner.js +2 -5
  233. package/dist/provisioner.js.map +1 -1
  234. package/dist/runtime/conversation-runtime.d.ts +1 -1
  235. package/dist/runtime/conversation-runtime.d.ts.map +1 -1
  236. package/dist/runtime/conversation-runtime.js +276 -43
  237. package/dist/runtime/conversation-runtime.js.map +1 -1
  238. package/dist/runtime/types.d.ts +36 -5
  239. package/dist/runtime/types.d.ts.map +1 -1
  240. package/dist/runtime/types.js.map +1 -1
  241. package/dist/sandbox/cloudflare.d.ts +3 -0
  242. package/dist/sandbox/cloudflare.d.ts.map +1 -1
  243. package/dist/sandbox/cloudflare.js +10 -0
  244. package/dist/sandbox/cloudflare.js.map +1 -1
  245. package/dist/sandbox/container.d.ts +4 -0
  246. package/dist/sandbox/container.d.ts.map +1 -1
  247. package/dist/sandbox/container.js +11 -2
  248. package/dist/sandbox/container.js.map +1 -1
  249. package/dist/sandbox/firecracker.d.ts +3 -0
  250. package/dist/sandbox/firecracker.d.ts.map +1 -1
  251. package/dist/sandbox/firecracker.js +10 -1
  252. package/dist/sandbox/firecracker.js.map +1 -1
  253. package/dist/sandbox/gondolin-bootstrap.d.ts +26 -0
  254. package/dist/sandbox/gondolin-bootstrap.d.ts.map +1 -0
  255. package/dist/sandbox/gondolin-bootstrap.js +27 -0
  256. package/dist/sandbox/gondolin-bootstrap.js.map +1 -0
  257. package/dist/sandbox/gondolin-contract.d.ts +125 -0
  258. package/dist/sandbox/gondolin-contract.d.ts.map +1 -0
  259. package/dist/sandbox/gondolin-contract.js +155 -0
  260. package/dist/sandbox/gondolin-contract.js.map +1 -0
  261. package/dist/sandbox/gondolin-fleet.d.ts +104 -0
  262. package/dist/sandbox/gondolin-fleet.d.ts.map +1 -0
  263. package/dist/sandbox/gondolin-fleet.js +330 -0
  264. package/dist/sandbox/gondolin-fleet.js.map +1 -0
  265. package/dist/sandbox/gondolin-gateway.d.ts +86 -0
  266. package/dist/sandbox/gondolin-gateway.d.ts.map +1 -0
  267. package/dist/sandbox/gondolin-gateway.js +407 -0
  268. package/dist/sandbox/gondolin-gateway.js.map +1 -0
  269. package/dist/sandbox/gondolin-inventory.d.ts +75 -0
  270. package/dist/sandbox/gondolin-inventory.d.ts.map +1 -0
  271. package/dist/sandbox/gondolin-inventory.js +257 -0
  272. package/dist/sandbox/gondolin-inventory.js.map +1 -0
  273. package/dist/sandbox/gondolin-join.d.ts +62 -0
  274. package/dist/sandbox/gondolin-join.d.ts.map +1 -0
  275. package/dist/sandbox/gondolin-join.js +261 -0
  276. package/dist/sandbox/gondolin-join.js.map +1 -0
  277. package/dist/sandbox/gondolin-nfs-advisory.d.ts +15 -0
  278. package/dist/sandbox/gondolin-nfs-advisory.d.ts.map +1 -0
  279. package/dist/sandbox/gondolin-nfs-advisory.js +60 -0
  280. package/dist/sandbox/gondolin-nfs-advisory.js.map +1 -0
  281. package/dist/sandbox/gondolin-placement.d.ts +30 -0
  282. package/dist/sandbox/gondolin-placement.d.ts.map +1 -0
  283. package/dist/sandbox/gondolin-placement.js +77 -0
  284. package/dist/sandbox/gondolin-placement.js.map +1 -0
  285. package/dist/sandbox/gondolin-recovery.d.ts +33 -0
  286. package/dist/sandbox/gondolin-recovery.d.ts.map +1 -0
  287. package/dist/sandbox/gondolin-recovery.js +39 -0
  288. package/dist/sandbox/gondolin-recovery.js.map +1 -0
  289. package/dist/sandbox/gondolin-remote.d.ts +70 -0
  290. package/dist/sandbox/gondolin-remote.d.ts.map +1 -0
  291. package/dist/sandbox/gondolin-remote.js +325 -0
  292. package/dist/sandbox/gondolin-remote.js.map +1 -0
  293. package/dist/sandbox/gondolin-worker-client.d.ts +135 -0
  294. package/dist/sandbox/gondolin-worker-client.d.ts.map +1 -0
  295. package/dist/sandbox/gondolin-worker-client.js +323 -0
  296. package/dist/sandbox/gondolin-worker-client.js.map +1 -0
  297. package/dist/sandbox/gondolin-worker-main.d.ts +2 -0
  298. package/dist/sandbox/gondolin-worker-main.d.ts.map +1 -0
  299. package/dist/sandbox/gondolin-worker-main.js +22 -0
  300. package/dist/sandbox/gondolin-worker-main.js.map +1 -0
  301. package/dist/sandbox/gondolin-worker.d.ts +17 -0
  302. package/dist/sandbox/gondolin-worker.d.ts.map +1 -0
  303. package/dist/sandbox/gondolin-worker.js +201 -0
  304. package/dist/sandbox/gondolin-worker.js.map +1 -0
  305. package/dist/sandbox/gondolin.d.ts +53 -0
  306. package/dist/sandbox/gondolin.d.ts.map +1 -0
  307. package/dist/sandbox/gondolin.js +429 -0
  308. package/dist/sandbox/gondolin.js.map +1 -0
  309. package/dist/sandbox/host.d.ts +3 -0
  310. package/dist/sandbox/host.d.ts.map +1 -1
  311. package/dist/sandbox/host.js +14 -0
  312. package/dist/sandbox/host.js.map +1 -1
  313. package/dist/sandbox/identity.d.ts +21 -0
  314. package/dist/sandbox/identity.d.ts.map +1 -0
  315. package/dist/sandbox/identity.js +36 -0
  316. package/dist/sandbox/identity.js.map +1 -0
  317. package/dist/sandbox/index.d.ts +13 -4
  318. package/dist/sandbox/index.d.ts.map +1 -1
  319. package/dist/sandbox/index.js +19 -3
  320. package/dist/sandbox/index.js.map +1 -1
  321. package/dist/sandbox/types.d.ts +31 -1
  322. package/dist/sandbox/types.d.ts.map +1 -1
  323. package/dist/sandbox/types.js.map +1 -1
  324. package/dist/sandbox/utils.d.ts +12 -0
  325. package/dist/sandbox/utils.d.ts.map +1 -1
  326. package/dist/sandbox/utils.js +38 -0
  327. package/dist/sandbox/utils.js.map +1 -1
  328. package/dist/sessions/chat-history-sync.d.ts +32 -0
  329. package/dist/sessions/chat-history-sync.d.ts.map +1 -0
  330. package/dist/sessions/{agent-memory-file-manager.js → chat-history-sync.js} +40 -113
  331. package/dist/sessions/chat-history-sync.js.map +1 -0
  332. package/dist/sessions/conversation-log.d.ts +13 -0
  333. package/dist/sessions/conversation-log.d.ts.map +1 -0
  334. package/dist/sessions/conversation-log.js +47 -0
  335. package/dist/sessions/conversation-log.js.map +1 -0
  336. package/dist/sessions/history-line.d.ts +20 -0
  337. package/dist/sessions/history-line.d.ts.map +1 -0
  338. package/dist/sessions/history-line.js +24 -0
  339. package/dist/sessions/history-line.js.map +1 -0
  340. package/dist/sessions/policy.d.ts.map +1 -1
  341. package/dist/sessions/policy.js +5 -3
  342. package/dist/sessions/policy.js.map +1 -1
  343. package/dist/sessions/rotation.d.ts +2 -0
  344. package/dist/sessions/rotation.d.ts.map +1 -0
  345. package/dist/sessions/rotation.js +39 -0
  346. package/dist/sessions/rotation.js.map +1 -0
  347. package/dist/sessions/session-key.d.ts +31 -0
  348. package/dist/sessions/session-key.d.ts.map +1 -0
  349. package/dist/sessions/session-key.js +44 -0
  350. package/dist/sessions/session-key.js.map +1 -0
  351. package/dist/sessions/store.d.ts.map +1 -1
  352. package/dist/sessions/store.js +6 -12
  353. package/dist/sessions/store.js.map +1 -1
  354. package/dist/sessions/types.d.ts +2 -2
  355. package/dist/sessions/types.d.ts.map +1 -1
  356. package/dist/sessions/types.js.map +1 -1
  357. package/dist/settings-mutation.d.ts +23 -0
  358. package/dist/settings-mutation.d.ts.map +1 -0
  359. package/dist/settings-mutation.js +42 -0
  360. package/dist/settings-mutation.js.map +1 -0
  361. package/dist/tools/bash.d.ts +3 -1
  362. package/dist/tools/bash.d.ts.map +1 -1
  363. package/dist/tools/bash.js +24 -17
  364. package/dist/tools/bash.js.map +1 -1
  365. package/dist/tools/edit.d.ts.map +1 -1
  366. package/dist/tools/edit.js +9 -12
  367. package/dist/tools/edit.js.map +1 -1
  368. package/dist/tools/event.d.ts +1 -1
  369. package/dist/tools/event.d.ts.map +1 -1
  370. package/dist/tools/event.js +53 -43
  371. package/dist/tools/event.js.map +1 -1
  372. package/dist/tools/generate-image.d.ts +17 -0
  373. package/dist/tools/generate-image.d.ts.map +1 -0
  374. package/dist/tools/generate-image.js +63 -0
  375. package/dist/tools/generate-image.js.map +1 -0
  376. package/dist/tools/host-fn-tool.d.ts +21 -0
  377. package/dist/tools/host-fn-tool.d.ts.map +1 -0
  378. package/dist/tools/host-fn-tool.js +32 -0
  379. package/dist/tools/host-fn-tool.js.map +1 -0
  380. package/dist/tools/index.d.ts +17 -2
  381. package/dist/tools/index.d.ts.map +1 -1
  382. package/dist/tools/index.js +28 -3
  383. package/dist/tools/index.js.map +1 -1
  384. package/dist/tools/react.d.ts +15 -0
  385. package/dist/tools/react.d.ts.map +1 -0
  386. package/dist/tools/react.js +29 -0
  387. package/dist/tools/react.js.map +1 -0
  388. package/dist/tools/read.d.ts.map +1 -1
  389. package/dist/tools/read.js +7 -26
  390. package/dist/tools/read.js.map +1 -1
  391. package/dist/tools/sandbox.d.ts +2 -2
  392. package/dist/tools/sandbox.d.ts.map +1 -1
  393. package/dist/tools/sandbox.js +13 -9
  394. package/dist/tools/sandbox.js.map +1 -1
  395. package/dist/tools/subagent-slots.d.ts +28 -0
  396. package/dist/tools/subagent-slots.d.ts.map +1 -0
  397. package/dist/tools/subagent-slots.js +57 -0
  398. package/dist/tools/subagent-slots.js.map +1 -0
  399. package/dist/tools/subagent.d.ts +74 -0
  400. package/dist/tools/subagent.d.ts.map +1 -0
  401. package/dist/tools/subagent.js +335 -0
  402. package/dist/tools/subagent.js.map +1 -0
  403. package/dist/tools/types.d.ts +40 -6
  404. package/dist/tools/types.d.ts.map +1 -1
  405. package/dist/tools/types.js.map +1 -1
  406. package/dist/tools/write.d.ts.map +1 -1
  407. package/dist/tools/write.js +1 -8
  408. package/dist/tools/write.js.map +1 -1
  409. package/dist/trigger.d.ts.map +1 -1
  410. package/dist/trigger.js +1 -2
  411. package/dist/trigger.js.map +1 -1
  412. package/dist/types.d.ts +144 -31
  413. package/dist/types.d.ts.map +1 -1
  414. package/dist/types.js.map +1 -1
  415. package/dist/utils/date.d.ts +1 -1
  416. package/dist/utils/date.js +1 -1
  417. package/dist/utils/date.js.map +1 -1
  418. package/dist/vault/disabled.d.ts +9 -0
  419. package/dist/vault/disabled.d.ts.map +1 -0
  420. package/dist/vault/disabled.js +22 -0
  421. package/dist/vault/disabled.js.map +1 -0
  422. package/dist/vault/index.d.ts +0 -2
  423. package/dist/vault/index.d.ts.map +1 -1
  424. package/dist/vault/index.js +1 -32
  425. package/dist/vault/index.js.map +1 -1
  426. package/dist/vault/injection.d.ts +20 -0
  427. package/dist/vault/injection.d.ts.map +1 -0
  428. package/dist/vault/injection.js +27 -0
  429. package/dist/vault/injection.js.map +1 -0
  430. package/dist/vault/policy.d.ts +20 -0
  431. package/dist/vault/policy.d.ts.map +1 -0
  432. package/dist/vault/policy.js +20 -0
  433. package/dist/vault/policy.js.map +1 -0
  434. package/dist/vault/types.d.ts +0 -2
  435. package/dist/vault/types.d.ts.map +1 -1
  436. package/dist/vault/types.js.map +1 -1
  437. package/dist/web/admin/portal.d.ts +27 -0
  438. package/dist/web/admin/portal.d.ts.map +1 -1
  439. package/dist/web/admin/portal.js +117 -154
  440. package/dist/web/admin/portal.js.map +1 -1
  441. package/dist/web/admin/types.d.ts +6 -0
  442. package/dist/web/admin/types.d.ts.map +1 -1
  443. package/dist/web/admin/types.js.map +1 -1
  444. package/dist/web/agent-events/portal.d.ts.map +1 -1
  445. package/dist/web/agent-events/portal.js +2 -1
  446. package/dist/web/agent-events/portal.js.map +1 -1
  447. package/dist/web/login/oauth.d.ts +2 -3
  448. package/dist/web/login/oauth.d.ts.map +1 -1
  449. package/dist/web/login/oauth.js +0 -31
  450. package/dist/web/login/oauth.js.map +1 -1
  451. package/dist/web/login/portal.js +1 -1
  452. package/dist/web/login/portal.js.map +1 -1
  453. package/dist/web/login/types.d.ts +0 -11
  454. package/dist/web/login/types.d.ts.map +1 -1
  455. package/dist/web/login/types.js.map +1 -1
  456. package/dist/web/portal-shell.d.ts +4 -0
  457. package/dist/web/portal-shell.d.ts.map +1 -0
  458. package/dist/{portal-shell.js → web/portal-shell.js} +2 -2
  459. package/dist/web/portal-shell.js.map +1 -0
  460. package/dist/web/server.d.ts.map +1 -1
  461. package/dist/web/server.js +7 -0
  462. package/dist/web/server.js.map +1 -1
  463. package/dist/web/session-view/command.d.ts.map +1 -1
  464. package/dist/web/session-view/command.js +4 -1
  465. package/dist/web/session-view/command.js.map +1 -1
  466. package/dist/web/session-view/portal.d.ts.map +1 -1
  467. package/dist/web/session-view/portal.js +4 -3
  468. package/dist/web/session-view/portal.js.map +1 -1
  469. package/dist/web/session-view/service.d.ts.map +1 -1
  470. package/dist/web/session-view/service.js +2 -1
  471. package/dist/web/session-view/service.js.map +1 -1
  472. package/dist/web/session-view/types.d.ts +2 -1
  473. package/dist/web/session-view/types.d.ts.map +1 -1
  474. package/dist/web/session-view/types.js.map +1 -1
  475. package/package.json +7 -4
  476. package/dist/download.d.ts.map +0 -1
  477. package/dist/download.js.map +0 -1
  478. package/dist/model-registry.d.ts +0 -4
  479. package/dist/model-registry.d.ts.map +0 -1
  480. package/dist/model-registry.js +0 -7
  481. package/dist/model-registry.js.map +0 -1
  482. package/dist/portal-shell.d.ts +0 -4
  483. package/dist/portal-shell.d.ts.map +0 -1
  484. package/dist/portal-shell.js.map +0 -1
  485. package/dist/runtime/agent-run-controller.d.ts +0 -31
  486. package/dist/runtime/agent-run-controller.d.ts.map +0 -1
  487. package/dist/runtime/agent-run-controller.js +0 -195
  488. package/dist/runtime/agent-run-controller.js.map +0 -1
  489. package/dist/sessions/agent-memory-file-manager.d.ts +0 -19
  490. package/dist/sessions/agent-memory-file-manager.d.ts.map +0 -1
  491. package/dist/sessions/agent-memory-file-manager.js.map +0 -1
  492. package/dist/vault/routing.d.ts +0 -3
  493. package/dist/vault/routing.d.ts.map +0 -1
  494. package/dist/vault/routing.js +0 -13
  495. package/dist/vault/routing.js.map +0 -1
  496. /package/dist/{download.d.ts → cli/download.d.ts} +0 -0
  497. /package/dist/{download.js → cli/download.js} +0 -0
@@ -1,13 +1,14 @@
1
- import { existsSync, readdirSync, readFileSync, rmSync, statSync } from "fs";
1
+ import { existsSync, readdirSync, readFileSync, statSync } from "fs";
2
2
  import { basename, join, resolve as pathResolve, sep as pathSep } from "path";
3
- import { MikanModels, SessionStore } from "../../harness/index.js";
4
- import { loadConversationAutoReplyConfig, loadGlobalSettings, resolveConversationSettings, saveConversationAutoReplyConfig, updateConversationSettings, updateGlobalSettings, } from "../../config.js";
3
+ import { MikanModels, parseFrontmatter, SessionStore } from "../../harness/index.js";
4
+ import { loadConversationAutoReplyConfig, loadGlobalSettings, resolveConversationSettings, saveConversationAutoReplyConfig, } from "../../config.js";
5
+ import { applyConversationSettings, applyGlobalSettings } from "../../settings-mutation.js";
5
6
  import { escapeHtml } from "../../utils/html.js";
6
7
  import { readRawBody } from "../../utils/http-body.js";
7
- import { renderPortalShell } from "../../portal-shell.js";
8
+ import { renderPortalShell } from "../portal-shell.js";
8
9
  import { resolveExistingSessionFile } from "../session-view/service.js";
9
10
  import { PRODUCT_NAME } from "../../platform-messages.js";
10
- import { resolveActorVaultKey } from "../../vault/routing.js";
11
+ import { actorKey } from "../../sandbox/identity.js";
11
12
  import { sharedVaultKey } from "../../vault/index.js";
12
13
  import { modelKey, resolveAdminModelAccessStatuses } from "./provider-models.js";
13
14
  // ── Handler ────────────────────────────────────────────────────────────────────
@@ -88,7 +89,7 @@ async function routeApiRequest(req, res, url, services) {
88
89
  return;
89
90
  }
90
91
  if (url.pathname === "/admin/api/events") {
91
- serveEventsList(res, services);
92
+ await serveEventsList(res, services);
92
93
  return;
93
94
  }
94
95
  if (url.pathname === "/admin/api/events/file") {
@@ -96,7 +97,7 @@ async function routeApiRequest(req, res, url, services) {
96
97
  return;
97
98
  }
98
99
  if (url.pathname === "/admin/api/conversations/events") {
99
- serveConversationEventsList(res, url, services, token);
100
+ await serveConversationEventsList(res, url, services, token);
100
101
  return;
101
102
  }
102
103
  jsonRes(res, 404, { error: "Not found" });
@@ -140,19 +141,19 @@ async function routeApiRequest(req, res, url, services) {
140
141
  return;
141
142
  }
142
143
  if (url.pathname === "/admin/api/conversations/events/delete") {
143
- serveConversationEventDelete(res, body, services, token);
144
+ await serveConversationEventDelete(res, body, services, token);
144
145
  return;
145
146
  }
146
147
  if (url.pathname === "/admin/api/settings/model") {
147
- serveGlobalModelUpdate(res, body);
148
+ serveGlobalModelUpdate(res, body, services);
148
149
  return;
149
150
  }
150
151
  if (url.pathname === "/admin/api/settings/sandbox") {
151
- serveGlobalSandboxUpdate(res, body);
152
+ serveGlobalSandboxUpdate(res, body, services);
152
153
  return;
153
154
  }
154
155
  if (url.pathname === "/admin/api/settings/slack") {
155
- serveGlobalSlackUpdate(res, body);
156
+ serveGlobalSlackUpdate(res, body, services);
156
157
  return;
157
158
  }
158
159
  jsonRes(res, 404, { error: "Not found" });
@@ -465,8 +466,8 @@ function serveConversationState(res, url, services, token) {
465
466
  globalProvider: globalConfig.provider,
466
467
  globalModel: globalConfig.model,
467
468
  globalThinkingLevel: globalConfig.thinkingLevel,
468
- sandboxImageWorkspaceMount: conversationConfig.sandboxImageWorkspaceMount ?? null,
469
- globalSandboxImageWorkspaceMount: globalConfig.sandboxImageWorkspaceMount ?? null,
469
+ sandboxImageWorkspaceMount: conversationConfig.sandbox?.image?.workspaceMount ?? null,
470
+ globalSandboxImageWorkspaceMount: globalConfig.sandbox?.image?.workspaceMount ?? null,
470
471
  autoReplyEnabled: autoReply.enabled,
471
472
  autoReplyRules: autoReply.rules,
472
473
  slack: {
@@ -482,12 +483,12 @@ function serveGlobalSettings(res) {
482
483
  provider: config.provider,
483
484
  model: config.model,
484
485
  thinkingLevel: config.thinkingLevel,
485
- sandboxCpus: config.sandboxCpus ?? null,
486
- sandboxMemory: config.sandboxMemory ?? null,
487
- sandboxBoostCpus: config.sandboxBoostCpus ?? null,
488
- sandboxBoostMemory: config.sandboxBoostMemory ?? null,
489
- sandboxImageWorkspaceMount: config.sandboxImageWorkspaceMount ?? null,
490
- defaultSharedVault: config.defaultSharedVault ?? null,
486
+ sandboxCpus: config.sandbox?.cpus ?? null,
487
+ sandboxMemory: config.sandbox?.memory ?? null,
488
+ sandboxBoostCpus: config.sandbox?.boost?.cpus ?? null,
489
+ sandboxBoostMemory: config.sandbox?.boost?.memory ?? null,
490
+ sandboxImageWorkspaceMount: config.sandbox?.image?.workspaceMount ?? null,
491
+ defaultSharedVault: config.sandbox?.defaultSharedVault ?? null,
491
492
  slack: {
492
493
  replyMode: config.slack?.replyMode ?? "top-level",
493
494
  },
@@ -518,7 +519,7 @@ async function serveModelsList(res) {
518
519
  jsonRes(res, 500, { error: err instanceof Error ? err.message : String(err) });
519
520
  }
520
521
  }
521
- const VALID_THINKING_LEVELS = new Set(["off", "minimal", "low", "medium", "high", "xhigh"]);
522
+ const VALID_THINKING_LEVELS = new Set(["off", "minimal", "low", "medium", "high", "xhigh", "max"]);
522
523
  function serveConversationModelUpdate(res, body, services, token) {
523
524
  const provider = typeof body.provider === "string" ? body.provider.trim() : "";
524
525
  const model = typeof body.model === "string" ? body.model.trim() : "";
@@ -537,18 +538,19 @@ function serveConversationModelUpdate(res, body, services, token) {
537
538
  const workingDir = requireAdminWorkingDir(res, services);
538
539
  if (!workingDir)
539
540
  return;
540
- const dir = join(workingDir, scope.conversationId);
541
541
  try {
542
- updateConversationSettings(dir, {
542
+ const result = applyConversationSettings(services.runtime, workingDir, scope.conversationId, {
543
543
  provider,
544
544
  model,
545
545
  ...(thinkingLevel ? { thinkingLevel } : {}),
546
546
  });
547
- let runtimeSwitched = null;
548
- if (services.runtime) {
549
- runtimeSwitched = services.runtime.switchConversationModel(scope.conversationId, provider, model);
547
+ if (!result.ok) {
548
+ jsonRes(res, 409, {
549
+ error: "Conversation has a running job; retry after it finishes (or /stop it).",
550
+ });
551
+ return;
550
552
  }
551
- jsonRes(res, 200, { ok: true, runtimeSwitched });
553
+ jsonRes(res, 200, { ok: true, runtimeSwitched: result.runtimeSwitched });
552
554
  }
553
555
  catch (err) {
554
556
  jsonRes(res, 500, { error: err instanceof Error ? err.message : String(err) });
@@ -568,9 +570,10 @@ function serveConversationSandboxUpdate(res, body, services, token) {
568
570
  const workingDir = requireAdminWorkingDir(res, services);
569
571
  if (!workingDir)
570
572
  return;
571
- const dir = join(workingDir, scope.conversationId);
572
573
  try {
573
- updateConversationSettings(dir, { sandboxImageWorkspaceMount: workspaceMount });
574
+ applyConversationSettings(services.runtime, workingDir, scope.conversationId, {
575
+ sandbox: { image: { workspaceMount } },
576
+ });
574
577
  jsonRes(res, 200, { ok: true });
575
578
  }
576
579
  catch (err) {
@@ -591,9 +594,10 @@ function serveConversationSlackUpdate(res, body, services, token) {
591
594
  const workingDir = requireAdminWorkingDir(res, services);
592
595
  if (!workingDir)
593
596
  return;
594
- const dir = join(workingDir, scope.conversationId);
595
597
  try {
596
- updateConversationSettings(dir, { slack: { replyMode } });
598
+ applyConversationSettings(services.runtime, workingDir, scope.conversationId, {
599
+ slack: { replyMode },
600
+ });
597
601
  jsonRes(res, 200, { ok: true });
598
602
  }
599
603
  catch (err) {
@@ -688,7 +692,10 @@ function serveConversationLoginLink(res, body, services, token) {
688
692
  }
689
693
  else {
690
694
  try {
691
- vaultId = resolveActorVaultKey(services.sandbox, token.platformUserId, scope.conversationId);
695
+ vaultId = actorKey(services.sandbox, {
696
+ userId: token.platformUserId,
697
+ conversationId: scope.conversationId,
698
+ });
692
699
  }
693
700
  catch (err) {
694
701
  jsonRes(res, 500, { error: err instanceof Error ? err.message : String(err) });
@@ -704,7 +711,7 @@ function serveConversationLoginLink(res, body, services, token) {
704
711
  jsonRes(res, 500, { error: err instanceof Error ? err.message : String(err) });
705
712
  }
706
713
  }
707
- function serveGlobalModelUpdate(res, body) {
714
+ function serveGlobalModelUpdate(res, body, services) {
708
715
  const provider = typeof body.provider === "string" ? body.provider.trim() : "";
709
716
  const model = typeof body.model === "string" ? body.model.trim() : "";
710
717
  const thinkingLevel = typeof body.thinkingLevel === "string" && VALID_THINKING_LEVELS.has(body.thinkingLevel)
@@ -715,55 +722,57 @@ function serveGlobalModelUpdate(res, body) {
715
722
  return;
716
723
  }
717
724
  try {
718
- updateGlobalSettings({
725
+ const result = applyGlobalSettings(services.runtime, {
719
726
  provider,
720
727
  model,
721
728
  ...(thinkingLevel ? { thinkingLevel } : {}),
722
729
  });
723
- jsonRes(res, 200, { ok: true });
730
+ jsonRes(res, 200, { ok: true, staleConversations: result.staleConversations });
724
731
  }
725
732
  catch (err) {
726
733
  jsonRes(res, 500, { error: err instanceof Error ? err.message : String(err) });
727
734
  }
728
735
  }
729
- function serveGlobalSlackUpdate(res, body) {
736
+ function serveGlobalSlackUpdate(res, body, services) {
730
737
  const replyMode = body.replyMode;
731
738
  if (replyMode !== "top-level" && replyMode !== "thread") {
732
739
  jsonRes(res, 400, { error: "replyMode must be 'top-level' or 'thread'" });
733
740
  return;
734
741
  }
735
742
  try {
736
- updateGlobalSettings({ slack: { replyMode } });
743
+ applyGlobalSettings(services.runtime, { slack: { replyMode } });
737
744
  jsonRes(res, 200, { ok: true });
738
745
  }
739
746
  catch (err) {
740
747
  jsonRes(res, 500, { error: err instanceof Error ? err.message : String(err) });
741
748
  }
742
749
  }
743
- function serveGlobalSandboxUpdate(res, body) {
750
+ function serveGlobalSandboxUpdate(res, body, services) {
744
751
  const cpus = typeof body.cpus === "string" ? body.cpus.trim() : "";
745
752
  const memory = typeof body.memory === "string" ? body.memory.trim() : "";
746
753
  const boostCpus = typeof body.boostCpus === "string" ? body.boostCpus.trim() : "";
747
754
  const boostMemory = typeof body.boostMemory === "string" ? body.boostMemory.trim() : "";
748
755
  const workspaceMount = body.workspaceMount;
749
756
  const validMount = workspaceMount === "private" || workspaceMount === "full";
750
- const update = {};
751
- if (cpus)
752
- update.sandboxCpus = cpus;
753
- if (memory)
754
- update.sandboxMemory = memory;
755
- if (boostCpus)
756
- update.sandboxBoostCpus = boostCpus;
757
- if (boostMemory)
758
- update.sandboxBoostMemory = boostMemory;
759
- if (validMount)
760
- update.sandboxImageWorkspaceMount = workspaceMount;
757
+ const update = {
758
+ ...(cpus ? { cpus } : {}),
759
+ ...(memory ? { memory } : {}),
760
+ ...(boostCpus || boostMemory
761
+ ? {
762
+ boost: {
763
+ ...(boostCpus ? { cpus: boostCpus } : {}),
764
+ ...(boostMemory ? { memory: boostMemory } : {}),
765
+ },
766
+ }
767
+ : {}),
768
+ ...(validMount ? { image: { workspaceMount: workspaceMount } } : {}),
769
+ };
761
770
  if (Object.keys(update).length === 0) {
762
771
  jsonRes(res, 400, { error: "No valid sandbox fields provided" });
763
772
  return;
764
773
  }
765
774
  try {
766
- updateGlobalSettings(update);
775
+ applyGlobalSettings(services.runtime, { sandbox: update });
767
776
  jsonRes(res, 200, { ok: true });
768
777
  }
769
778
  catch (err) {
@@ -994,7 +1003,12 @@ function serveWorkspaceFile(res, url, services, token) {
994
1003
  }
995
1004
  servePreviewFile(res, safe.absolute, { path: requestedPath }, "File not found");
996
1005
  }
997
- function parseSkillFrontmatter(filePath) {
1006
+ /**
1007
+ * Read skill metadata via the harness frontmatter parser (the owning module).
1008
+ * The portal historically accepted frontmatter keys case-insensitively, so
1009
+ * the lookup — not the parser — preserves that leniency.
1010
+ */
1011
+ function readSkillMeta(filePath) {
998
1012
  let text;
999
1013
  try {
1000
1014
  text = readFileSync(filePath, "utf-8");
@@ -1002,31 +1016,18 @@ function parseSkillFrontmatter(filePath) {
1002
1016
  catch {
1003
1017
  return {};
1004
1018
  }
1005
- if (!text.startsWith("---"))
1006
- return {};
1007
- const end = text.indexOf("\n---", 3);
1008
- if (end < 0)
1009
- return {};
1010
- const block = text.slice(3, end);
1019
+ const { values } = parseFrontmatter(text);
1011
1020
  const out = {};
1012
- for (const line of block.split("\n")) {
1013
- const colon = line.indexOf(":");
1014
- if (colon < 0)
1015
- continue;
1016
- const key = line.slice(0, colon).trim().toLowerCase();
1017
- let value = line.slice(colon + 1).trim();
1018
- if ((value.startsWith('"') && value.endsWith('"')) ||
1019
- (value.startsWith("'") && value.endsWith("'"))) {
1020
- value = value.slice(1, -1);
1021
- }
1022
- if (key === "name")
1021
+ for (const [key, value] of Object.entries(values)) {
1022
+ const normalized = key.toLowerCase();
1023
+ if (normalized === "name")
1023
1024
  out.name = value;
1024
- if (key === "description")
1025
+ if (normalized === "description")
1025
1026
  out.description = value;
1026
1027
  }
1027
1028
  return out;
1028
1029
  }
1029
- function readSkillsFromDir(skillsDir, source) {
1030
+ export function readSkillsFromDir(skillsDir, source) {
1030
1031
  if (!existsSync(skillsDir))
1031
1032
  return [];
1032
1033
  const out = [];
@@ -1043,7 +1044,7 @@ function readSkillsFromDir(skillsDir, source) {
1043
1044
  const skillMd = join(skillsDir, entry.name, "SKILL.md");
1044
1045
  if (!existsSync(skillMd))
1045
1046
  continue;
1046
- const meta = parseSkillFrontmatter(skillMd);
1047
+ const meta = readSkillMeta(skillMd);
1047
1048
  out.push({
1048
1049
  name: meta.name ?? entry.name,
1049
1050
  description: meta.description ?? "",
@@ -1104,75 +1105,53 @@ function serveSkillFile(res, url, services, token) {
1104
1105
  }
1105
1106
  // ── Events ─────────────────────────────────────────────────────────────────────
1106
1107
  const EVENTS_FILE_MAX_BYTES = 64 * 1024;
1107
- function listAllEvents(workingDir) {
1108
- const dir = join(workingDir, "events");
1109
- if (!existsSync(dir))
1110
- return [];
1111
- let entries;
1112
- try {
1113
- entries = readdirSync(dir, { withFileTypes: true });
1114
- }
1115
- catch {
1116
- return [];
1117
- }
1118
- return entries
1119
- .filter((e) => e.isFile() && e.name.endsWith(".json"))
1120
- .map((e) => {
1121
- const filePath = join(dir, e.name);
1122
- let stats;
1123
- try {
1124
- stats = statSync(filePath);
1125
- }
1126
- catch {
1127
- return null;
1128
- }
1129
- let parsed = null;
1130
- try {
1131
- parsed = JSON.parse(readFileSync(filePath, "utf-8"));
1132
- }
1133
- catch {
1134
- // Keep entry; just omit parsed fields.
1135
- }
1136
- const meta = parsed && typeof parsed === "object" ? parsed : {};
1137
- // events.ts accepts `channelId` as a legacy alias for `conversationId`.
1138
- const conversationId = typeof meta.conversationId === "string"
1139
- ? meta.conversationId
1140
- : typeof meta.channelId === "string"
1141
- ? meta.channelId
1142
- : null;
1108
+ /**
1109
+ * List events through the owning store, whose payloads are validated by the
1110
+ * event-format module (files that fail validation stay visible with a null
1111
+ * payload so operators can delete them).
1112
+ */
1113
+ export async function listAllEvents(store) {
1114
+ const entries = await store.list();
1115
+ return entries.map((entry) => {
1116
+ const payload = entry.payload;
1143
1117
  return {
1144
- name: e.name,
1145
- size: stats.size,
1146
- mtimeMs: stats.mtimeMs,
1147
- type: typeof meta.type === "string" ? meta.type : null,
1148
- platform: typeof meta.platform === "string" ? meta.platform : null,
1149
- conversationId,
1150
- text: typeof meta.text === "string" ? meta.text : null,
1151
- at: typeof meta.at === "string" ? meta.at : null,
1152
- schedule: typeof meta.schedule === "string" ? meta.schedule : null,
1153
- timezone: typeof meta.timezone === "string" ? meta.timezone : null,
1118
+ name: entry.filename,
1119
+ size: entry.size,
1120
+ mtimeMs: entry.mtimeMs,
1121
+ type: payload?.type ?? null,
1122
+ platform: payload?.platform ?? null,
1123
+ conversationId: payload?.conversationId ?? null,
1124
+ text: payload?.text ?? null,
1125
+ at: payload?.type === "one-shot" ? payload.at : null,
1126
+ schedule: payload?.type === "periodic" ? payload.schedule : null,
1127
+ timezone: payload?.type === "periodic" ? payload.timezone : null,
1154
1128
  };
1155
- })
1156
- .filter((e) => e !== null)
1157
- .toSorted((a, b) => a.name.localeCompare(b.name));
1129
+ });
1158
1130
  }
1159
- function serveEventsList(res, services) {
1160
- const workingDir = requireAdminWorkingDir(res, services);
1161
- if (!workingDir)
1131
+ function requireAdminEventStore(res, services) {
1132
+ if (!services.eventStore) {
1133
+ jsonRes(res, 503, { error: "Working directory not available" });
1134
+ return null;
1135
+ }
1136
+ return services.eventStore;
1137
+ }
1138
+ async function serveEventsList(res, services) {
1139
+ const store = requireAdminEventStore(res, services);
1140
+ if (!store)
1162
1141
  return;
1163
- jsonRes(res, 200, { events: listAllEvents(workingDir) });
1142
+ jsonRes(res, 200, { events: await listAllEvents(store) });
1164
1143
  }
1165
1144
  /** Per-conversation listing — filter all events by conversationId match. */
1166
- function serveConversationEventsList(res, url, services, token) {
1145
+ async function serveConversationEventsList(res, url, services, token) {
1167
1146
  const scope = resolveConversationFromQuery(url, token);
1168
1147
  if (scope.error) {
1169
1148
  jsonRes(res, 403, { error: scope.error });
1170
1149
  return;
1171
1150
  }
1172
- const workingDir = requireAdminWorkingDir(res, services);
1173
- if (!workingDir)
1151
+ const store = requireAdminEventStore(res, services);
1152
+ if (!store)
1174
1153
  return;
1175
- const events = listAllEvents(workingDir).filter((e) => e.conversationId === scope.conversationId);
1154
+ const events = (await listAllEvents(store)).filter((e) => e.conversationId === scope.conversationId);
1176
1155
  jsonRes(res, 200, { conversationId: scope.conversationId, events });
1177
1156
  }
1178
1157
  function serveEventsFile(res, url, services) {
@@ -1212,7 +1191,7 @@ function serveEventsFile(res, url, services) {
1212
1191
  jsonRes(res, 200, { name, content: raw });
1213
1192
  }
1214
1193
  /** Delete a single event file scoped to the caller's conversation. */
1215
- function serveConversationEventDelete(res, body, services, token) {
1194
+ async function serveConversationEventDelete(res, body, services, token) {
1216
1195
  const scope = resolveTargetConversation(body, token);
1217
1196
  if (scope.error) {
1218
1197
  jsonRes(res, 403, { error: scope.error });
@@ -1223,38 +1202,24 @@ function serveConversationEventDelete(res, body, services, token) {
1223
1202
  jsonRes(res, 400, { error: "Invalid name" });
1224
1203
  return;
1225
1204
  }
1226
- const workingDir = requireAdminWorkingDir(res, services);
1227
- if (!workingDir)
1205
+ const store = requireAdminEventStore(res, services);
1206
+ if (!store)
1228
1207
  return;
1229
- const filePath = join(workingDir, "events", name);
1230
- let raw;
1208
+ let payload;
1231
1209
  try {
1232
- raw = readFileSync(filePath, "utf-8");
1210
+ payload = (await store.read(name)).payload;
1233
1211
  }
1234
1212
  catch {
1235
1213
  jsonRes(res, 404, { error: "Event not found" });
1236
1214
  return;
1237
1215
  }
1238
- let parsed = {};
1239
- try {
1240
- const j = JSON.parse(raw);
1241
- if (j && typeof j === "object")
1242
- parsed = j;
1243
- }
1244
- catch {
1245
- // Malformed events cannot be associated with a conversation below.
1246
- }
1247
- const eventConvId = typeof parsed.conversationId === "string"
1248
- ? parsed.conversationId
1249
- : typeof parsed.channelId === "string"
1250
- ? parsed.channelId
1251
- : null;
1252
- if (eventConvId !== scope.conversationId) {
1216
+ // The store normalizes the legacy `channelId` alias into `conversationId`.
1217
+ if (payload?.conversationId !== scope.conversationId) {
1253
1218
  jsonRes(res, 403, { error: "Event does not belong to this conversation." });
1254
1219
  return;
1255
1220
  }
1256
1221
  try {
1257
- rmSync(filePath, { force: true });
1222
+ await store.delete(name);
1258
1223
  jsonRes(res, 200, { ok: true });
1259
1224
  }
1260
1225
  catch (err) {
@@ -1578,7 +1543,7 @@ function renderAdminPage(token) {
1578
1543
  }
1579
1544
 
1580
1545
  function renderSettings(data) {
1581
- const thinking = ['off','minimal','low','medium','high','xhigh'];
1546
+ const thinking = ['off','minimal','low','medium','high','xhigh','max'];
1582
1547
  const thinkingOpts = thinking.map((t) =>
1583
1548
  '<option value="' + t + '"' + (data.thinkingLevel === t ? ' selected' : '') + '>' + t + '</option>'
1584
1549
  ).join('');
@@ -1647,9 +1612,7 @@ function renderAdminPage(token) {
1647
1612
  conversationId: activeConversationId, provider, model, thinkingLevel,
1648
1613
  });
1649
1614
  result.style.display = 'block'; result.className = 'inline-result ok';
1650
- result.textContent = data.runtimeSwitched === false
1651
- ? 'Saved — running session pinned; new model applies on next start.'
1652
- : 'Saved ✓';
1615
+ result.textContent = 'Saved ✓';
1653
1616
  } catch (err) {
1654
1617
  result.style.display = 'block'; result.className = 'inline-result err';
1655
1618
  result.textContent = err.message;
@@ -2130,7 +2093,7 @@ function renderAdminPage(token) {
2130
2093
  }
2131
2094
 
2132
2095
  function renderGlobalSettings(data) {
2133
- const thinking = ['off','minimal','low','medium','high','xhigh'];
2096
+ const thinking = ['off','minimal','low','medium','high','xhigh','max'];
2134
2097
  const thinkingOpts = thinking.map((t) =>
2135
2098
  '<option value="' + t + '"' + (data.thinkingLevel === t ? ' selected' : '') + '>' + t + '</option>'
2136
2099
  ).join('');