@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
@@ -0,0 +1,127 @@
1
+ import type { z } from "zod";
2
+ import { type Keyring } from "../ctx/secrets.js";
3
+ import { CacheService } from "../infra/cache/cache.service.js";
4
+ import { KernelConfigService } from "../infra/config/kernel-config.service.js";
5
+ import { KernelDb } from "../infra/database/kernel-db.js";
6
+ import { TransactionHost } from "../infra/database/transaction-host.js";
7
+ import type { KernelLogger } from "../log.js";
8
+ import { type ConfigIssue } from "./config-issues.js";
9
+ import { ExtensionInstalls } from "./installs.js";
10
+ import { type FieldLevel } from "./org-levels.js";
11
+ import { ExtensionRegistry } from "./registry.js";
12
+ type Obj = Record<string, unknown>;
13
+ /**
14
+ * Why an org-bound call is not made (spec A §6): the extension's effective config for the org is
15
+ * not valid. Model-visible as a tool's unavailable reason (English).
16
+ */
17
+ export declare const NEEDS_CONFIG_REASON = "needs configuration in this organization";
18
+ /** The kernel's own secrets namespace (`kernel` is a reserved plugin name). */
19
+ export declare const OVERRIDE_SECRETS_NAMESPACE = "kernel";
20
+ /**
21
+ * Where a copy's secret field lives in `capybara.secrets` (under the org): a namespace of its own,
22
+ * distinct from the org-only `plugin-config:<plugin>:<path>` (spec A §5.8).
23
+ */
24
+ export declare const overrideSecretKey: (plugin: string, path: string) => string;
25
+ /**
26
+ * The effective deployment config of an extension for an org (spec A §6): `ok` with the config
27
+ * and where its overridable fields come from, or the validation issues (paths only, no values).
28
+ */
29
+ export type EffectiveConfig = {
30
+ ok: true;
31
+ config: unknown;
32
+ source: "platform" | "copy";
33
+ }
34
+ /** `notRunning`: the extension is not running on this replica (not a configuration problem). */
35
+ | {
36
+ ok: false;
37
+ issues: ConfigIssue[];
38
+ notRunning?: true;
39
+ };
40
+ /** An org's stored copy: its non-secret values and its secrets by field dot path. */
41
+ export interface StoredCopy {
42
+ config: Obj;
43
+ secrets: Record<string, unknown>;
44
+ }
45
+ /** The secret leaf paths of a deployment schema. */
46
+ export declare function secretLeafPaths(schema: z.ZodTypeAny): string[];
47
+ /** The secret leaf paths under the `override` top-level keys (the secrets a copy may hold). */
48
+ export declare function overrideSecretPaths(schema: z.ZodTypeAny, levels?: Map<string, FieldLevel>): string[];
49
+ /**
50
+ * The platform's non-secret values of the `override` keys: what a new copy starts from (spec A
51
+ * §5.4, platform secrets never enter a copy).
52
+ */
53
+ export declare function platformOverrideValues(schema: z.ZodTypeAny, platform: unknown): Obj;
54
+ /**
55
+ * The deployment config an org with a copy runs with, before validation (spec A §5.4): the
56
+ * platform's values of the hidden and read-only keys, and for each `override` key the copy's value
57
+ * (its non-secret part and its own secrets). An `override` key the copy does not hold (one that
58
+ * became overridable after the copy was made) takes the platform's value with every secret leaf
59
+ * removed: a copy never falls back to a platform secret, required or not. Copy values of keys that
60
+ * are no longer `override` are ignored.
61
+ */
62
+ export declare function mergeCopy(schema: z.ZodTypeAny, platform: unknown, copy: StoredCopy): Obj;
63
+ /**
64
+ * The effective extension config of an org (spec A §5.3, §5.4, §6): the platform's deployment
65
+ * config while the org follows it, or the platform's values with the org's copy applied to the
66
+ * overridable fields. Every org-bound call takes its config from here.
67
+ *
68
+ * Following orgs get this replica's running config (`ctx.config`), so a platform change reaches
69
+ * them as soon as the instance has it. For a copy, the platform's raw (unparsed) deployment config
70
+ * and the copy's raw values are merged and parsed once, so a schema transform runs exactly once.
71
+ * The org half (the copy row and its secrets) is cached in Redis through `@Cacheable`, sealed with
72
+ * a key derived from the master keyring so no secret sits in Redis in clear, under a per-(org,
73
+ * plugin) generation token that every copy write replaces after its commit: a read that started
74
+ * before the write can only cache under the old token, which nobody reads any more. No
75
+ * in-process state.
76
+ *
77
+ * It reads the running instances from the {@link ExtensionRegistry} and the raw platform config
78
+ * from the install records (not through the host), so the host can inject it for its hook
79
+ * dispatcher.
80
+ */
81
+ export declare class EffectiveConfigs {
82
+ private readonly kdb;
83
+ readonly txHost: TransactionHost;
84
+ readonly cacheService: CacheService;
85
+ private readonly keyring;
86
+ private readonly registry;
87
+ private readonly installs;
88
+ private readonly kernelConfig;
89
+ /** Secret values of a copy read here are masked in the logs. */
90
+ private readonly log;
91
+ constructor(kdb: KernelDb, txHost: TransactionHost, cacheService: CacheService, keyring: Keyring, registry: Pick<ExtensionRegistry, "current">, installs: Pick<ExtensionInstalls, "effectiveDeploymentConfig">, kernelConfig: Pick<KernelConfigService, "get">,
92
+ /** Secret values of a copy read here are masked in the logs. */
93
+ log: KernelLogger);
94
+ private get db();
95
+ /**
96
+ * The effective config of `plugin` for `orgId`. Following: the running platform config, `ok:
97
+ * false` when it leaves a required overridable field empty (the host loaded it with those
98
+ * fields optional, so that is the only way the full schema can refuse it). Copy: the platform's
99
+ * raw config with the copy applied ({@link mergeCopy}), parsed once with the full schema. An
100
+ * extension not running on this replica -> `ok: false`, `notRunning`, with a root issue.
101
+ */
102
+ get(orgId: string, plugin: string): Promise<EffectiveConfig>;
103
+ /** The org's copy (decrypted), or undefined while it follows the platform. */
104
+ copyOf(orgId: string, plugin: string): Promise<StoredCopy | undefined>;
105
+ /**
106
+ * Makes every cached copy of (org, plugin) unreachable: a new generation token, and the entry of
107
+ * the old one deleted. Call it after the write committed (`afterCommit`), never inside it.
108
+ */
109
+ invalidate(orgId: string, plugin: string): Promise<void>;
110
+ /** Keyed by the generation token read just before the PG read. */
111
+ private cachedCopy;
112
+ /**
113
+ * The copy row and its secrets from one snapshot (joins the caller's transaction, so a write
114
+ * sees what it just wrote).
115
+ */
116
+ private readCopy;
117
+ /**
118
+ * The number of orgs (not deleted) where the extension is on and has no valid effective config
119
+ * (spec A §5.4a). Following orgs share the platform's result; each copy is checked on its own.
120
+ * 0 when the extension is not running on this replica.
121
+ */
122
+ countNeedingConfig(plugin: string): Promise<number>;
123
+ private cacheKey;
124
+ private seal;
125
+ private open;
126
+ }
127
+ export {};
@@ -0,0 +1,368 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
8
+ return function (target, key) { decorator(target, key, paramIndex); }
9
+ };
10
+ import { createCipheriv, createDecipheriv, randomBytes, randomUUID } from "node:crypto";
11
+ import { Inject, Injectable } from "@nestjs/common";
12
+ import { configFields } from "../config/fields.js";
13
+ import { createSecrets } from "../ctx/secrets.js";
14
+ import { CacheService } from "../infra/cache/cache.service.js";
15
+ import { Cacheable } from "../infra/cache/cacheable.decorator.js";
16
+ import { KernelConfigService } from "../infra/config/kernel-config.service.js";
17
+ import { KernelDb } from "../infra/database/kernel-db.js";
18
+ import { currentStore, TransactionHost } from "../infra/database/transaction-host.js";
19
+ import { Transactional } from "../infra/database/transactional.decorator.js";
20
+ import { KERNEL_LOGGER, KEYRING } from "../infra/tokens.js";
21
+ import { toIssues } from "./config-issues.js";
22
+ import { deleteDeep, isObj, setDeep } from "./deployment-config-store.js";
23
+ import { enabledExtensionsByOrg } from "./enabled.js";
24
+ import { ExtensionInstalls } from "./installs.js";
25
+ import { fieldLevels, missingOverridable } from "./org-levels.js";
26
+ import { ExtensionRegistry } from "./registry.js";
27
+ /**
28
+ * Why an org-bound call is not made (spec A §6): the extension's effective config for the org is
29
+ * not valid. Model-visible as a tool's unavailable reason (English).
30
+ */
31
+ export const NEEDS_CONFIG_REASON = "needs configuration in this organization";
32
+ /** The kernel's own secrets namespace (`kernel` is a reserved plugin name). */
33
+ export const OVERRIDE_SECRETS_NAMESPACE = "kernel";
34
+ const OVERRIDE_KEY_PREFIX = "plugin-override:";
35
+ /**
36
+ * Where a copy's secret field lives in `capybara.secrets` (under the org): a namespace of its own,
37
+ * distinct from the org-only `plugin-config:<plugin>:<path>` (spec A §5.8).
38
+ */
39
+ export const overrideSecretKey = (plugin, path) => `${OVERRIDE_KEY_PREFIX}${plugin}:${path}`;
40
+ /** The secret leaf paths of a deployment schema. */
41
+ export function secretLeafPaths(schema) {
42
+ return configFields(schema)
43
+ .filter((f) => f.meta?.secret === true)
44
+ .map((f) => f.path);
45
+ }
46
+ const under = (path, key) => path === key || path.startsWith(`${key}.`);
47
+ /** The secret leaf paths under the `override` top-level keys (the secrets a copy may hold). */
48
+ export function overrideSecretPaths(schema, levels = fieldLevels(schema)) {
49
+ const keys = [...levels].filter(([, l]) => l === "override").map(([k]) => k);
50
+ return secretLeafPaths(schema).filter((p) => keys.some((k) => under(p, k)));
51
+ }
52
+ /**
53
+ * The platform's non-secret values of the `override` keys: what a new copy starts from (spec A
54
+ * §5.4, platform secrets never enter a copy).
55
+ */
56
+ export function platformOverrideValues(schema, platform) {
57
+ const levels = fieldLevels(schema);
58
+ const secrets = secretLeafPaths(schema);
59
+ const out = {};
60
+ for (const [key, level] of levels) {
61
+ if (level !== "override")
62
+ continue;
63
+ const v = isObj(platform) ? platform[key] : undefined;
64
+ if (v === undefined)
65
+ continue;
66
+ const tmp = { [key]: structuredClone(v) };
67
+ for (const p of secrets)
68
+ if (under(p, key))
69
+ deleteDeep(tmp, p);
70
+ if (tmp[key] !== undefined)
71
+ out[key] = tmp[key];
72
+ }
73
+ return out;
74
+ }
75
+ /**
76
+ * The deployment config an org with a copy runs with, before validation (spec A §5.4): the
77
+ * platform's values of the hidden and read-only keys, and for each `override` key the copy's value
78
+ * (its non-secret part and its own secrets). An `override` key the copy does not hold (one that
79
+ * became overridable after the copy was made) takes the platform's value with every secret leaf
80
+ * removed: a copy never falls back to a platform secret, required or not. Copy values of keys that
81
+ * are no longer `override` are ignored.
82
+ */
83
+ export function mergeCopy(schema, platform, copy) {
84
+ const levels = fieldLevels(schema);
85
+ const secrets = secretLeafPaths(schema);
86
+ const plat = isObj(platform) ? platform : {};
87
+ const out = {};
88
+ for (const [key, level] of levels) {
89
+ if (level !== "override") {
90
+ if (plat[key] !== undefined)
91
+ out[key] = structuredClone(plat[key]);
92
+ continue;
93
+ }
94
+ const own = {};
95
+ if (copy.config[key] !== undefined)
96
+ own[key] = structuredClone(copy.config[key]);
97
+ const keySecrets = secrets.filter((p) => under(p, key));
98
+ // a secret never comes from the non-secret part, even a hand-edited one
99
+ for (const p of keySecrets)
100
+ deleteDeep(own, p);
101
+ for (const p of keySecrets) {
102
+ const v = copy.secrets[p];
103
+ if (v !== undefined)
104
+ setDeep(own, p, structuredClone(v));
105
+ }
106
+ if (own[key] !== undefined) {
107
+ out[key] = own[key];
108
+ continue;
109
+ }
110
+ if (plat[key] === undefined)
111
+ continue;
112
+ const fallback = { [key]: structuredClone(plat[key]) };
113
+ for (const p of keySecrets)
114
+ deleteDeep(fallback, p);
115
+ if (fallback[key] !== undefined)
116
+ out[key] = fallback[key];
117
+ }
118
+ return out;
119
+ }
120
+ const CACHE_KEY_INFO = "org-override-cache";
121
+ /** Lifetime of a cached copy (seconds). */
122
+ const COPY_TTL = 300;
123
+ /**
124
+ * Lifetime of a generation token (seconds): far longer than {@link COPY_TTL}, so a copy cached
125
+ * under the token-less generation `"0"` has expired long before a token lapses back to `"0"`.
126
+ */
127
+ const GENERATION_TTL = 86_400;
128
+ /** The Redis key of the cache generation of (org, plugin); a copy write replaces it. */
129
+ const generationKey = (orgId, plugin) => `effective-config-gen:${orgId}:${plugin}`;
130
+ const IV_LEN = 12;
131
+ const TAG_LEN = 16;
132
+ /**
133
+ * The effective extension config of an org (spec A §5.3, §5.4, §6): the platform's deployment
134
+ * config while the org follows it, or the platform's values with the org's copy applied to the
135
+ * overridable fields. Every org-bound call takes its config from here.
136
+ *
137
+ * Following orgs get this replica's running config (`ctx.config`), so a platform change reaches
138
+ * them as soon as the instance has it. For a copy, the platform's raw (unparsed) deployment config
139
+ * and the copy's raw values are merged and parsed once, so a schema transform runs exactly once.
140
+ * The org half (the copy row and its secrets) is cached in Redis through `@Cacheable`, sealed with
141
+ * a key derived from the master keyring so no secret sits in Redis in clear, under a per-(org,
142
+ * plugin) generation token that every copy write replaces after its commit: a read that started
143
+ * before the write can only cache under the old token, which nobody reads any more. No
144
+ * in-process state.
145
+ *
146
+ * It reads the running instances from the {@link ExtensionRegistry} and the raw platform config
147
+ * from the install records (not through the host), so the host can inject it for its hook
148
+ * dispatcher.
149
+ */
150
+ let EffectiveConfigs = class EffectiveConfigs {
151
+ kdb;
152
+ txHost;
153
+ cacheService;
154
+ keyring;
155
+ registry;
156
+ installs;
157
+ kernelConfig;
158
+ log;
159
+ constructor(kdb, txHost, cacheService, keyring, registry, installs, kernelConfig,
160
+ /** Secret values of a copy read here are masked in the logs. */
161
+ log) {
162
+ this.kdb = kdb;
163
+ this.txHost = txHost;
164
+ this.cacheService = cacheService;
165
+ this.keyring = keyring;
166
+ this.registry = registry;
167
+ this.installs = installs;
168
+ this.kernelConfig = kernelConfig;
169
+ this.log = log;
170
+ }
171
+ get db() {
172
+ return this.kdb.db;
173
+ }
174
+ /**
175
+ * The effective config of `plugin` for `orgId`. Following: the running platform config, `ok:
176
+ * false` when it leaves a required overridable field empty (the host loaded it with those
177
+ * fields optional, so that is the only way the full schema can refuse it). Copy: the platform's
178
+ * raw config with the copy applied ({@link mergeCopy}), parsed once with the full schema. An
179
+ * extension not running on this replica -> `ok: false`, `notRunning`, with a root issue.
180
+ */
181
+ async get(orgId, plugin) {
182
+ const inst = this.registry.current(plugin);
183
+ if (!inst) {
184
+ return {
185
+ ok: false,
186
+ notRunning: true,
187
+ issues: [{ path: "", segments: [], message: "the extension is not running" }],
188
+ };
189
+ }
190
+ const schema = inst.manifest.config?.deployment;
191
+ if (!schema)
192
+ return { ok: true, config: inst.config, source: "platform" };
193
+ const levels = fieldLevels(schema);
194
+ // without an overridable field there is no copy to apply, and the loaded config is complete
195
+ if (![...levels.values()].includes("override")) {
196
+ return { ok: true, config: inst.config, source: "platform" };
197
+ }
198
+ const copy = await this.copyOf(orgId, plugin);
199
+ if (!copy) {
200
+ const missing = missingOverridable(schema, inst.config);
201
+ if (missing.length === 0)
202
+ return { ok: true, config: inst.config, source: "platform" };
203
+ return {
204
+ ok: false,
205
+ issues: missing.map((path) => ({
206
+ path,
207
+ segments: [path],
208
+ message: "required: the platform leaves it empty",
209
+ })),
210
+ };
211
+ }
212
+ const values = Object.values(copy.secrets);
213
+ if (values.length > 0)
214
+ this.log.addOrgSecrets(values);
215
+ // the host's raw read (ExtensionHost.rawDeploymentConfig): startup config plus the PG values
216
+ const raw = await this.installs.effectiveDeploymentConfig(plugin, this.kernelConfig.get().extensionConfig[plugin], schema);
217
+ // the full schema, object-level refinements included: zod runs them only once every field
218
+ // parsed, so a refinement never sees an absent required field
219
+ const r = schema.safeParse(mergeCopy(schema, raw, copy));
220
+ return r.success
221
+ ? { ok: true, config: r.data, source: "copy" }
222
+ : { ok: false, issues: toIssues(r.error) };
223
+ }
224
+ /** The org's copy (decrypted), or undefined while it follows the platform. */
225
+ async copyOf(orgId, plugin) {
226
+ // inside a transaction: no Redis, read what the transaction sees
227
+ if (currentStore())
228
+ return (await this.readCopy(orgId, plugin)) ?? undefined;
229
+ const gen = (await this.cacheService.get(generationKey(orgId, plugin))) ?? "0";
230
+ const cached = await this.cachedCopy(orgId, plugin, gen);
231
+ if (!cached.copy)
232
+ return undefined;
233
+ const opened = this.open(orgId, plugin, cached.sealed);
234
+ // sealed with a key no longer in the keyring: read through
235
+ if (opened)
236
+ return opened;
237
+ const fresh = await this.readCopy(orgId, plugin);
238
+ return fresh ?? undefined;
239
+ }
240
+ /**
241
+ * Makes every cached copy of (org, plugin) unreachable: a new generation token, and the entry of
242
+ * the old one deleted. Call it after the write committed (`afterCommit`), never inside it.
243
+ */
244
+ async invalidate(orgId, plugin) {
245
+ const key = generationKey(orgId, plugin);
246
+ const old = (await this.cacheService.get(key)) ?? "0";
247
+ await this.cacheService.set(key, randomUUID(), GENERATION_TTL);
248
+ await this.cacheService.del(copyCacheKey(orgId, plugin, old));
249
+ }
250
+ /** Keyed by the generation token read just before the PG read. */
251
+ async cachedCopy(orgId, plugin, _gen) {
252
+ const copy = await this.readCopy(orgId, plugin);
253
+ return copy ? { copy: true, sealed: this.seal(orgId, plugin, copy) } : { copy: false };
254
+ }
255
+ /**
256
+ * The copy row and its secrets from one snapshot (joins the caller's transaction, so a write
257
+ * sees what it just wrote).
258
+ */
259
+ async readCopy(orgId, plugin) {
260
+ const t = this.db;
261
+ const row = await t
262
+ .selectFrom("extension_org_overrides")
263
+ .select("config")
264
+ .where("plugin", "=", plugin)
265
+ .where("org_id", "=", orgId)
266
+ .executeTakeFirst();
267
+ if (!row)
268
+ return null;
269
+ const prefix = overrideSecretKey(plugin, "");
270
+ const keys = await t
271
+ .selectFrom("secrets")
272
+ .select("key")
273
+ .where("namespace", "=", OVERRIDE_SECRETS_NAMESPACE)
274
+ .where("org_id", "=", orgId)
275
+ .where("key", "like", `${prefix}%`)
276
+ .execute();
277
+ const store = createSecrets(t, this.keyring, OVERRIDE_SECRETS_NAMESPACE);
278
+ const secrets = {};
279
+ for (const { key } of keys) {
280
+ if (!key.startsWith(prefix))
281
+ continue;
282
+ const v = await store.get(orgId, key);
283
+ if (v !== null)
284
+ secrets[key.slice(prefix.length)] = JSON.parse(v);
285
+ }
286
+ return { config: row.config ?? {}, secrets };
287
+ }
288
+ /**
289
+ * The number of orgs (not deleted) where the extension is on and has no valid effective config
290
+ * (spec A §5.4a). Following orgs share the platform's result; each copy is checked on its own.
291
+ * 0 when the extension is not running on this replica.
292
+ */
293
+ async countNeedingConfig(plugin) {
294
+ if (!this.registry.current(plugin))
295
+ return 0;
296
+ const rows = await this.db
297
+ .selectFrom(enabledExtensionsByOrg(this.db).as("en"))
298
+ .innerJoin("orgs", "orgs.id", "en.org_id")
299
+ .leftJoin("extension_org_overrides as ov", (j) => j.onRef("ov.org_id", "=", "en.org_id").onRef("ov.plugin", "=", "en.plugin"))
300
+ .select(["en.org_id as orgId", "ov.org_id as copyOrg"])
301
+ .where("orgs.deleted_at", "is", null)
302
+ .where("en.plugin", "=", plugin)
303
+ .execute();
304
+ let n = 0;
305
+ let following;
306
+ for (const r of rows) {
307
+ if (r.copyOrg === null) {
308
+ following ??= (await this.get(r.orgId, plugin)).ok;
309
+ if (!following)
310
+ n++;
311
+ }
312
+ else if (!(await this.get(r.orgId, plugin)).ok)
313
+ n++;
314
+ }
315
+ return n;
316
+ }
317
+ cacheKey() {
318
+ return this.keyring.deriveKey(CACHE_KEY_INFO);
319
+ }
320
+ seal(orgId, plugin, copy) {
321
+ const keys = this.cacheKey();
322
+ const iv = randomBytes(IV_LEN);
323
+ const cipher = createCipheriv("aes-256-gcm", keys.current, iv);
324
+ cipher.setAAD(Buffer.from(`${orgId}\0${plugin}`, "utf8"));
325
+ const data = Buffer.concat([cipher.update(JSON.stringify(copy), "utf8"), cipher.final()]);
326
+ return `${keys.currentId}:${Buffer.concat([iv, cipher.getAuthTag(), data]).toString("base64")}`;
327
+ }
328
+ open(orgId, plugin, sealed) {
329
+ const at = sealed.indexOf(":");
330
+ const key = at > 0 ? this.cacheKey().byId(sealed.slice(0, at)) : undefined;
331
+ if (!key)
332
+ return undefined;
333
+ try {
334
+ const blob = Buffer.from(sealed.slice(at + 1), "base64");
335
+ const decipher = createDecipheriv("aes-256-gcm", key, blob.subarray(0, IV_LEN));
336
+ decipher.setAAD(Buffer.from(`${orgId}\0${plugin}`, "utf8"));
337
+ decipher.setAuthTag(blob.subarray(IV_LEN, IV_LEN + TAG_LEN));
338
+ const plain = Buffer.concat([
339
+ decipher.update(blob.subarray(IV_LEN + TAG_LEN)),
340
+ decipher.final(),
341
+ ]).toString("utf8");
342
+ return JSON.parse(plain);
343
+ }
344
+ catch {
345
+ return undefined;
346
+ }
347
+ }
348
+ };
349
+ __decorate([
350
+ Cacheable({ key: "effective-config:#{0}:#{1}:#{2}", ttl: COPY_TTL })
351
+ ], EffectiveConfigs.prototype, "cachedCopy", null);
352
+ __decorate([
353
+ Transactional({ isolationLevel: "repeatable read" })
354
+ ], EffectiveConfigs.prototype, "readCopy", null);
355
+ EffectiveConfigs = __decorate([
356
+ Injectable(),
357
+ __param(0, Inject(KernelDb)),
358
+ __param(1, Inject(TransactionHost)),
359
+ __param(2, Inject(CacheService)),
360
+ __param(3, Inject(KEYRING)),
361
+ __param(4, Inject(ExtensionRegistry)),
362
+ __param(5, Inject(ExtensionInstalls)),
363
+ __param(6, Inject(KernelConfigService)),
364
+ __param(7, Inject(KERNEL_LOGGER))
365
+ ], EffectiveConfigs);
366
+ export { EffectiveConfigs };
367
+ /** The cache key of a copy under a generation (the `@Cacheable` key of `cachedCopy`). */
368
+ const copyCacheKey = (orgId, plugin, gen) => `effective-config:${orgId}:${plugin}:${gen}`;
@@ -5,25 +5,25 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
7
  import { Module } from "@nestjs/common";
