@geminixiang/mikan 1.0.0-beta.4 → 1.0.0-beta.41

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 (661) hide show
  1. package/CHANGELOG.md +714 -0
  2. package/README.md +99 -36
  3. package/dist/adapter.d.ts +11 -1
  4. package/dist/adapter.d.ts.map +1 -1
  5. package/dist/adapter.js +18 -1
  6. package/dist/adapter.js.map +1 -1
  7. package/dist/adapters/discord/bot.d.ts +6 -7
  8. package/dist/adapters/discord/bot.d.ts.map +1 -1
  9. package/dist/adapters/discord/bot.js +88 -122
  10. package/dist/adapters/discord/bot.js.map +1 -1
  11. package/dist/adapters/discord/components.d.ts +33 -0
  12. package/dist/adapters/discord/components.d.ts.map +1 -0
  13. package/dist/adapters/discord/components.js +32 -0
  14. package/dist/adapters/discord/components.js.map +1 -0
  15. package/dist/adapters/discord/context.d.ts +3 -1
  16. package/dist/adapters/discord/context.d.ts.map +1 -1
  17. package/dist/adapters/discord/context.js +66 -217
  18. package/dist/adapters/discord/context.js.map +1 -1
  19. package/dist/adapters/discord/format.d.ts +3 -0
  20. package/dist/adapters/discord/format.d.ts.map +1 -0
  21. package/dist/adapters/discord/format.js +86 -0
  22. package/dist/adapters/discord/format.js.map +1 -0
  23. package/dist/adapters/github/bot.d.ts +89 -0
  24. package/dist/adapters/github/bot.d.ts.map +1 -0
  25. package/dist/adapters/github/bot.js +653 -0
  26. package/dist/adapters/github/bot.js.map +1 -0
  27. package/dist/adapters/github/client.d.ts +122 -0
  28. package/dist/adapters/github/client.d.ts.map +1 -0
  29. package/dist/adapters/github/client.js +314 -0
  30. package/dist/adapters/github/client.js.map +1 -0
  31. package/dist/adapters/github/cloudbuild.d.ts +19 -0
  32. package/dist/adapters/github/cloudbuild.d.ts.map +1 -0
  33. package/dist/adapters/github/cloudbuild.js +71 -0
  34. package/dist/adapters/github/cloudbuild.js.map +1 -0
  35. package/dist/adapters/github/context.d.ts +12 -0
  36. package/dist/adapters/github/context.d.ts.map +1 -0
  37. package/dist/adapters/github/context.js +101 -0
  38. package/dist/adapters/github/context.js.map +1 -0
  39. package/dist/adapters/github/gcp-auth.d.ts +28 -0
  40. package/dist/adapters/github/gcp-auth.d.ts.map +1 -0
  41. package/dist/adapters/github/gcp-auth.js +196 -0
  42. package/dist/adapters/github/gcp-auth.js.map +1 -0
  43. package/dist/adapters/github/github-ops.d.ts +91 -0
  44. package/dist/adapters/github/github-ops.d.ts.map +1 -0
  45. package/dist/adapters/github/github-ops.js +406 -0
  46. package/dist/adapters/github/github-ops.js.map +1 -0
  47. package/dist/adapters/github/ids.d.ts +34 -0
  48. package/dist/adapters/github/ids.d.ts.map +1 -0
  49. package/dist/adapters/github/ids.js +57 -0
  50. package/dist/adapters/github/ids.js.map +1 -0
  51. package/dist/adapters/github/repo.d.ts +33 -0
  52. package/dist/adapters/github/repo.d.ts.map +1 -0
  53. package/dist/adapters/github/repo.js +141 -0
  54. package/dist/adapters/github/repo.js.map +1 -0
  55. package/dist/adapters/github/tool-pack.d.ts +14 -0
  56. package/dist/adapters/github/tool-pack.d.ts.map +1 -0
  57. package/dist/adapters/github/tool-pack.js +56 -0
  58. package/dist/adapters/github/tool-pack.js.map +1 -0
  59. package/dist/adapters/github/tools/checks.d.ts +19 -0
  60. package/dist/adapters/github/tools/checks.d.ts.map +1 -0
  61. package/dist/adapters/github/tools/checks.js +105 -0
  62. package/dist/adapters/github/tools/checks.js.map +1 -0
  63. package/dist/adapters/github/tools/issue.d.ts +21 -0
  64. package/dist/adapters/github/tools/issue.d.ts.map +1 -0
  65. package/dist/adapters/github/tools/issue.js +48 -0
  66. package/dist/adapters/github/tools/issue.js.map +1 -0
  67. package/dist/adapters/github/tools/pr.d.ts +22 -0
  68. package/dist/adapters/github/tools/pr.d.ts.map +1 -0
  69. package/dist/adapters/github/tools/pr.js +48 -0
  70. package/dist/adapters/github/tools/pr.js.map +1 -0
  71. package/dist/adapters/github/tools/read.d.ts +21 -0
  72. package/dist/adapters/github/tools/read.d.ts.map +1 -0
  73. package/dist/adapters/github/tools/read.js +141 -0
  74. package/dist/adapters/github/tools/read.js.map +1 -0
  75. package/dist/adapters/github/tools/review-reply.d.ts +17 -0
  76. package/dist/adapters/github/tools/review-reply.d.ts.map +1 -0
  77. package/dist/adapters/github/tools/review-reply.js +38 -0
  78. package/dist/adapters/github/tools/review-reply.js.map +1 -0
  79. package/dist/adapters/github/tools/sync.d.ts +17 -0
  80. package/dist/adapters/github/tools/sync.d.ts.map +1 -0
  81. package/dist/adapters/github/tools/sync.js +34 -0
  82. package/dist/adapters/github/tools/sync.js.map +1 -0
  83. package/dist/adapters/github/types.d.ts +373 -0
  84. package/dist/adapters/github/types.d.ts.map +1 -0
  85. package/dist/adapters/github/types.js +2 -0
  86. package/dist/adapters/github/types.js.map +1 -0
  87. package/dist/adapters/intake.d.ts +16 -5
  88. package/dist/adapters/intake.d.ts.map +1 -1
  89. package/dist/adapters/intake.js +86 -23
  90. package/dist/adapters/intake.js.map +1 -1
  91. package/dist/adapters/markdown-tables.d.ts +37 -0
  92. package/dist/adapters/markdown-tables.d.ts.map +1 -0
  93. package/dist/adapters/markdown-tables.js +164 -0
  94. package/dist/adapters/markdown-tables.js.map +1 -0
  95. package/dist/adapters/progressive-renderer.d.ts +7 -0
  96. package/dist/adapters/progressive-renderer.d.ts.map +1 -0
  97. package/dist/adapters/progressive-renderer.js +440 -0
  98. package/dist/adapters/progressive-renderer.js.map +1 -0
  99. package/dist/adapters/shared.d.ts +23 -10
  100. package/dist/adapters/shared.d.ts.map +1 -1
  101. package/dist/adapters/shared.js +60 -22
  102. package/dist/adapters/shared.js.map +1 -1
  103. package/dist/adapters/slack/assistant.d.ts +101 -0
  104. package/dist/adapters/slack/assistant.d.ts.map +1 -0
  105. package/dist/adapters/slack/assistant.js +204 -0
  106. package/dist/adapters/slack/assistant.js.map +1 -0
  107. package/dist/adapters/slack/blocks.d.ts +14 -0
  108. package/dist/adapters/slack/blocks.d.ts.map +1 -1
  109. package/dist/adapters/slack/blocks.js +105 -147
  110. package/dist/adapters/slack/blocks.js.map +1 -1
  111. package/dist/adapters/slack/bot.d.ts +95 -13
  112. package/dist/adapters/slack/bot.d.ts.map +1 -1
  113. package/dist/adapters/slack/bot.js +545 -211
  114. package/dist/adapters/slack/bot.js.map +1 -1
  115. package/dist/adapters/slack/context.d.ts +3 -1
  116. package/dist/adapters/slack/context.d.ts.map +1 -1
  117. package/dist/adapters/slack/context.js +11 -17
  118. package/dist/adapters/slack/context.js.map +1 -1
  119. package/dist/adapters/slack/response-lifecycle.d.ts.map +1 -1
  120. package/dist/adapters/slack/response-lifecycle.js +197 -323
  121. package/dist/adapters/slack/response-lifecycle.js.map +1 -1
  122. package/dist/adapters/slack/session.d.ts.map +1 -1
  123. package/dist/adapters/slack/session.js +7 -11
  124. package/dist/adapters/slack/session.js.map +1 -1
  125. package/dist/adapters/slack/stream-limits.d.ts +35 -0
  126. package/dist/adapters/slack/stream-limits.d.ts.map +1 -0
  127. package/dist/adapters/slack/stream-limits.js +56 -0
  128. package/dist/adapters/slack/stream-limits.js.map +1 -0
  129. package/dist/adapters/slack/tool-pack.d.ts +11 -0
  130. package/dist/adapters/slack/tool-pack.d.ts.map +1 -0
  131. package/dist/adapters/slack/tool-pack.js +45 -0
  132. package/dist/adapters/slack/tool-pack.js.map +1 -0
  133. package/dist/adapters/slack/tools/attach.js +1 -1
  134. package/dist/adapters/slack/tools/attach.js.map +1 -1
  135. package/dist/adapters/slack/tools/blockkit.d.ts +14 -0
  136. package/dist/adapters/slack/tools/blockkit.d.ts.map +1 -0
  137. package/dist/adapters/slack/tools/blockkit.js +106 -0
  138. package/dist/adapters/slack/tools/blockkit.js.map +1 -0
  139. package/dist/adapters/slack/types.d.ts +40 -2
  140. package/dist/adapters/slack/types.d.ts.map +1 -1
  141. package/dist/adapters/slack/types.js.map +1 -1
  142. package/dist/adapters/telegram/bot.d.ts +8 -9
  143. package/dist/adapters/telegram/bot.d.ts.map +1 -1
  144. package/dist/adapters/telegram/bot.js +115 -163
  145. package/dist/adapters/telegram/bot.js.map +1 -1
  146. package/dist/adapters/telegram/context.d.ts +2 -0
  147. package/dist/adapters/telegram/context.d.ts.map +1 -1
  148. package/dist/adapters/telegram/context.js +53 -188
  149. package/dist/adapters/telegram/context.js.map +1 -1
  150. package/dist/adapters/types.d.ts +132 -12
  151. package/dist/adapters/types.d.ts.map +1 -1
  152. package/dist/adapters/types.js.map +1 -1
  153. package/dist/agent-events.d.ts +3 -2
  154. package/dist/agent-events.d.ts.map +1 -1
  155. package/dist/agent-events.js +19 -1
  156. package/dist/agent-events.js.map +1 -1
  157. package/dist/agent.d.ts +14 -19
  158. package/dist/agent.d.ts.map +1 -1
  159. package/dist/agent.js +841 -298
  160. package/dist/agent.js.map +1 -1
  161. package/dist/cli/arg-grammar.d.ts +25 -0
  162. package/dist/cli/arg-grammar.d.ts.map +1 -0
  163. package/dist/cli/arg-grammar.js +61 -0
  164. package/dist/cli/arg-grammar.js.map +1 -0
  165. package/dist/cli/boot.d.ts +5 -0
  166. package/dist/cli/boot.d.ts.map +1 -0
  167. package/dist/cli/boot.js +117 -0
  168. package/dist/cli/boot.js.map +1 -0
  169. package/dist/cli/download.d.ts.map +1 -0
  170. package/dist/{download.js → cli/download.js} +2 -0
  171. package/dist/cli/download.js.map +1 -0
  172. package/dist/cli/ext-dev.d.ts +2 -0
  173. package/dist/cli/ext-dev.d.ts.map +1 -0
  174. package/dist/cli/ext-dev.js +188 -0
  175. package/dist/cli/ext-dev.js.map +1 -0
  176. package/dist/cli/ext.d.ts +2 -0
  177. package/dist/cli/ext.d.ts.map +1 -0
  178. package/dist/cli/ext.js +324 -0
  179. package/dist/cli/ext.js.map +1 -0
  180. package/dist/cli/office.d.ts +2 -0
  181. package/dist/cli/office.d.ts.map +1 -0
  182. package/dist/cli/office.js +91 -0
  183. package/dist/cli/office.js.map +1 -0
  184. package/dist/cli/types.d.ts +16 -0
  185. package/dist/cli/types.d.ts.map +1 -0
  186. package/dist/cli/types.js +2 -0
  187. package/dist/cli/types.js.map +1 -0
  188. package/dist/commands/admin.d.ts.map +1 -1
  189. package/dist/commands/admin.js +3 -2
  190. package/dist/commands/admin.js.map +1 -1
  191. package/dist/commands/auto-reply.d.ts.map +1 -1
  192. package/dist/commands/auto-reply.js +5 -9
  193. package/dist/commands/auto-reply.js.map +1 -1
  194. package/dist/commands/extensions.d.ts +18 -6
  195. package/dist/commands/extensions.d.ts.map +1 -1
  196. package/dist/commands/extensions.js +64 -14
  197. package/dist/commands/extensions.js.map +1 -1
  198. package/dist/commands/login.d.ts +2 -1
  199. package/dist/commands/login.d.ts.map +1 -1
  200. package/dist/commands/login.js +40 -5
  201. package/dist/commands/login.js.map +1 -1
  202. package/dist/commands/manifest.d.ts +37 -0
  203. package/dist/commands/manifest.d.ts.map +1 -0
  204. package/dist/commands/manifest.js +151 -0
  205. package/dist/commands/manifest.js.map +1 -0
  206. package/dist/commands/model.d.ts +2 -3
  207. package/dist/commands/model.d.ts.map +1 -1
  208. package/dist/commands/model.js +63 -24
  209. package/dist/commands/model.js.map +1 -1
  210. package/dist/commands/new.d.ts.map +1 -1
  211. package/dist/commands/new.js +15 -3
  212. package/dist/commands/new.js.map +1 -1
  213. package/dist/commands/registry.d.ts +2 -2
  214. package/dist/commands/registry.d.ts.map +1 -1
  215. package/dist/commands/registry.js +1 -2
  216. package/dist/commands/registry.js.map +1 -1
  217. package/dist/commands/sandbox.d.ts.map +1 -1
  218. package/dist/commands/sandbox.js +83 -33
  219. package/dist/commands/sandbox.js.map +1 -1
  220. package/dist/commands/session-view.d.ts.map +1 -1
  221. package/dist/commands/session-view.js +6 -3
  222. package/dist/commands/session-view.js.map +1 -1
  223. package/dist/commands/types.d.ts +79 -7
  224. package/dist/commands/types.d.ts.map +1 -1
  225. package/dist/commands/types.js.map +1 -1
  226. package/dist/config.d.ts +23 -8
  227. package/dist/config.d.ts.map +1 -1
  228. package/dist/config.js +222 -135
  229. package/dist/config.js.map +1 -1
  230. package/dist/env-manifest.d.ts +30 -0
  231. package/dist/env-manifest.d.ts.map +1 -0
  232. package/dist/env-manifest.js +233 -0
  233. package/dist/env-manifest.js.map +1 -0
  234. package/dist/events.d.ts.map +1 -1
  235. package/dist/events.js +20 -81
  236. package/dist/events.js.map +1 -1
  237. package/dist/execution-resolver.d.ts +7 -8
  238. package/dist/execution-resolver.d.ts.map +1 -1
  239. package/dist/execution-resolver.js +106 -110
  240. package/dist/execution-resolver.js.map +1 -1
  241. package/dist/extension-schedules.d.ts +31 -0
  242. package/dist/extension-schedules.d.ts.map +1 -0
  243. package/dist/extension-schedules.js +229 -0
  244. package/dist/extension-schedules.js.map +1 -0
  245. package/dist/harness/auth.d.ts +2 -1
  246. package/dist/harness/auth.d.ts.map +1 -1
  247. package/dist/harness/auth.js +11 -5
  248. package/dist/harness/auth.js.map +1 -1
  249. package/dist/harness/event-format.d.ts +27 -0
  250. package/dist/harness/event-format.d.ts.map +1 -0
  251. package/dist/harness/event-format.js +160 -0
  252. package/dist/harness/event-format.js.map +1 -0
  253. package/dist/harness/extensions/loader.d.ts +27 -49
  254. package/dist/harness/extensions/loader.d.ts.map +1 -1
  255. package/dist/harness/extensions/loader.js +486 -130
  256. package/dist/harness/extensions/loader.js.map +1 -1
  257. package/dist/harness/extensions/registry.d.ts +107 -2
  258. package/dist/harness/extensions/registry.d.ts.map +1 -1
  259. package/dist/harness/extensions/registry.js +316 -0
  260. package/dist/harness/extensions/registry.js.map +1 -1
  261. package/dist/harness/extensions/types.d.ts +482 -42
  262. package/dist/harness/extensions/types.d.ts.map +1 -1
  263. package/dist/harness/extensions/types.js.map +1 -1
  264. package/dist/harness/index.d.ts +18 -8
  265. package/dist/harness/index.d.ts.map +1 -1
  266. package/dist/harness/index.js +7 -4
  267. package/dist/harness/index.js.map +1 -1
  268. package/dist/harness/models.d.ts +7 -4
  269. package/dist/harness/models.d.ts.map +1 -1
  270. package/dist/harness/models.js +46 -24
  271. package/dist/harness/models.js.map +1 -1
  272. package/dist/harness/runner.d.ts +50 -54
  273. package/dist/harness/runner.d.ts.map +1 -1
  274. package/dist/harness/runner.js +232 -46
  275. package/dist/harness/runner.js.map +1 -1
  276. package/dist/harness/session-store.d.ts +11 -5
  277. package/dist/harness/session-store.d.ts.map +1 -1
  278. package/dist/harness/session-store.js +141 -36
  279. package/dist/harness/session-store.js.map +1 -1
  280. package/dist/harness/settings.d.ts +2 -20
  281. package/dist/harness/settings.d.ts.map +1 -1
  282. package/dist/harness/settings.js +12 -1
  283. package/dist/harness/settings.js.map +1 -1
  284. package/dist/harness/skills.d.ts +10 -29
  285. package/dist/harness/skills.d.ts.map +1 -1
  286. package/dist/harness/skills.js +48 -6
  287. package/dist/harness/skills.js.map +1 -1
  288. package/dist/harness/subagent-profiles.d.ts +8 -0
  289. package/dist/harness/subagent-profiles.d.ts.map +1 -0
  290. package/dist/harness/subagent-profiles.js +299 -0
  291. package/dist/harness/subagent-profiles.js.map +1 -0
  292. package/dist/harness/subagent-runner.d.ts +45 -0
  293. package/dist/harness/subagent-runner.d.ts.map +1 -0
  294. package/dist/harness/subagent-runner.js +680 -0
  295. package/dist/harness/subagent-runner.js.map +1 -0
  296. package/dist/harness/types.d.ts +267 -1
  297. package/dist/harness/types.d.ts.map +1 -1
  298. package/dist/harness/types.js.map +1 -1
  299. package/dist/harness/usage.d.ts +6 -0
  300. package/dist/harness/usage.d.ts.map +1 -0
  301. package/dist/harness/usage.js +32 -0
  302. package/dist/harness/usage.js.map +1 -0
  303. package/dist/index.d.ts +36 -8
  304. package/dist/index.d.ts.map +1 -1
  305. package/dist/index.js +22 -6
  306. package/dist/index.js.map +1 -1
  307. package/dist/main.js +391 -127
  308. package/dist/main.js.map +1 -1
  309. package/dist/observability/instrument.js +7 -5
  310. package/dist/observability/instrument.js.map +1 -1
  311. package/dist/observability/sentry.d.ts +2 -0
  312. package/dist/observability/sentry.d.ts.map +1 -1
  313. package/dist/observability/sentry.js +10 -2
  314. package/dist/observability/sentry.js.map +1 -1
  315. package/dist/office/address.d.ts +31 -0
  316. package/dist/office/address.d.ts.map +1 -0
  317. package/dist/office/address.js +113 -0
  318. package/dist/office/address.js.map +1 -0
  319. package/dist/office/index.d.ts +11 -0
  320. package/dist/office/index.d.ts.map +1 -0
  321. package/dist/office/index.js +11 -0
  322. package/dist/office/index.js.map +1 -0
  323. package/dist/office/layout.d.ts +27 -0
  324. package/dist/office/layout.d.ts.map +1 -0
  325. package/dist/office/layout.js +97 -0
  326. package/dist/office/layout.js.map +1 -0
  327. package/dist/office/migration.d.ts +44 -0
  328. package/dist/office/migration.d.ts.map +1 -0
  329. package/dist/office/migration.js +255 -0
  330. package/dist/office/migration.js.map +1 -0
  331. package/dist/office/registry.d.ts +75 -0
  332. package/dist/office/registry.d.ts.map +1 -0
  333. package/dist/office/registry.js +646 -0
  334. package/dist/office/registry.js.map +1 -0
  335. package/dist/office/types.d.ts +71 -0
  336. package/dist/office/types.d.ts.map +1 -0
  337. package/dist/office/types.js +2 -0
  338. package/dist/office/types.js.map +1 -0
  339. package/dist/packages/admin.d.ts +17 -0
  340. package/dist/packages/admin.d.ts.map +1 -0
  341. package/dist/packages/admin.js +98 -0
  342. package/dist/packages/admin.js.map +1 -0
  343. package/dist/packages/index.d.ts +6 -0
  344. package/dist/packages/index.d.ts.map +1 -0
  345. package/dist/packages/index.js +6 -0
  346. package/dist/packages/index.js.map +1 -0
  347. package/dist/packages/inspect.d.ts +11 -0
  348. package/dist/packages/inspect.d.ts.map +1 -0
  349. package/dist/packages/inspect.js +98 -0
  350. package/dist/packages/inspect.js.map +1 -0
  351. package/dist/packages/materialize.d.ts +40 -0
  352. package/dist/packages/materialize.d.ts.map +1 -0
  353. package/dist/packages/materialize.js +297 -0
  354. package/dist/packages/materialize.js.map +1 -0
  355. package/dist/packages/resolve.d.ts +25 -0
  356. package/dist/packages/resolve.d.ts.map +1 -0
  357. package/dist/packages/resolve.js +208 -0
  358. package/dist/packages/resolve.js.map +1 -0
  359. package/dist/packages/source.d.ts +39 -0
  360. package/dist/packages/source.d.ts.map +1 -0
  361. package/dist/packages/source.js +189 -0
  362. package/dist/packages/source.js.map +1 -0
  363. package/dist/packages/types.d.ts +104 -0
  364. package/dist/packages/types.d.ts.map +1 -0
  365. package/dist/packages/types.js +2 -0
  366. package/dist/packages/types.js.map +1 -0
  367. package/dist/provisioner.d.ts +66 -0
  368. package/dist/provisioner.d.ts.map +1 -1
  369. package/dist/provisioner.js +335 -13
  370. package/dist/provisioner.js.map +1 -1
  371. package/dist/runtime/conversation-runtime.d.ts +1 -1
  372. package/dist/runtime/conversation-runtime.d.ts.map +1 -1
  373. package/dist/runtime/conversation-runtime.js +562 -118
  374. package/dist/runtime/conversation-runtime.js.map +1 -1
  375. package/dist/runtime/session-lifecycle.d.ts +38 -0
  376. package/dist/runtime/session-lifecycle.d.ts.map +1 -0
  377. package/dist/runtime/session-lifecycle.js +193 -0
  378. package/dist/runtime/session-lifecycle.js.map +1 -0
  379. package/dist/runtime/types.d.ts +66 -7
  380. package/dist/runtime/types.d.ts.map +1 -1
  381. package/dist/runtime/types.js.map +1 -1
  382. package/dist/sandbox/cloudflare.d.ts +3 -0
  383. package/dist/sandbox/cloudflare.d.ts.map +1 -1
  384. package/dist/sandbox/cloudflare.js +13 -1
  385. package/dist/sandbox/cloudflare.js.map +1 -1
  386. package/dist/sandbox/container.d.ts +4 -0
  387. package/dist/sandbox/container.d.ts.map +1 -1
  388. package/dist/sandbox/container.js +13 -3
  389. package/dist/sandbox/container.js.map +1 -1
  390. package/dist/sandbox/firecracker.d.ts +3 -0
  391. package/dist/sandbox/firecracker.d.ts.map +1 -1
  392. package/dist/sandbox/firecracker.js +13 -2
  393. package/dist/sandbox/firecracker.js.map +1 -1
  394. package/dist/sandbox/gondolin.d.ts +57 -0
  395. package/dist/sandbox/gondolin.d.ts.map +1 -0
  396. package/dist/sandbox/gondolin.js +764 -0
  397. package/dist/sandbox/gondolin.js.map +1 -0
  398. package/dist/sandbox/host.d.ts +3 -0
  399. package/dist/sandbox/host.d.ts.map +1 -1
  400. package/dist/sandbox/host.js +18 -3
  401. package/dist/sandbox/host.js.map +1 -1
  402. package/dist/sandbox/identity.d.ts +44 -0
  403. package/dist/sandbox/identity.d.ts.map +1 -0
  404. package/dist/sandbox/identity.js +68 -0
  405. package/dist/sandbox/identity.js.map +1 -0
  406. package/dist/sandbox/image.d.ts.map +1 -1
  407. package/dist/sandbox/image.js +2 -0
  408. package/dist/sandbox/image.js.map +1 -1
  409. package/dist/sandbox/index.d.ts +17 -4
  410. package/dist/sandbox/index.d.ts.map +1 -1
  411. package/dist/sandbox/index.js +37 -3
  412. package/dist/sandbox/index.js.map +1 -1
  413. package/dist/sandbox/types.d.ts +65 -1
  414. package/dist/sandbox/types.d.ts.map +1 -1
  415. package/dist/sandbox/types.js.map +1 -1
  416. package/dist/sandbox/utils.d.ts +14 -0
  417. package/dist/sandbox/utils.d.ts.map +1 -1
  418. package/dist/sandbox/utils.js +68 -1
  419. package/dist/sandbox/utils.js.map +1 -1
  420. package/dist/sessions/chat-history-sync.d.ts +25 -0
  421. package/dist/sessions/chat-history-sync.d.ts.map +1 -0
  422. package/dist/sessions/{agent-memory-file-manager.js → chat-history-sync.js} +135 -131
  423. package/dist/sessions/chat-history-sync.js.map +1 -0
  424. package/dist/sessions/conversation-log.d.ts +9 -0
  425. package/dist/sessions/conversation-log.d.ts.map +1 -0
  426. package/dist/sessions/conversation-log.js +50 -0
  427. package/dist/sessions/conversation-log.js.map +1 -0
  428. package/dist/sessions/history-line.d.ts +29 -0
  429. package/dist/sessions/history-line.d.ts.map +1 -0
  430. package/dist/sessions/history-line.js +45 -0
  431. package/dist/sessions/history-line.js.map +1 -0
  432. package/dist/sessions/rotation.d.ts +2 -0
  433. package/dist/sessions/rotation.d.ts.map +1 -0
  434. package/dist/sessions/rotation.js +39 -0
  435. package/dist/sessions/rotation.js.map +1 -0
  436. package/dist/sessions/session-key.d.ts +33 -0
  437. package/dist/sessions/session-key.d.ts.map +1 -0
  438. package/dist/sessions/session-key.js +115 -0
  439. package/dist/sessions/session-key.js.map +1 -0
  440. package/dist/sessions/store.d.ts +15 -7
  441. package/dist/sessions/store.d.ts.map +1 -1
  442. package/dist/sessions/store.js +127 -36
  443. package/dist/sessions/store.js.map +1 -1
  444. package/dist/sessions/types.d.ts +19 -5
  445. package/dist/sessions/types.d.ts.map +1 -1
  446. package/dist/sessions/types.js.map +1 -1
  447. package/dist/settings-mutation.d.ts +40 -0
  448. package/dist/settings-mutation.d.ts.map +1 -0
  449. package/dist/settings-mutation.js +61 -0
  450. package/dist/settings-mutation.js.map +1 -0
  451. package/dist/subagent-progress.d.ts +39 -0
  452. package/dist/subagent-progress.d.ts.map +1 -0
  453. package/dist/subagent-progress.js +225 -0
  454. package/dist/subagent-progress.js.map +1 -0
  455. package/dist/tools/bash.d.ts +3 -1
  456. package/dist/tools/bash.d.ts.map +1 -1
  457. package/dist/tools/bash.js +26 -18
  458. package/dist/tools/bash.js.map +1 -1
  459. package/dist/tools/edit.d.ts.map +1 -1
  460. package/dist/tools/edit.js +14 -13
  461. package/dist/tools/edit.js.map +1 -1
  462. package/dist/tools/event.d.ts +1 -1
  463. package/dist/tools/event.d.ts.map +1 -1
  464. package/dist/tools/event.js +58 -45
  465. package/dist/tools/event.js.map +1 -1
  466. package/dist/tools/generate-image.d.ts +23 -0
  467. package/dist/tools/generate-image.d.ts.map +1 -0
  468. package/dist/tools/generate-image.js +65 -0
  469. package/dist/tools/generate-image.js.map +1 -0
  470. package/dist/tools/host-fn-tool.d.ts +21 -0
  471. package/dist/tools/host-fn-tool.d.ts.map +1 -0
  472. package/dist/tools/host-fn-tool.js +32 -0
  473. package/dist/tools/host-fn-tool.js.map +1 -0
  474. package/dist/tools/index.d.ts +19 -2
  475. package/dist/tools/index.d.ts.map +1 -1
  476. package/dist/tools/index.js +25 -2
  477. package/dist/tools/index.js.map +1 -1
  478. package/dist/tools/react.d.ts +15 -0
  479. package/dist/tools/react.d.ts.map +1 -0
  480. package/dist/tools/react.js +29 -0
  481. package/dist/tools/react.js.map +1 -0
  482. package/dist/tools/read.d.ts +1 -0
  483. package/dist/tools/read.d.ts.map +1 -1
  484. package/dist/tools/read.js +39 -33
  485. package/dist/tools/read.js.map +1 -1
  486. package/dist/tools/sandbox.d.ts +2 -2
  487. package/dist/tools/sandbox.d.ts.map +1 -1
  488. package/dist/tools/sandbox.js +14 -9
  489. package/dist/tools/sandbox.js.map +1 -1
  490. package/dist/tools/subagent-slots.d.ts +28 -0
  491. package/dist/tools/subagent-slots.d.ts.map +1 -0
  492. package/dist/tools/subagent-slots.js +72 -0
  493. package/dist/tools/subagent-slots.js.map +1 -0
  494. package/dist/tools/subagent.d.ts +61 -0
  495. package/dist/tools/subagent.d.ts.map +1 -0
  496. package/dist/tools/subagent.js +434 -0
  497. package/dist/tools/subagent.js.map +1 -0
  498. package/dist/tools/types.d.ts +40 -32
  499. package/dist/tools/types.d.ts.map +1 -1
  500. package/dist/tools/types.js.map +1 -1
  501. package/dist/tools/write.d.ts.map +1 -1
  502. package/dist/tools/write.js +2 -8
  503. package/dist/tools/write.js.map +1 -1
  504. package/dist/trigger.d.ts +2 -1
  505. package/dist/trigger.d.ts.map +1 -1
  506. package/dist/trigger.js +6 -9
  507. package/dist/trigger.js.map +1 -1
  508. package/dist/types.d.ts +411 -59
  509. package/dist/types.d.ts.map +1 -1
  510. package/dist/types.js +2 -2
  511. package/dist/types.js.map +1 -1
  512. package/dist/utils/file-guards.d.ts +9 -0
  513. package/dist/utils/file-guards.d.ts.map +1 -1
  514. package/dist/utils/file-guards.js +44 -1
  515. package/dist/utils/file-guards.js.map +1 -1
  516. package/dist/vault/disabled.d.ts +9 -0
  517. package/dist/vault/disabled.d.ts.map +1 -0
  518. package/dist/vault/disabled.js +25 -0
  519. package/dist/vault/disabled.js.map +1 -0
  520. package/dist/vault/index.d.ts +45 -2
  521. package/dist/vault/index.d.ts.map +1 -1
  522. package/dist/vault/index.js +127 -36
  523. package/dist/vault/index.js.map +1 -1
  524. package/dist/vault/types.d.ts +6 -2
  525. package/dist/vault/types.d.ts.map +1 -1
  526. package/dist/vault/types.js.map +1 -1
  527. package/dist/web/admin/portal.d.ts +31 -3
  528. package/dist/web/admin/portal.d.ts.map +1 -1
  529. package/dist/web/admin/portal.js +850 -345
  530. package/dist/web/admin/portal.js.map +1 -1
  531. package/dist/web/admin/provider-models.js +1 -1
  532. package/dist/web/admin/provider-models.js.map +1 -1
  533. package/dist/web/admin/types.d.ts +23 -3
  534. package/dist/web/admin/types.d.ts.map +1 -1
  535. package/dist/web/admin/types.js.map +1 -1
  536. package/dist/web/login/oauth.d.ts +2 -3
  537. package/dist/web/login/oauth.d.ts.map +1 -1
  538. package/dist/web/login/oauth.js +1 -32
  539. package/dist/web/login/oauth.js.map +1 -1
  540. package/dist/web/login/portal.d.ts +1 -1
  541. package/dist/web/login/portal.d.ts.map +1 -1
  542. package/dist/web/login/portal.js +13 -36
  543. package/dist/web/login/portal.js.map +1 -1
  544. package/dist/web/login/types.d.ts +0 -11
  545. package/dist/web/login/types.d.ts.map +1 -1
  546. package/dist/web/login/types.js.map +1 -1
  547. package/dist/web/portal-shell.d.ts +21 -0
  548. package/dist/web/portal-shell.d.ts.map +1 -0
  549. package/dist/{portal-shell.js → web/portal-shell.js} +67 -2
  550. package/dist/web/portal-shell.js.map +1 -0
  551. package/dist/web/server.d.ts +3 -2
  552. package/dist/web/server.d.ts.map +1 -1
  553. package/dist/web/server.js +11 -4
  554. package/dist/web/server.js.map +1 -1
  555. package/dist/web/session-view/portal.d.ts +1 -1
  556. package/dist/web/session-view/portal.d.ts.map +1 -1
  557. package/dist/web/session-view/portal.js +37 -28
  558. package/dist/web/session-view/portal.js.map +1 -1
  559. package/dist/web/session-view/service.d.ts +1 -1
  560. package/dist/web/session-view/service.d.ts.map +1 -1
  561. package/dist/web/session-view/service.js +61 -18
  562. package/dist/web/session-view/service.js.map +1 -1
  563. package/dist/web/session-view/types.d.ts +0 -3
  564. package/dist/web/session-view/types.d.ts.map +1 -1
  565. package/dist/web/session-view/types.js.map +1 -1
  566. package/dist/web/token-store.js +1 -1
  567. package/dist/web/token-store.js.map +1 -1
  568. package/dist/workspace-projection/index.d.ts +10 -0
  569. package/dist/workspace-projection/index.d.ts.map +1 -0
  570. package/dist/workspace-projection/index.js +120 -0
  571. package/dist/workspace-projection/index.js.map +1 -0
  572. package/dist/workspace-projection/types.d.ts +16 -0
  573. package/dist/workspace-projection/types.d.ts.map +1 -0
  574. package/dist/workspace-projection/types.js +2 -0
  575. package/dist/workspace-projection/types.js.map +1 -0
  576. package/package.json +68 -37
  577. package/dist/adapters/streaming.d.ts +0 -18
  578. package/dist/adapters/streaming.d.ts.map +0 -1
  579. package/dist/adapters/streaming.js +0 -44
  580. package/dist/adapters/streaming.js.map +0 -1
  581. package/dist/adapters/telegram/html.d.ts +0 -3
  582. package/dist/adapters/telegram/html.d.ts.map +0 -1
  583. package/dist/adapters/telegram/html.js +0 -98
  584. package/dist/adapters/telegram/html.js.map +0 -1
  585. package/dist/commands/parse.d.ts +0 -7
  586. package/dist/commands/parse.d.ts.map +0 -1
  587. package/dist/commands/parse.js +0 -14
  588. package/dist/commands/parse.js.map +0 -1
  589. package/dist/download.d.ts.map +0 -1
  590. package/dist/download.js.map +0 -1
  591. package/dist/model-registry.d.ts +0 -4
  592. package/dist/model-registry.d.ts.map +0 -1
  593. package/dist/model-registry.js +0 -7
  594. package/dist/model-registry.js.map +0 -1
  595. package/dist/portal-shell.d.ts +0 -4
  596. package/dist/portal-shell.d.ts.map +0 -1
  597. package/dist/portal-shell.js.map +0 -1
  598. package/dist/runtime/agent-run-controller.d.ts +0 -31
  599. package/dist/runtime/agent-run-controller.d.ts.map +0 -1
  600. package/dist/runtime/agent-run-controller.js +0 -195
  601. package/dist/runtime/agent-run-controller.js.map +0 -1
  602. package/dist/sandbox/path-context.d.ts +0 -3
  603. package/dist/sandbox/path-context.d.ts.map +0 -1
  604. package/dist/sandbox/path-context.js +0 -20
  605. package/dist/sandbox/path-context.js.map +0 -1
  606. package/dist/sessions/agent-memory-file-manager.d.ts +0 -19
  607. package/dist/sessions/agent-memory-file-manager.d.ts.map +0 -1
  608. package/dist/sessions/agent-memory-file-manager.js.map +0 -1
  609. package/dist/sessions/metadata.d.ts +0 -3
  610. package/dist/sessions/metadata.d.ts.map +0 -1
  611. package/dist/sessions/metadata.js +0 -11
  612. package/dist/sessions/metadata.js.map +0 -1
  613. package/dist/sessions/policy.d.ts +0 -6
  614. package/dist/sessions/policy.d.ts.map +0 -1
  615. package/dist/sessions/policy.js +0 -23
  616. package/dist/sessions/policy.js.map +0 -1
  617. package/dist/store.d.ts +0 -46
  618. package/dist/store.d.ts.map +0 -1
  619. package/dist/store.js +0 -177
  620. package/dist/store.js.map +0 -1
  621. package/dist/tools/truncate.d.ts +0 -33
  622. package/dist/tools/truncate.d.ts.map +0 -1
  623. package/dist/tools/truncate.js +0 -184
  624. package/dist/tools/truncate.js.map +0 -1
  625. package/dist/utils/date.d.ts +0 -10
  626. package/dist/utils/date.d.ts.map +0 -1
  627. package/dist/utils/date.js +0 -23
  628. package/dist/utils/date.js.map +0 -1
  629. package/dist/utils/env.d.ts +0 -3
  630. package/dist/utils/env.d.ts.map +0 -1
  631. package/dist/utils/env.js +0 -12
  632. package/dist/utils/env.js.map +0 -1
  633. package/dist/utils/fs-atomic.d.ts +0 -10
  634. package/dist/utils/fs-atomic.d.ts.map +0 -1
  635. package/dist/utils/fs-atomic.js +0 -45
  636. package/dist/utils/fs-atomic.js.map +0 -1
  637. package/dist/utils/html.d.ts +0 -2
  638. package/dist/utils/html.d.ts.map +0 -1
  639. package/dist/utils/html.js +0 -4
  640. package/dist/utils/html.js.map +0 -1
  641. package/dist/utils/http-body.d.ts +0 -10
  642. package/dist/utils/http-body.d.ts.map +0 -1
  643. package/dist/utils/http-body.js +0 -34
  644. package/dist/utils/http-body.js.map +0 -1
  645. package/dist/vault/routing.d.ts +0 -3
  646. package/dist/vault/routing.d.ts.map +0 -1
  647. package/dist/vault/routing.js +0 -13
  648. package/dist/vault/routing.js.map +0 -1
  649. package/dist/web/agent-events/portal.d.ts +0 -3
  650. package/dist/web/agent-events/portal.d.ts.map +0 -1
  651. package/dist/web/agent-events/portal.js +0 -18
  652. package/dist/web/agent-events/portal.js.map +0 -1
  653. package/dist/web/request.d.ts +0 -3
  654. package/dist/web/request.d.ts.map +0 -1
  655. package/dist/web/request.js +0 -13
  656. package/dist/web/request.js.map +0 -1
  657. package/dist/web/session-view/command.d.ts +0 -4
  658. package/dist/web/session-view/command.d.ts.map +0 -1
  659. package/dist/web/session-view/command.js +0 -7
  660. package/dist/web/session-view/command.js.map +0 -1
  661. /package/dist/{download.d.ts → cli/download.d.ts} +0 -0
