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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (497) hide show
  1. package/CHANGELOG.md +388 -0
  2. package/README.md +49 -16
  3. package/dist/adapter.d.ts +1 -1
  4. package/dist/adapter.d.ts.map +1 -1
  5. package/dist/adapter.js.map +1 -1
  6. package/dist/adapters/buffered-responder.d.ts +60 -0
  7. package/dist/adapters/buffered-responder.d.ts.map +1 -0
  8. package/dist/adapters/buffered-responder.js +201 -0
  9. package/dist/adapters/buffered-responder.js.map +1 -0
  10. package/dist/adapters/discord/bot.d.ts +1 -0
  11. package/dist/adapters/discord/bot.d.ts.map +1 -1
  12. package/dist/adapters/discord/bot.js +36 -67
  13. package/dist/adapters/discord/bot.js.map +1 -1
  14. package/dist/adapters/discord/context.d.ts.map +1 -1
  15. package/dist/adapters/discord/context.js +44 -204
  16. package/dist/adapters/discord/context.js.map +1 -1
  17. package/dist/adapters/github/bot.d.ts +86 -0
  18. package/dist/adapters/github/bot.d.ts.map +1 -0
  19. package/dist/adapters/github/bot.js +640 -0
  20. package/dist/adapters/github/bot.js.map +1 -0
  21. package/dist/adapters/github/client.d.ts +122 -0
  22. package/dist/adapters/github/client.d.ts.map +1 -0
  23. package/dist/adapters/github/client.js +314 -0
  24. package/dist/adapters/github/client.js.map +1 -0
  25. package/dist/adapters/github/cloudbuild.d.ts +24 -0
  26. package/dist/adapters/github/cloudbuild.d.ts.map +1 -0
  27. package/dist/adapters/github/cloudbuild.js +71 -0
  28. package/dist/adapters/github/cloudbuild.js.map +1 -0
  29. package/dist/adapters/github/context.d.ts +9 -0
  30. package/dist/adapters/github/context.d.ts.map +1 -0
  31. package/dist/adapters/github/context.js +103 -0
  32. package/dist/adapters/github/context.js.map +1 -0
  33. package/dist/adapters/github/gcp-auth.d.ts +31 -0
  34. package/dist/adapters/github/gcp-auth.d.ts.map +1 -0
  35. package/dist/adapters/github/gcp-auth.js +196 -0
  36. package/dist/adapters/github/gcp-auth.js.map +1 -0
  37. package/dist/adapters/github/github-ops.d.ts +90 -0
  38. package/dist/adapters/github/github-ops.d.ts.map +1 -0
  39. package/dist/adapters/github/github-ops.js +405 -0
  40. package/dist/adapters/github/github-ops.js.map +1 -0
  41. package/dist/adapters/github/ids.d.ts +34 -0
  42. package/dist/adapters/github/ids.d.ts.map +1 -0
  43. package/dist/adapters/github/ids.js +53 -0
  44. package/dist/adapters/github/ids.js.map +1 -0
  45. package/dist/adapters/github/repo.d.ts +32 -0
  46. package/dist/adapters/github/repo.d.ts.map +1 -0
  47. package/dist/adapters/github/repo.js +141 -0
  48. package/dist/adapters/github/repo.js.map +1 -0
  49. package/dist/adapters/github/tool-pack.d.ts +14 -0
  50. package/dist/adapters/github/tool-pack.d.ts.map +1 -0
  51. package/dist/adapters/github/tool-pack.js +56 -0
  52. package/dist/adapters/github/tool-pack.js.map +1 -0
  53. package/dist/adapters/github/tools/checks.d.ts +24 -0
  54. package/dist/adapters/github/tools/checks.d.ts.map +1 -0
  55. package/dist/adapters/github/tools/checks.js +105 -0
  56. package/dist/adapters/github/tools/checks.js.map +1 -0
  57. package/dist/adapters/github/tools/issue.d.ts +22 -0
  58. package/dist/adapters/github/tools/issue.d.ts.map +1 -0
  59. package/dist/adapters/github/tools/issue.js +48 -0
  60. package/dist/adapters/github/tools/issue.js.map +1 -0
  61. package/dist/adapters/github/tools/pr.d.ts +22 -0
  62. package/dist/adapters/github/tools/pr.d.ts.map +1 -0
  63. package/dist/adapters/github/tools/pr.js +48 -0
  64. package/dist/adapters/github/tools/pr.js.map +1 -0
  65. package/dist/adapters/github/tools/read.d.ts +22 -0
  66. package/dist/adapters/github/tools/read.d.ts.map +1 -0
  67. package/dist/adapters/github/tools/read.js +141 -0
  68. package/dist/adapters/github/tools/read.js.map +1 -0
  69. package/dist/adapters/github/tools/review-reply.d.ts +19 -0
  70. package/dist/adapters/github/tools/review-reply.d.ts.map +1 -0
  71. package/dist/adapters/github/tools/review-reply.js +38 -0
  72. package/dist/adapters/github/tools/review-reply.js.map +1 -0
  73. package/dist/adapters/github/tools/sync.d.ts +17 -0
  74. package/dist/adapters/github/tools/sync.d.ts.map +1 -0
  75. package/dist/adapters/github/tools/sync.js +34 -0
  76. package/dist/adapters/github/tools/sync.js.map +1 -0
  77. package/dist/adapters/github/types.d.ts +350 -0
  78. package/dist/adapters/github/types.d.ts.map +1 -0
  79. package/dist/adapters/github/types.js +2 -0
  80. package/dist/adapters/github/types.js.map +1 -0
  81. package/dist/adapters/intake.d.ts +16 -5
  82. package/dist/adapters/intake.d.ts.map +1 -1
  83. package/dist/adapters/intake.js +79 -22
  84. package/dist/adapters/intake.js.map +1 -1
  85. package/dist/adapters/slack/bot.d.ts +8 -6
  86. package/dist/adapters/slack/bot.d.ts.map +1 -1
  87. package/dist/adapters/slack/bot.js +82 -134
  88. package/dist/adapters/slack/bot.js.map +1 -1
  89. package/dist/adapters/slack/context.d.ts.map +1 -1
  90. package/dist/adapters/slack/context.js +3 -14
  91. package/dist/adapters/slack/context.js.map +1 -1
  92. package/dist/adapters/slack/response-lifecycle.d.ts.map +1 -1
  93. package/dist/adapters/slack/response-lifecycle.js +14 -17
  94. package/dist/adapters/slack/response-lifecycle.js.map +1 -1
  95. package/dist/adapters/slack/session.d.ts.map +1 -1
  96. package/dist/adapters/slack/session.js +5 -8
  97. package/dist/adapters/slack/session.js.map +1 -1
  98. package/dist/adapters/streaming.d.ts +4 -0
  99. package/dist/adapters/streaming.d.ts.map +1 -1
  100. package/dist/adapters/streaming.js +11 -0
  101. package/dist/adapters/streaming.js.map +1 -1
  102. package/dist/adapters/telegram/bot.d.ts +1 -2
  103. package/dist/adapters/telegram/bot.d.ts.map +1 -1
  104. package/dist/adapters/telegram/bot.js +27 -62
  105. package/dist/adapters/telegram/bot.js.map +1 -1
  106. package/dist/adapters/telegram/context.d.ts.map +1 -1
  107. package/dist/adapters/telegram/context.js +37 -174
  108. package/dist/adapters/telegram/context.js.map +1 -1
  109. package/dist/adapters/types.d.ts +28 -2
  110. package/dist/adapters/types.d.ts.map +1 -1
  111. package/dist/adapters/types.js.map +1 -1
  112. package/dist/agent.d.ts +37 -14
  113. package/dist/agent.d.ts.map +1 -1
  114. package/dist/agent.js +359 -229
  115. package/dist/agent.js.map +1 -1
  116. package/dist/cli/arg-grammar.d.ts +25 -0
  117. package/dist/cli/arg-grammar.d.ts.map +1 -0
  118. package/dist/cli/arg-grammar.js +59 -0
  119. package/dist/cli/arg-grammar.js.map +1 -0
  120. package/dist/cli/boot.d.ts +16 -0
  121. package/dist/cli/boot.d.ts.map +1 -0
  122. package/dist/cli/boot.js +119 -0
  123. package/dist/cli/boot.js.map +1 -0
  124. package/dist/cli/download.d.ts.map +1 -0
  125. package/dist/cli/download.js.map +1 -0
  126. package/dist/cli/ext-git.d.ts +22 -0
  127. package/dist/cli/ext-git.d.ts.map +1 -0
  128. package/dist/cli/ext-git.js +76 -0
  129. package/dist/cli/ext-git.js.map +1 -0
  130. package/dist/cli/ext.d.ts +2 -0
  131. package/dist/cli/ext.d.ts.map +1 -0
  132. package/dist/cli/ext.js +215 -0
  133. package/dist/cli/ext.js.map +1 -0
  134. package/dist/commands/admin.d.ts.map +1 -1
  135. package/dist/commands/admin.js +2 -1
  136. package/dist/commands/admin.js.map +1 -1
  137. package/dist/commands/auto-reply.d.ts.map +1 -1
  138. package/dist/commands/auto-reply.js +2 -6
  139. package/dist/commands/auto-reply.js.map +1 -1
  140. package/dist/commands/extensions.d.ts.map +1 -1
  141. package/dist/commands/extensions.js +18 -8
  142. package/dist/commands/extensions.js.map +1 -1
  143. package/dist/commands/login.d.ts +2 -1
  144. package/dist/commands/login.d.ts.map +1 -1
  145. package/dist/commands/login.js +35 -3
  146. package/dist/commands/login.js.map +1 -1
  147. package/dist/commands/manifest.d.ts +72 -0
  148. package/dist/commands/manifest.d.ts.map +1 -0
  149. package/dist/commands/manifest.js +121 -0
  150. package/dist/commands/manifest.js.map +1 -0
  151. package/dist/commands/model.d.ts.map +1 -1
  152. package/dist/commands/model.js +11 -9
  153. package/dist/commands/model.js.map +1 -1
  154. package/dist/commands/new.d.ts.map +1 -1
  155. package/dist/commands/new.js +2 -1
  156. package/dist/commands/new.js.map +1 -1
  157. package/dist/commands/sandbox.d.ts.map +1 -1
  158. package/dist/commands/sandbox.js +23 -17
  159. package/dist/commands/sandbox.js.map +1 -1
  160. package/dist/commands/text.d.ts +2 -0
  161. package/dist/commands/text.d.ts.map +1 -0
  162. package/dist/commands/text.js +16 -0
  163. package/dist/commands/text.js.map +1 -0
  164. package/dist/commands/types.d.ts +14 -1
  165. package/dist/commands/types.d.ts.map +1 -1
  166. package/dist/commands/types.js.map +1 -1
  167. package/dist/config.d.ts +1 -3
  168. package/dist/config.d.ts.map +1 -1
  169. package/dist/config.js +98 -95
  170. package/dist/config.js.map +1 -1
  171. package/dist/env-manifest.d.ts +35 -0
  172. package/dist/env-manifest.d.ts.map +1 -0
  173. package/dist/env-manifest.js +225 -0
  174. package/dist/env-manifest.js.map +1 -0
  175. package/dist/events.d.ts.map +1 -1
  176. package/dist/events.js +9 -73
  177. package/dist/events.js.map +1 -1
  178. package/dist/execution-resolver.d.ts +4 -2
  179. package/dist/execution-resolver.d.ts.map +1 -1
  180. package/dist/execution-resolver.js +54 -41
  181. package/dist/execution-resolver.js.map +1 -1
  182. package/dist/harness/event-format.d.ts +66 -0
  183. package/dist/harness/event-format.d.ts.map +1 -0
  184. package/dist/harness/event-format.js +112 -0
  185. package/dist/harness/event-format.js.map +1 -0
  186. package/dist/harness/extensions/loader.d.ts +44 -11
  187. package/dist/harness/extensions/loader.d.ts.map +1 -1
  188. package/dist/harness/extensions/loader.js +273 -84
  189. package/dist/harness/extensions/loader.js.map +1 -1
  190. package/dist/harness/extensions/registry.d.ts +48 -1
  191. package/dist/harness/extensions/registry.d.ts.map +1 -1
  192. package/dist/harness/extensions/registry.js +146 -0
  193. package/dist/harness/extensions/registry.js.map +1 -1
  194. package/dist/harness/extensions/types.d.ts +165 -22
  195. package/dist/harness/extensions/types.d.ts.map +1 -1
  196. package/dist/harness/extensions/types.js.map +1 -1
  197. package/dist/harness/index.d.ts +6 -5
  198. package/dist/harness/index.d.ts.map +1 -1
  199. package/dist/harness/index.js +3 -2
  200. package/dist/harness/index.js.map +1 -1
  201. package/dist/harness/models.d.ts +5 -0
  202. package/dist/harness/models.d.ts.map +1 -1
  203. package/dist/harness/models.js +10 -0
  204. package/dist/harness/models.js.map +1 -1
  205. package/dist/harness/runner.d.ts +37 -2
  206. package/dist/harness/runner.d.ts.map +1 -1
  207. package/dist/harness/runner.js +107 -23
  208. package/dist/harness/runner.js.map +1 -1
  209. package/dist/harness/session-store.d.ts +4 -1
  210. package/dist/harness/session-store.d.ts.map +1 -1
  211. package/dist/harness/session-store.js +11 -2
  212. package/dist/harness/session-store.js.map +1 -1
  213. package/dist/harness/subagent-runner.d.ts +34 -0
  214. package/dist/harness/subagent-runner.d.ts.map +1 -0
  215. package/dist/harness/subagent-runner.js +339 -0
  216. package/dist/harness/subagent-runner.js.map +1 -0
  217. package/dist/harness/types.d.ts +53 -0
  218. package/dist/harness/types.d.ts.map +1 -1
  219. package/dist/harness/types.js.map +1 -1
  220. package/dist/index.d.ts +3 -3
  221. package/dist/index.d.ts.map +1 -1
  222. package/dist/index.js +2 -2
  223. package/dist/index.js.map +1 -1
  224. package/dist/main.js +260 -109
  225. package/dist/main.js.map +1 -1
  226. package/dist/observability/instrument.js +6 -4
  227. package/dist/observability/instrument.js.map +1 -1
  228. package/dist/observability/sentry.d.ts.map +1 -1
  229. package/dist/observability/sentry.js +3 -2
  230. package/dist/observability/sentry.js.map +1 -1
  231. package/dist/provisioner.d.ts.map +1 -1
  232. package/dist/provisioner.js +2 -5
  233. package/dist/provisioner.js.map +1 -1
  234. package/dist/runtime/conversation-runtime.d.ts +1 -1
  235. package/dist/runtime/conversation-runtime.d.ts.map +1 -1
  236. package/dist/runtime/conversation-runtime.js +276 -43
  237. package/dist/runtime/conversation-runtime.js.map +1 -1
  238. package/dist/runtime/types.d.ts +36 -5
  239. package/dist/runtime/types.d.ts.map +1 -1
  240. package/dist/runtime/types.js.map +1 -1
  241. package/dist/sandbox/cloudflare.d.ts +3 -0
  242. package/dist/sandbox/cloudflare.d.ts.map +1 -1
  243. package/dist/sandbox/cloudflare.js +10 -0
  244. package/dist/sandbox/cloudflare.js.map +1 -1
  245. package/dist/sandbox/container.d.ts +4 -0
  246. package/dist/sandbox/container.d.ts.map +1 -1
  247. package/dist/sandbox/container.js +11 -2
  248. package/dist/sandbox/container.js.map +1 -1
  249. package/dist/sandbox/firecracker.d.ts +3 -0
  250. package/dist/sandbox/firecracker.d.ts.map +1 -1
  251. package/dist/sandbox/firecracker.js +10 -1
  252. package/dist/sandbox/firecracker.js.map +1 -1
  253. package/dist/sandbox/gondolin-bootstrap.d.ts +26 -0
  254. package/dist/sandbox/gondolin-bootstrap.d.ts.map +1 -0
  255. package/dist/sandbox/gondolin-bootstrap.js +27 -0
  256. package/dist/sandbox/gondolin-bootstrap.js.map +1 -0
  257. package/dist/sandbox/gondolin-contract.d.ts +125 -0
  258. package/dist/sandbox/gondolin-contract.d.ts.map +1 -0
  259. package/dist/sandbox/gondolin-contract.js +155 -0
  260. package/dist/sandbox/gondolin-contract.js.map +1 -0
  261. package/dist/sandbox/gondolin-fleet.d.ts +104 -0
  262. package/dist/sandbox/gondolin-fleet.d.ts.map +1 -0
  263. package/dist/sandbox/gondolin-fleet.js +330 -0
  264. package/dist/sandbox/gondolin-fleet.js.map +1 -0
  265. package/dist/sandbox/gondolin-gateway.d.ts +86 -0
  266. package/dist/sandbox/gondolin-gateway.d.ts.map +1 -0
  267. package/dist/sandbox/gondolin-gateway.js +407 -0
  268. package/dist/sandbox/gondolin-gateway.js.map +1 -0
  269. package/dist/sandbox/gondolin-inventory.d.ts +75 -0
  270. package/dist/sandbox/gondolin-inventory.d.ts.map +1 -0
  271. package/dist/sandbox/gondolin-inventory.js +257 -0
  272. package/dist/sandbox/gondolin-inventory.js.map +1 -0
  273. package/dist/sandbox/gondolin-join.d.ts +62 -0
  274. package/dist/sandbox/gondolin-join.d.ts.map +1 -0
  275. package/dist/sandbox/gondolin-join.js +261 -0
  276. package/dist/sandbox/gondolin-join.js.map +1 -0
  277. package/dist/sandbox/gondolin-nfs-advisory.d.ts +15 -0
  278. package/dist/sandbox/gondolin-nfs-advisory.d.ts.map +1 -0
  279. package/dist/sandbox/gondolin-nfs-advisory.js +60 -0
  280. package/dist/sandbox/gondolin-nfs-advisory.js.map +1 -0
  281. package/dist/sandbox/gondolin-placement.d.ts +30 -0
  282. package/dist/sandbox/gondolin-placement.d.ts.map +1 -0
  283. package/dist/sandbox/gondolin-placement.js +77 -0
  284. package/dist/sandbox/gondolin-placement.js.map +1 -0
  285. package/dist/sandbox/gondolin-recovery.d.ts +33 -0
  286. package/dist/sandbox/gondolin-recovery.d.ts.map +1 -0
  287. package/dist/sandbox/gondolin-recovery.js +39 -0
  288. package/dist/sandbox/gondolin-recovery.js.map +1 -0
  289. package/dist/sandbox/gondolin-remote.d.ts +70 -0
  290. package/dist/sandbox/gondolin-remote.d.ts.map +1 -0
  291. package/dist/sandbox/gondolin-remote.js +325 -0
  292. package/dist/sandbox/gondolin-remote.js.map +1 -0
  293. package/dist/sandbox/gondolin-worker-client.d.ts +135 -0
  294. package/dist/sandbox/gondolin-worker-client.d.ts.map +1 -0
  295. package/dist/sandbox/gondolin-worker-client.js +323 -0
  296. package/dist/sandbox/gondolin-worker-client.js.map +1 -0
  297. package/dist/sandbox/gondolin-worker-main.d.ts +2 -0
  298. package/dist/sandbox/gondolin-worker-main.d.ts.map +1 -0
  299. package/dist/sandbox/gondolin-worker-main.js +22 -0
  300. package/dist/sandbox/gondolin-worker-main.js.map +1 -0
  301. package/dist/sandbox/gondolin-worker.d.ts +17 -0
  302. package/dist/sandbox/gondolin-worker.d.ts.map +1 -0
  303. package/dist/sandbox/gondolin-worker.js +201 -0
  304. package/dist/sandbox/gondolin-worker.js.map +1 -0
  305. package/dist/sandbox/gondolin.d.ts +53 -0
  306. package/dist/sandbox/gondolin.d.ts.map +1 -0
  307. package/dist/sandbox/gondolin.js +429 -0
  308. package/dist/sandbox/gondolin.js.map +1 -0
  309. package/dist/sandbox/host.d.ts +3 -0
  310. package/dist/sandbox/host.d.ts.map +1 -1
  311. package/dist/sandbox/host.js +14 -0
  312. package/dist/sandbox/host.js.map +1 -1
  313. package/dist/sandbox/identity.d.ts +21 -0
  314. package/dist/sandbox/identity.d.ts.map +1 -0
  315. package/dist/sandbox/identity.js +36 -0
  316. package/dist/sandbox/identity.js.map +1 -0
  317. package/dist/sandbox/index.d.ts +13 -4
  318. package/dist/sandbox/index.d.ts.map +1 -1
  319. package/dist/sandbox/index.js +19 -3
  320. package/dist/sandbox/index.js.map +1 -1
  321. package/dist/sandbox/types.d.ts +31 -1
  322. package/dist/sandbox/types.d.ts.map +1 -1
  323. package/dist/sandbox/types.js.map +1 -1
  324. package/dist/sandbox/utils.d.ts +12 -0
  325. package/dist/sandbox/utils.d.ts.map +1 -1
  326. package/dist/sandbox/utils.js +38 -0
  327. package/dist/sandbox/utils.js.map +1 -1
  328. package/dist/sessions/chat-history-sync.d.ts +32 -0
  329. package/dist/sessions/chat-history-sync.d.ts.map +1 -0
  330. package/dist/sessions/{agent-memory-file-manager.js → chat-history-sync.js} +40 -113
  331. package/dist/sessions/chat-history-sync.js.map +1 -0
  332. package/dist/sessions/conversation-log.d.ts +13 -0
  333. package/dist/sessions/conversation-log.d.ts.map +1 -0
  334. package/dist/sessions/conversation-log.js +47 -0
  335. package/dist/sessions/conversation-log.js.map +1 -0
  336. package/dist/sessions/history-line.d.ts +20 -0
  337. package/dist/sessions/history-line.d.ts.map +1 -0
  338. package/dist/sessions/history-line.js +24 -0
  339. package/dist/sessions/history-line.js.map +1 -0
  340. package/dist/sessions/policy.d.ts.map +1 -1
  341. package/dist/sessions/policy.js +5 -3
  342. package/dist/sessions/policy.js.map +1 -1
  343. package/dist/sessions/rotation.d.ts +2 -0
  344. package/dist/sessions/rotation.d.ts.map +1 -0
  345. package/dist/sessions/rotation.js +39 -0
  346. package/dist/sessions/rotation.js.map +1 -0
  347. package/dist/sessions/session-key.d.ts +31 -0
  348. package/dist/sessions/session-key.d.ts.map +1 -0
  349. package/dist/sessions/session-key.js +44 -0
  350. package/dist/sessions/session-key.js.map +1 -0
  351. package/dist/sessions/store.d.ts.map +1 -1
  352. package/dist/sessions/store.js +6 -12
  353. package/dist/sessions/store.js.map +1 -1
  354. package/dist/sessions/types.d.ts +2 -2
  355. package/dist/sessions/types.d.ts.map +1 -1
  356. package/dist/sessions/types.js.map +1 -1
  357. package/dist/settings-mutation.d.ts +23 -0
  358. package/dist/settings-mutation.d.ts.map +1 -0
  359. package/dist/settings-mutation.js +42 -0
  360. package/dist/settings-mutation.js.map +1 -0
  361. package/dist/tools/bash.d.ts +3 -1
  362. package/dist/tools/bash.d.ts.map +1 -1
  363. package/dist/tools/bash.js +24 -17
  364. package/dist/tools/bash.js.map +1 -1
  365. package/dist/tools/edit.d.ts.map +1 -1
  366. package/dist/tools/edit.js +9 -12
  367. package/dist/tools/edit.js.map +1 -1
  368. package/dist/tools/event.d.ts +1 -1
  369. package/dist/tools/event.d.ts.map +1 -1
  370. package/dist/tools/event.js +53 -43
  371. package/dist/tools/event.js.map +1 -1
  372. package/dist/tools/generate-image.d.ts +17 -0
  373. package/dist/tools/generate-image.d.ts.map +1 -0
  374. package/dist/tools/generate-image.js +63 -0
  375. package/dist/tools/generate-image.js.map +1 -0
  376. package/dist/tools/host-fn-tool.d.ts +21 -0
  377. package/dist/tools/host-fn-tool.d.ts.map +1 -0
  378. package/dist/tools/host-fn-tool.js +32 -0
  379. package/dist/tools/host-fn-tool.js.map +1 -0
  380. package/dist/tools/index.d.ts +17 -2
  381. package/dist/tools/index.d.ts.map +1 -1
  382. package/dist/tools/index.js +28 -3
  383. package/dist/tools/index.js.map +1 -1
  384. package/dist/tools/react.d.ts +15 -0
  385. package/dist/tools/react.d.ts.map +1 -0
  386. package/dist/tools/react.js +29 -0
  387. package/dist/tools/react.js.map +1 -0
  388. package/dist/tools/read.d.ts.map +1 -1
  389. package/dist/tools/read.js +7 -26
  390. package/dist/tools/read.js.map +1 -1
  391. package/dist/tools/sandbox.d.ts +2 -2
  392. package/dist/tools/sandbox.d.ts.map +1 -1
  393. package/dist/tools/sandbox.js +13 -9
  394. package/dist/tools/sandbox.js.map +1 -1
  395. package/dist/tools/subagent-slots.d.ts +28 -0
  396. package/dist/tools/subagent-slots.d.ts.map +1 -0
  397. package/dist/tools/subagent-slots.js +57 -0
  398. package/dist/tools/subagent-slots.js.map +1 -0
  399. package/dist/tools/subagent.d.ts +74 -0
  400. package/dist/tools/subagent.d.ts.map +1 -0
  401. package/dist/tools/subagent.js +335 -0
  402. package/dist/tools/subagent.js.map +1 -0
  403. package/dist/tools/types.d.ts +40 -6
  404. package/dist/tools/types.d.ts.map +1 -1
  405. package/dist/tools/types.js.map +1 -1
  406. package/dist/tools/write.d.ts.map +1 -1
  407. package/dist/tools/write.js +1 -8
  408. package/dist/tools/write.js.map +1 -1
  409. package/dist/trigger.d.ts.map +1 -1
  410. package/dist/trigger.js +1 -2
  411. package/dist/trigger.js.map +1 -1
  412. package/dist/types.d.ts +144 -31
  413. package/dist/types.d.ts.map +1 -1
  414. package/dist/types.js.map +1 -1
  415. package/dist/utils/date.d.ts +1 -1
  416. package/dist/utils/date.js +1 -1
  417. package/dist/utils/date.js.map +1 -1
  418. package/dist/vault/disabled.d.ts +9 -0
  419. package/dist/vault/disabled.d.ts.map +1 -0
  420. package/dist/vault/disabled.js +22 -0
  421. package/dist/vault/disabled.js.map +1 -0
  422. package/dist/vault/index.d.ts +0 -2
  423. package/dist/vault/index.d.ts.map +1 -1
  424. package/dist/vault/index.js +1 -32
  425. package/dist/vault/index.js.map +1 -1
  426. package/dist/vault/injection.d.ts +20 -0
  427. package/dist/vault/injection.d.ts.map +1 -0
  428. package/dist/vault/injection.js +27 -0
  429. package/dist/vault/injection.js.map +1 -0
  430. package/dist/vault/policy.d.ts +20 -0
  431. package/dist/vault/policy.d.ts.map +1 -0
  432. package/dist/vault/policy.js +20 -0
  433. package/dist/vault/policy.js.map +1 -0
  434. package/dist/vault/types.d.ts +0 -2
  435. package/dist/vault/types.d.ts.map +1 -1
  436. package/dist/vault/types.js.map +1 -1
  437. package/dist/web/admin/portal.d.ts +27 -0
  438. package/dist/web/admin/portal.d.ts.map +1 -1
  439. package/dist/web/admin/portal.js +117 -154
  440. package/dist/web/admin/portal.js.map +1 -1
  441. package/dist/web/admin/types.d.ts +6 -0
  442. package/dist/web/admin/types.d.ts.map +1 -1
  443. package/dist/web/admin/types.js.map +1 -1
  444. package/dist/web/agent-events/portal.d.ts.map +1 -1
  445. package/dist/web/agent-events/portal.js +2 -1
  446. package/dist/web/agent-events/portal.js.map +1 -1
  447. package/dist/web/login/oauth.d.ts +2 -3
  448. package/dist/web/login/oauth.d.ts.map +1 -1
  449. package/dist/web/login/oauth.js +0 -31
  450. package/dist/web/login/oauth.js.map +1 -1
  451. package/dist/web/login/portal.js +1 -1
  452. package/dist/web/login/portal.js.map +1 -1
  453. package/dist/web/login/types.d.ts +0 -11
  454. package/dist/web/login/types.d.ts.map +1 -1
  455. package/dist/web/login/types.js.map +1 -1
  456. package/dist/web/portal-shell.d.ts +4 -0
  457. package/dist/web/portal-shell.d.ts.map +1 -0
  458. package/dist/{portal-shell.js → web/portal-shell.js} +2 -2
  459. package/dist/web/portal-shell.js.map +1 -0
  460. package/dist/web/server.d.ts.map +1 -1
  461. package/dist/web/server.js +7 -0
  462. package/dist/web/server.js.map +1 -1
  463. package/dist/web/session-view/command.d.ts.map +1 -1
  464. package/dist/web/session-view/command.js +4 -1
  465. package/dist/web/session-view/command.js.map +1 -1
  466. package/dist/web/session-view/portal.d.ts.map +1 -1
  467. package/dist/web/session-view/portal.js +4 -3
  468. package/dist/web/session-view/portal.js.map +1 -1
  469. package/dist/web/session-view/service.d.ts.map +1 -1
  470. package/dist/web/session-view/service.js +2 -1
  471. package/dist/web/session-view/service.js.map +1 -1
  472. package/dist/web/session-view/types.d.ts +2 -1
  473. package/dist/web/session-view/types.d.ts.map +1 -1
  474. package/dist/web/session-view/types.js.map +1 -1
  475. package/package.json +7 -4
  476. package/dist/download.d.ts.map +0 -1
  477. package/dist/download.js.map +0 -1
  478. package/dist/model-registry.d.ts +0 -4
  479. package/dist/model-registry.d.ts.map +0 -1
  480. package/dist/model-registry.js +0 -7
  481. package/dist/model-registry.js.map +0 -1
  482. package/dist/portal-shell.d.ts +0 -4
  483. package/dist/portal-shell.d.ts.map +0 -1
  484. package/dist/portal-shell.js.map +0 -1
  485. package/dist/runtime/agent-run-controller.d.ts +0 -31
  486. package/dist/runtime/agent-run-controller.d.ts.map +0 -1
  487. package/dist/runtime/agent-run-controller.js +0 -195
  488. package/dist/runtime/agent-run-controller.js.map +0 -1
  489. package/dist/sessions/agent-memory-file-manager.d.ts +0 -19
  490. package/dist/sessions/agent-memory-file-manager.d.ts.map +0 -1
  491. package/dist/sessions/agent-memory-file-manager.js.map +0 -1
  492. package/dist/vault/routing.d.ts +0 -3
  493. package/dist/vault/routing.d.ts.map +0 -1
  494. package/dist/vault/routing.js +0 -13
  495. package/dist/vault/routing.js.map +0 -1
  496. /package/dist/{download.d.ts → cli/download.d.ts} +0 -0
  497. /package/dist/{download.js → cli/download.js} +0 -0