8
- import { EnterpriseAdminLockModule } from "../identity/enterprise-admin.js";
8
+ import { SuperAdminLockModule } from "../identity/super-admin.js";
9
+ import { ModelsModule } from "../models/models.module.js";
9
10
  import { OrgLockModule } from "../orgs/org-lock.js";
10
11
  import { StorageModule } from "../storage/storage.module.js";
11
12
  import { EmbedTokensModule } from "../ui/embed-token.js";
12
13
  import { ExtensionAdminOps } from "./admin-ops.js";
13
14
  import { ExtensionAdmin } from "./admin-view.js";
14
- import { ExtensionApprovals } from "./approvals.js";
15
- import { ExtensionBlobs } from "./blobs.js";
16
15
  import { BootstrapService } from "./bootstrap.js";
17
16
  import { ExtensionDeploymentConfigService } from "./deployment-config.js";
18
17
  import { ExtensionDisplayNames } from "./display-name.js";
19
18
  import { ExtensionHost } from "./host.js";
20
- import { ExtensionInstalls } from "./installs.js";
21
19
  import { ExtensionLifecycle } from "./lifecycle.js";
22
20
  import { PluginApproveLock, PluginDeploymentConfigLock, PluginInstallLock } from "./locks.js";
23
21
  import { OrgExtensionConfigs } from "./org-config.js";
