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

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 (507) hide show
  1. package/bootstrap.json +61 -5
  2. package/dist/admin/admin.controller.d.ts +39 -13
  3. package/dist/admin/admin.controller.js +33 -17
  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 +51 -22
  19. package/dist/agents/agents.service.js +172 -70
  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/org-templates.d.ts +176 -0
  27. package/dist/agents/org-templates.js +827 -0
  28. package/dist/agents/pending-connector-requests.d.ts +77 -0
  29. package/dist/agents/pending-connector-requests.js +215 -0
  30. package/dist/agents/pending-connectors.controller.d.ts +39 -0
  31. package/dist/agents/pending-connectors.controller.js +91 -0
  32. package/dist/agents/pending-connectors.service.d.ts +62 -0
  33. package/dist/agents/pending-connectors.service.js +282 -0
  34. package/dist/agents/templates.controller.d.ts +86 -5
  35. package/dist/agents/templates.controller.js +171 -7
  36. package/dist/agents/templates.d.ts +127 -23
  37. package/dist/agents/templates.js +475 -52
  38. package/dist/background/background.module.js +8 -1
  39. package/dist/background/finish.d.ts +3 -2
  40. package/dist/background/launch-lock.d.ts +4 -3
  41. package/dist/background/launch-lock.js +4 -3
  42. package/dist/background/poll.job.d.ts +9 -6
  43. package/dist/background/poll.job.js +30 -22
  44. package/dist/background/session.d.ts +13 -2
  45. package/dist/background/session.js +13 -0
  46. package/dist/background/stop.d.ts +12 -6
  47. package/dist/background/stop.js +57 -39
  48. package/dist/background/store.d.ts +18 -6
  49. package/dist/background/store.js +12 -6
  50. package/dist/background/tasks.service.d.ts +15 -5
  51. package/dist/background/tasks.service.js +42 -17
  52. package/dist/background/wake-rules.d.ts +27 -18
  53. package/dist/background/wake-rules.js +52 -22
  54. package/dist/background/wake.d.ts +13 -11
  55. package/dist/background/wake.js +20 -14
  56. package/dist/catalog/admin-catalog.controller.d.ts +129 -30
  57. package/dist/catalog/admin-catalog.controller.js +213 -42
  58. package/dist/catalog/catalog-content.d.ts +58 -32
  59. package/dist/catalog/catalog-content.js +34 -8
  60. package/dist/catalog/catalog-import.module.d.ts +7 -0
  61. package/dist/catalog/catalog-import.module.js +60 -0
  62. package/dist/catalog/catalog-items.d.ts +111 -7
  63. package/dist/catalog/catalog-items.js +279 -13
  64. package/dist/catalog/catalog-scope.service.d.ts +260 -0
  65. package/dist/catalog/catalog-scope.service.js +1116 -0
  66. package/dist/catalog/catalog.module.d.ts +7 -9
  67. package/dist/catalog/catalog.module.js +41 -31
  68. package/dist/catalog/catalog.service.d.ts +101 -29
  69. package/dist/catalog/catalog.service.js +104 -106
  70. package/dist/catalog/cli.d.ts +11 -1
  71. package/dist/catalog/cli.js +26 -1
  72. package/dist/catalog/component-promotion.d.ts +96 -0
  73. package/dist/catalog/component-promotion.js +395 -0
  74. package/dist/catalog/component-scope.controller.d.ts +152 -0
  75. package/dist/catalog/component-scope.controller.js +287 -0
  76. package/dist/catalog/component-scope.service.d.ts +303 -0
  77. package/dist/catalog/component-scope.service.js +936 -0
  78. package/dist/catalog/component-state.d.ts +174 -0
  79. package/dist/catalog/component-state.js +437 -0
  80. package/dist/catalog/job-ids.d.ts +30 -0
  81. package/dist/catalog/job-ids.js +25 -0
  82. package/dist/catalog/marketplace-fetch.d.ts +1 -1
  83. package/dist/catalog/marketplaces.controller.d.ts +22 -5
  84. package/dist/catalog/marketplaces.controller.js +56 -7
  85. package/dist/catalog/marketplaces.service.d.ts +54 -14
  86. package/dist/catalog/marketplaces.service.js +71 -22
  87. package/dist/catalog/org-catalog.controller.d.ts +125 -34
  88. package/dist/catalog/org-catalog.controller.js +181 -65
  89. package/dist/catalog/org-catalog.service.d.ts +65 -33
  90. package/dist/catalog/org-catalog.service.js +324 -157
  91. package/dist/catalog/org-extension-switch.d.ts +41 -0
  92. package/dist/catalog/org-extension-switch.js +115 -0
  93. package/dist/catalog/org-extension.controller.d.ts +119 -0
  94. package/dist/catalog/org-extension.controller.js +266 -0
  95. package/dist/catalog/org-plugin-uploads.controller.d.ts +98 -0
  96. package/dist/catalog/org-plugin-uploads.controller.js +213 -0
  97. package/dist/catalog/org-plugin-uploads.d.ts +63 -0
  98. package/dist/catalog/org-plugin-uploads.js +116 -0
  99. package/dist/catalog/owned-items.d.ts +184 -0
  100. package/dist/catalog/owned-items.js +789 -0
  101. package/dist/catalog/owned-plugin-cleanup.d.ts +56 -0
  102. package/dist/catalog/owned-plugin-cleanup.js +194 -0
  103. package/dist/catalog/ownership.d.ts +172 -0
  104. package/dist/catalog/ownership.js +326 -0
  105. package/dist/catalog/platform-components.d.ts +221 -0
  106. package/dist/catalog/platform-components.js +761 -0
  107. package/dist/catalog/platform-migration.d.ts +115 -0
  108. package/dist/catalog/platform-migration.js +582 -0
  109. package/dist/catalog/plugin-import.d.ts +178 -34
  110. package/dist/catalog/plugin-import.js +622 -82
  111. package/dist/catalog/plugin-install.d.ts +185 -41
  112. package/dist/catalog/plugin-install.js +758 -126
  113. package/dist/catalog/plugin-upgrade.d.ts +260 -225
  114. package/dist/catalog/plugin-upgrade.js +1147 -1136
  115. package/dist/catalog/request-rules.d.ts +65 -0
  116. package/dist/catalog/request-rules.js +217 -0
  117. package/dist/catalog/requests.service.d.ts +193 -118
  118. package/dist/catalog/requests.service.js +526 -343
  119. package/dist/catalog/reserved-names.d.ts +8 -0
  120. package/dist/catalog/reserved-names.js +42 -0
  121. package/dist/catalog/scope-orgs.d.ts +21 -0
  122. package/dist/catalog/scope-orgs.js +67 -0
  123. package/dist/catalog/scope-state.d.ts +35 -0
  124. package/dist/catalog/scope-state.js +87 -0
  125. package/dist/catalog/scope-sync-workers.d.ts +7 -0
  126. package/dist/catalog/scope-sync-workers.js +29 -0
  127. package/dist/catalog/scope-sync.d.ts +176 -0
  128. package/dist/catalog/scope-sync.js +576 -0
  129. package/dist/catalog/scope.d.ts +42 -0
  130. package/dist/catalog/scope.js +42 -0
  131. package/dist/catalog/unshare.d.ts +22 -0
  132. package/dist/catalog/unshare.js +118 -0
  133. package/dist/channels/actions.js +1 -0
  134. package/dist/channels/cards.js +20 -2
  135. package/dist/channels/channels.module.js +2 -0
  136. package/dist/channels/inbound.d.ts +9 -1
  137. package/dist/channels/inbound.js +67 -5
  138. package/dist/channels/phrases.d.ts +35 -0
  139. package/dist/channels/phrases.js +29 -0
  140. package/dist/config/docs.js +3 -1
  141. package/dist/config/schema.d.ts +6 -2
  142. package/dist/config/schema.js +46 -22
  143. package/dist/conversations/access.d.ts +6 -4
  144. package/dist/conversations/access.js +27 -5
  145. package/dist/conversations/agent-tree.d.ts +46 -0
  146. package/dist/conversations/agent-tree.js +92 -0
  147. package/dist/conversations/conversations.controller.d.ts +43 -18
  148. package/dist/conversations/conversations.controller.js +79 -38
  149. package/dist/conversations/conversations.module.d.ts +1 -1
  150. package/dist/conversations/conversations.module.js +7 -7
  151. package/dist/conversations/conversations.service.d.ts +69 -12
  152. package/dist/conversations/conversations.service.js +106 -27
  153. package/dist/conversations/environment-status.d.ts +24 -0
  154. package/dist/conversations/environment-status.js +71 -0
  155. package/dist/conversations/event-log.d.ts +20 -5
  156. package/dist/conversations/event-log.js +60 -0
  157. package/dist/conversations/events.d.ts +84 -2
  158. package/dist/conversations/events.js +91 -17
  159. package/dist/conversations/queue.service.d.ts +1 -1
  160. package/dist/conversations/queue.service.js +5 -0
  161. package/dist/conversations/titles.d.ts +5 -3
  162. package/dist/conversations/titles.js +21 -8
  163. package/dist/conversations/tree.d.ts +17 -0
  164. package/dist/conversations/tree.js +42 -0
  165. package/dist/ctx/create-ctx.d.ts +5 -0
  166. package/dist/ctx/create-ctx.js +15 -5
  167. package/dist/db/kernel-schema.d.ts +362 -18
  168. package/dist/environments/access.d.ts +41 -0
  169. package/dist/environments/access.js +77 -0
  170. package/dist/environments/conversation-environments.d.ts +61 -0
  171. package/dist/environments/conversation-environments.js +170 -0
  172. package/dist/environments/dto.d.ts +25 -0
  173. package/dist/environments/dto.js +12 -0
  174. package/dist/environments/environments.controller.d.ts +33 -0
  175. package/dist/environments/environments.controller.js +110 -0
  176. package/dist/environments/environments.module.d.ts +8 -0
  177. package/dist/environments/environments.module.js +27 -0
  178. package/dist/environments/environments.service.d.ts +153 -0
  179. package/dist/environments/environments.service.js +541 -0
  180. package/dist/environments/legacy-cleanup.job.d.ts +34 -0
  181. package/dist/environments/legacy-cleanup.job.js +141 -0
  182. package/dist/errors.d.ts +82 -2
  183. package/dist/errors.js +82 -2
  184. package/dist/evals/reconstruct.d.ts +18 -9
  185. package/dist/evals/reconstruct.js +26 -7
  186. package/dist/evals/run-replay.d.ts +4 -2
  187. package/dist/evals/run-replay.js +16 -4
  188. package/dist/evals/step-replay.d.ts +2 -5
  189. package/dist/evals/step-replay.js +1 -1
  190. package/dist/evals/trajectory.service.d.ts +8 -3
  191. package/dist/evals/trajectory.service.js +26 -14
  192. package/dist/evals/worker.d.ts +5 -5
  193. package/dist/evals/worker.js +9 -3
  194. package/dist/extensions/admin-ops.d.ts +36 -10
  195. package/dist/extensions/admin-ops.js +65 -42
  196. package/dist/extensions/admin-view.d.ts +37 -10
  197. package/dist/extensions/admin-view.js +103 -20
  198. package/dist/extensions/bootstrap.d.ts +17 -4
  199. package/dist/extensions/bootstrap.js +70 -9
  200. package/dist/extensions/cli.d.ts +12 -0
  201. package/dist/extensions/cli.js +11 -2
  202. package/dist/extensions/deployment-config.d.ts +28 -5
  203. package/dist/extensions/deployment-config.js +48 -7
  204. package/dist/extensions/effective-config.d.ts +127 -0
  205. package/dist/extensions/effective-config.js +368 -0
  206. package/dist/extensions/extensions.module.js +8 -2
  207. package/dist/extensions/hooks.d.ts +37 -4
  208. package/dist/extensions/hooks.js +82 -16
  209. package/dist/extensions/host.d.ts +19 -1
  210. package/dist/extensions/host.js +30 -7
  211. package/dist/extensions/installs.d.ts +20 -8
  212. package/dist/extensions/installs.js +37 -15
  213. package/dist/extensions/org-config.d.ts +75 -6
  214. package/dist/extensions/org-config.js +184 -32
  215. package/dist/extensions/org-levels.d.ts +37 -0
  216. package/dist/extensions/org-levels.js +71 -0
  217. package/dist/extensions/org-overrides.d.ts +151 -0
  218. package/dist/extensions/org-overrides.js +524 -0
  219. package/dist/extensions/permission-view.d.ts +16 -4
  220. package/dist/extensions/permission-view.js +4 -4
  221. package/dist/extensions/plugin-items.d.ts +21 -0
  222. package/dist/extensions/plugin-items.js +42 -0
  223. package/dist/extensions/point-defaults.d.ts +12 -5
  224. package/dist/extensions/point-defaults.js +37 -9
  225. package/dist/extensions/resolve.d.ts +5 -1
  226. package/dist/extensions/resolve.js +15 -2
  227. package/dist/files/previewers.d.ts +8 -1
  228. package/dist/files/previewers.js +35 -6
  229. package/dist/http/api.module.js +23 -3
  230. package/dist/http/app.d.ts +11 -2
  231. package/dist/http/app.js +31 -5
  232. package/dist/identity/accounts.d.ts +29 -29
  233. package/dist/identity/accounts.js +47 -47
  234. package/dist/identity/audit.d.ts +2 -1
  235. package/dist/identity/auth.guard.d.ts +13 -5
  236. package/dist/identity/auth.guard.js +26 -9
  237. package/dist/identity/identity.module.d.ts +1 -1
  238. package/dist/identity/identity.module.js +4 -4
  239. package/dist/identity/me.controller.js +1 -1
  240. package/dist/identity/principal.d.ts +3 -3
  241. package/dist/identity/principal.js +3 -3
  242. package/dist/identity/settings.d.ts +22 -11
  243. package/dist/identity/settings.js +53 -18
  244. package/dist/identity/{enterprise-admin.d.ts → super-admin.d.ts} +5 -5
  245. package/dist/identity/{enterprise-admin.js → super-admin.js} +24 -24
  246. package/dist/inbox/inbox.module.d.ts +4 -1
  247. package/dist/inbox/inbox.module.js +7 -3
  248. package/dist/inbox/inbox.service.d.ts +62 -3
  249. package/dist/inbox/inbox.service.js +74 -4
  250. package/dist/inbox/org-notices.d.ts +63 -0
  251. package/dist/inbox/org-notices.js +91 -0
  252. package/dist/inbox/platform-inbox.controller.d.ts +23 -0
  253. package/dist/inbox/platform-inbox.controller.js +58 -0
  254. package/dist/inbox/platform-inbox.service.d.ts +151 -0
  255. package/dist/inbox/platform-inbox.service.js +263 -0
  256. package/dist/inbox/platform-notices.d.ts +19 -0
  257. package/dist/inbox/platform-notices.js +9 -0
  258. package/dist/index.d.ts +1 -1
  259. package/dist/index.js +1 -1
  260. package/dist/infra/cli/kernel-cli.module.js +9 -1
  261. package/dist/infra/config/kernel-config.service.js +21 -1
  262. package/dist/infra/database/xact-lock.d.ts +1 -1
  263. package/dist/infra/database/xact-lock.js +1 -1
  264. package/dist/infra/events/kernel-events.d.ts +11 -2
  265. package/dist/infra/queue/add-job-once.d.ts +14 -0
  266. package/dist/infra/queue/add-job-once.js +16 -0
  267. package/dist/kernel.module.js +6 -0
  268. package/dist/lifecycle/kernel-lifecycle.d.ts +1 -1
  269. package/dist/lifecycle/kernel-lifecycle.js +4 -4
  270. package/dist/models/prices.d.ts +5 -5
  271. package/dist/models/prices.js +4 -4
  272. package/dist/models/purposes.controller.d.ts +6 -4
  273. package/dist/models/purposes.controller.js +13 -7
  274. package/dist/models/purposes.d.ts +20 -9
  275. package/dist/models/purposes.js +17 -8
  276. package/dist/orgs/directory-sync.d.ts +14 -5
  277. package/dist/orgs/directory-sync.js +41 -17
  278. package/dist/orgs/offboarding.d.ts +9 -7
  279. package/dist/orgs/offboarding.js +28 -17
  280. package/dist/orgs/org-lock.d.ts +5 -0
  281. package/dist/orgs/org-lock.js +13 -0
  282. package/dist/orgs/org.guard.d.ts +10 -0
  283. package/dist/orgs/org.guard.js +43 -32
  284. package/dist/orgs/orgs.module.js +3 -0
  285. package/dist/orgs/orgs.service.d.ts +20 -7
  286. package/dist/orgs/orgs.service.js +32 -12
  287. package/dist/orgs/roles.d.ts +1 -1
  288. package/dist/orgs/roles.js +5 -1
  289. package/dist/orgs/settings.controller.d.ts +1 -1
  290. package/dist/orgs/settings.service.d.ts +15 -3
  291. package/dist/orgs/settings.service.js +6 -2
  292. package/dist/overrides.d.ts +3 -0
  293. package/dist/overrides.js +2 -0
  294. package/dist/platform/actor.d.ts +48 -0
  295. package/dist/platform/actor.js +100 -0
  296. package/dist/platform/agent-docs.d.ts +18 -0
  297. package/dist/platform/agent-docs.js +59 -0
  298. package/dist/platform/availability.d.ts +14 -0
  299. package/dist/platform/availability.js +43 -0
  300. package/dist/platform/errors.d.ts +11 -0
  301. package/dist/platform/errors.js +26 -0
  302. package/dist/platform/exclusions.d.ts +12 -0
  303. package/dist/platform/exclusions.js +1387 -0
  304. package/dist/platform/method.d.ts +6 -0
  305. package/dist/platform/method.js +15 -0
  306. package/dist/platform/operation.d.ts +92 -0
  307. package/dist/platform/operation.js +35 -0
  308. package/dist/platform/ops/agent-templates.ops.d.ts +14 -0
  309. package/dist/platform/ops/agent-templates.ops.js +92 -0
  310. package/dist/platform/ops/agents.ops.d.ts +19 -0
  311. package/dist/platform/ops/agents.ops.js +294 -0
  312. package/dist/platform/ops/connectors.ops.d.ts +15 -0
  313. package/dist/platform/ops/connectors.ops.js +126 -0
  314. package/dist/platform/ops/errors.d.ts +11 -0
  315. package/dist/platform/ops/errors.js +22 -0
  316. package/dist/platform/ops/extensions.ops.d.ts +19 -0
  317. package/dist/platform/ops/extensions.ops.js +116 -0
  318. package/dist/platform/ops/marketplaces.ops.d.ts +16 -0
  319. package/dist/platform/ops/marketplaces.ops.js +157 -0
  320. package/dist/platform/ops/paging.d.ts +14 -0
  321. package/dist/platform/ops/paging.js +20 -0
  322. package/dist/platform/ops/platform.ops.d.ts +23 -0
  323. package/dist/platform/ops/platform.ops.js +158 -0
  324. package/dist/platform/ops/plugins.ops.d.ts +33 -0
  325. package/dist/platform/ops/plugins.ops.js +377 -0
  326. package/dist/platform/ops/requests.ops.d.ts +14 -0
  327. package/dist/platform/ops/requests.ops.js +153 -0
  328. package/dist/platform/ops/role.d.ts +4 -0
  329. package/dist/platform/ops/role.js +10 -0
  330. package/dist/platform/ops/skills.ops.d.ts +13 -0
  331. package/dist/platform/ops/skills.ops.js +98 -0
  332. package/dist/platform/ops/summary.d.ts +10 -0
  333. package/dist/platform/ops/summary.js +18 -0
  334. package/dist/platform/platform-ops.module.d.ts +7 -0
  335. package/dist/platform/platform-ops.module.js +55 -0
  336. package/dist/platform/platform.module.d.ts +8 -0
  337. package/dist/platform/platform.module.js +25 -0
  338. package/dist/platform/redact-orgs.d.ts +7 -0
  339. package/dist/platform/redact-orgs.js +52 -0
  340. package/dist/platform/registry.d.ts +30 -0
  341. package/dist/platform/registry.js +111 -0
  342. package/dist/roles/worker-role.d.ts +6 -4
  343. package/dist/roles/worker-role.js +14 -7
  344. package/dist/roles/worker.module.d.ts +1 -1
  345. package/dist/roles/worker.module.js +9 -1
  346. package/dist/runtime/context/build.d.ts +6 -4
  347. package/dist/runtime/context/build.js +26 -7
  348. package/dist/runtime/context/claude-tools.d.ts +2 -1
  349. package/dist/runtime/context/claude-tools.js +5 -4
  350. package/dist/runtime/context/compaction.js +9 -0
  351. package/dist/runtime/context/reminders.d.ts +2 -0
  352. package/dist/runtime/context/reminders.js +2 -0
  353. package/dist/runtime/context/skills.js +9 -2
  354. package/dist/runtime/context/tool-changes.d.ts +27 -0
  355. package/dist/runtime/context/tool-changes.js +60 -0
  356. package/dist/runtime/hook-calls.js +2 -0
  357. package/dist/runtime/langgraph-loop.d.ts +3 -1
  358. package/dist/runtime/langgraph-loop.js +35 -17
  359. package/dist/runtime/loop.d.ts +32 -4
  360. package/dist/runtime/maintenance.d.ts +7 -4
  361. package/dist/runtime/maintenance.js +23 -8
  362. package/dist/runtime/model-call.d.ts +30 -8
  363. package/dist/runtime/model-call.js +69 -19
  364. package/dist/runtime/run-control.d.ts +11 -1
  365. package/dist/runtime/run-control.js +12 -0
  366. package/dist/runtime/run-drafts.d.ts +85 -0
  367. package/dist/runtime/run-drafts.js +230 -0
  368. package/dist/runtime/run-jobs.d.ts +3 -5
  369. package/dist/runtime/run-jobs.js +3 -7
  370. package/dist/runtime/run-queue.d.ts +37 -3
  371. package/dist/runtime/run-queue.js +188 -11
  372. package/dist/runtime/run-worker.d.ts +11 -5
  373. package/dist/runtime/run-worker.js +54 -31
  374. package/dist/runtime/runtime.module.js +3 -0
  375. package/dist/runtime/step-log.d.ts +9 -4
  376. package/dist/runtime/step-log.js +8 -5
  377. package/dist/runtime/stream.controller.d.ts +23 -1
  378. package/dist/runtime/stream.controller.js +60 -3
  379. package/dist/runtime/stream.d.ts +4 -1
  380. package/dist/runtime/stream.js +27 -3
  381. package/dist/runtime/subagents/child.d.ts +55 -7
  382. package/dist/runtime/subagents/child.js +105 -7
  383. package/dist/runtime/subagents/definition.d.ts +12 -3
  384. package/dist/runtime/subagents/definition.js +43 -29
  385. package/dist/runtime/subagents/deliveries.d.ts +71 -0
  386. package/dist/runtime/subagents/deliveries.js +228 -0
  387. package/dist/runtime/subagents/dispatch.d.ts +115 -26
  388. package/dist/runtime/subagents/dispatch.js +212 -141
  389. package/dist/runtime/subagents/limits.d.ts +24 -5
  390. package/dist/runtime/subagents/limits.js +40 -6
  391. package/dist/runtime/subagents/messages.d.ts +95 -0
  392. package/dist/runtime/subagents/messages.js +328 -0
  393. package/dist/runtime/subagents/preamble.d.ts +4 -4
  394. package/dist/runtime/subagents/preamble.js +9 -7
  395. package/dist/runtime/subagents/progress.d.ts +8 -6
  396. package/dist/runtime/subagents/progress.js +11 -6
  397. package/dist/runtime/subagents/render.d.ts +30 -0
  398. package/dist/runtime/subagents/render.js +53 -0
  399. package/dist/runtime/subagents/roster.d.ts +24 -7
  400. package/dist/runtime/subagents/roster.js +47 -11
  401. package/dist/runtime/subagents/skill-fork.d.ts +3 -2
  402. package/dist/runtime/subagents/skill-fork.js +8 -4
  403. package/dist/runtime/subagents/status.d.ts +14 -0
  404. package/dist/runtime/subagents/status.js +23 -0
  405. package/dist/runtime/subagents/subagents.service.d.ts +7 -4
  406. package/dist/runtime/subagents/subagents.service.js +11 -6
  407. package/dist/runtime/usage-report.js +17 -12
  408. package/dist/runtime/waits.d.ts +140 -37
  409. package/dist/runtime/waits.js +394 -106
  410. package/dist/sandbox/jobs.d.ts +40 -13
  411. package/dist/sandbox/jobs.js +57 -20
  412. package/dist/sandbox/leases.d.ts +37 -54
  413. package/dist/sandbox/leases.js +71 -115
  414. package/dist/sandbox/providers.d.ts +2 -2
  415. package/dist/sandbox/providers.js +1 -1
  416. package/dist/sandbox/sandbox.module.d.ts +3 -2
  417. package/dist/sandbox/sandbox.module.js +4 -3
  418. package/dist/sandbox/sandbox.service.d.ts +229 -134
  419. package/dist/sandbox/sandbox.service.js +630 -409
  420. package/dist/skills/catalog.d.ts +3 -2
  421. package/dist/skills/catalog.js +21 -43
  422. package/dist/skills/changes.controller.d.ts +7 -0
  423. package/dist/skills/changes.controller.js +19 -1
  424. package/dist/skills/invoke.js +8 -3
  425. package/dist/skills/package.d.ts +20 -1
  426. package/dist/skills/package.js +28 -1
  427. package/dist/skills/skills.controller.d.ts +39 -4
  428. package/dist/skills/skills.controller.js +88 -10
  429. package/dist/skills/skills.module.js +10 -1
  430. package/dist/skills/skills.service.d.ts +106 -26
  431. package/dist/skills/skills.service.js +421 -75
  432. package/dist/skills/usable.d.ts +81 -0
  433. package/dist/skills/usable.js +379 -0
  434. package/dist/tools/approvals.service.d.ts +20 -2
  435. package/dist/tools/approvals.service.js +23 -4
  436. package/dist/tools/builtin-names.d.ts +21 -5
  437. package/dist/tools/builtin-names.js +30 -5
  438. package/dist/tools/builtins/agent.d.ts +23 -21
  439. package/dist/tools/builtins/agent.js +62 -55
  440. package/dist/tools/builtins/builtin-tools.d.ts +6 -2
  441. package/dist/tools/builtins/builtin-tools.js +37 -12
  442. package/dist/tools/builtins/handback.d.ts +28 -0
  443. package/dist/tools/builtins/handback.js +53 -0
  444. package/dist/tools/builtins/platform.d.ts +34 -0
  445. package/dist/tools/builtins/platform.js +362 -0
  446. package/dist/tools/builtins/sandbox/bash.js +13 -3
  447. package/dist/tools/builtins/sandbox/common.d.ts +43 -24
  448. package/dist/tools/builtins/sandbox/common.js +80 -45
  449. package/dist/tools/builtins/sandbox/edit.js +2 -2
  450. package/dist/tools/builtins/sandbox/glob.js +2 -2
  451. package/dist/tools/builtins/sandbox/grep.js +2 -4
  452. package/dist/tools/builtins/sandbox/index.d.ts +1 -1
  453. package/dist/tools/builtins/sandbox/index.js +1 -1
  454. package/dist/tools/builtins/sandbox/read.js +1 -1
  455. package/dist/tools/builtins/sandbox/task-output.d.ts +14 -3
  456. package/dist/tools/builtins/sandbox/task-output.js +30 -5
  457. package/dist/tools/builtins/sandbox/task-stop.js +2 -1
  458. package/dist/tools/builtins/sandbox/write.js +2 -2
  459. package/dist/tools/builtins/send-message.d.ts +56 -0
  460. package/dist/tools/builtins/send-message.js +100 -0
  461. package/dist/tools/builtins/skill-load.d.ts +22 -14
  462. package/dist/tools/builtins/skill-load.js +86 -57
  463. package/dist/tools/builtins/skill-write.js +1 -1
  464. package/dist/tools/builtins/web/extract.js +5 -1
  465. package/dist/tools/builtins/web/fetch.js +1 -0
  466. package/dist/tools/builtins/web/search.js +1 -0
  467. package/dist/tools/connectors.controller.d.ts +10 -0
  468. package/dist/tools/connectors.controller.js +12 -0
  469. package/dist/tools/connectors.service.d.ts +46 -5
  470. package/dist/tools/connectors.service.js +94 -15
  471. package/dist/tools/extension-tools.controller.d.ts +14 -0
  472. package/dist/tools/extension-tools.controller.js +37 -0
  473. package/dist/tools/info.d.ts +42 -1
  474. package/dist/tools/info.js +64 -1
  475. package/dist/tools/org-tool-switches.d.ts +74 -0
  476. package/dist/tools/org-tool-switches.js +184 -0
  477. package/dist/tools/pipeline.d.ts +46 -40
  478. package/dist/tools/pipeline.js +187 -364
  479. package/dist/tools/policy.d.ts +1 -1
  480. package/dist/tools/policy.js +36 -16
  481. package/dist/tools/registry.d.ts +98 -5
  482. package/dist/tools/registry.js +87 -9
  483. package/dist/tools/tools.module.js +12 -2
  484. package/dist/ui/views.d.ts +2 -1
  485. package/dist/ui/views.js +17 -3
  486. package/package.json +3 -3
  487. package/src/migrations/0074_subagent_tree.sql +50 -0
  488. package/src/migrations/0075_plugin_scope.sql +61 -0
  489. package/src/migrations/0076_skills_created_by_nullable.sql +6 -0
  490. package/src/migrations/0077_scope_requests.sql +52 -0
  491. package/src/migrations/0078_scope_grant_switches.sql +18 -0
  492. package/src/migrations/0079_scope_live_install_switches.sql +19 -0
  493. package/src/migrations/0080_rename_enterprise_admin.sql +18 -0
  494. package/src/migrations/0081_platform_components.sql +129 -0
  495. package/src/migrations/0082_platform_migration.sql +33 -0
  496. package/src/migrations/0083_plugin_scope_sync_failures.sql +15 -0
  497. package/src/migrations/0084_org_owned_items.sql +85 -0
  498. package/src/migrations/0085_agent_templates_phase4.sql +45 -0
  499. package/src/migrations/0086_org_layering.sql +30 -0
  500. package/src/migrations/0087_approval_summary.sql +6 -0
  501. package/src/migrations/0088_environments.sql +80 -0
  502. package/dist/catalog/upgrade-targets.d.ts +0 -56
  503. package/dist/catalog/upgrade-targets.js +0 -90
  504. package/dist/conversations/sandbox-status.d.ts +0 -24
  505. package/dist/conversations/sandbox-status.js +0 -52
  506. package/dist/extensions/org-config.controller.d.ts +0 -32
  507. package/dist/extensions/org-config.controller.js +0 -70