@@ -17,6 +17,7 @@
17
17
  import { Agent, type AgentEvent, type AgentMessage, type AgentTool, type ThinkingLevel } from "@earendil-works/pi-agent-core";
18
18
  import { type Api, type ImageContent, type Model } from "@earendil-works/pi-ai";
19
19
  import type { ExtensionRegistry } from "./extensions/registry.js";
20
+ import type { RunOrigin } from "./extensions/types.js";
20
21
  import type { MikanModels } from "./models.js";
21
22
  import { resolveHarnessSettings, type BudgetSettings } from "./settings.js";
22
23
  import type { SessionStore } from "./session-store.js";
@@ -56,6 +57,11 @@ export type HarnessEvent = AgentEvent | {
56
57
  durationMs: number;
57
58
  };
58
59
  export type HarnessEventListener = (event: HarnessEvent) => void | Promise<void>;
60
+ /** Outcome of a `prompt()` call that an extension blocked before the model ran. */
61
+ export interface PromptBlockedOutcome {
62
+ blocked: true;
63
+ reason?: string;
64
+ }
59
65
  export interface MikanAgentSessionOptions {
60
66
  systemPrompt: string;
61
67
  model: Model<Api>;
@@ -80,26 +86,51 @@ export declare class MikanAgentSession {
80
86
  private tally;
81
87
  private runBudget;
82
88
  private budgetExceededReason;
89
+ private runOrigin;
83
90
  constructor(options: MikanAgentSessionOptions);
84
91
  /** Conversation transcript currently held by the agent. */
85
92
  get messages(): AgentMessage[];
86
93
  get model(): Model<Api>;
94
+ /** Resource totals and terminal budget state from the most recent prompt. */
95
+ getLastRunStats(): Readonly<{
96
+ tokens: number;
97
+ costUsd: number;
98
+ llmCalls: number;
99
+ durationMs: number;
100
+ budgetExceededReason?: string;
101
+ }>;
102
+ /**
103
+ * Fold spend incurred outside this session's own LLM calls — e.g. subagent
104
+ * runs launched by a tool during the current prompt — into the run tally
105
+ * and enforce the run budget at the fold itself: a fold that lands over a
106
+ * resource ceiling aborts the run now instead of waiting for a next
107
+ * assistant message that may never come (and would be paid for). Counts
108
+ * tokens and cost only; external runs are not this session's turns.
109
+ */
110
+ foldExternalUsage(usage: {
111
+ tokens?: number;
112
+ costUsd?: number;
113
+ }): Promise<void>;
87
114
  subscribe(listener: HarnessEventListener): () => void;
88
115
  /** Replace the agent transcript from the persisted session tree. */
89
116
  reloadFromSession(): number;
90
117
  /**
91
118
  * Send a user prompt and run the agent loop to completion, including
92
119
  * automatic retries and compaction. Resolves when the turn (and any
93
- * recovery continuations) settles.
120
+ * recovery continuations) settles. Returns a blocked outcome when a
121
+ * `before_agent_start` extension blocked the turn — the model was never
122
+ * called and nothing was persisted.
94
123
  *
95
124
  * @param options.budget Per-run resource ceilings that override the session
96
125
  * defaults. Autonomous (event / trigger) runs should pass a budget so a
97
126
  * runaway loop is stopped even with no human watching.
127
+ * @param options.origin Platform provenance forwarded to extension hooks.
98
128
  */
99
129
  prompt(text: string, options?: {
100
130
  images?: ImageContent[];
101
131
  budget?: BudgetSettings;
102
- }): Promise<void>;
132
+ origin?: RunOrigin;
133
+ }): Promise<PromptBlockedOutcome | undefined>;
103
134
  /** Abort the active run, pending retry backoff, and in-flight compaction. */
