@geminixiang/mikan 1.0.0-beta.8 → 1.0.0-beta.81

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 (907) hide show
  1. package/CHANGELOG.md +1168 -0
  2. package/README.md +98 -38
  3. package/dist/adapters/commands/admin.d.ts.map +1 -0
  4. package/dist/{commands → adapters/commands}/admin.js +12 -9
  5. package/dist/adapters/commands/admin.js.map +1 -0
  6. package/dist/{commands → adapters/commands}/auto-reply.d.ts +0 -3
  7. package/dist/adapters/commands/auto-reply.d.ts.map +1 -0
  8. package/dist/adapters/commands/auto-reply.js +47 -0
  9. package/dist/adapters/commands/auto-reply.js.map +1 -0
  10. package/dist/adapters/commands/login.d.ts +6 -0
  11. package/dist/adapters/commands/login.d.ts.map +1 -0
  12. package/dist/adapters/commands/login.js +158 -0
  13. package/dist/adapters/commands/login.js.map +1 -0
  14. package/dist/adapters/commands/manifest.d.ts +17 -0
  15. package/dist/adapters/commands/manifest.d.ts.map +1 -0
  16. package/dist/adapters/commands/manifest.js +121 -0
  17. package/dist/adapters/commands/manifest.js.map +1 -0
  18. package/dist/adapters/commands/model.d.ts +9 -0
  19. package/dist/adapters/commands/model.d.ts.map +1 -0
  20. package/dist/adapters/commands/model.js +136 -0
  21. package/dist/adapters/commands/model.js.map +1 -0
  22. package/dist/adapters/commands/new.d.ts.map +1 -0
  23. package/dist/adapters/commands/new.js +39 -0
  24. package/dist/adapters/commands/new.js.map +1 -0
  25. package/dist/adapters/commands/registry.d.ts +4 -0
  26. package/dist/adapters/commands/registry.d.ts.map +1 -0
  27. package/dist/adapters/commands/registry.js +35 -0
  28. package/dist/adapters/commands/registry.js.map +1 -0
  29. package/dist/{commands → adapters/commands}/sandbox.d.ts +0 -1
  30. package/dist/adapters/commands/sandbox.d.ts.map +1 -0
  31. package/dist/adapters/commands/sandbox.js +125 -0
  32. package/dist/adapters/commands/sandbox.js.map +1 -0
  33. package/dist/adapters/commands/session-view.d.ts.map +1 -0
  34. package/dist/{commands → adapters/commands}/session-view.js +21 -16
  35. package/dist/adapters/commands/session-view.js.map +1 -0
  36. package/dist/adapters/commands/types.d.ts +105 -0
  37. package/dist/adapters/commands/types.d.ts.map +1 -0
  38. package/dist/adapters/commands/types.js.map +1 -0
  39. package/dist/adapters/commands/utils.d.ts +11 -0
  40. package/dist/adapters/commands/utils.d.ts.map +1 -0
  41. package/dist/{commands → adapters/commands}/utils.js +15 -1
  42. package/dist/adapters/commands/utils.js.map +1 -0
  43. package/dist/adapters/discord/bot.d.ts +10 -17
  44. package/dist/adapters/discord/bot.d.ts.map +1 -1
  45. package/dist/adapters/discord/bot.js +232 -297
  46. package/dist/adapters/discord/bot.js.map +1 -1
  47. package/dist/adapters/discord/components.d.ts +4 -0
  48. package/dist/adapters/discord/components.d.ts.map +1 -0
  49. package/dist/adapters/discord/components.js +9 -0
  50. package/dist/adapters/discord/components.js.map +1 -0
  51. package/dist/adapters/discord/context.d.ts +3 -7
  52. package/dist/adapters/discord/context.d.ts.map +1 -1
  53. package/dist/adapters/discord/context.js +55 -219
  54. package/dist/adapters/discord/context.js.map +1 -1
  55. package/dist/adapters/discord/format.d.ts +2 -0
  56. package/dist/adapters/discord/format.d.ts.map +1 -0
  57. package/dist/adapters/discord/format.js +47 -0
  58. package/dist/adapters/discord/format.js.map +1 -0
  59. package/dist/adapters/discord/types.d.ts +90 -1
  60. package/dist/adapters/discord/types.d.ts.map +1 -1
  61. package/dist/adapters/discord/types.js.map +1 -1
  62. package/dist/adapters/github/bot.d.ts +25 -9
  63. package/dist/adapters/github/bot.d.ts.map +1 -1
  64. package/dist/adapters/github/bot.js +325 -154
  65. package/dist/adapters/github/bot.js.map +1 -1
  66. package/dist/adapters/github/client.d.ts +39 -23
  67. package/dist/adapters/github/client.d.ts.map +1 -1
  68. package/dist/adapters/github/client.js +146 -35
  69. package/dist/adapters/github/client.js.map +1 -1
  70. package/dist/adapters/github/context.d.ts +3 -8
  71. package/dist/adapters/github/context.d.ts.map +1 -1
  72. package/dist/adapters/github/context.js +64 -131
  73. package/dist/adapters/github/context.js.map +1 -1
  74. package/dist/adapters/github/github-ops.d.ts +22 -0
  75. package/dist/adapters/github/github-ops.d.ts.map +1 -0
  76. package/dist/adapters/github/github-ops.js +281 -0
  77. package/dist/adapters/github/github-ops.js.map +1 -0
  78. package/dist/adapters/github/ids.d.ts +2 -23
  79. package/dist/adapters/github/ids.d.ts.map +1 -1
  80. package/dist/adapters/github/ids.js +6 -36
  81. package/dist/adapters/github/ids.js.map +1 -1
  82. package/dist/adapters/github/repo.d.ts +8 -0
  83. package/dist/adapters/github/repo.d.ts.map +1 -0
  84. package/dist/adapters/github/repo.js +92 -0
  85. package/dist/adapters/github/repo.js.map +1 -0
  86. package/dist/adapters/github/tool-pack.d.ts +4 -0
  87. package/dist/adapters/github/tool-pack.d.ts.map +1 -0
  88. package/dist/adapters/github/tool-pack.js +45 -0
  89. package/dist/adapters/github/tool-pack.js.map +1 -0
  90. package/dist/adapters/github/tools/checks.d.ts +14 -0
  91. package/dist/adapters/github/tools/checks.d.ts.map +1 -0
  92. package/dist/adapters/github/tools/checks.js +80 -0
  93. package/dist/adapters/github/tools/checks.js.map +1 -0
  94. package/dist/adapters/github/tools/issue.d.ts +18 -0
  95. package/dist/adapters/github/tools/issue.d.ts.map +1 -0
  96. package/dist/adapters/github/tools/issue.js +44 -0
  97. package/dist/adapters/github/tools/issue.js.map +1 -0
  98. package/dist/adapters/github/tools/pr.d.ts +17 -0
  99. package/dist/adapters/github/tools/pr.d.ts.map +1 -0
  100. package/dist/adapters/github/tools/pr.js +42 -0
  101. package/dist/adapters/github/tools/pr.js.map +1 -0
  102. package/dist/adapters/github/tools/read.d.ts +17 -0
  103. package/dist/adapters/github/tools/read.d.ts.map +1 -0
  104. package/dist/adapters/github/tools/read.js +134 -0
  105. package/dist/adapters/github/tools/read.js.map +1 -0
  106. package/dist/adapters/github/tools/review-reply.d.ts +14 -0
  107. package/dist/adapters/github/tools/review-reply.d.ts.map +1 -0
  108. package/dist/adapters/github/tools/review-reply.js +34 -0
  109. package/dist/adapters/github/tools/review-reply.js.map +1 -0
  110. package/dist/adapters/github/tools/sync.d.ts +13 -0
  111. package/dist/adapters/github/tools/sync.d.ts.map +1 -0
  112. package/dist/adapters/github/tools/sync.js +29 -0
  113. package/dist/adapters/github/tools/sync.js.map +1 -0
  114. package/dist/adapters/github/types.d.ts +197 -18
  115. package/dist/adapters/github/types.d.ts.map +1 -1
  116. package/dist/adapters/github/types.js.map +1 -1
  117. package/dist/adapters/github/webhook.d.ts +6 -0
  118. package/dist/adapters/github/webhook.d.ts.map +1 -0
  119. package/dist/adapters/github/webhook.js +62 -0
  120. package/dist/adapters/github/webhook.js.map +1 -0
  121. package/dist/adapters/intake.d.ts +4 -10
  122. package/dist/adapters/intake.d.ts.map +1 -1
  123. package/dist/adapters/intake.js +74 -31
  124. package/dist/adapters/intake.js.map +1 -1
  125. package/dist/adapters/markdown-tables.d.ts +8 -0
  126. package/dist/adapters/markdown-tables.d.ts.map +1 -0
  127. package/dist/adapters/markdown-tables.js +111 -0
  128. package/dist/adapters/markdown-tables.js.map +1 -0
  129. package/dist/{platform-messages.d.ts → adapters/messages.d.ts} +3 -2
  130. package/dist/adapters/messages.d.ts.map +1 -0
  131. package/dist/{platform-messages.js → adapters/messages.js} +4 -1
  132. package/dist/adapters/messages.js.map +1 -0
  133. package/dist/adapters/progressive-renderer.d.ts +7 -0
  134. package/dist/adapters/progressive-renderer.d.ts.map +1 -0
  135. package/dist/adapters/progressive-renderer.js +423 -0
  136. package/dist/adapters/progressive-renderer.js.map +1 -0
  137. package/dist/adapters/shared.d.ts +24 -53
  138. package/dist/adapters/shared.d.ts.map +1 -1
  139. package/dist/adapters/shared.js +140 -91
  140. package/dist/adapters/shared.js.map +1 -1
  141. package/dist/adapters/slack/assistant.d.ts +23 -0
  142. package/dist/adapters/slack/assistant.d.ts.map +1 -0
  143. package/dist/adapters/slack/assistant.js +109 -0
  144. package/dist/adapters/slack/assistant.js.map +1 -0
  145. package/dist/adapters/slack/auto-reply-context.d.ts +14 -0
  146. package/dist/adapters/slack/auto-reply-context.d.ts.map +1 -0
  147. package/dist/adapters/slack/auto-reply-context.js +21 -0
  148. package/dist/adapters/slack/auto-reply-context.js.map +1 -0
  149. package/dist/adapters/slack/blocks.d.ts +5 -0
  150. package/dist/adapters/slack/blocks.d.ts.map +1 -1
  151. package/dist/adapters/slack/blocks.js +84 -148
  152. package/dist/adapters/slack/blocks.js.map +1 -1
  153. package/dist/adapters/slack/bot.d.ts +51 -39
  154. package/dist/adapters/slack/bot.d.ts.map +1 -1
  155. package/dist/adapters/slack/bot.js +897 -569
  156. package/dist/adapters/slack/bot.js.map +1 -1
  157. package/dist/adapters/slack/context.d.ts +3 -9
  158. package/dist/adapters/slack/context.d.ts.map +1 -1
  159. package/dist/adapters/slack/context.js +8 -17
  160. package/dist/adapters/slack/context.js.map +1 -1
  161. package/dist/adapters/slack/jev-context.d.ts +17 -0
  162. package/dist/adapters/slack/jev-context.d.ts.map +1 -0
  163. package/dist/adapters/slack/jev-context.js +57 -0
  164. package/dist/adapters/slack/jev-context.js.map +1 -0
  165. package/dist/adapters/slack/markdown.d.ts +2 -0
  166. package/dist/adapters/slack/markdown.d.ts.map +1 -0
  167. package/dist/adapters/slack/markdown.js +43 -0
  168. package/dist/adapters/slack/markdown.js.map +1 -0
  169. package/dist/adapters/slack/persona.d.ts +6 -0
  170. package/dist/adapters/slack/persona.d.ts.map +1 -0
  171. package/dist/adapters/slack/persona.js +13 -0
  172. package/dist/adapters/slack/persona.js.map +1 -0
  173. package/dist/adapters/slack/response-lifecycle.d.ts +3 -4
  174. package/dist/adapters/slack/response-lifecycle.d.ts.map +1 -1
  175. package/dist/adapters/slack/response-lifecycle.js +221 -347
  176. package/dist/adapters/slack/response-lifecycle.js.map +1 -1
  177. package/dist/adapters/slack/session.d.ts +3 -2
  178. package/dist/adapters/slack/session.d.ts.map +1 -1
  179. package/dist/adapters/slack/session.js +9 -13
  180. package/dist/adapters/slack/session.js.map +1 -1
  181. package/dist/adapters/slack/stream-limits.d.ts +10 -0
  182. package/dist/adapters/slack/stream-limits.d.ts.map +1 -0
  183. package/dist/adapters/slack/stream-limits.js +22 -0
  184. package/dist/adapters/slack/stream-limits.js.map +1 -0
  185. package/dist/adapters/slack/task-intent.d.ts +19 -0
  186. package/dist/adapters/slack/task-intent.d.ts.map +1 -0
  187. package/dist/adapters/slack/task-intent.js +65 -0
  188. package/dist/adapters/slack/task-intent.js.map +1 -0
  189. package/dist/adapters/slack/task-status.d.ts +6 -0
  190. package/dist/adapters/slack/task-status.d.ts.map +1 -0
  191. package/dist/adapters/slack/task-status.js +100 -0
  192. package/dist/adapters/slack/task-status.js.map +1 -0
  193. package/dist/adapters/slack/tool-pack.d.ts +4 -0
  194. package/dist/adapters/slack/tool-pack.d.ts.map +1 -0
  195. package/dist/adapters/slack/tool-pack.js +40 -0
  196. package/dist/adapters/slack/tool-pack.js.map +1 -0
  197. package/dist/adapters/slack/tools/blockkit.d.ts +17 -0
  198. package/dist/adapters/slack/tools/blockkit.d.ts.map +1 -0
  199. package/dist/adapters/slack/tools/blockkit.js +98 -0
  200. package/dist/adapters/slack/tools/blockkit.js.map +1 -0
  201. package/dist/adapters/slack/types.d.ts +91 -5
  202. package/dist/adapters/slack/types.d.ts.map +1 -1
  203. package/dist/adapters/slack/types.js.map +1 -1
  204. package/dist/adapters/slack/update-diagnostics.d.ts +13 -0
  205. package/dist/adapters/slack/update-diagnostics.d.ts.map +1 -0
  206. package/dist/adapters/slack/update-diagnostics.js +128 -0
  207. package/dist/adapters/slack/update-diagnostics.js.map +1 -0
  208. package/dist/adapters/telegram/bot.d.ts +8 -18
  209. package/dist/adapters/telegram/bot.d.ts.map +1 -1
  210. package/dist/adapters/telegram/bot.js +114 -232
  211. package/dist/adapters/telegram/bot.js.map +1 -1
  212. package/dist/adapters/telegram/context.d.ts +3 -7
  213. package/dist/adapters/telegram/context.d.ts.map +1 -1
  214. package/dist/adapters/telegram/context.js +47 -191
  215. package/dist/adapters/telegram/context.js.map +1 -1
  216. package/dist/adapters/telegram/types.d.ts +24 -1
  217. package/dist/adapters/telegram/types.d.ts.map +1 -1
  218. package/dist/adapters/telegram/types.js.map +1 -1
  219. package/dist/adapters/types.d.ts +89 -16
  220. package/dist/adapters/types.d.ts.map +1 -1
  221. package/dist/adapters/types.js.map +1 -1
  222. package/dist/adapters/web/admin/client-assets.d.ts +4 -0
  223. package/dist/adapters/web/admin/client-assets.d.ts.map +1 -0
  224. package/dist/adapters/web/admin/client-assets.js +1766 -0
  225. package/dist/adapters/web/admin/client-assets.js.map +1 -0
  226. package/dist/adapters/web/admin/portal.d.ts +27 -0
  227. package/dist/adapters/web/admin/portal.d.ts.map +1 -0
  228. package/dist/adapters/web/admin/portal.js +1506 -0
  229. package/dist/adapters/web/admin/portal.js.map +1 -0
  230. package/dist/{web → adapters/web}/admin/provider-models.d.ts +1 -1
  231. package/dist/adapters/web/admin/provider-models.d.ts.map +1 -0
  232. package/dist/{web → adapters/web}/admin/provider-models.js +1 -1
  233. package/dist/adapters/web/admin/provider-models.js.map +1 -0
  234. package/dist/adapters/web/admin/types.d.ts +56 -0
  235. package/dist/adapters/web/admin/types.d.ts.map +1 -0
  236. package/dist/adapters/web/admin/types.js.map +1 -0
  237. package/dist/adapters/web/login/oauth.d.ts +4 -0
  238. package/dist/adapters/web/login/oauth.d.ts.map +1 -0
  239. package/dist/{web → adapters/web}/login/oauth.js +61 -100
  240. package/dist/adapters/web/login/oauth.js.map +1 -0
  241. package/dist/adapters/web/login/portal.d.ts +10 -0
  242. package/dist/adapters/web/login/portal.d.ts.map +1 -0
  243. package/dist/{web → adapters/web}/login/portal.js +169 -159
  244. package/dist/adapters/web/login/portal.js.map +1 -0
  245. package/dist/{web → adapters/web}/login/types.d.ts +1 -17
  246. package/dist/adapters/web/login/types.d.ts.map +1 -0
  247. package/dist/adapters/web/login/types.js.map +1 -0
  248. package/dist/adapters/web/portal-shell.d.ts +9 -0
  249. package/dist/adapters/web/portal-shell.d.ts.map +1 -0
  250. package/dist/{portal-shell.js → adapters/web/portal-shell.js} +73 -11
  251. package/dist/adapters/web/portal-shell.js.map +1 -0
  252. package/dist/adapters/web/server.d.ts +35 -0
  253. package/dist/adapters/web/server.d.ts.map +1 -0
  254. package/dist/{web → adapters/web}/server.js +26 -13
  255. package/dist/adapters/web/server.js.map +1 -0
  256. package/dist/adapters/web/session-view/portal.d.ts +19 -0
  257. package/dist/adapters/web/session-view/portal.d.ts.map +1 -0
  258. package/dist/{web → adapters/web}/session-view/portal.js +711 -230
  259. package/dist/adapters/web/session-view/portal.js.map +1 -0
  260. package/dist/{web → adapters/web}/session-view/types.d.ts +3 -6
  261. package/dist/{web → adapters/web}/session-view/types.d.ts.map +1 -1
  262. package/dist/adapters/web/session-view/types.js.map +1 -0
  263. package/dist/{web → adapters/web}/token-store.d.ts +0 -3
  264. package/dist/adapters/web/token-store.d.ts.map +1 -0
  265. package/dist/{web → adapters/web}/token-store.js +1 -3
  266. package/dist/adapters/web/token-store.js.map +1 -0
  267. package/dist/adapters/web/types.d.ts.map +1 -0
  268. package/dist/adapters/web/types.js.map +1 -0
  269. package/dist/cli/arg-grammar.d.ts +8 -0
  270. package/dist/cli/arg-grammar.d.ts.map +1 -0
  271. package/dist/cli/arg-grammar.js +47 -0
  272. package/dist/cli/arg-grammar.js.map +1 -0
  273. package/dist/cli/boot.d.ts +4 -0
  274. package/dist/cli/boot.d.ts.map +1 -0
  275. package/dist/cli/boot.js +81 -0
  276. package/dist/cli/boot.js.map +1 -0
  277. package/dist/cli/download.d.ts.map +1 -0
  278. package/dist/cli/download.js +84 -0
  279. package/dist/cli/download.js.map +1 -0
  280. package/dist/cli/office.d.ts +2 -0
  281. package/dist/cli/office.d.ts.map +1 -0
  282. package/dist/cli/office.js +151 -0
  283. package/dist/cli/office.js.map +1 -0
  284. package/dist/cli/onboard.d.ts +8 -0
  285. package/dist/cli/onboard.d.ts.map +1 -0
  286. package/dist/cli/onboard.js +195 -0
  287. package/dist/cli/onboard.js.map +1 -0
  288. package/dist/cli/process-lifecycle.d.ts +14 -0
  289. package/dist/cli/process-lifecycle.d.ts.map +1 -0
  290. package/dist/cli/process-lifecycle.js +61 -0
  291. package/dist/cli/process-lifecycle.js.map +1 -0
  292. package/dist/cli/sandbox.d.ts +3 -0
  293. package/dist/cli/sandbox.d.ts.map +1 -0
  294. package/dist/cli/sandbox.js +80 -0
  295. package/dist/cli/sandbox.js.map +1 -0
  296. package/dist/cli/sessions.d.ts +2 -0
  297. package/dist/cli/sessions.d.ts.map +1 -0
  298. package/dist/cli/sessions.js +78 -0
  299. package/dist/cli/sessions.js.map +1 -0
  300. package/dist/cli/types.d.ts +21 -0
  301. package/dist/cli/types.d.ts.map +1 -0
  302. package/dist/cli/types.js.map +1 -0
  303. package/dist/env-manifest.d.ts +18 -0
  304. package/dist/env-manifest.d.ts.map +1 -0
  305. package/dist/env-manifest.js +256 -0
  306. package/dist/env-manifest.js.map +1 -0
  307. package/dist/events/index.d.ts +122 -0
  308. package/dist/events/index.d.ts.map +1 -0
  309. package/dist/events/index.js +299 -0
  310. package/dist/events/index.js.map +1 -0
  311. package/dist/events/scheduler.d.ts +25 -0
  312. package/dist/events/scheduler.d.ts.map +1 -0
  313. package/dist/events/scheduler.js +223 -0
  314. package/dist/events/scheduler.js.map +1 -0
  315. package/dist/file-guards.d.ts +13 -0
  316. package/dist/file-guards.d.ts.map +1 -0
  317. package/dist/file-guards.js +104 -0
  318. package/dist/file-guards.js.map +1 -0
  319. package/dist/harness/execution-env.d.ts +4 -0
  320. package/dist/harness/execution-env.d.ts.map +1 -0
  321. package/dist/harness/execution-env.js +245 -0
  322. package/dist/harness/execution-env.js.map +1 -0
  323. package/dist/harness/execution-resolver.d.ts +23 -0
  324. package/dist/harness/execution-resolver.d.ts.map +1 -0
  325. package/dist/harness/execution-resolver.js +156 -0
  326. package/dist/harness/execution-resolver.js.map +1 -0
  327. package/dist/harness/http.d.ts +0 -12
  328. package/dist/harness/http.d.ts.map +1 -1
  329. package/dist/harness/http.js +0 -34
  330. package/dist/harness/http.js.map +1 -1
  331. package/dist/harness/index.d.ts +19 -17
  332. package/dist/harness/index.d.ts.map +1 -1
  333. package/dist/harness/index.js +12 -15
  334. package/dist/harness/index.js.map +1 -1
  335. package/dist/harness/jev.d.ts +67 -0
  336. package/dist/harness/jev.d.ts.map +1 -0
  337. package/dist/harness/jev.js +135 -0
  338. package/dist/harness/jev.js.map +1 -0
  339. package/dist/harness/loop-guard.d.ts +10 -0
  340. package/dist/harness/loop-guard.d.ts.map +1 -0
  341. package/dist/harness/loop-guard.js +111 -0
  342. package/dist/harness/loop-guard.js.map +1 -0
  343. package/dist/harness/mcp-result.d.ts +20 -0
  344. package/dist/harness/mcp-result.d.ts.map +1 -0
  345. package/dist/harness/mcp-result.js +179 -0
  346. package/dist/harness/mcp-result.js.map +1 -0
  347. package/dist/harness/mcp.d.ts +17 -0
  348. package/dist/harness/mcp.d.ts.map +1 -0
  349. package/dist/harness/mcp.js +243 -0
  350. package/dist/harness/mcp.js.map +1 -0
  351. package/dist/harness/models.d.ts +2 -19
  352. package/dist/harness/models.d.ts.map +1 -1
  353. package/dist/harness/models.js +42 -94
  354. package/dist/harness/models.js.map +1 -1
  355. package/dist/harness/open-connector.d.ts +12 -0
  356. package/dist/harness/open-connector.d.ts.map +1 -0
  357. package/dist/harness/open-connector.js +160 -0
  358. package/dist/harness/open-connector.js.map +1 -0
  359. package/dist/harness/presenter.d.ts +11 -0
  360. package/dist/harness/presenter.d.ts.map +1 -0
  361. package/dist/harness/presenter.js +826 -0
  362. package/dist/harness/presenter.js.map +1 -0
  363. package/dist/harness/prompt.d.ts +18 -0
  364. package/dist/harness/prompt.d.ts.map +1 -0
  365. package/dist/harness/prompt.js +403 -0
  366. package/dist/harness/prompt.js.map +1 -0
  367. package/dist/harness/run-events.d.ts +10 -0
  368. package/dist/harness/run-events.d.ts.map +1 -0
  369. package/dist/harness/run-events.js +129 -0
  370. package/dist/harness/run-events.js.map +1 -0
  371. package/dist/harness/runner.d.ts +2 -123
  372. package/dist/harness/runner.d.ts.map +1 -1
  373. package/dist/harness/runner.js +575 -413
  374. package/dist/harness/runner.js.map +1 -1
  375. package/dist/harness/session.d.ts +103 -0
  376. package/dist/harness/session.d.ts.map +1 -0
  377. package/dist/harness/session.js +715 -0
  378. package/dist/harness/session.js.map +1 -0
  379. package/dist/harness/skills.d.ts +7 -41
  380. package/dist/harness/skills.d.ts.map +1 -1
  381. package/dist/harness/skills.js +101 -55
  382. package/dist/harness/skills.js.map +1 -1
  383. package/dist/harness/subagent-profiles.d.ts +3 -0
  384. package/dist/harness/subagent-profiles.d.ts.map +1 -0
  385. package/dist/harness/subagent-profiles.js +260 -0
  386. package/dist/harness/subagent-profiles.js.map +1 -0
  387. package/dist/harness/subagent.d.ts +39 -0
  388. package/dist/harness/subagent.d.ts.map +1 -0
  389. package/dist/harness/subagent.js +618 -0
  390. package/dist/harness/subagent.js.map +1 -0
  391. package/dist/harness/tool-args.d.ts +2 -0
  392. package/dist/harness/tool-args.d.ts.map +1 -0
  393. package/dist/harness/tool-args.js +20 -0
  394. package/dist/harness/tool-args.js.map +1 -0
  395. package/dist/harness/tools/attach.d.ts +13 -0
  396. package/dist/harness/tools/attach.d.ts.map +1 -0
  397. package/dist/{adapters/slack → harness}/tools/attach.js +2 -2
  398. package/dist/harness/tools/attach.js.map +1 -0
  399. package/dist/harness/tools/event.d.ts +28 -0
  400. package/dist/harness/tools/event.d.ts.map +1 -0
  401. package/dist/harness/tools/event.js +166 -0
  402. package/dist/harness/tools/event.js.map +1 -0
  403. package/dist/harness/tools/generate-image.d.ts +20 -0
  404. package/dist/harness/tools/generate-image.d.ts.map +1 -0
  405. package/dist/harness/tools/generate-image.js +68 -0
  406. package/dist/harness/tools/generate-image.js.map +1 -0
  407. package/dist/harness/tools/host-fn-tool.d.ts +14 -0
  408. package/dist/harness/tools/host-fn-tool.d.ts.map +1 -0
  409. package/dist/harness/tools/host-fn-tool.js +39 -0
  410. package/dist/harness/tools/host-fn-tool.js.map +1 -0
  411. package/dist/harness/tools/index.d.ts +34 -0
  412. package/dist/harness/tools/index.d.ts.map +1 -0
  413. package/dist/harness/tools/index.js +49 -0
  414. package/dist/harness/tools/index.js.map +1 -0
  415. package/dist/harness/tools/jev-browser.d.ts +42 -0
  416. package/dist/harness/tools/jev-browser.d.ts.map +1 -0
  417. package/dist/harness/tools/jev-browser.js +547 -0
  418. package/dist/harness/tools/jev-browser.js.map +1 -0
  419. package/dist/harness/tools/jev.d.ts +15 -0
  420. package/dist/harness/tools/jev.d.ts.map +1 -0
  421. package/dist/harness/tools/jev.js +98 -0
  422. package/dist/harness/tools/jev.js.map +1 -0
  423. package/dist/harness/tools/pi-tools.d.ts +8 -0
  424. package/dist/harness/tools/pi-tools.d.ts.map +1 -0
  425. package/dist/harness/tools/pi-tools.js +55 -0
  426. package/dist/harness/tools/pi-tools.js.map +1 -0
  427. package/dist/harness/tools/react.d.ts +11 -0
  428. package/dist/harness/tools/react.d.ts.map +1 -0
  429. package/dist/harness/tools/react.js +24 -0
  430. package/dist/harness/tools/react.js.map +1 -0
  431. package/dist/harness/tools/sandbox.d.ts +24 -0
  432. package/dist/harness/tools/sandbox.d.ts.map +1 -0
  433. package/dist/{tools → harness/tools}/sandbox.js +15 -9
  434. package/dist/harness/tools/sandbox.js.map +1 -0
  435. package/dist/harness/tools/secret-redaction.d.ts +9 -0
  436. package/dist/harness/tools/secret-redaction.d.ts.map +1 -0
  437. package/dist/harness/tools/secret-redaction.js +44 -0
  438. package/dist/harness/tools/secret-redaction.js.map +1 -0
  439. package/dist/harness/tools/subagent.d.ts +51 -0
  440. package/dist/harness/tools/subagent.d.ts.map +1 -0
  441. package/dist/harness/tools/subagent.js +581 -0
  442. package/dist/harness/tools/subagent.js.map +1 -0
  443. package/dist/harness/tools/task.d.ts +22 -0
  444. package/dist/harness/tools/task.d.ts.map +1 -0
  445. package/dist/harness/tools/task.js +80 -0
  446. package/dist/harness/tools/task.js.map +1 -0
  447. package/dist/harness/tools/types.d.ts +14 -0
  448. package/dist/harness/tools/types.d.ts.map +1 -0
  449. package/dist/harness/tools/types.js.map +1 -0
  450. package/dist/harness/types.d.ts +405 -29
  451. package/dist/harness/types.d.ts.map +1 -1
  452. package/dist/harness/types.js +1 -1
  453. package/dist/harness/types.js.map +1 -1
  454. package/dist/index.d.ts +36 -9
  455. package/dist/index.d.ts.map +1 -1
  456. package/dist/index.js +19 -7
  457. package/dist/index.js.map +1 -1
  458. package/dist/log.d.ts +0 -1
  459. package/dist/log.d.ts.map +1 -1
  460. package/dist/log.js +3 -13
  461. package/dist/log.js.map +1 -1
  462. package/dist/main.js +305 -219
  463. package/dist/main.js.map +1 -1
  464. package/dist/memory-capture/index.d.ts +15 -0
  465. package/dist/memory-capture/index.d.ts.map +1 -0
  466. package/dist/memory-capture/index.js +199 -0
  467. package/dist/memory-capture/index.js.map +1 -0
  468. package/dist/memory-capture/types.d.ts +27 -0
  469. package/dist/memory-capture/types.d.ts.map +1 -0
  470. package/dist/memory-capture/types.js +2 -0
  471. package/dist/memory-capture/types.js.map +1 -0
  472. package/dist/observability/index.d.ts +30 -0
  473. package/dist/observability/index.d.ts.map +1 -0
  474. package/dist/observability/index.js +273 -0
  475. package/dist/observability/index.js.map +1 -0
  476. package/dist/observability/instrument.js +9 -6
  477. package/dist/observability/instrument.js.map +1 -1
  478. package/dist/observability/otel.d.ts +10 -0
  479. package/dist/observability/otel.d.ts.map +1 -0
  480. package/dist/observability/otel.js +182 -0
  481. package/dist/observability/otel.js.map +1 -0
  482. package/dist/observability/sentry.d.ts +32 -13
  483. package/dist/observability/sentry.d.ts.map +1 -1
  484. package/dist/observability/sentry.js +85 -58
  485. package/dist/observability/sentry.js.map +1 -1
  486. package/dist/observability/types.d.ts +30 -3
  487. package/dist/observability/types.d.ts.map +1 -1
  488. package/dist/observability/types.js.map +1 -1
  489. package/dist/office/index.d.ts +74 -0
  490. package/dist/office/index.d.ts.map +1 -0
  491. package/dist/office/index.js +971 -0
  492. package/dist/office/index.js.map +1 -0
  493. package/dist/office/projection.d.ts +11 -0
  494. package/dist/office/projection.d.ts.map +1 -0
  495. package/dist/office/projection.js +146 -0
  496. package/dist/office/projection.js.map +1 -0
  497. package/dist/office/types.d.ts +55 -0
  498. package/dist/office/types.d.ts.map +1 -0
  499. package/dist/office/types.js +2 -0
  500. package/dist/office/types.js.map +1 -0
  501. package/dist/runtime/conversation-runtime.d.ts +0 -1
  502. package/dist/runtime/conversation-runtime.d.ts.map +1 -1
  503. package/dist/runtime/conversation-runtime.js +376 -152
  504. package/dist/runtime/conversation-runtime.js.map +1 -1
  505. package/dist/runtime/session-lifecycle.d.ts +66 -0
  506. package/dist/runtime/session-lifecycle.d.ts.map +1 -0
  507. package/dist/runtime/session-lifecycle.js +393 -0
  508. package/dist/runtime/session-lifecycle.js.map +1 -0
  509. package/dist/runtime/types.d.ts +42 -17
  510. package/dist/runtime/types.d.ts.map +1 -1
  511. package/dist/runtime/types.js.map +1 -1
  512. package/dist/sandbox/cloudflare.d.ts +4 -0
  513. package/dist/sandbox/cloudflare.d.ts.map +1 -1
  514. package/dist/sandbox/cloudflare.js +59 -55
  515. package/dist/sandbox/cloudflare.js.map +1 -1
  516. package/dist/sandbox/container.d.ts +3 -0
  517. package/dist/sandbox/container.d.ts.map +1 -1
  518. package/dist/sandbox/container.js +39 -20
  519. package/dist/sandbox/container.js.map +1 -1
  520. package/dist/sandbox/host.d.ts +3 -0
  521. package/dist/sandbox/host.d.ts.map +1 -1
  522. package/dist/sandbox/host.js +42 -35
  523. package/dist/sandbox/host.js.map +1 -1
  524. package/dist/sandbox/identity.d.ts +13 -0
  525. package/dist/sandbox/identity.d.ts.map +1 -0
  526. package/dist/sandbox/identity.js +49 -0
  527. package/dist/sandbox/identity.js.map +1 -0
  528. package/dist/sandbox/index.d.ts +5 -15
  529. package/dist/sandbox/index.d.ts.map +1 -1
  530. package/dist/sandbox/index.js +5 -51
  531. package/dist/sandbox/index.js.map +1 -1
  532. package/dist/sandbox/layout.d.ts +7 -0
  533. package/dist/sandbox/layout.d.ts.map +1 -0
  534. package/dist/sandbox/layout.js +13 -0
  535. package/dist/sandbox/layout.js.map +1 -0
  536. package/dist/{provisioner.d.ts → sandbox/provisioner.d.ts} +41 -4
  537. package/dist/sandbox/provisioner.d.ts.map +1 -0
  538. package/dist/sandbox/provisioner.js +971 -0
  539. package/dist/sandbox/provisioner.js.map +1 -0
  540. package/dist/sandbox/registry.d.ts +12 -0
  541. package/dist/sandbox/registry.d.ts.map +1 -0
  542. package/dist/sandbox/registry.js +93 -0
  543. package/dist/sandbox/registry.js.map +1 -0
  544. package/dist/sandbox/types.d.ts +23 -25
  545. package/dist/sandbox/types.d.ts.map +1 -1
  546. package/dist/sandbox/types.js.map +1 -1
  547. package/dist/sandbox/utils.d.ts +21 -0
  548. package/dist/sandbox/utils.d.ts.map +1 -1
  549. package/dist/sandbox/utils.js +100 -8
  550. package/dist/sandbox/utils.js.map +1 -1
  551. package/dist/sessions/chat-history-sync.d.ts +17 -0
  552. package/dist/sessions/chat-history-sync.d.ts.map +1 -0
  553. package/dist/sessions/{agent-memory-file-manager.js → chat-history-sync.js} +224 -183
  554. package/dist/sessions/chat-history-sync.js.map +1 -0
  555. package/dist/sessions/history-line.d.ts +9 -0
  556. package/dist/sessions/history-line.d.ts.map +1 -0
  557. package/dist/sessions/history-line.js +25 -0
  558. package/dist/sessions/history-line.js.map +1 -0
  559. package/dist/sessions/migrate-common.d.ts +28 -0
  560. package/dist/sessions/migrate-common.d.ts.map +1 -0
  561. package/dist/sessions/migrate-common.js +80 -0
  562. package/dist/sessions/migrate-common.js.map +1 -0
  563. package/dist/sessions/migrate-pi-084.d.ts +7 -0
  564. package/dist/sessions/migrate-pi-084.d.ts.map +1 -0
  565. package/dist/sessions/migrate-pi-084.js +293 -0
  566. package/dist/sessions/migrate-pi-084.js.map +1 -0
  567. package/dist/sessions/migrate-v3.d.ts +7 -0
  568. package/dist/sessions/migrate-v3.d.ts.map +1 -0
  569. package/dist/sessions/migrate-v3.js +351 -0
  570. package/dist/sessions/migrate-v3.js.map +1 -0
  571. package/dist/sessions/session-key.d.ts +18 -0
  572. package/dist/sessions/session-key.d.ts.map +1 -0
  573. package/dist/sessions/session-key.js +88 -0
  574. package/dist/sessions/session-key.js.map +1 -0
  575. package/dist/sessions/session-store.d.ts +55 -0
  576. package/dist/sessions/session-store.d.ts.map +1 -0
  577. package/dist/sessions/session-store.js +635 -0
  578. package/dist/sessions/session-store.js.map +1 -0
  579. package/dist/sessions/store.d.ts +7 -61
  580. package/dist/sessions/store.d.ts.map +1 -1
  581. package/dist/sessions/store.js +126 -102
  582. package/dist/sessions/store.js.map +1 -1
  583. package/dist/sessions/types.d.ts +59 -8
  584. package/dist/sessions/types.d.ts.map +1 -1
  585. package/dist/sessions/types.js +2 -1
  586. package/dist/sessions/types.js.map +1 -1
  587. package/dist/settings/apply.d.ts +9 -0
  588. package/dist/settings/apply.d.ts.map +1 -0
  589. package/dist/settings/apply.js +31 -0
  590. package/dist/settings/apply.js.map +1 -0
  591. package/dist/settings/index.d.ts +76 -0
  592. package/dist/settings/index.d.ts.map +1 -0
  593. package/dist/settings/index.js +351 -0
  594. package/dist/settings/index.js.map +1 -0
  595. package/dist/settings/migrate.d.ts +16 -0
  596. package/dist/settings/migrate.d.ts.map +1 -0
  597. package/dist/settings/migrate.js +70 -0
  598. package/dist/settings/migrate.js.map +1 -0
  599. package/dist/types.d.ts +232 -173
  600. package/dist/types.d.ts.map +1 -1
  601. package/dist/types.js +1 -3
  602. package/dist/types.js.map +1 -1
  603. package/dist/unknown-values.d.ts +3 -0
  604. package/dist/unknown-values.d.ts.map +1 -0
  605. package/dist/unknown-values.js +7 -0
  606. package/dist/unknown-values.js.map +1 -0
  607. package/dist/vault/index.d.ts +35 -11
  608. package/dist/vault/index.d.ts.map +1 -1
  609. package/dist/vault/index.js +326 -115
  610. package/dist/vault/index.js.map +1 -1
  611. package/dist/vault/types.d.ts +5 -16
  612. package/dist/vault/types.d.ts.map +1 -1
  613. package/dist/vault/types.js.map +1 -1
  614. package/package.json +82 -41
  615. package/dist/adapter.d.ts +0 -2
  616. package/dist/adapter.d.ts.map +0 -1
  617. package/dist/adapter.js +0 -2
  618. package/dist/adapter.js.map +0 -1
  619. package/dist/adapters/slack/tools/attach.d.ts +0 -12
  620. package/dist/adapters/slack/tools/attach.d.ts.map +0 -1
  621. package/dist/adapters/slack/tools/attach.js.map +0 -1
  622. package/dist/adapters/streaming.d.ts +0 -18
  623. package/dist/adapters/streaming.d.ts.map +0 -1
  624. package/dist/adapters/streaming.js +0 -44
  625. package/dist/adapters/streaming.js.map +0 -1
  626. package/dist/adapters/telegram/html.d.ts +0 -3
  627. package/dist/adapters/telegram/html.d.ts.map +0 -1
  628. package/dist/adapters/telegram/html.js +0 -98
  629. package/dist/adapters/telegram/html.js.map +0 -1
  630. package/dist/agent-events.d.ts +0 -5
  631. package/dist/agent-events.d.ts.map +0 -1
  632. package/dist/agent-events.js +0 -26
  633. package/dist/agent-events.js.map +0 -1
  634. package/dist/agent.d.ts +0 -39
  635. package/dist/agent.d.ts.map +0 -1
  636. package/dist/agent.js +0 -1291
  637. package/dist/agent.js.map +0 -1
  638. package/dist/cli/ext-git.d.ts +0 -22
  639. package/dist/cli/ext-git.d.ts.map +0 -1
  640. package/dist/cli/ext-git.js +0 -76
  641. package/dist/cli/ext-git.js.map +0 -1
  642. package/dist/cli/ext.d.ts +0 -2
  643. package/dist/cli/ext.d.ts.map +0 -1
  644. package/dist/cli/ext.js +0 -217
  645. package/dist/cli/ext.js.map +0 -1
  646. package/dist/commands/admin.d.ts.map +0 -1
  647. package/dist/commands/admin.js.map +0 -1
  648. package/dist/commands/auto-reply.d.ts.map +0 -1
  649. package/dist/commands/auto-reply.js +0 -76
  650. package/dist/commands/auto-reply.js.map +0 -1
  651. package/dist/commands/extensions.d.ts +0 -14
  652. package/dist/commands/extensions.d.ts.map +0 -1
  653. package/dist/commands/extensions.js +0 -55
  654. package/dist/commands/extensions.js.map +0 -1
  655. package/dist/commands/login.d.ts +0 -5
  656. package/dist/commands/login.d.ts.map +0 -1
  657. package/dist/commands/login.js +0 -115
  658. package/dist/commands/login.js.map +0 -1
  659. package/dist/commands/model.d.ts +0 -10
  660. package/dist/commands/model.d.ts.map +0 -1
  661. package/dist/commands/model.js +0 -102
  662. package/dist/commands/model.js.map +0 -1
  663. package/dist/commands/new.d.ts.map +0 -1
  664. package/dist/commands/new.js +0 -25
  665. package/dist/commands/new.js.map +0 -1
  666. package/dist/commands/parse.d.ts +0 -7
  667. package/dist/commands/parse.d.ts.map +0 -1
  668. package/dist/commands/parse.js +0 -14
  669. package/dist/commands/parse.js.map +0 -1
  670. package/dist/commands/registry.d.ts +0 -5
  671. package/dist/commands/registry.d.ts.map +0 -1
  672. package/dist/commands/registry.js +0 -31
  673. package/dist/commands/registry.js.map +0 -1
  674. package/dist/commands/sandbox.d.ts.map +0 -1
  675. package/dist/commands/sandbox.js +0 -78
  676. package/dist/commands/sandbox.js.map +0 -1
  677. package/dist/commands/session-view.d.ts.map +0 -1
  678. package/dist/commands/session-view.js.map +0 -1
  679. package/dist/commands/types.d.ts +0 -66
  680. package/dist/commands/types.d.ts.map +0 -1
  681. package/dist/commands/types.js.map +0 -1
  682. package/dist/commands/utils.d.ts +0 -11
  683. package/dist/commands/utils.d.ts.map +0 -1
  684. package/dist/commands/utils.js.map +0 -1
  685. package/dist/config.d.ts +0 -78
  686. package/dist/config.d.ts.map +0 -1
  687. package/dist/config.js +0 -450
  688. package/dist/config.js.map +0 -1
  689. package/dist/download.d.ts.map +0 -1
  690. package/dist/download.js +0 -89
  691. package/dist/download.js.map +0 -1
  692. package/dist/events.d.ts +0 -43
  693. package/dist/events.d.ts.map +0 -1
  694. package/dist/events.js +0 -456
  695. package/dist/events.js.map +0 -1
  696. package/dist/execution-resolver.d.ts +0 -21
  697. package/dist/execution-resolver.d.ts.map +0 -1
  698. package/dist/execution-resolver.js +0 -170
  699. package/dist/execution-resolver.js.map +0 -1
  700. package/dist/harness/auth.d.ts +0 -16
  701. package/dist/harness/auth.d.ts.map +0 -1
  702. package/dist/harness/auth.js +0 -86
  703. package/dist/harness/auth.js.map +0 -1
  704. package/dist/harness/extensions/loader.d.ts +0 -86
  705. package/dist/harness/extensions/loader.d.ts.map +0 -1
  706. package/dist/harness/extensions/loader.js +0 -525
  707. package/dist/harness/extensions/loader.js.map +0 -1
  708. package/dist/harness/extensions/registry.d.ts +0 -23
  709. package/dist/harness/extensions/registry.d.ts.map +0 -1
  710. package/dist/harness/extensions/registry.js +0 -45
  711. package/dist/harness/extensions/registry.js.map +0 -1
  712. package/dist/harness/extensions/types.d.ts +0 -248
  713. package/dist/harness/extensions/types.d.ts.map +0 -1
  714. package/dist/harness/extensions/types.js.map +0 -1
  715. package/dist/harness/session-store.d.ts +0 -77
  716. package/dist/harness/session-store.d.ts.map +0 -1
  717. package/dist/harness/session-store.js +0 -248
  718. package/dist/harness/session-store.js.map +0 -1
  719. package/dist/harness/settings.d.ts +0 -47
  720. package/dist/harness/settings.d.ts.map +0 -1
  721. package/dist/harness/settings.js +0 -29
  722. package/dist/harness/settings.js.map +0 -1
  723. package/dist/model-registry.d.ts +0 -4
  724. package/dist/model-registry.d.ts.map +0 -1
  725. package/dist/model-registry.js +0 -7
  726. package/dist/model-registry.js.map +0 -1
  727. package/dist/platform-messages.d.ts.map +0 -1
  728. package/dist/platform-messages.js.map +0 -1
  729. package/dist/portal-shell.d.ts +0 -4
  730. package/dist/portal-shell.d.ts.map +0 -1
  731. package/dist/portal-shell.js.map +0 -1
  732. package/dist/provisioner.d.ts.map +0 -1
  733. package/dist/provisioner.js +0 -517
  734. package/dist/provisioner.js.map +0 -1
  735. package/dist/runtime/agent-run-controller.d.ts +0 -31
  736. package/dist/runtime/agent-run-controller.d.ts.map +0 -1
  737. package/dist/runtime/agent-run-controller.js +0 -195
  738. package/dist/runtime/agent-run-controller.js.map +0 -1
  739. package/dist/sandbox/errors.d.ts +0 -6
  740. package/dist/sandbox/errors.d.ts.map +0 -1
  741. package/dist/sandbox/errors.js +0 -11
  742. package/dist/sandbox/errors.js.map +0 -1
  743. package/dist/sandbox/firecracker.d.ts +0 -15
  744. package/dist/sandbox/firecracker.d.ts.map +0 -1
  745. package/dist/sandbox/firecracker.js +0 -212
  746. package/dist/sandbox/firecracker.js.map +0 -1
  747. package/dist/sandbox/image.d.ts +0 -3
  748. package/dist/sandbox/image.d.ts.map +0 -1
  749. package/dist/sandbox/image.js +0 -27
  750. package/dist/sandbox/image.js.map +0 -1
  751. package/dist/sandbox/path-context.d.ts +0 -3
  752. package/dist/sandbox/path-context.d.ts.map +0 -1
  753. package/dist/sandbox/path-context.js +0 -20
  754. package/dist/sandbox/path-context.js.map +0 -1
  755. package/dist/sessions/agent-memory-file-manager.d.ts +0 -19
  756. package/dist/sessions/agent-memory-file-manager.d.ts.map +0 -1
  757. package/dist/sessions/agent-memory-file-manager.js.map +0 -1
  758. package/dist/sessions/metadata.d.ts +0 -3
  759. package/dist/sessions/metadata.d.ts.map +0 -1
  760. package/dist/sessions/metadata.js +0 -11
  761. package/dist/sessions/metadata.js.map +0 -1
  762. package/dist/sessions/policy.d.ts +0 -6
  763. package/dist/sessions/policy.d.ts.map +0 -1
  764. package/dist/sessions/policy.js +0 -24
  765. package/dist/sessions/policy.js.map +0 -1
  766. package/dist/store.d.ts +0 -46
  767. package/dist/store.d.ts.map +0 -1
  768. package/dist/store.js +0 -177
  769. package/dist/store.js.map +0 -1
  770. package/dist/tools/bash.d.ts +0 -10
  771. package/dist/tools/bash.d.ts.map +0 -1
  772. package/dist/tools/bash.js +0 -80
  773. package/dist/tools/bash.js.map +0 -1
  774. package/dist/tools/edit.d.ts +0 -11
  775. package/dist/tools/edit.d.ts.map +0 -1
  776. package/dist/tools/edit.js +0 -131
  777. package/dist/tools/edit.js.map +0 -1
  778. package/dist/tools/event.d.ts +0 -56
  779. package/dist/tools/event.d.ts.map +0 -1
  780. package/dist/tools/event.js +0 -252
  781. package/dist/tools/event.js.map +0 -1
  782. package/dist/tools/index.d.ts +0 -24
  783. package/dist/tools/index.d.ts.map +0 -1
  784. package/dist/tools/index.js +0 -31
  785. package/dist/tools/index.js.map +0 -1
  786. package/dist/tools/react.d.ts +0 -15
  787. package/dist/tools/react.d.ts.map +0 -1
  788. package/dist/tools/react.js +0 -40
  789. package/dist/tools/react.js.map +0 -1
  790. package/dist/tools/read.d.ts +0 -11
  791. package/dist/tools/read.d.ts.map +0 -1
  792. package/dist/tools/read.js +0 -134
  793. package/dist/tools/read.js.map +0 -1
  794. package/dist/tools/sandbox.d.ts +0 -22
  795. package/dist/tools/sandbox.d.ts.map +0 -1
  796. package/dist/tools/sandbox.js.map +0 -1
  797. package/dist/tools/truncate.d.ts +0 -33
  798. package/dist/tools/truncate.d.ts.map +0 -1
  799. package/dist/tools/truncate.js +0 -184
  800. package/dist/tools/truncate.js.map +0 -1
  801. package/dist/tools/types.d.ts +0 -54
  802. package/dist/tools/types.d.ts.map +0 -1
  803. package/dist/tools/types.js.map +0 -1
  804. package/dist/tools/write.d.ts +0 -10
  805. package/dist/tools/write.d.ts.map +0 -1
  806. package/dist/tools/write.js +0 -29
  807. package/dist/tools/write.js.map +0 -1
  808. package/dist/trigger.d.ts +0 -22
  809. package/dist/trigger.d.ts.map +0 -1
  810. package/dist/trigger.js +0 -100
  811. package/dist/trigger.js.map +0 -1
  812. package/dist/utils/date.d.ts +0 -10
  813. package/dist/utils/date.d.ts.map +0 -1
  814. package/dist/utils/date.js +0 -23
  815. package/dist/utils/date.js.map +0 -1
  816. package/dist/utils/env.d.ts +0 -3
  817. package/dist/utils/env.d.ts.map +0 -1
  818. package/dist/utils/env.js +0 -12
  819. package/dist/utils/env.js.map +0 -1
  820. package/dist/utils/file-guards.d.ts +0 -9
  821. package/dist/utils/file-guards.d.ts.map +0 -1
  822. package/dist/utils/file-guards.js +0 -59
  823. package/dist/utils/file-guards.js.map +0 -1
  824. package/dist/utils/fs-atomic.d.ts +0 -10
  825. package/dist/utils/fs-atomic.d.ts.map +0 -1
  826. package/dist/utils/fs-atomic.js +0 -45
  827. package/dist/utils/fs-atomic.js.map +0 -1
  828. package/dist/utils/html.d.ts +0 -2
  829. package/dist/utils/html.d.ts.map +0 -1
  830. package/dist/utils/html.js +0 -4
  831. package/dist/utils/html.js.map +0 -1
  832. package/dist/utils/http-body.d.ts +0 -10
  833. package/dist/utils/http-body.d.ts.map +0 -1
  834. package/dist/utils/http-body.js +0 -34
  835. package/dist/utils/http-body.js.map +0 -1
  836. package/dist/vault/routing.d.ts +0 -3
  837. package/dist/vault/routing.d.ts.map +0 -1
  838. package/dist/vault/routing.js +0 -13
  839. package/dist/vault/routing.js.map +0 -1
  840. package/dist/web/admin/portal.d.ts +0 -5
  841. package/dist/web/admin/portal.d.ts.map +0 -1
  842. package/dist/web/admin/portal.js +0 -2572
  843. package/dist/web/admin/portal.js.map +0 -1
  844. package/dist/web/admin/provider-models.d.ts.map +0 -1
  845. package/dist/web/admin/provider-models.js.map +0 -1
  846. package/dist/web/admin/store.d.ts +0 -13
  847. package/dist/web/admin/store.d.ts.map +0 -1
  848. package/dist/web/admin/store.js +0 -14
  849. package/dist/web/admin/store.js.map +0 -1
  850. package/dist/web/admin/types.d.ts +0 -30
  851. package/dist/web/admin/types.d.ts.map +0 -1
  852. package/dist/web/admin/types.js.map +0 -1
  853. package/dist/web/agent-events/portal.d.ts +0 -3
  854. package/dist/web/agent-events/portal.d.ts.map +0 -1
  855. package/dist/web/agent-events/portal.js +0 -18
  856. package/dist/web/agent-events/portal.js.map +0 -1
  857. package/dist/web/login/oauth.d.ts +0 -6
  858. package/dist/web/login/oauth.d.ts.map +0 -1
  859. package/dist/web/login/oauth.js.map +0 -1
  860. package/dist/web/login/portal.d.ts +0 -17
  861. package/dist/web/login/portal.d.ts.map +0 -1
  862. package/dist/web/login/portal.js.map +0 -1
  863. package/dist/web/login/store.d.ts +0 -8
  864. package/dist/web/login/store.d.ts.map +0 -1
  865. package/dist/web/login/store.js +0 -15
  866. package/dist/web/login/store.js.map +0 -1
  867. package/dist/web/login/types.d.ts.map +0 -1
  868. package/dist/web/login/types.js.map +0 -1
  869. package/dist/web/request.d.ts +0 -3
  870. package/dist/web/request.d.ts.map +0 -1
  871. package/dist/web/request.js +0 -13
  872. package/dist/web/request.js.map +0 -1
  873. package/dist/web/server.d.ts +0 -28
  874. package/dist/web/server.d.ts.map +0 -1
  875. package/dist/web/server.js.map +0 -1
  876. package/dist/web/session-view/command.d.ts +0 -4
  877. package/dist/web/session-view/command.d.ts.map +0 -1
  878. package/dist/web/session-view/command.js +0 -7
  879. package/dist/web/session-view/command.js.map +0 -1
  880. package/dist/web/session-view/portal.d.ts +0 -13
  881. package/dist/web/session-view/portal.d.ts.map +0 -1
  882. package/dist/web/session-view/portal.js.map +0 -1
  883. package/dist/web/session-view/service.d.ts +0 -6
  884. package/dist/web/session-view/service.d.ts.map +0 -1
  885. package/dist/web/session-view/service.js +0 -498
  886. package/dist/web/session-view/service.js.map +0 -1
  887. package/dist/web/session-view/store.d.ts +0 -8
  888. package/dist/web/session-view/store.d.ts.map +0 -1
  889. package/dist/web/session-view/store.js +0 -15
  890. package/dist/web/session-view/store.js.map +0 -1
  891. package/dist/web/session-view/types.js.map +0 -1
  892. package/dist/web/token-store.d.ts.map +0 -1
  893. package/dist/web/token-store.js.map +0 -1
  894. package/dist/web/types.d.ts.map +0 -1
  895. package/dist/web/types.js.map +0 -1
  896. /package/dist/{commands → adapters/commands}/admin.d.ts +0 -0
  897. /package/dist/{commands → adapters/commands}/new.d.ts +0 -0
  898. /package/dist/{commands → adapters/commands}/session-view.d.ts +0 -0
  899. /package/dist/{commands → adapters/commands}/types.js +0 -0
  900. /package/dist/{harness/extensions → adapters/web/admin}/types.js +0 -0
  901. /package/dist/{tools → adapters/web/login}/types.js +0 -0
  902. /package/dist/{web/admin → adapters/web/session-view}/types.js +0 -0
  903. /package/dist/{web → adapters/web}/types.d.ts +0 -0
  904. /package/dist/{web/login → adapters/web}/types.js +0 -0
  905. /package/dist/{download.d.ts → cli/download.d.ts} +0 -0
  906. /package/dist/{web/session-view → cli}/types.js +0 -0
  907. /package/dist/{web → harness/tools}/types.js +0 -0
