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

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 (631) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +2 -0
  3. package/README.md +20 -2
  4. package/bootstrap.json +22 -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 +1125 -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 +223 -0
  112. package/dist/config/schema.js +1151 -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 +422 -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 +150 -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 +210 -0
  166. package/dist/errors.js +212 -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 +789 -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 +149 -0
  210. package/dist/extensions/bootstrap.js +441 -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 +170 -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 +67 -0
  318. package/dist/index.js +65 -0
  319. package/dist/kernel.d.ts +256 -0
  320. package/dist/kernel.js +1326 -0
  321. package/dist/log.d.ts +48 -0
  322. package/dist/log.js +229 -0
  323. package/dist/models/prices.d.ts +53 -0
  324. package/dist/models/prices.js +121 -0
  325. package/dist/models/purposes.controller.d.ts +19 -0
  326. package/dist/models/purposes.controller.js +56 -0
  327. package/dist/models/purposes.d.ts +140 -0
  328. package/dist/models/purposes.js +267 -0
  329. package/dist/net/proxy.d.ts +44 -0
  330. package/dist/net/proxy.js +162 -0
  331. package/dist/net/public-address.d.ts +60 -0
  332. package/dist/net/public-address.js +271 -0
  333. package/dist/net/safe-fetch.d.ts +38 -0
  334. package/dist/net/safe-fetch.js +140 -0
  335. package/dist/orgs/directory-sync.controller.d.ts +14 -0
  336. package/dist/orgs/directory-sync.controller.js +40 -0
  337. package/dist/orgs/directory-sync.d.ts +166 -0
  338. package/dist/orgs/directory-sync.js +558 -0
  339. package/dist/orgs/invitations.controller.d.ts +58 -0
  340. package/dist/orgs/invitations.controller.js +137 -0
  341. package/dist/orgs/invitations.service.d.ts +80 -0
  342. package/dist/orgs/invitations.service.js +217 -0
  343. package/dist/orgs/members.service.d.ts +63 -0
  344. package/dist/orgs/members.service.js +234 -0
  345. package/dist/orgs/offboarding.d.ts +141 -0
  346. package/dist/orgs/offboarding.js +398 -0
  347. package/dist/orgs/org-lock.d.ts +32 -0
  348. package/dist/orgs/org-lock.js +46 -0
  349. package/dist/orgs/org.guard.d.ts +35 -0
  350. package/dist/orgs/org.guard.js +95 -0
  351. package/dist/orgs/orgs.controller.d.ts +78 -0
  352. package/dist/orgs/orgs.controller.js +192 -0
  353. package/dist/orgs/orgs.service.d.ts +61 -0
  354. package/dist/orgs/orgs.service.js +209 -0
  355. package/dist/orgs/roles.d.ts +13 -0
  356. package/dist/orgs/roles.js +58 -0
  357. package/dist/orgs/settings.controller.d.ts +20 -0
  358. package/dist/orgs/settings.controller.js +53 -0
  359. package/dist/orgs/settings.service.d.ts +120 -0
  360. package/dist/orgs/settings.service.js +178 -0
  361. package/dist/packages/npm.d.ts +50 -0
  362. package/dist/packages/npm.js +218 -0
  363. package/dist/packages/provenance.d.ts +47 -0
  364. package/dist/packages/provenance.js +147 -0
  365. package/dist/packages/tgz.d.ts +76 -0
  366. package/dist/packages/tgz.js +225 -0
  367. package/dist/runtime/abort.d.ts +32 -0
  368. package/dist/runtime/abort.js +71 -0
  369. package/dist/runtime/checkpointer.d.ts +32 -0
  370. package/dist/runtime/checkpointer.js +243 -0
  371. package/dist/runtime/context/build.d.ts +254 -0
  372. package/dist/runtime/context/build.js +693 -0
  373. package/dist/runtime/context/claude-tools.d.ts +11 -0
  374. package/dist/runtime/context/claude-tools.js +24 -0
  375. package/dist/runtime/context/compaction.d.ts +26 -0
  376. package/dist/runtime/context/compaction.js +195 -0
  377. package/dist/runtime/context/pairing.d.ts +11 -0
  378. package/dist/runtime/context/pairing.js +82 -0
  379. package/dist/runtime/context/reminders.d.ts +5 -0
  380. package/dist/runtime/context/reminders.js +11 -0
  381. package/dist/runtime/context/skills.d.ts +105 -0
  382. package/dist/runtime/context/skills.js +283 -0
  383. package/dist/runtime/context/tokens.d.ts +19 -0
  384. package/dist/runtime/context/tokens.js +104 -0
  385. package/dist/runtime/conversation-lock.d.ts +40 -0
  386. package/dist/runtime/conversation-lock.js +97 -0
  387. package/dist/runtime/hook-calls.d.ts +84 -0
  388. package/dist/runtime/hook-calls.js +136 -0
  389. package/dist/runtime/langgraph-loop.d.ts +52 -0
  390. package/dist/runtime/langgraph-loop.js +247 -0
  391. package/dist/runtime/loop.d.ts +93 -0
  392. package/dist/runtime/loop.js +7 -0
  393. package/dist/runtime/maintenance.d.ts +80 -0
  394. package/dist/runtime/maintenance.js +147 -0
  395. package/dist/runtime/media-cache.d.ts +21 -0
  396. package/dist/runtime/media-cache.js +51 -0
  397. package/dist/runtime/model-call.d.ts +176 -0
  398. package/dist/runtime/model-call.js +1049 -0
  399. package/dist/runtime/providers.d.ts +86 -0
  400. package/dist/runtime/providers.js +224 -0
  401. package/dist/runtime/quota.d.ts +29 -0
  402. package/dist/runtime/quota.js +70 -0
  403. package/dist/runtime/run-finish.d.ts +45 -0
  404. package/dist/runtime/run-finish.js +69 -0
  405. package/dist/runtime/run-queue.d.ts +121 -0
  406. package/dist/runtime/run-queue.js +493 -0
  407. package/dist/runtime/run-worker.d.ts +138 -0
  408. package/dist/runtime/run-worker.js +805 -0
  409. package/dist/runtime/stream.controller.d.ts +34 -0
  410. package/dist/runtime/stream.controller.js +122 -0
  411. package/dist/runtime/stream.d.ts +63 -0
  412. package/dist/runtime/stream.js +262 -0
  413. package/dist/runtime/subagents/child.d.ts +80 -0
  414. package/dist/runtime/subagents/child.js +225 -0
  415. package/dist/runtime/subagents/definition.d.ts +103 -0
  416. package/dist/runtime/subagents/definition.js +392 -0
  417. package/dist/runtime/subagents/dispatch.d.ts +69 -0
  418. package/dist/runtime/subagents/dispatch.js +502 -0
  419. package/dist/runtime/subagents/limits.d.ts +23 -0
  420. package/dist/runtime/subagents/limits.js +34 -0
  421. package/dist/runtime/subagents/org-agents.d.ts +50 -0
  422. package/dist/runtime/subagents/org-agents.js +70 -0
  423. package/dist/runtime/subagents/preamble.d.ts +7 -0
  424. package/dist/runtime/subagents/preamble.js +11 -0
  425. package/dist/runtime/subagents/progress.d.ts +26 -0
  426. package/dist/runtime/subagents/progress.js +36 -0
  427. package/dist/runtime/subagents/roster.d.ts +55 -0
  428. package/dist/runtime/subagents/roster.js +111 -0
  429. package/dist/runtime/subagents/skill-fork.d.ts +123 -0
  430. package/dist/runtime/subagents/skill-fork.js +259 -0
  431. package/dist/runtime/usage-report.d.ts +163 -0
  432. package/dist/runtime/usage-report.js +550 -0
  433. package/dist/runtime/waits.d.ts +233 -0
  434. package/dist/runtime/waits.js +883 -0
  435. package/dist/sandbox/leases.d.ts +169 -0
  436. package/dist/sandbox/leases.js +515 -0
  437. package/dist/sandbox/lifecycle.d.ts +21 -0
  438. package/dist/sandbox/lifecycle.js +68 -0
  439. package/dist/sandbox/sandbox.service.d.ts +249 -0
  440. package/dist/sandbox/sandbox.service.js +908 -0
  441. package/dist/skills/catalog.d.ts +149 -0
  442. package/dist/skills/catalog.js +405 -0
  443. package/dist/skills/changes.controller.d.ts +56 -0
  444. package/dist/skills/changes.controller.js +136 -0
  445. package/dist/skills/changes.service.d.ts +175 -0
  446. package/dist/skills/changes.service.js +805 -0
  447. package/dist/skills/invocable.controller.d.ts +23 -0
  448. package/dist/skills/invocable.controller.js +50 -0
  449. package/dist/skills/invocation-keys.d.ts +23 -0
  450. package/dist/skills/invocation-keys.js +44 -0
  451. package/dist/skills/invoke.d.ts +135 -0
  452. package/dist/skills/invoke.js +286 -0
  453. package/dist/skills/package.d.ts +87 -0
  454. package/dist/skills/package.js +227 -0
  455. package/dist/skills/skills.controller.d.ts +40 -0
  456. package/dist/skills/skills.controller.js +110 -0
  457. package/dist/skills/skills.service.d.ts +192 -0
  458. package/dist/skills/skills.service.js +567 -0
  459. package/dist/storage/prefix.d.ts +36 -0
  460. package/dist/storage/prefix.js +104 -0
  461. package/dist/storage/purge.d.ts +27 -0
  462. package/dist/storage/purge.js +75 -0
  463. package/dist/storage/storage.service.d.ts +44 -0
  464. package/dist/storage/storage.service.js +145 -0
  465. package/dist/text.d.ts +13 -0
  466. package/dist/text.js +13 -0
  467. package/dist/tools/approvals.controller.d.ts +53 -0
  468. package/dist/tools/approvals.controller.js +128 -0
  469. package/dist/tools/approvals.service.d.ts +172 -0
  470. package/dist/tools/approvals.service.js +568 -0
  471. package/dist/tools/breaker.d.ts +28 -0
  472. package/dist/tools/breaker.js +72 -0
  473. package/dist/tools/builtins/agent.d.ts +81 -0
  474. package/dist/tools/builtins/agent.js +223 -0
  475. package/dist/tools/builtins/ask-user.d.ts +28 -0
  476. package/dist/tools/builtins/ask-user.js +139 -0
  477. package/dist/tools/builtins/read-tool-output.d.ts +18 -0
  478. package/dist/tools/builtins/read-tool-output.js +108 -0
  479. package/dist/tools/builtins/sandbox/bash.d.ts +16 -0
  480. package/dist/tools/builtins/sandbox/bash.js +137 -0
  481. package/dist/tools/builtins/sandbox/common.d.ts +114 -0
  482. package/dist/tools/builtins/sandbox/common.js +304 -0
  483. package/dist/tools/builtins/sandbox/deliver.d.ts +5 -0
  484. package/dist/tools/builtins/sandbox/deliver.js +180 -0
  485. package/dist/tools/builtins/sandbox/edit.d.ts +4 -0
  486. package/dist/tools/builtins/sandbox/edit.js +98 -0
  487. package/dist/tools/builtins/sandbox/glob-match.d.ts +25 -0
  488. package/dist/tools/builtins/sandbox/glob-match.js +240 -0
  489. package/dist/tools/builtins/sandbox/glob.d.ts +4 -0
  490. package/dist/tools/builtins/sandbox/glob.js +104 -0
  491. package/dist/tools/builtins/sandbox/grep.d.ts +9 -0
  492. package/dist/tools/builtins/sandbox/grep.js +133 -0
  493. package/dist/tools/builtins/sandbox/index.d.ts +12 -0
  494. package/dist/tools/builtins/sandbox/index.js +27 -0
  495. package/dist/tools/builtins/sandbox/names.d.ts +7 -0
  496. package/dist/tools/builtins/sandbox/names.js +20 -0
  497. package/dist/tools/builtins/sandbox/read.d.ts +8 -0
  498. package/dist/tools/builtins/sandbox/read.js +121 -0
  499. package/dist/tools/builtins/sandbox/write.d.ts +4 -0
  500. package/dist/tools/builtins/sandbox/write.js +88 -0
  501. package/dist/tools/builtins/skill-load.d.ts +53 -0
  502. package/dist/tools/builtins/skill-load.js +446 -0
  503. package/dist/tools/builtins/skill-write.d.ts +59 -0
  504. package/dist/tools/builtins/skill-write.js +244 -0
  505. package/dist/tools/builtins/tool-search.d.ts +31 -0
  506. package/dist/tools/builtins/tool-search.js +171 -0
  507. package/dist/tools/connector-content.controller.d.ts +34 -0
  508. package/dist/tools/connector-content.controller.js +78 -0
  509. package/dist/tools/connector-content.d.ts +104 -0
  510. package/dist/tools/connector-content.js +267 -0
  511. package/dist/tools/connectors.controller.d.ts +210 -0
  512. package/dist/tools/connectors.controller.js +234 -0
  513. package/dist/tools/connectors.service.d.ts +303 -0
  514. package/dist/tools/connectors.service.js +1102 -0
  515. package/dist/tools/credentials.d.ts +139 -0
  516. package/dist/tools/credentials.js +351 -0
  517. package/dist/tools/drift.d.ts +141 -0
  518. package/dist/tools/drift.js +539 -0
  519. package/dist/tools/elicitation.d.ts +81 -0
  520. package/dist/tools/elicitation.js +266 -0
  521. package/dist/tools/endpoint.d.ts +18 -0
  522. package/dist/tools/endpoint.js +115 -0
  523. package/dist/tools/info.d.ts +67 -0
  524. package/dist/tools/info.js +113 -0
  525. package/dist/tools/naming.d.ts +27 -0
  526. package/dist/tools/naming.js +47 -0
  527. package/dist/tools/oauth/discovery.d.ts +65 -0
  528. package/dist/tools/oauth/discovery.js +307 -0
  529. package/dist/tools/oauth/flow.d.ts +63 -0
  530. package/dist/tools/oauth/flow.js +237 -0
  531. package/dist/tools/oauth/oauth.controller.d.ts +31 -0
  532. package/dist/tools/oauth/oauth.controller.js +95 -0
  533. package/dist/tools/oauth/tokens.d.ts +111 -0
  534. package/dist/tools/oauth/tokens.js +258 -0
  535. package/dist/tools/outputs.d.ts +61 -0
  536. package/dist/tools/outputs.js +156 -0
  537. package/dist/tools/pipeline.d.ts +322 -0
  538. package/dist/tools/pipeline.js +1236 -0
  539. package/dist/tools/policy.d.ts +60 -0
  540. package/dist/tools/policy.js +236 -0
  541. package/dist/tools/questions.controller.d.ts +24 -0
  542. package/dist/tools/questions.controller.js +58 -0
  543. package/dist/tools/questions.service.d.ts +103 -0
  544. package/dist/tools/questions.service.js +295 -0
  545. package/dist/tools/redact.d.ts +20 -0
  546. package/dist/tools/redact.js +60 -0
  547. package/dist/tools/registry.d.ts +246 -0
  548. package/dist/tools/registry.js +481 -0
  549. package/dist/tools/resources.d.ts +16 -0
  550. package/dist/tools/resources.js +76 -0
  551. package/dist/tools/specs.d.ts +14 -0
  552. package/dist/tools/specs.js +31 -0
  553. package/dist/tools/validate.d.ts +20 -0
  554. package/dist/tools/validate.js +183 -0
  555. package/dist/tools/view.d.ts +43 -0
  556. package/dist/tools/view.js +225 -0
  557. package/dist/ui/embed-token.d.ts +31 -0
  558. package/dist/ui/embed-token.js +132 -0
  559. package/dist/ui/registry.d.ts +58 -0
  560. package/dist/ui/registry.js +90 -0
  561. package/dist/ui/ui-stream.d.ts +37 -0
  562. package/dist/ui/ui-stream.js +162 -0
  563. package/dist/ui/views.controller.d.ts +81 -0
  564. package/dist/ui/views.controller.js +261 -0
  565. package/dist/ui/views.d.ts +155 -0
  566. package/dist/ui/views.js +306 -0
  567. package/dist/version.d.ts +5 -0
  568. package/dist/version.js +6 -0
  569. package/package.json +67 -3
  570. package/src/migrations/0001_init.sql +8 -0
  571. package/src/migrations/0002_secrets.sql +8 -0
  572. package/src/migrations/0003_identity.sql +117 -0
  573. package/src/migrations/0004_plugin_org_config_nullable.sql +3 -0
  574. package/src/migrations/0005_agents.sql +27 -0
  575. package/src/migrations/0006_conversations.sql +37 -0
  576. package/src/migrations/0007_checkpoints.sql +26 -0
  577. package/src/migrations/0008_runs_trigger_seq.sql +3 -0
  578. package/src/migrations/0009_runs_active_unique.sql +4 -0
  579. package/src/migrations/0010_tools.sql +125 -0
  580. package/src/migrations/0011_approvals_spec.sql +10 -0
  581. package/src/migrations/0012_run_waits.sql +24 -0
  582. package/src/migrations/0013_app_tools_source.sql +4 -0
  583. package/src/migrations/0014_tool_specs.sql +8 -0
  584. package/src/migrations/0015_tool_drift.sql +20 -0
  585. package/src/migrations/0016_plugin_permissions.sql +11 -0
  586. package/src/migrations/0017_identity_sources.sql +6 -0
  587. package/src/migrations/0018_channels.sql +74 -0
  588. package/src/migrations/0019_identity_trust.sql +17 -0
  589. package/src/migrations/0020_channel_card_lookup.sql +10 -0
  590. package/src/migrations/0021_org_storage_purge.sql +9 -0
  591. package/src/migrations/0022_attachments.sql +29 -0
  592. package/src/migrations/0023_sandboxes.sql +37 -0
  593. package/src/migrations/0024_skills.sql +46 -0
  594. package/src/migrations/0025_skills_catalog_idx.sql +6 -0
  595. package/src/migrations/0026_skill_changes.sql +34 -0
  596. package/src/migrations/0027_model_prices.sql +18 -0
  597. package/src/migrations/0028_evals.sql +105 -0
  598. package/src/migrations/0029_model_purposes.sql +18 -0
  599. package/src/migrations/0030_plugin_installs.sql +73 -0
  600. package/src/migrations/0031_plugin_snapshot_source.sql +6 -0
  601. package/src/migrations/0032_plugin_deployment_configs.sql +10 -0
  602. package/src/migrations/0033_rename_apps_to_connectors.sql +25 -0
  603. package/src/migrations/0034_directory.sql +49 -0
  604. package/src/migrations/0035_catalogs.sql +40 -0
  605. package/src/migrations/0036_app_import_staging.sql +17 -0
  606. package/src/migrations/0037_directory_installs.sql +92 -0
  607. package/src/migrations/0038_channel_inbound_mode.sql +6 -0
  608. package/src/migrations/0039_channel_card_pending.sql +8 -0
  609. package/src/migrations/0040_usage_report_sweep.sql +10 -0
  610. package/src/migrations/0041_rename_plugins_to_extensions.sql +38 -0
  611. package/src/migrations/0042_rename_directory_to_catalog.sql +80 -0
  612. package/src/migrations/0043_rename_app_installs_to_plugin_installs.sql +20 -0
  613. package/src/migrations/0044_catalog_one_kind.sql +90 -0
  614. package/src/migrations/0045_plugin_dependencies.sql +9 -0
  615. package/src/migrations/0046_git_sources.sql +25 -0
  616. package/src/migrations/0047_marketplace_entry_heads.sql +7 -0
  617. package/src/migrations/0048_marketplace_entry_trees.sql +8 -0
  618. package/src/migrations/0049_plugin_upgrades.sql +37 -0
  619. package/src/migrations/0050_bootstrap.sql +53 -0
  620. package/src/migrations/0051_claude_compat.sql +26 -0
  621. package/src/migrations/0052_conversations_account_agent_idx.sql +5 -0
  622. package/src/migrations/0053_subagents.sql +73 -0
  623. package/src/migrations/0054_subagent_wait_expiry.sql +7 -0
  624. package/src/migrations/0055_subagent_parent_indexes.sql +10 -0
  625. package/src/migrations/0056_approval_reason.sql +3 -0
  626. package/src/migrations/0057_conversation_titles.sql +11 -0
  627. package/src/migrations/0058_conversation_selection.sql +4 -0
  628. package/src/migrations/0059_conversation_queue.sql +22 -0
  629. package/src/migrations/0060_file_previewers.sql +10 -0
  630. package/src/migrations/0061_queue_selection.sql +5 -0
  631. package/src/migrations/0062_queued_skill.sql +8 -0