104
135
  abort(): void;
105
136
  private ensureAuthConfigured;
@@ -109,7 +140,11 @@ export declare class MikanAgentSession {
109
140
  private recordUsage;
110
141
  /** Compare the tally against the run budget; abort the run when a cap is exceeded. */
111
142
  private enforceBudget;
143
+ /** Mark the run over budget, notify listeners and extensions, abort the agent. */
144
+ private exceedBudget;
112
145
  private overBudgetReason;
146
+ /** The message-independent budget checks, shared with external-spend folds. */
147
+ private resourceOverBudgetReason;
113
148
  private findLastAssistantMessage;
114
149
  /** Decide what to do after a run settles. Returns true when the agent should continue. */
115
150
  private handlePostRun;
@@ -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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"}
@@ -66,20 +66,24 @@ export class MikanAgentSession {
66
66
  toolCallId: toolCall.id,
67
67
  toolName: toolCall.name,
68
68
  args,
69
+ origin: this.runOrigin,
69
70
  });
70
71
  return result ?? undefined;
71
72
  },
72
73
  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;
74
+ if (!this.extensions?.hasHandlers("tool_result"))
75
+ return undefined;
76
+ // Chained extension rewrites (redaction, truncation) become a
77
+ // pi-agent-core AfterToolCallResult override; undefined keeps the
78
+ // executed result untouched.
79
+ return this.extensions.emitToolResult({
80
+ toolCallId: toolCall.id,
81
+ toolName: toolCall.name,
82
+ args,
83
+ content: result.content,
84
+ isError,
85
+ origin: this.runOrigin,
86
+ });
83
87
  },
