@capybara-hq/kernel 0.0.0-stage → 0.1.0-rc.1

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 (637) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +2 -0
  3. package/README.md +20 -2
  4. package/bootstrap.json +26 -0
  5. package/dist/admin/admin.controller.d.ts +139 -0
  6. package/dist/admin/admin.controller.js +238 -0
  7. package/dist/admin/extensions.controller.d.ts +100 -0
  8. package/dist/admin/extensions.controller.js +226 -0
  9. package/dist/admin/setup.controller.d.ts +36 -0
  10. package/dist/admin/setup.controller.js +106 -0
  11. package/dist/admin/setup.service.d.ts +47 -0
  12. package/dist/admin/setup.service.js +90 -0
  13. package/dist/agents/agents.controller.d.ts +205 -0
  14. package/dist/agents/agents.controller.js +144 -0
  15. package/dist/agents/agents.service.d.ts +177 -0
  16. package/dist/agents/agents.service.js +677 -0
  17. package/dist/agents/definition.d.ts +198 -0
  18. package/dist/agents/definition.js +152 -0
  19. package/dist/agents/models.controller.d.ts +13 -0
  20. package/dist/agents/models.controller.js +31 -0
  21. package/dist/agents/templates.controller.d.ts +15 -0
  22. package/dist/agents/templates.controller.js +37 -0
  23. package/dist/agents/templates.d.ts +83 -0
  24. package/dist/agents/templates.js +173 -0
  25. package/dist/catalog/admin-catalog.controller.d.ts +143 -0
  26. package/dist/catalog/admin-catalog.controller.js +245 -0
  27. package/dist/catalog/catalog.service.d.ts +430 -0
  28. package/dist/catalog/catalog.service.js +882 -0
  29. package/dist/catalog/claude/agents.d.ts +27 -0
  30. package/dist/catalog/claude/agents.js +270 -0
  31. package/dist/catalog/claude/commands.d.ts +50 -0
  32. package/dist/catalog/claude/commands.js +179 -0
  33. package/dist/catalog/claude/manifest.d.ts +69 -0
  34. package/dist/catalog/claude/manifest.js +134 -0
  35. package/dist/catalog/claude/marketplace.d.ts +35 -0
  36. package/dist/catalog/claude/marketplace.js +194 -0
  37. package/dist/catalog/claude/mcp.d.ts +33 -0
  38. package/dist/catalog/claude/mcp.js +226 -0
  39. package/dist/catalog/claude/report.d.ts +86 -0
  40. package/dist/catalog/claude/report.js +121 -0
  41. package/dist/catalog/claude/translate.d.ts +56 -0
  42. package/dist/catalog/claude/translate.js +857 -0
  43. package/dist/catalog/cli.d.ts +46 -0
  44. package/dist/catalog/cli.js +211 -0
  45. package/dist/catalog/git-source.d.ts +127 -0
  46. package/dist/catalog/git-source.js +520 -0
  47. package/dist/catalog/marketplace-fetch.d.ts +99 -0
  48. package/dist/catalog/marketplace-fetch.js +203 -0
  49. package/dist/catalog/marketplaces.controller.d.ts +97 -0
  50. package/dist/catalog/marketplaces.controller.js +197 -0
  51. package/dist/catalog/marketplaces.service.d.ts +340 -0
  52. package/dist/catalog/marketplaces.service.js +1217 -0
  53. package/dist/catalog/org-catalog.controller.d.ts +128 -0
  54. package/dist/catalog/org-catalog.controller.js +277 -0
  55. package/dist/catalog/org-catalog.service.d.ts +246 -0
  56. package/dist/catalog/org-catalog.service.js +625 -0
  57. package/dist/catalog/plugin-import.d.ts +436 -0
  58. package/dist/catalog/plugin-import.js +1069 -0
  59. package/dist/catalog/plugin-install.d.ts +447 -0
  60. package/dist/catalog/plugin-install.js +1333 -0
  61. package/dist/catalog/plugin-package.d.ts +143 -0
  62. package/dist/catalog/plugin-package.js +382 -0
  63. package/dist/catalog/plugin-upgrade.d.ts +222 -0
  64. package/dist/catalog/plugin-upgrade.js +1219 -0
  65. package/dist/catalog/requests.service.d.ts +162 -0
  66. package/dist/catalog/requests.service.js +504 -0
  67. package/dist/catalog/schema-path.d.ts +7 -0
  68. package/dist/catalog/schema-path.js +63 -0
  69. package/dist/catalog/upgrade-targets.d.ts +59 -0
  70. package/dist/catalog/upgrade-targets.js +90 -0
  71. package/dist/catalog/versions.d.ts +31 -0
  72. package/dist/catalog/versions.js +44 -0
  73. package/dist/channels/actions.d.ts +37 -0
  74. package/dist/channels/actions.js +121 -0
  75. package/dist/channels/cards.d.ts +44 -0
  76. package/dist/channels/cards.js +156 -0
  77. package/dist/channels/connections.controller.d.ts +59 -0
  78. package/dist/channels/connections.controller.js +115 -0
  79. package/dist/channels/connections.service.d.ts +187 -0
  80. package/dist/channels/connections.service.js +534 -0
  81. package/dist/channels/features.d.ts +12 -0
  82. package/dist/channels/features.js +22 -0
  83. package/dist/channels/inbound.d.ts +120 -0
  84. package/dist/channels/inbound.js +332 -0
  85. package/dist/channels/outbound.d.ts +140 -0
  86. package/dist/channels/outbound.js +1126 -0
  87. package/dist/channels/phrases.d.ts +100 -0
  88. package/dist/channels/phrases.js +81 -0
  89. package/dist/channels/supervisor.d.ts +182 -0
  90. package/dist/channels/supervisor.js +625 -0
  91. package/dist/channels/threads.d.ts +29 -0
  92. package/dist/channels/threads.js +104 -0
  93. package/dist/channels/webhook-url.d.ts +16 -0
  94. package/dist/channels/webhook-url.js +34 -0
  95. package/dist/channels/webhook.controller.d.ts +19 -0
  96. package/dist/channels/webhook.controller.js +72 -0
  97. package/dist/channels/webhook.d.ts +73 -0
  98. package/dist/channels/webhook.js +274 -0
  99. package/dist/config/docs.d.ts +9 -0
  100. package/dist/config/docs.js +85 -0
  101. package/dist/config/env.d.ts +6 -0
  102. package/dist/config/env.js +73 -0
  103. package/dist/config/fields.d.ts +42 -0
  104. package/dist/config/fields.js +214 -0
  105. package/dist/config/file-source.d.ts +3 -0
  106. package/dist/config/file-source.js +31 -0
  107. package/dist/config/load.d.ts +20 -0
  108. package/dist/config/load.js +98 -0
  109. package/dist/config/nacos-source.d.ts +31 -0
  110. package/dist/config/nacos-source.js +229 -0
  111. package/dist/config/schema.d.ts +237 -0
  112. package/dist/config/schema.js +1192 -0
  113. package/dist/config/sources.d.ts +18 -0
  114. package/dist/config/sources.js +59 -0
  115. package/dist/config/types.d.ts +9 -0
  116. package/dist/config/types.js +7 -0
  117. package/dist/conversations/artifacts.d.ts +52 -0
  118. package/dist/conversations/artifacts.js +137 -0
  119. package/dist/conversations/attachments.controller.d.ts +28 -0
  120. package/dist/conversations/attachments.controller.js +96 -0
  121. package/dist/conversations/attachments.service.d.ts +180 -0
  122. package/dist/conversations/attachments.service.js +578 -0
  123. package/dist/conversations/conversations.controller.d.ts +288 -0
  124. package/dist/conversations/conversations.controller.js +607 -0
  125. package/dist/conversations/conversations.service.d.ts +321 -0
  126. package/dist/conversations/conversations.service.js +754 -0
  127. package/dist/conversations/event-log.d.ts +122 -0
  128. package/dist/conversations/event-log.js +259 -0
  129. package/dist/conversations/events.d.ts +856 -0
  130. package/dist/conversations/events.js +639 -0
  131. package/dist/conversations/files.d.ts +92 -0
  132. package/dist/conversations/files.js +213 -0
  133. package/dist/conversations/outputs-read.d.ts +34 -0
  134. package/dist/conversations/outputs-read.js +37 -0
  135. package/dist/conversations/queue.d.ts +169 -0
  136. package/dist/conversations/queue.js +527 -0
  137. package/dist/conversations/sandbox-status.d.ts +21 -0
  138. package/dist/conversations/sandbox-status.js +24 -0
  139. package/dist/conversations/selection.d.ts +46 -0
  140. package/dist/conversations/selection.js +75 -0
  141. package/dist/conversations/titles.d.ts +93 -0
  142. package/dist/conversations/titles.js +423 -0
  143. package/dist/ctx/bus.d.ts +16 -0
  144. package/dist/ctx/bus.js +101 -0
  145. package/dist/ctx/create-ctx.d.ts +109 -0
  146. package/dist/ctx/create-ctx.js +592 -0
  147. package/dist/ctx/kv.d.ts +4 -0
  148. package/dist/ctx/kv.js +31 -0
  149. package/dist/ctx/lock.d.ts +4 -0
  150. package/dist/ctx/lock.js +39 -0
  151. package/dist/ctx/namespace.d.ts +6 -0
  152. package/dist/ctx/namespace.js +12 -0
  153. package/dist/ctx/queue.d.ts +25 -0
  154. package/dist/ctx/queue.js +151 -0
  155. package/dist/ctx/secrets.d.ts +45 -0
  156. package/dist/ctx/secrets.js +175 -0
  157. package/dist/db/kernel-schema.d.ts +1122 -0
  158. package/dist/db/kernel-schema.js +5 -0
  159. package/dist/db/migrator.d.ts +28 -0
  160. package/dist/db/migrator.js +140 -0
  161. package/dist/db/pool.d.ts +21 -0
  162. package/dist/db/pool.js +28 -0
  163. package/dist/db/sql-statements.d.ts +34 -0
  164. package/dist/db/sql-statements.js +168 -0
  165. package/dist/errors.d.ts +211 -0
  166. package/dist/errors.js +213 -0
  167. package/dist/evals/budget.d.ts +61 -0
  168. package/dist/evals/budget.js +181 -0
  169. package/dist/evals/diff.d.ts +55 -0
  170. package/dist/evals/diff.js +133 -0
  171. package/dist/evals/judge.d.ts +53 -0
  172. package/dist/evals/judge.js +149 -0
  173. package/dist/evals/plan.d.ts +47 -0
  174. package/dist/evals/plan.js +77 -0
  175. package/dist/evals/reconstruct.d.ts +137 -0
  176. package/dist/evals/reconstruct.js +322 -0
  177. package/dist/evals/recorded-tools.d.ts +54 -0
  178. package/dist/evals/recorded-tools.js +167 -0
  179. package/dist/evals/run-replay.d.ts +86 -0
  180. package/dist/evals/run-replay.js +502 -0
  181. package/dist/evals/runs.controller.d.ts +100 -0
  182. package/dist/evals/runs.controller.js +199 -0
  183. package/dist/evals/runs.service.d.ts +275 -0
  184. package/dist/evals/runs.service.js +836 -0
  185. package/dist/evals/sets.controller.d.ts +61 -0
  186. package/dist/evals/sets.controller.js +183 -0
  187. package/dist/evals/sets.service.d.ts +128 -0
  188. package/dist/evals/sets.service.js +558 -0
  189. package/dist/evals/snapshot.d.ts +76 -0
  190. package/dist/evals/snapshot.js +207 -0
  191. package/dist/evals/step-replay.d.ts +113 -0
  192. package/dist/evals/step-replay.js +181 -0
  193. package/dist/evals/trajectory.controller.d.ts +41 -0
  194. package/dist/evals/trajectory.controller.js +88 -0
  195. package/dist/evals/trajectory.d.ts +144 -0
  196. package/dist/evals/trajectory.js +338 -0
  197. package/dist/evals/trajectory.service.d.ts +108 -0
  198. package/dist/evals/trajectory.service.js +323 -0
  199. package/dist/evals/worker.d.ts +101 -0
  200. package/dist/evals/worker.js +790 -0
  201. package/dist/extensions/admin-ops.d.ts +105 -0
  202. package/dist/extensions/admin-ops.js +353 -0
  203. package/dist/extensions/admin-view.d.ts +79 -0
  204. package/dist/extensions/admin-view.js +327 -0
  205. package/dist/extensions/approvals.d.ts +119 -0
  206. package/dist/extensions/approvals.js +205 -0
  207. package/dist/extensions/blobs.d.ts +45 -0
  208. package/dist/extensions/blobs.js +160 -0
  209. package/dist/extensions/bootstrap.d.ts +176 -0
  210. package/dist/extensions/bootstrap.js +535 -0
  211. package/dist/extensions/cli.d.ts +61 -0
  212. package/dist/extensions/cli.js +165 -0
  213. package/dist/extensions/config-json-schema.d.ts +9 -0
  214. package/dist/extensions/config-json-schema.js +73 -0
  215. package/dist/extensions/deployment-config.d.ts +138 -0
  216. package/dist/extensions/deployment-config.js +394 -0
  217. package/dist/extensions/enabled.d.ts +31 -0
  218. package/dist/extensions/enabled.js +55 -0
  219. package/dist/extensions/hooks.d.ts +161 -0
  220. package/dist/extensions/hooks.js +425 -0
  221. package/dist/extensions/host.d.ts +577 -0
  222. package/dist/extensions/host.js +2071 -0
  223. package/dist/extensions/inflight.d.ts +69 -0
  224. package/dist/extensions/inflight.js +277 -0
  225. package/dist/extensions/installs.d.ts +166 -0
  226. package/dist/extensions/installs.js +253 -0
  227. package/dist/extensions/instance.d.ts +167 -0
  228. package/dist/extensions/instance.js +329 -0
  229. package/dist/extensions/ledger.d.ts +30 -0
  230. package/dist/extensions/ledger.js +50 -0
  231. package/dist/extensions/lifecycle.d.ts +80 -0
  232. package/dist/extensions/lifecycle.js +152 -0
  233. package/dist/extensions/migrate-lock.d.ts +51 -0
  234. package/dist/extensions/migrate-lock.js +100 -0
  235. package/dist/extensions/org-config.controller.d.ts +24 -0
  236. package/dist/extensions/org-config.controller.js +59 -0
  237. package/dist/extensions/org-config.d.ts +169 -0
  238. package/dist/extensions/org-config.js +520 -0
  239. package/dist/extensions/package.d.ts +115 -0
  240. package/dist/extensions/package.js +246 -0
  241. package/dist/extensions/permission-set.d.ts +117 -0
  242. package/dist/extensions/permission-set.js +184 -0
  243. package/dist/extensions/permission-view.d.ts +194 -0
  244. package/dist/extensions/permission-view.js +284 -0
  245. package/dist/extensions/registry.d.ts +24 -0
  246. package/dist/extensions/registry.js +56 -0
  247. package/dist/extensions/resolve.d.ts +12 -0
  248. package/dist/extensions/resolve.js +71 -0
  249. package/dist/extensions/sources.d.ts +69 -0
  250. package/dist/extensions/sources.js +120 -0
  251. package/dist/extensions/sync.d.ts +40 -0
  252. package/dist/extensions/sync.js +242 -0
  253. package/dist/files/previewers.controller.d.ts +46 -0
  254. package/dist/files/previewers.controller.js +105 -0
  255. package/dist/files/previewers.d.ts +100 -0
  256. package/dist/files/previewers.js +250 -0
  257. package/dist/http/api.module.d.ts +114 -0
  258. package/dist/http/api.module.js +448 -0
  259. package/dist/http/app.d.ts +77 -0
  260. package/dist/http/app.js +220 -0
  261. package/dist/http/error.filter.d.ts +21 -0
  262. package/dist/http/error.filter.js +85 -0
  263. package/dist/http/gateway.module.d.ts +15 -0
  264. package/dist/http/gateway.module.js +13 -0
  265. package/dist/http/health.controller.d.ts +26 -0
  266. package/dist/http/health.controller.js +79 -0
  267. package/dist/http/nest-logger.d.ts +20 -0
  268. package/dist/http/nest-logger.js +28 -0
  269. package/dist/http/plugin-dispatch.d.ts +68 -0
  270. package/dist/http/plugin-dispatch.js +200 -0
  271. package/dist/http/tokens.d.ts +131 -0
  272. package/dist/http/tokens.js +131 -0
  273. package/dist/http/zod.pipe.d.ts +8 -0
  274. package/dist/http/zod.pipe.js +14 -0
  275. package/dist/identity/accounts.d.ts +93 -0
  276. package/dist/identity/accounts.js +367 -0
  277. package/dist/identity/api-tokens.d.ts +73 -0
  278. package/dist/identity/api-tokens.js +197 -0
  279. package/dist/identity/audit.d.ts +23 -0
  280. package/dist/identity/audit.js +41 -0
  281. package/dist/identity/auth.controller.d.ts +40 -0
  282. package/dist/identity/auth.controller.js +130 -0
  283. package/dist/identity/auth.guard.d.ts +41 -0
  284. package/dist/identity/auth.guard.js +162 -0
  285. package/dist/identity/binding.d.ts +47 -0
  286. package/dist/identity/binding.js +84 -0
  287. package/dist/identity/cookies.d.ts +16 -0
  288. package/dist/identity/cookies.js +32 -0
  289. package/dist/identity/credential-check.d.ts +17 -0
  290. package/dist/identity/credential-check.js +24 -0
  291. package/dist/identity/enterprise-admin.d.ts +14 -0
  292. package/dist/identity/enterprise-admin.js +27 -0
  293. package/dist/identity/external.d.ts +106 -0
  294. package/dist/identity/external.js +337 -0
  295. package/dist/identity/hash.d.ts +2 -0
  296. package/dist/identity/hash.js +3 -0
  297. package/dist/identity/login.d.ts +6 -0
  298. package/dist/identity/login.js +20 -0
  299. package/dist/identity/me.controller.d.ts +61 -0
  300. package/dist/identity/me.controller.js +159 -0
  301. package/dist/identity/passwords.d.ts +6 -0
  302. package/dist/identity/passwords.js +37 -0
  303. package/dist/identity/principal.d.ts +56 -0
  304. package/dist/identity/principal.js +38 -0
  305. package/dist/identity/rate-limit.d.ts +55 -0
  306. package/dist/identity/rate-limit.js +121 -0
  307. package/dist/identity/sessions.d.ts +84 -0
  308. package/dist/identity/sessions.js +306 -0
  309. package/dist/identity/settings.d.ts +121 -0
  310. package/dist/identity/settings.js +248 -0
  311. package/dist/identity/sso.controller.d.ts +59 -0
  312. package/dist/identity/sso.controller.js +192 -0
  313. package/dist/identity/sso.d.ts +83 -0
  314. package/dist/identity/sso.js +202 -0
  315. package/dist/inbox/inbox.service.d.ts +43 -0
  316. package/dist/inbox/inbox.service.js +57 -0
  317. package/dist/index.d.ts +69 -0
  318. package/dist/index.js +67 -0
  319. package/dist/kernel.d.ts +259 -0
  320. package/dist/kernel.js +1326 -0
  321. package/dist/log-config.d.ts +9 -0
  322. package/dist/log-config.js +27 -0
  323. package/dist/log-context.d.ts +32 -0
  324. package/dist/log-context.js +40 -0
  325. package/dist/log-loki.d.ts +34 -0
  326. package/dist/log-loki.js +145 -0
  327. package/dist/log.d.ts +79 -0
  328. package/dist/log.js +303 -0
  329. package/dist/models/prices.d.ts +53 -0
  330. package/dist/models/prices.js +121 -0
  331. package/dist/models/purposes.controller.d.ts +19 -0
  332. package/dist/models/purposes.controller.js +56 -0
  333. package/dist/models/purposes.d.ts +140 -0
  334. package/dist/models/purposes.js +267 -0
  335. package/dist/net/proxy.d.ts +44 -0
  336. package/dist/net/proxy.js +162 -0
  337. package/dist/net/public-address.d.ts +60 -0
  338. package/dist/net/public-address.js +272 -0
  339. package/dist/net/safe-fetch.d.ts +38 -0
  340. package/dist/net/safe-fetch.js +140 -0
  341. package/dist/orgs/directory-sync.controller.d.ts +14 -0
  342. package/dist/orgs/directory-sync.controller.js +40 -0
  343. package/dist/orgs/directory-sync.d.ts +166 -0
  344. package/dist/orgs/directory-sync.js +558 -0
  345. package/dist/orgs/invitations.controller.d.ts +58 -0
  346. package/dist/orgs/invitations.controller.js +137 -0
  347. package/dist/orgs/invitations.service.d.ts +80 -0
  348. package/dist/orgs/invitations.service.js +217 -0
  349. package/dist/orgs/members.service.d.ts +63 -0
  350. package/dist/orgs/members.service.js +234 -0
  351. package/dist/orgs/offboarding.d.ts +141 -0
  352. package/dist/orgs/offboarding.js +398 -0
  353. package/dist/orgs/org-lock.d.ts +32 -0
  354. package/dist/orgs/org-lock.js +46 -0
  355. package/dist/orgs/org.guard.d.ts +35 -0
  356. package/dist/orgs/org.guard.js +95 -0
  357. package/dist/orgs/orgs.controller.d.ts +78 -0
  358. package/dist/orgs/orgs.controller.js +192 -0
  359. package/dist/orgs/orgs.service.d.ts +61 -0
  360. package/dist/orgs/orgs.service.js +209 -0
  361. package/dist/orgs/roles.d.ts +13 -0
  362. package/dist/orgs/roles.js +58 -0
  363. package/dist/orgs/settings.controller.d.ts +20 -0
  364. package/dist/orgs/settings.controller.js +53 -0
  365. package/dist/orgs/settings.service.d.ts +120 -0
  366. package/dist/orgs/settings.service.js +178 -0
  367. package/dist/packages/npm.d.ts +50 -0
  368. package/dist/packages/npm.js +218 -0
  369. package/dist/packages/provenance.d.ts +47 -0
  370. package/dist/packages/provenance.js +147 -0
  371. package/dist/packages/tgz.d.ts +76 -0
  372. package/dist/packages/tgz.js +225 -0
  373. package/dist/runtime/abort.d.ts +32 -0
  374. package/dist/runtime/abort.js +71 -0
  375. package/dist/runtime/checkpointer.d.ts +32 -0
  376. package/dist/runtime/checkpointer.js +243 -0
  377. package/dist/runtime/context/build.d.ts +254 -0
  378. package/dist/runtime/context/build.js +693 -0
  379. package/dist/runtime/context/claude-tools.d.ts +11 -0
  380. package/dist/runtime/context/claude-tools.js +24 -0
  381. package/dist/runtime/context/compaction.d.ts +26 -0
  382. package/dist/runtime/context/compaction.js +195 -0
  383. package/dist/runtime/context/pairing.d.ts +11 -0
  384. package/dist/runtime/context/pairing.js +82 -0
  385. package/dist/runtime/context/reminders.d.ts +5 -0
  386. package/dist/runtime/context/reminders.js +11 -0
  387. package/dist/runtime/context/skills.d.ts +105 -0
  388. package/dist/runtime/context/skills.js +283 -0
  389. package/dist/runtime/context/tokens.d.ts +19 -0
  390. package/dist/runtime/context/tokens.js +104 -0
  391. package/dist/runtime/conversation-lock.d.ts +40 -0
  392. package/dist/runtime/conversation-lock.js +97 -0
  393. package/dist/runtime/hook-calls.d.ts +84 -0
  394. package/dist/runtime/hook-calls.js +136 -0
  395. package/dist/runtime/langgraph-loop.d.ts +52 -0
  396. package/dist/runtime/langgraph-loop.js +247 -0
  397. package/dist/runtime/loop.d.ts +93 -0
  398. package/dist/runtime/loop.js +7 -0
  399. package/dist/runtime/maintenance.d.ts +80 -0
  400. package/dist/runtime/maintenance.js +148 -0
  401. package/dist/runtime/media-cache.d.ts +21 -0
  402. package/dist/runtime/media-cache.js +51 -0
  403. package/dist/runtime/model-call.d.ts +176 -0
  404. package/dist/runtime/model-call.js +1049 -0
  405. package/dist/runtime/providers.d.ts +86 -0
  406. package/dist/runtime/providers.js +224 -0
  407. package/dist/runtime/quota.d.ts +29 -0
  408. package/dist/runtime/quota.js +70 -0
  409. package/dist/runtime/run-finish.d.ts +45 -0
  410. package/dist/runtime/run-finish.js +69 -0
  411. package/dist/runtime/run-queue.d.ts +121 -0
  412. package/dist/runtime/run-queue.js +493 -0
  413. package/dist/runtime/run-worker.d.ts +138 -0
  414. package/dist/runtime/run-worker.js +806 -0
  415. package/dist/runtime/stream.controller.d.ts +34 -0
  416. package/dist/runtime/stream.controller.js +122 -0
  417. package/dist/runtime/stream.d.ts +63 -0
  418. package/dist/runtime/stream.js +262 -0
  419. package/dist/runtime/subagents/child.d.ts +80 -0
  420. package/dist/runtime/subagents/child.js +225 -0
  421. package/dist/runtime/subagents/definition.d.ts +103 -0
  422. package/dist/runtime/subagents/definition.js +392 -0
  423. package/dist/runtime/subagents/dispatch.d.ts +69 -0
  424. package/dist/runtime/subagents/dispatch.js +502 -0
  425. package/dist/runtime/subagents/limits.d.ts +23 -0
  426. package/dist/runtime/subagents/limits.js +34 -0
  427. package/dist/runtime/subagents/org-agents.d.ts +50 -0
  428. package/dist/runtime/subagents/org-agents.js +70 -0
  429. package/dist/runtime/subagents/preamble.d.ts +7 -0
  430. package/dist/runtime/subagents/preamble.js +11 -0
  431. package/dist/runtime/subagents/progress.d.ts +26 -0
  432. package/dist/runtime/subagents/progress.js +36 -0
  433. package/dist/runtime/subagents/roster.d.ts +55 -0
  434. package/dist/runtime/subagents/roster.js +111 -0
  435. package/dist/runtime/subagents/skill-fork.d.ts +123 -0
  436. package/dist/runtime/subagents/skill-fork.js +259 -0
  437. package/dist/runtime/usage-report.d.ts +163 -0
  438. package/dist/runtime/usage-report.js +551 -0
  439. package/dist/runtime/waits.d.ts +233 -0
  440. package/dist/runtime/waits.js +883 -0
  441. package/dist/sandbox/leases.d.ts +169 -0
  442. package/dist/sandbox/leases.js +515 -0
  443. package/dist/sandbox/lifecycle.d.ts +21 -0
  444. package/dist/sandbox/lifecycle.js +68 -0
  445. package/dist/sandbox/sandbox.service.d.ts +249 -0
  446. package/dist/sandbox/sandbox.service.js +908 -0
  447. package/dist/skills/catalog.d.ts +149 -0
  448. package/dist/skills/catalog.js +405 -0
  449. package/dist/skills/changes.controller.d.ts +56 -0
  450. package/dist/skills/changes.controller.js +136 -0
  451. package/dist/skills/changes.service.d.ts +175 -0
  452. package/dist/skills/changes.service.js +805 -0
  453. package/dist/skills/invocable.controller.d.ts +23 -0
  454. package/dist/skills/invocable.controller.js +50 -0
  455. package/dist/skills/invocation-keys.d.ts +23 -0
  456. package/dist/skills/invocation-keys.js +44 -0
  457. package/dist/skills/invoke.d.ts +135 -0
  458. package/dist/skills/invoke.js +286 -0
  459. package/dist/skills/package.d.ts +87 -0
  460. package/dist/skills/package.js +227 -0
  461. package/dist/skills/skills.controller.d.ts +40 -0
  462. package/dist/skills/skills.controller.js +110 -0
  463. package/dist/skills/skills.service.d.ts +192 -0
  464. package/dist/skills/skills.service.js +567 -0
  465. package/dist/storage/prefix.d.ts +36 -0
  466. package/dist/storage/prefix.js +104 -0
  467. package/dist/storage/purge.d.ts +27 -0
  468. package/dist/storage/purge.js +75 -0
  469. package/dist/storage/storage.service.d.ts +44 -0
  470. package/dist/storage/storage.service.js +145 -0
  471. package/dist/text.d.ts +13 -0
  472. package/dist/text.js +13 -0
  473. package/dist/tools/approvals.controller.d.ts +53 -0
  474. package/dist/tools/approvals.controller.js +128 -0
  475. package/dist/tools/approvals.service.d.ts +172 -0
  476. package/dist/tools/approvals.service.js +568 -0
  477. package/dist/tools/breaker.d.ts +28 -0
  478. package/dist/tools/breaker.js +72 -0
  479. package/dist/tools/builtins/agent.d.ts +81 -0
  480. package/dist/tools/builtins/agent.js +223 -0
  481. package/dist/tools/builtins/ask-user.d.ts +28 -0
  482. package/dist/tools/builtins/ask-user.js +139 -0
  483. package/dist/tools/builtins/read-tool-output.d.ts +18 -0
  484. package/dist/tools/builtins/read-tool-output.js +108 -0
  485. package/dist/tools/builtins/sandbox/bash.d.ts +16 -0
  486. package/dist/tools/builtins/sandbox/bash.js +137 -0
  487. package/dist/tools/builtins/sandbox/common.d.ts +116 -0
  488. package/dist/tools/builtins/sandbox/common.js +306 -0
  489. package/dist/tools/builtins/sandbox/deliver.d.ts +5 -0
  490. package/dist/tools/builtins/sandbox/deliver.js +180 -0
  491. package/dist/tools/builtins/sandbox/edit.d.ts +4 -0
  492. package/dist/tools/builtins/sandbox/edit.js +98 -0
  493. package/dist/tools/builtins/sandbox/glob-match.d.ts +25 -0
  494. package/dist/tools/builtins/sandbox/glob-match.js +240 -0
  495. package/dist/tools/builtins/sandbox/glob.d.ts +4 -0
  496. package/dist/tools/builtins/sandbox/glob.js +104 -0
  497. package/dist/tools/builtins/sandbox/grep.d.ts +9 -0
  498. package/dist/tools/builtins/sandbox/grep.js +133 -0
  499. package/dist/tools/builtins/sandbox/index.d.ts +12 -0
  500. package/dist/tools/builtins/sandbox/index.js +27 -0
  501. package/dist/tools/builtins/sandbox/names.d.ts +7 -0
  502. package/dist/tools/builtins/sandbox/names.js +20 -0
  503. package/dist/tools/builtins/sandbox/read.d.ts +8 -0
  504. package/dist/tools/builtins/sandbox/read.js +121 -0
  505. package/dist/tools/builtins/sandbox/write.d.ts +4 -0
  506. package/dist/tools/builtins/sandbox/write.js +88 -0
  507. package/dist/tools/builtins/skill-load.d.ts +53 -0
  508. package/dist/tools/builtins/skill-load.js +446 -0
  509. package/dist/tools/builtins/skill-write.d.ts +59 -0
  510. package/dist/tools/builtins/skill-write.js +244 -0
  511. package/dist/tools/builtins/tool-search.d.ts +31 -0
  512. package/dist/tools/builtins/tool-search.js +171 -0
  513. package/dist/tools/connector-content.controller.d.ts +34 -0
  514. package/dist/tools/connector-content.controller.js +78 -0
  515. package/dist/tools/connector-content.d.ts +104 -0
  516. package/dist/tools/connector-content.js +267 -0
  517. package/dist/tools/connectors.controller.d.ts +210 -0
  518. package/dist/tools/connectors.controller.js +234 -0
  519. package/dist/tools/connectors.service.d.ts +303 -0
  520. package/dist/tools/connectors.service.js +1102 -0
  521. package/dist/tools/credentials.d.ts +139 -0
  522. package/dist/tools/credentials.js +351 -0
  523. package/dist/tools/drift.d.ts +141 -0
  524. package/dist/tools/drift.js +539 -0
  525. package/dist/tools/elicitation.d.ts +81 -0
  526. package/dist/tools/elicitation.js +266 -0
  527. package/dist/tools/endpoint.d.ts +18 -0
  528. package/dist/tools/endpoint.js +115 -0
  529. package/dist/tools/info.d.ts +67 -0
  530. package/dist/tools/info.js +113 -0
  531. package/dist/tools/naming.d.ts +27 -0
  532. package/dist/tools/naming.js +47 -0
  533. package/dist/tools/oauth/discovery.d.ts +65 -0
  534. package/dist/tools/oauth/discovery.js +307 -0
  535. package/dist/tools/oauth/flow.d.ts +63 -0
  536. package/dist/tools/oauth/flow.js +237 -0
  537. package/dist/tools/oauth/oauth.controller.d.ts +31 -0
  538. package/dist/tools/oauth/oauth.controller.js +95 -0
  539. package/dist/tools/oauth/tokens.d.ts +111 -0
  540. package/dist/tools/oauth/tokens.js +258 -0
  541. package/dist/tools/outputs.d.ts +61 -0
  542. package/dist/tools/outputs.js +156 -0
  543. package/dist/tools/pipeline.d.ts +322 -0
  544. package/dist/tools/pipeline.js +1236 -0
  545. package/dist/tools/policy.d.ts +60 -0
  546. package/dist/tools/policy.js +236 -0
  547. package/dist/tools/questions.controller.d.ts +24 -0
  548. package/dist/tools/questions.controller.js +58 -0
  549. package/dist/tools/questions.service.d.ts +103 -0
  550. package/dist/tools/questions.service.js +295 -0
  551. package/dist/tools/redact.d.ts +20 -0
  552. package/dist/tools/redact.js +60 -0
  553. package/dist/tools/registry.d.ts +246 -0
  554. package/dist/tools/registry.js +481 -0
  555. package/dist/tools/resources.d.ts +16 -0
  556. package/dist/tools/resources.js +76 -0
  557. package/dist/tools/specs.d.ts +14 -0
  558. package/dist/tools/specs.js +31 -0
  559. package/dist/tools/validate.d.ts +20 -0
  560. package/dist/tools/validate.js +183 -0
  561. package/dist/tools/view.d.ts +43 -0
  562. package/dist/tools/view.js +225 -0
  563. package/dist/ui/embed-token.d.ts +31 -0
  564. package/dist/ui/embed-token.js +132 -0
  565. package/dist/ui/registry.d.ts +58 -0
  566. package/dist/ui/registry.js +90 -0
  567. package/dist/ui/ui-stream.d.ts +37 -0
  568. package/dist/ui/ui-stream.js +162 -0
  569. package/dist/ui/views.controller.d.ts +81 -0
  570. package/dist/ui/views.controller.js +261 -0
  571. package/dist/ui/views.d.ts +155 -0
  572. package/dist/ui/views.js +306 -0
  573. package/dist/version.d.ts +5 -0
  574. package/dist/version.js +6 -0
  575. package/package.json +69 -3
  576. package/src/migrations/0001_init.sql +8 -0
  577. package/src/migrations/0002_secrets.sql +8 -0
  578. package/src/migrations/0003_identity.sql +117 -0
  579. package/src/migrations/0004_plugin_org_config_nullable.sql +3 -0
  580. package/src/migrations/0005_agents.sql +27 -0
  581. package/src/migrations/0006_conversations.sql +37 -0
  582. package/src/migrations/0007_checkpoints.sql +26 -0
  583. package/src/migrations/0008_runs_trigger_seq.sql +3 -0
  584. package/src/migrations/0009_runs_active_unique.sql +4 -0
  585. package/src/migrations/0010_tools.sql +125 -0
  586. package/src/migrations/0011_approvals_spec.sql +10 -0
  587. package/src/migrations/0012_run_waits.sql +24 -0
  588. package/src/migrations/0013_app_tools_source.sql +4 -0
  589. package/src/migrations/0014_tool_specs.sql +8 -0
  590. package/src/migrations/0015_tool_drift.sql +20 -0
  591. package/src/migrations/0016_plugin_permissions.sql +11 -0
  592. package/src/migrations/0017_identity_sources.sql +6 -0
  593. package/src/migrations/0018_channels.sql +74 -0
  594. package/src/migrations/0019_identity_trust.sql +17 -0
  595. package/src/migrations/0020_channel_card_lookup.sql +10 -0
  596. package/src/migrations/0021_org_storage_purge.sql +9 -0
  597. package/src/migrations/0022_attachments.sql +29 -0
  598. package/src/migrations/0023_sandboxes.sql +37 -0
  599. package/src/migrations/0024_skills.sql +46 -0
  600. package/src/migrations/0025_skills_catalog_idx.sql +6 -0
  601. package/src/migrations/0026_skill_changes.sql +34 -0
  602. package/src/migrations/0027_model_prices.sql +18 -0
  603. package/src/migrations/0028_evals.sql +105 -0
  604. package/src/migrations/0029_model_purposes.sql +18 -0
  605. package/src/migrations/0030_plugin_installs.sql +73 -0
  606. package/src/migrations/0031_plugin_snapshot_source.sql +6 -0
  607. package/src/migrations/0032_plugin_deployment_configs.sql +10 -0
  608. package/src/migrations/0033_rename_apps_to_connectors.sql +25 -0
  609. package/src/migrations/0034_directory.sql +49 -0
  610. package/src/migrations/0035_catalogs.sql +40 -0
  611. package/src/migrations/0036_app_import_staging.sql +17 -0
  612. package/src/migrations/0037_directory_installs.sql +92 -0
  613. package/src/migrations/0038_channel_inbound_mode.sql +6 -0
  614. package/src/migrations/0039_channel_card_pending.sql +8 -0
  615. package/src/migrations/0040_usage_report_sweep.sql +10 -0
  616. package/src/migrations/0041_rename_plugins_to_extensions.sql +38 -0
  617. package/src/migrations/0042_rename_directory_to_catalog.sql +80 -0
  618. package/src/migrations/0043_rename_app_installs_to_plugin_installs.sql +20 -0
  619. package/src/migrations/0044_catalog_one_kind.sql +90 -0
  620. package/src/migrations/0045_plugin_dependencies.sql +9 -0
  621. package/src/migrations/0046_git_sources.sql +25 -0
  622. package/src/migrations/0047_marketplace_entry_heads.sql +7 -0
  623. package/src/migrations/0048_marketplace_entry_trees.sql +8 -0
  624. package/src/migrations/0049_plugin_upgrades.sql +37 -0
  625. package/src/migrations/0050_bootstrap.sql +53 -0
  626. package/src/migrations/0051_claude_compat.sql +26 -0
  627. package/src/migrations/0052_conversations_account_agent_idx.sql +5 -0
  628. package/src/migrations/0053_subagents.sql +73 -0
  629. package/src/migrations/0054_subagent_wait_expiry.sql +7 -0
  630. package/src/migrations/0055_subagent_parent_indexes.sql +10 -0
  631. package/src/migrations/0056_approval_reason.sql +3 -0
  632. package/src/migrations/0057_conversation_titles.sql +11 -0
  633. package/src/migrations/0058_conversation_selection.sql +4 -0
  634. package/src/migrations/0059_conversation_queue.sql +22 -0
  635. package/src/migrations/0060_file_previewers.sql +10 -0
  636. package/src/migrations/0061_queue_selection.sql +5 -0
  637. package/src/migrations/0062_queued_skill.sql +8 -0
