@capybara-hq/kernel 0.1.0-rc.4 → 0.1.0-rc.6

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 (534) hide show
  1. package/bootstrap.json +61 -5
  2. package/dist/admin/admin.controller.d.ts +51 -14
  3. package/dist/admin/admin.controller.js +60 -19
  4. package/dist/admin/extensions.controller.d.ts +16 -2
  5. package/dist/admin/extensions.controller.js +26 -6
  6. package/dist/admin/setup-lock.d.ts +1 -1
  7. package/dist/admin/setup-lock.js +1 -1
  8. package/dist/admin/setup.controller.d.ts +1 -1
  9. package/dist/admin/setup.controller.js +1 -1
  10. package/dist/admin/setup.service.d.ts +4 -4
  11. package/dist/admin/setup.service.js +8 -8
  12. package/dist/agents/agent-lookup.d.ts +16 -0
  13. package/dist/agents/agent-lookup.js +11 -0
  14. package/dist/agents/agents.controller.d.ts +76 -1
  15. package/dist/agents/agents.controller.js +90 -11
  16. package/dist/agents/agents.module.d.ts +4 -1
  17. package/dist/agents/agents.module.js +32 -6
  18. package/dist/agents/agents.service.d.ts +54 -23
  19. package/dist/agents/agents.service.js +180 -76
  20. package/dist/agents/definition.d.ts +49 -0
  21. package/dist/agents/definition.js +45 -0
  22. package/dist/agents/from-template.d.ts +106 -0
  23. package/dist/agents/from-template.js +649 -0
  24. package/dist/agents/from-template.service.d.ts +60 -0
  25. package/dist/agents/from-template.service.js +161 -0
  26. package/dist/agents/models.controller.d.ts +34 -5
  27. package/dist/agents/models.controller.js +50 -6
  28. package/dist/agents/org-templates.d.ts +176 -0
  29. package/dist/agents/org-templates.js +827 -0
  30. package/dist/agents/pending-connector-requests.d.ts +77 -0
  31. package/dist/agents/pending-connector-requests.js +215 -0
  32. package/dist/agents/pending-connectors.controller.d.ts +39 -0
  33. package/dist/agents/pending-connectors.controller.js +91 -0
  34. package/dist/agents/pending-connectors.service.d.ts +62 -0
  35. package/dist/agents/pending-connectors.service.js +282 -0
  36. package/dist/agents/readiness.controller.d.ts +5 -5
  37. package/dist/agents/readiness.controller.js +6 -6
  38. package/dist/agents/templates.controller.d.ts +86 -5
  39. package/dist/agents/templates.controller.js +171 -7
  40. package/dist/agents/templates.d.ts +127 -23
  41. package/dist/agents/templates.js +475 -52
  42. package/dist/background/background.module.js +8 -1
  43. package/dist/background/finish.d.ts +3 -2
  44. package/dist/background/launch-lock.d.ts +4 -3
  45. package/dist/background/launch-lock.js +4 -3
  46. package/dist/background/poll.job.d.ts +9 -6
  47. package/dist/background/poll.job.js +30 -22
  48. package/dist/background/session.d.ts +13 -2
  49. package/dist/background/session.js +13 -0
  50. package/dist/background/stop.d.ts +12 -6
  51. package/dist/background/stop.js +57 -39
  52. package/dist/background/store.d.ts +18 -6
  53. package/dist/background/store.js +12 -6
  54. package/dist/background/tasks.service.d.ts +15 -5
  55. package/dist/background/tasks.service.js +42 -17
  56. package/dist/background/wake-rules.d.ts +27 -18
  57. package/dist/background/wake-rules.js +52 -22
  58. package/dist/background/wake.d.ts +13 -11
  59. package/dist/background/wake.js +20 -14
  60. package/dist/catalog/admin-catalog.controller.d.ts +129 -30
  61. package/dist/catalog/admin-catalog.controller.js +213 -42
  62. package/dist/catalog/catalog-content.d.ts +58 -32
  63. package/dist/catalog/catalog-content.js +34 -8
  64. package/dist/catalog/catalog-import.module.d.ts +7 -0
  65. package/dist/catalog/catalog-import.module.js +60 -0
  66. package/dist/catalog/catalog-items.d.ts +111 -7
  67. package/dist/catalog/catalog-items.js +279 -13
  68. package/dist/catalog/catalog-scope.service.d.ts +260 -0
  69. package/dist/catalog/catalog-scope.service.js +1116 -0
  70. package/dist/catalog/catalog.module.d.ts +7 -9
  71. package/dist/catalog/catalog.module.js +41 -31
  72. package/dist/catalog/catalog.service.d.ts +101 -29
  73. package/dist/catalog/catalog.service.js +104 -106
  74. package/dist/catalog/cli.d.ts +11 -1
  75. package/dist/catalog/cli.js +26 -1
  76. package/dist/catalog/component-promotion.d.ts +96 -0
  77. package/dist/catalog/component-promotion.js +395 -0
  78. package/dist/catalog/component-scope.controller.d.ts +152 -0
  79. package/dist/catalog/component-scope.controller.js +287 -0
  80. package/dist/catalog/component-scope.service.d.ts +303 -0
  81. package/dist/catalog/component-scope.service.js +936 -0
  82. package/dist/catalog/component-state.d.ts +174 -0
  83. package/dist/catalog/component-state.js +437 -0
  84. package/dist/catalog/job-ids.d.ts +30 -0
  85. package/dist/catalog/job-ids.js +25 -0
  86. package/dist/catalog/marketplace-fetch.d.ts +1 -1
  87. package/dist/catalog/marketplaces.controller.d.ts +22 -5
  88. package/dist/catalog/marketplaces.controller.js +56 -7
  89. package/dist/catalog/marketplaces.service.d.ts +54 -14
  90. package/dist/catalog/marketplaces.service.js +71 -22
  91. package/dist/catalog/org-catalog.controller.d.ts +125 -34
  92. package/dist/catalog/org-catalog.controller.js +181 -65
  93. package/dist/catalog/org-catalog.service.d.ts +65 -33
  94. package/dist/catalog/org-catalog.service.js +324 -157
  95. package/dist/catalog/org-extension-switch.d.ts +41 -0
  96. package/dist/catalog/org-extension-switch.js +115 -0
  97. package/dist/catalog/org-extension.controller.d.ts +119 -0
  98. package/dist/catalog/org-extension.controller.js +266 -0
  99. package/dist/catalog/org-plugin-uploads.controller.d.ts +98 -0
  100. package/dist/catalog/org-plugin-uploads.controller.js +213 -0
  101. package/dist/catalog/org-plugin-uploads.d.ts +63 -0
  102. package/dist/catalog/org-plugin-uploads.js +116 -0
  103. package/dist/catalog/owned-items.d.ts +184 -0
  104. package/dist/catalog/owned-items.js +789 -0
  105. package/dist/catalog/owned-plugin-cleanup.d.ts +56 -0
  106. package/dist/catalog/owned-plugin-cleanup.js +194 -0
  107. package/dist/catalog/ownership.d.ts +172 -0
  108. package/dist/catalog/ownership.js +326 -0
  109. package/dist/catalog/platform-components.d.ts +221 -0
  110. package/dist/catalog/platform-components.js +761 -0
  111. package/dist/catalog/platform-migration.d.ts +115 -0
  112. package/dist/catalog/platform-migration.js +582 -0
  113. package/dist/catalog/plugin-import.d.ts +178 -34
  114. package/dist/catalog/plugin-import.js +622 -82
  115. package/dist/catalog/plugin-install.d.ts +185 -41
  116. package/dist/catalog/plugin-install.js +758 -126
  117. package/dist/catalog/plugin-upgrade.d.ts +260 -225
  118. package/dist/catalog/plugin-upgrade.js +1147 -1136
  119. package/dist/catalog/request-rules.d.ts +65 -0
  120. package/dist/catalog/request-rules.js +217 -0
  121. package/dist/catalog/requests.service.d.ts +193 -118
  122. package/dist/catalog/requests.service.js +526 -343
  123. package/dist/catalog/reserved-names.d.ts +8 -0
  124. package/dist/catalog/reserved-names.js +42 -0
  125. package/dist/catalog/scope-orgs.d.ts +21 -0
  126. package/dist/catalog/scope-orgs.js +67 -0
  127. package/dist/catalog/scope-state.d.ts +35 -0
  128. package/dist/catalog/scope-state.js +87 -0
  129. package/dist/catalog/scope-sync-workers.d.ts +7 -0
  130. package/dist/catalog/scope-sync-workers.js +29 -0
  131. package/dist/catalog/scope-sync.d.ts +176 -0
  132. package/dist/catalog/scope-sync.js +576 -0
  133. package/dist/catalog/scope.d.ts +42 -0
  134. package/dist/catalog/scope.js +42 -0
  135. package/dist/catalog/unshare.d.ts +22 -0
  136. package/dist/catalog/unshare.js +118 -0
  137. package/dist/channels/actions.js +1 -0
  138. package/dist/channels/cards.js +20 -2
  139. package/dist/channels/channels.module.js +2 -0
  140. package/dist/channels/inbound.d.ts +9 -1
  141. package/dist/channels/inbound.js +67 -5
  142. package/dist/channels/phrases.d.ts +35 -0
  143. package/dist/channels/phrases.js +29 -0
  144. package/dist/config/docs.js +3 -1
  145. package/dist/config/schema.d.ts +10 -2
  146. package/dist/config/schema.js +70 -22
  147. package/dist/conversations/access.d.ts +6 -4
  148. package/dist/conversations/access.js +27 -5
  149. package/dist/conversations/agent-tree.d.ts +46 -0
  150. package/dist/conversations/agent-tree.js +92 -0
  151. package/dist/conversations/conversations.controller.d.ts +43 -18
  152. package/dist/conversations/conversations.controller.js +79 -38
  153. package/dist/conversations/conversations.module.d.ts +1 -1
  154. package/dist/conversations/conversations.module.js +7 -7
  155. package/dist/conversations/conversations.service.d.ts +73 -15
  156. package/dist/conversations/conversations.service.js +115 -35
  157. package/dist/conversations/environment-status.d.ts +24 -0
  158. package/dist/conversations/environment-status.js +71 -0
  159. package/dist/conversations/event-log.d.ts +20 -5
  160. package/dist/conversations/event-log.js +60 -0
  161. package/dist/conversations/events.d.ts +84 -2
  162. package/dist/conversations/events.js +91 -17
  163. package/dist/conversations/queue.service.d.ts +1 -1
  164. package/dist/conversations/queue.service.js +5 -0
  165. package/dist/conversations/titles.d.ts +5 -3
  166. package/dist/conversations/titles.js +21 -8
  167. package/dist/conversations/tree.d.ts +17 -0
  168. package/dist/conversations/tree.js +42 -0
  169. package/dist/ctx/create-ctx.d.ts +20 -1
  170. package/dist/ctx/create-ctx.js +38 -7
  171. package/dist/db/kernel-schema.d.ts +386 -18
  172. package/dist/environments/access.d.ts +41 -0
  173. package/dist/environments/access.js +77 -0
  174. package/dist/environments/conversation-environments.d.ts +61 -0
  175. package/dist/environments/conversation-environments.js +170 -0
  176. package/dist/environments/dto.d.ts +25 -0
  177. package/dist/environments/dto.js +12 -0
  178. package/dist/environments/environments.controller.d.ts +33 -0
  179. package/dist/environments/environments.controller.js +110 -0
  180. package/dist/environments/environments.module.d.ts +8 -0
  181. package/dist/environments/environments.module.js +27 -0
  182. package/dist/environments/environments.service.d.ts +153 -0
  183. package/dist/environments/environments.service.js +541 -0
  184. package/dist/environments/legacy-cleanup.job.d.ts +34 -0
  185. package/dist/environments/legacy-cleanup.job.js +141 -0
  186. package/dist/errors.d.ts +85 -2
  187. package/dist/errors.js +85 -2
  188. package/dist/evals/reconstruct.d.ts +18 -9
  189. package/dist/evals/reconstruct.js +26 -7
  190. package/dist/evals/run-replay.d.ts +4 -2
  191. package/dist/evals/run-replay.js +20 -6
  192. package/dist/evals/runs.service.d.ts +2 -1
  193. package/dist/evals/runs.service.js +13 -12
  194. package/dist/evals/step-replay.d.ts +4 -6
  195. package/dist/evals/step-replay.js +4 -3
  196. package/dist/evals/trajectory.service.d.ts +8 -3
  197. package/dist/evals/trajectory.service.js +26 -14
  198. package/dist/evals/worker.d.ts +5 -5
  199. package/dist/evals/worker.js +9 -3
  200. package/dist/extensions/admin-ops.d.ts +36 -10
  201. package/dist/extensions/admin-ops.js +65 -42
  202. package/dist/extensions/admin-view.d.ts +37 -10
  203. package/dist/extensions/admin-view.js +103 -20
  204. package/dist/extensions/bootstrap.d.ts +17 -4
  205. package/dist/extensions/bootstrap.js +70 -9
  206. package/dist/extensions/cli.d.ts +12 -0
  207. package/dist/extensions/cli.js +11 -2
  208. package/dist/extensions/config-hash.d.ts +10 -0
  209. package/dist/extensions/config-hash.js +38 -0
  210. package/dist/extensions/deployment-config.d.ts +28 -5
  211. package/dist/extensions/deployment-config.js +48 -7
  212. package/dist/extensions/effective-config.d.ts +127 -0
  213. package/dist/extensions/effective-config.js +368 -0
  214. package/dist/extensions/extensions.module.js +11 -11
  215. package/dist/extensions/hooks.d.ts +37 -4
  216. package/dist/extensions/hooks.js +82 -16
  217. package/dist/extensions/host.d.ts +24 -10
  218. package/dist/extensions/host.js +49 -54
  219. package/dist/extensions/installs.d.ts +20 -8
  220. package/dist/extensions/installs.js +37 -15
  221. package/dist/extensions/org-config.d.ts +75 -6
  222. package/dist/extensions/org-config.js +184 -32
  223. package/dist/extensions/org-levels.d.ts +37 -0
  224. package/dist/extensions/org-levels.js +71 -0
  225. package/dist/extensions/org-overrides.d.ts +151 -0
  226. package/dist/extensions/org-overrides.js +524 -0
  227. package/dist/extensions/permission-view.d.ts +16 -4
  228. package/dist/extensions/permission-view.js +4 -4
  229. package/dist/extensions/plugin-items.d.ts +21 -0
  230. package/dist/extensions/plugin-items.js +42 -0
  231. package/dist/extensions/point-defaults.d.ts +12 -5
  232. package/dist/extensions/point-defaults.js +37 -9
  233. package/dist/extensions/resolve.d.ts +5 -1
  234. package/dist/extensions/resolve.js +15 -2
  235. package/dist/extensions/state.module.d.ts +9 -0
  236. package/dist/extensions/state.module.js +38 -0
  237. package/dist/files/previewers.d.ts +8 -1
  238. package/dist/files/previewers.js +35 -6
  239. package/dist/http/api.module.js +25 -3
  240. package/dist/http/app.d.ts +11 -2
  241. package/dist/http/app.js +31 -5
  242. package/dist/http/plugin-dispatch.d.ts +4 -1
  243. package/dist/http/plugin-dispatch.js +14 -2
  244. package/dist/identity/accounts.d.ts +29 -29
  245. package/dist/identity/accounts.js +47 -47
  246. package/dist/identity/audit.d.ts +2 -1
  247. package/dist/identity/auth.guard.d.ts +13 -5
  248. package/dist/identity/auth.guard.js +26 -9
  249. package/dist/identity/identity.module.d.ts +1 -1
  250. package/dist/identity/identity.module.js +4 -4
  251. package/dist/identity/me.controller.js +1 -1
  252. package/dist/identity/principal.d.ts +3 -3
  253. package/dist/identity/principal.js +3 -3
  254. package/dist/identity/settings.d.ts +22 -11
  255. package/dist/identity/settings.js +53 -18
  256. package/dist/identity/{enterprise-admin.d.ts → super-admin.d.ts} +5 -5
  257. package/dist/identity/{enterprise-admin.js → super-admin.js} +24 -24
  258. package/dist/inbox/inbox.module.d.ts +4 -1
  259. package/dist/inbox/inbox.module.js +7 -3
  260. package/dist/inbox/inbox.service.d.ts +62 -3
  261. package/dist/inbox/inbox.service.js +74 -4
  262. package/dist/inbox/org-notices.d.ts +63 -0
  263. package/dist/inbox/org-notices.js +91 -0
  264. package/dist/inbox/platform-inbox.controller.d.ts +23 -0
  265. package/dist/inbox/platform-inbox.controller.js +58 -0
  266. package/dist/inbox/platform-inbox.service.d.ts +151 -0
  267. package/dist/inbox/platform-inbox.service.js +263 -0
  268. package/dist/inbox/platform-notices.d.ts +19 -0
  269. package/dist/inbox/platform-notices.js +9 -0
  270. package/dist/index.d.ts +1 -1
  271. package/dist/index.js +1 -1
  272. package/dist/infra/cli/kernel-cli.module.js +9 -1
  273. package/dist/infra/config/kernel-config.service.js +24 -1
  274. package/dist/infra/database/xact-lock.d.ts +1 -1
  275. package/dist/infra/database/xact-lock.js +1 -1
  276. package/dist/infra/events/kernel-events.d.ts +19 -2
  277. package/dist/infra/queue/add-job-once.d.ts +14 -0
  278. package/dist/infra/queue/add-job-once.js +16 -0
  279. package/dist/kernel.module.js +6 -0
  280. package/dist/lifecycle/kernel-lifecycle.d.ts +1 -1
  281. package/dist/lifecycle/kernel-lifecycle.js +4 -4
  282. package/dist/models/embeddings.d.ts +82 -0
  283. package/dist/models/embeddings.js +326 -0
  284. package/dist/models/enablement.controller.d.ts +40 -0
  285. package/dist/models/enablement.controller.js +74 -0
  286. package/dist/models/enablement.d.ts +99 -0
  287. package/dist/models/enablement.js +263 -0
  288. package/dist/models/models.module.d.ts +5 -1
  289. package/dist/models/models.module.js +16 -4
  290. package/dist/models/prices.d.ts +5 -5
  291. package/dist/models/prices.js +4 -4
  292. package/dist/models/purposes.controller.d.ts +6 -4
  293. package/dist/models/purposes.controller.js +13 -7
  294. package/dist/models/purposes.d.ts +37 -12
  295. package/dist/models/purposes.js +63 -17
  296. package/dist/orgs/directory-sync.d.ts +14 -5
  297. package/dist/orgs/directory-sync.js +41 -17
  298. package/dist/orgs/offboarding.d.ts +9 -7
  299. package/dist/orgs/offboarding.js +28 -17
  300. package/dist/orgs/org-lock.d.ts +5 -0
  301. package/dist/orgs/org-lock.js +13 -0
  302. package/dist/orgs/org.guard.d.ts +10 -0
  303. package/dist/orgs/org.guard.js +43 -32
  304. package/dist/orgs/orgs.module.js +3 -0
  305. package/dist/orgs/orgs.service.d.ts +20 -7
  306. package/dist/orgs/orgs.service.js +32 -12
  307. package/dist/orgs/roles.d.ts +1 -1
  308. package/dist/orgs/roles.js +5 -1
  309. package/dist/orgs/settings.controller.d.ts +1 -1
  310. package/dist/orgs/settings.service.d.ts +15 -3
  311. package/dist/orgs/settings.service.js +6 -2
  312. package/dist/overrides.d.ts +3 -0
  313. package/dist/overrides.js +2 -0
  314. package/dist/platform/actor.d.ts +48 -0
  315. package/dist/platform/actor.js +100 -0
  316. package/dist/platform/agent-docs.d.ts +18 -0
  317. package/dist/platform/agent-docs.js +59 -0
  318. package/dist/platform/availability.d.ts +14 -0
  319. package/dist/platform/availability.js +43 -0
  320. package/dist/platform/errors.d.ts +11 -0
  321. package/dist/platform/errors.js +26 -0
  322. package/dist/platform/exclusions.d.ts +12 -0
  323. package/dist/platform/exclusions.js +1405 -0
  324. package/dist/platform/method.d.ts +6 -0
  325. package/dist/platform/method.js +15 -0
  326. package/dist/platform/operation.d.ts +92 -0
  327. package/dist/platform/operation.js +35 -0
  328. package/dist/platform/ops/agent-templates.ops.d.ts +14 -0
  329. package/dist/platform/ops/agent-templates.ops.js +92 -0
  330. package/dist/platform/ops/agents.ops.d.ts +19 -0
  331. package/dist/platform/ops/agents.ops.js +294 -0
  332. package/dist/platform/ops/connectors.ops.d.ts +15 -0
  333. package/dist/platform/ops/connectors.ops.js +126 -0
  334. package/dist/platform/ops/errors.d.ts +11 -0
  335. package/dist/platform/ops/errors.js +22 -0
  336. package/dist/platform/ops/extensions.ops.d.ts +19 -0
  337. package/dist/platform/ops/extensions.ops.js +116 -0
  338. package/dist/platform/ops/marketplaces.ops.d.ts +16 -0
  339. package/dist/platform/ops/marketplaces.ops.js +157 -0
  340. package/dist/platform/ops/paging.d.ts +14 -0
  341. package/dist/platform/ops/paging.js +20 -0
  342. package/dist/platform/ops/platform.ops.d.ts +23 -0
  343. package/dist/platform/ops/platform.ops.js +158 -0
  344. package/dist/platform/ops/plugins.ops.d.ts +33 -0
  345. package/dist/platform/ops/plugins.ops.js +377 -0
  346. package/dist/platform/ops/requests.ops.d.ts +14 -0
  347. package/dist/platform/ops/requests.ops.js +153 -0
  348. package/dist/platform/ops/role.d.ts +4 -0
  349. package/dist/platform/ops/role.js +10 -0
  350. package/dist/platform/ops/skills.ops.d.ts +13 -0
  351. package/dist/platform/ops/skills.ops.js +98 -0
  352. package/dist/platform/ops/summary.d.ts +10 -0
  353. package/dist/platform/ops/summary.js +18 -0
  354. package/dist/platform/platform-ops.module.d.ts +7 -0
  355. package/dist/platform/platform-ops.module.js +55 -0
  356. package/dist/platform/platform.module.d.ts +8 -0
  357. package/dist/platform/platform.module.js +25 -0
  358. package/dist/platform/redact-orgs.d.ts +7 -0
  359. package/dist/platform/redact-orgs.js +52 -0
  360. package/dist/platform/registry.d.ts +30 -0
  361. package/dist/platform/registry.js +111 -0
  362. package/dist/roles/worker-role.d.ts +6 -4
  363. package/dist/roles/worker-role.js +14 -7
  364. package/dist/roles/worker.module.d.ts +1 -1
  365. package/dist/roles/worker.module.js +9 -1
  366. package/dist/runtime/context/build.d.ts +6 -4
  367. package/dist/runtime/context/build.js +26 -7
  368. package/dist/runtime/context/claude-tools.d.ts +2 -1
  369. package/dist/runtime/context/claude-tools.js +5 -4
  370. package/dist/runtime/context/compaction.js +9 -0
  371. package/dist/runtime/context/reminders.d.ts +2 -0
  372. package/dist/runtime/context/reminders.js +2 -0
  373. package/dist/runtime/context/skills.js +9 -2
  374. package/dist/runtime/context/tool-changes.d.ts +27 -0
  375. package/dist/runtime/context/tool-changes.js +60 -0
  376. package/dist/runtime/hook-calls.d.ts +8 -1
  377. package/dist/runtime/hook-calls.js +40 -7
  378. package/dist/runtime/langgraph-loop.d.ts +3 -1
  379. package/dist/runtime/langgraph-loop.js +35 -17
  380. package/dist/runtime/loop.d.ts +32 -4
  381. package/dist/runtime/maintenance.d.ts +7 -4
  382. package/dist/runtime/maintenance.js +23 -8
  383. package/dist/runtime/model-call.d.ts +38 -11
  384. package/dist/runtime/model-call.js +97 -24
  385. package/dist/runtime/providers.d.ts +146 -32
  386. package/dist/runtime/providers.js +321 -67
  387. package/dist/runtime/run-control.d.ts +11 -1
  388. package/dist/runtime/run-control.js +12 -0
  389. package/dist/runtime/run-drafts.d.ts +85 -0
  390. package/dist/runtime/run-drafts.js +230 -0
  391. package/dist/runtime/run-jobs.d.ts +3 -5
  392. package/dist/runtime/run-jobs.js +3 -7
  393. package/dist/runtime/run-queue.d.ts +37 -3
  394. package/dist/runtime/run-queue.js +188 -11
  395. package/dist/runtime/run-worker.d.ts +12 -6
  396. package/dist/runtime/run-worker.js +58 -35
  397. package/dist/runtime/runtime.module.js +3 -0
  398. package/dist/runtime/step-log.d.ts +9 -4
  399. package/dist/runtime/step-log.js +8 -5
  400. package/dist/runtime/stream.controller.d.ts +23 -1
  401. package/dist/runtime/stream.controller.js +60 -3
  402. package/dist/runtime/stream.d.ts +4 -1
  403. package/dist/runtime/stream.js +27 -3
  404. package/dist/runtime/subagents/child.d.ts +55 -7
  405. package/dist/runtime/subagents/child.js +105 -7
  406. package/dist/runtime/subagents/definition.d.ts +12 -3
  407. package/dist/runtime/subagents/definition.js +46 -32
  408. package/dist/runtime/subagents/deliveries.d.ts +71 -0
  409. package/dist/runtime/subagents/deliveries.js +228 -0
  410. package/dist/runtime/subagents/dispatch.d.ts +115 -26
  411. package/dist/runtime/subagents/dispatch.js +212 -141
  412. package/dist/runtime/subagents/limits.d.ts +24 -5
  413. package/dist/runtime/subagents/limits.js +40 -6
  414. package/dist/runtime/subagents/messages.d.ts +95 -0
  415. package/dist/runtime/subagents/messages.js +328 -0
  416. package/dist/runtime/subagents/preamble.d.ts +4 -4
  417. package/dist/runtime/subagents/preamble.js +9 -7
  418. package/dist/runtime/subagents/progress.d.ts +8 -6
  419. package/dist/runtime/subagents/progress.js +11 -6
  420. package/dist/runtime/subagents/render.d.ts +30 -0
  421. package/dist/runtime/subagents/render.js +53 -0
  422. package/dist/runtime/subagents/roster.d.ts +24 -7
  423. package/dist/runtime/subagents/roster.js +47 -11
  424. package/dist/runtime/subagents/skill-fork.d.ts +3 -2
  425. package/dist/runtime/subagents/skill-fork.js +8 -4
  426. package/dist/runtime/subagents/status.d.ts +14 -0
  427. package/dist/runtime/subagents/status.js +23 -0
  428. package/dist/runtime/subagents/subagents.service.d.ts +7 -4
  429. package/dist/runtime/subagents/subagents.service.js +11 -6
  430. package/dist/runtime/usage-report-jobs.d.ts +88 -0
  431. package/dist/runtime/usage-report-jobs.js +158 -0
  432. package/dist/runtime/usage-report.d.ts +33 -38
  433. package/dist/runtime/usage-report.js +169 -96
  434. package/dist/runtime/waits.d.ts +140 -37
  435. package/dist/runtime/waits.js +394 -106
  436. package/dist/sandbox/jobs.d.ts +40 -13
  437. package/dist/sandbox/jobs.js +57 -20
  438. package/dist/sandbox/leases.d.ts +37 -54
  439. package/dist/sandbox/leases.js +71 -115
  440. package/dist/sandbox/providers.d.ts +2 -2
  441. package/dist/sandbox/providers.js +1 -1
  442. package/dist/sandbox/sandbox.module.d.ts +3 -2
  443. package/dist/sandbox/sandbox.module.js +4 -3
  444. package/dist/sandbox/sandbox.service.d.ts +229 -134
  445. package/dist/sandbox/sandbox.service.js +630 -409
  446. package/dist/skills/catalog.d.ts +3 -2
  447. package/dist/skills/catalog.js +21 -43
  448. package/dist/skills/changes.controller.d.ts +7 -0
  449. package/dist/skills/changes.controller.js +19 -1
  450. package/dist/skills/invoke.js +8 -3
  451. package/dist/skills/package.d.ts +20 -1
  452. package/dist/skills/package.js +28 -1
  453. package/dist/skills/skills.controller.d.ts +39 -4
  454. package/dist/skills/skills.controller.js +88 -10
  455. package/dist/skills/skills.module.js +10 -1
  456. package/dist/skills/skills.service.d.ts +106 -26
  457. package/dist/skills/skills.service.js +421 -75
  458. package/dist/skills/usable.d.ts +81 -0
  459. package/dist/skills/usable.js +379 -0
  460. package/dist/tools/approvals.service.d.ts +20 -2
  461. package/dist/tools/approvals.service.js +23 -4
  462. package/dist/tools/builtin-names.d.ts +21 -5
  463. package/dist/tools/builtin-names.js +30 -5
  464. package/dist/tools/builtins/agent.d.ts +23 -21
  465. package/dist/tools/builtins/agent.js +62 -55
  466. package/dist/tools/builtins/builtin-tools.d.ts +6 -2
  467. package/dist/tools/builtins/builtin-tools.js +37 -12
  468. package/dist/tools/builtins/handback.d.ts +28 -0
  469. package/dist/tools/builtins/handback.js +53 -0
  470. package/dist/tools/builtins/platform.d.ts +34 -0
  471. package/dist/tools/builtins/platform.js +362 -0
  472. package/dist/tools/builtins/sandbox/bash.js +13 -3
  473. package/dist/tools/builtins/sandbox/common.d.ts +43 -24
  474. package/dist/tools/builtins/sandbox/common.js +80 -45
  475. package/dist/tools/builtins/sandbox/edit.js +2 -2
  476. package/dist/tools/builtins/sandbox/glob.js +2 -2
  477. package/dist/tools/builtins/sandbox/grep.js +2 -4
  478. package/dist/tools/builtins/sandbox/index.d.ts +1 -1
  479. package/dist/tools/builtins/sandbox/index.js +1 -1
  480. package/dist/tools/builtins/sandbox/read.js +1 -1
  481. package/dist/tools/builtins/sandbox/task-output.d.ts +14 -3
  482. package/dist/tools/builtins/sandbox/task-output.js +30 -5
  483. package/dist/tools/builtins/sandbox/task-stop.js +2 -1
  484. package/dist/tools/builtins/sandbox/write.js +2 -2
  485. package/dist/tools/builtins/send-message.d.ts +56 -0
  486. package/dist/tools/builtins/send-message.js +100 -0
  487. package/dist/tools/builtins/skill-load.d.ts +22 -14
  488. package/dist/tools/builtins/skill-load.js +86 -57
  489. package/dist/tools/builtins/skill-write.js +1 -1
  490. package/dist/tools/builtins/web/extract.js +5 -1
  491. package/dist/tools/builtins/web/fetch.js +1 -0
  492. package/dist/tools/builtins/web/search.js +1 -0
  493. package/dist/tools/connectors.controller.d.ts +10 -0
  494. package/dist/tools/connectors.controller.js +12 -0
  495. package/dist/tools/connectors.service.d.ts +46 -5
  496. package/dist/tools/connectors.service.js +94 -15
  497. package/dist/tools/extension-tools.controller.d.ts +14 -0
  498. package/dist/tools/extension-tools.controller.js +37 -0
  499. package/dist/tools/info.d.ts +42 -1
  500. package/dist/tools/info.js +64 -1
  501. package/dist/tools/org-tool-switches.d.ts +74 -0
  502. package/dist/tools/org-tool-switches.js +184 -0
  503. package/dist/tools/pipeline.d.ts +46 -40
  504. package/dist/tools/pipeline.js +193 -364
  505. package/dist/tools/policy.d.ts +1 -1
  506. package/dist/tools/policy.js +36 -16
  507. package/dist/tools/registry.d.ts +98 -5
  508. package/dist/tools/registry.js +87 -9
  509. package/dist/tools/tools.module.js +12 -2
  510. package/dist/ui/views.d.ts +2 -1
  511. package/dist/ui/views.js +17 -3
  512. package/package.json +3 -3
  513. package/src/migrations/0074_subagent_tree.sql +50 -0
  514. package/src/migrations/0075_plugin_scope.sql +61 -0
  515. package/src/migrations/0076_skills_created_by_nullable.sql +6 -0
  516. package/src/migrations/0077_scope_requests.sql +52 -0
  517. package/src/migrations/0078_scope_grant_switches.sql +18 -0
  518. package/src/migrations/0079_scope_live_install_switches.sql +19 -0
  519. package/src/migrations/0080_rename_enterprise_admin.sql +18 -0
  520. package/src/migrations/0081_platform_components.sql +129 -0
  521. package/src/migrations/0082_platform_migration.sql +33 -0
  522. package/src/migrations/0083_plugin_scope_sync_failures.sql +15 -0
  523. package/src/migrations/0084_org_owned_items.sql +85 -0
  524. package/src/migrations/0085_agent_templates_phase4.sql +45 -0
  525. package/src/migrations/0086_org_layering.sql +30 -0
  526. package/src/migrations/0087_approval_summary.sql +6 -0
  527. package/src/migrations/0088_environments.sql +80 -0
  528. package/src/migrations/0089_model_kinds_usage.sql +38 -0
  529. package/dist/catalog/upgrade-targets.d.ts +0 -56
  530. package/dist/catalog/upgrade-targets.js +0 -90
  531. package/dist/conversations/sandbox-status.d.ts +0 -24
  532. package/dist/conversations/sandbox-status.js +0 -52
  533. package/dist/extensions/org-config.controller.d.ts +0 -32
  534. package/dist/extensions/org-config.controller.js +0 -70