@@ -1,11 +1,13 @@
1
- import { EnterpriseAdminLock } from "../identity/enterprise-admin.js";
1
+ import { SuperAdminLock } from "../identity/super-admin.js";
2
2
  import { KernelConfigService } from "../infra/config/kernel-config.service.js";
3
3
  import { KernelDb } from "../infra/database/kernel-db.js";
4
4
  import { TransactionHost } from "../infra/database/transaction-host.js";
5
5
  import type { KernelLogger } from "../log.js";
6
6
  import { ExtensionApprovals } from "./approvals.js";
7
7
  import { ExtensionBlobs } from "./blobs.js";
8
+ import { ExtensionDeploymentConfigService } from "./deployment-config.js";
8
9
  import { ExtensionDisplayNames } from "./display-name.js";
10
+ import { EffectiveConfigs } from "./effective-config.js";
9
11
  import { ExtensionHost } from "./host.js";
10
12
  import { ExtensionInstalls } from "./installs.js";
11
13
  import { ExtensionLifecycle, PLUGINS_CHANGED_TOPIC } from "./lifecycle.js";
@@ -23,13 +25,13 @@ export interface PublishBus {
23
25
  publish(topic: string, payload: unknown): Promise<void>;
24
26
  }
25
27
  /**
26
- * 部署级插件后台(企业管理员):列表 / 详情与网页批准权限(D8)。无状态,多副本共用;
28
+ * 部署级插件后台(超级管理员):列表 / 详情与网页批准权限(D8)。无状态,多副本共用;
27
29
  * 状态由 PG(安装记录、快照、各副本状态行)与本副本宿主(配置声明插件的清单)推出。
28
30
  */