@@ -14,58 +14,12 @@
14
14
  * and `auto_retry_start/_end`, preserving the event surface mikan's
15
15
  * platform adapters already render.
16
16
  */
17
- import { Agent, type AgentEvent, type AgentMessage, type AgentTool, type ThinkingLevel } from "@earendil-works/pi-agent-core";
17
+ import { Agent, type AgentMessage, type AgentTool } from "@earendil-works/pi-agent-core";
18
18
  import { type Api, type ImageContent, type Model } from "@earendil-works/pi-ai";
19
- import type { ExtensionRegistry } from "./extensions/registry.js";
20
- import type { MikanModels } from "./models.js";
21
- import { resolveHarnessSettings, type BudgetSettings } from "./settings.js";
19
+ import type { RunOrigin } from "./extensions/types.js";
22
20
  import type { SessionStore } from "./session-store.js";
23
- export type CompactionReason = "threshold" | "overflow" | "manual";
24
- interface CompactionResultSummary {
25
- summary: string;
26
- firstKeptEntryId: string;
27
- tokensBefore: number;
28
- }
29
- export type HarnessEvent = AgentEvent | {
30
- type: "compaction_start";
31
- reason: CompactionReason;
32
- } | {
33
- type: "compaction_end";
34
- reason: CompactionReason;
35
- result?: CompactionResultSummary;
36
- aborted: boolean;
37
- errorMessage?: string;
38
- } | {
39
- type: "auto_retry_start";
40
- attempt: number;
41
- maxAttempts: number;
42
- delayMs: number;
43
- errorMessage: string;
44
- } | {
45
- type: "auto_retry_end";
46
- success: boolean;
47
- attempt: number;
48
- finalError?: string;
49
- } | {
50
- type: "budget_exceeded";
51
- /** Which cap was hit, e.g. "cost 2.01 USD > 2 USD limit". */
52
- reason: string;
53
- tokens: number;
54
- costUsd: number;
55
- llmCalls: number;
56
- durationMs: number;
57
- };
58
- export type HarnessEventListener = (event: HarnessEvent) => void | Promise<void>;
59
- export interface MikanAgentSessionOptions {
60
- systemPrompt: string;
61
- model: Model<Api>;
62
- thinkingLevel: ThinkingLevel;
63
- tools: AgentTool[];
64
- models: MikanModels;
65
- sessionStore: SessionStore;
66
- settings?: Parameters<typeof resolveHarnessSettings>[0];
67
- extensions?: ExtensionRegistry;
68
- }
21
+ import type { BudgetSettings, HarnessEventListener, MikanAgentSessionOptions, PromptBlockedOutcome, SubagentUsage, SubagentUsageSink } from "./types.js";
22
+ export type { CompactionReason, HarnessEvent, HarnessEventListener, MikanAgentSessionOptions, PromptBlockedOutcome, } from "./types.js";
69
23
  export declare class MikanAgentSession {
70
24
  readonly agent: Agent;
71
25
  readonly sessionStore: SessionStore;
@@ -77,48 +31,90 @@ export declare class MikanAgentSession {
77
31
  private overflowRecoveryAttempted;
78
32
  private retryAbortController;
79
33
  private compactionAbortController;
34
+ private runActive;
80
35
  private tally;
81
36
  private runBudget;
82
37
  private budgetExceededReason;
38
+ private runOrigin;
83
39
  constructor(options: MikanAgentSessionOptions);
84
40
  /** Conversation transcript currently held by the agent. */
85
41
  get messages(): AgentMessage[];
86
42
  get model(): Model<Api>;
43
+ /** Whether this session currently owns a prompt, including pre-model hooks. */
44
+ get isActiveRun(): boolean;
45
+ /** Resource totals and terminal budget state from the most recent prompt. */
46
+ getLastRunStats(): Readonly<{
47
+ usage: SubagentUsage;
48
+ tokens: number;
49
+ costUsd: number;
50
+ llmCalls: number;
51
+ toolCalls: number;
52
+ toolCallCounts: Record<string, number>;
53
+ durationMs: number;
54
+ budgetExceededReason?: string;
55
+ }>;
56
+ /**
57
+ * Fold spend incurred outside this session's own LLM calls — e.g. subagent
58
+ * runs launched by a tool during the current prompt — into the run tally
59
+ * and enforce the run budget at the fold itself: a fold that lands over a
60
+ * resource ceiling aborts the run now instead of waiting for a next
61
+ * assistant message that may never come (and would be paid for). Complete
62
+ * usage is folded; external runs are not this session's turns.
63
+ */
64
+ /** Capture a usage sink bound to the tally owned by the current prompt run. */
65
+ captureExternalUsageSink(): SubagentUsageSink;
66
+ foldExternalUsage(usage: SubagentUsage): Promise<void>;
87
67
  subscribe(listener: HarnessEventListener): () => void;
88
68
  /** Replace the agent transcript from the persisted session tree. */
89
69
  reloadFromSession(): number;
90
70
  /**
91
71
  * Send a user prompt and run the agent loop to completion, including
92
72
  * automatic retries and compaction. Resolves when the turn (and any
93
- * recovery continuations) settles.
73
+ * recovery continuations) settles. Returns a blocked outcome when a
74
+ * `before_agent_start` extension blocked the turn — the model was never
75
+ * called and nothing was persisted.
94
76
  *
95
77
  * @param options.budget Per-run resource ceilings that override the session
96
78
  * defaults. Autonomous (event / trigger) runs should pass a budget so a
97
79
  * runaway loop is stopped even with no human watching.
80
+ * @param options.origin Platform provenance forwarded to extension hooks.
98
81
  */
99
82
  prompt(text: string, options?: {
100
83
  images?: ImageContent[];
101
84
  budget?: BudgetSettings;
102
- }): Promise<void>;
85
+ origin?: RunOrigin;
86
+ tools?: AgentTool[];
87
+ }): Promise<PromptBlockedOutcome | undefined>;
88
+ private runPrompt;
103
89
  /** Abort the active run, pending retry backoff, and in-flight compaction. */