@@ -6,34 +6,8 @@ import { KernelConfigService } from "../infra/config/kernel-config.service.js";
6
6
  import { KernelDb } from "../infra/database/kernel-db.js";
7
7
  import { LockService } from "../infra/lock/lock.service.js";
8
8
  import type { KernelLogger } from "../log.js";
9
- /** Queue of `usage.report` deliveries (no `:` in the name). */
10
- export declare const USAGE_REPORT_QUEUE = "cap-kernel-usage-report";
11
- /** One job per `usage` event (no `:`: conversation ids are UUIDs, seq is a number). */
12
- export declare const usageReportJobId: (conversationId: string, seq: number) => string;
13
- /** Job data: ids only (the payload is read from the event log when the job runs). */
14
- export interface UsageReportJob {
15
- conversationId: string;
16
- seq: number;
17
- /** Plugins not yet succeeded; absent = every subscriber (decided on the first attempt). */
18
- pending?: string[];
19
- /**
20
- * Targets dropped so far (plugin → why), accumulated across attempts (m-2): when the job would
21
- * otherwise complete it fails naming them, and `pending` is then exactly these plugins, so a
22
- * manual retry reaches only them (m-1). A later delivery to one of them removes it.
23
- */
24
- dropped?: Record<string, string>;
25
- }
26
- /** First attempt plus 5 retries (F11). */
27
- export declare const USAGE_REPORT_ATTEMPTS = 6;
28
- /** Retry backoff: 2 s, doubling (2, 4, 8, 16, 32 s). */
29
- export declare const USAGE_REPORT_BACKOFF_MS = 2000;
30
- /** The delivery retry policy of {@link UsageReporter}: attempts and the first exponential backoff. */
31
- export interface UsageReportRetry {
32
- attempts: number;
33
- backoffMs: number;
34
- }
35
- /** Optional provider: the {@link UsageReportRetry} instead of the defaults above (tests). */
36
- export declare const USAGE_REPORT_RETRY: unique symbol;
9
+ import { type UsageReportJob, type UsageReportRetry } from "./usage-report-jobs.js";
10
+ export { ModelUsageJobs, modelUsageJobId, queryUsageSubscribers, USAGE_REPORT_ATTEMPTS, USAGE_REPORT_BACKOFF_MS, USAGE_REPORT_QUEUE, USAGE_REPORT_RETRY, type UsageReportJob, UsageReportJobsModule, type UsageReportRetry, usageReportJobId, } from "./usage-report-jobs.js";
37
11
  /** The sweeper's cron job name (no `:`; every minute, once across replicas). */