@@ -0,0 +1,322 @@
1
+ import { sanitizeParams, } from "@capybara-hq/plugin-sdk";
2
+ import { AgentDefinitionSchema, normalizeStoredDefinition, } from "../agents/definition.js";
3
+ import { sameModel, selectionAt } from "../conversations/selection.js";
4
+ import { ApiError } from "../errors.js";
5
+ import { mediaRefs, planMedia, } from "../runtime/context/build.js";
6
+ import { assembleModelRequest } from "../runtime/model-call.js";
7
+ import { CHILD_REMOVED_TOOLS } from "../runtime/subagents/definition.js";
8
+ import { PINNED_SKILLS_LIMITS } from "../skills/catalog.js";
9
+ import { canonicalJson } from "./recorded-tools.js";
10
+ import { toEvents } from "./snapshot.js";
11
+ const DRIFT_ORDER = [
12
+ "system_hash",
13
+ "tools_changed",
14
+ "tool_spec_missing",
15
+ "definition_missing",
16
+ "pinned_changed",
17
+ "subagent_changed",
18
+ "legacy_event",
19
+ "params_changed",
20
+ "model_switched",
21
+ "media_missing",
22
+ "media_changed",
23
+ "tool_unmatched",
24
+ ];
25
+ function findCall(events, seq) {
26
+ const call = events.find((e) => e.seq === seq && e.type === "model_call");
27
+ if (!call) {
28
+ throw new ApiError("eval.call_not_found", `No model_call event at seq ${seq} in the snapshot`);
29
+ }
30
+ return call;
31
+ }
32
+ /** 参与构建该请求的事件:运行时构建时手里的就是 seq ≤ `toSeq` 的事件(`model_call` 本身在其后写入)。 */
33
+ function inputEvents(events, call) {
34
+ const upTo = Math.min(call.payload.request.toSeq, call.seq - 1);
35
+ return events.filter((e) => e.seq <= upTo);
36
+ }
37
+ /** 该请求的 agent 版本:所属运行的 `run_started`;没有(不应出现)时用快照运行的版本。 */
38
+ function recordedVersion(s, events, call) {
39
+ const started = events.find((e) => e.type === "run_started" && e.runId === call.runId);
40
+ return started?.payload.agentVersion ?? s.agentVersion;
41
+ }
42
+ const sameParams = (a, b) => {
43
+ const ka = Object.keys(a);
44
+ return ka.length === Object.keys(b).length && ka.every((k) => Object.is(a[k], b[k]));
45
+ };
46
+ const sameList = (a, b) => (a ?? []).length === (b ?? []).length &&
47
+ (a ?? []).every((x, i) => x.key === b?.[i]?.key && x.specHash === b?.[i]?.specHash);
48
+ export function reconstructRequest(s, modelCallSeq, opts) {
49
+ const all = toEvents(s);
50
+ const call = findCall(all, modelCallSeq);
51
+ const rec = call.payload.request;
52
+ const drift = new Set();
53
+ if (rec.tools === undefined ||
54
+ rec.params === undefined ||
55
+ rec.absorbedUpToSeq === undefined ||
56
+ rec.maxOutputTokens === undefined) {
57
+ drift.add("legacy_event");
58
+ }
59
+ const origVersion = recordedVersion(s, all, call);
60
+ const version = opts.agentVersion ?? origVersion;
61
+ const started = subagentStartedOf(all);
62
+ const templateMoved = started !== undefined &&
63
+ opts.subagentTemplate !== undefined &&
64
+ !sameTemplate(started.template, opts.subagentTemplate);
65
+ const baseline = opts.definition === undefined &&
66
+ opts.params === undefined &&
67
+ version === origVersion &&
68
+ !templateMoved;
69
+ const stored = s.definitions[String(version)];
70
+ let agent;
71
+ if (started !== undefined) {
72
+ // a sub-agent's request renders the definition and preamble of its subagent_started (the
73
+ // build reads them from the events); the candidate is only compared with them
74
+ agent = normalizeStoredDefinition(s.subagent?.definition ?? started.definition);
75
+ if (!baseline) {
76
+ const sameVersion = version === origVersion;
77
+ const candidate = sameVersion
78
+ ? (opts.definition ?? agent)
79
+ : (opts.subagentVersion ??
80
+ opts.definition ??
81
+ (stored ? normalizeStoredDefinition(stored) : undefined));
82
+ const original = s.definitions[String(origVersion)];
83
+ if (templateMoved ||
84
+ // an instructions override reaches every child, whatever the version (batch 14 m5)
85
+ (!sameVersion &&
86
+ opts.definition !== undefined &&
87
+ opts.definition.instructions !== agent.instructions) ||
88
+ (candidate !== undefined &&
89
+ subagentChanged(started, agent, candidate, sameVersion, original && normalizeStoredDefinition(original)))) {
90
+ drift.add("subagent_changed");
91
+ }
92
+ }
93
+ }
94
+ else {
95
+ agent = opts.definition ?? (stored && normalizeStoredDefinition(stored));
96
+ }
97
+ if (agent === undefined) {
98
+ drift.add("definition_missing");
99
+ agent = AgentDefinitionSchema.parse({
100
+ name: "missing",
101
+ instructions: "",
102
+ model: { provider: call.payload.provider, model: call.payload.model },
103
+ });
104
+ }
105
+ // pinned_changed: the candidate pins other skills than the recorded agent version did. Compared
106
+ // with the original version's definition, not the effective snapshot (which omits stale or
107
+ // oversized pins), both deduplicated and capped like the run; the snapshot's ids only when that
108
+ // definition is missing. The stub of definition_missing has no pins, so it is skipped then.
109
+ if (!baseline && started === undefined && !drift.has("definition_missing")) {
110
+ const norm = (ids) => [...new Set(ids ?? [])].slice(0, PINNED_SKILLS_LIMITS.count);
111
+ const origDef = s.definitions[String(origVersion)];
112
+ let recorded;
113
+ if (origDef) {
114
+ recorded = norm(normalizeStoredDefinition(origDef).skills?.pinned);
115
+ }
116
+ else {
117
+ const snap = inputEvents(all, call)
118
+ .filter((e) => e.type === "skills_catalog")
119
+ .at(-1);
120
+ recorded = (snap?.payload.pinned ?? []).map((p) => p.id);
121
+ }
122
+ const wanted = norm(agent.skills?.pinned);
123
+ if (recorded.length !== wanted.length || recorded.some((id, i) => wanted[i] !== id)) {
124
+ drift.add("pinned_changed");
125
+ }
126
+ }
127
+ // 工具:按记录的顺序从快照取定义;取不到的从请求里去掉(基线与候选一样)
128
+ const tools = [];
129
+ const seen = new Set();
130
+ const kept = (list) => (list ?? []).filter((t) => s.toolSpecs[t.specHash] !== undefined);
131
+ for (const t of [...(rec.tools ?? []), ...(rec.catalog ?? [])]) {
132
+ if (seen.has(t.key))
133
+ continue;
134
+ seen.add(t.key);
135
+ const spec = s.toolSpecs[t.specHash];
136
+ if (spec === undefined) {
137
+ drift.add("tool_spec_missing");
138
+ continue;
139
+ }
140
+ tools.push({ key: t.key, spec, specHash: t.specHash });
141
+ }
142
+ // model_switched: the run used a person's switch (in effect at its run_started) and the
143
+ // candidate's model replaces it
144
+ if (!baseline && opts.modelRef !== undefined) {
145
+ const runStart = all.find((e) => e.type === "run_started" && e.runId === call.runId);
146
+ const sel = runStart ? selectionAt(all, runStart.seq) : null;
147
+ if (sel?.model && !sameModel(sel.model, opts.modelRef))
148
+ drift.add("model_switched");
149
+ }
150
+ let params = opts.params;
151
+ if (params === undefined) {
152
+ const recorded = rec.params ?? {};
153
+ const clean = sanitizeParams(opts.model.parameters, recorded);
154
+ params = clean.value;
155
+ if (clean.dropped.length > 0 || !sameParams(clean.value, recorded))
156
+ drift.add("params_changed");
157
+ }
158
+ const budget = opts.mediaBudgetBytes ?? rec.mediaBudgetBytes;
159
+ const { request, meta, mediaTokens } = assembleModelRequest({
160
+ events: inputEvents(all, call),
161
+ agent,
162
+ agentVersion: version,
163
+ model: opts.model,
164
+ step: call.payload.step,
165
+ ...(rec.absorbedUpToSeq !== undefined && { absorbedUpToSeq: rec.absorbedUpToSeq }),
166
+ params,
167
+ tools,
168
+ toolSearch: rec.catalog !== undefined,
169
+ ...(rec.toolChoice !== undefined && { toolChoice: rec.toolChoice }),
170
+ ...(opts.mediaInfo !== undefined && { mediaInfo: opts.mediaInfo }),
171
+ ...(opts.media !== undefined && { media: opts.media }),
172
+ ...(budget !== undefined && { mediaBudgetBytes: budget }),
173
+ defaultMaxOutputTokens: rec.maxOutputTokens ?? opts.model.maxOutputTokens,
174
+ });
175
+ if (baseline) {
176
+ if (meta.systemHash !== rec.systemHash)
177
+ drift.add("system_hash");
178
+ // 与记录比较时排除快照里缺定义的工具(已记 tool_spec_missing)
179
+ if (rec.tools !== undefined &&
180
+ (!sameList(meta.tools, kept(rec.tools)) ||
181
+ !sameList(meta.catalog, rec.catalog === undefined ? undefined : kept(rec.catalog)))) {
182
+ drift.add("tools_changed");
183
+ }
184
+ }
185
+ // 媒体:按附件 id 与记录比较
186
+ if (meta.media !== undefined && (rec.media === undefined || rec.mediaBudgetBytes === undefined)) {
187
+ drift.add("legacy_event");
188
+ }
189
+ const recordedMedia = new Map((rec.media ?? []).map((m) => [m.attachmentId, m]));
190
+ for (const m of meta.media ?? []) {
191
+ const was = recordedMedia.get(m.attachmentId);
192
+ if (m.outcome === "unavailable" && was?.outcome !== "unavailable") {
193
+ drift.add("media_missing");
194
+ }
195
+ else if (baseline &&
196
+ rec.media !== undefined &&
197
+ (was === undefined || was.outcome !== m.outcome || was.etag !== m.etag)) {
198
+ drift.add("media_changed");
199
+ }
200
+ }
201
+ if (baseline && rec.media !== undefined) {
202
+ const now = new Set((meta.media ?? []).map((m) => m.attachmentId));
203
+ if (rec.media.some((m) => !now.has(m.attachmentId)))
204
+ drift.add("media_changed");
205
+ }
206
+ return { request, meta, drift: DRIFT_ORDER.filter((r) => drift.has(r)), mediaTokens };
207
+ }
208
+ /** The `subagent_started` of a sub-agent's (child) log, or undefined for any other conversation. */
209
+ export function subagentStartedOf(events) {
210
+ const e = events.find((x) => x.type === "subagent_started");
211
+ return e?.type === "subagent_started" ? e.payload : undefined;
212
+ }
213
+ const sameTemplate = (logged, t) => logged.source !== "plugin" || (logged.id === t.id && logged.version === t.version);
214
+ const pinsOf = (d) => [...new Set(d.skills?.pinned ?? [])].slice(0, PINNED_SKILLS_LIMITS.count);
215
+ /** Tool refs as a sub-agent gets them without template narrowing (general and org agents). */
216
+ const childToolsOf = (d) => canonicalJson(d.tools.filter((t) => t.kind !== "builtin" || !CHILD_REMOVED_TOOLS.includes(t.name)));
217
+ /** The parent's selection a template child depends on: its tools, org skills and roster entry. */
218
+ const parentSide = (d, started) => canonicalJson({
219
+ tools: d.tools,
220
+ orgSkills: d.skills?.orgSkills ?? [],
221
+ listed: started.template.source === "general"
222
+ ? d.subagents?.general !== false
223
+ : (d.subagents?.templates ?? []).includes(started.template.id ?? ""),
224
+ });
225
+ /**
226
+ * Does a candidate change what a sub-agent (child) case would run (`subagent_changed`, spec
227
+ * §15.1)? Pure, from the snapshot alone, comparing the model-visible parts of the effective
228
+ * definition (instructions, pinned skills, tools) with the logged one (`logged`, from its
229
+ * `subagent_started`):
230
+ * - the same agent version (`sameVersion`): the candidate is the logged definition with
231
+ * overrides (instructions, model, params), compared field by field;
232
+ * - another version of the case's agent: for an org agent child (`source: "agent"`) that agent's
233
+ * version, as dispatch would use it (its own tools minus the child-removed ones); otherwise the
234
+ * parent's version: `general` takes its instructions and tools and pins nothing, `inline` its
235
+ * template of the same name (gone = changed), and a `plugin` template does not depend on the
236
+ * parent version (its own version is {@link ReconstructOptions.subagentTemplate}). Template
237
+ * narrowing that needs the database (inline and plugin tool allowlists, skill names) is not
238
+ * recomputed: those compare instructions only.
239
+ * Models and params are not part of it: they are candidate axes of their own.
240
+ */
241
+ export function subagentChanged(started, logged, candidate, sameVersion,
242
+ /** The parent's definition at the case's version (the snapshot's), for template children. */
243
+ original) {
244
+ const differs = (instructions, pinned, tools) => instructions !== logged.instructions ||
245
+ (pinned !== null && canonicalJson(pinned) !== canonicalJson(pinsOf(logged))) ||
246
+ (tools !== null && tools !== childToolsOf(logged));
247
+ if (sameVersion) {
248
+ return differs(candidate.instructions, pinsOf(candidate), canonicalJson(candidate.tools));
249
+ }
250
+ switch (started.template.source) {
251
+ case "agent":
252
+ return differs(candidate.instructions, pinsOf(candidate), childToolsOf(candidate));
253
+ case "general":
254
+ return (differs(candidate.instructions, [], childToolsOf(candidate)) ||
255
+ (original !== undefined && parentSide(original, started) !== parentSide(candidate, started)));
256
+ case "inline": {
257
+ const t = candidate.subagents?.inline?.find((x) => x.name === started.agentType);
258
+ if (!t)
259
+ return true;
260
+ // conservative: any difference of the template between the two versions counts
261
+ const o = original?.subagents?.inline?.find((x) => x.name === started.agentType);
262
+ if (o !== undefined)
263
+ return canonicalJson(o) !== canonicalJson(t);
264
+ return differs(t.instructions ?? candidate.instructions, null, null);
265
+ }
266
+ case "plugin":
267
+ return (original !== undefined && parentSide(original, started) !== parentSide(candidate, started));
268
+ }
269
+ }
270
+ /**
271
+ * `subagent_changed` for a whole child case (full-run replay): the candidate (`definition` at
272
+ * `agentVersion`, plus a plugin template's current version) against the case's logged sub-agent.
273
+ * False for any other case and for an unchanged candidate.
274
+ */
275
+ export function subagentCaseChanged(s, c) {
276
+ const started = subagentStartedOf(toEvents(s));
277
+ if (started === undefined || !c.changed)
278
+ return false;
279
+ if (c.subagentTemplate !== undefined && !sameTemplate(started.template, c.subagentTemplate)) {
280
+ return true;
281
+ }
282
+ const logged = normalizeStoredDefinition(s.subagent?.definition ?? started.definition);
283
+ const sameVersion = c.agentVersion === s.agentVersion;
284
+ const candidate = sameVersion ? c.definition : (c.subagentVersion ?? c.definition);
285
+ // an instructions override reaches every child, whatever the version (batch 14 m5): the
286
+ // rendered definition is the logged one with the candidate's instructions
287
+ if (!sameVersion && c.definition.instructions !== logged.instructions)
288
+ return true;
289
+ const original = s.definitions[String(s.agentVersion)];
290
+ return subagentChanged(started, logged, candidate, sameVersion, original && normalizeStoredDefinition(original));
291
+ }
292
+ /** 还原该请求要查的附件 id(该模型用得到的引用,去重、按出现顺序;见 `mediaRefs`)。 */
293
+ export function snapshotMediaRefs(s, modelCallSeq, model) {
294
+ const all = toEvents(s);
295
+ return mediaRefs(inputEvents(all, findCall(all, modelCallSeq)), model);
296
+ }
297
+ /**
298
+ * 按快照自己的 `orgId` / `conversationId` 取还原该请求要用的附件(C3:媒体不进快照,回放时取原附件):
299
+ * 先查行信息,按 `planMedia`(与运行时同一规则;预算缺省用记录的 `mediaBudgetBytes`)只取要发字节的,
300
+ * `text/*` 只取开头。结果直接作 {@link ReconstructOptions} 的 `mediaInfo` / `media`。
301
+ * 原对话或附件已删除 → 行不在结果里,还原时按「不再可用」占位(drift 记 `media_missing`);
302
+ * 暂时故障(存储不可用)由来源抛出,调用方按可重试处理。
303
+ */
304
+ export async function loadSnapshotMedia(s, modelCallSeq, model, source, mediaBudgetBytes) {
305
+ const all = toEvents(s);
306
+ const call = findCall(all, modelCallSeq);
307
+ const events = inputEvents(all, call);
308
+ const refs = mediaRefs(events, model);
309
+ const media = new Map();
310
+ if (refs.length === 0)
311
+ return { mediaInfo: new Map(), media };
312
+ const mediaInfo = await source.info(s.orgId, s.conversationId, refs);
313
+ const budget = mediaBudgetBytes ?? call.payload.request.mediaBudgetBytes;
314
+ const plan = planMedia(events, model, mediaInfo, budget);
315
+ if (plan.fetch.length > 0) {
316
+ const caps = new Map(plan.fetch.flatMap((id) => (plan.caps.has(id) ? [[id, plan.caps.get(id)]] : [])));
317
+ const got = await source.fetch(s.orgId, s.conversationId, plan.fetch, caps.size > 0 ? caps : undefined);
318
+ for (const id of plan.fetch)
319
+ media.set(id, got.get(id) ?? null);
320
+ }
321
+ return { mediaInfo, media };
322
+ }
@@ -0,0 +1,54 @@
1
+ import type { EventLog } from "../conversations/event-log.js";
2
+ import { type ToolPipeline, type ToolStepContext } from "../tools/pipeline.js";
3
+ import type { CaseSnapshot } from "./snapshot.js";
4
+ /**
5
+ * 整轮回放的工具管线(C6 / Review Focus 3):只回放原运行记录的工具结果,**从不执行任何工具**——
6
+ * 不经过策略、审批、沙箱、连接器,也不调用任何处理函数。每个调用按 (toolKey, 规范化参数) 精确匹配第一条未用的记录;
7
+ * 匹配不上时写英文错误结果 {@link REPLAY_NO_RECORDING}(`isError: true`),什么都不执行。
8
+ */
9
+ /** 没有匹配记录时模型看到的工具结果(模型可见,英文)。 */
10
+ export declare const REPLAY_NO_RECORDING = "[replay] No recorded result matches this tool call (same tool and arguments); the tool was not executed during replay.";
11
+ /** 原运行里一次有结果的工具调用。 */
12
+ export interface RecordedCall {
13
+ toolKey: string;
14
+ /** 参数的规范化 JSON(对象键递归排序,见 {@link canonicalJson};不含 {@link matchKey} 忽略的字段)。 */
15
+ inputKey: string;
16
+ content: string;
17
+ isError: boolean;
18
+ /** 原结果里的 `tool_search` 已加载工具(照抄:之后请求的已加载集合由日志还原)。 */
19
+ loadedTools?: string[];
20
+ contentTypes?: string[];
21
+ /** 原 `tool_call_started` 的定义指纹(没有开始事件的调用为空串)。 */
22
+ specHash: string;
23
+ }
24
+ /** 规范化 JSON:对象键递归按码点排序,数组保持顺序;`undefined` 按 JSON 规则省略。 */
25
+ export declare function canonicalJson(v: unknown): string;
26
+ /** The matching key of a call: the canonical JSON of its input without the ignored fields. */
27
+ export declare function matchKey(toolKey: string, input: unknown): string;
28
+ /**
29
+ * 快照运行里有结果的工具调用,按调用出现的顺序(assistant 消息的 seq、块的顺序)。
30
+ * 没有 `tool_result` 的调用(运行中止等)不算记录。
31
+ */
32
+ export declare function recordedCalls(s: CaseSnapshot): RecordedCall[];
33
+ export interface RecordedToolPipelineDeps {
34
+ eventLog: EventLog;
35
+ recordings: RecordedCall[];
36
+ /**
37
+ * 每步处理工具调用之前调用(运行仍在执行、仍持有认领等):返回 `stop` 时本步尚无结果的调用写
38
+ * {@link RUN_STOPPED_TEXT}(保持「调用都有结果」),调用方负责让 loop 停下(中止信号)。
39
+ */
40
+ beforeStep(step: number): Promise<"continue" | "stop">;
41
+ }
42
+ export declare class RecordedToolPipeline implements Pick<ToolPipeline, "runStep"> {
43
+ private readonly d;
44
+ private readonly used;
45
+ private misses;
46
+ constructor(d: RecordedToolPipelineDeps);
47
+ /** 至今没有匹配到记录的调用数。 */
48
+ unmatched(): number;
49
+ runStep(ctx: ToolStepContext): Promise<{
50
+ kind: "done";
51
+ }>;
52
+ /** 第一条未用、且工具与参数都相同的记录。 */
53
+ private take;
54
+ }
@@ -0,0 +1,167 @@
1
+ import { assistantIdemKey } from "../runtime/model-call.js";
2
+ import { RUN_STOPPED_TEXT } from "../tools/pipeline.js";
3
+ /**
4
+ * 整轮回放的工具管线(C6 / Review Focus 3):只回放原运行记录的工具结果,**从不执行任何工具**——
5
+ * 不经过策略、审批、沙箱、连接器,也不调用任何处理函数。每个调用按 (toolKey, 规范化参数) 精确匹配第一条未用的记录;
6
+ * 匹配不上时写英文错误结果 {@link REPLAY_NO_RECORDING}(`isError: true`),什么都不执行。
7
+ */
8
+ /** 没有匹配记录时模型看到的工具结果(模型可见,英文)。 */
9
+ export const REPLAY_NO_RECORDING = "[replay] No recorded result matches this tool call (same tool and arguments); the tool was not executed during replay.";
10
+ /** 规范化 JSON:对象键递归按码点排序,数组保持顺序;`undefined` 按 JSON 规则省略。 */
11
+ export function canonicalJson(v) {
12
+ const norm = (x) => {
13
+ if (Array.isArray(x))
14
+ return x.map(norm);
15
+ if (x !== null && typeof x === "object") {
16
+ const o = x;
17
+ const out = {};
18
+ for (const k of Object.keys(o).sort())
19
+ out[k] = norm(o[k]);
20
+ return out;
21
+ }
22
+ return x;
23
+ };
24
+ return JSON.stringify(norm(v) ?? null);
25
+ }
26
+ /**
27
+ * Input fields left out when matching, per tool: display-only arguments the model writes that do not
28
+ * change what the tool does. `sandbox_bash`'s `description` became required in UI refresh B, so a
29
+ * recording without it and a replayed call with one (or a different wording) still match.
30
+ */
31
+ const MATCH_IGNORED_FIELDS = {
32
+ sandbox_bash: ["description"],
33
+ };
34
+ /** The matching key of a call: the canonical JSON of its input without the ignored fields. */
35
+ export function matchKey(toolKey, input) {
36
+ const ignored = MATCH_IGNORED_FIELDS[toolKey];
37
+ if (ignored === undefined ||
38
+ input === null ||
39
+ typeof input !== "object" ||
40
+ Array.isArray(input)) {
41
+ return canonicalJson(input);
42
+ }
43
+ const rest = { ...input };
44
+ for (const f of ignored)
45
+ delete rest[f];
46
+ return canonicalJson(rest);
47
+ }
48
+ /**
49
+ * 快照运行里有结果的工具调用,按调用出现的顺序(assistant 消息的 seq、块的顺序)。
50
+ * 没有 `tool_result` 的调用(运行中止等)不算记录。
51
+ */
52
+ export function recordedCalls(s) {
53
+ const own = s.events.filter((e) => e.runId === s.runId);
54
+ const results = new Map();
55
+ const started = new Map();
56
+ for (const e of own) {
57
+ if (e.type === "tool_result") {
58
+ const p = e.payload;
59
+ results.set(p.callId, p);
60
+ }
61
+ else if (e.type === "tool_call_started") {
62
+ const p = e.payload;
63
+ if (!started.has(p.callId))
64
+ started.set(p.callId, p.specHash);
65
+ }
66
+ }
67
+ const out = [];
68
+ for (const e of own) {
69
+ if (e.type !== "assistant_message")
70
+ continue;
71
+ const content = e.payload.content;
72
+ for (const b of content) {
73
+ if (b.type !== "tool_call")
74
+ continue;
75
+ const call = b;
76
+ const r = results.get(call.id);
77
+ if (!r)
78
+ continue;
79
+ out.push({
80
+ toolKey: call.name,
81
+ inputKey: matchKey(call.name, call.input),
82
+ content: r.content,
83
+ isError: r.isError,
84
+ ...(r.loadedTools !== undefined && { loadedTools: r.loadedTools }),
85
+ ...(r.contentTypes !== undefined && { contentTypes: r.contentTypes }),
86
+ specHash: started.get(call.id) ?? "",
87
+ });
88
+ }
89
+ }
90
+ return out;
91
+ }
92
+ /** 与真实管线相同的幂等键(同一调用重入时不重复写)。 */
93
+ const idem = {
94
+ started: (runId, callId) => `tool_started:${runId}:${callId}`,
95
+ result: (runId, callId) => `tool_result:${runId}:${callId}`,
96
+ };
97
+ export class RecordedToolPipeline {
98
+ d;
99
+ used = new Set();
100
+ misses = 0;
101
+ constructor(d) {
102
+ this.d = d;
103
+ }
104
+ /** 至今没有匹配到记录的调用数。 */
105
+ unmatched() {
106
+ return this.misses;
107
+ }
108
+ async runStep(ctx) {
109
+ const { eventLog } = this.d;
110
+ const msg = await eventLog.findByIdem(ctx.conversationId, assistantIdemKey(ctx.runId, ctx.step));
111
+ if (msg?.type !== "assistant_message")
112
+ return { kind: "done" };
113
+ const calls = msg.payload.content.flatMap((b) => b.type === "tool_call" ? [{ id: b.id, name: b.name, input: b.input }] : []);
114
+ if (calls.length === 0)
115
+ return { kind: "done" };
116
+ const stop = (await this.d.beforeStep(ctx.step)) === "stop";
117
+ for (const call of calls) {
118
+ if (await eventLog.findByIdem(ctx.conversationId, idem.result(ctx.runId, call.id)))
119
+ continue;
120
+ const result = (p) => ({
121
+ type: "tool_result",
122
+ runId: ctx.runId,
123
+ idemKey: idem.result(ctx.runId, call.id),
124
+ payload: { step: ctx.step, callId: call.id, toolKey: call.name, ...p },
125
+ });
126
+ if (stop) {
127
+ await eventLog.append(ctx.conversationId, [
128
+ result({ content: RUN_STOPPED_TEXT, isError: true }),
129
+ ]);
130
+ continue;
131
+ }
132
+ const rec = this.take(call.name, matchKey(call.name, call.input));
133
+ if (!rec)
134
+ this.misses++;
135
+ await eventLog.append(ctx.conversationId, [
136
+ {
137
+ type: "tool_call_started",
138
+ runId: ctx.runId,
139
+ idemKey: idem.started(ctx.runId, call.id),
140
+ payload: {
141
+ step: ctx.step,
142
+ callId: call.id,
143
+ toolKey: call.name,
144
+ specHash: rec?.specHash ?? "",
145
+ },
146
+ },
147
+ result(rec
148
+ ? {
149
+ content: rec.content,
150
+ isError: rec.isError,
151
+ ...(rec.loadedTools !== undefined && { loadedTools: rec.loadedTools }),
152
+ ...(rec.contentTypes !== undefined && { contentTypes: rec.contentTypes }),
153
+ }
154
+ : { content: REPLAY_NO_RECORDING, isError: true }),
155
+ ]);
156
+ }
157
+ return { kind: "done" };
158
+ }
159
+ /** 第一条未用、且工具与参数都相同的记录。 */
160
+ take(toolKey, inputKey) {
161
+ const i = this.d.recordings.findIndex((r, j) => !this.used.has(j) && r.toolKey === toolKey && r.inputKey === inputKey);
162
+ if (i < 0)
163
+ return undefined;
164
+ this.used.add(i);
165
+ return this.d.recordings[i];
166
+ }
167
+ }
@@ -0,0 +1,86 @@
1
+ import { type ContentBlock, type Logger, type ModelUsage, type StopReason } from "@capybara-hq/plugin-sdk";
2
+ import type { KernelConfig } from "../config/schema.js";
3
+ import type { EventLog } from "../conversations/event-log.js";
4
+ import type { KernelDb } from "../db/kernel-schema.js";
5
+ import type { KyselyCheckpointSaver } from "../runtime/checkpointer.js";
6
+ import type { LoopDeps } from "../runtime/langgraph-loop.js";
7
+ import type { AgentLoop, LoopOutcome } from "../runtime/loop.js";
8
+ import { type MediaSourceDeps } from "../runtime/model-call.js";
9
+ import type { ProviderRegistry } from "../runtime/providers.js";
10
+ import type { CaseSnapshot } from "./snapshot.js";
11
+ import type { ResolvedCandidate } from "./step-replay.js";
12
+ /**
13
+ * 整轮回放(D2 / C6):在 `kind = 'eval'` 的隐藏对话里跑**同一个** `LangGraphLoop`,工具管线换成
14
+ * {@link RecordedToolPipeline}(只回放记录的结果,不执行任何工具、沙箱、连接器或审批)。
15
+ *
16
+ * - 种子:原运行 `run_started` 之前的事件按原 seq 插入(`last_seq` 停在其前一位,新的 `run_started` 因此与原来同 seq),
17
+ * 原运行开始时的 `skills_catalog` 照抄;然后写 `runs` 行与 `run_started`,`agent` 用候选定义。
18
+ * - 插话:原运行中途吸收的 user_message,在「原吸收步骤 ≤ 当前步骤」时追加进评测对话并交给 loop。
19
+ * - 计费(C7,与单步回放同一套):每次模型请求(含压缩、重试、兜底)发出前查运行仍在执行、仍持有认领;
20
+ * 收完按真实用量、没收完按估算 `consumeTokens`(越限即 `capped`,下一次请求前停下)。
21
+ * - 附件按快照自己的组织与原对话取(C3)。
22
+ * 崩溃后由调用方删掉旧的评测对话({@link deleteEvalConversation}),从头重跑。
23
+ */
24
+ export interface RunReplayResult {
25
+ conversationId: string;
26
+ outcome: LoopOutcome["kind"];
27
+ toolCalls: {
28
+ name: string;
29
+ input: unknown;
30
+ }[];
31
+ finalContent: ContentBlock[];
32
+ stopReason: StopReason | null;
33
+ usage: ModelUsage;
34
+ steps: number;
35
+ unmatched: number;
36
+ }
37
+ /** 原运行(基线)的同形摘要。 */
38
+ export type RunBaseline = Omit<RunReplayResult, "conversationId" | "outcome" | "unmatched">;
39
+ /** 测试钩子。 */
40
+ export interface EvalReplayHooks {
41
+ /** 种子已写入(评测对话已记到结果上)、loop 开始之前调用:抛错即模拟此时崩溃。 */
42
+ afterRunSeeded?(evalRunId: string, conversationId: string): Promise<void>;
43
+ /** 每次请求前的检查(查运行状态与认领)之前调用:抛错即模拟检查时的 DB 故障。 */
44
+ beforeCheck?(evalRunId: string): Promise<void>;
45
+ /** 每次计费(`consumeTokens`)之前调用:抛错即模拟计费时的 DB 故障。 */
46
+ beforeCharge?(evalRunId: string): Promise<void>;
47
+ /** 删除评测对话之前调用:抛错即模拟删除时的 DB 故障。 */
48
+ beforeDeleteConversation?(conversationId: string): Promise<void>;
49
+ /** 每次评委请求之前调用(worker):抛错即模拟「结果已 done、评委未做」时崩溃。 */
50
+ beforeJudge?(evalRunId: string): Promise<void>;
51
+ }
52
+ export interface RunReplayDeps {
53
+ db: KernelDb;
54
+ eventLog: EventLog;
55
+ config: () => KernelConfig;
56
+ log: Logger;
57
+ registry: Pick<ProviderRegistry, "resolve">;
58
+ media?: MediaSourceDeps;
59
+ checkpoints?: Pick<KyselyCheckpointSaver, "deleteThread">;
60
+ /**
61
+ * 构建评测用的 loop:与运行时同一个 `LangGraphLoop`(同一工厂),只换掉工具管线、模型注册表(计费)与附件来源。
62
+ */
63
+ loop(d: Pick<LoopDeps, "toolPipeline" | "registry" | "media" | "skillForks">): AgentLoop;
64
+ /** 本次执行是否仍持有结果的认领(失去认领 → 不再发请求);不给 = 不检查。 */
65
+ stillClaimed?: () => Promise<boolean>;
66
+ /**
67
+ * 种子事务内调用:把评测对话记到结果上(以认领为条件)。返回 false = 已失去认领,种子回滚、抛 {@link ReplayClaimLost}。
68
+ */
69
+ onSeeded?: (trx: KernelDb, conversationId: string) => Promise<boolean>;
70
+ hooks?: EvalReplayHooks;
71
+ }
72
+ /** 写种子时发现已失去认领或运行已不在执行:本次执行停下,不留评测对话。 */
73
+ export declare class ReplayClaimLost extends Error {
74
+ constructor();
75
+ }
76
+ /** 整轮回放被停下的原因(`run_aborted.detail`)。 */
77
+ export type StopDetail = "cancelled" | "capped" | "too_many_errors" | "claim_lost" | "shutdown";
78
+ /** 原运行(快照)的摘要,作为整轮回放的基线。 */
79
+ export declare function runBaseline(s: CaseSnapshot): RunBaseline;
80
+ /**
81
+ * 删掉一个评测对话(崩溃重跑前清掉上一次的残留):先删它各次运行的 checkpoint,再删对话(事件、运行随之级联删除)。
82
+ * 只删 `kind = 'eval'` 的对话。
83
+ */
84
+ export declare function deleteEvalConversation(d: Pick<RunReplayDeps, "db" | "checkpoints" | "hooks">, conversationId: string): Promise<void>;
85
+ /** 整轮回放一个用例。见文件头注释。 */
86
+ export declare function replayRun(d: RunReplayDeps, s: CaseSnapshot, candidate: ResolvedCandidate, evalRunId: string, signal: AbortSignal): Promise<RunReplayResult>;