29
31
  export declare class ExtensionAdmin {
30
32
  private readonly kdb;
31
33
  readonly txHost: TransactionHost;
32
- /** The enterprise admin lock (identity/enterprise-admin.ts): joins the transaction. */
34
+ /** The super admin lock (identity/super-admin.ts): joins the transaction. */
33
35
  private readonly adminLock;
34
36
  private readonly approveLock;
35
37
  private readonly blobs;
@@ -43,17 +45,29 @@ export declare class ExtensionAdmin {
43
45
  private readonly bus;
44
46
  private readonly log;
45
47
  private readonly displayNames;
48
+ /** Which required overridable fields the platform left empty (spec A §5.4a). */
49
+ private readonly deploymentConfig;
50
+ /** How many orgs still need their own config for such an extension. */
51
+ private readonly effectiveConfigs;
46
52
  private readonly packageSets;
47
53
  constructor(kdb: KernelDb, txHost: TransactionHost,
48
- /** The enterprise admin lock (identity/enterprise-admin.ts): joins the transaction. */
49
- adminLock: EnterpriseAdminLock, approveLock: PluginApproveLock, blobs: ExtensionBlobs, installs: ExtensionInstalls, approvals: ExtensionApprovals,
54
+ /** The super admin lock (identity/super-admin.ts): joins the transaction. */
55
+ adminLock: SuperAdminLock, approveLock: PluginApproveLock, blobs: ExtensionBlobs, installs: ExtensionInstalls, approvals: ExtensionApprovals,
50
56
  /** The config-declared extensions (this replica's host; the CLI fills it from its inspection). */
51
57
  host: ExtensionHost,
52
58
  /** This replica's reconcile after an approval (a no-op where the lifecycle never started: the CLI). */
53
- lifecycle: ExtensionLifecycle, config: KernelConfigService, bus: PublishBus, log: KernelLogger, displayNames: ExtensionDisplayNames);
59
+ lifecycle: ExtensionLifecycle, config: KernelConfigService, bus: PublishBus, log: KernelLogger, displayNames: ExtensionDisplayNames,
60
+ /** Which required overridable fields the platform left empty (spec A §5.4a). */
61
+ deploymentConfig: ExtensionDeploymentConfigService,
62
+ /** How many orgs still need their own config for such an extension. */
63
+ effectiveConfigs: EffectiveConfigs);
54
64
  private get db();
55
- /** 全部插件(配置声明 → 安装记录,各自按名字)。 */
56
- list(): Promise<AdminExtensionView[]>;
65
+ /**
66
+ * Every extension (config-declared, then install records, each by name). With `names`, only
67
+ * those: no other package is read, so a caller that needs a few items (the catalog's pending
68
+ * check) neither pays for nor logs about the packages of unrelated extensions.
69
+ */
70
+ list(names?: ReadonlySet<string>): Promise<AdminExtensionView[]>;
57
71
  /**
58
72
  * A single extension; unknown -> `extension.not_found`; package unreadable ->
59
73
  * `extension.package_unavailable`. With `allowUnreadable` an unreadable package returns the same
@@ -66,7 +80,12 @@ export declare class ExtensionAdmin {
66
80
  allowUnreadable?: boolean;
67
81
  }): Promise<AdminExtensionView>;
68
82
  /**
69
- * Web approval: re-checks the enterprise admin under the lock, compares the reviewed package
83
+ * The review digest of a stored package (the `reviewHash` its extension would show once
84
+ * installed); null when the package cannot be read.
85
+ */
86
+ packageReviewHash(sha256: string): Promise<string | null>;
87
+ /**
88
+ * Web approval: re-checks the super admin under the lock, compares the reviewed package
70
89
  * (`sha256`) and permission digest (`reviewHash`), writes the snapshot (source web) and the
71
90
  * `extension.permissions_approved` audit; after the commit publishes `kernel.plugins.changed` (a
72
91
  * failure only warns) and waits for one reconcile on this replica (other replicas converge through
@@ -76,10 +95,12 @@ export declare class ExtensionAdmin {
76
95
  * recomputed now -> `extension.approval_stale`; a config-declared extension's `sha256` must be
77
96
  * null (otherwise `validation_failed`);
78
97
  * - the snapshot already covers the current permission set (nothing to approve, F-N) ->
79
- * `extension.not_pending`.
98
+ * `extension.not_pending`, except with `confirmBootstrap` when the snapshot is the bootstrap
99
+ * step's (the catalog's confirm re-writes it with source web).
80
100
  */
81
101
  approve(actor: string, name: string, body: ApproveBody, opts?: {
82
102
  actorTokenId?: string;
103
+ confirmBootstrap?: boolean;
83
104
  }): Promise<AdminExtensionView>;
84
105
  private writeApproval;
85
106
  /** 配置声明 → 安装记录(与配置声明重名的安装记录不生效,不单列)。`only` 给出时只取这一个。 */
@@ -88,5 +109,11 @@ export declare class ExtensionAdmin {
88
109
  * 包的权限集合(静态清单 + 迁移 SQL,与上传时的审阅相同)、迁移审阅警告与是否有部署级配置字段;按 sha256 缓存。
89
110
  */
90
111
  private packageInfo;
112
+ /**
113
+ * For each configurable, readable extension whose platform config leaves required overridable
114
+ * fields empty (spec A §5.4a): the number of orgs still needing their own config. Extensions
115
+ * without overridable fields cost no read.
116
+ */
117
+ private orgsNeedingConfig;
91
118
  private views;
92
119
  }
@@ -11,7 +11,7 @@ import { SDK_VERSION } from "@capybara-hq/plugin-sdk";
11
11
  import { Inject, Injectable } from "@nestjs/common";
12
12
  import { sql } from "kysely";
13
13
  import { ApiError } from "../errors.js";
14
- import { EnterpriseAdminLock } from "../identity/enterprise-admin.js";
14
+ import { SuperAdminLock } from "../identity/super-admin.js";
15
15
  import { KernelConfigService } from "../infra/config/kernel-config.service.js";
16
16
  import { KernelDb } from "../infra/database/kernel-db.js";
17
17
  import { TransactionHost } from "../infra/database/transaction-host.js";
@@ -19,7 +19,10 @@ import { Transactional } from "../infra/database/transactional.decorator.js";
19
19
  import { KERNEL_BUS, KERNEL_LOGGER } from "../infra/tokens.js";
20
20
  import { ExtensionApprovals, snapshotCovers, writeSnapshot, } from "./approvals.js";
21
21
  import { ExtensionBlobs } from "./blobs.js";
22
+ import { ExtensionDeploymentConfigService } from "./deployment-config.js";
22
23
  import { ExtensionDisplayNames } from "./display-name.js";
24
+ import { EffectiveConfigs } from "./effective-config.js";
25
+ import { enabledExtensionsByOrg } from "./enabled.js";
23
26
  import { ExtensionHost } from "./host.js";
24
27
  import { ExtensionInstalls } from "./installs.js";
25
28
  import { ExtensionLifecycle, PLUGINS_CHANGED_TOPIC, STALE_RECONCILE_PERIODS } from "./lifecycle.js";
@@ -27,6 +30,7 @@ import { PluginApproveLock } from "./locks.js";
27
30
  import { ExtensionPackageError, permissionSetOfPackage, readExtensionPackage } from "./package.js";
28
31
  import { buildPermissionSet, diffPermissions } from "./permission-set.js";
29
32
  import { deriveExtensionStatus, migrationWarnings, permissionGroups, permissionKeyItems, reviewHash, } from "./permission-view.js";
33
+ import { pluginItemsOf } from "./plugin-items.js";
30
34
  export { PLUGINS_CHANGED_TOPIC };
31
35
  /** 内容寻址的包 → 权限集合(包不可变,缓存安全;只作缓存,不是跨副本状态)。 */
32
36
  const PACKAGE_SET_CACHE_MAX = 256;
@@ -48,7 +52,7 @@ function assertReadable(s) {
48
52
  }
49
53
  }