38
12
  export declare const USAGE_SWEEP_JOB = "usage-report-sweep";
39
13
  /** The maintenance scheduler the sweep ran on before it became a `@LockedCron` (retired). */
@@ -46,13 +20,6 @@ export declare const USAGE_SWEEP_LAG_MS = 30000;
46
20
  * (`hooks.usageReportKeepHours` ≥ 1 h), so re-enqueued events dedupe on the kept job.
47
21
  */
48
22
  export declare const USAGE_SWEEP_OVERLAP_MS: number;
49
- /**
50
- * Plugins that subscribe to `usage.report` according to deployment state: an approved permission
51
- * snapshot that declares the `usage.report` hook, for a plugin the deployment still knows: an enabled
52
- * install, or a config-declared plugin with a replica status row that is not `unloaded`. With `orgId`, only plugins
53
- * the organization enabled (org config rows and required bootstrap plugins).
54
- */
55
- export declare function queryUsageSubscribers(db: KernelSchemaDb, orgId?: string): Promise<Set<string>>;
56
23
  /**
57
24
  * Of `plugins`, those that are **definitely** unservable right now (I-2, N-3): live replicas report
58
25
  * them (a `extension_replica_status` row with a heartbeat newer than `staleSeconds`), no live row is
@@ -91,11 +58,18 @@ export declare function narrowPending(stored: readonly string[] | undefined, fai
91
58
  * most 100 000. Each call runs through the instance's `inflight.run`, limited by `hooks.timeoutMs`;
92
59
  * when this replica stops, in-flight calls are aborted and the job goes back to the queue without
93
60
  * using up an attempt.
94
- * Handlers must be idempotent by `eventId` (`<conversationId>/<seq>`). Nothing is written to the event
95
- * log (never model-visible). Compaction calls log usage too (`purpose: "compaction"`) and are reported,
61
+ * Handlers must be idempotent by `eventId` (`<conversationId>/<seq>`, or a `model_usage` row id).
62
+ * Nothing is written to the event log (never model-visible). Compaction calls log usage too (`purpose: "compaction"`) and are reported,
96
63
  * as are conversation title calls (`purpose: "title"`, no run: `runId` is "") and `WebFetch`
97
64
  * extraction calls (`purpose: "web_fetch"`).
98
65
  * Single-step eval replays and judge requests log no usage: not reported (M7).
66
+ * - **Model usage outside conversations** (spec B §5.4): each `ctx.models.embed` call writes a
67
+ * `model_usage` row; on its `model_usage.recorded` event `ModelUsageJobs` (`usage-report-jobs.ts`)
68
+ * enqueues job `usage-model-<rowId>` (only while some plugin subscribes); the payload
69
+ * (`purpose: "embedding"`, `eventId` = the row id, the calling `extension`, no conversation fields)
70
+ * is read from the row when the job runs, and the row's `reported_at` is set once nothing is left
71
+ * to deliver; a job that gives up after its last attempt sets `report_failed_at`. The sweep
72
+ * re-enqueues recent rows that are neither (see {@link sweep}).
99
73
  */