104
90
  abort(): void;
105
91
  private ensureAuthConfigured;
106
92
  private emit;
107
93
  private handleAgentEvent;
108
- /** Fold one assistant turn's usage into the running per-run tally. */
94
+ /** Fold one assistant completion's usage into the running per-run tally. */
109
95
  private recordUsage;
110
96
  /** Compare the tally against the run budget; abort the run when a cap is exceeded. */
111
97
  private enforceBudget;
98
+ /** Mark the run over budget, notify listeners and extensions, abort the agent. */
99
+ private exceedBudget;
112
100
  private overBudgetReason;
101
+ /** The message-independent budget checks, shared with external-spend folds. */
102
+ private resourceOverBudgetReason;
113
103
  private findLastAssistantMessage;
114
104
  /** Decide what to do after a run settles. Returns true when the agent should continue. */
115
105
  private handlePostRun;
116
106
  private handleOverflow;
117
107
  private checkThresholdCompaction;
118
108
  private runCompaction;
109
+ /**
110
+ * Compaction can make one completion, or two when its cut splits a turn.
111
+ * Intercept only those opaque upstream calls so each returned assistant
112
+ * message is tallied exactly once. A call at maxLlmCalls is not started;
113
+ * the cap is otherwise enforced before any post-compaction continuation.
114
+ */
115
+ private createCompactionModels;
119
116
  private isRetryableError;
