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

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 (412) hide show
  1. package/CHANGELOG.md +354 -0
  2. package/README.md +42 -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/discord/bot.d.ts +1 -0
  7. package/dist/adapters/discord/bot.d.ts.map +1 -1
  8. package/dist/adapters/discord/bot.js +36 -67
  9. package/dist/adapters/discord/bot.js.map +1 -1
  10. package/dist/adapters/discord/context.d.ts.map +1 -1
  11. package/dist/adapters/discord/context.js +17 -42
  12. package/dist/adapters/discord/context.js.map +1 -1
  13. package/dist/adapters/github/bot.d.ts +148 -0
  14. package/dist/adapters/github/bot.d.ts.map +1 -0
  15. package/dist/adapters/github/bot.js +1031 -0
  16. package/dist/adapters/github/bot.js.map +1 -0
  17. package/dist/adapters/github/client.d.ts +118 -0
  18. package/dist/adapters/github/client.d.ts.map +1 -0
  19. package/dist/adapters/github/client.js +309 -0
  20. package/dist/adapters/github/client.js.map +1 -0
  21. package/dist/adapters/github/cloudbuild.d.ts +24 -0
  22. package/dist/adapters/github/cloudbuild.d.ts.map +1 -0
  23. package/dist/adapters/github/cloudbuild.js +71 -0
  24. package/dist/adapters/github/cloudbuild.js.map +1 -0
  25. package/dist/adapters/github/context.d.ts +9 -0
  26. package/dist/adapters/github/context.d.ts.map +1 -0
  27. package/dist/adapters/github/context.js +175 -0
  28. package/dist/adapters/github/context.js.map +1 -0
  29. package/dist/adapters/github/gcp-auth.d.ts +31 -0
  30. package/dist/adapters/github/gcp-auth.d.ts.map +1 -0
  31. package/dist/adapters/github/gcp-auth.js +196 -0
  32. package/dist/adapters/github/gcp-auth.js.map +1 -0
  33. package/dist/adapters/github/ids.d.ts +34 -0
  34. package/dist/adapters/github/ids.d.ts.map +1 -0
  35. package/dist/adapters/github/ids.js +53 -0
  36. package/dist/adapters/github/ids.js.map +1 -0
  37. package/dist/adapters/github/repo.d.ts +30 -0
  38. package/dist/adapters/github/repo.d.ts.map +1 -0
  39. package/dist/adapters/github/repo.js +136 -0
  40. package/dist/adapters/github/repo.js.map +1 -0
  41. package/dist/adapters/github/tool-pack.d.ts +14 -0
  42. package/dist/adapters/github/tool-pack.d.ts.map +1 -0
  43. package/dist/adapters/github/tool-pack.js +56 -0
  44. package/dist/adapters/github/tool-pack.js.map +1 -0
  45. package/dist/adapters/github/tools/checks.d.ts +24 -0
  46. package/dist/adapters/github/tools/checks.d.ts.map +1 -0
  47. package/dist/adapters/github/tools/checks.js +116 -0
  48. package/dist/adapters/github/tools/checks.js.map +1 -0
  49. package/dist/adapters/github/tools/issue.d.ts +22 -0
  50. package/dist/adapters/github/tools/issue.d.ts.map +1 -0
  51. package/dist/adapters/github/tools/issue.js +59 -0
  52. package/dist/adapters/github/tools/issue.js.map +1 -0
  53. package/dist/adapters/github/tools/pr.d.ts +22 -0
  54. package/dist/adapters/github/tools/pr.d.ts.map +1 -0
  55. package/dist/adapters/github/tools/pr.js +59 -0
  56. package/dist/adapters/github/tools/pr.js.map +1 -0
  57. package/dist/adapters/github/tools/read.d.ts +22 -0
  58. package/dist/adapters/github/tools/read.d.ts.map +1 -0
  59. package/dist/adapters/github/tools/read.js +152 -0
  60. package/dist/adapters/github/tools/read.js.map +1 -0
  61. package/dist/adapters/github/tools/review-reply.d.ts +19 -0
  62. package/dist/adapters/github/tools/review-reply.d.ts.map +1 -0
  63. package/dist/adapters/github/tools/review-reply.js +49 -0
  64. package/dist/adapters/github/tools/review-reply.js.map +1 -0
  65. package/dist/adapters/github/tools/sync.d.ts +17 -0
  66. package/dist/adapters/github/tools/sync.d.ts.map +1 -0
  67. package/dist/adapters/github/tools/sync.js +45 -0
  68. package/dist/adapters/github/tools/sync.js.map +1 -0
  69. package/dist/adapters/github/types.d.ts +350 -0
  70. package/dist/adapters/github/types.d.ts.map +1 -0
  71. package/dist/adapters/github/types.js +2 -0
  72. package/dist/adapters/github/types.js.map +1 -0
  73. package/dist/adapters/intake.d.ts +16 -5
  74. package/dist/adapters/intake.d.ts.map +1 -1
  75. package/dist/adapters/intake.js +79 -22
  76. package/dist/adapters/intake.js.map +1 -1
  77. package/dist/adapters/slack/bot.d.ts +8 -6
  78. package/dist/adapters/slack/bot.d.ts.map +1 -1
  79. package/dist/adapters/slack/bot.js +81 -133
  80. package/dist/adapters/slack/bot.js.map +1 -1
  81. package/dist/adapters/slack/context.d.ts.map +1 -1
  82. package/dist/adapters/slack/context.js +3 -14
  83. package/dist/adapters/slack/context.js.map +1 -1
  84. package/dist/adapters/slack/response-lifecycle.d.ts.map +1 -1
  85. package/dist/adapters/slack/response-lifecycle.js +14 -17
  86. package/dist/adapters/slack/response-lifecycle.js.map +1 -1
  87. package/dist/adapters/slack/session.d.ts.map +1 -1
  88. package/dist/adapters/slack/session.js +5 -8
  89. package/dist/adapters/slack/session.js.map +1 -1
  90. package/dist/adapters/streaming.d.ts +4 -0
  91. package/dist/adapters/streaming.d.ts.map +1 -1
  92. package/dist/adapters/streaming.js +11 -0
  93. package/dist/adapters/streaming.js.map +1 -1
  94. package/dist/adapters/telegram/bot.d.ts +1 -2
  95. package/dist/adapters/telegram/bot.d.ts.map +1 -1
  96. package/dist/adapters/telegram/bot.js +27 -62
  97. package/dist/adapters/telegram/bot.js.map +1 -1
  98. package/dist/adapters/telegram/context.d.ts.map +1 -1
  99. package/dist/adapters/telegram/context.js +8 -27
  100. package/dist/adapters/telegram/context.js.map +1 -1
  101. package/dist/adapters/types.d.ts +28 -2
  102. package/dist/adapters/types.d.ts.map +1 -1
  103. package/dist/adapters/types.js.map +1 -1
  104. package/dist/agent.d.ts +38 -14
  105. package/dist/agent.d.ts.map +1 -1
  106. package/dist/agent.js +358 -224
  107. package/dist/agent.js.map +1 -1
  108. package/dist/cli/download.d.ts.map +1 -0
  109. package/dist/cli/download.js.map +1 -0
  110. package/dist/cli/ext-git.d.ts +22 -0
  111. package/dist/cli/ext-git.d.ts.map +1 -0
  112. package/dist/cli/ext-git.js +76 -0
  113. package/dist/cli/ext-git.js.map +1 -0
  114. package/dist/cli/ext.d.ts +2 -0
  115. package/dist/cli/ext.d.ts.map +1 -0
  116. package/dist/cli/ext.js +217 -0
  117. package/dist/cli/ext.js.map +1 -0
  118. package/dist/commands/admin.d.ts.map +1 -1
  119. package/dist/commands/admin.js +2 -1
  120. package/dist/commands/admin.js.map +1 -1
  121. package/dist/commands/auto-reply.d.ts.map +1 -1
  122. package/dist/commands/auto-reply.js +2 -6
  123. package/dist/commands/auto-reply.js.map +1 -1
  124. package/dist/commands/extensions.d.ts.map +1 -1
  125. package/dist/commands/extensions.js +16 -6
  126. package/dist/commands/extensions.js.map +1 -1
  127. package/dist/commands/login.d.ts +2 -1
  128. package/dist/commands/login.d.ts.map +1 -1
  129. package/dist/commands/login.js +30 -1
  130. package/dist/commands/login.js.map +1 -1
  131. package/dist/commands/manifest.d.ts +72 -0
  132. package/dist/commands/manifest.d.ts.map +1 -0
  133. package/dist/commands/manifest.js +121 -0
  134. package/dist/commands/manifest.js.map +1 -0
  135. package/dist/commands/model.d.ts.map +1 -1
  136. package/dist/commands/model.js +3 -1
  137. package/dist/commands/model.js.map +1 -1
  138. package/dist/commands/new.d.ts.map +1 -1
  139. package/dist/commands/new.js +2 -1
  140. package/dist/commands/new.js.map +1 -1
  141. package/dist/commands/sandbox.d.ts.map +1 -1
  142. package/dist/commands/sandbox.js +16 -12
  143. package/dist/commands/sandbox.js.map +1 -1
  144. package/dist/commands/text.d.ts +2 -0
  145. package/dist/commands/text.d.ts.map +1 -0
  146. package/dist/commands/text.js +16 -0
  147. package/dist/commands/text.js.map +1 -0
  148. package/dist/commands/types.d.ts +14 -1
  149. package/dist/commands/types.d.ts.map +1 -1
  150. package/dist/commands/types.js.map +1 -1
  151. package/dist/config.d.ts +1 -1
  152. package/dist/config.d.ts.map +1 -1
  153. package/dist/config.js +90 -54
  154. package/dist/config.js.map +1 -1
  155. package/dist/events.d.ts +10 -0
  156. package/dist/events.d.ts.map +1 -1
  157. package/dist/events.js +14 -5
  158. package/dist/events.js.map +1 -1
  159. package/dist/execution-resolver.d.ts +3 -2
  160. package/dist/execution-resolver.d.ts.map +1 -1
  161. package/dist/execution-resolver.js +28 -12
  162. package/dist/execution-resolver.js.map +1 -1
  163. package/dist/harness/extensions/loader.d.ts +39 -9
  164. package/dist/harness/extensions/loader.d.ts.map +1 -1
  165. package/dist/harness/extensions/loader.js +258 -54
  166. package/dist/harness/extensions/loader.js.map +1 -1
  167. package/dist/harness/extensions/registry.d.ts +48 -1
  168. package/dist/harness/extensions/registry.d.ts.map +1 -1
  169. package/dist/harness/extensions/registry.js +146 -0
  170. package/dist/harness/extensions/registry.js.map +1 -1
  171. package/dist/harness/extensions/types.d.ts +161 -14
  172. package/dist/harness/extensions/types.d.ts.map +1 -1
  173. package/dist/harness/extensions/types.js.map +1 -1
  174. package/dist/harness/index.d.ts +5 -5
  175. package/dist/harness/index.d.ts.map +1 -1
  176. package/dist/harness/index.js +2 -2
  177. package/dist/harness/index.js.map +1 -1
  178. package/dist/harness/models.d.ts +5 -0
  179. package/dist/harness/models.d.ts.map +1 -1
  180. package/dist/harness/models.js +10 -0
  181. package/dist/harness/models.js.map +1 -1
  182. package/dist/harness/runner.d.ts +21 -2
  183. package/dist/harness/runner.d.ts.map +1 -1
  184. package/dist/harness/runner.js +80 -22
  185. package/dist/harness/runner.js.map +1 -1
  186. package/dist/harness/session-store.d.ts +4 -1
  187. package/dist/harness/session-store.d.ts.map +1 -1
  188. package/dist/harness/session-store.js +11 -2
  189. package/dist/harness/session-store.js.map +1 -1
  190. package/dist/harness/subagent-runner.d.ts +17 -0
  191. package/dist/harness/subagent-runner.d.ts.map +1 -0
  192. package/dist/harness/subagent-runner.js +307 -0
  193. package/dist/harness/subagent-runner.js.map +1 -0
  194. package/dist/harness/types.d.ts +53 -0
  195. package/dist/harness/types.d.ts.map +1 -1
  196. package/dist/harness/types.js.map +1 -1
  197. package/dist/index.d.ts +1 -1
  198. package/dist/index.d.ts.map +1 -1
  199. package/dist/index.js.map +1 -1
  200. package/dist/main.js +232 -29
  201. package/dist/main.js.map +1 -1
  202. package/dist/provisioner.d.ts.map +1 -1
  203. package/dist/provisioner.js +2 -5
  204. package/dist/provisioner.js.map +1 -1
  205. package/dist/runtime/conversation-runtime.d.ts +1 -1
  206. package/dist/runtime/conversation-runtime.d.ts.map +1 -1
  207. package/dist/runtime/conversation-runtime.js +264 -41
  208. package/dist/runtime/conversation-runtime.js.map +1 -1
  209. package/dist/runtime/types.d.ts +32 -5
  210. package/dist/runtime/types.d.ts.map +1 -1
  211. package/dist/runtime/types.js.map +1 -1
  212. package/dist/sandbox/cloudflare.d.ts +2 -0
  213. package/dist/sandbox/cloudflare.d.ts.map +1 -1
  214. package/dist/sandbox/cloudflare.js +7 -0
  215. package/dist/sandbox/cloudflare.js.map +1 -1
  216. package/dist/sandbox/container.d.ts +3 -0
  217. package/dist/sandbox/container.d.ts.map +1 -1
  218. package/dist/sandbox/container.js +8 -2
  219. package/dist/sandbox/container.js.map +1 -1
  220. package/dist/sandbox/firecracker.d.ts +2 -0
  221. package/dist/sandbox/firecracker.d.ts.map +1 -1
  222. package/dist/sandbox/firecracker.js +7 -1
  223. package/dist/sandbox/firecracker.js.map +1 -1
  224. package/dist/sandbox/gondolin-fleet.d.ts +104 -0
  225. package/dist/sandbox/gondolin-fleet.d.ts.map +1 -0
  226. package/dist/sandbox/gondolin-fleet.js +330 -0
  227. package/dist/sandbox/gondolin-fleet.js.map +1 -0
  228. package/dist/sandbox/gondolin-gateway.d.ts +85 -0
  229. package/dist/sandbox/gondolin-gateway.d.ts.map +1 -0
  230. package/dist/sandbox/gondolin-gateway.js +400 -0
  231. package/dist/sandbox/gondolin-gateway.js.map +1 -0
  232. package/dist/sandbox/gondolin-inventory.d.ts +89 -0
  233. package/dist/sandbox/gondolin-inventory.d.ts.map +1 -0
  234. package/dist/sandbox/gondolin-inventory.js +267 -0
  235. package/dist/sandbox/gondolin-inventory.js.map +1 -0
  236. package/dist/sandbox/gondolin-join.d.ts +62 -0
  237. package/dist/sandbox/gondolin-join.d.ts.map +1 -0
  238. package/dist/sandbox/gondolin-join.js +261 -0
  239. package/dist/sandbox/gondolin-join.js.map +1 -0
  240. package/dist/sandbox/gondolin-nfs-advisory.d.ts +15 -0
  241. package/dist/sandbox/gondolin-nfs-advisory.d.ts.map +1 -0
  242. package/dist/sandbox/gondolin-nfs-advisory.js +60 -0
  243. package/dist/sandbox/gondolin-nfs-advisory.js.map +1 -0
  244. package/dist/sandbox/gondolin-placement.d.ts +32 -0
  245. package/dist/sandbox/gondolin-placement.d.ts.map +1 -0
  246. package/dist/sandbox/gondolin-placement.js +83 -0
  247. package/dist/sandbox/gondolin-placement.js.map +1 -0
  248. package/dist/sandbox/gondolin-remote.d.ts +73 -0
  249. package/dist/sandbox/gondolin-remote.d.ts.map +1 -0
  250. package/dist/sandbox/gondolin-remote.js +352 -0
  251. package/dist/sandbox/gondolin-remote.js.map +1 -0
  252. package/dist/sandbox/gondolin-worker-client.d.ts +139 -0
  253. package/dist/sandbox/gondolin-worker-client.d.ts.map +1 -0
  254. package/dist/sandbox/gondolin-worker-client.js +325 -0
  255. package/dist/sandbox/gondolin-worker-client.js.map +1 -0
  256. package/dist/sandbox/gondolin-worker-main.d.ts +2 -0
  257. package/dist/sandbox/gondolin-worker-main.d.ts.map +1 -0
  258. package/dist/sandbox/gondolin-worker-main.js +22 -0
  259. package/dist/sandbox/gondolin-worker-main.js.map +1 -0
  260. package/dist/sandbox/gondolin-worker.d.ts +55 -0
  261. package/dist/sandbox/gondolin-worker.d.ts.map +1 -0
  262. package/dist/sandbox/gondolin-worker.js +201 -0
  263. package/dist/sandbox/gondolin-worker.js.map +1 -0
  264. package/dist/sandbox/gondolin.d.ts +52 -0
  265. package/dist/sandbox/gondolin.d.ts.map +1 -0
  266. package/dist/sandbox/gondolin.js +425 -0
  267. package/dist/sandbox/gondolin.js.map +1 -0
  268. package/dist/sandbox/host.d.ts +2 -0
  269. package/dist/sandbox/host.d.ts.map +1 -1
  270. package/dist/sandbox/host.js +11 -0
  271. package/dist/sandbox/host.js.map +1 -1
  272. package/dist/sandbox/identity.d.ts +21 -0
  273. package/dist/sandbox/identity.d.ts.map +1 -0
  274. package/dist/sandbox/identity.js +36 -0
  275. package/dist/sandbox/identity.js.map +1 -0
  276. package/dist/sandbox/index.d.ts +4 -3
  277. package/dist/sandbox/index.d.ts.map +1 -1
  278. package/dist/sandbox/index.js +5 -3
  279. package/dist/sandbox/index.js.map +1 -1
  280. package/dist/sandbox/types.d.ts +26 -1
  281. package/dist/sandbox/types.d.ts.map +1 -1
  282. package/dist/sandbox/types.js.map +1 -1
  283. package/dist/sandbox/utils.d.ts +11 -0
  284. package/dist/sandbox/utils.d.ts.map +1 -1
  285. package/dist/sandbox/utils.js +35 -0
  286. package/dist/sandbox/utils.js.map +1 -1
  287. package/dist/sessions/agent-memory-file-manager.d.ts.map +1 -1
  288. package/dist/sessions/agent-memory-file-manager.js +16 -30
  289. package/dist/sessions/agent-memory-file-manager.js.map +1 -1
  290. package/dist/sessions/history-line.d.ts +20 -0
  291. package/dist/sessions/history-line.d.ts.map +1 -0
  292. package/dist/sessions/history-line.js +24 -0
  293. package/dist/sessions/history-line.js.map +1 -0
  294. package/dist/sessions/policy.d.ts.map +1 -1
  295. package/dist/sessions/policy.js +5 -3
  296. package/dist/sessions/policy.js.map +1 -1
  297. package/dist/sessions/session-key.d.ts +31 -0
  298. package/dist/sessions/session-key.d.ts.map +1 -0
  299. package/dist/sessions/session-key.js +44 -0
  300. package/dist/sessions/session-key.js.map +1 -0
  301. package/dist/sessions/store.d.ts.map +1 -1
  302. package/dist/sessions/store.js +2 -2
  303. package/dist/sessions/store.js.map +1 -1
  304. package/dist/tools/bash.d.ts +3 -1
  305. package/dist/tools/bash.d.ts.map +1 -1
  306. package/dist/tools/bash.js +24 -17
  307. package/dist/tools/bash.js.map +1 -1
  308. package/dist/tools/edit.d.ts.map +1 -1
  309. package/dist/tools/edit.js +9 -12
  310. package/dist/tools/edit.js.map +1 -1
  311. package/dist/tools/event.d.ts +1 -1
  312. package/dist/tools/event.d.ts.map +1 -1
  313. package/dist/tools/event.js +33 -4
  314. package/dist/tools/event.js.map +1 -1
  315. package/dist/tools/generate-image.d.ts +17 -0
  316. package/dist/tools/generate-image.d.ts.map +1 -0
  317. package/dist/tools/generate-image.js +63 -0
  318. package/dist/tools/generate-image.js.map +1 -0
  319. package/dist/tools/index.d.ts +16 -2
  320. package/dist/tools/index.d.ts.map +1 -1
  321. package/dist/tools/index.js +27 -3
  322. package/dist/tools/index.js.map +1 -1
  323. package/dist/tools/react.d.ts +15 -0
  324. package/dist/tools/react.d.ts.map +1 -0
  325. package/dist/tools/react.js +40 -0
  326. package/dist/tools/react.js.map +1 -0
  327. package/dist/tools/sandbox.d.ts +2 -2
  328. package/dist/tools/sandbox.d.ts.map +1 -1
  329. package/dist/tools/sandbox.js +8 -7
  330. package/dist/tools/sandbox.js.map +1 -1
  331. package/dist/tools/subagent.d.ts +69 -0
  332. package/dist/tools/subagent.d.ts.map +1 -0
  333. package/dist/tools/subagent.js +286 -0
  334. package/dist/tools/subagent.js.map +1 -0
  335. package/dist/tools/types.d.ts +34 -1
  336. package/dist/tools/types.d.ts.map +1 -1
  337. package/dist/tools/types.js.map +1 -1
  338. package/dist/tools/write.d.ts.map +1 -1
  339. package/dist/tools/write.js +1 -8
  340. package/dist/tools/write.js.map +1 -1
  341. package/dist/trigger.d.ts.map +1 -1
  342. package/dist/trigger.js +1 -2
  343. package/dist/trigger.js.map +1 -1
  344. package/dist/types.d.ts +139 -7
  345. package/dist/types.d.ts.map +1 -1
  346. package/dist/types.js.map +1 -1
  347. package/dist/vault/disabled.d.ts +9 -0
  348. package/dist/vault/disabled.d.ts.map +1 -0
  349. package/dist/vault/disabled.js +23 -0
  350. package/dist/vault/disabled.js.map +1 -0
  351. package/dist/vault/index.d.ts.map +1 -1
  352. package/dist/vault/index.js +3 -24
  353. package/dist/vault/index.js.map +1 -1
  354. package/dist/vault/policy.d.ts +20 -0
  355. package/dist/vault/policy.d.ts.map +1 -0
  356. package/dist/vault/policy.js +20 -0
  357. package/dist/vault/policy.js.map +1 -0
  358. package/dist/vault/routing.d.ts +1 -0
  359. package/dist/vault/routing.d.ts.map +1 -1
  360. package/dist/vault/routing.js +3 -10
  361. package/dist/vault/routing.js.map +1 -1
  362. package/dist/web/admin/portal.d.ts +27 -0
  363. package/dist/web/admin/portal.d.ts.map +1 -1
  364. package/dist/web/admin/portal.js +91 -130
  365. package/dist/web/admin/portal.js.map +1 -1
  366. package/dist/web/admin/types.d.ts +3 -0
  367. package/dist/web/admin/types.d.ts.map +1 -1
  368. package/dist/web/admin/types.js.map +1 -1
  369. package/dist/web/login/oauth.d.ts +2 -3
  370. package/dist/web/login/oauth.d.ts.map +1 -1
  371. package/dist/web/login/oauth.js +0 -31
  372. package/dist/web/login/oauth.js.map +1 -1
  373. package/dist/web/login/portal.js +1 -1
  374. package/dist/web/login/portal.js.map +1 -1
  375. package/dist/web/login/types.d.ts +0 -11
  376. package/dist/web/login/types.d.ts.map +1 -1
  377. package/dist/web/login/types.js.map +1 -1
  378. package/dist/web/portal-shell.d.ts +4 -0
  379. package/dist/web/portal-shell.d.ts.map +1 -0
  380. package/dist/{portal-shell.js → web/portal-shell.js} +2 -2
  381. package/dist/web/portal-shell.js.map +1 -0
  382. package/dist/web/server.d.ts.map +1 -1
  383. package/dist/web/server.js +7 -0
  384. package/dist/web/server.js.map +1 -1
  385. package/dist/web/session-view/command.d.ts.map +1 -1
  386. package/dist/web/session-view/command.js +4 -1
  387. package/dist/web/session-view/command.js.map +1 -1
  388. package/dist/web/session-view/portal.d.ts.map +1 -1
  389. package/dist/web/session-view/portal.js +4 -3
  390. package/dist/web/session-view/portal.js.map +1 -1
  391. package/dist/web/session-view/service.d.ts.map +1 -1
  392. package/dist/web/session-view/service.js +2 -1
  393. package/dist/web/session-view/service.js.map +1 -1
  394. package/dist/web/session-view/types.d.ts +2 -1
  395. package/dist/web/session-view/types.d.ts.map +1 -1
  396. package/dist/web/session-view/types.js.map +1 -1
  397. package/package.json +7 -4
  398. package/dist/download.d.ts.map +0 -1
  399. package/dist/download.js.map +0 -1
  400. package/dist/model-registry.d.ts +0 -4
  401. package/dist/model-registry.d.ts.map +0 -1
  402. package/dist/model-registry.js +0 -7
  403. package/dist/model-registry.js.map +0 -1
  404. package/dist/portal-shell.d.ts +0 -4
  405. package/dist/portal-shell.d.ts.map +0 -1
  406. package/dist/portal-shell.js.map +0 -1
  407. package/dist/runtime/agent-run-controller.d.ts +0 -31
  408. package/dist/runtime/agent-run-controller.d.ts.map +0 -1
  409. package/dist/runtime/agent-run-controller.js +0 -195
  410. package/dist/runtime/agent-run-controller.js.map +0 -1
  411. /package/dist/{download.d.ts → cli/download.d.ts} +0 -0
  412. /package/dist/{download.js → cli/download.js} +0 -0