100
74
  export declare class UsageReporter {
101
75
  private readonly kdb;
@@ -151,11 +125,21 @@ export declare class UsageReporter {
151
125
  /**
152
126
  * One sweep (R13): re-enqueues the `usage` events created in `[watermark - overlap, now - lag]` in
153
127
  * pages, then advances the watermark to `now - lag`. With no subscriber it only advances. The first
154
- * sweep starts at `now - lag - overlap`. Returns the number of events offered to the queue.
128
+ * sweep starts at `now - lag - overlap`. Also re-enqueues the `model_usage` rows of the same
129
+ * window that are neither reported nor given up (spec B §5.4),
130
+ * or, with no subscriber, marks those rows reported (nobody to deliver to). Returns the number of
131
+ * events and rows offered to the queue.
155
132
  */
156
133
  sweep(opts?: {
157
134
  now?: number;
158
135
  }): Promise<number>;
136
+ /**
137
+ * The `model_usage` half of {@link sweep}: rows neither reported nor given up that occurred in
138
+ * the same window as the events (`[watermark - overlap, to]`), oldest first. Bounded like the
139
+ * event sweep, so a row whose job failed for good is never offered again, even after its failed
140
+ * job left Redis (no repeated backlog, no second delivery to plugins already served).
141
+ */
142
+ private sweepModelUsage;
159
143
  /**
160
144
  * Starts consuming (worker role only): `worker` is the `@Processor` worker of
161
145
  * {@link USAGE_REPORT_QUEUE} (built with the run queue's job lock and stalled detection).
@@ -170,6 +154,17 @@ export declare class UsageReporter {
170
154
  * closes. The queue itself closes with the application.
171
155
  */
172
156
  stop(): Promise<void>;
157
+ /** The payload of a job: a `usage` event's or a `model_usage` row's; null when it is gone. */
158
+ private payloadOfJob;
159
+ /**
160
+ * The payload of one `model_usage` row (spec B §5.4): purpose `embedding`, the calling extension,
161
+ * no conversation fields; `eventId` is the row id. Null when the row no longer exists.
162
+ */
163
+ private payloadOfUsage;
164
+ /** A `model_usage` job is done (delivered, or nothing left to deliver to): marks the row. */
165
+ private markReported;
166
+ /** A `model_usage` job gave up after its last attempt: the sweep never offers the row again. */
167
+ private markFailed;
173
168
  /** The payload of one usage event, read from the log; null when the event no longer exists. */
174
169
  private payloadOf;
175
170
  /**
@@ -9,40 +9,22 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
9
9
  };
10
10
  import { getQueueToken } from "@nestjs/bullmq";
11
11
  import { Inject, Injectable, Module, Optional } from "@nestjs/common";
12
- import { DelayedError, Job, UnrecoverableError, } from "bullmq";
12
+ import { DelayedError, Job, UnrecoverableError } from "bullmq";
13
13
  import { sql } from "kysely";
14
- import { enabledExtensionsQuery } from "../extensions/enabled.js";
15
14
  import { ExtensionsModule } from "../extensions/extensions.module.js";
16
- import { deepFreeze, errMsg } from "../extensions/hooks.js";
15
+ import { deepFreeze, errMsg, HookNeedsConfigError, } from "../extensions/hooks.js";
17
16
  import { ExtensionHost } from "../extensions/host.js";
18
17
  import { STALE_RECONCILE_PERIODS } from "../extensions/lifecycle-topics.js";
19
18
  import { KernelConfigService } from "../infra/config/kernel-config.service.js";
20
19
  import { KernelDb } from "../infra/database/kernel-db.js";
21
20
  import { LockService } from "../infra/lock/lock.service.js";
22
- import { QueueModule } from "../infra/queue/queue.module.js";
23
21
  import { LockedCron } from "../infra/schedule/locked-cron.decorator.js";
24
22
  import { KERNEL_LOGGER } from "../infra/tokens.js";
25
- /** Queue of `usage.report` deliveries (no `:` in the name). */
26
- export const USAGE_REPORT_QUEUE = "cap-kernel-usage-report";
27
- /** One job per `usage` event (no `:`: conversation ids are UUIDs, seq is a number). */
28
- export const usageReportJobId = (conversationId, seq) => `usage-${conversationId}-${seq}`;
29
- /** First attempt plus 5 retries (F11). */
30
- export const USAGE_REPORT_ATTEMPTS = 6;
31
- /** Retry backoff: 2 s, doubling (2, 4, 8, 16, 32 s). */
32
- export const USAGE_REPORT_BACKOFF_MS = 2000;
33
- /** Optional provider: the {@link UsageReportRetry} instead of the defaults above (tests). */
34
- export const USAGE_REPORT_RETRY = Symbol("USAGE_REPORT_RETRY");
35
- /** Failed jobs (given up) are kept for inspection, at most {@link KEEP_FAILED_MAX} of them. */
36
- const KEEP_FAILED_S = 7 * 86_400;
37
- /** Upper bound on kept failed jobs (I-2): a long outage of a billing endpoint cannot grow Redis. */
38
- const KEEP_FAILED_MAX = 100_000;
23
+ import { deliveryRowOfChildRun } from "./subagents/child.js";
24
+ import { modelUsageJobId, queryUsageSubscribers, USAGE_REPORT_ATTEMPTS, USAGE_REPORT_BACKOFF_MS, USAGE_REPORT_JOB, USAGE_REPORT_QUEUE, USAGE_REPORT_RETRY, UsageReportJobsModule, usageReportJobId, usageReportJobOpts, } from "./usage-report-jobs.js";
25
+ export { ModelUsageJobs, modelUsageJobId, queryUsageSubscribers, USAGE_REPORT_ATTEMPTS, USAGE_REPORT_BACKOFF_MS, USAGE_REPORT_QUEUE, USAGE_REPORT_RETRY, UsageReportJobsModule, usageReportJobId, } from "./usage-report-jobs.js";
39
26
  /** Warnings about a plugin that cannot take deliveries are logged at most once per this window. */
40
27
  const WARN_WINDOW_MS = 60_000;
41
- /**
42
- * Upper bound on kept finished jobs (Redis memory). At the default retention it only bites above
43
- * ~1.1 usage events per second sustained for a day; dedupe needs the jobs only for the sweeper overlap.
44
- */
45
- const KEEP_COMPLETED_MAX = 100_000;
46
28
  /** The sweeper's cron job name (no `:`; every minute, once across replicas). */
47
29
  export const USAGE_SWEEP_JOB = "usage-report-sweep";
48
30
  /** The maintenance scheduler the sweep ran on before it became a `@LockedCron` (retired). */
@@ -56,38 +38,6 @@ export const USAGE_SWEEP_LAG_MS = 30_000;
56
38
  */
57
39
  export const USAGE_SWEEP_OVERLAP_MS = 10 * 60_000;
58
40
  const SWEEP_PAGE = 500;
59
- const JOB = "usage-report";
60
- /**
61
- * Plugins that subscribe to `usage.report` according to deployment state: an approved permission
62
- * snapshot that declares the `usage.report` hook, for a plugin the deployment still knows: an enabled
63
- * install, or a config-declared plugin with a replica status row that is not `unloaded`. With `orgId`, only plugins
64
- * the organization enabled (org config rows and required bootstrap plugins).
65
- */
66
- export async function queryUsageSubscribers(db, orgId) {
67
- let q = db
68
- .selectFrom("extension_permission_snapshots as s")
69
- .select("s.plugin")
70
- .where(sql `s.permissions -> 'permissions' -> 'hooks' ? 'usage.report'`)
71
- .where((eb) => eb.or([
72
- eb.exists(eb
73
- .selectFrom("extension_installs as i")
74
- .select(sql `1`.as("one"))
75
- .whereRef("i.name", "=", "s.plugin")
76
- .where("i.desired_state", "=", "enabled")),
77
- // config-declared plugins still declared (and not unloaded) on some replica; installs are
78
- // covered by desired_state above (their replica rows linger as `unloaded` when disabled)
79
- eb.exists(eb
80
- .selectFrom("extension_replica_status as r")
81
- .select(sql `1`.as("one"))
82
- .whereRef("r.plugin", "=", "s.plugin")
83
- .where("r.source", "=", "config")
84
- .where("r.state", "<>", "unloaded")),
85
- ]));
86
- if (orgId !== undefined) {
87
- q = q.where("s.plugin", "in", enabledExtensionsQuery(db, orgId));
88
- }
89
- return new Set((await q.execute()).map((r) => r.plugin));
90
- }
91
41
  /**
92
42
  * Of `plugins`, those that are **definitely** unservable right now (I-2, N-3): live replicas report
93
43
  * them (a `extension_replica_status` row with a heartbeat newer than `staleSeconds`), no live row is
@@ -127,6 +77,10 @@ class Undeliverable extends Error {
127
77
  this.name = "Undeliverable";
128
78
  }
129
79
  }
80
+ /** A job's identity: its `usage` event or its `model_usage` row. */
81
+ const keyOf = (d) => d.usageId !== undefined
82
+ ? { usageId: d.usageId }
83
+ : { conversationId: d.conversationId, seq: d.seq };
130
84
  /**
131
85
  * The next `pending` set (m-2 fence): plugins that failed now, narrowed to what the stored job data
132
86
  * still lists. A plugin another (stalled-over) execution already delivered never comes back.
@@ -158,11 +112,18 @@ export function narrowPending(stored, failed) {
158
112
  * most 100 000. Each call runs through the instance's `inflight.run`, limited by `hooks.timeoutMs`;
159
113
  * when this replica stops, in-flight calls are aborted and the job goes back to the queue without
160
114
  * using up an attempt.
161
- * Handlers must be idempotent by `eventId` (`<conversationId>/<seq>`). Nothing is written to the event
162
- * log (never model-visible). Compaction calls log usage too (`purpose: "compaction"`) and are reported,
115
+ * Handlers must be idempotent by `eventId` (`<conversationId>/<seq>`, or a `model_usage` row id).
116
+ * Nothing is written to the event log (never model-visible). Compaction calls log usage too (`purpose: "compaction"`) and are reported,
163
117
  * as are conversation title calls (`purpose: "title"`, no run: `runId` is "") and `WebFetch`
164
118
  * extraction calls (`purpose: "web_fetch"`).
165
119
  * Single-step eval replays and judge requests log no usage: not reported (M7).
120
+ * - **Model usage outside conversations** (spec B §5.4): each `ctx.models.embed` call writes a
121
+ * `model_usage` row; on its `model_usage.recorded` event `ModelUsageJobs` (`usage-report-jobs.ts`)
122
+ * enqueues job `usage-model-<rowId>` (only while some plugin subscribes); the payload
123
+ * (`purpose: "embedding"`, `eventId` = the row id, the calling `extension`, no conversation fields)
124
+ * is read from the row when the job runs, and the row's `reported_at` is set once nothing is left
125
+ * to deliver; a job that gives up after its last attempt sets `report_failed_at`. The sweep
126
+ * re-enqueues recent rows that are neither (see {@link sweep}).
166
127
  */
167
128
  let UsageReporter = class UsageReporter {
168
129
  kdb;
@@ -225,17 +186,8 @@ let UsageReporter = class UsageReporter {
225
186
  subscribers(orgId) {
226
187
  return queryUsageSubscribers(this.db, orgId);
227
188
  }
228
- jobOpts(conversationId, seq) {
229
- return {
230
- jobId: usageReportJobId(conversationId, seq),
231
- attempts: this.retry.attempts,
232
- backoff: { type: "exponential", delay: this.retry.backoffMs },
233
- removeOnComplete: {
234
- age: this.config.get().hooks.usageReportKeepHours * 3600,
235
- count: KEEP_COMPLETED_MAX,
236
- },
237
- removeOnFail: { age: KEEP_FAILED_S, count: KEEP_FAILED_MAX },
238
- };
189
+ jobOpts(jobId) {
190
+ return usageReportJobOpts(jobId, this.retry, this.config.get().hooks.usageReportKeepHours);
239
191
  }
240
192
  /**
241
193
  * Enqueues the delivery of one `usage` event. Returns without a job when no plugin subscribes.
@@ -251,7 +203,7 @@ let UsageReporter = class UsageReporter {
251
203
  try {
252
204
  if ((await this.subscribers()).size === 0)
253
205
  return;
254
- await this.queue.add(JOB, { conversationId, seq }, this.jobOpts(conversationId, seq));
206
+ await this.queue.add(USAGE_REPORT_JOB, { conversationId, seq }, this.jobOpts(usageReportJobId(conversationId, seq)));
255
207
  }
256
208
  catch (err) {
257
209
  this.log.warn("cannot enqueue usage report", { conversationId, seq, err });
@@ -260,7 +212,10 @@ let UsageReporter = class UsageReporter {
260
212
  /**
261
213
  * One sweep (R13): re-enqueues the `usage` events created in `[watermark - overlap, now - lag]` in
262
214
  * pages, then advances the watermark to `now - lag`. With no subscriber it only advances. The first
263
- * sweep starts at `now - lag - overlap`. Returns the number of events offered to the queue.
215
+ * sweep starts at `now - lag - overlap`. Also re-enqueues the `model_usage` rows of the same
216
+ * window that are neither reported nor given up (spec B §5.4),
217
+ * or, with no subscriber, marks those rows reported (nobody to deliver to). Returns the number of
218
+ * events and rows offered to the queue.
264
219
  */
265
220
  async sweep(opts = {}) {
266
221
  // bounds and keyset as full-precision timestamp text (microseconds), computed with the DB clock
@@ -277,7 +232,8 @@ let UsageReporter = class UsageReporter {
277
232
  .executeTakeFirst();
278
233
  const watermark = row?.watermark ?? to;
279
234
  let offered = 0;
280
- if ((await this.subscribers()).size > 0) {
235
+ const subscribed = (await this.subscribers()).size > 0;
236
+ if (subscribed) {
281
237
  let after;
282
238
  for (;;) {
283
239
  let q = this.db
@@ -297,9 +253,9 @@ let UsageReporter = class UsageReporter {
297
253
  .execute();
298
254
  if (page.length > 0) {
299
255
  await this.queue.addBulk(page.map((r) => ({
300
- name: JOB,
256
+ name: USAGE_REPORT_JOB,
301
257
  data: { conversationId: r.conversation_id, seq: Number(r.seq) },
302
- opts: this.jobOpts(r.conversation_id, Number(r.seq)),
258
+ opts: this.jobOpts(usageReportJobId(r.conversation_id, Number(r.seq))),
303
259
  })));
304
260
  offered += page.length;
305
261
  }
@@ -309,6 +265,7 @@ let UsageReporter = class UsageReporter {
309
265
  after = { at: last.at, conv: last.conversation_id, seq: String(last.seq) };
310
266
  }
311
267
  }
268
+ offered += await this.sweepModelUsage(watermark, to, subscribed);
312
269
  await this.db
313
270
  .insertInto("usage_report_sweep")
314
271
  .values({ id: 1, watermark: sql `${to}::timestamptz` })
@@ -319,6 +276,51 @@ let UsageReporter = class UsageReporter {
319
276
  .execute();
320
277
  return offered;
321
278
  }
279
+ /**
280
+ * The `model_usage` half of {@link sweep}: rows neither reported nor given up that occurred in
281
+ * the same window as the events (`[watermark - overlap, to]`), oldest first. Bounded like the
282
+ * event sweep, so a row whose job failed for good is never offered again, even after its failed
283
+ * job left Redis (no repeated backlog, no second delivery to plugins already served).
284
+ */
285
+ async sweepModelUsage(watermark, to, subscribed) {
286
+ if (!subscribed) {
287
+ await this.db
288
+ .updateTable("model_usage")
289
+ .set({ reported_at: sql `now()` })
290
+ .where("reported_at", "is", null)
291
+ .where(sql `occurred_at <= ${to}::timestamptz`)
292
+ .execute();
293
+ return 0;
294
+ }
295
+ let offered = 0;
296
+ let after;
297
+ for (;;) {
298
+ let q = this.db
299
+ .selectFrom("model_usage")
300
+ .select(["id", sql `occurred_at::text`.as("at")])
301
+ .where("reported_at", "is", null)
302
+ .where("report_failed_at", "is", null)
303
+ .where(sql `occurred_at >= ${watermark}::timestamptz - make_interval(secs => ${USAGE_SWEEP_OVERLAP_MS / 1000})`)
304
+ .where(sql `occurred_at <= ${to}::timestamptz`);
305
+ if (after) {
306
+ q = q.where(sql `(occurred_at, id) > (${after.at}::timestamptz, ${after.id}::uuid)`);
307
+ }
308
+ const page = await q.orderBy("occurred_at").orderBy("id").limit(SWEEP_PAGE).execute();
309
+ if (page.length > 0) {
310
+ await this.queue.addBulk(page.map((r) => ({
311
+ name: USAGE_REPORT_JOB,
312
+ data: { usageId: r.id },
313
+ opts: this.jobOpts(modelUsageJobId(r.id)),
314
+ })));
315
+ offered += page.length;
316
+ }
317
+ const last = page.at(-1);
318
+ if (!last || page.length < SWEEP_PAGE)
319
+ break;
320
+ after = { at: last.at, id: last.id };
321
+ }
322
+ return offered;
323
+ }
322
324
  /**
323
325
  * Starts consuming (worker role only): `worker` is the `@Processor` worker of
324
326
  * {@link USAGE_REPORT_QUEUE} (built with the run queue's job lock and stalled detection).
@@ -343,14 +345,17 @@ let UsageReporter = class UsageReporter {
343
345
  const final = j.attemptsMade >= (j.opts.attempts ?? 1);
344
346
  const fields = {
345
347
  jobId: j.id,
346
- conversationId: j.data.conversationId,
347
- seq: j.data.seq,
348
+ ...(j.data.usageId !== undefined
349
+ ? { usageId: j.data.usageId }
350
+ : { conversationId: j.data.conversationId, seq: j.data.seq }),
348
351
  pending: j.data.pending,
349
352
  attempt: j.attemptsMade,
350
353
  error: err.message,
351
354
  };
352
- if (final)
355
+ if (final) {
353
356
  this.log.error("usage report given up after retries", fields);
357
+ void this.markFailed(j.data);
358
+ }
354
359
  else
355
360
  this.log.warn("usage report attempt failed; retrying", fields);
356
361
  }
@@ -365,14 +370,73 @@ let UsageReporter = class UsageReporter {
365
370
  this.worker = undefined;
366
371
  await w?.close().catch(() => { });
367
372
  }
373
+ /** The payload of a job: a `usage` event's or a `model_usage` row's; null when it is gone. */
374
+ payloadOfJob(data) {
375
+ return data.usageId !== undefined
376
+ ? this.payloadOfUsage(data.usageId)
377
+ : this.payloadOf(data.conversationId, data.seq);
378
+ }
379
+ /**
380
+ * The payload of one `model_usage` row (spec B §5.4): purpose `embedding`, the calling extension,
381
+ * no conversation fields; `eventId` is the row id. Null when the row no longer exists.
382
+ */
383
+ async payloadOfUsage(id) {
384
+ const row = await this.db
385
+ .selectFrom("model_usage")
386
+ .select(["id", "org_id", "extension", "provider", "model", "input_tokens", "occurred_at"])
387
+ .where("id", "=", id)
388
+ .executeTakeFirst();
389
+ if (!row)
390
+ return null;
391
+ return {
392
+ eventId: row.id,
393
+ purpose: "embedding",
394
+ orgId: row.org_id,
395
+ extension: row.extension,
396
+ provider: row.provider,
397
+ model: row.model,
398
+ usage: {
399
+ inputTokens: row.input_tokens,
400
+ outputTokens: 0,
401
+ cacheReadTokens: 0,
402
+ cacheWriteTokens: 0,
403
+ },
404
+ occurredAt: new Date(row.occurred_at).toISOString(),
405
+ };
406
+ }
407
+ /** A `model_usage` job is done (delivered, or nothing left to deliver to): marks the row. */
408
+ async markReported(data) {
409
+ if (data.usageId === undefined)
410
+ return;
411
+ await this.db
412
+ .updateTable("model_usage")
413
+ .set({ reported_at: sql `now()` })
414
+ .where("id", "=", data.usageId)
415
+ .where("reported_at", "is", null)
416
+ .execute();
417
+ }
418
+ /** A `model_usage` job gave up after its last attempt: the sweep never offers the row again. */
419
+ async markFailed(data) {
420
+ if (data.usageId === undefined)
421
+ return;
422
+ try {
423
+ await this.db
424
+ .updateTable("model_usage")
425
+ .set({ report_failed_at: sql `now()` })
426
+ .where("id", "=", data.usageId)
427
+ .where("reported_at", "is", null)
428
+ .execute();
429
+ }
430
+ catch (err) {
431
+ this.log.warn("cannot mark a model usage report as given up", { usageId: data.usageId, err });
432
+ }
433
+ }
368
434
  /** The payload of one usage event, read from the log; null when the event no longer exists. */
369
435
  async payloadOf(conversationId, seq) {
370
436
  const row = await this.db
371
437
  .selectFrom("conversation_events as e")
372
438
  .innerJoin("conversations as c", "c.id", "e.conversation_id")
373
439
  .leftJoin("runs as r", "r.id", "e.run_id")
374
- // a sub-agent's run: its dispatch says where it was dispatched from (spec §11)
375
- .leftJoin("subagent_dispatches as sd", "sd.child_run_id", "e.run_id")
376
440
  .select([
377
441
  "e.payload",
378
442
  "e.run_id",
@@ -383,9 +447,6 @@ let UsageReporter = class UsageReporter {
383
447
  "c.account_id",
384
448
  "c.kind",
385
449
  "r.trigger_account_id",
386
- "sd.parent_conversation_id",
387
- "sd.parent_run_id",
388
- "sd.parent_call_id",
389
450
  ])
390
451
  .where("e.conversation_id", "=", conversationId)
391
452
  .where("e.seq", "=", String(seq))
@@ -393,6 +454,11 @@ let UsageReporter = class UsageReporter {
393
454
  if (row?.type !== "usage")
394
455
  return null;
395
456
  const p = row.payload;
457
+ // a sub-agent's run: where it was dispatched from (spec §11), its own dispatch, else (a wake
458
+ // run nobody dispatched, agent map spec §5.3) its conversation's latest one
459
+ const parent = row.kind === "subagent" && row.run_id !== null
460
+ ? await deliveryRowOfChildRun(this.db, row.run_id)
461
+ : null;
396
462
  return {
397
463
  eventId: `${conversationId}/${seq}`,
398
464
  purpose: p.purpose ?? "step",
@@ -403,13 +469,11 @@ let UsageReporter = class UsageReporter {
403
469
  // a sub-agent's calls report "chat" (spec §11: the SDK union is not widened)
404
470
  conversationKind: row.kind === "eval" ? "eval" : "chat",
405
471
  runId: row.run_id ?? "",
406
- ...(row.parent_conversation_id !== null &&
407
- row.parent_run_id !== null &&
408
- row.parent_call_id !== null && {
472
+ ...(parent !== null && {
409
473
  parent: {
410
- conversationId: row.parent_conversation_id,
411
- runId: row.parent_run_id,
412
- callId: row.parent_call_id,
474
+ conversationId: parent.parentConversationId,
475
+ runId: parent.parentRunId,
476
+ callId: parent.parentCallId,
413
477
  },
414
478
  }),
415
479
  provider: p.provider,
@@ -436,8 +500,7 @@ let UsageReporter = class UsageReporter {
436
500
  const allowed = stored === undefined ? undefined : [...stored, ...Object.keys(storedDropped)];
437
501
  const keep = [...dropped].filter(([p]) => allowed === undefined || allowed.includes(p));
438
502
  const out = {
439
- conversationId: j.data.conversationId,
440
- seq: j.data.seq,
503
+ ...keyOf(j.data),
441
504
  pending: narrowPending(allowed, next),
442
505
  ...(keep.length > 0 && { dropped: Object.fromEntries(keep) }),
443
506
  };
@@ -446,22 +509,24 @@ let UsageReporter = class UsageReporter {
446
509
  }
447
510
  /** One delivery job (the `@Processor` of {@link USAGE_REPORT_QUEUE} calls it). */
448
511
  async process(j, token) {
449
- const { conversationId, seq } = j.data;
450
- const payload = await this.payloadOf(conversationId, seq);
512
+ const payload = await this.payloadOfJob(j.data);
513
+ // conversation (or org) deleted meanwhile: nothing to report
451
514
  if (payload === null)
452
- return; // conversation deleted meanwhile: nothing to report
515
+ return;
453
516
  const subscribers = await this.subscribers(payload.orgId);
454
517
  if (j.data.pending === undefined) {
455
518
  // first attempt: the targets come from deployment state, recorded so later attempts (on any
456
519
  // replica) deliver exactly the plugins that have not succeeded yet
457
520
  const targets = [...subscribers];
458
- await j.updateData({ conversationId, seq, pending: targets });
521
+ await j.updateData({ ...keyOf(j.data), pending: targets });
459
522
  j.data.pending = targets;
460
523
  }
461
524
  // plugins the organization disabled meanwhile are dropped (not a failure)
462
525
  const targets = (j.data.pending ?? []).filter((p) => subscribers.has(p));
463
- if (targets.length === 0)
526
+ if (targets.length === 0) {
527
+ await this.markReported(j.data);
464
528
  return;
529
+ }
465
530
  const byPlugin = new Map();
466
531
  for (const h of this.hooks.handlers("usage.report")) {
467
532
  byPlugin.set(h.plugin, [...(byPlugin.get(h.plugin) ?? []), h.handler]);
@@ -493,6 +558,12 @@ let UsageReporter = class UsageReporter {
493
558
  notHere.push(plugin);
494
559
  return;
495
560
  }
561
+ // layering spec A §6: the extension's effective config is not valid in this organization, so
562
+ // it is not called there (an observe hook skipped); dropped, not retried
563
+ if (r.reason instanceof HookNeedsConfigError) {
564
+ dropped.set(plugin, "needs configuration in this organization");
565
+ return;
566
+ }
496
567
  failed.push(plugin);
497
568
  if (!this.stopping.signal.aborted) {
498
569
  this.log.warn("usage.report delivery to a plugin failed", {
@@ -534,6 +605,8 @@ let UsageReporter = class UsageReporter {
534
605
  // m-1: pending = the dropped plugins only, so a manual retry reaches them and never the
535
606
  // plugins already served
536
607
  await this.writePending(j, [...allDropped.keys()], allDropped);
608
+ // delivered to every target still servable (a definite drop is final too): the row is done
609
+ await this.markReported(j.data);
537
610
  const traced = new Map([...allDropped].filter(([p]) => j.data.dropped?.[p] !== undefined));
538
611
  if (traced.size === 0)
539
612
  return;
@@ -644,9 +717,9 @@ let UsageReportModule = class UsageReportModule {
644
717
  };
645
718
  UsageReportModule = __decorate([
646
719
  Module({
647
- imports: [ExtensionsModule, QueueModule.registerQueue(USAGE_REPORT_QUEUE)],
720
+ imports: [ExtensionsModule, UsageReportJobsModule],
648
721
  providers: [UsageReporter],
649
- exports: [UsageReporter],
722
+ exports: [UsageReporter, UsageReportJobsModule],
650
723
  })
651
724
  ], UsageReportModule);
652
725
  export { UsageReportModule };