@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
package/dist/agent.js CHANGED
@@ -1,24 +1,40 @@
1
- import { DEFAULT_EVENT_BUDGET, defaultExtensionDirs, formatSkillsForPrompt, loadExtensions, loadSkillsFromDir, MikanAgentSession, MikanModels, } from "./harness/index.js";
1
+ /**
2
+ * Agent runner: prompt construction, path translation, run lifecycle, and createRunner.
3
+ * Single module — do not split helpers that only this file uses.
4
+ */
5
+ import { DEFAULT_EVENT_BUDGET, defaultExtensionDirs, formatSkillsForPrompt, loadExtensions, loadSkillsFromDir, MikanAgentSession, MikanModels, parseCommandInput, } from "./harness/index.js";
6
+ import { runSubagent } from "./harness/subagent-runner.js";
2
7
  import { createHash } from "crypto";
3
8
  import { existsSync, readFileSync } from "fs";
4
- import { mkdir, readFile, writeFile } from "fs/promises";
9
+ import { mkdir, readFile } from "fs/promises";
5
10
  import { join, posix } from "path";
6
11
  import { resolveConversationSettings } from "./config.js";
7
- import { readEnv } from "./utils/env.js";
12
+ import { effectiveStateDir } from "./cli/arg-grammar.js";
8
13
  import { ActorExecutionResolver } from "./execution-resolver.js";
9
14
  import * as log from "./log.js";
10
- import { reportUserFacingError } from "./observability/sentry.js";
11
- import { createExecutor, } from "./sandbox/index.js";
12
- import { createMountedRuntimePathContext } from "./sandbox/path-context.js";
13
- import { addLifecycleBreadcrumb, metricAttributes, updateActiveSpanAttribution, } from "./observability/sentry.js";
14
- import { AgentMemoryFileManager } from "./sessions/agent-memory-file-manager.js";
15
+ import { createExecutor, getUnresolvedSandboxPathContext, } from "./sandbox/index.js";
16
+ import { addLifecycleBreadcrumb, metricAttributes, reportUserFacingError, updateActiveSpanAttribution, } from "./observability/sentry.js";
17
+ import { ChatHistorySync } from "./sessions/chat-history-sync.js";
18
+ import { formatHistoryLine } from "./sessions/history-line.js";
19
+ import { conversationIdOf, isThreadSessionKey } from "./sessions/session-key.js";
15
20
  import { extractSessionUuid, openManagedSession, } from "./sessions/store.js";
16
21
  import { HostEventStore } from "./tools/event.js";
17
- import { createMikanTools } from "./tools/index.js";
22
+ import { createMikanTools, createSubagentTool, DEFAULT_GLOBAL_SUBAGENT_SLOTS, SubagentSlotPool, } from "./tools/index.js";
23
+ // One process-wide fan-out account: per-conversation queues serialize runs,
24
+ // but each run can fan out up to the per-run cap — without this shared
25
+ // ceiling, N busy conversations hold N × cap live subagent sessions.
26
+ const globalSubagentSlots = new SubagentSlotPool(DEFAULT_GLOBAL_SUBAGENT_SLOTS);
18
27
  import * as Sentry from "@sentry/node";
19
- import { formatLocalTimestamp } from "./utils/date.js";
20
- import { resolveConfiguredModel } from "./model-registry.js";
21
28
  import { emitAgentEvent } from "./agent-events.js";