50
54
  /**
51
- * 部署级插件后台(企业管理员):列表 / 详情与网页批准权限(D8)。无状态,多副本共用;
55
+ * 部署级插件后台(超级管理员):列表 / 详情与网页批准权限(D8)。无状态,多副本共用;
52
56
  * 状态由 PG(安装记录、快照、各副本状态行)与本副本宿主(配置声明插件的清单)推出。
53
57
  */
54
58
  let ExtensionAdmin = class ExtensionAdmin {
@@ -65,14 +69,20 @@ let ExtensionAdmin = class ExtensionAdmin {
65
69
  bus;
66
70
  log;
67
71
  displayNames;
72
+ deploymentConfig;
73
+ effectiveConfigs;
68
74
  packageSets = new Map();
69
75
  constructor(kdb, txHost,
70
- /** The enterprise admin lock (identity/enterprise-admin.ts): joins the transaction. */
76
+ /** The super admin lock (identity/super-admin.ts): joins the transaction. */
71
77
  adminLock, approveLock, blobs, installs, approvals,
72
78
  /** The config-declared extensions (this replica's host; the CLI fills it from its inspection). */
73
79
  host,
74
80
  /** This replica's reconcile after an approval (a no-op where the lifecycle never started: the CLI). */
75
- lifecycle, config, bus, log, displayNames) {
81
+ lifecycle, config, bus, log, displayNames,
82
+ /** Which required overridable fields the platform left empty (spec A §5.4a). */
83
+ deploymentConfig,
84
+ /** How many orgs still need their own config for such an extension. */
85
+ effectiveConfigs) {
76
86
  this.kdb = kdb;
77
87
  this.txHost = txHost;
78
88
  this.adminLock = adminLock;
@@ -86,13 +96,19 @@ let ExtensionAdmin = class ExtensionAdmin {
86
96
  this.bus = bus;
87
97
  this.log = log;
88
98
  this.displayNames = displayNames;
99
+ this.deploymentConfig = deploymentConfig;
100
+ this.effectiveConfigs = effectiveConfigs;
89
101
  }
90
102
  get db() {
91
103
  return this.kdb.db;
92
104
  }
93
- /** 全部插件(配置声明 → 安装记录,各自按名字)。 */
94
- async list() {
95
- const subjects = await this.subjects();
105
+ /**
106
+ * Every extension (config-declared, then install records, each by name). With `names`, only
107
+ * those: no other package is read, so a caller that needs a few items (the catalog's pending
108
+ * check) neither pays for nor logs about the packages of unrelated extensions.
109
+ */
110
+ async list(names) {
111
+ const subjects = await this.subjects(undefined, names);
96
112
  return this.views(subjects);
97
113
  }
98
114
  /**
@@ -112,7 +128,20 @@ let ExtensionAdmin = class ExtensionAdmin {
112
128
  return (await this.views([s]))[0];
113
129
  }
114
130
  /**
115
- * Web approval: re-checks the enterprise admin under the lock, compares the reviewed package
131
+ * The review digest of a stored package (the `reviewHash` its extension would show once
132
+ * installed); null when the package cannot be read.
133
+ */
134
+ async packageReviewHash(sha256) {
135
+ try {
136
+ const { set, warnings } = await this.packageInfo(sha256);
137
+ return reviewHash(set, warnings);
138
+ }
139
+ catch {
140
+ return null;
141
+ }
142
+ }
143
+ /**
144
+ * Web approval: re-checks the super admin under the lock, compares the reviewed package
116
145
  * (`sha256`) and permission digest (`reviewHash`), writes the snapshot (source web) and the
117
146
  * `extension.permissions_approved` audit; after the commit publishes `kernel.plugins.changed` (a
118
147
  * failure only warns) and waits for one reconcile on this replica (other replicas converge through
@@ -122,7 +151,8 @@ let ExtensionAdmin = class ExtensionAdmin {
122
151
  * recomputed now -> `extension.approval_stale`; a config-declared extension's `sha256` must be
123
152
  * null (otherwise `validation_failed`);
124
153
  * - the snapshot already covers the current permission set (nothing to approve, F-N) ->
125
- * `extension.not_pending`.
154
+ * `extension.not_pending`, except with `confirmBootstrap` when the snapshot is the bootstrap
155
+ * step's (the catalog's confirm re-writes it with source web).
126
156
  */
127
157
  async approve(actor, name, body, opts = {}) {
128
158
  const s = (await this.subjects(name))[0];
@@ -137,7 +167,7 @@ let ExtensionAdmin = class ExtensionAdmin {
137
167
  throw stale();
138
168
  if (body.reviewHash !== reviewHash(s.set, s.warnings))
139
169
  throw stale();
140
- await this.writeApproval(actor, name, s, opts.actorTokenId, stale);
170
+ await this.writeApproval(actor, name, s, opts.actorTokenId, stale, opts.confirmBootstrap === true);
141
171
  try {
142
172
  await this.bus.publish(PLUGINS_CHANGED_TOPIC, { plugin: name });
143
173
  }
@@ -153,7 +183,7 @@ let ExtensionAdmin = class ExtensionAdmin {
153
183
  }
154
184
  return this.get(name);
155
185
  }
156
- async writeApproval(actor, name, s, actorTokenId, stale) {
186
+ async writeApproval(actor, name, s, actorTokenId, stale, confirmBootstrap) {
157
187
  const db = this.db;
158
188
  await this.adminLock.lockAndAuthorize(actor);
159
189
  await this.approveLock.lock(name);
@@ -170,7 +200,7 @@ let ExtensionAdmin = class ExtensionAdmin {
170
200
  }
171
201
  const snapRow = await db
172
202
  .selectFrom("extension_permission_snapshots")
173
- .select(["version", "permissions"])
203
+ .select(["version", "permissions", "source"])
174
204
  .where("plugin", "=", name)
175
205
  .forUpdate()
176
206
  .executeTakeFirst();
@@ -178,7 +208,9 @@ let ExtensionAdmin = class ExtensionAdmin {
178
208
  version: snapRow.version,
179
209
  permissions: snapRow.permissions,
180
210
  };
181
- if (snapshotCovers(snap, s.set)) {
211
+ // `confirmBootstrap` (the catalog's confirm): a snapshot the bootstrap step wrote was never
212
+ // confirmed by a person, so a covered one is still taken over
213
+ if (snapshotCovers(snap, s.set) && !(confirmBootstrap && snapRow?.source === "bootstrap")) {
182
214
  throw new ApiError("extension.not_pending", `Extension ${name} ${s.version} has no new permissions awaiting approval`);
183
215
  }
184
216
  const { added, removed } = diffPermissions(snap?.permissions, s.set);
@@ -190,10 +222,9 @@ let ExtensionAdmin = class ExtensionAdmin {
190
222
  });
191
223
  }
192
224
  /** 配置声明 → 安装记录(与配置声明重名的安装记录不生效,不单列)。`only` 给出时只取这一个。 */
193
- async subjects(only) {
194
- const declared = this.host
195
- .declaredPlugins()
196
- .filter((p) => only === undefined || p.name === only);
225
+ async subjects(only, names) {
226
+ const wanted = (name) => (only === undefined || name === only) && (names === undefined || names.has(name));
227
+ const declared = this.host.declaredPlugins().filter((p) => wanted(p.name));
197
228
  const taken = new Set(this.host.declaredPlugins().map((p) => p.name));
198
229
  const out = [...declared]
199
230
  .sort((a, b) => a.name.localeCompare(b.name))
@@ -209,7 +240,7 @@ let ExtensionAdmin = class ExtensionAdmin {
209
240
  }));
210
241
  if (only !== undefined && out.length > 0)
211
242
  return out;
212
- const rows = (await this.installs.list()).filter((r) => !taken.has(r.name) && (only === undefined || r.name === only));
243
+ const rows = (await this.installs.list()).filter((r) => !taken.has(r.name) && wanted(r.name));
213
244
  for (const r of rows) {
214
245
  let info;
215
246
  try {
@@ -276,6 +307,32 @@ let ExtensionAdmin = class ExtensionAdmin {
276
307
  }
277
308
  return { ...cached, configurable: cached.set.config.deployment.length > 0 };
278
309
  }
310
+ /**
311
+ * For each configurable, readable extension whose platform config leaves required overridable
312
+ * fields empty (spec A §5.4a): the number of orgs still needing their own config. Extensions
313
+ * without overridable fields cost no read.
314
+ */
315
+ async orgsNeedingConfig(subjects) {
316
+ const out = new Map();
317
+ for (const s of subjects) {
318
+ if (!s.configurable || s.broken !== undefined)
319
+ continue;
320
+ try {
321
+ const missing = await this.deploymentConfig.orgMustConfigure(s.name);
322
+ if (missing.length > 0) {
323
+ out.set(s.name, await this.effectiveConfigs.countNeedingConfig(s.name));
324
+ }
325
+ }
326
+ catch (err) {
327
+ // the list never fails for one extension's config; the field is then left out
328
+ this.log.warn("cannot tell whether orgs must configure the extension", {
329
+ plugin: s.name,
330
+ err,
331
+ });
332
+ }
333
+ }
334
+ return out;
335
+ }
279
336
  async views(subjects) {
280
337
  if (subjects.length === 0)
281
338
  return [];
@@ -290,7 +347,28 @@ let ExtensionAdmin = class ExtensionAdmin {
290
347
  .where("heartbeat_at", ">", sql `now() - make_interval(secs => ${staleSeconds})`)
291
348
  .orderBy("replica_id")
292
349
  .execute();
350
+ const items = await pluginItemsOf(this.db, names);
351
+ const needing = await this.orgsNeedingConfig(subjects);
352
+ const counts = new Map((await this.db
353
+ .selectFrom(enabledExtensionsByOrg(this.db).as("en"))
354
+ .innerJoin("orgs", "orgs.id", "en.org_id")
355
+ .select(["en.plugin", (eb) => eb.fn.countAll().as("n")])
356
+ .where("orgs.deleted_at", "is", null)
357
+ .where("en.plugin", "in", names)
358
+ .groupBy("en.plugin")
359
+ .execute()).map((r) => [r.plugin, Number(r.n)]));
293
360
  return subjects.map((s) => {
361
+ const of = items.get(s.name);
362
+ const builtin = of?.some((i) => i.builtin) === true || s.install?.required === true;
363
+ const scopeInfo = {
364
+ scope: of?.[0]
365
+ ? builtin || of.some((i) => i.scope === "all")
366
+ ? "all"
367
+ : of[0].scope
368
+ : null,
369
+ enabledOrgs: counts.get(s.name) ?? 0,
370
+ builtin,
371
+ };
294
372
  const replicas = rows.filter((r) => r.plugin === s.name);
295
373
  const snap = snapshots.get(s.name);
296
374
  const { added, removed } = diffPermissions(snap?.permissions, s.set);
@@ -325,6 +403,7 @@ let ExtensionAdmin = class ExtensionAdmin {
325
403
  configValid,
326
404
  removable: install?.required !== true,
327
405
  required: install?.required === true,
406
+ ...scopeInfo,
328
407
  installSource: install?.source ?? null,
329
408
  error: s.broken,
330
409
  };
@@ -360,8 +439,10 @@ let ExtensionAdmin = class ExtensionAdmin {
360
439
  snapshot: snapshotView(snap),
361
440
  configurable: s.configurable,
362
441
  configValid,
442
+ ...(needing.has(s.name) && { orgsNeedingConfig: needing.get(s.name) }),
363
443
  removable: s.source === "install" && install?.required !== true,
364
444
  required: install?.required === true,
445
+ ...scopeInfo,
365
446
  installSource: install?.source ?? null,
366
447
  };
367
448
  });
@@ -374,7 +455,7 @@ ExtensionAdmin = __decorate([
374
455
  Injectable(),
375
456
  __param(0, Inject(KernelDb)),
376
457
  __param(1, Inject(TransactionHost)),
377
- __param(2, Inject(EnterpriseAdminLock)),
458
+ __param(2, Inject(SuperAdminLock)),
378
459
  __param(3, Inject(PluginApproveLock)),
379
460
  __param(4, Inject(ExtensionBlobs)),
380
461
  __param(5, Inject(ExtensionInstalls)),
@@ -384,7 +465,9 @@ ExtensionAdmin = __decorate([
384
465
  __param(9, Inject(KernelConfigService)),
385
466
  __param(10, Inject(KERNEL_BUS)),
386
467
  __param(11, Inject(KERNEL_LOGGER)),
387
- __param(12, Inject(ExtensionDisplayNames))
468
+ __param(12, Inject(ExtensionDisplayNames)),
469
+ __param(13, Inject(ExtensionDeploymentConfigService)),
470
+ __param(14, Inject(EffectiveConfigs))
388
471
  ], ExtensionAdmin);
389
472
  export { ExtensionAdmin };
390
473
  const replicaView = (r) => ({
@@ -35,7 +35,7 @@ import { ExtensionRegistry } from "./registry.js";
35
35
  * manifest's sha256 (written with the audit `bootstrap.completed` only when every entry
36
36
  * succeeded; otherwise the next start runs it again, which is idempotent).
37
37
  * - Only entries new to the manifest are installed (Ruling 5): an optional entry that the last
38
- * completed run already handled and that is not installed now (an enterprise admin uninstalled
38
+ * completed run already handled and that is not installed now (a super admin uninstalled
39
39
  * it) stays uninstalled -> `kept`. A required entry is always installed.
40
40
  * - Per entry, by the installed state of its extension:
41
41
  * - not installed (and new, or required): imported into the catalog (source `bootstrap`, ref
@@ -44,8 +44,8 @@ import { ExtensionRegistry } from "./registry.js";
44
44
  * and enabled -> `installed`;
45
45
  * - installed from `bootstrap` at a lower version: upgraded the same way (core's release vouched
46
46
  * for the version, so new permissions are pre-approved and audited), keeping the desired state
47
- * an enterprise admin chose (a disabled optional plugin stays disabled) -> `upgraded`;
48
- * - installed at a higher version, or from another source (an enterprise admin upgraded it), or
47
+ * a super admin chose (a disabled optional plugin stays disabled) -> `upgraded`;
48
+ * - installed at a higher version, or from another source (a super admin upgraded it), or
49
49
  * the name is config-declared (`declared`: config wins, no install record is created):
50
50
  * untouched, never downgraded -> `kept`;
51
51
  * - a declarative plugin (no extension): imported into the catalog only -> `imported` (`kept`
@@ -175,6 +175,12 @@ export declare class BootstrapService {
175
175
  /** The plugin import a declarative entry (or an entry's catalog version) goes through. */
176
176
  imports: BootstrapImports;
177
177
  }): Promise<BootstrapResult>;
178
+ /**
179
+ * A pin whose plugin name an org holds (a live org-owned catalog item): the bootstrap takes no
180
+ * name over (ruling P3-28), so the entry fails; this warning tells the super admin why and
181
+ * which org holds it (final review M4).
182
+ */
183
+ private warnIfHeld;
178
184
  /** The `bootstrap_runs` row and the `bootstrap.completed` audit, in one transaction. */
179
185
  private recordDone;
180
186
  /**
@@ -186,10 +192,17 @@ export declare class BootstrapService {
186
192
  /** The entry names the last completed run handled (undefined before any run completed). */
187
193
  private lastRunNames;
188
194
  private entry;
195
+ /**
196
+ * The catalog item of a bootstrap entry follows `required`: a required entry is builtin, offered
197
+ * to every org (scope `all`) and not disabled (migration 0075 could leave a required plugin
198
+ * disabled); an entry that stops being required is no longer builtin and keeps scope `all` (the
199
+ * admin may change it from then on).
200
+ */
201
+ private markBuiltin;
189
202
  /** A declarative plugin: catalog only. Returns false when that version is already imported. */
190
203
  private importOnly;
191
204
  /**
192
- * Imports, approves, installs and enables (one review, confirmed with `deployExtension`). When
205
+ * Imports, approves, installs and enables (one review; its confirm deploys the extension). When
193
206
  * the catalog already has this version (an earlier run stopped after importing, or the same
194
207
  * package came from a marketplace), the extension is deployed from the package store instead.
195
208
  */
@@ -15,6 +15,7 @@ import { parseBootstrapManifest, SDK_VERSION, } from "@capybara-hq/plugin-sdk";
15
15
  import { Inject, Injectable, Optional } from "@nestjs/common";
16
16
  import { sql } from "kysely";
17
17
  import semver from "semver";
18
+ import { otherNameOwner } from "../catalog/ownership.js";
18
19
  import { catalogPackageError } from "../catalog/plugin-import.js";
19
20
  import { PluginPackageError, readPluginPackage } from "../catalog/plugin-package.js";
20
21
  import { ApiError } from "../errors.js";
@@ -57,7 +58,7 @@ import { ExtensionRegistry } from "./registry.js";
57
58
  * manifest's sha256 (written with the audit `bootstrap.completed` only when every entry
58
59
  * succeeded; otherwise the next start runs it again, which is idempotent).
59
60
  * - Only entries new to the manifest are installed (Ruling 5): an optional entry that the last
60
- * completed run already handled and that is not installed now (an enterprise admin uninstalled
61
+ * completed run already handled and that is not installed now (a super admin uninstalled
61
62
  * it) stays uninstalled -> `kept`. A required entry is always installed.
62
63
  * - Per entry, by the installed state of its extension:
63
64
  * - not installed (and new, or required): imported into the catalog (source `bootstrap`, ref
@@ -66,8 +67,8 @@ import { ExtensionRegistry } from "./registry.js";
66
67
  * and enabled -> `installed`;
67
68
  * - installed from `bootstrap` at a lower version: upgraded the same way (core's release vouched
68
69
  * for the version, so new permissions are pre-approved and audited), keeping the desired state
69
- * an enterprise admin chose (a disabled optional plugin stays disabled) -> `upgraded`;
70
- * - installed at a higher version, or from another source (an enterprise admin upgraded it), or
70
+ * a super admin chose (a disabled optional plugin stays disabled) -> `upgraded`;
71
+ * - installed at a higher version, or from another source (a super admin upgraded it), or
71
72
  * the name is config-declared (`declared`: config wins, no install record is created):
72
73
  * untouched, never downgraded -> `kept`;
73
74
  * - a declarative plugin (no extension): imported into the catalog only -> `imported` (`kept`
@@ -306,6 +307,7 @@ let BootstrapService = class BootstrapService {
306
307
  const failures = [];
307
308
  for (const e of o.manifest.plugins) {
308
309
  signal.throwIfAborted();
310
+ await this.warnIfHeld(e);
309
311
  try {
310
312
  const r = await this.entry(e, files.get(e.name), handled, o.imports);
311
313
  results.push(carried(r, o.carry));
@@ -334,6 +336,23 @@ let BootstrapService = class BootstrapService {
334
336
  return { manifestSha256, results };
335
337
  });
336
338
  }
339
+ /**
340
+ * A pin whose plugin name an org holds (a live org-owned catalog item): the bootstrap takes no
341
+ * name over (ruling P3-28), so the entry fails; this warning tells the super admin why and
342
+ * which org holds it (final review M4).
343
+ */
344
+ async warnIfHeld(e) {
345
+ const holder = await otherNameOwner(this.db, e.name, null);
346
+ if (holder?.kind !== "org")
347
+ return;
348
+ this.log.warn("bootstrap: the plugin name is held by an organization; the entry cannot take it over until the organization renames or deletes its plugin", {
349
+ plugin: e.name,
350
+ version: e.version,
351
+ required: e.required,
352
+ ownerOrgId: holder.orgId,
353
+ ownerOrg: holder.name,
354
+ });
355
+ }
337
356
  /** The `bootstrap_runs` row and the `bootstrap.completed` audit, in one transaction. */
338
357
  async recordDone(manifestSha256, results) {
339
358
  await this.db
@@ -400,9 +419,11 @@ let BootstrapService = class BootstrapService {
400
419
  // Not new to the manifest: an optional entry left out on purpose stays out (Ruling 5)
401
420
  const isNew = handled === undefined || !handled.has(e.name);
402
421
  if (!pkg.manifest.extension) {
422
+ await this.markBuiltin(e.name, e.required);
403
423
  if (!isNew)
404
424
  return { name: e.name, action: "kept", version: e.version };
405
425
  const imported = await this.importOnly(e, bytes, ref, imports);
426
+ await this.markBuiltin(e.name, e.required);
406
427
  return { name: e.name, action: imported ? "imported" : "kept", version: e.version };
407
428
  }
408
429
  if (this.registry.declared().has(e.name)) {
@@ -451,8 +472,41 @@ let BootstrapService = class BootstrapService {
451
472
  if (e.required && row?.desired_state === "disabled") {
452
473
  await this.ops.enable(e.name, null);
453
474
  }
475
+ await this.markBuiltin(e.name, e.required);
454
476
  return result;
455
477
  }
478
+ /**
479
+ * The catalog item of a bootstrap entry follows `required`: a required entry is builtin, offered
480
+ * to every org (scope `all`) and not disabled (migration 0075 could leave a required plugin
481
+ * disabled); an entry that stops being required is no longer builtin and keeps scope `all` (the
482
+ * admin may change it from then on).
483
+ */
484
+ async markBuiltin(name, required) {
485
+ const touch = { updated_at: sql `now()` };
486
+ if (required) {
487
+ await this.db
488
+ .updateTable("catalog_items")
489
+ .set({
490
+ builtin: true,
491
+ scope: "all",
492
+ disabled: false,
493
+ scope_version: sql `scope_version + 1`,
494
+ ...touch,
495
+ })
496
+ .where("name", "=", name)
497
+ .where("deleted_at", "is", null)
498
+ .where((eb) => eb.or([eb("builtin", "=", false), eb("scope", "<>", "all"), eb("disabled", "=", true)]))
499
+ .execute();
500
+ return;
501
+ }
502
+ await this.db
503
+ .updateTable("catalog_items")
504
+ .set({ builtin: false, ...touch })
505
+ .where("name", "=", name)
506
+ .where("deleted_at", "is", null)
507
+ .where("builtin", "=", true)
508
+ .execute();
509
+ }
456
510
  /** A declarative plugin: catalog only. Returns false when that version is already imported. */
457
511
  async importOnly(e, bytes, ref, imports) {
458
512
  try {
@@ -461,10 +515,7 @@ let BootstrapService = class BootstrapService {
461
515
  ref,
462
516
  integrity: e.integrity,
463
517
  });
464
- await imports.confirm(null, stagingId, {
465
- reviewHash: review.reviewHash,
466
- deployExtension: false,
467
- });
518
+ await imports.confirm(null, stagingId, { reviewHash: review.reviewHash });
468
519
  return true;
469
520
  }
470
521
  catch (err) {
@@ -474,7 +525,7 @@ let BootstrapService = class BootstrapService {
474
525
  }
475
526
  }
476
527
  /**
477
- * Imports, approves, installs and enables (one review, confirmed with `deployExtension`). When
528
+ * Imports, approves, installs and enables (one review; its confirm deploys the extension). When
478
529
  * the catalog already has this version (an earlier run stopped after importing, or the same
479
530
  * package came from a marketplace), the extension is deployed from the package store instead.
480
531
  */
@@ -496,7 +547,6 @@ let BootstrapService = class BootstrapService {
496
547
  }
497
548
  const r = await imports.confirm(null, staged.stagingId, {
498
549
  reviewHash: staged.review.reviewHash,
499
- deployExtension: true,
500
550
  enable,
501
551
  });
502
552
  if (r.deploy?.result === "failed") {
@@ -552,6 +602,17 @@ let BootstrapService = class BootstrapService {
552
602
  if (names.length > 0)
553
603
  q = q.where("name", "not in", names);
554
604
  const rows = await q.returning(["name", "version"]).execute();
605
+ for (const r of rows)
606
+ await this.markBuiltin(r.name, false);
607
+ // A declarative plugin has no install record: clear builtin by catalog name
608
+ let items = this.db
609
+ .updateTable("catalog_items")
610
+ .set({ builtin: false, updated_at: sql `now()` })
611
+ .where("builtin", "=", true)
612
+ .where("deleted_at", "is", null);
613
+ if (names.length > 0)
614
+ items = items.where("name", "not in", names);
615
+ await items.execute();
555
616
  return rows.map((r) => ({ name: r.name, action: "required_cleared", version: r.version }));
556
617
  }
557
618
  };
@@ -54,6 +54,18 @@ export interface ExtensionCli {
54
54
  publishChanged(plugin: string): Promise<boolean>;
55
55
  close(): Promise<void>;
56
56
  }
57
+ /**
58
+ * The effective deployment config (the startup config `fileValue` completed by the `stored` PG
59
+ * fields) parsed as the host's load gate does: overridable fields may stay empty (spec A §5.4a),
60
+ * hidden and read-only ones must be complete.
61
+ */
62
+ export declare function parseDeploymentConfig(schema: z.ZodTypeAny, stored: Record<string, unknown>, fileValue: unknown): {
63
+ ok: true;
64
+ value: unknown;
65
+ } | {
66
+ ok: false;
67
+ issues: ConfigIssue[];
68
+ };
57
69
  /**
58
70
  * The CLI's extension management context (C18, F-Q): a Nest application context with
59
71
  * the extensions module over the database and a lazy Redis connection used only for publishing
@@ -13,7 +13,17 @@ import { ExtensionsModule } from "./extensions.module.js";
13
13
  import { ExtensionHost } from "./host.js";
14
14
  import { ExtensionInstalls } from "./installs.js";
15
15
  import { PLUGINS_CHANGED_TOPIC } from "./lifecycle-topics.js";
16
+ import { parseLoadGate } from "./org-levels.js";
16
17
  import { ExtensionPackageError, extensionPackageApiError, permissionSetOfPackage, readExtensionPackage, } from "./package.js";
18
+ /**
19
+ * The effective deployment config (the startup config `fileValue` completed by the `stored` PG
20
+ * fields) parsed as the host's load gate does: overridable fields may stay empty (spec A §5.4a),
21
+ * hidden and read-only ones must be complete.
22
+ */
23
+ export function parseDeploymentConfig(schema, stored, fileValue) {
24
+ const r = parseLoadGate(schema, mergeDeploymentConfig(stored, fileValue, schemaFields(schema).map((f) => f.path)));
25
+ return r.success ? { ok: true, value: r.data } : { ok: false, issues: toIssues(r.error) };
26
+ }
17
27
  /**
18
28
  * The CLI's extension management context (C18, F-Q): a Nest application context with
19
29
  * the extensions module over the database and a lazy Redis connection used only for publishing
@@ -44,8 +54,7 @@ export async function openExtensionCli(config, log, opts = {}) {
44
54
  const stored = await readStoredDeploymentConfig(db.db, keyring, name, {
45
55
  secretPaths: secretPathsOf(schemaFields(schema)),
46
56
  });
47
- const r = schema.safeParse(mergeDeploymentConfig(stored, config.extensionConfig[name], schemaFields(schema).map((f) => f.path)));
48
- return r.success ? { ok: true, value: r.data } : { ok: false, issues: toIssues(r.error) };
57
+ return parseDeploymentConfig(schema, stored, config.extensionConfig[name]);
49
58
  };
50
59
  const configIssues = new Map();
51
60
  const deploymentConfigs = new Map();