22
+ import { OrgOverrides } from "./org-overrides.js";
24
23
  import { ExtensionPointDefaults } from "./point-defaults.js";
25
24
  import { ExtensionRegistryModule } from "./registry.js";
26
25
  import { ReplicaStatusStore } from "./sources.js";
26
+ import { ExtensionStateModule } from "./state.module.js";
27
27
  /**
28
28
  * The extensions domain: the extension host (it builds each `ctx` from the injected kernel
29
29
  * services), the package store and install records (the desired state the host converges to, one
@@ -36,19 +36,19 @@ ExtensionsModule = __decorate([
36
36
  Module({
37
37
  imports: [
38
38
  ExtensionRegistryModule,
39
- EnterpriseAdminLockModule,
39
+ SuperAdminLockModule,
40
40
  OrgLockModule,
41
41
  StorageModule,
42
42
  // ctx.ui verifies embed tokens with the one provider the UI routes issue them with
43
43
  EmbedTokensModule,
44
+ ExtensionStateModule,
45
+ // ctx.models: the embeddings broker (models domain, below the host through ExtensionStateModule)
46
+ ModelsModule,
44
47
  ],
45
48
  providers: [
46
49
  PluginInstallLock,
47
50
  PluginApproveLock,
48
51
  PluginDeploymentConfigLock,
49
- ExtensionApprovals,
50
- ExtensionBlobs,
51
- ExtensionInstalls,
52
52
  ReplicaStatusStore,
53
53
  ExtensionHost,
54
54
  ExtensionLifecycle,
@@ -57,16 +57,15 @@ ExtensionsModule = __decorate([
57
57
  ExtensionDisplayNames,
58
58
  ExtensionDeploymentConfigService,
59
59
  OrgExtensionConfigs,
60
+ OrgOverrides,
60
61
  ExtensionPointDefaults,
61
62
  BootstrapService,
62
63
  ],
63
64
  exports: [
64
65
  ExtensionRegistryModule,
66
+ ExtensionStateModule,
65
67
  PluginInstallLock,
66
68
  PluginApproveLock,
67
- ExtensionApprovals,
68
- ExtensionBlobs,
69
- ExtensionInstalls,
70
69
  ReplicaStatusStore,
71
70
  ExtensionHost,
72
71
  ExtensionLifecycle,
@@ -75,6 +74,7 @@ ExtensionsModule = __decorate([
75
74
  ExtensionDisplayNames,
76
75
  ExtensionDeploymentConfigService,
77
76
  OrgExtensionConfigs,
77
+ OrgOverrides,
78
78
  ExtensionPointDefaults,
79
79
  BootstrapService,
80
80
  ],
@@ -1,6 +1,7 @@
1
1
  import { type AvailableHook, type HookHandler, type HookOptions, type HookPayloads, type Logger, type PolicyHook } from "@capybara-hq/plugin-sdk";
2
2
  import type { KernelConfig } from "../config/schema.js";
3
3
  import type { LockService } from "../infra/lock/lock.service.js";
4
+ import { type EffectiveConfig } from "./effective-config.js";
4
5
  import { type InflightTracker } from "./inflight.js";
5
6
  /** Default of `hooks.timeoutMs` (used when a host is built without kernel config, e.g. in tests). */