29
+ export function translateRuntimePathToHost(runtimePath, pathContext) {
30
+ return pathContext.runtimeToHostPath?.(runtimePath) ?? runtimePath;
31
+ }
32
+ export function translateAttachPathToHost(filePath, pathContext) {
33
+ const runtimePath = posix.isAbsolute(filePath)
34
+ ? filePath
35
+ : posix.join(pathContext.runtimeWorkspaceRoot, filePath);
36
+ return translateRuntimePathToHost(runtimePath, pathContext);
37
+ }
22
38
  const IMAGE_MIME_TYPES = {
23
39
  jpg: "image/jpeg",
24
40
  jpeg: "image/jpeg",
@@ -29,12 +45,46 @@ const IMAGE_MIME_TYPES = {
29
45
  function getImageMimeType(filename) {
30
46
  return IMAGE_MIME_TYPES[filename.toLowerCase().split(".").pop() || ""];
31
47
  }
32
- function buildThreadSessionName(message) {
33
- const text = message?.text?.trim();
34
- if (!text)
35
- return undefined;
36
- const userLabel = message?.userName || message?.user || "unknown";
37
- return `[${userLabel}]: ${text}`;
48
+ function formatTimestampedUserMessage(message) {
49
+ return formatHistoryLine({
50
+ date: new Date(),
51
+ userName: message.userName,
52
+ threadTs: message.threadTs,
53
+ text: message.text,
54
+ });
55
+ }
56
+ function collectMessageAttachments(message, workspacePath, pathContext) {
57
+ const imageAttachments = [];
58
+ const nonImagePaths = [];
59
+ for (const attachment of message.attachments || []) {
60
+ const runtimePath = `${workspacePath}/${attachment.localPath}`;
61
+ const hostPath = pathContext?.runtimeToHostPath?.(runtimePath) ?? runtimePath;
62
+ const mimeType = getImageMimeType(attachment.localPath);
63
+ if (mimeType && existsSync(hostPath)) {
64
+ try {
65
+ imageAttachments.push({
66
+ type: "image",
67
+ mimeType,
68
+ data: readFileSync(hostPath).toString("base64"),
69
+ });
70
+ }
71
+ catch {
72
+ nonImagePaths.push(runtimePath);
73
+ }
74
+ }
75
+ else {
76
+ nonImagePaths.push(runtimePath);
77
+ }
78
+ }
79
+ return { imageAttachments, nonImagePaths };
80
+ }
81
+ export function buildPromptPayload(message, workspacePath, pathContext) {
82
+ let userMessage = formatTimestampedUserMessage(message);
83
+ const { imageAttachments, nonImagePaths } = collectMessageAttachments(message, workspacePath, pathContext);
84
+ if (nonImagePaths.length > 0) {
85
+ userMessage += `\n\n<slack_attachments>\n${nonImagePaths.join("\n")}\n</slack_attachments>`;
86
+ }
87
+ return { userMessage, imageAttachments };
38
88
  }
39
89
  async function getMemory(conversationDir) {
40
90
  const parts = [];
@@ -329,81 +379,21 @@ Do not add this to \`[SILENT]\` responses.`);
329
379
  }
330
380
  return parts.join("\n\n");
331
381
  }
332
- export function getUnresolvedSandboxPathContext(sandboxConfig, hostWorkspaceRoot) {
333
- if (sandboxConfig.type === "image") {
334
- return createMountedRuntimePathContext(hostWorkspaceRoot, "/workspace");
335
- }
336
- return createExecutor(sandboxConfig).getPathContext(hostWorkspaceRoot);
337
- }
338
- function createRunnerExecutionContext(sandboxConfig, vaultManager, provisioner, workspaceDir, hostWorkspacePath) {
339
- const executionResolver = vaultManager && sandboxConfig.type !== "host"
340
- ? new ActorExecutionResolver(sandboxConfig, vaultManager, provisioner, workspaceDir)
341
- : undefined;
342
- // activeExecutor is replaced at the start of each run() call when executionResolver
343
- // is present, so the stable `executor` wrapper always delegates to the latest resolved value.
344
- let activeExecutor = executionResolver !== undefined
345
- ? createExecutor({ type: "host" })
346
- : createExecutor(sandboxConfig);
347
- const executor = {
348
- exec(command, options) {
349
- return activeExecutor.exec(command, options);
350
- },
351
- getWorkspacePath(hostPath) {
352
- return activeExecutor.getWorkspacePath(hostPath);
353
- },
354
- getSandboxConfig() {
355
- return activeExecutor.getSandboxConfig();
356
- },
357
- getPathContext(hostWorkspaceRoot) {
358
- return activeExecutor.getPathContext(hostWorkspaceRoot);
359
- },
360
- };
361
- return {
362
- executionResolver,
363
- executor,
364
- getPathContext: () => executor.getPathContext(hostWorkspacePath),
365
- async resolveExecutorForRun(context) {
366
- if (!executionResolver)
367
- return;
368
- activeExecutor = await executionResolver.resolve(context);
369
- },
370
- };
371
- }
372
- /**
373
- * Extension host services over mikan's runtime infrastructure: schedules
374
- * become event files under `<workspaceDir>/events` (picked up live by
375
- * EventsWatcher), secrets come from `vaults/extensions/<slug>/env`, and
376
- * notify posts through the platform bots when main.ts provides a notifier.
377
- */
378
- function buildExtensionHostServices(params) {
379
- const { workspaceDir, vaultManager, platformNotifier } = params;
380
- const eventStore = HostEventStore.fromWorkspaceDir(workspaceDir);
381
- return {
382
- stateDir: readEnv("STATE_DIR"),
383
- scheduleStore: {
384
- write: async (filename, payload) => {
385
- // Event files tolerate a missing platform (single-platform default),
386
- // so the harness payload is a valid event payload as written.
387
- await eventStore.write(filename, payload);
388
- },
389
- delete: async (filename) => (await eventStore.delete(filename)).deleted,
390
- list: async () => (await eventStore.list()).map((entry) => ({
391
- filename: entry.filename,
392
- payload: entry.payload,
393
- })),
394
- },
395
- ...(platformNotifier ? { postMessage: platformNotifier } : {}),
396
- ...(vaultManager
397
- ? {
398
- resolveSecrets: (slug) => vaultManager.resolve(`extensions/${slug}`)?.env ?? {},
399
- }
400
- : {}),
401
- };
382
+ export function appendTriggerAttribution(text, triggerAttribution, sessionLink) {
383
+ if (!triggerAttribution)
384
+ return text;
385
+ const trimmed = text.trimEnd();
386
+ const legacySuffix = `_Triggered by ${triggerAttribution}_`;
387
+ // Slack mrkdwn italics cannot span a URL — a `_..._` wrapping a link renders
388
+ // the underscores literally. Keep the session link outside the italic span.
389
+ const suffix = sessionLink ? `${legacySuffix} · session: ${sessionLink}` : legacySuffix;
390
+ if (trimmed.endsWith(suffix))
391
+ return text;
392
+ const body = trimmed.endsWith(legacySuffix)
393
+ ? trimmed.slice(0, -legacySuffix.length).trimEnd()
394
+ : trimmed;
395
+ return `${body}\n\n${suffix}`;
402
396
  }
403
- /**
404
- * Local (workspace/conversation) skills override extension skills on name
405
- * collision: an admin's on-disk skill always beats an extension's.
406
- */
407
397
  function mergeExtensionSkills(local, extension) {
408
398
  if (extension.length === 0)
409
399
  return local;
@@ -414,37 +404,6 @@ function mergeExtensionSkills(local, extension) {
414
404
  byName.set(skill.name, skill);
415
405
  return [...byName.values()];
416
406
  }
417
- async function createConfiguredAgentSession(params) {
418
- const { conversationId, workspaceDir, systemPrompt, model, thinkingLevel, tools, sessionStore, models, vaultManager, platformNotifier, } = params;
419
- // Host-only dirs under the state dir: extension code runs in the mikan
420
- // process, so it must never load from workspace paths — those are mounted
421
- // into sandbox containers and agent-writable (sandbox escape otherwise).
422
- const extensionsResult = await loadExtensions({
423
- dirs: defaultExtensionDirs(conversationId, readEnv("STATE_DIR")),
424
- context: { conversationId, workspaceDir, model, thinkingLevel },
425
- services: buildExtensionHostServices({ workspaceDir, vaultManager, platformNotifier }),
426
- });
427
- for (const err of extensionsResult.errors) {
428
- log.logWarning(`[${conversationId}] Extension load error: ${err.path}`, err.error);
429
- }
430
- if (extensionsResult.extensions.length > 0) {
431
- log.logInfo(`[${conversationId}] Loaded ${extensionsResult.extensions.length} extension(s): ${extensionsResult.extensions.map((extension) => extension.name).join(", ")}`);
432
- }
433
- const session = new MikanAgentSession({
434
- systemPrompt,
435
- model,
436
- thinkingLevel,
437
- tools,
438
- models,
439
- sessionStore,
440
- extensions: extensionsResult.registry,
441
- });
442
- const reloaded = session.reloadFromSession();
443
- if (reloaded > 0) {
444
- log.logInfo(`[${conversationId}] Reloaded ${reloaded} messages from session context`);
445
- }
446
- return { session, extensionSkills: extensionsResult.skills };
447
- }
448
407
  function createEmptyUsageTotals() {
449
408
  return {
450
409
  input: 0,
@@ -461,6 +420,7 @@ function createRunState() {
461
420
  queue: null,
462
421
  pendingTools: new Map(),
463
422
  toolProgress: new Map(),
423
+ toolProgressTimer: undefined,
464
424
  totalUsage: createEmptyUsageTotals(),
465
425
  llmCallCount: 0,
466
426
  stopReason: "stop",
@@ -480,6 +440,9 @@ function resetRunState(runState, responder, sessionConversation, userName, sessi
480
440
  };
481
441
  runState.pendingTools.clear();
482
442
  runState.toolProgress.clear();
443
+ if (runState.toolProgressTimer)
444
+ clearTimeout(runState.toolProgressTimer);
445
+ runState.toolProgressTimer = undefined;
483
446
  runState.totalUsage = createEmptyUsageTotals();
484
447
  runState.llmCallCount = 0;
485
448
  runState.stopReason = "stop";
@@ -515,53 +478,6 @@ function createRunQueue(responder, runState) {
515
478
  wait: () => queueChain,
516
479
  };
517
480
  }
518
- function formatTimestampedUserMessage(message) {
519
- const timestamp = formatLocalTimestamp(new Date());
520
- const threadContext = message.threadTs ? ` [in-thread:${message.threadTs}]` : "";
521
- return `[${timestamp}] [${message.userName || "unknown"}]${threadContext}: ${message.text}`;
522
- }
523
- function collectMessageAttachments(message, workspacePath, pathContext) {
524
- const imageAttachments = [];
525
- const nonImagePaths = [];
526
- for (const attachment of message.attachments || []) {
527
- const runtimePath = `${workspacePath}/${attachment.localPath}`;
528
- const hostPath = pathContext?.runtimeToHostPath?.(runtimePath) ?? runtimePath;
529
- const mimeType = getImageMimeType(attachment.localPath);
530
- if (mimeType && existsSync(hostPath)) {
531
- try {
532
- imageAttachments.push({
533
- type: "image",
534
- mimeType,
535
- data: readFileSync(hostPath).toString("base64"),
536
- });
537
- }
538
- catch {
539
- nonImagePaths.push(runtimePath);
540
- }
541
- }
542
- else {
543
- nonImagePaths.push(runtimePath);
544
- }
545
- }
546
- return { imageAttachments, nonImagePaths };
547
- }
548
- export function buildPromptPayload(message, workspacePath, pathContext) {
549
- let userMessage = formatTimestampedUserMessage(message);
550
- const { imageAttachments, nonImagePaths } = collectMessageAttachments(message, workspacePath, pathContext);
551
- if (nonImagePaths.length > 0) {
552
- userMessage += `\n\n<slack_attachments>\n${nonImagePaths.join("\n")}\n</slack_attachments>`;
553
- }
554
- return { userMessage, imageAttachments };
555
- }
556
- async function writePromptDebugContext(conversationDir, systemPrompt, session, userMessage, imageAttachmentCount) {
557
- const debugContext = {
558
- systemPrompt,
559
- messages: session.messages,
560
- newUserMessage: userMessage,
561
- imageAttachmentCount,
562
- };
563
- await writeFile(join(conversationDir, "last_prompt.jsonl"), JSON.stringify(debugContext, null, 2));
564
- }
565
481
  function getFinalAssistantText(session) {
566
482
  const lastAssistant = session.messages.findLast((message) => message.role === "assistant");
567
483
  return (lastAssistant?.content
@@ -569,21 +485,6 @@ function getFinalAssistantText(session) {
569
485
  .map((content) => content.text)
570
486
  .join("\n") || "");
571
487
  }
572
- export function appendTriggerAttribution(text, triggerAttribution, sessionLink) {
573
- if (!triggerAttribution)
574
- return text;
575
- const trimmed = text.trimEnd();
576
- const legacySuffix = `_Triggered by ${triggerAttribution}_`;
577
- const suffix = sessionLink
578
- ? `_Triggered by ${triggerAttribution} · session: ${sessionLink}_`
579
- : legacySuffix;
580
- if (trimmed.endsWith(suffix))
581
- return text;
582
- const body = trimmed.endsWith(legacySuffix)
583
- ? trimmed.slice(0, -legacySuffix.length).trimEnd()
584
- : trimmed;
585
- return `${body}\n\n${suffix}`;
586
- }
587
488
  function isEventTriggerAttribution(triggerAttribution) {
588
489
  return triggerAttribution?.startsWith("[event:") === true;
589
490
  }
@@ -609,6 +510,31 @@ async function replaceResponseWithToolProgress(responder, runState) {
609
510
  if (progress)
610
511
  await responder.replaceResponse(progress);
611
512
  }
513
+ const TOOL_PROGRESS_DEBOUNCE_MS = 500;
514
+ function scheduleToolProgressUpdate(responder, runState) {
515
+ if (runState.toolProgressTimer)
516
+ return;
517
+ runState.toolProgressTimer = setTimeout(() => {
518
+ runState.toolProgressTimer = undefined;
519
+ runState.queue?.enqueue(() => replaceResponseWithToolProgress(responder, runState), "tool progress update");
520
+ }, TOOL_PROGRESS_DEBOUNCE_MS);
521
+ runState.toolProgressTimer.unref();
522
+ }
523
+ function flushToolProgressUpdate(responder, runState) {
524
+ if (runState.toolProgressTimer)
525
+ clearTimeout(runState.toolProgressTimer);
526
+ runState.toolProgressTimer = undefined;
527
+ runState.queue?.enqueue(() => replaceResponseWithToolProgress(responder, runState), "tool progress update");
528
+ }
529
+ function extractToolProgressLabel(partialResult) {
530
+ if (!partialResult || typeof partialResult !== "object")
531
+ return undefined;
532
+ const details = partialResult.details;
533
+ if (!details || typeof details !== "object")
534
+ return undefined;
535
+ const label = details.progressLabel;
536
+ return typeof label === "string" && label.trim() ? label.trim().slice(0, 1000) : undefined;
537
+ }
612
538
  async function finalizeRunResponse(responder, session, runState, options) {
613
539
  if (runState.stopReason === "error" && runState.errorMessage) {
614
540
  if (!runState.reportedLlmError) {
@@ -739,6 +665,169 @@ async function reportUsageSummary(ctx) {
739
665
  await waitForQueue();
740
666
  }
741
667
  }
668
+ function extractToolResultText(result) {
669
+ if (typeof result === "string") {
670
+ return result;
671
+ }
672
+ if (result &&
673
+ typeof result === "object" &&
674
+ "content" in result &&
675
+ Array.isArray(result.content)) {
676
+ const content = result.content;
677
+ const textParts = [];
678
+ for (const part of content) {
679
+ if (part.type === "text" && part.text) {
680
+ textParts.push(part.text);
681
+ }
682
+ }
683
+ if (textParts.length > 0) {
684
+ return textParts.join("\n");
685
+ }
686
+ }
687
+ return JSON.stringify(result);
688
+ }
689
+ function buildThreadSessionName(message) {
690
+ const text = message?.text?.trim();
691
+ if (!text)
692
+ return undefined;
693
+ const userLabel = message?.userName || message?.user || "unknown";
694
+ return `[${userLabel}]: ${text}`;
695
+ }
696
+ function createRunnerExecutionContext(sandboxConfig, vaultManager, provisioner, workspaceDir, hostWorkspacePath) {
697
+ const executionResolver = vaultManager && sandboxConfig.type !== "host"
698
+ ? new ActorExecutionResolver(sandboxConfig, vaultManager, provisioner, workspaceDir, hostWorkspacePath)
699
+ : undefined;
700
+ // activeExecutor is replaced at the start of each run() call when executionResolver
701
+ // is present, so the stable `executor` wrapper always delegates to the latest resolved value.
702
+ let activeExecutor = executionResolver !== undefined
703
+ ? createExecutor({ type: "host" })
704
+ : createExecutor(sandboxConfig);
705
+ const executor = {
706
+ exec(command, options) {
707
+ return activeExecutor.exec(command, options);
708
+ },
709
+ readFile(path, options) {
710
+ return activeExecutor.readFile(path, options);
711
+ },
712
+ readFileBase64(path, options) {
713
+ return activeExecutor.readFileBase64(path, options);
714
+ },
715
+ writeFile(path, content, options) {
716
+ return activeExecutor.writeFile(path, content, options);
717
+ },
718
+ getWorkspacePath(hostPath) {
719
+ return activeExecutor.getWorkspacePath(hostPath);
720
+ },
721
+ getSandboxConfig() {
722
+ return activeExecutor.getSandboxConfig();
723
+ },
724
+ getPathContext(hostWorkspaceRoot) {
725
+ return activeExecutor.getPathContext(hostWorkspaceRoot);
726
+ },
727
+ };
728
+ return {
729
+ executionResolver,
730
+ executor,
731
+ getPathContext: () => executor.getPathContext(hostWorkspacePath),
732
+ async resolveExecutorForRun(context) {
733
+ if (!executionResolver)
734
+ return;
735
+ activeExecutor = await executionResolver.resolve(context);
736
+ },
737
+ };
738
+ }
739
+ /**
740
+ * Extension host services over mikan's runtime infrastructure: schedules
741
+ * become event files under `<workspaceDir>/events` (picked up live by
742
+ * EventsWatcher), secrets come from `vaults/extensions/<slug>/env`, and
743
+ * notify posts through the platform bots when main.ts provides a notifier.
744
+ */
745
+ function buildExtensionHostServices(params) {
746
+ const { workspaceDir, vaultManager, platformNotifier, platformReactor, platformUploader, runSubagentService, } = params;
747
+ const eventStore = HostEventStore.fromWorkspaceDir(workspaceDir);
748
+ return {
749
+ stateDir: effectiveStateDir(),
750
+ scheduleStore: {
751
+ write: async (filename, payload) => {
752
+ await eventStore.write(filename, payload);
753
+ },
754
+ delete: async (filename) => (await eventStore.delete(filename)).deleted,
755
+ list: async () => (await eventStore.list()).flatMap((entry) => entry.payload ? [{ filename: entry.filename, payload: entry.payload }] : []),
756
+ },
757
+ ...(platformNotifier ? { postMessage: platformNotifier } : {}),
758
+ ...(platformReactor ? { addReaction: platformReactor } : {}),
759
+ ...(platformUploader ? { uploadFile: platformUploader } : {}),
760
+ ...(runSubagentService ? { runSubagent: runSubagentService } : {}),
761
+ ...(vaultManager
762
+ ? {
763
+ resolveSecrets: (slug) => vaultManager.resolve(`extensions/${slug}`)?.env ?? {},
764
+ }
765
+ : {}),
766
+ };
767
+ }
768
+ async function createConfiguredAgentSession(params) {
769
+ const { conversationId, workspaceDir, systemPrompt, model, thinkingLevel, tools, sessionStore, models, vaultManager, platformNotifier, platformReactor, platformUploader, } = params;
770
+ // Host-only dirs under the state dir: extension code runs in the mikan
771
+ // process, so it must never load from workspace paths — those are mounted
772
+ // into sandbox containers and agent-writable (sandbox escape otherwise).
773
+ const extensionsResult = await loadExtensions({
774
+ dirs: defaultExtensionDirs(conversationId, effectiveStateDir()),
775
+ context: { conversationId, workspaceDir, model, thinkingLevel },
776
+ services: buildExtensionHostServices({
777
+ workspaceDir,
778
+ vaultManager,
779
+ platformNotifier,
780
+ platformReactor,
781
+ platformUploader,
782
+ runSubagentService: (request, extensionTools) => runSubagent({
783
+ request,
784
+ defaultModel: model,
785
+ thinkingLevel,
786
+ models,
787
+ workspaceDir,
788
+ availableTools: [...tools, ...extensionTools],
789
+ }),
790
+ }),
791
+ });
792
+ const contributedTools = extensionsResult.registry.getContributedTools();
793
+ for (const err of extensionsResult.errors) {
794
+ log.logWarning(`[${conversationId}] Extension load error: ${err.path}`, err.error);
795
+ }
796
+ if (extensionsResult.extensions.length > 0) {
797
+ log.logInfo(`[${conversationId}] Loaded ${extensionsResult.extensions.length} extension(s): ${extensionsResult.extensions.map((extension) => extension.name).join(", ")}`);
798
+ }
799
+ const subagentTool = createSubagentTool((request) => runSubagent({
800
+ request,
801
+ defaultModel: model,
802
+ thinkingLevel,
803
+ models,
804
+ workspaceDir,
805
+ availableTools: [...tools, ...contributedTools],
806
+ // `session` is the const below: the tool only executes inside that
807
+ // session's own prompt loop, and the temporal dead zone turns any
808
+ // earlier call into a loud error instead of a silently dropped fold.
809
+ onUsage: (usage) => session.foldExternalUsage(usage),
810
+ }), globalSubagentSlots);
811
+ const session = new MikanAgentSession({
812
+ systemPrompt,
813
+ model,
814
+ thinkingLevel,
815
+ tools: [...tools, subagentTool],
816
+ models,
817
+ sessionStore,
818
+ extensions: extensionsResult.registry,
819
+ });
820
+ const reloaded = session.reloadFromSession();
821
+ if (reloaded > 0) {
822
+ log.logInfo(`[${conversationId}] Reloaded ${reloaded} messages from session context`);
823
+ }
824
+ return {
825
+ session,
826
+ extensionSkills: extensionsResult.skills,
827
+ extensionRegistry: extensionsResult.registry,
828
+ disposeExtensions: extensionsResult.dispose,
829
+ };
830
+ }
742
831
  function reloadSessionMessages(session, conversationId) {
743
832
  const reloaded = session.reloadFromSession();
744
833
  if (reloaded > 0) {
@@ -746,15 +835,16 @@ function reloadSessionMessages(session, conversationId) {
746
835
  }
747
836
  }
748
837
  async function prepareRunContext(params) {
749
- const { message, responder, platform, conversationId, conversationDir, sessionUuid, runState, executor, executionResolver, resolveExecutorForRun, getPathContext, session, setEventContext, setSandboxContext, setUploadFunction, } = params;
838
+ const { message, responder, platform, conversationId, conversationDir, sessionUuid, runState, executor, executionResolver, resolveExecutorForRun, getPathContext, session, setEventContext, setSandboxContext, setUploadFunction, setReactFunction, bindPlatformToolPacks, } = params;
750
839
  let pathContext = params.pathContext;
751
- const sessionConversation = message.sessionKey.split(":")[0];
840
+ const sessionConversation = conversationIdOf(message.sessionKey);
752
841
  await mkdir(join(conversationDir, "scratch"), { recursive: true });
753
842
  if (executionResolver) {
754
843
  await resolveExecutorForRun({
755
844
  platform: platform.name,
756
845
  userId: message.userId,
757
846
  conversationId,
847
+ trustModel: platform.trustModel,
758
848
  });
759
849
  pathContext = getPathContext();
760
850
  }
@@ -768,9 +858,11 @@ async function prepareRunContext(params) {
768
858
  // provider prompt caching. If this hash changes between turns of one
769
859
  // conversation, something turn-varying leaked into the prompt; if it is
770
860
  // stable and cacheRead stays 0, the miss is provider-side (e.g. OpenRouter
771
- // routing the model across upstream hosts).
861
+ // routing the model across upstream hosts). This is the base prompt mikan
862
+ // builds; a `before_agent_start` extension may still rewrite it per turn
863
+ // (logged separately by the runner).
772
864
  const promptHash = createHash("sha256").update(systemPrompt).digest("hex").slice(0, 8);
773
- log.logInfo(`[${conversationId}] System prompt: ${systemPrompt.length} chars, sha ${promptHash}`);
865
+ log.logInfo(`[${conversationId}] System prompt (base): ${systemPrompt.length} chars, sha ${promptHash}`);
774
866
  setEventContext({
775
867
  platform: platform.name,
776
868
  conversationId,
@@ -782,6 +874,13 @@ async function prepareRunContext(params) {
782
874
  const hostPath = translateAttachPathToHost(filePath, pathContext);
783
875
  await responder.uploadFile(hostPath, title);
784
876
  });
877
+ // The react tool is available only when the responder supports reactions
878
+ // (interactive turns on platforms with reaction support); otherwise unset
879
+ // so the tool reports it is unavailable rather than silently no-op'ing.
880
+ setReactFunction(responder.react ? async (emoji) => responder.react(emoji) : null);
881
+ // Platform capability packs (e.g. GitHub PR/CI) enable themselves per run;
882
+ // core does not branch on platform name here.
883
+ bindPlatformToolPacks({ conversationId, platformName: platform.name });
785
884
  resetRunState(runState, responder, sessionConversation, message.userName, sessionUuid, triggerAttribution);
786
885
  const runQueue = createRunQueue(responder, runState);
787
886
  runState.queue = runQueue.queue;
@@ -790,7 +889,6 @@ async function prepareRunContext(params) {
790
889
  const { userMessage, imageAttachments } = buildPromptPayload(message, pathContext.runtimeWorkspaceRoot, pathContext);
791
890
  const turnInstructions = buildTurnInstructions(message.id.startsWith("event:"), triggerAttribution, platform.name);
792
891
  const finalUserMessage = turnInstructions ? `${turnInstructions}\n\n${userMessage}` : userMessage;
793
- await writePromptDebugContext(conversationDir, systemPrompt, session, finalUserMessage, imageAttachments.length);
794
892
  return {
795
893
  sessionConversation,
796
894
  runQueue,
@@ -845,6 +943,15 @@ function attachSessionEventHandlers(params) {
845
943
  log.logToolStart(logCtx, event.toolName, label, event.args);
846
944
  return;
847
945
  }
946
+ if (event.type === "tool_execution_update") {
947
+ const label = extractToolProgressLabel(event.partialResult);
948
+ const progress = runState.toolProgress.get(event.toolCallId);
949
+ if (label && progress) {
950
+ progress.label = label;
951
+ scheduleToolProgressUpdate(responder, runState);
952
+ }
953
+ return;
954
+ }
848
955
  if (event.type === "tool_execution_end") {
849
956
  const resultStr = extractToolResultText(event.result);
850
957
  const pending = pendingTools.get(event.toolCallId);
@@ -856,7 +963,7 @@ function attachSessionEventHandlers(params) {
856
963
  const progress = runState.toolProgress.get(event.toolCallId);
857
964
  if (progress)
858
965
  progress.status = event.isError ? "error" : "done";
859
- queue.enqueue(() => replaceResponseWithToolProgress(responder, runState), "tool progress update");
966
+ flushToolProgressUpdate(responder, runState);
860
967
  pendingTools.delete(event.toolCallId);
861
968
  const durationMs = pending ? Date.now() - pending.startTime : 0;
862
969
  Sentry.metrics.count("agent.tool.calls", 1, {
@@ -1069,27 +1176,6 @@ function attachSessionEventHandlers(params) {
1069
1176
  }
1070
1177
  });
1071
1178
  }
1072
- function extractToolResultText(result) {
1073
- if (typeof result === "string") {
1074
- return result;
1075
- }
1076
- if (result &&
1077
- typeof result === "object" &&
1078
- "content" in result &&
1079
- Array.isArray(result.content)) {
1080
- const content = result.content;
1081
- const textParts = [];
1082
- for (const part of content) {
1083
- if (part.type === "text" && part.text) {
1084
- textParts.push(part.text);
1085
- }
1086
- }
1087
- if (textParts.length > 0) {
1088
- return textParts.join("\n");
1089
- }
1090
- }
1091
- return JSON.stringify(result);
1092
- }
1093
1179
  /**
1094
1180
  * Create a new PiAgentWrapper for a channel.
1095
1181
  * Sets up the session and subscribes to events once.
@@ -1097,18 +1183,22 @@ function extractToolResultText(result) {
1097
1183
  * Runner caching is handled by the caller (channelStates in main.ts).
1098
1184
  * This is a stateless factory function.
1099
1185
  */
1100
- export async function createRunner(sandboxConfig, sessionKey, conversationId, conversationDir, workspaceDir, sessionScope, vaultManager, provisioner, sessionView, platformNotifier) {
1186
+ export async function createRunner(options) {
1187
+ const { sandboxConfig, sessionKey, conversationId, conversationDir, workspaceDir, sessionScope, vaultManager, provisioner, resourceController, sessionView, platformNotifier, platformReactor, platformUploader, platformToolPackFactories, } = options;
1101
1188
  const agentConfig = resolveConversationSettings(conversationDir);
1102
1189
  const workspaceBase = join(conversationDir, "..");
1103
1190
  const { executionResolver, executor, getPathContext, resolveExecutorForRun } = createRunnerExecutionContext(sandboxConfig, vaultManager, provisioner, workspaceDir, workspaceBase);
1104
1191
  let pathContext = getUnresolvedSandboxPathContext(sandboxConfig, workspaceBase);
1105
- // Create tools (per-runner, with per-runner upload function setter)
1106
- const { tools, setUploadFunction, setEventContext, setSandboxContext } = createMikanTools(executor, workspaceDir, { sandbox: sandboxConfig, provisioner });
1107
- const modelRegistry = MikanModels.create();
1192
+ const modelRegistry = options.models ?? MikanModels.create();
1108
1193
  if (modelRegistry.getError()) {
1109
1194
  log.logWarning("models.json load error", modelRegistry.getError());
1110
1195
  }
1111
- const model = resolveConfiguredModel(modelRegistry, agentConfig.provider, agentConfig.model);
1196
+ const model = modelRegistry.resolve(agentConfig.provider, agentConfig.model);
1197
+ // Create tools (per-runner, with per-runner upload function setter)
1198
+ const { tools, setUploadFunction, setReactFunction, bindPlatformToolPacks, setEventContext, setSandboxContext, } = createMikanTools(executor, workspaceDir, { sandbox: sandboxConfig, resourceController: resourceController ?? provisioner }, platformToolPackFactories ?? [], {
1199
+ model,
1200
+ getApiKey: () => modelRegistry.getApiKeyForProvider(model.provider),
1201
+ });
1112
1202
  // Initial system prompt (will be updated each run with fresh memory/channels/users/skills)
1113
1203
  const memory = await getMemory(conversationDir);
1114
1204
  const skills = loadMikanSkills(conversationDir, pathContext.runtimeWorkspaceRoot);
@@ -1117,12 +1207,13 @@ export async function createRunner(sandboxConfig, sessionKey, conversationId, co
1117
1207
  formattingGuide: "",
1118
1208
  channels: [],
1119
1209
  users: [],
1210
+ trustModel: "membership",
1120
1211
  };
1121
1212
  const systemPrompt = buildSystemPrompt(pathContext.runtimeWorkspaceRoot, conversationId, "shared", undefined, memory, sandboxConfig, emptyPlatform, skills);
1122
1213
  // Create session manager and settings manager. Top-level/private sessions
1123
1214
  // use the conversation's current pointer; scoped sessions use fixed files.
1124
1215
  // Platform-specific scope behavior is resolved before runner creation.
1125
- const isThread = sessionKey.includes(":");
1216
+ const isThread = isThreadSessionKey(sessionKey);
1126
1217
  const { contextFile, threadRootMessage } = sessionScope;
1127
1218
  const sessionManager = openManagedSession(contextFile, pathContext.runtimeWorkspaceRoot);
1128
1219
  const threadSessionName = buildThreadSessionName(threadRootMessage);
@@ -1130,8 +1221,8 @@ export async function createRunner(sandboxConfig, sessionKey, conversationId, co
1130
1221
  sessionManager.appendSessionInfo(threadSessionName);
1131
1222
  }
1132
1223
  const sessionUuid = extractSessionUuid(contextFile);
1133
- const chatSessionManager = new AgentMemoryFileManager();
1134
- const { session, extensionSkills } = await createConfiguredAgentSession({
1224
+ const chatSessionManager = new ChatHistorySync();
1225
+ const { session, extensionSkills, extensionRegistry, disposeExtensions } = await createConfiguredAgentSession({
1135
1226
  conversationId,
1136
1227
  workspaceDir,
1137
1228
  systemPrompt,
@@ -1142,6 +1233,8 @@ export async function createRunner(sandboxConfig, sessionKey, conversationId, co
1142
1233
  models: modelRegistry,
1143
1234
  vaultManager,
1144
1235
  platformNotifier,
1236
+ platformReactor,
1237
+ platformUploader,
1145
1238
  });
1146
1239
  // Mutable per-run state - event handler references this
1147
1240
  const runState = createRunState();
@@ -1173,6 +1266,8 @@ export async function createRunner(sandboxConfig, sessionKey, conversationId, co
1173
1266
  setEventContext,
1174
1267
  setSandboxContext,
1175
1268
  setUploadFunction,
1269
+ setReactFunction,
1270
+ bindPlatformToolPacks,
1176
1271
  pathContext,
1177
1272
  });
1178
1273
  pathContext = prepared.pathContext;
@@ -1201,10 +1296,39 @@ export async function createRunner(sandboxConfig, sessionKey, conversationId, co
1201
1296
  // Autonomous (event/trigger) runs get an explicit resource ceiling since
1202
1297
  // no human is watching the loop; interactive turns stay human-gated.
1203
1298
  const isEventRun = message.id.startsWith("event:");
1204
- await session.prompt(prepared.userMessage, {
1299
+ // Event runs have no triggering platform message, so identity fields
1300
+ // stay unset and extensions must null-check them.
1301
+ const origin = isEventRun
1302
+ ? { kind: "event", platform: platform.name }
1303
+ : {
1304
+ kind: "interactive",
1305
+ platform: platform.name,
1306
+ messageTs: message.id,
1307
+ userId: message.userId,
1308
+ userName: message.userName,
1309
+ threadTs: message.threadTs,
1310
+ attachments: message.attachments,
1311
+ };
1312
+ const outcome = await session.prompt(prepared.userMessage, {
1313
+ origin,
1205
1314
  ...(prepared.imageAttachments.length > 0 ? { images: prepared.imageAttachments } : {}),
1206
1315
  ...(isEventRun ? { budget: DEFAULT_EVENT_BUDGET } : {}),
1207
1316
  });
1317
+ if (outcome?.blocked) {
1318
+ const text = outcome.reason
1319
+ ? `_Turn blocked by an extension: ${outcome.reason}_`
1320
+ : "_Turn blocked by an extension._";
1321
+ sendAgentEvent({
1322
+ sessionId: sessionUuid,
1323
+ actorName: formatAgentActorName(message.userName, prepared.sessionConversation),
1324
+ event: { kind: "diagnostic", text },
1325
+ });
1326
+ await responder.respondDiagnostic(text, { style: "muted" });
1327
+ runState.responder = null;
1328
+ runState.logCtx = null;
1329
+ runState.queue = null;
1330
+ return { stopReason: "blocked" };
1331
+ }
1208
1332
  // Wait for queued messages
1209
1333
  await prepared.runQueue.wait();
1210
1334
  const sessionViewTokenStore = sessionView?.tokenStore;
@@ -1250,6 +1374,21 @@ export async function createRunner(sandboxConfig, sessionKey, conversationId, co
1250
1374
  abort() {
1251
1375
  session.abort();
1252
1376
  },
1377
+ async tryExtensionCommand(message, responder) {
1378
+ const parsed = parseCommandInput(message.text);
1379
+ if (!parsed)
1380
+ return false;
1381
+ return extensionRegistry.dispatchCommand(parsed.name, {
1382
+ args: parsed.args,
1383
+ conversationId,
1384
+ userId: message.userId,
1385
+ userName: message.userName,
1386
+ respond: (text) => responder.respond(text),
1387
+ });
1388
+ },
1389
+ async dispose() {
1390
+ await disposeExtensions();
1391
+ },
1253
1392
  getCurrentStep() {
1254
1393
  const pending = runState.pendingTools;
1255
1394
  if (pending.size === 0)
@@ -1265,13 +1404,4 @@ export async function createRunner(sandboxConfig, sessionKey, conversationId, co
1265
1404
  },
1266
1405
  };
1267
1406
  }
1268
- export function translateRuntimePathToHost(runtimePath, pathContext) {
1269
- return pathContext.runtimeToHostPath?.(runtimePath) ?? runtimePath;
1270
- }
1271
- export function translateAttachPathToHost(filePath, pathContext) {
1272
- const runtimePath = posix.isAbsolute(filePath)
1273
- ? filePath
1274
- : posix.join(pathContext.runtimeWorkspaceRoot, filePath);
1275
- return translateRuntimePathToHost(runtimePath, pathContext);
1276
- }
1277
1407
  //# sourceMappingURL=agent.js.map