@@ -1,13 +1,6 @@
1
- import { DockerContainerManager } from "../provisioner.js";
1
+ import { actorKey } from "../sandbox/identity.js";
2
+ /** The vault key for an actor — the shared runtime identity (see sandbox/identity.ts). */
2
3
  export function resolveActorVaultKey(baseConfig, userId, conversationId) {
3
- if (baseConfig.type === "container") {
4
- return `container-${baseConfig.container}`;
5
- }
6
- if (baseConfig.type === "image" ||
7
- baseConfig.type === "cloudflare" ||
8
- baseConfig.type === "firecracker") {
9
- return DockerContainerManager.sanitizeSegment(conversationId);
10
- }
11
- return userId;
4
+ return actorKey(baseConfig, { userId, conversationId });
12
5
  }
13
6
  //# sourceMappingURL=routing.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"routing.js","sourceRoot":"","sources":["../../src/vault/routing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAE3D,MAAM,UAAU,oBAAoB,CAClC,UAAyB,EACzB,MAAc,EACd,cAAsB;IAEtB,IAAI,UAAU,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QACpC,OAAO,aAAa,UAAU,CAAC,SAAS,EAAE,CAAC;IAC7C,CAAC;IAED,IACE,UAAU,CAAC,IAAI,KAAK,OAAO;QAC3B,UAAU,CAAC,IAAI,KAAK,YAAY;QAChC,UAAU,CAAC,IAAI,KAAK,aAAa,EACjC,CAAC;QACD,OAAO,sBAAsB,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;IAChE,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["import { DockerContainerManager } from \"../provisioner.js\";\nimport type { SandboxConfig } from \"../sandbox/index.js\";\nexport function resolveActorVaultKey(\n baseConfig: SandboxConfig,\n userId: string,\n conversationId: string,\n): string {\n if (baseConfig.type === \"container\") {\n return `container-${baseConfig.container}`;\n }\n\n if (\n baseConfig.type === \"image\" ||\n baseConfig.type === \"cloudflare\" ||\n baseConfig.type === \"firecracker\"\n ) {\n return DockerContainerManager.sanitizeSegment(conversationId);\n }\n\n return userId;\n}\n"]}