6
7
  export declare const DEFAULT_HOOK_TIMEOUT_MS = 5000;
@@ -27,8 +28,8 @@ export type HookOutcome = {
27
28
  cause: "deny" | "hook_error" | "timeout";
28
29
  detail?: string;
29
30
  /**
30
- * R10: the hooks could not run at all (organization lookup or payload copy failed); `plugin` is
31
- * only the first policy plugin on the mount, not the cause.
31
+ * R10: the hooks could not run at all (organization lookup, config read or payload copy
32
+ * failed); `plugin` is only the first policy plugin on the mount, not the cause.
32
33
  */
33
34
  preflight?: true;
34
35
  /**
@@ -36,7 +37,21 @@ export type HookOutcome = {
36
37
  * approved, but is not loaded on this replica: the call fails closed without running any hook.
37
38
  */
38
39
  notLoaded?: true;
40
+ /**
41
+ * Layering spec A §6: `plugin` has a policy hook on this mount but its effective config is not
42
+ * valid in the organization, so it behaves as if not loaded: the call fails closed without
43
+ * running any policy hook.
44
+ */
45
+ needsConfig?: true;
39
46
  };
47
+ /**
48
+ * Thrown by a `usage.report` handler wrapper (see {@link HookRegistry.handlers}) instead of calling
49
+ * a handler whose extension's effective config is not valid in the payload's organization.
50
+ */
51
+ export declare class HookNeedsConfigError extends Error {
52
+ readonly plugin: string;
53
+ constructor(plugin: string);
54
+ }
40
55
  /** A hook a plugin instance registered through `ctx.hooks.on` (kept on the instance, like tools). */