84
88
  });
85
89
  this.agent.subscribe(async (event) => {
@@ -93,6 +97,33 @@ export class MikanAgentSession {
93
97
  get model() {
94
98
  return this.agent.state.model;
95
99
  }
100
+ /** Resource totals and terminal budget state from the most recent prompt. */
101
+ getLastRunStats() {
102
+ return {
103
+ tokens: this.tally.tokens,
104
+ costUsd: this.tally.costUsd,
105
+ llmCalls: this.tally.llmCalls,
106
+ durationMs: this.tally.startedAt > 0 ? Date.now() - this.tally.startedAt : 0,
107
+ ...(this.budgetExceededReason ? { budgetExceededReason: this.budgetExceededReason } : {}),
108
+ };
109
+ }
110
+ /**
111
+ * Fold spend incurred outside this session's own LLM calls — e.g. subagent
112
+ * runs launched by a tool during the current prompt — into the run tally
113
+ * and enforce the run budget at the fold itself: a fold that lands over a
114
+ * resource ceiling aborts the run now instead of waiting for a next
115
+ * assistant message that may never come (and would be paid for). Counts
116
+ * tokens and cost only; external runs are not this session's turns.
117
+ */
118
+ async foldExternalUsage(usage) {
119
+ this.tally.tokens += usage.tokens ?? 0;
120
+ this.tally.costUsd += usage.costUsd ?? 0;
121
+ if (this.budgetExceededReason || !this.agent.state.isStreaming)
122
+ return;
123
+ const reason = this.resourceOverBudgetReason();
124
+ if (reason)
125
+ await this.exceedBudget(reason);
126
+ }
96
127
  subscribe(listener) {
97
128
  this.listeners.add(listener);
98
129
  return () => this.listeners.delete(listener);
@@ -108,11 +139,14 @@ export class MikanAgentSession {
108
139
  /**
109
140
  * Send a user prompt and run the agent loop to completion, including
110
141
  * automatic retries and compaction. Resolves when the turn (and any
111
- * recovery continuations) settles.
142
+ * recovery continuations) settles. Returns a blocked outcome when a
143
+ * `before_agent_start` extension blocked the turn — the model was never
144
+ * called and nothing was persisted.
112
145
  *
113
146
  * @param options.budget Per-run resource ceilings that override the session
114
147
  * defaults. Autonomous (event / trigger) runs should pass a budget so a
115
148
  * runaway loop is stopped even with no human watching.
149
+ * @param options.origin Platform provenance forwarded to extension hooks.
116
150
  */
117
151
  async prompt(text, options) {
118
152
  if (this.agent.state.isStreaming) {
@@ -125,36 +159,66 @@ export class MikanAgentSession {
125
159
  this.runBudget = { ...this.settings.budget, ...options?.budget };
126
160
  this.budgetExceededReason = undefined;
127
161
  this.tally = { tokens: 0, costUsd: 0, llmCalls: 0, startedAt: Date.now() };
162
+ this.runOrigin = options?.origin;
128
163
  // A previous turn may have ended over the threshold (for example after an
129
164
  // abort); compact before adding new context on top.
130
165
  const lastAssistant = this.findLastAssistantMessage();
131
166
  if (lastAssistant && lastAssistant.stopReason !== "error") {
132
167
  await this.checkThresholdCompaction(lastAssistant);
133
168
  }
169
+ let promptText = text;
134
170
  let systemPrompt = this.agent.state.systemPrompt;
135
171
  if (this.extensions?.hasHandlers("before_agent_start")) {
136
- const result = await this.extensions.emit("before_agent_start", {
137
- prompt: text,
172
+ const result = await this.extensions.emitBeforeAgentStart({
173
+ prompt: promptText,
138
174
  images: options?.images,
139
175
  systemPrompt,
176
+ origin: this.runOrigin,
140
177
  });
141
- if (result?.systemPrompt) {
178
+ if (result?.block) {
179
+ // Blocked before agent.prompt(): the user message never enters the
180
+ // transcript or session store, so the blocked turn leaves no trace.
181
+ log.logInfo(`Extension blocked turn${result.reason ? `: ${result.reason}` : ""}`);
182
+ return { blocked: true, reason: result.reason };
183
+ }
184
+ if (result?.prompt !== undefined && result.prompt !== promptText) {
185
+ log.logInfo(`Extension rewrote user prompt: ${promptText.length} → ${result.prompt.length} chars`);
186
+ promptText = result.prompt;
187
+ }
188
+ if (result?.systemPrompt && result.systemPrompt !== systemPrompt) {
189
+ // An extension rewrote the system prompt for this turn. Log the new
190
+ // size so the diagnostic in agent.ts (which logs the pre-hook prompt)
191
+ // isn't mistaken for the final prompt sent to the model.
192
+ log.logInfo(`Extension rewrote system prompt: ${systemPrompt.length} → ${result.systemPrompt.length} chars`);
142
193
  systemPrompt = result.systemPrompt;
143
194
  this.agent.state.systemPrompt = systemPrompt;
144
195
  }
145
196
  }
146
197
  const userMessage = {
147
198
  role: "user",
148
- content: [{ type: "text", text }, ...(options?.images ?? [])],
199
+ content: [{ type: "text", text: promptText }, ...(options?.images ?? [])],
149
200
  timestamp: Date.now(),
150
201
  };
151
202
  await this.agent.prompt([userMessage]);
152
203
  while (await this.handlePostRun()) {
153
204
  await this.agent.continue();
154
205
  }
206
+ // The turn settled on an error (retries exhausted or not retryable):
207
+ // give monitoring extensions the final failure, once per turn.
208
+ const settled = this.findLastAssistantMessage();
209
+ if (settled?.stopReason === "error" && this.extensions?.hasHandlers("agent_error")) {
210
+ await this.extensions.emit("agent_error", {
211
+ errorMessage: settled.errorMessage || "Unknown error",
212
+ origin: this.runOrigin,
213
+ });
214
+ }
155
215
  if (this.extensions?.hasHandlers("turn_end")) {
156
- await this.extensions.emit("turn_end", { messages: this.agent.state.messages });
216
+ await this.extensions.emit("turn_end", {
217
+ messages: this.agent.state.messages,
218
+ origin: this.runOrigin,
219
+ });
157
220
  }
221
+ return undefined;
158
222
  }
159
223
  /** Abort the active run, pending retry backoff, and in-flight compaction. */
160
224
  abort() {
@@ -191,11 +255,11 @@ export class MikanAgentSession {
191
255
  this.sessionStore.appendCustomMessageEntry(custom.customType, custom.content, custom.display, custom.details);
192
256
  }
193
257
  if (this.extensions?.hasHandlers("message_end")) {
194
- await this.extensions.emit("message_end", { message });
258
+ await this.extensions.emit("message_end", { message, origin: this.runOrigin });
195
259
  }
196
260
  if (message.role === "assistant") {
197
261
  this.recordUsage(message);
198
- await this.enforceBudget();
262
+ await this.enforceBudget(message);
199
263
  if (message.stopReason !== "error") {
200
264
  this.overflowRecoveryAttempted = false;
201
265
  if (this.retryAttempt > 0) {
@@ -215,12 +279,16 @@ export class MikanAgentSession {
215
279
  this.tally.costUsd += usage.cost?.total ?? 0;
216
280
  }
217
281
  /** Compare the tally against the run budget; abort the run when a cap is exceeded. */
218
- async enforceBudget() {
282
+ async enforceBudget(message) {
219
283
  if (this.budgetExceededReason)
220
284
  return;
221
- const reason = this.overBudgetReason();
285
+ const reason = this.overBudgetReason(message);
222
286
  if (!reason)
223
287
  return;
288
+ await this.exceedBudget(reason);
289
+ }
290
+ /** Mark the run over budget, notify listeners and extensions, abort the agent. */
291
+ async exceedBudget(reason) {
224
292
  this.budgetExceededReason = reason;
225
293
  await this.emit({
226
294
  type: "budget_exceeded",
@@ -230,14 +298,30 @@ export class MikanAgentSession {
230
298
  llmCalls: this.tally.llmCalls,
231
299
  durationMs: Date.now() - this.tally.startedAt,
232
300
  });
301
+ if (this.extensions?.hasHandlers("budget_exceeded")) {
302
+ await this.extensions.emit("budget_exceeded", {
303
+ reason,
304
+ tokens: this.tally.tokens,
305
+ costUsd: this.tally.costUsd,
306
+ llmCalls: this.tally.llmCalls,
307
+ durationMs: Date.now() - this.tally.startedAt,
308
+ origin: this.runOrigin,
309
+ });
310
+ }
233
311
  log.logWarning("Run budget exceeded — aborting", reason);
234
312
  this.agent.abort();
235
313
  }
236
- overBudgetReason() {
237
- const { maxTokens, maxCostUsd, maxDurationMs, maxLlmCalls } = this.runBudget;
238
- if (maxLlmCalls !== undefined && this.tally.llmCalls >= maxLlmCalls) {
314
+ overBudgetReason(message) {
315
+ const { maxLlmCalls } = this.runBudget;
316
+ const needsAnotherCall = message.stopReason === "error" || message.content.some((part) => part.type === "toolCall");
317
+ if (needsAnotherCall && maxLlmCalls !== undefined && this.tally.llmCalls >= maxLlmCalls) {
239
318
  return `${this.tally.llmCalls} LLM calls >= ${maxLlmCalls} limit`;
240
319
  }
320
+ return this.resourceOverBudgetReason();
321
+ }
322
+ /** The message-independent budget checks, shared with external-spend folds. */
323
+ resourceOverBudgetReason() {
324
+ const { maxTokens, maxCostUsd, maxDurationMs } = this.runBudget;
241
325
  if (maxTokens !== undefined && this.tally.tokens >= maxTokens) {
242
326
  return `${this.tally.tokens} tokens >= ${maxTokens} limit`;
243
327
  }
@@ -1 +1 @@
1
- {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/harness/runner.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * MikanAgentSession — mikan's agent run loop.\n *\n * Owns a pi-agent-core `Agent` and layers on the behaviors mikan needs for\n * long-lived chat conversations:\n *\n * - message persistence into the conversation's {@link SessionStore}\n * - automatic context compaction (threshold and overflow recovery), using\n * pi-agent-core's compaction pipeline over the session tree\n * - automatic retry with exponential backoff on transient provider errors\n * - extension hook dispatch ({@link ExtensionRegistry})\n *\n * Events mirror the agent's lifecycle events plus `compaction_start/_end`\n * and `auto_retry_start/_end`, preserving the event surface mikan's\n * platform adapters already render.\n */\nimport {\n Agent,\n calculateContextTokens,\n compact,\n convertToLlm,\n estimateContextTokens,\n getOrThrow,\n prepareCompaction,\n shouldCompact,\n type AgentEvent,\n type AgentMessage,\n type AgentTool,\n type CustomMessage,\n type ThinkingLevel,\n} from \"@earendil-works/pi-agent-core\";\nimport {\n isContextOverflow,\n type Api,\n type AssistantMessage,\n type ImageContent,\n type Model,\n} from \"@earendil-works/pi-ai\";\nimport * as log from \"../log.js\";\nimport type { ExtensionRegistry } from \"./extensions/registry.js\";\nimport type { MikanModels } from \"./models.js\";\nimport { resolveHarnessSettings, type BudgetSettings, type HarnessSettings } from \"./settings.js\";\nimport type { SessionStore } from \"./session-store.js\";\nimport type { CompactionEntry } from \"./types.js\";\n\nexport type CompactionReason = \"threshold\" | \"overflow\" | \"manual\";\n\n/** Running resource tally for the current `prompt()` call, matched against the budget. */\ninterface RunTally {\n tokens: number;\n costUsd: number;\n llmCalls: number;\n startedAt: number;\n}\n\ninterface CompactionResultSummary {\n summary: string;\n firstKeptEntryId: string;\n tokensBefore: number;\n}\n\nexport type HarnessEvent =\n | AgentEvent\n | { type: \"compaction_start\"; reason: CompactionReason }\n | {\n type: \"compaction_end\";\n reason: CompactionReason;\n result?: CompactionResultSummary;\n aborted: boolean;\n errorMessage?: string;\n }\n | {\n type: \"auto_retry_start\";\n attempt: number;\n maxAttempts: number;\n delayMs: number;\n errorMessage: string;\n }\n | { type: \"auto_retry_end\"; success: boolean; attempt: number; finalError?: string }\n | {\n type: \"budget_exceeded\";\n /** Which cap was hit, e.g. \"cost 2.01 USD > 2 USD limit\". */\n reason: string;\n tokens: number;\n costUsd: number;\n llmCalls: number;\n durationMs: number;\n };\n\nexport type HarnessEventListener = (event: HarnessEvent) => void | Promise<void>;\n\n// Transient provider failures worth retrying: overload/rate-limit responses,\n// 5xx statuses, and network/stream interruptions.\nconst RETRYABLE_ERROR_PATTERN =\n /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;\n\nfunction sleep(ms: number, signal: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal.aborted) {\n reject(new Error(\"aborted\"));\n return;\n }\n const timer = setTimeout(() => {\n signal.removeEventListener(\"abort\", onAbort);\n resolve();\n }, ms);\n const onAbort = () => {\n clearTimeout(timer);\n reject(new Error(\"aborted\"));\n };\n signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\nexport interface MikanAgentSessionOptions {\n systemPrompt: string;\n model: Model<Api>;\n thinkingLevel: ThinkingLevel;\n tools: AgentTool[];\n models: MikanModels;\n sessionStore: SessionStore;\n settings?: Parameters<typeof resolveHarnessSettings>[0];\n extensions?: ExtensionRegistry;\n}\n\nexport class MikanAgentSession {\n readonly agent: Agent;\n readonly sessionStore: SessionStore;\n private readonly models: MikanModels;\n private readonly settings: HarnessSettings;\n private readonly extensions: ExtensionRegistry | undefined;\n private listeners = new Set<HarnessEventListener>();\n private retryAttempt = 0;\n private overflowRecoveryAttempted = false;\n private retryAbortController: AbortController | undefined;\n private compactionAbortController: AbortController | undefined;\n private tally: RunTally = { tokens: 0, costUsd: 0, llmCalls: 0, startedAt: 0 };\n private runBudget: BudgetSettings = {};\n private budgetExceededReason: string | undefined;\n\n constructor(options: MikanAgentSessionOptions) {\n this.models = options.models;\n this.sessionStore = options.sessionStore;\n this.settings = resolveHarnessSettings(options.settings);\n this.extensions = options.extensions;\n\n const tools = [...options.tools, ...(options.extensions?.getContributedTools() ?? [])];\n this.agent = new Agent({\n initialState: {\n systemPrompt: options.systemPrompt,\n model: options.model,\n thinkingLevel: options.thinkingLevel,\n tools,\n },\n convertToLlm,\n streamFn: (model, context, streamOptions) =>\n this.models.models.streamSimple(model, context, streamOptions),\n beforeToolCall: async ({ toolCall, args }) => {\n if (!this.extensions?.hasHandlers(\"tool_call\")) return undefined;\n const result = await this.extensions.emit(\"tool_call\", {\n toolCallId: toolCall.id,\n toolName: toolCall.name,\n args,\n });\n return result ?? undefined;\n },\n afterToolCall: async ({ toolCall, args, result, isError }) => {\n if (this.extensions?.hasHandlers(\"tool_result\")) {\n await this.extensions.emit(\"tool_result\", {\n toolCallId: toolCall.id,\n toolName: toolCall.name,\n args,\n content: result.content,\n isError,\n });\n }\n return undefined;\n },\n });\n\n this.agent.subscribe(async (event) => {\n await this.handleAgentEvent(event);\n });\n }\n\n /** Conversation transcript currently held by the agent. */\n get messages(): AgentMessage[] {\n return this.agent.state.messages;\n }\n\n get model(): Model<Api> {\n return this.agent.state.model;\n }\n\n subscribe(listener: HarnessEventListener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n /** Replace the agent transcript from the persisted session tree. */\n reloadFromSession(): number {\n const context = this.sessionStore.buildSessionContext();\n if (context.messages.length > 0) {\n this.agent.state.messages = context.messages;\n }\n return context.messages.length;\n }\n\n /**\n * Send a user prompt and run the agent loop to completion, including\n * automatic retries and compaction. Resolves when the turn (and any\n * recovery continuations) settles.\n *\n * @param options.budget Per-run resource ceilings that override the session\n * defaults. Autonomous (event / trigger) runs should pass a budget so a\n * runaway loop is stopped even with no human watching.\n */\n async prompt(\n text: string,\n options?: { images?: ImageContent[]; budget?: BudgetSettings },\n ): Promise<void> {\n if (this.agent.state.isStreaming) {\n throw new Error(\"Agent is already processing a prompt\");\n }\n\n const model = this.agent.state.model;\n await this.ensureAuthConfigured(model);\n\n this.retryAttempt = 0;\n this.overflowRecoveryAttempted = false;\n this.runBudget = { ...this.settings.budget, ...options?.budget };\n this.budgetExceededReason = undefined;\n this.tally = { tokens: 0, costUsd: 0, llmCalls: 0, startedAt: Date.now() };\n\n // A previous turn may have ended over the threshold (for example after an\n // abort); compact before adding new context on top.\n const lastAssistant = this.findLastAssistantMessage();\n if (lastAssistant && lastAssistant.stopReason !== \"error\") {\n await this.checkThresholdCompaction(lastAssistant);\n }\n\n let systemPrompt = this.agent.state.systemPrompt;\n if (this.extensions?.hasHandlers(\"before_agent_start\")) {\n const result = await this.extensions.emit(\"before_agent_start\", {\n prompt: text,\n images: options?.images,\n systemPrompt,\n });\n if (result?.systemPrompt) {\n systemPrompt = result.systemPrompt;\n this.agent.state.systemPrompt = systemPrompt;\n }\n }\n\n const userMessage: AgentMessage = {\n role: \"user\",\n content: [{ type: \"text\", text }, ...(options?.images ?? [])],\n timestamp: Date.now(),\n };\n\n await this.agent.prompt([userMessage]);\n while (await this.handlePostRun()) {\n await this.agent.continue();\n }\n\n if (this.extensions?.hasHandlers(\"turn_end\")) {\n await this.extensions.emit(\"turn_end\", { messages: this.agent.state.messages });\n }\n }\n\n /** Abort the active run, pending retry backoff, and in-flight compaction. */\n abort(): void {\n this.retryAbortController?.abort();\n this.compactionAbortController?.abort();\n this.agent.abort();\n }\n\n private async ensureAuthConfigured(model: Model<Api>): Promise<void> {\n const auth = await this.models.getAuth(model);\n if (!auth) {\n throw new Error(\n `No credentials for provider \"${model.provider}\". Set the provider API key environment variable or add it to auth.json.`,\n );\n }\n }\n\n private async emit(event: HarnessEvent): Promise<void> {\n for (const listener of this.listeners) {\n try {\n await listener(event);\n } catch (err) {\n log.logWarning(\n \"Harness event listener failed\",\n err instanceof Error ? err.message : String(err),\n );\n }\n }\n }\n\n private async handleAgentEvent(event: AgentEvent): Promise<void> {\n await this.emit(event);\n\n if (event.type !== \"message_end\") return;\n const message = event.message;\n\n if (message.role === \"user\" || message.role === \"assistant\" || message.role === \"toolResult\") {\n this.sessionStore.appendMessage(message);\n } else if (message.role === \"custom\") {\n const custom = message as CustomMessage;\n this.sessionStore.appendCustomMessageEntry(\n custom.customType,\n custom.content,\n custom.display,\n custom.details,\n );\n }\n\n if (this.extensions?.hasHandlers(\"message_end\")) {\n await this.extensions.emit(\"message_end\", { message });\n }\n\n if (message.role === \"assistant\") {\n this.recordUsage(message);\n await this.enforceBudget();\n if (message.stopReason !== \"error\") {\n this.overflowRecoveryAttempted = false;\n if (this.retryAttempt > 0) {\n await this.emit({ type: \"auto_retry_end\", success: true, attempt: this.retryAttempt });\n this.retryAttempt = 0;\n }\n }\n }\n }\n\n /** Fold one assistant turn's usage into the running per-run tally. */\n private recordUsage(message: AssistantMessage): void {\n this.tally.llmCalls += 1;\n const usage = message.usage;\n if (!usage) return;\n this.tally.tokens += usage.input + usage.output + usage.cacheRead + usage.cacheWrite;\n this.tally.costUsd += usage.cost?.total ?? 0;\n }\n\n /** Compare the tally against the run budget; abort the run when a cap is exceeded. */\n private async enforceBudget(): Promise<void> {\n if (this.budgetExceededReason) return;\n const reason = this.overBudgetReason();\n if (!reason) return;\n\n this.budgetExceededReason = reason;\n await this.emit({\n type: \"budget_exceeded\",\n reason,\n tokens: this.tally.tokens,\n costUsd: this.tally.costUsd,\n llmCalls: this.tally.llmCalls,\n durationMs: Date.now() - this.tally.startedAt,\n });\n log.logWarning(\"Run budget exceeded — aborting\", reason);\n this.agent.abort();\n }\n\n private overBudgetReason(): string | undefined {\n const { maxTokens, maxCostUsd, maxDurationMs, maxLlmCalls } = this.runBudget;\n if (maxLlmCalls !== undefined && this.tally.llmCalls >= maxLlmCalls) {\n return `${this.tally.llmCalls} LLM calls >= ${maxLlmCalls} limit`;\n }\n if (maxTokens !== undefined && this.tally.tokens >= maxTokens) {\n return `${this.tally.tokens} tokens >= ${maxTokens} limit`;\n }\n if (maxCostUsd !== undefined && this.tally.costUsd >= maxCostUsd) {\n return `cost ${this.tally.costUsd.toFixed(2)} USD >= ${maxCostUsd} USD limit`;\n }\n if (maxDurationMs !== undefined && Date.now() - this.tally.startedAt >= maxDurationMs) {\n return `${Date.now() - this.tally.startedAt}ms >= ${maxDurationMs}ms limit`;\n }\n return undefined;\n }\n\n private findLastAssistantMessage(): AssistantMessage | undefined {\n const messages = this.agent.state.messages;\n for (let i = messages.length - 1; i >= 0; i--) {\n const message = messages[i];\n if (message.role === \"assistant\") return message;\n }\n return undefined;\n }\n\n /** Decide what to do after a run settles. Returns true when the agent should continue. */\n private async handlePostRun(): Promise<boolean> {\n // A run stopped for going over budget must not be retried or compacted back\n // into another continuation — that would defeat the circuit breaker.\n if (this.budgetExceededReason) return false;\n\n const lastAssistant = this.findLastAssistantMessage();\n if (!lastAssistant) return false;\n\n if (lastAssistant.stopReason === \"error\") {\n const contextWindow = this.agent.state.model.contextWindow || 0;\n if (isContextOverflow(lastAssistant, contextWindow)) {\n return this.handleOverflow();\n }\n if (this.isRetryableError(lastAssistant)) {\n return this.prepareRetry(lastAssistant);\n }\n return false;\n }\n\n return this.checkThresholdCompaction(lastAssistant);\n }\n\n private async handleOverflow(): Promise<boolean> {\n if (this.overflowRecoveryAttempted) {\n await this.emit({\n type: \"compaction_end\",\n reason: \"overflow\",\n aborted: false,\n errorMessage:\n \"Context overflow recovery failed after one compact-and-retry attempt. Try /new or a larger-context model.\",\n });\n return false;\n }\n this.overflowRecoveryAttempted = true;\n this.dropTrailingErrorMessage();\n return this.runCompaction(\"overflow\", true);\n }\n\n private async checkThresholdCompaction(lastAssistant: AssistantMessage): Promise<boolean> {\n const settings = this.settings.compaction;\n if (!settings.enabled) return false;\n const contextWindow = this.agent.state.model.contextWindow || 0;\n if (contextWindow <= 0) return false;\n\n let contextTokens = lastAssistant.usage ? calculateContextTokens(lastAssistant.usage) : 0;\n if (contextTokens === 0) {\n const estimate = estimateContextTokens(this.agent.state.messages);\n if (estimate.lastUsageIndex === null) return false;\n contextTokens = estimate.tokens;\n }\n\n if (!shouldCompact(contextTokens, contextWindow, settings)) return false;\n return this.runCompaction(\"threshold\", false);\n }\n\n private async runCompaction(reason: CompactionReason, willRetry: boolean): Promise<boolean> {\n let started = false;\n try {\n const pathEntries = this.sessionStore.getBranch();\n const preparation = getOrThrow(prepareCompaction(pathEntries, this.settings.compaction));\n if (!preparation) return false;\n\n await this.emit({ type: \"compaction_start\", reason });\n started = true;\n this.compactionAbortController = new AbortController();\n const signal = this.compactionAbortController.signal;\n\n const result = getOrThrow(\n await compact(\n preparation,\n this.models.models,\n this.agent.state.model,\n undefined,\n signal,\n this.agent.state.thinkingLevel,\n ),\n );\n if (signal.aborted) {\n await this.emit({ type: \"compaction_end\", reason, aborted: true });\n return false;\n }\n\n const entryId = this.sessionStore.appendCompaction(\n result.summary,\n result.firstKeptEntryId,\n result.tokensBefore,\n result.details,\n );\n const context = this.sessionStore.buildSessionContext();\n this.agent.state.messages = context.messages;\n\n if (this.extensions?.hasHandlers(\"session_compact\")) {\n const entry = this.sessionStore.getEntry(entryId);\n if (entry?.type === \"compaction\") {\n await this.extensions.emit(\"session_compact\", {\n entry: entry as CompactionEntry,\n reason,\n });\n }\n }\n\n await this.emit({\n type: \"compaction_end\",\n reason,\n result: {\n summary: result.summary,\n firstKeptEntryId: result.firstKeptEntryId,\n tokensBefore: result.tokensBefore,\n },\n aborted: false,\n });\n\n if (willRetry) {\n this.dropTrailingErrorMessage();\n return true;\n }\n return this.agent.hasQueuedMessages();\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : \"compaction failed\";\n if (started) {\n await this.emit({\n type: \"compaction_end\",\n reason,\n aborted: false,\n errorMessage:\n reason === \"overflow\"\n ? `Context overflow recovery failed: ${errorMessage}`\n : `Auto-compaction failed: ${errorMessage}`,\n });\n } else {\n log.logWarning(\"Compaction preparation failed\", errorMessage);\n }\n return false;\n } finally {\n this.compactionAbortController = undefined;\n }\n }\n\n private isRetryableError(message: AssistantMessage): boolean {\n if (message.stopReason !== \"error\" || !message.errorMessage) return false;\n return RETRYABLE_ERROR_PATTERN.test(message.errorMessage);\n }\n\n private async prepareRetry(message: AssistantMessage): Promise<boolean> {\n const settings = this.settings.retry;\n if (!settings.enabled) return false;\n\n this.retryAttempt++;\n if (this.retryAttempt > settings.maxRetries) {\n this.retryAttempt--;\n await this.emit({\n type: \"auto_retry_end\",\n success: false,\n attempt: this.retryAttempt,\n finalError: message.errorMessage,\n });\n this.retryAttempt = 0;\n return false;\n }\n\n const delayMs = settings.baseDelayMs * 2 ** (this.retryAttempt - 1);\n await this.emit({\n type: \"auto_retry_start\",\n attempt: this.retryAttempt,\n maxAttempts: settings.maxRetries,\n delayMs,\n errorMessage: message.errorMessage || \"Unknown error\",\n });\n\n this.dropTrailingErrorMessage();\n\n this.retryAbortController = new AbortController();\n try {\n await sleep(delayMs, this.retryAbortController.signal);\n } catch {\n const attempt = this.retryAttempt;\n this.retryAttempt = 0;\n await this.emit({\n type: \"auto_retry_end\",\n success: false,\n attempt,\n finalError: \"Retry cancelled\",\n });\n return false;\n } finally {\n this.retryAbortController = undefined;\n }\n return true;\n }\n\n private dropTrailingErrorMessage(): void {\n const messages = this.agent.state.messages;\n if (messages.length > 0 && messages[messages.length - 1].role === \"assistant\") {\n this.agent.state.messages = messages.slice(0, -1);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/harness/runner.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * MikanAgentSession — mikan's agent run loop.\n *\n * Owns a pi-agent-core `Agent` and layers on the behaviors mikan needs for\n * long-lived chat conversations:\n *\n * - message persistence into the conversation's {@link SessionStore}\n * - automatic context compaction (threshold and overflow recovery), using\n * pi-agent-core's compaction pipeline over the session tree\n * - automatic retry with exponential backoff on transient provider errors\n * - extension hook dispatch ({@link ExtensionRegistry})\n *\n * Events mirror the agent's lifecycle events plus `compaction_start/_end`\n * and `auto_retry_start/_end`, preserving the event surface mikan's\n * platform adapters already render.\n */\nimport {\n Agent,\n calculateContextTokens,\n compact,\n convertToLlm,\n estimateContextTokens,\n getOrThrow,\n prepareCompaction,\n shouldCompact,\n type AgentEvent,\n type AgentMessage,\n type AgentTool,\n type CustomMessage,\n type ThinkingLevel,\n} from \"@earendil-works/pi-agent-core\";\nimport {\n isContextOverflow,\n type Api,\n type AssistantMessage,\n type ImageContent,\n type Model,\n} from \"@earendil-works/pi-ai\";\nimport * as log from \"../log.js\";\nimport type { ExtensionRegistry } from \"./extensions/registry.js\";\nimport type { RunOrigin } from \"./extensions/types.js\";\nimport type { MikanModels } from \"./models.js\";\nimport { resolveHarnessSettings, type BudgetSettings, type HarnessSettings } from \"./settings.js\";\nimport type { SessionStore } from \"./session-store.js\";\nimport type { CompactionEntry } from \"./types.js\";\n\nexport type CompactionReason = \"threshold\" | \"overflow\" | \"manual\";\n\n/** Running resource tally for the current `prompt()` call, matched against the budget. */\ninterface RunTally {\n tokens: number;\n costUsd: number;\n llmCalls: number;\n startedAt: number;\n}\n\ninterface CompactionResultSummary {\n summary: string;\n firstKeptEntryId: string;\n tokensBefore: number;\n}\n\nexport type HarnessEvent =\n | AgentEvent\n | { type: \"compaction_start\"; reason: CompactionReason }\n | {\n type: \"compaction_end\";\n reason: CompactionReason;\n result?: CompactionResultSummary;\n aborted: boolean;\n errorMessage?: string;\n }\n | {\n type: \"auto_retry_start\";\n attempt: number;\n maxAttempts: number;\n delayMs: number;\n errorMessage: string;\n }\n | { type: \"auto_retry_end\"; success: boolean; attempt: number; finalError?: string }\n | {\n type: \"budget_exceeded\";\n /** Which cap was hit, e.g. \"cost 2.01 USD > 2 USD limit\". */\n reason: string;\n tokens: number;\n costUsd: number;\n llmCalls: number;\n durationMs: number;\n };\n\nexport type HarnessEventListener = (event: HarnessEvent) => void | Promise<void>;\n\n/** Outcome of a `prompt()` call that an extension blocked before the model ran. */\nexport interface PromptBlockedOutcome {\n blocked: true;\n reason?: string;\n}\n\n// Transient provider failures worth retrying: overload/rate-limit responses,\n// 5xx statuses, and network/stream interruptions.\nconst RETRYABLE_ERROR_PATTERN =\n /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;\n\nfunction sleep(ms: number, signal: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal.aborted) {\n reject(new Error(\"aborted\"));\n return;\n }\n const timer = setTimeout(() => {\n signal.removeEventListener(\"abort\", onAbort);\n resolve();\n }, ms);\n const onAbort = () => {\n clearTimeout(timer);\n reject(new Error(\"aborted\"));\n };\n signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\nexport interface MikanAgentSessionOptions {\n systemPrompt: string;\n model: Model<Api>;\n thinkingLevel: ThinkingLevel;\n tools: AgentTool[];\n models: MikanModels;\n sessionStore: SessionStore;\n settings?: Parameters<typeof resolveHarnessSettings>[0];\n extensions?: ExtensionRegistry;\n}\n\nexport class MikanAgentSession {\n readonly agent: Agent;\n readonly sessionStore: SessionStore;\n private readonly models: MikanModels;\n private readonly settings: HarnessSettings;\n private readonly extensions: ExtensionRegistry | undefined;\n private listeners = new Set<HarnessEventListener>();\n private retryAttempt = 0;\n private overflowRecoveryAttempted = false;\n private retryAbortController: AbortController | undefined;\n private compactionAbortController: AbortController | undefined;\n private tally: RunTally = { tokens: 0, costUsd: 0, llmCalls: 0, startedAt: 0 };\n private runBudget: BudgetSettings = {};\n private budgetExceededReason: string | undefined;\n private runOrigin: RunOrigin | undefined;\n\n constructor(options: MikanAgentSessionOptions) {\n this.models = options.models;\n this.sessionStore = options.sessionStore;\n this.settings = resolveHarnessSettings(options.settings);\n this.extensions = options.extensions;\n\n const tools = [...options.tools, ...(options.extensions?.getContributedTools() ?? [])];\n this.agent = new Agent({\n initialState: {\n systemPrompt: options.systemPrompt,\n model: options.model,\n thinkingLevel: options.thinkingLevel,\n tools,\n },\n convertToLlm,\n streamFn: (model, context, streamOptions) =>\n this.models.models.streamSimple(model, context, streamOptions),\n beforeToolCall: async ({ toolCall, args }) => {\n if (!this.extensions?.hasHandlers(\"tool_call\")) return undefined;\n const result = await this.extensions.emit(\"tool_call\", {\n toolCallId: toolCall.id,\n toolName: toolCall.name,\n args,\n origin: this.runOrigin,\n });\n return result ?? undefined;\n },\n afterToolCall: async ({ toolCall, args, result, isError }) => {\n if (!this.extensions?.hasHandlers(\"tool_result\")) return undefined;\n // Chained extension rewrites (redaction, truncation) become a\n // pi-agent-core AfterToolCallResult override; undefined keeps the\n // executed result untouched.\n return this.extensions.emitToolResult({\n toolCallId: toolCall.id,\n toolName: toolCall.name,\n args,\n content: result.content,\n isError,\n origin: this.runOrigin,\n });\n },\n });\n\n this.agent.subscribe(async (event) => {\n await this.handleAgentEvent(event);\n });\n }\n\n /** Conversation transcript currently held by the agent. */\n get messages(): AgentMessage[] {\n return this.agent.state.messages;\n }\n\n get model(): Model<Api> {\n return this.agent.state.model;\n }\n\n /** Resource totals and terminal budget state from the most recent prompt. */\n getLastRunStats(): Readonly<{\n tokens: number;\n costUsd: number;\n llmCalls: number;\n durationMs: number;\n budgetExceededReason?: string;\n }> {\n return {\n tokens: this.tally.tokens,\n costUsd: this.tally.costUsd,\n llmCalls: this.tally.llmCalls,\n durationMs: this.tally.startedAt > 0 ? Date.now() - this.tally.startedAt : 0,\n ...(this.budgetExceededReason ? { budgetExceededReason: this.budgetExceededReason } : {}),\n };\n }\n\n /**\n * Fold spend incurred outside this session's own LLM calls — e.g. subagent\n * runs launched by a tool during the current prompt — into the run tally\n * and enforce the run budget at the fold itself: a fold that lands over a\n * resource ceiling aborts the run now instead of waiting for a next\n * assistant message that may never come (and would be paid for). Counts\n * tokens and cost only; external runs are not this session's turns.\n */\n async foldExternalUsage(usage: { tokens?: number; costUsd?: number }): Promise<void> {\n this.tally.tokens += usage.tokens ?? 0;\n this.tally.costUsd += usage.costUsd ?? 0;\n if (this.budgetExceededReason || !this.agent.state.isStreaming) return;\n const reason = this.resourceOverBudgetReason();\n if (reason) await this.exceedBudget(reason);\n }\n\n subscribe(listener: HarnessEventListener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n /** Replace the agent transcript from the persisted session tree. */\n reloadFromSession(): number {\n const context = this.sessionStore.buildSessionContext();\n if (context.messages.length > 0) {\n this.agent.state.messages = context.messages;\n }\n return context.messages.length;\n }\n\n /**\n * Send a user prompt and run the agent loop to completion, including\n * automatic retries and compaction. Resolves when the turn (and any\n * recovery continuations) settles. Returns a blocked outcome when a\n * `before_agent_start` extension blocked the turn — the model was never\n * called and nothing was persisted.\n *\n * @param options.budget Per-run resource ceilings that override the session\n * defaults. Autonomous (event / trigger) runs should pass a budget so a\n * runaway loop is stopped even with no human watching.\n * @param options.origin Platform provenance forwarded to extension hooks.\n */\n async prompt(\n text: string,\n options?: { images?: ImageContent[]; budget?: BudgetSettings; origin?: RunOrigin },\n ): Promise<PromptBlockedOutcome | undefined> {\n if (this.agent.state.isStreaming) {\n throw new Error(\"Agent is already processing a prompt\");\n }\n\n const model = this.agent.state.model;\n await this.ensureAuthConfigured(model);\n\n this.retryAttempt = 0;\n this.overflowRecoveryAttempted = false;\n this.runBudget = { ...this.settings.budget, ...options?.budget };\n this.budgetExceededReason = undefined;\n this.tally = { tokens: 0, costUsd: 0, llmCalls: 0, startedAt: Date.now() };\n this.runOrigin = options?.origin;\n\n // A previous turn may have ended over the threshold (for example after an\n // abort); compact before adding new context on top.\n const lastAssistant = this.findLastAssistantMessage();\n if (lastAssistant && lastAssistant.stopReason !== \"error\") {\n await this.checkThresholdCompaction(lastAssistant);\n }\n\n let promptText = text;\n let systemPrompt = this.agent.state.systemPrompt;\n if (this.extensions?.hasHandlers(\"before_agent_start\")) {\n const result = await this.extensions.emitBeforeAgentStart({\n prompt: promptText,\n images: options?.images,\n systemPrompt,\n origin: this.runOrigin,\n });\n if (result?.block) {\n // Blocked before agent.prompt(): the user message never enters the\n // transcript or session store, so the blocked turn leaves no trace.\n log.logInfo(`Extension blocked turn${result.reason ? `: ${result.reason}` : \"\"}`);\n return { blocked: true, reason: result.reason };\n }\n if (result?.prompt !== undefined && result.prompt !== promptText) {\n log.logInfo(\n `Extension rewrote user prompt: ${promptText.length} → ${result.prompt.length} chars`,\n );\n promptText = result.prompt;\n }\n if (result?.systemPrompt && result.systemPrompt !== systemPrompt) {\n // An extension rewrote the system prompt for this turn. Log the new\n // size so the diagnostic in agent.ts (which logs the pre-hook prompt)\n // isn't mistaken for the final prompt sent to the model.\n log.logInfo(\n `Extension rewrote system prompt: ${systemPrompt.length} → ${result.systemPrompt.length} chars`,\n );\n systemPrompt = result.systemPrompt;\n this.agent.state.systemPrompt = systemPrompt;\n }\n }\n\n const userMessage: AgentMessage = {\n role: \"user\",\n content: [{ type: \"text\", text: promptText }, ...(options?.images ?? [])],\n timestamp: Date.now(),\n };\n\n await this.agent.prompt([userMessage]);\n while (await this.handlePostRun()) {\n await this.agent.continue();\n }\n\n // The turn settled on an error (retries exhausted or not retryable):\n // give monitoring extensions the final failure, once per turn.\n const settled = this.findLastAssistantMessage();\n if (settled?.stopReason === \"error\" && this.extensions?.hasHandlers(\"agent_error\")) {\n await this.extensions.emit(\"agent_error\", {\n errorMessage: settled.errorMessage || \"Unknown error\",\n origin: this.runOrigin,\n });\n }\n\n if (this.extensions?.hasHandlers(\"turn_end\")) {\n await this.extensions.emit(\"turn_end\", {\n messages: this.agent.state.messages,\n origin: this.runOrigin,\n });\n }\n return undefined;\n }\n\n /** Abort the active run, pending retry backoff, and in-flight compaction. */\n abort(): void {\n this.retryAbortController?.abort();\n this.compactionAbortController?.abort();\n this.agent.abort();\n }\n\n private async ensureAuthConfigured(model: Model<Api>): Promise<void> {\n const auth = await this.models.getAuth(model);\n if (!auth) {\n throw new Error(\n `No credentials for provider \"${model.provider}\". Set the provider API key environment variable or add it to auth.json.`,\n );\n }\n }\n\n private async emit(event: HarnessEvent): Promise<void> {\n for (const listener of this.listeners) {\n try {\n await listener(event);\n } catch (err) {\n log.logWarning(\n \"Harness event listener failed\",\n err instanceof Error ? err.message : String(err),\n );\n }\n }\n }\n\n private async handleAgentEvent(event: AgentEvent): Promise<void> {\n await this.emit(event);\n\n if (event.type !== \"message_end\") return;\n const message = event.message;\n\n if (message.role === \"user\" || message.role === \"assistant\" || message.role === \"toolResult\") {\n this.sessionStore.appendMessage(message);\n } else if (message.role === \"custom\") {\n const custom = message as CustomMessage;\n this.sessionStore.appendCustomMessageEntry(\n custom.customType,\n custom.content,\n custom.display,\n custom.details,\n );\n }\n\n if (this.extensions?.hasHandlers(\"message_end\")) {\n await this.extensions.emit(\"message_end\", { message, origin: this.runOrigin });\n }\n\n if (message.role === \"assistant\") {\n this.recordUsage(message);\n await this.enforceBudget(message);\n if (message.stopReason !== \"error\") {\n this.overflowRecoveryAttempted = false;\n if (this.retryAttempt > 0) {\n await this.emit({ type: \"auto_retry_end\", success: true, attempt: this.retryAttempt });\n this.retryAttempt = 0;\n }\n }\n }\n }\n\n /** Fold one assistant turn's usage into the running per-run tally. */\n private recordUsage(message: AssistantMessage): void {\n this.tally.llmCalls += 1;\n const usage = message.usage;\n if (!usage) return;\n this.tally.tokens += usage.input + usage.output + usage.cacheRead + usage.cacheWrite;\n this.tally.costUsd += usage.cost?.total ?? 0;\n }\n\n /** Compare the tally against the run budget; abort the run when a cap is exceeded. */\n private async enforceBudget(message: AssistantMessage): Promise<void> {\n if (this.budgetExceededReason) return;\n const reason = this.overBudgetReason(message);\n if (!reason) return;\n await this.exceedBudget(reason);\n }\n\n /** Mark the run over budget, notify listeners and extensions, abort the agent. */\n private async exceedBudget(reason: string): Promise<void> {\n this.budgetExceededReason = reason;\n await this.emit({\n type: \"budget_exceeded\",\n reason,\n tokens: this.tally.tokens,\n costUsd: this.tally.costUsd,\n llmCalls: this.tally.llmCalls,\n durationMs: Date.now() - this.tally.startedAt,\n });\n if (this.extensions?.hasHandlers(\"budget_exceeded\")) {\n await this.extensions.emit(\"budget_exceeded\", {\n reason,\n tokens: this.tally.tokens,\n costUsd: this.tally.costUsd,\n llmCalls: this.tally.llmCalls,\n durationMs: Date.now() - this.tally.startedAt,\n origin: this.runOrigin,\n });\n }\n log.logWarning(\"Run budget exceeded — aborting\", reason);\n this.agent.abort();\n }\n\n private overBudgetReason(message: AssistantMessage): string | undefined {\n const { maxLlmCalls } = this.runBudget;\n const needsAnotherCall =\n message.stopReason === \"error\" || message.content.some((part) => part.type === \"toolCall\");\n if (needsAnotherCall && maxLlmCalls !== undefined && this.tally.llmCalls >= maxLlmCalls) {\n return `${this.tally.llmCalls} LLM calls >= ${maxLlmCalls} limit`;\n }\n return this.resourceOverBudgetReason();\n }\n\n /** The message-independent budget checks, shared with external-spend folds. */\n private resourceOverBudgetReason(): string | undefined {\n const { maxTokens, maxCostUsd, maxDurationMs } = this.runBudget;\n if (maxTokens !== undefined && this.tally.tokens >= maxTokens) {\n return `${this.tally.tokens} tokens >= ${maxTokens} limit`;\n }\n if (maxCostUsd !== undefined && this.tally.costUsd >= maxCostUsd) {\n return `cost ${this.tally.costUsd.toFixed(2)} USD >= ${maxCostUsd} USD limit`;\n }\n if (maxDurationMs !== undefined && Date.now() - this.tally.startedAt >= maxDurationMs) {\n return `${Date.now() - this.tally.startedAt}ms >= ${maxDurationMs}ms limit`;\n }\n return undefined;\n }\n\n private findLastAssistantMessage(): AssistantMessage | undefined {\n const messages = this.agent.state.messages;\n for (let i = messages.length - 1; i >= 0; i--) {\n const message = messages[i];\n if (message.role === \"assistant\") return message;\n }\n return undefined;\n }\n\n /** Decide what to do after a run settles. Returns true when the agent should continue. */\n private async handlePostRun(): Promise<boolean> {\n // A run stopped for going over budget must not be retried or compacted back\n // into another continuation — that would defeat the circuit breaker.\n if (this.budgetExceededReason) return false;\n\n const lastAssistant = this.findLastAssistantMessage();\n if (!lastAssistant) return false;\n\n if (lastAssistant.stopReason === \"error\") {\n const contextWindow = this.agent.state.model.contextWindow || 0;\n if (isContextOverflow(lastAssistant, contextWindow)) {\n return this.handleOverflow();\n }\n if (this.isRetryableError(lastAssistant)) {\n return this.prepareRetry(lastAssistant);\n }\n return false;\n }\n\n return this.checkThresholdCompaction(lastAssistant);\n }\n\n private async handleOverflow(): Promise<boolean> {\n if (this.overflowRecoveryAttempted) {\n await this.emit({\n type: \"compaction_end\",\n reason: \"overflow\",\n aborted: false,\n errorMessage:\n \"Context overflow recovery failed after one compact-and-retry attempt. Try /new or a larger-context model.\",\n });\n return false;\n }\n this.overflowRecoveryAttempted = true;\n this.dropTrailingErrorMessage();\n return this.runCompaction(\"overflow\", true);\n }\n\n private async checkThresholdCompaction(lastAssistant: AssistantMessage): Promise<boolean> {\n const settings = this.settings.compaction;\n if (!settings.enabled) return false;\n const contextWindow = this.agent.state.model.contextWindow || 0;\n if (contextWindow <= 0) return false;\n\n let contextTokens = lastAssistant.usage ? calculateContextTokens(lastAssistant.usage) : 0;\n if (contextTokens === 0) {\n const estimate = estimateContextTokens(this.agent.state.messages);\n if (estimate.lastUsageIndex === null) return false;\n contextTokens = estimate.tokens;\n }\n\n if (!shouldCompact(contextTokens, contextWindow, settings)) return false;\n return this.runCompaction(\"threshold\", false);\n }\n\n private async runCompaction(reason: CompactionReason, willRetry: boolean): Promise<boolean> {\n let started = false;\n try {\n const pathEntries = this.sessionStore.getBranch();\n const preparation = getOrThrow(prepareCompaction(pathEntries, this.settings.compaction));\n if (!preparation) return false;\n\n await this.emit({ type: \"compaction_start\", reason });\n started = true;\n this.compactionAbortController = new AbortController();\n const signal = this.compactionAbortController.signal;\n\n const result = getOrThrow(\n await compact(\n preparation,\n this.models.models,\n this.agent.state.model,\n undefined,\n signal,\n this.agent.state.thinkingLevel,\n ),\n );\n if (signal.aborted) {\n await this.emit({ type: \"compaction_end\", reason, aborted: true });\n return false;\n }\n\n const entryId = this.sessionStore.appendCompaction(\n result.summary,\n result.firstKeptEntryId,\n result.tokensBefore,\n result.details,\n );\n const context = this.sessionStore.buildSessionContext();\n this.agent.state.messages = context.messages;\n\n if (this.extensions?.hasHandlers(\"session_compact\")) {\n const entry = this.sessionStore.getEntry(entryId);\n if (entry?.type === \"compaction\") {\n await this.extensions.emit(\"session_compact\", {\n entry: entry as CompactionEntry,\n reason,\n });\n }\n }\n\n await this.emit({\n type: \"compaction_end\",\n reason,\n result: {\n summary: result.summary,\n firstKeptEntryId: result.firstKeptEntryId,\n tokensBefore: result.tokensBefore,\n },\n aborted: false,\n });\n\n if (willRetry) {\n this.dropTrailingErrorMessage();\n return true;\n }\n return this.agent.hasQueuedMessages();\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : \"compaction failed\";\n if (started) {\n await this.emit({\n type: \"compaction_end\",\n reason,\n aborted: false,\n errorMessage:\n reason === \"overflow\"\n ? `Context overflow recovery failed: ${errorMessage}`\n : `Auto-compaction failed: ${errorMessage}`,\n });\n } else {\n log.logWarning(\"Compaction preparation failed\", errorMessage);\n }\n return false;\n } finally {\n this.compactionAbortController = undefined;\n }\n }\n\n private isRetryableError(message: AssistantMessage): boolean {\n if (message.stopReason !== \"error\" || !message.errorMessage) return false;\n return RETRYABLE_ERROR_PATTERN.test(message.errorMessage);\n }\n\n private async prepareRetry(message: AssistantMessage): Promise<boolean> {\n const settings = this.settings.retry;\n if (!settings.enabled) return false;\n\n this.retryAttempt++;\n if (this.retryAttempt > settings.maxRetries) {\n this.retryAttempt--;\n await this.emit({\n type: \"auto_retry_end\",\n success: false,\n attempt: this.retryAttempt,\n finalError: message.errorMessage,\n });\n this.retryAttempt = 0;\n return false;\n }\n\n const delayMs = settings.baseDelayMs * 2 ** (this.retryAttempt - 1);\n await this.emit({\n type: \"auto_retry_start\",\n attempt: this.retryAttempt,\n maxAttempts: settings.maxRetries,\n delayMs,\n errorMessage: message.errorMessage || \"Unknown error\",\n });\n\n this.dropTrailingErrorMessage();\n\n this.retryAbortController = new AbortController();\n try {\n await sleep(delayMs, this.retryAbortController.signal);\n } catch {\n const attempt = this.retryAttempt;\n this.retryAttempt = 0;\n await this.emit({\n type: \"auto_retry_end\",\n success: false,\n attempt,\n finalError: \"Retry cancelled\",\n });\n return false;\n } finally {\n this.retryAbortController = undefined;\n }\n return true;\n }\n\n private dropTrailingErrorMessage(): void {\n const messages = this.agent.state.messages;\n if (messages.length > 0 && messages[messages.length - 1].role === \"assistant\") {\n this.agent.state.messages = messages.slice(0, -1);\n }\n }\n}\n"]}
@@ -39,7 +39,10 @@ export declare class SessionStore {
39
39
  static create(path: string, cwd: string, options?: {
40
40
  id?: string;
41
41
  }): SessionStore;
42
- getSessionFile(): string;
42
+ /** Create an ephemeral session that never writes a session file. */
43
+ static inMemory(cwd?: string): SessionStore;
44
+ getSessionFile(): string | undefined;
45
+ isPersisted(): boolean;
43
46
  getCwd(): string;
44
47
  /** Session header as read from disk, or null when the file had none. */
45
48
  getHeader(): SessionHeader | null;
@@ -1 +1 @@
1
- {"version":3,"file":"session-store.d.ts","sourceRoot":"","sources":["../../src/harness/session-store.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEvE,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EACnB,MAAM,YAAY,CAAC;AAkBpB,mEAAmE;AACnE,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAmB3E;AAMD;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAM3E;AAQD;;;;;;GAMG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,YAAY,CAAU;IAC9B,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,IAAI,CAAmC;IAC/C,OAAO,CAAC,MAAM,CAAuB;IAErC,OAAO,eAiBN;IAED;;;;;;;OAOG;IACH,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,YAAY,CAW5D;IAED,kFAAkF;IAClF,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,YAAY,CAUhF;IAED,cAAc,IAAI,MAAM,CAEvB;IAED,MAAM,IAAI,MAAM,CAEf;IAED,wEAAwE;IACxE,SAAS,IAAI,aAAa,GAAG,IAAI,CAEhC;IAED,8EAA8E;IAC9E,YAAY,IAAI,MAAM,CAErB;IAED,SAAS,IAAI,MAAM,GAAG,IAAI,CAEzB;IAED,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAE7C;IAED,qEAAqE;IACrE,UAAU,IAAI,YAAY,EAAE,CAE3B;IAED,iDAAiD;IACjD,cAAc,IAAI,MAAM,GAAG,SAAS,CAMnC;IAED;;;OAGG;IACH,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,YAAY,EAAE,CAUzC;IAED;;;OAGG;IACH,mBAAmB,IAAI,cAAc,CAEpC;IAED,kFAAkF;IAClF,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAE3C;IAED,0EAA0E;IAC1E,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,CAE5D;IAED,sEAAsE;IACtE,wBAAwB,CACtB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GAAG,CAAC,WAAW,GAAG,YAAY,CAAC,EAAE,EAChD,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,OAAO,GAChB,MAAM,CAER;IAED,0CAA0C;IAC1C,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEtC;IAED,8DAA8D;IAC9D,gBAAgB,CACd,OAAO,EAAE,MAAM,EACf,gBAAgB,EAAE,MAAM,EACxB,YAAY,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,OAAO,EACjB,QAAQ,CAAC,EAAE,OAAO,GACjB,MAAM,CASR;IAED,OAAO,CAAC,WAAW;IAcnB,OAAO,CAAC,OAAO;CAiBhB"}
1
+ {"version":3,"file":"session-store.d.ts","sourceRoot":"","sources":["../../src/harness/session-store.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEvE,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EACnB,MAAM,YAAY,CAAC;AAkBpB,mEAAmE;AACnE,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAmB3E;AAMD;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAM3E;AAQD;;;;;;GAMG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgB;IAC5C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,YAAY,CAAU;IAC9B,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,IAAI,CAAmC;IAC/C,OAAO,CAAC,MAAM,CAAuB;IAErC,OAAO,eAiBN;IAED;;;;;;;OAOG;IACH,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,YAAY,CAW5D;IAED,kFAAkF;IAClF,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,YAAY,CAUhF;IAED,oEAAoE;IACpE,MAAM,CAAC,QAAQ,CAAC,GAAG,SAAgB,GAAG,YAAY,CAEjD;IAED,cAAc,IAAI,MAAM,GAAG,SAAS,CAEnC;IAED,WAAW,IAAI,OAAO,CAErB;IAED,MAAM,IAAI,MAAM,CAEf;IAED,wEAAwE;IACxE,SAAS,IAAI,aAAa,GAAG,IAAI,CAEhC;IAED,8EAA8E;IAC9E,YAAY,IAAI,MAAM,CAErB;IAED,SAAS,IAAI,MAAM,GAAG,IAAI,CAEzB;IAED,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAE7C;IAED,qEAAqE;IACrE,UAAU,IAAI,YAAY,EAAE,CAE3B;IAED,iDAAiD;IACjD,cAAc,IAAI,MAAM,GAAG,SAAS,CAMnC;IAED;;;OAGG;IACH,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,YAAY,EAAE,CAUzC;IAED;;;OAGG;IACH,mBAAmB,IAAI,cAAc,CAEpC;IAED,kFAAkF;IAClF,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAE3C;IAED,0EAA0E;IAC1E,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,CAE5D;IAED,sEAAsE;IACtE,wBAAwB,CACtB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GAAG,CAAC,WAAW,GAAG,YAAY,CAAC,EAAE,EAChD,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,OAAO,GAChB,MAAM,CAER;IAED,0CAA0C;IAC1C,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEtC;IAED,8DAA8D;IAC9D,gBAAgB,CACd,OAAO,EAAE,MAAM,EACf,gBAAgB,EAAE,MAAM,EACxB,YAAY,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,OAAO,EACjB,QAAQ,CAAC,EAAE,OAAO,GACjB,MAAM,CASR;IAED,OAAO,CAAC,WAAW;IAcnB,OAAO,CAAC,OAAO;CAkBhB"}
@@ -83,7 +83,7 @@ export class SessionStore {
83
83
  this.entries = [];
84
84
  this.byId = new Map();
85
85
  this.leafId = null;
86
- this.sessionFile = resolve(sessionFile);
86
+ this.sessionFile = sessionFile === null ? null : resolve(sessionFile);
87
87
  this.header = fileEntries.length > 0 && isSessionHeader(fileEntries[0]) ? fileEntries[0] : null;
88
88
  this.headerOnDisk = this.header !== null;
89
89
  this.sessionId = this.header?.id ?? randomUUID();
@@ -131,8 +131,15 @@ export class SessionStore {
131
131
  atomicWritePrivateFile(path, `${JSON.stringify(header)}\n`);
132
132
  return new SessionStore(path, cwd, [header]);
133
133
  }
134
+ /** Create an ephemeral session that never writes a session file. */
135
+ static inMemory(cwd = process.cwd()) {
136
+ return new SessionStore(null, cwd, []);
137
+ }
134
138
  getSessionFile() {
135
- return this.sessionFile;
139
+ return this.sessionFile ?? undefined;
140
+ }
141
+ isPersisted() {
142
+ return this.sessionFile !== null;
136
143
  }
137
144
  getCwd() {
138
145
  return this.cwd;
@@ -228,6 +235,8 @@ export class SessionStore {
228
235
  return entry.id;
229
236
  }
230
237
  persist(entry) {
238
+ if (this.sessionFile === null)
239
+ return;
231
240
  if (!this.headerOnDisk) {
232
241
  this.header ??= {
233
242
  type: "session",