1
+ {"version":3,"file":"routing.js","sourceRoot":"","sources":["../../src/vault/routing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAGlD,0FAA0F;AAC1F,MAAM,UAAU,oBAAoB,CAClC,UAAyB,EACzB,MAAc,EACd,cAAsB;IAEtB,OAAO,QAAQ,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC;AAC1D,CAAC","sourcesContent":["import { actorKey } from \"../sandbox/identity.js\";\nimport type { SandboxConfig } from \"../sandbox/index.js\";\n\n/** The vault key for an actor — the shared runtime identity (see sandbox/identity.ts). */\nexport function resolveActorVaultKey(\n baseConfig: SandboxConfig,\n userId: string,\n conversationId: string,\n): string {\n return actorKey(baseConfig, { userId, conversationId });\n}\n"]}
@@ -1,5 +1,32 @@
1
1
  import type { IncomingMessage, ServerResponse } from "http";
2
+ import type { EventStore } from "../../tools/types.js";
2
3
  export type { AdminRuntimeBridge, AdminServices } from "./types.js";
3
4
  import type { AdminServices } from "./types.js";
4
5
  export declare function handleAdminRequest(req: IncomingMessage, res: ServerResponse, url: URL, services: AdminServices): Promise<boolean>;
6
+ interface SkillEntry {
7
+ name: string;
8
+ description: string;
9
+ source: "global" | "conversation";
10
+ path: string;
11
+ directory: string;
12
+ }
13
+ export declare function readSkillsFromDir(skillsDir: string, source: SkillEntry["source"]): SkillEntry[];
14
+ export interface EventSummary {
15
+ name: string;
16
+ size: number;
17
+ mtimeMs: number;
18
+ type: string | null;
19
+ platform: string | null;
20
+ conversationId: string | null;
21
+ text: string | null;
22
+ at: string | null;
23
+ schedule: string | null;
24
+ timezone: string | null;
25
+ }
26
+ /**
27
+ * List events through the owning store (which normalizes the legacy
28
+ * `channelId` alias and keeps unparseable files visible with a null payload).
29
+ * Store payloads are unvalidated JSON, so field access stays defensive.
30
+ */
31
+ export declare function listAllEvents(store: EventStore): Promise<EventSummary[]>;
5
32
  //# sourceMappingURL=portal.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"portal.d.ts","sourceRoot":"","sources":["../../../src/web/admin/portal.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AAuB5D,YAAY,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAIhD,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,GAAG,EAAE,GAAG,EACR,QAAQ,EAAE,aAAa,GACtB,OAAO,CAAC,OAAO,CAAC,CA6BlB"}
1
+ {"version":3,"file":"portal.d.ts","sourceRoot":"","sources":["../../../src/web/admin/portal.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AAG5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAsBvD,YAAY,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAIhD,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,GAAG,EAAE,GAAG,EACR,QAAQ,EAAE,aAAa,GACtB,OAAO,CAAC,OAAO,CAAC,CA6BlB;AA4nCD,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,QAAQ,GAAG,cAAc,CAAC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAwBD,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,GAAG,UAAU,EAAE,CAuB/F;AAyED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAMD;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAyB9E"}
@@ -1,10 +1,10 @@
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";
3
+ import { MikanModels, parseFrontmatter, SessionStore } from "../../harness/index.js";
4
4
  import { loadConversationAutoReplyConfig, loadGlobalSettings, resolveConversationSettings, saveConversationAutoReplyConfig, updateConversationSettings, updateGlobalSettings, } from "../../config.js";
5
5
  import { escapeHtml } from "../../utils/html.js";
6
6
  import { readRawBody } from "../../utils/http-body.js";
7
- import { renderPortalShell } from "../../portal-shell.js";
7
+ import { renderPortalShell } from "../portal-shell.js";
8
8
  import { resolveExistingSessionFile } from "../session-view/service.js";
9
9
  import { PRODUCT_NAME } from "../../platform-messages.js";
10
10
  import { resolveActorVaultKey } from "../../vault/routing.js";
@@ -88,7 +88,7 @@ async function routeApiRequest(req, res, url, services) {
88
88
  return;
89
89
  }
90
90
  if (url.pathname === "/admin/api/events") {
91
- serveEventsList(res, services);
91
+ await serveEventsList(res, services);
92
92
  return;
93
93
  }
94
94
  if (url.pathname === "/admin/api/events/file") {
@@ -96,7 +96,7 @@ async function routeApiRequest(req, res, url, services) {
96
96
  return;
97
97
  }
98
98
  if (url.pathname === "/admin/api/conversations/events") {
99
- serveConversationEventsList(res, url, services, token);
99
+ await serveConversationEventsList(res, url, services, token);
100
100
  return;
101
101
  }
102
102
  jsonRes(res, 404, { error: "Not found" });
@@ -140,7 +140,7 @@ async function routeApiRequest(req, res, url, services) {
140
140
  return;
141
141
  }
142
142
  if (url.pathname === "/admin/api/conversations/events/delete") {
143
- serveConversationEventDelete(res, body, services, token);
143
+ await serveConversationEventDelete(res, body, services, token);
144
144
  return;
145
145
  }
146
146
  if (url.pathname === "/admin/api/settings/model") {
@@ -465,8 +465,8 @@ function serveConversationState(res, url, services, token) {
465
465
  globalProvider: globalConfig.provider,
466
466
  globalModel: globalConfig.model,
467
467
  globalThinkingLevel: globalConfig.thinkingLevel,
468
- sandboxImageWorkspaceMount: conversationConfig.sandboxImageWorkspaceMount ?? null,
469
- globalSandboxImageWorkspaceMount: globalConfig.sandboxImageWorkspaceMount ?? null,
468
+ sandboxImageWorkspaceMount: conversationConfig.sandbox?.image?.workspaceMount ?? null,
469
+ globalSandboxImageWorkspaceMount: globalConfig.sandbox?.image?.workspaceMount ?? null,
470
470
  autoReplyEnabled: autoReply.enabled,
471
471
  autoReplyRules: autoReply.rules,
472
472
  slack: {
@@ -482,12 +482,12 @@ function serveGlobalSettings(res) {
482
482
  provider: config.provider,
483
483
  model: config.model,
484
484
  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,
485
+ sandboxCpus: config.sandbox?.cpus ?? null,
486
+ sandboxMemory: config.sandbox?.memory ?? null,
487
+ sandboxBoostCpus: config.sandbox?.boost?.cpus ?? null,
488
+ sandboxBoostMemory: config.sandbox?.boost?.memory ?? null,
489
+ sandboxImageWorkspaceMount: config.sandbox?.image?.workspaceMount ?? null,
490
+ defaultSharedVault: config.sandbox?.defaultSharedVault ?? null,
491
491
  slack: {
492
492
  replyMode: config.slack?.replyMode ?? "top-level",
493
493
  },
@@ -518,7 +518,7 @@ async function serveModelsList(res) {
518
518
  jsonRes(res, 500, { error: err instanceof Error ? err.message : String(err) });
519
519
  }
520
520
  }
521
- const VALID_THINKING_LEVELS = new Set(["off", "minimal", "low", "medium", "high", "xhigh"]);
521
+ const VALID_THINKING_LEVELS = new Set(["off", "minimal", "low", "medium", "high", "xhigh", "max"]);
522
522
  function serveConversationModelUpdate(res, body, services, token) {
523
523
  const provider = typeof body.provider === "string" ? body.provider.trim() : "";
524
524
  const model = typeof body.model === "string" ? body.model.trim() : "";
@@ -570,7 +570,7 @@ function serveConversationSandboxUpdate(res, body, services, token) {
570
570
  return;
571
571
  const dir = join(workingDir, scope.conversationId);
572
572
  try {
573
- updateConversationSettings(dir, { sandboxImageWorkspaceMount: workspaceMount });
573
+ updateConversationSettings(dir, { sandbox: { image: { workspaceMount } } });
574
574
  jsonRes(res, 200, { ok: true });
575
575
  }
576
576
  catch (err) {
@@ -747,23 +747,25 @@ function serveGlobalSandboxUpdate(res, body) {
747
747
  const boostMemory = typeof body.boostMemory === "string" ? body.boostMemory.trim() : "";
748
748
  const workspaceMount = body.workspaceMount;
749
749
  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;
750
+ const update = {
751
+ ...(cpus ? { cpus } : {}),
752
+ ...(memory ? { memory } : {}),
753
+ ...(boostCpus || boostMemory
754
+ ? {
755
+ boost: {
756
+ ...(boostCpus ? { cpus: boostCpus } : {}),
757
+ ...(boostMemory ? { memory: boostMemory } : {}),
758
+ },
759
+ }
760
+ : {}),
761
+ ...(validMount ? { image: { workspaceMount: workspaceMount } } : {}),
762
+ };
761
763
  if (Object.keys(update).length === 0) {
762
764
  jsonRes(res, 400, { error: "No valid sandbox fields provided" });
763
765
  return;
764
766
  }
765
767
  try {
766
- updateGlobalSettings(update);
768
+ updateGlobalSettings({ sandbox: update });
767
769
  jsonRes(res, 200, { ok: true });
768
770
  }
769
771
  catch (err) {
@@ -994,7 +996,12 @@ function serveWorkspaceFile(res, url, services, token) {
994
996
  }
995
997
  servePreviewFile(res, safe.absolute, { path: requestedPath }, "File not found");
996
998
  }
997
- function parseSkillFrontmatter(filePath) {
999
+ /**
1000
+ * Read skill metadata via the harness frontmatter parser (the owning module).
1001
+ * The portal historically accepted frontmatter keys case-insensitively, so
1002
+ * the lookup — not the parser — preserves that leniency.
1003
+ */
1004
+ function readSkillMeta(filePath) {
998
1005
  let text;
999
1006
  try {
1000
1007
  text = readFileSync(filePath, "utf-8");
@@ -1002,31 +1009,18 @@ function parseSkillFrontmatter(filePath) {
1002
1009
  catch {
1003
1010
  return {};
1004
1011
  }
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);
1012
+ const { values } = parseFrontmatter(text);
1011
1013
  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")
1014
+ for (const [key, value] of Object.entries(values)) {
1015
+ const normalized = key.toLowerCase();
1016
+ if (normalized === "name")
1023
1017
  out.name = value;
1024
- if (key === "description")
1018
+ if (normalized === "description")
1025
1019
  out.description = value;
1026
1020
  }
1027
1021
  return out;
1028
1022
  }
1029
- function readSkillsFromDir(skillsDir, source) {
1023
+ export function readSkillsFromDir(skillsDir, source) {
1030
1024
  if (!existsSync(skillsDir))
1031
1025
  return [];
1032
1026
  const out = [];
@@ -1043,7 +1037,7 @@ function readSkillsFromDir(skillsDir, source) {
1043
1037
  const skillMd = join(skillsDir, entry.name, "SKILL.md");
1044
1038
  if (!existsSync(skillMd))
1045
1039
  continue;
1046
- const meta = parseSkillFrontmatter(skillMd);
1040
+ const meta = readSkillMeta(skillMd);
1047
1041
  out.push({
1048
1042
  name: meta.name ?? entry.name,
1049
1043
  description: meta.description ?? "",
@@ -1104,75 +1098,56 @@ function serveSkillFile(res, url, services, token) {
1104
1098
  }
1105
1099
  // ── Events ─────────────────────────────────────────────────────────────────────
1106
1100
  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;
1101
+ function stringOrNull(value) {
1102
+ return typeof value === "string" ? value : null;
1103
+ }
1104
+ /**
1105
+ * List events through the owning store (which normalizes the legacy
1106
+ * `channelId` alias and keeps unparseable files visible with a null payload).
1107
+ * Store payloads are unvalidated JSON, so field access stays defensive.
1108
+ */
1109
+ export async function listAllEvents(store) {
1110
+ const entries = await store.list();
1111
+ return entries.map((entry) => {
1112
+ const payload = entry.payload;
1143
1113
  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,
1114
+ name: entry.filename,
1115
+ size: entry.size,
1116
+ mtimeMs: entry.mtimeMs,
1117
+ type: stringOrNull(payload?.type),
1118
+ platform: stringOrNull(payload?.platform),
1119
+ conversationId: stringOrNull(payload?.conversationId),
1120
+ text: stringOrNull(payload?.text),
1121
+ at: stringOrNull(payload?.at),
1122
+ schedule: stringOrNull(payload?.schedule),
1123
+ timezone: stringOrNull(payload?.timezone),
1154
1124
  };
1155
- })
1156
- .filter((e) => e !== null)
1157
- .toSorted((a, b) => a.name.localeCompare(b.name));
1125
+ });
1158
1126
  }
1159
- function serveEventsList(res, services) {
1160
- const workingDir = requireAdminWorkingDir(res, services);
1161
- if (!workingDir)
1127
+ function requireAdminEventStore(res, services) {
1128
+ if (!services.eventStore) {
1129
+ jsonRes(res, 503, { error: "Working directory not available" });
1130
+ return null;
1131
+ }
1132
+ return services.eventStore;
1133
+ }
1134
+ async function serveEventsList(res, services) {
1135
+ const store = requireAdminEventStore(res, services);
1136
+ if (!store)
1162
1137
  return;
1163
- jsonRes(res, 200, { events: listAllEvents(workingDir) });
1138
+ jsonRes(res, 200, { events: await listAllEvents(store) });
1164
1139
  }
1165
1140
  /** Per-conversation listing — filter all events by conversationId match. */
1166
- function serveConversationEventsList(res, url, services, token) {
1141
+ async function serveConversationEventsList(res, url, services, token) {
1167
1142
  const scope = resolveConversationFromQuery(url, token);
1168
1143
  if (scope.error) {
1169
1144
  jsonRes(res, 403, { error: scope.error });
1170
1145
  return;
1171
1146
  }
1172
- const workingDir = requireAdminWorkingDir(res, services);
1173
- if (!workingDir)
1147
+ const store = requireAdminEventStore(res, services);
1148
+ if (!store)
1174
1149
  return;
1175
- const events = listAllEvents(workingDir).filter((e) => e.conversationId === scope.conversationId);
1150
+ const events = (await listAllEvents(store)).filter((e) => e.conversationId === scope.conversationId);
1176
1151
  jsonRes(res, 200, { conversationId: scope.conversationId, events });
1177
1152
  }
1178
1153
  function serveEventsFile(res, url, services) {
@@ -1212,7 +1187,7 @@ function serveEventsFile(res, url, services) {
1212
1187
  jsonRes(res, 200, { name, content: raw });
1213
1188
  }
1214
1189
  /** Delete a single event file scoped to the caller's conversation. */
1215
- function serveConversationEventDelete(res, body, services, token) {
1190
+ async function serveConversationEventDelete(res, body, services, token) {
1216
1191
  const scope = resolveTargetConversation(body, token);
1217
1192
  if (scope.error) {
1218
1193
  jsonRes(res, 403, { error: scope.error });
@@ -1223,38 +1198,24 @@ function serveConversationEventDelete(res, body, services, token) {
1223
1198
  jsonRes(res, 400, { error: "Invalid name" });
1224
1199
  return;
1225
1200
  }
1226
- const workingDir = requireAdminWorkingDir(res, services);
1227
- if (!workingDir)
1201
+ const store = requireAdminEventStore(res, services);
1202
+ if (!store)
1228
1203
  return;
1229
- const filePath = join(workingDir, "events", name);
1230
- let raw;
1204
+ let payload;
1231
1205
  try {
1232
- raw = readFileSync(filePath, "utf-8");
1206
+ payload = (await store.read(name)).payload;
1233
1207
  }
1234
1208
  catch {
1235
1209
  jsonRes(res, 404, { error: "Event not found" });
1236
1210
  return;
1237
1211
  }
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) {
1212
+ // The store normalizes the legacy `channelId` alias into `conversationId`.
1213
+ if (payload?.conversationId !== scope.conversationId) {
1253
1214
  jsonRes(res, 403, { error: "Event does not belong to this conversation." });
1254
1215
  return;
1255
1216
  }
1256
1217
  try {
1257
- rmSync(filePath, { force: true });
1218
+ await store.delete(name);
1258
1219
  jsonRes(res, 200, { ok: true });
1259
1220
  }
1260
1221
  catch (err) {
@@ -1578,7 +1539,7 @@ function renderAdminPage(token) {
1578
1539
  }
1579
1540
 
1580
1541
  function renderSettings(data) {
1581
- const thinking = ['off','minimal','low','medium','high','xhigh'];
1542
+ const thinking = ['off','minimal','low','medium','high','xhigh','max'];
1582
1543
  const thinkingOpts = thinking.map((t) =>
1583
1544
  '<option value="' + t + '"' + (data.thinkingLevel === t ? ' selected' : '') + '>' + t + '</option>'
1584
1545
  ).join('');
@@ -2130,7 +2091,7 @@ function renderAdminPage(token) {
2130
2091
  }
2131
2092
 
2132
2093
  function renderGlobalSettings(data) {
2133
- const thinking = ['off','minimal','low','medium','high','xhigh'];
2094
+ const thinking = ['off','minimal','low','medium','high','xhigh','max'];
2134
2095
  const thinkingOpts = thinking.map((t) =>
2135
2096
  '<option value="' + t + '"' + (data.thinkingLevel === t ? ' selected' : '') + '>' + t + '</option>'
2136
2097
  ).join('');