41
56
  export interface RegisteredHook {
42
57
  mount: AvailableHook;
@@ -80,7 +95,12 @@ export declare const HOOK_DETAIL_MAX_CHARS = 2048;
80
95
  * If a plugin the organization enabled is expected to run policy hooks on the mount (deployment
81
96
  * state, `expectedPolicy`) but is not loaded on this replica, deny with a generic reason
82
97
  * (`hook_error`, `notLoaded`) without running any policy hook (M-1: fail closed). Observe hooks
83
- * of plugins that are not loaded are simply missing.
98
+ * of plugins that are not loaded are simply missing. Then each enabled plugin with a hook on the
99
+ * mount gets its effective config for the organization (layering spec A §6; one read per plugin
100
+ * and call, failing like the lookup above). A plugin whose config is not valid behaves as one
101
+ * that is not loaded: with a policy hook on the mount the call is denied (`hook_error`,
102
+ * `needsConfig`) without running any policy hook, and its observe hooks are skipped. Every
103
+ * hook is called with `{ config }` as its third argument.
84
104
  * 3. Policy hooks run serially by plugin name (registration order within a plugin), each limited
85
105
  * by `hooks.timeoutMs` (read on every run, hot). `{ deny }`, an error or a timeout stops the chain
86
106
  * and denies (`deny` / `hook_error` / `timeout`). A policy hook cut off by its instance being
@@ -112,6 +132,12 @@ export declare class HookRegistry {
112
132
  */
113
133
  expectedPolicy?(mount: PolicyHook): readonly string[];
114
134
  enabledPlugins(orgId: string): Promise<Set<string>>;
135
+ /**
136
+ * The effective deployment config of a plugin for an organization (`EffectiveConfigs.get`):
137
+ * passed to every hook call, and no hook of the plugin runs for the organization when it is
138
+ * not valid.
139
+ */
140
+ effectiveConfig(orgId: string, plugin: string): Promise<EffectiveConfig>;
115
141
  /** The warn-once markers (`lease`: set unless present, with a TTL). */
116
142
  locks: Pick<LockService, "lease">;
117
143
  config: () => {
@@ -132,7 +158,9 @@ export declare class HookRegistry {
132
158
  private unloadedPolicy;
133
159
  /**
134
160
  * `usage.report` handlers by plugin name (delivered by the usage queue, not by {@link run}); each
135
- * call runs through the instance's `inflight.run`.
161
+ * call runs through the instance's `inflight.run` with the plugin's effective config for the
162
+ * payload's organization, and throws {@link HookNeedsConfigError} without calling the handler
163
+ * when that config is not valid (layering spec A §6).
136
164
  */
137
165
  handlers(mount: "usage.report"): {
138
166
  plugin: string;
@@ -146,6 +174,11 @@ export declare class HookRegistry {
146
174
  * admin.
147
175
  */
148
176
  private notLoadedDenial;
177
+ /**
178
+ * The layering spec A §6 denial: `needy` (sorted) are enabled policy plugins whose effective
179
+ * config is not valid in the organization. Generic model-visible reason, as for M-1.
180
+ */
181
+ private needsConfigDenial;
149
182
  /** Active entries of a mount point, sorted by plugin name (stable: registration order within). */
150
183
  private entries;
151
184
  /** One plugin's policy hooks in registration order; reruns once on a newer generation if revoked. */