@geminixiang/mikan 1.0.0-beta.7 → 1.0.0-beta.71

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 (856) hide show
  1. package/CHANGELOG.md +1052 -0
  2. package/README.md +98 -38
  3. package/dist/adapters/commands/admin.d.ts.map +1 -0
  4. package/dist/{commands → adapters/commands}/admin.js +11 -8
  5. package/dist/adapters/commands/admin.js.map +1 -0
  6. package/dist/{commands → adapters/commands}/auto-reply.d.ts +0 -3
  7. package/dist/adapters/commands/auto-reply.d.ts.map +1 -0
  8. package/dist/adapters/commands/auto-reply.js +47 -0
  9. package/dist/adapters/commands/auto-reply.js.map +1 -0
  10. package/dist/adapters/commands/login.d.ts +6 -0
  11. package/dist/adapters/commands/login.d.ts.map +1 -0
  12. package/dist/adapters/commands/login.js +166 -0
  13. package/dist/adapters/commands/login.js.map +1 -0
  14. package/dist/adapters/commands/manifest.d.ts +37 -0
  15. package/dist/adapters/commands/manifest.d.ts.map +1 -0
  16. package/dist/adapters/commands/manifest.js +155 -0
  17. package/dist/adapters/commands/manifest.js.map +1 -0
  18. package/dist/adapters/commands/model.d.ts +15 -0
  19. package/dist/adapters/commands/model.d.ts.map +1 -0
  20. package/dist/adapters/commands/model.js +153 -0
  21. package/dist/adapters/commands/model.js.map +1 -0
  22. package/dist/adapters/commands/new.d.ts.map +1 -0
  23. package/dist/adapters/commands/new.js +41 -0
  24. package/dist/adapters/commands/new.js.map +1 -0
  25. package/dist/adapters/commands/registry.d.ts +5 -0
  26. package/dist/adapters/commands/registry.d.ts.map +1 -0
  27. package/dist/adapters/commands/registry.js +43 -0
  28. package/dist/adapters/commands/registry.js.map +1 -0
  29. package/dist/adapters/commands/sandbox.d.ts.map +1 -0
  30. package/dist/adapters/commands/sandbox.js +125 -0
  31. package/dist/adapters/commands/sandbox.js.map +1 -0
  32. package/dist/adapters/commands/session-view.d.ts.map +1 -0
  33. package/dist/{commands → adapters/commands}/session-view.js +23 -16
  34. package/dist/adapters/commands/session-view.js.map +1 -0
  35. package/dist/adapters/commands/types.d.ts +145 -0
  36. package/dist/adapters/commands/types.d.ts.map +1 -0
  37. package/dist/adapters/commands/types.js.map +1 -0
  38. package/dist/adapters/commands/utils.d.ts +14 -0
  39. package/dist/adapters/commands/utils.d.ts.map +1 -0
  40. package/dist/{commands → adapters/commands}/utils.js +18 -1
  41. package/dist/adapters/commands/utils.js.map +1 -0
  42. package/dist/adapters/discord/bot.d.ts +11 -8
  43. package/dist/adapters/discord/bot.d.ts.map +1 -1
  44. package/dist/adapters/discord/bot.js +223 -256
  45. package/dist/adapters/discord/bot.js.map +1 -1
  46. package/dist/adapters/discord/components.d.ts +28 -0
  47. package/dist/adapters/discord/components.d.ts.map +1 -0
  48. package/dist/adapters/discord/components.js +32 -0
  49. package/dist/adapters/discord/components.js.map +1 -0
  50. package/dist/adapters/discord/context.d.ts +2 -6
  51. package/dist/adapters/discord/context.d.ts.map +1 -1
  52. package/dist/adapters/discord/context.js +64 -218
  53. package/dist/adapters/discord/context.js.map +1 -1
  54. package/dist/adapters/discord/format.d.ts +3 -0
  55. package/dist/adapters/discord/format.d.ts.map +1 -0
  56. package/dist/adapters/discord/format.js +84 -0
  57. package/dist/adapters/discord/format.js.map +1 -0
  58. package/dist/adapters/discord/types.d.ts +8 -1
  59. package/dist/adapters/discord/types.d.ts.map +1 -1
  60. package/dist/adapters/discord/types.js.map +1 -1
  61. package/dist/adapters/github/bot.d.ts +102 -0
  62. package/dist/adapters/github/bot.d.ts.map +1 -0
  63. package/dist/adapters/github/bot.js +720 -0
  64. package/dist/adapters/github/bot.js.map +1 -0
  65. package/dist/adapters/github/client.d.ts +122 -0
  66. package/dist/adapters/github/client.d.ts.map +1 -0
  67. package/dist/adapters/github/client.js +301 -0
  68. package/dist/adapters/github/client.js.map +1 -0
  69. package/dist/adapters/github/context.d.ts +5 -0
  70. package/dist/adapters/github/context.d.ts.map +1 -0
  71. package/dist/adapters/github/context.js +101 -0
  72. package/dist/adapters/github/context.js.map +1 -0
  73. package/dist/adapters/github/github-ops.d.ts +78 -0
  74. package/dist/adapters/github/github-ops.d.ts.map +1 -0
  75. package/dist/adapters/github/github-ops.js +337 -0
  76. package/dist/adapters/github/github-ops.js.map +1 -0
  77. package/dist/adapters/github/ids.d.ts +34 -0
  78. package/dist/adapters/github/ids.d.ts.map +1 -0
  79. package/dist/adapters/github/ids.js +57 -0
  80. package/dist/adapters/github/ids.js.map +1 -0
  81. package/dist/adapters/github/repo.d.ts +33 -0
  82. package/dist/adapters/github/repo.d.ts.map +1 -0
  83. package/dist/adapters/github/repo.js +141 -0
  84. package/dist/adapters/github/repo.js.map +1 -0
  85. package/dist/adapters/github/tool-pack.d.ts +14 -0
  86. package/dist/adapters/github/tool-pack.d.ts.map +1 -0
  87. package/dist/adapters/github/tool-pack.js +55 -0
  88. package/dist/adapters/github/tool-pack.js.map +1 -0
  89. package/dist/adapters/github/tools/checks.d.ts +18 -0
  90. package/dist/adapters/github/tools/checks.d.ts.map +1 -0
  91. package/dist/adapters/github/tools/checks.js +86 -0
  92. package/dist/adapters/github/tools/checks.js.map +1 -0
  93. package/dist/adapters/github/tools/issue.d.ts +21 -0
  94. package/dist/adapters/github/tools/issue.d.ts.map +1 -0
  95. package/dist/adapters/github/tools/issue.js +48 -0
  96. package/dist/adapters/github/tools/issue.js.map +1 -0
  97. package/dist/adapters/github/tools/pr.d.ts +22 -0
  98. package/dist/adapters/github/tools/pr.d.ts.map +1 -0
  99. package/dist/adapters/github/tools/pr.js +48 -0
  100. package/dist/adapters/github/tools/pr.js.map +1 -0
  101. package/dist/adapters/github/tools/read.d.ts +21 -0
  102. package/dist/adapters/github/tools/read.d.ts.map +1 -0
  103. package/dist/adapters/github/tools/read.js +141 -0
  104. package/dist/adapters/github/tools/read.js.map +1 -0
  105. package/dist/adapters/github/tools/review-reply.d.ts +17 -0
  106. package/dist/adapters/github/tools/review-reply.d.ts.map +1 -0
  107. package/dist/adapters/github/tools/review-reply.js +38 -0
  108. package/dist/adapters/github/tools/review-reply.js.map +1 -0
  109. package/dist/adapters/github/tools/sync.d.ts +17 -0
  110. package/dist/adapters/github/tools/sync.d.ts.map +1 -0
  111. package/dist/adapters/github/tools/sync.js +34 -0
  112. package/dist/adapters/github/tools/sync.js.map +1 -0
  113. package/dist/adapters/github/types.d.ts +345 -0
  114. package/dist/adapters/github/types.d.ts.map +1 -0
  115. package/dist/adapters/github/types.js.map +1 -0
  116. package/dist/adapters/github/webhook.d.ts +20 -0
  117. package/dist/adapters/github/webhook.d.ts.map +1 -0
  118. package/dist/adapters/github/webhook.js +78 -0
  119. package/dist/adapters/github/webhook.js.map +1 -0
  120. package/dist/adapters/index.d.ts +12 -0
  121. package/dist/adapters/index.d.ts.map +1 -0
  122. package/dist/adapters/index.js +19 -0
  123. package/dist/adapters/index.js.map +1 -0
  124. package/dist/adapters/intake.d.ts +17 -6
  125. package/dist/adapters/intake.d.ts.map +1 -1
  126. package/dist/adapters/intake.js +96 -27
  127. package/dist/adapters/intake.js.map +1 -1
  128. package/dist/adapters/markdown-tables.d.ts +19 -0
  129. package/dist/adapters/markdown-tables.d.ts.map +1 -0
  130. package/dist/adapters/markdown-tables.js +152 -0
  131. package/dist/adapters/markdown-tables.js.map +1 -0
  132. package/dist/{platform-messages.d.ts → adapters/messages.d.ts} +3 -2
  133. package/dist/adapters/messages.d.ts.map +1 -0
  134. package/dist/{platform-messages.js → adapters/messages.js} +4 -1
  135. package/dist/adapters/messages.js.map +1 -0
  136. package/dist/adapters/progressive-renderer.d.ts +7 -0
  137. package/dist/adapters/progressive-renderer.d.ts.map +1 -0
  138. package/dist/adapters/progressive-renderer.js +443 -0
  139. package/dist/adapters/progressive-renderer.js.map +1 -0
  140. package/dist/adapters/shared.d.ts +37 -11
  141. package/dist/adapters/shared.d.ts.map +1 -1
  142. package/dist/adapters/shared.js +130 -24
  143. package/dist/adapters/shared.js.map +1 -1
  144. package/dist/adapters/slack/assistant.d.ts +73 -0
  145. package/dist/adapters/slack/assistant.d.ts.map +1 -0
  146. package/dist/adapters/slack/assistant.js +205 -0
  147. package/dist/adapters/slack/assistant.js.map +1 -0
  148. package/dist/adapters/slack/auto-reply-context.d.ts +21 -0
  149. package/dist/adapters/slack/auto-reply-context.d.ts.map +1 -0
  150. package/dist/adapters/slack/auto-reply-context.js +28 -0
  151. package/dist/adapters/slack/auto-reply-context.js.map +1 -0
  152. package/dist/adapters/slack/blocks.d.ts +14 -0
  153. package/dist/adapters/slack/blocks.d.ts.map +1 -1
  154. package/dist/adapters/slack/blocks.js +104 -148
  155. package/dist/adapters/slack/blocks.js.map +1 -1
  156. package/dist/adapters/slack/bot.d.ts +154 -21
  157. package/dist/adapters/slack/bot.d.ts.map +1 -1
  158. package/dist/adapters/slack/bot.js +1037 -484
  159. package/dist/adapters/slack/bot.js.map +1 -1
  160. package/dist/adapters/slack/context.d.ts +2 -6
  161. package/dist/adapters/slack/context.d.ts.map +1 -1
  162. package/dist/adapters/slack/context.js +11 -17
  163. package/dist/adapters/slack/context.js.map +1 -1
  164. package/dist/adapters/slack/jev-context.d.ts +30 -0
  165. package/dist/adapters/slack/jev-context.d.ts.map +1 -0
  166. package/dist/adapters/slack/jev-context.js +67 -0
  167. package/dist/adapters/slack/jev-context.js.map +1 -0
  168. package/dist/adapters/slack/markdown.d.ts +3 -0
  169. package/dist/adapters/slack/markdown.d.ts.map +1 -0
  170. package/dist/adapters/slack/markdown.js +48 -0
  171. package/dist/adapters/slack/markdown.js.map +1 -0
  172. package/dist/adapters/slack/persona.d.ts +15 -0
  173. package/dist/adapters/slack/persona.d.ts.map +1 -0
  174. package/dist/adapters/slack/persona.js +22 -0
  175. package/dist/adapters/slack/persona.js.map +1 -0
  176. package/dist/adapters/slack/response-lifecycle.d.ts +1 -1
  177. package/dist/adapters/slack/response-lifecycle.d.ts.map +1 -1
  178. package/dist/adapters/slack/response-lifecycle.js +261 -345
  179. package/dist/adapters/slack/response-lifecycle.js.map +1 -1
  180. package/dist/adapters/slack/session.d.ts.map +1 -1
  181. package/dist/adapters/slack/session.js +7 -11
  182. package/dist/adapters/slack/session.js.map +1 -1
  183. package/dist/adapters/slack/stream-limits.d.ts +35 -0
  184. package/dist/adapters/slack/stream-limits.d.ts.map +1 -0
  185. package/dist/adapters/slack/stream-limits.js +56 -0
  186. package/dist/adapters/slack/stream-limits.js.map +1 -0
  187. package/dist/adapters/slack/task-intent.d.ts +32 -0
  188. package/dist/adapters/slack/task-intent.d.ts.map +1 -0
  189. package/dist/adapters/slack/task-intent.js +72 -0
  190. package/dist/adapters/slack/task-intent.js.map +1 -0
  191. package/dist/adapters/slack/task-status.d.ts +7 -0
  192. package/dist/adapters/slack/task-status.d.ts.map +1 -0
  193. package/dist/adapters/slack/task-status.js +107 -0
  194. package/dist/adapters/slack/task-status.js.map +1 -0
  195. package/dist/adapters/slack/tool-pack.d.ts +11 -0
  196. package/dist/adapters/slack/tool-pack.d.ts.map +1 -0
  197. package/dist/adapters/slack/tool-pack.js +45 -0
  198. package/dist/adapters/slack/tool-pack.js.map +1 -0
  199. package/dist/adapters/slack/tools/blockkit.d.ts +14 -0
  200. package/dist/adapters/slack/tools/blockkit.d.ts.map +1 -0
  201. package/dist/adapters/slack/tools/blockkit.js +106 -0
  202. package/dist/adapters/slack/tools/blockkit.js.map +1 -0
  203. package/dist/adapters/slack/types.d.ts +73 -2
  204. package/dist/adapters/slack/types.d.ts.map +1 -1
  205. package/dist/adapters/slack/types.js.map +1 -1
  206. package/dist/adapters/slack/update-diagnostics.d.ts +14 -0
  207. package/dist/adapters/slack/update-diagnostics.d.ts.map +1 -0
  208. package/dist/adapters/slack/update-diagnostics.js +134 -0
  209. package/dist/adapters/slack/update-diagnostics.js.map +1 -0
  210. package/dist/adapters/telegram/bot.d.ts +10 -9
  211. package/dist/adapters/telegram/bot.d.ts.map +1 -1
  212. package/dist/adapters/telegram/bot.js +133 -202
  213. package/dist/adapters/telegram/bot.js.map +1 -1
  214. package/dist/adapters/telegram/context.d.ts +2 -6
  215. package/dist/adapters/telegram/context.d.ts.map +1 -1
  216. package/dist/adapters/telegram/context.js +53 -190
  217. package/dist/adapters/telegram/context.js.map +1 -1
  218. package/dist/adapters/telegram/types.d.ts +1 -1
  219. package/dist/adapters/telegram/types.d.ts.map +1 -1
  220. package/dist/adapters/telegram/types.js.map +1 -1
  221. package/dist/adapters/types.d.ts +144 -13
  222. package/dist/adapters/types.d.ts.map +1 -1
  223. package/dist/adapters/types.js.map +1 -1
  224. package/dist/adapters/web/admin/portal.d.ts +44 -0
  225. package/dist/adapters/web/admin/portal.d.ts.map +1 -0
  226. package/dist/adapters/web/admin/portal.js +3207 -0
  227. package/dist/adapters/web/admin/portal.js.map +1 -0
  228. package/dist/{web → adapters/web}/admin/provider-models.d.ts +1 -1
  229. package/dist/adapters/web/admin/provider-models.d.ts.map +1 -0
  230. package/dist/{web → adapters/web}/admin/provider-models.js +1 -1
  231. package/dist/adapters/web/admin/provider-models.js.map +1 -0
  232. package/dist/adapters/web/admin/types.d.ts +53 -0
  233. package/dist/adapters/web/admin/types.d.ts.map +1 -0
  234. package/dist/adapters/web/admin/types.js.map +1 -0
  235. package/dist/adapters/web/login/oauth.d.ts +5 -0
  236. package/dist/adapters/web/login/oauth.d.ts.map +1 -0
  237. package/dist/{web → adapters/web}/login/oauth.js +50 -85
  238. package/dist/adapters/web/login/oauth.js.map +1 -0
  239. package/dist/{web → adapters/web}/login/portal.d.ts +9 -3
  240. package/dist/adapters/web/login/portal.d.ts.map +1 -0
  241. package/dist/{web → adapters/web}/login/portal.js +161 -119
  242. package/dist/adapters/web/login/portal.js.map +1 -0
  243. package/dist/{web → adapters/web}/login/types.d.ts +1 -12
  244. package/dist/adapters/web/login/types.d.ts.map +1 -0
  245. package/dist/adapters/web/login/types.js.map +1 -0
  246. package/dist/adapters/web/portal-shell.d.ts +22 -0
  247. package/dist/adapters/web/portal-shell.d.ts.map +1 -0
  248. package/dist/{portal-shell.js → adapters/web/portal-shell.js} +78 -2
  249. package/dist/adapters/web/portal-shell.js.map +1 -0
  250. package/dist/{web → adapters/web}/server.d.ts +14 -8
  251. package/dist/adapters/web/server.d.ts.map +1 -0
  252. package/dist/{web → adapters/web}/server.js +14 -7
  253. package/dist/adapters/web/server.js.map +1 -0
  254. package/dist/adapters/web/session-view/portal.d.ts +20 -0
  255. package/dist/adapters/web/session-view/portal.d.ts.map +1 -0
  256. package/dist/{web → adapters/web}/session-view/portal.js +633 -162
  257. package/dist/adapters/web/session-view/portal.js.map +1 -0
  258. package/dist/{web → adapters/web}/session-view/types.d.ts +11 -6
  259. package/dist/adapters/web/session-view/types.d.ts.map +1 -0
  260. package/dist/adapters/web/session-view/types.js.map +1 -0
  261. package/dist/adapters/web/token-store.d.ts.map +1 -0
  262. package/dist/{web → adapters/web}/token-store.js +1 -1
  263. package/dist/adapters/web/token-store.js.map +1 -0
  264. package/dist/adapters/web/types.d.ts.map +1 -0
  265. package/dist/adapters/web/types.js.map +1 -0
  266. package/dist/cli/arg-grammar.d.ts +11 -0
  267. package/dist/cli/arg-grammar.d.ts.map +1 -0
  268. package/dist/cli/arg-grammar.js +50 -0
  269. package/dist/cli/arg-grammar.js.map +1 -0
  270. package/dist/cli/boot.d.ts +5 -0
  271. package/dist/cli/boot.d.ts.map +1 -0
  272. package/dist/cli/boot.js +90 -0
  273. package/dist/cli/boot.js.map +1 -0
  274. package/dist/cli/download.d.ts.map +1 -0
  275. package/dist/cli/download.js +88 -0
  276. package/dist/cli/download.js.map +1 -0
  277. package/dist/cli/office.d.ts +2 -0
  278. package/dist/cli/office.d.ts.map +1 -0
  279. package/dist/cli/office.js +181 -0
  280. package/dist/cli/office.js.map +1 -0
  281. package/dist/cli/onboard.d.ts +10 -0
  282. package/dist/cli/onboard.d.ts.map +1 -0
  283. package/dist/cli/onboard.js +225 -0
  284. package/dist/cli/onboard.js.map +1 -0
  285. package/dist/cli/process-lifecycle.d.ts +19 -0
  286. package/dist/cli/process-lifecycle.d.ts.map +1 -0
  287. package/dist/cli/process-lifecycle.js +67 -0
  288. package/dist/cli/process-lifecycle.js.map +1 -0
  289. package/dist/cli/sessions.d.ts +2 -0
  290. package/dist/cli/sessions.d.ts.map +1 -0
  291. package/dist/cli/sessions.js +88 -0
  292. package/dist/cli/sessions.js.map +1 -0
  293. package/dist/cli/types.d.ts +25 -0
  294. package/dist/cli/types.d.ts.map +1 -0
  295. package/dist/cli/types.js.map +1 -0
  296. package/dist/dream/index.d.ts +20 -0
  297. package/dist/dream/index.d.ts.map +1 -0
  298. package/dist/dream/index.js +264 -0
  299. package/dist/dream/index.js.map +1 -0
  300. package/dist/dream/types.d.ts +30 -0
  301. package/dist/dream/types.d.ts.map +1 -0
  302. package/dist/dream/types.js +2 -0
  303. package/dist/dream/types.js.map +1 -0
  304. package/dist/env-manifest.d.ts +38 -0
  305. package/dist/env-manifest.d.ts.map +1 -0
  306. package/dist/env-manifest.js +260 -0
  307. package/dist/env-manifest.js.map +1 -0
  308. package/dist/events/index.d.ts +172 -0
  309. package/dist/events/index.d.ts.map +1 -0
  310. package/dist/events/index.js +340 -0
  311. package/dist/events/index.js.map +1 -0
  312. package/dist/events/scheduler.d.ts +34 -0
  313. package/dist/events/scheduler.d.ts.map +1 -0
  314. package/dist/events/scheduler.js +231 -0
  315. package/dist/events/scheduler.js.map +1 -0
  316. package/dist/file-guards.d.ts +26 -0
  317. package/dist/file-guards.d.ts.map +1 -0
  318. package/dist/file-guards.js +133 -0
  319. package/dist/file-guards.js.map +1 -0
  320. package/dist/harness/execution-env.d.ts +19 -0
  321. package/dist/harness/execution-env.d.ts.map +1 -0
  322. package/dist/harness/execution-env.js +262 -0
  323. package/dist/harness/execution-env.js.map +1 -0
  324. package/dist/harness/execution-resolver.d.ts +25 -0
  325. package/dist/harness/execution-resolver.d.ts.map +1 -0
  326. package/dist/harness/execution-resolver.js +156 -0
  327. package/dist/harness/execution-resolver.js.map +1 -0
  328. package/dist/harness/index.d.ts +18 -13
  329. package/dist/harness/index.d.ts.map +1 -1
  330. package/dist/harness/index.js +11 -11
  331. package/dist/harness/index.js.map +1 -1
  332. package/dist/harness/jev.d.ts +86 -0
  333. package/dist/harness/jev.d.ts.map +1 -0
  334. package/dist/harness/jev.js +167 -0
  335. package/dist/harness/jev.js.map +1 -0
  336. package/dist/harness/mcp.d.ts +38 -0
  337. package/dist/harness/mcp.d.ts.map +1 -0
  338. package/dist/harness/mcp.js +304 -0
  339. package/dist/harness/mcp.js.map +1 -0
  340. package/dist/harness/models.d.ts +7 -4
  341. package/dist/harness/models.d.ts.map +1 -1
  342. package/dist/harness/models.js +54 -55
  343. package/dist/harness/models.js.map +1 -1
  344. package/dist/harness/open-connector.d.ts +25 -0
  345. package/dist/harness/open-connector.d.ts.map +1 -0
  346. package/dist/harness/open-connector.js +178 -0
  347. package/dist/harness/open-connector.js.map +1 -0
  348. package/dist/harness/presenter.d.ts +31 -0
  349. package/dist/harness/presenter.d.ts.map +1 -0
  350. package/dist/harness/presenter.js +859 -0
  351. package/dist/harness/presenter.js.map +1 -0
  352. package/dist/harness/prompt.d.ts +30 -0
  353. package/dist/harness/prompt.d.ts.map +1 -0
  354. package/dist/harness/prompt.js +420 -0
  355. package/dist/harness/prompt.js.map +1 -0
  356. package/dist/harness/runner.d.ts +2 -123
  357. package/dist/harness/runner.d.ts.map +1 -1
  358. package/dist/harness/runner.js +551 -416
  359. package/dist/harness/runner.js.map +1 -1
  360. package/dist/harness/session.d.ts +122 -0
  361. package/dist/harness/session.d.ts.map +1 -0
  362. package/dist/harness/session.js +581 -0
  363. package/dist/harness/session.js.map +1 -0
  364. package/dist/harness/skills.d.ts +17 -28
  365. package/dist/harness/skills.d.ts.map +1 -1
  366. package/dist/harness/skills.js +104 -39
  367. package/dist/harness/skills.js.map +1 -1
  368. package/dist/harness/subagent-profiles.d.ts +8 -0
  369. package/dist/harness/subagent-profiles.d.ts.map +1 -0
  370. package/dist/harness/subagent-profiles.js +293 -0
  371. package/dist/harness/subagent-profiles.js.map +1 -0
  372. package/dist/harness/subagent.d.ts +64 -0
  373. package/dist/harness/subagent.d.ts.map +1 -0
  374. package/dist/harness/subagent.js +687 -0
  375. package/dist/harness/subagent.js.map +1 -0
  376. package/dist/harness/tools/attach.d.ts.map +1 -0
  377. package/dist/{adapters/slack → harness}/tools/attach.js +1 -1
  378. package/dist/harness/tools/attach.js.map +1 -0
  379. package/dist/{tools → harness/tools}/event.d.ts +4 -33
  380. package/dist/harness/tools/event.d.ts.map +1 -0
  381. package/dist/harness/tools/event.js +175 -0
  382. package/dist/harness/tools/event.js.map +1 -0
  383. package/dist/harness/tools/generate-image.d.ts +23 -0
  384. package/dist/harness/tools/generate-image.d.ts.map +1 -0
  385. package/dist/harness/tools/generate-image.js +65 -0
  386. package/dist/harness/tools/generate-image.js.map +1 -0
  387. package/dist/harness/tools/host-fn-tool.d.ts +21 -0
  388. package/dist/harness/tools/host-fn-tool.d.ts.map +1 -0
  389. package/dist/harness/tools/host-fn-tool.js +32 -0
  390. package/dist/harness/tools/host-fn-tool.js.map +1 -0
  391. package/dist/harness/tools/index.d.ts +41 -0
  392. package/dist/harness/tools/index.d.ts.map +1 -0
  393. package/dist/harness/tools/index.js +51 -0
  394. package/dist/harness/tools/index.js.map +1 -0
  395. package/dist/harness/tools/jev.d.ts +21 -0
  396. package/dist/harness/tools/jev.d.ts.map +1 -0
  397. package/dist/harness/tools/jev.js +109 -0
  398. package/dist/harness/tools/jev.js.map +1 -0
  399. package/dist/harness/tools/pi-tools.d.ts +18 -0
  400. package/dist/harness/tools/pi-tools.d.ts.map +1 -0
  401. package/dist/harness/tools/pi-tools.js +84 -0
  402. package/dist/harness/tools/pi-tools.js.map +1 -0
  403. package/dist/harness/tools/react.d.ts.map +1 -0
  404. package/dist/{tools → harness/tools}/react.js +6 -17
  405. package/dist/harness/tools/react.js.map +1 -0
  406. package/dist/{tools → harness/tools}/sandbox.d.ts +4 -4
  407. package/dist/harness/tools/sandbox.d.ts.map +1 -0
  408. package/dist/{tools → harness/tools}/sandbox.js +12 -8
  409. package/dist/harness/tools/sandbox.js.map +1 -0
  410. package/dist/harness/tools/subagent.d.ts +85 -0
  411. package/dist/harness/tools/subagent.d.ts.map +1 -0
  412. package/dist/harness/tools/subagent.js +677 -0
  413. package/dist/harness/tools/subagent.js.map +1 -0
  414. package/dist/harness/tools/task.d.ts +20 -0
  415. package/dist/harness/tools/task.d.ts.map +1 -0
  416. package/dist/harness/tools/task.js +79 -0
  417. package/dist/harness/tools/task.js.map +1 -0
  418. package/dist/harness/tools/types.d.ts +29 -0
  419. package/dist/harness/tools/types.d.ts.map +1 -0
  420. package/dist/harness/tools/types.js +2 -0
  421. package/dist/harness/tools/types.js.map +1 -0
  422. package/dist/harness/types.d.ts +384 -25
  423. package/dist/harness/types.d.ts.map +1 -1
  424. package/dist/harness/types.js +1 -1
  425. package/dist/harness/types.js.map +1 -1
  426. package/dist/index.d.ts +33 -9
  427. package/dist/index.d.ts.map +1 -1
  428. package/dist/index.js +19 -6
  429. package/dist/index.js.map +1 -1
  430. package/dist/log.d.ts.map +1 -1
  431. package/dist/log.js +4 -1
  432. package/dist/log.js.map +1 -1
  433. package/dist/main.js +357 -198
  434. package/dist/main.js.map +1 -1
  435. package/dist/observability/index.d.ts +33 -0
  436. package/dist/observability/index.d.ts.map +1 -0
  437. package/dist/observability/index.js +257 -0
  438. package/dist/observability/index.js.map +1 -0
  439. package/dist/observability/instrument.js +14 -6
  440. package/dist/observability/instrument.js.map +1 -1
  441. package/dist/observability/otel.d.ts +10 -0
  442. package/dist/observability/otel.d.ts.map +1 -0
  443. package/dist/observability/otel.js +183 -0
  444. package/dist/observability/otel.js.map +1 -0
  445. package/dist/observability/sentry.d.ts +40 -7
  446. package/dist/observability/sentry.d.ts.map +1 -1
  447. package/dist/observability/sentry.js +176 -32
  448. package/dist/observability/sentry.js.map +1 -1
  449. package/dist/observability/types.d.ts +24 -3
  450. package/dist/observability/types.d.ts.map +1 -1
  451. package/dist/observability/types.js.map +1 -1
  452. package/dist/office/index.d.ts +139 -0
  453. package/dist/office/index.d.ts.map +1 -0
  454. package/dist/office/index.js +1084 -0
  455. package/dist/office/index.js.map +1 -0
  456. package/dist/office/projection.d.ts +42 -0
  457. package/dist/office/projection.d.ts.map +1 -0
  458. package/dist/office/projection.js +182 -0
  459. package/dist/office/projection.js.map +1 -0
  460. package/dist/office/types.d.ts +116 -0
  461. package/dist/office/types.d.ts.map +1 -0
  462. package/dist/office/types.js +2 -0
  463. package/dist/office/types.js.map +1 -0
  464. package/dist/runtime/conversation-runtime.d.ts +1 -1
  465. package/dist/runtime/conversation-runtime.d.ts.map +1 -1
  466. package/dist/runtime/conversation-runtime.js +423 -152
  467. package/dist/runtime/conversation-runtime.js.map +1 -1
  468. package/dist/runtime/session-lifecycle.d.ts +76 -0
  469. package/dist/runtime/session-lifecycle.d.ts.map +1 -0
  470. package/dist/runtime/session-lifecycle.js +404 -0
  471. package/dist/runtime/session-lifecycle.js.map +1 -0
  472. package/dist/runtime/types.d.ts +63 -15
  473. package/dist/runtime/types.d.ts.map +1 -1
  474. package/dist/runtime/types.js.map +1 -1
  475. package/dist/sandbox/cloudflare.d.ts +4 -0
  476. package/dist/sandbox/cloudflare.d.ts.map +1 -1
  477. package/dist/sandbox/cloudflare.js +54 -52
  478. package/dist/sandbox/cloudflare.js.map +1 -1
  479. package/dist/sandbox/container.d.ts +3 -0
  480. package/dist/sandbox/container.d.ts.map +1 -1
  481. package/dist/sandbox/container.js +19 -7
  482. package/dist/sandbox/container.js.map +1 -1
  483. package/dist/sandbox/host.d.ts +3 -0
  484. package/dist/sandbox/host.d.ts.map +1 -1
  485. package/dist/sandbox/host.js +44 -35
  486. package/dist/sandbox/host.js.map +1 -1
  487. package/dist/sandbox/identity.d.ts +42 -0
  488. package/dist/sandbox/identity.d.ts.map +1 -0
  489. package/dist/sandbox/identity.js +77 -0
  490. package/dist/sandbox/identity.js.map +1 -0
  491. package/dist/sandbox/index.d.ts +24 -6
  492. package/dist/sandbox/index.d.ts.map +1 -1
  493. package/dist/sandbox/index.js +77 -17
  494. package/dist/sandbox/index.js.map +1 -1
  495. package/dist/sandbox/provisioner.d.ts +139 -0
  496. package/dist/sandbox/provisioner.d.ts.map +1 -0
  497. package/dist/{provisioner.js → sandbox/provisioner.js} +378 -24
  498. package/dist/sandbox/provisioner.js.map +1 -0
  499. package/dist/sandbox/types.d.ts +43 -9
  500. package/dist/sandbox/types.d.ts.map +1 -1
  501. package/dist/sandbox/types.js.map +1 -1
  502. package/dist/sandbox/utils.d.ts +24 -0
  503. package/dist/sandbox/utils.d.ts.map +1 -1
  504. package/dist/sandbox/utils.js +92 -1
  505. package/dist/sandbox/utils.js.map +1 -1
  506. package/dist/sessions/chat-history-sync.d.ts +23 -0
  507. package/dist/sessions/chat-history-sync.d.ts.map +1 -0
  508. package/dist/sessions/{agent-memory-file-manager.js → chat-history-sync.js} +239 -175
  509. package/dist/sessions/chat-history-sync.js.map +1 -0
  510. package/dist/sessions/history-line.d.ts +29 -0
  511. package/dist/sessions/history-line.d.ts.map +1 -0
  512. package/dist/sessions/history-line.js +45 -0
  513. package/dist/sessions/history-line.js.map +1 -0
  514. package/dist/sessions/migrate-common.d.ts +43 -0
  515. package/dist/sessions/migrate-common.d.ts.map +1 -0
  516. package/dist/sessions/migrate-common.js +99 -0
  517. package/dist/sessions/migrate-common.js.map +1 -0
  518. package/dist/sessions/migrate-pi-084.d.ts +8 -0
  519. package/dist/sessions/migrate-pi-084.d.ts.map +1 -0
  520. package/dist/sessions/migrate-pi-084.js +302 -0
  521. package/dist/sessions/migrate-pi-084.js.map +1 -0
  522. package/dist/sessions/migrate-v3.d.ts +15 -0
  523. package/dist/sessions/migrate-v3.d.ts.map +1 -0
  524. package/dist/sessions/migrate-v3.js +419 -0
  525. package/dist/sessions/migrate-v3.js.map +1 -0
  526. package/dist/sessions/session-key.d.ts +33 -0
  527. package/dist/sessions/session-key.d.ts.map +1 -0
  528. package/dist/sessions/session-key.js +115 -0
  529. package/dist/sessions/session-key.js.map +1 -0
  530. package/dist/sessions/session-store.d.ts +61 -0
  531. package/dist/sessions/session-store.d.ts.map +1 -0
  532. package/dist/sessions/session-store.js +684 -0
  533. package/dist/sessions/session-store.js.map +1 -0
  534. package/dist/sessions/store.d.ts +17 -10
  535. package/dist/sessions/store.d.ts.map +1 -1
  536. package/dist/sessions/store.js +182 -47
  537. package/dist/sessions/store.js.map +1 -1
  538. package/dist/sessions/types.d.ts +74 -8
  539. package/dist/sessions/types.d.ts.map +1 -1
  540. package/dist/sessions/types.js +1 -1
  541. package/dist/sessions/types.js.map +1 -1
  542. package/dist/settings/apply.d.ts +16 -0
  543. package/dist/settings/apply.d.ts.map +1 -0
  544. package/dist/settings/apply.js +60 -0
  545. package/dist/settings/apply.js.map +1 -0
  546. package/dist/settings/index.d.ts +126 -0
  547. package/dist/settings/index.d.ts.map +1 -0
  548. package/dist/settings/index.js +422 -0
  549. package/dist/settings/index.js.map +1 -0
  550. package/dist/settings/migrate.d.ts +21 -0
  551. package/dist/settings/migrate.d.ts.map +1 -0
  552. package/dist/settings/migrate.js +86 -0
  553. package/dist/settings/migrate.js.map +1 -0
  554. package/dist/types.d.ts +330 -141
  555. package/dist/types.d.ts.map +1 -1
  556. package/dist/types.js +2 -2
  557. package/dist/types.js.map +1 -1
  558. package/dist/vault/index.d.ts +52 -2
  559. package/dist/vault/index.d.ts.map +1 -1
  560. package/dist/vault/index.js +218 -86
  561. package/dist/vault/index.js.map +1 -1
  562. package/dist/vault/types.d.ts +6 -2
  563. package/dist/vault/types.d.ts.map +1 -1
  564. package/dist/vault/types.js.map +1 -1
  565. package/package.json +79 -40
  566. package/dist/adapter.d.ts +0 -2
  567. package/dist/adapter.d.ts.map +0 -1
  568. package/dist/adapter.js +0 -2
  569. package/dist/adapter.js.map +0 -1
  570. package/dist/adapters/slack/tools/attach.d.ts.map +0 -1
  571. package/dist/adapters/slack/tools/attach.js.map +0 -1
  572. package/dist/adapters/streaming.d.ts +0 -18
  573. package/dist/adapters/streaming.d.ts.map +0 -1
  574. package/dist/adapters/streaming.js +0 -44
  575. package/dist/adapters/streaming.js.map +0 -1
  576. package/dist/adapters/telegram/html.d.ts +0 -3
  577. package/dist/adapters/telegram/html.d.ts.map +0 -1
  578. package/dist/adapters/telegram/html.js +0 -98
  579. package/dist/adapters/telegram/html.js.map +0 -1
  580. package/dist/agent-events.d.ts +0 -5
  581. package/dist/agent-events.d.ts.map +0 -1
  582. package/dist/agent-events.js +0 -26
  583. package/dist/agent-events.js.map +0 -1
  584. package/dist/agent.d.ts +0 -39
  585. package/dist/agent.d.ts.map +0 -1
  586. package/dist/agent.js +0 -1291
  587. package/dist/agent.js.map +0 -1
  588. package/dist/cli/ext-git.d.ts +0 -22
  589. package/dist/cli/ext-git.d.ts.map +0 -1
  590. package/dist/cli/ext-git.js +0 -76
  591. package/dist/cli/ext-git.js.map +0 -1
  592. package/dist/cli/ext.d.ts +0 -2
  593. package/dist/cli/ext.d.ts.map +0 -1
  594. package/dist/cli/ext.js +0 -217
  595. package/dist/cli/ext.js.map +0 -1
  596. package/dist/commands/admin.d.ts.map +0 -1
  597. package/dist/commands/admin.js.map +0 -1
  598. package/dist/commands/auto-reply.d.ts.map +0 -1
  599. package/dist/commands/auto-reply.js +0 -76
  600. package/dist/commands/auto-reply.js.map +0 -1
  601. package/dist/commands/extensions.d.ts +0 -14
  602. package/dist/commands/extensions.d.ts.map +0 -1
  603. package/dist/commands/extensions.js +0 -55
  604. package/dist/commands/extensions.js.map +0 -1
  605. package/dist/commands/login.d.ts +0 -5
  606. package/dist/commands/login.d.ts.map +0 -1
  607. package/dist/commands/login.js +0 -115
  608. package/dist/commands/login.js.map +0 -1
  609. package/dist/commands/model.d.ts +0 -10
  610. package/dist/commands/model.d.ts.map +0 -1
  611. package/dist/commands/model.js +0 -102
  612. package/dist/commands/model.js.map +0 -1
  613. package/dist/commands/new.d.ts.map +0 -1
  614. package/dist/commands/new.js +0 -25
  615. package/dist/commands/new.js.map +0 -1
  616. package/dist/commands/parse.d.ts +0 -7
  617. package/dist/commands/parse.d.ts.map +0 -1
  618. package/dist/commands/parse.js +0 -14
  619. package/dist/commands/parse.js.map +0 -1
  620. package/dist/commands/registry.d.ts +0 -5
  621. package/dist/commands/registry.d.ts.map +0 -1
  622. package/dist/commands/registry.js +0 -31
  623. package/dist/commands/registry.js.map +0 -1
  624. package/dist/commands/sandbox.d.ts.map +0 -1
  625. package/dist/commands/sandbox.js +0 -78
  626. package/dist/commands/sandbox.js.map +0 -1
  627. package/dist/commands/session-view.d.ts.map +0 -1
  628. package/dist/commands/session-view.js.map +0 -1
  629. package/dist/commands/types.d.ts +0 -66
  630. package/dist/commands/types.d.ts.map +0 -1
  631. package/dist/commands/types.js.map +0 -1
  632. package/dist/commands/utils.d.ts +0 -11
  633. package/dist/commands/utils.d.ts.map +0 -1
  634. package/dist/commands/utils.js.map +0 -1
  635. package/dist/config.d.ts +0 -78
  636. package/dist/config.d.ts.map +0 -1
  637. package/dist/config.js +0 -450
  638. package/dist/config.js.map +0 -1
  639. package/dist/download.d.ts.map +0 -1
  640. package/dist/download.js +0 -89
  641. package/dist/download.js.map +0 -1
  642. package/dist/events.d.ts +0 -43
  643. package/dist/events.d.ts.map +0 -1
  644. package/dist/events.js +0 -456
  645. package/dist/events.js.map +0 -1
  646. package/dist/execution-resolver.d.ts +0 -21
  647. package/dist/execution-resolver.d.ts.map +0 -1
  648. package/dist/execution-resolver.js +0 -170
  649. package/dist/execution-resolver.js.map +0 -1
  650. package/dist/harness/auth.d.ts +0 -16
  651. package/dist/harness/auth.d.ts.map +0 -1
  652. package/dist/harness/auth.js +0 -86
  653. package/dist/harness/auth.js.map +0 -1
  654. package/dist/harness/extensions/loader.d.ts +0 -86
  655. package/dist/harness/extensions/loader.d.ts.map +0 -1
  656. package/dist/harness/extensions/loader.js +0 -525
  657. package/dist/harness/extensions/loader.js.map +0 -1
  658. package/dist/harness/extensions/registry.d.ts +0 -23
  659. package/dist/harness/extensions/registry.d.ts.map +0 -1
  660. package/dist/harness/extensions/registry.js +0 -45
  661. package/dist/harness/extensions/registry.js.map +0 -1
  662. package/dist/harness/extensions/types.d.ts +0 -248
  663. package/dist/harness/extensions/types.d.ts.map +0 -1
  664. package/dist/harness/extensions/types.js.map +0 -1
  665. package/dist/harness/session-store.d.ts +0 -77
  666. package/dist/harness/session-store.d.ts.map +0 -1
  667. package/dist/harness/session-store.js +0 -248
  668. package/dist/harness/session-store.js.map +0 -1
  669. package/dist/harness/settings.d.ts +0 -47
  670. package/dist/harness/settings.d.ts.map +0 -1
  671. package/dist/harness/settings.js +0 -29
  672. package/dist/harness/settings.js.map +0 -1
  673. package/dist/model-registry.d.ts +0 -4
  674. package/dist/model-registry.d.ts.map +0 -1
  675. package/dist/model-registry.js +0 -7
  676. package/dist/model-registry.js.map +0 -1
  677. package/dist/platform-messages.d.ts.map +0 -1
  678. package/dist/platform-messages.js.map +0 -1
  679. package/dist/portal-shell.d.ts +0 -4
  680. package/dist/portal-shell.d.ts.map +0 -1
  681. package/dist/portal-shell.js.map +0 -1
  682. package/dist/provisioner.d.ts +0 -61
  683. package/dist/provisioner.d.ts.map +0 -1
  684. package/dist/provisioner.js.map +0 -1
  685. package/dist/runtime/agent-run-controller.d.ts +0 -31
  686. package/dist/runtime/agent-run-controller.d.ts.map +0 -1
  687. package/dist/runtime/agent-run-controller.js +0 -195
  688. package/dist/runtime/agent-run-controller.js.map +0 -1
  689. package/dist/sandbox/errors.d.ts +0 -6
  690. package/dist/sandbox/errors.d.ts.map +0 -1
  691. package/dist/sandbox/errors.js +0 -11
  692. package/dist/sandbox/errors.js.map +0 -1
  693. package/dist/sandbox/firecracker.d.ts +0 -15
  694. package/dist/sandbox/firecracker.d.ts.map +0 -1
  695. package/dist/sandbox/firecracker.js +0 -212
  696. package/dist/sandbox/firecracker.js.map +0 -1
  697. package/dist/sandbox/image.d.ts +0 -3
  698. package/dist/sandbox/image.d.ts.map +0 -1
  699. package/dist/sandbox/image.js +0 -27
  700. package/dist/sandbox/image.js.map +0 -1
  701. package/dist/sandbox/path-context.d.ts +0 -3
  702. package/dist/sandbox/path-context.d.ts.map +0 -1
  703. package/dist/sandbox/path-context.js +0 -20
  704. package/dist/sandbox/path-context.js.map +0 -1
  705. package/dist/sessions/agent-memory-file-manager.d.ts +0 -19
  706. package/dist/sessions/agent-memory-file-manager.d.ts.map +0 -1
  707. package/dist/sessions/agent-memory-file-manager.js.map +0 -1
  708. package/dist/sessions/metadata.d.ts +0 -3
  709. package/dist/sessions/metadata.d.ts.map +0 -1
  710. package/dist/sessions/metadata.js +0 -11
  711. package/dist/sessions/metadata.js.map +0 -1
  712. package/dist/sessions/policy.d.ts +0 -6
  713. package/dist/sessions/policy.d.ts.map +0 -1
  714. package/dist/sessions/policy.js +0 -23
  715. package/dist/sessions/policy.js.map +0 -1
  716. package/dist/store.d.ts +0 -46
  717. package/dist/store.d.ts.map +0 -1
  718. package/dist/store.js +0 -177
  719. package/dist/store.js.map +0 -1
  720. package/dist/tools/bash.d.ts +0 -10
  721. package/dist/tools/bash.d.ts.map +0 -1
  722. package/dist/tools/bash.js +0 -80
  723. package/dist/tools/bash.js.map +0 -1
  724. package/dist/tools/edit.d.ts +0 -11
  725. package/dist/tools/edit.d.ts.map +0 -1
  726. package/dist/tools/edit.js +0 -131
  727. package/dist/tools/edit.js.map +0 -1
  728. package/dist/tools/event.d.ts.map +0 -1
  729. package/dist/tools/event.js +0 -252
  730. package/dist/tools/event.js.map +0 -1
  731. package/dist/tools/index.d.ts +0 -24
  732. package/dist/tools/index.d.ts.map +0 -1
  733. package/dist/tools/index.js +0 -31
  734. package/dist/tools/index.js.map +0 -1
  735. package/dist/tools/react.d.ts.map +0 -1
  736. package/dist/tools/react.js.map +0 -1
  737. package/dist/tools/read.d.ts +0 -11
  738. package/dist/tools/read.d.ts.map +0 -1
  739. package/dist/tools/read.js +0 -134
  740. package/dist/tools/read.js.map +0 -1
  741. package/dist/tools/sandbox.d.ts.map +0 -1
  742. package/dist/tools/sandbox.js.map +0 -1
  743. package/dist/tools/truncate.d.ts +0 -33
  744. package/dist/tools/truncate.d.ts.map +0 -1
  745. package/dist/tools/truncate.js +0 -184
  746. package/dist/tools/truncate.js.map +0 -1
  747. package/dist/tools/types.d.ts +0 -54
  748. package/dist/tools/types.d.ts.map +0 -1
  749. package/dist/tools/types.js.map +0 -1
  750. package/dist/tools/write.d.ts +0 -10
  751. package/dist/tools/write.d.ts.map +0 -1
  752. package/dist/tools/write.js +0 -29
  753. package/dist/tools/write.js.map +0 -1
  754. package/dist/trigger.d.ts +0 -22
  755. package/dist/trigger.d.ts.map +0 -1
  756. package/dist/trigger.js +0 -100
  757. package/dist/trigger.js.map +0 -1
  758. package/dist/utils/date.d.ts +0 -10
  759. package/dist/utils/date.d.ts.map +0 -1
  760. package/dist/utils/date.js +0 -23
  761. package/dist/utils/date.js.map +0 -1
  762. package/dist/utils/env.d.ts +0 -3
  763. package/dist/utils/env.d.ts.map +0 -1
  764. package/dist/utils/env.js +0 -12
  765. package/dist/utils/env.js.map +0 -1
  766. package/dist/utils/file-guards.d.ts +0 -9
  767. package/dist/utils/file-guards.d.ts.map +0 -1
  768. package/dist/utils/file-guards.js +0 -59
  769. package/dist/utils/file-guards.js.map +0 -1
  770. package/dist/utils/fs-atomic.d.ts +0 -10
  771. package/dist/utils/fs-atomic.d.ts.map +0 -1
  772. package/dist/utils/fs-atomic.js +0 -45
  773. package/dist/utils/fs-atomic.js.map +0 -1
  774. package/dist/utils/html.d.ts +0 -2
  775. package/dist/utils/html.d.ts.map +0 -1
  776. package/dist/utils/html.js +0 -4
  777. package/dist/utils/html.js.map +0 -1
  778. package/dist/utils/http-body.d.ts +0 -10
  779. package/dist/utils/http-body.d.ts.map +0 -1
  780. package/dist/utils/http-body.js +0 -34
  781. package/dist/utils/http-body.js.map +0 -1
  782. package/dist/vault/routing.d.ts +0 -3
  783. package/dist/vault/routing.d.ts.map +0 -1
  784. package/dist/vault/routing.js +0 -13
  785. package/dist/vault/routing.js.map +0 -1
  786. package/dist/web/admin/portal.d.ts +0 -5
  787. package/dist/web/admin/portal.d.ts.map +0 -1
  788. package/dist/web/admin/portal.js +0 -2572
  789. package/dist/web/admin/portal.js.map +0 -1
  790. package/dist/web/admin/provider-models.d.ts.map +0 -1
  791. package/dist/web/admin/provider-models.js.map +0 -1
  792. package/dist/web/admin/store.d.ts +0 -13
  793. package/dist/web/admin/store.d.ts.map +0 -1
  794. package/dist/web/admin/store.js +0 -14
  795. package/dist/web/admin/store.js.map +0 -1
  796. package/dist/web/admin/types.d.ts +0 -30
  797. package/dist/web/admin/types.d.ts.map +0 -1
  798. package/dist/web/admin/types.js.map +0 -1
  799. package/dist/web/agent-events/portal.d.ts +0 -3
  800. package/dist/web/agent-events/portal.d.ts.map +0 -1
  801. package/dist/web/agent-events/portal.js +0 -18
  802. package/dist/web/agent-events/portal.js.map +0 -1
  803. package/dist/web/login/oauth.d.ts +0 -6
  804. package/dist/web/login/oauth.d.ts.map +0 -1
  805. package/dist/web/login/oauth.js.map +0 -1
  806. package/dist/web/login/portal.d.ts.map +0 -1
  807. package/dist/web/login/portal.js.map +0 -1
  808. package/dist/web/login/store.d.ts +0 -8
  809. package/dist/web/login/store.d.ts.map +0 -1
  810. package/dist/web/login/store.js +0 -15
  811. package/dist/web/login/store.js.map +0 -1
  812. package/dist/web/login/types.d.ts.map +0 -1
  813. package/dist/web/login/types.js.map +0 -1
  814. package/dist/web/request.d.ts +0 -3
  815. package/dist/web/request.d.ts.map +0 -1
  816. package/dist/web/request.js +0 -13
  817. package/dist/web/request.js.map +0 -1
  818. package/dist/web/server.d.ts.map +0 -1
  819. package/dist/web/server.js.map +0 -1
  820. package/dist/web/session-view/command.d.ts +0 -4
  821. package/dist/web/session-view/command.d.ts.map +0 -1
  822. package/dist/web/session-view/command.js +0 -7
  823. package/dist/web/session-view/command.js.map +0 -1
  824. package/dist/web/session-view/portal.d.ts +0 -13
  825. package/dist/web/session-view/portal.d.ts.map +0 -1
  826. package/dist/web/session-view/portal.js.map +0 -1
  827. package/dist/web/session-view/service.d.ts +0 -6
  828. package/dist/web/session-view/service.d.ts.map +0 -1
  829. package/dist/web/session-view/service.js +0 -498
  830. package/dist/web/session-view/service.js.map +0 -1
  831. package/dist/web/session-view/store.d.ts +0 -8
  832. package/dist/web/session-view/store.d.ts.map +0 -1
  833. package/dist/web/session-view/store.js +0 -15
  834. package/dist/web/session-view/store.js.map +0 -1
  835. package/dist/web/session-view/types.d.ts.map +0 -1
  836. package/dist/web/session-view/types.js.map +0 -1
  837. package/dist/web/token-store.d.ts.map +0 -1
  838. package/dist/web/token-store.js.map +0 -1
  839. package/dist/web/types.d.ts.map +0 -1
  840. package/dist/web/types.js.map +0 -1
  841. /package/dist/{commands → adapters/commands}/admin.d.ts +0 -0
  842. /package/dist/{commands → adapters/commands}/new.d.ts +0 -0
  843. /package/dist/{commands → adapters/commands}/sandbox.d.ts +0 -0
  844. /package/dist/{commands → adapters/commands}/session-view.d.ts +0 -0
  845. /package/dist/{commands → adapters/commands}/types.js +0 -0
  846. /package/dist/{harness/extensions → adapters/github}/types.js +0 -0
  847. /package/dist/{tools → adapters/web/admin}/types.js +0 -0
  848. /package/dist/{web/admin → adapters/web/login}/types.js +0 -0
  849. /package/dist/{web/login → adapters/web/session-view}/types.js +0 -0
  850. /package/dist/{web → adapters/web}/token-store.d.ts +0 -0
  851. /package/dist/{web → adapters/web}/types.d.ts +0 -0
  852. /package/dist/{web/session-view → adapters/web}/types.js +0 -0
  853. /package/dist/{download.d.ts → cli/download.d.ts} +0 -0
  854. /package/dist/{web → cli}/types.js +0 -0
  855. /package/dist/{adapters/slack → harness}/tools/attach.d.ts +0 -0
  856. /package/dist/{tools → harness/tools}/react.d.ts +0 -0