@@ -0,0 +1,502 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { sql } from "kysely";
3
+ import { normalizeStoredDefinition } from "../../agents/definition.js";
4
+ import { audit } from "../../identity/audit.js";
5
+ import { forkAgentUnknownText } from "../../skills/invoke.js";
6
+ import { AGENT_REFUSALS } from "../../tools/builtins/agent.js";
7
+ import { ACTIVE_RUN_STATUSES, runJobId } from "../run-queue.js";
8
+ import { effectiveDefinition, narrowFollowUp, SubagentTypeGoneError, } from "./definition.js";
9
+ import { subagentLimits } from "./limits.js";
10
+ import { auditRefusal, checkOrgAgent, currentAgentDefinition } from "./org-agents.js";
11
+ import { SUBAGENT_PREAMBLE } from "./preamble.js";
12
+ import { findType, GENERAL_PURPOSE_DESCRIPTION, resolveRoster, } from "./roster.js";
13
+ const refused = (content) => ({ kind: "refused", content });
14
+ /** The `general-purpose` roster entry (a fork invocation always has it). */
15
+ const GENERAL_ENTRY = {
16
+ type: "general-purpose",
17
+ source: "general",
18
+ description: GENERAL_PURPOSE_DESCRIPTION,
19
+ };
20
+ /** Idempotency key of the parent's `subagent_dispatched` event. */
21
+ export const dispatchedIdemKey = (runId, callId) => `subagent_dispatched:${runId}:${callId}`;
22
+ /**
23
+ * Dispatches the sub-agent of one `agent` call (spec §7.1), after the pipeline's validation,
24
+ * policy, approval and `tool.preExecute` stages. A new sub-agent: resolves its type and effective
25
+ * definition, then in one transaction (holding the parent run's row lock, so the dispatches of one
26
+ * run serialize) inserts the child conversation, appends `subagent_started` and the task message,
27
+ * inserts the child run (`queued`) and the `subagent_dispatches` row, appends `subagent_dispatched`
28
+ * to the parent and audits `subagent.dispatched`. A `resume` appends the follow-up message and
29
+ * starts the child's next run the same way. After commit the child run is enqueued; a failed
30
+ * enqueue only logs (the dispatch is durable, the wait sweep re-enqueues it).
31
+ *
32
+ * Refusals (§4.5) start nothing: a call from a sub-agent, an unknown type, an org agent that fails
33
+ * one of its gates ({@link orgAgentGates}, at every dispatch and follow-up; audited
34
+ * `subagent.refused`), `resume` with `subagent_type` / `model`, a `resume` id that is not a
35
+ * sub-agent of this conversation (whatever it is otherwise: no detail about other conversations),
36
+ * or one whose run is still active.
37
+ */
38
+ export async function dispatchSubagent(d, a) {
39
+ const { ctx, input } = a;
40
+ if (ctx.parent !== undefined)
41
+ return refused(AGENT_REFUSALS.notAvailableHere);
42
+ if (input.resume !== undefined) {
43
+ if (input.subagent_type !== undefined || input.model !== undefined) {
44
+ return refused(AGENT_REFUSALS.resumeWithType);
45
+ }
46
+ return resume(d, { ...a, id: input.resume });
47
+ }
48
+ const requested = input.subagent_type ?? "general-purpose";
49
+ const unknown = (types) => refused(AGENT_REFUSALS.unknownType(requested, types.map((e) => e.type)));
50
+ const fork = a.forSkill;
51
+ const listed = await resolveRoster(d.db, ctx.orgId, ctx.agent);
52
+ const roster = fork !== undefined && !listed.some((e) => e.type === GENERAL_ENTRY.type)
53
+ ? [GENERAL_ENTRY, ...listed]
54
+ : listed;
55
+ const warnings = [...(fork?.warnings ?? [])];
56
+ let entry = findType(roster, requested);
57
+ if (!entry && fork !== undefined) {
58
+ // the recorded type went away since the send (a template uninstalled): run as general-purpose
59
+ warnings.push(forkAgentUnknownText(fork.skill.name, requested));
60
+ entry = GENERAL_ENTRY;
61
+ }
62
+ if (!entry)
63
+ return unknown(roster);
64
+ let orgAgent;
65
+ if (entry.source === "agent") {
66
+ const gates = await orgAgentGates(d.db, a, entry.agentId ?? "", entry.type, false);
67
+ if ("refused" in gates)
68
+ return gates.refused;
69
+ orgAgent = gates.checked;
70
+ }
71
+ let eff;
72
+ try {
73
+ eff = await effectiveDefinition(d, {
74
+ orgId: ctx.orgId,
75
+ parent: ctx.agent,
76
+ parentAgentId: ctx.agentId,
77
+ entry,
78
+ ...(input.model !== undefined && { tier: input.model }),
79
+ ...(orgAgent !== undefined && { orgAgent }),
80
+ });
81
+ }
82
+ catch (e) {
83
+ // the template went away since the roster was read (spec §13: refuse, never fail the run)
84
+ // the template went away since the roster was read (spec §13: refuse, never fail the run);
85
+ // the list offered instead is read again, without it
86
+ if (e instanceof SubagentTypeGoneError) {
87
+ return unknown(await resolveRoster(d.db, ctx.orgId, ctx.agent));
88
+ }
89
+ throw e;
90
+ }
91
+ const childId = randomUUID();
92
+ const plan = {
93
+ childConversationId: childId,
94
+ agentType: entry.type,
95
+ source: entry.source,
96
+ agentId: orgAgent !== undefined ? (entry.agentId ?? "") : ctx.agentId,
97
+ agentVersion: orgAgent?.version ?? ctx.agentVersion,
98
+ resumed: false,
99
+ model: eff.model,
100
+ tierFallback: eff.tierFallback,
101
+ };
102
+ const out = await commit(d, a, plan, async (t) => {
103
+ const parentConv = await t
104
+ .selectFrom("conversations")
105
+ .select("account_id")
106
+ .where("id", "=", ctx.conversationId)
107
+ .executeTakeFirstOrThrow();
108
+ await t
109
+ .insertInto("conversations")
110
+ .values({
111
+ id: childId,
112
+ org_id: ctx.orgId,
113
+ agent_id: plan.agentId,
114
+ account_id: parentConv.account_id,
115
+ title: input.description,
116
+ kind: "subagent",
117
+ parent_conversation_id: ctx.conversationId,
118
+ subagent_type: entry.type,
119
+ })
120
+ .execute();
121
+ const [, task] = await d.eventLog.append(childId, [
122
+ {
123
+ type: "subagent_started",
124
+ idemKey: "subagent_started",
125
+ payload: {
126
+ parent: {
127
+ conversationId: ctx.conversationId,
128
+ runId: ctx.runId,
129
+ callId: a.callId,
130
+ step: ctx.step,
131
+ },
132
+ agentType: entry.type,
133
+ template: fork === undefined
134
+ ? eff.template
135
+ : {
136
+ ...eff.template,
137
+ invokedSkill: {
138
+ id: fork.skill.id,
139
+ version: fork.skill.version,
140
+ name: fork.skill.name,
141
+ },
142
+ },
143
+ definition: eff.definition,
144
+ preamble: SUBAGENT_PREAMBLE,
145
+ maxSteps: eff.maxSteps,
146
+ ...([...eff.warnings, ...warnings].length > 0 && {
147
+ warnings: [...eff.warnings, ...warnings],
148
+ }),
149
+ },
150
+ },
151
+ taskMessage(ctx, a.callId, fork === undefined ? input.prompt : fork.task(eff.definition), undefined, fork?.skill),
152
+ ], t);
153
+ return task;
154
+ });
155
+ // a new sub-agent's writer never refuses
156
+ return out ?? refused(AGENT_REFUSALS.notAvailableHere);
157
+ }
158
+ /**
159
+ * A follow-up to an existing sub-agent of this conversation (§4.2 `resume`). It keeps the frozen
160
+ * definition's instructions and model (replay), but is checked against what the parent may use
161
+ * now (final review I1): a `general` / inline / plugin child's type must still be in the roster
162
+ * of the dispatching run's version (a plugin template by its template id), else the call is
163
+ * refused as an unknown type; an org agent child passes its gates. Its tools and org skills are
164
+ * intersected with the current version ({@link narrowFollowUp}: the dispatching run's version,
165
+ * or the org agent's current version as the gates read it under the lock), and the result is
166
+ * recorded on the follow-up's task message for the run and for replay.
167
+ */
168
+ async function resume(d, a) {
169
+ const { ctx } = a;
170
+ const child = await d.db
171
+ .selectFrom("conversations")
172
+ .select(["id", "subagent_type"])
173
+ .where("id", "=", a.id)
174
+ .where("org_id", "=", ctx.orgId)
175
+ .where("kind", "=", "subagent")
176
+ .where("parent_conversation_id", "=", ctx.conversationId)
177
+ .executeTakeFirst();
178
+ if (!child)
179
+ return refused(AGENT_REFUSALS.noSuchAgent(a.id));
180
+ const started = await d.eventLog.findByIdem(child.id, "subagent_started");
181
+ if (started?.type !== "subagent_started")
182
+ return refused(AGENT_REFUSALS.noSuchAgent(a.id));
183
+ const { template } = started.payload;
184
+ const agentType = child.subagent_type ?? started.payload.agentType;
185
+ // an org agent's gates hold for every follow-up too (§5.5); it keeps its frozen version
186
+ if (template.source === "agent") {
187
+ const gates = await orgAgentGates(d.db, a, template.id ?? "", agentType, true);
188
+ if ("refused" in gates)
189
+ return gates.refused;
190
+ }
191
+ else {
192
+ const roster = await resolveRoster(d.db, ctx.orgId, ctx.agent);
193
+ const entry = template.source === "plugin"
194
+ ? roster.find((e) => e.source === "plugin" && e.templateId === template.id)
195
+ : findType(roster, agentType);
196
+ if (entry?.source !== template.source) {
197
+ return refused(AGENT_REFUSALS.unknownType(agentType, roster.map((e) => e.type)));
198
+ }
199
+ }
200
+ const frozen = normalizeStoredDefinition(started.payload.definition);
201
+ const plan = {
202
+ childConversationId: child.id,
203
+ agentType,
204
+ source: template.source,
205
+ agentId: template.source === "agent" ? (template.id ?? "") : ctx.agentId,
206
+ agentVersion: template.source === "agent" ? (template.version ?? ctx.agentVersion) : ctx.agentVersion,
207
+ resumed: true,
208
+ model: started.payload.definition.model,
209
+ tierFallback: false,
210
+ };
211
+ return commit(d, a, plan, async (t, checked) => {
212
+ const current = template.source === "agent" ? checked?.definition : ctx.agent;
213
+ if (current === undefined)
214
+ throw new Error("org agent follow-up without its checked version");
215
+ const activeRun = () => t
216
+ .selectFrom("runs")
217
+ .select("id")
218
+ .where("conversation_id", "=", child.id)
219
+ .where("status", "in", ACTIVE_RUN_STATUSES)
220
+ .executeTakeFirst();
221
+ // An active child is refused before its row is locked: a running child's token append locks
222
+ // its conversation row and then this parent run's row, which `commit` already holds, so
223
+ // waiting for the child's row here would be a lock-order cycle (review I1). The parent row
224
+ // lock serializes this parent's dispatches, so an earlier follow-up's run is visible here.
225
+ if (await activeRun())
226
+ return null;
227
+ // the child's row lock serializes follow-ups to one sub-agent; no run holds it now, so it is
228
+ // never held by an append waiting for the parent row
229
+ await t
230
+ .selectFrom("conversations")
231
+ .select("id")
232
+ .where("id", "=", child.id)
233
+ .forUpdate()
234
+ .executeTakeFirst();
235
+ if (await activeRun())
236
+ return null;
237
+ const [task] = await d.eventLog.append(child.id, [taskMessage(ctx, a.callId, a.input.prompt, narrowFollowUp(frozen, current))], t);
238
+ return task;
239
+ }).then((r) => r ?? refused(AGENT_REFUSALS.stillRunning(a.id)));
240
+ }
241
+ /**
242
+ * The gates of an org agent sub-agent (§5.5) for this call: the allowlist of the parent agent's
243
+ * **current** version (R5), the agent's `dispatchable`, its visibility to the person who started
244
+ * the parent run, and not deleted. A refusal is audited `subagent.refused` and answers with the
245
+ * §4.5 text, which names only the roster type. Checked before the dispatch transaction (a new
246
+ * sub-agent freezes the definition read here) and again inside it under the parent run's row lock
247
+ * ({@link commit}), so a gate revoked in between refuses (batch 9 review M1).
248
+ */
249
+ async function orgAgentGates(db, a, agentId, agentType, resumed) {
250
+ const { ctx } = a;
251
+ const parentDefinition = (await currentAgentDefinition(db, ctx.agentId)) ?? {};
252
+ const check = await checkOrgAgent(db, {
253
+ orgId: ctx.orgId,
254
+ parentDefinition,
255
+ agentId,
256
+ triggerAccountId: ctx.accountId,
257
+ });
258
+ if (check.ok)
259
+ return { checked: { version: check.version, definition: check.definition } };
260
+ await auditRefusal(db, {
261
+ orgId: ctx.orgId,
262
+ triggerAccountId: ctx.accountId,
263
+ agentId,
264
+ gate: check.gate,
265
+ parentConversationId: ctx.conversationId,
266
+ parentRunId: ctx.runId,
267
+ callId: a.callId,
268
+ agentType,
269
+ resumed,
270
+ });
271
+ return { refused: refused(AGENT_REFUSALS.agentNotAvailable(agentType)) };
272
+ }
273
+ const taskMessage = (ctx, callId, prompt, narrowed,
274
+ /**
275
+ * A fork invocation's record: the child's log then holds the invocation, so its `skill_load`
276
+ * is offered and resolves the invoked version (phase D).
277
+ */
278
+ skill) => ({
279
+ type: "user_message",
280
+ payload: {
281
+ content: [{ type: "text", text: prompt }],
282
+ ...(skill !== undefined && { skill }),
283
+ authorAccountId: ctx.accountId,
284
+ dispatch: {
285
+ parentConversationId: ctx.conversationId,
286
+ parentRunId: ctx.runId,
287
+ callId,
288
+ ...(narrowed !== undefined && { narrowed }),
289
+ },
290
+ },
291
+ });
292
+ /**
293
+ * The dispatch transaction shared by new sub-agents and follow-ups: locks the parent conversation
294
+ * row, then the parent run row (the order every terminal path uses),
295
+ * runs `child` (writes the child conversation's first events and returns the task message, or
296
+ * null to refuse), then inserts the child run and the dispatch row, appends `subagent_dispatched`
297
+ * and the audit row. After commit: notifies both conversations and enqueues the child run.
298
+ * Returns null when `child` refused.
299
+ *
300
+ * Under the parent run's row lock it first re-checks what the pipeline checked without it: a call
301
+ * already dispatched (a second holder of the same step, e.g. after a stalled-job takeover) gets
302
+ * the existing child run back and writes nothing, and a parent run that is no longer `running`
303
+ * (stopped, orphaned) dispatches nothing. Then the run's limits (§8.2, {@link subagentLimits}),
304
+ * read fresh: its children's token counter at or over the cap, its dispatches (follow-ups
305
+ * included) at the cap, or as many active children as may run at once each refuse with the §4.5
306
+ * text. The lock serializes the dispatches of one run, so the counts cannot race.
307
+ */
308
+ async function commit(d, a, plan,
309
+ /** Writes the child's events; `checked` is the org agent version the in-lock gates passed. */
310
+ child) {
311
+ const { ctx, callId, input } = a;
312
+ const childRunId = randomUUID();
313
+ const out = await d.db.transaction().execute(async (t) => {
314
+ // the documented order, conversation row then run row (run-finish.ts, abortWaiting): the
315
+ // append to the parent below takes the conversation row, so it is taken first here, or a stop
316
+ // racing this commit could deadlock (final review m2); the child's row comes last
317
+ await t
318
+ .selectFrom("conversations")
319
+ .select("id")
320
+ .where("id", "=", ctx.conversationId)
321
+ .forUpdate()
322
+ .executeTakeFirst();
323
+ const parent = await t
324
+ .selectFrom("runs")
325
+ .select(["status", "subagent_tokens_used"])
326
+ .where("id", "=", ctx.runId)
327
+ .forUpdate()
328
+ .executeTakeFirst();
329
+ const existing = await t
330
+ .selectFrom("subagent_dispatches as sd")
331
+ .leftJoin("runs as cr", "cr.id", "sd.child_run_id")
332
+ .select(["sd.child_run_id", "sd.child_conversation_id", "cr.status", "cr.trigger_seq"])
333
+ .where("sd.parent_run_id", "=", ctx.runId)
334
+ .where("sd.parent_call_id", "=", callId)
335
+ .executeTakeFirst();
336
+ if (existing) {
337
+ return {
338
+ kind: "existing",
339
+ childRunId: existing.child_run_id,
340
+ // still queued: the first holder may have died before its enqueue (review M4)
341
+ requeue: existing.status === "queued" && existing.trigger_seq !== null
342
+ ? {
343
+ conversationId: existing.child_conversation_id,
344
+ seq: Number(existing.trigger_seq),
345
+ }
346
+ : null,
347
+ };
348
+ }
349
+ if (parent?.status !== "running")
350
+ return { kind: "stopped" };
351
+ const limit = await limitRefusal(t, d, ctx, parent.subagent_tokens_used);
352
+ if (limit !== null)
353
+ return { kind: "limit", content: limit };
354
+ let checked;
355
+ if (plan.source === "agent") {
356
+ // the org agent's gates again, under the parent run's lock, with both agents' rows held
357
+ // FOR SHARE (in id order) so a concurrent save of either serializes with this dispatch
358
+ await t
359
+ .selectFrom("agents")
360
+ .select("id")
361
+ .where("id", "in", [ctx.agentId, plan.agentId])
362
+ .orderBy("id")
363
+ .forShare()
364
+ .execute();
365
+ const gates = await orgAgentGates(t, a, plan.agentId, plan.agentType, plan.resumed);
366
+ if ("refused" in gates)
367
+ return { kind: "gate", outcome: gates.refused };
368
+ checked = gates.checked;
369
+ }
370
+ const task = await child(t, checked);
371
+ if (task === null)
372
+ return null;
373
+ await t
374
+ .insertInto("runs")
375
+ .values({
376
+ id: childRunId,
377
+ conversation_id: plan.childConversationId,
378
+ status: "queued",
379
+ agent_version: plan.agentVersion,
380
+ trigger_account_id: ctx.accountId,
381
+ trigger_seq: task.seq,
382
+ })
383
+ .execute();
384
+ await t
385
+ .insertInto("subagent_dispatches")
386
+ .values({
387
+ parent_run_id: ctx.runId,
388
+ parent_call_id: callId,
389
+ parent_conversation_id: ctx.conversationId,
390
+ step: ctx.step,
391
+ child_conversation_id: plan.childConversationId,
392
+ child_run_id: childRunId,
393
+ resumed: plan.resumed,
394
+ })
395
+ .execute();
396
+ const [dispatched] = await d.eventLog.append(ctx.conversationId, [
397
+ {
398
+ type: "subagent_dispatched",
399
+ runId: ctx.runId,
400
+ idemKey: dispatchedIdemKey(ctx.runId, callId),
401
+ payload: {
402
+ step: ctx.step,
403
+ callId,
404
+ subagentId: plan.childConversationId,
405
+ childRunId,
406
+ agentType: plan.agentType,
407
+ description: input.description,
408
+ resumed: plan.resumed,
409
+ model: { provider: plan.model.provider, model: plan.model.model },
410
+ ...(plan.tierFallback && { tierFallback: true }),
411
+ ...(a.forSkill !== undefined && { invokedSeq: a.forSkill.seq }),
412
+ },
413
+ },
414
+ ], t);
415
+ await audit(t, {
416
+ actorAccountId: ctx.accountId,
417
+ orgId: ctx.orgId,
418
+ action: "subagent.dispatched",
419
+ target: plan.childConversationId,
420
+ detail: {
421
+ parentConversationId: ctx.conversationId,
422
+ parentRunId: ctx.runId,
423
+ callId,
424
+ agentType: plan.agentType,
425
+ source: plan.source,
426
+ ...(plan.source === "agent" && {
427
+ agentId: plan.agentId,
428
+ agentVersion: plan.agentVersion,
429
+ }),
430
+ resumed: plan.resumed,
431
+ childRunId,
432
+ },
433
+ });
434
+ return {
435
+ kind: "written",
436
+ childSeq: task.seq,
437
+ parentSeq: dispatched.seq,
438
+ };
439
+ });
440
+ if (out === null)
441
+ return null;
442
+ if (out.kind === "existing") {
443
+ // a child still queued is enqueued again under the first dispatch's job id (BullMQ dedupes
444
+ // it while that job exists), so a holder that died before its enqueue does not leave the
445
+ // child to the wait sweep
446
+ if (out.requeue !== null) {
447
+ const jobId = runJobId(out.requeue.conversationId, out.requeue.seq);
448
+ await d
449
+ .enqueue({ runId: out.childRunId, conversationId: out.requeue.conversationId }, jobId, "subagent")
450
+ .catch((err) => d.log.error("cannot enqueue sub-agent run; the sweep retries", {
451
+ childRunId: out.childRunId,
452
+ jobId,
453
+ err,
454
+ }));
455
+ }
456
+ return { kind: "dispatched", childRunId: out.childRunId };
457
+ }
458
+ // the result is never read: the run is over
459
+ if (out.kind === "stopped")
460
+ return refused(AGENT_REFUSALS.notAvailableHere);
461
+ if (out.kind === "limit")
462
+ return refused(out.content);
463
+ if (out.kind === "gate")
464
+ return out.outcome;
465
+ await d.eventLog.notify(plan.childConversationId, out.childSeq);
466
+ await d.eventLog.notify(ctx.conversationId, out.parentSeq);
467
+ const jobId = runJobId(plan.childConversationId, out.childSeq);
468
+ try {
469
+ await d.enqueue({ runId: childRunId, conversationId: plan.childConversationId }, jobId, "subagent");
470
+ }
471
+ catch (err) {
472
+ // the dispatch is committed: the wait sweep re-enqueues the queued child run
473
+ d.log.error("cannot enqueue sub-agent run; the sweep retries", { childRunId, jobId, err });
474
+ }
475
+ return { kind: "dispatched", childRunId };
476
+ }
477
+ /**
478
+ * The §4.5 refusal of a dispatch the parent run's limits forbid, or null. Runs under the parent
479
+ * run's row lock; `tokensUsed` is the counter read with that lock.
480
+ */
481
+ async function limitRefusal(t, d, ctx, tokensUsed) {
482
+ const limits = await subagentLimits(t, d.config, ctx.orgId);
483
+ if (Number(tokensUsed) >= limits.maxTokensPerRun) {
484
+ return AGENT_REFUSALS.budget(limits.maxTokensPerRun);
485
+ }
486
+ const counts = await t
487
+ .selectFrom("subagent_dispatches as sd")
488
+ .innerJoin("runs as cr", "cr.id", "sd.child_run_id")
489
+ .select([
490
+ sql `count(*)`.as("total"),
491
+ sql `count(*) FILTER (WHERE cr.status IN (${sql.join(ACTIVE_RUN_STATUSES)}))`.as("active"),
492
+ ])
493
+ .where("sd.parent_run_id", "=", ctx.runId)
494
+ .executeTakeFirstOrThrow();
495
+ if (Number(counts.total) >= limits.maxDispatchesPerRun) {
496
+ return AGENT_REFUSALS.tooManyDispatches(limits.maxDispatchesPerRun);
497
+ }
498
+ if (Number(counts.active) >= limits.maxConcurrentPerRun) {
499
+ return AGENT_REFUSALS.tooManyConcurrent(limits.maxConcurrentPerRun);
500
+ }
501
+ return null;
502
+ }
@@ -0,0 +1,23 @@
1
+ import type { Transaction } from "kysely";
2
+ import { type KernelConfig } from "../../config/schema.js";
3
+ import type { KernelDatabase, KernelDb } from "../../db/kernel-schema.js";
4
+ /** The sub-agent limits of one parent run (sub-agents spec §8.2). */
5
+ export interface SubagentLimits {
6
+ maxConcurrentPerRun: number;
7
+ maxDispatchesPerRun: number;
8
+ maxTokensPerRun: number;
9
+ }
10
+ /** The `subagents.*` defaults of the config schema. */
11
+ export declare const SUBAGENT_LIMIT_DEFAULTS: SubagentLimits;
12
+ /**
13
+ * The sub-agent limits for an organization: its entry in the deployment setting
14
+ * `subagentLimitOverrides`, value by value, over the hot config `subagents.*`. Read live (no cache),
15
+ * in the caller's transaction when one is given, so every replica applies a change at once.
16
+ */
17
+ export declare function subagentLimits(db: KernelDb | Transaction<KernelDatabase>, config: () => Pick<KernelConfig, "subagents">, orgId: string): Promise<SubagentLimits>;
18
+ /**
19
+ * Whether the sub-agents of `parentRunId` have used their token budget (§8.3): its
20
+ * `subagent_tokens_used`, read fresh, at or over `maxTokensPerRun`. A sub-agent's step checks it
21
+ * before every model request and ends its run with `budget` when it is.
22
+ */
23
+ export declare function subagentBudgetUsedUp(db: KernelDb, config: () => Pick<KernelConfig, "subagents">, orgId: string, parentRunId: string): Promise<boolean>;
@@ -0,0 +1,34 @@
1
+ import { KernelConfigSchema } from "../../config/schema.js";
2
+ import { readSubagentLimitOverride } from "../../identity/settings.js";
3
+ /** The `subagents.*` defaults of the config schema. */
4
+ export const SUBAGENT_LIMIT_DEFAULTS = KernelConfigSchema.shape.subagents.parse(undefined);
5
+ /**
6
+ * The sub-agent limits for an organization: its entry in the deployment setting
7
+ * `subagentLimitOverrides`, value by value, over the hot config `subagents.*`. Read live (no cache),
8
+ * in the caller's transaction when one is given, so every replica applies a change at once.
9
+ */
10
+ export async function subagentLimits(db, config, orgId) {
11
+ const base = config().subagents;
12
+ const over = await readSubagentLimitOverride(db, orgId);
13
+ return {
14
+ maxConcurrentPerRun: over?.maxConcurrentPerRun ?? base.maxConcurrentPerRun,
15
+ maxDispatchesPerRun: over?.maxDispatchesPerRun ?? base.maxDispatchesPerRun,
16
+ maxTokensPerRun: over?.maxTokensPerRun ?? base.maxTokensPerRun,
17
+ };
18
+ }
19
+ /**
20
+ * Whether the sub-agents of `parentRunId` have used their token budget (§8.3): its
21
+ * `subagent_tokens_used`, read fresh, at or over `maxTokensPerRun`. A sub-agent's step checks it
22
+ * before every model request and ends its run with `budget` when it is.
23
+ */
24
+ export async function subagentBudgetUsedUp(db, config, orgId, parentRunId) {
25
+ const row = await db
26
+ .selectFrom("runs")
27
+ .select("subagent_tokens_used")
28
+ .where("id", "=", parentRunId)
29
+ .executeTakeFirst();
30
+ if (!row)
31
+ return false;
32
+ const { maxTokensPerRun } = await subagentLimits(db, config, orgId);
33
+ return Number(row.subagent_tokens_used) >= maxTokensPerRun;
34
+ }
@@ -0,0 +1,50 @@
1
+ import { type AgentDefinition } from "../../agents/definition.js";
2
+ import type { KernelDb } from "../../db/kernel-schema.js";
3
+ /**
4
+ * The gates an org agent sub-agent passes (spec §5.5), checked at every dispatch and every
5
+ * follow-up: `deleted` (the agent is gone, or not of this org), `allowlist` (the parent agent's
6
+ * current version lists it in `subagents.agents`), `dispatchable` (its current version has
7
+ * `subagents.dispatchable: true`) and `visibility` (the person who started the parent run can use
8
+ * it, the normal agent visibility rule).
9
+ */
10
+ export type OrgAgentGate = "allowlist" | "dispatchable" | "visibility" | "deleted";
11
+ export type OrgAgentCheck = {
12
+ ok: true;
13
+ version: number;
14
+ definition: AgentDefinition;
15
+ } | {
16
+ ok: false;
17
+ gate: OrgAgentGate;
18
+ };
19
+ /**
20
+ * Checks the gates for dispatching `agentId` from a parent whose current definition is
21
+ * `parentDefinition` (read live by the caller: R5, removing an allowlist entry stops new
22
+ * dispatches at once). On success returns the agent's current version and definition, which the
23
+ * caller freezes as is (never read again, so the frozen version is the one the gates saw).
24
+ */
25
+ export declare function checkOrgAgent(db: KernelDb, a: {
26
+ orgId: string;
27
+ parentDefinition: Pick<AgentDefinition, "subagents">;
28
+ agentId: string;
29
+ triggerAccountId: string;
30
+ }): Promise<OrgAgentCheck>;
31
+ /**
32
+ * The parent agent's current definition (the allowlist gate reads it, not the run's version), or
33
+ * null when the agent no longer exists or is deleted.
34
+ */
35
+ export declare function currentAgentDefinition(db: KernelDb, agentId: string): Promise<AgentDefinition | null>;
36
+ /**
37
+ * Audits a refused org agent dispatch (`subagent.refused`, spec §5.5): actor the person who
38
+ * started the parent run, target the refused agent, so its owner can see attempts to use it.
39
+ */
40
+ export declare function auditRefusal(db: KernelDb, a: {
41
+ orgId: string;
42
+ triggerAccountId: string;
43
+ agentId: string;
44
+ gate: OrgAgentGate;
45
+ parentConversationId: string;
46
+ parentRunId: string;
47
+ callId: string;
48
+ agentType: string;
49
+ resumed: boolean;
50
+ }): Promise<void>;
@@ -0,0 +1,70 @@
1
+ import { isAgentVisibleTo } from "../../agents/agents.service.js";
2
+ import { normalizeStoredDefinition } from "../../agents/definition.js";
3
+ import { audit } from "../../identity/audit.js";
4
+ /**
5
+ * Checks the gates for dispatching `agentId` from a parent whose current definition is
6
+ * `parentDefinition` (read live by the caller: R5, removing an allowlist entry stops new
7
+ * dispatches at once). On success returns the agent's current version and definition, which the
8
+ * caller freezes as is (never read again, so the frozen version is the one the gates saw).
9
+ */
10
+ export async function checkOrgAgent(db, a) {
11
+ const row = await db
12
+ .selectFrom("agents")
13
+ .innerJoin("agent_versions", (j) => j
14
+ .onRef("agent_versions.agent_id", "=", "agents.id")
15
+ .onRef("agent_versions.version", "=", "agents.current_version"))
16
+ .select(["agents.current_version", "agent_versions.definition"])
17
+ .where("agents.id", "=", a.agentId)
18
+ .where("agents.org_id", "=", a.orgId)
19
+ .where("agents.deleted_at", "is", null)
20
+ .executeTakeFirst();
21
+ if (!row)
22
+ return { ok: false, gate: "deleted" };
23
+ if (!(a.parentDefinition.subagents?.agents ?? []).some((x) => x.agentId === a.agentId)) {
24
+ return { ok: false, gate: "allowlist" };
25
+ }
26
+ const definition = normalizeStoredDefinition(row.definition);
27
+ if (definition.subagents?.dispatchable !== true)
28
+ return { ok: false, gate: "dispatchable" };
29
+ if (!(await isAgentVisibleTo(db, a.agentId, a.triggerAccountId))) {
30
+ return { ok: false, gate: "visibility" };
31
+ }
32
+ return { ok: true, version: row.current_version, definition };
33
+ }
34
+ /**
35
+ * The parent agent's current definition (the allowlist gate reads it, not the run's version), or
36
+ * null when the agent no longer exists or is deleted.
37
+ */
38
+ export async function currentAgentDefinition(db, agentId) {
39
+ const row = await db
40
+ .selectFrom("agents")
41
+ .innerJoin("agent_versions", (j) => j
42
+ .onRef("agent_versions.agent_id", "=", "agents.id")
43
+ .onRef("agent_versions.version", "=", "agents.current_version"))
44
+ .select("agent_versions.definition")
45
+ .where("agents.id", "=", agentId)
46
+ // a deleted parent agent's running run allowlists nothing (batch 9 review M2)
47
+ .where("agents.deleted_at", "is", null)
48
+ .executeTakeFirst();
49
+ return row ? normalizeStoredDefinition(row.definition) : null;
50
+ }
51
+ /**
52
+ * Audits a refused org agent dispatch (`subagent.refused`, spec §5.5): actor the person who
53
+ * started the parent run, target the refused agent, so its owner can see attempts to use it.
54
+ */
55
+ export async function auditRefusal(db, a) {
56
+ await audit(db, {
57
+ actorAccountId: a.triggerAccountId,
58
+ orgId: a.orgId,
59
+ action: "subagent.refused",
60
+ target: a.agentId,
61
+ detail: {
62
+ gate: a.gate,
63
+ parentConversationId: a.parentConversationId,
64
+ parentRunId: a.parentRunId,
65
+ callId: a.callId,
66
+ agentType: a.agentType,
67
+ resumed: a.resumed,
68
+ },
69
+ });
70
+ }