120
117
  private prepareRetry;
121
118
  private dropTrailingErrorMessage;
122
119
  }
123
- export {};
124
120
  //# sourceMappingURL=runner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/harness/runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/harness/runner.ts"],"names":[],"mappings":"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"}
@@ -18,6 +18,7 @@ import { Agent, calculateContextTokens, compact, convertToLlm, estimateContextTo
18
18
  import { isContextOverflow, } from "@earendil-works/pi-ai";
19
19
  import * as log from "../log.js";
20
20
  import { resolveHarnessSettings } from "./settings.js";
21
+ import { addSubagentUsage, copySubagentUsage, createEmptySubagentUsage } from "./usage.js";
21
22
  // Transient provider failures worth retrying: overload/rate-limit responses,
22
23
  // 5xx statuses, and network/stream interruptions.
23
24
  const RETRYABLE_ERROR_PATTERN = /overloaded|provider.?returned.?error|rate.?limit|too many requests|429|500|502|503|504|service.?unavailable|server.?error|internal.?error|network.?error|connection.?error|connection.?refused|connection.?lost|websocket.?closed|websocket.?error|other side closed|fetch failed|upstream.?connect|reset before headers|socket hang up|ended without|stream ended before message_stop|http2 request did not get a response|timed? out|timeout|terminated|retry delay/i;
@@ -43,7 +44,14 @@ export class MikanAgentSession {
43
44
  this.listeners = new Set();
44
45
  this.retryAttempt = 0;
45
46
  this.overflowRecoveryAttempted = false;
46
- this.tally = { tokens: 0, costUsd: 0, llmCalls: 0, startedAt: 0 };
47
+ this.runActive = false;
48
+ this.tally = {
49
+ usage: createEmptySubagentUsage(),
50
+ llmCalls: 0,
51
+ toolCalls: 0,
52
+ toolCallCounts: {},
53
+ startedAt: 0,
54
+ };
47
55
  this.runBudget = {};
48
56
  this.models = options.models;
49
57
  this.sessionStore = options.sessionStore;
@@ -58,6 +66,11 @@ export class MikanAgentSession {
58
66
  tools,
59
67
  },
60
68
  convertToLlm,
69
+ transformContext: async (messages) => {
70
+ if (!this.extensions?.hasHandlers("context"))
71
+ return messages;
72
+ return this.extensions.emitContext({ messages, origin: this.runOrigin });
73
+ },
61
74
  streamFn: (model, context, streamOptions) => this.models.models.streamSimple(model, context, streamOptions),
62
75
  beforeToolCall: async ({ toolCall, args }) => {
63
76
  if (!this.extensions?.hasHandlers("tool_call"))
@@ -66,20 +79,26 @@ export class MikanAgentSession {
66
79
  toolCallId: toolCall.id,
67
80
  toolName: toolCall.name,
68
81
  args,
82
+ origin: this.runOrigin,
69
83
  });
70
84
  return result ?? undefined;
71
85
  },
72
86
  afterToolCall: async ({ toolCall, args, result, isError }) => {
73
- if (this.extensions?.hasHandlers("tool_result")) {
74
- await this.extensions.emit("tool_result", {
75
- toolCallId: toolCall.id,
76
- toolName: toolCall.name,
77
- args,
78
- content: result.content,
79
- isError,
80
- });
81
- }
82
- return undefined;
87
+ if (!this.extensions?.hasHandlers("tool_result"))
88
+ return undefined;
89
+ // Chained extension rewrites (redaction, truncation) become a
90
+ // pi-agent-core AfterToolCallResult override; undefined keeps the
91
+ // executed result untouched.
92
+ return this.extensions.emitToolResult({
93
+ toolCallId: toolCall.id,
94
+ toolName: toolCall.name,
95
+ args,
96
+ content: result.content,
97
+ details: result.details,
98
+ isError,
99
+ usage: result.usage,
100
+ origin: this.runOrigin,
101
+ });
83
102
  },
84
103
  });