@@ -0,0 +1,135 @@
1
+ import { createBuiltinJevModels, JevAPIError, JevAuthError, JevConfigError, JevConnectionError, JevResponseError, JevTimeoutError, } from "@geminixiang/jev";
2
+ import { readEnv } from "../env-manifest.js";
3
+ import { recordJevOutcome } from "../observability/index.js";
4
+ export const JEV_MODEL_ID = "~typesafe/jev-latest";
5
+ export class JevNotConfiguredError extends Error {
6
+ constructor() {
7
+ super("Jev requires OPENROUTER_API_KEY (an OpenRouter API key). Set it in the environment before calling evaluateWithJev().");
8
+ this.name = "JevNotConfiguredError";
9
+ }
10
+ }
11
+ export class JevRequestError extends Error {
12
+ constructor(message, status) {
13
+ super(message);
14
+ this.status = status;
15
+ this.name = "JevRequestError";
16
+ }
17
+ }
18
+ const mikanAuthContext = {
19
+ async env(name) {
20
+ return readEnv(name);
21
+ },
22
+ async fileExists() {
23
+ return false;
24
+ },
25
+ };
26
+ let cachedModels;
27
+ function models() {
28
+ cachedModels ??= createBuiltinJevModels({ authContext: mikanAuthContext });
29
+ return cachedModels;
30
+ }
31
+ function toGeminixiangQuestion(question) {
32
+ const instructions = question.instructions;
33
+ if (question.type === "boolean") {
34
+ return {
35
+ type: "noul",
36
+ instructions,
37
+ criteria: {
38
+ true: question.criteria?.true ?? "Yes",
39
+ false: question.criteria?.false ?? "No",
40
+ },
41
+ };
42
+ }
43
+ if (question.type === "choice") {
44
+ return {
45
+ type: "choice",
46
+ instructions,
47
+ criteria: question.criteria,
48
+ };
49
+ }
50
+ const [first, second, ...rest] = question.criteria;
51
+ if (first === undefined || second === undefined) {
52
+ throw new Error("score questions need at least two levels");
53
+ }
54
+ return { type: "score", instructions, criteria: [first, second, ...rest] };
55
+ }
56
+ function fromGeminixiangAnswer(answer) {
57
+ if (answer.type === "noul") {
58
+ return { type: "boolean", probability: answer.noul };
59
+ }
60
+ if (answer.type === "choice") {
61
+ return {
62
+ type: "choice",
63
+ choice: answer.choice,
64
+ probabilities: answer.probabilities,
65
+ confidence: answer.confidence,
66
+ };
67
+ }
68
+ return {
69
+ type: "score",
70
+ score: answer.score,
71
+ probabilities: answer.probabilities,
72
+ legend: answer.legend,
73
+ confidence: answer.confidence,
74
+ };
75
+ }
76
+ export async function evaluateWithJev(state, questions, options) {
77
+ const catalogModel = models().getModel("openrouter", "jev-latest");
78
+ if (!catalogModel)
79
+ throw new JevNotConfiguredError();
80
+ const model = options.model ? { ...catalogModel, slug: options.model } : catalogModel;
81
+ const wireQuestions = {};
82
+ for (const [id, question] of Object.entries(questions)) {
83
+ wireQuestions[id] = toGeminixiangQuestion(question);
84
+ }
85
+ const startedAt = Date.now();
86
+ let result;
87
+ try {
88
+ result = await models().evaluate(model, { state: state, questions: wireQuestions }, { headers: options.headers, signal: options.abortSignal });
89
+ }
90
+ catch (error) {
91
+ recordJevOutcome({
92
+ caller: options.caller,
93
+ status: "error",
94
+ errorType: error instanceof Error ? error.name : "Error",
95
+ durationMs: Date.now() - startedAt,
96
+ });
97
+ if (error instanceof JevAuthError || error instanceof JevConfigError) {
98
+ throw new JevNotConfiguredError();
99
+ }
100
+ if (error instanceof JevAPIError) {
101
+ throw new JevRequestError(error.message, error.status);
102
+ }
103
+ if (error instanceof JevResponseError ||
104
+ error instanceof JevConnectionError ||
105
+ error instanceof JevTimeoutError) {
106
+ throw new JevRequestError(error.message, 502);
107
+ }
108
+ throw error;
109
+ }
110
+ recordJevOutcome({
111
+ caller: options.caller,
112
+ status: "ok",
113
+ inputTokens: result.usage.input,
114
+ outputTokens: result.usage.output,
115
+ costUsd: result.usage.cost.total,
116
+ durationMs: Date.now() - startedAt,
117
+ });
118
+ const answers = {};
119
+ for (const id of Object.keys(questions)) {
120
+ const answer = result.answers[id];
121
+ if (!answer)
122
+ throw new JevRequestError(`Jev response missing answer for "${id}"`, 502);
123
+ answers[id] = fromGeminixiangAnswer(answer);
124
+ }
125
+ return {
126
+ answers,
127
+ usage: {
128
+ inputTokens: result.usage.input,
129
+ outputTokens: result.usage.output,
130
+ cost: result.usage.cost.total,
131
+ },
132
+ model: result.model,
133
+ };
134
+ }
135
+ //# sourceMappingURL=jev.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jev.js","sourceRoot":"","sources":["../../src/harness/jev.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n createBuiltinJevModels,\n JevAPIError,\n JevAuthError,\n JevConfigError,\n JevConnectionError,\n JevResponseError,\n JevTimeoutError,\n type AnswerFor as GeminixiangAnswerFor,\n type Entry as GeminixiangEntry,\n type Question as GeminixiangQuestion,\n} from \"@geminixiang/jev\";\nimport type { AuthContext } from \"@earendil-works/pi-ai\";\nimport { readEnv } from \"../env-manifest.js\";\nimport { recordJevOutcome } from \"../observability/index.js\";\nimport type { JevCaller } from \"../observability/types.js\";\n\nexport const JEV_MODEL_ID = \"~typesafe/jev-latest\";\n\nexport type JevEntry = string | number | boolean | null | JevEntry[] | { [key: string]: JevEntry };\n\nexport type JevQuestion =\n | {\n type: \"boolean\";\n instructions: JevEntry;\n criteria?: { true?: JevEntry; false?: JevEntry };\n }\n | { type: \"choice\"; instructions: JevEntry; criteria: Record<string, JevEntry> }\n | { type: \"score\"; instructions: JevEntry; criteria: readonly JevEntry[] };\n\nexport type JevQuestions = Record<string, JevQuestion>;\n\nexport type JevAnswer<QUESTION extends JevQuestion> = QUESTION extends { type: \"choice\" }\n ? {\n type: \"choice\";\n choice: string;\n probabilities?: Record<string, number>;\n confidence?: number;\n }\n : QUESTION extends { type: \"score\" }\n ? {\n type: \"score\";\n score: number;\n probabilities?: Record<string, number>;\n legend?: Record<string, string>;\n confidence?: number;\n }\n : { type: \"boolean\"; probability: number };\n\nexport interface JevResult<QUESTIONS extends JevQuestions> {\n readonly answers: { [ID in keyof QUESTIONS]: JevAnswer<QUESTIONS[ID]> };\n readonly usage: {\n inputTokens: number | undefined;\n outputTokens: number | undefined;\n cost: number | undefined;\n };\n readonly model: string;\n}\n\nexport class JevNotConfiguredError extends Error {\n constructor() {\n super(\n \"Jev requires OPENROUTER_API_KEY (an OpenRouter API key). Set it in the environment before calling evaluateWithJev().\",\n );\n this.name = \"JevNotConfiguredError\";\n }\n}\n\nexport class JevRequestError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n ) {\n super(message);\n this.name = \"JevRequestError\";\n }\n}\n\nexport interface EvaluateWithJevOptions {\n model?: string;\n abortSignal?: AbortSignal;\n headers?: Record<string, string>;\n caller: JevCaller;\n}\n\nconst mikanAuthContext: AuthContext = {\n async env(name) {\n return readEnv(name);\n },\n async fileExists() {\n return false;\n },\n};\n\nlet cachedModels: ReturnType<typeof createBuiltinJevModels> | undefined;\n\nfunction models() {\n cachedModels ??= createBuiltinJevModels({ authContext: mikanAuthContext });\n return cachedModels;\n}\n\nfunction toGeminixiangQuestion(question: JevQuestion): GeminixiangQuestion {\n const instructions = question.instructions as GeminixiangEntry;\n if (question.type === \"boolean\") {\n return {\n type: \"noul\",\n instructions,\n criteria: {\n true: (question.criteria?.true as GeminixiangEntry) ?? \"Yes\",\n false: (question.criteria?.false as GeminixiangEntry) ?? \"No\",\n },\n };\n }\n if (question.type === \"choice\") {\n return {\n type: \"choice\",\n instructions,\n criteria: question.criteria as Record<string, GeminixiangEntry>,\n };\n }\n const [first, second, ...rest] = question.criteria as GeminixiangEntry[];\n if (first === undefined || second === undefined) {\n throw new Error(\"score questions need at least two levels\");\n }\n return { type: \"score\", instructions, criteria: [first, second, ...rest] };\n}\n\nfunction fromGeminixiangAnswer(\n answer: GeminixiangAnswerFor<GeminixiangQuestion>,\n): JevAnswer<JevQuestion> {\n if (answer.type === \"noul\") {\n return { type: \"boolean\", probability: answer.noul };\n }\n if (answer.type === \"choice\") {\n return {\n type: \"choice\",\n choice: answer.choice,\n probabilities: answer.probabilities as Record<string, number>,\n confidence: answer.confidence,\n };\n }\n return {\n type: \"score\",\n score: answer.score,\n probabilities: answer.probabilities,\n legend: answer.legend as Record<string, string> | undefined,\n confidence: answer.confidence,\n };\n}\n\nexport async function evaluateWithJev<const QUESTIONS extends JevQuestions>(\n state: JevEntry,\n questions: QUESTIONS,\n options: EvaluateWithJevOptions,\n): Promise<JevResult<QUESTIONS>> {\n const catalogModel = models().getModel(\"openrouter\", \"jev-latest\");\n if (!catalogModel) throw new JevNotConfiguredError();\n const model = options.model ? { ...catalogModel, slug: options.model } : catalogModel;\n\n const wireQuestions: Record<string, GeminixiangQuestion> = {};\n for (const [id, question] of Object.entries(questions)) {\n wireQuestions[id] = toGeminixiangQuestion(question);\n }\n\n const startedAt = Date.now();\n let result;\n try {\n result = await models().evaluate(\n model,\n { state: state as GeminixiangEntry, questions: wireQuestions },\n { headers: options.headers, signal: options.abortSignal },\n );\n } catch (error) {\n recordJevOutcome({\n caller: options.caller,\n status: \"error\",\n errorType: error instanceof Error ? error.name : \"Error\",\n durationMs: Date.now() - startedAt,\n });\n if (error instanceof JevAuthError || error instanceof JevConfigError) {\n throw new JevNotConfiguredError();\n }\n if (error instanceof JevAPIError) {\n throw new JevRequestError(error.message, error.status);\n }\n if (\n error instanceof JevResponseError ||\n error instanceof JevConnectionError ||\n error instanceof JevTimeoutError\n ) {\n throw new JevRequestError(error.message, 502);\n }\n throw error;\n }\n recordJevOutcome({\n caller: options.caller,\n status: \"ok\",\n inputTokens: result.usage.input,\n outputTokens: result.usage.output,\n costUsd: result.usage.cost.total,\n durationMs: Date.now() - startedAt,\n });\n\n const answers = {} as { [ID in keyof QUESTIONS]: JevAnswer<QUESTIONS[ID]> };\n for (const id of Object.keys(questions)) {\n const answer = result.answers[id];\n if (!answer) throw new JevRequestError(`Jev response missing answer for \"${id}\"`, 502);\n (answers as Record<string, JevAnswer<JevQuestion>>)[id] = fromGeminixiangAnswer(answer);\n }\n\n return {\n answers,\n usage: {\n inputTokens: result.usage.input,\n outputTokens: result.usage.output,\n cost: result.usage.cost.total,\n },\n model: result.model,\n };\n}\n"]}
@@ -0,0 +1,10 @@
1
+ import type { ToolLoopVerdict } from "./types.js";
2
+ export declare class ToolLoopGuard {
3
+ private readonly records;
4
+ private readonly cycleNotices;
5
+ observe(toolName: string, args: Record<string, unknown>): ToolLoopVerdict;
6
+ private identicalRunLength;
7
+ private cycleVerdict;
8
+ private cycleRepetitions;
9
+ }
10
+ //# sourceMappingURL=loop-guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop-guard.d.ts","sourceRoot":"","sources":["../../src/harness/loop-guard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAgBlD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoB;IAC5C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA6B;IAE1D,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,eAAe,CAwBxE;IAED,OAAO,CAAC,kBAAkB;IAU1B,OAAO,CAAC,YAAY;IAuBpB,OAAO,CAAC,gBAAgB;CAiBzB"}
@@ -0,0 +1,111 @@
1
+ const TRACK_WINDOW = 64;
2
+ const IDENTICAL_NOTICE_AT = 3;
3
+ const IDENTICAL_BLOCK_AT = 5;
4
+ const IDENTICAL_STOP_AT = 10;
5
+ const CYCLE_MIN_PERIOD = 2;
6
+ const CYCLE_MAX_PERIOD = 6;
7
+ const CYCLE_NOTICE_REPETITIONS = 3;
8
+ const CYCLE_RENOTICE_FACTOR = 2;
9
+ export class ToolLoopGuard {
10
+ constructor() {
11
+ this.records = [];
12
+ this.cycleNotices = new Map();
13
+ }
14
+ observe(toolName, args) {
15
+ this.records.push({ toolName, signature: callSignature(toolName, args) });
16
+ if (this.records.length > TRACK_WINDOW)
17
+ this.records.shift();
18
+ const identical = this.identicalRunLength();
19
+ if (identical >= IDENTICAL_STOP_AT) {
20
+ return {
21
+ kind: "stop",
22
+ reason: `tool loop: ${toolName} called ${identical} times in a row with identical arguments`,
23
+ };
24
+ }
25
+ if (identical >= IDENTICAL_BLOCK_AT) {
26
+ return {
27
+ kind: "block",
28
+ reason: `${toolName} was called ${identical} times in a row with identical arguments, so this call was not executed. Its result would not change. Take a different approach, or tell the user what is blocking progress.`,
29
+ };
30
+ }
31
+ if (identical >= IDENTICAL_NOTICE_AT) {
32
+ return {
33
+ kind: "notice",
34
+ text: `[loop guard] This is call ${identical} in a row of ${toolName} with identical arguments. Repeating it returns the same result. If you are waiting for something to change, wait inside a single bounded command instead; otherwise change your approach.`,
35
+ };
36
+ }
37
+ return this.cycleVerdict();
38
+ }
39
+ identicalRunLength() {
40
+ const last = this.records.at(-1);
41
+ let run = 0;
42
+ for (let index = this.records.length - 1; index >= 0; index--) {
43
+ if (this.records[index]?.signature !== last?.signature)
44
+ break;
45
+ run++;
46
+ }
47
+ return run;
48
+ }
49
+ cycleVerdict() {
50
+ const total = this.records.length;
51
+ for (let period = CYCLE_MIN_PERIOD; period <= CYCLE_MAX_PERIOD; period++) {
52
+ if (total < period * CYCLE_NOTICE_REPETITIONS)
53
+ continue;
54
+ const cycle = this.records.slice(total - period);
55
+ if (new Set(cycle.map((record) => record.signature)).size < 2)
56
+ continue;
57
+ const repetitions = this.cycleRepetitions(period);
58
+ if (repetitions < CYCLE_NOTICE_REPETITIONS)
59
+ continue;
60
+ const key = cycleKey(cycle);
61
+ const notified = this.cycleNotices.get(key);
62
+ if (notified !== undefined && repetitions < notified * CYCLE_RENOTICE_FACTOR) {
63
+ return { kind: "allow" };
64
+ }
65
+ this.cycleNotices.set(key, repetitions);
66
+ const tools = cycle.map((record) => record.toolName).join(" → ");
67
+ return {
68
+ kind: "notice",
69
+ text: `[loop guard] The same sequence of ${period} tool calls (${tools}) has repeated ${repetitions} times with identical arguments. It is not making progress; change your approach.`,
70
+ };
71
+ }
72
+ return { kind: "allow" };
73
+ }
74
+ cycleRepetitions(period) {
75
+ const total = this.records.length;
76
+ let repetitions = 1;
77
+ while ((repetitions + 1) * period <= total) {
78
+ const blockStart = total - (repetitions + 1) * period;
79
+ for (let offset = 0; offset < period; offset++) {
80
+ if (this.records[blockStart + offset]?.signature !==
81
+ this.records[total - period + offset]?.signature) {
82
+ return repetitions;
83
+ }
84
+ }
85
+ repetitions++;
86
+ }
87
+ return repetitions;
88
+ }
89
+ }
90
+ function cycleKey(cycle) {
91
+ return cycle
92
+ .map((record) => record.signature)
93
+ .toSorted()
94
+ .join("\n");
95
+ }
96
+ function callSignature(toolName, args) {
97
+ const { label: _label, ...identity } = args;
98
+ return `${toolName}\u0000${canonicalJson(identity)}`;
99
+ }
100
+ function canonicalJson(value) {
101
+ if (Array.isArray(value))
102
+ return `[${value.map(canonicalJson).join(",")}]`;
103
+ if (value !== null && typeof value === "object") {
104
+ const entries = Object.entries(value)
105
+ .toSorted(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0))
106
+ .map(([key, item]) => `${JSON.stringify(key)}:${canonicalJson(item)}`);
107
+ return `{${entries.join(",")}}`;
108
+ }
109
+ return JSON.stringify(value) ?? "null";
110
+ }
111
+ //# sourceMappingURL=loop-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop-guard.js","sourceRoot":"","sources":["../../src/harness/loop-guard.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ToolLoopVerdict } from \"./types.js\";\n\nconst TRACK_WINDOW = 64;\nconst IDENTICAL_NOTICE_AT = 3;\nconst IDENTICAL_BLOCK_AT = 5;\nconst IDENTICAL_STOP_AT = 10;\nconst CYCLE_MIN_PERIOD = 2;\nconst CYCLE_MAX_PERIOD = 6;\nconst CYCLE_NOTICE_REPETITIONS = 3;\nconst CYCLE_RENOTICE_FACTOR = 2;\n\ninterface CallRecord {\n toolName: string;\n signature: string;\n}\n\nexport class ToolLoopGuard {\n private readonly records: CallRecord[] = [];\n private readonly cycleNotices = new Map<string, number>();\n\n observe(toolName: string, args: Record<string, unknown>): ToolLoopVerdict {\n this.records.push({ toolName, signature: callSignature(toolName, args) });\n if (this.records.length > TRACK_WINDOW) this.records.shift();\n\n const identical = this.identicalRunLength();\n if (identical >= IDENTICAL_STOP_AT) {\n return {\n kind: \"stop\",\n reason: `tool loop: ${toolName} called ${identical} times in a row with identical arguments`,\n };\n }\n if (identical >= IDENTICAL_BLOCK_AT) {\n return {\n kind: \"block\",\n reason: `${toolName} was called ${identical} times in a row with identical arguments, so this call was not executed. Its result would not change. Take a different approach, or tell the user what is blocking progress.`,\n };\n }\n if (identical >= IDENTICAL_NOTICE_AT) {\n return {\n kind: \"notice\",\n text: `[loop guard] This is call ${identical} in a row of ${toolName} with identical arguments. Repeating it returns the same result. If you are waiting for something to change, wait inside a single bounded command instead; otherwise change your approach.`,\n };\n }\n return this.cycleVerdict();\n }\n\n private identicalRunLength(): number {\n const last = this.records.at(-1);\n let run = 0;\n for (let index = this.records.length - 1; index >= 0; index--) {\n if (this.records[index]?.signature !== last?.signature) break;\n run++;\n }\n return run;\n }\n\n private cycleVerdict(): ToolLoopVerdict {\n const total = this.records.length;\n for (let period = CYCLE_MIN_PERIOD; period <= CYCLE_MAX_PERIOD; period++) {\n if (total < period * CYCLE_NOTICE_REPETITIONS) continue;\n const cycle = this.records.slice(total - period);\n if (new Set(cycle.map((record) => record.signature)).size < 2) continue;\n const repetitions = this.cycleRepetitions(period);\n if (repetitions < CYCLE_NOTICE_REPETITIONS) continue;\n const key = cycleKey(cycle);\n const notified = this.cycleNotices.get(key);\n if (notified !== undefined && repetitions < notified * CYCLE_RENOTICE_FACTOR) {\n return { kind: \"allow\" };\n }\n this.cycleNotices.set(key, repetitions);\n const tools = cycle.map((record) => record.toolName).join(\" → \");\n return {\n kind: \"notice\",\n text: `[loop guard] The same sequence of ${period} tool calls (${tools}) has repeated ${repetitions} times with identical arguments. It is not making progress; change your approach.`,\n };\n }\n return { kind: \"allow\" };\n }\n\n private cycleRepetitions(period: number): number {\n const total = this.records.length;\n let repetitions = 1;\n while ((repetitions + 1) * period <= total) {\n const blockStart = total - (repetitions + 1) * period;\n for (let offset = 0; offset < period; offset++) {\n if (\n this.records[blockStart + offset]?.signature !==\n this.records[total - period + offset]?.signature\n ) {\n return repetitions;\n }\n }\n repetitions++;\n }\n return repetitions;\n }\n}\n\nfunction cycleKey(cycle: CallRecord[]): string {\n return cycle\n .map((record) => record.signature)\n .toSorted()\n .join(\"\\n\");\n}\n\nfunction callSignature(toolName: string, args: Record<string, unknown>): string {\n const { label: _label, ...identity } = args;\n return `${toolName}\\u0000${canonicalJson(identity)}`;\n}\n\nfunction canonicalJson(value: unknown): string {\n if (Array.isArray(value)) return `[${value.map(canonicalJson).join(\",\")}]`;\n if (value !== null && typeof value === \"object\") {\n const entries = Object.entries(value)\n .toSorted(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0))\n .map(([key, item]) => `${JSON.stringify(key)}:${canonicalJson(item)}`);\n return `{${entries.join(\",\")}}`;\n }\n return JSON.stringify(value) ?? \"null\";\n}\n"]}
@@ -0,0 +1,20 @@
1
+ import type { ImageContent, TextContent } from "@earendil-works/pi-ai";
2
+ import { type AgentToolResult, type Context, type ExecutionEnv } from "@earendil-works/pi-agent-core";
3
+ export interface McpTextLimits {
4
+ maxBytes: number;
5
+ maxLines: number;
6
+ }
7
+ export interface BoundedMcpText {
8
+ text: string;
9
+ truncated: boolean;
10
+ digest?: true;
11
+ }
12
+ export interface McpCallResult {
13
+ content?: unknown;
14
+ structuredContent?: unknown;
15
+ isError?: boolean;
16
+ }
17
+ export declare function mcpResultContent(result: McpCallResult): (TextContent | ImageContent)[];
18
+ export declare function boundMcpText(text: string, limits: McpTextLimits): BoundedMcpText;
19
+ export declare function guardMcpToolResult(result: McpCallResult, env: ExecutionEnv, context: Context): Promise<AgentToolResult<undefined>>;
20
+ //# sourceMappingURL=mcp-result.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-result.d.ts","sourceRoot":"","sources":["../../src/harness/mcp-result.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAKL,KAAK,eAAe,EACpB,KAAK,OAAO,EACZ,KAAK,YAAY,EAClB,MAAM,+BAA+B,CAAC;AAIvC,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,IAAI,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAiED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,aAAa,GAAG,CAAC,WAAW,GAAG,YAAY,CAAC,EAAE,CAStF;AAsDD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,cAAc,CAehF;AA2CD,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,aAAa,EACrB,GAAG,EAAE,YAAY,EACjB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAkBrC"}
@@ -0,0 +1,179 @@
1
+ import { randomBytes } from "node:crypto";
2
+ import { DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, formatSize, truncateHead, } from "@earendil-works/pi-agent-core";
3
+ import { redactSecrets } from "./tools/secret-redaction.js";
4
+ import { isRecord } from "../unknown-values.js";
5
+ const SPILL_DIR = [".mikan", "mcp-output"];
6
+ const NOTICE_RESERVE_BYTES = 640;
7
+ const NOTICE_RESERVE_LINES = 4;
8
+ const RESULT_LIMITS = {
9
+ maxBytes: DEFAULT_MAX_BYTES - NOTICE_RESERVE_BYTES,
10
+ maxLines: DEFAULT_MAX_LINES - NOTICE_RESERVE_LINES,
11
+ };
12
+ const DIGEST_LEVELS = [
13
+ { stringChars: 200, arrayItems: 3, depth: 6 },
14
+ { stringChars: 80, arrayItems: 2, depth: 4 },
15
+ { stringChars: 40, arrayItems: 1, depth: 3 },
16
+ { stringChars: 16, arrayItems: 1, depth: 2 },
17
+ ];
18
+ function isRawBlock(value) {
19
+ return isRecord(value);
20
+ }
21
+ function stringField(block, key) {
22
+ const value = block[key];
23
+ return typeof value === "string" ? value : undefined;
24
+ }
25
+ function describeResource(resource) {
26
+ const uri = stringField(resource, "uri") ?? "(no URI)";
27
+ const text = stringField(resource, "text");
28
+ if (text !== undefined)
29
+ return `[Resource: ${uri}]\n${text}`;
30
+ const blob = stringField(resource, "blob");
31
+ const mimeType = stringField(resource, "mimeType") ?? "unknown type";
32
+ const size = blob === undefined ? "no content" : `${Buffer.byteLength(blob, "base64")} bytes`;
33
+ return `[Resource: ${uri} (${mimeType}, ${size}, binary content omitted)]`;
34
+ }
35
+ function blockContent(block) {
36
+ const text = stringField(block, "text");
37
+ if (block.type === "text" && text !== undefined)
38
+ return { type: "text", text };
39
+ const data = stringField(block, "data");
40
+ const mimeType = stringField(block, "mimeType");
41
+ if (block.type === "image" && data !== undefined && mimeType !== undefined) {
42
+ return { type: "image", data, mimeType };
43
+ }
44
+ if (block.type === "resource" && isRawBlock(block.resource)) {
45
+ return { type: "text", text: describeResource(block.resource) };
46
+ }
47
+ if (block.type === "resource_link") {
48
+ const uri = stringField(block, "uri") ?? "(no URI)";
49
+ return { type: "text", text: `[Resource link: ${stringField(block, "name") ?? uri}] ${uri}` };
50
+ }
51
+ if (block.type === "audio") {
52
+ return { type: "text", text: `[Audio content omitted: ${mimeType ?? "audio/*"}]` };
53
+ }
54
+ return { type: "text", text: JSON.stringify(block) };
55
+ }
56
+ export function mcpResultContent(result) {
57
+ const blocks = (Array.isArray(result.content) ? result.content : [])
58
+ .filter(isRawBlock)
59
+ .map(blockContent);
60
+ if (blocks.length > 0)
61
+ return blocks;
62
+ if (result.structuredContent !== undefined && result.structuredContent !== null) {
63
+ return [{ type: "text", text: JSON.stringify(result.structuredContent) }];
64
+ }
65
+ return [{ type: "text", text: "(empty result)" }];
66
+ }
67
+ function parseJson(text) {
68
+ const trimmed = text.trimStart();
69
+ if (!trimmed.startsWith("{") && !trimmed.startsWith("["))
70
+ return undefined;
71
+ try {
72
+ return { value: JSON.parse(text) };
73
+ }
74
+ catch {
75
+ return undefined;
76
+ }
77
+ }
78
+ function digest(value, level, depth = 0) {
79
+ if (typeof value === "string") {
80
+ return value.length <= level.stringChars
81
+ ? value
82
+ : `${value.slice(0, level.stringChars)}…[+${value.length - level.stringChars} chars]`;
83
+ }
84
+ if (Array.isArray(value)) {
85
+ if (depth >= level.depth)
86
+ return `[…${value.length} items]`;
87
+ const kept = value.slice(0, level.arrayItems).map((item) => digest(item, level, depth + 1));
88
+ const hidden = value.length - kept.length;
89
+ return hidden > 0 ? [...kept, `…[+${hidden} more items]`] : kept;
90
+ }
91
+ if (isRawBlock(value)) {
92
+ if (depth >= level.depth)
93
+ return `{…${Object.keys(value).length} keys}`;
94
+ return Object.fromEntries(Object.entries(value).map(([key, item]) => [key, digest(item, level, depth + 1)]));
95
+ }
96
+ return value;
97
+ }
98
+ function fits(text, limits) {
99
+ return (Buffer.byteLength(text, "utf8") <= limits.maxBytes && text.split("\n").length <= limits.maxLines);
100
+ }
101
+ function sliceToBytes(text, maxBytes) {
102
+ const buffer = Buffer.from(text, "utf8");
103
+ if (buffer.length <= maxBytes)
104
+ return text;
105
+ let end = Math.max(0, maxBytes);
106
+ while (end > 0 && (buffer[end] & 0xc0) === 0x80)
107
+ end--;
108
+ return buffer.subarray(0, end).toString("utf8");
109
+ }
110
+ function headTruncate(text, limits) {
111
+ const truncation = truncateHead(text, limits);
112
+ return truncation.firstLineExceedsLimit
113
+ ? sliceToBytes(text, limits.maxBytes)
114
+ : truncation.content;
115
+ }
116
+ export function boundMcpText(text, limits) {
117
+ const parsed = parseJson(text);
118
+ if (!parsed) {
119
+ return fits(text, limits)
120
+ ? { text, truncated: false }
121
+ : { text: headTruncate(text, limits), truncated: true };
122
+ }
123
+ const compact = JSON.stringify(parsed.value);
124
+ if (fits(compact, limits))
125
+ return { text: compact, truncated: false };
126
+ for (const level of DIGEST_LEVELS) {
127
+ const digested = JSON.stringify(digest(parsed.value, level));
128
+ if (fits(digested, limits))
129
+ return { text: digested, truncated: true, digest: true };
130
+ }
131
+ const smallest = JSON.stringify(digest(parsed.value, DIGEST_LEVELS.at(-1)));
132
+ return { text: sliceToBytes(smallest, limits.maxBytes), truncated: true, digest: true };
133
+ }
134
+ function compactMcpText(text) {
135
+ const parsed = parseJson(text);
136
+ return parsed ? JSON.stringify(parsed.value) : text;
137
+ }
138
+ function readableSpill(text) {
139
+ const parsed = parseJson(text);
140
+ return parsed
141
+ ? { text: JSON.stringify(parsed.value, null, 2), extension: "json" }
142
+ : { text, extension: "txt" };
143
+ }
144
+ async function spillFullResult(env, result, context) {
145
+ const { text, extension } = readableSpill(result);
146
+ const path = await env.joinPath([env.cwd, ...SPILL_DIR, `${randomBytes(8).toString("hex")}.${extension}`], context);
147
+ if (!path.ok)
148
+ return undefined;
149
+ const written = await env.writeFile(path.value, redactSecrets(text), context);
150
+ return written.ok ? path.value : undefined;
151
+ }
152
+ function truncationNotice(bounded, totalBytes, spillPath) {
153
+ const view = bounded.digest
154
+ ? `an abbreviated view of ${formatSize(totalBytes)}: long strings, arrays, and deep nesting are shortened; keys, counts, and pagination fields are kept`
155
+ : `the beginning of ${formatSize(totalBytes)}`;
156
+ const full = spillPath
157
+ ? `Full result: ${spillPath} — use read with offset/limit or grep to inspect it`
158
+ : "The full result could not be saved";
159
+ return `[MCP result truncated: showing ${view}. ${full}, or re-query with filters or smaller pages.]`;
160
+ }
161
+ export async function guardMcpToolResult(result, env, context) {
162
+ const blocks = mcpResultContent(result).map((block) => block.type === "text" ? Object.assign(block, { text: compactMcpText(block.text) }) : block);
163
+ const texts = blocks.filter((block) => block.type === "text");
164
+ const images = blocks.filter((block) => block.type === "image");
165
+ const combined = texts.map((block) => block.text).join("\n");
166
+ if (result.isError) {
167
+ throw new Error(boundMcpText(combined, RESULT_LIMITS).text || "MCP tool call failed");
168
+ }
169
+ if (fits(combined, RESULT_LIMITS))
170
+ return { content: blocks, details: undefined };
171
+ const bounded = boundMcpText(combined, RESULT_LIMITS);
172
+ const spillPath = await spillFullResult(env, combined, context);
173
+ const notice = truncationNotice(bounded, Buffer.byteLength(combined, "utf8"), spillPath);
174
+ return {
175
+ content: [{ type: "text", text: `${bounded.text}\n\n${notice}` }, ...images],
176
+ details: undefined,
177
+ };
178
+ }
179
+ //# sourceMappingURL=mcp-result.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-result.js","sourceRoot":"","sources":["../../src/harness/mcp-result.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,UAAU,EACV,YAAY,GAIb,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAmBhD,MAAM,SAAS,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;AAC3C,MAAM,oBAAoB,GAAG,GAAG,CAAC;AACjC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAC/B,MAAM,aAAa,GAAkB;IACnC,QAAQ,EAAE,iBAAiB,GAAG,oBAAoB;IAClD,QAAQ,EAAE,iBAAiB,GAAG,oBAAoB;CACnD,CAAC;AAQF,MAAM,aAAa,GAA2B;IAC5C,EAAE,WAAW,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;IAC7C,EAAE,WAAW,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;IAC5C,EAAE,WAAW,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;IAC5C,EAAE,WAAW,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;CAC7C,CAAC;AAIF,SAAS,UAAU,CAAC,KAAc;IAChC,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,WAAW,CAAC,KAAe,EAAE,GAAW;IAC/C,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;IACzB,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAkB;IAC1C,MAAM,GAAG,GAAG,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,UAAU,CAAC;IACvD,MAAM,IAAI,GAAG,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC3C,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,cAAc,GAAG,MAAM,IAAI,EAAE,CAAC;IAC7D,MAAM,IAAI,GAAG,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,EAAE,UAAU,CAAC,IAAI,cAAc,CAAC;IACrE,MAAM,IAAI,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC;IAC9F,OAAO,cAAc,GAAG,KAAK,QAAQ,KAAK,IAAI,4BAA4B,CAAC;AAC7E,CAAC;AAED,SAAS,YAAY,CAAC,KAAe;IACnC,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACxC,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC/E,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IAChD,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3E,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAC3C,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5D,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;IAClE,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,UAAU,CAAC;QACpD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,GAAG,KAAK,GAAG,EAAE,EAAE,CAAC;IAChG,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC3B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,2BAA2B,QAAQ,IAAI,SAAS,GAAG,EAAE,CAAC;IACrF,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAqB;IACpD,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;SACjE,MAAM,CAAC,UAAU,CAAC;SAClB,GAAG,CAAC,YAAY,CAAC,CAAC;IACrB,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,MAAM,CAAC;IACrC,IAAI,MAAM,CAAC,iBAAiB,KAAK,SAAS,IAAI,MAAM,CAAC,iBAAiB,KAAK,IAAI,EAAE,CAAC;QAChF,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,SAAS,CAAC,IAAY;IAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;IACjC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3E,IAAI,CAAC;QACH,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,MAAM,CAAC,KAAc,EAAE,KAAkB,EAAE,KAAK,GAAG,CAAC;IAC3D,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,WAAW;YACtC,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,WAAW,SAAS,CAAC;IAC1F,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,IAAI,KAAK,IAAI,KAAK,CAAC,KAAK;YAAE,OAAO,KAAK,KAAK,CAAC,MAAM,SAAS,CAAC;QAC5D,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;QAC5F,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1C,OAAO,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,MAAM,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACnE,CAAC;IACD,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACtB,IAAI,KAAK,IAAI,KAAK,CAAC,KAAK;YAAE,OAAO,KAAK,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,QAAQ,CAAC;QACxE,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAClF,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,IAAI,CAAC,IAAY,EAAE,MAAqB;IAC/C,OAAO,CACL,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,CACjG,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,IAAY,EAAE,QAAgB;IAClD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACzC,IAAI,MAAM,CAAC,MAAM,IAAI,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3C,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAChC,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAE,GAAG,IAAI,CAAC,KAAK,IAAI;QAAE,GAAG,EAAE,CAAC;IACxD,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,YAAY,CAAC,IAAY,EAAE,MAAqB;IACvD,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC9C,OAAO,UAAU,CAAC,qBAAqB;QACrC,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC;QACrC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,MAAqB;IAC9D,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC;YACvB,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE;YAC5B,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC5D,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7C,IAAI,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACtE,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QAC7D,IAAI,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC;YAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IACvF,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC;IAC7E,OAAO,EAAE,IAAI,EAAE,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAC1F,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC/B,OAAO,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACtD,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC/B,OAAO,MAAM;QACX,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE;QACpE,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AACjC,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,GAAiB,EACjB,MAAc,EACd,OAAgB;IAEhB,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,QAAQ,CAC7B,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,SAAS,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,SAAS,EAAE,CAAC,EACzE,OAAO,CACR,CAAC;IACF,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,OAAO,SAAS,CAAC;IAC/B,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;IAC9E,OAAO,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAC7C,CAAC;AAED,SAAS,gBAAgB,CACvB,OAAuB,EACvB,UAAkB,EAClB,SAA6B;IAE7B,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM;QACzB,CAAC,CAAC,0BAA0B,UAAU,CAAC,UAAU,CAAC,sGAAsG;QACxJ,CAAC,CAAC,oBAAoB,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;IACjD,MAAM,IAAI,GAAG,SAAS;QACpB,CAAC,CAAC,gBAAgB,SAAS,qDAAqD;QAChF,CAAC,CAAC,oCAAoC,CAAC;IACzC,OAAO,kCAAkC,IAAI,KAAK,IAAI,+CAA+C,CAAC;AACxG,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAqB,EACrB,GAAiB,EACjB,OAAgB;IAEhB,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACpD,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAC3F,CAAC;IACF,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAwB,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;IACpF,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAyB,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;IACvF,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7D,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,IAAI,IAAI,sBAAsB,CAAC,CAAC;IACxF,CAAC;IACD,IAAI,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;IAClF,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IACtD,MAAM,SAAS,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChE,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,SAAS,CAAC,CAAC;IACzF,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,OAAO,MAAM,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC;QAC5E,OAAO,EAAE,SAAS;KACnB,CAAC;AACJ,CAAC","sourcesContent":["import { randomBytes } from \"node:crypto\";\nimport type { ImageContent, TextContent } from \"@earendil-works/pi-ai\";\nimport {\n DEFAULT_MAX_BYTES,\n DEFAULT_MAX_LINES,\n formatSize,\n truncateHead,\n type AgentToolResult,\n type Context,\n type ExecutionEnv,\n} from \"@earendil-works/pi-agent-core\";\nimport { redactSecrets } from \"./tools/secret-redaction.js\";\nimport { isRecord } from \"../unknown-values.js\";\n\nexport interface McpTextLimits {\n maxBytes: number;\n maxLines: number;\n}\n\nexport interface BoundedMcpText {\n text: string;\n truncated: boolean;\n digest?: true;\n}\n\nexport interface McpCallResult {\n content?: unknown;\n structuredContent?: unknown;\n isError?: boolean;\n}\n\nconst SPILL_DIR = [\".mikan\", \"mcp-output\"];\nconst NOTICE_RESERVE_BYTES = 640;\nconst NOTICE_RESERVE_LINES = 4;\nconst RESULT_LIMITS: McpTextLimits = {\n maxBytes: DEFAULT_MAX_BYTES - NOTICE_RESERVE_BYTES,\n maxLines: DEFAULT_MAX_LINES - NOTICE_RESERVE_LINES,\n};\n\ninterface DigestLevel {\n stringChars: number;\n arrayItems: number;\n depth: number;\n}\n\nconst DIGEST_LEVELS: readonly DigestLevel[] = [\n { stringChars: 200, arrayItems: 3, depth: 6 },\n { stringChars: 80, arrayItems: 2, depth: 4 },\n { stringChars: 40, arrayItems: 1, depth: 3 },\n { stringChars: 16, arrayItems: 1, depth: 2 },\n];\n\ntype RawBlock = Record<string, unknown>;\n\nfunction isRawBlock(value: unknown): value is RawBlock {\n return isRecord(value);\n}\n\nfunction stringField(block: RawBlock, key: string): string | undefined {\n const value = block[key];\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction describeResource(resource: RawBlock): string {\n const uri = stringField(resource, \"uri\") ?? \"(no URI)\";\n const text = stringField(resource, \"text\");\n if (text !== undefined) return `[Resource: ${uri}]\\n${text}`;\n const blob = stringField(resource, \"blob\");\n const mimeType = stringField(resource, \"mimeType\") ?? \"unknown type\";\n const size = blob === undefined ? \"no content\" : `${Buffer.byteLength(blob, \"base64\")} bytes`;\n return `[Resource: ${uri} (${mimeType}, ${size}, binary content omitted)]`;\n}\n\nfunction blockContent(block: RawBlock): TextContent | ImageContent {\n const text = stringField(block, \"text\");\n if (block.type === \"text\" && text !== undefined) return { type: \"text\", text };\n const data = stringField(block, \"data\");\n const mimeType = stringField(block, \"mimeType\");\n if (block.type === \"image\" && data !== undefined && mimeType !== undefined) {\n return { type: \"image\", data, mimeType };\n }\n if (block.type === \"resource\" && isRawBlock(block.resource)) {\n return { type: \"text\", text: describeResource(block.resource) };\n }\n if (block.type === \"resource_link\") {\n const uri = stringField(block, \"uri\") ?? \"(no URI)\";\n return { type: \"text\", text: `[Resource link: ${stringField(block, \"name\") ?? uri}] ${uri}` };\n }\n if (block.type === \"audio\") {\n return { type: \"text\", text: `[Audio content omitted: ${mimeType ?? \"audio/*\"}]` };\n }\n return { type: \"text\", text: JSON.stringify(block) };\n}\n\nexport function mcpResultContent(result: McpCallResult): (TextContent | ImageContent)[] {\n const blocks = (Array.isArray(result.content) ? result.content : [])\n .filter(isRawBlock)\n .map(blockContent);\n if (blocks.length > 0) return blocks;\n if (result.structuredContent !== undefined && result.structuredContent !== null) {\n return [{ type: \"text\", text: JSON.stringify(result.structuredContent) }];\n }\n return [{ type: \"text\", text: \"(empty result)\" }];\n}\n\nfunction parseJson(text: string): { value: unknown } | undefined {\n const trimmed = text.trimStart();\n if (!trimmed.startsWith(\"{\") && !trimmed.startsWith(\"[\")) return undefined;\n try {\n return { value: JSON.parse(text) };\n } catch {\n return undefined;\n }\n}\n\nfunction digest(value: unknown, level: DigestLevel, depth = 0): unknown {\n if (typeof value === \"string\") {\n return value.length <= level.stringChars\n ? value\n : `${value.slice(0, level.stringChars)}…[+${value.length - level.stringChars} chars]`;\n }\n if (Array.isArray(value)) {\n if (depth >= level.depth) return `[…${value.length} items]`;\n const kept = value.slice(0, level.arrayItems).map((item) => digest(item, level, depth + 1));\n const hidden = value.length - kept.length;\n return hidden > 0 ? [...kept, `…[+${hidden} more items]`] : kept;\n }\n if (isRawBlock(value)) {\n if (depth >= level.depth) return `{…${Object.keys(value).length} keys}`;\n return Object.fromEntries(\n Object.entries(value).map(([key, item]) => [key, digest(item, level, depth + 1)]),\n );\n }\n return value;\n}\n\nfunction fits(text: string, limits: McpTextLimits): boolean {\n return (\n Buffer.byteLength(text, \"utf8\") <= limits.maxBytes && text.split(\"\\n\").length <= limits.maxLines\n );\n}\n\nfunction sliceToBytes(text: string, maxBytes: number): string {\n const buffer = Buffer.from(text, \"utf8\");\n if (buffer.length <= maxBytes) return text;\n let end = Math.max(0, maxBytes);\n while (end > 0 && (buffer[end]! & 0xc0) === 0x80) end--;\n return buffer.subarray(0, end).toString(\"utf8\");\n}\n\nfunction headTruncate(text: string, limits: McpTextLimits): string {\n const truncation = truncateHead(text, limits);\n return truncation.firstLineExceedsLimit\n ? sliceToBytes(text, limits.maxBytes)\n : truncation.content;\n}\n\nexport function boundMcpText(text: string, limits: McpTextLimits): BoundedMcpText {\n const parsed = parseJson(text);\n if (!parsed) {\n return fits(text, limits)\n ? { text, truncated: false }\n : { text: headTruncate(text, limits), truncated: true };\n }\n const compact = JSON.stringify(parsed.value);\n if (fits(compact, limits)) return { text: compact, truncated: false };\n for (const level of DIGEST_LEVELS) {\n const digested = JSON.stringify(digest(parsed.value, level));\n if (fits(digested, limits)) return { text: digested, truncated: true, digest: true };\n }\n const smallest = JSON.stringify(digest(parsed.value, DIGEST_LEVELS.at(-1)!));\n return { text: sliceToBytes(smallest, limits.maxBytes), truncated: true, digest: true };\n}\n\nfunction compactMcpText(text: string): string {\n const parsed = parseJson(text);\n return parsed ? JSON.stringify(parsed.value) : text;\n}\n\nfunction readableSpill(text: string): { text: string; extension: \"json\" | \"txt\" } {\n const parsed = parseJson(text);\n return parsed\n ? { text: JSON.stringify(parsed.value, null, 2), extension: \"json\" }\n : { text, extension: \"txt\" };\n}\n\nasync function spillFullResult(\n env: ExecutionEnv,\n result: string,\n context: Context,\n): Promise<string | undefined> {\n const { text, extension } = readableSpill(result);\n const path = await env.joinPath(\n [env.cwd, ...SPILL_DIR, `${randomBytes(8).toString(\"hex\")}.${extension}`],\n context,\n );\n if (!path.ok) return undefined;\n const written = await env.writeFile(path.value, redactSecrets(text), context);\n return written.ok ? path.value : undefined;\n}\n\nfunction truncationNotice(\n bounded: BoundedMcpText,\n totalBytes: number,\n spillPath: string | undefined,\n): string {\n const view = bounded.digest\n ? `an abbreviated view of ${formatSize(totalBytes)}: long strings, arrays, and deep nesting are shortened; keys, counts, and pagination fields are kept`\n : `the beginning of ${formatSize(totalBytes)}`;\n const full = spillPath\n ? `Full result: ${spillPath} — use read with offset/limit or grep to inspect it`\n : \"The full result could not be saved\";\n return `[MCP result truncated: showing ${view}. ${full}, or re-query with filters or smaller pages.]`;\n}\n\nexport async function guardMcpToolResult(\n result: McpCallResult,\n env: ExecutionEnv,\n context: Context,\n): Promise<AgentToolResult<undefined>> {\n const blocks = mcpResultContent(result).map((block) =>\n block.type === \"text\" ? Object.assign(block, { text: compactMcpText(block.text) }) : block,\n );\n const texts = blocks.filter((block): block is TextContent => block.type === \"text\");\n const images = blocks.filter((block): block is ImageContent => block.type === \"image\");\n const combined = texts.map((block) => block.text).join(\"\\n\");\n if (result.isError) {\n throw new Error(boundMcpText(combined, RESULT_LIMITS).text || \"MCP tool call failed\");\n }\n if (fits(combined, RESULT_LIMITS)) return { content: blocks, details: undefined };\n const bounded = boundMcpText(combined, RESULT_LIMITS);\n const spillPath = await spillFullResult(env, combined, context);\n const notice = truncationNotice(bounded, Buffer.byteLength(combined, \"utf8\"), spillPath);\n return {\n content: [{ type: \"text\", text: `${bounded.text}\\n\\n${notice}` }, ...images],\n details: undefined,\n };\n}\n"]}
@@ -0,0 +1,17 @@
1
+ import type { McpPreset, McpServerConfig, McpServerInstruction, McpToolsResult } from "./types.js";
2
+ export declare function isValidMcpServerName(name: string): boolean;
3
+ export type StandardMcpParseResult = {
4
+ servers: Record<string, McpServerConfig>;
5
+ error?: undefined;
6
+ } | {
7
+ servers?: undefined;
8
+ error: string;
9
+ };
10
+ export declare function parseStandardMcpServers(text: string): StandardMcpParseResult;
11
+ export declare function redactMcpUrl(url: string): string;
12
+ export declare function listMcpPresets(): readonly McpPreset[];
13
+ export declare function findMcpPreset(id: string): McpPreset | undefined;
14
+ export declare function materializeMcpPreset(preset: McpPreset, values: Record<string, string>): McpServerConfig;
15
+ export declare function formatMcpServerInstructions(instructions: McpServerInstruction[]): string;
16
+ export declare function loadMcpTools(servers: Record<string, McpServerConfig>, signal?: AbortSignal): Promise<McpToolsResult>;
17
+ //# sourceMappingURL=mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/harness/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,eAAe,EAEf,oBAAoB,EACpB,cAAc,EACf,MAAM,YAAY,CAAC;AAgBpB,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED,MAAM,MAAM,sBAAsB,GAC9B;IAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAAC,KAAK,CAAC,EAAE,SAAS,CAAA;CAAE,GAC/D;IAAE,OAAO,CAAC,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3C,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,sBAAsB,CAwC5E;AAMD,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAOhD;AAmCD,wBAAgB,cAAc,IAAI,SAAS,SAAS,EAAE,CAErD;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAE/D;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7B,eAAe,CA2BjB;AAuED,wBAAgB,2BAA2B,CAAC,YAAY,EAAE,oBAAoB,EAAE,GAAG,MAAM,CAOxF;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,EACxC,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,cAAc,CAAC,CA2CzB"}