package/dist/agent.js DELETED
@@ -1,1291 +0,0 @@
1
- import { DEFAULT_EVENT_BUDGET, defaultExtensionDirs, formatSkillsForPrompt, loadExtensions, loadSkillsFromDir, MikanAgentSession, MikanModels, } from "./harness/index.js";
2
- import { createHash } from "crypto";
3
- import { existsSync, readFileSync } from "fs";
4
- import { mkdir, readFile, writeFile } from "fs/promises";
5
- import { join, posix } from "path";
6
- import { resolveConversationSettings } from "./config.js";
7
- import { readEnv } from "./utils/env.js";
8
- import { ActorExecutionResolver } from "./execution-resolver.js";
9
- 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 { extractSessionUuid, openManagedSession, } from "./sessions/store.js";
16
- import { HostEventStore } from "./tools/event.js";
17
- import { createMikanTools } from "./tools/index.js";
18
- import * as Sentry from "@sentry/node";
19
- import { formatLocalTimestamp } from "./utils/date.js";
20
- import { resolveConfiguredModel } from "./model-registry.js";
21
- import { emitAgentEvent } from "./agent-events.js";
22
- const IMAGE_MIME_TYPES = {
23
- jpg: "image/jpeg",
24
- jpeg: "image/jpeg",
25
- png: "image/png",
26
- gif: "image/gif",
27
- webp: "image/webp",
28
- };
29
- function getImageMimeType(filename) {
30
- return IMAGE_MIME_TYPES[filename.toLowerCase().split(".").pop() || ""];
31
- }
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}`;
38
- }
39
- async function getMemory(conversationDir) {
40
- const parts = [];
41
- // Read workspace-level memory (shared across all conversations)
42
- const workspaceMemoryPath = join(conversationDir, "..", "MEMORY.md");
43
- if (existsSync(workspaceMemoryPath)) {
44
- try {
45
- const content = (await readFile(workspaceMemoryPath, "utf-8")).trim();
46
- if (content) {
47
- parts.push(`### Global Workspace Memory\n${content}`);
48
- }
49
- }
50
- catch (error) {
51
- log.logWarning("Failed to read workspace memory", `${workspaceMemoryPath}: ${error}`);
52
- }
53
- }
54
- // Read conversation-specific memory
55
- const conversationMemoryPath = join(conversationDir, "MEMORY.md");
56
- if (existsSync(conversationMemoryPath)) {
57
- try {
58
- const content = (await readFile(conversationMemoryPath, "utf-8")).trim();
59
- if (content) {
60
- parts.push(`### Conversation-Specific Memory\n${content}`);
61
- }
62
- }
63
- catch (error) {
64
- log.logWarning("Failed to read conversation memory", `${conversationMemoryPath}: ${error}`);
65
- }
66
- }
67
- if (parts.length === 0) {
68
- return "(no working memory yet)";
69
- }
70
- return parts.join("\n\n");
71
- }
72
- function loadMikanSkills(conversationDir, workspacePath) {
73
- const skillMap = new Map();
74
- // conversationDir is the host path (e.g., /Users/.../data/C0A34FL8PMH)
75
- // hostWorkspacePath is the parent directory on host
76
- // workspacePath is the container path (e.g., /workspace)
77
- const hostWorkspacePath = join(conversationDir, "..");
78
- // Helper to translate host paths to container paths
79
- const translatePath = (hostPath) => {
80
- if (hostPath.startsWith(hostWorkspacePath)) {
81
- return workspacePath + hostPath.slice(hostWorkspacePath.length);
82
- }
83
- return hostPath;
84
- };
85
- // Load workspace-level skills (global)
86
- const workspaceSkillsDir = join(hostWorkspacePath, "skills");
87
- for (const skill of loadSkillsFromDir({ dir: workspaceSkillsDir, source: "workspace" }).skills) {
88
- // Translate paths to container paths for system prompt
89
- skill.filePath = translatePath(skill.filePath);
90
- skill.baseDir = translatePath(skill.baseDir);
91
- skillMap.set(skill.name, skill);
92
- }
93
- // Load conversation-specific skills (override workspace skills on collision)
94
- const conversationSkillsDir = join(conversationDir, "skills");
95
- for (const skill of loadSkillsFromDir({ dir: conversationSkillsDir, source: "channel" }).skills) {
96
- skill.filePath = translatePath(skill.filePath);
97
- skill.baseDir = translatePath(skill.baseDir);
98
- skillMap.set(skill.name, skill);
99
- }
100
- return Array.from(skillMap.values());
101
- }
102
- function buildRuntimePaths(runtimeWorkspaceRoot, conversationId) {
103
- const workspaceRoot = runtimeWorkspaceRoot.replace(/\/+$/, "") || "/";
104
- const conversationPath = posix.join(workspaceRoot, conversationId);
105
- return {
106
- workspaceRoot,
107
- conversationPath,
108
- scratchPath: posix.join(conversationPath, "scratch"),
109
- };
110
- }
111
- function buildEnvDescription(sandboxType, workspaceRoot) {
112
- switch (sandboxType) {
113
- case "image":
114
- return `You are running inside a managed per-user container.
115
- - Runtime workspace root: ${workspaceRoot}
116
- - Bash commands start in: ${workspaceRoot}
117
- - Install tools with the image's package manager
118
- - Your changes persist for this user's container until it is recreated`;
119
- case "container":
120
- return `You are running inside a shared container.
121
- - Runtime workspace root: ${workspaceRoot}
122
- - Bash commands start in: ${workspaceRoot}
123
- - Install tools with the container's package manager
124
- - Your changes persist across sessions`;
125
- case "firecracker":
126
- return `You are running inside a Firecracker microVM.
127
- - Runtime workspace root: ${workspaceRoot}
128
- - Use cd or absolute paths; project files are under ${workspaceRoot}
129
- - Install tools with: apt-get install <package> (Debian-based)
130
- - Your changes persist across sessions`;
131
- case "cloudflare":
132
- return `You are running through a Cloudflare Sandbox bridge.
133
- - Runtime workspace root: ${workspaceRoot}
134
- - Bash commands start in: ${workspaceRoot}
135
- - Your commands run in a remote container managed by Cloudflare
136
- - Important: the remote filesystem is not automatically synced back to the host workspace`;
137
- default:
138
- return `You are running directly on the host machine.
139
- - Runtime workspace root: ${workspaceRoot}
140
- - Bash commands start in: ${process.cwd()}
141
- - Be careful with system modifications`;
142
- }
143
- }
144
- export function resolveTriggerAttribution(message) {
145
- const eventTextMatch = message.text.match(/^\[EVENT:([^:]+):/);
146
- if (eventTextMatch)
147
- return `[event: ${eventTextMatch[1]}]`;
148
- const eventIdMatch = message.id.match(/^event:([^:]+)/);
149
- if (eventIdMatch)
150
- return `[event: ${eventIdMatch[1]}]`;
151
- if (message.userName)
152
- return `@${message.userName}`;
153
- return undefined;
154
- }
155
- function buildSystemPrompt(workspacePath, conversationId, conversationKind, currentUserId, memory, sandboxConfig, platform, skills) {
156
- const { workspaceRoot, conversationPath, scratchPath } = buildRuntimePaths(workspacePath, conversationId);
157
- const sandboxType = sandboxConfig.type;
158
- const isContainerLike = sandboxType === "container" || sandboxType === "image";
159
- const isFirecracker = sandboxType === "firecracker";
160
- // Format channel mappings
161
- const channelMappings = platform.channels.length > 0
162
- ? platform.channels.map((c) => `${c.id}\t#${c.name}`).join("\n")
163
- : "(no channels loaded)";
164
- // Format user mappings
165
- const userMappings = platform.users.length > 0
166
- ? platform.users.map((u) => `${u.id}\t@${u.userName}\t${u.displayName}`).join("\n")
167
- : "(no users loaded)";
168
- const envDescription = buildEnvDescription(sandboxType, workspaceRoot);
169
- // Per-turn instructions (event-trigger mode, attribution) are delivered with
170
- // the user message via buildTurnInstructions(), not baked in here, so this
171
- // system prompt stays byte-stable across a conversation's turns and keeps the
172
- // provider prompt cache warm (a changing system prefix invalidates the cache
173
- // for the whole request, including the far larger conversation history).
174
- const slackBlockKitInstructions = platform.name === "slack"
175
- ? `
176
- ## Slack Rendering
177
- - The Slack adapter renders responses with Block Kit automatically. Answer normally using Slack mrkdwn.
178
- - Do not emit markdown pipe tables; Slack does not render them as tables. Prefer short sections or bullet lists.
179
- `
180
- : "";
181
- return `You are mikan, a ${platform.name} bot assistant. Be concise. No emojis.
182
-
183
- ## Context
184
- - For current date/time, use: date
185
- - You have access to previous conversation context including tool results from prior turns.
186
- - For older human-readable history beyond your context, search \`log.jsonl\` (contains user messages and your final responses, but not tool results).
187
- - Structured session history with tool results lives in \`${conversationPath}/sessions/\`.
188
- - The active top-level session is selected by \`${conversationPath}/sessions/current\`, which points to a timestamped \`.jsonl\` file in the same directory.
189
- - Scoped/thread sessions use fixed files at \`${conversationPath}/sessions/<scope_id>.jsonl\` (for example \`${conversationPath}/sessions/1777386320.800769.jsonl\`).
190
- - If a user asks about something that should exist in conversation history but is not found in the current context window, do not answer "I don't know" or "I don't have that". Instead, search the thread session, top-level session, and \`log.jsonl\` before responding.
191
- - User messages include a \`[in-thread:TS]\` marker when sent from within a platform thread/reply (TS is the thread or parent message identifier). Without this marker, the message is a top-level conversation message.
192
- ${platform.formattingGuide}${slackBlockKitInstructions}
193
-
194
- ## Platform IDs
195
- Channels: ${channelMappings}
196
-
197
- Users: ${userMappings}
198
-
199
- When mentioning users, use <@username> format (e.g., <@mario>).
200
-
201
- ## Environment
202
- ${envDescription}
203
- - Default place for clones, downloads, and experiments: ${scratchPath}
204
- - Do not use host-only paths unless you are running in host mode and verified they exist.
205
-
206
- ## Workspace Layout
207
- ${workspaceRoot}/
208
- ├── MEMORY.md # Global memory (all conversations)
209
- ├── skills/ # Global CLI tools you create
210
- └── ${conversationId}/ # This conversation
211
- ├── MEMORY.md # Conversation-specific memory
212
- ├── log.jsonl # Human-readable message history (no tool results)
213
- ├── sessions/ # Structured session history used for context reconstruction
214
- │ ├── current # Active top-level session pointer
215
- │ ├── <timestamp>_<id>.jsonl # Top-level session files
216
- │ └── <scope_id>.jsonl # Scoped thread/reply session files
217
- ├── attachments/ # User-shared files
218
- ├── scratch/ # Working directory for clones/downloads/experiments: ${scratchPath}
219
- └── skills/ # Conversation-specific tools
220
-
221
- ## Skills (Custom CLI Tools)
222
- You can create reusable CLI tools for recurring tasks (email, APIs, data processing, etc.).
223
-
224
- ### Creating Skills
225
- Store in \`${workspaceRoot}/skills/<name>/\` (global) or \`${conversationPath}/skills/<name>/\` (conversation-specific).
226
- Each skill directory needs a \`SKILL.md\` with YAML frontmatter:
227
-
228
- \`\`\`markdown
229
- ---
230
- name: skill-name
231
- description: Short description of what this skill does
232
- ---
233
-
234
- # Skill Name
235
-
236
- Usage instructions, examples, etc.
237
- Scripts are in: {baseDir}/
238
- \`\`\`
239
-
240
- \`name\` and \`description\` are required. Use \`{baseDir}\` as placeholder for the skill's directory path.
241
-
242
- ### Available Skills
243
- ${skills.length > 0 ? formatSkillsForPrompt(skills) : "(no skills installed yet)"}
244
-
245
- ## Events
246
- Use the \`event\` tool to schedule immediate, one-shot, or periodic follow-ups. It writes to the host-side mikan control plane and fills routing fields for the current conversation automatically.
247
-
248
- Write event \`text\` as a self-contained future task with needed context, tone, and constraints because events do not inherit normal conversation history.
249
-
250
- For one-shot reminders, include a timezone offset in \`at\`. For periodic events, use a cron schedule plus IANA timezone; assume ${Intl.DateTimeFormat().resolvedOptions().timeZone} when users omit timezone.
251
-
252
- When events trigger, messages are prefixed like \`[EVENT:filename:type:time]\`. Immediate and one-shot events auto-delete after triggering; periodic events persist until deleted.
253
-
254
- For periodic events where there's nothing to report, respond with exactly \`[SILENT]\`. Debounce external triggers; prefer one summarized event over many.
255
-
256
- ## Memory
257
- Write to MEMORY.md files to persist context across conversations.
258
- - Global (${workspaceRoot}/MEMORY.md): skills, preferences, project info
259
- - Conversation (${conversationPath}/MEMORY.md): conversation-specific decisions, ongoing work
260
- Update when you learn something important or when asked to remember something.
261
-
262
- ### Current Memory
263
- ${memory}
264
-
265
- ## System Configuration Log
266
- Maintain ${workspaceRoot}/SYSTEM.md to log all environment modifications:
267
- - Installed packages (apt install, npm install, uv pip install)
268
- - Environment variables set
269
- - Config files modified (~/.gitconfig, cron jobs, etc.)
270
- - Skill dependencies installed
271
-
272
- Update this file whenever you modify the environment. On fresh container, read it first to restore your setup.
273
-
274
- ## Log Queries (for older history)
275
- Format: \`{"date":"...","ts":"...","user":"...","userName":"...","text":"...","isMessagingBot":false}\`
276
- The log contains user messages and your final responses (not tool calls/results).
277
- Use \`log.jsonl\` for quick grep-style history. Use \`${conversationPath}/sessions/\` when you need structured turns, tool outputs, or thread/session lineage.
278
- ${isContainerLike || isFirecracker ? "Install jq: apt-get install jq" : ""}
279
- \`\`\`bash
280
- # Recent messages
281
- tail -30 log.jsonl | jq -c '{date: .date[0:19], user: (.userName // .user), text}'
282
-
283
- # Search for specific topic
284
- grep -i "topic" log.jsonl | jq -c '{date: .date[0:19], user: (.userName // .user), text}'
285
-
286
- # Messages from specific user
287
- grep '"userName":"mario"' log.jsonl | tail -20 | jq -c '{date: .date[0:19], text}'
288
-
289
- # Inspect top-level session pointer and available session files
290
- cat sessions/current
291
- ls -1 sessions/
292
- \`\`\`
293
-
294
- ## Tools
295
- - bash: Run shell commands (primary tool). Install packages as needed.
296
- - read: Read files
297
- - write: Create/overwrite files
298
- - edit: Surgical file edits
299
- - event: Schedule immediate, one-shot, or periodic follow-ups
300
- - sandbox: Inspect or temporarily adjust sandbox limits
301
- - attach: Share files to the platform
302
-
303
- Each tool requires a "label" parameter (shown to user).
304
- `;
305
- }
306
- /**
307
- * Instructions that vary per turn (event-trigger mode, response attribution).
308
- * These are delivered with the user message rather than baked into the system
309
- * prompt, so the system prompt stays cache-stable across a conversation's turns
310
- * (in a multi-user channel the attribution line alone changes every turn).
311
- * Returns an empty string when the turn needs no special framing.
312
- */
313
- export function buildTurnInstructions(isEventTrigger, triggerAttribution, platformName) {
314
- const parts = [];
315
- if (isEventTrigger) {
316
- parts.push(`## Event Trigger Mode
317
- - You are handling a scheduled/background event, not opening a brand new chat with a stranger.
318
- - Treat the incoming user message as a self-contained task prepared by an earlier run.
319
- - Complete the task directly. Avoid generic greetings, self-introductions, or boilerplate offers to help.
320
- - For reminders/follow-ups, prefer a short direct response that sounds like a continuation of prior intent.
321
- - If the event text includes tone, brevity, or language instructions, follow them literally.`);
322
- }
323
- if (triggerAttribution) {
324
- parts.push(`## Attribution
325
- Always end your final ${platformName} response and any GitHub issue/PR comments or descriptions you write via tools with:
326
- _Triggered by ${triggerAttribution}_
327
-
328
- Do not add this to \`[SILENT]\` responses.`);
329
- }
330
- return parts.join("\n\n");
331
- }
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, platformReactor } = 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
- ...(platformReactor ? { addReaction: platformReactor } : {}),
397
- ...(vaultManager
398
- ? {
399
- resolveSecrets: (slug) => vaultManager.resolve(`extensions/${slug}`)?.env ?? {},
400
- }
401
- : {}),
402
- };
403
- }
404
- /**
405
- * Local (workspace/conversation) skills override extension skills on name
406
- * collision: an admin's on-disk skill always beats an extension's.
407
- */
408
- function mergeExtensionSkills(local, extension) {
409
- if (extension.length === 0)
410
- return local;
411
- const byName = new Map();
412
- for (const skill of extension)
413
- byName.set(skill.name, skill);
414
- for (const skill of local)
415
- byName.set(skill.name, skill);
416
- return [...byName.values()];
417
- }
418
- async function createConfiguredAgentSession(params) {
419
- const { conversationId, workspaceDir, systemPrompt, model, thinkingLevel, tools, sessionStore, models, vaultManager, platformNotifier, platformReactor, } = params;
420
- // Host-only dirs under the state dir: extension code runs in the mikan
421
- // process, so it must never load from workspace paths — those are mounted
422
- // into sandbox containers and agent-writable (sandbox escape otherwise).
423
- const extensionsResult = await loadExtensions({
424
- dirs: defaultExtensionDirs(conversationId, readEnv("STATE_DIR")),
425
- context: { conversationId, workspaceDir, model, thinkingLevel },
426
- services: buildExtensionHostServices({
427
- workspaceDir,
428
- vaultManager,
429
- platformNotifier,
430
- platformReactor,
431
- }),
432
- });
433
- for (const err of extensionsResult.errors) {
434
- log.logWarning(`[${conversationId}] Extension load error: ${err.path}`, err.error);
435
- }
436
- if (extensionsResult.extensions.length > 0) {
437
- log.logInfo(`[${conversationId}] Loaded ${extensionsResult.extensions.length} extension(s): ${extensionsResult.extensions.map((extension) => extension.name).join(", ")}`);
438
- }
439
- const session = new MikanAgentSession({
440
- systemPrompt,
441
- model,
442
- thinkingLevel,
443
- tools,
444
- models,
445
- sessionStore,
446
- extensions: extensionsResult.registry,
447
- });
448
- const reloaded = session.reloadFromSession();
449
- if (reloaded > 0) {
450
- log.logInfo(`[${conversationId}] Reloaded ${reloaded} messages from session context`);
451
- }
452
- return { session, extensionSkills: extensionsResult.skills };
453
- }
454
- function createEmptyUsageTotals() {
455
- return {
456
- input: 0,
457
- output: 0,
458
- cacheRead: 0,
459
- cacheWrite: 0,
460
- cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
461
- };
462
- }
463
- function createRunState() {
464
- return {
465
- responder: null,
466
- logCtx: null,
467
- queue: null,
468
- pendingTools: new Map(),
469
- toolProgress: new Map(),
470
- totalUsage: createEmptyUsageTotals(),
471
- llmCallCount: 0,
472
- stopReason: "stop",
473
- errorMessage: undefined,
474
- reportedLlmError: false,
475
- finalResponseHandledByTool: false,
476
- triggerAttribution: undefined,
477
- };
478
- }
479
- function resetRunState(runState, responder, sessionConversation, userName, sessionUuid, triggerAttribution) {
480
- runState.responder = responder;
481
- runState.logCtx = {
482
- conversationId: sessionConversation,
483
- userName,
484
- conversationName: undefined,
485
- sessionId: sessionUuid,
486
- };
487
- runState.pendingTools.clear();
488
- runState.toolProgress.clear();
489
- runState.totalUsage = createEmptyUsageTotals();
490
- runState.llmCallCount = 0;
491
- runState.stopReason = "stop";
492
- runState.errorMessage = undefined;
493
- runState.reportedLlmError = false;
494
- runState.finalResponseHandledByTool = false;
495
- runState.triggerAttribution = triggerAttribution;
496
- }
497
- function createRunQueue(responder, runState) {
498
- let queueChain = Promise.resolve();
499
- return {
500
- queue: {
501
- enqueue(fn, errorContext) {
502
- queueChain = queueChain.then(async () => {
503
- if (runState.finalResponseHandledByTool)
504
- return;
505
- try {
506
- await fn();
507
- }
508
- catch (err) {
509
- const errMsg = err instanceof Error ? err.message : String(err);
510
- log.logWarning(`API error (${errorContext})`, errMsg);
511
- try {
512
- await responder.respondDiagnostic(`Error: ${errMsg}`, { style: "error" });
513
- }
514
- catch {
515
- // Ignore
516
- }
517
- }
518
- });
519
- },
520
- },
521
- wait: () => queueChain,
522
- };
523
- }
524
- function formatTimestampedUserMessage(message) {
525
- const timestamp = formatLocalTimestamp(new Date());
526
- const threadContext = message.threadTs ? ` [in-thread:${message.threadTs}]` : "";
527
- return `[${timestamp}] [${message.userName || "unknown"}]${threadContext}: ${message.text}`;
528
- }
529
- function collectMessageAttachments(message, workspacePath, pathContext) {
530
- const imageAttachments = [];
531
- const nonImagePaths = [];
532
- for (const attachment of message.attachments || []) {
533
- const runtimePath = `${workspacePath}/${attachment.localPath}`;
534
- const hostPath = pathContext?.runtimeToHostPath?.(runtimePath) ?? runtimePath;
535
- const mimeType = getImageMimeType(attachment.localPath);
536
- if (mimeType && existsSync(hostPath)) {
537
- try {
538
- imageAttachments.push({
539
- type: "image",
540
- mimeType,
541
- data: readFileSync(hostPath).toString("base64"),
542
- });
543
- }
544
- catch {
545
- nonImagePaths.push(runtimePath);
546
- }
547
- }
548
- else {
549
- nonImagePaths.push(runtimePath);
550
- }
551
- }
552
- return { imageAttachments, nonImagePaths };
553
- }
554
- export function buildPromptPayload(message, workspacePath, pathContext) {
555
- let userMessage = formatTimestampedUserMessage(message);
556
- const { imageAttachments, nonImagePaths } = collectMessageAttachments(message, workspacePath, pathContext);
557
- if (nonImagePaths.length > 0) {
558
- userMessage += `\n\n<slack_attachments>\n${nonImagePaths.join("\n")}\n</slack_attachments>`;
559
- }
560
- return { userMessage, imageAttachments };
561
- }
562
- async function writePromptDebugContext(conversationDir, systemPrompt, session, userMessage, imageAttachmentCount) {
563
- const debugContext = {
564
- systemPrompt,
565
- messages: session.messages,
566
- newUserMessage: userMessage,
567
- imageAttachmentCount,
568
- };
569
- await writeFile(join(conversationDir, "last_prompt.jsonl"), JSON.stringify(debugContext, null, 2));
570
- }
571
- function getFinalAssistantText(session) {
572
- const lastAssistant = session.messages.findLast((message) => message.role === "assistant");
573
- return (lastAssistant?.content
574
- .filter((content) => content.type === "text")
575
- .map((content) => content.text)
576
- .join("\n") || "");
577
- }
578
- export function appendTriggerAttribution(text, triggerAttribution, sessionLink) {
579
- if (!triggerAttribution)
580
- return text;
581
- const trimmed = text.trimEnd();
582
- const legacySuffix = `_Triggered by ${triggerAttribution}_`;
583
- // Slack mrkdwn italics cannot span a URL — a `_..._` wrapping a link renders
584
- // the underscores literally. Keep the session link outside the italic span.
585
- const suffix = sessionLink ? `${legacySuffix} · session: ${sessionLink}` : legacySuffix;
586
- if (trimmed.endsWith(suffix))
587
- return text;
588
- const body = trimmed.endsWith(legacySuffix)
589
- ? trimmed.slice(0, -legacySuffix.length).trimEnd()
590
- : trimmed;
591
- return `${body}\n\n${suffix}`;
592
- }
593
- function isEventTriggerAttribution(triggerAttribution) {
594
- return triggerAttribution?.startsWith("[event:") === true;
595
- }
596
- function extractToolLabel(toolName, args) {
597
- const label = args?.label;
598
- if (typeof label !== "string")
599
- return toolName;
600
- return label.trim() || toolName;
601
- }
602
- function formatToolProgress(runState) {
603
- const lines = Array.from(runState.toolProgress.values()).map((item) => {
604
- const marker = item.status === "running" ? "•" : item.status === "error" ? "✗" : "✓";
605
- return `${marker} ${item.label}`;
606
- });
607
- return lines.join("\n");
608
- }
609
- function formatResponseWithToolProgress(text, runState) {
610
- const progress = formatToolProgress(runState);
611
- return progress ? `${progress}\n\n${text}` : text;
612
- }
613
- async function replaceResponseWithToolProgress(responder, runState) {
614
- const progress = formatToolProgress(runState);
615
- if (progress)
616
- await responder.replaceResponse(progress);
617
- }
618
- async function finalizeRunResponse(responder, session, runState, options) {
619
- if (runState.stopReason === "error" && runState.errorMessage) {
620
- if (!runState.reportedLlmError) {
621
- runState.reportedLlmError = true;
622
- reportUserFacingError(new Error("LLM run completed with error stop reason"), {
623
- domain: "llm",
624
- surface: "assistant_response",
625
- operation: "llm_turn",
626
- severity: "error",
627
- platform: options?.platform,
628
- provider: options?.model?.provider,
629
- model: options?.model?.name,
630
- stopReason: runState.stopReason,
631
- context: {
632
- sessionConversation: options?.sessionConversation,
633
- sessionUuid: options?.sessionUuid,
634
- hasErrorMessage: true,
635
- llmCallCount: runState.llmCallCount,
636
- },
637
- });
638
- }
639
- try {
640
- await responder.replaceResponse("_Sorry, something went wrong_");
641
- await responder.respondDiagnostic(`Error: ${runState.errorMessage}`, {
642
- style: "error",
643
- });
644
- }
645
- catch (err) {
646
- const errMsg = err instanceof Error ? err.message : String(err);
647
- log.logWarning("Failed to post error message", errMsg);
648
- reportUserFacingError(err, {
649
- domain: "chat_platform",
650
- surface: "final_response",
651
- operation: "finalize_error_response",
652
- severity: "error",
653
- platform: options?.platform,
654
- context: {
655
- sessionConversation: options?.sessionConversation,
656
- sessionUuid: options?.sessionUuid,
657
- stopReason: runState.stopReason,
658
- },
659
- });
660
- }
661
- return;
662
- }
663
- const finalText = getFinalAssistantText(session);
664
- if (runState.finalResponseHandledByTool) {
665
- log.logInfo("Final response already handled by tool - skipping final replacement");
666
- return;
667
- }
668
- if (finalText.trim() === "[SILENT]" || finalText.trim().startsWith("[SILENT]")) {
669
- try {
670
- await responder.deleteResponse();
671
- log.logInfo("Silent response - deleted message and thread");
672
- }
673
- catch (err) {
674
- const errMsg = err instanceof Error ? err.message : String(err);
675
- log.logWarning("Failed to delete message for silent response", errMsg);
676
- }
677
- return;
678
- }
679
- if (!finalText.trim())
680
- return;
681
- try {
682
- await responder.replaceResponse(appendTriggerAttribution(formatResponseWithToolProgress(finalText, runState), options?.triggerAttribution, options?.triggerSessionLink), { createOverflowLink: options?.createOverflowLink });
683
- }
684
- catch (err) {
685
- const errMsg = err instanceof Error ? err.message : String(err);
686
- log.logWarning("Failed to replace message with final text", errMsg);
687
- reportUserFacingError(err, {
688
- domain: "chat_platform",
689
- surface: "final_response",
690
- operation: "replace_final_response",
691
- severity: "error",
692
- platform: options?.platform,
693
- context: {
694
- sessionConversation: options?.sessionConversation,
695
- sessionUuid: options?.sessionUuid,
696
- finalTextLength: finalText.length,
697
- },
698
- });
699
- }
700
- }
701
- async function reportUsageSummary(ctx) {
702
- const { session, runState, responder, platform, model, agentConfig, sessionConversation, sessionUuid, waitForQueue, } = ctx;
703
- const lastAssistantMessage = session.messages
704
- .slice()
705
- .toReversed()
706
- .find((message) => message.role === "assistant" && message.stopReason !== "aborted");
707
- const contextTokens = lastAssistantMessage
708
- ? lastAssistantMessage.usage.input +
709
- lastAssistantMessage.usage.output +
710
- lastAssistantMessage.usage.cacheRead +
711
- lastAssistantMessage.usage.cacheWrite
712
- : 0;
713
- const contextWindow = model.contextWindow || 200000;
714
- const { totalUsage } = runState;
715
- const runMetricAttributes = metricAttributes({
716
- provider: model.provider,
717
- model: agentConfig.model,
718
- channel_id: sessionConversation,
719
- session_id: sessionUuid,
720
- stop_reason: runState.stopReason,
721
- llm_calls: runState.llmCallCount,
722
- });
723
- Sentry.metrics.distribution("agent.run.tokens_in", totalUsage.input, {
724
- attributes: runMetricAttributes,
725
- });
726
- Sentry.metrics.distribution("agent.run.tokens_out", totalUsage.output, {
727
- attributes: runMetricAttributes,
728
- });
729
- Sentry.metrics.distribution("agent.run.cache_read", totalUsage.cacheRead, {
730
- attributes: runMetricAttributes,
731
- });
732
- Sentry.metrics.distribution("agent.run.cache_write", totalUsage.cacheWrite, {
733
- attributes: runMetricAttributes,
734
- });
735
- Sentry.metrics.distribution("agent.run.cost", totalUsage.cost.total, {
736
- attributes: runMetricAttributes,
737
- });
738
- Sentry.metrics.gauge("agent.context.utilization", contextTokens / contextWindow, {
739
- unit: "ratio",
740
- attributes: runMetricAttributes,
741
- });
742
- const summary = log.logUsageSummary(runState.logCtx, runState.totalUsage, contextTokens, contextWindow);
743
- if (platform.diagnostics?.showUsageSummary === true) {
744
- runState.queue.enqueue(() => responder.respondDiagnostic(summary, { style: "muted" }), "usage summary");
745
- await waitForQueue();
746
- }
747
- }
748
- function reloadSessionMessages(session, conversationId) {
749
- const reloaded = session.reloadFromSession();
750
- if (reloaded > 0) {
751
- log.logInfo(`[${conversationId}] Reloaded ${reloaded} messages from context`);
752
- }
753
- }
754
- async function prepareRunContext(params) {
755
- const { message, responder, platform, conversationId, conversationDir, sessionUuid, runState, executor, executionResolver, resolveExecutorForRun, getPathContext, session, setEventContext, setSandboxContext, setUploadFunction, setReactFunction, } = params;
756
- let pathContext = params.pathContext;
757
- const sessionConversation = message.sessionKey.split(":")[0];
758
- await mkdir(join(conversationDir, "scratch"), { recursive: true });
759
- if (executionResolver) {
760
- await resolveExecutorForRun({
761
- platform: platform.name,
762
- userId: message.userId,
763
- conversationId,
764
- });
765
- pathContext = getPathContext();
766
- }
767
- reloadSessionMessages(session, conversationId);
768
- const memory = await getMemory(conversationDir);
769
- const skills = mergeExtensionSkills(loadMikanSkills(conversationDir, pathContext.runtimeWorkspaceRoot), params.extensionSkills ?? []);
770
- const triggerAttribution = resolveTriggerAttribution(message);
771
- const systemPrompt = buildSystemPrompt(pathContext.runtimeWorkspaceRoot, conversationId, message.conversationKind, message.userId, memory, executor.getSandboxConfig(), platform, skills);
772
- session.agent.state.systemPrompt = systemPrompt;
773
- // Cache diagnosis: a byte-stable system prompt is the precondition for
774
- // provider prompt caching. If this hash changes between turns of one
775
- // conversation, something turn-varying leaked into the prompt; if it is
776
- // stable and cacheRead stays 0, the miss is provider-side (e.g. OpenRouter
777
- // routing the model across upstream hosts). This is the base prompt mikan
778
- // builds; a `before_agent_start` extension may still rewrite it per turn
779
- // (logged separately by the runner).
780
- const promptHash = createHash("sha256").update(systemPrompt).digest("hex").slice(0, 8);
781
- log.logInfo(`[${conversationId}] System prompt (base): ${systemPrompt.length} chars, sha ${promptHash}`);
782
- setEventContext({
783
- platform: platform.name,
784
- conversationId,
785
- conversationKind: message.conversationKind,
786
- userId: message.userId,
787
- });
788
- setSandboxContext({ conversationId, userId: message.userId });
789
- setUploadFunction(async (filePath, title) => {
790
- const hostPath = translateAttachPathToHost(filePath, pathContext);
791
- await responder.uploadFile(hostPath, title);
792
- });
793
- // The react tool is available only when the responder supports reactions
794
- // (interactive turns on platforms with reaction support); otherwise unset
795
- // so the tool reports it is unavailable rather than silently no-op'ing.
796
- setReactFunction(responder.react ? async (emoji) => responder.react(emoji) : null);
797
- resetRunState(runState, responder, sessionConversation, message.userName, sessionUuid, triggerAttribution);
798
- const runQueue = createRunQueue(responder, runState);
799
- runState.queue = runQueue.queue;
800
- log.logInfo(`Context sizes - system: ${systemPrompt.length} chars, memory: ${memory.length} chars`);
801
- log.logInfo(`Channels: ${platform.channels.length}, Users: ${platform.users.length}`);
802
- const { userMessage, imageAttachments } = buildPromptPayload(message, pathContext.runtimeWorkspaceRoot, pathContext);
803
- const turnInstructions = buildTurnInstructions(message.id.startsWith("event:"), triggerAttribution, platform.name);
804
- const finalUserMessage = turnInstructions ? `${turnInstructions}\n\n${userMessage}` : userMessage;
805
- await writePromptDebugContext(conversationDir, systemPrompt, session, finalUserMessage, imageAttachments.length);
806
- return {
807
- sessionConversation,
808
- runQueue,
809
- userMessage: finalUserMessage,
810
- imageAttachments,
811
- triggerAttribution,
812
- pathContext,
813
- };
814
- }
815
- function formatAgentActorName(userName, fallback) {
816
- return userName ? `DM:${userName}` : fallback;
817
- }
818
- function sendAgentEvent(payload) {
819
- emitAgentEvent({ source: "mikan", ...payload });
820
- }
821
- // ponytail: additive SSE mirror only; keep responder rendering here until another frontend needs the same stream.
822
- function attachSessionEventHandlers(params) {
823
- const { session, runState, model, agentConfig } = params;
824
- session.subscribe(async (event) => {
825
- if (!runState.responder || !runState.logCtx || !runState.queue)
826
- return;
827
- const { responder, logCtx, queue, pendingTools } = runState;
828
- const baseAttrs = { channel_id: logCtx.conversationId, session_id: logCtx.sessionId };
829
- const agentEventSessionId = logCtx.sessionId ?? logCtx.conversationId;
830
- if (event.type === "tool_execution_start") {
831
- const args = (event.args ?? {});
832
- const label = args.label || event.toolName;
833
- sendAgentEvent({
834
- sessionId: agentEventSessionId,
835
- actorName: formatAgentActorName(logCtx.userName, logCtx.conversationId),
836
- event: {
837
- kind: "toolStart",
838
- toolId: event.toolCallId,
839
- toolName: event.toolName,
840
- input: { label },
841
- },
842
- });
843
- pendingTools.set(event.toolCallId, {
844
- toolName: event.toolName,
845
- args: event.args,
846
- startTime: Date.now(),
847
- });
848
- runState.toolProgress.set(event.toolCallId, {
849
- label: extractToolLabel(event.toolName, event.args),
850
- status: "running",
851
- });
852
- queue.enqueue(() => replaceResponseWithToolProgress(responder, runState), "tool progress update");
853
- addLifecycleBreadcrumb("agent.tool.started", {
854
- tool: event.toolName,
855
- ...baseAttrs,
856
- });
857
- log.logToolStart(logCtx, event.toolName, label, event.args);
858
- return;
859
- }
860
- if (event.type === "tool_execution_end") {
861
- const resultStr = extractToolResultText(event.result);
862
- const pending = pendingTools.get(event.toolCallId);
863
- sendAgentEvent({
864
- sessionId: agentEventSessionId,
865
- actorName: formatAgentActorName(logCtx.userName, logCtx.conversationId),
866
- event: { kind: "toolEnd", toolId: event.toolCallId },
867
- });
868
- const progress = runState.toolProgress.get(event.toolCallId);
869
- if (progress)
870
- progress.status = event.isError ? "error" : "done";
871
- queue.enqueue(() => replaceResponseWithToolProgress(responder, runState), "tool progress update");
872
- pendingTools.delete(event.toolCallId);
873
- const durationMs = pending ? Date.now() - pending.startTime : 0;
874
- Sentry.metrics.count("agent.tool.calls", 1, {
875
- attributes: metricAttributes({
876
- tool: event.toolName,
877
- error: String(event.isError),
878
- ...baseAttrs,
879
- }),
880
- });
881
- Sentry.metrics.distribution("agent.tool.duration", durationMs, {
882
- unit: "millisecond",
883
- attributes: metricAttributes({
884
- tool: event.toolName,
885
- ...baseAttrs,
886
- }),
887
- });
888
- addLifecycleBreadcrumb("agent.tool.completed", {
889
- tool: event.toolName,
890
- error: event.isError,
891
- duration_ms: durationMs,
892
- ...baseAttrs,
893
- });
894
- if (event.isError) {
895
- log.logToolError(logCtx, event.toolName, durationMs, resultStr);
896
- }
897
- else {
898
- log.logToolSuccess(logCtx, event.toolName, durationMs, resultStr);
899
- }
900
- return;
901
- }
902
- if (event.type === "message_start") {
903
- if (event.message.role === "assistant") {
904
- runState.llmCallCount += 1;
905
- sendAgentEvent({
906
- sessionId: agentEventSessionId,
907
- actorName: formatAgentActorName(logCtx.userName, logCtx.conversationId),
908
- event: { kind: "sessionStart" },
909
- });
910
- addLifecycleBreadcrumb("agent.llm.call.started", {
911
- call_index: runState.llmCallCount,
912
- provider: model.provider,
913
- model: agentConfig.model,
914
- ...baseAttrs,
915
- });
916
- log.logResponseStart(logCtx);
917
- }
918
- return;
919
- }
920
- if (event.type === "message_update") {
921
- const assistantMessageEvent = event.assistantMessageEvent;
922
- if (assistantMessageEvent?.type === "text_delta" && assistantMessageEvent.delta) {
923
- sendAgentEvent({
924
- sessionId: agentEventSessionId,
925
- actorName: formatAgentActorName(logCtx.userName, logCtx.conversationId),
926
- event: { kind: "responseDelta", delta: assistantMessageEvent.delta },
927
- });
928
- if (responder.appendResponseDelta) {
929
- queue.enqueue(async () => {
930
- await responder.appendResponseDelta?.(assistantMessageEvent.delta ?? "");
931
- }, "response delta");
932
- }
933
- }
934
- return;
935
- }
936
- if (event.type === "message_end") {
937
- if (event.message.role === "assistant") {
938
- const assistantMsg = event.message;
939
- if (assistantMsg.stopReason) {
940
- runState.stopReason = assistantMsg.stopReason;
941
- }
942
- if (assistantMsg.errorMessage) {
943
- runState.errorMessage = assistantMsg.errorMessage;
944
- }
945
- if (assistantMsg.usage) {
946
- runState.totalUsage.input += assistantMsg.usage.input;
947
- runState.totalUsage.output += assistantMsg.usage.output;
948
- runState.totalUsage.cacheRead += assistantMsg.usage.cacheRead;
949
- runState.totalUsage.cacheWrite += assistantMsg.usage.cacheWrite;
950
- runState.totalUsage.cost.input += assistantMsg.usage.cost.input;
951
- runState.totalUsage.cost.output += assistantMsg.usage.cost.output;
952
- runState.totalUsage.cost.cacheRead += assistantMsg.usage.cost.cacheRead;
953
- runState.totalUsage.cost.cacheWrite += assistantMsg.usage.cost.cacheWrite;
954
- runState.totalUsage.cost.total += assistantMsg.usage.cost.total;
955
- const llmAttributes = metricAttributes({
956
- provider: model.provider,
957
- model: agentConfig.model,
958
- ...baseAttrs,
959
- stop_reason: assistantMsg.stopReason,
960
- error: Boolean(assistantMsg.errorMessage),
961
- });
962
- Sentry.metrics.count("agent.llm.calls", 1, { attributes: llmAttributes });
963
- Sentry.metrics.distribution("agent.llm.tokens_in", assistantMsg.usage.input, {
964
- attributes: llmAttributes,
965
- });
966
- Sentry.metrics.distribution("agent.llm.tokens_out", assistantMsg.usage.output, {
967
- attributes: llmAttributes,
968
- });
969
- if (assistantMsg.usage.cacheRead > 0) {
970
- Sentry.metrics.distribution("agent.llm.cache_read", assistantMsg.usage.cacheRead, {
971
- attributes: llmAttributes,
972
- });
973
- }
974
- if (assistantMsg.usage.cacheWrite > 0) {
975
- Sentry.metrics.distribution("agent.llm.cache_write", assistantMsg.usage.cacheWrite, {
976
- attributes: llmAttributes,
977
- });
978
- }
979
- Sentry.metrics.distribution("agent.llm.cost_per_turn", assistantMsg.usage.cost.total, {
980
- attributes: llmAttributes,
981
- });
982
- addLifecycleBreadcrumb("agent.llm.call.completed", {
983
- call_index: runState.llmCallCount,
984
- provider: model.provider,
985
- model: agentConfig.model,
986
- stop_reason: assistantMsg.stopReason,
987
- error: Boolean(assistantMsg.errorMessage),
988
- input_tokens: assistantMsg.usage.input,
989
- output_tokens: assistantMsg.usage.output,
990
- cost_total_usd: assistantMsg.usage.cost.total,
991
- });
992
- }
993
- const thinkingParts = [];
994
- const textParts = [];
995
- const hasToolCall = assistantMsg.content.some((part) => ["tool_use", "toolCall", "tool-call"].includes(part.type ?? ""));
996
- for (const part of assistantMsg.content) {
997
- if (part.type === "thinking") {
998
- thinkingParts.push(part.thinking);
999
- }
1000
- else if (part.type === "text") {
1001
- textParts.push(part.text);
1002
- }
1003
- }
1004
- const text = textParts.join("\n");
1005
- for (const thinking of thinkingParts) {
1006
- log.logThinking(logCtx, thinking);
1007
- queue.enqueue(() => responder.respond(`_${thinking}_`), "thinking main");
1008
- queue.enqueue(() => responder.respondDiagnostic(`_${thinking}_`), "thinking diagnostic");
1009
- }
1010
- if (text.trim() && !hasToolCall) {
1011
- if (runState.finalResponseHandledByTool)
1012
- return;
1013
- const finalText = appendTriggerAttribution(formatResponseWithToolProgress(text, runState), runState.triggerAttribution);
1014
- log.logResponse(logCtx, text);
1015
- sendAgentEvent({
1016
- sessionId: agentEventSessionId,
1017
- actorName: formatAgentActorName(logCtx.userName, logCtx.conversationId),
1018
- event: { kind: "responseFinal", text: finalText },
1019
- });
1020
- sendAgentEvent({
1021
- sessionId: agentEventSessionId,
1022
- actorName: formatAgentActorName(logCtx.userName, logCtx.conversationId),
1023
- event: { kind: "turnEnd" },
1024
- });
1025
- if (responder.finishResponse) {
1026
- queue.enqueue(async () => {
1027
- await responder.finishResponse?.(finalText);
1028
- }, "response finish");
1029
- }
1030
- else {
1031
- queue.enqueue(() => responder.respond(finalText), "response main");
1032
- }
1033
- }
1034
- }
1035
- return;
1036
- }
1037
- if (event.type === "compaction_start") {
1038
- const text = "_Compacting context..._";
1039
- log.logInfo(`Auto-compaction started (reason: ${event.reason})`);
1040
- sendAgentEvent({
1041
- sessionId: agentEventSessionId,
1042
- actorName: formatAgentActorName(logCtx.userName, logCtx.conversationId),
1043
- event: { kind: "diagnostic", text },
1044
- });
1045
- queue.enqueue(() => responder.respond(text), "compaction start");
1046
- return;
1047
- }
1048
- if (event.type === "compaction_end") {
1049
- if (event.result) {
1050
- log.logInfo(`Auto-compaction complete: ${event.result.tokensBefore} tokens compacted`);
1051
- }
1052
- else if (event.aborted) {
1053
- log.logInfo("Auto-compaction aborted");
1054
- }
1055
- return;
1056
- }
1057
- if (event.type === "auto_retry_start") {
1058
- log.logWarning(`Retrying (${event.attempt}/${event.maxAttempts})`, event.errorMessage);
1059
- sendAgentEvent({
1060
- sessionId: agentEventSessionId,
1061
- actorName: formatAgentActorName(logCtx.userName, logCtx.conversationId),
1062
- event: { kind: "sessionStart" },
1063
- });
1064
- const text = `_Retrying (${event.attempt}/${event.maxAttempts})..._`;
1065
- sendAgentEvent({
1066
- sessionId: agentEventSessionId,
1067
- actorName: formatAgentActorName(logCtx.userName, logCtx.conversationId),
1068
- event: { kind: "diagnostic", text },
1069
- });
1070
- queue.enqueue(() => responder.respond(text), "retry");
1071
- }
1072
- if (event.type === "budget_exceeded") {
1073
- log.logWarning("Run stopped by budget circuit breaker", `${event.reason} (tokens=${event.tokens}, cost=${event.costUsd.toFixed(2)}, calls=${event.llmCalls}, ${event.durationMs}ms)`);
1074
- const text = `_Stopped: run budget exceeded (${event.reason})_`;
1075
- sendAgentEvent({
1076
- sessionId: agentEventSessionId,
1077
- actorName: formatAgentActorName(logCtx.userName, logCtx.conversationId),
1078
- event: { kind: "diagnostic", text },
1079
- });
1080
- queue.enqueue(() => responder.respondDiagnostic(text, { style: "error" }), "budget exceeded");
1081
- }
1082
- });
1083
- }
1084
- function extractToolResultText(result) {
1085
- if (typeof result === "string") {
1086
- return result;
1087
- }
1088
- if (result &&
1089
- typeof result === "object" &&
1090
- "content" in result &&
1091
- Array.isArray(result.content)) {
1092
- const content = result.content;
1093
- const textParts = [];
1094
- for (const part of content) {
1095
- if (part.type === "text" && part.text) {
1096
- textParts.push(part.text);
1097
- }
1098
- }
1099
- if (textParts.length > 0) {
1100
- return textParts.join("\n");
1101
- }
1102
- }
1103
- return JSON.stringify(result);
1104
- }
1105
- /**
1106
- * Create a new PiAgentWrapper for a channel.
1107
- * Sets up the session and subscribes to events once.
1108
- *
1109
- * Runner caching is handled by the caller (channelStates in main.ts).
1110
- * This is a stateless factory function.
1111
- */
1112
- export async function createRunner(sandboxConfig, sessionKey, conversationId, conversationDir, workspaceDir, sessionScope, vaultManager, provisioner, sessionView, platformNotifier, platformReactor) {
1113
- const agentConfig = resolveConversationSettings(conversationDir);
1114
- const workspaceBase = join(conversationDir, "..");
1115
- const { executionResolver, executor, getPathContext, resolveExecutorForRun } = createRunnerExecutionContext(sandboxConfig, vaultManager, provisioner, workspaceDir, workspaceBase);
1116
- let pathContext = getUnresolvedSandboxPathContext(sandboxConfig, workspaceBase);
1117
- // Create tools (per-runner, with per-runner upload function setter)
1118
- const { tools, setUploadFunction, setReactFunction, setEventContext, setSandboxContext } = createMikanTools(executor, workspaceDir, { sandbox: sandboxConfig, provisioner });
1119
- const modelRegistry = MikanModels.create();
1120
- if (modelRegistry.getError()) {
1121
- log.logWarning("models.json load error", modelRegistry.getError());
1122
- }
1123
- const model = resolveConfiguredModel(modelRegistry, agentConfig.provider, agentConfig.model);
1124
- // Initial system prompt (will be updated each run with fresh memory/channels/users/skills)
1125
- const memory = await getMemory(conversationDir);
1126
- const skills = loadMikanSkills(conversationDir, pathContext.runtimeWorkspaceRoot);
1127
- const emptyPlatform = {
1128
- name: "chat",
1129
- formattingGuide: "",
1130
- channels: [],
1131
- users: [],
1132
- };
1133
- const systemPrompt = buildSystemPrompt(pathContext.runtimeWorkspaceRoot, conversationId, "shared", undefined, memory, sandboxConfig, emptyPlatform, skills);
1134
- // Create session manager and settings manager. Top-level/private sessions
1135
- // use the conversation's current pointer; scoped sessions use fixed files.
1136
- // Platform-specific scope behavior is resolved before runner creation.
1137
- const isThread = sessionKey.includes(":");
1138
- const { contextFile, threadRootMessage } = sessionScope;
1139
- const sessionManager = openManagedSession(contextFile, pathContext.runtimeWorkspaceRoot);
1140
- const threadSessionName = buildThreadSessionName(threadRootMessage);
1141
- if (isThread && threadSessionName && sessionManager.getSessionName() !== threadSessionName) {
1142
- sessionManager.appendSessionInfo(threadSessionName);
1143
- }
1144
- const sessionUuid = extractSessionUuid(contextFile);
1145
- const chatSessionManager = new AgentMemoryFileManager();
1146
- const { session, extensionSkills } = await createConfiguredAgentSession({
1147
- conversationId,
1148
- workspaceDir,
1149
- systemPrompt,
1150
- model,
1151
- thinkingLevel: agentConfig.thinkingLevel,
1152
- tools,
1153
- sessionStore: sessionManager,
1154
- models: modelRegistry,
1155
- vaultManager,
1156
- platformNotifier,
1157
- platformReactor,
1158
- });
1159
- // Mutable per-run state - event handler references this
1160
- const runState = createRunState();
1161
- attachSessionEventHandlers({ session, runState, model, agentConfig });
1162
- return {
1163
- syncChatHistory(currentMessageId) {
1164
- chatSessionManager.syncSessionManager({
1165
- conversationDir,
1166
- sessionKey,
1167
- sessionManager,
1168
- currentMessageId,
1169
- });
1170
- },
1171
- async run(message, responder, platform) {
1172
- const prepared = await prepareRunContext({
1173
- message,
1174
- responder,
1175
- platform,
1176
- conversationId,
1177
- conversationDir,
1178
- sessionUuid,
1179
- runState,
1180
- executor,
1181
- executionResolver,
1182
- resolveExecutorForRun,
1183
- getPathContext,
1184
- session,
1185
- extensionSkills,
1186
- setEventContext,
1187
- setSandboxContext,
1188
- setUploadFunction,
1189
- setReactFunction,
1190
- pathContext,
1191
- });
1192
- pathContext = prepared.pathContext;
1193
- if (runState.logCtx) {
1194
- log.logAgentRunStart(runState.logCtx, model.provider, model.id, model.name);
1195
- }
1196
- updateActiveSpanAttribution({
1197
- provider: model.provider,
1198
- model: agentConfig.model,
1199
- channel_id: prepared.sessionConversation,
1200
- session_id: sessionUuid,
1201
- });
1202
- addLifecycleBreadcrumb("agent.prompt.sent", {
1203
- provider: model.provider,
1204
- model: agentConfig.model,
1205
- channel_id: prepared.sessionConversation,
1206
- session_id: sessionUuid,
1207
- attachment_count: message.attachments?.length ?? 0,
1208
- image_attachment_count: prepared.imageAttachments.length,
1209
- });
1210
- sendAgentEvent({
1211
- sessionId: sessionUuid,
1212
- actorName: formatAgentActorName(message.userName, prepared.sessionConversation),
1213
- event: { kind: "sessionStart" },
1214
- });
1215
- // Autonomous (event/trigger) runs get an explicit resource ceiling since
1216
- // no human is watching the loop; interactive turns stay human-gated.
1217
- const isEventRun = message.id.startsWith("event:");
1218
- await session.prompt(prepared.userMessage, {
1219
- ...(prepared.imageAttachments.length > 0 ? { images: prepared.imageAttachments } : {}),
1220
- ...(isEventRun ? { budget: DEFAULT_EVENT_BUDGET } : {}),
1221
- });
1222
- // Wait for queued messages
1223
- await prepared.runQueue.wait();
1224
- const sessionViewTokenStore = sessionView?.tokenStore;
1225
- const sessionViewPortalBaseUrl = sessionView?.portalBaseUrl;
1226
- let sessionViewLink;
1227
- const createSessionViewLink = sessionViewTokenStore && sessionViewPortalBaseUrl
1228
- ? () => {
1229
- if (!sessionViewLink) {
1230
- const token = sessionViewTokenStore.create(platform.name, message.userId, conversationId, message.sessionKey, contextFile, message.userName);
1231
- sessionViewLink = `${sessionViewPortalBaseUrl}/session?token=${token.token}`;
1232
- }
1233
- return sessionViewLink;
1234
- }
1235
- : undefined;
1236
- await finalizeRunResponse(responder, session, runState, {
1237
- triggerAttribution: prepared.triggerAttribution,
1238
- triggerSessionLink: isEventTriggerAttribution(prepared.triggerAttribution)
1239
- ? createSessionViewLink?.()
1240
- : undefined,
1241
- createOverflowLink: createSessionViewLink,
1242
- platform: platform.name,
1243
- model,
1244
- sessionConversation: prepared.sessionConversation,
1245
- sessionUuid,
1246
- });
1247
- await reportUsageSummary({
1248
- session,
1249
- runState,
1250
- responder,
1251
- platform,
1252
- model,
1253
- agentConfig,
1254
- sessionConversation: prepared.sessionConversation,
1255
- sessionUuid,
1256
- waitForQueue: () => prepared.runQueue.wait(),
1257
- });
1258
- // Clear run state
1259
- runState.responder = null;
1260
- runState.logCtx = null;
1261
- runState.queue = null;
1262
- return { stopReason: runState.stopReason, errorMessage: runState.errorMessage };
1263
- },
1264
- abort() {
1265
- session.abort();
1266
- },
1267
- getCurrentStep() {
1268
- const pending = runState.pendingTools;
1269
- if (pending.size === 0)
1270
- return undefined;
1271
- // Get the first pending tool
1272
- const first = pending.values().next().value;
1273
- if (!first)
1274
- return undefined;
1275
- return {
1276
- toolName: first.toolName,
1277
- label: first.args?.label,
1278
- };
1279
- },
1280
- };
1281
- }
1282
- export function translateRuntimePathToHost(runtimePath, pathContext) {
1283
- return pathContext.runtimeToHostPath?.(runtimePath) ?? runtimePath;
1284
- }
1285
- export function translateAttachPathToHost(filePath, pathContext) {
1286
- const runtimePath = posix.isAbsolute(filePath)
1287
- ? filePath
1288
- : posix.join(pathContext.runtimeWorkspaceRoot, filePath);
1289
- return translateRuntimePathToHost(runtimePath, pathContext);
1290
- }
1291
- //# sourceMappingURL=agent.js.map