85
104
  this.agent.subscribe(async (event) => {
@@ -93,6 +112,46 @@ export class MikanAgentSession {
93
112
  get model() {
94
113
  return this.agent.state.model;
95
114
  }
115
+ /** Whether this session currently owns a prompt, including pre-model hooks. */
116
+ get isActiveRun() {
117
+ return this.runActive;
118
+ }
119
+ /** Resource totals and terminal budget state from the most recent prompt. */
120
+ getLastRunStats() {
121
+ return {
122
+ usage: copySubagentUsage(this.tally.usage),
123
+ tokens: this.tally.usage.totalTokens,
124
+ costUsd: this.tally.usage.cost.total,
125
+ llmCalls: this.tally.llmCalls,
126
+ toolCalls: this.tally.toolCalls,
127
+ toolCallCounts: { ...this.tally.toolCallCounts },
128
+ durationMs: this.tally.startedAt > 0 ? Date.now() - this.tally.startedAt : 0,
129
+ ...(this.budgetExceededReason ? { budgetExceededReason: this.budgetExceededReason } : {}),
130
+ };
131
+ }
132
+ /**
133
+ * Fold spend incurred outside this session's own LLM calls — e.g. subagent
134
+ * runs launched by a tool during the current prompt — into the run tally
135
+ * and enforce the run budget at the fold itself: a fold that lands over a
136
+ * resource ceiling aborts the run now instead of waiting for a next
137
+ * assistant message that may never come (and would be paid for). Complete
138
+ * usage is folded; external runs are not this session's turns.
139
+ */
140
+ /** Capture a usage sink bound to the tally owned by the current prompt run. */
141
+ captureExternalUsageSink() {
142
+ const tally = this.tally;
143
+ return async (usage) => {
144
+ addSubagentUsage(tally.usage, usage);
145
+ if (this.tally !== tally || this.budgetExceededReason || !this.runActive)
146
+ return;
147
+ const reason = this.resourceOverBudgetReason();
148
+ if (reason)
149
+ await this.exceedBudget(reason);
150
+ };
151
+ }
152
+ async foldExternalUsage(usage) {
153
+ await this.captureExternalUsageSink()(usage);
154
+ }
96
155
  subscribe(listener) {
97
156
  this.listeners.add(listener);
98
157
  return () => this.listeners.delete(listener);
@@ -108,53 +167,107 @@ export class MikanAgentSession {
108
167
  /**
109
168
  * Send a user prompt and run the agent loop to completion, including
110
169
  * automatic retries and compaction. Resolves when the turn (and any
111
- * recovery continuations) settles.
170
+ * recovery continuations) settles. Returns a blocked outcome when a
171
+ * `before_agent_start` extension blocked the turn — the model was never
172
+ * called and nothing was persisted.
112
173
  *
113
174
  * @param options.budget Per-run resource ceilings that override the session
114
175
  * defaults. Autonomous (event / trigger) runs should pass a budget so a
115
176
  * runaway loop is stopped even with no human watching.
177
+ * @param options.origin Platform provenance forwarded to extension hooks.
116
178
  */
117
179
  async prompt(text, options) {
118
- if (this.agent.state.isStreaming) {
180
+ if (this.runActive) {
119
181
  throw new Error("Agent is already processing a prompt");
120
182
  }
183
+ this.runActive = true;
184
+ const runSystemPrompt = this.agent.state.systemPrompt;
185
+ const runTools = this.agent.state.tools;
186
+ if (options?.tools)
187
+ this.agent.state.tools = options.tools;
188
+ try {
189
+ return await this.runPrompt(text, runSystemPrompt, options);
190
+ }
191
+ finally {
192
+ this.agent.state.systemPrompt = runSystemPrompt;
193
+ this.agent.state.tools = runTools;
194
+ this.runActive = false;
195
+ }
196
+ }
197
+ async runPrompt(text, runSystemPrompt, options) {
121
198
  const model = this.agent.state.model;
122
199
  await this.ensureAuthConfigured(model);
123
200
  this.retryAttempt = 0;
124
201
  this.overflowRecoveryAttempted = false;
125
202
  this.runBudget = { ...this.settings.budget, ...options?.budget };
126
203
  this.budgetExceededReason = undefined;
127
- this.tally = { tokens: 0, costUsd: 0, llmCalls: 0, startedAt: Date.now() };
204
+ this.tally = {
205
+ usage: createEmptySubagentUsage(),
206
+ llmCalls: 0,
207
+ toolCalls: 0,
208
+ toolCallCounts: {},
209
+ startedAt: Date.now(),
210
+ };
211
+ this.runOrigin = options?.origin;
128
212
  // A previous turn may have ended over the threshold (for example after an
129
213
  // abort); compact before adding new context on top.
130
214
  const lastAssistant = this.findLastAssistantMessage();
131
215
  if (lastAssistant && lastAssistant.stopReason !== "error") {
132
216
  await this.checkThresholdCompaction(lastAssistant);
133
217
  }
134
- let systemPrompt = this.agent.state.systemPrompt;
218
+ let promptText = text;
219
+ let systemPrompt = runSystemPrompt;
135
220
  if (this.extensions?.hasHandlers("before_agent_start")) {
136
- const result = await this.extensions.emit("before_agent_start", {
137
- prompt: text,
221
+ const result = await this.extensions.emitBeforeAgentStart({
222
+ prompt: promptText,
138
223
  images: options?.images,
139
224
  systemPrompt,
225
+ origin: this.runOrigin,
140
226
  });
141
- if (result?.systemPrompt) {
227
+ if (result?.block) {
228
+ // Blocked before agent.prompt(): the user message never enters the
229
+ // transcript or session store, so the blocked turn leaves no trace.
230
+ log.logInfo(`Extension blocked turn${result.reason ? `: ${result.reason}` : ""}`);
231
+ return { blocked: true, reason: result.reason };
232
+ }
233
+ if (result?.prompt !== undefined && result.prompt !== promptText) {
234
+ log.logInfo(`Extension rewrote user prompt: ${promptText.length} → ${result.prompt.length} chars`);
235
+ promptText = result.prompt;
236
+ }
237
+ if (result?.systemPrompt && result.systemPrompt !== systemPrompt) {
238
+ // An extension rewrote the system prompt for this turn. Log the new
239
+ // size so the diagnostic in agent.ts (which logs the pre-hook prompt)
240
+ // isn't mistaken for the final prompt sent to the model.
241
+ log.logInfo(`Extension rewrote system prompt: ${systemPrompt.length} → ${result.systemPrompt.length} chars`);
142
242
  systemPrompt = result.systemPrompt;
143
243
  this.agent.state.systemPrompt = systemPrompt;
144
244
  }
145
245
  }
146
246
  const userMessage = {
147
247
  role: "user",
148
- content: [{ type: "text", text }, ...(options?.images ?? [])],
248
+ content: [{ type: "text", text: promptText }, ...(options?.images ?? [])],
149
249
  timestamp: Date.now(),
150
250
  };
151
251
  await this.agent.prompt([userMessage]);
152
252
  while (await this.handlePostRun()) {
153
253
  await this.agent.continue();
154
254
  }
255
+ // The turn settled on an error (retries exhausted or not retryable):
256
+ // give monitoring extensions the final failure, once per turn.
257
+ const settled = this.findLastAssistantMessage();
258
+ if (settled?.stopReason === "error" && this.extensions?.hasHandlers("agent_error")) {
259
+ await this.extensions.emit("agent_error", {
260
+ errorMessage: settled.errorMessage || "Unknown error",
261
+ origin: this.runOrigin,
262
+ });
263
+ }
155
264
  if (this.extensions?.hasHandlers("turn_end")) {
156
- await this.extensions.emit("turn_end", { messages: this.agent.state.messages });
265
+ await this.extensions.emit("turn_end", {
266
+ messages: this.agent.state.messages,
267
+ origin: this.runOrigin,
268
+ });
157
269
  }
270
+ return undefined;
158
271
  }
159
272
  /** Abort the active run, pending retry backoff, and in-flight compaction. */
160
273
  abort() {
@@ -179,10 +292,25 @@ export class MikanAgentSession {
179
292
  }
180
293
  }
181
294
  async handleAgentEvent(event) {
182
- await this.emit(event);
183
- if (event.type !== "message_end")
295
+ if (event.type === "tool_execution_start") {
296
+ this.tally.toolCalls += 1;
297
+ this.tally.toolCallCounts[event.toolName] =
298
+ (this.tally.toolCallCounts[event.toolName] ?? 0) + 1;
299
+ }
300
+ if (event.type !== "message_end") {
301
+ await this.emit(event);
184
302
  return;
185
- const message = event.message;
303
+ }
304
+ let message = event.message;
305
+ if (this.extensions?.hasHandlers("message_end")) {
306
+ const result = await this.extensions.emitMessageEnd({ message, origin: this.runOrigin });
307
+ if (result?.message) {
308
+ for (const key of Object.keys(message)) {
309
+ delete message[key];
310
+ }
311
+ Object.assign(message, result.message);
312
+ }
313
+ }
186
314
  if (message.role === "user" || message.role === "assistant" || message.role === "toolResult") {
187
315
  this.sessionStore.appendMessage(message);
188
316
  }
@@ -190,12 +318,10 @@ export class MikanAgentSession {
190
318
  const custom = message;
191
319
  this.sessionStore.appendCustomMessageEntry(custom.customType, custom.content, custom.display, custom.details);
192
320
  }
193
- if (this.extensions?.hasHandlers("message_end")) {
194
- await this.extensions.emit("message_end", { message });
195
- }
321
+ await this.emit({ ...event, message });
196
322
  if (message.role === "assistant") {
197
323
  this.recordUsage(message);
198
- await this.enforceBudget();
324
+ await this.enforceBudget(message);
199
325
  if (message.stopReason !== "error") {
200
326
  this.overflowRecoveryAttempted = false;
201
327
  if (this.retryAttempt > 0) {
@@ -205,44 +331,65 @@ export class MikanAgentSession {
205
331
  }
206
332
  }
207
333
  }
208
- /** Fold one assistant turn's usage into the running per-run tally. */
334
+ /** Fold one assistant completion's usage into the running per-run tally. */
209
335
  recordUsage(message) {
210
336
  this.tally.llmCalls += 1;
211
337
  const usage = message.usage;
212
338
  if (!usage)
213
339
  return;
214
- this.tally.tokens += usage.input + usage.output + usage.cacheRead + usage.cacheWrite;
215
- this.tally.costUsd += usage.cost?.total ?? 0;
340
+ addSubagentUsage(this.tally.usage, usage);
216
341
  }
217
342
  /** Compare the tally against the run budget; abort the run when a cap is exceeded. */
218
- async enforceBudget() {
343
+ async enforceBudget(message) {
219
344
  if (this.budgetExceededReason)
220
345
  return;
221
- const reason = this.overBudgetReason();
346
+ const reason = this.overBudgetReason(message);
222
347
  if (!reason)
223
348
  return;
349
+ await this.exceedBudget(reason);
350
+ }
351
+ /** Mark the run over budget, notify listeners and extensions, abort the agent. */
352
+ async exceedBudget(reason) {
353
+ if (this.budgetExceededReason)
354
+ return;
224
355
  this.budgetExceededReason = reason;
225
356
  await this.emit({
226
357
  type: "budget_exceeded",
227
358
  reason,
228
- tokens: this.tally.tokens,
229
- costUsd: this.tally.costUsd,
359
+ tokens: this.tally.usage.totalTokens,
360
+ costUsd: this.tally.usage.cost.total,
230
361
  llmCalls: this.tally.llmCalls,
231
362
  durationMs: Date.now() - this.tally.startedAt,
232
363
  });
364
+ if (this.extensions?.hasHandlers("budget_exceeded")) {
365
+ await this.extensions.emit("budget_exceeded", {
366
+ reason,
367
+ tokens: this.tally.usage.totalTokens,
368
+ costUsd: this.tally.usage.cost.total,
369
+ llmCalls: this.tally.llmCalls,
370
+ durationMs: Date.now() - this.tally.startedAt,
371
+ origin: this.runOrigin,
372
+ });
373
+ }
233
374
  log.logWarning("Run budget exceeded — aborting", reason);
234
375
  this.agent.abort();
235
376
  }
236
- overBudgetReason() {
237
- const { maxTokens, maxCostUsd, maxDurationMs, maxLlmCalls } = this.runBudget;
238
- if (maxLlmCalls !== undefined && this.tally.llmCalls >= maxLlmCalls) {
377
+ overBudgetReason(message) {
378
+ const { maxLlmCalls } = this.runBudget;
379
+ const needsAnotherCall = message.stopReason === "error" || message.content.some((part) => part.type === "toolCall");
380
+ if (needsAnotherCall && maxLlmCalls !== undefined && this.tally.llmCalls >= maxLlmCalls) {
239
381
  return `${this.tally.llmCalls} LLM calls >= ${maxLlmCalls} limit`;
240
382
  }
241
- if (maxTokens !== undefined && this.tally.tokens >= maxTokens) {
242
- return `${this.tally.tokens} tokens >= ${maxTokens} limit`;
383
+ return this.resourceOverBudgetReason();
384
+ }
385
+ /** The message-independent budget checks, shared with external-spend folds. */
386
+ resourceOverBudgetReason() {
387
+ const { maxTokens, maxCostUsd, maxDurationMs } = this.runBudget;
388
+ if (maxTokens !== undefined && this.tally.usage.totalTokens >= maxTokens) {
389
+ return `${this.tally.usage.totalTokens} tokens >= ${maxTokens} limit`;
243
390
  }
244
- if (maxCostUsd !== undefined && this.tally.costUsd >= maxCostUsd) {
245
- return `cost ${this.tally.costUsd.toFixed(2)} USD >= ${maxCostUsd} USD limit`;
391
+ if (maxCostUsd !== undefined && this.tally.usage.cost.total >= maxCostUsd) {
392
+ return `cost ${this.tally.usage.cost.total.toFixed(2)} USD >= ${maxCostUsd} USD limit`;
246
393
  }
247
394
  if (maxDurationMs !== undefined && Date.now() - this.tally.startedAt >= maxDurationMs) {
248
395
  return `${Date.now() - this.tally.startedAt}ms >= ${maxDurationMs}ms limit`;
@@ -253,7 +400,7 @@ export class MikanAgentSession {
253
400
  const messages = this.agent.state.messages;
254
401
  for (let i = messages.length - 1; i >= 0; i--) {
255
402
  const message = messages[i];
256
- if (message.role === "assistant")
403
+ if (message?.role === "assistant")
257
404
  return message;
258
405
  }
259
406
  return undefined;
@@ -322,12 +469,19 @@ export class MikanAgentSession {
322
469
  started = true;
323
470
  this.compactionAbortController = new AbortController();
324
471
  const signal = this.compactionAbortController.signal;
325
- const result = getOrThrow(await compact(preparation, this.models.models, this.agent.state.model, undefined, signal, this.agent.state.thinkingLevel));
472
+ const result = getOrThrow(await compact(preparation, this.createCompactionModels(), this.agent.state.model, undefined, signal, this.agent.state.thinkingLevel));
326
473
  if (signal.aborted) {
327
474
  await this.emit({ type: "compaction_end", reason, aborted: true });
328
475
  return false;
329
476
  }
330
- const entryId = this.sessionStore.appendCompaction(result.summary, result.firstKeptEntryId, result.tokensBefore, result.details);
477
+ // pi 0.82 reserves an absent firstKeptEntryId for keep-nothing
478
+ // compactions; mikan's session format requires a kept entry on the
479
+ // branch, and the compaction path used here always produces one.
480
+ const firstKeptEntryId = result.firstKeptEntryId;
481
+ if (firstKeptEntryId === undefined) {
482
+ throw new Error("compaction returned no first kept entry");
483
+ }
484
+ const entryId = this.sessionStore.appendCompaction(result.summary, firstKeptEntryId, result.tokensBefore, result.details);
331
485
  const context = this.sessionStore.buildSessionContext();
332
486
  this.agent.state.messages = context.messages;
333
487
  if (this.extensions?.hasHandlers("session_compact")) {
@@ -344,11 +498,13 @@ export class MikanAgentSession {
344
498
  reason,
345
499
  result: {
346
500
  summary: result.summary,
347
- firstKeptEntryId: result.firstKeptEntryId,
501
+ firstKeptEntryId,
348
502
  tokensBefore: result.tokensBefore,
349
503
  },
350
504
  aborted: false,
351
505
  });
506
+ if (this.budgetExceededReason)
507
+ return false;
352
508
  if (willRetry) {
353
509
  this.dropTrailingErrorMessage();
354
510
  return true;
@@ -376,6 +532,36 @@ export class MikanAgentSession {
376
532
  this.compactionAbortController = undefined;
377
533
  }
378
534
  }
535
+ /**
536
+ * Compaction can make one completion, or two when its cut splits a turn.
537
+ * Intercept only those opaque upstream calls so each returned assistant
538
+ * message is tallied exactly once. A call at maxLlmCalls is not started;
539
+ * the cap is otherwise enforced before any post-compaction continuation.
540
+ */
541
+ createCompactionModels() {
542
+ const models = this.models.models;
543
+ return new Proxy(models, {
544
+ get: (target, property) => {
545
+ if (property === "completeSimple") {
546
+ return async (...args) => {
547
+ const maxLlmCalls = this.runBudget.maxLlmCalls;
548
+ if (maxLlmCalls !== undefined && this.tally.llmCalls >= maxLlmCalls) {
549
+ await this.exceedBudget(`${this.tally.llmCalls} LLM calls >= ${maxLlmCalls} limit`);
550
+ throw new Error("Compaction LLM-call budget exhausted");
551
+ }
552
+ const message = await target.completeSimple(...args);
553
+ this.recordUsage(message);
554
+ const reason = this.resourceOverBudgetReason();
555
+ if (reason)
556
+ await this.exceedBudget(reason);
557
+ return message;
558
+ };
559
+ }
560
+ const value = Reflect.get(target, property, target);
561
+ return typeof value === "function" ? value.bind(target) : value;
562
+ },
563
+ });
564
+ }
379
565
  isRetryableError(message) {
380
566
  if (message.stopReason !== "error" || !message.errorMessage)
381
567
  return false;
@@ -428,7 +614,7 @@ export class MikanAgentSession {
428
614
  }
429
615
  dropTrailingErrorMessage() {
430
616
  const messages = this.agent.state.messages;
431
- if (messages.length > 0 && messages[messages.length - 1].role === "assistant") {
617
+ if (messages[messages.length - 1]?.role === "assistant") {
432
618
  this.agent.state.messages = messages.slice(0, -1);
433
619
  }
434
620
  }